ZGlmZiAtLWdpdCBhL05PVElDRSBiL05PVElDRQppbmRleCBkODU3YmEzLi4xNTJiZTIwIDEwMDY0NAotLS0gYS9OT1RJQ0UKKysrIGIvTk9USUNFCkBAIC03Miw2ICs3MiwxNiBAQAogT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQ7IG5vdCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5CiBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAKKyAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgID09ICBOT1RJQ0UgZmlsZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBzZWN0aW9uIDQgZCBvZiAgICAgICAgICAgICAgICAgICAgPT0KKyAgID09ICB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0KKyAgID09ICBpbiB0aGlzIGNhc2UgZm9yIEFkZGl0aW9uYWwgQ29kZWNzIGNvZGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0KKyAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworQWRkaXRpb25hbCBDb2RlY3MKK1RoZXNlIGZpbGVzIGFyZSBDb3B5cmlnaHQgMjAwMy0yMDEwIFZpc3VhbE9uLCBidXQgcmVsZWFzZWQgdW5kZXIKK3RoZSBBcGFjaGUyIExpY2Vuc2UuCisKICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICA9PSAgTk9USUNFIGZpbGUgY29ycmVzcG9uZGluZyB0byB0aGUgc2VjdGlvbiA0IGQgb2YgICAgICAgICAgICAgICAgICAgID09CiAgID09ICB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0KZGlmZiAtLWdpdCBhL2FwaS9jdXJyZW50LnhtbCBiL2FwaS9jdXJyZW50LnhtbAppbmRleCAzYmNhYzkzLi5iYWEwMTA1IDEwMDY0NAotLS0gYS9hcGkvY3VycmVudC54bWwKKysrIGIvYXBpL2N1cnJlbnQueG1sCkBAIC0xMTgzMjQsNiArMTE4MzI0LDY0IEBACiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgorPG1ldGhvZCBuYW1lPSJkaXNhYmxlRm9yZWdyb3VuZERpc3BhdGNoIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYWN0aXZpdHkiIHR5cGU9ImFuZHJvaWQuYXBwLkFjdGl2aXR5Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImRpc2FibGVGb3JlZ3JvdW5kTmRlZlB1c2giCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhY3Rpdml0eSIgdHlwZT0iYW5kcm9pZC5hcHAuQWN0aXZpdHkiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZW5hYmxlRm9yZWdyb3VuZERpc3BhdGNoIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYWN0aXZpdHkiIHR5cGU9ImFuZHJvaWQuYXBwLkFjdGl2aXR5Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJpbnRlbnQiIHR5cGU9ImFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImZpbHRlcnMiIHR5cGU9ImFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXIuLi4iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZW5hYmxlRm9yZWdyb3VuZE5kZWZQdXNoIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYWN0aXZpdHkiIHR5cGU9ImFuZHJvaWQuYXBwLkFjdGl2aXR5Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJtc2ciIHR5cGU9ImFuZHJvaWQubmZjLk5kZWZNZXNzYWdlIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldERlZmF1bHRBZGFwdGVyIgogIHJldHVybj0iYW5kcm9pZC5uZmMuTmZjQWRhcHRlciIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xMTgzNTksNiArMTE4NDE3LDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Cis8ZmllbGQgbmFtZT0iQUNUSU9OX05ERUZfRElTQ09WRVJFRCIKKyB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSImcXVvdDthbmRyb2lkLm5mYy5hY3Rpb24uTkRFRl9ESVNDT1ZFUkVEJnF1b3Q7IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9IkFDVElPTl9UQUdfRElTQ09WRVJFRCIKICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC0xMTgzNzAsNiArMTE4NDM5LDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJBQ1RJT05fVEVDSE5PTE9HWV9ESVNDT1ZFUkVEIgorIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IiZxdW90O2FuZHJvaWQubmZjLmFjdGlvbi5URUNIX0RJU0NPVkVSRUQmcXVvdDsiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0iRVhUUkFfSUQiCiAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMTE4MzkyLDYgKzExODQ3MiwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iRVhUUkFfVEFHIgorIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IiZxdW90O2FuZHJvaWQubmZjLmV4dHJhLlRBRyZxdW90OyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDwvY2xhc3M+CiA8Y2xhc3MgbmFtZT0iTmZjTWFuYWdlciIKICBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgpAQCAtMTE4NDEzLDYgKzExODUwNCwxMzIzIEBACiA+CiA8L21ldGhvZD4KIDwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iVGFnIgorIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxpbXBsZW1lbnRzIG5hbWU9ImFuZHJvaWQub3MuUGFyY2VsYWJsZSI+Cis8L2ltcGxlbWVudHM+Cis8bWV0aG9kIG5hbWU9ImNyZWF0ZU1vY2tUYWciCisgcmV0dXJuPSJhbmRyb2lkLm5mYy5UYWciCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iaWQiIHR5cGU9ImJ5dGVbXSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idGVjaExpc3QiIHR5cGU9ImludFtdIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ0ZWNoTGlzdEV4dHJhcyIgdHlwZT0iYW5kcm9pZC5vcy5CdW5kbGVbXSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJkZXNjcmliZUNvbnRlbnRzIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldElkIgorIHJldHVybj0iYnl0ZVtdIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFRlY2hub2xvZ3lMaXN0IgorIHJldHVybj0iaW50W10iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0id3JpdGVUb1BhcmNlbCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImRlc3QiIHR5cGU9ImFuZHJvaWQub3MuUGFyY2VsIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJmbGFncyIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8ZmllbGQgbmFtZT0iQ1JFQVRPUiIKKyB0eXBlPSJhbmRyb2lkLm9zLlBhcmNlbGFibGUuQ3JlYXRvciIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iVGFnTG9zdEV4Y2VwdGlvbiIKKyBleHRlbmRzPSJqYXZhLmlvLklPRXhjZXB0aW9uIgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8Y29uc3RydWN0b3IgbmFtZT0iVGFnTG9zdEV4Y2VwdGlvbiIKKyB0eXBlPSJhbmRyb2lkLm5mYy5UYWdMb3N0RXhjZXB0aW9uIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iVGFnTG9zdEV4Y2VwdGlvbiIKKyB0eXBlPSJhbmRyb2lkLm5mYy5UYWdMb3N0RXhjZXB0aW9uIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibWVzc2FnZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8L2NsYXNzPgorPC9wYWNrYWdlPgorPHBhY2thZ2UgbmFtZT0iYW5kcm9pZC5uZmMudGVjaCIKKz4KKzxjbGFzcyBuYW1lPSJCYXNpY1RhZ1RlY2hub2xvZ3kiCisgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSIiCis+Cis8aW1wbGVtZW50cyBuYW1lPSJhbmRyb2lkLm5mYy50ZWNoLlRhZ1RlY2hub2xvZ3kiPgorPC9pbXBsZW1lbnRzPgorPG1ldGhvZCBuYW1lPSJjbG9zZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iY29ubmVjdCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8ZXhjZXB0aW9uIG5hbWU9IklPRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmlvLklPRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFRhZyIKKyByZXR1cm49ImFuZHJvaWQubmZjLlRhZyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRUZWNobm9sb2d5SWQiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iaXNDb25uZWN0ZWQiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InJlY29ubmVjdCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8ZXhjZXB0aW9uIG5hbWU9IklPRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmlvLklPRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8L2NsYXNzPgorPGNsYXNzIG5hbWU9Iklzb0RlcCIKKyBleHRlbmRzPSJhbmRyb2lkLm5mYy50ZWNoLkJhc2ljVGFnVGVjaG5vbG9neSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8bWV0aG9kIG5hbWU9ImdldCIKKyByZXR1cm49ImFuZHJvaWQubmZjLnRlY2guSXNvRGVwIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InRhZyIgdHlwZT0iYW5kcm9pZC5uZmMuVGFnIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldEhpTGF5ZXJSZXNwb25zZSIKKyByZXR1cm49ImJ5dGVbXSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRIaXN0b3JpY2FsQnl0ZXMiCisgcmV0dXJuPSJieXRlW10iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0VGltZW91dCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InRpbWVvdXQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJ0cmFuc2NlaXZlIgorIHJldHVybj0iYnl0ZVtdIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJkYXRhIiB0eXBlPSJieXRlW10iPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IklPRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmlvLklPRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8L2NsYXNzPgorPGNsYXNzIG5hbWU9Ik1pZmFyZUNsYXNzaWMiCisgZXh0ZW5kcz0iYW5kcm9pZC5uZmMudGVjaC5CYXNpY1RhZ1RlY2hub2xvZ3kiCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPG1ldGhvZCBuYW1lPSJhdXRoZW50aWNhdGVCbG9jayIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImJsb2NrIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImtleSIgdHlwZT0iYnl0ZVtdIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJrZXlBIiB0eXBlPSJib29sZWFuIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJJT0V4Y2VwdGlvbiIgdHlwZT0iamF2YS5pby5JT0V4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJhdXRoZW50aWNhdGVTZWN0b3IiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJzZWN0b3IiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ia2V5IiB0eXBlPSJieXRlW10iPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImtleUEiIHR5cGU9ImJvb2xlYW4iPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IklPRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmlvLklPRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImRlY3JlbWVudCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImJsb2NrIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IklPRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmlvLklPRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldCIKKyByZXR1cm49ImFuZHJvaWQubmZjLnRlY2guTWlmYXJlQ2xhc3NpYyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ0YWciIHR5cGU9ImFuZHJvaWQubmZjLlRhZyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRCbG9ja0NvdW50IgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJzZWN0b3IiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRTZWN0b3JDb3VudCIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRTZWN0b3JTaXplIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJzZWN0b3IiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRTaXplIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFRvdGFsQmxvY2tDb3VudCIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRUeXBlIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImluY3JlbWVudCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImJsb2NrIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IklPRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmlvLklPRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImlzRW11bGF0ZWQiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InJlYWRCbG9jayIKKyByZXR1cm49ImJ5dGVbXSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ic2VjdG9yIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImJsb2NrIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IklPRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmlvLklPRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InJlYWRCbG9jayIKKyByZXR1cm49ImJ5dGVbXSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYmxvY2siIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iSU9FeGNlcHRpb24iIHR5cGU9ImphdmEuaW8uSU9FeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icmVzdG9yZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImJsb2NrIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IklPRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmlvLklPRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InRyYW5zY2VpdmUiCisgcmV0dXJuPSJieXRlW10iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImRhdGEiIHR5cGU9ImJ5dGVbXSI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iSU9FeGNlcHRpb24iIHR5cGU9ImphdmEuaW8uSU9FeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0idHJhbnNmZXIiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJibG9jayIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJJT0V4Y2VwdGlvbiIgdHlwZT0iamF2YS5pby5JT0V4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJ3cml0ZUJsb2NrIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYmxvY2siIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZGF0YSIgdHlwZT0iYnl0ZVtdIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJJT0V4Y2VwdGlvbiIgdHlwZT0iamF2YS5pby5JT0V4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJ3cml0ZUJsb2NrIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ic2VjdG9yIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImJsb2NrIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImRhdGEiIHR5cGU9ImJ5dGVbXSI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iSU9FeGNlcHRpb24iIHR5cGU9ImphdmEuaW8uSU9FeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxmaWVsZCBuYW1lPSJLRVlfREVGQVVMVCIKKyB0eXBlPSJieXRlW10iCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9Im51bGwiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iS0VZX01JRkFSRV9BUFBMSUNBVElPTl9ESVJFQ1RPUlkiCisgdHlwZT0iYnl0ZVtdIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSJudWxsIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IktFWV9ORkNfRk9SVU0iCisgdHlwZT0iYnl0ZVtdIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSJudWxsIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlNJWkVfMUsiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxMDI0IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlNJWkVfMksiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIyMDQ4IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlNJWkVfNEsiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSI0MDk2IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlNJWkVfTUlOSSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjMyMCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJTSVpFX1VOS05PV04iCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIwIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlRZUEVfQ0xBU1NJQyIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjAiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iVFlQRV9QTFVTIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJUWVBFX1BSTyIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjIiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iVFlQRV9VTktOT1dOIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iNSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iTWlmYXJlVWx0cmFsaWdodCIKKyBleHRlbmRzPSJhbmRyb2lkLm5mYy50ZWNoLkJhc2ljVGFnVGVjaG5vbG9neSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8bWV0aG9kIG5hbWU9ImdldCIKKyByZXR1cm49ImFuZHJvaWQubmZjLnRlY2guTWlmYXJlVWx0cmFsaWdodCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ0YWciIHR5cGU9ImFuZHJvaWQubmZjLlRhZyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRUeXBlIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InJlYWRCbG9jayIKKyByZXR1cm49ImJ5dGVbXSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icGFnZSIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJJT0V4Y2VwdGlvbiIgdHlwZT0iamF2YS5pby5JT0V4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJ0cmFuc2NlaXZlIgorIHJldHVybj0iYnl0ZVtdIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJkYXRhIiB0eXBlPSJieXRlW10iPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IklPRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmlvLklPRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9IndyaXRlUGFnZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InBhZ2UiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZGF0YSIgdHlwZT0iYnl0ZVtdIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJJT0V4Y2VwdGlvbiIgdHlwZT0iamF2YS5pby5JT0V4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPGZpZWxkIG5hbWU9IlRZUEVfVUxUUkFMSUdIVCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjEiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iVFlQRV9VTFRSQUxJR0hUX0MiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIyIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlRZUEVfVU5LTk9XTiIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjEwIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJOZGVmIgorIGV4dGVuZHM9ImFuZHJvaWQubmZjLnRlY2guQmFzaWNUYWdUZWNobm9sb2d5IgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxtZXRob2QgbmFtZT0iY2FuTWFrZVJlYWRvbmx5IgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXQiCisgcmV0dXJuPSJhbmRyb2lkLm5mYy50ZWNoLk5kZWYiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idGFnIiB0eXBlPSJhbmRyb2lkLm5mYy5UYWciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0Q2FjaGVkTmRlZk1lc3NhZ2UiCisgcmV0dXJuPSJhbmRyb2lkLm5mYy5OZGVmTWVzc2FnZSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRNYXhTaXplIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldE5kZWZNZXNzYWdlIgorIHJldHVybj0iYW5kcm9pZC5uZmMuTmRlZk1lc3NhZ2UiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8ZXhjZXB0aW9uIG5hbWU9IkZvcm1hdEV4Y2VwdGlvbiIgdHlwZT0iYW5kcm9pZC5uZmMuRm9ybWF0RXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPGV4Y2VwdGlvbiBuYW1lPSJJT0V4Y2VwdGlvbiIgdHlwZT0iamF2YS5pby5JT0V4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRUeXBlIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImlzV3JpdGFibGUiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im1ha2VSZWFkb25seSIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8ZXhjZXB0aW9uIG5hbWU9IklPRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmlvLklPRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9IndyaXRlTmRlZk1lc3NhZ2UiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJtc2ciIHR5cGU9ImFuZHJvaWQubmZjLk5kZWZNZXNzYWdlIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJGb3JtYXRFeGNlcHRpb24iIHR5cGU9ImFuZHJvaWQubmZjLkZvcm1hdEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzxleGNlcHRpb24gbmFtZT0iSU9FeGNlcHRpb24iIHR5cGU9ImphdmEuaW8uSU9FeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxmaWVsZCBuYW1lPSJNSUZBUkVfQ0xBU1NJQyIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjEwMSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJORkNfRk9SVU1fVFlQRV8xIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJORkNfRk9SVU1fVFlQRV8yIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJORkNfRk9SVU1fVFlQRV8zIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJORkNfRk9SVU1fVFlQRV80IgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iNCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJPVEhFUiIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9Ii0xIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJOZGVmRm9ybWF0YWJsZSIKKyBleHRlbmRzPSJhbmRyb2lkLm5mYy50ZWNoLkJhc2ljVGFnVGVjaG5vbG9neSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8bWV0aG9kIG5hbWU9ImZvcm1hdCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImZpcnN0TWVzc2FnZSIgdHlwZT0iYW5kcm9pZC5uZmMuTmRlZk1lc3NhZ2UiPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IkZvcm1hdEV4Y2VwdGlvbiIgdHlwZT0iYW5kcm9pZC5uZmMuRm9ybWF0RXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPGV4Y2VwdGlvbiBuYW1lPSJJT0V4Y2VwdGlvbiIgdHlwZT0iamF2YS5pby5JT0V4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXQiCisgcmV0dXJuPSJhbmRyb2lkLm5mYy50ZWNoLk5kZWZGb3JtYXRhYmxlIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InRhZyIgdHlwZT0iYW5kcm9pZC5uZmMuVGFnIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8L2NsYXNzPgorPGNsYXNzIG5hbWU9Ik5mY0EiCisgZXh0ZW5kcz0iYW5kcm9pZC5uZmMudGVjaC5CYXNpY1RhZ1RlY2hub2xvZ3kiCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPG1ldGhvZCBuYW1lPSJnZXQiCisgcmV0dXJuPSJhbmRyb2lkLm5mYy50ZWNoLk5mY0EiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idGFnIiB0eXBlPSJhbmRyb2lkLm5mYy5UYWciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0QXRxYSIKKyByZXR1cm49ImJ5dGVbXSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRTYWsiCisgcmV0dXJuPSJzaG9ydCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJ0cmFuc2NlaXZlIgorIHJldHVybj0iYnl0ZVtdIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJkYXRhIiB0eXBlPSJieXRlW10iPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IklPRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmlvLklPRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8L2NsYXNzPgorPGNsYXNzIG5hbWU9Ik5mY0IiCisgZXh0ZW5kcz0iYW5kcm9pZC5uZmMudGVjaC5CYXNpY1RhZ1RlY2hub2xvZ3kiCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPG1ldGhvZCBuYW1lPSJnZXQiCisgcmV0dXJuPSJhbmRyb2lkLm5mYy50ZWNoLk5mY0IiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idGFnIiB0eXBlPSJhbmRyb2lkLm5mYy5UYWciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0QXBwbGljYXRpb25EYXRhIgorIHJldHVybj0iYnl0ZVtdIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFByb3RvY29sSW5mbyIKKyByZXR1cm49ImJ5dGVbXSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJ0cmFuc2NlaXZlIgorIHJldHVybj0iYnl0ZVtdIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJkYXRhIiB0eXBlPSJieXRlW10iPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IklPRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmlvLklPRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8L2NsYXNzPgorPGNsYXNzIG5hbWU9Ik5mY0YiCisgZXh0ZW5kcz0iYW5kcm9pZC5uZmMudGVjaC5CYXNpY1RhZ1RlY2hub2xvZ3kiCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPG1ldGhvZCBuYW1lPSJnZXQiCisgcmV0dXJuPSJhbmRyb2lkLm5mYy50ZWNoLk5mY0YiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idGFnIiB0eXBlPSJhbmRyb2lkLm5mYy5UYWciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0TWFudWZhY3R1cmVyIgorIHJldHVybj0iYnl0ZVtdIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFN5c3RlbUNvZGUiCisgcmV0dXJuPSJieXRlW10iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0idHJhbnNjZWl2ZSIKKyByZXR1cm49ImJ5dGVbXSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZGF0YSIgdHlwZT0iYnl0ZVtdIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJJT0V4Y2VwdGlvbiIgdHlwZT0iamF2YS5pby5JT0V4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJOZmNWIgorIGV4dGVuZHM9ImFuZHJvaWQubmZjLnRlY2guQmFzaWNUYWdUZWNobm9sb2d5IgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxtZXRob2QgbmFtZT0iZ2V0IgorIHJldHVybj0iYW5kcm9pZC5uZmMudGVjaC5OZmNWIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InRhZyIgdHlwZT0iYW5kcm9pZC5uZmMuVGFnIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldERzZklkIgorIHJldHVybj0iYnl0ZSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRSZXNwb25zZUZsYWdzIgorIHJldHVybj0iYnl0ZSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJ0cmFuc2NlaXZlIgorIHJldHVybj0iYnl0ZVtdIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJkYXRhIiB0eXBlPSJieXRlW10iPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IklPRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmlvLklPRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8L2NsYXNzPgorPGludGVyZmFjZSBuYW1lPSJUYWdUZWNobm9sb2d5IgorIGFic3RyYWN0PSJ0cnVlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxtZXRob2QgbmFtZT0iY2xvc2UiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iY29ubmVjdCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxleGNlcHRpb24gbmFtZT0iSU9FeGNlcHRpb24iIHR5cGU9ImphdmEuaW8uSU9FeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0VGFnIgorIHJldHVybj0iYW5kcm9pZC5uZmMuVGFnIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icmVjb25uZWN0IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGV4Y2VwdGlvbiBuYW1lPSJJT0V4Y2VwdGlvbiIgdHlwZT0iamF2YS5pby5JT0V4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPC9pbnRlcmZhY2U+CiA8L3BhY2thZ2U+CiA8cGFja2FnZSBuYW1lPSJhbmRyb2lkLm9wZW5nbCIKID4KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9BY3Rpdml0eS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0FjdGl2aXR5LmphdmEKaW5kZXggMDU1OTg0Zi4uODA0YWVhYSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0FjdGl2aXR5LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0FjdGl2aXR5LmphdmEKQEAgLTY1NSw3ICs2NTUsNyBAQAogICAgIGJvb2xlYW4gbUNhbGxlZDsKICAgICBib29sZWFuIG1DaGVja2VkRm9yTG9hZGVyTWFuYWdlcjsKICAgICBib29sZWFuIG1Mb2FkZXJzU3RhcnRlZDsKLSAgICBwcml2YXRlIGJvb2xlYW4gbVJlc3VtZWQ7CisgICAgLypwYWNrYWdlKi8gYm9vbGVhbiBtUmVzdW1lZDsKICAgICBwcml2YXRlIGJvb2xlYW4gbVN0b3BwZWQ7CiAgICAgYm9vbGVhbiBtRmluaXNoZWQ7CiAgICAgYm9vbGVhbiBtU3RhcnRlZEFjdGl2aXR5OwpAQCAtNDM2Myw5ICs0MzYzLDggQEAKICAgICAgICAgCiAgICAgICAgIG1MYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlcyA9IG51bGw7CiAgICAgICAgIAotICAgICAgICAvLyBGaXJzdCBjYWxsIG9uUmVzdW1lKCkgLWJlZm9yZS0gc2V0dGluZyBtUmVzdW1lZCwgc28gd2UgZG9uJ3QKLSAgICAgICAgLy8gc2VuZCBvdXQgYW55IHN0YXR1cyBiYXIgLyBtZW51IG5vdGlmaWNhdGlvbnMgdGhlIGNsaWVudCBtYWtlcy4KICAgICAgICAgbUNhbGxlZCA9IGZhbHNlOworICAgICAgICAvLyBtUmVzdW1lZCBpcyBzZXQgYnkgdGhlIGluc3RydW1lbnRhdGlvbgogICAgICAgICBtSW5zdHJ1bWVudGF0aW9uLmNhbGxBY3Rpdml0eU9uUmVzdW1lKHRoaXMpOwogICAgICAgICBpZiAoIW1DYWxsZWQpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBTdXBlck5vdENhbGxlZEV4Y2VwdGlvbigKQEAgLTQzNzQsNyArNDM3Myw2IEBACiAgICAgICAgIH0KIAogICAgICAgICAvLyBOb3cgcmVhbGx5IHJlc3VtZSwgYW5kIGluc3RhbGwgdGhlIGN1cnJlbnQgc3RhdHVzIGJhciBhbmQgbWVudS4KLSAgICAgICAgbVJlc3VtZWQgPSB0cnVlOwogICAgICAgICBtQ2FsbGVkID0gZmFsc2U7CiAgICAgICAgIAogICAgICAgICBtRnJhZ21lbnRzLmRpc3BhdGNoUmVzdW1lKCk7CkBAIC00Mzk5LDYgKzQzOTcsNyBAQAogICAgICAgICAgICAgICAgICAgICAiQWN0aXZpdHkgIiArIG1Db21wb25lbnQudG9TaG9ydFN0cmluZygpICsKICAgICAgICAgICAgICAgICAgICAgIiBkaWQgbm90IGNhbGwgdGhyb3VnaCB0byBzdXBlci5vblBhdXNlKCkiKTsKICAgICAgICAgfQorICAgICAgICBtUmVzdW1lZCA9IGZhbHNlOwogICAgIH0KICAgICAKICAgICBmaW5hbCB2b2lkIHBlcmZvcm1Vc2VyTGVhdmluZygpIHsKQEAgLTQ0NjEsNyArNDQ2MCwxMCBAQAogICAgICAgICB9CiAgICAgfQogICAgIAotICAgIGZpbmFsIGJvb2xlYW4gaXNSZXN1bWVkKCkgeworICAgIC8qKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gaXNSZXN1bWVkKCkgewogICAgICAgICByZXR1cm4gbVJlc3VtZWQ7CiAgICAgfQogCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvQWN0aXZpdHlUaHJlYWQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9BY3Rpdml0eVRocmVhZC5qYXZhCmluZGV4IDUxMWRkYzEuLjgxZWYzMTcgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9BY3Rpdml0eVRocmVhZC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9BY3Rpdml0eVRocmVhZC5qYXZhCkBAIC0xOTMsNiArMTkzLDkgQEAKICAgICBmaW5hbCBIYXNoTWFwPElCaW5kZXIsIFByb3ZpZGVyQ2xpZW50UmVjb3JkPiBtTG9jYWxQcm92aWRlcnMKICAgICAgICAgPSBuZXcgSGFzaE1hcDxJQmluZGVyLCBQcm92aWRlckNsaWVudFJlY29yZD4oKTsKIAorICAgIGZpbmFsIEhhc2hNYXA8QWN0aXZpdHksIEFycmF5TGlzdDxPbkFjdGl2aXR5UGF1c2VkTGlzdGVuZXI+PiBtT25QYXVzZUxpc3RlbmVycworICAgICAgICA9IG5ldyBIYXNoTWFwPEFjdGl2aXR5LCBBcnJheUxpc3Q8T25BY3Rpdml0eVBhdXNlZExpc3RlbmVyPj4oKTsKKwogICAgIGZpbmFsIEdjSWRsZXIgbUdjSWRsZXIgPSBuZXcgR2NJZGxlcigpOwogICAgIGJvb2xlYW4gbUdjSWRsZXJTY2hlZHVsZWQgPSBmYWxzZTsKIApAQCAtMTUxNCw2ICsxNTE3LDI4IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBwdWJsaWMgdm9pZCByZWdpc3Rlck9uQWN0aXZpdHlQYXVzZWRMaXN0ZW5lcihBY3Rpdml0eSBhY3Rpdml0eSwKKyAgICAgICAgICAgIE9uQWN0aXZpdHlQYXVzZWRMaXN0ZW5lciBsaXN0ZW5lcikgeworICAgICAgICBzeW5jaHJvbml6ZWQgKG1PblBhdXNlTGlzdGVuZXJzKSB7CisgICAgICAgICAgICBBcnJheUxpc3Q8T25BY3Rpdml0eVBhdXNlZExpc3RlbmVyPiBsaXN0ID0gbU9uUGF1c2VMaXN0ZW5lcnMuZ2V0KGFjdGl2aXR5KTsKKyAgICAgICAgICAgIGlmIChsaXN0ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBsaXN0ID0gbmV3IEFycmF5TGlzdDxPbkFjdGl2aXR5UGF1c2VkTGlzdGVuZXI+KCk7CisgICAgICAgICAgICAgICAgbU9uUGF1c2VMaXN0ZW5lcnMucHV0KGFjdGl2aXR5LCBsaXN0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxpc3QuYWRkKGxpc3RlbmVyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHVucmVnaXN0ZXJPbkFjdGl2aXR5UGF1c2VkTGlzdGVuZXIoQWN0aXZpdHkgYWN0aXZpdHksCisgICAgICAgICAgICBPbkFjdGl2aXR5UGF1c2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChtT25QYXVzZUxpc3RlbmVycykgeworICAgICAgICAgICAgQXJyYXlMaXN0PE9uQWN0aXZpdHlQYXVzZWRMaXN0ZW5lcj4gbGlzdCA9IG1PblBhdXNlTGlzdGVuZXJzLmdldChhY3Rpdml0eSk7CisgICAgICAgICAgICBpZiAobGlzdCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbGlzdC5yZW1vdmUobGlzdGVuZXIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCiAgICAgcHVibGljIGZpbmFsIEFjdGl2aXR5SW5mbyByZXNvbHZlQWN0aXZpdHlJbmZvKEludGVudCBpbnRlbnQpIHsKICAgICAgICAgQWN0aXZpdHlJbmZvIGFJbmZvID0gaW50ZW50LnJlc29sdmVBY3Rpdml0eUluZm8oCiAgICAgICAgICAgICAgICAgbUluaXRpYWxBcHBsaWNhdGlvbi5nZXRQYWNrYWdlTWFuYWdlcigpLCBQYWNrYWdlTWFuYWdlci5HRVRfU0hBUkVEX0xJQlJBUllfRklMRVMpOwpAQCAtMjQ1Miw2ICsyNDc3LDE3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgci5wYXVzZWQgPSB0cnVlOworCisgICAgICAgIC8vIE5vdGlmeSBhbnkgb3V0c3RhbmRpbmcgb24gcGF1c2VkIGxpc3RlbmVycworICAgICAgICBBcnJheUxpc3Q8T25BY3Rpdml0eVBhdXNlZExpc3RlbmVyPiBsaXN0ZW5lcnM7CisgICAgICAgIHN5bmNocm9uaXplZCAobU9uUGF1c2VMaXN0ZW5lcnMpIHsKKyAgICAgICAgICAgIGxpc3RlbmVycyA9IG1PblBhdXNlTGlzdGVuZXJzLnJlbW92ZShyLmFjdGl2aXR5KTsKKyAgICAgICAgfQorICAgICAgICBpbnQgc2l6ZSA9IChsaXN0ZW5lcnMgIT0gbnVsbCA/IGxpc3RlbmVycy5zaXplKCkgOiAwKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgICAgIGxpc3RlbmVycy5nZXQoaSkub25QYXVzZWQoci5hY3Rpdml0eSk7CisgICAgICAgIH0KKwogICAgICAgICByZXR1cm4gc3RhdGU7CiAgICAgfQogCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvSW5zdHJ1bWVudGF0aW9uLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvSW5zdHJ1bWVudGF0aW9uLmphdmEKaW5kZXggYWQ4MTFkOC4uY2QyNzhiZSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0luc3RydW1lbnRhdGlvbi5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9JbnN0cnVtZW50YXRpb24uamF2YQpAQCAtMTE0OSw2ICsxMTQ5LDcgQEAKICAgICAgKiBAcGFyYW0gYWN0aXZpdHkgVGhlIGFjdGl2aXR5IGJlaW5nIHJlc3VtZWQuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgY2FsbEFjdGl2aXR5T25SZXN1bWUoQWN0aXZpdHkgYWN0aXZpdHkpIHsKKyAgICAgICAgYWN0aXZpdHkubVJlc3VtZWQgPSB0cnVlOwogICAgICAgICBhY3Rpdml0eS5vblJlc3VtZSgpOwogICAgICAgICAKICAgICAgICAgaWYgKG1BY3Rpdml0eU1vbml0b3JzICE9IG51bGwpIHsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9PbkFjdGl2aXR5UGF1c2VkTGlzdGVuZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9PbkFjdGl2aXR5UGF1c2VkTGlzdGVuZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzlmMTMzCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL09uQWN0aXZpdHlQYXVzZWRMaXN0ZW5lci5qYXZhCkBAIC0wLDAgKzEsMzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgR29vZ2xlIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqCSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQorICovCisKK3BhY2thZ2UgYW5kcm9pZC5hcHA7CisKKy8qKgorICogQSBsaXN0ZW5lciB0aGF0IGlzIGNhbGxlZCB3aGVuIGFuIEFjdGl2aXR5IGlzIHBhdXNlZC4gU2luY2UgdGhpcyBpcyB0cmFja2VkIGNsaWVudCBzaWRlCisgKiBpdCBzaG91bGQgbm90IGJlIHRydXN0ZWQgdG8gcmVwcmVzZW50IHRoZSBleGFjdCBjdXJyZW50IHN0YXRlLCBidXQgY2FuIGJlIHVzZWQgYXMgYSBoaW50CisgKiBmb3IgY2xlYW51cC4KKyAqCisgKiBAaGlkZQorICovCitwdWJsaWMgaW50ZXJmYWNlIE9uQWN0aXZpdHlQYXVzZWRMaXN0ZW5lciB7CisgICAgLyoqCisgICAgICogQ2FsbGVkIHdoZW4gdGhlIGdpdmVuIGFjdGl2aXR5IGlzIHBhdXNlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBvblBhdXNlZChBY3Rpdml0eSBhY3Rpdml0eSk7Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0NvbnRlbnRSZXNvbHZlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9Db250ZW50UmVzb2x2ZXIuamF2YQppbmRleCBkYTUxOGMyLi4yZDAzZTdjIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0NvbnRlbnRSZXNvbHZlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ29udGVudFJlc29sdmVyLmphdmEKQEAgLTE1NzksOSArMTU3OSwxMSBAQAogCiAgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICAgICAgLy8gVE9ETzogaW50ZWdyYXRlIENsb3NlR3VhcmQgc3VwcG9ydC4KICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgaWYoIW1DbG9zZUZsYWcpIHsKLSAgICAgICAgICAgICAgICAgICAgQ29udGVudFJlc29sdmVyLnRoaXMucmVsZWFzZVByb3ZpZGVyKG1Db250ZW50UHJvdmlkZXIpOworICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDdXJzb3IgZmluYWxpemVkIHdpdGhvdXQgcHJpb3IgY2xvc2UoKSIpOworICAgICAgICAgICAgICAgICAgICBjbG9zZSgpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICAgICAgc3VwZXIuZmluYWxpemUoKTsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2hhcmR3YXJlL1NlbnNvck1hbmFnZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2hhcmR3YXJlL1NlbnNvck1hbmFnZXIuamF2YQppbmRleCA0YTc1NTE0Li5mMDc5ZTQyIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9oYXJkd2FyZS9TZW5zb3JNYW5hZ2VyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvaGFyZHdhcmUvU2Vuc29yTWFuYWdlci5qYXZhCkBAIC0yNSw2ICsyNSw3IEBACiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIGltcG9ydCBhbmRyb2lkLnV0aWwuU3BhcnNlQXJyYXk7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlNwYXJzZUJvb2xlYW5BcnJheTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuU3BhcnNlSW50QXJyYXk7CiBpbXBvcnQgYW5kcm9pZC52aWV3LklSb3RhdGlvbldhdGNoZXI7CiBpbXBvcnQgYW5kcm9pZC52aWV3LklXaW5kb3dNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQudmlldy5TdXJmYWNlOwpAQCAtNDg5LDYgKzQ5MCw4IEBACiAgICAgICAgIHByaXZhdGUgZmluYWwgSGFuZGxlciBtSGFuZGxlcjsKICAgICAgICAgcHJpdmF0ZSBTZW5zb3JFdmVudCBtVmFsdWVzUG9vbDsKICAgICAgICAgcHVibGljIFNwYXJzZUJvb2xlYW5BcnJheSBtU2Vuc29ycyA9IG5ldyBTcGFyc2VCb29sZWFuQXJyYXkoKTsKKyAgICAgICAgcHVibGljIFNwYXJzZUJvb2xlYW5BcnJheSBtRmlyc3RFdmVudCA9IG5ldyBTcGFyc2VCb29sZWFuQXJyYXkoKTsKKyAgICAgICAgcHVibGljIFNwYXJzZUludEFycmF5IG1TZW5zb3JBY2N1cmFjaWVzID0gbmV3IFNwYXJzZUludEFycmF5KCk7CiAKICAgICAgICAgTGlzdGVuZXJEZWxlZ2F0ZShTZW5zb3JFdmVudExpc3RlbmVyIGxpc3RlbmVyLCBTZW5zb3Igc2Vuc29yLCBIYW5kbGVyIGhhbmRsZXIpIHsKICAgICAgICAgICAgIG1TZW5zb3JFdmVudExpc3RlbmVyID0gbGlzdGVuZXI7CkBAIC00OTksMTAgKzUwMiwzMCBAQAogICAgICAgICAgICAgbUhhbmRsZXIgPSBuZXcgSGFuZGxlcihsb29wZXIpIHsKICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKE1lc3NhZ2UgbXNnKSB7Ci0gICAgICAgICAgICAgICAgICAgIFNlbnNvckV2ZW50IHQgPSAoU2Vuc29yRXZlbnQpbXNnLm9iajsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHQuYWNjdXJhY3kgPj0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbVNlbnNvckV2ZW50TGlzdGVuZXIub25BY2N1cmFjeUNoYW5nZWQodC5zZW5zb3IsIHQuYWNjdXJhY3kpOworICAgICAgICAgICAgICAgICAgICBmaW5hbCBTZW5zb3JFdmVudCB0ID0gKFNlbnNvckV2ZW50KW1zZy5vYmo7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBoYW5kbGUgPSB0LnNlbnNvci5nZXRIYW5kbGUoKTsKKworICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHQuc2Vuc29yLmdldFR5cGUoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gT25seSByZXBvcnQgYWNjdXJhY3kgZm9yIHNlbnNvcnMgdGhhdCBzdXBwb3J0IGl0LgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBTZW5zb3IuVFlQRV9NQUdORVRJQ19GSUVMRDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgU2Vuc29yLlRZUEVfT1JJRU5UQVRJT046CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FsbCBvbkFjY3VyYWN5Q2hhbmdlZCgpIG9ubHkgaWYgdGhlIHZhbHVlIGNoYW5nZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgYWNjdXJhY3kgPSBtU2Vuc29yQWNjdXJhY2llcy5nZXQoaGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHQuYWNjdXJhY3kgPj0gMCkgJiYgKGFjY3VyYWN5ICE9IHQuYWNjdXJhY3kpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TZW5zb3JBY2N1cmFjaWVzLnB1dChoYW5kbGUsIHQuYWNjdXJhY3kpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2Vuc29yRXZlbnRMaXN0ZW5lci5vbkFjY3VyYWN5Q2hhbmdlZCh0LnNlbnNvciwgdC5hY2N1cmFjeSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGb3Igb3RoZXIgc2Vuc29ycywganVzdCByZXBvcnQgdGhlIGFjY3VyYWN5IG9uY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUZpcnN0RXZlbnQuZ2V0KGhhbmRsZSkgPT0gZmFsc2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZpcnN0RXZlbnQucHV0KGhhbmRsZSwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TZW5zb3JFdmVudExpc3RlbmVyLm9uQWNjdXJhY3lDaGFuZ2VkKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuc2Vuc29yLCBTRU5TT1JfU1RBVFVTX0FDQ1VSQUNZX0hJR0gpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAgICAgICAgIG1TZW5zb3JFdmVudExpc3RlbmVyLm9uU2Vuc29yQ2hhbmdlZCh0KTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuVG9Qb29sKHQpOwogICAgICAgICAgICAgICAgIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL25mYy9JTmZjQWRhcHRlci5haWRsIGIvY29yZS9qYXZhL2FuZHJvaWQvbmZjL0lOZmNBZGFwdGVyLmFpZGwKaW5kZXggYTY2M2ZiOC4uY2ZlZmY1MiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvbmZjL0lOZmNBZGFwdGVyLmFpZGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvbmZjL0lOZmNBZGFwdGVyLmFpZGwKQEAgLTE2LDYgKzE2LDkgQEAKIAogcGFja2FnZSBhbmRyb2lkLm5mYzsKIAoraW1wb3J0IGFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWU7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudEZpbHRlcjsKIGltcG9ydCBhbmRyb2lkLm5mYy5OZGVmTWVzc2FnZTsKIGltcG9ydCBhbmRyb2lkLm5mYy5UYWc7CiBpbXBvcnQgYW5kcm9pZC5uZmMuSUxsY3BTb2NrZXQ7CkBAIC00NCw2ICs0NywxMSBAQAogICAgIE5kZWZNZXNzYWdlIGxvY2FsR2V0KCk7CiAgICAgdm9pZCBsb2NhbFNldChpbiBOZGVmTWVzc2FnZSBtZXNzYWdlKTsKICAgICB2b2lkIG9wZW5UYWdDb25uZWN0aW9uKGluIFRhZyB0YWcpOworICAgIHZvaWQgZW5hYmxlRm9yZWdyb3VuZERpc3BhdGNoKGluIENvbXBvbmVudE5hbWUgYWN0aXZpdHksIGluIFBlbmRpbmdJbnRlbnQgaW50ZW50LAorICAgICAgICBpbiBJbnRlbnRGaWx0ZXJbXSBmaWx0ZXJzKTsKKyAgICB2b2lkIGRpc2FibGVGb3JlZ3JvdW5kRGlzcGF0Y2goaW4gQ29tcG9uZW50TmFtZSBhY3Rpdml0eSk7CisgICAgdm9pZCBlbmFibGVGb3JlZ3JvdW5kTmRlZlB1c2goaW4gQ29tcG9uZW50TmFtZSBhY3Rpdml0eSwgaW4gTmRlZk1lc3NhZ2UgbXNnKTsKKyAgICB2b2lkIGRpc2FibGVGb3JlZ3JvdW5kTmRlZlB1c2goaW4gQ29tcG9uZW50TmFtZSBhY3Rpdml0eSk7CiAKICAgICAvLyBOb24tcHVibGljIG1ldGhvZHMKICAgICAvLyBUT0RPOiBjaGVjayBhbmQgY29tcGxldGUKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL25mYy9JTmZjVGFnLmFpZGwgYi9jb3JlL2phdmEvYW5kcm9pZC9uZmMvSU5mY1RhZy5haWRsCmluZGV4IDVkMjIyZDkuLjU3ZGMzOGMgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL25mYy9JTmZjVGFnLmFpZGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvbmZjL0lOZmNUYWcuYWlkbApAQCAtMTcsNiArMTcsNyBAQAogcGFja2FnZSBhbmRyb2lkLm5mYzsKIAogaW1wb3J0IGFuZHJvaWQubmZjLk5kZWZNZXNzYWdlOworaW1wb3J0IGFuZHJvaWQubmZjLlRyYW5zY2VpdmVSZXN1bHQ7CiAKIC8qKgogICogQGhpZGUKQEAgLTMwLDcgKzMxLDcgQEAKICAgICBieXRlW10gZ2V0VWlkKGludCBuYXRpdmVIYW5kbGUpOwogICAgIGJvb2xlYW4gaXNOZGVmKGludCBuYXRpdmVIYW5kbGUpOwogICAgIGJvb2xlYW4gaXNQcmVzZW50KGludCBuYXRpdmVIYW5kbGUpOwotICAgIGJ5dGVbXSB0cmFuc2NlaXZlKGludCBuYXRpdmVIYW5kbGUsIGluIGJ5dGVbXSBkYXRhLCBib29sZWFuIHJhdyk7CisgICAgVHJhbnNjZWl2ZVJlc3VsdCB0cmFuc2NlaXZlKGludCBuYXRpdmVIYW5kbGUsIGluIGJ5dGVbXSBkYXRhLCBib29sZWFuIHJhdyk7CiAKICAgICBpbnQgZ2V0TGFzdEVycm9yKGludCBuYXRpdmVIYW5kbGUpOwogCkBAIC0zOSw0ICs0MCw3IEBACiAgICAgaW50IG5kZWZNYWtlUmVhZE9ubHkoaW50IG5hdGl2ZUhhbmRsZSk7CiAgICAgYm9vbGVhbiBuZGVmSXNXcml0YWJsZShpbnQgbmF0aXZlSGFuZGxlKTsKICAgICBpbnQgZm9ybWF0TmRlZihpbnQgbmF0aXZlSGFuZGxlLCBpbiBieXRlW10ga2V5KTsKKworICAgIHZvaWQgc2V0SXNvRGVwVGltZW91dChpbnQgdGltZW91dCk7CisgICAgdm9pZCByZXNldElzb0RlcFRpbWVvdXQoKTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL25mYy9OZmNBZGFwdGVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9uZmMvTmZjQWRhcHRlci5qYXZhCmluZGV4IDc1OGM4YTAuLmIxNjIzYTUgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL25mYy9OZmNBZGFwdGVyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvbmZjL05mY0FkYXB0ZXIuamF2YQpAQCAtMTgsMTAgKzE4LDE1IEBACiAKIGltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uU2RrQ29uc3RhbnQ7CiBpbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLlNka0NvbnN0YW50LlNka0NvbnN0YW50VHlwZTsKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKIGltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eVRocmVhZDsKK2ltcG9ydCBhbmRyb2lkLmFwcC5PbkFjdGl2aXR5UGF1c2VkTGlzdGVuZXI7CitpbXBvcnQgYW5kcm9pZC5hcHAuUGVuZGluZ0ludGVudDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50RmlsdGVyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5JUGFja2FnZU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQubmZjLnRlY2guVGFnVGVjaG5vbG9neTsKIGltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CiBpbXBvcnQgYW5kcm9pZC5vcy5TZXJ2aWNlTWFuYWdlcjsKQEAgLTQzLDcgKzQ4LDYgQEAKICAgICAgKgogICAgICAqIElmIGFueSBhY3Rpdml0aWVzIHJlc3BvbmQgdG8gdGhpcyBpbnRlbnQgbmVpdGhlcgogICAgICAqIHtAbGluayAjQUNUSU9OX1RFQ0hOT0xPR1lfRElTQ09WRVJFRH0gb3Ige0BsaW5rICNBQ1RJT05fVEFHX0RJU0NPVkVSRUR9IHdpbGwgYmUgc3RhcnRlZC4KLSAgICAgKiBAaGlkZQogICAgICAqLwogICAgIEBTZGtDb25zdGFudChTZGtDb25zdGFudFR5cGUuQUNUSVZJVFlfSU5URU5UX0FDVElPTikKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fTkRFRl9ESVNDT1ZFUkVEID0gImFuZHJvaWQubmZjLmFjdGlvbi5OREVGX0RJU0NPVkVSRUQiOwpAQCAtNTcsNyArNjEsNiBAQAogICAgICAqIHtAbGluayAjQUNUSU9OX1RBR19ESVNDT1ZFUkVEfQogICAgICAqCiAgICAgICogSWYgYW55IGFjdGl2aXRpZXMgcmVzcG9uZCB0byB0aGlzIGludGVudCB7QGxpbmsgI0FDVElPTl9UQUdfRElTQ09WRVJFRH0gd2lsbCBub3QgYmUgc3RhcnRlZC4KLSAgICAgKiBAaGlkZQogICAgICAqLwogICAgIEBTZGtDb25zdGFudChTZGtDb25zdGFudFR5cGUuQUNUSVZJVFlfSU5URU5UX0FDVElPTikKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fVEVDSE5PTE9HWV9ESVNDT1ZFUkVEID0gImFuZHJvaWQubmZjLmFjdGlvbi5URUNIX0RJU0NPVkVSRUQiOwpAQCAtNzYsNyArNzksNiBAQAogCiAgICAgLyoqCiAgICAgICogTWFuZGF0b3J5IFRhZyBleHRyYSBmb3IgdGhlIEFDVElPTl9UQUcgaW50ZW50cy4KLSAgICAgKiBAaGlkZQogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX1RBRyA9ICJhbmRyb2lkLm5mYy5leHRyYS5UQUciOwogCkBAIC0xMDIsNiArMTA0LDIwIEBACiAgICAgICAgICAgICAiYW5kcm9pZC5uZmMuYWN0aW9uLlRSQU5TQUNUSU9OX0RFVEVDVEVEIjsKIAogICAgIC8qKgorICAgICAqIEJyb2FkY2FzdCBBY3Rpb246IGFuIFJGIGZpZWxkIE9OIGhhcyBiZWVuIGRldGVjdGVkLgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX1JGX0ZJRUxEX09OX0RFVEVDVEVEID0KKyAgICAgICAgICAgICJhbmRyb2lkLm5mYy5hY3Rpb24uUkZfRklFTERfT05fREVURUNURUQiOworCisgICAgLyoqCisgICAgICogQnJvYWRjYXN0IEFjdGlvbjogYW4gUkYgRmllbGQgT0ZGIGhhcyBiZWVuIGRldGVjdGVkLgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX1JGX0ZJRUxEX09GRl9ERVRFQ1RFRCA9CisgICAgICAgICAgICAiYW5kcm9pZC5uZmMuYWN0aW9uLlJGX0ZJRUxEX09GRl9ERVRFQ1RFRCI7CisKKyAgICAvKioKICAgICAgKiBCcm9hZGNhc3QgQWN0aW9uOiBhbiBhZGFwdGVyJ3Mgc3RhdGUgY2hhbmdlZCBiZXR3ZWVuIGVuYWJsZWQgYW5kIGRpc2FibGVkLgogICAgICAqCiAgICAgICogVGhlIG5ldyB2YWx1ZSBpcyBzdG9yZWQgaW4gdGhlIGV4dHJhIEVYVFJBX05FV19CT09MRUFOX1NUQVRFIGFuZCBqdXN0IGNvbnRhaW5zCkBAIC0xOTcsOCArMjEzLDcgQEAKICAgICAvLyBhdHRlbXB0RGVhZFNlcnZpY2VSZWNvdmVyeSgpIHdoZW4gTkZDIGNyYXNoZXMgLSB3ZSBhY2NlcHQgYSBiZXN0IGVmZm9ydAogICAgIC8vIHJlY292ZXJ5CiAgICAgcHJpdmF0ZSBzdGF0aWMgSU5mY0FkYXB0ZXIgc1NlcnZpY2U7Ci0KLSAgICBwcml2YXRlIGZpbmFsIENvbnRleHQgbUNvbnRleHQ7CisgICAgcHJpdmF0ZSBzdGF0aWMgSU5mY1RhZyBzVGFnU2VydmljZTsKIAogICAgIC8qKgogICAgICAqIEhlbHBlciB0byBjaGVjayBpZiB0aGlzIGRldmljZSBoYXMgRkVBVFVSRV9ORkMsIGJ1dCB3aXRob3V0IHVzaW5nCkBAIC0yMzUsNiArMjUwLDEyIEBACiAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiY291bGQgbm90IHJldHJpZXZlIE5GQyBzZXJ2aWNlIik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHNUYWdTZXJ2aWNlID0gc1NlcnZpY2UuZ2V0TmZjVGFnSW50ZXJmYWNlKCk7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy5lKFRBRywgImNvdWxkIG5vdCByZXRyaWV2ZSBORkMgVGFnIHNlcnZpY2UiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICByZXR1cm4gc1NlcnZpY2U7CiAgICAgfQpAQCAtMjg5LDcgKzMxMCw2IEBACiAgICAgICAgIGlmIChzZXR1cFNlcnZpY2UoKSA9PSBudWxsKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKICAgICAgICAgfQotICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7CiAgICAgfQogCiAgICAgLyoqCkBAIC0yOTcsMTAgKzMxNywyMCBAQAogICAgICAqIEBoaWRlCiAgICAgICovCiAgICAgcHVibGljIElOZmNBZGFwdGVyIGdldFNlcnZpY2UoKSB7CisgICAgICAgIGlzRW5hYmxlZCgpOyAgLy8gTk9QIGNhbGwgdG8gcmVjb3ZlciBzU2VydmljZSBpZiBpdCBpcyBzdGFsZQogICAgICAgICByZXR1cm4gc1NlcnZpY2U7CiAgICAgfQogCiAgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgYmluZGVyIGludGVyZmFjZSB0byB0aGUgdGFnIHNlcnZpY2UuCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgSU5mY1RhZyBnZXRUYWdTZXJ2aWNlKCkgeworICAgICAgICBpc0VuYWJsZWQoKTsgIC8vIE5PUCBjYWxsIHRvIHJlY292ZXIgc1RhZ1NlcnZpY2UgaWYgaXQgaXMgc3RhbGUKKyAgICAgICAgcmV0dXJuIHNUYWdTZXJ2aWNlOworICAgIH0KKworICAgIC8qKgogICAgICAqIE5GQyBzZXJ2aWNlIGRlYWQgLSBhdHRlbXB0IGJlc3QgZWZmb3J0IHJlY292ZXJ5CiAgICAgICogQGhpZGUKICAgICAgKi8KQEAgLTMwOSwxMSArMzM5LDIxIEBACiAgICAgICAgIElOZmNBZGFwdGVyIHNlcnZpY2UgPSBnZXRTZXJ2aWNlSW50ZXJmYWNlKCk7CiAgICAgICAgIGlmIChzZXJ2aWNlID09IG51bGwpIHsKICAgICAgICAgICAgIExvZy5lKFRBRywgImNvdWxkIG5vdCByZXRyaWV2ZSBORkMgc2VydmljZSBkdXJpbmcgc2VydmljZSByZWNvdmVyeSIpOworICAgICAgICAgICAgLy8gbm90aGluZyBtb3JlIGNhbiBiZSBkb25lIG5vdywgc1NlcnZpY2UgaXMgc3RpbGwgc3RhbGUsIHdlJ2xsIGhpdAorICAgICAgICAgICAgLy8gdGhpcyByZWNvdmVyeSBwYXRoIGFnYWluIGxhdGVyCiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KLSAgICAgICAgLyogYXNzaWduaW5nIHRvIHNTZXJ2aWNlIGlzIG5vdCB0aHJlYWQtc2FmZSwgYnV0IHRoaXMgaXMgYmVzdC1lZmZvcnQgY29kZQotICAgICAgICAgKiBhbmQgb24gYSB3ZWxsLWJlaGF2ZWQgc3lzdGVtIHNob3VsZCBuZXZlciBoYXBwZW4gKi8KKyAgICAgICAgLy8gYXNzaWduaW5nIHRvIHNTZXJ2aWNlIGlzIG5vdCB0aHJlYWQtc2FmZSwgYnV0IHRoaXMgaXMgYmVzdC1lZmZvcnQgY29kZQorICAgICAgICAvLyBhbmQgb24gYSB3ZWxsLWJlaGF2ZWQgc3lzdGVtIHNob3VsZCBuZXZlciBoYXBwZW4KICAgICAgICAgc1NlcnZpY2UgPSBzZXJ2aWNlOworICAgICAgICB0cnkgeworICAgICAgICAgICAgc1RhZ1NlcnZpY2UgPSBzZXJ2aWNlLmdldE5mY1RhZ0ludGVyZmFjZSgpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZWUpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgImNvdWxkIG5vdCByZXRyaWV2ZSBORkMgdGFnIHNlcnZpY2UgZHVyaW5nIHNlcnZpY2UgcmVjb3ZlcnkiKTsKKyAgICAgICAgICAgIC8vIG5vdGhpbmcgbW9yZSBjYW4gYmUgZG9uZSBub3csIHNTZXJ2aWNlIGlzIHN0aWxsIHN0YWxlLCB3ZSdsbCBoaXQKKyAgICAgICAgICAgIC8vIHRoaXMgcmVjb3ZlcnkgcGF0aCBhZ2FpbiBsYXRlcgorICAgICAgICB9CisKICAgICAgICAgcmV0dXJuOwogICAgIH0KIApAQCAtMzc0LDYgKzQxNCwxMjQgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBFbmFibGVzIGZvcmVncm91bmQgZGlzcGF0Y2hpbmcgdG8gdGhlIGdpdmVuIEFjdGl2aXR5LiBUaGlzIHdpbGwgZm9yY2UgYWxsIE5GQyBJbnRlbnRzIHRoYXQKKyAgICAgKiBtYXRjaCB0aGUgZ2l2ZW4gZmlsdGVycyB0byBiZSBkZWxpdmVyZWQgdG8gdGhlIGFjdGl2aXR5IGJ5cGFzc2luZyB0aGUgc3RhbmRhcmQgZGlzcGF0Y2gKKyAgICAgKiBtZWNoYW5pc20uCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBtdXN0IGJlIGNhbGxlZCBmcm9tIHRoZSBtYWluIHRocmVhZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhY3Rpdml0eSB0aGUgQWN0aXZpdHkgdG8gZGlzcGF0Y2ggdG8KKyAgICAgKiBAcGFyYW0gaW50ZW50IHRoZSBQZW5kaW5nSW50ZW50IHRvIHN0YXJ0IGZvciB0aGUgZGlzcGF0Y2gKKyAgICAgKiBAcGFyYW0gZmlsdGVycyB0aGUgSW50ZW50RmlsdGVycyB0byBvdmVycmlkZSBkaXNwYXRjaGluZyBmb3IKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGVuYWJsZUZvcmVncm91bmREaXNwYXRjaChBY3Rpdml0eSBhY3Rpdml0eSwgUGVuZGluZ0ludGVudCBpbnRlbnQsCisgICAgICAgICAgICBJbnRlbnRGaWx0ZXIuLi4gZmlsdGVycykgeworICAgICAgICBpZiAoYWN0aXZpdHkgPT0gbnVsbCB8fCBpbnRlbnQgPT0gbnVsbCB8fCBmaWx0ZXJzID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgICAgIGlmICghYWN0aXZpdHkuaXNSZXN1bWVkKCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkZvcmVnb3J1bmQgZGlzcGF0Y2hpbmcgY2FuIG9ubHkgYmUgZW5hYmxlZCAiICsKKyAgICAgICAgICAgICAgICAgICAgIndoZW4geW91ciBhY3Rpdml0eSBpcyByZXN1bWVkIik7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEFjdGl2aXR5VGhyZWFkLmN1cnJlbnRBY3Rpdml0eVRocmVhZCgpLnJlZ2lzdGVyT25BY3Rpdml0eVBhdXNlZExpc3RlbmVyKGFjdGl2aXR5LAorICAgICAgICAgICAgICAgICAgICBtRm9yZWdyb3VuZERpc3BhdGNoTGlzdGVuZXIpOworICAgICAgICAgICAgc1NlcnZpY2UuZW5hYmxlRm9yZWdyb3VuZERpc3BhdGNoKGFjdGl2aXR5LmdldENvbXBvbmVudE5hbWUoKSwgaW50ZW50LCBmaWx0ZXJzKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGF0dGVtcHREZWFkU2VydmljZVJlY292ZXJ5KGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRGlzYWJsZXMgZm9yZWdyb3VuZCBhY3Rpdml0eSBkaXNwYXRjaGluZyBzZXR1cCB3aXRoCisgICAgICoge0BsaW5rICNlbmFibGVGb3JlZ3JvdW5kRGlzcGF0Y2h9LgorICAgICAqCisgICAgICogPHA+VGhpcyBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgdGhlIEFjdGl2aXR5IHJldHVybnMgZnJvbQorICAgICAqIGl0J3MgPGNvZGU+b25QYXVzZSgpPC9jb2RlPiBvciB0aGlzIG1ldGhvZCB3aWxsIHRocm93IGFuIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbi4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgbWV0aG9kIG11c3QgYmUgY2FsbGVkIGZyb20gdGhlIG1haW4gdGhyZWFkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGRpc2FibGVGb3JlZ3JvdW5kRGlzcGF0Y2goQWN0aXZpdHkgYWN0aXZpdHkpIHsKKyAgICAgICAgQWN0aXZpdHlUaHJlYWQuY3VycmVudEFjdGl2aXR5VGhyZWFkKCkudW5yZWdpc3Rlck9uQWN0aXZpdHlQYXVzZWRMaXN0ZW5lcihhY3Rpdml0eSwKKyAgICAgICAgICAgICAgICBtRm9yZWdyb3VuZERpc3BhdGNoTGlzdGVuZXIpOworICAgICAgICBkaXNhYmxlRm9yZWdyb3VuZERpc3BhdGNoSW50ZXJuYWwoYWN0aXZpdHksIGZhbHNlKTsKKyAgICB9CisKKyAgICBPbkFjdGl2aXR5UGF1c2VkTGlzdGVuZXIgbUZvcmVncm91bmREaXNwYXRjaExpc3RlbmVyID0gbmV3IE9uQWN0aXZpdHlQYXVzZWRMaXN0ZW5lcigpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uUGF1c2VkKEFjdGl2aXR5IGFjdGl2aXR5KSB7CisgICAgICAgICAgICBkaXNhYmxlRm9yZWdyb3VuZERpc3BhdGNoSW50ZXJuYWwoYWN0aXZpdHksIHRydWUpOworICAgICAgICB9CisgICAgfTsKKworICAgIHZvaWQgZGlzYWJsZUZvcmVncm91bmREaXNwYXRjaEludGVybmFsKEFjdGl2aXR5IGFjdGl2aXR5LCBib29sZWFuIGZvcmNlKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzU2VydmljZS5kaXNhYmxlRm9yZWdyb3VuZERpc3BhdGNoKGFjdGl2aXR5LmdldENvbXBvbmVudE5hbWUoKSk7CisgICAgICAgICAgICBpZiAoIWZvcmNlICYmICFhY3Rpdml0eS5pc1Jlc3VtZWQoKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIllvdSBtdXN0IGRpc2FibGUgZm9yZ2Vncm91bmQgZGlzcGF0Y2hpbmcgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAid2hpbGUgeW91ciBhY3Rpdml0eSBpcyBzdGlsbCByZXN1bWVkIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBhdHRlbXB0RGVhZFNlcnZpY2VSZWNvdmVyeShlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEVuYWJsZSBOREVGIG1lc3NhZ2VzIHB1c2ggd2hpbGUgdGhpcyBBY3Rpdml0eSBpcyBpbiB0aGUgZm9yZWdyb3VuZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBlbmFibGVGb3JlZ3JvdW5kTmRlZlB1c2goQWN0aXZpdHkgYWN0aXZpdHksIE5kZWZNZXNzYWdlIG1zZykgeworICAgICAgICBpZiAoYWN0aXZpdHkgPT0gbnVsbCB8fCBtc2cgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFhY3Rpdml0eS5pc1Jlc3VtZWQoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiRm9yZWdvcnVuZCBOREVGIHB1c2ggY2FuIG9ubHkgYmUgZW5hYmxlZCAiICsKKyAgICAgICAgICAgICAgICAgICAgIndoZW4geW91ciBhY3Rpdml0eSBpcyByZXN1bWVkIik7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEFjdGl2aXR5VGhyZWFkLmN1cnJlbnRBY3Rpdml0eVRocmVhZCgpLnJlZ2lzdGVyT25BY3Rpdml0eVBhdXNlZExpc3RlbmVyKGFjdGl2aXR5LAorICAgICAgICAgICAgICAgICAgICBtRm9yZWdyb3VuZE5kZWZQdXNoTGlzdGVuZXIpOworICAgICAgICAgICAgc1NlcnZpY2UuZW5hYmxlRm9yZWdyb3VuZE5kZWZQdXNoKGFjdGl2aXR5LmdldENvbXBvbmVudE5hbWUoKSwgbXNnKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGF0dGVtcHREZWFkU2VydmljZVJlY292ZXJ5KGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRGlzYWJsZXMgZm9yZWdyb3VuZCBOREVGIHB1c2ggc2V0dXAgd2l0aAorICAgICAqIHtAbGluayAjZW5hYmxlRm9yZWdyb3VuZE5kZWZQdXNofS4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIHRoZSBBY3Rpdml0eSByZXR1cm5zIGZyb20KKyAgICAgKiBpdCdzIDxjb2RlPm9uUGF1c2UoKTwvY29kZT4gb3IgdGhpcyBtZXRob2Qgd2lsbCB0aHJvdyBhbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24uCisgICAgICoKKyAgICAgKiA8cD5UaGlzIG1ldGhvZCBtdXN0IGJlIGNhbGxlZCBmcm9tIHRoZSBtYWluIHRocmVhZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBkaXNhYmxlRm9yZWdyb3VuZE5kZWZQdXNoKEFjdGl2aXR5IGFjdGl2aXR5KSB7CisgICAgICAgIEFjdGl2aXR5VGhyZWFkLmN1cnJlbnRBY3Rpdml0eVRocmVhZCgpLnVucmVnaXN0ZXJPbkFjdGl2aXR5UGF1c2VkTGlzdGVuZXIoYWN0aXZpdHksCisgICAgICAgICAgICAgICAgbUZvcmVncm91bmROZGVmUHVzaExpc3RlbmVyKTsKKyAgICAgICAgZGlzYWJsZUZvcmVncm91bmROZGVmUHVzaEludGVybmFsKGFjdGl2aXR5LCBmYWxzZSk7CisgICAgfQorCisgICAgT25BY3Rpdml0eVBhdXNlZExpc3RlbmVyIG1Gb3JlZ3JvdW5kTmRlZlB1c2hMaXN0ZW5lciA9IG5ldyBPbkFjdGl2aXR5UGF1c2VkTGlzdGVuZXIoKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblBhdXNlZChBY3Rpdml0eSBhY3Rpdml0eSkgeworICAgICAgICAgICAgZGlzYWJsZUZvcmVncm91bmROZGVmUHVzaEludGVybmFsKGFjdGl2aXR5LCB0cnVlKTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICB2b2lkIGRpc2FibGVGb3JlZ3JvdW5kTmRlZlB1c2hJbnRlcm5hbChBY3Rpdml0eSBhY3Rpdml0eSwgYm9vbGVhbiBmb3JjZSkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgc1NlcnZpY2UuZGlzYWJsZUZvcmVncm91bmROZGVmUHVzaChhY3Rpdml0eS5nZXRDb21wb25lbnROYW1lKCkpOworICAgICAgICAgICAgaWYgKCFmb3JjZSAmJiAhYWN0aXZpdHkuaXNSZXN1bWVkKCkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJZb3UgbXVzdCBkaXNhYmxlIGZvcmdlZ3JvdW5kIE5ERUYgcHVzaCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICJ3aGlsZSB5b3VyIGFjdGl2aXR5IGlzIHN0aWxsIHJlc3VtZWQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGF0dGVtcHREZWFkU2VydmljZVJlY292ZXJ5KGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCiAgICAgICogU2V0IHRoZSBOREVGIE1lc3NhZ2UgdGhhdCB0aGlzIE5GQyBhZGFwdGVyIHNob3VsZCBhcHBlYXIgYXMgdG8gVGFnCiAgICAgICogcmVhZGVycy4KICAgICAgKiA8cD4KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL25mYy9OZmNTZWN1cmVFbGVtZW50LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9uZmMvTmZjU2VjdXJlRWxlbWVudC5qYXZhCmluZGV4IDVmNGMwNjYuLmVhMjg0NmUgMTAwNzU1Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL25mYy9OZmNTZWN1cmVFbGVtZW50LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvbmZjL05mY1NlY3VyZUVsZW1lbnQuamF2YQpAQCAtMTYsNyArMTYsNyBAQAogCiBwYWNrYWdlIGFuZHJvaWQubmZjOwogCi1pbXBvcnQgYW5kcm9pZC5uZmMudGVjaG5vbG9neS5UYWdUZWNobm9sb2d5OworaW1wb3J0IGFuZHJvaWQubmZjLnRlY2guVGFnVGVjaG5vbG9neTsKIGltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9uZmMvVGFnLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9uZmMvVGFnLmphdmEKaW5kZXggNzQwNDk1MC4uNTVhOTU1NiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvbmZjL1RhZy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL25mYy9UYWcuamF2YQpAQCAtMTYsMzYgKzE2LDI2IEBACiAKIHBhY2thZ2UgYW5kcm9pZC5uZmM7CiAKLWltcG9ydCBhbmRyb2lkLm5mYy50ZWNobm9sb2d5Lklzb0RlcDsKLWltcG9ydCBhbmRyb2lkLm5mYy50ZWNobm9sb2d5Lk1pZmFyZUNsYXNzaWM7Ci1pbXBvcnQgYW5kcm9pZC5uZmMudGVjaG5vbG9neS5NaWZhcmVVbHRyYWxpZ2h0OwotaW1wb3J0IGFuZHJvaWQubmZjLnRlY2hub2xvZ3kuTmZjVjsKLWltcG9ydCBhbmRyb2lkLm5mYy50ZWNobm9sb2d5Lk5kZWY7Ci1pbXBvcnQgYW5kcm9pZC5uZmMudGVjaG5vbG9neS5OZGVmRm9ybWF0YWJsZTsKLWltcG9ydCBhbmRyb2lkLm5mYy50ZWNobm9sb2d5Lk5mY0E7Ci1pbXBvcnQgYW5kcm9pZC5uZmMudGVjaG5vbG9neS5OZmNCOwotaW1wb3J0IGFuZHJvaWQubmZjLnRlY2hub2xvZ3kuTmZjRjsKLWltcG9ydCBhbmRyb2lkLm5mYy50ZWNobm9sb2d5LlRhZ1RlY2hub2xvZ3k7CitpbXBvcnQgYW5kcm9pZC5uZmMudGVjaC5UYWdUZWNobm9sb2d5OwogaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwogaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsOwogaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsYWJsZTsKLWltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKIAogaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CiAKIC8qKgogICogUmVwcmVzZW50cyBhIChnZW5lcmljKSBkaXNjb3ZlcmVkIHRhZy4KICAqIDxwPgotICogQSB0YWcgaXMgYSBwYXNzaXZlIE5GQyBlbGVtZW50LCBzdWNoIGFzIE5GQyBGb3J1bSBUYWcncywgTWlmYXJlIGNsYXNzIFRhZ3MsCi0gKiBTb255IEZlbGljYSBUYWdzLgorICogQSB0YWcgaXMgYSBwYXNzaXZlIE5GQyBlbGVtZW50LCBzdWNoIGFzIE5GQyBGb3J1bSBUYWcncywgTUlGQVJFIGNsYXNzIFRhZ3MsCisgKiBTb255IEZlbGlDYSBUYWdzLCBldGMuCiAgKiA8cD4KICAqIFRhZydzIGhhdmUgYSB0eXBlIGFuZCB1c3VhbGx5IGhhdmUgYSBVSUQuCiAgKiA8cD4KICAqIHtAbGluayBUYWd9IG9iamVjdHMgYXJlIHBhc3NlZCB0byBhcHBsaWNhdGlvbnMgdmlhIHRoZSB7QGxpbmsgTmZjQWRhcHRlciNFWFRSQV9UQUd9IGV4dHJhCiAgKiBpbiB7QGxpbmsgTmZjQWRhcHRlciNBQ1RJT05fVEFHX0RJU0NPVkVSRUR9IGludGVudHMuIEEge0BsaW5rIFRhZ30gb2JqZWN0IGlzIGltbXV0YWJsZQogICogYW5kIHJlcHJlc2VudHMgdGhlIHN0YXRlIG9mIHRoZSB0YWcgYXQgdGhlIHRpbWUgb2YgZGlzY292ZXJ5LiBJdCBjYW4gYmUKLSAqIGRpcmVjdGx5IHF1ZXJpZWQgZm9yIGl0cyBVSUQgYW5kIFR5cGUsIG9yIHVzZWQgdG8gY3JlYXRlIGEge0BsaW5rIFRhZ1RlY2hub2xvZ3l9Ci0gKiAod2l0aCB7QGxpbmsgVGFnI2dldFRlY2hub2xvZ3koaW50KX0pLgorICogZGlyZWN0bHkgcXVlcmllZCBmb3IgaXRzIFVJRCBhbmQgVHlwZSwgb3IgdXNlZCB0byBjcmVhdGUgYSB7QGxpbmsgVGFnVGVjaG5vbG9neX0gdXNpbmcgdGhlCisgKiBzdGF0aWMgPGNvZGU+Z2V0KCk8L2NvZGU+IG1ldGhvZHMgb24gdGhlIHZhcmlvcyB0ZWNoIGNsYXNzZXMuCiAgKiA8cD4KICAqIEEge0BsaW5rIFRhZ30gY2FuICBiZSB1c2VkIHRvIGNyZWF0ZSBhIHtAbGluayBUYWdUZWNobm9sb2d5fSBvbmx5IHdoaWxlIHRoZSB0YWcgaXMgaW4KICAqIHJhbmdlLiBJZiBpdCBpcyByZW1vdmVkIGFuZCB0aGVuIHJldHVybmVkIHRvIHJhbmdlLCB0aGVuIHRoZSBtb3N0IHJlY2VudApAQCAtNTUsMTMgKzQ1LDEzIEBACiAgKiB0aW1lIGFuZCBjYWxscyBvbiB0aGlzIGNsYXNzIHdpbGwgcmV0cmlldmUgdGhvc2UgcmVhZC1vbmx5IHByb3BlcnRpZXMsIGFuZAogICogbm90IGNhdXNlIGFueSBmdXJ0aGVyIFJGIGFjdGl2aXR5IG9yIGJsb2NrLiBOb3RlIGhvd2V2ZXIgdGhhdCBhcnJheXMgcGFzc2VkIHRvIGFuZAogICogcmV0dXJuZWQgYnkgdGhpcyBjbGFzcyBhcmUgKm5vdCogY2xvbmVkLCBzbyBiZSBjYXJlZnVsIG5vdCB0byBtb2RpZnkgdGhlbS4KLSAqIEBoaWRlCiAgKi8KIHB1YmxpYyBjbGFzcyBUYWcgaW1wbGVtZW50cyBQYXJjZWxhYmxlIHsKICAgICAvKnBhY2thZ2UqLyBmaW5hbCBieXRlW10gbUlkOwogICAgIC8qcGFja2FnZSovIGZpbmFsIGludFtdIG1UZWNoTGlzdDsKICAgICAvKnBhY2thZ2UqLyBmaW5hbCBCdW5kbGVbXSBtVGVjaEV4dHJhczsKICAgICAvKnBhY2thZ2UqLyBmaW5hbCBpbnQgbVNlcnZpY2VIYW5kbGU7ICAvLyBmb3IgdXNlIGJ5IE5GQyBzZXJ2aWNlLCAwIGluZGljYXRlcyBhIG1vY2sKKyAgICAvKnBhY2thZ2UqLyBmaW5hbCBJTmZjVGFnIG1UYWdTZXJ2aWNlOwogCiAgICAgLypwYWNrYWdlKi8gaW50IG1Db25uZWN0ZWRUZWNobm9sb2d5OwogCkBAIC02OSw3ICs1OSw4IEBACiAgICAgICogSGlkZGVuIGNvbnN0cnVjdG9yIHRvIGJlIHVzZWQgYnkgTkZDIHNlcnZpY2UgYW5kIGludGVybmFsIGNsYXNzZXMuCiAgICAgICogQGhpZGUKICAgICAgKi8KLSAgICBwdWJsaWMgVGFnKGJ5dGVbXSBpZCwgaW50W10gdGVjaExpc3QsIEJ1bmRsZVtdIHRlY2hMaXN0RXh0cmFzLCBpbnQgc2VydmljZUhhbmRsZSkgeworICAgIHB1YmxpYyBUYWcoYnl0ZVtdIGlkLCBpbnRbXSB0ZWNoTGlzdCwgQnVuZGxlW10gdGVjaExpc3RFeHRyYXMsIGludCBzZXJ2aWNlSGFuZGxlLAorICAgICAgICAgICAgSU5mY1RhZyB0YWdTZXJ2aWNlKSB7CiAgICAgICAgIGlmICh0ZWNoTGlzdCA9PSBudWxsKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJyYXdUYXJnZXRzIGNhbm5vdCBiZSBudWxsIik7CiAgICAgICAgIH0KQEAgLTc4LDE1ICs2OSwxNSBAQAogICAgICAgICAvLyBFbnN1cmUgbVRlY2hFeHRyYXMgaXMgYXMgbG9uZyBhcyBtVGVjaExpc3QKICAgICAgICAgbVRlY2hFeHRyYXMgPSBBcnJheXMuY29weU9mKHRlY2hMaXN0RXh0cmFzLCB0ZWNoTGlzdC5sZW5ndGgpOwogICAgICAgICBtU2VydmljZUhhbmRsZSA9IHNlcnZpY2VIYW5kbGU7CisgICAgICAgIG1UYWdTZXJ2aWNlID0gdGFnU2VydmljZTsKIAogICAgICAgICBtQ29ubmVjdGVkVGVjaG5vbG9neSA9IC0xOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIENvbnN0cnVjdCBhIG1vY2sgVGFnLgotICAgICAqIDxwPlRoaXMgaXMgYW4gYXBwbGljYXRpb24gY29uc3RydWN0ZWQgdGFnLCBzbyBOZmNBZGFwdGVyIG1ldGhvZHMgb24gdGhpcwotICAgICAqIFRhZyBzdWNoIGFzIHtAbGluayAjZ2V0VGVjaG5vbG9neX0gbWF5IGZhaWwgd2l0aAotICAgICAqIHtAbGluayBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb259IHNpbmNlIGl0IGRvZXMgbm90IHJlcHJlc2VudCBhIHBoeXNpY2FsIFRhZy4KKyAgICAgKiA8cD5UaGlzIGlzIGFuIGFwcGxpY2F0aW9uIGNvbnN0cnVjdGVkIHRhZywgc28gTmZjQWRhcHRlciBtZXRob2RzIG9uIHRoaXMgVGFnIG1heSBmYWlsCisgICAgICogd2l0aCB7QGxpbmsgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9ufSBzaW5jZSBpdCBkb2VzIG5vdCByZXByZXNlbnQgYSBwaHlzaWNhbCBUYWcuCiAgICAgICogPHA+VGhpcyBjb25zdHJ1Y3RvciBtaWdodCBiZSB1c2VmdWwgZm9yIG1vY2sgdGVzdGluZy4KICAgICAgKiBAcGFyYW0gaWQgVGhlIHRhZyBpZGVudGlmaWVyLCBjYW4gYmUgbnVsbAogICAgICAqIEBwYXJhbSB0ZWNoTGlzdCBtdXN0IG5vdCBiZSBudWxsCkBAIC05NCw3ICs4NSw3IEBACiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBUYWcgY3JlYXRlTW9ja1RhZyhieXRlW10gaWQsIGludFtdIHRlY2hMaXN0LCBCdW5kbGVbXSB0ZWNoTGlzdEV4dHJhcykgewogICAgICAgICAvLyBzZXQgc2VydmljZUhhbmRsZSB0byAwIHRvIGluZGljYXRlIG1vY2sgdGFnCi0gICAgICAgIHJldHVybiBuZXcgVGFnKGlkLCB0ZWNoTGlzdCwgdGVjaExpc3RFeHRyYXMsIDApOworICAgICAgICByZXR1cm4gbmV3IFRhZyhpZCwgdGVjaExpc3QsIHRlY2hMaXN0RXh0cmFzLCAwLCBudWxsKTsKICAgICB9CiAKICAgICAvKioKQEAgLTEyOCwxMCArMTE5LDE2IEBACiAgICAgICAgIHJldHVybiBBcnJheXMuY29weU9mKG1UZWNoTGlzdCwgbVRlY2hMaXN0Lmxlbmd0aCk7CiAgICAgfQogCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdGVjaG5vbG9neSwgb3IgbnVsbCBpZiBub3QgcHJlc2VudAotICAgICAqLwotICAgIHB1YmxpYyBUYWdUZWNobm9sb2d5IGdldFRlY2hub2xvZ3koTmZjQWRhcHRlciBhZGFwdGVyLCBpbnQgdGVjaCkgeworICAgIC8qKiBAaGlkZSAqLworICAgIHB1YmxpYyBib29sZWFuIGhhc1RlY2goaW50IHRlY2hUeXBlKSB7CisgICAgICAgIGZvciAoaW50IHRlY2ggOiBtVGVjaExpc3QpIHsKKyAgICAgICAgICAgIGlmICh0ZWNoID09IHRlY2hUeXBlKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIAorICAgIC8qKiBAaGlkZSAqLworICAgIHB1YmxpYyBCdW5kbGUgZ2V0VGVjaEV4dHJhcyhpbnQgdGVjaCkgewogICAgICAgICBpbnQgcG9zID0gLTE7CiAgICAgICAgIGZvciAoaW50IGlkeCA9IDA7IGlkeCA8IG1UZWNoTGlzdC5sZW5ndGg7IGlkeCsrKSB7CiAgICAgICAgICAgaWYgKG1UZWNoTGlzdFtpZHhdID09IHRlY2gpIHsKQEAgLTE0Myw0NCArMTQwLDEyIEBACiAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgfQogCi0gICAgICAgIEJ1bmRsZSBleHRyYXMgPSBtVGVjaEV4dHJhc1twb3NdOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgc3dpdGNoICh0ZWNoKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBUYWdUZWNobm9sb2d5Lk5GQ19BOiB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTmZjQShhZGFwdGVyLCB0aGlzLCBleHRyYXMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXNlIFRhZ1RlY2hub2xvZ3kuTkZDX0I6IHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBOZmNCKGFkYXB0ZXIsIHRoaXMsIGV4dHJhcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhc2UgVGFnVGVjaG5vbG9neS5JU09fREVQOiB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSXNvRGVwKGFkYXB0ZXIsIHRoaXMsIGV4dHJhcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhc2UgVGFnVGVjaG5vbG9neS5ORkNfVjogewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE5mY1YoYWRhcHRlciwgdGhpcywgZXh0cmFzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2FzZSBUYWdUZWNobm9sb2d5Lk5ERUY6IHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBOZGVmKGFkYXB0ZXIsIHRoaXMsIHRlY2gsIGV4dHJhcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhc2UgVGFnVGVjaG5vbG9neS5OREVGX0ZPUk1BVEFCTEU6IHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBOZGVmRm9ybWF0YWJsZShhZGFwdGVyLCB0aGlzLCB0ZWNoLCBleHRyYXMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXNlIFRhZ1RlY2hub2xvZ3kuTkZDX0Y6IHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBOZmNGKGFkYXB0ZXIsIHRoaXMsIGV4dHJhcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhc2UgVGFnVGVjaG5vbG9neS5NSUZBUkVfQ0xBU1NJQzogewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE1pZmFyZUNsYXNzaWMoYWRhcHRlciwgdGhpcywgZXh0cmFzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2FzZSBUYWdUZWNobm9sb2d5Lk1JRkFSRV9VTFRSQUxJR0hUOiB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTWlmYXJlVWx0cmFsaWdodChhZGFwdGVyLCB0aGlzLCBleHRyYXMpOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1UZWNoRXh0cmFzW3Bvc107CisgICAgfQogCi0gICAgICAgICAgICAgICAgZGVmYXVsdDogewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIlRlY2ggIiArIHRlY2ggKyAiIG5vdCBzdXBwb3J0ZWQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQorICAgIC8qKiBAaGlkZSAqLworICAgIHB1YmxpYyBJTmZjVGFnIGdldFRhZ1NlcnZpY2UoKSB7CisgICAgICAgIHJldHVybiBtVGFnU2VydmljZTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTIyNyw2ICsxOTIsNyBAQAogICAgICAgICBkZXN0LndyaXRlSW50QXJyYXkobVRlY2hMaXN0KTsKICAgICAgICAgZGVzdC53cml0ZVR5cGVkQXJyYXkobVRlY2hFeHRyYXMsIDApOwogICAgICAgICBkZXN0LndyaXRlSW50KG1TZXJ2aWNlSGFuZGxlKTsKKyAgICAgICAgZGVzdC53cml0ZVN0cm9uZ0JpbmRlcihtVGFnU2VydmljZS5hc0JpbmRlcigpKTsKICAgICB9CiAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFBhcmNlbGFibGUuQ3JlYXRvcjxUYWc+IENSRUFUT1IgPQpAQCAtMjM5LDggKzIwNSw5IEBACiAgICAgICAgICAgICBpbi5yZWFkSW50QXJyYXkodGVjaExpc3QpOwogICAgICAgICAgICAgQnVuZGxlW10gdGVjaEV4dHJhcyA9IGluLmNyZWF0ZVR5cGVkQXJyYXkoQnVuZGxlLkNSRUFUT1IpOwogICAgICAgICAgICAgaW50IHNlcnZpY2VIYW5kbGUgPSBpbi5yZWFkSW50KCk7CisgICAgICAgICAgICBJTmZjVGFnIHRhZ1NlcnZpY2UgPSBJTmZjVGFnLlN0dWIuYXNJbnRlcmZhY2UoaW4ucmVhZFN0cm9uZ0JpbmRlcigpKTsKIAotICAgICAgICAgICAgcmV0dXJuIG5ldyBUYWcoaWQsIHRlY2hMaXN0LCB0ZWNoRXh0cmFzLCBzZXJ2aWNlSGFuZGxlKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgVGFnKGlkLCB0ZWNoTGlzdCwgdGVjaEV4dHJhcywgc2VydmljZUhhbmRsZSwgdGFnU2VydmljZSk7CiAgICAgICAgIH0KIAogICAgICAgICBAT3ZlcnJpZGUKQEAgLTI0OSw3ICsyMTYsOSBAQAogICAgICAgICB9CiAgICAgfTsKIAotICAgIC8qCisgICAgLyoqCisgICAgICogRm9yIGludGVybmFsIHVzZSBvbmx5LgorICAgICAqCiAgICAgICogQGhpZGUKICAgICAgKi8KICAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0Q29ubmVjdGVkVGVjaG5vbG9neShpbnQgdGVjaG5vbG9neSkgewpAQCAtMjYwLDE0ICsyMjksMTggQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIC8qCisgICAgLyoqCisgICAgICogRm9yIGludGVybmFsIHVzZSBvbmx5LgorICAgICAqCiAgICAgICogQGhpZGUKICAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldENvbm5lY3RlZFRlY2hub2xvZ3koKSB7CiAgICAgICAgIHJldHVybiBtQ29ubmVjdGVkVGVjaG5vbG9neTsKICAgICB9CiAKLSAgICAvKgorICAgIC8qKgorICAgICAqIEZvciBpbnRlcm5hbCB1c2Ugb25seS4KKyAgICAgKgogICAgICAqIEBoaWRlCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0VGVjaG5vbG9neURpc2Nvbm5lY3RlZCgpIHsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL25mYy9UYWdMb3N0RXhjZXB0aW9uLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9uZmMvVGFnTG9zdEV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5ODFkN2MKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9uZmMvVGFnTG9zdEV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubmZjOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworcHVibGljIGNsYXNzIFRhZ0xvc3RFeGNlcHRpb24gZXh0ZW5kcyBJT0V4Y2VwdGlvbiB7CisgICAgcHVibGljIFRhZ0xvc3RFeGNlcHRpb24oKSB7CisgICAgICAgIHN1cGVyKCk7CisgICAgfQorCisgICAgcHVibGljIFRhZ0xvc3RFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICAgICAgc3VwZXIobWVzc2FnZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvbmZjL1RyYW5zY2VpdmVSZXN1bHQuYWlkbCBiL2NvcmUvamF2YS9hbmRyb2lkL25mYy9UcmFuc2NlaXZlUmVzdWx0LmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOThmOTJlZQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL25mYy9UcmFuc2NlaXZlUmVzdWx0LmFpZGwKQEAgLTAsMCArMSwxOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5uZmM7CisKK3BhcmNlbGFibGUgVHJhbnNjZWl2ZVJlc3VsdDsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL25mYy9UcmFuc2NlaXZlUmVzdWx0LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9uZmMvVHJhbnNjZWl2ZVJlc3VsdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2MjQ0YjgKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9uZmMvVHJhbnNjZWl2ZVJlc3VsdC5qYXZhCkBAIC0wLDAgKzEsOTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubmZjOworCitpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWw7CitpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxhYmxlOworCisvKioKKyAqIENsYXNzIHVzZWQgdG8gcGlwZSB0cmFuc2NlaXZlIHJlc3VsdCBmcm9tIHRoZSBORkMgc2VydmljZS4KKyAqCisgKiBAaGlkZQorICovCitwdWJsaWMgZmluYWwgY2xhc3MgVHJhbnNjZWl2ZVJlc3VsdCBpbXBsZW1lbnRzIFBhcmNlbGFibGUgeworICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBtVGFnTG9zdDsKKyAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gbVN1Y2Nlc3M7CisgICAgcHJpdmF0ZSBmaW5hbCBieXRlW10gbVJlc3BvbnNlRGF0YTsKKworICAgIHB1YmxpYyBUcmFuc2NlaXZlUmVzdWx0KGZpbmFsIGJvb2xlYW4gc3VjY2VzcywgZmluYWwgYm9vbGVhbiB0YWdJc0xvc3QsCisgICAgICAgICAgICBmaW5hbCBieXRlW10gZGF0YSkgeworICAgICAgICBtU3VjY2VzcyA9IHN1Y2Nlc3M7CisgICAgICAgIG1UYWdMb3N0ID0gdGFnSXNMb3N0OworICAgICAgICBtUmVzcG9uc2VEYXRhID0gZGF0YTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1N1Y2Nlc3NmdWwoKSB7CisgICAgICAgIHJldHVybiBtU3VjY2VzczsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1RhZ0xvc3QoKSB7CisgICAgICAgIHJldHVybiBtVGFnTG9zdDsKKyAgICB9CisKKyAgICBwdWJsaWMgYnl0ZVtdIGdldFJlc3BvbnNlRGF0YSgpIHsKKyAgICAgICAgcmV0dXJuIG1SZXNwb25zZURhdGE7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBkZXNjcmliZUNvbnRlbnRzKCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB3cml0ZVRvUGFyY2VsKFBhcmNlbCBkZXN0LCBpbnQgZmxhZ3MpIHsKKyAgICAgICAgZGVzdC53cml0ZUludChtU3VjY2VzcyA/IDEgOiAwKTsKKyAgICAgICAgZGVzdC53cml0ZUludChtVGFnTG9zdCA/IDEgOiAwKTsKKyAgICAgICAgaWYgKG1TdWNjZXNzKSB7CisgICAgICAgICAgICBkZXN0LndyaXRlSW50KG1SZXNwb25zZURhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgIGRlc3Qud3JpdGVCeXRlQXJyYXkobVJlc3BvbnNlRGF0YSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFBhcmNlbGFibGUuQ3JlYXRvcjxUcmFuc2NlaXZlUmVzdWx0PiBDUkVBVE9SID0KKyAgICAgICAgICAgIG5ldyBQYXJjZWxhYmxlLkNyZWF0b3I8VHJhbnNjZWl2ZVJlc3VsdD4oKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgVHJhbnNjZWl2ZVJlc3VsdCBjcmVhdGVGcm9tUGFyY2VsKFBhcmNlbCBpbikgeworICAgICAgICAgICAgYm9vbGVhbiBzdWNjZXNzID0gKGluLnJlYWRJbnQoKSA9PSAxKSA/IHRydWUgOiBmYWxzZTsKKyAgICAgICAgICAgIGJvb2xlYW4gdGFnTG9zdCA9IChpbi5yZWFkSW50KCkgPT0gMSkgPyB0cnVlIDogZmFsc2U7CisgICAgICAgICAgICBieXRlW10gcmVzcG9uc2VEYXRhOworCisgICAgICAgICAgICBpZiAoc3VjY2VzcykgeworICAgICAgICAgICAgICAgIGludCByZXNwb25zZUxlbmd0aCA9IGluLnJlYWRJbnQoKTsKKyAgICAgICAgICAgICAgICByZXNwb25zZURhdGEgPSBuZXcgYnl0ZVtyZXNwb25zZUxlbmd0aF07CisgICAgICAgICAgICAgICAgaW4ucmVhZEJ5dGVBcnJheShyZXNwb25zZURhdGEpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXNwb25zZURhdGEgPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG5ldyBUcmFuc2NlaXZlUmVzdWx0KHN1Y2Nlc3MsIHRhZ0xvc3QsIHJlc3BvbnNlRGF0YSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFRyYW5zY2VpdmVSZXN1bHRbXSBuZXdBcnJheShpbnQgc2l6ZSkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBUcmFuc2NlaXZlUmVzdWx0W3NpemVdOworICAgICAgICB9CisgICAgfTsKKworfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvbmZjL3RlY2gvQmFzaWNUYWdUZWNobm9sb2d5LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9uZmMvdGVjaC9CYXNpY1RhZ1RlY2hub2xvZ3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTA5NjMxCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvbmZjL3RlY2gvQmFzaWNUYWdUZWNobm9sb2d5LmphdmEKQEAgLTAsMCArMSwxODEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubmZjLnRlY2g7CisKK2ltcG9ydCBhbmRyb2lkLm5mYy5FcnJvckNvZGVzOworaW1wb3J0IGFuZHJvaWQubmZjLlRhZzsKK2ltcG9ydCBhbmRyb2lkLm5mYy5UYWdMb3N0RXhjZXB0aW9uOworaW1wb3J0IGFuZHJvaWQubmZjLlRyYW5zY2VpdmVSZXN1bHQ7CitpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKKy8qKgorICogQSBiYXNlIGNsYXNzIGZvciB0YWcgdGVjaG5vbG9naWVzIHRoYXQgYXJlIGJ1aWx0IG9uIHRvcCBvZiB0cmFuc2NlaXZlKCkuCisgKi8KKy8qIHBhY2thZ2UgKi8gYWJzdHJhY3QgY2xhc3MgQmFzaWNUYWdUZWNobm9sb2d5IGltcGxlbWVudHMgVGFnVGVjaG5vbG9neSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJORkMiOworCisgICAgLypwYWNrYWdlKi8gZmluYWwgVGFnIG1UYWc7CisgICAgLypwYWNrYWdlKi8gYm9vbGVhbiBtSXNDb25uZWN0ZWQ7CisgICAgLypwYWNrYWdlKi8gaW50IG1TZWxlY3RlZFRlY2hub2xvZ3k7CisKKyAgICBCYXNpY1RhZ1RlY2hub2xvZ3koVGFnIHRhZywgaW50IHRlY2gpIHRocm93cyBSZW1vdGVFeGNlcHRpb24geworICAgICAgICBpbnRbXSB0ZWNoTGlzdCA9IHRhZy5nZXRUZWNobm9sb2d5TGlzdCgpOworICAgICAgICBpbnQgaTsKKworICAgICAgICAvLyBDaGVjayB0YXJnZXQgdmFsaWRpdHkKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHRlY2hMaXN0Lmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAodGVjaCA9PSB0ZWNoTGlzdFtpXSkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChpID49IHRlY2hMaXN0Lmxlbmd0aCkgeworICAgICAgICAgICAgLy8gVGVjaG5vbG9neSBub3QgZm91bmQKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRlY2hub2xvZ3kgIiArIHRlY2ggKyAiIG5vdCBwcmVzZW50IG9uIHRhZyAiICsgdGFnKTsKKyAgICAgICAgfQorCisgICAgICAgIG1UYWcgPSB0YWc7CisgICAgICAgIG1TZWxlY3RlZFRlY2hub2xvZ3kgPSB0ZWNoOworICAgIH0KKworICAgIEJhc2ljVGFnVGVjaG5vbG9neShUYWcgdGFnKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKKyAgICAgICAgdGhpcyh0YWcsIHRhZy5nZXRUZWNobm9sb2d5TGlzdCgpWzBdKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgVGFnIGdldFRhZygpIHsKKyAgICAgICAgcmV0dXJuIG1UYWc7CisgICAgfQorCisgICAgLyoqIEludGVybmFsIGhlbHBlciB0byB0aHJvdyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhlIHRlY2hub2xvZ3kgaXNuJ3QgY29ubmVjdGVkICovCisgICAgdm9pZCBjaGVja0Nvbm5lY3RlZCgpIHsKKyAgICAgICBpZiAoKG1UYWcuZ2V0Q29ubmVjdGVkVGVjaG5vbG9neSgpICE9IGdldFRlY2hub2xvZ3lJZCgpKSB8fAorICAgICAgICAgICAgICAgKG1UYWcuZ2V0Q29ubmVjdGVkVGVjaG5vbG9neSgpID09IC0xKSkgeworICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJDYWxsIGNvbm5lY3QoKSBmaXJzdCEiKTsKKyAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBnZXRUZWNobm9sb2d5SWQoKSB7CisgICAgICAgIHJldHVybiBtU2VsZWN0ZWRUZWNobm9sb2d5OworICAgIH0KKworICAgIC8qKgorICAgICAqIEhlbHBlciB0byBpbmRpY2F0ZSBpZiB7QGxpbmsgI2Nvbm5lY3R9IGhhcyBzdWNjZWVkZWQuCisgICAgICogPHA+CisgICAgICogRG9lcyBub3QgY2F1c2UgUkYgYWN0aXZpdHksIGFuZCBkb2VzIG5vdCBibG9jay4KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYge0BsaW5rICNjb25uZWN0fSBoYXMgY29tcGxldGVkIHN1Y2Nlc3NmdWxseSBhbmQgdGhlIHtAbGluayBUYWd9IGlzIGJlbGlldmVkCisgICAgICogdG8gYmUgd2l0aGluIHJhbmdlLiBBcHBsaWNhdGlvbnMgbXVzdCBzdGlsbCBoYW5kbGUge0BsaW5rIGphdmEuaW8uSU9FeGNlcHRpb259CisgICAgICogd2hpbGUgdXNpbmcgbWV0aG9kcyB0aGF0IHJlcXVpcmUgYSBjb25uZWN0aW9uIGluIGNhc2UgdGhlIGNvbm5lY3Rpb24gaXMgbG9zdCBhZnRlciB0aGlzCisgICAgICogbWV0aG9kIHJldHVybnMuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNDb25uZWN0ZWQoKSB7CisgICAgICAgIGlmICghbUlzQ29ubmVjdGVkKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIG1UYWcuZ2V0VGFnU2VydmljZSgpLmlzUHJlc2VudChtVGFnLmdldFNlcnZpY2VIYW5kbGUoKSk7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJORkMgc2VydmljZSBkZWFkIiwgZSk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBjb25uZWN0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBlcnJvckNvZGUgPSBtVGFnLmdldFRhZ1NlcnZpY2UoKS5jb25uZWN0KG1UYWcuZ2V0U2VydmljZUhhbmRsZSgpLCBnZXRUZWNobm9sb2d5SWQoKSk7CisKKyAgICAgICAgICAgIGlmIChlcnJvckNvZGUgPT0gRXJyb3JDb2Rlcy5TVUNDRVNTKSB7CisgICAgICAgICAgICAgICAgLy8gU3RvcmUgdGhpcyBpbiB0aGUgdGFnIG9iamVjdAorICAgICAgICAgICAgICAgIG1UYWcuc2V0Q29ubmVjdGVkVGVjaG5vbG9neShnZXRUZWNobm9sb2d5SWQoKSk7CisgICAgICAgICAgICAgICAgbUlzQ29ubmVjdGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJORkMgc2VydmljZSBkZWFkIiwgZSk7CisgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIk5GQyBzZXJ2aWNlIGRpZWQiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHJlY29ubmVjdCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmICghbUlzQ29ubmVjdGVkKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJUZWNobm9sb2d5IG5vdCBjb25uZWN0ZWQgeWV0Iik7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IGVycm9yQ29kZSA9IG1UYWcuZ2V0VGFnU2VydmljZSgpLnJlY29ubmVjdChtVGFnLmdldFNlcnZpY2VIYW5kbGUoKSk7CisKKyAgICAgICAgICAgIGlmIChlcnJvckNvZGUgIT0gRXJyb3JDb2Rlcy5TVUNDRVNTKSB7CisgICAgICAgICAgICAgICAgbUlzQ29ubmVjdGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgbVRhZy5zZXRUZWNobm9sb2d5RGlzY29ubmVjdGVkKCk7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBtSXNDb25uZWN0ZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIG1UYWcuc2V0VGVjaG5vbG9neURpc2Nvbm5lY3RlZCgpOworICAgICAgICAgICAgTG9nLmUoVEFHLCAiTkZDIHNlcnZpY2UgZGVhZCIsIGUpOworICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJORkMgc2VydmljZSBkaWVkIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8qIE5vdGUgdGhhdCB3ZSBkb24ndCB3YW50IHRvIHBoeXNpY2FsbHkgZGlzY29ubmVjdCB0aGUgdGFnLAorICAgICAgICAgICAgICogYnV0IGp1c3QgcmVjb25uZWN0IHRvIGl0IHRvIHJlc2V0IGl0cyBzdGF0ZQorICAgICAgICAgICAgICovCisgICAgICAgICAgICBtVGFnLmdldFRhZ1NlcnZpY2UoKS5yZWNvbm5lY3QobVRhZy5nZXRTZXJ2aWNlSGFuZGxlKCkpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiTkZDIHNlcnZpY2UgZGVhZCIsIGUpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgbUlzQ29ubmVjdGVkID0gZmFsc2U7CisgICAgICAgICAgICBtVGFnLnNldFRlY2hub2xvZ3lEaXNjb25uZWN0ZWQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKiBJbnRlcm5hbCB0cmFuc2NlaXZlICovCisgICAgLypwYWNrYWdlKi8gYnl0ZVtdIHRyYW5zY2VpdmUoYnl0ZVtdIGRhdGEsIGJvb2xlYW4gcmF3KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBjaGVja0Nvbm5lY3RlZCgpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBUcmFuc2NlaXZlUmVzdWx0IHJlc3VsdCA9IG1UYWcuZ2V0VGFnU2VydmljZSgpLnRyYW5zY2VpdmUobVRhZy5nZXRTZXJ2aWNlSGFuZGxlKCksIGRhdGEsIHJhdyk7CisgICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oInRyYW5zY2VpdmUgZmFpbGVkIik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuaXNTdWNjZXNzZnVsKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5nZXRSZXNwb25zZURhdGEoKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0LmlzVGFnTG9zdCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVGFnTG9zdEV4Y2VwdGlvbigiVGFnIHdhcyBsb3N0LiIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJ0cmFuc2NlaXZlIGZhaWxlZCIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiTkZDIHNlcnZpY2UgZGVhZCIsIGUpOworICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJORkMgc2VydmljZSBkaWVkIik7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9uZmMvdGVjaC9Jc29EZXAuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL25mYy90ZWNoL0lzb0RlcC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2ZDE0MWEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9uZmMvdGVjaC9Jc29EZXAuamF2YQpAQCAtMCwwICsxLDEzMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5uZmMudGVjaDsKKworaW1wb3J0IGFuZHJvaWQubmZjLlRhZzsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworLyoqCisgKiBBIGxvdy1sZXZlbCBjb25uZWN0aW9uIHRvIGEge0BsaW5rIFRhZ30gdXNpbmcgdGhlIElTTy1ERVAgdGVjaG5vbG9neSwgYWxzbyBrbm93biBhcworICogSVNPMTQ0My00LgorICoKKyAqIDxwPllvdSBjYW4gYWNxdWlyZSB0aGlzIGtpbmQgb2YgY29ubmVjdGlvbiB3aXRoIHtAbGluayAjZ2V0fS4KKyAqIFVzZSB0aGlzIGNsYXNzIHRvIHNlbmQgYW5kIHJlY2VpdmUgZGF0YSB3aXRoIHtAbGluayAjdHJhbnNjZWl2ZSB0cmFuc2NlaXZlKCl9LgorICoKKyAqIDxwPkFwcGxpY2F0aW9ucyBtdXN0IGltcGxlbWVudCB0aGVpciBvd24gcHJvdG9jb2wgc3RhY2sgb24gdG9wIG9mCisgKiB7QGxpbmsgI3RyYW5zY2VpdmUgdHJhbnNjZWl2ZSgpfS4KKyAqCisgKiA8cCBjbGFzcz0ibm90ZSI+PHN0cm9uZz5Ob3RlOjwvc3Ryb25nPgorICogVXNlIG9mIHRoaXMgY2xhc3MgcmVxdWlyZXMgdGhlIHtAbGluayBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24jTkZDfQorICogcGVybWlzc2lvbi4KKyAqLworcHVibGljIGZpbmFsIGNsYXNzIElzb0RlcCBleHRlbmRzIEJhc2ljVGFnVGVjaG5vbG9neSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJORkMiOworCisgICAgLyoqIEBoaWRlICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfSElfTEFZRVJfUkVTUCA9ICJoaXJlc3AiOworICAgIC8qKiBAaGlkZSAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX0hJU1RfQllURVMgPSAiaGlzdGJ5dGVzIjsKKworICAgIHByaXZhdGUgYnl0ZVtdIG1IaUxheWVyUmVzcG9uc2UgPSBudWxsOworICAgIHByaXZhdGUgYnl0ZVtdIG1IaXN0Qnl0ZXMgPSBudWxsOworCisgICAgLyoqCisgICAgICogUmV0dXJucyBhbiBpbnN0YW5jZSBvZiB0aGlzIHRlY2ggZm9yIHRoZSBnaXZlbiB0YWcuIElmIHRoZSB0YWcgZG9lc24ndCBzdXBwb3J0CisgICAgICogdGhpcyB0ZWNoIHR5cGUgbnVsbCBpcyByZXR1cm5lZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0YWcgVGhlIHRhZyB0byBnZXQgdGhlIHRlY2ggZnJvbQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgSXNvRGVwIGdldChUYWcgdGFnKSB7CisgICAgICAgIGlmICghdGFnLmhhc1RlY2goVGFnVGVjaG5vbG9neS5JU09fREVQKSkgcmV0dXJuIG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IElzb0RlcCh0YWcpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgLyoqIEBoaWRlICovCisgICAgcHVibGljIElzb0RlcChUYWcgdGFnKQorICAgICAgICAgICAgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyKHRhZywgVGFnVGVjaG5vbG9neS5JU09fREVQKTsKKyAgICAgICAgQnVuZGxlIGV4dHJhcyA9IHRhZy5nZXRUZWNoRXh0cmFzKFRhZ1RlY2hub2xvZ3kuSVNPX0RFUCk7CisgICAgICAgIGlmIChleHRyYXMgIT0gbnVsbCkgeworICAgICAgICAgICAgbUhpTGF5ZXJSZXNwb25zZSA9IGV4dHJhcy5nZXRCeXRlQXJyYXkoRVhUUkFfSElfTEFZRVJfUkVTUCk7CisgICAgICAgICAgICBtSGlzdEJ5dGVzID0gZXh0cmFzLmdldEJ5dGVBcnJheShFWFRSQV9ISVNUX0JZVEVTKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHRpbWVvdXQgb2YgYW4gSXNvRGVwIHRyYW5zY2VpdmUgdHJhbnNhY3Rpb24gaW4gbWlsbGlzZWNvbmRzLgorICAgICAqIElmIHRoZSB0cmFuc2FjdGlvbiBoYXMgbm90IGNvbXBsZXRlZCBiZWZvcmUgdGhlIHRpbWVvdXQsCisgICAgICogYW55IG9uZ29pbmcge0BsaW5rICN0cmFuc2NlaXZlfSBvcGVyYXRpb24gd2lsbCBiZQorICAgICAqIGFib3J0ZWQgYW5kIHRoZSBjb25uZWN0aW9uIHRvIHRoZSB0YWcgaXMgbG9zdC4gVGhpcyBzZXR0aW5nIGlzIGFwcGxpZWQKKyAgICAgKiBvbmx5IHRvIHRoZSB7QGxpbmsgVGFnfSBvYmplY3QgbGlua2VkIHRvIHRoaXMgdGVjaG5vbG9neSBhbmQgd2lsbCBiZQorICAgICAqIHJlc2V0IHdoZW4ge0BsaW5rIElzb0RlcCNjbG9zZX0gaXMgY2FsbGVkLgorICAgICAqIFRoZSBkZWZhdWx0IHRyYW5zYWN0aW9uIHRpbWVvdXQgaXMgMzAwIG1pbGxpc2Vjb25kcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRUaW1lb3V0KGludCB0aW1lb3V0KSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtVGFnLmdldFRhZ1NlcnZpY2UoKS5zZXRJc29EZXBUaW1lb3V0KHRpbWVvdXQpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiTkZDIHNlcnZpY2UgZGVhZCIsIGUpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgY2xvc2UoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtVGFnLmdldFRhZ1NlcnZpY2UoKS5yZXNldElzb0RlcFRpbWVvdXQoKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIk5GQyBzZXJ2aWNlIGRlYWQiLCBlKTsKKyAgICAgICAgfQorICAgICAgICBzdXBlci5jbG9zZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgaGlzdG9yaWNhbCBieXRlcyBpZiB0aGUgdGFnIGlzIHVzaW5nIHtAbGluayBOZmNBfSwgbnVsbCBvdGhlcndpc2UuCisgICAgICovCisgICAgcHVibGljIGJ5dGVbXSBnZXRIaXN0b3JpY2FsQnl0ZXMoKSB7CisgICAgICAgIHJldHVybiBtSGlzdEJ5dGVzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgaGkgbGF5ZXIgcmVzcG9uc2UgYnl0ZXMgaWYgdGhlIHRhZyBpcyB1c2luZyB7QGxpbmsgTmZjQn0sIG51bGwgb3RoZXJ3aXNlLgorICAgICAqLworICAgIHB1YmxpYyBieXRlW10gZ2V0SGlMYXllclJlc3BvbnNlKCkgeworICAgICAgICByZXR1cm4gbUhpTGF5ZXJSZXNwb25zZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZW5kIGRhdGEgdG8gYSB0YWcgYW5kIHJlY2VpdmUgdGhlIHJlc3BvbnNlLgorICAgICAqIDxwPgorICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgYmxvY2sgdW50aWwgdGhlIHJlc3BvbnNlIGlzIHJlY2VpdmVkLiBJdCBjYW4gYmUgY2FuY2VsZWQKKyAgICAgKiB3aXRoIHtAbGluayAjY2xvc2V9LgorICAgICAqIDxwPlJlcXVpcmVzIHtAbGluayBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24jTkZDfSBwZXJtaXNzaW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGRhdGEgYnl0ZXMgdG8gc2VuZAorICAgICAqIEByZXR1cm4gYnl0ZXMgcmVjZWl2ZWQgaW4gcmVzcG9uc2UKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIHRoZSB0YXJnZXQgaXMgbG9zdCBvciBjb25uZWN0aW9uIGNsb3NlZAorICAgICAqLworICAgIHB1YmxpYyBieXRlW10gdHJhbnNjZWl2ZShieXRlW10gZGF0YSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIHRyYW5zY2VpdmUoZGF0YSwgdHJ1ZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvbmZjL3RlY2hub2xvZ3kvTWlmYXJlQ2xhc3NpYy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvbmZjL3RlY2gvTWlmYXJlQ2xhc3NpYy5qYXZhCnNpbWlsYXJpdHkgaW5kZXggNzElCnJlbmFtZSBmcm9tIGNvcmUvamF2YS9hbmRyb2lkL25mYy90ZWNobm9sb2d5L01pZmFyZUNsYXNzaWMuamF2YQpyZW5hbWUgdG8gY29yZS9qYXZhL2FuZHJvaWQvbmZjL3RlY2gvTWlmYXJlQ2xhc3NpYy5qYXZhCmluZGV4IDc5OWYwYTc4Li4xYzUyMzIyIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9uZmMvdGVjaG5vbG9neS9NaWZhcmVDbGFzc2ljLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvbmZjL3RlY2gvTWlmYXJlQ2xhc3NpYy5qYXZhCkBAIC0xNCw3OCArMTQsOTkgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLXBhY2thZ2UgYW5kcm9pZC5uZmMudGVjaG5vbG9neTsKK3BhY2thZ2UgYW5kcm9pZC5uZmMudGVjaDsKIAotaW1wb3J0IGFuZHJvaWQubmZjLk5mY0FkYXB0ZXI7CiBpbXBvcnQgYW5kcm9pZC5uZmMuVGFnOwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQubmZjLlRhZ0xvc3RFeGNlcHRpb247CiBpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogCiAvKioKLSAqIENvbmNyZXRlIGNsYXNzIGZvciBUYWdUZWNobm9sb2d5Lk1JRkFSRV9DTEFTU0lDCisgKiBUZWNobm9sb2d5IGNsYXNzIHJlcHJlc2VudGluZyBNSUZBUkUgQ2xhc3NpYyB0YWdzIChhbHNvIGtub3duIGFzIE1JRkFSRSBTdGFuZGFyZCkuCiAgKgotICogTWlmYXJlIGNsYXNzaWMgaGFzIG4gc2VjdG9ycywgd2l0aCB2YXJ5aW5nIHNpemVzLCBhbHRob3VnaAotICogdGhleSBhcmUgYXQgbGVhc3QgdGhlIHNhbWUgcGF0dGVybiBmb3IgYW55IG9uZSBtaWZhcmUgY2xhc3NpYwotICogcHJvZHVjdC4gRWFjaCBzZWN0b3IgaGFzIHR3byBrZXlzLiBBdXRoZW50aWNhdGlvbiB3aXRoIHRoZSBjb3JyZWN0Ci0gKiBrZXkgaXMgbmVlZGVkIGJlZm9yZSBhY2Nlc3MgdG8gYW55IHNlY3Rvci4KKyAqIDxwPlN1cHBvcnQgZm9yIHRoaXMgdGVjaG5vbG9neSB0eXBlIGlzIG9wdGlvbmFsLiBJZiB0aGUgTkZDIHN0YWNrIGRvZXNuJ3Qgc3VwcG9ydCB0aGlzIHRlY2hub2xvZ3kKKyAqIE1JRkFSRSBDbGFzc2ljIHRhZ3Mgd2lsbCBzdGlsbCBiZSBzY2FubmVkLCBidXQgd2lsbCBvbmx5IHNob3cgdGhlIE5mY0EgdGVjaG5vbG9neS4KICAqCi0gKiBFYWNoIHNlY3RvciBoYXMgayBibG9ja3MuCi0gKiBCbG9jayBzaXplIGlzIGNvbnN0YW50IGFjcm9zcyB0aGUgd2hvbGUgbWlmYXJlIGNsYXNzaWMgZmFtaWx5LgorICogPHA+TUlGQVJFIENsYXNzaWMgdGFncyBoYXZlIHNlY3RvcnMgdGhhdCBlYWNoIGNvbnRhaW4gYmxvY2tzLiBUaGUgYmxvY2sgc2l6ZSBpcyBjb25zdGFudCBhdAorICogMTYgYnl0ZXMsIGJ1dCB0aGUgbnVtYmVyIG9mIHNlY3RvcnMgYW5kIHRoZSBzZWN0b3Igc2l6ZSB2YXJpZXMgYnkgcHJvZHVjdC4gTUlGQVJFIGhhcyBlbmNyeXB0aW9uCisgKiBidWlsdCBpbiBhbmQgZWFjaCBzZWN0b3IgaGFzIHR3byBrZXlzIGFzc29jaWF0ZWQgd2l0aCBpdCwgYXMgd2VsbCBhcyBBQ0xzIHRvIGRldGVybWluZSB3aGF0CisgKiBsZXZlbCBhY2VzcyBlYWNoIGtleSBncmFudHMuIEJlZm9yZSBvcGVyYXRpbmcgb24gYSBzZWN0b3IgeW91IG11c3QgY2FsbCBlaXRoZXIKKyAqIHtAbGluayAjYXV0aGVudGljYXRlU2VjdG9yKGludCwgYnl0ZVtdLCBib29sZWFuKX0gb3IKKyAqIHtAbGluayAjYXV0aGVudGljYXRlQmxvY2soaW50LCBieXRlW10sIGJvb2xlYW4pfSB0byBnYWluIGF1dGhvcml6ZSB5b3VyIHJlcXVlc3QuCiAgKi8KIHB1YmxpYyBmaW5hbCBjbGFzcyBNaWZhcmVDbGFzc2ljIGV4dGVuZHMgQmFzaWNUYWdUZWNobm9sb2d5IHsKICAgICAvKioKLSAgICAgKiBUaGUgd2VsbC1rbm93biwgZGVmYXVsdCBNSUZBUkUgcmVhZCBrZXkuCi0gICAgICogVXNlIHRoaXMga2V5IHRvIGVmZmVjdGl2ZWx5IG1ha2UgdGhlIHBheWxvYWQgaW4gdGhpcyBzZWN0b3IKLSAgICAgKiBwdWJsaWMuCisgICAgICogVGhlIHdlbGwta25vd24gZGVmYXVsdCBNSUZBUkUgcmVhZCBrZXkuIEFsbCBrZXlzIGFyZSBzZXQgdG8gdGhpcyBhdCB0aGUgZmFjdG9yeS4KKyAgICAgKiBVc2luZyB0aGlzIGtleSB3aWxsIGVmZmVjdGl2ZWx5IG1ha2UgdGhlIHBheWxvYWQgaW4gdGhlIHNlY3RvciBwdWJsaWMuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBieXRlW10gS0VZX0RFRkFVTFQgPQogICAgICAgICAgICAgeyhieXRlKTB4RkYsKGJ5dGUpMHhGRiwoYnl0ZSkweEZGLChieXRlKTB4RkYsKGJ5dGUpMHhGRiwoYnl0ZSkweEZGfTsKICAgICAvKioKLSAgICAgKiBUaGUgd2VsbC1rbm93biwgZGVmYXVsdCBNaWZhcmUgQXBwbGljYXRpb24gRGlyZWN0b3J5IHJlYWQga2V5LgorICAgICAqIFRoZSB3ZWxsLWtub3duLCBkZWZhdWx0IE1JRkFSRSBBcHBsaWNhdGlvbiBEaXJlY3RvcnkgcmVhZCBrZXkuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBieXRlW10gS0VZX01JRkFSRV9BUFBMSUNBVElPTl9ESVJFQ1RPUlkgPQogICAgICAgICAgICAgeyhieXRlKTB4QTAsKGJ5dGUpMHhBMSwoYnl0ZSkweEEyLChieXRlKTB4QTMsKGJ5dGUpMHhBNCwoYnl0ZSkweEE1fTsKICAgICAvKioKLSAgICAgKiBUaGUgd2VsbC1rbm93biwgZGVmYXVsdCByZWFkIGtleSBmb3IgTkRFRiBkYXRhIG9uIGEgTWlmYXJlIENsYXNzaWMKKyAgICAgKiBUaGUgd2VsbC1rbm93biwgZGVmYXVsdCByZWFkIGtleSBmb3IgTkRFRiBkYXRhIG9uIGEgTUlGQVJFIENsYXNzaWMKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGVbXSBLRVlfTkZDX0ZPUlVNID0KICAgICAgICAgICAgIHsoYnl0ZSkweEQzLChieXRlKTB4RjcsKGJ5dGUpMHhEMywoYnl0ZSkweEY3LChieXRlKTB4RDMsKGJ5dGUpMHhGN307CiAKKyAgICAvKiogQSBNSUZBUkUgQ2xhc3NpYyB0YWcgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX0NMQVNTSUMgPSAwOworICAgIC8qKiBBIE1JRkFSRSBQbHVzIHRhZyAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfUExVUyA9IDE7CisgICAgLyoqIEEgTUlGQVJFIFBybyB0YWcgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX1BSTyA9IDI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9ERVNGSVJFID0gMzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX1VMVFJBTElHSFQgPSA0OworICAgIC8qKiBUaGUgdGFnIHR5cGUgaXMgdW5rbm93biAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfVU5LTk9XTiA9IDU7CiAKKyAgICAvKiogVGhlIHRhZyBjb250YWlucyAxNiBzZWN0b3JzLCBlYWNoIGhvbGRpbmcgNCBibG9ja3MuICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0laRV8xSyA9IDEwMjQ7CisgICAgLyoqIFRoZSB0YWcgY29udGFpbnMgMzIgc2VjdG9ycywgZWFjaCBob2xkaW5nIDQgYmxvY2tzLiAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNJWkVfMksgPSAyMDQ4OworICAgIC8qKgorICAgICAqIFRoZSB0YWcgY29udGFpbnMgNDAgc2VjdG9ycy4gVGhlIGZpcnN0IDMyIHNlY3RvcnMgY29udGFpbiA0IGJsb2NrcyBhbmQgdGhlIGxhc3QgOCBzZWN0b3JzCisgICAgICogY29udGFpbiAxNiBibG9ja3MuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0laRV80SyA9IDQwOTY7CisgICAgLyoqIFRoZSB0YWcgY29udGFpbnMgNSBzZWN0b3JzLCBlYWNoIGhvbGRpbmcgNCBibG9ja3MuICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0laRV9NSU5JID0gMzIwOworICAgIC8qKiBUaGUgY2FwYWNpdHkgaXMgdW5rbm93biAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNJWkVfVU5LTk9XTiA9IDA7CiAKICAgICBwcml2YXRlIGJvb2xlYW4gbUlzRW11bGF0ZWQ7CiAgICAgcHJpdmF0ZSBpbnQgbVR5cGU7CiAgICAgcHJpdmF0ZSBpbnQgbVNpemU7CiAKLSAgICBwdWJsaWMgTWlmYXJlQ2xhc3NpYyhOZmNBZGFwdGVyIGFkYXB0ZXIsIFRhZyB0YWcsIEJ1bmRsZSBleHRyYXMpIHRocm93cyBSZW1vdGVFeGNlcHRpb24gewotICAgICAgICBzdXBlcihhZGFwdGVyLCB0YWcsIFRhZ1RlY2hub2xvZ3kuTUlGQVJFX0NMQVNTSUMpOworICAgIC8qKgorICAgICAqIFJldHVybnMgYW4gaW5zdGFuY2Ugb2YgdGhpcyB0ZWNoIGZvciB0aGUgZ2l2ZW4gdGFnLiBJZiB0aGUgdGFnIGRvZXNuJ3Qgc3VwcG9ydAorICAgICAqIHRoaXMgdGVjaCB0eXBlIG51bGwgaXMgcmV0dXJuZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGFnIFRoZSB0YWcgdG8gZ2V0IHRoZSB0ZWNoIGZyb20KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE1pZmFyZUNsYXNzaWMgZ2V0KFRhZyB0YWcpIHsKKyAgICAgICAgaWYgKCF0YWcuaGFzVGVjaChUYWdUZWNobm9sb2d5Lk1JRkFSRV9DTEFTU0lDKSkgcmV0dXJuIG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IE1pZmFyZUNsYXNzaWModGFnKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQogCi0gICAgICAgIC8vIENoZWNrIGlmIHRoaXMgY291bGQgYWN0dWFsbHkgYmUgYSBNaWZhcmUKLSAgICAgICAgTmZjQSBhID0gKE5mY0EpIHRhZy5nZXRUZWNobm9sb2d5KGFkYXB0ZXIsIFRhZ1RlY2hub2xvZ3kuTkZDX0EpOwotICAgICAgICAvL3Nob3J0W10gQVRRQSA9IGdldEFUUUEodGFnKTsKKyAgICAvKiogQGhpZGUgKi8KKyAgICBwdWJsaWMgTWlmYXJlQ2xhc3NpYyhUYWcgdGFnKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIodGFnLCBUYWdUZWNobm9sb2d5Lk1JRkFSRV9DTEFTU0lDKTsKKworICAgICAgICAvLyBDaGVjayBpZiB0aGlzIGNvdWxkIGFjdHVhbGx5IGJlIGEgTUlGQVJFIENsYXNzaWMKKyAgICAgICAgTmZjQSBhID0gTmZjQS5nZXQodGFnKTsKIAogICAgICAgICBtSXNFbXVsYXRlZCA9IGZhbHNlOwogICAgICAgICBtVHlwZSA9IFRZUEVfVU5LTk9XTjsKICAgICAgICAgbVNpemUgPSBTSVpFX1VOS05PV047CiAKICAgICAgICAgc3dpdGNoIChhLmdldFNhaygpKSB7Ci0gICAgICAgICAgICBjYXNlIDB4MDA6Ci0gICAgICAgICAgICAgICAgLy8gY291bGQgYmUgVUwgb3IgVUwtQwotICAgICAgICAgICAgICAgIG1UeXBlID0gVFlQRV9VTFRSQUxJR0hUOwotICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSAweDA4OgogICAgICAgICAgICAgICAgIC8vIFR5cGUgPT0gY2xhc3NpYwogICAgICAgICAgICAgICAgIC8vIFNpemUgPSAxSwpAQCAtMTIyLDcgKzE0Myw3IEBACiAgICAgICAgICAgICAgICAgLy8gVE9ETyB0aGlzIHJlYWxseSBzaG91bGQgYmUgYSBzaG9ydCwgbm90IGJ5dGUKICAgICAgICAgICAgICAgICBpZiAoYS5nZXRBdHFhKClbMF0gPT0gMHgwMykgewogICAgICAgICAgICAgICAgICAgICAvLyBUeXBlID09IERFU0ZJUkUKLSAgICAgICAgICAgICAgICAgICAgbVR5cGUgPSBUWVBFX0RFU0ZJUkU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIFR5cGUgPT0gTUYrCiAgICAgICAgICAgICAgICAgICAgIC8vIFNMID0gU0wzCkBAIC0xNjAsMjcgKzE4MSwyNSBAQAogICAgICAgICAgICAgICAgIG1UeXBlID0gVFlQRV9QUk87CiAgICAgICAgICAgICAgICAgbVNpemUgPSBTSVpFXzRLOwogICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAvLyBVbmtub3duIG1pZmFyZQotICAgICAgICAgICAgICAgIG1UeXBlID0gVFlQRV9VTktOT1dOOwotICAgICAgICAgICAgICAgIG1TaXplID0gU0laRV9VTktOT1dOOwotICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgfQogCi0gICAgLy8gSW1tdXRhYmxlIGRhdGEga25vd24gYXQgZGlzY292ZXJ5IHRpbWUKKyAgICAvKiogUmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgdGFnLCBkZXRlcm1pbmVkIGF0IGRpc2NvdmVyeSB0aW1lICovCiAgICAgcHVibGljIGludCBnZXRTaXplKCkgewogICAgICAgICByZXR1cm4gbVNpemU7CiAgICAgfQogCisgICAgLyoqIFJldHVybnMgdGhlIHNpemUgb2YgdGhlIHRhZywgZGV0ZXJtaW5lZCBhdCBkaXNjb3ZlcnkgdGltZSAqLwogICAgIHB1YmxpYyBpbnQgZ2V0VHlwZSgpIHsKICAgICAgICAgcmV0dXJuIG1UeXBlOwogICAgIH0KIAorICAgIC8qKiBSZXR1cm5zIHRydWUgaWYgdGhlIHRhZyBpcyBlbXVsYXRlZCwgZGV0ZXJtaW5lZCBhdCBkaXNjb3ZlcnkgdGltZSAqLwogICAgIHB1YmxpYyBib29sZWFuIGlzRW11bGF0ZWQoKSB7CiAgICAgICAgIHJldHVybiBtSXNFbXVsYXRlZDsKICAgICB9CiAKKyAgICAvKiogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHNlY3RvcnMgb24gdGhpcyB0YWcsIGRldGVybWluZWQgYXQgZGlzY292ZXJ5IHRpbWUgKi8KICAgICBwdWJsaWMgaW50IGdldFNlY3RvckNvdW50KCkgewogICAgICAgICBzd2l0Y2ggKG1TaXplKSB7CiAgICAgICAgICAgICBjYXNlIFNJWkVfMUs6IHsKQEAgLTIwMSwxMCArMjIwLDEyIEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICAvKiogUmV0dXJucyB0aGUgc2VjdG9yIHNpemUsIGRldGVybWluZWQgYXQgZGlzY292ZXJ5IHRpbWUgKi8KICAgICBwdWJsaWMgaW50IGdldFNlY3RvclNpemUoaW50IHNlY3RvcikgewogICAgICAgICByZXR1cm4gZ2V0QmxvY2tDb3VudChzZWN0b3IpICogMTY7CiAgICAgfQogCisgICAgLyoqIFJldHVybnMgdGhlIHRvdGFsIGJsb2NrIGNvdW50LCBkZXRlcm1pbmVkIGF0IGRpc2NvdmVyeSB0aW1lICovCiAgICAgcHVibGljIGludCBnZXRUb3RhbEJsb2NrQ291bnQoKSB7CiAgICAgICAgIGludCB0b3RhbEJsb2NrcyA9IDA7CiAgICAgICAgIGZvciAoaW50IHNlYyA9IDA7IHNlYyA8IGdldFNlY3RvckNvdW50KCk7IHNlYysrKSB7CkBAIC0yMTQsNiArMjM1LDcgQEAKICAgICAgICAgcmV0dXJuIHRvdGFsQmxvY2tzOwogICAgIH0KIAorICAgIC8qKiBSZXR1cm5zIHRoZSBibG9jayBjb3VudCBmb3IgdGhlIGdpdmVuIHNlY3RvciwgZGV0ZXJtaW5lZCBhdCBkaXNjb3ZlcnkgdGltZSAqLwogICAgIHB1YmxpYyBpbnQgZ2V0QmxvY2tDb3VudChpbnQgc2VjdG9yKSB7CiAgICAgICAgIGlmIChzZWN0b3IgPj0gZ2V0U2VjdG9yQ291bnQoKSkgewogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidGhpcyBjYXJkIG9ubHkgaGFzICIgKyBnZXRTZWN0b3JDb3VudCgpICsKQEAgLTIzNywxMCArMjU5LDEwIEBACiAKICAgICAvLyBNZXRob2RzIHRoYXQgcmVxdWlyZSBjb25uZWN0KCkKICAgICAvKioKLSAgICAgKiBBdXRoZW50aWNhdGUgZm9yIGEgZ2l2ZW4gYmxvY2suCi0gICAgICogTm90ZSB0aGF0IHRoaXMgd2lsbCBhdXRoZW50aWNhdGUgdGhlIGVudGlyZSBzZWN0b3IgdGhlIGJsb2NrIGJlbG9uZ3MgdG8uCisgICAgICogQXV0aGVudGljYXRlIHRoZSBlbnRpcmUgc2VjdG9yIHRoYXQgdGhlIGdpdmVuIGJsb2NrIHJlc2lkZXMgaW4uCisgICAgICogPHA+VGhpcyByZXF1aXJlcyBhIHRoYXQgdGhlIHRhZyBiZSBjb25uZWN0ZWQuCiAgICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gYXV0aGVudGljYXRlQmxvY2soaW50IGJsb2NrLCBieXRlW10ga2V5LCBib29sZWFuIGtleUEpIHsKKyAgICBwdWJsaWMgYm9vbGVhbiBhdXRoZW50aWNhdGVCbG9jayhpbnQgYmxvY2ssIGJ5dGVbXSBrZXksIGJvb2xlYW4ga2V5QSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgY2hlY2tDb25uZWN0ZWQoKTsKIAogICAgICAgICBieXRlW10gY21kID0gbmV3IGJ5dGVbMTJdOwpAQCAtMjYzLDkgKzI4NSwxMSBAQAogICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGtleSwgMCwgY21kLCA2LCA2KTsKIAogICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKCh0cmFuc2NlaXZlKGNtZCkgIT0gbnVsbCkpIHsKKyAgICAgICAgICAgIGlmICgodHJhbnNjZWl2ZShjbWQsIGZhbHNlKSAhPSBudWxsKSkgewogICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChUYWdMb3N0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IGU7CiAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIC8vIE5vIG5lZWQgdG8gZGVhbCB3aXRoLCB3aWxsIHJldHVybiBmYWxzZSBhbnl3YXkKICAgICAgICAgfQpAQCAtMjc0LDggKzI5OCw5IEBACiAKICAgICAvKioKICAgICAgKiBBdXRoZW50aWNhdGUgZm9yIGEgZ2l2ZW4gc2VjdG9yLgorICAgICAqIDxwPlRoaXMgcmVxdWlyZXMgYSB0aGF0IHRoZSB0YWcgYmUgY29ubmVjdGVkLgogICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGF1dGhlbnRpY2F0ZVNlY3RvcihpbnQgc2VjdG9yLCBieXRlW10ga2V5LCBib29sZWFuIGtleUEpIHsKKyAgICBwdWJsaWMgYm9vbGVhbiBhdXRoZW50aWNhdGVTZWN0b3IoaW50IHNlY3RvciwgYnl0ZVtdIGtleSwgYm9vbGVhbiBrZXlBKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBjaGVja0Nvbm5lY3RlZCgpOwogCiAgICAgICAgIGJ5dGUgYWRkciA9IChieXRlKSAoKGZpcnN0QmxvY2tJblNlY3RvcihzZWN0b3IpKSAmIDB4ZmYpOwpAQCAtMjg4LDYgKzMxMyw3IEBACiAgICAgLyoqCiAgICAgICogU2VjdG9yIGluZGV4aW5nIHN0YXJ0cyBhdCAwLgogICAgICAqIEJsb2NrIGluZGV4aW5nIHN0YXJ0cyBhdCAwLCBhbmQgcmVzZXRzIGluIGVhY2ggc2VjdG9yLgorICAgICAqIDxwPlRoaXMgcmVxdWlyZXMgYSB0aGF0IHRoZSB0YWcgYmUgY29ubmVjdGVkLgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KICAgICAgKi8KICAgICBwdWJsaWMgYnl0ZVtdIHJlYWRCbG9jayhpbnQgc2VjdG9yLCBpbnQgYmxvY2spIHRocm93cyBJT0V4Y2VwdGlvbiB7CkBAIC0yOTUsMTEgKzMyMSwxMSBAQAogCiAgICAgICAgIGJ5dGUgYWRkciA9IChieXRlKSAoKGZpcnN0QmxvY2tJblNlY3RvcihzZWN0b3IpICsgYmxvY2spICYgMHhmZik7CiAgICAgICAgIHJldHVybiByZWFkQmxvY2soYWRkcik7Ci0KICAgICB9CiAKICAgICAvKioKICAgICAgKiBSZWFkcyBhYnNvbHV0ZSBibG9jayBpbmRleC4KKyAgICAgKiA8cD5UaGlzIHJlcXVpcmVzIGEgdGhhdCB0aGUgdGFnIGJlIGNvbm5lY3RlZC4KICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgICovCiAgICAgcHVibGljIGJ5dGVbXSByZWFkQmxvY2soaW50IGJsb2NrKSB0aHJvd3MgSU9FeGNlcHRpb24gewpAQCAtMzA4LDExICszMzQsMTIgQEAKICAgICAgICAgYnl0ZSBhZGRyID0gKGJ5dGUpIGJsb2NrOwogICAgICAgICBieXRlW10gYmxvY2tyZWFkX2NtZCA9IHsgMHgzMCwgYWRkciB9OwogCi0gICAgICAgIHJldHVybiB0cmFuc2NlaXZlKGJsb2NrcmVhZF9jbWQpOworICAgICAgICByZXR1cm4gdHJhbnNjZWl2ZShibG9ja3JlYWRfY21kLCBmYWxzZSk7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogV3JpdGVzIGFic29sdXRlIGJsb2NrIGluZGV4LgorICAgICAqIDxwPlRoaXMgcmVxdWlyZXMgYSB0aGF0IHRoZSB0YWcgYmUgY29ubmVjdGVkLgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCB3cml0ZUJsb2NrKGludCBibG9jaywgYnl0ZVtdIGRhdGEpIHRocm93cyBJT0V4Y2VwdGlvbiB7CkBAIC0zMjQsMTEgKzM1MSwxMiBAQAogICAgICAgICBibG9ja3dyaXRlX2NtZFsxXSA9IGFkZHI7CiAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoZGF0YSwgMCwgYmxvY2t3cml0ZV9jbWQsIDIsIGRhdGEubGVuZ3RoKTsKIAotICAgICAgICB0cmFuc2NlaXZlKGJsb2Nrd3JpdGVfY21kKTsKKyAgICAgICAgdHJhbnNjZWl2ZShibG9ja3dyaXRlX2NtZCwgZmFsc2UpOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIFdyaXRlcyByZWxhdGl2ZSBibG9jayBpbiBzZWN0b3IuCisgICAgICogPHA+VGhpcyByZXF1aXJlcyBhIHRoYXQgdGhlIHRhZyBiZSBjb25uZWN0ZWQuCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHdyaXRlQmxvY2soaW50IHNlY3RvciwgaW50IGJsb2NrLCBieXRlW10gZGF0YSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKQEAgLTM0Miw2MyArMzcwLDQ4IEBACiAgICAgcHVibGljIHZvaWQgaW5jcmVtZW50KGludCBibG9jaykgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgY2hlY2tDb25uZWN0ZWQoKTsKIAotICAgICAgICBieXRlIGFkZHIgPSAoYnl0ZSkgYmxvY2s7CiAgICAgICAgIGJ5dGVbXSBpbmNyX2NtZCA9IHsgKGJ5dGUpIDB4QzEsIChieXRlKSBibG9jayB9OwogCi0gICAgICAgIHRyYW5zY2VpdmUoaW5jcl9jbWQpOworICAgICAgICB0cmFuc2NlaXZlKGluY3JfY21kLCBmYWxzZSk7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgZGVjcmVtZW50KGludCBibG9jaykgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgY2hlY2tDb25uZWN0ZWQoKTsKIAotICAgICAgICBieXRlIGFkZHIgPSAoYnl0ZSkgYmxvY2s7CiAgICAgICAgIGJ5dGVbXSBkZWNyX2NtZCA9IHsgKGJ5dGUpIDB4QzAsIChieXRlKSBibG9jayB9OwogCi0gICAgICAgIHRyYW5zY2VpdmUoZGVjcl9jbWQpOworICAgICAgICB0cmFuc2NlaXZlKGRlY3JfY21kLCBmYWxzZSk7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgdHJhbnNmZXIoaW50IGJsb2NrKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBjaGVja0Nvbm5lY3RlZCgpOwogCi0gICAgICAgIGJ5dGUgYWRkciA9IChieXRlKSBibG9jazsKICAgICAgICAgYnl0ZVtdIHRyYW5zX2NtZCA9IHsgKGJ5dGUpIDB4QjAsIChieXRlKSBibG9jayB9OwogCi0gICAgICAgIHRyYW5zY2VpdmUodHJhbnNfY21kKTsKKyAgICAgICAgdHJhbnNjZWl2ZSh0cmFuc19jbWQsIGZhbHNlKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCByZXN0b3JlKGludCBibG9jaykgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgY2hlY2tDb25uZWN0ZWQoKTsKIAotICAgICAgICBieXRlIGFkZHIgPSAoYnl0ZSkgYmxvY2s7CiAgICAgICAgIGJ5dGVbXSByZXN0X2NtZCA9IHsgKGJ5dGUpIDB4QzIsIChieXRlKSBibG9jayB9OwogCi0gICAgICAgIHRyYW5zY2VpdmUocmVzdF9jbWQpOworICAgICAgICB0cmFuc2NlaXZlKHJlc3RfY21kLCBmYWxzZSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2VuZCBkYXRhIHRvIGEgdGFnIGFuZCByZWNlaXZlIHRoZSByZXNwb25zZS4KKyAgICAgKiBTZW5kIHJhdyBOZmNBIGRhdGEgdG8gYSB0YWcgYW5kIHJlY2VpdmUgdGhlIHJlc3BvbnNlLgogICAgICAqIDxwPgogICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgYmxvY2sgdW50aWwgdGhlIHJlc3BvbnNlIGlzIHJlY2VpdmVkLiBJdCBjYW4gYmUgY2FuY2VsZWQKICAgICAgKiB3aXRoIHtAbGluayAjY2xvc2V9LgogICAgICAqIDxwPlJlcXVpcmVzIHtAbGluayBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24jTkZDfSBwZXJtaXNzaW9uLgorICAgICAqIDxwPlRoaXMgcmVxdWlyZXMgYSB0aGF0IHRoZSB0YWcgYmUgY29ubmVjdGVkLgogICAgICAqCiAgICAgICogQHBhcmFtIGRhdGEgYnl0ZXMgdG8gc2VuZAogICAgICAqIEByZXR1cm4gYnl0ZXMgcmVjZWl2ZWQgaW4gcmVzcG9uc2UKICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIHRoZSB0YXJnZXQgaXMgbG9zdCBvciBjb25uZWN0aW9uIGNsb3NlZAogICAgICAqLwotICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBieXRlW10gdHJhbnNjZWl2ZShieXRlW10gZGF0YSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgY2hlY2tDb25uZWN0ZWQoKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgYnl0ZVtdIHJlc3BvbnNlID0gbVRhZ1NlcnZpY2UudHJhbnNjZWl2ZShtVGFnLmdldFNlcnZpY2VIYW5kbGUoKSwgZGF0YSwgZmFsc2UpOwotICAgICAgICAgICAgaWYgKHJlc3BvbnNlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oInRyYW5zY2VpdmUgZmFpbGVkIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gcmVzcG9uc2U7Ci0gICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBhdHRlbXB0RGVhZFNlcnZpY2VSZWNvdmVyeShlKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiTkZDIHNlcnZpY2UgZGllZCIpOwotICAgICAgICB9CisgICAgICAgIHJldHVybiB0cmFuc2NlaXZlKGRhdGEsIHRydWUpOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL25mYy90ZWNoL01pZmFyZVVsdHJhbGlnaHQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL25mYy90ZWNoL01pZmFyZVVsdHJhbGlnaHQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDk2Mjk4Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvbmZjL3RlY2gvTWlmYXJlVWx0cmFsaWdodC5qYXZhCkBAIC0wLDAgKzEsMTMwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm5mYy50ZWNoOworCitpbXBvcnQgYW5kcm9pZC5uZmMuVGFnOworaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworLyoqCisgKiBUZWNobm9sb2d5IGNsYXNzIHJlcHJlc2VudGluZyBNSUZBUkUgVWx0cmFsaWdodCBhbmQgTUlGQVJFIFVsdHJhbGlnaHQgQyB0YWdzLgorICoKKyAqIDxwPlN1cHBvcnQgZm9yIHRoaXMgdGVjaG5vbG9neSB0eXBlIGlzIG9wdGlvbmFsLiBJZiB0aGUgTkZDIHN0YWNrIGRvZXNuJ3Qgc3VwcG9ydCB0aGlzIHRlY2hub2xvZ3kKKyAqIE1JRkFSRSBVbHRyYWxpZ2h0IGNsYXNzIHRhZ3Mgd2lsbCBzdGlsbCBiZSBzY2FubmVkLCBidXQgd2lsbCBvbmx5IHNob3cgdGhlIE5mY0EgdGVjaG5vbG9neS4KKyAqCisgKiA8cD5NSUZBUkUgVWx0cmFsaWdodCBjbGFzcyB0YWdzIGhhdmUgYSBzZXJpZXMgb2YgNCBieXRlcyBwYWdlcyB0aGF0IGNhbiBiZSBpbmRpdmlkdWFsbHkgd3JpdHRlbgorICogYW5kIHJlYWQgaW4gY2h1bmtzIG9mIDQgZm9yIGEgdG90YWwgcmVhZCBvZiAxNiBieXRlcy4KKyAqLworcHVibGljIGZpbmFsIGNsYXNzIE1pZmFyZVVsdHJhbGlnaHQgZXh0ZW5kcyBCYXNpY1RhZ1RlY2hub2xvZ3kgeworICAgIC8qKiBBIE1JRkFSRSBVbHRyYWxpZ2h0IHRhZyAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfVUxUUkFMSUdIVCA9IDE7CisgICAgLyoqIEEgTUlGQVJFIFVsdHJhbGlnaHQgQyB0YWcgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX1VMVFJBTElHSFRfQyA9IDI7CisgICAgLyoqIFRoZSB0YWcgdHlwZSBpcyB1bmtub3duICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9VTktOT1dOID0gMTA7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTlhQX01BTlVGQUNUVVJFUl9JRCA9IDB4MDQ7CisKKyAgICBwcml2YXRlIGludCBtVHlwZTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgYW4gaW5zdGFuY2Ugb2YgdGhpcyB0ZWNoIGZvciB0aGUgZ2l2ZW4gdGFnLiBJZiB0aGUgdGFnIGRvZXNuJ3Qgc3VwcG9ydAorICAgICAqIHRoaXMgdGVjaCB0eXBlIG51bGwgaXMgcmV0dXJuZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGFnIFRoZSB0YWcgdG8gZ2V0IHRoZSB0ZWNoIGZyb20KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE1pZmFyZVVsdHJhbGlnaHQgZ2V0KFRhZyB0YWcpIHsKKyAgICAgICAgaWYgKCF0YWcuaGFzVGVjaChUYWdUZWNobm9sb2d5Lk1JRkFSRV9VTFRSQUxJR0hUKSkgcmV0dXJuIG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IE1pZmFyZVVsdHJhbGlnaHQodGFnKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqIEBoaWRlICovCisgICAgcHVibGljIE1pZmFyZVVsdHJhbGlnaHQoVGFnIHRhZykgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyKHRhZywgVGFnVGVjaG5vbG9neS5NSUZBUkVfVUxUUkFMSUdIVCk7CisKKyAgICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBjb3VsZCBhY3R1YWxseSBiZSBhIE1pZmFyZQorICAgICAgICBOZmNBIGEgPSBOZmNBLmdldCh0YWcpOworCisgICAgICAgIG1UeXBlID0gVFlQRV9VTktOT1dOOworCisgICAgICAgIGlmIChhLmdldFNhaygpID09IDB4MDAgJiYgdGFnLmdldElkKClbMF0gPT0gTlhQX01BTlVGQUNUVVJFUl9JRCkgeworICAgICAgICAgICAgLy8gY291bGQgYmUgVUwgb3IgVUwtQworICAgICAgICAgICAgbVR5cGUgPSBUWVBFX1VMVFJBTElHSFQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiogUmV0dXJucyB0aGUgdHlwZSBvZiB0aGUgdGFnICovCisgICAgcHVibGljIGludCBnZXRUeXBlKCkgeworICAgICAgICByZXR1cm4gbVR5cGU7CisgICAgfQorCisgICAgLy8gTWV0aG9kcyB0aGF0IHJlcXVpcmUgY29ubmVjdCgpCisgICAgLyoqCisgICAgICogUmVhZHMgYSBzaW5nbGUgMTYgYnl0ZSBibG9jayBmcm9tIHRoZSBnaXZlbiBwYWdlIG9mZnNldC4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgcmVxdWlyZXMgYSB0aGF0IHRoZSB0YWcgYmUgY29ubmVjdGVkLgorICAgICAqCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyBieXRlW10gcmVhZEJsb2NrKGludCBwYWdlKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBjaGVja0Nvbm5lY3RlZCgpOworCisgICAgICAgIGJ5dGVbXSBibG9ja3JlYWRfY21kID0geyAweDMwLCAoYnl0ZSkgcGFnZX07IC8vIHBoSGFsX2VNaWZhcmVSZWFkCisgICAgICAgIHJldHVybiB0cmFuc2NlaXZlKGJsb2NrcmVhZF9jbWQsIGZhbHNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcml0ZXMgYSA0IGJ5dGUgcGFnZSB0byB0aGUgdGFnLgorICAgICAqCisgICAgICogPHA+VGhpcyByZXF1aXJlcyBhIHRoYXQgdGhlIHRhZyBiZSBjb25uZWN0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGFnZSBUaGUgb2Zmc2V0IG9mIHRoZSBwYWdlIHRvIHdyaXRlCisgICAgICogQHBhcmFtIGRhdGEgVGhlIGRhdGEgdG8gd3JpdGUKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgd3JpdGVQYWdlKGludCBwYWdlLCBieXRlW10gZGF0YSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgY2hlY2tDb25uZWN0ZWQoKTsKKworICAgICAgICBieXRlW10gcGFnZXdyaXRlX2NtZCA9IG5ldyBieXRlW2RhdGEubGVuZ3RoICsgMl07CisgICAgICAgIHBhZ2V3cml0ZV9jbWRbMF0gPSAoYnl0ZSkgMHhBMjsKKyAgICAgICAgcGFnZXdyaXRlX2NtZFsxXSA9IChieXRlKSBwYWdlOworICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGRhdGEsIDAsIHBhZ2V3cml0ZV9jbWQsIDIsIGRhdGEubGVuZ3RoKTsKKworICAgICAgICB0cmFuc2NlaXZlKHBhZ2V3cml0ZV9jbWQsIGZhbHNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZW5kIHJhdyBOZmNBIGRhdGEgdG8gYSB0YWcgYW5kIHJlY2VpdmUgdGhlIHJlc3BvbnNlLgorICAgICAqIDxwPgorICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgYmxvY2sgdW50aWwgdGhlIHJlc3BvbnNlIGlzIHJlY2VpdmVkLiBJdCBjYW4gYmUgY2FuY2VsZWQKKyAgICAgKiB3aXRoIHtAbGluayAjY2xvc2V9LgorICAgICAqIDxwPlJlcXVpcmVzIHtAbGluayBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24jTkZDfSBwZXJtaXNzaW9uLgorICAgICAqIDxwPlRoaXMgcmVxdWlyZXMgYSB0aGF0IHRoZSB0YWcgYmUgY29ubmVjdGVkLgorICAgICAqCisgICAgICogQHBhcmFtIGRhdGEgYnl0ZXMgdG8gc2VuZAorICAgICAqIEByZXR1cm4gYnl0ZXMgcmVjZWl2ZWQgaW4gcmVzcG9uc2UKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIHRoZSB0YXJnZXQgaXMgbG9zdCBvciBjb25uZWN0aW9uIGNsb3NlZAorICAgICAqLworICAgIHB1YmxpYyBieXRlW10gdHJhbnNjZWl2ZShieXRlW10gZGF0YSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIHRyYW5zY2VpdmUoZGF0YSwgdHJ1ZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvbmZjL3RlY2hub2xvZ3kvTmRlZi5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvbmZjL3RlY2gvTmRlZi5qYXZhCnNpbWlsYXJpdHkgaW5kZXggNzAlCnJlbmFtZSBmcm9tIGNvcmUvamF2YS9hbmRyb2lkL25mYy90ZWNobm9sb2d5L05kZWYuamF2YQpyZW5hbWUgdG8gY29yZS9qYXZhL2FuZHJvaWQvbmZjL3RlY2gvTmRlZi5qYXZhCmluZGV4IDA1ODcyZmUuLjAzZjIxODQgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL25mYy90ZWNobm9sb2d5L05kZWYuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9uZmMvdGVjaC9OZGVmLmphdmEKQEAgLTE0LDE1ICsxNCwxNyBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotcGFja2FnZSBhbmRyb2lkLm5mYy50ZWNobm9sb2d5OworcGFja2FnZSBhbmRyb2lkLm5mYy50ZWNoOwogCiBpbXBvcnQgYW5kcm9pZC5uZmMuRXJyb3JDb2RlczsKIGltcG9ydCBhbmRyb2lkLm5mYy5Gb3JtYXRFeGNlcHRpb247CitpbXBvcnQgYW5kcm9pZC5uZmMuSU5mY1RhZzsKIGltcG9ydCBhbmRyb2lkLm5mYy5OZGVmTWVzc2FnZTsKIGltcG9ydCBhbmRyb2lkLm5mYy5OZmNBZGFwdGVyOwogaW1wb3J0IGFuZHJvaWQubmZjLlRhZzsKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKIGltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIApAQCAtMzEsMTMgKzMzLDE1IEBACiAgKiB0byBpbnRlcmFjdCB3aXRoIE5ERUYgZGF0YS4gTWlGYXJlIENsYXNzaWMgY2FyZHMgdGhhdCBwcmVzZW50IE5ERUYgZGF0YSBtYXkgYWxzbyBiZSB1c2VkCiAgKiB2aWEgdGhpcyBjbGFzcy4gVG8gZGV0ZXJtaW5lIHRoZSBleGFjdCB0ZWNobm9sb2d5IGJlaW5nIHVzZWQgY2FsbCB7QGxpbmsgI2dldFRlY2hub2xvZ3lJZCgpfQogICoKLSAqIDxwPllvdSBjYW4gYWNxdWlyZSB0aGlzIGtpbmQgb2YgY29ubmVjdGlvbiB3aXRoIHtAbGluayBUYWcjZ2V0VGVjaG5vbG9neShpbnQpfS4KKyAqIDxwPllvdSBjYW4gYWNxdWlyZSB0aGlzIGtpbmQgb2YgY29ubmVjdGlvbiB3aXRoIHtAbGluayAjZ2V0fS4KICAqCiAgKiA8cCBjbGFzcz0ibm90ZSI+PHN0cm9uZz5Ob3RlOjwvc3Ryb25nPgogICogVXNlIG9mIHRoaXMgY2xhc3MgcmVxdWlyZXMgdGhlIHtAbGluayBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24jTkZDfQogICogcGVybWlzc2lvbi4KICAqLwogcHVibGljIGZpbmFsIGNsYXNzIE5kZWYgZXh0ZW5kcyBCYXNpY1RhZ1RlY2hub2xvZ3kgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiTkZDIjsKKwogICAgIC8qKiBAaGlkZSAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5ERUZfTU9ERV9SRUFEX09OTFkgPSAxOwogICAgIC8qKiBAaGlkZSAqLwpAQCAtNTcsMTQgKzYxLDEyIEBACiAgICAgLyoqIEBoaWRlICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfTkRFRl9UWVBFID0gIm5kZWZ0eXBlIjsKIAotICAgIC8vVE9ETzogY29uc2lkZXIgcmVtb3ZpbmcgT1RIRVIgZW50aXJlbHkgLSBhbmQgbm90IGFsbG93aW5nIE5kZWYgdG8KLSAgICAvLyBlbnVtZXJhdGUgZm9yIHRhZyB0eXBlcyBvdXRzaWRlIG9mIChORkMgRm9ydW0gMS00LCBNaWZhcmVDbGFzc2ljKQogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9USEVSID0gLTE7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTkZDX0ZPUlVNX1RZUEVfMSA9IDE7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTkZDX0ZPUlVNX1RZUEVfMiA9IDI7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTkZDX0ZPUlVNX1RZUEVfMyA9IDM7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTkZDX0ZPUlVNX1RZUEVfNCA9IDQ7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUlGQVJFX0NMQVNTSUMgPSAxMDU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUlGQVJFX0NMQVNTSUMgPSAxMDE7CiAKICAgICBwcml2YXRlIGZpbmFsIGludCBtTWF4TmRlZlNpemU7CiAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbUNhcmRTdGF0ZTsKQEAgLTcyLDExICs3NCwyNyBAQAogICAgIHByaXZhdGUgZmluYWwgaW50IG1OZGVmVHlwZTsKIAogICAgIC8qKgorICAgICAqIFJldHVybnMgYW4gaW5zdGFuY2Ugb2YgdGhpcyB0ZWNoIGZvciB0aGUgZ2l2ZW4gdGFnLiBJZiB0aGUgdGFnIGRvZXNuJ3Qgc3VwcG9ydAorICAgICAqIHRoaXMgdGVjaCB0eXBlIG51bGwgaXMgcmV0dXJuZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGFnIFRoZSB0YWcgdG8gZ2V0IHRoZSB0ZWNoIGZyb20KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE5kZWYgZ2V0KFRhZyB0YWcpIHsKKyAgICAgICAgaWYgKCF0YWcuaGFzVGVjaChUYWdUZWNobm9sb2d5Lk5ERUYpKSByZXR1cm4gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgTmRlZih0YWcpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKICAgICAgKiBJbnRlcm5hbCBjb25zdHJ1Y3RvciwgdG8gYmUgdXNlZCBieSBOZmNBZGFwdGVyCiAgICAgICogQGhpZGUKICAgICAgKi8KLSAgICBwdWJsaWMgTmRlZihOZmNBZGFwdGVyIGFkYXB0ZXIsIFRhZyB0YWcsIGludCB0ZWNoLCBCdW5kbGUgZXh0cmFzKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIoYWRhcHRlciwgdGFnLCB0ZWNoKTsKKyAgICBwdWJsaWMgTmRlZihUYWcgdGFnKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIodGFnLCBUYWdUZWNobm9sb2d5Lk5ERUYpOworICAgICAgICBCdW5kbGUgZXh0cmFzID0gdGFnLmdldFRlY2hFeHRyYXMoVGFnVGVjaG5vbG9neS5OREVGKTsKICAgICAgICAgaWYgKGV4dHJhcyAhPSBudWxsKSB7CiAgICAgICAgICAgICBtTWF4TmRlZlNpemUgPSBleHRyYXMuZ2V0SW50KEVYVFJBX05ERUZfTUFYTEVOR1RIKTsKICAgICAgICAgICAgIG1DYXJkU3RhdGUgPSBleHRyYXMuZ2V0SW50KEVYVFJBX05ERUZfQ0FSRFNUQVRFKTsKQEAgLTk3LDE1ICsxMTUsNiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldCBvcHRpb25hbCBleHRyYSBOREVGIG1lc3NhZ2VzLgotICAgICAqIFNvbWUgdGFncyBtYXkgY29udGFpbiBleHRyYSBOREVGIG1lc3NhZ2VzLCBidXQgbm90IGFsbAotICAgICAqIGltcGxlbWVudGF0aW9ucyB3aWxsIGJlIGFibGUgdG8gcmVhZCB0aGVtLgotICAgICAqLwotICAgIHB1YmxpYyBOZGVmTWVzc2FnZVtdIGdldEV4dHJhTmRlZk1lc3NhZ2UoKSB0aHJvd3MgSU9FeGNlcHRpb24sIEZvcm1hdEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIC8qKgogICAgICAqIEdldCBOREVGIHRhZyB0eXBlLgogICAgICAqIDxwPlJldHVybnMgb25lIG9mIHtAbGluayAjTkZDX0ZPUlVNX1RZUEVfMX0sIHtAbGluayAjTkZDX0ZPUlVNX1RZUEVfMn0sCiAgICAgICoge0BsaW5rICNORkNfRk9SVU1fVFlQRV8zfSwge0BsaW5rICNORkNfRk9SVU1fVFlQRV80fSwKQEAgLTE0OCwxMSArMTU3LDEyIEBACiAgICAgICAgIGNoZWNrQ29ubmVjdGVkKCk7CiAKICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIElOZmNUYWcgdGFnU2VydmljZSA9IG1UYWcuZ2V0VGFnU2VydmljZSgpOwogICAgICAgICAgICAgaW50IHNlcnZpY2VIYW5kbGUgPSBtVGFnLmdldFNlcnZpY2VIYW5kbGUoKTsKLSAgICAgICAgICAgIGlmIChtVGFnU2VydmljZS5pc05kZWYoc2VydmljZUhhbmRsZSkpIHsKLSAgICAgICAgICAgICAgICBOZGVmTWVzc2FnZSBtc2cgPSBtVGFnU2VydmljZS5uZGVmUmVhZChzZXJ2aWNlSGFuZGxlKTsKKyAgICAgICAgICAgIGlmICh0YWdTZXJ2aWNlLmlzTmRlZihzZXJ2aWNlSGFuZGxlKSkgeworICAgICAgICAgICAgICAgIE5kZWZNZXNzYWdlIG1zZyA9IHRhZ1NlcnZpY2UubmRlZlJlYWQoc2VydmljZUhhbmRsZSk7CiAgICAgICAgICAgICAgICAgaWYgKG1zZyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBlcnJvckNvZGUgPSBtVGFnU2VydmljZS5nZXRMYXN0RXJyb3Ioc2VydmljZUhhbmRsZSk7CisgICAgICAgICAgICAgICAgICAgIGludCBlcnJvckNvZGUgPSB0YWdTZXJ2aWNlLmdldExhc3RFcnJvcihzZXJ2aWNlSGFuZGxlKTsKICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChlcnJvckNvZGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRXJyb3JDb2Rlcy5FUlJPUl9JTzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oKTsKQEAgLTE2OCw3ICsxNzgsNyBAQAogICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgfQogICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgYXR0ZW1wdERlYWRTZXJ2aWNlUmVjb3ZlcnkoZSk7CisgICAgICAgICAgICBMb2cuZShUQUcsICJORkMgc2VydmljZSBkZWFkIiwgZSk7CiAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgfQogICAgIH0KQEAgLTE4MSw5ICsxOTEsMTAgQEAKICAgICAgICAgY2hlY2tDb25uZWN0ZWQoKTsKIAogICAgICAgICB0cnkgeworICAgICAgICAgICAgSU5mY1RhZyB0YWdTZXJ2aWNlID0gbVRhZy5nZXRUYWdTZXJ2aWNlKCk7CiAgICAgICAgICAgICBpbnQgc2VydmljZUhhbmRsZSA9IG1UYWcuZ2V0U2VydmljZUhhbmRsZSgpOwotICAgICAgICAgICAgaWYgKG1UYWdTZXJ2aWNlLmlzTmRlZihzZXJ2aWNlSGFuZGxlKSkgewotICAgICAgICAgICAgICAgIGludCBlcnJvckNvZGUgPSBtVGFnU2VydmljZS5uZGVmV3JpdGUoc2VydmljZUhhbmRsZSwgbXNnKTsKKyAgICAgICAgICAgIGlmICh0YWdTZXJ2aWNlLmlzTmRlZihzZXJ2aWNlSGFuZGxlKSkgeworICAgICAgICAgICAgICAgIGludCBlcnJvckNvZGUgPSB0YWdTZXJ2aWNlLm5kZWZXcml0ZShzZXJ2aWNlSGFuZGxlLCBtc2cpOwogICAgICAgICAgICAgICAgIHN3aXRjaCAoZXJyb3JDb2RlKSB7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgRXJyb3JDb2Rlcy5TVUNDRVNTOgogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC0yMDAsNjcgKzIxMSw1NCBAQAogICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiVGFnIGlzIG5vdCBuZGVmIik7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBhdHRlbXB0RGVhZFNlcnZpY2VSZWNvdmVyeShlKTsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIk5GQyBzZXJ2aWNlIGRlYWQiLCBlKTsKICAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgotICAgICAqIEF0dGVtcHQgdG8gd3JpdGUgZXh0cmEgTkRFRiBtZXNzYWdlcy4KLSAgICAgKiBJbXBsZW1lbnRhdGlvbnMgbWF5IGJlIGFibGUgdG8gd3JpdGUgZXh0cmEgTkRFRgotICAgICAqIG1lc3NhZ2UgYWZ0ZXIgdGhlIGZpcnN0IHByaW1hcnkgbWVzc2FnZSwgYnV0IGl0IGlzIG5vdAotICAgICAqIGd1YXJhbnRlZWQuIEV2ZW4gaWYgaXQgY2FuIGJlIHdyaXR0ZW4sIG90aGVyIGltcGxlbWVudGF0aW9ucwotICAgICAqIG1heSBub3QgYmUgYWJsZSB0byByZWFkIE5ERUYgbWVzc2FnZXMgYWZ0ZXIgdGhlIHByaW1hcnkgbWVzc2FnZS4KLSAgICAgKiBJdCBpcyByZWNvbW1lbmRlZCB0byB1c2UgYWRkaXRpb25hbCBOREVGIHJlY29yZHMgaW5zdGVhZC4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciBhIHRhZyBjYW4gYmUgbWFkZSByZWFkLW9ubHkgd2l0aAorICAgICAqIHtAbGluayAjbWFrZVJlYWRvbmx5KCl9CiAgICAgICovCi0gICAgcHVibGljIHZvaWQgd3JpdGVFeHRyYU5kZWZNZXNzYWdlKGludCBpLCBOZGVmTWVzc2FnZSBtc2cpIHRocm93cyBJT0V4Y2VwdGlvbiwgRm9ybWF0RXhjZXB0aW9uIHsKLSAgICAgICAgY2hlY2tDb25uZWN0ZWQoKTsKLQotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICBwdWJsaWMgYm9vbGVhbiBjYW5NYWtlUmVhZG9ubHkoKSB7CisgICAgICAgIGlmIChtTmRlZlR5cGUgPT0gTkZDX0ZPUlVNX1RZUEVfMSB8fCBtTmRlZlR5cGUgPT0gTkZDX0ZPUlVNX1RZUEVfMikgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXQgdGhlIENDIGZpZWxkIHRvIGluZGljYXRlIHRoaXMgdGFnIGlzIHJlYWQtb25seQorICAgICAqIFNldHMgdGhlIENDIGZpZWxkIHRvIGluZGljYXRlIHRoaXMgdGFnIGlzIHJlYWQtb25seQorICAgICAqIGFuZCBwZXJtYW5lbnRseSBzZXRzIHRoZSBsb2NrIGJpdHMgdG8gcHJldmVudCBhbnkgZnVydGhlciBOREVGCisgICAgICogbW9kaWZpY2F0aW9ucy4KKyAgICAgKiBUaGlzIGlzIGEgb25lLXdheSBwcm9jZXNzIGFuZCBjYW4gbm90IGJlIHJldmVydGVkIQogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBtYWtlUmVhZG9ubHkoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBjaGVja0Nvbm5lY3RlZCgpOwogCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpbnQgZXJyb3JDb2RlID0gbVRhZ1NlcnZpY2UubmRlZk1ha2VSZWFkT25seShtVGFnLmdldFNlcnZpY2VIYW5kbGUoKSk7Ci0gICAgICAgICAgICBzd2l0Y2ggKGVycm9yQ29kZSkgewotICAgICAgICAgICAgICAgIGNhc2UgRXJyb3JDb2Rlcy5TVUNDRVNTOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICBjYXNlIEVycm9yQ29kZXMuRVJST1JfSU86Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigpOwotICAgICAgICAgICAgICAgIGNhc2UgRXJyb3JDb2Rlcy5FUlJPUl9JTlZBTElEX1BBUkFNOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgLy8gU2hvdWxkIG5vdCBoYXBwZW4KLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBJTmZjVGFnIHRhZ1NlcnZpY2UgPSBtVGFnLmdldFRhZ1NlcnZpY2UoKTsKKyAgICAgICAgICAgIGlmICh0YWdTZXJ2aWNlLmlzTmRlZihtVGFnLmdldFNlcnZpY2VIYW5kbGUoKSkpIHsKKyAgICAgICAgICAgICAgICBpbnQgZXJyb3JDb2RlID0gdGFnU2VydmljZS5uZGVmTWFrZVJlYWRPbmx5KG1UYWcuZ2V0U2VydmljZUhhbmRsZSgpKTsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGVycm9yQ29kZSkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIEVycm9yQ29kZXMuU1VDQ0VTUzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICBjYXNlIEVycm9yQ29kZXMuRVJST1JfSU86CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBFcnJvckNvZGVzLkVSUk9SX0lOVkFMSURfUEFSQU06CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBTaG91bGQgbm90IGhhcHBlbgorICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICB9CisgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJUYWcgaXMgbm90IG5kZWYiKTsKKyAgICAgICAgICAgfQogICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgYXR0ZW1wdERlYWRTZXJ2aWNlUmVjb3ZlcnkoZSk7CisgICAgICAgICAgICBMb2cuZShUQUcsICJORkMgc2VydmljZSBkZWFkIiwgZSk7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBdHRlbXB0IHRvIHVzZSB0YWcgc3BlY2lmaWMgdGVjaG5vbG9neSB0byByZWFsbHkgbWFrZQotICAgICAqIHRoZSB0YWcgcmVhZC1vbmx5Ci0gICAgICogRm9yIE5GQyBGb3J1bSBUeXBlIDEgYW5kIDIgb25seS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBtYWtlTG93TGV2ZWxSZWFkb25seSgpIHsKLSAgICAgICAgY2hlY2tDb25uZWN0ZWQoKTsKLQotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYnl0ZVtdIHRyYW5zY2VpdmUoYnl0ZVtdIGRhdGEpIHsKLSAgICAgICAgY2hlY2tDb25uZWN0ZWQoKTsKLQotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICB9CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9uZmMvdGVjaG5vbG9neS9OZGVmRm9ybWF0YWJsZS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvbmZjL3RlY2gvTmRlZkZvcm1hdGFibGUuamF2YQpzaW1pbGFyaXR5IGluZGV4IDcwJQpyZW5hbWUgZnJvbSBjb3JlL2phdmEvYW5kcm9pZC9uZmMvdGVjaG5vbG9neS9OZGVmRm9ybWF0YWJsZS5qYXZhCnJlbmFtZSB0byBjb3JlL2phdmEvYW5kcm9pZC9uZmMvdGVjaC9OZGVmRm9ybWF0YWJsZS5qYXZhCmluZGV4IDIyMmM1NTguLjI5MTljNDMgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL25mYy90ZWNobm9sb2d5L05kZWZGb3JtYXRhYmxlLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvbmZjL3RlY2gvTmRlZkZvcm1hdGFibGUuamF2YQpAQCAtMTQsMzQgKzE0LDUyIEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi1wYWNrYWdlIGFuZHJvaWQubmZjLnRlY2hub2xvZ3k7CitwYWNrYWdlIGFuZHJvaWQubmZjLnRlY2g7CiAKIGltcG9ydCBhbmRyb2lkLm5mYy5FcnJvckNvZGVzOwogaW1wb3J0IGFuZHJvaWQubmZjLkZvcm1hdEV4Y2VwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLm5mYy5JTmZjVGFnOwogaW1wb3J0IGFuZHJvaWQubmZjLk5kZWZNZXNzYWdlOwogaW1wb3J0IGFuZHJvaWQubmZjLk5mY0FkYXB0ZXI7CiBpbXBvcnQgYW5kcm9pZC5uZmMuVGFnOwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwogaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogCiAvKioKICAqIEFuIGludGVyZmFjZSB0byBhIHtAbGluayBUYWd9IGFsbG93aW5nIHRvIGZvcm1hdCB0aGUgdGFnIGFzIE5ERUYuCiAgKgotICogPHA+WW91IGNhbiBhY3F1aXJlIHRoaXMga2luZCBvZiBpbnRlcmZhY2Ugd2l0aCB7QGxpbmsgVGFnI2dldFRlY2hub2xvZ3koaW50KX0uCisgKiA8cD5Zb3UgY2FuIGFjcXVpcmUgdGhpcyBraW5kIG9mIGNvbm5lY3Rpb24gd2l0aCB7QGxpbmsgI2dldH0uCiAgKgogICogPHAgY2xhc3M9Im5vdGUiPjxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4KICAqIFVzZSBvZiB0aGlzIGNsYXNzIHJlcXVpcmVzIHRoZSB7QGxpbmsgYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uI05GQ30KICAqIHBlcm1pc3Npb24uCiAgKi8KIHB1YmxpYyBmaW5hbCBjbGFzcyBOZGVmRm9ybWF0YWJsZSBleHRlbmRzIEJhc2ljVGFnVGVjaG5vbG9neSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJORkMiOworCisgICAgLyoqCisgICAgICogUmV0dXJucyBhbiBpbnN0YW5jZSBvZiB0aGlzIHRlY2ggZm9yIHRoZSBnaXZlbiB0YWcuIElmIHRoZSB0YWcgZG9lc24ndCBzdXBwb3J0CisgICAgICogdGhpcyB0ZWNoIHR5cGUgbnVsbCBpcyByZXR1cm5lZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0YWcgVGhlIHRhZyB0byBnZXQgdGhlIHRlY2ggZnJvbQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTmRlZkZvcm1hdGFibGUgZ2V0KFRhZyB0YWcpIHsKKyAgICAgICAgaWYgKCF0YWcuaGFzVGVjaChUYWdUZWNobm9sb2d5Lk5ERUZfRk9STUFUQUJMRSkpIHJldHVybiBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBOZGVmRm9ybWF0YWJsZSh0YWcpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKICAgICAvKioKICAgICAgKiBJbnRlcm5hbCBjb25zdHJ1Y3RvciwgdG8gYmUgdXNlZCBieSBOZmNBZGFwdGVyCiAgICAgICogQGhpZGUKICAgICAgKi8KLSAgICBwdWJsaWMgTmRlZkZvcm1hdGFibGUoTmZjQWRhcHRlciBhZGFwdGVyLCBUYWcgdGFnLCBpbnQgdGVjaCwgQnVuZGxlIGV4dHJhcykgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyKGFkYXB0ZXIsIHRhZywgdGVjaCk7CisgICAgcHVibGljIE5kZWZGb3JtYXRhYmxlKFRhZyB0YWcpIHRocm93cyBSZW1vdGVFeGNlcHRpb24geworICAgICAgICBzdXBlcih0YWcsIFRhZ1RlY2hub2xvZ3kuTkRFRl9GT1JNQVRBQkxFKTsKICAgICB9CiAKICAgICAvKioKQEAgLTUyLDEwICs3MCw5IEBACiAgICAgICAgIGNoZWNrQ29ubmVjdGVkKCk7CiAKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJ5dGVbXSBERUZBVUxUX0tFWSA9IHsoYnl0ZSkweEZGLChieXRlKTB4RkYsKGJ5dGUpMHhGRiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYnl0ZSkweEZGLChieXRlKTB4RkYsKGJ5dGUpMHhGRn07CiAgICAgICAgICAgICBpbnQgc2VydmljZUhhbmRsZSA9IG1UYWcuZ2V0U2VydmljZUhhbmRsZSgpOwotICAgICAgICAgICAgaW50IGVycm9yQ29kZSA9IG1UYWdTZXJ2aWNlLmZvcm1hdE5kZWYoc2VydmljZUhhbmRsZSwgREVGQVVMVF9LRVkpOworICAgICAgICAgICAgSU5mY1RhZyB0YWdTZXJ2aWNlID0gbVRhZy5nZXRUYWdTZXJ2aWNlKCk7CisgICAgICAgICAgICBpbnQgZXJyb3JDb2RlID0gdGFnU2VydmljZS5mb3JtYXROZGVmKHNlcnZpY2VIYW5kbGUsIE1pZmFyZUNsYXNzaWMuS0VZX0RFRkFVTFQpOwogICAgICAgICAgICAgc3dpdGNoIChlcnJvckNvZGUpIHsKICAgICAgICAgICAgICAgICBjYXNlIEVycm9yQ29kZXMuU1VDQ0VTUzoKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC02OCw4ICs4NSw4IEBACiAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgLy8gTm93IGNoZWNrIGFuZCBzZWUgaWYgdGhlIGZvcm1hdCB3b3JrZWQKLSAgICAgICAgICAgIGlmIChtVGFnU2VydmljZS5pc05kZWYoc2VydmljZUhhbmRsZSkpIHsKLSAgICAgICAgICAgICAgICBlcnJvckNvZGUgPSBtVGFnU2VydmljZS5uZGVmV3JpdGUoc2VydmljZUhhbmRsZSwgZmlyc3RNZXNzYWdlKTsKKyAgICAgICAgICAgIGlmICh0YWdTZXJ2aWNlLmlzTmRlZihzZXJ2aWNlSGFuZGxlKSkgeworICAgICAgICAgICAgICAgIGVycm9yQ29kZSA9IHRhZ1NlcnZpY2UubmRlZldyaXRlKHNlcnZpY2VIYW5kbGUsIGZpcnN0TWVzc2FnZSk7CiAgICAgICAgICAgICAgICAgc3dpdGNoIChlcnJvckNvZGUpIHsKICAgICAgICAgICAgICAgICAgICAgY2FzZSBFcnJvckNvZGVzLlNVQ0NFU1M6CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTg1LDE0ICsxMDIsNyBAQAogICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigpOwogICAgICAgICAgICAgfQogICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgYXR0ZW1wdERlYWRTZXJ2aWNlUmVjb3ZlcnkoZSk7CisgICAgICAgICAgICBMb2cuZShUQUcsICJORkMgc2VydmljZSBkZWFkIiwgZSk7CiAgICAgICAgIH0KICAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYnl0ZVtdIHRyYW5zY2VpdmUoYnl0ZVtdIGRhdGEpIHsKLSAgICAgICAgY2hlY2tDb25uZWN0ZWQoKTsKLQotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICB9CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9uZmMvdGVjaC9OZmNBLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9uZmMvdGVjaC9OZmNBLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjRiYWRjNAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL25mYy90ZWNoL05mY0EuamF2YQpAQCAtMCwwICsxLDk5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm5mYy50ZWNoOworCitpbXBvcnQgYW5kcm9pZC5uZmMuVGFnOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworLyoqCisgKiBBIGxvdy1sZXZlbCBjb25uZWN0aW9uIHRvIGEge0BsaW5rIFRhZ30gdXNpbmcgdGhlIE5GQy1BIHRlY2hub2xvZ3ksIGFsc28ga25vd24gYXMKKyAqIElTTzE0NDMtM0EuCisgKgorICogPHA+WW91IGNhbiBhY3F1aXJlIHRoaXMga2luZCBvZiBjb25uZWN0aW9uIHdpdGgge0BsaW5rICNnZXR9LgorICogVXNlIHRoaXMgY2xhc3MgdG8gc2VuZCBhbmQgcmVjZWl2ZSBkYXRhIHdpdGgge0BsaW5rICN0cmFuc2NlaXZlIHRyYW5zY2VpdmUoKX0uCisgKgorICogPHA+QXBwbGljYXRpb25zIG11c3QgaW1wbGVtZW50IHRoZWlyIG93biBwcm90b2NvbCBzdGFjayBvbiB0b3Agb2YKKyAqIHtAbGluayAjdHJhbnNjZWl2ZSB0cmFuc2NlaXZlKCl9LgorICoKKyAqIDxwIGNsYXNzPSJub3RlIj48c3Ryb25nPk5vdGU6PC9zdHJvbmc+CisgKiBVc2Ugb2YgdGhpcyBjbGFzcyByZXF1aXJlcyB0aGUge0BsaW5rIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbiNORkN9CisgKiBwZXJtaXNzaW9uLgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgTmZjQSBleHRlbmRzIEJhc2ljVGFnVGVjaG5vbG9neSB7CisgICAgLyoqIEBoaWRlICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfU0FLID0gInNhayI7CisgICAgLyoqIEBoaWRlICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfQVRRQSA9ICJhdHFhIjsKKworICAgIHByaXZhdGUgc2hvcnQgbVNhazsKKyAgICBwcml2YXRlIGJ5dGVbXSBtQXRxYTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgYW4gaW5zdGFuY2Ugb2YgdGhpcyB0ZWNoIGZvciB0aGUgZ2l2ZW4gdGFnLiBJZiB0aGUgdGFnIGRvZXNuJ3Qgc3VwcG9ydAorICAgICAqIHRoaXMgdGVjaCB0eXBlIG51bGwgaXMgcmV0dXJuZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGFnIFRoZSB0YWcgdG8gZ2V0IHRoZSB0ZWNoIGZyb20KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE5mY0EgZ2V0KFRhZyB0YWcpIHsKKyAgICAgICAgaWYgKCF0YWcuaGFzVGVjaChUYWdUZWNobm9sb2d5Lk5GQ19BKSkgcmV0dXJuIG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IE5mY0EodGFnKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqIEBoaWRlICovCisgICAgcHVibGljIE5mY0EoVGFnIHRhZykgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyKHRhZywgVGFnVGVjaG5vbG9neS5ORkNfQSk7CisgICAgICAgIEJ1bmRsZSBleHRyYXMgPSB0YWcuZ2V0VGVjaEV4dHJhcyhUYWdUZWNobm9sb2d5Lk5GQ19BKTsKKyAgICAgICAgbVNhayA9IGV4dHJhcy5nZXRTaG9ydChFWFRSQV9TQUspOworICAgICAgICBtQXRxYSA9IGV4dHJhcy5nZXRCeXRlQXJyYXkoRVhUUkFfQVRRQSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgQVRRQS9TRU5TX1JFUyBieXRlcyBkaXNjb3ZlcmVkIGF0IHRhZyBkaXNjb3ZlcnkuCisgICAgICovCisgICAgcHVibGljIGJ5dGVbXSBnZXRBdHFhKCkgeworICAgICAgICByZXR1cm4gbUF0cWE7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgU0FLL1NFTF9SRVMgZGlzY292ZXJlZCBhdCB0YWcgZGlzY292ZXJ5LgorICAgICAqLworICAgIHB1YmxpYyBzaG9ydCBnZXRTYWsoKSB7CisgICAgICAgIHJldHVybiBtU2FrOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNlbmQgZGF0YSB0byBhIHRhZyBhbmQgcmVjZWl2ZSB0aGUgcmVzcG9uc2UuCisgICAgICogPHA+CisgICAgICogVGhpcyBtZXRob2Qgd2lsbCBibG9jayB1bnRpbCB0aGUgcmVzcG9uc2UgaXMgcmVjZWl2ZWQuIEl0IGNhbiBiZSBjYW5jZWxlZAorICAgICAqIHdpdGgge0BsaW5rICNjbG9zZX0uCisgICAgICogPHA+UmVxdWlyZXMge0BsaW5rIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbiNORkN9IHBlcm1pc3Npb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGF0YSBieXRlcyB0byBzZW5kCisgICAgICogQHJldHVybiBieXRlcyByZWNlaXZlZCBpbiByZXNwb25zZQorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgdGhlIHRhcmdldCBpcyBsb3N0IG9yIGNvbm5lY3Rpb24gY2xvc2VkCisgICAgICovCisgICAgcHVibGljIGJ5dGVbXSB0cmFuc2NlaXZlKGJ5dGVbXSBkYXRhKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICByZXR1cm4gdHJhbnNjZWl2ZShkYXRhLCB0cnVlKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9uZmMvdGVjaG5vbG9neS9OZmNCLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9uZmMvdGVjaC9OZmNCLmphdmEKc2ltaWxhcml0eSBpbmRleCA2MCUKcmVuYW1lIGZyb20gY29yZS9qYXZhL2FuZHJvaWQvbmZjL3RlY2hub2xvZ3kvTmZjQi5qYXZhCnJlbmFtZSB0byBjb3JlL2phdmEvYW5kcm9pZC9uZmMvdGVjaC9OZmNCLmphdmEKaW5kZXggMjY3Yzk0ZC4uYWJlZWYzMiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvbmZjL3RlY2hub2xvZ3kvTmZjQi5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL25mYy90ZWNoL05mY0IuamF2YQpAQCAtMTQsMTggKzE0LDE5IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi1wYWNrYWdlIGFuZHJvaWQubmZjLnRlY2hub2xvZ3k7CitwYWNrYWdlIGFuZHJvaWQubmZjLnRlY2g7CiAKLWltcG9ydCBhbmRyb2lkLm5mYy5OZmNBZGFwdGVyOwogaW1wb3J0IGFuZHJvaWQubmZjLlRhZzsKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKIGltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKIAoraW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKIC8qKgogICogQSBsb3ctbGV2ZWwgY29ubmVjdGlvbiB0byBhIHtAbGluayBUYWd9IHVzaW5nIHRoZSBORkMtQiB0ZWNobm9sb2d5LCBhbHNvIGtub3duIGFzCiAgKiBJU08xNDQzLTNCLgogICoKLSAqIDxwPllvdSBjYW4gYWNxdWlyZSB0aGlzIGtpbmQgb2YgY29ubmVjdGlvbiB3aXRoIHtAbGluayBUYWcjZ2V0VGVjaG5vbG9neShpbnQpfS4KKyAqIDxwPllvdSBjYW4gYWNxdWlyZSB0aGlzIGtpbmQgb2YgY29ubmVjdGlvbiB3aXRoIHtAbGluayAjZ2V0fS4KICAqIFVzZSB0aGlzIGNsYXNzIHRvIHNlbmQgYW5kIHJlY2VpdmUgZGF0YSB3aXRoIHtAbGluayAjdHJhbnNjZWl2ZSB0cmFuc2NlaXZlKCl9LgogICoKICAqIDxwPkFwcGxpY2F0aW9ucyBtdXN0IGltcGxlbWVudCB0aGVpciBvd24gcHJvdG9jb2wgc3RhY2sgb24gdG9wIG9mCkBAIC00NCw5ICs0NSwyNSBAQAogICAgIHByaXZhdGUgYnl0ZVtdIG1BcHBEYXRhOwogICAgIHByaXZhdGUgYnl0ZVtdIG1Qcm90SW5mbzsKIAotICAgIHB1YmxpYyBOZmNCKE5mY0FkYXB0ZXIgYWRhcHRlciwgVGFnIHRhZywgQnVuZGxlIGV4dHJhcykKLSAgICAgICAgICAgIHRocm93cyBSZW1vdGVFeGNlcHRpb24gewotICAgICAgICBzdXBlcihhZGFwdGVyLCB0YWcsIFRhZ1RlY2hub2xvZ3kuTkZDX0IpOworICAgIC8qKgorICAgICAqIFJldHVybnMgYW4gaW5zdGFuY2Ugb2YgdGhpcyB0ZWNoIGZvciB0aGUgZ2l2ZW4gdGFnLiBJZiB0aGUgdGFnIGRvZXNuJ3Qgc3VwcG9ydAorICAgICAqIHRoaXMgdGVjaCB0eXBlIG51bGwgaXMgcmV0dXJuZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGFnIFRoZSB0YWcgdG8gZ2V0IHRoZSB0ZWNoIGZyb20KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE5mY0IgZ2V0KFRhZyB0YWcpIHsKKyAgICAgICAgaWYgKCF0YWcuaGFzVGVjaChUYWdUZWNobm9sb2d5Lk5GQ19CKSkgcmV0dXJuIG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IE5mY0IodGFnKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqIEBoaWRlICovCisgICAgcHVibGljIE5mY0IoVGFnIHRhZykgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyKHRhZywgVGFnVGVjaG5vbG9neS5ORkNfQik7CisgICAgICAgIEJ1bmRsZSBleHRyYXMgPSB0YWcuZ2V0VGVjaEV4dHJhcyhUYWdUZWNobm9sb2d5Lk5GQ19CKTsKICAgICAgICAgbUFwcERhdGEgPSBleHRyYXMuZ2V0Qnl0ZUFycmF5KEVYVFJBX0FQUERBVEEpOwogICAgICAgICBtUHJvdEluZm8gPSBleHRyYXMuZ2V0Qnl0ZUFycmF5KEVYVFJBX1BST1RJTkZPKTsKICAgICB9CkBAIC02Nyw0ICs4NCwxOCBAQAogICAgICAgICByZXR1cm4gbVByb3RJbmZvOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIFNlbmQgZGF0YSB0byBhIHRhZyBhbmQgcmVjZWl2ZSB0aGUgcmVzcG9uc2UuCisgICAgICogPHA+CisgICAgICogVGhpcyBtZXRob2Qgd2lsbCBibG9jayB1bnRpbCB0aGUgcmVzcG9uc2UgaXMgcmVjZWl2ZWQuIEl0IGNhbiBiZSBjYW5jZWxlZAorICAgICAqIHdpdGgge0BsaW5rICNjbG9zZX0uCisgICAgICogPHA+UmVxdWlyZXMge0BsaW5rIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbiNORkN9IHBlcm1pc3Npb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGF0YSBieXRlcyB0byBzZW5kCisgICAgICogQHJldHVybiBieXRlcyByZWNlaXZlZCBpbiByZXNwb25zZQorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgdGhlIHRhcmdldCBpcyBsb3N0IG9yIGNvbm5lY3Rpb24gY2xvc2VkCisgICAgICovCisgICAgcHVibGljIGJ5dGVbXSB0cmFuc2NlaXZlKGJ5dGVbXSBkYXRhKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICByZXR1cm4gdHJhbnNjZWl2ZShkYXRhLCB0cnVlKTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9uZmMvdGVjaC9OZmNGLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9uZmMvdGVjaC9OZmNGLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjYxNzczOQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL25mYy90ZWNoL05mY0YuamF2YQpAQCAtMCwwICsxLDk1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm5mYy50ZWNoOworCitpbXBvcnQgYW5kcm9pZC5uZmMuVGFnOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworLyoqCisgKiBBIGxvdy1sZXZlbCBjb25uZWN0aW9uIHRvIGEge0BsaW5rIFRhZ30gdXNpbmcgdGhlIE5GQy1GIHRlY2hub2xvZ3ksIGFsc28ga25vd24gYXMKKyAqIEpJUzYzMTktNC4KKyAqCisgKiA8cD5Zb3UgY2FuIGFjcXVpcmUgdGhpcyBraW5kIG9mIGNvbm5lY3Rpb24gd2l0aCB7QGxpbmsgI2dldH0uCisgKiBVc2UgdGhpcyBjbGFzcyB0byBzZW5kIGFuZCByZWNlaXZlIGRhdGEgd2l0aCB7QGxpbmsgI3RyYW5zY2VpdmUgdHJhbnNjZWl2ZSgpfS4KKyAqCisgKiA8cD5BcHBsaWNhdGlvbnMgbXVzdCBpbXBsZW1lbnQgdGhlaXIgb3duIHByb3RvY29sIHN0YWNrIG9uIHRvcCBvZgorICoge0BsaW5rICN0cmFuc2NlaXZlIHRyYW5zY2VpdmUoKX0uCisgKgorICogPHAgY2xhc3M9Im5vdGUiPjxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4KKyAqIFVzZSBvZiB0aGlzIGNsYXNzIHJlcXVpcmVzIHRoZSB7QGxpbmsgYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uI05GQ30KKyAqIHBlcm1pc3Npb24uCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBOZmNGIGV4dGVuZHMgQmFzaWNUYWdUZWNobm9sb2d5IHsKKyAgICAvKiogQGhpZGUgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9TQyA9ICJzeXN0ZW1jb2RlIjsKKyAgICAvKiogQGhpZGUgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9QTU0gPSAicG1tIjsKKworICAgIHByaXZhdGUgYnl0ZVtdIG1TeXN0ZW1Db2RlID0gbnVsbDsKKyAgICBwcml2YXRlIGJ5dGVbXSBtTWFudWZhY3R1cmVyID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgYW4gaW5zdGFuY2Ugb2YgdGhpcyB0ZWNoIGZvciB0aGUgZ2l2ZW4gdGFnLiBJZiB0aGUgdGFnIGRvZXNuJ3Qgc3VwcG9ydAorICAgICAqIHRoaXMgdGVjaCB0eXBlIG51bGwgaXMgcmV0dXJuZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGFnIFRoZSB0YWcgdG8gZ2V0IHRoZSB0ZWNoIGZyb20KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE5mY0YgZ2V0KFRhZyB0YWcpIHsKKyAgICAgICAgaWYgKCF0YWcuaGFzVGVjaChUYWdUZWNobm9sb2d5Lk5GQ19GKSkgcmV0dXJuIG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IE5mY0YodGFnKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqIEBoaWRlICovCisgICAgcHVibGljIE5mY0YoVGFnIHRhZykgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyKHRhZywgVGFnVGVjaG5vbG9neS5ORkNfRik7CisgICAgICAgIEJ1bmRsZSBleHRyYXMgPSB0YWcuZ2V0VGVjaEV4dHJhcyhUYWdUZWNobm9sb2d5Lk5GQ19GKTsKKyAgICAgICAgaWYgKGV4dHJhcyAhPSBudWxsKSB7CisgICAgICAgICAgICBtU3lzdGVtQ29kZSA9IGV4dHJhcy5nZXRCeXRlQXJyYXkoRVhUUkFfU0MpOworICAgICAgICAgICAgbU1hbnVmYWN0dXJlciA9IGV4dHJhcy5nZXRCeXRlQXJyYXkoRVhUUkFfUE1NKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBieXRlW10gZ2V0U3lzdGVtQ29kZSgpIHsKKyAgICAgIHJldHVybiBtU3lzdGVtQ29kZTsKKyAgICB9CisKKyAgICBwdWJsaWMgYnl0ZVtdIGdldE1hbnVmYWN0dXJlcigpIHsKKyAgICAgIHJldHVybiBtTWFudWZhY3R1cmVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNlbmQgZGF0YSB0byBhIHRhZyBhbmQgcmVjZWl2ZSB0aGUgcmVzcG9uc2UuCisgICAgICogPHA+CisgICAgICogVGhpcyBtZXRob2Qgd2lsbCBibG9jayB1bnRpbCB0aGUgcmVzcG9uc2UgaXMgcmVjZWl2ZWQuIEl0IGNhbiBiZSBjYW5jZWxlZAorICAgICAqIHdpdGgge0BsaW5rICNjbG9zZX0uCisgICAgICogPHA+UmVxdWlyZXMge0BsaW5rIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbiNORkN9IHBlcm1pc3Npb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGF0YSBieXRlcyB0byBzZW5kCisgICAgICogQHJldHVybiBieXRlcyByZWNlaXZlZCBpbiByZXNwb25zZQorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgdGhlIHRhcmdldCBpcyBsb3N0IG9yIGNvbm5lY3Rpb24gY2xvc2VkCisgICAgICovCisgICAgcHVibGljIGJ5dGVbXSB0cmFuc2NlaXZlKGJ5dGVbXSBkYXRhKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICByZXR1cm4gdHJhbnNjZWl2ZShkYXRhLCB0cnVlKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9uZmMvdGVjaC9OZmNWLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9uZmMvdGVjaC9OZmNWLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGUxZjA2NgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL25mYy90ZWNoL05mY1YuamF2YQpAQCAtMCwwICsxLDk0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm5mYy50ZWNoOworCitpbXBvcnQgYW5kcm9pZC5uZmMuVGFnOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworLyoqCisgKiBBIGxvdy1sZXZlbCBjb25uZWN0aW9uIHRvIGEge0BsaW5rIFRhZ30gdXNpbmcgTkZDIHZpY2luaXR5IHRlY2hub2xvZ3ksIGFsc28ga25vd24gYXMKKyAqIElTTzE1NjkzLgorICoKKyAqIDxwPllvdSBjYW4gYWNxdWlyZSB0aGlzIGtpbmQgb2YgY29ubmVjdGlvbiB3aXRoIHtAbGluayAjZ2V0fS4KKyAqIFVzZSB0aGlzIGNsYXNzIHRvIHNlbmQgYW5kIHJlY2VpdmUgZGF0YSB3aXRoIHtAbGluayAjdHJhbnNjZWl2ZSB0cmFuc2NlaXZlKCl9LgorICoKKyAqIDxwPkFwcGxpY2F0aW9ucyBtdXN0IGltcGxlbWVudCB0aGVpciBvd24gcHJvdG9jb2wgc3RhY2sgb24gdG9wIG9mCisgKiB7QGxpbmsgI3RyYW5zY2VpdmUgdHJhbnNjZWl2ZSgpfS4KKyAqCisgKiA8cCBjbGFzcz0ibm90ZSI+PHN0cm9uZz5Ob3RlOjwvc3Ryb25nPgorICogVXNlIG9mIHRoaXMgY2xhc3MgcmVxdWlyZXMgdGhlIHtAbGluayBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24jTkZDfQorICogcGVybWlzc2lvbi4KKyAqLworcHVibGljIGZpbmFsIGNsYXNzIE5mY1YgZXh0ZW5kcyBCYXNpY1RhZ1RlY2hub2xvZ3kgeworICAgIC8qKiBAaGlkZSAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX1JFU1BfRkxBR1MgPSAicmVzcGZsYWdzIjsKKworICAgIC8qKiBAaGlkZSAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX0RTRklEID0gImRzZmlkIjsKKworICAgIHByaXZhdGUgYnl0ZSBtUmVzcEZsYWdzOworICAgIHByaXZhdGUgYnl0ZSBtRHNmSWQ7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGFuIGluc3RhbmNlIG9mIHRoaXMgdGVjaCBmb3IgdGhlIGdpdmVuIHRhZy4gSWYgdGhlIHRhZyBkb2Vzbid0IHN1cHBvcnQKKyAgICAgKiB0aGlzIHRlY2ggdHlwZSBudWxsIGlzIHJldHVybmVkLgorICAgICAqCisgICAgICogQHBhcmFtIHRhZyBUaGUgdGFnIHRvIGdldCB0aGUgdGVjaCBmcm9tCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBOZmNWIGdldChUYWcgdGFnKSB7CisgICAgICAgIGlmICghdGFnLmhhc1RlY2goVGFnVGVjaG5vbG9neS5ORkNfVikpIHJldHVybiBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBOZmNWKHRhZyk7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKiBAaGlkZSAqLworICAgIHB1YmxpYyBOZmNWKFRhZyB0YWcpIHRocm93cyBSZW1vdGVFeGNlcHRpb24geworICAgICAgICBzdXBlcih0YWcsIFRhZ1RlY2hub2xvZ3kuTkZDX1YpOworICAgICAgICBCdW5kbGUgZXh0cmFzID0gdGFnLmdldFRlY2hFeHRyYXMoVGFnVGVjaG5vbG9neS5ORkNfVik7CisgICAgICAgIG1SZXNwRmxhZ3MgPSBleHRyYXMuZ2V0Qnl0ZShFWFRSQV9SRVNQX0ZMQUdTKTsKKyAgICAgICAgbURzZklkID0gZXh0cmFzLmdldEJ5dGUoRVhUUkFfRFNGSUQpOworICAgIH0KKworICAgIHB1YmxpYyBieXRlIGdldFJlc3BvbnNlRmxhZ3MoKSB7CisgICAgICAgIHJldHVybiBtUmVzcEZsYWdzOworICAgIH0KKworICAgIHB1YmxpYyBieXRlIGdldERzZklkKCkgeworICAgICAgICByZXR1cm4gbURzZklkOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNlbmQgZGF0YSB0byBhIHRhZyBhbmQgcmVjZWl2ZSB0aGUgcmVzcG9uc2UuCisgICAgICogPHA+CisgICAgICogVGhpcyBtZXRob2Qgd2lsbCBibG9jayB1bnRpbCB0aGUgcmVzcG9uc2UgaXMgcmVjZWl2ZWQuIEl0IGNhbiBiZSBjYW5jZWxlZAorICAgICAqIHdpdGgge0BsaW5rICNjbG9zZX0uCisgICAgICogPHA+UmVxdWlyZXMge0BsaW5rIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbiNORkN9IHBlcm1pc3Npb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGF0YSBieXRlcyB0byBzZW5kCisgICAgICogQHJldHVybiBieXRlcyByZWNlaXZlZCBpbiByZXNwb25zZQorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgdGhlIHRhcmdldCBpcyBsb3N0IG9yIGNvbm5lY3Rpb24gY2xvc2VkCisgICAgICovCisgICAgcHVibGljIGJ5dGVbXSB0cmFuc2NlaXZlKGJ5dGVbXSBkYXRhKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICByZXR1cm4gdHJhbnNjZWl2ZShkYXRhLCB0cnVlKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9uZmMvdGVjaC9UYWdUZWNobm9sb2d5LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9uZmMvdGVjaC9UYWdUZWNobm9sb2d5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTMzMWJhZQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL25mYy90ZWNoL1RhZ1RlY2hub2xvZ3kuamF2YQpAQCAtMCwwICsxLDE0NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5uZmMudGVjaDsKKworaW1wb3J0IGFuZHJvaWQubmZjLlRhZzsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK3B1YmxpYyBpbnRlcmZhY2UgVGFnVGVjaG5vbG9neSB7CisgICAgLyoqCisgICAgICogVGhpcyB0ZWNobm9sb2d5IGlzIGFuIGluc3RhbmNlIG9mIHtAbGluayBOZmNBfS4KKyAgICAgKiA8cD5TdXBwb3J0IGZvciB0aGlzIHRlY2hub2xvZ3kgdHlwZSBpcyBtYW5kYXRvcnkuCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBORkNfQSA9IDE7CisKKyAgICAvKioKKyAgICAgKiBUaGlzIHRlY2hub2xvZ3kgaXMgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIE5mY0J9LgorICAgICAqIDxwPlN1cHBvcnQgZm9yIHRoaXMgdGVjaG5vbG9neSB0eXBlIGlzIG1hbmRhdG9yeS4KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5GQ19CID0gMjsKKworICAgIC8qKgorICAgICAqIFRoaXMgdGVjaG5vbG9neSBpcyBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgSXNvRGVwfS4KKyAgICAgKiA8cD5TdXBwb3J0IGZvciB0aGlzIHRlY2hub2xvZ3kgdHlwZSBpcyBtYW5kYXRvcnkuCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJU09fREVQID0gMzsKKworICAgIC8qKgorICAgICAqIFRoaXMgdGVjaG5vbG9neSBpcyBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgTmZjRn0uCisgICAgICogPHA+U3VwcG9ydCBmb3IgdGhpcyB0ZWNobm9sb2d5IHR5cGUgaXMgbWFuZGF0b3J5LgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTkZDX0YgPSA0OworCisgICAgLyoqCisgICAgICogVGhpcyB0ZWNobm9sb2d5IGlzIGFuIGluc3RhbmNlIG9mIHtAbGluayBOZmNWfS4KKyAgICAgKiA8cD5TdXBwb3J0IGZvciB0aGlzIHRlY2hub2xvZ3kgdHlwZSBpcyBtYW5kYXRvcnkuCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBORkNfViA9IDU7CisKKyAgICAvKioKKyAgICAgKiBUaGlzIHRlY2hub2xvZ3kgaXMgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIE5kZWZ9LgorICAgICAqIDxwPlN1cHBvcnQgZm9yIHRoaXMgdGVjaG5vbG9neSB0eXBlIGlzIG1hbmRhdG9yeS4KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5ERUYgPSA2OworCisgICAgLyoqCisgICAgICogVGhpcyB0ZWNobm9sb2d5IGlzIGFuIGluc3RhbmNlIG9mIHtAbGluayBOZGVmRm9ybWF0YWJsZX0uCisgICAgICogPHA+U3VwcG9ydCBmb3IgdGhpcyB0ZWNobm9sb2d5IHR5cGUgaXMgbWFuZGF0b3J5LgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTkRFRl9GT1JNQVRBQkxFID0gNzsKKworICAgIC8qKgorICAgICAqIFRoaXMgdGVjaG5vbG9neSBpcyBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgTWlmYXJlQ2xhc3NpY30uCisgICAgICogPHA+U3VwcG9ydCBmb3IgdGhpcyB0ZWNobm9sb2d5IHR5cGUgaXMgb3B0aW9uYWwuIElmIGEgc3RhY2sgZG9lc24ndCBzdXBwb3J0IHRoaXMgdGVjaG5vbG9neQorICAgICAqIHR5cGUgdGFncyB1c2luZyBpdCBtdXN0IHN0aWxsIGJlIGRpc2NvdmVyZWQgYW5kIHByZXNlbnQgdGhlIGxvd2VyIGxldmVsIHJhZGlvIGludGVyZmFjZQorICAgICAqIHRlY2hub2xvZ2llcyBpbiB1c2UuCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNSUZBUkVfQ0xBU1NJQyA9IDg7CisKKyAgICAvKioKKyAgICAgKiBUaGlzIHRlY2hub2xvZ3kgaXMgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIE1pZmFyZVVsdHJhbGlnaHR9LgorICAgICAqIDxwPlN1cHBvcnQgZm9yIHRoaXMgdGVjaG5vbG9neSB0eXBlIGlzIG9wdGlvbmFsLiBJZiBhIHN0YWNrIGRvZXNuJ3Qgc3VwcG9ydCB0aGlzIHRlY2hub2xvZ3kKKyAgICAgKiB0eXBlIHRhZ3MgdXNpbmcgaXQgbXVzdCBzdGlsbCBiZSBkaXNjb3ZlcmVkIGFuZCBwcmVzZW50IHRoZSBsb3dlciBsZXZlbCByYWRpbyBpbnRlcmZhY2UKKyAgICAgKiB0ZWNobm9sb2dpZXMgaW4gdXNlLgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUlGQVJFX1VMVFJBTElHSFQgPSA5OworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgdGVjaG5vbG9neSB0eXBlIGZvciB0aGlzIHRhZyBjb25uZWN0aW9uLgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIGludCBnZXRUZWNobm9sb2d5SWQoKTsKKworICAgIC8qKgorICAgICAqIEdldCB0aGUge0BsaW5rIFRhZ30gb2JqZWN0IHRoaXMgdGVjaG5vbG9neSBjYW1lIGZyb20uCisgICAgICovCisgICAgcHVibGljIFRhZyBnZXRUYWcoKTsKKworICAgIC8qKgorICAgICAqIE9wZW5zIGEgY29ubmVjdGlvbiB0byB0aGUge0BsaW5rIFRhZ30gZW5hYmxpbmcgaW50ZXJhY3RpdmUgY29tbWFuZHMuIFRoZSBjb21tYW5kIHNldAorICAgICAqIHZhcmllcyBieSB0aGUgdGVjaG5vbG9neSB0eXBlLgorICAgICAqCisgICAgICogPHA+VGhpcyBtZXRob2QgYmxvY2tzIHVudGlsIHRoZSBjb25uZWN0aW9uIGhhcyBiZWVuIGVzdGFibGlzaGVkLgorICAgICAqCisgICAgICogPHA+QSBjYWxsIHRvIHtAbGluayAjY2xvc2V9IGZyb20gYW5vdGhlciB0aHJlYWQgd2lsbCBjYW5jZWwgYSBibG9ja2VkIGNhbGwgYW5kIGNhdXNlIGFuCisgICAgICogSU9FeGNlcHRpb24gdG8gYmUgdGhyb3duIG9uIHRoZSB0aHJlYWQgdGhhdCBpcyBibG9ja2VkLgorICAgICAqCisgICAgICogQHNlZSAjcmVjb25uZWN0KCkKKyAgICAgKiBAc2VlICNjbG9zZSgpCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiB0aGUgdGFyZ2V0IGlzIGxvc3QsIG9yIGNvbm5lY3QgY2FuY2VsZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjb25uZWN0KCkgdGhyb3dzIElPRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogUmUtY29ubmVjdCB0byB0aGUge0BsaW5rIFRhZ30gYXNzb2NpYXRlZCB3aXRoIHRoaXMgY29ubmVjdGlvbi4gUmVjb25uZWN0aW5nIHRvIGEgdGFnIGNhbiBiZQorICAgICAqIHVzZWQgdG8gcmVzZXQgdGhlIHN0YXRlIG9mIHRoZSB0YWcgaXRzZWxmLgorICAgICAqCisgICAgICogPHA+VGhpcyBtZXRob2QgYmxvY2tzIHVudGlsIHRoZSBjb25uZWN0aW9uIGlzIHJlLWVzdGFibGlzaGVkLgorICAgICAqCisgICAgICogPHA+QSBjYWxsIHRvIHtAbGluayAjY2xvc2V9IGZyb20gYW5vdGhlciB0aHJlYWQgd2lsbCBjYW5jZWwgYSBibG9ja2VkIGNhbGwgYW5kIGNhdXNlIGFuCisgICAgICogSU9FeGNlcHRpb24gdG8gYmUgdGhyb3duIG9uIHRoZSB0aHJlYWQgdGhhdCBpcyBibG9ja2VkLgorICAgICAqCisgICAgICogQHNlZSAjY29ubmVjdCgpCisgICAgICogQHNlZSAjY2xvc2UoKQorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZWNvbm5lY3QoKSB0aHJvd3MgSU9FeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBDbG9zZXMgdGhlIGNvbm5lY3Rpb24gdG8gdGhlIHtAbGluayBUYWd9LiBUaGlzIGNhbGwgaXMgbm9uLWJsb2NraW5nIGFuZCBjYXVzZXMgYWxsIGJsb2NraW5nCisgICAgICogb3BlcmF0aW9ucyBzdWNoIGFzIHtAbGluayAjY29ubmVjdH0gdG8gYmUgY2FuY2VsZWQgYW5kIGltbWVkaWF0ZWx5IHRocm93CisgICAgICoge0BsaW5rIGphdmEuaW8uSU9FeGNlcHRpb259IG9uIHRoZSB0aHJlYWQgdGhhdCBpcyBibG9ja2VkLgorICAgICAqCisgICAgICogPHA+CisgICAgICogT25jZSB0aGlzIG1ldGhvZCBpcyBjYWxsZWQsIHRoaXMgb2JqZWN0IGNhbm5vdCBiZSByZS11c2VkIGFuZCBzaG91bGQgYmUgZGlzY2FyZGVkLiBGdXJ0aGVyCisgICAgICogY2FsbHMgdG8ge0BsaW5rICNjb25uZWN0fSB3aWxsIGZhaWwuCisgICAgICoKKyAgICAgKiBAc2VlICNjb25uZWN0KCkKKyAgICAgKiBAc2VlICNyZWNvbm5lY3QoKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNsb3NlKCk7Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9uZmMvdGVjaG5vbG9neS9CYXNpY1RhZ1RlY2hub2xvZ3kuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL25mYy90ZWNobm9sb2d5L0Jhc2ljVGFnVGVjaG5vbG9neS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTNmNmVjLi4wMDAwMDAwCi0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL25mYy90ZWNobm9sb2d5L0Jhc2ljVGFnVGVjaG5vbG9neS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQubmZjLnRlY2hub2xvZ3k7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1pbXBvcnQgYW5kcm9pZC5uZmMuSU5mY0FkYXB0ZXI7Ci1pbXBvcnQgYW5kcm9pZC5uZmMuSU5mY1RhZzsKLWltcG9ydCBhbmRyb2lkLm5mYy5OZmNBZGFwdGVyOwotaW1wb3J0IGFuZHJvaWQubmZjLlRhZzsKLWltcG9ydCBhbmRyb2lkLm5mYy5FcnJvckNvZGVzOwotaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci0KLS8qKgotICogQSBiYXNlIGNsYXNzIGZvciB0YWcgdGVjaG5vbG9naWVzIHRoYXQgYXJlIGJ1aWx0IG9uIHRvcCBvZiB0cmFuc2NlaXZlKCkuCi0gKi8KLS8qIHBhY2thZ2UgKi8gYWJzdHJhY3QgY2xhc3MgQmFzaWNUYWdUZWNobm9sb2d5IGltcGxlbWVudHMgVGFnVGVjaG5vbG9neSB7Ci0KLSAgICAvKnBhY2thZ2UqLyBmaW5hbCBUYWcgbVRhZzsKLSAgICAvKnBhY2thZ2UqLyBib29sZWFuIG1Jc0Nvbm5lY3RlZDsKLSAgICAvKnBhY2thZ2UqLyBpbnQgbVNlbGVjdGVkVGVjaG5vbG9neTsKLSAgICBwcml2YXRlIGZpbmFsIE5mY0FkYXB0ZXIgbUFkYXB0ZXI7Ci0KLSAgICAvLyBGb2xsb3dpbmcgZmllbGRzIGFyZSBmaW5hbCBhZnRlciBjb25zdHJ1Y3Rpb24sIGV4Y2VwdCBmb3IKLSAgICAvLyBkdXJpbmcgYXR0ZW1wdERlYWRTZXJ2aWNlUmVjb3ZlcnkoKSB3aGVuIE5GQyBjcmFzaGVzLgotICAgIC8vIE5vdCBsb2NrZWQgLSB3ZSBhY2NlcHQgYSBiZXN0IGVmZm9ydCBhdHRlbXB0IHdoZW4gTkZDIGNyYXNoZXMuCi0gICAgLypwYWNrYWdlKi8gSU5mY0FkYXB0ZXIgbVNlcnZpY2U7Ci0gICAgLypwYWNrYWdlKi8gSU5mY1RhZyBtVGFnU2VydmljZTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiTkZDIjsKLQotICAgIC8qKgotICAgICAqIEBoaWRlCi0gICAgICovCi0gICAgcHVibGljIEJhc2ljVGFnVGVjaG5vbG9neShOZmNBZGFwdGVyIGFkYXB0ZXIsIFRhZyB0YWcsIGludCB0ZWNoKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKLSAgICAgICAgaW50W10gdGVjaExpc3QgPSB0YWcuZ2V0VGVjaG5vbG9neUxpc3QoKTsKLSAgICAgICAgaW50IGk7Ci0KLSAgICAgICAgLy8gQ2hlY2sgdGFyZ2V0IHZhbGlkaXR5Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCB0ZWNoTGlzdC5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaWYgKHRlY2ggPT0gdGVjaExpc3RbaV0pIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoaSA+PSB0ZWNoTGlzdC5sZW5ndGgpIHsKLSAgICAgICAgICAgIC8vIFRlY2hub2xvZ3kgbm90IGZvdW5kCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUZWNobm9sb2d5ICIgKyB0ZWNoICsgIiBub3QgcHJlc2VudCBvbiB0YWcgIiArIHRhZyk7Ci0gICAgICAgIH0KLQotICAgICAgICBtQWRhcHRlciA9IGFkYXB0ZXI7Ci0gICAgICAgIG1TZXJ2aWNlID0gbUFkYXB0ZXIuZ2V0U2VydmljZSgpOwotICAgICAgICB0cnkgewotICAgICAgICAgIG1UYWdTZXJ2aWNlID0gbVNlcnZpY2UuZ2V0TmZjVGFnSW50ZXJmYWNlKCk7Ci0gICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBhdHRlbXB0RGVhZFNlcnZpY2VSZWNvdmVyeShlKTsKLSAgICAgICAgfQotICAgICAgICBtVGFnID0gdGFnOwotICAgICAgICBtU2VsZWN0ZWRUZWNobm9sb2d5ID0gdGVjaDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAaGlkZQotICAgICAqLwotICAgIHB1YmxpYyBCYXNpY1RhZ1RlY2hub2xvZ3koTmZjQWRhcHRlciBhZGFwdGVyLCBUYWcgdGFnKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcyhhZGFwdGVyLCB0YWcsIHRhZy5nZXRUZWNobm9sb2d5TGlzdCgpWzBdKTsKLSAgICB9Ci0KLSAgICAvKiogTkZDIHNlcnZpY2UgZGVhZCAtIGF0dGVtcHQgYmVzdCBlZmZvcnQgcmVjb3ZlcnkgKi8KLSAgICAvKnBhY2thZ2UqLyB2b2lkIGF0dGVtcHREZWFkU2VydmljZVJlY292ZXJ5KEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIG1BZGFwdGVyLmF0dGVtcHREZWFkU2VydmljZVJlY292ZXJ5KGUpOwotICAgICAgICAvKiBhc3NpZ25pbmcgdG8gbVNlcnZpY2UgaXMgbm90IHRocmVhZC1zYWZlLCBidXQgdGhpcyBpcyBiZXN0LWVmZm9ydCBjb2RlCi0gICAgICAgICAqIGFuZCBvbiBhIHdlbGwtYmVoYXZlZCBzeXN0ZW0gc2hvdWxkIG5ldmVyIGhhcHBlbiAqLwotICAgICAgICBtU2VydmljZSA9IG1BZGFwdGVyLmdldFNlcnZpY2UoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG1UYWdTZXJ2aWNlID0gbVNlcnZpY2UuZ2V0TmZjVGFnSW50ZXJmYWNlKCk7Ci0gICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlMikgewotICAgICAgICAgICAgTG9nLmUoVEFHLCAic2Vjb25kIFJlbW90ZUV4Y2VwdGlvbiB0cnlpbmcgdG8gcmVjb3ZlciBmcm9tIGRlYWQgTkZDIHNlcnZpY2UiLCBlMik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIHtAbGluayBUYWd9IHRoaXMgY29ubmVjdGlvbiBpcyBhc3NvY2lhdGVkIHdpdGguCi0gICAgICogPHA+UmVxdWlyZXMge0BsaW5rIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbiNORkN9IHBlcm1pc3Npb24uCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFRhZyBnZXRUYWcoKSB7Ci0gICAgICAgIHJldHVybiBtVGFnOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNoZWNrQ29ubmVjdGVkKCkgewotICAgICAgIGlmICgobVRhZy5nZXRDb25uZWN0ZWRUZWNobm9sb2d5KCkgIT0gZ2V0VGVjaG5vbG9neUlkKCkpIHx8Ci0gICAgICAgICAgICAgICAobVRhZy5nZXRDb25uZWN0ZWRUZWNobm9sb2d5KCkgPT0gLTEpKSB7Ci0gICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkNhbGwgY29ubmVjdCgpIGZpcnN0ISIpOwotICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8cD5SZXF1aXJlcyB7QGxpbmsgYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uI05GQ30gcGVybWlzc2lvbi4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGdldFRlY2hub2xvZ3lJZCgpIHsKLSAgICAgICAgcmV0dXJuIG1TZWxlY3RlZFRlY2hub2xvZ3k7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSGVscGVyIHRvIGluZGljYXRlIGlmIHtAbGluayAjdHJhbnNjZWl2ZSB0cmFuc2NlaXZlKCl9IGNhbGxzIG1pZ2h0IHN1Y2NlZWQuCi0gICAgICogPHA+Ci0gICAgICogRG9lcyBub3QgY2F1c2UgUkYgYWN0aXZpdHksIGFuZCBkb2VzIG5vdCBibG9jay4KLSAgICAgKiA8cD5SZXF1aXJlcyB7QGxpbmsgYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uI05GQ30gcGVybWlzc2lvbi4KLSAgICAgKiBAcmV0dXJuIHRydWUgaWYge0BsaW5rICNjb25uZWN0fSBoYXMgY29tcGxldGVkIHN1Y2Nlc3NmdWxseSBhbmQgdGhlIHtAbGluayBUYWd9IGlzIGJlbGlldmVkCi0gICAgICogdG8gYmUgd2l0aGluIHJhbmdlLiBBcHBsaWNhdGlvbnMgbXVzdCBzdGlsbCBoYW5kbGUge0BsaW5rIGphdmEuaW8uSU9FeGNlcHRpb259Ci0gICAgICogd2hpbGUgdXNpbmcge0BsaW5rICN0cmFuc2NlaXZlIHRyYW5zY2VpdmUoKX0sIGluIGNhc2UgY29ubmVjdGlvbiBpcyBsb3N0IGFmdGVyIHRoaXMgbWV0aG9kCi0gICAgICogcmV0dXJucyB0cnVlLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzQ29ubmVjdGVkKCkgewotICAgICAgICBpZiAoIW1Jc0Nvbm5lY3RlZCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBtVGFnU2VydmljZS5pc1ByZXNlbnQobVRhZy5nZXRTZXJ2aWNlSGFuZGxlKCkpOwotICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgYXR0ZW1wdERlYWRTZXJ2aWNlUmVjb3ZlcnkoZSk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25uZWN0IHRvIHRoZSB7QGxpbmsgVGFnfSBhc3NvY2lhdGVkIHdpdGggdGhpcyBjb25uZWN0aW9uLgotICAgICAqIDxwPgotICAgICAqIFRoaXMgbWV0aG9kIGJsb2NrcyB1bnRpbCB0aGUgY29ubmVjdGlvbiBpcyBlc3RhYmxpc2hlZC4KLSAgICAgKiA8cD4KLSAgICAgKiB7QGxpbmsgI2Nsb3NlfSBjYW4gYmUgY2FsbGVkIGZyb20gYW5vdGhlciB0aHJlYWQgdG8gY2FuY2VsIHRoaXMgY29ubmVjdGlvbgotICAgICAqIGF0dGVtcHQuCi0gICAgICogPHA+UmVxdWlyZXMge0BsaW5rIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbiNORkN9IHBlcm1pc3Npb24uCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiB0aGUgdGFyZ2V0IGlzIGxvc3QsIG9yIGNvbm5lY3QgY2FuY2VsZWQKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBjb25uZWN0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGludCBlcnJvckNvZGUgPSBtVGFnU2VydmljZS5jb25uZWN0KG1UYWcuZ2V0U2VydmljZUhhbmRsZSgpLCBnZXRUZWNobm9sb2d5SWQoKSk7Ci0KLSAgICAgICAgICAgIGlmIChlcnJvckNvZGUgPT0gRXJyb3JDb2Rlcy5TVUNDRVNTKSB7Ci0gICAgICAgICAgICAgICAgLy8gU3RvcmUgdGhpcyBpbiB0aGUgdGFnIG9iamVjdAotICAgICAgICAgICAgICAgIG1UYWcuc2V0Q29ubmVjdGVkVGVjaG5vbG9neShnZXRUZWNobm9sb2d5SWQoKSk7Ci0gICAgICAgICAgICAgICAgbUlzQ29ubmVjdGVkID0gdHJ1ZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBhdHRlbXB0RGVhZFNlcnZpY2VSZWNvdmVyeShlKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiTkZDIHNlcnZpY2UgZGllZCIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmUtY29ubmVjdCB0byB0aGUge0BsaW5rIFRhZ30gYXNzb2NpYXRlZCB3aXRoIHRoaXMgY29ubmVjdGlvbi4KLSAgICAgKiA8cD4KLSAgICAgKiBSZWNvbm5lY3RpbmcgdG8gYSB0YWcgY2FuIGJlIHVzZWQgdG8gcmVzZXQgdGhlIHN0YXRlIG9mIHRoZSB0YWcgaXRzZWxmLgotICAgICAqIFRoaXMgbWV0aG9kIGJsb2NrcyB1bnRpbCB0aGUgY29ubmVjdGlvbiBpcyByZS1lc3RhYmxpc2hlZC4KLSAgICAgKiA8cD4KLSAgICAgKiB7QGxpbmsgI2Nsb3NlfSBjYW4gYmUgY2FsbGVkIGZyb20gYW5vdGhlciB0aHJlYWQgdG8gY2FuY2VsIHRoaXMgY29ubmVjdGlvbgotICAgICAqIGF0dGVtcHQuCi0gICAgICogPHA+UmVxdWlyZXMge0BsaW5rIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbiNORkN9IHBlcm1pc3Npb24uCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiB0aGUgdGFyZ2V0IGlzIGxvc3QsIG9yIGNvbm5lY3QgY2FuY2VsZWQKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCByZWNvbm5lY3QoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBpZiAoIW1Jc0Nvbm5lY3RlZCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVGVjaG5vbG9neSBub3QgY29ubmVjdGVkIHlldCIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBpbnQgZXJyb3JDb2RlID0gbVRhZ1NlcnZpY2UucmVjb25uZWN0KG1UYWcuZ2V0U2VydmljZUhhbmRsZSgpKTsKLQotICAgICAgICAgICAgICAgIGlmIChlcnJvckNvZGUgIT0gRXJyb3JDb2Rlcy5TVUNDRVNTKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Jc0Nvbm5lY3RlZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBtVGFnLnNldFRlY2hub2xvZ3lEaXNjb25uZWN0ZWQoKTsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBtSXNDb25uZWN0ZWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBtVGFnLnNldFRlY2hub2xvZ3lEaXNjb25uZWN0ZWQoKTsKLSAgICAgICAgICAgICAgICBhdHRlbXB0RGVhZFNlcnZpY2VSZWNvdmVyeShlKTsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIk5GQyBzZXJ2aWNlIGRpZWQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENsb3NlIHRoaXMgY29ubmVjdGlvbi4KLSAgICAgKiA8cD4KLSAgICAgKiBDYXVzZXMgYmxvY2tpbmcgb3BlcmF0aW9ucyBzdWNoIGFzIHtAbGluayAjdHJhbnNjZWl2ZSB0cmFuc2NlaXZlKCl9IG9yIHtAbGluayAjY29ubmVjdH0gdG8KLSAgICAgKiBiZSBjYW5jZWxlZCBhbmQgaW1tZWRpYXRlbHkgdGhyb3cge0BsaW5rIGphdmEuaW8uSU9FeGNlcHRpb259LgotICAgICAqIDxwPgotICAgICAqIE9uY2UgdGhpcyBtZXRob2QgaXMgY2FsbGVkLCB0aGlzIG9iamVjdCBjYW5ub3QgYmUgcmUtdXNlZCBhbmQgc2hvdWxkIGJlIGRpc2NhcmRlZC4gRnVydGhlcgotICAgICAqIGNhbGxzIHRvIHtAbGluayAjdHJhbnNjZWl2ZSB0cmFuc2NlaXZlKCl9IG9yIHtAbGluayAjY29ubmVjdH0gd2lsbCBmYWlsLgotICAgICAqIDxwPlJlcXVpcmVzIHtAbGluayBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24jTkZDfSBwZXJtaXNzaW9uLgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgLyogTm90ZSB0aGF0IHdlIGRvbid0IHdhbnQgdG8gcGh5c2ljYWxseSBkaXNjb25uZWN0IHRoZSB0YWcsCi0gICAgICAgICAgICAgKiBidXQganVzdCByZWNvbm5lY3QgdG8gaXQgdG8gcmVzZXQgaXRzIHN0YXRlCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIG1UYWdTZXJ2aWNlLnJlY29ubmVjdChtVGFnLmdldFNlcnZpY2VIYW5kbGUoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBhdHRlbXB0RGVhZFNlcnZpY2VSZWNvdmVyeShlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIG1Jc0Nvbm5lY3RlZCA9IGZhbHNlOwotICAgICAgICAgICAgbVRhZy5zZXRUZWNobm9sb2d5RGlzY29ubmVjdGVkKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZW5kIGRhdGEgdG8gYSB0YWcgYW5kIHJlY2VpdmUgdGhlIHJlc3BvbnNlLgotICAgICAqIDxwPgotICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgYmxvY2sgdW50aWwgdGhlIHJlc3BvbnNlIGlzIHJlY2VpdmVkLiBJdCBjYW4gYmUgY2FuY2VsZWQKLSAgICAgKiB3aXRoIHtAbGluayAjY2xvc2V9LgotICAgICAqIDxwPlJlcXVpcmVzIHtAbGluayBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24jTkZDfSBwZXJtaXNzaW9uLgotICAgICAqCi0gICAgICogQHBhcmFtIGRhdGEgYnl0ZXMgdG8gc2VuZAotICAgICAqIEByZXR1cm4gYnl0ZXMgcmVjZWl2ZWQgaW4gcmVzcG9uc2UKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIHRoZSB0YXJnZXQgaXMgbG9zdCBvciBjb25uZWN0aW9uIGNsb3NlZAotICAgICAqLwotICAgIHB1YmxpYyBieXRlW10gdHJhbnNjZWl2ZShieXRlW10gZGF0YSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgY2hlY2tDb25uZWN0ZWQoKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgYnl0ZVtdIHJlc3BvbnNlID0gbVRhZ1NlcnZpY2UudHJhbnNjZWl2ZShtVGFnLmdldFNlcnZpY2VIYW5kbGUoKSwgZGF0YSwgdHJ1ZSk7Ci0gICAgICAgICAgICBpZiAocmVzcG9uc2UgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigidHJhbnNjZWl2ZSBmYWlsZWQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiByZXNwb25zZTsKLSAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGF0dGVtcHREZWFkU2VydmljZVJlY292ZXJ5KGUpOwotICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJORkMgc2VydmljZSBkaWVkIik7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9uZmMvdGVjaG5vbG9neS9Jc29EZXAuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL25mYy90ZWNobm9sb2d5L0lzb0RlcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMmE3NTQyLi4wMDAwMDAwCi0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL25mYy90ZWNobm9sb2d5L0lzb0RlcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5uZmMudGVjaG5vbG9neTsKLQotaW1wb3J0IGFuZHJvaWQubmZjLk5mY0FkYXB0ZXI7Ci1pbXBvcnQgYW5kcm9pZC5uZmMuVGFnOwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotLyoqCi0gKiBBIGxvdy1sZXZlbCBjb25uZWN0aW9uIHRvIGEge0BsaW5rIFRhZ30gdXNpbmcgdGhlIElTTy1ERVAgdGVjaG5vbG9neSwgYWxzbyBrbm93biBhcwotICogSVNPMTQ0My00LgotICoKLSAqIDxwPllvdSBjYW4gYWNxdWlyZSB0aGlzIGtpbmQgb2YgY29ubmVjdGlvbiB3aXRoIHtAbGluayBUYWcjZ2V0VGVjaG5vbG9neShpbnQpfS4KLSAqIFVzZSB0aGlzIGNsYXNzIHRvIHNlbmQgYW5kIHJlY2VpdmUgZGF0YSB3aXRoIHtAbGluayAjdHJhbnNjZWl2ZSB0cmFuc2NlaXZlKCl9LgotICoKLSAqIDxwPkFwcGxpY2F0aW9ucyBtdXN0IGltcGxlbWVudCB0aGVpciBvd24gcHJvdG9jb2wgc3RhY2sgb24gdG9wIG9mCi0gKiB7QGxpbmsgI3RyYW5zY2VpdmUgdHJhbnNjZWl2ZSgpfS4KLSAqCi0gKiA8cCBjbGFzcz0ibm90ZSI+PHN0cm9uZz5Ob3RlOjwvc3Ryb25nPgotICogVXNlIG9mIHRoaXMgY2xhc3MgcmVxdWlyZXMgdGhlIHtAbGluayBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24jTkZDfQotICogcGVybWlzc2lvbi4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIElzb0RlcCBleHRlbmRzIEJhc2ljVGFnVGVjaG5vbG9neSB7Ci0gICAgLyoqIEBoaWRlICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfSElfTEFZRVJfUkVTUCA9ICJoaXJlc3AiOwotICAgIC8qKiBAaGlkZSAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX0hJU1RfQllURVMgPSAiaGlzdGJ5dGVzIjsKLQotICAgIHByaXZhdGUgYnl0ZVtdIG1IaUxheWVyUmVzcG9uc2UgPSBudWxsOwotICAgIHByaXZhdGUgYnl0ZVtdIG1IaXN0Qnl0ZXMgPSBudWxsOwotCi0gICAgcHVibGljIElzb0RlcChOZmNBZGFwdGVyIGFkYXB0ZXIsIFRhZyB0YWcsIEJ1bmRsZSBleHRyYXMpCi0gICAgICAgICAgICB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIoYWRhcHRlciwgdGFnLCBUYWdUZWNobm9sb2d5LklTT19ERVApOwotICAgICAgICBpZiAoZXh0cmFzICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1IaUxheWVyUmVzcG9uc2UgPSBleHRyYXMuZ2V0Qnl0ZUFycmF5KEVYVFJBX0hJX0xBWUVSX1JFU1ApOwotICAgICAgICAgICAgbUhpc3RCeXRlcyA9IGV4dHJhcy5nZXRCeXRlQXJyYXkoRVhUUkFfSElTVF9CWVRFUyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAzQSBvbmx5Ci0gICAgICovCi0gICAgcHVibGljIGJ5dGVbXSBnZXRIaXN0b3JpY2FsQnl0ZXMoKSB7IHJldHVybiBtSGlzdEJ5dGVzOyB9Ci0KLSAgICAvKioKLSAgICAgKiAzQiBvbmx5Ci0gICAgICovCi0gICAgcHVibGljIGJ5dGVbXSBnZXRIaUxheWVyUmVzcG9uc2UoKSB7IHJldHVybiBtSGlMYXllclJlc3BvbnNlOyB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9uZmMvdGVjaG5vbG9neS9NaWZhcmVVbHRyYWxpZ2h0LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9uZmMvdGVjaG5vbG9neS9NaWZhcmVVbHRyYWxpZ2h0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxMDNiNGQuLjAwMDAwMDAKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvbmZjL3RlY2hub2xvZ3kvTWlmYXJlVWx0cmFsaWdodC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQubmZjLnRlY2hub2xvZ3k7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1pbXBvcnQgYW5kcm9pZC5uZmMuTmZjQWRhcHRlcjsKLWltcG9ydCBhbmRyb2lkLm5mYy5UYWc7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247Ci0KLS8qKgotICogQ29uY3JldGUgY2xhc3MgZm9yIFRhZ1RlY2hub2xvZ3kuTUlGQVJFX1VMVFJBTElHSFQKLSAqCi0gKiBNaWZhcmUgY2xhc3NpYyBoYXMgbiBzZWN0b3JzLCB3aXRoIHZhcnlpbmcgc2l6ZXMsIGFsdGhvdWdoCi0gKiB0aGV5IGFyZSBhdCBsZWFzdCB0aGUgc2FtZSBwYXR0ZXJuIGZvciBhbnkgb25lIG1pZmFyZSBjbGFzc2ljCi0gKiBwcm9kdWN0LiBFYWNoIHNlY3RvciBoYXMgdHdvIGtleXMuIEF1dGhlbnRpY2F0aW9uIHdpdGggdGhlIGNvcnJlY3QKLSAqIGtleSBpcyBuZWVkZWQgYmVmb3JlIGFjY2VzcyB0byBhbnkgc2VjdG9yLgotICoKLSAqIEVhY2ggc2VjdG9yIGhhcyBrIGJsb2Nrcy4KLSAqIEJsb2NrIHNpemUgaXMgY29uc3RhbnQgYWNyb3NzIHRoZSB3aG9sZSBtaWZhcmUgY2xhc3NpYyBmYW1pbHkuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBNaWZhcmVVbHRyYWxpZ2h0IGV4dGVuZHMgQmFzaWNUYWdUZWNobm9sb2d5IHsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX1VMVFJBTElHSFQgPSAxOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfVUxUUkFMSUdIVF9DID0gMjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX1VOS05PV04gPSAxMDsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBOWFBfTUFOVUZBQ1RVUkVSX0lEID0gMHgwNDsKLQotICAgIHByaXZhdGUgaW50IG1UeXBlOwotCi0gICAgcHVibGljIE1pZmFyZVVsdHJhbGlnaHQoTmZjQWRhcHRlciBhZGFwdGVyLCBUYWcgdGFnLCBCdW5kbGUgZXh0cmFzKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIoYWRhcHRlciwgdGFnLCBUYWdUZWNobm9sb2d5Lk1JRkFSRV9VTFRSQUxJR0hUKTsKLQotICAgICAgICAvLyBDaGVjayBpZiB0aGlzIGNvdWxkIGFjdHVhbGx5IGJlIGEgTWlmYXJlCi0gICAgICAgIE5mY0EgYSA9IChOZmNBKSB0YWcuZ2V0VGVjaG5vbG9neShhZGFwdGVyLCBUYWdUZWNobm9sb2d5Lk5GQ19BKTsKLQotICAgICAgICBtVHlwZSA9IFRZUEVfVU5LTk9XTjsKLQotICAgICAgICBpZiggYS5nZXRTYWsoKSA9PSAweDAwICYmIHRhZy5nZXRJZCgpWzBdID09IE5YUF9NQU5VRkFDVFVSRVJfSUQgKSB7Ci0gICAgICAgICAgICAvLyBjb3VsZCBiZSBVTCBvciBVTC1DCi0gICAgICAgICAgICBtVHlwZSA9IFRZUEVfVUxUUkFMSUdIVDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0VHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIG1UeXBlOwotICAgIH0KLQotICAgIC8vIE1ldGhvZHMgdGhhdCByZXF1aXJlIGNvbm5lY3QoKQotICAgIC8qKgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgYnl0ZVtdIHJlYWRCbG9jayhpbnQgYmxvY2spIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGNoZWNrQ29ubmVjdGVkKCk7Ci0KLSAgICAgICAgYnl0ZVtdIGJsb2NrcmVhZF9jbWQgPSB7IDB4MzAsIChieXRlKWJsb2NrIH07IC8vIHBoSGFsX2VNaWZhcmVSZWFkCi0gICAgICAgIHJldHVybiB0cmFuc2NlaXZlKGJsb2NrcmVhZF9jbWQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgYnl0ZVtdIHJlYWRPVFAoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBjaGVja0Nvbm5lY3RlZCgpOwotCi0gICAgICAgIHJldHVybiByZWFkQmxvY2soMyk7IC8vIE9UUCBpcyBhdCBwYWdlIDMKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZVBhZ2UoaW50IGJsb2NrLCBieXRlW10gZGF0YSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgY2hlY2tDb25uZWN0ZWQoKTsKLQotICAgICAgICBieXRlW10gcGFnZXdyaXRlX2NtZCA9IG5ldyBieXRlW2RhdGEubGVuZ3RoICsgMl07Ci0gICAgICAgIHBhZ2V3cml0ZV9jbWRbMF0gPSAoYnl0ZSkgMHhBMjsKLSAgICAgICAgcGFnZXdyaXRlX2NtZFsxXSA9IChieXRlKSBibG9jazsKLSAgICAgICAgU3lzdGVtLmFycmF5Y29weShkYXRhLCAwLCBwYWdld3JpdGVfY21kLCAyLCBkYXRhLmxlbmd0aCk7Ci0KLSAgICAgICAgdHJhbnNjZWl2ZShwYWdld3JpdGVfY21kKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZUJsb2NrKGludCBibG9jaywgYnl0ZVtdIGRhdGEpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGNoZWNrQ29ubmVjdGVkKCk7Ci0KLSAgICAgICAgYnl0ZVtdIGJsb2Nrd3JpdGVfY21kID0gbmV3IGJ5dGVbZGF0YS5sZW5ndGggKyAyXTsKLSAgICAgICAgYmxvY2t3cml0ZV9jbWRbMF0gPSAoYnl0ZSkgMHhBMDsKLSAgICAgICAgYmxvY2t3cml0ZV9jbWRbMV0gPSAoYnl0ZSkgYmxvY2s7Ci0gICAgICAgIFN5c3RlbS5hcnJheWNvcHkoZGF0YSwgMCwgYmxvY2t3cml0ZV9jbWQsIDIsIGRhdGEubGVuZ3RoKTsKLQotICAgICAgICB0cmFuc2NlaXZlKGJsb2Nrd3JpdGVfY21kKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZW5kIGRhdGEgdG8gYSB0YWcgYW5kIHJlY2VpdmUgdGhlIHJlc3BvbnNlLgotICAgICAqIDxwPgotICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgYmxvY2sgdW50aWwgdGhlIHJlc3BvbnNlIGlzIHJlY2VpdmVkLiBJdCBjYW4gYmUgY2FuY2VsZWQKLSAgICAgKiB3aXRoIHtAbGluayAjY2xvc2V9LgotICAgICAqIDxwPlJlcXVpcmVzIHtAbGluayBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24jTkZDfSBwZXJtaXNzaW9uLgotICAgICAqCi0gICAgICogQHBhcmFtIGRhdGEgYnl0ZXMgdG8gc2VuZAotICAgICAqIEByZXR1cm4gYnl0ZXMgcmVjZWl2ZWQgaW4gcmVzcG9uc2UKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIHRoZSB0YXJnZXQgaXMgbG9zdCBvciBjb25uZWN0aW9uIGNsb3NlZAotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBieXRlW10gdHJhbnNjZWl2ZShieXRlW10gZGF0YSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgY2hlY2tDb25uZWN0ZWQoKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgYnl0ZVtdIHJlc3BvbnNlID0gbVRhZ1NlcnZpY2UudHJhbnNjZWl2ZShtVGFnLmdldFNlcnZpY2VIYW5kbGUoKSwgZGF0YSwgZmFsc2UpOwotICAgICAgICAgICAgaWYgKHJlc3BvbnNlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oInRyYW5zY2VpdmUgZmFpbGVkIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gcmVzcG9uc2U7Ci0gICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBhdHRlbXB0RGVhZFNlcnZpY2VSZWNvdmVyeShlKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiTkZDIHNlcnZpY2UgZGllZCIpOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9uZmMvdGVjaG5vbG9neS9OZmNBLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9uZmMvdGVjaG5vbG9neS9OZmNBLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmNDY3NjIuLjAwMDAwMDAKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvbmZjL3RlY2hub2xvZ3kvTmZjQS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5uZmMudGVjaG5vbG9neTsKLQotaW1wb3J0IGFuZHJvaWQubmZjLk5mY0FkYXB0ZXI7Ci1pbXBvcnQgYW5kcm9pZC5uZmMuVGFnOwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOwotCi0vKioKLSAqIEEgbG93LWxldmVsIGNvbm5lY3Rpb24gdG8gYSB7QGxpbmsgVGFnfSB1c2luZyB0aGUgTkZDLUEgdGVjaG5vbG9neSwgYWxzbyBrbm93biBhcwotICogSVNPMTQ0My0zQS4KLSAqCi0gKiA8cD5Zb3UgY2FuIGFjcXVpcmUgdGhpcyBraW5kIG9mIGNvbm5lY3Rpb24gd2l0aCB7QGxpbmsgVGFnI2dldFRlY2hub2xvZ3koaW50KX0uCi0gKiBVc2UgdGhpcyBjbGFzcyB0byBzZW5kIGFuZCByZWNlaXZlIGRhdGEgd2l0aCB7QGxpbmsgI3RyYW5zY2VpdmUgdHJhbnNjZWl2ZSgpfS4KLSAqCi0gKiA8cD5BcHBsaWNhdGlvbnMgbXVzdCBpbXBsZW1lbnQgdGhlaXIgb3duIHByb3RvY29sIHN0YWNrIG9uIHRvcCBvZgotICoge0BsaW5rICN0cmFuc2NlaXZlIHRyYW5zY2VpdmUoKX0uCi0gKgotICogPHAgY2xhc3M9Im5vdGUiPjxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4KLSAqIFVzZSBvZiB0aGlzIGNsYXNzIHJlcXVpcmVzIHRoZSB7QGxpbmsgYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uI05GQ30KLSAqIHBlcm1pc3Npb24uCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBOZmNBIGV4dGVuZHMgQmFzaWNUYWdUZWNobm9sb2d5IHsKLSAgICAvKiogQGhpZGUgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9TQUsgPSAic2FrIjsKLSAgICAvKiogQGhpZGUgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9BVFFBID0gImF0cWEiOwotCi0gICAgcHJpdmF0ZSBzaG9ydCBtU2FrOwotICAgIHByaXZhdGUgYnl0ZVtdIG1BdHFhOwotCi0gICAgcHVibGljIE5mY0EoTmZjQWRhcHRlciBhZGFwdGVyLCBUYWcgdGFnLCBCdW5kbGUgZXh0cmFzKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIoYWRhcHRlciwgdGFnLCBUYWdUZWNobm9sb2d5Lk5GQ19BKTsKLSAgICAgICAgbVNhayA9IGV4dHJhcy5nZXRTaG9ydChFWFRSQV9TQUspOwotICAgICAgICBtQXRxYSA9IGV4dHJhcy5nZXRCeXRlQXJyYXkoRVhUUkFfQVRRQSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgQVRRQS9TRU5TX1JFUyBieXRlcyBkaXNjb3ZlcmVkIGF0IHRhZyBkaXNjb3ZlcnkuCi0gICAgICovCi0gICAgcHVibGljIGJ5dGVbXSBnZXRBdHFhKCkgewotICAgICAgICByZXR1cm4gbUF0cWE7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgU0FLL1NFTF9SRVMgZGlzY292ZXJlZCBhdCB0YWcgZGlzY292ZXJ5LgotICAgICAqLwotICAgIHB1YmxpYyBzaG9ydCBnZXRTYWsoKSB7Ci0gICAgICAgIHJldHVybiBtU2FrOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL25mYy90ZWNobm9sb2d5L05mY0YuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL25mYy90ZWNobm9sb2d5L05mY0YuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjc0MWFjOC4uMDAwMDAwMAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9uZmMvdGVjaG5vbG9neS9OZmNGLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLm5mYy50ZWNobm9sb2d5OwotCi1pbXBvcnQgYW5kcm9pZC5uZmMuTmZjQWRhcHRlcjsKLWltcG9ydCBhbmRyb2lkLm5mYy5UYWc7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247Ci0KLS8qKgotICogQSBsb3ctbGV2ZWwgY29ubmVjdGlvbiB0byBhIHtAbGluayBUYWd9IHVzaW5nIHRoZSBORkMtRiB0ZWNobm9sb2d5LCBhbHNvIGtub3duIGFzCi0gKiBKSVM2MzE5LTQuCi0gKgotICogPHA+WW91IGNhbiBhY3F1aXJlIHRoaXMga2luZCBvZiBjb25uZWN0aW9uIHdpdGgge0BsaW5rIFRhZyNnZXRUZWNobm9sb2d5KGludCl9LgotICogVXNlIHRoaXMgY2xhc3MgdG8gc2VuZCBhbmQgcmVjZWl2ZSBkYXRhIHdpdGgge0BsaW5rICN0cmFuc2NlaXZlIHRyYW5zY2VpdmUoKX0uCi0gKgotICogPHA+QXBwbGljYXRpb25zIG11c3QgaW1wbGVtZW50IHRoZWlyIG93biBwcm90b2NvbCBzdGFjayBvbiB0b3Agb2YKLSAqIHtAbGluayAjdHJhbnNjZWl2ZSB0cmFuc2NlaXZlKCl9LgotICoKLSAqIDxwIGNsYXNzPSJub3RlIj48c3Ryb25nPk5vdGU6PC9zdHJvbmc+Ci0gKiBVc2Ugb2YgdGhpcyBjbGFzcyByZXF1aXJlcyB0aGUge0BsaW5rIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbiNORkN9Ci0gKiBwZXJtaXNzaW9uLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTmZjRiBleHRlbmRzIEJhc2ljVGFnVGVjaG5vbG9neSB7Ci0gICAgLyoqIEBoaWRlICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfU0MgPSAic3lzdGVtY29kZSI7Ci0gICAgLyoqIEBoaWRlICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfUE1NID0gInBtbSI7Ci0KLSAgICBwcml2YXRlIGJ5dGVbXSBtU3lzdGVtQ29kZSA9IG51bGw7Ci0gICAgcHJpdmF0ZSBieXRlW10gbU1hbnVmYWN0dXJlciA9IG51bGw7Ci0KLSAgICBwdWJsaWMgTmZjRihOZmNBZGFwdGVyIGFkYXB0ZXIsIFRhZyB0YWcsIEJ1bmRsZSBleHRyYXMpCi0gICAgICAgICAgICB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIoYWRhcHRlciwgdGFnLCBUYWdUZWNobm9sb2d5Lk5GQ19GKTsKLSAgICAgICAgaWYgKGV4dHJhcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtU3lzdGVtQ29kZSA9IGV4dHJhcy5nZXRCeXRlQXJyYXkoRVhUUkFfU0MpOwotICAgICAgICAgICAgbU1hbnVmYWN0dXJlciA9IGV4dHJhcy5nZXRCeXRlQXJyYXkoRVhUUkFfUE1NKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBieXRlW10gZ2V0U3lzdGVtQ29kZSgpIHsKLSAgICAgIHJldHVybiBtU3lzdGVtQ29kZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYnl0ZVtdIGdldE1hbnVmYWN0dXJlcigpIHsKLSAgICAgIHJldHVybiBtTWFudWZhY3R1cmVyOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL25mYy90ZWNobm9sb2d5L05mY1YuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL25mYy90ZWNobm9sb2d5L05mY1YuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDYwZGU2YS4uMDAwMDAwMAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9uZmMvdGVjaG5vbG9neS9OZmNWLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLm5mYy50ZWNobm9sb2d5OwotCi1pbXBvcnQgYW5kcm9pZC5uZmMuTmZjQWRhcHRlcjsKLWltcG9ydCBhbmRyb2lkLm5mYy5UYWc7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247Ci0KLS8qKgotICogQSBsb3ctbGV2ZWwgY29ubmVjdGlvbiB0byBhIHtAbGluayBUYWd9IHVzaW5nIHRoZSBORkMtViB0ZWNobm9sb2d5LCBhbHNvIGtub3duIGFzCi0gKiBJU08xNTY5My4KLSAqCi0gKiA8cD5Zb3UgY2FuIGFjcXVpcmUgdGhpcyBraW5kIG9mIGNvbm5lY3Rpb24gd2l0aCB7QGxpbmsgVGFnI2dldFRlY2hub2xvZ3koaW50KX0uCi0gKiBVc2UgdGhpcyBjbGFzcyB0byBzZW5kIGFuZCByZWNlaXZlIGRhdGEgd2l0aCB7QGxpbmsgI3RyYW5zY2VpdmUgdHJhbnNjZWl2ZSgpfS4KLSAqCi0gKiA8cD5BcHBsaWNhdGlvbnMgbXVzdCBpbXBsZW1lbnQgdGhlaXIgb3duIHByb3RvY29sIHN0YWNrIG9uIHRvcCBvZgotICoge0BsaW5rICN0cmFuc2NlaXZlIHRyYW5zY2VpdmUoKX0uCi0gKgotICogPHAgY2xhc3M9Im5vdGUiPjxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4KLSAqIFVzZSBvZiB0aGlzIGNsYXNzIHJlcXVpcmVzIHRoZSB7QGxpbmsgYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uI05GQ30KLSAqIHBlcm1pc3Npb24uCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBOZmNWIGV4dGVuZHMgQmFzaWNUYWdUZWNobm9sb2d5IHsKLSAgICAvKiogQGhpZGUgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9SRVNQX0ZMQUdTID0gInJlc3BmbGFncyI7Ci0KLSAgICAvKiogQGhpZGUgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9EU0ZJRCA9ICJkc2ZpZCI7Ci0KLSAgICBwcml2YXRlIGJ5dGUgbVJlc3BGbGFnczsKLSAgICBwcml2YXRlIGJ5dGUgbURzZklkOwotCi0gICAgcHVibGljIE5mY1YoTmZjQWRhcHRlciBhZGFwdGVyLCBUYWcgdGFnLCBCdW5kbGUgZXh0cmFzKQotICAgICAgICAgICAgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyKGFkYXB0ZXIsIHRhZywgVGFnVGVjaG5vbG9neS5ORkNfVik7Ci0gICAgICAgIG1SZXNwRmxhZ3MgPSBleHRyYXMuZ2V0Qnl0ZShFWFRSQV9SRVNQX0ZMQUdTKTsKLSAgICAgICAgbURzZklkID0gZXh0cmFzLmdldEJ5dGUoRVhUUkFfRFNGSUQpOwotICAgIH0KLQotICAgIHB1YmxpYyBieXRlIGdldFJlc3BvbnNlRmxhZ3MoKSB7Ci0gICAgICAgIHJldHVybiBtUmVzcEZsYWdzOwotICAgIH0KLQotICAgIHB1YmxpYyBieXRlIGdldERzZklkKCkgewotICAgICAgICByZXR1cm4gbURzZklkOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL25mYy90ZWNobm9sb2d5L1RhZ1RlY2hub2xvZ3kuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL25mYy90ZWNobm9sb2d5L1RhZ1RlY2hub2xvZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjIyMTZjMS4uMDAwMDAwMAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9uZmMvdGVjaG5vbG9neS9UYWdUZWNobm9sb2d5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLm5mYy50ZWNobm9sb2d5OwotCi1pbXBvcnQgYW5kcm9pZC5uZmMuVGFnOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotcHVibGljIGludGVyZmFjZSBUYWdUZWNobm9sb2d5IHsKLSAgICAvKioKLSAgICAgKiBUaGlzIG9iamVjdCBpcyBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgTmZjQX0KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBORkNfQSA9IDE7Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIG9iamVjdCBpcyBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgTmZjQn0KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBORkNfQiA9IDI7Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIG9iamVjdCBpcyBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgSXNvRGVwfQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElTT19ERVAgPSAzOwotCi0gICAgLyoqCi0gICAgICogVGhpcyBvYmplY3QgaXMgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIE5mY0Z9Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTkZDX0YgPSA0OwotCi0gICAgLyoqCi0gICAgICogVGhpcyBvYmplY3QgaXMgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIE5mY1Z9Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTkZDX1YgPSA1OwotCi0gICAgLyoqCi0gICAgICogVGhpcyBvYmplY3QgaXMgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIE5kZWZ9Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTkRFRiA9IDY7Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIG9iamVjdCBpcyBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgTmRlZkZvcm1hdGFibGV9Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTkRFRl9GT1JNQVRBQkxFID0gNzsKLQotICAgIC8qKgotICAgICAqIFRoaXMgb2JqZWN0IGlzIGFuIGluc3RhbmNlIG9mIHtAbGluayBNaWZhcmVDbGFzc2ljfQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1JRkFSRV9DTEFTU0lDID0gODsKLQotICAgIC8qKgotICAgICAqIFRoaXMgb2JqZWN0IGlzIGFuIGluc3RhbmNlIG9mIHtAbGluayBNaWZhcmVVbHRyYWxpZ2h0fQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1JRkFSRV9VTFRSQUxJR0hUID0gOTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHRlY2hub2xvZ3kgdHlwZSBmb3IgdGhpcyB0YWcgY29ubmVjdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldFRlY2hub2xvZ3lJZCgpOwotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBiYWNraW5nIHRhZyBvYmplY3QuCi0gICAgICovCi0gICAgcHVibGljIFRhZyBnZXRUYWcoKTsKLQotICAgIC8qKgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjb25uZWN0KCkgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlY29ubmVjdCgpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIE5vbi1ibG9ja2luZy4gSW1tZWRpYXRlbHkgY2F1c2VzIGFsbCBibG9ja2luZyBjYWxscwotICAgICAqIHRvIHRocm93IElPRXhjZXB0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNsb3NlKCk7Ci19CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9uZmMvdGVjaG5vbG9neS9wYWNrYWdlLmh0bWwgYi9jb3JlL2phdmEvYW5kcm9pZC9uZmMvdGVjaG5vbG9neS9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2YjhhMzIuLjAwMDAwMDAKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvbmZjL3RlY2hub2xvZ3kvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08SFRNTD4KLTxCT0RZPgote0BoaWRlfQotPC9CT0RZPgotPC9IVE1MPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3NlcnZpY2Uvd2FsbHBhcGVyL1dhbGxwYXBlclNlcnZpY2UuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3NlcnZpY2Uvd2FsbHBhcGVyL1dhbGxwYXBlclNlcnZpY2UuamF2YQppbmRleCA1MmIwNjQzLi5hODU5ZTNjIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9zZXJ2aWNlL3dhbGxwYXBlci9XYWxscGFwZXJTZXJ2aWNlLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvc2VydmljZS93YWxscGFwZXIvV2FsbHBhcGVyU2VydmljZS5qYXZhCkBAIC01MTcsOCArNTE3LDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICBtTGF5b3V0LndpbmRvd0FuaW1hdGlvbnMgPQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlLkFuaW1hdGlvbl9XYWxscGFwZXI7CiAgICAgICAgICAgICAgICAgICAgICAgICBtSW5wdXRDaGFubmVsID0gbmV3IElucHV0Q2hhbm5lbCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgbVNlc3Npb24uYWRkKG1XaW5kb3csIG1MYXlvdXQsIFZpZXcuVklTSUJMRSwgbUNvbnRlbnRJbnNldHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1JbnB1dENoYW5uZWwpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1TZXNzaW9uLmFkZChtV2luZG93LCBtTGF5b3V0LCBWaWV3LlZJU0lCTEUsIG1Db250ZW50SW5zZXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSW5wdXRDaGFubmVsKSA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJGYWlsZWQgdG8gYWRkIHdpbmRvdyB3aGlsZSB1cGRhdGluZyB3YWxscGFwZXIgc3VyZmFjZS4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICBtQ3JlYXRlZCA9IHRydWU7CiAKICAgICAgICAgICAgICAgICAgICAgICAgIElucHV0UXVldWUucmVnaXN0ZXJJbnB1dENoYW5uZWwobUlucHV0Q2hhbm5lbCwgbUlucHV0SGFuZGxlciwKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3NwZWVjaC90dHMvVGV4dFRvU3BlZWNoLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9zcGVlY2gvdHRzL1RleHRUb1NwZWVjaC5qYXZhCmluZGV4IGM0NmQyYzUuLjZkN2I3Y2UgMTAwNzU1Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3NwZWVjaC90dHMvVGV4dFRvU3BlZWNoLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvc3BlZWNoL3R0cy9UZXh0VG9TcGVlY2guamF2YQpAQCAtNTEyLDEwICs1MTIsMTcgQEAKIAogICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudCgiYW5kcm9pZC5pbnRlbnQuYWN0aW9uLlNUQVJUX1RUU19TRVJWSUNFIik7CiAgICAgICAgIGludGVudC5hZGRDYXRlZ29yeSgiYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuVFRTIik7Ci0gICAgICAgIG1Db250ZXh0LmJpbmRTZXJ2aWNlKGludGVudCwgbVNlcnZpY2VDb25uZWN0aW9uLAotICAgICAgICAgICAgICAgIENvbnRleHQuQklORF9BVVRPX0NSRUFURSk7Ci0gICAgICAgIC8vIFRPRE8gaGFuZGxlIGNhc2Ugd2hlcmUgdGhlIGJpbmRpbmcgd29ya3MgKHNob3VsZCBhbHdheXMgd29yaykgYnV0Ci0gICAgICAgIC8vICAgICAgdGhlIHBsdWdpbiBmYWlscworICAgICAgICBib29sZWFuIGJvdW5kID0gbUNvbnRleHQuYmluZFNlcnZpY2UoaW50ZW50LCBtU2VydmljZUNvbm5lY3Rpb24sIENvbnRleHQuQklORF9BVVRPX0NSRUFURSk7CisgICAgICAgIGlmICghYm91bmQpIHsKKyAgICAgICAgICAgIExvZy5lKCJUZXh0VG9TcGVlY2guamF2YSIsICJpbml0VHRzKCkgZmFpbGVkIHRvIGJpbmQgdG8gc2VydmljZSIpOworICAgICAgICAgICAgaWYgKG1Jbml0TGlzdGVuZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1Jbml0TGlzdGVuZXIub25Jbml0KEVSUk9SKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIGluaXRpYWxpemF0aW9uIGxpc3RlbmVyIHdpbGwgYmUgY2FsbGVkIGluc2lkZSBTZXJ2aWNlQ29ubmVjdGlvbgorICAgICAgICAgICAgTG9nLmkoIlRleHRUb1NwZWVjaC5qYXZhIiwgImluaXRUdHMoKSBzdWNjZXNzZnVsbHkgYm91bmQgdG8gc2VydmljZSIpOworICAgICAgICB9CisgICAgICAgIC8vIFRPRE8gaGFuZGxlIHBsdWdpbiBmYWlsdXJlcwogICAgIH0KIAogCkBAIC03NjUsOCArNzcyLDkgQEAKICAgICB7CiAgICAgICAgIHN5bmNocm9uaXplZCAobVN0YXJ0TG9jaykgewogICAgICAgICAgICAgaW50IHJlc3VsdCA9IEVSUk9SOwotICAgICAgICAgICAgTG9nLmkoIlRUUyIsICJzcGVhaygpIHF1ZXVlTW9kZT0iICsgcXVldWVNb2RlKTsKKyAgICAgICAgICAgIExvZy5pKCJUZXh0VG9TcGVlY2guamF2YSAtIHNwZWFrIiwgInNwZWFrIHRleHQgb2YgbGVuZ3RoICIgKyB0ZXh0Lmxlbmd0aCgpKTsKICAgICAgICAgICAgIGlmICghbVN0YXJ0ZWQpIHsKKyAgICAgICAgICAgICAgICBMb2cuZSgiVGV4dFRvU3BlZWNoLmphdmEgLSBzcGVhayIsICJzZXJ2aWNlIGlzbid0IHN0YXJ0ZWQiKTsKICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICAgICAgfQogICAgICAgICAgICAgdHJ5IHsKQEAgLTEyNjQsMTAgKzEyNzIsMTMgQEAKICAgICAgKi8KICAgICBwdWJsaWMgaW50IHN5bnRoZXNpemVUb0ZpbGUoU3RyaW5nIHRleHQsIEhhc2hNYXA8U3RyaW5nLFN0cmluZz4gcGFyYW1zLAogICAgICAgICAgICAgU3RyaW5nIGZpbGVuYW1lKSB7Ci0gICAgICAgIExvZy5pKCJUVFMiLCAic3ludGhlc2l6ZVRvRmlsZSgpIik7CisgICAgICAgIExvZy5pKCJUZXh0VG9TcGVlY2guamF2YSIsICJzeW50aGVzaXplVG9GaWxlKCkiKTsKICAgICAgICAgc3luY2hyb25pemVkIChtU3RhcnRMb2NrKSB7CiAgICAgICAgICAgICBpbnQgcmVzdWx0ID0gRVJST1I7CisgICAgICAgICAgICBMb2cuaSgiVGV4dFRvU3BlZWNoLmphdmEgLSBzeW50aGVzaXplVG9GaWxlIiwgInN5bnRoZXNpemVUb0ZpbGUgdGV4dCBvZiBsZW5ndGggIgorICAgICAgICAgICAgICAgICAgICArIHRleHQubGVuZ3RoKCkpOwogICAgICAgICAgICAgaWYgKCFtU3RhcnRlZCkgeworICAgICAgICAgICAgICAgIExvZy5lKCJUZXh0VG9TcGVlY2guamF2YSAtIHN5bnRoZXNpemVUb0ZpbGUiLCAic2VydmljZSBpc24ndCBzdGFydGVkIik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHRyeSB7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L0xheW91dEluZmxhdGVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L0xheW91dEluZmxhdGVyLmphdmEKaW5kZXggZDI0YWY1Mi4uNmI0NGY5ZSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9MYXlvdXRJbmZsYXRlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvTGF5b3V0SW5mbGF0ZXIuamF2YQpAQCAtMzgsNyArMzgsNyBAQAogICogZm9yIHRoZSBkZXZpY2UgeW91IGFyZSBydW5uaW5nIG9uLiAgRm9yIGV4YW1wbGU6CiAgKgogICogPHByZT5MYXlvdXRJbmZsYXRlciBpbmZsYXRlciA9IChMYXlvdXRJbmZsYXRlciljb250ZXh0LmdldFN5c3RlbVNlcnZpY2UKLSAqICAgICAgQ29udGV4dC5MQVlPVVRfSU5GTEFURVJfU0VSVklDRSk7PC9wcmU+CisgKiAgICAgIChDb250ZXh0LkxBWU9VVF9JTkZMQVRFUl9TRVJWSUNFKTs8L3ByZT4KICAqIAogICogPHA+CiAgKiBUbyBjcmVhdGUgYSBuZXcgTGF5b3V0SW5mbGF0ZXIgd2l0aCBhbiBhZGRpdGlvbmFsIHtAbGluayBGYWN0b3J5fSBmb3IgeW91cgpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9XaW5kb3dNYW5hZ2VyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1dpbmRvd01hbmFnZXIuamF2YQppbmRleCA0OTFhNzlmLi5kM2Q4YjA4IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1dpbmRvd01hbmFnZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1dpbmRvd01hbmFnZXIuamF2YQpAQCAtMTE2MCwxNCArMTE2MCw2IEBACiAgICAgICAgICAgICAgICAgZ3Jhdml0eSA9IG8uZ3Jhdml0eTsKICAgICAgICAgICAgICAgICBjaGFuZ2VzIHw9IExBWU9VVF9DSEFOR0VEOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGhvcml6b250YWxNYXJnaW4gIT0gby5ob3Jpem9udGFsTWFyZ2luKSB7Ci0gICAgICAgICAgICAgICAgaG9yaXpvbnRhbE1hcmdpbiA9IG8uaG9yaXpvbnRhbE1hcmdpbjsKLSAgICAgICAgICAgICAgICBjaGFuZ2VzIHw9IExBWU9VVF9DSEFOR0VEOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHZlcnRpY2FsTWFyZ2luICE9IG8udmVydGljYWxNYXJnaW4pIHsKLSAgICAgICAgICAgICAgICB2ZXJ0aWNhbE1hcmdpbiA9IG8udmVydGljYWxNYXJnaW47Ci0gICAgICAgICAgICAgICAgY2hhbmdlcyB8PSBMQVlPVVRfQ0hBTkdFRDsKLSAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChmb3JtYXQgIT0gby5mb3JtYXQpIHsKICAgICAgICAgICAgICAgICBmb3JtYXQgPSBvLmZvcm1hdDsKICAgICAgICAgICAgICAgICBjaGFuZ2VzIHw9IEZPUk1BVF9DSEFOR0VEOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL29zL0JhdHRlcnlTdGF0c0ltcGwuamF2YSBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9vcy9CYXR0ZXJ5U3RhdHNJbXBsLmphdmEKaW5kZXggYjY4Mjk0Ny4uYjNiODBmNiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL29zL0JhdHRlcnlTdGF0c0ltcGwuamF2YQorKysgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvb3MvQmF0dGVyeVN0YXRzSW1wbC5qYXZhCkBAIC00MDg3LDcgKzQwODcsNyBAQAogICAgICAgICAgICAgICAgIC8vIHdlIGhhdmUgZ29uZSB0aHJvdWdoIGEgc2lnbmlmaWNhbnQgY2hhcmdlIChmcm9tIGEgdmVyeSBsb3cKICAgICAgICAgICAgICAgICAvLyBsZXZlbCB0byBhIG5vdyB2ZXJ5IGhpZ2ggbGV2ZWwpLgogICAgICAgICAgICAgICAgIGlmIChvbGRTdGF0dXMgPT0gQmF0dGVyeU1hbmFnZXIuQkFUVEVSWV9TVEFUVVNfRlVMTAotICAgICAgICAgICAgICAgICAgICAgICAgfHwgbGV2ZWwgPj0gOTUKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IGxldmVsID49IDkwCiAgICAgICAgICAgICAgICAgICAgICAgICB8fCAobURpc2NoYXJnZUN1cnJlbnRMZXZlbCA8IDIwICYmIGxldmVsID49IDgwKSkgewogICAgICAgICAgICAgICAgICAgICBkb1dyaXRlID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgcmVzZXRBbGxTdGF0c0xvY2tlZCgpOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9EaWdpdGFsQ2xvY2suamF2YSBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvRGlnaXRhbENsb2NrLmphdmEKaW5kZXggYmM3NDlkOC4uMmJjOWRkMSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9EaWdpdGFsQ2xvY2suamF2YQorKysgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L0RpZ2l0YWxDbG9jay5qYXZhCkBAIC0zNCw2ICszNCw3IEBACiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuUmVsYXRpdmVMYXlvdXQ7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7CiAKK2ltcG9ydCBqYXZhLmxhbmcucmVmLldlYWtSZWZlcmVuY2U7CiBpbXBvcnQgamF2YS50ZXh0LkRhdGVGb3JtYXRTeW1ib2xzOwogaW1wb3J0IGphdmEudXRpbC5DYWxlbmRhcjsKIApAQCAtNTQsMjYgKzU1LDQxIEBACiAgICAgcHJpdmF0ZSBUZXh0VmlldyBtVGltZURpc3BsYXlGb3JlZ3JvdW5kOwogICAgIHByaXZhdGUgQW1QbSBtQW1QbTsKICAgICBwcml2YXRlIENvbnRlbnRPYnNlcnZlciBtRm9ybWF0Q2hhbmdlT2JzZXJ2ZXI7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1MaXZlID0gdHJ1ZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gbUF0dGFjaGVkOworICAgIHByaXZhdGUgaW50IG1BdHRhY2hlZCA9IDA7IC8vIGZvciBkZWJ1Z2dpbmcgLSB0ZWxscyB1cyB3aGV0aGVyIGF0dGFjaC9kZXRhY2ggaXMgdW5iYWxhbmNlZAogCiAgICAgLyogY2FsbGVkIGJ5IHN5c3RlbSBvbiBtaW51dGUgdGlja3MgKi8KICAgICBwcml2YXRlIGZpbmFsIEhhbmRsZXIgbUhhbmRsZXIgPSBuZXcgSGFuZGxlcigpOwotICAgIHByaXZhdGUgZmluYWwgQnJvYWRjYXN0UmVjZWl2ZXIgbUludGVudFJlY2VpdmVyID0gbmV3IEJyb2FkY2FzdFJlY2VpdmVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvblJlY2VpdmUoQ29udGV4dCBjb250ZXh0LCBJbnRlbnQgaW50ZW50KSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1MaXZlICYmIGludGVudC5nZXRBY3Rpb24oKS5lcXVhbHMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZW50LkFDVElPTl9USU1FWk9ORV9DSEFOR0VEKSkgewotICAgICAgICAgICAgICAgICAgICBtQ2FsZW5kYXIgPSBDYWxlbmRhci5nZXRJbnN0YW5jZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBQb3N0IGEgcnVubmFibGUgdG8gYXZvaWQgYmxvY2tpbmcgdGhlIGJyb2FkY2FzdC4KLSAgICAgICAgICAgICAgICBtSGFuZGxlci5wb3N0KG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVUaW1lKCk7CisgICAgcHJpdmF0ZSBCcm9hZGNhc3RSZWNlaXZlciBtSW50ZW50UmVjZWl2ZXI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBUaW1lQ2hhbmdlZFJlY2VpdmVyIGV4dGVuZHMgQnJvYWRjYXN0UmVjZWl2ZXIgeworICAgICAgICBwcml2YXRlIFdlYWtSZWZlcmVuY2U8RGlnaXRhbENsb2NrPiBtQ2xvY2s7CisgICAgICAgIHByaXZhdGUgQ29udGV4dCBtQ29udGV4dDsKKworICAgICAgICBwdWJsaWMgVGltZUNoYW5nZWRSZWNlaXZlcihEaWdpdGFsQ2xvY2sgY2xvY2spIHsKKyAgICAgICAgICAgIG1DbG9jayA9IG5ldyBXZWFrUmVmZXJlbmNlPERpZ2l0YWxDbG9jaz4oY2xvY2spOworICAgICAgICAgICAgbUNvbnRleHQgPSBjbG9jay5nZXRDb250ZXh0KCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25SZWNlaXZlKENvbnRleHQgY29udGV4dCwgSW50ZW50IGludGVudCkgeworICAgICAgICAgICAgLy8gUG9zdCBhIHJ1bm5hYmxlIHRvIGF2b2lkIGJsb2NraW5nIHRoZSBicm9hZGNhc3QuCisgICAgICAgICAgICBmaW5hbCBib29sZWFuIHRpbWV6b25lQ2hhbmdlZCA9CisgICAgICAgICAgICAgICAgICAgIGludGVudC5nZXRBY3Rpb24oKS5lcXVhbHMoSW50ZW50LkFDVElPTl9USU1FWk9ORV9DSEFOR0VEKTsKKyAgICAgICAgICAgIGZpbmFsIERpZ2l0YWxDbG9jayBjbG9jayA9IG1DbG9jay5nZXQoKTsKKyAgICAgICAgICAgIGlmIChjbG9jayAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgY2xvY2subUhhbmRsZXIucG9zdChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aW1lem9uZUNoYW5nZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9jay5tQ2FsZW5kYXIgPSBDYWxlbmRhci5nZXRJbnN0YW5jZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgY2xvY2sudXBkYXRlVGltZSgpOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1Db250ZXh0LnVucmVnaXN0ZXJSZWNlaXZlcih0aGlzKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgfTsKKyAgICAgICAgfQorICAgIH07CiAKICAgICBzdGF0aWMgY2xhc3MgQW1QbSB7CiAgICAgICAgIHByaXZhdGUgVGV4dFZpZXcgbUFtUG07CkBAIC05OSwxNCArMTE1LDIzIEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwcml2YXRlIGNsYXNzIEZvcm1hdENoYW5nZU9ic2VydmVyIGV4dGVuZHMgQ29udGVudE9ic2VydmVyIHsKLSAgICAgICAgcHVibGljIEZvcm1hdENoYW5nZU9ic2VydmVyKCkgeworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEZvcm1hdENoYW5nZU9ic2VydmVyIGV4dGVuZHMgQ29udGVudE9ic2VydmVyIHsKKyAgICAgICAgcHJpdmF0ZSBXZWFrUmVmZXJlbmNlPERpZ2l0YWxDbG9jaz4gbUNsb2NrOworICAgICAgICBwcml2YXRlIENvbnRleHQgbUNvbnRleHQ7CisgICAgICAgIHB1YmxpYyBGb3JtYXRDaGFuZ2VPYnNlcnZlcihEaWdpdGFsQ2xvY2sgY2xvY2spIHsKICAgICAgICAgICAgIHN1cGVyKG5ldyBIYW5kbGVyKCkpOworICAgICAgICAgICAgbUNsb2NrID0gbmV3IFdlYWtSZWZlcmVuY2U8RGlnaXRhbENsb2NrPihjbG9jayk7CisgICAgICAgICAgICBtQ29udGV4dCA9IGNsb2NrLmdldENvbnRleHQoKTsKICAgICAgICAgfQogICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIHZvaWQgb25DaGFuZ2UoYm9vbGVhbiBzZWxmQ2hhbmdlKSB7Ci0gICAgICAgICAgICBzZXREYXRlRm9ybWF0KCk7Ci0gICAgICAgICAgICB1cGRhdGVUaW1lKCk7CisgICAgICAgICAgICBEaWdpdGFsQ2xvY2sgZGlnaXRhbENsb2NrID0gbUNsb2NrLmdldCgpOworICAgICAgICAgICAgaWYgKGRpZ2l0YWxDbG9jayAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZGlnaXRhbENsb2NrLnNldERhdGVGb3JtYXQoKTsKKyAgICAgICAgICAgICAgICBkaWdpdGFsQ2xvY2sudXBkYXRlVGltZSgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKS51bnJlZ2lzdGVyQ29udGVudE9ic2VydmVyKHRoaXMpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCkBAIC0xMzksMTEgKzE2NCwxMSBAQAogICAgIHByb3RlY3RlZCB2b2lkIG9uQXR0YWNoZWRUb1dpbmRvdygpIHsKICAgICAgICAgc3VwZXIub25BdHRhY2hlZFRvV2luZG93KCk7CiAKLSAgICAgICAgaWYgKG1BdHRhY2hlZCkgcmV0dXJuOwotICAgICAgICBtQXR0YWNoZWQgPSB0cnVlOworICAgICAgICBtQXR0YWNoZWQrKzsKIAotICAgICAgICBpZiAobUxpdmUpIHsKLSAgICAgICAgICAgIC8qIG1vbml0b3IgdGltZSB0aWNrcywgdGltZSBjaGFuZ2VkLCB0aW1lem9uZSAqLworICAgICAgICAvKiBtb25pdG9yIHRpbWUgdGlja3MsIHRpbWUgY2hhbmdlZCwgdGltZXpvbmUgKi8KKyAgICAgICAgaWYgKG1JbnRlbnRSZWNlaXZlciA9PSBudWxsKSB7CisgICAgICAgICAgICBtSW50ZW50UmVjZWl2ZXIgPSBuZXcgVGltZUNoYW5nZWRSZWNlaXZlcih0aGlzKTsKICAgICAgICAgICAgIEludGVudEZpbHRlciBmaWx0ZXIgPSBuZXcgSW50ZW50RmlsdGVyKCk7CiAgICAgICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKEludGVudC5BQ1RJT05fVElNRV9USUNLKTsKICAgICAgICAgICAgIGZpbHRlci5hZGRBY3Rpb24oSW50ZW50LkFDVElPTl9USU1FX0NIQU5HRUQpOwpAQCAtMTUyLDkgKzE3NywxMSBAQAogICAgICAgICB9CiAKICAgICAgICAgLyogbW9uaXRvciAxMi8yNC1ob3VyIGRpc3BsYXkgcHJlZmVyZW5jZSAqLwotICAgICAgICBtRm9ybWF0Q2hhbmdlT2JzZXJ2ZXIgPSBuZXcgRm9ybWF0Q2hhbmdlT2JzZXJ2ZXIoKTsKLSAgICAgICAgbUNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCkucmVnaXN0ZXJDb250ZW50T2JzZXJ2ZXIoCi0gICAgICAgICAgICAgICAgU2V0dGluZ3MuU3lzdGVtLkNPTlRFTlRfVVJJLCB0cnVlLCBtRm9ybWF0Q2hhbmdlT2JzZXJ2ZXIpOworICAgICAgICBpZiAobUZvcm1hdENoYW5nZU9ic2VydmVyID09IG51bGwpIHsKKyAgICAgICAgICAgIG1Gb3JtYXRDaGFuZ2VPYnNlcnZlciA9IG5ldyBGb3JtYXRDaGFuZ2VPYnNlcnZlcih0aGlzKTsKKyAgICAgICAgICAgIG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLnJlZ2lzdGVyQ29udGVudE9ic2VydmVyKAorICAgICAgICAgICAgICAgICAgICBTZXR0aW5ncy5TeXN0ZW0uQ09OVEVOVF9VUkksIHRydWUsIG1Gb3JtYXRDaGFuZ2VPYnNlcnZlcik7CisgICAgICAgIH0KIAogICAgICAgICB1cGRhdGVUaW1lKCk7CiAgICAgfQpAQCAtMTYzLDE2ICsxOTAsMTkgQEAKICAgICBwcm90ZWN0ZWQgdm9pZCBvbkRldGFjaGVkRnJvbVdpbmRvdygpIHsKICAgICAgICAgc3VwZXIub25EZXRhY2hlZEZyb21XaW5kb3coKTsKIAotICAgICAgICBpZiAoIW1BdHRhY2hlZCkgcmV0dXJuOwotICAgICAgICBtQXR0YWNoZWQgPSBmYWxzZTsKKyAgICAgICAgbUF0dGFjaGVkLS07CiAKLSAgICAgICAgaWYgKG1MaXZlKSB7CisgICAgICAgIGlmIChtSW50ZW50UmVjZWl2ZXIgIT0gbnVsbCkgewogICAgICAgICAgICAgbUNvbnRleHQudW5yZWdpc3RlclJlY2VpdmVyKG1JbnRlbnRSZWNlaXZlcik7CiAgICAgICAgIH0KLSAgICAgICAgbUNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCkudW5yZWdpc3RlckNvbnRlbnRPYnNlcnZlcigKLSAgICAgICAgICAgICAgICBtRm9ybWF0Q2hhbmdlT2JzZXJ2ZXIpOwotICAgIH0KKyAgICAgICAgaWYgKG1Gb3JtYXRDaGFuZ2VPYnNlcnZlciAhPSBudWxsKSB7CisgICAgICAgICAgICBtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKS51bnJlZ2lzdGVyQ29udGVudE9ic2VydmVyKAorICAgICAgICAgICAgICAgICAgICBtRm9ybWF0Q2hhbmdlT2JzZXJ2ZXIpOworICAgICAgICB9CiAKKyAgICAgICAgbUZvcm1hdENoYW5nZU9ic2VydmVyID0gbnVsbDsKKyAgICAgICAgbUludGVudFJlY2VpdmVyID0gbnVsbDsKKyAgICB9CiAKICAgICB2b2lkIHVwZGF0ZVRpbWUoQ2FsZW5kYXIgYykgewogICAgICAgICBtQ2FsZW5kYXIgPSBjOwpAQCAtMTgwLDkgKzIxMCw3IEBACiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVRpbWUoKSB7Ci0gICAgICAgIGlmIChtTGl2ZSkgewotICAgICAgICAgICAgbUNhbGVuZGFyLnNldFRpbWVJbk1pbGxpcyhTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7Ci0gICAgICAgIH0KKyAgICAgICAgbUNhbGVuZGFyLnNldFRpbWVJbk1pbGxpcyhTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7CiAKICAgICAgICAgQ2hhclNlcXVlbmNlIG5ld1RpbWUgPSBEYXRlRm9ybWF0LmZvcm1hdChtRm9ybWF0LCBtQ2FsZW5kYXIpOwogICAgICAgICBtVGltZURpc3BsYXlCYWNrZ3JvdW5kLnNldFRleHQobmV3VGltZSk7CkBAIC0xOTUsOCArMjIzLDQgQEAKICAgICAgICAgICAgID8gTTI0IDogTTEyOwogICAgICAgICBtQW1QbS5zZXRTaG93QW1QbShtRm9ybWF0LmVxdWFscyhNMTIpKTsKICAgICB9Ci0KLSAgICB2b2lkIHNldExpdmUoYm9vbGVhbiBsaXZlKSB7Ci0gICAgICAgIG1MaXZlID0gbGl2ZTsKLSAgICB9CiB9CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9jb250ZW50L0NvbnRlbnRSZXNvbHZlclRlc3QuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2NvbnRlbnQvQ29udGVudFJlc29sdmVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiNmRlZThiCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvY29udGVudC9Db250ZW50UmVzb2x2ZXJUZXN0LmphdmEKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGFuZHJvaWQuY29udGVudDsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXI7CitpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0OworaW1wb3J0IGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2U7CitpbXBvcnQgYW5kcm9pZC50ZXN0LnN1aXRlYnVpbGRlci5hbm5vdGF0aW9uLkxhcmdlVGVzdDsKKworcHVibGljIGNsYXNzIENvbnRlbnRSZXNvbHZlclRlc3QgZXh0ZW5kcyBBbmRyb2lkVGVzdENhc2UgeworICAgIHByaXZhdGUgQ29udGVudFJlc29sdmVyIG1Db250ZW50UmVzb2x2ZXI7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdXBlci5zZXRVcCgpOworICAgICAgICBtQ29udGVudFJlc29sdmVyID0gbUNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCk7CisgICAgfQorCisgICAgQExhcmdlVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDdXJzb3JGaW5hbGl6ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gVE9ETzogV2FudCBhIHRlc3QgY2FzZSB0aGF0IG1vcmUgcHJlZGljdGFibHkgcmVwcm9kdWNlIHRoaXMgaXNzdWUuIFNlbGVjdGVkCisgICAgICAgIC8vIDYwMCBhcyB0aGlzIGNhdXNlcyB0aGUgcHJvYmxlbSAxMDAlIG9mIHRoZSBydW5zIG9uIGN1cnJlbnQgaHcsIGl0IG1pZ2h0IG5vdAorICAgICAgICAvLyBkbyBzbyBvbiBzb21lIG90aGVyIGNvbmZpZ3VyYXRpb24gdGhvdWdoLgorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDYwMDsgaSsrKSB7CisgICAgICAgICAgICBtQ29udGVudFJlc29sdmVyLnF1ZXJ5KENvbnRhY3RzQ29udHJhY3QuQ29udGFjdHMuQ09OVEVOVF9VUkksIG51bGwsIG51bGwsIG51bGwsIG51bGwpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2d1aWRlL2d1aWRlX3RvYy5jcyBiL2RvY3MvaHRtbC9ndWlkZS9ndWlkZV90b2MuY3MKaW5kZXggMjcwZDE1My4uMTBjZTM0NyAxMDA2NDQKLS0tIGEvZG9jcy9odG1sL2d1aWRlL2d1aWRlX3RvYy5jcworKysgYi9kb2NzL2h0bWwvZ3VpZGUvZ3VpZGVfdG9jLmNzCkBAIC00OTEsMTIgKzQ5MSwxMyBAQAogICAgICAgICAgICAgICAgICAgICA8L2xpPgogICAgICAgICAgICAgICAgICAgPC91bD4KICAgICAgICAgICAgICAgPC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii9ndWlkZS9kZXZlbG9waW5nL3Rvb2xzL3Byb2d1YXJkLmh0bWwiPlByb0d1YXJkPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIvZ3VpZGUvZGV2ZWxvcGluZy90b29scy9hZGIuaHRtbCNzcWxpdGUiPnNxbGl0ZTM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii9ndWlkZS9kZXZlbG9waW5nL3Rvb2xzL3RyYWNldmlldy5odG1sIj5UcmFjZXZpZXc8L2E+PC9saT4KLSAgICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+Z3VpZGUvZGV2ZWxvcGluZy90b29scy96aXBhbGlnbi5odG1sIj56aXBhbGlnbjwvYT48L2xpPgotICAgICAgICA8L3VsPgotICAgICAgPC9saT4KKyAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/Pmd1aWRlL2RldmVsb3BpbmcvdG9vbHMvcHJvZ3VhcmQuaHRtbCI+UHJvR3VhcmQ8L2E+Cis8c3BhbiBjbGFzcz0ibmV3Ij5uZXchPC9zcGFuPjwvbGk+CisgICAgICAgICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5ndWlkZS9kZXZlbG9waW5nL3Rvb2xzL2FkYi5odG1sI3NxbGl0ZSI+c3FsaXRlMzwvYT48L2xpPgorICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+Z3VpZGUvZGV2ZWxvcGluZy90b29scy90cmFjZXZpZXcuaHRtbCIgPlRyYWNldmlldzwvYT48L2xpPgorICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+Z3VpZGUvZGV2ZWxvcGluZy90b29scy96aXBhbGlnbi5odG1sIiA+emlwYWxpZ248L2E+PC9saT4KKyAgICAgICAgICA8L3VsPgorICAgICAgICA8L2xpPgogICAgIDwvdWw+CiAgIDwvbGk+CiAKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9ndWlkZS90b3BpY3MvcmVzb3VyY2VzL3Byb3ZpZGluZy1yZXNvdXJjZXMuamQgYi9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL3Jlc291cmNlcy9wcm92aWRpbmctcmVzb3VyY2VzLmpkCmluZGV4IDVkMDBkYjEuLjYwMDMwZjAgMTAwNjQ0Ci0tLSBhL2RvY3MvaHRtbC9ndWlkZS90b3BpY3MvcmVzb3VyY2VzL3Byb3ZpZGluZy1yZXNvdXJjZXMuamQKKysrIGIvZG9jcy9odG1sL2d1aWRlL3RvcGljcy9yZXNvdXJjZXMvcHJvdmlkaW5nLXJlc291cmNlcy5qZApAQCAtNDk0LDYgKzQ5NCw3IEBACiAgICAgICA8dGQ+S2V5Ym9hcmQgYXZhaWxhYmlsaXR5PC90ZD4KICAgICAgIDx0ZD4KICAgICAgICAgPGNvZGU+a2V5c2V4cG9zZWQ8L2NvZGU+PGJyLz4KKyAgICAgICAgPGNvZGU+a2V5c2hpZGRlbjwvY29kZT48YnIvPgogICAgICAgICA8Y29kZT5rZXlzc29mdDwvY29kZT4KICAgICAgIDwvdGQ+CiAgICAgICA8dGQ+CmRpZmYgLS1naXQgYS9kcm0vZHJtc2VydmVyL0RybU1hbmFnZXIuY3BwIGIvZHJtL2RybXNlcnZlci9Ecm1NYW5hZ2VyLmNwcAppbmRleCA5YTZmNzg3Li5iNmUwYzMwIDEwMDY0NAotLS0gYS9kcm0vZHJtc2VydmVyL0RybU1hbmFnZXIuY3BwCisrKyBiL2RybS9kcm1zZXJ2ZXIvRHJtTWFuYWdlci5jcHAKQEAgLTExNyw3ICsxMTcsMTEgQEAKIHN0YXR1c190IERybU1hbmFnZXI6OnNldERybVNlcnZpY2VMaXN0ZW5lcigKICAgICAgICAgICAgIGludCB1bmlxdWVJZCwgY29uc3Qgc3A8SURybVNlcnZpY2VMaXN0ZW5lcj4mIGRybVNlcnZpY2VMaXN0ZW5lcikgewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgbVNlcnZpY2VMaXN0ZW5lcnMuYWRkKHVuaXF1ZUlkLCBkcm1TZXJ2aWNlTGlzdGVuZXIpOworICAgIGlmIChOVUxMICE9IGRybVNlcnZpY2VMaXN0ZW5lci5nZXQoKSkgeworICAgICAgICBtU2VydmljZUxpc3RlbmVycy5hZGQodW5pcXVlSWQsIGRybVNlcnZpY2VMaXN0ZW5lcik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbVNlcnZpY2VMaXN0ZW5lcnMucmVtb3ZlSXRlbSh1bmlxdWVJZCk7CisgICAgfQogICAgIHJldHVybiBEUk1fTk9fRVJST1I7CiB9CiAKZGlmZiAtLWdpdCBhL2RybS9qYXZhL2FuZHJvaWQvZHJtL0RybU1hbmFnZXJDbGllbnQuamF2YSBiL2RybS9qYXZhL2FuZHJvaWQvZHJtL0RybU1hbmFnZXJDbGllbnQuamF2YQppbmRleCAyZjU0YjMzLi42Y2FmNjc4IDEwMDY0NAotLS0gYS9kcm0vamF2YS9hbmRyb2lkL2RybS9Ecm1NYW5hZ2VyQ2xpZW50LmphdmEKKysrIGIvZHJtL2phdmEvYW5kcm9pZC9kcm0vRHJtTWFuYWdlckNsaWVudC5qYXZhCkBAIC03MzgsMjYgKzczOCwzNCBAQAogICAgICAqLwogICAgIHByaXZhdGUgU3RyaW5nIGNvbnZlcnRVcmlUb1BhdGgoVXJpIHVyaSkgewogICAgICAgICBTdHJpbmcgcGF0aCA9IG51bGw7Ci0gICAgICAgIFN0cmluZyBzY2hlbWUgPSB1cmkuZ2V0U2NoZW1lKCk7Ci0gICAgICAgIGlmIChudWxsID09IHNjaGVtZSB8fCBzY2hlbWUuZXF1YWxzKCIiKSB8fCBzY2hlbWUuZXF1YWxzKENvbnRlbnRSZXNvbHZlci5TQ0hFTUVfRklMRSkpIHsKLSAgICAgICAgICAgIHBhdGggPSB1cmkuZ2V0UGF0aCgpOwotICAgICAgICB9IGVsc2UgaWYgKHNjaGVtZS5lcXVhbHMoQ29udGVudFJlc29sdmVyLlNDSEVNRV9DT05URU5UKSkgewotICAgICAgICAgICAgU3RyaW5nW10gcHJvamVjdGlvbiA9IG5ldyBTdHJpbmdbXSB7TWVkaWFTdG9yZS5NZWRpYUNvbHVtbnMuREFUQX07Ci0gICAgICAgICAgICBDdXJzb3IgY3Vyc29yID0gbnVsbDsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgY3Vyc29yID0gbUNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCkucXVlcnkodXJpLCBwcm9qZWN0aW9uLCBudWxsLCBudWxsLCBudWxsKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFNRTGl0ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiR2l2ZW4gVXJpIGlzIG5vdCBmb3JtYXR0ZWQgaW4gYSB3YXkgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAic28gdGhhdCBpdCBjYW4gYmUgZm91bmQgaW4gbWVkaWEgc3RvcmUuIik7CisgICAgICAgIGlmIChudWxsICE9IHVyaSkgeworICAgICAgICAgICAgU3RyaW5nIHNjaGVtZSA9IHVyaS5nZXRTY2hlbWUoKTsKKyAgICAgICAgICAgIGlmIChudWxsID09IHNjaGVtZSB8fCBzY2hlbWUuZXF1YWxzKCIiKSB8fAorICAgICAgICAgICAgICAgICAgICBzY2hlbWUuZXF1YWxzKENvbnRlbnRSZXNvbHZlci5TQ0hFTUVfRklMRSkpIHsKKyAgICAgICAgICAgICAgICBwYXRoID0gdXJpLmdldFBhdGgoKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc2NoZW1lLmVxdWFscyhDb250ZW50UmVzb2x2ZXIuU0NIRU1FX0NPTlRFTlQpKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nW10gcHJvamVjdGlvbiA9IG5ldyBTdHJpbmdbXSB7TWVkaWFTdG9yZS5NZWRpYUNvbHVtbnMuREFUQX07CisgICAgICAgICAgICAgICAgQ3Vyc29yIGN1cnNvciA9IG51bGw7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgY3Vyc29yID0gbUNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCkucXVlcnkodXJpLCBwcm9qZWN0aW9uLCBudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIG51bGwpOworICAgICAgICAgICAgICAgICAgICBpZiAobnVsbCA9PSBjdXJzb3IgfHwgMCA9PSBjdXJzb3IuZ2V0Q291bnQoKSB8fCAhY3Vyc29yLm1vdmVUb0ZpcnN0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkdpdmVuIFVyaSBjb3VsZCBub3QgYmUgZm91bmQiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBpbiBtZWRpYSBzdG9yZSIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGludCBwYXRoSW5kZXggPSBjdXJzb3IuZ2V0Q29sdW1uSW5kZXhPclRocm93KE1lZGlhU3RvcmUuTWVkaWFDb2x1bW5zLkRBVEEpOworICAgICAgICAgICAgICAgICAgICBwYXRoID0gY3Vyc29yLmdldFN0cmluZyhwYXRoSW5kZXgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFNRTGl0ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkdpdmVuIFVyaSBpcyBub3QgZm9ybWF0dGVkIGluIGEgd2F5ICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzbyB0aGF0IGl0IGNhbiBiZSBmb3VuZCBpbiBtZWRpYSBzdG9yZS4iKTsKKyAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICBpZiAobnVsbCAhPSBjdXJzb3IpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGN1cnNvci5jbG9zZSgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJHaXZlbiBVcmkgc2NoZW1lIGlzIG5vdCBzdXBwb3J0ZWQiKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChudWxsID09IGN1cnNvciB8fCAwID09IGN1cnNvci5nZXRDb3VudCgpIHx8ICFjdXJzb3IubW92ZVRvRmlyc3QoKSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkdpdmVuIFVyaSBjb3VsZCBub3QgYmUgZm91bmQgaW4gbWVkaWEgc3RvcmUiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGludCBwYXRoSW5kZXggPSBjdXJzb3IuZ2V0Q29sdW1uSW5kZXhPclRocm93KE1lZGlhU3RvcmUuTWVkaWFDb2x1bW5zLkRBVEEpOwotICAgICAgICAgICAgcGF0aCA9IGN1cnNvci5nZXRTdHJpbmcocGF0aEluZGV4KTsKLSAgICAgICAgICAgIGN1cnNvci5jbG9zZSgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiR2l2ZW4gVXJpIHNjaGVtZSBpcyBub3Qgc3VwcG9ydGVkIik7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHBhdGg7CiAgICAgfQpkaWZmIC0tZ2l0IGEvZHJtL2xpYmRybWZyYW1ld29yay9Ecm1NYW5hZ2VyQ2xpZW50LmNwcCBiL2RybS9saWJkcm1mcmFtZXdvcmsvRHJtTWFuYWdlckNsaWVudC5jcHAKaW5kZXggNTc4ZTEzNS4uN2I1MTgyMiAxMDA2NDQKLS0tIGEvZHJtL2xpYmRybWZyYW1ld29yay9Ecm1NYW5hZ2VyQ2xpZW50LmNwcAorKysgYi9kcm0vbGliZHJtZnJhbWV3b3JrL0RybU1hbmFnZXJDbGllbnQuY3BwCkBAIC0zMSw2ICszMSw3IEBACiBEcm1NYW5hZ2VyQ2xpZW50Ojp+RHJtTWFuYWdlckNsaWVudCgpIHsKICAgICBEcm1NYW5hZ2VyQ2xpZW50SW1wbDo6cmVtb3ZlKG1VbmlxdWVJZCk7CiAgICAgbURybU1hbmFnZXJDbGllbnRJbXBsLT5yZW1vdmVDbGllbnQobVVuaXF1ZUlkKTsKKyAgICBtRHJtTWFuYWdlckNsaWVudEltcGwtPnNldE9uSW5mb0xpc3RlbmVyKG1VbmlxdWVJZCwgTlVMTCk7CiAgICAgZGVsZXRlIG1Ecm1NYW5hZ2VyQ2xpZW50SW1wbDsgbURybU1hbmFnZXJDbGllbnRJbXBsID0gTlVMTDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJtL2xpYmRybWZyYW1ld29yay9Ecm1NYW5hZ2VyQ2xpZW50SW1wbC5jcHAgYi9kcm0vbGliZHJtZnJhbWV3b3JrL0RybU1hbmFnZXJDbGllbnRJbXBsLmNwcAppbmRleCBmMzkxMzFkLi5kMjBkZTkyIDEwMDY0NAotLS0gYS9kcm0vbGliZHJtZnJhbWV3b3JrL0RybU1hbmFnZXJDbGllbnRJbXBsLmNwcAorKysgYi9kcm0vbGliZHJtZnJhbWV3b3JrL0RybU1hbmFnZXJDbGllbnRJbXBsLmNwcApAQCAtODEsNyArODEsOCBAQAogICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBjb25zdCBzcDxEcm1NYW5hZ2VyQ2xpZW50OjpPbkluZm9MaXN0ZW5lcj4mIGluZm9MaXN0ZW5lcikgewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgbU9uSW5mb0xpc3RlbmVyID0gaW5mb0xpc3RlbmVyOwotICAgIHJldHVybiBnZXREcm1NYW5hZ2VyU2VydmljZSgpLT5zZXREcm1TZXJ2aWNlTGlzdGVuZXIodW5pcXVlSWQsIHRoaXMpOworICAgIHJldHVybiBnZXREcm1NYW5hZ2VyU2VydmljZSgpLT5zZXREcm1TZXJ2aWNlTGlzdGVuZXIodW5pcXVlSWQsCisgICAgICAgICAgICAoTlVMTCAhPSBpbmZvTGlzdGVuZXIuZ2V0KCkpID8gdGhpcyA6IE5VTEwpOwogfQogCiBzdGF0dXNfdCBEcm1NYW5hZ2VyQ2xpZW50SW1wbDo6aW5zdGFsbERybUVuZ2luZShpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIGRybUVuZ2luZUZpbGUpIHsKZGlmZiAtLWdpdCBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9jb21tb24vQW5kcm9pZC5tayBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9jb21tb24vQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZWU3OTYxCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2NvbW1vbi9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMTYgQEAKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCitpbmNsdWRlICQoY2FsbCBhbGwtc3ViZGlyLW1ha2VmaWxlcykKZGlmZiAtLWdpdCBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9jb21tb24vdXRpbC9BbmRyb2lkLm1rIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2NvbW1vbi91dGlsL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTVkZGE4MAotLS0gL2Rldi9udWxsCisrKyBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9jb21tb24vdXRpbC9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsNTIgQEAKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSBcCisgICAgc3JjL01pbWVUeXBlVXRpbC5jcHAKKworTE9DQUxfTU9EVUxFIDo9IGxpYmRybXV0aWxpdHkKKworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSAgXAorICAgIGxpYnV0aWxzIFwKKyAgICBsaWJkbCBcCisgICAgbGliZHZtIFwKKyAgICBsaWJhbmRyb2lkX3J1bnRpbWUgXAorICAgIGxpYm5hdGl2ZWhlbHBlciBcCisgICAgbGlibG9nCisKKworYmFzZSA6PSBmcmFtZXdvcmtzL2Jhc2UKKworTE9DQUxfQ19JTkNMVURFUyArPSBcCisgICAgJChKTklfSF9JTkNMVURFKSBcCisgICAgJChiYXNlKS9pbmNsdWRlIFwKKyAgICAkKGJhc2UpL2luY2x1ZGUvZHJtIFwKKyAgICAkKGJhc2UpL2luY2x1ZGUvZHJtL3BsdWdpbnMgXAorICAgICQoTE9DQUxfUEFUSCkvaW5jbHVkZQorCisKK2lmbmVxICgkKFRBUkdFVF9CVUlMRF9WQVJJQU5UKSx1c2VyKQorTE9DQUxfQ19JTkNMVURFUyArPSBcCisgICAgJChMT0NBTF9QQVRIKS90b29scworCitlbmRpZgorCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorCitpbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvY29tbW9uL3V0aWwvaW5jbHVkZS9NaW1lVHlwZVV0aWwuaCBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9jb21tb24vdXRpbC9pbmNsdWRlL01pbWVUeXBlVXRpbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkMTJhNjEKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvY29tbW9uL3V0aWwvaW5jbHVkZS9NaW1lVHlwZVV0aWwuaApAQCAtMCwwICsxLDQ2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfX01JTUVUWVBFVVRJTF9IX18KKyNkZWZpbmUgX19NSU1FVFlQRVVUSUxfSF9fCisKKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgTWltZVR5cGVVdGlsIHsKKworcHVibGljOgorCisgICAgTWltZVR5cGVVdGlsKCkge30KKworICAgIHZpcnR1YWwgfk1pbWVUeXBlVXRpbCgpIHt9CisKKy8qKgorICogTWF5IGNvbnZlcnQgdGhlIG1pbWV0eXBlIGlmIHRoZXJlIGlzIGEgd2VsbCBrbm93bgorICogcmVwbGFjZW1lbnQgbWltZXR5cGUgb3RoZXJ3aXNlIHRoZSBvcmlnaW5hbCBtaW1ldHlwZQorICogaXMgcmV0dXJuZWQuCisgKgorICogQHBhcmFtIG1pbWVUeXBlIC0gbWltZXR5cGUgaW4gbG93ZXIgY2FzZSB0byBjb252ZXJ0LgorICoKKyAqIEByZXR1cm4gbWltZXR5cGUgb3IgbnVsbC4KKyAqLworc3RhdGljIFN0cmluZzggY29udmVydE1pbWVUeXBlKFN0cmluZzgmIG1pbWVUeXBlKTsKKworfTsKK307CisKKyNlbmRpZiAvKiBfX01JTUVUWVBFVVRJTF9IX18gKi8KZGlmZiAtLWdpdCBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9jb21tb24vdXRpbC9pbmNsdWRlL1Nlc3Npb25NYXAuaCBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9jb21tb24vdXRpbC9pbmNsdWRlL1Nlc3Npb25NYXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZGZmNThjCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2NvbW1vbi91dGlsL2luY2x1ZGUvU2Vzc2lvbk1hcC5oCkBAIC0wLDAgKzEsMTU1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfX1NFU1NJT05NQVBfSF9fCisjZGVmaW5lIF9fU0VTU0lPTk1BUF9IX18KKworI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLyoqCisgKiBBIHdyYXBwZXIgdGVtcGxhdGUgY2xhc3MgZm9yIGhhbmRsaW5nIERSTSBFbmdpbmUgc2Vzc2lvbnMuCisgKi8KK3RlbXBsYXRlIDx0eXBlbmFtZSBOT0RFPgorY2xhc3MgU2Vzc2lvbk1hcCB7CisKK3B1YmxpYzoKKyAgICBLZXllZFZlY3RvcjxpbnQsIE5PREU+IG1hcDsKKworICAgIFNlc3Npb25NYXAoKSB7fQorCisgICAgdmlydHVhbCB+U2Vzc2lvbk1hcCgpIHsKKyAgICAgICAgZGVzdHJveU1hcCgpOworICAgIH0KKworLyoqCisgKiBBZGRzIGEgbmV3IHZhbHVlIGluIHRoZSBzZXNzaW9uIG1hcCB0YWJsZS4gSXQgZXhwZWN0cyBtZW1vcnkgdG8gYmUgYWxsb2NhdGVkIGFscmVhZHkKKyAqIGZvciB0aGUgc2Vzc2lvbiBvYmplY3QKKyAqCisgKiBAcGFyYW0ga2V5IC0ga2V5IG9yIFNlc3Npb24gSUQKKyAqIEBwYXJhbSB2YWx1ZSAtIHNlc3Npb24gb2JqZWN0IHRvIGFkZAorICoKKyAqIEByZXR1cm4gYm9vbGVhbiByZXN1bHQgb2YgYWRkaW5nIHZhbHVlLiByZXR1cm5zIGZhbHNlIGlmIGtleSBpcyBhbHJlYWR5IGV4aXN0LgorICovCitib29sIGFkZFZhbHVlKGludCBrZXksIE5PREUgdmFsdWUpIHsKKyAgICBib29sIHJlc3VsdCA9IGZhbHNlOworCisgICAgaWYgKCFpc0NyZWF0ZWQoa2V5KSkgeworICAgICAgICBtYXAuYWRkKGtleSwgdmFsdWUpOworICAgICAgICByZXN1bHQgPSB0cnVlOworICAgIH0KKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKKworLyoqCisgKiByZXR1cm5zIHRoZSBzZXNzaW9uIG9iamVjdCBieSB0aGUga2V5CisgKgorICogQHBhcmFtIGtleSAtIGtleSBvciBTZXNzaW9uIElECisgKgorICogQHJldHVybiBzZXNzaW9uIG9iamVjdCBhcyBwZXIgdGhlIGtleQorICovCitOT0RFIGdldFZhbHVlKGludCBrZXkpIHsKKyAgICBOT0RFIHZhbHVlID0gTlVMTDsKKworICAgIGlmIChpc0NyZWF0ZWQoa2V5KSkgeworICAgICAgICB2YWx1ZSA9IChOT0RFKSBtYXAudmFsdWVGb3Ioa2V5KTsKKyAgICB9CisKKyAgICByZXR1cm4gdmFsdWU7Cit9CisKKy8qKgorICogcmV0dXJucyB0aGUgbnVtYmVyIG9mIG9iamVjdHMgaW4gdGhlIHNlc3Npb24gbWFwIHRhYmxlCisgKgorICogQHJldHVybiBjb3VudCBvZiBudW1iZXIgb2Ygc2Vzc2lvbiBvYmplY3RzLgorICovCitpbnQgZ2V0U2l6ZSgpIHsKKyAgICByZXR1cm4gbWFwLnNpemUoKTsKK30KKworLyoqCisgKiByZXR1cm5zIHRoZSBzZXNzaW9uIG9iamVjdCBieSB0aGUgaW5kZXggaW4gdGhlIHNlc3Npb24gbWFwIHRhYmxlCisgKgorICogQHBhcmFtIGluZGV4IC0gaW5kZXggb2YgdGhlIHZhbHVlIHJlcXVpcmVkCisgKgorICogQHJldHVybiBzZXNzaW9uIG9iamVjdCBhcyBwZXIgdGhlIGluZGV4CisgKi8KK05PREUgZ2V0VmFsdWVBdCh1bnNpZ25lZCBpbnQgaW5kZXgpIHsKKyAgICBOT0RFIHZhbHVlID0gTlVMTDsKKworICAgIGlmIChtYXAuc2l6ZSgpID4gaW5kZXgpIHsKKyAgICAgIHZhbHVlID0gbWFwLnZhbHVlQXQoaW5kZXgpOworICAgIH0KKworICAgIHJldHVybiB2YWx1ZTsKK30KKworLyoqCisgKiBkZWxldGVzIHRoZSBvYmplY3QgZnJvbSBzZXNzaW9uIG1hcC4gSXQgYWxzbyBmcmVlcyB1cCBtZW1vcnkgZm9yIHRoZSBzZXNzaW9uIG9iamVjdC4KKyAqCisgKiBAcGFyYW0ga2V5IC0ga2V5IG9mIHRoZSB2YWx1ZSB0byBiZSBkZWxldGVkCisgKgorICovCit2b2lkIHJlbW92ZVZhbHVlKGludCBrZXkpIHsKKyAgICBkZWxldGVWYWx1ZShnZXRWYWx1ZShrZXkpKTsKKyAgICBtYXAucmVtb3ZlSXRlbShrZXkpOworfQorCisvKioKKyAqIGRlY2lkZXMgaWYgc2Vzc2lvbiBpcyBhbHJlYWR5IGNyZWF0ZWQuCisgKgorICogQHBhcmFtIGtleSAtIGtleSBvZiB0aGUgdmFsdWUgZm9yIHRoZSBzZXNzaW9uCisgKgorICogQHJldHVybiBib29sZWFuIHJlc3VsdCBvZiB3aGV0aGVyIHNlc3Npb24gaXMgY3JlYXRlZAorICovCitib29sIGlzQ3JlYXRlZChpbnQga2V5KSB7CisgICAgcmV0dXJuICgwIDw9IG1hcC5pbmRleE9mS2V5KGtleSkpOworfQorCisvKioKKyAqIGVtcHR5IHRoZSBlbnRpcmUgc2Vzc2lvbiB0YWJsZS4gSXQgcmVsZWFzZXMgYWxsIHRoZSBtZW1vcnkgZm9yIHNlc3Npb24gb2JqZWN0cy4KKyAqLwordm9pZCBkZXN0cm95TWFwKCkgeworICAgIGludCBzaXplID0gbWFwLnNpemUoKTsKKyAgICBpbnQgaSA9IDA7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgIGRlbGV0ZVZhbHVlKG1hcC52YWx1ZUF0KGkpKTsKKyAgICB9CisKKyAgICBtYXAuY2xlYXIoKTsKK30KKworLyoqCisgKiBmcmVlIHVwIHRoZSBtZW1vcnkgZm9yIHRoZSBzZXNzaW9uIG9iamVjdC4KKyAqIE1ha2Ugc3VyZSBpZiBhbnkgcmVmZXJlbmNlIHRvIHRoZSBzZXNzaW9uIG9iamVjdCBhbnl3aGVyZSwgb3RoZXJ3aXNlIGl0IHdpbGwgYmUgYQorICogZGFuZ2xlIHBvaW50ZXIgYWZ0ZXIgdGhpcyBjYWxsLgorICoKKyAqIEBwYXJhbSB2YWx1ZSAtIHNlc3Npb24gb2JqZWN0IHRvIGZyZWUKKyAqCisgKi8KK3ZvaWQgZGVsZXRlVmFsdWUoTk9ERSB2YWx1ZSkgeworICAgIGRlbGV0ZSB2YWx1ZTsKK30KKworfTsKKworfTsKKworI2VuZGlmIC8qIF9fU0VTU0lPTk1BUF9IX18gKi8KZGlmZiAtLWdpdCBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9jb21tb24vdXRpbC9zcmMvTWltZVR5cGVVdGlsLmNwcCBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9jb21tb24vdXRpbC9zcmMvTWltZVR5cGVVdGlsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZWU5MDNlCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2NvbW1vbi91dGlsL3NyYy9NaW1lVHlwZVV0aWwuY3BwCkBAIC0wLDAgKzEsMTU0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPE1pbWVUeXBlVXRpbC5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKyN1bmRlZiBMT0dfVEFHCisjZGVmaW5lIExPR19UQUcgIk1pbWVUeXBlVXRpbCIKKworZW51bSB7CisgICAgTUlNRVRZUEVfQVVESU8gICAgICAgPSAwLAorICAgIE1JTUVUWVBFX0FQUExJQ0FUSU9OID0gMSwKKyAgICBNSU1FVFlQRV9JTUFHRSAgICAgICA9IDIsCisgICAgTUlNRVRZUEVfVklERU8gICAgICAgPSAzLAorICAgIE1JTUVUWVBFX0xBU1QgICAgICAgID0gLTEsCit9OworCitzdHJ1Y3QgTWltZUdyb3VweworICAgIGludCAgICAgICAgIHR5cGU7ICAgICAvLyBBdWRpbywgdmlkZW8sLi4gdXNlIHRoZSBlbnVtIHZhbHVlcworICAgIGNvbnN0IGNoYXIqIHBHcm91cDsgICAvLyAiYXVkaW8vIiwgInZpZGVvLyIsLi4gc2hvdWxkIGNvbnRhaW4gdGhlIGxhc3QgIi8iCisgICAgaW50ICAgICAgICAgc2l6ZTsgICAgIC8vIE51bWJlciBvZiBieXRlcy4gZS5nLiAiYXVkaW8vIiA9IDYgYnl0ZXMKK307CisKK3N0cnVjdCBNaW1lVHlwZUxpc3R7CisgICAgaW50ICAgICAgICAgdHlwZTsKKyAgICBjb25zdCBjaGFyKiBwTWltZUV4dDsgIC8vIEV2ZXJ5dGhpbmcgYWZ0ZXIgdGhlICcvJyBlLmcuIGF1ZGlvL3gtbXBlZyAtPiAieC1tcGVnIgorICAgIGludCAgICAgICAgIHNpemU7ICAgICAgLy8gTnVtYmVyIG9mIGJ5dGVzLiBlLmcuICJ4LW1wZWciID0gNiBieXRlcworICAgIGNvbnN0IGNoYXIqIHBNaW1lVHlwZTsgLy8gTWltZXR5cGUgdGhhdCBzaG91bGQgYmUgcmV0dXJuZWQKK307CisKKworLy8gS25vd24gbWltZXR5cGVzIGJ5IGFuZHJvaWQKK3N0YXRpYyBjb25zdCBjaGFyIG1pbWVfdHlwZV9hdWRpb19tcGVnW10gID0gImF1ZGlvL21wZWciOworc3RhdGljIGNvbnN0IGNoYXIgbWltZV90eXBlX2F1ZGlvXzNncHBbXSAgPSAiYXVkaW8vM2dwcCI7CitzdGF0aWMgY29uc3QgY2hhciBtaW1lX3R5cGVfYXVkaW9fYW1yW10gICA9ICJhdWRpby9hbXItd2IiOworc3RhdGljIGNvbnN0IGNoYXIgbWltZV90eXBlX2F1ZGlvX2FhY1tdICAgPSAiYXVkaW8vbXA0YS1sYXRtIjsKK3N0YXRpYyBjb25zdCBjaGFyIG1pbWVfdHlwZV9hdWRpb193YXZbXSAgID0gImF1ZGlvL3dhdiI7CisKK3N0YXRpYyBjb25zdCBjaGFyIG1pbWVfdHlwZV92aWRlb19tcGVnNFtdID0gInZpZGVvL21wZWc0IjsKK3N0YXRpYyBjb25zdCBjaGFyIG1pbWVfdHlwZV92aWRlb18zZ3BwW10gID0gInZpZGVvLzNncHAiOworCisvLyBLbm93biBtaW1ldHlwZSBncm91cHMKK3N0YXRpYyBjb25zdCBjaGFyIG1pbWVfZ3JvdXBfYXVkaW9bXSAgICAgICA9ICJhdWRpby8iOworc3RhdGljIGNvbnN0IGNoYXIgbWltZV9ncm91cF9hcHBsaWNhdGlvbltdID0gImFwcGxpY2F0aW9uLyI7CitzdGF0aWMgY29uc3QgY2hhciBtaW1lX2dyb3VwX2ltYWdlW10gICAgICAgPSAiaW1hZ2UvIjsKK3N0YXRpYyBjb25zdCBjaGFyIG1pbWVfZ3JvdXBfdmlkZW9bXSAgICAgICA9ICJ2aWRlby8iOworCitzdGF0aWMgc3RydWN0IE1pbWVHcm91cCBtaW1lR3JvdXBbXSA9IHsKKyAgICB7TUlNRVRZUEVfQVVESU8sICAgICAgIG1pbWVfZ3JvdXBfYXVkaW8sICAgICAgICBzaXplb2YobWltZV9ncm91cF9hdWRpbyktMX0sCisgICAge01JTUVUWVBFX0FQUExJQ0FUSU9OLCBtaW1lX2dyb3VwX2FwcGxpY2F0aW9uLCAgc2l6ZW9mKG1pbWVfZ3JvdXBfYXBwbGljYXRpb24pLTF9LAorICAgIHtNSU1FVFlQRV9JTUFHRSwgICAgICAgbWltZV9ncm91cF9pbWFnZSwgICAgICAgIHNpemVvZihtaW1lX2dyb3VwX2ltYWdlKS0xfSwKKyAgICB7TUlNRVRZUEVfVklERU8sICAgICAgIG1pbWVfZ3JvdXBfdmlkZW8sICAgICAgICBzaXplb2YobWltZV9ncm91cF92aWRlbyktMX0sCisgICAge01JTUVUWVBFX0xBU1QsICAgICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgMH0gLy8gTXVzdCBiZSBsYXN0IGVudHJ5Cit9OworCisvLyBMaXN0IG9mIGFsbCBtaW1ldHlwZXMgdGhhdCBzaG91bGQgYmUgY29udmVydGVkLgorc3RhdGljIHN0cnVjdCBNaW1lVHlwZUxpc3QgbWltZVR5cGVMaXN0W10gPSB7CisgICAgLy8gTXAzIG1pbWUgdHlwZXMKKyAgICB7TUlNRVRZUEVfQVVESU8sICJtcDMiLCAgICAgICAgICBzaXplb2YoIm1wMyIpLTEsICAgICAgICAgbWltZV90eXBlX2F1ZGlvX21wZWd9LAorICAgIHtNSU1FVFlQRV9BVURJTywgIngtbXBlZyIsICAgICAgIHNpemVvZigieC1tcGVnIiktMSwgICAgICBtaW1lX3R5cGVfYXVkaW9fbXBlZ30sCisgICAge01JTUVUWVBFX0FVRElPLCAieC1tcDMiLCAgICAgICAgc2l6ZW9mKCJ4LW1wMyIpLTEsICAgICAgIG1pbWVfdHlwZV9hdWRpb19tcGVnfSwKKyAgICB7TUlNRVRZUEVfQVVESU8sICJtcGciLCAgICAgICAgICBzaXplb2YoIm1wZyIpLTEsICAgICAgICAgbWltZV90eXBlX2F1ZGlvX21wZWd9LAorICAgIHtNSU1FVFlQRV9BVURJTywgIm1wZzMiLCAgICAgICAgIHNpemVvZigibXBnIiktMSwgICAgICAgICBtaW1lX3R5cGVfYXVkaW9fbXBlZ30sCisgICAge01JTUVUWVBFX0FVRElPLCAieC1tcGciLCAgICAgICAgc2l6ZW9mKCJ4LW1wZyIpLTEsICAgICAgIG1pbWVfdHlwZV9hdWRpb19tcGVnfSwKKyAgICB7TUlNRVRZUEVfQVVESU8sICJ4LW1wZWdhdWRpbyIsICBzaXplb2YoIngtbXBlZ2F1ZGlvIiktMSwgbWltZV90eXBlX2F1ZGlvX21wZWd9LAorCisgICAgLy8gM2dwcCBhdWRpbyBtaW1lIHR5cGVzCisgICAge01JTUVUWVBFX0FVRElPLCAiM2dwIiwgICAgICAgICAgc2l6ZW9mKCIzZ3AiKS0xLCAgICAgICAgIG1pbWVfdHlwZV9hdWRpb18zZ3BwfSwKKworICAgIC8vIEFtciBhdWRpbyBtaW1lIHR5cGVzCisgICAge01JTUVUWVBFX0FVRElPLCAiYW1yIiwgICAgICAgICAgc2l6ZW9mKCJhbXIiKS0xLCAgICAgICAgIG1pbWVfdHlwZV9hdWRpb19hbXJ9LAorCisgICAgLy8gQWFjIGF1ZGlvIG1pbWUgdHlwZXMKKyAgICB7TUlNRVRZUEVfQVVESU8sICJhYWMiLCAgICAgICAgICBzaXplb2YoImFhYyIpLTEsICAgICAgICAgbWltZV90eXBlX2F1ZGlvX2FhY30sCisKKyAgICAvLyBXYXYgYXVkaW8gbWltZSB0eXBlcworICAgIHtNSU1FVFlQRV9BVURJTywgIngtd2F2IiwgICAgICAgIHNpemVvZigieC13YXYiKS0xLCAgICAgICBtaW1lX3R5cGVfYXVkaW9fd2F2fSwKKworICAgIC8vIE1wZWc0IHZpZGVvIG1pbWUgdHlwZXMKKyAgICB7TUlNRVRZUEVfVklERU8sICJtcGc0IiwgICAgICAgICBzaXplb2YoIm1wZzQiKS0xLCAgICAgICAgbWltZV90eXBlX3ZpZGVvX21wZWc0fSwKKyAgICB7TUlNRVRZUEVfVklERU8sICJtcDR2LWVzIiwgICAgICBzaXplb2YoIm1wNHYtZXMiKS0xLCAgICAgbWltZV90eXBlX3ZpZGVvX21wZWc0fSwKKworICAgIC8vIDNncHAgdmlkZW8gbWltZSB0eXBlcworICAgIHtNSU1FVFlQRV9WSURFTywgIjNncCIsICAgICAgICAgIHNpemVvZigiM2dwIiktMSwgICAgICAgICBtaW1lX3R5cGVfdmlkZW9fM2dwcH0sCisKKyAgICAvLyBNdXN0IGJlIGxhc3QgZW50cnkKKyAgICB7TUlNRVRZUEVfTEFTVCwgIE5VTEwsICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgTlVMTH0KK307CisKKy8qKgorICogTWF5IGNvbnZlcnQgdGhlIG1pbWV0eXBlIGlmIHRoZXJlIGlzIGEgd2VsbCBrbm93bgorICogcmVwbGFjZW1lbnQgbWltZXR5cGUgb3RoZXJ3aXNlIHRoZSBvcmlnaW5hbCBtaW1ldHlwZQorICogaXMgcmV0dXJuZWQuCisgKgorICogQHBhcmFtIG1pbWVUeXBlIC0gbWltZXR5cGUgaW4gbG93ZXIgY2FzZSB0byBjb252ZXJ0LgorICoKKyAqIEByZXR1cm4gbWltZXR5cGUgb3IgbnVsbC4KKyAqLworU3RyaW5nOCBNaW1lVHlwZVV0aWw6OmNvbnZlcnRNaW1lVHlwZShTdHJpbmc4JiBtaW1lVHlwZSkgeworICAgIFN0cmluZzggcmVzdWx0ID0gbWltZVR5cGU7CisgICAgY29uc3QgY2hhciogcFRtcDsKKyAgICBjb25zdCBjaGFyKiBwTWltZVR5cGU7CisgICAgc3RydWN0IE1pbWVHcm91cCogcEdyb3VwOworICAgIHN0cnVjdCBNaW1lVHlwZUxpc3QqIHBNaW1lSXRlbTsKKyAgICBpbnQgbGVuOworCisgICAgcE1pbWVUeXBlID0gbWltZVR5cGUuc3RyaW5nKCk7CisgICAgaWYgKE5VTEwgIT0gcE1pbWVUeXBlKSB7CisgICAgICAgIC8qIENoZWNrIHdoaWNoIGdyb3VwIHRoZSBtaW1ldHlwZSBpcyAqLworICAgICAgICBwR3JvdXAgPSBtaW1lR3JvdXA7CisKKyAgICAgICAgd2hpbGUgKE1JTUVUWVBFX0xBU1QgIT0gcEdyb3VwLT50eXBlKSB7CisgICAgICAgICAgICBpZiAoMCA9PSBzdHJuY21wKHBNaW1lVHlwZSwgcEdyb3VwLT5wR3JvdXAsIHBHcm91cC0+c2l6ZSkpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBHcm91cCsrOworICAgICAgICB9CisKKyAgICAgICAgLyogR28gdGhyb3VnaCB0aGUgbWltZXR5cGUgbGlzdC4gT25seSBjaGVjayBpdGVtcyBvZiB0aGUgY29ycmVjdCBncm91cCAqLworICAgICAgICBpZiAoTUlNRVRZUEVfTEFTVCAhPSBwR3JvdXAtPnR5cGUpIHsKKyAgICAgICAgICAgIHBNaW1lSXRlbSA9IG1pbWVUeXBlTGlzdDsKKyAgICAgICAgICAgIGxlbiA9IHN0cmxlbiAocE1pbWVUeXBlK3BHcm91cC0+c2l6ZSk7CisKKyAgICAgICAgICAgIHdoaWxlIChNSU1FVFlQRV9MQVNUICE9IHBNaW1lSXRlbS0+dHlwZSkgeworICAgICAgICAgICAgICAgIGlmICgobGVuID09IHBNaW1lSXRlbS0+c2l6ZSkgJiYKKyAgICAgICAgICAgICAgICAgICAgKDAgPT0gc3RyY21wKHBNaW1lVHlwZStwR3JvdXAtPnNpemUsIHBNaW1lSXRlbS0+cE1pbWVFeHQpKSkgeworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBTdHJpbmc4KHBNaW1lSXRlbS0+cE1pbWVUeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHBNaW1lSXRlbSsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIExPR0koImNvbnZlcnRNaW1lVHlwZSBnb3QgbWltZXR5cGUgJXMsIGNvbnZlcnRlZCBpbnRvIG1pbWV0eXBlICVzIiwKKyAgICAgICAgICAgICBwTWltZVR5cGUsIHJlc3VsdC5zdHJpbmcoKSk7CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdDsKK30KK307CmRpZmYgLS1naXQgYS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL0FuZHJvaWQubWsgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWVlNzk2MQotLS0gL2Rldi9udWxsCisrKyBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svQW5kcm9pZC5tawpAQCAtMCwwICsxLDE2IEBACisjCisjIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworaW5jbHVkZSAkKGNhbGwgYWxsLXN1YmRpci1tYWtlZmlsZXMpCmRpZmYgLS1naXQgYS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL0Z3ZExvY2tFbmdpbmUvQW5kcm9pZC5tayBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svRndkTG9ja0VuZ2luZS9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0YTZmMTgKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL0Z3ZExvY2tFbmdpbmUvQW5kcm9pZC5tawpAQCAtMCwwICsxLDY3IEBACisjCisjIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworYmFzZSA6PSBmcmFtZXdvcmtzL2Jhc2UKKworIyBEZXRlcm1pbmUgd2hldGhlciB0aGUgRFJNIGZyYW1ld29yayB1c2VzIDY0LWJpdCBkYXRhIHR5cGVzIGZvciBmaWxlIG9mZnNldHMgYW5kIGRvIHRoZSBzYW1lLgoraWZuZXEgKCQoc2hlbGwgZ3JlcCAtYyAnb2ZmNjRfdCBvZmZzZXQnICQoYmFzZSkvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2NvbW1vbi9pbmNsdWRlL0lEcm1FbmdpbmUuaCksIDApCitMT0NBTF9DRkxBR1MgKz0gLURVU0VfNjRCSVRfRFJNX0FQSQorZW5kaWYKKworTE9DQUxfU1JDX0ZJTEVTOj0gXAorICAgIHNyYy9Gd2RMb2NrRW5naW5lLmNwcAorCitMT0NBTF9NT0RVTEUgOj0gbGliZndkbG9ja2VuZ2luZQorCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKKyAgICBsaWJpY3VpMThuIFwKKyAgICBsaWJpY3V1YyBcCisgICAgbGlidXRpbHMgXAorICAgIGxpYmRsIFwKKyAgICBsaWJhbmRyb2lkX3J1bnRpbWUgXAorICAgIGxpYm5hdGl2ZWhlbHBlciBcCisgICAgbGliY3J5cHRvIFwKKyAgICBsaWJzc2wgXAorICAgIGxpYmRybWZyYW1ld29yaworCitMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IFwKKyAgICBsaWJkcm11dGlsaXR5IFwKKyAgICBsaWJkcm1mcmFtZXdvcmtjb21tb24gXAorICAgIGxpYmZ3ZGxvY2stY29tbW9uIFwKKyAgICBsaWJmd2Rsb2NrLWNvbnZlcnRlciBcCisgICAgbGliZndkbG9jay1kZWNvZGVyCisKK0xPQ0FMX1BSRUxJTktfTU9EVUxFIDo9IGZhbHNlCisKK0xPQ0FMX0NfSU5DTFVERVMgKz0gXAorICAgICQoSk5JX0hfSU5DTFVERSkgXAorICAgICQoYmFzZSkvaW5jbHVkZS9kcm0gXAorICAgICQoYmFzZSkvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2NvbW1vbi9pbmNsdWRlIFwKKyAgICAkKGJhc2UpL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9jb21tb24vdXRpbC9pbmNsdWRlIFwKKyAgICAkKGJhc2UpL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svaW50ZXJuYWwtZm9ybWF0L2NvbW1vbiBcCisgICAgJChiYXNlKS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9jb252ZXJ0ZXIgXAorICAgICQoYmFzZSkvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9pbnRlcm5hbC1mb3JtYXQvZGVjb2RlciBcCisgICAgJChMT0NBTF9QQVRIKS9pbmNsdWRlIFwKKyAgICBleHRlcm5hbC9vcGVuc3NsL2luY2x1ZGUKKworTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX1NIQVJFRF9MSUJSQVJJRVMpL2RybS9wbHVnaW5zL25hdGl2ZQorCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorCitpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL0Z3ZExvY2tFbmdpbmUvaW5jbHVkZS9Gd2RMb2NrRW5naW5lLmggYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL0Z3ZExvY2tFbmdpbmUvaW5jbHVkZS9Gd2RMb2NrRW5naW5lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQ4MDRjZgotLS0gL2Rldi9udWxsCisrKyBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svRndkTG9ja0VuZ2luZS9pbmNsdWRlL0Z3ZExvY2tFbmdpbmUuaApAQCAtMCwwICsxLDU1OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX19GV0RMT0NLRU5HSU5FX0hfXworI2RlZmluZSBfX0ZXRExPQ0tFTkdJTkVfSF9fCisKKyNpbmNsdWRlIDxEcm1FbmdpbmVCYXNlLmg+CisjaW5jbHVkZSA8RHJtQ29uc3RyYWludHMuaD4KKyNpbmNsdWRlIDxEcm1SaWdodHMuaD4KKyNpbmNsdWRlIDxEcm1JbmZvLmg+CisjaW5jbHVkZSA8RHJtSW5mb1N0YXR1cy5oPgorI2luY2x1ZGUgPERybUNvbnZlcnRlZFN0YXR1cy5oPgorI2luY2x1ZGUgPERybUluZm9SZXF1ZXN0Lmg+CisjaW5jbHVkZSA8RHJtU3VwcG9ydEluZm8uaD4KKyNpbmNsdWRlIDxEcm1JbmZvRXZlbnQuaD4KKworI2luY2x1ZGUgIlNlc3Npb25NYXAuaCIKKyNpbmNsdWRlICJGd2RMb2NrQ29udi5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qKgorICogRm9yd2FyZCBMb2NrIEVuZ2luZSBjbGFzcy4KKyAqLworY2xhc3MgRndkTG9ja0VuZ2luZSA6IHB1YmxpYyBhbmRyb2lkOjpEcm1FbmdpbmVCYXNlIHsKKworcHVibGljOgorICAgIEZ3ZExvY2tFbmdpbmUoKTsKKyAgICB2aXJ0dWFsIH5Gd2RMb2NrRW5naW5lKCk7CisKK3Byb3RlY3RlZDoKKy8qKgorICogR2V0IGNvbnN0cmFpbnQgaW5mb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIGlucHV0IGNvbnRlbnQuCisgKgorICogQHBhcmFtIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNlc3Npb24KKyAqIEBwYXJhbSBwYXRoIFBhdGggb2YgdGhlIHByb3RlY3RlZCBjb250ZW50CisgKiBAcGFyYW0gYWN0aW9uIEFjdGlvbnMgZGVmaW5lZCBzdWNoIGFzLAorICogICAgIEFjdGlvbjo6REVGQVVMVCwgQWN0aW9uOjpQTEFZLCBldGMKKyAqIEByZXR1cm4gRHJtQ29uc3RyYWludHMKKyAqICAgICBrZXktdmFsdWUgcGFpcnMgb2YgY29uc3RyYWludCBhcmUgZW1iZWRkZWQgaW4gaXQKKyAqIEBub3RlCisgKiAgICAgSW4gY2FzZSBvZiBlcnJvciwgcmV0dXJuIE5VTEwKKyAqLworRHJtQ29uc3RyYWludHMqIG9uR2V0Q29uc3RyYWludHMoaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4KiBwYXRoLCBpbnQgYWN0aW9uKTsKKworLyoqCisgKiBHZXQgbWV0YWRhdGEgaW5mb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIGlucHV0IGNvbnRlbnQuCisgKgorICogQHBhcmFtIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNlc3Npb24KKyAqIEBwYXJhbSBwYXRoIFBhdGggb2YgdGhlIHByb3RlY3RlZCBjb250ZW50CisgKiBAcmV0dXJuIERybU1ldGFkYXRhCisgKiAgICAgIEZvciBGb3J3YXJkIExvY2sgZW5naW5lLCBpdCByZXR1cm5zIGFuIGVtcHR5IG9iamVjdAorICogQG5vdGUKKyAqICAgICBJbiBjYXNlIG9mIGVycm9yLCByZXR1cm5zIE5VTEwKKyAqLworRHJtTWV0YWRhdGEqIG9uR2V0TWV0YWRhdGEoaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4KiBwYXRoKTsKKworLyoqCisgKiBJbml0aWFsaXplIHBsdWctaW4uCisgKgorICogQHBhcmFtIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNlc3Npb24KKyAqIEByZXR1cm4gc3RhdHVzX3QKKyAqICAgICBSZXR1cm5zIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcywgRFJNX0VSUk9SX1VOS05PV04gZm9yIGZhaWx1cmUKKyAqLworc3RhdHVzX3Qgb25Jbml0aWFsaXplKGludCB1bmlxdWVJZCk7CisKKy8qKgorICogUmVnaXN0ZXIgYSBjYWxsYmFjayB0byBiZSBpbnZva2VkIHdoZW4gdGhlIGNhbGxlciByZXF1aXJlZCB0bworICogcmVjZWl2ZSBuZWNlc3NhcnkgaW5mb3JtYXRpb24uCisgKgorICogQHBhcmFtIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNlc3Npb24KKyAqIEBwYXJhbSBpbmZvTGlzdGVuZXIgTGlzdGVuZXIKKyAqIEByZXR1cm4gc3RhdHVzX3QKKyAqICAgICBSZXR1cm5zIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcywgRFJNX0VSUk9SX1VOS05PV04gZm9yIGZhaWx1cmUKKyAqLworc3RhdHVzX3Qgb25TZXRPbkluZm9MaXN0ZW5lcihpbnQgdW5pcXVlSWQsIGNvbnN0IElEcm1FbmdpbmU6Ok9uSW5mb0xpc3RlbmVyKiBpbmZvTGlzdGVuZXIpOworCisvKioKKyAqIFRlcm1pbmF0ZSB0aGUgcGx1Zy1pbiBhbmQgcmVsZWFzZSByZXNvdXJjZXMgYm91bmQgdG8gaXQuCisgKgorICogQHBhcmFtIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNlc3Npb24KKyAqIEByZXR1cm4gc3RhdHVzX3QKKyAqICAgICBSZXR1cm5zIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcywgRFJNX0VSUk9SX1VOS05PV04gZm9yIGZhaWx1cmUKKyAqLworc3RhdHVzX3Qgb25UZXJtaW5hdGUoaW50IHVuaXF1ZUlkKTsKKworLyoqCisgKiBHZXQgd2hldGhlciB0aGUgZ2l2ZW4gY29udGVudCBjYW4gYmUgaGFuZGxlZCBieSB0aGlzIHBsdWdpbiBvciBub3QuCisgKgorICogQHBhcmFtIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNlc3Npb24KKyAqIEBwYXJhbSBwYXRoIFBhdGggdG8gdGhlIHByb3RlY3RlZCBvYmplY3QKKyAqIEByZXR1cm4gYm9vbAorICogICAgICBSZXR1cm5zIHRydWUgaWYgdGhpcyBwbHVnaW4gY2FuIGhhbmRsZSAsIGZhbHNlIGluIGNhc2Ugb2Ygbm90IGFibGUgdG8gaGFuZGxlCisgKi8KK2Jvb2wgb25DYW5IYW5kbGUoaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBwYXRoKTsKKworLyoqCisgKiBQcm9jZXNzZXMgdGhlIGdpdmVuIERSTSBpbmZvcm1hdGlvbiBhcyBhcHByb3ByaWF0ZSBmb3IgaXRzIHR5cGUuCisgKiBOb3QgdXNlZCBmb3IgRm9yd2FyZCBMb2NrIEVuZ2luZS4KKyAqCisgKiBAcGFyYW0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc2Vzc2lvbgorICogQHBhcmFtIGRybUluZm8gSW5mb3JtYXRpb24gdGhhdCBuZWVkcyB0byBiZSBwcm9jZXNzZWQKKyAqIEByZXR1cm4gRHJtSW5mb1N0YXR1cworICogICAgICBpbnN0YW5jZSBhcyBhIHJlc3VsdCBvZiBwcm9jZXNzaW5nIGdpdmVuIGlucHV0CisgKi8KK0RybUluZm9TdGF0dXMqIG9uUHJvY2Vzc0RybUluZm8oaW50IHVuaXF1ZUlkLCBjb25zdCBEcm1JbmZvKiBkcm1JbmZvKTsKKworLyoqCisgKiBTYXZlIERSTSByaWdodHMgdG8gc3BlY2lmaWVkIHJpZ2h0cyBwYXRoCisgKiBhbmQgbWFrZSBhc3NvY2lhdGlvbiB3aXRoIGNvbnRlbnQgcGF0aC4KKyAqCisgKiBAcGFyYW0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc2Vzc2lvbgorICogQHBhcmFtIGRybVJpZ2h0cyBEcm1SaWdodHMgdG8gYmUgc2F2ZWQKKyAqIEBwYXJhbSByaWdodHNQYXRoIEZpbGUgcGF0aCB3aGVyZSByaWdodHMgdG8gYmUgc2F2ZWQKKyAqIEBwYXJhbSBjb250ZW50UGF0aCBGaWxlIHBhdGggd2hlcmUgY29udGVudCB3YXMgc2F2ZWQKKyAqIEByZXR1cm4gc3RhdHVzX3QKKyAqICAgICBSZXR1cm5zIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcywgRFJNX0VSUk9SX1VOS05PV04gZm9yIGZhaWx1cmUKKyAqLworc3RhdHVzX3Qgb25TYXZlUmlnaHRzKGludCB1bmlxdWVJZCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEcm1SaWdodHMmIGRybVJpZ2h0cywKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiByaWdodHNQYXRoLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGNvbnRlbnRQYXRoKTsKKworLyoqCisgKiBSZXRyaWV2ZXMgbmVjZXNzYXJ5IGluZm9ybWF0aW9uIGZvciByZWdpc3RyYXRpb24sIHVucmVnaXN0cmF0aW9uIG9yIHJpZ2h0cworICogYWNxdWlzaXRpb24gaW5mb3JtYXRpb24uCisgKgorICogQHBhcmFtIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNlc3Npb24KKyAqIEBwYXJhbSBkcm1JbmZvUmVxdWVzdCBSZXF1ZXN0IGluZm9ybWF0aW9uIHRvIHJldHJpZXZlIGRybUluZm8KKyAqIEByZXR1cm4gRHJtSW5mbworICogICAgICBpbnN0YW5jZSBhcyBhIHJlc3VsdCBvZiBwcm9jZXNzaW5nIGdpdmVuIGlucHV0CisgKi8KK0RybUluZm8qIG9uQWNxdWlyZURybUluZm8oaW50IHVuaXF1ZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEcm1JbmZvUmVxdWVzdCogZHJtSW5mb1JlcXVlc3QpOworCisvKioKKyAqIFJldHJpZXZlcyB0aGUgbWltZSB0eXBlIGVtYmVkZGVkIGluc2lkZSB0aGUgb3JpZ2luYWwgY29udGVudC4KKyAqCisgKiBAcGFyYW0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc2Vzc2lvbgorICogQHBhcmFtIHBhdGggUGF0aCBvZiB0aGUgcHJvdGVjdGVkIGNvbnRlbnQKKyAqIEByZXR1cm4gU3RyaW5nOAorICogICAgICAgUmV0dXJucyBtaW1lLXR5cGUgb2YgdGhlIG9yaWdpbmFsIGNvbnRlbnQsIHN1Y2ggYXMgInZpZGVvL21wZWciCisgKi8KK1N0cmluZzggb25HZXRPcmlnaW5hbE1pbWVUeXBlKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCk7CisKKy8qKgorICogUmV0cmlldmVzIHRoZSB0eXBlIG9mIHRoZSBwcm90ZWN0ZWQgb2JqZWN0IChjb250ZW50LCByaWdodHMsIGV0Yy4uKQorICogdXNpbmcgc3BlY2lmaWVkIHBhdGggb3IgbWltZXR5cGUuIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgc2hvdWxkIGJlIG5vbiBudWxsCisgKiB0byByZXRyaWV2ZSBEUk0gb2JqZWN0IHR5cGUuCisgKgorICogQHBhcmFtIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNlc3Npb24KKyAqIEBwYXJhbSBwYXRoIFBhdGggb2YgdGhlIGNvbnRlbnQgb3IgbnVsbC4KKyAqIEBwYXJhbSBtaW1lVHlwZSBNaW1lIHR5cGUgb2YgdGhlIGNvbnRlbnQgb3IgbnVsbC4KKyAqIEByZXR1cm4gdHlwZSBvZiB0aGUgRFJNIGNvbnRlbnQsCisgKiAgICAgc3VjaCBhcyBEcm1PYmplY3RUeXBlOjpDT05URU5ULCBEcm1PYmplY3RUeXBlOjpSSUdIVFNfT0JKRUNUCisgKi8KK2ludCBvbkdldERybU9iamVjdFR5cGUoaW50IHVuaXF1ZUlkLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBtaW1lVHlwZSk7CisKKy8qKgorICogQ2hlY2sgd2hldGhlciB0aGUgZ2l2ZW4gY29udGVudCBoYXMgdmFsaWQgcmlnaHRzIG9yIG5vdC4KKyAqCisgKiBAcGFyYW0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc2Vzc2lvbgorICogQHBhcmFtIHBhdGggUGF0aCBvZiB0aGUgcHJvdGVjdGVkIGNvbnRlbnQKKyAqIEBwYXJhbSBhY3Rpb24gQWN0aW9uIHRvIHBlcmZvcm0gKEFjdGlvbjo6REVGQVVMVCwgQWN0aW9uOjpQTEFZLCBldGMpCisgKiBAcmV0dXJuIHRoZSBzdGF0dXMgb2YgdGhlIHJpZ2h0cyBmb3IgdGhlIHByb3RlY3RlZCBjb250ZW50LAorICogICAgIHN1Y2ggYXMgUmlnaHRzU3RhdHVzOjpSSUdIVFNfVkFMSUQsIFJpZ2h0c1N0YXR1czo6UklHSFRTX0VYUElSRUQsIGV0Yy4KKyAqLworaW50IG9uQ2hlY2tSaWdodHNTdGF0dXMoaW50IHVuaXF1ZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBhY3Rpb24pOworCisvKioKKyAqIENvbnN1bWVzIHRoZSByaWdodHMgZm9yIGEgY29udGVudC4KKyAqIElmIHRoZSByZXNlcnZlIHBhcmFtZXRlciBpcyB0cnVlIHRoZSByaWdodHMgYXJlIHJlc2VydmVkIHVudGlsIHRoZSBzYW1lCisgKiBhcHBsaWNhdGlvbiBjYWxscyB0aGlzIGFwaSBhZ2FpbiB3aXRoIHRoZSByZXNlcnZlIHBhcmFtZXRlciBzZXQgdG8gZmFsc2UuCisgKgorICogQHBhcmFtIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNlc3Npb24KKyAqIEBwYXJhbSBkZWNyeXB0SGFuZGxlIEhhbmRsZSBmb3IgdGhlIGRlY3J5cHRpb24gc2Vzc2lvbgorICogQHBhcmFtIGFjdGlvbiBBY3Rpb24gdG8gcGVyZm9ybS4gKEFjdGlvbjo6REVGQVVMVCwgQWN0aW9uOjpQTEFZLCBldGMpCisgKiBAcGFyYW0gcmVzZXJ2ZSBUcnVlIGlmIHRoZSByaWdodHMgc2hvdWxkIGJlIHJlc2VydmVkLgorICogQHJldHVybiBzdGF0dXNfdAorICogICAgIFJldHVybnMgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzLCBEUk1fRVJST1JfVU5LTk9XTiBmb3IgZmFpbHVyZQorICovCitzdGF0dXNfdCBvbkNvbnN1bWVSaWdodHMoaW50IHVuaXF1ZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHJlc2VydmUpOworCisvKioKKyAqIEluZm9ybXMgdGhlIERSTSBFbmdpbmUgYWJvdXQgdGhlIHBsYXliYWNrIGFjdGlvbnMgcGVyZm9ybWVkIG9uIHRoZSBEUk0gZmlsZXMuCisgKgorICogQHBhcmFtIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNlc3Npb24KKyAqIEBwYXJhbSBkZWNyeXB0SGFuZGxlIEhhbmRsZSBmb3IgdGhlIGRlY3J5cHRpb24gc2Vzc2lvbgorICogQHBhcmFtIHBsYXliYWNrU3RhdHVzIFBsYXliYWNrIGFjdGlvbiAoUGxheWJhY2s6OlNUQVJULCBQbGF5YmFjazo6U1RPUCwgUGxheWJhY2s6OlBBVVNFKQorICogQHBhcmFtIHBvc2l0aW9uIFBvc2l0aW9uIGluIHRoZSBmaWxlIChpbiBtaWxsaXNlY29uZHMpIHdoZXJlIHRoZSBzdGFydCBvY2N1cnMuCisgKiAgICAgT25seSB2YWxpZCB0b2dldGhlciB3aXRoIFBsYXliYWNrOjpTVEFSVC4KKyAqIEByZXR1cm4gc3RhdHVzX3QKKyAqICAgICBSZXR1cm5zIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcywgRFJNX0VSUk9SX1VOS05PV04gZm9yIGZhaWx1cmUKKyAqLworI2lmZGVmIFVTRV82NEJJVF9EUk1fQVBJCitzdGF0dXNfdCBvblNldFBsYXliYWNrU3RhdHVzKGludCB1bmlxdWVJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBsYXliYWNrU3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHBvc2l0aW9uKTsKKyNlbHNlCitzdGF0dXNfdCBvblNldFBsYXliYWNrU3RhdHVzKGludCB1bmlxdWVJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBsYXliYWNrU3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcG9zaXRpb24pOworI2VuZGlmCisKKy8qKgorICogIFZhbGlkYXRlcyB3aGV0aGVyIGFuIGFjdGlvbiBvbiB0aGUgRFJNIGNvbnRlbnQgaXMgYWxsb3dlZCBvciBub3QuCisgKgorICogQHBhcmFtIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNlc3Npb24KKyAqIEBwYXJhbSBwYXRoIFBhdGggb2YgdGhlIHByb3RlY3RlZCBjb250ZW50CisgKiBAcGFyYW0gYWN0aW9uIEFjdGlvbiB0byB2YWxpZGF0ZSAoQWN0aW9uOjpQTEFZLCBBY3Rpb246OlRSQU5TRkVSLCBldGMpCisgKiBAcGFyYW0gZGVzY3JpcHRpb24gRGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgdGhlIGFjdGlvbgorICogQHJldHVybiB0cnVlIGlmIHRoZSBhY3Rpb24gaXMgYWxsb3dlZC4KKyAqLworYm9vbCBvblZhbGlkYXRlQWN0aW9uKGludCB1bmlxdWVJZCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBwYXRoLAorICAgICAgICAgICAgICAgICAgICAgIGludCBhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWN0aW9uRGVzY3JpcHRpb24mIGRlc2NyaXB0aW9uKTsKKworLyoqCisgKiBSZW1vdmVzIHRoZSByaWdodHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBwcm90ZWN0ZWQgY29udGVudC4KKyAqIE5vdCB1c2VkIGZvciBGb3J3YXJkIExvY2sgRW5naW5lLgorICoKKyAqIEBwYXJhbSB1bmlxdWVJZCBVbmlxdWUgaWRlbnRpZmllciBmb3IgYSBzZXNzaW9uCisgKiBAcGFyYW0gcGF0aCBQYXRoIG9mIHRoZSBwcm90ZWN0ZWQgY29udGVudAorICogQHJldHVybiBzdGF0dXNfdAorICogICAgIFJldHVybnMgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzLCBEUk1fRVJST1JfVU5LTk9XTiBmb3IgZmFpbHVyZQorICovCitzdGF0dXNfdCBvblJlbW92ZVJpZ2h0cyhpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgpOworCisvKioKKyAqIFJlbW92ZXMgYWxsIHRoZSByaWdodHMgaW5mb3JtYXRpb24gb2YgZWFjaCBwbHVnLWluIGFzc29jaWF0ZWQgd2l0aAorICogRFJNIGZyYW1ld29yay4gV2lsbCBiZSB1c2VkIGluIG1hc3RlciByZXNldCBidXQgZG9lcyBub3RoaW5nIGZvcgorICogRm9yd2FyZCBMb2NrIEVuZ2luZS4KKyAqCisgKiBAcGFyYW0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc2Vzc2lvbgorICogQHJldHVybiBzdGF0dXNfdAorICogICAgIFJldHVybnMgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzLCBEUk1fRVJST1JfVU5LTk9XTiBmb3IgZmFpbHVyZQorICovCitzdGF0dXNfdCBvblJlbW92ZUFsbFJpZ2h0cyhpbnQgdW5pcXVlSWQpOworCisvKioKKyAqIFN0YXJ0cyB0aGUgRm9yd2FyZCBMb2NrIGZpbGUgY29udmVyc2lvbiBzZXNzaW9uLgorICogRWFjaCB0aW1lIHRoZSBhcHBsaWNhdGlvbiB0cmllcyB0byBkb3dubG9hZCBhIG5ldyBEUk0gZmlsZQorICogd2hpY2ggbmVlZHMgdG8gYmUgY29udmVydGVkLCB0aGVuIHRoZSBhcHBsaWNhdGlvbiBoYXMgdG8KKyAqIGJlZ2luIHdpdGggY2FsbGluZyB0aGlzIEFQSS4gVGhlIGNvbnZlcnRJZCBpcyB1c2VkIGFzIHRoZSBjb252ZXJzaW9uIHNlc3Npb24ga2V5CisgKiBhbmQgbXVzdCBub3QgYmUgdGhlIHNhbWUgZm9yIGRpZmZlcmVudCBjb252ZXJ0IHNlc3Npb25zLgorICoKKyAqIEBwYXJhbSB1bmlxdWVJZCBVbmlxdWUgaWRlbnRpZmllciBmb3IgYSBzZXNzaW9uCisgKiBAcGFyYW0gY29udmVydElkIEhhbmRsZSBmb3IgdGhlIGNvbnZlcnQgc2Vzc2lvbgorICogQHJldHVybiBzdGF0dXNfdAorICogICAgIFJldHVybnMgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzLCBEUk1fRVJST1JfVU5LTk9XTiBmb3IgZmFpbHVyZQorICovCitzdGF0dXNfdCBvbk9wZW5Db252ZXJ0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIGludCBjb252ZXJ0SWQpOworCisvKioKKyAqIEFjY2VwdHMgYW5kIGNvbnZlcnRzIHRoZSBpbnB1dCBkYXRhIHdoaWNoIGlzIHBhcnQgb2YgRFJNIGZpbGUuCisgKiBUaGUgcmVzdWx0YW50IGNvbnZlcnRlZCBkYXRhIGFuZCB0aGUgc3RhdHVzIGlzIHJldHVybmVkIGluIHRoZSBEcm1Db252ZXJ0ZWRJbmZvCisgKiBvYmplY3QuIFRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIGVhY2ggdGltZSB0aGVyZSBpcyBhIG5ldyBibG9jaworICogb2YgZGF0YSByZWNlaXZlZCBieSB0aGUgYXBwbGljYXRpb24uCisgKgorICogQHBhcmFtIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNlc3Npb24KKyAqIEBwYXJhbSBjb252ZXJ0SWQgSGFuZGxlIGZvciB0aGUgY29udmVydCBzZXNzaW9uCisgKiBAcGFyYW0gaW5wdXREYXRhIElucHV0IERhdGEgd2hpY2ggbmVlZCB0byBiZSBjb252ZXJ0ZWQKKyAqIEByZXR1cm4gUmV0dXJuIG9iamVjdCBjb250YWlucyB0aGUgc3RhdHVzIG9mIHRoZSBkYXRhIGNvbnZlcnNpb24sCisgKiAgICAgICB0aGUgb3V0cHV0IGNvbnZlcnRlZCBkYXRhIGFuZCBvZmZzZXQuIEluIHRoaXMgY2FzZSB0aGUKKyAqICAgICAgYXBwbGljYXRpb24gd2lsbCBpZ25vcmUgdGhlIG9mZnNldCBpbmZvcm1hdGlvbi4KKyAqLworRHJtQ29udmVydGVkU3RhdHVzKiBvbkNvbnZlcnREYXRhKGludCB1bmlxdWVJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29udmVydElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERybUJ1ZmZlciogaW5wdXREYXRhKTsKKworLyoqCisgKiBDbG9zZXMgdGhlIGNvbnZlcnQgc2Vzc2lvbiBpbiBjYXNlIG9mIGRhdGEgc3VwcGx5IGNvbXBsZXRlZCBvciBlcnJvciBvY2N1cnJlZC4KKyAqIFVwb24gc3VjY2Vzc2Z1bCBjb252ZXJzaW9uIG9mIHRoZSBjb21wbGV0ZSBkYXRhLCBpdCByZXR1cm5zIHNpZ25hdHVyZSBjYWxjdWxhdGVkIG92ZXIKKyAqIHRoZSBlbnRpcmUgZGF0YSB1c2VkIG92ZXIgYSBjb252ZXJzaW9uIHNlc3Npb24uIFRoaXMgc2lnbmF0dXJlIG11c3QgYmUgY29waWVkIHRvIHRoZSBvZmZzZXQKKyAqIG1lbnRpb25lZCBpbiB0aGUgRHJtQ29udmVydGVkU3RhdHVzLiBTaWduYXR1cmUgaXMgdXNlZCBmb3IgZGF0YSBpbnRlZ3JpdHkgcHJvdGVjdGlvbi4KKyAqCisgKiBAcGFyYW0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc2Vzc2lvbgorICogQHBhcmFtIGNvbnZlcnRJZCBIYW5kbGUgZm9yIHRoZSBjb252ZXJ0IHNlc3Npb24KKyAqIEByZXR1cm4gUmV0dXJuIG9iamVjdCBjb250YWlucyB0aGUgc3RhdHVzIG9mIHRoZSBkYXRhIGNvbnZlcnNpb24sCisgKiAgICAgIHRoZSBoZWFkZXIgYW5kIGJvZHkgc2lnbmF0dXJlIGRhdGEuIEl0IGFsc28gaW5mb3JtcworICogICAgICB0aGUgYXBwbGljYXRpb24gYWJvdXQgdGhlIGZpbGUgb2Zmc2V0IGF0IHdoaWNoIHRoaXMKKyAqICAgICAgc2lnbmF0dXJlIGRhdGEgc2hvdWxkIGJlIHdyaXR0ZW4uCisgKi8KK0RybUNvbnZlcnRlZFN0YXR1cyogb25DbG9zZUNvbnZlcnRTZXNzaW9uKGludCB1bmlxdWVJZCwgaW50IGNvbnZlcnRJZCk7CisKKy8qKgorICogUmV0dXJucyB0aGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIERybSBFbmdpbmUgY2FwYWJpbGl0aWVzIHdoaWNoIGluY2x1ZGVzCisgKiBzdXBwb3J0ZWQgTWltZVR5cGVzIGFuZCBmaWxlIHN1ZmZpeGVzLgorICoKKyAqIEBwYXJhbSB1bmlxdWVJZCBVbmlxdWUgaWRlbnRpZmllciBmb3IgYSBzZXNzaW9uCisgKiBAcmV0dXJuIERybVN1cHBvcnRJbmZvCisgKiAgICAgIGluc3RhbmNlIHdoaWNoIGhvbGRzIHRoZSBjYXBhYmlsaXRpZXMgb2YgYSBwbHVnLWluCisgKi8KK0RybVN1cHBvcnRJbmZvKiBvbkdldFN1cHBvcnRJbmZvKGludCB1bmlxdWVJZCk7CisKKy8qKgorICogT3BlbiB0aGUgZGVjcnlwdCBzZXNzaW9uIHRvIGRlY3J5cHQgdGhlIGdpdmVuIHByb3RlY3RlZCBjb250ZW50LgorICoKKyAqIEBwYXJhbSB1bmlxdWVJZCBVbmlxdWUgaWRlbnRpZmllciBmb3IgYSBzZXNzaW9uCisgKiBAcGFyYW0gZGVjcnlwdEhhbmRsZSBIYW5kbGUgZm9yIHRoZSBjdXJyZW50IGRlY3J5cHRpb24gc2Vzc2lvbgorICogQHBhcmFtIGZkIEZpbGUgZGVzY3JpcHRvciBvZiB0aGUgcHJvdGVjdGVkIGNvbnRlbnQgdG8gYmUgZGVjcnlwdGVkCisgKiBAcGFyYW0gb2Zmc2V0IFN0YXJ0IHBvc2l0aW9uIG9mIHRoZSBjb250ZW50CisgKiBAcGFyYW0gbGVuZ3RoIFRoZSBsZW5ndGggb2YgdGhlIHByb3RlY3RlZCBjb250ZW50CisgKiBAcmV0dXJuCisgKiAgICAgRFJNX0VSUk9SX0NBTk5PVF9IQU5ETEUgZm9yIGZhaWx1cmUgYW5kIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcworICovCisjaWZkZWYgVVNFXzY0QklUX0RSTV9BUEkKK3N0YXR1c190IG9uT3BlbkRlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmQsIG9mZjY0X3Qgb2Zmc2V0LCBvZmY2NF90IGxlbmd0aCk7CisjZWxzZQorc3RhdHVzX3Qgb25PcGVuRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmZCwgaW50IG9mZnNldCwgaW50IGxlbmd0aCk7CisjZW5kaWYKKworLyoqCisgKiBPcGVuIHRoZSBkZWNyeXB0IHNlc3Npb24gdG8gZGVjcnlwdCB0aGUgZ2l2ZW4gcHJvdGVjdGVkIGNvbnRlbnQuCisgKgorICogQHBhcmFtIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNlc3Npb24KKyAqIEBwYXJhbSBkZWNyeXB0SGFuZGxlIEhhbmRsZSBmb3IgdGhlIGN1cnJlbnQgZGVjcnlwdGlvbiBzZXNzaW9uCisgKiBAcGFyYW0gdXJpIFBhdGggb2YgdGhlIHByb3RlY3RlZCBjb250ZW50IHRvIGJlIGRlY3J5cHRlZAorICogQHJldHVybgorICogICAgIERSTV9FUlJPUl9DQU5OT1RfSEFORExFIGZvciBmYWlsdXJlIGFuZCBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MKKyAqLworc3RhdHVzX3Qgb25PcGVuRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHVyaSk7CisKKy8qKgorICogQ2xvc2UgdGhlIGRlY3J5cHQgc2Vzc2lvbiBmb3IgdGhlIGdpdmVuIGhhbmRsZS4KKyAqCisgKiBAcGFyYW0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc2Vzc2lvbgorICogQHBhcmFtIGRlY3J5cHRIYW5kbGUgSGFuZGxlIGZvciB0aGUgZGVjcnlwdGlvbiBzZXNzaW9uCisgKiBAcmV0dXJuIHN0YXR1c190CisgKiAgICAgUmV0dXJucyBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MsIERSTV9FUlJPUl9VTktOT1dOIGZvciBmYWlsdXJlCisgKi8KK3N0YXR1c190IG9uQ2xvc2VEZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSk7CisKKy8qKgorICogSW5pdGlhbGl6ZSBkZWNyeXB0aW9uIGZvciB0aGUgZ2l2ZW4gdW5pdCBvZiB0aGUgcHJvdGVjdGVkIGNvbnRlbnQuCisgKgorICogQHBhcmFtIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNlc3Npb24KKyAqIEBwYXJhbSBkZWNyeXB0SGFuZGxlIEhhbmRsZSBmb3IgdGhlIGRlY3J5cHRpb24gc2Vzc2lvbgorICogQHBhcmFtIGRlY3J5cHRVbml0SWQgSUQgd2hpY2ggc3BlY2lmaWVzIGRlY3J5cHRpb24gdW5pdCwgc3VjaCBhcyB0cmFjayBJRAorICogQHBhcmFtIGhlYWRlckluZm8gSW5mb3JtYXRpb24gZm9yIGluaXRpYWxpemluZyBkZWNyeXB0aW9uIG9mIHRoaXMgZGVjcnlwVW5pdAorICogQHJldHVybgorICogICAgIERSTV9FUlJPUl9DQU5OT1RfSEFORExFIGZvciBmYWlsdXJlIGFuZCBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MKKyAqLworc3RhdHVzX3Qgb25Jbml0aWFsaXplRGVjcnlwdFVuaXQoaW50IHVuaXF1ZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWNyeXB0VW5pdElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRHJtQnVmZmVyKiBoZWFkZXJJbmZvKTsKKworLyoqCisgKiBEZWNyeXB0IHRoZSBwcm90ZWN0ZWQgY29udGVudCBidWZmZXJzIGZvciB0aGUgZ2l2ZW4gdW5pdC4KKyAqIFRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIGFueSBudW1iZXIgb2YgdGltZXMsIGJhc2VkIG9uIG51bWJlciBvZgorICogZW5jcnlwdGVkIHN0cmVhbXMgcmVjZWl2ZWQgZnJvbSBhcHBsaWNhdGlvbi4KKyAqCisgKiBAcGFyYW0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc2Vzc2lvbgorICogQHBhcmFtIGRlY3J5cHRIYW5kbGUgSGFuZGxlIGZvciB0aGUgZGVjcnlwdGlvbiBzZXNzaW9uCisgKiBAcGFyYW0gZGVjcnlwdFVuaXRJZCBJRCB3aGljaCBzcGVjaWZpZXMgZGVjcnlwdGlvbiB1bml0LCBzdWNoIGFzIHRyYWNrIElECisgKiBAcGFyYW0gZW5jQnVmZmVyIEVuY3J5cHRlZCBkYXRhIGJsb2NrCisgKiBAcGFyYW0gZGVjQnVmZmVyIERlY3J5cHRlZCBkYXRhIGJsb2NrCisgKiBAcmV0dXJuIHN0YXR1c190CisgKiAgICAgUmV0dXJucyB0aGUgZXJyb3IgY29kZSBmb3IgdGhpcyBBUEkKKyAqICAgICBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MsIGFuZCBvbmUgb2YgRFJNX0VSUk9SX1VOS05PV04sIERSTV9FUlJPUl9MSUNFTlNFX0VYUElSRUQKKyAqICAgICBEUk1fRVJST1JfU0VTU0lPTl9OT1RfT1BFTkVELCBEUk1fRVJST1JfREVDUllQVF9VTklUX05PVF9JTklUSUFMSVpFRCwKKyAqICAgICBEUk1fRVJST1JfREVDUllQVCBmb3IgZmFpbHVyZS4KKyAqLworc3RhdHVzX3Qgb25EZWNyeXB0KGludCB1bmlxdWVJZCwKKyAgICAgICAgICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgICAgICAgIGludCBkZWNyeXB0VW5pdElkLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IERybUJ1ZmZlciogZW5jQnVmZmVyLAorICAgICAgICAgICAgICAgICAgIERybUJ1ZmZlcioqIGRlY0J1ZmZlcik7CisKKy8qKgorICogRGVjcnlwdCB0aGUgcHJvdGVjdGVkIGNvbnRlbnQgYnVmZmVycyBmb3IgdGhlIGdpdmVuIHVuaXQuCisgKiBUaGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCBhbnkgbnVtYmVyIG9mIHRpbWVzLCBiYXNlZCBvbiBudW1iZXIgb2YKKyAqIGVuY3J5cHRlZCBzdHJlYW1zIHJlY2VpdmVkIGZyb20gYXBwbGljYXRpb24uCisgKgorICogQHBhcmFtIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNlc3Npb24KKyAqIEBwYXJhbSBkZWNyeXB0SWQgSGFuZGxlIGZvciB0aGUgZGVjcnlwdGlvbiBzZXNzaW9uCisgKiBAcGFyYW0gZGVjcnlwdFVuaXRJZCBJRCBTcGVjaWZpZXMgZGVjcnlwdGlvbiB1bml0LCBzdWNoIGFzIHRyYWNrIElECisgKiBAcGFyYW0gZW5jQnVmZmVyIEVuY3J5cHRlZCBkYXRhIGJsb2NrCisgKiBAcGFyYW0gZGVjQnVmZmVyIERlY3J5cHRlZCBkYXRhIGJsb2NrCisgKiBAcGFyYW0gSVYgT3B0aW9uYWwgYnVmZmVyCisgKiBAcmV0dXJuIHN0YXR1c190CisgKiAgICAgUmV0dXJucyB0aGUgZXJyb3IgY29kZSBmb3IgdGhpcyBBUEkKKyAqICAgICBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MsIGFuZCBvbmUgb2YgRFJNX0VSUk9SX1VOS05PV04sIERSTV9FUlJPUl9MSUNFTlNFX0VYUElSRUQKKyAqICAgICBEUk1fRVJST1JfU0VTU0lPTl9OT1RfT1BFTkVELCBEUk1fRVJST1JfREVDUllQVF9VTklUX05PVF9JTklUSUFMSVpFRCwKKyAqICAgICBEUk1fRVJST1JfREVDUllQVCBmb3IgZmFpbHVyZS4KKyAqLworc3RhdHVzX3Qgb25EZWNyeXB0KGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICBpbnQgZGVjcnlwdFVuaXRJZCwgY29uc3QgRHJtQnVmZmVyKiBlbmNCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgRHJtQnVmZmVyKiogZGVjQnVmZmVyLCBEcm1CdWZmZXIqIElWKTsKKworLyoqCisgKiBGaW5hbGl6ZSBkZWNyeXB0aW9uIGZvciB0aGUgZ2l2ZW4gdW5pdCBvZiB0aGUgcHJvdGVjdGVkIGNvbnRlbnQuCisgKgorICogQHBhcmFtIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNlc3Npb24KKyAqIEBwYXJhbSBkZWNyeXB0SGFuZGxlIEhhbmRsZSBmb3IgdGhlIGRlY3J5cHRpb24gc2Vzc2lvbgorICogQHBhcmFtIGRlY3J5cHRVbml0SWQgSUQgU3BlY2lmaWVzIGRlY3J5cHRpb24gdW5pdCwgc3VjaCBhcyB0cmFjayBJRAorICogQHJldHVybgorICogICAgIERSTV9FUlJPUl9DQU5OT1RfSEFORExFIGZvciBmYWlsdXJlIGFuZCBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MKKyAqLworc3RhdHVzX3Qgb25GaW5hbGl6ZURlY3J5cHRVbml0KGludCB1bmlxdWVJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWNyeXB0VW5pdElkKTsKKworLyoqCisgKiBSZWFkcyB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBieXRlcyBmcm9tIGFuIG9wZW4gRFJNIGZpbGUuCisgKgorICogQHBhcmFtIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNlc3Npb24KKyAqIEBwYXJhbSBkZWNyeXB0SGFuZGxlIEhhbmRsZSBmb3IgdGhlIGRlY3J5cHRpb24gc2Vzc2lvbgorICogQHBhcmFtIGJ1ZmZlciBSZWZlcmVuY2UgdG8gdGhlIGJ1ZmZlciB0aGF0IHNob3VsZCByZWNlaXZlIHRoZSByZWFkIGRhdGEuCisgKiBAcGFyYW0gbnVtQnl0ZXMgTnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQuCisgKgorICogQHJldHVybiBOdW1iZXIgb2YgYnl0ZXMgcmVhZC4KKyAqIEByZXR2YWwgLTEgRmFpbHVyZS4KKyAqLworc3NpemVfdCBvblJlYWQoaW50IHVuaXF1ZUlkLAorICAgICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgIHZvaWQqIHBCdWZmZXIsCisgICAgICAgICAgICAgICBpbnQgbnVtQnl0ZXMpOworCisvKioKKyAqIFVwZGF0ZXMgdGhlIGZpbGUgcG9zaXRpb24gd2l0aGluIGFuIG9wZW4gRFJNIGZpbGUuCisgKgorICogQHBhcmFtIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNlc3Npb24KKyAqIEBwYXJhbSBkZWNyeXB0SGFuZGxlIEhhbmRsZSBmb3IgdGhlIGRlY3J5cHRpb24gc2Vzc2lvbgorICogQHBhcmFtIG9mZnNldCBPZmZzZXQgd2l0aCB3aGljaCB0byB1cGRhdGUgdGhlIGZpbGUgcG9zaXRpb24uCisgKiBAcGFyYW0gd2hlbmNlIE9uZSBvZiBTRUVLX1NFVCwgU0VFS19DVVIsIGFuZCBTRUVLX0VORC4KKyAqICAgICAgICAgICBUaGVzZSBjb25zdGFudHMgYXJlIGRlZmluZWQgaW4gdW5pc3RkLmguCisgKgorICogQHJldHVybiBOZXcgZmlsZSBwb3NpdGlvbi4KKyAqIEByZXR2YWwgKChvZmZfdCktMSkgRmFpbHVyZS4KKyAqLworI2lmZGVmIFVTRV82NEJJVF9EUk1fQVBJCitvZmY2NF90IG9uTHNlZWsoaW50IHVuaXF1ZUlkLAorICAgICAgICAgICAgICAgIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICAgICAgb2ZmNjRfdCBvZmZzZXQsCisgICAgICAgICAgICAgICAgaW50IHdoZW5jZSk7CisjZWxzZQorb2ZmX3Qgb25Mc2VlayhpbnQgdW5pcXVlSWQsCisgICAgICAgICAgICAgIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICAgIG9mZl90IG9mZnNldCwKKyAgICAgICAgICAgICAgaW50IHdoZW5jZSk7CisjZW5kaWYKKworLyoqCisgKiBSZWFkcyB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBieXRlcyBmcm9tIGFuIG9wZW4gRFJNIGZpbGUuCisgKgorICogQHBhcmFtIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNlc3Npb24KKyAqIEBwYXJhbSBkZWNyeXB0SGFuZGxlIEhhbmRsZSBmb3IgdGhlIGRlY3J5cHRpb24gc2Vzc2lvbgorICogQHBhcmFtIGJ1ZmZlciBSZWZlcmVuY2UgdG8gdGhlIGJ1ZmZlciB0aGF0IHNob3VsZCByZWNlaXZlIHRoZSByZWFkIGRhdGEuCisgKiBAcGFyYW0gbnVtQnl0ZXMgTnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQuCisgKiBAcGFyYW0gb2Zmc2V0IE9mZnNldCB3aXRoIHdoaWNoIHRvIHVwZGF0ZSB0aGUgZmlsZSBwb3NpdGlvbi4KKyAqCisgKiBAcmV0dXJuIE51bWJlciBvZiBieXRlcyByZWFkLiBSZXR1cm5zIC0xIGZvciBGYWlsdXJlLgorICovCisjaWZkZWYgVVNFXzY0QklUX0RSTV9BUEkKK3NzaXplX3Qgb25QcmVhZChpbnQgdW5pcXVlSWQsCisgICAgICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgICB2b2lkKiBidWZmZXIsCisgICAgICAgICAgICAgICAgc3NpemVfdCBudW1CeXRlcywKKyAgICAgICAgICAgICAgICBvZmY2NF90IG9mZnNldCk7CisjZWxzZQorc3NpemVfdCBvblByZWFkKGludCB1bmlxdWVJZCwKKyAgICAgICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgICAgIHZvaWQqIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICBzc2l6ZV90IG51bUJ5dGVzLAorICAgICAgICAgICAgICAgIG9mZl90IG9mZnNldCk7CisjZW5kaWYKKworcHJpdmF0ZToKKworLyoqCisgKiBTZXNzaW9uIENsYXNzIGZvciBGb3J3YXJkIExvY2sgQ29udmVyc2lvbi4gQW4gb2JqZWN0IG9mIHRoaXMgY2xhc3MgaXMgY3JlYXRlZAorICogZm9yIGV2ZXJ5IGNvbnZlcnNpb24uCisgKi8KK2NsYXNzIENvbnZlcnRTZXNzaW9uIHsKKyAgICBwdWJsaWMgOgorICAgICAgICBpbnQgdW5pcXVlSWQ7CisgICAgICAgIEZ3ZExvY2tDb252X091dHB1dF90IG91dHB1dDsKKworICAgICAgICBDb252ZXJ0U2Vzc2lvbigpIHsKKyAgICAgICAgICAgIHVuaXF1ZUlkID0gMDsKKyAgICAgICAgICAgIG1lbXNldCgmb3V0cHV0LCAwLCBzaXplb2YoRndkTG9ja0NvbnZfT3V0cHV0X3QpKTsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgfkNvbnZlcnRTZXNzaW9uKCkge30KK307CisKKy8qKgorICogU2Vzc2lvbiBDbGFzcyBmb3IgRm9yd2FyZCBMb2NrIGRlY29kZXIuIEFuIG9iamVjdCBvZiB0aGlzIGNsYXNzIGlzIGNyZWF0ZWQKKyAqIGZvciBldmVyeSBkZWNvZGluZyBzZXNzaW9uLgorICovCitjbGFzcyBEZWNvZGVTZXNzaW9uIHsKKyAgICBwdWJsaWMgOgorICAgICAgICBpbnQgZmlsZURlc2M7CisgICAgICAgIG9mZl90IG9mZnNldDsKKworICAgICAgICBEZWNvZGVTZXNzaW9uKCkgeworICAgICAgICAgICAgZmlsZURlc2MgPSAtMTsKKyAgICAgICAgICAgIG9mZnNldCA9IDA7CisgICAgICAgIH0KKworICAgICAgICBEZWNvZGVTZXNzaW9uKGludCBmZCkgeworICAgICAgICAgICAgZmlsZURlc2MgPSBmZDsKKyAgICAgICAgICAgIG9mZnNldCA9IDA7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIH5EZWNvZGVTZXNzaW9uKCkge30KK307CisKKy8qKgorICogU2Vzc2lvbiBNYXAgVGFibGVzIGZvciBDb252ZXJzaW9uIGFuZCBEZWNvZGluZyBvZiBmb3J3YXJkIGxvY2sgZmlsZXMuCisgKi8KK1Nlc3Npb25NYXA8Q29udmVydFNlc3Npb24qPiBjb252ZXJ0U2Vzc2lvbk1hcDsKK1Nlc3Npb25NYXA8RGVjb2RlU2Vzc2lvbio+IGRlY29kZVNlc3Npb25NYXA7CisKKy8qKgorICogQ29udmVydHMgdGhlIGVycm9yIGNvZGUgZnJvbSBGb3J3YXJkIExvY2sgQ29udmVydGVyIHRvIERybUNvbnZlcnRTdGF0dXMgZXJyb3IgY29kZS4KKyAqCisgKiBAcGFyYW0gRm9yd2FyZCBMb2NrIENvbnZlcnRlciBlcnJvciBjb2RlCisgKgorICogQHJldHVybiBTdGF0dXMgY29kZSBmcm9tIERybUNvbnZlcnRTdGF0dXMuCisgKi8KK3N0YXRpYyBpbnQgZ2V0Q29udmVydGVkU3RhdHVzKEZ3ZExvY2tDb252X1N0YXR1c190IHN0YXR1cyk7Cit9OworCit9OworCisjZW5kaWYgLyogX19GV0RMT0NLRU5HSU5FX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9Gd2RMb2NrRW5naW5lL2luY2x1ZGUvRndkTG9ja0VuZ2luZUNvbnN0LmggYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL0Z3ZExvY2tFbmdpbmUvaW5jbHVkZS9Gd2RMb2NrRW5naW5lQ29uc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTk1ZDYwCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9Gd2RMb2NrRW5naW5lL2luY2x1ZGUvRndkTG9ja0VuZ2luZUNvbnN0LmgKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX19GV0RMT0NLRU5HSU5FQ09OU1RfSF9fCisjZGVmaW5lIF9fRldETE9DS0VOR0lORUNPTlNUX0hfXworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qKgorICogQ29uc3RhbnRzIGZvciBmb3J3YXJkIExvY2sgRW5naW5lIHVzZWQgZm9yIGV4cG9zaW5nIGVuZ2luZSdzIGNhcGFiaWxpdGllcy4KKyAqLworI2RlZmluZSBGV0RMT0NLX0VYVEVOU0lPTl9GTCAgICAgICAgICAgKCJGTCIpCisjZGVmaW5lIEZXRExPQ0tfRE9URVhURU5TSU9OX0ZMICAgICAgICAoIi5mbCIpCisjZGVmaW5lIEZXRExPQ0tfTUlNRVRZUEVfRkwgICAgICAgICAgICAoImFwcGxpY2F0aW9uL3gtYW5kcm9pZC1kcm0tZmwiKQorCisjZGVmaW5lIEZXRExPQ0tfRVhURU5TSU9OX0RNICAgICAgICAgICAoIkRNIikKKyNkZWZpbmUgRldETE9DS19ET1RFWFRFTlNJT05fRE0gICAgICAgICgiLmRtIikKKyNkZWZpbmUgRldETE9DS19NSU1FVFlQRV9ETSAgICAgICAgICAgICgiYXBwbGljYXRpb24vdm5kLm9tYS5kcm0ubWVzc2FnZSIpCisKKyNkZWZpbmUgRldETE9DS19ERVNDUklQVElPTiAgICAgICAgICAgICgiT01BIFYxIEZvcndhcmQgTG9jayIpCisKK307CisKKyNlbmRpZiAvKiBfX0ZXRExPQ0tFTkdJTkVDT05TVF9IX18gKi8KZGlmZiAtLWdpdCBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svRndkTG9ja0VuZ2luZS9zcmMvRndkTG9ja0VuZ2luZS5jcHAgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL0Z3ZExvY2tFbmdpbmUvc3JjL0Z3ZExvY2tFbmdpbmUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0MzBmNzIKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL0Z3ZExvY2tFbmdpbmUvc3JjL0Z3ZExvY2tFbmdpbmUuY3BwCkBAIC0wLDAgKzEsNjI4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIlNlc3Npb25NYXAuaCIKKyNpbmNsdWRlICJGd2RMb2NrRW5naW5lLmgiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgImRybV9mcmFtZXdvcmtfY29tbW9uLmgiCisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDxEcm1SaWdodHMuaD4KKyNpbmNsdWRlIDxEcm1Db25zdHJhaW50cy5oPgorI2luY2x1ZGUgPERybU1ldGFkYXRhLmg+CisjaW5jbHVkZSA8RHJtSW5mby5oPgorI2luY2x1ZGUgPERybUluZm9TdGF0dXMuaD4KKyNpbmNsdWRlIDxEcm1JbmZvUmVxdWVzdC5oPgorI2luY2x1ZGUgPERybVN1cHBvcnRJbmZvLmg+CisjaW5jbHVkZSA8RHJtQ29udmVydGVkU3RhdHVzLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorI2luY2x1ZGUgIkZ3ZExvY2tDb252LmgiCisjaW5jbHVkZSAiRndkTG9ja0ZpbGUuaCIKKyNpbmNsdWRlICJGd2RMb2NrR2x1ZS5oIgorI2luY2x1ZGUgIkZ3ZExvY2tFbmdpbmVDb25zdC5oIgorI2luY2x1ZGUgIk1pbWVUeXBlVXRpbC5oIgorCisjdW5kZWYgTE9HX1RBRworI2RlZmluZSBMT0dfVEFHICJGd2RMb2NrRW5naW5lIgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKy8vIFRoaXMgZXh0ZXJuICJDIiBpcyBtYW5kYXRvcnkgdG8gYmUgbWFuYWdlZCBieSBUUGx1Z0luTWFuYWdlcgorZXh0ZXJuICJDIiBJRHJtRW5naW5lKiBjcmVhdGUoKSB7CisgICAgcmV0dXJuIG5ldyBGd2RMb2NrRW5naW5lKCk7Cit9CisKKy8vIFRoaXMgZXh0ZXJuICJDIiBpcyBtYW5kYXRvcnkgdG8gYmUgbWFuYWdlZCBieSBUUGx1Z0luTWFuYWdlcgorZXh0ZXJuICJDIiB2b2lkIGRlc3Ryb3koSURybUVuZ2luZSogcGx1Z0luKSB7CisgICAgZGVsZXRlIHBsdWdJbjsKK30KKworRndkTG9ja0VuZ2luZTo6RndkTG9ja0VuZ2luZSgpIHsKKyAgICBMT0dEKCJGd2RMb2NrRW5naW5lIENvbnN0cnVjdGlvbiIpOworfQorCitGd2RMb2NrRW5naW5lOjp+RndkTG9ja0VuZ2luZSgpIHsKKyAgICBMT0dEKCJGd2RMb2NrRW5naW5lIERlc3RydWN0aW9uIik7CisKKyAgICBjb252ZXJ0U2Vzc2lvbk1hcC5kZXN0cm95TWFwKCk7CisgICAgZGVjb2RlU2Vzc2lvbk1hcC5kZXN0cm95TWFwKCk7Cit9CisKK2ludCBGd2RMb2NrRW5naW5lOjpnZXRDb252ZXJ0ZWRTdGF0dXMoRndkTG9ja0NvbnZfU3RhdHVzX3Qgc3RhdHVzKSB7CisgICAgaW50IHJldFN0YXR1cyA9IERybUNvbnZlcnRlZFN0YXR1czo6U1RBVFVTX0VSUk9SOworCisgICAgc3dpdGNoKHN0YXR1cykgeworICAgICAgICBjYXNlIEZ3ZExvY2tDb252X1N0YXR1c19PSzoKKyAgICAgICAgICAgIHJldFN0YXR1cyA9IERybUNvbnZlcnRlZFN0YXR1czo6U1RBVFVTX09LOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRndkTG9ja0NvbnZfU3RhdHVzX1N5bnRheEVycm9yOgorICAgICAgICBjYXNlIEZ3ZExvY2tDb252X1N0YXR1c19JbnZhbGlkQXJndW1lbnQ6CisgICAgICAgIGNhc2UgRndkTG9ja0NvbnZfU3RhdHVzX1Vuc3VwcG9ydGVkRmlsZUZvcm1hdDoKKyAgICAgICAgY2FzZSBGd2RMb2NrQ29udl9TdGF0dXNfVW5zdXBwb3J0ZWRDb250ZW50VHJhbnNmZXJFbmNvZGluZzoKKyAgICAgICAgICAgIExPR0QoIkZ3ZExvY2tFbmdpbmUgZ2V0Q29udmVydGVkU3RhdHVzOiBmaWxlIGNvbnZlcnNpb24gRXJyb3IgJWQuICIgXAorICAgICAgICAgICAgICAgICAgIlJldHVybmluZyBTVEFUVVNfSU5QVVREQVRBX0VSUk9SIiwgc3RhdHVzKTsKKyAgICAgICAgICAgIHJldFN0YXR1cyA9IERybUNvbnZlcnRlZFN0YXR1czo6U1RBVFVTX0lOUFVUREFUQV9FUlJPUjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgTE9HRCgiRndkTG9ja0VuZ2luZSBnZXRDb252ZXJ0ZWRTdGF0dXM6IGZpbGUgY29udmVyc2lvbiBFcnJvciAlZC4gIiBcCisgICAgICAgICAgICAgICAgICAiUmV0dXJuaW5nIFNUQVRVU19FUlJPUiIsIHN0YXR1cyk7CisgICAgICAgICAgICByZXRTdGF0dXMgPSBEcm1Db252ZXJ0ZWRTdGF0dXM6OlNUQVRVU19FUlJPUjsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiByZXRTdGF0dXM7Cit9CisKK0RybUNvbnN0cmFpbnRzKiBGd2RMb2NrRW5naW5lOjpvbkdldENvbnN0cmFpbnRzKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCogcGF0aCwgaW50IGFjdGlvbikgeworICAgIERybUNvbnN0cmFpbnRzKiBkcm1Db25zdHJhaW50cyA9IE5VTEw7CisKKyAgICBMT0dEKCJGd2RMb2NrRW5naW5lOjpvbkdldENvbnN0cmFpbnRzIik7CisKKyAgICBpZiAoTlVMTCAhPSBwYXRoICYmCisgICAgICAgIChSaWdodHNTdGF0dXM6OlJJR0hUU19WQUxJRCA9PSBvbkNoZWNrUmlnaHRzU3RhdHVzKHVuaXF1ZUlkLCAqcGF0aCwgYWN0aW9uKSkpIHsKKyAgICAgICAgLy8gUmV0dXJuIHRoZSBlbXB0eSBjb25zdHJhaW50cyB0byBzaG93IG5vIGVycm9yIGNvbmRpdGlvbi4KKyAgICAgICAgZHJtQ29uc3RyYWludHMgPSBuZXcgRHJtQ29uc3RyYWludHMoKTsKKyAgICB9CisKKyAgICByZXR1cm4gZHJtQ29uc3RyYWludHM7Cit9CisKK0RybU1ldGFkYXRhKiBGd2RMb2NrRW5naW5lOjpvbkdldE1ldGFkYXRhKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCogcGF0aCkgeworICAgIERybU1ldGFkYXRhKiBkcm1NZXRhZGF0YSA9IE5VTEw7CisKKyAgICBMT0dEKCJGd2RMb2NrRW5naW5lOjpvbkdldE1ldGFkYXRhIik7CisKKyAgICBpZiAoTlVMTCAhPSBwYXRoKSB7CisgICAgICAgIC8vIFJldHVybnMgZW1wdHkgbWV0YWRhdGEgdG8gc2hvdyBubyBlcnJvciBjb25kaXRpb24uCisgICAgICAgIGRybU1ldGFkYXRhID0gbmV3IERybU1ldGFkYXRhKCk7CisgICAgfQorCisgICAgcmV0dXJuIGRybU1ldGFkYXRhOworfQorCithbmRyb2lkOjpzdGF0dXNfdCBGd2RMb2NrRW5naW5lOjpvbkluaXRpYWxpemUoaW50IHVuaXF1ZUlkKSB7CisgICAgTE9HRCgiRndkTG9ja0VuZ2luZTo6b25Jbml0aWFsaXplIik7CisKKworICAgIGlmIChGd2RMb2NrR2x1ZV9Jbml0aWFsaXplS2V5RW5jcnlwdGlvbigpKSB7CisgICAgICAgIExPR0QoIkZ3ZExvY2tFbmdpbmU6Om9uSW5pdGlhbGl6ZSAtLSBGd2RMb2NrR2x1ZV9Jbml0aWFsaXplS2V5RW5jcnlwdGlvbiBzdWNjZWVkZWQiKTsKKyAgICB9IGVsc2UgeworICAgICAgICBMT0dEKCJGd2RMb2NrRW5naW5lOjpvbkluaXRpYWxpemUgLS0gRndkTG9ja0dsdWVfSW5pdGlhbGl6ZUtleUVuY3J5cHRpb24gZmFpbGVkOiIKKyAgICAgICAgICAgICAiZXJybm8gPSAlZCIsIGVycm5vKTsKKyAgICB9CisKKyAgICByZXR1cm4gRFJNX05PX0VSUk9SOworfQorCithbmRyb2lkOjpzdGF0dXNfdAorRndkTG9ja0VuZ2luZTo6b25TZXRPbkluZm9MaXN0ZW5lcihpbnQgdW5pcXVlSWQsIGNvbnN0IElEcm1FbmdpbmU6Ok9uSW5mb0xpc3RlbmVyKiBpbmZvTGlzdGVuZXIpIHsKKyAgICAvLyBOb3QgdXNlZAorICAgIExPR0QoIkZ3ZExvY2tFbmdpbmU6Om9uU2V0T25JbmZvTGlzdGVuZXIiKTsKKworICAgIHJldHVybiBEUk1fTk9fRVJST1I7Cit9CisKK2FuZHJvaWQ6OnN0YXR1c190IEZ3ZExvY2tFbmdpbmU6Om9uVGVybWluYXRlKGludCB1bmlxdWVJZCkgeworICAgIExPR0QoIkZ3ZExvY2tFbmdpbmU6Om9uVGVybWluYXRlIik7CisKKyAgICByZXR1cm4gRFJNX05PX0VSUk9SOworfQorCitEcm1TdXBwb3J0SW5mbyogRndkTG9ja0VuZ2luZTo6b25HZXRTdXBwb3J0SW5mbyhpbnQgdW5pcXVlSWQpIHsKKyAgICBEcm1TdXBwb3J0SW5mbyogcFN1cHBvcnRJbmZvID0gbmV3IERybVN1cHBvcnRJbmZvKCk7CisKKyAgICBMT0dEKCJGd2RMb2NrRW5naW5lOjpvbkdldFN1cHBvcnRJbmZvIik7CisKKyAgICAvLyBmaWxsIGFsbCBGb3J3YXJkIExvY2sgbWltZXR5cGVzIGFuZCBleHRlbnNpb25zCisgICAgaWYgKE5VTEwgIT0gcFN1cHBvcnRJbmZvKSB7CisgICAgICAgIHBTdXBwb3J0SW5mby0+YWRkTWltZVR5cGUoU3RyaW5nOChGV0RMT0NLX01JTUVUWVBFX0ZMKSk7CisgICAgICAgIHBTdXBwb3J0SW5mby0+YWRkRmlsZVN1ZmZpeChTdHJpbmc4KEZXRExPQ0tfRE9URVhURU5TSU9OX0ZMKSk7CisgICAgICAgIHBTdXBwb3J0SW5mby0+YWRkTWltZVR5cGUoU3RyaW5nOChGV0RMT0NLX01JTUVUWVBFX0RNKSk7CisgICAgICAgIHBTdXBwb3J0SW5mby0+YWRkRmlsZVN1ZmZpeChTdHJpbmc4KEZXRExPQ0tfRE9URVhURU5TSU9OX0RNKSk7CisKKyAgICAgICAgcFN1cHBvcnRJbmZvLT5zZXREZXNjcmlwdGlvbihTdHJpbmc4KEZXRExPQ0tfREVTQ1JJUFRJT04pKTsKKyAgICB9CisKKyAgICByZXR1cm4gcFN1cHBvcnRJbmZvOworfQorCitib29sIEZ3ZExvY2tFbmdpbmU6Om9uQ2FuSGFuZGxlKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCkgeworICAgIGJvb2wgcmVzdWx0ID0gZmFsc2U7CisKKyAgICBTdHJpbmc4IGV4dFN0cmluZyA9IHBhdGguZ2V0UGF0aEV4dGVuc2lvbigpOworCisgICAgZXh0U3RyaW5nLnRvTG93ZXIoKTsKKworICAgIGlmICgoZXh0U3RyaW5nID09IFN0cmluZzgoRldETE9DS19ET1RFWFRFTlNJT05fRkwpKSB8fAorICAgICAgICAoZXh0U3RyaW5nID09IFN0cmluZzgoRldETE9DS19ET1RFWFRFTlNJT05fRE0pKSkgeworICAgICAgICByZXN1bHQgPSB0cnVlOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitEcm1JbmZvU3RhdHVzKiBGd2RMb2NrRW5naW5lOjpvblByb2Nlc3NEcm1JbmZvKGludCB1bmlxdWVJZCwgY29uc3QgRHJtSW5mbyogZHJtSW5mbykgeworICAgIERybUluZm9TdGF0dXMgKmRybUluZm9TdGF0dXMgPSBOVUxMOworCisgICAgLy8gTm90aGluZyB0byBwcm9jZXNzCisKKyAgICBkcm1JbmZvU3RhdHVzID0gbmV3IERybUluZm9TdGF0dXMoKGludClEcm1JbmZvU3RhdHVzOjpTVEFUVVNfT0ssIDAsIE5VTEwsIFN0cmluZzgoIiIpKTsKKworICAgIExPR0QoIkZ3ZExvY2tFbmdpbmU6Om9uUHJvY2Vzc0RybUluZm8iKTsKKworICAgIHJldHVybiBkcm1JbmZvU3RhdHVzOworfQorCitzdGF0dXNfdCBGd2RMb2NrRW5naW5lOjpvblNhdmVSaWdodHMoCisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsCisgICAgICAgICAgICBjb25zdCBEcm1SaWdodHMmIGRybVJpZ2h0cywKKyAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIHJpZ2h0c1BhdGgsCisgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBjb250ZW50UGF0aCkgeworICAgIC8vIE5vIHJpZ2h0cyB0byBzYXZlLiBSZXR1cm4KKyAgICBMT0dEKCJGd2RMb2NrRW5naW5lOjpvblNhdmVSaWdodHMiKTsKKyAgICByZXR1cm4gRFJNX0VSUk9SX1VOS05PV047Cit9CisKK0RybUluZm8qIEZ3ZExvY2tFbmdpbmU6Om9uQWNxdWlyZURybUluZm8oaW50IHVuaXF1ZUlkLCBjb25zdCBEcm1JbmZvUmVxdWVzdCogZHJtSW5mb1JlcXVlc3QpIHsKKyAgICBEcm1JbmZvKiBkcm1JbmZvID0gTlVMTDsKKworICAgIC8vIE5vdGhpbmcgdG8gYmUgZG9uZSBmb3IgRm9yd2FyZCBMb2NrIGZpbGUKKyAgICBMT0dEKCJGd2RMb2NrRW5naW5lOjpvbkFjcXVpcmVEcm1JbmZvIik7CisKKyAgICByZXR1cm4gZHJtSW5mbzsKK30KKworaW50IEZ3ZExvY2tFbmdpbmU6Om9uQ2hlY2tSaWdodHNTdGF0dXMoaW50IHVuaXF1ZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhY3Rpb24pIHsKKyAgICBpbnQgcmVzdWx0ID0gUmlnaHRzU3RhdHVzOjpSSUdIVFNfSU5WQUxJRDsKKworICAgIExPR0QoIkZ3ZExvY2tFbmdpbmU6Om9uQ2hlY2tSaWdodHNTdGF0dXMiKTsKKworICAgIC8vIE9ubHkgVHJhbnNmZXIgYWN0aW9uIGlzIG5vdCBhbGxvd2VkIGZvciBmb3J3YXJkIExvY2sgZmlsZXMuCisgICAgaWYgKG9uQ2FuSGFuZGxlKHVuaXF1ZUlkLCBwYXRoKSkgeworICAgICAgICBzd2l0Y2goYWN0aW9uKSB7CisgICAgICAgICAgICBjYXNlIEFjdGlvbjo6REVGQVVMVDoKKyAgICAgICAgICAgIGNhc2UgQWN0aW9uOjpQTEFZOgorICAgICAgICAgICAgY2FzZSBBY3Rpb246OlJJTkdUT05FOgorICAgICAgICAgICAgY2FzZSBBY3Rpb246Ok9VVFBVVDoKKyAgICAgICAgICAgIGNhc2UgQWN0aW9uOjpQUkVWSUVXOgorICAgICAgICAgICAgY2FzZSBBY3Rpb246OkVYRUNVVEU6CisgICAgICAgICAgICBjYXNlIEFjdGlvbjo6RElTUExBWToKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBSaWdodHNTdGF0dXM6OlJJR0hUU19WQUxJRDsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBBY3Rpb246OlRSQU5TRkVSOgorICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBSaWdodHNTdGF0dXM6OlJJR0hUU19JTlZBTElEOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdHVzX3QgRndkTG9ja0VuZ2luZTo6b25Db25zdW1lUmlnaHRzKGludCB1bmlxdWVJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCByZXNlcnZlKSB7CisgICAgLy8gTm8gcmlnaHRzIGNvbnN1bXB0aW9uCisgICAgTE9HRCgiRndkTG9ja0VuZ2luZTo6b25Db25zdW1lUmlnaHRzIik7CisgICAgcmV0dXJuIERSTV9OT19FUlJPUjsKK30KKworYm9vbCBGd2RMb2NrRW5naW5lOjpvblZhbGlkYXRlQWN0aW9uKGludCB1bmlxdWVJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWN0aW9uRGVzY3JpcHRpb24mIGRlc2NyaXB0aW9uKSB7CisgICAgTE9HRCgiRndkTG9ja0VuZ2luZTo6b25WYWxpZGF0ZUFjdGlvbiIpOworCisgICAgLy8gRm9yIHRoZSBmb3J3YXJkbG9jayBlbmdpbmUgY2hlY2tSaWdodHMgYW5kIFZhbGlkYXRlQWN0aW9uIGFyZSB0aGUgc2FtZS4KKyAgICByZXR1cm4gKG9uQ2hlY2tSaWdodHNTdGF0dXModW5pcXVlSWQsIHBhdGgsIGFjdGlvbikgPT0gUmlnaHRzU3RhdHVzOjpSSUdIVFNfVkFMSUQpOworfQorCitTdHJpbmc4IEZ3ZExvY2tFbmdpbmU6Om9uR2V0T3JpZ2luYWxNaW1lVHlwZShpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgpIHsKKyAgICBMT0dEKCJGd2RMb2NrRW5naW5lOjpvbkdldE9yaWdpbmFsTWltZVR5cGUiKTsKKyAgICBTdHJpbmc4IG1pbWVTdHJpbmcgPSBTdHJpbmc4KCIiKTsKKyAgICBpbnQgZmlsZURlc2MgPSBGd2RMb2NrRmlsZV9vcGVuKHBhdGguc3RyaW5nKCkpOworCisgICAgaWYgKC0xIDwgZmlsZURlc2MpIHsKKyAgICAgICAgY29uc3QgY2hhciogcE1pbWVUeXBlID0gRndkTG9ja0ZpbGVfR2V0Q29udGVudFR5cGUoZmlsZURlc2MpOworCisgICAgICAgIGlmIChOVUxMICE9IHBNaW1lVHlwZSkgeworICAgICAgICAgICAgU3RyaW5nOCBjb250ZW50VHlwZSA9IFN0cmluZzgocE1pbWVUeXBlKTsKKyAgICAgICAgICAgIGNvbnRlbnRUeXBlLnRvTG93ZXIoKTsKKyAgICAgICAgICAgIG1pbWVTdHJpbmcgPSBNaW1lVHlwZVV0aWw6OmNvbnZlcnRNaW1lVHlwZShjb250ZW50VHlwZSk7CisgICAgICAgIH0KKworICAgICAgICBGd2RMb2NrRmlsZV9jbG9zZShmaWxlRGVzYyk7CisgICAgfQorCisgICAgcmV0dXJuIG1pbWVTdHJpbmc7Cit9CisKK2ludCBGd2RMb2NrRW5naW5lOjpvbkdldERybU9iamVjdFR5cGUoaW50IHVuaXF1ZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBtaW1lVHlwZSkgeworICAgIFN0cmluZzggbWltZVN0ciA9IFN0cmluZzgobWltZVR5cGUpOworCisgICAgTE9HRCgiRndkTG9ja0VuZ2luZTo6b25HZXREcm1PYmplY3RUeXBlIik7CisKKyAgICBtaW1lU3RyLnRvTG93ZXIoKTsKKworICAgIC8qIENoZWNrcyB3aGV0aGVyCisgICAgKiAxLiBwYXRoIGFuZCBtaW1lIHR5cGUgYm90aCBhcmUgbm90IGVtcHR5IHN0cmluZ3MgKG1lYW5pbmcgdW5hdmFpbGFibGUpIGVsc2UgY29udGVudCBpcyB1bmtub3duCisgICAgKiAyLiBpZiBvbmUgb2YgdGhlbSBpcyBlbXB0eSBzdHJpbmcgYW5kIGlmIG90aGVyIGlzIGtub3duIHRoZW4gaXRzIGEgRFJNIENvbnRlbnQgT2JqZWN0LgorICAgICogMy4gaWYgYm90aCBvZiB0aGVtIGFyZSBhdmFpbGFibGUsIHRoZW4gYm90aCBtYXkgYmUgb2Yga25vd24gdHlwZQorICAgICogICAgKHJlZ2FyZGxlc3Mgb2YgdGhlIHJlbGF0aW9uIGJldHdlZW4gdGhlbSB0byBtYWtlIGl0IGNvbXBhdGlibGUgd2l0aCBvdGhlciBEUk0gRW5naW5lcykKKyAgICAqLworICAgIGlmICgoKDAgPT0gcGF0aC5sZW5ndGgoKSkgfHwgb25DYW5IYW5kbGUodW5pcXVlSWQsIHBhdGgpKSAmJgorICAgICAgICAoKDAgPT0gbWltZVR5cGUubGVuZ3RoKCkpIHx8ICgobWltZVN0ciA9PSBTdHJpbmc4KEZXRExPQ0tfTUlNRVRZUEVfRkwpKSB8fAorICAgICAgICAobWltZVN0ciA9PSBTdHJpbmc4KEZXRExPQ0tfTUlNRVRZUEVfRE0pKSkpICYmIChtaW1lVHlwZSAhPSBwYXRoKSApIHsKKyAgICAgICAgICAgIHJldHVybiBEcm1PYmplY3RUeXBlOjpDT05URU5UOworICAgIH0KKworICAgIHJldHVybiBEcm1PYmplY3RUeXBlOjpVTktOT1dOOworfQorCitzdGF0dXNfdCBGd2RMb2NrRW5naW5lOjpvblJlbW92ZVJpZ2h0cyhpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgpIHsKKyAgICAvLyBObyBSaWdodHMgdG8gcmVtb3ZlCisgICAgTE9HRCgiRndkTG9ja0VuZ2luZTo6b25SZW1vdmVSaWdodHMiKTsKKyAgICByZXR1cm4gRFJNX05PX0VSUk9SOworfQorCitzdGF0dXNfdCBGd2RMb2NrRW5naW5lOjpvblJlbW92ZUFsbFJpZ2h0cyhpbnQgdW5pcXVlSWQpIHsKKyAgICAvLyBObyByaWdodHMgdG8gcmVtb3ZlCisgICAgTE9HRCgiRndkTG9ja0VuZ2luZTo6b25SZW1vdmVBbGxSaWdodHMiKTsKKyAgICByZXR1cm4gRFJNX05PX0VSUk9SOworfQorCisjaWZkZWYgVVNFXzY0QklUX0RSTV9BUEkKK3N0YXR1c190IEZ3ZExvY2tFbmdpbmU6Om9uU2V0UGxheWJhY2tTdGF0dXMoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGxheWJhY2tTdGF0dXMsIGludDY0X3QgcG9zaXRpb24pIHsKKyNlbHNlCitzdGF0dXNfdCBGd2RMb2NrRW5naW5lOjpvblNldFBsYXliYWNrU3RhdHVzKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBsYXliYWNrU3RhdHVzLCBpbnQgcG9zaXRpb24pIHsKKyNlbmRpZgorICAgIC8vIE5vdCB1c2VkCisgICAgTE9HRCgiRndkTG9ja0VuZ2luZTo6b25TZXRQbGF5YmFja1N0YXR1cyIpOworICAgIHJldHVybiBEUk1fTk9fRVJST1I7Cit9CisKK3N0YXR1c190IEZ3ZExvY2tFbmdpbmU6Om9uT3BlbkNvbnZlcnRTZXNzaW9uKGludCB1bmlxdWVJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvbnZlcnRJZCkgeworICAgIHN0YXR1c190IHJlc3VsdCA9IERSTV9FUlJPUl9VTktOT1dOOworICAgIExPR0QoIkZ3ZExvY2tFbmdpbmU6Om9uT3BlbkNvbnZlcnRTZXNzaW9uIik7CisgICAgaWYgKCFjb252ZXJ0U2Vzc2lvbk1hcC5pc0NyZWF0ZWQoY29udmVydElkKSkgeworICAgICAgICBDb252ZXJ0U2Vzc2lvbiAqbmV3U2Vzc2lvbiA9IG5ldyBDb252ZXJ0U2Vzc2lvbigpOworICAgICAgICBpZiAoRndkTG9ja0NvbnZfU3RhdHVzX09LID09CisgICAgICAgICAgICBGd2RMb2NrQ29udl9PcGVuU2Vzc2lvbigmKG5ld1Nlc3Npb24tPnVuaXF1ZUlkKSwgJihuZXdTZXNzaW9uLT5vdXRwdXQpKSkgeworICAgICAgICAgICAgY29udmVydFNlc3Npb25NYXAuYWRkVmFsdWUoY29udmVydElkLCBuZXdTZXNzaW9uKTsKKyAgICAgICAgICAgIHJlc3VsdCA9IERSTV9OT19FUlJPUjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExPR0QoIkZ3ZExvY2tFbmdpbmU6Om9uT3BlbkNvbnZlcnRTZXNzaW9uIC0tIEZ3ZExvY2tDb252X09wZW5TZXNzaW9uIGZhaWxlZC4iKTsKKyAgICAgICAgICAgIGRlbGV0ZSBuZXdTZXNzaW9uOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK0RybUNvbnZlcnRlZFN0YXR1cyogRndkTG9ja0VuZ2luZTo6b25Db252ZXJ0RGF0YShpbnQgdW5pcXVlSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvbnZlcnRJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEcm1CdWZmZXIqIGlucHV0RGF0YSkgeworICAgIEZ3ZExvY2tDb252X1N0YXR1c190IHJldFN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19JbnZhbGlkQXJndW1lbnQ7CisgICAgRHJtQnVmZmVyICpjb252UmVzdWx0ID0gbmV3IERybUJ1ZmZlcihOVUxMLCAwKTsKKyAgICBpbnQgb2Zmc2V0ID0gLTE7CisKKyAgICBpZiAoTlVMTCAhPSBpbnB1dERhdGEgJiYgY29udmVydFNlc3Npb25NYXAuaXNDcmVhdGVkKGNvbnZlcnRJZCkpIHsKKyAgICAgICAgQ29udmVydFNlc3Npb24gKmNvbnZTZXNzaW9uID0gY29udmVydFNlc3Npb25NYXAuZ2V0VmFsdWUoY29udmVydElkKTsKKworICAgICAgICBpZiAoTlVMTCAhPSBjb252U2Vzc2lvbikgeworICAgICAgICAgICAgcmV0U3RhdHVzID0gRndkTG9ja0NvbnZfQ29udmVydERhdGEoY29udlNlc3Npb24tPnVuaXF1ZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXREYXRhLT5kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXREYXRhLT5sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKGNvbnZTZXNzaW9uLT5vdXRwdXQpKTsKKworICAgICAgICAgICAgaWYgKEZ3ZExvY2tDb252X1N0YXR1c19PSyA9PSByZXRTdGF0dXMpIHsKKyAgICAgICAgICAgICAgICAvLyByZXR1cm4gYnl0ZXMgZnJvbSBjb252ZXJzaW9uIGlmIGF2YWlsYWJsZQorICAgICAgICAgICAgICAgIGlmIChjb252U2Vzc2lvbi0+b3V0cHV0LmZyb21Db252ZXJ0RGF0YS5udW1CeXRlcyA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgY29udlJlc3VsdC0+ZGF0YSA9IG5ldyBjaGFyW2NvbnZTZXNzaW9uLT5vdXRwdXQuZnJvbUNvbnZlcnREYXRhLm51bUJ5dGVzXTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoTlVMTCAhPSBjb252UmVzdWx0LT5kYXRhKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb252UmVzdWx0LT5sZW5ndGggPSBjb252U2Vzc2lvbi0+b3V0cHV0LmZyb21Db252ZXJ0RGF0YS5udW1CeXRlczsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweShjb252UmVzdWx0LT5kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopY29udlNlc3Npb24tPm91dHB1dC5mcm9tQ29udmVydERhdGEucEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb252UmVzdWx0LT5sZW5ndGgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBvZmZzZXQgPSBjb252U2Vzc2lvbi0+b3V0cHV0LmZyb21Db252ZXJ0RGF0YS5lcnJvclBvczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbmV3IERybUNvbnZlcnRlZFN0YXR1cyhnZXRDb252ZXJ0ZWRTdGF0dXMocmV0U3RhdHVzKSwgY29udlJlc3VsdCwgb2Zmc2V0KTsKK30KKworRHJtQ29udmVydGVkU3RhdHVzKiBGd2RMb2NrRW5naW5lOjpvbkNsb3NlQ29udmVydFNlc3Npb24oaW50IHVuaXF1ZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvbnZlcnRJZCkgeworICAgIEZ3ZExvY2tDb252X1N0YXR1c190IHJldFN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19JbnZhbGlkQXJndW1lbnQ7CisgICAgRHJtQnVmZmVyICpjb252UmVzdWx0ID0gbmV3IERybUJ1ZmZlcihOVUxMLCAwKTsKKyAgICBpbnQgb2Zmc2V0ID0gLTE7CisKKyAgICBMT0dEKCJGd2RMb2NrRW5naW5lOjpvbkNsb3NlQ29udmVydFNlc3Npb24iKTsKKworICAgIGlmIChjb252ZXJ0U2Vzc2lvbk1hcC5pc0NyZWF0ZWQoY29udmVydElkKSkgeworICAgICAgICBDb252ZXJ0U2Vzc2lvbiAqY29udlNlc3Npb24gPSBjb252ZXJ0U2Vzc2lvbk1hcC5nZXRWYWx1ZShjb252ZXJ0SWQpOworCisgICAgICAgIGlmIChOVUxMICE9IGNvbnZTZXNzaW9uKSB7CisgICAgICAgICAgICByZXRTdGF0dXMgPSBGd2RMb2NrQ29udl9DbG9zZVNlc3Npb24oY29udlNlc3Npb24tPnVuaXF1ZUlkLCAmKGNvbnZTZXNzaW9uLT5vdXRwdXQpKTsKKworICAgICAgICAgICAgaWYgKEZ3ZExvY2tDb252X1N0YXR1c19PSyA9PSByZXRTdGF0dXMpIHsKKyAgICAgICAgICAgICAgICBvZmZzZXQgPSBjb252U2Vzc2lvbi0+b3V0cHV0LmZyb21DbG9zZVNlc3Npb24uZmlsZU9mZnNldDsKKyAgICAgICAgICAgICAgICBjb252UmVzdWx0LT5kYXRhID0gbmV3IGNoYXJbRldEX0xPQ0tfU0lHTkFUVVJFU19TSVpFXTsKKworICAgICAgICAgICAgICAgIGlmIChOVUxMICE9IGNvbnZSZXN1bHQtPmRhdGEpIHsKKyAgICAgICAgICAgICAgICAgICAgICBjb252UmVzdWx0LT5sZW5ndGggPSBGV0RfTE9DS19TSUdOQVRVUkVTX1NJWkU7CisgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KGNvbnZSZXN1bHQtPmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopY29udlNlc3Npb24tPm91dHB1dC5mcm9tQ2xvc2VTZXNzaW9uLnNpZ25hdHVyZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZSZXN1bHQtPmxlbmd0aCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNvbnZlcnRTZXNzaW9uTWFwLnJlbW92ZVZhbHVlKGNvbnZlcnRJZCk7CisgICAgfQorICAgIHJldHVybiBuZXcgRHJtQ29udmVydGVkU3RhdHVzKGdldENvbnZlcnRlZFN0YXR1cyhyZXRTdGF0dXMpLCBjb252UmVzdWx0LCBvZmZzZXQpOworfQorCisjaWZkZWYgVVNFXzY0QklUX0RSTV9BUEkKK3N0YXR1c190IEZ3ZExvY2tFbmdpbmU6Om9uT3BlbkRlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmY2NF90IG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZjY0X3QgbGVuZ3RoKSB7CisjZWxzZQorc3RhdHVzX3QgRndkTG9ja0VuZ2luZTo6b25PcGVuRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuZ3RoKSB7CisjZW5kaWYKKyAgICBzdGF0dXNfdCByZXN1bHQgPSBEUk1fRVJST1JfQ0FOTk9UX0hBTkRMRTsKKyAgICBpbnQgZmlsZURlc2MgPSAtMTsKKworICAgIExPR0QoIkZ3ZExvY2tFbmdpbmU6Om9uT3BlbkRlY3J5cHRTZXNzaW9uIik7CisKKyAgICBpZiAoKC0xIDwgZmQpICYmCisgICAgICAgIChOVUxMICE9IGRlY3J5cHRIYW5kbGUpICYmCisgICAgICAgICghZGVjb2RlU2Vzc2lvbk1hcC5pc0NyZWF0ZWQoZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdElkKSkpIHsKKyAgICAgICAgZmlsZURlc2MgPSBkdXAoZmQpOworICAgIH0gZWxzZSB7CisgICAgICAgIExPR0QoIkZ3ZExvY2tFbmdpbmU6Om9uT3BlbkRlY3J5cHRTZXNzaW9uIHBhcmFtZXRlciBlcnJvciIpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIGlmICgtMSA8IGZpbGVEZXNjICYmCisgICAgICAgIC0xIDwgOjpsc2VlayhmaWxlRGVzYywgb2Zmc2V0LCBTRUVLX1NFVCkgJiYKKyAgICAgICAgLTEgPCBGd2RMb2NrRmlsZV9hdHRhY2goZmlsZURlc2MpKSB7CisgICAgICAgIC8vIGNoZWNrIGZvciBmaWxlIGludGVncml0eS4gVGhpcyBtdXN0IGJlIGRvbmUgdG8gcHJvdGVjdCB0aGUgY29udGVudCBtYW5nbGluZy4KKyAgICAgICAgaW50IHJldFZhbCA9IEZ3ZExvY2tGaWxlX0NoZWNrSGVhZGVySW50ZWdyaXR5KGZpbGVEZXNjKTsKKyAgICAgICAgRGVjb2RlU2Vzc2lvbiogZGVjb2RlU2Vzc2lvbiA9IG5ldyBEZWNvZGVTZXNzaW9uKGZpbGVEZXNjKTsKKworICAgICAgICBpZiAocmV0VmFsICYmIE5VTEwgIT0gZGVjb2RlU2Vzc2lvbikgeworICAgICAgICAgICAgZGVjb2RlU2Vzc2lvbk1hcC5hZGRWYWx1ZShkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SWQsIGRlY29kZVNlc3Npb24pOworICAgICAgICAgICAgY29uc3QgY2hhciAqcG1pbWU9IEZ3ZExvY2tGaWxlX0dldENvbnRlbnRUeXBlKGZpbGVEZXNjKTsKKyAgICAgICAgICAgIFN0cmluZzggY29udGVudFR5cGUgPSBTdHJpbmc4KHBtaW1lID09IE5VTEwgPyAiIiA6IHBtaW1lKTsKKyAgICAgICAgICAgIGNvbnRlbnRUeXBlLnRvTG93ZXIoKTsKKyAgICAgICAgICAgIGRlY3J5cHRIYW5kbGUtPm1pbWVUeXBlID0gTWltZVR5cGVVdGlsOjpjb252ZXJ0TWltZVR5cGUoY29udGVudFR5cGUpOworICAgICAgICAgICAgZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdEFwaVR5cGUgPSBEZWNyeXB0QXBpVHlwZTo6Q09OVEFJTkVSX0JBU0VEOworICAgICAgICAgICAgZGVjcnlwdEhhbmRsZS0+c3RhdHVzID0gUmlnaHRzU3RhdHVzOjpSSUdIVFNfVkFMSUQ7CisgICAgICAgICAgICBkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SW5mbyA9IE5VTEw7CisgICAgICAgICAgICByZXN1bHQgPSBEUk1fTk9fRVJST1I7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMT0dEKCJGd2RMb2NrRW5naW5lOjpvbk9wZW5EZWNyeXB0U2Vzc2lvbiBJbnRlZ3JpdHkgQ2hlY2sgZmFpbGVkIGZvciB0aGUgZmQiKTsKKyAgICAgICAgICAgIEZ3ZExvY2tGaWxlX2RldGFjaChmaWxlRGVzYyk7CisgICAgICAgICAgICA6OmNsb3NlKGZpbGVEZXNjKTsKKyAgICAgICAgICAgIGRlbGV0ZSBkZWNvZGVTZXNzaW9uOworICAgICAgICB9CisgICAgfQorCisgICAgTE9HRCgiRndkTG9ja0VuZ2luZTo6b25PcGVuRGVjcnlwdFNlc3Npb24gRXhpdC4gcmVzdWx0ID0gJWQiLCByZXN1bHQpOworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdHVzX3QgRndkTG9ja0VuZ2luZTo6b25PcGVuRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHVyaSkgeworICAgIHN0YXR1c190IHJlc3VsdCA9IERSTV9FUlJPUl9DQU5OT1RfSEFORExFOworICAgIGNvbnN0IGNoYXIgZmlsZVRhZyBbXSA9ICJmaWxlOi8vIjsKKworICAgIGlmIChOVUxMICE9IGRlY3J5cHRIYW5kbGUgJiYgTlVMTCAhPSB1cmkgJiYgc3RybGVuKHVyaSkgPiBzaXplb2YoZmlsZVRhZykpIHsKKyAgICAgICAgU3RyaW5nOCB1cmlUYWcgPSBTdHJpbmc4KHVyaSk7CisgICAgICAgIHVyaVRhZy50b0xvd2VyKCk7CisKKyAgICAgICAgaWYgKDAgPT0gc3RybmNtcCh1cmlUYWcuc3RyaW5nKCksIGZpbGVUYWcsIHNpemVvZihmaWxlVGFnKSAtIDEpKSB7CisgICAgICAgICAgICBjb25zdCBjaGFyICpmaWxlUGF0aCA9IHN0cmNocih1cmkgKyBzaXplb2YoZmlsZVRhZykgLSAxLCAnLycpOworICAgICAgICAgICAgaWYgKE5VTEwgIT0gZmlsZVBhdGggJiYgb25DYW5IYW5kbGUodW5pcXVlSWQsIFN0cmluZzgoZmlsZVBhdGgpKSkgeworICAgICAgICAgICAgICAgIGludCBmZCA9IG9wZW4oZmlsZVBhdGgsIE9fUkRPTkxZKTsKKworICAgICAgICAgICAgICAgIGlmICgtMSA8IGZkKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIG9mZnNldCBpcyBhbHdheXMgMCBhbmQgbGVuZ3RoIGlzIG5vdCB1c2VkLiBzbyBhbnkgcG9zaXRpdmUgc2l6ZS4KKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gb25PcGVuRGVjcnlwdFNlc3Npb24odW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUsIGZkLCAwLCAxKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBmZCBpcyBkdXBsaWNhdGVkIGFscmVhZHkgaWYgc3VjY2Vzcy4gY2xvc2luZyB0aGUgZmlsZQorICAgICAgICAgICAgICAgICAgICBjbG9zZShmZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdHVzX3QgRndkTG9ja0VuZ2luZTo6b25DbG9zZURlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlKSB7CisgICAgc3RhdHVzX3QgcmVzdWx0ID0gRFJNX0VSUk9SX1VOS05PV047CisgICAgTE9HRCgiRndkTG9ja0VuZ2luZTo6b25DbG9zZURlY3J5cHRTZXNzaW9uIik7CisKKyAgICBpZiAoTlVMTCAhPSBkZWNyeXB0SGFuZGxlICYmIGRlY29kZVNlc3Npb25NYXAuaXNDcmVhdGVkKGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJZCkpIHsKKyAgICAgICAgRGVjb2RlU2Vzc2lvbiogc2Vzc2lvbiA9IGRlY29kZVNlc3Npb25NYXAuZ2V0VmFsdWUoZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdElkKTsKKyAgICAgICAgaWYgKE5VTEwgIT0gc2Vzc2lvbiAmJiBzZXNzaW9uLT5maWxlRGVzYyA+IC0xKSB7CisgICAgICAgICAgICBGd2RMb2NrRmlsZV9kZXRhY2goc2Vzc2lvbi0+ZmlsZURlc2MpOworICAgICAgICAgICAgOjpjbG9zZShzZXNzaW9uLT5maWxlRGVzYyk7CisgICAgICAgICAgICBkZWNvZGVTZXNzaW9uTWFwLnJlbW92ZVZhbHVlKGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJZCk7CisgICAgICAgICAgICByZXN1bHQgPSBEUk1fTk9fRVJST1I7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBMT0dEKCJGd2RMb2NrRW5naW5lOjpvbkNsb3NlRGVjcnlwdFNlc3Npb24gRXhpdCIpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXR1c190IEZ3ZExvY2tFbmdpbmU6Om9uSW5pdGlhbGl6ZURlY3J5cHRVbml0KGludCB1bmlxdWVJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVjcnlwdFVuaXRJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERybUJ1ZmZlciogaGVhZGVySW5mbykgeworICAgIExPR0QoIkZ3ZExvY2tFbmdpbmU6Om9uSW5pdGlhbGl6ZURlY3J5cHRVbml0Iik7CisgICAgcmV0dXJuIERSTV9FUlJPUl9VTktOT1dOOworfQorCitzdGF0dXNfdCBGd2RMb2NrRW5naW5lOjpvbkRlY3J5cHQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCwKKyAgICAgICAgICAgIGNvbnN0IERybUJ1ZmZlciogZW5jQnVmZmVyLCBEcm1CdWZmZXIqKiBkZWNCdWZmZXIsIERybUJ1ZmZlciogSVYpIHsKKyAgICBMT0dEKCJGd2RMb2NrRW5naW5lOjpvbkRlY3J5cHQiKTsKKyAgICByZXR1cm4gRFJNX0VSUk9SX1VOS05PV047Cit9CisKK3N0YXR1c190IEZ3ZExvY2tFbmdpbmU6Om9uRGVjcnlwdChpbnQgdW5pcXVlSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVjcnlwdFVuaXRJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEcm1CdWZmZXIqIGVuY0J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEcm1CdWZmZXIqKiBkZWNCdWZmZXIpIHsKKyAgICBMT0dEKCJGd2RMb2NrRW5naW5lOjpvbkRlY3J5cHQiKTsKKyAgICByZXR1cm4gRFJNX0VSUk9SX1VOS05PV047Cit9CisKK3N0YXR1c190IEZ3ZExvY2tFbmdpbmU6Om9uRmluYWxpemVEZWNyeXB0VW5pdChpbnQgdW5pcXVlSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVjcnlwdFVuaXRJZCkgeworICAgIExPR0QoIkZ3ZExvY2tFbmdpbmU6Om9uRmluYWxpemVEZWNyeXB0VW5pdCIpOworICAgIHJldHVybiBEUk1fRVJST1JfVU5LTk9XTjsKK30KKworc3NpemVfdCBGd2RMb2NrRW5naW5lOjpvblJlYWQoaW50IHVuaXF1ZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1CeXRlcykgeworICAgIHNzaXplX3Qgc2l6ZSA9IC0xOworCisgICAgaWYgKE5VTEwgIT0gZGVjcnlwdEhhbmRsZSAmJgorICAgICAgIGRlY29kZVNlc3Npb25NYXAuaXNDcmVhdGVkKGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJZCkgJiYKKyAgICAgICAgTlVMTCAhPSBidWZmZXIgJiYKKyAgICAgICAgbnVtQnl0ZXMgPiAtMSkgeworICAgICAgICBEZWNvZGVTZXNzaW9uKiBzZXNzaW9uID0gZGVjb2RlU2Vzc2lvbk1hcC5nZXRWYWx1ZShkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SWQpOworICAgICAgICBpZiAoTlVMTCAhPSBzZXNzaW9uICYmIHNlc3Npb24tPmZpbGVEZXNjID4gLTEpIHsKKyAgICAgICAgICAgIHNpemUgPSBGd2RMb2NrRmlsZV9yZWFkKHNlc3Npb24tPmZpbGVEZXNjLCBidWZmZXIsIG51bUJ5dGVzKTsKKworICAgICAgICAgICAgaWYgKDAgPiBzaXplKSB7CisgICAgICAgICAgICAgICAgc2Vzc2lvbi0+b2Zmc2V0ID0gKChvZmZfdCktMSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHNlc3Npb24tPm9mZnNldCArPSBzaXplOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHNpemU7Cit9CisKKyNpZmRlZiBVU0VfNjRCSVRfRFJNX0FQSQorb2ZmNjRfdCBGd2RMb2NrRW5naW5lOjpvbkxzZWVrKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmY2NF90IG9mZnNldCwgaW50IHdoZW5jZSkgeworI2Vsc2UKK29mZl90IEZ3ZExvY2tFbmdpbmU6Om9uTHNlZWsoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZfdCBvZmZzZXQsIGludCB3aGVuY2UpIHsKKyNlbmRpZgorICAgIG9mZl90IG9mZnZhbCA9IC0xOworCisgICAgaWYgKE5VTEwgIT0gZGVjcnlwdEhhbmRsZSAmJiBkZWNvZGVTZXNzaW9uTWFwLmlzQ3JlYXRlZChkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SWQpKSB7CisgICAgICAgIERlY29kZVNlc3Npb24qIHNlc3Npb24gPSBkZWNvZGVTZXNzaW9uTWFwLmdldFZhbHVlKGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJZCk7CisgICAgICAgIGlmIChOVUxMICE9IHNlc3Npb24gJiYgc2Vzc2lvbi0+ZmlsZURlc2MgPiAtMSkgeworICAgICAgICAgICAgb2ZmdmFsID0gRndkTG9ja0ZpbGVfbHNlZWsoc2Vzc2lvbi0+ZmlsZURlc2MsIG9mZnNldCwgd2hlbmNlKTsKKyAgICAgICAgICAgIHNlc3Npb24tPm9mZnNldCA9IG9mZnZhbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBvZmZ2YWw7Cit9CisKKyNpZmRlZiBVU0VfNjRCSVRfRFJNX0FQSQorc3NpemVfdCBGd2RMb2NrRW5naW5lOjpvblByZWFkKGludCB1bmlxdWVJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc2l6ZV90IG51bUJ5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZjY0X3Qgb2Zmc2V0KSB7CisjZWxzZQorc3NpemVfdCBGd2RMb2NrRW5naW5lOjpvblByZWFkKGludCB1bmlxdWVJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc2l6ZV90IG51bUJ5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZl90IG9mZnNldCkgeworI2VuZGlmCisgICAgc3NpemVfdCBieXRlc1JlYWQgPSAtMTsKKworICAgIERlY29kZVNlc3Npb24qIGRlY29kZXJTZXNzaW9uID0gTlVMTDsKKworICAgIGlmICgoTlVMTCAhPSBkZWNyeXB0SGFuZGxlKSAmJgorICAgICAgICAoTlVMTCAhPSAoZGVjb2RlclNlc3Npb24gPSBkZWNvZGVTZXNzaW9uTWFwLmdldFZhbHVlKGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJZCkpKSAmJgorICAgICAgICAoTlVMTCAhPSBidWZmZXIpICYmCisgICAgICAgIChudW1CeXRlcyA+IC0xKSAmJgorICAgICAgICAob2Zmc2V0ID4gLTEpKSB7CisgICAgICAgIGlmIChvZmZzZXQgIT0gZGVjb2RlclNlc3Npb24tPm9mZnNldCkgeworICAgICAgICAgICAgZGVjb2RlclNlc3Npb24tPm9mZnNldCA9IG9uTHNlZWsodW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUsIG9mZnNldCwgU0VFS19TRVQpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCgob2ZmX3QpLTEpICE9IGRlY29kZXJTZXNzaW9uLT5vZmZzZXQpIHsKKyAgICAgICAgICAgIGJ5dGVzUmVhZCA9IG9uUmVhZCh1bmlxdWVJZCwgZGVjcnlwdEhhbmRsZSwgYnVmZmVyLCBudW1CeXRlcyk7CisgICAgICAgICAgICBpZiAoYnl0ZXNSZWFkIDwgMCkgeworICAgICAgICAgICAgICAgIExPR0QoIkZ3ZExvY2tFbmdpbmU6Om9uUHJlYWQgZXJyb3IgcmVhZGluZyIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HRCgiRndkTG9ja0VuZ2luZTo6b25QcmVhZCBkZWNyeXB0SWQgbm90IGZvdW5kIik7CisgICAgfQorCisgICAgcmV0dXJuIGJ5dGVzUmVhZDsKK30KZGlmZiAtLWdpdCBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svaW50ZXJuYWwtZm9ybWF0L0FuZHJvaWQubWsgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllZTc5NjEKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMTYgQEAKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCitpbmNsdWRlICQoY2FsbCBhbGwtc3ViZGlyLW1ha2VmaWxlcykKZGlmZiAtLWdpdCBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svaW50ZXJuYWwtZm9ybWF0L2NvbW1vbi9BbmRyb2lkLm1rIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9pbnRlcm5hbC1mb3JtYXQvY29tbW9uL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmM1ZDNjZgotLS0gL2Rldi9udWxsCisrKyBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svaW50ZXJuYWwtZm9ybWF0L2NvbW1vbi9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMzIgQEAKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9TUkNfRklMRVMgOj0gXAorICAgIEZ3ZExvY2tHbHVlLmMKKworTE9DQUxfQ19JTkNMVURFUyA6PSBcCisgICAgZXh0ZXJuYWwvb3BlbnNzbC9pbmNsdWRlCisKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGliY3J5cHRvCisKK0xPQ0FMX01PRFVMRSA6PSBsaWJmd2Rsb2NrLWNvbW1vbgorCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorCitpbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9jb21tb24vRndkTG9ja0dsdWUuYyBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svaW50ZXJuYWwtZm9ybWF0L2NvbW1vbi9Gd2RMb2NrR2x1ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyYmRhOGZmCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9pbnRlcm5hbC1mb3JtYXQvY29tbW9uL0Z3ZExvY2tHbHVlLmMKQEAgLTAsMCArMSwxOTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHB0aHJlYWQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvYWVzLmg+CisKKyNpbmNsdWRlICJGd2RMb2NrR2x1ZS5oIgorCisjZGVmaW5lIFRSVUUgMQorI2RlZmluZSBGQUxTRSAwCisKKyNkZWZpbmUgS0VZX1NJWkUgMTYKKyNkZWZpbmUgS0VZX1NJWkVfSU5fQklUUyAoS0VZX1NJWkUgKiA4KQorCitzdGF0aWMgaW50IGlzSW5pdGlhbGl6ZWQgPSBGQUxTRTsKKworc3RhdGljIGNvbnN0IGNoYXIgc3RyS2V5RmlsZW5hbWVbXSA9ICIvZGF0YS9kcm0vZndkbG9jay9rZWsuZGF0IjsKKworc3RhdGljIEFFU19LRVkgZW5jcnlwdGlvblJvdW5kS2V5czsKK3N0YXRpYyBBRVNfS0VZIGRlY3J5cHRpb25Sb3VuZEtleXM7CisKKy8qKgorICogQ3JlYXRlcyBhbGwgZGlyZWN0b3JpZXMgYWxvbmcgdGhlIGZ1bGx5IHF1YWxpZmllZCBwYXRoIG9mIHRoZSBnaXZlbiBmaWxlLgorICoKKyAqIEBwYXJhbVtpbl0gcGF0aCBBIHJlZmVyZW5jZSB0byB0aGUgZnVsbHkgcXVhbGlmaWVkIHBhdGggb2YgYSBmaWxlLgorICogQHBhcmFtW2luXSBtb2RlIFRoZSBhY2Nlc3MgbW9kZSB0byB1c2UgZm9yIHRoZSBkaXJlY3RvcmllcyBiZWluZyBjcmVhdGVkLgorICoKKyAqIEByZXR1cm4gQSBCb29sZWFuIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0aGUgb3BlcmF0aW9uIHdhcyBzdWNjZXNzZnVsLgorICovCitzdGF0aWMgaW50IEZ3ZExvY2tHbHVlX0NyZWF0ZURpcmVjdG9yaWVzKGNvbnN0IGNoYXIgKnBhdGgsIG1vZGVfdCBtb2RlKSB7CisgICAgaW50IHJlc3VsdCA9IFRSVUU7CisgICAgc2l6ZV90IHBhcnRpYWxQYXRoTGVuZ3RoID0gc3RybGVuKHBhdGgpOworICAgIGNoYXIgKnBhcnRpYWxQYXRoID0gbWFsbG9jKHBhcnRpYWxQYXRoTGVuZ3RoICsgMSk7CisgICAgaWYgKHBhcnRpYWxQYXRoID09IE5VTEwpIHsKKyAgICAgICAgcmVzdWx0ID0gRkFMU0U7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc2l6ZV90IGk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwYXJ0aWFsUGF0aExlbmd0aDsgKytpKSB7CisgICAgICAgICAgICBpZiAocGF0aFtpXSA9PSAnLycgJiYgaSA+IDApIHsKKyAgICAgICAgICAgICAgICBwYXJ0aWFsUGF0aFtpXSA9ICdcMCc7CisgICAgICAgICAgICAgICAgaWYgKG1rZGlyKHBhcnRpYWxQYXRoLCBtb2RlKSAhPSAwICYmIGVycm5vICE9IEVFWElTVCkgeworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcGFydGlhbFBhdGhbaV0gPSBwYXRoW2ldOworICAgICAgICB9CisgICAgICAgIGZyZWUocGFydGlhbFBhdGgpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIEluaXRpYWxpemVzIHRoZSByb3VuZCBrZXlzIHVzZWQgZm9yIGVuY3J5cHRpb24gYW5kIGRlY3J5cHRpb24gb2Ygc2Vzc2lvbiBrZXlzLiBGaXJzdCBjcmVhdGVzIGEKKyAqIGRldmljZS11bmlxdWUga2V5LWVuY3J5cHRpb24ga2V5IGlmIG5vbmUgZXhpc3RzIHlldC4KKyAqLworc3RhdGljIHZvaWQgRndkTG9ja0dsdWVfSW5pdGlhbGl6ZVJvdW5kS2V5cygpIHsKKyAgICB1bnNpZ25lZCBjaGFyIGtleUVuY3J5cHRpb25LZXlbS0VZX1NJWkVdOworICAgIGludCBmaWxlRGVzYyA9IG9wZW4oc3RyS2V5RmlsZW5hbWUsIE9fUkRPTkxZKTsKKyAgICBpZiAoZmlsZURlc2MgPj0gMCkgeworICAgICAgICBpZiAocmVhZChmaWxlRGVzYywga2V5RW5jcnlwdGlvbktleSwgS0VZX1NJWkUpID09IEtFWV9TSVpFKSB7CisgICAgICAgICAgICBpc0luaXRpYWxpemVkID0gVFJVRTsKKyAgICAgICAgfQorICAgICAgICAodm9pZCljbG9zZShmaWxlRGVzYyk7CisgICAgfSBlbHNlIGlmIChlcnJubyA9PSBFTk9FTlQgJiYKKyAgICAgICAgICAgICAgIEZ3ZExvY2tHbHVlX0dldFJhbmRvbU51bWJlcihrZXlFbmNyeXB0aW9uS2V5LCBLRVlfU0laRSkgJiYKKyAgICAgICAgICAgICAgIEZ3ZExvY2tHbHVlX0NyZWF0ZURpcmVjdG9yaWVzKHN0cktleUZpbGVuYW1lLCBTX0lSV1hVKSkgeworICAgICAgICBmaWxlRGVzYyA9IG9wZW4oc3RyS2V5RmlsZW5hbWUsIE9fQ1JFQVQgfCBPX1RSVU5DIHwgT19XUk9OTFksIFNfSVJVU1IpOworICAgICAgICBpZiAoZmlsZURlc2MgPj0gMCkgeworICAgICAgICAgICAgaWYgKHdyaXRlKGZpbGVEZXNjLCBrZXlFbmNyeXB0aW9uS2V5LCBLRVlfU0laRSkgPT0gS0VZX1NJWkUpIHsKKyAgICAgICAgICAgICAgICBpc0luaXRpYWxpemVkID0gVFJVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICh2b2lkKWNsb3NlKGZpbGVEZXNjKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoaXNJbml0aWFsaXplZCkgeworICAgICAgICBpZiAoQUVTX3NldF9lbmNyeXB0X2tleShrZXlFbmNyeXB0aW9uS2V5LCBLRVlfU0laRV9JTl9CSVRTLCAmZW5jcnlwdGlvblJvdW5kS2V5cykgIT0gMCB8fAorICAgICAgICAgICAgQUVTX3NldF9kZWNyeXB0X2tleShrZXlFbmNyeXB0aW9uS2V5LCBLRVlfU0laRV9JTl9CSVRTLCAmZGVjcnlwdGlvblJvdW5kS2V5cykgIT0gMCkgeworICAgICAgICAgICAgaXNJbml0aWFsaXplZCA9IEZBTFNFOworICAgICAgICB9CisgICAgfQorICAgIG1lbXNldChrZXlFbmNyeXB0aW9uS2V5LCAwLCBLRVlfU0laRSk7IC8vIFplcm8gb3V0IGtleSBkYXRhLgorfQorCisvKioKKyAqIFZhbGlkYXRlcyB0aGUgcGFkZGluZyBvZiBhIGRlY3J5cHRlZCBrZXkuCisgKgorICogQHBhcmFtW2luXSBwRGF0YSBBIHJlZmVyZW5jZSB0byB0aGUgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIGRlY3J5cHRlZCBrZXkgYW5kIHBhZGRpbmcuCisgKiBAcGFyYW1baW5dIGRlY3J5cHRlZEtleUxlbmd0aCBUaGUgbGVuZ3RoIGluIGJ5dGVzIG9mIHRoZSBkZWNyeXB0ZWQga2V5LgorICoKKyAqIEByZXR1cm4gQSBCb29sZWFuIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0aGUgcGFkZGluZyB3YXMgdmFsaWQuCisgKi8KK3N0YXRpYyBpbnQgRndkTG9ja0dsdWVfVmFsaWRhdGVQYWRkaW5nKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnBEYXRhLCBzaXplX3QgZGVjcnlwdGVkS2V5TGVuZ3RoKSB7CisgICAgc2l6ZV90IGk7CisgICAgc2l6ZV90IHBhZGRpbmcgPSBBRVNfQkxPQ0tfU0laRSAtIChkZWNyeXB0ZWRLZXlMZW5ndGggJSBBRVNfQkxPQ0tfU0laRSk7CisgICAgcERhdGEgKz0gZGVjcnlwdGVkS2V5TGVuZ3RoOworICAgIGZvciAoaSA9IDA7IGkgPCBwYWRkaW5nOyArK2kpIHsKKyAgICAgICAgaWYgKChzaXplX3QpKnBEYXRhICE9IHBhZGRpbmcpIHsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgICAgICArK3BEYXRhOworICAgIH0KKyAgICByZXR1cm4gVFJVRTsKK30KKworaW50IEZ3ZExvY2tHbHVlX0dldFJhbmRvbU51bWJlcih2b2lkICpwQnVmZmVyLCBzaXplX3QgbnVtQnl0ZXMpIHsKKyAgICAvLyBHZW5lcmF0ZSAnY3J5cHRvZ3JhcGhpY2FsbHkgc2VjdXJlJyByYW5kb20gYnl0ZXMgYnkgcmVhZGluZyB0aGVtIGZyb20gIi9kZXYvdXJhbmRvbSIgKHRoZQorICAgIC8vIG5vbi1ibG9ja2luZyB2ZXJzaW9uIG9mICIvZGV2L3JhbmRvbSIpLgorICAgIHNzaXplX3QgbnVtQnl0ZXNSZWFkID0gMDsKKyAgICBpbnQgZmlsZURlc2MgPSBvcGVuKCIvZGV2L3VyYW5kb20iLCBPX1JET05MWSk7CisgICAgaWYgKGZpbGVEZXNjID49IDApIHsKKyAgICAgICAgbnVtQnl0ZXNSZWFkID0gcmVhZChmaWxlRGVzYywgcEJ1ZmZlciwgbnVtQnl0ZXMpOworICAgICAgICAodm9pZCljbG9zZShmaWxlRGVzYyk7CisgICAgfQorICAgIHJldHVybiBudW1CeXRlc1JlYWQgPj0gMCAmJiAoc2l6ZV90KW51bUJ5dGVzUmVhZCA9PSBudW1CeXRlczsKK30KKworaW50IEZ3ZExvY2tHbHVlX0luaXRpYWxpemVLZXlFbmNyeXB0aW9uKCkgeworICAgIHN0YXRpYyBwdGhyZWFkX29uY2VfdCBvbmNlID0gUFRIUkVBRF9PTkNFX0lOSVQ7CisgICAgcHRocmVhZF9vbmNlKCZvbmNlLCBGd2RMb2NrR2x1ZV9Jbml0aWFsaXplUm91bmRLZXlzKTsKKyAgICByZXR1cm4gaXNJbml0aWFsaXplZDsKK30KKworc2l6ZV90IEZ3ZExvY2tHbHVlX0dldEVuY3J5cHRlZEtleUxlbmd0aChzaXplX3QgcGxhaW50ZXh0S2V5TGVuZ3RoKSB7CisgICAgcmV0dXJuICgocGxhaW50ZXh0S2V5TGVuZ3RoIC8gQUVTX0JMT0NLX1NJWkUpICsgMikgKiBBRVNfQkxPQ0tfU0laRTsKK30KKworaW50IEZ3ZExvY2tHbHVlX0VuY3J5cHRLZXkoY29uc3Qgdm9pZCAqcFBsYWludGV4dEtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBwbGFpbnRleHRLZXlMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpwRW5jcnlwdGVkS2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGVuY3J5cHRlZEtleUxlbmd0aCkgeworICAgIGludCByZXN1bHQgPSBGQUxTRTsKKyAgICBhc3NlcnQoZW5jcnlwdGVkS2V5TGVuZ3RoID09IEZ3ZExvY2tHbHVlX0dldEVuY3J5cHRlZEtleUxlbmd0aChwbGFpbnRleHRLZXlMZW5ndGgpKTsKKyAgICBpZiAoRndkTG9ja0dsdWVfSW5pdGlhbGl6ZUtleUVuY3J5cHRpb24oKSkgeworICAgICAgICB1bnNpZ25lZCBjaGFyIGluaXRWZWN0b3JbQUVTX0JMT0NLX1NJWkVdOworICAgICAgICBpZiAoRndkTG9ja0dsdWVfR2V0UmFuZG9tTnVtYmVyKGluaXRWZWN0b3IsIEFFU19CTE9DS19TSVpFKSkgeworICAgICAgICAgICAgc2l6ZV90IHBhZGRpbmcgPSBBRVNfQkxPQ0tfU0laRSAtIChwbGFpbnRleHRLZXlMZW5ndGggJSBBRVNfQkxPQ0tfU0laRSk7CisgICAgICAgICAgICBzaXplX3QgZGF0YUxlbmd0aCA9IGVuY3J5cHRlZEtleUxlbmd0aCAtIEFFU19CTE9DS19TSVpFOworICAgICAgICAgICAgbWVtY3B5KHBFbmNyeXB0ZWRLZXksIHBQbGFpbnRleHRLZXksIHBsYWludGV4dEtleUxlbmd0aCk7CisgICAgICAgICAgICBtZW1zZXQoKHVuc2lnbmVkIGNoYXIgKilwRW5jcnlwdGVkS2V5ICsgcGxhaW50ZXh0S2V5TGVuZ3RoLCAoaW50KXBhZGRpbmcsIHBhZGRpbmcpOworICAgICAgICAgICAgbWVtY3B5KCh1bnNpZ25lZCBjaGFyICopcEVuY3J5cHRlZEtleSArIGRhdGFMZW5ndGgsIGluaXRWZWN0b3IsIEFFU19CTE9DS19TSVpFKTsKKyAgICAgICAgICAgIEFFU19jYmNfZW5jcnlwdChwRW5jcnlwdGVkS2V5LCBwRW5jcnlwdGVkS2V5LCBkYXRhTGVuZ3RoLCAmZW5jcnlwdGlvblJvdW5kS2V5cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0VmVjdG9yLCBBRVNfRU5DUllQVCk7CisgICAgICAgICAgICByZXN1bHQgPSBUUlVFOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK2ludCBGd2RMb2NrR2x1ZV9EZWNyeXB0S2V5KGNvbnN0IHZvaWQgKnBFbmNyeXB0ZWRLZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZW5jcnlwdGVkS2V5TGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcERlY3J5cHRlZEtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBkZWNyeXB0ZWRLZXlMZW5ndGgpIHsKKyAgICBpbnQgcmVzdWx0ID0gRkFMU0U7CisgICAgYXNzZXJ0KGVuY3J5cHRlZEtleUxlbmd0aCA9PSBGd2RMb2NrR2x1ZV9HZXRFbmNyeXB0ZWRLZXlMZW5ndGgoZGVjcnlwdGVkS2V5TGVuZ3RoKSk7CisgICAgaWYgKEZ3ZExvY2tHbHVlX0luaXRpYWxpemVLZXlFbmNyeXB0aW9uKCkpIHsKKyAgICAgICAgc2l6ZV90IGRhdGFMZW5ndGggPSBlbmNyeXB0ZWRLZXlMZW5ndGggLSBBRVNfQkxPQ0tfU0laRTsKKyAgICAgICAgdW5zaWduZWQgY2hhciAqcERhdGEgPSBtYWxsb2MoZGF0YUxlbmd0aCk7CisgICAgICAgIGlmIChwRGF0YSAhPSBOVUxMKSB7CisgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIGluaXRWZWN0b3JbQUVTX0JMT0NLX1NJWkVdOworICAgICAgICAgICAgbWVtY3B5KHBEYXRhLCBwRW5jcnlwdGVkS2V5LCBkYXRhTGVuZ3RoKTsKKyAgICAgICAgICAgIG1lbWNweShpbml0VmVjdG9yLCAoY29uc3QgdW5zaWduZWQgY2hhciAqKXBFbmNyeXB0ZWRLZXkgKyBkYXRhTGVuZ3RoLCBBRVNfQkxPQ0tfU0laRSk7CisgICAgICAgICAgICBBRVNfY2JjX2VuY3J5cHQocERhdGEsIHBEYXRhLCBkYXRhTGVuZ3RoLCAmZGVjcnlwdGlvblJvdW5kS2V5cywgaW5pdFZlY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRVNfREVDUllQVCk7CisgICAgICAgICAgICBtZW1jcHkocERlY3J5cHRlZEtleSwgcERhdGEsIGRlY3J5cHRlZEtleUxlbmd0aCk7CisgICAgICAgICAgICByZXN1bHQgPSBGd2RMb2NrR2x1ZV9WYWxpZGF0ZVBhZGRpbmcocERhdGEsIGRlY3J5cHRlZEtleUxlbmd0aCk7CisgICAgICAgICAgICBmcmVlKHBEYXRhKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQpkaWZmIC0tZ2l0IGEvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9pbnRlcm5hbC1mb3JtYXQvY29tbW9uL0Z3ZExvY2tHbHVlLmggYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9jb21tb24vRndkTG9ja0dsdWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzZmNmVhCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9pbnRlcm5hbC1mb3JtYXQvY29tbW9uL0Z3ZExvY2tHbHVlLmgKQEAgLTAsMCArMSw4NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX19GV0RMT0NLR0xVRV9IX18KKyNkZWZpbmUgX19GV0RMT0NLR0xVRV9IX18KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKioKKyAqIEdlbmVyYXRlcyB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBjcnlwdG9ncmFwaGljYWxseSBzZWN1cmUgcmFuZG9tIGJ5dGVzLgorICoKKyAqIEBwYXJhbVtvdXRdIHBCdWZmZXIgQSByZWZlcmVuY2UgdG8gdGhlIGJ1ZmZlciB0aGF0IHNob3VsZCByZWNlaXZlIHRoZSByYW5kb20gZGF0YS4KKyAqIEBwYXJhbVtpbl0gbnVtQnl0ZXMgVGhlIG51bWJlciBvZiByYW5kb20gYnl0ZXMgdG8gZ2VuZXJhdGUuCisgKgorICogQHJldHVybiBBIEJvb2xlYW4gdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBvcGVyYXRpb24gd2FzIHN1Y2Nlc3NmdWwuCisgKi8KK2ludCBGd2RMb2NrR2x1ZV9HZXRSYW5kb21OdW1iZXIodm9pZCAqcEJ1ZmZlciwgc2l6ZV90IG51bUJ5dGVzKTsKKworLyoqCisgKiBQZXJmb3JtcyBpbml0aWFsaXphdGlvbiBvZiB0aGUga2V5LWVuY3J5cHRpb24ga2V5LiBTaG91bGQgYmUgY2FsbGVkIG9uY2UgZHVyaW5nIHN0YXJ0dXAgdG8KKyAqIGZhY2lsaXRhdGUgZW5jcnlwdGlvbiBhbmQgZGVjcnlwdGlvbiBvZiBzZXNzaW9uIGtleXMuCisgKgorICogQHJldHVybiBBIEJvb2xlYW4gdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBvcGVyYXRpb24gd2FzIHN1Y2Nlc3NmdWwuCisgKi8KK2ludCBGd2RMb2NrR2x1ZV9Jbml0aWFsaXplS2V5RW5jcnlwdGlvbigpOworCisvKioKKyAqIFJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGUgZW5jcnlwdGVkIGtleSwgZ2l2ZW4gdGhlIGxlbmd0aCBvZiB0aGUgcGxhaW50ZXh0IGtleS4KKyAqCisgKiBAcGFyYW1baW5dIHBsYWludGV4dEtleUxlbmd0aCBUaGUgbGVuZ3RoIGluIGJ5dGVzIG9mIHRoZSBwbGFpbnRleHQga2V5LgorICoKKyAqIEByZXR1cm4gVGhlIGxlbmd0aCBpbiBieXRlcyBvZiB0aGUgZW5jcnlwdGVkIGtleS4KKyAqLworc2l6ZV90IEZ3ZExvY2tHbHVlX0dldEVuY3J5cHRlZEtleUxlbmd0aChzaXplX3QgcGxhaW50ZXh0S2V5TGVuZ3RoKTsKKworLyoqCisgKiBFbmNyeXB0cyB0aGUgZ2l2ZW4gc2Vzc2lvbiBrZXkgdXNpbmcgYSBrZXktZW5jcnlwdGlvbiBrZXkgdW5pcXVlIHRvIHRoaXMgZGV2aWNlLgorICoKKyAqIEBwYXJhbVtpbl0gcFBsYWludGV4dEtleSBBIHJlZmVyZW5jZSB0byB0aGUgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIHBsYWludGV4dCBrZXkuCisgKiBAcGFyYW1baW5dIHBsYWludGV4dEtleUxlbmd0aCBUaGUgbGVuZ3RoIGluIGJ5dGVzIG9mIHRoZSBwbGFpbnRleHQga2V5LgorICogQHBhcmFtW291dF0gcEVuY3J5cHRlZEtleSBBIHJlZmVyZW5jZSB0byB0aGUgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIGVuY3J5cHRlZCBrZXkuCisgKiBAcGFyYW1baW5dIGVuY3J5cHRlZEtleUxlbmd0aCBUaGUgbGVuZ3RoIGluIGJ5dGVzIG9mIHRoZSBlbmNyeXB0ZWQga2V5LgorICoKKyAqIEByZXR1cm4gQSBCb29sZWFuIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0aGUgb3BlcmF0aW9uIHdhcyBzdWNjZXNzZnVsLgorICovCitpbnQgRndkTG9ja0dsdWVfRW5jcnlwdEtleShjb25zdCB2b2lkICpwUGxhaW50ZXh0S2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHBsYWludGV4dEtleUxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnBFbmNyeXB0ZWRLZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZW5jcnlwdGVkS2V5TGVuZ3RoKTsKKworLyoqCisgKiBEZWNyeXB0cyB0aGUgZ2l2ZW4gc2Vzc2lvbiBrZXkgdXNpbmcgYSBrZXktZW5jcnlwdGlvbiBrZXkgdW5pcXVlIHRvIHRoaXMgZGV2aWNlLgorICoKKyAqIEBwYXJhbVtpbl0gcEVuY3J5cHRlZEtleSBBIHJlZmVyZW5jZSB0byB0aGUgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIGVuY3J5cHRlZCBrZXkuCisgKiBAcGFyYW1baW5dIGVuY3J5cHRlZEtleUxlbmd0aCBUaGUgbGVuZ3RoIGluIGJ5dGVzIG9mIHRoZSBlbmNyeXB0ZWQga2V5LgorICogQHBhcmFtW291dF0gcERlY3J5cHRlZEtleSBBIHJlZmVyZW5jZSB0byB0aGUgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIGRlY3J5cHRlZCBrZXkuCisgKiBAcGFyYW1baW5dIGRlY3J5cHRlZEtleUxlbmd0aCBUaGUgbGVuZ3RoIGluIGJ5dGVzIG9mIHRoZSBkZWNyeXB0ZWQga2V5LgorICoKKyAqIEByZXR1cm4gQSBCb29sZWFuIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0aGUgb3BlcmF0aW9uIHdhcyBzdWNjZXNzZnVsLgorICovCitpbnQgRndkTG9ja0dsdWVfRGVjcnlwdEtleShjb25zdCB2b2lkICpwRW5jcnlwdGVkS2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGVuY3J5cHRlZEtleUxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnBEZWNyeXB0ZWRLZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZGVjcnlwdGVkS2V5TGVuZ3RoKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8vIF9fRldETE9DS0dMVUVfSF9fCmRpZmYgLS1naXQgYS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9jb252ZXJ0ZXIvQW5kcm9pZC5tayBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svaW50ZXJuYWwtZm9ybWF0L2NvbnZlcnRlci9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwYmI3ODgKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9jb252ZXJ0ZXIvQW5kcm9pZC5tawpAQCAtMCwwICsxLDM3IEBACisjCisjIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfU1JDX0ZJTEVTIDo9IFwKKyAgICBGd2RMb2NrQ29udi5jCisKK0xPQ0FMX0NfSU5DTFVERVMgOj0gXAorICAgIGZyYW1ld29ya3MvYmFzZS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9jb21tb24gXAorICAgIGV4dGVybmFsL29wZW5zc2wvaW5jbHVkZQorCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmNyeXB0bworCitMT0NBTF9XSE9MRV9TVEFUSUNfTElCUkFSSUVTIDo9IGxpYmZ3ZGxvY2stY29tbW9uCisKK0xPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gbGliZndkbG9jay1jb21tb24KKworTE9DQUxfTU9EVUxFIDo9IGxpYmZ3ZGxvY2stY29udmVydGVyCisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCisKK2luY2x1ZGUgJChCVUlMRF9TVEFUSUNfTElCUkFSWSkKZGlmZiAtLWdpdCBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svaW50ZXJuYWwtZm9ybWF0L2NvbnZlcnRlci9Gd2RMb2NrQ29udi5jIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9pbnRlcm5hbC1mb3JtYXQvY29udmVydGVyL0Z3ZExvY2tDb252LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTRlYTllOQotLS0gL2Rldi9udWxsCisrKyBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svaW50ZXJuYWwtZm9ybWF0L2NvbnZlcnRlci9Gd2RMb2NrQ29udi5jCkBAIC0wLDAgKzEsMTMzOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8cHRocmVhZC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9hZXMuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2htYWMuaD4KKworI2luY2x1ZGUgIkZ3ZExvY2tDb252LmgiCisjaW5jbHVkZSAiRndkTG9ja0dsdWUuaCIKKworI2RlZmluZSBUUlVFIDEKKyNkZWZpbmUgRkFMU0UgMAorCisjZGVmaW5lIElOVkFMSURfT0ZGU0VUICgob2ZmNjRfdCktMSkKKworI2RlZmluZSBNQVhfTlVNX1NFU1NJT05TIDMyCisKKyNkZWZpbmUgT1VUUFVUX0JVRkZFUl9TSVpFX0lOQ1JFTUVOVCAxMDI0CisjZGVmaW5lIFJFQURfQlVGRkVSX1NJWkUgMTAyNAorCisjZGVmaW5lIE1BWF9CT1VOREFSWV9MRU5HVEggNzAKKyNkZWZpbmUgTUFYX0RFTElNSVRFUl9MRU5HVEggKE1BWF9CT1VOREFSWV9MRU5HVEggKyA0KQorCisjZGVmaW5lIFNUUklOR19MRU5HVEhfSU5DUkVNRU5UIDI1CisKKyNkZWZpbmUgS0VZX1NJWkUgQUVTX0JMT0NLX1NJWkUKKyNkZWZpbmUgS0VZX1NJWkVfSU5fQklUUyAoS0VZX1NJWkUgKiA4KQorCisjZGVmaW5lIFNIQTFfSEFTSF9TSVpFIDIwCisKKyNkZWZpbmUgRldEX0xPQ0tfVkVSU0lPTiAwCisjZGVmaW5lIEZXRF9MT0NLX1NVQkZPUk1BVCAwCisjZGVmaW5lIFVTQUdFX1JFU1RSSUNUSU9OX0ZMQUdTIDAKKyNkZWZpbmUgQ09OVEVOVF9UWVBFX0xFTkdUSF9QT1MgNworI2RlZmluZSBUT1BfSEVBREVSX1NJWkUgOAorCisvKioKKyAqIERhdGEgdHlwZSBmb3IgdGhlIHBhcnNlciBzdGF0ZXMgb2YgdGhlIGNvbnZlcnRlci4KKyAqLwordHlwZWRlZiBlbnVtIEZ3ZExvY2tDb252X1BhcnNlclN0YXRlIHsKKyAgICBGd2RMb2NrQ29udl9QYXJzZXJTdGF0ZV9XYW50c09wZW5EZWxpbWl0ZXIsCisgICAgRndkTG9ja0NvbnZfUGFyc2VyU3RhdGVfV2FudHNNaW1lSGVhZGVycywKKyAgICBGd2RMb2NrQ29udl9QYXJzZXJTdGF0ZV9XYW50c0JpbmFyeUVuY29kZWREYXRhLAorICAgIEZ3ZExvY2tDb252X1BhcnNlclN0YXRlX1dhbnRzQmFzZTY0RW5jb2RlZERhdGEsCisgICAgRndkTG9ja0NvbnZfUGFyc2VyU3RhdGVfRG9uZQorfSBGd2RMb2NrQ29udl9QYXJzZXJTdGF0ZV90OworCisvKioKKyAqIERhdGEgdHlwZSBmb3IgdGhlIHNjYW5uZXIgc3RhdGVzIG9mIHRoZSBjb252ZXJ0ZXIuCisgKi8KK3R5cGVkZWYgZW51bSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGUgeworICAgIEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c0ZpcnN0RGFzaCwKKyAgICBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNTZWNvbmREYXNoLAorICAgIEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c0NSLAorICAgIEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c0xGLAorICAgIEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c0JvdW5kYXJ5LAorICAgIEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c0JvdW5kYXJ5RW5kLAorICAgIEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c01pbWVIZWFkZXJOYW1lU3RhcnQsCisgICAgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzTWltZUhlYWRlck5hbWUsCisgICAgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzTWltZUhlYWRlck5hbWVFbmQsCisgICAgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzQ29udGVudFR5cGVTdGFydCwKKyAgICBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNDb250ZW50VHlwZSwKKyAgICBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNDb250ZW50VHJhbnNmZXJFbmNvZGluZ1N0YXJ0LAorICAgIEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c19BX09SX0ksCisgICAgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzX04sCisgICAgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzX0EsCisgICAgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzX1IsCisgICAgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzX1ksCisgICAgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzX1MsCisgICAgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzX0UsCisgICAgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzXzYsCisgICAgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzXzQsCisgICAgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzX0IsCisgICAgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzX0ksCisgICAgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzX1QsCisgICAgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzQ29udGVudFRyYW5zZmVyRW5jb2RpbmdFbmQsCisgICAgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzTWltZUhlYWRlclZhbHVlRW5kLAorICAgIEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c01pbWVIZWFkZXJzRW5kLAorICAgIEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c0J5dGUxLAorICAgIEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c0J5dGUxX0FmdGVyQ1JMRiwKKyAgICBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNCeXRlMiwKKyAgICBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNCeXRlMywKKyAgICBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNCeXRlNCwKKyAgICBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNQYWRkaW5nLAorICAgIEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c1doaXRlc3BhY2UsCisgICAgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzV2hpdGVzcGFjZV9BZnRlckNSTEYsCisgICAgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzRGVsaW1pdGVyCit9IEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV90OworCisvKioKKyAqIERhdGEgdHlwZSBmb3IgdGhlIGNvbnRlbnQgdHJhbnNmZXIgZW5jb2RpbmcuCisgKi8KK3R5cGVkZWYgZW51bSBGd2RMb2NrQ29udl9Db250ZW50VHJhbnNmZXJFbmNvZGluZyB7CisgICAgRndkTG9ja0NvbnZfQ29udGVudFRyYW5zZmVyRW5jb2RpbmdfVW5kZWZpbmVkLAorICAgIEZ3ZExvY2tDb252X0NvbnRlbnRUcmFuc2ZlckVuY29kaW5nX0JpbmFyeSwKKyAgICBGd2RMb2NrQ29udl9Db250ZW50VHJhbnNmZXJFbmNvZGluZ19CYXNlNjQKK30gRndkTG9ja0NvbnZfQ29udGVudFRyYW5zZmVyRW5jb2RpbmdfdDsKKworLyoqCisgKiBEYXRhIHR5cGUgZm9yIGEgZHluYW1pY2FsbHkgZ3Jvd2luZyBzdHJpbmcuCisgKi8KK3R5cGVkZWYgc3RydWN0IEZ3ZExvY2tDb252X1N0cmluZyB7CisgICAgY2hhciAqcHRyOworICAgIHNpemVfdCBsZW5ndGg7CisgICAgc2l6ZV90IG1heExlbmd0aDsKKyAgICBzaXplX3QgbGVuZ3RoSW5jcmVtZW50OworfSBGd2RMb2NrQ29udl9TdHJpbmdfdDsKKworLyoqCisgKiBEYXRhIHR5cGUgZm9yIHRoZSBwZXItZmlsZSBzdGF0ZSBpbmZvcm1hdGlvbiBuZWVkZWQgYnkgdGhlIGNvbnZlcnRlci4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgRndkTG9ja0NvbnZfU2Vzc2lvbiB7CisgICAgRndkTG9ja0NvbnZfUGFyc2VyU3RhdGVfdCBwYXJzZXJTdGF0ZTsKKyAgICBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfdCBzY2FubmVyU3RhdGU7CisgICAgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX3Qgc2F2ZWRTY2FubmVyU3RhdGU7CisgICAgb2ZmNjRfdCBudW1DaGFyc0NvbnN1bWVkOworICAgIGNoYXIgZGVsaW1pdGVyW01BWF9ERUxJTUlURVJfTEVOR1RIXTsKKyAgICBzaXplX3QgZGVsaW1pdGVyTGVuZ3RoOworICAgIHNpemVfdCBkZWxpbWl0ZXJNYXRjaFBvczsKKyAgICBGd2RMb2NrQ29udl9TdHJpbmdfdCBtaW1lSGVhZGVyTmFtZTsKKyAgICBGd2RMb2NrQ29udl9TdHJpbmdfdCBjb250ZW50VHlwZTsKKyAgICBGd2RMb2NrQ29udl9Db250ZW50VHJhbnNmZXJFbmNvZGluZ190IGNvbnRlbnRUcmFuc2ZlckVuY29kaW5nOworICAgIHVuc2lnbmVkIGNoYXIgc2Vzc2lvbktleVtLRVlfU0laRV07CisgICAgdm9pZCAqcEVuY3J5cHRlZFNlc3Npb25LZXk7CisgICAgc2l6ZV90IGVuY3J5cHRlZFNlc3Npb25LZXlMZW5ndGg7CisgICAgQUVTX0tFWSBlbmNyeXB0aW9uUm91bmRLZXlzOworICAgIEhNQUNfQ1RYIHNpZ25pbmdDb250ZXh0OworICAgIHVuc2lnbmVkIGNoYXIgdG9wSGVhZGVyW1RPUF9IRUFERVJfU0laRV07CisgICAgdW5zaWduZWQgY2hhciBjb3VudGVyW0FFU19CTE9DS19TSVpFXTsKKyAgICB1bnNpZ25lZCBjaGFyIGtleVN0cmVhbVtBRVNfQkxPQ0tfU0laRV07CisgICAgaW50IGtleVN0cmVhbUluZGV4OworICAgIHVuc2lnbmVkIGNoYXIgY2g7CisgICAgc2l6ZV90IG91dHB1dEJ1ZmZlclNpemU7CisgICAgc2l6ZV90IGRhdGFPZmZzZXQ7CisgICAgc2l6ZV90IG51bURhdGFCeXRlczsKK30gRndkTG9ja0NvbnZfU2Vzc2lvbl90OworCitzdGF0aWMgRndkTG9ja0NvbnZfU2Vzc2lvbl90ICpzZXNzaW9uUHRyc1tNQVhfTlVNX1NFU1NJT05TXSA9IHsgTlVMTCB9OworCitzdGF0aWMgcHRocmVhZF9tdXRleF90IHNlc3Npb25BY3F1aXNpdGlvbk11dGV4ID0gUFRIUkVBRF9NVVRFWF9JTklUSUFMSVpFUjsKKworc3RhdGljIGNvbnN0IEZ3ZExvY2tDb252X1N0cmluZ190IG51bGxTdHJpbmcgPSB7IE5VTEwsIDAsIDAsIFNUUklOR19MRU5HVEhfSU5DUkVNRU5UIH07CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHRvcEhlYWRlclRlbXBsYXRlW10gPQorICAgIHsgJ0YnLCAnVycsICdMJywgJ0snLCBGV0RfTE9DS19WRVJTSU9OLCBGV0RfTE9DS19TVUJGT1JNQVQsIFVTQUdFX1JFU1RSSUNUSU9OX0ZMQUdTIH07CisKK3N0YXRpYyBjb25zdCBjaGFyIHN0ckNvbnRlbnRbXSA9ICJjb250ZW50LSI7CitzdGF0aWMgY29uc3QgY2hhciBzdHJUeXBlW10gPSAidHlwZSI7CitzdGF0aWMgY29uc3QgY2hhciBzdHJUcmFuc2ZlckVuY29kaW5nW10gPSAidHJhbnNmZXItZW5jb2RpbmciOworc3RhdGljIGNvbnN0IGNoYXIgc3RyVGV4dFBsYWluW10gPSAidGV4dC9wbGFpbiI7CitzdGF0aWMgY29uc3QgY2hhciBzdHJBcHBsaWNhdGlvblZuZE9tYURybVJpZ2h0c1htbFtdID0gImFwcGxpY2F0aW9uL3ZuZC5vbWEuZHJtLnJpZ2h0cyt4bWwiOworc3RhdGljIGNvbnN0IGNoYXIgc3RyQXBwbGljYXRpb25WbmRPbWFEcm1Db250ZW50W10gPSAiYXBwbGljYXRpb24vdm5kLm9tYS5kcm0uY29udGVudCI7CisKK3N0YXRpYyBjb25zdCBzaXplX3Qgc3RybGVuQ29udGVudCA9IHNpemVvZiBzdHJDb250ZW50IC0gMTsKK3N0YXRpYyBjb25zdCBzaXplX3Qgc3RybGVuVGV4dFBsYWluID0gc2l6ZW9mIHN0clRleHRQbGFpbiAtIDE7CisKK3N0YXRpYyBjb25zdCBzaWduZWQgY2hhciBiYXNlNjRWYWx1ZXNbXSA9IHsKKyAgICAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKyAgICAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKyAgICAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIDYyLCAtMSwgLTEsIC0xLCA2MywKKyAgICA1MiwgNTMsIDU0LCA1NSwgNTYsIDU3LCA1OCwgNTksIDYwLCA2MSwgLTEsIC0xLCAtMSwgLTIsIC0xLCAtMSwKKyAgICAtMSwgIDAsICAxLCAgMiwgIDMsICA0LCAgNSwgIDYsICA3LCAgOCwgIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwKKyAgICAxNSwgMTYsIDE3LCAxOCwgMTksIDIwLCAyMSwgMjIsIDIzLCAyNCwgMjUsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKyAgICAtMSwgMjYsIDI3LCAyOCwgMjksIDMwLCAzMSwgMzIsIDMzLCAzNCwgMzUsIDM2LCAzNywgMzgsIDM5LCA0MCwKKyAgICA0MSwgNDIsIDQzLCA0NCwgNDUsIDQ2LCA0NywgNDgsIDQ5LCA1MCwgNTEKK307CisKKy8qKgorICogQWNxdWlyZXMgYW4gdW51c2VkIGNvbnZlcnRlciBzZXNzaW9uLgorICoKKyAqIEByZXR1cm4gQSBzZXNzaW9uIElELgorICovCitzdGF0aWMgaW50IEZ3ZExvY2tDb252X0FjcXVpcmVTZXNzaW9uKCkgeworICAgIGludCBzZXNzaW9uSWQgPSAtMTsKKyAgICBpbnQgaTsKKyAgICBwdGhyZWFkX211dGV4X2xvY2soJnNlc3Npb25BY3F1aXNpdGlvbk11dGV4KTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX05VTV9TRVNTSU9OUzsgKytpKSB7CisgICAgICAgIGlmIChzZXNzaW9uUHRyc1tpXSA9PSBOVUxMKSB7CisgICAgICAgICAgICBzZXNzaW9uUHRyc1tpXSA9IG1hbGxvYyhzaXplb2YgKnNlc3Npb25QdHJzW2ldKTsKKyAgICAgICAgICAgIGlmIChzZXNzaW9uUHRyc1tpXSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgc2Vzc2lvbklkID0gaTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZzZXNzaW9uQWNxdWlzaXRpb25NdXRleCk7CisgICAgcmV0dXJuIHNlc3Npb25JZDsKK30KKworLyoqCisgKiBDaGVja3Mgd2hldGhlciBhIHNlc3Npb24gSUQgaXMgaW4gcmFuZ2UgYW5kIGN1cnJlbnRseSBpbiB1c2UuCisgKgorICogQHBhcmFtW2luXSBzZXNzaW9uSUQgQSBzZXNzaW9uIElELgorICoKKyAqIEByZXR1cm4gQSBCb29sZWFuIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0aGUgc2Vzc2lvbiBJRCBpcyBpbiByYW5nZSBhbmQgY3VycmVudGx5IGluIHVzZS4KKyAqLworc3RhdGljIGludCBGd2RMb2NrQ29udl9Jc1ZhbGlkU2Vzc2lvbihpbnQgc2Vzc2lvbklkKSB7CisgICAgcmV0dXJuIDAgPD0gc2Vzc2lvbklkICYmIHNlc3Npb25JZCA8IE1BWF9OVU1fU0VTU0lPTlMgJiYgc2Vzc2lvblB0cnNbc2Vzc2lvbklkXSAhPSBOVUxMOworfQorCisvKioKKyAqIFJlbGVhc2VzIGEgY29udmVydGVyIHNlc3Npb24uCisgKgorICogQHBhcmFtW2luXSBzZXNzaW9uSUQgQSBzZXNzaW9uIElELgorICovCitzdGF0aWMgdm9pZCBGd2RMb2NrQ29udl9SZWxlYXNlU2Vzc2lvbihpbnQgc2Vzc2lvbklkKSB7CisgICAgcHRocmVhZF9tdXRleF9sb2NrKCZzZXNzaW9uQWNxdWlzaXRpb25NdXRleCk7CisgICAgYXNzZXJ0KEZ3ZExvY2tDb252X0lzVmFsaWRTZXNzaW9uKHNlc3Npb25JZCkpOworICAgIG1lbXNldChzZXNzaW9uUHRyc1tzZXNzaW9uSWRdLCAwLCBzaXplb2YgKnNlc3Npb25QdHJzW3Nlc3Npb25JZF0pOyAvLyBaZXJvIG91dCBrZXkgZGF0YS4KKyAgICBmcmVlKHNlc3Npb25QdHJzW3Nlc3Npb25JZF0pOworICAgIHNlc3Npb25QdHJzW3Nlc3Npb25JZF0gPSBOVUxMOworICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZzZXNzaW9uQWNxdWlzaXRpb25NdXRleCk7Cit9CisKKy8qKgorICogRGVyaXZlcyBjcnlwdG9ncmFwaGljYWxseSBpbmRlcGVuZGVudCBrZXlzIGZvciBlbmNyeXB0aW9uIGFuZCBzaWduaW5nIGZyb20gdGhlIHNlc3Npb24ga2V5LgorICoKKyAqIEBwYXJhbVtpbixvdXRdIHBTZXNzaW9uIEEgcmVmZXJlbmNlIHRvIGEgY29udmVydGVyIHNlc3Npb24uCisgKgorICogQHJldHVybiBBIHN0YXR1cyBjb2RlLgorICovCitzdGF0aWMgaW50IEZ3ZExvY2tDb252X0Rlcml2ZUtleXMoRndkTG9ja0NvbnZfU2Vzc2lvbl90ICpwU2Vzc2lvbikgeworICAgIEZ3ZExvY2tDb252X1N0YXR1c190IHN0YXR1czsKKyAgICBzdHJ1Y3QgRndkTG9ja0NvbnZfRGVyaXZlS2V5c19EYXRhIHsKKyAgICAgICAgQUVTX0tFWSBzZXNzaW9uUm91bmRLZXlzOworICAgICAgICB1bnNpZ25lZCBjaGFyIHZhbHVlW0tFWV9TSVpFXTsKKyAgICAgICAgdW5zaWduZWQgY2hhciBrZXlbS0VZX1NJWkVdOworICAgIH0gKnBEYXRhID0gbWFsbG9jKHNpemVvZiAqcERhdGEpOworICAgIGlmIChwRGF0YSA9PSBOVUxMKSB7CisgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19PdXRPZk1lbW9yeTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoQUVTX3NldF9lbmNyeXB0X2tleShwU2Vzc2lvbi0+c2Vzc2lvbktleSwgS0VZX1NJWkVfSU5fQklUUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBEYXRhLT5zZXNzaW9uUm91bmRLZXlzKSAhPSAwKSB7CisgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfUHJvZ3JhbUVycm9yOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gRW5jcnlwdCB0aGUgMTYtYnl0ZSB2YWx1ZSB7MCwgMCwgLi4uLCAwfSB0byBwcm9kdWNlIHRoZSBlbmNyeXB0aW9uIGtleS4KKyAgICAgICAgICAgIG1lbXNldChwRGF0YS0+dmFsdWUsIDAsIEtFWV9TSVpFKTsKKyAgICAgICAgICAgIEFFU19lbmNyeXB0KHBEYXRhLT52YWx1ZSwgcERhdGEtPmtleSwgJnBEYXRhLT5zZXNzaW9uUm91bmRLZXlzKTsKKyAgICAgICAgICAgIGlmIChBRVNfc2V0X2VuY3J5cHRfa2V5KHBEYXRhLT5rZXksIEtFWV9TSVpFX0lOX0JJVFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcFNlc3Npb24tPmVuY3J5cHRpb25Sb3VuZEtleXMpICE9IDApIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfUHJvZ3JhbUVycm9yOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBFbmNyeXB0IHRoZSAxNi1ieXRlIHZhbHVlIHsxLCAwLCAuLi4sIDB9IHRvIHByb2R1Y2UgdGhlIHNpZ25pbmcga2V5LgorICAgICAgICAgICAgICAgICsrcERhdGEtPnZhbHVlWzBdOworICAgICAgICAgICAgICAgIEFFU19lbmNyeXB0KHBEYXRhLT52YWx1ZSwgcERhdGEtPmtleSwgJnBEYXRhLT5zZXNzaW9uUm91bmRLZXlzKTsKKyAgICAgICAgICAgICAgICBITUFDX0NUWF9pbml0KCZwU2Vzc2lvbi0+c2lnbmluZ0NvbnRleHQpOworICAgICAgICAgICAgICAgIEhNQUNfSW5pdF9leCgmcFNlc3Npb24tPnNpZ25pbmdDb250ZXh0LCBwRGF0YS0+a2V5LCBLRVlfU0laRSwgRVZQX3NoYTEoKSwgTlVMTCk7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX09LOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1lbXNldChwRGF0YSwgMCwgc2l6ZW9mIHBEYXRhKTsgLy8gWmVybyBvdXQga2V5IGRhdGEuCisgICAgICAgIGZyZWUocERhdGEpOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAqIENoZWNrcyB3aGV0aGVyIGEgZ2l2ZW4gY2hhcmFjdGVyIGlzIHZhbGlkIGluIGEgYm91bmRhcnkuIE5vdGUgdGhhdCB0aGUgYm91bmRhcnkgbWF5IGNvbnRhaW4KKyAqIGxlYWRpbmcgYW5kIGludGVybmFsIHNwYWNlcy4KKyAqCisgKiBAcGFyYW1baW5dIGNoIFRoZSBjaGFyYWN0ZXIgdG8gY2hlY2suCisgKgorICogQHJldHVybiBBIEJvb2xlYW4gdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBnaXZlbiBjaGFyYWN0ZXIgaXMgdmFsaWQgaW4gYSBib3VuZGFyeS4KKyAqLworc3RhdGljIGludCBGd2RMb2NrQ29udl9Jc0JvdW5kYXJ5Q2hhcihpbnQgY2gpIHsKKyAgICByZXR1cm4gaXNhbG51bShjaCkgfHwgY2ggPT0gJ1wnJyB8fAorICAgICAgICAgICAgY2ggPT0gJygnIHx8IGNoID09ICcpJyB8fCBjaCA9PSAnKycgfHwgY2ggPT0gJ18nIHx8IGNoID09ICcsJyB8fCBjaCA9PSAnLScgfHwKKyAgICAgICAgICAgIGNoID09ICcuJyB8fCBjaCA9PSAnLycgfHwgY2ggPT0gJzonIHx8IGNoID09ICc9JyB8fCBjaCA9PSAnPycgfHwgY2ggPT0gJyAnOworfQorCisvKioKKyAqIENoZWNrcyB3aGV0aGVyIGEgZ2l2ZW4gY2hhcmFjdGVyIHNob3VsZCBiZSBjb25zaWRlcmVkIHdoaXRlc3BhY2UsIHVzaW5nIGEgbmFycm93ZXIgZGVmaW5pdGlvbgorICogdGhhbiB0aGUgc3RhbmRhcmQtbGlicmFyeSBpc3NwYWNlKCkgZnVuY3Rpb24uCisgKgorICogQHBhcmFtW2luXSBjaCBUaGUgY2hhcmFjdGVyIHRvIGNoZWNrLgorICoKKyAqIEByZXR1cm4gQSBCb29sZWFuIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0aGUgZ2l2ZW4gY2hhcmFjdGVyIHNob3VsZCBiZSBjb25zaWRlcmVkIHdoaXRlc3BhY2UuCisgKi8KK3N0YXRpYyBpbnQgRndkTG9ja0NvbnZfSXNXaGl0ZXNwYWNlKGludCBjaCkgeworICAgIHJldHVybiBjaCA9PSAnICcgfHwgY2ggPT0gJ1x0JzsKK30KKworLyoqCisgKiBSZW1vdmVzIHRyYWlsaW5nIHNwYWNlcyBmcm9tIHRoZSBkZWxpbWl0ZXIuCisgKgorICogQHBhcmFtW2luLG91dF0gcFNlc3Npb24gQSByZWZlcmVuY2UgdG8gYSBjb252ZXJ0ZXIgc2Vzc2lvbi4KKyAqCisgKiBAcmV0dXJuIEEgc3RhdHVzIGNvZGUuCisgKi8KK3N0YXRpYyBGd2RMb2NrQ29udl9TdGF0dXNfdCBGd2RMb2NrQ29udl9SaWdodFRyaW1EZWxpbWl0ZXIoRndkTG9ja0NvbnZfU2Vzc2lvbl90ICpwU2Vzc2lvbikgeworICAgIHdoaWxlIChwU2Vzc2lvbi0+ZGVsaW1pdGVyTGVuZ3RoID4gNCAmJgorICAgICAgICAgICBwU2Vzc2lvbi0+ZGVsaW1pdGVyW3BTZXNzaW9uLT5kZWxpbWl0ZXJMZW5ndGggLSAxXSA9PSAnICcpIHsKKyAgICAgICAgLS1wU2Vzc2lvbi0+ZGVsaW1pdGVyTGVuZ3RoOworICAgIH0KKyAgICBpZiAocFNlc3Npb24tPmRlbGltaXRlckxlbmd0aCA+IDQpIHsKKyAgICAgICAgcmV0dXJuIEZ3ZExvY2tDb252X1N0YXR1c19PSzsKKyAgICB9CisgICAgcmV0dXJuIEZ3ZExvY2tDb252X1N0YXR1c19TeW50YXhFcnJvcjsKK30KKworLyoqCisgKiBNYXRjaGVzIHRoZSBvcGVuIGRlbGltaXRlci4KKyAqCisgKiBAcGFyYW1baW4sb3V0XSBwU2Vzc2lvbiBBIHJlZmVyZW5jZSB0byBhIGNvbnZlcnRlciBzZXNzaW9uLgorICogQHBhcmFtW2luXSBjaCBBIGNoYXJhY3Rlci4KKyAqCisgKiBAcmV0dXJuIEEgc3RhdHVzIGNvZGUuCisgKi8KK3N0YXRpYyBGd2RMb2NrQ29udl9TdGF0dXNfdCBGd2RMb2NrQ29udl9NYXRjaE9wZW5EZWxpbWl0ZXIoRndkTG9ja0NvbnZfU2Vzc2lvbl90ICpwU2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNoKSB7CisgICAgRndkTG9ja0NvbnZfU3RhdHVzX3Qgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX09LOworICAgIHN3aXRjaCAocFNlc3Npb24tPnNjYW5uZXJTdGF0ZSkgeworICAgIGNhc2UgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzRmlyc3REYXNoOgorICAgICAgICBpZiAoY2ggPT0gJy0nKSB7CisgICAgICAgICAgICBwU2Vzc2lvbi0+c2Nhbm5lclN0YXRlID0gRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzU2Vjb25kRGFzaDsKKyAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnXHInKSB7CisgICAgICAgICAgICBwU2Vzc2lvbi0+c2Nhbm5lclN0YXRlID0gRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzTEY7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwU2Vzc2lvbi0+c2Nhbm5lclN0YXRlID0gRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzQ1I7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNTZWNvbmREYXNoOgorICAgICAgICBpZiAoY2ggPT0gJy0nKSB7CisgICAgICAgICAgICAvLyBUaGUgZGVsaW1pdGVyIHN0YXJ0cyB3aXRoICJcclxuLS0iICh0aGUgb3BlbiBkZWxpbWl0ZXIgbWF5IG9taXQgdGhlIGluaXRpYWwgIlxyXG4iKS4KKyAgICAgICAgICAgIC8vIFRoZSByZXN0IGlzIHRoZSB1c2VyLWRlZmluZWQgYm91bmRhcnkgdGhhdCBzaG91bGQgY29tZSBuZXh0LgorICAgICAgICAgICAgcFNlc3Npb24tPmRlbGltaXRlclswXSA9ICdccic7CisgICAgICAgICAgICBwU2Vzc2lvbi0+ZGVsaW1pdGVyWzFdID0gJ1xuJzsKKyAgICAgICAgICAgIHBTZXNzaW9uLT5kZWxpbWl0ZXJbMl0gPSAnLSc7CisgICAgICAgICAgICBwU2Vzc2lvbi0+ZGVsaW1pdGVyWzNdID0gJy0nOworICAgICAgICAgICAgcFNlc3Npb24tPmRlbGltaXRlckxlbmd0aCA9IDQ7CisgICAgICAgICAgICBwU2Vzc2lvbi0+c2Nhbm5lclN0YXRlID0gRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzQm91bmRhcnk7CisgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJ1xyJykgeworICAgICAgICAgICAgcFNlc3Npb24tPnNjYW5uZXJTdGF0ZSA9IEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c0xGOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcFNlc3Npb24tPnNjYW5uZXJTdGF0ZSA9IEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c0NSOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzQ1I6CisgICAgICAgIGlmIChjaCA9PSAnXHInKSB7CisgICAgICAgICAgICBwU2Vzc2lvbi0+c2Nhbm5lclN0YXRlID0gRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzTEY7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNMRjoKKyAgICAgICAgaWYgKGNoID09ICdcbicpIHsKKyAgICAgICAgICAgIHBTZXNzaW9uLT5zY2FubmVyU3RhdGUgPSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNGaXJzdERhc2g7CisgICAgICAgIH0gZWxzZSBpZiAoY2ggIT0gJ1xyJykgeworICAgICAgICAgICAgcFNlc3Npb24tPnNjYW5uZXJTdGF0ZSA9IEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c0NSOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzQm91bmRhcnk6CisgICAgICAgIGlmIChGd2RMb2NrQ29udl9Jc0JvdW5kYXJ5Q2hhcihjaCkpIHsKKyAgICAgICAgICAgIC8vIFRoZSBib3VuZGFyeSBtYXkgY29udGFpbiBsZWFkaW5nIGFuZCBpbnRlcm5hbCBzcGFjZXMsIHNvIHRyYWlsaW5nIHNwYWNlcyB3aWxsIGFsc28gYmUKKyAgICAgICAgICAgIC8vIG1hdGNoZWQgaGVyZS4gVGhlc2Ugd2lsbCBiZSByZW1vdmVkIGxhdGVyLgorICAgICAgICAgICAgaWYgKHBTZXNzaW9uLT5kZWxpbWl0ZXJMZW5ndGggPCBNQVhfREVMSU1JVEVSX0xFTkdUSCkgeworICAgICAgICAgICAgICAgIHBTZXNzaW9uLT5kZWxpbWl0ZXJbcFNlc3Npb24tPmRlbGltaXRlckxlbmd0aCsrXSA9IGNoOworICAgICAgICAgICAgfSBlbHNlIGlmIChjaCAhPSAnICcpIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfU3ludGF4RXJyb3I7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJ1xyJykgeworICAgICAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfUmlnaHRUcmltRGVsaW1pdGVyKHBTZXNzaW9uKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gRndkTG9ja0NvbnZfU3RhdHVzX09LKSB7CisgICAgICAgICAgICAgICAgcFNlc3Npb24tPnNjYW5uZXJTdGF0ZSA9IEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c0JvdW5kYXJ5RW5kOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGNoID09ICdcdCcpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1JpZ2h0VHJpbURlbGltaXRlcihwU2Vzc2lvbik7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IEZ3ZExvY2tDb252X1N0YXR1c19PSykgeworICAgICAgICAgICAgICAgIHBTZXNzaW9uLT5zY2FubmVyU3RhdGUgPSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNXaGl0ZXNwYWNlOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX1N5bnRheEVycm9yOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzV2hpdGVzcGFjZToKKyAgICAgICAgaWYgKGNoID09ICdccicpIHsKKyAgICAgICAgICAgIHBTZXNzaW9uLT5zY2FubmVyU3RhdGUgPSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNCb3VuZGFyeUVuZDsKKyAgICAgICAgfSBlbHNlIGlmICghRndkTG9ja0NvbnZfSXNXaGl0ZXNwYWNlKGNoKSkgeworICAgICAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX1N5bnRheEVycm9yOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzQm91bmRhcnlFbmQ6CisgICAgICAgIGlmIChjaCA9PSAnXG4nKSB7CisgICAgICAgICAgICBwU2Vzc2lvbi0+cGFyc2VyU3RhdGUgPSBGd2RMb2NrQ29udl9QYXJzZXJTdGF0ZV9XYW50c01pbWVIZWFkZXJzOworICAgICAgICAgICAgcFNlc3Npb24tPnNjYW5uZXJTdGF0ZSA9IEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c01pbWVIZWFkZXJOYW1lU3RhcnQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfU3ludGF4RXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX1Byb2dyYW1FcnJvcjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICogQ2hlY2tzIHdoZXRoZXIgYSBnaXZlbiBjaGFyYWN0ZXIgaXMgdmFsaWQgaW4gYSBNSU1FIGhlYWRlciBuYW1lLgorICoKKyAqIEBwYXJhbVtpbl0gY2ggVGhlIGNoYXJhY3RlciB0byBjaGVjay4KKyAqCisgKiBAcmV0dXJuIEEgQm9vbGVhbiB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGdpdmVuIGNoYXJhY3RlciBpcyB2YWxpZCBpbiBhIE1JTUUgaGVhZGVyIG5hbWUuCisgKi8KK3N0YXRpYyBpbnQgRndkTG9ja0NvbnZfSXNNaW1lSGVhZGVyTmFtZUNoYXIoaW50IGNoKSB7CisgICAgcmV0dXJuIGlzZ3JhcGgoY2gpICYmIGNoICE9ICc6JzsKK30KKworLyoqCisgKiBDaGVja3Mgd2hldGhlciBhIGdpdmVuIGNoYXJhY3RlciBpcyB2YWxpZCBpbiBhIE1JTUUgaGVhZGVyIHZhbHVlLgorICoKKyAqIEBwYXJhbVtpbl0gY2ggVGhlIGNoYXJhY3RlciB0byBjaGVjay4KKyAqCisgKiBAcmV0dXJuIEEgQm9vbGVhbiB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGdpdmVuIGNoYXJhY3RlciBpcyB2YWxpZCBpbiBhIE1JTUUgaGVhZGVyIHZhbHVlLgorICovCitzdGF0aWMgaW50IEZ3ZExvY2tDb252X0lzTWltZUhlYWRlclZhbHVlQ2hhcihpbnQgY2gpIHsKKyAgICByZXR1cm4gaXNncmFwaChjaCkgJiYgY2ggIT0gJzsnOworfQorCisvKioKKyAqIEFwcGVuZHMgYSBjaGFyYWN0ZXIgdG8gdGhlIHNwZWNpZmllZCBkeW5hbWljYWxseSBncm93aW5nIHN0cmluZy4KKyAqCisgKiBAcGFyYW1baW4sb3V0XSBwU3RyaW5nIEEgcmVmZXJlbmNlIHRvIGEgZHluYW1pY2FsbHkgZ3Jvd2luZyBzdHJpbmcuCisgKiBAcGFyYW1baW5dIGNoIFRoZSBjaGFyYWN0ZXIgdG8gYXBwZW5kLgorICoKKyAqIEByZXR1cm4gQSBzdGF0dXMgY29kZS4KKyAqLworc3RhdGljIEZ3ZExvY2tDb252X1N0YXR1c190IEZ3ZExvY2tDb252X1N0cmluZ0FwcGVuZChGd2RMb2NrQ29udl9TdHJpbmdfdCAqcFN0cmluZywgaW50IGNoKSB7CisgICAgaWYgKHBTdHJpbmctPmxlbmd0aCA9PSBwU3RyaW5nLT5tYXhMZW5ndGgpIHsKKyAgICAgICAgc2l6ZV90IG5ld01heExlbmd0aCA9IHBTdHJpbmctPm1heExlbmd0aCArIHBTdHJpbmctPmxlbmd0aEluY3JlbWVudDsKKyAgICAgICAgY2hhciAqbmV3UHRyID0gcmVhbGxvYyhwU3RyaW5nLT5wdHIsIG5ld01heExlbmd0aCArIDEpOworICAgICAgICBpZiAobmV3UHRyID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBGd2RMb2NrQ29udl9TdGF0dXNfT3V0T2ZNZW1vcnk7CisgICAgICAgIH0KKyAgICAgICAgcFN0cmluZy0+cHRyID0gbmV3UHRyOworICAgICAgICBwU3RyaW5nLT5tYXhMZW5ndGggPSBuZXdNYXhMZW5ndGg7CisgICAgfQorICAgIHBTdHJpbmctPnB0cltwU3RyaW5nLT5sZW5ndGgrK10gPSBjaDsKKyAgICBwU3RyaW5nLT5wdHJbcFN0cmluZy0+bGVuZ3RoXSA9ICdcMCc7CisgICAgcmV0dXJuIEZ3ZExvY2tDb252X1N0YXR1c19PSzsKK30KKworLyoqCisgKiBBdHRlbXB0cyB0byByZWNvZ25pemUgdGhlIE1JTUUgaGVhZGVyIG5hbWUgYW5kIGNoYW5nZXMgdGhlIHNjYW5uZXIgc3RhdGUgYWNjb3JkaW5nbHkuCisgKgorICogQHBhcmFtW2luLG91dF0gcFNlc3Npb24gQSByZWZlcmVuY2UgdG8gYSBjb252ZXJ0ZXIgc2Vzc2lvbi4KKyAqCisgKiBAcmV0dXJuIEEgc3RhdHVzIGNvZGUuCisgKi8KK3N0YXRpYyBGd2RMb2NrQ29udl9TdGF0dXNfdCBGd2RMb2NrQ29udl9SZWNvZ25pemVNaW1lSGVhZGVyTmFtZShGd2RMb2NrQ29udl9TZXNzaW9uX3QgKnBTZXNzaW9uKSB7CisgICAgRndkTG9ja0NvbnZfU3RhdHVzX3Qgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX09LOworICAgIGlmIChzdHJuY21wKHBTZXNzaW9uLT5taW1lSGVhZGVyTmFtZS5wdHIsIHN0ckNvbnRlbnQsIHN0cmxlbkNvbnRlbnQpID09IDApIHsKKyAgICAgICAgaWYgKHN0cmNtcChwU2Vzc2lvbi0+bWltZUhlYWRlck5hbWUucHRyICsgc3RybGVuQ29udGVudCwgc3RyVHlwZSkgPT0gMCkgeworICAgICAgICAgICAgaWYgKHBTZXNzaW9uLT5jb250ZW50VHlwZS5wdHIgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHBTZXNzaW9uLT5zY2FubmVyU3RhdGUgPSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNDb250ZW50VHlwZVN0YXJ0OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfU3ludGF4RXJyb3I7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKHBTZXNzaW9uLT5taW1lSGVhZGVyTmFtZS5wdHIgKyBzdHJsZW5Db250ZW50LCBzdHJUcmFuc2ZlckVuY29kaW5nKSA9PSAwKSB7CisgICAgICAgICAgICBpZiAocFNlc3Npb24tPmNvbnRlbnRUcmFuc2ZlckVuY29kaW5nID09CisgICAgICAgICAgICAgICAgICAgIEZ3ZExvY2tDb252X0NvbnRlbnRUcmFuc2ZlckVuY29kaW5nX1VuZGVmaW5lZCkgeworICAgICAgICAgICAgICAgIHBTZXNzaW9uLT5zY2FubmVyU3RhdGUgPSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNDb250ZW50VHJhbnNmZXJFbmNvZGluZ1N0YXJ0OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfU3ludGF4RXJyb3I7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwU2Vzc2lvbi0+c2Nhbm5lclN0YXRlID0gRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzQ1I7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBwU2Vzc2lvbi0+c2Nhbm5lclN0YXRlID0gRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzQ1I7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICogQXBwbGllcyBkZWZhdWx0cyB0byBtaXNzaW5nIE1JTUUgaGVhZGVyIHZhbHVlcy4KKyAqCisgKiBAcGFyYW1baW4sb3V0XSBwU2Vzc2lvbiBBIHJlZmVyZW5jZSB0byBhIGNvbnZlcnRlciBzZXNzaW9uLgorICoKKyAqIEByZXR1cm4gQSBzdGF0dXMgY29kZS4KKyAqLworc3RhdGljIEZ3ZExvY2tDb252X1N0YXR1c190IEZ3ZExvY2tDb252X0FwcGx5RGVmYXVsdHMoRndkTG9ja0NvbnZfU2Vzc2lvbl90ICpwU2Vzc2lvbikgeworICAgIGlmIChwU2Vzc2lvbi0+Y29udGVudFR5cGUucHRyID09IE5VTEwpIHsKKyAgICAgICAgLy8gQ29udGVudCB0eXBlIGlzIG1pc3Npbmc6IGRlZmF1bHQgdG8gInRleHQvcGxhaW4iLgorICAgICAgICBwU2Vzc2lvbi0+Y29udGVudFR5cGUucHRyID0gbWFsbG9jKHNpemVvZiBzdHJUZXh0UGxhaW4pOworICAgICAgICBpZiAocFNlc3Npb24tPmNvbnRlbnRUeXBlLnB0ciA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gRndkTG9ja0NvbnZfU3RhdHVzX091dE9mTWVtb3J5OworICAgICAgICB9CisgICAgICAgIG1lbWNweShwU2Vzc2lvbi0+Y29udGVudFR5cGUucHRyLCBzdHJUZXh0UGxhaW4sIHNpemVvZiBzdHJUZXh0UGxhaW4pOworICAgICAgICBwU2Vzc2lvbi0+Y29udGVudFR5cGUubGVuZ3RoID0gc3RybGVuVGV4dFBsYWluOworICAgICAgICBwU2Vzc2lvbi0+Y29udGVudFR5cGUubWF4TGVuZ3RoID0gc3RybGVuVGV4dFBsYWluOworICAgIH0KKyAgICBpZiAocFNlc3Npb24tPmNvbnRlbnRUcmFuc2ZlckVuY29kaW5nID09IEZ3ZExvY2tDb252X0NvbnRlbnRUcmFuc2ZlckVuY29kaW5nX1VuZGVmaW5lZCkgeworICAgICAgICAvLyBDb250ZW50IHRyYW5zZmVyIGVuY29kaW5nIGlzIG1pc3Npbmc6IGRlZmF1bHQgdG8gYmluYXJ5LgorICAgICAgICBwU2Vzc2lvbi0+Y29udGVudFRyYW5zZmVyRW5jb2RpbmcgPSBGd2RMb2NrQ29udl9Db250ZW50VHJhbnNmZXJFbmNvZGluZ19CaW5hcnk7CisgICAgfQorICAgIHJldHVybiBGd2RMb2NrQ29udl9TdGF0dXNfT0s7Cit9CisKKy8qKgorICogVmVyaWZpZXMgdGhhdCB0aGUgY29udGVudCB0eXBlIGlzIHN1cHBvcnRlZC4KKyAqCisgKiBAcGFyYW1baW4sb3V0XSBwU2Vzc2lvbiBBIHJlZmVyZW5jZSB0byBhIGNvbnZlcnRlciBzZXNzaW9uLgorICoKKyAqIEByZXR1cm4gQSBzdGF0dXMgY29kZS4KKyAqLworc3RhdGljIEZ3ZExvY2tDb252X1N0YXR1c190IEZ3ZExvY2tDb252X1ZlcmlmeUNvbnRlbnRUeXBlKEZ3ZExvY2tDb252X1Nlc3Npb25fdCAqcFNlc3Npb24pIHsKKyAgICBGd2RMb2NrQ29udl9TdGF0dXNfdCBzdGF0dXM7CisgICAgaWYgKHBTZXNzaW9uLT5jb250ZW50VHlwZS5wdHIgPT0gTlVMTCkgeworICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfUHJvZ3JhbUVycm9yOworICAgIH0gZWxzZSBpZiAoc3RyY21wKHBTZXNzaW9uLT5jb250ZW50VHlwZS5wdHIsIHN0ckFwcGxpY2F0aW9uVm5kT21hRHJtUmlnaHRzWG1sKSA9PSAwIHx8CisgICAgICAgICAgICAgICBzdHJjbXAocFNlc3Npb24tPmNvbnRlbnRUeXBlLnB0ciwgc3RyQXBwbGljYXRpb25WbmRPbWFEcm1Db250ZW50KSA9PSAwKSB7CisgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19VbnN1cHBvcnRlZEZpbGVGb3JtYXQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX09LOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAqIFdyaXRlcyB0aGUgaGVhZGVyIG9mIHRoZSBvdXRwdXQgZmlsZS4KKyAqCisgKiBAcGFyYW1baW4sb3V0XSBwU2Vzc2lvbiBBIHJlZmVyZW5jZSB0byBhIGNvbnZlcnRlciBzZXNzaW9uLgorICogQHBhcmFtW291dF0gcE91dHB1dCBUaGUgb3V0cHV0IGZyb20gdGhlIGNvbnZlcnNpb24gcHJvY2Vzcy4KKyAqCisgKiBAcmV0dXJuIEEgc3RhdHVzIGNvZGUuCisgKi8KK3N0YXRpYyBGd2RMb2NrQ29udl9TdGF0dXNfdCBGd2RMb2NrQ29udl9Xcml0ZUhlYWRlcihGd2RMb2NrQ29udl9TZXNzaW9uX3QgKnBTZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZ3ZExvY2tDb252X091dHB1dF90ICpwT3V0cHV0KSB7CisgICAgRndkTG9ja0NvbnZfU3RhdHVzX3Qgc3RhdHVzOworICAgIGlmIChwU2Vzc2lvbi0+Y29udGVudFR5cGUubGVuZ3RoID4gVUNIQVJfTUFYKSB7CisgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19TeW50YXhFcnJvcjsKKyAgICB9IGVsc2UgeworICAgICAgICBwU2Vzc2lvbi0+b3V0cHV0QnVmZmVyU2l6ZSA9IE9VVFBVVF9CVUZGRVJfU0laRV9JTkNSRU1FTlQ7CisgICAgICAgIHBPdXRwdXQtPmZyb21Db252ZXJ0RGF0YS5wQnVmZmVyID0gbWFsbG9jKHBTZXNzaW9uLT5vdXRwdXRCdWZmZXJTaXplKTsKKyAgICAgICAgaWYgKHBPdXRwdXQtPmZyb21Db252ZXJ0RGF0YS5wQnVmZmVyID09IE5VTEwpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19PdXRPZk1lbW9yeTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNpemVfdCBlbmNyeXB0ZWRTZXNzaW9uS2V5UG9zID0gVE9QX0hFQURFUl9TSVpFICsgcFNlc3Npb24tPmNvbnRlbnRUeXBlLmxlbmd0aDsKKyAgICAgICAgICAgIHNpemVfdCBkYXRhU2lnbmF0dXJlUG9zID0gZW5jcnlwdGVkU2Vzc2lvbktleVBvcyArIHBTZXNzaW9uLT5lbmNyeXB0ZWRTZXNzaW9uS2V5TGVuZ3RoOworICAgICAgICAgICAgc2l6ZV90IGhlYWRlclNpZ25hdHVyZVBvcyA9IGRhdGFTaWduYXR1cmVQb3MgKyBTSEExX0hBU0hfU0laRTsKKyAgICAgICAgICAgIHBTZXNzaW9uLT5kYXRhT2Zmc2V0ID0gaGVhZGVyU2lnbmF0dXJlUG9zICsgU0hBMV9IQVNIX1NJWkU7CisgICAgICAgICAgICBtZW1jcHkocFNlc3Npb24tPnRvcEhlYWRlciwgdG9wSGVhZGVyVGVtcGxhdGUsIHNpemVvZiB0b3BIZWFkZXJUZW1wbGF0ZSk7CisgICAgICAgICAgICBwU2Vzc2lvbi0+dG9wSGVhZGVyW0NPTlRFTlRfVFlQRV9MRU5HVEhfUE9TXSA9CisgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBjaGFyKXBTZXNzaW9uLT5jb250ZW50VHlwZS5sZW5ndGg7CisgICAgICAgICAgICBtZW1jcHkocE91dHB1dC0+ZnJvbUNvbnZlcnREYXRhLnBCdWZmZXIsIHBTZXNzaW9uLT50b3BIZWFkZXIsIFRPUF9IRUFERVJfU0laRSk7CisgICAgICAgICAgICBtZW1jcHkoKGNoYXIgKilwT3V0cHV0LT5mcm9tQ29udmVydERhdGEucEJ1ZmZlciArIFRPUF9IRUFERVJfU0laRSwKKyAgICAgICAgICAgICAgICAgICBwU2Vzc2lvbi0+Y29udGVudFR5cGUucHRyLCBwU2Vzc2lvbi0+Y29udGVudFR5cGUubGVuZ3RoKTsKKyAgICAgICAgICAgIG1lbWNweSgoY2hhciAqKXBPdXRwdXQtPmZyb21Db252ZXJ0RGF0YS5wQnVmZmVyICsgZW5jcnlwdGVkU2Vzc2lvbktleVBvcywKKyAgICAgICAgICAgICAgICAgICBwU2Vzc2lvbi0+cEVuY3J5cHRlZFNlc3Npb25LZXksIHBTZXNzaW9uLT5lbmNyeXB0ZWRTZXNzaW9uS2V5TGVuZ3RoKTsKKworICAgICAgICAgICAgLy8gU2V0IHRoZSBzaWduYXR1cmVzIHRvIGFsbCB6ZXJvcyBmb3Igbm93OyB0aGV5IHdpbGwgaGF2ZSB0byBiZSB1cGRhdGVkIGxhdGVyLgorICAgICAgICAgICAgbWVtc2V0KChjaGFyICopcE91dHB1dC0+ZnJvbUNvbnZlcnREYXRhLnBCdWZmZXIgKyBkYXRhU2lnbmF0dXJlUG9zLCAwLAorICAgICAgICAgICAgICAgICAgIFNIQTFfSEFTSF9TSVpFKTsKKyAgICAgICAgICAgIG1lbXNldCgoY2hhciAqKXBPdXRwdXQtPmZyb21Db252ZXJ0RGF0YS5wQnVmZmVyICsgaGVhZGVyU2lnbmF0dXJlUG9zLCAwLAorICAgICAgICAgICAgICAgICAgIFNIQTFfSEFTSF9TSVpFKTsKKworICAgICAgICAgICAgcE91dHB1dC0+ZnJvbUNvbnZlcnREYXRhLm51bUJ5dGVzID0gcFNlc3Npb24tPmRhdGFPZmZzZXQ7CisgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfT0s7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKiBNYXRjaGVzIHRoZSBNSU1FIGhlYWRlcnMuCisgKgorICogQHBhcmFtW2luLG91dF0gcFNlc3Npb24gQSByZWZlcmVuY2UgdG8gYSBjb252ZXJ0ZXIgc2Vzc2lvbi4KKyAqIEBwYXJhbVtpbl0gY2ggQSBjaGFyYWN0ZXIuCisgKiBAcGFyYW1bb3V0XSBwT3V0cHV0IFRoZSBvdXRwdXQgZnJvbSB0aGUgY29udmVyc2lvbiBwcm9jZXNzLgorICoKKyAqIEByZXR1cm4gQSBzdGF0dXMgY29kZS4KKyAqLworc3RhdGljIEZ3ZExvY2tDb252X1N0YXR1c190IEZ3ZExvY2tDb252X01hdGNoTWltZUhlYWRlcnMoRndkTG9ja0NvbnZfU2Vzc2lvbl90ICpwU2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZ3ZExvY2tDb252X091dHB1dF90ICpwT3V0cHV0KSB7CisgICAgRndkTG9ja0NvbnZfU3RhdHVzX3Qgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX09LOworICAgIHN3aXRjaCAocFNlc3Npb24tPnNjYW5uZXJTdGF0ZSkgeworICAgIGNhc2UgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzTWltZUhlYWRlck5hbWVTdGFydDoKKyAgICAgICAgaWYgKEZ3ZExvY2tDb252X0lzTWltZUhlYWRlck5hbWVDaGFyKGNoKSkgeworICAgICAgICAgICAgcFNlc3Npb24tPm1pbWVIZWFkZXJOYW1lLmxlbmd0aCA9IDA7CisgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdHJpbmdBcHBlbmQoJnBTZXNzaW9uLT5taW1lSGVhZGVyTmFtZSwgdG9sb3dlcihjaCkpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBGd2RMb2NrQ29udl9TdGF0dXNfT0spIHsKKyAgICAgICAgICAgICAgICBwU2Vzc2lvbi0+c2Nhbm5lclN0YXRlID0gRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzTWltZUhlYWRlck5hbWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJ1xyJykgeworICAgICAgICAgICAgcFNlc3Npb24tPnNjYW5uZXJTdGF0ZSA9IEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c01pbWVIZWFkZXJzRW5kOworICAgICAgICB9IGVsc2UgaWYgKCFGd2RMb2NrQ29udl9Jc1doaXRlc3BhY2UoY2gpKSB7CisgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfU3ludGF4RXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNNaW1lSGVhZGVyTmFtZToKKyAgICAgICAgaWYgKEZ3ZExvY2tDb252X0lzTWltZUhlYWRlck5hbWVDaGFyKGNoKSkgeworICAgICAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RyaW5nQXBwZW5kKCZwU2Vzc2lvbi0+bWltZUhlYWRlck5hbWUsIHRvbG93ZXIoY2gpKTsKKyAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnOicpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1JlY29nbml6ZU1pbWVIZWFkZXJOYW1lKHBTZXNzaW9uKTsKKyAgICAgICAgfSBlbHNlIGlmIChGd2RMb2NrQ29udl9Jc1doaXRlc3BhY2UoY2gpKSB7CisgICAgICAgICAgICBwU2Vzc2lvbi0+c2Nhbm5lclN0YXRlID0gRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzTWltZUhlYWRlck5hbWVFbmQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfU3ludGF4RXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNNaW1lSGVhZGVyTmFtZUVuZDoKKyAgICAgICAgaWYgKGNoID09ICc6JykgeworICAgICAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfUmVjb2duaXplTWltZUhlYWRlck5hbWUocFNlc3Npb24pOworICAgICAgICB9IGVsc2UgaWYgKCFGd2RMb2NrQ29udl9Jc1doaXRlc3BhY2UoY2gpKSB7CisgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfU3ludGF4RXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNDb250ZW50VHlwZVN0YXJ0OgorICAgICAgICBpZiAoRndkTG9ja0NvbnZfSXNNaW1lSGVhZGVyVmFsdWVDaGFyKGNoKSkgeworICAgICAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RyaW5nQXBwZW5kKCZwU2Vzc2lvbi0+Y29udGVudFR5cGUsIHRvbG93ZXIoY2gpKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gRndkTG9ja0NvbnZfU3RhdHVzX09LKSB7CisgICAgICAgICAgICAgICAgcFNlc3Npb24tPnNjYW5uZXJTdGF0ZSA9IEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c0NvbnRlbnRUeXBlOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKCFGd2RMb2NrQ29udl9Jc1doaXRlc3BhY2UoY2gpKSB7CisgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfU3ludGF4RXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNDb250ZW50VHlwZToKKyAgICAgICAgaWYgKEZ3ZExvY2tDb252X0lzTWltZUhlYWRlclZhbHVlQ2hhcihjaCkpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0cmluZ0FwcGVuZCgmcFNlc3Npb24tPmNvbnRlbnRUeXBlLCB0b2xvd2VyKGNoKSk7CisgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJzsnKSB7CisgICAgICAgICAgICBwU2Vzc2lvbi0+c2Nhbm5lclN0YXRlID0gRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzQ1I7CisgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJ1xyJykgeworICAgICAgICAgICAgcFNlc3Npb24tPnNjYW5uZXJTdGF0ZSA9IEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c0xGOworICAgICAgICB9IGVsc2UgaWYgKEZ3ZExvY2tDb252X0lzV2hpdGVzcGFjZShjaCkpIHsKKyAgICAgICAgICAgIHBTZXNzaW9uLT5zY2FubmVyU3RhdGUgPSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNNaW1lSGVhZGVyVmFsdWVFbmQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfU3ludGF4RXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNDb250ZW50VHJhbnNmZXJFbmNvZGluZ1N0YXJ0OgorICAgICAgICBpZiAoY2ggPT0gJ2InIHx8IGNoID09ICdCJykgeworICAgICAgICAgICAgcFNlc3Npb24tPnNjYW5uZXJTdGF0ZSA9IEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c19BX09SX0k7CisgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJzcnIHx8IGNoID09ICc4JykgeworICAgICAgICAgICAgcFNlc3Npb24tPnNjYW5uZXJTdGF0ZSA9IEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c19COworICAgICAgICB9IGVsc2UgaWYgKCFGd2RMb2NrQ29udl9Jc1doaXRlc3BhY2UoY2gpKSB7CisgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfVW5zdXBwb3J0ZWRDb250ZW50VHJhbnNmZXJFbmNvZGluZzsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c19BX09SX0k6CisgICAgICAgIGlmIChjaCA9PSAnaScgfHwgY2ggPT0gJ0knKSB7CisgICAgICAgICAgICBwU2Vzc2lvbi0+c2Nhbm5lclN0YXRlID0gRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzX047CisgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJ2EnIHx8IGNoID09ICdBJykgeworICAgICAgICAgICAgcFNlc3Npb24tPnNjYW5uZXJTdGF0ZSA9IEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c19TOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX1Vuc3VwcG9ydGVkQ29udGVudFRyYW5zZmVyRW5jb2Rpbmc7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNfTjoKKyAgICAgICAgaWYgKGNoID09ICduJyB8fCBjaCA9PSAnTicpIHsKKyAgICAgICAgICAgIHBTZXNzaW9uLT5zY2FubmVyU3RhdGUgPSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNfQTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19VbnN1cHBvcnRlZENvbnRlbnRUcmFuc2ZlckVuY29kaW5nOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzX0E6CisgICAgICAgIGlmIChjaCA9PSAnYScgfHwgY2ggPT0gJ0EnKSB7CisgICAgICAgICAgICBwU2Vzc2lvbi0+c2Nhbm5lclN0YXRlID0gRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzX1I7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfVW5zdXBwb3J0ZWRDb250ZW50VHJhbnNmZXJFbmNvZGluZzsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c19SOgorICAgICAgICBpZiAoY2ggPT0gJ3InIHx8IGNoID09ICdSJykgeworICAgICAgICAgICAgcFNlc3Npb24tPnNjYW5uZXJTdGF0ZSA9IEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c19ZOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX1Vuc3VwcG9ydGVkQ29udGVudFRyYW5zZmVyRW5jb2Rpbmc7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNfWToKKyAgICAgICAgaWYgKGNoID09ICd5JyB8fCBjaCA9PSAnWScpIHsKKyAgICAgICAgICAgIHBTZXNzaW9uLT5jb250ZW50VHJhbnNmZXJFbmNvZGluZyA9IEZ3ZExvY2tDb252X0NvbnRlbnRUcmFuc2ZlckVuY29kaW5nX0JpbmFyeTsKKyAgICAgICAgICAgIHBTZXNzaW9uLT5zY2FubmVyU3RhdGUgPSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNDb250ZW50VHJhbnNmZXJFbmNvZGluZ0VuZDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19VbnN1cHBvcnRlZENvbnRlbnRUcmFuc2ZlckVuY29kaW5nOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzX1M6CisgICAgICAgIGlmIChjaCA9PSAncycgfHwgY2ggPT0gJ1MnKSB7CisgICAgICAgICAgICBwU2Vzc2lvbi0+c2Nhbm5lclN0YXRlID0gRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzX0U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfVW5zdXBwb3J0ZWRDb250ZW50VHJhbnNmZXJFbmNvZGluZzsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c19FOgorICAgICAgICBpZiAoY2ggPT0gJ2UnIHx8IGNoID09ICdFJykgeworICAgICAgICAgICAgcFNlc3Npb24tPnNjYW5uZXJTdGF0ZSA9IEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c182OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX1Vuc3VwcG9ydGVkQ29udGVudFRyYW5zZmVyRW5jb2Rpbmc7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNfNjoKKyAgICAgICAgaWYgKGNoID09ICc2JykgeworICAgICAgICAgICAgcFNlc3Npb24tPnNjYW5uZXJTdGF0ZSA9IEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c180OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX1Vuc3VwcG9ydGVkQ29udGVudFRyYW5zZmVyRW5jb2Rpbmc7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNfNDoKKyAgICAgICAgaWYgKGNoID09ICc0JykgeworICAgICAgICAgICAgcFNlc3Npb24tPmNvbnRlbnRUcmFuc2ZlckVuY29kaW5nID0gRndkTG9ja0NvbnZfQ29udGVudFRyYW5zZmVyRW5jb2RpbmdfQmFzZTY0OworICAgICAgICAgICAgcFNlc3Npb24tPnNjYW5uZXJTdGF0ZSA9IEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c0NvbnRlbnRUcmFuc2ZlckVuY29kaW5nRW5kOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX1Vuc3VwcG9ydGVkQ29udGVudFRyYW5zZmVyRW5jb2Rpbmc7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNfQjoKKyAgICAgICAgaWYgKGNoID09ICdiJyB8fCBjaCA9PSAnQicpIHsKKyAgICAgICAgICAgIHBTZXNzaW9uLT5zY2FubmVyU3RhdGUgPSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNfSTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19VbnN1cHBvcnRlZENvbnRlbnRUcmFuc2ZlckVuY29kaW5nOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzX0k6CisgICAgICAgIGlmIChjaCA9PSAnaScgfHwgY2ggPT0gJ0knKSB7CisgICAgICAgICAgICBwU2Vzc2lvbi0+c2Nhbm5lclN0YXRlID0gRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzX1Q7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfVW5zdXBwb3J0ZWRDb250ZW50VHJhbnNmZXJFbmNvZGluZzsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c19UOgorICAgICAgICBpZiAoY2ggPT0gJ3QnIHx8IGNoID09ICdUJykgeworICAgICAgICAgICAgcFNlc3Npb24tPmNvbnRlbnRUcmFuc2ZlckVuY29kaW5nID0gRndkTG9ja0NvbnZfQ29udGVudFRyYW5zZmVyRW5jb2RpbmdfQmluYXJ5OworICAgICAgICAgICAgcFNlc3Npb24tPnNjYW5uZXJTdGF0ZSA9IEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c0NvbnRlbnRUcmFuc2ZlckVuY29kaW5nRW5kOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX1Vuc3VwcG9ydGVkQ29udGVudFRyYW5zZmVyRW5jb2Rpbmc7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNDb250ZW50VHJhbnNmZXJFbmNvZGluZ0VuZDoKKyAgICAgICAgaWYgKGNoID09ICc7JykgeworICAgICAgICAgICAgcFNlc3Npb24tPnNjYW5uZXJTdGF0ZSA9IEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c0NSOworICAgICAgICB9IGVsc2UgaWYgKGNoID09ICdccicpIHsKKyAgICAgICAgICAgIHBTZXNzaW9uLT5zY2FubmVyU3RhdGUgPSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNMRjsKKyAgICAgICAgfSBlbHNlIGlmIChGd2RMb2NrQ29udl9Jc1doaXRlc3BhY2UoY2gpKSB7CisgICAgICAgICAgICBwU2Vzc2lvbi0+c2Nhbm5lclN0YXRlID0gRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzTWltZUhlYWRlclZhbHVlRW5kOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX1Vuc3VwcG9ydGVkQ29udGVudFRyYW5zZmVyRW5jb2Rpbmc7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNNaW1lSGVhZGVyVmFsdWVFbmQ6CisgICAgICAgIGlmIChjaCA9PSAnOycpIHsKKyAgICAgICAgICAgIHBTZXNzaW9uLT5zY2FubmVyU3RhdGUgPSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNDUjsKKyAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnXHInKSB7CisgICAgICAgICAgICBwU2Vzc2lvbi0+c2Nhbm5lclN0YXRlID0gRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzTEY7CisgICAgICAgIH0gZWxzZSBpZiAoIUZ3ZExvY2tDb252X0lzV2hpdGVzcGFjZShjaCkpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19TeW50YXhFcnJvcjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c0NSOgorICAgICAgICBpZiAoY2ggPT0gJ1xyJykgeworICAgICAgICAgICAgcFNlc3Npb24tPnNjYW5uZXJTdGF0ZSA9IEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c0xGOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzTEY6CisgICAgICAgIGlmIChjaCA9PSAnXG4nKSB7CisgICAgICAgICAgICBwU2Vzc2lvbi0+c2Nhbm5lclN0YXRlID0gRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzTWltZUhlYWRlck5hbWVTdGFydDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19TeW50YXhFcnJvcjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c01pbWVIZWFkZXJzRW5kOgorICAgICAgICBpZiAoY2ggPT0gJ1xuJykgeworICAgICAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfQXBwbHlEZWZhdWx0cyhwU2Vzc2lvbik7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IEZ3ZExvY2tDb252X1N0YXR1c19PSykgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1ZlcmlmeUNvbnRlbnRUeXBlKHBTZXNzaW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gRndkTG9ja0NvbnZfU3RhdHVzX09LKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfV3JpdGVIZWFkZXIocFNlc3Npb24sIHBPdXRwdXQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBGd2RMb2NrQ29udl9TdGF0dXNfT0spIHsKKyAgICAgICAgICAgICAgICBpZiAocFNlc3Npb24tPmNvbnRlbnRUcmFuc2ZlckVuY29kaW5nID09CisgICAgICAgICAgICAgICAgICAgICAgICBGd2RMb2NrQ29udl9Db250ZW50VHJhbnNmZXJFbmNvZGluZ19CaW5hcnkpIHsKKyAgICAgICAgICAgICAgICAgICAgcFNlc3Npb24tPnBhcnNlclN0YXRlID0gRndkTG9ja0NvbnZfUGFyc2VyU3RhdGVfV2FudHNCaW5hcnlFbmNvZGVkRGF0YTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBwU2Vzc2lvbi0+cGFyc2VyU3RhdGUgPSBGd2RMb2NrQ29udl9QYXJzZXJTdGF0ZV9XYW50c0Jhc2U2NEVuY29kZWREYXRhOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwU2Vzc2lvbi0+c2Nhbm5lclN0YXRlID0gRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzQnl0ZTE7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfU3ludGF4RXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX1Byb2dyYW1FcnJvcjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICogSW5jcmVtZW50cyB0aGUgY291bnRlciwgdHJlYXRlZCBhcyBhIDE2LWJ5dGUgbGl0dGxlLWVuZGlhbiBudW1iZXIsIGJ5IG9uZS4KKyAqCisgKiBAcGFyYW1baW4sb3V0XSBwU2Vzc2lvbiBBIHJlZmVyZW5jZSB0byBhIGNvbnZlcnRlciBzZXNzaW9uLgorICovCitzdGF0aWMgdm9pZCBGd2RMb2NrQ29udl9JbmNyZW1lbnRDb3VudGVyKEZ3ZExvY2tDb252X1Nlc3Npb25fdCAqcFNlc3Npb24pIHsKKyAgICBzaXplX3QgaSA9IDA7CisgICAgd2hpbGUgKCgrK3BTZXNzaW9uLT5jb3VudGVyW2ldID09IDApICYmICgrK2kgPCBBRVNfQkxPQ0tfU0laRSkpCisgICAgICAgIDsKK30KKworLyoqCisgKiBFbmNyeXB0cyB0aGUgZ2l2ZW4gY2hhcmFjdGVyIGFuZCB3cml0ZXMgaXQgdG8gdGhlIG91dHB1dCBidWZmZXIuCisgKgorICogQHBhcmFtW2luLG91dF0gcFNlc3Npb24gQSByZWZlcmVuY2UgdG8gYSBjb252ZXJ0ZXIgc2Vzc2lvbi4KKyAqIEBwYXJhbVtpbl0gY2ggVGhlIGNoYXJhY3RlciB0byBlbmNyeXB0IGFuZCB3cml0ZS4KKyAqIEBwYXJhbVtpbixvdXRdIHBPdXRwdXQgVGhlIG91dHB1dCBmcm9tIHRoZSBjb252ZXJzaW9uIHByb2Nlc3MuCisgKgorICogQHJldHVybiBBIHN0YXR1cyBjb2RlLgorICovCitzdGF0aWMgRndkTG9ja0NvbnZfU3RhdHVzX3QgRndkTG9ja0NvbnZfV3JpdGVFbmNyeXB0ZWRDaGFyKEZ3ZExvY2tDb252X1Nlc3Npb25fdCAqcFNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgY2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZ3ZExvY2tDb252X091dHB1dF90ICpwT3V0cHV0KSB7CisgICAgaWYgKHBPdXRwdXQtPmZyb21Db252ZXJ0RGF0YS5udW1CeXRlcyA9PSBwU2Vzc2lvbi0+b3V0cHV0QnVmZmVyU2l6ZSkgeworICAgICAgICB2b2lkICpwQnVmZmVyOworICAgICAgICBwU2Vzc2lvbi0+b3V0cHV0QnVmZmVyU2l6ZSArPSBPVVRQVVRfQlVGRkVSX1NJWkVfSU5DUkVNRU5UOworICAgICAgICBwQnVmZmVyID0gcmVhbGxvYyhwT3V0cHV0LT5mcm9tQ29udmVydERhdGEucEJ1ZmZlciwgcFNlc3Npb24tPm91dHB1dEJ1ZmZlclNpemUpOworICAgICAgICBpZiAocEJ1ZmZlciA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gRndkTG9ja0NvbnZfU3RhdHVzX091dE9mTWVtb3J5OworICAgICAgICB9CisgICAgICAgIHBPdXRwdXQtPmZyb21Db252ZXJ0RGF0YS5wQnVmZmVyID0gcEJ1ZmZlcjsKKyAgICB9CisgICAgaWYgKCsrcFNlc3Npb24tPmtleVN0cmVhbUluZGV4ID09IEFFU19CTE9DS19TSVpFKSB7CisgICAgICAgIEZ3ZExvY2tDb252X0luY3JlbWVudENvdW50ZXIocFNlc3Npb24pOworICAgICAgICBwU2Vzc2lvbi0+a2V5U3RyZWFtSW5kZXggPSAwOworICAgIH0KKyAgICBpZiAocFNlc3Npb24tPmtleVN0cmVhbUluZGV4ID09IDApIHsKKyAgICAgICAgQUVTX2VuY3J5cHQocFNlc3Npb24tPmNvdW50ZXIsIHBTZXNzaW9uLT5rZXlTdHJlYW0sICZwU2Vzc2lvbi0+ZW5jcnlwdGlvblJvdW5kS2V5cyk7CisgICAgfQorICAgIGNoIF49IHBTZXNzaW9uLT5rZXlTdHJlYW1bcFNlc3Npb24tPmtleVN0cmVhbUluZGV4XTsKKyAgICAoKHVuc2lnbmVkIGNoYXIgKilwT3V0cHV0LT5mcm9tQ29udmVydERhdGEucEJ1ZmZlcilbcE91dHB1dC0+ZnJvbUNvbnZlcnREYXRhLm51bUJ5dGVzKytdID0gY2g7CisgICAgKytwU2Vzc2lvbi0+bnVtRGF0YUJ5dGVzOworICAgIHJldHVybiBGd2RMb2NrQ29udl9TdGF0dXNfT0s7Cit9CisKKy8qKgorICogTWF0Y2hlcyBiaW5hcnktZW5jb2RlZCBjb250ZW50IGRhdGEgYW5kIGVuY3J5cHRzIGl0LCB3aGlsZSBsb29raW5nIG91dCBmb3IgdGhlIGNsb3NlIGRlbGltaXRlci4KKyAqCisgKiBAcGFyYW1baW4sb3V0XSBwU2Vzc2lvbiBBIHJlZmVyZW5jZSB0byBhIGNvbnZlcnRlciBzZXNzaW9uLgorICogQHBhcmFtW2luXSBjaCBBIGNoYXJhY3Rlci4KKyAqIEBwYXJhbVtpbixvdXRdIHBPdXRwdXQgVGhlIG91dHB1dCBmcm9tIHRoZSBjb252ZXJzaW9uIHByb2Nlc3MuCisgKgorICogQHJldHVybiBBIHN0YXR1cyBjb2RlLgorICovCitzdGF0aWMgRndkTG9ja0NvbnZfU3RhdHVzX3QgRndkTG9ja0NvbnZfTWF0Y2hCaW5hcnlFbmNvZGVkRGF0YShGd2RMb2NrQ29udl9TZXNzaW9uX3QgKnBTZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRndkTG9ja0NvbnZfT3V0cHV0X3QgKnBPdXRwdXQpIHsKKyAgICBGd2RMb2NrQ29udl9TdGF0dXNfdCBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfT0s7CisgICAgc3dpdGNoIChwU2Vzc2lvbi0+c2Nhbm5lclN0YXRlKSB7CisgICAgY2FzZSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNCeXRlMToKKyAgICAgICAgaWYgKGNoICE9IHBTZXNzaW9uLT5kZWxpbWl0ZXJbcFNlc3Npb24tPmRlbGltaXRlck1hdGNoUG9zXSkgeworICAgICAgICAgICAgLy8gVGhlIHBhcnRpYWwgbWF0Y2ggb2YgdGhlIGRlbGltaXRlciB0dXJuZWQgb3V0IHRvIGJlIHNwdXJpb3VzLiBGbHVzaCB0aGUgbWF0Y2hlZCBieXRlcworICAgICAgICAgICAgLy8gdG8gdGhlIG91dHB1dCBidWZmZXIgYW5kIHN0YXJ0IG92ZXIuCisgICAgICAgICAgICBzaXplX3QgaTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwU2Vzc2lvbi0+ZGVsaW1pdGVyTWF0Y2hQb3M7ICsraSkgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1dyaXRlRW5jcnlwdGVkQ2hhcihwU2Vzc2lvbiwgcFNlc3Npb24tPmRlbGltaXRlcltpXSwgcE91dHB1dCk7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBGd2RMb2NrQ29udl9TdGF0dXNfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwU2Vzc2lvbi0+ZGVsaW1pdGVyTWF0Y2hQb3MgPSAwOworICAgICAgICB9CisgICAgICAgIGlmIChjaCAhPSBwU2Vzc2lvbi0+ZGVsaW1pdGVyW3BTZXNzaW9uLT5kZWxpbWl0ZXJNYXRjaFBvc10pIHsKKyAgICAgICAgICAgIC8vIFRoZSBjdXJyZW50IGNoYXJhY3RlciBpc24ndCBwYXJ0IG9mIHRoZSBkZWxpbWl0ZXIuIFdyaXRlIGl0IHRvIHRoZSBvdXRwdXQgYnVmZmVyLgorICAgICAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfV3JpdGVFbmNyeXB0ZWRDaGFyKHBTZXNzaW9uLCBjaCwgcE91dHB1dCk7CisgICAgICAgIH0gZWxzZSBpZiAoKytwU2Vzc2lvbi0+ZGVsaW1pdGVyTWF0Y2hQb3MgPT0gcFNlc3Npb24tPmRlbGltaXRlckxlbmd0aCkgeworICAgICAgICAgICAgLy8gVGhlIGVudGlyZSBkZWxpbWl0ZXIgaGFzIGJlZW4gbWF0Y2hlZC4gVGhlIG9ubHkgdmFsaWQgY2hhcmFjdGVycyBub3cgYXJlIHRoZSAiLS0iCisgICAgICAgICAgICAvLyB0aGF0IGNvbXBsZXRlIHRoZSBjbG9zZSBkZWxpbWl0ZXIgKG5vIG1vcmUgbWVzc2FnZSBwYXJ0cyBhcmUgZXhwZWN0ZWQpLgorICAgICAgICAgICAgcFNlc3Npb24tPnNjYW5uZXJTdGF0ZSA9IEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c0ZpcnN0RGFzaDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c0ZpcnN0RGFzaDoKKyAgICAgICAgaWYgKGNoID09ICctJykgeworICAgICAgICAgICAgcFNlc3Npb24tPnNjYW5uZXJTdGF0ZSA9IEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c1NlY29uZERhc2g7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfU3ludGF4RXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNTZWNvbmREYXNoOgorICAgICAgICBpZiAoY2ggPT0gJy0nKSB7CisgICAgICAgICAgICBwU2Vzc2lvbi0+cGFyc2VyU3RhdGUgPSBGd2RMb2NrQ29udl9QYXJzZXJTdGF0ZV9Eb25lOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX1N5bnRheEVycm9yOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19Qcm9ncmFtRXJyb3I7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAqIENoZWNrcyB3aGV0aGVyIGEgZ2l2ZW4gY2hhcmFjdGVyIGlzIHZhbGlkIGluIGJhc2U2NC1lbmNvZGVkIGRhdGEuCisgKgorICogQHBhcmFtW2luXSBjaCBUaGUgY2hhcmFjdGVyIHRvIGNoZWNrLgorICoKKyAqIEByZXR1cm4gQSBCb29sZWFuIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0aGUgZ2l2ZW4gY2hhcmFjdGVyIGlzIHZhbGlkIGluIGJhc2U2NC1lbmNvZGVkIGRhdGEuCisgKi8KK3N0YXRpYyBpbnQgRndkTG9ja0NvbnZfSXNCYXNlNjRDaGFyKGludCBjaCkgeworICAgIHJldHVybiAwIDw9IGNoICYmIGNoIDw9ICd6JyAmJiBiYXNlNjRWYWx1ZXNbY2hdID49IDA7Cit9CisKKy8qKgorICogTWF0Y2hlcyBiYXNlNjQtZW5jb2RlZCBjb250ZW50IGRhdGEgYW5kIGVuY3J5cHRzIGl0LCB3aGlsZSBsb29raW5nIG91dCBmb3IgdGhlIGNsb3NlIGRlbGltaXRlci4KKyAqCisgKiBAcGFyYW1baW4sb3V0XSBwU2Vzc2lvbiBBIHJlZmVyZW5jZSB0byBhIGNvbnZlcnRlciBzZXNzaW9uLgorICogQHBhcmFtW2luXSBjaCBBIGNoYXJhY3Rlci4KKyAqIEBwYXJhbVtpbixvdXRdIHBPdXRwdXQgVGhlIG91dHB1dCBmcm9tIHRoZSBjb252ZXJzaW9uIHByb2Nlc3MuCisgKgorICogQHJldHVybiBBIHN0YXR1cyBjb2RlLgorICovCitzdGF0aWMgRndkTG9ja0NvbnZfU3RhdHVzX3QgRndkTG9ja0NvbnZfTWF0Y2hCYXNlNjRFbmNvZGVkRGF0YShGd2RMb2NrQ29udl9TZXNzaW9uX3QgKnBTZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRndkTG9ja0NvbnZfT3V0cHV0X3QgKnBPdXRwdXQpIHsKKyAgICBGd2RMb2NrQ29udl9TdGF0dXNfdCBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfT0s7CisgICAgc3dpdGNoIChwU2Vzc2lvbi0+c2Nhbm5lclN0YXRlKSB7CisgICAgY2FzZSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNCeXRlMToKKyAgICBjYXNlIEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c0J5dGUxX0FmdGVyQ1JMRjoKKyAgICAgICAgaWYgKEZ3ZExvY2tDb252X0lzQmFzZTY0Q2hhcihjaCkpIHsKKyAgICAgICAgICAgIHBTZXNzaW9uLT5jaCA9IGJhc2U2NFZhbHVlc1tjaF0gPDwgMjsKKyAgICAgICAgICAgIHBTZXNzaW9uLT5zY2FubmVyU3RhdGUgPSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNCeXRlMjsKKyAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnXHInKSB7CisgICAgICAgICAgICBwU2Vzc2lvbi0+c2F2ZWRTY2FubmVyU3RhdGUgPSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNCeXRlMV9BZnRlckNSTEY7CisgICAgICAgICAgICBwU2Vzc2lvbi0+c2Nhbm5lclN0YXRlID0gRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzTEY7CisgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJy0nKSB7CisgICAgICAgICAgICBpZiAocFNlc3Npb24tPnNjYW5uZXJTdGF0ZSA9PSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNCeXRlMV9BZnRlckNSTEYpIHsKKyAgICAgICAgICAgICAgICBwU2Vzc2lvbi0+ZGVsaW1pdGVyTWF0Y2hQb3MgPSAzOworICAgICAgICAgICAgICAgIHBTZXNzaW9uLT5zY2FubmVyU3RhdGUgPSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNEZWxpbWl0ZXI7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19TeW50YXhFcnJvcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICghRndkTG9ja0NvbnZfSXNXaGl0ZXNwYWNlKGNoKSkgeworICAgICAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX1N5bnRheEVycm9yOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzQnl0ZTI6CisgICAgICAgIGlmIChGd2RMb2NrQ29udl9Jc0Jhc2U2NENoYXIoY2gpKSB7CisgICAgICAgICAgICBwU2Vzc2lvbi0+Y2ggfD0gYmFzZTY0VmFsdWVzW2NoXSA+PiA0OworICAgICAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfV3JpdGVFbmNyeXB0ZWRDaGFyKHBTZXNzaW9uLCBwU2Vzc2lvbi0+Y2gsIHBPdXRwdXQpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBGd2RMb2NrQ29udl9TdGF0dXNfT0spIHsKKyAgICAgICAgICAgICAgICBwU2Vzc2lvbi0+Y2ggPSBiYXNlNjRWYWx1ZXNbY2hdIDw8IDQ7CisgICAgICAgICAgICAgICAgcFNlc3Npb24tPnNjYW5uZXJTdGF0ZSA9IEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c0J5dGUzOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGNoID09ICdccicpIHsKKyAgICAgICAgICAgIHBTZXNzaW9uLT5zYXZlZFNjYW5uZXJTdGF0ZSA9IHBTZXNzaW9uLT5zY2FubmVyU3RhdGU7CisgICAgICAgICAgICBwU2Vzc2lvbi0+c2Nhbm5lclN0YXRlID0gRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzTEY7CisgICAgICAgIH0gZWxzZSBpZiAoIUZ3ZExvY2tDb252X0lzV2hpdGVzcGFjZShjaCkpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19TeW50YXhFcnJvcjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c0J5dGUzOgorICAgICAgICBpZiAoRndkTG9ja0NvbnZfSXNCYXNlNjRDaGFyKGNoKSkgeworICAgICAgICAgICAgcFNlc3Npb24tPmNoIHw9IGJhc2U2NFZhbHVlc1tjaF0gPj4gMjsKKyAgICAgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1dyaXRlRW5jcnlwdGVkQ2hhcihwU2Vzc2lvbiwgcFNlc3Npb24tPmNoLCBwT3V0cHV0KTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gRndkTG9ja0NvbnZfU3RhdHVzX09LKSB7CisgICAgICAgICAgICAgICAgcFNlc3Npb24tPmNoID0gYmFzZTY0VmFsdWVzW2NoXSA8PCA2OworICAgICAgICAgICAgICAgIHBTZXNzaW9uLT5zY2FubmVyU3RhdGUgPSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNCeXRlNDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnXHInKSB7CisgICAgICAgICAgICBwU2Vzc2lvbi0+c2F2ZWRTY2FubmVyU3RhdGUgPSBwU2Vzc2lvbi0+c2Nhbm5lclN0YXRlOworICAgICAgICAgICAgcFNlc3Npb24tPnNjYW5uZXJTdGF0ZSA9IEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c0xGOworICAgICAgICB9IGVsc2UgaWYgKGNoID09ICc9JykgeworICAgICAgICAgICAgcFNlc3Npb24tPnNjYW5uZXJTdGF0ZSA9IEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c1BhZGRpbmc7CisgICAgICAgIH0gZWxzZSBpZiAoIUZ3ZExvY2tDb252X0lzV2hpdGVzcGFjZShjaCkpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19TeW50YXhFcnJvcjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c0J5dGU0OgorICAgICAgICBpZiAoRndkTG9ja0NvbnZfSXNCYXNlNjRDaGFyKGNoKSkgeworICAgICAgICAgICAgcFNlc3Npb24tPmNoIHw9IGJhc2U2NFZhbHVlc1tjaF07CisgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9Xcml0ZUVuY3J5cHRlZENoYXIocFNlc3Npb24sIHBTZXNzaW9uLT5jaCwgcE91dHB1dCk7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IEZ3ZExvY2tDb252X1N0YXR1c19PSykgeworICAgICAgICAgICAgICAgIHBTZXNzaW9uLT5zY2FubmVyU3RhdGUgPSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNCeXRlMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnXHInKSB7CisgICAgICAgICAgICBwU2Vzc2lvbi0+c2F2ZWRTY2FubmVyU3RhdGUgPSBwU2Vzc2lvbi0+c2Nhbm5lclN0YXRlOworICAgICAgICAgICAgcFNlc3Npb24tPnNjYW5uZXJTdGF0ZSA9IEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c0xGOworICAgICAgICB9IGVsc2UgaWYgKGNoID09ICc9JykgeworICAgICAgICAgICAgcFNlc3Npb24tPnNjYW5uZXJTdGF0ZSA9IEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c1doaXRlc3BhY2U7CisgICAgICAgIH0gZWxzZSBpZiAoIUZ3ZExvY2tDb252X0lzV2hpdGVzcGFjZShjaCkpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19TeW50YXhFcnJvcjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c0xGOgorICAgICAgICBpZiAoY2ggPT0gJ1xuJykgeworICAgICAgICAgICAgcFNlc3Npb24tPnNjYW5uZXJTdGF0ZSA9IHBTZXNzaW9uLT5zYXZlZFNjYW5uZXJTdGF0ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19TeW50YXhFcnJvcjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c1BhZGRpbmc6CisgICAgICAgIGlmIChjaCA9PSAnPScpIHsKKyAgICAgICAgICAgIHBTZXNzaW9uLT5zY2FubmVyU3RhdGUgPSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNXaGl0ZXNwYWNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX1N5bnRheEVycm9yOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzV2hpdGVzcGFjZToKKyAgICBjYXNlIEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c1doaXRlc3BhY2VfQWZ0ZXJDUkxGOgorICAgICAgICBpZiAoY2ggPT0gJ1xyJykgeworICAgICAgICAgICAgcFNlc3Npb24tPnNhdmVkU2Nhbm5lclN0YXRlID0gRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzV2hpdGVzcGFjZV9BZnRlckNSTEY7CisgICAgICAgICAgICBwU2Vzc2lvbi0+c2Nhbm5lclN0YXRlID0gRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzTEY7CisgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJy0nKSB7CisgICAgICAgICAgICBpZiAocFNlc3Npb24tPnNjYW5uZXJTdGF0ZSA9PSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNXaGl0ZXNwYWNlX0FmdGVyQ1JMRikgeworICAgICAgICAgICAgICAgIHBTZXNzaW9uLT5kZWxpbWl0ZXJNYXRjaFBvcyA9IDM7CisgICAgICAgICAgICAgICAgcFNlc3Npb24tPnNjYW5uZXJTdGF0ZSA9IEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c0RlbGltaXRlcjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX1N5bnRheEVycm9yOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKEZ3ZExvY2tDb252X0lzV2hpdGVzcGFjZShjaCkpIHsKKyAgICAgICAgICAgIHBTZXNzaW9uLT5zY2FubmVyU3RhdGUgPSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNXaGl0ZXNwYWNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX1N5bnRheEVycm9yOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzRGVsaW1pdGVyOgorICAgICAgICBpZiAoY2ggIT0gcFNlc3Npb24tPmRlbGltaXRlcltwU2Vzc2lvbi0+ZGVsaW1pdGVyTWF0Y2hQb3NdKSB7CisgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfU3ludGF4RXJyb3I7CisgICAgICAgIH0gZWxzZSBpZiAoKytwU2Vzc2lvbi0+ZGVsaW1pdGVyTWF0Y2hQb3MgPT0gcFNlc3Npb24tPmRlbGltaXRlckxlbmd0aCkgeworICAgICAgICAgICAgcFNlc3Npb24tPnNjYW5uZXJTdGF0ZSA9IEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c0ZpcnN0RGFzaDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c0ZpcnN0RGFzaDoKKyAgICAgICAgaWYgKGNoID09ICctJykgeworICAgICAgICAgICAgcFNlc3Npb24tPnNjYW5uZXJTdGF0ZSA9IEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c1NlY29uZERhc2g7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfU3ludGF4RXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNTZWNvbmREYXNoOgorICAgICAgICBpZiAoY2ggPT0gJy0nKSB7CisgICAgICAgICAgICBwU2Vzc2lvbi0+cGFyc2VyU3RhdGUgPSBGd2RMb2NrQ29udl9QYXJzZXJTdGF0ZV9Eb25lOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX1N5bnRheEVycm9yOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19Qcm9ncmFtRXJyb3I7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAqIFB1c2hlcyBhIHNpbmdsZSBjaGFyYWN0ZXIgaW50byB0aGUgY29udmVydGVyJ3Mgc3RhdGUgbWFjaGluZS4KKyAqCisgKiBAcGFyYW1baW4sb3V0XSBwU2Vzc2lvbiBBIHJlZmVyZW5jZSB0byBhIGNvbnZlcnRlciBzZXNzaW9uLgorICogQHBhcmFtW2luXSBjaCBBIGNoYXJhY3Rlci4KKyAqIEBwYXJhbVtpbixvdXRdIHBPdXRwdXQgVGhlIG91dHB1dCBmcm9tIHRoZSBjb252ZXJzaW9uIHByb2Nlc3MuCisgKgorICogQHJldHVybiBBIHN0YXR1cyBjb2RlLgorICovCitzdGF0aWMgRndkTG9ja0NvbnZfU3RhdHVzX3QgRndkTG9ja0NvbnZfUHVzaENoYXIoRndkTG9ja0NvbnZfU2Vzc2lvbl90ICpwU2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRndkTG9ja0NvbnZfT3V0cHV0X3QgKnBPdXRwdXQpIHsKKyAgICBGd2RMb2NrQ29udl9TdGF0dXNfdCBzdGF0dXM7CisgICAgKytwU2Vzc2lvbi0+bnVtQ2hhcnNDb25zdW1lZDsKKyAgICBzd2l0Y2ggKHBTZXNzaW9uLT5wYXJzZXJTdGF0ZSkgeworICAgIGNhc2UgRndkTG9ja0NvbnZfUGFyc2VyU3RhdGVfV2FudHNPcGVuRGVsaW1pdGVyOgorICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9NYXRjaE9wZW5EZWxpbWl0ZXIocFNlc3Npb24sIGNoKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGd2RMb2NrQ29udl9QYXJzZXJTdGF0ZV9XYW50c01pbWVIZWFkZXJzOgorICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9NYXRjaE1pbWVIZWFkZXJzKHBTZXNzaW9uLCBjaCwgcE91dHB1dCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRndkTG9ja0NvbnZfUGFyc2VyU3RhdGVfV2FudHNCaW5hcnlFbmNvZGVkRGF0YToKKyAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfTWF0Y2hCaW5hcnlFbmNvZGVkRGF0YShwU2Vzc2lvbiwgY2gsIHBPdXRwdXQpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEZ3ZExvY2tDb252X1BhcnNlclN0YXRlX1dhbnRzQmFzZTY0RW5jb2RlZERhdGE6CisgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X01hdGNoQmFzZTY0RW5jb2RlZERhdGEocFNlc3Npb24sIGNoLCBwT3V0cHV0KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGd2RMb2NrQ29udl9QYXJzZXJTdGF0ZV9Eb25lOgorICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfT0s7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19Qcm9ncmFtRXJyb3I7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCitGd2RMb2NrQ29udl9TdGF0dXNfdCBGd2RMb2NrQ29udl9PcGVuU2Vzc2lvbihpbnQgKnBTZXNzaW9uSWQsIEZ3ZExvY2tDb252X091dHB1dF90ICpwT3V0cHV0KSB7CisgICAgRndkTG9ja0NvbnZfU3RhdHVzX3Qgc3RhdHVzOworICAgIGlmIChwU2Vzc2lvbklkID09IE5VTEwgfHwgcE91dHB1dCA9PSBOVUxMKSB7CisgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19JbnZhbGlkQXJndW1lbnQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgKnBTZXNzaW9uSWQgPSBGd2RMb2NrQ29udl9BY3F1aXJlU2Vzc2lvbigpOworICAgICAgICBpZiAoKnBTZXNzaW9uSWQgPCAwKSB7CisgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfVG9vTWFueVNlc3Npb25zOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgRndkTG9ja0NvbnZfU2Vzc2lvbl90ICpwU2Vzc2lvbiA9IHNlc3Npb25QdHJzWypwU2Vzc2lvbklkXTsKKyAgICAgICAgICAgIHBTZXNzaW9uLT5lbmNyeXB0ZWRTZXNzaW9uS2V5TGVuZ3RoID0gRndkTG9ja0dsdWVfR2V0RW5jcnlwdGVkS2V5TGVuZ3RoKEtFWV9TSVpFKTsKKyAgICAgICAgICAgIGlmIChwU2Vzc2lvbi0+ZW5jcnlwdGVkU2Vzc2lvbktleUxlbmd0aCA8IEFFU19CTE9DS19TSVpFKSB7CisgICAgICAgICAgICAgICAgLy8gVGhlIGVuY3J5cHRlZCBzZXNzaW9uIGtleSBpcyB1c2VkIGFzIHRoZSBDVFItbW9kZSBub25jZSwgc28gaXQgbXVzdCBiZSBhdCBsZWFzdAorICAgICAgICAgICAgICAgIC8vIHRoZSBzaXplIG9mIGEgc2luZ2xlIEFFUyBibG9jay4KKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfUHJvZ3JhbUVycm9yOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwU2Vzc2lvbi0+cEVuY3J5cHRlZFNlc3Npb25LZXkgPSBtYWxsb2MocFNlc3Npb24tPmVuY3J5cHRlZFNlc3Npb25LZXlMZW5ndGgpOworICAgICAgICAgICAgICAgIGlmIChwU2Vzc2lvbi0+cEVuY3J5cHRlZFNlc3Npb25LZXkgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfT3V0T2ZNZW1vcnk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFGd2RMb2NrR2x1ZV9HZXRSYW5kb21OdW1iZXIocFNlc3Npb24tPnNlc3Npb25LZXksIEtFWV9TSVpFKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX1JhbmRvbU51bWJlckdlbmVyYXRpb25GYWlsZWQ7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIUZ3ZExvY2tHbHVlX0VuY3J5cHRLZXkocFNlc3Npb24tPnNlc3Npb25LZXksIEtFWV9TSVpFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTZXNzaW9uLT5wRW5jcnlwdGVkU2Vzc2lvbktleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2Vzc2lvbi0+ZW5jcnlwdGVkU2Vzc2lvbktleUxlbmd0aCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19LZXlFbmNyeXB0aW9uRmFpbGVkOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfRGVyaXZlS2V5cyhwU2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBGd2RMb2NrQ29udl9TdGF0dXNfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lbXNldChwU2Vzc2lvbi0+c2Vzc2lvbktleSwgMCwgS0VZX1NJWkUpOyAvLyBaZXJvIG91dCBrZXkgZGF0YS4KKyAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweShwU2Vzc2lvbi0+Y291bnRlciwgcFNlc3Npb24tPnBFbmNyeXB0ZWRTZXNzaW9uS2V5LCBBRVNfQkxPQ0tfU0laRSk7CisgICAgICAgICAgICAgICAgICAgICAgICBwU2Vzc2lvbi0+cGFyc2VyU3RhdGUgPSBGd2RMb2NrQ29udl9QYXJzZXJTdGF0ZV9XYW50c09wZW5EZWxpbWl0ZXI7CisgICAgICAgICAgICAgICAgICAgICAgICBwU2Vzc2lvbi0+c2Nhbm5lclN0YXRlID0gRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzRmlyc3REYXNoOworICAgICAgICAgICAgICAgICAgICAgICAgcFNlc3Npb24tPm51bUNoYXJzQ29uc3VtZWQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgcFNlc3Npb24tPmRlbGltaXRlck1hdGNoUG9zID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBTZXNzaW9uLT5taW1lSGVhZGVyTmFtZSA9IG51bGxTdHJpbmc7CisgICAgICAgICAgICAgICAgICAgICAgICBwU2Vzc2lvbi0+Y29udGVudFR5cGUgPSBudWxsU3RyaW5nOworICAgICAgICAgICAgICAgICAgICAgICAgcFNlc3Npb24tPmNvbnRlbnRUcmFuc2ZlckVuY29kaW5nID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRndkTG9ja0NvbnZfQ29udGVudFRyYW5zZmVyRW5jb2RpbmdfVW5kZWZpbmVkOworICAgICAgICAgICAgICAgICAgICAgICAgcFNlc3Npb24tPmtleVN0cmVhbUluZGV4ID0gLTE7CisgICAgICAgICAgICAgICAgICAgICAgICBwT3V0cHV0LT5mcm9tQ29udmVydERhdGEucEJ1ZmZlciA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICBwT3V0cHV0LT5mcm9tQ29udmVydERhdGEuZXJyb3JQb3MgPSBJTlZBTElEX09GRlNFVDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUocFNlc3Npb24tPnBFbmNyeXB0ZWRTZXNzaW9uS2V5KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gRndkTG9ja0NvbnZfU3RhdHVzX09LKSB7CisgICAgICAgICAgICAgICAgRndkTG9ja0NvbnZfUmVsZWFzZVNlc3Npb24oKnBTZXNzaW9uSWQpOworICAgICAgICAgICAgICAgICpwU2Vzc2lvbklkID0gLTE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworRndkTG9ja0NvbnZfU3RhdHVzX3QgRndkTG9ja0NvbnZfQ29udmVydERhdGEoaW50IHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKnBCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbnVtQnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGd2RMb2NrQ29udl9PdXRwdXRfdCAqcE91dHB1dCkgeworICAgIEZ3ZExvY2tDb252X1N0YXR1c190IHN0YXR1czsKKyAgICBpZiAoIUZ3ZExvY2tDb252X0lzVmFsaWRTZXNzaW9uKHNlc3Npb25JZCkgfHwgcEJ1ZmZlciA9PSBOVUxMIHx8IHBPdXRwdXQgPT0gTlVMTCkgeworICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfSW52YWxpZEFyZ3VtZW50OworICAgIH0gZWxzZSB7CisgICAgICAgIHNpemVfdCBpOworICAgICAgICBGd2RMb2NrQ29udl9TZXNzaW9uX3QgKnBTZXNzaW9uID0gc2Vzc2lvblB0cnNbc2Vzc2lvbklkXTsKKyAgICAgICAgcFNlc3Npb24tPmRhdGFPZmZzZXQgPSAwOworICAgICAgICBwU2Vzc2lvbi0+bnVtRGF0YUJ5dGVzID0gMDsKKyAgICAgICAgcE91dHB1dC0+ZnJvbUNvbnZlcnREYXRhLm51bUJ5dGVzID0gMDsKKyAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX09LOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1CeXRlczsgKytpKSB7CisgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9QdXNoQ2hhcihwU2Vzc2lvbiwgKChjaGFyICopcEJ1ZmZlcilbaV0sIHBPdXRwdXQpOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBGd2RMb2NrQ29udl9TdGF0dXNfT0spIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoc3RhdHVzID09IEZ3ZExvY2tDb252X1N0YXR1c19PSykgeworICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBkYXRhIHNpZ25hdHVyZS4KKyAgICAgICAgICAgIEhNQUNfVXBkYXRlKCZwU2Vzc2lvbi0+c2lnbmluZ0NvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAmKCh1bnNpZ25lZCBjaGFyICopcE91dHB1dC0+ZnJvbUNvbnZlcnREYXRhLnBCdWZmZXIpW3BTZXNzaW9uLT5kYXRhT2Zmc2V0XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBTZXNzaW9uLT5udW1EYXRhQnl0ZXMpOworICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PSBGd2RMb2NrQ29udl9TdGF0dXNfU3ludGF4RXJyb3IpIHsKKyAgICAgICAgICAgIHBPdXRwdXQtPmZyb21Db252ZXJ0RGF0YS5lcnJvclBvcyA9IHBTZXNzaW9uLT5udW1DaGFyc0NvbnN1bWVkOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK0Z3ZExvY2tDb252X1N0YXR1c190IEZ3ZExvY2tDb252X0Nsb3NlU2Vzc2lvbihpbnQgc2Vzc2lvbklkLCBGd2RMb2NrQ29udl9PdXRwdXRfdCAqcE91dHB1dCkgeworICAgIEZ3ZExvY2tDb252X1N0YXR1c190IHN0YXR1czsKKyAgICBpZiAoIUZ3ZExvY2tDb252X0lzVmFsaWRTZXNzaW9uKHNlc3Npb25JZCkgfHwgcE91dHB1dCA9PSBOVUxMKSB7CisgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19JbnZhbGlkQXJndW1lbnQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgRndkTG9ja0NvbnZfU2Vzc2lvbl90ICpwU2Vzc2lvbiA9IHNlc3Npb25QdHJzW3Nlc3Npb25JZF07CisgICAgICAgIGZyZWUocE91dHB1dC0+ZnJvbUNvbnZlcnREYXRhLnBCdWZmZXIpOworICAgICAgICBpZiAocFNlc3Npb24tPnBhcnNlclN0YXRlICE9IEZ3ZExvY2tDb252X1BhcnNlclN0YXRlX0RvbmUpIHsKKyAgICAgICAgICAgIHBPdXRwdXQtPmZyb21DbG9zZVNlc3Npb24uZXJyb3JQb3MgPSBwU2Vzc2lvbi0+bnVtQ2hhcnNDb25zdW1lZDsKKyAgICAgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19TeW50YXhFcnJvcjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIEZpbmFsaXplIHRoZSBkYXRhIHNpZ25hdHVyZS4KKyAgICAgICAgICAgIHNpemVfdCBzaWduYXR1cmVTaXplOworICAgICAgICAgICAgSE1BQ19GaW5hbCgmcFNlc3Npb24tPnNpZ25pbmdDb250ZXh0LCBwT3V0cHV0LT5mcm9tQ2xvc2VTZXNzaW9uLnNpZ25hdHVyZXMsCisgICAgICAgICAgICAgICAgICAgICAgICZzaWduYXR1cmVTaXplKTsKKyAgICAgICAgICAgIGlmIChzaWduYXR1cmVTaXplICE9IFNIQTFfSEFTSF9TSVpFKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX1Byb2dyYW1FcnJvcjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIHRoZSBoZWFkZXIgc2lnbmF0dXJlLCB3aGljaCBpcyBhIHNpZ25hdHVyZSBvZiB0aGUgcmVzdCBvZiB0aGUgaGVhZGVyCisgICAgICAgICAgICAgICAgLy8gaW5jbHVkaW5nIHRoZSBkYXRhIHNpZ25hdHVyZS4KKyAgICAgICAgICAgICAgICBITUFDX0luaXRfZXgoJnBTZXNzaW9uLT5zaWduaW5nQ29udGV4dCwgTlVMTCwgS0VZX1NJWkUsIE5VTEwsIE5VTEwpOworICAgICAgICAgICAgICAgIEhNQUNfVXBkYXRlKCZwU2Vzc2lvbi0+c2lnbmluZ0NvbnRleHQsIHBTZXNzaW9uLT50b3BIZWFkZXIsIFRPUF9IRUFERVJfU0laRSk7CisgICAgICAgICAgICAgICAgSE1BQ19VcGRhdGUoJnBTZXNzaW9uLT5zaWduaW5nQ29udGV4dCwgKHVuc2lnbmVkIGNoYXIgKilwU2Vzc2lvbi0+Y29udGVudFR5cGUucHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTZXNzaW9uLT5jb250ZW50VHlwZS5sZW5ndGgpOworICAgICAgICAgICAgICAgIEhNQUNfVXBkYXRlKCZwU2Vzc2lvbi0+c2lnbmluZ0NvbnRleHQsIHBTZXNzaW9uLT5wRW5jcnlwdGVkU2Vzc2lvbktleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2Vzc2lvbi0+ZW5jcnlwdGVkU2Vzc2lvbktleUxlbmd0aCk7CisgICAgICAgICAgICAgICAgSE1BQ19VcGRhdGUoJnBTZXNzaW9uLT5zaWduaW5nQ29udGV4dCwgcE91dHB1dC0+ZnJvbUNsb3NlU2Vzc2lvbi5zaWduYXR1cmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25hdHVyZVNpemUpOworICAgICAgICAgICAgICAgIEhNQUNfRmluYWwoJnBTZXNzaW9uLT5zaWduaW5nQ29udGV4dCwgJnBPdXRwdXQtPmZyb21DbG9zZVNlc3Npb24uCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduYXR1cmVzW3NpZ25hdHVyZVNpemVdLCAmc2lnbmF0dXJlU2l6ZSk7CisgICAgICAgICAgICAgICAgaWYgKHNpZ25hdHVyZVNpemUgIT0gU0hBMV9IQVNIX1NJWkUpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX1Byb2dyYW1FcnJvcjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBwT3V0cHV0LT5mcm9tQ2xvc2VTZXNzaW9uLmZpbGVPZmZzZXQgPSBUT1BfSEVBREVSX1NJWkUgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTZXNzaW9uLT5jb250ZW50VHlwZS5sZW5ndGggKyBwU2Vzc2lvbi0+ZW5jcnlwdGVkU2Vzc2lvbktleUxlbmd0aDsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX09LOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBPdXRwdXQtPmZyb21DbG9zZVNlc3Npb24uZXJyb3JQb3MgPSBJTlZBTElEX09GRlNFVDsKKyAgICAgICAgfQorICAgICAgICBmcmVlKHBTZXNzaW9uLT5taW1lSGVhZGVyTmFtZS5wdHIpOworICAgICAgICBmcmVlKHBTZXNzaW9uLT5jb250ZW50VHlwZS5wdHIpOworICAgICAgICBmcmVlKHBTZXNzaW9uLT5wRW5jcnlwdGVkU2Vzc2lvbktleSk7CisgICAgICAgIEhNQUNfQ1RYX2NsZWFudXAoJnBTZXNzaW9uLT5zaWduaW5nQ29udGV4dCk7CisgICAgICAgIEZ3ZExvY2tDb252X1JlbGVhc2VTZXNzaW9uKHNlc3Npb25JZCk7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK0Z3ZExvY2tDb252X1N0YXR1c190IEZ3ZExvY2tDb252X0NvbnZlcnRPcGVuRmlsZShpbnQgaW5wdXRGaWxlRGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGd2RMb2NrQ29udl9SZWFkRnVuY190ICpmcFJlYWRGdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvdXRwdXRGaWxlRGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGd2RMb2NrQ29udl9Xcml0ZUZ1bmNfdCAqZnBXcml0ZUZ1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRndkTG9ja0NvbnZfTFNlZWtGdW5jX3QgKmZwTFNlZWtGdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZjY0X3QgKnBFcnJvclBvcykgeworICAgIEZ3ZExvY2tDb252X1N0YXR1c190IHN0YXR1czsKKyAgICBpZiAocEVycm9yUG9zICE9IE5VTEwpIHsKKyAgICAgICAgKnBFcnJvclBvcyA9IElOVkFMSURfT0ZGU0VUOworICAgIH0KKyAgICBpZiAoZnBSZWFkRnVuYyA9PSBOVUxMIHx8IGZwV3JpdGVGdW5jID09IE5VTEwgfHwgZnBMU2Vla0Z1bmMgPT0gTlVMTCB8fCBpbnB1dEZpbGVEZXNjIDwgMCB8fAorICAgICAgICBvdXRwdXRGaWxlRGVzYyA8IDApIHsKKyAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX0ludmFsaWRBcmd1bWVudDsKKyAgICB9IGVsc2UgeworICAgICAgICBjaGFyICpwUmVhZEJ1ZmZlciA9IG1hbGxvYyhSRUFEX0JVRkZFUl9TSVpFKTsKKyAgICAgICAgaWYgKHBSZWFkQnVmZmVyID09IE5VTEwpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19PdXRPZk1lbW9yeTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGludCBzZXNzaW9uSWQ7CisgICAgICAgICAgICBGd2RMb2NrQ29udl9PdXRwdXRfdCBvdXRwdXQ7CisgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9PcGVuU2Vzc2lvbigmc2Vzc2lvbklkLCAmb3V0cHV0KTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gRndkTG9ja0NvbnZfU3RhdHVzX09LKSB7CisgICAgICAgICAgICAgICAgc3NpemVfdCBudW1CeXRlc1JlYWQ7CisgICAgICAgICAgICAgICAgRndkTG9ja0NvbnZfU3RhdHVzX3QgY2xvc2VTdGF0dXM7CisgICAgICAgICAgICAgICAgd2hpbGUgKChudW1CeXRlc1JlYWQgPQorICAgICAgICAgICAgICAgICAgICAgICAgZnBSZWFkRnVuYyhpbnB1dEZpbGVEZXNjLCBwUmVhZEJ1ZmZlciwgUkVBRF9CVUZGRVJfU0laRSkpID4gMCkgeworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9Db252ZXJ0RGF0YShzZXNzaW9uSWQsIHBSZWFkQnVmZmVyLCAoc2l6ZV90KW51bUJ5dGVzUmVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dHB1dCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gRndkTG9ja0NvbnZfU3RhdHVzX09LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3V0cHV0LmZyb21Db252ZXJ0RGF0YS5wQnVmZmVyICE9IE5VTEwgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQuZnJvbUNvbnZlcnREYXRhLm51bUJ5dGVzID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzaXplX3QgbnVtQnl0ZXNXcml0dGVuID0gZnBXcml0ZUZ1bmMob3V0cHV0RmlsZURlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQuZnJvbUNvbnZlcnREYXRhLnBCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQuZnJvbUNvbnZlcnREYXRhLm51bUJ5dGVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobnVtQnl0ZXNXcml0dGVuICE9IChzc2l6ZV90KW91dHB1dC5mcm9tQ29udmVydERhdGEubnVtQnl0ZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX0ZpbGVXcml0ZUVycm9yOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IEZ3ZExvY2tDb252X1N0YXR1c19TeW50YXhFcnJvciAmJiBwRXJyb3JQb3MgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwRXJyb3JQb3MgPSBvdXRwdXQuZnJvbUNvbnZlcnREYXRhLmVycm9yUG9zOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IC8vIGVuZCB3aGlsZQorICAgICAgICAgICAgICAgIGlmIChudW1CeXRlc1JlYWQgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19GaWxlUmVhZEVycm9yOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjbG9zZVN0YXR1cyA9IEZ3ZExvY2tDb252X0Nsb3NlU2Vzc2lvbihzZXNzaW9uSWQsICZvdXRwdXQpOworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gRndkTG9ja0NvbnZfU3RhdHVzX09LKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbG9zZVN0YXR1cyAhPSBGd2RMb2NrQ29udl9TdGF0dXNfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbG9zZVN0YXR1cyA9PSBGd2RMb2NrQ29udl9TdGF0dXNfU3ludGF4RXJyb3IgJiYgcEVycm9yUG9zICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcEVycm9yUG9zID0gb3V0cHV0LmZyb21DbG9zZVNlc3Npb24uZXJyb3JQb3M7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBjbG9zZVN0YXR1czsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmcExTZWVrRnVuYyhvdXRwdXRGaWxlRGVzYywgb3V0cHV0LmZyb21DbG9zZVNlc3Npb24uZmlsZU9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRUVLX1NFVCkgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfRmlsZVNlZWtFcnJvcjsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmcFdyaXRlRnVuYyhvdXRwdXRGaWxlRGVzYywgb3V0cHV0LmZyb21DbG9zZVNlc3Npb24uc2lnbmF0dXJlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGV0RfTE9DS19TSUdOQVRVUkVTX1NJWkUpICE9IEZXRF9MT0NLX1NJR05BVFVSRVNfU0laRSkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX0ZpbGVXcml0ZUVycm9yOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZnJlZShwUmVhZEJ1ZmZlcik7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworRndkTG9ja0NvbnZfU3RhdHVzX3QgRndkTG9ja0NvbnZfQ29udmVydEZpbGUoY29uc3QgY2hhciAqcElucHV0RmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpwT3V0cHV0RmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmY2NF90ICpwRXJyb3JQb3MpIHsKKyAgICBGd2RMb2NrQ29udl9TdGF0dXNfdCBzdGF0dXM7CisgICAgaWYgKHBFcnJvclBvcyAhPSBOVUxMKSB7CisgICAgICAgICpwRXJyb3JQb3MgPSBJTlZBTElEX09GRlNFVDsKKyAgICB9CisgICAgaWYgKHBJbnB1dEZpbGVuYW1lID09IE5VTEwgfHwgcE91dHB1dEZpbGVuYW1lID09IE5VTEwpIHsKKyAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX0ludmFsaWRBcmd1bWVudDsKKyAgICB9IGVsc2UgeworICAgICAgICBpbnQgaW5wdXRGaWxlRGVzYyA9IG9wZW4ocElucHV0RmlsZW5hbWUsIE9fUkRPTkxZKTsKKyAgICAgICAgaWYgKGlucHV0RmlsZURlc2MgPCAwKSB7CisgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfRmlsZU5vdEZvdW5kOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW50IG91dHB1dEZpbGVEZXNjID0gb3BlbihwT3V0cHV0RmlsZW5hbWUsIE9fQ1JFQVQgfCBPX1RSVU5DIHwgT19XUk9OTFksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNfSVJVU1IgfCBTX0lXVVNSIHwgU19JUkdSUCB8IFNfSVJPVEgpOworICAgICAgICAgICAgaWYgKG91dHB1dEZpbGVEZXNjIDwgMCkgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19GaWxlQ3JlYXRpb25GYWlsZWQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X0NvbnZlcnRPcGVuRmlsZShpbnB1dEZpbGVEZXNjLCByZWFkLCBvdXRwdXRGaWxlRGVzYywgd3JpdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxzZWVrNjQsIHBFcnJvclBvcyk7CisgICAgICAgICAgICAgICAgaWYgKGNsb3NlKG91dHB1dEZpbGVEZXNjKSA9PSAwICYmIHN0YXR1cyAhPSBGd2RMb2NrQ29udl9TdGF0dXNfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgcmVtb3ZlKHBPdXRwdXRGaWxlbmFtZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgKHZvaWQpY2xvc2UoaW5wdXRGaWxlRGVzYyk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KZGlmZiAtLWdpdCBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svaW50ZXJuYWwtZm9ybWF0L2NvbnZlcnRlci9Gd2RMb2NrQ29udi5oIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9pbnRlcm5hbC1mb3JtYXQvY29udmVydGVyL0Z3ZExvY2tDb252LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTIwYzBjMwotLS0gL2Rldi9udWxsCisrKyBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svaW50ZXJuYWwtZm9ybWF0L2NvbnZlcnRlci9Gd2RMb2NrQ29udi5oCkBAIC0wLDAgKzEsMjgyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfX0ZXRExPQ0tDT05WX0hfXworI2RlZmluZSBfX0ZXRExPQ0tDT05WX0hfXworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworLyoqCisgKiBUaGUgc2l6ZSBvZiB0aGUgZGF0YSBhbmQgaGVhZGVyIHNpZ25hdHVyZXMgY29tYmluZWQuIFRoZSBzaWduYXR1cmVzIGFyZSBhZGphY2VudCB0byBlYWNoIG90aGVyIGluCisgKiB0aGUgcHJvZHVjZWQgb3V0cHV0IGZpbGUuCisgKi8KKyNkZWZpbmUgRldEX0xPQ0tfU0lHTkFUVVJFU19TSVpFICgyICogMjApCisKKy8qKgorICogRGF0YSB0eXBlIGZvciB0aGUgb3V0cHV0IGZyb20gRndkTG9ja0NvbnZfQ29udmVydERhdGEuCisgKi8KK3R5cGVkZWYgc3RydWN0IEZ3ZExvY2tDb252X0NvbnZlcnREYXRhX091dHB1dCB7CisgICAgLy8vIFRoZSBjb252ZXJ0ZWQgZGF0YS4KKyAgICB2b2lkICpwQnVmZmVyOworCisgICAgLy8vIFRoZSBzaXplIG9mIHRoZSBjb252ZXJ0ZWQgZGF0YS4KKyAgICBzaXplX3QgbnVtQnl0ZXM7CisKKyAgICAvLy8gVGhlIGZpbGUgcG9zaXRpb24gd2hlcmUgdGhlIGVycm9yIG9jY3VycmVkLCBpbiB0aGUgY2FzZSBvZiBhIHN5bnRheCBlcnJvci4KKyAgICBvZmY2NF90IGVycm9yUG9zOworfSBGd2RMb2NrQ29udl9Db252ZXJ0RGF0YV9PdXRwdXRfdDsKKworLyoqCisgKiBEYXRhIHR5cGUgZm9yIHRoZSBvdXRwdXQgZnJvbSBGd2RMb2NrQ29udl9DbG9zZVNlc3Npb24uCisgKi8KK3R5cGVkZWYgc3RydWN0IEZ3ZExvY2tDb252X0Nsb3NlU2Vzc2lvbl9PdXRwdXQgeworICAgIC8vLyBUaGUgZmluYWwgc2V0IG9mIHNpZ25hdHVyZXMuCisgICAgdW5zaWduZWQgY2hhciBzaWduYXR1cmVzW0ZXRF9MT0NLX1NJR05BVFVSRVNfU0laRV07CisKKyAgICAvLy8gVGhlIG9mZnNldCBpbiB0aGUgcHJvZHVjZWQgb3V0cHV0IGZpbGUgd2hlcmUgdGhlIHNpZ25hdHVyZXMgYXJlIGxvY2F0ZWQuCisgICAgb2ZmNjRfdCBmaWxlT2Zmc2V0OworCisgICAgLy8vIFRoZSBmaWxlIHBvc2l0aW9uIHdoZXJlIHRoZSBlcnJvciBvY2N1cnJlZCwgaW4gdGhlIGNhc2Ugb2YgYSBzeW50YXggZXJyb3IuCisgICAgb2ZmNjRfdCBlcnJvclBvczsKK30gRndkTG9ja0NvbnZfQ2xvc2VTZXNzaW9uX091dHB1dF90OworCisvKioKKyAqIERhdGEgdHlwZSBmb3IgdGhlIG91dHB1dCBmcm9tIHRoZSBjb252ZXJzaW9uIHByb2Nlc3MuCisgKi8KK3R5cGVkZWYgdW5pb24gRndkTG9ja0NvbnZfT3V0cHV0IHsKKyAgICBGd2RMb2NrQ29udl9Db252ZXJ0RGF0YV9PdXRwdXRfdCBmcm9tQ29udmVydERhdGE7CisgICAgRndkTG9ja0NvbnZfQ2xvc2VTZXNzaW9uX091dHB1dF90IGZyb21DbG9zZVNlc3Npb247Cit9IEZ3ZExvY2tDb252X091dHB1dF90OworCisvKioKKyAqIERhdGEgdHlwZSBmb3IgdGhlIFBvc2l4LXN0eWxlIHJlYWQgZnVuY3Rpb24gdXNlZCBieSB0aGUgY29udmVydGVyIGluIHB1bGwgbW9kZS4KKyAqCisgKiBAcGFyYW1baW5dIGZpbGVEZXNjIFRoZSBmaWxlIGRlc2NyaXB0b3Igb2YgYSBmaWxlIG9wZW5lZCBmb3IgcmVhZGluZy4KKyAqIEBwYXJhbVtvdXRdIHBCdWZmZXIgQSByZWZlcmVuY2UgdG8gdGhlIGJ1ZmZlciB0aGF0IHNob3VsZCByZWNlaXZlIHRoZSByZWFkIGRhdGEuCisgKiBAcGFyYW1baW5dIG51bUJ5dGVzIFRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZC4KKyAqCisgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZC4KKyAqIEByZXR2YWwgLTEgRmFpbHVyZS4KKyAqLwordHlwZWRlZiBzc2l6ZV90IEZ3ZExvY2tDb252X1JlYWRGdW5jX3QoaW50IGZpbGVEZXNjLCB2b2lkICpwQnVmZmVyLCBzaXplX3QgbnVtQnl0ZXMpOworCisvKioKKyAqIERhdGEgdHlwZSBmb3IgdGhlIFBvc2l4LXN0eWxlIHdyaXRlIGZ1bmN0aW9uIHVzZWQgYnkgdGhlIGNvbnZlcnRlciBpbiBwdWxsIG1vZGUuCisgKgorICogQHBhcmFtW2luXSBmaWxlRGVzYyBUaGUgZmlsZSBkZXNjcmlwdG9yIG9mIGEgZmlsZSBvcGVuZWQgZm9yIHdyaXRpbmcuCisgKiBAcGFyYW1baW5dIHBCdWZmZXIgQSByZWZlcmVuY2UgdG8gdGhlIGJ1ZmZlciBjb250YWluaW5nIHRoZSBkYXRhIHRvIGJlIHdyaXR0ZW4uCisgKiBAcGFyYW1baW5dIG51bUJ5dGVzIFRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gd3JpdGUuCisgKgorICogQHJldHVybiBUaGUgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4uCisgKiBAcmV0dmFsIC0xIEZhaWx1cmUuCisgKi8KK3R5cGVkZWYgc3NpemVfdCBGd2RMb2NrQ29udl9Xcml0ZUZ1bmNfdChpbnQgZmlsZURlc2MsIGNvbnN0IHZvaWQgKnBCdWZmZXIsIHNpemVfdCBudW1CeXRlcyk7CisKKy8qKgorICogRGF0YSB0eXBlIGZvciB0aGUgUG9zaXgtc3R5bGUgbHNlZWsgZnVuY3Rpb24gdXNlZCBieSB0aGUgY29udmVydGVyIGluIHB1bGwgbW9kZS4KKyAqCisgKiBAcGFyYW1baW5dIGZpbGVEZXNjIFRoZSBmaWxlIGRlc2NyaXB0b3Igb2YgYSBmaWxlIG9wZW5lZCBmb3Igd3JpdGluZy4KKyAqIEBwYXJhbVtpbl0gb2Zmc2V0IFRoZSBvZmZzZXQgd2l0aCB3aGljaCB0byB1cGRhdGUgdGhlIGZpbGUgcG9zaXRpb24uCisgKiBAcGFyYW1baW5dIHdoZW5jZSBPbmUgb2YgU0VFS19TRVQsIFNFRUtfQ1VSLCBhbmQgU0VFS19FTkQuCisgKgorICogQHJldHVybiBUaGUgbmV3IGZpbGUgcG9zaXRpb24uCisgKiBAcmV0dmFsICgob2ZmNjRfdCktMSkgRmFpbHVyZS4KKyAqLwordHlwZWRlZiBvZmY2NF90IEZ3ZExvY2tDb252X0xTZWVrRnVuY190KGludCBmaWxlRGVzYywgb2ZmNjRfdCBvZmZzZXQsIGludCB3aGVuY2UpOworCisvKioKKyAqIFRoZSBzdGF0dXMgY29kZXMgcmV0dXJuZWQgYnkgdGhlIGNvbnZlcnRlciBmdW5jdGlvbnMuCisgKi8KK3R5cGVkZWYgZW51bSBGd2RMb2NrQ29udl9TdGF0dXMgeworICAgIC8vLyBUaGUgb3BlcmF0aW9uIHdhcyBzdWNjZXNzZnVsLgorICAgIEZ3ZExvY2tDb252X1N0YXR1c19PSyA9IDAsCisKKyAgICAvLy8gQW4gYWN0dWFsIGFyZ3VtZW50IHRvIHRoZSBmdW5jdGlvbiBpcyBpbnZhbGlkIChhIHByb2dyYW0gZXJyb3Igb24gdGhlIGNhbGxlcidzIHBhcnQpLgorICAgIEZ3ZExvY2tDb252X1N0YXR1c19JbnZhbGlkQXJndW1lbnQgPSAxLAorCisgICAgLy8vIFRoZXJlIGlzIG5vdCBlbm91Z2ggZnJlZSBkeW5hbWljIG1lbW9yeSB0byBjb21wbGV0ZSB0aGUgb3BlcmF0aW9uLgorICAgIEZ3ZExvY2tDb252X1N0YXR1c19PdXRPZk1lbW9yeSA9IDIsCisKKyAgICAvLy8gQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgb3BlbmluZyB0aGUgaW5wdXQgZmlsZS4KKyAgICBGd2RMb2NrQ29udl9TdGF0dXNfRmlsZU5vdEZvdW5kID0gMywKKworICAgIC8vLyBBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBjcmVhdGluZyB0aGUgb3V0cHV0IGZpbGUuCisgICAgRndkTG9ja0NvbnZfU3RhdHVzX0ZpbGVDcmVhdGlvbkZhaWxlZCA9IDQsCisKKyAgICAvLy8gQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgcmVhZGluZyBmcm9tIHRoZSBpbnB1dCBmaWxlLgorICAgIEZ3ZExvY2tDb252X1N0YXR1c19GaWxlUmVhZEVycm9yID0gNSwKKworICAgIC8vLyBBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSB3cml0aW5nIHRvIHRoZSBvdXRwdXQgZmlsZS4KKyAgICBGd2RMb2NrQ29udl9TdGF0dXNfRmlsZVdyaXRlRXJyb3IgPSA2LAorCisgICAgLy8vIEFuIGVycm9yIG9jY3VycmVkIHdoaWxlIHNlZWtpbmcgdG8gYSBuZXcgZmlsZSBwb3NpdGlvbiB3aXRoaW4gdGhlIG91dHB1dCBmaWxlLgorICAgIEZ3ZExvY2tDb252X1N0YXR1c19GaWxlU2Vla0Vycm9yID0gNywKKworICAgIC8vLyBUaGUgaW5wdXQgZmlsZSBpcyBub3QgYSBzeW50YWN0aWNhbGx5IGNvcnJlY3QgT01BIERSTSB2MSBGb3J3YXJkIExvY2sgZmlsZS4KKyAgICBGd2RMb2NrQ29udl9TdGF0dXNfU3ludGF4RXJyb3IgPSA4LAorCisgICAgLy8vIFN1cHBvcnQgZm9yIHRoaXMgRFJNIGZpbGUgZm9ybWF0IGhhcyBiZWVuIGRpc2FibGVkIGluIHRoZSBjdXJyZW50IHByb2R1Y3QgY29uZmlndXJhdGlvbi4KKyAgICBGd2RMb2NrQ29udl9TdGF0dXNfVW5zdXBwb3J0ZWRGaWxlRm9ybWF0ID0gOSwKKworICAgIC8vLyBUaGUgY29udGVudCB0cmFuc2ZlciBlbmNvZGluZyBpcyBub3Qgb25lIG9mICJiaW5hcnkiLCAiYmFzZTY0IiwgIjdiaXQiLCBvciAiOGJpdCIKKyAgICAvLy8gKGNhc2UtaW5zZW5zaXRpdmUpLgorICAgIEZ3ZExvY2tDb252X1N0YXR1c19VbnN1cHBvcnRlZENvbnRlbnRUcmFuc2ZlckVuY29kaW5nID0gMTAsCisKKyAgICAvLy8gVGhlIGdlbmVyYXRpb24gb2YgYSByYW5kb20gbnVtYmVyIGZhaWxlZC4KKyAgICBGd2RMb2NrQ29udl9TdGF0dXNfUmFuZG9tTnVtYmVyR2VuZXJhdGlvbkZhaWxlZCA9IDExLAorCisgICAgLy8vIEtleSBlbmNyeXB0aW9uIGZhaWxlZC4KKyAgICBGd2RMb2NrQ29udl9TdGF0dXNfS2V5RW5jcnlwdGlvbkZhaWxlZCA9IDEyLAorCisgICAgLy8vIFRoZSBjYWxjdWxhdGlvbiBvZiBhIGtleWVkIGhhc2ggZm9yIGludGVncml0eSBwcm90ZWN0aW9uIGZhaWxlZC4KKyAgICBGd2RMb2NrQ29udl9TdGF0dXNfSW50ZWdyaXR5UHJvdGVjdGlvbkZhaWxlZCA9IDEzLAorCisgICAgLy8vIFRoZXJlIGFyZSB0b28gbWFueSBvbmdvaW5nIHNlc3Npb25zIGZvciBhbm90aGVyIG9uZSB0byBiZSBvcGVuZWQuCisgICAgRndkTG9ja0NvbnZfU3RhdHVzX1Rvb01hbnlTZXNzaW9ucyA9IDE0LAorCisgICAgLy8vIEFuIHVuZXhwZWN0ZWQgZXJyb3Igb2NjdXJyZWQuCisgICAgRndkTG9ja0NvbnZfU3RhdHVzX1Byb2dyYW1FcnJvciA9IDE1Cit9IEZ3ZExvY2tDb252X1N0YXR1c190OworCisvKioKKyAqIE9wZW5zIGEgc2Vzc2lvbiBmb3IgY29udmVydGluZyBhbiBPTUEgRFJNIHYxIEZvcndhcmQgTG9jayBmaWxlIHRvIHRoZSBpbnRlcm5hbCBGb3J3YXJkIExvY2sgZmlsZQorICogZm9ybWF0LgorICoKKyAqIEBwYXJhbVtvdXRdIHBTZXNzaW9uSWQgVGhlIHNlc3Npb24gSUQuCisgKiBAcGFyYW1bb3V0XSBwT3V0cHV0IFRoZSBvdXRwdXQgZnJvbSB0aGUgY29udmVyc2lvbiBwcm9jZXNzIChpbml0aWFsaXplZCkuCisgKgorICogQHJldHVybiBBIHN0YXR1cyBjb2RlLgorICogQHJldHZhbCBGd2RMb2NrQ29udl9TdGF0dXNfT0sKKyAqIEByZXR2YWwgRndkTG9ja0NvbnZfU3RhdHVzX0ludmFsaWRBcmd1bWVudAorICogQHJldHZhbCBGd2RMb2NrQ29udl9TdGF0dXNfVG9vTWFueVNlc3Npb25zCisgKi8KK0Z3ZExvY2tDb252X1N0YXR1c190IEZ3ZExvY2tDb252X09wZW5TZXNzaW9uKGludCAqcFNlc3Npb25JZCwgRndkTG9ja0NvbnZfT3V0cHV0X3QgKnBPdXRwdXQpOworCisvKioKKyAqIFN1cHBsaWVzIHRoZSBjb252ZXJ0ZXIgd2l0aCBkYXRhIHRvIGNvbnZlcnQuIFRoZSBjYWxsZXIgaXMgZXhwZWN0ZWQgdG8gd3JpdGUgdGhlIGNvbnZlcnRlZCBkYXRhCisgKiB0byBmaWxlLiBDYW4gYmUgY2FsbGVkIGFuIGFyYml0cmFyeSBudW1iZXIgb2YgdGltZXMuCisgKgorICogQHBhcmFtW2luXSBzZXNzaW9uSWQgVGhlIHNlc3Npb24gSUQuCisgKiBAcGFyYW1baW5dIHBCdWZmZXIgQSByZWZlcmVuY2UgdG8gYSBidWZmZXIgY29udGFpbmluZyB0aGUgZGF0YSB0byBjb252ZXJ0LgorICogQHBhcmFtW2luXSBudW1CeXRlcyBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGNvbnZlcnQuCisgKiBAcGFyYW1baW4sb3V0XSBwT3V0cHV0IFRoZSBvdXRwdXQgZnJvbSB0aGUgY29udmVyc2lvbiBwcm9jZXNzIChhbGxvY2F0ZWQvcmVhbGxvY2F0ZWQpLgorICoKKyAqIEByZXR1cm4gQSBzdGF0dXMgY29kZS4KKyAqIEByZXR2YWwgRndkTG9ja0NvbnZfU3RhdHVzX09LCisgKiBAcmV0dmFsIEZ3ZExvY2tDb252X1N0YXR1c19JbnZhbGlkQXJndW1lbnQKKyAqIEByZXR2YWwgRndkTG9ja0NvbnZfU3RhdHVzX091dE9mTWVtb3J5CisgKiBAcmV0dmFsIEZ3ZExvY2tDb252X1N0YXR1c19TeW50YXhFcnJvcgorICogQHJldHZhbCBGd2RMb2NrQ29udl9TdGF0dXNfVW5zdXBwb3J0ZWRGaWxlRm9ybWF0CisgKiBAcmV0dmFsIEZ3ZExvY2tDb252X1N0YXR1c19VbnN1cHBvcnRlZENvbnRlbnRUcmFuc2ZlckVuY29kaW5nCisgKiBAcmV0dmFsIEZ3ZExvY2tDb252X1N0YXR1c19SYW5kb21OdW1iZXJHZW5lcmF0aW9uRmFpbGVkCisgKiBAcmV0dmFsIEZ3ZExvY2tDb252X1N0YXR1c19LZXlFbmNyeXB0aW9uRmFpbGVkCisgKiBAcmV0dmFsIEZ3ZExvY2tDb252X1N0YXR1c19EYXRhRW5jcnlwdGlvbkZhaWxlZAorICovCitGd2RMb2NrQ29udl9TdGF0dXNfdCBGd2RMb2NrQ29udl9Db252ZXJ0RGF0YShpbnQgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqcEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBudW1CeXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZ3ZExvY2tDb252X091dHB1dF90ICpwT3V0cHV0KTsKKworLyoqCisgKiBDbG9zZXMgYSBzZXNzaW9uIGZvciBjb252ZXJ0aW5nIGFuIE9NQSBEUk0gdjEgRm9yd2FyZCBMb2NrIGZpbGUgdG8gdGhlIGludGVybmFsIEZvcndhcmQgTG9jaworICogZmlsZSBmb3JtYXQuIFRoZSBjYWxsZXIgbXVzdCB1cGRhdGUgdGhlIHByb2R1Y2VkIG91dHB1dCBmaWxlIGF0IHRoZSBpbmRpY2F0ZWQgZmlsZSBvZmZzZXQgd2l0aAorICogdGhlIGZpbmFsIHNldCBvZiBzaWduYXR1cmVzLgorICoKKyAqIEBwYXJhbVtpbl0gc2Vzc2lvbklkIFRoZSBzZXNzaW9uIElELgorICogQHBhcmFtW2luLG91dF0gcE91dHB1dCBUaGUgb3V0cHV0IGZyb20gdGhlIGNvbnZlcnNpb24gcHJvY2VzcyAoZGVhbGxvY2F0ZWQgYW5kIG92ZXJ3cml0dGVuKS4KKyAqCisgKiBAcmV0dXJuIEEgc3RhdHVzIGNvZGUuCisgKiBAcmV0dmFsIEZ3ZExvY2tDb252X1N0YXR1c19PSworICogQHJldHZhbCBGd2RMb2NrQ29udl9TdGF0dXNfSW52YWxpZEFyZ3VtZW50CisgKiBAcmV0dmFsIEZ3ZExvY2tDb252X1N0YXR1c19PdXRPZk1lbW9yeQorICogQHJldHZhbCBGd2RMb2NrQ29udl9TdGF0dXNfSW50ZWdyaXR5UHJvdGVjdGlvbkZhaWxlZAorICovCitGd2RMb2NrQ29udl9TdGF0dXNfdCBGd2RMb2NrQ29udl9DbG9zZVNlc3Npb24oaW50IHNlc3Npb25JZCwgRndkTG9ja0NvbnZfT3V0cHV0X3QgKnBPdXRwdXQpOworCisvKioKKyAqIENvbnZlcnRzIGFuIG9wZW4gT01BIERSTSB2MSBGb3J3YXJkIExvY2sgZmlsZSB0byB0aGUgaW50ZXJuYWwgRm9yd2FyZCBMb2NrIGZpbGUgZm9ybWF0IGluIHB1bGwKKyAqIG1vZGUuCisgKgorICogQHBhcmFtW2luXSBpbnB1dEZpbGVEZXNjIFRoZSBmaWxlIGRlc2NyaXB0b3Igb2YgdGhlIG9wZW4gaW5wdXQgZmlsZS4KKyAqIEBwYXJhbVtpbl0gZnBSZWFkRnVuYyBBIHJlZmVyZW5jZSB0byBhIHJlYWQgZnVuY3Rpb24gdGhhdCBjYW4gb3BlcmF0ZSBvbiB0aGUgb3BlbiBpbnB1dCBmaWxlLgorICogQHBhcmFtW2luXSBvdXRwdXRGaWxlRGVzYyBUaGUgZmlsZSBkZXNjcmlwdG9yIG9mIHRoZSBvcGVuIG91dHB1dCBmaWxlLgorICogQHBhcmFtW2luXSBmcFdyaXRlRnVuYyBBIHJlZmVyZW5jZSB0byBhIHdyaXRlIGZ1bmN0aW9uIHRoYXQgY2FuIG9wZXJhdGUgb24gdGhlIG9wZW4gb3V0cHV0IGZpbGUuCisgKiBAcGFyYW1baW5dIGZwTFNlZWtGdW5jIEEgcmVmZXJlbmNlIHRvIGFuIGxzZWVrIGZ1bmN0aW9uIHRoYXQgY2FuIG9wZXJhdGUgb24gdGhlIG9wZW4gb3V0cHV0IGZpbGUuCisgKiBAcGFyYW1bb3V0XSBwRXJyb3JQb3MKKyAqICAgVGhlIGZpbGUgcG9zaXRpb24gd2hlcmUgdGhlIGVycm9yIG9jY3VycmVkLCBpbiB0aGUgY2FzZSBvZiBhIHN5bnRheCBlcnJvci4gTWF5IGJlIE5VTEwuCisgKgorICogQHJldHVybiBBIHN0YXR1cyBjb2RlLgorICogQHJldHZhbCBGd2RMb2NrQ29udl9TdGF0dXNfT0sKKyAqIEByZXR2YWwgRndkTG9ja0NvbnZfU3RhdHVzX0ludmFsaWRBcmd1bWVudAorICogQHJldHZhbCBGd2RMb2NrQ29udl9TdGF0dXNfT3V0T2ZNZW1vcnkKKyAqIEByZXR2YWwgRndkTG9ja0NvbnZfU3RhdHVzX0ZpbGVSZWFkRXJyb3IKKyAqIEByZXR2YWwgRndkTG9ja0NvbnZfU3RhdHVzX0ZpbGVXcml0ZUVycm9yCisgKiBAcmV0dmFsIEZ3ZExvY2tDb252X1N0YXR1c19GaWxlU2Vla0Vycm9yCisgKiBAcmV0dmFsIEZ3ZExvY2tDb252X1N0YXR1c19TeW50YXhFcnJvcgorICogQHJldHZhbCBGd2RMb2NrQ29udl9TdGF0dXNfVW5zdXBwb3J0ZWRGaWxlRm9ybWF0CisgKiBAcmV0dmFsIEZ3ZExvY2tDb252X1N0YXR1c19VbnN1cHBvcnRlZENvbnRlbnRUcmFuc2ZlckVuY29kaW5nCisgKiBAcmV0dmFsIEZ3ZExvY2tDb252X1N0YXR1c19SYW5kb21OdW1iZXJHZW5lcmF0aW9uRmFpbGVkCisgKiBAcmV0dmFsIEZ3ZExvY2tDb252X1N0YXR1c19LZXlFbmNyeXB0aW9uRmFpbGVkCisgKiBAcmV0dmFsIEZ3ZExvY2tDb252X1N0YXR1c19EYXRhRW5jcnlwdGlvbkZhaWxlZAorICogQHJldHZhbCBGd2RMb2NrQ29udl9TdGF0dXNfSW50ZWdyaXR5UHJvdGVjdGlvbkZhaWxlZAorICogQHJldHZhbCBGd2RMb2NrQ29udl9TdGF0dXNfVG9vTWFueVNlc3Npb25zCisgKi8KK0Z3ZExvY2tDb252X1N0YXR1c190IEZ3ZExvY2tDb252X0NvbnZlcnRPcGVuRmlsZShpbnQgaW5wdXRGaWxlRGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGd2RMb2NrQ29udl9SZWFkRnVuY190ICpmcFJlYWRGdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvdXRwdXRGaWxlRGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGd2RMb2NrQ29udl9Xcml0ZUZ1bmNfdCAqZnBXcml0ZUZ1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRndkTG9ja0NvbnZfTFNlZWtGdW5jX3QgKmZwTFNlZWtGdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZjY0X3QgKnBFcnJvclBvcyk7CisKKy8qKgorICogQ29udmVydHMgYW4gT01BIERSTSB2MSBGb3J3YXJkIExvY2sgZmlsZSB0byB0aGUgaW50ZXJuYWwgRm9yd2FyZCBMb2NrIGZpbGUgZm9ybWF0IGluIHB1bGwgbW9kZS4KKyAqCisgKiBAcGFyYW1baW5dIHBJbnB1dEZpbGVuYW1lIEEgcmVmZXJlbmNlIHRvIHRoZSBpbnB1dCBmaWxlbmFtZS4KKyAqIEBwYXJhbVtpbl0gcE91dHB1dEZpbGVuYW1lIEEgcmVmZXJlbmNlIHRvIHRoZSBvdXRwdXQgZmlsZW5hbWUuCisgKiBAcGFyYW1bb3V0XSBwRXJyb3JQb3MKKyAqICAgVGhlIGZpbGUgcG9zaXRpb24gd2hlcmUgdGhlIGVycm9yIG9jY3VycmVkLCBpbiB0aGUgY2FzZSBvZiBhIHN5bnRheCBlcnJvci4gTWF5IGJlIE5VTEwuCisgKgorICogQHJldHVybiBBIHN0YXR1cyBjb2RlLgorICogQHJldHZhbCBGd2RMb2NrQ29udl9TdGF0dXNfT0sKKyAqIEByZXR2YWwgRndkTG9ja0NvbnZfU3RhdHVzX0ludmFsaWRBcmd1bWVudAorICogQHJldHZhbCBGd2RMb2NrQ29udl9TdGF0dXNfT3V0T2ZNZW1vcnkKKyAqIEByZXR2YWwgRndkTG9ja0NvbnZfU3RhdHVzX0ZpbGVOb3RGb3VuZAorICogQHJldHZhbCBGd2RMb2NrQ29udl9TdGF0dXNfRmlsZUNyZWF0aW9uRmFpbGVkCisgKiBAcmV0dmFsIEZ3ZExvY2tDb252X1N0YXR1c19GaWxlUmVhZEVycm9yCisgKiBAcmV0dmFsIEZ3ZExvY2tDb252X1N0YXR1c19GaWxlV3JpdGVFcnJvcgorICogQHJldHZhbCBGd2RMb2NrQ29udl9TdGF0dXNfRmlsZVNlZWtFcnJvcgorICogQHJldHZhbCBGd2RMb2NrQ29udl9TdGF0dXNfU3ludGF4RXJyb3IKKyAqIEByZXR2YWwgRndkTG9ja0NvbnZfU3RhdHVzX1Vuc3VwcG9ydGVkRmlsZUZvcm1hdAorICogQHJldHZhbCBGd2RMb2NrQ29udl9TdGF0dXNfVW5zdXBwb3J0ZWRDb250ZW50VHJhbnNmZXJFbmNvZGluZworICogQHJldHZhbCBGd2RMb2NrQ29udl9TdGF0dXNfUmFuZG9tTnVtYmVyR2VuZXJhdGlvbkZhaWxlZAorICogQHJldHZhbCBGd2RMb2NrQ29udl9TdGF0dXNfS2V5RW5jcnlwdGlvbkZhaWxlZAorICogQHJldHZhbCBGd2RMb2NrQ29udl9TdGF0dXNfRGF0YUVuY3J5cHRpb25GYWlsZWQKKyAqIEByZXR2YWwgRndkTG9ja0NvbnZfU3RhdHVzX0ludGVncml0eVByb3RlY3Rpb25GYWlsZWQKKyAqIEByZXR2YWwgRndkTG9ja0NvbnZfU3RhdHVzX1Rvb01hbnlTZXNzaW9ucworICovCitGd2RMb2NrQ29udl9TdGF0dXNfdCBGd2RMb2NrQ29udl9Db252ZXJ0RmlsZShjb25zdCBjaGFyICpwSW5wdXRGaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnBPdXRwdXRGaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZjY0X3QgKnBFcnJvclBvcyk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvLyBfX0ZXRExPQ0tDT05WX0hfXwpkaWZmIC0tZ2l0IGEvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9pbnRlcm5hbC1mb3JtYXQvZGVjb2Rlci9BbmRyb2lkLm1rIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9pbnRlcm5hbC1mb3JtYXQvZGVjb2Rlci9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2MjVlZGYKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9kZWNvZGVyL0FuZHJvaWQubWsKQEAgLTAsMCArMSwzNyBAQAorIworIyBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKK0xPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSBcCisgICAgRndkTG9ja0ZpbGUuYworCitMT0NBTF9DX0lOQ0xVREVTIDo9IFwKKyAgICBmcmFtZXdvcmtzL2Jhc2UvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9pbnRlcm5hbC1mb3JtYXQvY29tbW9uIFwKKyAgICBleHRlcm5hbC9vcGVuc3NsL2luY2x1ZGUKKworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJjcnlwdG8KKworTE9DQUxfV0hPTEVfU1RBVElDX0xJQlJBUklFUyA6PSBsaWJmd2Rsb2NrLWNvbW1vbgorCitMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IGxpYmZ3ZGxvY2stY29tbW9uCisKK0xPQ0FMX01PRFVMRSA6PSBsaWJmd2Rsb2NrLWRlY29kZXIKKworTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKKworaW5jbHVkZSAkKEJVSUxEX1NUQVRJQ19MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9pbnRlcm5hbC1mb3JtYXQvZGVjb2Rlci9Gd2RMb2NrRmlsZS5jIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9pbnRlcm5hbC1mb3JtYXQvZGVjb2Rlci9Gd2RMb2NrRmlsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4Mjg0ZTcyCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9pbnRlcm5hbC1mb3JtYXQvZGVjb2Rlci9Gd2RMb2NrRmlsZS5jCkBAIC0wLDAgKzEsNDQ3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9hZXMuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2htYWMuaD4KKworI2luY2x1ZGUgIkZ3ZExvY2tGaWxlLmgiCisjaW5jbHVkZSAiRndkTG9ja0dsdWUuaCIKKworI2RlZmluZSBUUlVFIDEKKyNkZWZpbmUgRkFMU0UgMAorCisjZGVmaW5lIElOVkFMSURfT0ZGU0VUICgob2ZmNjRfdCktMSkKKworI2RlZmluZSBJTlZBTElEX0JMT0NLX0lOREVYICgodWludDY0X3QpLTEpCisKKyNkZWZpbmUgTUFYX05VTV9TRVNTSU9OUyAxMjgKKworI2RlZmluZSBLRVlfU0laRSBBRVNfQkxPQ0tfU0laRQorI2RlZmluZSBLRVlfU0laRV9JTl9CSVRTIChLRVlfU0laRSAqIDgpCisKKyNkZWZpbmUgU0hBMV9IQVNIX1NJWkUgMjAKKyNkZWZpbmUgU0hBMV9CTE9DS19TSVpFIDY0CisKKyNkZWZpbmUgRldEX0xPQ0tfVkVSU0lPTiAwCisjZGVmaW5lIEZXRF9MT0NLX1NVQkZPUk1BVCAwCisjZGVmaW5lIFVTQUdFX1JFU1RSSUNUSU9OX0ZMQUdTIDAKKyNkZWZpbmUgQ09OVEVOVF9UWVBFX0xFTkdUSF9QT1MgNworI2RlZmluZSBUT1BfSEVBREVSX1NJWkUgOAorCisjZGVmaW5lIFNJR19DQUxDX0JVRkZFUl9TSVpFICgxNiAqIFNIQTFfQkxPQ0tfU0laRSkKKworLyoqCisgKiBEYXRhIHR5cGUgZm9yIHRoZSBwZXItZmlsZSBzdGF0ZSBpbmZvcm1hdGlvbiBuZWVkZWQgYnkgdGhlIGRlY29kZXIuCisgKi8KK3R5cGVkZWYgc3RydWN0IEZ3ZExvY2tGaWxlX1Nlc3Npb24geworICAgIGludCBmaWxlRGVzYzsKKyAgICB1bnNpZ25lZCBjaGFyIHRvcEhlYWRlcltUT1BfSEVBREVSX1NJWkVdOworICAgIGNoYXIgKnBDb250ZW50VHlwZTsKKyAgICBzaXplX3QgY29udGVudFR5cGVMZW5ndGg7CisgICAgdm9pZCAqcEVuY3J5cHRlZFNlc3Npb25LZXk7CisgICAgc2l6ZV90IGVuY3J5cHRlZFNlc3Npb25LZXlMZW5ndGg7CisgICAgdW5zaWduZWQgY2hhciBkYXRhU2lnbmF0dXJlW1NIQTFfSEFTSF9TSVpFXTsKKyAgICB1bnNpZ25lZCBjaGFyIGhlYWRlclNpZ25hdHVyZVtTSEExX0hBU0hfU0laRV07CisgICAgb2ZmNjRfdCBkYXRhT2Zmc2V0OworICAgIG9mZjY0X3QgZmlsZVBvczsKKyAgICBBRVNfS0VZIGVuY3J5cHRpb25Sb3VuZEtleXM7CisgICAgSE1BQ19DVFggc2lnbmluZ0NvbnRleHQ7CisgICAgdW5zaWduZWQgY2hhciBrZXlTdHJlYW1bQUVTX0JMT0NLX1NJWkVdOworICAgIHVpbnQ2NF90IGJsb2NrSW5kZXg7Cit9IEZ3ZExvY2tGaWxlX1Nlc3Npb25fdDsKKworc3RhdGljIEZ3ZExvY2tGaWxlX1Nlc3Npb25fdCAqc2Vzc2lvblB0cnNbTUFYX05VTV9TRVNTSU9OU10gPSB7IE5VTEwgfTsKKworc3RhdGljIHB0aHJlYWRfbXV0ZXhfdCBzZXNzaW9uQWNxdWlzaXRpb25NdXRleCA9IFBUSFJFQURfTVVURVhfSU5JVElBTElaRVI7CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHRvcEhlYWRlclRlbXBsYXRlW10gPQorICAgIHsgJ0YnLCAnVycsICdMJywgJ0snLCBGV0RfTE9DS19WRVJTSU9OLCBGV0RfTE9DS19TVUJGT1JNQVQsIFVTQUdFX1JFU1RSSUNUSU9OX0ZMQUdTIH07CisKKy8qKgorICogQWNxdWlyZXMgYW4gdW51c2VkIGZpbGUgc2Vzc2lvbiBmb3IgdGhlIGdpdmVuIGZpbGUgZGVzY3JpcHRvci4KKyAqCisgKiBAcGFyYW1baW5dIGZpbGVEZXNjIEEgZmlsZSBkZXNjcmlwdG9yLgorICoKKyAqIEByZXR1cm4gQSBzZXNzaW9uIElELgorICovCitzdGF0aWMgaW50IEZ3ZExvY2tGaWxlX0FjcXVpcmVTZXNzaW9uKGludCBmaWxlRGVzYykgeworICAgIGludCBzZXNzaW9uSWQgPSAtMTsKKyAgICBpZiAoZmlsZURlc2MgPCAwKSB7CisgICAgICAgIGVycm5vID0gRUJBREY7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW50IGk7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmc2Vzc2lvbkFjcXVpc2l0aW9uTXV0ZXgpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX05VTV9TRVNTSU9OUzsgKytpKSB7CisgICAgICAgICAgICBpbnQgY2FuZGlkYXRlU2Vzc2lvbklkID0gKGZpbGVEZXNjICsgaSkgJSBNQVhfTlVNX1NFU1NJT05TOworICAgICAgICAgICAgaWYgKHNlc3Npb25QdHJzW2NhbmRpZGF0ZVNlc3Npb25JZF0gPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHNlc3Npb25QdHJzW2NhbmRpZGF0ZVNlc3Npb25JZF0gPSBtYWxsb2Moc2l6ZW9mICoqc2Vzc2lvblB0cnMpOworICAgICAgICAgICAgICAgIGlmIChzZXNzaW9uUHRyc1tjYW5kaWRhdGVTZXNzaW9uSWRdICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgc2Vzc2lvblB0cnNbY2FuZGlkYXRlU2Vzc2lvbklkXS0+ZmlsZURlc2MgPSBmaWxlRGVzYzsKKyAgICAgICAgICAgICAgICAgICAgc2Vzc2lvblB0cnNbY2FuZGlkYXRlU2Vzc2lvbklkXS0+cENvbnRlbnRUeXBlID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgc2Vzc2lvblB0cnNbY2FuZGlkYXRlU2Vzc2lvbklkXS0+cEVuY3J5cHRlZFNlc3Npb25LZXkgPSBOVUxMOworICAgICAgICAgICAgICAgICAgICBzZXNzaW9uSWQgPSBjYW5kaWRhdGVTZXNzaW9uSWQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZzZXNzaW9uQWNxdWlzaXRpb25NdXRleCk7CisgICAgICAgIGlmIChpID09IE1BWF9OVU1fU0VTU0lPTlMpIHsKKyAgICAgICAgICAgIGVycm5vID0gRU5GSUxFOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBzZXNzaW9uSWQ7Cit9CisKKy8qKgorICogRmluZHMgdGhlIGZpbGUgc2Vzc2lvbiBhc3NvY2lhdGVkIHRvIHRoZSBnaXZlbiBmaWxlIGRlc2NyaXB0b3IuCisgKgorICogQHBhcmFtW2luXSBmaWxlRGVzYyBBIGZpbGUgZGVzY3JpcHRvci4KKyAqCisgKiBAcmV0dXJuIEEgc2Vzc2lvbiBJRC4KKyAqLworc3RhdGljIGludCBGd2RMb2NrRmlsZV9GaW5kU2Vzc2lvbihpbnQgZmlsZURlc2MpIHsKKyAgICBpbnQgc2Vzc2lvbklkID0gLTE7CisgICAgaWYgKGZpbGVEZXNjIDwgMCkgeworICAgICAgICBlcnJubyA9IEVCQURGOworICAgIH0gZWxzZSB7CisgICAgICAgIGludCBpOworICAgICAgICBwdGhyZWFkX211dGV4X2xvY2soJnNlc3Npb25BY3F1aXNpdGlvbk11dGV4KTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IE1BWF9OVU1fU0VTU0lPTlM7ICsraSkgeworICAgICAgICAgICAgaW50IGNhbmRpZGF0ZVNlc3Npb25JZCA9IChmaWxlRGVzYyArIGkpICUgTUFYX05VTV9TRVNTSU9OUzsKKyAgICAgICAgICAgIGlmIChzZXNzaW9uUHRyc1tjYW5kaWRhdGVTZXNzaW9uSWRdICE9IE5VTEwgJiYKKyAgICAgICAgICAgICAgICBzZXNzaW9uUHRyc1tjYW5kaWRhdGVTZXNzaW9uSWRdLT5maWxlRGVzYyA9PSBmaWxlRGVzYykgeworICAgICAgICAgICAgICAgIHNlc3Npb25JZCA9IGNhbmRpZGF0ZVNlc3Npb25JZDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmc2Vzc2lvbkFjcXVpc2l0aW9uTXV0ZXgpOworICAgICAgICBpZiAoaSA9PSBNQVhfTlVNX1NFU1NJT05TKSB7CisgICAgICAgICAgICBlcnJubyA9IEVCQURGOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBzZXNzaW9uSWQ7Cit9CisKKy8qKgorICogUmVsZWFzZXMgYSBmaWxlIHNlc3Npb24uCisgKgorICogQHBhcmFtW2luXSBzZXNzaW9uSUQgQSBzZXNzaW9uIElELgorICovCitzdGF0aWMgdm9pZCBGd2RMb2NrRmlsZV9SZWxlYXNlU2Vzc2lvbihpbnQgc2Vzc2lvbklkKSB7CisgICAgcHRocmVhZF9tdXRleF9sb2NrKCZzZXNzaW9uQWNxdWlzaXRpb25NdXRleCk7CisgICAgYXNzZXJ0KDAgPD0gc2Vzc2lvbklkICYmIHNlc3Npb25JZCA8IE1BWF9OVU1fU0VTU0lPTlMgJiYgc2Vzc2lvblB0cnNbc2Vzc2lvbklkXSAhPSBOVUxMKTsKKyAgICBmcmVlKHNlc3Npb25QdHJzW3Nlc3Npb25JZF0tPnBDb250ZW50VHlwZSk7CisgICAgZnJlZShzZXNzaW9uUHRyc1tzZXNzaW9uSWRdLT5wRW5jcnlwdGVkU2Vzc2lvbktleSk7CisgICAgbWVtc2V0KHNlc3Npb25QdHJzW3Nlc3Npb25JZF0sIDAsIHNpemVvZiAqc2Vzc2lvblB0cnNbc2Vzc2lvbklkXSk7IC8vIFplcm8gb3V0IGtleSBkYXRhLgorICAgIGZyZWUoc2Vzc2lvblB0cnNbc2Vzc2lvbklkXSk7CisgICAgc2Vzc2lvblB0cnNbc2Vzc2lvbklkXSA9IE5VTEw7CisgICAgcHRocmVhZF9tdXRleF91bmxvY2soJnNlc3Npb25BY3F1aXNpdGlvbk11dGV4KTsKK30KKworLyoqCisgKiBEZXJpdmVzIGtleXMgZm9yIGVuY3J5cHRpb24gYW5kIHNpZ25pbmcgZnJvbSB0aGUgZW5jcnlwdGVkIHNlc3Npb24ga2V5LgorICoKKyAqIEBwYXJhbVtpbixvdXRdIHBTZXNzaW9uIEEgcmVmZXJlbmNlIHRvIGEgZmlsZSBzZXNzaW9uLgorICoKKyAqIEByZXR1cm4gQSBCb29sZWFuIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciBrZXkgZGVyaXZhdGlvbiB3YXMgc3VjY2Vzc2Z1bC4KKyAqLworc3RhdGljIGludCBGd2RMb2NrRmlsZV9EZXJpdmVLZXlzKEZ3ZExvY2tGaWxlX1Nlc3Npb25fdCAqIHBTZXNzaW9uKSB7CisgICAgaW50IHJlc3VsdDsKKyAgICBzdHJ1Y3QgRndkTG9ja0ZpbGVfRGVyaXZlS2V5c19EYXRhIHsKKyAgICAgICAgQUVTX0tFWSBzZXNzaW9uUm91bmRLZXlzOworICAgICAgICB1bnNpZ25lZCBjaGFyIHZhbHVlW0tFWV9TSVpFXTsKKyAgICAgICAgdW5zaWduZWQgY2hhciBrZXlbS0VZX1NJWkVdOworICAgIH0gKnBEYXRhID0gbWFsbG9jKHNpemVvZiAqcERhdGEpOworICAgIGlmIChwRGF0YSA9PSBOVUxMKSB7CisgICAgICAgIHJlc3VsdCA9IEZBTFNFOworICAgIH0gZWxzZSB7CisgICAgICAgIHJlc3VsdCA9IEZ3ZExvY2tHbHVlX0RlY3J5cHRLZXkocFNlc3Npb24tPnBFbmNyeXB0ZWRTZXNzaW9uS2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTZXNzaW9uLT5lbmNyeXB0ZWRTZXNzaW9uS2V5TGVuZ3RoLCBwRGF0YS0+a2V5LCBLRVlfU0laRSk7CisgICAgICAgIGlmIChyZXN1bHQpIHsKKyAgICAgICAgICAgIGlmIChBRVNfc2V0X2VuY3J5cHRfa2V5KHBEYXRhLT5rZXksIEtFWV9TSVpFX0lOX0JJVFMsICZwRGF0YS0+c2Vzc2lvblJvdW5kS2V5cykgIT0gMCkgeworICAgICAgICAgICAgICAgIHJlc3VsdCA9IEZBTFNFOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBFbmNyeXB0IHRoZSAxNi1ieXRlIHZhbHVlIHswLCAwLCAuLi4sIDB9IHRvIHByb2R1Y2UgdGhlIGVuY3J5cHRpb24ga2V5LgorICAgICAgICAgICAgICAgIG1lbXNldChwRGF0YS0+dmFsdWUsIDAsIEtFWV9TSVpFKTsKKyAgICAgICAgICAgICAgICBBRVNfZW5jcnlwdChwRGF0YS0+dmFsdWUsIHBEYXRhLT5rZXksICZwRGF0YS0+c2Vzc2lvblJvdW5kS2V5cyk7CisgICAgICAgICAgICAgICAgaWYgKEFFU19zZXRfZW5jcnlwdF9rZXkocERhdGEtPmtleSwgS0VZX1NJWkVfSU5fQklUUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcFNlc3Npb24tPmVuY3J5cHRpb25Sb3VuZEtleXMpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gRkFMU0U7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gRW5jcnlwdCB0aGUgMTYtYnl0ZSB2YWx1ZSB7MSwgMCwgLi4uLCAwfSB0byBwcm9kdWNlIHRoZSBzaWduaW5nIGtleS4KKyAgICAgICAgICAgICAgICAgICAgKytwRGF0YS0+dmFsdWVbMF07CisgICAgICAgICAgICAgICAgICAgIEFFU19lbmNyeXB0KHBEYXRhLT52YWx1ZSwgcERhdGEtPmtleSwgJnBEYXRhLT5zZXNzaW9uUm91bmRLZXlzKTsKKyAgICAgICAgICAgICAgICAgICAgSE1BQ19DVFhfaW5pdCgmcFNlc3Npb24tPnNpZ25pbmdDb250ZXh0KTsKKyAgICAgICAgICAgICAgICAgICAgSE1BQ19Jbml0X2V4KCZwU2Vzc2lvbi0+c2lnbmluZ0NvbnRleHQsIHBEYXRhLT5rZXksIEtFWV9TSVpFLCBFVlBfc2hhMSgpLCBOVUxMKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFyZXN1bHQpIHsKKyAgICAgICAgICAgIGVycm5vID0gRU5PU1lTOworICAgICAgICB9CisgICAgICAgIG1lbXNldChwRGF0YSwgMCwgc2l6ZW9mIHBEYXRhKTsgLy8gWmVybyBvdXQga2V5IGRhdGEuCisgICAgICAgIGZyZWUocERhdGEpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIENhbGN1bGF0ZXMgdGhlIGNvdW50ZXIsIHRyZWF0ZWQgYXMgYSAxNi1ieXRlIGxpdHRsZS1lbmRpYW4gbnVtYmVyLCB1c2VkIHRvIGdlbmVyYXRlIHRoZSBrZXlzdHJlYW0KKyAqIGZvciB0aGUgZ2l2ZW4gYmxvY2suCisgKgorICogQHBhcmFtW2luXSBwTm9uY2UgQSByZWZlcmVuY2UgdG8gdGhlIG5vbmNlLgorICogQHBhcmFtW2luXSBibG9ja0luZGV4IFRoZSBpbmRleCBudW1iZXIgb2YgdGhlIGJsb2NrLgorICogQHBhcmFtW291dF0gcENvdW50ZXIgQSByZWZlcmVuY2UgdG8gdGhlIGNvdW50ZXIuCisgKi8KK3N0YXRpYyB2b2lkIEZ3ZExvY2tGaWxlX0NhbGN1bGF0ZUNvdW50ZXIoY29uc3QgdW5zaWduZWQgY2hhciAqcE5vbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBibG9ja0luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpwQ291bnRlcikgeworICAgIHVuc2lnbmVkIGNoYXIgY2FycnkgPSAwOworICAgIHNpemVfdCBpID0gMDsKKyAgICBmb3IgKDsgaSA8IHNpemVvZiBibG9ja0luZGV4OyArK2kpIHsKKyAgICAgICAgdW5zaWduZWQgY2hhciBwYXJ0ID0gcE5vbmNlW2ldICsgKHVuc2lnbmVkIGNoYXIpKGJsb2NrSW5kZXggPj4gKGkgKiBDSEFSX0JJVCkpOworICAgICAgICBwQ291bnRlcltpXSA9IHBhcnQgKyBjYXJyeTsKKyAgICAgICAgY2FycnkgPSAocGFydCA8IHBOb25jZVtpXSB8fCBwQ291bnRlcltpXSA8IHBhcnQpID8gMSA6IDA7CisgICAgfQorICAgIGZvciAoOyBpIDwgQUVTX0JMT0NLX1NJWkU7ICsraSkgeworICAgICAgICBwQ291bnRlcltpXSA9IHBOb25jZVtpXSArIGNhcnJ5OworICAgICAgICBjYXJyeSA9IChwQ291bnRlcltpXSA8IHBOb25jZVtpXSkgPyAxIDogMDsKKyAgICB9Cit9CisKKy8qKgorICogRGVjcnlwdHMgdGhlIGJ5dGUgYXQgdGhlIGN1cnJlbnQgZmlsZSBwb3NpdGlvbiB1c2luZyBBRVMtMTI4LUNUUi4gSW4gQ1RSIChvciAiY291bnRlciIpIG1vZGUsCisgKiBlbmNyeXB0aW9uIGFuZCBkZWNyeXB0aW9uIGFyZSBwZXJmb3JtZWQgdXNpbmcgdGhlIHNhbWUgYWxnb3JpdGhtLgorICoKKyAqIEBwYXJhbVtpbixvdXRdIHBTZXNzaW9uIEEgcmVmZXJlbmNlIHRvIGEgZmlsZSBzZXNzaW9uLgorICogQHBhcmFtW2luXSBwQnl0ZSBUaGUgYnl0ZSB0byBkZWNyeXB0LgorICovCit2b2lkIEZ3ZExvY2tGaWxlX0RlY3J5cHRCeXRlKEZ3ZExvY2tGaWxlX1Nlc3Npb25fdCAqIHBTZXNzaW9uLCB1bnNpZ25lZCBjaGFyICpwQnl0ZSkgeworICAgIHVpbnQ2NF90IGJsb2NrSW5kZXggPSBwU2Vzc2lvbi0+ZmlsZVBvcyAvIEFFU19CTE9DS19TSVpFOworICAgIHVpbnQ2NF90IGJsb2NrT2Zmc2V0ID0gcFNlc3Npb24tPmZpbGVQb3MgJSBBRVNfQkxPQ0tfU0laRTsKKyAgICBpZiAoYmxvY2tJbmRleCAhPSBwU2Vzc2lvbi0+YmxvY2tJbmRleCkgeworICAgICAgICAvLyBUaGUgZmlyc3QgMTYgYnl0ZXMgb2YgdGhlIGVuY3J5cHRlZCBzZXNzaW9uIGtleSBpcyB1c2VkIGFzIHRoZSBub25jZS4KKyAgICAgICAgdW5zaWduZWQgY2hhciBjb3VudGVyW0FFU19CTE9DS19TSVpFXTsKKyAgICAgICAgRndkTG9ja0ZpbGVfQ2FsY3VsYXRlQ291bnRlcihwU2Vzc2lvbi0+cEVuY3J5cHRlZFNlc3Npb25LZXksIGJsb2NrSW5kZXgsIGNvdW50ZXIpOworICAgICAgICBBRVNfZW5jcnlwdChjb3VudGVyLCBwU2Vzc2lvbi0+a2V5U3RyZWFtLCAmcFNlc3Npb24tPmVuY3J5cHRpb25Sb3VuZEtleXMpOworICAgICAgICBwU2Vzc2lvbi0+YmxvY2tJbmRleCA9IGJsb2NrSW5kZXg7CisgICAgfQorICAgICpwQnl0ZSBePSBwU2Vzc2lvbi0+a2V5U3RyZWFtW2Jsb2NrT2Zmc2V0XTsKK30KKworaW50IEZ3ZExvY2tGaWxlX2F0dGFjaChpbnQgZmlsZURlc2MpIHsKKyAgICBpbnQgc2Vzc2lvbklkID0gRndkTG9ja0ZpbGVfQWNxdWlyZVNlc3Npb24oZmlsZURlc2MpOworICAgIGlmIChzZXNzaW9uSWQgPj0gMCkgeworICAgICAgICBGd2RMb2NrRmlsZV9TZXNzaW9uX3QgKnBTZXNzaW9uID0gc2Vzc2lvblB0cnNbc2Vzc2lvbklkXTsKKyAgICAgICAgaW50IGlzU3VjY2VzcyA9IEZBTFNFOworICAgICAgICBpZiAocmVhZChmaWxlRGVzYywgcFNlc3Npb24tPnRvcEhlYWRlciwgVE9QX0hFQURFUl9TSVpFKSA9PSBUT1BfSEVBREVSX1NJWkUgJiYKKyAgICAgICAgICAgICAgICBtZW1jbXAocFNlc3Npb24tPnRvcEhlYWRlciwgdG9wSGVhZGVyVGVtcGxhdGUsIHNpemVvZiB0b3BIZWFkZXJUZW1wbGF0ZSkgPT0gMCkgeworICAgICAgICAgICAgcFNlc3Npb24tPmNvbnRlbnRUeXBlTGVuZ3RoID0gcFNlc3Npb24tPnRvcEhlYWRlcltDT05URU5UX1RZUEVfTEVOR1RIX1BPU107CisgICAgICAgICAgICBhc3NlcnQocFNlc3Npb24tPmNvbnRlbnRUeXBlTGVuZ3RoIDw9IFVDSEFSX01BWCk7IC8vIFVudGFpbnQgc2NhbGFyIGZvciBjb2RlIGNoZWNrZXJzLgorICAgICAgICAgICAgcFNlc3Npb24tPnBDb250ZW50VHlwZSA9IG1hbGxvYyhwU2Vzc2lvbi0+Y29udGVudFR5cGVMZW5ndGggKyAxKTsKKyAgICAgICAgICAgIGlmIChwU2Vzc2lvbi0+cENvbnRlbnRUeXBlICE9IE5VTEwgJiYKKyAgICAgICAgICAgICAgICAgICAgcmVhZChmaWxlRGVzYywgcFNlc3Npb24tPnBDb250ZW50VHlwZSwgcFNlc3Npb24tPmNvbnRlbnRUeXBlTGVuZ3RoKSA9PQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzc2l6ZV90KXBTZXNzaW9uLT5jb250ZW50VHlwZUxlbmd0aCkgeworICAgICAgICAgICAgICAgIHBTZXNzaW9uLT5wQ29udGVudFR5cGVbcFNlc3Npb24tPmNvbnRlbnRUeXBlTGVuZ3RoXSA9ICdcMCc7CisgICAgICAgICAgICAgICAgcFNlc3Npb24tPmVuY3J5cHRlZFNlc3Npb25LZXlMZW5ndGggPSBGd2RMb2NrR2x1ZV9HZXRFbmNyeXB0ZWRLZXlMZW5ndGgoS0VZX1NJWkUpOworICAgICAgICAgICAgICAgIHBTZXNzaW9uLT5wRW5jcnlwdGVkU2Vzc2lvbktleSA9IG1hbGxvYyhwU2Vzc2lvbi0+ZW5jcnlwdGVkU2Vzc2lvbktleUxlbmd0aCk7CisgICAgICAgICAgICAgICAgaWYgKHBTZXNzaW9uLT5wRW5jcnlwdGVkU2Vzc2lvbktleSAhPSBOVUxMICYmCisgICAgICAgICAgICAgICAgICAgICAgICByZWFkKGZpbGVEZXNjLCBwU2Vzc2lvbi0+cEVuY3J5cHRlZFNlc3Npb25LZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTZXNzaW9uLT5lbmNyeXB0ZWRTZXNzaW9uS2V5TGVuZ3RoKSA9PQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3NpemVfdClwU2Vzc2lvbi0+ZW5jcnlwdGVkU2Vzc2lvbktleUxlbmd0aCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgcmVhZChmaWxlRGVzYywgcFNlc3Npb24tPmRhdGFTaWduYXR1cmUsIFNIQTFfSEFTSF9TSVpFKSA9PQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSEExX0hBU0hfU0laRSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgcmVhZChmaWxlRGVzYywgcFNlc3Npb24tPmhlYWRlclNpZ25hdHVyZSwgU0hBMV9IQVNIX1NJWkUpID09CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNIQTFfSEFTSF9TSVpFKSB7CisgICAgICAgICAgICAgICAgICAgIGlzU3VjY2VzcyA9IEZ3ZExvY2tGaWxlX0Rlcml2ZUtleXMocFNlc3Npb24pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoaXNTdWNjZXNzKSB7CisgICAgICAgICAgICBwU2Vzc2lvbi0+ZGF0YU9mZnNldCA9IHBTZXNzaW9uLT5jb250ZW50VHlwZUxlbmd0aCArCisgICAgICAgICAgICAgICAgICAgIHBTZXNzaW9uLT5lbmNyeXB0ZWRTZXNzaW9uS2V5TGVuZ3RoICsgVE9QX0hFQURFUl9TSVpFICsgMiAqIFNIQTFfSEFTSF9TSVpFOworICAgICAgICAgICAgcFNlc3Npb24tPmZpbGVQb3MgPSAwOworICAgICAgICAgICAgcFNlc3Npb24tPmJsb2NrSW5kZXggPSBJTlZBTElEX0JMT0NLX0lOREVYOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgRndkTG9ja0ZpbGVfUmVsZWFzZVNlc3Npb24oc2Vzc2lvbklkKTsKKyAgICAgICAgICAgIHNlc3Npb25JZCA9IC0xOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAoc2Vzc2lvbklkID49IDApID8gMCA6IC0xOworfQorCitpbnQgRndkTG9ja0ZpbGVfb3Blbihjb25zdCBjaGFyICpwRmlsZW5hbWUpIHsKKyAgICBpbnQgZmlsZURlc2MgPSBvcGVuKHBGaWxlbmFtZSwgT19SRE9OTFkpOworICAgIGlmIChmaWxlRGVzYyA+PSAwICYmIEZ3ZExvY2tGaWxlX2F0dGFjaChmaWxlRGVzYykgPCAwKSB7CisgICAgICAgICh2b2lkKWNsb3NlKGZpbGVEZXNjKTsKKyAgICAgICAgZmlsZURlc2MgPSAtMTsKKyAgICB9CisgICAgcmV0dXJuIGZpbGVEZXNjOworfQorCitzc2l6ZV90IEZ3ZExvY2tGaWxlX3JlYWQoaW50IGZpbGVEZXNjLCB2b2lkICpwQnVmZmVyLCBzaXplX3QgbnVtQnl0ZXMpIHsKKyAgICBzc2l6ZV90IG51bUJ5dGVzUmVhZDsKKyAgICBpbnQgc2Vzc2lvbklkID0gRndkTG9ja0ZpbGVfRmluZFNlc3Npb24oZmlsZURlc2MpOworICAgIGlmIChzZXNzaW9uSWQgPCAwKSB7CisgICAgICAgIG51bUJ5dGVzUmVhZCA9IC0xOworICAgIH0gZWxzZSB7CisgICAgICAgIEZ3ZExvY2tGaWxlX1Nlc3Npb25fdCAqcFNlc3Npb24gPSBzZXNzaW9uUHRyc1tzZXNzaW9uSWRdOworICAgICAgICBzc2l6ZV90IGk7CisgICAgICAgIG51bUJ5dGVzUmVhZCA9IHJlYWQocFNlc3Npb24tPmZpbGVEZXNjLCBwQnVmZmVyLCBudW1CeXRlcyk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1CeXRlc1JlYWQ7ICsraSkgeworICAgICAgICAgICAgRndkTG9ja0ZpbGVfRGVjcnlwdEJ5dGUocFNlc3Npb24sICYoKHVuc2lnbmVkIGNoYXIgKilwQnVmZmVyKVtpXSk7CisgICAgICAgICAgICArK3BTZXNzaW9uLT5maWxlUG9zOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBudW1CeXRlc1JlYWQ7Cit9CisKK29mZjY0X3QgRndkTG9ja0ZpbGVfbHNlZWsoaW50IGZpbGVEZXNjLCBvZmY2NF90IG9mZnNldCwgaW50IHdoZW5jZSkgeworICAgIG9mZjY0X3QgbmV3RmlsZVBvczsKKyAgICBpbnQgc2Vzc2lvbklkID0gRndkTG9ja0ZpbGVfRmluZFNlc3Npb24oZmlsZURlc2MpOworICAgIGlmIChzZXNzaW9uSWQgPCAwKSB7CisgICAgICAgIG5ld0ZpbGVQb3MgPSBJTlZBTElEX09GRlNFVDsKKyAgICB9IGVsc2UgeworICAgICAgICBGd2RMb2NrRmlsZV9TZXNzaW9uX3QgKnBTZXNzaW9uID0gc2Vzc2lvblB0cnNbc2Vzc2lvbklkXTsKKyAgICAgICAgc3dpdGNoICh3aGVuY2UpIHsKKyAgICAgICAgY2FzZSBTRUVLX1NFVDoKKyAgICAgICAgICAgIG5ld0ZpbGVQb3MgPSBsc2VlazY0KHBTZXNzaW9uLT5maWxlRGVzYywgcFNlc3Npb24tPmRhdGFPZmZzZXQgKyBvZmZzZXQsIHdoZW5jZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTRUVLX0NVUjoKKyAgICAgICAgY2FzZSBTRUVLX0VORDoKKyAgICAgICAgICAgIG5ld0ZpbGVQb3MgPSBsc2VlazY0KHBTZXNzaW9uLT5maWxlRGVzYywgb2Zmc2V0LCB3aGVuY2UpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBlcnJubyA9IEVJTlZBTDsKKyAgICAgICAgICAgIG5ld0ZpbGVQb3MgPSBJTlZBTElEX09GRlNFVDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmIChuZXdGaWxlUG9zICE9IElOVkFMSURfT0ZGU0VUKSB7CisgICAgICAgICAgICBpZiAobmV3RmlsZVBvcyA8IHBTZXNzaW9uLT5kYXRhT2Zmc2V0KSB7CisgICAgICAgICAgICAgICAgLy8gVGhlIG5ldyBmaWxlIHBvc2l0aW9uIGlzIGlsbGVnYWwgZm9yIGFuIGludGVybmFsIEZvcndhcmQgTG9jayBmaWxlLiBSZXN0b3JlIHRoZQorICAgICAgICAgICAgICAgIC8vIG9yaWdpbmFsIGZpbGUgcG9zaXRpb24uCisgICAgICAgICAgICAgICAgKHZvaWQpbHNlZWs2NChwU2Vzc2lvbi0+ZmlsZURlc2MsIHBTZXNzaW9uLT5kYXRhT2Zmc2V0ICsgcFNlc3Npb24tPmZpbGVQb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRUVLX1NFVCk7CisgICAgICAgICAgICAgICAgZXJybm8gPSBFSU5WQUw7CisgICAgICAgICAgICAgICAgbmV3RmlsZVBvcyA9IElOVkFMSURfT0ZGU0VUOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBUaGUgcmV0dXJuIHZhbHVlIHNob3VsZCBiZSB0aGUgZmlsZSBwb3NpdGlvbiB0aGF0IGxzZWVrNjQoKSB3b3VsZCBoYXZlIHJldHVybmVkCisgICAgICAgICAgICAgICAgLy8gZm9yIHRoZSBlbWJlZGRlZCBjb250ZW50IGZpbGUuCisgICAgICAgICAgICAgICAgcFNlc3Npb24tPmZpbGVQb3MgPSBuZXdGaWxlUG9zIC0gcFNlc3Npb24tPmRhdGFPZmZzZXQ7CisgICAgICAgICAgICAgICAgbmV3RmlsZVBvcyA9IHBTZXNzaW9uLT5maWxlUG9zOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBuZXdGaWxlUG9zOworfQorCitpbnQgRndkTG9ja0ZpbGVfZGV0YWNoKGludCBmaWxlRGVzYykgeworICAgIGludCBzZXNzaW9uSWQgPSBGd2RMb2NrRmlsZV9GaW5kU2Vzc2lvbihmaWxlRGVzYyk7CisgICAgaWYgKHNlc3Npb25JZCA8IDApIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBITUFDX0NUWF9jbGVhbnVwKCZzZXNzaW9uUHRyc1tzZXNzaW9uSWRdLT5zaWduaW5nQ29udGV4dCk7CisgICAgRndkTG9ja0ZpbGVfUmVsZWFzZVNlc3Npb24oc2Vzc2lvbklkKTsKKyAgICByZXR1cm4gMDsKK30KKworaW50IEZ3ZExvY2tGaWxlX2Nsb3NlKGludCBmaWxlRGVzYykgeworICAgIHJldHVybiAoRndkTG9ja0ZpbGVfZGV0YWNoKGZpbGVEZXNjKSA9PSAwKSA/IGNsb3NlKGZpbGVEZXNjKSA6IC0xOworfQorCitpbnQgRndkTG9ja0ZpbGVfQ2hlY2tEYXRhSW50ZWdyaXR5KGludCBmaWxlRGVzYykgeworICAgIGludCByZXN1bHQ7CisgICAgaW50IHNlc3Npb25JZCA9IEZ3ZExvY2tGaWxlX0ZpbmRTZXNzaW9uKGZpbGVEZXNjKTsKKyAgICBpZiAoc2Vzc2lvbklkIDwgMCkgeworICAgICAgICByZXN1bHQgPSBGQUxTRTsKKyAgICB9IGVsc2UgeworICAgICAgICBzdHJ1Y3QgRndkTG9ja0ZpbGVfQ2hlY2tEYXRhSW50ZWdyaXR5X0RhdGEgeworICAgICAgICAgICAgdW5zaWduZWQgY2hhciBzaWduYXR1cmVbU0hBMV9IQVNIX1NJWkVdOworICAgICAgICAgICAgdW5zaWduZWQgY2hhciBidWZmZXJbU0lHX0NBTENfQlVGRkVSX1NJWkVdOworICAgICAgICB9ICpwRGF0YSA9IG1hbGxvYyhzaXplb2YgKnBEYXRhKTsKKyAgICAgICAgaWYgKHBEYXRhID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IEZBTFNFOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgRndkTG9ja0ZpbGVfU2Vzc2lvbl90ICpwU2Vzc2lvbiA9IHNlc3Npb25QdHJzW3Nlc3Npb25JZF07CisgICAgICAgICAgICBpZiAobHNlZWs2NChwU2Vzc2lvbi0+ZmlsZURlc2MsIHBTZXNzaW9uLT5kYXRhT2Zmc2V0LCBTRUVLX1NFVCkgIT0KKyAgICAgICAgICAgICAgICAgICAgcFNlc3Npb24tPmRhdGFPZmZzZXQpIHsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBGQUxTRTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3NpemVfdCBudW1CeXRlc1JlYWQ7CisgICAgICAgICAgICAgICAgc2l6ZV90IHNpZ25hdHVyZVNpemUgPSBTSEExX0hBU0hfU0laRTsKKyAgICAgICAgICAgICAgICB3aGlsZSAoKG51bUJ5dGVzUmVhZCA9CisgICAgICAgICAgICAgICAgICAgICAgICByZWFkKHBTZXNzaW9uLT5maWxlRGVzYywgcERhdGEtPmJ1ZmZlciwgU0lHX0NBTENfQlVGRkVSX1NJWkUpKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgSE1BQ19VcGRhdGUoJnBTZXNzaW9uLT5zaWduaW5nQ29udGV4dCwgcERhdGEtPmJ1ZmZlciwgKHNpemVfdCludW1CeXRlc1JlYWQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobnVtQnl0ZXNSZWFkIDwgMCkgeworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBITUFDX0ZpbmFsKCZwU2Vzc2lvbi0+c2lnbmluZ0NvbnRleHQsIHBEYXRhLT5zaWduYXR1cmUsICZzaWduYXR1cmVTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KHNpZ25hdHVyZVNpemUgPT0gU0hBMV9IQVNIX1NJWkUpOworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBtZW1jbXAocERhdGEtPnNpZ25hdHVyZSwgcFNlc3Npb24tPmRhdGFTaWduYXR1cmUsIHNpZ25hdHVyZVNpemUpID09IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEhNQUNfSW5pdF9leCgmcFNlc3Npb24tPnNpZ25pbmdDb250ZXh0LCBOVUxMLCBLRVlfU0laRSwgTlVMTCwgTlVMTCk7CisgICAgICAgICAgICAgICAgKHZvaWQpbHNlZWs2NChwU2Vzc2lvbi0+ZmlsZURlc2MsIHBTZXNzaW9uLT5kYXRhT2Zmc2V0ICsgcFNlc3Npb24tPmZpbGVQb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRUVLX1NFVCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmcmVlKHBEYXRhKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitpbnQgRndkTG9ja0ZpbGVfQ2hlY2tIZWFkZXJJbnRlZ3JpdHkoaW50IGZpbGVEZXNjKSB7CisgICAgaW50IHJlc3VsdDsKKyAgICBpbnQgc2Vzc2lvbklkID0gRndkTG9ja0ZpbGVfRmluZFNlc3Npb24oZmlsZURlc2MpOworICAgIGlmIChzZXNzaW9uSWQgPCAwKSB7CisgICAgICAgIHJlc3VsdCA9IEZBTFNFOworICAgIH0gZWxzZSB7CisgICAgICAgIEZ3ZExvY2tGaWxlX1Nlc3Npb25fdCAqcFNlc3Npb24gPSBzZXNzaW9uUHRyc1tzZXNzaW9uSWRdOworICAgICAgICB1bnNpZ25lZCBjaGFyIHNpZ25hdHVyZVtTSEExX0hBU0hfU0laRV07CisgICAgICAgIHNpemVfdCBzaWduYXR1cmVTaXplID0gU0hBMV9IQVNIX1NJWkU7CisgICAgICAgIEhNQUNfVXBkYXRlKCZwU2Vzc2lvbi0+c2lnbmluZ0NvbnRleHQsIHBTZXNzaW9uLT50b3BIZWFkZXIsIFRPUF9IRUFERVJfU0laRSk7CisgICAgICAgIEhNQUNfVXBkYXRlKCZwU2Vzc2lvbi0+c2lnbmluZ0NvbnRleHQsICh1bnNpZ25lZCBjaGFyICopcFNlc3Npb24tPnBDb250ZW50VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgcFNlc3Npb24tPmNvbnRlbnRUeXBlTGVuZ3RoKTsKKyAgICAgICAgSE1BQ19VcGRhdGUoJnBTZXNzaW9uLT5zaWduaW5nQ29udGV4dCwgcFNlc3Npb24tPnBFbmNyeXB0ZWRTZXNzaW9uS2V5LAorICAgICAgICAgICAgICAgICAgICBwU2Vzc2lvbi0+ZW5jcnlwdGVkU2Vzc2lvbktleUxlbmd0aCk7CisgICAgICAgIEhNQUNfVXBkYXRlKCZwU2Vzc2lvbi0+c2lnbmluZ0NvbnRleHQsIHBTZXNzaW9uLT5kYXRhU2lnbmF0dXJlLCBzaWduYXR1cmVTaXplKTsKKyAgICAgICAgSE1BQ19GaW5hbCgmcFNlc3Npb24tPnNpZ25pbmdDb250ZXh0LCBzaWduYXR1cmUsICZzaWduYXR1cmVTaXplKTsKKyAgICAgICAgYXNzZXJ0KHNpZ25hdHVyZVNpemUgPT0gU0hBMV9IQVNIX1NJWkUpOworICAgICAgICByZXN1bHQgPSBtZW1jbXAoc2lnbmF0dXJlLCBwU2Vzc2lvbi0+aGVhZGVyU2lnbmF0dXJlLCBzaWduYXR1cmVTaXplKSA9PSAwOworICAgICAgICBITUFDX0luaXRfZXgoJnBTZXNzaW9uLT5zaWduaW5nQ29udGV4dCwgTlVMTCwgS0VZX1NJWkUsIE5VTEwsIE5VTEwpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitpbnQgRndkTG9ja0ZpbGVfQ2hlY2tJbnRlZ3JpdHkoaW50IGZpbGVEZXNjKSB7CisgICAgcmV0dXJuIEZ3ZExvY2tGaWxlX0NoZWNrSGVhZGVySW50ZWdyaXR5KGZpbGVEZXNjKSAmJiBGd2RMb2NrRmlsZV9DaGVja0RhdGFJbnRlZ3JpdHkoZmlsZURlc2MpOworfQorCitjb25zdCBjaGFyICpGd2RMb2NrRmlsZV9HZXRDb250ZW50VHlwZShpbnQgZmlsZURlc2MpIHsKKyAgICBpbnQgc2Vzc2lvbklkID0gRndkTG9ja0ZpbGVfRmluZFNlc3Npb24oZmlsZURlc2MpOworICAgIGlmIChzZXNzaW9uSWQgPCAwKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gc2Vzc2lvblB0cnNbc2Vzc2lvbklkXS0+cENvbnRlbnRUeXBlOworfQpkaWZmIC0tZ2l0IGEvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9pbnRlcm5hbC1mb3JtYXQvZGVjb2Rlci9Gd2RMb2NrRmlsZS5oIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9pbnRlcm5hbC1mb3JtYXQvZGVjb2Rlci9Gd2RMb2NrRmlsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjNjQwNTAKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9kZWNvZGVyL0Z3ZExvY2tGaWxlLmgKQEAgLTAsMCArMSwxMzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9fRldETE9DS0ZJTEVfSF9fCisjZGVmaW5lIF9fRldETE9DS0ZJTEVfSF9fCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisvKioKKyAqIEF0dGFjaGVzIHRvIGFuIG9wZW4gRm9yd2FyZCBMb2NrIGZpbGUuIFRoZSBmaWxlIHBvc2l0aW9uIGlzIGFzc3VtZWQgdG8gYmUgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUKKyAqIGZpbGUuCisgKgorICogQHBhcmFtW2luXSBmaWxlRGVzYyBUaGUgZmlsZSBkZXNjcmlwdG9yIG9mIGFuIG9wZW4gRm9yd2FyZCBMb2NrIGZpbGUuCisgKgorICogQHJldHVybiBBIHN0YXR1cyBjb2RlLgorICogQHJldHZhbCAwIFN1Y2Nlc3MuCisgKiBAcmV0dmFsIC0xIEZhaWx1cmUuCisgKi8KK2ludCBGd2RMb2NrRmlsZV9hdHRhY2goaW50IGZpbGVEZXNjKTsKKworLyoqCisgKiBPcGVucyBhIEZvcndhcmQgTG9jayBmaWxlIGZvciByZWFkaW5nLgorICoKKyAqIEBwYXJhbVtpbl0gcEZpbGVuYW1lIEEgcmVmZXJlbmNlIHRvIGEgZmlsZW5hbWUuCisgKgorICogQHJldHVybiBBIGZpbGUgZGVzY3JpcHRvci4KKyAqIEByZXR2YWwgLTEgRmFpbHVyZS4KKyAqLworaW50IEZ3ZExvY2tGaWxlX29wZW4oY29uc3QgY2hhciAqcEZpbGVuYW1lKTsKKworLyoqCisgKiBSZWFkcyB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBieXRlcyBmcm9tIGFuIG9wZW4gRm9yd2FyZCBMb2NrIGZpbGUuCisgKgorICogQHBhcmFtW2luXSBmaWxlRGVzYyBUaGUgZmlsZSBkZXNjcmlwdG9yIG9mIGFuIG9wZW4gRm9yd2FyZCBMb2NrIGZpbGUuCisgKiBAcGFyYW1bb3V0XSBwQnVmZmVyIEEgcmVmZXJlbmNlIHRvIHRoZSBidWZmZXIgdGhhdCBzaG91bGQgcmVjZWl2ZSB0aGUgcmVhZCBkYXRhLgorICogQHBhcmFtW2luXSBudW1CeXRlcyBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQuCisgKgorICogQHJldHVybiBUaGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQuCisgKiBAcmV0dmFsIC0xIEZhaWx1cmUuCisgKi8KK3NzaXplX3QgRndkTG9ja0ZpbGVfcmVhZChpbnQgZmlsZURlc2MsIHZvaWQgKnBCdWZmZXIsIHNpemVfdCBudW1CeXRlcyk7CisKKy8qKgorICogVXBkYXRlcyB0aGUgZmlsZSBwb3NpdGlvbiB3aXRoaW4gYW4gb3BlbiBGb3J3YXJkIExvY2sgZmlsZS4KKyAqCisgKiBAcGFyYW1baW5dIGZpbGVEZXNjIFRoZSBmaWxlIGRlc2NyaXB0b3Igb2YgYW4gb3BlbiBGb3J3YXJkIExvY2sgZmlsZS4KKyAqIEBwYXJhbVtpbl0gb2Zmc2V0IFRoZSBvZmZzZXQgd2l0aCB3aGljaCB0byB1cGRhdGUgdGhlIGZpbGUgcG9zaXRpb24uCisgKiBAcGFyYW1baW5dIHdoZW5jZSBPbmUgb2YgU0VFS19TRVQsIFNFRUtfQ1VSLCBhbmQgU0VFS19FTkQuCisgKgorICogQHJldHVybiBUaGUgbmV3IGZpbGUgcG9zaXRpb24uCisgKiBAcmV0dmFsICgob2ZmNjRfdCktMSkgRmFpbHVyZS4KKyAqLworb2ZmNjRfdCBGd2RMb2NrRmlsZV9sc2VlayhpbnQgZmlsZURlc2MsIG9mZjY0X3Qgb2Zmc2V0LCBpbnQgd2hlbmNlKTsKKworLyoqCisgKiBEZXRhY2hlcyBmcm9tIGFuIG9wZW4gRm9yd2FyZCBMb2NrIGZpbGUuCisgKgorICogQHBhcmFtW2luXSBmaWxlRGVzYyBUaGUgZmlsZSBkZXNjcmlwdG9yIG9mIGFuIG9wZW4gRm9yd2FyZCBMb2NrIGZpbGUuCisgKgorICogQHJldHVybiBBIHN0YXR1cyBjb2RlLgorICogQHJldHZhbCAwIFN1Y2Nlc3MuCisgKiBAcmV0dmFsIC0xIEZhaWx1cmUuCisgKi8KK2ludCBGd2RMb2NrRmlsZV9kZXRhY2goaW50IGZpbGVEZXNjKTsKKworLyoqCisgKiBDbG9zZXMgYW4gb3BlbiBGb3J3YXJkIExvY2sgZmlsZS4KKyAqCisgKiBAcGFyYW1baW5dIGZpbGVEZXNjIFRoZSBmaWxlIGRlc2NyaXB0b3Igb2YgYW4gb3BlbiBGb3J3YXJkIExvY2sgZmlsZS4KKyAqCisgKiBAcmV0dXJuIEEgc3RhdHVzIGNvZGUuCisgKiBAcmV0dmFsIDAgU3VjY2Vzcy4KKyAqIEByZXR2YWwgLTEgRmFpbHVyZS4KKyAqLworaW50IEZ3ZExvY2tGaWxlX2Nsb3NlKGludCBmaWxlRGVzYyk7CisKKy8qKgorICogQ2hlY2tzIHRoZSBkYXRhIGludGVncml0eSBvZiBhbiBvcGVuIEZvcndhcmQgTG9jayBmaWxlLgorICoKKyAqIEBwYXJhbVtpbl0gZmlsZURlc2MgVGhlIGZpbGUgZGVzY3JpcHRvciBvZiBhbiBvcGVuIEZvcndhcmQgTG9jayBmaWxlLgorICoKKyAqIEByZXR1cm4gQSBCb29sZWFuIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0aGUgaW50ZWdyaXR5IGNoZWNrIHdhcyBzdWNjZXNzZnVsLgorICovCitpbnQgRndkTG9ja0ZpbGVfQ2hlY2tEYXRhSW50ZWdyaXR5KGludCBmaWxlRGVzYyk7CisKKy8qKgorICogQ2hlY2tzIHRoZSBoZWFkZXIgaW50ZWdyaXR5IG9mIGFuIG9wZW4gRm9yd2FyZCBMb2NrIGZpbGUuCisgKgorICogQHBhcmFtW2luXSBmaWxlRGVzYyBUaGUgZmlsZSBkZXNjcmlwdG9yIG9mIGFuIG9wZW4gRm9yd2FyZCBMb2NrIGZpbGUuCisgKgorICogQHJldHVybiBBIEJvb2xlYW4gdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBpbnRlZ3JpdHkgY2hlY2sgd2FzIHN1Y2Nlc3NmdWwuCisgKi8KK2ludCBGd2RMb2NrRmlsZV9DaGVja0hlYWRlckludGVncml0eShpbnQgZmlsZURlc2MpOworCisvKioKKyAqIENoZWNrcyBib3RoIHRoZSBkYXRhIGFuZCBoZWFkZXIgaW50ZWdyaXR5IG9mIGFuIG9wZW4gRm9yd2FyZCBMb2NrIGZpbGUuCisgKgorICogQHBhcmFtW2luXSBmaWxlRGVzYyBUaGUgZmlsZSBkZXNjcmlwdG9yIG9mIGFuIG9wZW4gRm9yd2FyZCBMb2NrIGZpbGUuCisgKgorICogQHJldHVybiBBIEJvb2xlYW4gdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBpbnRlZ3JpdHkgY2hlY2sgd2FzIHN1Y2Nlc3NmdWwuCisgKi8KK2ludCBGd2RMb2NrRmlsZV9DaGVja0ludGVncml0eShpbnQgZmlsZURlc2MpOworCisvKioKKyAqIFJldHVybnMgdGhlIGNvbnRlbnQgdHlwZSBvZiBhbiBvcGVuIEZvcndhcmQgTG9jayBmaWxlLgorICoKKyAqIEBwYXJhbVtpbl0gZmlsZURlc2MgVGhlIGZpbGUgZGVzY3JpcHRvciBvZiBhbiBvcGVuIEZvcndhcmQgTG9jayBmaWxlLgorICoKKyAqIEByZXR1cm4KKyAqICAgQSByZWZlcmVuY2UgdG8gdGhlIGNvbnRlbnQgdHlwZS4gVGhlIHJlZmVyZW5jZSByZW1haW5zIHZhbGlkIGFzIGxvbmcgYXMgdGhlIGZpbGUgaXMga2VwdCBvcGVuLgorICovCitjb25zdCBjaGFyICpGd2RMb2NrRmlsZV9HZXRDb250ZW50VHlwZShpbnQgZmlsZURlc2MpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLy8gX19GV0RMT0NLRklMRV9IX18KZGlmZiAtLWdpdCBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svaW50ZXJuYWwtZm9ybWF0L2RvYy9Gd2RMb2NrLmh0bWwgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9kb2MvRndkTG9jay5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjhmOTVjZDIKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9kb2MvRndkTG9jay5odG1sCkBAIC0wLDAgKzEsMTAzOSBAQAorPGh0bWw+CisKKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXdpbmRvd3MtMTI1MiI+Cis8bWV0YSBuYW1lPUdlbmVyYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCAxMiAoZmlsdGVyZWQpIj4KKzx0aXRsZT5Gb3J3YXJkIExvY2sgQ29udmVydGVyIGFuZCBEZWNvZGVyPC90aXRsZT4KKzxzdHlsZT4KKzwhLS0KKyAvKiBGb250IERlZmluaXRpb25zICovCisgQGZvbnQtZmFjZQorCXtmb250LWZhbWlseTpTaW1TdW47CisJcGFub3NlLTE6MiAxIDYgMCAzIDEgMSAxIDEgMTt9CitAZm9udC1mYWNlCisJe2ZvbnQtZmFtaWx5OiJDYW1icmlhIE1hdGgiOworCXBhbm9zZS0xOjIgNCA1IDMgNSA0IDYgMyAyIDQ7fQorQGZvbnQtZmFjZQorCXtmb250LWZhbWlseTpUYWhvbWE7CisJcGFub3NlLTE6MiAxMSA2IDQgMyA1IDQgNCAyIDQ7fQorQGZvbnQtZmFjZQorCXtmb250LWZhbWlseToiTHVjaWRhIENvbnNvbGUiLCJEZWphVnUgU2FucyBNb25vIjsKKwlwYW5vc2UtMToyIDExIDYgOSA0IDUgNCAyIDIgNDt9CitAZm9udC1mYWNlCisJe2ZvbnQtZmFtaWx5OiJcQFNpbVN1biI7CisJcGFub3NlLTE6MiAxIDYgMCAzIDEgMSAxIDEgMTt9CisgLyogU3R5bGUgRGVmaW5pdGlvbnMgKi8KKyBwLk1zb05vcm1hbCwgbGkuTXNvTm9ybWFsLCBkaXYuTXNvTm9ybWFsCisJe21hcmdpbjowY207CisJbWFyZ2luLWJvdHRvbTouMDAwMXB0OworCWZvbnQtc2l6ZToxMi4wcHQ7CisJZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiIsInNlcmlmIjt9CitoMQorCXttYXJnaW4tcmlnaHQ6MGNtOworCW1hcmdpbi1sZWZ0OjIxLjZwdDsKKwl0ZXh0LWluZGVudDotMjEuNnB0OworCXBhZ2UtYnJlYWstYWZ0ZXI6YXZvaWQ7CisJZm9udC1zaXplOjE2LjBwdDsKKwlmb250LWZhbWlseToiQXJpYWwiLCJzYW5zLXNlcmlmIjt9CitoMgorCXttYXJnaW4tdG9wOjEyLjBwdDsKKwltYXJnaW4tcmlnaHQ6MGNtOworCW1hcmdpbi1ib3R0b206My4wcHQ7CisJbWFyZ2luLWxlZnQ6MjguOHB0OworCXRleHQtaW5kZW50Oi0yOC44cHQ7CisJcGFnZS1icmVhay1hZnRlcjphdm9pZDsKKwlmb250LXNpemU6MTQuMHB0OworCWZvbnQtZmFtaWx5OiJBcmlhbCIsInNhbnMtc2VyaWYiOworCWZvbnQtc3R5bGU6aXRhbGljO30KK2gzCisJe21hcmdpbi10b3A6MTIuMHB0OworCW1hcmdpbi1yaWdodDowY207CisJbWFyZ2luLWJvdHRvbTozLjBwdDsKKwltYXJnaW4tbGVmdDozNi4wcHQ7CisJdGV4dC1pbmRlbnQ6LTM2LjBwdDsKKwlwYWdlLWJyZWFrLWFmdGVyOmF2b2lkOworCWZvbnQtc2l6ZToxMy4wcHQ7CisJZm9udC1mYW1pbHk6IkFyaWFsIiwic2Fucy1zZXJpZiI7fQoraDQKKwl7bWFyZ2luLXRvcDoxMi4wcHQ7CisJbWFyZ2luLXJpZ2h0OjBjbTsKKwltYXJnaW4tYm90dG9tOjMuMHB0OworCW1hcmdpbi1sZWZ0OjQzLjJwdDsKKwl0ZXh0LWluZGVudDotNDMuMnB0OworCXBhZ2UtYnJlYWstYWZ0ZXI6YXZvaWQ7CisJZm9udC1zaXplOjE0LjBwdDsKKwlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIiwic2VyaWYiO30KK2g1CisJe21hcmdpbi10b3A6MTIuMHB0OworCW1hcmdpbi1yaWdodDowY207CisJbWFyZ2luLWJvdHRvbTozLjBwdDsKKwltYXJnaW4tbGVmdDo1MC40cHQ7CisJdGV4dC1pbmRlbnQ6LTUwLjRwdDsKKwlmb250LXNpemU6MTMuMHB0OworCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iLCJzZXJpZiI7CisJZm9udC1zdHlsZTppdGFsaWM7fQoraDYKKwl7bWFyZ2luLXRvcDoxMi4wcHQ7CisJbWFyZ2luLXJpZ2h0OjBjbTsKKwltYXJnaW4tYm90dG9tOjMuMHB0OworCW1hcmdpbi1sZWZ0OjU3LjZwdDsKKwl0ZXh0LWluZGVudDotNTcuNnB0OworCWZvbnQtc2l6ZToxMS4wcHQ7CisJZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiIsInNlcmlmIjt9CitwLk1zb0hlYWRpbmc3LCBsaS5Nc29IZWFkaW5nNywgZGl2Lk1zb0hlYWRpbmc3CisJe21hcmdpbi10b3A6MTIuMHB0OworCW1hcmdpbi1yaWdodDowY207CisJbWFyZ2luLWJvdHRvbTozLjBwdDsKKwltYXJnaW4tbGVmdDo2NC44cHQ7CisJdGV4dC1pbmRlbnQ6LTY0LjhwdDsKKwlmb250LXNpemU6MTIuMHB0OworCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iLCJzZXJpZiI7fQorcC5Nc29IZWFkaW5nOCwgbGkuTXNvSGVhZGluZzgsIGRpdi5Nc29IZWFkaW5nOAorCXttYXJnaW4tdG9wOjEyLjBwdDsKKwltYXJnaW4tcmlnaHQ6MGNtOworCW1hcmdpbi1ib3R0b206My4wcHQ7CisJbWFyZ2luLWxlZnQ6NzIuMHB0OworCXRleHQtaW5kZW50Oi03Mi4wcHQ7CisJZm9udC1zaXplOjEyLjBwdDsKKwlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIiwic2VyaWYiOworCWZvbnQtc3R5bGU6aXRhbGljO30KK3AuTXNvSGVhZGluZzksIGxpLk1zb0hlYWRpbmc5LCBkaXYuTXNvSGVhZGluZzkKKwl7bWFyZ2luLXRvcDoxMi4wcHQ7CisJbWFyZ2luLXJpZ2h0OjBjbTsKKwltYXJnaW4tYm90dG9tOjMuMHB0OworCW1hcmdpbi1sZWZ0Ojc5LjJwdDsKKwl0ZXh0LWluZGVudDotNzkuMnB0OworCWZvbnQtc2l6ZToxMS4wcHQ7CisJZm9udC1mYW1pbHk6IkFyaWFsIiwic2Fucy1zZXJpZiI7fQorcC5Nc29Ub2MxLCBsaS5Nc29Ub2MxLCBkaXYuTXNvVG9jMQorCXttYXJnaW4tdG9wOjYuMHB0OworCW1hcmdpbi1yaWdodDowY207CisJbWFyZ2luLWJvdHRvbTo2LjBwdDsKKwltYXJnaW4tbGVmdDowY207CisJbGluZS1oZWlnaHQ6MTUwJTsKKwlmb250LXNpemU6MTAuNXB0OworCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iLCJzZXJpZiI7CisJdGV4dC10cmFuc2Zvcm06dXBwZXJjYXNlOworCWZvbnQtd2VpZ2h0OmJvbGQ7fQorcC5Nc29Ub2MyLCBsaS5Nc29Ub2MyLCBkaXYuTXNvVG9jMgorCXttYXJnaW4tdG9wOjBjbTsKKwltYXJnaW4tcmlnaHQ6MGNtOworCW1hcmdpbi1ib3R0b206MGNtOworCW1hcmdpbi1sZWZ0OjEyLjBwdDsKKwltYXJnaW4tYm90dG9tOi4wMDAxcHQ7CisJbGluZS1oZWlnaHQ6MTUwJTsKKwlmb250LXNpemU6MTAuNXB0OworCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iLCJzZXJpZiI7CisJZm9udC12YXJpYW50OnNtYWxsLWNhcHM7fQorcC5Nc29Ub2MzLCBsaS5Nc29Ub2MzLCBkaXYuTXNvVG9jMworCXttYXJnaW4tdG9wOjBjbTsKKwltYXJnaW4tcmlnaHQ6MGNtOworCW1hcmdpbi1ib3R0b206MGNtOworCW1hcmdpbi1sZWZ0OjI0LjBwdDsKKwltYXJnaW4tYm90dG9tOi4wMDAxcHQ7CisJbGluZS1oZWlnaHQ6MTUwJTsKKwlmb250LXNpemU6MTAuNXB0OworCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iLCJzZXJpZiI7CisJZm9udC1zdHlsZTppdGFsaWM7fQorcC5Nc29Ub2M0LCBsaS5Nc29Ub2M0LCBkaXYuTXNvVG9jNAorCXttYXJnaW4tdG9wOjBjbTsKKwltYXJnaW4tcmlnaHQ6MGNtOworCW1hcmdpbi1ib3R0b206MGNtOworCW1hcmdpbi1sZWZ0OjM2LjBwdDsKKwltYXJnaW4tYm90dG9tOi4wMDAxcHQ7CisJZm9udC1zaXplOjkuMHB0OworCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iLCJzZXJpZiI7fQorcC5Nc29Ub2M1LCBsaS5Nc29Ub2M1LCBkaXYuTXNvVG9jNQorCXttYXJnaW4tdG9wOjBjbTsKKwltYXJnaW4tcmlnaHQ6MGNtOworCW1hcmdpbi1ib3R0b206MGNtOworCW1hcmdpbi1sZWZ0OjQ4LjBwdDsKKwltYXJnaW4tYm90dG9tOi4wMDAxcHQ7CisJZm9udC1zaXplOjkuMHB0OworCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iLCJzZXJpZiI7fQorcC5Nc29Ub2M2LCBsaS5Nc29Ub2M2LCBkaXYuTXNvVG9jNgorCXttYXJnaW4tdG9wOjBjbTsKKwltYXJnaW4tcmlnaHQ6MGNtOworCW1hcmdpbi1ib3R0b206MGNtOworCW1hcmdpbi1sZWZ0OjYwLjBwdDsKKwltYXJnaW4tYm90dG9tOi4wMDAxcHQ7CisJZm9udC1zaXplOjkuMHB0OworCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iLCJzZXJpZiI7fQorcC5Nc29Ub2M3LCBsaS5Nc29Ub2M3LCBkaXYuTXNvVG9jNworCXttYXJnaW4tdG9wOjBjbTsKKwltYXJnaW4tcmlnaHQ6MGNtOworCW1hcmdpbi1ib3R0b206MGNtOworCW1hcmdpbi1sZWZ0OjcyLjBwdDsKKwltYXJnaW4tYm90dG9tOi4wMDAxcHQ7CisJZm9udC1zaXplOjkuMHB0OworCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iLCJzZXJpZiI7fQorcC5Nc29Ub2M4LCBsaS5Nc29Ub2M4LCBkaXYuTXNvVG9jOAorCXttYXJnaW4tdG9wOjBjbTsKKwltYXJnaW4tcmlnaHQ6MGNtOworCW1hcmdpbi1ib3R0b206MGNtOworCW1hcmdpbi1sZWZ0Ojg0LjBwdDsKKwltYXJnaW4tYm90dG9tOi4wMDAxcHQ7CisJZm9udC1zaXplOjkuMHB0OworCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iLCJzZXJpZiI7fQorcC5Nc29Ub2M5LCBsaS5Nc29Ub2M5LCBkaXYuTXNvVG9jOQorCXttYXJnaW4tdG9wOjBjbTsKKwltYXJnaW4tcmlnaHQ6MGNtOworCW1hcmdpbi1ib3R0b206MGNtOworCW1hcmdpbi1sZWZ0Ojk2LjBwdDsKKwltYXJnaW4tYm90dG9tOi4wMDAxcHQ7CisJZm9udC1zaXplOjkuMHB0OworCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iLCJzZXJpZiI7fQorcC5Nc29Gb290bm90ZVRleHQsIGxpLk1zb0Zvb3Rub3RlVGV4dCwgZGl2Lk1zb0Zvb3Rub3RlVGV4dAorCXttYXJnaW46MGNtOworCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKKwlmb250LXNpemU6MTAuMHB0OworCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iLCJzZXJpZiI7fQorcC5Nc29IZWFkZXIsIGxpLk1zb0hlYWRlciwgZGl2Lk1zb0hlYWRlcgorCXttYXJnaW46MGNtOworCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKKwlmb250LXNpemU6MTIuMHB0OworCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iLCJzZXJpZiI7fQorcC5Nc29Gb290ZXIsIGxpLk1zb0Zvb3RlciwgZGl2Lk1zb0Zvb3RlcgorCXttYXJnaW46MGNtOworCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKKwlmb250LXNpemU6MTIuMHB0OworCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iLCJzZXJpZiI7fQorcC5Nc29DYXB0aW9uLCBsaS5Nc29DYXB0aW9uLCBkaXYuTXNvQ2FwdGlvbgorCXttYXJnaW46MGNtOworCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKKwlmb250LXNpemU6MTEuMHB0OworCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iLCJzZXJpZiI7CisJZm9udC13ZWlnaHQ6Ym9sZDt9CitzcGFuLk1zb0Zvb3Rub3RlUmVmZXJlbmNlCisJe3ZlcnRpY2FsLWFsaWduOnN1cGVyO30KK3AuTXNvVGl0bGUsIGxpLk1zb1RpdGxlLCBkaXYuTXNvVGl0bGUKKwl7bWFyZ2luLXRvcDoxMi4wcHQ7CisJbWFyZ2luLXJpZ2h0OjBjbTsKKwltYXJnaW4tYm90dG9tOjEyMC4wcHQ7CisJbWFyZ2luLWxlZnQ6MGNtOworCXRleHQtYWxpZ246Y2VudGVyOworCWZvbnQtc2l6ZToxNi4wcHQ7CisJZm9udC1mYW1pbHk6IkFyaWFsIiwic2Fucy1zZXJpZiI7CisJZm9udC13ZWlnaHQ6Ym9sZDt9CitwLk1zb0JvZHlUZXh0LCBsaS5Nc29Cb2R5VGV4dCwgZGl2Lk1zb0JvZHlUZXh0CisJe21zby1zdHlsZS1saW5rOiJCb2R5IFRleHQgQ2hhciI7CisJbWFyZ2luLXRvcDowY207CisJbWFyZ2luLXJpZ2h0OjBjbTsKKwltYXJnaW4tYm90dG9tOjYuMHB0OworCW1hcmdpbi1sZWZ0OjBjbTsKKwlmb250LXNpemU6MTIuMHB0OworCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iLCJzZXJpZiI7fQorYTpsaW5rLCBzcGFuLk1zb0h5cGVybGluaworCXtjb2xvcjpibHVlOworCXRleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7fQorYTp2aXNpdGVkLCBzcGFuLk1zb0h5cGVybGlua0ZvbGxvd2VkCisJe2NvbG9yOnB1cnBsZTsKKwl0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lO30KK3AuTXNvQWNldGF0ZSwgbGkuTXNvQWNldGF0ZSwgZGl2Lk1zb0FjZXRhdGUKKwl7bWFyZ2luOjBjbTsKKwltYXJnaW4tYm90dG9tOi4wMDAxcHQ7CisJZm9udC1zaXplOjguMHB0OworCWZvbnQtZmFtaWx5OiJUYWhvbWEiLCJzYW5zLXNlcmlmIjt9CitzcGFuLkJvZHlUZXh0Q2hhcgorCXttc28tc3R5bGUtbmFtZToiQm9keSBUZXh0IENoYXIiOworCW1zby1zdHlsZS1saW5rOiJCb2R5IFRleHQiO30KKyAvKiBQYWdlIERlZmluaXRpb25zICovCisgQHBhZ2UgV29yZFNlY3Rpb24xCisJe3NpemU6NTk1LjQ1cHQgODQxLjdwdDsKKwltYXJnaW46NzIuMHB0IDkwLjBwdCA3Mi4wcHQgOTAuMHB0O30KK2Rpdi5Xb3JkU2VjdGlvbjEKKwl7cGFnZTpXb3JkU2VjdGlvbjE7fQorQHBhZ2UgV29yZFNlY3Rpb24yCisJe3NpemU6NTk1LjQ1cHQgODQxLjdwdDsKKwltYXJnaW46NzIuMHB0IDkwLjBwdCA3Mi4wcHQgOTAuMHB0O30KK2Rpdi5Xb3JkU2VjdGlvbjIKKwl7cGFnZTpXb3JkU2VjdGlvbjI7fQorIC8qIExpc3QgRGVmaW5pdGlvbnMgKi8KKyBvbAorCXttYXJnaW4tYm90dG9tOjBjbTt9Cit1bAorCXttYXJnaW4tYm90dG9tOjBjbTt9CistLT4KKzwvc3R5bGU+CisKKzwvaGVhZD4KKworPGJvZHkgbGFuZz1FTi1VUyBsaW5rPWJsdWUgdmxpbms9cHVycGxlPgorCis8ZGl2IGNsYXNzPVdvcmRTZWN0aW9uMT4KKworPHAgY2xhc3M9TXNvVGl0bGU+Rm9yd2FyZCBMb2NrIENvbnZlcnRlciBBbmQgRGVjb2RlcjwvcD4KKworPHAgY2xhc3M9TXNvVG9jMT48c3BhbgorY2xhc3M9TXNvSHlwZXJsaW5rPjxhIGhyZWY9IiNfVG9jMjc2NDcxNDIyIj4xPHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMi4wcHQ7CitsaW5lLWhlaWdodDoxNTAlO2NvbG9yOndpbmRvd3RleHQ7dGV4dC10cmFuc2Zvcm06bm9uZTtmb250LXdlaWdodDpub3JtYWw7Cit0ZXh0LWRlY29yYXRpb246bm9uZSc+oKCgoKAgPC9zcGFuPkludHJvZHVjdGlvbjxzcGFuIHN0eWxlPSdjb2xvcjp3aW5kb3d0ZXh0OworZGlzcGxheTpub25lO3RleHQtZGVjb3JhdGlvbjpub25lJz4uIDwvc3Bhbj48c3Bhbgorc3R5bGU9J2NvbG9yOndpbmRvd3RleHQ7ZGlzcGxheTpub25lO3RleHQtZGVjb3JhdGlvbjpub25lJz4zPC9zcGFuPjwvYT48L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ub2MxPjxzcGFuIGNsYXNzPU1zb0h5cGVybGluaz48YSBocmVmPSIjX1RvYzI3NjQ3MTQyMyI+MjxzcGFuCitzdHlsZT0nZm9udC1zaXplOjEyLjBwdDtsaW5lLWhlaWdodDoxNTAlO2NvbG9yOndpbmRvd3RleHQ7dGV4dC10cmFuc2Zvcm06bm9uZTsKK2ZvbnQtd2VpZ2h0Om5vcm1hbDt0ZXh0LWRlY29yYXRpb246bm9uZSc+oKCgoKAgPC9zcGFuPk92ZXJ2aWV3PHNwYW4KK3N0eWxlPSdjb2xvcjp3aW5kb3d0ZXh0O2Rpc3BsYXk6bm9uZTt0ZXh0LWRlY29yYXRpb246bm9uZSc+Li4uIDwvc3Bhbj48c3Bhbgorc3R5bGU9J2NvbG9yOndpbmRvd3RleHQ7ZGlzcGxheTpub25lO3RleHQtZGVjb3JhdGlvbjpub25lJz4zPC9zcGFuPjwvYT48L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ub2MxPjxzcGFuIGNsYXNzPU1zb0h5cGVybGluaz48YSBocmVmPSIjX1RvYzI3NjQ3MTQyNCI+MzxzcGFuCitzdHlsZT0nZm9udC1zaXplOjEyLjBwdDtsaW5lLWhlaWdodDoxNTAlO2NvbG9yOndpbmRvd3RleHQ7dGV4dC10cmFuc2Zvcm06bm9uZTsKK2ZvbnQtd2VpZ2h0Om5vcm1hbDt0ZXh0LWRlY29yYXRpb246bm9uZSc+oKCgoKAgPC9zcGFuPlVzZSBDYXNlczxzcGFuCitzdHlsZT0nY29sb3I6d2luZG93dGV4dDtkaXNwbGF5Om5vbmU7dGV4dC1kZWNvcmF0aW9uOm5vbmUnPi4gPC9zcGFuPjxzcGFuCitzdHlsZT0nY29sb3I6d2luZG93dGV4dDtkaXNwbGF5Om5vbmU7dGV4dC1kZWNvcmF0aW9uOm5vbmUnPjQ8L3NwYW4+PC9hPjwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb1RvYzI+PHNwYW4gY2xhc3M9TXNvSHlwZXJsaW5rPjxzcGFuIHN0eWxlPSdmb250LXZhcmlhbnQ6bm9ybWFsICFpbXBvcnRhbnQ7Cit0ZXh0LXRyYW5zZm9ybTp1cHBlcmNhc2UnPjxhIGhyZWY9IiNfVG9jMjc2NDcxNDI1Ij4zLjE8c3BhbiBzdHlsZT0nZm9udC1zaXplOgorMTIuMHB0O2xpbmUtaGVpZ2h0OjE1MCU7Y29sb3I6d2luZG93dGV4dDt0ZXh0LXRyYW5zZm9ybTpub25lO3RleHQtZGVjb3JhdGlvbjoKK25vbmUnPqCgoKCgoKAgPC9zcGFuPkNvbnZlcnRlcjxzcGFuIHN0eWxlPSdjb2xvcjp3aW5kb3d0ZXh0O2Rpc3BsYXk6bm9uZTsKK3RleHQtZGVjb3JhdGlvbjpub25lJz4uIDwvc3Bhbj48c3Bhbgorc3R5bGU9J2NvbG9yOndpbmRvd3RleHQ7ZGlzcGxheTpub25lO3RleHQtZGVjb3JhdGlvbjpub25lJz40PC9zcGFuPjwvYT48L3NwYW4+PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvVG9jMz48c3BhbiBjbGFzcz1Nc29IeXBlcmxpbms+PGEgaHJlZj0iI19Ub2MyNzY0NzE0MjYiPjMuMS4xPHNwYW4KK3N0eWxlPSdmb250LXNpemU6MTIuMHB0O2xpbmUtaGVpZ2h0OjE1MCU7Y29sb3I6d2luZG93dGV4dDtmb250LXN0eWxlOm5vcm1hbDsKK3RleHQtZGVjb3JhdGlvbjpub25lJz6goKCgIDwvc3Bhbj5Db252ZXJ0IERhdGEgKFB1c2gtTW9kZSBDb252ZXJzaW9uKTxzcGFuCitzdHlsZT0nY29sb3I6d2luZG93dGV4dDtkaXNwbGF5Om5vbmU7dGV4dC1kZWNvcmF0aW9uOm5vbmUnPiA8L3NwYW4+PHNwYW4KK3N0eWxlPSdjb2xvcjp3aW5kb3d0ZXh0O2Rpc3BsYXk6bm9uZTt0ZXh0LWRlY29yYXRpb246bm9uZSc+NDwvc3Bhbj48L2E+PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvVG9jMz48c3BhbiBjbGFzcz1Nc29IeXBlcmxpbms+PGEgaHJlZj0iI19Ub2MyNzY0NzE0MjciPjMuMS4yPHNwYW4KK3N0eWxlPSdmb250LXNpemU6MTIuMHB0O2xpbmUtaGVpZ2h0OjE1MCU7Y29sb3I6d2luZG93dGV4dDtmb250LXN0eWxlOm5vcm1hbDsKK3RleHQtZGVjb3JhdGlvbjpub25lJz6goKCgIDwvc3Bhbj5Db252ZXJ0IEZpbGUgKFB1bGwtTW9kZSBDb252ZXJzaW9uKTxzcGFuCitzdHlsZT0nY29sb3I6d2luZG93dGV4dDtkaXNwbGF5Om5vbmU7dGV4dC1kZWNvcmF0aW9uOm5vbmUnPiA8L3NwYW4+PHNwYW4KK3N0eWxlPSdjb2xvcjp3aW5kb3d0ZXh0O2Rpc3BsYXk6bm9uZTt0ZXh0LWRlY29yYXRpb246bm9uZSc+Njwvc3Bhbj48L2E+PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvVG9jMj48c3BhbiBjbGFzcz1Nc29IeXBlcmxpbms+PHNwYW4gc3R5bGU9J2ZvbnQtdmFyaWFudDpub3JtYWwgIWltcG9ydGFudDsKK3RleHQtdHJhbnNmb3JtOnVwcGVyY2FzZSc+PGEgaHJlZj0iI19Ub2MyNzY0NzE0MjgiPjMuMjxzcGFuIHN0eWxlPSdmb250LXNpemU6CisxMi4wcHQ7bGluZS1oZWlnaHQ6MTUwJTtjb2xvcjp3aW5kb3d0ZXh0O3RleHQtdHJhbnNmb3JtOm5vbmU7dGV4dC1kZWNvcmF0aW9uOgorbm9uZSc+oKCgoKCgoCA8L3NwYW4+RGVjb2RlcjxzcGFuIHN0eWxlPSdjb2xvcjp3aW5kb3d0ZXh0O2Rpc3BsYXk6bm9uZTsKK3RleHQtZGVjb3JhdGlvbjpub25lJz4uIDwvc3Bhbj48c3Bhbgorc3R5bGU9J2NvbG9yOndpbmRvd3RleHQ7ZGlzcGxheTpub25lO3RleHQtZGVjb3JhdGlvbjpub25lJz43PC9zcGFuPjwvYT48L3NwYW4+PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvVG9jMz48c3BhbiBjbGFzcz1Nc29IeXBlcmxpbms+PGEgaHJlZj0iI19Ub2MyNzY0NzE0MjkiPjMuMi4xPHNwYW4KK3N0eWxlPSdmb250LXNpemU6MTIuMHB0O2xpbmUtaGVpZ2h0OjE1MCU7Y29sb3I6d2luZG93dGV4dDtmb250LXN0eWxlOm5vcm1hbDsKK3RleHQtZGVjb3JhdGlvbjpub25lJz6goKCgIDwvc3Bhbj5DaGVjayBJbnRlZ3JpdHk8c3BhbiBzdHlsZT0nY29sb3I6d2luZG93dGV4dDsKK2Rpc3BsYXk6bm9uZTt0ZXh0LWRlY29yYXRpb246bm9uZSc+LiA8L3NwYW4+PHNwYW4KK3N0eWxlPSdjb2xvcjp3aW5kb3d0ZXh0O2Rpc3BsYXk6bm9uZTt0ZXh0LWRlY29yYXRpb246bm9uZSc+ODwvc3Bhbj48L2E+PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvVG9jMz48c3BhbiBjbGFzcz1Nc29IeXBlcmxpbms+PGEgaHJlZj0iI19Ub2MyNzY0NzE0MzAiPjMuMi4yPHNwYW4KK3N0eWxlPSdmb250LXNpemU6MTIuMHB0O2xpbmUtaGVpZ2h0OjE1MCU7Y29sb3I6d2luZG93dGV4dDtmb250LXN0eWxlOm5vcm1hbDsKK3RleHQtZGVjb3JhdGlvbjpub25lJz6goKCgIDwvc3Bhbj5HZXQgQ29udGVudCBUeXBlPHNwYW4gc3R5bGU9J2NvbG9yOndpbmRvd3RleHQ7CitkaXNwbGF5Om5vbmU7dGV4dC1kZWNvcmF0aW9uOm5vbmUnPi4gPC9zcGFuPjxzcGFuCitzdHlsZT0nY29sb3I6d2luZG93dGV4dDtkaXNwbGF5Om5vbmU7dGV4dC1kZWNvcmF0aW9uOm5vbmUnPjk8L3NwYW4+PC9hPjwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb1RvYzM+PHNwYW4gY2xhc3M9TXNvSHlwZXJsaW5rPjxhIGhyZWY9IiNfVG9jMjc2NDcxNDMxIj4zLjIuMzxzcGFuCitzdHlsZT0nZm9udC1zaXplOjEyLjBwdDtsaW5lLWhlaWdodDoxNTAlO2NvbG9yOndpbmRvd3RleHQ7Zm9udC1zdHlsZTpub3JtYWw7Cit0ZXh0LWRlY29yYXRpb246bm9uZSc+oKCgoCA8L3NwYW4+RGVjb2RlIEZpbGU8c3BhbiBzdHlsZT0nY29sb3I6d2luZG93dGV4dDsKK2Rpc3BsYXk6bm9uZTt0ZXh0LWRlY29yYXRpb246bm9uZSc+LiA8L3NwYW4+PHNwYW4KK3N0eWxlPSdjb2xvcjp3aW5kb3d0ZXh0O2Rpc3BsYXk6bm9uZTt0ZXh0LWRlY29yYXRpb246bm9uZSc+MTA8L3NwYW4+PC9hPjwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb1RvYzE+PHNwYW4gY2xhc3M9TXNvSHlwZXJsaW5rPjxhIGhyZWY9IiNfVG9jMjc2NDcxNDMyIj40PHNwYW4KK3N0eWxlPSdmb250LXNpemU6MTIuMHB0O2xpbmUtaGVpZ2h0OjE1MCU7Y29sb3I6d2luZG93dGV4dDt0ZXh0LXRyYW5zZm9ybTpub25lOworZm9udC13ZWlnaHQ6bm9ybWFsO3RleHQtZGVjb3JhdGlvbjpub25lJz6goKCgoCA8L3NwYW4+RGVmaW5pdGlvbiBvZiB0aGUKK0ludGVybmFsIEZvcndhcmQgTG9jayBGaWxlIEZvcm1hdDxzcGFuIHN0eWxlPSdjb2xvcjp3aW5kb3d0ZXh0O2Rpc3BsYXk6bm9uZTsKK3RleHQtZGVjb3JhdGlvbjpub25lJz4uIDwvc3Bhbj48c3Bhbgorc3R5bGU9J2NvbG9yOndpbmRvd3RleHQ7ZGlzcGxheTpub25lO3RleHQtZGVjb3JhdGlvbjpub25lJz4xMTwvc3Bhbj48L2E+PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvVG9jMj48c3BhbiBjbGFzcz1Nc29IeXBlcmxpbms+PHNwYW4gc3R5bGU9J2ZvbnQtdmFyaWFudDpub3JtYWwgIWltcG9ydGFudDsKK3RleHQtdHJhbnNmb3JtOnVwcGVyY2FzZSc+PGEgaHJlZj0iI19Ub2MyNzY0NzE0MzMiPjQuMTxzcGFuIHN0eWxlPSdmb250LXNpemU6CisxMi4wcHQ7bGluZS1oZWlnaHQ6MTUwJTtjb2xvcjp3aW5kb3d0ZXh0O3RleHQtdHJhbnNmb3JtOm5vbmU7dGV4dC1kZWNvcmF0aW9uOgorbm9uZSc+oKCgoKCgoCA8L3NwYW4+S2V5IERlcml2YXRpb248c3BhbiBzdHlsZT0nY29sb3I6d2luZG93dGV4dDtkaXNwbGF5Om5vbmU7Cit0ZXh0LWRlY29yYXRpb246bm9uZSc+Li4gPC9zcGFuPjxzcGFuCitzdHlsZT0nY29sb3I6d2luZG93dGV4dDtkaXNwbGF5Om5vbmU7dGV4dC1kZWNvcmF0aW9uOm5vbmUnPjExPC9zcGFuPjwvYT48L3NwYW4+PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvVG9jMj48c3BhbiBjbGFzcz1Nc29IeXBlcmxpbms+PHNwYW4gc3R5bGU9J2ZvbnQtdmFyaWFudDpub3JtYWwgIWltcG9ydGFudDsKK3RleHQtdHJhbnNmb3JtOnVwcGVyY2FzZSc+PGEgaHJlZj0iI19Ub2MyNzY0NzE0MzQiPjQuMjxzcGFuIHN0eWxlPSdmb250LXNpemU6CisxMi4wcHQ7bGluZS1oZWlnaHQ6MTUwJTtjb2xvcjp3aW5kb3d0ZXh0O3RleHQtdHJhbnNmb3JtOm5vbmU7dGV4dC1kZWNvcmF0aW9uOgorbm9uZSc+oKCgoKCgoCA8L3NwYW4+Q2FsY3VsYXRpb24gb2YgdGhlIENvdW50ZXJzPHNwYW4gc3R5bGU9J2NvbG9yOndpbmRvd3RleHQ7CitkaXNwbGF5Om5vbmU7dGV4dC1kZWNvcmF0aW9uOm5vbmUnPi4gPC9zcGFuPjxzcGFuCitzdHlsZT0nY29sb3I6d2luZG93dGV4dDtkaXNwbGF5Om5vbmU7dGV4dC1kZWNvcmF0aW9uOm5vbmUnPjEyPC9zcGFuPjwvYT48L3NwYW4+PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvVG9jMT48c3BhbiBjbGFzcz1Nc29IeXBlcmxpbms+PGEgaHJlZj0iI19Ub2MyNzY0NzE0MzUiPjU8c3Bhbgorc3R5bGU9J2ZvbnQtc2l6ZToxMi4wcHQ7bGluZS1oZWlnaHQ6MTUwJTtjb2xvcjp3aW5kb3d0ZXh0O3RleHQtdHJhbnNmb3JtOm5vbmU7Citmb250LXdlaWdodDpub3JtYWw7dGV4dC1kZWNvcmF0aW9uOm5vbmUnPqCgoKCgIDwvc3Bhbj5Vbml0IFRlc3QgQ2FzZXM8c3Bhbgorc3R5bGU9J2NvbG9yOndpbmRvd3RleHQ7ZGlzcGxheTpub25lO3RleHQtZGVjb3JhdGlvbjpub25lJz4uIDwvc3Bhbj48c3Bhbgorc3R5bGU9J2NvbG9yOndpbmRvd3RleHQ7ZGlzcGxheTpub25lO3RleHQtZGVjb3JhdGlvbjpub25lJz4xMjwvc3Bhbj48L2E+PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvVG9jMT48c3BhbiBjbGFzcz1Nc29IeXBlcmxpbms+PGEgaHJlZj0iI19Ub2MyNzY0NzE0MzYiPjY8c3Bhbgorc3R5bGU9J2ZvbnQtc2l6ZToxMi4wcHQ7bGluZS1oZWlnaHQ6MTUwJTtjb2xvcjp3aW5kb3d0ZXh0O3RleHQtdHJhbnNmb3JtOm5vbmU7Citmb250LXdlaWdodDpub3JtYWw7dGV4dC1kZWNvcmF0aW9uOm5vbmUnPqCgoKCgIDwvc3Bhbj5SZWZlcmVuY2VzPHNwYW4KK3N0eWxlPSdjb2xvcjp3aW5kb3d0ZXh0O2Rpc3BsYXk6bm9uZTt0ZXh0LWRlY29yYXRpb246bm9uZSc+LiA8L3NwYW4+PHNwYW4KK3N0eWxlPSdjb2xvcjp3aW5kb3d0ZXh0O2Rpc3BsYXk6bm9uZTt0ZXh0LWRlY29yYXRpb246bm9uZSc+MTI8L3NwYW4+PC9hPjwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb0JvZHlUZXh0PjwvcD4KKworPC9kaXY+CisKKzxzcGFuIHN0eWxlPSdmb250LXNpemU6MTIuMHB0O2ZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iLCJzZXJpZiInPjxicgorY2xlYXI9YWxsIHN0eWxlPSdwYWdlLWJyZWFrLWJlZm9yZTpyaWdodCc+Cis8L3NwYW4+CisKKzxkaXYgY2xhc3M9V29yZFNlY3Rpb24yPgorCis8aDE+PGEgbmFtZT0iX1RvYzI3NjQ3MTQyMiI+PC9hPjxhIG5hbWU9Il9SZWYyNjMwODU0NzQiPjE8c3Bhbgorc3R5bGU9J2ZvbnQ6Ny4wcHQgIlRpbWVzIE5ldyBSb21hbiInPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyA8L3NwYW4+SW50cm9kdWN0aW9uPC9hPjwvaDE+CisKKzxwIGNsYXNzPU1zb0JvZHlUZXh0PlRoZSBpbnRlcm5hbCBGb3J3YXJkIExvY2sgZmlsZSBmb3JtYXQgaXMgdXNlZCBmb3IgZW5jcnlwdGluZworaW5oZXJlbnRseSB1bmVuY3J5cHRlZCBPTUEgRFJNIHZlcnNpb24gMSBGb3J3YXJkIExvY2sgYW5kIENvbWJpbmVkIERlbGl2ZXJ5CitmaWxlcyBzbyB0aGV5IGNhbiBiZSBzZWN1cmVseSBzdG9yZWQgb24gZXh0ZXJuYWxseSBhY2Nlc3NpYmxlIGZpbGUgc3lzdGVtIHBhcnRpdGlvbnMKK3N1Y2ggYXMgbWVtb3J5IHN0aWNrLjwvcD4KKworPHAgY2xhc3M9TXNvQm9keVRleHQ+T3VyIGdlbmVyYWwgc3RyYXRlZ3kgaXMgdG8gY29udmVydCBzdWNoIDxpPk9NQSBEUk0gTWVzc2FnZTwvaT4KKyiRLmRtkikgZmlsZXMgdG8gaW50ZXJuYWwgRm9yd2FyZCBMb2NrICiRLmZskikgZmlsZXMgYXMgc29vbiBhcyB0aGV5IGFyZQorZG93bmxvYWRlZCBvciBvdGhlcndpc2UgdHJhbnNmZXJyZWQgdG8gdGhlIHBob25lLCBhbmQgbm90IGFjdHVhbGx5IHByb3ZpZGUgYW55CitkZWNvZGVycyBmb3IgkS5kbZIgZmlsZXMuPC9wPgorCis8aDE+PGEgbmFtZT0iX1RvYzI3NjQ3MTQyMyI+MjxzcGFuIHN0eWxlPSdmb250OjcuMHB0ICJUaW1lcyBOZXcgUm9tYW4iJz4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKKzwvc3Bhbj5PdmVydmlldzwvYT48L2gxPgorCis8cCBjbGFzcz1Nc29Cb2R5VGV4dD5UaGUgPGk+Rm9yd2FyZCBMb2NrIENvbnZlcnRlcjwvaT4gY29udmVydHMgT01BIERSTSBNZXNzYWdlCitmaWxlcyB0byB0aGUgaW50ZXJuYWwgZmlsZSBmb3JtYXQuIFRoZSA8aT5Gb3J3YXJkIExvY2sgRGVjb2RlcjwvaT4gcHJvdmlkZXMgYQorUE9TSVgtbGV2ZWwgQVBJIGZvciB0cmFuc3BhcmVudCByZWFkaW5nIGFuZCBzZWVraW5nIHRocm91Z2ggc3VjaCBhIGNvbnZlcnRlZAorZmlsZSBhcyBpZiBpdCB3ZXJlIHVuZW5jcnlwdGVkLiBUaGUgQVBJIGFsc28gaW5jbHVkZXMgZnVuY3Rpb25zIGZvciBjaGVja2luZyBhCitmaWxlknMgaW50ZWdyaXR5IGFuZCBnZXR0aW5nIHRoZSBNSU1FIHR5cGUgb2YgaXRzIGVtYmVkZGVkIGNvbnRlbnQuPC9wPgorCis8cCBjbGFzcz1Nc29Cb2R5VGV4dCBzdHlsZT0nbWFyZ2luLWJvdHRvbToyNC4wcHQnPlRoZSBjb252ZXJ0ZXIgYW5kIGRlY29kZXIgYXJlCitidWlsdCBpbnRvIHR3byBzZXBhcmF0ZSBsaWJyYXJpZXMsIHdoaWNoIHNoYXJlIGNvbW1vbiBjb2RlIGZvciByYW5kb20gbnVtYmVyCitnZW5lcmF0aW9uIGFuZCBrZXkgZW5jcnlwdGlvbiBpbiBhIHRoaXJkIGxpYnJhcnkuIEZvciB0ZXN0IHB1cnBvc2VzIHRoZXJlIGlzCithbHNvIGEgdW5pdCB0ZXN0IGFwcGxpY2F0aW9uLiBTZWUgRmlndXJlIDEuPC9wPgorCis8cCBjbGFzcz1Nc29Cb2R5VGV4dCBzdHlsZT0ncGFnZS1icmVhay1hZnRlcjphdm9pZCc+PGltZyB3aWR0aD0yODggaGVpZ2h0PTM2NAorc3JjPSJpbWFnZXMvaW1hZ2UwMDEuZ2lmIj48L3A+CisKKzxwIGNsYXNzPU1zb0NhcHRpb24gc3R5bGU9J21hcmdpbi10b3A6MTIuMHB0O21hcmdpbi1yaWdodDowY207bWFyZ2luLWJvdHRvbToKKzEyLjBwdDttYXJnaW4tbGVmdDowY20nPjxhIG5hbWU9Il9SZWYyNjI3MzA4ODUiPkZpZ3VyZSA8L2E+MS4gQmxvY2sgZGlhZ3JhbSBpbGx1c3RyYXRpbmcgdGhlIGRlcGVuZGVuY2llcyBiZXR3ZWVuIHRoZSBleGVjdXRhYmxlIG1vZHVsZXMuPC9wPgorCis8Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjE2LjBwdDtmb250LWZhbWlseToiQXJpYWwiLCJzYW5zLXNlcmlmIic+PGJyCitjbGVhcj1hbGwgc3R5bGU9J3BhZ2UtYnJlYWstYmVmb3JlOmFsd2F5cyc+Cis8L3NwYW4+PC9iPgorCis8aDE+PGEgbmFtZT0iX1RvYzI3NjQ3MTQyNCI+MzxzcGFuIHN0eWxlPSdmb250OjcuMHB0ICJUaW1lcyBOZXcgUm9tYW4iJz4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKKzwvc3Bhbj5Vc2UgQ2FzZXM8L2E+PC9oMT4KKworPHAgY2xhc3M9TXNvQm9keVRleHQ+VGhpcyBzZWN0aW9uIGRlc2NyaWJlcyBhbGwgdGhlIHVzZSBjYXNlcyBmb3IgdGhlIGNvbnZlcnRlcgorYW5kIGRlY29kZXIuIEl0IHNob3dzIHRoZSBzZXF1ZW5jZSBvZiBBUEkgY2FsbHMgdGhhdCBzaG91bGQgYmUgdXNlZCB0byBzb2x2ZQordGhlc2UgdXNlIGNhc2VzLjwvcD4KKworPGgyPjxhIG5hbWU9Il9Ub2MyNzY0NzE0MjUiPjMuMTxzcGFuIHN0eWxlPSdmb250OjcuMHB0ICJUaW1lcyBOZXcgUm9tYW4iJz4mbmJzcDsmbmJzcDsmbmJzcDsKKzwvc3Bhbj5Db252ZXJ0ZXI8L2E+PC9oMj4KKworPHAgY2xhc3M9TXNvQm9keVRleHQ+VGhyb3VnaCB0aGUgY29udmVydGVyIEFQSSwgY29udmVyc2lvbiBjYW4gYmUgcGVyZm9ybWVkIGluIG9uZQorb2YgdHdvIHdheXM6PC9wPgorCis8cCBjbGFzcz1Nc29Cb2R5VGV4dCBzdHlsZT0nbWFyZ2luLWxlZnQ6MzYuMHB0O3RleHQtaW5kZW50Oi0xOC4wcHQnPjEuPHNwYW4KK3N0eWxlPSdmb250OjcuMHB0ICJUaW1lcyBOZXcgUm9tYW4iJz4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgPC9zcGFuPjxpPlB1c2gtbW9kZQorY29udmVyc2lvbjwvaT4gaXMgd2hlbiB0aGUgY2xpZW50IHByb2dyZXNzaXZlbHkgZmVlZHMgZGF0YSB0byB0aGUgY29udmVydGVyIGFzCitpdCBhcnJpdmVzLiBUaGlzIGlzIGFwcHJvcHJpYXRlIHdoZW4gZGF0YSBhcnJpdmVzIGdyYWR1YWxseSBpbiBjaHVua3MsIHdpdGgKK2lkbGUgdGltZSBpbiBiZXR3ZWVuLiBDb25zZXF1ZW50bHksIHB1c2ggbW9kZSBpcyB1c2VkIGZvciBjb252ZXJ0aW5nIGZpbGVzCitiZWluZyBkb3dubG9hZGVkIHRocm91Z2ggSFRUUC4gU2VlIHNlY3Rpb24gMy4xLjEuPC9wPgorCis8cCBjbGFzcz1Nc29Cb2R5VGV4dCBzdHlsZT0nbWFyZ2luLWxlZnQ6MzYuMHB0O3RleHQtaW5kZW50Oi0xOC4wcHQnPjIuPHNwYW4KK3N0eWxlPSdmb250OjcuMHB0ICJUaW1lcyBOZXcgUm9tYW4iJz4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgPC9zcGFuPjxpPlB1bGwtbW9kZQorY29udmVyc2lvbjwvaT4gaXMgd2hlbiB0aGUgY29udmVydGVyIGRyaXZlcyB0aGUgcHJvY2VzcyBhbmQgY29uc3VtZXMgZGF0YSBmcm9tCit0aGUgY2xpZW50IGFzIGl0IG5lZWRzIGl0LiBUaGlzIGlzIGFwcHJvcHJpYXRlIHdoZW4gdGhlIGVudGlyZSBmaWxlIHRvIGJlCitjb252ZXJ0ZWQgaXMgcmVhZGlseSBhdmFpbGFibGUuIEhlbmNlLCBwdWxsIG1vZGUgaXMgdXNlZCBieSB0aGUgdW5pdCB0ZXN0IGFwcGxpY2F0aW9uLgorU2VlIHNlY3Rpb24gMy4xLjIuPC9wPgorCis8cCBjbGFzcz1Nc29Cb2R5VGV4dD5JbnRlcm5hbGx5LCBwdWxsLW1vZGUgY29udmVyc2lvbiBpcyBpbXBsZW1lbnRlZCBpbiB0ZXJtcworb2YgdGhlIEFQSSBmb3IgcHVzaC1tb2RlIGNvbnZlcnNpb24uPC9wPgorCis8aDM+PGEgbmFtZT0iX1RvYzI3NjQ3MTQyNiI+PC9hPjxhIG5hbWU9Il9SZWYyNjMwODU0NzgiPjMuMS4xPHNwYW4KK3N0eWxlPSdmb250OjcuMHB0ICJUaW1lcyBOZXcgUm9tYW4iJz4mbmJzcDsmbmJzcDsmbmJzcDsgPC9zcGFuPkNvbnZlcnQgRGF0YQorKFB1c2gtTW9kZSBDb252ZXJzaW9uKTwvYT48L2gzPgorCis8cCBjbGFzcz1Nc29Cb2R5VGV4dD5QdXNoLW1vZGUgY29udmVyc2lvbiBpcyBwZXJmb3JtZWQgYXMgZm9sbG93cyAoc2VlIGFsc28gRmlndXJlIDIpOjwvcD4KKworPHAgY2xhc3M9TXNvQm9keVRleHQgc3R5bGU9J21hcmdpbi1sZWZ0OjM2LjBwdDt0ZXh0LWluZGVudDotMTguMHB0Jz4xLjxzcGFuCitzdHlsZT0nZm9udDo3LjBwdCAiVGltZXMgTmV3IFJvbWFuIic+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IDwvc3Bhbj48c3Bhbgorc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7Zm9udC1mYW1pbHk6Ikx1Y2lkYSBDb25zb2xlIiwiRGVqYVZ1IFNhbnMgTW9ubyInPkZ3ZExvY2tDb252X09wZW5TZXNzaW9uPC9zcGFuPgoraW5pdGlhbGl6ZXMgdGhlIG91dHB1dCBwYXJhbWV0ZXIgYW5kIHJldHVybnMgYSA8aT5zZXNzaW9uIElEPC9pPiB0byBiZSB1c2VkIGluCitzdWJzZXF1ZW50IGNhbGxzIHRvIHRoZSBBUEkuIFRoZSBvdXRwdXQgcGFyYW1ldGVyIGlzIGEgdW5pb24gb2YgcmV0dXJuIHZhbHVlcword2hvc2UgY29ycmVjdCB1c2UgYXQgYW55IGdpdmVuIG1vbWVudCBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBBUEkgZnVuY3Rpb24gbGFzdAorY2FsbGVkLjwvcD4KKworPHAgY2xhc3M9TXNvQm9keVRleHQgc3R5bGU9J21hcmdpbi1sZWZ0OjM2LjBwdDt0ZXh0LWluZGVudDotMTguMHB0Jz4yLjxzcGFuCitzdHlsZT0nZm9udDo3LjBwdCAiVGltZXMgTmV3IFJvbWFuIic+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IDwvc3Bhbj48c3Bhbgorc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7Zm9udC1mYW1pbHk6Ikx1Y2lkYSBDb25zb2xlIiwiRGVqYVZ1IFNhbnMgTW9ubyInPkZ3ZExvY2tDb252X0NvbnZlcnREYXRhPC9zcGFuPgoraXMgY2FsbGVkIHJlcGVhdGVkbHkgdW50aWwgbm8gbW9yZSBpbnB1dCBkYXRhIHJlbWFpbnMuIEVhY2ggY2FsbCBjb252ZXJ0cyB0aGUKK21heGltdW0gYW1vdW50IG9mIGRhdGEgcG9zc2libGUgYW5kIHdyaXRlcyBpdCB0byB0aGUgb3V0cHV0IGJ1ZmZlci4gVGhlIGNsaWVudCB0aGVuCit3cml0ZXMgdGhpcyBkYXRhIHRvIGZpbGUuPC9wPgorCis8cCBjbGFzcz1Nc29Cb2R5VGV4dCBzdHlsZT0nbWFyZ2luLWxlZnQ6MzYuMHB0O3RleHQtaW5kZW50Oi0xOC4wcHQnPjMuPHNwYW4KK3N0eWxlPSdmb250OjcuMHB0ICJUaW1lcyBOZXcgUm9tYW4iJz4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgPC9zcGFuPjxzcGFuCitzdHlsZT0nZm9udC1zaXplOjEwLjBwdDtmb250LWZhbWlseToiTHVjaWRhIENvbnNvbGUiLCJEZWphVnUgU2FucyBNb25vIic+RndkTG9ja0NvbnZfQ2xvc2VTZXNzaW9uPC9zcGFuPgorY2xlYW5zIHVwIHRoZSBzZXNzaW9uIGFuZCBkZWFsbG9jYXRlcyB0aGUgb3V0cHV0IGJ1ZmZlci4gSWYgYWxsIGhhcyBnb25lIHdlbGwsIGEKK3R3by1wYXJ0IGNyeXB0b2dyYXBoaWMgc2lnbmF0dXJlIG9mIHRoZSBvdXRwdXQgZmlsZSBpcyBjYWxjdWxhdGVkLiBUaGUgY2xpZW50CittdXN0IGdvIGJhY2sgYW5kIHJld3JpdGUgcGFydCBvZiB0aGUgZmlsZSBoZWFkZXIgd2l0aCB0aGlzIHVwZGF0ZWQgc2lnbmF0dXJlCitpbmZvcm1hdGlvbi48L3A+CisKKzxwIGNsYXNzPU1zb0JvZHlUZXh0PkV2ZXJ5IHRpbWUgYSBmaWxlIGlzIGJlaW5nIGNvbnZlcnRlZCwgdGhlIGNvbnZlcnRlciBjYWxscyA8c3Bhbgorc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7Zm9udC1mYW1pbHk6Ikx1Y2lkYSBDb25zb2xlIiwiRGVqYVZ1IFNhbnMgTW9ubyInPkZ3ZExvY2tHbHVlX0dldFJhbmRvbU51bWJlcjwvc3Bhbj4KK3RvIGdlbmVyYXRlIGEgbmV3LCB1bmlxdWUgc2Vzc2lvbiBrZXkuIE5vIHR3byBjb252ZXJ0ZWQgZmlsZXMgbG9vayBhbGlrZSwgZXZlbgoraWYgdGhlIG9yaWdpbmFsIGZpbGVzIGFyZSB0aGUgc2FtZS48L3A+CisKKzxwIGNsYXNzPU1zb0JvZHlUZXh0PjxiPk5vdGU6PC9iPiBUaGUgcmFuZG9tIGJ5dGVzIGNhbm5vdCBjb21lIGZyb20gYW55IGJhcmUtbWluaW11bQoraW1wbGVtZW50YXRpb24gb2YgdGhlIEMtbGlicmFyeSA8c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdDtmb250LWZhbWlseToiTHVjaWRhIENvbnNvbGUiLCJEZWphVnUgU2FucyBNb25vIic+cmFuZDwvc3Bhbj4KK2Z1bmN0aW9ul3RoZXkgbXVzdCBiZSBjcnlwdG9ncmFwaGljYWxseSBzZWN1cmUuIE90aGVyd2lzZSwgc2VjdXJpdHkgd2lsbCBiZQorY29tcHJvbWlzZWQuPC9wPgorCis8cCBjbGFzcz1Nc29Cb2R5VGV4dD5UaGUgc2Vzc2lvbiBrZXkgaXMgZW5jcnlwdGVkIGFuZCBzdG9yZWQgd2l0aGluIHRoZQorY29udmVydGVkIGZpbGUuIEtleSBlbmNyeXB0aW9uIGlzIHBlcmZvcm1lZCB1c2luZyA8c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdDsKK2ZvbnQtZmFtaWx5OiJMdWNpZGEgQ29uc29sZSIsIkRlamFWdSBTYW5zIE1vbm8iJz5Gd2RMb2NrR2x1ZV9HZXRFbmNyeXB0ZWRLZXlMZW5ndGg8L3NwYW4+IGFuZCA8c3Bhbgorc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7Zm9udC1mYW1pbHk6Ikx1Y2lkYSBDb25zb2xlIiwiRGVqYVZ1IFNhbnMgTW9ubyInPkZ3ZExvY2tHbHVlX0VuY3J5cHRLZXk8L3NwYW4+LgorVGhlc2UgdHdvIGZ1bmN0aW9ucywgdG9nZXRoZXIgd2l0aCB0aGUgY29ycmVzcG9uZGluZyBkZWNyeXB0aW9uIGZ1bmN0aW9uICg8c3Bhbgorc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7Zm9udC1mYW1pbHk6Ikx1Y2lkYSBDb25zb2xlIiwiRGVqYVZ1IFNhbnMgTW9ubyInPkZ3ZExvY2tHbHVlX0RlY3J5cHRLZXk8L3NwYW4+KSwKK2FyZSB0aGUgaW50ZWdyYXRpb24gcG9pbnRzIHdoZXJlIGFuIE9FTSBtYW51ZmFjdHVyZXIgbWF5IGltcGxlbWVudCB0aGVpciBvd24KK2tleS1lbmNyeXB0aW9uIHNjaGVtZS48L3A+CisKKzxwIGNsYXNzPU1zb0JvZHlUZXh0PjxiPk5vdGU6PC9iPiBUaGUga2V5LWVuY3J5cHRpb24ga2V5IG11c3QgYmUgdW5pcXVlIHRvIGVhY2gKK2RldmljZTsgdGhpcyBpcyB3aGF0IG1ha2VzIHRoZSBmaWxlcyBmb3J3YXJkIGxvY2uWcHJvdGVjdGVkLiBJZGVhbGx5LCBpdCBzaG91bGQKK2JlIGRlcml2ZWQgZnJvbSBzZWNyZXQgaGFyZHdhcmUgcGFyYW1ldGVycywgYnV0IGF0IHRoZSB2ZXJ5IGxlYXN0IGl0IHNob3VsZCBiZQorcGVyc2lzdGVudCBmcm9tIG9uZSBtYXN0ZXIgcmVzZXQgdG8gdGhlIG5leHQuPC9wPgorCis8ZGl2IHN0eWxlPSdtYXJnaW4tYm90dG9tOjI0LjBwdDtib3JkZXI6c29saWQgd2luZG93dGV4dCAxLjBwdDtwYWRkaW5nOjEuMHB0IDQuMHB0IDEuMHB0IDQuMHB0OworYmFja2dyb3VuZDojRjJGMkYyJz4KKworPHAgY2xhc3M9TXNvQm9keVRleHQgc3R5bGU9J2JhY2tncm91bmQ6I0YyRjJGMjtib3JkZXI6Citub25lO3BhZGRpbmc6MGNtJz48Yj5Ob3RlOjwvYj4gSW4gdGhlIG9wZW4tc291cmNlIGltcGxlbWVudGF0aW9uIG9mIHRoZSA8c3Bhbgorc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7Zm9udC1mYW1pbHk6Ikx1Y2lkYSBDb25zb2xlIiwiRGVqYVZ1IFNhbnMgTW9ubyInPmxpYmZ3ZGxvY2stY29tbW9uPC9zcGFuPgorbGlicmFyeSwgYSByYW5kb20ga2V5LWVuY3J5cHRpb24ga2V5IGlzIGdlbmVyYXRlZCBhbmQgc3RvcmVkIGluIHBsYWludGV4dCBpbgordGhlIGZpbGUgc3lzdGVtLCB3aXRob3V0IGJlaW5nIG9iZnVzY2F0ZWQgaW4gYW55IHdheSAoZG9pbmcgc28gd291bGQgYmUgZnV0aWxlCitzaW5jZSB0aGUgc291cmNlIGNvZGUgaXMgb3Blbmx5IGF2YWlsYWJsZSkuIFRoaXMga2V5IG11c3QgYmUga2VwdCBzZWNyZXQgZnJvbQordGhlIHVzZXIsIGFuZCBzaG91bGRuknQgYmUgcG9zc2libGUgdG8gZXh0cmFjdCB0aHJvdWdoIGJhY2t1cC1hbmQtcmVzdG9yZQorZnVuY3Rpb25hbGl0eSBvciB0aGUgbGlrZS4gT0VNIG1hbnVmYWN0dXJlcnMgd2lsbCBwcm9iYWJseSB3YW50IHRvIGltcGxlbWVudCBhCit0cnVseSBoYXJkd2FyZS1iYXNlZCBkZXZpY2UtdW5pcXVlIGtleS48L3A+CisKKzwvZGl2PgorCis8cCBjbGFzcz1Nc29Cb2R5VGV4dCBzdHlsZT0ncGFnZS1icmVhay1hZnRlcjphdm9pZCc+PGltZyB3aWR0aD01MzEgaGVpZ2h0PTU2Mworc3JjPSJpbWFnZXMvaW1hZ2UwMDIuZ2lmIj48L3A+CisKKzxwIGNsYXNzPU1zb0NhcHRpb24gc3R5bGU9J21hcmdpbi10b3A6Ni4wcHQ7bWFyZ2luLXJpZ2h0OjBjbTttYXJnaW4tYm90dG9tOgorMTIuMHB0O21hcmdpbi1sZWZ0OjBjbSc+PGEgbmFtZT0iX1JlZjI2MzA4NTE4NyI+RmlndXJlIDwvYT4yLiBDb252ZXJ0ZXIgVUM6IENvbnZlcnQgRGF0YS48L3A+CisKKzxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTMuMHB0O2ZvbnQtZmFtaWx5OiJBcmlhbCIsInNhbnMtc2VyaWYiJz48YnIKK2NsZWFyPWFsbCBzdHlsZT0ncGFnZS1icmVhay1iZWZvcmU6YWx3YXlzJz4KKzwvc3Bhbj48L2I+CisKKzxoMz48YSBuYW1lPSJfVG9jMjc2NDcxNDI3Ij48L2E+PGEgbmFtZT0iX1JlZjI2MzE2MzA4MiI+My4xLjI8c3Bhbgorc3R5bGU9J2ZvbnQ6Ny4wcHQgIlRpbWVzIE5ldyBSb21hbiInPiZuYnNwOyZuYnNwOyZuYnNwOyA8L3NwYW4+Q29udmVydCBGaWxlCisoUHVsbC1Nb2RlIENvbnZlcnNpb24pPC9hPjwvaDM+CisKKzxwIGNsYXNzPU1zb0JvZHlUZXh0PlB1bGwtbW9kZSBjb252ZXJzaW9uIGlzIHBlcmZvcm1lZCBieSBjYWxsaW5nIDxzcGFuCitzdHlsZT0nZm9udC1zaXplOjEwLjBwdDtmb250LWZhbWlseToiTHVjaWRhIENvbnNvbGUiLCJEZWphVnUgU2FucyBNb25vIic+RndkTG9ja0ZpbGVfQ29udmVydEZpbGU8L3NwYW4+Cit3aXRoIHRoZSBmaWxlbmFtZSwgdW5sZXNzIHRoZXJlIGlzIG5lZWQgZm9yIGEgc3BlY2lhbGl6ZWQgPHNwYW4KK3N0eWxlPSdmb250LXNpemU6MTAuMHB0O2ZvbnQtZmFtaWx5OiJMdWNpZGEgQ29uc29sZSIsIkRlamFWdSBTYW5zIE1vbm8iJz5yZWFkPC9zcGFuPiBmdW5jdGlvbiwgaW4KK3doaWNoIGNhc2UgPHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7Zm9udC1mYW1pbHk6Ikx1Y2lkYSBDb25zb2xlIiwiRGVqYVZ1IFNhbnMgTW9ubyInPkZ3ZExvY2tGaWxlX0NvbnZlcnRPcGVuRmlsZTwvc3Bhbj4KK3Nob3VsZCBiZSB1c2VkIGRpcmVjdGx5IGluc3RlYWQuIFNlZSBGaWd1cmUgMy48L3A+CisKKzxwIGNsYXNzPU1zb0JvZHlUZXh0IHN0eWxlPSdtYXJnaW4tYm90dG9tOjI0LjBwdCc+SW50ZXJuYWxseSwgPHNwYW4KK3N0eWxlPSdmb250LXNpemU6MTAuMHB0O2ZvbnQtZmFtaWx5OiJMdWNpZGEgQ29uc29sZSIsIkRlamFWdSBTYW5zIE1vbm8iJz5Gd2RMb2NrRmlsZV9Db252ZXJ0RmlsZTwvc3Bhbj4KK2NhbGxzIDxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0O2ZvbnQtZmFtaWx5OiJMdWNpZGEgQ29uc29sZSIsIkRlamFWdSBTYW5zIE1vbm8iJz5Gd2RMb2NrRmlsZV9Db252ZXJ0T3BlbkZpbGU8L3NwYW4+LgorVGhlIGxhdHRlciB0aGVuIHByb2NlZWRzIHdpdGggdGhlIGNvbnZlcnNpb24gdXNpbmcgdGhlIHB1c2gtbW9kZSBBUEksIGFjdGluZyBhcwordGhlIGNsaWVudCBpbiB0aGUgcHJldmlvdXMgdXNlIGNhc2U7IHNlZSBzZWN0aW9uIDMuMS4xLjwvcD4KKworPHAgY2xhc3M9TXNvQm9keVRleHQgc3R5bGU9J3BhZ2UtYnJlYWstYWZ0ZXI6YXZvaWQnPjxpbWcgd2lkdGg9NTMxIGhlaWdodD03MzEKK3NyYz0iaW1hZ2VzL2ltYWdlMDAzLmdpZiI+PC9wPgorCis8cCBjbGFzcz1Nc29DYXB0aW9uIHN0eWxlPSdtYXJnaW4tdG9wOjYuMHB0O21hcmdpbi1yaWdodDowY207bWFyZ2luLWJvdHRvbToKKzEyLjBwdDttYXJnaW4tbGVmdDowY20nPjxhIG5hbWU9Il9SZWYyNjMwODUyMDgiPkZpZ3VyZSA8L2E+My4gQ29udmVydGVyIFVDOiBDb252ZXJ0IEZpbGUuPC9wPgorCis8Yj48aT48c3BhbiBzdHlsZT0nZm9udC1zaXplOjE0LjBwdDtmb250LWZhbWlseToiQXJpYWwiLCJzYW5zLXNlcmlmIic+PGJyCitjbGVhcj1hbGwgc3R5bGU9J3BhZ2UtYnJlYWstYmVmb3JlOmFsd2F5cyc+Cis8L3NwYW4+PC9pPjwvYj4KKworPGgyPjxhIG5hbWU9Il9Ub2MyNzY0NzE0MjgiPjMuMjxzcGFuIHN0eWxlPSdmb250OjcuMHB0ICJUaW1lcyBOZXcgUm9tYW4iJz4mbmJzcDsmbmJzcDsmbmJzcDsKKzwvc3Bhbj5EZWNvZGVyPC9hPjwvaDI+CisKKzxwIGNsYXNzPU1zb0JvZHlUZXh0PlRoZSBkZWNvZGVyIEFQSSBhbGxvd3MgdGhlIGNsaWVudCB0byBkbyB0aGUgZm9sbG93aW5nOjwvcD4KKworPHAgY2xhc3M9TXNvQm9keVRleHQgc3R5bGU9J21hcmdpbi1sZWZ0OjM2LjBwdDt0ZXh0LWluZGVudDotMTguMHB0Jz4xLjxzcGFuCitzdHlsZT0nZm9udDo3LjBwdCAiVGltZXMgTmV3IFJvbWFuIic+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IDwvc3Bhbj5DaGVjawordGhlIGludGVncml0eSBvZiBhbiBpbnRlcm5hbCBGb3J3YXJkIExvY2sgZmlsZSwgaS5lLiwgZGV0ZWN0IHdoZXRoZXIgaXQgaGFzCitiZWVuIG1hbmlwdWxhdGVkIGluIGFueSB3YXk7IHNlZSBzZWN0aW9uIDMuMi4xLjwvcD4KKworPHAgY2xhc3M9TXNvQm9keVRleHQgc3R5bGU9J21hcmdpbi1sZWZ0OjM2LjBwdDt0ZXh0LWluZGVudDotMTguMHB0Jz4yLjxzcGFuCitzdHlsZT0nZm9udDo3LjBwdCAiVGltZXMgTmV3IFJvbWFuIic+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IDwvc3Bhbj5HZXQKK3RoZSBNSU1FIHR5cGUgb2YgdGhlIGVtYmVkZGVkIGNvbnRlbnQgKHRoZSCTb3JpZ2luYWyUIE1JTUUgdHlwZSBiZWZvcmUgRFJNIHByb3RlY3Rpb24KK3dhcyBhcHBsaWVkKTsgc2VlIHNlY3Rpb24gMy4yLjIuPC9wPgorCis8cCBjbGFzcz1Nc29Cb2R5VGV4dCBzdHlsZT0nbWFyZ2luLWxlZnQ6MzYuMHB0O3RleHQtaW5kZW50Oi0xOC4wcHQnPjMuPHNwYW4KK3N0eWxlPSdmb250OjcuMHB0ICJUaW1lcyBOZXcgUm9tYW4iJz4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgPC9zcGFuPkRlY29kZQordGhlIGZpbGUgYnkgcmFuZG9tIGFjY2VzcywgaS5lLiwgcmVhZCBhbmQgc2VlayB0aHJvdWdoIGl0IGluIGFuIGFyYml0cmFyeQorbWFubmVyOyBzZWUgc2VjdGlvbiAzLjIuMy48L3A+CisKKzxwIGNsYXNzPU1zb0JvZHlUZXh0PkFsbCBzdWJzZXF1ZW50IG9wZXJhdGlvbnMgb24gYSBmaWxlIGZpcnN0IHJlcXVpcmUgaXQgdG8gYmUKK29wZW5lZC4gT3BlbmluZyBhIGZpbGUgcmV0dXJucyBhIDxpPmZpbGUgZGVzY3JpcHRvcjwvaT6XYSBoYW5kbGUgdG8gYmUgdXNlZCBpbgordGhlc2Ugc3Vic2VxdWVudCBvcGVyYXRpb25zLjwvcD4KKworPHAgY2xhc3M9TXNvQm9keVRleHQ+SWYgdGhlIGZpbGVuYW1lIGlzIGtub3duLCBhbiBpbnRlcm5hbCBGb3J3YXJkIExvY2sgZmlsZQorY2FuIGJlIG9wZW5lZCB1c2luZyA8c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdDtmb250LWZhbWlseToiTHVjaWRhIENvbnNvbGUiLCJEZWphVnUgU2FucyBNb25vIic+RndkTG9ja0ZpbGVfb3Blbjwvc3Bhbj4uCitJZiBvbmx5IHRoZSBmaWxlIGRlc2NyaXB0b3Igb2YgYW4gYWxyZWFkeSBvcGVuIGZpbGUgaXMgYXZhaWxhYmxlLCBhIGRlY29kaW5nCitzZXNzaW9uIGNhbiBpbnN0ZWFkIGJlIGluaXRpYWxpemVkIHVzaW5nIDxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0OworZm9udC1mYW1pbHk6Ikx1Y2lkYSBDb25zb2xlIiwiRGVqYVZ1IFNhbnMgTW9ubyInPkZ3ZExvY2tGaWxlX2F0dGFjaDwvc3Bhbj4uPC9wPgorCis8cCBjbGFzcz1Nc29Cb2R5VGV4dD5JbnRlcm5hbGx5LCA8c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdDtmb250LWZhbWlseToKKyJMdWNpZGEgQ29uc29sZSIsIkRlamFWdSBTYW5zIE1vbm8iJz5Gd2RMb2NrRmlsZV9vcGVuPC9zcGFuPiBjYWxscyA8c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdDsKK2ZvbnQtZmFtaWx5OiJMdWNpZGEgQ29uc29sZSIsIkRlamFWdSBTYW5zIE1vbm8iJz5Gd2RMb2NrRmlsZV9hdHRhY2g8L3NwYW4+LiBGb3IgZWZmaWNpZW5jeQorcmVhc29ucywgPHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7Zm9udC1mYW1pbHk6Ikx1Y2lkYSBDb25zb2xlIiwiRGVqYVZ1IFNhbnMgTW9ubyInPkZ3ZExvY2tGaWxlX2F0dGFjaDwvc3Bhbj4KK3RoZXJlZm9yZSBhc3N1bWVzIHRoYXQgdGhlIGZpbGUgcG9zaXRpb24gaXMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZmlsZSB3aGVuCit0aGUgZnVuY3Rpb24gZ2V0cyBjYWxsZWQuIEEgY2xpZW50IHdobyBjYWxscyBpdCBkaXJlY3RseSBtdXN0IG1ha2Ugc3VyZSB0aGF0Cit0aGlzIGFzc3VtcHRpb24gaG9sZHMuPC9wPgorCis8cCBjbGFzcz1Nc29Cb2R5VGV4dD5XaGVuIGEgZmlsZSBpcyBiZWluZyBhdHRhY2hlZCwgdGhlIHNlc3Npb24ga2V5IHN0b3JlZCBpbgordGhlIGZpbGUgZHVyaW5nIGNvbnZlcnNpb24gaXMgZGVjcnlwdGVkIHVzaW5nIDxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0OworZm9udC1mYW1pbHk6Ikx1Y2lkYSBDb25zb2xlIiwiRGVqYVZ1IFNhbnMgTW9ubyInPkZ3ZExvY2tHbHVlX0dldEVuY3J5cHRlZEtleUxlbmd0aDwvc3Bhbj4gYW5kIDxzcGFuCitzdHlsZT0nZm9udC1zaXplOjEwLjBwdDtmb250LWZhbWlseToiTHVjaWRhIENvbnNvbGUiLCJEZWphVnUgU2FucyBNb25vIic+RndkTG9ja0dsdWVfRGVjcnlwdEtleTwvc3Bhbj4sCitpbiBvcmRlciB0byBzZXQgdXAgZm9yIGRlY29kaW5nIGFuZCBpbnRlZ3JpdHkgY2hlY2tpbmcuPC9wPgorCis8cCBjbGFzcz1Nc29Cb2R5VGV4dD5Gb3IganVzdCBnZXR0aW5nIHRoZSBjb250ZW50IHR5cGUsIGhvd2V2ZXIsIHJldHJpZXZpbmcgdGhlCitzZXNzaW9uIGtleSB3b3VsZCBzdHJpY3RseSBzcGVha2luZyBub3QgYmUgbmVjZXNzYXJ5LCBzbyB0aGVyZSBpcyBhbgorb3Bwb3J0dW5pdHkgaGVyZSB0byBvcHRpbWl6ZSBmb3IgdGhhdCBpZiBpdCBwcm92ZXMgbmVjZXNzYXJ5IGxhdGVyLjwvcD4KKworPHAgY2xhc3M9TXNvQm9keVRleHQ+U3ltbWV0cmljYWwgdG8gPHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7Zm9udC1mYW1pbHk6CisiTHVjaWRhIENvbnNvbGUiLCJEZWphVnUgU2FucyBNb25vIic+RndkTG9ja0ZpbGVfb3Blbjwvc3Bhbj4gYW5kIDxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0OworZm9udC1mYW1pbHk6Ikx1Y2lkYSBDb25zb2xlIiwiRGVqYVZ1IFNhbnMgTW9ubyInPkZ3ZExvY2tGaWxlX2F0dGFjaDwvc3Bhbj4sIHRoZXJlIGFyZSBhbHNvIGZ1bmN0aW9ucworZm9yIGNsb3NpbmcgYSBmaWxlIG9yIGRldGFjaGluZyBmcm9tIGl0OjwvcD4KKworPHAgY2xhc3M9TXNvQm9keVRleHQgc3R5bGU9J21hcmdpbi1sZWZ0OjM2LjBwdDt0ZXh0LWluZGVudDotMTguMHB0Jz4xLjxzcGFuCitzdHlsZT0nZm9udDo3LjBwdCAiVGltZXMgTmV3IFJvbWFuIic+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IDwvc3Bhbj5JZgoraXQgd2FzIG9wZW5lZCB3aXRoIDxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0O2ZvbnQtZmFtaWx5OiJMdWNpZGEgQ29uc29sZSIsIkRlamFWdSBTYW5zIE1vbm8iJz5Gd2RMb2NrRmlsZV9vcGVuPC9zcGFuPgoraXQgc2hvdWxkIGJlIGNsb3NlZCB3aXRoIDxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0O2ZvbnQtZmFtaWx5OiJMdWNpZGEgQ29uc29sZSIsIkRlamFWdSBTYW5zIE1vbm8iJz5Gd2RMb2NrRmlsZV9jbG9zZTwvc3Bhbj4uPC9wPgorCis8cCBjbGFzcz1Nc29Cb2R5VGV4dCBzdHlsZT0nbWFyZ2luLWxlZnQ6MzYuMHB0O3RleHQtaW5kZW50Oi0xOC4wcHQnPjIuPHNwYW4KK3N0eWxlPSdmb250OjcuMHB0ICJUaW1lcyBOZXcgUm9tYW4iJz4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgPC9zcGFuPklmCitpdCB3YXMgYXR0YWNoZWQgd2l0aCA8c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdDtmb250LWZhbWlseToiTHVjaWRhIENvbnNvbGUiLCJEZWphVnUgU2FucyBNb25vIic+RndkTG9ja0ZpbGVfYXR0YWNoPC9zcGFuPgoraXQgc2hvdWxkIGJlIGRldGFjaGVkIHdpdGggPHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7Zm9udC1mYW1pbHk6Ikx1Y2lkYSBDb25zb2xlIiwiRGVqYVZ1IFNhbnMgTW9ubyInPkZ3ZExvY2tGaWxlX2RldGFjaDwvc3Bhbj4uPC9wPgorCis8Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEzLjBwdDtmb250LWZhbWlseToiQXJpYWwiLCJzYW5zLXNlcmlmIic+PGJyCitjbGVhcj1hbGwgc3R5bGU9J3BhZ2UtYnJlYWstYmVmb3JlOmFsd2F5cyc+Cis8L3NwYW4+PC9iPgorCis8aDM+PGEgbmFtZT0iX1JlZjI2MzE2MzA5OSI+PC9hPjxhIG5hbWU9Il9Ub2MyNzY0NzE0MjkiPjMuMi4xPHNwYW4KK3N0eWxlPSdmb250OjcuMHB0ICJUaW1lcyBOZXcgUm9tYW4iJz4mbmJzcDsmbmJzcDsmbmJzcDsgPC9zcGFuPkNoZWNrIEludGVncml0eTwvYT48L2gzPgorCis8cCBjbGFzcz1Nc29Cb2R5VGV4dD5UaGVyZSBhcmUgdGhyZWUgbWV0aG9kcyBmb3IgY2hlY2tpbmcgdGhlIGludGVncml0eSBvZiBhbgoraW50ZXJuYWwgRm9yd2FyZCBMb2NrIGZpbGUsIGluIHdob2xlIG9yIGluIHBhcnQgKHNlZSBhbHNvIEZpZ3VyZSA0KTo8L3A+CisKKzxwIGNsYXNzPU1zb0JvZHlUZXh0IHN0eWxlPSdtYXJnaW4tbGVmdDozNi4wcHQ7dGV4dC1pbmRlbnQ6LTE4LjBwdCc+MS48c3Bhbgorc3R5bGU9J2ZvbnQ6Ny4wcHQgIlRpbWVzIE5ldyBSb21hbiInPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyA8L3NwYW4+PHNwYW4KK3N0eWxlPSdmb250LXNpemU6MTAuMHB0O2ZvbnQtZmFtaWx5OiJMdWNpZGEgQ29uc29sZSIsIkRlamFWdSBTYW5zIE1vbm8iJz5Gd2RMb2NrRmlsZV9DaGVja0RhdGFJbnRlZ3JpdHk8L3NwYW4+LAord2hpY2ggY2hlY2tzIHRoZSBpbnRlZ3JpdHkgb2YgdGhlIGVuY3J5cHRlZCBjb250ZW50IGRhdGEuPC9wPgorCis8cCBjbGFzcz1Nc29Cb2R5VGV4dCBzdHlsZT0nbWFyZ2luLWxlZnQ6MzYuMHB0O3RleHQtaW5kZW50Oi0xOC4wcHQnPjIuPHNwYW4KK3N0eWxlPSdmb250OjcuMHB0ICJUaW1lcyBOZXcgUm9tYW4iJz4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgPC9zcGFuPjxzcGFuCitzdHlsZT0nZm9udC1zaXplOjEwLjBwdDtmb250LWZhbWlseToiTHVjaWRhIENvbnNvbGUiLCJEZWphVnUgU2FucyBNb25vIic+RndkTG9ja0ZpbGVfQ2hlY2tIZWFkZXJJbnRlZ3JpdHk8L3NwYW4+LAord2hpY2ggY2hlY2tzIHRoZSBpbnRlZ3JpdHkgb2YgdGhlIGZpbGUgaGVhZGVyLCBpbmNsdWRpbmcgdGhlIGNvbnRlbnQgdHlwZSBhbmQKK290aGVyIGZpZWxkcyBub3QgY3VycmVudGx5IHN1cHBvcnRlZCBidXQgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UuPC9wPgorCis8cCBjbGFzcz1Nc29Cb2R5VGV4dCBzdHlsZT0nbWFyZ2luLWxlZnQ6MzYuMHB0O3RleHQtaW5kZW50Oi0xOC4wcHQnPjMuPHNwYW4KK3N0eWxlPSdmb250OjcuMHB0ICJUaW1lcyBOZXcgUm9tYW4iJz4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgPC9zcGFuPjxzcGFuCitzdHlsZT0nZm9udC1zaXplOjEwLjBwdDtmb250LWZhbWlseToiTHVjaWRhIENvbnNvbGUiLCJEZWphVnUgU2FucyBNb25vIic+RndkTG9ja0ZpbGVfQ2hlY2tJbnRlZ3JpdHk8L3NwYW4+LAord2hpY2ggaW50ZXJuYWxseSBjYWxscyBmaXJzdCA8c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdDtmb250LWZhbWlseToiTHVjaWRhIENvbnNvbGUiLCJEZWphVnUgU2FucyBNb25vIic+RndkTG9ja0ZpbGVfQ2hlY2tIZWFkZXJJbnRlZ3JpdHk8L3NwYW4+CithbmQgdGhlbiA8c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdDtmb250LWZhbWlseToiTHVjaWRhIENvbnNvbGUiLCJEZWphVnUgU2FucyBNb25vIic+RndkTG9ja0ZpbGVfQ2hlY2tEYXRhSW50ZWdyaXR5PC9zcGFuPi48L3A+CisKKzxwIGNsYXNzPU1zb0JvZHlUZXh0IHN0eWxlPSdtYXJnaW4tYm90dG9tOjI0LjBwdCc+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7Citmb250LWZhbWlseToiTHVjaWRhIENvbnNvbGUiLCJEZWphVnUgU2FucyBNb25vIic+RndkTG9ja0ZpbGVfQ2hlY2tIZWFkZXJJbnRlZ3JpdHk8L3NwYW4+IGlzCitnZW5lcmFsbHkgbXVjaCBmYXN0ZXIgdGhhbiA8c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdDtmb250LWZhbWlseToiTHVjaWRhIENvbnNvbGUiLCJEZWphVnUgU2FucyBNb25vIic+RndkTG9ja0ZpbGVfQ2hlY2tEYXRhSW50ZWdyaXR5PC9zcGFuPiwKK3dob3NlIHJ1bm5pbmcgdGltZSBpcyBkaXJlY3RseSBwcm9wb3J0aW9uYWwgdG8gdGhlIHNpemUgb2YgdGhlIGZpbGUuPC9wPgorCis8cCBjbGFzcz1Nc29Cb2R5VGV4dCBzdHlsZT0ncGFnZS1icmVhay1hZnRlcjphdm9pZCc+PGltZyB3aWR0aD01NDMgaGVpZ2h0PTU3NQorc3JjPSJpbWFnZXMvaW1hZ2UwMDQuZ2lmIj48L3A+CisKKzxwIGNsYXNzPU1zb0NhcHRpb24gc3R5bGU9J21hcmdpbi10b3A6Ni4wcHQ7bWFyZ2luLXJpZ2h0OjBjbTttYXJnaW4tYm90dG9tOgorMTIuMHB0O21hcmdpbi1sZWZ0OjBjbSc+PGEgbmFtZT0iX1JlZjI2MzE2MzMwOCI+RmlndXJlIDwvYT40LiBEZWNvZGVyIFVDOiBDaGVjayBJbnRlZ3JpdHkuPC9wPgorCis8Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEzLjBwdDtmb250LWZhbWlseToiQXJpYWwiLCJzYW5zLXNlcmlmIic+PGJyCitjbGVhcj1hbGwgc3R5bGU9J3BhZ2UtYnJlYWstYmVmb3JlOmFsd2F5cyc+Cis8L3NwYW4+PC9iPgorCis8aDM+PGEgbmFtZT0iX1RvYzI3NjQ3MTQzMCI+PC9hPjxhIG5hbWU9Il9SZWYyNjMxNjMxMTciPjMuMi4yPHNwYW4KK3N0eWxlPSdmb250OjcuMHB0ICJUaW1lcyBOZXcgUm9tYW4iJz4mbmJzcDsmbmJzcDsmbmJzcDsgPC9zcGFuPkdldCBDb250ZW50IFR5cGU8L2E+PC9oMz4KKworPHAgY2xhc3M9TXNvQm9keVRleHQgc3R5bGU9J21hcmdpbi1ib3R0b206MjQuMHB0Jz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdDsKK2ZvbnQtZmFtaWx5OiJMdWNpZGEgQ29uc29sZSIsIkRlamFWdSBTYW5zIE1vbm8iJz5Gd2RMb2NrRmlsZV9HZXRDb250ZW50VHlwZTwvc3Bhbj4gcmV0dXJucyBhCityZWFkLW9ubHkgcmVmZXJlbmNlIHRvIGFuIEFTQ0lJIHN0cmluZyBjb250YWluaW5nIHRoZSBNSU1FIHR5cGUgb2YgdGhlCitlbWJlZGRlZCBjb250ZW50LiBUaGlzIHJlZmVyZW5jZSBpcyB2YWxpZCBhcyBsb25nIGFzIHRoZSBmaWxlIGlzIGtlcHQgb3Blbi4KK0NsaWVudHMgd2hvIG5lZWQgYWNjZXNzIHRvIHRoZSBjb250ZW50IHR5cGUgYWZ0ZXIgY2xvc2luZyB0aGUgZmlsZSBzaG91bGQgbWFrZQorYSBjb3B5IG9mIHRoZSBzdHJpbmcuIFNlZSBGaWd1cmUgNSBiZWxvdy48L3A+CisKKzxwIGNsYXNzPU1zb0JvZHlUZXh0IHN0eWxlPSdwYWdlLWJyZWFrLWFmdGVyOmF2b2lkJz48aW1nIHdpZHRoPTU0MyBoZWlnaHQ9NDg4CitzcmM9ImltYWdlcy9pbWFnZTAwNS5naWYiPjwvcD4KKworPHAgY2xhc3M9TXNvQ2FwdGlvbiBzdHlsZT0nbWFyZ2luLXRvcDo2LjBwdDttYXJnaW4tcmlnaHQ6MGNtO21hcmdpbi1ib3R0b206CisxMi4wcHQ7bWFyZ2luLWxlZnQ6MGNtJz48YSBuYW1lPSJfUmVmMjYzMTYzMzkyIj5GaWd1cmUgPC9hPjUuIERlY29kZXIgVUM6IEdldCBDb250ZW50IFR5cGUuPC9wPgorCis8Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEzLjBwdDtmb250LWZhbWlseToiQXJpYWwiLCJzYW5zLXNlcmlmIic+PGJyCitjbGVhcj1hbGwgc3R5bGU9J3BhZ2UtYnJlYWstYmVmb3JlOmFsd2F5cyc+Cis8L3NwYW4+PC9iPgorCis8aDM+PGEgbmFtZT0iX1RvYzI3NjQ3MTQzMSI+PC9hPjxhIG5hbWU9Il9SZWYyNjMxNjMxMzciPjMuMi4zPHNwYW4KK3N0eWxlPSdmb250OjcuMHB0ICJUaW1lcyBOZXcgUm9tYW4iJz4mbmJzcDsmbmJzcDsmbmJzcDsgPC9zcGFuPkRlY29kZSBGaWxlPC9hPjwvaDM+CisKKzxwIGNsYXNzPU1zb0JvZHlUZXh0PkFmdGVyIG9wZW5pbmcgYW4gaW50ZXJuYWwgRm9yd2FyZCBMb2NrIGZpbGUgKG9yIGF0dGFjaGluZwordG8gYW4gYWxyZWFkeSBvcGVuIG9uZSksIGl0IGNhbiBiZSB0cmFuc3BhcmVudGx5IHJlYWQgZnJvbSBhcyBpZiBpdCB3ZXJlCit1bmVuY3J5cHRlZC4gQW55IG51bWJlciBvZiBjYWxscyB0byByZWFkIGRhdGEgZnJvbSB0aGUgY3VycmVudCBmaWxlIHBvc2l0aW9uIG9yCitzZXQgaXQgdG8gYSBuZXcgb25lICh3aGljaCBpcyB3aGF0IDxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0O2ZvbnQtZmFtaWx5OgorIkx1Y2lkYSBDb25zb2xlIiwiRGVqYVZ1IFNhbnMgTW9ubyInPmxzZWVrPC9zcGFuPiBkb2VzKSBjYW4gYmUgbWFkZSBpbiBhbnkgb3JkZXI7IHRoaXMgaXMgd2hhdCB3ZQorY2FsbCA8aT5yYW5kb20gYWNjZXNzPC9pPi4gU2VlIEZpZ3VyZSA2LjwvcD4KKworPHAgY2xhc3M9TXNvQm9keVRleHQ+VGhlIEZvcndhcmQgTG9jayBEZWNvZGVyIHZlcnNpb25zIG9mIHRoZSA8c3Bhbgorc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7Zm9udC1mYW1pbHk6Ikx1Y2lkYSBDb25zb2xlIiwiRGVqYVZ1IFNhbnMgTW9ubyInPnJlYWQ8L3NwYW4+LCA8c3Bhbgorc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7Zm9udC1mYW1pbHk6Ikx1Y2lkYSBDb25zb2xlIiwiRGVqYVZ1IFNhbnMgTW9ubyInPmxzZWVrPC9zcGFuPiwgYW5kIDxzcGFuCitzdHlsZT0nZm9udC1zaXplOjEwLjBwdDtmb250LWZhbWlseToiTHVjaWRhIENvbnNvbGUiLCJEZWphVnUgU2FucyBNb25vIic+Y2xvc2U8L3NwYW4+IGZ1bmN0aW9ucworaGF2ZSB0aGUgZXhhY3Qgc2FtZSBzaWduYXR1cmVzIGFzIHRoZWlyIFBPU0lYIGNvdW50ZXJwYXJ0cy4gU28sIGZvciBleGFtcGxlLAordGhlIGNhbGwgPHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7Zm9udC1mYW1pbHk6Ikx1Y2lkYSBDb25zb2xlIiwiRGVqYVZ1IFNhbnMgTW9ubyInPkZ3ZExvY2tGaWxlX2xzZWVrKGZkLAorMCwgU0VFS19FTkQpPC9zcGFuPiByZXR1cm5zIHRoZSBzaXplIG9mIHRoZSBlbWJlZGRlZCBjb250ZW50IGRhdGEsIGkuZS4sIHRoZQorc2l6ZSBvZiB0aGUgb3JpZ2luYWwgZmlsZSBiZWZvcmUgRFJNIHByb3RlY3Rpb24uPC9wPgorCis8cCBjbGFzcz1Nc29Cb2R5VGV4dCBzdHlsZT0nbWFyZ2luLWJvdHRvbToyNC4wcHQnPk1vcmVvdmVyLCA8c3Bhbgorc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7Zm9udC1mYW1pbHk6Ikx1Y2lkYSBDb25zb2xlIiwiRGVqYVZ1IFNhbnMgTW9ubyInPkZ3ZExvY2tGaWxlX29wZW48L3NwYW4+CitpcyBsaWtlIHJlZ3VsYXIgUE9TSVggPHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7Zm9udC1mYW1pbHk6Ikx1Y2lkYSBDb25zb2xlIiwiRGVqYVZ1IFNhbnMgTW9ubyInPm9wZW48L3NwYW4+CitleGNlcHQgaXQgdGFrZXMgb25seSB0aGUgZmlsZW5hbWUgYXMgYSBwYXJhbWV0ZXKXYWNjZXNzIGlzIGFsd2F5cyByZWFkLW9ubHkuPC9wPgorCis8cCBjbGFzcz1Nc29Cb2R5VGV4dCBzdHlsZT0ncGFnZS1icmVhay1hZnRlcjphdm9pZCc+PGltZyB3aWR0aD01NDMgaGVpZ2h0PTUyMgorc3JjPSJpbWFnZXMvaW1hZ2UwMDYuZ2lmIj48L3A+CisKKzxwIGNsYXNzPU1zb0NhcHRpb24gc3R5bGU9J21hcmdpbi10b3A6Ni4wcHQ7bWFyZ2luLXJpZ2h0OjBjbTttYXJnaW4tYm90dG9tOgorMTIuMHB0O21hcmdpbi1sZWZ0OjBjbSc+PGEgbmFtZT0iX1JlZjI2MzE2NjMwMyI+RmlndXJlIDwvYT42LiBEZWNvZGVyIFVDOiBEZWNvZGUgRmlsZS48L3A+CisKKzxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTYuMHB0O2ZvbnQtZmFtaWx5OiJBcmlhbCIsInNhbnMtc2VyaWYiJz48YnIKK2NsZWFyPWFsbCBzdHlsZT0ncGFnZS1icmVhay1iZWZvcmU6YWx3YXlzJz4KKzwvc3Bhbj48L2I+CisKKzxoMT48YSBuYW1lPSJfVG9jMjc2NDcxNDMyIj40PHNwYW4gc3R5bGU9J2ZvbnQ6Ny4wcHQgIlRpbWVzIE5ldyBSb21hbiInPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOworPC9zcGFuPkRlZmluaXRpb24gb2YgdGhlIEludGVybmFsIEZvcndhcmQgTG9jayBGaWxlIEZvcm1hdDwvYT48L2gxPgorCis8cCBjbGFzcz1Nc29Cb2R5VGV4dCBzdHlsZT0nbWFyZ2luLWJvdHRvbToxMi4wcHQnPlRoZSBpbm5lciBzdHJ1Y3R1cmUgb2YgYW4gaW50ZXJuYWwKK0ZvcndhcmQgTG9jayBmaWxlIGlzIGRlZmluZWQgaW4gVGFibGUgMSBiZWxvdy48L3A+CisKKzx0YWJsZSBjbGFzcz1Nc29Ob3JtYWxUYWJsZSBib3JkZXI9MSBjZWxsc3BhY2luZz0wIGNlbGxwYWRkaW5nPTAKKyBzdHlsZT0nYm9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlO2JvcmRlcjpub25lJz4KKyA8dHI+CisgIDx0ZCB3aWR0aD0xMTEgdmFsaWduPXRvcCBzdHlsZT0nd2lkdGg6ODMuNHB0O2JvcmRlcjpzb2xpZCB3aW5kb3d0ZXh0IDEuMHB0OworICBwYWRkaW5nOjBjbSA1LjRwdCAwY20gNS40cHQnPgorICA8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J3BhZ2UtYnJlYWstYWZ0ZXI6YXZvaWQnPjxiPk9mZnNldCBbYnl0ZXNdPC9iPjwvcD4KKyAgPC90ZD4KKyAgPHRkIHdpZHRoPTk2IHZhbGlnbj10b3Agc3R5bGU9J3dpZHRoOjcyLjBwdDtib3JkZXI6c29saWQgd2luZG93dGV4dCAxLjBwdDsKKyAgYm9yZGVyLWxlZnQ6bm9uZTtwYWRkaW5nOjBjbSA1LjRwdCAwY20gNS40cHQnPgorICA8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J3BhZ2UtYnJlYWstYWZ0ZXI6YXZvaWQnPjxiPlNpemUgW2J5dGVzXTwvYj48L3A+CisgIDwvdGQ+CisgIDx0ZCB3aWR0aD0zNjEgdmFsaWduPXRvcCBzdHlsZT0nd2lkdGg6MjcwLjg1cHQ7Ym9yZGVyOnNvbGlkIHdpbmRvd3RleHQgMS4wcHQ7CisgIGJvcmRlci1sZWZ0Om5vbmU7cGFkZGluZzowY20gNS40cHQgMGNtIDUuNHB0Jz4KKyAgPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdwYWdlLWJyZWFrLWFmdGVyOmF2b2lkJz48Yj5EZXNjcmlwdGlvbjwvYj48L3A+CisgIDwvdGQ+CisgPC90cj4KKyA8dHI+CisgIDx0ZCB3aWR0aD0xMTEgdmFsaWduPXRvcCBzdHlsZT0nd2lkdGg6ODMuNHB0O2JvcmRlcjpzb2xpZCB3aW5kb3d0ZXh0IDEuMHB0OworICBib3JkZXItdG9wOm5vbmU7cGFkZGluZzowY20gNS40cHQgMGNtIDUuNHB0Jz4KKyAgPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdwYWdlLWJyZWFrLWFmdGVyOmF2b2lkJz4wPC9wPgorICA8L3RkPgorICA8dGQgd2lkdGg9OTYgdmFsaWduPXRvcCBzdHlsZT0nd2lkdGg6NzIuMHB0O2JvcmRlci10b3A6bm9uZTtib3JkZXItbGVmdDpub25lOworICBib3JkZXItYm90dG9tOnNvbGlkIHdpbmRvd3RleHQgMS4wcHQ7Ym9yZGVyLXJpZ2h0OnNvbGlkIHdpbmRvd3RleHQgMS4wcHQ7CisgIHBhZGRpbmc6MGNtIDUuNHB0IDBjbSA1LjRwdCc+CisgIDxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0ncGFnZS1icmVhay1hZnRlcjphdm9pZCc+NDwvcD4KKyAgPC90ZD4KKyAgPHRkIHdpZHRoPTM2MSB2YWxpZ249dG9wIHN0eWxlPSd3aWR0aDoyNzAuODVwdDtib3JkZXItdG9wOm5vbmU7Ym9yZGVyLWxlZnQ6CisgIG5vbmU7Ym9yZGVyLWJvdHRvbTpzb2xpZCB3aW5kb3d0ZXh0IDEuMHB0O2JvcmRlci1yaWdodDpzb2xpZCB3aW5kb3d0ZXh0IDEuMHB0OworICBwYWRkaW5nOjBjbSA1LjRwdCAwY20gNS40cHQnPgorICA8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J3BhZ2UtYnJlYWstYWZ0ZXI6YXZvaWQnPlRoZSBmaWxlIHNpZ25hdHVyZSAoc28tY2FsbGVkCisgIDxpPm1hZ2ljIG51bWJlcjwvaT4pOiBhIGZvdXItY2hhcmFjdGVyIGNvZGUgY29uc2lzdGluZyBvZiB0aGUgbGV0dGVycworICBGLVctTC1LLjwvcD4KKyAgPC90ZD4KKyA8L3RyPgorIDx0cj4KKyAgPHRkIHdpZHRoPTExMSB2YWxpZ249dG9wIHN0eWxlPSd3aWR0aDo4My40cHQ7Ym9yZGVyOnNvbGlkIHdpbmRvd3RleHQgMS4wcHQ7CisgIGJvcmRlci10b3A6bm9uZTtwYWRkaW5nOjBjbSA1LjRwdCAwY20gNS40cHQnPgorICA8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J3BhZ2UtYnJlYWstYWZ0ZXI6YXZvaWQnPjQ8L3A+CisgIDwvdGQ+CisgIDx0ZCB3aWR0aD05NiB2YWxpZ249dG9wIHN0eWxlPSd3aWR0aDo3Mi4wcHQ7Ym9yZGVyLXRvcDpub25lO2JvcmRlci1sZWZ0Om5vbmU7CisgIGJvcmRlci1ib3R0b206c29saWQgd2luZG93dGV4dCAxLjBwdDtib3JkZXItcmlnaHQ6c29saWQgd2luZG93dGV4dCAxLjBwdDsKKyAgcGFkZGluZzowY20gNS40cHQgMGNtIDUuNHB0Jz4KKyAgPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdwYWdlLWJyZWFrLWFmdGVyOmF2b2lkJz4xPC9wPgorICA8L3RkPgorICA8dGQgd2lkdGg9MzYxIHZhbGlnbj10b3Agc3R5bGU9J3dpZHRoOjI3MC44NXB0O2JvcmRlci10b3A6bm9uZTtib3JkZXItbGVmdDoKKyAgbm9uZTtib3JkZXItYm90dG9tOnNvbGlkIHdpbmRvd3RleHQgMS4wcHQ7Ym9yZGVyLXJpZ2h0OnNvbGlkIHdpbmRvd3RleHQgMS4wcHQ7CisgIHBhZGRpbmc6MGNtIDUuNHB0IDBjbSA1LjRwdCc+CisgIDxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0ncGFnZS1icmVhay1hZnRlcjphdm9pZCc+VmVyc2lvbiBudW1iZXIgKDAgZm9yIHRoZQorICBmaXJzdCB2ZXJzaW9uKS48L3A+CisgIDwvdGQ+CisgPC90cj4KKyA8dHI+CisgIDx0ZCB3aWR0aD0xMTEgdmFsaWduPXRvcCBzdHlsZT0nd2lkdGg6ODMuNHB0O2JvcmRlcjpzb2xpZCB3aW5kb3d0ZXh0IDEuMHB0OworICBib3JkZXItdG9wOm5vbmU7cGFkZGluZzowY20gNS40cHQgMGNtIDUuNHB0Jz4KKyAgPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdwYWdlLWJyZWFrLWFmdGVyOmF2b2lkJz41PC9wPgorICA8L3RkPgorICA8dGQgd2lkdGg9OTYgdmFsaWduPXRvcCBzdHlsZT0nd2lkdGg6NzIuMHB0O2JvcmRlci10b3A6bm9uZTtib3JkZXItbGVmdDpub25lOworICBib3JkZXItYm90dG9tOnNvbGlkIHdpbmRvd3RleHQgMS4wcHQ7Ym9yZGVyLXJpZ2h0OnNvbGlkIHdpbmRvd3RleHQgMS4wcHQ7CisgIHBhZGRpbmc6MGNtIDUuNHB0IDBjbSA1LjRwdCc+CisgIDxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0ncGFnZS1icmVhay1hZnRlcjphdm9pZCc+MTwvcD4KKyAgPC90ZD4KKyAgPHRkIHdpZHRoPTM2MSB2YWxpZ249dG9wIHN0eWxlPSd3aWR0aDoyNzAuODVwdDtib3JkZXItdG9wOm5vbmU7Ym9yZGVyLWxlZnQ6CisgIG5vbmU7Ym9yZGVyLWJvdHRvbTpzb2xpZCB3aW5kb3d0ZXh0IDEuMHB0O2JvcmRlci1yaWdodDpzb2xpZCB3aW5kb3d0ZXh0IDEuMHB0OworICBwYWRkaW5nOjBjbSA1LjRwdCAwY20gNS40cHQnPgorICA8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J3BhZ2UtYnJlYWstYWZ0ZXI6YXZvaWQnPkluZGljYXRlcyB0aGUgc3ViZm9ybWF0OjwvcD4KKyAgPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdwYWdlLWJyZWFrLWFmdGVyOmF2b2lkJz48aT4weDAwIEZvcndhcmQgTG9jazwvaT48L3A+CisgIDxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0ncGFnZS1icmVhay1hZnRlcjphdm9pZCc+PGk+MHgwMSBDb21iaW5lZCBEZWxpdmVyeTwvaT48L3A+CisgIDwvdGQ+CisgPC90cj4KKyA8dHI+CisgIDx0ZCB3aWR0aD0xMTEgdmFsaWduPXRvcCBzdHlsZT0nd2lkdGg6ODMuNHB0O2JvcmRlcjpzb2xpZCB3aW5kb3d0ZXh0IDEuMHB0OworICBib3JkZXItdG9wOm5vbmU7cGFkZGluZzowY20gNS40cHQgMGNtIDUuNHB0Jz4KKyAgPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdwYWdlLWJyZWFrLWFmdGVyOmF2b2lkJz42PC9wPgorICA8L3RkPgorICA8dGQgd2lkdGg9OTYgdmFsaWduPXRvcCBzdHlsZT0nd2lkdGg6NzIuMHB0O2JvcmRlci10b3A6bm9uZTtib3JkZXItbGVmdDpub25lOworICBib3JkZXItYm90dG9tOnNvbGlkIHdpbmRvd3RleHQgMS4wcHQ7Ym9yZGVyLXJpZ2h0OnNvbGlkIHdpbmRvd3RleHQgMS4wcHQ7CisgIHBhZGRpbmc6MGNtIDUuNHB0IDBjbSA1LjRwdCc+CisgIDxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0ncGFnZS1icmVhay1hZnRlcjphdm9pZCc+MTwvcD4KKyAgPC90ZD4KKyAgPHRkIHdpZHRoPTM2MSB2YWxpZ249dG9wIHN0eWxlPSd3aWR0aDoyNzAuODVwdDtib3JkZXItdG9wOm5vbmU7Ym9yZGVyLWxlZnQ6CisgIG5vbmU7Ym9yZGVyLWJvdHRvbTpzb2xpZCB3aW5kb3d0ZXh0IDEuMHB0O2JvcmRlci1yaWdodDpzb2xpZCB3aW5kb3d0ZXh0IDEuMHB0OworICBwYWRkaW5nOjBjbSA1LjRwdCAwY20gNS40cHQnPgorICA8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J3BhZ2UtYnJlYWstYWZ0ZXI6YXZvaWQnPlVzYWdlIHJlc3RyaWN0aW9uIGZsYWdzIChwcm9oaWJpdGlvbnMKKyAgYWdhaW5zdCB1c2FnZSBhcyByaW5ndG9uZSBvciBhcyB3YWxscGFwZXIgYW5kIHNjcmVlbiBzYXZlcikuIEFsc28gaW5kaWNhdGVzCisgIGlmIHRoZSBmaWxlIGlzIGJvdW5kIHRvIGEgc3BlY2lmaWMgU0lNIGNhcmQuPC9wPgorICA8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J3BhZ2UtYnJlYWstYWZ0ZXI6YXZvaWQnPjxpPjB4MDAgTm8gdXNhZ2UKKyAgcmVzdHJpY3Rpb25zPC9pPjwvcD4KKyAgPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdwYWdlLWJyZWFrLWFmdGVyOmF2b2lkJz48aT4weDAxIFJpbmd0b25lIHVzYWdlCisgIHByb2hpYml0ZWQ8L2k+PC9wPgorICA8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J3BhZ2UtYnJlYWstYWZ0ZXI6YXZvaWQnPjxpPjB4MDIgU2NyZWVuIHVzYWdlCisgIHByb2hpYml0ZWQ8L2k+PC9wPgorICA8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J3BhZ2UtYnJlYWstYWZ0ZXI6YXZvaWQnPjxpPjB4ODAgQm91bmQgdG8gU0lNPC9pPjwvcD4KKyAgPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdwYWdlLWJyZWFrLWFmdGVyOmF2b2lkJz4oQW55IG51bWJlciBvZiB0aGVzZSBtYXkgYmUKKyAgT1ItZWQgdG9nZXRoZXIuKTwvcD4KKyAgPC90ZD4KKyA8L3RyPgorIDx0cj4KKyAgPHRkIHdpZHRoPTExMSB2YWxpZ249dG9wIHN0eWxlPSd3aWR0aDo4My40cHQ7Ym9yZGVyOnNvbGlkIHdpbmRvd3RleHQgMS4wcHQ7CisgIGJvcmRlci10b3A6bm9uZTtwYWRkaW5nOjBjbSA1LjRwdCAwY20gNS40cHQnPgorICA8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J3BhZ2UtYnJlYWstYWZ0ZXI6YXZvaWQnPjc8L3A+CisgIDwvdGQ+CisgIDx0ZCB3aWR0aD05NiB2YWxpZ249dG9wIHN0eWxlPSd3aWR0aDo3Mi4wcHQ7Ym9yZGVyLXRvcDpub25lO2JvcmRlci1sZWZ0Om5vbmU7CisgIGJvcmRlci1ib3R0b206c29saWQgd2luZG93dGV4dCAxLjBwdDtib3JkZXItcmlnaHQ6c29saWQgd2luZG93dGV4dCAxLjBwdDsKKyAgcGFkZGluZzowY20gNS40cHQgMGNtIDUuNHB0Jz4KKyAgPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdwYWdlLWJyZWFrLWFmdGVyOmF2b2lkJz4xPC9wPgorICA8L3RkPgorICA8dGQgd2lkdGg9MzYxIHZhbGlnbj10b3Agc3R5bGU9J3dpZHRoOjI3MC44NXB0O2JvcmRlci10b3A6bm9uZTtib3JkZXItbGVmdDoKKyAgbm9uZTtib3JkZXItYm90dG9tOnNvbGlkIHdpbmRvd3RleHQgMS4wcHQ7Ym9yZGVyLXJpZ2h0OnNvbGlkIHdpbmRvd3RleHQgMS4wcHQ7CisgIHBhZGRpbmc6MGNtIDUuNHB0IDBjbSA1LjRwdCc+CisgIDxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0ncGFnZS1icmVhay1hZnRlcjphdm9pZCc+TGVuZ3RoIG9mIHRoZSBNSU1FIGNvbnRlbnQKKyAgdHlwZSAoPGk+azwvaT4pLjwvcD4KKyAgPC90ZD4KKyA8L3RyPgorIDx0cj4KKyAgPHRkIHdpZHRoPTExMSB2YWxpZ249dG9wIHN0eWxlPSd3aWR0aDo4My40cHQ7Ym9yZGVyOnNvbGlkIHdpbmRvd3RleHQgMS4wcHQ7CisgIGJvcmRlci10b3A6bm9uZTtwYWRkaW5nOjBjbSA1LjRwdCAwY20gNS40cHQnPgorICA8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J3BhZ2UtYnJlYWstYWZ0ZXI6YXZvaWQnPjg8L3A+CisgIDwvdGQ+CisgIDx0ZCB3aWR0aD05NiB2YWxpZ249dG9wIHN0eWxlPSd3aWR0aDo3Mi4wcHQ7Ym9yZGVyLXRvcDpub25lO2JvcmRlci1sZWZ0Om5vbmU7CisgIGJvcmRlci1ib3R0b206c29saWQgd2luZG93dGV4dCAxLjBwdDtib3JkZXItcmlnaHQ6c29saWQgd2luZG93dGV4dCAxLjBwdDsKKyAgcGFkZGluZzowY20gNS40cHQgMGNtIDUuNHB0Jz4KKyAgPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdwYWdlLWJyZWFrLWFmdGVyOmF2b2lkJz48aT5rPC9pPjwvcD4KKyAgPC90ZD4KKyAgPHRkIHdpZHRoPTM2MSB2YWxpZ249dG9wIHN0eWxlPSd3aWR0aDoyNzAuODVwdDtib3JkZXItdG9wOm5vbmU7Ym9yZGVyLWxlZnQ6CisgIG5vbmU7Ym9yZGVyLWJvdHRvbTpzb2xpZCB3aW5kb3d0ZXh0IDEuMHB0O2JvcmRlci1yaWdodDpzb2xpZCB3aW5kb3d0ZXh0IDEuMHB0OworICBwYWRkaW5nOjBjbSA1LjRwdCAwY20gNS40cHQnPgorICA8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J3BhZ2UtYnJlYWstYWZ0ZXI6YXZvaWQnPlRoZSBNSU1FIGNvbnRlbnQgdHlwZQorICAoQVNDSUktZW5jb2RlZCB3aXRob3V0IG51bGwtY2hhcmFjdGVyIHRlcm1pbmF0aW9uKS48L3A+CisgIDwvdGQ+CisgPC90cj4KKyA8dHI+CisgIDx0ZCB3aWR0aD0xMTEgdmFsaWduPXRvcCBzdHlsZT0nd2lkdGg6ODMuNHB0O2JvcmRlcjpzb2xpZCB3aW5kb3d0ZXh0IDEuMHB0OworICBib3JkZXItdG9wOm5vbmU7cGFkZGluZzowY20gNS40cHQgMGNtIDUuNHB0Jz4KKyAgPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdwYWdlLWJyZWFrLWFmdGVyOmF2b2lkJz44KzxpPms8L2k+PC9wPgorICA8L3RkPgorICA8dGQgd2lkdGg9OTYgdmFsaWduPXRvcCBzdHlsZT0nd2lkdGg6NzIuMHB0O2JvcmRlci10b3A6bm9uZTtib3JkZXItbGVmdDpub25lOworICBib3JkZXItYm90dG9tOnNvbGlkIHdpbmRvd3RleHQgMS4wcHQ7Ym9yZGVyLXJpZ2h0OnNvbGlkIHdpbmRvd3RleHQgMS4wcHQ7CisgIHBhZGRpbmc6MGNtIDUuNHB0IDBjbSA1LjRwdCc+CisgIDxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0ncGFnZS1icmVhay1hZnRlcjphdm9pZCc+PGk+bCA8L2k+PSAwIG9yIDE2PC9wPgorICA8L3RkPgorICA8dGQgd2lkdGg9MzYxIHZhbGlnbj10b3Agc3R5bGU9J3dpZHRoOjI3MC44NXB0O2JvcmRlci10b3A6bm9uZTtib3JkZXItbGVmdDoKKyAgbm9uZTtib3JkZXItYm90dG9tOnNvbGlkIHdpbmRvd3RleHQgMS4wcHQ7Ym9yZGVyLXJpZ2h0OnNvbGlkIHdpbmRvd3RleHQgMS4wcHQ7CisgIHBhZGRpbmc6MGNtIDUuNHB0IDBjbSA1LjRwdCc+CisgIDxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0ncGFnZS1icmVhay1hZnRlcjphdm9pZCc+SWYgdGhlIHN1YmZvcm1hdCBpcworICBDb21iaW5lZCBEZWxpdmVyeSwgdGhpcyBmaWVsZCBjb250YWlucyB0aGUgYXV0by1nZW5lcmF0ZWQgY29udGVudCBJRCAoMTYmbmJzcDtieXRlcykuCisgIElmIG5vdCwgdGhpcyBmaWVsZCBpcyB6ZXJvLXNpemUuPC9wPgorICA8L3RkPgorIDwvdHI+CisgPHRyPgorICA8dGQgd2lkdGg9MTExIHZhbGlnbj10b3Agc3R5bGU9J3dpZHRoOjgzLjRwdDtib3JkZXI6c29saWQgd2luZG93dGV4dCAxLjBwdDsKKyAgYm9yZGVyLXRvcDpub25lO3BhZGRpbmc6MGNtIDUuNHB0IDBjbSA1LjRwdCc+CisgIDxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0ncGFnZS1icmVhay1hZnRlcjphdm9pZCc+OCs8aT5rPC9pPis8aT5sPC9pPjwvcD4KKyAgPC90ZD4KKyAgPHRkIHdpZHRoPTk2IHZhbGlnbj10b3Agc3R5bGU9J3dpZHRoOjcyLjBwdDtib3JkZXItdG9wOm5vbmU7Ym9yZGVyLWxlZnQ6bm9uZTsKKyAgYm9yZGVyLWJvdHRvbTpzb2xpZCB3aW5kb3d0ZXh0IDEuMHB0O2JvcmRlci1yaWdodDpzb2xpZCB3aW5kb3d0ZXh0IDEuMHB0OworICBwYWRkaW5nOjBjbSA1LjRwdCAwY20gNS40cHQnPgorICA8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J3BhZ2UtYnJlYWstYWZ0ZXI6YXZvaWQnPjxpPm0gPC9pPj0gMCBvciA5PC9wPgorICA8L3RkPgorICA8dGQgd2lkdGg9MzYxIHZhbGlnbj10b3Agc3R5bGU9J3dpZHRoOjI3MC44NXB0O2JvcmRlci10b3A6bm9uZTtib3JkZXItbGVmdDoKKyAgbm9uZTtib3JkZXItYm90dG9tOnNvbGlkIHdpbmRvd3RleHQgMS4wcHQ7Ym9yZGVyLXJpZ2h0OnNvbGlkIHdpbmRvd3RleHQgMS4wcHQ7CisgIHBhZGRpbmc6MGNtIDUuNHB0IDBjbSA1LjRwdCc+CisgIDxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0ncGFnZS1icmVhay1hZnRlcjphdm9pZCc+SWYgdGhlIGZpbGUgaXMgYm91bmQgdG8gYQorICBzcGVjaWZpYyBTSU0gY2FyZCwgdGhpcyBmaWVsZCBjb250YWlucyB0aGUgOS1ieXRlIHBhY2tlZCBJTVNJIG51bWJlci4gSWYgbm90LAorICB0aGlzIGZpZWxkIGlzIHplcm8tc2l6ZS48L3A+CisgIDwvdGQ+CisgPC90cj4KKyA8dHI+CisgIDx0ZCB3aWR0aD0xMTEgdmFsaWduPXRvcCBzdHlsZT0nd2lkdGg6ODMuNHB0O2JvcmRlcjpzb2xpZCB3aW5kb3d0ZXh0IDEuMHB0OworICBib3JkZXItdG9wOm5vbmU7cGFkZGluZzowY20gNS40cHQgMGNtIDUuNHB0Jz4KKyAgPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdwYWdlLWJyZWFrLWFmdGVyOmF2b2lkJz44KzxpPms8L2k+KzxpPmw8L2k+KzxpPm08L2k+PC9wPgorICA8L3RkPgorICA8dGQgd2lkdGg9OTYgdmFsaWduPXRvcCBzdHlsZT0nd2lkdGg6NzIuMHB0O2JvcmRlci10b3A6bm9uZTtib3JkZXItbGVmdDpub25lOworICBib3JkZXItYm90dG9tOnNvbGlkIHdpbmRvd3RleHQgMS4wcHQ7Ym9yZGVyLXJpZ2h0OnNvbGlkIHdpbmRvd3RleHQgMS4wcHQ7CisgIHBhZGRpbmc6MGNtIDUuNHB0IDBjbSA1LjRwdCc+CisgIDxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0ncGFnZS1icmVhay1hZnRlcjphdm9pZCc+PGk+bjwvaT4gJiM4ODA1OyAxNjwvcD4KKyAgPC90ZD4KKyAgPHRkIHdpZHRoPTM2MSB2YWxpZ249dG9wIHN0eWxlPSd3aWR0aDoyNzAuODVwdDtib3JkZXItdG9wOm5vbmU7Ym9yZGVyLWxlZnQ6CisgIG5vbmU7Ym9yZGVyLWJvdHRvbTpzb2xpZCB3aW5kb3d0ZXh0IDEuMHB0O2JvcmRlci1yaWdodDpzb2xpZCB3aW5kb3d0ZXh0IDEuMHB0OworICBwYWRkaW5nOjBjbSA1LjRwdCAwY20gNS40cHQnPgorICA8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J3BhZ2UtYnJlYWstYWZ0ZXI6YXZvaWQnPlRoZSBlbmNyeXB0ZWQgc2Vzc2lvbiBrZXksIHRoZQorICBmaXJzdCBzaXh0ZWVuIGJ5dGVzIG9mIHdoaWNoIGFyZSBhbHNvIHVzZWQgYXMgdGhlIENUUi1tb2RlIDxpPm5vbmNlPC9pPiAoc2ltaWxhcgorICB0byB0aGUgQ0JDLW1vZGUgPGk+aW5pdGlhbGl6YXRpb24gdmVjdG9yPC9pPikuPC9wPgorICA8L3RkPgorIDwvdHI+CisgPHRyPgorICA8dGQgd2lkdGg9MTExIHZhbGlnbj10b3Agc3R5bGU9J3dpZHRoOjgzLjRwdDtib3JkZXI6c29saWQgd2luZG93dGV4dCAxLjBwdDsKKyAgYm9yZGVyLXRvcDpub25lO3BhZGRpbmc6MGNtIDUuNHB0IDBjbSA1LjRwdCc+CisgIDxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0ncGFnZS1icmVhay1hZnRlcjphdm9pZCc+OCs8aT5rPC9pPis8aT5sPC9pPis8aT5tPC9pPis8aT5uPC9pPjwvcD4KKyAgPC90ZD4KKyAgPHRkIHdpZHRoPTk2IHZhbGlnbj10b3Agc3R5bGU9J3dpZHRoOjcyLjBwdDtib3JkZXItdG9wOm5vbmU7Ym9yZGVyLWxlZnQ6bm9uZTsKKyAgYm9yZGVyLWJvdHRvbTpzb2xpZCB3aW5kb3d0ZXh0IDEuMHB0O2JvcmRlci1yaWdodDpzb2xpZCB3aW5kb3d0ZXh0IDEuMHB0OworICBwYWRkaW5nOjBjbSA1LjRwdCAwY20gNS40cHQnPgorICA8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J3BhZ2UtYnJlYWstYWZ0ZXI6YXZvaWQnPjIwPC9wPgorICA8L3RkPgorICA8dGQgd2lkdGg9MzYxIHZhbGlnbj10b3Agc3R5bGU9J3dpZHRoOjI3MC44NXB0O2JvcmRlci10b3A6bm9uZTtib3JkZXItbGVmdDoKKyAgbm9uZTtib3JkZXItYm90dG9tOnNvbGlkIHdpbmRvd3RleHQgMS4wcHQ7Ym9yZGVyLXJpZ2h0OnNvbGlkIHdpbmRvd3RleHQgMS4wcHQ7CisgIHBhZGRpbmc6MGNtIDUuNHB0IDBjbSA1LjRwdCc+CisgIDxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0ncGFnZS1icmVhay1hZnRlcjphdm9pZCc+RGF0YSBzaWduYXR1cmWXdGhlIFNIQS0xCisgIEhNQUMgb2YgdGhlIGVuY3J5cHRlZCBjb250ZW50IGRhdGEuPC9wPgorICA8L3RkPgorIDwvdHI+CisgPHRyPgorICA8dGQgd2lkdGg9MTExIHZhbGlnbj10b3Agc3R5bGU9J3dpZHRoOjgzLjRwdDtib3JkZXI6c29saWQgd2luZG93dGV4dCAxLjBwdDsKKyAgYm9yZGVyLXRvcDpub25lO3BhZGRpbmc6MGNtIDUuNHB0IDBjbSA1LjRwdCc+CisgIDxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0ncGFnZS1icmVhay1hZnRlcjphdm9pZCc+MjgrPGk+azwvaT4rPGk+bDwvaT4rPGk+bTwvaT4rPGk+bjwvaT48L3A+CisgIDwvdGQ+CisgIDx0ZCB3aWR0aD05NiB2YWxpZ249dG9wIHN0eWxlPSd3aWR0aDo3Mi4wcHQ7Ym9yZGVyLXRvcDpub25lO2JvcmRlci1sZWZ0Om5vbmU7CisgIGJvcmRlci1ib3R0b206c29saWQgd2luZG93dGV4dCAxLjBwdDtib3JkZXItcmlnaHQ6c29saWQgd2luZG93dGV4dCAxLjBwdDsKKyAgcGFkZGluZzowY20gNS40cHQgMGNtIDUuNHB0Jz4KKyAgPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdwYWdlLWJyZWFrLWFmdGVyOmF2b2lkJz4yMDwvcD4KKyAgPC90ZD4KKyAgPHRkIHdpZHRoPTM2MSB2YWxpZ249dG9wIHN0eWxlPSd3aWR0aDoyNzAuODVwdDtib3JkZXItdG9wOm5vbmU7Ym9yZGVyLWxlZnQ6CisgIG5vbmU7Ym9yZGVyLWJvdHRvbTpzb2xpZCB3aW5kb3d0ZXh0IDEuMHB0O2JvcmRlci1yaWdodDpzb2xpZCB3aW5kb3d0ZXh0IDEuMHB0OworICBwYWRkaW5nOjBjbSA1LjRwdCAwY20gNS40cHQnPgorICA8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J3BhZ2UtYnJlYWstYWZ0ZXI6YXZvaWQnPkhlYWRlciBzaWduYXR1cmWXdGhlIFNIQS0xCisgIEhNQUMgb2YgYWxsIHRoZSBmaWVsZHMgYWJvdmUsIGluY2x1ZGluZyB0aGUgZW5jcnlwdGVkIHNlc3Npb24ga2V5IGFuZCBkYXRhCisgIHNpZ25hdHVyZS48L3A+CisgIDwvdGQ+CisgPC90cj4KKyA8dHI+CisgIDx0ZCB3aWR0aD0xMTEgdmFsaWduPXRvcCBzdHlsZT0nd2lkdGg6ODMuNHB0O2JvcmRlcjpzb2xpZCB3aW5kb3d0ZXh0IDEuMHB0OworICBib3JkZXItdG9wOm5vbmU7cGFkZGluZzowY20gNS40cHQgMGNtIDUuNHB0Jz4KKyAgPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdwYWdlLWJyZWFrLWFmdGVyOmF2b2lkJz40OCs8aT5rPC9pPis8aT5sPC9pPis8aT5tPC9pPis8aT5uPC9pPjwvcD4KKyAgPC90ZD4KKyAgPHRkIHdpZHRoPTk2IHZhbGlnbj10b3Agc3R5bGU9J3dpZHRoOjcyLjBwdDtib3JkZXItdG9wOm5vbmU7Ym9yZGVyLWxlZnQ6bm9uZTsKKyAgYm9yZGVyLWJvdHRvbTpzb2xpZCB3aW5kb3d0ZXh0IDEuMHB0O2JvcmRlci1yaWdodDpzb2xpZCB3aW5kb3d0ZXh0IDEuMHB0OworICBwYWRkaW5nOjBjbSA1LjRwdCAwY20gNS40cHQnPgorICA8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J3BhZ2UtYnJlYWstYWZ0ZXI6YXZvaWQnPjxpPiZsdDt0byB0aGUgZW5kIG9mIHRoZQorICBmaWxlJmd0OzwvaT48L3A+CisgIDwvdGQ+CisgIDx0ZCB3aWR0aD0zNjEgdmFsaWduPXRvcCBzdHlsZT0nd2lkdGg6MjcwLjg1cHQ7Ym9yZGVyLXRvcDpub25lO2JvcmRlci1sZWZ0OgorICBub25lO2JvcmRlci1ib3R0b206c29saWQgd2luZG93dGV4dCAxLjBwdDtib3JkZXItcmlnaHQ6c29saWQgd2luZG93dGV4dCAxLjBwdDsKKyAgcGFkZGluZzowY20gNS40cHQgMGNtIDUuNHB0Jz4KKyAgPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdwYWdlLWJyZWFrLWFmdGVyOmF2b2lkJz5UaGUgY29udGVudCBkYXRhIGVuY3J5cHRlZAorICB1c2luZyAxMjgtYml0IEFFUyBpbiBDVFIgbW9kZS48L3A+CisgIDwvdGQ+CisgPC90cj4KKzwvdGFibGU+CisKKzxwIGNsYXNzPU1zb0NhcHRpb24gc3R5bGU9J21hcmdpbi10b3A6Ni4wcHQ7bWFyZ2luLXJpZ2h0OjBjbTttYXJnaW4tYm90dG9tOgorMTIuMHB0O21hcmdpbi1sZWZ0OjBjbTtwYWdlLWJyZWFrLWFmdGVyOmF2b2lkJz48YSBuYW1lPSJfUmVmMTUxMjY5MjA2Ij5UYWJsZSA8L2E+MS4gRGVmaW5pdGlvbiBvZiB0aGUgZmllbGRzIG9mIGFuIGludGVybmFsIEZvcndhcmQgTG9jayBmaWxlLjwvcD4KKworPHAgY2xhc3M9TXNvQm9keVRleHQ+QXMgb2Ygbm93LCBuZWl0aGVyIENvbWJpbmVkIERlbGl2ZXJ5IG5vciB1c2FnZQorcmVzdHJpY3Rpb25zIChpbmNsdWRpbmcgU0lNIGJpbmRpbmcpIGFyZSBzdXBwb3J0ZWQuIFRoZXNlIGZpZWxkcyBhcmUgcmVzZXJ2ZWQKK2ZvciBmdXR1cmUgdXNlLjwvcD4KKworPGgyPjxhIG5hbWU9Il9Ub2MyNzY0NzE0MzMiPjQuMTxzcGFuIHN0eWxlPSdmb250OjcuMHB0ICJUaW1lcyBOZXcgUm9tYW4iJz4mbmJzcDsmbmJzcDsmbmJzcDsKKzwvc3Bhbj5LZXkgRGVyaXZhdGlvbjwvYT48L2gyPgorCis8cCBjbGFzcz1Nc29Cb2R5VGV4dD5UaGUgc2Vzc2lvbiBrZXkgY29uc2lzdHMgb2Ygc2l4dGVlbiBieXRlcyBmZXRjaGVkIGZyb20gYQorY3J5cHRvZ3JhcGhpY2FsbHkgc2VjdXJlIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yLiBGcm9tIHRoZSBzZXNzaW9uIGtleSwgdHdvCitzZXBhcmF0ZSBrZXlzIGFyZSBkZXJpdmVkOiBvbmUgdXNlZCBmb3IgZW5jcnlwdGlvbiwgdGhlIG90aGVyIGZvciBzaWduaW5nLjwvcD4KKworPHAgY2xhc3M9TXNvQm9keVRleHQ+VGhlIGVuY3J5cHRpb24ga2V5IGlzIHRoZSBvdXRwdXQgZnJvbSBlbmNyeXB0aW5nIHRoZQorMTYtYnl0ZSBhbGwtemVybyBpbnB1dCBibG9jayB7MCwgMCwghSwgMH0gdXNpbmcgMTI4LWJpdCBBRVMgd2l0aCB0aGUgcmFuZG9tIHNlc3Npb24KK2tleSBhcyB0aGUga2V5LiBUaGUgc2lnbmluZyBrZXkgaXMgdGhlIG91dHB1dCBmcm9tIGVuY3J5cHRpbmcgdGhlIDE2LWJ5dGUgaW5wdXQKK2Jsb2NrIHsxLCAwLCCFLCAwfSB0aGUgc2FtZSB3YXkuIFRoZSBrZXlzIHNvIGRlcml2ZWQgd2lsbCBiZSBjcnlwdG9ncmFwaGljYWxseQoraW5kZXBlbmRlbnQgZnJvbSBlYWNoIG90aGVyLjwvcD4KKworPHAgY2xhc3M9TXNvQm9keVRleHQ+VGhlIHNlc3Npb24ga2V5IGlzIGVuY3J5cHRlZCB1c2luZyBhIGhhcmR3YXJlLWRlcGVuZGVudAora2V5LWVuY3J5cHRpb24ga2V5IHVuaXF1ZSB0byBlYWNoIGRldmljZS4gVGhlIGVuY3J5cHRlZCBzZXNzaW9uIGtleSBpcyBzdG9yZWQKK2luc2lkZSB0aGUgZmlsZSwgYW5kIGl0cyBmaXJzdCBzaXh0ZWVuIGJ5dGVzIGFyZSBhbHNvIHVzZWQgYXMgdGhlIDxpPm5vbmNlPC9pPgorZm9yIHRoZSBDVFItbW9kZSBlbmNyeXB0aW9uIG9mIHRoZSBjb250ZW50IGRhdGEuPC9wPgorCis8aDI+PGEgbmFtZT0iX1RvYzI3NjQ3MTQzNCI+NC4yPHNwYW4gc3R5bGU9J2ZvbnQ6Ny4wcHQgIlRpbWVzIE5ldyBSb21hbiInPiZuYnNwOyZuYnNwOyZuYnNwOworPC9zcGFuPkNhbGN1bGF0aW9uIG9mIHRoZSBDb3VudGVyczwvYT48L2gyPgorCis8cCBjbGFzcz1Nc29Cb2R5VGV4dD5Vc2luZyBDVFIgKJNjb3VudGVylCkgbW9kZSwgYSBibG9jayBjaXBoZXIgc3VjaCBhcyBBRVMgY2FuCitiZSB0dXJuZWQgaW50byBhIHN0cmVhbSBjaXBoZXIuIFRoZSBwcm9jZXNzIG9mIGVuY3J5cHRpb24gYW5kIGRlY3J5cHRpb24gaXMKK3dlbGwgZGVmaW5lZCBpbiBbMV0sIGV4Y2VwdCBmb3IgdGhlIHNwZWNpZmljcyBvZiB0aGUgY2FsY3VsYXRpb24gb2YgdGhlCitjb3VudGVycy4gRm9yIHRoZSBpbnRlcm5hbCBGb3J3YXJkIExvY2sgZmlsZSBmb3JtYXQsIHRoZSBjb3VudGVycyBhcmUKK2NhbGN1bGF0ZWQgYXMgZm9sbG93czo8L3A+CisKKzxwIGNsYXNzPU1zb0JvZHlUZXh0IHN0eWxlPSdtYXJnaW4tbGVmdDozNi4wcHQ7dGV4dC1pbmRlbnQ6LTE4LjBwdCc+MS48c3Bhbgorc3R5bGU9J2ZvbnQ6Ny4wcHQgIlRpbWVzIE5ldyBSb21hbiInPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyA8L3NwYW4+VGhlCitub25jZSBpcyBpbnRlcnByZXRlZCBhcyBhIDEyOC1iaXQgdW5zaWduZWQgaW50ZWdlciBpbiBsaXR0bGUtZW5kaWFuIGZvcm1hdC48L3A+CisKKzxwIGNsYXNzPU1zb0JvZHlUZXh0IHN0eWxlPSdtYXJnaW4tbGVmdDozNi4wcHQ7dGV4dC1pbmRlbnQ6LTE4LjBwdCc+Mi48c3Bhbgorc3R5bGU9J2ZvbnQ6Ny4wcHQgIlRpbWVzIE5ldyBSb21hbiInPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyA8L3NwYW4+VGhlCit6ZXJvLWJhc2VkIGJsb2NrIHNlcXVlbmNlIG51bWJlciAoYWxzbyBhIGxpdHRsZS1lbmRpYW4gdW5zaWduZWQgaW50ZWdlcikgaXMKK2FkZGVkIG1vZHVsbyAyPHN1cD4xMjg8L3N1cD4gdG8gdGhlIG5vbmNlIHRvIHByb2R1Y2UgdGhlIGNvdW50ZXIgZm9yIGEgZ2l2ZW4KK2Jsb2NrLjwvcD4KKworPGgxPjxhIG5hbWU9Il9Ub2MyNzY0NzE0MzUiPjU8c3BhbiBzdHlsZT0nZm9udDo3LjBwdCAiVGltZXMgTmV3IFJvbWFuIic+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Cis8L3NwYW4+VW5pdCBUZXN0IENhc2VzPC9hPjwvaDE+CisKKzxwIGNsYXNzPU1zb0JvZHlUZXh0PlVuaXQgdGVzdCBjYXNlcyBmb3IgdGhlIGNvbnZlcnRlciBhbmQgZGVjb2RlciBjb21lIGluIHR3bwordmFyaWV0aWVzOjwvcD4KKworPHAgY2xhc3M9TXNvQm9keVRleHQgc3R5bGU9J21hcmdpbi1sZWZ0OjM2LjBwdDt0ZXh0LWluZGVudDotMTguMHB0Jz4xLjxzcGFuCitzdHlsZT0nZm9udDo3LjBwdCAiVGltZXMgTmV3IFJvbWFuIic+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IDwvc3Bhbj48aT5CbGFjay1ib3g8L2k+Cit0ZXN0IGNhc2VzIGFpbSB0byB2ZXJpZnkgdGhhdCB5b3UgZ2V0IHNlbnNpYmxlIHJlc3VsdHMgZnJvbSBtYWxmb3JtZWQgb3IKK5N0cmlja3mUIGlucHV0IGRhdGEuPC9wPgorCis8cCBjbGFzcz1Nc29Cb2R5VGV4dCBzdHlsZT0nbWFyZ2luLWxlZnQ6MzYuMHB0O3RleHQtaW5kZW50Oi0xOC4wcHQnPjIuPHNwYW4KK3N0eWxlPSdmb250OjcuMHB0ICJUaW1lcyBOZXcgUm9tYW4iJz4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgPC9zcGFuPjxpPldoaXRlLWJveDwvaT4KK3Rlc3QgY2FzZXMgYWltIHRvIG1heGltaXplIGNvZGUgY292ZXJhZ2UgdXNpbmcga25vd2xlZGdlIG9mIGNvZGUgaW50ZXJuYWxzLjwvcD4KKworPHAgY2xhc3M9TXNvQm9keVRleHQ+VGhlIGJsYWNrLWJveCB0ZXN0IGNhc2VzIGFyZSBkZXBlbmRlbnQgb24gYSBzcGVjaWZpY2FsbHkKK2Rlc2lnbmVkIHNldCBvZiBpbnB1dCBmaWxlcyBmb3VuZCBpbiB0aGUgPHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7Citmb250LWZhbWlseToiTHVjaWRhIENvbnNvbGUiLCJEZWphVnUgU2FucyBNb25vIic+Zm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC90ZXN0L3Jlczwvc3Bhbj4KK2RpcmVjdG9yeSBpbiB0aGUgcmVwb3NpdG9yeS4gRm9yIJF0ZXN0c5IgdmFyaWFudHMgb2YgdGhlIHNvZnR3YXJlLCB0aGVzZSBpbnB1dAorZmlsZXMgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGluc3RhbGxlZCBpbiB0aGUgZmlsZSBzeXN0ZW0gaW1hZ2UgZHVyaW5nIGJ1aWxkLjwvcD4KKworPHAgY2xhc3M9TXNvQm9keVRleHQ+UnVuIHRoZSB0ZXN0IGNhc2VzIGZyb20gdGhlIEFEQiBzaGVsbCBjb21tYW5kIGxpbmUgYXMKK2ZvbGxvd3M6PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi10b3A6MGNtO21hcmdpbi1yaWdodDowY207bWFyZ2luLWJvdHRvbTo2LjBwdDsKK21hcmdpbi1sZWZ0OjIxLjU1cHQnPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0O2ZvbnQtZmFtaWx5OiJMdWNpZGEgQ29uc29sZSIsIkRlamFWdSBTYW5zIE1vbm8iJz4jCitndGVzdF9md2Rsb2NrPC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvQm9keVRleHQ+SWYgYWxsIGJsYWNrLWJveCBidXQgbm8gd2hpdGUtYm94IHRlc3QgY2FzZXMgZmFpbCwgdGhlCitpbnB1dCBmaWxlcyBwcm9iYWJseSBjYW6SdCBiZSBmb3VuZCBpbiB0aGUgd29ya2luZyBkaXJlY3RvcnkuPC9wPgorCis8aDE+PGEgbmFtZT0iX1RvYzI3NjQ3MTQzNiI+NjxzcGFuIHN0eWxlPSdmb250OjcuMHB0ICJUaW1lcyBOZXcgUm9tYW4iJz4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKKzwvc3Bhbj5SZWZlcmVuY2VzPC9hPjwvaDE+CisKKzxwIGNsYXNzPU1zb0JvZHlUZXh0IHN0eWxlPSdtYXJnaW4tbGVmdDoyOC45cHQ7dGV4dC1pbmRlbnQ6LTI4LjlwdCc+WzFdPHNwYW4KK3N0eWxlPSdmb250OjcuMHB0ICJUaW1lcyBOZXcgUm9tYW4iJz4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKKzwvc3Bhbj48YQoraHJlZj0iaHR0cDovL2NzcmMubmlzdC5nb3YvcHVibGljYXRpb25zL25pc3RwdWJzLzgwMC0zOGEvc3A4MDAtMzhhLnBkZiI+RHdvcmtpbiwKK01vcnJpczogk1JlY29tbWVuZGF0aW9uIGZvciBCbG9jayBDaXBoZXIgTW9kZXMgb2YgT3BlcmF0aW9ul01ldGhvZHMgYW5kCitUZWNobmlxdWVzLJQgTklTVCBTcGVjaWFsIFB1YmxpY2F0aW9uIDgwMC0zOEEsIERlY2VtYmVyIDIwMDEuPC9hPjxhCituYW1lPSJfUmVmMTUxMjY5MDczIj48L2E+PC9wPgorCis8L2Rpdj4KKworPC9ib2R5PgorCis8L2h0bWw+CmRpZmYgLS1naXQgYS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9kb2MvaW1hZ2VzL2ltYWdlMDAxLmdpZiBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svaW50ZXJuYWwtZm9ybWF0L2RvYy9pbWFnZXMvaW1hZ2UwMDEuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlOTQ1MTMKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9kb2MvaW1hZ2VzL2ltYWdlMDAxLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9kb2MvaW1hZ2VzL2ltYWdlMDAyLmdpZiBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svaW50ZXJuYWwtZm9ybWF0L2RvYy9pbWFnZXMvaW1hZ2UwMDIuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjMTJmNDYKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9kb2MvaW1hZ2VzL2ltYWdlMDAyLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9kb2MvaW1hZ2VzL2ltYWdlMDAzLmdpZiBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svaW50ZXJuYWwtZm9ybWF0L2RvYy9pbWFnZXMvaW1hZ2UwMDMuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllMDE5Y2EKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9kb2MvaW1hZ2VzL2ltYWdlMDAzLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9kb2MvaW1hZ2VzL2ltYWdlMDA0LmdpZiBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svaW50ZXJuYWwtZm9ybWF0L2RvYy9pbWFnZXMvaW1hZ2UwMDQuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhZTFkMDEKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9kb2MvaW1hZ2VzL2ltYWdlMDA0LmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9kb2MvaW1hZ2VzL2ltYWdlMDA1LmdpZiBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svaW50ZXJuYWwtZm9ybWF0L2RvYy9pbWFnZXMvaW1hZ2UwMDUuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkODdiZTkKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9kb2MvaW1hZ2VzL2ltYWdlMDA1LmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9kb2MvaW1hZ2VzL2ltYWdlMDA2LmdpZiBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svaW50ZXJuYWwtZm9ybWF0L2RvYy9pbWFnZXMvaW1hZ2UwMDYuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0NDViNmIKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9kb2MvaW1hZ2VzL2ltYWdlMDA2LmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9pbmNsdWRlL2RybS9Ecm1NYW5hZ2VyQ2xpZW50LmggYi9pbmNsdWRlL2RybS9Ecm1NYW5hZ2VyQ2xpZW50LmgKaW5kZXggZTZiYTNjNC4uMDg1ZWJmMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9kcm0vRHJtTWFuYWdlckNsaWVudC5oCisrKyBiL2luY2x1ZGUvZHJtL0RybU1hbmFnZXJDbGllbnQuaApAQCAtNDksNiArNDksOSBAQAogICAgIGNsYXNzIE9uSW5mb0xpc3RlbmVyOiB2aXJ0dWFsIHB1YmxpYyBSZWZCYXNlIHsKIAogICAgIHB1YmxpYzoKKyAgICAgICAgdmlydHVhbCB+T25JbmZvTGlzdGVuZXIoKSB7fQorCisgICAgcHVibGljOgogICAgICAgICB2aXJ0dWFsIHZvaWQgb25JbmZvKGNvbnN0IERybUluZm9FdmVudCYgZXZlbnQpID0gMDsKICAgICB9OwogCmRpZmYgLS1naXQgYS9saWJzL3N1cmZhY2VmbGluZ2VyX2NsaWVudC9JU3VyZmFjZUNvbXBvc2VyLmNwcCBiL2xpYnMvc3VyZmFjZWZsaW5nZXJfY2xpZW50L0lTdXJmYWNlQ29tcG9zZXIuY3BwCmluZGV4IDIyMTY4MjQuLjAxYWUyM2YgMTAwNjQ0Ci0tLSBhL2xpYnMvc3VyZmFjZWZsaW5nZXJfY2xpZW50L0lTdXJmYWNlQ29tcG9zZXIuY3BwCisrKyBiL2xpYnMvc3VyZmFjZWZsaW5nZXJfY2xpZW50L0lTdXJmYWNlQ29tcG9zZXIuY3BwCkBAIC0yNjYsMTMgKzI2NiwxMyBAQAogICAgICAgICAgICAgaW50MzJfdCBtb2RlID0gZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIHN0YXR1c190IHJlcyA9IHR1cm5FbGVjdHJvbkJlYW1PZmYobW9kZSk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihyZXMpOwotICAgICAgICB9CisgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGNhc2UgVFVSTl9FTEVDVFJPTl9CRUFNX09OOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSVN1cmZhY2VDb21wb3NlciwgZGF0YSwgcmVwbHkpOwogICAgICAgICAgICAgaW50MzJfdCBtb2RlID0gZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIHN0YXR1c190IHJlcyA9IHR1cm5FbGVjdHJvbkJlYW1Pbihtb2RlKTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHJlcyk7Ci0gICAgICAgIH0KKyAgICAgICAgfSBicmVhazsKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIHJldHVybiBCQmluZGVyOjpvblRyYW5zYWN0KGNvZGUsIGRhdGEsIHJlcGx5LCBmbGFncyk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvdGVzdHMvTWVkaWFGcmFtZXdvcmtUZXN0L0FuZHJvaWRNYW5pZmVzdC54bWwgYi9tZWRpYS90ZXN0cy9NZWRpYUZyYW1ld29ya1Rlc3QvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCA1YzIwODExLi4yMjUzZWIyIDEwMDY0NAotLS0gYS9tZWRpYS90ZXN0cy9NZWRpYUZyYW1ld29ya1Rlc3QvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgYi9tZWRpYS90ZXN0cy9NZWRpYUZyYW1ld29ya1Rlc3QvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMjUsNyArMjUsOCBAQAogICAgIDxhcHBsaWNhdGlvbj4gICAgCiAgICAgICAgIDx1c2VzLWxpYnJhcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnRlc3QucnVubmVyIiAvPgogICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9hcHBfbmFtZSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOm5hbWU9Ik1lZGlhRnJhbWV3b3JrVGVzdCI+ICAgICAgICAgCisgICAgICAgICAgICAgICAgYW5kcm9pZDpuYW1lPSJNZWRpYUZyYW1ld29ya1Rlc3QiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpzY3JlZW5PcmllbnRhdGlvbj0ibGFuZHNjYXBlIj4KICAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgogICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KICAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIvPgpkaWZmIC0tZ2l0IGEvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9BY2NvdW50VW5sb2NrU2NyZWVuLmphdmEgYi9wb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3BvbGljeS9pbXBsL0FjY291bnRVbmxvY2tTY3JlZW4uamF2YQppbmRleCA4NDBjNWUxLi5jNGZlZWZkIDEwMDY0NAotLS0gYS9wb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3BvbGljeS9pbXBsL0FjY291bnRVbmxvY2tTY3JlZW4uamF2YQorKysgYi9wb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3BvbGljeS9pbXBsL0FjY291bnRVbmxvY2tTY3JlZW4uamF2YQpAQCAtNjIsOCArNjIsOCBAQAogICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBV0FLRV9QT0tFX01JTExJUyA9IDMwMDAwOwogCi0gICAgcHJpdmF0ZSBmaW5hbCBLZXlndWFyZFNjcmVlbkNhbGxiYWNrIG1DYWxsYmFjazsKLSAgICBwcml2YXRlIGZpbmFsIExvY2tQYXR0ZXJuVXRpbHMgbUxvY2tQYXR0ZXJuVXRpbHM7CisgICAgcHJpdmF0ZSBLZXlndWFyZFNjcmVlbkNhbGxiYWNrIG1DYWxsYmFjazsKKyAgICBwcml2YXRlIExvY2tQYXR0ZXJuVXRpbHMgbUxvY2tQYXR0ZXJuVXRpbHM7CiAgICAgcHJpdmF0ZSBLZXlndWFyZFVwZGF0ZU1vbml0b3IgbVVwZGF0ZU1vbml0b3I7CiAKICAgICBwcml2YXRlIFRleHRWaWV3IG1Ub3BIZWFkZXI7CkBAIC0xNTksNyArMTU5LDEwIEBACiAgICAgICAgIGlmIChtQ2hlY2tpbmdEaWFsb2cgIT0gbnVsbCkgewogICAgICAgICAgICAgbUNoZWNraW5nRGlhbG9nLmhpZGUoKTsKICAgICAgICAgfQotICAgICAgICBtVXBkYXRlTW9uaXRvci5yZW1vdmVDYWxsYmFjayh0aGlzKTsKKyAgICAgICAgbVVwZGF0ZU1vbml0b3IucmVtb3ZlQ2FsbGJhY2sodGhpcyk7IC8vIHRoaXMgbXVzdCBiZSBmaXJzdAorICAgICAgICBtQ2FsbGJhY2sgPSBudWxsOworICAgICAgICBtTG9ja1BhdHRlcm5VdGlscyA9IG51bGw7CisgICAgICAgIG1VcGRhdGVNb25pdG9yID0gbnVsbDsKICAgICB9CiAKICAgICAvKioge0Bpbmhlcml0RG9jfSAqLwpkaWZmIC0tZ2l0IGEvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9LZXlndWFyZFZpZXdNYW5hZ2VyLmphdmEgYi9wb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3BvbGljeS9pbXBsL0tleWd1YXJkVmlld01hbmFnZXIuamF2YQppbmRleCAzMmMwMTZkLi5lZGFiNjkwIDEwMDY0NAotLS0gYS9wb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3BvbGljeS9pbXBsL0tleWd1YXJkVmlld01hbmFnZXIuamF2YQorKysgYi9wb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3BvbGljeS9pbXBsL0tleWd1YXJkVmlld01hbmFnZXIuamF2YQpAQCAtMjI5LDggKzIyOSw4IEBACiAgICAgICAgICAgICAgICAgbUtleWd1YXJkSG9zdC5wb3N0RGVsYXllZChuZXcgUnVubmFibGUoKSB7CiAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAoS2V5Z3VhcmRWaWV3TWFuYWdlci50aGlzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUtleWd1YXJkSG9zdC5yZW1vdmVWaWV3KGxhc3RWaWV3KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0Vmlldy5jbGVhblVwKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUtleWd1YXJkSG9zdC5yZW1vdmVWaWV3KGxhc3RWaWV3KTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0sIDUwMCk7CmRpZmYgLS1naXQgYS9wb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3BvbGljeS9pbXBsL0xvY2tQYXR0ZXJuS2V5Z3VhcmRWaWV3LmphdmEgYi9wb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3BvbGljeS9pbXBsL0xvY2tQYXR0ZXJuS2V5Z3VhcmRWaWV3LmphdmEKaW5kZXggODIyYmU0Ni4uODg2Yjg1ZiAxMDA2NDQKLS0tIGEvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9Mb2NrUGF0dGVybktleWd1YXJkVmlldy5qYXZhCisrKyBiL3BvbGljeS9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvcG9saWN5L2ltcGwvTG9ja1BhdHRlcm5LZXlndWFyZFZpZXcuamF2YQpAQCAtNDk1LDggKzQ5NSwxMCBAQAogICAgIHB1YmxpYyB2b2lkIGNsZWFuVXAoKSB7CiAgICAgICAgICgoS2V5Z3VhcmRTY3JlZW4pIG1Mb2NrU2NyZWVuKS5vblBhdXNlKCk7CiAgICAgICAgICgoS2V5Z3VhcmRTY3JlZW4pIG1Mb2NrU2NyZWVuKS5jbGVhblVwKCk7CisgICAgICAgIHRoaXMucmVtb3ZlVmlldyhtTG9ja1NjcmVlbik7CiAgICAgICAgICgoS2V5Z3VhcmRTY3JlZW4pIG1VbmxvY2tTY3JlZW4pLm9uUGF1c2UoKTsKICAgICAgICAgKChLZXlndWFyZFNjcmVlbikgbVVubG9ja1NjcmVlbikuY2xlYW5VcCgpOworICAgICAgICB0aGlzLnJlbW92ZVZpZXcobVVubG9ja1NjcmVlbik7CiAgICAgfQogCiAgICAgcHJpdmF0ZSBib29sZWFuIGlzU2VjdXJlKCkgewpkaWZmIC0tZ2l0IGEvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9Mb2NrU2NyZWVuLmphdmEgYi9wb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3BvbGljeS9pbXBsL0xvY2tTY3JlZW4uamF2YQppbmRleCAxYjgxMGQ1Li4yYmM1N2I1IDEwMDY0NAotLS0gYS9wb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3BvbGljeS9pbXBsL0xvY2tTY3JlZW4uamF2YQorKysgYi9wb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3BvbGljeS9pbXBsL0xvY2tTY3JlZW4uamF2YQpAQCAtNTksOSArNTksOSBAQAogCiAgICAgcHJpdmF0ZSBTdGF0dXMgbVN0YXR1cyA9IFN0YXR1cy5Ob3JtYWw7CiAKLSAgICBwcml2YXRlIGZpbmFsIExvY2tQYXR0ZXJuVXRpbHMgbUxvY2tQYXR0ZXJuVXRpbHM7Ci0gICAgcHJpdmF0ZSBmaW5hbCBLZXlndWFyZFVwZGF0ZU1vbml0b3IgbVVwZGF0ZU1vbml0b3I7Ci0gICAgcHJpdmF0ZSBmaW5hbCBLZXlndWFyZFNjcmVlbkNhbGxiYWNrIG1DYWxsYmFjazsKKyAgICBwcml2YXRlIExvY2tQYXR0ZXJuVXRpbHMgbUxvY2tQYXR0ZXJuVXRpbHM7CisgICAgcHJpdmF0ZSBLZXlndWFyZFVwZGF0ZU1vbml0b3IgbVVwZGF0ZU1vbml0b3I7CisgICAgcHJpdmF0ZSBLZXlndWFyZFNjcmVlbkNhbGxiYWNrIG1DYWxsYmFjazsKIAogICAgIHByaXZhdGUgU2xpZGluZ1RhYiBtU2xpZGluZ1RhYjsKICAgICBwcml2YXRlIFRleHRWaWV3IG1TY3JlZW5Mb2NrZWQ7CkBAIC02NTksNyArNjU5LDEwIEBACiAKICAgICAvKioge0Bpbmhlcml0RG9jfSAqLwogICAgIHB1YmxpYyB2b2lkIGNsZWFuVXAoKSB7Ci0gICAgICAgIG1VcGRhdGVNb25pdG9yLnJlbW92ZUNhbGxiYWNrKHRoaXMpOworICAgICAgICBtVXBkYXRlTW9uaXRvci5yZW1vdmVDYWxsYmFjayh0aGlzKTsgLy8gdGhpcyBtdXN0IGJlIGZpcnN0CisgICAgICAgIG1Mb2NrUGF0dGVyblV0aWxzID0gbnVsbDsKKyAgICAgICAgbVVwZGF0ZU1vbml0b3IgPSBudWxsOworICAgICAgICBtQ2FsbGJhY2sgPSBudWxsOwogICAgIH0KIAogICAgIC8qKiB7QGluaGVyaXREb2N9ICovCmRpZmYgLS1naXQgYS9wb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3BvbGljeS9pbXBsL1BhdHRlcm5VbmxvY2tTY3JlZW4uamF2YSBiL3BvbGljeS9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvcG9saWN5L2ltcGwvUGF0dGVyblVubG9ja1NjcmVlbi5qYXZhCmluZGV4IDY4MTVkNTAuLjZjNmMyY2M4IDEwMDY0NAotLS0gYS9wb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3BvbGljeS9pbXBsL1BhdHRlcm5VbmxvY2tTY3JlZW4uamF2YQorKysgYi9wb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3BvbGljeS9pbXBsL1BhdHRlcm5VbmxvY2tTY3JlZW4uamF2YQpAQCAtNjIsOSArNjIsOSBAQAogICAgIHByaXZhdGUgaW50IG1Ub3RhbEZhaWxlZFBhdHRlcm5BdHRlbXB0cyA9IDA7CiAgICAgcHJpdmF0ZSBDb3VudERvd25UaW1lciBtQ291bnRkb3duVGltZXIgPSBudWxsOwogCi0gICAgcHJpdmF0ZSBmaW5hbCBMb2NrUGF0dGVyblV0aWxzIG1Mb2NrUGF0dGVyblV0aWxzOwotICAgIHByaXZhdGUgZmluYWwgS2V5Z3VhcmRVcGRhdGVNb25pdG9yIG1VcGRhdGVNb25pdG9yOwotICAgIHByaXZhdGUgZmluYWwgS2V5Z3VhcmRTY3JlZW5DYWxsYmFjayBtQ2FsbGJhY2s7CisgICAgcHJpdmF0ZSBMb2NrUGF0dGVyblV0aWxzIG1Mb2NrUGF0dGVyblV0aWxzOworICAgIHByaXZhdGUgS2V5Z3VhcmRVcGRhdGVNb25pdG9yIG1VcGRhdGVNb25pdG9yOworICAgIHByaXZhdGUgS2V5Z3VhcmRTY3JlZW5DYWxsYmFjayBtQ2FsbGJhY2s7CiAKICAgICAvKioKICAgICAgKiB3aGV0aGVyIHRoZXJlIGlzIGEgZmFsbGJhY2sgb3B0aW9uIGF2YWlsYWJsZSB3aGVuIHRoZSBwYXR0ZXJuIGlzIGZvcmdvdHRlbi4KQEAgLTM2Miw2ICszNjIsOSBAQAogICAgIC8qKiB7QGluaGVyaXREb2N9ICovCiAgICAgcHVibGljIHZvaWQgY2xlYW5VcCgpIHsKICAgICAgICAgbVVwZGF0ZU1vbml0b3IucmVtb3ZlQ2FsbGJhY2sodGhpcyk7CisgICAgICAgIG1Mb2NrUGF0dGVyblV0aWxzID0gbnVsbDsKKyAgICAgICAgbVVwZGF0ZU1vbml0b3IgPSBudWxsOworICAgICAgICBtQ2FsbGJhY2sgPSBudWxsOwogICAgIH0KIAogICAgIEBPdmVycmlkZQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvYW0vQWN0aXZpdHlNYW5hZ2VyU2VydmljZS5qYXZhIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvYW0vQWN0aXZpdHlNYW5hZ2VyU2VydmljZS5qYXZhCmluZGV4IDZiYjE5YjAuLjJiZjkwYjUgMTAwNzU1Ci0tLSBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2FtL0FjdGl2aXR5TWFuYWdlclNlcnZpY2UuamF2YQorKysgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9hbS9BY3Rpdml0eU1hbmFnZXJTZXJ2aWNlLmphdmEKQEAgLTQ1MDQsMTIgKzQ1MDQsMTUgQEAKICAgICAgICAgcGVybS5tb2RlRmxhZ3MgfD0gbW9kZUZsYWdzOwogICAgICAgICBpZiAob3duZXIgPT0gbnVsbCkgewogICAgICAgICAgICAgcGVybS5nbG9iYWxNb2RlRmxhZ3MgfD0gbW9kZUZsYWdzOwotICAgICAgICB9IGVsc2UgaWYgKChtb2RlRmxhZ3MmSW50ZW50LkZMQUdfR1JBTlRfUkVBRF9VUklfUEVSTUlTU0lPTikgIT0gMCkgewotICAgICAgICAgICAgcGVybS5yZWFkT3duZXJzLmFkZChvd25lcik7Ci0gICAgICAgICAgICBvd25lci5hZGRSZWFkUGVybWlzc2lvbihwZXJtKTsKLSAgICAgICAgfSBlbHNlIGlmICgobW9kZUZsYWdzJkludGVudC5GTEFHX0dSQU5UX1dSSVRFX1VSSV9QRVJNSVNTSU9OKSAhPSAwKSB7Ci0gICAgICAgICAgICBwZXJtLndyaXRlT3duZXJzLmFkZChvd25lcik7Ci0gICAgICAgICAgICBvd25lci5hZGRXcml0ZVBlcm1pc3Npb24ocGVybSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoKG1vZGVGbGFncyZJbnRlbnQuRkxBR19HUkFOVF9SRUFEX1VSSV9QRVJNSVNTSU9OKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgIHBlcm0ucmVhZE93bmVycy5hZGQob3duZXIpOworICAgICAgICAgICAgICAgICBvd25lci5hZGRSZWFkUGVybWlzc2lvbihwZXJtKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgobW9kZUZsYWdzJkludGVudC5GTEFHX0dSQU5UX1dSSVRFX1VSSV9QRVJNSVNTSU9OKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgIHBlcm0ud3JpdGVPd25lcnMuYWRkKG93bmVyKTsKKyAgICAgICAgICAgICAgICAgb3duZXIuYWRkV3JpdGVQZXJtaXNzaW9uKHBlcm0pOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCg==