ZGlmZiAtLWdpdCBhL0FuZHJvaWQubWsgYi9BbmRyb2lkLm1rCmluZGV4IDMwNDEwNjUuLjllM2UyNDAgMTAwNjQ0Ci0tLSBhL0FuZHJvaWQubWsKKysrIGIvQW5kcm9pZC5tawpAQCAtMTk0LDcgKzE5NCw3IEBACiAJCQkkKGZyYW1ld29yay1yZXMtc291cmNlLXBhdGgpL2NvbS9hbmRyb2lkL2ludGVybmFsL1IuamF2YQogCiBMT0NBTF9OT19TVEFOREFSRF9MSUJSQVJJRVMgOj0gdHJ1ZQotTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gY29yZSBleHQKK0xPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IGNvcmUgY29yZS1qdW5pdCBleHQKIAogTE9DQUxfTU9EVUxFIDo9IGZyYW1ld29yawogTE9DQUxfTU9EVUxFX0NMQVNTIDo9IEpBVkFfTElCUkFSSUVTCkBAIC0zMDIsMzQgKzMwMiwxNCBAQAogIyBJbnRlbnRpb25hbGx5IG5vdCBpbmNsdWRlZCBmcm9tIGxpYmNvcmU6CiAjICAgICBpY3Ugb3BlbnNzbCBzdW5jb21wYXQgc3VwcG9ydAogbGliY29yZV90b19kb2N1bWVudCA6PSBcCi0JYW5ub3RhdGlvbi9zcmMvbWFpbi9qYXZhL2phdmEgXAotCWFyY2hpdmUvc3JjL21haW4vamF2YS9qYXZhIFwKLQlhdXRoL3NyYy9tYWluL2phdmEvamF2YXggXAotCWF3dC1rZXJuZWwvc3JjL21haW4vamF2YS9qYXZhIFwKLQljb25jdXJyZW50L3NyYy9tYWluL2phdmEgXAotCWNyeXB0by9zcmMvbWFpbi9qYXZhL2phdmF4IFwKIAlkYWx2aWsvc3JjL21haW4vamF2YS9kYWx2aWsgXAogCWpzb24vc3JjL21haW4vamF2YSBcCiAJanVuaXQvc3JjL21haW4vamF2YSBcCi0JbG9nZ2luZy9zcmMvbWFpbi9qYXZhL2phdmEgXAogCWx1bmkvc3JjL21haW4vamF2YS9qYXZhIFwKLQlsdW5pLWtlcm5lbC9zcmMvbWFpbi9qYXZhL2phdmEgXAotCW1hdGgvc3JjL21haW4vamF2YS9qYXZhIFwKLQluaW8vc3JjL21haW4vamF2YS9qYXZhIFwKLQluaW9fY2hhci9zcmMvbWFpbi9qYXZhL2phdmEgXAotCXByZWZzL3NyYy9tYWluL2phdmEvamF2YSBcCi0JcmVnZXgvc3JjL21haW4vamF2YS9qYXZhIFwKLQlzZWN1cml0eS9zcmMvbWFpbi9qYXZhL2phdmEgXAotCXNlY3VyaXR5L3NyYy9tYWluL2phdmEvamF2YXggXAotCXNlY3VyaXR5LWtlcm5lbC9zcmMvbWFpbi9qYXZhL2phdmEgXAotCXNxbC9zcmMvbWFpbi9qYXZhL2phdmEgXAotCXNxbC9zcmMvbWFpbi9qYXZhL2phdmF4IFwKLQl0ZXh0L3NyYy9tYWluL2phdmEvamF2YSBcCi0JeC1uZXQvc3JjL21haW4vamF2YS9qYXZheCBcCi0JeG1sL3NyYy9tYWluL2phdmEvamF2YXggXAotCXhtbC9zcmMvbWFpbi9qYXZhL29yZy94bWwvc2F4IFwKKwlsdW5pL3NyYy9tYWluL2phdmEvamF2YXggXAorCWx1bmkvc3JjL21haW4vamF2YS9vcmcveG1sL3NheCBcCisJbHVuaS9zcmMvbWFpbi9qYXZhL29yZy93M2MgXAogCXhtbC9zcmMvbWFpbi9qYXZhL29yZy94bWxwdWxsL3YxIFwKLQl4bWwvc3JjL21haW4vamF2YS9vcmcvdzNjCiAKIG5vbl9iYXNlX2RpcnMgOj0gXAogCS4uLy4uL2V4dGVybmFsL2FwYWNoZS1odHRwL3NyYy9vcmcvYXBhY2hlL2h0dHAKQEAgLTQzNSw3ICs0MTUsOSBAQAogCQktc2FtcGxlY29kZSAkKHNhbXBsZV9kaXIpL1dpa3Rpb25hcnlTaW1wbGUgXAogCQkgICAgICAgICAgICByZXNvdXJjZXMvc2FtcGxlcy9XaWt0aW9uYXJ5U2ltcGxlICJXaWt0aW9uYXJ5IChTaW1wbGlmaWVkKSIgXAogCQktc2FtcGxlY29kZSAkKHNhbXBsZV9kaXIpL1ZvaWNlUmVjb2duaXRpb25TZXJ2aWNlIFwKLQkJICAgICAgICAgICAgcmVzb3VyY2VzL3NhbXBsZXMvVm9pY2VSZWNvZ25pdGlvblNlcnZpY2UgIlZvaWNlIFJlY29nbml0aW9uIFNlcnZpY2UiCisJCSAgICAgICAgICAgIHJlc291cmNlcy9zYW1wbGVzL1ZvaWNlUmVjb2duaXRpb25TZXJ2aWNlICJWb2ljZSBSZWNvZ25pdGlvbiBTZXJ2aWNlIiBcCisJCS1zYW1wbGVjb2RlICQoc2FtcGxlX2RpcikvWG1sQWRhcHRlcnMgXAorCQkgICAgICAgICAgICByZXNvdXJjZXMvc2FtcGxlcy9YbWxBZGFwdGVycyAiWE1MIEFkYXB0ZXJzIgogCiAjIyBTREsgdmVyc2lvbiBpZGVudGlmaWVycyB1c2VkIGluIHRoZSBwdWJsaXNoZWQgZG9jcwogICAjIG1ham9yWy5taW5vcl0gdmVyc2lvbiBmb3IgY3VycmVudCBTREsuIChmdWxsIHJlbGVhc2VzIG9ubHkpCkBAIC00ODYsNyArNDY4LDggQEAKIAogaW5jbHVkZSAkKEJVSUxEX0RST0lERE9DKQogCi0kKGZ1bGxfdGFyZ2V0KTogJChmcmFtZXdvcmtfYnVpbHQpCisjICQoZ2VuKSwgaS5lLiBmcmFtZXdvcmsuYWlkbCwgaXMgYWxzbyBuZWVkZWQgd2hpbGUgYnVpbGRpbmcgYWdhaW5zdCB0aGUgY3VycmVudCBzdHViLgorJChmdWxsX3RhcmdldCk6ICQoZnJhbWV3b3JrX2J1aWx0KSAkKGdlbikKICQoSU5URVJOQUxfUExBVEZPUk1fQVBJX0ZJTEUpOiAkKGZ1bGxfdGFyZ2V0KQogJChjYWxsIGRpc3QtZm9yLWdvYWxzLHNkaywkKElOVEVSTkFMX1BMQVRGT1JNX0FQSV9GSUxFKSkKIApAQCAtNTg4LDEwICs1NzEsMTQgQEAKIAogZXh0X2RpcnMgOj0gXAogCS4uLy4uL2V4dGVybmFsL2FwYWNoZS1odHRwL3NyYyBcCi0JLi4vLi4vZXh0ZXJuYWwvdGFnc291cC9zcmMKKwkuLi8uLi9leHRlcm5hbC90YWdzb3VwL3NyYyBcCisJLi4vLi4vZXh0ZXJuYWwvbGlicGhvbmVudW1iZXIvamF2YS9zcmMKIAogZXh0X3NyY19maWxlcyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsJChleHRfZGlycykpCiAKK2V4dF9yZXNfZGlycyA6PSBcCisJLi4vLi4vZXh0ZXJuYWwvbGlicGhvbmVudW1iZXIvamF2YS9zcmMKKwogIyA9PT09ICB0aGUgbGlicmFyeSAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIGluY2x1ZGUgJChDTEVBUl9WQVJTKQogCkBAIC01OTksNyArNTg2LDcgQEAKIAogTE9DQUxfTk9fU1RBTkRBUkRfTElCUkFSSUVTIDo9IHRydWUKIExPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IGNvcmUKLQorTE9DQUxfSkFWQV9SRVNPVVJDRV9ESVJTIDo9ICQoZXh0X3Jlc19kaXJzKQogTE9DQUxfTU9EVUxFIDo9IGV4dAogCiBMT0NBTF9OT19FTU1BX0lOU1RSVU1FTlQgOj0gdHJ1ZQpkaWZmIC0tZ2l0IGEvYXBpLzkueG1sIGIvYXBpLzkueG1sCmluZGV4IGI3NTk2YmQuLjIwMzk3ZGYgMTAwNjQ0Ci0tLSBhL2FwaS85LnhtbAorKysgYi9hcGkvOS54bWwKQEAgLTE0Nzc4MiwxNyArMTQ3NzgyLDYgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2NvbnN0cnVjdG9yPgotPG1ldGhvZCBuYW1lPSJhYm9ydFVwZGF0ZXMiCi0gcmV0dXJuPSJ2b2lkIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImNsb3NlIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xNDc4MDQsMzAgKzE0Nzc5Myw2IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9ImNvbW1pdFVwZGF0ZXMiCi0gcmV0dXJuPSJib29sZWFuIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9ImNvbW1pdFVwZGF0ZXMiCi0gcmV0dXJuPSJib29sZWFuIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZXMiIHR5cGU9ImphdmEudXRpbC5NYXAmbHQ7PyBleHRlbmRzIGphdmEubGFuZy5Mb25nLCA/IGV4dGVuZHMgamF2YS51dGlsLk1hcCZsdDtqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuT2JqZWN0Jmd0OyZndDsiPgotPC9wYXJhbWV0ZXI+Ci08L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iY29weVN0cmluZ1RvQnVmZmVyIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xNDc4NTQsMTcgKzE0NzgxOSw2IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9ImRlbGV0ZVJvdyIKLSByZXR1cm49ImJvb2xlYW4iCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZ2V0QmxvYiIKICByZXR1cm49ImJ5dGVbXSIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xNDgwNjEsMTcgKzE0ODAxNSw2IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9Imhhc1VwZGF0ZXMiCi0gcmV0dXJuPSJib29sZWFuIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImlzQWZ0ZXJMYXN0IgogIHJldHVybj0iYm9vbGVhbiIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xNDgyNzUsMTcgKzE0ODIxOCw2IEBACiA8cGFyYW1ldGVyIG5hbWU9InVyaSIgdHlwZT0iYW5kcm9pZC5uZXQuVXJpIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9InN1cHBvcnRzVXBkYXRlcyIKLSByZXR1cm49ImJvb2xlYW4iCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L21ldGhvZD4KIDxtZXRob2QgbmFtZT0idW5yZWdpc3RlckNvbnRlbnRPYnNlcnZlciIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTQ4MzEyLDEyNCArMTQ4MjQ0LDYgQEAKIDxwYXJhbWV0ZXIgbmFtZT0ib2JzZXJ2ZXIiIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2UuRGF0YVNldE9ic2VydmVyIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9InVwZGF0ZUJsb2IiCi0gcmV0dXJuPSJib29sZWFuIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPHBhcmFtZXRlciBuYW1lPSJjb2x1bW5JbmRleCIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZSIgdHlwZT0iYnl0ZVtdIj4KLTwvcGFyYW1ldGVyPgotPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9InVwZGF0ZURvdWJsZSIKLSByZXR1cm49ImJvb2xlYW4iCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08cGFyYW1ldGVyIG5hbWU9ImNvbHVtbkluZGV4IiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9InZhbHVlIiB0eXBlPSJkb3VibGUiPgotPC9wYXJhbWV0ZXI+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0idXBkYXRlRmxvYXQiCi0gcmV0dXJuPSJib29sZWFuIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPHBhcmFtZXRlciBuYW1lPSJjb2x1bW5JbmRleCIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZSIgdHlwZT0iZmxvYXQiPgotPC9wYXJhbWV0ZXI+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0idXBkYXRlSW50IgotIHJldHVybj0iYm9vbGVhbiIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0iY29sdW1uSW5kZXgiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0idmFsdWUiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJ1cGRhdGVMb25nIgotIHJldHVybj0iYm9vbGVhbiIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0iY29sdW1uSW5kZXgiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0idmFsdWUiIHR5cGU9ImxvbmciPgotPC9wYXJhbWV0ZXI+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0idXBkYXRlU2hvcnQiCi0gcmV0dXJuPSJib29sZWFuIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPHBhcmFtZXRlciBuYW1lPSJjb2x1bW5JbmRleCIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZSIgdHlwZT0ic2hvcnQiPgotPC9wYXJhbWV0ZXI+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0idXBkYXRlU3RyaW5nIgotIHJldHVybj0iYm9vbGVhbiIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0iY29sdW1uSW5kZXgiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0idmFsdWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgotPC9wYXJhbWV0ZXI+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0idXBkYXRlVG9OdWxsIgotIHJldHVybj0iYm9vbGVhbiIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0iY29sdW1uSW5kZXgiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTwvbWV0aG9kPgogPC9jbGFzcz4KIDxjbGFzcyBuYW1lPSJNb2NrRGlhbG9nSW50ZXJmYWNlIgogIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCkBAIC0xNjQ2OTYsNyArMTY0NTEwLDcgQEAKICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgogIHRyYW5zaWVudD0iZmFsc2UiCiAgdm9sYXRpbGU9ImZhbHNlIgotIHZhbHVlPSImcXVvdDsoKGFlcm98YXJwYXxhc2lhfGFbY2RlZmdpbG1ub3Fyc3R1d3h6XSl8KGJpenxiW2FiZGVmZ2hpam1ub3JzdHZ3eXpdKXwoY2F0fGNvbXxjb29wfGNbYWNkZmdoaWtsbW5vcnV2eHl6XSl8ZFtlamttb3pdfChlZHV8ZVtjZWdyc3R1XSl8Zltpamttb3JdfChnb3Z8Z1thYmRlZmdoaWxtbnBxcnN0dXd5XSl8aFtrbW5ydHVdfChpbmZvfGludHxpW2RlbG1ub3Fyc3RdKXwoam9ic3xqW2Vtb3BdKXxrW2VnaGltbnByd3l6XXxsW2FiY2lrcnN0dXZ5XXwobWlsfG1vYml8bXVzZXVtfG1bYWNkZWdoa2xtbm9wcXJzdHV2d3h5el0pfChuYW1lfG5ldHxuW2FjZWZnaWxvcHJ1el0pfChvcmd8b20pfChwcm98cFthZWZnaGtsbW5yc3R3eV0pfHFhfHJbZW9zdXddfHNbYWJjZGVnaGlqa2xtbm9ydHV2eXpdfCh0ZWx8dHJhdmVsfHRbY2RmZ2hqa2xtbm9wcnR2d3pdKXx1W2Fna3N5el18dlthY2VnaW51XXx3W2ZzXXwoeG5cXC1cXC0wendtNTZkfHhuXFwtXFwtMTFiNWJzM2E5YWo2Z3x4blxcLVxcLTgwYWtoYnlrbmo0Znx4blxcLVxcLTl0NGIxMXlpNWF8eG5cXC1cXC1kZWJhMGFkfHhuXFwtXFwtZzZ3MjUxZHx4blxcLVxcLWhnYms2YWo3ZjUzYmJhfHhuXFwtXFwtaGxjajZheWE5ZXNjN2F8eG5cXC1cXC1qeGFscGRscHx4blxcLVxcLWtnYmVjaHR2fHhuXFwtXFwtemNremFoKXx5W2V0dV18elthbXddKSZxdW90OyIKKyB2YWx1ZT0iJnF1b3Q7KChhZXJvfGFycGF8YXNpYXxhW2NkZWZnaWxtbm9xcnN0dXd4el0pfChiaXp8YlthYmRlZmdoaWptbm9yc3R2d3l6XSl8KGNhdHxjb218Y29vcHxjW2FjZGZnaGlrbG1ub3J1dnh5el0pfGRbZWprbW96XXwoZWR1fGVbY2VncnN0dV0pfGZbaWprbW9yXXwoZ292fGdbYWJkZWZnaGlsbW5wcXJzdHV3eV0pfGhba21ucnR1XXwoaW5mb3xpbnR8aVtkZWxtbm9xcnN0XSl8KGpvYnN8altlbW9wXSl8a1tlZ2hpbW5wcnd5el18bFthYmNpa3JzdHV2eV18KG1pbHxtb2JpfG11c2V1bXxtW2FjZGVnaGtsbW5vcHFyc3R1dnd4eXpdKXwobmFtZXxuZXR8blthY2VmZ2lsb3BydXpdKXwob3JnfG9tKXwocHJvfHBbYWVmZ2hrbG1ucnN0d3ldKXxxYXxyW2Vvc3V3XXxzW2FiY2RlZ2hpamtsbW5vcnR1dnl6XXwodGVsfHRyYXZlbHx0W2NkZmdoamtsbW5vcHJ0dnd6XSl8dVthZ2tzeXpdfHZbYWNlZ2ludV18d1tmc118KHhuXFwtXFwtMHp3bTU2ZHx4blxcLVxcLTExYjViczNhOWFqNmd8eG5cXC1cXC04MGFraGJ5a25qNGZ8eG5cXC1cXC05dDRiMTF5aTVhfHhuXFwtXFwtZGViYTBhZHx4blxcLVxcLWc2dzI1MWR8eG5cXC1cXC1oZ2JrNmFqN2Y1M2JiYXx4blxcLVxcLWhsY2o2YXlhOWVzYzdhfHhuXFwtXFwtanhhbHBkbHB8eG5cXC1cXC1rZ2JlY2h0dnx4blxcLVxcLW1nYmFhbTdhOGh8eG5cXC1cXC1tZ2JlcnA0YTVkNGFyfHhuXFwtXFwtd2diaDFjfHhuXFwtXFwtemNremFoKXx5W2V0XXx6W2Ftd10pJnF1b3Q7IgogIHN0YXRpYz0idHJ1ZSIKICBmaW5hbD0idHJ1ZSIKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKQEAgLTE2NDcwNyw3ICsxNjQ1MjEsNyBAQAogIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCiAgdHJhbnNpZW50PSJmYWxzZSIKICB2b2xhdGlsZT0iZmFsc2UiCi0gdmFsdWU9IiZxdW90Oyg/Oig/OmFlcm98YXJwYXxhc2lhfGFbY2RlZmdpbG1ub3Fyc3R1d3h6XSl8KD86Yml6fGJbYWJkZWZnaGlqbW5vcnN0dnd5el0pfCg/OmNhdHxjb218Y29vcHxjW2FjZGZnaGlrbG1ub3J1dnh5el0pfGRbZWprbW96XXwoPzplZHV8ZVtjZWdyc3R1XSl8Zltpamttb3JdfCg/OmdvdnxnW2FiZGVmZ2hpbG1ucHFyc3R1d3ldKXxoW2ttbnJ0dV18KD86aW5mb3xpbnR8aVtkZWxtbm9xcnN0XSl8KD86am9ic3xqW2Vtb3BdKXxrW2VnaGltbnByd3l6XXxsW2FiY2lrcnN0dXZ5XXwoPzptaWx8bW9iaXxtdXNldW18bVthY2RlZ2hrbG1ub3BxcnN0dXZ3eHl6XSl8KD86bmFtZXxuZXR8blthY2VmZ2lsb3BydXpdKXwoPzpvcmd8b20pfCg/OnByb3xwW2FlZmdoa2xtbnJzdHd5XSl8cWF8cltlb3N1d118c1thYmNkZWdoaWprbG1ub3J0dXZ5el18KD86dGVsfHRyYXZlbHx0W2NkZmdoamtsbW5vcHJ0dnd6XSl8dVthZ2tzeXpdfHZbYWNlZ2ludV18d1tmc118KD86eG5cXC1cXC0wendtNTZkfHhuXFwtXFwtMTFiNWJzM2E5YWo2Z3x4blxcLVxcLTgwYWtoYnlrbmo0Znx4blxcLVxcLTl0NGIxMXlpNWF8eG5cXC1cXC1kZWJhMGFkfHhuXFwtXFwtZzZ3MjUxZHx4blxcLVxcLWhnYms2YWo3ZjUzYmJhfHhuXFwtXFwtaGxjajZheWE5ZXNjN2F8eG5cXC1cXC1qeGFscGRscHx4blxcLVxcLWtnYmVjaHR2fHhuXFwtXFwtemNremFoKXx5W2V0dV18elthbXddKSkmcXVvdDsiCisgdmFsdWU9IiZxdW90Oyg/Oig/OmFlcm98YXJwYXxhc2lhfGFbY2RlZmdpbG1ub3Fyc3R1d3h6XSl8KD86Yml6fGJbYWJkZWZnaGlqbW5vcnN0dnd5el0pfCg/OmNhdHxjb218Y29vcHxjW2FjZGZnaGlrbG1ub3J1dnh5el0pfGRbZWprbW96XXwoPzplZHV8ZVtjZWdyc3R1XSl8Zltpamttb3JdfCg/OmdvdnxnW2FiZGVmZ2hpbG1ucHFyc3R1d3ldKXxoW2ttbnJ0dV18KD86aW5mb3xpbnR8aVtkZWxtbm9xcnN0XSl8KD86am9ic3xqW2Vtb3BdKXxrW2VnaGltbnByd3l6XXxsW2FiY2lrcnN0dXZ5XXwoPzptaWx8bW9iaXxtdXNldW18bVthY2RlZ2hrbG1ub3BxcnN0dXZ3eHl6XSl8KD86bmFtZXxuZXR8blthY2VmZ2lsb3BydXpdKXwoPzpvcmd8b20pfCg/OnByb3xwW2FlZmdoa2xtbnJzdHd5XSl8cWF8cltlb3N1d118c1thYmNkZWdoaWprbG1ub3J0dXZ5el18KD86dGVsfHRyYXZlbHx0W2NkZmdoamtsbW5vcHJ0dnd6XSl8dVthZ2tzeXpdfHZbYWNlZ2ludV18d1tmc118KD86eG5cXC1cXC0wendtNTZkfHhuXFwtXFwtMTFiNWJzM2E5YWo2Z3x4blxcLVxcLTgwYWtoYnlrbmo0Znx4blxcLVxcLTl0NGIxMXlpNWF8eG5cXC1cXC1kZWJhMGFkfHhuXFwtXFwtZzZ3MjUxZHx4blxcLVxcLWhnYms2YWo3ZjUzYmJhfHhuXFwtXFwtaGxjajZheWE5ZXNjN2F8eG5cXC1cXC1qeGFscGRscHx4blxcLVxcLWtnYmVjaHR2fHhuXFwtXFwtbWdiYWFtN2E4aHx4blxcLVxcLW1nYmVycDRhNWQ0YXJ8eG5cXC1cXC13Z2JoMWN8eG5cXC1cXC16Y2t6YWgpfHlbZXRdfHpbYW13XSkpJnF1b3Q7IgogIHN0YXRpYz0idHJ1ZSIKICBmaW5hbD0idHJ1ZSIKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKQEAgLTIxNjU3MiwzMyArMjE2Mzg2LDYgQEAKIDwvcGFja2FnZT4KIDxwYWNrYWdlIG5hbWU9ImRhbHZpay5zeXN0ZW0iCiA+Ci08Y2xhc3MgbmFtZT0iQWxsb2NhdGlvbkxpbWl0RXJyb3IiCi0gZXh0ZW5kcz0iamF2YS5sYW5nLlZpcnR1YWxNYWNoaW5lRXJyb3IiCi0gYWJzdHJhY3Q9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPGNvbnN0cnVjdG9yIG5hbWU9IkFsbG9jYXRpb25MaW1pdEVycm9yIgotIHR5cGU9ImRhbHZpay5zeXN0ZW0uQWxsb2NhdGlvbkxpbWl0RXJyb3IiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9jb25zdHJ1Y3Rvcj4KLTxjb25zdHJ1Y3RvciBuYW1lPSJBbGxvY2F0aW9uTGltaXRFcnJvciIKLSB0eXBlPSJkYWx2aWsuc3lzdGVtLkFsbG9jYXRpb25MaW1pdEVycm9yIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0iZGV0YWlsTWVzc2FnZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Ci08L3BhcmFtZXRlcj4KLTwvY29uc3RydWN0b3I+Ci08L2NsYXNzPgogPGNsYXNzIG5hbWU9IkRleENsYXNzTG9hZGVyIgogIGV4dGVuZHM9ImphdmEubGFuZy5DbGFzc0xvYWRlciIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yMTY3NzgsMTAxMCArMjE2NTY1LDYgQEAKIDwvcGFyYW1ldGVyPgogPC9jb25zdHJ1Y3Rvcj4KIDwvY2xhc3M+Ci08Y2xhc3MgbmFtZT0iUG90ZW50aWFsRGVhZGxvY2tFcnJvciIKLSBleHRlbmRzPSJqYXZhLmxhbmcuVmlydHVhbE1hY2hpbmVFcnJvciIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08Y29uc3RydWN0b3IgbmFtZT0iUG90ZW50aWFsRGVhZGxvY2tFcnJvciIKLSB0eXBlPSJkYWx2aWsuc3lzdGVtLlBvdGVudGlhbERlYWRsb2NrRXJyb3IiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9jb25zdHJ1Y3Rvcj4KLTxjb25zdHJ1Y3RvciBuYW1lPSJQb3RlbnRpYWxEZWFkbG9ja0Vycm9yIgotIHR5cGU9ImRhbHZpay5zeXN0ZW0uUG90ZW50aWFsRGVhZGxvY2tFcnJvciIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08cGFyYW1ldGVyIG5hbWU9ImRldGFpbE1lc3NhZ2UiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgotPC9wYXJhbWV0ZXI+Ci08L2NvbnN0cnVjdG9yPgotPC9jbGFzcz4KLTxjbGFzcyBuYW1lPSJTdGFsZURleENhY2hlRXJyb3IiCi0gZXh0ZW5kcz0iamF2YS5sYW5nLlZpcnR1YWxNYWNoaW5lRXJyb3IiCi0gYWJzdHJhY3Q9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPGNvbnN0cnVjdG9yIG5hbWU9IlN0YWxlRGV4Q2FjaGVFcnJvciIKLSB0eXBlPSJkYWx2aWsuc3lzdGVtLlN0YWxlRGV4Q2FjaGVFcnJvciIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L2NvbnN0cnVjdG9yPgotPGNvbnN0cnVjdG9yIG5hbWU9IlN0YWxlRGV4Q2FjaGVFcnJvciIKLSB0eXBlPSJkYWx2aWsuc3lzdGVtLlN0YWxlRGV4Q2FjaGVFcnJvciIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08cGFyYW1ldGVyIG5hbWU9ImRldGFpbE1lc3NhZ2UiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgotPC9wYXJhbWV0ZXI+Ci08L2NvbnN0cnVjdG9yPgotPC9jbGFzcz4KLTxjbGFzcyBuYW1lPSJUZW1wb3JhcnlEaXJlY3RvcnkiCi0gZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08Y29uc3RydWN0b3IgbmFtZT0iVGVtcG9yYXJ5RGlyZWN0b3J5IgotIHR5cGU9ImRhbHZpay5zeXN0ZW0uVGVtcG9yYXJ5RGlyZWN0b3J5IgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvY29uc3RydWN0b3I+Ci08bWV0aG9kIG5hbWU9InNldFVwRGlyZWN0b3J5IgotIHJldHVybj0idm9pZCIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0idHJ1ZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPHBhcmFtZXRlciBuYW1lPSJiYXNlRGlyIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KLTwvcGFyYW1ldGVyPgotPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9InNldFVwRGlyZWN0b3J5IgotIHJldHVybj0idm9pZCIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9InRydWUiCi0gc3RhdGljPSJ0cnVlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08cGFyYW1ldGVyIG5hbWU9ImJhc2VEaXIiIHR5cGU9ImphdmEuaW8uRmlsZSI+Ci08L3BhcmFtZXRlcj4KLTwvbWV0aG9kPgotPC9jbGFzcz4KLTxjbGFzcyBuYW1lPSJUb3VjaERleCIKLSBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgotIGFic3RyYWN0PSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxjb25zdHJ1Y3RvciBuYW1lPSJUb3VjaERleCIKLSB0eXBlPSJkYWx2aWsuc3lzdGVtLlRvdWNoRGV4IgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvY29uc3RydWN0b3I+Ci08bWV0aG9kIG5hbWU9Im1haW4iCi0gcmV0dXJuPSJ2b2lkIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJ0cnVlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08cGFyYW1ldGVyIG5hbWU9ImFyZ3MiIHR5cGU9ImphdmEubGFuZy5TdHJpbmdbXSI+Ci08L3BhcmFtZXRlcj4KLTwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJzdGFydCIKLSByZXR1cm49ImludCIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0idHJ1ZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPHBhcmFtZXRlciBuYW1lPSJkZXhGaWxlcyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Ci08L3BhcmFtZXRlcj4KLTwvbWV0aG9kPgotPC9jbGFzcz4KLTxjbGFzcyBuYW1lPSJWTURlYnVnIgotIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCi0gYWJzdHJhY3Q9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9InRydWUiCi0gZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08bWV0aG9kIG5hbWU9ImR1bXBIcHJvZkRhdGEiCi0gcmV0dXJuPSJ2b2lkIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9InRydWUiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9InRydWUiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0iZmlsZU5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgotPC9wYXJhbWV0ZXI+Ci08ZXhjZXB0aW9uIG5hbWU9IklPRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmlvLklPRXhjZXB0aW9uIj4KLTwvZXhjZXB0aW9uPgotPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9ImdldEFsbG9jQ291bnQiCi0gcmV0dXJuPSJpbnQiCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0idHJ1ZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0idHJ1ZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPHBhcmFtZXRlciBuYW1lPSJraW5kIiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0iZ2V0SW5zdHJ1Y3Rpb25Db3VudCIKLSByZXR1cm49InZvaWQiCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0idHJ1ZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0idHJ1ZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPHBhcmFtZXRlciBuYW1lPSJjb3VudHMiIHR5cGU9ImludFtdIj4KLTwvcGFyYW1ldGVyPgotPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9ImdldExvYWRlZENsYXNzQ291bnQiCi0gcmV0dXJuPSJpbnQiCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0idHJ1ZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0idHJ1ZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9ImlzRGVidWdnZXJDb25uZWN0ZWQiCi0gcmV0dXJuPSJib29sZWFuIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9InRydWUiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9InRydWUiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJpc0RlYnVnZ2luZ0VuYWJsZWQiCi0gcmV0dXJuPSJib29sZWFuIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9InRydWUiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9InRydWUiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJsYXN0RGVidWdnZXJBY3Rpdml0eSIKLSByZXR1cm49ImxvbmciCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0idHJ1ZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0idHJ1ZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9InByaW50TG9hZGVkQ2xhc3NlcyIKLSByZXR1cm49InZvaWQiCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0idHJ1ZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0idHJ1ZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPHBhcmFtZXRlciBuYW1lPSJmbGFncyIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9InJlc2V0QWxsb2NDb3VudCIKLSByZXR1cm49InZvaWQiCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0idHJ1ZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0idHJ1ZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPHBhcmFtZXRlciBuYW1lPSJraW5kcyIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9InJlc2V0SW5zdHJ1Y3Rpb25Db3VudCIKLSByZXR1cm49InZvaWQiCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0idHJ1ZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0idHJ1ZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9InNldEFsbG9jYXRpb25MaW1pdCIKLSByZXR1cm49ImludCIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJ0cnVlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJ0cnVlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08cGFyYW1ldGVyIG5hbWU9ImxpbWl0IiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0ic2V0R2xvYmFsQWxsb2NhdGlvbkxpbWl0IgotIHJldHVybj0iaW50IgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9InRydWUiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9InRydWUiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0ibGltaXQiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJzdGFydEFsbG9jQ291bnRpbmciCi0gcmV0dXJuPSJ2b2lkIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9InRydWUiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9InRydWUiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJzdGFydEVtdWxhdG9yVHJhY2luZyIKLSByZXR1cm49InZvaWQiCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0idHJ1ZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0idHJ1ZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9InN0YXJ0SW5zdHJ1Y3Rpb25Db3VudGluZyIKLSByZXR1cm49InZvaWQiCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0idHJ1ZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0idHJ1ZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9InN0YXJ0TWV0aG9kVHJhY2luZyIKLSByZXR1cm49InZvaWQiCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9InRydWUiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9InN0YXJ0TWV0aG9kVHJhY2luZyIKLSByZXR1cm49InZvaWQiCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9InRydWUiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0idHJhY2VGaWxlTmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0iYnVmZmVyU2l6ZSIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJmbGFncyIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9InN0b3BBbGxvY0NvdW50aW5nIgotIHJldHVybj0idm9pZCIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJ0cnVlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJ0cnVlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0ic3RvcEVtdWxhdG9yVHJhY2luZyIKLSByZXR1cm49InZvaWQiCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0idHJ1ZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0idHJ1ZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9InN0b3BJbnN0cnVjdGlvbkNvdW50aW5nIgotIHJldHVybj0idm9pZCIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJ0cnVlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJ0cnVlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0ic3RvcE1ldGhvZFRyYWNpbmciCi0gcmV0dXJuPSJ2b2lkIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9InRydWUiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9InRydWUiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJ0aHJlYWRDcHVUaW1lTmFub3MiCi0gcmV0dXJuPSJsb25nIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9InRydWUiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9InRydWUiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvbWV0aG9kPgotPGZpZWxkIG5hbWU9IkRFRkFVTFRfTUVUSE9EX1RSQUNFX0ZJTEVfTkFNRSIKLSB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotIHRyYW5zaWVudD0iZmFsc2UiCi0gdm9sYXRpbGU9ImZhbHNlIgotIHZhbHVlPSImcXVvdDsvc2RjYXJkL2RtdHJhY2UudHJhY2UmcXVvdDsiCi0gc3RhdGljPSJ0cnVlIgotIGZpbmFsPSJ0cnVlIgotIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9maWVsZD4KLTxmaWVsZCBuYW1lPSJLSU5EX0FMTF9DT1VOVFMiCi0gdHlwZT0iaW50IgotIHRyYW5zaWVudD0iZmFsc2UiCi0gdm9sYXRpbGU9ImZhbHNlIgotIHZhbHVlPSItMSIKLSBzdGF0aWM9InRydWUiCi0gZmluYWw9InRydWUiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9maWVsZD4KLTxmaWVsZCBuYW1lPSJLSU5EX0dMT0JBTF9BTExPQ0FURURfQllURVMiCi0gdHlwZT0iaW50IgotIHRyYW5zaWVudD0iZmFsc2UiCi0gdm9sYXRpbGU9ImZhbHNlIgotIHZhbHVlPSIyIgotIHN0YXRpYz0idHJ1ZSIKLSBmaW5hbD0idHJ1ZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L2ZpZWxkPgotPGZpZWxkIG5hbWU9IktJTkRfR0xPQkFMX0FMTE9DQVRFRF9PQkpFQ1RTIgotIHR5cGU9ImludCIKLSB0cmFuc2llbnQ9ImZhbHNlIgotIHZvbGF0aWxlPSJmYWxzZSIKLSB2YWx1ZT0iMSIKLSBzdGF0aWM9InRydWUiCi0gZmluYWw9InRydWUiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9maWVsZD4KLTxmaWVsZCBuYW1lPSJLSU5EX0dMT0JBTF9DTEFTU19JTklUX0NPVU5UIgotIHR5cGU9ImludCIKLSB0cmFuc2llbnQ9ImZhbHNlIgotIHZvbGF0aWxlPSJmYWxzZSIKLSB2YWx1ZT0iMzIiCi0gc3RhdGljPSJ0cnVlIgotIGZpbmFsPSJ0cnVlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvZmllbGQ+Ci08ZmllbGQgbmFtZT0iS0lORF9HTE9CQUxfQ0xBU1NfSU5JVF9USU1FIgotIHR5cGU9ImludCIKLSB0cmFuc2llbnQ9ImZhbHNlIgotIHZvbGF0aWxlPSJmYWxzZSIKLSB2YWx1ZT0iNjQiCi0gc3RhdGljPSJ0cnVlIgotIGZpbmFsPSJ0cnVlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvZmllbGQ+Ci08ZmllbGQgbmFtZT0iS0lORF9HTE9CQUxfRVhUX0FMTE9DQVRFRF9CWVRFUyIKLSB0eXBlPSJpbnQiCi0gdHJhbnNpZW50PSJmYWxzZSIKLSB2b2xhdGlsZT0iZmFsc2UiCi0gdmFsdWU9IjgxOTIiCi0gc3RhdGljPSJ0cnVlIgotIGZpbmFsPSJ0cnVlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvZmllbGQ+Ci08ZmllbGQgbmFtZT0iS0lORF9HTE9CQUxfRVhUX0FMTE9DQVRFRF9PQkpFQ1RTIgotIHR5cGU9ImludCIKLSB0cmFuc2llbnQ9ImZhbHNlIgotIHZvbGF0aWxlPSJmYWxzZSIKLSB2YWx1ZT0iNDA5NiIKLSBzdGF0aWM9InRydWUiCi0gZmluYWw9InRydWUiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9maWVsZD4KLTxmaWVsZCBuYW1lPSJLSU5EX0dMT0JBTF9FWFRfRlJFRURfQllURVMiCi0gdHlwZT0iaW50IgotIHRyYW5zaWVudD0iZmFsc2UiCi0gdm9sYXRpbGU9ImZhbHNlIgotIHZhbHVlPSIzMjc2OCIKLSBzdGF0aWM9InRydWUiCi0gZmluYWw9InRydWUiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9maWVsZD4KLTxmaWVsZCBuYW1lPSJLSU5EX0dMT0JBTF9FWFRfRlJFRURfT0JKRUNUUyIKLSB0eXBlPSJpbnQiCi0gdHJhbnNpZW50PSJmYWxzZSIKLSB2b2xhdGlsZT0iZmFsc2UiCi0gdmFsdWU9IjE2Mzg0IgotIHN0YXRpYz0idHJ1ZSIKLSBmaW5hbD0idHJ1ZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L2ZpZWxkPgotPGZpZWxkIG5hbWU9IktJTkRfR0xPQkFMX0ZSRUVEX0JZVEVTIgotIHR5cGU9ImludCIKLSB0cmFuc2llbnQ9ImZhbHNlIgotIHZvbGF0aWxlPSJmYWxzZSIKLSB2YWx1ZT0iOCIKLSBzdGF0aWM9InRydWUiCi0gZmluYWw9InRydWUiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9maWVsZD4KLTxmaWVsZCBuYW1lPSJLSU5EX0dMT0JBTF9GUkVFRF9PQkpFQ1RTIgotIHR5cGU9ImludCIKLSB0cmFuc2llbnQ9ImZhbHNlIgotIHZvbGF0aWxlPSJmYWxzZSIKLSB2YWx1ZT0iNCIKLSBzdGF0aWM9InRydWUiCi0gZmluYWw9InRydWUiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9maWVsZD4KLTxmaWVsZCBuYW1lPSJLSU5EX0dMT0JBTF9HQ19JTlZPQ0FUSU9OUyIKLSB0eXBlPSJpbnQiCi0gdHJhbnNpZW50PSJmYWxzZSIKLSB2b2xhdGlsZT0iZmFsc2UiCi0gdmFsdWU9IjE2IgotIHN0YXRpYz0idHJ1ZSIKLSBmaW5hbD0idHJ1ZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L2ZpZWxkPgotPGZpZWxkIG5hbWU9IktJTkRfVEhSRUFEX0FMTE9DQVRFRF9CWVRFUyIKLSB0eXBlPSJpbnQiCi0gdHJhbnNpZW50PSJmYWxzZSIKLSB2b2xhdGlsZT0iZmFsc2UiCi0gdmFsdWU9IjEzMTA3MiIKLSBzdGF0aWM9InRydWUiCi0gZmluYWw9InRydWUiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9maWVsZD4KLTxmaWVsZCBuYW1lPSJLSU5EX1RIUkVBRF9BTExPQ0FURURfT0JKRUNUUyIKLSB0eXBlPSJpbnQiCi0gdHJhbnNpZW50PSJmYWxzZSIKLSB2b2xhdGlsZT0iZmFsc2UiCi0gdmFsdWU9IjY1NTM2IgotIHN0YXRpYz0idHJ1ZSIKLSBmaW5hbD0idHJ1ZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L2ZpZWxkPgotPGZpZWxkIG5hbWU9IktJTkRfVEhSRUFEX0NMQVNTX0lOSVRfQ09VTlQiCi0gdHlwZT0iaW50IgotIHRyYW5zaWVudD0iZmFsc2UiCi0gdm9sYXRpbGU9ImZhbHNlIgotIHZhbHVlPSIyMDk3MTUyIgotIHN0YXRpYz0idHJ1ZSIKLSBmaW5hbD0idHJ1ZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L2ZpZWxkPgotPGZpZWxkIG5hbWU9IktJTkRfVEhSRUFEX0NMQVNTX0lOSVRfVElNRSIKLSB0eXBlPSJpbnQiCi0gdHJhbnNpZW50PSJmYWxzZSIKLSB2b2xhdGlsZT0iZmFsc2UiCi0gdmFsdWU9IjQxOTQzMDQiCi0gc3RhdGljPSJ0cnVlIgotIGZpbmFsPSJ0cnVlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvZmllbGQ+Ci08ZmllbGQgbmFtZT0iS0lORF9USFJFQURfRVhUX0FMTE9DQVRFRF9CWVRFUyIKLSB0eXBlPSJpbnQiCi0gdHJhbnNpZW50PSJmYWxzZSIKLSB2b2xhdGlsZT0iZmFsc2UiCi0gdmFsdWU9IjUzNjg3MDkxMiIKLSBzdGF0aWM9InRydWUiCi0gZmluYWw9InRydWUiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9maWVsZD4KLTxmaWVsZCBuYW1lPSJLSU5EX1RIUkVBRF9FWFRfQUxMT0NBVEVEX09CSkVDVFMiCi0gdHlwZT0iaW50IgotIHRyYW5zaWVudD0iZmFsc2UiCi0gdm9sYXRpbGU9ImZhbHNlIgotIHZhbHVlPSIyNjg0MzU0NTYiCi0gc3RhdGljPSJ0cnVlIgotIGZpbmFsPSJ0cnVlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvZmllbGQ+Ci08ZmllbGQgbmFtZT0iS0lORF9USFJFQURfRVhUX0ZSRUVEX0JZVEVTIgotIHR5cGU9ImludCIKLSB0cmFuc2llbnQ9ImZhbHNlIgotIHZvbGF0aWxlPSJmYWxzZSIKLSB2YWx1ZT0iLTIxNDc0ODM2NDgiCi0gc3RhdGljPSJ0cnVlIgotIGZpbmFsPSJ0cnVlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvZmllbGQ+Ci08ZmllbGQgbmFtZT0iS0lORF9USFJFQURfRVhUX0ZSRUVEX09CSkVDVFMiCi0gdHlwZT0iaW50IgotIHRyYW5zaWVudD0iZmFsc2UiCi0gdm9sYXRpbGU9ImZhbHNlIgotIHZhbHVlPSIxMDczNzQxODI0IgotIHN0YXRpYz0idHJ1ZSIKLSBmaW5hbD0idHJ1ZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L2ZpZWxkPgotPGZpZWxkIG5hbWU9IktJTkRfVEhSRUFEX0ZSRUVEX0JZVEVTIgotIHR5cGU9ImludCIKLSB0cmFuc2llbnQ9ImZhbHNlIgotIHZvbGF0aWxlPSJmYWxzZSIKLSB2YWx1ZT0iNTI0Mjg4IgotIHN0YXRpYz0idHJ1ZSIKLSBmaW5hbD0idHJ1ZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L2ZpZWxkPgotPGZpZWxkIG5hbWU9IktJTkRfVEhSRUFEX0ZSRUVEX09CSkVDVFMiCi0gdHlwZT0iaW50IgotIHRyYW5zaWVudD0iZmFsc2UiCi0gdm9sYXRpbGU9ImZhbHNlIgotIHZhbHVlPSIyNjIxNDQiCi0gc3RhdGljPSJ0cnVlIgotIGZpbmFsPSJ0cnVlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvZmllbGQ+Ci08ZmllbGQgbmFtZT0iS0lORF9USFJFQURfR0NfSU5WT0NBVElPTlMiCi0gdHlwZT0iaW50IgotIHRyYW5zaWVudD0iZmFsc2UiCi0gdm9sYXRpbGU9ImZhbHNlIgotIHZhbHVlPSIxMDQ4NTc2IgotIHN0YXRpYz0idHJ1ZSIKLSBmaW5hbD0idHJ1ZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L2ZpZWxkPgotPGZpZWxkIG5hbWU9IlRSQUNFX0NPVU5UX0FMTE9DUyIKLSB0eXBlPSJpbnQiCi0gdHJhbnNpZW50PSJmYWxzZSIKLSB2b2xhdGlsZT0iZmFsc2UiCi0gdmFsdWU9IjEiCi0gc3RhdGljPSJ0cnVlIgotIGZpbmFsPSJ0cnVlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvZmllbGQ+Ci08L2NsYXNzPgotPGNsYXNzIG5hbWU9IlZNUnVudGltZSIKLSBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgotIGFic3RyYWN0PSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJ0cnVlIgotIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPG1ldGhvZCBuYW1lPSJnY1NvZnRSZWZlcmVuY2VzIgotIHJldHVybj0idm9pZCIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJ0cnVlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9ImdldEV4dGVybmFsQnl0ZXNBbGxvY2F0ZWQiCi0gcmV0dXJuPSJsb25nIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9InRydWUiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0iZ2V0TWluaW11bUhlYXBTaXplIgotIHJldHVybj0ibG9uZyIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJnZXRSdW50aW1lIgotIHJldHVybj0iZGFsdmlrLnN5c3RlbS5WTVJ1bnRpbWUiCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9InRydWUiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJnZXRUYXJnZXRIZWFwVXRpbGl6YXRpb24iCi0gcmV0dXJuPSJmbG9hdCIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJ0cnVlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9InJ1bkZpbmFsaXphdGlvblN5bmMiCi0gcmV0dXJuPSJ2b2lkIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9InRydWUiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0ic2V0TWluaW11bUhlYXBTaXplIgotIHJldHVybj0ibG9uZyIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9InRydWUiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPHBhcmFtZXRlciBuYW1lPSJzaXplIiB0eXBlPSJsb25nIj4KLTwvcGFyYW1ldGVyPgotPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9InNldFRhcmdldEhlYXBVdGlsaXphdGlvbiIKLSByZXR1cm49ImZsb2F0IgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPHBhcmFtZXRlciBuYW1lPSJuZXdUYXJnZXQiIHR5cGU9ImZsb2F0Ij4KLTwvcGFyYW1ldGVyPgotPC9tZXRob2Q+Ci08L2NsYXNzPgotPGNsYXNzIG5hbWU9IlZNU3RhY2siCi0gZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0idHJ1ZSIKLSBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxjb25zdHJ1Y3RvciBuYW1lPSJWTVN0YWNrIgotIHR5cGU9ImRhbHZpay5zeXN0ZW0uVk1TdGFjayIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L2NvbnN0cnVjdG9yPgotPG1ldGhvZCBuYW1lPSJnZXRDYWxsaW5nQ2xhc3NMb2FkZXIiCi0gcmV0dXJuPSJqYXZhLmxhbmcuQ2xhc3NMb2FkZXIiCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0idHJ1ZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0idHJ1ZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9ImdldENhbGxpbmdDbGFzc0xvYWRlcjIiCi0gcmV0dXJuPSJqYXZhLmxhbmcuQ2xhc3NMb2FkZXIiCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0idHJ1ZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0idHJ1ZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9ImdldENsYXNzZXMiCi0gcmV0dXJuPSJqYXZhLmxhbmcuQ2xhc3MmbHQ7PyZndDtbXSIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJ0cnVlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJ0cnVlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08cGFyYW1ldGVyIG5hbWU9Im1heERlcHRoIiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9InN0b3BBdFByaXZpbGVnZWQiIHR5cGU9ImJvb2xlYW4iPgotPC9wYXJhbWV0ZXI+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0iZ2V0VGhyZWFkU3RhY2tUcmFjZSIKLSByZXR1cm49ImphdmEubGFuZy5TdGFja1RyYWNlRWxlbWVudFtdIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9InRydWUiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9InRydWUiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0idCIgdHlwZT0iamF2YS5sYW5nLlRocmVhZCI+Ci08L3BhcmFtZXRlcj4KLTwvbWV0aG9kPgotPC9jbGFzcz4KLTxjbGFzcyBuYW1lPSJaeWdvdGUiCi0gZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08bWV0aG9kIG5hbWU9ImZvcmsiCi0gcmV0dXJuPSJpbnQiCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0idHJ1ZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0idHJ1ZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9ImZvcmtBbmRTcGVjaWFsaXplIgotIHJldHVybj0iaW50IgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9InRydWUiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9InRydWUiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0idWlkIiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9ImdpZCIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJnaWRzIiB0eXBlPSJpbnRbXSI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0iZGVidWdGbGFncyIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJybGltaXRzIiB0eXBlPSJpbnRbXVtdIj4KLTwvcGFyYW1ldGVyPgotPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9ImZvcmtBbmRTcGVjaWFsaXplIgotIHJldHVybj0iaW50IgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJ0cnVlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0idWlkIiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9ImdpZCIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJnaWRzIiB0eXBlPSJpbnRbXSI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0iZW5hYmxlRGVidWdnZXIiIHR5cGU9ImJvb2xlYW4iPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9InJsaW1pdHMiIHR5cGU9ImludFtdW10iPgotPC9wYXJhbWV0ZXI+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0iZm9ya1N5c3RlbVNlcnZlciIKLSByZXR1cm49ImludCIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJ0cnVlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJ0cnVlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08cGFyYW1ldGVyIG5hbWU9InVpZCIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJnaWQiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0iZ2lkcyIgdHlwZT0iaW50W10iPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9ImRlYnVnRmxhZ3MiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0icmxpbWl0cyIgdHlwZT0iaW50W11bXSI+Ci08L3BhcmFtZXRlcj4KLTwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJmb3JrU3lzdGVtU2VydmVyIgotIHJldHVybj0iaW50IgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJ0cnVlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0idWlkIiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9ImdpZCIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJnaWRzIiB0eXBlPSJpbnRbXSI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0iZW5hYmxlRGVidWdnZXIiIHR5cGU9ImJvb2xlYW4iPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9InJsaW1pdHMiIHR5cGU9ImludFtdW10iPgotPC9wYXJhbWV0ZXI+Ci08L21ldGhvZD4KLTxmaWVsZCBuYW1lPSJERUJVR19FTkFCTEVfQVNTRVJUIgotIHR5cGU9ImludCIKLSB0cmFuc2llbnQ9ImZhbHNlIgotIHZvbGF0aWxlPSJmYWxzZSIKLSB2YWx1ZT0iNCIKLSBzdGF0aWM9InRydWUiCi0gZmluYWw9InRydWUiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9maWVsZD4KLTxmaWVsZCBuYW1lPSJERUJVR19FTkFCTEVfQ0hFQ0tKTkkiCi0gdHlwZT0iaW50IgotIHRyYW5zaWVudD0iZmFsc2UiCi0gdm9sYXRpbGU9ImZhbHNlIgotIHZhbHVlPSIyIgotIHN0YXRpYz0idHJ1ZSIKLSBmaW5hbD0idHJ1ZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L2ZpZWxkPgotPGZpZWxkIG5hbWU9IkRFQlVHX0VOQUJMRV9ERUJVR0dFUiIKLSB0eXBlPSJpbnQiCi0gdHJhbnNpZW50PSJmYWxzZSIKLSB2b2xhdGlsZT0iZmFsc2UiCi0gdmFsdWU9IjEiCi0gc3RhdGljPSJ0cnVlIgotIGZpbmFsPSJ0cnVlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvZmllbGQ+Ci08ZmllbGQgbmFtZT0iREVCVUdfRU5BQkxFX1NBRkVNT0RFIgotIHR5cGU9ImludCIKLSB0cmFuc2llbnQ9ImZhbHNlIgotIHZvbGF0aWxlPSJmYWxzZSIKLSB2YWx1ZT0iOCIKLSBzdGF0aWM9InRydWUiCi0gZmluYWw9InRydWUiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9maWVsZD4KLTwvY2xhc3M+CiA8L3BhY2thZ2U+CiA8cGFja2FnZSBuYW1lPSJqYXZhLmF3dC5mb250IgogPgpAQCAtMjg4NTQ1LDIxICsyODczMjgsNiBAQAogPHBhcmFtZXRlciBuYW1lPSJ3aGVyZSIgdHlwZT0iamF2YS51dGlsLkxvY2FsZSI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJnZXRJbnQiCi0gcmV0dXJuPSJpbnQiCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9InRydWUiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InByb3RlY3RlZCIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0iYnVmIiB0eXBlPSJieXRlW10iPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9Im9mZnNldCIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldExpbmVJbnN0YW5jZSIKICByZXR1cm49ImphdmEudGV4dC5CcmVha0l0ZXJhdG9yIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTI4ODU4NCwyMSArMjg3MzUyLDYgQEAKIDxwYXJhbWV0ZXIgbmFtZT0id2hlcmUiIHR5cGU9ImphdmEudXRpbC5Mb2NhbGUiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KLTxtZXRob2QgbmFtZT0iZ2V0TG9uZyIKLSByZXR1cm49ImxvbmciCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9InRydWUiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InByb3RlY3RlZCIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0iYnVmIiB0eXBlPSJieXRlW10iPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9Im9mZnNldCIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldFNlbnRlbmNlSW5zdGFuY2UiCiAgcmV0dXJuPSJqYXZhLnRleHQuQnJlYWtJdGVyYXRvciIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yODg2MjMsMjEgKzI4NzM3Niw2IEBACiA8cGFyYW1ldGVyIG5hbWU9IndoZXJlIiB0eXBlPSJqYXZhLnV0aWwuTG9jYWxlIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9ImdldFNob3J0IgotIHJldHVybj0ic2hvcnQiCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9InRydWUiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InByb3RlY3RlZCIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0iYnVmIiB0eXBlPSJieXRlW10iPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9Im9mZnNldCIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldFRleHQiCiAgcmV0dXJuPSJqYXZhLnRleHQuQ2hhcmFjdGVySXRlcmF0b3IiCiAgYWJzdHJhY3Q9InRydWUiCkBAIC0yODkyNTUsOSArMjg3OTkzLDkgQEAKIDwvY2xhc3M+CiA8Y2xhc3MgbmFtZT0iQ29sbGF0aW9uS2V5IgogIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCi0gYWJzdHJhY3Q9ImZhbHNlIgorIGFic3RyYWN0PSJ0cnVlIgogIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9InRydWUiCisgZmluYWw9ImZhbHNlIgogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KQEAgLTI4OTI2NSw3ICsyODgwMDMsNyBAQAogPC9pbXBsZW1lbnRzPgogPG1ldGhvZCBuYW1lPSJjb21wYXJlVG8iCiAgcmV0dXJuPSJpbnQiCi0gYWJzdHJhY3Q9ImZhbHNlIgorIGFic3RyYWN0PSJ0cnVlIgogIG5hdGl2ZT0iZmFsc2UiCiAgc3luY2hyb25pemVkPSJmYWxzZSIKICBzdGF0aWM9ImZhbHNlIgpAQCAtMjg5Mjg5LDcgKzI4ODAyNyw3IEBACiA8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0idG9CeXRlQXJyYXkiCiAgcmV0dXJuPSJieXRlW10iCi0gYWJzdHJhY3Q9ImZhbHNlIgorIGFic3RyYWN0PSJ0cnVlIgogIG5hdGl2ZT0iZmFsc2UiCiAgc3luY2hyb25pemVkPSJmYWxzZSIKICBzdGF0aWM9ImZhbHNlIgpAQCAtMjkxMDEzLDcgKzI4OTc1MSw3IEBACiAgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKICBhYnN0cmFjdD0iZmFsc2UiCiAgc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgpAQCAtMjkxNTE1LDcgKzI5MDI1Myw3IEBACiAgc3RhdGljPSJmYWxzZSIKICBmaW5hbD0iZmFsc2UiCiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgorIHZpc2liaWxpdHk9InByb3RlY3RlZCIKID4KIDwvY29uc3RydWN0b3I+CiA8bWV0aG9kIG5hbWU9ImNsb25lIgpAQCAtMjkxOTE1LDcgKzI5MDY1Myw3IEBACiAgc3RhdGljPSJmYWxzZSIKICBmaW5hbD0iZmFsc2UiCiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgorIHZpc2liaWxpdHk9InByb3RlY3RlZCIKID4KIDwvY29uc3RydWN0b3I+CiA8bWV0aG9kIG5hbWU9ImZvcm1hdCIKQEAgLTMwNTYyOSw3ICszMDQzNjcsNyBAQAogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KLTxwYXJhbWV0ZXIgbmFtZT0idGFza3MiIHR5cGU9ImphdmEudXRpbC5Db2xsZWN0aW9uJmx0O2phdmEudXRpbC5jb25jdXJyZW50LkNhbGxhYmxlJmx0O1QmZ3Q7Jmd0OyI+Cis8cGFyYW1ldGVyIG5hbWU9InRhc2tzIiB0eXBlPSJqYXZhLnV0aWwuQ29sbGVjdGlvbiZsdDs/IGV4dGVuZHMgamF2YS51dGlsLmNvbmN1cnJlbnQuQ2FsbGFibGUmbHQ7VCZndDsmZ3Q7Ij4KIDwvcGFyYW1ldGVyPgogPGV4Y2VwdGlvbiBuYW1lPSJJbnRlcnJ1cHRlZEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5sYW5nLkludGVycnVwdGVkRXhjZXB0aW9uIj4KIDwvZXhjZXB0aW9uPgpAQCAtMzA1NjQ0LDcgKzMwNDM4Miw3IEBACiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgotPHBhcmFtZXRlciBuYW1lPSJ0YXNrcyIgdHlwZT0iamF2YS51dGlsLkNvbGxlY3Rpb24mbHQ7amF2YS51dGlsLmNvbmN1cnJlbnQuQ2FsbGFibGUmbHQ7VCZndDsmZ3Q7Ij4KKzxwYXJhbWV0ZXIgbmFtZT0idGFza3MiIHR5cGU9ImphdmEudXRpbC5Db2xsZWN0aW9uJmx0Oz8gZXh0ZW5kcyBqYXZhLnV0aWwuY29uY3VycmVudC5DYWxsYWJsZSZsdDtUJmd0OyZndDsiPgogPC9wYXJhbWV0ZXI+CiA8cGFyYW1ldGVyIG5hbWU9InRpbWVvdXQiIHR5cGU9ImxvbmciPgogPC9wYXJhbWV0ZXI+CkBAIC0zMDU2NjMsNyArMzA0NDAxLDcgQEAKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+Ci08cGFyYW1ldGVyIG5hbWU9InRhc2tzIiB0eXBlPSJqYXZhLnV0aWwuQ29sbGVjdGlvbiZsdDtqYXZhLnV0aWwuY29uY3VycmVudC5DYWxsYWJsZSZsdDtUJmd0OyZndDsiPgorPHBhcmFtZXRlciBuYW1lPSJ0YXNrcyIgdHlwZT0iamF2YS51dGlsLkNvbGxlY3Rpb24mbHQ7PyBleHRlbmRzIGphdmEudXRpbC5jb25jdXJyZW50LkNhbGxhYmxlJmx0O1QmZ3Q7Jmd0OyI+CiA8L3BhcmFtZXRlcj4KIDxleGNlcHRpb24gbmFtZT0iRXhlY3V0aW9uRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRpb25FeGNlcHRpb24iPgogPC9leGNlcHRpb24+CkBAIC0zMDU2ODAsNyArMzA0NDE4LDcgQEAKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+Ci08cGFyYW1ldGVyIG5hbWU9InRhc2tzIiB0eXBlPSJqYXZhLnV0aWwuQ29sbGVjdGlvbiZsdDtqYXZhLnV0aWwuY29uY3VycmVudC5DYWxsYWJsZSZsdDtUJmd0OyZndDsiPgorPHBhcmFtZXRlciBuYW1lPSJ0YXNrcyIgdHlwZT0iamF2YS51dGlsLkNvbGxlY3Rpb24mbHQ7PyBleHRlbmRzIGphdmEudXRpbC5jb25jdXJyZW50LkNhbGxhYmxlJmx0O1QmZ3Q7Jmd0OyI+CiA8L3BhcmFtZXRlcj4KIDxwYXJhbWV0ZXIgbmFtZT0idGltZW91dCIgdHlwZT0ibG9uZyI+CiA8L3BhcmFtZXRlcj4KQEAgLTMwNzY5Myw3ICszMDY0MzEsNyBAQAogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KLTxwYXJhbWV0ZXIgbmFtZT0idGFza3MiIHR5cGU9ImphdmEudXRpbC5Db2xsZWN0aW9uJmx0O2phdmEudXRpbC5jb25jdXJyZW50LkNhbGxhYmxlJmx0O1QmZ3Q7Jmd0OyI+Cis8cGFyYW1ldGVyIG5hbWU9InRhc2tzIiB0eXBlPSJqYXZhLnV0aWwuQ29sbGVjdGlvbiZsdDs/IGV4dGVuZHMgamF2YS51dGlsLmNvbmN1cnJlbnQuQ2FsbGFibGUmbHQ7VCZndDsmZ3Q7Ij4KIDwvcGFyYW1ldGVyPgogPGV4Y2VwdGlvbiBuYW1lPSJJbnRlcnJ1cHRlZEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5sYW5nLkludGVycnVwdGVkRXhjZXB0aW9uIj4KIDwvZXhjZXB0aW9uPgpAQCAtMzA3NzA4LDcgKzMwNjQ0Niw3IEBACiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgotPHBhcmFtZXRlciBuYW1lPSJ0YXNrcyIgdHlwZT0iamF2YS51dGlsLkNvbGxlY3Rpb24mbHQ7amF2YS51dGlsLmNvbmN1cnJlbnQuQ2FsbGFibGUmbHQ7VCZndDsmZ3Q7Ij4KKzxwYXJhbWV0ZXIgbmFtZT0idGFza3MiIHR5cGU9ImphdmEudXRpbC5Db2xsZWN0aW9uJmx0Oz8gZXh0ZW5kcyBqYXZhLnV0aWwuY29uY3VycmVudC5DYWxsYWJsZSZsdDtUJmd0OyZndDsiPgogPC9wYXJhbWV0ZXI+CiA8cGFyYW1ldGVyIG5hbWU9InRpbWVvdXQiIHR5cGU9ImxvbmciPgogPC9wYXJhbWV0ZXI+CkBAIC0zMDc3MjcsNyArMzA2NDY1LDcgQEAKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+Ci08cGFyYW1ldGVyIG5hbWU9InRhc2tzIiB0eXBlPSJqYXZhLnV0aWwuQ29sbGVjdGlvbiZsdDtqYXZhLnV0aWwuY29uY3VycmVudC5DYWxsYWJsZSZsdDtUJmd0OyZndDsiPgorPHBhcmFtZXRlciBuYW1lPSJ0YXNrcyIgdHlwZT0iamF2YS51dGlsLkNvbGxlY3Rpb24mbHQ7PyBleHRlbmRzIGphdmEudXRpbC5jb25jdXJyZW50LkNhbGxhYmxlJmx0O1QmZ3Q7Jmd0OyI+CiA8L3BhcmFtZXRlcj4KIDxleGNlcHRpb24gbmFtZT0iRXhlY3V0aW9uRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRpb25FeGNlcHRpb24iPgogPC9leGNlcHRpb24+CkBAIC0zMDc3NDQsNyArMzA2NDgyLDcgQEAKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+Ci08cGFyYW1ldGVyIG5hbWU9InRhc2tzIiB0eXBlPSJqYXZhLnV0aWwuQ29sbGVjdGlvbiZsdDtqYXZhLnV0aWwuY29uY3VycmVudC5DYWxsYWJsZSZsdDtUJmd0OyZndDsiPgorPHBhcmFtZXRlciBuYW1lPSJ0YXNrcyIgdHlwZT0iamF2YS51dGlsLkNvbGxlY3Rpb24mbHQ7PyBleHRlbmRzIGphdmEudXRpbC5jb25jdXJyZW50LkNhbGxhYmxlJmx0O1QmZ3Q7Jmd0OyI+CiA8L3BhcmFtZXRlcj4KIDxwYXJhbWV0ZXIgbmFtZT0idGltZW91dCIgdHlwZT0ibG9uZyI+CiA8L3BhcmFtZXRlcj4KQEAgLTMwNzg4OSw3ICszMDY2MjcsNyBAQAogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KLTxwYXJhbWV0ZXIgbmFtZT0iYWN0aW9uIiB0eXBlPSJqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb24iPgorPHBhcmFtZXRlciBuYW1lPSJhY3Rpb24iIHR5cGU9ImphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbiZsdDs/Jmd0OyI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJjYWxsYWJsZSIKQEAgLTMwNzkwMiw3ICszMDY2NDAsNyBAQAogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KLTxwYXJhbWV0ZXIgbmFtZT0iYWN0aW9uIiB0eXBlPSJqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb24iPgorPHBhcmFtZXRlciBuYW1lPSJhY3Rpb24iIHR5cGU9ImphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbiZsdDs/Jmd0OyI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJkZWZhdWx0VGhyZWFkRmFjdG9yeSIKQEAgLTMxMjIyNyw3ICszMTA5NjUsNyBAQAogIHN0YXRpYz0iZmFsc2UiCiAgZmluYWw9ImZhbHNlIgogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9IiIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8aW1wbGVtZW50cyBuYW1lPSJqYXZhLmlvLlNlcmlhbGl6YWJsZSI+CiA8L2ltcGxlbWVudHM+CkBAIC0zMzc0MTMsMTEgKzMzNjE1MSwxMSBAQAogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KLTxwYXJhbWV0ZXIgbmFtZT0icGFyYW1ldGVycyIgdHlwZT0iamF2YS51dGlsLkxpc3QiPgorPHBhcmFtZXRlciBuYW1lPSJwYXJhbWV0ZXJzIiB0eXBlPSJqYXZhLnV0aWwuTGlzdCZsdDtqYXZhLnNlY3VyaXR5LktleVN0b3JlLkJ1aWxkZXImZ3Q7Ij4KIDwvcGFyYW1ldGVyPgogPC9jb25zdHJ1Y3Rvcj4KIDxtZXRob2QgbmFtZT0iZ2V0UGFyYW1ldGVycyIKLSByZXR1cm49ImphdmEudXRpbC5MaXN0IgorIHJldHVybj0iamF2YS51dGlsLkxpc3QmbHQ7amF2YS5zZWN1cml0eS5LZXlTdG9yZS5CdWlsZGVyJmd0OyIKICBhYnN0cmFjdD0iZmFsc2UiCiAgbmF0aXZlPSJmYWxzZSIKICBzeW5jaHJvbml6ZWQ9ImZhbHNlIgpAQCAtMzM5MDQ4LDcgKzMzNzc4Niw3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPG1ldGhvZCBuYW1lPSJnZXRJZHMiCi0gcmV0dXJuPSJqYXZhLnV0aWwuRW51bWVyYXRpb24iCisgcmV0dXJuPSJqYXZhLnV0aWwuRW51bWVyYXRpb24mbHQ7Ynl0ZVtdJmd0OyIKICBhYnN0cmFjdD0idHJ1ZSIKICBuYXRpdmU9ImZhbHNlIgogIHN5bmNocm9uaXplZD0iZmFsc2UiCmRpZmYgLS1naXQgYS9hcGkvY3VycmVudC54bWwgYi9hcGkvY3VycmVudC54bWwKaW5kZXggYmMyMWMzYS4uNTA1NDZkMyAxMDA2NDQKLS0tIGEvYXBpL2N1cnJlbnQueG1sCisrKyBiL2FwaS9jdXJyZW50LnhtbApAQCAtMjA4OCw2ICsyMDg4LDM5IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJhY3Rpb25CdXR0b25QYWRkaW5nIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1NDciCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iYWN0aW9uQnV0dG9uU3R5bGUiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzU0NSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJhY3Rpb25Ecm9wRG93blN0eWxlIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1NDQiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0iYWN0aXZpdHlDbG9zZUVudGVyQW5pbWF0aW9uIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMjEzMiw2ICsyMTY1LDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJhZGFwdGVyIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1MjEiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0iYWRkU3RhdGVzRnJvbUNoaWxkcmVuIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMjE2NSw2ICsyMjA5LDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJhbGxDb250YWN0c05hbWUiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzUzMyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJhbGxvd0JhY2t1cCIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTIyNTMsNiArMjMwOCwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iYW5pbWF0ZUZpcnN0VmlldyIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTQyIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9ImFuaW1hdGVPbkNsaWNrIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMjM0MSw2ICsyNDA3LDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJhcyIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTI3IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9ImF1dGhvciIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTMwMDEsNiArMzA3OCwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iY29sdW1uIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1MzAiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0iY29sdW1uRGVsYXkiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC0zMTQ0LDYgKzMyMzIsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9ImN1c3RvbU5hdmlnYXRpb25MYXlvdXQiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzUzOSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJjeWNsZXMiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC0zNDA4LDYgKzM1MDcsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9ImRpc3BsYXlPcHRpb25zIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1MzciCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0iZGl0aGVyIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMzYwNiw2ICszNzE2LDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJkcm9wRG93blNwaW5uZXJTdHlsZSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTQzIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9ImRyb3BEb3duVmVydGljYWxPZmZzZXQiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC00MTY3LDYgKzQyODgsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9ImZyb20iCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzUyNSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJmcm9tQWxwaGEiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC00MTg5LDYgKzQzMjEsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9ImZyb21WYWx1ZSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTI4IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9ImZyb21YRGVsdGEiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC00NDc1LDYgKzQ2MTgsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9ImhhcmR3YXJlQWNjZWxlcmF0ZWQiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzU0MCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJoYXNDb2RlIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtNjY4Niw2ICs2ODQwLDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJtZWFzdXJlV2l0aExhcmdlc3RDaGlsZCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTQxIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9Im1lbnVDYXRlZ29yeSIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTY4MTgsNiArNjk4MywxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0ibmF2aWdhdGlvbk1vZGUiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzUzNiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJuZWdhdGl2ZUJ1dHRvblRleHQiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC04MzAzLDYgKzg0NzksMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9InNlbGVjdGlvbiIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTIyIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9InNldHRpbmdzQWN0aXZpdHkiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC04NDEzLDYgKzg2MDAsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9InNob3dBc0FjdGlvbiIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTQ2IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9InNob3dEZWZhdWx0IgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtODQ5MCw2ICs4Njg4LDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJzb3J0T3JkZXIiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzUyMyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJzb3VuZEVmZmVjdHNFbmFibGVkIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtODg0Miw2ICs5MDUxLDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJzdWJ0aXRsZSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTM4IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9InN1Z2dlc3RBY3Rpb25Nc2ciCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC05Njc4LDYgKzk4OTgsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9InRvIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1MjYiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0idG9BbHBoYSIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTk3MDAsNiArOTkzMSwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0idG9WYWx1ZSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTI5IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9InRvWERlbHRhIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtOTg3Niw2ICsxMDExOCwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0idXJpIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1MjQiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0idXNlTGV2ZWwiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC0xMDIxNyw2ICsxMDQ3MCwyOCBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0id2luZG93QWN0aW9uQmFyIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1MzQiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0id2luZG93QWN0aW9uQmFyU3R5bGUiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzUzNSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJ3aW5kb3dBbmltYXRpb25TdHlsZSIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTEwNDI2LDYgKzEwNzAxLDI4IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJ3aXRoQ2xhc3MiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzUzMiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJ3aXRoRXhwcmVzc2lvbiIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTMxIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9IndyaXRlUGVybWlzc2lvbiIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTE0MDc1LDYgKzE0MzcyLDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJob21lIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY5MDgzNTMiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0iaWNvbiIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTE2MjQ1LDYgKzE2NTUzLDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJUaGVtZV9XaXRoQWN0aW9uQmFyIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY5NzM5NjkiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0iV2lkZ2V0IgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMTYyNjcsNiArMTY1ODYsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IldpZGdldF9BY3Rpb25CdXR0b24iCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjk3Mzk3MSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJXaWRnZXRfQXV0b0NvbXBsZXRlVGV4dFZpZXciCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC0xNjY0MSw2ICsxNjk3MSwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iV2lkZ2V0X1NwaW5uZXJfRHJvcERvd24iCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjk3Mzk3MCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJXaWRnZXRfVGFiV2lkZ2V0IgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMTkwNjcsNiArMTk0MDgsMzk5IEBACiA8L3BhY2thZ2U+CiA8cGFja2FnZSBuYW1lPSJhbmRyb2lkLmFwcCIKID4KKzxjbGFzcyBuYW1lPSJBY3Rpb25CYXIiCisgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8Y29uc3RydWN0b3IgbmFtZT0iQWN0aW9uQmFyIgorIHR5cGU9ImFuZHJvaWQuYXBwLkFjdGlvbkJhciIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2NvbnN0cnVjdG9yPgorPG1ldGhvZCBuYW1lPSJnZXRDdXN0b21OYXZpZ2F0aW9uVmlldyIKKyByZXR1cm49ImFuZHJvaWQudmlldy5WaWV3IgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0RGlzcGxheU9wdGlvbnMiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXROYXZpZ2F0aW9uTW9kZSIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFN1YnRpdGxlIgorIHJldHVybj0iamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFRpdGxlIgorIHJldHVybj0iamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldEJhY2tncm91bmREcmF3YWJsZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZCIgdHlwZT0iYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRDYWxsYmFjayIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY2FsbGJhY2siIHR5cGU9ImFuZHJvaWQuYXBwLkFjdGlvbkJhci5DYWxsYmFjayI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRDdXN0b21OYXZpZ2F0aW9uTW9kZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idmlldyIgdHlwZT0iYW5kcm9pZC52aWV3LlZpZXciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0RGlzcGxheU9wdGlvbnMiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im9wdGlvbnMiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXREaXNwbGF5T3B0aW9ucyIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ib3B0aW9ucyIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJtYXNrIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0RHJvcGRvd25OYXZpZ2F0aW9uTW9kZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYWRhcHRlciIgdHlwZT0iYW5kcm9pZC53aWRnZXQuU3Bpbm5lckFkYXB0ZXIiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0U3RhbmRhcmROYXZpZ2F0aW9uTW9kZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idGl0bGUiIHR5cGU9ImphdmEubGFuZy5DaGFyU2VxdWVuY2UiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InN1YnRpdGxlIiB0eXBlPSJqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFN0YW5kYXJkTmF2aWdhdGlvbk1vZGUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InRpdGxlIiB0eXBlPSJqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8ZmllbGQgbmFtZT0iRElTUExBWV9ISURFX0hPTUUiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIyIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IkRJU1BMQVlfVVNFX0xPR08iCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9Ik5BVklHQVRJT05fTU9ERV9DVVNUT00iCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIzIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9Ik5BVklHQVRJT05fTU9ERV9EUk9QRE9XTl9MSVNUIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJOQVZJR0FUSU9OX01PREVfU1RBTkRBUkQiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIwIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9Ik5BVklHQVRJT05fTU9ERV9UQUJTIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzwvY2xhc3M+Cis8aW50ZXJmYWNlIG5hbWU9IkFjdGlvbkJhci5DYWxsYmFjayIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxtZXRob2QgbmFtZT0ib25Db250ZXh0SXRlbUNsaWNrZWQiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im1vZGVJZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJpdGVtIiB0eXBlPSJhbmRyb2lkLnZpZXcuTWVudUl0ZW0iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25DcmVhdGVDb250ZXh0TW9kZSIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibW9kZUlkIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Im1lbnUiIHR5cGU9ImFuZHJvaWQudmlldy5NZW51Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uTmF2aWdhdGlvbkl0ZW1TZWxlY3RlZCIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iaXRlbVBvc2l0aW9uIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Iml0ZW1JZCIgdHlwZT0ibG9uZyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvblByZXBhcmVDb250ZXh0TW9kZSIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibW9kZUlkIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Im1lbnUiIHR5cGU9ImFuZHJvaWQudmlldy5NZW51Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8L2ludGVyZmFjZT4KKzxjbGFzcyBuYW1lPSJBY3Rpb25CYXIuU2ltcGxlQ2FsbGJhY2siCisgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8aW1wbGVtZW50cyBuYW1lPSJhbmRyb2lkLmFwcC5BY3Rpb25CYXIuQ2FsbGJhY2siPgorPC9pbXBsZW1lbnRzPgorPGNvbnN0cnVjdG9yIG5hbWU9IkFjdGlvbkJhci5TaW1wbGVDYWxsYmFjayIKKyB0eXBlPSJhbmRyb2lkLmFwcC5BY3Rpb25CYXIuU2ltcGxlQ2FsbGJhY2siCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9jb25zdHJ1Y3Rvcj4KKzxtZXRob2QgbmFtZT0ib25Db250ZXh0SXRlbUNsaWNrZWQiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJtb2RlSWQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iaXRlbSIgdHlwZT0iYW5kcm9pZC52aWV3Lk1lbnVJdGVtIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uQ3JlYXRlQ29udGV4dE1vZGUiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJtb2RlSWQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibWVudSIgdHlwZT0iYW5kcm9pZC52aWV3Lk1lbnUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25OYXZpZ2F0aW9uSXRlbVNlbGVjdGVkIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iaXRlbVBvc2l0aW9uIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Iml0ZW1JZCIgdHlwZT0ibG9uZyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvblByZXBhcmVDb250ZXh0TW9kZSIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im1vZGVJZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJtZW51IiB0eXBlPSJhbmRyb2lkLnZpZXcuTWVudSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPC9jbGFzcz4KIDxjbGFzcyBuYW1lPSJBY3Rpdml0eSIKICBleHRlbmRzPSJhbmRyb2lkLnZpZXcuQ29udGV4dFRoZW1lV3JhcHBlciIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xOTIxMiw2ICsxOTk0NiwzMiBAQAogPHBhcmFtZXRlciBuYW1lPSJldiIgdHlwZT0iYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImZpbmRGcmFnbWVudEJ5SWQiCisgcmV0dXJuPSJhbmRyb2lkLmFwcC5GcmFnbWVudCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iaWQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJmaW5kRnJhZ21lbnRCeVRhZyIKKyByZXR1cm49ImFuZHJvaWQuYXBwLkZyYWdtZW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ0YWciIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZmluZFZpZXdCeUlkIgogIHJldHVybj0iYW5kcm9pZC52aWV3LlZpZXciCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTkyNzcsNiArMjAwMzcsMTcgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iY2hpbGQiIHR5cGU9ImFuZHJvaWQuYXBwLkFjdGl2aXR5Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldEFjdGlvbkJhciIKKyByZXR1cm49ImFuZHJvaWQuYXBwLkFjdGlvbkJhciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJnZXRBcHBsaWNhdGlvbiIKICByZXR1cm49ImFuZHJvaWQuYXBwLkFwcGxpY2F0aW9uIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE5NTIxLDYgKzIwMjkyLDI4IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImludmFsaWRhdGVPcHRpb25zTWVudSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iaXNDaGFuZ2luZ0NvbmZpZ3VyYXRpb25zIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJpc0NoaWxkIgogIHJldHVybj0iYm9vbGVhbiIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yMDMxNSw2ICsyMTEwOCwxNyBAQAogPHBhcmFtZXRlciBuYW1lPSJ2aWV3IiB0eXBlPSJhbmRyb2lkLnZpZXcuVmlldyI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvcGVuRnJhZ21lbnRUcmFuc2FjdGlvbiIKKyByZXR1cm49ImFuZHJvaWQuYXBwLkZyYWdtZW50VHJhbnNhY3Rpb24iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ib3Blbk9wdGlvbnNNZW51IgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yMDM0MSw2ICsyMTE0NSwxOSBAQAogPHBhcmFtZXRlciBuYW1lPSJleGl0QW5pbSIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InBvcEJhY2tTdGFjayIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0icmVnaXN0ZXJGb3JDb250ZXh0TWVudSIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjA3NzcsNiArMjE1OTQsMjMgQEAKIDxwYXJhbWV0ZXIgbmFtZT0icmVxdWVzdENvZGUiIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzdGFydEFjdGl2aXR5RnJvbUZyYWdtZW50IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZnJhZ21lbnQiIHR5cGU9ImFuZHJvaWQuYXBwLkZyYWdtZW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJpbnRlbnQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5JbnRlbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InJlcXVlc3RDb2RlIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic3RhcnRBY3Rpdml0eUlmTmVlZGVkIgogIHJldHVybj0iYm9vbGVhbiIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yNDczNyw2ICsyNTU3MSw5MzcgQEAKIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+CiA8L2NsYXNzPgorPGNsYXNzIG5hbWU9IkZyYWdtZW50IgorIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxpbXBsZW1lbnRzIG5hbWU9ImFuZHJvaWQuY29udGVudC5Db21wb25lbnRDYWxsYmFja3MiPgorPC9pbXBsZW1lbnRzPgorPGltcGxlbWVudHMgbmFtZT0iYW5kcm9pZC52aWV3LlZpZXcuT25DcmVhdGVDb250ZXh0TWVudUxpc3RlbmVyIj4KKzwvaW1wbGVtZW50cz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJGcmFnbWVudCIKKyB0eXBlPSJhbmRyb2lkLmFwcC5GcmFnbWVudCIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2NvbnN0cnVjdG9yPgorPG1ldGhvZCBuYW1lPSJlcXVhbHMiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im8iIHR5cGU9ImphdmEubGFuZy5PYmplY3QiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0QWN0aXZpdHkiCisgcmV0dXJuPSJhbmRyb2lkLmFwcC5BY3Rpdml0eSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldElkIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0UmV0YWluSW5zdGFuY2UiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0VGFnIgorIHJldHVybj0iamF2YS5sYW5nLlN0cmluZyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFZpZXciCisgcmV0dXJuPSJhbmRyb2lkLnZpZXcuVmlldyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJoYXNoQ29kZSIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImlzQWRkZWQiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iaXNIaWRkZW4iCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iaXNWaXNpYmxlIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uQWN0aXZpdHlSZXN1bHQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJyZXF1ZXN0Q29kZSIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJyZXN1bHRDb2RlIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImRhdGEiIHR5cGU9ImFuZHJvaWQuY29udGVudC5JbnRlbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25BdHRhY2giCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhY3Rpdml0eSIgdHlwZT0iYW5kcm9pZC5hcHAuQWN0aXZpdHkiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25Db25maWd1cmF0aW9uQ2hhbmdlZCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im5ld0NvbmZpZyIgdHlwZT0iYW5kcm9pZC5jb250ZW50LnJlcy5Db25maWd1cmF0aW9uIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uQ29udGV4dEl0ZW1TZWxlY3RlZCIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Iml0ZW0iIHR5cGU9ImFuZHJvaWQudmlldy5NZW51SXRlbSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvbkNyZWF0ZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InNhdmVkSW5zdGFuY2VTdGF0ZSIgdHlwZT0iYW5kcm9pZC5vcy5CdW5kbGUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25DcmVhdGVBbmltYXRpb24iCisgcmV0dXJuPSJhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkFuaW1hdGlvbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idHJhbnNpdCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJlbnRlciIgdHlwZT0iYm9vbGVhbiI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibmV4dEFuaW0iIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvbkNyZWF0ZUNvbnRleHRNZW51IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibWVudSIgdHlwZT0iYW5kcm9pZC52aWV3LkNvbnRleHRNZW51Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ2IiB0eXBlPSJhbmRyb2lkLnZpZXcuVmlldyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibWVudUluZm8iIHR5cGU9ImFuZHJvaWQudmlldy5Db250ZXh0TWVudS5Db250ZXh0TWVudUluZm8iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25DcmVhdGVPcHRpb25zTWVudSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im1lbnUiIHR5cGU9ImFuZHJvaWQudmlldy5NZW51Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJpbmZsYXRlciIgdHlwZT0iYW5kcm9pZC52aWV3Lk1lbnVJbmZsYXRlciI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvbkNyZWF0ZVZpZXciCisgcmV0dXJuPSJhbmRyb2lkLnZpZXcuVmlldyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iaW5mbGF0ZXIiIHR5cGU9ImFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlciI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iY29udGFpbmVyIiB0eXBlPSJhbmRyb2lkLnZpZXcuVmlld0dyb3VwIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJzYXZlZEluc3RhbmNlU3RhdGUiIHR5cGU9ImFuZHJvaWQub3MuQnVuZGxlIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uRGVzdHJveSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25EZXN0cm95VmlldyIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25EZXRhY2giCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uSGlkZGVuQ2hhbmdlZCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImhpZGRlbiIgdHlwZT0iYm9vbGVhbiI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvbkluZmxhdGUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhY3Rpdml0eSIgdHlwZT0iYW5kcm9pZC5hcHAuQWN0aXZpdHkiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImF0dHJzIiB0eXBlPSJhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJzYXZlZEluc3RhbmNlU3RhdGUiIHR5cGU9ImFuZHJvaWQub3MuQnVuZGxlIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uTG93TWVtb3J5IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvbk9wdGlvbnNJdGVtU2VsZWN0ZWQiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJpdGVtIiB0eXBlPSJhbmRyb2lkLnZpZXcuTWVudUl0ZW0iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25PcHRpb25zTWVudUNsb3NlZCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im1lbnUiIHR5cGU9ImFuZHJvaWQudmlldy5NZW51Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uUGF1c2UiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uUHJlcGFyZU9wdGlvbnNNZW51IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibWVudSIgdHlwZT0iYW5kcm9pZC52aWV3Lk1lbnUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25SZWFkeSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InNhdmVkSW5zdGFuY2VTdGF0ZSIgdHlwZT0iYW5kcm9pZC5vcy5CdW5kbGUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25SZXN1bWUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uU2F2ZUluc3RhbmNlU3RhdGUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJvdXRTdGF0ZSIgdHlwZT0iYW5kcm9pZC5vcy5CdW5kbGUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25TdGFydCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25TdG9wIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJyZWdpc3RlckZvckNvbnRleHRNZW51IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idmlldyIgdHlwZT0iYW5kcm9pZC52aWV3LlZpZXciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0SGFzT3B0aW9uc01lbnUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJoYXNNZW51IiB0eXBlPSJib29sZWFuIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFJldGFpbkluc3RhbmNlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icmV0YWluIiB0eXBlPSJib29sZWFuIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InN0YXJ0QWN0aXZpdHkiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJpbnRlbnQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5JbnRlbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic3RhcnRBY3Rpdml0eUZvclJlc3VsdCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImludGVudCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkludGVudCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0icmVxdWVzdENvZGUiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJ1bnJlZ2lzdGVyRm9yQ29udGV4dE1lbnUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ2aWV3IiB0eXBlPSJhbmRyb2lkLnZpZXcuVmlldyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPC9jbGFzcz4KKzxpbnRlcmZhY2UgbmFtZT0iRnJhZ21lbnRUcmFuc2FjdGlvbiIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8bWV0aG9kIG5hbWU9ImFkZCIKKyByZXR1cm49ImFuZHJvaWQuYXBwLkZyYWdtZW50VHJhbnNhY3Rpb24iCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZnJhZ21lbnQiIHR5cGU9ImFuZHJvaWQuYXBwLkZyYWdtZW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ0YWciIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iYWRkIgorIHJldHVybj0iYW5kcm9pZC5hcHAuRnJhZ21lbnRUcmFuc2FjdGlvbiIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb250YWluZXJWaWV3SWQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZnJhZ21lbnQiIHR5cGU9ImFuZHJvaWQuYXBwLkZyYWdtZW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImFkZCIKKyByZXR1cm49ImFuZHJvaWQuYXBwLkZyYWdtZW50VHJhbnNhY3Rpb24iCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29udGFpbmVyVmlld0lkIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImZyYWdtZW50IiB0eXBlPSJhbmRyb2lkLmFwcC5GcmFnbWVudCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idGFnIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImFkZFRvQmFja1N0YWNrIgorIHJldHVybj0iYW5kcm9pZC5hcHAuRnJhZ21lbnRUcmFuc2FjdGlvbiIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJuYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImNvbW1pdCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJoaWRlIgorIHJldHVybj0iYW5kcm9pZC5hcHAuRnJhZ21lbnRUcmFuc2FjdGlvbiIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJmcmFnbWVudCIgdHlwZT0iYW5kcm9pZC5hcHAuRnJhZ21lbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icmVtb3ZlIgorIHJldHVybj0iYW5kcm9pZC5hcHAuRnJhZ21lbnRUcmFuc2FjdGlvbiIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJmcmFnbWVudCIgdHlwZT0iYW5kcm9pZC5hcHAuRnJhZ21lbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icmVwbGFjZSIKKyByZXR1cm49ImFuZHJvaWQuYXBwLkZyYWdtZW50VHJhbnNhY3Rpb24iCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29udGFpbmVyVmlld0lkIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImZyYWdtZW50IiB0eXBlPSJhbmRyb2lkLmFwcC5GcmFnbWVudCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJyZXBsYWNlIgorIHJldHVybj0iYW5kcm9pZC5hcHAuRnJhZ21lbnRUcmFuc2FjdGlvbiIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb250YWluZXJWaWV3SWQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZnJhZ21lbnQiIHR5cGU9ImFuZHJvaWQuYXBwLkZyYWdtZW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ0YWciIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0Q3VzdG9tQW5pbWF0aW9ucyIKKyByZXR1cm49ImFuZHJvaWQuYXBwLkZyYWdtZW50VHJhbnNhY3Rpb24iCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZW50ZXIiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZXhpdCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFRyYW5zaXRpb24iCisgcmV0dXJuPSJhbmRyb2lkLmFwcC5GcmFnbWVudFRyYW5zYWN0aW9uIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InRyYW5zaXQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRUcmFuc2l0aW9uU3R5bGUiCisgcmV0dXJuPSJhbmRyb2lkLmFwcC5GcmFnbWVudFRyYW5zYWN0aW9uIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InN0eWxlUmVzIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2hvdyIKKyByZXR1cm49ImFuZHJvaWQuYXBwLkZyYWdtZW50VHJhbnNhY3Rpb24iCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZnJhZ21lbnQiIHR5cGU9ImFuZHJvaWQuYXBwLkZyYWdtZW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8ZmllbGQgbmFtZT0iVFJBTlNJVF9BQ1RJVklUWV9DTE9TRSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjgxOTkiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iVFJBTlNJVF9BQ1RJVklUWV9PUEVOIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iNDEwMiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJUUkFOU0lUX0VOVEVSIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iNDA5NyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJUUkFOU0lUX0VOVEVSX01BU0siCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSI0MDk2IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlRSQU5TSVRfRVhJVCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjgxOTQiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iVFJBTlNJVF9FWElUX01BU0siCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSI4MTkyIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlRSQU5TSVRfSElERSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjgxOTYiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iVFJBTlNJVF9OT05FIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJUUkFOU0lUX1BSRVZJRVdfRE9ORSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjUiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iVFJBTlNJVF9TSE9XIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iNDA5OSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJUUkFOU0lUX1RBU0tfQ0xPU0UiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSI4MjAxIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlRSQU5TSVRfVEFTS19PUEVOIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iNDEwNCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJUUkFOU0lUX1RBU0tfVE9fQkFDSyIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjgyMDMiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iVFJBTlNJVF9UQVNLX1RPX0ZST05UIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iNDEwNiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJUUkFOU0lUX1VOU0VUIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iLTEiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iVFJBTlNJVF9XQUxMUEFQRVJfQ0xPU0UiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSI4MjA0IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlRSQU5TSVRfV0FMTFBBUEVSX0lOVFJBX0NMT1NFIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iODIwNyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJUUkFOU0lUX1dBTExQQVBFUl9JTlRSQV9PUEVOIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iNDExMCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJUUkFOU0lUX1dBTExQQVBFUl9PUEVOIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iNDEwOSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzwvaW50ZXJmYWNlPgogPGNsYXNzIG5hbWU9Ikluc3RydW1lbnRhdGlvbiIKICBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTI2MTg2LDYgKzI3OTUxLDIyOCBAQAogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KIDwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iTGlzdEZyYWdtZW50IgorIGV4dGVuZHM9ImFuZHJvaWQuYXBwLkZyYWdtZW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8Y29uc3RydWN0b3IgbmFtZT0iTGlzdEZyYWdtZW50IgorIHR5cGU9ImFuZHJvaWQuYXBwLkxpc3RGcmFnbWVudCIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2NvbnN0cnVjdG9yPgorPG1ldGhvZCBuYW1lPSJnZXRMaXN0QWRhcHRlciIKKyByZXR1cm49ImFuZHJvaWQud2lkZ2V0Lkxpc3RBZGFwdGVyIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldExpc3RWaWV3IgorIHJldHVybj0iYW5kcm9pZC53aWRnZXQuTGlzdFZpZXciCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0U2VsZWN0ZWRJdGVtSWQiCisgcmV0dXJuPSJsb25nIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFNlbGVjdGVkSXRlbVBvc2l0aW9uIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uTGlzdEl0ZW1DbGljayIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImwiIHR5cGU9ImFuZHJvaWQud2lkZ2V0Lkxpc3RWaWV3Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ2IiB0eXBlPSJhbmRyb2lkLnZpZXcuVmlldyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0icG9zaXRpb24iIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iaWQiIHR5cGU9ImxvbmciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0TGlzdEFkYXB0ZXIiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhZGFwdGVyIiB0eXBlPSJhbmRyb2lkLndpZGdldC5MaXN0QWRhcHRlciI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRTZWxlY3Rpb24iCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwb3NpdGlvbiIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8L2NsYXNzPgorPGNsYXNzIG5hbWU9IkxvYWRlck1hbmFnaW5nRnJhZ21lbnQiCisgZXh0ZW5kcz0iYW5kcm9pZC5hcHAuRnJhZ21lbnQiCisgYWJzdHJhY3Q9InRydWUiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGltcGxlbWVudHMgbmFtZT0iYW5kcm9pZC5jb250ZW50LkxvYWRlci5PbkxvYWRDb21wbGV0ZUxpc3RlbmVyIj4KKzwvaW1wbGVtZW50cz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJMb2FkZXJNYW5hZ2luZ0ZyYWdtZW50IgorIHR5cGU9ImFuZHJvaWQuYXBwLkxvYWRlck1hbmFnaW5nRnJhZ21lbnQiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9jb25zdHJ1Y3Rvcj4KKzxtZXRob2QgbmFtZT0iZ2V0TG9hZGVyIgorIHJldHVybj0iYW5kcm9pZC5jb250ZW50LkxvYWRlciZsdDtEJmd0OyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iaWQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvbkNyZWF0ZUxvYWRlciIKKyByZXR1cm49ImFuZHJvaWQuY29udGVudC5Mb2FkZXImbHQ7RCZndDsiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InByb3RlY3RlZCIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iaWQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iYXJncyIgdHlwZT0iYW5kcm9pZC5vcy5CdW5kbGUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25Jbml0aWFsaXplTG9hZGVycyIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InByb3RlY3RlZCIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvbkxvYWRDb21wbGV0ZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibG9hZGVyIiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuTG9hZGVyJmx0O0QmZ3Q7Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJkYXRhIiB0eXBlPSJEIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uTG9hZEZpbmlzaGVkIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHJvdGVjdGVkIgorPgorPHBhcmFtZXRlciBuYW1lPSJsb2FkZXIiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Mb2FkZXImbHQ7RCZndDsiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImRhdGEiIHR5cGU9IkQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic3RhcnRMb2FkaW5nIgorIHJldHVybj0iYW5kcm9pZC5jb250ZW50LkxvYWRlciZsdDtEJmd0OyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InByb3RlY3RlZCIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iaWQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iYXJncyIgdHlwZT0iYW5kcm9pZC5vcy5CdW5kbGUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic3RvcExvYWRpbmciCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJpZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8L2NsYXNzPgogPGNsYXNzIG5hbWU9IkxvY2FsQWN0aXZpdHlNYW5hZ2VyIgogIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMzAxODgsNiArMzIxNzUsMTkgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iYWRtaW4iIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFBhc3N3b3JkSGlzdG9yeUxlbmd0aCIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYWRtaW4iIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldFBhc3N3b3JkTWF4aW11bUxlbmd0aCIKICByZXR1cm49ImludCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0zMDIxNCw2ICszMjIxNCw4NCBAQAogPHBhcmFtZXRlciBuYW1lPSJhZG1pbiIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWUiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0UGFzc3dvcmRNaW5pbXVtTGV0dGVycyIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYWRtaW4iIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFBhc3N3b3JkTWluaW11bUxvd2VyQ2FzZSIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYWRtaW4iIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFBhc3N3b3JkTWluaW11bU5vbkxldHRlciIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYWRtaW4iIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFBhc3N3b3JkTWluaW11bU51bWVyaWMiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImFkbWluIiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRQYXNzd29yZE1pbmltdW1TeW1ib2xzIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhZG1pbiIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0UGFzc3dvcmRNaW5pbXVtVXBwZXJDYXNlIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhZG1pbiIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZ2V0UGFzc3dvcmRRdWFsaXR5IgogIHJldHVybj0iaW50IgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTMwMzIwLDYgKzMyMzk4LDIxIEBACiA8cGFyYW1ldGVyIG5hbWU9InRpbWVNcyIgdHlwZT0ibG9uZyI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRQYXNzd29yZEhpc3RvcnlMZW5ndGgiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhZG1pbiIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWUiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Imxlbmd0aCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InNldFBhc3N3b3JkTWluaW11bUxlbmd0aCIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMzAzMzUsNiArMzI0MjgsOTYgQEAKIDxwYXJhbWV0ZXIgbmFtZT0ibGVuZ3RoIiB0eXBlPSJpbnQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0UGFzc3dvcmRNaW5pbXVtTGV0dGVycyIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImFkbWluIiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibGVuZ3RoIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0UGFzc3dvcmRNaW5pbXVtTG93ZXJDYXNlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYWRtaW4iIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJsZW5ndGgiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRQYXNzd29yZE1pbmltdW1Ob25MZXR0ZXIiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhZG1pbiIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWUiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Imxlbmd0aCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFBhc3N3b3JkTWluaW11bU51bWVyaWMiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhZG1pbiIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWUiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Imxlbmd0aCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFBhc3N3b3JkTWluaW11bVN5bWJvbHMiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhZG1pbiIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWUiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Imxlbmd0aCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFBhc3N3b3JkTWluaW11bVVwcGVyQ2FzZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImFkbWluIiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibGVuZ3RoIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2V0UGFzc3dvcmRRdWFsaXR5IgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0zMDQyOSw2ICszMjYxMiwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iUEFTU1dPUkRfUVVBTElUWV9DT01QTEVYIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMzkzMjE2IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9IlBBU1NXT1JEX1FVQUxJVFlfTlVNRVJJQyIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTM0MDIzLDYgKzM2MjE3LDcxIEBACiA8L3BhcmFtZXRlcj4KIDwvY29uc3RydWN0b3I+CiA8L2NsYXNzPgorPGNsYXNzIG5hbWU9IkFzeW5jVGFza0xvYWRlciIKKyBleHRlbmRzPSJhbmRyb2lkLmNvbnRlbnQuTG9hZGVyIgorIGFic3RyYWN0PSJ0cnVlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJBc3luY1Rhc2tMb2FkZXIiCisgdHlwZT0iYW5kcm9pZC5jb250ZW50LkFzeW5jVGFza0xvYWRlciIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbnRleHQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZXh0Ij4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxtZXRob2QgbmFtZT0iY2FuY2VsTG9hZCIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZm9yY2VMb2FkIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJsb2FkSW5CYWNrZ3JvdW5kIgorIHJldHVybj0iRCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uQ2FuY2VsbGVkIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZGF0YSIgdHlwZT0iRCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPC9jbGFzcz4KIDxjbGFzcyBuYW1lPSJCcm9hZGNhc3RSZWNlaXZlciIKICBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgogIGFic3RyYWN0PSJ0cnVlIgpAQCAtMzc2NjYsNiArMzk5MjUsMjUgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iZmFjdG9yeSIgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2UuQ3Vyc29yRmFjdG9yeSI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvcGVuT3JDcmVhdGVEYXRhYmFzZSIKKyByZXR1cm49ImFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Im1vZGUiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZmFjdG9yeSIgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2UuQ3Vyc29yRmFjdG9yeSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZXJyb3JIYW5kbGVyIiB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLkRhdGFiYXNlRXJyb3JIYW5kbGVyIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InBlZWtXYWxscGFwZXIiCiAgcmV0dXJuPSJhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlIgogIGFic3RyYWN0PSJ0cnVlIgpAQCAtMzgyODgsNiArNDA1NjYsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlNUT1JBR0VfU0VSVklDRSIKKyB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSImcXVvdDtzdG9yYWdlJnF1b3Q7IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9IlRFTEVQSE9OWV9TRVJWSUNFIgogIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTM5MDgyLDYgKzQxMzcxLDI1IEBACiA8cGFyYW1ldGVyIG5hbWU9ImZhY3RvcnkiIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlLkN1cnNvckZhY3RvcnkiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib3Blbk9yQ3JlYXRlRGF0YWJhc2UiCisgcmV0dXJuPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibW9kZSIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJmYWN0b3J5IiB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZS5DdXJzb3JGYWN0b3J5Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJlcnJvckhhbmRsZXIiIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2UuRGF0YWJhc2VFcnJvckhhbmRsZXIiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0icGVla1dhbGxwYXBlciIKICByZXR1cm49ImFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMzk0MDgsNiArNDE3MTYsMjI1IEBACiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgogPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJDdXJzb3JMb2FkZXIiCisgZXh0ZW5kcz0iYW5kcm9pZC5jb250ZW50LkFzeW5jVGFza0xvYWRlciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGNvbnN0cnVjdG9yIG5hbWU9IkN1cnNvckxvYWRlciIKKyB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ3Vyc29yTG9hZGVyIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InVyaSIgdHlwZT0iYW5kcm9pZC5uZXQuVXJpIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJwcm9qZWN0aW9uIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nW10iPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InNlbGVjdGlvbiIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ic2VsZWN0aW9uQXJncyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZ1tdIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJzb3J0T3JkZXIiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPG1ldGhvZCBuYW1lPSJkZWxpdmVyUmVzdWx0IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY3Vyc29yIiB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLkN1cnNvciI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJkZXN0cm95IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRQcm9qZWN0aW9uIgorIHJldHVybj0iamF2YS5sYW5nLlN0cmluZ1tdIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFNlbGVjdGlvbiIKKyByZXR1cm49ImphdmEubGFuZy5TdHJpbmciCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0U2VsZWN0aW9uQXJncyIKKyByZXR1cm49ImphdmEubGFuZy5TdHJpbmdbXSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRTb3J0T3JkZXIiCisgcmV0dXJuPSJqYXZhLmxhbmcuU3RyaW5nIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFVyaSIKKyByZXR1cm49ImFuZHJvaWQubmV0LlVyaSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJsb2FkSW5CYWNrZ3JvdW5kIgorIHJldHVybj0iYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25DYW5jZWxsZWQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjdXJzb3IiIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFByb2plY3Rpb24iCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwcm9qZWN0aW9uIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nW10iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0U2VsZWN0aW9uIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ic2VsZWN0aW9uIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFNlbGVjdGlvbkFyZ3MiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJzZWxlY3Rpb25BcmdzIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nW10iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0U29ydE9yZGVyIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ic29ydE9yZGVyIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFVyaSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InVyaSIgdHlwZT0iYW5kcm9pZC5uZXQuVXJpIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InN0YXJ0TG9hZGluZyIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic3RvcExvYWRpbmciCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8L2NsYXNzPgogPGludGVyZmFjZSBuYW1lPSJEaWFsb2dJbnRlcmZhY2UiCiAgYWJzdHJhY3Q9InRydWUiCiAgc3RhdGljPSJmYWxzZSIKQEAgLTQ0Mzg1LDYgKzQ2OTEyLDE3MiBAQAogPC9wYXJhbWV0ZXI+CiA8L2NvbnN0cnVjdG9yPgogPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJMb2FkZXIiCisgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8Y29uc3RydWN0b3IgbmFtZT0iTG9hZGVyIgorIHR5cGU9ImFuZHJvaWQuY29udGVudC5Mb2FkZXIiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb250ZXh0IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8bWV0aG9kIG5hbWU9ImRlbGl2ZXJSZXN1bHQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJkYXRhIiB0eXBlPSJEIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImRlc3Ryb3kiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZm9yY2VMb2FkIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldENvbnRleHQiCisgcmV0dXJuPSJhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRJZCIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJyZWdpc3Rlckxpc3RlbmVyIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iaWQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibGlzdGVuZXIiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Mb2FkZXIuT25Mb2FkQ29tcGxldGVMaXN0ZW5lciZsdDtEJmd0OyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzdGFydExvYWRpbmciCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic3RvcExvYWRpbmciCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0idW5yZWdpc3Rlckxpc3RlbmVyIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibGlzdGVuZXIiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Mb2FkZXIuT25Mb2FkQ29tcGxldGVMaXN0ZW5lciZsdDtEJmd0OyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJMb2FkZXIuRm9yY2VMb2FkQ29udGVudE9ic2VydmVyIgorIGV4dGVuZHM9ImFuZHJvaWQuZGF0YWJhc2UuQ29udGVudE9ic2VydmVyIgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJMb2FkZXIuRm9yY2VMb2FkQ29udGVudE9ic2VydmVyIgorIHR5cGU9ImFuZHJvaWQuY29udGVudC5Mb2FkZXIuRm9yY2VMb2FkQ29udGVudE9ic2VydmVyIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvY29uc3RydWN0b3I+Cis8L2NsYXNzPgorPGludGVyZmFjZSBuYW1lPSJMb2FkZXIuT25Mb2FkQ29tcGxldGVMaXN0ZW5lciIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxtZXRob2QgbmFtZT0ib25Mb2FkQ29tcGxldGUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImxvYWRlciIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkxvYWRlciZsdDtEJmd0OyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZGF0YSIgdHlwZT0iRCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPC9pbnRlcmZhY2U+CiA8Y2xhc3MgbmFtZT0iTXV0YWJsZUNvbnRleHRXcmFwcGVyIgogIGV4dGVuZHM9ImFuZHJvaWQuY29udGVudC5Db250ZXh0V3JhcHBlciIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC00NDkyNCw2ICs0NzYxNywyMSBAQAogPHBhcmFtZXRlciBuYW1lPSJkZWZWYWx1ZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRTdHJpbmdTZXQiCisgcmV0dXJuPSJqYXZhLnV0aWwuU2V0Jmx0O2phdmEubGFuZy5TdHJpbmcmZ3Q7IgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImtleSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZGVmVmFsdWVzIiB0eXBlPSJqYXZhLnV0aWwuU2V0Jmx0O2phdmEubGFuZy5TdHJpbmcmZ3Q7Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InJlZ2lzdGVyT25TaGFyZWRQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJ0cnVlIgpAQCAtNDUwNTUsNiArNDc3NjMsMjEgQEAKIDxwYXJhbWV0ZXIgbmFtZT0idmFsdWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icHV0U3RyaW5nU2V0IgorIHJldHVybj0iYW5kcm9pZC5jb250ZW50LlNoYXJlZFByZWZlcmVuY2VzLkVkaXRvciIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJrZXkiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InZhbHVlcyIgdHlwZT0iamF2YS51dGlsLlNldCZsdDtqYXZhLmxhbmcuU3RyaW5nJmd0OyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJyZW1vdmUiCiAgcmV0dXJuPSJhbmRyb2lkLmNvbnRlbnQuU2hhcmVkUHJlZmVyZW5jZXMuRWRpdG9yIgogIGFic3RyYWN0PSJ0cnVlIgpAQCAtNDU3NzIsNiArNDg0OTUsMTQ1IEBACiA+CiA8L2ZpZWxkPgogPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJYbWxEb2N1bWVudFByb3ZpZGVyIgorIGV4dGVuZHM9ImFuZHJvaWQuY29udGVudC5Db250ZW50UHJvdmlkZXIiCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJYbWxEb2N1bWVudFByb3ZpZGVyIgorIHR5cGU9ImFuZHJvaWQuY29udGVudC5YbWxEb2N1bWVudFByb3ZpZGVyIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvY29uc3RydWN0b3I+Cis8bWV0aG9kIG5hbWU9ImRlbGV0ZSIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idXJpIiB0eXBlPSJhbmRyb2lkLm5ldC5VcmkiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InNlbGVjdGlvbiIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ic2VsZWN0aW9uQXJncyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZ1tdIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFJlc291cmNlWG1sUHVsbFBhcnNlciIKKyByZXR1cm49Im9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXIiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwcm90ZWN0ZWQiCis+Cis8cGFyYW1ldGVyIG5hbWU9InJlc291cmNlVXJpIiB0eXBlPSJhbmRyb2lkLm5ldC5VcmkiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0VHlwZSIKKyByZXR1cm49ImphdmEubGFuZy5TdHJpbmciCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InVyaSIgdHlwZT0iYW5kcm9pZC5uZXQuVXJpIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFVyaVhtbFB1bGxQYXJzZXIiCisgcmV0dXJuPSJvcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHJvdGVjdGVkIgorPgorPHBhcmFtZXRlciBuYW1lPSJ1cmwiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iaW5zZXJ0IgorIHJldHVybj0iYW5kcm9pZC5uZXQuVXJpIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ1cmkiIHR5cGU9ImFuZHJvaWQubmV0LlVyaSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idmFsdWVzIiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGVudFZhbHVlcyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvbkNyZWF0ZSIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icXVlcnkiCisgcmV0dXJuPSJhbmRyb2lkLmRhdGFiYXNlLkN1cnNvciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idXJpIiB0eXBlPSJhbmRyb2lkLm5ldC5VcmkiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InByb2plY3Rpb24iIHR5cGU9ImphdmEubGFuZy5TdHJpbmdbXSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ic2VsZWN0aW9uIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJzZWxlY3Rpb25BcmdzIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nW10iPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InNvcnRPcmRlciIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJ1cGRhdGUiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InVyaSIgdHlwZT0iYW5kcm9pZC5uZXQuVXJpIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZXMiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZW50VmFsdWVzIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJzZWxlY3Rpb24iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InNlbGVjdGlvbkFyZ3MiIHR5cGU9ImphdmEubGFuZy5TdHJpbmdbXSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPC9jbGFzcz4KIDwvcGFja2FnZT4KIDxwYWNrYWdlIG5hbWU9ImFuZHJvaWQuY29udGVudC5wbSIKID4KQEAgLTQ2NDM2LDYgKzQ5Mjk4LDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJGTEFHX0hBUkRXQVJFX0FDQ0VMRVJBVEVEIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMjA5NzE1MiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJGTEFHX0hBU19DT0RFIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtNTM0OTQsNiArNTYzNjcsMTkgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iY29sdW1uIiB0eXBlPSJpbnQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0VHlwZSIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29sdW1uIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZ2V0VXBkYXRlZEZpZWxkIgogIHJldHVybj0iamF2YS5sYW5nLk9iamVjdCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC01NDUxNyw2ICs1NzQwMywxOSBAQAogPHBhcmFtZXRlciBuYW1lPSJjb2x1bW5JbmRleCIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFR5cGUiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29sdW1uSW5kZXgiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJnZXRXYW50c0FsbE9uTW92ZUNhbGxzIgogIHJldHVybj0iYm9vbGVhbiIKICBhYnN0cmFjdD0idHJ1ZSIKQEAgLTU0NzU3LDYgKzU3NjU2LDYxIEBACiA8cGFyYW1ldGVyIG5hbWU9Im9ic2VydmVyIiB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLkRhdGFTZXRPYnNlcnZlciI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPGZpZWxkIG5hbWU9IkZJRUxEX1RZUEVfQkxPQiIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjQiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iRklFTERfVFlQRV9GTE9BVCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjIiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iRklFTERfVFlQRV9JTlRFR0VSIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJGSUVMRF9UWVBFX05VTEwiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIwIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IkZJRUxEX1RZUEVfU1RSSU5HIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDwvaW50ZXJmYWNlPgogPGNsYXNzIG5hbWU9IkN1cnNvckluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24iCiAgZXh0ZW5kcz0iamF2YS5sYW5nLkluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24iCkBAIC01NTExNCw2ICs1ODA2OCwyMSBAQAogPHBhcmFtZXRlciBuYW1lPSJjb2wiIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRUeXBlIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJyb3ciIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iY29sIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iaXNCbG9iIgogIHJldHVybj0iYm9vbGVhbiIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC01NTEyMSw3ICs1ODA5MCw3IEBACiAgc3luY2hyb25pemVkPSJmYWxzZSIKICBzdGF0aWM9ImZhbHNlIgogIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDxwYXJhbWV0ZXIgbmFtZT0icm93IiB0eXBlPSJpbnQiPgpAQCAtNTUxMzYsNyArNTgxMDUsNyBAQAogIHN5bmNocm9uaXplZD0iZmFsc2UiCiAgc3RhdGljPSJmYWxzZSIKICBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8cGFyYW1ldGVyIG5hbWU9InJvdyIgdHlwZT0iaW50Ij4KQEAgLTU1MTUxLDcgKzU4MTIwLDcgQEAKICBzeW5jaHJvbml6ZWQ9ImZhbHNlIgogIHN0YXRpYz0iZmFsc2UiCiAgZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPHBhcmFtZXRlciBuYW1lPSJyb3ciIHR5cGU9ImludCI+CkBAIC01NTE2Niw3ICs1ODEzNSw3IEBACiAgc3luY2hyb25pemVkPSJmYWxzZSIKICBzdGF0aWM9ImZhbHNlIgogIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDxwYXJhbWV0ZXIgbmFtZT0icm93IiB0eXBlPSJpbnQiPgpAQCAtNTUxODEsNyArNTgxNTAsNyBAQAogIHN5bmNocm9uaXplZD0iZmFsc2UiCiAgc3RhdGljPSJmYWxzZSIKICBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8cGFyYW1ldGVyIG5hbWU9InJvdyIgdHlwZT0iaW50Ij4KQEAgLTU1NTkyLDYgKzU4NTYxLDE5IEBACiA8cGFyYW1ldGVyIG5hbWU9ImNvbHVtbkluZGV4IiB0eXBlPSJpbnQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0VHlwZSIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29sdW1uSW5kZXgiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJnZXRXYW50c0FsbE9uTW92ZUNhbGxzIgogIHJldHVybj0iYm9vbGVhbiIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC01NTYwMyw2ICs1ODU4NSwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRXcmFwcGVkQ3Vyc29yIgorIHJldHVybj0iYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iaXNBZnRlckxhc3QiCiAgcmV0dXJuPSJib29sZWFuIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTU1OTExLDYgKzU4OTA0LDI3IEBACiA+CiA8L21ldGhvZD4KIDwvY2xhc3M+Cis8aW50ZXJmYWNlIG5hbWU9IkRhdGFiYXNlRXJyb3JIYW5kbGVyIgorIGFic3RyYWN0PSJ0cnVlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxtZXRob2QgbmFtZT0ib25Db3JydXB0aW9uIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJkYk9iaiIgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2UiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzwvaW50ZXJmYWNlPgogPGNsYXNzIG5hbWU9IkRhdGFiYXNlVXRpbHMiCiAgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC01Njc5NSw2ICs1OTgwOSwzOCBAQAogPgogPC9maWVsZD4KIDwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iRGVmYXVsdERhdGFiYXNlRXJyb3JIYW5kbGVyIgorIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGltcGxlbWVudHMgbmFtZT0iYW5kcm9pZC5kYXRhYmFzZS5EYXRhYmFzZUVycm9ySGFuZGxlciI+Cis8L2ltcGxlbWVudHM+Cis8Y29uc3RydWN0b3IgbmFtZT0iRGVmYXVsdERhdGFiYXNlRXJyb3JIYW5kbGVyIgorIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2UuRGVmYXVsdERhdGFiYXNlRXJyb3JIYW5kbGVyIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvY29uc3RydWN0b3I+Cis8bWV0aG9kIG5hbWU9Im9uQ29ycnVwdGlvbiIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImRiT2JqIiB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPC9jbGFzcz4KIDxjbGFzcyBuYW1lPSJNYXRyaXhDdXJzb3IiCiAgZXh0ZW5kcz0iYW5kcm9pZC5kYXRhYmFzZS5BYnN0cmFjdEN1cnNvciIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC01NzUzOCw2ICs2MDU4NCwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJiZWdpblRyYW5zYWN0aW9uTm9uRXhjbHVzaXZlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJiZWdpblRyYW5zYWN0aW9uV2l0aExpc3RlbmVyIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC01NzU1MSw2ICs2MDYwOCwxOSBAQAogPHBhcmFtZXRlciBuYW1lPSJ0cmFuc2FjdGlvbkxpc3RlbmVyIiB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVUcmFuc2FjdGlvbkxpc3RlbmVyIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImJlZ2luVHJhbnNhY3Rpb25XaXRoTGlzdGVuZXJOb25FeGNsdXNpdmUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ0cmFuc2FjdGlvbkxpc3RlbmVyIiB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVUcmFuc2FjdGlvbkxpc3RlbmVyIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImNsb3NlIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC01NzYwNyw2ICs2MDY3NywxNyBAQAogPHBhcmFtZXRlciBuYW1lPSJ3aGVyZUFyZ3MiIHR5cGU9ImphdmEubGFuZy5TdHJpbmdbXSI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJlbmFibGVXcml0ZUFoZWFkTG9nZ2luZyIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJ0cnVlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJlbmRUcmFuc2FjdGlvbiIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtNTc2NjMsNiArNjA3NDQsMTcgQEAKIDxwYXJhbWV0ZXIgbmFtZT0idGFibGVzIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldEF0dGFjaGVkRGJzIgorIHJldHVybj0iamF2YS51dGlsLkFycmF5TGlzdCZsdDthbmRyb2lkLnV0aWwuUGFpciZsdDtqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nJmd0OyZndDsiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZ2V0TWF4aW11bVNpemUiCiAgcmV0dXJuPSJsb25nIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTU3Nzg0LDYgKzYwODc2LDE3IEBACiA8cGFyYW1ldGVyIG5hbWU9ImNvbmZsaWN0QWxnb3JpdGhtIiB0eXBlPSJpbnQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iaXNEYXRhYmFzZUludGVncml0eU9rIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJpc0RiTG9ja2VkQnlDdXJyZW50VGhyZWFkIgogIHJldHVybj0iYm9vbGVhbiIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC01NzkwMSw2ICs2MTAwNCwyNSBAQAogPHBhcmFtZXRlciBuYW1lPSJmbGFncyIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9wZW5EYXRhYmFzZSIKKyByZXR1cm49ImFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InBhdGgiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImZhY3RvcnkiIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlLkN1cnNvckZhY3RvcnkiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImZsYWdzIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImVycm9ySGFuZGxlciIgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5EYXRhYmFzZUVycm9ySGFuZGxlciI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJvcGVuT3JDcmVhdGVEYXRhYmFzZSIKICByZXR1cm49ImFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTU3OTMxLDYgKzYxMDUzLDIzIEBACiA8cGFyYW1ldGVyIG5hbWU9ImZhY3RvcnkiIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlLkN1cnNvckZhY3RvcnkiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib3Blbk9yQ3JlYXRlRGF0YWJhc2UiCisgcmV0dXJuPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwYXRoIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJmYWN0b3J5IiB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZS5DdXJzb3JGYWN0b3J5Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJlcnJvckhhbmRsZXIiIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2UuRGF0YWJhc2VFcnJvckhhbmRsZXIiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0icXVlcnkiCiAgcmV0dXJuPSJhbmRyb2lkLmRhdGFiYXNlLkN1cnNvciIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC01ODEyNCw2ICs2MTI2MywxOSBAQAogPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2UuU1FMRXhjZXB0aW9uIj4KIDwvZXhjZXB0aW9uPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldENvbm5lY3Rpb25Qb29sU2l6ZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJ0cnVlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ic2l6ZSIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InNldExvY2FsZSIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtNTgxNTAsNiArNjEzMDIsMTkgQEAKIDxwYXJhbWV0ZXIgbmFtZT0ibG9ja2luZ0VuYWJsZWQiIHR5cGU9ImJvb2xlYW4iPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0TWF4U3FsQ2FjaGVTaXplIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9InRydWUiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjYWNoZVNpemUiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzZXRNYXhpbXVtU2l6ZSIKICByZXR1cm49ImxvbmciCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtNTgzNTIsNiArNjE1MTcsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9Ik1BWF9TUUxfQ0FDSEVfU0laRSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjEwMCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJOT19MT0NBTElaRURfQ09MTEFUT1JTIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtNTg2MTAsNiArNjE3ODYsMjQgQEAKIDxwYXJhbWV0ZXIgbmFtZT0idmVyc2lvbiIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgogPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTUUxpdGVPcGVuSGVscGVyIgorIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZU9wZW5IZWxwZXIiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb250ZXh0IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZmFjdG9yeSIgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2UuQ3Vyc29yRmFjdG9yeSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idmVyc2lvbiIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJlcnJvckhhbmRsZXIiIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2UuRGF0YWJhc2VFcnJvckhhbmRsZXIiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgogPG1ldGhvZCBuYW1lPSJjbG9zZSIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtNjI0ODksNyArNjU2ODMsNyBAQAogIHR5cGU9ImFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzIgogIHN0YXRpYz0iZmFsc2UiCiAgZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPHBhcmFtZXRlciBuYW1lPSJnbCIgdHlwZT0iamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3Mub3BlbmdsZXMuR0wiPgpAQCAtNjMyNjgsNyArNjY0NjIsNyBAQAogPG1ldGhvZCBuYW1lPSJkcmF3VGV4dCIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgogIHN5bmNocm9uaXplZD0iZmFsc2UiCiAgc3RhdGljPSJmYWxzZSIKICBmaW5hbD0iZmFsc2UiCkBAIC02MzQxOCw3ICs2NjYxMiw3IEBACiAgc3luY2hyb25pemVkPSJmYWxzZSIKICBzdGF0aWM9InRydWUiCiAgZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+CkBAIC02MzQ3NSw3ICs2NjY2OSw3IEBACiAgc3luY2hyb25pemVkPSJmYWxzZSIKICBzdGF0aWM9ImZhbHNlIgogIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgpAQCAtNjM1MzYsNiArNjY3MzAsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iaXNIYXJkd2FyZUFjY2VsZXJhdGVkIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJpc09wYXF1ZSIKICByZXR1cm49ImJvb2xlYW4iCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtNjM4NDksNyArNjcwNTQsNyBAQAogIHN5bmNocm9uaXplZD0iZmFsc2UiCiAgc3RhdGljPSJmYWxzZSIKICBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8cGFyYW1ldGVyIG5hbWU9IndpZHRoIiB0eXBlPSJpbnQiPgpAQCAtNzMyMTAsNiArNzY0MTUsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iY29tcHV0ZUNvbnN0YW50U2l6ZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwcm90ZWN0ZWQiCis+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZ2V0Q2hhbmdpbmdDb25maWd1cmF0aW9ucyIKICByZXR1cm49ImludCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC03NDEwNCw2ICs3NzMyMCwzNiBAQAogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KIDwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iTWlwbWFwRHJhd2FibGUiCisgZXh0ZW5kcz0iYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZUNvbnRhaW5lciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGNvbnN0cnVjdG9yIG5hbWU9Ik1pcG1hcERyYXdhYmxlIgorIHR5cGU9ImFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuTWlwbWFwRHJhd2FibGUiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9jb25zdHJ1Y3Rvcj4KKzxtZXRob2QgbmFtZT0iYWRkRHJhd2FibGUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJkcmF3YWJsZSIgdHlwZT0iYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPC9jbGFzcz4KIDxjbGFzcyBuYW1lPSJOaW5lUGF0Y2hEcmF3YWJsZSIKICBleHRlbmRzPSJhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTEyNTU2Myw2ICsxMjg4MDksMjQwIEBACiA8L21ldGhvZD4KIDwvY2xhc3M+CiA8L3BhY2thZ2U+Cis8cGFja2FnZSBuYW1lPSJhbmRyb2lkLm9zLnN0b3JhZ2UiCis+Cis8Y2xhc3MgbmFtZT0iU3RvcmFnZUV2ZW50TGlzdGVuZXIiCisgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8Y29uc3RydWN0b3IgbmFtZT0iU3RvcmFnZUV2ZW50TGlzdGVuZXIiCisgdHlwZT0iYW5kcm9pZC5vcy5zdG9yYWdlLlN0b3JhZ2VFdmVudExpc3RlbmVyIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvY29uc3RydWN0b3I+Cis8bWV0aG9kIG5hbWU9Im9uU3RvcmFnZVN0YXRlQ2hhbmdlZCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InBhdGgiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Im9sZFN0YXRlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJuZXdTdGF0ZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvblVzYk1hc3NTdG9yYWdlQ29ubmVjdGlvbkNoYW5nZWQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb25uZWN0ZWQiIHR5cGU9ImJvb2xlYW4iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iU3RvcmFnZU1hbmFnZXIiCisgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPG1ldGhvZCBuYW1lPSJkaXNhYmxlVXNiTWFzc1N0b3JhZ2UiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImVuYWJsZVVzYk1hc3NTdG9yYWdlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJpc1VzYk1hc3NTdG9yYWdlQ29ubmVjdGVkIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJpc1VzYk1hc3NTdG9yYWdlRW5hYmxlZCIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icmVnaXN0ZXJMaXN0ZW5lciIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Imxpc3RlbmVyIiB0eXBlPSJhbmRyb2lkLm9zLnN0b3JhZ2UuU3RvcmFnZUV2ZW50TGlzdGVuZXIiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0idW5yZWdpc3Rlckxpc3RlbmVyIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibGlzdGVuZXIiIHR5cGU9ImFuZHJvaWQub3Muc3RvcmFnZS5TdG9yYWdlRXZlbnRMaXN0ZW5lciI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJTdG9yYWdlUmVzdWx0Q29kZSIKKyBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8Y29uc3RydWN0b3IgbmFtZT0iU3RvcmFnZVJlc3VsdENvZGUiCisgdHlwZT0iYW5kcm9pZC5vcy5zdG9yYWdlLlN0b3JhZ2VSZXN1bHRDb2RlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvY29uc3RydWN0b3I+Cis8ZmllbGQgbmFtZT0iT3BlcmF0aW9uRmFpbGVkSW50ZXJuYWxFcnJvciIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9Ii0xIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9Ik9wZXJhdGlvbkZhaWxlZE1lZGlhQmxhbmsiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSItMyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJPcGVyYXRpb25GYWlsZWRNZWRpYUNvcnJ1cHQiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSItNCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJPcGVyYXRpb25GYWlsZWROb01lZGlhIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iLTIiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iT3BlcmF0aW9uRmFpbGVkU3RvcmFnZUJ1c3kiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSItNyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJPcGVyYXRpb25GYWlsZWRTdG9yYWdlTW91bnRlZCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9Ii02IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9Ik9wZXJhdGlvbkZhaWxlZFN0b3JhZ2VOb3RNb3VudGVkIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iLTUiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iT3BlcmF0aW9uU3VjY2VlZGVkIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzwvY2xhc3M+Cis8L3BhY2thZ2U+CiA8cGFja2FnZSBuYW1lPSJhbmRyb2lkLnByZWZlcmVuY2UiCiA+CiA8Y2xhc3MgbmFtZT0iQ2hlY2tCb3hQcmVmZXJlbmNlIgpAQCAtMTI2MzU2LDYgKzEyOTgzNiwxNDggQEAKIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+CiA8L2NsYXNzPgorPGNsYXNzIG5hbWU9Ik11bHRpU2VsZWN0TGlzdFByZWZlcmVuY2UiCisgZXh0ZW5kcz0iYW5kcm9pZC5wcmVmZXJlbmNlLkRpYWxvZ1ByZWZlcmVuY2UiCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJNdWx0aVNlbGVjdExpc3RQcmVmZXJlbmNlIgorIHR5cGU9ImFuZHJvaWQucHJlZmVyZW5jZS5NdWx0aVNlbGVjdExpc3RQcmVmZXJlbmNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImF0dHJzIiB0eXBlPSJhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0Ij4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJNdWx0aVNlbGVjdExpc3RQcmVmZXJlbmNlIgorIHR5cGU9ImFuZHJvaWQucHJlZmVyZW5jZS5NdWx0aVNlbGVjdExpc3RQcmVmZXJlbmNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPG1ldGhvZCBuYW1lPSJmaW5kSW5kZXhPZlZhbHVlIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRFbnRyaWVzIgorIHJldHVybj0iamF2YS5sYW5nLkNoYXJTZXF1ZW5jZVtdIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldEVudHJ5VmFsdWVzIgorIHJldHVybj0iamF2YS5sYW5nLkNoYXJTZXF1ZW5jZVtdIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFZhbHVlcyIKKyByZXR1cm49ImphdmEudXRpbC5TZXQmbHQ7amF2YS5sYW5nLlN0cmluZyZndDsiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0RW50cmllcyIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImVudHJpZXMiIHR5cGU9ImphdmEubGFuZy5DaGFyU2VxdWVuY2VbXSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRFbnRyaWVzIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZW50cmllc1Jlc0lkIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0RW50cnlWYWx1ZXMiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJlbnRyeVZhbHVlcyIgdHlwZT0iamF2YS5sYW5nLkNoYXJTZXF1ZW5jZVtdIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldEVudHJ5VmFsdWVzIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZW50cnlWYWx1ZXNSZXNJZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFZhbHVlcyIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InZhbHVlcyIgdHlwZT0iamF2YS51dGlsLlNldCZsdDtqYXZhLmxhbmcuU3RyaW5nJmd0OyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPC9jbGFzcz4KIDxjbGFzcyBuYW1lPSJQcmVmZXJlbmNlIgogIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTM0NzI2LDYgKzEzODM0OCwxNyBAQAogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InByb3RlY3RlZCIKID4KKzxmaWVsZCBuYW1lPSJBVVRPX0FERCIKKyB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSImcXVvdDthdXRvX2FkZCZxdW90OyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJERUxFVEVEIgogIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTEzNDczNyw2ICsxMzgzNzAsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IkZBVk9SSVRFUyIKKyB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSImcXVvdDtmYXZvcml0ZXMmcXVvdDsiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0iR1JPVVBfVklTSUJMRSIKICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC0xNDQ3NjIsNyArMTQ4NDA2LDcgQEAKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+Ci08cGFyYW1ldGVyIG5hbWU9InRleHQiIHR5cGU9ImFuZHJvaWQudGV4dC5FZGl0YWJsZSI+Cis8cGFyYW1ldGVyIG5hbWU9InMiIHR5cGU9ImFuZHJvaWQudGV4dC5FZGl0YWJsZSI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJiZWZvcmVUZXh0Q2hhbmdlZCIKQEAgLTE1MjUxMyw2ICsxNTYxNTcsMjUgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iZmFjdG9yeSIgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2UuQ3Vyc29yRmFjdG9yeSI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvcGVuT3JDcmVhdGVEYXRhYmFzZSIKKyByZXR1cm49ImFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJmaWxlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJtb2RlIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImZhY3RvcnkiIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlLkN1cnNvckZhY3RvcnkiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImVycm9ySGFuZGxlciIgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5EYXRhYmFzZUVycm9ySGFuZGxlciI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJwZWVrV2FsbHBhcGVyIgogIHJldHVybj0iYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZSIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xNTI4NTcsMTcgKzE1NjUyMCw2IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9jb25zdHJ1Y3Rvcj4KLTxtZXRob2QgbmFtZT0iYWJvcnRVcGRhdGVzIgotIHJldHVybj0idm9pZCIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJjbG9zZSIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTUyODc5LDMwICsxNTY1MzEsNiBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJjb21taXRVcGRhdGVzIgotIHJldHVybj0iYm9vbGVhbiIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJjb21taXRVcGRhdGVzIgotIHJldHVybj0iYm9vbGVhbiIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0idmFsdWVzIiB0eXBlPSJqYXZhLnV0aWwuTWFwJmx0Oz8gZXh0ZW5kcyBqYXZhLmxhbmcuTG9uZywgPyBleHRlbmRzIGphdmEudXRpbC5NYXAmbHQ7amF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLk9iamVjdCZndDsmZ3Q7Ij4KLTwvcGFyYW1ldGVyPgotPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImNvcHlTdHJpbmdUb0J1ZmZlciIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTUyOTI5LDE3ICsxNTY1NTcsNiBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJkZWxldGVSb3ciCi0gcmV0dXJuPSJib29sZWFuIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldEJsb2IiCiAgcmV0dXJuPSJieXRlW10iCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTUzMTI1LDggKzE1Njc0Miw4IEBACiA8cGFyYW1ldGVyIG5hbWU9ImNvbHVtbkluZGV4IiB0eXBlPSJpbnQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KLTxtZXRob2QgbmFtZT0iZ2V0V2FudHNBbGxPbk1vdmVDYWxscyIKLSByZXR1cm49ImJvb2xlYW4iCis8bWV0aG9kIG5hbWU9ImdldFR5cGUiCisgcmV0dXJuPSJpbnQiCiAgYWJzdHJhY3Q9ImZhbHNlIgogIG5hdGl2ZT0iZmFsc2UiCiAgc3luY2hyb25pemVkPSJmYWxzZSIKQEAgLTE1MzEzNSw4ICsxNTY3NTIsMTAgQEAKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbHVtbkluZGV4IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KLTxtZXRob2QgbmFtZT0iaGFzVXBkYXRlcyIKKzxtZXRob2QgbmFtZT0iZ2V0V2FudHNBbGxPbk1vdmVDYWxscyIKICByZXR1cm49ImJvb2xlYW4iCiAgYWJzdHJhY3Q9ImZhbHNlIgogIG5hdGl2ZT0iZmFsc2UiCkBAIC0xNTMzNTAsMTcgKzE1Njk2OSw2IEBACiA8cGFyYW1ldGVyIG5hbWU9InVyaSIgdHlwZT0iYW5kcm9pZC5uZXQuVXJpIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9InN1cHBvcnRzVXBkYXRlcyIKLSByZXR1cm49ImJvb2xlYW4iCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L21ldGhvZD4KIDxtZXRob2QgbmFtZT0idW5yZWdpc3RlckNvbnRlbnRPYnNlcnZlciIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTUzMzg3LDEyNCArMTU2OTk1LDYgQEAKIDxwYXJhbWV0ZXIgbmFtZT0ib2JzZXJ2ZXIiIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2UuRGF0YVNldE9ic2VydmVyIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9InVwZGF0ZUJsb2IiCi0gcmV0dXJuPSJib29sZWFuIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPHBhcmFtZXRlciBuYW1lPSJjb2x1bW5JbmRleCIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZSIgdHlwZT0iYnl0ZVtdIj4KLTwvcGFyYW1ldGVyPgotPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9InVwZGF0ZURvdWJsZSIKLSByZXR1cm49ImJvb2xlYW4iCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08cGFyYW1ldGVyIG5hbWU9ImNvbHVtbkluZGV4IiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9InZhbHVlIiB0eXBlPSJkb3VibGUiPgotPC9wYXJhbWV0ZXI+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0idXBkYXRlRmxvYXQiCi0gcmV0dXJuPSJib29sZWFuIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPHBhcmFtZXRlciBuYW1lPSJjb2x1bW5JbmRleCIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZSIgdHlwZT0iZmxvYXQiPgotPC9wYXJhbWV0ZXI+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0idXBkYXRlSW50IgotIHJldHVybj0iYm9vbGVhbiIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0iY29sdW1uSW5kZXgiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0idmFsdWUiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJ1cGRhdGVMb25nIgotIHJldHVybj0iYm9vbGVhbiIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0iY29sdW1uSW5kZXgiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0idmFsdWUiIHR5cGU9ImxvbmciPgotPC9wYXJhbWV0ZXI+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0idXBkYXRlU2hvcnQiCi0gcmV0dXJuPSJib29sZWFuIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPHBhcmFtZXRlciBuYW1lPSJjb2x1bW5JbmRleCIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZSIgdHlwZT0ic2hvcnQiPgotPC9wYXJhbWV0ZXI+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0idXBkYXRlU3RyaW5nIgotIHJldHVybj0iYm9vbGVhbiIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0iY29sdW1uSW5kZXgiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0idmFsdWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgotPC9wYXJhbWV0ZXI+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0idXBkYXRlVG9OdWxsIgotIHJldHVybj0iYm9vbGVhbiIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0iY29sdW1uSW5kZXgiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTwvbWV0aG9kPgogPC9jbGFzcz4KIDxjbGFzcyBuYW1lPSJNb2NrRGlhbG9nSW50ZXJmYWNlIgogIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCkBAIC0xNTg0ODAsNiArMTYxOTcwLDI5IEBACiA8cGFyYW1ldGVyIG5hbWU9ImtpbmQiIHR5cGU9ImphdmEubGFuZy5DbGFzcyZsdDtUJmd0OyI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRUZXh0UnVuQ3Vyc29yIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb250ZXh0U3RhcnQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dEVuZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJmbGFncyIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJvZmZzZXQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iY3Vyc29yT3B0IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InAiIHR5cGU9ImFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iaW5zZXJ0IgogIHJldHVybj0iYW5kcm9pZC50ZXh0LlNwYW5uYWJsZVN0cmluZ0J1aWxkZXIiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTU5NTQwLDcgKzE2MzA1Myw3IEBACiA+CiA8cGFyYW1ldGVyIG5hbWU9InRleHQiIHR5cGU9ImphdmEubGFuZy5DaGFyU2VxdWVuY2UiPgogPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9InAiIHR5cGU9ImFuZHJvaWQudGV4dC5UZXh0UGFpbnQiPgorPHBhcmFtZXRlciBuYW1lPSJwYWludCIgdHlwZT0iYW5kcm9pZC50ZXh0LlRleHRQYWludCI+CiA8L3BhcmFtZXRlcj4KIDxwYXJhbWV0ZXIgbmFtZT0iYXZhaWwiIHR5cGU9ImZsb2F0Ij4KIDwvcGFyYW1ldGVyPgpAQCAtMTY5ODI5LDcgKzE3MzM0Miw3IEBACiAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKICB0cmFuc2llbnQ9ImZhbHNlIgogIHZvbGF0aWxlPSJmYWxzZSIKLSB2YWx1ZT0iJnF1b3Q7KChhZXJvfGFycGF8YXNpYXxhW2NkZWZnaWxtbm9xcnN0dXd4el0pfChiaXp8YlthYmRlZmdoaWptbm9yc3R2d3l6XSl8KGNhdHxjb218Y29vcHxjW2FjZGZnaGlrbG1ub3J1dnh5el0pfGRbZWprbW96XXwoZWR1fGVbY2VncnN0dV0pfGZbaWprbW9yXXwoZ292fGdbYWJkZWZnaGlsbW5wcXJzdHV3eV0pfGhba21ucnR1XXwoaW5mb3xpbnR8aVtkZWxtbm9xcnN0XSl8KGpvYnN8altlbW9wXSl8a1tlZ2hpbW5wcnd5el18bFthYmNpa3JzdHV2eV18KG1pbHxtb2JpfG11c2V1bXxtW2FjZGVnaGtsbW5vcHFyc3R1dnd4eXpdKXwobmFtZXxuZXR8blthY2VmZ2lsb3BydXpdKXwob3JnfG9tKXwocHJvfHBbYWVmZ2hrbG1ucnN0d3ldKXxxYXxyW2Vvc3V3XXxzW2FiY2RlZ2hpamtsbW5vcnR1dnl6XXwodGVsfHRyYXZlbHx0W2NkZmdoamtsbW5vcHJ0dnd6XSl8dVthZ2tzeXpdfHZbYWNlZ2ludV18d1tmc118KHhuXFwtXFwtMHp3bTU2ZHx4blxcLVxcLTExYjViczNhOWFqNmd8eG5cXC1cXC04MGFraGJ5a25qNGZ8eG5cXC1cXC05dDRiMTF5aTVhfHhuXFwtXFwtZGViYTBhZHx4blxcLVxcLWc2dzI1MWR8eG5cXC1cXC1oZ2JrNmFqN2Y1M2JiYXx4blxcLVxcLWhsY2o2YXlhOWVzYzdhfHhuXFwtXFwtanhhbHBkbHB8eG5cXC1cXC1rZ2JlY2h0dnx4blxcLVxcLXpja3phaCl8eVtldHVdfHpbYW13XSkmcXVvdDsiCisgdmFsdWU9IiZxdW90OygoYWVyb3xhcnBhfGFzaWF8YVtjZGVmZ2lsbW5vcXJzdHV3eHpdKXwoYml6fGJbYWJkZWZnaGlqbW5vcnN0dnd5el0pfChjYXR8Y29tfGNvb3B8Y1thY2RmZ2hpa2xtbm9ydXZ4eXpdKXxkW2Vqa21vel18KGVkdXxlW2NlZ3JzdHVdKXxmW2lqa21vcl18KGdvdnxnW2FiZGVmZ2hpbG1ucHFyc3R1d3ldKXxoW2ttbnJ0dV18KGluZm98aW50fGlbZGVsbW5vcXJzdF0pfChqb2JzfGpbZW1vcF0pfGtbZWdoaW1ucHJ3eXpdfGxbYWJjaWtyc3R1dnldfChtaWx8bW9iaXxtdXNldW18bVthY2RlZ2hrbG1ub3BxcnN0dXZ3eHl6XSl8KG5hbWV8bmV0fG5bYWNlZmdpbG9wcnV6XSl8KG9yZ3xvbSl8KHByb3xwW2FlZmdoa2xtbnJzdHd5XSl8cWF8cltlb3N1d118c1thYmNkZWdoaWprbG1ub3J0dXZ5el18KHRlbHx0cmF2ZWx8dFtjZGZnaGprbG1ub3BydHZ3el0pfHVbYWdrc3l6XXx2W2FjZWdpbnVdfHdbZnNdfCh4blxcLVxcLTB6d201NmR8eG5cXC1cXC0xMWI1YnMzYTlhajZnfHhuXFwtXFwtODBha2hieWtuajRmfHhuXFwtXFwtOXQ0YjExeWk1YXx4blxcLVxcLWRlYmEwYWR8eG5cXC1cXC1nNncyNTFkfHhuXFwtXFwtaGdiazZhajdmNTNiYmF8eG5cXC1cXC1obGNqNmF5YTllc2M3YXx4blxcLVxcLWp4YWxwZGxwfHhuXFwtXFwta2diZWNodHZ8eG5cXC1cXC1tZ2JhYW03YThofHhuXFwtXFwtbWdiZXJwNGE1ZDRhcnx4blxcLVxcLXdnYmgxY3x4blxcLVxcLXpja3phaCl8eVtldF18elthbXddKSZxdW90OyIKICBzdGF0aWM9InRydWUiCiAgZmluYWw9InRydWUiCiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCkBAIC0xNjk4NDAsNyArMTczMzUzLDcgQEAKICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgogIHRyYW5zaWVudD0iZmFsc2UiCiAgdm9sYXRpbGU9ImZhbHNlIgotIHZhbHVlPSImcXVvdDsoPzooPzphZXJvfGFycGF8YXNpYXxhW2NkZWZnaWxtbm9xcnN0dXd4el0pfCg/OmJpenxiW2FiZGVmZ2hpam1ub3JzdHZ3eXpdKXwoPzpjYXR8Y29tfGNvb3B8Y1thY2RmZ2hpa2xtbm9ydXZ4eXpdKXxkW2Vqa21vel18KD86ZWR1fGVbY2VncnN0dV0pfGZbaWprbW9yXXwoPzpnb3Z8Z1thYmRlZmdoaWxtbnBxcnN0dXd5XSl8aFtrbW5ydHVdfCg/OmluZm98aW50fGlbZGVsbW5vcXJzdF0pfCg/OmpvYnN8altlbW9wXSl8a1tlZ2hpbW5wcnd5el18bFthYmNpa3JzdHV2eV18KD86bWlsfG1vYml8bXVzZXVtfG1bYWNkZWdoa2xtbm9wcXJzdHV2d3h5el0pfCg/Om5hbWV8bmV0fG5bYWNlZmdpbG9wcnV6XSl8KD86b3JnfG9tKXwoPzpwcm98cFthZWZnaGtsbW5yc3R3eV0pfHFhfHJbZW9zdXddfHNbYWJjZGVnaGlqa2xtbm9ydHV2eXpdfCg/OnRlbHx0cmF2ZWx8dFtjZGZnaGprbG1ub3BydHZ3el0pfHVbYWdrc3l6XXx2W2FjZWdpbnVdfHdbZnNdfCg/OnhuXFwtXFwtMHp3bTU2ZHx4blxcLVxcLTExYjViczNhOWFqNmd8eG5cXC1cXC04MGFraGJ5a25qNGZ8eG5cXC1cXC05dDRiMTF5aTVhfHhuXFwtXFwtZGViYTBhZHx4blxcLVxcLWc2dzI1MWR8eG5cXC1cXC1oZ2JrNmFqN2Y1M2JiYXx4blxcLVxcLWhsY2o2YXlhOWVzYzdhfHhuXFwtXFwtanhhbHBkbHB8eG5cXC1cXC1rZ2JlY2h0dnx4blxcLVxcLXpja3phaCl8eVtldHVdfHpbYW13XSkpJnF1b3Q7IgorIHZhbHVlPSImcXVvdDsoPzooPzphZXJvfGFycGF8YXNpYXxhW2NkZWZnaWxtbm9xcnN0dXd4el0pfCg/OmJpenxiW2FiZGVmZ2hpam1ub3JzdHZ3eXpdKXwoPzpjYXR8Y29tfGNvb3B8Y1thY2RmZ2hpa2xtbm9ydXZ4eXpdKXxkW2Vqa21vel18KD86ZWR1fGVbY2VncnN0dV0pfGZbaWprbW9yXXwoPzpnb3Z8Z1thYmRlZmdoaWxtbnBxcnN0dXd5XSl8aFtrbW5ydHVdfCg/OmluZm98aW50fGlbZGVsbW5vcXJzdF0pfCg/OmpvYnN8altlbW9wXSl8a1tlZ2hpbW5wcnd5el18bFthYmNpa3JzdHV2eV18KD86bWlsfG1vYml8bXVzZXVtfG1bYWNkZWdoa2xtbm9wcXJzdHV2d3h5el0pfCg/Om5hbWV8bmV0fG5bYWNlZmdpbG9wcnV6XSl8KD86b3JnfG9tKXwoPzpwcm98cFthZWZnaGtsbW5yc3R3eV0pfHFhfHJbZW9zdXddfHNbYWJjZGVnaGlqa2xtbm9ydHV2eXpdfCg/OnRlbHx0cmF2ZWx8dFtjZGZnaGprbG1ub3BydHZ3el0pfHVbYWdrc3l6XXx2W2FjZWdpbnVdfHdbZnNdfCg/OnhuXFwtXFwtMHp3bTU2ZHx4blxcLVxcLTExYjViczNhOWFqNmd8eG5cXC1cXC04MGFraGJ5a25qNGZ8eG5cXC1cXC05dDRiMTF5aTVhfHhuXFwtXFwtZGViYTBhZHx4blxcLVxcLWc2dzI1MWR8eG5cXC1cXC1oZ2JrNmFqN2Y1M2JiYXx4blxcLVxcLWhsY2o2YXlhOWVzYzdhfHhuXFwtXFwtanhhbHBkbHB8eG5cXC1cXC1rZ2JlY2h0dnx4blxcLVxcLW1nYmFhbTdhOGh8eG5cXC1cXC1tZ2JlcnA0YTVkNGFyfHhuXFwtXFwtd2diaDFjfHhuXFwtXFwtemNremFoKXx5W2V0XXx6W2Ftd10pKSZxdW90OyIKICBzdGF0aWM9InRydWUiCiAgZmluYWw9InRydWUiCiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCkBAIC0xODEwMDksNiArMTg0NTIyLDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImlzU2F2ZUZyb21QYXJlbnRFbmFibGVkIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJpc1Njcm9sbGJhckZhZGluZ0VuYWJsZWQiCiAgcmV0dXJuPSJib29sZWFuIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE4MjQ4Nyw2ICsxODYwMTEsMTkgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iZW5hYmxlZCIgdHlwZT0iYm9vbGVhbiI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRTYXZlRnJvbVBhcmVudEVuYWJsZWQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJlbmFibGVkIiB0eXBlPSJib29sZWFuIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InNldFNjcm9sbEJhclN0eWxlIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xODY4MTIsNiArMTkwMzQ5LDE5IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Imhhc0ZlYXR1cmUiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJmZWF0dXJlIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iaGFzU29mdElucHV0TW9kZSIKICByZXR1cm49ImJvb2xlYW4iCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTg2ODIzLDYgKzE5MDM3MywxOSBAQAogIHZpc2liaWxpdHk9InByb3RlY3RlZCIKID4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJpbnZhbGlkYXRlUGFuZWxNZW51IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJmZWF0dXJlSWQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJpc0FjdGl2ZSIKICByZXR1cm49ImJvb2xlYW4iCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTg3NDg4LDYgKzE5MTA1MSwxNyBAQAogIHZpc2liaWxpdHk9InByb3RlY3RlZCIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iRkVBVFVSRV9BQ1RJT05fQkFSIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iOSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJGRUFUVVJFX0NPTlRFWFRfTUVOVSIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTE5MDI0NCw2ICsxOTM4MTgsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0U2NhbGVGYWN0b3IiCisgcmV0dXJuPSJmbG9hdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InByb3RlY3RlZCIKKz4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJnZXRTdGFydE9mZnNldCIKICByZXR1cm49ImxvbmciCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTkwMjgxLDYgKzE5Mzg2NiwyMyBAQAogPHBhcmFtZXRlciBuYW1lPSJvdXRUcmFuc2Zvcm1hdGlvbiIgdHlwZT0iYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5UcmFuc2Zvcm1hdGlvbiI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRUcmFuc2Zvcm1hdGlvbiIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImN1cnJlbnRUaW1lIiB0eXBlPSJsb25nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJvdXRUcmFuc2Zvcm1hdGlvbiIgdHlwZT0iYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5UcmFuc2Zvcm1hdGlvbiI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ic2NhbGUiIHR5cGU9ImZsb2F0Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldFpBZGp1c3RtZW50IgogIHJldHVybj0iaW50IgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE5NzU2MCw2ICsyMDExNjIsMTcgQEAKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+Cis8bWV0aG9kIG5hbWU9ImVuYWJsZVNtb290aFRyYW5zaXRpb24iCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldEFsbG93RmlsZUFjY2VzcyIKICByZXR1cm49ImJvb2xlYW4iCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTk4MTc1LDYgKzIwMTc4OCwxOSBAQAogPHBhcmFtZXRlciBuYW1lPSJmbGFnIiB0eXBlPSJib29sZWFuIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldEVuYWJsZVNtb290aFRyYW5zaXRpb24iCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJlbmFibGUiIHR5cGU9ImJvb2xlYW4iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2V0RmFudGFzeUZvbnRGYW1pbHkiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE5OTE1Nyw2ICsyMDI3ODMsMjggQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iY2FuWm9vbUluIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJjYW5ab29tT3V0IgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJjYXB0dXJlUGljdHVyZSIKICByZXR1cm49ImFuZHJvaWQuZ3JhcGhpY3MuUGljdHVyZSIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yMDI3NDYsNiArMjA2Mzk0LDE5NSBAQAogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KIDwvaW50ZXJmYWNlPgorPGNsYXNzIG5hbWU9IkFkYXB0ZXJzIgorIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJBZGFwdGVycyIKKyB0eXBlPSJhbmRyb2lkLndpZGdldC5BZGFwdGVycyIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2NvbnN0cnVjdG9yPgorPG1ldGhvZCBuYW1lPSJsb2FkQWRhcHRlciIKKyByZXR1cm49ImFuZHJvaWQud2lkZ2V0LkJhc2VBZGFwdGVyIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbnRleHQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZXh0Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJpZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJwYXJhbWV0ZXJzIiB0eXBlPSJqYXZhLmxhbmcuT2JqZWN0Li4uIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImxvYWRDdXJzb3JBZGFwdGVyIgorIHJldHVybj0iYW5kcm9pZC53aWRnZXQuQ3Vyc29yQWRhcHRlciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb250ZXh0IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iaWQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idXJpIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJwYXJhbWV0ZXJzIiB0eXBlPSJqYXZhLmxhbmcuT2JqZWN0Li4uIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImxvYWRDdXJzb3JBZGFwdGVyIgorIHJldHVybj0iYW5kcm9pZC53aWRnZXQuQ3Vyc29yQWRhcHRlciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb250ZXh0IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iaWQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iY3Vyc29yIiB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLkN1cnNvciI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0icGFyYW1ldGVycyIgdHlwZT0iamF2YS5sYW5nLk9iamVjdC4uLiI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJBZGFwdGVycy5DdXJzb3JCaW5kZXIiCisgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJBZGFwdGVycy5DdXJzb3JCaW5kZXIiCisgdHlwZT0iYW5kcm9pZC53aWRnZXQuQWRhcHRlcnMuQ3Vyc29yQmluZGVyIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InRyYW5zZm9ybWF0aW9uIiB0eXBlPSJhbmRyb2lkLndpZGdldC5BZGFwdGVycy5DdXJzb3JUcmFuc2Zvcm1hdGlvbiI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8bWV0aG9kIG5hbWU9ImJpbmQiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InZpZXciIHR5cGU9ImFuZHJvaWQudmlldy5WaWV3Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJjdXJzb3IiIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJjb2x1bW5JbmRleCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8ZmllbGQgbmFtZT0ibUNvbnRleHQiCisgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwcm90ZWN0ZWQiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9Im1UcmFuc2Zvcm1hdGlvbiIKKyB0eXBlPSJhbmRyb2lkLndpZGdldC5BZGFwdGVycy5DdXJzb3JUcmFuc2Zvcm1hdGlvbiIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InByb3RlY3RlZCIKKz4KKzwvZmllbGQ+Cis8L2NsYXNzPgorPGNsYXNzIG5hbWU9IkFkYXB0ZXJzLkN1cnNvclRyYW5zZm9ybWF0aW9uIgorIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCisgYWJzdHJhY3Q9InRydWUiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8Y29uc3RydWN0b3IgbmFtZT0iQWRhcHRlcnMuQ3Vyc29yVHJhbnNmb3JtYXRpb24iCisgdHlwZT0iYW5kcm9pZC53aWRnZXQuQWRhcHRlcnMuQ3Vyc29yVHJhbnNmb3JtYXRpb24iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb250ZXh0IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8bWV0aG9kIG5hbWU9InRyYW5zZm9ybSIKKyByZXR1cm49ImphdmEubGFuZy5TdHJpbmciCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY3Vyc29yIiB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLkN1cnNvciI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iY29sdW1uSW5kZXgiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJ0cmFuc2Zvcm1Ub1Jlc291cmNlIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjdXJzb3IiIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJjb2x1bW5JbmRleCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8ZmllbGQgbmFtZT0ibUNvbnRleHQiCisgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwcm90ZWN0ZWQiCis+Cis8L2ZpZWxkPgorPC9jbGFzcz4KIDxjbGFzcyBuYW1lPSJBbHBoYWJldEluZGV4ZXIiCiAgZXh0ZW5kcz0iYW5kcm9pZC5kYXRhYmFzZS5EYXRhU2V0T2JzZXJ2ZXIiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjA0NzMzLDYgKzIwODU3MCwyMCBAQAogPHBhcmFtZXRlciBuYW1lPSJhdXRvUmVxdWVyeSIgdHlwZT0iYm9vbGVhbiI+CiA8L3BhcmFtZXRlcj4KIDwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iQ3Vyc29yQWRhcHRlciIKKyB0eXBlPSJhbmRyb2lkLndpZGdldC5DdXJzb3JBZGFwdGVyIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImMiIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJmbGFncyIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KIDxtZXRob2QgbmFtZT0iYmluZFZpZXciCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJ0cnVlIgpAQCAtMjA0ODgwLDYgKzIwODczMSwyMyBAQAogPHBhcmFtZXRlciBuYW1lPSJhdXRvUmVxdWVyeSIgdHlwZT0iYm9vbGVhbiI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJpbml0IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InByb3RlY3RlZCIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImMiIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJmbGFncyIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9Im5ld0Ryb3BEb3duVmlldyIKICByZXR1cm49ImFuZHJvaWQudmlldy5WaWV3IgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTIwNDk1MSw2ICsyMDg4MTksMjggQEAKIDxwYXJhbWV0ZXIgbmFtZT0iZmlsdGVyUXVlcnlQcm92aWRlciIgdHlwZT0iYW5kcm9pZC53aWRnZXQuRmlsdGVyUXVlcnlQcm92aWRlciI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPGZpZWxkIG5hbWU9IkZMQUdfQVVUT19SRVFVRVJZIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJGTEFHX1JFR0lTVEVSX0NPTlRFTlRfT0JTRVJWRVIiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIyIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPC9jbGFzcz4KIDxjbGFzcyBuYW1lPSJDdXJzb3JUcmVlQWRhcHRlciIKICBleHRlbmRzPSJhbmRyb2lkLndpZGdldC5CYXNlRXhwYW5kYWJsZUxpc3RBZGFwdGVyIgpAQCAtMjA3MzkwLDYgKzIxMTI4MCwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXROdW1Db2x1bW5zIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldFN0cmV0Y2hNb2RlIgogIHJldHVybj0iaW50IgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTIwODU3Niw2ICsyMTI0NzcsMjAgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iYXR0cnMiIHR5cGU9ImFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQiPgogPC9wYXJhbWV0ZXI+CiA8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IkxpbmVhckxheW91dCIKKyB0eXBlPSJhbmRyb2lkLndpZGdldC5MaW5lYXJMYXlvdXQiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb250ZXh0IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iYXR0cnMiIHR5cGU9ImFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImRlZlN0eWxlIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgogPG1ldGhvZCBuYW1lPSJnZXRCYXNlbGluZUFsaWduZWRDaGlsZEluZGV4IgogIHJldHVybj0iaW50IgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTIwODYyMCw2ICsyMTI1MzUsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iaXNNZWFzdXJlV2l0aExhcmdlc3RDaGlsZEVuYWJsZWQiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9Im9uTGF5b3V0IgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yMDg2OTMsNiArMjEyNjE5LDE5IEBACiA8cGFyYW1ldGVyIG5hbWU9Imhvcml6b250YWxHcmF2aXR5IiB0eXBlPSJpbnQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0TWVhc3VyZVdpdGhMYXJnZXN0Q2hpbGRFbmFibGVkIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZW5hYmxlZCIgdHlwZT0iYm9vbGVhbiI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzZXRPcmllbnRhdGlvbiIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjA4ODg5LDYgKzIxMjgyOCw2NjUgQEAKIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+CiA8L2ludGVyZmFjZT4KKzxjbGFzcyBuYW1lPSJMaXN0UG9wdXBXaW5kb3ciCisgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGNvbnN0cnVjdG9yIG5hbWU9Ikxpc3RQb3B1cFdpbmRvdyIKKyB0eXBlPSJhbmRyb2lkLndpZGdldC5MaXN0UG9wdXBXaW5kb3ciCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb250ZXh0IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iTGlzdFBvcHVwV2luZG93IgorIHR5cGU9ImFuZHJvaWQud2lkZ2V0Lkxpc3RQb3B1cFdpbmRvdyIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbnRleHQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZXh0Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJhdHRycyIgdHlwZT0iYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldCI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iTGlzdFBvcHVwV2luZG93IgorIHR5cGU9ImFuZHJvaWQud2lkZ2V0Lkxpc3RQb3B1cFdpbmRvdyIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbnRleHQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZXh0Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJhdHRycyIgdHlwZT0iYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZGVmU3R5bGVBdHRyIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9Ikxpc3RQb3B1cFdpbmRvdyIKKyB0eXBlPSJhbmRyb2lkLndpZGdldC5MaXN0UG9wdXBXaW5kb3ciCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb250ZXh0IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iYXR0cnMiIHR5cGU9ImFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImRlZlN0eWxlQXR0ciIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJkZWZTdHlsZVJlcyIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxtZXRob2QgbmFtZT0iY2xlYXJMaXN0U2VsZWN0aW9uIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJkaXNtaXNzIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRBbmNob3JWaWV3IgorIHJldHVybj0iYW5kcm9pZC52aWV3LlZpZXciCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0QW5pbWF0aW9uU3R5bGUiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0QmFja2dyb3VuZCIKKyByZXR1cm49ImFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0SGVpZ2h0IgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldEhvcml6b250YWxPZmZzZXQiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0SW5wdXRNZXRob2RNb2RlIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldExpc3RWaWV3IgorIHJldHVybj0iYW5kcm9pZC53aWRnZXQuTGlzdFZpZXciCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0UHJvbXB0UG9zaXRpb24iCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0U2VsZWN0ZWRJdGVtIgorIHJldHVybj0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRTZWxlY3RlZEl0ZW1JZCIKKyByZXR1cm49ImxvbmciCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0U2VsZWN0ZWRJdGVtUG9zaXRpb24iCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0U2VsZWN0ZWRWaWV3IgorIHJldHVybj0iYW5kcm9pZC52aWV3LlZpZXciCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0U29mdElucHV0TW9kZSIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRWZXJ0aWNhbE9mZnNldCIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRXaWR0aCIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJpc0lucHV0TWV0aG9kTm90TmVlZGVkIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJpc01vZGFsIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJpc1Nob3dpbmciCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uS2V5RG93biIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImtleUNvZGUiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZXZlbnQiIHR5cGU9ImFuZHJvaWQudmlldy5LZXlFdmVudCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvbktleVByZUltZSIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImtleUNvZGUiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZXZlbnQiIHR5cGU9ImFuZHJvaWQudmlldy5LZXlFdmVudCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvbktleVVwIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ia2V5Q29kZSIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJldmVudCIgdHlwZT0iYW5kcm9pZC52aWV3LktleUV2ZW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InBlcmZvcm1JdGVtQ2xpY2siCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwb3NpdGlvbiIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InBvc3RTaG93IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRBZGFwdGVyIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYWRhcHRlciIgdHlwZT0iYW5kcm9pZC53aWRnZXQuTGlzdEFkYXB0ZXIiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0QW5jaG9yVmlldyIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImFuY2hvciIgdHlwZT0iYW5kcm9pZC52aWV3LlZpZXciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0QW5pbWF0aW9uU3R5bGUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhbmltYXRpb25TdHlsZSIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldEJhY2tncm91bmREcmF3YWJsZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImQiIHR5cGU9ImFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0SGVpZ2h0IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iaGVpZ2h0IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0SG9yaXpvbnRhbE9mZnNldCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im9mZnNldCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldElucHV0TWV0aG9kTW9kZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im1vZGUiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRMaXN0U2VsZWN0b3IiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJzZWxlY3RvciIgdHlwZT0iYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRNb2RhbCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im1vZGFsIiB0eXBlPSJib29sZWFuIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldE9uSXRlbUNsaWNrTGlzdGVuZXIiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjbGlja0xpc3RlbmVyIiB0eXBlPSJhbmRyb2lkLndpZGdldC5BZGFwdGVyVmlldy5Pbkl0ZW1DbGlja0xpc3RlbmVyIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldE9uSXRlbVNlbGVjdGVkTGlzdGVuZXIiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJzZWxlY3RlZExpc3RlbmVyIiB0eXBlPSJhbmRyb2lkLndpZGdldC5BZGFwdGVyVmlldy5Pbkl0ZW1TZWxlY3RlZExpc3RlbmVyIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFByb21wdFBvc2l0aW9uIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icG9zaXRpb24iIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRQcm9tcHRWaWV3IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icHJvbXB0IiB0eXBlPSJhbmRyb2lkLnZpZXcuVmlldyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRTZWxlY3Rpb24iCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwb3NpdGlvbiIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFNvZnRJbnB1dE1vZGUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJtb2RlIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0VmVydGljYWxPZmZzZXQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJvZmZzZXQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRXaWR0aCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9IndpZHRoIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2hvdyIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxmaWVsZCBuYW1lPSJJTlBVVF9NRVRIT0RfRlJPTV9GT0NVU0FCTEUiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIwIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IklOUFVUX01FVEhPRF9ORUVERUQiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IklOUFVUX01FVEhPRF9OT1RfTkVFREVEIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJNQVRDSF9QQVJFTlQiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSItMSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJQT1NJVElPTl9QUk9NUFRfQUJPVkUiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIwIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlBPU0lUSU9OX1BST01QVF9CRUxPVyIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjEiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iV1JBUF9DT05URU5UIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iLTIiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8L2NsYXNzPgogPGNsYXNzIG5hbWU9Ikxpc3RWaWV3IgogIGV4dGVuZHM9ImFuZHJvaWQud2lkZ2V0LkFic0xpc3RWaWV3IgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTIwOTkyOSw2ICsyMTQ1MjcsMjIgQEAKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbnRleHQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZXh0Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJhdHRycyIgdHlwZT0iYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZGVmU3R5bGVBdHRyIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImRlZlN0eWxlUmVzIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IlBvcHVwV2luZG93IgorIHR5cGU9ImFuZHJvaWQud2lkZ2V0LlBvcHVwV2luZG93IgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KIDwvY29uc3RydWN0b3I+CiA8Y29uc3RydWN0b3IgbmFtZT0iUG9wdXBXaW5kb3ciCiAgdHlwZT0iYW5kcm9pZC53aWRnZXQuUG9wdXBXaW5kb3ciCkBAIC0yMTA5NTgsNiArMjE1NTcyLDE3IEBACiA8cGFyYW1ldGVyIG5hbWU9ImV4Y2x1ZGVNaW1lcyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZ1tdIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldEltYWdlVG9EZWZhdWx0IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzZXRNb2RlIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yMTQ1MDQsNiArMjE5MTI5LDI4IEBACiA8cGFyYW1ldGVyIG5hbWU9InByb21wdElkIiB0eXBlPSJpbnQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxmaWVsZCBuYW1lPSJNT0RFX0RJQUxPRyIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjAiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iTU9ERV9EUk9QRE9XTiIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjEiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8L2NsYXNzPgogPGludGVyZmFjZSBuYW1lPSJTcGlubmVyQWRhcHRlciIKICBhYnN0cmFjdD0idHJ1ZSIKQEAgLTIyMDMzMyw2ICsyMjQ5ODAsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9Ik9QX0lHRVRfV0lERV9WT0xBVElMRSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjIzMiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJPUF9JTlNUQU5DRV9PRiIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTIyMDY4NSw2ICsyMjUzNDMsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9Ik9QX0lQVVRfV0lERV9WT0xBVElMRSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjIzMyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJPUF9MT05HX1RPX0RPVUJMRSIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTIyMTQyMiw2ICsyMjYwOTEsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9Ik9QX1NHRVRfV0lERV9WT0xBVElMRSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjIzNCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJPUF9TSExfSU5UIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMjIxNjIwLDYgKzIyNjMwMCwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iT1BfU1BVVF9XSURFX1ZPTEFUSUxFIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMjM1IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9Ik9QX1NVQl9ET1VCTEUiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC0yMjE4NTUsMzMgKzIyNjU0Niw2IEBACiA8L3BhY2thZ2U+CiA8cGFja2FnZSBuYW1lPSJkYWx2aWsuc3lzdGVtIgogPgotPGNsYXNzIG5hbWU9IkFsbG9jYXRpb25MaW1pdEVycm9yIgotIGV4dGVuZHM9ImphdmEubGFuZy5WaXJ0dWFsTWFjaGluZUVycm9yIgotIGFic3RyYWN0PSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxjb25zdHJ1Y3RvciBuYW1lPSJBbGxvY2F0aW9uTGltaXRFcnJvciIKLSB0eXBlPSJkYWx2aWsuc3lzdGVtLkFsbG9jYXRpb25MaW1pdEVycm9yIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvY29uc3RydWN0b3I+Ci08Y29uc3RydWN0b3IgbmFtZT0iQWxsb2NhdGlvbkxpbWl0RXJyb3IiCi0gdHlwZT0iZGFsdmlrLnN5c3RlbS5BbGxvY2F0aW9uTGltaXRFcnJvciIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08cGFyYW1ldGVyIG5hbWU9ImRldGFpbE1lc3NhZ2UiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgotPC9wYXJhbWV0ZXI+Ci08L2NvbnN0cnVjdG9yPgotPC9jbGFzcz4KIDxjbGFzcyBuYW1lPSJEZXhDbGFzc0xvYWRlciIKICBleHRlbmRzPSJqYXZhLmxhbmcuQ2xhc3NMb2FkZXIiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjIyMDc0LDEwMTAgKzIyNjczOCw2IEBACiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgogPC9jbGFzcz4KLTxjbGFzcyBuYW1lPSJQb3RlbnRpYWxEZWFkbG9ja0Vycm9yIgotIGV4dGVuZHM9ImphdmEubGFuZy5WaXJ0dWFsTWFjaGluZUVycm9yIgotIGFic3RyYWN0PSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxjb25zdHJ1Y3RvciBuYW1lPSJQb3RlbnRpYWxEZWFkbG9ja0Vycm9yIgotIHR5cGU9ImRhbHZpay5zeXN0ZW0uUG90ZW50aWFsRGVhZGxvY2tFcnJvciIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L2NvbnN0cnVjdG9yPgotPGNvbnN0cnVjdG9yIG5hbWU9IlBvdGVudGlhbERlYWRsb2NrRXJyb3IiCi0gdHlwZT0iZGFsdmlrLnN5c3RlbS5Qb3RlbnRpYWxEZWFkbG9ja0Vycm9yIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0iZGV0YWlsTWVzc2FnZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Ci08L3BhcmFtZXRlcj4KLTwvY29uc3RydWN0b3I+Ci08L2NsYXNzPgotPGNsYXNzIG5hbWU9IlN0YWxlRGV4Q2FjaGVFcnJvciIKLSBleHRlbmRzPSJqYXZhLmxhbmcuVmlydHVhbE1hY2hpbmVFcnJvciIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08Y29uc3RydWN0b3IgbmFtZT0iU3RhbGVEZXhDYWNoZUVycm9yIgotIHR5cGU9ImRhbHZpay5zeXN0ZW0uU3RhbGVEZXhDYWNoZUVycm9yIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvY29uc3RydWN0b3I+Ci08Y29uc3RydWN0b3IgbmFtZT0iU3RhbGVEZXhDYWNoZUVycm9yIgotIHR5cGU9ImRhbHZpay5zeXN0ZW0uU3RhbGVEZXhDYWNoZUVycm9yIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0iZGV0YWlsTWVzc2FnZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Ci08L3BhcmFtZXRlcj4KLTwvY29uc3RydWN0b3I+Ci08L2NsYXNzPgotPGNsYXNzIG5hbWU9IlRlbXBvcmFyeURpcmVjdG9yeSIKLSBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgotIGFic3RyYWN0PSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxjb25zdHJ1Y3RvciBuYW1lPSJUZW1wb3JhcnlEaXJlY3RvcnkiCi0gdHlwZT0iZGFsdmlrLnN5c3RlbS5UZW1wb3JhcnlEaXJlY3RvcnkiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9jb25zdHJ1Y3Rvcj4KLTxtZXRob2QgbmFtZT0ic2V0VXBEaXJlY3RvcnkiCi0gcmV0dXJuPSJ2b2lkIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJ0cnVlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08cGFyYW1ldGVyIG5hbWU9ImJhc2VEaXIiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgotPC9wYXJhbWV0ZXI+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0ic2V0VXBEaXJlY3RvcnkiCi0gcmV0dXJuPSJ2b2lkIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0idHJ1ZSIKLSBzdGF0aWM9InRydWUiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0iYmFzZURpciIgdHlwZT0iamF2YS5pby5GaWxlIj4KLTwvcGFyYW1ldGVyPgotPC9tZXRob2Q+Ci08L2NsYXNzPgotPGNsYXNzIG5hbWU9IlRvdWNoRGV4IgotIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCi0gYWJzdHJhY3Q9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPGNvbnN0cnVjdG9yIG5hbWU9IlRvdWNoRGV4IgotIHR5cGU9ImRhbHZpay5zeXN0ZW0uVG91Y2hEZXgiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9jb25zdHJ1Y3Rvcj4KLTxtZXRob2QgbmFtZT0ibWFpbiIKLSByZXR1cm49InZvaWQiCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9InRydWUiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0iYXJncyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZ1tdIj4KLTwvcGFyYW1ldGVyPgotPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9InN0YXJ0IgotIHJldHVybj0iaW50IgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJ0cnVlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08cGFyYW1ldGVyIG5hbWU9ImRleEZpbGVzIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KLTwvcGFyYW1ldGVyPgotPC9tZXRob2Q+Ci08L2NsYXNzPgotPGNsYXNzIG5hbWU9IlZNRGVidWciCi0gZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0idHJ1ZSIKLSBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxtZXRob2QgbmFtZT0iZHVtcEhwcm9mRGF0YSIKLSByZXR1cm49InZvaWQiCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0idHJ1ZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0idHJ1ZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPHBhcmFtZXRlciBuYW1lPSJmaWxlTmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Ci08L3BhcmFtZXRlcj4KLTxleGNlcHRpb24gbmFtZT0iSU9FeGNlcHRpb24iIHR5cGU9ImphdmEuaW8uSU9FeGNlcHRpb24iPgotPC9leGNlcHRpb24+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0iZ2V0QWxsb2NDb3VudCIKLSByZXR1cm49ImludCIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJ0cnVlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJ0cnVlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08cGFyYW1ldGVyIG5hbWU9ImtpbmQiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJnZXRJbnN0cnVjdGlvbkNvdW50IgotIHJldHVybj0idm9pZCIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJ0cnVlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJ0cnVlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08cGFyYW1ldGVyIG5hbWU9ImNvdW50cyIgdHlwZT0iaW50W10iPgotPC9wYXJhbWV0ZXI+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0iZ2V0TG9hZGVkQ2xhc3NDb3VudCIKLSByZXR1cm49ImludCIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJ0cnVlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJ0cnVlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0iaXNEZWJ1Z2dlckNvbm5lY3RlZCIKLSByZXR1cm49ImJvb2xlYW4iCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0idHJ1ZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0idHJ1ZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9ImlzRGVidWdnaW5nRW5hYmxlZCIKLSByZXR1cm49ImJvb2xlYW4iCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0idHJ1ZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0idHJ1ZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9Imxhc3REZWJ1Z2dlckFjdGl2aXR5IgotIHJldHVybj0ibG9uZyIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJ0cnVlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJ0cnVlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0icHJpbnRMb2FkZWRDbGFzc2VzIgotIHJldHVybj0idm9pZCIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJ0cnVlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJ0cnVlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08cGFyYW1ldGVyIG5hbWU9ImZsYWdzIiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0icmVzZXRBbGxvY0NvdW50IgotIHJldHVybj0idm9pZCIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJ0cnVlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJ0cnVlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08cGFyYW1ldGVyIG5hbWU9ImtpbmRzIiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0icmVzZXRJbnN0cnVjdGlvbkNvdW50IgotIHJldHVybj0idm9pZCIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJ0cnVlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJ0cnVlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0ic2V0QWxsb2NhdGlvbkxpbWl0IgotIHJldHVybj0iaW50IgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9InRydWUiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9InRydWUiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0ibGltaXQiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJzZXRHbG9iYWxBbGxvY2F0aW9uTGltaXQiCi0gcmV0dXJuPSJpbnQiCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0idHJ1ZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0idHJ1ZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPHBhcmFtZXRlciBuYW1lPSJsaW1pdCIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9InN0YXJ0QWxsb2NDb3VudGluZyIKLSByZXR1cm49InZvaWQiCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0idHJ1ZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0idHJ1ZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9InN0YXJ0RW11bGF0b3JUcmFjaW5nIgotIHJldHVybj0idm9pZCIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJ0cnVlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJ0cnVlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0ic3RhcnRJbnN0cnVjdGlvbkNvdW50aW5nIgotIHJldHVybj0idm9pZCIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJ0cnVlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJ0cnVlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0ic3RhcnRNZXRob2RUcmFjaW5nIgotIHJldHVybj0idm9pZCIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0idHJ1ZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0ic3RhcnRNZXRob2RUcmFjaW5nIgotIHJldHVybj0idm9pZCIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0idHJ1ZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPHBhcmFtZXRlciBuYW1lPSJ0cmFjZUZpbGVOYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJidWZmZXJTaXplIiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9ImZsYWdzIiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0ic3RvcEFsbG9jQ291bnRpbmciCi0gcmV0dXJuPSJ2b2lkIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9InRydWUiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9InRydWUiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJzdG9wRW11bGF0b3JUcmFjaW5nIgotIHJldHVybj0idm9pZCIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJ0cnVlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJ0cnVlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0ic3RvcEluc3RydWN0aW9uQ291bnRpbmciCi0gcmV0dXJuPSJ2b2lkIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9InRydWUiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9InRydWUiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJzdG9wTWV0aG9kVHJhY2luZyIKLSByZXR1cm49InZvaWQiCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0idHJ1ZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0idHJ1ZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9InRocmVhZENwdVRpbWVOYW5vcyIKLSByZXR1cm49ImxvbmciCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0idHJ1ZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0idHJ1ZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9tZXRob2Q+Ci08ZmllbGQgbmFtZT0iREVGQVVMVF9NRVRIT0RfVFJBQ0VfRklMRV9OQU1FIgotIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gdHJhbnNpZW50PSJmYWxzZSIKLSB2b2xhdGlsZT0iZmFsc2UiCi0gdmFsdWU9IiZxdW90Oy9zZGNhcmQvZG10cmFjZS50cmFjZSZxdW90OyIKLSBzdGF0aWM9InRydWUiCi0gZmluYWw9InRydWUiCi0gZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L2ZpZWxkPgotPGZpZWxkIG5hbWU9IktJTkRfQUxMX0NPVU5UUyIKLSB0eXBlPSJpbnQiCi0gdHJhbnNpZW50PSJmYWxzZSIKLSB2b2xhdGlsZT0iZmFsc2UiCi0gdmFsdWU9Ii0xIgotIHN0YXRpYz0idHJ1ZSIKLSBmaW5hbD0idHJ1ZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L2ZpZWxkPgotPGZpZWxkIG5hbWU9IktJTkRfR0xPQkFMX0FMTE9DQVRFRF9CWVRFUyIKLSB0eXBlPSJpbnQiCi0gdHJhbnNpZW50PSJmYWxzZSIKLSB2b2xhdGlsZT0iZmFsc2UiCi0gdmFsdWU9IjIiCi0gc3RhdGljPSJ0cnVlIgotIGZpbmFsPSJ0cnVlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvZmllbGQ+Ci08ZmllbGQgbmFtZT0iS0lORF9HTE9CQUxfQUxMT0NBVEVEX09CSkVDVFMiCi0gdHlwZT0iaW50IgotIHRyYW5zaWVudD0iZmFsc2UiCi0gdm9sYXRpbGU9ImZhbHNlIgotIHZhbHVlPSIxIgotIHN0YXRpYz0idHJ1ZSIKLSBmaW5hbD0idHJ1ZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L2ZpZWxkPgotPGZpZWxkIG5hbWU9IktJTkRfR0xPQkFMX0NMQVNTX0lOSVRfQ09VTlQiCi0gdHlwZT0iaW50IgotIHRyYW5zaWVudD0iZmFsc2UiCi0gdm9sYXRpbGU9ImZhbHNlIgotIHZhbHVlPSIzMiIKLSBzdGF0aWM9InRydWUiCi0gZmluYWw9InRydWUiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9maWVsZD4KLTxmaWVsZCBuYW1lPSJLSU5EX0dMT0JBTF9DTEFTU19JTklUX1RJTUUiCi0gdHlwZT0iaW50IgotIHRyYW5zaWVudD0iZmFsc2UiCi0gdm9sYXRpbGU9ImZhbHNlIgotIHZhbHVlPSI2NCIKLSBzdGF0aWM9InRydWUiCi0gZmluYWw9InRydWUiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9maWVsZD4KLTxmaWVsZCBuYW1lPSJLSU5EX0dMT0JBTF9FWFRfQUxMT0NBVEVEX0JZVEVTIgotIHR5cGU9ImludCIKLSB0cmFuc2llbnQ9ImZhbHNlIgotIHZvbGF0aWxlPSJmYWxzZSIKLSB2YWx1ZT0iODE5MiIKLSBzdGF0aWM9InRydWUiCi0gZmluYWw9InRydWUiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9maWVsZD4KLTxmaWVsZCBuYW1lPSJLSU5EX0dMT0JBTF9FWFRfQUxMT0NBVEVEX09CSkVDVFMiCi0gdHlwZT0iaW50IgotIHRyYW5zaWVudD0iZmFsc2UiCi0gdm9sYXRpbGU9ImZhbHNlIgotIHZhbHVlPSI0MDk2IgotIHN0YXRpYz0idHJ1ZSIKLSBmaW5hbD0idHJ1ZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L2ZpZWxkPgotPGZpZWxkIG5hbWU9IktJTkRfR0xPQkFMX0VYVF9GUkVFRF9CWVRFUyIKLSB0eXBlPSJpbnQiCi0gdHJhbnNpZW50PSJmYWxzZSIKLSB2b2xhdGlsZT0iZmFsc2UiCi0gdmFsdWU9IjMyNzY4IgotIHN0YXRpYz0idHJ1ZSIKLSBmaW5hbD0idHJ1ZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L2ZpZWxkPgotPGZpZWxkIG5hbWU9IktJTkRfR0xPQkFMX0VYVF9GUkVFRF9PQkpFQ1RTIgotIHR5cGU9ImludCIKLSB0cmFuc2llbnQ9ImZhbHNlIgotIHZvbGF0aWxlPSJmYWxzZSIKLSB2YWx1ZT0iMTYzODQiCi0gc3RhdGljPSJ0cnVlIgotIGZpbmFsPSJ0cnVlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvZmllbGQ+Ci08ZmllbGQgbmFtZT0iS0lORF9HTE9CQUxfRlJFRURfQllURVMiCi0gdHlwZT0iaW50IgotIHRyYW5zaWVudD0iZmFsc2UiCi0gdm9sYXRpbGU9ImZhbHNlIgotIHZhbHVlPSI4IgotIHN0YXRpYz0idHJ1ZSIKLSBmaW5hbD0idHJ1ZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L2ZpZWxkPgotPGZpZWxkIG5hbWU9IktJTkRfR0xPQkFMX0ZSRUVEX09CSkVDVFMiCi0gdHlwZT0iaW50IgotIHRyYW5zaWVudD0iZmFsc2UiCi0gdm9sYXRpbGU9ImZhbHNlIgotIHZhbHVlPSI0IgotIHN0YXRpYz0idHJ1ZSIKLSBmaW5hbD0idHJ1ZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L2ZpZWxkPgotPGZpZWxkIG5hbWU9IktJTkRfR0xPQkFMX0dDX0lOVk9DQVRJT05TIgotIHR5cGU9ImludCIKLSB0cmFuc2llbnQ9ImZhbHNlIgotIHZvbGF0aWxlPSJmYWxzZSIKLSB2YWx1ZT0iMTYiCi0gc3RhdGljPSJ0cnVlIgotIGZpbmFsPSJ0cnVlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvZmllbGQ+Ci08ZmllbGQgbmFtZT0iS0lORF9USFJFQURfQUxMT0NBVEVEX0JZVEVTIgotIHR5cGU9ImludCIKLSB0cmFuc2llbnQ9ImZhbHNlIgotIHZvbGF0aWxlPSJmYWxzZSIKLSB2YWx1ZT0iMTMxMDcyIgotIHN0YXRpYz0idHJ1ZSIKLSBmaW5hbD0idHJ1ZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L2ZpZWxkPgotPGZpZWxkIG5hbWU9IktJTkRfVEhSRUFEX0FMTE9DQVRFRF9PQkpFQ1RTIgotIHR5cGU9ImludCIKLSB0cmFuc2llbnQ9ImZhbHNlIgotIHZvbGF0aWxlPSJmYWxzZSIKLSB2YWx1ZT0iNjU1MzYiCi0gc3RhdGljPSJ0cnVlIgotIGZpbmFsPSJ0cnVlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvZmllbGQ+Ci08ZmllbGQgbmFtZT0iS0lORF9USFJFQURfQ0xBU1NfSU5JVF9DT1VOVCIKLSB0eXBlPSJpbnQiCi0gdHJhbnNpZW50PSJmYWxzZSIKLSB2b2xhdGlsZT0iZmFsc2UiCi0gdmFsdWU9IjIwOTcxNTIiCi0gc3RhdGljPSJ0cnVlIgotIGZpbmFsPSJ0cnVlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvZmllbGQ+Ci08ZmllbGQgbmFtZT0iS0lORF9USFJFQURfQ0xBU1NfSU5JVF9USU1FIgotIHR5cGU9ImludCIKLSB0cmFuc2llbnQ9ImZhbHNlIgotIHZvbGF0aWxlPSJmYWxzZSIKLSB2YWx1ZT0iNDE5NDMwNCIKLSBzdGF0aWM9InRydWUiCi0gZmluYWw9InRydWUiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9maWVsZD4KLTxmaWVsZCBuYW1lPSJLSU5EX1RIUkVBRF9FWFRfQUxMT0NBVEVEX0JZVEVTIgotIHR5cGU9ImludCIKLSB0cmFuc2llbnQ9ImZhbHNlIgotIHZvbGF0aWxlPSJmYWxzZSIKLSB2YWx1ZT0iNTM2ODcwOTEyIgotIHN0YXRpYz0idHJ1ZSIKLSBmaW5hbD0idHJ1ZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L2ZpZWxkPgotPGZpZWxkIG5hbWU9IktJTkRfVEhSRUFEX0VYVF9BTExPQ0FURURfT0JKRUNUUyIKLSB0eXBlPSJpbnQiCi0gdHJhbnNpZW50PSJmYWxzZSIKLSB2b2xhdGlsZT0iZmFsc2UiCi0gdmFsdWU9IjI2ODQzNTQ1NiIKLSBzdGF0aWM9InRydWUiCi0gZmluYWw9InRydWUiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9maWVsZD4KLTxmaWVsZCBuYW1lPSJLSU5EX1RIUkVBRF9FWFRfRlJFRURfQllURVMiCi0gdHlwZT0iaW50IgotIHRyYW5zaWVudD0iZmFsc2UiCi0gdm9sYXRpbGU9ImZhbHNlIgotIHZhbHVlPSItMjE0NzQ4MzY0OCIKLSBzdGF0aWM9InRydWUiCi0gZmluYWw9InRydWUiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9maWVsZD4KLTxmaWVsZCBuYW1lPSJLSU5EX1RIUkVBRF9FWFRfRlJFRURfT0JKRUNUUyIKLSB0eXBlPSJpbnQiCi0gdHJhbnNpZW50PSJmYWxzZSIKLSB2b2xhdGlsZT0iZmFsc2UiCi0gdmFsdWU9IjEwNzM3NDE4MjQiCi0gc3RhdGljPSJ0cnVlIgotIGZpbmFsPSJ0cnVlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvZmllbGQ+Ci08ZmllbGQgbmFtZT0iS0lORF9USFJFQURfRlJFRURfQllURVMiCi0gdHlwZT0iaW50IgotIHRyYW5zaWVudD0iZmFsc2UiCi0gdm9sYXRpbGU9ImZhbHNlIgotIHZhbHVlPSI1MjQyODgiCi0gc3RhdGljPSJ0cnVlIgotIGZpbmFsPSJ0cnVlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvZmllbGQ+Ci08ZmllbGQgbmFtZT0iS0lORF9USFJFQURfRlJFRURfT0JKRUNUUyIKLSB0eXBlPSJpbnQiCi0gdHJhbnNpZW50PSJmYWxzZSIKLSB2b2xhdGlsZT0iZmFsc2UiCi0gdmFsdWU9IjI2MjE0NCIKLSBzdGF0aWM9InRydWUiCi0gZmluYWw9InRydWUiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9maWVsZD4KLTxmaWVsZCBuYW1lPSJLSU5EX1RIUkVBRF9HQ19JTlZPQ0FUSU9OUyIKLSB0eXBlPSJpbnQiCi0gdHJhbnNpZW50PSJmYWxzZSIKLSB2b2xhdGlsZT0iZmFsc2UiCi0gdmFsdWU9IjEwNDg1NzYiCi0gc3RhdGljPSJ0cnVlIgotIGZpbmFsPSJ0cnVlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvZmllbGQ+Ci08ZmllbGQgbmFtZT0iVFJBQ0VfQ09VTlRfQUxMT0NTIgotIHR5cGU9ImludCIKLSB0cmFuc2llbnQ9ImZhbHNlIgotIHZvbGF0aWxlPSJmYWxzZSIKLSB2YWx1ZT0iMSIKLSBzdGF0aWM9InRydWUiCi0gZmluYWw9InRydWUiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9maWVsZD4KLTwvY2xhc3M+Ci08Y2xhc3MgbmFtZT0iVk1SdW50aW1lIgotIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCi0gYWJzdHJhY3Q9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9InRydWUiCi0gZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08bWV0aG9kIG5hbWU9ImdjU29mdFJlZmVyZW5jZXMiCi0gcmV0dXJuPSJ2b2lkIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9InRydWUiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0iZ2V0RXh0ZXJuYWxCeXRlc0FsbG9jYXRlZCIKLSByZXR1cm49ImxvbmciCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0idHJ1ZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJnZXRNaW5pbXVtSGVhcFNpemUiCi0gcmV0dXJuPSJsb25nIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9ImdldFJ1bnRpbWUiCi0gcmV0dXJuPSJkYWx2aWsuc3lzdGVtLlZNUnVudGltZSIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0idHJ1ZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9ImdldFRhcmdldEhlYXBVdGlsaXphdGlvbiIKLSByZXR1cm49ImZsb2F0IgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9InRydWUiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0icnVuRmluYWxpemF0aW9uU3luYyIKLSByZXR1cm49InZvaWQiCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0idHJ1ZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJzZXRNaW5pbXVtSGVhcFNpemUiCi0gcmV0dXJuPSJsb25nIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0idHJ1ZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08cGFyYW1ldGVyIG5hbWU9InNpemUiIHR5cGU9ImxvbmciPgotPC9wYXJhbWV0ZXI+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0ic2V0VGFyZ2V0SGVhcFV0aWxpemF0aW9uIgotIHJldHVybj0iZmxvYXQiCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08cGFyYW1ldGVyIG5hbWU9Im5ld1RhcmdldCIgdHlwZT0iZmxvYXQiPgotPC9wYXJhbWV0ZXI+Ci08L21ldGhvZD4KLTwvY2xhc3M+Ci08Y2xhc3MgbmFtZT0iVk1TdGFjayIKLSBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgotIGFic3RyYWN0PSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJ0cnVlIgotIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPGNvbnN0cnVjdG9yIG5hbWU9IlZNU3RhY2siCi0gdHlwZT0iZGFsdmlrLnN5c3RlbS5WTVN0YWNrIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvY29uc3RydWN0b3I+Ci08bWV0aG9kIG5hbWU9ImdldENhbGxpbmdDbGFzc0xvYWRlciIKLSByZXR1cm49ImphdmEubGFuZy5DbGFzc0xvYWRlciIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJ0cnVlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJ0cnVlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0iZ2V0Q2FsbGluZ0NsYXNzTG9hZGVyMiIKLSByZXR1cm49ImphdmEubGFuZy5DbGFzc0xvYWRlciIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJ0cnVlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJ0cnVlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0iZ2V0Q2xhc3NlcyIKLSByZXR1cm49ImphdmEubGFuZy5DbGFzcyZsdDs/Jmd0O1tdIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9InRydWUiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9InRydWUiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0ibWF4RGVwdGgiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0ic3RvcEF0UHJpdmlsZWdlZCIgdHlwZT0iYm9vbGVhbiI+Ci08L3BhcmFtZXRlcj4KLTwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJnZXRUaHJlYWRTdGFja1RyYWNlIgotIHJldHVybj0iamF2YS5sYW5nLlN0YWNrVHJhY2VFbGVtZW50W10iCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0idHJ1ZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0idHJ1ZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPHBhcmFtZXRlciBuYW1lPSJ0IiB0eXBlPSJqYXZhLmxhbmcuVGhyZWFkIj4KLTwvcGFyYW1ldGVyPgotPC9tZXRob2Q+Ci08L2NsYXNzPgotPGNsYXNzIG5hbWU9Ilp5Z290ZSIKLSBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgotIGFic3RyYWN0PSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxtZXRob2QgbmFtZT0iZm9yayIKLSByZXR1cm49ImludCIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJ0cnVlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJ0cnVlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0iZm9ya0FuZFNwZWNpYWxpemUiCi0gcmV0dXJuPSJpbnQiCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0idHJ1ZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0idHJ1ZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPHBhcmFtZXRlciBuYW1lPSJ1aWQiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0iZ2lkIiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9ImdpZHMiIHR5cGU9ImludFtdIj4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJkZWJ1Z0ZsYWdzIiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9InJsaW1pdHMiIHR5cGU9ImludFtdW10iPgotPC9wYXJhbWV0ZXI+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0iZm9ya0FuZFNwZWNpYWxpemUiCi0gcmV0dXJuPSJpbnQiCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9InRydWUiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPHBhcmFtZXRlciBuYW1lPSJ1aWQiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0iZ2lkIiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9ImdpZHMiIHR5cGU9ImludFtdIj4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJlbmFibGVEZWJ1Z2dlciIgdHlwZT0iYm9vbGVhbiI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0icmxpbWl0cyIgdHlwZT0iaW50W11bXSI+Ci08L3BhcmFtZXRlcj4KLTwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJmb3JrU3lzdGVtU2VydmVyIgotIHJldHVybj0iaW50IgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9InRydWUiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9InRydWUiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0idWlkIiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9ImdpZCIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJnaWRzIiB0eXBlPSJpbnRbXSI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0iZGVidWdGbGFncyIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJybGltaXRzIiB0eXBlPSJpbnRbXVtdIj4KLTwvcGFyYW1ldGVyPgotPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9ImZvcmtTeXN0ZW1TZXJ2ZXIiCi0gcmV0dXJuPSJpbnQiCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9InRydWUiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPHBhcmFtZXRlciBuYW1lPSJ1aWQiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0iZ2lkIiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9ImdpZHMiIHR5cGU9ImludFtdIj4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJlbmFibGVEZWJ1Z2dlciIgdHlwZT0iYm9vbGVhbiI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0icmxpbWl0cyIgdHlwZT0iaW50W11bXSI+Ci08L3BhcmFtZXRlcj4KLTwvbWV0aG9kPgotPGZpZWxkIG5hbWU9IkRFQlVHX0VOQUJMRV9BU1NFUlQiCi0gdHlwZT0iaW50IgotIHRyYW5zaWVudD0iZmFsc2UiCi0gdm9sYXRpbGU9ImZhbHNlIgotIHZhbHVlPSI0IgotIHN0YXRpYz0idHJ1ZSIKLSBmaW5hbD0idHJ1ZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L2ZpZWxkPgotPGZpZWxkIG5hbWU9IkRFQlVHX0VOQUJMRV9DSEVDS0pOSSIKLSB0eXBlPSJpbnQiCi0gdHJhbnNpZW50PSJmYWxzZSIKLSB2b2xhdGlsZT0iZmFsc2UiCi0gdmFsdWU9IjIiCi0gc3RhdGljPSJ0cnVlIgotIGZpbmFsPSJ0cnVlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvZmllbGQ+Ci08ZmllbGQgbmFtZT0iREVCVUdfRU5BQkxFX0RFQlVHR0VSIgotIHR5cGU9ImludCIKLSB0cmFuc2llbnQ9ImZhbHNlIgotIHZvbGF0aWxlPSJmYWxzZSIKLSB2YWx1ZT0iMSIKLSBzdGF0aWM9InRydWUiCi0gZmluYWw9InRydWUiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9maWVsZD4KLTxmaWVsZCBuYW1lPSJERUJVR19FTkFCTEVfU0FGRU1PREUiCi0gdHlwZT0iaW50IgotIHRyYW5zaWVudD0iZmFsc2UiCi0gdm9sYXRpbGU9ImZhbHNlIgotIHZhbHVlPSI4IgotIHN0YXRpYz0idHJ1ZSIKLSBmaW5hbD0idHJ1ZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L2ZpZWxkPgotPC9jbGFzcz4KIDwvcGFja2FnZT4KIDxwYWNrYWdlIG5hbWU9ImphdmEuYXd0LmZvbnQiCiA+CkBAIC0yMjM1MzksNiArMjI3MTk5LDQ2IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJLRVJOSU5HIgorIHR5cGU9ImphdmEuYXd0LmZvbnQuVGV4dEF0dHJpYnV0ZSIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJLRVJOSU5HX09OIgorIHR5cGU9ImphdmEubGFuZy5JbnRlZ2VyIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IkxJR0FUVVJFUyIKKyB0eXBlPSJqYXZhLmF3dC5mb250LlRleHRBdHRyaWJ1dGUiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iTElHQVRVUkVTX09OIgorIHR5cGU9ImphdmEubGFuZy5JbnRlZ2VyIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9Ik5VTUVSSUNfU0hBUElORyIKICB0eXBlPSJqYXZhLmF3dC5mb250LlRleHRBdHRyaWJ1dGUiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTIyMzY4OSw2ICsyMjczODksMzYgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlRSQUNLSU5HIgorIHR5cGU9ImphdmEuYXd0LmZvbnQuVGV4dEF0dHJpYnV0ZSIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJUUkFDS0lOR19MT09TRSIKKyB0eXBlPSJqYXZhLmxhbmcuRmxvYXQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iVFJBQ0tJTkdfVElHSFQiCisgdHlwZT0iamF2YS5sYW5nLkZsb2F0IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9IlRSQU5TRk9STSIKICB0eXBlPSJqYXZhLmF3dC5mb250LlRleHRBdHRyaWJ1dGUiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTIyNTA5Nyw3ICsyMjg4MjcsNyBAQAogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KLTxwYXJhbWV0ZXIgbmFtZT0iYyIgdHlwZT0iY2hhcltdIj4KKzxwYXJhbWV0ZXIgbmFtZT0iYnVmZmVyIiB0eXBlPSJjaGFyW10iPgogPC9wYXJhbWV0ZXI+CiA8cGFyYW1ldGVyIG5hbWU9Im9mZnNldCIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgpAQCAtMjI1MTg5LDYgKzIyODkxOSwxMzIgQEAKIDwvZXhjZXB0aW9uPgogPC9tZXRob2Q+CiA8L2ludGVyZmFjZT4KKzxjbGFzcyBuYW1lPSJDb25zb2xlIgorIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGltcGxlbWVudHMgbmFtZT0iamF2YS5pby5GbHVzaGFibGUiPgorPC9pbXBsZW1lbnRzPgorPG1ldGhvZCBuYW1lPSJmbHVzaCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZm9ybWF0IgorIHJldHVybj0iamF2YS5pby5Db25zb2xlIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJmb3JtYXQiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImFyZ3MiIHR5cGU9ImphdmEubGFuZy5PYmplY3QuLi4iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icHJpbnRmIgorIHJldHVybj0iamF2YS5pby5Db25zb2xlIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJmb3JtYXQiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImFyZ3MiIHR5cGU9ImphdmEubGFuZy5PYmplY3QuLi4iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icmVhZExpbmUiCisgcmV0dXJuPSJqYXZhLmxhbmcuU3RyaW5nIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InJlYWRMaW5lIgorIHJldHVybj0iamF2YS5sYW5nLlN0cmluZyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZm9ybWF0IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJhcmdzIiB0eXBlPSJqYXZhLmxhbmcuT2JqZWN0Li4uIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InJlYWRQYXNzd29yZCIKKyByZXR1cm49ImNoYXJbXSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJyZWFkUGFzc3dvcmQiCisgcmV0dXJuPSJjaGFyW10iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImZvcm1hdCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iYXJncyIgdHlwZT0iamF2YS5sYW5nLk9iamVjdC4uLiI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJyZWFkZXIiCisgcmV0dXJuPSJqYXZhLmlvLlJlYWRlciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJ3cml0ZXIiCisgcmV0dXJuPSJqYXZhLmlvLlByaW50V3JpdGVyIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8L2NsYXNzPgogPGludGVyZmFjZSBuYW1lPSJEYXRhSW5wdXQiCiAgYWJzdHJhY3Q9InRydWUiCiAgc3RhdGljPSJmYWxzZSIKQEAgLTIyNjIzMSw2ICsyMzAwODcsMTcgQEAKIDxwYXJhbWV0ZXIgbmFtZT0idXJpIiB0eXBlPSJqYXZhLm5ldC5VUkkiPgogPC9wYXJhbWV0ZXI+CiA8L2NvbnN0cnVjdG9yPgorPG1ldGhvZCBuYW1lPSJjYW5FeGVjdXRlIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJjYW5SZWFkIgogIHJldHVybj0iYm9vbGVhbiIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yMjYzOTYsNiArMjMwMjYzLDE3IEBACiA8ZXhjZXB0aW9uIG5hbWU9IklPRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmlvLklPRXhjZXB0aW9uIj4KIDwvZXhjZXB0aW9uPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldEZyZWVTcGFjZSIKKyByZXR1cm49ImxvbmciCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZ2V0TmFtZSIKICByZXR1cm49ImphdmEubGFuZy5TdHJpbmciCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjI2NDQwLDYgKzIzMDMxOCwyOCBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRUb3RhbFNwYWNlIgorIHJldHVybj0ibG9uZyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRVc2FibGVTcGFjZSIKKyByZXR1cm49ImxvbmciCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iaXNBYnNvbHV0ZSIKICByZXR1cm49ImJvb2xlYW4iCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjI2NjEzLDYgKzIzMDUxMywzNCBAQAogPHBhcmFtZXRlciBuYW1lPSJkZXN0IiB0eXBlPSJqYXZhLmlvLkZpbGUiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0RXhlY3V0YWJsZSIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImV4ZWN1dGFibGUiIHR5cGU9ImJvb2xlYW4iPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Im93bmVyT25seSIgdHlwZT0iYm9vbGVhbiI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRFeGVjdXRhYmxlIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZXhlY3V0YWJsZSIgdHlwZT0iYm9vbGVhbiI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzZXRMYXN0TW9kaWZpZWQiCiAgcmV0dXJuPSJib29sZWFuIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTIyNjYzNyw2ICsyMzA1NjUsNjIgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0UmVhZGFibGUiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJyZWFkYWJsZSIgdHlwZT0iYm9vbGVhbiI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ib3duZXJPbmx5IiB0eXBlPSJib29sZWFuIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFJlYWRhYmxlIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icmVhZGFibGUiIHR5cGU9ImJvb2xlYW4iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0V3JpdGFibGUiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ3cml0YWJsZSIgdHlwZT0iYm9vbGVhbiI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ib3duZXJPbmx5IiB0eXBlPSJib29sZWFuIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFdyaXRhYmxlIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0id3JpdGFibGUiIHR5cGU9ImJvb2xlYW4iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0idG9VUkkiCiAgcmV0dXJuPSJqYXZhLm5ldC5VUkkiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjI2NjU1LDcgKzIzMDYzOSw3IEBACiAgc3luY2hyb25pemVkPSJmYWxzZSIKICBzdGF0aWM9ImZhbHNlIgogIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDxleGNlcHRpb24gbmFtZT0iTWFsZm9ybWVkVVJMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb24iPgpAQCAtMjI3NDY1LDYgKzIzMTQ0OSwyNSBAQAogPC9leGNlcHRpb24+CiA8L21ldGhvZD4KIDwvaW50ZXJmYWNlPgorPGNsYXNzIG5hbWU9IklPRXJyb3IiCisgZXh0ZW5kcz0iamF2YS5sYW5nLkVycm9yIgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8Y29uc3RydWN0b3IgbmFtZT0iSU9FcnJvciIKKyB0eXBlPSJqYXZhLmlvLklPRXJyb3IiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjYXVzZSIgdHlwZT0iamF2YS5sYW5nLlRocm93YWJsZSI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8L2NsYXNzPgogPGNsYXNzIG5hbWU9IklPRXhjZXB0aW9uIgogIGV4dGVuZHM9ImphdmEubGFuZy5FeGNlcHRpb24iCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjI3NDkxLDYgKzIzMTQ5NCwyOCBAQAogPHBhcmFtZXRlciBuYW1lPSJkZXRhaWxNZXNzYWdlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KIDwvcGFyYW1ldGVyPgogPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJJT0V4Y2VwdGlvbiIKKyB0eXBlPSJqYXZhLmlvLklPRXhjZXB0aW9uIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibWVzc2FnZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iY2F1c2UiIHR5cGU9ImphdmEubGFuZy5UaHJvd2FibGUiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IklPRXhjZXB0aW9uIgorIHR5cGU9ImphdmEuaW8uSU9FeGNlcHRpb24iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjYXVzZSIgdHlwZT0iamF2YS5sYW5nLlRocm93YWJsZSI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+CiA8L2NsYXNzPgogPGNsYXNzIG5hbWU9IklucHV0U3RyZWFtIgogIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCkBAIC0yMjc3MjYsNyArMjMxNzUxLDcgQEAKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+Ci08cGFyYW1ldGVyIG5hbWU9ImJ1ZiIgdHlwZT0iY2hhcltdIj4KKzxwYXJhbWV0ZXIgbmFtZT0iYnVmZmVyIiB0eXBlPSJjaGFyW10iPgogPC9wYXJhbWV0ZXI+CiA8cGFyYW1ldGVyIG5hbWU9Im9mZnNldCIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgpAQCAtMjI5NTY1LDYgKzIzMzU5MCwxOSBAQAogPHBhcmFtZXRlciBuYW1lPSJjbCIgdHlwZT0iamF2YS5sYW5nLkNsYXNzJmx0Oz8mZ3Q7Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Imxvb2t1cEFueSIKKyByZXR1cm49ImphdmEuaW8uT2JqZWN0U3RyZWFtQ2xhc3MiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY2wiIHR5cGU9ImphdmEubGFuZy5DbGFzcyZsdDs/Jmd0OyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPGZpZWxkIG5hbWU9Ik5PX0ZJRUxEUyIKICB0eXBlPSJqYXZhLmlvLk9iamVjdFN0cmVhbUZpZWxkW10iCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTIzMDI5OSw3ICsyMzQzMzcsNyBAQAogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KLTxwYXJhbWV0ZXIgbmFtZT0iYnVmIiB0eXBlPSJjaGFyW10iPgorPHBhcmFtZXRlciBuYW1lPSJidWZmZXIiIHR5cGU9ImNoYXJbXSI+CiA8L3BhcmFtZXRlcj4KIDxwYXJhbWV0ZXIgbmFtZT0ib2Zmc2V0IiB0eXBlPSJpbnQiPgogPC9wYXJhbWV0ZXI+CkBAIC0yMzAzMzcsNiArMjM0Mzc1LDMwIEBACiA8ZXhjZXB0aW9uIG5hbWU9IklPRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmlvLklPRXhjZXB0aW9uIj4KIDwvZXhjZXB0aW9uPgogPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJQaXBlZElucHV0U3RyZWFtIgorIHR5cGU9ImphdmEuaW8uUGlwZWRJbnB1dFN0cmVhbSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InBpcGVTaXplIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IlBpcGVkSW5wdXRTdHJlYW0iCisgdHlwZT0iamF2YS5pby5QaXBlZElucHV0U3RyZWFtIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ib3V0IiB0eXBlPSJqYXZhLmlvLlBpcGVkT3V0cHV0U3RyZWFtIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJwaXBlU2l6ZSIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJJT0V4Y2VwdGlvbiIgdHlwZT0iamF2YS5pby5JT0V4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvY29uc3RydWN0b3I+CiA8bWV0aG9kIG5hbWU9ImNvbm5lY3QiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTIzMDUxMCw2ICsyMzQ1NzIsMzAgQEAKIDxleGNlcHRpb24gbmFtZT0iSU9FeGNlcHRpb24iIHR5cGU9ImphdmEuaW8uSU9FeGNlcHRpb24iPgogPC9leGNlcHRpb24+CiA8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IlBpcGVkUmVhZGVyIgorIHR5cGU9ImphdmEuaW8uUGlwZWRSZWFkZXIiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwaXBlU2l6ZSIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJQaXBlZFJlYWRlciIKKyB0eXBlPSJqYXZhLmlvLlBpcGVkUmVhZGVyIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ib3V0IiB0eXBlPSJqYXZhLmlvLlBpcGVkV3JpdGVyIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJwaXBlU2l6ZSIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJJT0V4Y2VwdGlvbiIgdHlwZT0iamF2YS5pby5JT0V4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvY29uc3RydWN0b3I+CiA8bWV0aG9kIG5hbWU9ImNsb3NlIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yMzA4MDcsNiArMjM0ODkzLDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImNsZWFyRXJyb3IiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHJvdGVjdGVkIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImZvcm1hdCIKICByZXR1cm49ImphdmEuaW8uUHJpbnRTdHJlYW0iCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjMxMjQ3LDYgKzIzNTM0NCwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJjbGVhckVycm9yIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InByb3RlY3RlZCIKKz4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJjbG9zZSIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjMyMTUwLDcgKzIzNjI1OCw3IEBACiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgotPHBhcmFtZXRlciBuYW1lPSJwb3MiIHR5cGU9ImxvbmciPgorPHBhcmFtZXRlciBuYW1lPSJvZmZzZXQiIHR5cGU9ImxvbmciPgogPC9wYXJhbWV0ZXI+CiA8ZXhjZXB0aW9uIG5hbWU9IklPRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmlvLklPRXhjZXB0aW9uIj4KIDwvZXhjZXB0aW9uPgpAQCAtMjMzMTY5LDcgKzIzNzI3Nyw3IEBACiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgotPHBhcmFtZXRlciBuYW1lPSJjYnVmIiB0eXBlPSJjaGFyW10iPgorPHBhcmFtZXRlciBuYW1lPSJjaGFycyIgdHlwZT0iY2hhcltdIj4KIDwvcGFyYW1ldGVyPgogPHBhcmFtZXRlciBuYW1lPSJvZmZzZXQiIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KQEAgLTIzOTI4NSw2ICsyNDMzOTMsMTcgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iZCIgdHlwZT0iZG91YmxlIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8ZmllbGQgbmFtZT0iTUFYX0VYUE9ORU5UIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTAyMyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJNQVhfVkFMVUUiCiAgdHlwZT0iZG91YmxlIgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC0yMzkyOTYsNiArMjQzNDE1LDI4IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJNSU5fRVhQT05FTlQiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSItMTAyMiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJNSU5fTk9STUFMIgorIHR5cGU9ImRvdWJsZSIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMi4yMjUwNzM4NTg1MDcyMDE0RS0zMDgiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0iTUlOX1ZBTFVFIgogIHR5cGU9ImRvdWJsZSIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMjM5NDI1LDYgKzI0MzU2NiwxNyBAQAogPHBhcmFtZXRlciBuYW1lPSJvdGhlciIgdHlwZT0iamF2YS5sYW5nLk9iamVjdCI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJmaW5hbGl6ZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InByb3RlY3RlZCIKKz4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJnZXREZWNsYXJpbmdDbGFzcyIKICByZXR1cm49ImphdmEubGFuZy5DbGFzcyZsdDtFJmd0OyIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yMzk5NDQsNiArMjQ0MDk2LDE3IEBACiA8cGFyYW1ldGVyIG5hbWU9ImYiIHR5cGU9ImZsb2F0Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8ZmllbGQgbmFtZT0iTUFYX0VYUE9ORU5UIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTI3IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9Ik1BWF9WQUxVRSIKICB0eXBlPSJmbG9hdCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMjM5OTU1LDYgKzI0NDExOCwyOCBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iTUlOX0VYUE9ORU5UIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iLTEyNiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJNSU5fTk9STUFMIgorIHR5cGU9ImZsb2F0IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxLjE3NTQ5NDM1RS0zOGYiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0iTUlOX1ZBTFVFIgogIHR5cGU9ImZsb2F0IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC0yNDE1NTgsNiArMjQ1NzQzLDM2IEBACiA8cGFyYW1ldGVyIG5hbWU9ImQiIHR5cGU9ImRvdWJsZSI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJjb3B5U2lnbiIKKyByZXR1cm49ImRvdWJsZSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJ0cnVlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im1hZ25pdHVkZSIgdHlwZT0iZG91YmxlIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJzaWduIiB0eXBlPSJkb3VibGUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iY29weVNpZ24iCisgcmV0dXJuPSJmbG9hdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJ0cnVlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im1hZ25pdHVkZSIgdHlwZT0iZmxvYXQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InNpZ24iIHR5cGU9ImZsb2F0Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImNvcyIKICByZXR1cm49ImRvdWJsZSIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yNDE2MjMsNiArMjQ1ODM4LDMyIEBACiA8cGFyYW1ldGVyIG5hbWU9ImQiIHR5cGU9ImRvdWJsZSI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRFeHBvbmVudCIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJmIiB0eXBlPSJmbG9hdCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRFeHBvbmVudCIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJkIiB0eXBlPSJkb3VibGUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iaHlwb3QiCiAgcmV0dXJuPSJkb3VibGUiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjQxNzk3LDYgKzI0NjAzOCw2MiBAQAogPHBhcmFtZXRlciBuYW1lPSJsMiIgdHlwZT0ibG9uZyI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJuZXh0QWZ0ZXIiCisgcmV0dXJuPSJkb3VibGUiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ic3RhcnQiIHR5cGU9ImRvdWJsZSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZGlyZWN0aW9uIiB0eXBlPSJkb3VibGUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ibmV4dEFmdGVyIgorIHJldHVybj0iZmxvYXQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ic3RhcnQiIHR5cGU9ImZsb2F0Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJkaXJlY3Rpb24iIHR5cGU9ImRvdWJsZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJuZXh0VXAiCisgcmV0dXJuPSJkb3VibGUiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZCIgdHlwZT0iZG91YmxlIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im5leHRVcCIKKyByZXR1cm49ImZsb2F0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImYiIHR5cGU9ImZsb2F0Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InBvdyIKICByZXR1cm49ImRvdWJsZSIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yNDE4NjIsNiArMjQ2MTU5LDM2IEBACiA8cGFyYW1ldGVyIG5hbWU9ImYiIHR5cGU9ImZsb2F0Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNjYWxiIgorIHJldHVybj0iZG91YmxlIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImQiIHR5cGU9ImRvdWJsZSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ic2NhbGVGYWN0b3IiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzY2FsYiIKKyByZXR1cm49ImZsb2F0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImQiIHR5cGU9ImZsb2F0Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJzY2FsZUZhY3RvciIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InNpZ251bSIKICByZXR1cm49ImRvdWJsZSIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yNDI1MzMsNyArMjQ2ODYwLDcgQEAKIDxpbXBsZW1lbnRzIG5hbWU9ImphdmEubGFuZy5yZWZsZWN0LkFubm90YXRlZEVsZW1lbnQiPgogPC9pbXBsZW1lbnRzPgogPG1ldGhvZCBuYW1lPSJnZXRBbm5vdGF0aW9uIgotIHJldHVybj0iVCIKKyByZXR1cm49IkEiCiAgYWJzdHJhY3Q9ImZhbHNlIgogIG5hdGl2ZT0iZmFsc2UiCiAgc3luY2hyb25pemVkPSJmYWxzZSIKQEAgLTI0MjU0Miw3ICsyNDY4NjksNyBAQAogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KLTxwYXJhbWV0ZXIgbmFtZT0iYW5ub3RhdGlvblR5cGUiIHR5cGU9ImphdmEubGFuZy5DbGFzcyZsdDtUJmd0OyI+Cis8cGFyYW1ldGVyIG5hbWU9ImFubm90YXRpb25UeXBlIiB0eXBlPSJqYXZhLmxhbmcuQ2xhc3MmbHQ7QSZndDsiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZ2V0QW5ub3RhdGlvbnMiCkBAIC0yNDQ1MDksNiArMjQ4ODM2LDM2IEBACiA8cGFyYW1ldGVyIG5hbWU9ImQiIHR5cGU9ImRvdWJsZSI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJjb3B5U2lnbiIKKyByZXR1cm49ImRvdWJsZSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJtYWduaXR1ZGUiIHR5cGU9ImRvdWJsZSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ic2lnbiIgdHlwZT0iZG91YmxlIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImNvcHlTaWduIgorIHJldHVybj0iZmxvYXQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibWFnbml0dWRlIiB0eXBlPSJmbG9hdCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ic2lnbiIgdHlwZT0iZmxvYXQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iY29zIgogIHJldHVybj0iZG91YmxlIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTI0NDU3NCw2ICsyNDg5MzEsMzIgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iZCIgdHlwZT0iZG91YmxlIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldEV4cG9uZW50IgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImYiIHR5cGU9ImZsb2F0Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldEV4cG9uZW50IgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImQiIHR5cGU9ImRvdWJsZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJoeXBvdCIKICByZXR1cm49ImRvdWJsZSIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yNDQ3NDgsNiArMjQ5MTMxLDYyIEBACiA8cGFyYW1ldGVyIG5hbWU9ImwyIiB0eXBlPSJsb25nIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im5leHRBZnRlciIKKyByZXR1cm49ImRvdWJsZSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJzdGFydCIgdHlwZT0iZG91YmxlIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJkaXJlY3Rpb24iIHR5cGU9ImRvdWJsZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJuZXh0QWZ0ZXIiCisgcmV0dXJuPSJmbG9hdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJzdGFydCIgdHlwZT0iZmxvYXQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImRpcmVjdGlvbiIgdHlwZT0iZG91YmxlIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im5leHRVcCIKKyByZXR1cm49ImRvdWJsZSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJkIiB0eXBlPSJkb3VibGUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ibmV4dFVwIgorIHJldHVybj0iZmxvYXQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZiIgdHlwZT0iZmxvYXQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0icG93IgogIHJldHVybj0iZG91YmxlIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTI0NDgxMyw2ICsyNDkyNTIsMzYgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iZiIgdHlwZT0iZmxvYXQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2NhbGIiCisgcmV0dXJuPSJkb3VibGUiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZCIgdHlwZT0iZG91YmxlIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJzY2FsZUZhY3RvciIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNjYWxiIgorIHJldHVybj0iZmxvYXQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZCIgdHlwZT0iZmxvYXQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InNjYWxlRmFjdG9yIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2lnbnVtIgogIHJldHVybj0iZG91YmxlIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTI0NTA5Miw2ICsyNDk1NjEsMzQgQEAKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+Cis8cGFyYW1ldGVyIG5hbWU9ImRhdGEiIHR5cGU9ImJ5dGVbXSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ic3RhcnQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibGVuZ3RoIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImVuY29kaW5nIiB0eXBlPSJqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IlN0cmluZyIKKyB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZGF0YSIgdHlwZT0iYnl0ZVtdIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJlbmNvZGluZyIgdHlwZT0iamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0Ij4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTdHJpbmciCisgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+CiA8cGFyYW1ldGVyIG5hbWU9ImRhdGEiIHR5cGU9ImNoYXJbXSI+CiA8L3BhcmFtZXRlcj4KIDwvY29uc3RydWN0b3I+CkBAIC0yNDUzNjYsNyArMjQ5ODYzLDcgQEAKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+Ci08cGFyYW1ldGVyIG5hbWU9ImxvYyIgdHlwZT0iamF2YS51dGlsLkxvY2FsZSI+Cis8cGFyYW1ldGVyIG5hbWU9ImxvY2FsZSIgdHlwZT0iamF2YS51dGlsLkxvY2FsZSI+CiA8L3BhcmFtZXRlcj4KIDxwYXJhbWV0ZXIgbmFtZT0iZm9ybWF0IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KIDwvcGFyYW1ldGVyPgpAQCAtMjQ1NDE4LDYgKzI0OTkxNSwxOSBAQAogPGV4Y2VwdGlvbiBuYW1lPSJVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24iPgogPC9leGNlcHRpb24+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0Qnl0ZXMiCisgcmV0dXJuPSJieXRlW10iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImVuY29kaW5nIiB0eXBlPSJqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZ2V0Q2hhcnMiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTI0NTUwNCw2ICsyNTAwMTQsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iaXNFbXB0eSIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ibGFzdEluZGV4T2YiCiAgcmV0dXJuPSJpbnQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjQ1NTgxLDcgKzI1MDEwMiw3IEBACiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgotPHBhcmFtZXRlciBuYW1lPSJleHByIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzxwYXJhbWV0ZXIgbmFtZT0icmVndWxhckV4cHJlc3Npb24iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ib2Zmc2V0QnlDb2RlUG9pbnRzIgpAQCAtMjQ1Njc5LDkgKzI1MDIwMCw5IEBACiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgotPHBhcmFtZXRlciBuYW1lPSJleHByIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzxwYXJhbWV0ZXIgbmFtZT0icmVndWxhckV4cHJlc3Npb24iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgogPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9InN1YnN0aXR1dGUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPHBhcmFtZXRlciBuYW1lPSJyZXBsYWNlbWVudCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJyZXBsYWNlRmlyc3QiCkBAIC0yNDU2OTQsOSArMjUwMjE1LDkgQEAKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+Ci08cGFyYW1ldGVyIG5hbWU9ImV4cHIiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPHBhcmFtZXRlciBuYW1lPSJyZWd1bGFyRXhwcmVzc2lvbiIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+CiA8L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0ic3Vic3RpdHV0ZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8cGFyYW1ldGVyIG5hbWU9InJlcGxhY2VtZW50IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InNwbGl0IgpAQCAtMjQ1NzA5LDcgKzI1MDIzMCw3IEBACiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgotPHBhcmFtZXRlciBuYW1lPSJleHByIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzxwYXJhbWV0ZXIgbmFtZT0icmVndWxhckV4cHJlc3Npb24iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic3BsaXQiCkBAIC0yNDU3MjIsOSArMjUwMjQzLDkgQEAKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+Ci08cGFyYW1ldGVyIG5hbWU9ImV4cHIiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPHBhcmFtZXRlciBuYW1lPSJyZWd1bGFyRXhwcmVzc2lvbiIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+CiA8L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0ibWF4IiB0eXBlPSJpbnQiPgorPHBhcmFtZXRlciBuYW1lPSJsaW1pdCIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InN0YXJ0c1dpdGgiCkBAIC0yNDcwNjQsNiArMjUxNTg1LDE3IEBACiA8cGFyYW1ldGVyIG5hbWU9ImtleSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJjb25zb2xlIgorIHJldHVybj0iamF2YS5pby5Db25zb2xlIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iY3VycmVudFRpbWVNaWxsaXMiCiAgcmV0dXJuPSJsb25nIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTI1MzkyMiw2ICsyNTg0NTQsMjMzIEBACiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgogPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJDb29raWVNYW5hZ2VyIgorIGV4dGVuZHM9ImphdmEubmV0LkNvb2tpZUhhbmRsZXIiCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJDb29raWVNYW5hZ2VyIgorIHR5cGU9ImphdmEubmV0LkNvb2tpZU1hbmFnZXIiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJDb29raWVNYW5hZ2VyIgorIHR5cGU9ImphdmEubmV0LkNvb2tpZU1hbmFnZXIiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJzdG9yZSIgdHlwZT0iamF2YS5uZXQuQ29va2llU3RvcmUiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImNvb2tpZVBvbGljeSIgdHlwZT0iamF2YS5uZXQuQ29va2llUG9saWN5Ij4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxtZXRob2QgbmFtZT0iZ2V0IgorIHJldHVybj0iamF2YS51dGlsLk1hcCZsdDtqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLnV0aWwuTGlzdCZsdDtqYXZhLmxhbmcuU3RyaW5nJmd0OyZndDsiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InVyaSIgdHlwZT0iamF2YS5uZXQuVVJJIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJyZXF1ZXN0SGVhZGVycyIgdHlwZT0iamF2YS51dGlsLk1hcCZsdDtqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLnV0aWwuTGlzdCZsdDtqYXZhLmxhbmcuU3RyaW5nJmd0OyZndDsiPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IklPRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmlvLklPRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldENvb2tpZVN0b3JlIgorIHJldHVybj0iamF2YS5uZXQuQ29va2llU3RvcmUiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icHV0IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idXJpIiB0eXBlPSJqYXZhLm5ldC5VUkkiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InJlc3BvbnNlSGVhZGVycyIgdHlwZT0iamF2YS51dGlsLk1hcCZsdDtqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLnV0aWwuTGlzdCZsdDtqYXZhLmxhbmcuU3RyaW5nJmd0OyZndDsiPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IklPRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmlvLklPRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldENvb2tpZVBvbGljeSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvb2tpZVBvbGljeSIgdHlwZT0iamF2YS5uZXQuQ29va2llUG9saWN5Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8L2NsYXNzPgorPGludGVyZmFjZSBuYW1lPSJDb29raWVQb2xpY3kiCisgYWJzdHJhY3Q9InRydWUiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPG1ldGhvZCBuYW1lPSJzaG91bGRBY2NlcHQiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InVyaSIgdHlwZT0iamF2YS5uZXQuVVJJIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJjb29raWUiIHR5cGU9ImphdmEubmV0Lkh0dHBDb29raWUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxmaWVsZCBuYW1lPSJBQ0NFUFRfQUxMIgorIHR5cGU9ImphdmEubmV0LkNvb2tpZVBvbGljeSIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0ibnVsbCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJBQ0NFUFRfTk9ORSIKKyB0eXBlPSJqYXZhLm5ldC5Db29raWVQb2xpY3kiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9Im51bGwiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iQUNDRVBUX09SSUdJTkFMX1NFUlZFUiIKKyB0eXBlPSJqYXZhLm5ldC5Db29raWVQb2xpY3kiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9Im51bGwiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8L2ludGVyZmFjZT4KKzxpbnRlcmZhY2UgbmFtZT0iQ29va2llU3RvcmUiCisgYWJzdHJhY3Q9InRydWUiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPG1ldGhvZCBuYW1lPSJhZGQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InVyaSIgdHlwZT0iamF2YS5uZXQuVVJJIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJjb29raWUiIHR5cGU9ImphdmEubmV0Lkh0dHBDb29raWUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0IgorIHJldHVybj0iamF2YS51dGlsLkxpc3QmbHQ7amF2YS5uZXQuSHR0cENvb2tpZSZndDsiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idXJpIiB0eXBlPSJqYXZhLm5ldC5VUkkiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0Q29va2llcyIKKyByZXR1cm49ImphdmEudXRpbC5MaXN0Jmx0O2phdmEubmV0Lkh0dHBDb29raWUmZ3Q7IgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0VVJJcyIKKyByZXR1cm49ImphdmEudXRpbC5MaXN0Jmx0O2phdmEubmV0LlVSSSZndDsiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJyZW1vdmUiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InVyaSIgdHlwZT0iamF2YS5uZXQuVVJJIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJjb29raWUiIHR5cGU9ImphdmEubmV0Lkh0dHBDb29raWUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icmVtb3ZlQWxsIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8L2ludGVyZmFjZT4KIDxjbGFzcyBuYW1lPSJEYXRhZ3JhbVBhY2tldCIKICBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTI1NDk4MCw2ICsyNTk3MzksMzMwIEBACiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgogPC9pbnRlcmZhY2U+Cis8Y2xhc3MgbmFtZT0iSHR0cENvb2tpZSIKKyBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxpbXBsZW1lbnRzIG5hbWU9ImphdmEubGFuZy5DbG9uZWFibGUiPgorPC9pbXBsZW1lbnRzPgorPGNvbnN0cnVjdG9yIG5hbWU9Ikh0dHBDb29raWUiCisgdHlwZT0iamF2YS5uZXQuSHR0cENvb2tpZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InZhbHVlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxtZXRob2QgbmFtZT0iY2xvbmUiCisgcmV0dXJuPSJqYXZhLmxhbmcuT2JqZWN0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImRvbWFpbk1hdGNoZXMiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImRvbWFpblBhdHRlcm4iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Imhvc3QiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0Q29tbWVudCIKKyByZXR1cm49ImphdmEubGFuZy5TdHJpbmciCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0Q29tbWVudFVSTCIKKyByZXR1cm49ImphdmEubGFuZy5TdHJpbmciCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0RGlzY2FyZCIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0RG9tYWluIgorIHJldHVybj0iamF2YS5sYW5nLlN0cmluZyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRNYXhBZ2UiCisgcmV0dXJuPSJsb25nIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldE5hbWUiCisgcmV0dXJuPSJqYXZhLmxhbmcuU3RyaW5nIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFBhdGgiCisgcmV0dXJuPSJqYXZhLmxhbmcuU3RyaW5nIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFBvcnRsaXN0IgorIHJldHVybj0iamF2YS5sYW5nLlN0cmluZyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRTZWN1cmUiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFZhbHVlIgorIHJldHVybj0iamF2YS5sYW5nLlN0cmluZyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRWZXJzaW9uIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Imhhc0V4cGlyZWQiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InBhcnNlIgorIHJldHVybj0iamF2YS51dGlsLkxpc3QmbHQ7amF2YS5uZXQuSHR0cENvb2tpZSZndDsiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iaGVhZGVyIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldENvbW1lbnQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb21tZW50IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldENvbW1lbnRVUkwiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb21tZW50VVJMIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldERpc2NhcmQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJkaXNjYXJkIiB0eXBlPSJib29sZWFuIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldERvbWFpbiIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InBhdHRlcm4iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0TWF4QWdlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZGVsdGFTZWNvbmRzIiB0eXBlPSJsb25nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFBhdGgiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwYXRoIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFBvcnRsaXN0IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icG9ydExpc3QiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0U2VjdXJlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ic2VjdXJlIiB0eXBlPSJib29sZWFuIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFZhbHVlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idmFsdWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0VmVyc2lvbiIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InYiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPC9jbGFzcz4KIDxjbGFzcyBuYW1lPSJIdHRwUmV0cnlFeGNlcHRpb24iCiAgZXh0ZW5kcz0iamF2YS5pby5JT0V4Y2VwdGlvbiIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yNTU2ODIsNiArMjYwNzY1LDkzIEBACiA+CiA8L2ZpZWxkPgogPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJJRE4iCisgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8bWV0aG9kIG5hbWU9InRvQVNDSUkiCisgcmV0dXJuPSJqYXZhLmxhbmcuU3RyaW5nIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImlucHV0IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJmbGFncyIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InRvQVNDSUkiCisgcmV0dXJuPSJqYXZhLmxhbmcuU3RyaW5nIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImlucHV0IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InRvVW5pY29kZSIKKyByZXR1cm49ImphdmEubGFuZy5TdHJpbmciCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iaW5wdXQiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImZsYWdzIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0idG9Vbmljb2RlIgorIHJldHVybj0iamF2YS5sYW5nLlN0cmluZyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJpbnB1dCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPGZpZWxkIG5hbWU9IkFMTE9XX1VOQVNTSUdORUQiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlVTRV9TVEQzX0FTQ0lJX1JVTEVTIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzwvY2xhc3M+CiA8Y2xhc3MgbmFtZT0iSW5ldDRBZGRyZXNzIgogIGV4dGVuZHM9ImphdmEubmV0LkluZXRBZGRyZXNzIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTI1NjAyNCw3ICsyNjExOTQsNyBAQAogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KLTxwYXJhbWV0ZXIgbmFtZT0ibmV0aWYiIHR5cGU9ImphdmEubmV0Lk5ldHdvcmtJbnRlcmZhY2UiPgorPHBhcmFtZXRlciBuYW1lPSJuZXR3b3JrSW50ZXJmYWNlIiB0eXBlPSJqYXZhLm5ldC5OZXR3b3JrSW50ZXJmYWNlIj4KIDwvcGFyYW1ldGVyPgogPHBhcmFtZXRlciBuYW1lPSJ0dGwiIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KQEAgLTI1NjE3MSw2ICsyNjEzNDEsNDggQEAKID4KIDwvbWV0aG9kPgogPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJJbnRlcmZhY2VBZGRyZXNzIgorIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxtZXRob2QgbmFtZT0iZ2V0QWRkcmVzcyIKKyByZXR1cm49ImphdmEubmV0LkluZXRBZGRyZXNzIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldEJyb2FkY2FzdCIKKyByZXR1cm49ImphdmEubmV0LkluZXRBZGRyZXNzIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldE5ldHdvcmtQcmVmaXhMZW5ndGgiCisgcmV0dXJuPSJzaG9ydCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPC9jbGFzcz4KIDxjbGFzcyBuYW1lPSJKYXJVUkxDb25uZWN0aW9uIgogIGV4dGVuZHM9ImphdmEubmV0LlVSTENvbm5lY3Rpb24iCiAgYWJzdHJhY3Q9InRydWUiCkBAIC0yNTY2NzMsNiArMjYxODg1LDE5IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldEhhcmR3YXJlQWRkcmVzcyIKKyByZXR1cm49ImJ5dGVbXSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxleGNlcHRpb24gbmFtZT0iU29ja2V0RXhjZXB0aW9uIiB0eXBlPSJqYXZhLm5ldC5Tb2NrZXRFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZ2V0SW5ldEFkZHJlc3NlcyIKICByZXR1cm49ImphdmEudXRpbC5FbnVtZXJhdGlvbiZsdDtqYXZhLm5ldC5JbmV0QWRkcmVzcyZndDsiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjU2Njg0LDYgKzI2MTkwOSwzMCBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRJbnRlcmZhY2VBZGRyZXNzZXMiCisgcmV0dXJuPSJqYXZhLnV0aWwuTGlzdCZsdDtqYXZhLm5ldC5JbnRlcmZhY2VBZGRyZXNzJmd0OyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRNVFUiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8ZXhjZXB0aW9uIG5hbWU9IlNvY2tldEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5uZXQuU29ja2V0RXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldE5hbWUiCiAgcmV0dXJuPSJqYXZhLmxhbmcuU3RyaW5nIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTI1NjcwOCw2ICsyNjE5NTcsOTEgQEAKIDxleGNlcHRpb24gbmFtZT0iU29ja2V0RXhjZXB0aW9uIiB0eXBlPSJqYXZhLm5ldC5Tb2NrZXRFeGNlcHRpb24iPgogPC9leGNlcHRpb24+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0UGFyZW50IgorIHJldHVybj0iamF2YS5uZXQuTmV0d29ya0ludGVyZmFjZSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRTdWJJbnRlcmZhY2VzIgorIHJldHVybj0iamF2YS51dGlsLkVudW1lcmF0aW9uJmx0O2phdmEubmV0Lk5ldHdvcmtJbnRlcmZhY2UmZ3Q7IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImlzTG9vcGJhY2siCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGV4Y2VwdGlvbiBuYW1lPSJTb2NrZXRFeGNlcHRpb24iIHR5cGU9ImphdmEubmV0LlNvY2tldEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJpc1BvaW50VG9Qb2ludCIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8ZXhjZXB0aW9uIG5hbWU9IlNvY2tldEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5uZXQuU29ja2V0RXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImlzVXAiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGV4Y2VwdGlvbiBuYW1lPSJTb2NrZXRFeGNlcHRpb24iIHR5cGU9ImphdmEubmV0LlNvY2tldEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJpc1ZpcnR1YWwiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InN1cHBvcnRzTXVsdGljYXN0IgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxleGNlcHRpb24gbmFtZT0iU29ja2V0RXhjZXB0aW9uIiB0eXBlPSJqYXZhLm5ldC5Tb2NrZXRFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KIDwvY2xhc3M+CiA8Y2xhc3MgbmFtZT0iTm9Sb3V0ZVRvSG9zdEV4Y2VwdGlvbiIKICBleHRlbmRzPSJqYXZhLm5ldC5Tb2NrZXRFeGNlcHRpb24iCkBAIC0yNTcwNDIsOSArMjYyMzc2LDkgQEAKID4KIDxwYXJhbWV0ZXIgbmFtZT0idXJpIiB0eXBlPSJqYXZhLm5ldC5VUkkiPgogPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9InJxc3RNZXRob2QiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPHBhcmFtZXRlciBuYW1lPSJyZXF1ZXN0TWV0aG9kIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KIDwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJycXN0SGVhZGVycyIgdHlwZT0iamF2YS51dGlsLk1hcCZsdDtqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLnV0aWwuTGlzdCZsdDtqYXZhLmxhbmcuU3RyaW5nJmd0OyZndDsiPgorPHBhcmFtZXRlciBuYW1lPSJyZXF1ZXN0SGVhZGVycyIgdHlwZT0iamF2YS51dGlsLk1hcCZsdDtqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLnV0aWwuTGlzdCZsdDtqYXZhLmxhbmcuU3RyaW5nJmd0OyZndDsiPgogPC9wYXJhbWV0ZXI+CiA8ZXhjZXB0aW9uIG5hbWU9IklPRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmlvLklPRXhjZXB0aW9uIj4KIDwvZXhjZXB0aW9uPgpAQCAtMjU3NjE0LDcgKzI2Mjk0OCw3IEBACiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHJvdGVjdGVkIgogPgotPHBhcmFtZXRlciBuYW1lPSJhbkltcGwiIHR5cGU9ImphdmEubmV0LlNvY2tldEltcGwiPgorPHBhcmFtZXRlciBuYW1lPSJpbXBsIiB0eXBlPSJqYXZhLm5ldC5Tb2NrZXRJbXBsIj4KIDwvcGFyYW1ldGVyPgogPGV4Y2VwdGlvbiBuYW1lPSJTb2NrZXRFeGNlcHRpb24iIHR5cGU9ImphdmEubmV0LlNvY2tldEV4Y2VwdGlvbiI+CiA8L2V4Y2VwdGlvbj4KQEAgLTI1ODk0MCw3ICsyNjQyNzQsNyBAQAogPgogPHBhcmFtZXRlciBuYW1lPSJzY2hlbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgogPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9InVzZXJpbmZvIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzxwYXJhbWV0ZXIgbmFtZT0idXNlckluZm8iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgogPC9wYXJhbWV0ZXI+CiA8cGFyYW1ldGVyIG5hbWU9Imhvc3QiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgogPC9wYXJhbWV0ZXI+CkBAIC0yNjA2MjAsNyArMjY1OTU0LDcgQEAKID4KIDxwYXJhbWV0ZXIgbmFtZT0icyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+CiA8L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0iZW5jIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzxwYXJhbWV0ZXIgbmFtZT0iZW5jb2RpbmciIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgogPC9wYXJhbWV0ZXI+CiA8ZXhjZXB0aW9uIG5hbWU9IlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24iIHR5cGU9ImphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiI+CiA8L2V4Y2VwdGlvbj4KQEAgLTI2MDk2Niw2ICsyNjYzMDAsMjggQEAKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+Cis8bWV0aG9kIG5hbWU9ImFycmF5IgorIHJldHVybj0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImFycmF5T2Zmc2V0IgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iY2FwYWNpdHkiCiAgcmV0dXJuPSJpbnQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjYwOTk5LDYgKzI2NjM1NSwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJoYXNBcnJheSIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJoYXNSZW1haW5pbmciCiAgcmV0dXJuPSJib29sZWFuIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTI2MTAxMCw2ICsyNjYzNzcsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iaXNEaXJlY3QiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iaXNSZWFkT25seSIKICByZXR1cm49ImJvb2xlYW4iCiAgYWJzdHJhY3Q9InRydWUiCkBAIC0yNjc0NDYsNyArMjcyODI0LDcgQEAKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+Ci08cGFyYW1ldGVyIG5hbWU9InJlcGwiIHR5cGU9ImJ5dGVbXSI+Cis8cGFyYW1ldGVyIG5hbWU9InJlcGxhY2VtZW50IiB0eXBlPSJieXRlW10iPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ibWFsZm9ybWVkSW5wdXRBY3Rpb24iCkBAIC0yNjc3NjUsNyArMjczMTQzLDcgQEAKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+Ci08cGFyYW1ldGVyIG5hbWU9ImNoYXJzZXQiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPHBhcmFtZXRlciBuYW1lPSJjaGFyc2V0TmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+CiA8L3BhcmFtZXRlcj4KIDwvY29uc3RydWN0b3I+CiA8bWV0aG9kIG5hbWU9ImdldENoYXJzZXROYW1lIgpAQCAtMjY3ODU1LDcgKzI3MzIzMyw3IEBACiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgotPHBhcmFtZXRlciBuYW1lPSJjaGFyc2V0IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzxwYXJhbWV0ZXIgbmFtZT0iY2hhcnNldE5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgogPC9wYXJhbWV0ZXI+CiA8L2NvbnN0cnVjdG9yPgogPG1ldGhvZCBuYW1lPSJnZXRDaGFyc2V0TmFtZSIKQEAgLTI4MTU2Niw2ICsyODY5NDQsMTkgQEAKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+Cis8bWV0aG9kIG5hbWU9ImZyZWUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldEFycmF5IgogIHJldHVybj0iamF2YS5sYW5nLk9iamVjdCIKICBhYnN0cmFjdD0idHJ1ZSIKQEAgLTI4MTc0Niw2ICsyODcxMzcsNzYgQEAKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+Cis8cGFyYW1ldGVyIG5hbWU9ImNhdXNlIiB0eXBlPSJqYXZhLmxhbmcuVGhyb3dhYmxlIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJCYXRjaFVwZGF0ZUV4Y2VwdGlvbiIKKyB0eXBlPSJqYXZhLnNxbC5CYXRjaFVwZGF0ZUV4Y2VwdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InVwZGF0ZUNvdW50cyIgdHlwZT0iaW50W10iPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImNhdXNlIiB0eXBlPSJqYXZhLmxhbmcuVGhyb3dhYmxlIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJCYXRjaFVwZGF0ZUV4Y2VwdGlvbiIKKyB0eXBlPSJqYXZhLnNxbC5CYXRjaFVwZGF0ZUV4Y2VwdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InJlYXNvbiIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idXBkYXRlQ291bnRzIiB0eXBlPSJpbnRbXSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iY2F1c2UiIHR5cGU9ImphdmEubGFuZy5UaHJvd2FibGUiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IkJhdGNoVXBkYXRlRXhjZXB0aW9uIgorIHR5cGU9ImphdmEuc3FsLkJhdGNoVXBkYXRlRXhjZXB0aW9uIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icmVhc29uIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJTUUxTdGF0ZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idXBkYXRlQ291bnRzIiB0eXBlPSJpbnRbXSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iY2F1c2UiIHR5cGU9ImphdmEubGFuZy5UaHJvd2FibGUiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IkJhdGNoVXBkYXRlRXhjZXB0aW9uIgorIHR5cGU9ImphdmEuc3FsLkJhdGNoVXBkYXRlRXhjZXB0aW9uIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icmVhc29uIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJTUUxTdGF0ZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idmVuZG9yQ29kZSIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ1cGRhdGVDb3VudHMiIHR5cGU9ImludFtdIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJjYXVzZSIgdHlwZT0iamF2YS5sYW5nLlRocm93YWJsZSI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iQmF0Y2hVcGRhdGVFeGNlcHRpb24iCisgdHlwZT0iamF2YS5zcWwuQmF0Y2hVcGRhdGVFeGNlcHRpb24iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgogPHBhcmFtZXRlciBuYW1lPSJ1cGRhdGVDb3VudHMiIHR5cGU9ImludFtdIj4KIDwvcGFyYW1ldGVyPgogPC9jb25zdHJ1Y3Rvcj4KQEAgLTI4MTgxMCw2ICsyODcyNzEsMTkgQEAKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+Cis8bWV0aG9kIG5hbWU9ImZyZWUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldEJpbmFyeVN0cmVhbSIKICByZXR1cm49ImphdmEuaW8uSW5wdXRTdHJlYW0iCiAgYWJzdHJhY3Q9InRydWUiCkBAIC0yODE4MjMsNiArMjg3Mjk3LDIzIEBACiA8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KIDwvZXhjZXB0aW9uPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldEJpbmFyeVN0cmVhbSIKKyByZXR1cm49ImphdmEuaW8uSW5wdXRTdHJlYW0iCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icG9zIiB0eXBlPSJsb25nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJsZW5ndGgiIHR5cGU9ImxvbmciPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldEJ5dGVzIgogIHJldHVybj0iYnl0ZVtdIgogIGFic3RyYWN0PSJ0cnVlIgpAQCAtMjgyMTYyLDYgKzI4NzY1MywzNiBAQAogPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+CiA8L2V4Y2VwdGlvbj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRDaGFyYWN0ZXJTdHJlYW0iCisgcmV0dXJuPSJqYXZhLmlvLlJlYWRlciIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwYXJhbWV0ZXJJbmRleCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRDaGFyYWN0ZXJTdHJlYW0iCisgcmV0dXJuPSJqYXZhLmlvLlJlYWRlciIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwYXJhbWV0ZXJOYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJnZXRDbG9iIgogIHJldHVybj0iamF2YS5zcWwuQ2xvYiIKICBhYnN0cmFjdD0idHJ1ZSIKQEAgLTI4MjM3Niw2ICsyODc4OTcsOTYgQEAKIDxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgogPC9leGNlcHRpb24+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0TkNoYXJhY3RlclN0cmVhbSIKKyByZXR1cm49ImphdmEuaW8uUmVhZGVyIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InBhcmFtZXRlckluZGV4IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldE5DaGFyYWN0ZXJTdHJlYW0iCisgcmV0dXJuPSJqYXZhLmlvLlJlYWRlciIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwYXJhbWV0ZXJOYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXROQ2xvYiIKKyByZXR1cm49ImphdmEuc3FsLk5DbG9iIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InBhcmFtZXRlckluZGV4IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldE5DbG9iIgorIHJldHVybj0iamF2YS5zcWwuTkNsb2IiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icGFyYW1ldGVyTmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0TlN0cmluZyIKKyByZXR1cm49ImphdmEubGFuZy5TdHJpbmciCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icGFyYW1ldGVySW5kZXgiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0TlN0cmluZyIKKyByZXR1cm49ImphdmEubGFuZy5TdHJpbmciCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icGFyYW1ldGVyTmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZ2V0T2JqZWN0IgogIHJldHVybj0iamF2YS5sYW5nLk9iamVjdCIKICBhYnN0cmFjdD0idHJ1ZSIKQEAgLTI4MjQ3MCw2ICsyODgwODEsNjYgQEAKIDxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgogPC9leGNlcHRpb24+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0Um93SWQiCisgcmV0dXJuPSJqYXZhLnNxbC5Sb3dJZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwYXJhbWV0ZXJJbmRleCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRSb3dJZCIKKyByZXR1cm49ImphdmEuc3FsLlJvd0lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InBhcmFtZXRlck5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFNRTFhNTCIKKyByZXR1cm49ImphdmEuc3FsLlNRTFhNTCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwYXJhbWV0ZXJJbmRleCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRTUUxYTUwiCisgcmV0dXJuPSJqYXZhLnNxbC5TUUxYTUwiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icGFyYW1ldGVyTmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZ2V0U2hvcnQiCiAgcmV0dXJuPSJzaG9ydCIKICBhYnN0cmFjdD0idHJ1ZSIKQEAgLTI4MjgxNyw2ICsyODg0ODgsNDIgQEAKIDxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgogPC9leGNlcHRpb24+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0QXNjaWlTdHJlYW0iCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InBhcmFtZXRlck5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9IngiIHR5cGU9ImphdmEuaW8uSW5wdXRTdHJlYW0iPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Imxlbmd0aCIgdHlwZT0ibG9uZyI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0QXNjaWlTdHJlYW0iCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InBhcmFtZXRlck5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9IngiIHR5cGU9ImphdmEuaW8uSW5wdXRTdHJlYW0iPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InNldEJpZ0RlY2ltYWwiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJ0cnVlIgpAQCAtMjgyODUzLDYgKzI4ODU2MCw5NSBAQAogPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+CiA8L2V4Y2VwdGlvbj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRCaW5hcnlTdHJlYW0iCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InBhcmFtZXRlck5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9IngiIHR5cGU9ImphdmEuaW8uSW5wdXRTdHJlYW0iPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Imxlbmd0aCIgdHlwZT0ibG9uZyI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0QmluYXJ5U3RyZWFtIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwYXJhbWV0ZXJOYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ4IiB0eXBlPSJqYXZhLmlvLklucHV0U3RyZWFtIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRCbG9iIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwYXJhbWV0ZXJOYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJpbnB1dFN0cmVhbSIgdHlwZT0iamF2YS5pby5JbnB1dFN0cmVhbSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibGVuZ3RoIiB0eXBlPSJsb25nIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRCbG9iIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwYXJhbWV0ZXJOYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ4IiB0eXBlPSJqYXZhLnNxbC5CbG9iIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRCbG9iIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwYXJhbWV0ZXJOYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJpbnB1dFN0cmVhbSIgdHlwZT0iamF2YS5pby5JbnB1dFN0cmVhbSI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2V0Qm9vbGVhbiIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9InRydWUiCkBAIC0yODI5MjMsNiArMjg4NzE5LDk1IEBACiA8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KIDwvZXhjZXB0aW9uPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldENoYXJhY3RlclN0cmVhbSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icGFyYW1ldGVyTmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0icmVhZGVyIiB0eXBlPSJqYXZhLmlvLlJlYWRlciI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibGVuZ3RoIiB0eXBlPSJsb25nIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRDaGFyYWN0ZXJTdHJlYW0iCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InBhcmFtZXRlck5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InJlYWRlciIgdHlwZT0iamF2YS5pby5SZWFkZXIiPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldENsb2IiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InBhcmFtZXRlck5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InJlYWRlciIgdHlwZT0iamF2YS5pby5SZWFkZXIiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Imxlbmd0aCIgdHlwZT0ibG9uZyI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0Q2xvYiIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icGFyYW1ldGVyTmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ieCIgdHlwZT0iamF2YS5zcWwuQ2xvYiI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0Q2xvYiIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icGFyYW1ldGVyTmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0icmVhZGVyIiB0eXBlPSJqYXZhLmlvLlJlYWRlciI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2V0RGF0ZSIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9InRydWUiCkBAIC0yODMwMjcsNiArMjg4OTEyLDExMiBAQAogPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+CiA8L2V4Y2VwdGlvbj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXROQ2hhcmFjdGVyU3RyZWFtIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwYXJhbWV0ZXJOYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZSIgdHlwZT0iamF2YS5pby5SZWFkZXIiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Imxlbmd0aCIgdHlwZT0ibG9uZyI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0TkNoYXJhY3RlclN0cmVhbSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icGFyYW1ldGVyTmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idmFsdWUiIHR5cGU9ImphdmEuaW8uUmVhZGVyIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXROQ2xvYiIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icGFyYW1ldGVyTmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idmFsdWUiIHR5cGU9ImphdmEuc3FsLk5DbG9iIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXROQ2xvYiIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icGFyYW1ldGVyTmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0icmVhZGVyIiB0eXBlPSJqYXZhLmlvLlJlYWRlciI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibGVuZ3RoIiB0eXBlPSJsb25nIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXROQ2xvYiIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icGFyYW1ldGVyTmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0icmVhZGVyIiB0eXBlPSJqYXZhLmlvLlJlYWRlciI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0TlN0cmluZyIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icGFyYW1ldGVyTmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idmFsdWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InNldE51bGwiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJ0cnVlIgpAQCAtMjgzMTIwLDYgKzI4OTExMSw0MCBAQAogPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+CiA8L2V4Y2VwdGlvbj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRSb3dJZCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icGFyYW1ldGVyTmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ieCIgdHlwZT0iamF2YS5zcWwuUm93SWQiPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFNRTFhNTCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icGFyYW1ldGVyTmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ieG1sT2JqZWN0IiB0eXBlPSJqYXZhLnNxbC5TUUxYTUwiPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InNldFNob3J0IgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0idHJ1ZSIKQEAgLTI4MzI1Nyw2ICsyODkyODIsMzkgQEAKIDwvZXhjZXB0aW9uPgogPC9tZXRob2Q+CiA8L2ludGVyZmFjZT4KKzxjbGFzcyBuYW1lPSJDbGllbnRJbmZvU3RhdHVzIgorIGV4dGVuZHM9ImphdmEubGFuZy5FbnVtIgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxtZXRob2QgbmFtZT0idmFsdWVPZiIKKyByZXR1cm49ImphdmEuc3FsLkNsaWVudEluZm9TdGF0dXMiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJ2YWx1ZXMiCisgcmV0dXJuPSJqYXZhLnNxbC5DbGllbnRJbmZvU3RhdHVzW10iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8L2NsYXNzPgogPGludGVyZmFjZSBuYW1lPSJDbG9iIgogIGFic3RyYWN0PSJ0cnVlIgogIHN0YXRpYz0iZmFsc2UiCkBAIC0yODMyNjQsNiArMjg5MzIyLDE5IEBACiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgorPG1ldGhvZCBuYW1lPSJmcmVlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJnZXRBc2NpaVN0cmVhbSIKICByZXR1cm49ImphdmEuaW8uSW5wdXRTdHJlYW0iCiAgYWJzdHJhY3Q9InRydWUiCkBAIC0yODMyOTAsNiArMjg5MzYxLDIzIEBACiA8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KIDwvZXhjZXB0aW9uPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldENoYXJhY3RlclN0cmVhbSIKKyByZXR1cm49ImphdmEuaW8uUmVhZGVyIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InBvcyIgdHlwZT0ibG9uZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibGVuZ3RoIiB0eXBlPSJsb25nIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJnZXRTdWJTdHJpbmciCiAgcmV0dXJuPSJqYXZhLmxhbmcuU3RyaW5nIgogIGFic3RyYWN0PSJ0cnVlIgpAQCAtMjgzNDQ1LDYgKzI4OTUzMyw4IEBACiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgorPGltcGxlbWVudHMgbmFtZT0iamF2YS5zcWwuV3JhcHBlciI+Cis8L2ltcGxlbWVudHM+CiA8bWV0aG9kIG5hbWU9ImNsZWFyV2FybmluZ3MiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJ0cnVlIgpAQCAtMjgzNDg0LDYgKzI4OTU3NCw3NSBAQAogPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+CiA8L2V4Y2VwdGlvbj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJjcmVhdGVBcnJheU9mIgorIHJldHVybj0iamF2YS5zcWwuQXJyYXkiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idHlwZU5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImVsZW1lbnRzIiB0eXBlPSJqYXZhLmxhbmcuT2JqZWN0W10iPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImNyZWF0ZUJsb2IiCisgcmV0dXJuPSJqYXZhLnNxbC5CbG9iIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImNyZWF0ZUNsb2IiCisgcmV0dXJuPSJqYXZhLnNxbC5DbG9iIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImNyZWF0ZU5DbG9iIgorIHJldHVybj0iamF2YS5zcWwuTkNsb2IiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iY3JlYXRlU1FMWE1MIgorIHJldHVybj0iamF2YS5zcWwuU1FMWE1MIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImNyZWF0ZVN0YXRlbWVudCIKICByZXR1cm49ImphdmEuc3FsLlN0YXRlbWVudCIKICBhYnN0cmFjdD0idHJ1ZSIKQEAgLTI4MzUzMyw2ICsyODk2OTIsMjMgQEAKIDxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgogPC9leGNlcHRpb24+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iY3JlYXRlU3RydWN0IgorIHJldHVybj0iamF2YS5zcWwuU3RydWN0IgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InR5cGVOYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJhdHRyaWJ1dGVzIiB0eXBlPSJqYXZhLmxhbmcuT2JqZWN0W10iPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldEF1dG9Db21taXQiCiAgcmV0dXJuPSJib29sZWFuIgogIGFic3RyYWN0PSJ0cnVlIgpAQCAtMjgzNTU5LDYgKzI4OTczNSwzNCBAQAogPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+CiA8L2V4Y2VwdGlvbj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRDbGllbnRJbmZvIgorIHJldHVybj0iamF2YS5sYW5nLlN0cmluZyIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJuYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRDbGllbnRJbmZvIgorIHJldHVybj0iamF2YS51dGlsLlByb3BlcnRpZXMiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZ2V0SG9sZGFiaWxpdHkiCiAgcmV0dXJuPSJpbnQiCiAgYWJzdHJhY3Q9InRydWUiCkBAIC0yODM2NTAsNiArMjg5ODU0LDIxIEBACiA8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KIDwvZXhjZXB0aW9uPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImlzVmFsaWQiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InRpbWVvdXQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ibmF0aXZlU1FMIgogIHJldHVybj0iamF2YS5sYW5nLlN0cmluZyIKICBhYnN0cmFjdD0idHJ1ZSIKQEAgLTI4Mzg5OSw2ICsyOTAxMTgsMzggQEAKIDxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgogPC9leGNlcHRpb24+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0Q2xpZW50SW5mbyIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idmFsdWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTENsaWVudEluZm9FeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTENsaWVudEluZm9FeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0Q2xpZW50SW5mbyIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icHJvcGVydGllcyIgdHlwZT0iamF2YS51dGlsLlByb3BlcnRpZXMiPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTENsaWVudEluZm9FeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTENsaWVudEluZm9FeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2V0SG9sZGFiaWxpdHkiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJ0cnVlIgpAQCAtMjg0MDcxLDYgKzI5MDMyMiwyNiBAQAogPHBhcmFtZXRlciBuYW1lPSJ0cmFuc2ZlclNpemUiIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KIDwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iRGF0YVRydW5jYXRpb24iCisgdHlwZT0iamF2YS5zcWwuRGF0YVRydW5jYXRpb24iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJpbmRleCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJwYXJhbWV0ZXIiIHR5cGU9ImJvb2xlYW4iPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InJlYWQiIHR5cGU9ImJvb2xlYW4iPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImRhdGFTaXplIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InRyYW5zZmVyU2l6ZSIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJjYXVzZSIgdHlwZT0iamF2YS5sYW5nLlRocm93YWJsZSI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+CiA8bWV0aG9kIG5hbWU9ImdldERhdGFTaXplIgogIHJldHVybj0iaW50IgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTI4NDEzNCw2ICsyOTA0MDUsOCBAQAogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KKzxpbXBsZW1lbnRzIG5hbWU9ImphdmEuc3FsLldyYXBwZXIiPgorPC9pbXBsZW1lbnRzPgogPG1ldGhvZCBuYW1lPSJhbGxQcm9jZWR1cmVzQXJlQ2FsbGFibGUiCiAgcmV0dXJuPSJib29sZWFuIgogIGFic3RyYWN0PSJ0cnVlIgpAQCAtMjg0MTYwLDYgKzI5MDQzMywxOSBAQAogPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+CiA8L2V4Y2VwdGlvbj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJhdXRvQ29tbWl0RmFpbHVyZUNsb3Nlc0FsbFJlc3VsdFNldHMiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImRhdGFEZWZpbml0aW9uQ2F1c2VzVHJhbnNhY3Rpb25Db21taXQiCiAgcmV0dXJuPSJib29sZWFuIgogIGFic3RyYWN0PSJ0cnVlIgpAQCAtMjg0Mjk3LDYgKzI5MDU4MywxOSBAQAogPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+CiA8L2V4Y2VwdGlvbj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRDbGllbnRJbmZvUHJvcGVydGllcyIKKyByZXR1cm49ImphdmEuc3FsLlJlc3VsdFNldCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJnZXRDb2x1bW5Qcml2aWxlZ2VzIgogIHJldHVybj0iamF2YS5zcWwuUmVzdWx0U2V0IgogIGFic3RyYWN0PSJ0cnVlIgpAQCAtMjg0NTIyLDYgKzI5MDgyMSw0NiBAQAogPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+CiA8L2V4Y2VwdGlvbj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRGdW5jdGlvbkNvbHVtbnMiCisgcmV0dXJuPSJqYXZhLnNxbC5SZXN1bHRTZXQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY2F0YWxvZyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ic2NoZW1hUGF0dGVybiIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZnVuY3Rpb25OYW1lUGF0dGVybiIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iY29sdW1uTmFtZVBhdHRlcm4iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldEZ1bmN0aW9ucyIKKyByZXR1cm49ImphdmEuc3FsLlJlc3VsdFNldCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjYXRhbG9nIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJzY2hlbWFQYXR0ZXJuIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJmdW5jdGlvbk5hbWVQYXR0ZXJuIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJnZXRJZGVudGlmaWVyUXVvdGVTdHJpbmciCiAgcmV0dXJuPSJqYXZhLmxhbmcuU3RyaW5nIgogIGFic3RyYWN0PSJ0cnVlIgpAQCAtMjg0OTYxLDYgKzI5MTMwMCwxOSBAQAogPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+CiA8L2V4Y2VwdGlvbj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRSb3dJZExpZmV0aW1lIgorIHJldHVybj0iamF2YS5zcWwuUm93SWRMaWZldGltZSIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJnZXRTUUxLZXl3b3JkcyIKICByZXR1cm49ImphdmEubGFuZy5TdHJpbmciCiAgYWJzdHJhY3Q9InRydWUiCkBAIC0yODUwMTMsNiArMjkxMzY1LDIzIEBACiA8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KIDwvZXhjZXB0aW9uPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFNjaGVtYXMiCisgcmV0dXJuPSJqYXZhLnNxbC5SZXN1bHRTZXQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY2F0YWxvZyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ic2NoZW1hUGF0dGVybiIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZ2V0U2VhcmNoU3RyaW5nRXNjYXBlIgogIHJldHVybj0iamF2YS5sYW5nLlN0cmluZyIKICBhYnN0cmFjdD0idHJ1ZSIKQEAgLTI4NjI2Miw2ICsyOTI2MzEsMTkgQEAKIDxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgogPC9leGNlcHRpb24+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic3VwcG9ydHNTdG9yZWRGdW5jdGlvbnNVc2luZ0NhbGxTeW50YXgiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InN1cHBvcnRzU3RvcmVkUHJvY2VkdXJlcyIKICByZXR1cm49ImJvb2xlYW4iCiAgYWJzdHJhY3Q9InRydWUiCkBAIC0yODY1NjcsNiArMjkyOTQ5LDEzOCBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iZnVuY3Rpb25Db2x1bW5JbiIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjEiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iZnVuY3Rpb25Db2x1bW5Jbk91dCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjIiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iZnVuY3Rpb25Db2x1bW5PdXQiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIzIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9ImZ1bmN0aW9uQ29sdW1uUmVzdWx0IgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iNSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJmdW5jdGlvbkNvbHVtblVua25vd24iCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIwIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9ImZ1bmN0aW9uTm9OdWxscyIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjAiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iZnVuY3Rpb25Ob1RhYmxlIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJmdW5jdGlvbk51bGxhYmxlIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJmdW5jdGlvbk51bGxhYmxlVW5rbm93biIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjIiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iZnVuY3Rpb25SZXN1bHRVbmtub3duIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJmdW5jdGlvblJldHVybiIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjQiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iZnVuY3Rpb25SZXR1cm5zVGFibGUiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIyIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9ImltcG9ydGVkS2V5Q2FzY2FkZSIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTI4Njc4Nyw2ICsyOTMzMDEsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9InNxbFN0YXRlU1FMIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJzcWxTdGF0ZVNRTDk5IgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMjg3MzczLDYgKzI5Mzg5OCwxNiBAQAogPgogPC9maWVsZD4KIDwvY2xhc3M+Cis8aW50ZXJmYWNlIG5hbWU9Ik5DbG9iIgorIGFic3RyYWN0PSJ0cnVlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxpbXBsZW1lbnRzIG5hbWU9ImphdmEuc3FsLkNsb2IiPgorPC9pbXBsZW1lbnRzPgorPC9pbnRlcmZhY2U+CiA8aW50ZXJmYWNlIG5hbWU9IlBhcmFtZXRlck1ldGFEYXRhIgogIGFic3RyYWN0PSJ0cnVlIgogIHN0YXRpYz0iZmFsc2UiCkBAIC0yODczODAsNiArMjkzOTE1LDggQEAKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+Cis8aW1wbGVtZW50cyBuYW1lPSJqYXZhLnNxbC5XcmFwcGVyIj4KKzwvaW1wbGVtZW50cz4KIDxtZXRob2QgbmFtZT0iZ2V0UGFyYW1ldGVyQ2xhc3NOYW1lIgogIHJldHVybj0iamF2YS5sYW5nLlN0cmluZyIKICBhYnN0cmFjdD0idHJ1ZSIKQEAgLTI4NzcyNyw2ICsyOTQyNjQsNDIgQEAKIDxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgogPC9leGNlcHRpb24+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0QXNjaWlTdHJlYW0iCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InBhcmFtZXRlckluZGV4IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9IngiIHR5cGU9ImphdmEuaW8uSW5wdXRTdHJlYW0iPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Imxlbmd0aCIgdHlwZT0ibG9uZyI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0QXNjaWlTdHJlYW0iCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InBhcmFtZXRlckluZGV4IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9IngiIHR5cGU9ImphdmEuaW8uSW5wdXRTdHJlYW0iPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InNldEJpZ0RlY2ltYWwiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJ0cnVlIgpAQCAtMjg3NzYzLDYgKzI5NDMzNiw0MiBAQAogPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+CiA8L2V4Y2VwdGlvbj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRCaW5hcnlTdHJlYW0iCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InBhcmFtZXRlckluZGV4IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9IngiIHR5cGU9ImphdmEuaW8uSW5wdXRTdHJlYW0iPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Imxlbmd0aCIgdHlwZT0ibG9uZyI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0QmluYXJ5U3RyZWFtIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwYXJhbWV0ZXJJbmRleCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ4IiB0eXBlPSJqYXZhLmlvLklucHV0U3RyZWFtIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzZXRCbG9iIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0idHJ1ZSIKQEAgLTI4Nzc4MCw2ICsyOTQzODksNDIgQEAKIDxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgogPC9leGNlcHRpb24+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0QmxvYiIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icGFyYW1ldGVySW5kZXgiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iaW5wdXRTdHJlYW0iIHR5cGU9ImphdmEuaW8uSW5wdXRTdHJlYW0iPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Imxlbmd0aCIgdHlwZT0ibG9uZyI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0QmxvYiIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icGFyYW1ldGVySW5kZXgiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iaW5wdXRTdHJlYW0iIHR5cGU9ImphdmEuaW8uSW5wdXRTdHJlYW0iPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InNldEJvb2xlYW4iCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJ0cnVlIgpAQCAtMjg3ODUwLDYgKzI5NDQ5NSw0MiBAQAogPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+CiA8L2V4Y2VwdGlvbj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRDaGFyYWN0ZXJTdHJlYW0iCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InBhcmFtZXRlckluZGV4IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InJlYWRlciIgdHlwZT0iamF2YS5pby5SZWFkZXIiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Imxlbmd0aCIgdHlwZT0ibG9uZyI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0Q2hhcmFjdGVyU3RyZWFtIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwYXJhbWV0ZXJJbmRleCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJyZWFkZXIiIHR5cGU9ImphdmEuaW8uUmVhZGVyIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzZXRDbG9iIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0idHJ1ZSIKQEAgLTI4Nzg2Nyw2ICsyOTQ1NDgsNDIgQEAKIDxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgogPC9leGNlcHRpb24+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0Q2xvYiIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icGFyYW1ldGVySW5kZXgiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0icmVhZGVyIiB0eXBlPSJqYXZhLmlvLlJlYWRlciI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibGVuZ3RoIiB0eXBlPSJsb25nIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRDbG9iIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwYXJhbWV0ZXJJbmRleCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJyZWFkZXIiIHR5cGU9ImphdmEuaW8uUmVhZGVyIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzZXREYXRlIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0idHJ1ZSIKQEAgLTI4Nzk3MSw2ICsyOTQ2ODgsMTEyIEBACiA8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KIDwvZXhjZXB0aW9uPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldE5DaGFyYWN0ZXJTdHJlYW0iCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InBhcmFtZXRlckluZGV4IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InZhbHVlIiB0eXBlPSJqYXZhLmlvLlJlYWRlciI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibGVuZ3RoIiB0eXBlPSJsb25nIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXROQ2hhcmFjdGVyU3RyZWFtIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwYXJhbWV0ZXJJbmRleCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZSIgdHlwZT0iamF2YS5pby5SZWFkZXIiPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldE5DbG9iIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwYXJhbWV0ZXJJbmRleCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZSIgdHlwZT0iamF2YS5zcWwuTkNsb2IiPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldE5DbG9iIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwYXJhbWV0ZXJJbmRleCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJyZWFkZXIiIHR5cGU9ImphdmEuaW8uUmVhZGVyIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJsZW5ndGgiIHR5cGU9ImxvbmciPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldE5DbG9iIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwYXJhbWV0ZXJJbmRleCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJyZWFkZXIiIHR5cGU9ImphdmEuaW8uUmVhZGVyIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXROU3RyaW5nIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwYXJhbWV0ZXJJbmRleCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2V0TnVsbCIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9InRydWUiCkBAIC0yODgwODEsNiArMjk0OTA0LDQwIEBACiA8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KIDwvZXhjZXB0aW9uPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFJvd0lkIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwYXJhbWV0ZXJJbmRleCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ4IiB0eXBlPSJqYXZhLnNxbC5Sb3dJZCI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0U1FMWE1MIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwYXJhbWV0ZXJJbmRleCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ4bWxPYmplY3QiIHR5cGU9ImphdmEuc3FsLlNRTFhNTCI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2V0U2hvcnQiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJ0cnVlIgpAQCAtMjg4Mjk1LDYgKzI5NTE1Miw4IEBACiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgorPGltcGxlbWVudHMgbmFtZT0iamF2YS5zcWwuV3JhcHBlciI+Cis8L2ltcGxlbWVudHM+CiA8bWV0aG9kIG5hbWU9ImFic29sdXRlIgogIHJldHVybj0iYm9vbGVhbiIKICBhYnN0cmFjdD0idHJ1ZSIKQEAgLTI4ODkyNiw2ICsyOTU3ODUsMTkgQEAKIDxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgogPC9leGNlcHRpb24+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0SG9sZGFiaWxpdHkiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZ2V0SW50IgogIHJldHVybj0iaW50IgogIGFic3RyYWN0PSJ0cnVlIgpAQCAtMjg4OTk5LDYgKzI5NTg3MSw5NiBAQAogPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+CiA8L2V4Y2VwdGlvbj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXROQ2hhcmFjdGVyU3RyZWFtIgorIHJldHVybj0iamF2YS5pby5SZWFkZXIiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29sdW1uSW5kZXgiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0TkNoYXJhY3RlclN0cmVhbSIKKyByZXR1cm49ImphdmEuaW8uUmVhZGVyIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbHVtbkxhYmVsIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXROQ2xvYiIKKyByZXR1cm49ImphdmEuc3FsLk5DbG9iIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbHVtbkluZGV4IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldE5DbG9iIgorIHJldHVybj0iamF2YS5zcWwuTkNsb2IiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29sdW1uTGFiZWwiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldE5TdHJpbmciCisgcmV0dXJuPSJqYXZhLmxhbmcuU3RyaW5nIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbHVtbkluZGV4IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldE5TdHJpbmciCisgcmV0dXJuPSJqYXZhLmxhbmcuU3RyaW5nIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbHVtbkxhYmVsIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJnZXRPYmplY3QiCiAgcmV0dXJuPSJqYXZhLmxhbmcuT2JqZWN0IgogIGFic3RyYWN0PSJ0cnVlIgpAQCAtMjg5MTA2LDYgKzI5NjA2OCw2NiBAQAogPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+CiA8L2V4Y2VwdGlvbj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRSb3dJZCIKKyByZXR1cm49ImphdmEuc3FsLlJvd0lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbHVtbkluZGV4IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFJvd0lkIgorIHJldHVybj0iamF2YS5zcWwuUm93SWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29sdW1uTGFiZWwiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFNRTFhNTCIKKyByZXR1cm49ImphdmEuc3FsLlNRTFhNTCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb2x1bW5JbmRleCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRTUUxYTUwiCisgcmV0dXJuPSJqYXZhLnNxbC5TUUxYTUwiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29sdW1uTGFiZWwiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldFNob3J0IgogIHJldHVybj0ic2hvcnQiCiAgYWJzdHJhY3Q9InRydWUiCkBAIC0yODk0MzIsNiArMjk2NDU0LDE5IEBACiA8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KIDwvZXhjZXB0aW9uPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImlzQ2xvc2VkIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJpc0ZpcnN0IgogIHJldHVybj0iYm9vbGVhbiIKICBhYnN0cmFjdD0idHJ1ZSIKQEAgLTI4OTY5Miw2ICsyOTY3MjcsNzggQEAKIDxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgogPC9leGNlcHRpb24+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0idXBkYXRlQXNjaWlTdHJlYW0iCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbHVtbkluZGV4IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9IngiIHR5cGU9ImphdmEuaW8uSW5wdXRTdHJlYW0iPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Imxlbmd0aCIgdHlwZT0ibG9uZyI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0idXBkYXRlQXNjaWlTdHJlYW0iCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbHVtbkxhYmVsIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ4IiB0eXBlPSJqYXZhLmlvLklucHV0U3RyZWFtIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJsZW5ndGgiIHR5cGU9ImxvbmciPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InVwZGF0ZUFzY2lpU3RyZWFtIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb2x1bW5JbmRleCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ4IiB0eXBlPSJqYXZhLmlvLklucHV0U3RyZWFtIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJ1cGRhdGVBc2NpaVN0cmVhbSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29sdW1uTGFiZWwiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9IngiIHR5cGU9ImphdmEuaW8uSW5wdXRTdHJlYW0iPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InVwZGF0ZUJpZ0RlY2ltYWwiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJ0cnVlIgpAQCAtMjg5NzY0LDYgKzI5Njg3MSw3OCBAQAogPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+CiA8L2V4Y2VwdGlvbj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJ1cGRhdGVCaW5hcnlTdHJlYW0iCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbHVtbkluZGV4IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9IngiIHR5cGU9ImphdmEuaW8uSW5wdXRTdHJlYW0iPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Imxlbmd0aCIgdHlwZT0ibG9uZyI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0idXBkYXRlQmluYXJ5U3RyZWFtIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb2x1bW5MYWJlbCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ieCIgdHlwZT0iamF2YS5pby5JbnB1dFN0cmVhbSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibGVuZ3RoIiB0eXBlPSJsb25nIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJ1cGRhdGVCaW5hcnlTdHJlYW0iCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbHVtbkluZGV4IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9IngiIHR5cGU9ImphdmEuaW8uSW5wdXRTdHJlYW0iPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InVwZGF0ZUJpbmFyeVN0cmVhbSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29sdW1uTGFiZWwiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9IngiIHR5cGU9ImphdmEuaW8uSW5wdXRTdHJlYW0iPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InVwZGF0ZUJsb2IiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJ0cnVlIgpAQCAtMjg5Nzk4LDYgKzI5Njk3Nyw3OCBAQAogPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+CiA8L2V4Y2VwdGlvbj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJ1cGRhdGVCbG9iIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb2x1bW5JbmRleCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJpbnB1dFN0cmVhbSIgdHlwZT0iamF2YS5pby5JbnB1dFN0cmVhbSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibGVuZ3RoIiB0eXBlPSJsb25nIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJ1cGRhdGVCbG9iIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb2x1bW5MYWJlbCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iaW5wdXRTdHJlYW0iIHR5cGU9ImphdmEuaW8uSW5wdXRTdHJlYW0iPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Imxlbmd0aCIgdHlwZT0ibG9uZyI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0idXBkYXRlQmxvYiIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29sdW1uSW5kZXgiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iaW5wdXRTdHJlYW0iIHR5cGU9ImphdmEuaW8uSW5wdXRTdHJlYW0iPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InVwZGF0ZUJsb2IiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbHVtbkxhYmVsIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJpbnB1dFN0cmVhbSIgdHlwZT0iamF2YS5pby5JbnB1dFN0cmVhbSI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0idXBkYXRlQm9vbGVhbiIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9InRydWUiCkBAIC0yODk5MzgsNiArMjk3MTg5LDc4IEBACiA8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KIDwvZXhjZXB0aW9uPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InVwZGF0ZUNoYXJhY3RlclN0cmVhbSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29sdW1uSW5kZXgiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ieCIgdHlwZT0iamF2YS5pby5SZWFkZXIiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Imxlbmd0aCIgdHlwZT0ibG9uZyI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0idXBkYXRlQ2hhcmFjdGVyU3RyZWFtIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb2x1bW5MYWJlbCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0icmVhZGVyIiB0eXBlPSJqYXZhLmlvLlJlYWRlciI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibGVuZ3RoIiB0eXBlPSJsb25nIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJ1cGRhdGVDaGFyYWN0ZXJTdHJlYW0iCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbHVtbkluZGV4IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9IngiIHR5cGU9ImphdmEuaW8uUmVhZGVyIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJ1cGRhdGVDaGFyYWN0ZXJTdHJlYW0iCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbHVtbkxhYmVsIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJyZWFkZXIiIHR5cGU9ImphdmEuaW8uUmVhZGVyIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJ1cGRhdGVDbG9iIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0idHJ1ZSIKQEAgLTI4OTk3Miw2ICsyOTcyOTUsNzggQEAKIDxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgogPC9leGNlcHRpb24+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0idXBkYXRlQ2xvYiIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29sdW1uSW5kZXgiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0icmVhZGVyIiB0eXBlPSJqYXZhLmlvLlJlYWRlciI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibGVuZ3RoIiB0eXBlPSJsb25nIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJ1cGRhdGVDbG9iIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb2x1bW5MYWJlbCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0icmVhZGVyIiB0eXBlPSJqYXZhLmlvLlJlYWRlciI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibGVuZ3RoIiB0eXBlPSJsb25nIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJ1cGRhdGVDbG9iIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb2x1bW5JbmRleCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJyZWFkZXIiIHR5cGU9ImphdmEuaW8uUmVhZGVyIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJ1cGRhdGVDbG9iIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb2x1bW5MYWJlbCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0icmVhZGVyIiB0eXBlPSJqYXZhLmlvLlJlYWRlciI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0idXBkYXRlRGF0ZSIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9InRydWUiCkBAIC0yOTAxNDIsNiArMjk3NTM3LDIxOCBAQAogPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+CiA8L2V4Y2VwdGlvbj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJ1cGRhdGVOQ2hhcmFjdGVyU3RyZWFtIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb2x1bW5JbmRleCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ4IiB0eXBlPSJqYXZhLmlvLlJlYWRlciI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibGVuZ3RoIiB0eXBlPSJsb25nIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJ1cGRhdGVOQ2hhcmFjdGVyU3RyZWFtIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb2x1bW5MYWJlbCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0icmVhZGVyIiB0eXBlPSJqYXZhLmlvLlJlYWRlciI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibGVuZ3RoIiB0eXBlPSJsb25nIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJ1cGRhdGVOQ2hhcmFjdGVyU3RyZWFtIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb2x1bW5JbmRleCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ4IiB0eXBlPSJqYXZhLmlvLlJlYWRlciI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0idXBkYXRlTkNoYXJhY3RlclN0cmVhbSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29sdW1uTGFiZWwiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InJlYWRlciIgdHlwZT0iamF2YS5pby5SZWFkZXIiPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InVwZGF0ZU5DbG9iIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb2x1bW5JbmRleCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJuQ2xvYiIgdHlwZT0iamF2YS5zcWwuTkNsb2IiPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InVwZGF0ZU5DbG9iIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb2x1bW5MYWJlbCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibkNsb2IiIHR5cGU9ImphdmEuc3FsLk5DbG9iIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJ1cGRhdGVOQ2xvYiIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29sdW1uSW5kZXgiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0icmVhZGVyIiB0eXBlPSJqYXZhLmlvLlJlYWRlciI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibGVuZ3RoIiB0eXBlPSJsb25nIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJ1cGRhdGVOQ2xvYiIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29sdW1uTGFiZWwiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InJlYWRlciIgdHlwZT0iamF2YS5pby5SZWFkZXIiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Imxlbmd0aCIgdHlwZT0ibG9uZyI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0idXBkYXRlTkNsb2IiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbHVtbkluZGV4IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InJlYWRlciIgdHlwZT0iamF2YS5pby5SZWFkZXIiPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InVwZGF0ZU5DbG9iIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb2x1bW5MYWJlbCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0icmVhZGVyIiB0eXBlPSJqYXZhLmlvLlJlYWRlciI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0idXBkYXRlTlN0cmluZyIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29sdW1uSW5kZXgiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iblN0cmluZyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0idXBkYXRlTlN0cmluZyIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29sdW1uTGFiZWwiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Im5TdHJpbmciIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InVwZGF0ZU51bGwiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJ0cnVlIgpAQCAtMjkwMjkxLDYgKzI5Nzg5OCw3NCBAQAogPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+CiA8L2V4Y2VwdGlvbj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJ1cGRhdGVSb3dJZCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29sdW1uSW5kZXgiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ieCIgdHlwZT0iamF2YS5zcWwuUm93SWQiPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InVwZGF0ZVJvd0lkIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb2x1bW5MYWJlbCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ieCIgdHlwZT0iamF2YS5zcWwuUm93SWQiPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InVwZGF0ZVNRTFhNTCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29sdW1uSW5kZXgiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ieG1sT2JqZWN0IiB0eXBlPSJqYXZhLnNxbC5TUUxYTUwiPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InVwZGF0ZVNRTFhNTCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29sdW1uTGFiZWwiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InhtbE9iamVjdCIgdHlwZT0iamF2YS5zcWwuU1FMWE1MIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJ1cGRhdGVTaG9ydCIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9InRydWUiCkBAIC0yOTA1NTgsNiArMjk4MjMzLDggQEAKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+Cis8aW1wbGVtZW50cyBuYW1lPSJqYXZhLnNxbC5XcmFwcGVyIj4KKzwvaW1wbGVtZW50cz4KIDxtZXRob2QgbmFtZT0iZ2V0Q2F0YWxvZ05hbWUiCiAgcmV0dXJuPSJqYXZhLmxhbmcuU3RyaW5nIgogIGFic3RyYWN0PSJ0cnVlIgpAQCAtMjkwOTA1LDYgKzI5ODU4MiwyMzMgQEAKID4KIDwvZmllbGQ+CiA8L2ludGVyZmFjZT4KKzxpbnRlcmZhY2UgbmFtZT0iUm93SWQiCisgYWJzdHJhY3Q9InRydWUiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPG1ldGhvZCBuYW1lPSJlcXVhbHMiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im9iaiIgdHlwZT0iamF2YS5sYW5nLk9iamVjdCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRCeXRlcyIKKyByZXR1cm49ImJ5dGVbXSIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Imhhc2hDb2RlIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0idG9TdHJpbmciCisgcmV0dXJuPSJqYXZhLmxhbmcuU3RyaW5nIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzwvaW50ZXJmYWNlPgorPGNsYXNzIG5hbWU9IlJvd0lkTGlmZXRpbWUiCisgZXh0ZW5kcz0iamF2YS5sYW5nLkVudW0iCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPG1ldGhvZCBuYW1lPSJ2YWx1ZU9mIgorIHJldHVybj0iamF2YS5zcWwuUm93SWRMaWZldGltZSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJuYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InZhbHVlcyIKKyByZXR1cm49ImphdmEuc3FsLlJvd0lkTGlmZXRpbWVbXSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iU1FMQ2xpZW50SW5mb0V4Y2VwdGlvbiIKKyBleHRlbmRzPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTUUxDbGllbnRJbmZvRXhjZXB0aW9uIgorIHR5cGU9ImphdmEuc3FsLlNRTENsaWVudEluZm9FeGNlcHRpb24iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTUUxDbGllbnRJbmZvRXhjZXB0aW9uIgorIHR5cGU9ImphdmEuc3FsLlNRTENsaWVudEluZm9FeGNlcHRpb24iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJmYWlsZWRQcm9wZXJ0aWVzIiB0eXBlPSJqYXZhLnV0aWwuTWFwJmx0O2phdmEubGFuZy5TdHJpbmcsIGphdmEuc3FsLkNsaWVudEluZm9TdGF0dXMmZ3Q7Ij4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTUUxDbGllbnRJbmZvRXhjZXB0aW9uIgorIHR5cGU9ImphdmEuc3FsLlNRTENsaWVudEluZm9FeGNlcHRpb24iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJmYWlsZWRQcm9wZXJ0aWVzIiB0eXBlPSJqYXZhLnV0aWwuTWFwJmx0O2phdmEubGFuZy5TdHJpbmcsIGphdmEuc3FsLkNsaWVudEluZm9TdGF0dXMmZ3Q7Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJjYXVzZSIgdHlwZT0iamF2YS5sYW5nLlRocm93YWJsZSI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iU1FMQ2xpZW50SW5mb0V4Y2VwdGlvbiIKKyB0eXBlPSJqYXZhLnNxbC5TUUxDbGllbnRJbmZvRXhjZXB0aW9uIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icmVhc29uIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJmYWlsZWRQcm9wZXJ0aWVzIiB0eXBlPSJqYXZhLnV0aWwuTWFwJmx0O2phdmEubGFuZy5TdHJpbmcsIGphdmEuc3FsLkNsaWVudEluZm9TdGF0dXMmZ3Q7Ij4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTUUxDbGllbnRJbmZvRXhjZXB0aW9uIgorIHR5cGU9ImphdmEuc3FsLlNRTENsaWVudEluZm9FeGNlcHRpb24iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJyZWFzb24iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImZhaWxlZFByb3BlcnRpZXMiIHR5cGU9ImphdmEudXRpbC5NYXAmbHQ7amF2YS5sYW5nLlN0cmluZywgamF2YS5zcWwuQ2xpZW50SW5mb1N0YXR1cyZndDsiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImNhdXNlIiB0eXBlPSJqYXZhLmxhbmcuVGhyb3dhYmxlIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTUUxDbGllbnRJbmZvRXhjZXB0aW9uIgorIHR5cGU9ImphdmEuc3FsLlNRTENsaWVudEluZm9FeGNlcHRpb24iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJyZWFzb24iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InNxbFN0YXRlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ2ZW5kb3JDb2RlIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImZhaWxlZFByb3BlcnRpZXMiIHR5cGU9ImphdmEudXRpbC5NYXAmbHQ7amF2YS5sYW5nLlN0cmluZywgamF2YS5zcWwuQ2xpZW50SW5mb1N0YXR1cyZndDsiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IlNRTENsaWVudEluZm9FeGNlcHRpb24iCisgdHlwZT0iamF2YS5zcWwuU1FMQ2xpZW50SW5mb0V4Y2VwdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InJlYXNvbiIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ic3FsU3RhdGUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InZlbmRvckNvZGUiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZmFpbGVkUHJvcGVydGllcyIgdHlwZT0iamF2YS51dGlsLk1hcCZsdDtqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLnNxbC5DbGllbnRJbmZvU3RhdHVzJmd0OyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iY2F1c2UiIHR5cGU9ImphdmEubGFuZy5UaHJvd2FibGUiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IlNRTENsaWVudEluZm9FeGNlcHRpb24iCisgdHlwZT0iamF2YS5zcWwuU1FMQ2xpZW50SW5mb0V4Y2VwdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InJlYXNvbiIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ic3FsU3RhdGUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImZhaWxlZFByb3BlcnRpZXMiIHR5cGU9ImphdmEudXRpbC5NYXAmbHQ7amF2YS5sYW5nLlN0cmluZywgamF2YS5zcWwuQ2xpZW50SW5mb1N0YXR1cyZndDsiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IlNRTENsaWVudEluZm9FeGNlcHRpb24iCisgdHlwZT0iamF2YS5zcWwuU1FMQ2xpZW50SW5mb0V4Y2VwdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InJlYXNvbiIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ic3FsU3RhdGUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImZhaWxlZFByb3BlcnRpZXMiIHR5cGU9ImphdmEudXRpbC5NYXAmbHQ7amF2YS5sYW5nLlN0cmluZywgamF2YS5zcWwuQ2xpZW50SW5mb1N0YXR1cyZndDsiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImNhdXNlIiB0eXBlPSJqYXZhLmxhbmcuVGhyb3dhYmxlIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxtZXRob2QgbmFtZT0iZ2V0RmFpbGVkUHJvcGVydGllcyIKKyByZXR1cm49ImphdmEudXRpbC5NYXAmbHQ7amF2YS5sYW5nLlN0cmluZywgamF2YS5zcWwuQ2xpZW50SW5mb1N0YXR1cyZndDsiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzwvY2xhc3M+CiA8aW50ZXJmYWNlIG5hbWU9IlNRTERhdGEiCiAgYWJzdHJhY3Q9InRydWUiCiAgc3RhdGljPSJmYWxzZSIKQEAgLTI5MDk1OCw2ICsyOTg4NjIsMTExIEBACiA8L2V4Y2VwdGlvbj4KIDwvbWV0aG9kPgogPC9pbnRlcmZhY2U+Cis8Y2xhc3MgbmFtZT0iU1FMRGF0YUV4Y2VwdGlvbiIKKyBleHRlbmRzPSJqYXZhLnNxbC5TUUxOb25UcmFuc2llbnRFeGNlcHRpb24iCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTUUxEYXRhRXhjZXB0aW9uIgorIHR5cGU9ImphdmEuc3FsLlNRTERhdGFFeGNlcHRpb24iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTUUxEYXRhRXhjZXB0aW9uIgorIHR5cGU9ImphdmEuc3FsLlNRTERhdGFFeGNlcHRpb24iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJyZWFzb24iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IlNRTERhdGFFeGNlcHRpb24iCisgdHlwZT0iamF2YS5zcWwuU1FMRGF0YUV4Y2VwdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InJlYXNvbiIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ic3FsU3RhdGUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IlNRTERhdGFFeGNlcHRpb24iCisgdHlwZT0iamF2YS5zcWwuU1FMRGF0YUV4Y2VwdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InJlYXNvbiIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ic3FsU3RhdGUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InZlbmRvckNvZGUiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iU1FMRGF0YUV4Y2VwdGlvbiIKKyB0eXBlPSJqYXZhLnNxbC5TUUxEYXRhRXhjZXB0aW9uIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY2F1c2UiIHR5cGU9ImphdmEubGFuZy5UaHJvd2FibGUiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IlNRTERhdGFFeGNlcHRpb24iCisgdHlwZT0iamF2YS5zcWwuU1FMRGF0YUV4Y2VwdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InJlYXNvbiIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iY2F1c2UiIHR5cGU9ImphdmEubGFuZy5UaHJvd2FibGUiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IlNRTERhdGFFeGNlcHRpb24iCisgdHlwZT0iamF2YS5zcWwuU1FMRGF0YUV4Y2VwdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InJlYXNvbiIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ic3FsU3RhdGUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImNhdXNlIiB0eXBlPSJqYXZhLmxhbmcuVGhyb3dhYmxlIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTUUxEYXRhRXhjZXB0aW9uIgorIHR5cGU9ImphdmEuc3FsLlNRTERhdGFFeGNlcHRpb24iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJyZWFzb24iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InNxbFN0YXRlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ2ZW5kb3JDb2RlIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImNhdXNlIiB0eXBlPSJqYXZhLmxhbmcuVGhyb3dhYmxlIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzwvY2xhc3M+CiA8Y2xhc3MgbmFtZT0iU1FMRXhjZXB0aW9uIgogIGV4dGVuZHM9ImphdmEubGFuZy5FeGNlcHRpb24iCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjkwOTY2LDYgKzI5ODk3NSw4IEBACiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgorPGltcGxlbWVudHMgbmFtZT0iamF2YS5sYW5nLkl0ZXJhYmxlIj4KKzwvaW1wbGVtZW50cz4KIDxpbXBsZW1lbnRzIG5hbWU9ImphdmEuaW8uU2VyaWFsaXphYmxlIj4KIDwvaW1wbGVtZW50cz4KIDxjb25zdHJ1Y3RvciBuYW1lPSJTUUxFeGNlcHRpb24iCkBAIC0yOTEwMTIsNiArMjk5MDIzLDU4IEBACiA8cGFyYW1ldGVyIG5hbWU9InRoZUVycm9yQ29kZSIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgogPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTUUxFeGNlcHRpb24iCisgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idGhlQ2F1c2UiIHR5cGU9ImphdmEubGFuZy5UaHJvd2FibGUiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IlNRTEV4Y2VwdGlvbiIKKyB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ0aGVSZWFzb24iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InRoZUNhdXNlIiB0eXBlPSJqYXZhLmxhbmcuVGhyb3dhYmxlIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTUUxFeGNlcHRpb24iCisgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idGhlUmVhc29uIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ0aGVTUUxTdGF0ZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idGhlQ2F1c2UiIHR5cGU9ImphdmEubGFuZy5UaHJvd2FibGUiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IlNRTEV4Y2VwdGlvbiIKKyB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ0aGVSZWFzb24iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InRoZVNRTFN0YXRlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ0aGVFcnJvckNvZGUiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idGhlQ2F1c2UiIHR5cGU9ImphdmEubGFuZy5UaHJvd2FibGUiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgogPG1ldGhvZCBuYW1lPSJnZXRFcnJvckNvZGUiCiAgcmV0dXJuPSJpbnQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjkxMDQ1LDYgKzI5OTEwOCwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJpdGVyYXRvciIKKyByZXR1cm49ImphdmEudXRpbC5JdGVyYXRvciZsdDtqYXZhLmxhbmcuVGhyb3dhYmxlJmd0OyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzZXROZXh0RXhjZXB0aW9uIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yOTEwNTksNiArMjk5MTMzLDExMSBAQAogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KIDwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iU1FMRmVhdHVyZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiIKKyBleHRlbmRzPSJqYXZhLnNxbC5TUUxOb25UcmFuc2llbnRFeGNlcHRpb24iCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTUUxGZWF0dXJlTm90U3VwcG9ydGVkRXhjZXB0aW9uIgorIHR5cGU9ImphdmEuc3FsLlNRTEZlYXR1cmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTUUxGZWF0dXJlTm90U3VwcG9ydGVkRXhjZXB0aW9uIgorIHR5cGU9ImphdmEuc3FsLlNRTEZlYXR1cmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJyZWFzb24iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IlNRTEZlYXR1cmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24iCisgdHlwZT0iamF2YS5zcWwuU1FMRmVhdHVyZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InJlYXNvbiIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ic3FsU3RhdGUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IlNRTEZlYXR1cmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24iCisgdHlwZT0iamF2YS5zcWwuU1FMRmVhdHVyZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InJlYXNvbiIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ic3FsU3RhdGUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InZlbmRvckNvZGUiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iU1FMRmVhdHVyZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiIKKyB0eXBlPSJqYXZhLnNxbC5TUUxGZWF0dXJlTm90U3VwcG9ydGVkRXhjZXB0aW9uIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY2F1c2UiIHR5cGU9ImphdmEubGFuZy5UaHJvd2FibGUiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IlNRTEZlYXR1cmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24iCisgdHlwZT0iamF2YS5zcWwuU1FMRmVhdHVyZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InJlYXNvbiIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iY2F1c2UiIHR5cGU9ImphdmEubGFuZy5UaHJvd2FibGUiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IlNRTEZlYXR1cmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24iCisgdHlwZT0iamF2YS5zcWwuU1FMRmVhdHVyZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InJlYXNvbiIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ic3FsU3RhdGUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImNhdXNlIiB0eXBlPSJqYXZhLmxhbmcuVGhyb3dhYmxlIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTUUxGZWF0dXJlTm90U3VwcG9ydGVkRXhjZXB0aW9uIgorIHR5cGU9ImphdmEuc3FsLlNRTEZlYXR1cmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJyZWFzb24iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InNxbFN0YXRlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ2ZW5kb3JDb2RlIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImNhdXNlIiB0eXBlPSJqYXZhLmxhbmcuVGhyb3dhYmxlIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzwvY2xhc3M+CiA8aW50ZXJmYWNlIG5hbWU9IlNRTElucHV0IgogIGFic3RyYWN0PSJ0cnVlIgogIHN0YXRpYz0iZmFsc2UiCkBAIC0yOTEyNjEsNiArMjk5NDQwLDMyIEBACiA8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KIDwvZXhjZXB0aW9uPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InJlYWROQ2xvYiIKKyByZXR1cm49ImphdmEuc3FsLk5DbG9iIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InJlYWROU3RyaW5nIgorIHJldHVybj0iamF2YS5sYW5nLlN0cmluZyIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJyZWFkT2JqZWN0IgogIHJldHVybj0iamF2YS5sYW5nLk9iamVjdCIKICBhYnN0cmFjdD0idHJ1ZSIKQEAgLTI5MTI4Nyw2ICsyOTk0OTIsMzIgQEAKIDxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgogPC9leGNlcHRpb24+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icmVhZFJvd0lkIgorIHJldHVybj0iamF2YS5zcWwuUm93SWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icmVhZFNRTFhNTCIKKyByZXR1cm49ImphdmEuc3FsLlNRTFhNTCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJyZWFkU2hvcnQiCiAgcmV0dXJuPSJzaG9ydCIKICBhYnN0cmFjdD0idHJ1ZSIKQEAgLTI5MTM2Niw2ICsyOTk1OTcsNDI2IEBACiA8L2V4Y2VwdGlvbj4KIDwvbWV0aG9kPgogPC9pbnRlcmZhY2U+Cis8Y2xhc3MgbmFtZT0iU1FMSW50ZWdyaXR5Q29uc3RyYWludFZpb2xhdGlvbkV4Y2VwdGlvbiIKKyBleHRlbmRzPSJqYXZhLnNxbC5TUUxOb25UcmFuc2llbnRFeGNlcHRpb24iCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTUUxJbnRlZ3JpdHlDb25zdHJhaW50VmlvbGF0aW9uRXhjZXB0aW9uIgorIHR5cGU9ImphdmEuc3FsLlNRTEludGVncml0eUNvbnN0cmFpbnRWaW9sYXRpb25FeGNlcHRpb24iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTUUxJbnRlZ3JpdHlDb25zdHJhaW50VmlvbGF0aW9uRXhjZXB0aW9uIgorIHR5cGU9ImphdmEuc3FsLlNRTEludGVncml0eUNvbnN0cmFpbnRWaW9sYXRpb25FeGNlcHRpb24iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJyZWFzb24iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IlNRTEludGVncml0eUNvbnN0cmFpbnRWaW9sYXRpb25FeGNlcHRpb24iCisgdHlwZT0iamF2YS5zcWwuU1FMSW50ZWdyaXR5Q29uc3RyYWludFZpb2xhdGlvbkV4Y2VwdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InJlYXNvbiIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ic3FsU3RhdGUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IlNRTEludGVncml0eUNvbnN0cmFpbnRWaW9sYXRpb25FeGNlcHRpb24iCisgdHlwZT0iamF2YS5zcWwuU1FMSW50ZWdyaXR5Q29uc3RyYWludFZpb2xhdGlvbkV4Y2VwdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InJlYXNvbiIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ic3FsU3RhdGUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InZlbmRvckNvZGUiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iU1FMSW50ZWdyaXR5Q29uc3RyYWludFZpb2xhdGlvbkV4Y2VwdGlvbiIKKyB0eXBlPSJqYXZhLnNxbC5TUUxJbnRlZ3JpdHlDb25zdHJhaW50VmlvbGF0aW9uRXhjZXB0aW9uIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY2F1c2UiIHR5cGU9ImphdmEubGFuZy5UaHJvd2FibGUiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IlNRTEludGVncml0eUNvbnN0cmFpbnRWaW9sYXRpb25FeGNlcHRpb24iCisgdHlwZT0iamF2YS5zcWwuU1FMSW50ZWdyaXR5Q29uc3RyYWludFZpb2xhdGlvbkV4Y2VwdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InJlYXNvbiIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iY2F1c2UiIHR5cGU9ImphdmEubGFuZy5UaHJvd2FibGUiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IlNRTEludGVncml0eUNvbnN0cmFpbnRWaW9sYXRpb25FeGNlcHRpb24iCisgdHlwZT0iamF2YS5zcWwuU1FMSW50ZWdyaXR5Q29uc3RyYWludFZpb2xhdGlvbkV4Y2VwdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InJlYXNvbiIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ic3FsU3RhdGUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImNhdXNlIiB0eXBlPSJqYXZhLmxhbmcuVGhyb3dhYmxlIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTUUxJbnRlZ3JpdHlDb25zdHJhaW50VmlvbGF0aW9uRXhjZXB0aW9uIgorIHR5cGU9ImphdmEuc3FsLlNRTEludGVncml0eUNvbnN0cmFpbnRWaW9sYXRpb25FeGNlcHRpb24iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJyZWFzb24iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InNxbFN0YXRlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ2ZW5kb3JDb2RlIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImNhdXNlIiB0eXBlPSJqYXZhLmxhbmcuVGhyb3dhYmxlIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iU1FMSW52YWxpZEF1dGhvcml6YXRpb25TcGVjRXhjZXB0aW9uIgorIGV4dGVuZHM9ImphdmEuc3FsLlNRTE5vblRyYW5zaWVudEV4Y2VwdGlvbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGNvbnN0cnVjdG9yIG5hbWU9IlNRTEludmFsaWRBdXRob3JpemF0aW9uU3BlY0V4Y2VwdGlvbiIKKyB0eXBlPSJqYXZhLnNxbC5TUUxJbnZhbGlkQXV0aG9yaXphdGlvblNwZWNFeGNlcHRpb24iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTUUxJbnZhbGlkQXV0aG9yaXphdGlvblNwZWNFeGNlcHRpb24iCisgdHlwZT0iamF2YS5zcWwuU1FMSW52YWxpZEF1dGhvcml6YXRpb25TcGVjRXhjZXB0aW9uIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icmVhc29uIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTUUxJbnZhbGlkQXV0aG9yaXphdGlvblNwZWNFeGNlcHRpb24iCisgdHlwZT0iamF2YS5zcWwuU1FMSW52YWxpZEF1dGhvcml6YXRpb25TcGVjRXhjZXB0aW9uIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icmVhc29uIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJzcWxTdGF0ZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iU1FMSW52YWxpZEF1dGhvcml6YXRpb25TcGVjRXhjZXB0aW9uIgorIHR5cGU9ImphdmEuc3FsLlNRTEludmFsaWRBdXRob3JpemF0aW9uU3BlY0V4Y2VwdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InJlYXNvbiIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ic3FsU3RhdGUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InZlbmRvckNvZGUiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iU1FMSW52YWxpZEF1dGhvcml6YXRpb25TcGVjRXhjZXB0aW9uIgorIHR5cGU9ImphdmEuc3FsLlNRTEludmFsaWRBdXRob3JpemF0aW9uU3BlY0V4Y2VwdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNhdXNlIiB0eXBlPSJqYXZhLmxhbmcuVGhyb3dhYmxlIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTUUxJbnZhbGlkQXV0aG9yaXphdGlvblNwZWNFeGNlcHRpb24iCisgdHlwZT0iamF2YS5zcWwuU1FMSW52YWxpZEF1dGhvcml6YXRpb25TcGVjRXhjZXB0aW9uIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icmVhc29uIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJjYXVzZSIgdHlwZT0iamF2YS5sYW5nLlRocm93YWJsZSI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iU1FMSW52YWxpZEF1dGhvcml6YXRpb25TcGVjRXhjZXB0aW9uIgorIHR5cGU9ImphdmEuc3FsLlNRTEludmFsaWRBdXRob3JpemF0aW9uU3BlY0V4Y2VwdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InJlYXNvbiIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ic3FsU3RhdGUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImNhdXNlIiB0eXBlPSJqYXZhLmxhbmcuVGhyb3dhYmxlIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTUUxJbnZhbGlkQXV0aG9yaXphdGlvblNwZWNFeGNlcHRpb24iCisgdHlwZT0iamF2YS5zcWwuU1FMSW52YWxpZEF1dGhvcml6YXRpb25TcGVjRXhjZXB0aW9uIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icmVhc29uIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJzcWxTdGF0ZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idmVuZG9yQ29kZSIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJjYXVzZSIgdHlwZT0iamF2YS5sYW5nLlRocm93YWJsZSI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8L2NsYXNzPgorPGNsYXNzIG5hbWU9IlNRTE5vblRyYW5zaWVudENvbm5lY3Rpb25FeGNlcHRpb24iCisgZXh0ZW5kcz0iamF2YS5zcWwuU1FMTm9uVHJhbnNpZW50RXhjZXB0aW9uIgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8Y29uc3RydWN0b3IgbmFtZT0iU1FMTm9uVHJhbnNpZW50Q29ubmVjdGlvbkV4Y2VwdGlvbiIKKyB0eXBlPSJqYXZhLnNxbC5TUUxOb25UcmFuc2llbnRDb25uZWN0aW9uRXhjZXB0aW9uIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iU1FMTm9uVHJhbnNpZW50Q29ubmVjdGlvbkV4Y2VwdGlvbiIKKyB0eXBlPSJqYXZhLnNxbC5TUUxOb25UcmFuc2llbnRDb25uZWN0aW9uRXhjZXB0aW9uIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icmVhc29uIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTUUxOb25UcmFuc2llbnRDb25uZWN0aW9uRXhjZXB0aW9uIgorIHR5cGU9ImphdmEuc3FsLlNRTE5vblRyYW5zaWVudENvbm5lY3Rpb25FeGNlcHRpb24iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJyZWFzb24iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InNxbFN0YXRlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTUUxOb25UcmFuc2llbnRDb25uZWN0aW9uRXhjZXB0aW9uIgorIHR5cGU9ImphdmEuc3FsLlNRTE5vblRyYW5zaWVudENvbm5lY3Rpb25FeGNlcHRpb24iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJyZWFzb24iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InNxbFN0YXRlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ2ZW5kb3JDb2RlIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IlNRTE5vblRyYW5zaWVudENvbm5lY3Rpb25FeGNlcHRpb24iCisgdHlwZT0iamF2YS5zcWwuU1FMTm9uVHJhbnNpZW50Q29ubmVjdGlvbkV4Y2VwdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNhdXNlIiB0eXBlPSJqYXZhLmxhbmcuVGhyb3dhYmxlIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTUUxOb25UcmFuc2llbnRDb25uZWN0aW9uRXhjZXB0aW9uIgorIHR5cGU9ImphdmEuc3FsLlNRTE5vblRyYW5zaWVudENvbm5lY3Rpb25FeGNlcHRpb24iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJyZWFzb24iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImNhdXNlIiB0eXBlPSJqYXZhLmxhbmcuVGhyb3dhYmxlIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTUUxOb25UcmFuc2llbnRDb25uZWN0aW9uRXhjZXB0aW9uIgorIHR5cGU9ImphdmEuc3FsLlNRTE5vblRyYW5zaWVudENvbm5lY3Rpb25FeGNlcHRpb24iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJyZWFzb24iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InNxbFN0YXRlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJjYXVzZSIgdHlwZT0iamF2YS5sYW5nLlRocm93YWJsZSI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iU1FMTm9uVHJhbnNpZW50Q29ubmVjdGlvbkV4Y2VwdGlvbiIKKyB0eXBlPSJqYXZhLnNxbC5TUUxOb25UcmFuc2llbnRDb25uZWN0aW9uRXhjZXB0aW9uIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icmVhc29uIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJzcWxTdGF0ZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idmVuZG9yQ29kZSIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJjYXVzZSIgdHlwZT0iamF2YS5sYW5nLlRocm93YWJsZSI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8L2NsYXNzPgorPGNsYXNzIG5hbWU9IlNRTE5vblRyYW5zaWVudEV4Y2VwdGlvbiIKKyBleHRlbmRzPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTUUxOb25UcmFuc2llbnRFeGNlcHRpb24iCisgdHlwZT0iamF2YS5zcWwuU1FMTm9uVHJhbnNpZW50RXhjZXB0aW9uIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iU1FMTm9uVHJhbnNpZW50RXhjZXB0aW9uIgorIHR5cGU9ImphdmEuc3FsLlNRTE5vblRyYW5zaWVudEV4Y2VwdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InJlYXNvbiIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iU1FMTm9uVHJhbnNpZW50RXhjZXB0aW9uIgorIHR5cGU9ImphdmEuc3FsLlNRTE5vblRyYW5zaWVudEV4Y2VwdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InJlYXNvbiIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ic3FsU3RhdGUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IlNRTE5vblRyYW5zaWVudEV4Y2VwdGlvbiIKKyB0eXBlPSJqYXZhLnNxbC5TUUxOb25UcmFuc2llbnRFeGNlcHRpb24iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJyZWFzb24iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InNxbFN0YXRlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ2ZW5kb3JDb2RlIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IlNRTE5vblRyYW5zaWVudEV4Y2VwdGlvbiIKKyB0eXBlPSJqYXZhLnNxbC5TUUxOb25UcmFuc2llbnRFeGNlcHRpb24iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjYXVzZSIgdHlwZT0iamF2YS5sYW5nLlRocm93YWJsZSI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iU1FMTm9uVHJhbnNpZW50RXhjZXB0aW9uIgorIHR5cGU9ImphdmEuc3FsLlNRTE5vblRyYW5zaWVudEV4Y2VwdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InJlYXNvbiIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iY2F1c2UiIHR5cGU9ImphdmEubGFuZy5UaHJvd2FibGUiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IlNRTE5vblRyYW5zaWVudEV4Y2VwdGlvbiIKKyB0eXBlPSJqYXZhLnNxbC5TUUxOb25UcmFuc2llbnRFeGNlcHRpb24iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJyZWFzb24iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InNxbFN0YXRlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJjYXVzZSIgdHlwZT0iamF2YS5sYW5nLlRocm93YWJsZSI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iU1FMTm9uVHJhbnNpZW50RXhjZXB0aW9uIgorIHR5cGU9ImphdmEuc3FsLlNRTE5vblRyYW5zaWVudEV4Y2VwdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InJlYXNvbiIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ic3FsU3RhdGUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InZlbmRvckNvZGUiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iY2F1c2UiIHR5cGU9ImphdmEubGFuZy5UaHJvd2FibGUiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPC9jbGFzcz4KIDxpbnRlcmZhY2UgbmFtZT0iU1FMT3V0cHV0IgogIGFic3RyYWN0PSJ0cnVlIgogIHN0YXRpYz0iZmFsc2UiCkBAIC0yOTE1OTgsNiArMzAwMjQ5LDM2IEBACiA8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KIDwvZXhjZXB0aW9uPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9IndyaXRlTkNsb2IiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9IngiIHR5cGU9ImphdmEuc3FsLk5DbG9iIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJ3cml0ZU5TdHJpbmciCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9IngiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9IndyaXRlT2JqZWN0IgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0idHJ1ZSIKQEAgLTI5MTYyOCw2ICszMDAzMDksMzYgQEAKIDxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgogPC9leGNlcHRpb24+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0id3JpdGVSb3dJZCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ieCIgdHlwZT0iamF2YS5zcWwuUm93SWQiPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9IndyaXRlU1FMWE1MIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ4IiB0eXBlPSJqYXZhLnNxbC5TUUxYTUwiPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9IndyaXRlU2hvcnQiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJ0cnVlIgpAQCAtMjkxNzU0LDYgKzMwMDQ2NSw2MzYgQEAKIDwvcGFyYW1ldGVyPgogPC9jb25zdHJ1Y3Rvcj4KIDwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iU1FMUmVjb3ZlcmFibGVFeGNlcHRpb24iCisgZXh0ZW5kcz0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8Y29uc3RydWN0b3IgbmFtZT0iU1FMUmVjb3ZlcmFibGVFeGNlcHRpb24iCisgdHlwZT0iamF2YS5zcWwuU1FMUmVjb3ZlcmFibGVFeGNlcHRpb24iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTUUxSZWNvdmVyYWJsZUV4Y2VwdGlvbiIKKyB0eXBlPSJqYXZhLnNxbC5TUUxSZWNvdmVyYWJsZUV4Y2VwdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InJlYXNvbiIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iU1FMUmVjb3ZlcmFibGVFeGNlcHRpb24iCisgdHlwZT0iamF2YS5zcWwuU1FMUmVjb3ZlcmFibGVFeGNlcHRpb24iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJyZWFzb24iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InNxbFN0YXRlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTUUxSZWNvdmVyYWJsZUV4Y2VwdGlvbiIKKyB0eXBlPSJqYXZhLnNxbC5TUUxSZWNvdmVyYWJsZUV4Y2VwdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InJlYXNvbiIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ic3FsU3RhdGUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InZlbmRvckNvZGUiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iU1FMUmVjb3ZlcmFibGVFeGNlcHRpb24iCisgdHlwZT0iamF2YS5zcWwuU1FMUmVjb3ZlcmFibGVFeGNlcHRpb24iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjYXVzZSIgdHlwZT0iamF2YS5sYW5nLlRocm93YWJsZSI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iU1FMUmVjb3ZlcmFibGVFeGNlcHRpb24iCisgdHlwZT0iamF2YS5zcWwuU1FMUmVjb3ZlcmFibGVFeGNlcHRpb24iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJyZWFzb24iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImNhdXNlIiB0eXBlPSJqYXZhLmxhbmcuVGhyb3dhYmxlIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTUUxSZWNvdmVyYWJsZUV4Y2VwdGlvbiIKKyB0eXBlPSJqYXZhLnNxbC5TUUxSZWNvdmVyYWJsZUV4Y2VwdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InJlYXNvbiIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ic3FsU3RhdGUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImNhdXNlIiB0eXBlPSJqYXZhLmxhbmcuVGhyb3dhYmxlIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTUUxSZWNvdmVyYWJsZUV4Y2VwdGlvbiIKKyB0eXBlPSJqYXZhLnNxbC5TUUxSZWNvdmVyYWJsZUV4Y2VwdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InJlYXNvbiIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ic3FsU3RhdGUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InZlbmRvckNvZGUiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iY2F1c2UiIHR5cGU9ImphdmEubGFuZy5UaHJvd2FibGUiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJTUUxTeW50YXhFcnJvckV4Y2VwdGlvbiIKKyBleHRlbmRzPSJqYXZhLnNxbC5TUUxOb25UcmFuc2llbnRFeGNlcHRpb24iCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTUUxTeW50YXhFcnJvckV4Y2VwdGlvbiIKKyB0eXBlPSJqYXZhLnNxbC5TUUxTeW50YXhFcnJvckV4Y2VwdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IlNRTFN5bnRheEVycm9yRXhjZXB0aW9uIgorIHR5cGU9ImphdmEuc3FsLlNRTFN5bnRheEVycm9yRXhjZXB0aW9uIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icmVhc29uIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTUUxTeW50YXhFcnJvckV4Y2VwdGlvbiIKKyB0eXBlPSJqYXZhLnNxbC5TUUxTeW50YXhFcnJvckV4Y2VwdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InJlYXNvbiIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ic3FsU3RhdGUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IlNRTFN5bnRheEVycm9yRXhjZXB0aW9uIgorIHR5cGU9ImphdmEuc3FsLlNRTFN5bnRheEVycm9yRXhjZXB0aW9uIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icmVhc29uIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJzcWxTdGF0ZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idmVuZG9yQ29kZSIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTUUxTeW50YXhFcnJvckV4Y2VwdGlvbiIKKyB0eXBlPSJqYXZhLnNxbC5TUUxTeW50YXhFcnJvckV4Y2VwdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNhdXNlIiB0eXBlPSJqYXZhLmxhbmcuVGhyb3dhYmxlIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTUUxTeW50YXhFcnJvckV4Y2VwdGlvbiIKKyB0eXBlPSJqYXZhLnNxbC5TUUxTeW50YXhFcnJvckV4Y2VwdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InJlYXNvbiIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iY2F1c2UiIHR5cGU9ImphdmEubGFuZy5UaHJvd2FibGUiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IlNRTFN5bnRheEVycm9yRXhjZXB0aW9uIgorIHR5cGU9ImphdmEuc3FsLlNRTFN5bnRheEVycm9yRXhjZXB0aW9uIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icmVhc29uIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJzcWxTdGF0ZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iY2F1c2UiIHR5cGU9ImphdmEubGFuZy5UaHJvd2FibGUiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IlNRTFN5bnRheEVycm9yRXhjZXB0aW9uIgorIHR5cGU9ImphdmEuc3FsLlNRTFN5bnRheEVycm9yRXhjZXB0aW9uIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icmVhc29uIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJzcWxTdGF0ZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idmVuZG9yQ29kZSIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJjYXVzZSIgdHlwZT0iamF2YS5sYW5nLlRocm93YWJsZSI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8L2NsYXNzPgorPGNsYXNzIG5hbWU9IlNRTFRpbWVvdXRFeGNlcHRpb24iCisgZXh0ZW5kcz0iamF2YS5zcWwuU1FMVHJhbnNpZW50RXhjZXB0aW9uIgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8Y29uc3RydWN0b3IgbmFtZT0iU1FMVGltZW91dEV4Y2VwdGlvbiIKKyB0eXBlPSJqYXZhLnNxbC5TUUxUaW1lb3V0RXhjZXB0aW9uIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iU1FMVGltZW91dEV4Y2VwdGlvbiIKKyB0eXBlPSJqYXZhLnNxbC5TUUxUaW1lb3V0RXhjZXB0aW9uIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icmVhc29uIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTUUxUaW1lb3V0RXhjZXB0aW9uIgorIHR5cGU9ImphdmEuc3FsLlNRTFRpbWVvdXRFeGNlcHRpb24iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJyZWFzb24iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InNxbFN0YXRlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTUUxUaW1lb3V0RXhjZXB0aW9uIgorIHR5cGU9ImphdmEuc3FsLlNRTFRpbWVvdXRFeGNlcHRpb24iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJyZWFzb24iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InNxbFN0YXRlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ2ZW5kb3JDb2RlIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IlNRTFRpbWVvdXRFeGNlcHRpb24iCisgdHlwZT0iamF2YS5zcWwuU1FMVGltZW91dEV4Y2VwdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNhdXNlIiB0eXBlPSJqYXZhLmxhbmcuVGhyb3dhYmxlIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTUUxUaW1lb3V0RXhjZXB0aW9uIgorIHR5cGU9ImphdmEuc3FsLlNRTFRpbWVvdXRFeGNlcHRpb24iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJyZWFzb24iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImNhdXNlIiB0eXBlPSJqYXZhLmxhbmcuVGhyb3dhYmxlIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTUUxUaW1lb3V0RXhjZXB0aW9uIgorIHR5cGU9ImphdmEuc3FsLlNRTFRpbWVvdXRFeGNlcHRpb24iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJyZWFzb24iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InNxbFN0YXRlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJjYXVzZSIgdHlwZT0iamF2YS5sYW5nLlRocm93YWJsZSI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iU1FMVGltZW91dEV4Y2VwdGlvbiIKKyB0eXBlPSJqYXZhLnNxbC5TUUxUaW1lb3V0RXhjZXB0aW9uIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icmVhc29uIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJzcWxTdGF0ZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idmVuZG9yQ29kZSIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJjYXVzZSIgdHlwZT0iamF2YS5sYW5nLlRocm93YWJsZSI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8L2NsYXNzPgorPGNsYXNzIG5hbWU9IlNRTFRyYW5zYWN0aW9uUm9sbGJhY2tFeGNlcHRpb24iCisgZXh0ZW5kcz0iamF2YS5zcWwuU1FMVHJhbnNpZW50RXhjZXB0aW9uIgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8Y29uc3RydWN0b3IgbmFtZT0iU1FMVHJhbnNhY3Rpb25Sb2xsYmFja0V4Y2VwdGlvbiIKKyB0eXBlPSJqYXZhLnNxbC5TUUxUcmFuc2FjdGlvblJvbGxiYWNrRXhjZXB0aW9uIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iU1FMVHJhbnNhY3Rpb25Sb2xsYmFja0V4Y2VwdGlvbiIKKyB0eXBlPSJqYXZhLnNxbC5TUUxUcmFuc2FjdGlvblJvbGxiYWNrRXhjZXB0aW9uIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icmVhc29uIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTUUxUcmFuc2FjdGlvblJvbGxiYWNrRXhjZXB0aW9uIgorIHR5cGU9ImphdmEuc3FsLlNRTFRyYW5zYWN0aW9uUm9sbGJhY2tFeGNlcHRpb24iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJyZWFzb24iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InNxbFN0YXRlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTUUxUcmFuc2FjdGlvblJvbGxiYWNrRXhjZXB0aW9uIgorIHR5cGU9ImphdmEuc3FsLlNRTFRyYW5zYWN0aW9uUm9sbGJhY2tFeGNlcHRpb24iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJyZWFzb24iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InNxbFN0YXRlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ2ZW5kb3JDb2RlIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IlNRTFRyYW5zYWN0aW9uUm9sbGJhY2tFeGNlcHRpb24iCisgdHlwZT0iamF2YS5zcWwuU1FMVHJhbnNhY3Rpb25Sb2xsYmFja0V4Y2VwdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNhdXNlIiB0eXBlPSJqYXZhLmxhbmcuVGhyb3dhYmxlIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTUUxUcmFuc2FjdGlvblJvbGxiYWNrRXhjZXB0aW9uIgorIHR5cGU9ImphdmEuc3FsLlNRTFRyYW5zYWN0aW9uUm9sbGJhY2tFeGNlcHRpb24iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJyZWFzb24iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImNhdXNlIiB0eXBlPSJqYXZhLmxhbmcuVGhyb3dhYmxlIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTUUxUcmFuc2FjdGlvblJvbGxiYWNrRXhjZXB0aW9uIgorIHR5cGU9ImphdmEuc3FsLlNRTFRyYW5zYWN0aW9uUm9sbGJhY2tFeGNlcHRpb24iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJyZWFzb24iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InNxbFN0YXRlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJjYXVzZSIgdHlwZT0iamF2YS5sYW5nLlRocm93YWJsZSI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iU1FMVHJhbnNhY3Rpb25Sb2xsYmFja0V4Y2VwdGlvbiIKKyB0eXBlPSJqYXZhLnNxbC5TUUxUcmFuc2FjdGlvblJvbGxiYWNrRXhjZXB0aW9uIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icmVhc29uIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJzcWxTdGF0ZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idmVuZG9yQ29kZSIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJjYXVzZSIgdHlwZT0iamF2YS5sYW5nLlRocm93YWJsZSI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8L2NsYXNzPgorPGNsYXNzIG5hbWU9IlNRTFRyYW5zaWVudENvbm5lY3Rpb25FeGNlcHRpb24iCisgZXh0ZW5kcz0iamF2YS5zcWwuU1FMVHJhbnNpZW50RXhjZXB0aW9uIgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8Y29uc3RydWN0b3IgbmFtZT0iU1FMVHJhbnNpZW50Q29ubmVjdGlvbkV4Y2VwdGlvbiIKKyB0eXBlPSJqYXZhLnNxbC5TUUxUcmFuc2llbnRDb25uZWN0aW9uRXhjZXB0aW9uIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iU1FMVHJhbnNpZW50Q29ubmVjdGlvbkV4Y2VwdGlvbiIKKyB0eXBlPSJqYXZhLnNxbC5TUUxUcmFuc2llbnRDb25uZWN0aW9uRXhjZXB0aW9uIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icmVhc29uIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTUUxUcmFuc2llbnRDb25uZWN0aW9uRXhjZXB0aW9uIgorIHR5cGU9ImphdmEuc3FsLlNRTFRyYW5zaWVudENvbm5lY3Rpb25FeGNlcHRpb24iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJyZWFzb24iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InNxbFN0YXRlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTUUxUcmFuc2llbnRDb25uZWN0aW9uRXhjZXB0aW9uIgorIHR5cGU9ImphdmEuc3FsLlNRTFRyYW5zaWVudENvbm5lY3Rpb25FeGNlcHRpb24iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJyZWFzb24iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InNxbFN0YXRlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ2ZW5kb3JDb2RlIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IlNRTFRyYW5zaWVudENvbm5lY3Rpb25FeGNlcHRpb24iCisgdHlwZT0iamF2YS5zcWwuU1FMVHJhbnNpZW50Q29ubmVjdGlvbkV4Y2VwdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNhdXNlIiB0eXBlPSJqYXZhLmxhbmcuVGhyb3dhYmxlIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTUUxUcmFuc2llbnRDb25uZWN0aW9uRXhjZXB0aW9uIgorIHR5cGU9ImphdmEuc3FsLlNRTFRyYW5zaWVudENvbm5lY3Rpb25FeGNlcHRpb24iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJyZWFzb24iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImNhdXNlIiB0eXBlPSJqYXZhLmxhbmcuVGhyb3dhYmxlIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTUUxUcmFuc2llbnRDb25uZWN0aW9uRXhjZXB0aW9uIgorIHR5cGU9ImphdmEuc3FsLlNRTFRyYW5zaWVudENvbm5lY3Rpb25FeGNlcHRpb24iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJyZWFzb24iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InNxbFN0YXRlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJjYXVzZSIgdHlwZT0iamF2YS5sYW5nLlRocm93YWJsZSI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iU1FMVHJhbnNpZW50Q29ubmVjdGlvbkV4Y2VwdGlvbiIKKyB0eXBlPSJqYXZhLnNxbC5TUUxUcmFuc2llbnRDb25uZWN0aW9uRXhjZXB0aW9uIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icmVhc29uIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJzcWxTdGF0ZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idmVuZG9yQ29kZSIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJjYXVzZSIgdHlwZT0iamF2YS5sYW5nLlRocm93YWJsZSI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8L2NsYXNzPgorPGNsYXNzIG5hbWU9IlNRTFRyYW5zaWVudEV4Y2VwdGlvbiIKKyBleHRlbmRzPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTUUxUcmFuc2llbnRFeGNlcHRpb24iCisgdHlwZT0iamF2YS5zcWwuU1FMVHJhbnNpZW50RXhjZXB0aW9uIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iU1FMVHJhbnNpZW50RXhjZXB0aW9uIgorIHR5cGU9ImphdmEuc3FsLlNRTFRyYW5zaWVudEV4Y2VwdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InJlYXNvbiIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iU1FMVHJhbnNpZW50RXhjZXB0aW9uIgorIHR5cGU9ImphdmEuc3FsLlNRTFRyYW5zaWVudEV4Y2VwdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InJlYXNvbiIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ic3FsU3RhdGUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IlNRTFRyYW5zaWVudEV4Y2VwdGlvbiIKKyB0eXBlPSJqYXZhLnNxbC5TUUxUcmFuc2llbnRFeGNlcHRpb24iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJyZWFzb24iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InNxbFN0YXRlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ2ZW5kb3JDb2RlIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IlNRTFRyYW5zaWVudEV4Y2VwdGlvbiIKKyB0eXBlPSJqYXZhLnNxbC5TUUxUcmFuc2llbnRFeGNlcHRpb24iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjYXVzZSIgdHlwZT0iamF2YS5sYW5nLlRocm93YWJsZSI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iU1FMVHJhbnNpZW50RXhjZXB0aW9uIgorIHR5cGU9ImphdmEuc3FsLlNRTFRyYW5zaWVudEV4Y2VwdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InJlYXNvbiIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iY2F1c2UiIHR5cGU9ImphdmEubGFuZy5UaHJvd2FibGUiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IlNRTFRyYW5zaWVudEV4Y2VwdGlvbiIKKyB0eXBlPSJqYXZhLnNxbC5TUUxUcmFuc2llbnRFeGNlcHRpb24iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJyZWFzb24iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InNxbFN0YXRlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJjYXVzZSIgdHlwZT0iamF2YS5sYW5nLlRocm93YWJsZSI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iU1FMVHJhbnNpZW50RXhjZXB0aW9uIgorIHR5cGU9ImphdmEuc3FsLlNRTFRyYW5zaWVudEV4Y2VwdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InJlYXNvbiIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ic3FsU3RhdGUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InZlbmRvckNvZGUiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iY2F1c2UiIHR5cGU9ImphdmEubGFuZy5UaHJvd2FibGUiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPC9jbGFzcz4KIDxjbGFzcyBuYW1lPSJTUUxXYXJuaW5nIgogIGV4dGVuZHM9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yOTE4MDgsNiArMzAxMTQ5LDU4IEBACiA8cGFyYW1ldGVyIG5hbWU9InRoZUVycm9yQ29kZSIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgogPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTUUxXYXJuaW5nIgorIHR5cGU9ImphdmEuc3FsLlNRTFdhcm5pbmciCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjYXVzZSIgdHlwZT0iamF2YS5sYW5nLlRocm93YWJsZSI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iU1FMV2FybmluZyIKKyB0eXBlPSJqYXZhLnNxbC5TUUxXYXJuaW5nIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icmVhc29uIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJjYXVzZSIgdHlwZT0iamF2YS5sYW5nLlRocm93YWJsZSI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iU1FMV2FybmluZyIKKyB0eXBlPSJqYXZhLnNxbC5TUUxXYXJuaW5nIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icmVhc29uIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJTUUxTdGF0ZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iY2F1c2UiIHR5cGU9ImphdmEubGFuZy5UaHJvd2FibGUiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IlNRTFdhcm5pbmciCisgdHlwZT0iamF2YS5zcWwuU1FMV2FybmluZyIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InJlYXNvbiIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iU1FMU3RhdGUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InZlbmRvckNvZGUiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iY2F1c2UiIHR5cGU9ImphdmEubGFuZy5UaHJvd2FibGUiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgogPG1ldGhvZCBuYW1lPSJnZXROZXh0V2FybmluZyIKICByZXR1cm49ImphdmEuc3FsLlNRTFdhcm5pbmciCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjkxODMzLDYgKzMwMTIyNiwxMzcgQEAKIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+CiA8L2NsYXNzPgorPGludGVyZmFjZSBuYW1lPSJTUUxYTUwiCisgYWJzdHJhY3Q9InRydWUiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPG1ldGhvZCBuYW1lPSJmcmVlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRCaW5hcnlTdHJlYW0iCisgcmV0dXJuPSJqYXZhLmlvLklucHV0U3RyZWFtIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldENoYXJhY3RlclN0cmVhbSIKKyByZXR1cm49ImphdmEuaW8uUmVhZGVyIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFNvdXJjZSIKKyByZXR1cm49IlQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ic291cmNlQ2xhc3MiIHR5cGU9ImphdmEubGFuZy5DbGFzcyZsdDtUJmd0OyI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0U3RyaW5nIgorIHJldHVybj0iamF2YS5sYW5nLlN0cmluZyIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRCaW5hcnlTdHJlYW0iCisgcmV0dXJuPSJqYXZhLmlvLk91dHB1dFN0cmVhbSIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRDaGFyYWN0ZXJTdHJlYW0iCisgcmV0dXJuPSJqYXZhLmlvLldyaXRlciIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRSZXN1bHQiCisgcmV0dXJuPSJUIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InJlc3VsdENsYXNzIiB0eXBlPSJqYXZhLmxhbmcuQ2xhc3MmbHQ7VCZndDsiPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFN0cmluZyIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idmFsdWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8L2ludGVyZmFjZT4KIDxpbnRlcmZhY2UgbmFtZT0iU2F2ZXBvaW50IgogIGFic3RyYWN0PSJ0cnVlIgogIHN0YXRpYz0iZmFsc2UiCkBAIC0yOTE4NzQsNiArMzAxMzk4LDggQEAKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+Cis8aW1wbGVtZW50cyBuYW1lPSJqYXZhLnNxbC5XcmFwcGVyIj4KKzwvaW1wbGVtZW50cz4KIDxtZXRob2QgbmFtZT0iYWRkQmF0Y2giCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJ0cnVlIgpAQCAtMjkyMjk4LDYgKzMwMTgyNCwzMiBAQAogPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+CiA8L2V4Y2VwdGlvbj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJpc0Nsb3NlZCIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iaXNQb29sYWJsZSIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2V0Q3Vyc29yTmFtZSIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9InRydWUiCkBAIC0yOTIzODgsNiArMzAxOTQwLDIxIEBACiA8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KIDwvZXhjZXB0aW9uPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFBvb2xhYmxlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwb29sYWJsZSIgdHlwZT0iYm9vbGVhbiI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2V0UXVlcnlUaW1lb3V0IgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0idHJ1ZSIKQEAgLTI5Mjg5Niw2ICszMDI0NjMsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IkxPTkdOVkFSQ0hBUiIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9Ii0xNiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJMT05HVkFSQklOQVJZIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMjkyOTE4LDYgKzMwMjQ5NiwyOCBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iTkNIQVIiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSItMTUiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iTkNMT0IiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIyMDExIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9Ik5VTEwiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC0yOTI5NDAsNiArMzAyNTQwLDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJOVkFSQ0hBUiIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9Ii05IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9Ik9USEVSIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMjkyOTczLDYgKzMwMjU4NCwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iUk9XSUQiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSItOCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJTTUFMTElOVCIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTI5Mjk4NCw2ICszMDI2MDYsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlNRTFhNTCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjIwMDkiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0iU1RSVUNUIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMjkzMDUxLDYgKzMwMjY4NCw0NCBAQAogPgogPC9maWVsZD4KIDwvY2xhc3M+Cis8aW50ZXJmYWNlIG5hbWU9IldyYXBwZXIiCisgYWJzdHJhY3Q9InRydWUiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPG1ldGhvZCBuYW1lPSJpc1dyYXBwZXJGb3IiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImlmYWNlIiB0eXBlPSJqYXZhLmxhbmcuQ2xhc3MmbHQ7PyZndDsiPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InVud3JhcCIKKyByZXR1cm49IlQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iaWZhY2UiIHR5cGU9ImphdmEubGFuZy5DbGFzcyZsdDtUJmd0OyI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzwvaW50ZXJmYWNlPgogPC9wYWNrYWdlPgogPHBhY2thZ2UgbmFtZT0iamF2YS50ZXh0IgogPgpAQCAtMjkzODQxLDIxICszMDM1MTIsNiBAQAogPHBhcmFtZXRlciBuYW1lPSJ3aGVyZSIgdHlwZT0iamF2YS51dGlsLkxvY2FsZSI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJnZXRJbnQiCi0gcmV0dXJuPSJpbnQiCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9InRydWUiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InByb3RlY3RlZCIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0iYnVmIiB0eXBlPSJieXRlW10iPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9Im9mZnNldCIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldExpbmVJbnN0YW5jZSIKICByZXR1cm49ImphdmEudGV4dC5CcmVha0l0ZXJhdG9yIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTI5Mzg4MCwyMSArMzAzNTM2LDYgQEAKIDxwYXJhbWV0ZXIgbmFtZT0id2hlcmUiIHR5cGU9ImphdmEudXRpbC5Mb2NhbGUiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KLTxtZXRob2QgbmFtZT0iZ2V0TG9uZyIKLSByZXR1cm49ImxvbmciCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9InRydWUiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InByb3RlY3RlZCIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0iYnVmIiB0eXBlPSJieXRlW10iPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9Im9mZnNldCIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldFNlbnRlbmNlSW5zdGFuY2UiCiAgcmV0dXJuPSJqYXZhLnRleHQuQnJlYWtJdGVyYXRvciIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yOTM5MTksMjEgKzMwMzU2MCw2IEBACiA8cGFyYW1ldGVyIG5hbWU9IndoZXJlIiB0eXBlPSJqYXZhLnV0aWwuTG9jYWxlIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9ImdldFNob3J0IgotIHJldHVybj0ic2hvcnQiCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9InRydWUiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InByb3RlY3RlZCIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0iYnVmIiB0eXBlPSJieXRlW10iPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9Im9mZnNldCIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldFRleHQiCiAgcmV0dXJuPSJqYXZhLnRleHQuQ2hhcmFjdGVySXRlcmF0b3IiCiAgYWJzdHJhY3Q9InRydWUiCkBAIC0yOTQ1NTEsMTcgKzMwNDE3NywyNyBAQAogPC9jbGFzcz4KIDxjbGFzcyBuYW1lPSJDb2xsYXRpb25LZXkiCiAgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKLSBhYnN0cmFjdD0iZmFsc2UiCisgYWJzdHJhY3Q9InRydWUiCiAgc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPGltcGxlbWVudHMgbmFtZT0iamF2YS5sYW5nLkNvbXBhcmFibGUiPgogPC9pbXBsZW1lbnRzPgorPGNvbnN0cnVjdG9yIG5hbWU9IkNvbGxhdGlvbktleSIKKyB0eXBlPSJqYXZhLnRleHQuQ29sbGF0aW9uS2V5IgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InByb3RlY3RlZCIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ic291cmNlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KIDxtZXRob2QgbmFtZT0iY29tcGFyZVRvIgogIHJldHVybj0iaW50IgotIGFic3RyYWN0PSJmYWxzZSIKKyBhYnN0cmFjdD0idHJ1ZSIKICBuYXRpdmU9ImZhbHNlIgogIHN5bmNocm9uaXplZD0iZmFsc2UiCiAgc3RhdGljPSJmYWxzZSIKQEAgLTI5NDU4NSw3ICszMDQyMjEsNyBAQAogPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InRvQnl0ZUFycmF5IgogIHJldHVybj0iYnl0ZVtdIgotIGFic3RyYWN0PSJmYWxzZSIKKyBhYnN0cmFjdD0idHJ1ZSIKICBuYXRpdmU9ImZhbHNlIgogIHN5bmNocm9uaXplZD0iZmFsc2UiCiAgc3RhdGljPSJmYWxzZSIKQEAgLTI5NTc1NCw2ICszMDUzOTAsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0QXZhaWxhYmxlTG9jYWxlcyIKKyByZXR1cm49ImphdmEudXRpbC5Mb2NhbGVbXSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldEVyYXMiCiAgcmV0dXJuPSJqYXZhLmxhbmcuU3RyaW5nW10iCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjk1NzY1LDYgKzMwNTQxMiwzMCBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRJbnN0YW5jZSIKKyByZXR1cm49ImphdmEudGV4dC5EYXRlRm9ybWF0U3ltYm9scyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0SW5zdGFuY2UiCisgcmV0dXJuPSJqYXZhLnRleHQuRGF0ZUZvcm1hdFN5bWJvbHMiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJsb2NhbGUiIHR5cGU9ImphdmEudXRpbC5Mb2NhbGUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZ2V0TG9jYWxQYXR0ZXJuQ2hhcnMiCiAgcmV0dXJuPSJqYXZhLmxhbmcuU3RyaW5nIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTI5NTkzMiw3ICszMDU2MDMsNyBAQAogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KLTxwYXJhbWV0ZXIgbmFtZT0iZGF0YSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZ1tdW10iPgorPHBhcmFtZXRlciBuYW1lPSJ6b25lU3RyaW5ncyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZ1tdW10iPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KIDwvY2xhc3M+CkBAIC0yOTYzMDksNyArMzA1OTgwLDcgQEAKICBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgogIGFic3RyYWN0PSJmYWxzZSIKICBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CkBAIC0yOTYzNDYsNiArMzA2MDE3LDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldEF2YWlsYWJsZUxvY2FsZXMiCisgcmV0dXJuPSJqYXZhLnV0aWwuTG9jYWxlW10iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJnZXRDdXJyZW5jeSIKICByZXR1cm49ImphdmEudXRpbC5DdXJyZW5jeSIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yOTYzOTAsNiArMzA2MDcyLDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldEV4cG9uZW50U2VwYXJhdG9yIgorIHJldHVybj0iamF2YS5sYW5nLlN0cmluZyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJnZXRHcm91cGluZ1NlcGFyYXRvciIKICByZXR1cm49ImNoYXIiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjk2NDEyLDYgKzMwNjEwNSwzMCBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRJbnN0YW5jZSIKKyByZXR1cm49ImphdmEudGV4dC5EZWNpbWFsRm9ybWF0U3ltYm9scyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldEluc3RhbmNlIgorIHJldHVybj0iamF2YS50ZXh0LkRlY2ltYWxGb3JtYXRTeW1ib2xzIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImxvY2FsZSIgdHlwZT0iamF2YS51dGlsLkxvY2FsZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJnZXRJbnRlcm5hdGlvbmFsQ3VycmVuY3lTeW1ib2wiCiAgcmV0dXJuPSJqYXZhLmxhbmcuU3RyaW5nIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTI5NjU1Miw2ICszMDYyNjksMTkgQEAKIDxwYXJhbWV0ZXIgbmFtZT0idmFsdWUiIHR5cGU9ImNoYXIiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0RXhwb25lbnRTZXBhcmF0b3IiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzZXRHcm91cGluZ1NlcGFyYXRvciIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjk2ODExLDcgKzMwNjU0MSw3IEBACiAgc3RhdGljPSJmYWxzZSIKICBmaW5hbD0iZmFsc2UiCiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgorIHZpc2liaWxpdHk9InByb3RlY3RlZCIKID4KIDwvY29uc3RydWN0b3I+CiA8bWV0aG9kIG5hbWU9ImNsb25lIgpAQCAtMjk3MDA1LDkgKzMwNjczNSw5IEBACiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgotPHBhcmFtZXRlciBuYW1lPSJ0ZW1wbGF0ZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8cGFyYW1ldGVyIG5hbWU9ImZvcm1hdCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+CiA8L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0ib2JqZWN0cyIgdHlwZT0iamF2YS5sYW5nLk9iamVjdC4uLiI+Cis8cGFyYW1ldGVyIG5hbWU9ImFyZ3MiIHR5cGU9ImphdmEubGFuZy5PYmplY3QuLi4iPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZ2V0Rm9ybWF0cyIKQEAgLTI5NzE5OCw2ICszMDY5MjgsNzggQEAKID4KIDwvZmllbGQ+CiA8L2NsYXNzPgorPGNsYXNzIG5hbWU9Ik5vcm1hbGl6ZXIiCisgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8bWV0aG9kIG5hbWU9ImlzTm9ybWFsaXplZCIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ic3JjIiB0eXBlPSJqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJmb3JtIiB0eXBlPSJqYXZhLnRleHQuTm9ybWFsaXplci5Gb3JtIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im5vcm1hbGl6ZSIKKyByZXR1cm49ImphdmEubGFuZy5TdHJpbmciCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ic3JjIiB0eXBlPSJqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJmb3JtIiB0eXBlPSJqYXZhLnRleHQuTm9ybWFsaXplci5Gb3JtIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8L2NsYXNzPgorPGNsYXNzIG5hbWU9Ik5vcm1hbGl6ZXIuRm9ybSIKKyBleHRlbmRzPSJqYXZhLmxhbmcuRW51bSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxtZXRob2QgbmFtZT0idmFsdWVPZiIKKyByZXR1cm49ImphdmEudGV4dC5Ob3JtYWxpemVyLkZvcm0iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJ2YWx1ZXMiCisgcmV0dXJuPSJqYXZhLnRleHQuTm9ybWFsaXplci5Gb3JtW10iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8L2NsYXNzPgogPGNsYXNzIG5hbWU9Ik51bWJlckZvcm1hdCIKICBleHRlbmRzPSJqYXZhLnRleHQuRm9ybWF0IgogIGFic3RyYWN0PSJ0cnVlIgpAQCAtMjk3MjExLDcgKzMwNzAxMyw3IEBACiAgc3RhdGljPSJmYWxzZSIKICBmaW5hbD0iZmFsc2UiCiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgorIHZpc2liaWxpdHk9InByb3RlY3RlZCIKID4KIDwvY29uc3RydWN0b3I+CiA8bWV0aG9kIG5hbWU9ImZvcm1hdCIKQEAgLTI5NzQ3Nyw2ICszMDcyNzksMTcgQEAKIDxwYXJhbWV0ZXIgbmFtZT0ibG9jYWxlIiB0eXBlPSJqYXZhLnV0aWwuTG9jYWxlIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFJvdW5kaW5nTW9kZSIKKyByZXR1cm49ImphdmEubWF0aC5Sb3VuZGluZ01vZGUiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iaXNHcm91cGluZ1VzZWQiCiAgcmV0dXJuPSJib29sZWFuIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTI5NzYzNSw2ICszMDc0NDgsMTkgQEAKIDxwYXJhbWV0ZXIgbmFtZT0idmFsdWUiIHR5cGU9ImJvb2xlYW4iPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0Um91bmRpbmdNb2RlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icm91bmRpbmdNb2RlIiB0eXBlPSJqYXZhLm1hdGguUm91bmRpbmdNb2RlIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8ZmllbGQgbmFtZT0iRlJBQ1RJT05fRklFTEQiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC0yOTg4NzMsNiArMzA4Njk5LDE0NiBAQAogPgogPC9tZXRob2Q+CiA8L2NsYXNzPgorPGNsYXNzIG5hbWU9IkFic3RyYWN0TWFwLlNpbXBsZUVudHJ5IgorIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGltcGxlbWVudHMgbmFtZT0iamF2YS51dGlsLk1hcC5FbnRyeSI+Cis8L2ltcGxlbWVudHM+Cis8aW1wbGVtZW50cyBuYW1lPSJqYXZhLmlvLlNlcmlhbGl6YWJsZSI+Cis8L2ltcGxlbWVudHM+Cis8Y29uc3RydWN0b3IgbmFtZT0iQWJzdHJhY3RNYXAuU2ltcGxlRW50cnkiCisgdHlwZT0iamF2YS51dGlsLkFic3RyYWN0TWFwLlNpbXBsZUVudHJ5IgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idGhlS2V5IiB0eXBlPSJLIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ0aGVWYWx1ZSIgdHlwZT0iViI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iQWJzdHJhY3RNYXAuU2ltcGxlRW50cnkiCisgdHlwZT0iamF2YS51dGlsLkFic3RyYWN0TWFwLlNpbXBsZUVudHJ5IgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29weUZyb20iIHR5cGU9ImphdmEudXRpbC5NYXAuRW50cnkmbHQ7PyBleHRlbmRzIEssID8gZXh0ZW5kcyBWJmd0OyI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8bWV0aG9kIG5hbWU9ImdldEtleSIKKyByZXR1cm49IksiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0VmFsdWUiCisgcmV0dXJuPSJWIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFZhbHVlIgorIHJldHVybj0iViIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ib2JqZWN0IiB0eXBlPSJWIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8L2NsYXNzPgorPGNsYXNzIG5hbWU9IkFic3RyYWN0TWFwLlNpbXBsZUltbXV0YWJsZUVudHJ5IgorIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGltcGxlbWVudHMgbmFtZT0iamF2YS51dGlsLk1hcC5FbnRyeSI+Cis8L2ltcGxlbWVudHM+Cis8aW1wbGVtZW50cyBuYW1lPSJqYXZhLmlvLlNlcmlhbGl6YWJsZSI+Cis8L2ltcGxlbWVudHM+Cis8Y29uc3RydWN0b3IgbmFtZT0iQWJzdHJhY3RNYXAuU2ltcGxlSW1tdXRhYmxlRW50cnkiCisgdHlwZT0iamF2YS51dGlsLkFic3RyYWN0TWFwLlNpbXBsZUltbXV0YWJsZUVudHJ5IgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idGhlS2V5IiB0eXBlPSJLIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ0aGVWYWx1ZSIgdHlwZT0iViI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iQWJzdHJhY3RNYXAuU2ltcGxlSW1tdXRhYmxlRW50cnkiCisgdHlwZT0iamF2YS51dGlsLkFic3RyYWN0TWFwLlNpbXBsZUltbXV0YWJsZUVudHJ5IgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29weUZyb20iIHR5cGU9ImphdmEudXRpbC5NYXAuRW50cnkmbHQ7PyBleHRlbmRzIEssID8gZXh0ZW5kcyBWJmd0OyI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8bWV0aG9kIG5hbWU9ImdldEtleSIKKyByZXR1cm49IksiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0VmFsdWUiCisgcmV0dXJuPSJWIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFZhbHVlIgorIHJldHVybj0iViIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ib2JqZWN0IiB0eXBlPSJWIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8L2NsYXNzPgogPGNsYXNzIG5hbWU9IkFic3RyYWN0UXVldWUiCiAgZXh0ZW5kcz0iamF2YS51dGlsLkFic3RyYWN0Q29sbGVjdGlvbiIKICBhYnN0cmFjdD0idHJ1ZSIKQEAgLTI5ODk3Niw2ICszMDg5NDIsMzQwIEBACiA+CiA8L2NvbnN0cnVjdG9yPgogPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJBcnJheURlcXVlIgorIGV4dGVuZHM9ImphdmEudXRpbC5BYnN0cmFjdENvbGxlY3Rpb24iCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxpbXBsZW1lbnRzIG5hbWU9ImphdmEubGFuZy5DbG9uZWFibGUiPgorPC9pbXBsZW1lbnRzPgorPGltcGxlbWVudHMgbmFtZT0iamF2YS51dGlsLkRlcXVlIj4KKzwvaW1wbGVtZW50cz4KKzxpbXBsZW1lbnRzIG5hbWU9ImphdmEuaW8uU2VyaWFsaXphYmxlIj4KKzwvaW1wbGVtZW50cz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJBcnJheURlcXVlIgorIHR5cGU9ImphdmEudXRpbC5BcnJheURlcXVlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iQXJyYXlEZXF1ZSIKKyB0eXBlPSJqYXZhLnV0aWwuQXJyYXlEZXF1ZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im1pblNpemUiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iQXJyYXlEZXF1ZSIKKyB0eXBlPSJqYXZhLnV0aWwuQXJyYXlEZXF1ZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImMiIHR5cGU9ImphdmEudXRpbC5Db2xsZWN0aW9uJmx0Oz8gZXh0ZW5kcyBFJmd0OyI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8bWV0aG9kIG5hbWU9ImFkZEZpcnN0IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZSIgdHlwZT0iRSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJhZGRMYXN0IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZSIgdHlwZT0iRSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJjbG9uZSIKKyByZXR1cm49ImphdmEudXRpbC5BcnJheURlcXVlJmx0O0UmZ3Q7IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImRlc2NlbmRpbmdJdGVyYXRvciIKKyByZXR1cm49ImphdmEudXRpbC5JdGVyYXRvciZsdDtFJmd0OyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJlbGVtZW50IgorIHJldHVybj0iRSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRGaXJzdCIKKyByZXR1cm49IkUiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0TGFzdCIKKyByZXR1cm49IkUiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iaXRlcmF0b3IiCisgcmV0dXJuPSJqYXZhLnV0aWwuSXRlcmF0b3ImbHQ7RSZndDsiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib2ZmZXIiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJlIiB0eXBlPSJFIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9mZmVyRmlyc3QiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJlIiB0eXBlPSJFIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9mZmVyTGFzdCIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImUiIHR5cGU9IkUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icGVlayIKKyByZXR1cm49IkUiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icGVla0ZpcnN0IgorIHJldHVybj0iRSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJwZWVrTGFzdCIKKyByZXR1cm49IkUiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icG9sbCIKKyByZXR1cm49IkUiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icG9sbEZpcnN0IgorIHJldHVybj0iRSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJwb2xsTGFzdCIKKyByZXR1cm49IkUiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icG9wIgorIHJldHVybj0iRSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJwdXNoIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZSIgdHlwZT0iRSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJyZW1vdmUiCisgcmV0dXJuPSJFIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InJlbW92ZUZpcnN0IgorIHJldHVybj0iRSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJyZW1vdmVGaXJzdE9jY3VycmVuY2UiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJvYmoiIHR5cGU9ImphdmEubGFuZy5PYmplY3QiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icmVtb3ZlTGFzdCIKKyByZXR1cm49IkUiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icmVtb3ZlTGFzdE9jY3VycmVuY2UiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJvYmoiIHR5cGU9ImphdmEubGFuZy5PYmplY3QiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2l6ZSIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPC9jbGFzcz4KIDxjbGFzcyBuYW1lPSJBcnJheUxpc3QiCiAgZXh0ZW5kcz0iamF2YS51dGlsLkFic3RyYWN0TGlzdCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yOTkxMjQsNiArMzA5NDI0LDI1IEBACiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgorPHBhcmFtZXRlciBuYW1lPSJhcnJheSIgdHlwZT0iYnl0ZVtdIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJzdGFydEluZGV4IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImVuZEluZGV4IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InZhbHVlIiB0eXBlPSJieXRlIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImJpbmFyeVNlYXJjaCIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgogPHBhcmFtZXRlciBuYW1lPSJhcnJheSIgdHlwZT0iY2hhcltdIj4KIDwvcGFyYW1ldGVyPgogPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZSIgdHlwZT0iY2hhciI+CkBAIC0yOTkxMzksNiArMzA5NDU4LDI1IEBACiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgorPHBhcmFtZXRlciBuYW1lPSJhcnJheSIgdHlwZT0iY2hhcltdIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJzdGFydEluZGV4IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImVuZEluZGV4IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InZhbHVlIiB0eXBlPSJjaGFyIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImJpbmFyeVNlYXJjaCIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgogPHBhcmFtZXRlciBuYW1lPSJhcnJheSIgdHlwZT0iZG91YmxlW10iPgogPC9wYXJhbWV0ZXI+CiA8cGFyYW1ldGVyIG5hbWU9InZhbHVlIiB0eXBlPSJkb3VibGUiPgpAQCAtMjk5MTU0LDYgKzMwOTQ5MiwyNSBAQAogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KKzxwYXJhbWV0ZXIgbmFtZT0iYXJyYXkiIHR5cGU9ImRvdWJsZVtdIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJzdGFydEluZGV4IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImVuZEluZGV4IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InZhbHVlIiB0eXBlPSJkb3VibGUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iYmluYXJ5U2VhcmNoIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+CiA8cGFyYW1ldGVyIG5hbWU9ImFycmF5IiB0eXBlPSJmbG9hdFtdIj4KIDwvcGFyYW1ldGVyPgogPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZSIgdHlwZT0iZmxvYXQiPgpAQCAtMjk5MTY5LDYgKzMwOTUyNiwyNSBAQAogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KKzxwYXJhbWV0ZXIgbmFtZT0iYXJyYXkiIHR5cGU9ImZsb2F0W10iPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InN0YXJ0SW5kZXgiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZW5kSW5kZXgiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idmFsdWUiIHR5cGU9ImZsb2F0Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImJpbmFyeVNlYXJjaCIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgogPHBhcmFtZXRlciBuYW1lPSJhcnJheSIgdHlwZT0iaW50W10iPgogPC9wYXJhbWV0ZXI+CiA8cGFyYW1ldGVyIG5hbWU9InZhbHVlIiB0eXBlPSJpbnQiPgpAQCAtMjk5MTg0LDYgKzMwOTU2MCwyNSBAQAogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KKzxwYXJhbWV0ZXIgbmFtZT0iYXJyYXkiIHR5cGU9ImludFtdIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJzdGFydEluZGV4IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImVuZEluZGV4IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InZhbHVlIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iYmluYXJ5U2VhcmNoIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+CiA8cGFyYW1ldGVyIG5hbWU9ImFycmF5IiB0eXBlPSJsb25nW10iPgogPC9wYXJhbWV0ZXI+CiA8cGFyYW1ldGVyIG5hbWU9InZhbHVlIiB0eXBlPSJsb25nIj4KQEAgLTI5OTE5OSw2ICszMDk1OTQsMjUgQEAKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+Cis8cGFyYW1ldGVyIG5hbWU9ImFycmF5IiB0eXBlPSJsb25nW10iPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InN0YXJ0SW5kZXgiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZW5kSW5kZXgiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idmFsdWUiIHR5cGU9ImxvbmciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iYmluYXJ5U2VhcmNoIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+CiA8cGFyYW1ldGVyIG5hbWU9ImFycmF5IiB0eXBlPSJqYXZhLmxhbmcuT2JqZWN0W10iPgogPC9wYXJhbWV0ZXI+CiA8cGFyYW1ldGVyIG5hbWU9InZhbHVlIiB0eXBlPSJqYXZhLmxhbmcuT2JqZWN0Ij4KQEAgLTI5OTIxNCw2ICszMDk2MjgsMjUgQEAKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+Cis8cGFyYW1ldGVyIG5hbWU9ImFycmF5IiB0eXBlPSJqYXZhLmxhbmcuT2JqZWN0W10iPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InN0YXJ0SW5kZXgiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZW5kSW5kZXgiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idmFsdWUiIHR5cGU9ImphdmEubGFuZy5PYmplY3QiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iYmluYXJ5U2VhcmNoIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+CiA8cGFyYW1ldGVyIG5hbWU9ImFycmF5IiB0eXBlPSJUW10iPgogPC9wYXJhbWV0ZXI+CiA8cGFyYW1ldGVyIG5hbWU9InZhbHVlIiB0eXBlPSJUIj4KQEAgLTI5OTIzMSwxMSArMzA5NjY0LDM3NSBAQAogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KKzxwYXJhbWV0ZXIgbmFtZT0iYXJyYXkiIHR5cGU9IlRbXSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ic3RhcnRJbmRleCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJlbmRJbmRleCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZSIgdHlwZT0iVCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iY29tcGFyYXRvciIgdHlwZT0iamF2YS51dGlsLkNvbXBhcmF0b3ImbHQ7PyBzdXBlciBUJmd0OyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJiaW5hcnlTZWFyY2giCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KIDxwYXJhbWV0ZXIgbmFtZT0iYXJyYXkiIHR5cGU9InNob3J0W10iPgogPC9wYXJhbWV0ZXI+CiA8cGFyYW1ldGVyIG5hbWU9InZhbHVlIiB0eXBlPSJzaG9ydCI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJiaW5hcnlTZWFyY2giCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYXJyYXkiIHR5cGU9InNob3J0W10iPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InN0YXJ0SW5kZXgiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZW5kSW5kZXgiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idmFsdWUiIHR5cGU9InNob3J0Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImNvcHlPZiIKKyByZXR1cm49ImJvb2xlYW5bXSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJvcmlnaW5hbCIgdHlwZT0iYm9vbGVhbltdIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJuZXdMZW5ndGgiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJjb3B5T2YiCisgcmV0dXJuPSJieXRlW10iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ib3JpZ2luYWwiIHR5cGU9ImJ5dGVbXSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibmV3TGVuZ3RoIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iY29weU9mIgorIHJldHVybj0iY2hhcltdIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im9yaWdpbmFsIiB0eXBlPSJjaGFyW10iPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Im5ld0xlbmd0aCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImNvcHlPZiIKKyByZXR1cm49ImRvdWJsZVtdIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im9yaWdpbmFsIiB0eXBlPSJkb3VibGVbXSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibmV3TGVuZ3RoIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iY29weU9mIgorIHJldHVybj0iZmxvYXRbXSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJvcmlnaW5hbCIgdHlwZT0iZmxvYXRbXSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibmV3TGVuZ3RoIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iY29weU9mIgorIHJldHVybj0iaW50W10iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ib3JpZ2luYWwiIHR5cGU9ImludFtdIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJuZXdMZW5ndGgiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJjb3B5T2YiCisgcmV0dXJuPSJsb25nW10iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ib3JpZ2luYWwiIHR5cGU9ImxvbmdbXSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibmV3TGVuZ3RoIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iY29weU9mIgorIHJldHVybj0ic2hvcnRbXSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJvcmlnaW5hbCIgdHlwZT0ic2hvcnRbXSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibmV3TGVuZ3RoIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iY29weU9mIgorIHJldHVybj0iVFtdIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im9yaWdpbmFsIiB0eXBlPSJUW10iPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Im5ld0xlbmd0aCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImNvcHlPZiIKKyByZXR1cm49IlRbXSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJvcmlnaW5hbCIgdHlwZT0iVVtdIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJuZXdMZW5ndGgiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibmV3VHlwZSIgdHlwZT0iamF2YS5sYW5nLkNsYXNzJmx0Oz8gZXh0ZW5kcyBUW10mZ3Q7Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImNvcHlPZlJhbmdlIgorIHJldHVybj0iYm9vbGVhbltdIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im9yaWdpbmFsIiB0eXBlPSJib29sZWFuW10iPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InN0YXJ0IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImVuZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImNvcHlPZlJhbmdlIgorIHJldHVybj0iYnl0ZVtdIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im9yaWdpbmFsIiB0eXBlPSJieXRlW10iPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InN0YXJ0IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImVuZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImNvcHlPZlJhbmdlIgorIHJldHVybj0iY2hhcltdIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im9yaWdpbmFsIiB0eXBlPSJjaGFyW10iPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InN0YXJ0IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImVuZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImNvcHlPZlJhbmdlIgorIHJldHVybj0iZG91YmxlW10iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ib3JpZ2luYWwiIHR5cGU9ImRvdWJsZVtdIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJzdGFydCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJlbmQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJjb3B5T2ZSYW5nZSIKKyByZXR1cm49ImZsb2F0W10iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ib3JpZ2luYWwiIHR5cGU9ImZsb2F0W10iPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InN0YXJ0IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImVuZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImNvcHlPZlJhbmdlIgorIHJldHVybj0iaW50W10iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ib3JpZ2luYWwiIHR5cGU9ImludFtdIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJzdGFydCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJlbmQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJjb3B5T2ZSYW5nZSIKKyByZXR1cm49ImxvbmdbXSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJvcmlnaW5hbCIgdHlwZT0ibG9uZ1tdIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJzdGFydCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJlbmQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJjb3B5T2ZSYW5nZSIKKyByZXR1cm49InNob3J0W10iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ib3JpZ2luYWwiIHR5cGU9InNob3J0W10iPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InN0YXJ0IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImVuZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImNvcHlPZlJhbmdlIgorIHJldHVybj0iVFtdIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im9yaWdpbmFsIiB0eXBlPSJUW10iPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InN0YXJ0IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImVuZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImNvcHlPZlJhbmdlIgorIHJldHVybj0iVFtdIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im9yaWdpbmFsIiB0eXBlPSJVW10iPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InN0YXJ0IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImVuZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJuZXdUeXBlIiB0eXBlPSJqYXZhLmxhbmcuQ2xhc3MmbHQ7PyBleHRlbmRzIFRbXSZndDsiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZGVlcEVxdWFscyIKICByZXR1cm49ImJvb2xlYW4iCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMzAwMzE1LDcgKzMxMTExMiw3IEBACiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgotPHBhcmFtZXRlciBuYW1lPSJwb3MiIHR5cGU9ImludCI+Cis8cGFyYW1ldGVyIG5hbWU9ImluZGV4IiB0eXBlPSJpbnQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iY2xlYXIiCkBAIC0zMDAzMjgsOSArMzExMTI1LDkgQEAKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+Ci08cGFyYW1ldGVyIG5hbWU9InBvczEiIHR5cGU9ImludCI+Cis8cGFyYW1ldGVyIG5hbWU9ImZyb21JbmRleCIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJwb3MyIiB0eXBlPSJpbnQiPgorPHBhcmFtZXRlciBuYW1lPSJ0b0luZGV4IiB0eXBlPSJpbnQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iY2xvbmUiCkBAIC0zMDAzNTQsNyArMzExMTUxLDcgQEAKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+Ci08cGFyYW1ldGVyIG5hbWU9InBvcyIgdHlwZT0iaW50Ij4KKzxwYXJhbWV0ZXIgbmFtZT0iaW5kZXgiIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJmbGlwIgpAQCAtMzAwMzY3LDkgKzMxMTE2NCw5IEBACiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgotPHBhcmFtZXRlciBuYW1lPSJwb3MxIiB0eXBlPSJpbnQiPgorPHBhcmFtZXRlciBuYW1lPSJmcm9tSW5kZXgiIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0icG9zMiIgdHlwZT0iaW50Ij4KKzxwYXJhbWV0ZXIgbmFtZT0idG9JbmRleCIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldCIKQEAgLTMwMDM4Miw3ICszMTExNzksNyBAQAogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KLTxwYXJhbWV0ZXIgbmFtZT0icG9zIiB0eXBlPSJpbnQiPgorPHBhcmFtZXRlciBuYW1lPSJpbmRleCIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldCIKQEAgLTMwMDM5NSw5ICszMTExOTIsOSBAQAogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KLTxwYXJhbWV0ZXIgbmFtZT0icG9zMSIgdHlwZT0iaW50Ij4KKzxwYXJhbWV0ZXIgbmFtZT0iZnJvbUluZGV4IiB0eXBlPSJpbnQiPgogPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9InBvczIiIHR5cGU9ImludCI+Cis8cGFyYW1ldGVyIG5hbWU9InRvSW5kZXgiIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJpbnRlcnNlY3RzIgpAQCAtMzAwNDQ1LDcgKzMxMTI0Miw3IEBACiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgotPHBhcmFtZXRlciBuYW1lPSJwb3MiIHR5cGU9ImludCI+Cis8cGFyYW1ldGVyIG5hbWU9ImluZGV4IiB0eXBlPSJpbnQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ibmV4dFNldEJpdCIKQEAgLTMwMDQ1OCw3ICszMTEyNTUsNyBAQAogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KLTxwYXJhbWV0ZXIgbmFtZT0icG9zIiB0eXBlPSJpbnQiPgorPHBhcmFtZXRlciBuYW1lPSJpbmRleCIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9Im9yIgpAQCAtMzAwNDg0LDcgKzMxMTI4MSw3IEBACiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgotPHBhcmFtZXRlciBuYW1lPSJwb3MiIHR5cGU9ImludCI+Cis8cGFyYW1ldGVyIG5hbWU9ImluZGV4IiB0eXBlPSJpbnQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2V0IgpAQCAtMzAwNDk3LDcgKzMxMTI5NCw3IEBACiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgotPHBhcmFtZXRlciBuYW1lPSJwb3MiIHR5cGU9ImludCI+Cis8cGFyYW1ldGVyIG5hbWU9ImluZGV4IiB0eXBlPSJpbnQiPgogPC9wYXJhbWV0ZXI+CiA8cGFyYW1ldGVyIG5hbWU9InZhbCIgdHlwZT0iYm9vbGVhbiI+CiA8L3BhcmFtZXRlcj4KQEAgLTMwMDUxMiw5ICszMTEzMDksOSBAQAogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KLTxwYXJhbWV0ZXIgbmFtZT0icG9zMSIgdHlwZT0iaW50Ij4KKzxwYXJhbWV0ZXIgbmFtZT0iZnJvbUluZGV4IiB0eXBlPSJpbnQiPgogPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9InBvczIiIHR5cGU9ImludCI+Cis8cGFyYW1ldGVyIG5hbWU9InRvSW5kZXgiIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzZXQiCkBAIC0zMDA1MjcsOSArMzExMzI0LDkgQEAKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+Ci08cGFyYW1ldGVyIG5hbWU9InBvczEiIHR5cGU9ImludCI+Cis8cGFyYW1ldGVyIG5hbWU9ImZyb21JbmRleCIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJwb3MyIiB0eXBlPSJpbnQiPgorPHBhcmFtZXRlciBuYW1lPSJ0b0luZGV4IiB0eXBlPSJpbnQiPgogPC9wYXJhbWV0ZXI+CiA8cGFyYW1ldGVyIG5hbWU9InZhbCIgdHlwZT0iYm9vbGVhbiI+CiA8L3BhcmFtZXRlcj4KQEAgLTMwMDc2NSw2ICszMTE1NjIsNDAgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0RGlzcGxheU5hbWUiCisgcmV0dXJuPSJqYXZhLmxhbmcuU3RyaW5nIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJmaWVsZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJzdHlsZSIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJsb2NhbGUiIHR5cGU9ImphdmEudXRpbC5Mb2NhbGUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0RGlzcGxheU5hbWVzIgorIHJldHVybj0iamF2YS51dGlsLk1hcCZsdDtqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuSW50ZWdlciZndDsiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImZpZWxkIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InN0eWxlIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImxvY2FsZSIgdHlwZT0iamF2YS51dGlsLkxvY2FsZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJnZXRGaXJzdERheU9mV2VlayIKICByZXR1cm49ImludCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0zMDExNDUsNiArMzExOTc2LDE3IEBACiA8cGFyYW1ldGVyIG5hbWU9InRpbWV6b25lIiB0eXBlPSJqYXZhLnV0aWwuVGltZVpvbmUiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxmaWVsZCBuYW1lPSJBTExfU1RZTEVTIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJBTSIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTMwMTM2NSw2ICszMTIyMDcsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IkxPTkciCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIyIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9Ik1BUkNIIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMzAxNDk3LDYgKzMxMjM1MCwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iU0hPUlQiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9IlNVTkRBWSIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTMwMTg2NSw2ICszMTI3MjksMTkgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iYSIgdHlwZT0iVC4uLiI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJhc0xpZm9RdWV1ZSIKKyByZXR1cm49ImphdmEudXRpbC5RdWV1ZSZsdDtUJmd0OyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJkZXF1ZSIgdHlwZT0iamF2YS51dGlsLkRlcXVlJmx0O1QmZ3Q7Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImJpbmFyeVNlYXJjaCIKICByZXR1cm49ImludCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0zMDIyMTEsNiArMzEzMDg4LDE5IEBACiA8cGFyYW1ldGVyIG5hbWU9Im9iamVjdCIgdHlwZT0iVCI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJuZXdTZXRGcm9tTWFwIgorIHJldHVybj0iamF2YS51dGlsLlNldCZsdDtFJmd0OyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJtYXAiIHR5cGU9ImphdmEudXRpbC5NYXAmbHQ7RSwgamF2YS5sYW5nLkJvb2xlYW4mZ3Q7Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InJlcGxhY2VBbGwiCiAgcmV0dXJuPSJib29sZWFuIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTMwMzEyMCw2ICszMTQwMTAsMjE3IEBACiA+CiA8L21ldGhvZD4KIDwvY2xhc3M+Cis8aW50ZXJmYWNlIG5hbWU9IkRlcXVlIgorIGFic3RyYWN0PSJ0cnVlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxpbXBsZW1lbnRzIG5hbWU9ImphdmEudXRpbC5RdWV1ZSI+Cis8L2ltcGxlbWVudHM+Cis8bWV0aG9kIG5hbWU9ImFkZEZpcnN0IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJlIiB0eXBlPSJFIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImFkZExhc3QiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImUiIHR5cGU9IkUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZGVzY2VuZGluZ0l0ZXJhdG9yIgorIHJldHVybj0iamF2YS51dGlsLkl0ZXJhdG9yJmx0O0UmZ3Q7IgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0Rmlyc3QiCisgcmV0dXJuPSJFIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0TGFzdCIKKyByZXR1cm49IkUiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvZmZlckZpcnN0IgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJlIiB0eXBlPSJFIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9mZmVyTGFzdCIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZSIgdHlwZT0iRSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJwZWVrRmlyc3QiCisgcmV0dXJuPSJFIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icGVla0xhc3QiCisgcmV0dXJuPSJFIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icG9sbEZpcnN0IgorIHJldHVybj0iRSIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InBvbGxMYXN0IgorIHJldHVybj0iRSIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InBvcCIKKyByZXR1cm49IkUiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJwdXNoIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJlIiB0eXBlPSJFIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InJlbW92ZUZpcnN0IgorIHJldHVybj0iRSIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InJlbW92ZUZpcnN0T2NjdXJyZW5jZSIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibyIgdHlwZT0iamF2YS5sYW5nLk9iamVjdCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJyZW1vdmVMYXN0IgorIHJldHVybj0iRSIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InJlbW92ZUxhc3RPY2N1cnJlbmNlIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJvIiB0eXBlPSJqYXZhLmxhbmcuT2JqZWN0Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8L2ludGVyZmFjZT4KIDxjbGFzcyBuYW1lPSJEaWN0aW9uYXJ5IgogIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCiAgYWJzdHJhY3Q9InRydWUiCkBAIC0zMDUyNzIsNiArMzE2MzczLDggQEAKID4KIDxpbXBsZW1lbnRzIG5hbWU9ImphdmEubGFuZy5DbG9uZWFibGUiPgogPC9pbXBsZW1lbnRzPgorPGltcGxlbWVudHMgbmFtZT0iamF2YS51dGlsLkRlcXVlIj4KKzwvaW1wbGVtZW50cz4KIDxpbXBsZW1lbnRzIG5hbWU9ImphdmEudXRpbC5MaXN0Ij4KIDwvaW1wbGVtZW50cz4KIDxpbXBsZW1lbnRzIG5hbWU9ImphdmEudXRpbC5RdWV1ZSI+CkBAIC0zMDUzMzMsNiArMzE2NDM2LDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImRlc2NlbmRpbmdJdGVyYXRvciIKKyByZXR1cm49ImphdmEudXRpbC5JdGVyYXRvciZsdDtFJmd0OyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJlbGVtZW50IgogIHJldHVybj0iRSIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0zMDUzOTIsNiArMzE2NTA2LDMyIEBACiA8cGFyYW1ldGVyIG5hbWU9Im8iIHR5cGU9IkUiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib2ZmZXJGaXJzdCIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImUiIHR5cGU9IkUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib2ZmZXJMYXN0IgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZSIgdHlwZT0iRSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJwZWVrIgogIHJldHVybj0iRSIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0zMDU0MDMsNiArMzE2NTQzLDI4IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InBlZWtGaXJzdCIKKyByZXR1cm49IkUiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icGVla0xhc3QiCisgcmV0dXJuPSJFIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InBvbGwiCiAgcmV0dXJuPSJFIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTMwNTQxNCw2ICszMTY1NzYsNTIgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icG9sbEZpcnN0IgorIHJldHVybj0iRSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJwb2xsTGFzdCIKKyByZXR1cm49IkUiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icG9wIgorIHJldHVybj0iRSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJwdXNoIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZSIgdHlwZT0iRSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJyZW1vdmUiCiAgcmV0dXJuPSJFIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTMwNTQzNiw2ICszMTY2NDQsMTkgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icmVtb3ZlRmlyc3RPY2N1cnJlbmNlIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibyIgdHlwZT0iamF2YS5sYW5nLk9iamVjdCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJyZW1vdmVMYXN0IgogIHJldHVybj0iRSIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0zMDU0NDcsNiArMzE2NjY4LDE5IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InJlbW92ZUxhc3RPY2N1cnJlbmNlIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibyIgdHlwZT0iamF2YS5sYW5nLk9iamVjdCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzaXplIgogIHJldHVybj0iaW50IgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTMwNjM5NSw2ICszMTc2MjksMTYgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlJPT1QiCisgdHlwZT0iamF2YS51dGlsLkxvY2FsZSIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJTSU1QTElGSUVEX0NISU5FU0UiCiAgdHlwZT0iamF2YS51dGlsLkxvY2FsZSIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMzA2Nzk2LDYgKzMxODA0MCw0MDEgQEAKID4KIDwvbWV0aG9kPgogPC9jbGFzcz4KKzxpbnRlcmZhY2UgbmFtZT0iTmF2aWdhYmxlTWFwIgorIGFic3RyYWN0PSJ0cnVlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxpbXBsZW1lbnRzIG5hbWU9ImphdmEudXRpbC5Tb3J0ZWRNYXAiPgorPC9pbXBsZW1lbnRzPgorPG1ldGhvZCBuYW1lPSJjZWlsaW5nRW50cnkiCisgcmV0dXJuPSJqYXZhLnV0aWwuTWFwLkVudHJ5Jmx0O0ssIFYmZ3Q7IgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImtleSIgdHlwZT0iSyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJjZWlsaW5nS2V5IgorIHJldHVybj0iSyIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJrZXkiIHR5cGU9IksiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZGVzY2VuZGluZ0tleVNldCIKKyByZXR1cm49ImphdmEudXRpbC5OYXZpZ2FibGVTZXQmbHQ7SyZndDsiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJkZXNjZW5kaW5nTWFwIgorIHJldHVybj0iamF2YS51dGlsLk5hdmlnYWJsZU1hcCZsdDtLLCBWJmd0OyIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImZpcnN0RW50cnkiCisgcmV0dXJuPSJqYXZhLnV0aWwuTWFwLkVudHJ5Jmx0O0ssIFYmZ3Q7IgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZmxvb3JFbnRyeSIKKyByZXR1cm49ImphdmEudXRpbC5NYXAuRW50cnkmbHQ7SywgViZndDsiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ia2V5IiB0eXBlPSJLIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImZsb29yS2V5IgorIHJldHVybj0iSyIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJrZXkiIHR5cGU9IksiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iaGVhZE1hcCIKKyByZXR1cm49ImphdmEudXRpbC5OYXZpZ2FibGVNYXAmbHQ7SywgViZndDsiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZW5kS2V5IiB0eXBlPSJLIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJpbmNsdXNpdmUiIHR5cGU9ImJvb2xlYW4iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iaGlnaGVyRW50cnkiCisgcmV0dXJuPSJqYXZhLnV0aWwuTWFwLkVudHJ5Jmx0O0ssIFYmZ3Q7IgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImtleSIgdHlwZT0iSyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJoaWdoZXJLZXkiCisgcmV0dXJuPSJLIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImtleSIgdHlwZT0iSyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJsYXN0RW50cnkiCisgcmV0dXJuPSJqYXZhLnV0aWwuTWFwLkVudHJ5Jmx0O0ssIFYmZ3Q7IgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ibG93ZXJFbnRyeSIKKyByZXR1cm49ImphdmEudXRpbC5NYXAuRW50cnkmbHQ7SywgViZndDsiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ia2V5IiB0eXBlPSJLIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Imxvd2VyS2V5IgorIHJldHVybj0iSyIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJrZXkiIHR5cGU9IksiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ibmF2aWdhYmxlS2V5U2V0IgorIHJldHVybj0iamF2YS51dGlsLk5hdmlnYWJsZVNldCZsdDtLJmd0OyIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InBvbGxGaXJzdEVudHJ5IgorIHJldHVybj0iamF2YS51dGlsLk1hcC5FbnRyeSZsdDtLLCBWJmd0OyIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InBvbGxMYXN0RW50cnkiCisgcmV0dXJuPSJqYXZhLnV0aWwuTWFwLkVudHJ5Jmx0O0ssIFYmZ3Q7IgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic3ViTWFwIgorIHJldHVybj0iamF2YS51dGlsLk5hdmlnYWJsZU1hcCZsdDtLLCBWJmd0OyIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJzdGFydEtleSIgdHlwZT0iSyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ic3RhcnRJbmNsdXNpdmUiIHR5cGU9ImJvb2xlYW4iPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImVuZEtleSIgdHlwZT0iSyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZW5kSW5jbHVzaXZlIiB0eXBlPSJib29sZWFuIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InRhaWxNYXAiCisgcmV0dXJuPSJqYXZhLnV0aWwuTmF2aWdhYmxlTWFwJmx0O0ssIFYmZ3Q7IgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InN0YXJ0S2V5IiB0eXBlPSJLIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJpbmNsdXNpdmUiIHR5cGU9ImJvb2xlYW4iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzwvaW50ZXJmYWNlPgorPGludGVyZmFjZSBuYW1lPSJOYXZpZ2FibGVTZXQiCisgYWJzdHJhY3Q9InRydWUiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGltcGxlbWVudHMgbmFtZT0iamF2YS51dGlsLlNvcnRlZFNldCI+Cis8L2ltcGxlbWVudHM+Cis8bWV0aG9kIG5hbWU9ImNlaWxpbmciCisgcmV0dXJuPSJFIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImUiIHR5cGU9IkUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZGVzY2VuZGluZ0l0ZXJhdG9yIgorIHJldHVybj0iamF2YS51dGlsLkl0ZXJhdG9yJmx0O0UmZ3Q7IgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZGVzY2VuZGluZ1NldCIKKyByZXR1cm49ImphdmEudXRpbC5OYXZpZ2FibGVTZXQmbHQ7RSZndDsiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJmbG9vciIKKyByZXR1cm49IkUiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZSIgdHlwZT0iRSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJoZWFkU2V0IgorIHJldHVybj0iamF2YS51dGlsLk5hdmlnYWJsZVNldCZsdDtFJmd0OyIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJlbmQiIHR5cGU9IkUiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImVuZEluY2x1c2l2ZSIgdHlwZT0iYm9vbGVhbiI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJoaWdoZXIiCisgcmV0dXJuPSJFIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImUiIHR5cGU9IkUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ibG93ZXIiCisgcmV0dXJuPSJFIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImUiIHR5cGU9IkUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icG9sbEZpcnN0IgorIHJldHVybj0iRSIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InBvbGxMYXN0IgorIHJldHVybj0iRSIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InN1YlNldCIKKyByZXR1cm49ImphdmEudXRpbC5OYXZpZ2FibGVTZXQmbHQ7RSZndDsiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ic3RhcnQiIHR5cGU9IkUiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InN0YXJ0SW5jbHVzaXZlIiB0eXBlPSJib29sZWFuIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJlbmQiIHR5cGU9IkUiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImVuZEluY2x1c2l2ZSIgdHlwZT0iYm9vbGVhbiI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJ0YWlsU2V0IgorIHJldHVybj0iamF2YS51dGlsLk5hdmlnYWJsZVNldCZsdDtFJmd0OyIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJzdGFydCIgdHlwZT0iRSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ic3RhcnRJbmNsdXNpdmUiIHR5cGU9ImJvb2xlYW4iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzwvaW50ZXJmYWNlPgogPGNsYXNzIG5hbWU9Ik5vU3VjaEVsZW1lbnRFeGNlcHRpb24iCiAgZXh0ZW5kcz0iamF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb24iCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMzA3MjAyLDYgKzMxODg0MSwyMSBAQAogPGV4Y2VwdGlvbiBuYW1lPSJJT0V4Y2VwdGlvbiIgdHlwZT0iamF2YS5pby5JT0V4Y2VwdGlvbiI+CiA8L2V4Y2VwdGlvbj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJsb2FkIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9InRydWUiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJpbiIgdHlwZT0iamF2YS5pby5SZWFkZXIiPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IklPRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmlvLklPRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImxvYWRGcm9tWE1MIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0zMDcyNzcsNiArMzE4OTMxLDIzIEBACiA8ZXhjZXB0aW9uIG5hbWU9IklPRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmlvLklPRXhjZXB0aW9uIj4KIDwvZXhjZXB0aW9uPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InN0b3JlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9InRydWUiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ3cml0ZXIiIHR5cGU9ImphdmEuaW8uV3JpdGVyIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJjb21tZW50IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJJT0V4Y2VwdGlvbiIgdHlwZT0iamF2YS5pby5JT0V4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzdG9yZVRvWE1MIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0zMDczMTMsNiArMzE4OTg0LDE3IEBACiA8ZXhjZXB0aW9uIG5hbWU9IklPRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmlvLklPRXhjZXB0aW9uIj4KIDwvZXhjZXB0aW9uPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InN0cmluZ1Byb3BlcnR5TmFtZXMiCisgcmV0dXJuPSJqYXZhLnV0aWwuU2V0Jmx0O2phdmEubGFuZy5TdHJpbmcmZ3Q7IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8ZmllbGQgbmFtZT0iZGVmYXVsdHMiCiAgdHlwZT0iamF2YS51dGlsLlByb3BlcnRpZXMiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTMwNzM2NSw2ICszMTkwNDcsMTggQEAKIDxleGNlcHRpb24gbmFtZT0iSU9FeGNlcHRpb24iIHR5cGU9ImphdmEuaW8uSU9FeGNlcHRpb24iPgogPC9leGNlcHRpb24+CiA8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IlByb3BlcnR5UmVzb3VyY2VCdW5kbGUiCisgdHlwZT0iamF2YS51dGlsLlByb3BlcnR5UmVzb3VyY2VCdW5kbGUiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJyZWFkZXIiIHR5cGU9ImphdmEuaW8uUmVhZGVyIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJJT0V4Y2VwdGlvbiIgdHlwZT0iamF2YS5pby5JT0V4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvY29uc3RydWN0b3I+CiA8bWV0aG9kIG5hbWU9ImdldEtleXMiCiAgcmV0dXJuPSJqYXZhLnV0aWwuRW51bWVyYXRpb24mbHQ7amF2YS5sYW5nLlN0cmluZyZndDsiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMzA3NjI4LDYgKzMxOTMyMiw0MyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvY29uc3RydWN0b3I+Cis8bWV0aG9kIG5hbWU9ImNsZWFyQ2FjaGUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJjbGVhckNhY2hlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImxvYWRlciIgdHlwZT0iamF2YS5sYW5nLkNsYXNzTG9hZGVyIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImNvbnRhaW5zS2V5IgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ia2V5IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldEJ1bmRsZSIKICByZXR1cm49ImphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZSIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0zMDc2NzcsNiArMzE5NDA4LDU3IEBACiA8ZXhjZXB0aW9uIG5hbWU9Ik1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiIgdHlwZT0iamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiI+CiA8L2V4Y2VwdGlvbj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRCdW5kbGUiCisgcmV0dXJuPSJqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGUiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJiYXNlTmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iY29udHJvbCIgdHlwZT0iamF2YS51dGlsLlJlc291cmNlQnVuZGxlLkNvbnRyb2wiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0QnVuZGxlIgorIHJldHVybj0iamF2YS51dGlsLlJlc291cmNlQnVuZGxlIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYmFzZU5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InRhcmdldExvY2FsZSIgdHlwZT0iamF2YS51dGlsLkxvY2FsZSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iY29udHJvbCIgdHlwZT0iamF2YS51dGlsLlJlc291cmNlQnVuZGxlLkNvbnRyb2wiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0QnVuZGxlIgorIHJldHVybj0iamF2YS51dGlsLlJlc291cmNlQnVuZGxlIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImJhc2VOYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ0YXJnZXRMb2NhbGUiIHR5cGU9ImphdmEudXRpbC5Mb2NhbGUiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImxvYWRlciIgdHlwZT0iamF2YS5sYW5nLkNsYXNzTG9hZGVyIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJjb250cm9sIiB0eXBlPSJqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGUuQ29udHJvbCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJnZXRLZXlzIgogIHJldHVybj0iamF2YS51dGlsLkVudW1lcmF0aW9uJmx0O2phdmEubGFuZy5TdHJpbmcmZ3Q7IgogIGFic3RyYWN0PSJ0cnVlIgpAQCAtMzA3NzUxLDYgKzMxOTUzMywyOCBAQAogPHBhcmFtZXRlciBuYW1lPSJrZXkiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iaGFuZGxlS2V5U2V0IgorIHJldHVybj0iamF2YS51dGlsLlNldCZsdDtqYXZhLmxhbmcuU3RyaW5nJmd0OyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InByb3RlY3RlZCIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJrZXlTZXQiCisgcmV0dXJuPSJqYXZhLnV0aWwuU2V0Jmx0O2phdmEubGFuZy5TdHJpbmcmZ3Q7IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InNldFBhcmVudCIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMzA3Nzc1LDYgKzMxOTU3OSwyMzkgQEAKID4KIDwvZmllbGQ+CiA8L2NsYXNzPgorPGNsYXNzIG5hbWU9IlJlc291cmNlQnVuZGxlLkNvbnRyb2wiCisgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8Y29uc3RydWN0b3IgbmFtZT0iUmVzb3VyY2VCdW5kbGUuQ29udHJvbCIKKyB0eXBlPSJqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGUuQ29udHJvbCIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwcm90ZWN0ZWQiCis+Cis8L2NvbnN0cnVjdG9yPgorPG1ldGhvZCBuYW1lPSJnZXRDYW5kaWRhdGVMb2NhbGVzIgorIHJldHVybj0iamF2YS51dGlsLkxpc3QmbHQ7amF2YS51dGlsLkxvY2FsZSZndDsiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImJhc2VOYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJsb2NhbGUiIHR5cGU9ImphdmEudXRpbC5Mb2NhbGUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0Q29udHJvbCIKKyByZXR1cm49ImphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZS5Db250cm9sIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZm9ybWF0cyIgdHlwZT0iamF2YS51dGlsLkxpc3QmbHQ7amF2YS5sYW5nLlN0cmluZyZndDsiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0RmFsbGJhY2tMb2NhbGUiCisgcmV0dXJuPSJqYXZhLnV0aWwuTG9jYWxlIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJiYXNlTmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibG9jYWxlIiB0eXBlPSJqYXZhLnV0aWwuTG9jYWxlIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldEZvcm1hdHMiCisgcmV0dXJuPSJqYXZhLnV0aWwuTGlzdCZsdDtqYXZhLmxhbmcuU3RyaW5nJmd0OyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYmFzZU5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0Tm9GYWxsYmFja0NvbnRyb2wiCisgcmV0dXJuPSJqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGUuQ29udHJvbCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImZvcm1hdHMiIHR5cGU9ImphdmEudXRpbC5MaXN0Jmx0O2phdmEubGFuZy5TdHJpbmcmZ3Q7Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFRpbWVUb0xpdmUiCisgcmV0dXJuPSJsb25nIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJiYXNlTmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibG9jYWxlIiB0eXBlPSJqYXZhLnV0aWwuTG9jYWxlIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im5lZWRzUmVsb2FkIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYmFzZU5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImxvY2FsZSIgdHlwZT0iamF2YS51dGlsLkxvY2FsZSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZm9ybWF0IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJsb2FkZXIiIHR5cGU9ImphdmEubGFuZy5DbGFzc0xvYWRlciI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iYnVuZGxlIiB0eXBlPSJqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGUiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImxvYWRUaW1lIiB0eXBlPSJsb25nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im5ld0J1bmRsZSIKKyByZXR1cm49ImphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYmFzZU5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImxvY2FsZSIgdHlwZT0iamF2YS51dGlsLkxvY2FsZSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZm9ybWF0IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJsb2FkZXIiIHR5cGU9ImphdmEubGFuZy5DbGFzc0xvYWRlciI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0icmVsb2FkIiB0eXBlPSJib29sZWFuIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJJT0V4Y2VwdGlvbiIgdHlwZT0iamF2YS5pby5JT0V4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzxleGNlcHRpb24gbmFtZT0iSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiIgdHlwZT0iamF2YS5sYW5nLklsbGVnYWxBY2Nlc3NFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8ZXhjZXB0aW9uIG5hbWU9Ikluc3RhbnRpYXRpb25FeGNlcHRpb24iIHR5cGU9ImphdmEubGFuZy5JbnN0YW50aWF0aW9uRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InRvQnVuZGxlTmFtZSIKKyByZXR1cm49ImphdmEubGFuZy5TdHJpbmciCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImJhc2VOYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJsb2NhbGUiIHR5cGU9ImphdmEudXRpbC5Mb2NhbGUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0idG9SZXNvdXJjZU5hbWUiCisgcmV0dXJuPSJqYXZhLmxhbmcuU3RyaW5nIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImJ1bmRsZU5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InN1ZmZpeCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPGZpZWxkIG5hbWU9IkZPUk1BVF9DTEFTUyIKKyB0eXBlPSJqYXZhLnV0aWwuTGlzdCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJGT1JNQVRfREVGQVVMVCIKKyB0eXBlPSJqYXZhLnV0aWwuTGlzdCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJGT1JNQVRfUFJPUEVSVElFUyIKKyB0eXBlPSJqYXZhLnV0aWwuTGlzdCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJUVExfRE9OVF9DQUNIRSIKKyB0eXBlPSJsb25nIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSItMUwiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iVFRMX05PX0VYUElSQVRJT05fQ09OVFJPTCIKKyB0eXBlPSJsb25nIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSItMkwiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8L2NsYXNzPgogPGNsYXNzIG5hbWU9IlNjYW5uZXIiCiAgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0zMDg0MzIsNiArMzIwNDY5LDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InJlc2V0IgorIHJldHVybj0iamF2YS51dGlsLlNjYW5uZXIiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2tpcCIKICByZXR1cm49ImphdmEudXRpbC5TY2FubmVyIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTMwODUxMSw2ICszMjA1NTksMTExIEBACiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgogPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJTZXJ2aWNlQ29uZmlndXJhdGlvbkVycm9yIgorIGV4dGVuZHM9ImphdmEubGFuZy5FcnJvciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGNvbnN0cnVjdG9yIG5hbWU9IlNlcnZpY2VDb25maWd1cmF0aW9uRXJyb3IiCisgdHlwZT0iamF2YS51dGlsLlNlcnZpY2VDb25maWd1cmF0aW9uRXJyb3IiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJtZXNzYWdlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTZXJ2aWNlQ29uZmlndXJhdGlvbkVycm9yIgorIHR5cGU9ImphdmEudXRpbC5TZXJ2aWNlQ29uZmlndXJhdGlvbkVycm9yIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibWVzc2FnZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iY2F1c2UiIHR5cGU9ImphdmEubGFuZy5UaHJvd2FibGUiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJTZXJ2aWNlTG9hZGVyIgorIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGltcGxlbWVudHMgbmFtZT0iamF2YS5sYW5nLkl0ZXJhYmxlIj4KKzwvaW1wbGVtZW50cz4KKzxtZXRob2QgbmFtZT0iaXRlcmF0b3IiCisgcmV0dXJuPSJqYXZhLnV0aWwuSXRlcmF0b3ImbHQ7UyZndDsiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ibG9hZCIKKyByZXR1cm49ImphdmEudXRpbC5TZXJ2aWNlTG9hZGVyJmx0O1MmZ3Q7IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InNlcnZpY2UiIHR5cGU9ImphdmEubGFuZy5DbGFzcyZsdDtTJmd0OyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iY2xhc3NMb2FkZXIiIHR5cGU9ImphdmEubGFuZy5DbGFzc0xvYWRlciI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJsb2FkIgorIHJldHVybj0iamF2YS51dGlsLlNlcnZpY2VMb2FkZXImbHQ7UyZndDsiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ic2VydmljZSIgdHlwZT0iamF2YS5sYW5nLkNsYXNzJmx0O1MmZ3Q7Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImxvYWRJbnN0YWxsZWQiCisgcmV0dXJuPSJqYXZhLnV0aWwuU2VydmljZUxvYWRlciZsdDtTJmd0OyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJzZXJ2aWNlIiB0eXBlPSJqYXZhLmxhbmcuQ2xhc3MmbHQ7UyZndDsiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icmVsb2FkIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPC9jbGFzcz4KIDxpbnRlcmZhY2UgbmFtZT0iU2V0IgogIGFic3RyYWN0PSJ0cnVlIgogIHN0YXRpYz0iZmFsc2UiCkBAIC0zMDk0NzIsNyArMzIxNjI1LDcgQEAKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+Ci08cGFyYW1ldGVyIG5hbWU9Im9mZnNldCIgdHlwZT0iaW50Ij4KKzxwYXJhbWV0ZXIgbmFtZT0ib2Zmc2V0TWlsbGlzIiB0eXBlPSJpbnQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZ2V0RFNUU2F2aW5ncyIKQEAgLTMwOTU5Nyw3ICszMjE3NTAsNyBAQAogPC9wYXJhbWV0ZXI+CiA8cGFyYW1ldGVyIG5hbWU9ImRheU9mV2VlayIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJ0aW1lIiB0eXBlPSJpbnQiPgorPHBhcmFtZXRlciBuYW1lPSJ0aW1lT2ZEYXlNaWxsaXMiIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJnZXRSYXdPZmZzZXQiCkBAIC0zMDk2MjEsNyArMzIxNzc0LDcgQEAKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+Ci08cGFyYW1ldGVyIG5hbWU9Im5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPHBhcmFtZXRlciBuYW1lPSJpZCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJoYXNTYW1lUnVsZXMiCkBAIC0zMDk2MzQsNyArMzIxNzg3LDcgQEAKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+Ci08cGFyYW1ldGVyIG5hbWU9InpvbmUiIHR5cGU9ImphdmEudXRpbC5UaW1lWm9uZSI+Cis8cGFyYW1ldGVyIG5hbWU9InRpbWVab25lIiB0eXBlPSJqYXZhLnV0aWwuVGltZVpvbmUiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iaW5EYXlsaWdodFRpbWUiCkBAIC0zMDk2NjAsNyArMzIxODEzLDcgQEAKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+Ci08cGFyYW1ldGVyIG5hbWU9InRpbWV6b25lIiB0eXBlPSJqYXZhLnV0aWwuVGltZVpvbmUiPgorPHBhcmFtZXRlciBuYW1lPSJ0aW1lWm9uZSIgdHlwZT0iamF2YS51dGlsLlRpbWVab25lIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InNldElEIgpAQCAtMzA5NjczLDcgKzMyMTgyNiw3IEBACiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgotPHBhcmFtZXRlciBuYW1lPSJuYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzxwYXJhbWV0ZXIgbmFtZT0iaWQiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2V0UmF3T2Zmc2V0IgpAQCAtMzA5Njg2LDcgKzMyMTgzOSw3IEBACiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgotPHBhcmFtZXRlciBuYW1lPSJvZmZzZXQiIHR5cGU9ImludCI+Cis8cGFyYW1ldGVyIG5hbWU9Im9mZnNldE1pbGxpcyIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InVzZURheWxpZ2h0VGltZSIKQEAgLTMwOTk4MSw2ICszMjIxMzQsOCBAQAogPgogPGltcGxlbWVudHMgbmFtZT0iamF2YS5sYW5nLkNsb25lYWJsZSI+CiA8L2ltcGxlbWVudHM+Cis8aW1wbGVtZW50cyBuYW1lPSJqYXZhLnV0aWwuTmF2aWdhYmxlTWFwIj4KKzwvaW1wbGVtZW50cz4KIDxpbXBsZW1lbnRzIG5hbWU9ImphdmEuaW8uU2VyaWFsaXphYmxlIj4KIDwvaW1wbGVtZW50cz4KIDxpbXBsZW1lbnRzIG5hbWU9ImphdmEudXRpbC5Tb3J0ZWRNYXAiPgpAQCAtMzEwMDAwLDYgKzMyMjE1NSwxNiBAQAogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KKzxwYXJhbWV0ZXIgbmFtZT0iY29weUZyb20iIHR5cGU9ImphdmEudXRpbC5NYXAmbHQ7PyBleHRlbmRzIEssID8gZXh0ZW5kcyBWJmd0OyI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iVHJlZU1hcCIKKyB0eXBlPSJqYXZhLnV0aWwuVHJlZU1hcCIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+CiA8cGFyYW1ldGVyIG5hbWU9ImNvbXBhcmF0b3IiIHR5cGU9ImphdmEudXRpbC5Db21wYXJhdG9yJmx0Oz8gc3VwZXIgSyZndDsiPgogPC9wYXJhbWV0ZXI+CiA8L2NvbnN0cnVjdG9yPgpAQCAtMzEwMDEwLDE5ICszMjIxNzUsMzUgQEAKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+Ci08cGFyYW1ldGVyIG5hbWU9Im1hcCIgdHlwZT0iamF2YS51dGlsLk1hcCZsdDs/IGV4dGVuZHMgSywgPyBleHRlbmRzIFYmZ3Q7Ij4KKzxwYXJhbWV0ZXIgbmFtZT0iY29weUZyb20iIHR5cGU9ImphdmEudXRpbC5Tb3J0ZWRNYXAmbHQ7SywgPyBleHRlbmRzIFYmZ3Q7Ij4KIDwvcGFyYW1ldGVyPgogPC9jb25zdHJ1Y3Rvcj4KLTxjb25zdHJ1Y3RvciBuYW1lPSJUcmVlTWFwIgotIHR5cGU9ImphdmEudXRpbC5UcmVlTWFwIgorPG1ldGhvZCBuYW1lPSJjZWlsaW5nRW50cnkiCisgcmV0dXJuPSJqYXZhLnV0aWwuTWFwLkVudHJ5Jmx0O0ssIFYmZ3Q7IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCiAgc3RhdGljPSJmYWxzZSIKICBmaW5hbD0iZmFsc2UiCiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgotPHBhcmFtZXRlciBuYW1lPSJtYXAiIHR5cGU9ImphdmEudXRpbC5Tb3J0ZWRNYXAmbHQ7SywgPyBleHRlbmRzIFYmZ3Q7Ij4KKzxwYXJhbWV0ZXIgbmFtZT0ia2V5IiB0eXBlPSJLIj4KIDwvcGFyYW1ldGVyPgotPC9jb25zdHJ1Y3Rvcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJjZWlsaW5nS2V5IgorIHJldHVybj0iSyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ia2V5IiB0eXBlPSJLIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImNsb25lIgogIHJldHVybj0iamF2YS5sYW5nLk9iamVjdCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0zMTAwNDUsNiArMzIyMjI2LDI4IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImRlc2NlbmRpbmdLZXlTZXQiCisgcmV0dXJuPSJqYXZhLnV0aWwuTmF2aWdhYmxlU2V0Jmx0O0smZ3Q7IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImRlc2NlbmRpbmdNYXAiCisgcmV0dXJuPSJqYXZhLnV0aWwuTmF2aWdhYmxlTWFwJmx0O0ssIFYmZ3Q7IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImVudHJ5U2V0IgogIHJldHVybj0iamF2YS51dGlsLlNldCZsdDtqYXZhLnV0aWwuTWFwLkVudHJ5Jmx0O0ssIFYmZ3Q7Jmd0OyIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0zMTAwNTYsNiArMzIyMjU5LDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImZpcnN0RW50cnkiCisgcmV0dXJuPSJqYXZhLnV0aWwuTWFwLkVudHJ5Jmx0O0ssIFYmZ3Q7IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImZpcnN0S2V5IgogIHJldHVybj0iSyIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0zMTAwNjcsNiArMzIyMjgxLDQ3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImZsb29yRW50cnkiCisgcmV0dXJuPSJqYXZhLnV0aWwuTWFwLkVudHJ5Jmx0O0ssIFYmZ3Q7IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJrZXkiIHR5cGU9IksiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZmxvb3JLZXkiCisgcmV0dXJuPSJLIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJrZXkiIHR5cGU9IksiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iaGVhZE1hcCIKKyByZXR1cm49ImphdmEudXRpbC5OYXZpZ2FibGVNYXAmbHQ7SywgViZndDsiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InRvIiB0eXBlPSJLIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJpbmNsdXNpdmUiIHR5cGU9ImJvb2xlYW4iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iaGVhZE1hcCIKICByZXR1cm49ImphdmEudXRpbC5Tb3J0ZWRNYXAmbHQ7SywgViZndDsiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMzEwMDc3LDkgKzMyMjMzMiw0NiBAQAogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KLTxwYXJhbWV0ZXIgbmFtZT0iZW5kS2V5IiB0eXBlPSJLIj4KKzxwYXJhbWV0ZXIgbmFtZT0idG9FeGNsdXNpdmUiIHR5cGU9IksiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iaGlnaGVyRW50cnkiCisgcmV0dXJuPSJqYXZhLnV0aWwuTWFwLkVudHJ5Jmx0O0ssIFYmZ3Q7IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJrZXkiIHR5cGU9IksiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iaGlnaGVyS2V5IgorIHJldHVybj0iSyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ia2V5IiB0eXBlPSJLIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Imxhc3RFbnRyeSIKKyByZXR1cm49ImphdmEudXRpbC5NYXAuRW50cnkmbHQ7SywgViZndDsiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ibGFzdEtleSIKICByZXR1cm49IksiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMzEwMDkxLDYgKzMyMjM4Myw4NCBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJsb3dlckVudHJ5IgorIHJldHVybj0iamF2YS51dGlsLk1hcC5FbnRyeSZsdDtLLCBWJmd0OyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ia2V5IiB0eXBlPSJLIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Imxvd2VyS2V5IgorIHJldHVybj0iSyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ia2V5IiB0eXBlPSJLIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im5hdmlnYWJsZUtleVNldCIKKyByZXR1cm49ImphdmEudXRpbC5OYXZpZ2FibGVTZXQmbHQ7SyZndDsiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icG9sbEZpcnN0RW50cnkiCisgcmV0dXJuPSJqYXZhLnV0aWwuTWFwLkVudHJ5Jmx0O0ssIFYmZ3Q7IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InBvbGxMYXN0RW50cnkiCisgcmV0dXJuPSJqYXZhLnV0aWwuTWFwLkVudHJ5Jmx0O0ssIFYmZ3Q7IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InN1Yk1hcCIKKyByZXR1cm49ImphdmEudXRpbC5OYXZpZ2FibGVNYXAmbHQ7SywgViZndDsiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImZyb20iIHR5cGU9IksiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImZyb21JbmNsdXNpdmUiIHR5cGU9ImJvb2xlYW4iPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InRvIiB0eXBlPSJLIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ0b0luY2x1c2l2ZSIgdHlwZT0iYm9vbGVhbiI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzdWJNYXAiCiAgcmV0dXJuPSJqYXZhLnV0aWwuU29ydGVkTWFwJmx0O0ssIFYmZ3Q7IgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTMxMDEwMSw5ICszMjI0NzEsMjQgQEAKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+Ci08cGFyYW1ldGVyIG5hbWU9InN0YXJ0S2V5IiB0eXBlPSJLIj4KKzxwYXJhbWV0ZXIgbmFtZT0iZnJvbUluY2x1c2l2ZSIgdHlwZT0iSyI+CiA8L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0iZW5kS2V5IiB0eXBlPSJLIj4KKzxwYXJhbWV0ZXIgbmFtZT0idG9FeGNsdXNpdmUiIHR5cGU9IksiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0idGFpbE1hcCIKKyByZXR1cm49ImphdmEudXRpbC5OYXZpZ2FibGVNYXAmbHQ7SywgViZndDsiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImZyb20iIHR5cGU9IksiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImluY2x1c2l2ZSIgdHlwZT0iYm9vbGVhbiI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJ0YWlsTWFwIgpAQCAtMzEwMTE2LDcgKzMyMjUwMSw3IEBACiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgotPHBhcmFtZXRlciBuYW1lPSJzdGFydEtleSIgdHlwZT0iSyI+Cis8cGFyYW1ldGVyIG5hbWU9ImZyb21JbmNsdXNpdmUiIHR5cGU9IksiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KIDwvY2xhc3M+CkBAIC0zMTAxMzAsOSArMzIyNTE1LDkgQEAKID4KIDxpbXBsZW1lbnRzIG5hbWU9ImphdmEubGFuZy5DbG9uZWFibGUiPgogPC9pbXBsZW1lbnRzPgotPGltcGxlbWVudHMgbmFtZT0iamF2YS5pby5TZXJpYWxpemFibGUiPgorPGltcGxlbWVudHMgbmFtZT0iamF2YS51dGlsLk5hdmlnYWJsZVNldCI+CiA8L2ltcGxlbWVudHM+Ci08aW1wbGVtZW50cyBuYW1lPSJqYXZhLnV0aWwuU29ydGVkU2V0Ij4KKzxpbXBsZW1lbnRzIG5hbWU9ImphdmEuaW8uU2VyaWFsaXphYmxlIj4KIDwvaW1wbGVtZW50cz4KIDxjb25zdHJ1Y3RvciBuYW1lPSJUcmVlU2V0IgogIHR5cGU9ImphdmEudXRpbC5UcmVlU2V0IgpAQCAtMzEwMTcyLDYgKzMyMjU1NywxOSBAQAogPHBhcmFtZXRlciBuYW1lPSJzZXQiIHR5cGU9ImphdmEudXRpbC5Tb3J0ZWRTZXQmbHQ7RSZndDsiPgogPC9wYXJhbWV0ZXI+CiA8L2NvbnN0cnVjdG9yPgorPG1ldGhvZCBuYW1lPSJjZWlsaW5nIgorIHJldHVybj0iRSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZSIgdHlwZT0iRSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJjbG9uZSIKICByZXR1cm49ImphdmEubGFuZy5PYmplY3QiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMzEwMTk0LDYgKzMyMjU5MiwyOCBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJkZXNjZW5kaW5nSXRlcmF0b3IiCisgcmV0dXJuPSJqYXZhLnV0aWwuSXRlcmF0b3ImbHQ7RSZndDsiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZGVzY2VuZGluZ1NldCIKKyByZXR1cm49ImphdmEudXRpbC5OYXZpZ2FibGVTZXQmbHQ7RSZndDsiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZmlyc3QiCiAgcmV0dXJuPSJFIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTMxMDIwNSw2ICszMjI2MjUsMzQgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZmxvb3IiCisgcmV0dXJuPSJFIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJlIiB0eXBlPSJFIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImhlYWRTZXQiCisgcmV0dXJuPSJqYXZhLnV0aWwuTmF2aWdhYmxlU2V0Jmx0O0UmZ3Q7IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJlbmQiIHR5cGU9IkUiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImVuZEluY2x1c2l2ZSIgdHlwZT0iYm9vbGVhbiI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJoZWFkU2V0IgogIHJldHVybj0iamF2YS51dGlsLlNvcnRlZFNldCZsdDtFJmd0OyIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0zMTAyMTgsNiArMzIyNjY2LDE5IEBACiA8cGFyYW1ldGVyIG5hbWU9ImVuZCIgdHlwZT0iRSI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJoaWdoZXIiCisgcmV0dXJuPSJFIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJlIiB0eXBlPSJFIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9Iml0ZXJhdG9yIgogIHJldHVybj0iamF2YS51dGlsLkl0ZXJhdG9yJmx0O0UmZ3Q7IgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTMxMDI0MCw2ICszMjI3MDEsNDEgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ibG93ZXIiCisgcmV0dXJuPSJFIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJlIiB0eXBlPSJFIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InBvbGxGaXJzdCIKKyByZXR1cm49IkUiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icG9sbExhc3QiCisgcmV0dXJuPSJFIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InNpemUiCiAgcmV0dXJuPSJpbnQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMzEwMjUyLDYgKzMyMjc0OCwyNSBAQAogPgogPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InN1YlNldCIKKyByZXR1cm49ImphdmEudXRpbC5OYXZpZ2FibGVTZXQmbHQ7RSZndDsiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InN0YXJ0IiB0eXBlPSJFIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJzdGFydEluY2x1c2l2ZSIgdHlwZT0iYm9vbGVhbiI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZW5kIiB0eXBlPSJFIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJlbmRJbmNsdXNpdmUiIHR5cGU9ImJvb2xlYW4iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic3ViU2V0IgogIHJldHVybj0iamF2YS51dGlsLlNvcnRlZFNldCZsdDtFJmd0OyIKICBhYnN0cmFjdD0iZmFsc2UiCiAgbmF0aXZlPSJmYWxzZSIKQEAgLTMxMDI2Nyw2ICszMjI3ODIsMjEgQEAKIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InRhaWxTZXQiCisgcmV0dXJuPSJqYXZhLnV0aWwuTmF2aWdhYmxlU2V0Jmx0O0UmZ3Q7IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJzdGFydCIgdHlwZT0iRSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ic3RhcnRJbmNsdXNpdmUiIHR5cGU9ImJvb2xlYW4iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0idGFpbFNldCIKICByZXR1cm49ImphdmEudXRpbC5Tb3J0ZWRTZXQmbHQ7RSZndDsiCiAgYWJzdHJhY3Q9ImZhbHNlIgogIG5hdGl2ZT0iZmFsc2UiCkBAIC0zMTA5MjUsNyArMzIzNDU1LDcgQEAKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+Ci08cGFyYW1ldGVyIG5hbWU9InRhc2tzIiB0eXBlPSJqYXZhLnV0aWwuQ29sbGVjdGlvbiZsdDtqYXZhLnV0aWwuY29uY3VycmVudC5DYWxsYWJsZSZsdDtUJmd0OyZndDsiPgorPHBhcmFtZXRlciBuYW1lPSJ0YXNrcyIgdHlwZT0iamF2YS51dGlsLkNvbGxlY3Rpb24mbHQ7PyBleHRlbmRzIGphdmEudXRpbC5jb25jdXJyZW50LkNhbGxhYmxlJmx0O1QmZ3Q7Jmd0OyI+CiA8L3BhcmFtZXRlcj4KIDxleGNlcHRpb24gbmFtZT0iSW50ZXJydXB0ZWRFeGNlcHRpb24iIHR5cGU9ImphdmEubGFuZy5JbnRlcnJ1cHRlZEV4Y2VwdGlvbiI+CiA8L2V4Y2VwdGlvbj4KQEAgLTMxMDk0MCw3ICszMjM0NzAsNyBAQAogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KLTxwYXJhbWV0ZXIgbmFtZT0idGFza3MiIHR5cGU9ImphdmEudXRpbC5Db2xsZWN0aW9uJmx0O2phdmEudXRpbC5jb25jdXJyZW50LkNhbGxhYmxlJmx0O1QmZ3Q7Jmd0OyI+Cis8cGFyYW1ldGVyIG5hbWU9InRhc2tzIiB0eXBlPSJqYXZhLnV0aWwuQ29sbGVjdGlvbiZsdDs/IGV4dGVuZHMgamF2YS51dGlsLmNvbmN1cnJlbnQuQ2FsbGFibGUmbHQ7VCZndDsmZ3Q7Ij4KIDwvcGFyYW1ldGVyPgogPHBhcmFtZXRlciBuYW1lPSJ0aW1lb3V0IiB0eXBlPSJsb25nIj4KIDwvcGFyYW1ldGVyPgpAQCAtMzEwOTU5LDcgKzMyMzQ4OSw3IEBACiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgotPHBhcmFtZXRlciBuYW1lPSJ0YXNrcyIgdHlwZT0iamF2YS51dGlsLkNvbGxlY3Rpb24mbHQ7amF2YS51dGlsLmNvbmN1cnJlbnQuQ2FsbGFibGUmbHQ7VCZndDsmZ3Q7Ij4KKzxwYXJhbWV0ZXIgbmFtZT0idGFza3MiIHR5cGU9ImphdmEudXRpbC5Db2xsZWN0aW9uJmx0Oz8gZXh0ZW5kcyBqYXZhLnV0aWwuY29uY3VycmVudC5DYWxsYWJsZSZsdDtUJmd0OyZndDsiPgogPC9wYXJhbWV0ZXI+CiA8ZXhjZXB0aW9uIG5hbWU9IkV4ZWN1dGlvbkV4Y2VwdGlvbiIgdHlwZT0iamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0aW9uRXhjZXB0aW9uIj4KIDwvZXhjZXB0aW9uPgpAQCAtMzEwOTc2LDcgKzMyMzUwNiw3IEBACiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgotPHBhcmFtZXRlciBuYW1lPSJ0YXNrcyIgdHlwZT0iamF2YS51dGlsLkNvbGxlY3Rpb24mbHQ7amF2YS51dGlsLmNvbmN1cnJlbnQuQ2FsbGFibGUmbHQ7VCZndDsmZ3Q7Ij4KKzxwYXJhbWV0ZXIgbmFtZT0idGFza3MiIHR5cGU9ImphdmEudXRpbC5Db2xsZWN0aW9uJmx0Oz8gZXh0ZW5kcyBqYXZhLnV0aWwuY29uY3VycmVudC5DYWxsYWJsZSZsdDtUJmd0OyZndDsiPgogPC9wYXJhbWV0ZXI+CiA8cGFyYW1ldGVyIG5hbWU9InRpbWVvdXQiIHR5cGU9ImxvbmciPgogPC9wYXJhbWV0ZXI+CkBAIC0zMTA5ODksNiArMzIzNTE5LDM0IEBACiA8ZXhjZXB0aW9uIG5hbWU9IlRpbWVvdXRFeGNlcHRpb24iIHR5cGU9ImphdmEudXRpbC5jb25jdXJyZW50LlRpbWVvdXRFeGNlcHRpb24iPgogPC9leGNlcHRpb24+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ibmV3VGFza0ZvciIKKyByZXR1cm49ImphdmEudXRpbC5jb25jdXJyZW50LlJ1bm5hYmxlRnV0dXJlJmx0O1QmZ3Q7IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHJvdGVjdGVkIgorPgorPHBhcmFtZXRlciBuYW1lPSJydW5uYWJsZSIgdHlwZT0iamF2YS5sYW5nLlJ1bm5hYmxlIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZSIgdHlwZT0iVCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJuZXdUYXNrRm9yIgorIHJldHVybj0iamF2YS51dGlsLmNvbmN1cnJlbnQuUnVubmFibGVGdXR1cmUmbHQ7VCZndDsiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwcm90ZWN0ZWQiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNhbGxhYmxlIiB0eXBlPSJqYXZhLnV0aWwuY29uY3VycmVudC5DYWxsYWJsZSZsdDtUJmd0OyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzdWJtaXQiCiAgcmV0dXJuPSJqYXZhLnV0aWwuY29uY3VycmVudC5GdXR1cmUmbHQ7PyZndDsiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMzExMjQwLDYgKzMyMzc5OCw0MTkgQEAKIDwvZXhjZXB0aW9uPgogPC9tZXRob2Q+CiA8L2NsYXNzPgorPGludGVyZmFjZSBuYW1lPSJCbG9ja2luZ0RlcXVlIgorIGFic3RyYWN0PSJ0cnVlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxpbXBsZW1lbnRzIG5hbWU9ImphdmEudXRpbC5jb25jdXJyZW50LkJsb2NraW5nUXVldWUiPgorPC9pbXBsZW1lbnRzPgorPGltcGxlbWVudHMgbmFtZT0iamF2YS51dGlsLkRlcXVlIj4KKzwvaW1wbGVtZW50cz4KKzxtZXRob2QgbmFtZT0iYWRkIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJlIiB0eXBlPSJFIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImFkZEZpcnN0IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJlIiB0eXBlPSJFIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImFkZExhc3QiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImUiIHR5cGU9IkUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iY29udGFpbnMiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im8iIHR5cGU9ImphdmEubGFuZy5PYmplY3QiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZWxlbWVudCIKKyByZXR1cm49IkUiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJpdGVyYXRvciIKKyByZXR1cm49ImphdmEudXRpbC5JdGVyYXRvciZsdDtFJmd0OyIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9mZmVyIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJlIiB0eXBlPSJFIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9mZmVyIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJlIiB0eXBlPSJFIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ0aW1lb3V0IiB0eXBlPSJsb25nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ1bml0IiB0eXBlPSJqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdCI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iSW50ZXJydXB0ZWRFeGNlcHRpb24iIHR5cGU9ImphdmEubGFuZy5JbnRlcnJ1cHRlZEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvZmZlckZpcnN0IgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJlIiB0eXBlPSJFIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9mZmVyRmlyc3QiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImUiIHR5cGU9IkUiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InRpbWVvdXQiIHR5cGU9ImxvbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InVuaXQiIHR5cGU9ImphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0Ij4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJJbnRlcnJ1cHRlZEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5sYW5nLkludGVycnVwdGVkRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9mZmVyTGFzdCIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZSIgdHlwZT0iRSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvZmZlckxhc3QiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImUiIHR5cGU9IkUiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InRpbWVvdXQiIHR5cGU9ImxvbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InVuaXQiIHR5cGU9ImphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0Ij4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJJbnRlcnJ1cHRlZEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5sYW5nLkludGVycnVwdGVkRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InBlZWsiCisgcmV0dXJuPSJFIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icG9sbCIKKyByZXR1cm49IkUiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJwb2xsIgorIHJldHVybj0iRSIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ0aW1lb3V0IiB0eXBlPSJsb25nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ1bml0IiB0eXBlPSJqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdCI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iSW50ZXJydXB0ZWRFeGNlcHRpb24iIHR5cGU9ImphdmEubGFuZy5JbnRlcnJ1cHRlZEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJwb2xsRmlyc3QiCisgcmV0dXJuPSJFIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InRpbWVvdXQiIHR5cGU9ImxvbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InVuaXQiIHR5cGU9ImphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0Ij4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJJbnRlcnJ1cHRlZEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5sYW5nLkludGVycnVwdGVkRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InBvbGxMYXN0IgorIHJldHVybj0iRSIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ0aW1lb3V0IiB0eXBlPSJsb25nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ1bml0IiB0eXBlPSJqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdCI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iSW50ZXJydXB0ZWRFeGNlcHRpb24iIHR5cGU9ImphdmEubGFuZy5JbnRlcnJ1cHRlZEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJwdXNoIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJlIiB0eXBlPSJFIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InB1dCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZSIgdHlwZT0iRSI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iSW50ZXJydXB0ZWRFeGNlcHRpb24iIHR5cGU9ImphdmEubGFuZy5JbnRlcnJ1cHRlZEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJwdXRGaXJzdCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZSIgdHlwZT0iRSI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iSW50ZXJydXB0ZWRFeGNlcHRpb24iIHR5cGU9ImphdmEubGFuZy5JbnRlcnJ1cHRlZEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJwdXRMYXN0IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJlIiB0eXBlPSJFIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJJbnRlcnJ1cHRlZEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5sYW5nLkludGVycnVwdGVkRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InJlbW92ZSIKKyByZXR1cm49IkUiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJyZW1vdmUiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im8iIHR5cGU9ImphdmEubGFuZy5PYmplY3QiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icmVtb3ZlRmlyc3RPY2N1cnJlbmNlIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJvIiB0eXBlPSJqYXZhLmxhbmcuT2JqZWN0Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InJlbW92ZUxhc3RPY2N1cnJlbmNlIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJvIiB0eXBlPSJqYXZhLmxhbmcuT2JqZWN0Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNpemUiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJ0YWtlIgorIHJldHVybj0iRSIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGV4Y2VwdGlvbiBuYW1lPSJJbnRlcnJ1cHRlZEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5sYW5nLkludGVycnVwdGVkRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InRha2VGaXJzdCIKKyByZXR1cm49IkUiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxleGNlcHRpb24gbmFtZT0iSW50ZXJydXB0ZWRFeGNlcHRpb24iIHR5cGU9ImphdmEubGFuZy5JbnRlcnJ1cHRlZEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJ0YWtlTGFzdCIKKyByZXR1cm49IkUiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxleGNlcHRpb24gbmFtZT0iSW50ZXJydXB0ZWRFeGNlcHRpb24iIHR5cGU9ImphdmEubGFuZy5JbnRlcnJ1cHRlZEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPC9pbnRlcmZhY2U+CiA8aW50ZXJmYWNlIG5hbWU9IkJsb2NraW5nUXVldWUiCiAgYWJzdHJhY3Q9InRydWUiCiAgc3RhdGljPSJmYWxzZSIKQEAgLTMxMTU5Miw2ICszMjQ1NjMsMTggQEAKID4KIDxwYXJhbWV0ZXIgbmFtZT0iaW5pdGlhbENhcGFjaXR5IiB0eXBlPSJpbnQiPgogPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImxvYWRGYWN0b3IiIHR5cGU9ImZsb2F0Ij4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJDb25jdXJyZW50SGFzaE1hcCIKKyB0eXBlPSJqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50SGFzaE1hcCIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImluaXRpYWxDYXBhY2l0eSIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgogPC9jb25zdHJ1Y3Rvcj4KIDxjb25zdHJ1Y3RvciBuYW1lPSJDb25jdXJyZW50SGFzaE1hcCIKICB0eXBlPSJqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50SGFzaE1hcCIKQEAgLTMxMTg4MCw2ICszMjQ4NjMsODk4IEBACiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgogPC9pbnRlcmZhY2U+Cis8aW50ZXJmYWNlIG5hbWU9IkNvbmN1cnJlbnROYXZpZ2FibGVNYXAiCisgYWJzdHJhY3Q9InRydWUiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGltcGxlbWVudHMgbmFtZT0iamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudE1hcCI+Cis8L2ltcGxlbWVudHM+Cis8aW1wbGVtZW50cyBuYW1lPSJqYXZhLnV0aWwuTmF2aWdhYmxlTWFwIj4KKzwvaW1wbGVtZW50cz4KKzxtZXRob2QgbmFtZT0iZGVzY2VuZGluZ0tleVNldCIKKyByZXR1cm49ImphdmEudXRpbC5OYXZpZ2FibGVTZXQmbHQ7SyZndDsiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJkZXNjZW5kaW5nTWFwIgorIHJldHVybj0iamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudE5hdmlnYWJsZU1hcCZsdDtLLCBWJmd0OyIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImhlYWRNYXAiCisgcmV0dXJuPSJqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50TmF2aWdhYmxlTWFwJmx0O0ssIFYmZ3Q7IgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InRvS2V5IiB0eXBlPSJLIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJpbmNsdXNpdmUiIHR5cGU9ImJvb2xlYW4iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iaGVhZE1hcCIKKyByZXR1cm49ImphdmEudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnROYXZpZ2FibGVNYXAmbHQ7SywgViZndDsiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idG9LZXkiIHR5cGU9IksiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ia2V5U2V0IgorIHJldHVybj0iamF2YS51dGlsLk5hdmlnYWJsZVNldCZsdDtLJmd0OyIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im5hdmlnYWJsZUtleVNldCIKKyByZXR1cm49ImphdmEudXRpbC5OYXZpZ2FibGVTZXQmbHQ7SyZndDsiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzdWJNYXAiCisgcmV0dXJuPSJqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50TmF2aWdhYmxlTWFwJmx0O0ssIFYmZ3Q7IgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImZyb21LZXkiIHR5cGU9IksiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImZyb21JbmNsdXNpdmUiIHR5cGU9ImJvb2xlYW4iPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InRvS2V5IiB0eXBlPSJLIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ0b0luY2x1c2l2ZSIgdHlwZT0iYm9vbGVhbiI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzdWJNYXAiCisgcmV0dXJuPSJqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50TmF2aWdhYmxlTWFwJmx0O0ssIFYmZ3Q7IgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImZyb21LZXkiIHR5cGU9IksiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InRvS2V5IiB0eXBlPSJLIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InRhaWxNYXAiCisgcmV0dXJuPSJqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50TmF2aWdhYmxlTWFwJmx0O0ssIFYmZ3Q7IgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImZyb21LZXkiIHR5cGU9IksiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImluY2x1c2l2ZSIgdHlwZT0iYm9vbGVhbiI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJ0YWlsTWFwIgorIHJldHVybj0iamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudE5hdmlnYWJsZU1hcCZsdDtLLCBWJmd0OyIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJmcm9tS2V5IiB0eXBlPSJLIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8L2ludGVyZmFjZT4KKzxjbGFzcyBuYW1lPSJDb25jdXJyZW50U2tpcExpc3RNYXAiCisgZXh0ZW5kcz0iamF2YS51dGlsLkFic3RyYWN0TWFwIgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8aW1wbGVtZW50cyBuYW1lPSJqYXZhLmxhbmcuQ2xvbmVhYmxlIj4KKzwvaW1wbGVtZW50cz4KKzxpbXBsZW1lbnRzIG5hbWU9ImphdmEudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnROYXZpZ2FibGVNYXAiPgorPC9pbXBsZW1lbnRzPgorPGltcGxlbWVudHMgbmFtZT0iamF2YS5pby5TZXJpYWxpemFibGUiPgorPC9pbXBsZW1lbnRzPgorPGNvbnN0cnVjdG9yIG5hbWU9IkNvbmN1cnJlbnRTa2lwTGlzdE1hcCIKKyB0eXBlPSJqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50U2tpcExpc3RNYXAiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJDb25jdXJyZW50U2tpcExpc3RNYXAiCisgdHlwZT0iamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudFNraXBMaXN0TWFwIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29tcGFyYXRvciIgdHlwZT0iamF2YS51dGlsLkNvbXBhcmF0b3ImbHQ7PyBzdXBlciBLJmd0OyI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iQ29uY3VycmVudFNraXBMaXN0TWFwIgorIHR5cGU9ImphdmEudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnRTa2lwTGlzdE1hcCIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im0iIHR5cGU9ImphdmEudXRpbC5NYXAmbHQ7PyBleHRlbmRzIEssID8gZXh0ZW5kcyBWJmd0OyI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iQ29uY3VycmVudFNraXBMaXN0TWFwIgorIHR5cGU9ImphdmEudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnRTa2lwTGlzdE1hcCIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im0iIHR5cGU9ImphdmEudXRpbC5Tb3J0ZWRNYXAmbHQ7SywgPyBleHRlbmRzIFYmZ3Q7Ij4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxtZXRob2QgbmFtZT0iY2VpbGluZ0VudHJ5IgorIHJldHVybj0iamF2YS51dGlsLk1hcC5FbnRyeSZsdDtLLCBWJmd0OyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ia2V5IiB0eXBlPSJLIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImNlaWxpbmdLZXkiCisgcmV0dXJuPSJLIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJrZXkiIHR5cGU9IksiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iY2xvbmUiCisgcmV0dXJuPSJqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50U2tpcExpc3RNYXAmbHQ7SywgViZndDsiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iY29tcGFyYXRvciIKKyByZXR1cm49ImphdmEudXRpbC5Db21wYXJhdG9yJmx0Oz8gc3VwZXIgSyZndDsiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZGVzY2VuZGluZ0tleVNldCIKKyByZXR1cm49ImphdmEudXRpbC5OYXZpZ2FibGVTZXQmbHQ7SyZndDsiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZGVzY2VuZGluZ01hcCIKKyByZXR1cm49ImphdmEudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnROYXZpZ2FibGVNYXAmbHQ7SywgViZndDsiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZW50cnlTZXQiCisgcmV0dXJuPSJqYXZhLnV0aWwuU2V0Jmx0O2phdmEudXRpbC5NYXAuRW50cnkmbHQ7SywgViZndDsmZ3Q7IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImZpcnN0RW50cnkiCisgcmV0dXJuPSJqYXZhLnV0aWwuTWFwLkVudHJ5Jmx0O0ssIFYmZ3Q7IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImZpcnN0S2V5IgorIHJldHVybj0iSyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJmbG9vckVudHJ5IgorIHJldHVybj0iamF2YS51dGlsLk1hcC5FbnRyeSZsdDtLLCBWJmd0OyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ia2V5IiB0eXBlPSJLIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImZsb29yS2V5IgorIHJldHVybj0iSyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ia2V5IiB0eXBlPSJLIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImhlYWRNYXAiCisgcmV0dXJuPSJqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50TmF2aWdhYmxlTWFwJmx0O0ssIFYmZ3Q7IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ0b0tleSIgdHlwZT0iSyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iaW5jbHVzaXZlIiB0eXBlPSJib29sZWFuIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImhlYWRNYXAiCisgcmV0dXJuPSJqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50TmF2aWdhYmxlTWFwJmx0O0ssIFYmZ3Q7IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ0b0tleSIgdHlwZT0iSyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJoaWdoZXJFbnRyeSIKKyByZXR1cm49ImphdmEudXRpbC5NYXAuRW50cnkmbHQ7SywgViZndDsiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImtleSIgdHlwZT0iSyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJoaWdoZXJLZXkiCisgcmV0dXJuPSJLIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJrZXkiIHR5cGU9IksiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ibGFzdEVudHJ5IgorIHJldHVybj0iamF2YS51dGlsLk1hcC5FbnRyeSZsdDtLLCBWJmd0OyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJsYXN0S2V5IgorIHJldHVybj0iSyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJsb3dlckVudHJ5IgorIHJldHVybj0iamF2YS51dGlsLk1hcC5FbnRyeSZsdDtLLCBWJmd0OyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ia2V5IiB0eXBlPSJLIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Imxvd2VyS2V5IgorIHJldHVybj0iSyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ia2V5IiB0eXBlPSJLIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im5hdmlnYWJsZUtleVNldCIKKyByZXR1cm49ImphdmEudXRpbC5OYXZpZ2FibGVTZXQmbHQ7SyZndDsiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icG9sbEZpcnN0RW50cnkiCisgcmV0dXJuPSJqYXZhLnV0aWwuTWFwLkVudHJ5Jmx0O0ssIFYmZ3Q7IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InBvbGxMYXN0RW50cnkiCisgcmV0dXJuPSJqYXZhLnV0aWwuTWFwLkVudHJ5Jmx0O0ssIFYmZ3Q7IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InB1dElmQWJzZW50IgorIHJldHVybj0iViIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ia2V5IiB0eXBlPSJLIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZSIgdHlwZT0iViI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJyZW1vdmUiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJrZXkiIHR5cGU9ImphdmEubGFuZy5PYmplY3QiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InZhbHVlIiB0eXBlPSJqYXZhLmxhbmcuT2JqZWN0Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InJlcGxhY2UiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJrZXkiIHR5cGU9IksiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Im9sZFZhbHVlIiB0eXBlPSJWIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJuZXdWYWx1ZSIgdHlwZT0iViI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJyZXBsYWNlIgorIHJldHVybj0iViIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ia2V5IiB0eXBlPSJLIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZSIgdHlwZT0iViI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzdWJNYXAiCisgcmV0dXJuPSJqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50TmF2aWdhYmxlTWFwJmx0O0ssIFYmZ3Q7IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJmcm9tS2V5IiB0eXBlPSJLIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJmcm9tSW5jbHVzaXZlIiB0eXBlPSJib29sZWFuIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ0b0tleSIgdHlwZT0iSyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idG9JbmNsdXNpdmUiIHR5cGU9ImJvb2xlYW4iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic3ViTWFwIgorIHJldHVybj0iamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudE5hdmlnYWJsZU1hcCZsdDtLLCBWJmd0OyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZnJvbUtleSIgdHlwZT0iSyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idG9LZXkiIHR5cGU9IksiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0idGFpbE1hcCIKKyByZXR1cm49ImphdmEudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnROYXZpZ2FibGVNYXAmbHQ7SywgViZndDsiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImZyb21LZXkiIHR5cGU9IksiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImluY2x1c2l2ZSIgdHlwZT0iYm9vbGVhbiI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJ0YWlsTWFwIgorIHJldHVybj0iamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudE5hdmlnYWJsZU1hcCZsdDtLLCBWJmd0OyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZnJvbUtleSIgdHlwZT0iSyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJDb25jdXJyZW50U2tpcExpc3RTZXQiCisgZXh0ZW5kcz0iamF2YS51dGlsLkFic3RyYWN0U2V0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8aW1wbGVtZW50cyBuYW1lPSJqYXZhLmxhbmcuQ2xvbmVhYmxlIj4KKzwvaW1wbGVtZW50cz4KKzxpbXBsZW1lbnRzIG5hbWU9ImphdmEudXRpbC5OYXZpZ2FibGVTZXQiPgorPC9pbXBsZW1lbnRzPgorPGltcGxlbWVudHMgbmFtZT0iamF2YS5pby5TZXJpYWxpemFibGUiPgorPC9pbXBsZW1lbnRzPgorPGNvbnN0cnVjdG9yIG5hbWU9IkNvbmN1cnJlbnRTa2lwTGlzdFNldCIKKyB0eXBlPSJqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50U2tpcExpc3RTZXQiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJDb25jdXJyZW50U2tpcExpc3RTZXQiCisgdHlwZT0iamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudFNraXBMaXN0U2V0IgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29tcGFyYXRvciIgdHlwZT0iamF2YS51dGlsLkNvbXBhcmF0b3ImbHQ7PyBzdXBlciBFJmd0OyI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iQ29uY3VycmVudFNraXBMaXN0U2V0IgorIHR5cGU9ImphdmEudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnRTa2lwTGlzdFNldCIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImMiIHR5cGU9ImphdmEudXRpbC5Db2xsZWN0aW9uJmx0Oz8gZXh0ZW5kcyBFJmd0OyI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iQ29uY3VycmVudFNraXBMaXN0U2V0IgorIHR5cGU9ImphdmEudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnRTa2lwTGlzdFNldCIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InMiIHR5cGU9ImphdmEudXRpbC5Tb3J0ZWRTZXQmbHQ7RSZndDsiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPG1ldGhvZCBuYW1lPSJjZWlsaW5nIgorIHJldHVybj0iRSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZSIgdHlwZT0iRSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJjbG9uZSIKKyByZXR1cm49ImphdmEudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnRTa2lwTGlzdFNldCZsdDtFJmd0OyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJjb21wYXJhdG9yIgorIHJldHVybj0iamF2YS51dGlsLkNvbXBhcmF0b3ImbHQ7PyBzdXBlciBFJmd0OyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJkZXNjZW5kaW5nSXRlcmF0b3IiCisgcmV0dXJuPSJqYXZhLnV0aWwuSXRlcmF0b3ImbHQ7RSZndDsiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZGVzY2VuZGluZ1NldCIKKyByZXR1cm49ImphdmEudXRpbC5OYXZpZ2FibGVTZXQmbHQ7RSZndDsiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZmlyc3QiCisgcmV0dXJuPSJFIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImZsb29yIgorIHJldHVybj0iRSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZSIgdHlwZT0iRSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJoZWFkU2V0IgorIHJldHVybj0iamF2YS51dGlsLk5hdmlnYWJsZVNldCZsdDtFJmd0OyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idG9FbGVtZW50IiB0eXBlPSJFIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJpbmNsdXNpdmUiIHR5cGU9ImJvb2xlYW4iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iaGVhZFNldCIKKyByZXR1cm49ImphdmEudXRpbC5OYXZpZ2FibGVTZXQmbHQ7RSZndDsiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InRvRWxlbWVudCIgdHlwZT0iRSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJoaWdoZXIiCisgcmV0dXJuPSJFIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJlIiB0eXBlPSJFIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Iml0ZXJhdG9yIgorIHJldHVybj0iamF2YS51dGlsLkl0ZXJhdG9yJmx0O0UmZ3Q7IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Imxhc3QiCisgcmV0dXJuPSJFIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Imxvd2VyIgorIHJldHVybj0iRSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZSIgdHlwZT0iRSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJwb2xsRmlyc3QiCisgcmV0dXJuPSJFIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InBvbGxMYXN0IgorIHJldHVybj0iRSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzaXplIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InN1YlNldCIKKyByZXR1cm49ImphdmEudXRpbC5OYXZpZ2FibGVTZXQmbHQ7RSZndDsiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImZyb21FbGVtZW50IiB0eXBlPSJFIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJmcm9tSW5jbHVzaXZlIiB0eXBlPSJib29sZWFuIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ0b0VsZW1lbnQiIHR5cGU9IkUiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InRvSW5jbHVzaXZlIiB0eXBlPSJib29sZWFuIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InN1YlNldCIKKyByZXR1cm49ImphdmEudXRpbC5OYXZpZ2FibGVTZXQmbHQ7RSZndDsiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImZyb21FbGVtZW50IiB0eXBlPSJFIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ0b0VsZW1lbnQiIHR5cGU9IkUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0idGFpbFNldCIKKyByZXR1cm49ImphdmEudXRpbC5OYXZpZ2FibGVTZXQmbHQ7RSZndDsiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImZyb21FbGVtZW50IiB0eXBlPSJFIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJpbmNsdXNpdmUiIHR5cGU9ImJvb2xlYW4iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0idGFpbFNldCIKKyByZXR1cm49ImphdmEudXRpbC5OYXZpZ2FibGVTZXQmbHQ7RSZndDsiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImZyb21FbGVtZW50IiB0eXBlPSJFIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8L2NsYXNzPgogPGNsYXNzIG5hbWU9IkNvcHlPbldyaXRlQXJyYXlMaXN0IgogIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMzEyOTg5LDcgKzMyNjg2NCw3IEBACiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgotPHBhcmFtZXRlciBuYW1lPSJ0YXNrcyIgdHlwZT0iamF2YS51dGlsLkNvbGxlY3Rpb24mbHQ7amF2YS51dGlsLmNvbmN1cnJlbnQuQ2FsbGFibGUmbHQ7VCZndDsmZ3Q7Ij4KKzxwYXJhbWV0ZXIgbmFtZT0idGFza3MiIHR5cGU9ImphdmEudXRpbC5Db2xsZWN0aW9uJmx0Oz8gZXh0ZW5kcyBqYXZhLnV0aWwuY29uY3VycmVudC5DYWxsYWJsZSZsdDtUJmd0OyZndDsiPgogPC9wYXJhbWV0ZXI+CiA8ZXhjZXB0aW9uIG5hbWU9IkludGVycnVwdGVkRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmxhbmcuSW50ZXJydXB0ZWRFeGNlcHRpb24iPgogPC9leGNlcHRpb24+CkBAIC0zMTMwMDQsNyArMzI2ODc5LDcgQEAKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+Ci08cGFyYW1ldGVyIG5hbWU9InRhc2tzIiB0eXBlPSJqYXZhLnV0aWwuQ29sbGVjdGlvbiZsdDtqYXZhLnV0aWwuY29uY3VycmVudC5DYWxsYWJsZSZsdDtUJmd0OyZndDsiPgorPHBhcmFtZXRlciBuYW1lPSJ0YXNrcyIgdHlwZT0iamF2YS51dGlsLkNvbGxlY3Rpb24mbHQ7PyBleHRlbmRzIGphdmEudXRpbC5jb25jdXJyZW50LkNhbGxhYmxlJmx0O1QmZ3Q7Jmd0OyI+CiA8L3BhcmFtZXRlcj4KIDxwYXJhbWV0ZXIgbmFtZT0idGltZW91dCIgdHlwZT0ibG9uZyI+CiA8L3BhcmFtZXRlcj4KQEAgLTMxMzAyMyw3ICszMjY4OTgsNyBAQAogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KLTxwYXJhbWV0ZXIgbmFtZT0idGFza3MiIHR5cGU9ImphdmEudXRpbC5Db2xsZWN0aW9uJmx0O2phdmEudXRpbC5jb25jdXJyZW50LkNhbGxhYmxlJmx0O1QmZ3Q7Jmd0OyI+Cis8cGFyYW1ldGVyIG5hbWU9InRhc2tzIiB0eXBlPSJqYXZhLnV0aWwuQ29sbGVjdGlvbiZsdDs/IGV4dGVuZHMgamF2YS51dGlsLmNvbmN1cnJlbnQuQ2FsbGFibGUmbHQ7VCZndDsmZ3Q7Ij4KIDwvcGFyYW1ldGVyPgogPGV4Y2VwdGlvbiBuYW1lPSJFeGVjdXRpb25FeGNlcHRpb24iIHR5cGU9ImphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dGlvbkV4Y2VwdGlvbiI+CiA8L2V4Y2VwdGlvbj4KQEAgLTMxMzA0MCw3ICszMjY5MTUsNyBAQAogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KLTxwYXJhbWV0ZXIgbmFtZT0idGFza3MiIHR5cGU9ImphdmEudXRpbC5Db2xsZWN0aW9uJmx0O2phdmEudXRpbC5jb25jdXJyZW50LkNhbGxhYmxlJmx0O1QmZ3Q7Jmd0OyI+Cis8cGFyYW1ldGVyIG5hbWU9InRhc2tzIiB0eXBlPSJqYXZhLnV0aWwuQ29sbGVjdGlvbiZsdDs/IGV4dGVuZHMgamF2YS51dGlsLmNvbmN1cnJlbnQuQ2FsbGFibGUmbHQ7VCZndDsmZ3Q7Ij4KIDwvcGFyYW1ldGVyPgogPHBhcmFtZXRlciBuYW1lPSJ0aW1lb3V0IiB0eXBlPSJsb25nIj4KIDwvcGFyYW1ldGVyPgpAQCAtMzEzMTg1LDcgKzMyNzA2MCw3IEBACiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgotPHBhcmFtZXRlciBuYW1lPSJhY3Rpb24iIHR5cGU9ImphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbiI+Cis8cGFyYW1ldGVyIG5hbWU9ImFjdGlvbiIgdHlwZT0iamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uJmx0Oz8mZ3Q7Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImNhbGxhYmxlIgpAQCAtMzEzMTk4LDcgKzMyNzA3Myw3IEBACiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgotPHBhcmFtZXRlciBuYW1lPSJhY3Rpb24iIHR5cGU9ImphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbiI+Cis8cGFyYW1ldGVyIG5hbWU9ImFjdGlvbiIgdHlwZT0iamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uJmx0Oz8mZ3Q7Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImRlZmF1bHRUaHJlYWRGYWN0b3J5IgpAQCAtMzEzNDkxLDkgKzMyNzM2Niw3IEBACiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgotPGltcGxlbWVudHMgbmFtZT0iamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlIj4KLTwvaW1wbGVtZW50cz4KLTxpbXBsZW1lbnRzIG5hbWU9ImphdmEubGFuZy5SdW5uYWJsZSI+Cis8aW1wbGVtZW50cyBuYW1lPSJqYXZhLnV0aWwuY29uY3VycmVudC5SdW5uYWJsZUZ1dHVyZSI+CiA8L2ltcGxlbWVudHM+CiA8Y29uc3RydWN0b3IgbmFtZT0iRnV0dXJlVGFzayIKICB0eXBlPSJqYXZhLnV0aWwuY29uY3VycmVudC5GdXR1cmVUYXNrIgpAQCAtMzEzNjQ4LDYgKzMyNzUyMSw1MzYgQEAKIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+CiA8L2NsYXNzPgorPGNsYXNzIG5hbWU9IkxpbmtlZEJsb2NraW5nRGVxdWUiCisgZXh0ZW5kcz0iamF2YS51dGlsLkFic3RyYWN0UXVldWUiCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxpbXBsZW1lbnRzIG5hbWU9ImphdmEudXRpbC5jb25jdXJyZW50LkJsb2NraW5nRGVxdWUiPgorPC9pbXBsZW1lbnRzPgorPGltcGxlbWVudHMgbmFtZT0iamF2YS5pby5TZXJpYWxpemFibGUiPgorPC9pbXBsZW1lbnRzPgorPGNvbnN0cnVjdG9yIG5hbWU9IkxpbmtlZEJsb2NraW5nRGVxdWUiCisgdHlwZT0iamF2YS51dGlsLmNvbmN1cnJlbnQuTGlua2VkQmxvY2tpbmdEZXF1ZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IkxpbmtlZEJsb2NraW5nRGVxdWUiCisgdHlwZT0iamF2YS51dGlsLmNvbmN1cnJlbnQuTGlua2VkQmxvY2tpbmdEZXF1ZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNhcGFjaXR5IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IkxpbmtlZEJsb2NraW5nRGVxdWUiCisgdHlwZT0iamF2YS51dGlsLmNvbmN1cnJlbnQuTGlua2VkQmxvY2tpbmdEZXF1ZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImMiIHR5cGU9ImphdmEudXRpbC5Db2xsZWN0aW9uJmx0Oz8gZXh0ZW5kcyBFJmd0OyI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8bWV0aG9kIG5hbWU9ImFkZEZpcnN0IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZSIgdHlwZT0iRSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJhZGRMYXN0IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZSIgdHlwZT0iRSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJkZXNjZW5kaW5nSXRlcmF0b3IiCisgcmV0dXJuPSJqYXZhLnV0aWwuSXRlcmF0b3ImbHQ7RSZndDsiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZHJhaW5UbyIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYyIgdHlwZT0iamF2YS51dGlsLkNvbGxlY3Rpb24mbHQ7PyBzdXBlciBFJmd0OyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJkcmFpblRvIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjIiB0eXBlPSJqYXZhLnV0aWwuQ29sbGVjdGlvbiZsdDs/IHN1cGVyIEUmZ3Q7Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJtYXhFbGVtZW50cyIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldEZpcnN0IgorIHJldHVybj0iRSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRMYXN0IgorIHJldHVybj0iRSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJpdGVyYXRvciIKKyByZXR1cm49ImphdmEudXRpbC5JdGVyYXRvciZsdDtFJmd0OyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvZmZlciIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImUiIHR5cGU9IkUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib2ZmZXIiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJlIiB0eXBlPSJFIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ0aW1lb3V0IiB0eXBlPSJsb25nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ1bml0IiB0eXBlPSJqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdCI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iSW50ZXJydXB0ZWRFeGNlcHRpb24iIHR5cGU9ImphdmEubGFuZy5JbnRlcnJ1cHRlZEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvZmZlckZpcnN0IgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZSIgdHlwZT0iRSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvZmZlckZpcnN0IgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZSIgdHlwZT0iRSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idGltZW91dCIgdHlwZT0ibG9uZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idW5pdCIgdHlwZT0iamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQiPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IkludGVycnVwdGVkRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmxhbmcuSW50ZXJydXB0ZWRFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib2ZmZXJMYXN0IgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZSIgdHlwZT0iRSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvZmZlckxhc3QiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJlIiB0eXBlPSJFIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ0aW1lb3V0IiB0eXBlPSJsb25nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ1bml0IiB0eXBlPSJqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdCI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iSW50ZXJydXB0ZWRFeGNlcHRpb24iIHR5cGU9ImphdmEubGFuZy5JbnRlcnJ1cHRlZEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJwZWVrIgorIHJldHVybj0iRSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJwZWVrRmlyc3QiCisgcmV0dXJuPSJFIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InBlZWtMYXN0IgorIHJldHVybj0iRSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJwb2xsIgorIHJldHVybj0iRSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJwb2xsIgorIHJldHVybj0iRSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idGltZW91dCIgdHlwZT0ibG9uZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idW5pdCIgdHlwZT0iamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQiPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IkludGVycnVwdGVkRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmxhbmcuSW50ZXJydXB0ZWRFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icG9sbEZpcnN0IgorIHJldHVybj0iRSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJwb2xsRmlyc3QiCisgcmV0dXJuPSJFIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ0aW1lb3V0IiB0eXBlPSJsb25nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ1bml0IiB0eXBlPSJqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdCI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iSW50ZXJydXB0ZWRFeGNlcHRpb24iIHR5cGU9ImphdmEubGFuZy5JbnRlcnJ1cHRlZEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJwb2xsTGFzdCIKKyByZXR1cm49IkUiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icG9sbExhc3QiCisgcmV0dXJuPSJFIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ0aW1lb3V0IiB0eXBlPSJsb25nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ1bml0IiB0eXBlPSJqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdCI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iSW50ZXJydXB0ZWRFeGNlcHRpb24iIHR5cGU9ImphdmEubGFuZy5JbnRlcnJ1cHRlZEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJwb3AiCisgcmV0dXJuPSJFIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InB1c2giCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJlIiB0eXBlPSJFIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InB1dCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImUiIHR5cGU9IkUiPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IkludGVycnVwdGVkRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmxhbmcuSW50ZXJydXB0ZWRFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icHV0Rmlyc3QiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJlIiB0eXBlPSJFIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJJbnRlcnJ1cHRlZEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5sYW5nLkludGVycnVwdGVkRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InB1dExhc3QiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJlIiB0eXBlPSJFIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJJbnRlcnJ1cHRlZEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5sYW5nLkludGVycnVwdGVkRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InJlbWFpbmluZ0NhcGFjaXR5IgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InJlbW92ZUZpcnN0IgorIHJldHVybj0iRSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJyZW1vdmVGaXJzdE9jY3VycmVuY2UiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJvIiB0eXBlPSJqYXZhLmxhbmcuT2JqZWN0Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InJlbW92ZUxhc3QiCisgcmV0dXJuPSJFIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InJlbW92ZUxhc3RPY2N1cnJlbmNlIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibyIgdHlwZT0iamF2YS5sYW5nLk9iamVjdCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzaXplIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InRha2UiCisgcmV0dXJuPSJFIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGV4Y2VwdGlvbiBuYW1lPSJJbnRlcnJ1cHRlZEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5sYW5nLkludGVycnVwdGVkRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InRha2VGaXJzdCIKKyByZXR1cm49IkUiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8ZXhjZXB0aW9uIG5hbWU9IkludGVycnVwdGVkRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmxhbmcuSW50ZXJydXB0ZWRFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0idGFrZUxhc3QiCisgcmV0dXJuPSJFIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGV4Y2VwdGlvbiBuYW1lPSJJbnRlcnJ1cHRlZEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5sYW5nLkludGVycnVwdGVkRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8L2NsYXNzPgogPGNsYXNzIG5hbWU9IkxpbmtlZEJsb2NraW5nUXVldWUiCiAgZXh0ZW5kcz0iamF2YS51dGlsLkFic3RyYWN0UXVldWUiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMzE0MTQxLDYgKzMyODU0NCw1MiBAQAogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KIDwvaW50ZXJmYWNlPgorPGludGVyZmFjZSBuYW1lPSJSdW5uYWJsZUZ1dHVyZSIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8aW1wbGVtZW50cyBuYW1lPSJqYXZhLnV0aWwuY29uY3VycmVudC5GdXR1cmUiPgorPC9pbXBsZW1lbnRzPgorPGltcGxlbWVudHMgbmFtZT0iamF2YS5sYW5nLlJ1bm5hYmxlIj4KKzwvaW1wbGVtZW50cz4KKzxtZXRob2QgbmFtZT0icnVuIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8L2ludGVyZmFjZT4KKzxpbnRlcmZhY2UgbmFtZT0iUnVubmFibGVTY2hlZHVsZWRGdXR1cmUiCisgYWJzdHJhY3Q9InRydWUiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGltcGxlbWVudHMgbmFtZT0iamF2YS51dGlsLmNvbmN1cnJlbnQuUnVubmFibGVGdXR1cmUiPgorPC9pbXBsZW1lbnRzPgorPGltcGxlbWVudHMgbmFtZT0iamF2YS51dGlsLmNvbmN1cnJlbnQuU2NoZWR1bGVkRnV0dXJlIj4KKzwvaW1wbGVtZW50cz4KKzxtZXRob2QgbmFtZT0iaXNQZXJpb2RpYyIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPC9pbnRlcmZhY2U+CiA8aW50ZXJmYWNlIG5hbWU9IlNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZSIKICBhYnN0cmFjdD0idHJ1ZSIKICBzdGF0aWM9ImZhbHNlIgpAQCAtMzE0MjkzLDYgKzMyODc0MiwzNiBAQAogPHBhcmFtZXRlciBuYW1lPSJoYW5kbGVyIiB0eXBlPSJqYXZhLnV0aWwuY29uY3VycmVudC5SZWplY3RlZEV4ZWN1dGlvbkhhbmRsZXIiPgogPC9wYXJhbWV0ZXI+CiA8L2NvbnN0cnVjdG9yPgorPG1ldGhvZCBuYW1lPSJkZWNvcmF0ZVRhc2siCisgcmV0dXJuPSJqYXZhLnV0aWwuY29uY3VycmVudC5SdW5uYWJsZVNjaGVkdWxlZEZ1dHVyZSZsdDtWJmd0OyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InByb3RlY3RlZCIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icnVubmFibGUiIHR5cGU9ImphdmEubGFuZy5SdW5uYWJsZSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idGFzayIgdHlwZT0iamF2YS51dGlsLmNvbmN1cnJlbnQuUnVubmFibGVTY2hlZHVsZWRGdXR1cmUmbHQ7ViZndDsiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZGVjb3JhdGVUYXNrIgorIHJldHVybj0iamF2YS51dGlsLmNvbmN1cnJlbnQuUnVubmFibGVTY2hlZHVsZWRGdXR1cmUmbHQ7ViZndDsiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwcm90ZWN0ZWQiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNhbGxhYmxlIiB0eXBlPSJqYXZhLnV0aWwuY29uY3VycmVudC5DYWxsYWJsZSZsdDtWJmd0OyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idGFzayIgdHlwZT0iamF2YS51dGlsLmNvbmN1cnJlbnQuUnVubmFibGVTY2hlZHVsZWRGdXR1cmUmbHQ7ViZndDsiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZ2V0Q29udGludWVFeGlzdGluZ1BlcmlvZGljVGFza3NBZnRlclNodXRkb3duUG9saWN5IgogIHJldHVybj0iYm9vbGVhbiIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0zMTQ5NzcsNiArMzI5NDU2LDMwIEBACiA8cGFyYW1ldGVyIG5hbWU9InQiIHR5cGU9ImphdmEubGFuZy5UaHJvd2FibGUiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iYWxsb3dDb3JlVGhyZWFkVGltZU91dCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InZhbHVlIiB0eXBlPSJib29sZWFuIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImFsbG93c0NvcmVUaHJlYWRUaW1lT3V0IgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJhd2FpdFRlcm1pbmF0aW9uIgogIHJldHVybj0iYm9vbGVhbiIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0zMTU1MzMsNiArMzMwMDM2LDMyIEBACiA8ZXhjZXB0aW9uIG5hbWU9IkludGVycnVwdGVkRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmxhbmcuSW50ZXJydXB0ZWRFeGNlcHRpb24iPgogPC9leGNlcHRpb24+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0idG9EYXlzIgorIHJldHVybj0ibG9uZyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZHVyYXRpb24iIHR5cGU9ImxvbmciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0idG9Ib3VycyIKKyByZXR1cm49ImxvbmciCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImR1cmF0aW9uIiB0eXBlPSJsb25nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InRvTWljcm9zIgogIHJldHVybj0ibG9uZyIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0zMTU1NTksNiArMzMwMDg4LDE5IEBACiA8cGFyYW1ldGVyIG5hbWU9ImR1cmF0aW9uIiB0eXBlPSJsb25nIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InRvTWludXRlcyIKKyByZXR1cm49ImxvbmciCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImR1cmF0aW9uIiB0eXBlPSJsb25nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InRvTmFub3MiCiAgcmV0dXJuPSJsb25nIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTMxNTcwNyw2ICszMzAyNDksMTkgQEAKIDxwYXJhbWV0ZXIgbmFtZT0ibmV3VmFsdWUiIHR5cGU9ImJvb2xlYW4iPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ibGF6eVNldCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibmV3VmFsdWUiIHR5cGU9ImJvb2xlYW4iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2V0IgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0zMTU5MDYsNiArMzMwNDYxLDE5IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImxhenlTZXQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im5ld1ZhbHVlIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ibG9uZ1ZhbHVlIgogIHJldHVybj0ibG9uZyIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0zMTYxMDMsNiArMzMwNjcxLDIxIEBACiA8cGFyYW1ldGVyIG5hbWU9ImkiIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJsYXp5U2V0IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJpIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Im5ld1ZhbHVlIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ibGVuZ3RoIgogIHJldHVybj0iaW50IgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTMxNjI5MCw2ICszMzA4NzMsMjEgQEAKIDxwYXJhbWV0ZXIgbmFtZT0ib2JqIiB0eXBlPSJUIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImxhenlTZXQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im9iaiIgdHlwZT0iVCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibmV3VmFsdWUiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJuZXdVcGRhdGVyIgogIHJldHVybj0iamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0ludGVnZXJGaWVsZFVwZGF0ZXImbHQ7VSZndDsiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMzE2NTA4LDYgKzMzMTEwNiwxOSBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJsYXp5U2V0IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJuZXdWYWx1ZSIgdHlwZT0ibG9uZyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJsb25nVmFsdWUiCiAgcmV0dXJuPSJsb25nIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTMxNjcwNSw2ICszMzEzMTYsMjEgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iaSIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImxhenlTZXQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImkiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibmV3VmFsdWUiIHR5cGU9ImxvbmciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ibGVuZ3RoIgogIHJldHVybj0iaW50IgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTMxNjg5Miw2ICszMzE1MTgsMjEgQEAKIDxwYXJhbWV0ZXIgbmFtZT0ib2JqIiB0eXBlPSJUIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImxhenlTZXQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im9iaiIgdHlwZT0iVCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibmV3VmFsdWUiIHR5cGU9ImxvbmciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ibmV3VXBkYXRlciIKICByZXR1cm49ImphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNMb25nRmllbGRVcGRhdGVyJmx0O1UmZ3Q7IgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTMxNzEzMSw2ICszMzE3NzIsMTkgQEAKIDxwYXJhbWV0ZXIgbmFtZT0ibmV3VmFsdWUiIHR5cGU9IlYiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ibGF6eVNldCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibmV3VmFsdWUiIHR5cGU9IlYiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2V0IgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0zMTcyMzUsNiArMzMxODg5LDIxIEBACiA8cGFyYW1ldGVyIG5hbWU9Im5ld1ZhbHVlIiB0eXBlPSJFIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImxhenlTZXQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImkiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibmV3VmFsdWUiIHR5cGU9IkUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ibGVuZ3RoIgogIHJldHVybj0iaW50IgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTMxNzM0MCw2ICszMzIwMDksMjEgQEAKIDxwYXJhbWV0ZXIgbmFtZT0ibmV3VmFsdWUiIHR5cGU9IlYiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ibGF6eVNldCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ib2JqIiB0eXBlPSJUIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJuZXdWYWx1ZSIgdHlwZT0iViI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJuZXdVcGRhdGVyIgogIHJldHVybj0iamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY1JlZmVyZW5jZUZpZWxkVXBkYXRlciZsdDtVLCBXJmd0OyIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0zMTc1MjMsNyArMzMyMjA3LDcgQEAKICBzdGF0aWM9ImZhbHNlIgogIGZpbmFsPSJmYWxzZSIKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSIiCisgdmlzaWJpbGl0eT0icHVibGljIgogPgogPGltcGxlbWVudHMgbmFtZT0iamF2YS5pby5TZXJpYWxpemFibGUiPgogPC9pbXBsZW1lbnRzPgpAQCAtMzE3NTYwLDYgKzMzMjI0NCw1MzIgQEAKIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+CiA8L2NsYXNzPgorPGNsYXNzIG5hbWU9IkFic3RyYWN0UXVldWVkTG9uZ1N5bmNocm9uaXplciIKKyBleHRlbmRzPSJqYXZhLnV0aWwuY29uY3VycmVudC5sb2Nrcy5BYnN0cmFjdE93bmFibGVTeW5jaHJvbml6ZXIiCisgYWJzdHJhY3Q9InRydWUiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGltcGxlbWVudHMgbmFtZT0iamF2YS5pby5TZXJpYWxpemFibGUiPgorPC9pbXBsZW1lbnRzPgorPGNvbnN0cnVjdG9yIG5hbWU9IkFic3RyYWN0UXVldWVkTG9uZ1N5bmNocm9uaXplciIKKyB0eXBlPSJqYXZhLnV0aWwuY29uY3VycmVudC5sb2Nrcy5BYnN0cmFjdFF1ZXVlZExvbmdTeW5jaHJvbml6ZXIiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHJvdGVjdGVkIgorPgorPC9jb25zdHJ1Y3Rvcj4KKzxtZXRob2QgbmFtZT0iYWNxdWlyZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYXJnIiB0eXBlPSJsb25nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImFjcXVpcmVJbnRlcnJ1cHRpYmx5IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhcmciIHR5cGU9ImxvbmciPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IkludGVycnVwdGVkRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmxhbmcuSW50ZXJydXB0ZWRFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iYWNxdWlyZVNoYXJlZCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYXJnIiB0eXBlPSJsb25nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImFjcXVpcmVTaGFyZWRJbnRlcnJ1cHRpYmx5IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhcmciIHR5cGU9ImxvbmciPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IkludGVycnVwdGVkRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmxhbmcuSW50ZXJydXB0ZWRFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iY29tcGFyZUFuZFNldFN0YXRlIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHJvdGVjdGVkIgorPgorPHBhcmFtZXRlciBuYW1lPSJleHBlY3QiIHR5cGU9ImxvbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InVwZGF0ZSIgdHlwZT0ibG9uZyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRFeGNsdXNpdmVRdWV1ZWRUaHJlYWRzIgorIHJldHVybj0iamF2YS51dGlsLkNvbGxlY3Rpb24mbHQ7amF2YS5sYW5nLlRocmVhZCZndDsiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRGaXJzdFF1ZXVlZFRocmVhZCIKKyByZXR1cm49ImphdmEubGFuZy5UaHJlYWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRRdWV1ZUxlbmd0aCIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFF1ZXVlZFRocmVhZHMiCisgcmV0dXJuPSJqYXZhLnV0aWwuQ29sbGVjdGlvbiZsdDtqYXZhLmxhbmcuVGhyZWFkJmd0OyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFNoYXJlZFF1ZXVlZFRocmVhZHMiCisgcmV0dXJuPSJqYXZhLnV0aWwuQ29sbGVjdGlvbiZsdDtqYXZhLmxhbmcuVGhyZWFkJmd0OyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFN0YXRlIgorIHJldHVybj0ibG9uZyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHJvdGVjdGVkIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFdhaXRRdWV1ZUxlbmd0aCIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb25kaXRpb24iIHR5cGU9ImphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLkFic3RyYWN0UXVldWVkTG9uZ1N5bmNocm9uaXplci5Db25kaXRpb25PYmplY3QiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0V2FpdGluZ1RocmVhZHMiCisgcmV0dXJuPSJqYXZhLnV0aWwuQ29sbGVjdGlvbiZsdDtqYXZhLmxhbmcuVGhyZWFkJmd0OyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb25kaXRpb24iIHR5cGU9ImphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLkFic3RyYWN0UXVldWVkTG9uZ1N5bmNocm9uaXplci5Db25kaXRpb25PYmplY3QiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iaGFzQ29udGVuZGVkIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Imhhc1F1ZXVlZFRocmVhZHMiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iaGFzV2FpdGVycyIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29uZGl0aW9uIiB0eXBlPSJqYXZhLnV0aWwuY29uY3VycmVudC5sb2Nrcy5BYnN0cmFjdFF1ZXVlZExvbmdTeW5jaHJvbml6ZXIuQ29uZGl0aW9uT2JqZWN0Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImlzSGVsZEV4Y2x1c2l2ZWx5IgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InByb3RlY3RlZCIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJpc1F1ZXVlZCIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idGhyZWFkIiB0eXBlPSJqYXZhLmxhbmcuVGhyZWFkIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im93bnMiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbmRpdGlvbiIgdHlwZT0iamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuQWJzdHJhY3RRdWV1ZWRMb25nU3luY2hyb25pemVyLkNvbmRpdGlvbk9iamVjdCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJyZWxlYXNlIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhcmciIHR5cGU9ImxvbmciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icmVsZWFzZVNoYXJlZCIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYXJnIiB0eXBlPSJsb25nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFN0YXRlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHJvdGVjdGVkIgorPgorPHBhcmFtZXRlciBuYW1lPSJuZXdTdGF0ZSIgdHlwZT0ibG9uZyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJ0cnlBY3F1aXJlIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InByb3RlY3RlZCIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYXJnIiB0eXBlPSJsb25nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InRyeUFjcXVpcmVOYW5vcyIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYXJnIiB0eXBlPSJsb25nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJuYW5vc1RpbWVvdXQiIHR5cGU9ImxvbmciPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IkludGVycnVwdGVkRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmxhbmcuSW50ZXJydXB0ZWRFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0idHJ5QWNxdWlyZVNoYXJlZCIKKyByZXR1cm49ImxvbmciCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwcm90ZWN0ZWQiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImFyZyIgdHlwZT0ibG9uZyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJ0cnlBY3F1aXJlU2hhcmVkTmFub3MiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImFyZyIgdHlwZT0ibG9uZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibmFub3NUaW1lb3V0IiB0eXBlPSJsb25nIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJJbnRlcnJ1cHRlZEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5sYW5nLkludGVycnVwdGVkRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InRyeVJlbGVhc2UiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHJvdGVjdGVkIgorPgorPHBhcmFtZXRlciBuYW1lPSJhcmciIHR5cGU9ImxvbmciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0idHJ5UmVsZWFzZVNoYXJlZCIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwcm90ZWN0ZWQiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImFyZyIgdHlwZT0ibG9uZyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJBYnN0cmFjdFF1ZXVlZExvbmdTeW5jaHJvbml6ZXIuQ29uZGl0aW9uT2JqZWN0IgorIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxpbXBsZW1lbnRzIG5hbWU9ImphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLkNvbmRpdGlvbiI+Cis8L2ltcGxlbWVudHM+Cis8aW1wbGVtZW50cyBuYW1lPSJqYXZhLmlvLlNlcmlhbGl6YWJsZSI+Cis8L2ltcGxlbWVudHM+Cis8Y29uc3RydWN0b3IgbmFtZT0iQWJzdHJhY3RRdWV1ZWRMb25nU3luY2hyb25pemVyLkNvbmRpdGlvbk9iamVjdCIKKyB0eXBlPSJqYXZhLnV0aWwuY29uY3VycmVudC5sb2Nrcy5BYnN0cmFjdFF1ZXVlZExvbmdTeW5jaHJvbml6ZXIuQ29uZGl0aW9uT2JqZWN0IgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvY29uc3RydWN0b3I+Cis8bWV0aG9kIG5hbWU9ImF3YWl0IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGV4Y2VwdGlvbiBuYW1lPSJJbnRlcnJ1cHRlZEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5sYW5nLkludGVycnVwdGVkRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImF3YWl0IgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ0aW1lIiB0eXBlPSJsb25nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ1bml0IiB0eXBlPSJqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdCI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iSW50ZXJydXB0ZWRFeGNlcHRpb24iIHR5cGU9ImphdmEubGFuZy5JbnRlcnJ1cHRlZEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJhd2FpdE5hbm9zIgorIHJldHVybj0ibG9uZyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJuYW5vc1RpbWVvdXQiIHR5cGU9ImxvbmciPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IkludGVycnVwdGVkRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmxhbmcuSW50ZXJydXB0ZWRFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iYXdhaXRVbmludGVycnVwdGlibHkiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iYXdhaXRVbnRpbCIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZGVhZGxpbmUiIHR5cGU9ImphdmEudXRpbC5EYXRlIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJJbnRlcnJ1cHRlZEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5sYW5nLkludGVycnVwdGVkRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFdhaXRRdWV1ZUxlbmd0aCIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHJvdGVjdGVkIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFdhaXRpbmdUaHJlYWRzIgorIHJldHVybj0iamF2YS51dGlsLkNvbGxlY3Rpb24mbHQ7amF2YS5sYW5nLlRocmVhZCZndDsiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InByb3RlY3RlZCIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJoYXNXYWl0ZXJzIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHJvdGVjdGVkIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNpZ25hbCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzaWduYWxBbGwiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzwvY2xhc3M+CiA8Y2xhc3MgbmFtZT0iQWJzdHJhY3RRdWV1ZWRTeW5jaHJvbml6ZXIiCiAgZXh0ZW5kcz0iamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuQWJzdHJhY3RPd25hYmxlU3luY2hyb25pemVyIgogIGFic3RyYWN0PSJ0cnVlIgpAQCAtMzE4Mjc3LDYgKzMzMzQ4NywzMiBAQAogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KKzxtZXRob2QgbmFtZT0iZ2V0QmxvY2tlciIKKyByZXR1cm49ImphdmEubGFuZy5PYmplY3QiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idCIgdHlwZT0iamF2YS5sYW5nLlRocmVhZCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJwYXJrIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJibG9ja2VyIiB0eXBlPSJqYXZhLmxhbmcuT2JqZWN0Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InBhcmsiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTMxODI5OCw5ICszMzM1MzQsMzkgQEAKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+Cis8cGFyYW1ldGVyIG5hbWU9ImJsb2NrZXIiIHR5cGU9ImphdmEubGFuZy5PYmplY3QiPgorPC9wYXJhbWV0ZXI+CiA8cGFyYW1ldGVyIG5hbWU9Im5hbm9zIiB0eXBlPSJsb25nIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InBhcmtOYW5vcyIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibmFub3MiIHR5cGU9ImxvbmciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icGFya1VudGlsIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJibG9ja2VyIiB0eXBlPSJqYXZhLmxhbmcuT2JqZWN0Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJkZWFkbGluZSIgdHlwZT0ibG9uZyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJwYXJrVW50aWwiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTMxODY4OCw2ICszMzM5NTQsMTcgQEAKICB2aXNpYmlsaXR5PSJwcm90ZWN0ZWQiCiA+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0UmVhZEhvbGRDb3VudCIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJnZXRSZWFkTG9ja0NvdW50IgogIHJldHVybj0iaW50IgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTMxODk0OCw2ICszMzQyMjUsMjggQEAKIDxwYXJhbWV0ZXIgbmFtZT0ibG9jayIgdHlwZT0iamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuUmVlbnRyYW50UmVhZFdyaXRlTG9jayI+CiA8L3BhcmFtZXRlcj4KIDwvY29uc3RydWN0b3I+Cis8bWV0aG9kIG5hbWU9ImdldEhvbGRDb3VudCIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJpc0hlbGRCeUN1cnJlbnRUaHJlYWQiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImxvY2siCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTMyMjIyNCwxMyArMzM3NTIzLDI0IEBACiA8cGFyYW1ldGVyIG5hbWU9Im1zZyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPGZpZWxkIG5hbWU9IkdMT0JBTF9MT0dHRVJfTkFNRSIKKyB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSImcXVvdDtnbG9iYWwmcXVvdDsiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0iZ2xvYmFsIgogIHR5cGU9ImphdmEudXRpbC5sb2dnaW5nLkxvZ2dlciIKICB0cmFuc2llbnQ9ImZhbHNlIgogIHZvbGF0aWxlPSJmYWxzZSIKICBzdGF0aWM9InRydWUiCiAgZmluYWw9InRydWUiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgpAQCAtMzI0NTk3LDcgKzMzOTkwNyw3IEBACiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgotPHBhcmFtZXRlciBuYW1lPSJwYXR0ZXJuIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzxwYXJhbWV0ZXIgbmFtZT0icmVndWxhckV4cHJlc3Npb24iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgogPC9wYXJhbWV0ZXI+CiA8cGFyYW1ldGVyIG5hbWU9ImZsYWdzIiB0eXBlPSJpbnQiPgogPC9wYXJhbWV0ZXI+CkBAIC0zMjQ2NTEsNyArMzM5OTYxLDcgQEAKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+Ci08cGFyYW1ldGVyIG5hbWU9InJlZ2V4IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzxwYXJhbWV0ZXIgbmFtZT0icmVndWxhckV4cHJlc3Npb24iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgogPC9wYXJhbWV0ZXI+CiA8cGFyYW1ldGVyIG5hbWU9ImlucHV0IiB0eXBlPSJqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIj4KIDwvcGFyYW1ldGVyPgpAQCAtMzI0Njc3LDcgKzMzOTk4Nyw3IEBACiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgotPHBhcmFtZXRlciBuYW1lPSJzIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzxwYXJhbWV0ZXIgbmFtZT0ic3RyaW5nIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InNwbGl0IgpAQCAtMzI0NjkwLDcgKzM0MDAwMCw3IEBACiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgotPHBhcmFtZXRlciBuYW1lPSJpbnB1dFNlcSIgdHlwZT0iamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSI+Cis8cGFyYW1ldGVyIG5hbWU9ImlucHV0IiB0eXBlPSJqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIj4KIDwvcGFyYW1ldGVyPgogPHBhcmFtZXRlciBuYW1lPSJsaW1pdCIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgpAQCAtMzI1NTI4LDYgKzM0MDgzOCw3MiBAQAogPgogPC9maWVsZD4KIDwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iRGVmbGF0ZXJJbnB1dFN0cmVhbSIKKyBleHRlbmRzPSJqYXZhLmlvLkZpbHRlcklucHV0U3RyZWFtIgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8Y29uc3RydWN0b3IgbmFtZT0iRGVmbGF0ZXJJbnB1dFN0cmVhbSIKKyB0eXBlPSJqYXZhLnV0aWwuemlwLkRlZmxhdGVySW5wdXRTdHJlYW0iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJpbiIgdHlwZT0iamF2YS5pby5JbnB1dFN0cmVhbSI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iRGVmbGF0ZXJJbnB1dFN0cmVhbSIKKyB0eXBlPSJqYXZhLnV0aWwuemlwLkRlZmxhdGVySW5wdXRTdHJlYW0iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJpbiIgdHlwZT0iamF2YS5pby5JbnB1dFN0cmVhbSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZGVmbGF0ZXIiIHR5cGU9ImphdmEudXRpbC56aXAuRGVmbGF0ZXIiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IkRlZmxhdGVySW5wdXRTdHJlYW0iCisgdHlwZT0iamF2YS51dGlsLnppcC5EZWZsYXRlcklucHV0U3RyZWFtIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iaW4iIHR5cGU9ImphdmEuaW8uSW5wdXRTdHJlYW0iPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImRlZmxhdGVyIiB0eXBlPSJqYXZhLnV0aWwuemlwLkRlZmxhdGVyIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJidWZmZXJTaXplIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGZpZWxkIG5hbWU9ImJ1ZiIKKyB0eXBlPSJieXRlW10iCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9Im51bGwiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwcm90ZWN0ZWQiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9ImRlZiIKKyB0eXBlPSJqYXZhLnV0aWwuemlwLkRlZmxhdGVyIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHJvdGVjdGVkIgorPgorPC9maWVsZD4KKzwvY2xhc3M+CiA8Y2xhc3MgbmFtZT0iRGVmbGF0ZXJPdXRwdXRTdHJlYW0iCiAgZXh0ZW5kcz0iamF2YS5pby5GaWx0ZXJPdXRwdXRTdHJlYW0iCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMzI2MDAwLDcgKzM0MTM3Niw3IEBACiA+CiA8cGFyYW1ldGVyIG5hbWU9ImlzIiB0eXBlPSJqYXZhLmlvLklucHV0U3RyZWFtIj4KIDwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJpbmYiIHR5cGU9ImphdmEudXRpbC56aXAuSW5mbGF0ZXIiPgorPHBhcmFtZXRlciBuYW1lPSJpbmZsYXRlciIgdHlwZT0iamF2YS51dGlsLnppcC5JbmZsYXRlciI+CiA8L3BhcmFtZXRlcj4KIDwvY29uc3RydWN0b3I+CiA8Y29uc3RydWN0b3IgbmFtZT0iSW5mbGF0ZXJJbnB1dFN0cmVhbSIKQEAgLTMyNjAxMiw3ICszNDEzODgsNyBAQAogPgogPHBhcmFtZXRlciBuYW1lPSJpcyIgdHlwZT0iamF2YS5pby5JbnB1dFN0cmVhbSI+CiA8L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0iaW5mIiB0eXBlPSJqYXZhLnV0aWwuemlwLkluZmxhdGVyIj4KKzxwYXJhbWV0ZXIgbmFtZT0iaW5mbGF0ZXIiIHR5cGU9ImphdmEudXRpbC56aXAuSW5mbGF0ZXIiPgogPC9wYXJhbWV0ZXI+CiA8cGFyYW1ldGVyIG5hbWU9ImJzaXplIiB0eXBlPSJpbnQiPgogPC9wYXJhbWV0ZXI+CkBAIC0zMjYwNjIsNiArMzQxNDM4LDg1IEBACiA+CiA8L2ZpZWxkPgogPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJJbmZsYXRlck91dHB1dFN0cmVhbSIKKyBleHRlbmRzPSJqYXZhLmlvLkZpbHRlck91dHB1dFN0cmVhbSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGNvbnN0cnVjdG9yIG5hbWU9IkluZmxhdGVyT3V0cHV0U3RyZWFtIgorIHR5cGU9ImphdmEudXRpbC56aXAuSW5mbGF0ZXJPdXRwdXRTdHJlYW0iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJvdXQiIHR5cGU9ImphdmEuaW8uT3V0cHV0U3RyZWFtIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJJbmZsYXRlck91dHB1dFN0cmVhbSIKKyB0eXBlPSJqYXZhLnV0aWwuemlwLkluZmxhdGVyT3V0cHV0U3RyZWFtIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ib3V0IiB0eXBlPSJqYXZhLmlvLk91dHB1dFN0cmVhbSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iaW5mIiB0eXBlPSJqYXZhLnV0aWwuemlwLkluZmxhdGVyIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJJbmZsYXRlck91dHB1dFN0cmVhbSIKKyB0eXBlPSJqYXZhLnV0aWwuemlwLkluZmxhdGVyT3V0cHV0U3RyZWFtIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ib3V0IiB0eXBlPSJqYXZhLmlvLk91dHB1dFN0cmVhbSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iaW5mIiB0eXBlPSJqYXZhLnV0aWwuemlwLkluZmxhdGVyIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJidWZmZXJTaXplIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPG1ldGhvZCBuYW1lPSJmaW5pc2giCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGV4Y2VwdGlvbiBuYW1lPSJJT0V4Y2VwdGlvbiIgdHlwZT0iamF2YS5pby5JT0V4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPGZpZWxkIG5hbWU9ImJ1ZiIKKyB0eXBlPSJieXRlW10iCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9Im51bGwiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwcm90ZWN0ZWQiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9ImluZiIKKyB0eXBlPSJqYXZhLnV0aWwuemlwLkluZmxhdGVyIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHJvdGVjdGVkIgorPgorPC9maWVsZD4KKzwvY2xhc3M+CiA8Y2xhc3MgbmFtZT0iWmlwRW50cnkiCiAgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0zMjYzMTYsNiArMzQxNzcxLDI1IEBACiA+CiA8L2ZpZWxkPgogPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJaaXBFcnJvciIKKyBleHRlbmRzPSJqYXZhLmxhbmcuSW50ZXJuYWxFcnJvciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGNvbnN0cnVjdG9yIG5hbWU9IlppcEVycm9yIgorIHR5cGU9ImphdmEudXRpbC56aXAuWmlwRXJyb3IiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJzIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzwvY2xhc3M+CiA8Y2xhc3MgbmFtZT0iWmlwRXhjZXB0aW9uIgogIGV4dGVuZHM9ImphdmEuaW8uSU9FeGNlcHRpb24iCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMzQyMTE3LDggKzM1NzU5MSw2IEBACiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgotPGltcGxlbWVudHMgbmFtZT0iamF2YS5pby5TZXJpYWxpemFibGUiPgotPC9pbXBsZW1lbnRzPgogPGNvbnN0cnVjdG9yIG5hbWU9IkhhbmRzaGFrZUNvbXBsZXRlZEV2ZW50IgogIHR5cGU9ImphdmF4Lm5ldC5zc2wuSGFuZHNoYWtlQ29tcGxldGVkRXZlbnQiCiAgc3RhdGljPSJmYWxzZSIKQEAgLTM0MjcwOSwxMSArMzU4MTgxLDExIEBACiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgotPHBhcmFtZXRlciBuYW1lPSJwYXJhbWV0ZXJzIiB0eXBlPSJqYXZhLnV0aWwuTGlzdCI+Cis8cGFyYW1ldGVyIG5hbWU9InBhcmFtZXRlcnMiIHR5cGU9ImphdmEudXRpbC5MaXN0Jmx0O2phdmEuc2VjdXJpdHkuS2V5U3RvcmUuQnVpbGRlciZndDsiPgogPC9wYXJhbWV0ZXI+CiA8L2NvbnN0cnVjdG9yPgogPG1ldGhvZCBuYW1lPSJnZXRQYXJhbWV0ZXJzIgotIHJldHVybj0iamF2YS51dGlsLkxpc3QiCisgcmV0dXJuPSJqYXZhLnV0aWwuTGlzdCZsdDtqYXZhLnNlY3VyaXR5LktleVN0b3JlLkJ1aWxkZXImZ3Q7IgogIGFic3RyYWN0PSJmYWxzZSIKICBuYXRpdmU9ImZhbHNlIgogIHN5bmNocm9uaXplZD0iZmFsc2UiCkBAIC0zNDI3OTEsNiArMzU4MjYzLDMwIEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldERlZmF1bHQiCisgcmV0dXJuPSJqYXZheC5uZXQuc3NsLlNTTENvbnRleHQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxleGNlcHRpb24gbmFtZT0iTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNlY3VyaXR5Lk5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXREZWZhdWx0U1NMUGFyYW1ldGVycyIKKyByZXR1cm49ImphdmF4Lm5ldC5zc2wuU1NMUGFyYW1ldGVycyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldEluc3RhbmNlIgogIHJldHVybj0iamF2YXgubmV0LnNzbC5TU0xDb250ZXh0IgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTM0Mjg5Nyw2ICszNTgzOTMsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0U3VwcG9ydGVkU1NMUGFyYW1ldGVycyIKKyByZXR1cm49ImphdmF4Lm5ldC5zc2wuU1NMUGFyYW1ldGVycyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImluaXQiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTM0MjkxNiw2ICszNTg0MjMsMTkgQEAKIDxleGNlcHRpb24gbmFtZT0iS2V5TWFuYWdlbWVudEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zZWN1cml0eS5LZXlNYW5hZ2VtZW50RXhjZXB0aW9uIj4KIDwvZXhjZXB0aW9uPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldERlZmF1bHQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InNzbENvbnRleHQiIHR5cGU9ImphdmF4Lm5ldC5zc2wuU1NMQ29udGV4dCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPC9jbGFzcz4KIDxjbGFzcyBuYW1lPSJTU0xDb250ZXh0U3BpIgogIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCkBAIC0zNDI5NzAsNiArMzU4NDkwLDE3IEBACiAgdmlzaWJpbGl0eT0icHJvdGVjdGVkIgogPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImVuZ2luZUdldERlZmF1bHRTU0xQYXJhbWV0ZXJzIgorIHJldHVybj0iamF2YXgubmV0LnNzbC5TU0xQYXJhbWV0ZXJzIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHJvdGVjdGVkIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImVuZ2luZUdldFNlcnZlclNlc3Npb25Db250ZXh0IgogIHJldHVybj0iamF2YXgubmV0LnNzbC5TU0xTZXNzaW9uQ29udGV4dCIKICBhYnN0cmFjdD0idHJ1ZSIKQEAgLTM0MzAwMyw2ICszNTg1MzQsMTcgQEAKICB2aXNpYmlsaXR5PSJwcm90ZWN0ZWQiCiA+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZW5naW5lR2V0U3VwcG9ydGVkU1NMUGFyYW1ldGVycyIKKyByZXR1cm49ImphdmF4Lm5ldC5zc2wuU1NMUGFyYW1ldGVycyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InByb3RlY3RlZCIKKz4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJlbmdpbmVJbml0IgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0idHJ1ZSIKQEAgLTM0MzE3Niw2ICszNTg3MTgsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0U1NMUGFyYW1ldGVycyIKKyByZXR1cm49ImphdmF4Lm5ldC5zc2wuU1NMUGFyYW1ldGVycyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJnZXRTZXNzaW9uIgogIHJldHVybj0iamF2YXgubmV0LnNzbC5TU0xTZXNzaW9uIgogIGFic3RyYWN0PSJ0cnVlIgpAQCAtMzQzMzA1LDYgKzM1ODg1OCwxOSBAQAogPHBhcmFtZXRlciBuYW1lPSJuZWVkIiB0eXBlPSJib29sZWFuIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFNTTFBhcmFtZXRlcnMiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwIiB0eXBlPSJqYXZheC5uZXQuc3NsLlNTTFBhcmFtZXRlcnMiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2V0VXNlQ2xpZW50TW9kZSIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9InRydWUiCkBAIC0zNDM2NTYsNiArMzU5MjIyLDE0MSBAQAogPC9wYXJhbWV0ZXI+CiA8L2NvbnN0cnVjdG9yPgogPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJTU0xQYXJhbWV0ZXJzIgorIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTU0xQYXJhbWV0ZXJzIgorIHR5cGU9ImphdmF4Lm5ldC5zc2wuU1NMUGFyYW1ldGVycyIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IlNTTFBhcmFtZXRlcnMiCisgdHlwZT0iamF2YXgubmV0LnNzbC5TU0xQYXJhbWV0ZXJzIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY2lwaGVyU3VpdGVzIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nW10iPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IlNTTFBhcmFtZXRlcnMiCisgdHlwZT0iamF2YXgubmV0LnNzbC5TU0xQYXJhbWV0ZXJzIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY2lwaGVyU3VpdGVzIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nW10iPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InByb3RvY29scyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZ1tdIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxtZXRob2QgbmFtZT0iZ2V0Q2lwaGVyU3VpdGVzIgorIHJldHVybj0iamF2YS5sYW5nLlN0cmluZ1tdIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldE5lZWRDbGllbnRBdXRoIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRQcm90b2NvbHMiCisgcmV0dXJuPSJqYXZhLmxhbmcuU3RyaW5nW10iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0V2FudENsaWVudEF1dGgiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldENpcGhlclN1aXRlcyIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNpcGhlclN1aXRlcyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZ1tdIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldE5lZWRDbGllbnRBdXRoIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibmVlZENsaWVudEF1dGgiIHR5cGU9ImJvb2xlYW4iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0UHJvdG9jb2xzIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icHJvdG9jb2xzIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nW10iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0V2FudENsaWVudEF1dGgiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ3YW50Q2xpZW50QXV0aCIgdHlwZT0iYm9vbGVhbiI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPC9jbGFzcz4KIDxjbGFzcyBuYW1lPSJTU0xQZWVyVW52ZXJpZmllZEV4Y2VwdGlvbiIKICBleHRlbmRzPSJqYXZheC5uZXQuc3NsLlNTTEV4Y2VwdGlvbiIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0zNDQyNjMsOCArMzU5OTY0LDYgQEAKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+Ci08aW1wbGVtZW50cyBuYW1lPSJqYXZhLmlvLlNlcmlhbGl6YWJsZSI+Ci08L2ltcGxlbWVudHM+CiA8Y29uc3RydWN0b3IgbmFtZT0iU1NMU2Vzc2lvbkJpbmRpbmdFdmVudCIKICB0eXBlPSJqYXZheC5uZXQuc3NsLlNTTFNlc3Npb25CaW5kaW5nRXZlbnQiCiAgc3RhdGljPSJmYWxzZSIKQEAgLTM0NDM0NCw3ICszNjAwNDMsNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDxtZXRob2QgbmFtZT0iZ2V0SWRzIgotIHJldHVybj0iamF2YS51dGlsLkVudW1lcmF0aW9uIgorIHJldHVybj0iamF2YS51dGlsLkVudW1lcmF0aW9uJmx0O2J5dGVbXSZndDsiCiAgYWJzdHJhY3Q9InRydWUiCiAgbmF0aXZlPSJmYWxzZSIKICBzeW5jaHJvbml6ZWQ9ImZhbHNlIgpAQCAtMzQ0NTYxLDYgKzM2MDI2MCwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRTU0xQYXJhbWV0ZXJzIgorIHJldHVybj0iamF2YXgubmV0LnNzbC5TU0xQYXJhbWV0ZXJzIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldFNlc3Npb24iCiAgcmV0dXJuPSJqYXZheC5uZXQuc3NsLlNTTFNlc3Npb24iCiAgYWJzdHJhY3Q9InRydWUiCkBAIC0zNDQ2ODEsNiArMzYwMzkxLDE5IEBACiA8cGFyYW1ldGVyIG5hbWU9Im5lZWQiIHR5cGU9ImJvb2xlYW4iPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0U1NMUGFyYW1ldGVycyIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InAiIHR5cGU9ImphdmF4Lm5ldC5zc2wuU1NMUGFyYW1ldGVycyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzZXRVc2VDbGllbnRNb2RlIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0idHJ1ZSIKQEAgLTM0NTg5MCw2ICszNjE2MTMsMTggQEAKIDxwYXJhbWV0ZXIgbmFtZT0ibmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+CiA8L3BhcmFtZXRlcj4KIDwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iWDUwMFByaW5jaXBhbCIKKyB0eXBlPSJqYXZheC5zZWN1cml0eS5hdXRoLng1MDAuWDUwMFByaW5jaXBhbCIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImtleXdvcmRNYXAiIHR5cGU9ImphdmEudXRpbC5NYXAmbHQ7amF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZyZndDsiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgogPG1ldGhvZCBuYW1lPSJnZXRFbmNvZGVkIgogIHJldHVybj0iYnl0ZVtdIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTM0NTkyNSw2ICszNjE2NjAsMjEgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iZm9ybWF0IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldE5hbWUiCisgcmV0dXJuPSJqYXZhLmxhbmcuU3RyaW5nIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJmb3JtYXQiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Im9pZE1hcCIgdHlwZT0iamF2YS51dGlsLk1hcCZsdDtqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nJmd0OyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPGZpZWxkIG5hbWU9IkNBTk9OSUNBTCIKICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC0zNDYzNzgsNiArMzYyMTI4LDcwIEBACiA8L3BhY2thZ2U+CiA8cGFja2FnZSBuYW1lPSJqYXZheC5zcWwiCiA+Cis8aW50ZXJmYWNlIG5hbWU9IkNvbW1vbkRhdGFTb3VyY2UiCisgYWJzdHJhY3Q9InRydWUiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPG1ldGhvZCBuYW1lPSJnZXRMb2dXcml0ZXIiCisgcmV0dXJuPSJqYXZhLmlvLlByaW50V3JpdGVyIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldExvZ2luVGltZW91dCIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRMb2dXcml0ZXIiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im91dCIgdHlwZT0iamF2YS5pby5QcmludFdyaXRlciI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0TG9naW5UaW1lb3V0IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJzZWNvbmRzIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8L2ludGVyZmFjZT4KIDxjbGFzcyBuYW1lPSJDb25uZWN0aW9uRXZlbnQiCiAgZXh0ZW5kcz0iamF2YS51dGlsLkV2ZW50T2JqZWN0IgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTM0NjQ2NSwzMiArMzYyMjc5LDggQEAKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+Ci08bWV0aG9kIG5hbWU9ImdldExvZ1dyaXRlciIKLSByZXR1cm49ImphdmEuaW8uUHJpbnRXcml0ZXIiCi0gYWJzdHJhY3Q9InRydWUiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgotPC9leGNlcHRpb24+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0iZ2V0TG9naW5UaW1lb3V0IgotIHJldHVybj0iaW50IgotIGFic3RyYWN0PSJ0cnVlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KLTwvZXhjZXB0aW9uPgotPC9tZXRob2Q+Cis8aW1wbGVtZW50cyBuYW1lPSJqYXZheC5zcWwuQ29tbW9uRGF0YVNvdXJjZSI+Cis8L2ltcGxlbWVudHM+CiA8bWV0aG9kIG5hbWU9ImdldFBvb2xlZENvbm5lY3Rpb24iCiAgcmV0dXJuPSJqYXZheC5zcWwuUG9vbGVkQ29ubmVjdGlvbiIKICBhYnN0cmFjdD0idHJ1ZSIKQEAgLTM0NjUyMSwzNiArMzYyMzExLDYgQEAKIDxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgogPC9leGNlcHRpb24+CiA8L21ldGhvZD4KLTxtZXRob2QgbmFtZT0ic2V0TG9nV3JpdGVyIgotIHJldHVybj0idm9pZCIKLSBhYnN0cmFjdD0idHJ1ZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPHBhcmFtZXRlciBuYW1lPSJ0aGVXcml0ZXIiIHR5cGU9ImphdmEuaW8uUHJpbnRXcml0ZXIiPgotPC9wYXJhbWV0ZXI+Ci08ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KLTwvZXhjZXB0aW9uPgotPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9InNldExvZ2luVGltZW91dCIKLSByZXR1cm49InZvaWQiCi0gYWJzdHJhY3Q9InRydWUiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0idGhlVGltZW91dCIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+Ci08L2V4Y2VwdGlvbj4KLTwvbWV0aG9kPgogPC9pbnRlcmZhY2U+CiA8aW50ZXJmYWNlIG5hbWU9IkRhdGFTb3VyY2UiCiAgYWJzdHJhY3Q9InRydWUiCkBAIC0zNDY1NTksNiArMzYyMzE5LDEwIEBACiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgorPGltcGxlbWVudHMgbmFtZT0iamF2YXguc3FsLkNvbW1vbkRhdGFTb3VyY2UiPgorPC9pbXBsZW1lbnRzPgorPGltcGxlbWVudHMgbmFtZT0iamF2YS5zcWwuV3JhcHBlciI+Cis8L2ltcGxlbWVudHM+CiA8bWV0aG9kIG5hbWU9ImdldENvbm5lY3Rpb24iCiAgcmV0dXJuPSJqYXZhLnNxbC5Db25uZWN0aW9uIgogIGFic3RyYWN0PSJ0cnVlIgpAQCAtMzQ2NTg5LDYyICszNjIzNTMsNiBAQAogPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+CiA8L2V4Y2VwdGlvbj4KIDwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJnZXRMb2dXcml0ZXIiCi0gcmV0dXJuPSJqYXZhLmlvLlByaW50V3JpdGVyIgotIGFic3RyYWN0PSJ0cnVlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KLTwvZXhjZXB0aW9uPgotPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9ImdldExvZ2luVGltZW91dCIKLSByZXR1cm49ImludCIKLSBhYnN0cmFjdD0idHJ1ZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+Ci08L2V4Y2VwdGlvbj4KLTwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJzZXRMb2dXcml0ZXIiCi0gcmV0dXJuPSJ2b2lkIgotIGFic3RyYWN0PSJ0cnVlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08cGFyYW1ldGVyIG5hbWU9InRoZVdyaXRlciIgdHlwZT0iamF2YS5pby5QcmludFdyaXRlciI+Ci08L3BhcmFtZXRlcj4KLTxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgotPC9leGNlcHRpb24+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0ic2V0TG9naW5UaW1lb3V0IgotIHJldHVybj0idm9pZCIKLSBhYnN0cmFjdD0idHJ1ZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPHBhcmFtZXRlciBuYW1lPSJ0aGVUaW1lb3V0IiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KLTwvZXhjZXB0aW9uPgotPC9tZXRob2Q+CiA8L2ludGVyZmFjZT4KIDxpbnRlcmZhY2UgbmFtZT0iUG9vbGVkQ29ubmVjdGlvbiIKICBhYnN0cmFjdD0idHJ1ZSIKQEAgLTM0NjY2Niw2ICszNjIzNzQsMTkgQEAKIDxwYXJhbWV0ZXIgbmFtZT0idGhlTGlzdGVuZXIiIHR5cGU9ImphdmF4LnNxbC5Db25uZWN0aW9uRXZlbnRMaXN0ZW5lciI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJhZGRTdGF0ZW1lbnRFdmVudExpc3RlbmVyIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJsaXN0ZW5lciIgdHlwZT0iamF2YXguc3FsLlN0YXRlbWVudEV2ZW50TGlzdGVuZXIiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iY2xvc2UiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJ0cnVlIgpAQCAtMzQ2NzA1LDYgKzM2MjQyNiwxOSBAQAogPHBhcmFtZXRlciBuYW1lPSJ0aGVMaXN0ZW5lciIgdHlwZT0iamF2YXguc3FsLkNvbm5lY3Rpb25FdmVudExpc3RlbmVyIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InJlbW92ZVN0YXRlbWVudEV2ZW50TGlzdGVuZXIiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Imxpc3RlbmVyIiB0eXBlPSJqYXZheC5zcWwuU3RhdGVtZW50RXZlbnRMaXN0ZW5lciI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPC9pbnRlcmZhY2U+CiA8aW50ZXJmYWNlIG5hbWU9IlJvd1NldCIKICBhYnN0cmFjdD0idHJ1ZSIKQEAgLTM0Njk0Nyw2ICszNjI2ODEsNTkgQEAKIDxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgogPC9leGNlcHRpb24+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0QXNjaWlTdHJlYW0iCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InBhcmFtZXRlckluZGV4IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InRoZUlucHV0U3RyZWFtIiB0eXBlPSJqYXZhLmlvLklucHV0U3RyZWFtIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRBc2NpaVN0cmVhbSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icGFyYW1ldGVyTmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idGhlSW5wdXRTdHJlYW0iIHR5cGU9ImphdmEuaW8uSW5wdXRTdHJlYW0iPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldEFzY2lpU3RyZWFtIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwYXJhbWV0ZXJOYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ0aGVJbnB1dFN0cmVhbSIgdHlwZT0iamF2YS5pby5JbnB1dFN0cmVhbSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibGVuZ3RoIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InNldEJpZ0RlY2ltYWwiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJ0cnVlIgpAQCAtMzQ2OTY0LDYgKzM2Mjc1MSwyMyBAQAogPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+CiA8L2V4Y2VwdGlvbj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRCaWdEZWNpbWFsIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwYXJhbWV0ZXJOYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ0aGVCaWdEZWNpbWFsIiB0eXBlPSJqYXZhLm1hdGguQmlnRGVjaW1hbCI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2V0QmluYXJ5U3RyZWFtIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0idHJ1ZSIKQEAgLTM0Njk4Myw2ICszNjI3ODcsNTkgQEAKIDxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgogPC9leGNlcHRpb24+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0QmluYXJ5U3RyZWFtIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwYXJhbWV0ZXJJbmRleCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ0aGVJbnB1dFN0cmVhbSIgdHlwZT0iamF2YS5pby5JbnB1dFN0cmVhbSI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0QmluYXJ5U3RyZWFtIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwYXJhbWV0ZXJOYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ0aGVJbnB1dFN0cmVhbSIgdHlwZT0iamF2YS5pby5JbnB1dFN0cmVhbSI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0QmluYXJ5U3RyZWFtIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwYXJhbWV0ZXJOYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ0aGVJbnB1dFN0cmVhbSIgdHlwZT0iamF2YS5pby5JbnB1dFN0cmVhbSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibGVuZ3RoIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InNldEJsb2IiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJ0cnVlIgpAQCAtMzQ3MDAwLDYgKzM2Mjg1Nyw5NSBAQAogPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+CiA8L2V4Y2VwdGlvbj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRCbG9iIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwYXJhbWV0ZXJJbmRleCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ0aGVJbnB1dFN0cmVhbSIgdHlwZT0iamF2YS5pby5JbnB1dFN0cmVhbSI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0QmxvYiIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icGFyYW1ldGVySW5kZXgiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idGhlSW5wdXRTdHJlYW0iIHR5cGU9ImphdmEuaW8uSW5wdXRTdHJlYW0iPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Imxlbmd0aCIgdHlwZT0ibG9uZyI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0QmxvYiIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icGFyYW1ldGVyTmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idGhlSW5wdXRTdHJlYW0iIHR5cGU9ImphdmEuaW8uSW5wdXRTdHJlYW0iPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldEJsb2IiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InBhcmFtZXRlck5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InRoZUlucHV0U3RyZWFtIiB0eXBlPSJqYXZhLmlvLklucHV0U3RyZWFtIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJsZW5ndGgiIHR5cGU9ImxvbmciPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldEJsb2IiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InBhcmFtZXRlck5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InRoZUJsb2IiIHR5cGU9ImphdmEuc3FsLkJsb2IiPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InNldEJvb2xlYW4iCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJ0cnVlIgpAQCAtMzQ3MDE3LDYgKzM2Mjk2MywyMyBAQAogPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+CiA8L2V4Y2VwdGlvbj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRCb29sZWFuIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwYXJhbWV0ZXJOYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ0aGVCb29sZWFuIiB0eXBlPSJib29sZWFuIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzZXRCeXRlIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0idHJ1ZSIKQEAgLTM0NzAzNCw2ICszNjI5OTcsMjMgQEAKIDxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgogPC9leGNlcHRpb24+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0Qnl0ZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icGFyYW1ldGVyTmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idGhlQnl0ZSIgdHlwZT0iYnl0ZSI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2V0Qnl0ZXMiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJ0cnVlIgpAQCAtMzQ3MDUxLDYgKzM2MzAzMSwyMyBAQAogPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+CiA8L2V4Y2VwdGlvbj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRCeXRlcyIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icGFyYW1ldGVyTmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idGhlQnl0ZUFycmF5IiB0eXBlPSJieXRlW10iPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InNldENoYXJhY3RlclN0cmVhbSIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9InRydWUiCkBAIC0zNDcwNzAsNiArMzYzMDY3LDU5IEBACiA8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KIDwvZXhjZXB0aW9uPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldENoYXJhY3RlclN0cmVhbSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icGFyYW1ldGVySW5kZXgiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idGhlUmVhZGVyIiB0eXBlPSJqYXZhLmlvLlJlYWRlciI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0Q2hhcmFjdGVyU3RyZWFtIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwYXJhbWV0ZXJOYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ0aGVSZWFkZXIiIHR5cGU9ImphdmEuaW8uUmVhZGVyIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRDaGFyYWN0ZXJTdHJlYW0iCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InBhcmFtZXRlck5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InRoZVJlYWRlciIgdHlwZT0iamF2YS5pby5SZWFkZXIiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Imxlbmd0aCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzZXRDbG9iIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0idHJ1ZSIKQEAgLTM0NzA4Nyw2ICszNjMxMzcsOTUgQEAKIDxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgogPC9leGNlcHRpb24+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0Q2xvYiIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icGFyYW1ldGVySW5kZXgiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idGhlUmVhZGVyIiB0eXBlPSJqYXZhLmlvLlJlYWRlciI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0Q2xvYiIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icGFyYW1ldGVySW5kZXgiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idGhlUmVhZGVyIiB0eXBlPSJqYXZhLmlvLlJlYWRlciI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibGVuZ3RoIiB0eXBlPSJsb25nIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRDbG9iIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwYXJhbWV0ZXJOYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ0aGVDbG9iIiB0eXBlPSJqYXZhLnNxbC5DbG9iIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRDbG9iIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwYXJhbWV0ZXJOYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ0aGVSZWFkZXIiIHR5cGU9ImphdmEuaW8uUmVhZGVyIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRDbG9iIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwYXJhbWV0ZXJOYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ0aGVSZWFkZXIiIHR5cGU9ImphdmEuaW8uUmVhZGVyIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJsZW5ndGgiIHR5cGU9ImxvbmciPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InNldENvbW1hbmQiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJ0cnVlIgpAQCAtMzQ3MTY4LDYgKzM2MzMwNyw0MiBAQAogPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+CiA8L2V4Y2VwdGlvbj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXREYXRlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwYXJhbWV0ZXJOYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ0aGVEYXRlIiB0eXBlPSJqYXZhLnNxbC5EYXRlIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXREYXRlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwYXJhbWV0ZXJOYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ0aGVEYXRlIiB0eXBlPSJqYXZhLnNxbC5EYXRlIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ0aGVDYWxlbmRhciIgdHlwZT0iamF2YS51dGlsLkNhbGVuZGFyIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzZXREb3VibGUiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJ0cnVlIgpAQCAtMzQ3MTg1LDYgKzM2MzM2MCwyMyBAQAogPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+CiA8L2V4Y2VwdGlvbj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXREb3VibGUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InBhcmFtZXRlck5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InRoZURvdWJsZSIgdHlwZT0iZG91YmxlIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzZXRFc2NhcGVQcm9jZXNzaW5nIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0idHJ1ZSIKQEAgLTM0NzIxNyw2ICszNjM0MDksMjMgQEAKIDxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgogPC9leGNlcHRpb24+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0RmxvYXQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InBhcmFtZXRlck5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InRoZUZsb2F0IiB0eXBlPSJmbG9hdCI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2V0SW50IgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0idHJ1ZSIKQEAgLTM0NzIzNCw2ICszNjM0NDMsMjMgQEAKIDxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgogPC9leGNlcHRpb24+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0SW50IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwYXJhbWV0ZXJOYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ0aGVJbnRlZ2VyIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InNldExvbmciCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJ0cnVlIgpAQCAtMzQ3MjUxLDYgKzM2MzQ3NywyMyBAQAogPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+CiA8L2V4Y2VwdGlvbj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRMb25nIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwYXJhbWV0ZXJOYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ0aGVMb25nIiB0eXBlPSJsb25nIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzZXRNYXhGaWVsZFNpemUiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJ0cnVlIgpAQCAtMzQ3MjgxLDYgKzM2MzUyNCwyMTggQEAKIDxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgogPC9leGNlcHRpb24+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0TkNoYXJhY3RlclN0cmVhbSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icGFyYW1ldGVySW5kZXgiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idGhlUmVhZGVyIiB0eXBlPSJqYXZhLmlvLlJlYWRlciI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0TkNoYXJhY3RlclN0cmVhbSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icGFyYW1ldGVySW5kZXgiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idGhlUmVhZGVyIiB0eXBlPSJqYXZhLmlvLlJlYWRlciI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibGVuZ3RoIiB0eXBlPSJsb25nIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXROQ2hhcmFjdGVyU3RyZWFtIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwYXJhbWV0ZXJOYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ0aGVSZWFkZXIiIHR5cGU9ImphdmEuaW8uUmVhZGVyIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXROQ2hhcmFjdGVyU3RyZWFtIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwYXJhbWV0ZXJOYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ0aGVSZWFkZXIiIHR5cGU9ImphdmEuaW8uUmVhZGVyIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJsZW5ndGgiIHR5cGU9ImxvbmciPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldE5DbG9iIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwYXJhbWV0ZXJJbmRleCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ0aGVOQ2xvYiIgdHlwZT0iamF2YS5zcWwuTkNsb2IiPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldE5DbG9iIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwYXJhbWV0ZXJJbmRleCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ0aGVSZWFkZXIiIHR5cGU9ImphdmEuaW8uUmVhZGVyIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXROQ2xvYiIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icGFyYW1ldGVySW5kZXgiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idGhlUmVhZGVyIiB0eXBlPSJqYXZhLmlvLlJlYWRlciI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibGVuZ3RoIiB0eXBlPSJsb25nIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXROQ2xvYiIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icGFyYW1ldGVyTmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idGhlTkNsb2IiIHR5cGU9ImphdmEuc3FsLk5DbG9iIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXROQ2xvYiIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icGFyYW1ldGVyTmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idGhlUmVhZGVyIiB0eXBlPSJqYXZhLmlvLlJlYWRlciI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0TkNsb2IiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InBhcmFtZXRlck5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InRoZVJlYWRlciIgdHlwZT0iamF2YS5pby5SZWFkZXIiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Imxlbmd0aCIgdHlwZT0ibG9uZyI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0TlN0cmluZyIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icGFyYW1ldGVySW5kZXgiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idGhlTlN0cmluZyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0TlN0cmluZyIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icGFyYW1ldGVyTmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idGhlTlN0cmluZyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2V0TnVsbCIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9InRydWUiCkBAIC0zNDczMTcsNiArMzYzNzcyLDQyIEBACiA8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KIDwvZXhjZXB0aW9uPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldE51bGwiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InBhcmFtZXRlck5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InNxbFR5cGUiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0TnVsbCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icGFyYW1ldGVyTmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ic3FsVHlwZSIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ0eXBlTmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2V0T2JqZWN0IgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0idHJ1ZSIKQEAgLTM0NzM3NCw2ICszNjM4NjUsNjMgQEAKIDxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgogPC9leGNlcHRpb24+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0T2JqZWN0IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwYXJhbWV0ZXJOYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ0aGVPYmplY3QiIHR5cGU9ImphdmEubGFuZy5PYmplY3QiPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldE9iamVjdCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icGFyYW1ldGVyTmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idGhlT2JqZWN0IiB0eXBlPSJqYXZhLmxhbmcuT2JqZWN0Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ0YXJnZXRTcWxUeXBlIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldE9iamVjdCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icGFyYW1ldGVyTmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idGhlT2JqZWN0IiB0eXBlPSJqYXZhLmxhbmcuT2JqZWN0Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ0YXJnZXRTcWxUeXBlIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InNjYWxlIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InNldFBhc3N3b3JkIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0idHJ1ZSIKQEAgLTM0NzQzNiw2ICszNjM5ODQsNzQgQEAKIDxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgogPC9leGNlcHRpb24+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0Um93SWQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InBhcmFtZXRlckluZGV4IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InRoZVJvd0lkIiB0eXBlPSJqYXZhLnNxbC5Sb3dJZCI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0Um93SWQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InBhcmFtZXRlck5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InRoZVJvd0lkIiB0eXBlPSJqYXZhLnNxbC5Sb3dJZCI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0U1FMWE1MIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwYXJhbWV0ZXJJbmRleCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ0aGVTUUxYTUwiIHR5cGU9ImphdmEuc3FsLlNRTFhNTCI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0U1FMWE1MIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwYXJhbWV0ZXJOYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ0aGVTUUxYTUwiIHR5cGU9ImphdmEuc3FsLlNRTFhNTCI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2V0U2hvcnQiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJ0cnVlIgpAQCAtMzQ3NDUzLDYgKzM2NDA2OSwyMyBAQAogPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+CiA8L2V4Y2VwdGlvbj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRTaG9ydCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icGFyYW1ldGVyTmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idGhlU2hvcnQiIHR5cGU9InNob3J0Ij4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzZXRTdHJpbmciCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJ0cnVlIgpAQCAtMzQ3NDcwLDYgKzM2NDEwMywyMyBAQAogPGV4Y2VwdGlvbiBuYW1lPSJTUUxFeGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+CiA8L2V4Y2VwdGlvbj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRTdHJpbmciCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InBhcmFtZXRlck5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InRoZVN0cmluZyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2V0VGltZSIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9InRydWUiCkBAIC0zNDc1MDYsNiArMzY0MTU2LDQyIEBACiA8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KIDwvZXhjZXB0aW9uPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFRpbWUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InBhcmFtZXRlck5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InRoZVRpbWUiIHR5cGU9ImphdmEuc3FsLlRpbWUiPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFRpbWUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InBhcmFtZXRlck5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InRoZVRpbWUiIHR5cGU9ImphdmEuc3FsLlRpbWUiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InRoZUNhbGVuZGFyIiB0eXBlPSJqYXZhLnV0aWwuQ2FsZW5kYXIiPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InNldFRpbWVzdGFtcCIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9InRydWUiCkBAIC0zNDc1NDIsNiArMzY0MjI4LDQyIEBACiA8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KIDwvZXhjZXB0aW9uPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFRpbWVzdGFtcCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icGFyYW1ldGVyTmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idGhlVGltZXN0YW1wIiB0eXBlPSJqYXZhLnNxbC5UaW1lc3RhbXAiPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFRpbWVzdGFtcCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icGFyYW1ldGVyTmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idGhlVGltZXN0YW1wIiB0eXBlPSJqYXZhLnNxbC5UaW1lc3RhbXAiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InRoZUNhbGVuZGFyIiB0eXBlPSJqYXZhLnV0aWwuQ2FsZW5kYXIiPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5zcWwuU1FMRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InNldFRyYW5zYWN0aW9uSXNvbGF0aW9uIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0idHJ1ZSIKQEAgLTM0NzU4Nyw2ICszNjQzMDksMjMgQEAKIDxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgogPC9leGNlcHRpb24+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0VVJMIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwYXJhbWV0ZXJJbmRleCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ0aGVVUkwiIHR5cGU9ImphdmEubmV0LlVSTCI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iU1FMRXhjZXB0aW9uIiB0eXBlPSJqYXZhLnNxbC5TUUxFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2V0VXJsIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0idHJ1ZSIKQEAgLTM0ODEwNiw2ICszNjQ4NDUsOTkgQEAKIDwvZXhjZXB0aW9uPgogPC9tZXRob2Q+CiA8L2ludGVyZmFjZT4KKzxjbGFzcyBuYW1lPSJTdGF0ZW1lbnRFdmVudCIKKyBleHRlbmRzPSJqYXZhLnV0aWwuRXZlbnRPYmplY3QiCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTdGF0ZW1lbnRFdmVudCIKKyB0eXBlPSJqYXZheC5zcWwuU3RhdGVtZW50RXZlbnQiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb24iIHR5cGU9ImphdmF4LnNxbC5Qb29sZWRDb25uZWN0aW9uIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJzdGF0ZW1lbnQiIHR5cGU9ImphdmEuc3FsLlByZXBhcmVkU3RhdGVtZW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJleGNlcHRpb24iIHR5cGU9ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iU3RhdGVtZW50RXZlbnQiCisgdHlwZT0iamF2YXguc3FsLlN0YXRlbWVudEV2ZW50IgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29uIiB0eXBlPSJqYXZheC5zcWwuUG9vbGVkQ29ubmVjdGlvbiI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ic3RhdGVtZW50IiB0eXBlPSJqYXZhLnNxbC5QcmVwYXJlZFN0YXRlbWVudCI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8bWV0aG9kIG5hbWU9ImdldFNRTEV4Y2VwdGlvbiIKKyByZXR1cm49ImphdmEuc3FsLlNRTEV4Y2VwdGlvbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRTdGF0ZW1lbnQiCisgcmV0dXJuPSJqYXZhLnNxbC5QcmVwYXJlZFN0YXRlbWVudCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPC9jbGFzcz4KKzxpbnRlcmZhY2UgbmFtZT0iU3RhdGVtZW50RXZlbnRMaXN0ZW5lciIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8aW1wbGVtZW50cyBuYW1lPSJqYXZhLnV0aWwuRXZlbnRMaXN0ZW5lciI+Cis8L2ltcGxlbWVudHM+Cis8bWV0aG9kIG5hbWU9InN0YXRlbWVudENsb3NlZCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZXZlbnQiIHR5cGU9ImphdmF4LnNxbC5TdGF0ZW1lbnRFdmVudCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzdGF0ZW1lbnRFcnJvck9jY3VycmVkIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJldmVudCIgdHlwZT0iamF2YXguc3FsLlN0YXRlbWVudEV2ZW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8L2ludGVyZmFjZT4KIDwvcGFja2FnZT4KIDxwYWNrYWdlIG5hbWU9ImphdmF4LnhtbCIKID4KZGlmZiAtLWdpdCBhL2NtZHMvZHVtcHN0YXRlL2R1bXBzdGF0ZS5jIGIvY21kcy9kdW1wc3RhdGUvZHVtcHN0YXRlLmMKaW5kZXggMDgyZTcwNC4uMWZkZTQzNyAxMDA2NDQKLS0tIGEvY21kcy9kdW1wc3RhdGUvZHVtcHN0YXRlLmMKKysrIGIvY21kcy9kdW1wc3RhdGUvZHVtcHN0YXRlLmMKQEAgLTEwMyw2ICsxMDMsOSBAQAogICAgIGR1bXBfZmlsZSgiTkVUV09SSyBST1VURVMiLCAiL3Byb2MvbmV0L3JvdXRlIik7CiAgICAgZHVtcF9maWxlKCJBUlAgQ0FDSEUiLCAiL3Byb2MvbmV0L2FycCIpOwogCisgICAgcnVuX2NvbW1hbmQoIldJRkkgTkVUV09SS1MiLCAyMCwKKyAgICAgICAgICAgICJzdSIsICJyb290IiwgIndwYV9jbGkiLCAibGlzdF9uZXR3b3JrcyIsIE5VTEwpOworCiAjaWZkZWYgRldEVU1QX2JjbTQzMjkKICAgICBydW5fY29tbWFuZCgiRFVNUCBXSUZJIEZJUk1XQVJFIExPRyIsIDYwLAogICAgICAgICAgICAgInN1IiwgInJvb3QiLCAiZGhkdXRpbCIsICItaSIsICJldGgwIiwgInVwbG9hZCIsICIvZGF0YS9sb2NhbC90bXAvd2xhbl9jcmFzaC5kdW1wIiwgTlVMTCk7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hY2NvdW50cy9BY2NvdW50TWFuYWdlclNlcnZpY2UuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FjY291bnRzL0FjY291bnRNYW5hZ2VyU2VydmljZS5qYXZhCmluZGV4IDFkOWUwZjEuLjJlYWQ5NzYgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2FjY291bnRzL0FjY291bnRNYW5hZ2VyU2VydmljZS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FjY291bnRzL0FjY291bnRNYW5hZ2VyU2VydmljZS5qYXZhCkBAIC0xNjU3LDcgKzE2NTcsNyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBib29sZWFuIG5lZWRzUHJvdmlzaW9uaW5nOwogICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIG5lZWRzUHJvdmlzaW9uaW5nID0gdGVsZXBob255LmdldENkbWFOZWVkc1Byb3Zpc2lvbmluZygpOworICAgICAgICAgICAgICAgICAgICBuZWVkc1Byb3Zpc2lvbmluZyA9IHRlbGVwaG9ueS5uZWVkc090YVNlcnZpY2VQcm92aXNpb25pbmcoKTsKICAgICAgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJleGNlcHRpb24gd2hpbGUgY2hlY2tpbmcgcHJvdmlzaW9uaW5nIiwgZSk7CiAgICAgICAgICAgICAgICAgICAgIC8vIGRlZmF1bHQgdG8gTk9UIHdpcGluZyBvdXQgdGhlIHBhc3N3b3JkcwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0FjdGlvbkJhci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0FjdGlvbkJhci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzODczNjEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvQWN0aW9uQmFyLmphdmEKQEAgLTAsMCArMSwyNDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuYXBwOworCitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudUl0ZW07CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuU3Bpbm5lckFkYXB0ZXI7CisKKy8qKgorICogVGhpcyBpcyB0aGUgcHVibGljIGludGVyZmFjZSB0byB0aGUgY29udGV4dHVhbCBBY3Rpb25CYXIuCisgKiBUaGUgQWN0aW9uQmFyIGFjdHMgYXMgYSByZXBsYWNlbWVudCBmb3IgdGhlIHRpdGxlIGJhciBpbiBBY3Rpdml0aWVzLgorICogSXQgcHJvdmlkZXMgZmFjaWxpdGllcyBmb3IgY3JlYXRpbmcgdG9vbGJhciBhY3Rpb25zIGFzIHdlbGwgYXMKKyAqIG1ldGhvZHMgb2YgbmF2aWdhdGluZyBhcm91bmQgYW4gYXBwbGljYXRpb24uIAorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWN0aW9uQmFyIHsKKyAgICAvKioKKyAgICAgKiBTdGFuZGFyZCBuYXZpZ2F0aW9uIG1vZGUuIENvbnNpc3RzIG9mIGVpdGhlciBhIGxvZ28gb3IgaWNvbgorICAgICAqIGFuZCB0aXRsZSB0ZXh0IHdpdGggYW4gb3B0aW9uYWwgc3VidGl0bGUuIENsaWNraW5nIGFueSBvZiB0aGVzZSBlbGVtZW50cworICAgICAqIHdpbGwgZGlzcGF0Y2ggb25BY3Rpb25JdGVtU2VsZWN0ZWQgdG8gdGhlIHJlZ2lzdGVyZWQgQ2FsbGJhY2sgd2l0aAorICAgICAqIGEgTWVudUl0ZW0gd2l0aCBpdGVtIElEIGFuZHJvaWQuUi5pZC5ob21lLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5BVklHQVRJT05fTU9ERV9TVEFOREFSRCA9IDA7CisgICAgCisgICAgLyoqCisgICAgICogRHJvcGRvd24gbGlzdCBuYXZpZ2F0aW9uIG1vZGUuIEluc3RlYWQgb2Ygc3RhdGljIHRpdGxlIHRleHQgdGhpcyBtb2RlCisgICAgICogcHJlc2VudHMgYSBkcm9wZG93biBtZW51IGZvciBuYXZpZ2F0aW9uIHdpdGhpbiB0aGUgYWN0aXZpdHkuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTkFWSUdBVElPTl9NT0RFX0RST1BET1dOX0xJU1QgPSAxOworICAgIAorICAgIC8qKgorICAgICAqIFRhYiBuYXZpZ2F0aW9uIG1vZGUuIEluc3RlYWQgb2Ygc3RhdGljIHRpdGxlIHRleHQgdGhpcyBtb2RlCisgICAgICogcHJlc2VudHMgYSBzZXJpZXMgb2YgdGFicyBmb3IgbmF2aWdhdGlvbiB3aXRoaW4gdGhlIGFjdGl2aXR5LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5BVklHQVRJT05fTU9ERV9UQUJTID0gMjsKKyAgICAKKyAgICAvKioKKyAgICAgKiBDdXN0b20gbmF2aWdhdGlvbiBtb2RlLiBUaGlzIG5hdmlnYXRpb24gbW9kZSBpcyBzZXQgaW1wbGljaXRseSB3aGVuZXZlcgorICAgICAqIGEgY3VzdG9tIG5hdmlnYXRpb24gdmlldyBpcyBzZXQuIFNlZSB7QGxpbmsgI3NldEN1c3RvbU5hdmlnYXRpb25Nb2RlKFZpZXcpfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOQVZJR0FUSU9OX01PREVfQ1VTVE9NID0gMzsKKworICAgIC8qKgorICAgICAqIFVzZSBsb2dvIGluc3RlYWQgb2YgaWNvbiBpZiBhdmFpbGFibGUuIFRoaXMgZmxhZyB3aWxsIGNhdXNlIGFwcHJvcHJpYXRlCisgICAgICogbmF2aWdhdGlvbiBtb2RlcyB0byB1c2UgYSB3aWRlciBsb2dvIGluIHBsYWNlIG9mIHRoZSBzdGFuZGFyZCBpY29uLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERJU1BMQVlfVVNFX0xPR08gPSAweDE7CisgICAgCisgICAgLyoqCisgICAgICogSGlkZSAnaG9tZScgZWxlbWVudHMgaW4gdGhpcyBhY3Rpb24gYmFyLCBsZWF2aW5nIG1vcmUgc3BhY2UgZm9yIG90aGVyCisgICAgICogbmF2aWdhdGlvbiBlbGVtZW50cy4gVGhpcyBpbmNsdWRlcyBsb2dvIGFuZCBpY29uLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERJU1BMQVlfSElERV9IT01FID0gMHgyOworICAgIAorICAgIC8qKgorICAgICAqIFNldCB0aGUgY2FsbGJhY2sgdGhhdCB0aGUgQWN0aW9uQmFyIHdpbGwgdXNlIHRvIGhhbmRsZSBldmVudHMKKyAgICAgKiBhbmQgcG9wdWxhdGUgbWVudXMuCisgICAgICogQHBhcmFtIGNhbGxiYWNrIENhbGxiYWNrIHRvIHVzZQorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldENhbGxiYWNrKENhbGxiYWNrIGNhbGxiYWNrKTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGFjdGlvbiBiYXIgaW50byBjdXN0b20gbmF2aWdhdGlvbiBtb2RlLCBzdXBwbHlpbmcgYSB2aWV3CisgICAgICogZm9yIGN1c3RvbSBuYXZpZ2F0aW9uLgorICAgICAqIAorICAgICAqIEN1c3RvbSBuYXZpZ2F0aW9uIHZpZXdzIGFwcGVhciBiZXR3ZWVuIHRoZSBhcHBsaWNhdGlvbiBpY29uIGFuZAorICAgICAqIGFueSBhY3Rpb24gYnV0dG9ucyBhbmQgbWF5IHVzZSBhbnkgc3BhY2UgYXZhaWxhYmxlIHRoZXJlLiBDb21tb24KKyAgICAgKiB1c2UgY2FzZXMgZm9yIGN1c3RvbSBuYXZpZ2F0aW9uIHZpZXdzIG1pZ2h0IGluY2x1ZGUgYW4gYXV0by1zdWdnZXN0aW5nCisgICAgICogYWRkcmVzcyBiYXIgZm9yIGEgYnJvd3NlciBvciBvdGhlciBuYXZpZ2F0aW9uIG1lY2hhbmlzbXMgdGhhdCBkbyBub3QKKyAgICAgKiB0cmFuc2xhdGUgd2VsbCB0byBwcm92aWRlZCBuYXZpZ2F0aW9uIG1vZGVzLgorICAgICAqIAorICAgICAqIEBwYXJhbSB2aWV3IEN1c3RvbSBuYXZpZ2F0aW9uIHZpZXcgdG8gcGxhY2UgaW4gdGhlIEFjdGlvbkJhci4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRDdXN0b21OYXZpZ2F0aW9uTW9kZShWaWV3IHZpZXcpOworICAgIAorICAgIC8qKgorICAgICAqIFNldCB0aGUgYWN0aW9uIGJhciBpbnRvIGRyb3Bkb3duIG5hdmlnYXRpb24gbW9kZSBhbmQgc3VwcGx5IGFuIGFkYXB0ZXIKKyAgICAgKiB0aGF0IHdpbGwgcHJvdmlkZSB2aWV3cyBmb3IgbmF2aWdhdGlvbiBjaG9pY2VzLgorICAgICAqIAorICAgICAqIEBwYXJhbSBhZGFwdGVyIEFuIGFkYXB0ZXIgdGhhdCB3aWxsIHByb3ZpZGUgdmlld3MgYm90aCB0byBkaXNwbGF5CisgICAgICogICAgICAgICAgICAgICAgdGhlIGN1cnJlbnQgbmF2aWdhdGlvbiBzZWxlY3Rpb24gYW5kIHBvcHVsYXRlIHZpZXdzCisgICAgICogICAgICAgICAgICAgICAgd2l0aGluIHRoZSBkcm9wZG93biBuYXZpZ2F0aW9uIG1lbnUuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0RHJvcGRvd25OYXZpZ2F0aW9uTW9kZShTcGlubmVyQWRhcHRlciBhZGFwdGVyKTsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgYWN0aW9uIGJhciBpbnRvIHN0YW5kYXJkIG5hdmlnYXRpb24gbW9kZSwgc3VwcGx5aW5nIGEgdGl0bGUgYW5kIHN1YnRpdGxlLgorICAgICAqIAorICAgICAqIFN0YW5kYXJkIG5hdmlnYXRpb24gbW9kZSBpcyBkZWZhdWx0LiBUaGUgdGl0bGUgaXMgYXV0b21hdGljYWxseSBzZXQgdG8gdGhlCisgICAgICogbmFtZSBvZiB5b3VyIEFjdGl2aXR5LiBTdWJ0aXRsZXMgYXJlIGRpc3BsYXllZCB1bmRlcm5lYXRoIHRoZSB0aXRsZSwgdXN1YWxseQorICAgICAqIGluIGEgc21hbGxlciBmb250IG9yIG90aGVyd2lzZSBsZXNzIHByb21pbmVudGx5IHRoYW4gdGhlIHRpdGxlLiBTdWJ0aXRsZXMgYXJlCisgICAgICogZ29vZCBmb3IgZXh0ZW5kZWQgZGVzY3JpcHRpb25zIG9mIGFjdGl2aXR5IHN0YXRlLgorICAgICAqCisgICAgICogQHBhcmFtIHRpdGxlIFRoZSBhY3Rpb24gYmFyJ3MgdGl0bGUuIG51bGwgaXMgdHJlYXRlZCBhcyBhbiBlbXB0eSBzdHJpbmcuCisgICAgICogQHBhcmFtIHN1YnRpdGxlIFRoZSBhY3Rpb24gYmFyJ3Mgc3VidGl0bGUuIG51bGwgaXMgdHJlYXRlZCBhcyBhbiBlbXB0eSBzdHJpbmcuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0U3RhbmRhcmROYXZpZ2F0aW9uTW9kZShDaGFyU2VxdWVuY2UgdGl0bGUsIENoYXJTZXF1ZW5jZSBzdWJ0aXRsZSk7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGFjdGlvbiBiYXIgaW50byBzdGFuZGFyZCBuYXZpZ2F0aW9uIG1vZGUsIHN1cHBseWluZyBhIHRpdGxlIGFuZCBzdWJ0aXRsZS4KKyAgICAgKiAKKyAgICAgKiBTdGFuZGFyZCBuYXZpZ2F0aW9uIG1vZGUgaXMgZGVmYXVsdC4gVGhlIHRpdGxlIGlzIGF1dG9tYXRpY2FsbHkgc2V0IHRvIHRoZQorICAgICAqIG5hbWUgb2YgeW91ciBBY3Rpdml0eS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0aXRsZSBUaGUgYWN0aW9uIGJhcidzIHRpdGxlLiBudWxsIGlzIHRyZWF0ZWQgYXMgYW4gZW1wdHkgc3RyaW5nLgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldFN0YW5kYXJkTmF2aWdhdGlvbk1vZGUoQ2hhclNlcXVlbmNlIHRpdGxlKTsKKworICAgIC8qKgorICAgICAqIFNldCBkaXNwbGF5IG9wdGlvbnMuIFRoaXMgY2hhbmdlcyBhbGwgZGlzcGxheSBvcHRpb24gYml0cyBhdCBvbmNlLiBUbyBjaGFuZ2UKKyAgICAgKiBhIGxpbWl0ZWQgc3Vic2V0IG9mIGRpc3BsYXkgb3B0aW9ucywgc2VlIHtAbGluayAjc2V0RGlzcGxheU9wdGlvbnMoaW50LCBpbnQpfS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gb3B0aW9ucyBBIGNvbWJpbmF0aW9uIG9mIHRoZSBiaXRzIGRlZmluZWQgYnkgdGhlIERJU1BMQVlfIGNvbnN0YW50cworICAgICAqICAgICAgICAgICAgICAgIGRlZmluZWQgaW4gQWN0aW9uQmFyLgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldERpc3BsYXlPcHRpb25zKGludCBvcHRpb25zKTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXQgc2VsZWN0ZWQgZGlzcGxheSBvcHRpb25zLiBPbmx5IHRoZSBvcHRpb25zIHNwZWNpZmllZCBieSBtYXNrIHdpbGwgYmUgY2hhbmdlZC4KKyAgICAgKiBUbyBjaGFuZ2UgYWxsIGRpc3BsYXkgb3B0aW9uIGJpdHMgYXQgb25jZSwgc2VlIHtAbGluayAjc2V0RGlzcGxheU9wdGlvbnMoaW50KX0uCisgICAgICogCisgICAgICogPHA+RXhhbXBsZTogc2V0RGlzcGxheU9wdGlvbnMoMCwgRElTUExBWV9ISURFX0hPTUUpIHdpbGwgZGlzYWJsZSB0aGUKKyAgICAgKiB7QGxpbmsgI0RJU1BMQVlfSElERV9IT01FfSBvcHRpb24uCisgICAgICogc2V0RGlzcGxheU9wdGlvbnMoRElTUExBWV9ISURFX0hPTUUsIERJU1BMQVlfSElERV9IT01FIHwgRElTUExBWV9VU0VfTE9HTykKKyAgICAgKiB3aWxsIGVuYWJsZSB7QGxpbmsgI0RJU1BMQVlfSElERV9IT01FfSBhbmQgZGlzYWJsZSB7QGxpbmsgI0RJU1BMQVlfVVNFX0xPR099LgorICAgICAqIAorICAgICAqIEBwYXJhbSBvcHRpb25zIEEgY29tYmluYXRpb24gb2YgdGhlIGJpdHMgZGVmaW5lZCBieSB0aGUgRElTUExBWV8gY29uc3RhbnRzCisgICAgICogICAgICAgICAgICAgICAgZGVmaW5lZCBpbiBBY3Rpb25CYXIuCisgICAgICogQHBhcmFtIG1hc2sgQSBiaXQgbWFzayBkZWNsYXJpbmcgd2hpY2ggZGlzcGxheSBvcHRpb25zIHNob3VsZCBiZSBjaGFuZ2VkLgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldERpc3BsYXlPcHRpb25zKGludCBvcHRpb25zLCBpbnQgbWFzayk7CisgICAgCisgICAgLyoqCisgICAgICogU2V0IHRoZSBBY3Rpb25CYXIncyBiYWNrZ3JvdW5kLgorICAgICAqIAorICAgICAqIEBwYXJhbSBkIEJhY2tncm91bmQgZHJhd2FibGUKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRCYWNrZ3JvdW5kRHJhd2FibGUoRHJhd2FibGUgZCk7CisgICAgCisgICAgLyoqCisgICAgICogQHJldHVybiBUaGUgY3VycmVudCBjdXN0b20gbmF2aWdhdGlvbiB2aWV3LgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBWaWV3IGdldEN1c3RvbU5hdmlnYXRpb25WaWV3KCk7CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgY3VycmVudCBBY3Rpb25CYXIgdGl0bGUgaW4gc3RhbmRhcmQgbW9kZS4KKyAgICAgKiBSZXR1cm5zIG51bGwgaWYge0BsaW5rICNnZXROYXZpZ2F0aW9uTW9kZSgpfSB3b3VsZCBub3QgcmV0dXJuCisgICAgICoge0BsaW5rICNOQVZJR0FUSU9OX01PREVfU1RBTkRBUkR9LiAKKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIGN1cnJlbnQgQWN0aW9uQmFyIHRpdGxlIG9yIG51bGwuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IENoYXJTZXF1ZW5jZSBnZXRUaXRsZSgpOworICAgIAorICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgQWN0aW9uQmFyIHN1YnRpdGxlIGluIHN0YW5kYXJkIG1vZGUuCisgICAgICogUmV0dXJucyBudWxsIGlmIHtAbGluayAjZ2V0TmF2aWdhdGlvbk1vZGUoKX0gd291bGQgbm90IHJldHVybgorICAgICAqIHtAbGluayAjTkFWSUdBVElPTl9NT0RFX1NUQU5EQVJEfS4gCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBjdXJyZW50IEFjdGlvbkJhciBzdWJ0aXRsZSBvciBudWxsLgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBDaGFyU2VxdWVuY2UgZ2V0U3VidGl0bGUoKTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IG5hdmlnYXRpb24gbW9kZS4gVGhlIHJlc3VsdCB3aWxsIGJlIG9uZSBvZjoKKyAgICAgKiA8dWw+CisgICAgICogPGxpPntAbGluayAjTkFWSUdBVElPTl9NT0RFX1NUQU5EQVJEfTwvbGk+CisgICAgICogPGxpPntAbGluayAjTkFWSUdBVElPTl9NT0RFX0RST1BET1dOX0xJU1R9PC9saT4KKyAgICAgKiA8bGk+e0BsaW5rICNOQVZJR0FUSU9OX01PREVfVEFCU308L2xpPgorICAgICAqIDxsaT57QGxpbmsgI05BVklHQVRJT05fTU9ERV9DVVNUT019PC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgY3VycmVudCBuYXZpZ2F0aW9uIG1vZGUuCisgICAgICogCisgICAgICogQHNlZSAjc2V0U3RhbmRhcmROYXZpZ2F0aW9uTW9kZShDaGFyU2VxdWVuY2UpCisgICAgICogQHNlZSAjc2V0U3RhbmRhcmROYXZpZ2F0aW9uTW9kZShDaGFyU2VxdWVuY2UsIENoYXJTZXF1ZW5jZSkKKyAgICAgKiBAc2VlICNzZXREcm9wZG93bk5hdmlnYXRpb25Nb2RlKFNwaW5uZXJBZGFwdGVyKQorICAgICAqIEBzZWUgI3NldEN1c3RvbU5hdmlnYXRpb25Nb2RlKFZpZXcpCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IGludCBnZXROYXZpZ2F0aW9uTW9kZSgpOworICAgIAorICAgIC8qKgorICAgICAqIEByZXR1cm4gVGhlIGN1cnJlbnQgc2V0IG9mIGRpc3BsYXkgb3B0aW9ucy4gCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IGludCBnZXREaXNwbGF5T3B0aW9ucygpOworICAgIAorICAgIC8qKgorICAgICAqIENhbGxiYWNrIGludGVyZmFjZSBmb3IgQWN0aW9uQmFyIGV2ZW50cy4gCisgICAgICovCisgICAgcHVibGljIGludGVyZmFjZSBDYWxsYmFjayB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbmV2ZXIgYSBuYXZpZ2F0aW9uIGl0ZW0gaW4geW91ciBhY3Rpb24gYmFyCisgICAgICAgICAqIGlzIHNlbGVjdGVkLgorICAgICAgICAgKiAgICAKKyAgICAgICAgICogQHBhcmFtIGl0ZW1Qb3NpdGlvbiBQb3NpdGlvbiBvZiB0aGUgaXRlbSBjbGlja2VkLgorICAgICAgICAgKiBAcGFyYW0gaXRlbUlkIElEIG9mIHRoZSBpdGVtIGNsaWNrZWQuCisgICAgICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgZXZlbnQgd2FzIGhhbmRsZWQsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBib29sZWFuIG9uTmF2aWdhdGlvbkl0ZW1TZWxlY3RlZChpbnQgaXRlbVBvc2l0aW9uLCBsb25nIGl0ZW1JZCk7CisgICAgICAgIAorICAgICAgICAvKgorICAgICAgICAgKiBJbiBwcm9ncmVzcworICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGJvb2xlYW4gb25DcmVhdGVDb250ZXh0TW9kZShpbnQgbW9kZUlkLCBNZW51IG1lbnUpOworICAgICAgICBwdWJsaWMgYm9vbGVhbiBvblByZXBhcmVDb250ZXh0TW9kZShpbnQgbW9kZUlkLCBNZW51IG1lbnUpOworICAgICAgICBwdWJsaWMgYm9vbGVhbiBvbkNvbnRleHRJdGVtQ2xpY2tlZChpbnQgbW9kZUlkLCBNZW51SXRlbSBpdGVtKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogU2ltcGxlIHN0dWIgaW1wbGVtZW50YXRpb25zIG9mIEFjdGlvbkJhci5DYWxsYmFjayBtZXRob2RzLgorICAgICAqIEV4dGVuZCB0aGlzIGlmIHlvdSBvbmx5IG5lZWQgYSBzdWJzZXQgb2YgQ2FsbGJhY2sgZnVuY3Rpb25hbGl0eS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFNpbXBsZUNhbGxiYWNrIGltcGxlbWVudHMgQ2FsbGJhY2sgeworICAgICAgICBwdWJsaWMgYm9vbGVhbiBvbkNyZWF0ZUNvbnRleHRNb2RlKGludCBtb2RlSWQsIE1lbnUgbWVudSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwdWJsaWMgYm9vbGVhbiBvblByZXBhcmVDb250ZXh0TW9kZShpbnQgbW9kZUlkLCBNZW51IG1lbnUpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHVibGljIGJvb2xlYW4gb25Db250ZXh0SXRlbUNsaWNrZWQoaW50IG1vZGVJZCwgTWVudUl0ZW0gaXRlbSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gb25OYXZpZ2F0aW9uSXRlbVNlbGVjdGVkKGludCBpdGVtUG9zaXRpb24sIGxvbmcgaXRlbUlkKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9BY3Rpdml0eS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0FjdGl2aXR5LmphdmEKaW5kZXggOWI5YWU1Mi4uNGE0N2I2NiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0FjdGl2aXR5LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0FjdGl2aXR5LmphdmEKQEAgLTE2LDE5ICsxNiwyMSBAQAogCiBwYWNrYWdlIGFuZHJvaWQuYXBwOwogCi1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwucG9saWN5LlBvbGljeU1hbmFnZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKIAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnRDYWxsYmFja3M7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWU7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JSW50ZW50U2VuZGVyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudFNlbmRlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuU2hhcmVkUHJlZmVyZW5jZXM7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLkFjdGl2aXR5SW5mbzsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkNvbmZpZ3VyYXRpb247CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5UeXBlZEFycmF5OwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOwpAQCAtMzksNyArNDEsNyBAQAogaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwogaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKIGltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5Mb29wZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxhYmxlOwogaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOwogaW1wb3J0IGFuZHJvaWQudGV4dC5TZWxlY3Rpb247CiBpbXBvcnQgYW5kcm9pZC50ZXh0LlNwYW5uYWJsZVN0cmluZ0J1aWxkZXI7CkBAIC01MCw4ICs1MiwxMCBAQAogaW1wb3J0IGFuZHJvaWQudXRpbC5FdmVudExvZzsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogaW1wb3J0IGFuZHJvaWQudXRpbC5TcGFyc2VBcnJheTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuQWN0aW9uQmFyVmlldzsKIGltcG9ydCBhbmRyb2lkLnZpZXcuQ29udGV4dE1lbnU7CiBpbXBvcnQgYW5kcm9pZC52aWV3LkNvbnRleHRUaGVtZVdyYXBwZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LkluZmxhdGVFeGNlcHRpb247CiBpbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OwogaW1wb3J0IGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlcjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuTWVudTsKQEAgLTY4LDkgKzcyLDEwIEBACiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cC5MYXlvdXRQYXJhbXM7CiBpbXBvcnQgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eUV2ZW50OwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJWaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkxpbmVhckxheW91dDsKIAotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuYXBwLlNwbGl0QWN0aW9uQmFyOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnBvbGljeS5Qb2xpY3lNYW5hZ2VyOwogCiAvKioKICAqIEFuIGFjdGl2aXR5IGlzIGEgc2luZ2xlLCBmb2N1c2VkIHRoaW5nIHRoYXQgdGhlIHVzZXIgY2FuIGRvLiAgQWxtb3N0IGFsbApAQCAtNjA2LDYgKzYxMSw3IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgbG9uZyBzSW5zdGFuY2VDb3VudCA9IDA7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0lORE9XX0hJRVJBUkNIWV9UQUcgPSAiYW5kcm9pZDp2aWV3SGllcmFyY2h5U3RhdGUiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGUkFHTUVOVFNfVEFHID0gImFuZHJvaWQ6ZnJhZ21lbnRzIjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0FWRURfRElBTE9HX0lEU19LRVkgPSAiYW5kcm9pZDpzYXZlZERpYWxvZ0lkcyI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNBVkVEX0RJQUxPR1NfVEFHID0gImFuZHJvaWQ6c2F2ZWREaWFsb2dzIjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0FWRURfRElBTE9HX0tFWV9QUkVGSVggPSAiYW5kcm9pZDpkaWFsb2dfIjsKQEAgLTYyNywxOCArNjMzLDI1IEBACiAgICAgcHJpdmF0ZSBDb21wb25lbnROYW1lIG1Db21wb25lbnQ7CiAgICAgLypwYWNrYWdlKi8gQWN0aXZpdHlJbmZvIG1BY3Rpdml0eUluZm87CiAgICAgLypwYWNrYWdlKi8gQWN0aXZpdHlUaHJlYWQgbU1haW5UaHJlYWQ7Ci0gICAgLypwYWNrYWdlKi8gT2JqZWN0IG1MYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlOwotICAgIC8qcGFja2FnZSovIEhhc2hNYXA8U3RyaW5nLE9iamVjdD4gbUxhc3ROb25Db25maWd1cmF0aW9uQ2hpbGRJbnN0YW5jZXM7CiAgICAgQWN0aXZpdHkgbVBhcmVudDsKICAgICBib29sZWFuIG1DYWxsZWQ7CiAgICAgcHJpdmF0ZSBib29sZWFuIG1SZXN1bWVkOwogICAgIHByaXZhdGUgYm9vbGVhbiBtU3RvcHBlZDsKICAgICBib29sZWFuIG1GaW5pc2hlZDsKICAgICBib29sZWFuIG1TdGFydGVkQWN0aXZpdHk7CisgICAgLyoqIHRydWUgaWYgdGhlIGFjdGl2aXR5IGlzIGJlaW5nIGRlc3Ryb3llZCBpbiBvcmRlciB0byByZWNyZWF0ZSBpdCB3aXRoIGEgbmV3IGNvbmZpZ3VyYXRpb24gKi8KKyAgICAvKnBhY2thZ2UqLyBib29sZWFuIG1DaGFuZ2luZ0NvbmZpZ3VyYXRpb25zID0gZmFsc2U7CiAgICAgLypwYWNrYWdlKi8gaW50IG1Db25maWdDaGFuZ2VGbGFnczsKICAgICAvKnBhY2thZ2UqLyBDb25maWd1cmF0aW9uIG1DdXJyZW50Q29uZmlnOwogICAgIHByaXZhdGUgU2VhcmNoTWFuYWdlciBtU2VhcmNoTWFuYWdlcjsKIAorICAgIHN0YXRpYyBmaW5hbCBjbGFzcyBOb25Db25maWd1cmF0aW9uSW5zdGFuY2VzIHsKKyAgICAgICAgT2JqZWN0IGFjdGl2aXR5OworICAgICAgICBIYXNoTWFwPFN0cmluZywgT2JqZWN0PiBjaGlsZHJlbjsKKyAgICAgICAgQXJyYXlMaXN0PEZyYWdtZW50PiBmcmFnbWVudHM7CisgICAgfQorICAgIC8qIHBhY2thZ2UgKi8gTm9uQ29uZmlndXJhdGlvbkluc3RhbmNlcyBtTGFzdE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZXM7CisgICAgCiAgICAgcHJpdmF0ZSBXaW5kb3cgbVdpbmRvdzsKIAogICAgIHByaXZhdGUgV2luZG93TWFuYWdlciBtV2luZG93TWFuYWdlcjsKQEAgLTY0NiwxMCArNjU5LDEzIEBACiAgICAgLypwYWNrYWdlKi8gYm9vbGVhbiBtV2luZG93QWRkZWQgPSBmYWxzZTsKICAgICAvKnBhY2thZ2UqLyBib29sZWFuIG1WaXNpYmxlRnJvbVNlcnZlciA9IGZhbHNlOwogICAgIC8qcGFja2FnZSovIGJvb2xlYW4gbVZpc2libGVGcm9tQ2xpZW50ID0gdHJ1ZTsKKyAgICAvKnBhY2thZ2UqLyBBY3Rpb25CYXIgbUFjdGlvbkJhciA9IG51bGw7CiAKICAgICBwcml2YXRlIENoYXJTZXF1ZW5jZSBtVGl0bGU7CiAgICAgcHJpdmF0ZSBpbnQgbVRpdGxlQ29sb3IgPSAwOwogCisgICAgZmluYWwgRnJhZ21lbnRNYW5hZ2VyIG1GcmFnbWVudHMgPSBuZXcgRnJhZ21lbnRNYW5hZ2VyKCk7CisgICAgCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgTWFuYWdlZEN1cnNvciB7CiAgICAgICAgIE1hbmFnZWRDdXJzb3IoQ3Vyc29yIGN1cnNvcikgewogICAgICAgICAgICAgbUN1cnNvciA9IGN1cnNvcjsKQEAgLTY3Niw3ICs2OTIsNyBAQAogICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50W10gRk9DVVNFRF9TVEFURV9TRVQgPSB7Y29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hdHRyLnN0YXRlX2ZvY3VzZWR9OwogCiAgICAgcHJpdmF0ZSBUaHJlYWQgbVVpVGhyZWFkOwotICAgIHByaXZhdGUgZmluYWwgSGFuZGxlciBtSGFuZGxlciA9IG5ldyBIYW5kbGVyKCk7CisgICAgZmluYWwgSGFuZGxlciBtSGFuZGxlciA9IG5ldyBIYW5kbGVyKCk7CiAKICAgICAvLyBVc2VkIGZvciBkZWJ1ZyBvbmx5CiAgICAgLyoKQEAgLTgwMCw2ICs4MTYsMTIgQEAKICAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CiAgICAgICAgIG1WaXNpYmxlRnJvbUNsaWVudCA9ICFtV2luZG93LmdldFdpbmRvd1N0eWxlKCkuZ2V0Qm9vbGVhbigKICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5XaW5kb3dfd2luZG93Tm9EaXNwbGF5LCBmYWxzZSk7CisgICAgICAgIGlmIChzYXZlZEluc3RhbmNlU3RhdGUgIT0gbnVsbCkgeworICAgICAgICAgICAgUGFyY2VsYWJsZSBwID0gc2F2ZWRJbnN0YW5jZVN0YXRlLmdldFBhcmNlbGFibGUoRlJBR01FTlRTX1RBRyk7CisgICAgICAgICAgICBtRnJhZ21lbnRzLnJlc3RvcmVBbGxTdGF0ZShwLCBtTGFzdE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZXMgIT0gbnVsbAorICAgICAgICAgICAgICAgICAgICA/IG1MYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlcy5mcmFnbWVudHMgOiBudWxsKTsKKyAgICAgICAgfQorICAgICAgICBtRnJhZ21lbnRzLmRpc3BhdGNoQ3JlYXRlKCk7CiAgICAgICAgIG1DYWxsZWQgPSB0cnVlOwogICAgIH0KIApAQCAtOTE0LDYgKzkzNiwxMCBAQAogICAgICAgICAgICAgbVRpdGxlUmVhZHkgPSB0cnVlOwogICAgICAgICAgICAgb25UaXRsZUNoYW5nZWQoZ2V0VGl0bGUoKSwgZ2V0VGl0bGVDb2xvcigpKTsKICAgICAgICAgfQorICAgICAgICBpZiAobVdpbmRvdyAhPSBudWxsICYmIG1XaW5kb3cuaGFzRmVhdHVyZShXaW5kb3cuRkVBVFVSRV9BQ1RJT05fQkFSKSkgeworICAgICAgICAgICAgLy8gSW52YWxpZGF0ZSB0aGUgYWN0aW9uIGJhciBtZW51IHNvIHRoYXQgaXQgY2FuIGluaXRpYWxpemUgcHJvcGVybHkuIAorICAgICAgICAgICAgbVdpbmRvdy5pbnZhbGlkYXRlUGFuZWxNZW51KFdpbmRvdy5GRUFUVVJFX0FDVElPTl9CQVIpOworICAgICAgICB9CiAgICAgICAgIG1DYWxsZWQgPSB0cnVlOwogICAgIH0KIApAQCAtMTA4NCw2ICsxMTEwLDEwIEBACiAgICAgICovCiAgICAgcHJvdGVjdGVkIHZvaWQgb25TYXZlSW5zdGFuY2VTdGF0ZShCdW5kbGUgb3V0U3RhdGUpIHsKICAgICAgICAgb3V0U3RhdGUucHV0QnVuZGxlKFdJTkRPV19ISUVSQVJDSFlfVEFHLCBtV2luZG93LnNhdmVIaWVyYXJjaHlTdGF0ZSgpKTsKKyAgICAgICAgUGFyY2VsYWJsZSBwID0gbUZyYWdtZW50cy5zYXZlQWxsU3RhdGUoKTsKKyAgICAgICAgaWYgKHAgIT0gbnVsbCkgeworICAgICAgICAgICAgb3V0U3RhdGUucHV0UGFyY2VsYWJsZShGUkFHTUVOVFNfVEFHLCBwKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgpAQCAtMTM4OCw3ICsxNDE4LDggQEAKICAgICAgKiB7QGxpbmsgI29uUmV0YWluTm9uQ29uZmlndXJhdGlvbkluc3RhbmNlKCl9LgogICAgICAqLwogICAgIHB1YmxpYyBPYmplY3QgZ2V0TGFzdE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZSgpIHsKLSAgICAgICAgcmV0dXJuIG1MYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlOworICAgICAgICByZXR1cm4gbUxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2VzICE9IG51bGwKKyAgICAgICAgICAgICAgICA/IG1MYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlcy5hY3Rpdml0eSA6IG51bGw7CiAgICAgfQogICAgIAogICAgIC8qKgpAQCAtMTQ0NCw4ICsxNDc1LDkgQEAKICAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIG9iamVjdCBwcmV2aW91c2x5IHJldHVybmVkIGJ5CiAgICAgICoge0BsaW5rICNvblJldGFpbk5vbkNvbmZpZ3VyYXRpb25DaGlsZEluc3RhbmNlcygpfQogICAgICAqLwotICAgIEhhc2hNYXA8U3RyaW5nLE9iamVjdD4gZ2V0TGFzdE5vbkNvbmZpZ3VyYXRpb25DaGlsZEluc3RhbmNlcygpIHsKLSAgICAgICAgcmV0dXJuIG1MYXN0Tm9uQ29uZmlndXJhdGlvbkNoaWxkSW5zdGFuY2VzOworICAgIEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+IGdldExhc3ROb25Db25maWd1cmF0aW9uQ2hpbGRJbnN0YW5jZXMoKSB7CisgICAgICAgIHJldHVybiBtTGFzdE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZXMgIT0gbnVsbAorICAgICAgICAgICAgICAgID8gbUxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2VzLmNoaWxkcmVuIDogbnVsbDsKICAgICB9CiAgICAgCiAgICAgLyoqCkBAIC0xNDU5LDExICsxNDkxLDM0IEBACiAgICAgICAgIHJldHVybiBudWxsOwogICAgIH0KICAgICAKKyAgICBOb25Db25maWd1cmF0aW9uSW5zdGFuY2VzIHJldGFpbk5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZXMoKSB7CisgICAgICAgIE9iamVjdCBhY3Rpdml0eSA9IG9uUmV0YWluTm9uQ29uZmlndXJhdGlvbkluc3RhbmNlKCk7CisgICAgICAgIEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+IGNoaWxkcmVuID0gb25SZXRhaW5Ob25Db25maWd1cmF0aW9uQ2hpbGRJbnN0YW5jZXMoKTsKKyAgICAgICAgQXJyYXlMaXN0PEZyYWdtZW50PiBmcmFnbWVudHMgPSBtRnJhZ21lbnRzLnJldGFpbk5vbkNvbmZpZygpOworICAgICAgICBpZiAoYWN0aXZpdHkgPT0gbnVsbCAmJiBjaGlsZHJlbiA9PSBudWxsICYmIGZyYWdtZW50cyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgTm9uQ29uZmlndXJhdGlvbkluc3RhbmNlcyBuY2kgPSBuZXcgTm9uQ29uZmlndXJhdGlvbkluc3RhbmNlcygpOworICAgICAgICBuY2kuYWN0aXZpdHkgPSBhY3Rpdml0eTsKKyAgICAgICAgbmNpLmNoaWxkcmVuID0gY2hpbGRyZW47CisgICAgICAgIG5jaS5mcmFnbWVudHMgPSBmcmFnbWVudHM7CisgICAgICAgIHJldHVybiBuY2k7CisgICAgfQorICAgIAogICAgIHB1YmxpYyB2b2lkIG9uTG93TWVtb3J5KCkgewogICAgICAgICBtQ2FsbGVkID0gdHJ1ZTsKICAgICB9CiAgICAgCiAgICAgLyoqCisgICAgICogU3RhcnQgYSBzZXJpZXMgb2YgZWRpdCBvcGVyYXRpb25zIG9uIHRoZSBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoCisgICAgICogdGhpcyBhY3Rpdml0eS4KKyAgICAgKi8KKyAgICBwdWJsaWMgRnJhZ21lbnRUcmFuc2FjdGlvbiBvcGVuRnJhZ21lbnRUcmFuc2FjdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBCYWNrU3RhY2tFbnRyeShtRnJhZ21lbnRzKTsKKyAgICB9CisgICAgCisgICAgLyoqCiAgICAgICogV3JhcHBlciBhcm91bmQKICAgICAgKiB7QGxpbmsgQ29udGVudFJlc29sdmVyI3F1ZXJ5KGFuZHJvaWQubmV0LlVyaSAsIFN0cmluZ1tdLCBTdHJpbmcsIFN0cmluZ1tdLCBTdHJpbmcpfQogICAgICAqIHRoYXQgZ2l2ZXMgdGhlIHJlc3VsdGluZyB7QGxpbmsgQ3Vyc29yfSB0byBjYWxsCkBAIC0xNTI1LDQwICsxNTgwLDYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBXcmFwcGVyIGFyb3VuZCB7QGxpbmsgQ3Vyc29yI2NvbW1pdFVwZGF0ZXMoKX0gdGhhdCB0YWtlcyBjYXJlIG9mIG5vdGluZwotICAgICAqIHRoYXQgdGhlIEN1cnNvciBuZWVkcyB0byBiZSByZXF1ZXJpZWQuICBZb3UgY2FuIGNhbGwgdGhpcyBtZXRob2QgaW4KLSAgICAgKiB7QGxpbmsgI29uUGF1c2V9IG9yIHtAbGluayAjb25TdG9wfSB0byBoYXZlIHRoZSBzeXN0ZW0gY2FsbAotICAgICAqIHtAbGluayBDdXJzb3IjcmVxdWVyeX0gZm9yIHlvdSBpZiB0aGUgYWN0aXZpdHkgaXMgbGF0ZXIgcmVzdW1lZC4gIFRoaXMKLSAgICAgKiBhbGxvd3MgeW91IHRvIGF2b2lkIGRldGVybWluZyB3aGVuIHRvIGRvIHRoZSByZXF1ZXJ5IHlvdXJzZWxmICh3aGljaCBpcwotICAgICAqIHJlcXVpcmVkIGZvciB0aGUgQ3Vyc29yIHRvIHNlZSBhbnkgZGF0YSBjaGFuZ2VzIHRoYXQgd2VyZSBjb21taXR0ZWQgd2l0aAotICAgICAqIGl0KS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gYyBUaGUgQ3Vyc29yIHdob3NlIGNoYW5nZXMgYXJlIHRvIGJlIGNvbW1pdHRlZC4KLSAgICAgKiAKLSAgICAgKiBAc2VlICNtYW5hZ2VkUXVlcnkoYW5kcm9pZC5uZXQuVXJpICwgU3RyaW5nW10sIFN0cmluZywgU3RyaW5nW10sIFN0cmluZykKLSAgICAgKiBAc2VlICNzdGFydE1hbmFnaW5nQ3Vyc29yCi0gICAgICogQHNlZSBDdXJzb3IjY29tbWl0VXBkYXRlcygpCi0gICAgICogQHNlZSBDdXJzb3IjcmVxdWVyeQotICAgICAqIEBoaWRlCi0gICAgICovCi0gICAgQERlcHJlY2F0ZWQKLSAgICBwdWJsaWMgdm9pZCBtYW5hZ2VkQ29tbWl0VXBkYXRlcyhDdXJzb3IgYykgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1NYW5hZ2VkQ3Vyc29ycykgewotICAgICAgICAgICAgZmluYWwgaW50IE4gPSBtTWFuYWdlZEN1cnNvcnMuc2l6ZSgpOwotICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPE47IGkrKykgewotICAgICAgICAgICAgICAgIE1hbmFnZWRDdXJzb3IgbWMgPSBtTWFuYWdlZEN1cnNvcnMuZ2V0KGkpOwotICAgICAgICAgICAgICAgIGlmIChtYy5tQ3Vyc29yID09IGMpIHsKLSAgICAgICAgICAgICAgICAgICAgYy5jb21taXRVcGRhdGVzKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1jLm1VcGRhdGVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICJDdXJzb3IgIiArIGMgKyAiIGlzIG5vdCBjdXJyZW50bHkgbWFuYWdlZCIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCiAgICAgICogVGhpcyBtZXRob2QgYWxsb3dzIHRoZSBhY3Rpdml0eSB0byB0YWtlIGNhcmUgb2YgbWFuYWdpbmcgdGhlIGdpdmVuCiAgICAgICoge0BsaW5rIEN1cnNvcn0ncyBsaWZlY3ljbGUgZm9yIHlvdSBiYXNlZCBvbiB0aGUgYWN0aXZpdHkncyBsaWZlY3ljbGUuCiAgICAgICogVGhhdCBpcywgd2hlbiB0aGUgYWN0aXZpdHkgaXMgc3RvcHBlZCBpdCB3aWxsIGF1dG9tYXRpY2FsbHkgY2FsbApAQCAtMTYzNiw3ICsxNjU3LDYwIEBACiAgICAgcHVibGljIFZpZXcgZmluZFZpZXdCeUlkKGludCBpZCkgewogICAgICAgICByZXR1cm4gZ2V0V2luZG93KCkuZmluZFZpZXdCeUlkKGlkKTsKICAgICB9Ci0KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZSBhIHJlZmVyZW5jZSB0byB0aGlzIGFjdGl2aXR5J3MgQWN0aW9uQmFyLgorICAgICAqIAorICAgICAqIDxwPjxlbT5Ob3RlOjwvZW0+IFRoZSBBY3Rpb25CYXIgaXMgaW5pdGlhbGl6ZWQgd2hlbiBhIGNvbnRlbnQgdmlldworICAgICAqIGlzIHNldC4gVGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiBudWxsIGlmIGNhbGxlZCBiZWZvcmUge0BsaW5rICNzZXRDb250ZW50Vmlld30KKyAgICAgKiBvciB7QGxpbmsgI2FkZENvbnRlbnRWaWV3fS4KKyAgICAgKiBAcmV0dXJuIFRoZSBBY3Rpdml0eSdzIEFjdGlvbkJhciwgb3IgbnVsbCBpZiBpdCBkb2VzIG5vdCBoYXZlIG9uZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgQWN0aW9uQmFyIGdldEFjdGlvbkJhcigpIHsKKyAgICAgICAgcmV0dXJuIG1BY3Rpb25CYXI7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgQWN0aW9uQmFyLCBsb2NhdGVzIHRoZSBpbmZsYXRlZCBBY3Rpb25CYXJWaWV3LAorICAgICAqIGluaXRpYWxpemVzIHRoZSBBY3Rpb25CYXIgd2l0aCB0aGUgdmlldywgYW5kIHNldHMgbUFjdGlvbkJhci4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgaW5pdEFjdGlvbkJhcigpIHsKKyAgICAgICAgaWYgKCFnZXRXaW5kb3coKS5oYXNGZWF0dXJlKFdpbmRvdy5GRUFUVVJFX0FDVElPTl9CQVIpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIEFjdGlvbkJhclZpZXcgdmlldyA9IChBY3Rpb25CYXJWaWV3KSBmaW5kVmlld0J5SWQoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5pZC5hY3Rpb25fYmFyKTsKKyAgICAgICAgaWYgKHZpZXcgIT0gbnVsbCkgeworICAgICAgICAJTGluZWFyTGF5b3V0IHNwbGl0VmlldyA9IAorICAgICAgICAJCShMaW5lYXJMYXlvdXQpIGZpbmRWaWV3QnlJZChjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmlkLmNvbnRleHRfYWN0aW9uX2Jhcik7CisgICAgICAgIAlpZiAoc3BsaXRWaWV3ICE9IG51bGwpIHsKKyAgICAgICAgCQltQWN0aW9uQmFyID0gbmV3IFNwbGl0QWN0aW9uQmFyKHZpZXcsIHNwbGl0Vmlldyk7CisgICAgICAgIAl9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJDb3VsZCBub3QgY3JlYXRlIGFjdGlvbiBiYXI7IHZpZXcgbm90IGZvdW5kIGluIHdpbmRvdyBkZWNvci4iKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBGaW5kcyBhIGZyYWdtZW50IHRoYXQgd2FzIGlkZW50aWZpZWQgYnkgdGhlIGdpdmVuIGlkIGVpdGhlciB3aGVuIGluZmxhdGVkCisgICAgICogZnJvbSBYTUwgb3IgYXMgdGhlIGNvbnRhaW5lciBJRCB3aGVuIGFkZGVkIGluIGEgdHJhbnNhY3Rpb24uICBUaGlzIG9ubHkKKyAgICAgKiByZXR1cm5zIGZyYWdtZW50cyB0aGF0IGFyZSBjdXJyZW50bHkgYWRkZWQgdG8gdGhlIGFjdGl2aXR5J3MgY29udGVudC4KKyAgICAgKiBAcmV0dXJuIFRoZSBmcmFnbWVudCBpZiBmb3VuZCBvciBudWxsIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgRnJhZ21lbnQgZmluZEZyYWdtZW50QnlJZChpbnQgaWQpIHsKKyAgICAgICAgcmV0dXJuIG1GcmFnbWVudHMuZmluZEZyYWdtZW50QnlJZChpZCk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEZpbmRzIGEgZnJhZ21lbnQgdGhhdCB3YXMgaWRlbnRpZmllZCBieSB0aGUgZ2l2ZW4gdGFnIGVpdGhlciB3aGVuIGluZmxhdGVkCisgICAgICogZnJvbSBYTUwgb3IgYXMgc3VwcGxpZWQgd2hlbiBhZGRlZCBpbiBhIHRyYW5zYWN0aW9uLiAgVGhpcyBvbmx5CisgICAgICogcmV0dXJucyBmcmFnbWVudHMgdGhhdCBhcmUgY3VycmVudGx5IGFkZGVkIHRvIHRoZSBhY3Rpdml0eSdzIGNvbnRlbnQuCisgICAgICogQHJldHVybiBUaGUgZnJhZ21lbnQgaWYgZm91bmQgb3IgbnVsbCBvdGhlcndpc2UuCisgICAgICovCisgICAgcHVibGljIEZyYWdtZW50IGZpbmRGcmFnbWVudEJ5VGFnKFN0cmluZyB0YWcpIHsKKyAgICAgICAgcmV0dXJuIG1GcmFnbWVudHMuZmluZEZyYWdtZW50QnlUYWcodGFnKTsKKyAgICB9CisgICAgCiAgICAgLyoqCiAgICAgICogU2V0IHRoZSBhY3Rpdml0eSBjb250ZW50IGZyb20gYSBsYXlvdXQgcmVzb3VyY2UuICBUaGUgcmVzb3VyY2Ugd2lsbCBiZQogICAgICAqIGluZmxhdGVkLCBhZGRpbmcgYWxsIHRvcC1sZXZlbCB2aWV3cyB0byB0aGUgYWN0aXZpdHkuCkBAIC0xNjQ1LDYgKzE3MTksNyBAQAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldENvbnRlbnRWaWV3KGludCBsYXlvdXRSZXNJRCkgewogICAgICAgICBnZXRXaW5kb3coKS5zZXRDb250ZW50VmlldyhsYXlvdXRSZXNJRCk7CisgICAgICAgIGluaXRBY3Rpb25CYXIoKTsKICAgICB9CiAKICAgICAvKioKQEAgLTE2NTYsNiArMTczMSw3IEBACiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0Q29udGVudFZpZXcoVmlldyB2aWV3KSB7CiAgICAgICAgIGdldFdpbmRvdygpLnNldENvbnRlbnRWaWV3KHZpZXcpOworICAgICAgICBpbml0QWN0aW9uQmFyKCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xNjY4LDYgKzE3NDQsNyBAQAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldENvbnRlbnRWaWV3KFZpZXcgdmlldywgVmlld0dyb3VwLkxheW91dFBhcmFtcyBwYXJhbXMpIHsKICAgICAgICAgZ2V0V2luZG93KCkuc2V0Q29udGVudFZpZXcodmlldywgcGFyYW1zKTsKKyAgICAgICAgaW5pdEFjdGlvbkJhcigpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTY3OSw2ICsxNzU2LDcgQEAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBhZGRDb250ZW50VmlldyhWaWV3IHZpZXcsIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMgcGFyYW1zKSB7CiAgICAgICAgIGdldFdpbmRvdygpLmFkZENvbnRlbnRWaWV3KHZpZXcsIHBhcmFtcyk7CisgICAgICAgIGluaXRBY3Rpb25CYXIoKTsKICAgICB9CiAKICAgICAvKioKQEAgLTE5MDIsMTIgKzE5ODAsMjUgQEAKICAgICB9CiAgICAgCiAgICAgLyoqCisgICAgICogUG9wIHRoZSBsYXN0IGZyYWdtZW50IHRyYW5zaXRpb24gZnJvbSB0aGUgbG9jYWwgYWN0aXZpdHkncyBmcmFnbWVudAorICAgICAqIGJhY2sgc3RhY2suICBJZiB0aGVyZSBpcyBub3RoaW5nIHRvIHBvcCwgZmFsc2UgaXMgcmV0dXJuZWQuCisgICAgICogQHBhcmFtIG5hbWUgSWYgbm9uLW51bGwsIHRoaXMgaXMgdGhlIG5hbWUgb2YgYSBwcmV2aW91cyBiYWNrIHN0YXRlCisgICAgICogdG8gbG9vayBmb3I7IGlmIGZvdW5kLCBhbGwgc3RhdGVzIHVwIHRvIChidXQgbm90IGluY2x1ZGluZykgdGhhdAorICAgICAqIHN0YXRlIHdpbGwgYmUgcG9wcGVkLiAgSWYgbnVsbCwgb25seSB0aGUgdG9wIHN0YXRlIGlzIHBvcHBlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBwb3BCYWNrU3RhY2soU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgcmV0dXJuIG1GcmFnbWVudHMucG9wQmFja1N0YWNrU3RhdGUobUhhbmRsZXIsIG5hbWUpOworICAgIH0KKyAgICAKKyAgICAvKioKICAgICAgKiBDYWxsZWQgd2hlbiB0aGUgYWN0aXZpdHkgaGFzIGRldGVjdGVkIHRoZSB1c2VyJ3MgcHJlc3Mgb2YgdGhlIGJhY2sKICAgICAgKiBrZXkuICBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBzaW1wbHkgZmluaXNoZXMgdGhlIGN1cnJlbnQgYWN0aXZpdHksCiAgICAgICogYnV0IHlvdSBjYW4gb3ZlcnJpZGUgdGhpcyB0byBkbyB3aGF0ZXZlciB5b3Ugd2FudC4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBvbkJhY2tQcmVzc2VkKCkgewotICAgICAgICBmaW5pc2goKTsKKyAgICAgICAgaWYgKCFwb3BCYWNrU3RhY2sobnVsbCkpIHsKKyAgICAgICAgICAgIGZpbmlzaCgpOworICAgICAgICB9CiAgICAgfQogICAgIAogICAgIC8qKgpAQCAtMTk3Nyw2ICsyMDY4LDEzIEBACiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgb25Db250ZW50Q2hhbmdlZCgpIHsKKyAgICAgICAgLy8gRmlyc3QgdGltZSBjb250ZW50IGlzIGF2YWlsYWJsZSwgbGV0IHRoZSBmcmFnbWVudCBtYW5hZ2VyCisgICAgICAgIC8vIGF0dGFjaCBhbGwgb2YgdGhlIGZyYWdtZW50cyB0byBpdC4gIERvbid0IGRvIHRoaXMgaWYgdGhlCisgICAgICAgIC8vIGFjdGl2aXR5IGlzIG5vIGxvbmdlciBhdHRhY2hlZCAoYmVjYXVzZSBpdCBpcyBiZWluZyBkZXN0cm95ZWQpLgorICAgICAgICBpZiAobUZyYWdtZW50cy5tQ3VyU3RhdGUgPCBGcmFnbWVudC5DT05URU5UCisgICAgICAgICAgICAgICAgJiYgbUZyYWdtZW50cy5tQWN0aXZpdHkgIT0gbnVsbCkgeworICAgICAgICAgICAgbUZyYWdtZW50cy5tb3ZlVG9TdGF0ZShGcmFnbWVudC5DT05URU5ULCBmYWxzZSk7CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKQEAgLTIxNDUsNyArMjI0Myw5IEBACiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gb25DcmVhdGVQYW5lbE1lbnUoaW50IGZlYXR1cmVJZCwgTWVudSBtZW51KSB7CiAgICAgICAgIGlmIChmZWF0dXJlSWQgPT0gV2luZG93LkZFQVRVUkVfT1BUSU9OU19QQU5FTCkgewotICAgICAgICAgICAgcmV0dXJuIG9uQ3JlYXRlT3B0aW9uc01lbnUobWVudSk7CisgICAgICAgICAgICBib29sZWFuIHNob3cgPSBvbkNyZWF0ZU9wdGlvbnNNZW51KG1lbnUpOworICAgICAgICAgICAgc2hvdyB8PSBtRnJhZ21lbnRzLmRpc3BhdGNoQ3JlYXRlT3B0aW9uc01lbnUobWVudSwgZ2V0TWVudUluZmxhdGVyKCkpOworICAgICAgICAgICAgcmV0dXJuIHNob3c7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KQEAgLTIxNjIsNiArMjI2Miw3IEBACiAgICAgcHVibGljIGJvb2xlYW4gb25QcmVwYXJlUGFuZWwoaW50IGZlYXR1cmVJZCwgVmlldyB2aWV3LCBNZW51IG1lbnUpIHsKICAgICAgICAgaWYgKGZlYXR1cmVJZCA9PSBXaW5kb3cuRkVBVFVSRV9PUFRJT05TX1BBTkVMICYmIG1lbnUgIT0gbnVsbCkgewogICAgICAgICAgICAgYm9vbGVhbiBnb2Zvcml0ID0gb25QcmVwYXJlT3B0aW9uc01lbnUobWVudSk7CisgICAgICAgICAgICBnb2Zvcml0IHw9IG1GcmFnbWVudHMuZGlzcGF0Y2hQcmVwYXJlT3B0aW9uc01lbnUobWVudSk7CiAgICAgICAgICAgICByZXR1cm4gZ29mb3JpdCAmJiBtZW51Lmhhc1Zpc2libGVJdGVtcygpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiB0cnVlOwpAQCAtMjE5MiwxMSArMjI5MywxNyBAQAogICAgICAgICAgICAgICAgIC8vIGRvZXNuJ3QgY2FsbCB0aHJvdWdoIHRvIHN1cGVyY2xhc3MncyBpbXBsbWVlbnRhdGlvbiBvZiBlYWNoCiAgICAgICAgICAgICAgICAgLy8gb2YgdGhlc2UgbWV0aG9kcyBiZWxvdwogICAgICAgICAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoNTAwMDAsIDAsIGl0ZW0uZ2V0VGl0bGVDb25kZW5zZWQoKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG9uT3B0aW9uc0l0ZW1TZWxlY3RlZChpdGVtKTsKKyAgICAgICAgICAgICAgICBpZiAob25PcHRpb25zSXRlbVNlbGVjdGVkKGl0ZW0pKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gbUZyYWdtZW50cy5kaXNwYXRjaE9wdGlvbnNJdGVtU2VsZWN0ZWQoaXRlbSk7CiAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICBjYXNlIFdpbmRvdy5GRUFUVVJFX0NPTlRFWFRfTUVOVToKICAgICAgICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KDUwMDAwLCAxLCBpdGVtLmdldFRpdGxlQ29uZGVuc2VkKCkpOwotICAgICAgICAgICAgICAgIHJldHVybiBvbkNvbnRleHRJdGVtU2VsZWN0ZWQoaXRlbSk7CisgICAgICAgICAgICAgICAgaWYgKG9uQ29udGV4dEl0ZW1TZWxlY3RlZChpdGVtKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIG1GcmFnbWVudHMuZGlzcGF0Y2hDb250ZXh0SXRlbVNlbGVjdGVkKGl0ZW0pOwogICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CkBAIC0yMjE1LDYgKzIzMjIsNyBAQAogICAgIHB1YmxpYyB2b2lkIG9uUGFuZWxDbG9zZWQoaW50IGZlYXR1cmVJZCwgTWVudSBtZW51KSB7CiAgICAgICAgIHN3aXRjaCAoZmVhdHVyZUlkKSB7CiAgICAgICAgICAgICBjYXNlIFdpbmRvdy5GRUFUVVJFX09QVElPTlNfUEFORUw6CisgICAgICAgICAgICAgICAgbUZyYWdtZW50cy5kaXNwYXRjaE9wdGlvbnNNZW51Q2xvc2VkKG1lbnUpOwogICAgICAgICAgICAgICAgIG9uT3B0aW9uc01lbnVDbG9zZWQobWVudSk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgCkBAIC0yMjI1LDYgKzIzMzMsMTUgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBEZWNsYXJlIHRoYXQgdGhlIG9wdGlvbnMgbWVudSBoYXMgY2hhbmdlZCwgc28gc2hvdWxkIGJlIHJlY3JlYXRlZC4KKyAgICAgKiBUaGUge0BsaW5rICNvbkNyZWF0ZU9wdGlvbnNNZW51KE1lbnUpfSBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgdGhlIG5leHQKKyAgICAgKiB0aW1lIGl0IG5lZWRzIHRvIGJlIGRpc3BsYXllZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBpbnZhbGlkYXRlT3B0aW9uc01lbnUoKSB7CisgICAgICAgIG1XaW5kb3cuaW52YWxpZGF0ZVBhbmVsTWVudShXaW5kb3cuRkVBVFVSRV9PUFRJT05TX1BBTkVMKTsKKyAgICB9CisgICAgCisgICAgLyoqCiAgICAgICogSW5pdGlhbGl6ZSB0aGUgY29udGVudHMgb2YgdGhlIEFjdGl2aXR5J3Mgc3RhbmRhcmQgb3B0aW9ucyBtZW51LiAgWW91CiAgICAgICogc2hvdWxkIHBsYWNlIHlvdXIgbWVudSBpdGVtcyBpbiB0byA8dmFyPm1lbnU8L3Zhcj4uCiAgICAgICogCkBAIC0zMDY2LDYgKzMxODMsMzYgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBUaGlzIGlzIGNhbGxlZCB3aGVuIGEgRnJhZ21lbnQgaW4gdGhpcyBhY3Rpdml0eSBjYWxscyBpdHMgCisgICAgICoge0BsaW5rIEZyYWdtZW50I3N0YXJ0QWN0aXZpdHl9IG9yIHtAbGluayBGcmFnbWVudCNzdGFydEFjdGl2aXR5Rm9yUmVzdWx0fQorICAgICAqIG1ldGhvZC4KKyAgICAgKiAKKyAgICAgKiA8cD5UaGlzIG1ldGhvZCB0aHJvd3Mge0BsaW5rIGFuZHJvaWQuY29udGVudC5BY3Rpdml0eU5vdEZvdW5kRXhjZXB0aW9ufQorICAgICAqIGlmIHRoZXJlIHdhcyBubyBBY3Rpdml0eSBmb3VuZCB0byBydW4gdGhlIGdpdmVuIEludGVudC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZnJhZ21lbnQgVGhlIGZyYWdtZW50IG1ha2luZyB0aGUgY2FsbC4KKyAgICAgKiBAcGFyYW0gaW50ZW50IFRoZSBpbnRlbnQgdG8gc3RhcnQuCisgICAgICogQHBhcmFtIHJlcXVlc3RDb2RlIFJlcGx5IHJlcXVlc3QgY29kZS4gIDwgMCBpZiByZXBseSBpcyBub3QgcmVxdWVzdGVkLiAKKyAgICAgKiAKKyAgICAgKiBAdGhyb3dzIGFuZHJvaWQuY29udGVudC5BY3Rpdml0eU5vdEZvdW5kRXhjZXB0aW9uCisgICAgICogCisgICAgICogQHNlZSBGcmFnbWVudCNzdGFydEFjdGl2aXR5IAorICAgICAqIEBzZWUgRnJhZ21lbnQjc3RhcnRBY3Rpdml0eUZvclJlc3VsdCAKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdGFydEFjdGl2aXR5RnJvbUZyYWdtZW50KEZyYWdtZW50IGZyYWdtZW50LCBJbnRlbnQgaW50ZW50LCAKKyAgICAgICAgICAgIGludCByZXF1ZXN0Q29kZSkgeworICAgICAgICBJbnN0cnVtZW50YXRpb24uQWN0aXZpdHlSZXN1bHQgYXIgPQorICAgICAgICAgICAgbUluc3RydW1lbnRhdGlvbi5leGVjU3RhcnRBY3Rpdml0eSgKKyAgICAgICAgICAgICAgICB0aGlzLCBtTWFpblRocmVhZC5nZXRBcHBsaWNhdGlvblRocmVhZCgpLCBtVG9rZW4sIGZyYWdtZW50LAorICAgICAgICAgICAgICAgIGludGVudCwgcmVxdWVzdENvZGUpOworICAgICAgICBpZiAoYXIgIT0gbnVsbCkgeworICAgICAgICAgICAgbU1haW5UaHJlYWQuc2VuZEFjdGl2aXR5UmVzdWx0KAorICAgICAgICAgICAgICAgIG1Ub2tlbiwgZnJhZ21lbnQubVdobywgcmVxdWVzdENvZGUsCisgICAgICAgICAgICAgICAgYXIuZ2V0UmVzdWx0Q29kZSgpLCBhci5nZXRSZXN1bHREYXRhKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCiAgICAgICogTGlrZSB7QGxpbmsgI3N0YXJ0QWN0aXZpdHlGcm9tQ2hpbGQoQWN0aXZpdHksIEludGVudCwgaW50KX0sIGJ1dAogICAgICAqIHRha2luZyBhIEludGVudFNlbmRlcjsgc2VlCiAgICAgICoge0BsaW5rICNzdGFydEludGVudFNlbmRlckZvclJlc3VsdChJbnRlbnRTZW5kZXIsIGludCwgSW50ZW50LCBpbnQsIGludCwgaW50KX0KQEAgLTMyMjQsNiArMzM3MSwxOSBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIENoZWNrIHRvIHNlZSB3aGV0aGVyIHRoaXMgYWN0aXZpdHkgaXMgaW4gdGhlIHByb2Nlc3Mgb2YgYmVpbmcgZGVzdHJveWVkIGluIG9yZGVyIHRvIGJlCisgICAgICogcmVjcmVhdGVkIHdpdGggYSBuZXcgY29uZmlndXJhdGlvbi4gVGhpcyBpcyBvZnRlbiB1c2VkIGluCisgICAgICoge0BsaW5rICNvblN0b3B9IHRvIGRldGVybWluZSB3aGV0aGVyIHRoZSBzdGF0ZSBuZWVkcyB0byBiZSBjbGVhbmVkIHVwIG9yIHdpbGwgYmUgcGFzc2VkCisgICAgICogb24gdG8gdGhlIG5leHQgaW5zdGFuY2Ugb2YgdGhlIGFjdGl2aXR5IHZpYSB7QGxpbmsgI29uUmV0YWluTm9uQ29uZmlndXJhdGlvbkluc3RhbmNlKCl9LgorICAgICAqIAorICAgICAqIEByZXR1cm4gSWYgdGhlIGFjdGl2aXR5IGlzIGJlaW5nIHRvcm4gZG93biBpbiBvcmRlciB0byBiZSByZWNyZWF0ZWQgd2l0aCBhIG5ldyBjb25maWd1cmF0aW9uLAorICAgICAqIHJldHVybnMgdHJ1ZTsgZWxzZSByZXR1cm5zIGZhbHNlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzQ2hhbmdpbmdDb25maWd1cmF0aW9ucygpIHsKKyAgICAgICAgcmV0dXJuIG1DaGFuZ2luZ0NvbmZpZ3VyYXRpb25zOworICAgIH0KKworICAgIC8qKgogICAgICAqIENhbGwgdGhpcyB3aGVuIHlvdXIgYWN0aXZpdHkgaXMgZG9uZSBhbmQgc2hvdWxkIGJlIGNsb3NlZC4gIFRoZQogICAgICAqIEFjdGl2aXR5UmVzdWx0IGlzIHByb3BhZ2F0ZWQgYmFjayB0byB3aG9ldmVyIGxhdW5jaGVkIHlvdSB2aWEKICAgICAgKiBvbkFjdGl2aXR5UmVzdWx0KCkuCkBAIC0zMzI0LDggKzM0ODQsNyBAQAogICAgICAqIEBzZWUgI2NyZWF0ZVBlbmRpbmdSZXN1bHQKICAgICAgKiBAc2VlICNzZXRSZXN1bHQoaW50KQogICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIG9uQWN0aXZpdHlSZXN1bHQoaW50IHJlcXVlc3RDb2RlLCBpbnQgcmVzdWx0Q29kZSwKLSAgICAgICAgICAgIEludGVudCBkYXRhKSB7CisgICAgcHJvdGVjdGVkIHZvaWQgb25BY3Rpdml0eVJlc3VsdChpbnQgcmVxdWVzdENvZGUsIGludCByZXN1bHRDb2RlLCBJbnRlbnQgZGF0YSkgewogICAgIH0KIAogICAgIC8qKgpAQCAtMzcwOSwxNSArMzg2OCw2OSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFN0dWIgaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlci5GYWN0b3J5I29uQ3JlYXRlVmlld30gdXNlZCB3aGVuCi0gICAgICogaW5mbGF0aW5nIHdpdGggdGhlIExheW91dEluZmxhdGVyIHJldHVybmVkIGJ5IHtAbGluayAjZ2V0U3lzdGVtU2VydmljZX0uICBUaGlzCi0gICAgICogaW1wbGVtZW50YXRpb24gc2ltcGx5IHJldHVybnMgbnVsbCBmb3IgYWxsIHZpZXcgbmFtZXMuCisgICAgICogU3RhbmRhcmQgaW1wbGVtZW50YXRpb24gb2YKKyAgICAgKiB7QGxpbmsgYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyLkZhY3Rvcnkjb25DcmVhdGVWaWV3fSB1c2VkIHdoZW4KKyAgICAgKiBpbmZsYXRpbmcgd2l0aCB0aGUgTGF5b3V0SW5mbGF0ZXIgcmV0dXJuZWQgYnkge0BsaW5rICNnZXRTeXN0ZW1TZXJ2aWNlfS4KKyAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIGhhbmRsZXMgPGZyYWdtZW50PiB0YWdzIHRvIGVtYmVkIGZyYWdtZW50cyBpbnNpZGUKKyAgICAgKiBvZiB0aGUgYWN0aXZpdHkuCiAgICAgICoKICAgICAgKiBAc2VlIGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlciNjcmVhdGVWaWV3CiAgICAgICogQHNlZSBhbmRyb2lkLnZpZXcuV2luZG93I2dldExheW91dEluZmxhdGVyCiAgICAgICovCiAgICAgcHVibGljIFZpZXcgb25DcmVhdGVWaWV3KFN0cmluZyBuYW1lLCBDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycykgewotICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgaWYgKCEiZnJhZ21lbnQiLmVxdWFscyhuYW1lKSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIFR5cGVkQXJyYXkgYSA9IAorICAgICAgICAgICAgY29udGV4dC5vYnRhaW5TdHlsZWRBdHRyaWJ1dGVzKGF0dHJzLCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5GcmFnbWVudCk7CisgICAgICAgIFN0cmluZyBmbmFtZSA9IGEuZ2V0U3RyaW5nKGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkZyYWdtZW50X25hbWUpOworICAgICAgICBpbnQgaWQgPSBhLmdldFJlc291cmNlSWQoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuRnJhZ21lbnRfaWQsIDApOworICAgICAgICBTdHJpbmcgdGFnID0gYS5nZXRTdHJpbmcoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuRnJhZ21lbnRfdGFnKTsKKyAgICAgICAgYS5yZWN5Y2xlKCk7CisgICAgICAgIAorICAgICAgICBpZiAoaWQgPT0gMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihhdHRycy5nZXRQb3NpdGlvbkRlc2NyaXB0aW9uKCkKKyAgICAgICAgICAgICAgICAgICAgKyAiOiBNdXN0IHNwZWNpZnkgdW5pcXVlIGFuZHJvaWQ6aWQgZm9yICIgKyBmbmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBJZiB3ZSByZXN0b3JlZCBmcm9tIGEgcHJldmlvdXMgc3RhdGUsIHdlIG1heSBhbHJlYWR5IGhhdmUKKyAgICAgICAgICAgIC8vIGluc3RhbnRpYXRlZCB0aGlzIGZyYWdtZW50IGZyb20gdGhlIHN0YXRlIGFuZCBzaG91bGQgdXNlCisgICAgICAgICAgICAvLyB0aGF0IGluc3RhbmNlIGluc3RlYWQgb2YgbWFraW5nIGEgbmV3IG9uZS4KKyAgICAgICAgICAgIEZyYWdtZW50IGZyYWdtZW50ID0gbUZyYWdtZW50cy5maW5kRnJhZ21lbnRCeUlkKGlkKTsKKyAgICAgICAgICAgIGlmIChGcmFnbWVudE1hbmFnZXIuREVCVUcpIExvZy52KFRBRywgIm9uQ3JlYXRlVmlldzogaWQ9MHgiCisgICAgICAgICAgICAgICAgICAgICsgSW50ZWdlci50b0hleFN0cmluZyhpZCkgKyAiIGZuYW1lPSIgKyBmbmFtZQorICAgICAgICAgICAgICAgICAgICArICIgZXhpc3Rpbmc9IiArIGZyYWdtZW50KTsKKyAgICAgICAgICAgIGlmIChmcmFnbWVudCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgZnJhZ21lbnQgPSBGcmFnbWVudC5pbnN0YW50aWF0ZSh0aGlzLCBmbmFtZSk7CisgICAgICAgICAgICAgICAgZnJhZ21lbnQubUZyb21MYXlvdXQgPSB0cnVlOworICAgICAgICAgICAgICAgIGZyYWdtZW50Lm1GcmFnbWVudElkID0gaWQ7CisgICAgICAgICAgICAgICAgZnJhZ21lbnQubVRhZyA9IHRhZzsKKyAgICAgICAgICAgICAgICBmcmFnbWVudC5tSW1tZWRpYXRlQWN0aXZpdHkgPSB0aGlzOworICAgICAgICAgICAgICAgIG1GcmFnbWVudHMuYWRkRnJhZ21lbnQoZnJhZ21lbnQsIHRydWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gSWYgdGhpcyBmcmFnbWVudCBpcyBuZXdseSBpbnN0YW50aWF0ZWQgKGVpdGhlciByaWdodCBub3csIG9yCisgICAgICAgICAgICAvLyBmcm9tIGxhc3Qgc2F2ZWQgc3RhdGUpLCB0aGVuIGdpdmUgaXQgdGhlIGF0dHJpYnV0ZXMgdG8KKyAgICAgICAgICAgIC8vIGluaXRpYWxpemUgaXRzZWxmLgorICAgICAgICAgICAgaWYgKCFmcmFnbWVudC5tUmV0YWluaW5nKSB7CisgICAgICAgICAgICAgICAgZnJhZ21lbnQub25JbmZsYXRlKHRoaXMsIGF0dHJzLCBmcmFnbWVudC5tU2F2ZWRGcmFnbWVudFN0YXRlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChmcmFnbWVudC5tVmlldyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiRnJhZ21lbnQgIiArIGZuYW1lCisgICAgICAgICAgICAgICAgICAgICAgICArICIgZGlkIG5vdCBjcmVhdGUgYSB2aWV3LiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZnJhZ21lbnQubVZpZXcuc2V0SWQoaWQpOworICAgICAgICAgICAgaWYgKGZyYWdtZW50Lm1WaWV3LmdldFRhZygpID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBmcmFnbWVudC5tVmlldy5zZXRUYWcodGFnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmcmFnbWVudC5tVmlldzsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIEluZmxhdGVFeGNlcHRpb24gaWUgPSBuZXcgSW5mbGF0ZUV4Y2VwdGlvbihhdHRycy5nZXRQb3NpdGlvbkRlc2NyaXB0aW9uKCkKKyAgICAgICAgICAgICAgICAgICAgKyAiOiBFcnJvciBpbmZsYXRpbmcgZnJhZ21lbnQgIiArIGZuYW1lKTsKKyAgICAgICAgICAgIGllLmluaXRDYXVzZShlKTsKKyAgICAgICAgICAgIHRocm93IGllOworICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCkBAIC0zNzY4LDIzICszOTgxLDI1IEBACiAKICAgICBmaW5hbCB2b2lkIGF0dGFjaChDb250ZXh0IGNvbnRleHQsIEFjdGl2aXR5VGhyZWFkIGFUaHJlYWQsIEluc3RydW1lbnRhdGlvbiBpbnN0ciwgSUJpbmRlciB0b2tlbiwKICAgICAgICAgICAgIEFwcGxpY2F0aW9uIGFwcGxpY2F0aW9uLCBJbnRlbnQgaW50ZW50LCBBY3Rpdml0eUluZm8gaW5mbywgQ2hhclNlcXVlbmNlIHRpdGxlLCAKLSAgICAgICAgICAgIEFjdGl2aXR5IHBhcmVudCwgU3RyaW5nIGlkLCBPYmplY3QgbGFzdE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZSwKKyAgICAgICAgICAgIEFjdGl2aXR5IHBhcmVudCwgU3RyaW5nIGlkLCBOb25Db25maWd1cmF0aW9uSW5zdGFuY2VzIGxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2VzLAogICAgICAgICAgICAgQ29uZmlndXJhdGlvbiBjb25maWcpIHsKICAgICAgICAgYXR0YWNoKGNvbnRleHQsIGFUaHJlYWQsIGluc3RyLCB0b2tlbiwgMCwgYXBwbGljYXRpb24sIGludGVudCwgaW5mbywgdGl0bGUsIHBhcmVudCwgaWQsCi0gICAgICAgICAgICBsYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlLCBudWxsLCBjb25maWcpOworICAgICAgICAgICAgbGFzdE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZXMsIGNvbmZpZyk7CiAgICAgfQogICAgIAogICAgIGZpbmFsIHZvaWQgYXR0YWNoKENvbnRleHQgY29udGV4dCwgQWN0aXZpdHlUaHJlYWQgYVRocmVhZCwKICAgICAgICAgICAgIEluc3RydW1lbnRhdGlvbiBpbnN0ciwgSUJpbmRlciB0b2tlbiwgaW50IGlkZW50LAogICAgICAgICAgICAgQXBwbGljYXRpb24gYXBwbGljYXRpb24sIEludGVudCBpbnRlbnQsIEFjdGl2aXR5SW5mbyBpbmZvLAogICAgICAgICAgICAgQ2hhclNlcXVlbmNlIHRpdGxlLCBBY3Rpdml0eSBwYXJlbnQsIFN0cmluZyBpZCwKLSAgICAgICAgICAgIE9iamVjdCBsYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlLAotICAgICAgICAgICAgSGFzaE1hcDxTdHJpbmcsT2JqZWN0PiBsYXN0Tm9uQ29uZmlndXJhdGlvbkNoaWxkSW5zdGFuY2VzLAorICAgICAgICAgICAgTm9uQ29uZmlndXJhdGlvbkluc3RhbmNlcyBsYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlcywKICAgICAgICAgICAgIENvbmZpZ3VyYXRpb24gY29uZmlnKSB7CiAgICAgICAgIGF0dGFjaEJhc2VDb250ZXh0KGNvbnRleHQpOwogCisgICAgICAgIG1GcmFnbWVudHMuYXR0YWNoQWN0aXZpdHkodGhpcyk7CisgICAgICAgIAogICAgICAgICBtV2luZG93ID0gUG9saWN5TWFuYWdlci5tYWtlTmV3V2luZG93KHRoaXMpOwogICAgICAgICBtV2luZG93LnNldENhbGxiYWNrKHRoaXMpOworICAgICAgICBtV2luZG93LmdldExheW91dEluZmxhdGVyKCkuc2V0RmFjdG9yeSh0aGlzKTsKICAgICAgICAgaWYgKGluZm8uc29mdElucHV0TW9kZSAhPSBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5TT0ZUX0lOUFVUX1NUQVRFX1VOU1BFQ0lGSUVEKSB7CiAgICAgICAgICAgICBtV2luZG93LnNldFNvZnRJbnB1dE1vZGUoaW5mby5zb2Z0SW5wdXRNb2RlKTsKICAgICAgICAgfQpAQCAtMzgwMSw4ICs0MDE2LDcgQEAKICAgICAgICAgbVRpdGxlID0gdGl0bGU7CiAgICAgICAgIG1QYXJlbnQgPSBwYXJlbnQ7CiAgICAgICAgIG1FbWJlZGRlZElEID0gaWQ7Ci0gICAgICAgIG1MYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlID0gbGFzdE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZTsKLSAgICAgICAgbUxhc3ROb25Db25maWd1cmF0aW9uQ2hpbGRJbnN0YW5jZXMgPSBsYXN0Tm9uQ29uZmlndXJhdGlvbkNoaWxkSW5zdGFuY2VzOworICAgICAgICBtTGFzdE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZXMgPSBsYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlczsKIAogICAgICAgICBtV2luZG93LnNldFdpbmRvd01hbmFnZXIobnVsbCwgbVRva2VuLCBtQ29tcG9uZW50LmZsYXR0ZW5Ub1N0cmluZygpKTsKICAgICAgICAgaWYgKG1QYXJlbnQgIT0gbnVsbCkgewpAQCAtMzgxNiw2ICs0MDMwLDEwIEBACiAgICAgICAgIHJldHVybiBtUGFyZW50ICE9IG51bGwgPyBtUGFyZW50LmdldEFjdGl2aXR5VG9rZW4oKSA6IG1Ub2tlbjsKICAgICB9CiAKKyAgICBmaW5hbCB2b2lkIHBlcmZvcm1DcmVhdGUoQnVuZGxlIGljaWNsZSkgeworICAgICAgICBvbkNyZWF0ZShpY2ljbGUpOworICAgIH0KKyAgICAKICAgICBmaW5hbCB2b2lkIHBlcmZvcm1TdGFydCgpIHsKICAgICAgICAgbUNhbGxlZCA9IGZhbHNlOwogICAgICAgICBtSW5zdHJ1bWVudGF0aW9uLmNhbGxBY3Rpdml0eU9uU3RhcnQodGhpcyk7CkBAIC0zODI0LDYgKzQwNDIsNyBAQAogICAgICAgICAgICAgICAgICJBY3Rpdml0eSAiICsgbUNvbXBvbmVudC50b1Nob3J0U3RyaW5nKCkgKwogICAgICAgICAgICAgICAgICIgZGlkIG5vdCBjYWxsIHRocm91Z2ggdG8gc3VwZXIub25TdGFydCgpIik7CiAgICAgICAgIH0KKyAgICAgICAgbUZyYWdtZW50cy5kaXNwYXRjaFN0YXJ0KCk7CiAgICAgfQogICAgIAogICAgIGZpbmFsIHZvaWQgcGVyZm9ybVJlc3RhcnQoKSB7CkBAIC0zODU1LDcgKzQwNzQsNyBAQAogICAgIGZpbmFsIHZvaWQgcGVyZm9ybVJlc3VtZSgpIHsKICAgICAgICAgcGVyZm9ybVJlc3RhcnQoKTsKICAgICAgICAgCi0gICAgICAgIG1MYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlID0gbnVsbDsKKyAgICAgICAgbUxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2VzID0gbnVsbDsKICAgICAgICAgCiAgICAgICAgIC8vIEZpcnN0IGNhbGwgb25SZXN1bWUoKSAtYmVmb3JlLSBzZXR0aW5nIG1SZXN1bWVkLCBzbyB3ZSBkb24ndAogICAgICAgICAvLyBzZW5kIG91dCBhbnkgc3RhdHVzIGJhciAvIG1lbnUgbm90aWZpY2F0aW9ucyB0aGUgY2xpZW50IG1ha2VzLgpAQCAtMzg3MCw2ICs0MDg5LDkgQEAKICAgICAgICAgLy8gTm93IHJlYWxseSByZXN1bWUsIGFuZCBpbnN0YWxsIHRoZSBjdXJyZW50IHN0YXR1cyBiYXIgYW5kIG1lbnUuCiAgICAgICAgIG1SZXN1bWVkID0gdHJ1ZTsKICAgICAgICAgbUNhbGxlZCA9IGZhbHNlOworICAgICAgICAKKyAgICAgICAgbUZyYWdtZW50cy5kaXNwYXRjaFJlc3VtZSgpOworICAgICAgICAKICAgICAgICAgb25Qb3N0UmVzdW1lKCk7CiAgICAgICAgIGlmICghbUNhbGxlZCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IFN1cGVyTm90Q2FsbGVkRXhjZXB0aW9uKApAQCAtMzg3OSw2ICs0MTAxLDcgQEAKICAgICB9CiAKICAgICBmaW5hbCB2b2lkIHBlcmZvcm1QYXVzZSgpIHsKKyAgICAgICAgbUZyYWdtZW50cy5kaXNwYXRjaFBhdXNlKCk7CiAgICAgICAgIG9uUGF1c2UoKTsKICAgICB9CiAgICAgCkBAIC0zODkzLDYgKzQxMTYsOCBAQAogICAgICAgICAgICAgICAgIG1XaW5kb3cuY2xvc2VBbGxQYW5lbHMoKTsKICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgbUZyYWdtZW50cy5kaXNwYXRjaFN0b3AoKTsKKyAgICAgICAgICAgIAogICAgICAgICAgICAgbUNhbGxlZCA9IGZhbHNlOwogICAgICAgICAgICAgbUluc3RydW1lbnRhdGlvbi5jYWxsQWN0aXZpdHlPblN0b3AodGhpcyk7CiAgICAgICAgICAgICBpZiAoIW1DYWxsZWQpIHsKQEAgLTM5MTcsNiArNDE0MiwxMSBAQAogICAgICAgICBtUmVzdW1lZCA9IGZhbHNlOwogICAgIH0KIAorICAgIGZpbmFsIHZvaWQgcGVyZm9ybURlc3Ryb3koKSB7CisgICAgICAgIG1GcmFnbWVudHMuZGlzcGF0Y2hEZXN0cm95KCk7CisgICAgICAgIG9uRGVzdHJveSgpOworICAgIH0KKyAgICAKICAgICBmaW5hbCBib29sZWFuIGlzUmVzdW1lZCgpIHsKICAgICAgICAgcmV0dXJuIG1SZXN1bWVkOwogICAgIH0KQEAgLTM5MjgsNiArNDE1OCwxMSBAQAogICAgICAgICAgICAgKyAiLCByZXNDb2RlPSIgKyByZXN1bHRDb2RlICsgIiwgZGF0YT0iICsgZGF0YSk7CiAgICAgICAgIGlmICh3aG8gPT0gbnVsbCkgewogICAgICAgICAgICAgb25BY3Rpdml0eVJlc3VsdChyZXF1ZXN0Q29kZSwgcmVzdWx0Q29kZSwgZGF0YSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBGcmFnbWVudCBmcmFnID0gbUZyYWdtZW50cy5maW5kRnJhZ21lbnRCeVdobyh3aG8pOworICAgICAgICAgICAgaWYgKGZyYWcgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZyYWcub25BY3Rpdml0eVJlc3VsdChyZXF1ZXN0Q29kZSwgcmVzdWx0Q29kZSwgZGF0YSk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvQWN0aXZpdHlUaHJlYWQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9BY3Rpdml0eVRocmVhZC5qYXZhCmluZGV4IDAzYmI4NTguLjFiMzhjNDIgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9BY3Rpdml0eVRocmVhZC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9BY3Rpdml0eVRocmVhZC5qYXZhCkBAIC0zMCw2ICszMCw3IEBACiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLklQYWNrYWdlTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uSW5zdHJ1bWVudGF0aW9uSW5mbzsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyLk5hbWVOb3RGb3VuZEV4Y2VwdGlvbjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUHJvdmlkZXJJbmZvOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5TZXJ2aWNlSW5mbzsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkFzc2V0TWFuYWdlcjsKQEAgLTE5NCw4ICsxOTUsNyBAQAogICAgICAgICBXaW5kb3cgd2luZG93OwogICAgICAgICBBY3Rpdml0eSBwYXJlbnQ7CiAgICAgICAgIFN0cmluZyBlbWJlZGRlZElEOwotICAgICAgICBPYmplY3QgbGFzdE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZTsKLSAgICAgICAgSGFzaE1hcDxTdHJpbmcsT2JqZWN0PiBsYXN0Tm9uQ29uZmlndXJhdGlvbkNoaWxkSW5zdGFuY2VzOworICAgICAgICBBY3Rpdml0eS5Ob25Db25maWd1cmF0aW9uSW5zdGFuY2VzIGxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2VzOwogICAgICAgICBib29sZWFuIHBhdXNlZDsKICAgICAgICAgYm9vbGVhbiBzdG9wcGVkOwogICAgICAgICBib29sZWFuIGhpZGVGb3JOb3c7CkBAIC0zNjAsNyArMzYwLDcgQEAKICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQVBfQ09MVU1OID0gIiUxN3MgJThzICU4cyAlOHMgJThzIjsKICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE9ORV9DT1VOVF9DT0xVTU4gPSAiJTE3cyAlOGQiOwogICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFdPX0NPVU5UX0NPTFVNTlMgPSAiJTE3cyAlOGQgJTE3cyAlOGQiOwotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREJfSU5GT19GT1JNQVQgPSAiICAlOGQgJThkICUxMGQgICVzIjsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERCX0lORk9fRk9STUFUID0gIiAgJTRkICU2ZCAlOGQgJTE0cyAgJXMiOwogCiAgICAgICAgIC8vIEZvcm1hdHRpbmcgZm9yIGNoZWNraW4gc2VydmljZSAtIHVwZGF0ZSB2ZXJzaW9uIGlmIHJvdyBmb3JtYXQgY2hhbmdlcwogICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQUNUSVZJVFlfVEhSRUFEX0NIRUNLSU5fVkVSU0lPTiA9IDE7CkBAIC03NjgsNyArNzY4LDcgQEAKICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN0YXRzLmRiU3RhdHMuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgRGJTdGF0cyBkYlN0YXRzID0gc3RhdHMuZGJTdGF0cy5nZXQoaSk7CiAgICAgICAgICAgICAgICAgICAgIHByaW50Um93KHB3LCBEQl9JTkZPX0ZPUk1BVCwgZGJTdGF0cy5wYWdlU2l6ZSwgZGJTdGF0cy5kYlNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJTdGF0cy5sb29rYXNpZGUsIGRiU3RhdHMuZGJOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYlN0YXRzLmxvb2thc2lkZSwgZGJTdGF0cy5jYWNoZSwgZGJTdGF0cy5kYk5hbWUpOwogICAgICAgICAgICAgICAgICAgICBwdy5wcmludCgnLCcpOwogICAgICAgICAgICAgICAgIH0KIApAQCAtODE5LDExICs4MTksMTIgQEAKICAgICAgICAgICAgIGludCBOID0gc3RhdHMuZGJTdGF0cy5zaXplKCk7CiAgICAgICAgICAgICBpZiAoTiA+IDApIHsKICAgICAgICAgICAgICAgICBwdy5wcmludGxuKCIgREFUQUJBU0VTIik7Ci0gICAgICAgICAgICAgICAgcHJpbnRSb3cocHcsICIgICU4cyAlOHMgJTEwcyAgJXMiLCAiUGFnZXNpemUiLCAiRGJzaXplIiwgIkxvb2thc2lkZSIsICJEYm5hbWUiKTsKKyAgICAgICAgICAgICAgICBwcmludFJvdyhwdywgIiAgJTRzICU2cyAlOHMgJTE0cyAgJXMiLCAicGdzeiIsICJkYnN6IiwgImxrYXNpZGUiLCAiY2FjaGUiLAorICAgICAgICAgICAgICAgICAgICAiRGJuYW1lIik7CiAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgRGJTdGF0cyBkYlN0YXRzID0gc3RhdHMuZGJTdGF0cy5nZXQoaSk7CiAgICAgICAgICAgICAgICAgICAgIHByaW50Um93KHB3LCBEQl9JTkZPX0ZPUk1BVCwgZGJTdGF0cy5wYWdlU2l6ZSwgZGJTdGF0cy5kYlNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJTdGF0cy5sb29rYXNpZGUsIGRiU3RhdHMuZGJOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYlN0YXRzLmxvb2thc2lkZSwgZGJTdGF0cy5jYWNoZSwgZGJTdGF0cy5kYk5hbWUpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIApAQCAtMTA0OSw4ICsxMDUwLDI3IEBACiAKICAgICAgICAgdm9pZCBtYXliZVNuYXBzaG90KCkgewogICAgICAgICAgICAgaWYgKG1Cb3VuZEFwcGxpY2F0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBTYW1wbGluZ1Byb2ZpbGVySW50ZWdyYXRpb24ud3JpdGVTbmFwc2hvdCgKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Cb3VuZEFwcGxpY2F0aW9uLnByb2Nlc3NOYW1lKTsKKyAgICAgICAgICAgICAgICAvLyBjb252ZXJ0IHRoZSAqcHJpdmF0ZSogQWN0aXZpdHlUaHJlYWQuUGFja2FnZUluZm8gdG8gKnB1YmxpYyoga25vd24KKyAgICAgICAgICAgICAgICAvLyBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZUluZm8KKyAgICAgICAgICAgICAgICBTdHJpbmcgcGFja2FnZU5hbWUgPSBtQm91bmRBcHBsaWNhdGlvbi5pbmZvLm1QYWNrYWdlTmFtZTsKKyAgICAgICAgICAgICAgICBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZUluZm8gcGFja2FnZUluZm8gPSBudWxsOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIENvbnRleHQgY29udGV4dCA9IGdldFN5c3RlbUNvbnRleHQoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYoY29udGV4dCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJjYW5ub3QgZ2V0IGEgdmFsaWQgY29udGV4dCIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIFBhY2thZ2VNYW5hZ2VyIHBtID0gY29udGV4dC5nZXRQYWNrYWdlTWFuYWdlcigpOworICAgICAgICAgICAgICAgICAgICBpZihwbSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJjYW5ub3QgZ2V0IGEgdmFsaWQgUGFja2FnZU1hbmFnZXIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwYWNrYWdlSW5mbyA9IHBtLmdldFBhY2thZ2VJbmZvKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhY2thZ2VOYW1lLCBQYWNrYWdlTWFuYWdlci5HRVRfQUNUSVZJVElFUyk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoTmFtZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiY2Fubm90IGdldCBwYWNrYWdlIGluZm8gZm9yICIgKyBwYWNrYWdlTmFtZSwgZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFNhbXBsaW5nUHJvZmlsZXJJbnRlZ3JhdGlvbi53cml0ZVNuYXBzaG90KG1Cb3VuZEFwcGxpY2F0aW9uLnByb2Nlc3NOYW1lLCBwYWNrYWdlSW5mbyk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC0xNDQxLDcgKzE0NjEsNyBAQAogCiAgICAgcHVibGljIGZpbmFsIEFjdGl2aXR5IHN0YXJ0QWN0aXZpdHlOb3coQWN0aXZpdHkgcGFyZW50LCBTdHJpbmcgaWQsCiAgICAgICAgIEludGVudCBpbnRlbnQsIEFjdGl2aXR5SW5mbyBhY3Rpdml0eUluZm8sIElCaW5kZXIgdG9rZW4sIEJ1bmRsZSBzdGF0ZSwKLSAgICAgICAgT2JqZWN0IGxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2UpIHsKKyAgICAgICAgQWN0aXZpdHkuTm9uQ29uZmlndXJhdGlvbkluc3RhbmNlcyBsYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlcykgewogICAgICAgICBBY3Rpdml0eUNsaWVudFJlY29yZCByID0gbmV3IEFjdGl2aXR5Q2xpZW50UmVjb3JkKCk7CiAgICAgICAgICAgICByLnRva2VuID0gdG9rZW47CiAgICAgICAgICAgICByLmlkZW50ID0gMDsKQEAgLTE0NTAsNyArMTQ3MCw3IEBACiAgICAgICAgICAgICByLnBhcmVudCA9IHBhcmVudDsKICAgICAgICAgICAgIHIuZW1iZWRkZWRJRCA9IGlkOwogICAgICAgICAgICAgci5hY3Rpdml0eUluZm8gPSBhY3Rpdml0eUluZm87Ci0gICAgICAgICAgICByLmxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2UgPSBsYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlOworICAgICAgICAgICAgci5sYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlcyA9IGxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2VzOwogICAgICAgICBpZiAobG9jYWxMT0dWKSB7CiAgICAgICAgICAgICBDb21wb25lbnROYW1lIGNvbXBuYW1lID0gaW50ZW50LmdldENvbXBvbmVudCgpOwogICAgICAgICAgICAgU3RyaW5nIG5hbWU7CkBAIC0xNTcyLDE0ICsxNTkyLDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICArIHIuYWN0aXZpdHlJbmZvLm5hbWUgKyAiIHdpdGggY29uZmlnICIgKyBjb25maWcpOwogICAgICAgICAgICAgICAgIGFjdGl2aXR5LmF0dGFjaChhcHBDb250ZXh0LCB0aGlzLCBnZXRJbnN0cnVtZW50YXRpb24oKSwgci50b2tlbiwKICAgICAgICAgICAgICAgICAgICAgICAgIHIuaWRlbnQsIGFwcCwgci5pbnRlbnQsIHIuYWN0aXZpdHlJbmZvLCB0aXRsZSwgci5wYXJlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICByLmVtYmVkZGVkSUQsIHIubGFzdE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHIubGFzdE5vbkNvbmZpZ3VyYXRpb25DaGlsZEluc3RhbmNlcywgY29uZmlnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHIuZW1iZWRkZWRJRCwgci5sYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlcywgY29uZmlnKTsKIAogICAgICAgICAgICAgICAgIGlmIChjdXN0b21JbnRlbnQgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICBhY3Rpdml0eS5tSW50ZW50ID0gY3VzdG9tSW50ZW50OwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByLmxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2UgPSBudWxsOwotICAgICAgICAgICAgICAgIHIubGFzdE5vbkNvbmZpZ3VyYXRpb25DaGlsZEluc3RhbmNlcyA9IG51bGw7CisgICAgICAgICAgICAgICAgci5sYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlcyA9IG51bGw7CiAgICAgICAgICAgICAgICAgYWN0aXZpdHkubVN0YXJ0ZWRBY3Rpdml0eSA9IGZhbHNlOwogICAgICAgICAgICAgICAgIGludCB0aGVtZSA9IHIuYWN0aXZpdHlJbmZvLmdldFRoZW1lUmVzb3VyY2UoKTsKICAgICAgICAgICAgICAgICBpZiAodGhlbWUgIT0gMCkgewpAQCAtMjUzNyw2ICsyNTU1LDkgQEAKICAgICAgICAgICAgIGlmIChmaW5pc2hpbmcpIHsKICAgICAgICAgICAgICAgICByLmFjdGl2aXR5Lm1GaW5pc2hlZCA9IHRydWU7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZ2V0Tm9uQ29uZmlnSW5zdGFuY2UpIHsKKyAgICAgICAgICAgICAgICByLmFjdGl2aXR5Lm1DaGFuZ2luZ0NvbmZpZ3VyYXRpb25zID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmICghci5wYXVzZWQpIHsKICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICByLmFjdGl2aXR5Lm1DYWxsZWQgPSBmYWxzZTsKQEAgLTI1NzcsOCArMjU5OCw4IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoZ2V0Tm9uQ29uZmlnSW5zdGFuY2UpIHsKICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICByLmxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IHIuYWN0aXZpdHkub25SZXRhaW5Ob25Db25maWd1cmF0aW9uSW5zdGFuY2UoKTsKKyAgICAgICAgICAgICAgICAgICAgci5sYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gci5hY3Rpdml0eS5yZXRhaW5Ob25Db25maWd1cmF0aW9uSW5zdGFuY2VzKCk7CiAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKCFtSW5zdHJ1bWVudGF0aW9uLm9uRXhjZXB0aW9uKHIuYWN0aXZpdHksIGUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigKQEAgLTI1ODcsMjIgKzI2MDgsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiOiAiICsgZS50b1N0cmluZygpLCBlKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICByLmxhc3ROb25Db25maWd1cmF0aW9uQ2hpbGRJbnN0YW5jZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IHIuYWN0aXZpdHkub25SZXRhaW5Ob25Db25maWd1cmF0aW9uQ2hpbGRJbnN0YW5jZXMoKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoIW1JbnN0cnVtZW50YXRpb24ub25FeGNlcHRpb24oci5hY3Rpdml0eSwgZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5hYmxlIHRvIHJldGFpbiBjaGlsZCBhY3Rpdml0aWVzICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzYWZlVG9Db21wb25lbnRTaG9ydFN0cmluZyhyLmludGVudCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiOiAiICsgZS50b1N0cmluZygpLCBlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQogICAgICAgICAgICAgfQogICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICByLmFjdGl2aXR5Lm1DYWxsZWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICByLmFjdGl2aXR5Lm9uRGVzdHJveSgpOworICAgICAgICAgICAgICAgIG1JbnN0cnVtZW50YXRpb24uY2FsbEFjdGl2aXR5T25EZXN0cm95KHIuYWN0aXZpdHkpOwogICAgICAgICAgICAgICAgIGlmICghci5hY3Rpdml0eS5tQ2FsbGVkKSB7CiAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTdXBlck5vdENhbGxlZEV4Y2VwdGlvbigKICAgICAgICAgICAgICAgICAgICAgICAgICJBY3Rpdml0eSAiICsgc2FmZVRvQ29tcG9uZW50U2hvcnRTdHJpbmcoci5pbnRlbnQpICsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9CYWNrU3RhY2tFbnRyeS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0JhY2tTdGFja0VudHJ5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWU5YWVhNQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9CYWNrU3RhY2tFbnRyeS5qYXZhCkBAIC0wLDAgKzEsNDMzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmFwcDsKKworaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsOworaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsYWJsZTsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CisKK2ZpbmFsIGNsYXNzIEJhY2tTdGFja1N0YXRlIGltcGxlbWVudHMgUGFyY2VsYWJsZSB7CisgICAgZmluYWwgaW50W10gbU9wczsKKyAgICBmaW5hbCBpbnQgbVRyYW5zaXRpb247CisgICAgZmluYWwgaW50IG1UcmFuc2l0aW9uU3R5bGU7CisgICAgZmluYWwgU3RyaW5nIG1OYW1lOworICAgIAorICAgIHB1YmxpYyBCYWNrU3RhY2tTdGF0ZShGcmFnbWVudE1hbmFnZXIgZm0sIEJhY2tTdGFja0VudHJ5IGJzZSkgeworICAgICAgICBtT3BzID0gbmV3IGludFtic2UubU51bU9wKjRdOworICAgICAgICBCYWNrU3RhY2tFbnRyeS5PcCBvcCA9IGJzZS5tSGVhZDsKKyAgICAgICAgaW50IHBvcyA9IDA7CisgICAgICAgIHdoaWxlIChvcCAhPSBudWxsKSB7CisgICAgICAgICAgICBtT3BzW3BvcysrXSA9IG9wLmNtZDsKKyAgICAgICAgICAgIG1PcHNbcG9zKytdID0gb3AuZnJhZ21lbnQubUluZGV4OworICAgICAgICAgICAgbU9wc1twb3MrK10gPSBvcC5lbnRlckFuaW07CisgICAgICAgICAgICBtT3BzW3BvcysrXSA9IG9wLmV4aXRBbmltOworICAgICAgICAgICAgb3AgPSBvcC5uZXh0OworICAgICAgICB9CisgICAgICAgIG1UcmFuc2l0aW9uID0gYnNlLm1UcmFuc2l0aW9uOworICAgICAgICBtVHJhbnNpdGlvblN0eWxlID0gYnNlLm1UcmFuc2l0aW9uU3R5bGU7CisgICAgICAgIG1OYW1lID0gYnNlLm1OYW1lOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgQmFja1N0YWNrU3RhdGUoUGFyY2VsIGluKSB7CisgICAgICAgIG1PcHMgPSBpbi5jcmVhdGVJbnRBcnJheSgpOworICAgICAgICBtVHJhbnNpdGlvbiA9IGluLnJlYWRJbnQoKTsKKyAgICAgICAgbVRyYW5zaXRpb25TdHlsZSA9IGluLnJlYWRJbnQoKTsKKyAgICAgICAgbU5hbWUgPSBpbi5yZWFkU3RyaW5nKCk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBCYWNrU3RhY2tFbnRyeSBpbnN0YW50aWF0ZShGcmFnbWVudE1hbmFnZXIgZm0pIHsKKyAgICAgICAgQmFja1N0YWNrRW50cnkgYnNlID0gbmV3IEJhY2tTdGFja0VudHJ5KGZtKTsKKyAgICAgICAgaW50IHBvcyA9IDA7CisgICAgICAgIHdoaWxlIChwb3MgPCBtT3BzLmxlbmd0aCkgeworICAgICAgICAgICAgQmFja1N0YWNrRW50cnkuT3Agb3AgPSBuZXcgQmFja1N0YWNrRW50cnkuT3AoKTsKKyAgICAgICAgICAgIG9wLmNtZCA9IG1PcHNbcG9zKytdOworICAgICAgICAgICAgRnJhZ21lbnQgZiA9IGZtLm1BY3RpdmUuZ2V0KG1PcHNbcG9zKytdKTsKKyAgICAgICAgICAgIGYubUJhY2tTdGFja05lc3RpbmcrKzsKKyAgICAgICAgICAgIG9wLmZyYWdtZW50ID0gZjsKKyAgICAgICAgICAgIG9wLmVudGVyQW5pbSA9IG1PcHNbcG9zKytdOworICAgICAgICAgICAgb3AuZXhpdEFuaW0gPSBtT3BzW3BvcysrXTsKKyAgICAgICAgICAgIGJzZS5hZGRPcChvcCk7CisgICAgICAgIH0KKyAgICAgICAgYnNlLm1UcmFuc2l0aW9uID0gbVRyYW5zaXRpb247CisgICAgICAgIGJzZS5tVHJhbnNpdGlvblN0eWxlID0gbVRyYW5zaXRpb25TdHlsZTsKKyAgICAgICAgYnNlLm1OYW1lID0gbU5hbWU7CisgICAgICAgIHJldHVybiBic2U7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBpbnQgZGVzY3JpYmVDb250ZW50cygpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd3JpdGVUb1BhcmNlbChQYXJjZWwgZGVzdCwgaW50IGZsYWdzKSB7CisgICAgICAgIGRlc3Qud3JpdGVJbnRBcnJheShtT3BzKTsKKyAgICAgICAgZGVzdC53cml0ZUludChtVHJhbnNpdGlvbik7CisgICAgICAgIGRlc3Qud3JpdGVJbnQobVRyYW5zaXRpb25TdHlsZSk7CisgICAgICAgIGRlc3Qud3JpdGVTdHJpbmcobU5hbWUpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFBhcmNlbGFibGUuQ3JlYXRvcjxCYWNrU3RhY2tTdGF0ZT4gQ1JFQVRPUgorICAgICAgICAgICAgPSBuZXcgUGFyY2VsYWJsZS5DcmVhdG9yPEJhY2tTdGFja1N0YXRlPigpIHsKKyAgICAgICAgcHVibGljIEJhY2tTdGFja1N0YXRlIGNyZWF0ZUZyb21QYXJjZWwoUGFyY2VsIGluKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEJhY2tTdGFja1N0YXRlKGluKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHVibGljIEJhY2tTdGFja1N0YXRlW10gbmV3QXJyYXkoaW50IHNpemUpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQmFja1N0YWNrU3RhdGVbc2l6ZV07CisgICAgICAgIH0KKyAgICB9OworfQorCisvKioKKyAqIEBoaWRlIEVudHJ5IG9mIGFuIG9wZXJhdGlvbiBvbiB0aGUgZnJhZ21lbnQgYmFjayBzdGFjay4KKyAqLworZmluYWwgY2xhc3MgQmFja1N0YWNrRW50cnkgaW1wbGVtZW50cyBGcmFnbWVudFRyYW5zYWN0aW9uLCBSdW5uYWJsZSB7CisgICAgZmluYWwgRnJhZ21lbnRNYW5hZ2VyIG1NYW5hZ2VyOworICAgIAorICAgIHN0YXRpYyBmaW5hbCBpbnQgT1BfTlVMTCA9IDA7CisgICAgc3RhdGljIGZpbmFsIGludCBPUF9BREQgPSAxOworICAgIHN0YXRpYyBmaW5hbCBpbnQgT1BfUkVQTEFDRSA9IDI7CisgICAgc3RhdGljIGZpbmFsIGludCBPUF9SRU1PVkUgPSAzOworICAgIHN0YXRpYyBmaW5hbCBpbnQgT1BfSElERSA9IDQ7CisgICAgc3RhdGljIGZpbmFsIGludCBPUF9TSE9XID0gNTsKKyAgICAKKyAgICBzdGF0aWMgZmluYWwgY2xhc3MgT3AgeworICAgICAgICBPcCBuZXh0OworICAgICAgICBPcCBwcmV2OworICAgICAgICBpbnQgY21kOworICAgICAgICBGcmFnbWVudCBmcmFnbWVudDsKKyAgICAgICAgaW50IGVudGVyQW5pbTsKKyAgICAgICAgaW50IGV4aXRBbmltOworICAgICAgICBBcnJheUxpc3Q8RnJhZ21lbnQ+IHJlbW92ZWQ7CisgICAgfQorICAgIAorICAgIE9wIG1IZWFkOworICAgIE9wIG1UYWlsOworICAgIGludCBtTnVtT3A7CisgICAgaW50IG1FbnRlckFuaW07CisgICAgaW50IG1FeGl0QW5pbTsKKyAgICBpbnQgbVRyYW5zaXRpb247CisgICAgaW50IG1UcmFuc2l0aW9uU3R5bGU7CisgICAgYm9vbGVhbiBtQWRkVG9CYWNrU3RhY2s7CisgICAgU3RyaW5nIG1OYW1lOworICAgIGJvb2xlYW4gbUNvbW1pdHRlZDsKKyAgICAKKyAgICBwdWJsaWMgQmFja1N0YWNrRW50cnkoRnJhZ21lbnRNYW5hZ2VyIG1hbmFnZXIpIHsKKyAgICAgICAgbU1hbmFnZXIgPSBtYW5hZ2VyOworICAgIH0KKyAgICAKKyAgICB2b2lkIGFkZE9wKE9wIG9wKSB7CisgICAgICAgIGlmIChtSGVhZCA9PSBudWxsKSB7CisgICAgICAgICAgICBtSGVhZCA9IG1UYWlsID0gb3A7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBvcC5wcmV2ID0gbVRhaWw7CisgICAgICAgICAgICBtVGFpbC5uZXh0ID0gb3A7CisgICAgICAgICAgICBtVGFpbCA9IG9wOworICAgICAgICB9CisgICAgICAgIG9wLmVudGVyQW5pbSA9IG1FbnRlckFuaW07CisgICAgICAgIG9wLmV4aXRBbmltID0gbUV4aXRBbmltOworICAgICAgICBtTnVtT3ArKzsKKyAgICB9CisgICAgICAgIAorICAgIHB1YmxpYyBGcmFnbWVudFRyYW5zYWN0aW9uIGFkZChGcmFnbWVudCBmcmFnbWVudCwgU3RyaW5nIHRhZykgeworICAgICAgICBkb0FkZE9wKDAsIGZyYWdtZW50LCB0YWcsIE9QX0FERCk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBGcmFnbWVudFRyYW5zYWN0aW9uIGFkZChpbnQgY29udGFpbmVyVmlld0lkLCBGcmFnbWVudCBmcmFnbWVudCkgeworICAgICAgICBkb0FkZE9wKGNvbnRhaW5lclZpZXdJZCwgZnJhZ21lbnQsIG51bGwsIE9QX0FERCk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBGcmFnbWVudFRyYW5zYWN0aW9uIGFkZChpbnQgY29udGFpbmVyVmlld0lkLCBGcmFnbWVudCBmcmFnbWVudCwgU3RyaW5nIHRhZykgeworICAgICAgICBkb0FkZE9wKGNvbnRhaW5lclZpZXdJZCwgZnJhZ21lbnQsIHRhZywgT1BfQUREKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGRvQWRkT3AoaW50IGNvbnRhaW5lclZpZXdJZCwgRnJhZ21lbnQgZnJhZ21lbnQsIFN0cmluZyB0YWcsIGludCBvcGNtZCkgeworICAgICAgICBpZiAoZnJhZ21lbnQubUltbWVkaWF0ZUFjdGl2aXR5ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkZyYWdtZW50IGFscmVhZHkgYWRkZWQ6ICIgKyBmcmFnbWVudCk7CisgICAgICAgIH0KKyAgICAgICAgZnJhZ21lbnQubUltbWVkaWF0ZUFjdGl2aXR5ID0gbU1hbmFnZXIubUFjdGl2aXR5OworICAgICAgICAKKyAgICAgICAgaWYgKHRhZyAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAoZnJhZ21lbnQubVRhZyAhPSBudWxsICYmICF0YWcuZXF1YWxzKGZyYWdtZW50Lm1UYWcpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQ2FuJ3QgY2hhbmdlIHRhZyBvZiBmcmFnbWVudCAiCisgICAgICAgICAgICAgICAgICAgICAgICArIGZyYWdtZW50ICsgIjogd2FzICIgKyBmcmFnbWVudC5tVGFnCisgICAgICAgICAgICAgICAgICAgICAgICArICIgbm93ICIgKyB0YWcpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZnJhZ21lbnQubVRhZyA9IHRhZzsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKGNvbnRhaW5lclZpZXdJZCAhPSAwKSB7CisgICAgICAgICAgICBpZiAoZnJhZ21lbnQubUZyYWdtZW50SWQgIT0gMCAmJiBmcmFnbWVudC5tRnJhZ21lbnRJZCAhPSBjb250YWluZXJWaWV3SWQpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJDYW4ndCBjaGFuZ2UgY29udGFpbmVyIElEIG9mIGZyYWdtZW50ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgZnJhZ21lbnQgKyAiOiB3YXMgIiArIGZyYWdtZW50Lm1GcmFnbWVudElkCisgICAgICAgICAgICAgICAgICAgICAgICArICIgbm93ICIgKyBjb250YWluZXJWaWV3SWQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZnJhZ21lbnQubUNvbnRhaW5lcklkID0gZnJhZ21lbnQubUZyYWdtZW50SWQgPSBjb250YWluZXJWaWV3SWQ7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIE9wIG9wID0gbmV3IE9wKCk7CisgICAgICAgIG9wLmNtZCA9IG9wY21kOworICAgICAgICBvcC5mcmFnbWVudCA9IGZyYWdtZW50OworICAgICAgICBhZGRPcChvcCk7CisgICAgfQorCisgICAgcHVibGljIEZyYWdtZW50VHJhbnNhY3Rpb24gcmVwbGFjZShpbnQgY29udGFpbmVyVmlld0lkLCBGcmFnbWVudCBmcmFnbWVudCkgeworICAgICAgICByZXR1cm4gcmVwbGFjZShjb250YWluZXJWaWV3SWQsIGZyYWdtZW50LCBudWxsKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIEZyYWdtZW50VHJhbnNhY3Rpb24gcmVwbGFjZShpbnQgY29udGFpbmVyVmlld0lkLCBGcmFnbWVudCBmcmFnbWVudCwgU3RyaW5nIHRhZykgeworICAgICAgICBpZiAoY29udGFpbmVyVmlld0lkID09IDApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk11c3QgdXNlIG5vbi16ZXJvIGNvbnRhaW5lclZpZXdJZCIpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBkb0FkZE9wKGNvbnRhaW5lclZpZXdJZCwgZnJhZ21lbnQsIHRhZywgT1BfUkVQTEFDRSk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgRnJhZ21lbnRUcmFuc2FjdGlvbiByZW1vdmUoRnJhZ21lbnQgZnJhZ21lbnQpIHsKKyAgICAgICAgaWYgKGZyYWdtZW50Lm1JbW1lZGlhdGVBY3Rpdml0eSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJGcmFnbWVudCBub3QgYWRkZWQ6ICIgKyBmcmFnbWVudCk7CisgICAgICAgIH0KKyAgICAgICAgZnJhZ21lbnQubUltbWVkaWF0ZUFjdGl2aXR5ID0gbnVsbDsKKyAgICAgICAgCisgICAgICAgIE9wIG9wID0gbmV3IE9wKCk7CisgICAgICAgIG9wLmNtZCA9IE9QX1JFTU9WRTsKKyAgICAgICAgb3AuZnJhZ21lbnQgPSBmcmFnbWVudDsKKyAgICAgICAgYWRkT3Aob3ApOworICAgICAgICAKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIEZyYWdtZW50VHJhbnNhY3Rpb24gaGlkZShGcmFnbWVudCBmcmFnbWVudCkgeworICAgICAgICBpZiAoZnJhZ21lbnQubUltbWVkaWF0ZUFjdGl2aXR5ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkZyYWdtZW50IG5vdCBhZGRlZDogIiArIGZyYWdtZW50KTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgT3Agb3AgPSBuZXcgT3AoKTsKKyAgICAgICAgb3AuY21kID0gT1BfSElERTsKKyAgICAgICAgb3AuZnJhZ21lbnQgPSBmcmFnbWVudDsKKyAgICAgICAgYWRkT3Aob3ApOworICAgICAgICAKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBGcmFnbWVudFRyYW5zYWN0aW9uIHNob3coRnJhZ21lbnQgZnJhZ21lbnQpIHsKKyAgICAgICAgaWYgKGZyYWdtZW50Lm1JbW1lZGlhdGVBY3Rpdml0eSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJGcmFnbWVudCBub3QgYWRkZWQ6ICIgKyBmcmFnbWVudCk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIE9wIG9wID0gbmV3IE9wKCk7CisgICAgICAgIG9wLmNtZCA9IE9QX1NIT1c7CisgICAgICAgIG9wLmZyYWdtZW50ID0gZnJhZ21lbnQ7CisgICAgICAgIGFkZE9wKG9wKTsKKyAgICAgICAgCisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgRnJhZ21lbnRUcmFuc2FjdGlvbiBzZXRDdXN0b21BbmltYXRpb25zKGludCBlbnRlciwgaW50IGV4aXQpIHsKKyAgICAgICAgbUVudGVyQW5pbSA9IGVudGVyOworICAgICAgICBtRXhpdEFuaW0gPSBleGl0OworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisgICAgCisgICAgcHVibGljIEZyYWdtZW50VHJhbnNhY3Rpb24gc2V0VHJhbnNpdGlvbihpbnQgdHJhbnNpdGlvbikgeworICAgICAgICBtVHJhbnNpdGlvbiA9IHRyYW5zaXRpb247CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgRnJhZ21lbnRUcmFuc2FjdGlvbiBzZXRUcmFuc2l0aW9uU3R5bGUoaW50IHN0eWxlUmVzKSB7CisgICAgICAgIG1UcmFuc2l0aW9uU3R5bGUgPSBzdHlsZVJlczsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBGcmFnbWVudFRyYW5zYWN0aW9uIGFkZFRvQmFja1N0YWNrKFN0cmluZyBuYW1lKSB7CisgICAgICAgIG1BZGRUb0JhY2tTdGFjayA9IHRydWU7CisgICAgICAgIG1OYW1lID0gbmFtZTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY29tbWl0KCkgeworICAgICAgICBpZiAobUNvbW1pdHRlZCkgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiY29tbWl0IGFscmVhZHkgY2FsbGVkIik7CisgICAgICAgIG1Db21taXR0ZWQgPSB0cnVlOworICAgICAgICBtTWFuYWdlci5tQWN0aXZpdHkubUhhbmRsZXIucG9zdCh0aGlzKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICBPcCBvcCA9IG1IZWFkOworICAgICAgICB3aGlsZSAob3AgIT0gbnVsbCkgeworICAgICAgICAgICAgc3dpdGNoIChvcC5jbWQpIHsKKyAgICAgICAgICAgICAgICBjYXNlIE9QX0FERDogeworICAgICAgICAgICAgICAgICAgICBGcmFnbWVudCBmID0gb3AuZnJhZ21lbnQ7CisgICAgICAgICAgICAgICAgICAgIGlmIChtQWRkVG9CYWNrU3RhY2spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGYubUJhY2tTdGFja05lc3RpbmcrKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBmLm1OZXh0QW5pbSA9IG9wLmVudGVyQW5pbTsKKyAgICAgICAgICAgICAgICAgICAgbU1hbmFnZXIuYWRkRnJhZ21lbnQoZiwgZmFsc2UpOworICAgICAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBPUF9SRVBMQUNFOiB7CisgICAgICAgICAgICAgICAgICAgIEZyYWdtZW50IGYgPSBvcC5mcmFnbWVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1NYW5hZ2VyLm1BZGRlZCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8bU1hbmFnZXIubUFkZGVkLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnJhZ21lbnQgb2xkID0gbU1hbmFnZXIubUFkZGVkLmdldChpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob2xkLm1Db250YWluZXJJZCA9PSBmLm1Db250YWluZXJJZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3AucmVtb3ZlZCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcC5yZW1vdmVkID0gbmV3IEFycmF5TGlzdDxGcmFnbWVudD4oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcC5yZW1vdmVkLmFkZChvbGQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUFkZFRvQmFja1N0YWNrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGQubUJhY2tTdGFja05lc3RpbmcrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGQubU5leHRBbmltID0gb3AuZXhpdEFuaW07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1NYW5hZ2VyLnJlbW92ZUZyYWdtZW50KG9sZCwgbVRyYW5zaXRpb24sIG1UcmFuc2l0aW9uU3R5bGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAobUFkZFRvQmFja1N0YWNrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmLm1CYWNrU3RhY2tOZXN0aW5nKys7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZi5tTmV4dEFuaW0gPSBvcC5lbnRlckFuaW07CisgICAgICAgICAgICAgICAgICAgIG1NYW5hZ2VyLmFkZEZyYWdtZW50KGYsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgT1BfUkVNT1ZFOiB7CisgICAgICAgICAgICAgICAgICAgIEZyYWdtZW50IGYgPSBvcC5mcmFnbWVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1BZGRUb0JhY2tTdGFjaykgeworICAgICAgICAgICAgICAgICAgICAgICAgZi5tQmFja1N0YWNrTmVzdGluZysrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGYubU5leHRBbmltID0gb3AuZXhpdEFuaW07CisgICAgICAgICAgICAgICAgICAgIG1NYW5hZ2VyLnJlbW92ZUZyYWdtZW50KGYsIG1UcmFuc2l0aW9uLCBtVHJhbnNpdGlvblN0eWxlKTsKKyAgICAgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgT1BfSElERTogeworICAgICAgICAgICAgICAgICAgICBGcmFnbWVudCBmID0gb3AuZnJhZ21lbnQ7CisgICAgICAgICAgICAgICAgICAgIGlmIChtQWRkVG9CYWNrU3RhY2spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGYubUJhY2tTdGFja05lc3RpbmcrKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBmLm1OZXh0QW5pbSA9IG9wLmV4aXRBbmltOworICAgICAgICAgICAgICAgICAgICBtTWFuYWdlci5oaWRlRnJhZ21lbnQoZiwgbVRyYW5zaXRpb24sIG1UcmFuc2l0aW9uU3R5bGUpOworICAgICAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBPUF9TSE9XOiB7CisgICAgICAgICAgICAgICAgICAgIEZyYWdtZW50IGYgPSBvcC5mcmFnbWVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1BZGRUb0JhY2tTdGFjaykgeworICAgICAgICAgICAgICAgICAgICAgICAgZi5tQmFja1N0YWNrTmVzdGluZysrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGYubU5leHRBbmltID0gb3AuZW50ZXJBbmltOworICAgICAgICAgICAgICAgICAgICBtTWFuYWdlci5zaG93RnJhZ21lbnQoZiwgbVRyYW5zaXRpb24sIG1UcmFuc2l0aW9uU3R5bGUpOworICAgICAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDogeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbmtub3duIGNtZDogIiArIG9wLmNtZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBvcCA9IG9wLm5leHQ7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIG1NYW5hZ2VyLm1vdmVUb1N0YXRlKG1NYW5hZ2VyLm1DdXJTdGF0ZSwgbVRyYW5zaXRpb24sCisgICAgICAgICAgICAgICAgbVRyYW5zaXRpb25TdHlsZSwgdHJ1ZSk7CisgICAgICAgIGlmIChtTWFuYWdlci5tTmVlZE1lbnVJbnZhbGlkYXRlICYmIG1NYW5hZ2VyLm1BY3Rpdml0eSAhPSBudWxsKSB7CisgICAgICAgICAgICBtTWFuYWdlci5tQWN0aXZpdHkuaW52YWxpZGF0ZU9wdGlvbnNNZW51KCk7CisgICAgICAgICAgICBtTWFuYWdlci5tTmVlZE1lbnVJbnZhbGlkYXRlID0gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmIChtQWRkVG9CYWNrU3RhY2spIHsKKyAgICAgICAgICAgIG1NYW5hZ2VyLmFkZEJhY2tTdGFja1N0YXRlKHRoaXMpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHBvcEZyb21CYWNrU3RhY2soKSB7CisgICAgICAgIE9wIG9wID0gbVRhaWw7CisgICAgICAgIHdoaWxlIChvcCAhPSBudWxsKSB7CisgICAgICAgICAgICBzd2l0Y2ggKG9wLmNtZCkgeworICAgICAgICAgICAgICAgIGNhc2UgT1BfQUREOiB7CisgICAgICAgICAgICAgICAgICAgIEZyYWdtZW50IGYgPSBvcC5mcmFnbWVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1BZGRUb0JhY2tTdGFjaykgeworICAgICAgICAgICAgICAgICAgICAgICAgZi5tQmFja1N0YWNrTmVzdGluZy0tOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG1NYW5hZ2VyLnJlbW92ZUZyYWdtZW50KGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnJhZ21lbnRNYW5hZ2VyLnJldmVyc2VUcmFuc2l0KG1UcmFuc2l0aW9uKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVHJhbnNpdGlvblN0eWxlKTsKKyAgICAgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgT1BfUkVQTEFDRTogeworICAgICAgICAgICAgICAgICAgICBGcmFnbWVudCBmID0gb3AuZnJhZ21lbnQ7CisgICAgICAgICAgICAgICAgICAgIGlmIChtQWRkVG9CYWNrU3RhY2spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGYubUJhY2tTdGFja05lc3RpbmctLTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtTWFuYWdlci5yZW1vdmVGcmFnbWVudChmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyYWdtZW50TWFuYWdlci5yZXZlcnNlVHJhbnNpdChtVHJhbnNpdGlvbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRyYW5zaXRpb25TdHlsZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChvcC5yZW1vdmVkICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxvcC5yZW1vdmVkLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnJhZ21lbnQgb2xkID0gb3AucmVtb3ZlZC5nZXQoaSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1BZGRUb0JhY2tTdGFjaykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGQubUJhY2tTdGFja05lc3RpbmctLTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU1hbmFnZXIuYWRkRnJhZ21lbnQob2xkLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgT1BfUkVNT1ZFOiB7CisgICAgICAgICAgICAgICAgICAgIEZyYWdtZW50IGYgPSBvcC5mcmFnbWVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1BZGRUb0JhY2tTdGFjaykgeworICAgICAgICAgICAgICAgICAgICAgICAgZi5tQmFja1N0YWNrTmVzdGluZy0tOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG1NYW5hZ2VyLmFkZEZyYWdtZW50KGYsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgT1BfSElERTogeworICAgICAgICAgICAgICAgICAgICBGcmFnbWVudCBmID0gb3AuZnJhZ21lbnQ7CisgICAgICAgICAgICAgICAgICAgIGlmIChtQWRkVG9CYWNrU3RhY2spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGYubUJhY2tTdGFja05lc3RpbmctLTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtTWFuYWdlci5zaG93RnJhZ21lbnQoZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGcmFnbWVudE1hbmFnZXIucmV2ZXJzZVRyYW5zaXQobVRyYW5zaXRpb24pLCBtVHJhbnNpdGlvblN0eWxlKTsKKyAgICAgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgT1BfU0hPVzogeworICAgICAgICAgICAgICAgICAgICBGcmFnbWVudCBmID0gb3AuZnJhZ21lbnQ7CisgICAgICAgICAgICAgICAgICAgIGlmIChtQWRkVG9CYWNrU3RhY2spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGYubUJhY2tTdGFja05lc3RpbmctLTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtTWFuYWdlci5oaWRlRnJhZ21lbnQoZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGcmFnbWVudE1hbmFnZXIucmV2ZXJzZVRyYW5zaXQobVRyYW5zaXRpb24pLCBtVHJhbnNpdGlvblN0eWxlKTsKKyAgICAgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5rbm93biBjbWQ6ICIgKyBvcC5jbWQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgb3AgPSBvcC5wcmV2OworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBtTWFuYWdlci5tb3ZlVG9TdGF0ZShtTWFuYWdlci5tQ3VyU3RhdGUsCisgICAgICAgICAgICAgICAgRnJhZ21lbnRNYW5hZ2VyLnJldmVyc2VUcmFuc2l0KG1UcmFuc2l0aW9uKSwgbVRyYW5zaXRpb25TdHlsZSwgdHJ1ZSk7CisgICAgICAgIGlmIChtTWFuYWdlci5tTmVlZE1lbnVJbnZhbGlkYXRlICYmIG1NYW5hZ2VyLm1BY3Rpdml0eSAhPSBudWxsKSB7CisgICAgICAgICAgICBtTWFuYWdlci5tQWN0aXZpdHkuaW52YWxpZGF0ZU9wdGlvbnNNZW51KCk7CisgICAgICAgICAgICBtTWFuYWdlci5tTmVlZE1lbnVJbnZhbGlkYXRlID0gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICByZXR1cm4gbU5hbWU7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBpbnQgZ2V0VHJhbnNpdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIG1UcmFuc2l0aW9uOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgaW50IGdldFRyYW5zaXRpb25TdHlsZSgpIHsKKyAgICAgICAgcmV0dXJuIG1UcmFuc2l0aW9uU3R5bGU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0NvbnRleHRJbXBsLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvQ29udGV4dEltcGwuamF2YQppbmRleCBmYzliY2Y3Li40ZmY4ZTFhIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvQ29udGV4dEltcGwuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvQ29udGV4dEltcGwuamF2YQpAQCAtNTcsNiArNTcsNyBAQAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQXNzZXRNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuWG1sUmVzb3VyY2VQYXJzZXI7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5EYXRhYmFzZUVycm9ySGFuZGxlcjsKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZTsKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZS5DdXJzb3JGYWN0b3J5OwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOwpAQCAtNTQzLDYgKzU0NCwxNSBAQAogICAgIH0KIAogICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTUUxpdGVEYXRhYmFzZSBvcGVuT3JDcmVhdGVEYXRhYmFzZShTdHJpbmcgbmFtZSwgaW50IG1vZGUsIEN1cnNvckZhY3RvcnkgZmFjdG9yeSwKKyAgICAgICAgICAgIERhdGFiYXNlRXJyb3JIYW5kbGVyIGVycm9ySGFuZGxlcikgeworICAgICAgICBGaWxlIGYgPSB2YWxpZGF0ZUZpbGVQYXRoKG5hbWUsIHRydWUpOworICAgICAgICBTUUxpdGVEYXRhYmFzZSBkYiA9IFNRTGl0ZURhdGFiYXNlLm9wZW5PckNyZWF0ZURhdGFiYXNlKGYuZ2V0UGF0aCgpLCBmYWN0b3J5LCBlcnJvckhhbmRsZXIpOworICAgICAgICBzZXRGaWxlUGVybWlzc2lvbnNGcm9tTW9kZShmLmdldFBhdGgoKSwgbW9kZSwgMCk7CisgICAgICAgIHJldHVybiBkYjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBkZWxldGVEYXRhYmFzZShTdHJpbmcgbmFtZSkgewogICAgICAgICB0cnkgewogICAgICAgICAgICAgRmlsZSBmID0gdmFsaWRhdGVGaWxlUGF0aChuYW1lLCBmYWxzZSk7CkBAIC02MjAsNyArNjMwLDggQEAKICAgICAgICAgICAgICAgICAgICAgKyAiIElzIHRoaXMgcmVhbGx5IHdoYXQgeW91IHdhbnQ/Iik7CiAgICAgICAgIH0KICAgICAgICAgbU1haW5UaHJlYWQuZ2V0SW5zdHJ1bWVudGF0aW9uKCkuZXhlY1N0YXJ0QWN0aXZpdHkoCi0gICAgICAgICAgICBnZXRPdXRlckNvbnRleHQoKSwgbU1haW5UaHJlYWQuZ2V0QXBwbGljYXRpb25UaHJlYWQoKSwgbnVsbCwgbnVsbCwgaW50ZW50LCAtMSk7CisgICAgICAgICAgICBnZXRPdXRlckNvbnRleHQoKSwgbU1haW5UaHJlYWQuZ2V0QXBwbGljYXRpb25UaHJlYWQoKSwgbnVsbCwKKyAgICAgICAgICAgIChBY3Rpdml0eSludWxsLCBpbnRlbnQsIC0xKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTI3MzcsNiArMjc0OCwxMyBAQAogICAgICAgICAgICAgICAgIHJldHVybiB2ICE9IG51bGwgPyB2IDogZGVmVmFsdWU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBTZXQ8U3RyaW5nPiBnZXRTdHJpbmdTZXQoU3RyaW5nIGtleSwgU2V0PFN0cmluZz4gZGVmVmFsdWVzKSB7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgICAgICBTZXQ8U3RyaW5nPiB2ID0gKFNldDxTdHJpbmc+KSBtTWFwLmdldChrZXkpOworICAgICAgICAgICAgICAgIHJldHVybiB2ICE9IG51bGwgPyB2IDogZGVmVmFsdWVzOworICAgICAgICAgICAgfQorICAgICAgICB9CiAKICAgICAgICAgcHVibGljIGludCBnZXRJbnQoU3RyaW5nIGtleSwgaW50IGRlZlZhbHVlKSB7CiAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKQEAgLTI3NzksNiArMjc5NywxMiBAQAogICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBwdWJsaWMgRWRpdG9yIHB1dFN0cmluZ1NldChTdHJpbmcga2V5LCBTZXQ8U3RyaW5nPiB2YWx1ZXMpIHsKKyAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgICAgICAgICAgbU1vZGlmaWVkLnB1dChrZXksIHZhbHVlcyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIHB1YmxpYyBFZGl0b3IgcHV0SW50KFN0cmluZyBrZXksIGludCB2YWx1ZSkgewogICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewogICAgICAgICAgICAgICAgICAgICBtTW9kaWZpZWQucHV0KGtleSwgdmFsdWUpOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0ZyYWdtZW50LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvRnJhZ21lbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzFkNmFiCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0ZyYWdtZW50LmphdmEKQEAgLTAsMCArMSw3MDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuYXBwOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudENhbGxiYWNrczsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbDsKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbGFibGU7CitpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuU3BhcnNlQXJyYXk7CitpbXBvcnQgYW5kcm9pZC52aWV3LkNvbnRleHRNZW51OworaW1wb3J0IGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudUluZmxhdGVyOworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51SXRlbTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOworaW1wb3J0IGFuZHJvaWQudmlldy5Db250ZXh0TWVudS5Db250ZXh0TWVudUluZm87CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXcuT25DcmVhdGVDb250ZXh0TWVudUxpc3RlbmVyOworaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uQW5pbWF0aW9uOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJWaWV3OworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKKworZmluYWwgY2xhc3MgRnJhZ21lbnRTdGF0ZSBpbXBsZW1lbnRzIFBhcmNlbGFibGUgeworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgVklFV19TVEFURV9UQUcgPSAiYW5kcm9pZDp2aWV3X3N0YXRlIjsKKyAgICAKKyAgICBmaW5hbCBTdHJpbmcgbUNsYXNzTmFtZTsKKyAgICBmaW5hbCBpbnQgbUluZGV4OworICAgIGZpbmFsIGJvb2xlYW4gbUZyb21MYXlvdXQ7CisgICAgZmluYWwgaW50IG1GcmFnbWVudElkOworICAgIGZpbmFsIGludCBtQ29udGFpbmVySWQ7CisgICAgZmluYWwgU3RyaW5nIG1UYWc7CisgICAgZmluYWwgYm9vbGVhbiBtUmV0YWluSW5zdGFuY2U7CisgICAgCisgICAgQnVuZGxlIG1TYXZlZEZyYWdtZW50U3RhdGU7CisgICAgCisgICAgRnJhZ21lbnQgbUluc3RhbmNlOworICAgIAorICAgIHB1YmxpYyBGcmFnbWVudFN0YXRlKEZyYWdtZW50IGZyYWcpIHsKKyAgICAgICAgbUNsYXNzTmFtZSA9IGZyYWcuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7CisgICAgICAgIG1JbmRleCA9IGZyYWcubUluZGV4OworICAgICAgICBtRnJvbUxheW91dCA9IGZyYWcubUZyb21MYXlvdXQ7CisgICAgICAgIG1GcmFnbWVudElkID0gZnJhZy5tRnJhZ21lbnRJZDsKKyAgICAgICAgbUNvbnRhaW5lcklkID0gZnJhZy5tQ29udGFpbmVySWQ7CisgICAgICAgIG1UYWcgPSBmcmFnLm1UYWc7CisgICAgICAgIG1SZXRhaW5JbnN0YW5jZSA9IGZyYWcubVJldGFpbkluc3RhbmNlOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgRnJhZ21lbnRTdGF0ZShQYXJjZWwgaW4pIHsKKyAgICAgICAgbUNsYXNzTmFtZSA9IGluLnJlYWRTdHJpbmcoKTsKKyAgICAgICAgbUluZGV4ID0gaW4ucmVhZEludCgpOworICAgICAgICBtRnJvbUxheW91dCA9IGluLnJlYWRJbnQoKSAhPSAwOworICAgICAgICBtRnJhZ21lbnRJZCA9IGluLnJlYWRJbnQoKTsKKyAgICAgICAgbUNvbnRhaW5lcklkID0gaW4ucmVhZEludCgpOworICAgICAgICBtVGFnID0gaW4ucmVhZFN0cmluZygpOworICAgICAgICBtUmV0YWluSW5zdGFuY2UgPSBpbi5yZWFkSW50KCkgIT0gMDsKKyAgICAgICAgbVNhdmVkRnJhZ21lbnRTdGF0ZSA9IGluLnJlYWRCdW5kbGUoKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIEZyYWdtZW50IGluc3RhbnRpYXRlKEFjdGl2aXR5IGFjdGl2aXR5KSB7CisgICAgICAgIGlmIChtSW5zdGFuY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG1JbnN0YW5jZTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1JbnN0YW5jZSA9IEZyYWdtZW50Lmluc3RhbnRpYXRlKGFjdGl2aXR5LCBtQ2xhc3NOYW1lKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJVbmFibGUgdG8gcmVzdG9yZSBmcmFnbWVudCAiICsgbUNsYXNzTmFtZSwgZSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmIChtU2F2ZWRGcmFnbWVudFN0YXRlICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1TYXZlZEZyYWdtZW50U3RhdGUuc2V0Q2xhc3NMb2FkZXIoYWN0aXZpdHkuZ2V0Q2xhc3NMb2FkZXIoKSk7CisgICAgICAgICAgICBtSW5zdGFuY2UubVNhdmVkRnJhZ21lbnRTdGF0ZSA9IG1TYXZlZEZyYWdtZW50U3RhdGU7CisgICAgICAgICAgICBtSW5zdGFuY2UubVNhdmVkVmlld1N0YXRlCisgICAgICAgICAgICAgICAgICAgID0gbVNhdmVkRnJhZ21lbnRTdGF0ZS5nZXRTcGFyc2VQYXJjZWxhYmxlQXJyYXkoVklFV19TVEFURV9UQUcpOworICAgICAgICB9CisgICAgICAgIG1JbnN0YW5jZS5zZXRJbmRleChtSW5kZXgpOworICAgICAgICBtSW5zdGFuY2UubUZyb21MYXlvdXQgPSBtRnJvbUxheW91dDsKKyAgICAgICAgbUluc3RhbmNlLm1GcmFnbWVudElkID0gbUZyYWdtZW50SWQ7CisgICAgICAgIG1JbnN0YW5jZS5tQ29udGFpbmVySWQgPSBtQ29udGFpbmVySWQ7CisgICAgICAgIG1JbnN0YW5jZS5tVGFnID0gbVRhZzsKKyAgICAgICAgbUluc3RhbmNlLm1SZXRhaW5JbnN0YW5jZSA9IG1SZXRhaW5JbnN0YW5jZTsKKyAgICAgICAgCisgICAgICAgIHJldHVybiBtSW5zdGFuY2U7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBpbnQgZGVzY3JpYmVDb250ZW50cygpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd3JpdGVUb1BhcmNlbChQYXJjZWwgZGVzdCwgaW50IGZsYWdzKSB7CisgICAgICAgIGRlc3Qud3JpdGVTdHJpbmcobUNsYXNzTmFtZSk7CisgICAgICAgIGRlc3Qud3JpdGVJbnQobUluZGV4KTsKKyAgICAgICAgZGVzdC53cml0ZUludChtRnJvbUxheW91dCA/IDEgOiAwKTsKKyAgICAgICAgZGVzdC53cml0ZUludChtRnJhZ21lbnRJZCk7CisgICAgICAgIGRlc3Qud3JpdGVJbnQobUNvbnRhaW5lcklkKTsKKyAgICAgICAgZGVzdC53cml0ZVN0cmluZyhtVGFnKTsKKyAgICAgICAgZGVzdC53cml0ZUludChtUmV0YWluSW5zdGFuY2UgPyAxIDogMCk7CisgICAgICAgIGRlc3Qud3JpdGVCdW5kbGUobVNhdmVkRnJhZ21lbnRTdGF0ZSk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUGFyY2VsYWJsZS5DcmVhdG9yPEZyYWdtZW50U3RhdGU+IENSRUFUT1IKKyAgICAgICAgICAgID0gbmV3IFBhcmNlbGFibGUuQ3JlYXRvcjxGcmFnbWVudFN0YXRlPigpIHsKKyAgICAgICAgcHVibGljIEZyYWdtZW50U3RhdGUgY3JlYXRlRnJvbVBhcmNlbChQYXJjZWwgaW4pIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgRnJhZ21lbnRTdGF0ZShpbik7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBGcmFnbWVudFN0YXRlW10gbmV3QXJyYXkoaW50IHNpemUpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgRnJhZ21lbnRTdGF0ZVtzaXplXTsKKyAgICAgICAgfQorICAgIH07Cit9CisKKy8qKgorICogQSBGcmFnbWVudCBpcyBhIHBpZWNlIG9mIGFuIGFwcGxpY2F0aW9uJ3MgdXNlciBpbnRlcmZhY2Ugb3IgYmVoYXZpb3IKKyAqIHRoYXQgY2FuIGJlIHBsYWNlZCBpbiBhbiB7QGxpbmsgQWN0aXZpdHl9LgorICovCitwdWJsaWMgY2xhc3MgRnJhZ21lbnQgaW1wbGVtZW50cyBDb21wb25lbnRDYWxsYmFja3MsIE9uQ3JlYXRlQ29udGV4dE1lbnVMaXN0ZW5lciB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSGFzaE1hcDxTdHJpbmcsIENsYXNzPiBzQ2xhc3NNYXAgPQorICAgICAgICAgICAgbmV3IEhhc2hNYXA8U3RyaW5nLCBDbGFzcz4oKTsKKyAgICAKKyAgICBzdGF0aWMgZmluYWwgaW50IElOSVRJQUxJWklORyA9IDA7ICAvLyBOb3QgeWV0IGNyZWF0ZWQuCisgICAgc3RhdGljIGZpbmFsIGludCBDUkVBVEVEID0gMTsgICAgICAgLy8gQ3JlYXRlZC4KKyAgICBzdGF0aWMgZmluYWwgaW50IENPTlRFTlQgPSAyOyAgICAgICAvLyBWaWV3IGhpZXJhcmNoeSBjb250ZW50IGF2YWlsYWJsZS4KKyAgICBzdGF0aWMgZmluYWwgaW50IFNUQVJURUQgPSAzOyAgICAgICAvLyBDcmVhdGVkIGFuZCBzdGFydGVkLCBub3QgcmVzdW1lZC4KKyAgICBzdGF0aWMgZmluYWwgaW50IFJFU1VNRUQgPSA0OyAgICAgICAvLyBDcmVhdGVkIHN0YXJ0ZWQgYW5kIHJlc3VtZWQuCisgICAgCisgICAgaW50IG1TdGF0ZSA9IElOSVRJQUxJWklORzsKKyAgICAKKyAgICAvLyBXaGVuIGluc3RhbnRpYXRlZCBmcm9tIHNhdmVkIHN0YXRlLCB0aGlzIGlzIHRoZSBzYXZlZCBzdGF0ZS4KKyAgICBCdW5kbGUgbVNhdmVkRnJhZ21lbnRTdGF0ZTsKKyAgICBTcGFyc2VBcnJheTxQYXJjZWxhYmxlPiBtU2F2ZWRWaWV3U3RhdGU7CisgICAgCisgICAgLy8gSW5kZXggaW50byBhY3RpdmUgZnJhZ21lbnQgYXJyYXkuCisgICAgaW50IG1JbmRleCA9IC0xOworICAgIAorICAgIC8vIEludGVybmFsIHVuaXF1ZSBuYW1lIGZvciB0aGlzIGZyYWdtZW50OworICAgIFN0cmluZyBtV2hvOworICAgIAorICAgIC8vIFRydWUgaWYgdGhlIGZyYWdtZW50IGlzIGluIHRoZSBsaXN0IG9mIGFkZGVkIGZyYWdtZW50cy4KKyAgICBib29sZWFuIG1BZGRlZDsKKyAgICAKKyAgICAvLyBTZXQgdG8gdHJ1ZSBpZiB0aGlzIGZyYWdtZW50IHdhcyBpbnN0YW50aWF0ZWQgZnJvbSBhIGxheW91dCBmaWxlLgorICAgIGJvb2xlYW4gbUZyb21MYXlvdXQ7CisgICAgCisgICAgLy8gTnVtYmVyIG9mIGFjdGl2ZSBiYWNrIHN0YWNrIGVudHJpZXMgdGhpcyBmcmFnbWVudCBpcyBpbi4KKyAgICBpbnQgbUJhY2tTdGFja05lc3Rpbmc7CisgICAgCisgICAgLy8gU2V0IGFzIHNvb24gYXMgYSBmcmFnbWVudCBpcyBhZGRlZCB0byBhIHRyYW5zYWN0aW9uIChvciByZW1vdmVkKSwKKyAgICAvLyB0byBiZSBhYmxlIHRvIGRvIHZhbGlkYXRpb24uCisgICAgQWN0aXZpdHkgbUltbWVkaWF0ZUFjdGl2aXR5OworICAgIAorICAgIC8vIEFjdGl2aXR5IHRoaXMgZnJhZ21lbnQgaXMgYXR0YWNoZWQgdG8uCisgICAgQWN0aXZpdHkgbUFjdGl2aXR5OworICAgIAorICAgIC8vIFRoZSBvcHRpb25hbCBpZGVudGlmaWVyIGZvciB0aGlzIGZyYWdtZW50IC0tIGVpdGhlciB0aGUgY29udGFpbmVyIElEIGlmIGl0CisgICAgLy8gd2FzIGR5bmFtaWNhbGx5IGFkZGVkIHRvIHRoZSB2aWV3IGhpZXJhcmNoeSwgb3IgdGhlIElEIHN1cHBsaWVkIGluCisgICAgLy8gbGF5b3V0LgorICAgIGludCBtRnJhZ21lbnRJZDsKKyAgICAKKyAgICAvLyBXaGVuIGEgZnJhZ21lbnQgaXMgYmVpbmcgZHluYW1pY2FsbHkgYWRkZWQgdG8gdGhlIHZpZXcgaGllcmFyY2h5LCB0aGlzCisgICAgLy8gaXMgdGhlIGlkZW50aWZpZXIgb2YgdGhlIHBhcmVudCBjb250YWluZXIgaXQgaXMgYmVpbmcgYWRkZWQgdG8uCisgICAgaW50IG1Db250YWluZXJJZDsKKyAgICAKKyAgICAvLyBUaGUgb3B0aW9uYWwgbmFtZWQgdGFnIGZvciB0aGlzIGZyYWdtZW50IC0tIHVzdWFsbHkgdXNlZCB0byBmaW5kCisgICAgLy8gZnJhZ21lbnRzIHRoYXQgYXJlIG5vdCBwYXJ0IG9mIHRoZSBsYXlvdXQuCisgICAgU3RyaW5nIG1UYWc7CisgICAgCisgICAgLy8gU2V0IHRvIHRydWUgd2hlbiB0aGUgYXBwIGhhcyByZXF1ZXN0ZWQgdGhhdCB0aGlzIGZyYWdtZW50IGJlIGhpZGRlbgorICAgIC8vIGZyb20gdGhlIHVzZXIuCisgICAgYm9vbGVhbiBtSGlkZGVuOworICAgIAorICAgIC8vIElmIHNldCB0aGlzIGZyYWdtZW50IHdvdWxkIGxpa2UgaXRzIGluc3RhbmNlIHJldGFpbmVkIGFjcm9zcworICAgIC8vIGNvbmZpZ3VyYXRpb24gY2hhbmdlcy4KKyAgICBib29sZWFuIG1SZXRhaW5JbnN0YW5jZTsKKyAgICAKKyAgICAvLyBJZiBzZXQgdGhpcyBmcmFnbWVudCBpcyBiZWluZyByZXRhaW5lZCBhY3Jvc3MgdGhlIGN1cnJlbnQgY29uZmlnIGNoYW5nZS4KKyAgICBib29sZWFuIG1SZXRhaW5pbmc7CisgICAgCisgICAgLy8gSWYgc2V0IHRoaXMgZnJhZ21lbnQgaGFzIG1lbnUgaXRlbXMgdG8gY29udHJpYnV0ZS4KKyAgICBib29sZWFuIG1IYXNNZW51OworICAgIAorICAgIC8vIFVzZWQgdG8gdmVyaWZ5IHRoYXQgc3ViY2xhc3NlcyBjYWxsIHRocm91Z2ggdG8gc3VwZXIgY2xhc3MuCisgICAgYm9vbGVhbiBtQ2FsbGVkOworICAgIAorICAgIC8vIElmIGFwcCBoYXMgcmVxdWVzdGVkIGEgc3BlY2lmaWMgYW5pbWF0aW9uLCB0aGlzIGlzIHRoZSBvbmUgdG8gdXNlLgorICAgIGludCBtTmV4dEFuaW07CisgICAgCisgICAgLy8gVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhlIGZyYWdtZW50IGFmdGVyIGR5bmFtaWNhbGx5IGFkZGVkIHRvIFVJLgorICAgIFZpZXdHcm91cCBtQ29udGFpbmVyOworICAgIAorICAgIC8vIFRoZSBWaWV3IGdlbmVyYXRlZCBmb3IgdGhpcyBmcmFnbWVudC4KKyAgICBWaWV3IG1WaWV3OworICAgIAorICAgIHB1YmxpYyBGcmFnbWVudCgpIHsKKyAgICB9CisKKyAgICBzdGF0aWMgRnJhZ21lbnQgaW5zdGFudGlhdGUoQWN0aXZpdHkgYWN0aXZpdHksIFN0cmluZyBmbmFtZSkKKyAgICAgICAgICAgIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24sCisgICAgICAgICAgICBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24sIEluc3RhbnRpYXRpb25FeGNlcHRpb24sCisgICAgICAgICAgICBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uLCBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKKyAgICAgICAgQ2xhc3MgY2xhenogPSBzQ2xhc3NNYXAuZ2V0KGZuYW1lKTsKKworICAgICAgICBpZiAoY2xhenogPT0gbnVsbCkgeworICAgICAgICAgICAgLy8gQ2xhc3Mgbm90IGZvdW5kIGluIHRoZSBjYWNoZSwgc2VlIGlmIGl0J3MgcmVhbCwgYW5kIHRyeSB0byBhZGQgaXQKKyAgICAgICAgICAgIGNsYXp6ID0gYWN0aXZpdHkuZ2V0Q2xhc3NMb2FkZXIoKS5sb2FkQ2xhc3MoZm5hbWUpOworICAgICAgICAgICAgc0NsYXNzTWFwLnB1dChmbmFtZSwgY2xhenopOworICAgICAgICB9CisgICAgICAgIHJldHVybiAoRnJhZ21lbnQpY2xhenoubmV3SW5zdGFuY2UoKTsKKyAgICB9CisgICAgCisgICAgdm9pZCByZXN0b3JlVmlld1N0YXRlKCkgeworICAgICAgICBpZiAobVNhdmVkVmlld1N0YXRlICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1WaWV3LnJlc3RvcmVIaWVyYXJjaHlTdGF0ZShtU2F2ZWRWaWV3U3RhdGUpOworICAgICAgICAgICAgbVNhdmVkVmlld1N0YXRlID0gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICB2b2lkIHNldEluZGV4KGludCBpbmRleCkgeworICAgICAgICBtSW5kZXggPSBpbmRleDsKKyAgICAgICAgbVdobyA9ICJhbmRyb2lkOmZyYWdtZW50OiIgKyBtSW5kZXg7CisgICB9CisgICAgCisgICAgdm9pZCBjbGVhckluZGV4KCkgeworICAgICAgICBtSW5kZXggPSAtMTsKKyAgICAgICAgbVdobyA9IG51bGw7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFN1YmNsYXNzZXMgY2FuIG5vdCBvdmVycmlkZSBlcXVhbHMoKS4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUgZmluYWwgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7CisgICAgICAgIHJldHVybiBzdXBlci5lcXVhbHMobyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3ViY2xhc3NlcyBjYW4gbm90IG92ZXJyaWRlIGhhc2hDb2RlKCkuCisgICAgICovCisgICAgQE92ZXJyaWRlIGZpbmFsIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgIHJldHVybiBzdXBlci5oYXNoQ29kZSgpOworICAgIH0KKyAgICAKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoMTI4KTsKKyAgICAgICAgc2IuYXBwZW5kKCJGcmFnbWVudHsiKTsKKyAgICAgICAgc2IuYXBwZW5kKEludGVnZXIudG9IZXhTdHJpbmcoU3lzdGVtLmlkZW50aXR5SGFzaENvZGUodGhpcykpKTsKKyAgICAgICAgaWYgKG1JbmRleCA+PSAwKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoIiAjIik7CisgICAgICAgICAgICBzYi5hcHBlbmQobUluZGV4KTsKKyAgICAgICAgfQorICAgICAgICBpZiAobUZyYWdtZW50SWQgIT0gMCkgeworICAgICAgICAgICAgc2IuYXBwZW5kKCIgaWQ9MHgiKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZChJbnRlZ2VyLnRvSGV4U3RyaW5nKG1GcmFnbWVudElkKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1UYWcgIT0gbnVsbCkgeworICAgICAgICAgICAgc2IuYXBwZW5kKCIgIik7CisgICAgICAgICAgICBzYi5hcHBlbmQobVRhZyk7CisgICAgICAgIH0KKyAgICAgICAgc2IuYXBwZW5kKCd9Jyk7CisgICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGlkZW50aWZpZXIgdGhpcyBmcmFnbWVudCBpcyBrbm93biBieS4gIFRoaXMgaXMgZWl0aGVyCisgICAgICogdGhlIGFuZHJvaWQ6aWQgdmFsdWUgc3VwcGxpZWQgaW4gYSBsYXlvdXQgb3IgdGhlIGNvbnRhaW5lciB2aWV3IElECisgICAgICogc3VwcGxpZWQgd2hlbiBhZGRpbmcgdGhlIGZyYWdtZW50LgorICAgICAqLworICAgIGZpbmFsIHB1YmxpYyBpbnQgZ2V0SWQoKSB7CisgICAgICAgIHJldHVybiBtRnJhZ21lbnRJZDsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogR2V0IHRoZSB0YWcgbmFtZSBvZiB0aGUgZnJhZ21lbnQsIGlmIHNwZWNpZmllZC4KKyAgICAgKi8KKyAgICBmaW5hbCBwdWJsaWMgU3RyaW5nIGdldFRhZygpIHsKKyAgICAgICAgcmV0dXJuIG1UYWc7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgQWN0aXZpdHkgdGhpcyBmcmFnbWVudCBpcyBjdXJyZW50bHkgYXNzb2NpYXRlZCB3aXRoLgorICAgICAqLworICAgIGZpbmFsIHB1YmxpYyBBY3Rpdml0eSBnZXRBY3Rpdml0eSgpIHsKKyAgICAgICAgcmV0dXJuIG1BY3Rpdml0eTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIHRydWUgaWYgdGhlIGZyYWdtZW50IGlzIGN1cnJlbnRseSBhZGRlZCB0byBpdHMgYWN0aXZpdHkuCisgICAgICovCisgICAgZmluYWwgcHVibGljIGJvb2xlYW4gaXNBZGRlZCgpIHsKKyAgICAgICAgcmV0dXJuIG1BY3Rpdml0eSAhPSBudWxsICYmIG1BY3Rpdml0eS5tRnJhZ21lbnRzLm1BZGRlZC5jb250YWlucyh0aGlzKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIHRydWUgaWYgdGhlIGZyYWdtZW50IGlzIGN1cnJlbnRseSB2aXNpYmxlIHRvIHRoZSB1c2VyLiAgVGhpcyBtZWFucworICAgICAqIGl0OiAoMSkgaGFzIGJlZW4gYWRkZWQsICgyKSBoYXMgaXRzIHZpZXcgYXR0YWNoZWQgdG8gdGhlIHdpbmRvdywgYW5kIAorICAgICAqICgzKSBpcyBub3QgaGlkZGVuLgorICAgICAqLworICAgIGZpbmFsIHB1YmxpYyBib29sZWFuIGlzVmlzaWJsZSgpIHsKKyAgICAgICAgcmV0dXJuIGlzQWRkZWQoKSAmJiAhaXNIaWRkZW4oKSAmJiBtVmlldyAhPSBudWxsCisgICAgICAgICAgICAgICAgJiYgbVZpZXcuZ2V0V2luZG93VG9rZW4oKSAhPSBudWxsICYmIG1WaWV3LmdldFZpc2liaWxpdHkoKSA9PSBWaWV3LlZJU0lCTEU7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0cnVlIGlmIHRoZSBmcmFnbWVudCBoYXMgYmVlbiBoaWRkZW4uICBCeSBkZWZhdWx0IGZyYWdtZW50cworICAgICAqIGFyZSBzaG93bi4gIFlvdSBjYW4gZmluZCBvdXQgYWJvdXQgY2hhbmdlcyB0byB0aGlzIHN0YXRlIHdpdGgKKyAgICAgKiB7QGxpbmsgI29uSGlkZGVuQ2hhbmdlZH0uICBOb3RlIHRoYXQgdGhlIGhpZGRlbiBzdGF0ZSBpcyBvcnRob2dvbmFsCisgICAgICogdG8gb3RoZXIgc3RhdGVzIC0tIHRoYXQgaXMsIHRvIGJlIHZpc2libGUgdG8gdGhlIHVzZXIsIGEgZnJhZ21lbnQKKyAgICAgKiBtdXN0IGJlIGJvdGggc3RhcnRlZCBhbmQgbm90IGhpZGRlbi4KKyAgICAgKi8KKyAgICBmaW5hbCBwdWJsaWMgYm9vbGVhbiBpc0hpZGRlbigpIHsKKyAgICAgICAgcmV0dXJuIG1IaWRkZW47CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIENhbGxlZCB3aGVuIHRoZSBoaWRkZW4gc3RhdGUgKGFzIHJldHVybmVkIGJ5IHtAbGluayAjaXNIaWRkZW4oKX0gb2YKKyAgICAgKiB0aGUgZnJhZ21lbnQgaGFzIGNoYW5nZWQuICBGcmFnbWVudHMgc3RhcnQgb3V0IG5vdCBoaWRkZW47IHRoaXMgd2lsbAorICAgICAqIGJlIGNhbGxlZCB3aGVuZXZlciB0aGUgZnJhZ21lbnQgY2hhbmdlcyBzdGF0ZSBmcm9tIHRoYXQuCisgICAgICogQHBhcmFtIGhpZGRlbiBUcnVlIGlmIHRoZSBmcmFnbWVudCBpcyBub3cgaGlkZGVuLCBmYWxzZSBpZiBpdCBpcyBub3QKKyAgICAgKiB2aXNpYmxlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG9uSGlkZGVuQ2hhbmdlZChib29sZWFuIGhpZGRlbikgeworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBDb250cm9sIHdoZXRoZXIgYSBmcmFnbWVudCBpbnN0YW5jZSBpcyByZXRhaW5lZCBhY3Jvc3MgQWN0aXZpdHkKKyAgICAgKiByZS1jcmVhdGlvbiAoc3VjaCBhcyBmcm9tIGEgY29uZmlndXJhdGlvbiBjaGFuZ2UpLiAgVGhpcyBjYW4gb25seQorICAgICAqIGJlIHVzZWQgd2l0aCBmcmFnbWVudHMgbm90IGluIHRoZSBiYWNrIHN0YWNrLiAgSWYgc2V0LCB0aGUgZnJhZ21lbnQKKyAgICAgKiBsaWZlY3ljbGUgd2lsbCBiZSBzbGlnaHRseSBkaWZmZXJlbnQgd2hlbiBhbiBhY3Rpdml0eSBpcyByZWNyZWF0ZWQ6CisgICAgICogPHVsPgorICAgICAqIDxsaT4ge0BsaW5rICNvbkRlc3Ryb3koKX0gd2lsbCBub3QgYmUgY2FsbGVkIChidXQge0BsaW5rICNvbkRldGFjaCgpfSBzdGlsbAorICAgICAqIHdpbGwgYmUsIGJlY2F1c2UgdGhlIGZyYWdtZW50IGlzIGJlaW5nIGRldGFjaGVkIGZyb20gaXRzIGN1cnJlbnQgYWN0aXZpdHkpLgorICAgICAqIDxsaT4ge0BsaW5rICNvbkNyZWF0ZShCdW5kbGUpfSB3aWxsIG5vdCBiZSBjYWxsZWQgc2luY2UgdGhlIGZyYWdtZW50CisgICAgICogaXMgbm90IGJlaW5nIHJlLWNyZWF0ZWQuCisgICAgICogPGxpPiB7QGxpbmsgI29uQXR0YWNoKEFjdGl2aXR5KX0gYW5kIHtAbGluayAjb25SZWFkeShCdW5kbGUpfSA8Yj53aWxsPC9iPgorICAgICAqIHN0aWxsIGJlIGNhbGxlZC4KKyAgICAgKiA8L3VsPgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJldGFpbkluc3RhbmNlKGJvb2xlYW4gcmV0YWluKSB7CisgICAgICAgIG1SZXRhaW5JbnN0YW5jZSA9IHJldGFpbjsKKyAgICB9CisgICAgCisgICAgZmluYWwgcHVibGljIGJvb2xlYW4gZ2V0UmV0YWluSW5zdGFuY2UoKSB7CisgICAgICAgIHJldHVybiBtUmV0YWluSW5zdGFuY2U7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJlcG9ydCB0aGF0IHRoaXMgZnJhZ21lbnQgd291bGQgbGlrZSB0byBwYXJ0aWNpcGF0ZSBpbiBwb3B1bGF0aW5nCisgICAgICogdGhlIG9wdGlvbnMgbWVudSBieSByZWNlaXZpbmcgYSBjYWxsIHRvIHtAbGluayAjb25DcmVhdGVPcHRpb25zTWVudX0KKyAgICAgKiBhbmQgcmVsYXRlZCBtZXRob2RzLgorICAgICAqIAorICAgICAqIEBwYXJhbSBoYXNNZW51IElmIHRydWUsIHRoZSBmcmFnbWVudCBoYXMgbWVudSBpdGVtcyB0byBjb250cmlidXRlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEhhc09wdGlvbnNNZW51KGJvb2xlYW4gaGFzTWVudSkgeworICAgICAgICBpZiAobUhhc01lbnUgIT0gaGFzTWVudSkgeworICAgICAgICAgICAgbUhhc01lbnUgPSBoYXNNZW51OworICAgICAgICAgICAgaWYgKGlzQWRkZWQoKSAmJiAhaXNIaWRkZW4oKSkgeworICAgICAgICAgICAgICAgIG1BY3Rpdml0eS5pbnZhbGlkYXRlT3B0aW9uc01lbnUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBDYWxsIHtAbGluayBBY3Rpdml0eSNzdGFydEFjdGl2aXR5KEludGVudCl9IG9uIHRoZSBmcmFnbWVudCdzCisgICAgICogY29udGFpbmluZyBBY3Rpdml0eS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdGFydEFjdGl2aXR5KEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgbUFjdGl2aXR5LnN0YXJ0QWN0aXZpdHlGcm9tRnJhZ21lbnQodGhpcywgaW50ZW50LCAtMSk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIENhbGwge0BsaW5rIEFjdGl2aXR5I3N0YXJ0QWN0aXZpdHlGb3JSZXN1bHQoSW50ZW50LCBpbnQpfSBvbiB0aGUgZnJhZ21lbnQncworICAgICAqIGNvbnRhaW5pbmcgQWN0aXZpdHkuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RhcnRBY3Rpdml0eUZvclJlc3VsdChJbnRlbnQgaW50ZW50LCBpbnQgcmVxdWVzdENvZGUpIHsKKyAgICAgICAgbUFjdGl2aXR5LnN0YXJ0QWN0aXZpdHlGcm9tRnJhZ21lbnQodGhpcywgaW50ZW50LCByZXF1ZXN0Q29kZSk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJlY2VpdmUgdGhlIHJlc3VsdCBmcm9tIGEgcHJldmlvdXMgY2FsbCB0bworICAgICAqIHtAbGluayAjc3RhcnRBY3Rpdml0eUZvclJlc3VsdChJbnRlbnQsIGludCl9LiAgVGhpcyBmb2xsb3dzIHRoZQorICAgICAqIHJlbGF0ZWQgQWN0aXZpdHkgQVBJIGFzIGRlc2NyaWJlZCB0aGVyZSBpbgorICAgICAqIHtAbGluayBBY3Rpdml0eSNvbkFjdGl2aXR5UmVzdWx0KGludCwgaW50LCBJbnRlbnQpfS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcmVxdWVzdENvZGUgVGhlIGludGVnZXIgcmVxdWVzdCBjb2RlIG9yaWdpbmFsbHkgc3VwcGxpZWQgdG8KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgc3RhcnRBY3Rpdml0eUZvclJlc3VsdCgpLCBhbGxvd2luZyB5b3UgdG8gaWRlbnRpZnkgd2hvIHRoaXMKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgcmVzdWx0IGNhbWUgZnJvbS4KKyAgICAgKiBAcGFyYW0gcmVzdWx0Q29kZSBUaGUgaW50ZWdlciByZXN1bHQgY29kZSByZXR1cm5lZCBieSB0aGUgY2hpbGQgYWN0aXZpdHkKKyAgICAgKiAgICAgICAgICAgICAgICAgICB0aHJvdWdoIGl0cyBzZXRSZXN1bHQoKS4KKyAgICAgKiBAcGFyYW0gZGF0YSBBbiBJbnRlbnQsIHdoaWNoIGNhbiByZXR1cm4gcmVzdWx0IGRhdGEgdG8gdGhlIGNhbGxlcgorICAgICAqICAgICAgICAgICAgICAgKHZhcmlvdXMgZGF0YSBjYW4gYmUgYXR0YWNoZWQgdG8gSW50ZW50ICJleHRyYXMiKS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBvbkFjdGl2aXR5UmVzdWx0KGludCByZXF1ZXN0Q29kZSwgaW50IHJlc3VsdENvZGUsIEludGVudCBkYXRhKSB7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIENhbGxlZCB3aGVuIGEgZnJhZ21lbnQgaXMgYmVpbmcgY3JlYXRlZCBhcyBwYXJ0IG9mIGEgdmlldyBsYXlvdXQKKyAgICAgKiBpbmZsYXRpb24sIHR5cGljYWxseSBmcm9tIHNldHRpbmcgdGhlIGNvbnRlbnQgdmlldyBvZiBhbiBhY3Rpdml0eS4gIFRoaXMKKyAgICAgKiB3aWxsIGJlIGNhbGxlZCBib3RoIHRoZSBmaXJzdCB0aW1lIHRoZSBmcmFnbWVudCBpcyBjcmVhdGVkLCBhcyB3ZWxsCisgICAgICogbGF0ZXIgd2hlbiBpdCBpcyBiZWluZyByZS1jcmVhdGVkIGZyb20gaXRzIHNhdmVkIHN0YXRlICh3aGljaCBpcyBhbHNvCisgICAgICogZ2l2ZW4gaGVyZSkuCisgICAgICogCisgICAgICogWFhYIFRoaXMgaXMga2luZC1vZiB5dWNreS4uLiAgbWF5YmUgd2UgY291bGQganVzdCBzdXBwbHkgdGhlCisgICAgICogQXR0cmlidXRlU2V0IHRvIG9uQ3JlYXRlKCk/CisgICAgICogCisgICAgICogQHBhcmFtIGFjdGl2aXR5IFRoZSBBY3Rpdml0eSB0aGF0IGlzIGluZmxhdGluZyB0aGUgZnJhZ21lbnQuCisgICAgICogQHBhcmFtIGF0dHJzIFRoZSBhdHRyaWJ1dGVzIGF0IHRoZSB0YWcgd2hlcmUgdGhlIGZyYWdtZW50IGlzCisgICAgICogYmVpbmcgY3JlYXRlZC4KKyAgICAgKiBAcGFyYW0gc2F2ZWRJbnN0YW5jZVN0YXRlIElmIHRoZSBmcmFnbWVudCBpcyBiZWluZyByZS1jcmVhdGVkIGZyb20KKyAgICAgKiBhIHByZXZpb3VzIHNhdmVkIHN0YXRlLCB0aGlzIGlzIHRoZSBzdGF0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBvbkluZmxhdGUoQWN0aXZpdHkgYWN0aXZpdHksIEF0dHJpYnV0ZVNldCBhdHRycywKKyAgICAgICAgICAgIEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgbUNhbGxlZCA9IHRydWU7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIENhbGxlZCB3aGVuIGEgZnJhZ21lbnQgaXMgZmlyc3QgYXR0YWNoZWQgdG8gaXRzIGFjdGl2aXR5LgorICAgICAqIHtAbGluayAjb25DcmVhdGUoQnVuZGxlKX0gd2lsbCBiZSBjYWxsZWQgYWZ0ZXIgdGhpcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBvbkF0dGFjaChBY3Rpdml0eSBhY3Rpdml0eSkgeworICAgICAgICBtQ2FsbGVkID0gdHJ1ZTsKKyAgICB9CisgICAgCisgICAgcHVibGljIEFuaW1hdGlvbiBvbkNyZWF0ZUFuaW1hdGlvbihpbnQgdHJhbnNpdCwgYm9vbGVhbiBlbnRlciwgaW50IG5leHRBbmltKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgdG8gZG8gaW5pdGlhbCBjcmVhdGlvbiBvZiBhIGZyYWdtZW50LiAgVGhpcyBpcyBjYWxsZWQgYWZ0ZXIKKyAgICAgKiB7QGxpbmsgI29uQXR0YWNoKEFjdGl2aXR5KX0gYW5kIGJlZm9yZSB7QGxpbmsgI29uUmVhZHkoQnVuZGxlKX0uCisgICAgICogQHBhcmFtIHNhdmVkSW5zdGFuY2VTdGF0ZSBJZiB0aGUgZnJhZ21lbnQgaXMgYmVpbmcgcmUtY3JlYXRlZCBmcm9tCisgICAgICogYSBwcmV2aW91cyBzYXZlZCBzdGF0ZSwgdGhpcyBpcyB0aGUgc3RhdGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBtQ2FsbGVkID0gdHJ1ZTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQ2FsbGVkIHRvIGhhdmUgdGhlIGZyYWdtZW50IGluc3RhbnRpYXRlIGl0cyB1c2VyIGludGVyZmFjZSB2aWV3LgorICAgICAqIFRoaXMgaXMgb3B0aW9uYWwsIGFuZCBub24tZ3JhcGhpY2FsIGZyYWdtZW50cyBjYW4gcmV0dXJuIG51bGwgKHdoaWNoCisgICAgICogaXMgdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24pLiAgVGhpcyB3aWxsIGJlIGNhbGxlZCBiZXR3ZWVuCisgICAgICoge0BsaW5rICNvbkNyZWF0ZShCdW5kbGUpfSBhbmQge0BsaW5rICNvblJlYWR5KEJ1bmRsZSl9LgorICAgICAqIAorICAgICAqIDxwPklmIHlvdSByZXR1cm4gYSBWaWV3IGZyb20gaGVyZSwgeW91IHdpbGwgbGF0ZXIgYmUgY2FsbGVkIGluCisgICAgICoge0BsaW5rICNvbkRlc3Ryb3lWaWV3fSB3aGVuIHRoZSB2aWV3IGlzIGJlaW5nIHJlbGVhc2VkLgorICAgICAqIAorICAgICAqIEBwYXJhbSBpbmZsYXRlciBUaGUgTGF5b3V0SW5mbGF0ZXIgb2JqZWN0IHRoYXQgY2FuIGJlIHVzZWQgdG8gaW5mbGF0ZQorICAgICAqIGFueSB2aWV3cyBpbiB0aGUgZnJhZ21lbnQsCisgICAgICogQHBhcmFtIGNvbnRhaW5lciBJZiBub24tbnVsbCwgdGhpcyBpcyB0aGUgcGFyZW50IHZpZXcgdGhhdCB0aGUgZnJhZ21lbnQncworICAgICAqIFVJIHNob3VsZCBiZSBhdHRhY2hlZCB0by4gIFRoZSBmcmFnbWVudCBzaG91bGQgbm90IGFkZCB0aGUgdmlldyBpdHNlbGYsCisgICAgICogYnV0IHRoaXMgY2FuIGJlIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIExheW91dFBhcmFtcyBvZiB0aGUgdmlldy4KKyAgICAgKiBAcGFyYW0gc2F2ZWRJbnN0YW5jZVN0YXRlIElmIG5vbi1udWxsLCB0aGlzIGZyYWdtZW50IGlzIGJlaW5nIHJlLWNvbnN0cnVjdGVkCisgICAgICogZnJvbSBhIHByZXZpb3VzIHNhdmVkIHN0YXRlIGFzIGdpdmVuIGhlcmUuCisgICAgICogCisgICAgICogQHJldHVybiBSZXR1cm4gdGhlIFZpZXcgZm9yIHRoZSBmcmFnbWVudCdzIFVJLCBvciBudWxsLgorICAgICAqLworICAgIHB1YmxpYyBWaWV3IG9uQ3JlYXRlVmlldyhMYXlvdXRJbmZsYXRlciBpbmZsYXRlciwgVmlld0dyb3VwIGNvbnRhaW5lciwKKyAgICAgICAgICAgIEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBWaWV3IGdldFZpZXcoKSB7CisgICAgICAgIHJldHVybiBtVmlldzsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQ2FsbGVkIHdoZW4gdGhlIGFjdGl2aXR5IGlzIHJlYWR5IGZvciB0aGUgZnJhZ21lbnQgdG8gcnVuLiAgVGhpcyBpcworICAgICAqIG1vc3QgdXNlZnVsIGZvciBmcmFnbWVudHMgdGhhdCB1c2Uge0BsaW5rICNzZXRSZXRhaW5JbnN0YW5jZShib29sZWFuKX0KKyAgICAgKiBpbnN0YW5jZSwgYXMgdGhpcyB0ZWxscyB0aGUgZnJhZ21lbnQgd2hlbiBpdCBpcyBmdWxseSBhc3NvY2lhdGVkIHdpdGgKKyAgICAgKiB0aGUgbmV3IGFjdGl2aXR5IGluc3RhbmNlLiAgVGhpcyBpcyBjYWxsZWQgYWZ0ZXIge0BsaW5rICNvbkNyZWF0ZVZpZXd9CisgICAgICogYW5kIGJlZm9yZSB7QGxpbmsgI29uU3RhcnQoKX0uCisgICAgICogCisgICAgICogQHBhcmFtIHNhdmVkSW5zdGFuY2VTdGF0ZSBJZiB0aGUgZnJhZ21lbnQgaXMgYmVpbmcgcmUtY3JlYXRlZCBmcm9tCisgICAgICogYSBwcmV2aW91cyBzYXZlZCBzdGF0ZSwgdGhpcyBpcyB0aGUgc3RhdGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgb25SZWFkeShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIG1DYWxsZWQgPSB0cnVlOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgd2hlbiB0aGUgRnJhZ21lbnQgaXMgdmlzaWJsZSB0byB0aGUgdXNlci4gIFRoaXMgaXMgZ2VuZXJhbGx5CisgICAgICogdGllZCB0byB7QGxpbmsgQWN0aXZpdHkjb25TdGFydCgpIEFjdGl2aXR5Lm9uU3RhcnR9IG9mIHRoZSBjb250YWluaW5nCisgICAgICogQWN0aXZpdHkncyBsaWZlY3ljbGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgb25TdGFydCgpIHsKKyAgICAgICAgbUNhbGxlZCA9IHRydWU7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIENhbGxlZCB3aGVuIHRoZSBmcmFnbWVudCBpcyB2aXNpYmxlIHRvIHRoZSB1c2VyIGFuZCBhY3RpdmVseSBydW5uaW5nLgorICAgICAqIFRoaXMgaXMgZ2VuZXJhbGx5CisgICAgICogdGllZCB0byB7QGxpbmsgQWN0aXZpdHkjb25SZXN1bWUoKSBBY3Rpdml0eS5vblJlc3VtZX0gb2YgdGhlIGNvbnRhaW5pbmcKKyAgICAgKiBBY3Rpdml0eSdzIGxpZmVjeWNsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBvblJlc3VtZSgpIHsKKyAgICAgICAgbUNhbGxlZCA9IHRydWU7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIG9uU2F2ZUluc3RhbmNlU3RhdGUoQnVuZGxlIG91dFN0YXRlKSB7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIG9uQ29uZmlndXJhdGlvbkNoYW5nZWQoQ29uZmlndXJhdGlvbiBuZXdDb25maWcpIHsKKyAgICAgICAgbUNhbGxlZCA9IHRydWU7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIENhbGxlZCB3aGVuIHRoZSBGcmFnbWVudCBpcyBubyBsb25nZXIgcmVzdW1lZC4gIFRoaXMgaXMgZ2VuZXJhbGx5CisgICAgICogdGllZCB0byB7QGxpbmsgQWN0aXZpdHkjb25QYXVzZSgpIEFjdGl2aXR5Lm9uUGF1c2V9IG9mIHRoZSBjb250YWluaW5nCisgICAgICogQWN0aXZpdHkncyBsaWZlY3ljbGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgb25QYXVzZSgpIHsKKyAgICAgICAgbUNhbGxlZCA9IHRydWU7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIENhbGxlZCB3aGVuIHRoZSBGcmFnbWVudCBpcyBubyBsb25nZXIgc3RhcnRlZC4gIFRoaXMgaXMgZ2VuZXJhbGx5CisgICAgICogdGllZCB0byB7QGxpbmsgQWN0aXZpdHkjb25TdG9wKCkgQWN0aXZpdHkub25TdG9wfSBvZiB0aGUgY29udGFpbmluZworICAgICAqIEFjdGl2aXR5J3MgbGlmZWN5Y2xlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG9uU3RvcCgpIHsKKyAgICAgICAgbUNhbGxlZCA9IHRydWU7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIG9uTG93TWVtb3J5KCkgeworICAgICAgICBtQ2FsbGVkID0gdHJ1ZTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQ2FsbGVkIHdoZW4gdGhlIHZpZXcgcHJldmlvdXNseSBjcmVhdGVkIGJ5IHtAbGluayAjb25DcmVhdGVWaWV3fSBoYXMKKyAgICAgKiBiZWVuIGRldGFjaGVkIGZyb20gdGhlIGZyYWdtZW50LiAgVGhlIG5leHQgdGltZSB0aGUgZnJhZ21lbnQgbmVlZHMKKyAgICAgKiB0byBiZSBkaXNwbGF5ZWQsIGEgbmV3IHZpZXcgd2lsbCBiZSBjcmVhdGVkLiAgVGhpcyBpcyBjYWxsZWQKKyAgICAgKiBhZnRlciB7QGxpbmsgI29uU3RvcCgpfSBhbmQgYmVmb3JlIHtAbGluayAjb25EZXN0cm95KCl9OyBpdCBpcyBvbmx5CisgICAgICogY2FsbGVkIGlmIHtAbGluayAjb25DcmVhdGVWaWV3fSByZXR1cm5zIGEgbm9uLW51bGwgVmlldy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBvbkRlc3Ryb3lWaWV3KCkgeworICAgICAgICBtQ2FsbGVkID0gdHJ1ZTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQ2FsbGVkIHdoZW4gdGhlIGZyYWdtZW50IGlzIG5vIGxvbmdlciBpbiB1c2UuICBUaGlzIGlzIGNhbGxlZAorICAgICAqIGFmdGVyIHtAbGluayAjb25TdG9wKCl9IGFuZCBiZWZvcmUge0BsaW5rICNvbkRldGFjaCgpfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBvbkRlc3Ryb3koKSB7CisgICAgICAgIG1DYWxsZWQgPSB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxlZCB3aGVuIHRoZSBmcmFnbWVudCBpcyBubyBsb25nZXIgYXR0YWNoZWQgdG8gaXRzIGFjdGl2aXR5LiAgVGhpcworICAgICAqIGlzIGNhbGxlZCBhZnRlciB7QGxpbmsgI29uRGVzdHJveSgpfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBvbkRldGFjaCgpIHsKKyAgICAgICAgbUNhbGxlZCA9IHRydWU7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEluaXRpYWxpemUgdGhlIGNvbnRlbnRzIG9mIHRoZSBBY3Rpdml0eSdzIHN0YW5kYXJkIG9wdGlvbnMgbWVudS4gIFlvdQorICAgICAqIHNob3VsZCBwbGFjZSB5b3VyIG1lbnUgaXRlbXMgaW4gdG8gPHZhcj5tZW51PC92YXI+LiAgRm9yIHRoaXMgbWV0aG9kCisgICAgICogdG8gYmUgY2FsbGVkLCB5b3UgbXVzdCBoYXZlIGZpcnN0IGNhbGxlZCB7QGxpbmsgI3NldEhhc09wdGlvbnNNZW51fS4gIFNlZQorICAgICAqIHtAbGluayBBY3Rpdml0eSNvbkNyZWF0ZU9wdGlvbnNNZW51KE1lbnUpIEFjdGl2aXR5Lm9uQ3JlYXRlT3B0aW9uc01lbnV9CisgICAgICogZm9yIG1vcmUgaW5mb3JtYXRpb24uCisgICAgICogCisgICAgICogQHBhcmFtIG1lbnUgVGhlIG9wdGlvbnMgbWVudSBpbiB3aGljaCB5b3UgcGxhY2UgeW91ciBpdGVtcy4KKyAgICAgKiAKKyAgICAgKiBAc2VlICNzZXRIYXNPcHRpb25zTWVudQorICAgICAqIEBzZWUgI29uUHJlcGFyZU9wdGlvbnNNZW51CisgICAgICogQHNlZSAjb25PcHRpb25zSXRlbVNlbGVjdGVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgb25DcmVhdGVPcHRpb25zTWVudShNZW51IG1lbnUsIE1lbnVJbmZsYXRlciBpbmZsYXRlcikgeworICAgIH0KKworICAgIC8qKgorICAgICAqIFByZXBhcmUgdGhlIFNjcmVlbidzIHN0YW5kYXJkIG9wdGlvbnMgbWVudSB0byBiZSBkaXNwbGF5ZWQuICBUaGlzIGlzCisgICAgICogY2FsbGVkIHJpZ2h0IGJlZm9yZSB0aGUgbWVudSBpcyBzaG93biwgZXZlcnkgdGltZSBpdCBpcyBzaG93bi4gIFlvdSBjYW4KKyAgICAgKiB1c2UgdGhpcyBtZXRob2QgdG8gZWZmaWNpZW50bHkgZW5hYmxlL2Rpc2FibGUgaXRlbXMgb3Igb3RoZXJ3aXNlCisgICAgICogZHluYW1pY2FsbHkgbW9kaWZ5IHRoZSBjb250ZW50cy4gIFNlZQorICAgICAqIHtAbGluayBBY3Rpdml0eSNvblByZXBhcmVPcHRpb25zTWVudShNZW51KSBBY3Rpdml0eS5vblByZXBhcmVPcHRpb25zTWVudX0KKyAgICAgKiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbWVudSBUaGUgb3B0aW9ucyBtZW51IGFzIGxhc3Qgc2hvd24gb3IgZmlyc3QgaW5pdGlhbGl6ZWQgYnkKKyAgICAgKiAgICAgICAgICAgICBvbkNyZWF0ZU9wdGlvbnNNZW51KCkuCisgICAgICogCisgICAgICogQHNlZSAjc2V0SGFzT3B0aW9uc01lbnUKKyAgICAgKiBAc2VlICNvbkNyZWF0ZU9wdGlvbnNNZW51CisgICAgICovCisgICAgcHVibGljIHZvaWQgb25QcmVwYXJlT3B0aW9uc01lbnUoTWVudSBtZW51KSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBob29rIGlzIGNhbGxlZCB3aGVuZXZlciBhbiBpdGVtIGluIHlvdXIgb3B0aW9ucyBtZW51IGlzIHNlbGVjdGVkLgorICAgICAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHNpbXBseSByZXR1cm5zIGZhbHNlIHRvIGhhdmUgdGhlIG5vcm1hbAorICAgICAqIHByb2Nlc3NpbmcgaGFwcGVuIChjYWxsaW5nIHRoZSBpdGVtJ3MgUnVubmFibGUgb3Igc2VuZGluZyBhIG1lc3NhZ2UgdG8KKyAgICAgKiBpdHMgSGFuZGxlciBhcyBhcHByb3ByaWF0ZSkuICBZb3UgY2FuIHVzZSB0aGlzIG1ldGhvZCBmb3IgYW55IGl0ZW1zCisgICAgICogZm9yIHdoaWNoIHlvdSB3b3VsZCBsaWtlIHRvIGRvIHByb2Nlc3Npbmcgd2l0aG91dCB0aG9zZSBvdGhlcgorICAgICAqIGZhY2lsaXRpZXMuCisgICAgICogCisgICAgICogPHA+RGVyaXZlZCBjbGFzc2VzIHNob3VsZCBjYWxsIHRocm91Z2ggdG8gdGhlIGJhc2UgY2xhc3MgZm9yIGl0IHRvCisgICAgICogcGVyZm9ybSB0aGUgZGVmYXVsdCBtZW51IGhhbmRsaW5nLgorICAgICAqIAorICAgICAqIEBwYXJhbSBpdGVtIFRoZSBtZW51IGl0ZW0gdGhhdCB3YXMgc2VsZWN0ZWQuCisgICAgICogCisgICAgICogQHJldHVybiBib29sZWFuIFJldHVybiBmYWxzZSB0byBhbGxvdyBub3JtYWwgbWVudSBwcm9jZXNzaW5nIHRvCisgICAgICogICAgICAgICBwcm9jZWVkLCB0cnVlIHRvIGNvbnN1bWUgaXQgaGVyZS4KKyAgICAgKiAKKyAgICAgKiBAc2VlICNvbkNyZWF0ZU9wdGlvbnNNZW51CisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gb25PcHRpb25zSXRlbVNlbGVjdGVkKE1lbnVJdGVtIGl0ZW0pIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgaG9vayBpcyBjYWxsZWQgd2hlbmV2ZXIgdGhlIG9wdGlvbnMgbWVudSBpcyBiZWluZyBjbG9zZWQgKGVpdGhlciBieSB0aGUgdXNlciBjYW5jZWxpbmcKKyAgICAgKiB0aGUgbWVudSB3aXRoIHRoZSBiYWNrL21lbnUgYnV0dG9uLCBvciB3aGVuIGFuIGl0ZW0gaXMgc2VsZWN0ZWQpLgorICAgICAqICAKKyAgICAgKiBAcGFyYW0gbWVudSBUaGUgb3B0aW9ucyBtZW51IGFzIGxhc3Qgc2hvd24gb3IgZmlyc3QgaW5pdGlhbGl6ZWQgYnkKKyAgICAgKiAgICAgICAgICAgICBvbkNyZWF0ZU9wdGlvbnNNZW51KCkuCisgICAgICovCisgICAgcHVibGljIHZvaWQgb25PcHRpb25zTWVudUNsb3NlZChNZW51IG1lbnUpIHsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQ2FsbGVkIHdoZW4gYSBjb250ZXh0IG1lbnUgZm9yIHRoZSB7QGNvZGUgdmlld30gaXMgYWJvdXQgdG8gYmUgc2hvd24uCisgICAgICogVW5saWtlIHtAbGluayAjb25DcmVhdGVPcHRpb25zTWVudX0sIHRoaXMgd2lsbCBiZSBjYWxsZWQgZXZlcnkKKyAgICAgKiB0aW1lIHRoZSBjb250ZXh0IG1lbnUgaXMgYWJvdXQgdG8gYmUgc2hvd24gYW5kIHNob3VsZCBiZSBwb3B1bGF0ZWQgZm9yCisgICAgICogdGhlIHZpZXcgKG9yIGl0ZW0gaW5zaWRlIHRoZSB2aWV3IGZvciB7QGxpbmsgQWRhcHRlclZpZXd9IHN1YmNsYXNzZXMsCisgICAgICogdGhpcyBjYW4gYmUgZm91bmQgaW4gdGhlIHtAY29kZSBtZW51SW5mb30pKS4KKyAgICAgKiA8cD4KKyAgICAgKiBVc2Uge0BsaW5rICNvbkNvbnRleHRJdGVtU2VsZWN0ZWQoYW5kcm9pZC52aWV3Lk1lbnVJdGVtKX0gdG8ga25vdyB3aGVuIGFuCisgICAgICogaXRlbSBoYXMgYmVlbiBzZWxlY3RlZC4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBjYWxscyB1cCB0bworICAgICAqIHtAbGluayBBY3Rpdml0eSNvbkNyZWF0ZUNvbnRleHRNZW51IEFjdGl2aXR5Lm9uQ3JlYXRlQ29udGV4dE1lbnV9LCB0aG91Z2gKKyAgICAgKiB5b3UgY2FuIG5vdCBjYWxsIHRoaXMgaW1wbGVtZW50YXRpb24gaWYgeW91IGRvbid0IHdhbnQgdGhhdCBiZWhhdmlvci4KKyAgICAgKiA8cD4KKyAgICAgKiBJdCBpcyBub3Qgc2FmZSB0byBob2xkIG9udG8gdGhlIGNvbnRleHQgbWVudSBhZnRlciB0aGlzIG1ldGhvZCByZXR1cm5zLgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZUNvbnRleHRNZW51KENvbnRleHRNZW51IG1lbnUsIFZpZXcgdiwgQ29udGV4dE1lbnVJbmZvIG1lbnVJbmZvKSB7CisgICAgICAgIGdldEFjdGl2aXR5KCkub25DcmVhdGVDb250ZXh0TWVudShtZW51LCB2LCBtZW51SW5mbyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVnaXN0ZXJzIGEgY29udGV4dCBtZW51IHRvIGJlIHNob3duIGZvciB0aGUgZ2l2ZW4gdmlldyAobXVsdGlwbGUgdmlld3MKKyAgICAgKiBjYW4gc2hvdyB0aGUgY29udGV4dCBtZW51KS4gVGhpcyBtZXRob2Qgd2lsbCBzZXQgdGhlCisgICAgICoge0BsaW5rIE9uQ3JlYXRlQ29udGV4dE1lbnVMaXN0ZW5lcn0gb24gdGhlIHZpZXcgdG8gdGhpcyBmcmFnbWVudCwgc28KKyAgICAgKiB7QGxpbmsgI29uQ3JlYXRlQ29udGV4dE1lbnUoQ29udGV4dE1lbnUsIFZpZXcsIENvbnRleHRNZW51SW5mbyl9IHdpbGwgYmUKKyAgICAgKiBjYWxsZWQgd2hlbiBpdCBpcyB0aW1lIHRvIHNob3cgdGhlIGNvbnRleHQgbWVudS4KKyAgICAgKiAKKyAgICAgKiBAc2VlICN1bnJlZ2lzdGVyRm9yQ29udGV4dE1lbnUoVmlldykKKyAgICAgKiBAcGFyYW0gdmlldyBUaGUgdmlldyB0aGF0IHNob3VsZCBzaG93IGEgY29udGV4dCBtZW51LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyRm9yQ29udGV4dE1lbnUoVmlldyB2aWV3KSB7CisgICAgICAgIHZpZXcuc2V0T25DcmVhdGVDb250ZXh0TWVudUxpc3RlbmVyKHRoaXMpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBQcmV2ZW50cyBhIGNvbnRleHQgbWVudSB0byBiZSBzaG93biBmb3IgdGhlIGdpdmVuIHZpZXcuIFRoaXMgbWV0aG9kIHdpbGwKKyAgICAgKiByZW1vdmUgdGhlIHtAbGluayBPbkNyZWF0ZUNvbnRleHRNZW51TGlzdGVuZXJ9IG9uIHRoZSB2aWV3LgorICAgICAqIAorICAgICAqIEBzZWUgI3JlZ2lzdGVyRm9yQ29udGV4dE1lbnUoVmlldykKKyAgICAgKiBAcGFyYW0gdmlldyBUaGUgdmlldyB0aGF0IHNob3VsZCBzdG9wIHNob3dpbmcgYSBjb250ZXh0IG1lbnUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdW5yZWdpc3RlckZvckNvbnRleHRNZW51KFZpZXcgdmlldykgeworICAgICAgICB2aWV3LnNldE9uQ3JlYXRlQ29udGV4dE1lbnVMaXN0ZW5lcihudWxsKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogVGhpcyBob29rIGlzIGNhbGxlZCB3aGVuZXZlciBhbiBpdGVtIGluIGEgY29udGV4dCBtZW51IGlzIHNlbGVjdGVkLiBUaGUKKyAgICAgKiBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHNpbXBseSByZXR1cm5zIGZhbHNlIHRvIGhhdmUgdGhlIG5vcm1hbCBwcm9jZXNzaW5nCisgICAgICogaGFwcGVuIChjYWxsaW5nIHRoZSBpdGVtJ3MgUnVubmFibGUgb3Igc2VuZGluZyBhIG1lc3NhZ2UgdG8gaXRzIEhhbmRsZXIKKyAgICAgKiBhcyBhcHByb3ByaWF0ZSkuIFlvdSBjYW4gdXNlIHRoaXMgbWV0aG9kIGZvciBhbnkgaXRlbXMgZm9yIHdoaWNoIHlvdQorICAgICAqIHdvdWxkIGxpa2UgdG8gZG8gcHJvY2Vzc2luZyB3aXRob3V0IHRob3NlIG90aGVyIGZhY2lsaXRpZXMuCisgICAgICogPHA+CisgICAgICogVXNlIHtAbGluayBNZW51SXRlbSNnZXRNZW51SW5mbygpfSB0byBnZXQgZXh0cmEgaW5mb3JtYXRpb24gc2V0IGJ5IHRoZQorICAgICAqIFZpZXcgdGhhdCBhZGRlZCB0aGlzIG1lbnUgaXRlbS4KKyAgICAgKiA8cD4KKyAgICAgKiBEZXJpdmVkIGNsYXNzZXMgc2hvdWxkIGNhbGwgdGhyb3VnaCB0byB0aGUgYmFzZSBjbGFzcyBmb3IgaXQgdG8gcGVyZm9ybQorICAgICAqIHRoZSBkZWZhdWx0IG1lbnUgaGFuZGxpbmcuCisgICAgICogCisgICAgICogQHBhcmFtIGl0ZW0gVGhlIGNvbnRleHQgbWVudSBpdGVtIHRoYXQgd2FzIHNlbGVjdGVkLgorICAgICAqIEByZXR1cm4gYm9vbGVhbiBSZXR1cm4gZmFsc2UgdG8gYWxsb3cgbm9ybWFsIGNvbnRleHQgbWVudSBwcm9jZXNzaW5nIHRvCisgICAgICogICAgICAgICBwcm9jZWVkLCB0cnVlIHRvIGNvbnN1bWUgaXQgaGVyZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBvbkNvbnRleHRJdGVtU2VsZWN0ZWQoTWVudUl0ZW0gaXRlbSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0ZyYWdtZW50TWFuYWdlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0ZyYWdtZW50TWFuYWdlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwYWIwYjUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvRnJhZ21lbnRNYW5hZ2VyLmphdmEKQEAgLTAsMCArMSw5MzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuYXBwOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5UeXBlZEFycmF5OworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbDsKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbGFibGU7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuU3BhcnNlQXJyYXk7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnU7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnVJbmZsYXRlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudUl0ZW07CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkFuaW1hdGlvbjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkFuaW1hdGlvblV0aWxzOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKKworZmluYWwgY2xhc3MgRnJhZ21lbnRNYW5hZ2VyU3RhdGUgaW1wbGVtZW50cyBQYXJjZWxhYmxlIHsKKyAgICBGcmFnbWVudFN0YXRlW10gbUFjdGl2ZTsKKyAgICBpbnRbXSBtQWRkZWQ7CisgICAgQmFja1N0YWNrU3RhdGVbXSBtQmFja1N0YWNrOworICAgIAorICAgIHB1YmxpYyBGcmFnbWVudE1hbmFnZXJTdGF0ZSgpIHsKKyAgICB9CisgICAgCisgICAgcHVibGljIEZyYWdtZW50TWFuYWdlclN0YXRlKFBhcmNlbCBpbikgeworICAgICAgICBtQWN0aXZlID0gaW4uY3JlYXRlVHlwZWRBcnJheShGcmFnbWVudFN0YXRlLkNSRUFUT1IpOworICAgICAgICBtQWRkZWQgPSBpbi5jcmVhdGVJbnRBcnJheSgpOworICAgICAgICBtQmFja1N0YWNrID0gaW4uY3JlYXRlVHlwZWRBcnJheShCYWNrU3RhY2tTdGF0ZS5DUkVBVE9SKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIGludCBkZXNjcmliZUNvbnRlbnRzKCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZVRvUGFyY2VsKFBhcmNlbCBkZXN0LCBpbnQgZmxhZ3MpIHsKKyAgICAgICAgZGVzdC53cml0ZVR5cGVkQXJyYXkobUFjdGl2ZSwgZmxhZ3MpOworICAgICAgICBkZXN0LndyaXRlSW50QXJyYXkobUFkZGVkKTsKKyAgICAgICAgZGVzdC53cml0ZVR5cGVkQXJyYXkobUJhY2tTdGFjaywgZmxhZ3MpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFBhcmNlbGFibGUuQ3JlYXRvcjxGcmFnbWVudE1hbmFnZXJTdGF0ZT4gQ1JFQVRPUgorICAgICAgICAgICAgPSBuZXcgUGFyY2VsYWJsZS5DcmVhdG9yPEZyYWdtZW50TWFuYWdlclN0YXRlPigpIHsKKyAgICAgICAgcHVibGljIEZyYWdtZW50TWFuYWdlclN0YXRlIGNyZWF0ZUZyb21QYXJjZWwoUGFyY2VsIGluKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEZyYWdtZW50TWFuYWdlclN0YXRlKGluKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHVibGljIEZyYWdtZW50TWFuYWdlclN0YXRlW10gbmV3QXJyYXkoaW50IHNpemUpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgRnJhZ21lbnRNYW5hZ2VyU3RhdGVbc2l6ZV07CisgICAgICAgIH0KKyAgICB9OworfQorCisvKioKKyAqIEBoaWRlCisgKiBDb250YWluZXIgZm9yIGZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggYW4gYWN0aXZpdHkuCisgKi8KK3B1YmxpYyBjbGFzcyBGcmFnbWVudE1hbmFnZXIgeworICAgIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gdHJ1ZTsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJGcmFnbWVudE1hbmFnZXIiOworICAgIAorICAgIEFycmF5TGlzdDxGcmFnbWVudD4gbUFjdGl2ZTsKKyAgICBBcnJheUxpc3Q8RnJhZ21lbnQ+IG1BZGRlZDsKKyAgICBBcnJheUxpc3Q8SW50ZWdlcj4gbUF2YWlsSW5kaWNlczsKKyAgICBBcnJheUxpc3Q8QmFja1N0YWNrRW50cnk+IG1CYWNrU3RhY2s7CisgICAgCisgICAgaW50IG1DdXJTdGF0ZSA9IEZyYWdtZW50LklOSVRJQUxJWklORzsKKyAgICBBY3Rpdml0eSBtQWN0aXZpdHk7CisgICAgCisgICAgYm9vbGVhbiBtTmVlZE1lbnVJbnZhbGlkYXRlOworICAgIAorICAgIC8vIFRlbXBvcmFyeSB2YXJzIGZvciBzdGF0ZSBzYXZlIGFuZCByZXN0b3JlLgorICAgIEJ1bmRsZSBtU3RhdGVCdW5kbGUgPSBudWxsOworICAgIFNwYXJzZUFycmF5PFBhcmNlbGFibGU+IG1TdGF0ZUFycmF5ID0gbnVsbDsKKyAgICAKKyAgICBBbmltYXRpb24gbG9hZEFuaW1hdGlvbihGcmFnbWVudCBmcmFnbWVudCwgaW50IHRyYW5zaXQsIGJvb2xlYW4gZW50ZXIsCisgICAgICAgICAgICBpbnQgdHJhbnNpdGlvblN0eWxlKSB7CisgICAgICAgIEFuaW1hdGlvbiBhbmltT2JqID0gZnJhZ21lbnQub25DcmVhdGVBbmltYXRpb24odHJhbnNpdGlvblN0eWxlLCBlbnRlciwKKyAgICAgICAgICAgICAgICBmcmFnbWVudC5tTmV4dEFuaW0pOworICAgICAgICBpZiAoYW5pbU9iaiAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gYW5pbU9iajsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKGZyYWdtZW50Lm1OZXh0QW5pbSAhPSAwKSB7CisgICAgICAgICAgICBBbmltYXRpb24gYW5pbSA9IEFuaW1hdGlvblV0aWxzLmxvYWRBbmltYXRpb24obUFjdGl2aXR5LCBmcmFnbWVudC5tTmV4dEFuaW0pOworICAgICAgICAgICAgaWYgKGFuaW0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBhbmltOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAodHJhbnNpdCA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaW50IHN0eWxlSW5kZXggPSB0cmFuc2l0VG9TdHlsZUluZGV4KHRyYW5zaXQsIGVudGVyKTsKKyAgICAgICAgaWYgKHN0eWxlSW5kZXggPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKHRyYW5zaXRpb25TdHlsZSA9PSAwICYmIG1BY3Rpdml0eS5nZXRXaW5kb3coKSAhPSBudWxsKSB7CisgICAgICAgICAgICB0cmFuc2l0aW9uU3R5bGUgPSBtQWN0aXZpdHkuZ2V0V2luZG93KCkuZ2V0QXR0cmlidXRlcygpLndpbmRvd0FuaW1hdGlvbnM7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRyYW5zaXRpb25TdHlsZSA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgVHlwZWRBcnJheSBhdHRycyA9IG1BY3Rpdml0eS5vYnRhaW5TdHlsZWRBdHRyaWJ1dGVzKHRyYW5zaXRpb25TdHlsZSwKKyAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5XaW5kb3dBbmltYXRpb24pOworICAgICAgICBpbnQgYW5pbSA9IGF0dHJzLmdldFJlc291cmNlSWQoc3R5bGVJbmRleCwgMCk7CisgICAgICAgIGF0dHJzLnJlY3ljbGUoKTsKKyAgICAgICAgCisgICAgICAgIGlmIChhbmltID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICByZXR1cm4gQW5pbWF0aW9uVXRpbHMubG9hZEFuaW1hdGlvbihtQWN0aXZpdHksIGFuaW0pOworICAgIH0KKyAgICAKKyAgICB2b2lkIG1vdmVUb1N0YXRlKEZyYWdtZW50IGYsIGludCBuZXdTdGF0ZSwgaW50IHRyYW5zaXQsIGludCB0cmFuc2l0aW9uU3R5bGUpIHsKKyAgICAgICAgLy8gRnJhZ21lbnRzIHRoYXQgYXJlIG5vdCBjdXJyZW50bHkgYWRkZWQgd2lsbCBzaXQgaW4gdGhlIG9uQ3JlYXRlKCkgc3RhdGUuCisgICAgICAgIGlmICghZi5tQWRkZWQgJiYgbmV3U3RhdGUgPiBGcmFnbWVudC5DUkVBVEVEKSB7CisgICAgICAgICAgICBuZXdTdGF0ZSA9IEZyYWdtZW50LkNSRUFURUQ7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmIChmLm1TdGF0ZSA8IG5ld1N0YXRlKSB7CisgICAgICAgICAgICBzd2l0Y2ggKGYubVN0YXRlKSB7CisgICAgICAgICAgICAgICAgY2FzZSBGcmFnbWVudC5JTklUSUFMSVpJTkc6CisgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAibW92ZXRvIENSRUFURUQ6ICIgKyBmKTsKKyAgICAgICAgICAgICAgICAgICAgZi5tQWN0aXZpdHkgPSBtQWN0aXZpdHk7CisgICAgICAgICAgICAgICAgICAgIGYubUNhbGxlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBmLm9uQXR0YWNoKG1BY3Rpdml0eSk7CisgICAgICAgICAgICAgICAgICAgIGlmICghZi5tQ2FsbGVkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU3VwZXJOb3RDYWxsZWRFeGNlcHRpb24oIkZyYWdtZW50ICIgKyBmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBkaWQgbm90IGNhbGwgdGhyb3VnaCB0byBzdXBlci5vbkF0dGFjaCgpIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIGlmICghZi5tUmV0YWluaW5nKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmLm1DYWxsZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGYub25DcmVhdGUoZi5tU2F2ZWRGcmFnbWVudFN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZi5tQ2FsbGVkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFN1cGVyTm90Q2FsbGVkRXhjZXB0aW9uKCJGcmFnbWVudCAiICsgZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGRpZCBub3QgY2FsbCB0aHJvdWdoIHRvIHN1cGVyLm9uQ3JlYXRlKCkiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBmLm1SZXRhaW5pbmcgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGYubUZyb21MYXlvdXQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZvciBmcmFnbWVudHMgdGhhdCBhcmUgcGFydCBvZiB0aGUgY29udGVudCB2aWV3CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBsYXlvdXQsIHdlIG5lZWQgdG8gaW5zdGFudGlhdGUgdGhlIHZpZXcgaW1tZWRpYXRlbHkKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCB0aGUgaW5mbGF0ZXIgd2lsbCB0YWtlIGNhcmUgb2YgYWRkaW5nIGl0LgorICAgICAgICAgICAgICAgICAgICAgICAgZi5tVmlldyA9IGYub25DcmVhdGVWaWV3KG1BY3Rpdml0eS5nZXRMYXlvdXRJbmZsYXRlcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBmLm1TYXZlZEZyYWdtZW50U3RhdGUpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGYubVZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYubVZpZXcuc2V0U2F2ZUZyb21QYXJlbnRFbmFibGVkKGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLnJlc3RvcmVWaWV3U3RhdGUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZi5tSGlkZGVuKSBmLm1WaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsgCisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIEZyYWdtZW50LkNSRUFURUQ6CisgICAgICAgICAgICAgICAgICAgIGlmIChuZXdTdGF0ZSA+IEZyYWdtZW50LkNSRUFURUQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAibW92ZXRvIENPTlRFTlQ6ICIgKyBmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZi5tRnJvbUxheW91dCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpZXdHcm91cCBjb250YWluZXIgPSBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmLm1Db250YWluZXJJZCAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lciA9IChWaWV3R3JvdXApbUFjdGl2aXR5LmZpbmRWaWV3QnlJZChmLm1Db250YWluZXJJZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb250YWluZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTmV3IHZpZXcgZm91bmQgZm9yIGlkIDB4IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIEludGVnZXIudG9IZXhTdHJpbmcoZi5tQ29udGFpbmVySWQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBmb3IgZnJhZ21lbnQgIiArIGYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYubUNvbnRhaW5lciA9IGNvbnRhaW5lcjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLm1WaWV3ID0gZi5vbkNyZWF0ZVZpZXcobUFjdGl2aXR5LmdldExheW91dEluZmxhdGVyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXIsIGYubVNhdmVkRnJhZ21lbnRTdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGYubVZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLm1WaWV3LnNldFNhdmVGcm9tUGFyZW50RW5hYmxlZChmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb250YWluZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5pbWF0aW9uIGFuaW0gPSBsb2FkQW5pbWF0aW9uKGYsIHRyYW5zaXQsIHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25TdHlsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYW5pbSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZi5tVmlldy5zZXRBbmltYXRpb24oYW5pbSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXIuYWRkVmlldyhmLm1WaWV3KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYucmVzdG9yZVZpZXdTdGF0ZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmLm1IaWRkZW4pIGYubVZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGYubUNhbGxlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgZi5vblJlYWR5KGYubVNhdmVkRnJhZ21lbnRTdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWYubUNhbGxlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTdXBlck5vdENhbGxlZEV4Y2VwdGlvbigiRnJhZ21lbnQgIiArIGYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBkaWQgbm90IGNhbGwgdGhyb3VnaCB0byBzdXBlci5vblJlYWR5KCkiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGYubVNhdmVkRnJhZ21lbnRTdGF0ZSA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIEZyYWdtZW50LkNPTlRFTlQ6CisgICAgICAgICAgICAgICAgICAgIGlmIChuZXdTdGF0ZSA+IEZyYWdtZW50LkNPTlRFTlQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAibW92ZXRvIFNUQVJURUQ6ICIgKyBmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGYubUNhbGxlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgZi5vblN0YXJ0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWYubUNhbGxlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTdXBlck5vdENhbGxlZEV4Y2VwdGlvbigiRnJhZ21lbnQgIiArIGYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBkaWQgbm90IGNhbGwgdGhyb3VnaCB0byBzdXBlci5vblN0YXJ0KCkiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhc2UgRnJhZ21lbnQuU1RBUlRFRDoKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1N0YXRlID4gRnJhZ21lbnQuU1RBUlRFRCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICJtb3ZldG8gUkVTVU1FRDogIiArIGYpOworICAgICAgICAgICAgICAgICAgICAgICAgZi5tQ2FsbGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICBmLm9uUmVzdW1lKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWYubUNhbGxlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTdXBlck5vdENhbGxlZEV4Y2VwdGlvbigiRnJhZ21lbnQgIiArIGYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBkaWQgbm90IGNhbGwgdGhyb3VnaCB0byBzdXBlci5vblJlc3VtZSgpIik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChmLm1TdGF0ZSA+IG5ld1N0YXRlKSB7CisgICAgICAgICAgICBzd2l0Y2ggKGYubVN0YXRlKSB7CisgICAgICAgICAgICAgICAgY2FzZSBGcmFnbWVudC5SRVNVTUVEOgorICAgICAgICAgICAgICAgICAgICBpZiAobmV3U3RhdGUgPCBGcmFnbWVudC5SRVNVTUVEKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgIm1vdmVmcm9tIFJFU1VNRUQ6ICIgKyBmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGYubUNhbGxlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgZi5vblBhdXNlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWYubUNhbGxlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTdXBlck5vdENhbGxlZEV4Y2VwdGlvbigiRnJhZ21lbnQgIiArIGYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBkaWQgbm90IGNhbGwgdGhyb3VnaCB0byBzdXBlci5vblBhdXNlKCkiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhc2UgRnJhZ21lbnQuU1RBUlRFRDoKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1N0YXRlIDwgRnJhZ21lbnQuU1RBUlRFRCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICJtb3ZlZnJvbSBTVEFSVEVEOiAiICsgZik7CisgICAgICAgICAgICAgICAgICAgICAgICBmLm1DYWxsZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGYub25TdG9wKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWYubUNhbGxlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTdXBlck5vdENhbGxlZEV4Y2VwdGlvbigiRnJhZ21lbnQgIiArIGYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBkaWQgbm90IGNhbGwgdGhyb3VnaCB0byBzdXBlci5vblN0b3AoKSIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2FzZSBGcmFnbWVudC5DT05URU5UOgorICAgICAgICAgICAgICAgICAgICBpZiAobmV3U3RhdGUgPCBGcmFnbWVudC5DT05URU5UKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgIm1vdmVmcm9tIENPTlRFTlQ6ICIgKyBmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmLm1WaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLm1DYWxsZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLm9uRGVzdHJveVZpZXcoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWYubUNhbGxlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU3VwZXJOb3RDYWxsZWRFeGNlcHRpb24oIkZyYWdtZW50ICIgKyBmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGRpZCBub3QgY2FsbCB0aHJvdWdoIHRvIHN1cGVyLm9uRGVzdHJveWVkVmlldygpIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5lZWQgdG8gc2F2ZSB0aGUgY3VycmVudCB2aWV3IHN0YXRlIGlmIG5vdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvbmUgYWxyZWFkeS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW1BY3Rpdml0eS5pc0ZpbmlzaGluZygpICYmIGYubVNhdmVkRnJhZ21lbnRTdGF0ZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhdmVGcmFnbWVudFZpZXdTdGF0ZShmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGYubUNvbnRhaW5lciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtQ3VyU3RhdGUgPiBGcmFnbWVudC5JTklUSUFMSVpJTkcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFuaW1hdGlvbiBhbmltID0gbG9hZEFuaW1hdGlvbihmLCB0cmFuc2l0LCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblN0eWxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhbmltICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLm1WaWV3LnNldEFuaW1hdGlvbihhbmltKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLm1Db250YWluZXIucmVtb3ZlVmlldyhmLm1WaWV3KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBmLm1Db250YWluZXIgPSBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgZi5tVmlldyA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIEZyYWdtZW50LkNSRUFURUQ6CisgICAgICAgICAgICAgICAgICAgIGlmIChuZXdTdGF0ZSA8IEZyYWdtZW50LkNSRUFURUQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAibW92ZWZyb20gQ1JFQVRFRDogIiArIGYpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmLm1SZXRhaW5pbmcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLm1DYWxsZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLm9uRGVzdHJveSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZi5tQ2FsbGVkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTdXBlck5vdENhbGxlZEV4Y2VwdGlvbigiRnJhZ21lbnQgIiArIGYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgZGlkIG5vdCBjYWxsIHRocm91Z2ggdG8gc3VwZXIub25EZXN0cm95KCkiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGYubUNhbGxlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgZi5vbkRldGFjaCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmLm1DYWxsZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU3VwZXJOb3RDYWxsZWRFeGNlcHRpb24oIkZyYWdtZW50ICIgKyBmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgZGlkIG5vdCBjYWxsIHRocm91Z2ggdG8gc3VwZXIub25EZXRhY2goKSIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZi5tQWN0aXZpdHkgPSBudWxsOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGYubVN0YXRlID0gbmV3U3RhdGU7CisgICAgfQorICAgIAorICAgIHZvaWQgbW92ZVRvU3RhdGUoaW50IG5ld1N0YXRlLCBib29sZWFuIGFsd2F5cykgeworICAgICAgICBtb3ZlVG9TdGF0ZShuZXdTdGF0ZSwgMCwgMCwgYWx3YXlzKTsKKyAgICB9CisgICAgCisgICAgdm9pZCBtb3ZlVG9TdGF0ZShpbnQgbmV3U3RhdGUsIGludCB0cmFuc2l0LCBpbnQgdHJhbnNpdFN0eWxlLCBib29sZWFuIGFsd2F5cykgeworICAgICAgICBpZiAobUFjdGl2aXR5ID09IG51bGwgJiYgbmV3U3RhdGUgIT0gRnJhZ21lbnQuSU5JVElBTElaSU5HKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJObyBhY3Rpdml0eSIpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAoIWFsd2F5cyAmJiBtQ3VyU3RhdGUgPT0gbmV3U3RhdGUpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgbUN1clN0YXRlID0gbmV3U3RhdGU7CisgICAgICAgIGlmIChtQWN0aXZlICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxtQWN0aXZlLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgRnJhZ21lbnQgZiA9IG1BY3RpdmUuZ2V0KGkpOworICAgICAgICAgICAgICAgIGlmIChmICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbW92ZVRvU3RhdGUoZiwgbmV3U3RhdGUsIHRyYW5zaXQsIHRyYW5zaXRTdHlsZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIAorICAgIHZvaWQgbWFrZUFjdGl2ZShGcmFnbWVudCBmKSB7CisgICAgICAgIGlmIChmLm1JbmRleCA+PSAwKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmIChtQXZhaWxJbmRpY2VzID09IG51bGwgfHwgbUF2YWlsSW5kaWNlcy5zaXplKCkgPD0gMCkgeworICAgICAgICAgICAgaWYgKG1BY3RpdmUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1BY3RpdmUgPSBuZXcgQXJyYXlMaXN0PEZyYWdtZW50PigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZi5zZXRJbmRleChtQWN0aXZlLnNpemUoKSk7CisgICAgICAgICAgICBtQWN0aXZlLmFkZChmKTsKKyAgICAgICAgICAgIAorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZi5zZXRJbmRleChtQXZhaWxJbmRpY2VzLnJlbW92ZShtQXZhaWxJbmRpY2VzLnNpemUoKS0xKSk7CisgICAgICAgICAgICBtQWN0aXZlLnNldChmLm1JbmRleCwgZik7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgdm9pZCBtYWtlSW5hY3RpdmUoRnJhZ21lbnQgZikgeworICAgICAgICBpZiAoZi5tSW5kZXggPCAwKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIG1BY3RpdmUuc2V0KGYubUluZGV4LCBudWxsKTsKKyAgICAgICAgaWYgKG1BdmFpbEluZGljZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgbUF2YWlsSW5kaWNlcyA9IG5ldyBBcnJheUxpc3Q8SW50ZWdlcj4oKTsKKyAgICAgICAgfQorICAgICAgICBtQXZhaWxJbmRpY2VzLmFkZChmLm1JbmRleCk7CisgICAgICAgIGYuY2xlYXJJbmRleCgpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBhZGRGcmFnbWVudChGcmFnbWVudCBmcmFnbWVudCwgYm9vbGVhbiBtb3ZlVG9TdGF0ZU5vdykgeworICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgImFkZDogIiArIGZyYWdtZW50KTsKKyAgICAgICAgaWYgKG1BZGRlZCA9PSBudWxsKSB7CisgICAgICAgICAgICBtQWRkZWQgPSBuZXcgQXJyYXlMaXN0PEZyYWdtZW50PigpOworICAgICAgICB9CisgICAgICAgIG1BZGRlZC5hZGQoZnJhZ21lbnQpOworICAgICAgICBtYWtlQWN0aXZlKGZyYWdtZW50KTsKKyAgICAgICAgZnJhZ21lbnQubUFkZGVkID0gdHJ1ZTsKKyAgICAgICAgaWYgKGZyYWdtZW50Lm1IYXNNZW51KSB7CisgICAgICAgICAgICBtTmVlZE1lbnVJbnZhbGlkYXRlID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAobW92ZVRvU3RhdGVOb3cpIHsKKyAgICAgICAgICAgIG1vdmVUb1N0YXRlKGZyYWdtZW50LCBtQ3VyU3RhdGUsIDAsIDApOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHJlbW92ZUZyYWdtZW50KEZyYWdtZW50IGZyYWdtZW50LCBpbnQgdHJhbnNpdGlvbiwgaW50IHRyYW5zaXRpb25TdHlsZSkgeworICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgInJlbW92ZTogIiArIGZyYWdtZW50KTsKKyAgICAgICAgbUFkZGVkLnJlbW92ZShmcmFnbWVudCk7CisgICAgICAgIGZpbmFsIGJvb2xlYW4gaW5hY3RpdmUgPSBmcmFnbWVudC5tQmFja1N0YWNrTmVzdGluZyA8PSAwOworICAgICAgICBpZiAoaW5hY3RpdmUpIHsKKyAgICAgICAgICAgIG1ha2VJbmFjdGl2ZShmcmFnbWVudCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZyYWdtZW50Lm1IYXNNZW51KSB7CisgICAgICAgICAgICBtTmVlZE1lbnVJbnZhbGlkYXRlID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBmcmFnbWVudC5tQWRkZWQgPSBmYWxzZTsKKyAgICAgICAgbW92ZVRvU3RhdGUoZnJhZ21lbnQsIGluYWN0aXZlID8gRnJhZ21lbnQuSU5JVElBTElaSU5HIDogRnJhZ21lbnQuQ1JFQVRFRCwKKyAgICAgICAgICAgICAgICB0cmFuc2l0aW9uLCB0cmFuc2l0aW9uU3R5bGUpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBoaWRlRnJhZ21lbnQoRnJhZ21lbnQgZnJhZ21lbnQsIGludCB0cmFuc2l0aW9uLCBpbnQgdHJhbnNpdGlvblN0eWxlKSB7CisgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAiaGlkZTogIiArIGZyYWdtZW50KTsKKyAgICAgICAgaWYgKCFmcmFnbWVudC5tSGlkZGVuKSB7CisgICAgICAgICAgICBmcmFnbWVudC5tSGlkZGVuID0gdHJ1ZTsKKyAgICAgICAgICAgIGlmIChmcmFnbWVudC5tVmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgQW5pbWF0aW9uIGFuaW0gPSBsb2FkQW5pbWF0aW9uKGZyYWdtZW50LCB0cmFuc2l0aW9uLCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25TdHlsZSk7CisgICAgICAgICAgICAgICAgaWYgKGFuaW0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBmcmFnbWVudC5tVmlldy5zZXRBbmltYXRpb24oYW5pbSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZyYWdtZW50Lm1WaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChmcmFnbWVudC5tQWRkZWQgJiYgZnJhZ21lbnQubUhhc01lbnUpIHsKKyAgICAgICAgICAgICAgICBtTmVlZE1lbnVJbnZhbGlkYXRlID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZyYWdtZW50Lm9uSGlkZGVuQ2hhbmdlZCh0cnVlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBzaG93RnJhZ21lbnQoRnJhZ21lbnQgZnJhZ21lbnQsIGludCB0cmFuc2l0aW9uLCBpbnQgdHJhbnNpdGlvblN0eWxlKSB7CisgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAic2hvdzogIiArIGZyYWdtZW50KTsKKyAgICAgICAgaWYgKGZyYWdtZW50Lm1IaWRkZW4pIHsKKyAgICAgICAgICAgIGZyYWdtZW50Lm1IaWRkZW4gPSBmYWxzZTsKKyAgICAgICAgICAgIGlmIChmcmFnbWVudC5tVmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgQW5pbWF0aW9uIGFuaW0gPSBsb2FkQW5pbWF0aW9uKGZyYWdtZW50LCB0cmFuc2l0aW9uLCB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblN0eWxlKTsKKyAgICAgICAgICAgICAgICBpZiAoYW5pbSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGZyYWdtZW50Lm1WaWV3LnNldEFuaW1hdGlvbihhbmltKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZnJhZ21lbnQubVZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGZyYWdtZW50Lm1BZGRlZCAmJiBmcmFnbWVudC5tSGFzTWVudSkgeworICAgICAgICAgICAgICAgIG1OZWVkTWVudUludmFsaWRhdGUgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZnJhZ21lbnQub25IaWRkZW5DaGFuZ2VkKGZhbHNlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgRnJhZ21lbnQgZmluZEZyYWdtZW50QnlJZChpbnQgaWQpIHsKKyAgICAgICAgaWYgKG1BY3RpdmUgIT0gbnVsbCkgeworICAgICAgICAgICAgLy8gRmlyc3QgbG9vayB0aHJvdWdoIGFkZGVkIGZyYWdtZW50cy4KKyAgICAgICAgICAgIGZvciAoaW50IGk9bUFkZGVkLnNpemUoKS0xOyBpPj0wOyBpLS0pIHsKKyAgICAgICAgICAgICAgICBGcmFnbWVudCBmID0gbUFkZGVkLmdldChpKTsKKyAgICAgICAgICAgICAgICBpZiAoZiAhPSBudWxsICYmIGYubUZyYWdtZW50SWQgPT0gaWQpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gTm93IGZvciBhbnkga25vd24gZnJhZ21lbnQuCisgICAgICAgICAgICBmb3IgKGludCBpPW1BY3RpdmUuc2l6ZSgpLTE7IGk+PTA7IGktLSkgeworICAgICAgICAgICAgICAgIEZyYWdtZW50IGYgPSBtQWN0aXZlLmdldChpKTsKKyAgICAgICAgICAgICAgICBpZiAoZiAhPSBudWxsICYmIGYubUZyYWdtZW50SWQgPT0gaWQpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgRnJhZ21lbnQgZmluZEZyYWdtZW50QnlUYWcoU3RyaW5nIHRhZykgeworICAgICAgICBpZiAobUFjdGl2ZSAhPSBudWxsICYmIHRhZyAhPSBudWxsKSB7CisgICAgICAgICAgICAvLyBGaXJzdCBsb29rIHRocm91Z2ggYWRkZWQgZnJhZ21lbnRzLgorICAgICAgICAgICAgZm9yIChpbnQgaT1tQWRkZWQuc2l6ZSgpLTE7IGk+PTA7IGktLSkgeworICAgICAgICAgICAgICAgIEZyYWdtZW50IGYgPSBtQWRkZWQuZ2V0KGkpOworICAgICAgICAgICAgICAgIGlmIChmICE9IG51bGwgJiYgdGFnLmVxdWFscyhmLm1UYWcpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIE5vdyBmb3IgYW55IGtub3duIGZyYWdtZW50LgorICAgICAgICAgICAgZm9yIChpbnQgaT1tQWN0aXZlLnNpemUoKS0xOyBpPj0wOyBpLS0pIHsKKyAgICAgICAgICAgICAgICBGcmFnbWVudCBmID0gbUFjdGl2ZS5nZXQoaSk7CisgICAgICAgICAgICAgICAgaWYgKGYgIT0gbnVsbCAmJiB0YWcuZXF1YWxzKGYubVRhZykpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgRnJhZ21lbnQgZmluZEZyYWdtZW50QnlXaG8oU3RyaW5nIHdobykgeworICAgICAgICBpZiAobUFjdGl2ZSAhPSBudWxsICYmIHdobyAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKGludCBpPW1BY3RpdmUuc2l6ZSgpLTE7IGk+PTA7IGktLSkgeworICAgICAgICAgICAgICAgIEZyYWdtZW50IGYgPSBtQWN0aXZlLmdldChpKTsKKyAgICAgICAgICAgICAgICBpZiAoZiAhPSBudWxsICYmIHdoby5lcXVhbHMoZi5tV2hvKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIGFkZEJhY2tTdGFja1N0YXRlKEJhY2tTdGFja0VudHJ5IHN0YXRlKSB7CisgICAgICAgIGlmIChtQmFja1N0YWNrID09IG51bGwpIHsKKyAgICAgICAgICAgIG1CYWNrU3RhY2sgPSBuZXcgQXJyYXlMaXN0PEJhY2tTdGFja0VudHJ5PigpOworICAgICAgICB9CisgICAgICAgIG1CYWNrU3RhY2suYWRkKHN0YXRlKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIGJvb2xlYW4gcG9wQmFja1N0YWNrU3RhdGUoSGFuZGxlciBoYW5kbGVyLCBTdHJpbmcgbmFtZSkgeworICAgICAgICBpZiAobUJhY2tTdGFjayA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgaW50IGxhc3QgPSBtQmFja1N0YWNrLnNpemUoKS0xOworICAgICAgICAgICAgaWYgKGxhc3QgPCAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWwgQmFja1N0YWNrRW50cnkgYnNzID0gbUJhY2tTdGFjay5yZW1vdmUobGFzdCk7CisgICAgICAgICAgICBoYW5kbGVyLnBvc3QobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgYnNzLnBvcEZyb21CYWNrU3RhY2soKTsKKyAgICAgICAgICAgICAgICAgICAgbW92ZVRvU3RhdGUobUN1clN0YXRlLCByZXZlcnNlVHJhbnNpdChic3MuZ2V0VHJhbnNpdGlvbigpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBic3MuZ2V0VHJhbnNpdGlvblN0eWxlKCksIHRydWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW50IGluZGV4ID0gbUJhY2tTdGFjay5zaXplKCktMTsKKyAgICAgICAgICAgIHdoaWxlIChpbmRleCA+PSAwKSB7CisgICAgICAgICAgICAgICAgQmFja1N0YWNrRW50cnkgYnNzID0gbUJhY2tTdGFjay5nZXQoaW5kZXgpOworICAgICAgICAgICAgICAgIGlmIChuYW1lLmVxdWFscyhic3MuZ2V0TmFtZSgpKSkgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID09IG1CYWNrU3RhY2suc2l6ZSgpLTEpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmaW5hbCBBcnJheUxpc3Q8QmFja1N0YWNrRW50cnk+IHN0YXRlcworICAgICAgICAgICAgICAgICAgICA9IG5ldyBBcnJheUxpc3Q8QmFja1N0YWNrRW50cnk+KCk7CisgICAgICAgICAgICBmb3IgKGludCBpPW1CYWNrU3RhY2suc2l6ZSgpLTE7IGk+aW5kZXg7IGktLSkgeworICAgICAgICAgICAgICAgIHN0YXRlcy5hZGQobUJhY2tTdGFjay5yZW1vdmUoaSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaGFuZGxlci5wb3N0KG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxzdGF0ZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlcy5nZXQoaSkucG9wRnJvbUJhY2tTdGFjaygpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG1vdmVUb1N0YXRlKG1DdXJTdGF0ZSwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIAorICAgIEFycmF5TGlzdDxGcmFnbWVudD4gcmV0YWluTm9uQ29uZmlnKCkgeworICAgICAgICBBcnJheUxpc3Q8RnJhZ21lbnQ+IGZyYWdtZW50cyA9IG51bGw7CisgICAgICAgIGlmIChtQWN0aXZlICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxtQWN0aXZlLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgRnJhZ21lbnQgZiA9IG1BY3RpdmUuZ2V0KGkpOworICAgICAgICAgICAgICAgIGlmIChmICE9IG51bGwgJiYgZi5tUmV0YWluSW5zdGFuY2UpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZyYWdtZW50cyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmcmFnbWVudHMgPSBuZXcgQXJyYXlMaXN0PEZyYWdtZW50PigpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGZyYWdtZW50cy5hZGQoZik7CisgICAgICAgICAgICAgICAgICAgIGYubVJldGFpbmluZyA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmcmFnbWVudHM7CisgICAgfQorICAgIAorICAgIHZvaWQgc2F2ZUZyYWdtZW50Vmlld1N0YXRlKEZyYWdtZW50IGYpIHsKKyAgICAgICAgaWYgKGYubVZpZXcgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmIChtU3RhdGVBcnJheSA9PSBudWxsKSB7CisgICAgICAgICAgICBtU3RhdGVBcnJheSA9IG5ldyBTcGFyc2VBcnJheTxQYXJjZWxhYmxlPigpOworICAgICAgICB9CisgICAgICAgIGYubVZpZXcuc2F2ZUhpZXJhcmNoeVN0YXRlKG1TdGF0ZUFycmF5KTsKKyAgICAgICAgaWYgKG1TdGF0ZUFycmF5LnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgIGYubVNhdmVkVmlld1N0YXRlID0gbVN0YXRlQXJyYXk7CisgICAgICAgICAgICBtU3RhdGVBcnJheSA9IG51bGw7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgUGFyY2VsYWJsZSBzYXZlQWxsU3RhdGUoKSB7CisgICAgICAgIGlmIChtQWN0aXZlID09IG51bGwgfHwgbUFjdGl2ZS5zaXplKCkgPD0gMCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vIEZpcnN0IGNvbGxlY3QgYWxsIGFjdGl2ZSBmcmFnbWVudHMuCisgICAgICAgIGludCBOID0gbUFjdGl2ZS5zaXplKCk7CisgICAgICAgIEZyYWdtZW50U3RhdGVbXSBhY3RpdmUgPSBuZXcgRnJhZ21lbnRTdGF0ZVtOXTsKKyAgICAgICAgYm9vbGVhbiBoYXZlRnJhZ21lbnRzID0gZmFsc2U7CisgICAgICAgIGZvciAoaW50IGk9MDsgaTxOOyBpKyspIHsKKyAgICAgICAgICAgIEZyYWdtZW50IGYgPSBtQWN0aXZlLmdldChpKTsKKyAgICAgICAgICAgIGlmIChmICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBoYXZlRnJhZ21lbnRzID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBGcmFnbWVudFN0YXRlIGZzID0gbmV3IEZyYWdtZW50U3RhdGUoZik7CisgICAgICAgICAgICAgICAgYWN0aXZlW2ldID0gZnM7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgaWYgKG1TdGF0ZUJ1bmRsZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG1TdGF0ZUJ1bmRsZSA9IG5ldyBCdW5kbGUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZi5vblNhdmVJbnN0YW5jZVN0YXRlKG1TdGF0ZUJ1bmRsZSk7CisgICAgICAgICAgICAgICAgaWYgKCFtU3RhdGVCdW5kbGUuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgIGZzLm1TYXZlZEZyYWdtZW50U3RhdGUgPSBtU3RhdGVCdW5kbGU7CisgICAgICAgICAgICAgICAgICAgIG1TdGF0ZUJ1bmRsZSA9IG51bGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGlmIChmLm1WaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgc2F2ZUZyYWdtZW50Vmlld1N0YXRlKGYpOworICAgICAgICAgICAgICAgICAgICBpZiAoZi5tU2F2ZWRWaWV3U3RhdGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZzLm1TYXZlZEZyYWdtZW50U3RhdGUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZzLm1TYXZlZEZyYWdtZW50U3RhdGUgPSBuZXcgQnVuZGxlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBmcy5tU2F2ZWRGcmFnbWVudFN0YXRlLnB1dFNwYXJzZVBhcmNlbGFibGVBcnJheSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnJhZ21lbnRTdGF0ZS5WSUVXX1NUQVRFX1RBRywgZi5tU2F2ZWRWaWV3U3RhdGUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAoIWhhdmVGcmFnbWVudHMpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpbnRbXSBhZGRlZCA9IG51bGw7CisgICAgICAgIEJhY2tTdGFja1N0YXRlW10gYmFja1N0YWNrID0gbnVsbDsKKyAgICAgICAgCisgICAgICAgIC8vIEJ1aWxkIGxpc3Qgb2YgY3VycmVudGx5IGFkZGVkIGZyYWdtZW50cy4KKyAgICAgICAgTiA9IG1BZGRlZC5zaXplKCk7CisgICAgICAgIGlmIChOID4gMCkgeworICAgICAgICAgICAgYWRkZWQgPSBuZXcgaW50W05dOworICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPE47IGkrKykgeworICAgICAgICAgICAgICAgIGFkZGVkW2ldID0gbUFkZGVkLmdldChpKS5tSW5kZXg7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vIE5vdyBzYXZlIGJhY2sgc3RhY2suCisgICAgICAgIGlmIChtQmFja1N0YWNrICE9IG51bGwpIHsKKyAgICAgICAgICAgIE4gPSBtQmFja1N0YWNrLnNpemUoKTsKKyAgICAgICAgICAgIGlmIChOID4gMCkgeworICAgICAgICAgICAgICAgIGJhY2tTdGFjayA9IG5ldyBCYWNrU3RhY2tTdGF0ZVtOXTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8TjsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGJhY2tTdGFja1tpXSA9IG5ldyBCYWNrU3RhY2tTdGF0ZSh0aGlzLCBtQmFja1N0YWNrLmdldChpKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBGcmFnbWVudE1hbmFnZXJTdGF0ZSBmbXMgPSBuZXcgRnJhZ21lbnRNYW5hZ2VyU3RhdGUoKTsKKyAgICAgICAgZm1zLm1BY3RpdmUgPSBhY3RpdmU7CisgICAgICAgIGZtcy5tQWRkZWQgPSBhZGRlZDsKKyAgICAgICAgZm1zLm1CYWNrU3RhY2sgPSBiYWNrU3RhY2s7CisgICAgICAgIHJldHVybiBmbXM7CisgICAgfQorICAgIAorICAgIHZvaWQgcmVzdG9yZUFsbFN0YXRlKFBhcmNlbGFibGUgc3RhdGUsIEFycmF5TGlzdDxGcmFnbWVudD4gbm9uQ29uZmlnKSB7CisgICAgICAgIC8vIElmIHRoZXJlIGlzIG5vIHNhdmVkIHN0YXRlIGF0IGFsbCwgdGhlbiB0aGVyZSBjYW4gbm90IGJlCisgICAgICAgIC8vIGFueSBub25Db25maWcgZnJhZ21lbnRzIGVpdGhlciwgc28gdGhhdCBpcyB0aGF0LgorICAgICAgICBpZiAoc3RhdGUgPT0gbnVsbCkgcmV0dXJuOworICAgICAgICBGcmFnbWVudE1hbmFnZXJTdGF0ZSBmbXMgPSAoRnJhZ21lbnRNYW5hZ2VyU3RhdGUpc3RhdGU7CisgICAgICAgIGlmIChmbXMubUFjdGl2ZSA9PSBudWxsKSByZXR1cm47CisgICAgICAgIAorICAgICAgICAvLyBGaXJzdCByZS1hdHRhY2ggYW55IG5vbi1jb25maWcgaW5zdGFuY2VzIHdlIGFyZSByZXRhaW5pbmcgYmFjaworICAgICAgICAvLyB0byB0aGVpciBzYXZlZCBzdGF0ZSwgc28gd2UgZG9uJ3QgdHJ5IHRvIGluc3RhbnRpYXRlIHRoZW0gYWdhaW4uCisgICAgICAgIGlmIChub25Db25maWcgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPG5vbkNvbmZpZy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgIEZyYWdtZW50IGYgPSBub25Db25maWcuZ2V0KGkpOworICAgICAgICAgICAgICAgIEZyYWdtZW50U3RhdGUgZnMgPSBmbXMubUFjdGl2ZVtmLm1JbmRleF07CisgICAgICAgICAgICAgICAgZnMubUluc3RhbmNlID0gZjsKKyAgICAgICAgICAgICAgICBmLm1TYXZlZFZpZXdTdGF0ZSA9IG51bGw7CisgICAgICAgICAgICAgICAgZi5tQmFja1N0YWNrTmVzdGluZyA9IDA7CisgICAgICAgICAgICAgICAgZi5tQWRkZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBpZiAoZnMubVNhdmVkRnJhZ21lbnRTdGF0ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGYubVNhdmVkVmlld1N0YXRlID0gZnMubVNhdmVkRnJhZ21lbnRTdGF0ZS5nZXRTcGFyc2VQYXJjZWxhYmxlQXJyYXkoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnJhZ21lbnRTdGF0ZS5WSUVXX1NUQVRFX1RBRyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyBCdWlsZCB0aGUgZnVsbCBsaXN0IG9mIGFjdGl2ZSBmcmFnbWVudHMsIGluc3RhbnRpYXRpbmcgdGhlbSBmcm9tCisgICAgICAgIC8vIHRoZWlyIHNhdmVkIHN0YXRlLgorICAgICAgICBtQWN0aXZlID0gbmV3IEFycmF5TGlzdDxGcmFnbWVudD4oZm1zLm1BY3RpdmUubGVuZ3RoKTsKKyAgICAgICAgaWYgKG1BdmFpbEluZGljZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgbUF2YWlsSW5kaWNlcy5jbGVhcigpOworICAgICAgICB9CisgICAgICAgIGZvciAoaW50IGk9MDsgaTxmbXMubUFjdGl2ZS5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgRnJhZ21lbnRTdGF0ZSBmcyA9IGZtcy5tQWN0aXZlW2ldOworICAgICAgICAgICAgaWYgKGZzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtQWN0aXZlLmFkZChmcy5pbnN0YW50aWF0ZShtQWN0aXZpdHkpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbUFjdGl2ZS5hZGQobnVsbCk7CisgICAgICAgICAgICAgICAgaWYgKG1BdmFpbEluZGljZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBtQXZhaWxJbmRpY2VzID0gbmV3IEFycmF5TGlzdDxJbnRlZ2VyPigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtQXZhaWxJbmRpY2VzLmFkZChpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8gQnVpbGQgdGhlIGxpc3Qgb2YgY3VycmVudGx5IGFkZGVkIGZyYWdtZW50cy4KKyAgICAgICAgaWYgKGZtcy5tQWRkZWQgIT0gbnVsbCkgeworICAgICAgICAgICAgbUFkZGVkID0gbmV3IEFycmF5TGlzdDxGcmFnbWVudD4oZm1zLm1BZGRlZC5sZW5ndGgpOworICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPGZtcy5tQWRkZWQubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBGcmFnbWVudCBmID0gbUFjdGl2ZS5nZXQoZm1zLm1BZGRlZFtpXSk7CisgICAgICAgICAgICAgICAgaWYgKGYgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJObyBpbnN0YW50aWF0ZWQgZnJhZ21lbnQgZm9yIGluZGV4ICMiICsgZm1zLm1BZGRlZFtpXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGYubUFkZGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBmLm1JbW1lZGlhdGVBY3Rpdml0eSA9IG1BY3Rpdml0eTsKKyAgICAgICAgICAgICAgICBtQWRkZWQuYWRkKGYpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbUFkZGVkID0gbnVsbDsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8gQnVpbGQgdGhlIGJhY2sgc3RhY2suCisgICAgICAgIGlmIChmbXMubUJhY2tTdGFjayAhPSBudWxsKSB7CisgICAgICAgICAgICBtQmFja1N0YWNrID0gbmV3IEFycmF5TGlzdDxCYWNrU3RhY2tFbnRyeT4oZm1zLm1CYWNrU3RhY2subGVuZ3RoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxmbXMubUJhY2tTdGFjay5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIEJhY2tTdGFja0VudHJ5IGJzZSA9IGZtcy5tQmFja1N0YWNrW2ldLmluc3RhbnRpYXRlKHRoaXMpOworICAgICAgICAgICAgICAgIG1CYWNrU3RhY2suYWRkKGJzZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtQmFja1N0YWNrID0gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBhdHRhY2hBY3Rpdml0eShBY3Rpdml0eSBhY3Rpdml0eSkgeworICAgICAgICBpZiAobUFjdGl2aXR5ICE9IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKKyAgICAgICAgbUFjdGl2aXR5ID0gYWN0aXZpdHk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIGRpc3BhdGNoQ3JlYXRlKCkgeworICAgICAgICBtb3ZlVG9TdGF0ZShGcmFnbWVudC5DUkVBVEVELCBmYWxzZSk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIGRpc3BhdGNoU3RhcnQoKSB7CisgICAgICAgIG1vdmVUb1N0YXRlKEZyYWdtZW50LlNUQVJURUQsIGZhbHNlKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgZGlzcGF0Y2hSZXN1bWUoKSB7CisgICAgICAgIG1vdmVUb1N0YXRlKEZyYWdtZW50LlJFU1VNRUQsIGZhbHNlKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgZGlzcGF0Y2hQYXVzZSgpIHsKKyAgICAgICAgbW92ZVRvU3RhdGUoRnJhZ21lbnQuU1RBUlRFRCwgZmFsc2UpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBkaXNwYXRjaFN0b3AoKSB7CisgICAgICAgIG1vdmVUb1N0YXRlKEZyYWdtZW50LkNPTlRFTlQsIGZhbHNlKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgZGlzcGF0Y2hEZXN0cm95KCkgeworICAgICAgICBtb3ZlVG9TdGF0ZShGcmFnbWVudC5JTklUSUFMSVpJTkcsIGZhbHNlKTsKKyAgICAgICAgbUFjdGl2aXR5ID0gbnVsbDsKKyAgICB9CisgICAgCisgICAgcHVibGljIGJvb2xlYW4gZGlzcGF0Y2hDcmVhdGVPcHRpb25zTWVudShNZW51IG1lbnUsIE1lbnVJbmZsYXRlciBpbmZsYXRlcikgeworICAgICAgICBib29sZWFuIHNob3cgPSBmYWxzZTsKKyAgICAgICAgaWYgKG1BY3RpdmUgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPG1BZGRlZC5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgIEZyYWdtZW50IGYgPSBtQWRkZWQuZ2V0KGkpOworICAgICAgICAgICAgICAgIGlmIChmICE9IG51bGwgJiYgIWYubUhpZGRlbiAmJiBmLm1IYXNNZW51KSB7CisgICAgICAgICAgICAgICAgICAgIHNob3cgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBmLm9uQ3JlYXRlT3B0aW9uc01lbnUobWVudSwgaW5mbGF0ZXIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc2hvdzsKKyAgICB9CisgICAgCisgICAgcHVibGljIGJvb2xlYW4gZGlzcGF0Y2hQcmVwYXJlT3B0aW9uc01lbnUoTWVudSBtZW51KSB7CisgICAgICAgIGJvb2xlYW4gc2hvdyA9IGZhbHNlOworICAgICAgICBpZiAobUFjdGl2ZSAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8bUFkZGVkLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgRnJhZ21lbnQgZiA9IG1BZGRlZC5nZXQoaSk7CisgICAgICAgICAgICAgICAgaWYgKGYgIT0gbnVsbCAmJiAhZi5tSGlkZGVuICYmIGYubUhhc01lbnUpIHsKKyAgICAgICAgICAgICAgICAgICAgc2hvdyA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGYub25QcmVwYXJlT3B0aW9uc01lbnUobWVudSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBzaG93OworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgYm9vbGVhbiBkaXNwYXRjaE9wdGlvbnNJdGVtU2VsZWN0ZWQoTWVudUl0ZW0gaXRlbSkgeworICAgICAgICBpZiAobUFjdGl2ZSAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8bUFkZGVkLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgRnJhZ21lbnQgZiA9IG1BZGRlZC5nZXQoaSk7CisgICAgICAgICAgICAgICAgaWYgKGYgIT0gbnVsbCAmJiAhZi5tSGlkZGVuICYmIGYubUhhc01lbnUpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGYub25PcHRpb25zSXRlbVNlbGVjdGVkKGl0ZW0pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBib29sZWFuIGRpc3BhdGNoQ29udGV4dEl0ZW1TZWxlY3RlZChNZW51SXRlbSBpdGVtKSB7CisgICAgICAgIGlmIChtQWN0aXZlICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxtQWRkZWQuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBGcmFnbWVudCBmID0gbUFkZGVkLmdldChpKTsKKyAgICAgICAgICAgICAgICBpZiAoZiAhPSBudWxsICYmICFmLm1IaWRkZW4pIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGYub25Db250ZXh0SXRlbVNlbGVjdGVkKGl0ZW0pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIGRpc3BhdGNoT3B0aW9uc01lbnVDbG9zZWQoTWVudSBtZW51KSB7CisgICAgICAgIGlmIChtQWN0aXZlICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxtQWRkZWQuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBGcmFnbWVudCBmID0gbUFkZGVkLmdldChpKTsKKyAgICAgICAgICAgICAgICBpZiAoZiAhPSBudWxsICYmICFmLm1IaWRkZW4gJiYgZi5tSGFzTWVudSkgeworICAgICAgICAgICAgICAgICAgICBmLm9uT3B0aW9uc01lbnVDbG9zZWQobWVudSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIAorICAgIHB1YmxpYyBzdGF0aWMgaW50IHJldmVyc2VUcmFuc2l0KGludCB0cmFuc2l0KSB7CisgICAgICAgIGludCByZXYgPSAwOworICAgICAgICBzd2l0Y2ggKHRyYW5zaXQpIHsKKyAgICAgICAgICAgIGNhc2UgRnJhZ21lbnRUcmFuc2FjdGlvbi5UUkFOU0lUX0VOVEVSOgorICAgICAgICAgICAgICAgIHJldiA9IEZyYWdtZW50VHJhbnNhY3Rpb24uVFJBTlNJVF9FWElUOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBGcmFnbWVudFRyYW5zYWN0aW9uLlRSQU5TSVRfRVhJVDoKKyAgICAgICAgICAgICAgICByZXYgPSBGcmFnbWVudFRyYW5zYWN0aW9uLlRSQU5TSVRfRU5URVI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEZyYWdtZW50VHJhbnNhY3Rpb24uVFJBTlNJVF9TSE9XOgorICAgICAgICAgICAgICAgIHJldiA9IEZyYWdtZW50VHJhbnNhY3Rpb24uVFJBTlNJVF9ISURFOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBGcmFnbWVudFRyYW5zYWN0aW9uLlRSQU5TSVRfSElERToKKyAgICAgICAgICAgICAgICByZXYgPSBGcmFnbWVudFRyYW5zYWN0aW9uLlRSQU5TSVRfU0hPVzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRnJhZ21lbnRUcmFuc2FjdGlvbi5UUkFOU0lUX0FDVElWSVRZX09QRU46CisgICAgICAgICAgICAgICAgcmV2ID0gRnJhZ21lbnRUcmFuc2FjdGlvbi5UUkFOU0lUX0FDVElWSVRZX0NMT1NFOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBGcmFnbWVudFRyYW5zYWN0aW9uLlRSQU5TSVRfQUNUSVZJVFlfQ0xPU0U6CisgICAgICAgICAgICAgICAgcmV2ID0gRnJhZ21lbnRUcmFuc2FjdGlvbi5UUkFOU0lUX0FDVElWSVRZX09QRU47CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEZyYWdtZW50VHJhbnNhY3Rpb24uVFJBTlNJVF9UQVNLX09QRU46CisgICAgICAgICAgICAgICAgcmV2ID0gRnJhZ21lbnRUcmFuc2FjdGlvbi5UUkFOU0lUX1RBU0tfQ0xPU0U7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEZyYWdtZW50VHJhbnNhY3Rpb24uVFJBTlNJVF9UQVNLX0NMT1NFOgorICAgICAgICAgICAgICAgIHJldiA9IEZyYWdtZW50VHJhbnNhY3Rpb24uVFJBTlNJVF9UQVNLX09QRU47CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEZyYWdtZW50VHJhbnNhY3Rpb24uVFJBTlNJVF9UQVNLX1RPX0ZST05UOgorICAgICAgICAgICAgICAgIHJldiA9IEZyYWdtZW50VHJhbnNhY3Rpb24uVFJBTlNJVF9UQVNLX1RPX0JBQ0s7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEZyYWdtZW50VHJhbnNhY3Rpb24uVFJBTlNJVF9UQVNLX1RPX0JBQ0s6CisgICAgICAgICAgICAgICAgcmV2ID0gRnJhZ21lbnRUcmFuc2FjdGlvbi5UUkFOU0lUX1RBU0tfVE9fRlJPTlQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEZyYWdtZW50VHJhbnNhY3Rpb24uVFJBTlNJVF9XQUxMUEFQRVJfT1BFTjoKKyAgICAgICAgICAgICAgICByZXYgPSBGcmFnbWVudFRyYW5zYWN0aW9uLlRSQU5TSVRfV0FMTFBBUEVSX0NMT1NFOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBGcmFnbWVudFRyYW5zYWN0aW9uLlRSQU5TSVRfV0FMTFBBUEVSX0NMT1NFOgorICAgICAgICAgICAgICAgIHJldiA9IEZyYWdtZW50VHJhbnNhY3Rpb24uVFJBTlNJVF9XQUxMUEFQRVJfT1BFTjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRnJhZ21lbnRUcmFuc2FjdGlvbi5UUkFOU0lUX1dBTExQQVBFUl9JTlRSQV9PUEVOOgorICAgICAgICAgICAgICAgIHJldiA9IEZyYWdtZW50VHJhbnNhY3Rpb24uVFJBTlNJVF9XQUxMUEFQRVJfSU5UUkFfQ0xPU0U7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEZyYWdtZW50VHJhbnNhY3Rpb24uVFJBTlNJVF9XQUxMUEFQRVJfSU5UUkFfQ0xPU0U6CisgICAgICAgICAgICAgICAgcmV2ID0gRnJhZ21lbnRUcmFuc2FjdGlvbi5UUkFOU0lUX1dBTExQQVBFUl9JTlRSQV9PUEVOOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXY7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIGludCB0cmFuc2l0VG9TdHlsZUluZGV4KGludCB0cmFuc2l0LCBib29sZWFuIGVudGVyKSB7CisgICAgICAgIGludCBhbmltQXR0ciA9IC0xOworICAgICAgICBzd2l0Y2ggKHRyYW5zaXQpIHsKKyAgICAgICAgICAgIGNhc2UgRnJhZ21lbnRUcmFuc2FjdGlvbi5UUkFOU0lUX0VOVEVSOgorICAgICAgICAgICAgICAgIGFuaW1BdHRyID0gY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuV2luZG93QW5pbWF0aW9uX3dpbmRvd0VudGVyQW5pbWF0aW9uOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBGcmFnbWVudFRyYW5zYWN0aW9uLlRSQU5TSVRfRVhJVDoKKyAgICAgICAgICAgICAgICBhbmltQXR0ciA9IGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLldpbmRvd0FuaW1hdGlvbl93aW5kb3dFeGl0QW5pbWF0aW9uOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBGcmFnbWVudFRyYW5zYWN0aW9uLlRSQU5TSVRfU0hPVzoKKyAgICAgICAgICAgICAgICBhbmltQXR0ciA9IGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLldpbmRvd0FuaW1hdGlvbl93aW5kb3dTaG93QW5pbWF0aW9uOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBGcmFnbWVudFRyYW5zYWN0aW9uLlRSQU5TSVRfSElERToKKyAgICAgICAgICAgICAgICBhbmltQXR0ciA9IGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLldpbmRvd0FuaW1hdGlvbl93aW5kb3dIaWRlQW5pbWF0aW9uOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBGcmFnbWVudFRyYW5zYWN0aW9uLlRSQU5TSVRfQUNUSVZJVFlfT1BFTjoKKyAgICAgICAgICAgICAgICBhbmltQXR0ciA9IGVudGVyCisgICAgICAgICAgICAgICAgICAgICAgICA/IGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLldpbmRvd0FuaW1hdGlvbl9hY3Rpdml0eU9wZW5FbnRlckFuaW1hdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgOiBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5XaW5kb3dBbmltYXRpb25fYWN0aXZpdHlPcGVuRXhpdEFuaW1hdGlvbjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRnJhZ21lbnRUcmFuc2FjdGlvbi5UUkFOU0lUX0FDVElWSVRZX0NMT1NFOgorICAgICAgICAgICAgICAgIGFuaW1BdHRyID0gZW50ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgID8gY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuV2luZG93QW5pbWF0aW9uX2FjdGl2aXR5Q2xvc2VFbnRlckFuaW1hdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgOiBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5XaW5kb3dBbmltYXRpb25fYWN0aXZpdHlDbG9zZUV4aXRBbmltYXRpb247CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEZyYWdtZW50VHJhbnNhY3Rpb24uVFJBTlNJVF9UQVNLX09QRU46CisgICAgICAgICAgICAgICAgYW5pbUF0dHIgPSBlbnRlcgorICAgICAgICAgICAgICAgICAgICAgICAgPyBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5XaW5kb3dBbmltYXRpb25fdGFza09wZW5FbnRlckFuaW1hdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgOiBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5XaW5kb3dBbmltYXRpb25fdGFza09wZW5FeGl0QW5pbWF0aW9uOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBGcmFnbWVudFRyYW5zYWN0aW9uLlRSQU5TSVRfVEFTS19DTE9TRToKKyAgICAgICAgICAgICAgICBhbmltQXR0ciA9IGVudGVyCisgICAgICAgICAgICAgICAgICAgICAgICA/IGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLldpbmRvd0FuaW1hdGlvbl90YXNrQ2xvc2VFbnRlckFuaW1hdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgOiBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5XaW5kb3dBbmltYXRpb25fdGFza0Nsb3NlRXhpdEFuaW1hdGlvbjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRnJhZ21lbnRUcmFuc2FjdGlvbi5UUkFOU0lUX1RBU0tfVE9fRlJPTlQ6CisgICAgICAgICAgICAgICAgYW5pbUF0dHIgPSBlbnRlcgorICAgICAgICAgICAgICAgICAgICAgICAgPyBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5XaW5kb3dBbmltYXRpb25fdGFza1RvRnJvbnRFbnRlckFuaW1hdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgOiBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5XaW5kb3dBbmltYXRpb25fdGFza1RvRnJvbnRFeGl0QW5pbWF0aW9uOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBGcmFnbWVudFRyYW5zYWN0aW9uLlRSQU5TSVRfVEFTS19UT19CQUNLOgorICAgICAgICAgICAgICAgIGFuaW1BdHRyID0gZW50ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgID8gY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuV2luZG93QW5pbWF0aW9uX3Rhc2tUb0JhY2tFbnRlckFuaW1hdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgOiBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5XaW5kb3dBbmltYXRpb25fdGFza1RvQmFja0V4aXRBbmltYXRpb247CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEZyYWdtZW50VHJhbnNhY3Rpb24uVFJBTlNJVF9XQUxMUEFQRVJfT1BFTjoKKyAgICAgICAgICAgICAgICBhbmltQXR0ciA9IGVudGVyCisgICAgICAgICAgICAgICAgICAgICAgICA/IGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLldpbmRvd0FuaW1hdGlvbl93YWxscGFwZXJPcGVuRW50ZXJBbmltYXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgIDogY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuV2luZG93QW5pbWF0aW9uX3dhbGxwYXBlck9wZW5FeGl0QW5pbWF0aW9uOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBGcmFnbWVudFRyYW5zYWN0aW9uLlRSQU5TSVRfV0FMTFBBUEVSX0NMT1NFOgorICAgICAgICAgICAgICAgIGFuaW1BdHRyID0gZW50ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgID8gY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuV2luZG93QW5pbWF0aW9uX3dhbGxwYXBlckNsb3NlRW50ZXJBbmltYXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgIDogY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuV2luZG93QW5pbWF0aW9uX3dhbGxwYXBlckNsb3NlRXhpdEFuaW1hdGlvbjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRnJhZ21lbnRUcmFuc2FjdGlvbi5UUkFOU0lUX1dBTExQQVBFUl9JTlRSQV9PUEVOOgorICAgICAgICAgICAgICAgIGFuaW1BdHRyID0gZW50ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgID8gY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuV2luZG93QW5pbWF0aW9uX3dhbGxwYXBlckludHJhT3BlbkVudGVyQW5pbWF0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICA6IGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLldpbmRvd0FuaW1hdGlvbl93YWxscGFwZXJJbnRyYU9wZW5FeGl0QW5pbWF0aW9uOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBGcmFnbWVudFRyYW5zYWN0aW9uLlRSQU5TSVRfV0FMTFBBUEVSX0lOVFJBX0NMT1NFOgorICAgICAgICAgICAgICAgIGFuaW1BdHRyID0gZW50ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgID8gY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuV2luZG93QW5pbWF0aW9uX3dhbGxwYXBlckludHJhQ2xvc2VFbnRlckFuaW1hdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgOiBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5XaW5kb3dBbmltYXRpb25fd2FsbHBhcGVySW50cmFDbG9zZUV4aXRBbmltYXRpb247CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGFuaW1BdHRyOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9GcmFnbWVudFRyYW5zYWN0aW9uLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvRnJhZ21lbnRUcmFuc2FjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0MGYyNzQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvRnJhZ21lbnRUcmFuc2FjdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTUxIEBACitwYWNrYWdlIGFuZHJvaWQuYXBwOworCisvKioKKyAqIEFQSSBmb3IgcGVyZm9ybWluZyBhIHNldCBvZiBGcmFnbWVudCBvcGVyYXRpb25zLgorICovCitwdWJsaWMgaW50ZXJmYWNlIEZyYWdtZW50VHJhbnNhY3Rpb24geworICAgIC8qKgorICAgICAqIENhbGxzIHtAbGluayAjYWRkKGludCwgRnJhZ21lbnQsIFN0cmluZyl9IHdpdGggYSAwIGNvbnRhaW5lclZpZXdJZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgRnJhZ21lbnRUcmFuc2FjdGlvbiBhZGQoRnJhZ21lbnQgZnJhZ21lbnQsIFN0cmluZyB0YWcpOworICAgIAorICAgIC8qKgorICAgICAqIENhbGxzIHtAbGluayAjYWRkKGludCwgRnJhZ21lbnQsIFN0cmluZyl9IHdpdGggYSBudWxsIHRhZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgRnJhZ21lbnRUcmFuc2FjdGlvbiBhZGQoaW50IGNvbnRhaW5lclZpZXdJZCwgRnJhZ21lbnQgZnJhZ21lbnQpOworICAgIAorICAgIC8qKgorICAgICAqIEFkZCBhIGZyYWdtZW50IHRvIHRoZSBhY3Rpdml0eSBzdGF0ZS4gIFRoaXMgZnJhZ21lbnQgbWF5IG9wdGlvbmFsbHkKKyAgICAgKiBhbHNvIGhhdmUgaXRzIHZpZXcgKGlmIHtAbGluayBGcmFnbWVudCNvbkNyZWF0ZVZpZXcgRnJhZ21lbnQub25DcmVhdGVWaWV3fQorICAgICAqIHJldHVybnMgbm9uLW51bGwpIGludG8gYSBjb250YWluZXIgdmlldyBvZiB0aGUgYWN0aXZpdHkuCisgICAgICogCisgICAgICogQHBhcmFtIGNvbnRhaW5lclZpZXdJZCBPcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBjb250YWluZXIgdGhpcyBmcmFnbWVudCBpcworICAgICAqIHRvIGJlIHBsYWNlZCBpbi4gIElmIDAsIGl0IHdpbGwgbm90IGJlIHBsYWNlZCBpbiBhIGNvbnRhaW5lci4KKyAgICAgKiBAcGFyYW0gZnJhZ21lbnQgVGhlIGZyYWdtZW50IHRvIGJlIGFkZGVkLiAgVGhpcyBmcmFnbWVudCBtdXN0IG5vdCBhbHJlYWR5CisgICAgICogYmUgYWRkZWQgdG8gdGhlIGFjdGl2aXR5LgorICAgICAqIEBwYXJhbSB0YWcgT3B0aW9uYWwgdGFnIG5hbWUgZm9yIHRoZSBmcmFnbWVudCwgdG8gbGF0ZXIgcmV0cmlldmUgdGhlCisgICAgICogZnJhZ21lbnQgd2l0aCB7QGxpbmsgQWN0aXZpdHkjZmluZEZyYWdtZW50QnlUYWcoU3RyaW5nKQorICAgICAqIEFjdGl2aXR5LmZpbmRGcmFnbWVudEJ5VGFnKFN0cmluZyl9LgorICAgICAqIAorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgc2FtZSBGcmFnbWVudFRyYW5zYWN0aW9uIGluc3RhbmNlLgorICAgICAqLworICAgIHB1YmxpYyBGcmFnbWVudFRyYW5zYWN0aW9uIGFkZChpbnQgY29udGFpbmVyVmlld0lkLCBGcmFnbWVudCBmcmFnbWVudCwgU3RyaW5nIHRhZyk7CisgICAgCisgICAgLyoqCisgICAgICogQ2FsbHMge0BsaW5rICNyZXBsYWNlKGludCwgRnJhZ21lbnQsIFN0cmluZyl9IHdpdGggYSBudWxsIHRhZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgRnJhZ21lbnRUcmFuc2FjdGlvbiByZXBsYWNlKGludCBjb250YWluZXJWaWV3SWQsIEZyYWdtZW50IGZyYWdtZW50KTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXBsYWNlIGFuIGV4aXN0aW5nIGZyYWdtZW50IHRoYXQgd2FzIGFkZGVkIHRvIGEgY29udGFpbmVyLiAgVGhpcyBpcworICAgICAqIGVzc2VudGlhbGx5IHRoZSBzYW1lIGFzIGNhbGxpbmcge0BsaW5rICNyZW1vdmUoRnJhZ21lbnQpfSBmb3IgYWxsCisgICAgICogY3VycmVudGx5IGFkZGVkIGZyYWdtZW50cyB0aGF0IHdlcmUgYWRkZWQgd2l0aCB0aGUgc2FtZSBjb250YWluZXJWaWV3SWQKKyAgICAgKiBhbmQgdGhlbiB7QGxpbmsgI2FkZChpbnQsIEZyYWdtZW50LCBTdHJpbmcpfSB3aXRoIHRoZSBzYW1lIGFyZ3VtZW50cworICAgICAqIGdpdmVuIGhlcmUuCisgICAgICogCisgICAgICogQHBhcmFtIGNvbnRhaW5lclZpZXdJZCBJZGVudGlmaWVyIG9mIHRoZSBjb250YWluZXIgd2hvc2UgZnJhZ21lbnQocykgYXJlCisgICAgICogdG8gYmUgcmVwbGFjZWQuCisgICAgICogQHBhcmFtIGZyYWdtZW50IFRoZSBuZXcgZnJhZ21lbnQgdG8gcGxhY2UgaW4gdGhlIGNvbnRhaW5lci4KKyAgICAgKiBAcGFyYW0gdGFnIE9wdGlvbmFsIHRhZyBuYW1lIGZvciB0aGUgZnJhZ21lbnQsIHRvIGxhdGVyIHJldHJpZXZlIHRoZQorICAgICAqIGZyYWdtZW50IHdpdGgge0BsaW5rIEFjdGl2aXR5I2ZpbmRGcmFnbWVudEJ5VGFnKFN0cmluZykKKyAgICAgKiBBY3Rpdml0eS5maW5kRnJhZ21lbnRCeVRhZyhTdHJpbmcpfS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHNhbWUgRnJhZ21lbnRUcmFuc2FjdGlvbiBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgRnJhZ21lbnRUcmFuc2FjdGlvbiByZXBsYWNlKGludCBjb250YWluZXJWaWV3SWQsIEZyYWdtZW50IGZyYWdtZW50LCBTdHJpbmcgdGFnKTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYW4gZXhpc3RpbmcgZnJhZ21lbnQuICBJZiBpdCB3YXMgYWRkZWQgdG8gYSBjb250YWluZXIsIGl0cyB2aWV3CisgICAgICogaXMgYWxzbyByZW1vdmVkIGZyb20gdGhhdCBjb250YWluZXIuCisgICAgICogCisgICAgICogQHBhcmFtIGZyYWdtZW50IFRoZSBmcmFnbWVudCB0byBiZSByZW1vdmVkLgorICAgICAqIAorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgc2FtZSBGcmFnbWVudFRyYW5zYWN0aW9uIGluc3RhbmNlLgorICAgICAqLworICAgIHB1YmxpYyBGcmFnbWVudFRyYW5zYWN0aW9uIHJlbW92ZShGcmFnbWVudCBmcmFnbWVudCk7CisgICAgCisgICAgLyoqCisgICAgICogSGlkZXMgYW4gZXhpc3RpbmcgZnJhZ21lbnQuICBUaGlzIGlzIG9ubHkgcmVsZXZhbnQgZm9yIGZyYWdtZW50cyB3aG9zZQorICAgICAqIHZpZXdzIGhhdmUgYmVlbiBhZGRlZCB0byBhIGNvbnRhaW5lciwgYXMgdGhpcyB3aWxsIGNhdXNlIHRoZSB2aWV3IHRvCisgICAgICogYmUgaGlkZGVuLgorICAgICAqIAorICAgICAqIEBwYXJhbSBmcmFnbWVudCBUaGUgZnJhZ21lbnQgdG8gYmUgaGlkZGVuLgorICAgICAqIAorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgc2FtZSBGcmFnbWVudFRyYW5zYWN0aW9uIGluc3RhbmNlLgorICAgICAqLworICAgIHB1YmxpYyBGcmFnbWVudFRyYW5zYWN0aW9uIGhpZGUoRnJhZ21lbnQgZnJhZ21lbnQpOworICAgIAorICAgIC8qKgorICAgICAqIEhpZGVzIGEgcHJldmlvdXNseSBoaWRkZW4gZnJhZ21lbnQuICBUaGlzIGlzIG9ubHkgcmVsZXZhbnQgZm9yIGZyYWdtZW50cyB3aG9zZQorICAgICAqIHZpZXdzIGhhdmUgYmVlbiBhZGRlZCB0byBhIGNvbnRhaW5lciwgYXMgdGhpcyB3aWxsIGNhdXNlIHRoZSB2aWV3IHRvCisgICAgICogYmUgc2hvd24uCisgICAgICogCisgICAgICogQHBhcmFtIGZyYWdtZW50IFRoZSBmcmFnbWVudCB0byBiZSBzaG93bi4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHNhbWUgRnJhZ21lbnRUcmFuc2FjdGlvbiBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgRnJhZ21lbnRUcmFuc2FjdGlvbiBzaG93KEZyYWdtZW50IGZyYWdtZW50KTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBCaXQgbWFzayB0aGF0IGlzIHNldCBmb3IgYWxsIGVudGVyIHRyYW5zaXRpb25zLgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBpbnQgVFJBTlNJVF9FTlRFUl9NQVNLID0gMHgxMDAwOworICAgIAorICAgIC8qKgorICAgICAqIEJpdCBtYXNrIHRoYXQgaXMgc2V0IGZvciBhbGwgZXhpdCB0cmFuc2l0aW9ucy4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgaW50IFRSQU5TSVRfRVhJVF9NQVNLID0gMHgyMDAwOworICAgIAorICAgIC8qKiBOb3Qgc2V0IHVwIGZvciBhIHRyYW5zaXRpb24uICovCisgICAgcHVibGljIGZpbmFsIGludCBUUkFOU0lUX1VOU0VUID0gLTE7CisgICAgLyoqIE5vIGFuaW1hdGlvbiBmb3IgdHJhbnNpdGlvbi4gKi8KKyAgICBwdWJsaWMgZmluYWwgaW50IFRSQU5TSVRfTk9ORSA9IDA7CisgICAgLyoqIFdpbmRvdyBoYXMgYmVlbiBhZGRlZCB0byB0aGUgc2NyZWVuLiAqLworICAgIHB1YmxpYyBmaW5hbCBpbnQgVFJBTlNJVF9FTlRFUiA9IDEgfCBUUkFOU0lUX0VOVEVSX01BU0s7CisgICAgLyoqIFdpbmRvdyBoYXMgYmVlbiByZW1vdmVkIGZyb20gdGhlIHNjcmVlbi4gKi8KKyAgICBwdWJsaWMgZmluYWwgaW50IFRSQU5TSVRfRVhJVCA9IDIgfCBUUkFOU0lUX0VYSVRfTUFTSzsKKyAgICAvKiogV2luZG93IGhhcyBiZWVuIG1hZGUgdmlzaWJsZS4gKi8KKyAgICBwdWJsaWMgZmluYWwgaW50IFRSQU5TSVRfU0hPVyA9IDMgfCBUUkFOU0lUX0VOVEVSX01BU0s7CisgICAgLyoqIFdpbmRvdyBoYXMgYmVlbiBtYWRlIGludmlzaWJsZS4gKi8KKyAgICBwdWJsaWMgZmluYWwgaW50IFRSQU5TSVRfSElERSA9IDQgfCBUUkFOU0lUX0VYSVRfTUFTSzsKKyAgICAvKiogVGhlICJhcHBsaWNhdGlvbiBzdGFydGluZyIgcHJldmlldyB3aW5kb3cgaXMgbm8gbG9uZ2VyIG5lZWRlZCwgYW5kIHdpbGwKKyAgICAgKiBhbmltYXRlIGF3YXkgdG8gc2hvdyB0aGUgcmVhbCB3aW5kb3cuICovCisgICAgcHVibGljIGZpbmFsIGludCBUUkFOU0lUX1BSRVZJRVdfRE9ORSA9IDU7CisgICAgLyoqIEEgd2luZG93IGluIGEgbmV3IGFjdGl2aXR5IGlzIGJlaW5nIG9wZW5lZCBvbiB0b3Agb2YgYW4gZXhpc3Rpbmcgb25lCisgICAgICogaW4gdGhlIHNhbWUgdGFzay4gKi8KKyAgICBwdWJsaWMgZmluYWwgaW50IFRSQU5TSVRfQUNUSVZJVFlfT1BFTiA9IDYgfCBUUkFOU0lUX0VOVEVSX01BU0s7CisgICAgLyoqIFRoZSB3aW5kb3cgaW4gdGhlIHRvcC1tb3N0IGFjdGl2aXR5IGlzIGJlaW5nIGNsb3NlZCB0byByZXZlYWwgdGhlCisgICAgICogcHJldmlvdXMgYWN0aXZpdHkgaW4gdGhlIHNhbWUgdGFzay4gKi8KKyAgICBwdWJsaWMgZmluYWwgaW50IFRSQU5TSVRfQUNUSVZJVFlfQ0xPU0UgPSA3IHwgVFJBTlNJVF9FWElUX01BU0s7CisgICAgLyoqIEEgd2luZG93IGluIGEgbmV3IHRhc2sgaXMgYmVpbmcgb3BlbmVkIG9uIHRvcCBvZiBhbiBleGlzdGluZyBvbmUKKyAgICAgKiBpbiBhbm90aGVyIGFjdGl2aXR5J3MgdGFzay4gKi8KKyAgICBwdWJsaWMgZmluYWwgaW50IFRSQU5TSVRfVEFTS19PUEVOID0gOCB8IFRSQU5TSVRfRU5URVJfTUFTSzsKKyAgICAvKiogQSB3aW5kb3cgaW4gdGhlIHRvcC1tb3N0IGFjdGl2aXR5IGlzIGJlaW5nIGNsb3NlZCB0byByZXZlYWwgdGhlCisgICAgICogcHJldmlvdXMgYWN0aXZpdHkgaW4gYSBkaWZmZXJlbnQgdGFzay4gKi8KKyAgICBwdWJsaWMgZmluYWwgaW50IFRSQU5TSVRfVEFTS19DTE9TRSA9IDkgfCBUUkFOU0lUX0VYSVRfTUFTSzsKKyAgICAvKiogQSB3aW5kb3cgaW4gYW4gZXhpc3RpbmcgdGFzayBpcyBiZWluZyBkaXNwbGF5ZWQgb24gdG9wIG9mIGFuIGV4aXN0aW5nIG9uZQorICAgICAqIGluIGFub3RoZXIgYWN0aXZpdHkncyB0YXNrLiAqLworICAgIHB1YmxpYyBmaW5hbCBpbnQgVFJBTlNJVF9UQVNLX1RPX0ZST05UID0gMTAgfCBUUkFOU0lUX0VOVEVSX01BU0s7CisgICAgLyoqIEEgd2luZG93IGluIGFuIGV4aXN0aW5nIHRhc2sgaXMgYmVpbmcgcHV0IGJlbG93IGFsbCBvdGhlciB0YXNrcy4gKi8KKyAgICBwdWJsaWMgZmluYWwgaW50IFRSQU5TSVRfVEFTS19UT19CQUNLID0gMTEgfCBUUkFOU0lUX0VYSVRfTUFTSzsKKyAgICAvKiogQSB3aW5kb3cgaW4gYSBuZXcgYWN0aXZpdHkgdGhhdCBkb2Vzbid0IGhhdmUgYSB3YWxscGFwZXIgaXMgYmVpbmcKKyAgICAgKiBvcGVuZWQgb24gdG9wIG9mIG9uZSB0aGF0IGRvZXMsIGVmZmVjdGl2ZWx5IGNsb3NpbmcgdGhlIHdhbGxwYXBlci4gKi8KKyAgICBwdWJsaWMgZmluYWwgaW50IFRSQU5TSVRfV0FMTFBBUEVSX0NMT1NFID0gMTIgfCBUUkFOU0lUX0VYSVRfTUFTSzsKKyAgICAvKiogQSB3aW5kb3cgaW4gYSBuZXcgYWN0aXZpdHkgdGhhdCBkb2VzIGhhdmUgYSB3YWxscGFwZXIgaXMgYmVpbmcKKyAgICAgKiBvcGVuZWQgb24gb25lIHRoYXQgZGlkbid0LCBlZmZlY3RpdmVseSBvcGVuaW5nIHRoZSB3YWxscGFwZXIuICovCisgICAgcHVibGljIGZpbmFsIGludCBUUkFOU0lUX1dBTExQQVBFUl9PUEVOID0gMTMgfCBUUkFOU0lUX0VOVEVSX01BU0s7CisgICAgLyoqIEEgd2luZG93IGluIGEgbmV3IGFjdGl2aXR5IGlzIGJlaW5nIG9wZW5lZCBvbiB0b3Agb2YgYW4gZXhpc3Rpbmcgb25lLAorICAgICAqIGFuZCBib3RoIGFyZSBvbiB0b3Agb2YgdGhlIHdhbGxwYXBlci4gKi8KKyAgICBwdWJsaWMgZmluYWwgaW50IFRSQU5TSVRfV0FMTFBBUEVSX0lOVFJBX09QRU4gPSAxNCB8IFRSQU5TSVRfRU5URVJfTUFTSzsKKyAgICAvKiogVGhlIHdpbmRvdyBpbiB0aGUgdG9wLW1vc3QgYWN0aXZpdHkgaXMgYmVpbmcgY2xvc2VkIHRvIHJldmVhbCB0aGUKKyAgICAgKiBwcmV2aW91cyBhY3Rpdml0eSwgYW5kIGJvdGggYXJlIG9uIHRvcCBvZiBoZSB3YWxscGFwZXIuICovCisgICAgcHVibGljIGZpbmFsIGludCBUUkFOU0lUX1dBTExQQVBFUl9JTlRSQV9DTE9TRSA9IDE1IHwgVFJBTlNJVF9FWElUX01BU0s7CisgICAgCisgICAgcHVibGljIEZyYWdtZW50VHJhbnNhY3Rpb24gc2V0Q3VzdG9tQW5pbWF0aW9ucyhpbnQgZW50ZXIsIGludCBleGl0KTsKKyAgICAKKyAgICBwdWJsaWMgRnJhZ21lbnRUcmFuc2FjdGlvbiBzZXRUcmFuc2l0aW9uKGludCB0cmFuc2l0KTsKKyAgICBwdWJsaWMgRnJhZ21lbnRUcmFuc2FjdGlvbiBzZXRUcmFuc2l0aW9uU3R5bGUoaW50IHN0eWxlUmVzKTsKKyAgICAKKyAgICBwdWJsaWMgRnJhZ21lbnRUcmFuc2FjdGlvbiBhZGRUb0JhY2tTdGFjayhTdHJpbmcgbmFtZSk7CisgICAgcHVibGljIHZvaWQgY29tbWl0KCk7Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvSW5zdHJ1bWVudGF0aW9uLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvSW5zdHJ1bWVudGF0aW9uLmphdmEKaW5kZXggYjhjM2FhMy4uNGQ1ZjM2YSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0luc3RydW1lbnRhdGlvbi5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9JbnN0cnVtZW50YXRpb24uamF2YQpAQCAtOTk3LDggKzk5NywxMCBAQAogICAgICAgICAgICAgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiB7CiAgICAgICAgIEFjdGl2aXR5IGFjdGl2aXR5ID0gKEFjdGl2aXR5KWNsYXp6Lm5ld0luc3RhbmNlKCk7CiAgICAgICAgIEFjdGl2aXR5VGhyZWFkIGFUaHJlYWQgPSBudWxsOwotICAgICAgICBhY3Rpdml0eS5hdHRhY2goY29udGV4dCwgYVRocmVhZCwgdGhpcywgdG9rZW4sIGFwcGxpY2F0aW9uLCBpbnRlbnQsIGluZm8sIHRpdGxlLAotICAgICAgICAgICAgICAgIHBhcmVudCwgaWQsIGxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2UsIG5ldyBDb25maWd1cmF0aW9uKCkpOworICAgICAgICBhY3Rpdml0eS5hdHRhY2goY29udGV4dCwgYVRocmVhZCwgdGhpcywgdG9rZW4sIGFwcGxpY2F0aW9uLCBpbnRlbnQsCisgICAgICAgICAgICAgICAgaW5mbywgdGl0bGUsIHBhcmVudCwgaWQsCisgICAgICAgICAgICAgICAgKEFjdGl2aXR5Lk5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZXMpbGFzdE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZSwKKyAgICAgICAgICAgICAgICBuZXcgQ29uZmlndXJhdGlvbigpKTsKICAgICAgICAgcmV0dXJuIGFjdGl2aXR5OwogICAgIH0KIApAQCAtMTA1OCwyMSArMTA2MCwyMyBAQAogICAgIH0KICAgICAKICAgICBwdWJsaWMgdm9pZCBjYWxsQWN0aXZpdHlPbkRlc3Ryb3koQWN0aXZpdHkgYWN0aXZpdHkpIHsKLSAgICAgIGlmIChtV2FpdGluZ0FjdGl2aXRpZXMgIT0gbnVsbCkgewotICAgICAgICAgIHN5bmNocm9uaXplZCAobVN5bmMpIHsKLSAgICAgICAgICAgICAgZmluYWwgaW50IE4gPSBtV2FpdGluZ0FjdGl2aXRpZXMuc2l6ZSgpOwotICAgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8TjsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICBmaW5hbCBBY3Rpdml0eVdhaXRlciBhdyA9IG1XYWl0aW5nQWN0aXZpdGllcy5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgICBmaW5hbCBJbnRlbnQgaW50ZW50ID0gYXcuaW50ZW50OwotICAgICAgICAgICAgICAgICAgaWYgKGludGVudC5maWx0ZXJFcXVhbHMoYWN0aXZpdHkuZ2V0SW50ZW50KCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgYXcuYWN0aXZpdHkgPSBhY3Rpdml0eTsKLSAgICAgICAgICAgICAgICAgICAgICBtTWVzc2FnZVF1ZXVlLmFkZElkbGVIYW5kbGVyKG5ldyBBY3Rpdml0eUdvaW5nKGF3KSk7Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICB9CisgICAgICAvLyBUT0RPOiB0aGUgZm9sbG93aW5nIGJsb2NrIGNhdXNlcyBpbnRlcm1pdHRlbnQgaGFuZ3Mgd2hlbiB1c2luZyBzdGFydEFjdGl2aXR5CisgICAgICAvLyB0ZW1wb3JhcmlseSBjb21tZW50IG91dCB1bnRpbCByb290IGNhdXNlIGlzIGZpeGVkIChidWcgMjYzMDY4MykKKy8vICAgICAgaWYgKG1XYWl0aW5nQWN0aXZpdGllcyAhPSBudWxsKSB7CisvLyAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1TeW5jKSB7CisvLyAgICAgICAgICAgICAgZmluYWwgaW50IE4gPSBtV2FpdGluZ0FjdGl2aXRpZXMuc2l6ZSgpOworLy8gICAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxOOyBpKyspIHsKKy8vICAgICAgICAgICAgICAgICAgZmluYWwgQWN0aXZpdHlXYWl0ZXIgYXcgPSBtV2FpdGluZ0FjdGl2aXRpZXMuZ2V0KGkpOworLy8gICAgICAgICAgICAgICAgICBmaW5hbCBJbnRlbnQgaW50ZW50ID0gYXcuaW50ZW50OworLy8gICAgICAgICAgICAgICAgICBpZiAoaW50ZW50LmZpbHRlckVxdWFscyhhY3Rpdml0eS5nZXRJbnRlbnQoKSkpIHsKKy8vICAgICAgICAgICAgICAgICAgICAgIGF3LmFjdGl2aXR5ID0gYWN0aXZpdHk7CisvLyAgICAgICAgICAgICAgICAgICAgICBtTWVzc2FnZVF1ZXVlLmFkZElkbGVIYW5kbGVyKG5ldyBBY3Rpdml0eUdvaW5nKGF3KSk7CisvLyAgICAgICAgICAgICAgICAgIH0KKy8vICAgICAgICAgICAgICB9CisvLyAgICAgICAgICB9CisvLyAgICAgIH0KICAgICAgIAotICAgICAgYWN0aXZpdHkub25EZXN0cm95KCk7CisgICAgICBhY3Rpdml0eS5wZXJmb3JtRGVzdHJveSgpOwogICAgICAgCiAgICAgICBpZiAobUFjdGl2aXR5TW9uaXRvcnMgIT0gbnVsbCkgewogICAgICAgICAgIHN5bmNocm9uaXplZCAobVN5bmMpIHsKQEAgLTEzMzEsNyArMTMzNSw3IEBACiAgICAgICogICAgICAgICAgICAgICAgICAgICAgaXMgYmVpbmcgc3RhcnRlZC4KICAgICAgKiBAcGFyYW0gdG9rZW4gSW50ZXJuYWwgdG9rZW4gaWRlbnRpZnlpbmcgdG8gdGhlIHN5c3RlbSB3aG8gaXMgc3RhcnRpbmcgCiAgICAgICogICAgICAgICAgICAgIHRoZSBhY3Rpdml0eTsgbWF5IGJlIG51bGwuCi0gICAgICogQHBhcmFtIHRhcmdldCBXaGljaCBhY3Rpdml0eSBpcyBwZXJmb3JtIHRoZSBzdGFydCAoYW5kIHRodXMgcmVjZWl2aW5nIAorICAgICAqIEBwYXJhbSB0YXJnZXQgV2hpY2ggYWN0aXZpdHkgaXMgcGVyZm9ybWluZyB0aGUgc3RhcnQgKGFuZCB0aHVzIHJlY2VpdmluZyAKICAgICAgKiAgICAgICAgICAgICAgIGFueSByZXN1bHQpOyBtYXkgYmUgbnVsbCBpZiB0aGlzIGNhbGwgaXMgbm90IGJlaW5nIG1hZGUKICAgICAgKiAgICAgICAgICAgICAgIGZyb20gYW4gYWN0aXZpdHkuCiAgICAgICogQHBhcmFtIGludGVudCBUaGUgYWN0dWFsIEludGVudCB0byBzdGFydC4KQEAgLTEzODEsNiArMTM4NSw2NCBAQAogICAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBMaWtlIHtAbGluayAjZXhlY1N0YXJ0QWN0aXZpdHkoQ29udGV4dCwgSUJpbmRlciwgSUJpbmRlciwgQWN0aXZpdHksIEludGVudCwgaW50KX0sCisgICAgICogYnV0IGZvciBjYWxscyBmcm9tIGEgeyNsaW5rIEZyYWdtZW50fS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gd2hvIFRoZSBDb250ZXh0IGZyb20gd2hpY2ggdGhlIGFjdGl2aXR5IGlzIGJlaW5nIHN0YXJ0ZWQuCisgICAgICogQHBhcmFtIGNvbnRleHRUaHJlYWQgVGhlIG1haW4gdGhyZWFkIG9mIHRoZSBDb250ZXh0IGZyb20gd2hpY2ggdGhlIGFjdGl2aXR5CisgICAgICogICAgICAgICAgICAgICAgICAgICAgaXMgYmVpbmcgc3RhcnRlZC4KKyAgICAgKiBAcGFyYW0gdG9rZW4gSW50ZXJuYWwgdG9rZW4gaWRlbnRpZnlpbmcgdG8gdGhlIHN5c3RlbSB3aG8gaXMgc3RhcnRpbmcgCisgICAgICogICAgICAgICAgICAgIHRoZSBhY3Rpdml0eTsgbWF5IGJlIG51bGwuCisgICAgICogQHBhcmFtIHRhcmdldCBXaGljaCBmcmFnbWVudCBpcyBwZXJmb3JtaW5nIHRoZSBzdGFydCAoYW5kIHRodXMgcmVjZWl2aW5nIAorICAgICAqICAgICAgICAgICAgICAgYW55IHJlc3VsdCkuCisgICAgICogQHBhcmFtIGludGVudCBUaGUgYWN0dWFsIEludGVudCB0byBzdGFydC4KKyAgICAgKiBAcGFyYW0gcmVxdWVzdENvZGUgSWRlbnRpZmllciBmb3IgdGhpcyByZXF1ZXN0J3MgcmVzdWx0OyBsZXNzIHRoYW4gemVybyAKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgaWYgdGhlIGNhbGxlciBpcyBub3QgZXhwZWN0aW5nIGEgcmVzdWx0LgorICAgICAqIAorICAgICAqIEByZXR1cm4gVG8gZm9yY2UgdGhlIHJldHVybiBvZiBhIHBhcnRpY3VsYXIgcmVzdWx0LCByZXR1cm4gYW4gCisgICAgICogICAgICAgICBBY3Rpdml0eVJlc3VsdCBvYmplY3QgY29udGFpbmluZyB0aGUgZGVzaXJlZCBkYXRhOyBvdGhlcndpc2UKKyAgICAgKiAgICAgICAgIHJldHVybiBudWxsLiAgVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gYWx3YXlzIHJldHVybnMgbnVsbC4KKyAgICAgKiAgCisgICAgICogQHRocm93cyBhbmRyb2lkLmNvbnRlbnQuQWN0aXZpdHlOb3RGb3VuZEV4Y2VwdGlvbgorICAgICAqIAorICAgICAqIEBzZWUgQWN0aXZpdHkjc3RhcnRBY3Rpdml0eShJbnRlbnQpCisgICAgICogQHNlZSBBY3Rpdml0eSNzdGFydEFjdGl2aXR5Rm9yUmVzdWx0KEludGVudCwgaW50KQorICAgICAqIEBzZWUgQWN0aXZpdHkjc3RhcnRBY3Rpdml0eUZyb21DaGlsZAorICAgICAqIAorICAgICAqIHtAaGlkZX0KKyAgICAgKi8KKyAgICBwdWJsaWMgQWN0aXZpdHlSZXN1bHQgZXhlY1N0YXJ0QWN0aXZpdHkoCisgICAgICAgIENvbnRleHQgd2hvLCBJQmluZGVyIGNvbnRleHRUaHJlYWQsIElCaW5kZXIgdG9rZW4sIEZyYWdtZW50IHRhcmdldCwKKyAgICAgICAgSW50ZW50IGludGVudCwgaW50IHJlcXVlc3RDb2RlKSB7CisgICAgICAgIElBcHBsaWNhdGlvblRocmVhZCB3aG9UaHJlYWQgPSAoSUFwcGxpY2F0aW9uVGhyZWFkKSBjb250ZXh0VGhyZWFkOworICAgICAgICBpZiAobUFjdGl2aXR5TW9uaXRvcnMgIT0gbnVsbCkgeworICAgICAgICAgICAgc3luY2hyb25pemVkIChtU3luYykgeworICAgICAgICAgICAgICAgIGZpbmFsIGludCBOID0gbUFjdGl2aXR5TW9uaXRvcnMuc2l6ZSgpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxOOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgQWN0aXZpdHlNb25pdG9yIGFtID0gbUFjdGl2aXR5TW9uaXRvcnMuZ2V0KGkpOworICAgICAgICAgICAgICAgICAgICBpZiAoYW0ubWF0Y2god2hvLCBudWxsLCBpbnRlbnQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbS5tSGl0cysrOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFtLmlzQmxvY2tpbmcoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXF1ZXN0Q29kZSA+PSAwID8gYW0uZ2V0UmVzdWx0KCkgOiBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCByZXN1bHQgPSBBY3Rpdml0eU1hbmFnZXJOYXRpdmUuZ2V0RGVmYXVsdCgpCisgICAgICAgICAgICAgICAgLnN0YXJ0QWN0aXZpdHkod2hvVGhyZWFkLCBpbnRlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnRlbnQucmVzb2x2ZVR5cGVJZk5lZWRlZCh3aG8uZ2V0Q29udGVudFJlc29sdmVyKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgMCwgdG9rZW4sIHRhcmdldCAhPSBudWxsID8gdGFyZ2V0Lm1XaG8gOiBudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdENvZGUsIGZhbHNlLCBmYWxzZSk7CisgICAgICAgICAgICBjaGVja1N0YXJ0QWN0aXZpdHlSZXN1bHQocmVzdWx0LCBpbnRlbnQpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKwogICAgIC8qcGFja2FnZSovIGZpbmFsIHZvaWQgaW5pdChBY3Rpdml0eVRocmVhZCB0aHJlYWQsCiAgICAgICAgICAgICBDb250ZXh0IGluc3RyQ29udGV4dCwgQ29udGV4dCBhcHBDb250ZXh0LCBDb21wb25lbnROYW1lIGNvbXBvbmVudCwgCiAgICAgICAgICAgICBJSW5zdHJ1bWVudGF0aW9uV2F0Y2hlciB3YXRjaGVyKSB7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvTGlzdEZyYWdtZW50LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvTGlzdEZyYWdtZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQ4ZWM5OAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9MaXN0RnJhZ21lbnQuamF2YQpAQCAtMCwwICsxLDI4MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5hcHA7CisKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQWRhcHRlclZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGlzdEFkYXB0ZXI7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGlzdFZpZXc7CisKKy8qKgorICogQW4gZnJhZ21lbnQgdGhhdCBkaXNwbGF5cyBhIGxpc3Qgb2YgaXRlbXMgYnkgYmluZGluZyB0byBhIGRhdGEgc291cmNlIHN1Y2ggYXMKKyAqIGFuIGFycmF5IG9yIEN1cnNvciwgYW5kIGV4cG9zZXMgZXZlbnQgaGFuZGxlcnMgd2hlbiB0aGUgdXNlciBzZWxlY3RzIGFuIGl0ZW0uCisgKiA8cD4KKyAqIExpc3RBY3Rpdml0eSBob3N0cyBhIHtAbGluayBhbmRyb2lkLndpZGdldC5MaXN0VmlldyBMaXN0Vmlld30gb2JqZWN0IHRoYXQgY2FuCisgKiBiZSBib3VuZCB0byBkaWZmZXJlbnQgZGF0YSBzb3VyY2VzLCB0eXBpY2FsbHkgZWl0aGVyIGFuIGFycmF5IG9yIGEgQ3Vyc29yCisgKiBob2xkaW5nIHF1ZXJ5IHJlc3VsdHMuIEJpbmRpbmcsIHNjcmVlbiBsYXlvdXQsIGFuZCByb3cgbGF5b3V0IGFyZSBkaXNjdXNzZWQKKyAqIGluIHRoZSBmb2xsb3dpbmcgc2VjdGlvbnMuCisgKiA8cD4KKyAqIDxzdHJvbmc+U2NyZWVuIExheW91dDwvc3Ryb25nPgorICogPC9wPgorICogPHA+CisgKiBMaXN0QWN0aXZpdHkgaGFzIGEgZGVmYXVsdCBsYXlvdXQgdGhhdCBjb25zaXN0cyBvZiBhIHNpbmdsZSBsaXN0IHZpZXcuCisgKiBIb3dldmVyLCBpZiB5b3UgZGVzaXJlLCB5b3UgY2FuIGN1c3RvbWl6ZSB0aGUgZnJhZ21lbnQgbGF5b3V0IGJ5IHJldHVybmluZworICogeW91ciBvd24gdmlldyBoaWVyYXJjaHkgZnJvbSB7QGxpbmsgI29uQ3JlYXRlVmlld30uCisgKiBUbyBkbyB0aGlzLCB5b3VyIHZpZXcgaGllcmFyY2h5IE1VU1QgY29udGFpbiBhIExpc3RWaWV3IG9iamVjdCB3aXRoIHRoZQorICogaWQgIkBhbmRyb2lkOmlkL2xpc3QiIChvciB7QGxpbmsgYW5kcm9pZC5SLmlkI2xpc3R9IGlmIGl0J3MgaW4gY29kZSkKKyAqIDxwPgorICogT3B0aW9uYWxseSwgeW91ciB2aWV3IGhpZXJhcmNoeSBjYW4gY29udGFpbiBhbm90aGVyIHZpZXcgb2JqZWN0IG9mIGFueSB0eXBlIHRvCisgKiBkaXNwbGF5IHdoZW4gdGhlIGxpc3QgdmlldyBpcyBlbXB0eS4gVGhpcyAiZW1wdHkgbGlzdCIgbm90aWZpZXIgbXVzdCBoYXZlIGFuCisgKiBpZCAiYW5kcm9pZDplbXB0eSIuIE5vdGUgdGhhdCB3aGVuIGFuIGVtcHR5IHZpZXcgaXMgcHJlc2VudCwgdGhlIGxpc3QgdmlldworICogd2lsbCBiZSBoaWRkZW4gd2hlbiB0aGVyZSBpcyBubyBkYXRhIHRvIGRpc3BsYXkuCisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgY29kZSBkZW1vbnN0cmF0ZXMgYW4gKHVnbHkpIGN1c3RvbSBsaXN5IGxheW91dC4gSXQgaGFzIGEgbGlzdAorICogd2l0aCBhIGdyZWVuIGJhY2tncm91bmQsIGFuZCBhbiBhbHRlcm5hdGUgcmVkICJubyBkYXRhIiBtZXNzYWdlLgorICogPC9wPgorICoKKyAqIDxwcmU+CisgKiAmbHQ7P3htbCB2ZXJzaW9uPSZxdW90OzEuMCZxdW90OyBlbmNvZGluZz0mcXVvdDt1dGYtOCZxdW90Oz8mZ3Q7CisgKiAmbHQ7TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAqICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0mcXVvdDt2ZXJ0aWNhbCZxdW90OworICogICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0mcXVvdDttYXRjaF9wYXJlbnQmcXVvdDsKKyAqICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSZxdW90O21hdGNoX3BhcmVudCZxdW90OworICogICAgICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSZxdW90OzhkcCZxdW90OworICogICAgICAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0mcXVvdDs4ZHAmcXVvdDsmZ3Q7CisgKgorICogICAgICZsdDtMaXN0VmlldyBhbmRyb2lkOmlkPSZxdW90O0BpZC9hbmRyb2lkOmxpc3QmcXVvdDsKKyAqICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9JnF1b3Q7bWF0Y2hfcGFyZW50JnF1b3Q7CisgKiAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0mcXVvdDttYXRjaF9wYXJlbnQmcXVvdDsKKyAqICAgICAgICAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSZxdW90OyMwMEZGMDAmcXVvdDsKKyAqICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSZxdW90OzEmcXVvdDsKKyAqICAgICAgICAgICAgICAgYW5kcm9pZDpkcmF3U2VsZWN0b3JPblRvcD0mcXVvdDtmYWxzZSZxdW90Oy8mZ3Q7CisgKgorICogICAgICZsdDtUZXh0VmlldyBhbmRyb2lkOmlkPSZxdW90O0BpZC9hbmRyb2lkOmVtcHR5JnF1b3Q7CisgKiAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSZxdW90O21hdGNoX3BhcmVudCZxdW90OworICogICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9JnF1b3Q7bWF0Y2hfcGFyZW50JnF1b3Q7CisgKiAgICAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0mcXVvdDsjRkYwMDAwJnF1b3Q7CisgKiAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0mcXVvdDtObyBkYXRhJnF1b3Q7LyZndDsKKyAqICZsdDsvTGluZWFyTGF5b3V0Jmd0OworICogPC9wcmU+CisgKgorICogPHA+CisgKiA8c3Ryb25nPlJvdyBMYXlvdXQ8L3N0cm9uZz4KKyAqIDwvcD4KKyAqIDxwPgorICogWW91IGNhbiBzcGVjaWZ5IHRoZSBsYXlvdXQgb2YgaW5kaXZpZHVhbCByb3dzIGluIHRoZSBsaXN0LiBZb3UgZG8gdGhpcyBieQorICogc3BlY2lmeWluZyBhIGxheW91dCByZXNvdXJjZSBpbiB0aGUgTGlzdEFkYXB0ZXIgb2JqZWN0IGhvc3RlZCBieSB0aGUgZnJhZ21lbnQKKyAqICh0aGUgTGlzdEFkYXB0ZXIgYmluZHMgdGhlIExpc3RWaWV3IHRvIHRoZSBkYXRhOyBtb3JlIG9uIHRoaXMgbGF0ZXIpLgorICogPHA+CisgKiBBIExpc3RBZGFwdGVyIGNvbnN0cnVjdG9yIHRha2VzIGEgcGFyYW1ldGVyIHRoYXQgc3BlY2lmaWVzIGEgbGF5b3V0IHJlc291cmNlCisgKiBmb3IgZWFjaCByb3cuIEl0IGFsc28gaGFzIHR3byBhZGRpdGlvbmFsIHBhcmFtZXRlcnMgdGhhdCBsZXQgeW91IHNwZWNpZnkKKyAqIHdoaWNoIGRhdGEgZmllbGQgdG8gYXNzb2NpYXRlIHdpdGggd2hpY2ggb2JqZWN0IGluIHRoZSByb3cgbGF5b3V0IHJlc291cmNlLgorICogVGhlc2UgdHdvIHBhcmFtZXRlcnMgYXJlIHR5cGljYWxseSBwYXJhbGxlbCBhcnJheXMuCisgKiA8L3A+CisgKiA8cD4KKyAqIEFuZHJvaWQgcHJvdmlkZXMgc29tZSBzdGFuZGFyZCByb3cgbGF5b3V0IHJlc291cmNlcy4gVGhlc2UgYXJlIGluIHRoZQorICoge0BsaW5rIGFuZHJvaWQuUi5sYXlvdXR9IGNsYXNzLCBhbmQgaGF2ZSBuYW1lcyBzdWNoIGFzIHNpbXBsZV9saXN0X2l0ZW1fMSwKKyAqIHNpbXBsZV9saXN0X2l0ZW1fMiwgYW5kIHR3b19saW5lX2xpc3RfaXRlbS4gVGhlIGZvbGxvd2luZyBsYXlvdXQgWE1MIGlzIHRoZQorICogc291cmNlIGZvciB0aGUgcmVzb3VyY2UgdHdvX2xpbmVfbGlzdF9pdGVtLCB3aGljaCBkaXNwbGF5cyB0d28gZGF0YQorICogZmllbGRzLG9uZSBhYm92ZSB0aGUgb3RoZXIsIGZvciBlYWNoIGxpc3Qgcm93LgorICogPC9wPgorICoKKyAqIDxwcmU+CisgKiAmbHQ7P3htbCB2ZXJzaW9uPSZxdW90OzEuMCZxdW90OyBlbmNvZGluZz0mcXVvdDt1dGYtOCZxdW90Oz8mZ3Q7CisgKiAmbHQ7TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAqICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0mcXVvdDttYXRjaF9wYXJlbnQmcXVvdDsKKyAqICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9JnF1b3Q7d3JhcF9jb250ZW50JnF1b3Q7CisgKiAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0mcXVvdDt2ZXJ0aWNhbCZxdW90OyZndDsKKyAqCisgKiAgICAgJmx0O1RleHRWaWV3IGFuZHJvaWQ6aWQ9JnF1b3Q7QCtpZC90ZXh0MSZxdW90OworICogICAgICAgICBhbmRyb2lkOnRleHRTaXplPSZxdW90OzE2c3AmcXVvdDsKKyAqICAgICAgICAgYW5kcm9pZDp0ZXh0U3R5bGU9JnF1b3Q7Ym9sZCZxdW90OworICogICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0mcXVvdDttYXRjaF9wYXJlbnQmcXVvdDsKKyAqICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSZxdW90O3dyYXBfY29udGVudCZxdW90Oy8mZ3Q7CisgKgorICogICAgICZsdDtUZXh0VmlldyBhbmRyb2lkOmlkPSZxdW90O0AraWQvdGV4dDImcXVvdDsKKyAqICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0mcXVvdDsxNnNwJnF1b3Q7CisgKiAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSZxdW90O21hdGNoX3BhcmVudCZxdW90OworICogICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9JnF1b3Q7d3JhcF9jb250ZW50JnF1b3Q7LyZndDsKKyAqICZsdDsvTGluZWFyTGF5b3V0Jmd0OworICogPC9wcmU+CisgKgorICogPHA+CisgKiBZb3UgbXVzdCBpZGVudGlmeSB0aGUgZGF0YSBib3VuZCB0byBlYWNoIFRleHRWaWV3IG9iamVjdCBpbiB0aGlzIGxheW91dC4gVGhlCisgKiBzeW50YXggZm9yIHRoaXMgaXMgZGlzY3Vzc2VkIGluIHRoZSBuZXh0IHNlY3Rpb24uCisgKiA8L3A+CisgKiA8cD4KKyAqIDxzdHJvbmc+QmluZGluZyB0byBEYXRhPC9zdHJvbmc+CisgKiA8L3A+CisgKiA8cD4KKyAqIFlvdSBiaW5kIHRoZSBMaXN0RnJhZ21lbnQncyBMaXN0VmlldyBvYmplY3QgdG8gZGF0YSB1c2luZyBhIGNsYXNzIHRoYXQKKyAqIGltcGxlbWVudHMgdGhlIHtAbGluayBhbmRyb2lkLndpZGdldC5MaXN0QWRhcHRlciBMaXN0QWRhcHRlcn0gaW50ZXJmYWNlLgorICogQW5kcm9pZCBwcm92aWRlcyB0d28gc3RhbmRhcmQgbGlzdCBhZGFwdGVyczoKKyAqIHtAbGluayBhbmRyb2lkLndpZGdldC5TaW1wbGVBZGFwdGVyIFNpbXBsZUFkYXB0ZXJ9IGZvciBzdGF0aWMgZGF0YSAoTWFwcyksCisgKiBhbmQge0BsaW5rIGFuZHJvaWQud2lkZ2V0LlNpbXBsZUN1cnNvckFkYXB0ZXIgU2ltcGxlQ3Vyc29yQWRhcHRlcn0gZm9yIEN1cnNvcgorICogcXVlcnkgcmVzdWx0cy4KKyAqIDwvcD4KKyAqCisgKiBAc2VlICNzZXRMaXN0QWRhcHRlcgorICogQHNlZSBhbmRyb2lkLndpZGdldC5MaXN0VmlldworICovCitwdWJsaWMgY2xhc3MgTGlzdEZyYWdtZW50IGV4dGVuZHMgRnJhZ21lbnQgeworICAgIGZpbmFsIHByaXZhdGUgSGFuZGxlciBtSGFuZGxlciA9IG5ldyBIYW5kbGVyKCk7CisKKyAgICBmaW5hbCBwcml2YXRlIFJ1bm5hYmxlIG1SZXF1ZXN0Rm9jdXMgPSBuZXcgUnVubmFibGUoKSB7CisgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgIG1MaXN0LmZvY3VzYWJsZVZpZXdBdmFpbGFibGUobUxpc3QpOworICAgICAgICB9CisgICAgfTsKKyAgICAKKyAgICBmaW5hbCBwcml2YXRlIEFkYXB0ZXJWaWV3Lk9uSXRlbUNsaWNrTGlzdGVuZXIgbU9uQ2xpY2tMaXN0ZW5lcgorICAgICAgICAgICAgPSBuZXcgQWRhcHRlclZpZXcuT25JdGVtQ2xpY2tMaXN0ZW5lcigpIHsKKyAgICAgICAgcHVibGljIHZvaWQgb25JdGVtQ2xpY2soQWRhcHRlclZpZXc8Pz4gcGFyZW50LCBWaWV3IHYsIGludCBwb3NpdGlvbiwgbG9uZyBpZCkgeworICAgICAgICAgICAgb25MaXN0SXRlbUNsaWNrKChMaXN0VmlldylwYXJlbnQsIHYsIHBvc2l0aW9uLCBpZCk7CisgICAgICAgIH0KKyAgICB9OworCisgICAgTGlzdEFkYXB0ZXIgbUFkYXB0ZXI7CisgICAgTGlzdFZpZXcgbUxpc3Q7CisKKyAgICBwdWJsaWMgTGlzdEZyYWdtZW50KCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIFByb3ZpZGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB0byByZXR1cm4gYSBzaW1wbGUgbGlzdCB2aWV3LgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBWaWV3IG9uQ3JlYXRlVmlldyhMYXlvdXRJbmZsYXRlciBpbmZsYXRlciwgVmlld0dyb3VwIGNvbnRhaW5lciwKKyAgICAgICAgICAgIEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgcmV0dXJuIGluZmxhdGVyLmluZmxhdGUoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5sYXlvdXQubGlzdF9jb250ZW50LAorICAgICAgICAgICAgICAgIGNvbnRhaW5lciwgZmFsc2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEF0dGFjaCB0byBsaXN0IHZpZXcgb25jZSBGcmFnbWVudCBpcyByZWFkeSB0byBydW4uCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25SZWFkeShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uUmVhZHkoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKyAgICAgICAgZW5zdXJlTGlzdCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIERldGFjaCBmcm9tIGxpc3Qgdmlldy4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkRlc3Ryb3lWaWV3KCkgeworICAgICAgICBtSGFuZGxlci5yZW1vdmVDYWxsYmFja3MobVJlcXVlc3RGb2N1cyk7CisgICAgICAgIG1MaXN0ID0gbnVsbDsKKyAgICAgICAgc3VwZXIub25EZXN0cm95VmlldygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIHdoZW4gYW4gaXRlbSBpbiB0aGUgbGlzdCBpcyBzZWxlY3RlZC4KKyAgICAgKiBTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZS4gU3ViY2xhc3NlcyBjYW4gY2FsbAorICAgICAqIGdldExpc3RWaWV3KCkuZ2V0SXRlbUF0UG9zaXRpb24ocG9zaXRpb24pIGlmIHRoZXkgbmVlZCB0byBhY2Nlc3MgdGhlCisgICAgICogZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIHNlbGVjdGVkIGl0ZW0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gbCBUaGUgTGlzdFZpZXcgd2hlcmUgdGhlIGNsaWNrIGhhcHBlbmVkCisgICAgICogQHBhcmFtIHYgVGhlIHZpZXcgdGhhdCB3YXMgY2xpY2tlZCB3aXRoaW4gdGhlIExpc3RWaWV3CisgICAgICogQHBhcmFtIHBvc2l0aW9uIFRoZSBwb3NpdGlvbiBvZiB0aGUgdmlldyBpbiB0aGUgbGlzdAorICAgICAqIEBwYXJhbSBpZCBUaGUgcm93IGlkIG9mIHRoZSBpdGVtIHRoYXQgd2FzIGNsaWNrZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBvbkxpc3RJdGVtQ2xpY2soTGlzdFZpZXcgbCwgVmlldyB2LCBpbnQgcG9zaXRpb24sIGxvbmcgaWQpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcm92aWRlIHRoZSBjdXJzb3IgZm9yIHRoZSBsaXN0IHZpZXcuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TGlzdEFkYXB0ZXIoTGlzdEFkYXB0ZXIgYWRhcHRlcikgeworICAgICAgICBtQWRhcHRlciA9IGFkYXB0ZXI7CisgICAgICAgIGlmIChtTGlzdCAhPSBudWxsKSB7CisgICAgICAgICAgICBtTGlzdC5zZXRBZGFwdGVyKGFkYXB0ZXIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgbGlzdCBpdGVtIHRvIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBwb3NpdGlvbiB3aXRoIHRoZSBhZGFwdGVyJ3MgZGF0YQorICAgICAqCisgICAgICogQHBhcmFtIHBvc2l0aW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKGludCBwb3NpdGlvbikgeworICAgICAgICBlbnN1cmVMaXN0KCk7CisgICAgICAgIG1MaXN0LnNldFNlbGVjdGlvbihwb3NpdGlvbik7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBwb3NpdGlvbiBvZiB0aGUgY3VycmVudGx5IHNlbGVjdGVkIGxpc3QgaXRlbS4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFNlbGVjdGVkSXRlbVBvc2l0aW9uKCkgeworICAgICAgICBlbnN1cmVMaXN0KCk7CisgICAgICAgIHJldHVybiBtTGlzdC5nZXRTZWxlY3RlZEl0ZW1Qb3NpdGlvbigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgY3Vyc29yIHJvdyBJRCBvZiB0aGUgY3VycmVudGx5IHNlbGVjdGVkIGxpc3QgaXRlbS4KKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBnZXRTZWxlY3RlZEl0ZW1JZCgpIHsKKyAgICAgICAgZW5zdXJlTGlzdCgpOworICAgICAgICByZXR1cm4gbUxpc3QuZ2V0U2VsZWN0ZWRJdGVtSWQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGFjdGl2aXR5J3MgbGlzdCB2aWV3IHdpZGdldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdFZpZXcgZ2V0TGlzdFZpZXcoKSB7CisgICAgICAgIGVuc3VyZUxpc3QoKTsKKyAgICAgICAgcmV0dXJuIG1MaXN0OworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgTGlzdEFkYXB0ZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgYWN0aXZpdHkncyBMaXN0Vmlldy4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdEFkYXB0ZXIgZ2V0TGlzdEFkYXB0ZXIoKSB7CisgICAgICAgIHJldHVybiBtQWRhcHRlcjsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZW5zdXJlTGlzdCgpIHsKKyAgICAgICAgaWYgKG1MaXN0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBWaWV3IHJvb3QgPSBnZXRWaWV3KCk7CisgICAgICAgIGlmIChyb290ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkNvbnRlbnQgdmlldyBub3QgeWV0IGNyZWF0ZWQiKTsKKyAgICAgICAgfQorICAgICAgICBWaWV3IGVtcHR5VmlldyA9IHJvb3QuZmluZFZpZXdCeUlkKGNvbS5hbmRyb2lkLmludGVybmFsLlIuaWQuZW1wdHkpOworICAgICAgICBtTGlzdCA9IChMaXN0Vmlldylyb290LmZpbmRWaWV3QnlJZChjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmlkLmxpc3QpOworICAgICAgICBpZiAobUxpc3QgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJZb3VyIGNvbnRlbnQgbXVzdCBoYXZlIGEgTGlzdFZpZXcgd2hvc2UgaWQgYXR0cmlidXRlIGlzICIgKworICAgICAgICAgICAgICAgICAgICAiJ2FuZHJvaWQuUi5pZC5saXN0JyIpOworICAgICAgICB9CisgICAgICAgIGlmIChlbXB0eVZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgbUxpc3Quc2V0RW1wdHlWaWV3KGVtcHR5Vmlldyk7CisgICAgICAgIH0KKyAgICAgICAgbUxpc3Quc2V0T25JdGVtQ2xpY2tMaXN0ZW5lcihtT25DbGlja0xpc3RlbmVyKTsKKyAgICAgICAgaWYgKG1BZGFwdGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHNldExpc3RBZGFwdGVyKG1BZGFwdGVyKTsKKyAgICAgICAgfQorICAgICAgICBtSGFuZGxlci5wb3N0KG1SZXF1ZXN0Rm9jdXMpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9Mb2FkZXJNYW5hZ2luZ0ZyYWdtZW50LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvTG9hZGVyTWFuYWdpbmdGcmFnbWVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4YTVjYTQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvTG9hZGVyTWFuYWdpbmdGcmFnbWVudC5qYXZhCkBAIC0wLDAgKzEsMjA0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmFwcDsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Mb2FkZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKKworLyoqCisgKiBBIEZyYWdtZW50IHRoYXQgaGFzIHV0aWxpdHkgbWV0aG9kcyBmb3IgbWFuYWdpbmcge0BsaW5rIExvYWRlcn1zLgorICoKKyAqIEBwYXJhbSA8RD4gVGhlIHR5cGUgb2YgZGF0YSByZXR1cm5lZCBieSB0aGUgTG9hZGVyLiBJZiB5b3UncmUgdXNpbmcgbXVsdGlwbGUgTG9hZGVycyB3aXRoCisgKiBkaWZmZXJlbnQgcmV0dXJuIHR5cGVzIHVzZSBPYmplY3QgYW5kIGNhc2UgdGhlIHJlc3VsdHMuCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBMb2FkZXJNYW5hZ2luZ0ZyYWdtZW50PEQ+IGV4dGVuZHMgRnJhZ21lbnQKKyAgICAgICAgaW1wbGVtZW50cyBMb2FkZXIuT25Mb2FkQ29tcGxldGVMaXN0ZW5lcjxEPiB7CisgICAgcHJpdmF0ZSBib29sZWFuIG1TdGFydGVkID0gZmFsc2U7CisKKyAgICBzdGF0aWMgZmluYWwgY2xhc3MgTG9hZGVySW5mbzxEPiB7CisgICAgICAgIHB1YmxpYyBCdW5kbGUgYXJnczsKKyAgICAgICAgcHVibGljIExvYWRlcjxEPiBsb2FkZXI7CisgICAgfQorICAgIHByaXZhdGUgSGFzaE1hcDxJbnRlZ2VyLCBMb2FkZXJJbmZvPEQ+PiBtTG9hZGVyczsKKyAgICBwcml2YXRlIEhhc2hNYXA8SW50ZWdlciwgTG9hZGVySW5mbzxEPj4gbUluYWN0aXZlTG9hZGVyczsKKworICAgIC8qKgorICAgICAqIFJlZ2lzdGVycyBhIGxvYWRlciB3aXRoIHRoaXMgYWN0aXZpdHksIHJlZ2lzdGVycyB0aGUgY2FsbGJhY2tzIG9uIGl0LCBhbmQgc3RhcnRzIGl0IGxvYWRpbmcuCisgICAgICogSWYgYSBsb2FkZXIgd2l0aCB0aGUgc2FtZSBpZCBoYXMgcHJldmlvdXNseSBiZWVuIHN0YXJ0ZWQgaXQgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIGRlc3Ryb3llZAorICAgICAqIHdoZW4gdGhlIG5ldyBsb2FkZXIgY29tcGxldGVzIGl0J3Mgd29yay4gVGhlIGNhbGxiYWNrIHdpbGwgYmUgZGVsaXZlcmVkIGJlZm9yZSB0aGUgb2xkIGxvYWRlcgorICAgICAqIGlzIGRlc3Ryb3llZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgTG9hZGVyPEQ+IHN0YXJ0TG9hZGluZyhpbnQgaWQsIEJ1bmRsZSBhcmdzKSB7CisgICAgICAgIExvYWRlckluZm88RD4gaW5mbyA9IG1Mb2FkZXJzLmdldChpZCk7CisgICAgICAgIGlmIChpbmZvICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8vIEtlZXAgdHJhY2sgb2YgdGhlIHByZXZpb3VzIGluc3RhbmNlIG9mIHRoaXMgbG9hZGVyIHNvIHdlIGNhbiBkZXN0cm95CisgICAgICAgICAgICAvLyBpdCB3aGVuIHRoZSBuZXcgb25lIGNvbXBsZXRlcy4KKyAgICAgICAgICAgIG1JbmFjdGl2ZUxvYWRlcnMucHV0KGlkLCBpbmZvKTsKKyAgICAgICAgfQorICAgICAgICBpbmZvID0gbmV3IExvYWRlckluZm88RD4oKTsKKyAgICAgICAgaW5mby5hcmdzID0gYXJnczsKKyAgICAgICAgbUxvYWRlcnMucHV0KGlkLCBpbmZvKTsKKyAgICAgICAgTG9hZGVyPEQ+IGxvYWRlciA9IG9uQ3JlYXRlTG9hZGVyKGlkLCBhcmdzKTsKKyAgICAgICAgaW5mby5sb2FkZXIgPSBsb2FkZXI7CisgICAgICAgIGlmIChtU3RhcnRlZCkgeworICAgICAgICAgICAgLy8gVGhlIGFjdGl2aXR5IHdpbGwgc3RhcnQgYWxsIGV4aXN0aW5nIGxvYWRlcnMgaW4gaXQncyBvblN0YXJ0KCksIHNvIG9ubHkgc3RhcnQgdGhlbQorICAgICAgICAgICAgLy8gaGVyZSBpZiB3ZSdyZSBwYXN0IHRoYXQgcG9pbnQgb2YgdGhlIGFjdGl2aXRpeSdzIGxpZmUgY3ljbGUKKyAgICAgICAgICAgIGxvYWRlci5yZWdpc3Rlckxpc3RlbmVyKGlkLCB0aGlzKTsKKyAgICAgICAgICAgIGxvYWRlci5zdGFydExvYWRpbmcoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbG9hZGVyOworICAgIH0KKworICAgIHByb3RlY3RlZCBhYnN0cmFjdCBMb2FkZXI8RD4gb25DcmVhdGVMb2FkZXIoaW50IGlkLCBCdW5kbGUgYXJncyk7CisgICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgb25Jbml0aWFsaXplTG9hZGVycygpOworICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIG9uTG9hZEZpbmlzaGVkKExvYWRlcjxEPiBsb2FkZXIsIEQgZGF0YSk7CisKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBvbkxvYWRDb21wbGV0ZShMb2FkZXI8RD4gbG9hZGVyLCBEIGRhdGEpIHsKKyAgICAgICAgLy8gTm90aWZ5IG9mIHRoZSBuZXcgZGF0YSBzbyB0aGUgYXBwIGNhbiBzd2l0Y2ggb3V0IHRoZSBvbGQgZGF0YSBiZWZvcmUKKyAgICAgICAgLy8gd2UgdHJ5IHRvIGRlc3Ryb3kgaXQuCisgICAgICAgIG9uTG9hZEZpbmlzaGVkKGxvYWRlciwgZGF0YSk7CisKKyAgICAgICAgLy8gTG9vayBmb3IgYW4gaW5hY3RpdmUgbG9hZGVyIGFuZCBkZXN0cm95IGl0IGlmIGZvdW5kCisgICAgICAgIGludCBpZCA9IGxvYWRlci5nZXRJZCgpOworICAgICAgICBMb2FkZXJJbmZvPEQ+IGluZm8gPSBtSW5hY3RpdmVMb2FkZXJzLmdldChpZCk7CisgICAgICAgIGlmIChpbmZvICE9IG51bGwpIHsKKyAgICAgICAgICAgIExvYWRlcjxEPiBvbGRMb2FkZXIgPSBpbmZvLmxvYWRlcjsKKyAgICAgICAgICAgIGlmIChvbGRMb2FkZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG9sZExvYWRlci5kZXN0cm95KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtSW5hY3RpdmVMb2FkZXJzLnJlbW92ZShpZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZFN0YXRlKTsKKworICAgICAgICBpZiAobUxvYWRlcnMgPT0gbnVsbCkgeworICAgICAgICAgICAgLy8gTG9vayBmb3IgYSBwYXNzZWQgYWxvbmcgbG9hZGVyIGFuZCBjcmVhdGUgYSBuZXcgb25lIGlmIGl0J3Mgbm90IHRoZXJlCisvLyBUT0RPOiB1bmNvbW1lbnQgb25jZSBnZXRMYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlIG1ldGhvZCBpcyBhdmFpbGFibGUKKy8vICAgICAgICAgICAgbUxvYWRlcnMgPSAoSGFzaE1hcDxJbnRlZ2VyLCBMb2FkZXJJbmZvPikgZ2V0TGFzdE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZSgpOworICAgICAgICAgICAgaWYgKG1Mb2FkZXJzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtTG9hZGVycyA9IG5ldyBIYXNoTWFwPEludGVnZXIsIExvYWRlckluZm88RD4+KCk7CisgICAgICAgICAgICAgICAgb25Jbml0aWFsaXplTG9hZGVycygpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChtSW5hY3RpdmVMb2FkZXJzID09IG51bGwpIHsKKyAgICAgICAgICAgIG1JbmFjdGl2ZUxvYWRlcnMgPSBuZXcgSGFzaE1hcDxJbnRlZ2VyLCBMb2FkZXJJbmZvPEQ+PigpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25TdGFydCgpIHsKKyAgICAgICAgc3VwZXIub25TdGFydCgpOworCisgICAgICAgIC8vIENhbGwgb3V0IHRvIHN1YiBjbGFzc2VzIHNvIHRoZXkgY2FuIHN0YXJ0IHRoZWlyIGxvYWRlcnMKKyAgICAgICAgLy8gTGV0IHRoZSBleGlzdGluZyBsb2FkZXJzIGtub3cgdGhhdCB3ZSB3YW50IHRvIGJlIG5vdGlmaWVkIHdoZW4gYSBsb2FkIGlzIGNvbXBsZXRlCisgICAgICAgIGZvciAoSGFzaE1hcC5FbnRyeTxJbnRlZ2VyLCBMb2FkZXJJbmZvPEQ+PiBlbnRyeSA6IG1Mb2FkZXJzLmVudHJ5U2V0KCkpIHsKKyAgICAgICAgICAgIExvYWRlckluZm88RD4gaW5mbyA9IGVudHJ5LmdldFZhbHVlKCk7CisgICAgICAgICAgICBMb2FkZXI8RD4gbG9hZGVyID0gaW5mby5sb2FkZXI7CisgICAgICAgICAgICBpbnQgaWQgPSBlbnRyeS5nZXRLZXkoKTsKKyAgICAgICAgICAgIGlmIChsb2FkZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgbG9hZGVyID0gb25DcmVhdGVMb2FkZXIoaWQsIGluZm8uYXJncyk7CisgICAgICAgICAgICAgICBpbmZvLmxvYWRlciA9IGxvYWRlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxvYWRlci5yZWdpc3Rlckxpc3RlbmVyKGlkLCB0aGlzKTsKKyAgICAgICAgICAgIGxvYWRlci5zdGFydExvYWRpbmcoKTsKKyAgICAgICAgfQorCisgICAgICAgIG1TdGFydGVkID0gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvblN0b3AoKSB7CisgICAgICAgIHN1cGVyLm9uU3RvcCgpOworCisgICAgICAgIGZvciAoSGFzaE1hcC5FbnRyeTxJbnRlZ2VyLCBMb2FkZXJJbmZvPEQ+PiBlbnRyeSA6IG1Mb2FkZXJzLmVudHJ5U2V0KCkpIHsKKyAgICAgICAgICAgIExvYWRlckluZm88RD4gaW5mbyA9IGVudHJ5LmdldFZhbHVlKCk7CisgICAgICAgICAgICBMb2FkZXI8RD4gbG9hZGVyID0gaW5mby5sb2FkZXI7CisgICAgICAgICAgICBpZiAobG9hZGVyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gTGV0IHRoZSBsb2FkZXIga25vdyB3ZSdyZSBkb25lIHdpdGggaXQKKyAgICAgICAgICAgIGxvYWRlci51bnJlZ2lzdGVyTGlzdGVuZXIodGhpcyk7CisKKyAgICAgICAgICAgIC8vIFRoZSBsb2FkZXIgaXNuJ3QgZ2V0dGluZyBwYXNzZWQgYWxvbmcgdG8gdGhlIG5leHQgaW5zdGFuY2Ugc28gYXNrIGl0IHRvIHN0b3AgbG9hZGluZworICAgICAgICAgICAgaWYgKCFnZXRBY3Rpdml0eSgpLmlzQ2hhbmdpbmdDb25maWd1cmF0aW9ucygpKSB7CisgICAgICAgICAgICAgICAgbG9hZGVyLnN0b3BMb2FkaW5nKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBtU3RhcnRlZCA9IGZhbHNlOworICAgIH0KKworICAgIC8qKiBUTyBETzogVGhpcyBuZWVkcyB0byBiZSB0dXJuZWQgaW50byBhIHJldGFpbmVkIGZyYWdtZW50LgorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBPYmplY3Qgb25SZXRhaW5Ob25Db25maWd1cmF0aW9uSW5zdGFuY2UoKSB7CisgICAgICAgIC8vIFBhc3MgdGhlIGxvYWRlciBhbG9uZyB0byB0aGUgbmV4dCBndXkKKyAgICAgICAgT2JqZWN0IHJlc3VsdCA9IG1Mb2FkZXJzOworICAgICAgICBtTG9hZGVycyA9IG51bGw7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICAgICoqLworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25EZXN0cm95KCkgeworICAgICAgICBzdXBlci5vbkRlc3Ryb3koKTsKKworICAgICAgICBpZiAobUxvYWRlcnMgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChIYXNoTWFwLkVudHJ5PEludGVnZXIsIExvYWRlckluZm88RD4+IGVudHJ5IDogbUxvYWRlcnMuZW50cnlTZXQoKSkgeworICAgICAgICAgICAgICAgIExvYWRlckluZm88RD4gaW5mbyA9IGVudHJ5LmdldFZhbHVlKCk7CisgICAgICAgICAgICAgICAgTG9hZGVyPEQ+IGxvYWRlciA9IGluZm8ubG9hZGVyOworICAgICAgICAgICAgICAgIGlmIChsb2FkZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbG9hZGVyLmRlc3Ryb3koKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFN0b3BzIGFuZCByZW1vdmVzIHRoZSBsb2FkZXIgd2l0aCB0aGUgZ2l2ZW4gSUQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RvcExvYWRpbmcoaW50IGlkKSB7CisgICAgICAgIGlmIChtTG9hZGVycyAhPSBudWxsKSB7CisgICAgICAgICAgICBMb2FkZXJJbmZvPEQ+IGluZm8gPSBtTG9hZGVycy5yZW1vdmUoaWQpOworICAgICAgICAgICAgaWYgKGluZm8gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIExvYWRlcjxEPiBsb2FkZXIgPSBpbmZvLmxvYWRlcjsKKyAgICAgICAgICAgICAgICBpZiAobG9hZGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9hZGVyLnVucmVnaXN0ZXJMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgICAgICAgICAgICAgbG9hZGVyLmRlc3Ryb3koKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSBMb2FkZXIgd2l0aCB0aGUgZ2l2ZW4gaWQgb3IgbnVsbCBpZiBubyBtYXRjaGluZyBMb2FkZXIKKyAgICAgKiBpcyBmb3VuZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgTG9hZGVyPEQ+IGdldExvYWRlcihpbnQgaWQpIHsKKyAgICAgICAgTG9hZGVySW5mbzxEPiBsb2FkZXJJbmZvID0gbUxvYWRlcnMuZ2V0KGlkKTsKKyAgICAgICAgaWYgKGxvYWRlckluZm8gIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG1Mb2FkZXJzLmdldChpZCkubG9hZGVyOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9Mb2NhbEFjdGl2aXR5TWFuYWdlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0xvY2FsQWN0aXZpdHlNYW5hZ2VyLmphdmEKaW5kZXggYTI0ZmNhZS4uNTI0ZGU2ZiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0xvY2FsQWN0aXZpdHlNYW5hZ2VyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0xvY2FsQWN0aXZpdHlNYW5hZ2VyLmphdmEKQEAgLTIwLDEzICsyMCwxMSBAQAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5BY3Rpdml0eUluZm87CiBpbXBvcnQgYW5kcm9pZC5vcy5CaW5kZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkNvbmZpZzsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3c7CiAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogCiAvKioKQEAgLTM4LDcgKzM2LDcgQEAKICAqLwogcHVibGljIGNsYXNzIExvY2FsQWN0aXZpdHlNYW5hZ2VyIHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkxvY2FsQWN0aXZpdHlNYW5hZ2VyIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIGxvY2FsTE9HViA9IGZhbHNlIHx8IENvbmZpZy5MT0dWOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gbG9jYWxMT0dWID0gZmFsc2U7CiAKICAgICAvLyBJbnRlcm5hbCB0b2tlbiBmb3IgYW4gQWN0aXZpdHkgYmVpbmcgbWFuYWdlZCBieSBMb2NhbEFjdGl2aXR5TWFuYWdlci4KICAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBMb2NhbEFjdGl2aXR5UmVjb3JkIGV4dGVuZHMgQmluZGVyIHsKQEAgLTExMiwxMSArMTEwLDE2IEBACiAgICAgICAgIAogICAgICAgICBpZiAoci5jdXJTdGF0ZSA9PSBJTklUSUFMSVpJTkcpIHsKICAgICAgICAgICAgIC8vIEdldCB0aGUgbGFzdE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZSBmb3IgdGhlIGFjdGl2aXR5Ci0gICAgICAgICAgICBIYXNoTWFwPFN0cmluZyxPYmplY3Q+IGxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2VzID0KLSAgICAgICAgICAgICAgICBtUGFyZW50LmdldExhc3ROb25Db25maWd1cmF0aW9uQ2hpbGRJbnN0YW5jZXMoKTsKLSAgICAgICAgICAgIE9iamVjdCBpbnN0YW5jZSA9IG51bGw7CisgICAgICAgICAgICBIYXNoTWFwPFN0cmluZywgT2JqZWN0PiBsYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlcyA9CisgICAgICAgICAgICAgICAgICAgIG1QYXJlbnQuZ2V0TGFzdE5vbkNvbmZpZ3VyYXRpb25DaGlsZEluc3RhbmNlcygpOworICAgICAgICAgICAgT2JqZWN0IGluc3RhbmNlT2JqID0gbnVsbDsKICAgICAgICAgICAgIGlmIChsYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaW5zdGFuY2UgPSBsYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlcy5nZXQoci5pZCk7CisgICAgICAgICAgICAgICAgaW5zdGFuY2VPYmogPSBsYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlcy5nZXQoci5pZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBY3Rpdml0eS5Ob25Db25maWd1cmF0aW9uSW5zdGFuY2VzIGluc3RhbmNlID0gbnVsbDsKKyAgICAgICAgICAgIGlmIChpbnN0YW5jZU9iaiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaW5zdGFuY2UgPSBuZXcgQWN0aXZpdHkuTm9uQ29uZmlndXJhdGlvbkluc3RhbmNlcygpOworICAgICAgICAgICAgICAgIGluc3RhbmNlLmFjdGl2aXR5ID0gaW5zdGFuY2VPYmo7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAKICAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gaGF2ZSBhbHdheXMgY3JlYXRlZCB0aGUgYWN0aXZpdHkuCkBAIC0zNDYsNyArMzQ5LDcgQEAKICAgICB9CiAKICAgICBwcml2YXRlIFdpbmRvdyBwZXJmb3JtRGVzdHJveShMb2NhbEFjdGl2aXR5UmVjb3JkIHIsIGJvb2xlYW4gZmluaXNoKSB7Ci0gICAgICAgIFdpbmRvdyB3aW4gPSBudWxsOworICAgICAgICBXaW5kb3cgd2luOwogICAgICAgICB3aW4gPSByLndpbmRvdzsKICAgICAgICAgaWYgKHIuY3VyU3RhdGUgPT0gUkVTVU1FRCAmJiAhZmluaXNoKSB7CiAgICAgICAgICAgICBwZXJmb3JtUGF1c2UociwgZmluaXNoKTsKQEAgLTM4MCw3ICszODMsOCBAQAogICAgICAgICBpZiAociAhPSBudWxsKSB7CiAgICAgICAgICAgICB3aW4gPSBwZXJmb3JtRGVzdHJveShyLCBmaW5pc2gpOwogICAgICAgICAgICAgaWYgKGZpbmlzaCkgewotICAgICAgICAgICAgICAgIG1BY3Rpdml0aWVzLnJlbW92ZShyKTsKKyAgICAgICAgICAgICAgICBtQWN0aXZpdGllcy5yZW1vdmUoaWQpOworICAgICAgICAgICAgICAgIG1BY3Rpdml0eUFycmF5LnJlbW92ZShyKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICByZXR1cm4gd2luOwpAQCAtNDQxLDEwICs0NDUsOCBAQAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGRpc3BhdGNoQ3JlYXRlKEJ1bmRsZSBzdGF0ZSkgewogICAgICAgICBpZiAoc3RhdGUgIT0gbnVsbCkgewotICAgICAgICAgICAgZmluYWwgSXRlcmF0b3I8U3RyaW5nPiBpID0gc3RhdGUua2V5U2V0KCkuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgIHdoaWxlIChpLmhhc05leHQoKSkgeworICAgICAgICAgICAgZm9yIChTdHJpbmcgaWQgOiBzdGF0ZS5rZXlTZXQoKSkgewogICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBpZCA9IGkubmV4dCgpOwogICAgICAgICAgICAgICAgICAgICBmaW5hbCBCdW5kbGUgYXN0YXRlID0gc3RhdGUuZ2V0QnVuZGxlKGlkKTsKICAgICAgICAgICAgICAgICAgICAgTG9jYWxBY3Rpdml0eVJlY29yZCByID0gbUFjdGl2aXRpZXMuZ2V0KGlkKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKHIgIT0gbnVsbCkgewpAQCAtNDU3LDkgKzQ1OSw3IEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgICAgICAgICAvLyBSZWNvdmVyIGZyb20gLWFsbC0gYXBwIGVycm9ycy4KLSAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLAotICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhjZXB0aW9uIHRocm93biB3aGVuIHJlc3RvcmluZyBMb2NhbEFjdGl2aXR5TWFuYWdlciBzdGF0ZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGUpOworICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJFeGNlcHRpb24gdGhyb3duIHdoZW4gcmVzdG9yaW5nIExvY2FsQWN0aXZpdHlNYW5hZ2VyIHN0YXRlIiwgZSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvYWRtaW4vRGV2aWNlUG9saWN5TWFuYWdlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL2FkbWluL0RldmljZVBvbGljeU1hbmFnZXIuamF2YQppbmRleCAyOTZkNzBhNC4uMzA2NmY1YyAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL2FkbWluL0RldmljZVBvbGljeU1hbmFnZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvYWRtaW4vRGV2aWNlUG9saWN5TWFuYWdlci5qYXZhCkBAIC00Niw3ICs0Niw3IEBACiAKICAgICBwcml2YXRlIGZpbmFsIENvbnRleHQgbUNvbnRleHQ7CiAgICAgcHJpdmF0ZSBmaW5hbCBJRGV2aWNlUG9saWN5TWFuYWdlciBtU2VydmljZTsKLSAgICAKKwogICAgIHByaXZhdGUgZmluYWwgSGFuZGxlciBtSGFuZGxlcjsKIAogICAgIHByaXZhdGUgRGV2aWNlUG9saWN5TWFuYWdlcihDb250ZXh0IGNvbnRleHQsIEhhbmRsZXIgaGFuZGxlcikgewpAQCAtNjEsMTQgKzYxLDE0IEBACiAgICAgICAgIERldmljZVBvbGljeU1hbmFnZXIgbWUgPSBuZXcgRGV2aWNlUG9saWN5TWFuYWdlcihjb250ZXh0LCBoYW5kbGVyKTsKICAgICAgICAgcmV0dXJuIG1lLm1TZXJ2aWNlICE9IG51bGwgPyBtZSA6IG51bGw7CiAgICAgfQotICAgIAorCiAgICAgLyoqCiAgICAgICogQWN0aXZpdHkgYWN0aW9uOiBhc2sgdGhlIHVzZXIgdG8gYWRkIGEgbmV3IGRldmljZSBhZG1pbmlzdHJhdG9yIHRvIHRoZSBzeXN0ZW0uCiAgICAgICogVGhlIGRlc2lyZWQgcG9saWN5IGlzIHRoZSBDb21wb25lbnROYW1lIG9mIHRoZSBwb2xpY3kgaW4gdGhlCiAgICAgICoge0BsaW5rICNFWFRSQV9ERVZJQ0VfQURNSU59IGV4dHJhIGZpZWxkLiAgVGhpcyB3aWxsIGludm9rZSBhIFVJIHRvCiAgICAgICogYnJpbmcgdGhlIHVzZXIgdGhyb3VnaCBhZGRpbmcgdGhlIGRldmljZSBhZG1pbmlzdHJhdG9yIHRvIHRoZSBzeXN0ZW0gKG9yCiAgICAgICogYWxsb3dpbmcgdGhlbSB0byByZWplY3QgaXQpLgotICAgICAqIAorICAgICAqCiAgICAgICogPHA+WW91IGNhbiBvcHRpb25hbGx5IGluY2x1ZGUgdGhlIHtAbGluayAjRVhUUkFfQUREX0VYUExBTkFUSU9OfQogICAgICAqIGZpZWxkIHRvIHByb3ZpZGUgdGhlIHVzZXIgd2l0aCBhZGRpdGlvbmFsIGV4cGxhbmF0aW9uIChpbiBhZGRpdGlvbgogICAgICAqIHRvIHlvdXIgY29tcG9uZW50J3MgZGVzY3JpcHRpb24pIGFib3V0IHdoYXQgaXMgYmVpbmcgYWRkZWQuCkBAIC03Niw3ICs3Niw3IEBACiAgICAgQFNka0NvbnN0YW50KFNka0NvbnN0YW50VHlwZS5BQ1RJVklUWV9JTlRFTlRfQUNUSU9OKQogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9BRERfREVWSUNFX0FETUlOCiAgICAgICAgICAgICA9ICJhbmRyb2lkLmFwcC5hY3Rpb24uQUREX0RFVklDRV9BRE1JTiI7Ci0gICAgCisKICAgICAvKioKICAgICAgKiBBY3Rpdml0eSBhY3Rpb246IHNlbmQgd2hlbiBhbnkgcG9saWN5IGFkbWluIGNoYW5nZXMgYSBwb2xpY3kuCiAgICAgICogVGhpcyBpcyBnZW5lcmFsbHkgdXNlZCB0byBmaW5kIG91dCB3aGVuIGEgbmV3IHBvbGljeSBpcyBpbiBlZmZlY3QuCkBAIC05Miw3ICs5Miw3IEBACiAgICAgICogQHNlZSAjQUNUSU9OX0FERF9ERVZJQ0VfQURNSU4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9ERVZJQ0VfQURNSU4gPSAiYW5kcm9pZC5hcHAuZXh0cmEuREVWSUNFX0FETUlOIjsKLSAgICAKKwogICAgIC8qKgogICAgICAqIEFuIG9wdGlvbmFsIENoYXJTZXF1ZW5jZSBwcm92aWRpbmcgYWRkaXRpb25hbCBleHBsYW5hdGlvbiBmb3Igd2h5IHRoZQogICAgICAqIGFkbWluIGlzIGJlaW5nIGFkZGVkLgpAQCAtMTAwLDIyICsxMDAsMjEgQEAKICAgICAgKiBAc2VlICNBQ1RJT05fQUREX0RFVklDRV9BRE1JTgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX0FERF9FWFBMQU5BVElPTiA9ICJhbmRyb2lkLmFwcC5leHRyYS5BRERfRVhQTEFOQVRJT04iOwotICAgIAorCiAgICAgLyoqCi0gICAgICogQWN0aXZpdHkgYWN0aW9uOiBoYXZlIHRoZSB1c2VyIGVudGVyIGEgbmV3IHBhc3N3b3JkLiAgVGhpcyBhY3Rpdml0eQotICAgICAqIHNob3VsZCBiZSBsYXVuY2hlZCBhZnRlciB1c2luZyB7QGxpbmsgI3NldFBhc3N3b3JkUXVhbGl0eShDb21wb25lbnROYW1lLCBpbnQpfQotICAgICAqIG9yIHtAbGluayAjc2V0UGFzc3dvcmRNaW5pbXVtTGVuZ3RoKENvbXBvbmVudE5hbWUsIGludCl9IHRvIGhhdmUgdGhlCi0gICAgICogdXNlciBlbnRlciBhIG5ldyBwYXNzd29yZCB0aGF0IG1lZXRzIHRoZSBjdXJyZW50IHJlcXVpcmVtZW50cy4gIFlvdSBjYW4KLSAgICAgKiB1c2Uge0BsaW5rICNpc0FjdGl2ZVBhc3N3b3JkU3VmZmljaWVudCgpfSB0byBkZXRlcm1pbmUgd2hldGhlciB5b3UgbmVlZAotICAgICAqIHRvIGhhdmUgdGhlIHVzZXIgc2VsZWN0IGEgbmV3IHBhc3N3b3JkIGluIG9yZGVyIHRvIG1lZXQgdGhlIGN1cnJlbnQKLSAgICAgKiBjb25zdHJhaW50cy4gIFVwb24gYmVpbmcgcmVzdW1lZCBmcm9tIHRoaXMgYWN0aXZpdHksCi0gICAgICogeW91IGNhbiBjaGVjayB0aGUgbmV3IHBhc3N3b3JkIGNoYXJhY3RlcmlzdGljcyB0byBzZWUgaWYgdGhleSBhcmUKLSAgICAgKiBzdWZmaWNpZW50LgorICAgICAqIEFjdGl2aXR5IGFjdGlvbjogaGF2ZSB0aGUgdXNlciBlbnRlciBhIG5ldyBwYXNzd29yZC4gVGhpcyBhY3Rpdml0eSBzaG91bGQKKyAgICAgKiBiZSBsYXVuY2hlZCBhZnRlciB1c2luZyB7QGxpbmsgI3NldFBhc3N3b3JkUXVhbGl0eShDb21wb25lbnROYW1lLCBpbnQpfSwKKyAgICAgKiBvciB7QGxpbmsgI3NldFBhc3N3b3JkTWluaW11bUxlbmd0aChDb21wb25lbnROYW1lLCBpbnQpfSB0byBoYXZlIHRoZSB1c2VyCisgICAgICogZW50ZXIgYSBuZXcgcGFzc3dvcmQgdGhhdCBtZWV0cyB0aGUgY3VycmVudCByZXF1aXJlbWVudHMuIFlvdSBjYW4gdXNlCisgICAgICoge0BsaW5rICNpc0FjdGl2ZVBhc3N3b3JkU3VmZmljaWVudCgpfSB0byBkZXRlcm1pbmUgd2hldGhlciB5b3UgbmVlZCB0bworICAgICAqIGhhdmUgdGhlIHVzZXIgc2VsZWN0IGEgbmV3IHBhc3N3b3JkIGluIG9yZGVyIHRvIG1lZXQgdGhlIGN1cnJlbnQKKyAgICAgKiBjb25zdHJhaW50cy4gVXBvbiBiZWluZyByZXN1bWVkIGZyb20gdGhpcyBhY3Rpdml0eSwgeW91IGNhbiBjaGVjayB0aGUgbmV3CisgICAgICogcGFzc3dvcmQgY2hhcmFjdGVyaXN0aWNzIHRvIHNlZSBpZiB0aGV5IGFyZSBzdWZmaWNpZW50LgogICAgICAqLwogICAgIEBTZGtDb25zdGFudChTZGtDb25zdGFudFR5cGUuQUNUSVZJVFlfSU5URU5UX0FDVElPTikKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fU0VUX05FV19QQVNTV09SRAogICAgICAgICAgICAgPSAiYW5kcm9pZC5hcHAuYWN0aW9uLlNFVF9ORVdfUEFTU1dPUkQiOwotICAgIAorCiAgICAgLyoqCiAgICAgICogUmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIGFkbWluaXN0cmF0b3IgY29tcG9uZW50IGlzIGN1cnJlbnRseQogICAgICAqIGFjdGl2ZSAoZW5hYmxlZCkgaW4gdGhlIHN5c3RlbS4KQEAgLTEzMCw3ICsxMjksNyBAQAogICAgICAgICB9CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBSZXR1cm4gYSBsaXN0IG9mIGFsbCBjdXJyZW50bHkgYWN0aXZlIGRldmljZSBhZG1pbmlzdHJhdG9yJ3MgY29tcG9uZW50CiAgICAgICogbmFtZXMuICBOb3RlIHRoYXQgaWYgdGhlcmUgYXJlIG5vIGFkbWluaXN0cmF0b3JzIHRoYW4gbnVsbCBtYXkgYmUKQEAgLTE0Niw3ICsxNDUsNyBAQAogICAgICAgICB9CiAgICAgICAgIHJldHVybiBudWxsOwogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIEBoaWRlCiAgICAgICovCkBAIC0xNjAsNyArMTU5LDcgQEAKICAgICAgICAgfQogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQotICAgIAorCiAgICAgLyoqCiAgICAgICogUmVtb3ZlIGEgY3VycmVudCBhZG1pbmlzdHJhdGlvbiBjb21wb25lbnQuICBUaGlzIGNhbiBvbmx5IGJlIGNhbGxlZAogICAgICAqIGJ5IHRoZSBhcHBsaWNhdGlvbiB0aGF0IG93bnMgdGhlIGFkbWluaXN0cmF0aW9uIGNvbXBvbmVudDsgaWYgeW91CkBAIC0xNzYsMjggKzE3NSwyOCBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgLyoqCiAgICAgICogQ29uc3RhbnQgZm9yIHtAbGluayAjc2V0UGFzc3dvcmRRdWFsaXR5fTogdGhlIHBvbGljeSBoYXMgbm8gcmVxdWlyZW1lbnRzCiAgICAgICogZm9yIHRoZSBwYXNzd29yZC4gIE5vdGUgdGhhdCBxdWFsaXR5IGNvbnN0YW50cyBhcmUgb3JkZXJlZCBzbyB0aGF0IGhpZ2hlcgogICAgICAqIHZhbHVlcyBhcmUgbW9yZSByZXN0cmljdGl2ZS4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQQVNTV09SRF9RVUFMSVRZX1VOU1BFQ0lGSUVEID0gMDsKLSAgICAKKwogICAgIC8qKgogICAgICAqIENvbnN0YW50IGZvciB7QGxpbmsgI3NldFBhc3N3b3JkUXVhbGl0eX06IHRoZSBwb2xpY3kgcmVxdWlyZXMgc29tZSBraW5kCiAgICAgICogb2YgcGFzc3dvcmQsIGJ1dCBkb2Vzbid0IGNhcmUgd2hhdCBpdCBpcy4gIE5vdGUgdGhhdCBxdWFsaXR5IGNvbnN0YW50cwogICAgICAqIGFyZSBvcmRlcmVkIHNvIHRoYXQgaGlnaGVyIHZhbHVlcyBhcmUgbW9yZSByZXN0cmljdGl2ZS4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQQVNTV09SRF9RVUFMSVRZX1NPTUVUSElORyA9IDB4MTAwMDA7Ci0gICAgCisKICAgICAvKioKICAgICAgKiBDb25zdGFudCBmb3Ige0BsaW5rICNzZXRQYXNzd29yZFF1YWxpdHl9OiB0aGUgdXNlciBtdXN0IGhhdmUgZW50ZXJlZCBhCiAgICAgICogcGFzc3dvcmQgY29udGFpbmluZyBhdCBsZWFzdCBudW1lcmljIGNoYXJhY3RlcnMuICBOb3RlIHRoYXQgcXVhbGl0eQogICAgICAqIGNvbnN0YW50cyBhcmUgb3JkZXJlZCBzbyB0aGF0IGhpZ2hlciB2YWx1ZXMgYXJlIG1vcmUgcmVzdHJpY3RpdmUuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEFTU1dPUkRfUVVBTElUWV9OVU1FUklDID0gMHgyMDAwMDsKLSAgICAKKwogICAgIC8qKgogICAgICAqIENvbnN0YW50IGZvciB7QGxpbmsgI3NldFBhc3N3b3JkUXVhbGl0eX06IHRoZSB1c2VyIG11c3QgaGF2ZSBlbnRlcmVkIGEKICAgICAgKiBwYXNzd29yZCBjb250YWluaW5nIGF0IGxlYXN0IGFscGhhYmV0aWMgKG9yIG90aGVyIHN5bWJvbCkgY2hhcmFjdGVycy4KQEAgLTIwNSw3ICsyMDQsNyBAQAogICAgICAqIHJlc3RyaWN0aXZlLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBBU1NXT1JEX1FVQUxJVFlfQUxQSEFCRVRJQyA9IDB4NDAwMDA7Ci0gICAgCisKICAgICAvKioKICAgICAgKiBDb25zdGFudCBmb3Ige0BsaW5rICNzZXRQYXNzd29yZFF1YWxpdHl9OiB0aGUgdXNlciBtdXN0IGhhdmUgZW50ZXJlZCBhCiAgICAgICogcGFzc3dvcmQgY29udGFpbmluZyBhdCBsZWFzdCA8ZW0+Ym90aD48L2VtPiBudW1lcmljIDxlbT5hbmQ8L2VtPgpAQCAtMjEzLDcgKzIxMiwxOSBAQAogICAgICAqIG9yZGVyZWQgc28gdGhhdCBoaWdoZXIgdmFsdWVzIGFyZSBtb3JlIHJlc3RyaWN0aXZlLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBBU1NXT1JEX1FVQUxJVFlfQUxQSEFOVU1FUklDID0gMHg1MDAwMDsKLSAgICAKKworICAgIC8qKgorICAgICAqIENvbnN0YW50IGZvciB7QGxpbmsgI3NldFBhc3N3b3JkUXVhbGl0eX06IHRoZSB1c2VyIG11c3QgaGF2ZSBlbnRlcmVkIGEKKyAgICAgKiBwYXNzd29yZCBjb250YWluaW5nIGF0IGxlYXN0IGEgbGV0dGVyLCBhIG51bWVyaWNhbCBkaWdpdCBhbmQgYSBzcGVjaWFsCisgICAgICogc3ltYm9sLCBieSBkZWZhdWx0LiBXaXRoIHRoaXMgcGFzc3dvcmQgcXVhbGl0eSwgcGFzc3dvcmRzIGNhbiBiZQorICAgICAqIHJlc3RyaWN0ZWQgdG8gY29udGFpbiB2YXJpb3VzIHNldHMgb2YgY2hhcmFjdGVycywgbGlrZSBhdCBsZWFzdCBhbgorICAgICAqIHVwcGVyY2FzZSBsZXR0ZXIsIGV0Yy4gVGhlc2UgYXJlIHNwZWNpZmllZCB1c2luZyB2YXJpb3VzIG1ldGhvZHMsCisgICAgICogbGlrZSB7QGxpbmsgI3NldFBhc3N3b3JkTWluaW11bUxvd2VyQ2FzZShDb21wb25lbnROYW1lLCBpbnQpfS4gTm90ZQorICAgICAqIHRoYXQgcXVhbGl0eSBjb25zdGFudHMgYXJlIG9yZGVyZWQgc28gdGhhdCBoaWdoZXIgdmFsdWVzIGFyZSBtb3JlCisgICAgICogcmVzdHJpY3RpdmUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEFTU1dPUkRfUVVBTElUWV9DT01QTEVYID0gMHg2MDAwMDsKKwogICAgIC8qKgogICAgICAqIENhbGxlZCBieSBhbiBhcHBsaWNhdGlvbiB0aGF0IGlzIGFkbWluaXN0ZXJpbmcgdGhlIGRldmljZSB0byBzZXQgdGhlCiAgICAgICogcGFzc3dvcmQgcmVzdHJpY3Rpb25zIGl0IGlzIGltcG9zaW5nLiAgQWZ0ZXIgc2V0dGluZyB0aGlzLCB0aGUgdXNlcgpAQCAtMjIyLDIxICsyMzMsMjEgQEAKICAgICAgKiB3aWxsIHJlbWFpbiB1bnRpbCB0aGUgdXNlciBoYXMgc2V0IGEgbmV3IG9uZSwgc28gdGhlIGNoYW5nZSBkb2VzIG5vdAogICAgICAqIHRha2UgcGxhY2UgaW1tZWRpYXRlbHkuICBUbyBwcm9tcHQgdGhlIHVzZXIgZm9yIGEgbmV3IHBhc3N3b3JkLCB1c2UKICAgICAgKiB7QGxpbmsgI0FDVElPTl9TRVRfTkVXX1BBU1NXT1JEfSBhZnRlciBzZXR0aW5nIHRoaXMgdmFsdWUuCi0gICAgICogCisgICAgICoKICAgICAgKiA8cD5RdWFsaXR5IGNvbnN0YW50cyBhcmUgb3JkZXJlZCBzbyB0aGF0IGhpZ2hlciB2YWx1ZXMgYXJlIG1vcmUgcmVzdHJpY3RpdmU7CiAgICAgICogdGh1cyB0aGUgaGlnaGVzdCByZXF1ZXN0ZWQgcXVhbGl0eSBjb25zdGFudCAoYmV0d2VlbiB0aGUgcG9saWN5IHNldCBoZXJlLAogICAgICAqIHRoZSB1c2VyJ3MgcHJlZmVyZW5jZSwgYW5kIGFueSBvdGhlciBjb25zaWRlcmF0aW9ucykgaXMgdGhlIG9uZSB0aGF0CiAgICAgICogaXMgaW4gZWZmZWN0LgotICAgICAqIAorICAgICAqCiAgICAgICogPHA+VGhlIGNhbGxpbmcgZGV2aWNlIGFkbWluIG11c3QgaGF2ZSByZXF1ZXN0ZWQKICAgICAgKiB7QGxpbmsgRGV2aWNlQWRtaW5JbmZvI1VTRVNfUE9MSUNZX0xJTUlUX1BBU1NXT1JEfSB0byBiZSBhYmxlIHRvIGNhbGwKICAgICAgKiB0aGlzIG1ldGhvZDsgaWYgaXQgaGFzIG5vdCwgYSBzZWN1cml0eSBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24uCi0gICAgICogCisgICAgICoKICAgICAgKiBAcGFyYW0gYWRtaW4gV2hpY2gge0BsaW5rIERldmljZUFkbWluUmVjZWl2ZXJ9IHRoaXMgcmVxdWVzdCBpcyBhc3NvY2lhdGVkIHdpdGguCiAgICAgICogQHBhcmFtIHF1YWxpdHkgVGhlIG5ldyBkZXNpcmVkIHF1YWxpdHkuICBPbmUgb2YKICAgICAgKiB7QGxpbmsgI1BBU1NXT1JEX1FVQUxJVFlfVU5TUEVDSUZJRUR9LCB7QGxpbmsgI1BBU1NXT1JEX1FVQUxJVFlfU09NRVRISU5HfSwKICAgICAgKiB7QGxpbmsgI1BBU1NXT1JEX1FVQUxJVFlfTlVNRVJJQ30sIHtAbGluayAjUEFTU1dPUkRfUVVBTElUWV9BTFBIQUJFVElDfSwKLSAgICAgKiBvciB7QGxpbmsgI1BBU1NXT1JEX1FVQUxJVFlfQUxQSEFOVU1FUklDfS4KKyAgICAgKiB7QGxpbmsgI1BBU1NXT1JEX1FVQUxJVFlfQUxQSEFOVU1FUklDfSBvciB7QGxpbmsgI1BBU1NXT1JEX1FVQUxJVFlfQ09NUExFWH0uCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0UGFzc3dvcmRRdWFsaXR5KENvbXBvbmVudE5hbWUgYWRtaW4sIGludCBxdWFsaXR5KSB7CiAgICAgICAgIGlmIChtU2VydmljZSAhPSBudWxsKSB7CkBAIC0yNDcsNyArMjU4LDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIFJldHJpZXZlIHRoZSBjdXJyZW50IG1pbmltdW0gcGFzc3dvcmQgcXVhbGl0eSBmb3IgYWxsIGFkbWlucwogICAgICAqIG9yIGEgcGFydGljdWxhciBvbmUuCkBAIC0yNjQsNyArMjc1LDcgQEAKICAgICAgICAgfQogICAgICAgICByZXR1cm4gUEFTU1dPUkRfUVVBTElUWV9VTlNQRUNJRklFRDsKICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBDYWxsZWQgYnkgYW4gYXBwbGljYXRpb24gdGhhdCBpcyBhZG1pbmlzdGVyaW5nIHRoZSBkZXZpY2UgdG8gc2V0IHRoZQogICAgICAqIG1pbmltdW0gYWxsb3dlZCBwYXNzd29yZCBsZW5ndGguICBBZnRlciBzZXR0aW5nIHRoaXMsIHRoZSB1c2VyCkBAIC0yNzQsMTQgKzI4NSwxNCBAQAogICAgICAqIHRha2UgcGxhY2UgaW1tZWRpYXRlbHkuICBUbyBwcm9tcHQgdGhlIHVzZXIgZm9yIGEgbmV3IHBhc3N3b3JkLCB1c2UKICAgICAgKiB7QGxpbmsgI0FDVElPTl9TRVRfTkVXX1BBU1NXT1JEfSBhZnRlciBzZXR0aW5nIHRoaXMgdmFsdWUuICBUaGlzCiAgICAgICogY29uc3RyYWludCBpcyBvbmx5IGltcG9zZWQgaWYgdGhlIGFkbWluaXN0cmF0b3IgaGFzIGFsc28gcmVxdWVzdGVkIGVpdGhlcgotICAgICAqIHtAbGluayAjUEFTU1dPUkRfUVVBTElUWV9OVU1FUklDfSwge0BsaW5rICNQQVNTV09SRF9RVUFMSVRZX0FMUEhBQkVUSUN9LAotICAgICAqIG9yIHtAbGluayAjUEFTU1dPUkRfUVVBTElUWV9BTFBIQU5VTUVSSUN9CisgICAgICoge0BsaW5rICNQQVNTV09SRF9RVUFMSVRZX05VTUVSSUN9LCB7QGxpbmsgI1BBU1NXT1JEX1FVQUxJVFlfQUxQSEFCRVRJQ30KKyAgICAgKiB7QGxpbmsgI1BBU1NXT1JEX1FVQUxJVFlfQUxQSEFOVU1FUklDfSwgb3Ige0BsaW5rICNQQVNTV09SRF9RVUFMSVRZX0NPTVBMRVh9CiAgICAgICogd2l0aCB7QGxpbmsgI3NldFBhc3N3b3JkUXVhbGl0eX0uCi0gICAgICogCisgICAgICoKICAgICAgKiA8cD5UaGUgY2FsbGluZyBkZXZpY2UgYWRtaW4gbXVzdCBoYXZlIHJlcXVlc3RlZAogICAgICAqIHtAbGluayBEZXZpY2VBZG1pbkluZm8jVVNFU19QT0xJQ1lfTElNSVRfUEFTU1dPUkR9IHRvIGJlIGFibGUgdG8gY2FsbAogICAgICAqIHRoaXMgbWV0aG9kOyBpZiBpdCBoYXMgbm90LCBhIHNlY3VyaXR5IGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bi4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIEBwYXJhbSBhZG1pbiBXaGljaCB7QGxpbmsgRGV2aWNlQWRtaW5SZWNlaXZlcn0gdGhpcyByZXF1ZXN0IGlzIGFzc29jaWF0ZWQgd2l0aC4KICAgICAgKiBAcGFyYW0gbGVuZ3RoIFRoZSBuZXcgZGVzaXJlZCBtaW5pbXVtIHBhc3N3b3JkIGxlbmd0aC4gIEEgdmFsdWUgb2YgMAogICAgICAqIG1lYW5zIHRoZXJlIGlzIG5vIHJlc3RyaWN0aW9uLgpAQCAtMjk1LDcgKzMwNiw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBSZXRyaWV2ZSB0aGUgY3VycmVudCBtaW5pbXVtIHBhc3N3b3JkIGxlbmd0aCBmb3IgYWxsIGFkbWlucwogICAgICAqIG9yIGEgcGFydGljdWxhciBvbmUuCkBAIC0zMTIsNyArMzIzLDM3OSBAQAogICAgICAgICB9CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KLSAgICAKKworICAgIC8qKgorICAgICAqIENhbGxlZCBieSBhbiBhcHBsaWNhdGlvbiB0aGF0IGlzIGFkbWluaXN0ZXJpbmcgdGhlIGRldmljZSB0byBzZXQgdGhlCisgICAgICogbWluaW11bSBudW1iZXIgb2YgdXBwZXIgY2FzZSBsZXR0ZXJzIHJlcXVpcmVkIGluIHRoZSBwYXNzd29yZC4gQWZ0ZXIKKyAgICAgKiBzZXR0aW5nIHRoaXMsIHRoZSB1c2VyIHdpbGwgbm90IGJlIGFibGUgdG8gZW50ZXIgYSBuZXcgcGFzc3dvcmQgdGhhdCBpcworICAgICAqIG5vdCBhdCBsZWFzdCBhcyByZXN0cmljdGl2ZSBhcyB3aGF0IGhhcyBiZWVuIHNldC4gTm90ZSB0aGF0IHRoZSBjdXJyZW50CisgICAgICogcGFzc3dvcmQgd2lsbCByZW1haW4gdW50aWwgdGhlIHVzZXIgaGFzIHNldCBhIG5ldyBvbmUsIHNvIHRoZSBjaGFuZ2UgZG9lcworICAgICAqIG5vdCB0YWtlIHBsYWNlIGltbWVkaWF0ZWx5LiBUbyBwcm9tcHQgdGhlIHVzZXIgZm9yIGEgbmV3IHBhc3N3b3JkLCB1c2UKKyAgICAgKiB7QGxpbmsgI0FDVElPTl9TRVRfTkVXX1BBU1NXT1JEfSBhZnRlciBzZXR0aW5nIHRoaXMgdmFsdWUuIFRoaXMKKyAgICAgKiBjb25zdHJhaW50IGlzIG9ubHkgaW1wb3NlZCBpZiB0aGUgYWRtaW5pc3RyYXRvciBoYXMgYWxzbyByZXF1ZXN0ZWQKKyAgICAgKiB7QGxpbmsgI1BBU1NXT1JEX1FVQUxJVFlfQ09NUExFWH0gd2l0aCB7QGxpbmsgI3NldFBhc3N3b3JkUXVhbGl0eX0uIFRoZQorICAgICAqIGRlZmF1bHQgdmFsdWUgaXMgMC4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgY2FsbGluZyBkZXZpY2UgYWRtaW4gbXVzdCBoYXZlIHJlcXVlc3RlZAorICAgICAqIHtAbGluayBEZXZpY2VBZG1pbkluZm8jVVNFU19QT0xJQ1lfTElNSVRfUEFTU1dPUkR9IHRvIGJlIGFibGUgdG8gY2FsbAorICAgICAqIHRoaXMgbWV0aG9kOyBpZiBpdCBoYXMgbm90LCBhIHNlY3VyaXR5IGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhZG1pbiBXaGljaCB7QGxpbmsgRGV2aWNlQWRtaW5SZWNlaXZlcn0gdGhpcyByZXF1ZXN0IGlzIGFzc29jaWF0ZWQKKyAgICAgKiAgICAgICAgICAgIHdpdGguCisgICAgICogQHBhcmFtIGxlbmd0aCBUaGUgbmV3IGRlc2lyZWQgbWluaW11bSBudW1iZXIgb2YgdXBwZXIgY2FzZSBsZXR0ZXJzCisgICAgICogICAgICAgICAgICByZXF1aXJlZCBpbiB0aGUgcGFzc3dvcmQuIEEgdmFsdWUgb2YgMCBtZWFucyB0aGVyZSBpcyBubworICAgICAqICAgICAgICAgICAgcmVzdHJpY3Rpb24uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UGFzc3dvcmRNaW5pbXVtVXBwZXJDYXNlKENvbXBvbmVudE5hbWUgYWRtaW4sIGludCBsZW5ndGgpIHsKKyAgICAgICAgaWYgKG1TZXJ2aWNlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbVNlcnZpY2Uuc2V0UGFzc3dvcmRNaW5pbXVtVXBwZXJDYXNlKGFkbWluLCBsZW5ndGgpOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJGYWlsZWQgdGFsa2luZyB3aXRoIGRldmljZSBwb2xpY3kgc2VydmljZSIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0cmlldmUgdGhlIGN1cnJlbnQgbnVtYmVyIG9mIHVwcGVyIGNhc2UgbGV0dGVycyByZXF1aXJlZCBpbiB0aGUKKyAgICAgKiBwYXNzd29yZCBmb3IgYWxsIGFkbWlucyBvciBhIHBhcnRpY3VsYXIgb25lLiBUaGlzIGlzIHRoZSBzYW1lIHZhbHVlIGFzCisgICAgICogc2V0IGJ5IHsjbGluayB7QGxpbmsgI3NldFBhc3N3b3JkTWluaW11bVVwcGVyQ2FzZShDb21wb25lbnROYW1lLCBpbnQpfQorICAgICAqIGFuZCBvbmx5IGFwcGxpZXMgd2hlbiB0aGUgcGFzc3dvcmQgcXVhbGl0eSBpcworICAgICAqIHtAbGluayAjUEFTU1dPUkRfUVVBTElUWV9DT01QTEVYfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhZG1pbiBUaGUgbmFtZSBvZiB0aGUgYWRtaW4gY29tcG9uZW50IHRvIGNoZWNrLCBvciBudWxsIHRvCisgICAgICogICAgICAgICAgICBhZ2dyZWdhdGUgYWxsIGFkbWlucy4KKyAgICAgKiBAcmV0dXJuIFRoZSBtaW5pbXVtIG51bWJlciBvZiB1cHBlciBjYXNlIGxldHRlcnMgcmVxdWlyZWQgaW4gdGhlCisgICAgICogICAgICAgICBwYXNzd29yZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFBhc3N3b3JkTWluaW11bVVwcGVyQ2FzZShDb21wb25lbnROYW1lIGFkbWluKSB7CisgICAgICAgIGlmIChtU2VydmljZSAhPSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJldHVybiBtU2VydmljZS5nZXRQYXNzd29yZE1pbmltdW1VcHBlckNhc2UoYWRtaW4pOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJGYWlsZWQgdGFsa2luZyB3aXRoIGRldmljZSBwb2xpY3kgc2VydmljZSIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxlZCBieSBhbiBhcHBsaWNhdGlvbiB0aGF0IGlzIGFkbWluaXN0ZXJpbmcgdGhlIGRldmljZSB0byBzZXQgdGhlCisgICAgICogbWluaW11bSBudW1iZXIgb2YgbG93ZXIgY2FzZSBsZXR0ZXJzIHJlcXVpcmVkIGluIHRoZSBwYXNzd29yZC4gQWZ0ZXIKKyAgICAgKiBzZXR0aW5nIHRoaXMsIHRoZSB1c2VyIHdpbGwgbm90IGJlIGFibGUgdG8gZW50ZXIgYSBuZXcgcGFzc3dvcmQgdGhhdCBpcworICAgICAqIG5vdCBhdCBsZWFzdCBhcyByZXN0cmljdGl2ZSBhcyB3aGF0IGhhcyBiZWVuIHNldC4gTm90ZSB0aGF0IHRoZSBjdXJyZW50CisgICAgICogcGFzc3dvcmQgd2lsbCByZW1haW4gdW50aWwgdGhlIHVzZXIgaGFzIHNldCBhIG5ldyBvbmUsIHNvIHRoZSBjaGFuZ2UgZG9lcworICAgICAqIG5vdCB0YWtlIHBsYWNlIGltbWVkaWF0ZWx5LiBUbyBwcm9tcHQgdGhlIHVzZXIgZm9yIGEgbmV3IHBhc3N3b3JkLCB1c2UKKyAgICAgKiB7QGxpbmsgI0FDVElPTl9TRVRfTkVXX1BBU1NXT1JEfSBhZnRlciBzZXR0aW5nIHRoaXMgdmFsdWUuIFRoaXMKKyAgICAgKiBjb25zdHJhaW50IGlzIG9ubHkgaW1wb3NlZCBpZiB0aGUgYWRtaW5pc3RyYXRvciBoYXMgYWxzbyByZXF1ZXN0ZWQKKyAgICAgKiB7QGxpbmsgI1BBU1NXT1JEX1FVQUxJVFlfQ09NUExFWH0gd2l0aCB7QGxpbmsgI3NldFBhc3N3b3JkUXVhbGl0eX0uIFRoZQorICAgICAqIGRlZmF1bHQgdmFsdWUgaXMgMC4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgY2FsbGluZyBkZXZpY2UgYWRtaW4gbXVzdCBoYXZlIHJlcXVlc3RlZAorICAgICAqIHtAbGluayBEZXZpY2VBZG1pbkluZm8jVVNFU19QT0xJQ1lfTElNSVRfUEFTU1dPUkR9IHRvIGJlIGFibGUgdG8gY2FsbAorICAgICAqIHRoaXMgbWV0aG9kOyBpZiBpdCBoYXMgbm90LCBhIHNlY3VyaXR5IGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhZG1pbiBXaGljaCB7QGxpbmsgRGV2aWNlQWRtaW5SZWNlaXZlcn0gdGhpcyByZXF1ZXN0IGlzIGFzc29jaWF0ZWQKKyAgICAgKiAgICAgICAgICAgIHdpdGguCisgICAgICogQHBhcmFtIGxlbmd0aCBUaGUgbmV3IGRlc2lyZWQgbWluaW11bSBudW1iZXIgb2YgbG93ZXIgY2FzZSBsZXR0ZXJzCisgICAgICogICAgICAgICAgICByZXF1aXJlZCBpbiB0aGUgcGFzc3dvcmQuIEEgdmFsdWUgb2YgMCBtZWFucyB0aGVyZSBpcyBubworICAgICAqICAgICAgICAgICAgcmVzdHJpY3Rpb24uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UGFzc3dvcmRNaW5pbXVtTG93ZXJDYXNlKENvbXBvbmVudE5hbWUgYWRtaW4sIGludCBsZW5ndGgpIHsKKyAgICAgICAgaWYgKG1TZXJ2aWNlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbVNlcnZpY2Uuc2V0UGFzc3dvcmRNaW5pbXVtTG93ZXJDYXNlKGFkbWluLCBsZW5ndGgpOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJGYWlsZWQgdGFsa2luZyB3aXRoIGRldmljZSBwb2xpY3kgc2VydmljZSIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0cmlldmUgdGhlIGN1cnJlbnQgbnVtYmVyIG9mIGxvd2VyIGNhc2UgbGV0dGVycyByZXF1aXJlZCBpbiB0aGUKKyAgICAgKiBwYXNzd29yZCBmb3IgYWxsIGFkbWlucyBvciBhIHBhcnRpY3VsYXIgb25lLiBUaGlzIGlzIHRoZSBzYW1lIHZhbHVlIGFzCisgICAgICogc2V0IGJ5IHsjbGluayB7QGxpbmsgI3NldFBhc3N3b3JkTWluaW11bUxvd2VyQ2FzZShDb21wb25lbnROYW1lLCBpbnQpfQorICAgICAqIGFuZCBvbmx5IGFwcGxpZXMgd2hlbiB0aGUgcGFzc3dvcmQgcXVhbGl0eSBpcworICAgICAqIHtAbGluayAjUEFTU1dPUkRfUVVBTElUWV9DT01QTEVYfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhZG1pbiBUaGUgbmFtZSBvZiB0aGUgYWRtaW4gY29tcG9uZW50IHRvIGNoZWNrLCBvciBudWxsIHRvCisgICAgICogICAgICAgICAgICBhZ2dyZWdhdGUgYWxsIGFkbWlucy4KKyAgICAgKiBAcmV0dXJuIFRoZSBtaW5pbXVtIG51bWJlciBvZiBsb3dlciBjYXNlIGxldHRlcnMgcmVxdWlyZWQgaW4gdGhlCisgICAgICogICAgICAgICBwYXNzd29yZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFBhc3N3b3JkTWluaW11bUxvd2VyQ2FzZShDb21wb25lbnROYW1lIGFkbWluKSB7CisgICAgICAgIGlmIChtU2VydmljZSAhPSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJldHVybiBtU2VydmljZS5nZXRQYXNzd29yZE1pbmltdW1Mb3dlckNhc2UoYWRtaW4pOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJGYWlsZWQgdGFsa2luZyB3aXRoIGRldmljZSBwb2xpY3kgc2VydmljZSIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxlZCBieSBhbiBhcHBsaWNhdGlvbiB0aGF0IGlzIGFkbWluaXN0ZXJpbmcgdGhlIGRldmljZSB0byBzZXQgdGhlCisgICAgICogbWluaW11bSBudW1iZXIgb2YgbGV0dGVycyByZXF1aXJlZCBpbiB0aGUgcGFzc3dvcmQuIEFmdGVyIHNldHRpbmcgdGhpcywKKyAgICAgKiB0aGUgdXNlciB3aWxsIG5vdCBiZSBhYmxlIHRvIGVudGVyIGEgbmV3IHBhc3N3b3JkIHRoYXQgaXMgbm90IGF0IGxlYXN0IGFzCisgICAgICogcmVzdHJpY3RpdmUgYXMgd2hhdCBoYXMgYmVlbiBzZXQuIE5vdGUgdGhhdCB0aGUgY3VycmVudCBwYXNzd29yZCB3aWxsCisgICAgICogcmVtYWluIHVudGlsIHRoZSB1c2VyIGhhcyBzZXQgYSBuZXcgb25lLCBzbyB0aGUgY2hhbmdlIGRvZXMgbm90IHRha2UKKyAgICAgKiBwbGFjZSBpbW1lZGlhdGVseS4gVG8gcHJvbXB0IHRoZSB1c2VyIGZvciBhIG5ldyBwYXNzd29yZCwgdXNlCisgICAgICoge0BsaW5rICNBQ1RJT05fU0VUX05FV19QQVNTV09SRH0gYWZ0ZXIgc2V0dGluZyB0aGlzIHZhbHVlLiBUaGlzCisgICAgICogY29uc3RyYWludCBpcyBvbmx5IGltcG9zZWQgaWYgdGhlIGFkbWluaXN0cmF0b3IgaGFzIGFsc28gcmVxdWVzdGVkCisgICAgICoge0BsaW5rICNQQVNTV09SRF9RVUFMSVRZX0NPTVBMRVh9IHdpdGgge0BsaW5rICNzZXRQYXNzd29yZFF1YWxpdHl9LiBUaGUKKyAgICAgKiBkZWZhdWx0IHZhbHVlIGlzIDEuCisgICAgICogPHA+CisgICAgICogVGhlIGNhbGxpbmcgZGV2aWNlIGFkbWluIG11c3QgaGF2ZSByZXF1ZXN0ZWQKKyAgICAgKiB7QGxpbmsgRGV2aWNlQWRtaW5JbmZvI1VTRVNfUE9MSUNZX0xJTUlUX1BBU1NXT1JEfSB0byBiZSBhYmxlIHRvIGNhbGwKKyAgICAgKiB0aGlzIG1ldGhvZDsgaWYgaXQgaGFzIG5vdCwgYSBzZWN1cml0eSBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gYWRtaW4gV2hpY2gge0BsaW5rIERldmljZUFkbWluUmVjZWl2ZXJ9IHRoaXMgcmVxdWVzdCBpcyBhc3NvY2lhdGVkCisgICAgICogICAgICAgICAgICB3aXRoLgorICAgICAqIEBwYXJhbSBsZW5ndGggVGhlIG5ldyBkZXNpcmVkIG1pbmltdW0gbnVtYmVyIG9mIGxldHRlcnMgcmVxdWlyZWQgaW4gdGhlCisgICAgICogICAgICAgICAgICBwYXNzd29yZC4gQSB2YWx1ZSBvZiAwIG1lYW5zIHRoZXJlIGlzIG5vIHJlc3RyaWN0aW9uLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFBhc3N3b3JkTWluaW11bUxldHRlcnMoQ29tcG9uZW50TmFtZSBhZG1pbiwgaW50IGxlbmd0aCkgeworICAgICAgICBpZiAobVNlcnZpY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtU2VydmljZS5zZXRQYXNzd29yZE1pbmltdW1MZXR0ZXJzKGFkbWluLCBsZW5ndGgpOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJGYWlsZWQgdGFsa2luZyB3aXRoIGRldmljZSBwb2xpY3kgc2VydmljZSIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0cmlldmUgdGhlIGN1cnJlbnQgbnVtYmVyIG9mIGxldHRlcnMgcmVxdWlyZWQgaW4gdGhlIHBhc3N3b3JkIGZvciBhbGwKKyAgICAgKiBhZG1pbnMgb3IgYSBwYXJ0aWN1bGFyIG9uZS4gVGhpcyBpcyB0aGUgc2FtZSB2YWx1ZSBhcworICAgICAqIHNldCBieSB7I2xpbmsge0BsaW5rICNzZXRQYXNzd29yZE1pbmltdW1MZXR0ZXJzKENvbXBvbmVudE5hbWUsIGludCl9CisgICAgICogYW5kIG9ubHkgYXBwbGllcyB3aGVuIHRoZSBwYXNzd29yZCBxdWFsaXR5IGlzCisgICAgICoge0BsaW5rICNQQVNTV09SRF9RVUFMSVRZX0NPTVBMRVh9LgorICAgICAqCisgICAgICogQHBhcmFtIGFkbWluIFRoZSBuYW1lIG9mIHRoZSBhZG1pbiBjb21wb25lbnQgdG8gY2hlY2ssIG9yIG51bGwgdG8KKyAgICAgKiAgICAgICAgICAgIGFnZ3JlZ2F0ZSBhbGwgYWRtaW5zLgorICAgICAqIEByZXR1cm4gVGhlIG1pbmltdW0gbnVtYmVyIG9mIGxldHRlcnMgcmVxdWlyZWQgaW4gdGhlIHBhc3N3b3JkLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0UGFzc3dvcmRNaW5pbXVtTGV0dGVycyhDb21wb25lbnROYW1lIGFkbWluKSB7CisgICAgICAgIGlmIChtU2VydmljZSAhPSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJldHVybiBtU2VydmljZS5nZXRQYXNzd29yZE1pbmltdW1MZXR0ZXJzKGFkbWluKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiRmFpbGVkIHRhbGtpbmcgd2l0aCBkZXZpY2UgcG9saWN5IHNlcnZpY2UiLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgYnkgYW4gYXBwbGljYXRpb24gdGhhdCBpcyBhZG1pbmlzdGVyaW5nIHRoZSBkZXZpY2UgdG8gc2V0IHRoZQorICAgICAqIG1pbmltdW0gbnVtYmVyIG9mIG51bWVyaWNhbCBkaWdpdHMgcmVxdWlyZWQgaW4gdGhlIHBhc3N3b3JkLiBBZnRlcgorICAgICAqIHNldHRpbmcgdGhpcywgdGhlIHVzZXIgd2lsbCBub3QgYmUgYWJsZSB0byBlbnRlciBhIG5ldyBwYXNzd29yZCB0aGF0IGlzCisgICAgICogbm90IGF0IGxlYXN0IGFzIHJlc3RyaWN0aXZlIGFzIHdoYXQgaGFzIGJlZW4gc2V0LiBOb3RlIHRoYXQgdGhlIGN1cnJlbnQKKyAgICAgKiBwYXNzd29yZCB3aWxsIHJlbWFpbiB1bnRpbCB0aGUgdXNlciBoYXMgc2V0IGEgbmV3IG9uZSwgc28gdGhlIGNoYW5nZSBkb2VzCisgICAgICogbm90IHRha2UgcGxhY2UgaW1tZWRpYXRlbHkuIFRvIHByb21wdCB0aGUgdXNlciBmb3IgYSBuZXcgcGFzc3dvcmQsIHVzZQorICAgICAqIHtAbGluayAjQUNUSU9OX1NFVF9ORVdfUEFTU1dPUkR9IGFmdGVyIHNldHRpbmcgdGhpcyB2YWx1ZS4gVGhpcworICAgICAqIGNvbnN0cmFpbnQgaXMgb25seSBpbXBvc2VkIGlmIHRoZSBhZG1pbmlzdHJhdG9yIGhhcyBhbHNvIHJlcXVlc3RlZAorICAgICAqIHtAbGluayAjUEFTU1dPUkRfUVVBTElUWV9DT01QTEVYfSB3aXRoIHtAbGluayAjc2V0UGFzc3dvcmRRdWFsaXR5fS4gVGhlCisgICAgICogZGVmYXVsdCB2YWx1ZSBpcyAxLgorICAgICAqIDxwPgorICAgICAqIFRoZSBjYWxsaW5nIGRldmljZSBhZG1pbiBtdXN0IGhhdmUgcmVxdWVzdGVkCisgICAgICoge0BsaW5rIERldmljZUFkbWluSW5mbyNVU0VTX1BPTElDWV9MSU1JVF9QQVNTV09SRH0gdG8gYmUgYWJsZSB0byBjYWxsCisgICAgICogdGhpcyBtZXRob2Q7IGlmIGl0IGhhcyBub3QsIGEgc2VjdXJpdHkgZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLgorICAgICAqCisgICAgICogQHBhcmFtIGFkbWluIFdoaWNoIHtAbGluayBEZXZpY2VBZG1pblJlY2VpdmVyfSB0aGlzIHJlcXVlc3QgaXMgYXNzb2NpYXRlZAorICAgICAqICAgICAgICAgICAgd2l0aC4KKyAgICAgKiBAcGFyYW0gbGVuZ3RoIFRoZSBuZXcgZGVzaXJlZCBtaW5pbXVtIG51bWJlciBvZiBudW1lcmljYWwgZGlnaXRzIHJlcXVpcmVkCisgICAgICogICAgICAgICAgICBpbiB0aGUgcGFzc3dvcmQuIEEgdmFsdWUgb2YgMCBtZWFucyB0aGVyZSBpcyBubyByZXN0cmljdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQYXNzd29yZE1pbmltdW1OdW1lcmljKENvbXBvbmVudE5hbWUgYWRtaW4sIGludCBsZW5ndGgpIHsKKyAgICAgICAgaWYgKG1TZXJ2aWNlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbVNlcnZpY2Uuc2V0UGFzc3dvcmRNaW5pbXVtTnVtZXJpYyhhZG1pbiwgbGVuZ3RoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiRmFpbGVkIHRhbGtpbmcgd2l0aCBkZXZpY2UgcG9saWN5IHNlcnZpY2UiLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHJpZXZlIHRoZSBjdXJyZW50IG51bWJlciBvZiBudW1lcmljYWwgZGlnaXRzIHJlcXVpcmVkIGluIHRoZSBwYXNzd29yZAorICAgICAqIGZvciBhbGwgYWRtaW5zIG9yIGEgcGFydGljdWxhciBvbmUuIFRoaXMgaXMgdGhlIHNhbWUgdmFsdWUgYXMKKyAgICAgKiBzZXQgYnkgeyNsaW5rIHtAbGluayAjc2V0UGFzc3dvcmRNaW5pbXVtTnVtZXJpYyhDb21wb25lbnROYW1lLCBpbnQpfQorICAgICAqIGFuZCBvbmx5IGFwcGxpZXMgd2hlbiB0aGUgcGFzc3dvcmQgcXVhbGl0eSBpcworICAgICAqIHtAbGluayAjUEFTU1dPUkRfUVVBTElUWV9DT01QTEVYfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhZG1pbiBUaGUgbmFtZSBvZiB0aGUgYWRtaW4gY29tcG9uZW50IHRvIGNoZWNrLCBvciBudWxsIHRvCisgICAgICogICAgICAgICAgICBhZ2dyZWdhdGUgYWxsIGFkbWlucy4KKyAgICAgKiBAcmV0dXJuIFRoZSBtaW5pbXVtIG51bWJlciBvZiBudW1lcmljYWwgZGlnaXRzIHJlcXVpcmVkIGluIHRoZSBwYXNzd29yZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFBhc3N3b3JkTWluaW11bU51bWVyaWMoQ29tcG9uZW50TmFtZSBhZG1pbikgeworICAgICAgICBpZiAobVNlcnZpY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbVNlcnZpY2UuZ2V0UGFzc3dvcmRNaW5pbXVtTnVtZXJpYyhhZG1pbik7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkZhaWxlZCB0YWxraW5nIHdpdGggZGV2aWNlIHBvbGljeSBzZXJ2aWNlIiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGVkIGJ5IGFuIGFwcGxpY2F0aW9uIHRoYXQgaXMgYWRtaW5pc3RlcmluZyB0aGUgZGV2aWNlIHRvIHNldCB0aGUKKyAgICAgKiBtaW5pbXVtIG51bWJlciBvZiBzeW1ib2xzIHJlcXVpcmVkIGluIHRoZSBwYXNzd29yZC4gQWZ0ZXIgc2V0dGluZyB0aGlzLAorICAgICAqIHRoZSB1c2VyIHdpbGwgbm90IGJlIGFibGUgdG8gZW50ZXIgYSBuZXcgcGFzc3dvcmQgdGhhdCBpcyBub3QgYXQgbGVhc3QgYXMKKyAgICAgKiByZXN0cmljdGl2ZSBhcyB3aGF0IGhhcyBiZWVuIHNldC4gTm90ZSB0aGF0IHRoZSBjdXJyZW50IHBhc3N3b3JkIHdpbGwKKyAgICAgKiByZW1haW4gdW50aWwgdGhlIHVzZXIgaGFzIHNldCBhIG5ldyBvbmUsIHNvIHRoZSBjaGFuZ2UgZG9lcyBub3QgdGFrZQorICAgICAqIHBsYWNlIGltbWVkaWF0ZWx5LiBUbyBwcm9tcHQgdGhlIHVzZXIgZm9yIGEgbmV3IHBhc3N3b3JkLCB1c2UKKyAgICAgKiB7QGxpbmsgI0FDVElPTl9TRVRfTkVXX1BBU1NXT1JEfSBhZnRlciBzZXR0aW5nIHRoaXMgdmFsdWUuIFRoaXMKKyAgICAgKiBjb25zdHJhaW50IGlzIG9ubHkgaW1wb3NlZCBpZiB0aGUgYWRtaW5pc3RyYXRvciBoYXMgYWxzbyByZXF1ZXN0ZWQKKyAgICAgKiB7QGxpbmsgI1BBU1NXT1JEX1FVQUxJVFlfQ09NUExFWH0gd2l0aCB7QGxpbmsgI3NldFBhc3N3b3JkUXVhbGl0eX0uIFRoZQorICAgICAqIGRlZmF1bHQgdmFsdWUgaXMgMS4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgY2FsbGluZyBkZXZpY2UgYWRtaW4gbXVzdCBoYXZlIHJlcXVlc3RlZAorICAgICAqIHtAbGluayBEZXZpY2VBZG1pbkluZm8jVVNFU19QT0xJQ1lfTElNSVRfUEFTU1dPUkR9IHRvIGJlIGFibGUgdG8gY2FsbAorICAgICAqIHRoaXMgbWV0aG9kOyBpZiBpdCBoYXMgbm90LCBhIHNlY3VyaXR5IGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhZG1pbiBXaGljaCB7QGxpbmsgRGV2aWNlQWRtaW5SZWNlaXZlcn0gdGhpcyByZXF1ZXN0IGlzIGFzc29jaWF0ZWQKKyAgICAgKiAgICAgICAgICAgIHdpdGguCisgICAgICogQHBhcmFtIGxlbmd0aCBUaGUgbmV3IGRlc2lyZWQgbWluaW11bSBudW1iZXIgb2Ygc3ltYm9scyByZXF1aXJlZCBpbiB0aGUKKyAgICAgKiAgICAgICAgICAgIHBhc3N3b3JkLiBBIHZhbHVlIG9mIDAgbWVhbnMgdGhlcmUgaXMgbm8gcmVzdHJpY3Rpb24uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UGFzc3dvcmRNaW5pbXVtU3ltYm9scyhDb21wb25lbnROYW1lIGFkbWluLCBpbnQgbGVuZ3RoKSB7CisgICAgICAgIGlmIChtU2VydmljZSAhPSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1TZXJ2aWNlLnNldFBhc3N3b3JkTWluaW11bVN5bWJvbHMoYWRtaW4sIGxlbmd0aCk7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkZhaWxlZCB0YWxraW5nIHdpdGggZGV2aWNlIHBvbGljeSBzZXJ2aWNlIiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZSB0aGUgY3VycmVudCBudW1iZXIgb2Ygc3ltYm9scyByZXF1aXJlZCBpbiB0aGUgcGFzc3dvcmQgZm9yIGFsbAorICAgICAqIGFkbWlucyBvciBhIHBhcnRpY3VsYXIgb25lLiBUaGlzIGlzIHRoZSBzYW1lIHZhbHVlIGFzCisgICAgICogc2V0IGJ5IHsjbGluayB7QGxpbmsgI3NldFBhc3N3b3JkTWluaW11bVN5bWJvbHMoQ29tcG9uZW50TmFtZSwgaW50KX0KKyAgICAgKiBhbmQgb25seSBhcHBsaWVzIHdoZW4gdGhlIHBhc3N3b3JkIHF1YWxpdHkgaXMKKyAgICAgKiB7QGxpbmsgI1BBU1NXT1JEX1FVQUxJVFlfQ09NUExFWH0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gYWRtaW4gVGhlIG5hbWUgb2YgdGhlIGFkbWluIGNvbXBvbmVudCB0byBjaGVjaywgb3IgbnVsbCB0bworICAgICAqICAgICAgICAgICAgYWdncmVnYXRlIGFsbCBhZG1pbnMuCisgICAgICogQHJldHVybiBUaGUgbWluaW11bSBudW1iZXIgb2Ygc3ltYm9scyByZXF1aXJlZCBpbiB0aGUgcGFzc3dvcmQuCisgICAgICovCisgICAgcHVibGljIGludCBnZXRQYXNzd29yZE1pbmltdW1TeW1ib2xzKENvbXBvbmVudE5hbWUgYWRtaW4pIHsKKyAgICAgICAgaWYgKG1TZXJ2aWNlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLmdldFBhc3N3b3JkTWluaW11bVN5bWJvbHMoYWRtaW4pOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJGYWlsZWQgdGFsa2luZyB3aXRoIGRldmljZSBwb2xpY3kgc2VydmljZSIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxlZCBieSBhbiBhcHBsaWNhdGlvbiB0aGF0IGlzIGFkbWluaXN0ZXJpbmcgdGhlIGRldmljZSB0byBzZXQgdGhlCisgICAgICogbWluaW11bSBudW1iZXIgb2Ygbm9uLWxldHRlciBjaGFyYWN0ZXJzIChudW1lcmljYWwgZGlnaXRzIG9yIHN5bWJvbHMpCisgICAgICogcmVxdWlyZWQgaW4gdGhlIHBhc3N3b3JkLiBBZnRlciBzZXR0aW5nIHRoaXMsIHRoZSB1c2VyIHdpbGwgbm90IGJlIGFibGUKKyAgICAgKiB0byBlbnRlciBhIG5ldyBwYXNzd29yZCB0aGF0IGlzIG5vdCBhdCBsZWFzdCBhcyByZXN0cmljdGl2ZSBhcyB3aGF0IGhhcworICAgICAqIGJlZW4gc2V0LiBOb3RlIHRoYXQgdGhlIGN1cnJlbnQgcGFzc3dvcmQgd2lsbCByZW1haW4gdW50aWwgdGhlIHVzZXIgaGFzCisgICAgICogc2V0IGEgbmV3IG9uZSwgc28gdGhlIGNoYW5nZSBkb2VzIG5vdCB0YWtlIHBsYWNlIGltbWVkaWF0ZWx5LiBUbyBwcm9tcHQKKyAgICAgKiB0aGUgdXNlciBmb3IgYSBuZXcgcGFzc3dvcmQsIHVzZSB7QGxpbmsgI0FDVElPTl9TRVRfTkVXX1BBU1NXT1JEfSBhZnRlcgorICAgICAqIHNldHRpbmcgdGhpcyB2YWx1ZS4gVGhpcyBjb25zdHJhaW50IGlzIG9ubHkgaW1wb3NlZCBpZiB0aGUgYWRtaW5pc3RyYXRvcgorICAgICAqIGhhcyBhbHNvIHJlcXVlc3RlZCB7QGxpbmsgI1BBU1NXT1JEX1FVQUxJVFlfQ09NUExFWH0gd2l0aAorICAgICAqIHtAbGluayAjc2V0UGFzc3dvcmRRdWFsaXR5fS4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgMC4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgY2FsbGluZyBkZXZpY2UgYWRtaW4gbXVzdCBoYXZlIHJlcXVlc3RlZAorICAgICAqIHtAbGluayBEZXZpY2VBZG1pbkluZm8jVVNFU19QT0xJQ1lfTElNSVRfUEFTU1dPUkR9IHRvIGJlIGFibGUgdG8gY2FsbAorICAgICAqIHRoaXMgbWV0aG9kOyBpZiBpdCBoYXMgbm90LCBhIHNlY3VyaXR5IGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhZG1pbiBXaGljaCB7QGxpbmsgRGV2aWNlQWRtaW5SZWNlaXZlcn0gdGhpcyByZXF1ZXN0IGlzIGFzc29jaWF0ZWQKKyAgICAgKiAgICAgICAgICAgIHdpdGguCisgICAgICogQHBhcmFtIGxlbmd0aCBUaGUgbmV3IGRlc2lyZWQgbWluaW11bSBudW1iZXIgb2YgbGV0dGVycyByZXF1aXJlZCBpbiB0aGUKKyAgICAgKiAgICAgICAgICAgIHBhc3N3b3JkLiBBIHZhbHVlIG9mIDAgbWVhbnMgdGhlcmUgaXMgbm8gcmVzdHJpY3Rpb24uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UGFzc3dvcmRNaW5pbXVtTm9uTGV0dGVyKENvbXBvbmVudE5hbWUgYWRtaW4sIGludCBsZW5ndGgpIHsKKyAgICAgICAgaWYgKG1TZXJ2aWNlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbVNlcnZpY2Uuc2V0UGFzc3dvcmRNaW5pbXVtTm9uTGV0dGVyKGFkbWluLCBsZW5ndGgpOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJGYWlsZWQgdGFsa2luZyB3aXRoIGRldmljZSBwb2xpY3kgc2VydmljZSIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0cmlldmUgdGhlIGN1cnJlbnQgbnVtYmVyIG9mIG5vbi1sZXR0ZXIgY2hhcmFjdGVycyByZXF1aXJlZCBpbiB0aGUKKyAgICAgKiBwYXNzd29yZCBmb3IgYWxsIGFkbWlucyBvciBhIHBhcnRpY3VsYXIgb25lLiBUaGlzIGlzIHRoZSBzYW1lIHZhbHVlIGFzCisgICAgICogc2V0IGJ5IHsjbGluayB7QGxpbmsgI3NldFBhc3N3b3JkTWluaW11bU5vbkxldHRlcihDb21wb25lbnROYW1lLCBpbnQpfQorICAgICAqIGFuZCBvbmx5IGFwcGxpZXMgd2hlbiB0aGUgcGFzc3dvcmQgcXVhbGl0eSBpcworICAgICAqIHtAbGluayAjUEFTU1dPUkRfUVVBTElUWV9DT01QTEVYfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhZG1pbiBUaGUgbmFtZSBvZiB0aGUgYWRtaW4gY29tcG9uZW50IHRvIGNoZWNrLCBvciBudWxsIHRvCisgICAgICogICAgICAgICAgICBhZ2dyZWdhdGUgYWxsIGFkbWlucy4KKyAgICAgKiBAcmV0dXJuIFRoZSBtaW5pbXVtIG51bWJlciBvZiBsZXR0ZXJzIHJlcXVpcmVkIGluIHRoZSBwYXNzd29yZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFBhc3N3b3JkTWluaW11bU5vbkxldHRlcihDb21wb25lbnROYW1lIGFkbWluKSB7CisgICAgICAgIGlmIChtU2VydmljZSAhPSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJldHVybiBtU2VydmljZS5nZXRQYXNzd29yZE1pbmltdW1Ob25MZXR0ZXIoYWRtaW4pOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJGYWlsZWQgdGFsa2luZyB3aXRoIGRldmljZSBwb2xpY3kgc2VydmljZSIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAvKioKKyAgICogQ2FsbGVkIGJ5IGFuIGFwcGxpY2F0aW9uIHRoYXQgaXMgYWRtaW5pc3RlcmluZyB0aGUgZGV2aWNlIHRvIHNldCB0aGUgbGVuZ3RoCisgICAqIG9mIHRoZSBwYXNzd29yZCBoaXN0b3J5LiBBZnRlciBzZXR0aW5nIHRoaXMsIHRoZSB1c2VyIHdpbGwgbm90IGJlIGFibGUgdG8KKyAgICogZW50ZXIgYSBuZXcgcGFzc3dvcmQgdGhhdCBpcyB0aGUgc2FtZSBhcyBhbnkgcGFzc3dvcmQgaW4gdGhlIGhpc3RvcnkuIE5vdGUKKyAgICogdGhhdCB0aGUgY3VycmVudCBwYXNzd29yZCB3aWxsIHJlbWFpbiB1bnRpbCB0aGUgdXNlciBoYXMgc2V0IGEgbmV3IG9uZSwgc28KKyAgICogdGhlIGNoYW5nZSBkb2VzIG5vdCB0YWtlIHBsYWNlIGltbWVkaWF0ZWx5LiBUbyBwcm9tcHQgdGhlIHVzZXIgZm9yIGEgbmV3CisgICAqIHBhc3N3b3JkLCB1c2Uge0BsaW5rICNBQ1RJT05fU0VUX05FV19QQVNTV09SRH0gYWZ0ZXIgc2V0dGluZyB0aGlzIHZhbHVlLgorICAgKiBUaGlzIGNvbnN0cmFpbnQgaXMgb25seSBpbXBvc2VkIGlmIHRoZSBhZG1pbmlzdHJhdG9yIGhhcyBhbHNvIHJlcXVlc3RlZAorICAgKiBlaXRoZXIge0BsaW5rICNQQVNTV09SRF9RVUFMSVRZX05VTUVSSUN9LAorICAgKiB7QGxpbmsgI1BBU1NXT1JEX1FVQUxJVFlfQUxQSEFCRVRJQ30sIG9yCisgICAqIHtAbGluayAjUEFTU1dPUkRfUVVBTElUWV9BTFBIQU5VTUVSSUN9IHdpdGgge0BsaW5rICNzZXRQYXNzd29yZFF1YWxpdHl9LgorICAgKgorICAgKiA8cD4KKyAgICogVGhlIGNhbGxpbmcgZGV2aWNlIGFkbWluIG11c3QgaGF2ZSByZXF1ZXN0ZWQKKyAgICoge0BsaW5rIERldmljZUFkbWluSW5mbyNVU0VTX1BPTElDWV9MSU1JVF9QQVNTV09SRH0gdG8gYmUgYWJsZSB0byBjYWxsIHRoaXMKKyAgICogbWV0aG9kOyBpZiBpdCBoYXMgbm90LCBhIHNlY3VyaXR5IGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bi4KKyAgICoKKyAgICogQHBhcmFtIGFkbWluIFdoaWNoIHtAbGluayBEZXZpY2VBZG1pblJlY2VpdmVyfSB0aGlzIHJlcXVlc3QgaXMgYXNzb2NpYXRlZAorICAgKiAgICAgICAgd2l0aC4KKyAgICogQHBhcmFtIGxlbmd0aCBUaGUgbmV3IGRlc2lyZWQgbGVuZ3RoIG9mIHBhc3N3b3JkIGhpc3RvcnkuIEEgdmFsdWUgb2YgMAorICAgKiAgICAgICAgbWVhbnMgdGhlcmUgaXMgbm8gcmVzdHJpY3Rpb24uCisgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFBhc3N3b3JkSGlzdG9yeUxlbmd0aChDb21wb25lbnROYW1lIGFkbWluLCBpbnQgbGVuZ3RoKSB7CisgICAgICAgIGlmIChtU2VydmljZSAhPSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1TZXJ2aWNlLnNldFBhc3N3b3JkSGlzdG9yeUxlbmd0aChhZG1pbiwgbGVuZ3RoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiRmFpbGVkIHRhbGtpbmcgd2l0aCBkZXZpY2UgcG9saWN5IHNlcnZpY2UiLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHJpZXZlIHRoZSBjdXJyZW50IHBhc3N3b3JkIGhpc3RvcnkgbGVuZ3RoIGZvciBhbGwgYWRtaW5zCisgICAgICogb3IgYSBwYXJ0aWN1bGFyIG9uZS4KKyAgICAgKiBAcGFyYW0gYWRtaW4gVGhlIG5hbWUgb2YgdGhlIGFkbWluIGNvbXBvbmVudCB0byBjaGVjaywgb3IgbnVsbCB0byBhZ2dyZWdhdGUKKyAgICAgKiBhbGwgYWRtaW5zLgorICAgICAqIEByZXR1cm4gVGhlIGxlbmd0aCBvZiB0aGUgcGFzc3dvcmQgaGlzdG9yeQorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0UGFzc3dvcmRIaXN0b3J5TGVuZ3RoKENvbXBvbmVudE5hbWUgYWRtaW4pIHsKKyAgICAgICAgaWYgKG1TZXJ2aWNlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLmdldFBhc3N3b3JkSGlzdG9yeUxlbmd0aChhZG1pbik7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkZhaWxlZCB0YWxraW5nIHdpdGggZGV2aWNlIHBvbGljeSBzZXJ2aWNlIiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCiAgICAgLyoqCiAgICAgICogUmV0dXJuIHRoZSBtYXhpbXVtIHBhc3N3b3JkIGxlbmd0aCB0aGF0IHRoZSBkZXZpY2Ugc3VwcG9ydHMgZm9yIGEKICAgICAgKiBwYXJ0aWN1bGFyIHBhc3N3b3JkIHF1YWxpdHkuCkBAIC0zMjMsMTYgKzcwNiwxNiBAQAogICAgICAgICAvLyBLaW5kLW9mIGFyYml0cmFyeS4KICAgICAgICAgcmV0dXJuIDE2OwogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIERldGVybWluZSB3aGV0aGVyIHRoZSBjdXJyZW50IHBhc3N3b3JkIHRoZSB1c2VyIGhhcyBzZXQgaXMgc3VmZmljaWVudAogICAgICAqIHRvIG1lZXQgdGhlIHBvbGljeSByZXF1aXJlbWVudHMgKHF1YWxpdHksIG1pbmltdW0gbGVuZ3RoKSB0aGF0IGhhdmUgYmVlbgogICAgICAqIHJlcXVlc3RlZC4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIDxwPlRoZSBjYWxsaW5nIGRldmljZSBhZG1pbiBtdXN0IGhhdmUgcmVxdWVzdGVkCiAgICAgICoge0BsaW5rIERldmljZUFkbWluSW5mbyNVU0VTX1BPTElDWV9MSU1JVF9QQVNTV09SRH0gdG8gYmUgYWJsZSB0byBjYWxsCiAgICAgICogdGhpcyBtZXRob2Q7IGlmIGl0IGhhcyBub3QsIGEgc2VjdXJpdHkgZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLgotICAgICAqIAorICAgICAqCiAgICAgICogQHJldHVybiBSZXR1cm5zIHRydWUgaWYgdGhlIHBhc3N3b3JkIG1lZXRzIHRoZSBjdXJyZW50IHJlcXVpcmVtZW50cywKICAgICAgKiBlbHNlIGZhbHNlLgogICAgICAqLwpAQCAtMzQ2LDExICs3MjksMTEgQEAKICAgICAgICAgfQogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQotICAgIAorCiAgICAgLyoqCiAgICAgICogUmV0cmlldmUgdGhlIG51bWJlciBvZiB0aW1lcyB0aGUgdXNlciBoYXMgZmFpbGVkIGF0IGVudGVyaW5nIGEKICAgICAgKiBwYXNzd29yZCBzaW5jZSB0aGF0IGxhc3Qgc3VjY2Vzc2Z1bCBwYXNzd29yZCBlbnRyeS4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIDxwPlRoZSBjYWxsaW5nIGRldmljZSBhZG1pbiBtdXN0IGhhdmUgcmVxdWVzdGVkCiAgICAgICoge0BsaW5rIERldmljZUFkbWluSW5mbyNVU0VTX1BPTElDWV9XQVRDSF9MT0dJTn0gdG8gYmUgYWJsZSB0byBjYWxsCiAgICAgICogdGhpcyBtZXRob2Q7IGlmIGl0IGhhcyBub3QsIGEgc2VjdXJpdHkgZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLgpAQCAtMzczLDE0ICs3NTYsMTQgQEAKICAgICAgKiB3YXRjaGluZyBmb3IgZmFpbGVkIHBhc3N3b3JkcyBhbmQgd2lwaW5nIHRoZSBkZXZpY2UsIGFuZCByZXF1aXJlcwogICAgICAqIHRoYXQgeW91IHJlcXVlc3QgYm90aCB7QGxpbmsgRGV2aWNlQWRtaW5JbmZvI1VTRVNfUE9MSUNZX1dBVENIX0xPR0lOfSBhbmQKICAgICAgKiB7QGxpbmsgRGV2aWNlQWRtaW5JbmZvI1VTRVNfUE9MSUNZX1dJUEVfREFUQX19LgotICAgICAqIAorICAgICAqCiAgICAgICogPHA+VG8gaW1wbGVtZW50IGFueSBvdGhlciBwb2xpY3kgKGUuZy4gd2lwaW5nIGRhdGEgZm9yIGEgcGFydGljdWxhcgogICAgICAqIGFwcGxpY2F0aW9uIG9ubHksIGVyYXNpbmcgb3IgcmV2b2tpbmcgY3JlZGVudGlhbHMsIG9yIHJlcG9ydGluZyB0aGUKICAgICAgKiBmYWlsdXJlIHRvIGEgc2VydmVyKSwgeW91IHNob3VsZCBpbXBsZW1lbnQKICAgICAgKiB7QGxpbmsgRGV2aWNlQWRtaW5SZWNlaXZlciNvblBhc3N3b3JkRmFpbGVkKENvbnRleHQsIGFuZHJvaWQuY29udGVudC5JbnRlbnQpfQogICAgICAqIGluc3RlYWQuICBEbyBub3QgdXNlIHRoaXMgQVBJLCBiZWNhdXNlIGlmIHRoZSBtYXhpbXVtIGNvdW50IGlzIHJlYWNoZWQsCiAgICAgICogdGhlIGRldmljZSB3aWxsIGJlIHdpcGVkIGltbWVkaWF0ZWx5LCBhbmQgeW91ciBjYWxsYmFjayB3aWxsIG5vdCBiZSBpbnZva2VkLgotICAgICAqIAorICAgICAqCiAgICAgICogQHBhcmFtIGFkbWluIFdoaWNoIHtAbGluayBEZXZpY2VBZG1pblJlY2VpdmVyfSB0aGlzIHJlcXVlc3QgaXMgYXNzb2NpYXRlZCB3aXRoLgogICAgICAqIEBwYXJhbSBudW0gVGhlIG51bWJlciBvZiBmYWlsZWQgcGFzc3dvcmQgYXR0ZW1wdHMgYXQgd2hpY2ggcG9pbnQgdGhlCiAgICAgICogZGV2aWNlIHdpbGwgd2lwZSBpdHMgZGF0YS4KQEAgLTM5NCw3ICs3NzcsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgLyoqCiAgICAgICogUmV0cmlldmUgdGhlIGN1cnJlbnQgbWF4aW11bSBudW1iZXIgb2YgbG9naW4gYXR0ZW1wdHMgdGhhdCBhcmUgYWxsb3dlZAogICAgICAqIGJlZm9yZSB0aGUgZGV2aWNlIHdpcGVzIGl0c2VsZiwgZm9yIGFsbCBhZG1pbnMKQEAgLTQxMiwxMyArNzk1LDEzIEBACiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQotICAgIAorCiAgICAgLyoqCiAgICAgICogRmxhZyBmb3Ige0BsaW5rICNyZXNldFBhc3N3b3JkfTogZG9uJ3QgYWxsb3cgb3RoZXIgYWRtaW5zIHRvIGNoYW5nZQogICAgICAqIHRoZSBwYXNzd29yZCBhZ2FpbiB1bnRpbCB0aGUgdXNlciBoYXMgZW50ZXJlZCBpdC4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVNFVF9QQVNTV09SRF9SRVFVSVJFX0VOVFJZID0gMHgwMDAxOwotICAgIAorCiAgICAgLyoqCiAgICAgICogRm9yY2UgYSBuZXcgZGV2aWNlIHVubG9jayBwYXNzd29yZCAodGhlIHBhc3N3b3JkIG5lZWRlZCB0byBhY2Nlc3MgdGhlCiAgICAgICogZW50aXJlIGRldmljZSwgbm90IGZvciBpbmRpdmlkdWFsIGFjY291bnRzKSBvbiB0aGUgdXNlci4gIFRoaXMgdGFrZXMKQEAgLTQzMSwxMSArODE0LDExIEBACiAgICAgICogdGhhdCB0aGUgcGFzc3dvcmQgbWF5IGJlIGEgc3Ryb25nZXIgcXVhbGl0eSAoY29udGFpbmluZyBhbHBoYW51bWVyaWMKICAgICAgKiBjaGFyYWN0ZXJzIHdoZW4gdGhlIHJlcXVlc3RlZCBxdWFsaXR5IGlzIG9ubHkgbnVtZXJpYyksIGluIHdoaWNoIGNhc2UKICAgICAgKiB0aGUgY3VycmVudGx5IGFjdGl2ZSBxdWFsaXR5IHdpbGwgYmUgaW5jcmVhc2VkIHRvIG1hdGNoLgotICAgICAqIAorICAgICAqCiAgICAgICogPHA+VGhlIGNhbGxpbmcgZGV2aWNlIGFkbWluIG11c3QgaGF2ZSByZXF1ZXN0ZWQKICAgICAgKiB7QGxpbmsgRGV2aWNlQWRtaW5JbmZvI1VTRVNfUE9MSUNZX1JFU0VUX1BBU1NXT1JEfSB0byBiZSBhYmxlIHRvIGNhbGwKICAgICAgKiB0aGlzIG1ldGhvZDsgaWYgaXQgaGFzIG5vdCwgYSBzZWN1cml0eSBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24uCi0gICAgICogCisgICAgICoKICAgICAgKiBAcGFyYW0gcGFzc3dvcmQgVGhlIG5ldyBwYXNzd29yZCBmb3IgdGhlIHVzZXIuCiAgICAgICogQHBhcmFtIGZsYWdzIE1heSBiZSAwIG9yIHtAbGluayAjUkVTRVRfUEFTU1dPUkRfUkVRVUlSRV9FTlRSWX0uCiAgICAgICogQHJldHVybiBSZXR1cm5zIHRydWUgaWYgdGhlIHBhc3N3b3JkIHdhcyBhcHBsaWVkLCBvciBmYWxzZSBpZiBpdCBpcwpAQCAtNDUxLDE2ICs4MzQsMTYgQEAKICAgICAgICAgfQogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQotICAgIAorCiAgICAgLyoqCiAgICAgICogQ2FsbGVkIGJ5IGFuIGFwcGxpY2F0aW9uIHRoYXQgaXMgYWRtaW5pc3RlcmluZyB0aGUgZGV2aWNlIHRvIHNldCB0aGUKICAgICAgKiBtYXhpbXVtIHRpbWUgZm9yIHVzZXIgYWN0aXZpdHkgdW50aWwgdGhlIGRldmljZSB3aWxsIGxvY2suICBUaGlzIGxpbWl0cwogICAgICAqIHRoZSBsZW5ndGggdGhhdCB0aGUgdXNlciBjYW4gc2V0LiAgSXQgdGFrZXMgZWZmZWN0IGltbWVkaWF0ZWx5LgotICAgICAqIAorICAgICAqCiAgICAgICogPHA+VGhlIGNhbGxpbmcgZGV2aWNlIGFkbWluIG11c3QgaGF2ZSByZXF1ZXN0ZWQKICAgICAgKiB7QGxpbmsgRGV2aWNlQWRtaW5JbmZvI1VTRVNfUE9MSUNZX0ZPUkNFX0xPQ0t9IHRvIGJlIGFibGUgdG8gY2FsbAogICAgICAqIHRoaXMgbWV0aG9kOyBpZiBpdCBoYXMgbm90LCBhIHNlY3VyaXR5IGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bi4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIEBwYXJhbSBhZG1pbiBXaGljaCB7QGxpbmsgRGV2aWNlQWRtaW5SZWNlaXZlcn0gdGhpcyByZXF1ZXN0IGlzIGFzc29jaWF0ZWQgd2l0aC4KICAgICAgKiBAcGFyYW0gdGltZU1zIFRoZSBuZXcgZGVzaXJlZCBtYXhpbXVtIHRpbWUgdG8gbG9jayBpbiBtaWxsaXNlY29uZHMuCiAgICAgICogQSB2YWx1ZSBvZiAwIG1lYW5zIHRoZXJlIGlzIG5vIHJlc3RyaWN0aW9uLgpAQCAtNDc0LDcgKzg1Nyw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBSZXRyaWV2ZSB0aGUgY3VycmVudCBtYXhpbXVtIHRpbWUgdG8gdW5sb2NrIGZvciBhbGwgYWRtaW5zCiAgICAgICogb3IgYSBwYXJ0aWN1bGFyIG9uZS4KQEAgLTQ5MSwxMSArODc0LDExIEBACiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQotICAgIAorCiAgICAgLyoqCiAgICAgICogTWFrZSB0aGUgZGV2aWNlIGxvY2sgaW1tZWRpYXRlbHksIGFzIGlmIHRoZSBsb2NrIHNjcmVlbiB0aW1lb3V0IGhhcwogICAgICAqIGV4cGlyZWQgYXQgdGhlIHBvaW50IG9mIHRoaXMgY2FsbC4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIDxwPlRoZSBjYWxsaW5nIGRldmljZSBhZG1pbiBtdXN0IGhhdmUgcmVxdWVzdGVkCiAgICAgICoge0BsaW5rIERldmljZUFkbWluSW5mbyNVU0VTX1BPTElDWV9GT1JDRV9MT0NLfSB0byBiZSBhYmxlIHRvIGNhbGwKICAgICAgKiB0aGlzIG1ldGhvZDsgaWYgaXQgaGFzIG5vdCwgYSBzZWN1cml0eSBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24uCkBAIC01MDksMTYgKzg5MiwxNiBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgLyoqCiAgICAgICogQXNrIHRoZSB1c2VyIGRhdGUgYmUgd2lwZWQuICBUaGlzIHdpbGwgY2F1c2UgdGhlIGRldmljZSB0byByZWJvb3QsCiAgICAgICogZXJhc2luZyBhbGwgdXNlciBkYXRhIHdoaWxlIG5leHQgYm9vdGluZyB1cC4gIEV4dGVybmFsIHN0b3JhZ2Ugc3VjaAogICAgICAqIGFzIFNEIGNhcmRzIHdpbGwgbm90IGJlIGVyYXNlZC4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIDxwPlRoZSBjYWxsaW5nIGRldmljZSBhZG1pbiBtdXN0IGhhdmUgcmVxdWVzdGVkCiAgICAgICoge0BsaW5rIERldmljZUFkbWluSW5mbyNVU0VTX1BPTElDWV9XSVBFX0RBVEF9IHRvIGJlIGFibGUgdG8gY2FsbAogICAgICAqIHRoaXMgbWV0aG9kOyBpZiBpdCBoYXMgbm90LCBhIHNlY3VyaXR5IGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bi4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIEBwYXJhbSBmbGFncyBCaXQgbWFzayBvZiBhZGRpdGlvbmFsIG9wdGlvbnM6IGN1cnJlbnRseSBtdXN0IGJlIDAuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgd2lwZURhdGEoaW50IGZsYWdzKSB7CkBAIC01MzAsNyArOTEzLDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIEBoaWRlCiAgICAgICovCkBAIC01NDMsNyArOTI2LDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIEBoaWRlCiAgICAgICovCkBAIC01NTYsMTAgKzkzOSwxMCBAQAogICAgICAgICAgICAgTG9nLncoVEFHLCAiVW5hYmxlIHRvIHJldHJpZXZlIGRldmljZSBwb2xpY3kgIiArIGNuLCBlKTsKICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICB9Ci0gICAgICAgIAorCiAgICAgICAgIFJlc29sdmVJbmZvIHJpID0gbmV3IFJlc29sdmVJbmZvKCk7CiAgICAgICAgIHJpLmFjdGl2aXR5SW5mbyA9IGFpOwotICAgICAgICAKKwogICAgICAgICB0cnkgewogICAgICAgICAgICAgcmV0dXJuIG5ldyBEZXZpY2VBZG1pbkluZm8obUNvbnRleHQsIHJpKTsKICAgICAgICAgfSBjYXRjaCAoWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiBlKSB7CkBAIC01NzAsNyArOTUzLDcgQEAKICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgLyoqCiAgICAgICogQGhpZGUKICAgICAgKi8KQEAgLTU4NywxNiArOTcwLDE4IEBACiAgICAgLyoqCiAgICAgICogQGhpZGUKICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRBY3RpdmVQYXNzd29yZFN0YXRlKGludCBxdWFsaXR5LCBpbnQgbGVuZ3RoKSB7CisgICAgcHVibGljIHZvaWQgc2V0QWN0aXZlUGFzc3dvcmRTdGF0ZShpbnQgcXVhbGl0eSwgaW50IGxlbmd0aCwgaW50IGxldHRlcnMsIGludCB1cHBlcmNhc2UsCisgICAgICAgICAgICBpbnQgbG93ZXJjYXNlLCBpbnQgbnVtYmVycywgaW50IHN5bWJvbHMsIGludCBub25sZXR0ZXIpIHsKICAgICAgICAgaWYgKG1TZXJ2aWNlICE9IG51bGwpIHsKICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbVNlcnZpY2Uuc2V0QWN0aXZlUGFzc3dvcmRTdGF0ZShxdWFsaXR5LCBsZW5ndGgpOworICAgICAgICAgICAgICAgIG1TZXJ2aWNlLnNldEFjdGl2ZVBhc3N3b3JkU3RhdGUocXVhbGl0eSwgbGVuZ3RoLCBsZXR0ZXJzLCB1cHBlcmNhc2UsIGxvd2VyY2FzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG51bWJlcnMsIHN5bWJvbHMsIG5vbmxldHRlcik7CiAgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkZhaWxlZCB0YWxraW5nIHdpdGggZGV2aWNlIHBvbGljeSBzZXJ2aWNlIiwgZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBAaGlkZQogICAgICAqLwpAQCAtNjA5LDcgKzk5NCw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBAaGlkZQogICAgICAqLwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL2FkbWluL0lEZXZpY2VQb2xpY3lNYW5hZ2VyLmFpZGwgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvYWRtaW4vSURldmljZVBvbGljeU1hbmFnZXIuYWlkbAppbmRleCA2ZmM0ZGM1Li4zYWRhOTVjIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvYWRtaW4vSURldmljZVBvbGljeU1hbmFnZXIuYWlkbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvYWRtaW4vSURldmljZVBvbGljeU1hbmFnZXIuYWlkbApAQCAtMjcsMTAgKzI3LDMxIEBACiBpbnRlcmZhY2UgSURldmljZVBvbGljeU1hbmFnZXIgewogICAgIHZvaWQgc2V0UGFzc3dvcmRRdWFsaXR5KGluIENvbXBvbmVudE5hbWUgd2hvLCBpbnQgcXVhbGl0eSk7CiAgICAgaW50IGdldFBhc3N3b3JkUXVhbGl0eShpbiBDb21wb25lbnROYW1lIHdobyk7Ci0gICAgCisKICAgICB2b2lkIHNldFBhc3N3b3JkTWluaW11bUxlbmd0aChpbiBDb21wb25lbnROYW1lIHdobywgaW50IGxlbmd0aCk7CiAgICAgaW50IGdldFBhc3N3b3JkTWluaW11bUxlbmd0aChpbiBDb21wb25lbnROYW1lIHdobyk7CisKKyAgICB2b2lkIHNldFBhc3N3b3JkTWluaW11bVVwcGVyQ2FzZShpbiBDb21wb25lbnROYW1lIHdobywgaW50IGxlbmd0aCk7CisgICAgaW50IGdldFBhc3N3b3JkTWluaW11bVVwcGVyQ2FzZShpbiBDb21wb25lbnROYW1lIHdobyk7CisKKyAgICB2b2lkIHNldFBhc3N3b3JkTWluaW11bUxvd2VyQ2FzZShpbiBDb21wb25lbnROYW1lIHdobywgaW50IGxlbmd0aCk7CisgICAgaW50IGdldFBhc3N3b3JkTWluaW11bUxvd2VyQ2FzZShpbiBDb21wb25lbnROYW1lIHdobyk7CisKKyAgICB2b2lkIHNldFBhc3N3b3JkTWluaW11bUxldHRlcnMoaW4gQ29tcG9uZW50TmFtZSB3aG8sIGludCBsZW5ndGgpOworICAgIGludCBnZXRQYXNzd29yZE1pbmltdW1MZXR0ZXJzKGluIENvbXBvbmVudE5hbWUgd2hvKTsKKworICAgIHZvaWQgc2V0UGFzc3dvcmRNaW5pbXVtTnVtZXJpYyhpbiBDb21wb25lbnROYW1lIHdobywgaW50IGxlbmd0aCk7CisgICAgaW50IGdldFBhc3N3b3JkTWluaW11bU51bWVyaWMoaW4gQ29tcG9uZW50TmFtZSB3aG8pOworCisgICAgdm9pZCBzZXRQYXNzd29yZE1pbmltdW1TeW1ib2xzKGluIENvbXBvbmVudE5hbWUgd2hvLCBpbnQgbGVuZ3RoKTsKKyAgICBpbnQgZ2V0UGFzc3dvcmRNaW5pbXVtU3ltYm9scyhpbiBDb21wb25lbnROYW1lIHdobyk7CisKKyAgICB2b2lkIHNldFBhc3N3b3JkTWluaW11bU5vbkxldHRlcihpbiBDb21wb25lbnROYW1lIHdobywgaW50IGxlbmd0aCk7CisgICAgaW50IGdldFBhc3N3b3JkTWluaW11bU5vbkxldHRlcihpbiBDb21wb25lbnROYW1lIHdobyk7CiAgICAgCisgICAgdm9pZCBzZXRQYXNzd29yZEhpc3RvcnlMZW5ndGgoaW4gQ29tcG9uZW50TmFtZSB3aG8sIGludCBsZW5ndGgpOworICAgIGludCBnZXRQYXNzd29yZEhpc3RvcnlMZW5ndGgoaW4gQ29tcG9uZW50TmFtZSB3aG8pOworCiAgICAgYm9vbGVhbiBpc0FjdGl2ZVBhc3N3b3JkU3VmZmljaWVudCgpOwogICAgIGludCBnZXRDdXJyZW50RmFpbGVkUGFzc3dvcmRBdHRlbXB0cygpOwogICAgIApAQCAtNTMsNyArNzQsOCBAQAogICAgIHZvaWQgZ2V0UmVtb3ZlV2FybmluZyhpbiBDb21wb25lbnROYW1lIHBvbGljeVJlY2VpdmVyLCBpbiBSZW1vdGVDYWxsYmFjayByZXN1bHQpOwogICAgIHZvaWQgcmVtb3ZlQWN0aXZlQWRtaW4oaW4gQ29tcG9uZW50TmFtZSBwb2xpY3lSZWNlaXZlcik7CiAgICAgCi0gICAgdm9pZCBzZXRBY3RpdmVQYXNzd29yZFN0YXRlKGludCBxdWFsaXR5LCBpbnQgbGVuZ3RoKTsKKyAgICB2b2lkIHNldEFjdGl2ZVBhc3N3b3JkU3RhdGUoaW50IHF1YWxpdHksIGludCBsZW5ndGgsIGludCBsZXR0ZXJzLCBpbnQgdXBwZXJjYXNlLCBpbnQgbG93ZXJjYXNlLAorICAgICAgICBpbnQgbnVtYmVycywgaW50IHN5bWJvbHMsIGludCBub25sZXR0ZXIpOwogICAgIHZvaWQgcmVwb3J0RmFpbGVkUGFzc3dvcmRBdHRlbXB0KCk7CiAgICAgdm9pZCByZXBvcnRTdWNjZXNzZnVsUGFzc3dvcmRBdHRlbXB0KCk7CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hcHB3aWRnZXQvQXBwV2lkZ2V0SG9zdFZpZXcuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcHdpZGdldC9BcHBXaWRnZXRIb3N0Vmlldy5qYXZhCmluZGV4IGIzM2IwOTcuLjNjMTllYTMgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcHdpZGdldC9BcHBXaWRnZXRIb3N0Vmlldy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcHdpZGdldC9BcHBXaWRnZXRIb3N0Vmlldy5qYXZhCkBAIC0yMyw5ICsyMyw5IEBACiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Db2xvcjsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50OwotaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7Ci1pbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxhYmxlOwogaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsOworaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsYWJsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOwogaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIGltcG9ydCBhbmRyb2lkLnV0aWwuU3BhcnNlQXJyYXk7CkBAIC0yNzUsNiArMjc1LDcgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCBib29sZWFuIGRyYXdDaGlsZChDYW52YXMgY2FudmFzLCBWaWV3IGNoaWxkLCBsb25nIGRyYXdpbmdUaW1lKSB7CiAgICAgICAgIGlmIChDUk9TU0ZBREUpIHsKICAgICAgICAgICAgIGludCBhbHBoYTsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhDbGFzcy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aENsYXNzLmphdmEKaW5kZXggYzdmZWE5ZS4uMGM5YmFiMiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aENsYXNzLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aENsYXNzLmphdmEKQEAgLTI1OSw2ICsyNTksOCBAQAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST0ZJTEVfQTJEUCA9IDE7CiAgICAgLyoqIEBoaWRlICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPRklMRV9PUFAgPSAyOworICAgIC8qKiBAaGlkZSAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST0ZJTEVfSElEID0gMzsKIAogICAgIC8qKgogICAgICAqIENoZWNrIGNsYXNzIGJpdHMgZm9yIHBvc3NpYmxlIGJsdWV0b290aCBwcm9maWxlIHN1cHBvcnQuCkBAIC0zMjQsNiArMzI2LDggQEAKICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAocHJvZmlsZSA9PSBQUk9GSUxFX0hJRCkgeworICAgICAgICAgICAgcmV0dXJuIChnZXREZXZpY2VDbGFzcygpICYgRGV2aWNlLk1ham9yLlBFUklQSEVSQUwpID09IERldmljZS5NYWpvci5QRVJJUEhFUkFMOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoSW5wdXREZXZpY2UuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhJbnB1dERldmljZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3OTM4MzgKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoSW5wdXREZXZpY2UuamF2YQpAQCAtMCwwICsxLDI0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5ibHVldG9vdGg7CisKK2ltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uU2RrQ29uc3RhbnQ7CitpbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLlNka0NvbnN0YW50LlNka0NvbnN0YW50VHlwZTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CitpbXBvcnQgYW5kcm9pZC5vcy5TZXJ2aWNlTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworLyoqCisgKiBQdWJsaWMgQVBJIGZvciBjb250cm9sbGluZyB0aGUgQmx1ZXRvb3RoIEhJRCAoSW5wdXQgRGV2aWNlKSBQcm9maWxlCisgKgorICogQmx1ZXRvb3RoSW5wdXREZXZpY2UgaXMgYSBwcm94eSBvYmplY3QgdXNlZCB0byBtYWtlIGNhbGxzIHRvIEJsdWV0b290aCBTZXJ2aWNlCisgKiB3aGljaCBoYW5kbGVzIHRoZSBISUQgcHJvZmlsZS4KKyAqCisgKiBDcmVhdGluZyBhIEJsdWV0b290aElucHV0RGV2aWNlIG9iamVjdCB3aWxsIGluaXRpYXRlIGEgYmluZGluZyB3aXRoIHRoZQorICogQmx1ZXRvb3RoIHNlcnZpY2UuIFVzZXJzIG9mIHRoaXMgb2JqZWN0IHNob3VsZCBjYWxsIGNsb3NlKCkgd2hlbiB0aGV5CisgKiBhcmUgZmluaXNoZWQsIHNvIHRoYXQgdGhpcyBwcm94eSBvYmplY3QgY2FuIHVuYmluZCBmcm9tIHRoZSBzZXJ2aWNlLgorICoKKyAqIEN1cnJlbnRseSB0aGUgQmx1ZXRvb3RoIHNlcnZpY2UgcnVucyBpbiB0aGUgc3lzdGVtIHNlcnZlciBhbmQgdGhpcworICogcHJveHkgb2JqZWN0IHdpbGwgYmUgaW1tZWRpYXRlbHkgYm91bmQgdG8gdGhlIHNlcnZpY2Ugb24gY29uc3RydWN0aW9uLgorICoKKyAqICBAaGlkZQorICovCitwdWJsaWMgZmluYWwgY2xhc3MgQmx1ZXRvb3RoSW5wdXREZXZpY2UgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiQmx1ZXRvb3RoSW5wdXREZXZpY2UiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREJHID0gZmFsc2U7CisKKyAgICAvKiogaW50IGV4dHJhIGZvciBBQ1RJT05fSU5QVVRfREVWSUNFX1NUQVRFX0NIQU5HRUQgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9JTlBVVF9ERVZJQ0VfU1RBVEUgPQorICAgICAgICAiYW5kcm9pZC5ibHVldG9vdGguaW5wdXRkZXZpY2UuZXh0cmEuSU5QVVRfREVWSUNFX1NUQVRFIjsKKyAgICAvKiogaW50IGV4dHJhIGZvciBBQ1RJT05fSU5QVVRfREVWSUNFX1NUQVRFX0NIQU5HRUQgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9QUkVWSU9VU19JTlBVVF9ERVZJQ0VfU1RBVEUgPQorICAgICAgICAiYW5kcm9pZC5ibHVldG9vdGguaW5wdXRkZXZpY2UuZXh0cmEuUFJFVklPVVNfSU5QVVRfREVWSUNFX1NUQVRFIjsKKworICAgIC8qKiBJbmRpY2F0ZXMgdGhlIHN0YXRlIG9mIGFuIGlucHV0IGRldmljZSBoYXMgY2hhbmdlZC4KKyAgICAgKiBUaGlzIGludGVudCB3aWxsIGFsd2F5cyBjb250YWluIEVYVFJBX0lOUFVUX0RFVklDRV9TVEFURSwKKyAgICAgKiBFWFRSQV9QUkVWSU9VU19JTlBVVF9ERVZJQ0VfU1RBVEUgYW5kIEJsdWV0b290aERldmljZS5FWFRSQV9ERVZJQ0UKKyAgICAgKiBleHRyYXMuCisgICAgICovCisgICAgQFNka0NvbnN0YW50KFNka0NvbnN0YW50VHlwZS5CUk9BRENBU1RfSU5URU5UX0FDVElPTikKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fSU5QVVRfREVWSUNFX1NUQVRFX0NIQU5HRUQgPQorICAgICAgICAiYW5kcm9pZC5ibHVldG9vdGguaW5wdXRkZXZpY2UuYWN0aW9uLklOUFVUX0RFVklDRV9TVEFURV9DSEFOR0VEIjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0RJU0NPTk5FQ1RFRCA9IDA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfQ09OTkVDVElORyAgID0gMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFURV9DT05ORUNURUQgICAgPSAyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0RJU0NPTk5FQ1RJTkcgPSAzOworCisgICAgLyoqCisgICAgICogQXV0byBjb25uZWN0aW9uLCBpbmNvbWluZyBhbmQgb3V0Z29pbmcgY29ubmVjdGlvbiBhcmUgYWxsb3dlZCBhdCB0aGlzCisgICAgICogcHJpb3JpdHkgbGV2ZWwuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJJT1JJVFlfQVVUT19DT05ORUNUID0gMTAwMDsKKyAgICAvKioKKyAgICAgKiBJbmNvbWluZyBhbmQgb3V0Z29pbmcgY29ubmVjdGlvbiBhcmUgYWxsb3dlZCBhdCB0aGlzIHByaW9yaXR5IGxldmVsCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJJT1JJVFlfT04gPSAxMDA7CisgICAgLyoqCisgICAgICogQ29ubmVjdGlvbnMgdG8gdGhlIGRldmljZSBhcmUgbm90IGFsbG93ZWQgYXQgdGhpcyBwcmlvcml0eSBsZXZlbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUklPUklUWV9PRkYgPSAwOworICAgIC8qKgorICAgICAqIERlZmF1bHQgcHJpb3JpdHkgbGV2ZWwgd2hlbiB0aGUgZGV2aWNlIGlzIHVucGFpcmVkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBSSU9SSVRZX1VOREVGSU5FRCA9IC0xOworCisgICAgcHJpdmF0ZSBmaW5hbCBJQmx1ZXRvb3RoIG1TZXJ2aWNlOworICAgIHByaXZhdGUgZmluYWwgQ29udGV4dCBtQ29udGV4dDsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIEJsdWV0b290aElucHV0RGV2aWNlIHByb3h5IG9iamVjdCBmb3IgaW50ZXJhY3Rpbmcgd2l0aCB0aGUgbG9jYWwKKyAgICAgKiBCbHVldG9vdGggU2VydmljZSB3aGljaCBoYW5kbGUgdGhlIEhJRCBwcm9maWxlLgorICAgICAqIEBwYXJhbSBjIENvbnRleHQKKyAgICAgKi8KKyAgICBwdWJsaWMgQmx1ZXRvb3RoSW5wdXREZXZpY2UoQ29udGV4dCBjKSB7CisgICAgICAgIG1Db250ZXh0ID0gYzsKKworICAgICAgICBJQmluZGVyIGIgPSBTZXJ2aWNlTWFuYWdlci5nZXRTZXJ2aWNlKEJsdWV0b290aEFkYXB0ZXIuQkxVRVRPT1RIX1NFUlZJQ0UpOworICAgICAgICBpZiAoYiAhPSBudWxsKSB7CisgICAgICAgICAgICBtU2VydmljZSA9IElCbHVldG9vdGguU3R1Yi5hc0ludGVyZmFjZShiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExvZy53KFRBRywgIkJsdWV0b290aCBTZXJ2aWNlIG5vdCBhdmFpbGFibGUhIik7CisKKyAgICAgICAgICAgIC8vIEluc3RlYWQgb2YgdGhyb3dpbmcgYW4gZXhjZXB0aW9uIHdoaWNoIHByZXZlbnRzIHBlb3BsZSBmcm9tIGdvaW5nCisgICAgICAgICAgICAvLyBpbnRvIFdpcmVsZXNzIHNldHRpbmdzIGluIHRoZSBlbXVsYXRvci4gTGV0IGl0IGNyYXNoIGxhdGVyIHdoZW4gaXQgaXMgYWN0dWFsbHkgdXNlZC4KKyAgICAgICAgICAgIG1TZXJ2aWNlID0gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKiBJbml0aWF0ZSBhIGNvbm5lY3Rpb24gdG8gYW4gSW5wdXQgZGV2aWNlLgorICAgICAqCisgICAgICogIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBmYWxzZSBvbiBlcnJvciBhbmQgdHJ1ZSBpZiB0aGUgY29ubmVjdGlvbgorICAgICAqICBhdHRlbXB0IGlzIGJlaW5nIG1hZGUuCisgICAgICoKKyAgICAgKiAgTGlzdGVuIGZvciBJTlBVVF9ERVZJQ0VfU1RBVEVfQ0hBTkdFRF9BQ1RJT04gdG8gZmluZCBvdXQgd2hlbiB0aGUKKyAgICAgKiAgY29ubmVjdGlvbiBpcyBjb21wbGV0ZWQuCisgICAgICogIEBwYXJhbSBkZXZpY2UgUmVtb3RlIEJUIGRldmljZS4KKyAgICAgKiAgQHJldHVybiBmYWxzZSBvbiBpbW1lZGlhdGUgZXJyb3IsIHRydWUgb3RoZXJ3aXNlCisgICAgICogIEBoaWRlCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gY29ubmVjdElucHV0RGV2aWNlKEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKKyAgICAgICAgaWYgKERCRykgbG9nKCJjb25uZWN0SW5wdXREZXZpY2UoIiArIGRldmljZSArICIpIik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gbVNlcnZpY2UuY29ubmVjdElucHV0RGV2aWNlKGRldmljZSk7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICIiLCBlKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKiBJbml0aWF0ZSBkaXNjb25uZWN0IGZyb20gYW4gSW5wdXQgRGV2aWNlLgorICAgICAqICBUaGlzIGZ1bmN0aW9uIHJldHVybiBmYWxzZSBvbiBlcnJvciBhbmQgdHJ1ZSBpZiB0aGUgZGlzY29ubmVjdGlvbgorICAgICAqICBhdHRlbXB0IGlzIGJlaW5nIG1hZGUuCisgICAgICoKKyAgICAgKiAgTGlzdGVuIGZvciBJTlBVVF9ERVZJQ0VfU1RBVEVfQ0hBTkdFRF9BQ1RJT04gdG8gZmluZCBvdXQgd2hlbgorICAgICAqICBkaXNjb25uZWN0IGlzIGNvbXBsZXRlZC4KKyAgICAgKgorICAgICAqICBAcGFyYW0gZGV2aWNlIFJlbW90ZSBCVCBkZXZpY2UuCisgICAgICogIEByZXR1cm4gZmFsc2Ugb24gaW1tZWRpYXRlIGVycm9yLCB0cnVlIG90aGVyd2lzZQorICAgICAqICBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGRpc2Nvbm5lY3RJbnB1dERldmljZShCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7CisgICAgICAgIGlmIChEQkcpIGxvZygiZGlzY29ubmVjdElucHV0RGV2aWNlKCIgKyBkZXZpY2UgKyAiKSIpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLmRpc2Nvbm5lY3RJbnB1dERldmljZShkZXZpY2UpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiIiwgZSk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiogQ2hlY2sgaWYgYSBzcGVjaWZpZWQgSW5wdXREZXZpY2UgaXMgY29ubmVjdGVkLgorICAgICAqCisgICAgICogIEBwYXJhbSBkZXZpY2UgUmVtb3RlIEJUIGRldmljZS4KKyAgICAgKiAgQHJldHVybiBUcnVlIGlmIGNvbm5lY3RlZCAsIGZhbHNlIG90aGVyd2lzZSBhbmQgb24gZXJyb3IuCisgICAgICogIEBoaWRlCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNJbnB1dERldmljZUNvbm5lY3RlZChCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7CisgICAgICAgIGlmIChEQkcpIGxvZygiaXNJbnB1dERldmljZUNvbm5lY3RlZCgiICsgZGV2aWNlICsgIikiKTsKKyAgICAgICAgaW50IHN0YXRlID0gZ2V0SW5wdXREZXZpY2VTdGF0ZShkZXZpY2UpOworICAgICAgICBpZiAoc3RhdGUgPT0gU1RBVEVfQ09OTkVDVEVEKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKiBDaGVjayBpZiBhbnkgSW5wdXQgRGV2aWNlIGlzIGNvbm5lY3RlZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYSB1bm1vZGlmaWFibGUgc2V0IG9mIGNvbm5lY3RlZCBJbnB1dCBEZXZpY2VzLCBvciBudWxsIG9uIGVycm9yLgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIFNldDxCbHVldG9vdGhEZXZpY2U+IGdldENvbm5lY3RlZElucHV0RGV2aWNlcygpIHsKKyAgICAgICAgaWYgKERCRykgbG9nKCJnZXRDb25uZWN0ZWRJbnB1dERldmljZXMoKSIpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZVNldCgKKyAgICAgICAgICAgICAgICAgICAgbmV3IEhhc2hTZXQ8Qmx1ZXRvb3RoRGV2aWNlPigKKyAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QobVNlcnZpY2UuZ2V0Q29ubmVjdGVkSW5wdXREZXZpY2VzKCkpKSk7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICIiLCBlKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqIEdldCB0aGUgc3RhdGUgb2YgYW4gSW5wdXQgRGV2aWNlLgorICAgICAqCisgICAgICogIEBwYXJhbSBkZXZpY2UgUmVtb3RlIEJUIGRldmljZS4KKyAgICAgKiAgQHJldHVybiBUaGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgSW5wdXQgRGV2aWNlCisgICAgICogIEBoaWRlCisgICAgICovCisgICAgcHVibGljIGludCBnZXRJbnB1dERldmljZVN0YXRlKEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKKyAgICAgICAgaWYgKERCRykgbG9nKCJnZXRJbnB1dERldmljZVN0YXRlKCIgKyBkZXZpY2UgKyAiKSIpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLmdldElucHV0RGV2aWNlU3RhdGUoZGV2aWNlKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIiIsIGUpOworICAgICAgICAgICAgcmV0dXJuIFNUQVRFX0RJU0NPTk5FQ1RFRDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCBwcmlvcml0eSBvZiBhbiBpbnB1dCBkZXZpY2UuCisgICAgICoKKyAgICAgKiBQcmlvcml0eSBpcyBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyLiBQcmlvcml0eSBjYW4gdGFrZSB0aGUgZm9sbG93aW5nCisgICAgICogdmFsdWVzOgorICAgICAqIHtAbGluayBQUklPUklUWV9PTn0sIHtAbGluayBQUklPUklUWV9PRkZ9LCB7QGxpbmsgUFJJT1JJVFlfQVVUT19DT05ORUNUfQorICAgICAqCisgICAgICogQHBhcmFtIGRldmljZSBQYWlyZWQgZGV2aWNlLgorICAgICAqIEBwYXJhbSBwcmlvcml0eSBJbnRlZ2VyIHByaW9yaXR5CisgICAgICogQHJldHVybiB0cnVlIGlmIHByaW9yaXR5IGlzIHNldCwgZmFsc2Ugb24gZXJyb3IKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBzZXRJbnB1dERldmljZVByaW9yaXR5KEJsdWV0b290aERldmljZSBkZXZpY2UsIGludCBwcmlvcml0eSkgeworICAgICAgICBpZiAoREJHKSBsb2coInNldElucHV0RGV2aWNlUHJpb3JpdHkoIiArIGRldmljZSArICIsICIgKyBwcmlvcml0eSArICIpIik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gbVNlcnZpY2Uuc2V0SW5wdXREZXZpY2VQcmlvcml0eShkZXZpY2UsIHByaW9yaXR5KTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIiIsIGUpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBwcmlvcml0eSBhc3NvY2lhdGVkIHdpdGggYW4gSW5wdXQgRGV2aWNlLgorICAgICAqCisgICAgICogQHBhcmFtIGRldmljZSBJbnB1dCBEZXZpY2UKKyAgICAgKiBAcmV0dXJuIG5vbi1uZWdhdGl2ZSBwcmlvcml0eSwgb3IgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBlcnJvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldElucHV0RGV2aWNlUHJpb3JpdHkoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgeworICAgICAgICBpZiAoREJHKSBsb2coImdldElucHV0RGV2aWNlUHJpb3JpdHkoIiArIGRldmljZSArICIpIik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gbVNlcnZpY2UuZ2V0SW5wdXREZXZpY2VQcmlvcml0eShkZXZpY2UpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiIiwgZSk7CisgICAgICAgICAgICByZXR1cm4gUFJJT1JJVFlfT0ZGOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBsb2coU3RyaW5nIG1zZykgeworICAgICAgICBMb2cuZChUQUcsIG1zZyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aFV1aWQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhVdWlkLmphdmEKaW5kZXggNDE2NGEzZC4uZjFlZTkwNyAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aFV1aWQuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoVXVpZC5qYXZhCkBAIC00OSw2ICs0OSw4IEBACiAgICAgICAgICAgICBQYXJjZWxVdWlkLmZyb21TdHJpbmcoIjAwMDAxMTBDLTAwMDAtMTAwMC04MDAwLTAwODA1RjlCMzRGQiIpOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUGFyY2VsVXVpZCBPYmV4T2JqZWN0UHVzaCA9CiAgICAgICAgICAgICBQYXJjZWxVdWlkLmZyb21TdHJpbmcoIjAwMDAxMTA1LTAwMDAtMTAwMC04MDAwLTAwODA1ZjliMzRmYiIpOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUGFyY2VsVXVpZCBIaWQgPQorICAgICAgICAgICAgUGFyY2VsVXVpZC5mcm9tU3RyaW5nKCIwMDAwMTEyNC0wMDAwLTEwMDAtODAwMC0wMDgwNWY5YjM0ZmIiKTsKIAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUGFyY2VsVXVpZFtdIFJFU0VSVkVEX1VVSURTID0gewogICAgICAgICBBdWRpb1NpbmssIEF1ZGlvU291cmNlLCBBZHZBdWRpb0Rpc3QsIEhTUCwgSGFuZHNmcmVlLCBBdnJjcENvbnRyb2xsZXIsIEF2cmNwVGFyZ2V0LApAQCAtODIsNiArODQsMTAgQEAKICAgICAgICAgcmV0dXJuIHV1aWQuZXF1YWxzKEF2cmNwVGFyZ2V0KTsKICAgICB9CiAKKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNJbnB1dERldmljZShQYXJjZWxVdWlkIHV1aWQpIHsKKyAgICAgICAgcmV0dXJuIHV1aWQuZXF1YWxzKEhpZCk7CisgICAgfQorCiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0cnVlIGlmIFBhcmNlbFV1aWQgaXMgcHJlc2VudCBpbiB1dWlkQXJyYXkKICAgICAgKgpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYmx1ZXRvb3RoL0lCbHVldG9vdGguYWlkbCBiL2NvcmUvamF2YS9hbmRyb2lkL2JsdWV0b290aC9JQmx1ZXRvb3RoLmFpZGwKaW5kZXggZWE3MTAzNC4uNzVmMDkzYyAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYmx1ZXRvb3RoL0lCbHVldG9vdGguYWlkbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvSUJsdWV0b290aC5haWRsCkBAIC0xNyw2ICsxNyw3IEBACiBwYWNrYWdlIGFuZHJvaWQuYmx1ZXRvb3RoOwogCiBpbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguSUJsdWV0b290aENhbGxiYWNrOworaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aERldmljZTsKIGltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbFV1aWQ7CiAKIC8qKgpAQCAtNzIsNCArNzMsMTIgQEAKICAgICBib29sZWFuIGNvbm5lY3RIZWFkc2V0KFN0cmluZyBhZGRyZXNzKTsKICAgICBib29sZWFuIGRpc2Nvbm5lY3RIZWFkc2V0KFN0cmluZyBhZGRyZXNzKTsKICAgICBib29sZWFuIG5vdGlmeUluY29taW5nQ29ubmVjdGlvbihTdHJpbmcgYWRkcmVzcyk7CisKKyAgICAvLyBISUQgcHJvZmlsZSBBUElzCisgICAgYm9vbGVhbiBjb25uZWN0SW5wdXREZXZpY2UoaW4gQmx1ZXRvb3RoRGV2aWNlIGRldmljZSk7CisgICAgYm9vbGVhbiBkaXNjb25uZWN0SW5wdXREZXZpY2UoaW4gQmx1ZXRvb3RoRGV2aWNlIGRldmljZSk7CisgICAgQmx1ZXRvb3RoRGV2aWNlW10gZ2V0Q29ubmVjdGVkSW5wdXREZXZpY2VzKCk7ICAvLyBjaGFuZ2UgdG8gU2V0PD4gb25jZSBBSURMIHN1cHBvcnRzCisgICAgaW50IGdldElucHV0RGV2aWNlU3RhdGUoaW4gQmx1ZXRvb3RoRGV2aWNlIGRldmljZSk7CisgICAgYm9vbGVhbiBzZXRJbnB1dERldmljZVByaW9yaXR5KGluIEJsdWV0b290aERldmljZSBkZXZpY2UsIGludCBwcmlvcml0eSk7CisgICAgaW50IGdldElucHV0RGV2aWNlUHJpb3JpdHkoaW4gQmx1ZXRvb3RoRGV2aWNlIGRldmljZSk7CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0FzeW5jVGFza0xvYWRlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9Bc3luY1Rhc2tMb2FkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTljMDcyCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9Bc3luY1Rhc2tMb2FkZXIuamF2YQpAQCAtMCwwICsxLDEwNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5jb250ZW50OworCitpbXBvcnQgYW5kcm9pZC5vcy5Bc3luY1Rhc2s7CisKKy8qKgorICogQWJzdHJhY3QgTG9hZGVyIHRoYXQgcHJvdmlkZXMgYW4ge0BsaW5rIEFzeW5jVGFza30gdG8gZG8gdGhlIHdvcmsuCisgKgorICogQHBhcmFtIDxEPiB0aGUgZGF0YSB0eXBlIHRvIGJlIGxvYWRlZC4KKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEFzeW5jVGFza0xvYWRlcjxEPiBleHRlbmRzIExvYWRlcjxEPiB7CisgICAgZmluYWwgY2xhc3MgTG9hZFRhc2sgZXh0ZW5kcyBBc3luY1Rhc2s8Vm9pZCwgVm9pZCwgRD4geworCisgICAgICAgIHByaXZhdGUgRCByZXN1bHQ7CisKKyAgICAgICAgLyogUnVucyBvbiBhIHdvcmtlciB0aHJlYWQgKi8KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBEIGRvSW5CYWNrZ3JvdW5kKFZvaWQuLi4gcGFyYW1zKSB7CisgICAgICAgICAgICByZXN1bHQgPSBBc3luY1Rhc2tMb2FkZXIudGhpcy5sb2FkSW5CYWNrZ3JvdW5kKCk7CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisKKyAgICAgICAgLyogUnVucyBvbiB0aGUgVUkgdGhyZWFkICovCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvblBvc3RFeGVjdXRlKEQgZGF0YSkgeworICAgICAgICAgICAgQXN5bmNUYXNrTG9hZGVyLnRoaXMuZGlzcGF0Y2hPbkxvYWRDb21wbGV0ZShkYXRhKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvbkNhbmNlbGxlZCgpIHsKKyAgICAgICAgICAgIEFzeW5jVGFza0xvYWRlci50aGlzLm9uQ2FuY2VsbGVkKHJlc3VsdCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBMb2FkVGFzayBtVGFzazsKKworICAgIHB1YmxpYyBBc3luY1Rhc2tMb2FkZXIoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIHN1cGVyKGNvbnRleHQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZvcmNlIGFuIGFzeW5jaHJvbm91cyBsb2FkLiBVbmxpa2Uge0BsaW5rICNzdGFydExvYWRpbmcoKX0gdGhpcyB3aWxsIGlnbm9yZSBhIHByZXZpb3VzbHkKKyAgICAgKiBsb2FkZWQgZGF0YSBzZXQgYW5kIGxvYWQgYSBuZXcgb25lLgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGZvcmNlTG9hZCgpIHsKKyAgICAgICAgY2FuY2VsTG9hZCgpOworICAgICAgICBtVGFzayA9IG5ldyBMb2FkVGFzaygpOworICAgICAgICBtVGFzay5leGVjdXRlKChWb2lkW10pIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEF0dGVtcHQgdG8gY2FuY2VsIHRoZSBjdXJyZW50IGxvYWQgdGFzay4gU2VlIHtAbGluayBBc3luY1Rhc2sjY2FuY2VsKGJvb2xlYW4pfQorICAgICAqIGZvciBtb3JlIGluZm8uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIDx0dD5mYWxzZTwvdHQ+IGlmIHRoZSB0YXNrIGNvdWxkIG5vdCBiZSBjYW5jZWxlZCwKKyAgICAgKiAgICAgICAgIHR5cGljYWxseSBiZWNhdXNlIGl0IGhhcyBhbHJlYWR5IGNvbXBsZXRlZCBub3JtYWxseSwgb3IKKyAgICAgKiAgICAgICAgIGJlY2F1c2Uge0BsaW5rICNzdGFydExvYWRpbmcoKX0gaGFzbid0IGJlZW4gY2FsbGVkLCBhbmQKKyAgICAgKiAgICAgICAgIDx0dD50cnVlPC90dD4gb3RoZXJ3aXNlCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gY2FuY2VsTG9hZCgpIHsKKyAgICAgICAgaWYgKG1UYXNrICE9IG51bGwpIHsKKyAgICAgICAgICAgIGJvb2xlYW4gY2FuY2VsbGVkID0gbVRhc2suY2FuY2VsKGZhbHNlKTsKKyAgICAgICAgICAgIG1UYXNrID0gbnVsbDsKKyAgICAgICAgICAgIHJldHVybiBjYW5jZWxsZWQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxlZCBpZiB0aGUgdGFzayB3YXMgY2FuY2VsZWQgYmVmb3JlIGl0IHdhcyBjb21wbGV0ZWQuICBHaXZlcyB0aGUgY2xhc3MgYSBjaGFuY2UKKyAgICAgKiB0byBwcm9wZXJseSBkaXNwb3NlIG9mIHRoZSByZXN1bHQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgb25DYW5jZWxsZWQoRCBkYXRhKSB7CisgICAgfQorCisgICAgdm9pZCBkaXNwYXRjaE9uTG9hZENvbXBsZXRlKEQgZGF0YSkgeworICAgICAgICBtVGFzayA9IG51bGw7CisgICAgICAgIGRlbGl2ZXJSZXN1bHQoZGF0YSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGVkIG9uIGEgd29ya2VyIHRocmVhZCB0byBwZXJmb3JtIHRoZSBhY3R1YWwgbG9hZC4gSW1wbGVtZW50YXRpb25zIHNob3VsZCBub3QgZGVsaXZlciB0aGUKKyAgICAgKiByZXN1bHRzIGRpcmVjdGx5LCBidXQgc2hvdWxkIHJldHVybiB0aGVtIGZyb20gdGhpcyBtZXRob2QsIHdoaWNoIHdpbGwgZXZlbnR1YWxseSBlbmQgdXAKKyAgICAgKiBjYWxsaW5nIGRlbGl2ZXJSZXN1bHQgb24gdGhlIFVJIHRocmVhZC4gSWYgaW1wbGVtZW50YXRpb25zIG5lZWQgdG8gcHJvY2VzcworICAgICAqIHRoZSByZXN1bHRzIG9uIHRoZSBVSSB0aHJlYWQgdGhleSBtYXkgb3ZlcnJpZGUgZGVsaXZlclJlc3VsdCBhbmQgZG8gc28KKyAgICAgKiB0aGVyZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiB0aGUgbG9hZAorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBEIGxvYWRJbkJhY2tncm91bmQoKTsKK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ29udGVudFJlc29sdmVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0NvbnRlbnRSZXNvbHZlci5qYXZhCmluZGV4IDY5Zjc2MTEuLjJlYTBkZjk2IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0NvbnRlbnRSZXNvbHZlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ29udGVudFJlc29sdmVyLmphdmEKQEAgLTQ0LDkgKzQ0LDkgQEAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiAKIAogLyoqCkBAIC00MDEsOCArNDAxLDcgQEAKICAgICAvKioKICAgICAgKiBPcGVuIGEgcmF3IGZpbGUgZGVzY3JpcHRvciB0byBhY2Nlc3MgZGF0YSB1bmRlciBhICJjb250ZW50OiIgVVJJLiAgVGhpcwogICAgICAqIGludGVyYWN0cyB3aXRoIHRoZSB1bmRlcmx5aW5nIHtAbGluayBDb250ZW50UHJvdmlkZXIjb3BlbkFzc2V0RmlsZX0KLSAgICAgKiBDb250ZW50UHJvdmlkZXIub3BlbkFzc2V0RmlsZSgpfSBtZXRob2Qgb2YgdGhlIHByb3ZpZGVyIGFzc29jaWF0ZWQgd2l0aCB0aGUKLSAgICAgKiBnaXZlbiBVUkksIHRvIHJldHJpZXZlIGFueSBmaWxlIHN0b3JlZCB0aGVyZS4KKyAgICAgKiBtZXRob2Qgb2YgdGhlIHByb3ZpZGVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gVVJJLCB0byByZXRyaWV2ZSBhbnkgZmlsZSBzdG9yZWQgdGhlcmUuCiAgICAgICoKICAgICAgKiA8aDU+QWNjZXB0cyB0aGUgZm9sbG93aW5nIFVSSSBzY2hlbWVzOjwvaDU+CiAgICAgICogPHVsPgpAQCAtMTM0Miw3ICsxMzQxLDcgQEAKICAgICB9CiAKICAgICBwcml2YXRlIGZpbmFsIGNsYXNzIEN1cnNvcldyYXBwZXJJbm5lciBleHRlbmRzIEN1cnNvcldyYXBwZXIgewotICAgICAgICBwcml2YXRlIElDb250ZW50UHJvdmlkZXIgbUNvbnRlbnRQcm92aWRlcjsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBJQ29udGVudFByb3ZpZGVyIG1Db250ZW50UHJvdmlkZXI7CiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRz0iQ3Vyc29yV3JhcHBlcklubmVyIjsKICAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1DbG9zZUZsYWcgPSBmYWxzZTsKIApAQCAtMTM3MSw3ICsxMzcwLDcgQEAKICAgICB9CiAKICAgICBwcml2YXRlIGZpbmFsIGNsYXNzIFBhcmNlbEZpbGVEZXNjcmlwdG9ySW5uZXIgZXh0ZW5kcyBQYXJjZWxGaWxlRGVzY3JpcHRvciB7Ci0gICAgICAgIHByaXZhdGUgSUNvbnRlbnRQcm92aWRlciBtQ29udGVudFByb3ZpZGVyOworICAgICAgICBwcml2YXRlIGZpbmFsIElDb250ZW50UHJvdmlkZXIgbUNvbnRlbnRQcm92aWRlcjsKICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHPSJQYXJjZWxGaWxlRGVzY3JpcHRvcklubmVyIjsKICAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1SZWxlYXNlUHJvdmlkZXJGbGFnID0gZmFsc2U7CiAKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ29udGV4dC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9Db250ZXh0LmphdmEKaW5kZXggMzA4MjJkNC4uODZkZGVlNCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9Db250ZXh0LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9Db250ZXh0LmphdmEKQEAgLTIxLDYgKzIxLDcgQEAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkFzc2V0TWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlR5cGVkQXJyYXk7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5EYXRhYmFzZUVycm9ySGFuZGxlcjsKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZTsKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZS5DdXJzb3JGYWN0b3J5OwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOwpAQCAtNTg4LDYgKzU4OSwzMiBAQAogICAgICAgICAgICAgaW50IG1vZGUsIEN1cnNvckZhY3RvcnkgZmFjdG9yeSk7CiAKICAgICAvKioKKyAgICAgKiBPcGVuIGEgbmV3IHByaXZhdGUgU1FMaXRlRGF0YWJhc2UgYXNzb2NpYXRlZCB3aXRoIHRoaXMgQ29udGV4dCdzCisgICAgICogYXBwbGljYXRpb24gcGFja2FnZS4gIENyZWF0ZXMgdGhlIGRhdGFiYXNlIGZpbGUgaWYgaXQgZG9lc24ndCBleGlzdC4KKyAgICAgKgorICAgICAqIDxwPkFjY2VwdHMgaW5wdXQgcGFyYW06IGEgY29uY3JldGUgaW5zdGFuY2Ugb2Yge0BsaW5rIERhdGFiYXNlRXJyb3JIYW5kbGVyfSB0byBiZQorICAgICAqIHVzZWQgdG8gaGFuZGxlIGNvcnJ1cHRpb24gd2hlbiBzcWxpdGUgcmVwb3J0cyBkYXRhYmFzZSBjb3JydXB0aW9uLjwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lICh1bmlxdWUgaW4gdGhlIGFwcGxpY2F0aW9uIHBhY2thZ2UpIG9mIHRoZSBkYXRhYmFzZS4KKyAgICAgKiBAcGFyYW0gbW9kZSBPcGVyYXRpbmcgbW9kZS4gIFVzZSAwIG9yIHtAbGluayAjTU9ERV9QUklWQVRFfSBmb3IgdGhlCisgICAgICogICAgIGRlZmF1bHQgb3BlcmF0aW9uLCB7QGxpbmsgI01PREVfV09STERfUkVBREFCTEV9CisgICAgICogICAgIGFuZCB7QGxpbmsgI01PREVfV09STERfV1JJVEVBQkxFfSB0byBjb250cm9sIHBlcm1pc3Npb25zLgorICAgICAqIEBwYXJhbSBmYWN0b3J5IEFuIG9wdGlvbmFsIGZhY3RvcnkgY2xhc3MgdGhhdCBpcyBjYWxsZWQgdG8gaW5zdGFudGlhdGUgYQorICAgICAqICAgICBjdXJzb3Igd2hlbiBxdWVyeSBpcyBjYWxsZWQuCisgICAgICogQHBhcmFtIGVycm9ySGFuZGxlciB0aGUge0BsaW5rIERhdGFiYXNlRXJyb3JIYW5kbGVyfSB0byBiZSB1c2VkIHdoZW4gc3FsaXRlIHJlcG9ydHMgZGF0YWJhc2UKKyAgICAgKiBjb3JydXB0aW9uLiBpZiBudWxsLCB7QGxpbmsgYW5kcm9pZC5kYXRhYmFzZS5EZWZhdWx0RGF0YWJhc2VFcnJvckhhbmRsZXJ9IGlzIGFzc3VtZWQuCisgICAgICogQHJldHVybiBUaGUgY29udGVudHMgb2YgYSBuZXdseSBjcmVhdGVkIGRhdGFiYXNlIHdpdGggdGhlIGdpdmVuIG5hbWUuCisgICAgICogQHRocm93cyBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVFeGNlcHRpb24gaWYgdGhlIGRhdGFiYXNlIGZpbGUgY291bGQgbm90IGJlIG9wZW5lZC4KKyAgICAgKgorICAgICAqIEBzZWUgI01PREVfUFJJVkFURQorICAgICAqIEBzZWUgI01PREVfV09STERfUkVBREFCTEUKKyAgICAgKiBAc2VlICNNT0RFX1dPUkxEX1dSSVRFQUJMRQorICAgICAqIEBzZWUgI2RlbGV0ZURhdGFiYXNlCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IFNRTGl0ZURhdGFiYXNlIG9wZW5PckNyZWF0ZURhdGFiYXNlKFN0cmluZyBuYW1lLAorICAgICAgICAgICAgaW50IG1vZGUsIEN1cnNvckZhY3RvcnkgZmFjdG9yeSwgRGF0YWJhc2VFcnJvckhhbmRsZXIgZXJyb3JIYW5kbGVyKTsKKworICAgIC8qKgogICAgICAqIERlbGV0ZSBhbiBleGlzdGluZyBwcml2YXRlIFNRTGl0ZURhdGFiYXNlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIENvbnRleHQncwogICAgICAqIGFwcGxpY2F0aW9uIHBhY2thZ2UuCiAgICAgICoKQEAgLTEzNzIsNyArMTM5OSw2IEBACiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VOU09SX1NFUlZJQ0UgPSAic2Vuc29yIjsKICAgICAKICAgICAvKioKLSAgICAgKiBAaGlkZQogICAgICAqIFVzZSB3aXRoIHtAbGluayAjZ2V0U3lzdGVtU2VydmljZX0gdG8gcmV0cmlldmUgYSB7QGxpbmsKICAgICAgKiBhbmRyb2lkLm9zLnN0b3JhZ2UuU3RvcmFnZU1hbmFnZXJ9IGZvciBhY2Nlc3NzaW5nIHN5c3RlbSBzdG9yYWdlCiAgICAgICogZnVuY3Rpb25zLgpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9Db250ZXh0V3JhcHBlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9Db250ZXh0V3JhcHBlci5qYXZhCmluZGV4IGE0NDcxMDguLjNmNWQyMTUgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ29udGV4dFdyYXBwZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0NvbnRleHRXcmFwcGVyLmphdmEKQEAgLTIwLDYgKzIwLDcgQEAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Bc3NldE1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5EYXRhYmFzZUVycm9ySGFuZGxlcjsKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZTsKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZS5DdXJzb3JGYWN0b3J5OwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOwpAQCAtMjA0LDYgKzIwNSwxMiBAQAogICAgIH0KIAogICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTUUxpdGVEYXRhYmFzZSBvcGVuT3JDcmVhdGVEYXRhYmFzZShTdHJpbmcgbmFtZSwgaW50IG1vZGUsIEN1cnNvckZhY3RvcnkgZmFjdG9yeSwKKyAgICAgICAgICAgIERhdGFiYXNlRXJyb3JIYW5kbGVyIGVycm9ySGFuZGxlcikgeworICAgICAgICByZXR1cm4gbUJhc2Uub3Blbk9yQ3JlYXRlRGF0YWJhc2UobmFtZSwgbW9kZSwgZmFjdG9yeSwgZXJyb3JIYW5kbGVyKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBkZWxldGVEYXRhYmFzZShTdHJpbmcgbmFtZSkgewogICAgICAgICByZXR1cm4gbUJhc2UuZGVsZXRlRGF0YWJhc2UobmFtZSk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9DdXJzb3JMb2FkZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ3Vyc29yTG9hZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTIzMDM5NAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ3Vyc29yTG9hZGVyLmphdmEKQEAgLTAsMCArMSwxNTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuY29udGVudDsKKworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yOworaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKKworLyoqCisgKiBBIGxvYWRlciB0aGF0IHF1ZXJpZXMgdGhlIHtAbGluayBDb250ZW50UmVzb2x2ZXJ9IGFuZCByZXR1cm5zIGEge0BsaW5rIEN1cnNvcn0uCisgKi8KK3B1YmxpYyBjbGFzcyBDdXJzb3JMb2FkZXIgZXh0ZW5kcyBBc3luY1Rhc2tMb2FkZXI8Q3Vyc29yPiB7CisgICAgQ3Vyc29yIG1DdXJzb3I7CisgICAgRm9yY2VMb2FkQ29udGVudE9ic2VydmVyIG1PYnNlcnZlcjsKKyAgICBib29sZWFuIG1TdG9wcGVkOworICAgIFVyaSBtVXJpOworICAgIFN0cmluZ1tdIG1Qcm9qZWN0aW9uOworICAgIFN0cmluZyBtU2VsZWN0aW9uOworICAgIFN0cmluZ1tdIG1TZWxlY3Rpb25BcmdzOworICAgIFN0cmluZyBtU29ydE9yZGVyOworCisgICAgLyogUnVucyBvbiBhIHdvcmtlciB0aHJlYWQgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQ3Vyc29yIGxvYWRJbkJhY2tncm91bmQoKSB7CisgICAgICAgIEN1cnNvciBjdXJzb3IgPSBnZXRDb250ZXh0KCkuZ2V0Q29udGVudFJlc29sdmVyKCkucXVlcnkobVVyaSwgbVByb2plY3Rpb24sIG1TZWxlY3Rpb24sCisgICAgICAgICAgICAgICAgbVNlbGVjdGlvbkFyZ3MsIG1Tb3J0T3JkZXIpOworICAgICAgICAvLyBFbnN1cmUgdGhlIGN1cnNvciB3aW5kb3cgaXMgZmlsbGVkCisgICAgICAgIGlmIChjdXJzb3IgIT0gbnVsbCkgeworICAgICAgICAgICAgY3Vyc29yLmdldENvdW50KCk7CisgICAgICAgICAgICBjdXJzb3IucmVnaXN0ZXJDb250ZW50T2JzZXJ2ZXIobU9ic2VydmVyKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3Vyc29yOworICAgIH0KKworICAgIC8qIFJ1bnMgb24gdGhlIFVJIHRocmVhZCAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRlbGl2ZXJSZXN1bHQoQ3Vyc29yIGN1cnNvcikgeworICAgICAgICBpZiAobVN0b3BwZWQpIHsKKyAgICAgICAgICAgIC8vIEFuIGFzeW5jIHF1ZXJ5IGNhbWUgaW4gd2hpbGUgdGhlIGxvYWRlciBpcyBzdG9wcGVkCisgICAgICAgICAgICBjdXJzb3IuY2xvc2UoKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBtQ3Vyc29yID0gY3Vyc29yOworICAgICAgICBzdXBlci5kZWxpdmVyUmVzdWx0KGN1cnNvcik7CisgICAgfQorCisgICAgcHVibGljIEN1cnNvckxvYWRlcihDb250ZXh0IGNvbnRleHQsIFVyaSB1cmksIFN0cmluZ1tdIHByb2plY3Rpb24sIFN0cmluZyBzZWxlY3Rpb24sCisgICAgICAgICAgICBTdHJpbmdbXSBzZWxlY3Rpb25BcmdzLCBTdHJpbmcgc29ydE9yZGVyKSB7CisgICAgICAgIHN1cGVyKGNvbnRleHQpOworICAgICAgICBtT2JzZXJ2ZXIgPSBuZXcgRm9yY2VMb2FkQ29udGVudE9ic2VydmVyKCk7CisgICAgICAgIG1VcmkgPSB1cmk7CisgICAgICAgIG1Qcm9qZWN0aW9uID0gcHJvamVjdGlvbjsKKyAgICAgICAgbVNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKKyAgICAgICAgbVNlbGVjdGlvbkFyZ3MgPSBzZWxlY3Rpb25BcmdzOworICAgICAgICBtU29ydE9yZGVyID0gc29ydE9yZGVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN0YXJ0cyBhbiBhc3luY2hyb25vdXMgbG9hZCBvZiB0aGUgY29udGFjdHMgbGlzdCBkYXRhLiBXaGVuIHRoZSByZXN1bHQgaXMgcmVhZHkgdGhlIGNhbGxiYWNrcworICAgICAqIHdpbGwgYmUgY2FsbGVkIG9uIHRoZSBVSSB0aHJlYWQuIElmIGEgcHJldmlvdXMgbG9hZCBoYXMgYmVlbiBjb21wbGV0ZWQgYW5kIGlzIHN0aWxsIHZhbGlkCisgICAgICogdGhlIHJlc3VsdCBtYXkgYmUgcGFzc2VkIHRvIHRoZSBjYWxsYmFja3MgaW1tZWRpYXRlbHkuCisgICAgICoKKyAgICAgKiBNdXN0IGJlIGNhbGxlZCBmcm9tIHRoZSBVSSB0aHJlYWQKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzdGFydExvYWRpbmcoKSB7CisgICAgICAgIG1TdG9wcGVkID0gZmFsc2U7CisKKyAgICAgICAgaWYgKG1DdXJzb3IgIT0gbnVsbCkgeworICAgICAgICAgICAgZGVsaXZlclJlc3VsdChtQ3Vyc29yKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZvcmNlTG9hZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogTXVzdCBiZSBjYWxsZWQgZnJvbSB0aGUgVUkgdGhyZWFkCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc3RvcExvYWRpbmcoKSB7CisgICAgICAgIGlmIChtQ3Vyc29yICE9IG51bGwgJiYgIW1DdXJzb3IuaXNDbG9zZWQoKSkgeworICAgICAgICAgICAgbUN1cnNvci5jbG9zZSgpOworICAgICAgICAgICAgbUN1cnNvciA9IG51bGw7CisgICAgICAgIH0KKworICAgICAgICAvLyBBdHRlbXB0IHRvIGNhbmNlbCB0aGUgY3VycmVudCBsb2FkIHRhc2sgaWYgcG9zc2libGUuCisgICAgICAgIGNhbmNlbExvYWQoKTsKKworICAgICAgICAvLyBNYWtlIHN1cmUgdGhhdCBhbnkgb3V0c3RhbmRpbmcgbG9hZHMgY2xlYW4gdGhlbXNlbHZlcyB1cCBwcm9wZXJseQorICAgICAgICBtU3RvcHBlZCA9IHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25DYW5jZWxsZWQoQ3Vyc29yIGN1cnNvcikgeworICAgICAgICBpZiAoY3Vyc29yICE9IG51bGwgJiYgIWN1cnNvci5pc0Nsb3NlZCgpKSB7CisgICAgICAgICAgICBjdXJzb3IuY2xvc2UoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRlc3Ryb3koKSB7CisgICAgICAgIC8vIEVuc3VyZSB0aGUgbG9hZGVyIGlzIHN0b3BwZWQKKyAgICAgICAgc3RvcExvYWRpbmcoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVXJpIGdldFVyaSgpIHsKKyAgICAgICAgcmV0dXJuIG1Vcmk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VXJpKFVyaSB1cmkpIHsKKyAgICAgICAgbVVyaSA9IHVyaTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nW10gZ2V0UHJvamVjdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIG1Qcm9qZWN0aW9uOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFByb2plY3Rpb24oU3RyaW5nW10gcHJvamVjdGlvbikgeworICAgICAgICBtUHJvamVjdGlvbiA9IHByb2plY3Rpb247CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRTZWxlY3Rpb24oKSB7CisgICAgICAgIHJldHVybiBtU2VsZWN0aW9uOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbihTdHJpbmcgc2VsZWN0aW9uKSB7CisgICAgICAgIG1TZWxlY3Rpb24gPSBzZWxlY3Rpb247CisgICAgfQorCisgICAgcHVibGljIFN0cmluZ1tdIGdldFNlbGVjdGlvbkFyZ3MoKSB7CisgICAgICAgIHJldHVybiBtU2VsZWN0aW9uQXJnczsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb25BcmdzKFN0cmluZ1tdIHNlbGVjdGlvbkFyZ3MpIHsKKyAgICAgICAgbVNlbGVjdGlvbkFyZ3MgPSBzZWxlY3Rpb25BcmdzOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U29ydE9yZGVyKCkgeworICAgICAgICByZXR1cm4gbVNvcnRPcmRlcjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRTb3J0T3JkZXIoU3RyaW5nIHNvcnRPcmRlcikgeworICAgICAgICBtU29ydE9yZGVyID0gc29ydE9yZGVyOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvTG9hZGVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0xvYWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiNDBlNDgKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0xvYWRlci5qYXZhCkBAIC0wLDAgKzEsMTU0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmNvbnRlbnQ7CisKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkNvbnRlbnRPYnNlcnZlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CisKKy8qKgorICogQW4gYWJzdHJhY3QgY2xhc3MgdGhhdCBwZXJmb3JtcyBhc3luY2hyb25vdXMgbG9hZGluZyBvZiBkYXRhLiBXaGlsZSBMb2FkZXJzIGFyZSBhY3RpdmUKKyAqIHRoZXkgc2hvdWxkIG1vbml0b3IgdGhlIHNvdXJjZSBvZiB0aGVpciBkYXRhIGFuZCBkZWxpdmVyIG5ldyByZXN1bHRzIHdoZW4gdGhlIGNvbnRlbnRzCisgKiBjaGFuZ2UuIAorICoKKyAqIEBwYXJhbSA8RD4gVGhlIHJlc3VsdCByZXR1cm5lZCB3aGVuIHRoZSBsb2FkIGlzIGNvbXBsZXRlCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBMb2FkZXI8RD4geworICAgIGludCBtSWQ7CisgICAgT25Mb2FkQ29tcGxldGVMaXN0ZW5lcjxEPiBtTGlzdGVuZXI7CisgICAgQ29udGV4dCBtQ29udGV4dDsKKworICAgIHB1YmxpYyBmaW5hbCBjbGFzcyBGb3JjZUxvYWRDb250ZW50T2JzZXJ2ZXIgZXh0ZW5kcyBDb250ZW50T2JzZXJ2ZXIgeworICAgICAgICBwdWJsaWMgRm9yY2VMb2FkQ29udGVudE9ic2VydmVyKCkgeworICAgICAgICAgICAgc3VwZXIobmV3IEhhbmRsZXIoKSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gZGVsaXZlclNlbGZOb3RpZmljYXRpb25zKCkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25DaGFuZ2UoYm9vbGVhbiBzZWxmQ2hhbmdlKSB7CisgICAgICAgICAgICBmb3JjZUxvYWQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBpbnRlcmZhY2UgT25Mb2FkQ29tcGxldGVMaXN0ZW5lcjxEPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBDYWxsZWQgb24gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIExvYWRlciB3aGVuIHRoZSBsb2FkIGlzIGNvbXBsZXRlLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gbG9hZGVyIHRoZSBsb2FkZXIgdGhhdCBjb21wbGV0ZWQgdGhlIGxvYWQKKyAgICAgICAgICogQHBhcmFtIGRhdGEgdGhlIHJlc3VsdCBvZiB0aGUgbG9hZAorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgb25Mb2FkQ29tcGxldGUoTG9hZGVyPEQ+IGxvYWRlciwgRCBkYXRhKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdG9yZXMgYXdheSB0aGUgYXBwbGljYXRpb24gY29udGV4dCBhc3NvY2lhdGVkIHdpdGggY29udGV4dC4gU2luY2UgTG9hZGVycyBjYW4gYmUgdXNlZAorICAgICAqIGFjcm9zcyBtdWx0aXBsZSBhY3Rpdml0aWVzIGl0J3MgZGFuZ2Vyb3VzIHRvIHN0b3JlIHRoZSBjb250ZXh0IGRpcmVjdGx5LgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgdXNlZCB0byByZXRyaWV2ZSB0aGUgYXBwbGljYXRpb24gY29udGV4dC4KKyAgICAgKi8KKyAgICBwdWJsaWMgTG9hZGVyKENvbnRleHQgY29udGV4dCkgeworICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQuZ2V0QXBwbGljYXRpb25Db250ZXh0KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2VuZHMgdGhlIHJlc3VsdCBvZiB0aGUgbG9hZCB0byB0aGUgcmVnaXN0ZXJlZCBsaXN0ZW5lci4gU2hvdWxkIG9ubHkgYmUgY2FsbGVkIGJ5IHN1YmNsYXNzZXMuCisgICAgICoKKyAgICAgKiBNdXN0IGJlIGNhbGxlZCBmcm9tIHRoZSBVSSB0aHJlYWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGF0YSB0aGUgcmVzdWx0IG9mIHRoZSBsb2FkCisgICAgICovCisgICAgcHVibGljIHZvaWQgZGVsaXZlclJlc3VsdChEIGRhdGEpIHsKKyAgICAgICAgaWYgKG1MaXN0ZW5lciAhPSBudWxsKSB7CisgICAgICAgICAgICBtTGlzdGVuZXIub25Mb2FkQ29tcGxldGUodGhpcywgZGF0YSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIGFuIGFwcGxpY2F0aW9uIGNvbnRleHQgcmV0cmlldmVkIGZyb20gdGhlIENvbnRleHQgcGFzc2VkIHRvIHRoZSBjb25zdHJ1Y3Rvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ29udGV4dCBnZXRDb250ZXh0KCkgeworICAgICAgICByZXR1cm4gbUNvbnRleHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgSUQgb2YgdGhpcyBsb2FkZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldElkKCkgeworICAgICAgICByZXR1cm4gbUlkOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlZ2lzdGVycyBhIGNsYXNzIHRoYXQgd2lsbCByZWNlaXZlIGNhbGxiYWNrcyB3aGVuIGEgbG9hZCBpcyBjb21wbGV0ZS4gVGhlIGNhbGxiYWNrcyB3aWxsCisgICAgICogYmUgY2FsbGVkIG9uIHRoZSBVSSB0aHJlYWQgc28gaXQncyBzYWZlIHRvIHBhc3MgdGhlIHJlc3VsdHMgdG8gd2lkZ2V0cy4KKyAgICAgKiAKKyAgICAgKiBNdXN0IGJlIGNhbGxlZCBmcm9tIHRoZSBVSSB0aHJlYWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZWdpc3Rlckxpc3RlbmVyKGludCBpZCwgT25Mb2FkQ29tcGxldGVMaXN0ZW5lcjxEPiBsaXN0ZW5lcikgeworICAgICAgICBpZiAobUxpc3RlbmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlRoZXJlIGlzIGFscmVhZHkgYSBsaXN0ZW5lciByZWdpc3RlcmVkIik7CisgICAgICAgIH0KKyAgICAgICAgbUxpc3RlbmVyID0gbGlzdGVuZXI7CisgICAgICAgIG1JZCA9IGlkOworICAgIH0KKworICAgIC8qKgorICAgICAqIE11c3QgYmUgY2FsbGVkIGZyb20gdGhlIFVJIHRocmVhZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHVucmVnaXN0ZXJMaXN0ZW5lcihPbkxvYWRDb21wbGV0ZUxpc3RlbmVyPEQ+IGxpc3RlbmVyKSB7CisgICAgICAgIGlmIChtTGlzdGVuZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiTm8gbGlzdGVuZXIgcmVnaXN0ZXIiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobUxpc3RlbmVyICE9IGxpc3RlbmVyKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJBdHRlbXB0aW5nIHRvIHVucmVnaXN0ZXIgdGhlIHdyb25nIGxpc3RlbmVyIik7CisgICAgICAgIH0KKyAgICAgICAgbUxpc3RlbmVyID0gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdGFydHMgYW4gYXN5bmNocm9ub3VzIGxvYWQgb2YgdGhlIGNvbnRhY3RzIGxpc3QgZGF0YS4gV2hlbiB0aGUgcmVzdWx0IGlzIHJlYWR5IHRoZSBjYWxsYmFja3MKKyAgICAgKiB3aWxsIGJlIGNhbGxlZCBvbiB0aGUgVUkgdGhyZWFkLiBJZiBhIHByZXZpb3VzIGxvYWQgaGFzIGJlZW4gY29tcGxldGVkIGFuZCBpcyBzdGlsbCB2YWxpZAorICAgICAqIHRoZSByZXN1bHQgbWF5IGJlIHBhc3NlZCB0byB0aGUgY2FsbGJhY2tzIGltbWVkaWF0ZWx5LiBUaGUgbG9hZGVyIHdpbGwgbW9uaXRvciB0aGUgc291cmNlIG9mCisgICAgICogdGhlIGRhdGEgc2V0IGFuZCBtYXkgZGVsaXZlciBmdXR1cmUgY2FsbGJhY2tzIGlmIHRoZSBzb3VyY2UgY2hhbmdlcy4gQ2FsbGluZworICAgICAqIHtAbGluayAjc3RvcExvYWRpbmd9IHdpbGwgc3RvcCB0aGUgZGVsaXZlcnkgb2YgY2FsbGJhY2tzLiAKKyAgICAgKgorICAgICAqIE11c3QgYmUgY2FsbGVkIGZyb20gdGhlIFVJIHRocmVhZAorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHN0YXJ0TG9hZGluZygpOworCisgICAgLyoqCisgICAgICogRm9yY2UgYW4gYXN5bmNocm9ub3VzIGxvYWQuIFVubGlrZSB7QGxpbmsgI3N0YXJ0TG9hZGluZygpfSB0aGlzIHdpbGwgaWdub3JlIGEgcHJldmlvdXNseQorICAgICAqIGxvYWRlZCBkYXRhIHNldCBhbmQgbG9hZCBhIG5ldyBvbmUuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgZm9yY2VMb2FkKCk7CisKKyAgICAvKioKKyAgICAgKiBTdG9wcyBkZWxpdmVyeSBvZiB1cGRhdGVzIHVudGlsIHRoZSBuZXh0IHRpbWUge0BsaW5rICNzdGFydExvYWRpbmcoKX0gaXMgY2FsbGVkCisgICAgICoKKyAgICAgKiBNdXN0IGJlIGNhbGxlZCBmcm9tIHRoZSBVSSB0aHJlYWQKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzdG9wTG9hZGluZygpOworCisgICAgLyoqCisgICAgICogRGVzdHJveXMgdGhlIGxvYWRlciBhbmQgZnJlZXMgaXRzIHJlc291cmNlcywgbWFraW5nIGl0IHVudXNhYmxlLgorICAgICAqCisgICAgICogTXVzdCBiZSBjYWxsZWQgZnJvbSB0aGUgVUkgdGhyZWFkCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgZGVzdHJveSgpOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvU2hhcmVkUHJlZmVyZW5jZXMuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvU2hhcmVkUHJlZmVyZW5jZXMuamF2YQppbmRleCBhMTVlMjllLi41ODQ3MjE2IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L1NoYXJlZFByZWZlcmVuY2VzLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9TaGFyZWRQcmVmZXJlbmNlcy5qYXZhCkBAIC0xNyw2ICsxNyw3IEBACiBwYWNrYWdlIGFuZHJvaWQuY29udGVudDsKIAogaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKIAogLyoqCiAgKiBJbnRlcmZhY2UgZm9yIGFjY2Vzc2luZyBhbmQgbW9kaWZ5aW5nIHByZWZlcmVuY2UgZGF0YSByZXR1cm5lZCBieSB7QGxpbmsKQEAgLTY5LDYgKzcwLDE3IEBACiAgICAgICAgIEVkaXRvciBwdXRTdHJpbmcoU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlKTsKICAgICAgICAgCiAgICAgICAgIC8qKgorICAgICAgICAgKiBTZXQgYSBzZXQgb2YgU3RyaW5nIHZhbHVlcyBpbiB0aGUgcHJlZmVyZW5jZXMgZWRpdG9yLCB0byBiZSB3cml0dGVuCisgICAgICAgICAqIGJhY2sgb25jZSB7QGxpbmsgI2NvbW1pdH0gaXMgY2FsbGVkLgorICAgICAgICAgKiAKKyAgICAgICAgICogQHBhcmFtIGtleSBUaGUgbmFtZSBvZiB0aGUgcHJlZmVyZW5jZSB0byBtb2RpZnkuCisgICAgICAgICAqIEBwYXJhbSB2YWx1ZXMgVGhlIG5ldyB2YWx1ZXMgZm9yIHRoZSBwcmVmZXJlbmNlLgorICAgICAgICAgKiBAcmV0dXJuIFJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIHNhbWUgRWRpdG9yIG9iamVjdCwgc28geW91IGNhbgorICAgICAgICAgKiBjaGFpbiBwdXQgY2FsbHMgdG9nZXRoZXIuCisgICAgICAgICAqLworICAgICAgICBFZGl0b3IgcHV0U3RyaW5nU2V0KFN0cmluZyBrZXksIFNldDxTdHJpbmc+IHZhbHVlcyk7CisgICAgICAgIAorICAgICAgICAvKioKICAgICAgICAgICogU2V0IGFuIGludCB2YWx1ZSBpbiB0aGUgcHJlZmVyZW5jZXMgZWRpdG9yLCB0byBiZSB3cml0dGVuIGJhY2sgb25jZQogICAgICAgICAgKiB7QGxpbmsgI2NvbW1pdH0gaXMgY2FsbGVkLgogICAgICAgICAgKiAKQEAgLTE4Niw2ICsxOTgsMjAgQEAKICAgICBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXksIFN0cmluZyBkZWZWYWx1ZSk7CiAgICAgCiAgICAgLyoqCisgICAgICogUmV0cmlldmUgYSBzZXQgb2YgU3RyaW5nIHZhbHVlcyBmcm9tIHRoZSBwcmVmZXJlbmNlcy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0ga2V5IFRoZSBuYW1lIG9mIHRoZSBwcmVmZXJlbmNlIHRvIHJldHJpZXZlLgorICAgICAqIEBwYXJhbSBkZWZWYWx1ZXMgVmFsdWVzIHRvIHJldHVybiBpZiB0aGlzIHByZWZlcmVuY2UgZG9lcyBub3QgZXhpc3QuCisgICAgICogCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBwcmVmZXJlbmNlIHZhbHVlcyBpZiB0aGV5IGV4aXN0LCBvciBkZWZWYWx1ZXMuCisgICAgICogVGhyb3dzIENsYXNzQ2FzdEV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhIHByZWZlcmVuY2Ugd2l0aCB0aGlzIG5hbWUKKyAgICAgKiB0aGF0IGlzIG5vdCBhIFNldC4KKyAgICAgKiAKKyAgICAgKiBAdGhyb3dzIENsYXNzQ2FzdEV4Y2VwdGlvbgorICAgICAqLworICAgIFNldDxTdHJpbmc+IGdldFN0cmluZ1NldChTdHJpbmcga2V5LCBTZXQ8U3RyaW5nPiBkZWZWYWx1ZXMpOworICAgIAorICAgIC8qKgogICAgICAqIFJldHJpZXZlIGFuIGludCB2YWx1ZSBmcm9tIHRoZSBwcmVmZXJlbmNlcy4KICAgICAgKiAKICAgICAgKiBAcGFyYW0ga2V5IFRoZSBuYW1lIG9mIHRoZSBwcmVmZXJlbmNlIHRvIHJldHJpZXZlLgpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9TeW5jTWFuYWdlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9TeW5jTWFuYWdlci5qYXZhCmluZGV4IGQwYjY3Y2MuLjdmNzQ5YmIgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvU3luY01hbmFnZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L1N5bmNNYW5hZ2VyLmphdmEKQEAgLTE2LDYgKzE2LDggQEAKIAogcGFja2FnZSBhbmRyb2lkLmNvbnRlbnQ7CiAKK2ltcG9ydCBjb20uZ29vZ2xlLmFuZHJvaWQuY29sbGVjdC5NYXBzOworCiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuUjsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC51dGlsLkFycmF5VXRpbHM7CiAKQEAgLTU1LDYgKzU3LDcgQEAKIGltcG9ydCBqYXZhLmlvLkZpbGVEZXNjcmlwdG9yOwogaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOwpAQCAtMTI2LDE0ICsxMjksMTMgQEAKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJTklUSUFMSVpBVElPTl9VTkJJTkRfREVMQVlfTVMgPSA1MDAwOwogCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNZTkNfV0FLRV9MT0NLID0gIlN5bmNNYW5hZ2VyU3luY1dha2VMb2NrIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1lOQ19XQUtFX0xPQ0tfUFJFRklYID0gIlN5bmNXYWtlTG9jayI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEhBTkRMRV9TWU5DX0FMQVJNX1dBS0VfTE9DSyA9ICJTeW5jTWFuYWdlckhhbmRsZVN5bmNBbGFybVdha2VMb2NrIjsKIAogICAgIHByaXZhdGUgQ29udGV4dCBtQ29udGV4dDsKIAogICAgIHByaXZhdGUgdm9sYXRpbGUgQWNjb3VudFtdIG1BY2NvdW50cyA9IElOSVRJQUxfQUNDT1VOVFNfQVJSQVk7CiAKLSAgICB2b2xhdGlsZSBwcml2YXRlIFBvd2VyTWFuYWdlci5XYWtlTG9jayBtU3luY1dha2VMb2NrOwogICAgIHZvbGF0aWxlIHByaXZhdGUgUG93ZXJNYW5hZ2VyLldha2VMb2NrIG1IYW5kbGVBbGFybVdha2VMb2NrOwogICAgIHZvbGF0aWxlIHByaXZhdGUgYm9vbGVhbiBtRGF0YUNvbm5lY3Rpb25Jc0Nvbm5lY3RlZCA9IGZhbHNlOwogICAgIHZvbGF0aWxlIHByaXZhdGUgYm9vbGVhbiBtU3RvcmFnZUlzTG93ID0gZmFsc2U7CkBAIC0xOTUsNiArMTk3LDggQEAKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEFjY291bnRbXSBJTklUSUFMX0FDQ09VTlRTX0FSUkFZID0gbmV3IEFjY291bnRbMF07CiAKKyAgICBwcml2YXRlIGZpbmFsIFBvd2VyTWFuYWdlciBtUG93ZXJNYW5hZ2VyOworCiAgICAgcHVibGljIHZvaWQgb25BY2NvdW50c1VwZGF0ZWQoQWNjb3VudFtdIGFjY291bnRzKSB7CiAgICAgICAgIC8vIHJlbWVtYmVyIGlmIHRoaXMgd2FzIHRoZSBmaXJzdCB0aW1lIHRoaXMgd2FzIGNhbGxlZCBhZnRlciBhbiB1cGRhdGUKICAgICAgICAgZmluYWwgYm9vbGVhbiBqdXN0Qm9vdGVkVXAgPSBtQWNjb3VudHMgPT0gSU5JVElBTF9BQ0NPVU5UU19BUlJBWTsKQEAgLTM1NiwxNSArMzYwLDEzIEBACiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBtTm90aWZpY2F0aW9uTWdyID0gbnVsbDsKICAgICAgICAgfQotICAgICAgICBQb3dlck1hbmFnZXIgcG0gPSAoUG93ZXJNYW5hZ2VyKSBjb250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5QT1dFUl9TRVJWSUNFKTsKLSAgICAgICAgbVN5bmNXYWtlTG9jayA9IHBtLm5ld1dha2VMb2NrKFBvd2VyTWFuYWdlci5QQVJUSUFMX1dBS0VfTE9DSywgU1lOQ19XQUtFX0xPQ0spOwotICAgICAgICBtU3luY1dha2VMb2NrLnNldFJlZmVyZW5jZUNvdW50ZWQoZmFsc2UpOworICAgICAgICBtUG93ZXJNYW5hZ2VyID0gKFBvd2VyTWFuYWdlcikgY29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuUE9XRVJfU0VSVklDRSk7CiAKICAgICAgICAgLy8gVGhpcyBXYWtlTG9jayBpcyB1c2VkIHRvIGVuc3VyZSB0aGF0IHdlIHN0YXkgYXdha2UgYmV0d2VlbiB0aGUgdGltZSB0aGF0IHdlIHJlY2VpdmUKICAgICAgICAgLy8gYSBzeW5jIGFsYXJtIG5vdGlmaWNhdGlvbiBhbmQgd2hlbiB3ZSBmaW5pc2ggcHJvY2Vzc2luZyBpdC4gV2UgbmVlZCB0byBkbyB0aGlzCiAgICAgICAgIC8vIGJlY2F1c2Ugd2UgZG9uJ3QgZG8gdGhlIHdvcmsgaW4gdGhlIGFsYXJtIGhhbmRsZXIsIHJhdGhlciB3ZSBkbyBpdCBpbiBhIG1lc3NhZ2UKICAgICAgICAgLy8gaGFuZGxlci4KLSAgICAgICAgbUhhbmRsZUFsYXJtV2FrZUxvY2sgPSBwbS5uZXdXYWtlTG9jayhQb3dlck1hbmFnZXIuUEFSVElBTF9XQUtFX0xPQ0ssCisgICAgICAgIG1IYW5kbGVBbGFybVdha2VMb2NrID0gbVBvd2VyTWFuYWdlci5uZXdXYWtlTG9jayhQb3dlck1hbmFnZXIuUEFSVElBTF9XQUtFX0xPQ0ssCiAgICAgICAgICAgICAgICAgSEFORExFX1NZTkNfQUxBUk1fV0FLRV9MT0NLKTsKICAgICAgICAgbUhhbmRsZUFsYXJtV2FrZUxvY2suc2V0UmVmZXJlbmNlQ291bnRlZChmYWxzZSk7CiAKQEAgLTEzMDIsNiArMTMwNCw5IEBACiAgICAgICAgIHB1YmxpYyBmaW5hbCBTeW5jTm90aWZpY2F0aW9uSW5mbyBtU3luY05vdGlmaWNhdGlvbkluZm8gPSBuZXcgU3luY05vdGlmaWNhdGlvbkluZm8oKTsKICAgICAgICAgcHJpdmF0ZSBMb25nIG1BbGFybVNjaGVkdWxlVGltZSA9IG51bGw7CiAgICAgICAgIHB1YmxpYyBmaW5hbCBTeW5jVGltZVRyYWNrZXIgbVN5bmNUaW1lVHJhY2tlciA9IG5ldyBTeW5jVGltZVRyYWNrZXIoKTsKKyAgICAgICAgcHJpdmF0ZSBQb3dlck1hbmFnZXIuV2FrZUxvY2sgbVN5bmNXYWtlTG9jazsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBIYXNoTWFwPFBhaXI8U3RyaW5nLCBTdHJpbmc+LCAgUG93ZXJNYW5hZ2VyLldha2VMb2NrPiBtV2FrZUxvY2tzID0KKyAgICAgICAgICAgICAgICBNYXBzLm5ld0hhc2hNYXAoKTsKIAogICAgICAgICAvLyB1c2VkIHRvIHRyYWNrIGlmIHdlIGhhdmUgaW5zdGFsbGVkIHRoZSBlcnJvciBub3RpZmljYXRpb24gc28gdGhhdCB3ZSBkb24ndCByZWluc3RhbGwKICAgICAgICAgLy8gaXQgaWYgc3luYyBpcyBzdGlsbCBmYWlsaW5nCkBAIC0xMzE1LDYgKzEzMjAsMTggQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCisgICAgICAgIHByaXZhdGUgUG93ZXJNYW5hZ2VyLldha2VMb2NrIGdldFN5bmNXYWtlTG9jayhTdHJpbmcgYWNjb3VudFR5cGUsIFN0cmluZyBhdXRob3JpdHkpIHsKKyAgICAgICAgICAgIGZpbmFsIFBhaXI8U3RyaW5nLCBTdHJpbmc+IHdha2VMb2NrS2V5ID0gUGFpci5jcmVhdGUoYWNjb3VudFR5cGUsIGF1dGhvcml0eSk7CisgICAgICAgICAgICBQb3dlck1hbmFnZXIuV2FrZUxvY2sgd2FrZUxvY2sgPSBtV2FrZUxvY2tzLmdldCh3YWtlTG9ja0tleSk7CisgICAgICAgICAgICBpZiAod2FrZUxvY2sgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBuYW1lID0gU1lOQ19XQUtFX0xPQ0tfUFJFRklYICsgIl8iICsgYXV0aG9yaXR5ICsgIl8iICsgYWNjb3VudFR5cGU7CisgICAgICAgICAgICAgICAgd2FrZUxvY2sgPSBtUG93ZXJNYW5hZ2VyLm5ld1dha2VMb2NrKFBvd2VyTWFuYWdlci5QQVJUSUFMX1dBS0VfTE9DSywgbmFtZSk7CisgICAgICAgICAgICAgICAgd2FrZUxvY2suc2V0UmVmZXJlbmNlQ291bnRlZChmYWxzZSk7CisgICAgICAgICAgICAgICAgbVdha2VMb2Nrcy5wdXQod2FrZUxvY2tLZXksIHdha2VMb2NrKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB3YWtlTG9jazsKKyAgICAgICAgfQorCiAgICAgICAgIHByaXZhdGUgdm9pZCB3YWl0VW50aWxSZWFkeVRvUnVuKCkgewogICAgICAgICAgICAgQ291bnREb3duTGF0Y2ggbGF0Y2ggPSBtUmVhZHlUb1J1bkxhdGNoOwogICAgICAgICAgICAgaWYgKGxhdGNoICE9IG51bGwpIHsKQEAgLTE0NzcsOCArMTQ5NCw5IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIGlzU3luY0luUHJvZ3Jlc3MgPSBtQWN0aXZlU3luY0NvbnRleHQgIT0gbnVsbDsKLSAgICAgICAgICAgICAgICBpZiAoIWlzU3luY0luUHJvZ3Jlc3MpIHsKKyAgICAgICAgICAgICAgICBpZiAoIWlzU3luY0luUHJvZ3Jlc3MgJiYgbVN5bmNXYWtlTG9jayAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgIG1TeW5jV2FrZUxvY2sucmVsZWFzZSgpOworICAgICAgICAgICAgICAgICAgICBtU3luY1dha2VMb2NrID0gbnVsbDsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgbWFuYWdlU3luY05vdGlmaWNhdGlvbigpOwogICAgICAgICAgICAgICAgIG1hbmFnZUVycm9yTm90aWZpY2F0aW9uKCk7CkBAIC0xNzA0LDcgKzE3MjIsMjYgQEAKICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIG1TeW5jV2FrZUxvY2suYWNxdWlyZSgpOworICAgICAgICAgICAgLy8gRmluZCB0aGUgd2FrZWxvY2sgZm9yIHRoaXMgYWNjb3VudCBhbmQgYXV0aG9yaXR5IGFuZCBzdG9yZSBpdCBpbiBtU3luY1dha2VMb2NrLgorICAgICAgICAgICAgLy8gQmUgc3VyZSB0byByZWxlYXNlIHRoZSBwcmV2aW91cyB3YWtlbG9jayBzbyB0aGF0IHdlIGRvbid0IGVuZCB1cCB3aXRoIGl0IGJlaW5nCisgICAgICAgICAgICAvLyBoZWxkIHVudGlsIGl0IGlzIHVzZWQgYWdhaW4uCisgICAgICAgICAgICAvLyBUaGVyZSBhcmUgYSBjb3VwbGUgdHJpY2t5IHRoaW5ncyBhYm91dCB0aGlzIGNvZGU6CisgICAgICAgICAgICAvLyAtIG1ha2Ugc3VyZSB0aGF0IHdlIGFjcXVpcmUgdGhlIG5ldyB3YWtlbG9jayBiZWZvcmUgcmVsZWFzaW5nIHRoZSBvbGQgb25lLAorICAgICAgICAgICAgLy8gICBvdGhlcndpc2UgdGhlIGRldmljZSBtaWdodCBnbyB0byBzbGVlcCBhcyBzb29uIGFzIHdlIHJlbGVhc2UgaXQuCisgICAgICAgICAgICAvLyAtIHNpbmNlIHdlIHVzZSBub24tcmVmZXJlbmNlIGNvdW50ZWQgd2FrZWxvY2tzIHdlIGhhdmUgdG8gYmUgc3VyZSBub3QgdG8gZG8KKyAgICAgICAgICAgIC8vICAgdGhlIHJlbGVhc2UgaWYgdGhlIHdha2Vsb2NrIGRpZG4ndCBjaGFuZ2UuIE90aGV3aXNlIHdlIHdvdWxkIGRvIGFuCisgICAgICAgICAgICAvLyAgIGFjcXVpcmUgZm9sbG93ZWQgYnkgYSByZWxlYXNlIG9uIHRoZSBzYW1lIGxvY2ssIHJlc3VsdGluZyBpbiBubyBsb2NrCisgICAgICAgICAgICAvLyAgIGJlaW5nIGhlbGQuCisgICAgICAgICAgICBQb3dlck1hbmFnZXIuV2FrZUxvY2sgb2xkV2FrZUxvY2sgPSBtU3luY1dha2VMb2NrOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtU3luY1dha2VMb2NrID0gZ2V0U3luY1dha2VMb2NrKG9wLmFjY291bnQudHlwZSwgb3AuYXV0aG9yaXR5KTsKKyAgICAgICAgICAgICAgICBtU3luY1dha2VMb2NrLmFjcXVpcmUoKTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgaWYgKG9sZFdha2VMb2NrICE9IG51bGwgJiYgb2xkV2FrZUxvY2sgIT0gbVN5bmNXYWtlTG9jaykgeworICAgICAgICAgICAgICAgICAgICBvbGRXYWtlTG9jay5yZWxlYXNlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAvLyBubyBuZWVkIHRvIHNjaGVkdWxlIGFuIGFsYXJtLCBhcyB0aGF0IHdpbGwgYmUgZG9uZSBieSBvdXIgY2FsbGVyLgogCiAgICAgICAgICAgICAvLyB0aGUgbmV4dCBzdGVwIHdpbGwgb2NjdXIgd2hlbiB3ZSBnZXQgZWl0aGVyIGEgdGltZW91dCBvciBhCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L1htbERvY3VtZW50UHJvdmlkZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvWG1sRG9jdW1lbnRQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1M2FkMzgKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L1htbERvY3VtZW50UHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDQzNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5jb250ZW50OworCitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLkh0dHBFbnRpdHk7CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLkh0dHBSZXNwb25zZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuSHR0cFN0YXR1czsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuY2xpZW50Lm1ldGhvZHMuSHR0cEdldDsKK2ltcG9ydCBvcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyOworaW1wb3J0IG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXJFeGNlcHRpb247CitpbXBvcnQgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlckZhY3Rvcnk7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyLk9wZW5SZXNvdXJjZUlkUmVzdWx0OworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yOworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuTWF0cml4Q3Vyc29yOworaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKK2ltcG9ydCBhbmRyb2lkLm5ldC5odHRwLkFuZHJvaWRIdHRwQ2xpZW50OworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQ3Vyc29yQWRhcHRlcjsKKworaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuQml0U2V0OworaW1wb3J0IGphdmEudXRpbC5TdGFjazsKK2ltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKKworLyoqCisgKiBBIHJlYWQtb25seSBjb250ZW50IHByb3ZpZGVyIHdoaWNoIGV4dHJhY3RzIGRhdGEgb3V0IG9mIGFuIFhNTCBkb2N1bWVudC4KKyAqCisgKiA8cD5BIFhQYXRoLWxpa2Ugc2VsZWN0aW9uIHBhdHRlcm4gaXMgdXNlZCB0byBzZWxlY3Qgc29tZSBub2RlcyBpbiB0aGUgWE1MIGRvY3VtZW50LiBFYWNoIHN1Y2gKKyAqIG5vZGUgd2lsbCBjcmVhdGUgYSByb3cgaW4gdGhlIHtAbGluayBDdXJzb3J9IHJlc3VsdC48L3A+CisgKgorICogRWFjaCByb3cgaXMgdGhlbiBwb3B1bGF0ZWQgd2l0aCBjb2x1bW5zIHRoYXQgYXJlIGFsc28gZGVmaW5lZCBhcyBYUGF0aC1saWtlIHByb2plY3Rpb25zLiBUaGVzZQorICogcHJvamVjdGlvbnMgZmV0Y2ggYXR0cmlidXRlcyB2YWx1ZXMgb3IgdGV4dCBpbiB0aGUgbWF0Y2hpbmcgcm93IG5vZGUgb3IgaXRzIGNoaWxkcmVuLgorICoKKyAqIDxwPlRvIGFkZCB0aGlzIHByb3ZpZGVyIGluIHlvdXIgYXBwbGljYXRpb24sIHlvdSBzaG91bGQgYWRkIGl0cyBkZWNsYXJhdGlvbiB0byB5b3VyIGFwcGxpY2F0aW9uCisgKiBtYW5pZmVzdDoKKyAqIDxwcmUgY2xhc3M9InByZXR0eXByaW50Ij4KKyAqICZsdDtwcm92aWRlciBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuY29udGVudC5YbWxEb2N1bWVudFByb3ZpZGVyIiBhbmRyb2lkOmF1dGhvcml0aWVzPSJ4bWxkb2N1bWVudCIgLyZndDsKKyAqIDwvcHJlPgorICogPC9wPgorICoKKyAqIDxoMj5Ob2RlIHNlbGVjdGlvbiBzeW50YXg8L2gyPgorICogVGhlIG5vZGUgc2VsZWN0aW9uIHN5bnRheCBpcyBtYWRlIG9mIHRoZSBjb25jYXRlbmF0aW9uIG9mIGFuIGFyYml0cmFyeSBudW1iZXIgKGF0IGxlYXN0IG9uZSkgb2YKKyAqIDxjb2RlPi9ub2RlX25hbWU8L2NvZGU+IG5vZGUgc2VsZWN0aW9uIHBhdHRlcm5zLgorICoKKyAqIDxwPlRoZSA8Y29kZT4vcm9vdC9jaGlsZDEvY2hpbGQyPC9jb2RlPiBwYXR0ZXJuIHdpbGwgZm9yIGluc3RhbmNlIG1hdGNoIGFsbCBub2RlcyBuYW1lZAorICogPGNvZGU+Y2hpbGQyPC9jb2RlPiB3aGljaCBhcmUgY2hpbGRyZW4gb2YgYSBub2RlIG5hbWVkIDxjb2RlPmNoaWxkMTwvY29kZT4gd2hpY2ggYXJlIHRoZW1zZWx2ZXMKKyAqIGNoaWxkcmVuIG9mIGEgcm9vdCBub2RlIG5hbWVkIDxjb2RlPnJvb3Q8L2NvZGU+LjwvcD4KKyAqCisgKiBBbnkgPGNvZGU+LzwvY29kZT4gc2VwYXJhdG9yIGluIHRoZSBwcmV2aW91cyBleHByZXNzaW9uIGNhbiBiZSByZXBsYWNlZCBieSBhIDxjb2RlPi8vPC9jb2RlPgorICogc2VwYXJhdG9yIGluc3RlYWQsIHdoaWNoIGluZGljYXRlZCBhIDxpPmRlc2NlbmRhbnQ8L2k+IGluc3RlYWQgb2YgYSBjaGlsZC4KKyAqCisgKiA8cD5UaGUgPGNvZGU+Ly9ub2RlMS8vbm9kZTI8L2NvZGU+IHBhdHRlcm4gd2lsbCBmb3IgaW5zdGFuY2UgbWF0Y2ggYWxsIG5vZGVzIG5hbWVkCisgKiA8Y29kZT5ub2RlMjwvY29kZT4gd2hpY2ggYXJlIGRlc2NlbmRhbnQgb2YgYSBub2RlIG5hbWVkIDxjb2RlPm5vZGUxPC9jb2RlPiBsb2NhdGVkIGFueXdoZXJlIGluCisgKiB0aGUgZG9jdW1lbnQgaGllcmFyY2h5LjwvcD4KKyAqCisgKiBOb2RlIG5hbWVzIGNhbiBjb250YWluIG5hbWVzcGFjZXMgaW4gdGhlIGZvcm0gPGNvZGU+bmFtZXNwYWNlOm5vZGU8L2NvZGU+LgorICoKKyAqIDxoMj5Qcm9qZWN0aW9uIHN5bnRheDwvaDI+CisgKiBGb3IgZXZlcnkgc2VsZWN0ZWQgbm9kZSwgdGhlIHByb2plY3Rpb24gd2lsbCB0aGVuIGV4dHJhY3QgYWN0dWFsIGRhdGEgZnJvbSB0aGlzIG5vZGUgYW5kIGl0cworICogZGVzY2VuZGFudC4KKyAqCisgKiA8cD5Vc2UgYSBzeW50YXggc2ltaWxhciB0byB0aGUgc2VsZWN0aW9uIHN5bnRheCBkZXNjcmliZWQgYWJvdmUgdG8gc2VsZWN0IHRoZSB0ZXh0IGFzc29jaWF0ZWQKKyAqIHdpdGggYSBjaGlsZCBvZiB0aGUgc2VsZWN0ZWQgbm9kZS4gVGhlIGltcGxpY2l0IHJvb3Qgb2YgdGhpcyBwcm9qZWN0aW9uIHBhdHRlcm4gaXMgdGhlIHNlbGVjdGVkCisgKiBub2RlLiA8Y29kZT4vPC9jb2RlPiB3aWxsIGhlbmNlIHJlZmVyIHRvIHRoZSB0ZXh0IG9mIHRoZSBzZWxlY3RlZCBub2RlLCB3aGlsZQorICogPGNvZGU+L2NoaWxkMTwvY29kZT4gd2lsbCBmZXRjaCB0aGUgdGV4dCBvZiBpdHMgY2hpbGQgbmFtZWQgPGNvZGU+Y2hpbGQxPC9jb2RlPiBhbmQKKyAqIDxjb2RlPi8vY2hpbGQxPC9jb2RlPiB3aWxsIG1hdGNoIGFueSA8aT5kZXNjZW5kYW50PC9pPiBuYW1lZCA8Y29kZT5jaGlsZDE8L2NvZGU+LiBJZiBzZXZlcmFsCisgKiBub2RlcyBtYXRjaCB0aGUgcHJvamVjdGlvbiBwYXR0ZXJuLCB0aGVpciB0ZXh0cyBhcmUgYXBwZW5kZWQgYXMgYSByZXN1bHQuPC9wPgorICoKKyAqIEEgcHJvamVjdGlvbiBjYW4gYWxzbyBmZXRjaCBhbnkgbm9kZSBhdHRyaWJ1dGUgYnkgYXBwZW5kaW5nIGEgPGNvZGU+QGF0dHJpYnV0ZV9uYW1lPC9jb2RlPgorICogcGF0dGVybiB0byB0aGUgcHJldmlvdXNseSBkZXNjcmliZWQgc3ludGF4LiA8Y29kZT4vL2NoaWxkMUBwcmljZTwvY29kZT4gd2lsbCBmb3IgaW5zdGFuY2UgbWF0Y2gKKyAqIHRoZSBhdHRyaWJ1dGUgPGNvZGU+cHJpY2U8L2NvZGU+IG9mIGFueSA8Y29kZT5jaGlsZDE8L2NvZGU+IGRlc2NlbmRhbnQuCisgKgorICogPHA+SWYgYSBwcm9qZWN0aW9uIGRvZXMgbm90IG1hdGNoIGFueSBub2RlL2F0dHJpYnV0ZSwgaXRzIGFzc29jaWF0ZWQgdmFsdWUgd2lsbCBiZSBhbiBlbXB0eQorICogc3RyaW5nLjwvcD4KKyAqCisgKiA8aDI+RXhhbXBsZTwvaDI+CisgKiBVc2luZyB0aGUgZm9sbG93aW5nIFhNTCBkb2N1bWVudDoKKyAqIDxwcmUgY2xhc3M9InByZXR0eXByaW50Ij4KKyAqICZsdDtsaWJyYXJ5Jmd0OworICogICAmbHQ7Ym9vayBpZD0iRUg5NCImZ3Q7CisgKiAgICAgJmx0O3RpdGxlJmd0O1RoZSBPbGQgTWFuIGFuZCB0aGUgU2VhJmx0Oy90aXRsZSZndDsKKyAqICAgICAmbHQ7YXV0aG9yJmd0O0VybmVzdCBIZW1pbmd3YXkmbHQ7L2F1dGhvciZndDsKKyAqICAgJmx0Oy9ib29rJmd0OworICogICAmbHQ7Ym9vayBpZD0iWFgxMCImZ3Q7CisgKiAgICAgJmx0O3RpdGxlJmd0O1RoZSBBcmFiaWFuIE5pZ2h0czogVGFsZXMgb2YgMSwwMDEgTmlnaHRzJmx0Oy90aXRsZSZndDsKKyAqICAgJmx0Oy9ib29rJmd0OworICogICAmbHQ7bm8taWQmZ3Q7CisgKiAgICAgJmx0O2Jvb2smZ3Q7CisgKiAgICAgICAmbHQ7dGl0bGUmZ3Q7QW5pbWFsIEZhcm0mbHQ7L3RpdGxlJmd0OworICogICAgICAgJmx0O2F1dGhvciZndDtHZW9yZ2UgT3J3ZWxsJmx0Oy9hdXRob3ImZ3Q7CisgKiAgICAgJmx0Oy9ib29rJmd0OworICogICAmbHQ7L25vLWlkJmd0OworICogJmx0Oy9saWJyYXJ5Jmd0OworICogPC9wcmU+CisgKiBBIHNlbGVjdGlvbiBwYXR0ZXJuIG9mIDxjb2RlPi9saWJyYXJ5Ly9ib29rPC9jb2RlPiB3aWxsIG1hdGNoIHRoZSB0aHJlZSBib29rIGVudHJpZXMgKHdoaWxlCisgKiA8Y29kZT4vbGlicmFyeS9ib29rPC9jb2RlPiB3aWxsIG9ubHkgbWF0Y2ggdGhlIGZpcnN0IHR3byBvbmVzKS4KKyAqCisgKiA8cD5EZWZpbmluZyB0aGUgcHJvamVjdGlvbnMgYXMgPGNvZGU+L3RpdGxlPC9jb2RlPiwgPGNvZGU+L2F1dGhvcjwvY29kZT4gYW5kIDxjb2RlPkBpZDwvY29kZT4KKyAqIHdpbGwgcmV0cmlldmUgdGhlIGFzc29jaWF0ZWQgZGF0YS4gTm90ZSB0aGF0IHRoZSBhdXRob3Igb2YgdGhlIHNlY29uZCBib29rIGFzIHdlbGwgYXMgdGhlIGlkIG9mCisgKiB0aGUgdGhpcmQgYXJlIGVtcHR5IHN0cmluZ3MuCisgKi8KK3B1YmxpYyBjbGFzcyBYbWxEb2N1bWVudFByb3ZpZGVyIGV4dGVuZHMgQ29udGVudFByb3ZpZGVyIHsKKyAgICAvKgorICAgICAqIElkZWFzIGZvciBpbXByb3ZlbWVudDoKKyAgICAgKiAtIEV4cGFuZCBYUGF0aC1saWtlIHN5bnRheCB0byBhbGxvdyBmb3IgW25iXSBjaGlsZCBudW1iZXIgc2VsZWN0b3IKKyAgICAgKiAtIEFkZHJlc3MgdGhlIHN0YXJ0aW5nIC4gYnVnIGluIEFic3RyYWN0Q3Vyc29yIHdoaWNoIHByZXZlbnRzIGEgdHJ1ZSBYUGF0aCBzeW50YXguCisgICAgICogLSBQcm92aWRlIGFuIGFsdGVybmF0aXZlIHRvIGNvbmNhdGVuYXRpb24gd2hlbiBzZXZlcmFsIG5vZGUgbWF0Y2ggKGxpc3QtbGlrZSkuCisgICAgICogLSBTdXBwb3J0IG5hbWVzcGFjZXMgaW4gYXR0cmlidXRlIG5hbWVzLgorICAgICAqIC0gSW5jcmVtZW50YWwgQ3Vyc29yIGNyZWF0aW9uLCBwYWdpbmF0aW9uCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19UQUcgPSAiWG1sRG9jdW1lbnRQcm92aWRlciI7CisgICAgcHJpdmF0ZSBBbmRyb2lkSHR0cENsaWVudCBtSHR0cENsaWVudDsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIG9uQ3JlYXRlKCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBRdWVyeSBkYXRhIGZyb20gdGhlIFhNTCBkb2N1bWVudCByZWZlcmVuY2VkIGluIHRoZSBVUkkuCisgICAgICoKKyAgICAgKiA8cD5UaGUgWE1MIGRvY3VtZW50IGNhbiBiZSBhIGxvY2FsIHJlc291cmNlIG9yIGEgZmlsZSB0aGF0IHdpbGwgYmUgZG93bmxvYWRlZCBmcm9tIHRoZQorICAgICAqIEludGVybmV0LiBJbiB0aGUgbGF0dGVyIGNhc2UsIHlvdXIgYXBwbGljYXRpb24gbmVlZHMgdG8gcmVxdWVzdCB0aGUgSU5URVJORVQgcGVybWlzc2lvbiBpbgorICAgICAqIGl0cyBtYW5pZmVzdC48L3A+CisgICAgICoKKyAgICAgKiBUaGUgVVJJIHdpbGwgYmUgb2YgdGhlIGZvcm0gPGNvZGU+Y29udGVudDovL3htbGRvY3VtZW50Lz9yZXNvdXJjZT1SLnhtbC5teUZpbGU8L2NvZGU+IGZvciBhCisgICAgICogbG9jYWwgcmVzb3VyY2UuIDxjb2RlPnhtbGRvY3VtZW50PC9jb2RlPiBzaG91bGQgbWF0Y2ggdGhlIGF1dGhvcml0eSBkZWNsYXJlZCBmb3IgdGhpcworICAgICAqIHByb3ZpZGVyIGluIHlvdXIgbWFuaWZlc3QuIEludGVybmV0IGRvY3VtZW50cyBhcmUgcmVmZXJlbmNlZCB1c2luZworICAgICAqIDxjb2RlPmNvbnRlbnQ6Ly94bWxkb2N1bWVudC8/dXJsPTwvY29kZT4gZm9sbG93ZWQgYnkgYW4gZW5jb2RlZCB2ZXJzaW9uIG9mIHRoZSBVUkwgb2YgeW91cgorICAgICAqIGRvY3VtZW50IChzZWUge0BsaW5rIFVyaSNlbmNvZGUoU3RyaW5nKX0pLgorICAgICAqCisgICAgICogPHA+VGhlIG51bWJlciBvZiBjb2x1bW5zIG9mIHRoZSByZXN1bHRpbmcgQ3Vyc29yIGlzIGVxdWFsIHRvIHRoZSBzaXplIG9mIHRoZSBwcm9qZWN0aW9uCisgICAgICogYXJyYXkgcGx1cyBvbmUsIG5hbWVkIDxjb2RlPl9pZDwvY29kZT4gd2hpY2ggd2lsbCBjb250YWluIGEgdW5pcXVlIHJvdyBpZCAoYWxsb3dpbmcgdGhlCisgICAgICogQ3Vyc29yIHRvIGJlIHVzZWQgd2l0aCBhIHtAbGluayBDdXJzb3JBZGFwdGVyfSkuIFRoZSBvdGhlciBjb2x1bW5zJyBuYW1lcyBhcmUgdGhlIHByb2plY3Rpb24KKyAgICAgKiBwYXR0ZXJucy48L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gdXJpIFRoZSBVUkkgb2YgeW91ciBsb2NhbCByZXNvdXJjZSBvciBJbnRlcm5ldCBkb2N1bWVudC4KKyAgICAgKiBAcGFyYW0gcHJvamVjdGlvbiBBIHNldCBvZiBwYXR0ZXJucyB0aGF0IHdpbGwgYmUgdXNlZCB0byBleHRyYWN0IGRhdGEgZnJvbSBlYWNoIHNlbGVjdGVkCisgICAgICogbm9kZS4gU2VlIGNsYXNzIGRvY3VtZW50YXRpb24gZm9yIHBhdHRlcm4gc3ludGF4LgorICAgICAqIEBwYXJhbSBzZWxlY3Rpb24gQSBzZWxlY3Rpb24gcGF0dGVybiB3aGljaCB3aWxsIHNlbGVjdCB0aGUgbm9kZXMgdGhhdCB3aWxsIGNyZWF0ZSB0aGUKKyAgICAgKiBDdXJzb3IncyByb3dzLiBTZWUgY2xhc3MgZG9jdW1lbnRhdGlvbiBmb3IgcGF0dGVybiBzeW50YXguCisgICAgICogQHBhcmFtIHNlbGVjdGlvbkFyZ3MgVGhpcyBwYXJhbWV0ZXIgaXMgaWdub3JlZC4KKyAgICAgKiBAcGFyYW0gc29ydE9yZGVyIFRoZSByb3cgb3JkZXIgaW4gdGhlIHJlc3VsdGluZyBjdXJzb3IgaXMgZGV0ZXJtaW5lZCBmcm9tIHRoZSBub2RlIG9yZGVyIGluCisgICAgICogdGhlIFhNTCBkb2N1bWVudC4gVGhpcyBwYXJhbWV0ZXIgaXMgaWdub3JlZC4KKyAgICAgKiBAcmV0dXJuIEEgQ3Vyc29yIG9yIG51bGwgaW4gY2FzZSBvZiBlcnJvci4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQ3Vyc29yIHF1ZXJ5KFVyaSB1cmksIFN0cmluZ1tdIHByb2plY3Rpb24sIFN0cmluZyBzZWxlY3Rpb24sIFN0cmluZ1tdIHNlbGVjdGlvbkFyZ3MsCisgICAgICAgICAgICBTdHJpbmcgc29ydE9yZGVyKSB7CisKKyAgICAgICAgWG1sUHVsbFBhcnNlciBwYXJzZXIgPSBudWxsOworICAgICAgICBtSHR0cENsaWVudCA9IG51bGw7CisKKyAgICAgICAgZmluYWwgU3RyaW5nIHVybCA9IHVyaS5nZXRRdWVyeVBhcmFtZXRlcigidXJsIik7CisgICAgICAgIGlmICh1cmwgIT0gbnVsbCkgeworICAgICAgICAgICAgcGFyc2VyID0gZ2V0VXJpWG1sUHVsbFBhcnNlcih1cmwpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZmluYWwgU3RyaW5nIHJlc291cmNlID0gdXJpLmdldFF1ZXJ5UGFyYW1ldGVyKCJyZXNvdXJjZSIpOworICAgICAgICAgICAgaWYgKHJlc291cmNlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBVcmkgcmVzb3VyY2VVcmkgPSBVcmkucGFyc2UoQ29udGVudFJlc29sdmVyLlNDSEVNRV9BTkRST0lEX1JFU09VUkNFICsgIjovLyIgKworICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q29udGV4dCgpLmdldFBhY2thZ2VOYW1lKCkgKyAiLyIgKyByZXNvdXJjZSk7CisgICAgICAgICAgICAgICAgcGFyc2VyID0gZ2V0UmVzb3VyY2VYbWxQdWxsUGFyc2VyKHJlc291cmNlVXJpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChwYXJzZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgWE1MQ3Vyc29yIHhtbEN1cnNvciA9IG5ldyBYTUxDdXJzb3Ioc2VsZWN0aW9uLCBwcm9qZWN0aW9uKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgeG1sQ3Vyc29yLnBhcnNlV2l0aChwYXJzZXIpOworICAgICAgICAgICAgICAgIHJldHVybiB4bWxDdXJzb3I7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLncoTE9HX1RBRywgIkkvTyBlcnJvciB3aGlsZSBwYXJzaW5nIFhNTCAiICsgdXJpLCBlKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFhtbFB1bGxQYXJzZXJFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy53KExPR19UQUcsICJFcnJvciB3aGlsZSBwYXJzaW5nIFhNTCAiICsgdXJpLCBlKTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgaWYgKG1IdHRwQ2xpZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbUh0dHBDbGllbnQuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGFuIFhtbFB1bGxQYXJzZXIgZm9yIHRoZSBwcm92aWRlZCBVUkwuIENhbiBiZSBvdmVybG9hZGVkIHRvIHByb3ZpZGUgeW91ciBvd24gcGFyc2VyLgorICAgICAqIEBwYXJhbSB1cmwgVGhlIFVSTCBvZiB0aGUgWE1MIGRvY3VtZW50IHRoYXQgaXMgdG8gYmUgcGFyc2VkLgorICAgICAqIEByZXR1cm4gQW4gWG1sUHVsbFBhcnNlciBvbiB0aGlzIGRvY3VtZW50LgorICAgICAqLworICAgIHByb3RlY3RlZCBYbWxQdWxsUGFyc2VyIGdldFVyaVhtbFB1bGxQYXJzZXIoU3RyaW5nIHVybCkgeworICAgICAgICBYbWxQdWxsUGFyc2VyIHBhcnNlciA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBYbWxQdWxsUGFyc2VyRmFjdG9yeSBmYWN0b3J5ID0gWG1sUHVsbFBhcnNlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgICAgIGZhY3Rvcnkuc2V0TmFtZXNwYWNlQXdhcmUodHJ1ZSk7CisgICAgICAgICAgICBwYXJzZXIgPSBmYWN0b3J5Lm5ld1B1bGxQYXJzZXIoKTsKKyAgICAgICAgfSBjYXRjaCAoWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiVW5hYmxlIHRvIGNyZWF0ZSBYbWxQdWxsUGFyc2VyIiwgZSk7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIElucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZpbmFsIEh0dHBHZXQgZ2V0ID0gbmV3IEh0dHBHZXQodXJsKTsKKyAgICAgICAgICAgIG1IdHRwQ2xpZW50ID0gQW5kcm9pZEh0dHBDbGllbnQubmV3SW5zdGFuY2UoIkFuZHJvaWQiKTsKKyAgICAgICAgICAgIEh0dHBSZXNwb25zZSByZXNwb25zZSA9IG1IdHRwQ2xpZW50LmV4ZWN1dGUoZ2V0KTsKKyAgICAgICAgICAgIGlmIChyZXNwb25zZS5nZXRTdGF0dXNMaW5lKCkuZ2V0U3RhdHVzQ29kZSgpID09IEh0dHBTdGF0dXMuU0NfT0spIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBIdHRwRW50aXR5IGVudGl0eSA9IHJlc3BvbnNlLmdldEVudGl0eSgpOworICAgICAgICAgICAgICAgIGlmIChlbnRpdHkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBpbnB1dFN0cmVhbSA9IGVudGl0eS5nZXRDb250ZW50KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cudyhMT0dfVEFHLCAiRXJyb3Igd2hpbGUgcmV0cmlldmluZyBYTUwgZmlsZSAiICsgdXJsLCBlKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHBhcnNlci5zZXRJbnB1dChpbnB1dFN0cmVhbSwgbnVsbCk7CisgICAgICAgIH0gY2F0Y2ggKFhtbFB1bGxQYXJzZXJFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLncoTE9HX1RBRywgIkVycm9yIHdoaWxlIHJlYWRpbmcgWE1MIGZpbGUgZnJvbSAiICsgdXJsLCBlKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHBhcnNlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGFuIFhtbFB1bGxQYXJzZXIgZm9yIHRoZSBwcm92aWRlZCBsb2NhbCByZXNvdXJjZS4gQ2FuIGJlIG92ZXJsb2FkZWQgdG8gcHJvdmlkZSB5b3VyCisgICAgICogb3duIHBhcnNlci4KKyAgICAgKiBAcGFyYW0gcmVzb3VyY2VVcmkgQSBmdWxseSBxdWFsaWZpZWQgcmVzb3VyY2UgbmFtZSByZWZlcmVuY2luZyBhIGxvY2FsIFhNTCByZXNvdXJjZS4KKyAgICAgKiBAcmV0dXJuIEFuIFhtbFB1bGxQYXJzZXIgb24gdGhpcyByZXNvdXJjZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgWG1sUHVsbFBhcnNlciBnZXRSZXNvdXJjZVhtbFB1bGxQYXJzZXIoVXJpIHJlc291cmNlVXJpKSB7CisgICAgICAgIE9wZW5SZXNvdXJjZUlkUmVzdWx0IHJlc291cmNlSWQ7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXNvdXJjZUlkID0gZ2V0Q29udGV4dCgpLmdldENvbnRlbnRSZXNvbHZlcigpLmdldFJlc291cmNlSWQocmVzb3VyY2VVcmkpOworICAgICAgICAgICAgcmV0dXJuIHJlc291cmNlSWQuci5nZXRYbWwocmVzb3VyY2VJZC5pZCk7CisgICAgICAgIH0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cudyhMT0dfVEFHLCAiWE1MIHJlc291cmNlIG5vdCBmb3VuZDogIiArIHJlc291cmNlVXJpLnRvU3RyaW5nKCksIGUpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zICJ2bmQuYW5kcm9pZC5jdXJzb3IuZGlyL3htbGRvYyIuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBnZXRUeXBlKFVyaSB1cmkpIHsKKyAgICAgICAgcmV0dXJuICJ2bmQuYW5kcm9pZC5jdXJzb3IuZGlyL3htbGRvYyI7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBDb250ZW50UHJvdmlkZXIgaXMgcmVhZC1vbmx5LiBUaGlzIG1ldGhvZCB0aHJvd3MgYW4gVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24uCisgICAgICoqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBVcmkgaW5zZXJ0KFVyaSB1cmksIENvbnRlbnRWYWx1ZXMgdmFsdWVzKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgQ29udGVudFByb3ZpZGVyIGlzIHJlYWQtb25seS4gVGhpcyBtZXRob2QgdGhyb3dzIGFuIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uLgorICAgICAqKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGRlbGV0ZShVcmkgdXJpLCBTdHJpbmcgc2VsZWN0aW9uLCBTdHJpbmdbXSBzZWxlY3Rpb25BcmdzKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgQ29udGVudFByb3ZpZGVyIGlzIHJlYWQtb25seS4gVGhpcyBtZXRob2QgdGhyb3dzIGFuIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uLgorICAgICAqKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IHVwZGF0ZShVcmkgdXJpLCBDb250ZW50VmFsdWVzIHZhbHVlcywgU3RyaW5nIHNlbGVjdGlvbiwgU3RyaW5nW10gc2VsZWN0aW9uQXJncykgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBYTUxDdXJzb3IgZXh0ZW5kcyBNYXRyaXhDdXJzb3IgeworICAgICAgICBwcml2YXRlIGZpbmFsIFBhdHRlcm4gbVNlbGVjdGlvblBhdHRlcm47CisgICAgICAgIHByaXZhdGUgUGF0dGVybltdIG1Qcm9qZWN0aW9uUGF0dGVybnM7CisgICAgICAgIHByaXZhdGUgU3RyaW5nW10gbUF0dHJpYnV0ZU5hbWVzOworICAgICAgICBwcml2YXRlIFN0cmluZ1tdIG1DdXJyZW50VmFsdWVzOworICAgICAgICBwcml2YXRlIEJpdFNldFtdIG1BY3RpdmVUZXh0RGVwdGhNYXNrOworICAgICAgICBwcml2YXRlIGZpbmFsIGludCBtTnVtYmVyT2ZQcm9qZWN0aW9uczsKKworICAgICAgICBwdWJsaWMgWE1MQ3Vyc29yKFN0cmluZyBzZWxlY3Rpb24sIFN0cmluZ1tdIHByb2plY3Rpb25zKSB7CisgICAgICAgICAgICBzdXBlcihwcm9qZWN0aW9ucyk7CisgICAgICAgICAgICAvLyBUaGUgZmlyc3QgY29sdW1uIGluIHByb2plY3Rpb25zIGlzIHVzZWQgZm9yIHRoZSBfSUQKKyAgICAgICAgICAgIG1OdW1iZXJPZlByb2plY3Rpb25zID0gcHJvamVjdGlvbnMubGVuZ3RoIC0gMTsKKyAgICAgICAgICAgIG1TZWxlY3Rpb25QYXR0ZXJuID0gY3JlYXRlUGF0dGVybihzZWxlY3Rpb24pOworICAgICAgICAgICAgY3JlYXRlUHJvamVjdGlvblBhdHRlcm4ocHJvamVjdGlvbnMpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBQYXR0ZXJuIGNyZWF0ZVBhdHRlcm4oU3RyaW5nIGlucHV0KSB7CisgICAgICAgICAgICBTdHJpbmcgcGF0dGVybiA9IGlucHV0LnJlcGxhY2VBbGwoIi8vIiwgIi8oLiovfCkiKS5yZXBsYWNlQWxsKCJeLyIsICJeLyIpICsgIiQiOworICAgICAgICAgICAgcmV0dXJuIFBhdHRlcm4uY29tcGlsZShwYXR0ZXJuKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBjcmVhdGVQcm9qZWN0aW9uUGF0dGVybihTdHJpbmdbXSBwcm9qZWN0aW9ucykgeworICAgICAgICAgICAgbVByb2plY3Rpb25QYXR0ZXJucyA9IG5ldyBQYXR0ZXJuW21OdW1iZXJPZlByb2plY3Rpb25zXTsKKyAgICAgICAgICAgIG1BdHRyaWJ1dGVOYW1lcyA9IG5ldyBTdHJpbmdbbU51bWJlck9mUHJvamVjdGlvbnNdOworICAgICAgICAgICAgbUFjdGl2ZVRleHREZXB0aE1hc2sgPSBuZXcgQml0U2V0W21OdW1iZXJPZlByb2plY3Rpb25zXTsKKyAgICAgICAgICAgIC8vIEFkZCBhIGNvbHVtbiB0byBzdG9yZSBfSUQKKyAgICAgICAgICAgIG1DdXJyZW50VmFsdWVzID0gbmV3IFN0cmluZ1ttTnVtYmVyT2ZQcm9qZWN0aW9ucyArIDFdOworCisgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8bU51bWJlck9mUHJvamVjdGlvbnM7IGkrKykgeworICAgICAgICAgICAgICAgIG1BY3RpdmVUZXh0RGVwdGhNYXNrW2ldID0gbmV3IEJpdFNldCgpOworICAgICAgICAgICAgICAgIFN0cmluZyBwcm9qZWN0aW9uID0gcHJvamVjdGlvbnNbaSArIDFdOyAvLyArMSB0byBza2lwIHRoZSBfSUQgY29sdW1uCisgICAgICAgICAgICAgICAgaW50IGF0SW5kZXggPSBwcm9qZWN0aW9uLmxhc3RJbmRleE9mKCdAJywgcHJvamVjdGlvbi5sZW5ndGgoKSk7CisgICAgICAgICAgICAgICAgaWYgKGF0SW5kZXggPj0gMCkgeworICAgICAgICAgICAgICAgICAgICBtQXR0cmlidXRlTmFtZXNbaV0gPSBwcm9qZWN0aW9uLnN1YnN0cmluZyhhdEluZGV4KzEpOworICAgICAgICAgICAgICAgICAgICBwcm9qZWN0aW9uID0gcHJvamVjdGlvbi5zdWJzdHJpbmcoMCwgYXRJbmRleCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbUF0dHJpYnV0ZU5hbWVzW2ldID0gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBDb25mb3JtcyB0byBYUGF0aCBzdGFuZGFyZDogcmVmZXJlbmNlIHRvIGxvY2FsIGNvbnRleHQgc3RhcnRzIHdpdGggYSAuCisgICAgICAgICAgICAgICAgaWYgKHByb2plY3Rpb24uY2hhckF0KDApID09ICcuJykgeworICAgICAgICAgICAgICAgICAgICBwcm9qZWN0aW9uID0gcHJvamVjdGlvbi5zdWJzdHJpbmcoMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1Qcm9qZWN0aW9uUGF0dGVybnNbaV0gPSBjcmVhdGVQYXR0ZXJuKHByb2plY3Rpb24pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgcGFyc2VXaXRoKFhtbFB1bGxQYXJzZXIgcGFyc2VyKSB0aHJvd3MgSU9FeGNlcHRpb24sIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24geworICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBwYXRoID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgICAgIFN0YWNrPEludGVnZXI+IHBhdGhMZW5ndGhTdGFjayA9IG5ldyBTdGFjazxJbnRlZ2VyPigpOworCisgICAgICAgICAgICAvLyBUaGVyZSBhcmUgdHdvIHBhcnNpbmcgbW9kZTogaW4gcm9vdCBtb2RlLCByb290UGF0aCBpcyB1cGRhdGVkIGFuZCBub2RlcyBtYXRjaGluZworICAgICAgICAgICAgLy8gc2VsZWN0aW9uUGF0dGVybiBhcmUgc2VhcmNoZWQgZm9yIGFuZCBjdXJyZW50Tm9kZURlcHRoIGlzIG5lZ2F0aXZlLgorICAgICAgICAgICAgLy8gV2hlbiBhIG5vZGUgbWF0Y2hpbmcgc2VsZWN0aW9uUGF0dGVybiBpcyBmb3VuZCwgY3VycmVudE5vZGVEZXB0aCBpcyBzZXQgdG8gMCBhbmQKKyAgICAgICAgICAgIC8vIHVwZGF0ZWQgYXMgY2hpbGRyZW4gYXJlIHBhcnNlZCBhbmQgcHJvamVjdGlvblBhdHRlcm5zIGFyZSBzZWFyY2hlZCBpbiBub2RlUGF0aC4KKyAgICAgICAgICAgIGludCBjdXJyZW50Tm9kZURlcHRoID0gLTE7CisKKyAgICAgICAgICAgIC8vIEluZGV4IHdoZXJlIGxvY2FsIHNlbGVjdGVkIG5vZGUgcGF0aCBzdGFydHMgZnJvbSBpbiBwYXRoCisgICAgICAgICAgICBpbnQgY3VycmVudE5vZGVQYXRoU3RhcnRJbmRleCA9IDA7CisKKyAgICAgICAgICAgIGludCBldmVudFR5cGUgPSBwYXJzZXIuZ2V0RXZlbnRUeXBlKCk7CisgICAgICAgICAgICB3aGlsZSAoZXZlbnRUeXBlICE9IFhtbFB1bGxQYXJzZXIuRU5EX0RPQ1VNRU5UKSB7CisKKyAgICAgICAgICAgICAgICBpZiAoZXZlbnRUeXBlID09IFhtbFB1bGxQYXJzZXIuU1RBUlRfVEFHKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBwYXRoCisgICAgICAgICAgICAgICAgICAgIHBhdGhMZW5ndGhTdGFjay5wdXNoKHBhdGgubGVuZ3RoKCkpOworICAgICAgICAgICAgICAgICAgICBwYXRoLmFwcGVuZCgnLycpOworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcHJlZml4ID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdldFByZWZpeCBpcyBub3Qgc3VwcG9ydGVkIGJ5IGxvY2FsIFhtbCByZXNvdXJjZSBwYXJzZXIKKyAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHBhcnNlci5nZXRQcmVmaXgoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBudWxsOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXggIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcGF0aC5hcHBlbmQocHJlZml4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhdGguYXBwZW5kKCc6Jyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcGF0aC5hcHBlbmQocGFyc2VyLmdldE5hbWUoKSk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnROb2RlRGVwdGggPj0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGVEZXB0aCsrOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBub2RlIG1hdGNoaW5nIHNlbGVjdGlvbiBpcyBmb3VuZDogaW5pdGlhbGl6ZSBjaGlsZCBwYXJzaW5nIG1vZGUKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtU2VsZWN0aW9uUGF0dGVybi5tYXRjaGVyKHBhdGgudG9TdHJpbmcoKSkubWF0Y2hlcygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGVEZXB0aCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGVQYXRoU3RhcnRJbmRleCA9IHBhdGgubGVuZ3RoKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRWYWx1ZXNbMF0gPSBJbnRlZ2VyLnRvU3RyaW5nKGdldENvdW50KCkpOyAvLyBfSUQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1OdW1iZXJPZlByb2plY3Rpb25zOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVzZXQgdmFsdWVzIHRvIGRlZmF1bHQgKGVtcHR5IHN0cmluZykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRWYWx1ZXNbaSArIDFdID0gIiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BY3RpdmVUZXh0RGVwdGhNYXNrW2ldLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyB0ZXN0IGhhcyB0byBiZSBzZXBhcmF0ZWQgZnJvbSB0aGUgcHJldmlvdXMgb25lIGFzIGN1cnJlbnROb2RlRGVwdGggY2FuCisgICAgICAgICAgICAgICAgICAgIC8vIGJlIG1vZGlmaWVkIGFib3ZlICh3aGVuIGEgbm9kZSBtYXRjaGluZyBzZWxlY3Rpb24gaXMgZm91bmQpLgorICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudE5vZGVEZXB0aCA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbG9jYWxOb2RlUGF0aCA9IHBhdGguc3Vic3RyaW5nKGN1cnJlbnROb2RlUGF0aFN0YXJ0SW5kZXgpOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtTnVtYmVyT2ZQcm9qZWN0aW9uczsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1Qcm9qZWN0aW9uUGF0dGVybnNbaV0ubWF0Y2hlcihsb2NhbE5vZGVQYXRoKS5tYXRjaGVzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGF0dHJpYnV0ZSA9IG1BdHRyaWJ1dGVOYW1lc1tpXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFZhbHVlc1tpICsgMV0gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZShudWxsLCBhdHRyaWJ1dGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUFjdGl2ZVRleHREZXB0aE1hc2tbaV0uc2V0KGN1cnJlbnROb2RlRGVwdGgsIHRydWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGV2ZW50VHlwZSA9PSBYbWxQdWxsUGFyc2VyLkVORF9UQUcpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gUG9wIGxhc3Qgbm9kZSBmcm9tIHBhdGgKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGxlbmd0aCA9IHBhdGhMZW5ndGhTdGFjay5wb3AoKTsKKyAgICAgICAgICAgICAgICAgICAgcGF0aC5zZXRMZW5ndGgobGVuZ3RoKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudE5vZGVEZXB0aCA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudE5vZGVEZXB0aCA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTGVhdmluZyBhIHNlbGVjdGlvbiBtYXRjaGluZyBub2RlOiBhZGQgYSBuZXcgcm93IHdpdGggcmVzdWx0cworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZFJvdyhtQ3VycmVudFZhbHVlcyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbU51bWJlck9mUHJvamVjdGlvbnM7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQWN0aXZlVGV4dERlcHRoTWFza1tpXS5zZXQoY3VycmVudE5vZGVEZXB0aCwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlRGVwdGgtLTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgoZXZlbnRUeXBlID09IFhtbFB1bGxQYXJzZXIuVEVYVCkgJiYgKCFwYXJzZXIuaXNXaGl0ZXNwYWNlKCkpKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbU51bWJlck9mUHJvamVjdGlvbnM7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChjdXJyZW50Tm9kZURlcHRoID49IDApICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1BY3RpdmVUZXh0RGVwdGhNYXNrW2ldLmdldChjdXJyZW50Tm9kZURlcHRoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFZhbHVlc1tpICsgMV0gKz0gcGFyc2VyLmdldFRleHQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGV2ZW50VHlwZSA9IHBhcnNlci5uZXh0KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L3BtL0FwcGxpY2F0aW9uSW5mby5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9wbS9BcHBsaWNhdGlvbkluZm8uamF2YQppbmRleCA3OTAxYjE1NS4uMzVmMjJkYyAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9wbS9BcHBsaWNhdGlvbkluZm8uamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L3BtL0FwcGxpY2F0aW9uSW5mby5qYXZhCkBAIC0yODQsNiArMjg0LDEyIEBACiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19IRUFWWV9XRUlHSFQgPSAxPDwyMDsKICAgICAKICAgICAvKioKKyAgICAgKiBWYWx1ZSBmb3Ige0BsaW5rICNmbGFnc306IHRydWUgd2hlbiB0aGUgYXBwbGljYXRpb24ncyByZW5kZXJpbmcgc2hvdWxkCisgICAgICogYmUgaGFyZHdhcmUgYWNjZWxlcmF0ZWQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19IQVJEV0FSRV9BQ0NFTEVSQVRFRCA9IDE8PDIxOworICAgIAorICAgIC8qKgogICAgICAqIFZhbHVlIGZvciB7QGxpbmsgI2ZsYWdzfTogdGhpcyBpcyB0cnVlIGlmIHRoZSBhcHBsaWNhdGlvbiBoYXMgc2V0CiAgICAgICogaXRzIGFuZHJvaWQ6bmV2ZXJFbmNyeXB0IHRvIHRydWUsIGZhbHNlIG90aGVyd2lzZS4gSXQgaXMgdXNlZCB0byBzcGVjaWZ5CiAgICAgICogdGhhdCB0aGlzIHBhY2thZ2Ugc3BlY2lmaWNhbGx5ICJvcHRzLW91dCIgb2YgYSBzZWN1cmVkIGZpbGUgc3lzdGVtIHNvbHV0aW9uLApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9wbS9QYWNrYWdlUGFyc2VyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L3BtL1BhY2thZ2VQYXJzZXIuamF2YQppbmRleCA1ZGM0MWQyLi42MDk4NjE3IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L3BtL1BhY2thZ2VQYXJzZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L3BtL1BhY2thZ2VQYXJzZXIuamF2YQpAQCAtMTUzNiw2ICsxNTM2LDEyIEBACiAgICAgICAgIH0KIAogICAgICAgICBpZiAoc2EuZ2V0Qm9vbGVhbigKKyAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5BbmRyb2lkTWFuaWZlc3RBcHBsaWNhdGlvbl9oYXJkd2FyZUFjY2VsZXJhdGVkLAorICAgICAgICAgICAgICAgIGZhbHNlKSkgeworICAgICAgICAgICAgYWkuZmxhZ3MgfD0gQXBwbGljYXRpb25JbmZvLkZMQUdfSEFSRFdBUkVfQUNDRUxFUkFURUQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAoc2EuZ2V0Qm9vbGVhbigKICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5BbmRyb2lkTWFuaWZlc3RBcHBsaWNhdGlvbl9oYXNDb2RlLAogICAgICAgICAgICAgICAgIHRydWUpKSB7CiAgICAgICAgICAgICBhaS5mbGFncyB8PSBBcHBsaWNhdGlvbkluZm8uRkxBR19IQVNfQ09ERTsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0Fic3RyYWN0Q3Vyc29yLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9BYnN0cmFjdEN1cnNvci5qYXZhCmluZGV4IGE1ZTVlNDYuLjgwZWIxOGIgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0Fic3RyYWN0Q3Vyc29yLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvQWJzdHJhY3RDdXJzb3IuamF2YQpAQCAtMTgsMTYgKzE4LDExIEBACiAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyOwogaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKIGltcG9ydCBhbmRyb2lkLnV0aWwuQ29uZmlnOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwotaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlclRocmVhZDsKLWltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKLWltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CiAKIGltcG9ydCBqYXZhLmxhbmcucmVmLldlYWtSZWZlcmVuY2U7Ci1pbXBvcnQgamF2YS5sYW5nLlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uOwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5NYXA7CiAKQEAgLTU2LDYgKzUxLDEwIEBACiAgICAgYWJzdHJhY3QgcHVibGljIGRvdWJsZSBnZXREb3VibGUoaW50IGNvbHVtbik7CiAgICAgYWJzdHJhY3QgcHVibGljIGJvb2xlYW4gaXNOdWxsKGludCBjb2x1bW4pOwogCisgICAgcHVibGljIGludCBnZXRUeXBlKGludCBjb2x1bW4pIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCiAgICAgLy8gVE9ETyBpbXBsZW1lbnQgZ2V0QmxvYiBpbiBhbGwgY3Vyc29yIHR5cGVzCiAgICAgcHVibGljIGJ5dGVbXSBnZXRCbG9iKGludCBjb2x1bW4pIHsKICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJnZXRCbG9iIGlzIG5vdCBzdXBwb3J0ZWQiKTsKQEAgLTg4LDcgKzg3LDcgQEAKICAgICAgICAgfQogICAgICAgICBtRGF0YVNldE9ic2VydmFibGUubm90aWZ5SW52YWxpZGF0ZWQoKTsKICAgICB9Ci0gICAgCisKICAgICBwdWJsaWMgYm9vbGVhbiByZXF1ZXJ5KCkgewogICAgICAgICBpZiAobVNlbGZPYnNlcnZlciAhPSBudWxsICYmIG1TZWxmT2JzZXJ2ZXJSZWdpc3RlcmVkID09IGZhbHNlKSB7CiAgICAgICAgICAgICBtQ29udGVudFJlc29sdmVyLnJlZ2lzdGVyQ29udGVudE9ic2VydmVyKG1Ob3RpZnlVcmksIHRydWUsIG1TZWxmT2JzZXJ2ZXIpOwpAQCAtMTA5LDIyICsxMDgsNiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBjb21taXRVcGRhdGVzKE1hcDw/IGV4dGVuZHMgTG9uZyw/IGV4dGVuZHMgTWFwPFN0cmluZyxPYmplY3Q+PiB2YWx1ZXMpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBkZWxldGVSb3coKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKICAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBldmVyeSB0aW1lIHRoZSBjdXJzb3IgaXMgc3VjY2Vzc2Z1bGx5IHNjcm9sbGVkCiAgICAgICogdG8gYSBuZXcgcG9zaXRpb24sIGdpdmluZyB0aGUgc3ViY2xhc3MgYSBjaGFuY2UgdG8gdXBkYXRlIGFueSBzdGF0ZSBpdAogICAgICAqIG1heSBoYXZlLiBJZiBpdCByZXR1cm5zIGZhbHNlIHRoZSBtb3ZlIGZ1bmN0aW9uIHdpbGwgYWxzbyBkbyBzbyBhbmQgdGhlCkBAIC0zMjAsMTM3ICszMDMsNiBAQAogICAgICAgICByZXR1cm4gZ2V0Q29sdW1uTmFtZXMoKVtjb2x1bW5JbmRleF07CiAgICAgfQogCi0gICAgLyoqCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHVwZGF0ZUJsb2IoaW50IGNvbHVtbkluZGV4LCBieXRlW10gdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIHVwZGF0ZShjb2x1bW5JbmRleCwgdmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiB1cGRhdGVTdHJpbmcoaW50IGNvbHVtbkluZGV4LCBTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIHVwZGF0ZShjb2x1bW5JbmRleCwgdmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiB1cGRhdGVTaG9ydChpbnQgY29sdW1uSW5kZXgsIHNob3J0IHZhbHVlKSB7Ci0gICAgICAgIHJldHVybiB1cGRhdGUoY29sdW1uSW5kZXgsIFNob3J0LnZhbHVlT2YodmFsdWUpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAaGlkZQotICAgICAqIEBkZXByZWNhdGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gdXBkYXRlSW50KGludCBjb2x1bW5JbmRleCwgaW50IHZhbHVlKSB7Ci0gICAgICAgIHJldHVybiB1cGRhdGUoY29sdW1uSW5kZXgsIEludGVnZXIudmFsdWVPZih2YWx1ZSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiB1cGRhdGVMb25nKGludCBjb2x1bW5JbmRleCwgbG9uZyB2YWx1ZSkgewotICAgICAgICByZXR1cm4gdXBkYXRlKGNvbHVtbkluZGV4LCBMb25nLnZhbHVlT2YodmFsdWUpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAaGlkZQotICAgICAqIEBkZXByZWNhdGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gdXBkYXRlRmxvYXQoaW50IGNvbHVtbkluZGV4LCBmbG9hdCB2YWx1ZSkgewotICAgICAgICByZXR1cm4gdXBkYXRlKGNvbHVtbkluZGV4LCBGbG9hdC52YWx1ZU9mKHZhbHVlKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHVwZGF0ZURvdWJsZShpbnQgY29sdW1uSW5kZXgsIGRvdWJsZSB2YWx1ZSkgewotICAgICAgICByZXR1cm4gdXBkYXRlKGNvbHVtbkluZGV4LCBEb3VibGUudmFsdWVPZih2YWx1ZSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiB1cGRhdGVUb051bGwoaW50IGNvbHVtbkluZGV4KSB7Ci0gICAgICAgIHJldHVybiB1cGRhdGUoY29sdW1uSW5kZXgsIG51bGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiB1cGRhdGUoaW50IGNvbHVtbkluZGV4LCBPYmplY3Qgb2JqKSB7Ci0gICAgICAgIGlmICghc3VwcG9ydHNVcGRhdGVzKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIExvbmcudmFsdWVPZigpIHJldHVybnMgbnVsbCBzb21ldGltZXMhCi0vLyAgICAgICAgTG9uZyByb3dpZCA9IExvbmcudmFsdWVPZihnZXRMb25nKG1Sb3dJZENvbHVtbkluZGV4KSk7Ci0gICAgICAgIExvbmcgcm93aWQgPSBuZXcgTG9uZyhnZXRMb25nKG1Sb3dJZENvbHVtbkluZGV4KSk7Ci0gICAgICAgIGlmIChyb3dpZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJudWxsIHJvd2lkLiBtUm93SWRDb2x1bW5JbmRleCA9ICIgKyBtUm93SWRDb2x1bW5JbmRleCk7Ci0gICAgICAgIH0KLQotICAgICAgICBzeW5jaHJvbml6ZWQobVVwZGF0ZWRSb3dzKSB7Ci0gICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHJvdyA9IG1VcGRhdGVkUm93cy5nZXQocm93aWQpOwotICAgICAgICAgICAgaWYgKHJvdyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcm93ID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7Ci0gICAgICAgICAgICAgICAgbVVwZGF0ZWRSb3dzLnB1dChyb3dpZCwgcm93KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJvdy5wdXQoZ2V0Q29sdW1uTmFtZXMoKVtjb2x1bW5JbmRleF0sIG9iaik7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZXJlIGFyZSBwZW5kaW5nIHVwZGF0ZXMgdGhhdCBoYXZlIG5vdCB5ZXQgYmVlbiBjb21taXR0ZWQuCi0gICAgICogCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGVyZSBhcmUgcGVuZGluZyB1cGRhdGVzIHRoYXQgaGF2ZSBub3QgeWV0IGJlZW4gY29tbWl0dGVkLgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNVcGRhdGVzKCkgewotICAgICAgICBzeW5jaHJvbml6ZWQobVVwZGF0ZWRSb3dzKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVVwZGF0ZWRSb3dzLnNpemUoKSA+IDA7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAaGlkZQotICAgICAqIEBkZXByZWNhdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWJvcnRVcGRhdGVzKCkgewotICAgICAgICBzeW5jaHJvbml6ZWQobVVwZGF0ZWRSb3dzKSB7Ci0gICAgICAgICAgICBtVXBkYXRlZFJvd3MuY2xlYXIoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBjb21taXRVcGRhdGVzKCkgewotICAgICAgICByZXR1cm4gY29tbWl0VXBkYXRlcyhudWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAaGlkZQotICAgICAqIEBkZXByZWNhdGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNVcGRhdGVzKCkgewotICAgICAgICByZXR1cm4gbVJvd0lkQ29sdW1uSW5kZXggIT0gLTE7Ci0gICAgfQotCiAgICAgcHVibGljIHZvaWQgcmVnaXN0ZXJDb250ZW50T2JzZXJ2ZXIoQ29udGVudE9ic2VydmVyIG9ic2VydmVyKSB7CiAgICAgICAgIG1Db250ZW50T2JzZXJ2YWJsZS5yZWdpc3Rlck9ic2VydmVyKG9ic2VydmVyKTsKICAgICB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9BYnN0cmFjdFdpbmRvd2VkQ3Vyc29yLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9BYnN0cmFjdFdpbmRvd2VkQ3Vyc29yLmphdmEKaW5kZXggMjdhMDJlMi4uZTQ3ZDljZSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvQWJzdHJhY3RXaW5kb3dlZEN1cnNvci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0Fic3RyYWN0V2luZG93ZWRDdXJzb3IuamF2YQpAQCAtMTQ5LDYzICsxNDksMzYgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIHJldHVybiBtV2luZG93LmlzTnVsbChtUG9zLCBjb2x1bW5JbmRleCk7CisgICAgICAgIHJldHVybiBtV2luZG93LmdldFR5cGUobVBvcywgY29sdW1uSW5kZXgpID09IEN1cnNvci5GSUVMRF9UWVBFX05VTEw7CiAgICAgfQogCi0gICAgcHVibGljIGJvb2xlYW4gaXNCbG9iKGludCBjb2x1bW5JbmRleCkKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0Jsb2IoaW50IGNvbHVtbkluZGV4KSB7CisgICAgICAgIHJldHVybiBnZXRUeXBlKGNvbHVtbkluZGV4KSA9PSBDdXJzb3IuRklFTERfVFlQRV9CTE9COworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzU3RyaW5nKGludCBjb2x1bW5JbmRleCkgeworICAgICAgICByZXR1cm4gZ2V0VHlwZShjb2x1bW5JbmRleCkgPT0gQ3Vyc29yLkZJRUxEX1RZUEVfU1RSSU5HOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzTG9uZyhpbnQgY29sdW1uSW5kZXgpIHsKKyAgICAgICAgcmV0dXJuIGdldFR5cGUoY29sdW1uSW5kZXgpID09IEN1cnNvci5GSUVMRF9UWVBFX0lOVEVHRVI7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNGbG9hdChpbnQgY29sdW1uSW5kZXgpIHsKKyAgICAgICAgcmV0dXJuIGdldFR5cGUoY29sdW1uSW5kZXgpID09IEN1cnNvci5GSUVMRF9UWVBFX0ZMT0FUOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgZ2V0VHlwZShpbnQgY29sdW1uSW5kZXgpCiAgICAgewogICAgICAgICBjaGVja1Bvc2l0aW9uKCk7Ci0KICAgICAgICAgc3luY2hyb25pemVkKG1VcGRhdGVkUm93cykgewogICAgICAgICAgICAgaWYgKGlzRmllbGRVcGRhdGVkKGNvbHVtbkluZGV4KSkgewotICAgICAgICAgICAgICAgIE9iamVjdCBvYmplY3QgPSBnZXRVcGRhdGVkRmllbGQoY29sdW1uSW5kZXgpOwotICAgICAgICAgICAgICAgIHJldHVybiBvYmplY3QgPT0gbnVsbCB8fCBvYmplY3QgaW5zdGFuY2VvZiBieXRlW107CisgICAgICAgICAgICAgICAgcmV0dXJuIERhdGFiYXNlVXRpbHMuZ2V0VHlwZU9mT2JqZWN0KGdldFVwZGF0ZWRGaWVsZChjb2x1bW5JbmRleCkpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgcmV0dXJuIG1XaW5kb3cuaXNCbG9iKG1Qb3MsIGNvbHVtbkluZGV4KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1N0cmluZyhpbnQgY29sdW1uSW5kZXgpCi0gICAgewotICAgICAgICBjaGVja1Bvc2l0aW9uKCk7Ci0KLSAgICAgICAgc3luY2hyb25pemVkKG1VcGRhdGVkUm93cykgewotICAgICAgICAgICAgaWYgKGlzRmllbGRVcGRhdGVkKGNvbHVtbkluZGV4KSkgewotICAgICAgICAgICAgICAgIE9iamVjdCBvYmplY3QgPSBnZXRVcGRhdGVkRmllbGQoY29sdW1uSW5kZXgpOwotICAgICAgICAgICAgICAgIHJldHVybiBvYmplY3QgPT0gbnVsbCB8fCBvYmplY3QgaW5zdGFuY2VvZiBTdHJpbmc7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbVdpbmRvdy5pc1N0cmluZyhtUG9zLCBjb2x1bW5JbmRleCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNMb25nKGludCBjb2x1bW5JbmRleCkKLSAgICB7Ci0gICAgICAgIGNoZWNrUG9zaXRpb24oKTsKLQotICAgICAgICBzeW5jaHJvbml6ZWQobVVwZGF0ZWRSb3dzKSB7Ci0gICAgICAgICAgICBpZiAoaXNGaWVsZFVwZGF0ZWQoY29sdW1uSW5kZXgpKSB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IG9iamVjdCA9IGdldFVwZGF0ZWRGaWVsZChjb2x1bW5JbmRleCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG9iamVjdCAhPSBudWxsICYmIChvYmplY3QgaW5zdGFuY2VvZiBJbnRlZ2VyIHx8IG9iamVjdCBpbnN0YW5jZW9mIExvbmcpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG1XaW5kb3cuaXNMb25nKG1Qb3MsIGNvbHVtbkluZGV4KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0Zsb2F0KGludCBjb2x1bW5JbmRleCkKLSAgICB7Ci0gICAgICAgIGNoZWNrUG9zaXRpb24oKTsKLQotICAgICAgICBzeW5jaHJvbml6ZWQobVVwZGF0ZWRSb3dzKSB7Ci0gICAgICAgICAgICBpZiAoaXNGaWVsZFVwZGF0ZWQoY29sdW1uSW5kZXgpKSB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IG9iamVjdCA9IGdldFVwZGF0ZWRGaWVsZChjb2x1bW5JbmRleCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG9iamVjdCAhPSBudWxsICYmIChvYmplY3QgaW5zdGFuY2VvZiBGbG9hdCB8fCBvYmplY3QgaW5zdGFuY2VvZiBEb3VibGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG1XaW5kb3cuaXNGbG9hdChtUG9zLCBjb2x1bW5JbmRleCk7CisgICAgICAgIHJldHVybiBtV2luZG93LmdldFR5cGUobVBvcywgY29sdW1uSW5kZXgpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvQnVsa0N1cnNvck5hdGl2ZS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvQnVsa0N1cnNvck5hdGl2ZS5qYXZhCmluZGV4IGJhYTk0ZDguLmZhNjJkNjkgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0J1bGtDdXJzb3JOYXRpdmUuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9CdWxrQ3Vyc29yTmF0aXZlLmphdmEKQEAgLTE3LDEzICsxNywxMCBAQAogcGFja2FnZSBhbmRyb2lkLmRhdGFiYXNlOwogCiBpbXBvcnQgYW5kcm9pZC5vcy5CaW5kZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOwogaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsOwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKIAogLyoqCiAgKiBOYXRpdmUgaW1wbGVtZW50YXRpb24gb2YgdGhlIGJ1bGsgY3Vyc29yLiBUaGlzIGlzIG9ubHkgZm9yIHVzZSBpbiBpbXBsZW1lbnRpbmcKQEAgLTEyMCwyNiArMTE3LDYgQEAKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgY2FzZSBVUERBVEVfUk9XU19UUkFOU0FDVElPTjogewotICAgICAgICAgICAgICAgICAgICBkYXRhLmVuZm9yY2VJbnRlcmZhY2UoSUJ1bGtDdXJzb3IuZGVzY3JpcHRvcik7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFRPRE8gLSB3aGF0IENsYXNzTG9hZGVyIHNob3VsZCBiZSBwYXNzZWQgdG8gcmVhZEhhc2hNYXA/Ci0gICAgICAgICAgICAgICAgICAgIC8vIFRPRE8gLSBzd2l0Y2ggdG8gQnVuZGxlCi0gICAgICAgICAgICAgICAgICAgIEhhc2hNYXA8TG9uZywgTWFwPFN0cmluZywgT2JqZWN0Pj4gdmFsdWVzID0gZGF0YS5yZWFkSGFzaE1hcChudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiByZXN1bHQgPSB1cGRhdGVSb3dzKHZhbHVlcyk7Ci0gICAgICAgICAgICAgICAgICAgIHJlcGx5LndyaXRlTm9FeGNlcHRpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgcmVwbHkud3JpdGVJbnQoKHJlc3VsdCA9PSB0cnVlID8gMSA6IDApKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgY2FzZSBERUxFVEVfUk9XX1RSQU5TQUNUSU9OOiB7Ci0gICAgICAgICAgICAgICAgICAgIGRhdGEuZW5mb3JjZUludGVyZmFjZShJQnVsa0N1cnNvci5kZXNjcmlwdG9yKTsKLSAgICAgICAgICAgICAgICAgICAgaW50IHBvc2l0aW9uID0gZGF0YS5yZWFkSW50KCk7Ci0gICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gZGVsZXRlUm93KHBvc2l0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgcmVwbHkud3JpdGVOb0V4Y2VwdGlvbigpOwotICAgICAgICAgICAgICAgICAgICByZXBseS53cml0ZUludCgocmVzdWx0ID09IHRydWUgPyAxIDogMCkpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KICAgICAgICAgICAgICAgICBjYXNlIE9OX01PVkVfVFJBTlNBQ1RJT046IHsKICAgICAgICAgICAgICAgICAgICAgZGF0YS5lbmZvcmNlSW50ZXJmYWNlKElCdWxrQ3Vyc29yLmRlc2NyaXB0b3IpOwogICAgICAgICAgICAgICAgICAgICBpbnQgcG9zaXRpb24gPSBkYXRhLnJlYWRJbnQoKTsKQEAgLTM0Myw0OCArMzIwLDYgQEAKICAgICAgICAgcmV0dXJuIGNvdW50OwogICAgIH0KIAotICAgIHB1YmxpYyBib29sZWFuIHVwZGF0ZVJvd3MoTWFwIHZhbHVlcykgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgUGFyY2VsIGRhdGEgPSBQYXJjZWwub2J0YWluKCk7Ci0gICAgICAgIFBhcmNlbCByZXBseSA9IFBhcmNlbC5vYnRhaW4oKTsKLQotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUJ1bGtDdXJzb3IuZGVzY3JpcHRvcik7Ci0KLSAgICAgICAgZGF0YS53cml0ZU1hcCh2YWx1ZXMpOwotCi0gICAgICAgIG1SZW1vdGUudHJhbnNhY3QoVVBEQVRFX1JPV1NfVFJBTlNBQ1RJT04sIGRhdGEsIHJlcGx5LCAwKTsKLQotICAgICAgICBEYXRhYmFzZVV0aWxzLnJlYWRFeGNlcHRpb25Gcm9tUGFyY2VsKHJlcGx5KTsKLSAgICAgICAgCi0gICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gKHJlcGx5LnJlYWRJbnQoKSA9PSAxID8gdHJ1ZSA6IGZhbHNlKTsKLQotICAgICAgICBkYXRhLnJlY3ljbGUoKTsKLSAgICAgICAgcmVwbHkucmVjeWNsZSgpOwotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gZGVsZXRlUm93KGludCBwb3NpdGlvbikgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgUGFyY2VsIGRhdGEgPSBQYXJjZWwub2J0YWluKCk7Ci0gICAgICAgIFBhcmNlbCByZXBseSA9IFBhcmNlbC5vYnRhaW4oKTsKLQotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUJ1bGtDdXJzb3IuZGVzY3JpcHRvcik7Ci0KLSAgICAgICAgZGF0YS53cml0ZUludChwb3NpdGlvbik7Ci0KLSAgICAgICAgbVJlbW90ZS50cmFuc2FjdChERUxFVEVfUk9XX1RSQU5TQUNUSU9OLCBkYXRhLCByZXBseSwgMCk7Ci0KLSAgICAgICAgRGF0YWJhc2VVdGlscy5yZWFkRXhjZXB0aW9uRnJvbVBhcmNlbChyZXBseSk7Ci0gICAgICAgIAotICAgICAgICBib29sZWFuIHJlc3VsdCA9IChyZXBseS5yZWFkSW50KCkgPT0gMSA/IHRydWUgOiBmYWxzZSk7Ci0KLSAgICAgICAgZGF0YS5yZWN5Y2xlKCk7Ci0gICAgICAgIHJlcGx5LnJlY3ljbGUoKTsKLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQogICAgIHB1YmxpYyBib29sZWFuIGdldFdhbnRzQWxsT25Nb3ZlQ2FsbHMoKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKICAgICAgICAgUGFyY2VsIGRhdGEgPSBQYXJjZWwub2J0YWluKCk7CiAgICAgICAgIFBhcmNlbCByZXBseSA9IFBhcmNlbC5vYnRhaW4oKTsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0J1bGtDdXJzb3JUb0N1cnNvckFkYXB0b3IuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0J1bGtDdXJzb3JUb0N1cnNvckFkYXB0b3IuamF2YQppbmRleCAxNDY5ZWEyLi4yY2IyYWVjIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9CdWxrQ3Vyc29yVG9DdXJzb3JBZGFwdG9yLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvQnVsa0N1cnNvclRvQ3Vyc29yQWRhcHRvci5qYXZhCkBAIC0xNiwxMiArMTYsMTAgQEAKIAogcGFja2FnZSBhbmRyb2lkLmRhdGFiYXNlOwogCi1pbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CiBpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIAotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KIC8qKgogICogQWRhcHRzIGFuIHtAbGluayBJQnVsa0N1cnNvcn0gdG8gYSB7QGxpbmsgQ3Vyc29yfSBmb3IgdXNlIGluIHRoZSBsb2NhbAogICogcHJvY2Vzcy4KQEAgLTE3NCwzOCArMTcyLDYgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIC8qKgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBkZWxldGVSb3coKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBib29sZWFuIHJlc3VsdCA9IG1CdWxrQ3Vyc29yLmRlbGV0ZVJvdyhtUG9zKTsKLSAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICAvLyBUaGUgd2luZG93IGNvbnRhaW5zIHRoZSBvbGQgdmFsdWUsIGRpc2NhcmQgaXQKLSAgICAgICAgICAgICAgICBtV2luZG93ID0gbnVsbDsKLSAgICAKLSAgICAgICAgICAgICAgICAvLyBGaXggdXAgdGhlIHBvc2l0aW9uCi0gICAgICAgICAgICAgICAgbUNvdW50ID0gbUJ1bGtDdXJzb3IuY291bnQoKTsKLSAgICAgICAgICAgICAgICBpZiAobVBvcyA8IG1Db3VudCkgewotICAgICAgICAgICAgICAgICAgICBpbnQgb2xkUG9zID0gbVBvczsKLSAgICAgICAgICAgICAgICAgICAgbVBvcyA9IC0xOwotICAgICAgICAgICAgICAgICAgICBtb3ZlVG9Qb3NpdGlvbihvbGRQb3MpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Qb3MgPSBtQ291bnQ7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gU2VuZCB0aGUgY2hhbmdlIG5vdGlmaWNhdGlvbgotICAgICAgICAgICAgICAgIG9uQ2hhbmdlKHRydWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICBMb2cuZShUQUcsICJVbmFibGUgdG8gZGVsZXRlIHJvdyBiZWNhdXNlIHRoZSByZW1vdGUgcHJvY2VzcyBpcyBkZWFkIik7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nW10gZ2V0Q29sdW1uTmFtZXMoKSB7CiAgICAgICAgIGlmIChtQ29sdW1ucyA9PSBudWxsKSB7CkBAIC0yMTksNDQgKzE4NSw2IEBACiAgICAgICAgIHJldHVybiBtQ29sdW1uczsKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBAaGlkZQotICAgICAqIEBkZXByZWNhdGVkCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gY29tbWl0VXBkYXRlcyhNYXA8PyBleHRlbmRzIExvbmcsCi0gICAgICAgICAgICA/IGV4dGVuZHMgTWFwPFN0cmluZyxPYmplY3Q+PiBhZGRpdGlvbmFsVmFsdWVzKSB7Ci0gICAgICAgIGlmICghc3VwcG9ydHNVcGRhdGVzKCkpIHsKLSAgICAgICAgICAgIExvZy5lKFRBRywgImNvbW1pdFVwZGF0ZXMgbm90IHN1cHBvcnRlZCBvbiB0aGlzIGN1cnNvciwgZGlkIHlvdSBpbmNsdWRlIHRoZSBfaWQgY29sdW1uPyIpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgc3luY2hyb25pemVkKG1VcGRhdGVkUm93cykgewotICAgICAgICAgICAgaWYgKGFkZGl0aW9uYWxWYWx1ZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1VcGRhdGVkUm93cy5wdXRBbGwoYWRkaXRpb25hbFZhbHVlcyk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtVXBkYXRlZFJvd3Muc2l6ZSgpIDw9IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiByZXN1bHQgPSBtQnVsa0N1cnNvci51cGRhdGVSb3dzKG1VcGRhdGVkUm93cyk7Ci0gICAgCi0gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSB0cnVlKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1VcGRhdGVkUm93cy5jbGVhcigpOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIFNlbmQgdGhlIGNoYW5nZSBub3RpZmljYXRpb24KLSAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2UodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJVbmFibGUgdG8gY29tbWl0IHVwZGF0ZXMgYmVjYXVzZSB0aGUgcmVtb3RlIHByb2Nlc3MgaXMgZGVhZCIpOwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBCdW5kbGUgZ2V0RXh0cmFzKCkgewogICAgICAgICB0cnkgewpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvQ3Vyc29yLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9DdXJzb3IuamF2YQppbmRleCA2NTM5MTU2Li5jMDNjNTg2IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9DdXJzb3IuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9DdXJzb3IuamF2YQpAQCAtMzAsNiArMzAsMjUgQEAKICAqIHRocmVhZHMgc2hvdWxkIHBlcmZvcm0gaXRzIG93biBzeW5jaHJvbml6YXRpb24gd2hlbiB1c2luZyB0aGUgQ3Vyc29yLgogICovCiBwdWJsaWMgaW50ZXJmYWNlIEN1cnNvciB7CisgICAgLyoKKyAgICAgKiBWYWx1ZXMgcmV0dXJuZWQgYnkge0BsaW5rICNnZXRUeXBlKGludCl9LgorICAgICAqIFRoZXNlIHNob3VsZCBiZSBjb25zaXN0ZW50IHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgdHlwZXMgZGVmaW5lZCBpbiBDdXJzb3JXaW5kb3cuaAorICAgICAqLworICAgIC8qKiBWYWx1ZSByZXR1cm5lZCBieSB7QGxpbmsgI2dldFR5cGUoaW50KX0gaWYgdGhlIHNwZWNpZmllZCBjb2x1bW4gaXMgbnVsbCAqLworICAgIHN0YXRpYyBmaW5hbCBpbnQgRklFTERfVFlQRV9OVUxMID0gMDsKKworICAgIC8qKiBWYWx1ZSByZXR1cm5lZCBieSB7QGxpbmsgI2dldFR5cGUoaW50KX0gaWYgdGhlIHNwZWNpZmllZCAgY29sdW1uIHR5cGUgaXMgaW50ZWdlciAqLworICAgIHN0YXRpYyBmaW5hbCBpbnQgRklFTERfVFlQRV9JTlRFR0VSID0gMTsKKworICAgIC8qKiBWYWx1ZSByZXR1cm5lZCBieSB7QGxpbmsgI2dldFR5cGUoaW50KX0gaWYgdGhlIHNwZWNpZmllZCBjb2x1bW4gdHlwZSBpcyBmbG9hdCAqLworICAgIHN0YXRpYyBmaW5hbCBpbnQgRklFTERfVFlQRV9GTE9BVCA9IDI7CisKKyAgICAvKiogVmFsdWUgcmV0dXJuZWQgYnkge0BsaW5rICNnZXRUeXBlKGludCl9IGlmIHRoZSBzcGVjaWZpZWQgY29sdW1uIHR5cGUgaXMgc3RyaW5nICovCisgICAgc3RhdGljIGZpbmFsIGludCBGSUVMRF9UWVBFX1NUUklORyA9IDM7CisKKyAgICAvKiogVmFsdWUgcmV0dXJuZWQgYnkge0BsaW5rICNnZXRUeXBlKGludCl9IGlmIHRoZSBzcGVjaWZpZWQgY29sdW1uIHR5cGUgaXMgYmxvYiAqLworICAgIHN0YXRpYyBmaW5hbCBpbnQgRklFTERfVFlQRV9CTE9CID0gNDsKKwogICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIG51bWJlcnMgb2Ygcm93cyBpbiB0aGUgY3Vyc29yLgogICAgICAqCkBAIC0xNDYsMjIgKzE2NSw2IEBACiAgICAgYm9vbGVhbiBpc0FmdGVyTGFzdCgpOwogCiAgICAgLyoqCi0gICAgICogUmVtb3ZlcyB0aGUgcm93IGF0IHRoZSBjdXJyZW50IGN1cnNvciBwb3NpdGlvbiBmcm9tIHRoZSB1bmRlcmx5aW5nIGRhdGEKLSAgICAgKiBzdG9yZS4gQWZ0ZXIgdGhpcyBtZXRob2QgcmV0dXJucyB0aGUgY3Vyc29yIHdpbGwgYmUgcG9pbnRpbmcgdG8gdGhlIHJvdwotICAgICAqIGFmdGVyIHRoZSByb3cgdGhhdCBpcyBkZWxldGVkLiBUaGlzIGhhcyB0aGUgc2lkZSBlZmZlY3Qgb2YgZGVjcmVtZW50aW5nCi0gICAgICogdGhlIHJlc3VsdCBvZiBjb3VudCgpIGJ5IG9uZS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgcXVlcnkgbXVzdCBoYXZlIHRoZSByb3cgSUQgY29sdW1uIGluIGl0cyBzZWxlY3Rpb24sIG90aGVyd2lzZSB0aGlzCi0gICAgICogY2FsbCB3aWxsIGZhaWwuCi0gICAgICogCi0gICAgICogQGhpZGUKLSAgICAgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHJlY29yZCB3YXMgc3VjY2Vzc2Z1bGx5IGRlbGV0ZWQuCi0gICAgICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayBDb250ZW50UmVzb2x2ZXIjZGVsZXRlKFVyaSwgU3RyaW5nLCBTdHJpbmdbXSl9Ci0gICAgICovCi0gICAgQERlcHJlY2F0ZWQKLSAgICBib29sZWFuIGRlbGV0ZVJvdygpOwotCi0gICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgemVyby1iYXNlZCBpbmRleCBmb3IgdGhlIGdpdmVuIGNvbHVtbiBuYW1lLCBvciAtMSBpZiB0aGUgY29sdW1uIGRvZXNuJ3QgZXhpc3QuCiAgICAgICogSWYgeW91IGV4cGVjdCB0aGUgY29sdW1uIHRvIGV4aXN0IHVzZSB7QGxpbmsgI2dldENvbHVtbkluZGV4T3JUaHJvdyhTdHJpbmcpfSBpbnN0ZWFkLCB3aGljaAogICAgICAqIHdpbGwgbWFrZSB0aGUgZXJyb3IgbW9yZSBjbGVhci4KQEAgLTI5NSw2ICsyOTgsMjcgQEAKICAgICBkb3VibGUgZ2V0RG91YmxlKGludCBjb2x1bW5JbmRleCk7CiAKICAgICAvKioKKyAgICAgKiBSZXR1cm5zIGRhdGEgdHlwZSBvZiB0aGUgZ2l2ZW4gY29sdW1uJ3MgdmFsdWUuCisgICAgICogVGhlIHByZWZlcnJlZCB0eXBlIG9mIHRoZSBjb2x1bW4gaXMgcmV0dXJuZWQgYnV0IHRoZSBkYXRhIG1heSBiZSBjb252ZXJ0ZWQgdG8gb3RoZXIgdHlwZXMKKyAgICAgKiBhcyBkb2N1bWVudGVkIGluIHRoZSBnZXQtdHlwZSBtZXRob2RzIHN1Y2ggYXMge0BsaW5rICNnZXRJbnQoaW50KX0sIHtAbGluayAjZ2V0RmxvYXQoaW50KX0KKyAgICAgKiBldGMuCisgICAgICo8cD4KKyAgICAgKiBSZXR1cm5lZCBjb2x1bW4gdHlwZXMgYXJlCisgICAgICogPHVsPgorICAgICAqICAgPGxpPntAbGluayAjRklFTERfVFlQRV9OVUxMfTwvbGk+CisgICAgICogICA8bGk+e0BsaW5rICNGSUVMRF9UWVBFX0lOVEVHRVJ9PC9saT4KKyAgICAgKiAgIDxsaT57QGxpbmsgI0ZJRUxEX1RZUEVfRkxPQVR9PC9saT4KKyAgICAgKiAgIDxsaT57QGxpbmsgI0ZJRUxEX1RZUEVfU1RSSU5HfTwvbGk+CisgICAgICogICA8bGk+e0BsaW5rICNGSUVMRF9UWVBFX0JMT0J9PC9saT4KKyAgICAgKjwvdWw+CisgICAgICo8L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gY29sdW1uSW5kZXggdGhlIHplcm8tYmFzZWQgaW5kZXggb2YgdGhlIHRhcmdldCBjb2x1bW4uCisgICAgICogQHJldHVybiBjb2x1bW4gdmFsdWUgdHlwZQorICAgICAqLworICAgIGludCBnZXRUeXBlKGludCBjb2x1bW5JbmRleCk7CisKKyAgICAvKioKICAgICAgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSB2YWx1ZSBpbiB0aGUgaW5kaWNhdGVkIGNvbHVtbiBpcyBudWxsLgogICAgICAqCiAgICAgICogQHBhcmFtIGNvbHVtbkluZGV4IHRoZSB6ZXJvLWJhc2VkIGluZGV4IG9mIHRoZSB0YXJnZXQgY29sdW1uLgpAQCAtMzAzLDE4OCArMzI3LDYgQEAKICAgICBib29sZWFuIGlzTnVsbChpbnQgY29sdW1uSW5kZXgpOwogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgY3Vyc29yIHN1cHBvcnRzIHVwZGF0ZXMuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIGN1cnNvciBzdXBwb3J0cyB1cGRhdGVzLgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQgdXNlIHRoZSB7QGxpbmsgQ29udGVudFJlc29sdmVyfSB1cGRhdGUgbWV0aG9kcyBpbnN0ZWFkIG9mIHRoZSBDdXJzb3IKLSAgICAgKiB1cGRhdGUgbWV0aG9kcwotICAgICAqLwotICAgIEBEZXByZWNhdGVkCi0gICAgYm9vbGVhbiBzdXBwb3J0c1VwZGF0ZXMoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlcmUgYXJlIHBlbmRpbmcgdXBkYXRlcyB0aGF0IGhhdmUgbm90IHlldCBiZWVuIGNvbW1pdHRlZC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZXJlIGFyZSBwZW5kaW5nIHVwZGF0ZXMgdGhhdCBoYXZlIG5vdCB5ZXQgYmVlbiBjb21taXR0ZWQuCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZCB1c2UgdGhlIHtAbGluayBDb250ZW50UmVzb2x2ZXJ9IHVwZGF0ZSBtZXRob2RzIGluc3RlYWQgb2YgdGhlIEN1cnNvcgotICAgICAqIHVwZGF0ZSBtZXRob2RzCi0gICAgICovCi0gICAgQERlcHJlY2F0ZWQKLSAgICBib29sZWFuIGhhc1VwZGF0ZXMoKTsKLQotICAgIC8qKgotICAgICAqIFVwZGF0ZXMgdGhlIHZhbHVlIGZvciB0aGUgZ2l2ZW4gY29sdW1uIGluIHRoZSByb3cgdGhlIGN1cnNvciBpcwotICAgICAqIGN1cnJlbnRseSBwb2ludGluZyBhdC4gVXBkYXRlcyBhcmUgbm90IGNvbW1pdHRlZCB0byB0aGUgYmFja2luZyBzdG9yZQotICAgICAqIHVudGlsIHtAbGluayAjY29tbWl0VXBkYXRlcygpfSBpcyBjYWxsZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29sdW1uSW5kZXggdGhlIHplcm8tYmFzZWQgaW5kZXggb2YgdGhlIHRhcmdldCBjb2x1bW4uCi0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUuCi0gICAgICogQHJldHVybiB3aGV0aGVyIHRoZSBvcGVyYXRpb24gc3VjY2VlZGVkLgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQgdXNlIHRoZSB7QGxpbmsgQ29udGVudFJlc29sdmVyfSB1cGRhdGUgbWV0aG9kcyBpbnN0ZWFkIG9mIHRoZSBDdXJzb3IKLSAgICAgKiB1cGRhdGUgbWV0aG9kcwotICAgICAqLwotICAgIEBEZXByZWNhdGVkCi0gICAgYm9vbGVhbiB1cGRhdGVCbG9iKGludCBjb2x1bW5JbmRleCwgYnl0ZVtdIHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqIFVwZGF0ZXMgdGhlIHZhbHVlIGZvciB0aGUgZ2l2ZW4gY29sdW1uIGluIHRoZSByb3cgdGhlIGN1cnNvciBpcwotICAgICAqIGN1cnJlbnRseSBwb2ludGluZyBhdC4gVXBkYXRlcyBhcmUgbm90IGNvbW1pdHRlZCB0byB0aGUgYmFja2luZyBzdG9yZQotICAgICAqIHVudGlsIHtAbGluayAjY29tbWl0VXBkYXRlcygpfSBpcyBjYWxsZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29sdW1uSW5kZXggdGhlIHplcm8tYmFzZWQgaW5kZXggb2YgdGhlIHRhcmdldCBjb2x1bW4uCi0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUuCi0gICAgICogQHJldHVybiB3aGV0aGVyIHRoZSBvcGVyYXRpb24gc3VjY2VlZGVkLgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQgdXNlIHRoZSB7QGxpbmsgQ29udGVudFJlc29sdmVyfSB1cGRhdGUgbWV0aG9kcyBpbnN0ZWFkIG9mIHRoZSBDdXJzb3IKLSAgICAgKiB1cGRhdGUgbWV0aG9kcwotICAgICAqLwotICAgIEBEZXByZWNhdGVkCi0gICAgYm9vbGVhbiB1cGRhdGVTdHJpbmcoaW50IGNvbHVtbkluZGV4LCBTdHJpbmcgdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogVXBkYXRlcyB0aGUgdmFsdWUgZm9yIHRoZSBnaXZlbiBjb2x1bW4gaW4gdGhlIHJvdyB0aGUgY3Vyc29yIGlzCi0gICAgICogY3VycmVudGx5IHBvaW50aW5nIGF0LiBVcGRhdGVzIGFyZSBub3QgY29tbWl0dGVkIHRvIHRoZSBiYWNraW5nIHN0b3JlCi0gICAgICogdW50aWwge0BsaW5rICNjb21taXRVcGRhdGVzKCl9IGlzIGNhbGxlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb2x1bW5JbmRleCB0aGUgemVyby1iYXNlZCBpbmRleCBvZiB0aGUgdGFyZ2V0IGNvbHVtbi4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZS4KLSAgICAgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIG9wZXJhdGlvbiBzdWNjZWVkZWQuCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZCB1c2UgdGhlIHtAbGluayBDb250ZW50UmVzb2x2ZXJ9IHVwZGF0ZSBtZXRob2RzIGluc3RlYWQgb2YgdGhlIEN1cnNvcgotICAgICAqIHVwZGF0ZSBtZXRob2RzCi0gICAgICovCi0gICAgQERlcHJlY2F0ZWQKLSAgICBib29sZWFuIHVwZGF0ZVNob3J0KGludCBjb2x1bW5JbmRleCwgc2hvcnQgdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogVXBkYXRlcyB0aGUgdmFsdWUgZm9yIHRoZSBnaXZlbiBjb2x1bW4gaW4gdGhlIHJvdyB0aGUgY3Vyc29yIGlzCi0gICAgICogY3VycmVudGx5IHBvaW50aW5nIGF0LiBVcGRhdGVzIGFyZSBub3QgY29tbWl0dGVkIHRvIHRoZSBiYWNraW5nIHN0b3JlCi0gICAgICogdW50aWwge0BsaW5rICNjb21taXRVcGRhdGVzKCl9IGlzIGNhbGxlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb2x1bW5JbmRleCB0aGUgemVyby1iYXNlZCBpbmRleCBvZiB0aGUgdGFyZ2V0IGNvbHVtbi4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZS4KLSAgICAgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIG9wZXJhdGlvbiBzdWNjZWVkZWQuCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZCB1c2UgdGhlIHtAbGluayBDb250ZW50UmVzb2x2ZXJ9IHVwZGF0ZSBtZXRob2RzIGluc3RlYWQgb2YgdGhlIEN1cnNvcgotICAgICAqIHVwZGF0ZSBtZXRob2RzCi0gICAgICovCi0gICAgQERlcHJlY2F0ZWQKLSAgICBib29sZWFuIHVwZGF0ZUludChpbnQgY29sdW1uSW5kZXgsIGludCB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBVcGRhdGVzIHRoZSB2YWx1ZSBmb3IgdGhlIGdpdmVuIGNvbHVtbiBpbiB0aGUgcm93IHRoZSBjdXJzb3IgaXMKLSAgICAgKiBjdXJyZW50bHkgcG9pbnRpbmcgYXQuIFVwZGF0ZXMgYXJlIG5vdCBjb21taXR0ZWQgdG8gdGhlIGJhY2tpbmcgc3RvcmUKLSAgICAgKiB1bnRpbCB7QGxpbmsgI2NvbW1pdFVwZGF0ZXMoKX0gaXMgY2FsbGVkLgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbHVtbkluZGV4IHRoZSB6ZXJvLWJhc2VkIGluZGV4IG9mIHRoZSB0YXJnZXQgY29sdW1uLgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlLgotICAgICAqIEByZXR1cm4gd2hldGhlciB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRlZC4KLSAgICAgKiBAaGlkZQotICAgICAqIEBkZXByZWNhdGVkIHVzZSB0aGUge0BsaW5rIENvbnRlbnRSZXNvbHZlcn0gdXBkYXRlIG1ldGhvZHMgaW5zdGVhZCBvZiB0aGUgQ3Vyc29yCi0gICAgICogdXBkYXRlIG1ldGhvZHMKLSAgICAgKi8KLSAgICBARGVwcmVjYXRlZAotICAgIGJvb2xlYW4gdXBkYXRlTG9uZyhpbnQgY29sdW1uSW5kZXgsIGxvbmcgdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogVXBkYXRlcyB0aGUgdmFsdWUgZm9yIHRoZSBnaXZlbiBjb2x1bW4gaW4gdGhlIHJvdyB0aGUgY3Vyc29yIGlzCi0gICAgICogY3VycmVudGx5IHBvaW50aW5nIGF0LiBVcGRhdGVzIGFyZSBub3QgY29tbWl0dGVkIHRvIHRoZSBiYWNraW5nIHN0b3JlCi0gICAgICogdW50aWwge0BsaW5rICNjb21taXRVcGRhdGVzKCl9IGlzIGNhbGxlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb2x1bW5JbmRleCB0aGUgemVyby1iYXNlZCBpbmRleCBvZiB0aGUgdGFyZ2V0IGNvbHVtbi4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZS4KLSAgICAgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIG9wZXJhdGlvbiBzdWNjZWVkZWQuCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZCB1c2UgdGhlIHtAbGluayBDb250ZW50UmVzb2x2ZXJ9IHVwZGF0ZSBtZXRob2RzIGluc3RlYWQgb2YgdGhlIEN1cnNvcgotICAgICAqIHVwZGF0ZSBtZXRob2RzCi0gICAgICovCi0gICAgQERlcHJlY2F0ZWQKLSAgICBib29sZWFuIHVwZGF0ZUZsb2F0KGludCBjb2x1bW5JbmRleCwgZmxvYXQgdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogVXBkYXRlcyB0aGUgdmFsdWUgZm9yIHRoZSBnaXZlbiBjb2x1bW4gaW4gdGhlIHJvdyB0aGUgY3Vyc29yIGlzCi0gICAgICogY3VycmVudGx5IHBvaW50aW5nIGF0LiBVcGRhdGVzIGFyZSBub3QgY29tbWl0dGVkIHRvIHRoZSBiYWNraW5nIHN0b3JlCi0gICAgICogdW50aWwge0BsaW5rICNjb21taXRVcGRhdGVzKCl9IGlzIGNhbGxlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb2x1bW5JbmRleCB0aGUgemVyby1iYXNlZCBpbmRleCBvZiB0aGUgdGFyZ2V0IGNvbHVtbi4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZS4KLSAgICAgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIG9wZXJhdGlvbiBzdWNjZWVkZWQuCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZCB1c2UgdGhlIHtAbGluayBDb250ZW50UmVzb2x2ZXJ9IHVwZGF0ZSBtZXRob2RzIGluc3RlYWQgb2YgdGhlIEN1cnNvcgotICAgICAqIHVwZGF0ZSBtZXRob2RzCi0gICAgICovCi0gICAgQERlcHJlY2F0ZWQKLSAgICBib29sZWFuIHVwZGF0ZURvdWJsZShpbnQgY29sdW1uSW5kZXgsIGRvdWJsZSB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmVzIHRoZSB2YWx1ZSBmb3IgdGhlIGdpdmVuIGNvbHVtbiBpbiB0aGUgcm93IHRoZSBjdXJzb3IgaXMKLSAgICAgKiBjdXJyZW50bHkgcG9pbnRpbmcgYXQuIFVwZGF0ZXMgYXJlIG5vdCBjb21taXR0ZWQgdG8gdGhlIGJhY2tpbmcgc3RvcmUKLSAgICAgKiB1bnRpbCB7QGxpbmsgI2NvbW1pdFVwZGF0ZXMoKX0gaXMgY2FsbGVkLgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbHVtbkluZGV4IHRoZSB6ZXJvLWJhc2VkIGluZGV4IG9mIHRoZSB0YXJnZXQgY29sdW1uLgotICAgICAqIEByZXR1cm4gd2hldGhlciB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRlZC4KLSAgICAgKiBAaGlkZQotICAgICAqIEBkZXByZWNhdGVkIHVzZSB0aGUge0BsaW5rIENvbnRlbnRSZXNvbHZlcn0gdXBkYXRlIG1ldGhvZHMgaW5zdGVhZCBvZiB0aGUgQ3Vyc29yCi0gICAgICogdXBkYXRlIG1ldGhvZHMKLSAgICAgKi8KLSAgICBARGVwcmVjYXRlZAotICAgIGJvb2xlYW4gdXBkYXRlVG9OdWxsKGludCBjb2x1bW5JbmRleCk7Ci0KLSAgICAvKioKLSAgICAgKiBBdG9taWNhbGx5IGNvbW1pdHMgYWxsIHVwZGF0ZXMgdG8gdGhlIGJhY2tpbmcgc3RvcmUuIEFmdGVyIGNvbXBsZXRpb24sCi0gICAgICogdGhpcyBtZXRob2QgbGVhdmVzIHRoZSBkYXRhIGluIGFuIGluY29uc2lzdGVudCBzdGF0ZSBhbmQgeW91IHNob3VsZCBjYWxsCi0gICAgICoge0BsaW5rICNyZXF1ZXJ5fSBiZWZvcmUgcmVhZGluZyBkYXRhIGZyb20gdGhlIGN1cnNvciBhZ2Fpbi4KLSAgICAgKgotICAgICAqIEByZXR1cm4gd2hldGhlciB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRlZC4KLSAgICAgKiBAaGlkZQotICAgICAqIEBkZXByZWNhdGVkIHVzZSB0aGUge0BsaW5rIENvbnRlbnRSZXNvbHZlcn0gdXBkYXRlIG1ldGhvZHMgaW5zdGVhZCBvZiB0aGUgQ3Vyc29yCi0gICAgICogdXBkYXRlIG1ldGhvZHMKLSAgICAgKi8KLSAgICBARGVwcmVjYXRlZAotICAgIGJvb2xlYW4gY29tbWl0VXBkYXRlcygpOwotCi0gICAgLyoqCi0gICAgICogQXRvbWljYWxseSBjb21taXRzIGFsbCB1cGRhdGVzIHRvIHRoZSBiYWNraW5nIHN0b3JlLCBhcyB3ZWxsIGFzIHRoZQotICAgICAqIHVwZGF0ZXMgaW5jbHVkZWQgaW4gdmFsdWVzLiBBZnRlciBjb21wbGV0aW9uLAotICAgICAqIHRoaXMgbWV0aG9kIGxlYXZlcyB0aGUgZGF0YSBpbiBhbiBpbmNvbnNpc3RlbnQgc3RhdGUgYW5kIHlvdSBzaG91bGQgY2FsbAotICAgICAqIHtAbGluayAjcmVxdWVyeX0gYmVmb3JlIHJlYWRpbmcgZGF0YSBmcm9tIHRoZSBjdXJzb3IgYWdhaW4uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWVzIEEgbWFwIGZyb20gcm93IElEcyB0byBNYXBzIGFzc29jaWF0aW5nIGNvbHVtbiBuYW1lcyB3aXRoCi0gICAgICogICAgICAgICAgICAgICB1cGRhdGVkIHZhbHVlcy4gQSBudWxsIHZhbHVlIGluZGljYXRlcyB0aGUgZmllbGQgc2hvdWxkIGJlCi0gICAgICAgICAgICAgICAgICAgICByZW1vdmVkLgotICAgICAqIEByZXR1cm4gd2hldGhlciB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRlZC4KLSAgICAgKiBAaGlkZQotICAgICAqIEBkZXByZWNhdGVkIHVzZSB0aGUge0BsaW5rIENvbnRlbnRSZXNvbHZlcn0gdXBkYXRlIG1ldGhvZHMgaW5zdGVhZCBvZiB0aGUgQ3Vyc29yCi0gICAgICogdXBkYXRlIG1ldGhvZHMKLSAgICAgKi8KLSAgICBARGVwcmVjYXRlZAotICAgIGJvb2xlYW4gY29tbWl0VXBkYXRlcyhNYXA8PyBleHRlbmRzIExvbmcsCi0gICAgICAgICAgICA/IGV4dGVuZHMgTWFwPFN0cmluZyxPYmplY3Q+PiB2YWx1ZXMpOwotCi0gICAgLyoqCi0gICAgICogUmV2ZXJ0cyBhbGwgdXBkYXRlcyBtYWRlIHRvIHRoZSBjdXJzb3Igc2luY2UgdGhlIGxhc3QgY2FsbCB0bwotICAgICAqIGNvbW1pdFVwZGF0ZXMuCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZCB1c2UgdGhlIHtAbGluayBDb250ZW50UmVzb2x2ZXJ9IHVwZGF0ZSBtZXRob2RzIGluc3RlYWQgb2YgdGhlIEN1cnNvcgotICAgICAqIHVwZGF0ZSBtZXRob2RzCi0gICAgICovCi0gICAgQERlcHJlY2F0ZWQKLSAgICB2b2lkIGFib3J0VXBkYXRlcygpOwotCi0gICAgLyoqCiAgICAgICogRGVhY3RpdmF0ZXMgdGhlIEN1cnNvciwgbWFraW5nIGFsbCBjYWxscyBvbiBpdCBmYWlsIHVudGlsIHtAbGluayAjcmVxdWVyeX0gaXMgY2FsbGVkLgogICAgICAqIEluYWN0aXZlIEN1cnNvcnMgdXNlIGZld2VyIHJlc291cmNlcyB0aGFuIGFjdGl2ZSBDdXJzb3JzLgogICAgICAqIENhbGxpbmcge0BsaW5rICNyZXF1ZXJ5fSB3aWxsIG1ha2UgdGhlIGN1cnNvciBhY3RpdmUgYWdhaW4uCkBAIC00OTYsNiArMzM4LDEwIEBACiAgICAgICogY29udGVudHMuIFRoaXMgbWF5IGJlIGRvbmUgYXQgYW55IHRpbWUsIGluY2x1ZGluZyBhZnRlciBhIGNhbGwgdG8ge0BsaW5rCiAgICAgICogI2RlYWN0aXZhdGV9LgogICAgICAqCisgICAgICogU2luY2UgdGhpcyBtZXRob2QgY291bGQgZXhlY3V0ZSBhIHF1ZXJ5IG9uIHRoZSBkYXRhYmFzZSBhbmQgcG90ZW50aWFsbHkgdGFrZQorICAgICAqIGEgd2hpbGUsIGl0IGNvdWxkIGNhdXNlIEFOUiBpZiBpdCBpcyBjYWxsZWQgb24gTWFpbiAoVUkpIHRocmVhZC4KKyAgICAgKiBBIHdhcm5pbmcgaXMgcHJpbnRlZCBpZiB0aGlzIG1ldGhvZCBpcyBiZWluZyBleGVjdXRlZCBvbiBNYWluIHRocmVhZC4KKyAgICAgKgogICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcmVxdWVyeSBzdWNjZWVkZWQsIGZhbHNlIGlmIG5vdCwgaW4gd2hpY2ggY2FzZSB0aGUKICAgICAgKiAgICAgICAgIGN1cnNvciBiZWNvbWVzIGludmFsaWQuCiAgICAgICovCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9DdXJzb3JUb0J1bGtDdXJzb3JBZGFwdG9yLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9DdXJzb3JUb0J1bGtDdXJzb3JBZGFwdG9yLmphdmEKaW5kZXggNzQ4ZWI5OS4uOGJjN2RlMiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvQ3Vyc29yVG9CdWxrQ3Vyc29yQWRhcHRvci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0N1cnNvclRvQnVsa0N1cnNvckFkYXB0b3IuamF2YQpAQCAtMTYsMTYgKzE2LDEyIEBACiAKIHBhY2thZ2UgYW5kcm9pZC5kYXRhYmFzZTsKIAotaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZU1pc3VzZUV4Y2VwdGlvbjsKLWltcG9ydCBhbmRyb2lkLm9zLkJpbmRlcjsKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKIGltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CiBpbXBvcnQgYW5kcm9pZC51dGlsLkNvbmZpZzsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQogCiAvKioKICAqIFdyYXBzIGEgQnVsa0N1cnNvciBhcm91bmQgYW4gZXhpc3RpbmcgQ3Vyc29yIG1ha2luZyBpdCByZW1vdGFibGUuCkBAIC0zOCw3ICszNCw2IEBACiAgICAgcHJpdmF0ZSBmaW5hbCBDcm9zc1Byb2Nlc3NDdXJzb3IgbUN1cnNvcjsKICAgICBwcml2YXRlIEN1cnNvcldpbmRvdyBtV2luZG93OwogICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1Qcm92aWRlck5hbWU7Ci0gICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1SZWFkT25seTsKICAgICBwcml2YXRlIENvbnRlbnRPYnNlcnZlclByb3h5IG1PYnNlcnZlcjsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIENvbnRlbnRPYnNlcnZlclByb3h5IGV4dGVuZHMgQ29udGVudE9ic2VydmVyIApAQCAtOTgsNyArOTMsNiBAQAogICAgICAgICAgICAgICAgICAgICAiT25seSBDcm9zc1Byb2Nlc3NDdXJzb3IgY3Vyc29ycyBhcmUgc3VwcG9ydGVkIGFjcm9zcyBwcm9jZXNzIGZvciBub3ciLCBlKTsKICAgICAgICAgfQogICAgICAgICBtUHJvdmlkZXJOYW1lID0gcHJvdmlkZXJOYW1lOwotICAgICAgICBtUmVhZE9ubHkgPSAhYWxsb3dXcml0ZTsKIAogICAgICAgICBjcmVhdGVBbmRSZWdpc3Rlck9ic2VydmVyUHJveHkob2JzZXJ2ZXIpOwogICAgIH0KQEAgLTE5NywzMSArMTkxLDYgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHB1YmxpYyBib29sZWFuIHVwZGF0ZVJvd3MoTWFwPD8gZXh0ZW5kcyBMb25nLCA/IGV4dGVuZHMgTWFwPFN0cmluZywgT2JqZWN0Pj4gdmFsdWVzKSB7Ci0gICAgICAgIGlmIChtUmVhZE9ubHkpIHsKLSAgICAgICAgICAgIExvZy53KCJDb250ZW50UHJvdmlkZXIiLCAiUGVybWlzc2lvbiBEZW5pYWw6IG1vZGlmeWluZyAiCi0gICAgICAgICAgICAgICAgICAgICsgbVByb3ZpZGVyTmFtZQotICAgICAgICAgICAgICAgICAgICArICIgZnJvbSBwaWQ9IiArIEJpbmRlci5nZXRDYWxsaW5nUGlkKCkKLSAgICAgICAgICAgICAgICAgICAgKyAiLCB1aWQ9IiArIEJpbmRlci5nZXRDYWxsaW5nVWlkKCkpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtQ3Vyc29yLmNvbW1pdFVwZGF0ZXModmFsdWVzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBkZWxldGVSb3coaW50IHBvc2l0aW9uKSB7Ci0gICAgICAgIGlmIChtUmVhZE9ubHkpIHsKLSAgICAgICAgICAgIExvZy53KCJDb250ZW50UHJvdmlkZXIiLCAiUGVybWlzc2lvbiBEZW5pYWw6IG1vZGlmeWluZyAiCi0gICAgICAgICAgICAgICAgICAgICsgbVByb3ZpZGVyTmFtZQotICAgICAgICAgICAgICAgICAgICArICIgZnJvbSBwaWQ9IiArIEJpbmRlci5nZXRDYWxsaW5nUGlkKCkKLSAgICAgICAgICAgICAgICAgICAgKyAiLCB1aWQ9IiArIEJpbmRlci5nZXRDYWxsaW5nVWlkKCkpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtQ3Vyc29yLm1vdmVUb1Bvc2l0aW9uKHBvc2l0aW9uKSA9PSBmYWxzZSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtQ3Vyc29yLmRlbGV0ZVJvdygpOwotICAgIH0KLQogICAgIHB1YmxpYyBCdW5kbGUgZ2V0RXh0cmFzKCkgewogICAgICAgICByZXR1cm4gbUN1cnNvci5nZXRFeHRyYXMoKTsKICAgICB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9DdXJzb3JXaW5kb3cuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0N1cnNvcldpbmRvdy5qYXZhCmluZGV4IGM3NTY4MjUuLjU5OTQzMWYgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0N1cnNvcldpbmRvdy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0N1cnNvcldpbmRvdy5qYXZhCkBAIC0yMTcsMTggKzIxNywxMyBAQAogICAgICAqIEBwYXJhbSByb3cgdGhlIHJvdyB0byByZWFkIGZyb20sIHJvdyAtIGdldFN0YXJ0UG9zaXRpb24oKSBiZWluZyB0aGUgYWN0dWFsIHJvdyBpbiB0aGUgd2luZG93CiAgICAgICogQHBhcmFtIGNvbCB0aGUgY29sdW1uIHRvIHJlYWQgZnJvbQogICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIGdpdmVuIGZpZWxkIGlzIHtAY29kZSBOVUxMfQorICAgICAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgI2dldFR5cGUoaW50LCBpbnQpfSBpbnN0ZWFkCiAgICAgICovCisgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgYm9vbGVhbiBpc051bGwoaW50IHJvdywgaW50IGNvbCkgewotICAgICAgICBhY3F1aXJlUmVmZXJlbmNlKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gaXNOdWxsX25hdGl2ZShyb3cgLSBtU3RhcnRQb3MsIGNvbCk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICByZWxlYXNlUmVmZXJlbmNlKCk7Ci0gICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGdldFR5cGUocm93LCBjb2wpID09IEN1cnNvci5GSUVMRF9UWVBFX05VTEw7CiAgICAgfQogICAgIAotICAgIHByaXZhdGUgbmF0aXZlIGJvb2xlYW4gaXNOdWxsX25hdGl2ZShpbnQgcm93LCBpbnQgY29sKTsKLSAgICAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIGEgYnl0ZSBhcnJheSBmb3IgdGhlIGdpdmVuIGZpZWxkLgogICAgICAqCkBAIC0yNDgsMTkgKzI0Myw0MyBAQAogICAgIHByaXZhdGUgbmF0aXZlIGJ5dGVbXSBnZXRCbG9iX25hdGl2ZShpbnQgcm93LCBpbnQgY29sKTsKIAogICAgIC8qKgorICAgICAqIFJldHVybnMgZGF0YSB0eXBlIG9mIHRoZSBnaXZlbiBjb2x1bW4ncyB2YWx1ZS4KKyAgICAgKjxwPgorICAgICAqIFJldHVybmVkIGNvbHVtbiB0eXBlcyBhcmUKKyAgICAgKiA8dWw+CisgICAgICogICA8bGk+e0BsaW5rIEN1cnNvciNGSUVMRF9UWVBFX05VTEx9PC9saT4KKyAgICAgKiAgIDxsaT57QGxpbmsgQ3Vyc29yI0ZJRUxEX1RZUEVfSU5URUdFUn08L2xpPgorICAgICAqICAgPGxpPntAbGluayBDdXJzb3IjRklFTERfVFlQRV9GTE9BVH08L2xpPgorICAgICAqICAgPGxpPntAbGluayBDdXJzb3IjRklFTERfVFlQRV9TVFJJTkd9PC9saT4KKyAgICAgKiAgIDxsaT57QGxpbmsgQ3Vyc29yI0ZJRUxEX1RZUEVfQkxPQn08L2xpPgorICAgICAqPC91bD4KKyAgICAgKjwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSByb3cgdGhlIHJvdyB0byByZWFkIGZyb20sIHJvdyAtIGdldFN0YXJ0UG9zaXRpb24oKSBiZWluZyB0aGUgYWN0dWFsIHJvdyBpbiB0aGUgd2luZG93CisgICAgICogQHBhcmFtIGNvbCB0aGUgY29sdW1uIHRvIHJlYWQgZnJvbQorICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIHR5cGUKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFR5cGUoaW50IHJvdywgaW50IGNvbCkgeworICAgICAgICBhY3F1aXJlUmVmZXJlbmNlKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0VHlwZV9uYXRpdmUocm93IC0gbVN0YXJ0UG9zLCBjb2wpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgcmVsZWFzZVJlZmVyZW5jZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCiAgICAgICogQ2hlY2tzIGlmIGEgZmllbGQgY29udGFpbnMgZWl0aGVyIGEgYmxvYiBvciBpcyBudWxsLgogICAgICAqCiAgICAgICogQHBhcmFtIHJvdyB0aGUgcm93IHRvIHJlYWQgZnJvbSwgcm93IC0gZ2V0U3RhcnRQb3NpdGlvbigpIGJlaW5nIHRoZSBhY3R1YWwgcm93IGluIHRoZSB3aW5kb3cKICAgICAgKiBAcGFyYW0gY29sIHRoZSBjb2x1bW4gdG8gcmVhZCBmcm9tCiAgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgZ2l2ZW4gZmllbGQgaXMge0Bjb2RlIE5VTEx9IG9yIGEgYmxvYgorICAgICAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgI2dldFR5cGUoaW50LCBpbnQpfSBpbnN0ZWFkCiAgICAgICovCisgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgYm9vbGVhbiBpc0Jsb2IoaW50IHJvdywgaW50IGNvbCkgewotICAgICAgICBhY3F1aXJlUmVmZXJlbmNlKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gaXNCbG9iX25hdGl2ZShyb3cgLSBtU3RhcnRQb3MsIGNvbCk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICByZWxlYXNlUmVmZXJlbmNlKCk7Ci0gICAgICAgIH0KKyAgICAgICAgaW50IHR5cGUgPSBnZXRUeXBlKHJvdywgY29sKTsKKyAgICAgICAgcmV0dXJuIHR5cGUgPT0gQ3Vyc29yLkZJRUxEX1RZUEVfQkxPQiB8fCB0eXBlID09IEN1cnNvci5GSUVMRF9UWVBFX05VTEw7CiAgICAgfQogCiAgICAgLyoqCkBAIC0yNjksMTQgKzI4OCwxMSBAQAogICAgICAqIEBwYXJhbSByb3cgdGhlIHJvdyB0byByZWFkIGZyb20sIHJvdyAtIGdldFN0YXJ0UG9zaXRpb24oKSBiZWluZyB0aGUgYWN0dWFsIHJvdyBpbiB0aGUgd2luZG93CiAgICAgICogQHBhcmFtIGNvbCB0aGUgY29sdW1uIHRvIHJlYWQgZnJvbQogICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIGdpdmVuIGZpZWxkIGlzIGEgbG9uZworICAgICAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgI2dldFR5cGUoaW50LCBpbnQpfSBpbnN0ZWFkCiAgICAgICovCisgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgYm9vbGVhbiBpc0xvbmcoaW50IHJvdywgaW50IGNvbCkgewotICAgICAgICBhY3F1aXJlUmVmZXJlbmNlKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gaXNJbnRlZ2VyX25hdGl2ZShyb3cgLSBtU3RhcnRQb3MsIGNvbCk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICByZWxlYXNlUmVmZXJlbmNlKCk7Ci0gICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGdldFR5cGUocm93LCBjb2wpID09IEN1cnNvci5GSUVMRF9UWVBFX0lOVEVHRVI7CiAgICAgfQogCiAgICAgLyoqCkBAIC0yODUsMTQgKzMwMSwxMSBAQAogICAgICAqIEBwYXJhbSByb3cgdGhlIHJvdyB0byByZWFkIGZyb20sIHJvdyAtIGdldFN0YXJ0UG9zaXRpb24oKSBiZWluZyB0aGUgYWN0dWFsIHJvdyBpbiB0aGUgd2luZG93CiAgICAgICogQHBhcmFtIGNvbCB0aGUgY29sdW1uIHRvIHJlYWQgZnJvbQogICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIGdpdmVuIGZpZWxkIGlzIGEgZmxvYXQKKyAgICAgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rICNnZXRUeXBlKGludCwgaW50KX0gaW5zdGVhZAogICAgICAqLworICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIGJvb2xlYW4gaXNGbG9hdChpbnQgcm93LCBpbnQgY29sKSB7Ci0gICAgICAgIGFjcXVpcmVSZWZlcmVuY2UoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBpc0Zsb2F0X25hdGl2ZShyb3cgLSBtU3RhcnRQb3MsIGNvbCk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICByZWxlYXNlUmVmZXJlbmNlKCk7Ci0gICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGdldFR5cGUocm93LCBjb2wpID09IEN1cnNvci5GSUVMRF9UWVBFX0ZMT0FUOwogICAgIH0KIAogICAgIC8qKgpAQCAtMzAxLDIwICszMTQsMTUgQEAKICAgICAgKiBAcGFyYW0gcm93IHRoZSByb3cgdG8gcmVhZCBmcm9tLCByb3cgLSBnZXRTdGFydFBvc2l0aW9uKCkgYmVpbmcgdGhlIGFjdHVhbCByb3cgaW4gdGhlIHdpbmRvdwogICAgICAqIEBwYXJhbSBjb2wgdGhlIGNvbHVtbiB0byByZWFkIGZyb20KICAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiBnaXZlbiBmaWVsZCBpcyB7QGNvZGUgTlVMTH0gb3IgYSBTdHJpbmcKKyAgICAgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rICNnZXRUeXBlKGludCwgaW50KX0gaW5zdGVhZAogICAgICAqLworICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIGJvb2xlYW4gaXNTdHJpbmcoaW50IHJvdywgaW50IGNvbCkgewotICAgICAgICBhY3F1aXJlUmVmZXJlbmNlKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gaXNTdHJpbmdfbmF0aXZlKHJvdyAtIG1TdGFydFBvcywgY29sKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHJlbGVhc2VSZWZlcmVuY2UoKTsKLSAgICAgICAgfQorICAgICAgICBpbnQgdHlwZSA9IGdldFR5cGUocm93LCBjb2wpOworICAgICAgICByZXR1cm4gdHlwZSA9PSBDdXJzb3IuRklFTERfVFlQRV9TVFJJTkcgfHwgdHlwZSA9PSBDdXJzb3IuRklFTERfVFlQRV9OVUxMOwogICAgIH0KIAotICAgIHByaXZhdGUgbmF0aXZlIGJvb2xlYW4gaXNCbG9iX25hdGl2ZShpbnQgcm93LCBpbnQgY29sKTsKLSAgICBwcml2YXRlIG5hdGl2ZSBib29sZWFuIGlzU3RyaW5nX25hdGl2ZShpbnQgcm93LCBpbnQgY29sKTsKLSAgICBwcml2YXRlIG5hdGl2ZSBib29sZWFuIGlzSW50ZWdlcl9uYXRpdmUoaW50IHJvdywgaW50IGNvbCk7Ci0gICAgcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiBpc0Zsb2F0X25hdGl2ZShpbnQgcm93LCBpbnQgY29sKTsKKyAgICBwcml2YXRlIG5hdGl2ZSBpbnQgZ2V0VHlwZV9uYXRpdmUoaW50IHJvdywgaW50IGNvbCk7CiAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIGEgU3RyaW5nIGZvciB0aGUgZ2l2ZW4gZmllbGQuCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9DdXJzb3JXcmFwcGVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9DdXJzb3JXcmFwcGVyLmphdmEKaW5kZXggZjBhYTdkNy4uM2MzYmQ0MyAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvQ3Vyc29yV3JhcHBlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0N1cnNvcldyYXBwZXIuamF2YQpAQCAtMTcsMjggKzE3LDI2IEBACiBwYWNrYWdlIGFuZHJvaWQuZGF0YWJhc2U7CiAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyOwotaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ2hhckFycmF5QnVmZmVyOwogaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKIAotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KIC8qKgotICogV3JhcHBlciBjbGFzcyBmb3IgQ3Vyc29yIHRoYXQgZGVsZWdhdGVzIGFsbCBjYWxscyB0byB0aGUgYWN0dWFsIGN1cnNvciBvYmplY3QKKyAqIFdyYXBwZXIgY2xhc3MgZm9yIEN1cnNvciB0aGF0IGRlbGVnYXRlcyBhbGwgY2FsbHMgdG8gdGhlIGFjdHVhbCBjdXJzb3Igb2JqZWN0LiAgVGhlIHByaW1hcnkKKyAqIHVzZSBmb3IgdGhpcyBjbGFzcyBpcyB0byBleHRlbmQgYSBjdXJzb3Igd2hpbGUgb3ZlcnJpZGluZyBvbmx5IGEgc3Vic2V0IG9mIGl0cyBtZXRob2RzLgogICovCi0KIHB1YmxpYyBjbGFzcyBDdXJzb3JXcmFwcGVyIGltcGxlbWVudHMgQ3Vyc29yIHsKIAorICAgIHByaXZhdGUgZmluYWwgQ3Vyc29yIG1DdXJzb3I7CisKICAgICBwdWJsaWMgQ3Vyc29yV3JhcHBlcihDdXJzb3IgY3Vyc29yKSB7CiAgICAgICAgIG1DdXJzb3IgPSBjdXJzb3I7CiAgICAgfQotICAgIAorCiAgICAgLyoqCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZAorICAgICAqIEByZXR1cm4gdGhlIHdyYXBwZWQgY3Vyc29yCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgYWJvcnRVcGRhdGVzKCkgewotICAgICAgICBtQ3Vyc29yLmFib3J0VXBkYXRlcygpOworICAgIHB1YmxpYyBDdXJzb3IgZ2V0V3JhcHBlZEN1cnNvcigpIHsKKyAgICAgICAgcmV0dXJuIG1DdXJzb3I7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgY2xvc2UoKSB7CkBAIC00OSwyMyArNDcsNiBAQAogICAgICAgICByZXR1cm4gbUN1cnNvci5pc0Nsb3NlZCgpOwogICAgIH0KIAotICAgIC8qKgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBjb21taXRVcGRhdGVzKCkgewotICAgICAgICByZXR1cm4gbUN1cnNvci5jb21taXRVcGRhdGVzKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGNvbW1pdFVwZGF0ZXMoCi0gICAgICAgICAgICBNYXA8PyBleHRlbmRzIExvbmcsID8gZXh0ZW5kcyBNYXA8U3RyaW5nLCBPYmplY3Q+PiB2YWx1ZXMpIHsKLSAgICAgICAgcmV0dXJuIG1DdXJzb3IuY29tbWl0VXBkYXRlcyh2YWx1ZXMpOwotICAgIH0KLQogICAgIHB1YmxpYyBpbnQgZ2V0Q291bnQoKSB7CiAgICAgICAgIHJldHVybiBtQ3Vyc29yLmdldENvdW50KCk7CiAgICAgfQpAQCAtNzQsMTQgKzU1LDYgQEAKICAgICAgICAgbUN1cnNvci5kZWFjdGl2YXRlKCk7CiAgICAgfQogCi0gICAgLyoqCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGRlbGV0ZVJvdygpIHsKLSAgICAgICAgcmV0dXJuIG1DdXJzb3IuZGVsZXRlUm93KCk7Ci0gICAgfQotCiAgICAgcHVibGljIGJvb2xlYW4gbW92ZVRvRmlyc3QoKSB7CiAgICAgICAgIHJldHVybiBtQ3Vyc29yLm1vdmVUb0ZpcnN0KCk7CiAgICAgfQpAQCAtMTQ3LDE0ICsxMjAsNiBAQAogICAgICAgICByZXR1cm4gbUN1cnNvci5nZXRXYW50c0FsbE9uTW92ZUNhbGxzKCk7CiAgICAgfQogCi0gICAgLyoqCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGhhc1VwZGF0ZXMoKSB7Ci0gICAgICAgIHJldHVybiBtQ3Vyc29yLmhhc1VwZGF0ZXMoKTsKLSAgICB9Ci0KICAgICBwdWJsaWMgYm9vbGVhbiBpc0FmdGVyTGFzdCgpIHsKICAgICAgICAgcmV0dXJuIG1DdXJzb3IuaXNBZnRlckxhc3QoKTsKICAgICB9CkBAIC0xNzEsNiArMTM2LDEwIEBACiAgICAgICAgIHJldHVybiBtQ3Vyc29yLmlzTGFzdCgpOwogICAgIH0KIAorICAgIHB1YmxpYyBpbnQgZ2V0VHlwZShpbnQgY29sdW1uSW5kZXgpIHsKKyAgICAgICAgcmV0dXJuIG1DdXJzb3IuZ2V0VHlwZShjb2x1bW5JbmRleCk7CisgICAgfQorCiAgICAgcHVibGljIGJvb2xlYW4gaXNOdWxsKGludCBjb2x1bW5JbmRleCkgewogICAgICAgICByZXR1cm4gbUN1cnNvci5pc051bGwoY29sdW1uSW5kZXgpOwogICAgIH0KQEAgLTIxOSwxNCArMTg4LDYgQEAKICAgICAgICAgbUN1cnNvci5zZXROb3RpZmljYXRpb25VcmkoY3IsIHVyaSk7ICAgICAgICAKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBAaGlkZQotICAgICAqIEBkZXByZWNhdGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNVcGRhdGVzKCkgewotICAgICAgICByZXR1cm4gbUN1cnNvci5zdXBwb3J0c1VwZGF0ZXMoKTsKLSAgICB9Ci0KICAgICBwdWJsaWMgdm9pZCB1bnJlZ2lzdGVyQ29udGVudE9ic2VydmVyKENvbnRlbnRPYnNlcnZlciBvYnNlcnZlcikgewogICAgICAgICBtQ3Vyc29yLnVucmVnaXN0ZXJDb250ZW50T2JzZXJ2ZXIob2JzZXJ2ZXIpOyAgICAgICAgCiAgICAgfQpAQCAtMjM0LDcyICsxOTUsNSBAQAogICAgIHB1YmxpYyB2b2lkIHVucmVnaXN0ZXJEYXRhU2V0T2JzZXJ2ZXIoRGF0YVNldE9ic2VydmVyIG9ic2VydmVyKSB7CiAgICAgICAgIG1DdXJzb3IudW5yZWdpc3RlckRhdGFTZXRPYnNlcnZlcihvYnNlcnZlcik7CiAgICAgfQotCi0gICAgLyoqCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHVwZGF0ZURvdWJsZShpbnQgY29sdW1uSW5kZXgsIGRvdWJsZSB2YWx1ZSkgewotICAgICAgICByZXR1cm4gbUN1cnNvci51cGRhdGVEb3VibGUoY29sdW1uSW5kZXgsIHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAaGlkZQotICAgICAqIEBkZXByZWNhdGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gdXBkYXRlRmxvYXQoaW50IGNvbHVtbkluZGV4LCBmbG9hdCB2YWx1ZSkgewotICAgICAgICByZXR1cm4gbUN1cnNvci51cGRhdGVGbG9hdChjb2x1bW5JbmRleCwgdmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiB1cGRhdGVJbnQoaW50IGNvbHVtbkluZGV4LCBpbnQgdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIG1DdXJzb3IudXBkYXRlSW50KGNvbHVtbkluZGV4LCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHVwZGF0ZUxvbmcoaW50IGNvbHVtbkluZGV4LCBsb25nIHZhbHVlKSB7Ci0gICAgICAgIHJldHVybiBtQ3Vyc29yLnVwZGF0ZUxvbmcoY29sdW1uSW5kZXgsIHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAaGlkZQotICAgICAqIEBkZXByZWNhdGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gdXBkYXRlU2hvcnQoaW50IGNvbHVtbkluZGV4LCBzaG9ydCB2YWx1ZSkgewotICAgICAgICByZXR1cm4gbUN1cnNvci51cGRhdGVTaG9ydChjb2x1bW5JbmRleCwgdmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiB1cGRhdGVTdHJpbmcoaW50IGNvbHVtbkluZGV4LCBTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIG1DdXJzb3IudXBkYXRlU3RyaW5nKGNvbHVtbkluZGV4LCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHVwZGF0ZUJsb2IoaW50IGNvbHVtbkluZGV4LCBieXRlW10gdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIG1DdXJzb3IudXBkYXRlQmxvYihjb2x1bW5JbmRleCwgdmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiB1cGRhdGVUb051bGwoaW50IGNvbHVtbkluZGV4KSB7Ci0gICAgICAgIHJldHVybiBtQ3Vyc29yLnVwZGF0ZVRvTnVsbChjb2x1bW5JbmRleCk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgQ3Vyc29yIG1DdXJzb3I7Ci0gICAgCiB9CiAKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0RhdGFTZXRPYnNlcnZhYmxlLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9EYXRhU2V0T2JzZXJ2YWJsZS5qYXZhCmluZGV4IDkyMDBlODEuLjUxYzcyYzEgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0RhdGFTZXRPYnNlcnZhYmxlLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvRGF0YVNldE9ic2VydmFibGUuamF2YQpAQCAtMjcsOCArMjcsMTIgQEAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKCkgewogICAgICAgICBzeW5jaHJvbml6ZWQobU9ic2VydmVycykgewotICAgICAgICAgICAgZm9yIChEYXRhU2V0T2JzZXJ2ZXIgb2JzZXJ2ZXIgOiBtT2JzZXJ2ZXJzKSB7Ci0gICAgICAgICAgICAgICAgb2JzZXJ2ZXIub25DaGFuZ2VkKCk7CisgICAgICAgICAgICAvLyBzaW5jZSBvbkNoYW5nZWQoKSBpcyBpbXBsZW1lbnRlZCBieSB0aGUgYXBwLCBpdCBjb3VsZCBkbyBhbnl0aGluZywgaW5jbHVkaW5nCisgICAgICAgICAgICAvLyByZW1vdmluZyBpdHNlbGYgZnJvbSB7QGxpbmsgbU9ic2VydmVyc30gLSBhbmQgdGhhdCBjb3VsZCBjYXVzZSBwcm9ibGVtcyBpZgorICAgICAgICAgICAgLy8gYW4gaXRlcmF0b3IgaXMgdXNlZCBvbiB0aGUgQXJyYXlMaXN0IHtAbGluayBtT2JzZXJ2ZXJzfS4KKyAgICAgICAgICAgIC8vIHRvIGF2b2lkIHN1Y2ggcHJvYmxlbXMsIGp1c3QgbWFyY2ggdGhydSB0aGUgbGlzdCBpbiB0aGUgcmV2ZXJzZSBvcmRlci4KKyAgICAgICAgICAgIGZvciAoaW50IGkgPSBtT2JzZXJ2ZXJzLnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgICAgICAgICAgbU9ic2VydmVycy5nZXQoaSkub25DaGFuZ2VkKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC0zOSw4ICs0Myw4IEBACiAgICAgICovCiAgICAgcHVibGljIHZvaWQgbm90aWZ5SW52YWxpZGF0ZWQoKSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAobU9ic2VydmVycykgewotICAgICAgICAgICAgZm9yIChEYXRhU2V0T2JzZXJ2ZXIgb2JzZXJ2ZXIgOiBtT2JzZXJ2ZXJzKSB7Ci0gICAgICAgICAgICAgICAgb2JzZXJ2ZXIub25JbnZhbGlkYXRlZCgpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IG1PYnNlcnZlcnMuc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgICAgICAgICBtT2JzZXJ2ZXJzLmdldChpKS5vbkludmFsaWRhdGVkKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9EYXRhYmFzZUVycm9ySGFuZGxlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvRGF0YWJhc2VFcnJvckhhbmRsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGM1NDUyCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvRGF0YWJhc2VFcnJvckhhbmRsZXIuamF2YQpAQCAtMCwwICsxLDMzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmRhdGFiYXNlOworCitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2U7CisKKy8qKgorICogQW4gaW50ZXJmYWNlIHRvIGxldCB0aGUgYXBwcyBkZWZpbmUgdGhlIGFjdGlvbnMgdG8gdGFrZSB3aGVuIHRoZSBmb2xsb3dpbmcgZXJyb3JzIGFyZSBkZXRlY3RlZAorICogICBkYXRhYmFzZSBjb3JydXB0aW9uCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgRGF0YWJhc2VFcnJvckhhbmRsZXIgeworCisgICAgLyoqCisgICAgICogZGVmaW5lcyB0aGUgbWV0aG9kIHRvIGJlIGludm9rZWQgd2hlbiBkYXRhYmFzZSBjb3JydXB0aW9uIGlzIGRldGVjdGVkLgorICAgICAqIEBwYXJhbSBkYk9iaiB0aGUge0BsaW5rIFNRTGl0ZURhdGFiYXNlfSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBkYXRhYmFzZSBvbiB3aGljaCBjb3JydXB0aW9uCisgICAgICogaXMgZGV0ZWN0ZWQuCisgICAgICovCisgICAgdm9pZCBvbkNvcnJ1cHRpb24oU1FMaXRlRGF0YWJhc2UgZGJPYmopOworfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvRGF0YWJhc2VVdGlscy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvRGF0YWJhc2VVdGlscy5qYXZhCmluZGV4IDliZmJiNzQuLmFmOTNlZWUgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0RhdGFiYXNlVXRpbHMuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9EYXRhYmFzZVV0aWxzLmphdmEKQEAgLTE5Myw2ICsxOTMsMzcgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBSZXR1cm5zIGRhdGEgdHlwZSBvZiB0aGUgZ2l2ZW4gb2JqZWN0J3MgdmFsdWUuCisgICAgICo8cD4KKyAgICAgKiBSZXR1cm5lZCB2YWx1ZXMgYXJlCisgICAgICogPHVsPgorICAgICAqICAgPGxpPntAbGluayBDdXJzb3IjRklFTERfVFlQRV9OVUxMfTwvbGk+CisgICAgICogICA8bGk+e0BsaW5rIEN1cnNvciNGSUVMRF9UWVBFX0lOVEVHRVJ9PC9saT4KKyAgICAgKiAgIDxsaT57QGxpbmsgQ3Vyc29yI0ZJRUxEX1RZUEVfRkxPQVR9PC9saT4KKyAgICAgKiAgIDxsaT57QGxpbmsgQ3Vyc29yI0ZJRUxEX1RZUEVfU1RSSU5HfTwvbGk+CisgICAgICogICA8bGk+e0BsaW5rIEN1cnNvciNGSUVMRF9UWVBFX0JMT0J9PC9saT4KKyAgICAgKjwvdWw+CisgICAgICo8L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gb2JqIHRoZSBvYmplY3Qgd2hvc2UgdmFsdWUgdHlwZSBpcyB0byBiZSByZXR1cm5lZAorICAgICAqIEByZXR1cm4gb2JqZWN0IHZhbHVlIHR5cGUKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldFR5cGVPZk9iamVjdChPYmplY3Qgb2JqKSB7CisgICAgICAgIGlmIChvYmogPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIEN1cnNvci5GSUVMRF9UWVBFX05VTEw7CisgICAgICAgIH0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgYnl0ZVtdKSB7CisgICAgICAgICAgICByZXR1cm4gQ3Vyc29yLkZJRUxEX1RZUEVfQkxPQjsKKyAgICAgICAgfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBGbG9hdCB8fCBvYmogaW5zdGFuY2VvZiBEb3VibGUpIHsKKyAgICAgICAgICAgIHJldHVybiBDdXJzb3IuRklFTERfVFlQRV9GTE9BVDsKKyAgICAgICAgfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBMb25nIHx8IG9iaiBpbnN0YW5jZW9mIEludGVnZXIpIHsKKyAgICAgICAgICAgIHJldHVybiBDdXJzb3IuRklFTERfVFlQRV9JTlRFR0VSOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIEN1cnNvci5GSUVMRF9UWVBFX1NUUklORzsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgogICAgICAqIEFwcGVuZHMgYW4gU1FMIHN0cmluZyB0byB0aGUgZ2l2ZW4gU3RyaW5nQnVpbGRlciwgaW5jbHVkaW5nIHRoZSBvcGVuaW5nCiAgICAgICogYW5kIGNsb3Npbmcgc2luZ2xlIHF1b3Rlcy4gQW55IHNpbmdsZSBxdW90ZXMgaW50ZXJuYWwgdG8gc3FsU3RyaW5nIHdpbGwKICAgICAgKiBiZSBlc2NhcGVkLgpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvRGVmYXVsdERhdGFiYXNlRXJyb3JIYW5kbGVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9EZWZhdWx0RGF0YWJhc2VFcnJvckhhbmRsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjE5ZTQ4Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvRGVmYXVsdERhdGFiYXNlRXJyb3JIYW5kbGVyLmphdmEKQEAgLTAsMCArMSw5NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGFuZHJvaWQuZGF0YWJhc2U7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKKworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlOworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZUV4Y2VwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudXRpbC5QYWlyOworCisvKioKKyAqIERlZmF1bHQgY2xhc3MgdXNlZCBkZWZpbmluZyB0aGUgYWN0aW9ucyB0byB0YWtlIHdoZW4gdGhlIGZvbGxvd2luZyBlcnJvcnMgYXJlIGRldGVjdGVkCisgKiAgIGRhdGFiYXNlIGNvcnJ1cHRpb24KKyAqLworcHVibGljIGZpbmFsIGNsYXNzIERlZmF1bHREYXRhYmFzZUVycm9ySGFuZGxlciBpbXBsZW1lbnRzIERhdGFiYXNlRXJyb3JIYW5kbGVyIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiRGVmYXVsdERhdGFiYXNlRXJyb3JIYW5kbGVyIjsKKworICAgIC8qKgorICAgICAqIGRlZmluZXMgdGhlIGRlZmF1bHQgbWV0aG9kIHRvIGJlIGludm9rZWQgd2hlbiBkYXRhYmFzZSBjb3JydXB0aW9uIGlzIGRldGVjdGVkLgorICAgICAqIEBwYXJhbSBkYk9iaiB0aGUge0BsaW5rIFNRTGl0ZURhdGFiYXNlfSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBkYXRhYmFzZSBvbiB3aGljaCBjb3JydXB0aW9uCisgICAgICogaXMgZGV0ZWN0ZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgb25Db3JydXB0aW9uKFNRTGl0ZURhdGFiYXNlIGRiT2JqKSB7CisgICAgICAgIExvZy5lKFRBRywgIkNvcnJ1cHRpb24gcmVwb3J0ZWQgYnkgc3FsaXRlIG9uIGRhdGFiYXNlOiAiICsgZGJPYmouZ2V0UGF0aCgpKTsKKworICAgICAgICAvLyBpcyB0aGUgY29ycnVwdGlvbiBkZXRlY3RlZCBldmVuIGJlZm9yZSBkYXRhYmFzZSBjb3VsZCBiZSAnb3BlbmVkJz8KKyAgICAgICAgaWYgKCFkYk9iai5pc09wZW4oKSkgeworICAgICAgICAgICAgLy8gZGF0YWJhc2UgZmlsZXMgYXJlIG5vdCBldmVuIG9wZW5hYmxlLiBkZWxldGUgdGhpcyBkYXRhYmFzZSBmaWxlLgorICAgICAgICAgICAgLy8gTk9URSBpZiB0aGUgZGF0YWJhc2UgaGFzIGF0dGFjaGVkIGRhdGFiYXNlcywgdGhlbiBhbnkgb2YgdGhlbSBjb3VsZCBiZSBjb3JydXB0LgorICAgICAgICAgICAgLy8gYW5kIG5vdCBkZWxldGluZyBhbGwgb2YgdGhlbSBjb3VsZCBjYXVzZSBjb3JydXB0ZWQgZGF0YWJhc2UgZmlsZSB0byByZW1haW4gYW5kIAorICAgICAgICAgICAgLy8gbWFrZSB0aGUgYXBwbGljYXRpb24gY3Jhc2ggb24gZGF0YWJhc2Ugb3BlbiBvcGVyYXRpb24uIFRvIGF2b2lkIHRoaXMgcHJvYmxlbSwKKyAgICAgICAgICAgIC8vIHRoZSBhcHBsaWNhdGlvbiBzaG91bGQgcHJvdmlkZSBpdHMgb3duIHtAbGluayBEYXRhYmFzZUVycm9ySGFuZGxlcn0gaW1wbCBjbGFzcworICAgICAgICAgICAgLy8gdG8gZGVsZXRlIEFMTCBmaWxlcyBvZiB0aGUgZGF0YWJhc2UgKGluY2x1ZGluZyB0aGUgYXR0YWNoZWQgZGF0YWJhc2VzKS4KKyAgICAgICAgICAgIGRlbGV0ZURhdGFiYXNlRmlsZShkYk9iai5nZXRQYXRoKCkpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgQXJyYXlMaXN0PFBhaXI8U3RyaW5nLCBTdHJpbmc+PiBhdHRhY2hlZERicyA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBDbG9zZSB0aGUgZGF0YWJhc2UsIHdoaWNoIHdpbGwgY2F1c2Ugc3Vic2VxdWVudCBvcGVyYXRpb25zIHRvIGZhaWwuCisgICAgICAgICAgICAvLyBiZWZvcmUgdGhhdCwgZ2V0IHRoZSBhdHRhY2hlZCBkYXRhYmFzZSBsaXN0IGZpcnN0LgorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBhdHRhY2hlZERicyA9IGRiT2JqLmdldEF0dGFjaGVkRGJzKCk7CisgICAgICAgICAgICB9IGNhdGNoIChTUUxpdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIC8qIGlnbm9yZSAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBkYk9iai5jbG9zZSgpOworICAgICAgICAgICAgfSBjYXRjaCAoU1FMaXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAvKiBpZ25vcmUgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIC8vIERlbGV0ZSBhbGwgZmlsZXMgb2YgdGhpcyBjb3JydXB0IGRhdGFiYXNlIGFuZC9vciBhdHRhY2hlZCBkYXRhYmFzZXMKKyAgICAgICAgICAgIGlmIChhdHRhY2hlZERicyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZm9yIChQYWlyPFN0cmluZywgU3RyaW5nPiBwIDogYXR0YWNoZWREYnMpIHsKKyAgICAgICAgICAgICAgICAgICAgZGVsZXRlRGF0YWJhc2VGaWxlKHAuc2Vjb25kKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIGF0dGFjaGVkRGJzID0gbnVsbCBpcyBwb3NzaWJsZSB3aGVuIHRoZSBkYXRhYmFzZSBpcyBzbyBjb3JydXB0IHRoYXQgZXZlbgorICAgICAgICAgICAgICAgIC8vICJQUkFHTUEgZGF0YWJhc2VfbGlzdDsiIGFsc28gZmFpbHMuIGRlbGV0ZSB0aGUgbWFpbiBkYXRhYmFzZSBmaWxlCisgICAgICAgICAgICAgICAgZGVsZXRlRGF0YWJhc2VGaWxlKGRiT2JqLmdldFBhdGgoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZGVsZXRlRGF0YWJhc2VGaWxlKFN0cmluZyBmaWxlTmFtZSkgeworICAgICAgICBpZiAoZmlsZU5hbWUuZXF1YWxzSWdub3JlQ2FzZSgiOm1lbW9yeToiKSB8fCBmaWxlTmFtZS50cmltKCkubGVuZ3RoKCkgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIExvZy5lKFRBRywgImRlbGV0aW5nIHRoZSBkYXRhYmFzZSBmaWxlOiAiICsgZmlsZU5hbWUpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgbmV3IEZpbGUoZmlsZU5hbWUpLmRlbGV0ZSgpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLyogcHJpbnQgd2FybmluZyBhbmQgaWdub3JlIGV4Y2VwdGlvbiAqLworICAgICAgICAgICAgTG9nLncoVEFHLCAiZGVsZXRlIGZhaWxlZDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0lCdWxrQ3Vyc29yLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9JQnVsa0N1cnNvci5qYXZhCmluZGV4IDQ2NzkwYTMuLjI0NGM4OGYgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0lCdWxrQ3Vyc29yLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvSUJ1bGtDdXJzb3IuamF2YQpAQCAtMTYsMTYgKzE2LDE0IEBACiAKIHBhY2thZ2UgYW5kcm9pZC5kYXRhYmFzZTsKIAotaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwogaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKIGltcG9ydCBhbmRyb2lkLm9zLklJbnRlcmZhY2U7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOwogCiAvKioKICAqIFRoaXMgaW50ZXJmYWNlIHByb3ZpZGVzIGEgbG93LWxldmVsIHdheSB0byBwYXNzIGJ1bGsgY3Vyc29yIGRhdGEgYWNyb3NzCi0gKiBib3RoIHByb2Nlc3MgYW5kIGxhbmd1YWdlIGJvdW5kcmllcy4gQXBwbGljYXRpb24gY29kZSBzaG91bGQgdXNlIHRoZSBDdXJzb3IKKyAqIGJvdGggcHJvY2VzcyBhbmQgbGFuZ3VhZ2UgYm91bmRhcmllcy4gQXBwbGljYXRpb24gY29kZSBzaG91bGQgdXNlIHRoZSBDdXJzb3IKICAqIGludGVyZmFjZSBkaXJlY3RseS4KICAqCiAgKiB7QGhpZGV9CkBAIC01NCwxMCArNTIsNiBAQAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRDb2x1bW5OYW1lcygpIHRocm93cyBSZW1vdGVFeGNlcHRpb247CiAKLSAgICBwdWJsaWMgYm9vbGVhbiB1cGRhdGVSb3dzKE1hcDw/IGV4dGVuZHMgTG9uZywgPyBleHRlbmRzIE1hcDxTdHJpbmcsIE9iamVjdD4+IHZhbHVlcykgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbjsKLQotICAgIHB1YmxpYyBib29sZWFuIGRlbGV0ZVJvdyhpbnQgcG9zaXRpb24pIHRocm93cyBSZW1vdGVFeGNlcHRpb247Ci0KICAgICBwdWJsaWMgdm9pZCBkZWFjdGl2YXRlKCkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbjsKIAogICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbjsKQEAgLTc2LDggKzcwLDYgQEAKICAgICBzdGF0aWMgZmluYWwgaW50IEdFVF9DVVJTT1JfV0lORE9XX1RSQU5TQUNUSU9OID0gSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OOwogICAgIHN0YXRpYyBmaW5hbCBpbnQgQ09VTlRfVFJBTlNBQ1RJT04gPSBJQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAxOwogICAgIHN0YXRpYyBmaW5hbCBpbnQgR0VUX0NPTFVNTl9OQU1FU19UUkFOU0FDVElPTiA9IElCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDI7Ci0gICAgc3RhdGljIGZpbmFsIGludCBVUERBVEVfUk9XU19UUkFOU0FDVElPTiA9IElCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDM7Ci0gICAgc3RhdGljIGZpbmFsIGludCBERUxFVEVfUk9XX1RSQU5TQUNUSU9OID0gSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNDsKICAgICBzdGF0aWMgZmluYWwgaW50IERFQUNUSVZBVEVfVFJBTlNBQ1RJT04gPSBJQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA1OwogICAgIHN0YXRpYyBmaW5hbCBpbnQgUkVRVUVSWV9UUkFOU0FDVElPTiA9IElCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDY7CiAgICAgc3RhdGljIGZpbmFsIGludCBPTl9NT1ZFX1RSQU5TQUNUSU9OID0gSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNzsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL01hdHJpeEN1cnNvci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvTWF0cml4Q3Vyc29yLmphdmEKaW5kZXggZDVjM2EzMi4uNWMxYjk2OCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvTWF0cml4Q3Vyc29yLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvTWF0cml4Q3Vyc29yLmphdmEKQEAgLTI3Miw2ICsyNzIsMTEgQEAKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGdldFR5cGUoaW50IGNvbHVtbikgeworICAgICAgICByZXR1cm4gRGF0YWJhc2VVdGlscy5nZXRUeXBlT2ZPYmplY3QoZ2V0KGNvbHVtbikpOworICAgIH0KKworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGlzTnVsbChpbnQgY29sdW1uKSB7CiAgICAgICAgIHJldHVybiBnZXQoY29sdW1uKSA9PSBudWxsOwogICAgIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL01lcmdlQ3Vyc29yLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9NZXJnZUN1cnNvci5qYXZhCmluZGV4IDcyMmQ3MDcuLjJjMjVkYjcgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL01lcmdlQ3Vyc29yLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvTWVyZ2VDdXJzb3IuamF2YQpAQCAtOTIsMzIgKzkyLDYgQEAKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIC8qKgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBkZWxldGVSb3coKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1DdXJzb3IuZGVsZXRlUm93KCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBjb21taXRVcGRhdGVzKCkgewotICAgICAgICBpbnQgbGVuZ3RoID0gbUN1cnNvcnMubGVuZ3RoOwotICAgICAgICBmb3IgKGludCBpID0gMCA7IGkgPCBsZW5ndGggOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChtQ3Vyc29yc1tpXSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUN1cnNvcnNbaV0uY29tbWl0VXBkYXRlcygpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIG9uQ2hhbmdlKHRydWUpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhpbnQgY29sdW1uKQogICAgIHsKQEAgLTE1NSw2ICsxMjksMTEgQEAKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGdldFR5cGUoaW50IGNvbHVtbikgeworICAgICAgICByZXR1cm4gbUN1cnNvci5nZXRUeXBlKGNvbHVtbik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gaXNOdWxsKGludCBjb2x1bW4pCiAgICAgewogICAgICAgICByZXR1cm4gbUN1cnNvci5pc051bGwoY29sdW1uKTsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL1JlcXVlcnlPblVpVGhyZWFkRXhjZXB0aW9uLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9SZXF1ZXJ5T25VaVRocmVhZEV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3YTUwZDgKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9SZXF1ZXJ5T25VaVRocmVhZEV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuZGF0YWJhc2U7CisKKy8qKgorICogQW4gZXhjZXB0aW9uIHRoYXQgaW5kaWNhdGVzIGludm9raW5nIHtAbGluayBDdXJzb3IjcmVxdWVyeSgpfSBvbiBNYWluIHRocmVhZCBjb3VsZCBjYXVzZSBBTlIuCisgKiBUaGlzIGV4Y2VwdGlvbiBzaG91bGQgZW5jb3VyYWdlIGFwcHMgdG8gaW52b2tlIHtAbGluayBDdXJzb3IjcmVxdWVyeSgpfSBpbiBhIGJhY2tncm91bmQgdGhyZWFkLiAKKyAqIEBoaWRlCisgKi8KK3B1YmxpYyBjbGFzcyBSZXF1ZXJ5T25VaVRocmVhZEV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24geworICAgIHB1YmxpYyBSZXF1ZXJ5T25VaVRocmVhZEV4Y2VwdGlvbihTdHJpbmcgcGFja2FnZU5hbWUpIHsKKyAgICAgICAgc3VwZXIoIkluICIgKyBwYWNrYWdlTmFtZSArICIgUmVxdWVyeSBpcyBleGVjdXRpbmcgb24gbWFpbiAoVUkpIHRocmVhZC4gY291bGQgY2F1c2UgQU5SLiAiICsKKyAgICAgICAgICAgICAgICAiZG8gaXQgaW4gYmFja2dyb3VuZCB0aHJlYWQuIik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL0RhdGFiYXNlQ29ubmVjdGlvblBvb2wuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9EYXRhYmFzZUNvbm5lY3Rpb25Qb29sLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Y3MDE4ZgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9EYXRhYmFzZUNvbm5lY3Rpb25Qb29sLmphdmEKQEAgLTAsMCArMSwzMDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZTsKKworaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKKworLyoqCisgKiBBIGNvbm5lY3Rpb24gcG9vbCB0byBiZSB1c2VkIGJ5IHJlYWRlcnMuCisgKiBOb3RlIHRoYXQgZWFjaCBjb25uZWN0aW9uIGNhbiBiZSB1c2VkIGJ5IG9ubHkgb25lIHJlYWRlciBhdCBhIHRpbWUuCisgKi8KKy8qIHBhY2thZ2UgKi8gY2xhc3MgRGF0YWJhc2VDb25uZWN0aW9uUG9vbCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkRhdGFiYXNlQ29ubmVjdGlvblBvb2wiOworCisgICAgLyoqIFRoZSBkZWZhdWx0IGNvbm5lY3Rpb24gcG9vbCBzaXplLiBJdCBpcyBzZXQgYmFzZWQgb24gdGhlIGFtb3VudCBvZiBtZW1vcnkgdGhlIGRldmljZSBoYXMuCisgICAgICogVE9ETzogc2V0IHRoaXMgd2l0aCAnYSBzeXN0ZW0gY2FsbCcgd2hpY2ggcmV0dXJucyB0aGUgYW1vdW50IG9mIG1lbW9yeSB0aGUgZGV2aWNlIGhhcworICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0NPTk5FQ1RJT05fUE9PTF9TSVpFID0gMTsKKworICAgIC8qKiB0aGUgcG9vbCBzaXplIHNldCBmb3IgdGhpcyB7QGxpbmsgU1FMaXRlRGF0YWJhc2V9ICovCisgICAgcHJpdmF0ZSB2b2xhdGlsZSBpbnQgbU1heFBvb2xTaXplID0gREVGQVVMVF9DT05ORUNUSU9OX1BPT0xfU0laRTsKKworICAgIC8qKiBUaGUgY29ubmVjdGlvbiBwb29sIG9iamVjdHMgYXJlIHN0b3JlZCBpbiB0aGlzIG1lbWJlci4KKyAgICAgKiBUT0RPOiByZXZpc2l0IHRoaXMgZGF0YSBzdHJ1Y3QgYXMgdGhlIG51bWJlciBvZiBwb29sZWQgY29ubmVjdGlvbnMgaW5jcmVhc2UgYmV5b25kCisgICAgICogc2luZ2xlLWRpZ2l0IHZhbHVlcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIEFycmF5TGlzdDxQb29sT2JqPiBtUG9vbCA9IG5ldyBBcnJheUxpc3Q8UG9vbE9iaj4obU1heFBvb2xTaXplKTsKKworICAgIC8qKiB0aGUgbWFpbiBkYXRhYmFzZSBjb25uZWN0aW9uIHRvIHdoaWNoIHRoaXMgY29ubmVjdGlvbiBwb29sIGlzIGF0dGFjaGVkICovCisgICAgcHJpdmF0ZSBmaW5hbCBTUUxpdGVEYXRhYmFzZSBtUGFyZW50RGJPYmo7CisKKyAgICAvKiBwYWNrYWdlICovIERhdGFiYXNlQ29ubmVjdGlvblBvb2woU1FMaXRlRGF0YWJhc2UgZGIpIHsKKyAgICAgICAgdGhpcy5tUGFyZW50RGJPYmogPSBkYjsKKyAgICAgICAgaWYgKExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLkRFQlVHKSkgeworICAgICAgICAgICAgTG9nLmQoVEFHLCAiTWF4IFBvb2wgU2l6ZTogIiArIG1NYXhQb29sU2l6ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBjbG9zZSBhbGwgZGF0YWJhc2UgY29ubmVjdGlvbnMgaW4gdGhlIHBvb2wgLSBldmVuIGlmIHRoZXkgYXJlIGluIHVzZSEKKyAgICAgKi8KKyAgICAvKiBwYWNrYWdlICovIHZvaWQgY2xvc2UoKSB7CisgICAgICAgIHN5bmNocm9uaXplZChtUGFyZW50RGJPYmopIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSBtUG9vbC5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgeworICAgICAgICAgICAgICAgIG1Qb29sLmdldChpKS5tRGIuY2xvc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1Qb29sLmNsZWFyKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBnZXQgYSBmcmVlIGNvbm5lY3Rpb24gZnJvbSB0aGUgcG9vbAorICAgICAqCisgICAgICogQHBhcmFtIHNxbCBpZiBub3QgbnVsbCwgdHJ5IHRvIGZpbmQgYSBjb25uZWN0aW9uIGludGhlIHBvb2wgd2hpY2ggYWxyZWFkeSBoYXMgY2FjaGVkCisgICAgICogdGhlIGNvbXBpbGVkIHN0YXRlbWVudCBmb3IgdGhpcyBzcWwuCisgICAgICogQHJldHVybiB0aGUgRGF0YWJhc2UgY29ubmVjdGlvbiB0aGF0IHRoZSBjYWxsZXIgY2FuIHVzZQorICAgICAqLworICAgIC8qIHBhY2thZ2UgKi8gU1FMaXRlRGF0YWJhc2UgZ2V0KFN0cmluZyBzcWwpIHsKKyAgICAgICAgaWYgKExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLkRFQlVHKSkgeworICAgICAgICAgICAgZG9Bc3NlcnRzKCk7CisgICAgICAgIH0KKworICAgICAgICBTUUxpdGVEYXRhYmFzZSBkYiA9IG51bGw7CisgICAgICAgIFBvb2xPYmogcG9vbE9iaiA9IG51bGw7CisgICAgICAgIHN5bmNocm9uaXplZChtUGFyZW50RGJPYmopIHsKKyAgICAgICAgICAgIGlmIChnZXRGcmVlUG9vbFNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgaWYgKG1NYXhQb29sU2l6ZSA9PSBtUG9vbC5zaXplKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gbWF4ZWQgb3V0LiBjYW4ndCBvcGVuIGFueSBtb3JlIGNvbm5lY3Rpb25zLgorICAgICAgICAgICAgICAgICAgICAvLyBsZXQgdGhlIGNhbGxlciB3YWl0IG9uIG9uZSBvZiB0aGUgcG9vbGVkIGNvbm5lY3Rpb25zCisgICAgICAgICAgICAgICAgICAgIGlmIChtTWF4UG9vbFNpemUgPT0gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcG9vbE9iaiA9IG1Qb29sLmdldCgwKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdldCBhIHJhbmRvbSBudW1iZXIgYmV0d2VlbiAwIGFuZCAobU1heFBvb2xTaXplLTEpCisgICAgICAgICAgICAgICAgICAgICAgICBwb29sT2JqID0gbVBvb2wuZ2V0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUmFuZG9tKFN5c3RlbUNsb2NrLmVsYXBzZWRSZWFsdGltZSgpKS5uZXh0SW50KG1NYXhQb29sU2l6ZS0xKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZGIgPSBwb29sT2JqLm1EYjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGUgYSBuZXcgY29ubmVjdGlvbiBhbmQgYWRkIGl0IHRvIHRoZSBwb29sLCBzaW5jZSB3ZSBoYXZlbid0IHJlYWNoZWQKKyAgICAgICAgICAgICAgICAgICAgLy8gbWF4IHBvb2wgc2l6ZSBhbGxvd2VkCisgICAgICAgICAgICAgICAgICAgIGludCBwb29sU2l6ZSA9IGdldFBvb2xTaXplKCk7CisgICAgICAgICAgICAgICAgICAgIGRiID0gbVBhcmVudERiT2JqLmNyZWF0ZVBvb2xDb25uZWN0aW9uKChzaG9ydCkocG9vbFNpemUgKyAxKSk7CisgICAgICAgICAgICAgICAgICAgIHBvb2xPYmogPSBuZXcgUG9vbE9iaihkYik7CisgICAgICAgICAgICAgICAgICAgIG1Qb29sLmFkZChwb29sU2l6ZSwgcG9vbE9iaik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyB0aGVyZSBhcmUgZnJlZSBjb25uZWN0aW9ucyBhdmFpbGFibGUuIHBpY2sgb25lCisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IG1Qb29sLnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgICAgICAgICAgICAgIHBvb2xPYmogPSBtUG9vbC5nZXQoaSk7CisgICAgICAgICAgICAgICAgICAgIGlmICghcG9vbE9iai5pc0ZyZWUoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gaXQgaXMgZnJlZSAtIGJ1dCBkb2VzIGl0cyBkYXRhYmFzZSBvYmplY3QgYWxyZWFkeSBoYXZlIHRoZSBnaXZlbiBzcWwgaW4gaXRzCisgICAgICAgICAgICAgICAgICAgIC8vIHN0YXRlbWVudC1jYWNoZT8KKyAgICAgICAgICAgICAgICAgICAgZGIgPSBwb29sT2JqLm1EYjsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNxbCA9PSBudWxsIHx8IGRiLmlzU3FsSW5TdGF0ZW1lbnRDYWNoZShzcWwpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3VuZCBhIGZyZWUgY29ubmVjdGlvbiB3ZSBjYW4gdXNlCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyBoYXZlbid0IGZvdW5kIGEgZGF0YWJhc2Ugb2JqZWN0IHdoaWNoIGhhcyB0aGUgZ2l2ZW4gc3FsIGluIGl0cworICAgICAgICAgICAgICAgICAgICAvLyBzdGF0ZW1lbnQtY2FjaGUKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGFzc2VydCBwb29sT2JqICE9IG51bGw7CisgICAgICAgICAgICBhc3NlcnQgcG9vbE9iai5tRGIgPT0gZGI7CisKKyAgICAgICAgICAgIHBvb2xPYmouYWNxdWlyZSgpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLkRFQlVHKSkgeworICAgICAgICAgICAgTG9nLmQoVEFHLCAiRU5EIGdldC1jb25uZWN0aW9uOiAiICsgdG9TdHJpbmcoKSArIHBvb2xPYmoudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGRiOworICAgICAgICAvLyBUT0RPIGlmIGEgdGhyZWFkIGFjcXVpcmVzIGEgY29ubmVjdGlvbiBhbmQgZGllcyB3aXRob3V0IHJlbGVhc2luZyB0aGUgY29ubmVjdGlvbiwgdGhlbgorICAgICAgICAvLyB0aGVyZSBjb3VsZCBiZSBhIGNvbm5lY3Rpb24gbGVhay4KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiByZWxlYXNlIHRoZSBnaXZlbiBkYXRhYmFzZSBjb25uZWN0aW9uIGJhY2sgdG8gdGhlIHBvb2wuCisgICAgICogQHBhcmFtIGRiIHRoZSBjb25uZWN0aW9uIHRvIGJlIHJlbGVhc2VkCisgICAgICovCisgICAgLyogcGFja2FnZSAqLyB2b2lkIHJlbGVhc2UoU1FMaXRlRGF0YWJhc2UgZGIpIHsKKyAgICAgICAgUG9vbE9iaiBwb29sT2JqOworICAgICAgICBzeW5jaHJvbml6ZWQobVBhcmVudERiT2JqKSB7CisgICAgICAgICAgICBpZiAoTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuREVCVUcpKSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0IGRiLm1Db25uZWN0aW9uTnVtID4gMDsKKyAgICAgICAgICAgICAgICBkb0Fzc2VydHMoKTsKKyAgICAgICAgICAgICAgICBhc3NlcnQgbVBvb2wuZ2V0KGRiLm1Db25uZWN0aW9uTnVtIC0gMSkubURiID09IGRiOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwb29sT2JqID0gbVBvb2wuZ2V0KGRiLm1Db25uZWN0aW9uTnVtIC0gMSk7CisKKyAgICAgICAgICAgIGlmIChMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5ERUJVRykpIHsKKyAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJCRUdJTiByZWxlYXNlLWNvbm46ICIgKyB0b1N0cmluZygpICsgcG9vbE9iai50b1N0cmluZygpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHBvb2xPYmouaXNGcmVlKCkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJSZWxlYXNpbmcgb2JqZWN0IGFscmVhZHkgZnJlZWQ6ICIgKworICAgICAgICAgICAgICAgICAgICAgICAgZGIubUNvbm5lY3Rpb25OdW0pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwb29sT2JqLnJlbGVhc2UoKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5ERUJVRykpIHsKKyAgICAgICAgICAgIExvZy5kKFRBRywgIkVORCByZWxlYXNlLWNvbm46ICIgKyB0b1N0cmluZygpICsgcG9vbE9iai50b1N0cmluZygpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBsaXN0IG9mIGFsbCBkYXRhYmFzZSBjb25uZWN0aW9ucyBpbiB0aGUgcG9vbCAoYm90aCBmcmVlIGFuZCBidXN5IGNvbm5lY3Rpb25zKS4KKyAgICAgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIHdoZW4gImFkYiBidWdyZXBvcnQiIGlzIGRvbmUuCisgICAgICovCisgICAgLyogcGFja2FnZSAqLyBBcnJheUxpc3Q8U1FMaXRlRGF0YWJhc2U+IGdldENvbm5lY3Rpb25MaXN0KCkgeworICAgICAgICBBcnJheUxpc3Q8U1FMaXRlRGF0YWJhc2U+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFNRTGl0ZURhdGFiYXNlPigpOworICAgICAgICBzeW5jaHJvbml6ZWQobVBhcmVudERiT2JqKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gbVBvb2wuc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgICAgICAgICBsaXN0LmFkZChtUG9vbC5nZXQoaSkubURiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbGlzdDsKKyAgICB9CisKKyAgICAvKiBwYWNrYWdlICovIGludCBnZXRQb29sU2l6ZSgpIHsKKyAgICAgICAgc3luY2hyb25pemVkKG1QYXJlbnREYk9iaikgeworICAgICAgICAgICAgcmV0dXJuIG1Qb29sLnNpemUoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgaW50IGdldEZyZWVQb29sU2l6ZSgpIHsKKyAgICAgICAgaW50IGNvdW50ID0gMDsKKyAgICAgICAgZm9yIChpbnQgaSA9IG1Qb29sLnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgICAgICBpZiAobVBvb2wuZ2V0KGkpLmlzRnJlZSgpKSB7CisgICAgICAgICAgICAgICAgY291bnQrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY291bnQrKzsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gImRiOiAiICsgbVBhcmVudERiT2JqLmdldFBhdGgoKSArCisgICAgICAgICAgICAgICAgIiwgdGhyZWFkaWQgPSAiICsgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRJZCgpICsKKyAgICAgICAgICAgICAgICAiLCB0b3RhbHNpemUgPSAiICsgbVBvb2wuc2l6ZSgpICsgIiwgI2ZyZWUgPSAiICsgZ2V0RnJlZVBvb2xTaXplKCkgKworICAgICAgICAgICAgICAgICIsIG1heHBvb2xzaXplID0gIiArIG1NYXhQb29sU2l6ZTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZG9Bc3NlcnRzKCkgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1Qb29sLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBtUG9vbC5nZXQoaSkudmVyaWZ5KCk7CisgICAgICAgICAgICBhc3NlcnQgbVBvb2wuZ2V0KGkpLm1EYi5tQ29ubmVjdGlvbk51bSA9PSAoaSArIDEpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogcGFja2FnZSAqLyB2b2lkIHNldE1heFBvb2xTaXplKGludCBzaXplKSB7CisgICAgICAgIHN5bmNocm9uaXplZChtUGFyZW50RGJPYmopIHsKKyAgICAgICAgICAgIG1NYXhQb29sU2l6ZSA9IHNpemU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBwYWNrYWdlICovIGludCBnZXRNYXhQb29sU2l6ZSgpIHsKKyAgICAgICAgc3luY2hyb25pemVkKG1QYXJlbnREYk9iaikgeworICAgICAgICAgICAgcmV0dXJuIG1NYXhQb29sU2l6ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIHJlcHJlc2VudHMgb2JqZWN0cyBpbiB0aGUgY29ubmVjdGlvbiBwb29sLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFBvb2xPYmogeworCisgICAgICAgIHByaXZhdGUgZmluYWwgU1FMaXRlRGF0YWJhc2UgbURiOworICAgICAgICBwcml2YXRlIGJvb2xlYW4gbUZyZWVCdXN5RmxhZyA9IEZSRUU7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gRlJFRSA9IHRydWU7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gQlVTWSA9IGZhbHNlOworCisgICAgICAgIC8qKiB0aGUgbnVtYmVyIG9mIHRocmVhZHMgaG9sZGluZyB0aGlzIGNvbm5lY3Rpb24gKi8KKyAgICAgICAgLy8gQEd1YXJkZWRCeSgidGhpcyIpCisgICAgICAgIHByaXZhdGUgaW50IG1OdW1Ib2xkZXJzID0gMDsKKworICAgICAgICAvKiogY29udGFpbnMgdGhlIHRocmVhZElkcyBvZiB0aGUgdGhyZWFkcyBob2xkaW5nIHRoaXMgY29ubmVjdGlvbi4KKyAgICAgICAgICogdXNlZCBmb3IgZGVidWdnaW5nIHB1cnBvc2VzIG9ubHkuCisgICAgICAgICAqLworICAgICAgICAvLyBAR3VhcmRlZEJ5KCJ0aGlzIikKKyAgICAgICAgcHJpdmF0ZSBIYXNoU2V0PExvbmc+IG1Ib2xkZXJJZHMgPSBuZXcgSGFzaFNldDxMb25nPigpOworCisgICAgICAgIHB1YmxpYyBQb29sT2JqKFNRTGl0ZURhdGFiYXNlIGRiKSB7CisgICAgICAgICAgICBtRGIgPSBkYjsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgYWNxdWlyZSgpIHsKKyAgICAgICAgICAgIGlmIChMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5ERUJVRykpIHsKKyAgICAgICAgICAgICAgICBhc3NlcnQgaXNGcmVlKCk7CisgICAgICAgICAgICAgICAgbG9uZyBpZCA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0SWQoKTsKKyAgICAgICAgICAgICAgICBhc3NlcnQgIW1Ib2xkZXJJZHMuY29udGFpbnMoaWQpOworICAgICAgICAgICAgICAgIG1Ib2xkZXJJZHMuYWRkKGlkKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbU51bUhvbGRlcnMrKzsKKyAgICAgICAgICAgIG1GcmVlQnVzeUZsYWcgPSBCVVNZOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCByZWxlYXNlKCkgeworICAgICAgICAgICAgaWYgKExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLkRFQlVHKSkgeworICAgICAgICAgICAgICAgIGxvbmcgaWQgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldElkKCk7CisgICAgICAgICAgICAgICAgYXNzZXJ0IG1Ib2xkZXJJZHMuc2l6ZSgpID09IG1OdW1Ib2xkZXJzOworICAgICAgICAgICAgICAgIGFzc2VydCBtSG9sZGVySWRzLmNvbnRhaW5zKGlkKTsKKyAgICAgICAgICAgICAgICBtSG9sZGVySWRzLnJlbW92ZShpZCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1OdW1Ib2xkZXJzLS07CisgICAgICAgICAgICBpZiAobU51bUhvbGRlcnMgPT0gMCkgeworICAgICAgICAgICAgICAgIG1GcmVlQnVzeUZsYWcgPSBGUkVFOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgYm9vbGVhbiBpc0ZyZWUoKSB7CisgICAgICAgICAgICBpZiAoTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuREVCVUcpKSB7CisgICAgICAgICAgICAgICAgdmVyaWZ5KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gKG1GcmVlQnVzeUZsYWcgPT0gRlJFRSk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIHZlcmlmeSgpIHsKKyAgICAgICAgICAgIGlmIChtRnJlZUJ1c3lGbGFnID09IEZSRUUpIHsKKyAgICAgICAgICAgICAgICBhc3NlcnQgbU51bUhvbGRlcnMgPT0gMDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0IG1OdW1Ib2xkZXJzID4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBidWZmID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgICAgIGJ1ZmYuYXBwZW5kKCIsIGNvbm4gIyAiKTsKKyAgICAgICAgICAgIGJ1ZmYuYXBwZW5kKG1EYi5tQ29ubmVjdGlvbk51bSk7CisgICAgICAgICAgICBidWZmLmFwcGVuZCgiLCBtQ291bnRIb2xkZXJzID0gIik7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQodGhpcykgeworICAgICAgICAgICAgICAgIGJ1ZmYuYXBwZW5kKG1OdW1Ib2xkZXJzKTsKKyAgICAgICAgICAgICAgICBidWZmLmFwcGVuZCgiLCBmcmVlQnVzeUZsYWcgPSAiKTsKKyAgICAgICAgICAgICAgICBidWZmLmFwcGVuZChtRnJlZUJ1c3lGbGFnKTsKKyAgICAgICAgICAgICAgICBmb3IgKExvbmcgbCA6IG1Ib2xkZXJJZHMpIHsKKyAgICAgICAgICAgICAgICAgICAgYnVmZi5hcHBlbmQoIiwgaWQgPSAiICsgbCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGJ1ZmYudG9TdHJpbmcoKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9EYXRhYmFzZU9iamVjdE5vdENsb3NlZEV4Y2VwdGlvbi5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL0RhdGFiYXNlT2JqZWN0Tm90Q2xvc2VkRXhjZXB0aW9uLmphdmEKaW5kZXggOGFjNGMwZi4uZjI4YzcwZiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL0RhdGFiYXNlT2JqZWN0Tm90Q2xvc2VkRXhjZXB0aW9uLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL0RhdGFiYXNlT2JqZWN0Tm90Q2xvc2VkRXhjZXB0aW9uLmphdmEKQEAgLTIxLDEzICsyMSwxMSBAQAogICogdGhhdCBpcyBub3QgZXhwbGljaXRseSBjbG9zZWQKICAqIEBoaWRlCiAgKi8KLXB1YmxpYyBjbGFzcyBEYXRhYmFzZU9iamVjdE5vdENsb3NlZEV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24KLXsKK3B1YmxpYyBjbGFzcyBEYXRhYmFzZU9iamVjdE5vdENsb3NlZEV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24gewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBzID0gIkFwcGxpY2F0aW9uIGRpZCBub3QgY2xvc2UgdGhlIGN1cnNvciBvciBkYXRhYmFzZSBvYmplY3QgIiArCiAgICAgICAgICAgICAidGhhdCB3YXMgb3BlbmVkIGhlcmUiOwogCi0gICAgcHVibGljIERhdGFiYXNlT2JqZWN0Tm90Q2xvc2VkRXhjZXB0aW9uKCkKLSAgICB7CisgICAgcHVibGljIERhdGFiYXNlT2JqZWN0Tm90Q2xvc2VkRXhjZXB0aW9uKCkgewogICAgICAgICBzdXBlcihzKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlQ29tcGlsZWRTcWwuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVDb21waWxlZFNxbC5qYXZhCmluZGV4IDI1YWE5YjMuLjk4ODlhMjEgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVDb21waWxlZFNxbC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVDb21waWxlZFNxbC5qYXZhCkBAIC03OCwyMCArNzgsMTMgQEAKICAgICAgKiAgZXhpc3RpbmcgY29tcGlsZWQgU1FMIHByb2dyYW0gYWxyZWFkeSBhcm91bmQKICAgICAgKi8KICAgICBwcml2YXRlIHZvaWQgY29tcGlsZShTdHJpbmcgc3FsLCBib29sZWFuIGZvcmNlQ29tcGlsYXRpb24pIHsKLSAgICAgICAgaWYgKCFtRGF0YWJhc2UuaXNPcGVuKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImRhdGFiYXNlICIgKyBtRGF0YWJhc2UuZ2V0UGF0aCgpICsgIiBhbHJlYWR5IGNsb3NlZCIpOwotICAgICAgICB9CisgICAgICAgIG1EYXRhYmFzZS52ZXJpZnlMb2NrT3duZXIoKTsKICAgICAgICAgLy8gT25seSBjb21waWxlIGlmIHdlIGRvbid0IGhhdmUgYSB2YWxpZCBzdGF0ZW1lbnQgYWxyZWFkeSBvciB0aGUgY2FsbGVyIGhhcwogICAgICAgICAvLyBleHBsaWNpdGx5IHJlcXVlc3RlZCBhIHJlY29tcGlsZS4KICAgICAgICAgaWYgKGZvcmNlQ29tcGlsYXRpb24pIHsKLSAgICAgICAgICAgIG1EYXRhYmFzZS5sb2NrKCk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB0aGUgbmF0aXZlX2NvbXBpbGUoKSB0YWtlcyBjYXJlIG9mIGRlc3Ryb3lpbmcgYW55IHByZXZpb3VzbHkKLSAgICAgICAgICAgICAgICAvLyBleGlzdGluZyBwcm9ncmFtcyBiZWZvcmUgaXQgY29tcGlsZXMuCi0gICAgICAgICAgICAgICAgbmF0aXZlX2NvbXBpbGUoc3FsKTsKLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgbURhdGFiYXNlLnVubG9jaygpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gTm90ZSB0aGF0IHRoZSBuYXRpdmVfY29tcGlsZSgpIHRha2VzIGNhcmUgb2YgZGVzdHJveWluZyBhbnkgcHJldmlvdXNseQorICAgICAgICAgICAgLy8gZXhpc3RpbmcgcHJvZ3JhbXMgYmVmb3JlIGl0IGNvbXBpbGVzLgorICAgICAgICAgICAgbmF0aXZlX2NvbXBpbGUoc3FsKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMTAyLDEzICs5NSw4IEBACiAgICAgICAgICAgICBpZiAoU1FMaXRlRGVidWcuREVCVUdfQUNUSVZFX0NVUlNPUl9GSU5BTElaQVRJT04pIHsKICAgICAgICAgICAgICAgICBMb2cudihUQUcsICJjbG9zZWQgYW5kIGRlYWxsb2NhdGVkIERiT2JqIChpZCMiICsgblN0YXRlbWVudCArIikiKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbURhdGFiYXNlLmxvY2soKTsKLSAgICAgICAgICAgICAgICBuYXRpdmVfZmluYWxpemUoKTsKLSAgICAgICAgICAgICAgICBuU3RhdGVtZW50ID0gMDsKLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgbURhdGFiYXNlLnVubG9jaygpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgbURhdGFiYXNlLmZpbmFsaXplU3RhdGVtZW50TGF0ZXIoblN0YXRlbWVudCk7CisgICAgICAgICAgICBuU3RhdGVtZW50ID0gMDsKICAgICAgICAgfQogICAgIH0KIApAQCAtMTM0LDYgKzEyMiwxMCBAQAogICAgICAgICBtSW5Vc2UgPSBmYWxzZTsKICAgICB9CiAKKyAgICAvKiBwYWNrYWdlICovIHN5bmNocm9uaXplZCBib29sZWFuIGlzSW5Vc2UoKSB7CisgICAgICAgIHJldHVybiBtSW5Vc2U7CisgICAgfQorCiAgICAgLyoqCiAgICAgICogTWFrZSBzdXJlIHRoYXQgdGhlIG5hdGl2ZSByZXNvdXJjZSBpcyBjbGVhbmVkIHVwLgogICAgICAqLwpAQCAtMTYyLDUgKzE1NCw0IEBACiAgICAgICogQHBhcmFtIHNxbCBUaGUgU1FMIHRvIGNvbXBpbGUuCiAgICAgICovCiAgICAgcHJpdmF0ZSBmaW5hbCBuYXRpdmUgdm9pZCBuYXRpdmVfY29tcGlsZShTdHJpbmcgc3FsKTsKLSAgICBwcml2YXRlIGZpbmFsIG5hdGl2ZSB2b2lkIG5hdGl2ZV9maW5hbGl6ZSgpOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZUN1cnNvci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZUN1cnNvci5qYXZhCmluZGV4IGM3ZTU4ZmEuLmVlY2QwMWUgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVDdXJzb3IuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlQ3Vyc29yLmphdmEKQEAgLTE2LDIwICsxNiwxOSBAQAogCiBwYWNrYWdlIGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlOwogCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHlUaHJlYWQ7CiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5BYnN0cmFjdFdpbmRvd2VkQ3Vyc29yOwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yV2luZG93OwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuRGF0YVNldE9ic2VydmVyOwotaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuU1FMRXhjZXB0aW9uOwotCitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5SZXF1ZXJ5T25VaVRocmVhZEV4Y2VwdGlvbjsKIGltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5Mb29wZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOwogaW1wb3J0IGFuZHJvaWQub3MuUHJvY2VzczsKLWltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Db25maWc7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIAogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLlJlZW50cmFudExvY2s7CiAKQEAgLTc3LDYgKzc2LDExIEBACiAgICAgcHJpdmF0ZSBpbnQgbUN1cnNvclN0YXRlID0gMDsKICAgICBwcml2YXRlIFJlZW50cmFudExvY2sgbUxvY2sgPSBudWxsOwogICAgIHByaXZhdGUgYm9vbGVhbiBtUGVuZGluZ0RhdGEgPSBmYWxzZTsKKworICAgIC8qKgorICAgICAqIFVzZWQgYnkge0BsaW5rICNyZXF1ZXJ5KCl9IHRvIHJlbWVtYmVyIGZvciB3aGljaCBkYXRhYmFzZSB3ZSd2ZSBhbHJlYWR5IHNob3duIHRoZSB3YXJuaW5nLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEhhc2hNYXA8U3RyaW5nLCBCb29sZWFuPiBzQWxyZWFkeVdhcm5lZCA9IG5ldyBIYXNoTWFwPFN0cmluZywgQm9vbGVhbj4oKTsKICAgICAKICAgICAvKioKICAgICAgKiAgc3VwcG9ydCBmb3IgYSBjdXJzb3IgdmFyaWFudCB0aGF0IGRvZXNuJ3QgYWx3YXlzIHJlYWQgYWxsIHJlc3VsdHMKQEAgLTMyMSwxNjYgKzMyNSwxMSBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgLyoqCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZAotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGRlbGV0ZVJvdygpIHsKLSAgICAgICAgY2hlY2tQb3NpdGlvbigpOwotCi0gICAgICAgIC8vIE9ubHkgYWxsb3cgZGVsZXRlcyBpZiB0aGVyZSBpcyBhbiBJRCBjb2x1bW4sIGFuZCB0aGUgSUQgaGFzIGJlZW4gcmVhZCBmcm9tIGl0Ci0gICAgICAgIGlmIChtUm93SWRDb2x1bW5JbmRleCA9PSAtMSB8fCBtQ3VycmVudFJvd0lEID09IG51bGwpIHsKLSAgICAgICAgICAgIExvZy5lKFRBRywKLSAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBkZWxldGUgcm93IGJlY2F1c2UgZWl0aGVyIHRoZSByb3cgSUQgY29sdW1uIGlzIG5vdCBhdmFpbGFibGUgb3IgaXQiICsKLSAgICAgICAgICAgICAgICAgICAgImhhcyBub3QgYmVlbiByZWFkLiIpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgYm9vbGVhbiBzdWNjZXNzOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIEVuc3VyZSB3ZSBkb24ndCBjaGFuZ2UgdGhlIHN0YXRlIG9mIHRoZSBkYXRhYmFzZSB3aGVuIGFub3RoZXIKLSAgICAgICAgICogdGhyZWFkIGlzIGhvbGRpbmcgdGhlIGRhdGFiYXNlIGxvY2suIHJlcXVlcnkoKSBhbmQgbW92ZVRvKCkgYXJlIGFsc28KLSAgICAgICAgICogc3luY2hyb25pemVkIGhlcmUgdG8gbWFrZSBzdXJlIHRoZXkgZ2V0IHRoZSBzdGF0ZSBvZiB0aGUgZGF0YWJhc2UKLSAgICAgICAgICogaW1tZWRpYXRlbHkgZm9sbG93aW5nIHRoZSBERUxFVEUuCi0gICAgICAgICAqLwotICAgICAgICBtRGF0YWJhc2UubG9jaygpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBtRGF0YWJhc2UuZGVsZXRlKG1FZGl0VGFibGUsIG1Db2x1bW5zW21Sb3dJZENvbHVtbkluZGV4XSArICI9PyIsCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10ge21DdXJyZW50Um93SUQudG9TdHJpbmcoKX0pOwotICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPSB0cnVlOwotICAgICAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBzdWNjZXNzID0gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGludCBwb3MgPSBtUG9zOwotICAgICAgICAgICAgcmVxdWVyeSgpOwotCi0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogRW5zdXJlIHByb3BlciBjdXJzb3Igc3RhdGUuIE5vdGUgdGhhdCBtQ3VycmVudFJvd0lEIGNoYW5nZXMKLSAgICAgICAgICAgICAqIGluIHRoaXMgY2FsbC4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgbW92ZVRvUG9zaXRpb24ocG9zKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIG1EYXRhYmFzZS51bmxvY2soKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChzdWNjZXNzKSB7Ci0gICAgICAgICAgICBvbkNoYW5nZSh0cnVlKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZ1tdIGdldENvbHVtbk5hbWVzKCkgewogICAgICAgICByZXR1cm4gbUNvbHVtbnM7CiAgICAgfQogCi0gICAgLyoqCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZAotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzVXBkYXRlcygpIHsKLSAgICAgICAgcmV0dXJuIHN1cGVyLnN1cHBvcnRzVXBkYXRlcygpICYmICFUZXh0VXRpbHMuaXNFbXB0eShtRWRpdFRhYmxlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAaGlkZQotICAgICAqIEBkZXByZWNhdGVkCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gY29tbWl0VXBkYXRlcyhNYXA8PyBleHRlbmRzIExvbmcsCi0gICAgICAgICAgICA/IGV4dGVuZHMgTWFwPFN0cmluZywgT2JqZWN0Pj4gYWRkaXRpb25hbFZhbHVlcykgewotICAgICAgICBpZiAoIXN1cHBvcnRzVXBkYXRlcygpKSB7Ci0gICAgICAgICAgICBMb2cuZShUQUcsICJjb21taXRVcGRhdGVzIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBjdXJzb3IsIGRpZCB5b3UgIgotICAgICAgICAgICAgICAgICAgICArICJpbmNsdWRlIHRoZSBfaWQgY29sdW1uPyIpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogUHJldmVudCBvdGhlciB0aHJlYWRzIGZyb20gY2hhbmdpbmcgdGhlIHVwZGF0ZWQgcm93cyB3aGlsZSB0aGV5J3JlCi0gICAgICAgICAqIGJlaW5nIHByb2Nlc3NlZCBoZXJlLgotICAgICAgICAgKi8KLSAgICAgICAgc3luY2hyb25pemVkIChtVXBkYXRlZFJvd3MpIHsKLSAgICAgICAgICAgIGlmIChhZGRpdGlvbmFsVmFsdWVzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtVXBkYXRlZFJvd3MucHV0QWxsKGFkZGl0aW9uYWxWYWx1ZXMpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobVVwZGF0ZWRSb3dzLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiBQcmV2ZW50IG90aGVyIHRocmVhZHMgZnJvbSBjaGFuZ2luZyB0aGUgZGF0YWJhc2Ugc3RhdGUgd2hpbGUKLSAgICAgICAgICAgICAqIHdlIHByb2Nlc3MgdGhlIHVwZGF0ZWQgcm93cywgYW5kIHByZXZlbnRzIHVzIGZyb20gY2hhbmdpbmcgdGhlCi0gICAgICAgICAgICAgKiBkYXRhYmFzZSBiZWhpbmQgdGhlIGJhY2sgb2YgYW5vdGhlciB0aHJlYWQuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIG1EYXRhYmFzZS5iZWdpblRyYW5zYWN0aW9uKCk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgc3FsID0gbmV3IFN0cmluZ0J1aWxkZXIoMTI4KTsKLQotICAgICAgICAgICAgICAgIC8vIEZvciBlYWNoIHJvdyB0aGF0IGhhcyBiZWVuIHVwZGF0ZWQKLSAgICAgICAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxMb25nLCBNYXA8U3RyaW5nLCBPYmplY3Q+PiByb3dFbnRyeSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICBtVXBkYXRlZFJvd3MuZW50cnlTZXQoKSkgewotICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHZhbHVlcyA9IHJvd0VudHJ5LmdldFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgIExvbmcgcm93SWRPYmogPSByb3dFbnRyeS5nZXRLZXkoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAocm93SWRPYmogPT0gbnVsbCB8fCB2YWx1ZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigibnVsbCByb3dJZCBvciB2YWx1ZXMgZm91bmQhIHJvd0lkID0gIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHJvd0lkT2JqICsgIiwgdmFsdWVzID0gIiArIHZhbHVlcyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWVzLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGxvbmcgcm93SWQgPSByb3dJZE9iai5sb25nVmFsdWUoKTsKLQotICAgICAgICAgICAgICAgICAgICBJdGVyYXRvcjxNYXAuRW50cnk8U3RyaW5nLCBPYmplY3Q+PiB2YWx1ZXNJdGVyID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMuZW50cnlTZXQoKS5pdGVyYXRvcigpOwotCi0gICAgICAgICAgICAgICAgICAgIHNxbC5zZXRMZW5ndGgoMCk7Ci0gICAgICAgICAgICAgICAgICAgIHNxbC5hcHBlbmQoIlVQREFURSAiICsgbUVkaXRUYWJsZSArICIgU0VUICIpOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIEZvciBlYWNoIGNvbHVtbiB2YWx1ZSB0aGF0IGhhcyBiZWVuIHVwZGF0ZWQKLSAgICAgICAgICAgICAgICAgICAgT2JqZWN0W10gYmluZGluZ3MgPSBuZXcgT2JqZWN0W3ZhbHVlcy5zaXplKCldOwotICAgICAgICAgICAgICAgICAgICBpbnQgaSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIHdoaWxlICh2YWx1ZXNJdGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgTWFwLkVudHJ5PFN0cmluZywgT2JqZWN0PiBlbnRyeSA9IHZhbHVlc0l0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgc3FsLmFwcGVuZChlbnRyeS5nZXRLZXkoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzcWwuYXBwZW5kKCI9PyIpOwotICAgICAgICAgICAgICAgICAgICAgICAgYmluZGluZ3NbaV0gPSBlbnRyeS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlc0l0ZXIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3FsLmFwcGVuZCgiLCAiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHNxbC5hcHBlbmQoIiBXSEVSRSAiICsgbUNvbHVtbnNbbVJvd0lkQ29sdW1uSW5kZXhdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAnPScgKyByb3dJZCk7Ci0gICAgICAgICAgICAgICAgICAgIHNxbC5hcHBlbmQoJzsnKTsKLSAgICAgICAgICAgICAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoc3FsLnRvU3RyaW5nKCksIGJpbmRpbmdzKTsKLSAgICAgICAgICAgICAgICAgICAgbURhdGFiYXNlLnJvd1VwZGF0ZWQobUVkaXRUYWJsZSwgcm93SWQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtRGF0YWJhc2Uuc2V0VHJhbnNhY3Rpb25TdWNjZXNzZnVsKCk7Ci0gICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgIG1EYXRhYmFzZS5lbmRUcmFuc2FjdGlvbigpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtVXBkYXRlZFJvd3MuY2xlYXIoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIExldCBhbnkgY2hhbmdlIG9ic2VydmVycyBrbm93IGFib3V0IHRoZSB1cGRhdGUKLSAgICAgICAgb25DaGFuZ2UodHJ1ZSk7Ci0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCiAgICAgcHJpdmF0ZSB2b2lkIGRlYWN0aXZhdGVDb21tb24oKSB7CiAgICAgICAgIGlmIChDb25maWcuTE9HVikgTG9nLnYoVEFHLCAiPDw8IFJlbGVhc2luZyBjdXJzb3IgIiArIHRoaXMpOwogICAgICAgICBtQ3Vyc29yU3RhdGUgPSAwOwpAQCAtNTA2LDExICszNTUsMzAgQEAKICAgICAgICAgbURyaXZlci5jdXJzb3JDbG9zZWQoKTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBTaG93IGEgd2FybmluZyBhZ2FpbnN0IHRoZSB1c2Ugb2YgcmVxdWVyeSgpIGlmIGNhbGxlZCBvbiB0aGUgbWFpbiB0aHJlYWQuCisgICAgICogVGhpcyB3YXJuaW5nIGlzIHNob3duIHBlciBkYXRhYmFzZSBwZXIgcHJvY2Vzcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgd2FybklmVWlUaHJlYWQoKSB7CisgICAgICAgIGlmIChMb29wZXIuZ2V0TWFpbkxvb3BlcigpID09IExvb3Blci5teUxvb3BlcigpKSB7CisgICAgICAgICAgICBTdHJpbmcgZGF0YWJhc2VQYXRoID0gbURhdGFiYXNlLmdldFBhdGgoKTsKKyAgICAgICAgICAgIC8vIFdlIHNob3cgdGhlIHdhcm5pbmcgb25jZSBwZXIgZGF0YWJhc2UgaW4gb3JkZXIgbm90IHRvIHNwYW0gbG9nY2F0LgorICAgICAgICAgICAgaWYgKCFzQWxyZWFkeVdhcm5lZC5jb250YWluc0tleShkYXRhYmFzZVBhdGgpKSB7CisgICAgICAgICAgICAgICAgc0FscmVhZHlXYXJuZWQucHV0KGRhdGFiYXNlUGF0aCwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgU3RyaW5nIHBhY2thZ2VOYW1lID0gQWN0aXZpdHlUaHJlYWQuY3VycmVudFBhY2thZ2VOYW1lKCk7CisgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAic2hvdWxkIG5vdCBhdHRlbXB0IHJlcXVlcnkgb24gbWFpbiAoVUkpIHRocmVhZDogYXBwID0gIiArCisgICAgICAgICAgICAgICAgICAgICAgICBwYWNrYWdlTmFtZSA9PSBudWxsID8gIid1bmtub3duJyIgOiBwYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBSZXF1ZXJ5T25VaVRocmVhZEV4Y2VwdGlvbihwYWNrYWdlTmFtZSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gcmVxdWVyeSgpIHsKICAgICAgICAgaWYgKGlzQ2xvc2VkKCkpIHsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQorICAgICAgICB3YXJuSWZVaVRocmVhZCgpOwogICAgICAgICBsb25nIHRpbWVTdGFydCA9IDA7CiAgICAgICAgIGlmIChDb25maWcuTE9HVikgewogICAgICAgICAgICAgdGltZVN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlRGF0YWJhc2UuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVEYXRhYmFzZS5qYXZhCmluZGV4IGNkYzliYmIuLmVlYzAzYjIgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVEYXRhYmFzZS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVEYXRhYmFzZS5qYXZhCkBAIC0xNiwxNiArMTYsMTcgQEAKIAogcGFja2FnZSBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZTsKIAotaW1wb3J0IGNvbS5nb29nbGUuYW5kcm9pZC5jb2xsZWN0Lk1hcHM7Ci0KIGltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eVRocmVhZDsKIGltcG9ydCBhbmRyb2lkLmFwcC5BcHBHbG9iYWxzOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50VmFsdWVzOwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yOworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuRGF0YWJhc2VFcnJvckhhbmRsZXI7CiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5EYXRhYmFzZVV0aWxzOworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuRGVmYXVsdERhdGFiYXNlRXJyb3JIYW5kbGVyOwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuU1FMRXhjZXB0aW9uOwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURlYnVnLkRiU3RhdHM7CiBpbXBvcnQgYW5kcm9pZC5vcy5EZWJ1ZzsKK2ltcG9ydCBhbmRyb2lkLm9zLlN0YXRGczsKIGltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOwogaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtUHJvcGVydGllczsKIGltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwpAQCAtMzgsMTEgKzM5LDExIEBACiAKIGltcG9ydCBqYXZhLmlvLkZpbGU7CiBpbXBvcnQgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlOwotaW1wb3J0IGphdmEudGV4dC5TaW1wbGVEYXRlRm9ybWF0OwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CiBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIGltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOwpAQCAtMjMzLDQ4ICsyMzQsODEgQEAKICAgICAvLyBsb2NrIGFjcXVpc3Rpb25zIG9mIHRoZSBkYXRhYmFzZS4KICAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VUX0xPQ0tfTE9HX1BSRUZJWCA9ICJHRVRMT0NLOiI7CiAKLSAgICAvKiogVXNlZCBieSBuYXRpdmUgY29kZSwgZG8gbm90IHJlbmFtZSAqLwotICAgIC8qIHBhY2thZ2UgKi8gaW50IG1OYXRpdmVIYW5kbGUgPSAwOworICAgIC8qKiBVc2VkIGJ5IG5hdGl2ZSBjb2RlLCBkbyBub3QgcmVuYW1lLiBtYWtlIGl0IHZvbGF0aWxlLCBzbyBpdCBpcyB0aHJlYWQtc2FmZS4gKi8KKyAgICAvKiBwYWNrYWdlICovIHZvbGF0aWxlIGludCBtTmF0aXZlSGFuZGxlID0gMDsKIAogICAgIC8qKiBVc2VkIHRvIG1ha2UgdGVtcCB0YWJsZSBuYW1lcyB1bmlxdWUgKi8KICAgICAvKiBwYWNrYWdlICovIGludCBtVGVtcFRhYmxlU2VxdWVuY2UgPSAwOwogCisgICAgLyoqCisgICAgICogVGhlIHNpemUsIGluIGJ5dGVzLCBvZiBhIGJsb2NrIG9uICIvZGF0YSIuIFRoaXMgY29ycmVzcG9uZHMgdG8gdGhlIFVuaXgKKyAgICAgKiBzdGF0ZnMuZl9ic2l6ZSBmaWVsZC4gbm90ZSB0aGF0IHRoaXMgZmllbGQgaXMgbGF6aWx5IGluaXRpYWxpemVkLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGludCBzQmxvY2tTaXplID0gMDsKKwogICAgIC8qKiBUaGUgcGF0aCBmb3IgdGhlIGRhdGFiYXNlIGZpbGUgKi8KLSAgICBwcml2YXRlIFN0cmluZyBtUGF0aDsKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtUGF0aDsKIAogICAgIC8qKiBUaGUgYW5vbnltaXplZCBwYXRoIGZvciB0aGUgZGF0YWJhc2UgZmlsZSBmb3IgbG9nZ2luZyBwdXJwb3NlcyAqLwogICAgIHByaXZhdGUgU3RyaW5nIG1QYXRoRm9yTG9ncyA9IG51bGw7ICAvLyBsYXppbHkgcG9wdWxhdGVkCiAKICAgICAvKiogVGhlIGZsYWdzIHBhc3NlZCB0byBvcGVuL2NyZWF0ZSAqLwotICAgIHByaXZhdGUgaW50IG1GbGFnczsKKyAgICBwcml2YXRlIGZpbmFsIGludCBtRmxhZ3M7CiAKICAgICAvKiogVGhlIG9wdGlvbmFsIGZhY3RvcnkgdG8gdXNlIHdoZW4gY3JlYXRpbmcgbmV3IEN1cnNvcnMgKi8KLSAgICBwcml2YXRlIEN1cnNvckZhY3RvcnkgbUZhY3Rvcnk7CisgICAgcHJpdmF0ZSBmaW5hbCBDdXJzb3JGYWN0b3J5IG1GYWN0b3J5OwogCi0gICAgcHJpdmF0ZSBXZWFrSGFzaE1hcDxTUUxpdGVDbG9zYWJsZSwgT2JqZWN0PiBtUHJvZ3JhbXM7CisgICAgcHJpdmF0ZSBmaW5hbCBXZWFrSGFzaE1hcDxTUUxpdGVDbG9zYWJsZSwgT2JqZWN0PiBtUHJvZ3JhbXM7CiAKICAgICAvKioKLSAgICAgKiBmb3IgZWFjaCBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLCBhIGNhY2hlIGlzIG1haW50YWluZWQgdG8gc3RvcmUKKyAgICAgKiBmb3IgZWFjaCBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLCBhIExSVSBjYWNoZSBpcyBtYWludGFpbmVkIHRvIHN0b3JlCiAgICAgICogdGhlIGNvbXBpbGVkIHF1ZXJ5IHN0YXRlbWVudCBpZHMgcmV0dXJuZWQgYnkgc3FsaXRlIGRhdGFiYXNlLgotICAgICAqICAgICBrZXkgPSBzcWwgc3RhdGVtZW50IHdpdGggIj8iIGZvciBiaW5kIGFyZ3MKKyAgICAgKiAgICAga2V5ID0gU1FMIHN0YXRlbWVudCB3aXRoICI/IiBmb3IgYmluZCBhcmdzCiAgICAgICogICAgIHZhbHVlID0ge0BsaW5rIFNRTGl0ZUNvbXBpbGVkU3FsfQogICAgICAqIElmIGFuIGFwcGxpY2F0aW9uIG9wZW5zIHRoZSBkYXRhYmFzZSBhbmQga2VlcHMgaXQgb3BlbiBkdXJpbmcgaXRzIGVudGlyZSBsaWZlLCB0aGVuCi0gICAgICogdGhlcmUgd2lsbCBub3QgYmUgYW4gb3ZlcmhlYWQgb2YgY29tcGlsYXRpb24gb2Ygc3FsIHN0YXRlbWVudHMgYnkgc3FsaXRlLgorICAgICAqIHRoZXJlIHdpbGwgbm90IGJlIGFuIG92ZXJoZWFkIG9mIGNvbXBpbGF0aW9uIG9mIFNRTCBzdGF0ZW1lbnRzIGJ5IHNxbGl0ZS4KICAgICAgKgogICAgICAqIHdoeSBpcyB0aGlzIGNhY2hlIE5PVCBzdGF0aWM/IGJlY2F1c2Ugc3FsaXRlIGF0dGFjaGVzIGNvbXBpbGVkc3FsIHN0YXRlbWVudHMgdG8gdGhlCiAgICAgICogc3RydWN0IGNyZWF0ZWQgd2hlbiB7QGxpbmsgU1FMaXRlRGF0YWJhc2Ujb3BlbkRhdGFiYXNlKFN0cmluZywgQ3Vyc29yRmFjdG9yeSwgaW50KX0gaXMKICAgICAgKiBpbnZva2VkLgogICAgICAqCiAgICAgICogdGhpcyBjYWNoZSBoYXMgYW4gdXBwZXIgbGltaXQgb2YgbU1heFNxbENhY2hlU2l6ZSAoc2V0dGFibGUgYnkgY2FsbGluZyB0aGUgbWV0aG9kCi0gICAgICogKEBsaW5rIHNldE1heENhY2hlU2l6ZShpbnQpfSkuIGl0cyBkZWZhdWx0IGlzIDAgLSBpLmUuLCBubyBjYWNoaW5nIGJ5IGRlZmF1bHQgYmVjYXVzZQotICAgICAqIG1vc3Qgb2YgdGhlIGFwcHMgZG9uJ3QgdXNlICI/IiBzeW50YXggaW4gdGhlaXIgc3FsLCBjYWNoaW5nIGlzIG5vdCB1c2VmdWwgZm9yIHRoZW0uCisgICAgICogKEBsaW5rIHNldE1heFNxbENhY2hlU2l6ZShpbnQpfSkuCiAgICAgICovCi0gICAgLyogcGFja2FnZSAqLyBNYXA8U3RyaW5nLCBTUUxpdGVDb21waWxlZFNxbD4gbUNvbXBpbGVkUXVlcmllcyA9IE1hcHMubmV3SGFzaE1hcCgpOworICAgIC8vIGRlZmF1bHQgc3RhdGVtZW50LWNhY2hlIHNpemUgcGVyIGRhdGFiYXNlIGNvbm5lY3Rpb24gKCA9IGluc3RhbmNlIG9mIHRoaXMgY2xhc3MpCisgICAgcHJpdmF0ZSBpbnQgbU1heFNxbENhY2hlU2l6ZSA9IDI1OworICAgIC8qIHBhY2thZ2UgKi8gZmluYWwgTWFwPFN0cmluZywgU1FMaXRlQ29tcGlsZWRTcWw+IG1Db21waWxlZFF1ZXJpZXMgPQorICAgICAgICBuZXcgTGlua2VkSGFzaE1hcDxTdHJpbmcsIFNRTGl0ZUNvbXBpbGVkU3FsPihtTWF4U3FsQ2FjaGVTaXplICsgMSwgMC43NWYsIHRydWUpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlRWxkZXN0RW50cnkoTWFwLkVudHJ5PFN0cmluZywgU1FMaXRlQ29tcGlsZWRTcWw+IGVsZGVzdCkgeworICAgICAgICAgICAgICAgIC8vIGVsZGVzdCA9IGxlYXN0LXJlY2VudGx5IHVzZWQgZW50cnkKKyAgICAgICAgICAgICAgICAvLyBpZiBpdCBuZWVkcyB0byBiZSByZW1vdmVkIHRvIGFjY29tbW9kYXRlIGEgbmV3IGVudHJ5LAorICAgICAgICAgICAgICAgIC8vICAgICBjbG9zZSB7QGxpbmsgU1FMaXRlQ29tcGlsZWRTcWx9IHJlcHJlc2VudGVkIGJ5IHRoaXMgZW50cnksIGlmIG5vdCBpbiB1c2UKKyAgICAgICAgICAgICAgICAvLyAgICAgYW5kIHRoZW4gbGV0IGl0IGJlIHJlbW92ZWQgZnJvbSB0aGUgTWFwLgorICAgICAgICAgICAgICAgIC8vIHdoZW4gdGhpcyBpcyBjYWxsZWQsIHRoZSBjYWxsZXIgbXVzdCBiZSB0cnlpbmcgdG8gYWRkIGEganVzdC1jb21waWxlZCBzdG10CisgICAgICAgICAgICAgICAgLy8gdG8gY2FjaGU7IGkuZS4sIGNhbGxlciBzaG91bGQgYWxyZWFkeSBoYXZlIGFjcXVpcmVkIGRhdGFiYXNlIGxvY2sgQU5ECisgICAgICAgICAgICAgICAgLy8gdGhlIGxvY2sgb24gbUNvbXBpbGVkUXVlcmllcy4gZG8gYXMgYXNzZXJ0IG9mIHRoZXNlIHR3byAyIGZhY3RzLgorICAgICAgICAgICAgICAgIHZlcmlmeUxvY2tPd25lcigpOworICAgICAgICAgICAgICAgIGlmICh0aGlzLnNpemUoKSA8PSBtTWF4U3FsQ2FjaGVTaXplKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGNhY2hlIGlzIG5vdCBmdWxsLiBub3RoaW5nIG5lZWRzIHRvIGJlIHJlbW92ZWQKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBjYWNoZSBpcyBmdWxsLiBlbGRlc3Qgd2lsbCBiZSByZW1vdmVkLgorICAgICAgICAgICAgICAgIFNRTGl0ZUNvbXBpbGVkU3FsIGVudHJ5ID0gZWxkZXN0LmdldFZhbHVlKCk7CisgICAgICAgICAgICAgICAgaWYgKCFlbnRyeS5pc0luVXNlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyB7QGxpbmsgU1FMaXRlQ29tcGlsZWRTcWx9IGlzIG5vdCBpbiB1c2UuIHJlbGVhc2UgaXQuCisgICAgICAgICAgICAgICAgICAgIGVudHJ5LnJlbGVhc2VTcWxTdGF0ZW1lbnQoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gcmV0dXJuIHRydWUsIHNvIHRoYXQgdGhpcyBlbnRyeSBpcyByZW1vdmVkIGF1dG9tYXRpY2FsbHkgYnkgdGhlIGNhbGxlci4KKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKICAgICAvKioKLSAgICAgKiBAaGlkZQorICAgICAqIGFic29sdXRlIG1heCB2YWx1ZSB0aGF0IGNhbiBiZSBzZXQgYnkge0BsaW5rICNzZXRNYXhTcWxDYWNoZVNpemUoaW50KX0KKyAgICAgKiBzaXplIG9mIGVhY2ggcHJlcGFyZWQtc3RhdGVtZW50IGlzIGJldHdlZW4gMUsgLSA2SywgZGVwZW5kaW5nIG9uIHRoZSBjb21wbGV4aXR5IG9mIHRoZQorICAgICAqIFNRTCBzdGF0ZW1lbnQgJiBzY2hlbWEuCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFYX1NRTF9DQUNIRV9TSVpFID0gMjUwOwotICAgIHByaXZhdGUgaW50IG1NYXhTcWxDYWNoZVNpemUgPSBNQVhfU1FMX0NBQ0hFX1NJWkU7IC8vIG1heCBjYWNoZSBzaXplIHBlciBEYXRhYmFzZSBpbnN0YW5jZQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BWF9TUUxfQ0FDSEVfU0laRSA9IDEwMDsKICAgICBwcml2YXRlIGludCBtQ2FjaGVGdWxsV2FybmluZ3M7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9XQVJOSU5HU19PTl9DQUNIRVNJWkVfQ09ORElUSU9OID0gMTsKIApAQCAtMjgyLDE3ICszMTYsMzQgQEAKICAgICBwcml2YXRlIGludCBtTnVtQ2FjaGVIaXRzOwogICAgIHByaXZhdGUgaW50IG1OdW1DYWNoZU1pc3NlczsKIAotICAgIC8qKiB0aGUgZm9sbG93aW5nIDIgbWVtYmVycyBtYWludGFpbiB0aGUgdGltZSB3aGVuIGEgZGF0YWJhc2UgaXMgb3BlbmVkIGFuZCBjbG9zZWQgKi8KLSAgICBwcml2YXRlIFN0cmluZyBtVGltZU9wZW5lZCA9IG51bGw7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbVRpbWVDbG9zZWQgPSBudWxsOwotCiAgICAgLyoqIFVzZWQgdG8gZmluZCBvdXQgd2hlcmUgdGhpcyBvYmplY3Qgd2FzIGNyZWF0ZWQgaW4gY2FzZSBpdCBuZXZlciBnb3QgY2xvc2VkLiAqLwotICAgIHByaXZhdGUgVGhyb3dhYmxlIG1TdGFja1RyYWNlID0gbnVsbDsKKyAgICBwcml2YXRlIGZpbmFsIFRocm93YWJsZSBtU3RhY2tUcmFjZTsKIAogICAgIC8vIFN5c3RlbSBwcm9wZXJ0eSB0aGF0IGVuYWJsZXMgbG9nZ2luZyBvZiBzbG93IHF1ZXJpZXMuIFNwZWNpZnkgdGhlIHRocmVzaG9sZCBpbiBtcy4KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1NMT1dfUVVFUklFU19QUk9QRVJUWSA9ICJkYi5sb2cuc2xvd19xdWVyeV90aHJlc2hvbGQiOwogICAgIHByaXZhdGUgZmluYWwgaW50IG1TbG93UXVlcnlUaHJlc2hvbGQ7CiAKKyAgICAvKiogc3RvcmVzIHRoZSBsaXN0IG9mIHN0YXRlbWVudCBpZHMgdGhhdCBuZWVkIHRvIGJlIGZpbmFsaXplZCBieSBzcWxpdGUgKi8KKyAgICBwcml2YXRlIGZpbmFsIEFycmF5TGlzdDxJbnRlZ2VyPiBtQ2xvc2VkU3RhdGVtZW50SWRzID0gbmV3IEFycmF5TGlzdDxJbnRlZ2VyPigpOworCisgICAgLyoqIHtAbGluayBEYXRhYmFzZUVycm9ySGFuZGxlcn0gdG8gYmUgdXNlZCB3aGVuIFNRTGl0ZSByZXR1cm5zIGFueSBvZiB0aGUgZm9sbG93aW5nIGVycm9ycworICAgICAqICAgIENvcnJ1cHRpb24KKyAgICAgKiAqLworICAgIHByaXZhdGUgZmluYWwgRGF0YWJhc2VFcnJvckhhbmRsZXIgbUVycm9ySGFuZGxlcjsKKworICAgIC8qKiBUaGUgRGF0YWJhc2UgY29ubmVjdGlvbiBwb29sIHtAbGluayBEYXRhYmFzZUNvbm5lY3Rpb25Qb29sfS4KKyAgICAgKiBWaXNpYmlsaXR5IGlzIHBhY2thZ2UtcHJpdmF0ZSBmb3IgdGVzdGluZyBwdXJwb3Nlcy4gb3RoZXJ3aXNlLCBwcml2YXRlIHZpc2liaWxpdHkgaXMgZW5vdWdoLgorICAgICAqLworICAgIC8qIHBhY2thZ2UgKi8gdm9sYXRpbGUgRGF0YWJhc2VDb25uZWN0aW9uUG9vbCBtQ29ubmVjdGlvblBvb2wgPSBudWxsOworCisgICAgLyoqIEVhY2ggZGF0YWJhc2UgY29ubmVjdGlvbiBoYW5kbGUgaW4gdGhlIHBvb2wgaXMgYXNzaWduZWQgYSBudW1iZXIgMS4uTiwgd2hlcmUgTiBpcyB0aGUKKyAgICAgKiBzaXplIG9mIHRoZSBjb25uZWN0aW9uIHBvb2wuCisgICAgICogVGhlIG1haW4gY29ubmVjdGlvbiBoYW5kbGUgdG8gd2hpY2ggdGhlIHBvb2wgaXMgYXR0YWNoZWQgaXMgYXNzaWduZWQgYSB2YWx1ZSBvZiAwLgorICAgICAqLworICAgIC8qIHBhY2thZ2UgKi8gZmluYWwgc2hvcnQgbUNvbm5lY3Rpb25OdW07CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVNT1JZX0RCX1BBVEggPSAiOm1lbW9yeToiOworCiAgICAgLyoqCiAgICAgICogQHBhcmFtIGNsb3NhYmxlCiAgICAgICovCkBAIC0zMTcsMTAgKzM2OCw4IEBACiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgb25BbGxSZWZlcmVuY2VzUmVsZWFzZWQoKSB7CiAgICAgICAgIGlmIChpc09wZW4oKSkgewotICAgICAgICAgICAgaWYgKFNRTGl0ZURlYnVnLkRFQlVHX1NRTF9DQUNIRSkgewotICAgICAgICAgICAgICAgIG1UaW1lQ2xvc2VkID0gZ2V0VGltZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZGJjbG9zZSgpOworICAgICAgICAgICAgLy8gY2xvc2UgdGhlIGRhdGFiYXNlIHdoaWNoIHdpbGwgY2xvc2UgYWxsIHBlbmRpbmcgc3RhdGVtZW50cyB0byBiZSBmaW5hbGl6ZWQgYWxzbworICAgICAgICAgICAgY2xvc2UoKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMzUwLDE5ICszOTksOCBAQAogICAgIHByaXZhdGUgYm9vbGVhbiBtTG9ja2luZ0VuYWJsZWQgPSB0cnVlOwogCiAgICAgLyogcGFja2FnZSAqLyB2b2lkIG9uQ29ycnVwdGlvbigpIHsKLSAgICAgICAgTG9nLmUoVEFHLCAiUmVtb3ZpbmcgY29ycnVwdCBkYXRhYmFzZTogIiArIG1QYXRoKTsKICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFVkVOVF9EQl9DT1JSVVBULCBtUGF0aCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBDbG9zZSB0aGUgZGF0YWJhc2UgKGlmIHdlIGNhbiksIHdoaWNoIHdpbGwgY2F1c2Ugc3Vic2VxdWVudCBvcGVyYXRpb25zIHRvIGZhaWwuCi0gICAgICAgICAgICBjbG9zZSgpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgLy8gRGVsZXRlIHRoZSBjb3JydXB0IGZpbGUuICBEb24ndCByZS1jcmVhdGUgaXQgbm93IC0tIHRoYXQgd291bGQganVzdCBjb25mdXNlIHBlb3BsZQotICAgICAgICAgICAgLy8gLS0gYnV0IHRoZSBuZXh0IHRpbWUgc29tZW9uZSB0cmllcyB0byBvcGVuIGl0LCB0aGV5IGNhbiBzZXQgaXQgdXAgZnJvbSBzY3JhdGNoLgotICAgICAgICAgICAgaWYgKCFtUGF0aC5lcXVhbHNJZ25vcmVDYXNlKCI6bWVtb3J5IikpIHsKLSAgICAgICAgICAgICAgICAvLyBkZWxldGUgaXMgb25seSBmb3Igbm9uLW1lbW9yeSBkYXRhYmFzZSBmaWxlcwotICAgICAgICAgICAgICAgIG5ldyBGaWxlKG1QYXRoKS5kZWxldGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICAgICAgICBtRXJyb3JIYW5kbGVyLm9uQ29ycnVwdGlvbih0aGlzKTsKICAgICB9CiAKICAgICAvKioKQEAgLTQ2MCwxMSArNDk4LDE0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQmVnaW5zIGEgdHJhbnNhY3Rpb24uIFRyYW5zYWN0aW9ucyBjYW4gYmUgbmVzdGVkLiBXaGVuIHRoZSBvdXRlciB0cmFuc2FjdGlvbiBpcyBlbmRlZCBhbGwgb2YKKyAgICAgKiBCZWdpbnMgYSB0cmFuc2FjdGlvbiBpbiBFWENMVVNJVkUgbW9kZS4KKyAgICAgKiA8cD4KKyAgICAgKiBUcmFuc2FjdGlvbnMgY2FuIGJlIG5lc3RlZC4KKyAgICAgKiBXaGVuIHRoZSBvdXRlciB0cmFuc2FjdGlvbiBpcyBlbmRlZCBhbGwgb2YKICAgICAgKiB0aGUgd29yayBkb25lIGluIHRoYXQgdHJhbnNhY3Rpb24gYW5kIGFsbCBvZiB0aGUgbmVzdGVkIHRyYW5zYWN0aW9ucyB3aWxsIGJlIGNvbW1pdHRlZCBvcgogICAgICAqIHJvbGxlZCBiYWNrLiBUaGUgY2hhbmdlcyB3aWxsIGJlIHJvbGxlZCBiYWNrIGlmIGFueSB0cmFuc2FjdGlvbiBpcyBlbmRlZCB3aXRob3V0IGJlaW5nCiAgICAgICogbWFya2VkIGFzIGNsZWFuIChieSBjYWxsaW5nIHNldFRyYW5zYWN0aW9uU3VjY2Vzc2Z1bCkuIE90aGVyd2lzZSB0aGV5IHdpbGwgYmUgY29tbWl0dGVkLgotICAgICAqCisgICAgICogPC9wPgogICAgICAqIDxwPkhlcmUgaXMgdGhlIHN0YW5kYXJkIGlkaW9tIGZvciB0cmFuc2FjdGlvbnM6CiAgICAgICoKICAgICAgKiA8cHJlPgpAQCAtNDc4LDE1ICs1MTksNDIgQEAKICAgICAgKiA8L3ByZT4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBiZWdpblRyYW5zYWN0aW9uKCkgewotICAgICAgICBiZWdpblRyYW5zYWN0aW9uV2l0aExpc3RlbmVyKG51bGwgLyogdHJhbnNhY3Rpb25TdGF0dXNDYWxsYmFjayAqLyk7CisgICAgICAgIGJlZ2luVHJhbnNhY3Rpb24obnVsbCAvKiB0cmFuc2FjdGlvblN0YXR1c0NhbGxiYWNrICovLCB0cnVlKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBCZWdpbnMgYSB0cmFuc2FjdGlvbi4gVHJhbnNhY3Rpb25zIGNhbiBiZSBuZXN0ZWQuIFdoZW4gdGhlIG91dGVyIHRyYW5zYWN0aW9uIGlzIGVuZGVkIGFsbCBvZgorICAgICAqIEJlZ2lucyBhIHRyYW5zYWN0aW9uIGluIElNTUVESUFURSBtb2RlLiBUcmFuc2FjdGlvbnMgY2FuIGJlIG5lc3RlZC4gV2hlbgorICAgICAqIHRoZSBvdXRlciB0cmFuc2FjdGlvbiBpcyBlbmRlZCBhbGwgb2YgdGhlIHdvcmsgZG9uZSBpbiB0aGF0IHRyYW5zYWN0aW9uCisgICAgICogYW5kIGFsbCBvZiB0aGUgbmVzdGVkIHRyYW5zYWN0aW9ucyB3aWxsIGJlIGNvbW1pdHRlZCBvciByb2xsZWQgYmFjay4gVGhlCisgICAgICogY2hhbmdlcyB3aWxsIGJlIHJvbGxlZCBiYWNrIGlmIGFueSB0cmFuc2FjdGlvbiBpcyBlbmRlZCB3aXRob3V0IGJlaW5nCisgICAgICogbWFya2VkIGFzIGNsZWFuIChieSBjYWxsaW5nIHNldFRyYW5zYWN0aW9uU3VjY2Vzc2Z1bCkuIE90aGVyd2lzZSB0aGV5CisgICAgICogd2lsbCBiZSBjb21taXR0ZWQuCisgICAgICogPHA+CisgICAgICogSGVyZSBpcyB0aGUgc3RhbmRhcmQgaWRpb20gZm9yIHRyYW5zYWN0aW9uczoKKyAgICAgKgorICAgICAqIDxwcmU+CisgICAgICogICBkYi5iZWdpblRyYW5zYWN0aW9uTm9uRXhjbHVzaXZlKCk7CisgICAgICogICB0cnkgeworICAgICAqICAgICAuLi4KKyAgICAgKiAgICAgZGIuc2V0VHJhbnNhY3Rpb25TdWNjZXNzZnVsKCk7CisgICAgICogICB9IGZpbmFsbHkgeworICAgICAqICAgICBkYi5lbmRUcmFuc2FjdGlvbigpOworICAgICAqICAgfQorICAgICAqIDwvcHJlPgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGJlZ2luVHJhbnNhY3Rpb25Ob25FeGNsdXNpdmUoKSB7CisgICAgICAgIGJlZ2luVHJhbnNhY3Rpb24obnVsbCAvKiB0cmFuc2FjdGlvblN0YXR1c0NhbGxiYWNrICovLCBmYWxzZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQmVnaW5zIGEgdHJhbnNhY3Rpb24gaW4gRVhDTFVTSVZFIG1vZGUuCisgICAgICogPHA+CisgICAgICogVHJhbnNhY3Rpb25zIGNhbiBiZSBuZXN0ZWQuCisgICAgICogV2hlbiB0aGUgb3V0ZXIgdHJhbnNhY3Rpb24gaXMgZW5kZWQgYWxsIG9mCiAgICAgICogdGhlIHdvcmsgZG9uZSBpbiB0aGF0IHRyYW5zYWN0aW9uIGFuZCBhbGwgb2YgdGhlIG5lc3RlZCB0cmFuc2FjdGlvbnMgd2lsbCBiZSBjb21taXR0ZWQgb3IKICAgICAgKiByb2xsZWQgYmFjay4gVGhlIGNoYW5nZXMgd2lsbCBiZSByb2xsZWQgYmFjayBpZiBhbnkgdHJhbnNhY3Rpb24gaXMgZW5kZWQgd2l0aG91dCBiZWluZwogICAgICAqIG1hcmtlZCBhcyBjbGVhbiAoYnkgY2FsbGluZyBzZXRUcmFuc2FjdGlvblN1Y2Nlc3NmdWwpLiBPdGhlcndpc2UgdGhleSB3aWxsIGJlIGNvbW1pdHRlZC4KLSAgICAgKgorICAgICAqIDwvcD4KICAgICAgKiA8cD5IZXJlIGlzIHRoZSBzdGFuZGFyZCBpZGlvbSBmb3IgdHJhbnNhY3Rpb25zOgogICAgICAqCiAgICAgICogPHByZT4KQEAgLTQ5OCwxNSArNTY2LDQ4IEBACiAgICAgICogICAgIGRiLmVuZFRyYW5zYWN0aW9uKCk7CiAgICAgICogICB9CiAgICAgICogPC9wcmU+CisgICAgICoKICAgICAgKiBAcGFyYW0gdHJhbnNhY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciB0aGF0IHNob3VsZCBiZSBub3RpZmllZCB3aGVuIHRoZSB0cmFuc2FjdGlvbiBiZWdpbnMsCiAgICAgICogY29tbWl0cywgb3IgaXMgcm9sbGVkIGJhY2ssIGVpdGhlciBleHBsaWNpdGx5IG9yIGJ5IGEgY2FsbCB0bwogICAgICAqIHtAbGluayAjeWllbGRJZkNvbnRlbmRlZFNhZmVseX0uCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgYmVnaW5UcmFuc2FjdGlvbldpdGhMaXN0ZW5lcihTUUxpdGVUcmFuc2FjdGlvbkxpc3RlbmVyIHRyYW5zYWN0aW9uTGlzdGVuZXIpIHsKKyAgICAgICAgYmVnaW5UcmFuc2FjdGlvbih0cmFuc2FjdGlvbkxpc3RlbmVyLCB0cnVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBCZWdpbnMgYSB0cmFuc2FjdGlvbiBpbiBJTU1FRElBVEUgbW9kZS4gVHJhbnNhY3Rpb25zIGNhbiBiZSBuZXN0ZWQuIFdoZW4KKyAgICAgKiB0aGUgb3V0ZXIgdHJhbnNhY3Rpb24gaXMgZW5kZWQgYWxsIG9mIHRoZSB3b3JrIGRvbmUgaW4gdGhhdCB0cmFuc2FjdGlvbgorICAgICAqIGFuZCBhbGwgb2YgdGhlIG5lc3RlZCB0cmFuc2FjdGlvbnMgd2lsbCBiZSBjb21taXR0ZWQgb3Igcm9sbGVkIGJhY2suIFRoZQorICAgICAqIGNoYW5nZXMgd2lsbCBiZSByb2xsZWQgYmFjayBpZiBhbnkgdHJhbnNhY3Rpb24gaXMgZW5kZWQgd2l0aG91dCBiZWluZworICAgICAqIG1hcmtlZCBhcyBjbGVhbiAoYnkgY2FsbGluZyBzZXRUcmFuc2FjdGlvblN1Y2Nlc3NmdWwpLiBPdGhlcndpc2UgdGhleQorICAgICAqIHdpbGwgYmUgY29tbWl0dGVkLgorICAgICAqIDxwPgorICAgICAqIEhlcmUgaXMgdGhlIHN0YW5kYXJkIGlkaW9tIGZvciB0cmFuc2FjdGlvbnM6CisgICAgICoKKyAgICAgKiA8cHJlPgorICAgICAqICAgZGIuYmVnaW5UcmFuc2FjdGlvbldpdGhMaXN0ZW5lck5vbkV4Y2x1c2l2ZShsaXN0ZW5lcik7CisgICAgICogICB0cnkgeworICAgICAqICAgICAuLi4KKyAgICAgKiAgICAgZGIuc2V0VHJhbnNhY3Rpb25TdWNjZXNzZnVsKCk7CisgICAgICogICB9IGZpbmFsbHkgeworICAgICAqICAgICBkYi5lbmRUcmFuc2FjdGlvbigpOworICAgICAqICAgfQorICAgICAqIDwvcHJlPgorICAgICAqCisgICAgICogQHBhcmFtIHRyYW5zYWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgdGhhdCBzaG91bGQgYmUgbm90aWZpZWQgd2hlbiB0aGUKKyAgICAgKiAgICAgICAgICAgIHRyYW5zYWN0aW9uIGJlZ2lucywgY29tbWl0cywgb3IgaXMgcm9sbGVkIGJhY2ssIGVpdGhlcgorICAgICAqICAgICAgICAgICAgZXhwbGljaXRseSBvciBieSBhIGNhbGwgdG8ge0BsaW5rICN5aWVsZElmQ29udGVuZGVkU2FmZWx5fS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBiZWdpblRyYW5zYWN0aW9uV2l0aExpc3RlbmVyTm9uRXhjbHVzaXZlKAorICAgICAgICAgICAgU1FMaXRlVHJhbnNhY3Rpb25MaXN0ZW5lciB0cmFuc2FjdGlvbkxpc3RlbmVyKSB7CisgICAgICAgIGJlZ2luVHJhbnNhY3Rpb24odHJhbnNhY3Rpb25MaXN0ZW5lciwgZmFsc2UpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBiZWdpblRyYW5zYWN0aW9uKFNRTGl0ZVRyYW5zYWN0aW9uTGlzdGVuZXIgdHJhbnNhY3Rpb25MaXN0ZW5lciwKKyAgICAgICAgICAgIGJvb2xlYW4gZXhjbHVzaXZlKSB7CisgICAgICAgIHZlcmlmeURiSXNPcGVuKCk7CiAgICAgICAgIGxvY2tGb3JjZWQoKTsKLSAgICAgICAgaWYgKCFpc09wZW4oKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZGF0YWJhc2Ugbm90IG9wZW4iKTsKLSAgICAgICAgfQogICAgICAgICBib29sZWFuIG9rID0gZmFsc2U7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAvLyBJZiB0aGlzIHRocmVhZCBhbHJlYWR5IGhhZCB0aGUgbG9jayB0aGVuIGdldCBvdXQKQEAgLTUyNCw3ICs2MjUsMTEgQEAKIAogICAgICAgICAgICAgLy8gVGhpcyB0aHJlYWQgZGlkbid0IGFscmVhZHkgaGF2ZSB0aGUgbG9jaywgc28gYmVnaW4gYSBkYXRhYmFzZQogICAgICAgICAgICAgLy8gdHJhbnNhY3Rpb24gbm93LgotICAgICAgICAgICAgZXhlY1NRTCgiQkVHSU4gRVhDTFVTSVZFOyIpOworICAgICAgICAgICAgaWYgKGV4Y2x1c2l2ZSkgeworICAgICAgICAgICAgICAgIGV4ZWNTUUwoIkJFR0lOIEVYQ0xVU0lWRTsiKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZXhlY1NRTCgiQkVHSU4gSU1NRURJQVRFOyIpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgbVRyYW5zYWN0aW9uTGlzdGVuZXIgPSB0cmFuc2FjdGlvbkxpc3RlbmVyOwogICAgICAgICAgICAgbVRyYW5zYWN0aW9uSXNTdWNjZXNzZnVsID0gdHJ1ZTsKICAgICAgICAgICAgIG1Jbm5lclRyYW5zYWN0aW9uSXNTdWNjZXNzZnVsID0gZmFsc2U7CkBAIC01NTEsMTIgKzY1Niw3IEBACiAgICAgICogYXJlIGNvbW1pdHRlZCBhbmQgcm9sbGVkIGJhY2suCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgZW5kVHJhbnNhY3Rpb24oKSB7Ci0gICAgICAgIGlmICghaXNPcGVuKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImRhdGFiYXNlIG5vdCBvcGVuIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFtTG9jay5pc0hlbGRCeUN1cnJlbnRUaHJlYWQoKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigibm8gdHJhbnNhY3Rpb24gcGVuZGluZyIpOwotICAgICAgICB9CisgICAgICAgIHZlcmlmeUxvY2tPd25lcigpOwogICAgICAgICB0cnkgewogICAgICAgICAgICAgaWYgKG1Jbm5lclRyYW5zYWN0aW9uSXNTdWNjZXNzZnVsKSB7CiAgICAgICAgICAgICAgICAgbUlubmVyVHJhbnNhY3Rpb25Jc1N1Y2Nlc3NmdWwgPSBmYWxzZTsKQEAgLTU4MSw2ICs2ODEsMTggQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChtVHJhbnNhY3Rpb25Jc1N1Y2Nlc3NmdWwpIHsKICAgICAgICAgICAgICAgICBleGVjU1FMKENPTU1JVF9TUUwpOworICAgICAgICAgICAgICAgIC8vIGlmIHdyaXRlLWFoZWFkIGxvZ2dpbmcgaXMgdXNlZCwgd2UgaGF2ZSB0byB0YWtlIGNhcmUgb2YgY2hlY2twb2ludC4KKyAgICAgICAgICAgICAgICAvLyBUT0RPOiBzaG91bGQgYXBwbGljYXRpb25zIGJlIGdpdmVuIHRoZSBmbGV4aWJpbGl0eSBvZiBjaG9vc2luZyB3aGVuIHRvCisgICAgICAgICAgICAgICAgLy8gdHJpZ2dlciBjaGVja3BvaW50PworICAgICAgICAgICAgICAgIC8vIGZvciBub3csIGRvIGNoZWNrcG9pbnQgYWZ0ZXIgZXZlcnkgQ09NTUlUIGJlY2F1c2UgdGhhdCBpcyB0aGUgZmFzdGVzdAorICAgICAgICAgICAgICAgIC8vIHdheSB0byBndWFyYW50ZWUgdGhhdCByZWFkZXJzIHdpbGwgc2VlIGxhdGVzdCBkYXRhLgorICAgICAgICAgICAgICAgIC8vIGJ1dCB0aGlzIGlzIHRoZSBzbG93ZXN0IHdheSB0byBydW4gc3FsaXRlIHdpdGggaW4gd3JpdGUtYWhlYWQgbG9nZ2luZyBtb2RlLgorICAgICAgICAgICAgICAgIGlmICh0aGlzLm1Db25uZWN0aW9uUG9vbCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGV4ZWNTUUwoIlBSQUdNQSB3YWxfY2hlY2twb2ludDsiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKFNRTGl0ZURlYnVnLkRFQlVHX1NRTF9TVEFURU1FTlRTKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJQUkFHTUEgd2FsX0NoZWNrcG9pbnQgZG9uZSIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICBleGVjU1FMKCJST0xMQkFDSzsiKTsKQEAgLTYxNCw5ICs3MjYsNyBAQAogICAgICAqIHRyYW5zYWN0aW9uIGlzIGFscmVhZHkgbWFya2VkIGFzIHN1Y2Nlc3NmdWwuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0VHJhbnNhY3Rpb25TdWNjZXNzZnVsKCkgewotICAgICAgICBpZiAoIWlzT3BlbigpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJkYXRhYmFzZSBub3Qgb3BlbiIpOwotICAgICAgICB9CisgICAgICAgIHZlcmlmeURiSXNPcGVuKCk7CiAgICAgICAgIGlmICghbUxvY2suaXNIZWxkQnlDdXJyZW50VGhyZWFkKCkpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIm5vIHRyYW5zYWN0aW9uIHBlbmRpbmciKTsKICAgICAgICAgfQpAQCAtODE0LDMwICs5MjQsNjkgQEAKICAgICAgKiBAdGhyb3dzIFNRTGl0ZUV4Y2VwdGlvbiBpZiB0aGUgZGF0YWJhc2UgY2Fubm90IGJlIG9wZW5lZAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgU1FMaXRlRGF0YWJhc2Ugb3BlbkRhdGFiYXNlKFN0cmluZyBwYXRoLCBDdXJzb3JGYWN0b3J5IGZhY3RvcnksIGludCBmbGFncykgewotICAgICAgICBTUUxpdGVEYXRhYmFzZSBzcWxpdGVEYXRhYmFzZSA9IG51bGw7CisgICAgICAgIHJldHVybiBvcGVuRGF0YWJhc2UocGF0aCwgZmFjdG9yeSwgZmxhZ3MsIG5ldyBEZWZhdWx0RGF0YWJhc2VFcnJvckhhbmRsZXIoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogT3BlbiB0aGUgZGF0YWJhc2UgYWNjb3JkaW5nIHRvIHRoZSBmbGFncyB7QGxpbmsgI09QRU5fUkVBRFdSSVRFfQorICAgICAqIHtAbGluayAjT1BFTl9SRUFET05MWX0ge0BsaW5rICNDUkVBVEVfSUZfTkVDRVNTQVJZfSBhbmQvb3Ige0BsaW5rICNOT19MT0NBTElaRURfQ09MTEFUT1JTfS4KKyAgICAgKgorICAgICAqIDxwPlNldHMgdGhlIGxvY2FsZSBvZiB0aGUgZGF0YWJhc2UgdG8gdGhlICB0aGUgc3lzdGVtJ3MgY3VycmVudCBsb2NhbGUuCisgICAgICogQ2FsbCB7QGxpbmsgI3NldExvY2FsZX0gaWYgeW91IHdvdWxkIGxpa2Ugc29tZXRoaW5nIGVsc2UuPC9wPgorICAgICAqCisgICAgICogPHA+QWNjZXB0cyBpbnB1dCBwYXJhbTogYSBjb25jcmV0ZSBpbnN0YW5jZSBvZiB7QGxpbmsgRGF0YWJhc2VFcnJvckhhbmRsZXJ9IHRvIGJlCisgICAgICogdXNlZCB0byBoYW5kbGUgY29ycnVwdGlvbiB3aGVuIHNxbGl0ZSByZXBvcnRzIGRhdGFiYXNlIGNvcnJ1cHRpb24uPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIHBhdGggdG8gZGF0YWJhc2UgZmlsZSB0byBvcGVuIGFuZC9vciBjcmVhdGUKKyAgICAgKiBAcGFyYW0gZmFjdG9yeSBhbiBvcHRpb25hbCBmYWN0b3J5IGNsYXNzIHRoYXQgaXMgY2FsbGVkIHRvIGluc3RhbnRpYXRlIGEKKyAgICAgKiAgICAgICAgICAgIGN1cnNvciB3aGVuIHF1ZXJ5IGlzIGNhbGxlZCwgb3IgbnVsbCBmb3IgZGVmYXVsdAorICAgICAqIEBwYXJhbSBmbGFncyB0byBjb250cm9sIGRhdGFiYXNlIGFjY2VzcyBtb2RlCisgICAgICogQHBhcmFtIGVycm9ySGFuZGxlciB0aGUge0BsaW5rIERhdGFiYXNlRXJyb3JIYW5kbGVyfSBvYmogdG8gYmUgdXNlZCB0byBoYW5kbGUgY29ycnVwdGlvbgorICAgICAqIHdoZW4gc3FsaXRlIHJlcG9ydHMgZGF0YWJhc2UgY29ycnVwdGlvbgorICAgICAqIEByZXR1cm4gdGhlIG5ld2x5IG9wZW5lZCBkYXRhYmFzZQorICAgICAqIEB0aHJvd3MgU1FMaXRlRXhjZXB0aW9uIGlmIHRoZSBkYXRhYmFzZSBjYW5ub3QgYmUgb3BlbmVkCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTUUxpdGVEYXRhYmFzZSBvcGVuRGF0YWJhc2UoU3RyaW5nIHBhdGgsIEN1cnNvckZhY3RvcnkgZmFjdG9yeSwgaW50IGZsYWdzLAorICAgICAgICAgICAgRGF0YWJhc2VFcnJvckhhbmRsZXIgZXJyb3JIYW5kbGVyKSB7CisgICAgICAgIFNRTGl0ZURhdGFiYXNlIHNxbGl0ZURhdGFiYXNlID0gb3BlbkRhdGFiYXNlKHBhdGgsIGZhY3RvcnksIGZsYWdzLCBlcnJvckhhbmRsZXIsCisgICAgICAgICAgICAgICAgKHNob3J0KSAwIC8qIHRoZSBtYWluIGNvbm5lY3Rpb24gaGFuZGxlICovKTsKKworICAgICAgICAvLyBzZXQgc3FsaXRlIHBhZ2VzaXplIHRvIG1CbG9ja1NpemUKKyAgICAgICAgaWYgKHNCbG9ja1NpemUgPT0gMCkgeworICAgICAgICAgICAgLy8gVE9ETzogIi9kYXRhIiBzaG91bGQgYmUgYSBzdGF0aWMgZmluYWwgU3RyaW5nIGNvbnN0YW50IHNvbWV3aGVyZS4gaXQgaXMgaGFyZGNvZGVkCisgICAgICAgICAgICAvLyBpbiBzZXZlcmFsIHBsYWNlcyByaWdodCBub3cuCisgICAgICAgICAgICBzQmxvY2tTaXplID0gbmV3IFN0YXRGcygiL2RhdGEiKS5nZXRCbG9ja1NpemUoKTsKKyAgICAgICAgfQorICAgICAgICBzcWxpdGVEYXRhYmFzZS5zZXRQYWdlU2l6ZShzQmxvY2tTaXplKTsKKyAgICAgICAgc3FsaXRlRGF0YWJhc2Uuc2V0Sm91cm5hbE1vZGUocGF0aCwgIlRSVU5DQVRFIik7CisKKyAgICAgICAgLy8gYWRkIHRoaXMgZGF0YWJhc2UgdG8gdGhlIGxpc3Qgb2YgZGF0YWJhc2VzIG9wZW5lZCBpbiB0aGlzIHByb2Nlc3MKKyAgICAgICAgQWN0aXZlRGF0YWJhc2VzLmFkZEFjdGl2ZURhdGFiYXNlKHNxbGl0ZURhdGFiYXNlKTsKKyAgICAgICAgcmV0dXJuIHNxbGl0ZURhdGFiYXNlOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFNRTGl0ZURhdGFiYXNlIG9wZW5EYXRhYmFzZShTdHJpbmcgcGF0aCwgQ3Vyc29yRmFjdG9yeSBmYWN0b3J5LCBpbnQgZmxhZ3MsCisgICAgICAgICAgICBEYXRhYmFzZUVycm9ySGFuZGxlciBlcnJvckhhbmRsZXIsIHNob3J0IGNvbm5lY3Rpb25OdW0pIHsKKyAgICAgICAgU1FMaXRlRGF0YWJhc2UgZGIgPSBuZXcgU1FMaXRlRGF0YWJhc2UocGF0aCwgZmFjdG9yeSwgZmxhZ3MsIGVycm9ySGFuZGxlciwgY29ubmVjdGlvbk51bSk7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAvLyBPcGVuIHRoZSBkYXRhYmFzZS4KLSAgICAgICAgICAgIHNxbGl0ZURhdGFiYXNlID0gbmV3IFNRTGl0ZURhdGFiYXNlKHBhdGgsIGZhY3RvcnksIGZsYWdzKTsKKyAgICAgICAgICAgIGRiLmRib3BlbihwYXRoLCBmbGFncyk7CisgICAgICAgICAgICBkYi5zZXRMb2NhbGUoTG9jYWxlLmdldERlZmF1bHQoKSk7CiAgICAgICAgICAgICBpZiAoU1FMaXRlRGVidWcuREVCVUdfU1FMX1NUQVRFTUVOVFMpIHsKLSAgICAgICAgICAgICAgICBzcWxpdGVEYXRhYmFzZS5lbmFibGVTcWxUcmFjaW5nKHBhdGgpOworICAgICAgICAgICAgICAgIGRiLmVuYWJsZVNxbFRyYWNpbmcocGF0aCwgY29ubmVjdGlvbk51bSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoU1FMaXRlRGVidWcuREVCVUdfU1FMX1RJTUUpIHsKLSAgICAgICAgICAgICAgICBzcWxpdGVEYXRhYmFzZS5lbmFibGVTcWxQcm9maWxpbmcocGF0aCk7CisgICAgICAgICAgICAgICAgZGIuZW5hYmxlU3FsUHJvZmlsaW5nKHBhdGgsIGNvbm5lY3Rpb25OdW0pOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGRiOwogICAgICAgICB9IGNhdGNoIChTUUxpdGVEYXRhYmFzZUNvcnJ1cHRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gVHJ5IHRvIHJlY292ZXIgZnJvbSB0aGlzLCBpZiB3ZSBjYW4uCi0gICAgICAgICAgICAvLyBUT0RPOiBzaG91bGQgd2UgZG8gdGhpcyBmb3Igb3RoZXIgb3BlbiBmYWlsdXJlcz8KLSAgICAgICAgICAgIExvZy5lKFRBRywgIkRlbGV0aW5nIGFuZCByZS1jcmVhdGluZyBjb3JydXB0IGRhdGFiYXNlICIgKyBwYXRoLCBlKTsKLSAgICAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoRVZFTlRfREJfQ09SUlVQVCwgcGF0aCk7Ci0gICAgICAgICAgICBpZiAoIXBhdGguZXF1YWxzSWdub3JlQ2FzZSgiOm1lbW9yeSIpKSB7Ci0gICAgICAgICAgICAgICAgLy8gZGVsZXRlIGlzIG9ubHkgZm9yIG5vbi1tZW1vcnkgZGF0YWJhc2UgZmlsZXMKLSAgICAgICAgICAgICAgICBuZXcgRmlsZShwYXRoKS5kZWxldGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNxbGl0ZURhdGFiYXNlID0gbmV3IFNRTGl0ZURhdGFiYXNlKHBhdGgsIGZhY3RvcnksIGZsYWdzKTsKKyAgICAgICAgICAgIGRiLm1FcnJvckhhbmRsZXIub25Db3JydXB0aW9uKGRiKTsKKyAgICAgICAgICAgIHJldHVybiBTUUxpdGVEYXRhYmFzZS5vcGVuRGF0YWJhc2UocGF0aCwgZmFjdG9yeSwgZmxhZ3MsIGVycm9ySGFuZGxlcik7CisgICAgICAgIH0gY2F0Y2ggKFNRTGl0ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJGYWlsZWQgdG8gb3BlbiB0aGUgZGF0YWJhc2UuIGNsb3NpbmcgaXQuIiwgZSk7CisgICAgICAgICAgICBkYi5jbG9zZSgpOworICAgICAgICAgICAgdGhyb3cgZTsKICAgICAgICAgfQotICAgICAgICBBY3RpdmVEYXRhYmFzZXMuZ2V0SW5zdGFuY2UoKS5tQWN0aXZlRGF0YWJhc2VzLmFkZCgKLSAgICAgICAgICAgICAgICBuZXcgV2Vha1JlZmVyZW5jZTxTUUxpdGVEYXRhYmFzZT4oc3FsaXRlRGF0YWJhc2UpKTsKLSAgICAgICAgcmV0dXJuIHNxbGl0ZURhdGFiYXNlOwogICAgIH0KIAogICAgIC8qKgpAQCAtODU1LDYgKzEwMDQsMjUgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBFcXVpdmFsZW50IHRvIG9wZW5EYXRhYmFzZShwYXRoLCBmYWN0b3J5LCBDUkVBVEVfSUZfTkVDRVNTQVJZLCBlcnJvckhhbmRsZXIpLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU1FMaXRlRGF0YWJhc2Ugb3Blbk9yQ3JlYXRlRGF0YWJhc2UoU3RyaW5nIHBhdGgsIEN1cnNvckZhY3RvcnkgZmFjdG9yeSwKKyAgICAgICAgICAgIERhdGFiYXNlRXJyb3JIYW5kbGVyIGVycm9ySGFuZGxlcikgeworICAgICAgICByZXR1cm4gb3BlbkRhdGFiYXNlKHBhdGgsIGZhY3RvcnksIENSRUFURV9JRl9ORUNFU1NBUlksIGVycm9ySGFuZGxlcik7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNldEpvdXJuYWxNb2RlKGZpbmFsIFN0cmluZyBkYlBhdGgsIGZpbmFsIFN0cmluZyBtb2RlKSB7CisgICAgICAgIC8vIGpvdXJuYWwgbW9kZSBjYW4gYmUgc2V0IG9ubHkgZm9yIG5vbi1tZW1vcnkgZGF0YWJhc2VzCisgICAgICAgIGlmICghZGJQYXRoLmVxdWFsc0lnbm9yZUNhc2UoTUVNT1JZX0RCX1BBVEgpKSB7CisgICAgICAgICAgICBTdHJpbmcgcyA9IERhdGFiYXNlVXRpbHMuc3RyaW5nRm9yUXVlcnkodGhpcywgIlBSQUdNQSBqb3VybmFsX21vZGU9IiArIG1vZGUsIG51bGwpOworICAgICAgICAgICAgaWYgKCFzLmVxdWFsc0lnbm9yZUNhc2UobW9kZSkpIHsKKyAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJzZXR0aW5nIGpvdXJuYWxfbW9kZSB0byAiICsgbW9kZSArICIgZmFpbGVkIGZvciBkYjogIiArIGRiUGF0aCArCisgICAgICAgICAgICAgICAgICAgICAgICAiIChvbiBwcmFnbWEgc2V0IGpvdXJuYWxfbW9kZSwgc3FsaXRlIHJldHVybmVkOiIgKyBzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgogICAgICAqIENyZWF0ZSBhIG1lbW9yeSBiYWNrZWQgU1FMaXRlIGRhdGFiYXNlLiAgSXRzIGNvbnRlbnRzIHdpbGwgYmUgZGVzdHJveWVkCiAgICAgICogd2hlbiB0aGUgZGF0YWJhc2UgaXMgY2xvc2VkLgogICAgICAqCkBAIC04NjcsNyArMTAzNSw3IEBACiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBTUUxpdGVEYXRhYmFzZSBjcmVhdGUoQ3Vyc29yRmFjdG9yeSBmYWN0b3J5KSB7CiAgICAgICAgIC8vIFRoaXMgaXMgYSBtYWdpYyBzdHJpbmcgd2l0aCBzcGVjaWFsIG1lYW5pbmcgZm9yIFNRTGl0ZS4KLSAgICAgICAgcmV0dXJuIG9wZW5EYXRhYmFzZSgiOm1lbW9yeToiLCBmYWN0b3J5LCBDUkVBVEVfSUZfTkVDRVNTQVJZKTsKKyAgICAgICAgcmV0dXJuIG9wZW5EYXRhYmFzZShNRU1PUllfREJfUEFUSCwgZmFjdG9yeSwgQ1JFQVRFX0lGX05FQ0VTU0FSWSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC04ODAsMTUgKzEwNDgsMjAgQEAKICAgICAgICAgbG9jaygpOwogICAgICAgICB0cnkgewogICAgICAgICAgICAgY2xvc2VDbG9zYWJsZSgpOworICAgICAgICAgICAgLy8gZmluYWxpemUgQUxMIHN0YXRlbWVudHMgcXVldWVkIHVwIHNvIGZhcgorICAgICAgICAgICAgY2xvc2VQZW5kaW5nU3RhdGVtZW50cygpOwogICAgICAgICAgICAgLy8gY2xvc2UgdGhpcyBkYXRhYmFzZSBpbnN0YW5jZSAtIHJlZ2FyZGxlc3Mgb2YgaXRzIHJlZmVyZW5jZSBjb3VudCB2YWx1ZQotICAgICAgICAgICAgb25BbGxSZWZlcmVuY2VzUmVsZWFzZWQoKTsKKyAgICAgICAgICAgIGRiY2xvc2UoKTsKKyAgICAgICAgICAgIGlmIChtQ29ubmVjdGlvblBvb2wgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1Db25uZWN0aW9uUG9vbC5jbG9zZSgpOworICAgICAgICAgICAgfQogICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgdW5sb2NrKCk7CiAgICAgICAgIH0KICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgY2xvc2VDbG9zYWJsZSgpIHsKLSAgICAgICAgLyogZGVhbGxvY2F0ZSBhbGwgY29tcGlsZWQgc3FsIHN0YXRlbWVudCBvYmplY3RzIGZyb20gbUNvbXBpbGVkUXVlcmllcyBjYWNoZS4KKyAgICAgICAgLyogZGVhbGxvY2F0ZSBhbGwgY29tcGlsZWQgU1FMIHN0YXRlbWVudCBvYmplY3RzIGZyb20gbUNvbXBpbGVkUXVlcmllcyBjYWNoZS4KICAgICAgICAgICogdGhpcyBzaG91bGQgYmUgZG9uZSBiZWZvcmUgZGUtcmVmZXJlbmNpbmcgYWxsIHtAbGluayBTUUxpdGVDbG9zYWJsZX0gb2JqZWN0cwogICAgICAgICAgKiBmcm9tIHRoaXMgZGF0YWJhc2Ugb2JqZWN0IGJlY2F1c2UgY2FsbGluZwogICAgICAgICAgKiB7QGxpbmsgU1FMaXRlQ2xvc2FibGUjb25BbGxSZWZlcmVuY2VzUmVsZWFzZWRGcm9tQ29udGFpbmVyKCl9IGNvdWxkIGNhdXNlIHRoZSBkYXRhYmFzZQpAQCAtOTE4LDE5ICsxMDkxLDcgQEAKICAgICAgKiBAcmV0dXJuIHRoZSBkYXRhYmFzZSB2ZXJzaW9uCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXRWZXJzaW9uKCkgewotICAgICAgICBTUUxpdGVTdGF0ZW1lbnQgcHJvZyA9IG51bGw7Ci0gICAgICAgIGxvY2soKTsKLSAgICAgICAgaWYgKCFpc09wZW4oKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZGF0YWJhc2Ugbm90IG9wZW4iKTsKLSAgICAgICAgfQotICAgICAgICB0cnkgewotICAgICAgICAgICAgcHJvZyA9IG5ldyBTUUxpdGVTdGF0ZW1lbnQodGhpcywgIlBSQUdNQSB1c2VyX3ZlcnNpb247Iik7Ci0gICAgICAgICAgICBsb25nIHZlcnNpb24gPSBwcm9nLnNpbXBsZVF1ZXJ5Rm9yTG9uZygpOwotICAgICAgICAgICAgcmV0dXJuIChpbnQpIHZlcnNpb247Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAocHJvZyAhPSBudWxsKSBwcm9nLmNsb3NlKCk7Ci0gICAgICAgICAgICB1bmxvY2soKTsKLSAgICAgICAgfQorICAgICAgICByZXR1cm4gKChMb25nKSBEYXRhYmFzZVV0aWxzLmxvbmdGb3JRdWVyeSh0aGlzLCAiUFJBR01BIHVzZXJfdmVyc2lvbjsiLCBudWxsKSkuaW50VmFsdWUoKTsKICAgICB9CiAKICAgICAvKioKQEAgLTk0OCwyMCArMTEwOSw4IEBACiAgICAgICogQHJldHVybiB0aGUgbmV3IG1heGltdW0gZGF0YWJhc2Ugc2l6ZQogICAgICAqLwogICAgIHB1YmxpYyBsb25nIGdldE1heGltdW1TaXplKCkgewotICAgICAgICBTUUxpdGVTdGF0ZW1lbnQgcHJvZyA9IG51bGw7Ci0gICAgICAgIGxvY2soKTsKLSAgICAgICAgaWYgKCFpc09wZW4oKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZGF0YWJhc2Ugbm90IG9wZW4iKTsKLSAgICAgICAgfQotICAgICAgICB0cnkgewotICAgICAgICAgICAgcHJvZyA9IG5ldyBTUUxpdGVTdGF0ZW1lbnQodGhpcywKLSAgICAgICAgICAgICAgICAgICAgIlBSQUdNQSBtYXhfcGFnZV9jb3VudDsiKTsKLSAgICAgICAgICAgIGxvbmcgcGFnZUNvdW50ID0gcHJvZy5zaW1wbGVRdWVyeUZvckxvbmcoKTsKLSAgICAgICAgICAgIHJldHVybiBwYWdlQ291bnQgKiBnZXRQYWdlU2l6ZSgpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKHByb2cgIT0gbnVsbCkgcHJvZy5jbG9zZSgpOwotICAgICAgICAgICAgdW5sb2NrKCk7Ci0gICAgICAgIH0KKyAgICAgICAgbG9uZyBwYWdlQ291bnQgPSBEYXRhYmFzZVV0aWxzLmxvbmdGb3JRdWVyeSh0aGlzLCAiUFJBR01BIG1heF9wYWdlX2NvdW50OyIsIG51bGwpOworICAgICAgICByZXR1cm4gcGFnZUNvdW50ICogZ2V0UGFnZVNpemUoKTsKICAgICB9CiAKICAgICAvKioKQEAgLTk3MiwyNiArMTEyMSwxNSBAQAogICAgICAqIEByZXR1cm4gdGhlIG5ldyBtYXhpbXVtIGRhdGFiYXNlIHNpemUKICAgICAgKi8KICAgICBwdWJsaWMgbG9uZyBzZXRNYXhpbXVtU2l6ZShsb25nIG51bUJ5dGVzKSB7Ci0gICAgICAgIFNRTGl0ZVN0YXRlbWVudCBwcm9nID0gbnVsbDsKLSAgICAgICAgbG9jaygpOwotICAgICAgICBpZiAoIWlzT3BlbigpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJkYXRhYmFzZSBub3Qgb3BlbiIpOworICAgICAgICBsb25nIHBhZ2VTaXplID0gZ2V0UGFnZVNpemUoKTsKKyAgICAgICAgbG9uZyBudW1QYWdlcyA9IG51bUJ5dGVzIC8gcGFnZVNpemU7CisgICAgICAgIC8vIElmIG51bUJ5dGVzIGlzbid0IGEgbXVsdGlwbGUgb2YgcGFnZVNpemUsIGJ1bXAgdXAgYSBwYWdlCisgICAgICAgIGlmICgobnVtQnl0ZXMgJSBwYWdlU2l6ZSkgIT0gMCkgeworICAgICAgICAgICAgbnVtUGFnZXMrKzsKICAgICAgICAgfQotICAgICAgICB0cnkgewotICAgICAgICAgICAgbG9uZyBwYWdlU2l6ZSA9IGdldFBhZ2VTaXplKCk7Ci0gICAgICAgICAgICBsb25nIG51bVBhZ2VzID0gbnVtQnl0ZXMgLyBwYWdlU2l6ZTsKLSAgICAgICAgICAgIC8vIElmIG51bUJ5dGVzIGlzbid0IGEgbXVsdGlwbGUgb2YgcGFnZVNpemUsIGJ1bXAgdXAgYSBwYWdlCi0gICAgICAgICAgICBpZiAoKG51bUJ5dGVzICUgcGFnZVNpemUpICE9IDApIHsKLSAgICAgICAgICAgICAgICBudW1QYWdlcysrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcHJvZyA9IG5ldyBTUUxpdGVTdGF0ZW1lbnQodGhpcywKLSAgICAgICAgICAgICAgICAgICAgIlBSQUdNQSBtYXhfcGFnZV9jb3VudCA9ICIgKyBudW1QYWdlcyk7Ci0gICAgICAgICAgICBsb25nIG5ld1BhZ2VDb3VudCA9IHByb2cuc2ltcGxlUXVlcnlGb3JMb25nKCk7Ci0gICAgICAgICAgICByZXR1cm4gbmV3UGFnZUNvdW50ICogcGFnZVNpemU7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAocHJvZyAhPSBudWxsKSBwcm9nLmNsb3NlKCk7Ci0gICAgICAgICAgICB1bmxvY2soKTsKLSAgICAgICAgfQorICAgICAgICBsb25nIG5ld1BhZ2VDb3VudCA9IERhdGFiYXNlVXRpbHMubG9uZ0ZvclF1ZXJ5KHRoaXMsICJQUkFHTUEgbWF4X3BhZ2VfY291bnQgPSAiICsgbnVtUGFnZXMsCisgICAgICAgICAgICAgICAgbnVsbCk7CisgICAgICAgIHJldHVybiBuZXdQYWdlQ291bnQgKiBwYWdlU2l6ZTsKICAgICB9CiAKICAgICAvKioKQEAgLTEwMDAsMjAgKzExMzgsNyBAQAogICAgICAqIEByZXR1cm4gdGhlIGRhdGFiYXNlIHBhZ2Ugc2l6ZSwgaW4gYnl0ZXMKICAgICAgKi8KICAgICBwdWJsaWMgbG9uZyBnZXRQYWdlU2l6ZSgpIHsKLSAgICAgICAgU1FMaXRlU3RhdGVtZW50IHByb2cgPSBudWxsOwotICAgICAgICBsb2NrKCk7Ci0gICAgICAgIGlmICghaXNPcGVuKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImRhdGFiYXNlIG5vdCBvcGVuIik7Ci0gICAgICAgIH0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHByb2cgPSBuZXcgU1FMaXRlU3RhdGVtZW50KHRoaXMsCi0gICAgICAgICAgICAgICAgICAgICJQUkFHTUEgcGFnZV9zaXplOyIpOwotICAgICAgICAgICAgbG9uZyBzaXplID0gcHJvZy5zaW1wbGVRdWVyeUZvckxvbmcoKTsKLSAgICAgICAgICAgIHJldHVybiBzaXplOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKHByb2cgIT0gbnVsbCkgcHJvZy5jbG9zZSgpOwotICAgICAgICAgICAgdW5sb2NrKCk7Ci0gICAgICAgIH0KKyAgICAgICAgcmV0dXJuIERhdGFiYXNlVXRpbHMubG9uZ0ZvclF1ZXJ5KHRoaXMsICJQUkFHTUEgcGFnZV9zaXplOyIsIG51bGwpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTEwMSw3ICsxMjI2LDcgQEAKICAgICAgICAgaWYgKGluZm8gIT0gbnVsbCkgewogICAgICAgICAgICAgZXhlY1NRTCgiVVBEQVRFICIgKyBpbmZvLm1hc3RlclRhYmxlCiAgICAgICAgICAgICAgICAgICAgICsgIiBTRVQgX3N5bmNfZGlydHk9MSBXSEVSRSBfaWQ9KFNFTEVDVCAiICsgaW5mby5mb3JlaWduS2V5Ci0gICAgICAgICAgICAgICAgICAgICsgIiBGUk9NICIgKyB0YWJsZSArICIgV0hFUkUgX2lkPSIgKyByb3dJZCArICIpIik7CisgICAgICAgICAgICAgICAgICAgICsgIiBGUk9NICIgKyB0YWJsZSArICIgV0hFUkUgX2lkPT8pIiwgbmV3IFN0cmluZ1tdIHtTdHJpbmcudmFsdWVPZihyb3dJZCl9KTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMTE0MSwxNCArMTI2NiwxOSBAQAogICAgICAqIHtAbGluayBTUUxpdGVTdGF0ZW1lbnR9cyBhcmUgbm90IHN5bmNocm9uaXplZCwgc2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciBtb3JlIGRldGFpbHMuCiAgICAgICovCiAgICAgcHVibGljIFNRTGl0ZVN0YXRlbWVudCBjb21waWxlU3RhdGVtZW50KFN0cmluZyBzcWwpIHRocm93cyBTUUxFeGNlcHRpb24gewotICAgICAgICBsb2NrKCk7Ci0gICAgICAgIGlmICghaXNPcGVuKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImRhdGFiYXNlIG5vdCBvcGVuIik7CisgICAgICAgIHZlcmlmeURiSXNPcGVuKCk7CisgICAgICAgIFN0cmluZyBwcmVmaXhTcWwgPSBzcWwudHJpbSgpLnN1YnN0cmluZygwLCA2KTsKKyAgICAgICAgU1FMaXRlRGF0YWJhc2UgZGIgPSB0aGlzOworICAgICAgICAvLyBnZXQgYSBwb29sZWQgZGF0YWJhc2UgY29ubmVjdGlvbiBoYW5kbGUgdG8gdXNlLCBpZiB0aGlzIGlzIGEgcXVlcnkKKyAgICAgICAgaWYgKHByZWZpeFNxbC5lcXVhbHNJZ25vcmVDYXNlKCJTRUxFQ1QiKSkgeworICAgICAgICAgICAgZGIgPSBnZXREYkNvbm5lY3Rpb24oc3FsKTsKICAgICAgICAgfQorICAgICAgICBkYi5sb2NrKCk7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFNRTGl0ZVN0YXRlbWVudCh0aGlzLCBzcWwpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBTUUxpdGVTdGF0ZW1lbnQoZGIsIHNxbCk7CiAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICB1bmxvY2soKTsKKyAgICAgICAgICAgIHJlbGVhc2VEYkNvbm5lY3Rpb24oZGIpOworICAgICAgICAgICAgZGIudW5sb2NrKCk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTEyMjYsOSArMTM1Niw3IEBACiAgICAgICAgICAgICBib29sZWFuIGRpc3RpbmN0LCBTdHJpbmcgdGFibGUsIFN0cmluZ1tdIGNvbHVtbnMsCiAgICAgICAgICAgICBTdHJpbmcgc2VsZWN0aW9uLCBTdHJpbmdbXSBzZWxlY3Rpb25BcmdzLCBTdHJpbmcgZ3JvdXBCeSwKICAgICAgICAgICAgIFN0cmluZyBoYXZpbmcsIFN0cmluZyBvcmRlckJ5LCBTdHJpbmcgbGltaXQpIHsKLSAgICAgICAgaWYgKCFpc09wZW4oKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZGF0YWJhc2Ugbm90IG9wZW4iKTsKLSAgICAgICAgfQorICAgICAgICB2ZXJpZnlEYklzT3BlbigpOwogICAgICAgICBTdHJpbmcgc3FsID0gU1FMaXRlUXVlcnlCdWlsZGVyLmJ1aWxkUXVlcnlTdHJpbmcoCiAgICAgICAgICAgICAgICAgZGlzdGluY3QsIHRhYmxlLCBjb2x1bW5zLCBzZWxlY3Rpb24sIGdyb3VwQnksIGhhdmluZywgb3JkZXJCeSwgbGltaXQpOwogCkBAIC0xMzM5LDkgKzE0NjcsNyBAQAogICAgIHB1YmxpYyBDdXJzb3IgcmF3UXVlcnlXaXRoRmFjdG9yeSgKICAgICAgICAgICAgIEN1cnNvckZhY3RvcnkgY3Vyc29yRmFjdG9yeSwgU3RyaW5nIHNxbCwgU3RyaW5nW10gc2VsZWN0aW9uQXJncywKICAgICAgICAgICAgIFN0cmluZyBlZGl0VGFibGUpIHsKLSAgICAgICAgaWYgKCFpc09wZW4oKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZGF0YWJhc2Ugbm90IG9wZW4iKTsKLSAgICAgICAgfQorICAgICAgICB2ZXJpZnlEYklzT3BlbigpOwogICAgICAgICBCbG9ja0d1YXJkLmdldFRocmVhZFBvbGljeSgpLm9uUmVhZEZyb21EaXNrKCk7CiAgICAgICAgIGxvbmcgdGltZVN0YXJ0ID0gMDsKIApAQCAtMTM0OSw3ICsxNDc1LDggQEAKICAgICAgICAgICAgIHRpbWVTdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwogICAgICAgICB9CiAKLSAgICAgICAgU1FMaXRlQ3Vyc29yRHJpdmVyIGRyaXZlciA9IG5ldyBTUUxpdGVEaXJlY3RDdXJzb3JEcml2ZXIodGhpcywgc3FsLCBlZGl0VGFibGUpOworICAgICAgICBTUUxpdGVEYXRhYmFzZSBkYiA9IGdldERiQ29ubmVjdGlvbihzcWwpOworICAgICAgICBTUUxpdGVDdXJzb3JEcml2ZXIgZHJpdmVyID0gbmV3IFNRTGl0ZURpcmVjdEN1cnNvckRyaXZlcihkYiwgc3FsLCBlZGl0VGFibGUpOwogCiAgICAgICAgIEN1cnNvciBjdXJzb3IgPSBudWxsOwogICAgICAgICB0cnkgewpAQCAtMTM3NSw2ICsxNTAyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICI8bnVsbD4iKSAgKyAiLCBjb3VudCBpcyAiICsgY291bnQpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlbGVhc2VEYkNvbm5lY3Rpb24oZGIpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBjdXJzb3I7CiAgICAgfQpAQCAtMTUwMSwxMCArMTYyOSw4IEBACiAgICAgICovCiAgICAgcHVibGljIGxvbmcgaW5zZXJ0V2l0aE9uQ29uZmxpY3QoU3RyaW5nIHRhYmxlLCBTdHJpbmcgbnVsbENvbHVtbkhhY2ssCiAgICAgICAgICAgICBDb250ZW50VmFsdWVzIGluaXRpYWxWYWx1ZXMsIGludCBjb25mbGljdEFsZ29yaXRobSkgeworICAgICAgICB2ZXJpZnlEYklzT3BlbigpOwogICAgICAgICBCbG9ja0d1YXJkLmdldFRocmVhZFBvbGljeSgpLm9uV3JpdGVUb0Rpc2soKTsKLSAgICAgICAgaWYgKCFpc09wZW4oKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZGF0YWJhc2Ugbm90IG9wZW4iKTsKLSAgICAgICAgfQogCiAgICAgICAgIC8vIE1lYXN1cmVtZW50cyBzaG93IG1vc3Qgc3FsIGxlbmd0aHMgPD0gMTUyCiAgICAgICAgIFN0cmluZ0J1aWxkZXIgc3FsID0gbmV3IFN0cmluZ0J1aWxkZXIoMTUyKTsKQEAgLTE1OTMsMTEgKzE3MTksOSBAQAogICAgICAqICAgICAgICAgd2hlcmVDbGF1c2UuCiAgICAgICovCiAgICAgcHVibGljIGludCBkZWxldGUoU3RyaW5nIHRhYmxlLCBTdHJpbmcgd2hlcmVDbGF1c2UsIFN0cmluZ1tdIHdoZXJlQXJncykgeworICAgICAgICB2ZXJpZnlEYklzT3BlbigpOwogICAgICAgICBCbG9ja0d1YXJkLmdldFRocmVhZFBvbGljeSgpLm9uV3JpdGVUb0Rpc2soKTsKICAgICAgICAgbG9jaygpOwotICAgICAgICBpZiAoIWlzT3BlbigpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJkYXRhYmFzZSBub3Qgb3BlbiIpOwotICAgICAgICB9CiAgICAgICAgIFNRTGl0ZVN0YXRlbWVudCBzdGF0ZW1lbnQgPSBudWxsOwogICAgICAgICB0cnkgewogICAgICAgICAgICAgc3RhdGVtZW50ID0gY29tcGlsZVN0YXRlbWVudCgiREVMRVRFIEZST00gIiArIHRhYmxlCkBAIC0xNjc3LDEwICsxODAxLDggQEAKICAgICAgICAgICAgIHNxbC5hcHBlbmQod2hlcmVDbGF1c2UpOwogICAgICAgICB9CiAKKyAgICAgICAgdmVyaWZ5RGJJc09wZW4oKTsKICAgICAgICAgbG9jaygpOwotICAgICAgICBpZiAoIWlzT3BlbigpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJkYXRhYmFzZSBub3Qgb3BlbiIpOwotICAgICAgICB9CiAgICAgICAgIFNRTGl0ZVN0YXRlbWVudCBzdGF0ZW1lbnQgPSBudWxsOwogICAgICAgICB0cnkgewogICAgICAgICAgICAgc3RhdGVtZW50ID0gY29tcGlsZVN0YXRlbWVudChzcWwudG9TdHJpbmcoKSk7CkBAIC0xNzI1LDIxICsxODQ3LDMzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogRXhlY3V0ZSBhIHNpbmdsZSBTUUwgc3RhdGVtZW50IHRoYXQgaXMgbm90IGEgcXVlcnkuIEZvciBleGFtcGxlLCBDUkVBVEUKLSAgICAgKiBUQUJMRSwgREVMRVRFLCBJTlNFUlQsIGV0Yy4gTXVsdGlwbGUgc3RhdGVtZW50cyBzZXBhcmF0ZWQgYnkgO3MgYXJlIG5vdAotICAgICAqIHN1cHBvcnRlZC4gaXQgdGFrZXMgYSB3cml0ZSBsb2NrCisgICAgICogRXhlY3V0ZSBhIHNpbmdsZSBTUUwgc3RhdGVtZW50IHRoYXQgaXMgTk9UIGEgU0VMRUNUCisgICAgICogb3IgYW55IG90aGVyIFNRTCBzdGF0ZW1lbnQgdGhhdCByZXR1cm5zIGRhdGEuCisgICAgICogPHA+CisgICAgICogVXNlIG9mIHRoaXMgbWV0aG9kIGlzIGRpc2NvdXJhZ2VkIGFzIGl0IGRvZXNuJ3QgcGVyZm9ybSB3ZWxsIHdoZW4gaXNzdWluZyB0aGUgc2FtZSBTUUwKKyAgICAgKiBzdGF0ZW1lbnQgcmVwZWF0ZWRseSAoc2VlIHtAbGluayAjY29tcGlsZVN0YXRlbWVudChTdHJpbmcpfSB0byBwcmVwYXJlIHN0YXRlbWVudHMgZm9yCisgICAgICogcmVwZWF0ZWQgdXNlKSwgYW5kIGl0IGhhcyBubyBtZWFucyB0byByZXR1cm4gYW55IGRhdGEgKHN1Y2ggYXMgdGhlIG51bWJlciBvZiBhZmZlY3RlZCByb3dzKS4KKyAgICAgKiBJbnN0ZWFkLCB5b3UncmUgZW5jb3VyYWdlZCB0byB1c2Uge0BsaW5rICNpbnNlcnQoU3RyaW5nLCBTdHJpbmcsIENvbnRlbnRWYWx1ZXMpfSwKKyAgICAgKiB7QGxpbmsgI3VwZGF0ZShTdHJpbmcsIENvbnRlbnRWYWx1ZXMsIFN0cmluZywgU3RyaW5nW10pfSwgZXQgYWwsIHdoZW4gcG9zc2libGUuCisgICAgICogPC9wPgogICAgICAqCisgICAgICogQHBhcmFtIHNxbCB0aGUgU1FMIHN0YXRlbWVudCB0byBiZSBleGVjdXRlZC4gTXVsdGlwbGUgc3RhdGVtZW50cyBzZXBhcmF0ZWQgYnkgc2VtaWNvbG9ucyBhcmUKKyAgICAgKiBub3Qgc3VwcG9ydGVkLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uIElmIHRoZSBTUUwgc3RyaW5nIGlzIGludmFsaWQgZm9yIHNvbWUgcmVhc29uCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgZXhlY1NRTChTdHJpbmcgc3FsKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgc3FsID0gc3FsLnRyaW0oKTsKKyAgICAgICAgU3RyaW5nIHByZWZpeCA9IHNxbC5zdWJzdHJpbmcoMCwgNik7CisgICAgICAgIGlmIChwcmVmaXguZXF1YWxzSWdub3JlQ2FzZSgiQVRUQUNIIikpIHsKKyAgICAgICAgICAgIGRpc2FibGVXcml0ZUFoZWFkTG9nZ2luZygpOworICAgICAgICB9CisgICAgICAgIHZlcmlmeURiSXNPcGVuKCk7CiAgICAgICAgIEJsb2NrR3VhcmQuZ2V0VGhyZWFkUG9saWN5KCkub25Xcml0ZVRvRGlzaygpOwogICAgICAgICBsb25nIHRpbWVTdGFydCA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpOwogICAgICAgICBsb2NrKCk7Ci0gICAgICAgIGlmICghaXNPcGVuKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImRhdGFiYXNlIG5vdCBvcGVuIik7Ci0gICAgICAgIH0KICAgICAgICAgbG9nVGltZVN0YXQobUxhc3RTcWxTdGF0ZW1lbnQsIHRpbWVTdGFydCwgR0VUX0xPQ0tfTE9HX1BSRUZJWCk7CiAgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjbG9zZVBlbmRpbmdTdGF0ZW1lbnRzKCk7CiAgICAgICAgICAgICBuYXRpdmVfZXhlY1NRTChzcWwpOwogICAgICAgICB9IGNhdGNoIChTUUxpdGVEYXRhYmFzZUNvcnJ1cHRFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgb25Db3JydXB0aW9uKCk7CkBAIC0xNzU5LDExICsxODkzLDM5IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogRXhlY3V0ZSBhIHNpbmdsZSBTUUwgc3RhdGVtZW50IHRoYXQgaXMgbm90IGEgcXVlcnkuIEZvciBleGFtcGxlLCBDUkVBVEUKLSAgICAgKiBUQUJMRSwgREVMRVRFLCBJTlNFUlQsIGV0Yy4gTXVsdGlwbGUgc3RhdGVtZW50cyBzZXBhcmF0ZWQgYnkgO3MgYXJlIG5vdAotICAgICAqIHN1cHBvcnRlZC4gaXQgdGFrZXMgYSB3cml0ZSBsb2NrLAorICAgICAqIEV4ZWN1dGUgYSBzaW5nbGUgU1FMIHN0YXRlbWVudCB0aGF0IGlzIE5PVCBhIFNFTEVDVC9JTlNFUlQvVVBEQVRFL0RFTEVURS4KKyAgICAgKiA8cD4KKyAgICAgKiBGb3IgSU5TRVJUIHN0YXRlbWVudHMsIHVzZSBhbnkgb2YgdGhlIGZvbGxvd2luZyBpbnN0ZWFkLgorICAgICAqIDx1bD4KKyAgICAgKiAgIDxsaT57QGxpbmsgI2luc2VydChTdHJpbmcsIFN0cmluZywgQ29udGVudFZhbHVlcyl9PC9saT4KKyAgICAgKiAgIDxsaT57QGxpbmsgI2luc2VydE9yVGhyb3coU3RyaW5nLCBTdHJpbmcsIENvbnRlbnRWYWx1ZXMpfTwvbGk+CisgICAgICogICA8bGk+e0BsaW5rICNpbnNlcnRXaXRoT25Db25mbGljdChTdHJpbmcsIFN0cmluZywgQ29udGVudFZhbHVlcywgaW50KX08L2xpPgorICAgICAqIDwvdWw+CisgICAgICogPHA+CisgICAgICogRm9yIFVQREFURSBzdGF0ZW1lbnRzLCB1c2UgYW55IG9mIHRoZSBmb2xsb3dpbmcgaW5zdGVhZC4KKyAgICAgKiA8dWw+CisgICAgICogICA8bGk+e0BsaW5rICN1cGRhdGUoU3RyaW5nLCBDb250ZW50VmFsdWVzLCBTdHJpbmcsIFN0cmluZ1tdKX08L2xpPgorICAgICAqICAgPGxpPntAbGluayAjdXBkYXRlV2l0aE9uQ29uZmxpY3QoU3RyaW5nLCBDb250ZW50VmFsdWVzLCBTdHJpbmcsIFN0cmluZ1tdLCBpbnQpfTwvbGk+CisgICAgICogPC91bD4KKyAgICAgKiA8cD4KKyAgICAgKiBGb3IgREVMRVRFIHN0YXRlbWVudHMsIHVzZSBhbnkgb2YgdGhlIGZvbGxvd2luZyBpbnN0ZWFkLgorICAgICAqIDx1bD4KKyAgICAgKiAgIDxsaT57QGxpbmsgI2RlbGV0ZShTdHJpbmcsIFN0cmluZywgU3RyaW5nW10pfTwvbGk+CisgICAgICogPC91bD4KKyAgICAgKiA8cD4KKyAgICAgKiBGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyBhcmUgZ29vZCBjYW5kaWRhdGVzIGZvciB1c2luZyB0aGlzIG1ldGhvZDoKKyAgICAgKiA8dWw+CisgICAgICogICA8bGk+QUxURVIgVEFCTEU8L2xpPgorICAgICAqICAgPGxpPkNSRUFURSBvciBEUk9QIHRhYmxlIC8gdHJpZ2dlciAvIHZpZXcgLyBpbmRleCAvIHZpcnR1YWwgdGFibGU8L2xpPgorICAgICAqICAgPGxpPlJFSU5ERVg8L2xpPgorICAgICAqICAgPGxpPlJFTEVBU0U8L2xpPgorICAgICAqICAgPGxpPlNBVkVQT0lOVDwvbGk+CisgICAgICogICA8bGk+UFJBR01BIHRoYXQgcmV0dXJucyBubyBkYXRhPC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqIDwvcD4KICAgICAgKgotICAgICAqIEBwYXJhbSBzcWwKKyAgICAgKiBAcGFyYW0gc3FsIHRoZSBTUUwgc3RhdGVtZW50IHRvIGJlIGV4ZWN1dGVkLiBNdWx0aXBsZSBzdGF0ZW1lbnRzIHNlcGFyYXRlZCBieSBzZW1pY29sb25zIGFyZQorICAgICAqIG5vdCBzdXBwb3J0ZWQuCiAgICAgICogQHBhcmFtIGJpbmRBcmdzIG9ubHkgYnl0ZVtdLCBTdHJpbmcsIExvbmcgYW5kIERvdWJsZSBhcmUgc3VwcG9ydGVkIGluIGJpbmRBcmdzLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uIElmIHRoZSBTUUwgc3RyaW5nIGlzIGludmFsaWQgZm9yIHNvbWUgcmVhc29uCiAgICAgICovCkBAIC0xNzcyLDExICsxOTM0LDkgQEAKICAgICAgICAgaWYgKGJpbmRBcmdzID09IG51bGwpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkVtcHR5IGJpbmRBcmdzIik7CiAgICAgICAgIH0KKyAgICAgICAgdmVyaWZ5RGJJc09wZW4oKTsKICAgICAgICAgbG9uZyB0aW1lU3RhcnQgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKTsKICAgICAgICAgbG9jaygpOwotICAgICAgICBpZiAoIWlzT3BlbigpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJkYXRhYmFzZSBub3Qgb3BlbiIpOwotICAgICAgICB9CiAgICAgICAgIFNRTGl0ZVN0YXRlbWVudCBzdGF0ZW1lbnQgPSBudWxsOwogICAgICAgICB0cnkgewogICAgICAgICAgICAgc3RhdGVtZW50ID0gY29tcGlsZVN0YXRlbWVudChzcWwpOwpAQCAtMTgxMCwxNCArMTk3MCwxOSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFByaXZhdGUgY29uc3RydWN0b3IuIFNlZSB7QGxpbmsgI2NyZWF0ZX0gYW5kIHtAbGluayAjb3BlbkRhdGFiYXNlfS4KKyAgICAgKiBQcml2YXRlIGNvbnN0cnVjdG9yLgogICAgICAqCiAgICAgICogQHBhcmFtIHBhdGggVGhlIGZ1bGwgcGF0aCB0byB0aGUgZGF0YWJhc2UKICAgICAgKiBAcGFyYW0gZmFjdG9yeSBUaGUgZmFjdG9yeSB0byB1c2Ugd2hlbiBjcmVhdGluZyBjdXJzb3JzLCBtYXkgYmUgTlVMTC4KICAgICAgKiBAcGFyYW0gZmxhZ3MgMCBvciB7QGxpbmsgI05PX0xPQ0FMSVpFRF9DT0xMQVRPUlN9LiAgSWYgdGhlIGRhdGFiYXNlIGZpbGUgYWxyZWFkeQogICAgICAqICAgICAgICAgICAgICBleGlzdHMsIG1GbGFncyB3aWxsIGJlIHVwZGF0ZWQgYXBwcm9wcmlhdGVseS4KKyAgICAgKiBAcGFyYW0gZXJyb3JIYW5kbGVyIFRoZSB7QGxpbmsgRGF0YWJhc2VFcnJvckhhbmRsZXJ9IHRvIGJlIHVzZWQgd2hlbiBzcWxpdGUgcmVwb3J0cyBkYXRhYmFzZQorICAgICAqIGNvcnJ1cHRpb24uIG1heSBiZSBOVUxMLgorICAgICAqIEBwYXJhbSBjb25uZWN0aW9uTnVtIDAgZm9yIG1haW4gZGF0YWJhc2UgY29ubmVjdGlvbiBoYW5kbGUuIDEuLk4gZm9yIHBvb2xlZCBkYXRhYmFzZQorICAgICAqIGNvbm5lY3Rpb24gaGFuZGxlcy4KICAgICAgKi8KLSAgICBwcml2YXRlIFNRTGl0ZURhdGFiYXNlKFN0cmluZyBwYXRoLCBDdXJzb3JGYWN0b3J5IGZhY3RvcnksIGludCBmbGFncykgeworICAgIHByaXZhdGUgU1FMaXRlRGF0YWJhc2UoU3RyaW5nIHBhdGgsIEN1cnNvckZhY3RvcnkgZmFjdG9yeSwgaW50IGZsYWdzLAorICAgICAgICAgICAgRGF0YWJhc2VFcnJvckhhbmRsZXIgZXJyb3JIYW5kbGVyLCBzaG9ydCBjb25uZWN0aW9uTnVtKSB7CiAgICAgICAgIGlmIChwYXRoID09IG51bGwpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInBhdGggc2hvdWxkIG5vdCBiZSBudWxsIik7CiAgICAgICAgIH0KQEAgLTE4MjYsMjUgKzE5OTEsMTEgQEAKICAgICAgICAgbVNsb3dRdWVyeVRocmVzaG9sZCA9IFN5c3RlbVByb3BlcnRpZXMuZ2V0SW50KExPR19TTE9XX1FVRVJJRVNfUFJPUEVSVFksIC0xKTsKICAgICAgICAgbVN0YWNrVHJhY2UgPSBuZXcgRGF0YWJhc2VPYmplY3ROb3RDbG9zZWRFeGNlcHRpb24oKS5maWxsSW5TdGFja1RyYWNlKCk7CiAgICAgICAgIG1GYWN0b3J5ID0gZmFjdG9yeTsKLSAgICAgICAgZGJvcGVuKG1QYXRoLCBtRmxhZ3MpOwotICAgICAgICBpZiAoU1FMaXRlRGVidWcuREVCVUdfU1FMX0NBQ0hFKSB7Ci0gICAgICAgICAgICBtVGltZU9wZW5lZCA9IGdldFRpbWUoKTsKLSAgICAgICAgfQogICAgICAgICBtUHJvZ3JhbXMgPSBuZXcgV2Vha0hhc2hNYXA8U1FMaXRlQ2xvc2FibGUsT2JqZWN0PigpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgc2V0TG9jYWxlKExvY2FsZS5nZXREZWZhdWx0KCkpOwotICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExvZy5lKFRBRywgIkZhaWxlZCB0byBzZXRMb2NhbGUoKSB3aGVuIGNvbnN0cnVjdGluZywgY2xvc2luZyB0aGUgZGF0YWJhc2UiLCBlKTsKLSAgICAgICAgICAgIGRiY2xvc2UoKTsKLSAgICAgICAgICAgIGlmIChTUUxpdGVEZWJ1Zy5ERUJVR19TUUxfQ0FDSEUpIHsKLSAgICAgICAgICAgICAgICBtVGltZUNsb3NlZCA9IGdldFRpbWUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRocm93IGU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRUaW1lKCkgewotICAgICAgICByZXR1cm4gbmV3IFNpbXBsZURhdGVGb3JtYXQoInl5eXktTU0tZGQgSEg6bW06c3MuU1NTICIpLmZvcm1hdChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7CisgICAgICAgIC8vIFNldCB0aGUgRGF0YWJhc2VFcnJvckhhbmRsZXIgdG8gYmUgdXNlZCB3aGVuIFNRTGl0ZSByZXBvcnRzIGNvcnJ1cHRpb24uCisgICAgICAgIC8vIElmIHRoZSBjYWxsZXIgc2V0cyBlcnJvckhhbmRsZXIgPSBudWxsLCB0aGVuIHVzZSBkZWZhdWx0IGVycm9yaGFuZGxlci4KKyAgICAgICAgbUVycm9ySGFuZGxlciA9IChlcnJvckhhbmRsZXIgPT0gbnVsbCkgPyBuZXcgRGVmYXVsdERhdGFiYXNlRXJyb3JIYW5kbGVyKCkgOiBlcnJvckhhbmRsZXI7CisgICAgICAgIG1Db25uZWN0aW9uTnVtID0gY29ubmVjdGlvbk51bTsKICAgICB9CiAKICAgICAvKioKQEAgLTE5NzAsNiArMjEyMSwxOSBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgLyogcGFja2FnZSAqLyB2b2lkIHZlcmlmeURiSXNPcGVuKCkgeworICAgICAgICBpZiAoIWlzT3BlbigpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJkYXRhYmFzZSAiICsgZ2V0UGF0aCgpICsgIiBhbHJlYWR5IGNsb3NlZCIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogcGFja2FnZSAqLyB2b2lkIHZlcmlmeUxvY2tPd25lcigpIHsKKyAgICAgICAgdmVyaWZ5RGJJc09wZW4oKTsKKyAgICAgICAgaWYgKG1Mb2NraW5nRW5hYmxlZCAmJiAhaXNEYkxvY2tlZEJ5Q3VycmVudFRocmVhZCgpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJEb24ndCBoYXZlIGRhdGFiYXNlIGxvY2shIik7CisgICAgICAgIH0KKyAgICB9CisKICAgICAvKgogICAgICAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICAgKgpAQCAtMTk3NywyMiArMjE0MSwxNCBAQAogICAgICAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICAgKi8KICAgICAvKioKLSAgICAgKiBhZGRzIHRoZSBnaXZlbiBzcWwgYW5kIGl0cyBjb21waWxlZC1zdGF0ZW1lbnQtaWQtcmV0dXJuZWQtYnktc3FsaXRlIHRvIHRoZQorICAgICAqIEFkZHMgdGhlIGdpdmVuIFNRTCBhbmQgaXRzIGNvbXBpbGVkLXN0YXRlbWVudC1pZC1yZXR1cm5lZC1ieS1zcWxpdGUgdG8gdGhlCiAgICAgICogY2FjaGUgb2YgY29tcGlsZWRRdWVyaWVzIGF0dGFjaGVkIHRvICd0aGlzJy4KLSAgICAgKgotICAgICAqIGlmIHRoZXJlIGlzIGFscmVhZHkgYSB7QGxpbmsgU1FMaXRlQ29tcGlsZWRTcWx9IGluIGNvbXBpbGVkUXVlcmllcyBmb3IgdGhlIGdpdmVuIHNxbCwKKyAgICAgKiA8cD4KKyAgICAgKiBJZiB0aGVyZSBpcyBhbHJlYWR5IGEge0BsaW5rIFNRTGl0ZUNvbXBpbGVkU3FsfSBpbiBjb21waWxlZFF1ZXJpZXMgZm9yIHRoZSBnaXZlbiBTUUwsCiAgICAgICogdGhlIG5ldyB7QGxpbmsgU1FMaXRlQ29tcGlsZWRTcWx9IG9iamVjdCBpcyBOT1QgaW5zZXJ0ZWQgaW50byB0aGUgY2FjaGUgKGkuZS4sdGhlIGN1cnJlbnQKICAgICAgKiBtYXBwaW5nIGlzIE5PVCByZXBsYWNlZCB3aXRoIHRoZSBuZXcgbWFwcGluZykuCiAgICAgICovCiAgICAgLyogcGFja2FnZSAqLyB2b2lkIGFkZFRvQ29tcGlsZWRRdWVyaWVzKFN0cmluZyBzcWwsIFNRTGl0ZUNvbXBpbGVkU3FsIGNvbXBpbGVkU3RhdGVtZW50KSB7Ci0gICAgICAgIGlmIChtTWF4U3FsQ2FjaGVTaXplID09IDApIHsKLSAgICAgICAgICAgIC8vIGZvciB0aGlzIGRhdGFiYXNlLCB0aGVyZSBpcyBubyBjYWNoZSBvZiBjb21waWxlZCBzcWwuCi0gICAgICAgICAgICBpZiAoU1FMaXRlRGVidWcuREVCVUdfU1FMX0NBQ0hFKSB7Ci0gICAgICAgICAgICAgICAgTG9nLnYoVEFHLCAifE5PVCBhZGRpbmdfc3FsX3RvX2NhY2hlfCIgKyBnZXRQYXRoKCkgKyAifCIgKyBzcWwpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KICAgICAgICAgU1FMaXRlQ29tcGlsZWRTcWwgY29tcGlsZWRTcWwgPSBudWxsOwogICAgICAgICBzeW5jaHJvbml6ZWQobUNvbXBpbGVkUXVlcmllcykgewogICAgICAgICAgICAgLy8gZG9uJ3QgaW5zZXJ0IHRoZSBuZXcgbWFwcGluZyBpZiBhIG1hcHBpbmcgYWxyZWFkeSBleGlzdHMKQEAgLTIwMDAsMzUgKzIxNTYsMzAgQEAKICAgICAgICAgICAgIGlmIChjb21waWxlZFNxbCAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gYWRkIHRoaXMgPHNxbCwgY29tcGlsZWRTdGF0ZW1lbnQ+IHRvIHRoZSBjYWNoZQorCiAgICAgICAgICAgICBpZiAobUNvbXBpbGVkUXVlcmllcy5zaXplKCkgPT0gbU1heFNxbENhY2hlU2l6ZSkgewogICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgICogY2FjaGUgc2l6ZSBvZiB7QGxpbmsgI21NYXhTcWxDYWNoZVNpemV9IGlzIG5vdCBlbm91Z2ggZm9yIHRoaXMgYXBwLgotICAgICAgICAgICAgICAgICAqIGxvZyBhIHdhcm5pbmcgTUFYX1dBUk5JTkdTX09OX0NBQ0hFU0laRV9DT05ESVRJT04gdGltZXMKLSAgICAgICAgICAgICAgICAgKiBjaGFuY2VzIGFyZSBpdCBpcyBOT1QgdXNpbmcgPyBmb3IgYmluZGFyZ3MgLSBzbyBjYWNoaW5nIGlzIHVzZWxlc3MuCi0gICAgICAgICAgICAgICAgICogVE9ETzogZWl0aGVyIGxldCB0aGUgY2FsbGVycyBzZXQgbWF4IGNjaGVzaXplIGZvciB0aGVpciBhcHAsIG9yIGludGVsbGlnZW50bHkKLSAgICAgICAgICAgICAgICAgKiBmaWd1cmUgb3V0IHdoYXQgc2hvdWxkIGJlIGNhY2hlZCBmb3IgYSBnaXZlbiBhcHAuCisgICAgICAgICAgICAgICAgICogbG9nIGEgd2FybmluZy4KKyAgICAgICAgICAgICAgICAgKiBjaGFuY2VzIGFyZSBpdCBpcyBOT1QgdXNpbmcgPyBmb3IgYmluZGFyZ3MgLSBvciBjYWNoZXNpemUgaXMgdG9vIHNtYWxsLgogICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgIGlmICgrK21DYWNoZUZ1bGxXYXJuaW5ncyA9PSBNQVhfV0FSTklOR1NfT05fQ0FDSEVTSVpFX0NPTkRJVElPTikgewogICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJSZWFjaGVkIE1BWCBzaXplIGZvciBjb21waWxlZC1zcWwgc3RhdGVtZW50IGNhY2hlIGZvciBkYXRhYmFzZSAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRQYXRoKCkgKyAiOyBpLmUuLCBOTyBzcGFjZSBmb3IgdGhpcyBzcWwgc3RhdGVtZW50IGluIGNhY2hlOiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcWwgKyAiLiBQbGVhc2UgY2hhbmdlIHlvdXIgc3FsIHN0YXRlbWVudHMgdG8gdXNlICc/JyBmb3IgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgImJpbmRhcmdzLCBpbnN0ZWFkIG9mIHVzaW5nIGFjdHVhbCB2YWx1ZXMiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRQYXRoKCkgKyAiLiBDb25zaWRlciBpbmNyZWFzaW5nIGNhY2hlc2l6ZS4iKTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gZG9uJ3QgYWRkIHRoaXMgZW50cnkgdG8gY2FjaGUKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gY2FjaGUgaXMgTk9UIGZ1bGwuIGFkZCB0aGlzIHRvIGNhY2hlLgotICAgICAgICAgICAgICAgIG1Db21waWxlZFF1ZXJpZXMucHV0KHNxbCwgY29tcGlsZWRTdGF0ZW1lbnQpOwotICAgICAgICAgICAgICAgIGlmIChTUUxpdGVEZWJ1Zy5ERUJVR19TUUxfQ0FDSEUpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLnYoVEFHLCAifGFkZGluZ19zcWxfdG9fY2FjaGV8IiArIGdldFBhdGgoKSArICJ8IiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvbXBpbGVkUXVlcmllcy5zaXplKCkgKyAifCIgKyBzcWwpOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gCisgICAgICAgICAgICAvKiBhZGQgdGhlIGdpdmVuIFNRTGl0ZUNvbXBpbGVkU3FsIGNvbXBpbGVkU3RhdGVtZW50IHRvIGNhY2hlLgorICAgICAgICAgICAgICogbm8gbmVlZCB0byB3b3JyeSBhYm91dCB0aGUgY2FjaGUgc2l6ZSAtIGJlY2F1c2Uge0BsaW5rICNtQ29tcGlsZWRRdWVyaWVzfQorICAgICAgICAgICAgICogc2VsZi1saW1pdHMgaXRzIHNpemUgdG8ge0BsaW5rICNtTWF4U3FsQ2FjaGVTaXplfS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgbUNvbXBpbGVkUXVlcmllcy5wdXQoc3FsLCBjb21waWxlZFN0YXRlbWVudCk7CisgICAgICAgICAgICBpZiAoU1FMaXRlRGVidWcuREVCVUdfU1FMX0NBQ0hFKSB7CisgICAgICAgICAgICAgICAgTG9nLnYoVEFHLCAifGFkZGluZ19zcWxfdG9fY2FjaGV8IiArIGdldFBhdGgoKSArICJ8IiArCisgICAgICAgICAgICAgICAgICAgICAgICBtQ29tcGlsZWRRdWVyaWVzLnNpemUoKSArICJ8IiArIHNxbCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuOwogICAgIH0KIAotCiAgICAgcHJpdmF0ZSB2b2lkIGRlYWxsb2NDYWNoZWRTcWxTdGF0ZW1lbnRzKCkgewogICAgICAgICBzeW5jaHJvbml6ZWQgKG1Db21waWxlZFF1ZXJpZXMpIHsKICAgICAgICAgICAgIGZvciAoU1FMaXRlQ29tcGlsZWRTcWwgY29tcGlsZWRTcWwgOiBtQ29tcGlsZWRRdWVyaWVzLnZhbHVlcygpKSB7CkBAIC0yMDM5LDIwICsyMTkwLDEzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogZnJvbSB0aGUgY29tcGlsZWRRdWVyaWVzIGNhY2hlLCByZXR1cm5zIHRoZSBjb21waWxlZC1zdGF0ZW1lbnQtaWQgZm9yIHRoZSBnaXZlbiBzcWwuCi0gICAgICogcmV0dXJucyBudWxsLCBpZiBub3QgZm91bmQgaW4gdGhlIGNhY2hlLgorICAgICAqIEZyb20gdGhlIGNvbXBpbGVkUXVlcmllcyBjYWNoZSwgcmV0dXJucyB0aGUgY29tcGlsZWQtc3RhdGVtZW50LWlkIGZvciB0aGUgZ2l2ZW4gU1FMLgorICAgICAqIFJldHVybnMgbnVsbCwgaWYgbm90IGZvdW5kIGluIHRoZSBjYWNoZS4KICAgICAgKi8KICAgICAvKiBwYWNrYWdlICovIFNRTGl0ZUNvbXBpbGVkU3FsIGdldENvbXBpbGVkU3RhdGVtZW50Rm9yU3FsKFN0cmluZyBzcWwpIHsKICAgICAgICAgU1FMaXRlQ29tcGlsZWRTcWwgY29tcGlsZWRTdGF0ZW1lbnQgPSBudWxsOwogICAgICAgICBib29sZWFuIGNhY2hlSGl0OwogICAgICAgICBzeW5jaHJvbml6ZWQobUNvbXBpbGVkUXVlcmllcykgewotICAgICAgICAgICAgaWYgKG1NYXhTcWxDYWNoZVNpemUgPT0gMCkgewotICAgICAgICAgICAgICAgIC8vIGZvciB0aGlzIGRhdGFiYXNlLCB0aGVyZSBpcyBubyBjYWNoZSBvZiBjb21waWxlZCBzcWwuCi0gICAgICAgICAgICAgICAgaWYgKFNRTGl0ZURlYnVnLkRFQlVHX1NRTF9DQUNIRSkgewotICAgICAgICAgICAgICAgICAgICBMb2cudihUQUcsICJ8Y2FjaGUgTk9UIGZvdW5kfCIgKyBnZXRQYXRoKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KICAgICAgICAgICAgIGNhY2hlSGl0ID0gKGNvbXBpbGVkU3RhdGVtZW50ID0gbUNvbXBpbGVkUXVlcmllcy5nZXQoc3FsKSkgIT0gbnVsbDsKICAgICAgICAgfQogICAgICAgICBpZiAoY2FjaGVIaXQpIHsKQEAgLTIwNjUsNjMgKzIyMDksMjQgQEAKICAgICAgICAgICAgIExvZy52KFRBRywgInxjYWNoZV9zdGF0c3wiICsKICAgICAgICAgICAgICAgICAgICAgZ2V0UGF0aCgpICsgInwiICsgbUNvbXBpbGVkUXVlcmllcy5zaXplKCkgKwogICAgICAgICAgICAgICAgICAgICAifCIgKyBtTnVtQ2FjaGVIaXRzICsgInwiICsgbU51bUNhY2hlTWlzc2VzICsKLSAgICAgICAgICAgICAgICAgICAgInwiICsgY2FjaGVIaXQgKyAifCIgKyBtVGltZU9wZW5lZCArICJ8IiArIG1UaW1lQ2xvc2VkICsgInwiICsgc3FsKTsKKyAgICAgICAgICAgICAgICAgICAgInwiICsgY2FjaGVIaXQgKyAifCIgKyBzcWwpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBjb21waWxlZFN0YXRlbWVudDsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiByZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIHNxbCBpcyBjYWNoZWQgaW4gY29tcGlsZWQtc3FsIGNhY2hlLgotICAgICAqIEBoaWRlCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNJbkNvbXBpbGVkU3FsQ2FjaGUoU3RyaW5nIHNxbCkgewotICAgICAgICBzeW5jaHJvbml6ZWQobUNvbXBpbGVkUXVlcmllcykgewotICAgICAgICAgICAgcmV0dXJuIG1Db21waWxlZFF1ZXJpZXMuY29udGFpbnNLZXkoc3FsKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIHB1cmdlcyB0aGUgZ2l2ZW4gc3FsIGZyb20gdGhlIGNvbXBpbGVkLXNxbCBjYWNoZS4KLSAgICAgKiBAaGlkZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHB1cmdlRnJvbUNvbXBpbGVkU3FsQ2FjaGUoU3RyaW5nIHNxbCkgewotICAgICAgICBzeW5jaHJvbml6ZWQobUNvbXBpbGVkUXVlcmllcykgewotICAgICAgICAgICAgbUNvbXBpbGVkUXVlcmllcy5yZW1vdmUoc3FsKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIHJlbW92ZSBldmVyeXRoaW5nIGZyb20gdGhlIGNvbXBpbGVkIHNxbCBjYWNoZQotICAgICAqIEBoaWRlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVzZXRDb21waWxlZFNxbENhY2hlKCkgewotICAgICAgICBzeW5jaHJvbml6ZWQobUNvbXBpbGVkUXVlcmllcykgewotICAgICAgICAgICAgbUNvbXBpbGVkUXVlcmllcy5jbGVhcigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogcmV0dXJuIHRoZSBjdXJyZW50IG1heENhY2hlU3FsQ2FjaGVTaXplCi0gICAgICogQGhpZGUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGludCBnZXRNYXhTcWxDYWNoZVNpemUoKSB7Ci0gICAgICAgIHJldHVybiBtTWF4U3FsQ2FjaGVTaXplOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHNldCB0aGUgbWF4IHNpemUgb2YgdGhlIGNvbXBpbGVkIHNxbCBjYWNoZSBmb3IgdGhpcyBkYXRhYmFzZSBhZnRlciBwdXJnaW5nIHRoZSBjYWNoZS4KKyAgICAgKiBTZXRzIHRoZSBtYXhpbXVtIHNpemUgb2YgdGhlIHByZXBhcmVkLXN0YXRlbWVudCBjYWNoZSBmb3IgdGhpcyBkYXRhYmFzZS4KICAgICAgKiAoc2l6ZSBvZiB0aGUgY2FjaGUgPSBudW1iZXIgb2YgY29tcGlsZWQtc3FsLXN0YXRlbWVudHMgc3RvcmVkIGluIHRoZSBjYWNoZSkuCisgICAgICo8cD4KKyAgICAgKiBNYXhpbXVtIGNhY2hlIHNpemUgY2FuIE9OTFkgYmUgaW5jcmVhc2VkIGZyb20gaXRzIGN1cnJlbnQgc2l6ZSAoZGVmYXVsdCA9IDEwKS4KKyAgICAgKiBJZiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgd2l0aCBzbWFsbGVyIHNpemUgdGhhbiB0aGUgY3VycmVudCBtYXhpbXVtIHZhbHVlLAorICAgICAqIHRoZW4gSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlzIHRocm93bi4KKyAgICAgKjxwPgorICAgICAqIFRoaXMgbWV0aG9kIGlzIHRocmVhZC1zYWZlLgogICAgICAqCi0gICAgICogbWF4IGNhY2hlIHNpemUgY2FuIE9OTFkgYmUgaW5jcmVhc2VkIGZyb20gaXRzIGN1cnJlbnQgc2l6ZSAoZGVmYXVsdCA9IDApLgotICAgICAqIGlmIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aXRoIHNtYWxsZXIgc2l6ZSB0aGFuIHRoZSBjdXJyZW50IHZhbHVlIG9mIG1NYXhTcWxDYWNoZVNpemUsCi0gICAgICogdGhlbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaXMgdGhyb3duCi0gICAgICoKLSAgICAgKiBzeW5jaHJvbml6ZWQgYmVjYXVzZSB3ZSBkb24ndCB3YW50IHQgdGhyZWFkcyB0byBjaGFuZ2UgY2FjaGUgc2l6ZSBhdCB0aGUgc2FtZSB0aW1lLgotICAgICAqIEBwYXJhbSBjYWNoZVNpemUgdGhlIHNpemUgb2YgdGhlIGNhY2hlLiBjYW4gYmUgKDAgdG8gTUFYX1NRTF9DQUNIRV9TSVpFKQotICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIGlucHV0IGNhY2hlU2l6ZSA+IE1BWF9TUUxfQ0FDSEVfU0laRSBvciA8IDAgb3IKLSAgICAgKiA8IHRoZSB2YWx1ZSBzZXQgd2l0aCBwcmV2aW91cyBzZXRNYXhTcWxDYWNoZVNpemUoKSBjYWxsLgotICAgICAqCi0gICAgICogQGhpZGUKKyAgICAgKiBAcGFyYW0gY2FjaGVTaXplIHRoZSBzaXplIG9mIHRoZSBjYWNoZS4gY2FuIGJlICgwIHRvIHtAbGluayAjTUFYX1NRTF9DQUNIRV9TSVpFfSkKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiBpbnB1dCBjYWNoZVNpemUgPiB7QGxpbmsgI01BWF9TUUxfQ0FDSEVfU0laRX0gb3IKKyAgICAgKiA+IHRoZSB2YWx1ZSBzZXQgd2l0aCBwcmV2aW91cyBzZXRNYXhTcWxDYWNoZVNpemUoKSBjYWxsLgogICAgICAqLwogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRNYXhTcWxDYWNoZVNpemUoaW50IGNhY2hlU2l6ZSkgewogICAgICAgICBpZiAoY2FjaGVTaXplID4gTUFYX1NRTF9DQUNIRV9TSVpFIHx8IGNhY2hlU2l6ZSA8IDApIHsKQEAgLTIxMzMsMTIgKzIyMzgsMjE2IEBACiAgICAgICAgIG1NYXhTcWxDYWNoZVNpemUgPSBjYWNoZVNpemU7CiAgICAgfQogCisgICAgLyogcGFja2FnZSAqLyBib29sZWFuIGlzU3FsSW5TdGF0ZW1lbnRDYWNoZShTdHJpbmcgc3FsKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAobUNvbXBpbGVkUXVlcmllcykgeworICAgICAgICAgICAgcmV0dXJuIG1Db21waWxlZFF1ZXJpZXMuY29udGFpbnNLZXkoc3FsKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIHBhY2thZ2UgKi8gdm9pZCBmaW5hbGl6ZVN0YXRlbWVudExhdGVyKGludCBpZCkgeworICAgICAgICBpZiAoIWlzT3BlbigpKSB7CisgICAgICAgICAgICAvLyBkYXRhYmFzZSBhbHJlYWR5IGNsb3NlZC4gdGhpcyBzdGF0ZW1lbnQgd2lsbCBhbHJlYWR5IGhhdmUgYmVlbiBmaW5hbGl6ZWQuCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgc3luY2hyb25pemVkKG1DbG9zZWRTdGF0ZW1lbnRJZHMpIHsKKyAgICAgICAgICAgIGlmIChtQ2xvc2VkU3RhdGVtZW50SWRzLmNvbnRhaW5zKGlkKSkgeworICAgICAgICAgICAgICAgIC8vIHRoaXMgc3RhdGVtZW50IGlkIGlzIGFscmVhZHkgcXVldWVkIHVwIGZvciBmaW5hbGl6YXRpb24uCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUNsb3NlZFN0YXRlbWVudElkcy5hZGQoaWQpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogcHVibGljIHZpc2liaWxpdHkgb25seSBmb3IgdGVzdGluZy4gb3RoZXJ3aXNlLCBwYWNrYWdlIHZpc2liaWxpdHkgaXMgc3VmZmljaWVudAorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHZvaWQgY2xvc2VQZW5kaW5nU3RhdGVtZW50cygpIHsKKyAgICAgICAgaWYgKCFpc09wZW4oKSkgeworICAgICAgICAgICAgLy8gc2luY2UgdGhpcyBkYXRhYmFzZSBpcyBhbHJlYWR5IGNsb3NlZCwgbm8gbmVlZCB0byBmaW5hbGl6ZSBhbnl0aGluZy4KKyAgICAgICAgICAgIG1DbG9zZWRTdGF0ZW1lbnRJZHMuY2xlYXIoKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICB2ZXJpZnlMb2NrT3duZXIoKTsKKyAgICAgICAgLyogdG8gbWluaW1pemUgc3luY2hyb25pemF0aW9uIG9uIG1DbG9zZWRTdGF0ZW1lbnRJZHMsIG1ha2UgYSBjb3B5IG9mIHRoZSBsaXN0ICovCisgICAgICAgIEFycmF5TGlzdDxJbnRlZ2VyPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxJbnRlZ2VyPihtQ2xvc2VkU3RhdGVtZW50SWRzLnNpemUoKSk7CisgICAgICAgIHN5bmNocm9uaXplZChtQ2xvc2VkU3RhdGVtZW50SWRzKSB7CisgICAgICAgICAgICBsaXN0LmFkZEFsbChtQ2xvc2VkU3RhdGVtZW50SWRzKTsKKyAgICAgICAgICAgIG1DbG9zZWRTdGF0ZW1lbnRJZHMuY2xlYXIoKTsKKyAgICAgICAgfQorICAgICAgICAvLyBmaW5hbGl6ZSBhbGwgdGhlIHN0YXRlbWVudHMgZnJvbSB0aGUgY29waWVkIGxpc3QKKyAgICAgICAgaW50IHNpemUgPSBsaXN0LnNpemUoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgICAgIG5hdGl2ZV9maW5hbGl6ZShsaXN0LmdldChpKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBmb3IgdGVzdGluZyBvbmx5CisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgQXJyYXlMaXN0PEludGVnZXI+IGdldFF1ZXVlZFVwU3RtdExpc3QoKSB7CisgICAgICAgIHJldHVybiBtQ2xvc2VkU3RhdGVtZW50SWRzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgbWV0aG9kIGVuYWJsZXMgcGFyYWxsZWwgZXhlY3V0aW9uIG9mIHF1ZXJpZXMgZnJvbSBtdWx0aXBsZSB0aHJlYWRzIG9uIHRoZSBzYW1lIGRhdGFiYXNlLgorICAgICAqIEl0IGRvZXMgdGhpcyBieSBvcGVuaW5nIG11bHRpcGxlIGhhbmRsZXMgdG8gdGhlIGRhdGFiYXNlIGFuZCB1c2luZyBhIGRpZmZlcmVudAorICAgICAqIGRhdGFiYXNlIGhhbmRsZSBmb3IgZWFjaCBxdWVyeS4KKyAgICAgKiA8cD4KKyAgICAgKiBJZiBhIHRyYW5zYWN0aW9uIGlzIGluIHByb2dyZXNzIG9uIG9uZSBjb25uZWN0aW9uIGhhbmRsZSBhbmQgc2F5LCBhIHRhYmxlIGlzIHVwZGF0ZWQgaW4gdGhlCisgICAgICogdHJhbnNhY3Rpb24sIHRoZW4gcXVlcnkgb24gdGhlIHNhbWUgdGFibGUgb24gYW5vdGhlciBjb25uZWN0aW9uIGhhbmRsZSB3aWxsIGJsb2NrIGZvciB0aGUKKyAgICAgKiB0cmFuc2FjdGlvbiB0byBjb21wbGV0ZS4gQnV0IHRoaXMgbWV0aG9kIGVuYWJsZXMgc3VjaCBxdWVyaWVzIHRvIGV4ZWN1dGUgYnkgaGF2aW5nIHRoZW0KKyAgICAgKiByZXR1cm4gb2xkIHZlcnNpb24gb2YgdGhlIGRhdGEgZnJvbSB0aGUgdGFibGUuIE1vc3Qgb2Z0ZW4gaXQgaXMgdGhlIGRhdGEgdGhhdCBleGlzdGVkIGluIHRoZQorICAgICAqIHRhYmxlIHByaW9yIHRvIHRoZSBhYm92ZSB0cmFuc2FjdGlvbiB1cGRhdGVzIG9uIHRoYXQgdGFibGUuCisgICAgICogPHA+CisgICAgICogTWF4aW11bSBudW1iZXIgb2Ygc2ltdWx0YW5lb3VzIGhhbmRsZXMgdXNlZCB0byBleGVjdXRlIHF1ZXJpZXMgaW4gcGFyYWxsZWwgaXMKKyAgICAgKiBkZXBlbmRlbnQgdXBvbiB0aGUgZGV2aWNlIG1lbW9yeSBhbmQgcG9zc2libHkgb3RoZXIgcHJvcGVydGllcy4KKyAgICAgKiA8cD4KKyAgICAgKiBBZnRlciBjYWxsaW5nIHRoaXMgbWV0aG9kLCBleGVjdXRpb24gb2YgcXVlcmllcyBpbiBwYXJhbGxlbCBpcyBlbmFibGVkIGFzIGxvbmcgYXMgdGhpcworICAgICAqIGRhdGFiYXNlIGhhbmRsZSBpcyBvcGVuLiBUbyBkaXNhYmxlIGV4ZWN1dGlvbiBvZiBxdWVyaWVzIGluIHBhcmFsbGVsLCBkYXRhYmFzZSBzaG91bGQKKyAgICAgKiBiZSBjbG9zZWQgYW5kIHJlb3BlbmVkLgorICAgICAqIDxwPgorICAgICAqIElmIGEgcXVlcnkgaXMgcGFydCBvZiBhIHRyYW5zYWN0aW9uLCB0aGVuIGl0IGlzIGV4ZWN1dGVkIG9uIHRoZSBzYW1lIGRhdGFiYXNlIGhhbmRsZSB0aGUKKyAgICAgKiB0cmFuc2FjdGlvbiB3YXMgYmVndW4uCisgICAgICogPHA+CisgICAgICogSWYgdGhlIGRhdGFiYXNlIGhhcyBhbnkgYXR0YWNoZWQgZGF0YWJhc2VzLCB0aGVuIGV4ZWN1dGlvbiBvZiBxdWVyaWVzIGluIHBhcmFsZWwgaXMgTk9UCisgICAgICogcG9zc2libGUuIEluIHN1Y2ggY2FzZXMsIGEgbWVzc2FnZSBpcyBwcmludGVkIHRvIGxvZ2NhdCBhbmQgZmFsc2UgaXMgcmV0dXJuZWQuCisgICAgICogPHA+CisgICAgICogVGhpcyBmZWF0dXJlIGlzIG5vdCBhdmFpbGFibGUgZm9yIDptZW1vcnk6IGRhdGFiYXNlcy4gSW4gc3VjaCBjYXNlcywKKyAgICAgKiBhIG1lc3NhZ2UgaXMgcHJpbnRlZCB0byBsb2djYXQgYW5kIGZhbHNlIGlzIHJldHVybmVkLgorICAgICAqIDxwPgorICAgICAqIEEgdHlwaWNhbCB3YXkgdG8gdXNlIHRoaXMgbWV0aG9kIGlzIHRoZSBmb2xsb3dpbmc6CisgICAgICogPHByZT4KKyAgICAgKiAgICAgU1FMaXRlRGF0YWJhc2UgZGIgPSBTUUxpdGVEYXRhYmFzZS5vcGVuRGF0YWJhc2UoImRiX2ZpbGVuYW1lIiwgY3Vyc29yRmFjdG9yeSwKKyAgICAgKiAgICAgICAgICAgICBDUkVBVEVfSUZfTkVDRVNTQVJZLCBteURhdGFiYXNlRXJyb3JIYW5kbGVyKTsKKyAgICAgKiAgICAgZGIuZW5hYmxlV3JpdGVBaGVhZExvZ2dpbmcoKTsKKyAgICAgKiA8L3ByZT4KKyAgICAgKiA8cD4KKyAgICAgKiBXcml0ZXJzIHNob3VsZCB1c2Uge0BsaW5rICNiZWdpblRyYW5zYWN0aW9uTm9uRXhjbHVzaXZlKCl9IG9yCisgICAgICoge0BsaW5rICNiZWdpblRyYW5zYWN0aW9uV2l0aExpc3RlbmVyTm9uRXhjbHVzaXZlKFNRTGl0ZVRyYW5zYWN0aW9uTGlzdGVuZXIpfQorICAgICAqIHRvIHN0YXJ0IGEgdHJzbnNhY3Rpb24uCisgICAgICogTm9uLWV4Y2x1c2l2ZSBtb2RlIGFsbG93cyBkYXRhYmFzZSBmaWxlIHRvIGJlIGluIHJlYWRhYmxlIGJ5IHRocmVhZHMgZXhlY3V0aW5nIHF1ZXJpZXMuCisgICAgICogPC9wPgorICAgICAqCisgICAgICogQHJldHVybiB0cnVlIGlmIHdyaXRlLWFoZWFkLWxvZ2dpbmcgaXMgc2V0LiBmYWxzZSBvdGhlcndpc2UKKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gZW5hYmxlV3JpdGVBaGVhZExvZ2dpbmcoKSB7CisgICAgICAgIGlmIChtUGF0aC5lcXVhbHNJZ25vcmVDYXNlKE1FTU9SWV9EQl9QQVRIKSkgeworICAgICAgICAgICAgTG9nLmkoVEFHLCAiY2FuJ3QgZW5hYmxlIFdBTCBmb3IgbWVtb3J5IGRhdGFiYXNlcy4iKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIG1ha2Ugc3VyZSB0aGlzIGRhdGFiYXNlIGhhcyBOTyBhdHRhY2hlZCBkYXRhYmFzZXMgYmVjYXVzZSBzcWxpdGUncyB3cml0ZS1haGVhZC1sb2dnaW5nCisgICAgICAgIC8vIGRvZXNuJ3Qgd29yayBmb3IgZGF0YWJhc2VzIHdpdGggYXR0YWNoZWQgZGF0YWJhc2VzCisgICAgICAgIGlmIChnZXRBdHRhY2hlZERicygpLnNpemUoKSA+IDEpIHsKKyAgICAgICAgICAgIExvZy5pKFRBRywgInRoaXMgZGF0YWJhc2U6ICIgKyBtUGF0aCArICIgaGFzIGF0dGFjaGVkIGRhdGFiYXNlcy4gY2FuJ3QgIGVuYWJsZSBXQUwuIik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1Db25uZWN0aW9uUG9vbCA9PSBudWxsKSB7CisgICAgICAgICAgICBtQ29ubmVjdGlvblBvb2wgPSBuZXcgRGF0YWJhc2VDb25uZWN0aW9uUG9vbCh0aGlzKTsKKyAgICAgICAgICAgIHNldEpvdXJuYWxNb2RlKG1QYXRoLCAiV0FMIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBkaXNhYmxlV3JpdGVBaGVhZExvZ2dpbmcoKSB7CisgICAgICAgIGlmIChtQ29ubmVjdGlvblBvb2wgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIG1Db25uZWN0aW9uUG9vbC5jbG9zZSgpOworICAgICAgICBtQ29ubmVjdGlvblBvb2wgPSBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGRhdGFiYXNlIGNvbm5lY3Rpb24gaGFuZGxlIHBvb2wgc2l6ZSB0byB0aGUgZ2l2ZW4gdmFsdWUuCisgICAgICogRGF0YWJhc2UgY29ubmVjdGlvbiBoYW5kbGUgcG9vbCBpcyBlbmFibGVkIHdoZW4gdGhlIGFwcCBjYWxscworICAgICAqIHtAbGluayAjZW5hYmxlV3JpdGVBaGVhZExvZ2dpbmcoKX0uCisgICAgICogPHA+CisgICAgICogVGhlIGRlZmF1bHQgY29ubmVjdGlvbiBoYW5kbGUgcG9vbCBpcyBzZXQgYnkgdGhlIHN5c3RlbSBieSB0YWtpbmcgaW50byBhY2NvdW50IHZhcmlvdXMKKyAgICAgKiBhc3BlY3RzIG9mIHRoZSBkZXZpY2UsIHN1Y2ggYXMgbWVtb3J5LCBudW1iZXIgb2YgY29yZXMgZXRjLiBJdCBpcyByZWNvbW1lbmRlZCB0aGF0CisgICAgICogYXBwbGljYXRpb25zIHVzZSB0aGUgZGVmYXVsdCBwb29sIHNpemUgc2V0IGJ5IHRoZSBzeXN0ZW0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2l6ZSB0aGUgdmFsdWUgdGhlIGNvbm5lY3Rpb24gaGFuZGxlIHBvb2wgc2l6ZSBzaG91bGQgYmUgc2V0IHRvLgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRDb25uZWN0aW9uUG9vbFNpemUoaW50IHNpemUpIHsKKyAgICAgICAgaWYgKG1Db25uZWN0aW9uUG9vbCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJjb25uZWN0aW9uIHBvb2wgbm90IGVuYWJsZWQiKTsKKyAgICAgICAgfQorICAgICAgICBpbnQgaSA9IG1Db25uZWN0aW9uUG9vbC5nZXRNYXhQb29sU2l6ZSgpOworICAgICAgICBpZiAoc2l6ZSA8IGkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJjYW5ub3Qgc2V0IG1heCBwb29sIHNpemUgdG8gYSB2YWx1ZSBsZXNzIHRoYW4gdGhlIGN1cnJlbnQgbWF4IHZhbHVlKD0iICsKKyAgICAgICAgICAgICAgICAgICAgaSArICIpIik7CisgICAgICAgIH0KKyAgICAgICAgbUNvbm5lY3Rpb25Qb29sLnNldE1heFBvb2xTaXplKHNpemUpOworICAgIH0KKworICAgIC8qIHBhY2thZ2UgKi8gU1FMaXRlRGF0YWJhc2UgY3JlYXRlUG9vbENvbm5lY3Rpb24oc2hvcnQgY29ubmVjdGlvbk51bSkgeworICAgICAgICByZXR1cm4gb3BlbkRhdGFiYXNlKG1QYXRoLCBtRmFjdG9yeSwgbUZsYWdzLCBtRXJyb3JIYW5kbGVyLCBjb25uZWN0aW9uTnVtKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gaXNQb29sZWRDb25uZWN0aW9uKCkgeworICAgICAgICByZXR1cm4gdGhpcy5tQ29ubmVjdGlvbk51bSA+IDA7CisgICAgfQorCisgICAgcHJpdmF0ZSBTUUxpdGVEYXRhYmFzZSBnZXREYkNvbm5lY3Rpb24oU3RyaW5nIHNxbCkgeworICAgICAgICB2ZXJpZnlEYklzT3BlbigpOworCisgICAgICAgIC8vIHVzZSB0aGUgY3VycmVudCBjb25uZWN0aW9uIGhhbmRsZSBpZgorICAgICAgICAvLyAxLiB0aGlzIGlzIGEgcG9vbGVkIGNvbm5lY3Rpb24gaGFuZGxlCisgICAgICAgIC8vIDIuIE9SLCBpZiB0aGlzIHRocmVhZCBpcyBpbiBhIHRyYW5zYWN0aW9uCisgICAgICAgIC8vIDMuIE9SLCBpZiB0aGVyZSBpcyBOTyBjb25uZWN0aW9uIGhhbmRsZSBwb29sIHNldHVwCisgICAgICAgIFNRTGl0ZURhdGFiYXNlIGRiID0gbnVsbDsKKyAgICAgICAgaWYgKGlzUG9vbGVkQ29ubmVjdGlvbigpIHx8CisgICAgICAgICAgICAgICAgKGluVHJhbnNhY3Rpb24oKSAmJiBtTG9jay5pc0hlbGRCeUN1cnJlbnRUaHJlYWQoKSkgfHwKKyAgICAgICAgICAgICAgICAodGhpcy5tQ29ubmVjdGlvblBvb2wgPT0gbnVsbCkpIHsKKyAgICAgICAgICAgIGRiID0gdGhpczsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIGdldCBhIGNvbm5lY3Rpb24gaGFuZGxlIGZyb20gdGhlIHBvb2wKKyAgICAgICAgICAgIGlmIChMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5ERUJVRykpIHsKKyAgICAgICAgICAgICAgICBhc3NlcnQgbUNvbm5lY3Rpb25Qb29sICE9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkYiA9IG1Db25uZWN0aW9uUG9vbC5nZXQoc3FsKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuREVCVUcpKSB7CisgICAgICAgICAgICBMb2cuZChUQUcsICJnZXREYkNvbm5lY3Rpb24gdGhyZWFkaWQgPSAiICsgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRJZCgpICsKKyAgICAgICAgICAgICAgICAgICAgIiwgcmVxdWVzdCBvbiAjICIgKyBtQ29ubmVjdGlvbk51bSArCisgICAgICAgICAgICAgICAgICAgICIsIGFzc2lnbmVkICMgIiArIGRiLm1Db25uZWN0aW9uTnVtICsgIiwgIiArIGdldFBhdGgoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGRiOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCByZWxlYXNlRGJDb25uZWN0aW9uKFNRTGl0ZURhdGFiYXNlIGRiKSB7CisgICAgICAgIC8vIGlnbm9yZSB0aGlzIHJlbGVhc2UgY2FsbCBpZgorICAgICAgICAvLyAxLiB0aGUgZGF0YWJhc2UgaXMgY2xvc2VkCisgICAgICAgIC8vIDIuIE9SLCBpZiBkYiBpcyBOT1QgYSBwb29sZWQgY29ubmVjdGlvbiBoYW5kbGUKKyAgICAgICAgLy8gMy4gT1IsIGlmIHRoZSBkYXRhYmFzZSBiZWluZyByZWxlYXNlZCBpcyBzYW1lIGFzICd0aGlzJyAodGhpcyBjb25kaXRpb24gbWVhbnMKKyAgICAgICAgLy8gICAgIHRoYXQgd2Ugc2hvdWxkIGFsd2F5cyBiZSByZWxlYXNpbmcgYSBwb29sZWQgY29ubmVjdGlvbiBoYW5kbGUgYnkgY2FsbGluZyB0aGlzIG1ldGhvZAorICAgICAgICAvLyAgICAgZnJvbSB0aGUgJ21haW4nIGNvbm5lY3Rpb24gaGFuZGxlCisgICAgICAgIGlmICghaXNPcGVuKCkgfHwgIWRiLmlzUG9vbGVkQ29ubmVjdGlvbigpIHx8IChkYiA9PSB0aGlzKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmIChMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5ERUJVRykpIHsKKyAgICAgICAgICAgIGFzc2VydCBpc1Bvb2xlZENvbm5lY3Rpb24oKTsKKyAgICAgICAgICAgIGFzc2VydCBtQ29ubmVjdGlvblBvb2wgIT0gbnVsbDsKKyAgICAgICAgICAgIExvZy5kKFRBRywgInJlbGVhc2VEYkNvbm5lY3Rpb24gdGhyZWFkaWQgPSAiICsgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRJZCgpICsKKyAgICAgICAgICAgICAgICAgICAgIiwgcmVsZWFzaW5nICMgIiArIGRiLm1Db25uZWN0aW9uTnVtICsgIiwgIiArIGdldFBhdGgoKSk7CisgICAgICAgIH0KKyAgICAgICAgbUNvbm5lY3Rpb25Qb29sLnJlbGVhc2UoZGIpOworICAgIH0KKwogICAgIHN0YXRpYyBjbGFzcyBBY3RpdmVEYXRhYmFzZXMgewogICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBBY3RpdmVEYXRhYmFzZXMgYWN0aXZlRGF0YWJhc2VzID0gbmV3IEFjdGl2ZURhdGFiYXNlcygpOwogICAgICAgICBwcml2YXRlIEhhc2hTZXQ8V2Vha1JlZmVyZW5jZTxTUUxpdGVEYXRhYmFzZT4+IG1BY3RpdmVEYXRhYmFzZXMgPQotICAgICAgICAgICAgbmV3IEhhc2hTZXQ8V2Vha1JlZmVyZW5jZTxTUUxpdGVEYXRhYmFzZT4+KCk7CisgICAgICAgICAgICAgICAgbmV3IEhhc2hTZXQ8V2Vha1JlZmVyZW5jZTxTUUxpdGVEYXRhYmFzZT4+KCk7CiAgICAgICAgIHByaXZhdGUgQWN0aXZlRGF0YWJhc2VzKCkge30gLy8gZGlzYWJsZSBpbnN0YW50aWF0aW9uIG9mIHRoaXMgY2xhc3MKLSAgICAgICAgc3RhdGljIEFjdGl2ZURhdGFiYXNlcyBnZXRJbnN0YW5jZSgpIHtyZXR1cm4gYWN0aXZlRGF0YWJhc2VzO30KKyAgICAgICAgc3RhdGljIEFjdGl2ZURhdGFiYXNlcyBnZXRJbnN0YW5jZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBhY3RpdmVEYXRhYmFzZXM7CisgICAgICAgIH0KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRBY3RpdmVEYXRhYmFzZShTUUxpdGVEYXRhYmFzZSBzcWxpdGVEYXRhYmFzZSkgeworICAgICAgICAgICAgYWN0aXZlRGF0YWJhc2VzLm1BY3RpdmVEYXRhYmFzZXMuYWRkKG5ldyBXZWFrUmVmZXJlbmNlPFNRTGl0ZURhdGFiYXNlPihzcWxpdGVEYXRhYmFzZSkpOworICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCkBAIC0yMTUyLDg2ICsyNDYxLDEzNCBAQAogICAgICAgICAgICAgaWYgKGRiID09IG51bGwgfHwgIWRiLmlzT3BlbigpKSB7CiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBnZXQgU1FMSVRFX0RCU1RBVFVTX0xPT0tBU0lERV9VU0VEIGZvciB0aGUgZGIKLSAgICAgICAgICAgIGludCBsb29rYXNpZGVVc2VkID0gZGIubmF0aXZlX2dldERiTG9va2FzaWRlKCk7CiAKLSAgICAgICAgICAgIC8vIGdldCB0aGUgbGFzdG5vZGUgb2YgdGhlIGRibmFtZQotICAgICAgICAgICAgU3RyaW5nIHBhdGggPSBkYi5nZXRQYXRoKCk7Ci0gICAgICAgICAgICBpbnQgaW5keCA9IHBhdGgubGFzdEluZGV4T2YoIi8iKTsKLSAgICAgICAgICAgIFN0cmluZyBsYXN0bm9kZSA9IHBhdGguc3Vic3RyaW5nKChpbmR4ICE9IC0xKSA/ICsraW5keCA6IDApOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAvLyBnZXQgU1FMSVRFX0RCU1RBVFVTX0xPT0tBU0lERV9VU0VEIGZvciB0aGUgZGIKKyAgICAgICAgICAgICAgICBpbnQgbG9va2FzaWRlVXNlZCA9IGRiLm5hdGl2ZV9nZXREYkxvb2thc2lkZSgpOwogCi0gICAgICAgICAgICAvLyBnZXQgbGlzdCBvZiBhdHRhY2hlZCBkYnMgYW5kIGZvciBlYWNoIGRiLCBnZXQgaXRzIHNpemUgYW5kIHBhZ2VzaXplCi0gICAgICAgICAgICBBcnJheUxpc3Q8UGFpcjxTdHJpbmcsIFN0cmluZz4+IGF0dGFjaGVkRGJzID0gZ2V0QXR0YWNoZWREYnMoZGIpOwotICAgICAgICAgICAgaWYgKGF0dGFjaGVkRGJzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXR0YWNoZWREYnMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBQYWlyPFN0cmluZywgU3RyaW5nPiBwID0gYXR0YWNoZWREYnMuZ2V0KGkpOwotICAgICAgICAgICAgICAgIGxvbmcgcGFnZUNvdW50ID0gZ2V0UHJhZ21hVmFsKGRiLCBwLmZpcnN0ICsgIi5wYWdlX2NvdW50OyIpOworICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgbGFzdG5vZGUgb2YgdGhlIGRibmFtZQorICAgICAgICAgICAgICAgIFN0cmluZyBwYXRoID0gZGIuZ2V0UGF0aCgpOworICAgICAgICAgICAgICAgIGludCBpbmR4ID0gcGF0aC5sYXN0SW5kZXhPZigiLyIpOworICAgICAgICAgICAgICAgIFN0cmluZyBsYXN0bm9kZSA9IHBhdGguc3Vic3RyaW5nKChpbmR4ICE9IC0xKSA/ICsraW5keCA6IDApOwogCi0gICAgICAgICAgICAgICAgLy8gZmlyc3QgZW50cnkgaW4gdGhlIGF0dGFjaGVkIGRiIGxpc3QgaXMgYWx3YXlzIHRoZSBtYWluIGRhdGFiYXNlCi0gICAgICAgICAgICAgICAgLy8gZG9uJ3Qgd29ycnkgYWJvdXQgcHJlZml4aW5nIHRoZSBkYm5hbWUgd2l0aCAibWFpbiIKLSAgICAgICAgICAgICAgICBTdHJpbmcgZGJOYW1lOwotICAgICAgICAgICAgICAgIGlmIChpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgZGJOYW1lID0gbGFzdG5vZGU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gbG9va2FzaWRlIGlzIG9ubHkgcmVsZXZhbnQgZm9yIHRoZSBtYWluIGRiCi0gICAgICAgICAgICAgICAgICAgIGxvb2thc2lkZVVzZWQgPSAwOwotICAgICAgICAgICAgICAgICAgICBkYk5hbWUgPSAiICAoYXR0YWNoZWQpICIgKyBwLmZpcnN0OwotICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGUgYXR0YWNoZWQgZGIgaGFzIGEgcGF0aCwgYXR0YWNoIHRoZSBsYXN0bm9kZSBmcm9tIHRoZSBwYXRoIHRvIGFib3ZlCi0gICAgICAgICAgICAgICAgICAgIGlmIChwLnNlY29uZC50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgaWR4ID0gcC5zZWNvbmQubGFzdEluZGV4T2YoIi8iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRiTmFtZSArPSAiIDogIiArIHAuc2Vjb25kLnN1YnN0cmluZygoaWR4ICE9IC0xKSA/ICsraWR4IDogMCk7CisgICAgICAgICAgICAgICAgLy8gZ2V0IGxpc3Qgb2YgYXR0YWNoZWQgZGJzIGFuZCBmb3IgZWFjaCBkYiwgZ2V0IGl0cyBzaXplIGFuZCBwYWdlc2l6ZQorICAgICAgICAgICAgICAgIEFycmF5TGlzdDxQYWlyPFN0cmluZywgU3RyaW5nPj4gYXR0YWNoZWREYnMgPSBkYi5nZXRBdHRhY2hlZERicygpOworICAgICAgICAgICAgICAgIGlmIChhdHRhY2hlZERicyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGF0dGFjaGVkRGJzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIFBhaXI8U3RyaW5nLCBTdHJpbmc+IHAgPSBhdHRhY2hlZERicy5nZXQoaSk7CisgICAgICAgICAgICAgICAgICAgIGxvbmcgcGFnZUNvdW50ID0gRGF0YWJhc2VVdGlscy5sb25nRm9yUXVlcnkoZGIsICJQUkFHTUEgIiArIHAuZmlyc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIucGFnZV9jb3VudDsiLCBudWxsKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBmaXJzdCBlbnRyeSBpbiB0aGUgYXR0YWNoZWQgZGIgbGlzdCBpcyBhbHdheXMgdGhlIG1haW4gZGF0YWJhc2UKKyAgICAgICAgICAgICAgICAgICAgLy8gZG9uJ3Qgd29ycnkgYWJvdXQgcHJlZml4aW5nIHRoZSBkYm5hbWUgd2l0aCAibWFpbiIKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGRiTmFtZTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZGJOYW1lID0gbGFzdG5vZGU7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBsb29rYXNpZGUgaXMgb25seSByZWxldmFudCBmb3IgdGhlIG1haW4gZGIKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvb2thc2lkZVVzZWQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgZGJOYW1lID0gIiAgKGF0dGFjaGVkKSAiICsgcC5maXJzdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBhdHRhY2hlZCBkYiBoYXMgYSBwYXRoLCBhdHRhY2ggdGhlIGxhc3Rub2RlIGZyb20gdGhlIHBhdGggdG8gYWJvdmUKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwLnNlY29uZC50cmltKCkubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlkeCA9IHAuc2Vjb25kLmxhc3RJbmRleE9mKCIvIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJOYW1lICs9ICIgOiAiICsgcC5zZWNvbmQuc3Vic3RyaW5nKChpZHggIT0gLTEpID8gKytpZHggOiAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAocGFnZUNvdW50ID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZGJTdGF0c0xpc3QuYWRkKG5ldyBEYlN0YXRzKGRiTmFtZSwgcGFnZUNvdW50LCBkYi5nZXRQYWdlU2l6ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29rYXNpZGVVc2VkLCBkYi5tTnVtQ2FjaGVIaXRzLCBkYi5tTnVtQ2FjaGVNaXNzZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRiLm1Db21waWxlZFF1ZXJpZXMuc2l6ZSgpKSk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHBhZ2VDb3VudCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgZGJTdGF0c0xpc3QuYWRkKG5ldyBEYlN0YXRzKGRiTmFtZSwgcGFnZUNvdW50LCBkYi5nZXRQYWdlU2l6ZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb2thc2lkZVVzZWQpKTsKKyAgICAgICAgICAgICAgICAvLyBpZiB0aGVyZSBhcmUgcG9vbGVkIGNvbm5lY3Rpb25zLCByZXR1cm4gdGhlIGNhY2hlIHN0YXRzIGZvciB0aGVtIGFsc28uCisgICAgICAgICAgICAgICAgaWYgKGRiLm1Db25uZWN0aW9uUG9vbCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoU1FMaXRlRGF0YWJhc2UgcERiIDogZGIubUNvbm5lY3Rpb25Qb29sLmdldENvbm5lY3Rpb25MaXN0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRiU3RhdHNMaXN0LmFkZChuZXcgRGJTdGF0cygiKHBvb2xlZCAjICIgKyBwRGIubUNvbm5lY3Rpb25OdW0gKyAiKSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbGFzdG5vZGUsIDAsIDAsIDAsIHBEYi5tTnVtQ2FjaGVIaXRzLCBwRGIubU51bUNhY2hlTWlzc2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGIubUNvbXBpbGVkUXVlcmllcy5zaXplKCkpKTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKFNRTGl0ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgLy8gaWdub3JlLiB3ZSBkb24ndCBjYXJlIGFib3V0IGV4Y2VwdGlvbnMgd2hlbiB3ZSBhcmUgdGFraW5nIGFkYgorICAgICAgICAgICAgICAgIC8vIGJ1Z3JlcG9ydCEKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICByZXR1cm4gZGJTdGF0c0xpc3Q7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogZ2V0IHRoZSBzcGVjaWZpZWQgcHJhZ21hIHZhbHVlIGZyb20gc3FsaXRlIGZvciB0aGUgc3BlY2lmaWVkIGRhdGFiYXNlLgotICAgICAqIG9ubHkgaGFuZGxlcyBwcmFnbWEncyB0aGF0IHJldHVybiBpbnQvbG9uZy4KLSAgICAgKiBOTyBKQVZBIGxvY2tzIGFyZSBoZWxkIGluIHRoaXMgbWV0aG9kLgotICAgICAqIFRPRE86IHVzZSB0aGlzIHRvIGRvIGFsbCBwcmFnbWEncyBpbiB0aGlzIGNsYXNzCisgICAgICogUmV0dXJucyBsaXN0IG9mIGZ1bGwgcGF0aG5hbWVzIG9mIGFsbCBhdHRhY2hlZCBkYXRhYmFzZXMgaW5jbHVkaW5nIHRoZSBtYWluIGRhdGFiYXNlCisgICAgICogYnkgZXhlY3V0aW5nICdwcmFnbWEgZGF0YWJhc2VfbGlzdCcgb24gdGhlIGRhdGFiYXNlLgorICAgICAqCisgICAgICogQHJldHVybiBBcnJheUxpc3Qgb2YgcGFpcnMgb2YgKGRhdGFiYXNlIG5hbWUsIGRhdGFiYXNlIGZpbGUgcGF0aCkgb3IgbnVsbCBpZiB0aGUgZGF0YWJhc2UKKyAgICAgKiBpcyBub3Qgb3Blbi4KICAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBsb25nIGdldFByYWdtYVZhbChTUUxpdGVEYXRhYmFzZSBkYiwgU3RyaW5nIHByYWdtYSkgewotICAgICAgICBpZiAoIWRiLmlzT3BlbigpKSB7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgICAgICBTUUxpdGVTdGF0ZW1lbnQgcHJvZyA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBwcm9nID0gbmV3IFNRTGl0ZVN0YXRlbWVudChkYiwgIlBSQUdNQSAiICsgcHJhZ21hKTsKLSAgICAgICAgICAgIGxvbmcgdmFsID0gcHJvZy5zaW1wbGVRdWVyeUZvckxvbmcoKTsKLSAgICAgICAgICAgIHJldHVybiB2YWw7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAocHJvZyAhPSBudWxsKSBwcm9nLmNsb3NlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiByZXR1cm5zIGxpc3Qgb2YgZnVsbCBwYXRobmFtZXMgb2YgYWxsIGF0dGFjaGVkIGRhdGFiYXNlcwotICAgICAqIGluY2x1ZGluZyB0aGUgbWFpbiBkYXRhYmFzZQotICAgICAqIFRPRE86IG1vdmUgdGhpcyB0byB7QGxpbmsgRGF0YWJhc2VVdGlsc30KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBBcnJheUxpc3Q8UGFpcjxTdHJpbmcsIFN0cmluZz4+IGdldEF0dGFjaGVkRGJzKFNRTGl0ZURhdGFiYXNlIGRiT2JqKSB7Ci0gICAgICAgIGlmICghZGJPYmouaXNPcGVuKCkpIHsKKyAgICBwdWJsaWMgQXJyYXlMaXN0PFBhaXI8U3RyaW5nLCBTdHJpbmc+PiBnZXRBdHRhY2hlZERicygpIHsKKyAgICAgICAgaWYgKCFpc09wZW4oKSkgewogICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgIH0KICAgICAgICAgQXJyYXlMaXN0PFBhaXI8U3RyaW5nLCBTdHJpbmc+PiBhdHRhY2hlZERicyA9IG5ldyBBcnJheUxpc3Q8UGFpcjxTdHJpbmcsIFN0cmluZz4+KCk7Ci0gICAgICAgIEN1cnNvciBjID0gZGJPYmoucmF3UXVlcnkoInByYWdtYSBkYXRhYmFzZV9saXN0OyIsIG51bGwpOwotICAgICAgICB3aGlsZSAoYy5tb3ZlVG9OZXh0KCkpIHsKLSAgICAgICAgICAgICBhdHRhY2hlZERicy5hZGQobmV3IFBhaXI8U3RyaW5nLCBTdHJpbmc+KGMuZ2V0U3RyaW5nKDEpLCBjLmdldFN0cmluZygyKSkpOworICAgICAgICBDdXJzb3IgYyA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjID0gcmF3UXVlcnkoInByYWdtYSBkYXRhYmFzZV9saXN0OyIsIG51bGwpOworICAgICAgICAgICAgd2hpbGUgKGMubW92ZVRvTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgLy8gc3FsaXRlIHJldHVybnMgYSByb3cgZm9yIGVhY2ggZGF0YWJhc2UgaW4gdGhlIHJldHVybmVkIGxpc3Qgb2YgZGF0YWJhc2VzLgorICAgICAgICAgICAgICAgIC8vICAgaW4gZWFjaCByb3csCisgICAgICAgICAgICAgICAgLy8gICAgICAgMXN0IGNvbHVtbiBpcyB0aGUgZGF0YWJhc2UgbmFtZSBzdWNoIGFzIG1haW4sIG9yIHRoZSBkYXRhYmFzZQorICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSBzcGVjaWZpZWQgb24gdGhlICJBVFRBQ0giIGNvbW1hbmQKKyAgICAgICAgICAgICAgICAvLyAgICAgICAybmQgY29sdW1uIGlzIHRoZSBkYXRhYmFzZSBmaWxlIHBhdGguCisgICAgICAgICAgICAgICAgYXR0YWNoZWREYnMuYWRkKG5ldyBQYWlyPFN0cmluZywgU3RyaW5nPihjLmdldFN0cmluZygxKSwgYy5nZXRTdHJpbmcoMikpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChjICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjLmNsb3NlKCk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgYy5jbG9zZSgpOwogICAgICAgICByZXR1cm4gYXR0YWNoZWREYnM7CiAgICAgfQogCiAgICAgLyoqCisgICAgICogUnVucyAncHJhZ21hIGludGVncml0eV9jaGVjaycgb24gdGhlIGdpdmVuIGRhdGFiYXNlIChhbmQgYWxsIHRoZSBhdHRhY2hlZCBkYXRhYmFzZXMpCisgICAgICogYW5kIHJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gZGF0YWJhc2UgKGFuZCBhbGwgaXRzIGF0dGFjaGVkIGRhdGFiYXNlcykgcGFzcyBpbnRlZ3JpdHlfY2hlY2ssCisgICAgICogZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqPHA+CisgICAgICogSWYgdGhlIHJlc3VsdCBpcyBmYWxzZSwgdGhlbiB0aGlzIG1ldGhvZCBsb2dzIHRoZSBlcnJvcnMgcmVwb3J0ZWQgYnkgdGhlIGludGVncml0eV9jaGVjaworICAgICAqIGNvbW1hbmQgZXhlY3V0aW9uLgorICAgICAqPHA+CisgICAgICogTm90ZSB0aGF0ICdwcmFnbWEgaW50ZWdyaXR5X2NoZWNrJyBvbiBhIGRhdGFiYXNlIGNhbiB0YWtlIGEgbG9uZyB0aW1lLgorICAgICAqCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiBkYXRhYmFzZSAoYW5kIGFsbCBpdHMgYXR0YWNoZWQgZGF0YWJhc2VzKSBwYXNzIGludGVncml0eV9jaGVjaywKKyAgICAgKiBmYWxzZSBvdGhlcndpc2UuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNEYXRhYmFzZUludGVncml0eU9rKCkgeworICAgICAgICB2ZXJpZnlEYklzT3BlbigpOworICAgICAgICBBcnJheUxpc3Q8UGFpcjxTdHJpbmcsIFN0cmluZz4+IGF0dGFjaGVkRGJzID0gZ2V0QXR0YWNoZWREYnMoKTsKKyAgICAgICAgaWYgKGF0dGFjaGVkRGJzID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImRhdGFiYXNlbGlzdCBmb3I6ICIgKyBnZXRQYXRoKCkgKyAiIGNvdWxkbid0ICIgKworICAgICAgICAgICAgICAgICAgICAiYmUgcmV0cmlldmVkLiBwcm9iYWJseSBiZWNhdXNlIHRoZSBkYXRhYmFzZSBpcyBjbG9zZWQiKTsKKyAgICAgICAgfQorICAgICAgICBib29sZWFuIGlzRGF0YWJhc2VDb3JydXB0ID0gZmFsc2U7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXR0YWNoZWREYnMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIFBhaXI8U3RyaW5nLCBTdHJpbmc+IHAgPSBhdHRhY2hlZERicy5nZXQoaSk7CisgICAgICAgICAgICBTUUxpdGVTdGF0ZW1lbnQgcHJvZyA9IG51bGw7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHByb2cgPSBjb21waWxlU3RhdGVtZW50KCJQUkFHTUEgIiArIHAuZmlyc3QgKyAiLmludGVncml0eV9jaGVjaygxKTsiKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgcnNsdCA9IHByb2cuc2ltcGxlUXVlcnlGb3JTdHJpbmcoKTsKKyAgICAgICAgICAgICAgICBpZiAoIXJzbHQuZXF1YWxzSWdub3JlQ2FzZSgib2siKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBpbnRlZ3JpdHlfY2hlY2tlciBmYWlsZWQgb24gbWFpbiBvciBhdHRhY2hlZCBkYXRhYmFzZXMKKyAgICAgICAgICAgICAgICAgICAgaXNEYXRhYmFzZUNvcnJ1cHQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJQUkFHTUEgaW50ZWdyaXR5X2NoZWNrIG9uICIgKyBwLnNlY29uZCArICIgcmV0dXJuZWQ6ICIgKyByc2x0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIGlmIChwcm9nICE9IG51bGwpIHByb2cuY2xvc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaXNEYXRhYmFzZUNvcnJ1cHQ7CisgICAgfQorCisgICAgLyoqCiAgICAgICogTmF0aXZlIGNhbGwgdG8gb3BlbiB0aGUgZGF0YWJhc2UuCiAgICAgICoKICAgICAgKiBAcGFyYW0gcGF0aCBUaGUgZnVsbCBwYXRoIHRvIHRoZSBkYXRhYmFzZQpAQCAtMjIzOSwyMSArMjU5NiwyNyBAQAogICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgZGJvcGVuKFN0cmluZyBwYXRoLCBpbnQgZmxhZ3MpOwogCiAgICAgLyoqCi0gICAgICogTmF0aXZlIGNhbGwgdG8gc2V0dXAgdHJhY2luZyBvZiBhbGwgc3FsIHN0YXRlbWVudHMKKyAgICAgKiBOYXRpdmUgY2FsbCB0byBzZXR1cCB0cmFjaW5nIG9mIGFsbCBTUUwgc3RhdGVtZW50cwogICAgICAqCiAgICAgICogQHBhcmFtIHBhdGggdGhlIGZ1bGwgcGF0aCB0byB0aGUgZGF0YWJhc2UKKyAgICAgKiBAcGFyYW0gY29ubmVjdGlvbk51bSBjb25uZWN0aW9uIG51bWJlcjogMCAtIE4sIHdoZXJlIHRoZSBtYWluIGRhdGFiYXNlCisgICAgICogICAgICAgICAgICBjb25uZWN0aW9uIGhhbmRsZSBpcyBudW1iZXJlZCAwIGFuZCB0aGUgY29ubmVjdGlvbiBoYW5kbGVzIGluIHRoZSBjb25uZWN0aW9uCisgICAgICogICAgICAgICAgICBwb29sIGFyZSBudW1iZXJlZCAxLi5OLgogICAgICAqLwotICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgZW5hYmxlU3FsVHJhY2luZyhTdHJpbmcgcGF0aCk7CisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBlbmFibGVTcWxUcmFjaW5nKFN0cmluZyBwYXRoLCBzaG9ydCBjb25uZWN0aW9uTnVtKTsKIAogICAgIC8qKgotICAgICAqIE5hdGl2ZSBjYWxsIHRvIHNldHVwIHByb2ZpbGluZyBvZiBhbGwgc3FsIHN0YXRlbWVudHMuCisgICAgICogTmF0aXZlIGNhbGwgdG8gc2V0dXAgcHJvZmlsaW5nIG9mIGFsbCBTUUwgc3RhdGVtZW50cy4KICAgICAgKiBjdXJyZW50bHksIHNxbGl0ZSdzIHByb2ZpbGluZyA9IHByaW50aW5nIG9mIGV4ZWN1dGlvbi10aW1lCi0gICAgICogKHdhbGwtY2xvY2sgdGltZSkgb2YgZWFjaCBvZiB0aGUgc3FsIHN0YXRlbWVudHMsIGFzIHRoZXkKKyAgICAgKiAod2FsbC1jbG9jayB0aW1lKSBvZiBlYWNoIG9mIHRoZSBTUUwgc3RhdGVtZW50cywgYXMgdGhleQogICAgICAqIGFyZSBleGVjdXRlZC4KICAgICAgKgogICAgICAqIEBwYXJhbSBwYXRoIHRoZSBmdWxsIHBhdGggdG8gdGhlIGRhdGFiYXNlCisgICAgICogQHBhcmFtIGNvbm5lY3Rpb25OdW0gY29ubmVjdGlvbiBudW1iZXI6IDAgLSBOLCB3aGVyZSB0aGUgbWFpbiBkYXRhYmFzZQorICAgICAqICAgICAgICAgICAgY29ubmVjdGlvbiBoYW5kbGUgaXMgbnVtYmVyZWQgMCBhbmQgdGhlIGNvbm5lY3Rpb24gaGFuZGxlcyBpbiB0aGUgY29ubmVjdGlvbgorICAgICAqICAgICAgICAgICAgcG9vbCBhcmUgbnVtYmVyZWQgMS4uTi4KICAgICAgKi8KLSAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIGVuYWJsZVNxbFByb2ZpbGluZyhTdHJpbmcgcGF0aCk7CisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBlbmFibGVTcWxQcm9maWxpbmcoU3RyaW5nIHBhdGgsIHNob3J0IGNvbm5lY3Rpb25OdW0pOwogCiAgICAgLyoqCiAgICAgICogTmF0aXZlIGNhbGwgdG8gZXhlY3V0ZSBhIHJhdyBTUUwgc3RhdGVtZW50LiB7QGxpbmsgI2xvY2t9IG11c3QgYmUgaGVsZApAQCAtMjI5MSw0ICsyNjU0LDExIEBACiAgICAgICogQHJldHVybiBpbnQgdmFsdWUgb2YgU1FMSVRFX0RCU1RBVFVTX0xPT0tBU0lERV9VU0VECiAgICAgICovCiAgICAgcHJpdmF0ZSBuYXRpdmUgaW50IG5hdGl2ZV9nZXREYkxvb2thc2lkZSgpOworCisgICAgLyoqCisgICAgICogZmluYWxpemVzIHRoZSBnaXZlbiBzdGF0ZW1lbnQgaWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RhdGVtZW50SWQgc3RhdGVtZW50IHRvIGJlIGZpbnpsaWVkIGJ5IHNxbGl0ZQorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgbmF0aXZlIHZvaWQgbmF0aXZlX2ZpbmFsaXplKGludCBzdGF0ZW1lbnRJZCk7CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlRGVidWcuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVEZWJ1Zy5qYXZhCmluZGV4IDg5YzNmOTYuLjk0OTYwNzkxIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlRGVidWcuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlRGVidWcuamF2YQpAQCAtMTMyLDExICsxMzIsMTYgQEAKICAgICAgICAgLyoqIGRvY3VtZW50ZWQgaGVyZSBodHRwOi8vd3d3LnNxbGl0ZS5vcmcvYzNyZWYvY19kYnN0YXR1c19sb29rYXNpZGVfdXNlZC5odG1sICovCiAgICAgICAgIHB1YmxpYyBpbnQgbG9va2FzaWRlOwogCi0gICAgICAgIHB1YmxpYyBEYlN0YXRzKFN0cmluZyBkYk5hbWUsIGxvbmcgcGFnZUNvdW50LCBsb25nIHBhZ2VTaXplLCBpbnQgbG9va2FzaWRlKSB7CisgICAgICAgIC8qKiBzdGF0ZW1lbnQgY2FjaGUgc3RhdHM6IGhpdHMvbWlzc2VzL2NhY2hlc2l6ZSAqLworICAgICAgICBwdWJsaWMgU3RyaW5nIGNhY2hlOworCisgICAgICAgIHB1YmxpYyBEYlN0YXRzKFN0cmluZyBkYk5hbWUsIGxvbmcgcGFnZUNvdW50LCBsb25nIHBhZ2VTaXplLCBpbnQgbG9va2FzaWRlLAorICAgICAgICAgICAgaW50IGhpdHMsIGludCBtaXNzZXMsIGludCBjYWNoZXNpemUpIHsKICAgICAgICAgICAgIHRoaXMuZGJOYW1lID0gZGJOYW1lOwotICAgICAgICAgICAgdGhpcy5wYWdlU2l6ZSA9IHBhZ2VTaXplOworICAgICAgICAgICAgdGhpcy5wYWdlU2l6ZSA9IHBhZ2VTaXplIC8gMTAyNDsKICAgICAgICAgICAgIGRiU2l6ZSA9IChwYWdlQ291bnQgKiBwYWdlU2l6ZSkgLyAxMDI0OwogICAgICAgICAgICAgdGhpcy5sb29rYXNpZGUgPSBsb29rYXNpZGU7CisgICAgICAgICAgICB0aGlzLmNhY2hlID0gaGl0cyArICIvIiArIG1pc3NlcyArICIvIiArIGNhY2hlc2l6ZTsKICAgICAgICAgfQogICAgIH0KIApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZURpcmVjdEN1cnNvckRyaXZlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZURpcmVjdEN1cnNvckRyaXZlci5qYXZhCmluZGV4IDIxNDRmYzMuLmJlNDkyNTcgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVEaXJlY3RDdXJzb3JEcml2ZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlRGlyZWN0Q3Vyc29yRHJpdmVyLmphdmEKQEAgLTM5LDkgKzM5LDEyIEBACiAKICAgICBwdWJsaWMgQ3Vyc29yIHF1ZXJ5KEN1cnNvckZhY3RvcnkgZmFjdG9yeSwgU3RyaW5nW10gc2VsZWN0aW9uQXJncykgewogICAgICAgICAvLyBDb21waWxlIHRoZSBxdWVyeQotICAgICAgICBTUUxpdGVRdWVyeSBxdWVyeSA9IG5ldyBTUUxpdGVRdWVyeShtRGF0YWJhc2UsIG1TcWwsIDAsIHNlbGVjdGlvbkFyZ3MpOworICAgICAgICBTUUxpdGVRdWVyeSBxdWVyeSA9IG51bGw7CiAKICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1EYXRhYmFzZS5sb2NrKCk7CisgICAgICAgICAgICBtRGF0YWJhc2UuY2xvc2VQZW5kaW5nU3RhdGVtZW50cygpOworICAgICAgICAgICAgcXVlcnkgPSBuZXcgU1FMaXRlUXVlcnkobURhdGFiYXNlLCBtU3FsLCAwLCBzZWxlY3Rpb25BcmdzKTsKICAgICAgICAgICAgIC8vIEFyZyBiaW5kaW5nCiAgICAgICAgICAgICBpbnQgbnVtQXJncyA9IHNlbGVjdGlvbkFyZ3MgPT0gbnVsbCA/IDAgOiBzZWxlY3Rpb25BcmdzLmxlbmd0aDsKICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQXJnczsgaSsrKSB7CkBAIC02MSw2ICs2NCw3IEBACiAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhpcyBvYmplY3QgaXMgY2xlYW5lZCB1cCBpZiBzb21ldGhpbmcgaGFwcGVucwogICAgICAgICAgICAgaWYgKHF1ZXJ5ICE9IG51bGwpIHF1ZXJ5LmNsb3NlKCk7CisgICAgICAgICAgICBtRGF0YWJhc2UudW5sb2NrKCk7CiAgICAgICAgIH0KICAgICB9CiAKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVPcGVuSGVscGVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlT3BlbkhlbHBlci5qYXZhCmluZGV4IGFlZmJhYmMuLjBmMmU4NzIgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVPcGVuSGVscGVyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZU9wZW5IZWxwZXIuamF2YQpAQCAtMTcsNiArMTcsOCBAQAogcGFja2FnZSBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZTsKIAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuRGF0YWJhc2VFcnJvckhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5EZWZhdWx0RGF0YWJhc2VFcnJvckhhbmRsZXI7CiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2UuQ3Vyc29yRmFjdG9yeTsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogCkBAIC00NSw2ICs0Nyw3IEBACiAKICAgICBwcml2YXRlIFNRTGl0ZURhdGFiYXNlIG1EYXRhYmFzZSA9IG51bGw7CiAgICAgcHJpdmF0ZSBib29sZWFuIG1Jc0luaXRpYWxpemluZyA9IGZhbHNlOworICAgIHByaXZhdGUgZmluYWwgRGF0YWJhc2VFcnJvckhhbmRsZXIgbUVycm9ySGFuZGxlcjsKIAogICAgIC8qKgogICAgICAqIENyZWF0ZSBhIGhlbHBlciBvYmplY3QgdG8gY3JlYXRlLCBvcGVuLCBhbmQvb3IgbWFuYWdlIGEgZGF0YWJhc2UuCkBAIC01OCwxMiArNjEsMzcgQEAKICAgICAgKiAgICAge0BsaW5rICNvblVwZ3JhZGV9IHdpbGwgYmUgdXNlZCB0byB1cGdyYWRlIHRoZSBkYXRhYmFzZQogICAgICAqLwogICAgIHB1YmxpYyBTUUxpdGVPcGVuSGVscGVyKENvbnRleHQgY29udGV4dCwgU3RyaW5nIG5hbWUsIEN1cnNvckZhY3RvcnkgZmFjdG9yeSwgaW50IHZlcnNpb24pIHsKKyAgICAgICAgdGhpcyhjb250ZXh0LCBuYW1lLCBmYWN0b3J5LCB2ZXJzaW9uLCBuZXcgRGVmYXVsdERhdGFiYXNlRXJyb3JIYW5kbGVyKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIGhlbHBlciBvYmplY3QgdG8gY3JlYXRlLCBvcGVuLCBhbmQvb3IgbWFuYWdlIGEgZGF0YWJhc2UuCisgICAgICogVGhlIGRhdGFiYXNlIGlzIG5vdCBhY3R1YWxseSBjcmVhdGVkIG9yIG9wZW5lZCB1bnRpbCBvbmUgb2YKKyAgICAgKiB7QGxpbmsgI2dldFdyaXRhYmxlRGF0YWJhc2V9IG9yIHtAbGluayAjZ2V0UmVhZGFibGVEYXRhYmFzZX0gaXMgY2FsbGVkLgorICAgICAqCisgICAgICogPHA+QWNjZXB0cyBpbnB1dCBwYXJhbTogYSBjb25jcmV0ZSBpbnN0YW5jZSBvZiB7QGxpbmsgRGF0YWJhc2VFcnJvckhhbmRsZXJ9IHRvIGJlCisgICAgICogdXNlZCB0byBoYW5kbGUgY29ycnVwdGlvbiB3aGVuIHNxbGl0ZSByZXBvcnRzIGRhdGFiYXNlIGNvcnJ1cHRpb24uPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgdG8gdXNlIHRvIG9wZW4gb3IgY3JlYXRlIHRoZSBkYXRhYmFzZQorICAgICAqIEBwYXJhbSBuYW1lIG9mIHRoZSBkYXRhYmFzZSBmaWxlLCBvciBudWxsIGZvciBhbiBpbi1tZW1vcnkgZGF0YWJhc2UKKyAgICAgKiBAcGFyYW0gZmFjdG9yeSB0byB1c2UgZm9yIGNyZWF0aW5nIGN1cnNvciBvYmplY3RzLCBvciBudWxsIGZvciB0aGUgZGVmYXVsdAorICAgICAqIEBwYXJhbSB2ZXJzaW9uIG51bWJlciBvZiB0aGUgZGF0YWJhc2UgKHN0YXJ0aW5nIGF0IDEpOyBpZiB0aGUgZGF0YWJhc2UgaXMgb2xkZXIsCisgICAgICogICAgIHtAbGluayAjb25VcGdyYWRlfSB3aWxsIGJlIHVzZWQgdG8gdXBncmFkZSB0aGUgZGF0YWJhc2UKKyAgICAgKiBAcGFyYW0gZXJyb3JIYW5kbGVyIHRoZSB7QGxpbmsgRGF0YWJhc2VFcnJvckhhbmRsZXJ9IHRvIGJlIHVzZWQgd2hlbiBzcWxpdGUgcmVwb3J0cyBkYXRhYmFzZQorICAgICAqIGNvcnJ1cHRpb24uCisgICAgICovCisgICAgcHVibGljIFNRTGl0ZU9wZW5IZWxwZXIoQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgbmFtZSwgQ3Vyc29yRmFjdG9yeSBmYWN0b3J5LCBpbnQgdmVyc2lvbiwKKyAgICAgICAgICAgIERhdGFiYXNlRXJyb3JIYW5kbGVyIGVycm9ySGFuZGxlcikgewogICAgICAgICBpZiAodmVyc2lvbiA8IDEpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlZlcnNpb24gbXVzdCBiZSA+PSAxLCB3YXMgIiArIHZlcnNpb24pOworICAgICAgICBpZiAoZXJyb3JIYW5kbGVyID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkRhdGFiYXNlRXJyb3JIYW5kbGVyIHBhcmFtIHZhbHVlIGNhbid0IGJlIG51bGwuIik7CisgICAgICAgIH0KIAogICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7CiAgICAgICAgIG1OYW1lID0gbmFtZTsKICAgICAgICAgbUZhY3RvcnkgPSBmYWN0b3J5OwogICAgICAgICBtTmV3VmVyc2lvbiA9IHZlcnNpb247CisgICAgICAgIG1FcnJvckhhbmRsZXIgPSBlcnJvckhhbmRsZXI7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xMDEsMTAgKzEyOSwxNCBAQAogICAgICAgICAgICAgaWYgKG1OYW1lID09IG51bGwpIHsKICAgICAgICAgICAgICAgICBkYiA9IFNRTGl0ZURhdGFiYXNlLmNyZWF0ZShudWxsKTsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZGIgPSBtQ29udGV4dC5vcGVuT3JDcmVhdGVEYXRhYmFzZShtTmFtZSwgMCwgbUZhY3RvcnkpOworICAgICAgICAgICAgICAgIGRiID0gbUNvbnRleHQub3Blbk9yQ3JlYXRlRGF0YWJhc2UobU5hbWUsIDAsIG1GYWN0b3J5LCBtRXJyb3JIYW5kbGVyKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaW50IHZlcnNpb24gPSBkYi5nZXRWZXJzaW9uKCk7CisgICAgICAgICAgICBpZiAodmVyc2lvbiA+IG1OZXdWZXJzaW9uKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiRGF0YWJhc2UgIiArIG1OYW1lICsKKyAgICAgICAgICAgICAgICAgICAgICAgICIgY2Fubm90IGJlIGRvd25ncmFkZWQuIGluc3RlYWQsIHBsZWFzZSB1bmluc3RhbGwgbmV3IHZlcnNpb24gZmlyc3QuIik7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAodmVyc2lvbiAhPSBtTmV3VmVyc2lvbikgewogICAgICAgICAgICAgICAgIGRiLmJlZ2luVHJhbnNhY3Rpb24oKTsKICAgICAgICAgICAgICAgICB0cnkgewpAQCAtMTc1LDcgKzIwNyw4IEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBtSXNJbml0aWFsaXppbmcgPSB0cnVlOwogICAgICAgICAgICAgU3RyaW5nIHBhdGggPSBtQ29udGV4dC5nZXREYXRhYmFzZVBhdGgobU5hbWUpLmdldFBhdGgoKTsKLSAgICAgICAgICAgIGRiID0gU1FMaXRlRGF0YWJhc2Uub3BlbkRhdGFiYXNlKHBhdGgsIG1GYWN0b3J5LCBTUUxpdGVEYXRhYmFzZS5PUEVOX1JFQURPTkxZKTsKKyAgICAgICAgICAgIGRiID0gU1FMaXRlRGF0YWJhc2Uub3BlbkRhdGFiYXNlKHBhdGgsIG1GYWN0b3J5LCBTUUxpdGVEYXRhYmFzZS5PUEVOX1JFQURPTkxZLAorICAgICAgICAgICAgICAgICAgICBtRXJyb3JIYW5kbGVyKTsKICAgICAgICAgICAgIGlmIChkYi5nZXRWZXJzaW9uKCkgIT0gbU5ld1ZlcnNpb24pIHsKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU1FMaXRlRXhjZXB0aW9uKCJDYW4ndCB1cGdyYWRlIHJlYWQtb25seSBkYXRhYmFzZSBmcm9tIHZlcnNpb24gIiArCiAgICAgICAgICAgICAgICAgICAgICAgICBkYi5nZXRWZXJzaW9uKCkgKyAiIHRvICIgKyBtTmV3VmVyc2lvbiArICI6ICIgKyBwYXRoKTsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVQcm9ncmFtLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlUHJvZ3JhbS5qYXZhCmluZGV4IDRkOTZmMTIuLmEzNTEzZTYgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVQcm9ncmFtLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZVByb2dyYW0uamF2YQpAQCAtMjAsNyArMjAsNyBAQAogCiAvKioKICAqIEEgYmFzZSBjbGFzcyBmb3IgY29tcGlsZWQgU1FMaXRlIHByb2dyYW1zLgotICoKKyAqPHA+CiAgKiBTUUxpdGVQcm9ncmFtIGlzIG5vdCBpbnRlcm5hbGx5IHN5bmNocm9uaXplZCBzbyBjb2RlIHVzaW5nIGEgU1FMaXRlUHJvZ3JhbSBmcm9tIG11bHRpcGxlCiAgKiB0aHJlYWRzIHNob3VsZCBwZXJmb3JtIGl0cyBvd24gc3luY2hyb25pemF0aW9uIHdoZW4gdXNpbmcgdGhlIFNRTGl0ZVByb2dyYW0uCiAgKi8KQEAgLTE1MCw3ICsxNTAsNyBAQAogICAgICAqIEByZXR1cm4gYSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhpcyBwcm9ncmFtCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIGludCBnZXRVbmlxdWVJZCgpIHsKLSAgICAgICAgcmV0dXJuIG5TdGF0ZW1lbnQ7CisgICAgICAgIHJldHVybiAobUNvbXBpbGVkU3FsICE9IG51bGwpID8gbUNvbXBpbGVkU3FsLm5TdGF0ZW1lbnQgOiAwOwogICAgIH0KIAogICAgIC8qIHBhY2thZ2UgKi8gU3RyaW5nIGdldFNxbFN0cmluZygpIHsKQEAgLTE3Niw5ICsxNzYsNyBAQAogICAgICAqIEBwYXJhbSBpbmRleCBUaGUgMS1iYXNlZCBpbmRleCB0byB0aGUgcGFyYW1ldGVyIHRvIGJpbmQgbnVsbCB0bwogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGJpbmROdWxsKGludCBpbmRleCkgewotICAgICAgICBpZiAoIW1EYXRhYmFzZS5pc09wZW4oKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZGF0YWJhc2UgIiArIG1EYXRhYmFzZS5nZXRQYXRoKCkgKyAiIGFscmVhZHkgY2xvc2VkIik7Ci0gICAgICAgIH0KKyAgICAgICAgbURhdGFiYXNlLnZlcmlmeURiSXNPcGVuKCk7CiAgICAgICAgIGFjcXVpcmVSZWZlcmVuY2UoKTsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIG5hdGl2ZV9iaW5kX251bGwoaW5kZXgpOwpAQCAtMTk1LDkgKzE5Myw3IEBACiAgICAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0byBiaW5kCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgYmluZExvbmcoaW50IGluZGV4LCBsb25nIHZhbHVlKSB7Ci0gICAgICAgIGlmICghbURhdGFiYXNlLmlzT3BlbigpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJkYXRhYmFzZSAiICsgbURhdGFiYXNlLmdldFBhdGgoKSArICIgYWxyZWFkeSBjbG9zZWQiKTsKLSAgICAgICAgfQorICAgICAgICBtRGF0YWJhc2UudmVyaWZ5RGJJc09wZW4oKTsKICAgICAgICAgYWNxdWlyZVJlZmVyZW5jZSgpOwogICAgICAgICB0cnkgewogICAgICAgICAgICAgbmF0aXZlX2JpbmRfbG9uZyhpbmRleCwgdmFsdWUpOwpAQCAtMjE0LDkgKzIxMCw3IEBACiAgICAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0byBiaW5kCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgYmluZERvdWJsZShpbnQgaW5kZXgsIGRvdWJsZSB2YWx1ZSkgewotICAgICAgICBpZiAoIW1EYXRhYmFzZS5pc09wZW4oKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZGF0YWJhc2UgIiArIG1EYXRhYmFzZS5nZXRQYXRoKCkgKyAiIGFscmVhZHkgY2xvc2VkIik7Ci0gICAgICAgIH0KKyAgICAgICAgbURhdGFiYXNlLnZlcmlmeURiSXNPcGVuKCk7CiAgICAgICAgIGFjcXVpcmVSZWZlcmVuY2UoKTsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIG5hdGl2ZV9iaW5kX2RvdWJsZShpbmRleCwgdmFsdWUpOwpAQCAtMjM2LDkgKzIzMCw3IEBACiAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ0aGUgYmluZCB2YWx1ZSBhdCBpbmRleCAiICsgaW5kZXggKyAiIGlzIG51bGwiKTsKICAgICAgICAgfQotICAgICAgICBpZiAoIW1EYXRhYmFzZS5pc09wZW4oKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZGF0YWJhc2UgIiArIG1EYXRhYmFzZS5nZXRQYXRoKCkgKyAiIGFscmVhZHkgY2xvc2VkIik7Ci0gICAgICAgIH0KKyAgICAgICAgbURhdGFiYXNlLnZlcmlmeURiSXNPcGVuKCk7CiAgICAgICAgIGFjcXVpcmVSZWZlcmVuY2UoKTsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIG5hdGl2ZV9iaW5kX3N0cmluZyhpbmRleCwgdmFsdWUpOwpAQCAtMjU4LDkgKzI1MCw3IEBACiAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ0aGUgYmluZCB2YWx1ZSBhdCBpbmRleCAiICsgaW5kZXggKyAiIGlzIG51bGwiKTsKICAgICAgICAgfQotICAgICAgICBpZiAoIW1EYXRhYmFzZS5pc09wZW4oKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZGF0YWJhc2UgIiArIG1EYXRhYmFzZS5nZXRQYXRoKCkgKyAiIGFscmVhZHkgY2xvc2VkIik7Ci0gICAgICAgIH0KKyAgICAgICAgbURhdGFiYXNlLnZlcmlmeURiSXNPcGVuKCk7CiAgICAgICAgIGFjcXVpcmVSZWZlcmVuY2UoKTsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIG5hdGl2ZV9iaW5kX2Jsb2IoaW5kZXgsIHZhbHVlKTsKQEAgLTI3Myw5ICsyNjMsNyBAQAogICAgICAqIENsZWFycyBhbGwgZXhpc3RpbmcgYmluZGluZ3MuIFVuc2V0IGJpbmRpbmdzIGFyZSB0cmVhdGVkIGFzIE5VTEwuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgY2xlYXJCaW5kaW5ncygpIHsKLSAgICAgICAgaWYgKCFtRGF0YWJhc2UuaXNPcGVuKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImRhdGFiYXNlICIgKyBtRGF0YWJhc2UuZ2V0UGF0aCgpICsgIiBhbHJlYWR5IGNsb3NlZCIpOwotICAgICAgICB9CisgICAgICAgIG1EYXRhYmFzZS52ZXJpZnlEYklzT3BlbigpOwogICAgICAgICBhY3F1aXJlUmVmZXJlbmNlKCk7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBuYXRpdmVfY2xlYXJfYmluZGluZ3MoKTsKQEAgLTI5MSwxMiArMjc5LDcgQEAKICAgICAgICAgaWYgKCFtRGF0YWJhc2UuaXNPcGVuKCkpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQotICAgICAgICBtRGF0YWJhc2UubG9jaygpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmVsZWFzZVJlZmVyZW5jZSgpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgbURhdGFiYXNlLnVubG9jaygpOwotICAgICAgICB9CisgICAgICAgIHJlbGVhc2VSZWZlcmVuY2UoKTsKICAgICB9CiAKICAgICAvKioKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVRdWVyeS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZVF1ZXJ5LmphdmEKaW5kZXggOTA1YjY2Yi4uZTYwMTFlZSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZVF1ZXJ5LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZVF1ZXJ5LmphdmEKQEAgLTcyLDExICs3Miw2IEBACiAgICAgICAgICAgICAgICAgLy8gaXMgbm90IHNhZmUgaW4gdGhpcyBzaXR1YXRpb24uIHRoZSBuYXRpdmUgY29kZSB3aWxsIGlnbm9yZSBtYXhSZWFkCiAgICAgICAgICAgICAgICAgaW50IG51bVJvd3MgPSBuYXRpdmVfZmlsbF93aW5kb3cod2luZG93LCB3aW5kb3cuZ2V0U3RhcnRQb3NpdGlvbigpLCBtT2Zmc2V0SW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICBtYXhSZWFkLCBsYXN0UG9zKTsKLQotICAgICAgICAgICAgICAgIC8vIExvZ2dpbmcKLSAgICAgICAgICAgICAgICBpZiAoU1FMaXRlRGVidWcuREVCVUdfU1FMX1NUQVRFTUVOVFMpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiZmlsbFdpbmRvdygpOiAiICsgbVNxbCk7Ci0gICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIG1EYXRhYmFzZS5sb2dUaW1lU3RhdChtU3FsLCB0aW1lU3RhcnQpOwogICAgICAgICAgICAgICAgIHJldHVybiBudW1Sb3dzOwogICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpewpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZVN0YXRlbWVudC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZVN0YXRlbWVudC5qYXZhCmluZGV4IDllNDI1YzMuLmUxYWQzMDZjIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlU3RhdGVtZW50LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZVN0YXRlbWVudC5qYXZhCkBAIC0yNSw3ICsyNSw3IEBACiAgKiBUaGUgc3RhdGVtZW50IGNhbm5vdCByZXR1cm4gbXVsdGlwbGUgcm93cywgYnV0IDF4MSByZXN1bHQgc2V0cyBhcmUgYWxsb3dlZC4KICAqIERvbid0IHVzZSBTUUxpdGVTdGF0ZW1lbnQgY29uc3RydWN0b3IgZGlyZWN0bHksIHBsZWFzZSB1c2UKICAqIHtAbGluayBTUUxpdGVEYXRhYmFzZSNjb21waWxlU3RhdGVtZW50KFN0cmluZyl9Ci0gKgorICo8cD4KICAqIFNRTGl0ZVN0YXRlbWVudCBpcyBub3QgaW50ZXJuYWxseSBzeW5jaHJvbml6ZWQgc28gY29kZSB1c2luZyBhIFNRTGl0ZVN0YXRlbWVudCBmcm9tIG11bHRpcGxlCiAgKiB0aHJlYWRzIHNob3VsZCBwZXJmb3JtIGl0cyBvd24gc3luY2hyb25pemF0aW9uIHdoZW4gdXNpbmcgdGhlIFNRTGl0ZVN0YXRlbWVudC4KICAqLwpAQCAtNDksMTUgKzQ5LDE0IEBACiAgICAgICogICAgICAgICBzb21lIHJlYXNvbgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7CisgICAgICAgIG1EYXRhYmFzZS52ZXJpZnlEYklzT3BlbigpOwogICAgICAgICBCbG9ja0d1YXJkLmdldFRocmVhZFBvbGljeSgpLm9uV3JpdGVUb0Rpc2soKTsKLSAgICAgICAgaWYgKCFtRGF0YWJhc2UuaXNPcGVuKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImRhdGFiYXNlICIgKyBtRGF0YWJhc2UuZ2V0UGF0aCgpICsgIiBhbHJlYWR5IGNsb3NlZCIpOwotICAgICAgICB9CiAgICAgICAgIGxvbmcgdGltZVN0YXJ0ID0gU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCk7CiAgICAgICAgIG1EYXRhYmFzZS5sb2NrKCk7CiAKICAgICAgICAgYWNxdWlyZVJlZmVyZW5jZSgpOwogICAgICAgICB0cnkgeworICAgICAgICAgICAgbURhdGFiYXNlLmNsb3NlUGVuZGluZ1N0YXRlbWVudHMoKTsKICAgICAgICAgICAgIG5hdGl2ZV9leGVjdXRlKCk7CiAgICAgICAgICAgICBtRGF0YWJhc2UubG9nVGltZVN0YXQobVNxbCwgdGltZVN0YXJ0KTsKICAgICAgICAgfSBmaW5hbGx5IHsKQEAgLTc2LDE1ICs3NSwxNCBAQAogICAgICAqICAgICAgICAgc29tZSByZWFzb24KICAgICAgKi8KICAgICBwdWJsaWMgbG9uZyBleGVjdXRlSW5zZXJ0KCkgeworICAgICAgICBtRGF0YWJhc2UudmVyaWZ5RGJJc09wZW4oKTsKICAgICAgICAgQmxvY2tHdWFyZC5nZXRUaHJlYWRQb2xpY3koKS5vbldyaXRlVG9EaXNrKCk7Ci0gICAgICAgIGlmICghbURhdGFiYXNlLmlzT3BlbigpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJkYXRhYmFzZSAiICsgbURhdGFiYXNlLmdldFBhdGgoKSArICIgYWxyZWFkeSBjbG9zZWQiKTsKLSAgICAgICAgfQogICAgICAgICBsb25nIHRpbWVTdGFydCA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpOwogICAgICAgICBtRGF0YWJhc2UubG9jaygpOwogCiAgICAgICAgIGFjcXVpcmVSZWZlcmVuY2UoKTsKICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1EYXRhYmFzZS5jbG9zZVBlbmRpbmdTdGF0ZW1lbnRzKCk7CiAgICAgICAgICAgICBuYXRpdmVfZXhlY3V0ZSgpOwogICAgICAgICAgICAgbURhdGFiYXNlLmxvZ1RpbWVTdGF0KG1TcWwsIHRpbWVTdGFydCk7CiAgICAgICAgICAgICByZXR1cm4gKG1EYXRhYmFzZS5sYXN0Q2hhbmdlQ291bnQoKSA+IDApID8gbURhdGFiYXNlLmxhc3RJbnNlcnRSb3coKSA6IC0xOwpAQCAtMTAzLDE1ICsxMDEsMTQgQEAKICAgICAgKiBAdGhyb3dzIGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURvbmVFeGNlcHRpb24gaWYgdGhlIHF1ZXJ5IHJldHVybnMgemVybyByb3dzCiAgICAgICovCiAgICAgcHVibGljIGxvbmcgc2ltcGxlUXVlcnlGb3JMb25nKCkgeworICAgICAgICBtRGF0YWJhc2UudmVyaWZ5RGJJc09wZW4oKTsKICAgICAgICAgQmxvY2tHdWFyZC5nZXRUaHJlYWRQb2xpY3koKS5vblJlYWRGcm9tRGlzaygpOwotICAgICAgICBpZiAoIW1EYXRhYmFzZS5pc09wZW4oKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZGF0YWJhc2UgIiArIG1EYXRhYmFzZS5nZXRQYXRoKCkgKyAiIGFscmVhZHkgY2xvc2VkIik7Ci0gICAgICAgIH0KICAgICAgICAgbG9uZyB0aW1lU3RhcnQgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKTsKICAgICAgICAgbURhdGFiYXNlLmxvY2soKTsKIAogICAgICAgICBhY3F1aXJlUmVmZXJlbmNlKCk7CiAgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtRGF0YWJhc2UuY2xvc2VQZW5kaW5nU3RhdGVtZW50cygpOwogICAgICAgICAgICAgbG9uZyByZXRWYWx1ZSA9IG5hdGl2ZV8xeDFfbG9uZygpOwogICAgICAgICAgICAgbURhdGFiYXNlLmxvZ1RpbWVTdGF0KG1TcWwsIHRpbWVTdGFydCk7CiAgICAgICAgICAgICByZXR1cm4gcmV0VmFsdWU7CkBAIC0xMzAsMTUgKzEyNywxNCBAQAogICAgICAqIEB0aHJvd3MgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRG9uZUV4Y2VwdGlvbiBpZiB0aGUgcXVlcnkgcmV0dXJucyB6ZXJvIHJvd3MKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIHNpbXBsZVF1ZXJ5Rm9yU3RyaW5nKCkgeworICAgICAgICBtRGF0YWJhc2UudmVyaWZ5RGJJc09wZW4oKTsKICAgICAgICAgQmxvY2tHdWFyZC5nZXRUaHJlYWRQb2xpY3koKS5vblJlYWRGcm9tRGlzaygpOwotICAgICAgICBpZiAoIW1EYXRhYmFzZS5pc09wZW4oKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZGF0YWJhc2UgIiArIG1EYXRhYmFzZS5nZXRQYXRoKCkgKyAiIGFscmVhZHkgY2xvc2VkIik7Ci0gICAgICAgIH0KICAgICAgICAgbG9uZyB0aW1lU3RhcnQgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKTsKICAgICAgICAgbURhdGFiYXNlLmxvY2soKTsKIAogICAgICAgICBhY3F1aXJlUmVmZXJlbmNlKCk7CiAgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtRGF0YWJhc2UuY2xvc2VQZW5kaW5nU3RhdGVtZW50cygpOwogICAgICAgICAgICAgU3RyaW5nIHJldFZhbHVlID0gbmF0aXZlXzF4MV9zdHJpbmcoKTsKICAgICAgICAgICAgIG1EYXRhYmFzZS5sb2dUaW1lU3RhdChtU3FsLCB0aW1lU3RhcnQpOwogICAgICAgICAgICAgcmV0dXJuIHJldFZhbHVlOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvbmV0L0Nvbm5lY3Rpdml0eU1hbmFnZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL25ldC9Db25uZWN0aXZpdHlNYW5hZ2VyLmphdmEKaW5kZXggMjgwZGVkNi4uNjMzNTI5NiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvbmV0L0Nvbm5lY3Rpdml0eU1hbmFnZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9uZXQvQ29ubmVjdGl2aXR5TWFuYWdlci5qYXZhCkBAIC01MjQsNSArNTI0LDIwIEBACiAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICByZXR1cm4gVEVUSEVSX0VSUk9SX1NFUlZJQ0VfVU5BVkFJTDsKICAgICAgICAgfQotICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEVuc3VyZSB0aGUgZGV2aWNlIHN0YXlzIGF3YWtlIHVudGlsIHdlIGNvbm5lY3Qgd2l0aCB0aGUgbmV4dCBuZXR3b3JrCisgICAgICogQHBhcmFtIGZvcldob21lIFRoZSBuYW1lIG9mIHRoZSBuZXR3b3JrIGdvaW5nIGRvd24gZm9yIGxvZ2dpbmcgcHVycG9zZXMKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBvbiBzdWNjZXNzLCB7QGNvZGUgZmFsc2V9IG9uIGZhaWx1cmUKKyAgICAgKiB7QGhpZGV9CisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gcmVxdWVzdE5ldHdvcmtUcmFuc2l0aW9uV2FrZWxvY2soU3RyaW5nIGZvcldob20pIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1TZXJ2aWNlLnJlcXVlc3ROZXR3b3JrVHJhbnNpdGlvbldha2Vsb2NrKGZvcldob20pOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9uZXQvRG93bmxvYWRzLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9uZXQvRG93bmxvYWRzLmphdmEKaW5kZXggZmQzMzc4MS4uZGRkZTVjMSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvbmV0L0Rvd25sb2Fkcy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL25ldC9Eb3dubG9hZHMuamF2YQpAQCAtNDMwLDExICs0MzAsMTAgQEAKIAogICAgICAgICAgICAgQ29udGVudFJlc29sdmVyIGNyID0gY29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKTsKIAotICAgICAgICAgICAgQ3Vyc29yIGMgPSBjci5xdWVyeSgKLSAgICAgICAgICAgICAgICAgICAgZG93bmxvYWRVcmksIERPV05MT0FEU19QUk9KRUNUSU9OLCBudWxsIC8qIHNlbGVjdGlvbiAqLywgbnVsbCAvKiBzZWxlY3Rpb24gYXJncyAqLywKLSAgICAgICAgICAgICAgICAgICAgbnVsbCAvKiBzb3J0IG9yZGVyICovKTsKKyAgICAgICAgICAgIEN1cnNvciBjID0gY3IucXVlcnkoZG93bmxvYWRVcmksIERPV05MT0FEU19QUk9KRUNUSU9OLCBudWxsIC8qIHNlbGVjdGlvbiAqLywKKyAgICAgICAgICAgICAgICAgICAgbnVsbCAvKiBzZWxlY3Rpb24gYXJncyAqLywgbnVsbCAvKiBzb3J0IG9yZGVyICovKTsKICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFjLm1vdmVUb05leHQoKSkgeworICAgICAgICAgICAgICAgIGlmIChjID09IG51bGwgfHwgIWMubW92ZVRvTmV4dCgpKSB7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgICAgICAgICAgfQogCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9uZXQvSUNvbm5lY3Rpdml0eU1hbmFnZXIuYWlkbCBiL2NvcmUvamF2YS9hbmRyb2lkL25ldC9JQ29ubmVjdGl2aXR5TWFuYWdlci5haWRsCmluZGV4IGIwNWMyZWQuLjVhMTRjYzkgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL25ldC9JQ29ubmVjdGl2aXR5TWFuYWdlci5haWRsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL25ldC9JQ29ubmVjdGl2aXR5TWFuYWdlci5haWRsCkBAIC03Miw0ICs3Miw2IEBACiAgICAgU3RyaW5nW10gZ2V0VGV0aGVyYWJsZVVzYlJlZ2V4cygpOwogCiAgICAgU3RyaW5nW10gZ2V0VGV0aGVyYWJsZVdpZmlSZWdleHMoKTsKKworICAgIHZvaWQgcmVxdWVzdE5ldHdvcmtUcmFuc2l0aW9uV2FrZWxvY2soaW4gU3RyaW5nIGZvcldob20pOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvbmV0L01vYmlsZURhdGFTdGF0ZVRyYWNrZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL25ldC9Nb2JpbGVEYXRhU3RhdGVUcmFja2VyLmphdmEKaW5kZXggMjE0NTEwZC4uNWZkNTMxNSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvbmV0L01vYmlsZURhdGFTdGF0ZVRyYWNrZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9uZXQvTW9iaWxlRGF0YVN0YXRlVHJhY2tlci5qYXZhCkBAIC0yMiwxMiArMjIsMTMgQEAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50RmlsdGVyOwogaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOwogaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CiBpbXBvcnQgYW5kcm9pZC5vcy5TZXJ2aWNlTWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbVByb3BlcnRpZXM7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LklUZWxlcGhvbnk7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlBob25lOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5UZWxlcGhvbnlJbnRlbnRzOwogaW1wb3J0IGFuZHJvaWQubmV0Lk5ldHdvcmtJbmZvLkRldGFpbGVkU3RhdGU7CitpbXBvcnQgYW5kcm9pZC5uZXQuTmV0d29ya0luZm87CiBpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuVGVsZXBob255TWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CkBAIC0zOSw3ICs0MCw3IEBACiAgKgogICoge0BoaWRlfQogICovCi1wdWJsaWMgY2xhc3MgTW9iaWxlRGF0YVN0YXRlVHJhY2tlciBleHRlbmRzIE5ldHdvcmtTdGF0ZVRyYWNrZXIgeworcHVibGljIGNsYXNzIE1vYmlsZURhdGFTdGF0ZVRyYWNrZXIgaW1wbGVtZW50cyBOZXR3b3JrU3RhdGVUcmFja2VyIHsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiTW9iaWxlRGF0YVN0YXRlVHJhY2tlciI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBEQkcgPSB0cnVlOwpAQCAtNDgsMTAgKzQ5LDE2IEBACiAgICAgcHJpdmF0ZSBJVGVsZXBob255IG1QaG9uZVNlcnZpY2U7CiAKICAgICBwcml2YXRlIFN0cmluZyBtQXBuVHlwZTsKLSAgICBwcml2YXRlIFN0cmluZyBtQXBuVHlwZVRvV2F0Y2hGb3I7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbUFwbk5hbWU7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1FbmFibGVkOwogICAgIHByaXZhdGUgQnJvYWRjYXN0UmVjZWl2ZXIgbVN0YXRlUmVjZWl2ZXI7CisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gc0Ruc1Byb3BOYW1lczsKKyAgICBwcml2YXRlIE5ldHdvcmtJbmZvIG1OZXR3b3JrSW5mbzsKKyAgICBwcml2YXRlIGJvb2xlYW4gbVRlYXJkb3duUmVxdWVzdGVkID0gZmFsc2U7CisgICAgcHJpdmF0ZSBIYW5kbGVyIG1UYXJnZXQ7CisgICAgcHJpdmF0ZSBDb250ZXh0IG1Db250ZXh0OworICAgIHByaXZhdGUgU3RyaW5nIG1JbnRlcmZhY2VOYW1lOworICAgIHByaXZhdGUgYm9vbGVhbiBtUHJpdmF0ZURuc1JvdXRlU2V0ID0gZmFsc2U7CisgICAgcHJpdmF0ZSBpbnQgbURlZmF1bHRHYXRld2F5QWRkciA9IDA7CisgICAgcHJpdmF0ZSBib29sZWFuIG1EZWZhdWx0Um91dGVTZXQgPSBmYWxzZTsKIAogICAgIC8qKgogICAgICAqIENyZWF0ZSBhIG5ldyBNb2JpbGVEYXRhU3RhdGVUcmFja2VyCkBAIC02MiwyNCArNjksMTYgQEAKICAgICAgKiBAcGFyYW0gdGFnIHRoZSBuYW1lIG9mIHRoaXMgbmV0d29yawogICAgICAqLwogICAgIHB1YmxpYyBNb2JpbGVEYXRhU3RhdGVUcmFja2VyKENvbnRleHQgY29udGV4dCwgSGFuZGxlciB0YXJnZXQsIGludCBuZXRUeXBlLCBTdHJpbmcgdGFnKSB7Ci0gICAgICAgIHN1cGVyKGNvbnRleHQsIHRhcmdldCwgbmV0VHlwZSwKKyAgICAgICAgbVRhcmdldCA9IHRhcmdldDsKKyAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OworICAgICAgICBtTmV0d29ya0luZm8gPSBuZXcgTmV0d29ya0luZm8obmV0VHlwZSwKICAgICAgICAgICAgICAgICBUZWxlcGhvbnlNYW5hZ2VyLmdldERlZmF1bHQoKS5nZXROZXR3b3JrVHlwZSgpLCB0YWcsCiAgICAgICAgICAgICAgICAgVGVsZXBob255TWFuYWdlci5nZXREZWZhdWx0KCkuZ2V0TmV0d29ya1R5cGVOYW1lKCkpOwogICAgICAgICBtQXBuVHlwZSA9IG5ldHdvcmtUeXBlVG9BcG5UeXBlKG5ldFR5cGUpOwotICAgICAgICBpZiAoVGV4dFV0aWxzLmVxdWFscyhtQXBuVHlwZSwgUGhvbmUuQVBOX1RZUEVfSElQUkkpKSB7Ci0gICAgICAgICAgICBtQXBuVHlwZVRvV2F0Y2hGb3IgPSBQaG9uZS5BUE5fVFlQRV9ERUZBVUxUOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbUFwblR5cGVUb1dhdGNoRm9yID0gbUFwblR5cGU7Ci0gICAgICAgIH0KIAogICAgICAgICBtUGhvbmVTZXJ2aWNlID0gbnVsbDsKLSAgICAgICAgaWYobmV0VHlwZSA9PSBDb25uZWN0aXZpdHlNYW5hZ2VyLlRZUEVfTU9CSUxFKSB7Ci0gICAgICAgICAgICBtRW5hYmxlZCA9IHRydWU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtRW5hYmxlZCA9IGZhbHNlOwotICAgICAgICB9CiAKLSAgICAgICAgbURuc1Byb3BOYW1lcyA9IG5ldyBTdHJpbmdbXSB7CisgICAgICAgIHNEbnNQcm9wTmFtZXMgPSBuZXcgU3RyaW5nW10gewogICAgICAgICAgICAgICAgICJuZXQucm1uZXQwLmRuczEiLAogICAgICAgICAgICAgICAgICJuZXQucm1uZXQwLmRuczIiLAogICAgICAgICAgICAgICAgICJuZXQuZXRoMC5kbnMxIiwKQEAgLTk0LDYgKzkzLDUzIEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBJUCBhZGRyZXNzZXMgb2YgdGhlIEROUyBzZXJ2ZXJzIGF2YWlsYWJsZSBmb3IgdGhlIG1vYmlsZSBkYXRhCisgICAgICogbmV0d29yayBpbnRlcmZhY2UuCisgICAgICogQHJldHVybiBhIGxpc3Qgb2YgRE5TIGFkZHJlc3Nlcywgd2l0aCBubyBob2xlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nW10gZ2V0RG5zUHJvcE5hbWVzKCkgeworICAgICAgICByZXR1cm4gc0Ruc1Byb3BOYW1lczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG5hbWUgb2Ygb3VyIG5ldHdvcmsgaW50ZXJmYWNlLgorICAgICAqIEByZXR1cm4gdGhlIG5hbWUgb2Ygb3VyIGludGVyZmFjZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEludGVyZmFjZU5hbWUoKSB7CisgICAgICAgIHJldHVybiBtSW50ZXJmYWNlTmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1ByaXZhdGVEbnNSb3V0ZVNldCgpIHsKKyAgICAgICAgcmV0dXJuIG1Qcml2YXRlRG5zUm91dGVTZXQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcHJpdmF0ZURuc1JvdXRlU2V0KGJvb2xlYW4gZW5hYmxlZCkgeworICAgICAgICBtUHJpdmF0ZURuc1JvdXRlU2V0ID0gZW5hYmxlZDsKKyAgICB9CisKKyAgICBwdWJsaWMgTmV0d29ya0luZm8gZ2V0TmV0d29ya0luZm8oKSB7CisgICAgICAgIHJldHVybiBtTmV0d29ya0luZm87CisgICAgfQorCisgICAgcHVibGljIGludCBnZXREZWZhdWx0R2F0ZXdheUFkZHIoKSB7CisgICAgICAgIHJldHVybiBtRGVmYXVsdEdhdGV3YXlBZGRyOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzRGVmYXVsdFJvdXRlU2V0KCkgeworICAgICAgICByZXR1cm4gbURlZmF1bHRSb3V0ZVNldDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBkZWZhdWx0Um91dGVTZXQoYm9vbGVhbiBlbmFibGVkKSB7CisgICAgICAgIG1EZWZhdWx0Um91dGVTZXQgPSBlbmFibGVkOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgaXMgbm90IGltcGxlbWVudGVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbGVhc2VXYWtlTG9jaygpIHsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBCZWdpbiBtb25pdG9yaW5nIG1vYmlsZSBkYXRhIGNvbm5lY3Rpdml0eS4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzdGFydE1vbml0b3JpbmcoKSB7CkBAIC0xMDMsMzggKzE0OSwzNCBAQAogICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKFRlbGVwaG9ueUludGVudHMuQUNUSU9OX1NFUlZJQ0VfU1RBVEVfQ0hBTkdFRCk7CiAKICAgICAgICAgbVN0YXRlUmVjZWl2ZXIgPSBuZXcgTW9iaWxlRGF0YVN0YXRlUmVjZWl2ZXIoKTsKLSAgICAgICAgSW50ZW50IGludGVudCA9IG1Db250ZXh0LnJlZ2lzdGVyUmVjZWl2ZXIobVN0YXRlUmVjZWl2ZXIsIGZpbHRlcik7Ci0gICAgICAgIGlmIChpbnRlbnQgIT0gbnVsbCkKLSAgICAgICAgICAgIG1Nb2JpbGVEYXRhU3RhdGUgPSBnZXRNb2JpbGVEYXRhU3RhdGUoaW50ZW50KTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgbU1vYmlsZURhdGFTdGF0ZSA9IFBob25lLkRhdGFTdGF0ZS5ESVNDT05ORUNURUQ7CisgICAgICAgIG1Db250ZXh0LnJlZ2lzdGVyUmVjZWl2ZXIobVN0YXRlUmVjZWl2ZXIsIGZpbHRlcik7CisgICAgICAgIG1Nb2JpbGVEYXRhU3RhdGUgPSBQaG9uZS5EYXRhU3RhdGUuRElTQ09OTkVDVEVEOwogICAgIH0KIAotICAgIHByaXZhdGUgUGhvbmUuRGF0YVN0YXRlIGdldE1vYmlsZURhdGFTdGF0ZShJbnRlbnQgaW50ZW50KSB7Ci0gICAgICAgIFN0cmluZyBzdHIgPSBpbnRlbnQuZ2V0U3RyaW5nRXh0cmEoUGhvbmUuU1RBVEVfS0VZKTsKLSAgICAgICAgaWYgKHN0ciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTdHJpbmcgYXBuVHlwZUxpc3QgPQotICAgICAgICAgICAgICAgICAgICBpbnRlbnQuZ2V0U3RyaW5nRXh0cmEoUGhvbmUuREFUQV9BUE5fVFlQRVNfS0VZKTsKLSAgICAgICAgICAgIGlmIChpc0FwblR5cGVJbmNsdWRlZChhcG5UeXBlTGlzdCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRW51bS52YWx1ZU9mKFBob25lLkRhdGFTdGF0ZS5jbGFzcywgc3RyKTsKLSAgICAgICAgICAgIH0KKyAgICAvKioKKyAgICAgKiBSZWNvcmQgdGhlIHJvYW1pbmcgc3RhdHVzIG9mIHRoZSBkZXZpY2UsIGFuZCBpZiBpdCBpcyBhIGNoYW5nZSBmcm9tIHRoZSBwcmV2aW91cworICAgICAqIHN0YXR1cywgc2VuZCBhIG5vdGlmaWNhdGlvbiB0byBhbnkgbGlzdGVuZXJzLgorICAgICAqIEBwYXJhbSBpc1JvYW1pbmcge0Bjb2RlIHRydWV9IGlmIHRoZSBkZXZpY2UgaXMgbm93IHJvYW1pbmcsIHtAY29kZSBmYWxzZX0KKyAgICAgKiBpZiBpdCBpcyBubyBsb25nZXIgcm9hbWluZy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgc2V0Um9hbWluZ1N0YXR1cyhib29sZWFuIGlzUm9hbWluZykgeworICAgICAgICBpZiAoaXNSb2FtaW5nICE9IG1OZXR3b3JrSW5mby5pc1JvYW1pbmcoKSkgeworICAgICAgICAgICAgbU5ldHdvcmtJbmZvLnNldFJvYW1pbmcoaXNSb2FtaW5nKTsKKyAgICAgICAgICAgIE1lc3NhZ2UgbXNnID0gbVRhcmdldC5vYnRhaW5NZXNzYWdlKEVWRU5UX1JPQU1JTkdfQ0hBTkdFRCwgbU5ldHdvcmtJbmZvKTsKKyAgICAgICAgICAgIG1zZy5zZW5kVG9UYXJnZXQoKTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gUGhvbmUuRGF0YVN0YXRlLkRJU0NPTk5FQ1RFRDsKICAgICB9CiAKLSAgICBwcml2YXRlIGJvb2xlYW4gaXNBcG5UeXBlSW5jbHVkZWQoU3RyaW5nIHR5cGVMaXN0KSB7Ci0gICAgICAgIC8qIGNvbW1hIHNlcGVyYXRlZCBsaXN0IC0gc3BsaXQgYW5kIGNoZWNrICovCi0gICAgICAgIGlmICh0eXBlTGlzdCA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIFN0cmluZ1tdIGxpc3QgPSB0eXBlTGlzdC5zcGxpdCgiLCIpOwotICAgICAgICBmb3IoaW50IGk9MDsgaTwgbGlzdC5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaWYgKFRleHRVdGlscy5lcXVhbHMobGlzdFtpXSwgbUFwblR5cGVUb1dhdGNoRm9yKSB8fAotICAgICAgICAgICAgICAgIFRleHRVdGlscy5lcXVhbHMobGlzdFtpXSwgUGhvbmUuQVBOX1RZUEVfQUxMKSkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgIHByaXZhdGUgdm9pZCBzZXRTdWJ0eXBlKGludCBzdWJ0eXBlLCBTdHJpbmcgc3VidHlwZU5hbWUpIHsKKyAgICAgICAgaWYgKG1OZXR3b3JrSW5mby5pc0Nvbm5lY3RlZCgpKSB7CisgICAgICAgICAgICBpbnQgb2xkU3VidHlwZSA9IG1OZXR3b3JrSW5mby5nZXRTdWJ0eXBlKCk7CisgICAgICAgICAgICBpZiAoc3VidHlwZSAhPSBvbGRTdWJ0eXBlKSB7CisgICAgICAgICAgICAgICAgbU5ldHdvcmtJbmZvLnNldFN1YnR5cGUoc3VidHlwZSwgc3VidHlwZU5hbWUpOworICAgICAgICAgICAgICAgIE1lc3NhZ2UgbXNnID0gbVRhcmdldC5vYnRhaW5NZXNzYWdlKAorICAgICAgICAgICAgICAgICAgICAgICAgRVZFTlRfTkVUV09SS19TVUJUWVBFX0NIQU5HRUQsIG9sZFN1YnR5cGUsIDAsIG1OZXR3b3JrSW5mbyk7CisgICAgICAgICAgICAgICAgbXNnLnNlbmRUb1RhcmdldCgpOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKICAgICBwcml2YXRlIGNsYXNzIE1vYmlsZURhdGFTdGF0ZVJlY2VpdmVyIGV4dGVuZHMgQnJvYWRjYXN0UmVjZWl2ZXIgewpAQCAtMTQyLDUwICsxODQsMjkgQEAKICAgICAgICAgICAgIHN5bmNocm9uaXplZCh0aGlzKSB7CiAgICAgICAgICAgICAgICAgaWYgKGludGVudC5nZXRBY3Rpb24oKS5lcXVhbHMoVGVsZXBob255SW50ZW50cy4KICAgICAgICAgICAgICAgICAgICAgICAgIEFDVElPTl9BTllfREFUQV9DT05ORUNUSU9OX1NUQVRFX0NIQU5HRUQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIFBob25lLkRhdGFTdGF0ZSBzdGF0ZSA9IGdldE1vYmlsZURhdGFTdGF0ZShpbnRlbnQpOworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYXBuVHlwZSA9IGludGVudC5nZXRTdHJpbmdFeHRyYShQaG9uZS5EQVRBX0FQTl9UWVBFX0tFWSk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFUZXh0VXRpbHMuZXF1YWxzKGFwblR5cGUsIG1BcG5UeXBlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIFBob25lLkRhdGFTdGF0ZSBzdGF0ZSA9IEVudW0udmFsdWVPZihQaG9uZS5EYXRhU3RhdGUuY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZW50LmdldFN0cmluZ0V4dHJhKFBob25lLlNUQVRFX0tFWSkpOwogICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcmVhc29uID0gaW50ZW50LmdldFN0cmluZ0V4dHJhKFBob25lLlNUQVRFX0NIQU5HRV9SRUFTT05fS0VZKTsKICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGFwbk5hbWUgPSBpbnRlbnQuZ2V0U3RyaW5nRXh0cmEoUGhvbmUuREFUQV9BUE5fS0VZKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGFwblR5cGVMaXN0ID0gaW50ZW50LmdldFN0cmluZ0V4dHJhKFBob25lLkRBVEFfQVBOX1RZUEVTX0tFWSk7Ci0gICAgICAgICAgICAgICAgICAgIG1BcG5OYW1lID0gYXBuTmFtZTsKIAogICAgICAgICAgICAgICAgICAgICBib29sZWFuIHVuYXZhaWxhYmxlID0gaW50ZW50LmdldEJvb2xlYW5FeHRyYShQaG9uZS5ORVRXT1JLX1VOQVZBSUxBQkxFX0tFWSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gc2V0IHRoaXMgcmVnYXJkbGVzcyBvZiB0aGUgYXBuVHlwZUxpc3QuICBJdCdzIGFsbCB0aGUgc2FtZSByYWRpby9uZXR3b3JrCi0gICAgICAgICAgICAgICAgICAgIC8vIHVuZGVybmVhdGgKICAgICAgICAgICAgICAgICAgICAgbU5ldHdvcmtJbmZvLnNldElzQXZhaWxhYmxlKCF1bmF2YWlsYWJsZSk7CiAKLSAgICAgICAgICAgICAgICAgICAgaWYgKGlzQXBuVHlwZUluY2x1ZGVkKGFwblR5cGVMaXN0KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1FbmFibGVkID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgd2UncmUgbm90IGVuYWJsZWQgYnV0IHRoZSBBUE4gVHlwZSBpcyBzdXBwb3J0ZWQgYnkgdGhpcyBjb25uZWN0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2Ugc2hvdWxkIHJlY29yZCB0aGUgaW50ZXJmYWNlIG5hbWUgaWYgb25lJ3MgcHJvdmlkZWQuICBJZiB0aGUgdXNlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHR1cm5zIG9uIHRoaXMgbmV0d29yayB3ZSB3aWxsIG5lZWQgdGhlIGludGVyZmFjZW5hbWUgYnV0IHdvbid0IGdldAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGEgZnJlc2ggY29ubmVjdGVkIG1lc3NhZ2UgLSBUT0RPIGZpeCB0aGlzIHdoZW4gd2UgZ2V0IHBlci1BUE4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBub3RpZmljYXRpb25zCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlID09IFBob25lLkRhdGFTdGF0ZS5DT05ORUNURUQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCAicmVwbGFjaW5nIG9sZCBtSW50ZXJmYWNlTmFtZSAoIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUludGVyZmFjZU5hbWUgKyAiKSB3aXRoICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVudC5nZXRTdHJpbmdFeHRyYShQaG9uZS5EQVRBX0lGQUNFX05BTUVfS0VZKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBmb3IgIiArIG1BcG5UeXBlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUludGVyZmFjZU5hbWUgPSBpbnRlbnQuZ2V0U3RyaW5nRXh0cmEoUGhvbmUuREFUQV9JRkFDRV9OQU1FX0tFWSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgfQotCiAgICAgICAgICAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgbUFwblR5cGUgKyAiIFJlY2VpdmVkIHN0YXRlPSAiICsgc3RhdGUgKyAiLCBvbGQ9ICIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Nb2JpbGVEYXRhU3RhdGUgKyAiLCByZWFzb249ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyZWFzb24gPT0gbnVsbCA/ICIodW5zcGVjaWZpZWQpIiA6IHJlYXNvbikgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICIsIGFwblR5cGVMaXN0PSAiICsgYXBuVHlwZUxpc3QpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyZWFzb24gPT0gbnVsbCA/ICIodW5zcGVjaWZpZWQpIiA6IHJlYXNvbikpOwogCiAgICAgICAgICAgICAgICAgICAgIGlmIChtTW9iaWxlRGF0YVN0YXRlICE9IHN0YXRlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBtTW9iaWxlRGF0YVN0YXRlID0gc3RhdGU7CiAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN0YXRlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBESVNDT05ORUNURUQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGlzVGVhcmRvd25SZXF1ZXN0ZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUVuYWJsZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRlYXJkb3duUmVxdWVzdGVkKGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogCkBAIC0yMTgsMTEgKzIzOSwxNCBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpbnRlbnQuZ2V0QWN0aW9uKCkuCiAgICAgICAgICAgICAgICAgICAgICAgICBlcXVhbHMoVGVsZXBob255SW50ZW50cy5BQ1RJT05fREFUQV9DT05ORUNUSU9OX0ZBSUxFRCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbUVuYWJsZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGFwblR5cGUgPSBpbnRlbnQuZ2V0U3RyaW5nRXh0cmEoUGhvbmUuREFUQV9BUE5fVFlQRV9LRVkpOworICAgICAgICAgICAgICAgICAgICBpZiAoIVRleHRVdGlscy5lcXVhbHMoYXBuVHlwZSwgbUFwblR5cGUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHJlYXNvbiA9IGludGVudC5nZXRTdHJpbmdFeHRyYShQaG9uZS5GQUlMVVJFX1JFQVNPTl9LRVkpOwogICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYXBuTmFtZSA9IGludGVudC5nZXRTdHJpbmdFeHRyYShQaG9uZS5EQVRBX0FQTl9LRVkpOwotICAgICAgICAgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsICJSZWNlaXZlZCAiICsgaW50ZW50LmdldEFjdGlvbigpICsgIiBicm9hZGNhc3QiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFzb24gPT0gbnVsbCA/ICIiIDogIigiICsgcmVhc29uICsgIikiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCBtQXBuVHlwZSArICJSZWNlaXZlZCAiICsgaW50ZW50LmdldEFjdGlvbigpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGJyb2FkY2FzdCIgKyByZWFzb24gPT0gbnVsbCA/ICIiIDogIigiICsgcmVhc29uICsgIikiKTsKICAgICAgICAgICAgICAgICAgICAgc2V0RGV0YWlsZWRTdGF0ZShEZXRhaWxlZFN0YXRlLkZBSUxFRCwgcmVhc29uLCBhcG5OYW1lKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgVGVsZXBob255TWFuYWdlciB0bSA9IFRlbGVwaG9ueU1hbmFnZXIuZ2V0RGVmYXVsdCgpOwpAQCAtMzIwLDcwICszNDQsODggQEAKICAgICAvKioKICAgICAgKiBUZWFyIGRvd24gbW9iaWxlIGRhdGEgY29ubmVjdGl2aXR5LCBpLmUuLCBkaXNhYmxlIHRoZSBhYmlsaXR5IHRvIGNyZWF0ZQogICAgICAqIG1vYmlsZSBkYXRhIGNvbm5lY3Rpb25zLgorICAgICAqIFRPRE8gLSBtYWtlIGFzeW5jIGFuZCByZXR1cm4gbm90aGluZz8KICAgICAgKi8KLSAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiB0ZWFyZG93bigpIHsKLSAgICAgICAgLy8gc2luY2Ugd2Ugd29uJ3QgZ2V0IGEgbm90aWZpY2F0aW9uIGN1cnJlbnRseSAoVE9ETyAtIHBlciBBUE4gbm90aWZpY2F0aW9ucykKLSAgICAgICAgLy8gd2Ugd29uJ3QgZ2V0IGEgZGlzY29ubmVjdCBtZXNzYWdlIHVudGlsIGFsbCBBUE4ncyBvbiB0aGUgY3VycmVudCBjb25uZWN0aW9uJ3MKLSAgICAgICAgLy8gQVBOIGxpc3QgYXJlIGRpc2FibGVkLiAgVGhhdCBtZWFucyBwcml2YXRlUm91dGVzIGZvciBETlMgYW5kIHN1Y2ggd2lsbCByZW1haW4gb24gLQotICAgICAgICAvLyBub3QgYSBwcm9ibGVtIHNpbmNlIHRoYXQncyBhbGwgc2hhcmVkIHdpdGggd2hhdGV2ZXIgb3RoZXIgQVBOIGlzIHN0aWxsIG9uLCBidXQKLSAgICAgICAgLy8gdWdseS4KICAgICAgICAgc2V0VGVhcmRvd25SZXF1ZXN0ZWQodHJ1ZSk7CiAgICAgICAgIHJldHVybiAoc2V0RW5hYmxlQXBuKG1BcG5UeXBlLCBmYWxzZSkgIT0gUGhvbmUuQVBOX1JFUVVFU1RfRkFJTEVEKTsKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBSZWNvcmQgdGhlIGRldGFpbGVkIHN0YXRlIG9mIGEgbmV0d29yaywgYW5kIGlmIGl0IGlzIGEKKyAgICAgKiBjaGFuZ2UgZnJvbSB0aGUgcHJldmlvdXMgc3RhdGUsIHNlbmQgYSBub3RpZmljYXRpb24gdG8KKyAgICAgKiBhbnkgbGlzdGVuZXJzLgorICAgICAqIEBwYXJhbSBzdGF0ZSB0aGUgbmV3IEB7Y29kZSBEZXRhaWxlZFN0YXRlfQorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBzZXREZXRhaWxlZFN0YXRlKE5ldHdvcmtJbmZvLkRldGFpbGVkU3RhdGUgc3RhdGUpIHsKKyAgICAgICAgc2V0RGV0YWlsZWRTdGF0ZShzdGF0ZSwgbnVsbCwgbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVjb3JkIHRoZSBkZXRhaWxlZCBzdGF0ZSBvZiBhIG5ldHdvcmssIGFuZCBpZiBpdCBpcyBhCisgICAgICogY2hhbmdlIGZyb20gdGhlIHByZXZpb3VzIHN0YXRlLCBzZW5kIGEgbm90aWZpY2F0aW9uIHRvCisgICAgICogYW55IGxpc3RlbmVycy4KKyAgICAgKiBAcGFyYW0gc3RhdGUgdGhlIG5ldyBAe2NvZGUgRGV0YWlsZWRTdGF0ZX0KKyAgICAgKiBAcGFyYW0gcmVhc29uIGEge0Bjb2RlIFN0cmluZ30gaW5kaWNhdGluZyBhIHJlYXNvbiBmb3IgdGhlIHN0YXRlIGNoYW5nZSwKKyAgICAgKiBpZiBvbmUgd2FzIHN1cHBsaWVkLiBNYXkgYmUge0Bjb2RlIG51bGx9LgorICAgICAqIEBwYXJhbSBleHRyYUluZm8gb3B0aW9uYWwge0Bjb2RlIFN0cmluZ30gcHJvdmlkaW5nIGV4dHJhIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzdGF0ZSBjaGFuZ2UKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgc2V0RGV0YWlsZWRTdGF0ZShOZXR3b3JrSW5mby5EZXRhaWxlZFN0YXRlIHN0YXRlLCBTdHJpbmcgcmVhc29uLCBTdHJpbmcgZXh0cmFJbmZvKSB7CisgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgInNldERldGFpbGVkIHN0YXRlLCBvbGQgPSIKKyAgICAgICAgICAgICAgICArIG1OZXR3b3JrSW5mby5nZXREZXRhaWxlZFN0YXRlKCkgKyAiIGFuZCBuZXcgc3RhdGU9IiArIHN0YXRlKTsKKyAgICAgICAgaWYgKHN0YXRlICE9IG1OZXR3b3JrSW5mby5nZXREZXRhaWxlZFN0YXRlKCkpIHsKKyAgICAgICAgICAgIGJvb2xlYW4gd2FzQ29ubmVjdGluZyA9IChtTmV0d29ya0luZm8uZ2V0U3RhdGUoKSA9PSBOZXR3b3JrSW5mby5TdGF0ZS5DT05ORUNUSU5HKTsKKyAgICAgICAgICAgIFN0cmluZyBsYXN0UmVhc29uID0gbU5ldHdvcmtJbmZvLmdldFJlYXNvbigpOworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIElmIGEgcmVhc29uIHdhcyBzdXBwbGllZCB3aGVuIHRoZSBDT05ORUNUSU5HIHN0YXRlIHdhcyBlbnRlcmVkLCBhbmQgbm8KKyAgICAgICAgICAgICAqIHJlYXNvbiB3YXMgc3VwcGxpZWQgZm9yIGVudGVyaW5nIHRoZSBDT05ORUNURUQgc3RhdGUsIHRoZW4gcmV0YWluIHRoZQorICAgICAgICAgICAgICogcmVhc29uIHRoYXQgd2FzIHN1cHBsaWVkIHdoZW4gZ29pbmcgdG8gQ09OTkVDVElORy4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKHdhc0Nvbm5lY3RpbmcgJiYgc3RhdGUgPT0gTmV0d29ya0luZm8uRGV0YWlsZWRTdGF0ZS5DT05ORUNURUQgJiYgcmVhc29uID09IG51bGwKKyAgICAgICAgICAgICAgICAgICAgJiYgbGFzdFJlYXNvbiAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJlYXNvbiA9IGxhc3RSZWFzb247CisgICAgICAgICAgICBtTmV0d29ya0luZm8uc2V0RGV0YWlsZWRTdGF0ZShzdGF0ZSwgcmVhc29uLCBleHRyYUluZm8pOworICAgICAgICAgICAgTWVzc2FnZSBtc2cgPSBtVGFyZ2V0Lm9idGFpbk1lc3NhZ2UoRVZFTlRfU1RBVEVfQ0hBTkdFRCwgbU5ldHdvcmtJbmZvKTsKKyAgICAgICAgICAgIG1zZy5zZW5kVG9UYXJnZXQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzZXREZXRhaWxlZFN0YXRlSW50ZXJuYWwoTmV0d29ya0luZm8uRGV0YWlsZWRTdGF0ZSBzdGF0ZSkgeworICAgICAgICBtTmV0d29ya0luZm8uc2V0RGV0YWlsZWRTdGF0ZShzdGF0ZSwgbnVsbCwgbnVsbCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VGVhcmRvd25SZXF1ZXN0ZWQoYm9vbGVhbiBpc1JlcXVlc3RlZCkgeworICAgICAgICBtVGVhcmRvd25SZXF1ZXN0ZWQgPSBpc1JlcXVlc3RlZDsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1RlYXJkb3duUmVxdWVzdGVkKCkgeworICAgICAgICByZXR1cm4gbVRlYXJkb3duUmVxdWVzdGVkOworICAgIH0KKworICAgIC8qKgogICAgICAqIFJlLWVuYWJsZSBtb2JpbGUgZGF0YSBjb25uZWN0aXZpdHkgYWZ0ZXIgYSB7QGxpbmsgI3RlYXJkb3duKCl9LgorICAgICAqIFRPRE8gLSBtYWtlIGFzeW5jIGFuZCBhbHdheXMgZ2V0IGEgbm90aWZpY2F0aW9uPwogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIHJlY29ubmVjdCgpIHsKKyAgICAgICAgYm9vbGVhbiByZXRWYWx1ZSA9IGZhbHNlOyAvL2Nvbm5lY3RlZCBvciBleHBlY3QgdG8gYmU/CiAgICAgICAgIHNldFRlYXJkb3duUmVxdWVzdGVkKGZhbHNlKTsKICAgICAgICAgc3dpdGNoIChzZXRFbmFibGVBcG4obUFwblR5cGUsIHRydWUpKSB7CiAgICAgICAgICAgICBjYXNlIFBob25lLkFQTl9BTFJFQURZX0FDVElWRToKLSAgICAgICAgICAgICAgICAvLyBUT0RPIC0gcmVtb3ZlIHRoaXMgd2hlbiB3ZSBnZXQgcGVyLWFwbiBub3RpZmljYXRpb25zCi0gICAgICAgICAgICAgICAgbUVuYWJsZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgIC8vIG5lZWQgdG8gc2V0IHNlbGYgdG8gQ09OTkVDVElORyBzbyB0aGUgYmVsb3cgbWVzc2FnZSBpcyBoYW5kbGVkLgotICAgICAgICAgICAgICAgIG1Nb2JpbGVEYXRhU3RhdGUgPSBQaG9uZS5EYXRhU3RhdGUuQ09OTkVDVElORzsKLSAgICAgICAgICAgICAgICBzZXREZXRhaWxlZFN0YXRlKERldGFpbGVkU3RhdGUuQ09OTkVDVElORywgUGhvbmUuUkVBU09OX0FQTl9DSEFOR0VELCBudWxsKTsKLSAgICAgICAgICAgICAgICAvL3NlbmQgb3V0IGEgY29ubmVjdGVkIG1lc3NhZ2UKLSAgICAgICAgICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChUZWxlcGhvbnlJbnRlbnRzLgotICAgICAgICAgICAgICAgICAgICAgICAgQUNUSU9OX0FOWV9EQVRBX0NPTk5FQ1RJT05fU1RBVEVfQ0hBTkdFRCk7Ci0gICAgICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKFBob25lLlNUQVRFX0tFWSwgUGhvbmUuRGF0YVN0YXRlLkNPTk5FQ1RFRC50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICBpbnRlbnQucHV0RXh0cmEoUGhvbmUuU1RBVEVfQ0hBTkdFX1JFQVNPTl9LRVksIFBob25lLlJFQVNPTl9BUE5fQ0hBTkdFRCk7Ci0gICAgICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKFBob25lLkRBVEFfQVBOX1RZUEVTX0tFWSwgbUFwblR5cGVUb1dhdGNoRm9yKTsKLSAgICAgICAgICAgICAgICBpbnRlbnQucHV0RXh0cmEoUGhvbmUuREFUQV9BUE5fS0VZLCBtQXBuTmFtZSk7Ci0gICAgICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKFBob25lLkRBVEFfSUZBQ0VfTkFNRV9LRVksIG1JbnRlcmZhY2VOYW1lKTsKLSAgICAgICAgICAgICAgICBpbnRlbnQucHV0RXh0cmEoUGhvbmUuTkVUV09SS19VTkFWQUlMQUJMRV9LRVksIGZhbHNlKTsKLSAgICAgICAgICAgICAgICBpZiAobVN0YXRlUmVjZWl2ZXIgIT0gbnVsbCkgbVN0YXRlUmVjZWl2ZXIub25SZWNlaXZlKG1Db250ZXh0LCBpbnRlbnQpOworICAgICAgICAgICAgICAgIHJldFZhbHVlID0gdHJ1ZTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgUGhvbmUuQVBOX1JFUVVFU1RfU1RBUlRFRDoKLSAgICAgICAgICAgICAgICBtRW5hYmxlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgLy8gbm8gbmVlZCB0byBkbyBhbnl0aGluZyAtIHdlJ3JlIGFscmVhZHkgZHVlIHNvbWUgc3RhdHVzIHVwZGF0ZSBpbnRlbnRzCisgICAgICAgICAgICAgICAgcmV0VmFsdWUgPSB0cnVlOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBQaG9uZS5BUE5fUkVRVUVTVF9GQUlMRUQ6Ci0gICAgICAgICAgICAgICAgaWYgKG1QaG9uZVNlcnZpY2UgPT0gbnVsbCAmJiBtQXBuVHlwZSA9PSBQaG9uZS5BUE5fVFlQRV9ERUZBVUxUKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIG9uIHN0YXJ0dXAgd2UgbWF5IHRyeSB0byB0YWxrIHRvIHRoZSBwaG9uZSBiZWZvcmUgaXQncyByZWFkeQotICAgICAgICAgICAgICAgICAgICAvLyBzaW5jZSB0aGUgcGhvbmUgd2lsbCBjb21lIHVwIGVuYWJsZWQsIGdvIHdpdGggdGhhdC4KLSAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyAtIHRoaXMgYWxzbyBjb21lcyB1cCBvbiB0ZWxlcGhvbnkgY3Jhc2g6IGlmIHdlIHRoaW5rIG1vYmlsZSBkYXRhIGlzCi0gICAgICAgICAgICAgICAgICAgIC8vIG9mZiBhbmQgdGhlIHRlbGVwaG9ueSBzdHVmZiBjcmFzaGVzIGFuZCBoYXMgdG8gcmVzdGFydCBpdCB3aWxsIGNvbWUgdXAKLSAgICAgICAgICAgICAgICAgICAgLy8gZW5hYmxlZCAobWFraW5nIGEgZGF0YSBjb25uZWN0aW9uKS4gIFdlIHdpbGwgdGhlbiBiZSBvdXQgb2Ygc3luYy4KLSAgICAgICAgICAgICAgICAgICAgLy8gQSBwb3NzaWJsZSBzb2x1dGlvbiBpcyBhIGJyb2FkY2FzdCB3aGVuIHRlbGVwaG9ueSByZXN0YXJ0cy4KLSAgICAgICAgICAgICAgICAgICAgbUVuYWJsZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIGVsc2UgZmFsbCB0aHJvdWdoCiAgICAgICAgICAgICBjYXNlIFBob25lLkFQTl9UWVBFX05PVF9BVkFJTEFCTEU6Ci0gICAgICAgICAgICAgICAgLy8gRGVmYXVsdCBpcyBhbHdheXMgYXZhaWxhYmxlLCBidXQgbWF5IGJlIG9mZiBkdWUgdG8KLSAgICAgICAgICAgICAgICAvLyBBaXJwbGFuZU1vZGUgb3IgRS1DYWxsIG9yIHdoYXRldmVyLi4KLSAgICAgICAgICAgICAgICBpZiAobUFwblR5cGUgIT0gUGhvbmUuQVBOX1RZUEVfREVGQVVMVCkgewotICAgICAgICAgICAgICAgICAgICBtRW5hYmxlZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiRXJyb3IgaW4gcmVjb25uZWN0IC0gdW5leHBlY3RlZCByZXNwb25zZS4iKTsKLSAgICAgICAgICAgICAgICBtRW5hYmxlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtRW5hYmxlZDsKKyAgICAgICAgcmV0dXJuIHJldFZhbHVlOwogICAgIH0KIAogICAgIC8qKgpAQCAtNDU3LDIzICs0OTksOSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEVuc3VyZSB0aGF0IGEgbmV0d29yayByb3V0ZSBleGlzdHMgdG8gZGVsaXZlciB0cmFmZmljIHRvIHRoZSBzcGVjaWZpZWQKLSAgICAgKiBob3N0IHZpYSB0aGUgbW9iaWxlIGRhdGEgbmV0d29yay4KLSAgICAgKiBAcGFyYW0gaG9zdEFkZHJlc3MgdGhlIElQIGFkZHJlc3Mgb2YgdGhlIGhvc3QgdG8gd2hpY2ggdGhlIHJvdXRlIGlzIGRlc2lyZWQsCi0gICAgICogaW4gbmV0d29yayBieXRlIG9yZGVyLgotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IG9uIHN1Y2Nlc3MsIHtAY29kZSBmYWxzZX0gb24gZmFpbHVyZQorICAgICAqIFRoaXMgaXMgbm90IHN1cHBvcnRlZC4KICAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiByZXF1ZXN0Um91dGVUb0hvc3QoaW50IGhvc3RBZGRyZXNzKSB7Ci0gICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIlJlcXVlc3RlZCBob3N0IHJvdXRlIHRvICIgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKGhvc3RBZGRyZXNzKSArCi0gICAgICAgICAgICAgICAgICAgICIgZm9yICIgKyBtQXBuVHlwZSArICIoIiArIG1JbnRlcmZhY2VOYW1lICsgIikiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobUludGVyZmFjZU5hbWUgIT0gbnVsbCAmJiBob3N0QWRkcmVzcyAhPSAtMSkgewotICAgICAgICAgICAgcmV0dXJuIE5ldHdvcmtVdGlscy5hZGRIb3N0Um91dGUobUludGVyZmFjZU5hbWUsIGhvc3RBZGRyZXNzKSA9PSAwOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9CisgICAgcHVibGljIHZvaWQgaW50ZXJwcmV0U2NhblJlc3VsdHNBdmFpbGFibGUoKSB7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9uZXQvTmV0d29ya0luZm8uamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL25ldC9OZXR3b3JrSW5mby5qYXZhCmluZGV4IDY0OWNiOGMuLjIxZjcxMWMgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL25ldC9OZXR3b3JrSW5mby5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL25ldC9OZXR3b3JrSW5mby5qYXZhCkBAIC0xMjEsNyArMTIxLDEwIEBACiAgICAgICovCiAgICAgcHVibGljIE5ldHdvcmtJbmZvKGludCB0eXBlKSB7fQogCi0gICAgTmV0d29ya0luZm8oaW50IHR5cGUsIGludCBzdWJ0eXBlLCBTdHJpbmcgdHlwZU5hbWUsIFN0cmluZyBzdWJ0eXBlTmFtZSkgeworICAgIC8qKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIE5ldHdvcmtJbmZvKGludCB0eXBlLCBpbnQgc3VidHlwZSwgU3RyaW5nIHR5cGVOYW1lLCBTdHJpbmcgc3VidHlwZU5hbWUpIHsKICAgICAgICAgaWYgKCFDb25uZWN0aXZpdHlNYW5hZ2VyLmlzTmV0d29ya1R5cGVWYWxpZCh0eXBlKSkgewogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCBuZXR3b3JrIHR5cGU6ICIgKyB0eXBlKTsKICAgICAgICAgfQpAQCAtMjgxLDggKzI4NCw5IEBACiAgICAgICogaWYgb25lIHdhcyBzdXBwbGllZC4gTWF5IGJlIHtAY29kZSBudWxsfS4KICAgICAgKiBAcGFyYW0gZXh0cmFJbmZvIGFuIG9wdGlvbmFsIHtAY29kZSBTdHJpbmd9IHByb3ZpZGluZyBhZGRkaXRpb25hbCBuZXR3b3JrIHN0YXRlCiAgICAgICogaW5mb3JtYXRpb24gcGFzc2VkIHVwIGZyb20gdGhlIGxvd2VyIG5ldHdvcmtpbmcgbGF5ZXJzLgorICAgICAqIEBoaWRlCiAgICAgICovCi0gICAgdm9pZCBzZXREZXRhaWxlZFN0YXRlKERldGFpbGVkU3RhdGUgZGV0YWlsZWRTdGF0ZSwgU3RyaW5nIHJlYXNvbiwgU3RyaW5nIGV4dHJhSW5mbykgeworICAgIHB1YmxpYyB2b2lkIHNldERldGFpbGVkU3RhdGUoRGV0YWlsZWRTdGF0ZSBkZXRhaWxlZFN0YXRlLCBTdHJpbmcgcmVhc29uLCBTdHJpbmcgZXh0cmFJbmZvKSB7CiAgICAgICAgIHRoaXMubURldGFpbGVkU3RhdGUgPSBkZXRhaWxlZFN0YXRlOwogICAgICAgICB0aGlzLm1TdGF0ZSA9IHN0YXRlTWFwLmdldChkZXRhaWxlZFN0YXRlKTsKICAgICAgICAgdGhpcy5tUmVhc29uID0gcmVhc29uOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvbmV0L05ldHdvcmtTdGF0ZVRyYWNrZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL25ldC9OZXR3b3JrU3RhdGVUcmFja2VyLmphdmEKaW5kZXggMWZiMDE0NC4uY2Q4ZTdmMSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvbmV0L05ldHdvcmtTdGF0ZVRyYWNrZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9uZXQvTmV0d29ya1N0YXRlVHJhY2tlci5qYXZhCkBAIC0xNiw0MCArMTYsMTUgQEAKIAogcGFja2FnZSBhbmRyb2lkLm5ldDsKIAotaW1wb3J0IGphdmEuaW8uRmlsZVdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1pbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwotaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKLWltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbVByb3BlcnRpZXM7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKLWltcG9ydCBhbmRyb2lkLnV0aWwuQ29uZmlnOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci0KLQogLyoqCi0gKiBFYWNoIHN1YmNsYXNzIG9mIHRoaXMgY2xhc3Mga2VlcHMgdHJhY2sgb2YgdGhlIHN0YXRlIG9mIGNvbm5lY3Rpdml0eQotICogb2YgYSBuZXR3b3JrIGludGVyZmFjZS4gQWxsIHN0YXRlIGluZm9ybWF0aW9uIGZvciBhIG5ldHdvcmsgc2hvdWxkCi0gKiBiZSBrZXB0IGluIGEgVHJhY2tlciBjbGFzcy4gVGhpcyBzdXBlcmNsYXNzIG1hbmFnZXMgdGhlCi0gKiBuZXR3b3JrLXR5cGUtaW5kZXBlbmRlbnQgYXNwZWN0cyBvZiBuZXR3b3JrIHN0YXRlLgorICogSW50ZXJmYWNlIGZvciBjb25uZWN0aXZpdHkgc2VydmljZSB0byBhY3Qgb24gYSBuZXR3b3JrIGludGVyZmFjZS4KKyAqIEFsbCBzdGF0ZSBpbmZvcm1hdGlvbiBmb3IgYSBuZXR3b3JrIHNob3VsZCBiZSBrZXB0IGluIGEgVHJhY2tlciBjbGFzcy4KKyAqIFRoaXMgaW50ZXJmYWNlIGRlZmluZXMgbmV0d29yay10eXBlLWluZGVwZW5kZW50IGZ1bmN0aW9ucyB0aGF0IHNob3VsZAorICogYmUgaW1wbGVtZW50ZWQgYnkgdGhlIFRyYWNrZXIgY2xhc3MuCiAgKgogICoge0BoaWRlfQogICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTmV0d29ya1N0YXRlVHJhY2tlciBleHRlbmRzIEhhbmRsZXIgewotCi0gICAgcHJvdGVjdGVkIE5ldHdvcmtJbmZvIG1OZXR3b3JrSW5mbzsKLSAgICBwcm90ZWN0ZWQgQ29udGV4dCBtQ29udGV4dDsKLSAgICBwcm90ZWN0ZWQgSGFuZGxlciBtVGFyZ2V0OwotICAgIHByb3RlY3RlZCBTdHJpbmcgbUludGVyZmFjZU5hbWU7Ci0gICAgcHJvdGVjdGVkIFN0cmluZ1tdIG1EbnNQcm9wTmFtZXM7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1Qcml2YXRlRG5zUm91dGVTZXQ7Ci0gICAgcHJvdGVjdGVkIGludCBtRGVmYXVsdEdhdGV3YXlBZGRyOwotICAgIHByaXZhdGUgYm9vbGVhbiBtRGVmYXVsdFJvdXRlU2V0OwotICAgIHByaXZhdGUgYm9vbGVhbiBtVGVhcmRvd25SZXF1ZXN0ZWQ7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIERCRyA9IHRydWU7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJOZXR3b3JrU3RhdGVUcmFja2VyIjsKK3B1YmxpYyBpbnRlcmZhY2UgTmV0d29ya1N0YXRlVHJhY2tlciB7CiAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFVkVOVF9TVEFURV9DSEFOR0VEID0gMTsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFVkVOVF9TQ0FOX1JFU1VMVFNfQVZBSUxBQkxFID0gMjsKQEAgLTYzLDMwNiArMzgsOTEgQEAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFVkVOVF9ST0FNSU5HX0NIQU5HRUQgPSA1OwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVWRU5UX05FVFdPUktfU1VCVFlQRV9DSEFOR0VEID0gNjsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFVkVOVF9SRVNUT1JFX0RFRkFVTFRfTkVUV09SSyA9IDc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfQ0xFQVJfTkVUX1RSQU5TSVRJT05fV0FLRUxPQ0sgPSA4OwogCi0gICAgcHVibGljIE5ldHdvcmtTdGF0ZVRyYWNrZXIoQ29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgSGFuZGxlciB0YXJnZXQsCi0gICAgICAgICAgICBpbnQgbmV0d29ya1R5cGUsCi0gICAgICAgICAgICBpbnQgc3ViVHlwZSwKLSAgICAgICAgICAgIFN0cmluZyB0eXBlTmFtZSwKLSAgICAgICAgICAgIFN0cmluZyBzdWJ0eXBlTmFtZSkgewotICAgICAgICBzdXBlcigpOwotICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7Ci0gICAgICAgIG1UYXJnZXQgPSB0YXJnZXQ7Ci0gICAgICAgIG1UZWFyZG93blJlcXVlc3RlZCA9IGZhbHNlOwotCi0gICAgICAgIHRoaXMubU5ldHdvcmtJbmZvID0gbmV3IE5ldHdvcmtJbmZvKG5ldHdvcmtUeXBlLCBzdWJUeXBlLCB0eXBlTmFtZSwgc3VidHlwZU5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBOZXR3b3JrSW5mbyBnZXROZXR3b3JrSW5mbygpIHsKLSAgICAgICAgcmV0dXJuIG1OZXR3b3JrSW5mbzsKLSAgICB9CisgICAgLyoqCisgICAgICogRmV0Y2ggTmV0d29ya0luZm8gZm9yIHRoZSBuZXR3b3JrCisgICAgICovCisgICAgcHVibGljIE5ldHdvcmtJbmZvIGdldE5ldHdvcmtJbmZvKCk7CiAKICAgICAvKioKICAgICAgKiBSZXR1cm4gdGhlIHN5c3RlbSBwcm9wZXJ0aWVzIG5hbWUgYXNzb2NpYXRlZCB3aXRoIHRoZSB0Y3AgYnVmZmVyIHNpemVzCiAgICAgICogZm9yIHRoaXMgbmV0d29yay4KICAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldFRjcEJ1ZmZlclNpemVzUHJvcE5hbWUoKTsKKyAgICBwdWJsaWMgU3RyaW5nIGdldFRjcEJ1ZmZlclNpemVzUHJvcE5hbWUoKTsKIAogICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgSVAgYWRkcmVzc2VzIG9mIHRoZSBETlMgc2VydmVycyBhdmFpbGFibGUgZm9yIHRoZSBtb2JpbGUgZGF0YQotICAgICAqIG5ldHdvcmsgaW50ZXJmYWNlLgotICAgICAqIEByZXR1cm4gYSBsaXN0IG9mIEROUyBhZGRyZXNzZXMsIHdpdGggbm8gaG9sZXMuCisgICAgICogUmV0dXJuIHRoZSBETlMgcHJvcGVydHkgbmFtZXMgZm9yIHRoaXMgbmV0d29yay4KICAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0TmFtZVNlcnZlcnMoKSB7Ci0gICAgICAgIHJldHVybiBnZXROYW1lU2VydmVyTGlzdChtRG5zUHJvcE5hbWVzKTsKLSAgICB9CisgICAgcHVibGljIFN0cmluZ1tdIGdldERuc1Byb3BOYW1lcygpOwogCiAgICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBJUCBhZGRyZXNzZXMgb2YgdGhlIEROUyBzZXJ2ZXJzIGF2YWlsYWJsZSBmb3IgdGhpcwotICAgICAqIG5ldHdvcmsgaW50ZXJmYWNlLgotICAgICAqIEBwYXJhbSBwcm9wZXJ0eU5hbWVzIHRoZSBuYW1lcyBvZiB0aGUgc3lzdGVtIHByb3BlcnRpZXMgd2hvc2UgdmFsdWVzCi0gICAgICogZ2l2ZSB0aGUgSVAgYWRkcmVzc2VzLiBQcm9wZXJ0aWVzIHdpdGggbm8gdmFsdWVzIGFyZSBza2lwcGVkLgotICAgICAqIEByZXR1cm4gYW4gYXJyYXkgb2Yge0Bjb2RlIFN0cmluZ31zIGNvbnRhaW5pbmcgdGhlIElQIGFkZHJlc3NlcwotICAgICAqIG9mIHRoZSBETlMgc2VydmVycywgaW4gZG90LW5vdGF0aW9uLiBUaGlzIG1heSBoYXZlIGZld2VyCi0gICAgICogbm9uLW51bGwgZW50cmllcyB0aGFuIHRoZSBsaXN0IG9mIG5hbWVzIHBhc3NlZCBpbiwgc2luY2UKLSAgICAgKiBzb21lIG9mIHRoZSBwYXNzZWQtaW4gbmFtZXMgbWF5IGhhdmUgZW1wdHkgdmFsdWVzLgorICAgICAqIEZldGNoIGludGVyZmFjZSBuYW1lIG9mIHRoZSBpbnRlcmZhY2UKICAgICAgKi8KLSAgICBzdGF0aWMgcHJvdGVjdGVkIFN0cmluZ1tdIGdldE5hbWVTZXJ2ZXJMaXN0KFN0cmluZ1tdIHByb3BlcnR5TmFtZXMpIHsKLSAgICAgICAgU3RyaW5nW10gZG5zQWRkcmVzc2VzID0gbmV3IFN0cmluZ1twcm9wZXJ0eU5hbWVzLmxlbmd0aF07Ci0gICAgICAgIGludCBpLCBqOwotCi0gICAgICAgIGZvciAoaSA9IDAsIGogPSAwOyBpIDwgcHJvcGVydHlOYW1lcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gU3lzdGVtUHJvcGVydGllcy5nZXQocHJvcGVydHlOYW1lc1tpXSk7Ci0gICAgICAgICAgICAvLyBUaGUgR1NNIGxheWVyIHNvbWV0aW1lcyBzZXRzIGEgYm9ndXMgRE5TIHNlcnZlciBhZGRyZXNzIG9mCi0gICAgICAgICAgICAvLyAwLjAuMC4wCi0gICAgICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KHZhbHVlKSAmJiAhVGV4dFV0aWxzLmVxdWFscyh2YWx1ZSwgIjAuMC4wLjAiKSkgewotICAgICAgICAgICAgICAgIGRuc0FkZHJlc3Nlc1tqKytdID0gdmFsdWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGRuc0FkZHJlc3NlczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRQcml2YXRlRG5zUm91dGVzKCkgewotICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJhZGRQcml2YXRlRG5zUm91dGVzIGZvciAiICsgdGhpcyArCi0gICAgICAgICAgICAgICAgICAgICIoIiArIG1JbnRlcmZhY2VOYW1lICsgIikgLSBtUHJpdmF0ZURuc1JvdXRlU2V0ID0gIittUHJpdmF0ZURuc1JvdXRlU2V0KTsKLSAgICAgICAgfQotICAgICAgICBpZiAobUludGVyZmFjZU5hbWUgIT0gbnVsbCAmJiAhbVByaXZhdGVEbnNSb3V0ZVNldCkgewotICAgICAgICAgICAgZm9yIChTdHJpbmcgYWRkclN0cmluZyA6IGdldE5hbWVTZXJ2ZXJzKCkpIHsKLSAgICAgICAgICAgICAgICBpbnQgYWRkciA9IE5ldHdvcmtVdGlscy5sb29rdXBIb3N0KGFkZHJTdHJpbmcpOwotICAgICAgICAgICAgICAgIGlmIChhZGRyICE9IC0xICYmIGFkZHIgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsICIgIGFkZGluZyAiK2FkZHJTdHJpbmcrIiAoIithZGRyKyIpIik7Ci0gICAgICAgICAgICAgICAgICAgIE5ldHdvcmtVdGlscy5hZGRIb3N0Um91dGUobUludGVyZmFjZU5hbWUsIGFkZHIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1Qcml2YXRlRG5zUm91dGVTZXQgPSB0cnVlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlUHJpdmF0ZURuc1JvdXRlcygpIHsKLSAgICAgICAgLy8gVE9ETyAtIHdlIHNob3VsZCBkbyB0aGlzIGV4cGxpY2l0bHkgYnV0IHRoZSBOZXRVdGlscyBhcGkgZG9lc250Ci0gICAgICAgIC8vIHN1cHBvcnQgdGhpcyB5ZXQgLSBtdXN0IHJlbW92ZSBhbGwuICBObyB3b3JzZSB0aGFuIGJlZm9yZQotICAgICAgICBpZiAobUludGVyZmFjZU5hbWUgIT0gbnVsbCAmJiBtUHJpdmF0ZURuc1JvdXRlU2V0KSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAicmVtb3ZlUHJpdmF0ZURuc1JvdXRlcyBmb3IgIiArIG1OZXR3b3JrSW5mby5nZXRUeXBlTmFtZSgpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICIgKCIgKyBtSW50ZXJmYWNlTmFtZSArICIpIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBOZXR3b3JrVXRpbHMucmVtb3ZlSG9zdFJvdXRlcyhtSW50ZXJmYWNlTmFtZSk7Ci0gICAgICAgICAgICBtUHJpdmF0ZURuc1JvdXRlU2V0ID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGREZWZhdWx0Um91dGUoKSB7Ci0gICAgICAgIGlmICgobUludGVyZmFjZU5hbWUgIT0gbnVsbCkgJiYgKG1EZWZhdWx0R2F0ZXdheUFkZHIgIT0gMCkgJiYKLSAgICAgICAgICAgICAgICBtRGVmYXVsdFJvdXRlU2V0ID09IGZhbHNlKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiYWRkRGVmYXVsdFJvdXRlIGZvciAiICsgbU5ldHdvcmtJbmZvLmdldFR5cGVOYW1lKCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgIiAoIiArIG1JbnRlcmZhY2VOYW1lICsgIiksIEdhdGV3YXlBZGRyPSIgKyBtRGVmYXVsdEdhdGV3YXlBZGRyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIE5ldHdvcmtVdGlscy5zZXREZWZhdWx0Um91dGUobUludGVyZmFjZU5hbWUsIG1EZWZhdWx0R2F0ZXdheUFkZHIpOwotICAgICAgICAgICAgbURlZmF1bHRSb3V0ZVNldCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVEZWZhdWx0Um91dGUoKSB7Ci0gICAgICAgIGlmIChtSW50ZXJmYWNlTmFtZSAhPSBudWxsICYmIG1EZWZhdWx0Um91dGVTZXQgPT0gdHJ1ZSkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgInJlbW92ZURlZmF1bHRSb3V0ZSBmb3IgIiArIG1OZXR3b3JrSW5mby5nZXRUeXBlTmFtZSgpICsgIiAoIiArCi0gICAgICAgICAgICAgICAgICAgICAgICBtSW50ZXJmYWNlTmFtZSArICIpIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBOZXR3b3JrVXRpbHMucmVtb3ZlRGVmYXVsdFJvdXRlKG1JbnRlcmZhY2VOYW1lKTsKLSAgICAgICAgICAgIG1EZWZhdWx0Um91dGVTZXQgPSBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KKyAgICBwdWJsaWMgU3RyaW5nIGdldEludGVyZmFjZU5hbWUoKTsKIAogICAgIC8qKgotICAgICAqIFJlYWRzIHRoZSBuZXR3b3JrIHNwZWNpZmljIFRDUCBidWZmZXIgc2l6ZXMgZnJvbSBTeXN0ZW1Qcm9wZXJ0aWVzCi0gICAgICogbmV0LnRjcC5idWZmZXJzaXplLltkZWZhdWx0fHdpZml8dW10c3xlZGdlfGdwcnNdIGFuZCBzZXQgdGhlbSBmb3Igc3lzdGVtCi0gICAgICogd2lkZSB1c2UKKyAgICAgKiBDaGVjayBpZiBwcml2YXRlIEROUyByb3V0ZSBpcyBzZXQgZm9yIHRoZSBuZXR3b3JrCiAgICAgICovCi0gICBwdWJsaWMgdm9pZCB1cGRhdGVOZXR3b3JrU2V0dGluZ3MoKSB7Ci0gICAgICAgIFN0cmluZyBrZXkgPSBnZXRUY3BCdWZmZXJTaXplc1Byb3BOYW1lKCk7Ci0gICAgICAgIFN0cmluZyBidWZmZXJTaXplcyA9IFN5c3RlbVByb3BlcnRpZXMuZ2V0KGtleSk7Ci0KLSAgICAgICAgaWYgKGJ1ZmZlclNpemVzLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgIExvZy5lKFRBRywga2V5ICsgIiBub3QgZm91bmQgaW4gc3lzdGVtIHByb3BlcnRpZXMuIFVzaW5nIGRlZmF1bHRzIik7Ci0KLSAgICAgICAgICAgIC8vIFNldHRpbmcgdG8gZGVmYXVsdCB2YWx1ZXMgc28gd2Ugd29uJ3QgYmUgc3R1Y2sgdG8gcHJldmlvdXMgdmFsdWVzCi0gICAgICAgICAgICBrZXkgPSAibmV0LnRjcC5idWZmZXJzaXplLmRlZmF1bHQiOwotICAgICAgICAgICAgYnVmZmVyU2l6ZXMgPSBTeXN0ZW1Qcm9wZXJ0aWVzLmdldChrZXkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gU2V0IHZhbHVlcyBpbiBrZXJuZWwKLSAgICAgICAgaWYgKGJ1ZmZlclNpemVzLmxlbmd0aCgpICE9IDApIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cudihUQUcsICJTZXR0aW5nIFRDUCB2YWx1ZXM6IFsiICsgYnVmZmVyU2l6ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIl0gd2hpY2ggY29tZXMgZnJvbSBbIiArIGtleSArICJdIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXRCdWZmZXJTaXplKGJ1ZmZlclNpemVzKTsKLSAgICAgICAgfQotICAgIH0KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1ByaXZhdGVEbnNSb3V0ZVNldCgpOwogCiAgICAgLyoqCi0gICAgICogUmVsZWFzZSB0aGUgd2FrZWxvY2ssIGlmIGFueSwgdGhhdCBtYXkgYmUgaGVsZCB3aGlsZSBoYW5kbGluZyBhCi0gICAgICogZGlzY29ubmVjdCBvcGVyYXRpb24uCisgICAgICogU2V0IGEgZmxhZyBpbmRpY2F0aW5nIHByaXZhdGUgRE5TIHJvdXRlIGlzIHNldAogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlbGVhc2VXYWtlTG9jaygpIHsKLSAgICB9CisgICAgcHVibGljIHZvaWQgcHJpdmF0ZURuc1JvdXRlU2V0KGJvb2xlYW4gZW5hYmxlZCk7CiAKICAgICAvKioKLSAgICAgKiBXcml0ZXMgVENQIGJ1ZmZlciBzaXplcyB0byAvc3lzL2tlcm5lbC9pcHY0L3RjcF9bci93XW1lbV9bbWluL2RlZi9tYXhdCi0gICAgICogd2hpY2ggbWFwcyB0byAvcHJvYy9zeXMvbmV0L2lwdjQvdGNwX3JtZW0gYW5kIHRjcHdtZW0KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gYnVmZmVyU2l6ZXMgaW4gdGhlIGZvcm1hdCBvZiAicmVhZE1pbiwgcmVhZEluaXRpYWwsIHJlYWRNYXgsCi0gICAgICogICAgICAgIHdyaXRlTWluLCB3cml0ZUluaXRpYWwsIHdyaXRlTWF4IgorICAgICAqIEZldGNoIGRlZmF1bHQgZ2F0ZXdheSBhZGRyZXNzIGZvciB0aGUgbmV0d29yawogICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzZXRCdWZmZXJTaXplKFN0cmluZyBidWZmZXJTaXplcykgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgU3RyaW5nW10gdmFsdWVzID0gYnVmZmVyU2l6ZXMuc3BsaXQoIiwiKTsKLQotICAgICAgICAgICAgaWYgKHZhbHVlcy5sZW5ndGggPT0gNikgewotICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcHJlZml4ID0gIi9zeXMva2VybmVsL2lwdjQvdGNwXyI7Ci0gICAgICAgICAgICAgICAgc3RyaW5nVG9GaWxlKHByZWZpeCArICJybWVtX21pbiIsIHZhbHVlc1swXSk7Ci0gICAgICAgICAgICAgICAgc3RyaW5nVG9GaWxlKHByZWZpeCArICJybWVtX2RlZiIsIHZhbHVlc1sxXSk7Ci0gICAgICAgICAgICAgICAgc3RyaW5nVG9GaWxlKHByZWZpeCArICJybWVtX21heCIsIHZhbHVlc1syXSk7Ci0gICAgICAgICAgICAgICAgc3RyaW5nVG9GaWxlKHByZWZpeCArICJ3bWVtX21pbiIsIHZhbHVlc1szXSk7Ci0gICAgICAgICAgICAgICAgc3RyaW5nVG9GaWxlKHByZWZpeCArICJ3bWVtX2RlZiIsIHZhbHVlc1s0XSk7Ci0gICAgICAgICAgICAgICAgc3RyaW5nVG9GaWxlKHByZWZpeCArICJ3bWVtX21heCIsIHZhbHVlc1s1XSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkludmFsaWQgYnVmZmVyc2l6ZSBzdHJpbmc6ICIgKyBidWZmZXJTaXplcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExvZy5lKFRBRywgIkNhbid0IHNldCB0Y3AgYnVmZmVyIHNpemVzOiIgKyBlKTsKLSAgICAgICAgfQotICAgIH0KKyAgICBwdWJsaWMgaW50IGdldERlZmF1bHRHYXRld2F5QWRkcigpOwogCiAgICAgLyoqCi0gICAgICogV3JpdGVzIHN0cmluZyB0byBmaWxlLiBCYXNpY2FsbHkgc2FtZSBhcyAiZWNobyAtbiAkc3RyaW5nID4gJGZpbGVuYW1lIgotICAgICAqIAotICAgICAqIEBwYXJhbSBmaWxlbmFtZQotICAgICAqIEBwYXJhbSBzdHJpbmcKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogQ2hlY2sgaWYgZGVmYXVsdCByb3V0ZSBpcyBzZXQKICAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc3RyaW5nVG9GaWxlKFN0cmluZyBmaWxlbmFtZSwgU3RyaW5nIHN0cmluZykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgRmlsZVdyaXRlciBvdXQgPSBuZXcgRmlsZVdyaXRlcihmaWxlbmFtZSk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBvdXQud3JpdGUoc3RyaW5nKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIG91dC5jbG9zZSgpOwotICAgICAgICB9Ci0gICAgfQorICAgIHB1YmxpYyBib29sZWFuIGlzRGVmYXVsdFJvdXRlU2V0KCk7CiAKICAgICAvKioKLSAgICAgKiBSZWNvcmQgdGhlIGRldGFpbGVkIHN0YXRlIG9mIGEgbmV0d29yaywgYW5kIGlmIGl0IGlzIGEKLSAgICAgKiBjaGFuZ2UgZnJvbSB0aGUgcHJldmlvdXMgc3RhdGUsIHNlbmQgYSBub3RpZmljYXRpb24gdG8KLSAgICAgKiBhbnkgbGlzdGVuZXJzLgotICAgICAqIEBwYXJhbSBzdGF0ZSB0aGUgbmV3IEB7Y29kZSBEZXRhaWxlZFN0YXRlfQorICAgICAqIFNldCBhIGZsYWcgaW5kaWNhdGluZyBkZWZhdWx0IHJvdXRlIGlzIHNldCBmb3IgdGhlIG5ldHdvcmsKICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXREZXRhaWxlZFN0YXRlKE5ldHdvcmtJbmZvLkRldGFpbGVkU3RhdGUgc3RhdGUpIHsKLSAgICAgICAgc2V0RGV0YWlsZWRTdGF0ZShzdGF0ZSwgbnVsbCwgbnVsbCk7Ci0gICAgfQorICAgIHB1YmxpYyB2b2lkIGRlZmF1bHRSb3V0ZVNldChib29sZWFuIGVuYWJsZWQpOwogCiAgICAgLyoqCi0gICAgICogUmVjb3JkIHRoZSBkZXRhaWxlZCBzdGF0ZSBvZiBhIG5ldHdvcmssIGFuZCBpZiBpdCBpcyBhCi0gICAgICogY2hhbmdlIGZyb20gdGhlIHByZXZpb3VzIHN0YXRlLCBzZW5kIGEgbm90aWZpY2F0aW9uIHRvCi0gICAgICogYW55IGxpc3RlbmVycy4KLSAgICAgKiBAcGFyYW0gc3RhdGUgdGhlIG5ldyBAe2NvZGUgRGV0YWlsZWRTdGF0ZX0KLSAgICAgKiBAcGFyYW0gcmVhc29uIGEge0Bjb2RlIFN0cmluZ30gaW5kaWNhdGluZyBhIHJlYXNvbiBmb3IgdGhlIHN0YXRlIGNoYW5nZSwKLSAgICAgKiBpZiBvbmUgd2FzIHN1cHBsaWVkLiBNYXkgYmUge0Bjb2RlIG51bGx9LgotICAgICAqIEBwYXJhbSBleHRyYUluZm8gb3B0aW9uYWwge0Bjb2RlIFN0cmluZ30gcHJvdmlkaW5nIGV4dHJhIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzdGF0ZSBjaGFuZ2UKKyAgICAgKiBJbmRpY2F0ZSB0ZWFyIGRvd24gcmVxdWVzdGVkIGZyb20gY29ubmVjdGl2aXR5CiAgICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RGV0YWlsZWRTdGF0ZShOZXR3b3JrSW5mby5EZXRhaWxlZFN0YXRlIHN0YXRlLCBTdHJpbmcgcmVhc29uLCBTdHJpbmcgZXh0cmFJbmZvKSB7Ci0gICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgInNldERldGFpbGVkIHN0YXRlLCBvbGQgPSIrbU5ldHdvcmtJbmZvLmdldERldGFpbGVkU3RhdGUoKSsiIGFuZCBuZXcgc3RhdGU9IitzdGF0ZSk7Ci0gICAgICAgIGlmIChzdGF0ZSAhPSBtTmV0d29ya0luZm8uZ2V0RGV0YWlsZWRTdGF0ZSgpKSB7Ci0gICAgICAgICAgICBib29sZWFuIHdhc0Nvbm5lY3RpbmcgPSAobU5ldHdvcmtJbmZvLmdldFN0YXRlKCkgPT0gTmV0d29ya0luZm8uU3RhdGUuQ09OTkVDVElORyk7Ci0gICAgICAgICAgICBTdHJpbmcgbGFzdFJlYXNvbiA9IG1OZXR3b3JrSW5mby5nZXRSZWFzb24oKTsKLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiBJZiBhIHJlYXNvbiB3YXMgc3VwcGxpZWQgd2hlbiB0aGUgQ09OTkVDVElORyBzdGF0ZSB3YXMgZW50ZXJlZCwgYW5kIG5vCi0gICAgICAgICAgICAgKiByZWFzb24gd2FzIHN1cHBsaWVkIGZvciBlbnRlcmluZyB0aGUgQ09OTkVDVEVEIHN0YXRlLCB0aGVuIHJldGFpbiB0aGUKLSAgICAgICAgICAgICAqIHJlYXNvbiB0aGF0IHdhcyBzdXBwbGllZCB3aGVuIGdvaW5nIHRvIENPTk5FQ1RJTkcuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGlmICh3YXNDb25uZWN0aW5nICYmIHN0YXRlID09IE5ldHdvcmtJbmZvLkRldGFpbGVkU3RhdGUuQ09OTkVDVEVEICYmIHJlYXNvbiA9PSBudWxsCi0gICAgICAgICAgICAgICAgICAgICYmIGxhc3RSZWFzb24gIT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZWFzb24gPSBsYXN0UmVhc29uOwotICAgICAgICAgICAgbU5ldHdvcmtJbmZvLnNldERldGFpbGVkU3RhdGUoc3RhdGUsIHJlYXNvbiwgZXh0cmFJbmZvKTsKLSAgICAgICAgICAgIE1lc3NhZ2UgbXNnID0gbVRhcmdldC5vYnRhaW5NZXNzYWdlKEVWRU5UX1NUQVRFX0NIQU5HRUQsIG1OZXR3b3JrSW5mbyk7Ci0gICAgICAgICAgICBtc2cuc2VuZFRvVGFyZ2V0KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXREZXRhaWxlZFN0YXRlSW50ZXJuYWwoTmV0d29ya0luZm8uRGV0YWlsZWRTdGF0ZSBzdGF0ZSkgewotICAgICAgICBtTmV0d29ya0luZm8uc2V0RGV0YWlsZWRTdGF0ZShzdGF0ZSwgbnVsbCwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VGVhcmRvd25SZXF1ZXN0ZWQoYm9vbGVhbiBpc1JlcXVlc3RlZCkgewotICAgICAgICBtVGVhcmRvd25SZXF1ZXN0ZWQgPSBpc1JlcXVlc3RlZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1RlYXJkb3duUmVxdWVzdGVkKCkgewotICAgICAgICByZXR1cm4gbVRlYXJkb3duUmVxdWVzdGVkOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBTZW5kIGEgIG5vdGlmaWNhdGlvbiB0aGF0IHRoZSByZXN1bHRzIG9mIGEgc2NhbiBmb3IgbmV0d29yayBhY2Nlc3MKLSAgICAgKiBwb2ludHMgaGFzIGNvbXBsZXRlZCwgYW5kIHJlc3VsdHMgYXJlIGF2YWlsYWJsZS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZW5kU2NhblJlc3VsdHNBdmFpbGFibGUoKSB7Ci0gICAgICAgIE1lc3NhZ2UgbXNnID0gbVRhcmdldC5vYnRhaW5NZXNzYWdlKEVWRU5UX1NDQU5fUkVTVUxUU19BVkFJTEFCTEUsIG1OZXR3b3JrSW5mbyk7Ci0gICAgICAgIG1zZy5zZW5kVG9UYXJnZXQoKTsKLSAgICB9CisgICAgcHVibGljIHZvaWQgc2V0VGVhcmRvd25SZXF1ZXN0ZWQoYm9vbGVhbiBpc1JlcXVlc3RlZCk7CiAKICAgICAvKioKLSAgICAgKiBSZWNvcmQgdGhlIHJvYW1pbmcgc3RhdHVzIG9mIHRoZSBkZXZpY2UsIGFuZCBpZiBpdCBpcyBhIGNoYW5nZSBmcm9tIHRoZSBwcmV2aW91cwotICAgICAqIHN0YXR1cywgc2VuZCBhIG5vdGlmaWNhdGlvbiB0byBhbnkgbGlzdGVuZXJzLgotICAgICAqIEBwYXJhbSBpc1JvYW1pbmcge0Bjb2RlIHRydWV9IGlmIHRoZSBkZXZpY2UgaXMgbm93IHJvYW1pbmcsIHtAY29kZSBmYWxzZX0KLSAgICAgKiBpZiBpdCBpcyBubyBsb25nZXIgcm9hbWluZy4KKyAgICAgKiBDaGVjayBpZiB0ZWFyIGRvd24gd2FzIHJlcXVlc3RlZAogICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHNldFJvYW1pbmdTdGF0dXMoYm9vbGVhbiBpc1JvYW1pbmcpIHsKLSAgICAgICAgaWYgKGlzUm9hbWluZyAhPSBtTmV0d29ya0luZm8uaXNSb2FtaW5nKCkpIHsKLSAgICAgICAgICAgIG1OZXR3b3JrSW5mby5zZXRSb2FtaW5nKGlzUm9hbWluZyk7Ci0gICAgICAgICAgICBNZXNzYWdlIG1zZyA9IG1UYXJnZXQub2J0YWluTWVzc2FnZShFVkVOVF9ST0FNSU5HX0NIQU5HRUQsIG1OZXR3b3JrSW5mbyk7Ci0gICAgICAgICAgICBtc2cuc2VuZFRvVGFyZ2V0KCk7Ci0gICAgICAgIH0KLSAgICB9CisgICAgcHVibGljIGJvb2xlYW4gaXNUZWFyZG93blJlcXVlc3RlZCgpOwogCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0U3VidHlwZShpbnQgc3VidHlwZSwgU3RyaW5nIHN1YnR5cGVOYW1lKSB7Ci0gICAgICAgIGlmIChtTmV0d29ya0luZm8uaXNDb25uZWN0ZWQoKSkgewotICAgICAgICAgICAgaW50IG9sZFN1YnR5cGUgPSBtTmV0d29ya0luZm8uZ2V0U3VidHlwZSgpOwotICAgICAgICAgICAgaWYgKHN1YnR5cGUgIT0gb2xkU3VidHlwZSkgewotICAgICAgICAgICAgICAgIG1OZXR3b3JrSW5mby5zZXRTdWJ0eXBlKHN1YnR5cGUsIHN1YnR5cGVOYW1lKTsKLSAgICAgICAgICAgICAgICBNZXNzYWdlIG1zZyA9IG1UYXJnZXQub2J0YWluTWVzc2FnZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIEVWRU5UX05FVFdPUktfU1VCVFlQRV9DSEFOR0VELCBvbGRTdWJ0eXBlLCAwLCBtTmV0d29ya0luZm8pOwotICAgICAgICAgICAgICAgIG1zZy5zZW5kVG9UYXJnZXQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHN0YXJ0TW9uaXRvcmluZygpOworICAgIHB1YmxpYyB2b2lkIHN0YXJ0TW9uaXRvcmluZygpOwogCiAgICAgLyoqCiAgICAgICogRGlzYWJsZSBjb25uZWN0aXZpdHkgdG8gYSBuZXR3b3JrCiAgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgYSB0ZWFyZG93biBvY2N1cnJlZCwge0Bjb2RlIGZhbHNlfSBpZiB0aGUKICAgICAgKiB0ZWFyZG93biBkaWQgbm90IG9jY3VyLgogICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIHRlYXJkb3duKCk7CisgICAgcHVibGljIGJvb2xlYW4gdGVhcmRvd24oKTsKIAogICAgIC8qKgogICAgICAqIFJlZW5hYmxlIGNvbm5lY3Rpdml0eSB0byBhIG5ldHdvcmsgYWZ0ZXIgYSB7QGxpbmsgI3RlYXJkb3duKCl9LgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHdlJ3JlIGNvbm5lY3RlZCBvciBleHBlY3QgdG8gYmUgY29ubmVjdGVkCiAgICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gcmVjb25uZWN0KCk7CisgICAgcHVibGljIGJvb2xlYW4gcmVjb25uZWN0KCk7CiAKICAgICAvKioKICAgICAgKiBUdXJuIHRoZSB3aXJlbGVzcyByYWRpbyBvZmYgZm9yIGEgbmV0d29yay4KICAgICAgKiBAcGFyYW0gdHVybk9uIHtAY29kZSB0cnVlfSB0byB0dXJuIHRoZSByYWRpbyBvbiwge0Bjb2RlIGZhbHNlfQogICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIHNldFJhZGlvKGJvb2xlYW4gdHVybk9uKTsKKyAgICBwdWJsaWMgYm9vbGVhbiBzZXRSYWRpbyhib29sZWFuIHR1cm5Pbik7CiAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIGFuIGluZGljYXRpb24gb2Ygd2hldGhlciB0aGlzIG5ldHdvcmsgaXMgYXZhaWxhYmxlIGZvcgogICAgICAqIGNvbm5lY3Rpb25zLiBBIHZhbHVlIG9mIHtAY29kZSBmYWxzZX0gbWVhbnMgdGhhdCBzb21lIHF1YXNpLXBlcm1hbmVudAogICAgICAqIGNvbmRpdGlvbiBwcmV2ZW50cyBjb25uZWN0aXZpdHkgdG8gdGhpcyBuZXR3b3JrLgogICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzQXZhaWxhYmxlKCk7CisgICAgcHVibGljIGJvb2xlYW4gaXNBdmFpbGFibGUoKTsKIAogICAgIC8qKgogICAgICAqIFRlbGxzIHRoZSB1bmRlcmx5aW5nIG5ldHdvcmtpbmcgc3lzdGVtIHRoYXQgdGhlIGNhbGxlciB3YW50cyB0bwpAQCAtMzc2LDcgKzEzNiw3IEBACiAgICAgICogaW1wbGVtZW50YXRpb24rZmVhdHVyZSBjb21iaW5hdGlvbiwgZXhjZXB0IHRoYXQgdGhlIHZhbHVlIHtAY29kZSAtMX0KICAgICAgKiBhbHdheXMgaW5kaWNhdGVzIGZhaWx1cmUuCiAgICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IGludCBzdGFydFVzaW5nTmV0d29ya0ZlYXR1cmUoU3RyaW5nIGZlYXR1cmUsIGludCBjYWxsaW5nUGlkLCBpbnQgY2FsbGluZ1VpZCk7CisgICAgcHVibGljIGludCBzdGFydFVzaW5nTmV0d29ya0ZlYXR1cmUoU3RyaW5nIGZlYXR1cmUsIGludCBjYWxsaW5nUGlkLCBpbnQgY2FsbGluZ1VpZCk7CiAKICAgICAvKioKICAgICAgKiBUZWxscyB0aGUgdW5kZXJseWluZyBuZXR3b3JraW5nIHN5c3RlbSB0aGF0IHRoZSBjYWxsZXIgaXMgZmluaXNoZWQKQEAgLTM5MCwyMyArMTUwLDEyIEBACiAgICAgICogaW1wbGVtZW50YXRpb24rZmVhdHVyZSBjb21iaW5hdGlvbiwgZXhjZXB0IHRoYXQgdGhlIHZhbHVlIHtAY29kZSAtMX0KICAgICAgKiBhbHdheXMgaW5kaWNhdGVzIGZhaWx1cmUuCiAgICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IGludCBzdG9wVXNpbmdOZXR3b3JrRmVhdHVyZShTdHJpbmcgZmVhdHVyZSwgaW50IGNhbGxpbmdQaWQsIGludCBjYWxsaW5nVWlkKTsKLQotICAgIC8qKgotICAgICAqIEVuc3VyZSB0aGF0IGEgbmV0d29yayByb3V0ZSBleGlzdHMgdG8gZGVsaXZlciB0cmFmZmljIHRvIHRoZSBzcGVjaWZpZWQKLSAgICAgKiBob3N0IHZpYSB0aGlzIG5ldHdvcmsgaW50ZXJmYWNlLgotICAgICAqIEBwYXJhbSBob3N0QWRkcmVzcyB0aGUgSVAgYWRkcmVzcyBvZiB0aGUgaG9zdCB0byB3aGljaCB0aGUgcm91dGUgaXMgZGVzaXJlZAotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IG9uIHN1Y2Nlc3MsIHtAY29kZSBmYWxzZX0gb24gZmFpbHVyZQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHJlcXVlc3RSb3V0ZVRvSG9zdChpbnQgaG9zdEFkZHJlc3MpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KKyAgICBwdWJsaWMgaW50IHN0b3BVc2luZ05ldHdvcmtGZWF0dXJlKFN0cmluZyBmZWF0dXJlLCBpbnQgY2FsbGluZ1BpZCwgaW50IGNhbGxpbmdVaWQpOwogCiAgICAgLyoqCiAgICAgICogSW50ZXJwcmV0cyBzY2FuIHJlc3VsdHMuIFRoaXMgd2lsbCBiZSBjYWxsZWQgYXQgYSBzYWZlIHRpbWUgZm9yCiAgICAgICogcHJvY2Vzc2luZywgYW5kIGZyb20gYSBzYWZlIHRocmVhZC4KICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBpbnRlcnByZXRTY2FuUmVzdWx0c0F2YWlsYWJsZSgpIHsKLSAgICB9CisgICAgcHVibGljIHZvaWQgaW50ZXJwcmV0U2NhblJlc3VsdHNBdmFpbGFibGUoKTsKIAogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvbmV0L2h0dHAvQW5kcm9pZEh0dHBDbGllbnQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL25ldC9odHRwL0FuZHJvaWRIdHRwQ2xpZW50LmphdmEKaW5kZXggZTA3ZWU1OS4uOTE1ZTM0MiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvbmV0L2h0dHAvQW5kcm9pZEh0dHBDbGllbnQuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9uZXQvaHR0cC9BbmRyb2lkSHR0cENsaWVudC5qYXZhCkBAIC02MSw2ICs2MSw3IEBACiBpbXBvcnQgYW5kcm9pZC5uZXQuU1NMQ2VydGlmaWNhdGVTb2NrZXRGYWN0b3J5OwogaW1wb3J0IGFuZHJvaWQubmV0LlNTTFNlc3Npb25DYWNoZTsKIGltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuQmFzZTY0OwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiAKIC8qKgpAQCAtODEsNiArODIsMTEgQEAKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiQW5kcm9pZEh0dHBDbGllbnQiOwogCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gdGV4dENvbnRlbnRUeXBlcyA9IG5ldyBTdHJpbmdbXSB7CisgICAgICAgICAgICAidGV4dC8iLAorICAgICAgICAgICAgImFwcGxpY2F0aW9uL3htbCIsCisgICAgICAgICAgICAiYXBwbGljYXRpb24vanNvbiIKKyAgICB9OwogCiAgICAgLyoqIEludGVyY2VwdG9yIHRocm93cyBhbiBleGNlcHRpb24gaWYgdGhlIGV4ZWN1dGluZyB0aHJlYWQgaXMgYmxvY2tlZCAqLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEh0dHBSZXF1ZXN0SW50ZXJjZXB0b3Igc1RocmVhZENoZWNrSW50ZXJjZXB0b3IgPQpAQCAtMzU4LDcgKzM2NCw3IEBACiAgICAgICAgIH0KICAgICAgICAgaWYgKGxldmVsIDwgTG9nLlZFUkJPU0UgfHwgbGV2ZWwgPiBMb2cuQVNTRVJUKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJMZXZlbCBpcyBvdXQgb2YgcmFuZ2UgWyIKLSAgICAgICAgICAgICAgICArIExvZy5WRVJCT1NFICsgIi4uIiArIExvZy5BU1NFUlQgKyAiXSIpOyAgICAKKyAgICAgICAgICAgICAgICArIExvZy5WRVJCT1NFICsgIi4uIiArIExvZy5BU1NFUlQgKyAiXSIpOwogICAgICAgICB9CiAKICAgICAgICAgY3VybENvbmZpZ3VyYXRpb24gPSBuZXcgTG9nZ2luZ0NvbmZpZ3VyYXRpb24obmFtZSwgbGV2ZWwpOwpAQCAtNDMxLDEyICs0MzcsMTcgQEAKICAgICAgICAgICAgICAgICBpZiAoZW50aXR5LmdldENvbnRlbnRMZW5ndGgoKSA8IDEwMjQpIHsKICAgICAgICAgICAgICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIHN0cmVhbSA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKICAgICAgICAgICAgICAgICAgICAgZW50aXR5LndyaXRlVG8oc3RyZWFtKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGVudGl0eVN0cmluZyA9IHN0cmVhbS50b1N0cmluZygpOwogCi0gICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IENoZWNrIHRoZSBjb250ZW50IHR5cGUsIHRvby4KLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIiAtLWRhdGEtYXNjaWkgXCIiKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoZW50aXR5U3RyaW5nKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoIlwiIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChpc0JpbmFyeUNvbnRlbnQocmVxdWVzdCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBiYXNlNjQgPSBCYXNlNjQuZW5jb2RlVG9TdHJpbmcoc3RyZWFtLnRvQnl0ZUFycmF5KCksIEJhc2U2NC5OT19XUkFQKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuaW5zZXJ0KDAsICJlY2hvICciICsgYmFzZTY0ICsgIicgfCBiYXNlNjQgLWQgPiAvdG1wLyQkLmJpbjsgIik7CisgICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiIC0tZGF0YS1iaW5hcnkgQC90bXAvJCQuYmluIik7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZW50aXR5U3RyaW5nID0gc3RyZWFtLnRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiIC0tZGF0YS1hc2NpaSBcIiIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoZW50aXR5U3RyaW5nKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCJcIiIpOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIiBbVE9PIE1VQ0ggREFUQSBUTyBJTkNMVURFXSIpOwogICAgICAgICAgICAgICAgIH0KQEAgLTQ0Niw2ICs0NTcsMzAgQEAKICAgICAgICAgcmV0dXJuIGJ1aWxkZXIudG9TdHJpbmcoKTsKICAgICB9CiAKKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzQmluYXJ5Q29udGVudChIdHRwVXJpUmVxdWVzdCByZXF1ZXN0KSB7CisgICAgICAgIEhlYWRlcltdIGhlYWRlcnM7CisgICAgICAgIGhlYWRlcnMgPSByZXF1ZXN0LmdldEhlYWRlcnMoSGVhZGVycy5DT05URU5UX0VOQ09ESU5HKTsKKyAgICAgICAgaWYgKGhlYWRlcnMgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChIZWFkZXIgaGVhZGVyIDogaGVhZGVycykgeworICAgICAgICAgICAgICAgIGlmICgiZ3ppcCIuZXF1YWxzSWdub3JlQ2FzZShoZWFkZXIuZ2V0VmFsdWUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaGVhZGVycyA9IHJlcXVlc3QuZ2V0SGVhZGVycyhIZWFkZXJzLkNPTlRFTlRfVFlQRSk7CisgICAgICAgIGlmIChoZWFkZXJzICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZvciAoSGVhZGVyIGhlYWRlciA6IGhlYWRlcnMpIHsKKyAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyBjb250ZW50VHlwZSA6IHRleHRDb250ZW50VHlwZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGhlYWRlci5nZXRWYWx1ZSgpLnN0YXJ0c1dpdGgoY29udGVudFR5cGUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgZGF0ZSBvZiB0aGUgZ2l2ZW4gSFRUUCBkYXRlIHN0cmluZy4gVGhpcyBtZXRob2QgY2FuIGlkZW50aWZ5CiAgICAgICogYW5kIHBhcnNlIHRoZSBkYXRlIGZvcm1hdHMgZW1pdHRlZCBieSBjb21tb24gSFRUUCBzZXJ2ZXJzLCBzdWNoIGFzCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9uZXQvaHR0cC9DZXJ0aWZpY2F0ZUNoYWluVmFsaWRhdG9yLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9uZXQvaHR0cC9DZXJ0aWZpY2F0ZUNoYWluVmFsaWRhdG9yLmphdmEKaW5kZXggYzUyN2ZlNC4uYzM2YWQzOCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvbmV0L2h0dHAvQ2VydGlmaWNhdGVDaGFpblZhbGlkYXRvci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL25ldC9odHRwL0NlcnRpZmljYXRlQ2hhaW5WYWxpZGF0b3IuamF2YQpAQCAtODAsMTQgKzgwLDEwIEBACiAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBYNTA5Q2VydGlmaWNhdGVbXSBzZXJ2ZXJDZXJ0aWZpY2F0ZXMgPSBudWxsOwogCi0gICAgICAgIC8vIHN0YXJ0IGhhbmRzaGFrZSwgY2xvc2UgdGhlIHNvY2tldCBpZiB3ZSBmYWlsCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzc2xTb2NrZXQuc2V0VXNlQ2xpZW50TW9kZSh0cnVlKTsKLSAgICAgICAgICAgIHNzbFNvY2tldC5zdGFydEhhbmRzaGFrZSgpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBjbG9zZVNvY2tldFRocm93RXhjZXB0aW9uKAotICAgICAgICAgICAgICAgIHNzbFNvY2tldCwgZS5nZXRNZXNzYWdlKCksCi0gICAgICAgICAgICAgICAgImZhaWxlZCB0byBwZXJmb3JtIFNTTCBoYW5kc2hha2UiKTsKKyAgICAgICAgLy8gZ2V0IGEgdmFsaWQgU1NMU2Vzc2lvbiwgY2xvc2UgdGhlIHNvY2tldCBpZiB3ZSBmYWlsCisgICAgICAgIFNTTFNlc3Npb24gc3NsU2Vzc2lvbiA9IHNzbFNlc3Npb24gPSBzc2xTb2NrZXQuZ2V0U2Vzc2lvbigpOworICAgICAgICBpZiAoIXNzbFNlc3Npb24uaXNWYWxpZCgpKSB7CisgICAgICAgICAgICBjbG9zZVNvY2tldFRocm93RXhjZXB0aW9uKHNzbFNvY2tldCwgImZhaWxlZCB0byBwZXJmb3JtIFNTTCBoYW5kc2hha2UiKTsKICAgICAgICAgfQogCiAgICAgICAgIC8vIHJldHJpZXZlIHRoZSBjaGFpbiBvZiB0aGUgc2VydmVyIHBlZXIgY2VydGlmaWNhdGVzCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9vcy9Bc3luY1Rhc2suamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL29zL0FzeW5jVGFzay5qYXZhCmluZGV4IGQyODE0OGMuLjgzMmNlODQgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL29zL0FzeW5jVGFzay5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL29zL0FzeW5jVGFzay5qYXZhCkBAIC0xNiwxNiArMTYsMTYgQEAKIAogcGFja2FnZSBhbmRyb2lkLm9zOwogCi1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkJsb2NraW5nUXVldWU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ2FsbGFibGU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ2FuY2VsbGF0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5GdXR1cmVUYXNrOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkxpbmtlZEJsb2NraW5nUXVldWU7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkRmFjdG9yeTsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5DYWxsYWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5GdXR1cmVUYXNrOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3I7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZW91dEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5DYW5jZWxsYXRpb25FeGNlcHRpb247CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0ludGVnZXI7CiAKIC8qKgpAQCAtMzYsOCArMzYsOCBAQAogICogPHA+QW4gYXN5bmNocm9ub3VzIHRhc2sgaXMgZGVmaW5lZCBieSBhIGNvbXB1dGF0aW9uIHRoYXQgcnVucyBvbiBhIGJhY2tncm91bmQgdGhyZWFkIGFuZAogICogd2hvc2UgcmVzdWx0IGlzIHB1Ymxpc2hlZCBvbiB0aGUgVUkgdGhyZWFkLiBBbiBhc3luY2hyb25vdXMgdGFzayBpcyBkZWZpbmVkIGJ5IDMgZ2VuZXJpYwogICogdHlwZXMsIGNhbGxlZCA8Y29kZT5QYXJhbXM8L2NvZGU+LCA8Y29kZT5Qcm9ncmVzczwvY29kZT4gYW5kIDxjb2RlPlJlc3VsdDwvY29kZT4sCi0gKiBhbmQgNCBzdGVwcywgY2FsbGVkIDxjb2RlPmJlZ2luPC9jb2RlPiwgPGNvZGU+ZG9JbkJhY2tncm91bmQ8L2NvZGU+LAotICogPGNvZGU+cHJvY2Vzc1Byb2dyZXNzPC9jb2RlPiBhbmQgPGNvZGU+ZW5kPC9jb2RlPi48L3A+CisgKiBhbmQgNCBzdGVwcywgY2FsbGVkIDxjb2RlPm9uUHJlRXhlY3V0ZTwvY29kZT4sIDxjb2RlPmRvSW5CYWNrZ3JvdW5kPC9jb2RlPiwKKyAqIDxjb2RlPm9uUHJvZ3Jlc3NVcGRhdGU8L2NvZGU+IGFuZCA8Y29kZT5vblBvc3RFeGVjdXRlPC9jb2RlPi48L3A+CiAgKgogICogPGgyPlVzYWdlPC9oMj4KICAqIDxwPkFzeW5jVGFzayBtdXN0IGJlIHN1YmNsYXNzZWQgdG8gYmUgdXNlZC4gVGhlIHN1YmNsYXNzIHdpbGwgb3ZlcnJpZGUgYXQgbGVhc3QKQEAgLTE4Nyw2ICsxODcsMTcgQEAKICAgICAgICAgfTsKIAogICAgICAgICBtRnV0dXJlID0gbmV3IEZ1dHVyZVRhc2s8UmVzdWx0PihtV29ya2VyKSB7CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgc2V0KFJlc3VsdCB2KSB7CisgICAgICAgICAgICAgICAgc3VwZXIuc2V0KHYpOworICAgICAgICAgICAgICAgIGlmIChpc0NhbmNlbGxlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgbWVzc2FnZSA9IHNIYW5kbGVyLm9idGFpbk1lc3NhZ2UoTUVTU0FHRV9QT1NUX0NBTkNFTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQXN5bmNUYXNrUmVzdWx0PFJlc3VsdD4oQXN5bmNUYXNrLnRoaXMsIChSZXN1bHRbXSkgbnVsbCkpOworICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnNlbmRUb1RhcmdldCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBkb25lKCkgewogICAgICAgICAgICAgICAgIE1lc3NhZ2UgbWVzc2FnZTsKQEAgLTQwMiwxNCArNDEzLDE5IEBACiAgICAgICogc3RpbGwgcnVubmluZy4gRWFjaCBjYWxsIHRvIHRoaXMgbWV0aG9kIHdpbGwgdHJpZ2dlciB0aGUgZXhlY3V0aW9uIG9mCiAgICAgICoge0BsaW5rICNvblByb2dyZXNzVXBkYXRlfSBvbiB0aGUgVUkgdGhyZWFkLgogICAgICAqCisgICAgICoge0BsaW5rICNvblByb2dyZXNzVXBkYXRlfSB3aWxsIG5vdGUgYmUgY2FsbGVkIGlmIHRoZSB0YXNrIGhhcyBiZWVuCisgICAgICogY2FuY2VsZWQuCisgICAgICoKICAgICAgKiBAcGFyYW0gdmFsdWVzIFRoZSBwcm9ncmVzcyB2YWx1ZXMgdG8gdXBkYXRlIHRoZSBVSSB3aXRoLgogICAgICAqCiAgICAgICogQHNlZSAjb25Qcm9ncmVzc1VwZGF0ZQogICAgICAqIEBzZWUgI2RvSW5CYWNrZ3JvdW5kCiAgICAgICovCiAgICAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgcHVibGlzaFByb2dyZXNzKFByb2dyZXNzLi4uIHZhbHVlcykgewotICAgICAgICBzSGFuZGxlci5vYnRhaW5NZXNzYWdlKE1FU1NBR0VfUE9TVF9QUk9HUkVTUywKLSAgICAgICAgICAgICAgICBuZXcgQXN5bmNUYXNrUmVzdWx0PFByb2dyZXNzPih0aGlzLCB2YWx1ZXMpKS5zZW5kVG9UYXJnZXQoKTsKKyAgICAgICAgaWYgKCFpc0NhbmNlbGxlZCgpKSB7CisgICAgICAgICAgICBzSGFuZGxlci5vYnRhaW5NZXNzYWdlKE1FU1NBR0VfUE9TVF9QUk9HUkVTUywKKyAgICAgICAgICAgICAgICAgICAgbmV3IEFzeW5jVGFza1Jlc3VsdDxQcm9ncmVzcz4odGhpcywgdmFsdWVzKSkuc2VuZFRvVGFyZ2V0KCk7CisgICAgICAgIH0KICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgZmluaXNoKFJlc3VsdCByZXN1bHQpIHsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL29zL3N0b3JhZ2UvU3RvcmFnZUV2ZW50TGlzdGVuZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL29zL3N0b3JhZ2UvU3RvcmFnZUV2ZW50TGlzdGVuZXIuamF2YQppbmRleCA3Yjg4M2E3Li5kM2QzOWQ2ZCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvb3Mvc3RvcmFnZS9TdG9yYWdlRXZlbnRMaXN0ZW5lci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL29zL3N0b3JhZ2UvU3RvcmFnZUV2ZW50TGlzdGVuZXIuamF2YQpAQCAtMTgsNyArMTgsNiBAQAogCiAvKioKICAqIFVzZWQgZm9yIHJlY2VpdmluZyBub3RpZmljYXRpb25zIGZyb20gdGhlIFN0b3JhZ2VNYW5hZ2VyCi0gKiBAaGlkZQogICovCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgU3RvcmFnZUV2ZW50TGlzdGVuZXIgewogICAgIC8qKgpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvb3Mvc3RvcmFnZS9TdG9yYWdlTWFuYWdlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvb3Mvc3RvcmFnZS9TdG9yYWdlTWFuYWdlci5qYXZhCmluZGV4IGExMjYwM2MuLmI0OTk3OWMgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL29zL3N0b3JhZ2UvU3RvcmFnZU1hbmFnZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9vcy9zdG9yYWdlL1N0b3JhZ2VNYW5hZ2VyLmphdmEKQEAgLTQ1LDggKzQ1LDYgQEAKICAqIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCNnZXRTeXN0ZW1TZXJ2aWNlKGphdmEubGFuZy5TdHJpbmcpfSB3aXRoIGFuIGFyZ3VtZW50CiAgKiBvZiB7QGxpbmsgYW5kcm9pZC5jb250ZW50LkNvbnRleHQjU1RPUkFHRV9TRVJWSUNFfS4KICAqCi0gKiBAaGlkZQotICoKICAqLwogCiBwdWJsaWMgY2xhc3MgU3RvcmFnZU1hbmFnZXIKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL29zL3N0b3JhZ2UvU3RvcmFnZVJlc3VsdENvZGUuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL29zL3N0b3JhZ2UvU3RvcmFnZVJlc3VsdENvZGUuamF2YQppbmRleCAwNzVmNDdmLi4wN2Q5NWRmIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9vcy9zdG9yYWdlL1N0b3JhZ2VSZXN1bHRDb2RlLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvb3Mvc3RvcmFnZS9TdG9yYWdlUmVzdWx0Q29kZS5qYXZhCkBAIC0xOSw4ICsxOSw2IEBACiAvKioKICAqIENsYXNzIHRoYXQgcHJvdmlkZXMgYWNjZXNzIHRvIGNvbnN0YW50cyByZXR1cm5lZCBmcm9tIFN0b3JhZ2VNYW5hZ2VyCiAgKiBhbmQgbG93ZXIgbGV2ZWwgTW91bnRTZXJ2aWNlIEFQSXMuCi0gKgotICogQGhpZGUKICAqLwogcHVibGljIGNsYXNzIFN0b3JhZ2VSZXN1bHRDb2RlCiB7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vUmVjdXJyZW5jZVNldC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcGltL1JlY3VycmVuY2VTZXQuamF2YQppbmRleCA2MzUzMjNlLi4yODI0MTdkIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vUmVjdXJyZW5jZVNldC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3BpbS9SZWN1cnJlbmNlU2V0LmphdmEKQEAgLTE4MSw3ICsxODEsOSBAQAogICAgICAgICBib29sZWFuIGluVXRjID0gc3RhcnQucGFyc2UoZHRzdGFydCk7CiAgICAgICAgIGJvb2xlYW4gYWxsRGF5ID0gc3RhcnQuYWxsRGF5OwogCi0gICAgICAgIGlmIChpblV0YykgeworICAgICAgICAvLyBXZSBmb3JjZSBUaW1lWm9uZSB0byBVVEMgZm9yICJhbGwgZGF5IHJlY3VycmluZyBldmVudHMiIGFzIHRoZSBzZXJ2ZXIgaXMgc2VuZGluZyBubworICAgICAgICAvLyBUaW1lWm9uZSBpbiBEVFNUQVJUIGZvciB0aGVtCisgICAgICAgIGlmIChpblV0YyB8fCBhbGxEYXkpIHsKICAgICAgICAgICAgIHR6aWQgPSBUaW1lLlRJTUVaT05FX1VUQzsKICAgICAgICAgfQogICAgICAgICAgICAgICAgIApAQCAtMjA0LDEwICsyMDYsNyBAQAogICAgICAgICB9CiAgICAgICAgIAogICAgICAgICBpZiAoYWxsRGF5KSB7Ci0gICAgICAgIAkvLyBUT0RPOiBhbHNvIGNoYW5nZSB0emlkIHRvIGJlIFVUQz8gIHRoYXQgd291bGQgYmUgY29uc2lzdGVudCwgYnV0Ci0gICAgICAgIAkvLyB0aGF0IHdvdWxkIG5vdCByZWZsZWN0IHRoZSBvcmlnaW5hbCB0aW1lem9uZSB2YWx1ZSBiYWNrIHRvIHRoZQotICAgICAgICAJLy8gc2VydmVyLgotICAgICAgICAJc3RhcnQudGltZXpvbmUgPSBUaW1lLlRJTUVaT05FX1VUQzsKKyAgICAgICAgICAgIHN0YXJ0LnRpbWV6b25lID0gVGltZS5USU1FWk9ORV9VVEM7CiAgICAgICAgIH0KICAgICAgICAgbG9uZyBtaWxsaXMgPSBzdGFydC50b01pbGxpcyhmYWxzZSAvKiB1c2UgaXNEc3QgKi8pOwogICAgICAgICB2YWx1ZXMucHV0KENhbGVuZGFyLkV2ZW50cy5EVFNUQVJULCBtaWxsaXMpOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL0phcGFuZXNlVXRpbHMuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9KYXBhbmVzZVV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3NWMyOWUuLjAwMDAwMDAKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL0phcGFuZXNlVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLnBpbS52Y2FyZDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogVGV4dFV0aWxzIGVzcGVjaWFsbHkgZm9yIEphcGFuZXNlLgotICovCi0vKiBwYWNrYWdlICovIGNsYXNzIEphcGFuZXNlVXRpbHMgewotICAgIHN0YXRpYyBwcml2YXRlIGZpbmFsIE1hcDxDaGFyYWN0ZXIsIFN0cmluZz4gc0hhbGZXaWR0aE1hcCA9Ci0gICAgICAgIG5ldyBIYXNoTWFwPENoYXJhY3RlciwgU3RyaW5nPigpOwotCi0gICAgc3RhdGljIHsKLSAgICAgICAgLy8gVGhlcmUncyBubyBsb2dpY2FsIG1hcHBpbmcgcnVsZSBpbiBVbmljb2RlLiBTaWdoLgotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDAxJywgIlx1RkY2NCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDAyJywgIlx1RkY2MSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDBDJywgIlx1RkY2MiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDBEJywgIlx1RkY2MyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDFDJywgIn4iKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA0MScsICJcdUZGNjciKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA0MicsICJcdUZGNzEiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA0MycsICJcdUZGNjgiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA0NCcsICJcdUZGNzIiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA0NScsICJcdUZGNjkiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA0NicsICJcdUZGNzMiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA0NycsICJcdUZGNkEiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA0OCcsICJcdUZGNzQiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA0OScsICJcdUZGNkIiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA0QScsICJcdUZGNzUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA0QicsICJcdUZGNzYiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA0QycsICJcdUZGNzZcdUZGOUUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA0RCcsICJcdUZGNzciKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA0RScsICJcdUZGNzdcdUZGOUUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA0RicsICJcdUZGNzgiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA1MCcsICJcdUZGNzhcdUZGOUUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA1MScsICJcdUZGNzkiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA1MicsICJcdUZGNzlcdUZGOUUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA1MycsICJcdUZGN0EiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA1NCcsICJcdUZGN0FcdUZGOUUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA1NScsICJcdUZGN0IiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA1NicsICJcdUZGN0JcdUZGOUUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA1NycsICJcdUZGN0MiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA1OCcsICJcdUZGN0NcdUZGOUUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA1OScsICJcdUZGN0QiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA1QScsICJcdUZGN0RcdUZGOUUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA1QicsICJcdUZGN0UiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA1QycsICJcdUZGN0VcdUZGOUUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA1RCcsICJcdUZGN0YiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA1RScsICJcdUZGN0ZcdUZGOUUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA1RicsICJcdUZGODAiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA2MCcsICJcdUZGODBcdUZGOUUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA2MScsICJcdUZGODEiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA2MicsICJcdUZGODFcdUZGOUUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA2MycsICJcdUZGNkYiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA2NCcsICJcdUZGODIiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA2NScsICJcdUZGODJcdUZGOUUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA2NicsICJcdUZGODMiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA2NycsICJcdUZGODNcdUZGOUUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA2OCcsICJcdUZGODQiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA2OScsICJcdUZGODRcdUZGOUUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA2QScsICJcdUZGODUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA2QicsICJcdUZGODYiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA2QycsICJcdUZGODciKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA2RCcsICJcdUZGODgiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA2RScsICJcdUZGODkiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA2RicsICJcdUZGOEEiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA3MCcsICJcdUZGOEFcdUZGOUUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA3MScsICJcdUZGOEFcdUZGOUYiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA3MicsICJcdUZGOEIiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA3MycsICJcdUZGOEJcdUZGOUUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA3NCcsICJcdUZGOEJcdUZGOUYiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA3NScsICJcdUZGOEMiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA3NicsICJcdUZGOENcdUZGOUUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA3NycsICJcdUZGOENcdUZGOUYiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA3OCcsICJcdUZGOEQiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA3OScsICJcdUZGOERcdUZGOUUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA3QScsICJcdUZGOERcdUZGOUYiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA3QicsICJcdUZGOEUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA3QycsICJcdUZGOEVcdUZGOUUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA3RCcsICJcdUZGOEVcdUZGOUYiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA3RScsICJcdUZGOEYiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA3RicsICJcdUZGOTAiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA4MCcsICJcdUZGOTEiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA4MScsICJcdUZGOTIiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA4MicsICJcdUZGOTMiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA4MycsICJcdUZGNkMiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA4NCcsICJcdUZGOTQiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA4NScsICJcdUZGNkQiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA4NicsICJcdUZGOTUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA4NycsICJcdUZGNkUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA4OCcsICJcdUZGOTYiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA4OScsICJcdUZGOTciKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA4QScsICJcdUZGOTgiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA4QicsICJcdUZGOTkiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA4QycsICJcdUZGOUEiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA4RCcsICJcdUZGOUIiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA4RScsICJcdUZGOUMiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA4RicsICJcdUZGOUMiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA5MCcsICJcdUZGNzIiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA5MScsICJcdUZGNzQiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA5MicsICJcdUZGNjYiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA5MycsICJcdUZGOUQiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA5QicsICJcdUZGOUUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzA5QycsICJcdUZGOUYiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBBMScsICJcdUZGNjciKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBBMicsICJcdUZGNzEiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBBMycsICJcdUZGNjgiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBBNCcsICJcdUZGNzIiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBBNScsICJcdUZGNjkiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBBNicsICJcdUZGNzMiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBBNycsICJcdUZGNkEiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBBOCcsICJcdUZGNzQiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBBOScsICJcdUZGNkIiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBBQScsICJcdUZGNzUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBBQicsICJcdUZGNzYiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBBQycsICJcdUZGNzZcdUZGOUUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBBRCcsICJcdUZGNzciKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBBRScsICJcdUZGNzdcdUZGOUUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBBRicsICJcdUZGNzgiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBCMCcsICJcdUZGNzhcdUZGOUUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBCMScsICJcdUZGNzkiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBCMicsICJcdUZGNzlcdUZGOUUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBCMycsICJcdUZGN0EiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBCNCcsICJcdUZGN0FcdUZGOUUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBCNScsICJcdUZGN0IiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBCNicsICJcdUZGN0JcdUZGOUUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBCNycsICJcdUZGN0MiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBCOCcsICJcdUZGN0NcdUZGOUUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBCOScsICJcdUZGN0QiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBCQScsICJcdUZGN0RcdUZGOUUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBCQicsICJcdUZGN0UiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBCQycsICJcdUZGN0VcdUZGOUUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBCRCcsICJcdUZGN0YiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBCRScsICJcdUZGN0ZcdUZGOUUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBCRicsICJcdUZGODAiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBDMCcsICJcdUZGODBcdUZGOUUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBDMScsICJcdUZGODEiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBDMicsICJcdUZGODFcdUZGOUUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBDMycsICJcdUZGNkYiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBDNCcsICJcdUZGODIiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBDNScsICJcdUZGODJcdUZGOUUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBDNicsICJcdUZGODMiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBDNycsICJcdUZGODNcdUZGOUUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBDOCcsICJcdUZGODQiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBDOScsICJcdUZGODRcdUZGOUUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBDQScsICJcdUZGODUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBDQicsICJcdUZGODYiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBDQycsICJcdUZGODciKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBDRCcsICJcdUZGODgiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBDRScsICJcdUZGODkiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBDRicsICJcdUZGOEEiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBEMCcsICJcdUZGOEFcdUZGOUUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBEMScsICJcdUZGOEFcdUZGOUYiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBEMicsICJcdUZGOEIiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBEMycsICJcdUZGOEJcdUZGOUUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBENCcsICJcdUZGOEJcdUZGOUYiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBENScsICJcdUZGOEMiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBENicsICJcdUZGOENcdUZGOUUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBENycsICJcdUZGOENcdUZGOUYiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBEOCcsICJcdUZGOEQiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBEOScsICJcdUZGOERcdUZGOUUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBEQScsICJcdUZGOERcdUZGOUYiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBEQicsICJcdUZGOEUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBEQycsICJcdUZGOEVcdUZGOUUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBERCcsICJcdUZGOEVcdUZGOUYiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBERScsICJcdUZGOEYiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBERicsICJcdUZGOTAiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBFMCcsICJcdUZGOTEiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBFMScsICJcdUZGOTIiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBFMicsICJcdUZGOTMiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBFMycsICJcdUZGNkMiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBFNCcsICJcdUZGOTQiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBFNScsICJcdUZGNkQiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBFNicsICJcdUZGOTUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBFNycsICJcdUZGNkUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBFOCcsICJcdUZGOTYiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBFOScsICJcdUZGOTciKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBFQScsICJcdUZGOTgiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBFQicsICJcdUZGOTkiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBFQycsICJcdUZGOUEiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBFRCcsICJcdUZGOUIiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBFRScsICJcdUZGOUMiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBFRicsICJcdUZGOUMiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBGMCcsICJcdUZGNzIiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBGMScsICJcdUZGNzQiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBGMicsICJcdUZGNjYiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBGMycsICJcdUZGOUQiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBGNCcsICJcdUZGNzNcdUZGOUUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBGNScsICJcdUZGNzYiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBGNicsICJcdUZGNzkiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBGQicsICJcdUZGNjUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1MzBGQycsICJcdUZGNzAiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYwMScsICIhIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMDInLCAiXCIiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYwMycsICIjIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMDQnLCAiJCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjA1JywgIiUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYwNicsICImIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMDcnLCAiJyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjA4JywgIigiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYwOScsICIpIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMEEnLCAiKiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjBCJywgIisiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYwQycsICIsIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMEQnLCAiLSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjBFJywgIi4iKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYwRicsICIvIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMTAnLCAiMCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjExJywgIjEiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYxMicsICIyIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMTMnLCAiMyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjE0JywgIjQiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYxNScsICI1Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMTYnLCAiNiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjE3JywgIjciKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYxOCcsICI4Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMTknLCAiOSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjFBJywgIjoiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYxQicsICI7Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMUMnLCAiPCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjFEJywgIj0iKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYxRScsICI+Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMUYnLCAiPyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjIwJywgIkAiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYyMScsICJBIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMjInLCAiQiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjIzJywgIkMiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYyNCcsICJEIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMjUnLCAiRSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjI2JywgIkYiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYyNycsICJHIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMjgnLCAiSCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjI5JywgIkkiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYyQScsICJKIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMkInLCAiSyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjJDJywgIkwiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYyRCcsICJNIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMkUnLCAiTiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjJGJywgIk8iKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYzMCcsICJQIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMzEnLCAiUSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjMyJywgIlIiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYzMycsICJTIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMzQnLCAiVCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjM1JywgIlUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYzNicsICJWIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMzcnLCAiVyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjM4JywgIlgiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYzOScsICJZIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGM0EnLCAiWiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjNCJywgIlsiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYzQycsICJcXCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjNEJywgIl0iKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYzRScsICJeIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGM0YnLCAiXyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjQxJywgImEiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY0MicsICJiIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNDMnLCAiYyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjQ0JywgImQiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY0NScsICJlIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNDYnLCAiZiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjQ3JywgImciKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY0OCcsICJoIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNDknLCAiaSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjRBJywgImoiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY0QicsICJrIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNEMnLCAibCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjREJywgIm0iKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY0RScsICJuIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNEYnLCAibyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjUwJywgInAiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY1MScsICJxIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNTInLCAiciIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjUzJywgInMiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY1NCcsICJ0Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNTUnLCAidSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjU2JywgInYiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY1NycsICJ3Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNTgnLCAieCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjU5JywgInkiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY1QScsICJ6Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNUInLCAieyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjVDJywgInwiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY1RCcsICJ9Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNUUnLCAifiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjYxJywgIlx1RkY2MSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjYyJywgIlx1RkY2MiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjYzJywgIlx1RkY2MyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjY0JywgIlx1RkY2NCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjY1JywgIlx1RkY2NSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjY2JywgIlx1RkY2NiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjY3JywgIlx1RkY2NyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjY4JywgIlx1RkY2OCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjY5JywgIlx1RkY2OSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjZBJywgIlx1RkY2QSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjZCJywgIlx1RkY2QiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjZDJywgIlx1RkY2QyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjZEJywgIlx1RkY2RCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjZFJywgIlx1RkY2RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjZGJywgIlx1RkY2RiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjcwJywgIlx1RkY3MCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjcxJywgIlx1RkY3MSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjcyJywgIlx1RkY3MiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjczJywgIlx1RkY3MyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjc0JywgIlx1RkY3NCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjc1JywgIlx1RkY3NSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjc2JywgIlx1RkY3NiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjc3JywgIlx1RkY3NyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjc4JywgIlx1RkY3OCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjc5JywgIlx1RkY3OSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjdBJywgIlx1RkY3QSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjdCJywgIlx1RkY3QiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjdDJywgIlx1RkY3QyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjdEJywgIlx1RkY3RCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjdFJywgIlx1RkY3RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjdGJywgIlx1RkY3RiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjgwJywgIlx1RkY4MCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjgxJywgIlx1RkY4MSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjgyJywgIlx1RkY4MiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjgzJywgIlx1RkY4MyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjg0JywgIlx1RkY4NCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjg1JywgIlx1RkY4NSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjg2JywgIlx1RkY4NiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjg3JywgIlx1RkY4NyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjg4JywgIlx1RkY4OCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjg5JywgIlx1RkY4OSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjhBJywgIlx1RkY4QSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjhCJywgIlx1RkY4QiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjhDJywgIlx1RkY4QyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjhEJywgIlx1RkY4RCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjhFJywgIlx1RkY4RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjhGJywgIlx1RkY4RiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjkwJywgIlx1RkY5MCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjkxJywgIlx1RkY5MSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjkyJywgIlx1RkY5MiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjkzJywgIlx1RkY5MyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjk0JywgIlx1RkY5NCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjk1JywgIlx1RkY5NSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjk2JywgIlx1RkY5NiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjk3JywgIlx1RkY5NyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjk4JywgIlx1RkY5OCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjk5JywgIlx1RkY5OSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjlBJywgIlx1RkY5QSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjlCJywgIlx1RkY5QiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjlDJywgIlx1RkY5QyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjlEJywgIlx1RkY5RCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjlFJywgIlx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjlGJywgIlx1RkY5RiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRkU1JywgIlx1MDA1Q1x1MDA1QyIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiBoYWxmLXdpZHRoIHZlcnNpb24gb2YgdGhhdCBjaGFyYWN0ZXIgaWYgcG9zc2libGUuIFJldHVybiBudWxsIGlmIG5vdCBwb3NzaWJsZQotICAgICAqIEBwYXJhbSBjaCBpbnB1dCBjaGFyYWN0ZXIKLSAgICAgKiBAcmV0dXJuIENoYXJTZXF1ZW5jZSBvYmplY3QgaWYgdGhlIG1hcHBpbmcgZm9yIGNoIGV4aXN0cy4gUmV0dXJuIG51bGwgb3RoZXJ3aXNlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHRyeUdldEhhbGZXaWR0aFRleHQoY2hhciBjaCkgewotICAgICAgICBpZiAoc0hhbGZXaWR0aE1hcC5jb250YWluc0tleShjaCkpIHsKLSAgICAgICAgICAgIHJldHVybiBzSGFsZldpZHRoTWFwLmdldChjaCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZEJ1aWxkZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZEJ1aWxkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWRhNmQ3YS4uMDAwMDAwMAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRCdWlsZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTMyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAotICogdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSAqIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAotICogV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlCi0gKiBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgotICogdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC5waW0udmNhcmQ7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFZhbHVlczsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLkVtYWlsOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuRXZlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5JbTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLk5pY2tuYW1lOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuTm90ZTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLk9yZ2FuaXphdGlvbjsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLlBob25lOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuUGhvdG87Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5SZWxhdGlvbjsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLlN0cnVjdHVyZWROYW1lOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuU3RydWN0dXJlZFBvc3RhbDsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLldlYnNpdGU7Ci1pbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuUGhvbmVOdW1iZXJVdGlsczsKLWltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwotaW1wb3J0IGFuZHJvaWQudXRpbC5DaGFyc2V0VXRpbHM7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2RlYy5iaW5hcnkuQmFzZTY0OwotCi1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuVW5zdXBwb3J0ZWRDaGFyc2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi0vKioKLSAqIFRoZSBjbGFzcyB3aGljaCBsZXRzIHVzZXJzIGNyZWF0ZSB0aGVpciBvd24gdkNhcmQgU3RyaW5nLgotICovCi1wdWJsaWMgY2xhc3MgVkNhcmRCdWlsZGVyIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1RBRyA9ICJWQ2FyZEJ1aWxkZXIiOwotCi0gICAgLy8gSWYgeW91IGFkZCB0aGUgb3RoZXIgZWxlbWVudCwgcGxlYXNlIGNoZWNrIGFsbCB0aGUgY29sdW1ucyBhcmUgYWJsZSB0byBiZQotICAgIC8vIGNvbnZlcnRlZCB0byBTdHJpbmcuCi0gICAgLy8KLSAgICAvLyBlLmcuIEJMT0IgaXMgbm90IHdoYXQgd2UgY2FuIGhhbmRsZSBoZXJlIG5vdy4KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTZXQ8U3RyaW5nPiBzQWxsb3dlZEFuZHJvaWRQcm9wZXJ0eVNldCA9Ci0gICAgICAgICAgICBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVTZXQobmV3IEhhc2hTZXQ8U3RyaW5nPihBcnJheXMuYXNMaXN0KAotICAgICAgICAgICAgICAgICAgICBOaWNrbmFtZS5DT05URU5UX0lURU1fVFlQRSwgRXZlbnQuQ09OVEVOVF9JVEVNX1RZUEUsCi0gICAgICAgICAgICAgICAgICAgIFJlbGF0aW9uLkNPTlRFTlRfSVRFTV9UWVBFKSkpOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9QSE9ORV9UWVBFID0gUGhvbmUuVFlQRV9IT01FOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfUE9TVEFMX1RZUEUgPSBTdHJ1Y3R1cmVkUG9zdGFsLlRZUEVfSE9NRTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0VNQUlMX1RZUEUgPSBFbWFpbC5UWVBFX09USEVSOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZDQVJEX0RBVEFfVkNBUkQgPSAiVkNBUkQiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWQ0FSRF9EQVRBX1BVQkxJQyA9ICJQVUJMSUMiOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZDQVJEX1BBUkFNX1NFUEFSQVRPUiA9ICI7IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkNBUkRfRU5EX09GX0xJTkUgPSAiXHJcbiI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZDQVJEX0RBVEFfU0VQQVJBVE9SID0gIjoiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWQ0FSRF9JVEVNX1NFUEFSQVRPUiA9ICI7IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkNBUkRfV1MgPSAiICI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZDQVJEX1BBUkFNX0VRVUFMID0gIj0iOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZDQVJEX1BBUkFNX0VOQ09ESU5HX1FQID0gIkVOQ09ESU5HPVFVT1RFRC1QUklOVEFCTEUiOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZDQVJEX1BBUkFNX0VOQ09ESU5HX0JBU0U2NF9WMjEgPSAiRU5DT0RJTkc9QkFTRTY0IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkNBUkRfUEFSQU1fRU5DT0RJTkdfQkFTRTY0X1YzMCA9ICJFTkNPRElORz1iIjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTSElGVF9KSVMgPSAiU0hJRlRfSklTIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVRGXzggPSAiVVRGLTgiOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBpbnQgbVZDYXJkVHlwZTsKLQotICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBtSXNWMzA7Ci0gICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1Jc0phcGFuZXNlTW9iaWxlUGhvbmU7Ci0gICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1Pbmx5T25lTm90ZUZpZWxkSXNBdmFpbGFibGU7Ci0gICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1Jc0RvQ29NbzsKLSAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gbVNob3VsZFVzZVF1b3RlZFByaW50YWJsZTsKLSAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gbVVzZXNBbmRyb2lkUHJvcGVydHk7Ci0gICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1Vc2VzRGVmYWN0UHJvcGVydHk7Ci0gICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1Vc2VzVXRmODsKLSAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gbVVzZXNTaGlmdEppczsKLSAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gbUFwcGVuZFR5cGVQYXJhbU5hbWU7Ci0gICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1SZWZyYWluc1FQVG9OYW1lUHJvcGVydGllczsKLSAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gbU5lZWRzVG9Db252ZXJ0UGhvbmV0aWNTdHJpbmc7Ci0KLSAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gbVNob3VsZEFwcGVuZENoYXJzZXRQYXJhbTsKLQotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1DaGFyc2V0U3RyaW5nOwotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1WQ2FyZENoYXJzZXRQYXJhbWV0ZXI7Ci0KLSAgICBwcml2YXRlIFN0cmluZ0J1aWxkZXIgbUJ1aWxkZXI7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1FbmRBcHBlbmRlZDsKLQotICAgIHB1YmxpYyBWQ2FyZEJ1aWxkZXIoZmluYWwgaW50IHZjYXJkVHlwZSkgewotICAgICAgICBtVkNhcmRUeXBlID0gdmNhcmRUeXBlOwotCi0gICAgICAgIG1Jc1YzMCA9IFZDYXJkQ29uZmlnLmlzVjMwKHZjYXJkVHlwZSk7Ci0gICAgICAgIG1TaG91bGRVc2VRdW90ZWRQcmludGFibGUgPSBWQ2FyZENvbmZpZy5zaG91bGRVc2VRdW90ZWRQcmludGFibGUodmNhcmRUeXBlKTsKLSAgICAgICAgbUlzRG9Db01vID0gVkNhcmRDb25maWcuaXNEb0NvTW8odmNhcmRUeXBlKTsKLSAgICAgICAgbUlzSmFwYW5lc2VNb2JpbGVQaG9uZSA9IFZDYXJkQ29uZmlnLm5lZWRzVG9Db252ZXJ0UGhvbmV0aWNTdHJpbmcodmNhcmRUeXBlKTsKLSAgICAgICAgbU9ubHlPbmVOb3RlRmllbGRJc0F2YWlsYWJsZSA9IFZDYXJkQ29uZmlnLm9ubHlPbmVOb3RlRmllbGRJc0F2YWlsYWJsZSh2Y2FyZFR5cGUpOwotICAgICAgICBtVXNlc0FuZHJvaWRQcm9wZXJ0eSA9IFZDYXJkQ29uZmlnLnVzZXNBbmRyb2lkU3BlY2lmaWNQcm9wZXJ0eSh2Y2FyZFR5cGUpOwotICAgICAgICBtVXNlc0RlZmFjdFByb3BlcnR5ID0gVkNhcmRDb25maWcudXNlc0RlZmFjdFByb3BlcnR5KHZjYXJkVHlwZSk7Ci0gICAgICAgIG1Vc2VzVXRmOCA9IFZDYXJkQ29uZmlnLnVzZXNVdGY4KHZjYXJkVHlwZSk7Ci0gICAgICAgIG1Vc2VzU2hpZnRKaXMgPSBWQ2FyZENvbmZpZy51c2VzU2hpZnRKaXModmNhcmRUeXBlKTsKLSAgICAgICAgbVJlZnJhaW5zUVBUb05hbWVQcm9wZXJ0aWVzID0gVkNhcmRDb25maWcuc2hvdWxkUmVmcmFpblFQVG9OYW1lUHJvcGVydGllcyh2Y2FyZFR5cGUpOwotICAgICAgICBtQXBwZW5kVHlwZVBhcmFtTmFtZSA9IFZDYXJkQ29uZmlnLmFwcGVuZFR5cGVQYXJhbU5hbWUodmNhcmRUeXBlKTsKLSAgICAgICAgbU5lZWRzVG9Db252ZXJ0UGhvbmV0aWNTdHJpbmcgPSBWQ2FyZENvbmZpZy5uZWVkc1RvQ29udmVydFBob25ldGljU3RyaW5nKHZjYXJkVHlwZSk7Ci0KLSAgICAgICAgbVNob3VsZEFwcGVuZENoYXJzZXRQYXJhbSA9ICEobUlzVjMwICYmIG1Vc2VzVXRmOCk7Ci0KLSAgICAgICAgaWYgKG1Jc0RvQ29NbykgewotICAgICAgICAgICAgU3RyaW5nIGNoYXJzZXQ7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGNoYXJzZXQgPSBDaGFyc2V0VXRpbHMuY2hhcnNldEZvclZlbmRvcihTSElGVF9KSVMsICJkb2NvbW8iKS5uYW1lKCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZENoYXJzZXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJEb0NvTW8tc3BlY2lmaWMgU0hJRlRfSklTIHdhcyBub3QgZm91bmQuIFVzZSBTSElGVF9KSVMgYXMgaXMuIik7Ci0gICAgICAgICAgICAgICAgY2hhcnNldCA9IFNISUZUX0pJUzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1DaGFyc2V0U3RyaW5nID0gY2hhcnNldDsKLSAgICAgICAgICAgIC8vIERvIG5vdCB1c2UgbUNoYXJzZXRTdHJpbmcgYmVsbG93IHNpbmNlIGl0IGlzIGRpZmZlcmVudCBmcm9tICJTSElGVF9KSVMiIGJ1dAotICAgICAgICAgICAgLy8gbWF5IGJlICJET0NPTU9fU0hJRlRfSklTIiBvciBzb21ldGhpbmcgbGlrZSB0aGF0IChpbnRlcm5hbCBleHByZXNzaW9uIHVzZWQgaW4KLSAgICAgICAgICAgIC8vIEFuZHJvaWQsIG5vdCBzaG93biB0byB0aGUgcHVibGljKS4KLSAgICAgICAgICAgIG1WQ2FyZENoYXJzZXRQYXJhbWV0ZXIgPSAiQ0hBUlNFVD0iICsgU0hJRlRfSklTOwotICAgICAgICB9IGVsc2UgaWYgKG1Vc2VzU2hpZnRKaXMpIHsKLSAgICAgICAgICAgIFN0cmluZyBjaGFyc2V0OwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBjaGFyc2V0ID0gQ2hhcnNldFV0aWxzLmNoYXJzZXRGb3JWZW5kb3IoU0hJRlRfSklTKS5uYW1lKCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZENoYXJzZXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJWZW5kb3Itc3BlY2lmaWMgU0hJRlRfSklTIHdhcyBub3QgZm91bmQuIFVzZSBTSElGVF9KSVMgYXMgaXMuIik7Ci0gICAgICAgICAgICAgICAgY2hhcnNldCA9IFNISUZUX0pJUzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1DaGFyc2V0U3RyaW5nID0gY2hhcnNldDsKLSAgICAgICAgICAgIG1WQ2FyZENoYXJzZXRQYXJhbWV0ZXIgPSAiQ0hBUlNFVD0iICsgU0hJRlRfSklTOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbUNoYXJzZXRTdHJpbmcgPSBVVEZfODsKLSAgICAgICAgICAgIG1WQ2FyZENoYXJzZXRQYXJhbWV0ZXIgPSAiQ0hBUlNFVD0iICsgVVRGXzg7Ci0gICAgICAgIH0KLSAgICAgICAgY2xlYXIoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKLSAgICAgICAgbUJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICBtRW5kQXBwZW5kZWQgPSBmYWxzZTsKLSAgICAgICAgYXBwZW5kTGluZShWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9CRUdJTiwgVkNBUkRfREFUQV9WQ0FSRCk7Ci0gICAgICAgIGlmIChtSXNWMzApIHsKLSAgICAgICAgICAgIGFwcGVuZExpbmUoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfVkVSU0lPTiwgVkNhcmRDb25zdGFudHMuVkVSU0lPTl9WMzApOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYXBwZW5kTGluZShWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9WRVJTSU9OLCBWQ2FyZENvbnN0YW50cy5WRVJTSU9OX1YyMSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gY29udGFpbnNOb25FbXB0eU5hbWUoZmluYWwgQ29udGVudFZhbHVlcyBjb250ZW50VmFsdWVzKSB7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBmYW1pbHlOYW1lID0gY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhTdHJ1Y3R1cmVkTmFtZS5GQU1JTFlfTkFNRSk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBtaWRkbGVOYW1lID0gY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhTdHJ1Y3R1cmVkTmFtZS5NSURETEVfTkFNRSk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBnaXZlbk5hbWUgPSBjb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKFN0cnVjdHVyZWROYW1lLkdJVkVOX05BTUUpOwotICAgICAgICBmaW5hbCBTdHJpbmcgcHJlZml4ID0gY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhTdHJ1Y3R1cmVkTmFtZS5QUkVGSVgpOwotICAgICAgICBmaW5hbCBTdHJpbmcgc3VmZml4ID0gY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhTdHJ1Y3R1cmVkTmFtZS5TVUZGSVgpOwotICAgICAgICBmaW5hbCBTdHJpbmcgcGhvbmV0aWNGYW1pbHlOYW1lID0KLSAgICAgICAgICAgICAgICBjb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKFN0cnVjdHVyZWROYW1lLlBIT05FVElDX0ZBTUlMWV9OQU1FKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIHBob25ldGljTWlkZGxlTmFtZSA9Ci0gICAgICAgICAgICAgICAgY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19NSURETEVfTkFNRSk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBwaG9uZXRpY0dpdmVuTmFtZSA9Ci0gICAgICAgICAgICAgICAgY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19HSVZFTl9OQU1FKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIGRpc3BsYXlOYW1lID0gY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhTdHJ1Y3R1cmVkTmFtZS5ESVNQTEFZX05BTUUpOwotICAgICAgICByZXR1cm4gIShUZXh0VXRpbHMuaXNFbXB0eShmYW1pbHlOYW1lKSAmJiBUZXh0VXRpbHMuaXNFbXB0eShtaWRkbGVOYW1lKSAmJgotICAgICAgICAgICAgICAgIFRleHRVdGlscy5pc0VtcHR5KGdpdmVuTmFtZSkgJiYgVGV4dFV0aWxzLmlzRW1wdHkocHJlZml4KSAmJgotICAgICAgICAgICAgICAgIFRleHRVdGlscy5pc0VtcHR5KHN1ZmZpeCkgJiYgVGV4dFV0aWxzLmlzRW1wdHkocGhvbmV0aWNGYW1pbHlOYW1lKSAmJgotICAgICAgICAgICAgICAgIFRleHRVdGlscy5pc0VtcHR5KHBob25ldGljTWlkZGxlTmFtZSkgJiYgVGV4dFV0aWxzLmlzRW1wdHkocGhvbmV0aWNHaXZlbk5hbWUpICYmCi0gICAgICAgICAgICAgICAgVGV4dFV0aWxzLmlzRW1wdHkoZGlzcGxheU5hbWUpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIENvbnRlbnRWYWx1ZXMgZ2V0UHJpbWFyeUNvbnRlbnRWYWx1ZShmaW5hbCBMaXN0PENvbnRlbnRWYWx1ZXM+IGNvbnRlbnRWYWx1ZXNMaXN0KSB7Ci0gICAgICAgIENvbnRlbnRWYWx1ZXMgcHJpbWFyeUNvbnRlbnRWYWx1ZXMgPSBudWxsOwotICAgICAgICBDb250ZW50VmFsdWVzIHN1YnByaW1hcnlDb250ZW50VmFsdWVzID0gbnVsbDsKLSAgICAgICAgZm9yIChDb250ZW50VmFsdWVzIGNvbnRlbnRWYWx1ZXMgOiBjb250ZW50VmFsdWVzTGlzdCkgewotICAgICAgICAgICAgaWYgKGNvbnRlbnRWYWx1ZXMgPT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBJbnRlZ2VyIGlzU3VwZXJQcmltYXJ5ID0gY29udGVudFZhbHVlcy5nZXRBc0ludGVnZXIoU3RydWN0dXJlZE5hbWUuSVNfU1VQRVJfUFJJTUFSWSk7Ci0gICAgICAgICAgICBpZiAoaXNTdXBlclByaW1hcnkgIT0gbnVsbCAmJiBpc1N1cGVyUHJpbWFyeSA+IDApIHsKLSAgICAgICAgICAgICAgICAvLyBXZSBjaG9vc2UgInN1cGVyIHByaW1hcnkiIENvbnRlbnRWYWx1ZXMuCi0gICAgICAgICAgICAgICAgcHJpbWFyeUNvbnRlbnRWYWx1ZXMgPSBjb250ZW50VmFsdWVzOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfSBlbHNlIGlmIChwcmltYXJ5Q29udGVudFZhbHVlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gV2UgY2hvb3NlIHRoZSBmaXJzdCAicHJpbWFyeSIgQ29udGVudFZhbHVlcwotICAgICAgICAgICAgICAgIC8vIGlmICJzdXBlciBwcmltYXJ5IiBDb250ZW50VmFsdWVzIGRvZXMgbm90IGV4aXN0LgotICAgICAgICAgICAgICAgIGZpbmFsIEludGVnZXIgaXNQcmltYXJ5ID0gY29udGVudFZhbHVlcy5nZXRBc0ludGVnZXIoU3RydWN0dXJlZE5hbWUuSVNfUFJJTUFSWSk7Ci0gICAgICAgICAgICAgICAgaWYgKGlzUHJpbWFyeSAhPSBudWxsICYmIGlzUHJpbWFyeSA+IDAgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5zTm9uRW1wdHlOYW1lKGNvbnRlbnRWYWx1ZXMpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByaW1hcnlDb250ZW50VmFsdWVzID0gY29udGVudFZhbHVlczsKLSAgICAgICAgICAgICAgICAgICAgLy8gRG8gbm90IGJyZWFrLCBzaW5jZSB0aGVyZSBtYXkgYmUgQ29udGVudFZhbHVlcyB3aXRoICJzdXBlciBwcmltYXJ5IgotICAgICAgICAgICAgICAgICAgICAvLyBhZnRlcndvcmQuCi0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdWJwcmltYXJ5Q29udGVudFZhbHVlcyA9PSBudWxsICYmCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250YWluc05vbkVtcHR5TmFtZShjb250ZW50VmFsdWVzKSkgewotICAgICAgICAgICAgICAgICAgICBzdWJwcmltYXJ5Q29udGVudFZhbHVlcyA9IGNvbnRlbnRWYWx1ZXM7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHByaW1hcnlDb250ZW50VmFsdWVzID09IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChzdWJwcmltYXJ5Q29udGVudFZhbHVlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gV2UgY2hvb3NlIHRoZSBmaXJzdCBDb250ZW50VmFsdWVzIGlmIGFueSAicHJpbWFyeSIgQ29udGVudFZhbHVlcyBkb2VzIG5vdCBleGlzdC4KLSAgICAgICAgICAgICAgICBwcmltYXJ5Q29udGVudFZhbHVlcyA9IHN1YnByaW1hcnlDb250ZW50VmFsdWVzOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiQWxsIENvbnRlbnRWYWx1ZXMgZ2l2ZW4gZnJvbSBkYXRhYmFzZSBpcyBlbXB0eS4iKTsKLSAgICAgICAgICAgICAgICBwcmltYXJ5Q29udGVudFZhbHVlcyA9IG5ldyBDb250ZW50VmFsdWVzKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcHJpbWFyeUNvbnRlbnRWYWx1ZXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRm9yIHNhZmV0eSwgd2UnbGwgZW1pdCBqdXN0IG9uZSB2YWx1ZSBhcm91bmQgU3RydWN0dXJlZE5hbWUsIGFzIGV4dGVybmFsIGltcG9ydGVycwotICAgICAqIG1heSBnZXQgY29uZnVzZWQgd2l0aCBtdWx0aXBsZSAiTiIsICJGTiIsIGV0Yy4gcHJvcGVydGllcywgdGhvdWdoIGl0IGlzIHZhbGlkIGluCi0gICAgICogdkNhcmQgc3BlYy4KLSAgICAgKi8KLSAgICBwdWJsaWMgVkNhcmRCdWlsZGVyIGFwcGVuZE5hbWVQcm9wZXJ0aWVzKGZpbmFsIExpc3Q8Q29udGVudFZhbHVlcz4gY29udGVudFZhbHVlc0xpc3QpIHsKLSAgICAgICAgaWYgKGNvbnRlbnRWYWx1ZXNMaXN0ID09IG51bGwgfHwgY29udGVudFZhbHVlc0xpc3QuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBpZiAobUlzRG9Db01vKSB7Ci0gICAgICAgICAgICAgICAgYXBwZW5kTGluZShWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9OLCAiIik7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG1Jc1YzMCkgewotICAgICAgICAgICAgICAgIC8vIHZDYXJkIDMuMCByZXF1aXJlcyAiTiIgYW5kICJGTiIgcHJvcGVydGllcy4KLSAgICAgICAgICAgICAgICBhcHBlbmRMaW5lKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX04sICIiKTsKLSAgICAgICAgICAgICAgICBhcHBlbmRMaW5lKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX0ZOLCAiIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIENvbnRlbnRWYWx1ZXMgY29udGVudFZhbHVlcyA9IGdldFByaW1hcnlDb250ZW50VmFsdWUoY29udGVudFZhbHVlc0xpc3QpOwotICAgICAgICBmaW5hbCBTdHJpbmcgZmFtaWx5TmFtZSA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoU3RydWN0dXJlZE5hbWUuRkFNSUxZX05BTUUpOwotICAgICAgICBmaW5hbCBTdHJpbmcgbWlkZGxlTmFtZSA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoU3RydWN0dXJlZE5hbWUuTUlERExFX05BTUUpOwotICAgICAgICBmaW5hbCBTdHJpbmcgZ2l2ZW5OYW1lID0gY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhTdHJ1Y3R1cmVkTmFtZS5HSVZFTl9OQU1FKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIHByZWZpeCA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoU3RydWN0dXJlZE5hbWUuUFJFRklYKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIHN1ZmZpeCA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoU3RydWN0dXJlZE5hbWUuU1VGRklYKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIGRpc3BsYXlOYW1lID0gY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhTdHJ1Y3R1cmVkTmFtZS5ESVNQTEFZX05BTUUpOwotCi0gICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkoZmFtaWx5TmFtZSkgfHwgIVRleHRVdGlscy5pc0VtcHR5KGdpdmVuTmFtZSkpIHsKLSAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gcmVhbGx5QXBwZW5kQ2hhcnNldFBhcmFtZXRlclRvTmFtZSA9Ci0gICAgICAgICAgICAgICAgICAgIHNob3VsZEFwcGVuZENoYXJzZXRQYXJhbShmYW1pbHlOYW1lLCBnaXZlbk5hbWUsIG1pZGRsZU5hbWUsIHByZWZpeCwgc3VmZml4KTsKLSAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gcmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlVG9OYW1lID0KLSAgICAgICAgICAgICAgICAgICAgKCFtUmVmcmFpbnNRUFRvTmFtZVByb3BlcnRpZXMgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAhKFZDYXJkVXRpbHMuY29udGFpbnNPbmx5Tm9uQ3JMZlByaW50YWJsZUFzY2lpKGZhbWlseU5hbWUpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQ2FyZFV0aWxzLmNvbnRhaW5zT25seU5vbkNyTGZQcmludGFibGVBc2NpaShnaXZlbk5hbWUpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQ2FyZFV0aWxzLmNvbnRhaW5zT25seU5vbkNyTGZQcmludGFibGVBc2NpaShtaWRkbGVOYW1lKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkNhcmRVdGlscy5jb250YWluc09ubHlOb25DckxmUHJpbnRhYmxlQXNjaWkocHJlZml4KSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkNhcmRVdGlscy5jb250YWluc09ubHlOb25DckxmUHJpbnRhYmxlQXNjaWkoc3VmZml4KSkpOwotCi0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgZm9ybWF0dGVkTmFtZTsKLSAgICAgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkoZGlzcGxheU5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgZm9ybWF0dGVkTmFtZSA9IGRpc3BsYXlOYW1lOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBmb3JtYXR0ZWROYW1lID0gVkNhcmRVdGlscy5jb25zdHJ1Y3ROYW1lRnJvbUVsZW1lbnRzKAotICAgICAgICAgICAgICAgICAgICAgICAgVkNhcmRDb25maWcuZ2V0TmFtZU9yZGVyVHlwZShtVkNhcmRUeXBlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGZhbWlseU5hbWUsIG1pZGRsZU5hbWUsIGdpdmVuTmFtZSwgcHJlZml4LCBzdWZmaXgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmluYWwgYm9vbGVhbiByZWFsbHlBcHBlbmRDaGFyc2V0UGFyYW1ldGVyVG9GTiA9Ci0gICAgICAgICAgICAgICAgICAgIHNob3VsZEFwcGVuZENoYXJzZXRQYXJhbShmb3JtYXR0ZWROYW1lKTsKLSAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gcmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlVG9GTiA9Ci0gICAgICAgICAgICAgICAgICAgICFtUmVmcmFpbnNRUFRvTmFtZVByb3BlcnRpZXMgJiYKLSAgICAgICAgICAgICAgICAgICAgIVZDYXJkVXRpbHMuY29udGFpbnNPbmx5Tm9uQ3JMZlByaW50YWJsZUFzY2lpKGZvcm1hdHRlZE5hbWUpOwotCi0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgZW5jb2RlZEZhbWlseTsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBlbmNvZGVkR2l2ZW47Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgZW5jb2RlZE1pZGRsZTsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBlbmNvZGVkUHJlZml4OwotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGVuY29kZWRTdWZmaXg7Ci0gICAgICAgICAgICBpZiAocmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlVG9OYW1lKSB7Ci0gICAgICAgICAgICAgICAgZW5jb2RlZEZhbWlseSA9IGVuY29kZVF1b3RlZFByaW50YWJsZShmYW1pbHlOYW1lKTsKLSAgICAgICAgICAgICAgICBlbmNvZGVkR2l2ZW4gPSBlbmNvZGVRdW90ZWRQcmludGFibGUoZ2l2ZW5OYW1lKTsKLSAgICAgICAgICAgICAgICBlbmNvZGVkTWlkZGxlID0gZW5jb2RlUXVvdGVkUHJpbnRhYmxlKG1pZGRsZU5hbWUpOwotICAgICAgICAgICAgICAgIGVuY29kZWRQcmVmaXggPSBlbmNvZGVRdW90ZWRQcmludGFibGUocHJlZml4KTsKLSAgICAgICAgICAgICAgICBlbmNvZGVkU3VmZml4ID0gZW5jb2RlUXVvdGVkUHJpbnRhYmxlKHN1ZmZpeCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGVuY29kZWRGYW1pbHkgPSBlc2NhcGVDaGFyYWN0ZXJzKGZhbWlseU5hbWUpOwotICAgICAgICAgICAgICAgIGVuY29kZWRHaXZlbiA9IGVzY2FwZUNoYXJhY3RlcnMoZ2l2ZW5OYW1lKTsKLSAgICAgICAgICAgICAgICBlbmNvZGVkTWlkZGxlID0gZXNjYXBlQ2hhcmFjdGVycyhtaWRkbGVOYW1lKTsKLSAgICAgICAgICAgICAgICBlbmNvZGVkUHJlZml4ID0gZXNjYXBlQ2hhcmFjdGVycyhwcmVmaXgpOwotICAgICAgICAgICAgICAgIGVuY29kZWRTdWZmaXggPSBlc2NhcGVDaGFyYWN0ZXJzKHN1ZmZpeCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBlbmNvZGVkRm9ybWF0dGVkbmFtZSA9Ci0gICAgICAgICAgICAgICAgICAgIChyZWFsbHlVc2VRdW90ZWRQcmludGFibGVUb0ZOID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGVRdW90ZWRQcmludGFibGUoZm9ybWF0dGVkTmFtZSkgOiBlc2NhcGVDaGFyYWN0ZXJzKGZvcm1hdHRlZE5hbWUpKTsKLQotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX04pOwotICAgICAgICAgICAgaWYgKG1Jc0RvQ29NbykgewotICAgICAgICAgICAgICAgIGlmIChyZWFsbHlBcHBlbmRDaGFyc2V0UGFyYW1ldGVyVG9OYW1lKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQobVZDYXJkQ2hhcnNldFBhcmFtZXRlcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChyZWFsbHlVc2VRdW90ZWRQcmludGFibGVUb05hbWUpIHsKLSAgICAgICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9FTkNPRElOR19RUCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9EQVRBX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICAgICAgLy8gRG9Db01vIHBob25lcyByZXF1aXJlIHRoYXQgYWxsIHRoZSBlbGVtZW50cyBpbiB0aGUgImZhbWlseSBuYW1lIiBmaWVsZC4KLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoZm9ybWF0dGVkTmFtZSk7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0lURU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfSVRFTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9JVEVNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0lURU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKHJlYWxseUFwcGVuZENoYXJzZXRQYXJhbWV0ZXJUb05hbWUpIHsKLSAgICAgICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChtVkNhcmRDaGFyc2V0UGFyYW1ldGVyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHJlYWxseVVzZVF1b3RlZFByaW50YWJsZVRvTmFtZSkgewotICAgICAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX0VOQ09ESU5HX1FQKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0RBVEFfU0VQQVJBVE9SKTsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoZW5jb2RlZEZhbWlseSk7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0lURU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoZW5jb2RlZEdpdmVuKTsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfSVRFTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChlbmNvZGVkTWlkZGxlKTsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfSVRFTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChlbmNvZGVkUHJlZml4KTsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfSVRFTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChlbmNvZGVkU3VmZml4KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9FTkRfT0ZfTElORSk7Ci0KLSAgICAgICAgICAgIC8vIEZOIHByb3BlcnR5Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfRk4pOwotICAgICAgICAgICAgaWYgKHJlYWxseUFwcGVuZENoYXJzZXRQYXJhbWV0ZXJUb0ZOKSB7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKG1WQ2FyZENoYXJzZXRQYXJhbWV0ZXIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHJlYWxseVVzZVF1b3RlZFByaW50YWJsZVRvRk4pIHsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fRU5DT0RJTkdfUVApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0RBVEFfU0VQQVJBVE9SKTsKLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChlbmNvZGVkRm9ybWF0dGVkbmFtZSk7Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfRU5EX09GX0xJTkUpOwotICAgICAgICB9IGVsc2UgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShkaXNwbGF5TmFtZSkpIHsKLSAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gcmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlVG9EaXNwbGF5TmFtZSA9Ci0gICAgICAgICAgICAgICAgKCFtUmVmcmFpbnNRUFRvTmFtZVByb3BlcnRpZXMgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICFWQ2FyZFV0aWxzLmNvbnRhaW5zT25seU5vbkNyTGZQcmludGFibGVBc2NpaShkaXNwbGF5TmFtZSkpOwotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGVuY29kZWREaXNwbGF5TmFtZSA9Ci0gICAgICAgICAgICAgICAgICAgIHJlYWxseVVzZVF1b3RlZFByaW50YWJsZVRvRGlzcGxheU5hbWUgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kZVF1b3RlZFByaW50YWJsZShkaXNwbGF5TmFtZSkgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlc2NhcGVDaGFyYWN0ZXJzKGRpc3BsYXlOYW1lKTsKLQotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX04pOwotICAgICAgICAgICAgaWYgKHNob3VsZEFwcGVuZENoYXJzZXRQYXJhbShkaXNwbGF5TmFtZSkpIHsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQobVZDYXJkQ2hhcnNldFBhcmFtZXRlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlVG9EaXNwbGF5TmFtZSkgewotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9FTkNPRElOR19RUCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfREFUQV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKGVuY29kZWREaXNwbGF5TmFtZSk7Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfSVRFTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0lURU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9JVEVNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfSVRFTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0VORF9PRl9MSU5FKTsKLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9GTik7Ci0KLSAgICAgICAgICAgIC8vIE5vdGU6ICJDSEFSU0VUIiBwYXJhbSBpcyBub3QgYWxsb3dlZCBpbiB2Q2FyZCAzLjAsIGJ1dCB3ZSBtYXkgYWRkIGl0Ci0gICAgICAgICAgICAvLyAgICAgICB3aGVuIGl0IHdvdWxkIGJlIHVzZWZ1bCBmb3IgZXh0ZXJuYWwgaW1wb3J0ZXJzLCBhc3N1bWluZyBubyBleHRlcm5hbAotICAgICAgICAgICAgLy8gICAgICAgaW1wb3J0ZXIgYWxsb3dzIHRoaXMgdmlvcmF0aW9uLgotICAgICAgICAgICAgaWYgKHNob3VsZEFwcGVuZENoYXJzZXRQYXJhbShkaXNwbGF5TmFtZSkpIHsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQobVZDYXJkQ2hhcnNldFBhcmFtZXRlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfREFUQV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKGVuY29kZWREaXNwbGF5TmFtZSk7Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfRU5EX09GX0xJTkUpOwotICAgICAgICB9IGVsc2UgaWYgKG1Jc1YzMCkgewotICAgICAgICAgICAgLy8gdkNhcmQgMy4wIHNwZWNpZmljYXRpb24gcmVxdWlyZXMgdGhlc2UgZmllbGRzLgotICAgICAgICAgICAgYXBwZW5kTGluZShWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9OLCAiIik7Ci0gICAgICAgICAgICBhcHBlbmRMaW5lKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX0ZOLCAiIik7Ci0gICAgICAgIH0gZWxzZSBpZiAobUlzRG9Db01vKSB7Ci0gICAgICAgICAgICBhcHBlbmRMaW5lKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX04sICIiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGFwcGVuZFBob25ldGljTmFtZUZpZWxkcyhjb250ZW50VmFsdWVzKTsKLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFwcGVuZFBob25ldGljTmFtZUZpZWxkcyhmaW5hbCBDb250ZW50VmFsdWVzIGNvbnRlbnRWYWx1ZXMpIHsKLSAgICAgICAgZmluYWwgU3RyaW5nIHBob25ldGljRmFtaWx5TmFtZTsKLSAgICAgICAgZmluYWwgU3RyaW5nIHBob25ldGljTWlkZGxlTmFtZTsKLSAgICAgICAgZmluYWwgU3RyaW5nIHBob25ldGljR2l2ZW5OYW1lOwotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgdG1wUGhvbmV0aWNGYW1pbHlOYW1lID0KLSAgICAgICAgICAgICAgICBjb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKFN0cnVjdHVyZWROYW1lLlBIT05FVElDX0ZBTUlMWV9OQU1FKTsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyB0bXBQaG9uZXRpY01pZGRsZU5hbWUgPQotICAgICAgICAgICAgICAgIGNvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfTUlERExFX05BTUUpOwotICAgICAgICAgICAgZmluYWwgU3RyaW5nIHRtcFBob25ldGljR2l2ZW5OYW1lID0KLSAgICAgICAgICAgICAgICBjb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKFN0cnVjdHVyZWROYW1lLlBIT05FVElDX0dJVkVOX05BTUUpOwotICAgICAgICAgICAgaWYgKG1OZWVkc1RvQ29udmVydFBob25ldGljU3RyaW5nKSB7Ci0gICAgICAgICAgICAgICAgcGhvbmV0aWNGYW1pbHlOYW1lID0gVkNhcmRVdGlscy50b0hhbGZXaWR0aFN0cmluZyh0bXBQaG9uZXRpY0ZhbWlseU5hbWUpOwotICAgICAgICAgICAgICAgIHBob25ldGljTWlkZGxlTmFtZSA9IFZDYXJkVXRpbHMudG9IYWxmV2lkdGhTdHJpbmcodG1wUGhvbmV0aWNNaWRkbGVOYW1lKTsKLSAgICAgICAgICAgICAgICBwaG9uZXRpY0dpdmVuTmFtZSA9IFZDYXJkVXRpbHMudG9IYWxmV2lkdGhTdHJpbmcodG1wUGhvbmV0aWNHaXZlbk5hbWUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBwaG9uZXRpY0ZhbWlseU5hbWUgPSB0bXBQaG9uZXRpY0ZhbWlseU5hbWU7Ci0gICAgICAgICAgICAgICAgcGhvbmV0aWNNaWRkbGVOYW1lID0gdG1wUGhvbmV0aWNNaWRkbGVOYW1lOwotICAgICAgICAgICAgICAgIHBob25ldGljR2l2ZW5OYW1lID0gdG1wUGhvbmV0aWNHaXZlbk5hbWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkocGhvbmV0aWNGYW1pbHlOYW1lKQotICAgICAgICAgICAgICAgICYmIFRleHRVdGlscy5pc0VtcHR5KHBob25ldGljTWlkZGxlTmFtZSkKLSAgICAgICAgICAgICAgICAmJiBUZXh0VXRpbHMuaXNFbXB0eShwaG9uZXRpY0dpdmVuTmFtZSkpIHsKLSAgICAgICAgICAgIGlmIChtSXNEb0NvTW8pIHsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfU09VTkQpOwotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX1hfSVJNQ19OKTsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfREFUQV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9JVEVNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0lURU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfSVRFTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9JVEVNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0VORF9PRl9MSU5FKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFRyeSB0byBlbWl0IHRoZSBmaWVsZChzKSByZWxhdGVkIHRvIHBob25ldGljIG5hbWUuCi0gICAgICAgIGlmIChtSXNWMzApIHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBzb3J0U3RyaW5nID0gVkNhcmRVdGlscwotICAgICAgICAgICAgICAgICAgICAuY29uc3RydWN0TmFtZUZyb21FbGVtZW50cyhtVkNhcmRUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBob25ldGljRmFtaWx5TmFtZSwgcGhvbmV0aWNNaWRkbGVOYW1lLCBwaG9uZXRpY0dpdmVuTmFtZSk7Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfU09SVF9TVFJJTkcpOwotICAgICAgICAgICAgaWYgKHNob3VsZEFwcGVuZENoYXJzZXRQYXJhbShzb3J0U3RyaW5nKSkgewotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChtVkNhcmRDaGFyc2V0UGFyYW1ldGVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9EQVRBX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoZXNjYXBlQ2hhcmFjdGVycyhzb3J0U3RyaW5nKSk7Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfRU5EX09GX0xJTkUpOwotICAgICAgICB9IGVsc2UgaWYgKG1Jc0phcGFuZXNlTW9iaWxlUGhvbmUpIHsKLSAgICAgICAgICAgIC8vIE5vdGU6IFRoZXJlIGlzIG5vIGFwcHJvcHJpYXRlIHByb3BlcnR5IGZvciBleHByZXNzaW5nCi0gICAgICAgICAgICAvLyAgICAgICBwaG9uZXRpYyBuYW1lIGluIHZDYXJkIDIuMSwgd2hpbGUgdGhlcmUgaXMgaW4KLSAgICAgICAgICAgIC8vICAgICAgIHZDYXJkIDMuMCAoU09SVC1TVFJJTkcpLgotICAgICAgICAgICAgLy8gICAgICAgV2UgY2hvc2UgdG8gdXNlIERvQ29NbydzIHdheSB3aGVuIHRoZSBkZXZpY2UgaXMgSmFwYW5lc2Ugb25lCi0gICAgICAgICAgICAvLyAgICAgICBzaW5jZSBpdCBpcyBzdXBwb3J0ZWQgYnkKLSAgICAgICAgICAgIC8vICAgICAgIGEgbG90IG9mIEphcGFuZXNlIG1vYmlsZSBwaG9uZXMuIFRoaXMgaXMgIlgtIiBwcm9wZXJ0eSwgc28KLSAgICAgICAgICAgIC8vICAgICAgIGFueSBwYXJzZXIgaG9wZWZ1bGx5IHdvdWxkIG5vdCBnZXQgY29uZnVzZWQgd2l0aCB0aGlzLgotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIC8vICAgICAgIEFsc28sIERvQ29NbydzIHNwZWNpZmljYXRpb24gcmVxdWlyZXMgdkNhcmQgY29tcG9zZXIgdG8gdXNlIGp1c3QgdGhlIGZpcnN0Ci0gICAgICAgICAgICAvLyAgICAgICBjb2x1bW4uCi0gICAgICAgICAgICAvLyAgICAgICBpLmUuCi0gICAgICAgICAgICAvLyAgICAgICBvICBTT1VORDtYLUlSTUMtTjpNaXlha2F3YSBEYWlzdWtlOzs7OwotICAgICAgICAgICAgLy8gICAgICAgeCAgU09VTkQ7WC1JUk1DLU46TWl5YWthd2E7RGFpc3VrZTs7OwotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1NPVU5EKTsKLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfWF9JUk1DX04pOwotCi0gICAgICAgICAgICBib29sZWFuIHJlYWxseVVzZVF1b3RlZFByaW50YWJsZSA9Ci0gICAgICAgICAgICAgICAgKCFtUmVmcmFpbnNRUFRvTmFtZVByb3BlcnRpZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICYmICEoVkNhcmRVdGlscy5jb250YWluc09ubHlOb25DckxmUHJpbnRhYmxlQXNjaWkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBob25ldGljRmFtaWx5TmFtZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgVkNhcmRVdGlscy5jb250YWluc09ubHlOb25DckxmUHJpbnRhYmxlQXNjaWkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGhvbmV0aWNNaWRkbGVOYW1lKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBWQ2FyZFV0aWxzLmNvbnRhaW5zT25seU5vbkNyTGZQcmludGFibGVBc2NpaSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaG9uZXRpY0dpdmVuTmFtZSkpKTsKLQotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGVuY29kZWRQaG9uZXRpY0ZhbWlseU5hbWU7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgZW5jb2RlZFBob25ldGljTWlkZGxlTmFtZTsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBlbmNvZGVkUGhvbmV0aWNHaXZlbk5hbWU7Ci0gICAgICAgICAgICBpZiAocmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlKSB7Ci0gICAgICAgICAgICAgICAgZW5jb2RlZFBob25ldGljRmFtaWx5TmFtZSA9IGVuY29kZVF1b3RlZFByaW50YWJsZShwaG9uZXRpY0ZhbWlseU5hbWUpOwotICAgICAgICAgICAgICAgIGVuY29kZWRQaG9uZXRpY01pZGRsZU5hbWUgPSBlbmNvZGVRdW90ZWRQcmludGFibGUocGhvbmV0aWNNaWRkbGVOYW1lKTsKLSAgICAgICAgICAgICAgICBlbmNvZGVkUGhvbmV0aWNHaXZlbk5hbWUgPSBlbmNvZGVRdW90ZWRQcmludGFibGUocGhvbmV0aWNHaXZlbk5hbWUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBlbmNvZGVkUGhvbmV0aWNGYW1pbHlOYW1lID0gZXNjYXBlQ2hhcmFjdGVycyhwaG9uZXRpY0ZhbWlseU5hbWUpOwotICAgICAgICAgICAgICAgIGVuY29kZWRQaG9uZXRpY01pZGRsZU5hbWUgPSBlc2NhcGVDaGFyYWN0ZXJzKHBob25ldGljTWlkZGxlTmFtZSk7Ci0gICAgICAgICAgICAgICAgZW5jb2RlZFBob25ldGljR2l2ZW5OYW1lID0gZXNjYXBlQ2hhcmFjdGVycyhwaG9uZXRpY0dpdmVuTmFtZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChzaG91bGRBcHBlbmRDaGFyc2V0UGFyYW0oZW5jb2RlZFBob25ldGljRmFtaWx5TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgZW5jb2RlZFBob25ldGljTWlkZGxlTmFtZSwgZW5jb2RlZFBob25ldGljR2l2ZW5OYW1lKSkgewotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChtVkNhcmRDaGFyc2V0UGFyYW1ldGVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9EQVRBX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBmaXJzdCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShlbmNvZGVkUGhvbmV0aWNGYW1pbHlOYW1lKSkgewotICAgICAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoZW5jb2RlZFBob25ldGljRmFtaWx5TmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkoZW5jb2RlZFBob25ldGljTWlkZGxlTmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKCcgJyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKGVuY29kZWRQaG9uZXRpY01pZGRsZU5hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KGVuY29kZWRQaG9uZXRpY0dpdmVuTmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFmaXJzdCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKCcgJyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKGVuY29kZWRQaG9uZXRpY0dpdmVuTmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0lURU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9JVEVNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfSVRFTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0lURU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9FTkRfT0ZfTElORSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobVVzZXNEZWZhY3RQcm9wZXJ0eSkgewotICAgICAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShwaG9uZXRpY0dpdmVuTmFtZSkpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIHJlYWxseVVzZVF1b3RlZFByaW50YWJsZSA9Ci0gICAgICAgICAgICAgICAgICAgIChtU2hvdWxkVXNlUXVvdGVkUHJpbnRhYmxlICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIVZDYXJkVXRpbHMuY29udGFpbnNPbmx5Tm9uQ3JMZlByaW50YWJsZUFzY2lpKHBob25ldGljR2l2ZW5OYW1lKSk7Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGVuY29kZWRQaG9uZXRpY0dpdmVuTmFtZTsKLSAgICAgICAgICAgICAgICBpZiAocmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGVuY29kZWRQaG9uZXRpY0dpdmVuTmFtZSA9IGVuY29kZVF1b3RlZFByaW50YWJsZShwaG9uZXRpY0dpdmVuTmFtZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZW5jb2RlZFBob25ldGljR2l2ZW5OYW1lID0gZXNjYXBlQ2hhcmFjdGVycyhwaG9uZXRpY0dpdmVuTmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9YX1BIT05FVElDX0ZJUlNUX05BTUUpOwotICAgICAgICAgICAgICAgIGlmIChzaG91bGRBcHBlbmRDaGFyc2V0UGFyYW0ocGhvbmV0aWNHaXZlbk5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQobVZDYXJkQ2hhcnNldFBhcmFtZXRlcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChyZWFsbHlVc2VRdW90ZWRQcmludGFibGUpIHsKLSAgICAgICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9FTkNPRElOR19RUCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9EQVRBX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKGVuY29kZWRQaG9uZXRpY0dpdmVuTmFtZSk7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0VORF9PRl9MSU5FKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkocGhvbmV0aWNNaWRkbGVOYW1lKSkgewotICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gcmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlID0KLSAgICAgICAgICAgICAgICAgICAgKG1TaG91bGRVc2VRdW90ZWRQcmludGFibGUgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAhVkNhcmRVdGlscy5jb250YWluc09ubHlOb25DckxmUHJpbnRhYmxlQXNjaWkocGhvbmV0aWNNaWRkbGVOYW1lKSk7Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGVuY29kZWRQaG9uZXRpY01pZGRsZU5hbWU7Ci0gICAgICAgICAgICAgICAgaWYgKHJlYWxseVVzZVF1b3RlZFByaW50YWJsZSkgewotICAgICAgICAgICAgICAgICAgICBlbmNvZGVkUGhvbmV0aWNNaWRkbGVOYW1lID0gZW5jb2RlUXVvdGVkUHJpbnRhYmxlKHBob25ldGljTWlkZGxlTmFtZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZW5jb2RlZFBob25ldGljTWlkZGxlTmFtZSA9IGVzY2FwZUNoYXJhY3RlcnMocGhvbmV0aWNNaWRkbGVOYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1hfUEhPTkVUSUNfTUlERExFX05BTUUpOwotICAgICAgICAgICAgICAgIGlmIChzaG91bGRBcHBlbmRDaGFyc2V0UGFyYW0ocGhvbmV0aWNNaWRkbGVOYW1lKSkgewotICAgICAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKG1WQ2FyZENoYXJzZXRQYXJhbWV0ZXIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAocmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fRU5DT0RJTkdfUVApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfREFUQV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChlbmNvZGVkUGhvbmV0aWNNaWRkbGVOYW1lKTsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfRU5EX09GX0xJTkUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShwaG9uZXRpY0ZhbWlseU5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiByZWFsbHlVc2VRdW90ZWRQcmludGFibGUgPQotICAgICAgICAgICAgICAgICAgICAobVNob3VsZFVzZVF1b3RlZFByaW50YWJsZSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICFWQ2FyZFV0aWxzLmNvbnRhaW5zT25seU5vbkNyTGZQcmludGFibGVBc2NpaShwaG9uZXRpY0ZhbWlseU5hbWUpKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZW5jb2RlZFBob25ldGljRmFtaWx5TmFtZTsKLSAgICAgICAgICAgICAgICBpZiAocmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGVuY29kZWRQaG9uZXRpY0ZhbWlseU5hbWUgPSBlbmNvZGVRdW90ZWRQcmludGFibGUocGhvbmV0aWNGYW1pbHlOYW1lKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBlbmNvZGVkUGhvbmV0aWNGYW1pbHlOYW1lID0gZXNjYXBlQ2hhcmFjdGVycyhwaG9uZXRpY0ZhbWlseU5hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfWF9QSE9ORVRJQ19MQVNUX05BTUUpOwotICAgICAgICAgICAgICAgIGlmIChzaG91bGRBcHBlbmRDaGFyc2V0UGFyYW0ocGhvbmV0aWNGYW1pbHlOYW1lKSkgewotICAgICAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKG1WQ2FyZENoYXJzZXRQYXJhbWV0ZXIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAocmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fRU5DT0RJTkdfUVApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfREFUQV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChlbmNvZGVkUGhvbmV0aWNGYW1pbHlOYW1lKTsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfRU5EX09GX0xJTkUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFZDYXJkQnVpbGRlciBhcHBlbmROaWNrTmFtZXMoZmluYWwgTGlzdDxDb250ZW50VmFsdWVzPiBjb250ZW50VmFsdWVzTGlzdCkgewotICAgICAgICBmaW5hbCBib29sZWFuIHVzZUFuZHJvaWRQcm9wZXJ0eTsKLSAgICAgICAgaWYgKG1Jc1YzMCkgewotICAgICAgICAgICAgdXNlQW5kcm9pZFByb3BlcnR5ID0gZmFsc2U7Ci0gICAgICAgIH0gZWxzZSBpZiAobVVzZXNBbmRyb2lkUHJvcGVydHkpIHsKLSAgICAgICAgICAgIHVzZUFuZHJvaWRQcm9wZXJ0eSA9IHRydWU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBUaGVyZSdzIG5vIHdheSB0byBhZGQgdGhpcyBmaWVsZC4KLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjb250ZW50VmFsdWVzTGlzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKENvbnRlbnRWYWx1ZXMgY29udGVudFZhbHVlcyA6IGNvbnRlbnRWYWx1ZXNMaXN0KSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIG5pY2tuYW1lID0gY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhOaWNrbmFtZS5OQU1FKTsKLSAgICAgICAgICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkobmlja25hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAodXNlQW5kcm9pZFByb3BlcnR5KSB7Ci0gICAgICAgICAgICAgICAgICAgIGFwcGVuZEFuZHJvaWRTcGVjaWZpY1Byb3BlcnR5KE5pY2tuYW1lLkNPTlRFTlRfSVRFTV9UWVBFLCBjb250ZW50VmFsdWVzKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBhcHBlbmRMaW5lV2l0aENoYXJzZXRBbmRRUERldGVjdGlvbihWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9OSUNLTkFNRSwgbmlja25hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVkNhcmRCdWlsZGVyIGFwcGVuZFBob25lcyhmaW5hbCBMaXN0PENvbnRlbnRWYWx1ZXM+IGNvbnRlbnRWYWx1ZXNMaXN0KSB7Ci0gICAgICAgIGJvb2xlYW4gcGhvbmVMaW5lRXhpc3RzID0gZmFsc2U7Ci0gICAgICAgIGlmIChjb250ZW50VmFsdWVzTGlzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTZXQ8U3RyaW5nPiBwaG9uZVNldCA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLSAgICAgICAgICAgIGZvciAoQ29udGVudFZhbHVlcyBjb250ZW50VmFsdWVzIDogY29udGVudFZhbHVlc0xpc3QpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBJbnRlZ2VyIHR5cGVBc09iamVjdCA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNJbnRlZ2VyKFBob25lLlRZUEUpOwotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBsYWJlbCA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoUGhvbmUuTEFCRUwpOwotICAgICAgICAgICAgICAgIGZpbmFsIEludGVnZXIgaXNQcmltYXJ5QXNJbnRlZ2VyID0gY29udGVudFZhbHVlcy5nZXRBc0ludGVnZXIoUGhvbmUuSVNfUFJJTUFSWSk7Ci0gICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBpc1ByaW1hcnkgPSAoaXNQcmltYXJ5QXNJbnRlZ2VyICE9IG51bGwgPwotICAgICAgICAgICAgICAgICAgICAgICAgKGlzUHJpbWFyeUFzSW50ZWdlciA+IDApIDogZmFsc2UpOwotICAgICAgICAgICAgICAgIFN0cmluZyBwaG9uZU51bWJlciA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoUGhvbmUuTlVNQkVSKTsKLSAgICAgICAgICAgICAgICBpZiAocGhvbmVOdW1iZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwaG9uZU51bWJlciA9IHBob25lTnVtYmVyLnRyaW0oKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHBob25lTnVtYmVyKSkgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBQQUdFUiBudW1iZXIgbmVlZHMgdW5mb3JtYXR0ZWQgInBob25lIG51bWJlciIuCi0gICAgICAgICAgICAgICAgZmluYWwgaW50IHR5cGUgPSAodHlwZUFzT2JqZWN0ICE9IG51bGwgPyB0eXBlQXNPYmplY3QgOiBERUZBVUxUX1BIT05FX1RZUEUpOwotICAgICAgICAgICAgICAgIGlmICh0eXBlID09IFBob25lLlRZUEVfUEFHRVIgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIFZDYXJkQ29uZmlnLnJlZnJhaW5QaG9uZU51bWJlckZvcm1hdHRpbmcobVZDYXJkVHlwZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcGhvbmVMaW5lRXhpc3RzID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFwaG9uZVNldC5jb250YWlucyhwaG9uZU51bWJlcikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBob25lU2V0LmFkZChwaG9uZU51bWJlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmRUZWxMaW5lKHR5cGUsIGxhYmVsLCBwaG9uZU51bWJlciwgaXNQcmltYXJ5KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIExpc3Q8U3RyaW5nPiBwaG9uZU51bWJlckxpc3QgPSBzcGxpdEFuZFRyaW1QaG9uZU51bWJlcnMocGhvbmVOdW1iZXIpOwotICAgICAgICAgICAgICAgICAgICBpZiAocGhvbmVOdW1iZXJMaXN0LmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcGhvbmVMaW5lRXhpc3RzID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgYWN0dWFsUGhvbmVOdW1iZXIgOiBwaG9uZU51bWJlckxpc3QpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcGhvbmVTZXQuY29udGFpbnMoYWN0dWFsUGhvbmVOdW1iZXIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGZvcm1hdCA9IFZDYXJkVXRpbHMuZ2V0UGhvbmVOdW1iZXJGb3JtYXQobVZDYXJkVHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGZvcm1hdHRlZFBob25lTnVtYmVyID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuZm9ybWF0TnVtYmVyKGFjdHVhbFBob25lTnVtYmVyLCBmb3JtYXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBob25lU2V0LmFkZChhY3R1YWxQaG9uZU51bWJlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kVGVsTGluZSh0eXBlLCBsYWJlbCwgZm9ybWF0dGVkUGhvbmVOdW1iZXIsIGlzUHJpbWFyeSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gIC8vIGZvciAoU3RyaW5nIGFjdHVhbFBob25lTnVtYmVyIDogcGhvbmVOdW1iZXJMaXN0KSB7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFwaG9uZUxpbmVFeGlzdHMgJiYgbUlzRG9Db01vKSB7Ci0gICAgICAgICAgICBhcHBlbmRUZWxMaW5lKFBob25lLlRZUEVfSE9NRSwgIiIsICIiLCBmYWxzZSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBTcGxpdHMgYSBnaXZlbiBzdHJpbmcgZXhwcmVzc2luZyBwaG9uZSBudW1iZXJzIGludG8gc2V2ZXJhbCBzdHJpbmdzLCBhbmQgcmVtb3ZlCi0gICAgICogdW5uZWNlc3NhcnkgY2hhcmFjdGVycyBpbnNpZGUgdGhlbS4gVGhlIHNpemUgb2YgYSByZXR1cm5lZCBsaXN0IGJlY29tZXMgMSB3aGVuCi0gICAgICogbm8gc3BsaXQgaXMgbmVlZGVkLgotICAgICAqIDwvcD4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgZ2l2ZW4gbnVtYmVyICJtYXkiIGhhdmUgc2V2ZXJhbCBwaG9uZSBudW1iZXJzIHdoZW4gdGhlIGNvbnRhY3QgZW50cnkgaXMgY29ycnVwdGVkCi0gICAgICogYmVjYXVzZSBvZiBpdHMgb3JpZ2luYWwgc291cmNlLgotICAgICAqIGUuZy4gIjExMS0yMjItMzMzMyAoTWlhbWkpXG40NDQtNTU1LTY2NjYgKEJyb3dhcmQ7IDMwNS02NTMtNjc5NiAoTWlhbWkpIgotICAgICAqIDwvcD4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGtpbmQgb2YgInBob25lIG51bWJlcnMiIHdpbGwgbm90IGJlIGNyZWF0ZWQgd2l0aCBBbmRyb2lkIHZDYXJkIGltcGxlbWVudGF0aW9uLAotICAgICAqIGJ1dCB3ZSBtYXkgZW5jb3VudGVyIHRoZW0gaWYgdGhlIHNvdXJjZSBvZiB0aGUgaW5wdXQgZGF0YSBoYXMgYWxyZWFkeSBjb3JydXB0ZWQKLSAgICAgKiBpbXBsZW1lbnRhdGlvbi4KLSAgICAgKiA8L3A+Ci0gICAgICogPHA+Ci0gICAgICogVG8gaGFuZGxlIHRoaXMgY2FzZSwgdGhpcyBtZXRob2QgZmlyc3Qgc3BsaXRzIGl0cyBpbnB1dCBpbnRvIG11bHRpcGxlIHBhcnRzCi0gICAgICogKGUuZy4gIjExMS0yMjItMzMzMyAoTWlhbWkpIiwgIjQ0NC01NTUtNjY2NiAoQnJvd2FyZCIsIGFuZCAzMDU2NTMtNjc5NiAoTWlhbWkpIikgYW5kCi0gICAgICogcmVtb3ZlcyB1bm5lY2Vzc2FyeSBzdHJpbmdzIGxpa2UgIihNaWFtaSkiLgotICAgICAqIDwvcD4KLSAgICAgKiA8cD4KLSAgICAgKiBEbyBub3QgY2FsbCB0aGlzIG1ldGhvZCB3aGVuIHRyaW1taW5nIGlzIGluYXBwcm9wcmlhdGUgZm9yIGl0cyByZWNlaXZlcnMuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IHNwbGl0QW5kVHJpbVBob25lTnVtYmVycyhmaW5hbCBTdHJpbmcgcGhvbmVOdW1iZXIpIHsKLSAgICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IHBob25lTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCi0gICAgICAgIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIGZpbmFsIGludCBsZW5ndGggPSBwaG9uZU51bWJlci5sZW5ndGgoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotICAgICAgICAgICAgZmluYWwgY2hhciBjaCA9IHBob25lTnVtYmVyLmNoYXJBdChpKTsKLSAgICAgICAgICAgIGlmIChDaGFyYWN0ZXIuaXNEaWdpdChjaCkgfHwgY2ggPT0gJysnKSB7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoY2gpOwotICAgICAgICAgICAgfSBlbHNlIGlmICgoY2ggPT0gJzsnIHx8IGNoID09ICdcbicpICYmIGJ1aWxkZXIubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgcGhvbmVMaXN0LmFkZChidWlsZGVyLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChidWlsZGVyLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgcGhvbmVMaXN0LmFkZChidWlsZGVyLnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHBob25lTGlzdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVkNhcmRCdWlsZGVyIGFwcGVuZEVtYWlscyhmaW5hbCBMaXN0PENvbnRlbnRWYWx1ZXM+IGNvbnRlbnRWYWx1ZXNMaXN0KSB7Ci0gICAgICAgIGJvb2xlYW4gZW1haWxBZGRyZXNzRXhpc3RzID0gZmFsc2U7Ci0gICAgICAgIGlmIChjb250ZW50VmFsdWVzTGlzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmaW5hbCBTZXQ8U3RyaW5nPiBhZGRyZXNzU2V0ID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotICAgICAgICAgICAgZm9yIChDb250ZW50VmFsdWVzIGNvbnRlbnRWYWx1ZXMgOiBjb250ZW50VmFsdWVzTGlzdCkgewotICAgICAgICAgICAgICAgIFN0cmluZyBlbWFpbEFkZHJlc3MgPSBjb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKEVtYWlsLkRBVEEpOwotICAgICAgICAgICAgICAgIGlmIChlbWFpbEFkZHJlc3MgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBlbWFpbEFkZHJlc3MgPSBlbWFpbEFkZHJlc3MudHJpbSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkoZW1haWxBZGRyZXNzKSkgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgSW50ZWdlciB0eXBlQXNPYmplY3QgPSBjb250ZW50VmFsdWVzLmdldEFzSW50ZWdlcihFbWFpbC5UWVBFKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgdHlwZSA9ICh0eXBlQXNPYmplY3QgIT0gbnVsbCA/Ci0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlQXNPYmplY3QgOiBERUZBVUxUX0VNQUlMX1RZUEUpOwotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBsYWJlbCA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoRW1haWwuTEFCRUwpOwotICAgICAgICAgICAgICAgIEludGVnZXIgaXNQcmltYXJ5QXNJbnRlZ2VyID0gY29udGVudFZhbHVlcy5nZXRBc0ludGVnZXIoRW1haWwuSVNfUFJJTUFSWSk7Ci0gICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBpc1ByaW1hcnkgPSAoaXNQcmltYXJ5QXNJbnRlZ2VyICE9IG51bGwgPwotICAgICAgICAgICAgICAgICAgICAgICAgKGlzUHJpbWFyeUFzSW50ZWdlciA+IDApIDogZmFsc2UpOwotICAgICAgICAgICAgICAgIGVtYWlsQWRkcmVzc0V4aXN0cyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgaWYgKCFhZGRyZXNzU2V0LmNvbnRhaW5zKGVtYWlsQWRkcmVzcykpIHsKLSAgICAgICAgICAgICAgICAgICAgYWRkcmVzc1NldC5hZGQoZW1haWxBZGRyZXNzKTsKLSAgICAgICAgICAgICAgICAgICAgYXBwZW5kRW1haWxMaW5lKHR5cGUsIGxhYmVsLCBlbWFpbEFkZHJlc3MsIGlzUHJpbWFyeSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFlbWFpbEFkZHJlc3NFeGlzdHMgJiYgbUlzRG9Db01vKSB7Ci0gICAgICAgICAgICBhcHBlbmRFbWFpbExpbmUoRW1haWwuVFlQRV9IT01FLCAiIiwgIiIsIGZhbHNlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIHB1YmxpYyBWQ2FyZEJ1aWxkZXIgYXBwZW5kUG9zdGFscyhmaW5hbCBMaXN0PENvbnRlbnRWYWx1ZXM+IGNvbnRlbnRWYWx1ZXNMaXN0KSB7Ci0gICAgICAgIGlmIChjb250ZW50VmFsdWVzTGlzdCA9PSBudWxsIHx8IGNvbnRlbnRWYWx1ZXNMaXN0LmlzRW1wdHkoKSkgewotICAgICAgICAgICAgaWYgKG1Jc0RvQ29NbykgewotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9BRFIpOwotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX0hPTUUpOwotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9EQVRBX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0VORF9PRl9MSU5FKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChtSXNEb0NvTW8pIHsKLSAgICAgICAgICAgICAgICBhcHBlbmRQb3N0YWxzRm9yRG9Db01vKGNvbnRlbnRWYWx1ZXNMaXN0KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYXBwZW5kUG9zdGFsc0ZvckdlbmVyaWMoY29udGVudFZhbHVlc0xpc3QpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPEludGVnZXIsIEludGVnZXI+IHNQb3N0YWxUeXBlUHJpb3JpdHlNYXA7Ci0KLSAgICBzdGF0aWMgewotICAgICAgICBzUG9zdGFsVHlwZVByaW9yaXR5TWFwID0gbmV3IEhhc2hNYXA8SW50ZWdlciwgSW50ZWdlcj4oKTsKLSAgICAgICAgc1Bvc3RhbFR5cGVQcmlvcml0eU1hcC5wdXQoU3RydWN0dXJlZFBvc3RhbC5UWVBFX0hPTUUsIDApOwotICAgICAgICBzUG9zdGFsVHlwZVByaW9yaXR5TWFwLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlRZUEVfV09SSywgMSk7Ci0gICAgICAgIHNQb3N0YWxUeXBlUHJpb3JpdHlNYXAucHV0KFN0cnVjdHVyZWRQb3N0YWwuVFlQRV9PVEhFUiwgMik7Ci0gICAgICAgIHNQb3N0YWxUeXBlUHJpb3JpdHlNYXAucHV0KFN0cnVjdHVyZWRQb3N0YWwuVFlQRV9DVVNUT00sIDMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRyaWVzIHRvIGFwcGVuZCBqdXN0IG9uZSBsaW5lLiBJZiB0aGVyZSdzIG5vIGFwcHJvcHJpYXRlIGFkZHJlc3MKLSAgICAgKiBpbmZvcm1hdGlvbiwgYXBwZW5kIGFuIGVtcHR5IGxpbmUuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGFwcGVuZFBvc3RhbHNGb3JEb0NvTW8oZmluYWwgTGlzdDxDb250ZW50VmFsdWVzPiBjb250ZW50VmFsdWVzTGlzdCkgewotICAgICAgICBpbnQgY3VycmVudFByaW9yaXR5ID0gSW50ZWdlci5NQVhfVkFMVUU7Ci0gICAgICAgIGludCBjdXJyZW50VHlwZSA9IEludGVnZXIuTUFYX1ZBTFVFOwotICAgICAgICBDb250ZW50VmFsdWVzIGN1cnJlbnRDb250ZW50VmFsdWVzID0gbnVsbDsKLSAgICAgICAgZm9yIChmaW5hbCBDb250ZW50VmFsdWVzIGNvbnRlbnRWYWx1ZXMgOiBjb250ZW50VmFsdWVzTGlzdCkgewotICAgICAgICAgICAgaWYgKGNvbnRlbnRWYWx1ZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmluYWwgSW50ZWdlciB0eXBlQXNJbnRlZ2VyID0gY29udGVudFZhbHVlcy5nZXRBc0ludGVnZXIoU3RydWN0dXJlZFBvc3RhbC5UWVBFKTsKLSAgICAgICAgICAgIGZpbmFsIEludGVnZXIgcHJpb3JpdHlBc0ludGVnZXIgPSBzUG9zdGFsVHlwZVByaW9yaXR5TWFwLmdldCh0eXBlQXNJbnRlZ2VyKTsKLSAgICAgICAgICAgIGZpbmFsIGludCBwcmlvcml0eSA9Ci0gICAgICAgICAgICAgICAgICAgIChwcmlvcml0eUFzSW50ZWdlciAhPSBudWxsID8gcHJpb3JpdHlBc0ludGVnZXIgOiBJbnRlZ2VyLk1BWF9WQUxVRSk7Ci0gICAgICAgICAgICBpZiAocHJpb3JpdHkgPCBjdXJyZW50UHJpb3JpdHkpIHsKLSAgICAgICAgICAgICAgICBjdXJyZW50UHJpb3JpdHkgPSBwcmlvcml0eTsKLSAgICAgICAgICAgICAgICBjdXJyZW50VHlwZSA9IHR5cGVBc0ludGVnZXI7Ci0gICAgICAgICAgICAgICAgY3VycmVudENvbnRlbnRWYWx1ZXMgPSBjb250ZW50VmFsdWVzOwotICAgICAgICAgICAgICAgIGlmIChwcmlvcml0eSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChjdXJyZW50Q29udGVudFZhbHVlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBMb2cudyhMT0dfVEFHLCAiU2hvdWxkIG5vdCBjb21lIGhlcmUuIE11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgcG9zdGFsIGRhdGEuIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBTdHJpbmcgbGFiZWwgPSBjdXJyZW50Q29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhTdHJ1Y3R1cmVkUG9zdGFsLkxBQkVMKTsKLSAgICAgICAgYXBwZW5kUG9zdGFsTGluZShjdXJyZW50VHlwZSwgbGFiZWwsIGN1cnJlbnRDb250ZW50VmFsdWVzLCBmYWxzZSwgdHJ1ZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFwcGVuZFBvc3RhbHNGb3JHZW5lcmljKGZpbmFsIExpc3Q8Q29udGVudFZhbHVlcz4gY29udGVudFZhbHVlc0xpc3QpIHsKLSAgICAgICAgZm9yIChmaW5hbCBDb250ZW50VmFsdWVzIGNvbnRlbnRWYWx1ZXMgOiBjb250ZW50VmFsdWVzTGlzdCkgewotICAgICAgICAgICAgaWYgKGNvbnRlbnRWYWx1ZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmluYWwgSW50ZWdlciB0eXBlQXNJbnRlZ2VyID0gY29udGVudFZhbHVlcy5nZXRBc0ludGVnZXIoU3RydWN0dXJlZFBvc3RhbC5UWVBFKTsKLSAgICAgICAgICAgIGZpbmFsIGludCB0eXBlID0gKHR5cGVBc0ludGVnZXIgIT0gbnVsbCA/Ci0gICAgICAgICAgICAgICAgICAgIHR5cGVBc0ludGVnZXIgOiBERUZBVUxUX1BPU1RBTF9UWVBFKTsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBsYWJlbCA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoU3RydWN0dXJlZFBvc3RhbC5MQUJFTCk7Ci0gICAgICAgICAgICBmaW5hbCBJbnRlZ2VyIGlzUHJpbWFyeUFzSW50ZWdlciA9Ci0gICAgICAgICAgICAgICAgY29udGVudFZhbHVlcy5nZXRBc0ludGVnZXIoU3RydWN0dXJlZFBvc3RhbC5JU19QUklNQVJZKTsKLSAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gaXNQcmltYXJ5ID0gKGlzUHJpbWFyeUFzSW50ZWdlciAhPSBudWxsID8KLSAgICAgICAgICAgICAgICAgICAgKGlzUHJpbWFyeUFzSW50ZWdlciA+IDApIDogZmFsc2UpOwotICAgICAgICAgICAgYXBwZW5kUG9zdGFsTGluZSh0eXBlLCBsYWJlbCwgY29udGVudFZhbHVlcywgaXNQcmltYXJ5LCBmYWxzZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBQb3N0YWxTdHJ1Y3QgewotICAgICAgICBmaW5hbCBib29sZWFuIHJlYWxseVVzZVF1b3RlZFByaW50YWJsZTsKLSAgICAgICAgZmluYWwgYm9vbGVhbiBhcHBlbmRDaGFyc2V0OwotICAgICAgICBmaW5hbCBTdHJpbmcgYWRkcmVzc0RhdGE7Ci0gICAgICAgIHB1YmxpYyBQb3N0YWxTdHJ1Y3QoZmluYWwgYm9vbGVhbiByZWFsbHlVc2VRdW90ZWRQcmludGFibGUsCi0gICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBhcHBlbmRDaGFyc2V0LCBmaW5hbCBTdHJpbmcgYWRkcmVzc0RhdGEpIHsKLSAgICAgICAgICAgIHRoaXMucmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlID0gcmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlOwotICAgICAgICAgICAgdGhpcy5hcHBlbmRDaGFyc2V0ID0gYXBwZW5kQ2hhcnNldDsKLSAgICAgICAgICAgIHRoaXMuYWRkcmVzc0RhdGEgPSBhZGRyZXNzRGF0YTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gbnVsbCB3aGVuIHRoZXJlJ3Mgbm8gaW5mb3JtYXRpb24gYXZhaWxhYmxlIHRvIGNvbnN0cnVjdCB0aGUgZGF0YS4KLSAgICAgKi8KLSAgICBwcml2YXRlIFBvc3RhbFN0cnVjdCB0cnlDb25zdHJ1Y3RQb3N0YWxTdHJ1Y3QoQ29udGVudFZhbHVlcyBjb250ZW50VmFsdWVzKSB7Ci0gICAgICAgIC8vIGFkci12YWx1ZSAgICA9IDAqNih0ZXh0LXZhbHVlICI7IikgdGV4dC12YWx1ZQotICAgICAgICAvLyAgICAgICAgICAgICAgOyBQTyBCb3gsIEV4dGVuZGVkIEFkZHJlc3MsIFN0cmVldCwgTG9jYWxpdHksIFJlZ2lvbiwgUG9zdGFsCi0gICAgICAgIC8vICAgICAgICAgICAgICA7IENvZGUsIENvdW50cnkgTmFtZQotICAgICAgICBmaW5hbCBTdHJpbmcgcmF3UG9Cb3ggPSBjb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKFN0cnVjdHVyZWRQb3N0YWwuUE9CT1gpOwotICAgICAgICBmaW5hbCBTdHJpbmcgcmF3TmVpZ2hib3Job29kID0gY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhTdHJ1Y3R1cmVkUG9zdGFsLk5FSUdIQk9SSE9PRCk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyByYXdTdHJlZXQgPSBjb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKFN0cnVjdHVyZWRQb3N0YWwuU1RSRUVUKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIHJhd0xvY2FsaXR5ID0gY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhTdHJ1Y3R1cmVkUG9zdGFsLkNJVFkpOwotICAgICAgICBmaW5hbCBTdHJpbmcgcmF3UmVnaW9uID0gY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhTdHJ1Y3R1cmVkUG9zdGFsLlJFR0lPTik7Ci0gICAgICAgIGZpbmFsIFN0cmluZyByYXdQb3N0YWxDb2RlID0gY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhTdHJ1Y3R1cmVkUG9zdGFsLlBPU1RDT0RFKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIHJhd0NvdW50cnkgPSBjb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKFN0cnVjdHVyZWRQb3N0YWwuQ09VTlRSWSk7Ci0gICAgICAgIGZpbmFsIFN0cmluZ1tdIHJhd0FkZHJlc3NBcnJheSA9IG5ldyBTdHJpbmdbXXsKLSAgICAgICAgICAgICAgICByYXdQb0JveCwgcmF3TmVpZ2hib3Job29kLCByYXdTdHJlZXQsIHJhd0xvY2FsaXR5LAotICAgICAgICAgICAgICAgIHJhd1JlZ2lvbiwgcmF3UG9zdGFsQ29kZSwgcmF3Q291bnRyeX07Ci0gICAgICAgIGlmICghVkNhcmRVdGlscy5hcmVBbGxFbXB0eShyYXdBZGRyZXNzQXJyYXkpKSB7Ci0gICAgICAgICAgICBmaW5hbCBib29sZWFuIHJlYWxseVVzZVF1b3RlZFByaW50YWJsZSA9Ci0gICAgICAgICAgICAgICAgKG1TaG91bGRVc2VRdW90ZWRQcmludGFibGUgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICFWQ2FyZFV0aWxzLmNvbnRhaW5zT25seU5vbkNyTGZQcmludGFibGVBc2NpaShyYXdBZGRyZXNzQXJyYXkpKTsKLSAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gYXBwZW5kQ2hhcnNldCA9Ci0gICAgICAgICAgICAgICAgIVZDYXJkVXRpbHMuY29udGFpbnNPbmx5UHJpbnRhYmxlQXNjaWkocmF3QWRkcmVzc0FycmF5KTsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBlbmNvZGVkUG9Cb3g7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgZW5jb2RlZFN0cmVldDsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBlbmNvZGVkTG9jYWxpdHk7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgZW5jb2RlZFJlZ2lvbjsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBlbmNvZGVkUG9zdGFsQ29kZTsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBlbmNvZGVkQ291bnRyeTsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBlbmNvZGVkTmVpZ2hib3Job29kOwotCi0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgcmF3TG9jYWxpdHkyOwotICAgICAgICAgICAgLy8gVGhpcyBsb29rcyBpbmVmZmljaWVudCBzaW5jZSB3ZSBlbmNvZGUgcmF3TG9jYWxpdHkgYW5kIHJhd05laWdoYm9yaG9vZCB0d2ljZSwKLSAgICAgICAgICAgIC8vIGJ1dCB0aGlzIGlzIGludGVudGlvbmFsLgotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIC8vIFFQIGVuY29kaW5nIG1heSBhZGQgbGluZSBmZWVkcyB3aGVuIG5lZWRlZCBhbmQgdGhlIHJlc3VsdCBvZgotICAgICAgICAgICAgLy8gLSBlbmNvZGVRdW90ZWRQcmludGFibGUocmF3TG9jYWxpdHkgKyAiICIgKyByYXdOZWlnaGJvcmhvb2QpCi0gICAgICAgICAgICAvLyBtYXkgYmUgZGlmZmVyZW50IGZyb20KLSAgICAgICAgICAgIC8vIC0gZW5jb2RlZExvY2FsaXR5ICsgIiAiICsgZW5jb2RlZE5laWdoYm9yaG9vZC4KLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAvLyBXZSB1c2Ugc2FmZXIgd2F5LgotICAgICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHJhd0xvY2FsaXR5KSkgewotICAgICAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShyYXdOZWlnaGJvcmhvb2QpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJhd0xvY2FsaXR5MiA9ICIiOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJhd0xvY2FsaXR5MiA9IHJhd05laWdoYm9yaG9vZDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShyYXdOZWlnaGJvcmhvb2QpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJhd0xvY2FsaXR5MiA9IHJhd0xvY2FsaXR5OwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJhd0xvY2FsaXR5MiA9IHJhd0xvY2FsaXR5ICsgIiAiICsgcmF3TmVpZ2hib3Job29kOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChyZWFsbHlVc2VRdW90ZWRQcmludGFibGUpIHsKLSAgICAgICAgICAgICAgICBlbmNvZGVkUG9Cb3ggPSBlbmNvZGVRdW90ZWRQcmludGFibGUocmF3UG9Cb3gpOwotICAgICAgICAgICAgICAgIGVuY29kZWRTdHJlZXQgPSBlbmNvZGVRdW90ZWRQcmludGFibGUocmF3U3RyZWV0KTsKLSAgICAgICAgICAgICAgICBlbmNvZGVkTG9jYWxpdHkgPSBlbmNvZGVRdW90ZWRQcmludGFibGUocmF3TG9jYWxpdHkyKTsKLSAgICAgICAgICAgICAgICBlbmNvZGVkUmVnaW9uID0gZW5jb2RlUXVvdGVkUHJpbnRhYmxlKHJhd1JlZ2lvbik7Ci0gICAgICAgICAgICAgICAgZW5jb2RlZFBvc3RhbENvZGUgPSBlbmNvZGVRdW90ZWRQcmludGFibGUocmF3UG9zdGFsQ29kZSk7Ci0gICAgICAgICAgICAgICAgZW5jb2RlZENvdW50cnkgPSBlbmNvZGVRdW90ZWRQcmludGFibGUocmF3Q291bnRyeSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGVuY29kZWRQb0JveCA9IGVzY2FwZUNoYXJhY3RlcnMocmF3UG9Cb3gpOwotICAgICAgICAgICAgICAgIGVuY29kZWRTdHJlZXQgPSBlc2NhcGVDaGFyYWN0ZXJzKHJhd1N0cmVldCk7Ci0gICAgICAgICAgICAgICAgZW5jb2RlZExvY2FsaXR5ID0gZXNjYXBlQ2hhcmFjdGVycyhyYXdMb2NhbGl0eTIpOwotICAgICAgICAgICAgICAgIGVuY29kZWRSZWdpb24gPSBlc2NhcGVDaGFyYWN0ZXJzKHJhd1JlZ2lvbik7Ci0gICAgICAgICAgICAgICAgZW5jb2RlZFBvc3RhbENvZGUgPSBlc2NhcGVDaGFyYWN0ZXJzKHJhd1Bvc3RhbENvZGUpOwotICAgICAgICAgICAgICAgIGVuY29kZWRDb3VudHJ5ID0gZXNjYXBlQ2hhcmFjdGVycyhyYXdDb3VudHJ5KTsKLSAgICAgICAgICAgICAgICBlbmNvZGVkTmVpZ2hib3Job29kID0gZXNjYXBlQ2hhcmFjdGVycyhyYXdOZWlnaGJvcmhvb2QpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmluYWwgU3RyaW5nQnVmZmVyIGFkZHJlc3NCdWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgICBhZGRyZXNzQnVmZmVyLmFwcGVuZChlbmNvZGVkUG9Cb3gpOwotICAgICAgICAgICAgYWRkcmVzc0J1ZmZlci5hcHBlbmQoVkNBUkRfSVRFTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgYWRkcmVzc0J1ZmZlci5hcHBlbmQoVkNBUkRfSVRFTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgYWRkcmVzc0J1ZmZlci5hcHBlbmQoZW5jb2RlZFN0cmVldCk7Ci0gICAgICAgICAgICBhZGRyZXNzQnVmZmVyLmFwcGVuZChWQ0FSRF9JVEVNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICBhZGRyZXNzQnVmZmVyLmFwcGVuZChlbmNvZGVkTG9jYWxpdHkpOwotICAgICAgICAgICAgYWRkcmVzc0J1ZmZlci5hcHBlbmQoVkNBUkRfSVRFTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgYWRkcmVzc0J1ZmZlci5hcHBlbmQoZW5jb2RlZFJlZ2lvbik7Ci0gICAgICAgICAgICBhZGRyZXNzQnVmZmVyLmFwcGVuZChWQ0FSRF9JVEVNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICBhZGRyZXNzQnVmZmVyLmFwcGVuZChlbmNvZGVkUG9zdGFsQ29kZSk7Ci0gICAgICAgICAgICBhZGRyZXNzQnVmZmVyLmFwcGVuZChWQ0FSRF9JVEVNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICBhZGRyZXNzQnVmZmVyLmFwcGVuZChlbmNvZGVkQ291bnRyeSk7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFBvc3RhbFN0cnVjdCgKLSAgICAgICAgICAgICAgICAgICAgcmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlLCBhcHBlbmRDaGFyc2V0LCBhZGRyZXNzQnVmZmVyLnRvU3RyaW5nKCkpOwotICAgICAgICB9IGVsc2UgeyAgLy8gVkNhcmRVdGlscy5hcmVBbGxFbXB0eShyYXdBZGRyZXNzQXJyYXkpID09IHRydWUKLSAgICAgICAgICAgIC8vIFRyeSB0byB1c2UgRk9STUFUVEVEX0FERFJFU1MgaW5zdGVhZC4KLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyByYXdGb3JtYXR0ZWRBZGRyZXNzID0KLSAgICAgICAgICAgICAgICBjb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKFN0cnVjdHVyZWRQb3N0YWwuRk9STUFUVEVEX0FERFJFU1MpOwotICAgICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHJhd0Zvcm1hdHRlZEFkZHJlc3MpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaW5hbCBib29sZWFuIHJlYWxseVVzZVF1b3RlZFByaW50YWJsZSA9Ci0gICAgICAgICAgICAgICAgKG1TaG91bGRVc2VRdW90ZWRQcmludGFibGUgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICFWQ2FyZFV0aWxzLmNvbnRhaW5zT25seU5vbkNyTGZQcmludGFibGVBc2NpaShyYXdGb3JtYXR0ZWRBZGRyZXNzKSk7Ci0gICAgICAgICAgICBmaW5hbCBib29sZWFuIGFwcGVuZENoYXJzZXQgPQotICAgICAgICAgICAgICAgICFWQ2FyZFV0aWxzLmNvbnRhaW5zT25seVByaW50YWJsZUFzY2lpKHJhd0Zvcm1hdHRlZEFkZHJlc3MpOwotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGVuY29kZWRGb3JtYXR0ZWRBZGRyZXNzOwotICAgICAgICAgICAgaWYgKHJlYWxseVVzZVF1b3RlZFByaW50YWJsZSkgewotICAgICAgICAgICAgICAgIGVuY29kZWRGb3JtYXR0ZWRBZGRyZXNzID0gZW5jb2RlUXVvdGVkUHJpbnRhYmxlKHJhd0Zvcm1hdHRlZEFkZHJlc3MpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBlbmNvZGVkRm9ybWF0dGVkQWRkcmVzcyA9IGVzY2FwZUNoYXJhY3RlcnMocmF3Rm9ybWF0dGVkQWRkcmVzcyk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFdlIHVzZSB0aGUgc2Vjb25kIHZhbHVlICgiRXh0ZW5kZWQgQWRkcmVzcyIpIGp1c3QgYmVjYXVzZSBKYXBhbmVzZSBtb2JpbGUgcGhvbmVzCi0gICAgICAgICAgICAvLyBkbyBzby4gSWYgdGhlIG90aGVyIGltcG9ydGVyIGV4cGVjdHMgdGhlIHZhbHVlIGJlIGluIHRoZSBvdGhlciBmaWVsZCwgc29tZSBmbGFnIG1heQotICAgICAgICAgICAgLy8gYmUgbmVlZGVkLgotICAgICAgICAgICAgZmluYWwgU3RyaW5nQnVmZmVyIGFkZHJlc3NCdWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgICBhZGRyZXNzQnVmZmVyLmFwcGVuZChWQ0FSRF9JVEVNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICBhZGRyZXNzQnVmZmVyLmFwcGVuZChlbmNvZGVkRm9ybWF0dGVkQWRkcmVzcyk7Ci0gICAgICAgICAgICBhZGRyZXNzQnVmZmVyLmFwcGVuZChWQ0FSRF9JVEVNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICBhZGRyZXNzQnVmZmVyLmFwcGVuZChWQ0FSRF9JVEVNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICBhZGRyZXNzQnVmZmVyLmFwcGVuZChWQ0FSRF9JVEVNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICBhZGRyZXNzQnVmZmVyLmFwcGVuZChWQ0FSRF9JVEVNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICBhZGRyZXNzQnVmZmVyLmFwcGVuZChWQ0FSRF9JVEVNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFBvc3RhbFN0cnVjdCgKLSAgICAgICAgICAgICAgICAgICAgcmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlLCBhcHBlbmRDaGFyc2V0LCBhZGRyZXNzQnVmZmVyLnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFZDYXJkQnVpbGRlciBhcHBlbmRJbXMoZmluYWwgTGlzdDxDb250ZW50VmFsdWVzPiBjb250ZW50VmFsdWVzTGlzdCkgewotICAgICAgICBpZiAoY29udGVudFZhbHVlc0xpc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChDb250ZW50VmFsdWVzIGNvbnRlbnRWYWx1ZXMgOiBjb250ZW50VmFsdWVzTGlzdCkgewotICAgICAgICAgICAgICAgIGZpbmFsIEludGVnZXIgcHJvdG9jb2xBc09iamVjdCA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNJbnRlZ2VyKEltLlBST1RPQ09MKTsKLSAgICAgICAgICAgICAgICBpZiAocHJvdG9jb2xBc09iamVjdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcHJvcGVydHlOYW1lID0gVkNhcmRVdGlscy5nZXRQcm9wZXJ0eU5hbWVGb3JJbShwcm90b2NvbEFzT2JqZWN0KTsKLSAgICAgICAgICAgICAgICBpZiAocHJvcGVydHlOYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFN0cmluZyBkYXRhID0gY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhJbS5EQVRBKTsKLSAgICAgICAgICAgICAgICBpZiAoZGF0YSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhLnRyaW0oKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KGRhdGEpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdHlwZUFzU3RyaW5nOwotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgSW50ZWdlciB0eXBlQXNJbnRlZ2VyID0gY29udGVudFZhbHVlcy5nZXRBc0ludGVnZXIoSW0uVFlQRSk7Ci0gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAodHlwZUFzSW50ZWdlciAhPSBudWxsID8gdHlwZUFzSW50ZWdlciA6IEltLlRZUEVfT1RIRVIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSW0uVFlQRV9IT01FOiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZUFzU3RyaW5nID0gVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9IT01FOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBJbS5UWVBFX1dPUks6IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlQXNTdHJpbmcgPSBWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX1dPUks7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEltLlRZUEVfQ1VTVE9NOiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGxhYmVsID0gY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhJbS5MQUJFTCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZUFzU3RyaW5nID0gKGxhYmVsICE9IG51bGwgPyAiWC0iICsgbGFiZWwgOiBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSW0uVFlQRV9PVEhFUjogIC8vIElnbm9yZQotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDogewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVBc1N0cmluZyA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBmaW5hbCBMaXN0PFN0cmluZz4gcGFyYW1ldGVyTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICAgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkodHlwZUFzU3RyaW5nKSkgewotICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJMaXN0LmFkZCh0eXBlQXNTdHJpbmcpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmaW5hbCBJbnRlZ2VyIGlzUHJpbWFyeUFzSW50ZWdlciA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNJbnRlZ2VyKEltLklTX1BSSU1BUlkpOwotICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gaXNQcmltYXJ5ID0gKGlzUHJpbWFyeUFzSW50ZWdlciAhPSBudWxsID8KLSAgICAgICAgICAgICAgICAgICAgICAgIChpc1ByaW1hcnlBc0ludGVnZXIgPiAwKSA6IGZhbHNlKTsKLSAgICAgICAgICAgICAgICBpZiAoaXNQcmltYXJ5KSB7Ci0gICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlckxpc3QuYWRkKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfUFJFRik7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgYXBwZW5kTGluZVdpdGhDaGFyc2V0QW5kUVBEZXRlY3Rpb24ocHJvcGVydHlOYW1lLCBwYXJhbWV0ZXJMaXN0LCBkYXRhKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVkNhcmRCdWlsZGVyIGFwcGVuZFdlYnNpdGVzKGZpbmFsIExpc3Q8Q29udGVudFZhbHVlcz4gY29udGVudFZhbHVlc0xpc3QpIHsKLSAgICAgICAgaWYgKGNvbnRlbnRWYWx1ZXNMaXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoQ29udGVudFZhbHVlcyBjb250ZW50VmFsdWVzIDogY29udGVudFZhbHVlc0xpc3QpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgd2Vic2l0ZSA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoV2Vic2l0ZS5VUkwpOwotICAgICAgICAgICAgICAgIGlmICh3ZWJzaXRlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgd2Vic2l0ZSA9IHdlYnNpdGUudHJpbSgpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIE5vdGU6IHZDYXJkIDMuMCBkb2VzIG5vdCBhbGxvdyBhbnkgcGFyYW1ldGVyIGFkZGl0aW9uIHRvd2FyZCAiVVJMIgotICAgICAgICAgICAgICAgIC8vICAgICAgIHByb3BlcnR5LCB3aGlsZSB0aGVyZSdzIG5vIGRvY3VtZW50IGluIHZDYXJkIDIuMS4KLSAgICAgICAgICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KHdlYnNpdGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFwcGVuZExpbmVXaXRoQ2hhcnNldEFuZFFQRGV0ZWN0aW9uKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1VSTCwgd2Vic2l0ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIHB1YmxpYyBWQ2FyZEJ1aWxkZXIgYXBwZW5kT3JnYW5pemF0aW9ucyhmaW5hbCBMaXN0PENvbnRlbnRWYWx1ZXM+IGNvbnRlbnRWYWx1ZXNMaXN0KSB7Ci0gICAgICAgIGlmIChjb250ZW50VmFsdWVzTGlzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKENvbnRlbnRWYWx1ZXMgY29udGVudFZhbHVlcyA6IGNvbnRlbnRWYWx1ZXNMaXN0KSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGNvbXBhbnkgPSBjb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKE9yZ2FuaXphdGlvbi5DT01QQU5ZKTsKLSAgICAgICAgICAgICAgICBpZiAoY29tcGFueSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbXBhbnkgPSBjb21wYW55LnRyaW0oKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGRlcGFydG1lbnQgPSBjb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKE9yZ2FuaXphdGlvbi5ERVBBUlRNRU5UKTsKLSAgICAgICAgICAgICAgICBpZiAoZGVwYXJ0bWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRlcGFydG1lbnQgPSBkZXBhcnRtZW50LnRyaW0oKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHRpdGxlID0gY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhPcmdhbml6YXRpb24uVElUTEUpOwotICAgICAgICAgICAgICAgIGlmICh0aXRsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRpdGxlID0gdGl0bGUudHJpbSgpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgb3JnQnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgICAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShjb21wYW55KSkgewotICAgICAgICAgICAgICAgICAgICBvcmdCdWlsZGVyLmFwcGVuZChjb21wYW55KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShkZXBhcnRtZW50KSkgewotICAgICAgICAgICAgICAgICAgICBpZiAob3JnQnVpbGRlci5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9yZ0J1aWxkZXIuYXBwZW5kKCc7Jyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgb3JnQnVpbGRlci5hcHBlbmQoZGVwYXJ0bWVudCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBvcmdsaW5lID0gb3JnQnVpbGRlci50b1N0cmluZygpOwotICAgICAgICAgICAgICAgIGFwcGVuZExpbmUoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfT1JHLCBvcmdsaW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgIVZDYXJkVXRpbHMuY29udGFpbnNPbmx5UHJpbnRhYmxlQXNjaWkob3JnbGluZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAobVNob3VsZFVzZVF1b3RlZFByaW50YWJsZSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhVkNhcmRVdGlscy5jb250YWluc09ubHlOb25DckxmUHJpbnRhYmxlQXNjaWkob3JnbGluZSkpKTsKLQotICAgICAgICAgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkodGl0bGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFwcGVuZExpbmUoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfVElUTEUsIHRpdGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICFWQ2FyZFV0aWxzLmNvbnRhaW5zT25seVByaW50YWJsZUFzY2lpKHRpdGxlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAobVNob3VsZFVzZVF1b3RlZFByaW50YWJsZSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIVZDYXJkVXRpbHMuY29udGFpbnNPbmx5Tm9uQ3JMZlByaW50YWJsZUFzY2lpKHRpdGxlKSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVkNhcmRCdWlsZGVyIGFwcGVuZFBob3RvcyhmaW5hbCBMaXN0PENvbnRlbnRWYWx1ZXM+IGNvbnRlbnRWYWx1ZXNMaXN0KSB7Ci0gICAgICAgIGlmIChjb250ZW50VmFsdWVzTGlzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKENvbnRlbnRWYWx1ZXMgY29udGVudFZhbHVlcyA6IGNvbnRlbnRWYWx1ZXNMaXN0KSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbnRlbnRWYWx1ZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnl0ZVtdIGRhdGEgPSBjb250ZW50VmFsdWVzLmdldEFzQnl0ZUFycmF5KFBob3RvLlBIT1RPKTsKLSAgICAgICAgICAgICAgICBpZiAoZGF0YSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcGhvdG9UeXBlID0gVkNhcmRVdGlscy5ndWVzc0ltYWdlVHlwZShkYXRhKTsKLSAgICAgICAgICAgICAgICBpZiAocGhvdG9UeXBlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIlVua25vd24gcGhvdG8gdHlwZS4gSWdub3JlZC4iKTsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBwaG90b1N0cmluZyA9IG5ldyBTdHJpbmcoQmFzZTY0LmVuY29kZUJhc2U2NChkYXRhKSk7Ci0gICAgICAgICAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShwaG90b1N0cmluZykpIHsKLSAgICAgICAgICAgICAgICAgICAgYXBwZW5kUGhvdG9MaW5lKHBob3RvU3RyaW5nLCBwaG90b1R5cGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVkNhcmRCdWlsZGVyIGFwcGVuZE5vdGVzKGZpbmFsIExpc3Q8Q29udGVudFZhbHVlcz4gY29udGVudFZhbHVlc0xpc3QpIHsKLSAgICAgICAgaWYgKGNvbnRlbnRWYWx1ZXNMaXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChtT25seU9uZU5vdGVGaWVsZElzQXZhaWxhYmxlKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciBub3RlQnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBmaXJzdCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgZm9yIChmaW5hbCBDb250ZW50VmFsdWVzIGNvbnRlbnRWYWx1ZXMgOiBjb250ZW50VmFsdWVzTGlzdCkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbm90ZSA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoTm90ZS5OT1RFKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5vdGUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbm90ZSA9ICIiOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChub3RlLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90ZUJ1aWxkZXIuYXBwZW5kKCdcbicpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgbm90ZUJ1aWxkZXIuYXBwZW5kKG5vdGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBub3RlU3RyID0gbm90ZUJ1aWxkZXIudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAvLyBUaGlzIG1lYW5zIHdlIHNjYW4gbm90ZVN0ciBjb21wbGV0ZWx5IHR3aWNlLCB3aGljaCBpcyByZWR1bmRhbnQuCi0gICAgICAgICAgICAgICAgLy8gQnV0IGZvciBub3csIHdlIGFzc3VtZSB0aGlzIGlzIG5vdCBzbyB0aW1lLWNvbnN1bWluZy4uCi0gICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBzaG91bGRBcHBlbmRDaGFyc2V0SW5mbyA9Ci0gICAgICAgICAgICAgICAgICAgICFWQ2FyZFV0aWxzLmNvbnRhaW5zT25seVByaW50YWJsZUFzY2lpKG5vdGVTdHIpOwotICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gcmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChtU2hvdWxkVXNlUXVvdGVkUHJpbnRhYmxlICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIVZDYXJkVXRpbHMuY29udGFpbnNPbmx5Tm9uQ3JMZlByaW50YWJsZUFzY2lpKG5vdGVTdHIpKTsKLSAgICAgICAgICAgICAgICBhcHBlbmRMaW5lKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX05PVEUsIG5vdGVTdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICBzaG91bGRBcHBlbmRDaGFyc2V0SW5mbywgcmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZm9yIChDb250ZW50VmFsdWVzIGNvbnRlbnRWYWx1ZXMgOiBjb250ZW50VmFsdWVzTGlzdCkgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbm90ZVN0ciA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoTm90ZS5OT1RFKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShub3RlU3RyKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBzaG91bGRBcHBlbmRDaGFyc2V0SW5mbyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFWQ2FyZFV0aWxzLmNvbnRhaW5zT25seVByaW50YWJsZUFzY2lpKG5vdGVTdHIpOwotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiByZWFsbHlVc2VRdW90ZWRQcmludGFibGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobVNob3VsZFVzZVF1b3RlZFByaW50YWJsZSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIVZDYXJkVXRpbHMuY29udGFpbnNPbmx5Tm9uQ3JMZlByaW50YWJsZUFzY2lpKG5vdGVTdHIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZExpbmUoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfTk9URSwgbm90ZVN0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkQXBwZW5kQ2hhcnNldEluZm8sIHJlYWxseVVzZVF1b3RlZFByaW50YWJsZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgcHVibGljIFZDYXJkQnVpbGRlciBhcHBlbmRFdmVudHMoZmluYWwgTGlzdDxDb250ZW50VmFsdWVzPiBjb250ZW50VmFsdWVzTGlzdCkgewotICAgICAgICBpZiAoY29udGVudFZhbHVlc0xpc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nIHByaW1hcnlCaXJ0aGRheSA9IG51bGw7Ci0gICAgICAgICAgICBTdHJpbmcgc2Vjb25kYXJ5QmlydGhkYXkgPSBudWxsOwotICAgICAgICAgICAgZm9yIChmaW5hbCBDb250ZW50VmFsdWVzIGNvbnRlbnRWYWx1ZXMgOiBjb250ZW50VmFsdWVzTGlzdCkgewotICAgICAgICAgICAgICAgIGlmIChjb250ZW50VmFsdWVzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGZpbmFsIEludGVnZXIgZXZlbnRUeXBlQXNJbnRlZ2VyID0gY29udGVudFZhbHVlcy5nZXRBc0ludGVnZXIoRXZlbnQuVFlQRSk7Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IGV2ZW50VHlwZTsKLSAgICAgICAgICAgICAgICBpZiAoZXZlbnRUeXBlQXNJbnRlZ2VyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlID0gZXZlbnRUeXBlQXNJbnRlZ2VyOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGV2ZW50VHlwZSA9IEV2ZW50LlRZUEVfT1RIRVI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChldmVudFR5cGUgPT0gRXZlbnQuVFlQRV9CSVJUSERBWSkgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgYmlydGhkYXlDYW5kaWRhdGUgPSBjb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKEV2ZW50LlNUQVJUX0RBVEUpOwotICAgICAgICAgICAgICAgICAgICBpZiAoYmlydGhkYXlDYW5kaWRhdGUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZmluYWwgSW50ZWdlciBpc1N1cGVyUHJpbWFyeUFzSW50ZWdlciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50VmFsdWVzLmdldEFzSW50ZWdlcihFdmVudC5JU19TVVBFUl9QUklNQVJZKTsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBpc1N1cGVyUHJpbWFyeSA9IChpc1N1cGVyUHJpbWFyeUFzSW50ZWdlciAhPSBudWxsID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaXNTdXBlclByaW1hcnlBc0ludGVnZXIgPiAwKSA6IGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGlzU3VwZXJQcmltYXJ5KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyAic3VwZXIgcHJpbWFyeSIgYmlydGhkYXkgc2hvdWxkIHRoZSBwcmVmZXJlZCBvbmUuCi0gICAgICAgICAgICAgICAgICAgICAgICBwcmltYXJ5QmlydGhkYXkgPSBiaXJ0aGRheUNhbmRpZGF0ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIEludGVnZXIgaXNQcmltYXJ5QXNJbnRlZ2VyID0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRWYWx1ZXMuZ2V0QXNJbnRlZ2VyKEV2ZW50LklTX1BSSU1BUlkpOwotICAgICAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIGlzUHJpbWFyeSA9IChpc1ByaW1hcnlBc0ludGVnZXIgIT0gbnVsbCA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlzUHJpbWFyeUFzSW50ZWdlciA+IDApIDogZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICBpZiAoaXNQcmltYXJ5KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBkb24ndCBicmVhayBoZXJlIHNpbmNlICJzdXBlciBwcmltYXJ5IiBiaXJ0aGRheSBtYXkgZXhpc3QgbGF0ZXIuCi0gICAgICAgICAgICAgICAgICAgICAgICBwcmltYXJ5QmlydGhkYXkgPSBiaXJ0aGRheUNhbmRpZGF0ZTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzZWNvbmRhcnlCaXJ0aGRheSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBGaXJzdCBlbnRyeSBpcyBzZXQgdG8gdGhlICJzZWNvbmRhcnkiIGNhbmRpZGF0ZS4KLSAgICAgICAgICAgICAgICAgICAgICAgIHNlY29uZGFyeUJpcnRoZGF5ID0gYmlydGhkYXlDYW5kaWRhdGU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1Vc2VzQW5kcm9pZFByb3BlcnR5KSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEV2ZW50IHR5cGVzIG90aGVyIHRoYW4gQmlydGhkYXkgaXMgbm90IHN1cHBvcnRlZCBieSB2Q2FyZC4KLSAgICAgICAgICAgICAgICAgICAgYXBwZW5kQW5kcm9pZFNwZWNpZmljUHJvcGVydHkoRXZlbnQuQ09OVEVOVF9JVEVNX1RZUEUsIGNvbnRlbnRWYWx1ZXMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChwcmltYXJ5QmlydGhkYXkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGFwcGVuZExpbmVXaXRoQ2hhcnNldEFuZFFQRGV0ZWN0aW9uKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX0JEQVksCi0gICAgICAgICAgICAgICAgICAgICAgICBwcmltYXJ5QmlydGhkYXkudHJpbSgpKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoc2Vjb25kYXJ5QmlydGhkYXkgIT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgYXBwZW5kTGluZVdpdGhDaGFyc2V0QW5kUVBEZXRlY3Rpb24oVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfQkRBWSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlY29uZGFyeUJpcnRoZGF5LnRyaW0oKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgcHVibGljIFZDYXJkQnVpbGRlciBhcHBlbmRSZWxhdGlvbihmaW5hbCBMaXN0PENvbnRlbnRWYWx1ZXM+IGNvbnRlbnRWYWx1ZXNMaXN0KSB7Ci0gICAgICAgIGlmIChtVXNlc0FuZHJvaWRQcm9wZXJ0eSAmJiBjb250ZW50VmFsdWVzTGlzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKGZpbmFsIENvbnRlbnRWYWx1ZXMgY29udGVudFZhbHVlcyA6IGNvbnRlbnRWYWx1ZXNMaXN0KSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbnRlbnRWYWx1ZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYXBwZW5kQW5kcm9pZFNwZWNpZmljUHJvcGVydHkoUmVsYXRpb24uQ09OVEVOVF9JVEVNX1RZUEUsIGNvbnRlbnRWYWx1ZXMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFwcGVuZFBvc3RhbExpbmUoZmluYWwgaW50IHR5cGUsIGZpbmFsIFN0cmluZyBsYWJlbCwKLSAgICAgICAgICAgIGZpbmFsIENvbnRlbnRWYWx1ZXMgY29udGVudFZhbHVlcywKLSAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gaXNQcmltYXJ5LCBmaW5hbCBib29sZWFuIGVtaXRMaW5lRXZlcnlUaW1lKSB7Ci0gICAgICAgIGZpbmFsIGJvb2xlYW4gcmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlOwotICAgICAgICBmaW5hbCBib29sZWFuIGFwcGVuZENoYXJzZXQ7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBhZGRyZXNzVmFsdWU7Ci0gICAgICAgIHsKLSAgICAgICAgICAgIFBvc3RhbFN0cnVjdCBwb3N0YWxTdHJ1Y3QgPSB0cnlDb25zdHJ1Y3RQb3N0YWxTdHJ1Y3QoY29udGVudFZhbHVlcyk7Ci0gICAgICAgICAgICBpZiAocG9zdGFsU3RydWN0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoZW1pdExpbmVFdmVyeVRpbWUpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIGFwcGVuZENoYXJzZXQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgYWRkcmVzc1ZhbHVlID0gIiI7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlID0gcG9zdGFsU3RydWN0LnJlYWxseVVzZVF1b3RlZFByaW50YWJsZTsKLSAgICAgICAgICAgICAgICBhcHBlbmRDaGFyc2V0ID0gcG9zdGFsU3RydWN0LmFwcGVuZENoYXJzZXQ7Ci0gICAgICAgICAgICAgICAgYWRkcmVzc1ZhbHVlID0gcG9zdGFsU3RydWN0LmFkZHJlc3NEYXRhOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgTGlzdDxTdHJpbmc+IHBhcmFtZXRlckxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgaWYgKGlzUHJpbWFyeSkgewotICAgICAgICAgICAgcGFyYW1ldGVyTGlzdC5hZGQoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9QUkVGKTsKLSAgICAgICAgfQotICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKLSAgICAgICAgICAgIGNhc2UgU3RydWN0dXJlZFBvc3RhbC5UWVBFX0hPTUU6IHsKLSAgICAgICAgICAgICAgICBwYXJhbWV0ZXJMaXN0LmFkZChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX0hPTUUpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBTdHJ1Y3R1cmVkUG9zdGFsLlRZUEVfV09SSzogewotICAgICAgICAgICAgICAgIHBhcmFtZXRlckxpc3QuYWRkKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfV09SSyk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIFN0cnVjdHVyZWRQb3N0YWwuVFlQRV9DVVNUT006IHsKLSAgICAgICAgICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KGxhYmVsKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgVkNhcmRVdGlscy5jb250YWluc09ubHlBbHBoYURpZ2l0SHlwaGVuKGxhYmVsKSkgewotICAgICAgICAgICAgICAgICAgICAvLyBXZSdyZSBub3Qgc3VyZSB3aGV0aGVyIHRoZSBsYWJlbCBpcyB2YWxpZCBpbiB0aGUgc3BlYwotICAgICAgICAgICAgICAgICAgICAvLyAoIklBTkEtdG9rZW4iIGluIHRoZSB2Q2FyZCAzLjAgaXMgdW5jbGVhci4uLikKLSAgICAgICAgICAgICAgICAgICAgLy8gSnVzdCAgZm9yIHNhZmV0eSwgd2UgYWRkICJYLSIgYXQgdGhlIGJlZ2dpbmluZyBvZiBlYWNoIGxhYmVsLgotICAgICAgICAgICAgICAgICAgICAvLyBBbHNvIGNoZWNrcyB0aGUgbGFiZWwgb2JleXMgd2l0aCB2Q2FyZCAzLjAgc3BlYy4KLSAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyTGlzdC5hZGQoIlgtIiArIGxhYmVsKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIFN0cnVjdHVyZWRQb3N0YWwuVFlQRV9PVEhFUjogewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZGVmYXVsdDogewotICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJVbmtub3duIFN0cnVjdHVyZWRQb3N0YWwgdHlwZTogIiArIHR5cGUpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX0FEUik7Ci0gICAgICAgIGlmICghcGFyYW1ldGVyTGlzdC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgYXBwZW5kVHlwZVBhcmFtZXRlcnMocGFyYW1ldGVyTGlzdCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGFwcGVuZENoYXJzZXQpIHsKLSAgICAgICAgICAgIC8vIFN0cmljdGx5LCB2Q2FyZCAzLjAgZG9lcyBub3QgYWxsb3cgZXhwb3J0ZXJzIHRvIGVtaXQgY2hhcnNldCBpbmZvcm1hdGlvbiwKLSAgICAgICAgICAgIC8vIGJ1dCB3ZSB3aWxsIGFkZCBpdCBzaW5jZSB0aGUgaW5mb3JtYXRpb24gc2hvdWxkIGJlIHVzZWZ1bCBmb3IgaW1wb3J0ZXJzLAotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIC8vIEFzc3VtZSBubyBwYXJzZXIgZG9lcyBub3QgZW1pdCBlcnJvciB3aXRoIHRoaXMgcGFyYW1ldGVyIGluIHZDYXJkIDMuMC4KLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKG1WQ2FyZENoYXJzZXRQYXJhbWV0ZXIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChyZWFsbHlVc2VRdW90ZWRQcmludGFibGUpIHsKLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX0VOQ09ESU5HX1FQKTsKLSAgICAgICAgfQotICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfREFUQV9TRVBBUkFUT1IpOwotICAgICAgICBtQnVpbGRlci5hcHBlbmQoYWRkcmVzc1ZhbHVlKTsKLSAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0VORF9PRl9MSU5FKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhcHBlbmRFbWFpbExpbmUoZmluYWwgaW50IHR5cGUsIGZpbmFsIFN0cmluZyBsYWJlbCwKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyByYXdWYWx1ZSwgZmluYWwgYm9vbGVhbiBpc1ByaW1hcnkpIHsKLSAgICAgICAgZmluYWwgU3RyaW5nIHR5cGVBc1N0cmluZzsKLSAgICAgICAgc3dpdGNoICh0eXBlKSB7Ci0gICAgICAgICAgICBjYXNlIEVtYWlsLlRZUEVfQ1VTVE9NOiB7Ci0gICAgICAgICAgICAgICAgaWYgKFZDYXJkVXRpbHMuaXNNb2JpbGVQaG9uZUxhYmVsKGxhYmVsKSkgewotICAgICAgICAgICAgICAgICAgICB0eXBlQXNTdHJpbmcgPSBWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX0NFTEw7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICghVGV4dFV0aWxzLmlzRW1wdHkobGFiZWwpCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiBWQ2FyZFV0aWxzLmNvbnRhaW5zT25seUFscGhhRGlnaXRIeXBoZW4obGFiZWwpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHR5cGVBc1N0cmluZyA9ICJYLSIgKyBsYWJlbDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB0eXBlQXNTdHJpbmcgPSBudWxsOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgRW1haWwuVFlQRV9IT01FOiB7Ci0gICAgICAgICAgICAgICAgdHlwZUFzU3RyaW5nID0gVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9IT01FOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBFbWFpbC5UWVBFX1dPUks6IHsKLSAgICAgICAgICAgICAgICB0eXBlQXNTdHJpbmcgPSBWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX1dPUks7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIEVtYWlsLlRZUEVfT1RIRVI6IHsKLSAgICAgICAgICAgICAgICB0eXBlQXNTdHJpbmcgPSBudWxsOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBFbWFpbC5UWVBFX01PQklMRTogewotICAgICAgICAgICAgICAgIHR5cGVBc1N0cmluZyA9IFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfQ0VMTDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRlZmF1bHQ6IHsKLSAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiVW5rbm93biBFbWFpbCB0eXBlOiAiICsgdHlwZSk7Ci0gICAgICAgICAgICAgICAgdHlwZUFzU3RyaW5nID0gbnVsbDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIExpc3Q8U3RyaW5nPiBwYXJhbWV0ZXJMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgIGlmIChpc1ByaW1hcnkpIHsKLSAgICAgICAgICAgIHBhcmFtZXRlckxpc3QuYWRkKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfUFJFRik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eSh0eXBlQXNTdHJpbmcpKSB7Ci0gICAgICAgICAgICBwYXJhbWV0ZXJMaXN0LmFkZCh0eXBlQXNTdHJpbmcpOwotICAgICAgICB9Ci0KLSAgICAgICAgYXBwZW5kTGluZVdpdGhDaGFyc2V0QW5kUVBEZXRlY3Rpb24oVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfRU1BSUwsIHBhcmFtZXRlckxpc3QsCi0gICAgICAgICAgICAgICAgcmF3VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFwcGVuZFRlbExpbmUoZmluYWwgSW50ZWdlciB0eXBlQXNJbnRlZ2VyLCBmaW5hbCBTdHJpbmcgbGFiZWwsCi0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgZW5jb2RlZFZhbHVlLCBib29sZWFuIGlzUHJpbWFyeSkgewotICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfVEVMKTsKLSAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX1NFUEFSQVRPUik7Ci0KLSAgICAgICAgZmluYWwgaW50IHR5cGU7Ci0gICAgICAgIGlmICh0eXBlQXNJbnRlZ2VyID09IG51bGwpIHsKLSAgICAgICAgICAgIHR5cGUgPSBQaG9uZS5UWVBFX09USEVSOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdHlwZSA9IHR5cGVBc0ludGVnZXI7Ci0gICAgICAgIH0KLQotICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiBwYXJhbWV0ZXJMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgIHN3aXRjaCAodHlwZSkgewotICAgICAgICAgICAgY2FzZSBQaG9uZS5UWVBFX0hPTUU6IHsKLSAgICAgICAgICAgICAgICBwYXJhbWV0ZXJMaXN0LmFkZEFsbCgKLSAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9IT01FKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIFBob25lLlRZUEVfV09SSzogewotICAgICAgICAgICAgICAgIHBhcmFtZXRlckxpc3QuYWRkQWxsKAotICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX1dPUkspKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgUGhvbmUuVFlQRV9GQVhfSE9NRTogewotICAgICAgICAgICAgICAgIHBhcmFtZXRlckxpc3QuYWRkQWxsKAotICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX0hPTUUsIFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfRkFYKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIFBob25lLlRZUEVfRkFYX1dPUks6IHsKLSAgICAgICAgICAgICAgICBwYXJhbWV0ZXJMaXN0LmFkZEFsbCgKLSAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9XT1JLLCBWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX0ZBWCkpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBQaG9uZS5UWVBFX01PQklMRTogewotICAgICAgICAgICAgICAgIHBhcmFtZXRlckxpc3QuYWRkKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfQ0VMTCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIFBob25lLlRZUEVfUEFHRVI6IHsKLSAgICAgICAgICAgICAgICBpZiAobUlzRG9Db01vKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIE5vdCBzdXJlIGFib3V0IHRoZSByZWFzb24sIGJ1dCBwcmV2aW91cyBpbXBsZW1lbnRhdGlvbiBoYWQKLSAgICAgICAgICAgICAgICAgICAgLy8gdXNlZCAiVk9JQ0UiIGluc3RlYWQgb2YgIlBBR0VSIgotICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJMaXN0LmFkZChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX1ZPSUNFKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJMaXN0LmFkZChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX1BBR0VSKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIFBob25lLlRZUEVfT1RIRVI6IHsKLSAgICAgICAgICAgICAgICBwYXJhbWV0ZXJMaXN0LmFkZChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX1ZPSUNFKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgUGhvbmUuVFlQRV9DQVI6IHsKLSAgICAgICAgICAgICAgICBwYXJhbWV0ZXJMaXN0LmFkZChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX0NBUik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIFBob25lLlRZUEVfQ09NUEFOWV9NQUlOOiB7Ci0gICAgICAgICAgICAgICAgLy8gVGhlcmUncyBubyByZWxldmFudCBmaWVsZCBpbiB2Q2FyZCAoYXQgbGVhc3QgMi4xKS4KLSAgICAgICAgICAgICAgICBwYXJhbWV0ZXJMaXN0LmFkZChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX1dPUkspOwotICAgICAgICAgICAgICAgIGlzUHJpbWFyeSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIFBob25lLlRZUEVfSVNETjogewotICAgICAgICAgICAgICAgIHBhcmFtZXRlckxpc3QuYWRkKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfSVNETik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIFBob25lLlRZUEVfTUFJTjogewotICAgICAgICAgICAgICAgIGlzUHJpbWFyeSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIFBob25lLlRZUEVfT1RIRVJfRkFYOiB7Ci0gICAgICAgICAgICAgICAgcGFyYW1ldGVyTGlzdC5hZGQoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9GQVgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBQaG9uZS5UWVBFX1RFTEVYOiB7Ci0gICAgICAgICAgICAgICAgcGFyYW1ldGVyTGlzdC5hZGQoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9UTFgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBQaG9uZS5UWVBFX1dPUktfTU9CSUxFOiB7Ci0gICAgICAgICAgICAgICAgcGFyYW1ldGVyTGlzdC5hZGRBbGwoCi0gICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfV09SSywgVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9DRUxMKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIFBob25lLlRZUEVfV09SS19QQUdFUjogewotICAgICAgICAgICAgICAgIHBhcmFtZXRlckxpc3QuYWRkKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfV09SSyk7Ci0gICAgICAgICAgICAgICAgLy8gU2VlIGFib3ZlLgotICAgICAgICAgICAgICAgIGlmIChtSXNEb0NvTW8pIHsKLSAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyTGlzdC5hZGQoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9WT0lDRSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyTGlzdC5hZGQoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9QQUdFUik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBQaG9uZS5UWVBFX01NUzogewotICAgICAgICAgICAgICAgIHBhcmFtZXRlckxpc3QuYWRkKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfTVNHKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgUGhvbmUuVFlQRV9DVVNUT006IHsKLSAgICAgICAgICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkobGFiZWwpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEp1c3QgaWdub3JlIHRoZSBjdXN0b20gdHlwZS4KLSAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyTGlzdC5hZGQoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9WT0lDRSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChWQ2FyZFV0aWxzLmlzTW9iaWxlUGhvbmVMYWJlbChsYWJlbCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyTGlzdC5hZGQoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9DRUxMKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdXBwZXJMYWJlbCA9IGxhYmVsLnRvVXBwZXJDYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChWQ2FyZFV0aWxzLmlzVmFsaWRJblYyMUJ1dFVua25vd25Ub0NvbnRhY3RzUGhvdGVUeXBlKHVwcGVyTGFiZWwpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJMaXN0LmFkZCh1cHBlckxhYmVsKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChWQ2FyZFV0aWxzLmNvbnRhaW5zT25seUFscGhhRGlnaXRIeXBoZW4obGFiZWwpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBOb3RlOiBTdHJpY3RseSwgdkNhcmQgMi4xIGRvZXMgbm90IGFsbG93ICJYLSIgcGFyYW1ldGVyIHdpdGhvdXQKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICJUWVBFPSIgc3RyaW5nLgotICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyTGlzdC5hZGQoIlgtIiArIGxhYmVsKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgUGhvbmUuVFlQRV9SQURJTzoKLSAgICAgICAgICAgIGNhc2UgUGhvbmUuVFlQRV9UVFlfVEREOgotICAgICAgICAgICAgZGVmYXVsdDogewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGlzUHJpbWFyeSkgewotICAgICAgICAgICAgcGFyYW1ldGVyTGlzdC5hZGQoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9QUkVGKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChwYXJhbWV0ZXJMaXN0LmlzRW1wdHkoKSkgewotICAgICAgICAgICAgYXBwZW5kVW5jb21tb25QaG9uZVR5cGUobUJ1aWxkZXIsIHR5cGUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYXBwZW5kVHlwZVBhcmFtZXRlcnMocGFyYW1ldGVyTGlzdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfREFUQV9TRVBBUkFUT1IpOwotICAgICAgICBtQnVpbGRlci5hcHBlbmQoZW5jb2RlZFZhbHVlKTsKLSAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0VORF9PRl9MSU5FKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBcHBlbmRzIHBob25lIHR5cGUgc3RyaW5nIHdoaWNoIG1heSBub3QgYmUgYXZhaWxhYmxlIGluIHNvbWUgZGV2aWNlcy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgYXBwZW5kVW5jb21tb25QaG9uZVR5cGUoZmluYWwgU3RyaW5nQnVpbGRlciBidWlsZGVyLCBmaW5hbCBJbnRlZ2VyIHR5cGUpIHsKLSAgICAgICAgaWYgKG1Jc0RvQ29NbykgewotICAgICAgICAgICAgLy8gVGhlIHByZXZpb3VzIGltcGxlbWVudGF0aW9uIGZvciBEb0NvTW8gaGFkIGJlZW4gY29uc2VydmF0aXZlCi0gICAgICAgICAgICAvLyBhYm91dCBtaXNjZWxsYW5lb3VzIHR5cGVzLgotICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9WT0lDRSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBTdHJpbmcgcGhvbmVUeXBlID0gVkNhcmRVdGlscy5nZXRQaG9uZVR5cGVTdHJpbmcodHlwZSk7Ci0gICAgICAgICAgICBpZiAocGhvbmVUeXBlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBhcHBlbmRUeXBlUGFyYW1ldGVyKHBob25lVHlwZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJVbmtub3duIG9yIHVuc3VwcG9ydGVkIChieSB2Q2FyZCkgUGhvbmUgdHlwZTogIiArIHR5cGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGVuY29kZWRWYWx1ZSBNdXN0IGJlIGVuY29kZWQgYnkgQkFTRTY0IAotICAgICAqIEBwYXJhbSBwaG90b1R5cGUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhcHBlbmRQaG90b0xpbmUoZmluYWwgU3RyaW5nIGVuY29kZWRWYWx1ZSwgZmluYWwgU3RyaW5nIHBob3RvVHlwZSkgewotICAgICAgICBTdHJpbmdCdWlsZGVyIHRtcEJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICB0bXBCdWlsZGVyLmFwcGVuZChWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9QSE9UTyk7Ci0gICAgICAgIHRtcEJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX1NFUEFSQVRPUik7Ci0gICAgICAgIGlmIChtSXNWMzApIHsKLSAgICAgICAgICAgIHRtcEJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX0VOQ09ESU5HX0JBU0U2NF9WMzApOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdG1wQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fRU5DT0RJTkdfQkFTRTY0X1YyMSk7Ci0gICAgICAgIH0KLSAgICAgICAgdG1wQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fU0VQQVJBVE9SKTsKLSAgICAgICAgYXBwZW5kVHlwZVBhcmFtZXRlcih0bXBCdWlsZGVyLCBwaG90b1R5cGUpOwotICAgICAgICB0bXBCdWlsZGVyLmFwcGVuZChWQ0FSRF9EQVRBX1NFUEFSQVRPUik7Ci0gICAgICAgIHRtcEJ1aWxkZXIuYXBwZW5kKGVuY29kZWRWYWx1ZSk7Ci0KLSAgICAgICAgZmluYWwgU3RyaW5nIHRtcFN0ciA9IHRtcEJ1aWxkZXIudG9TdHJpbmcoKTsKLSAgICAgICAgdG1wQnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIGludCBsaW5lQ291bnQgPSAwOwotICAgICAgICBmaW5hbCBpbnQgbGVuZ3RoID0gdG1wU3RyLmxlbmd0aCgpOwotICAgICAgICBmaW5hbCBpbnQgbWF4TnVtRm9yRmlyc3RMaW5lID0gVkNhcmRDb25zdGFudHMuTUFYX0NIQVJBQ1RFUl9OVU1TX0JBU0U2NF9WMzAKLSAgICAgICAgICAgICAgICAtIFZDQVJEX0VORF9PRl9MSU5FLmxlbmd0aCgpOwotICAgICAgICBmaW5hbCBpbnQgbWF4TnVtSW5HZW5lcmFsID0gbWF4TnVtRm9yRmlyc3RMaW5lIC0gVkNBUkRfV1MubGVuZ3RoKCk7Ci0gICAgICAgIGludCBtYXhOdW0gPSBtYXhOdW1Gb3JGaXJzdExpbmU7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIHRtcEJ1aWxkZXIuYXBwZW5kKHRtcFN0ci5jaGFyQXQoaSkpOwotICAgICAgICAgICAgbGluZUNvdW50Kys7Ci0gICAgICAgICAgICBpZiAobGluZUNvdW50ID4gbWF4TnVtKSB7Ci0gICAgICAgICAgICAgICAgdG1wQnVpbGRlci5hcHBlbmQoVkNBUkRfRU5EX09GX0xJTkUpOwotICAgICAgICAgICAgICAgIHRtcEJ1aWxkZXIuYXBwZW5kKFZDQVJEX1dTKTsKLSAgICAgICAgICAgICAgICBtYXhOdW0gPSBtYXhOdW1JbkdlbmVyYWw7Ci0gICAgICAgICAgICAgICAgbGluZUNvdW50ID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBtQnVpbGRlci5hcHBlbmQodG1wQnVpbGRlci50b1N0cmluZygpKTsKLSAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0VORF9PRl9MSU5FKTsKLSAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0VORF9PRl9MSU5FKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhcHBlbmRBbmRyb2lkU3BlY2lmaWNQcm9wZXJ0eShmaW5hbCBTdHJpbmcgbWltZVR5cGUsIENvbnRlbnRWYWx1ZXMgY29udGVudFZhbHVlcykgewotICAgICAgICBpZiAoIXNBbGxvd2VkQW5kcm9pZFByb3BlcnR5U2V0LmNvbnRhaW5zKG1pbWVUeXBlKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIExpc3Q8U3RyaW5nPiByYXdWYWx1ZUxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gVkNhcmRDb25zdGFudHMuTUFYX0RBVEFfQ09MVU1OOyBpKyspIHsKLSAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoImRhdGEiICsgaSk7Ci0gICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHZhbHVlID0gIiI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByYXdWYWx1ZUxpc3QuYWRkKHZhbHVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGJvb2xlYW4gbmVlZENoYXJzZXQgPQotICAgICAgICAgICAgKG1TaG91bGRBcHBlbmRDaGFyc2V0UGFyYW0gJiYKLSAgICAgICAgICAgICAgICAgICAgIVZDYXJkVXRpbHMuY29udGFpbnNPbmx5Tm9uQ3JMZlByaW50YWJsZUFzY2lpKHJhd1ZhbHVlTGlzdCkpOwotICAgICAgICBib29sZWFuIHJlYWxseVVzZVF1b3RlZFByaW50YWJsZSA9Ci0gICAgICAgICAgICAobVNob3VsZFVzZVF1b3RlZFByaW50YWJsZSAmJgotICAgICAgICAgICAgICAgICAgICAhVkNhcmRVdGlscy5jb250YWluc09ubHlOb25DckxmUHJpbnRhYmxlQXNjaWkocmF3VmFsdWVMaXN0KSk7Ci0gICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9YX0FORFJPSURfQ1VTVE9NKTsKLSAgICAgICAgaWYgKG5lZWRDaGFyc2V0KSB7Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChtVkNhcmRDaGFyc2V0UGFyYW1ldGVyKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlKSB7Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9FTkNPRElOR19RUCk7Ci0gICAgICAgIH0KLSAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0RBVEFfU0VQQVJBVE9SKTsKLSAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKG1pbWVUeXBlKTsgIC8vIFNob3VsZCBub3QgYmUgZW5jb2RlZC4KLSAgICAgICAgZm9yIChTdHJpbmcgcmF3VmFsdWUgOiByYXdWYWx1ZUxpc3QpIHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBlbmNvZGVkVmFsdWU7Ci0gICAgICAgICAgICBpZiAocmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlKSB7Ci0gICAgICAgICAgICAgICAgZW5jb2RlZFZhbHVlID0gZW5jb2RlUXVvdGVkUHJpbnRhYmxlKHJhd1ZhbHVlKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gVE9ETzogb25lIGxpbmUgbWF5IGJlIHRvbyBodWdlLCB3aGljaCBtYXkgYmUgaW52YWxpZCBpbiB2Q2FyZCAzLjAKLSAgICAgICAgICAgICAgICAvLyAgICAgICAgKHdoaWNoIHNheXMgIldoZW4gZ2VuZXJhdGluZyBhIGNvbnRlbnQgbGluZSwgbGluZXMgbG9uZ2VyIHRoYW4KLSAgICAgICAgICAgICAgICAvLyAgICAgICAgNzUgY2hhcmFjdGVycyBTSE9VTEQgYmUgZm9sZGVkIiksIHRob3VnaCBzZXZlcmFsCi0gICAgICAgICAgICAgICAgLy8gICAgICAgIChldmVuIHdlbGwta25vd24pIGFwcGxpY2F0aW9ucyBkbyBub3QgY2FyZSB0aGlzLgotICAgICAgICAgICAgICAgIGVuY29kZWRWYWx1ZSA9IGVzY2FwZUNoYXJhY3RlcnMocmF3VmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0lURU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChlbmNvZGVkVmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9FTkRfT0ZfTElORSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYXBwZW5kTGluZVdpdGhDaGFyc2V0QW5kUVBEZXRlY3Rpb24oZmluYWwgU3RyaW5nIHByb3BlcnR5TmFtZSwKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyByYXdWYWx1ZSkgewotICAgICAgICBhcHBlbmRMaW5lV2l0aENoYXJzZXRBbmRRUERldGVjdGlvbihwcm9wZXJ0eU5hbWUsIG51bGwsIHJhd1ZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhcHBlbmRMaW5lV2l0aENoYXJzZXRBbmRRUERldGVjdGlvbigKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBwcm9wZXJ0eU5hbWUsIGZpbmFsIExpc3Q8U3RyaW5nPiByYXdWYWx1ZUxpc3QpIHsKLSAgICAgICAgYXBwZW5kTGluZVdpdGhDaGFyc2V0QW5kUVBEZXRlY3Rpb24ocHJvcGVydHlOYW1lLCBudWxsLCByYXdWYWx1ZUxpc3QpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFwcGVuZExpbmVXaXRoQ2hhcnNldEFuZFFQRGV0ZWN0aW9uKGZpbmFsIFN0cmluZyBwcm9wZXJ0eU5hbWUsCi0gICAgICAgICAgICBmaW5hbCBMaXN0PFN0cmluZz4gcGFyYW1ldGVyTGlzdCwgZmluYWwgU3RyaW5nIHJhd1ZhbHVlKSB7Ci0gICAgICAgIGZpbmFsIGJvb2xlYW4gbmVlZENoYXJzZXQgPQotICAgICAgICAgICAgICAgICFWQ2FyZFV0aWxzLmNvbnRhaW5zT25seVByaW50YWJsZUFzY2lpKHJhd1ZhbHVlKTsKLSAgICAgICAgZmluYWwgYm9vbGVhbiByZWFsbHlVc2VRdW90ZWRQcmludGFibGUgPQotICAgICAgICAgICAgICAgIChtU2hvdWxkVXNlUXVvdGVkUHJpbnRhYmxlICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAhVkNhcmRVdGlscy5jb250YWluc09ubHlOb25DckxmUHJpbnRhYmxlQXNjaWkocmF3VmFsdWUpKTsKLSAgICAgICAgYXBwZW5kTGluZShwcm9wZXJ0eU5hbWUsIHBhcmFtZXRlckxpc3QsCi0gICAgICAgICAgICAgICAgcmF3VmFsdWUsIG5lZWRDaGFyc2V0LCByZWFsbHlVc2VRdW90ZWRQcmludGFibGUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFwcGVuZExpbmVXaXRoQ2hhcnNldEFuZFFQRGV0ZWN0aW9uKGZpbmFsIFN0cmluZyBwcm9wZXJ0eU5hbWUsCi0gICAgICAgICAgICBmaW5hbCBMaXN0PFN0cmluZz4gcGFyYW1ldGVyTGlzdCwgZmluYWwgTGlzdDxTdHJpbmc+IHJhd1ZhbHVlTGlzdCkgewotICAgICAgICBib29sZWFuIG5lZWRDaGFyc2V0ID0KLSAgICAgICAgICAgIChtU2hvdWxkQXBwZW5kQ2hhcnNldFBhcmFtICYmCi0gICAgICAgICAgICAgICAgICAgICFWQ2FyZFV0aWxzLmNvbnRhaW5zT25seU5vbkNyTGZQcmludGFibGVBc2NpaShyYXdWYWx1ZUxpc3QpKTsKLSAgICAgICAgYm9vbGVhbiByZWFsbHlVc2VRdW90ZWRQcmludGFibGUgPQotICAgICAgICAgICAgKG1TaG91bGRVc2VRdW90ZWRQcmludGFibGUgJiYKLSAgICAgICAgICAgICAgICAgICAgIVZDYXJkVXRpbHMuY29udGFpbnNPbmx5Tm9uQ3JMZlByaW50YWJsZUFzY2lpKHJhd1ZhbHVlTGlzdCkpOwotICAgICAgICBhcHBlbmRMaW5lKHByb3BlcnR5TmFtZSwgcGFyYW1ldGVyTGlzdCwgcmF3VmFsdWVMaXN0LAotICAgICAgICAgICAgICAgIG5lZWRDaGFyc2V0LCByZWFsbHlVc2VRdW90ZWRQcmludGFibGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFwcGVuZHMgb25lIGxpbmUgd2l0aCBhIGdpdmVuIHByb3BlcnR5IG5hbWUgYW5kIHZhbHVlLiAgCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYXBwZW5kTGluZShmaW5hbCBTdHJpbmcgcHJvcGVydHlOYW1lLCBmaW5hbCBTdHJpbmcgcmF3VmFsdWUpIHsKLSAgICAgICAgYXBwZW5kTGluZShwcm9wZXJ0eU5hbWUsIHJhd1ZhbHVlLCBmYWxzZSwgZmFsc2UpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFwcGVuZExpbmUoZmluYWwgU3RyaW5nIHByb3BlcnR5TmFtZSwgZmluYWwgTGlzdDxTdHJpbmc+IHJhd1ZhbHVlTGlzdCkgewotICAgICAgICBhcHBlbmRMaW5lKHByb3BlcnR5TmFtZSwgcmF3VmFsdWVMaXN0LCBmYWxzZSwgZmFsc2UpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFwcGVuZExpbmUoZmluYWwgU3RyaW5nIHByb3BlcnR5TmFtZSwKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyByYXdWYWx1ZSwgZmluYWwgYm9vbGVhbiBuZWVkQ2hhcnNldCwKLSAgICAgICAgICAgIGJvb2xlYW4gcmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlKSB7Ci0gICAgICAgIGFwcGVuZExpbmUocHJvcGVydHlOYW1lLCBudWxsLCByYXdWYWx1ZSwgbmVlZENoYXJzZXQsIHJlYWxseVVzZVF1b3RlZFByaW50YWJsZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYXBwZW5kTGluZShmaW5hbCBTdHJpbmcgcHJvcGVydHlOYW1lLCBmaW5hbCBMaXN0PFN0cmluZz4gcGFyYW1ldGVyTGlzdCwKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyByYXdWYWx1ZSkgewotICAgICAgICBhcHBlbmRMaW5lKHByb3BlcnR5TmFtZSwgcGFyYW1ldGVyTGlzdCwgcmF3VmFsdWUsIGZhbHNlLCBmYWxzZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYXBwZW5kTGluZShmaW5hbCBTdHJpbmcgcHJvcGVydHlOYW1lLCBmaW5hbCBMaXN0PFN0cmluZz4gcGFyYW1ldGVyTGlzdCwKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyByYXdWYWx1ZSwgZmluYWwgYm9vbGVhbiBuZWVkQ2hhcnNldCwKLSAgICAgICAgICAgIGJvb2xlYW4gcmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlKSB7Ci0gICAgICAgIG1CdWlsZGVyLmFwcGVuZChwcm9wZXJ0eU5hbWUpOwotICAgICAgICBpZiAocGFyYW1ldGVyTGlzdCAhPSBudWxsICYmIHBhcmFtZXRlckxpc3Quc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICBhcHBlbmRUeXBlUGFyYW1ldGVycyhwYXJhbWV0ZXJMaXN0KTsKLSAgICAgICAgfQotICAgICAgICBpZiAobmVlZENoYXJzZXQpIHsKLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKG1WQ2FyZENoYXJzZXRQYXJhbWV0ZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgU3RyaW5nIGVuY29kZWRWYWx1ZTsKLSAgICAgICAgaWYgKHJlYWxseVVzZVF1b3RlZFByaW50YWJsZSkgewotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fRU5DT0RJTkdfUVApOwotICAgICAgICAgICAgZW5jb2RlZFZhbHVlID0gZW5jb2RlUXVvdGVkUHJpbnRhYmxlKHJhd1ZhbHVlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIFRPRE86IG9uZSBsaW5lIG1heSBiZSB0b28gaHVnZSwgd2hpY2ggbWF5IGJlIGludmFsaWQgaW4gdkNhcmQgc3BlYywgdGhvdWdoCi0gICAgICAgICAgICAvLyAgICAgICBzZXZlcmFsIChldmVuIHdlbGwta25vd24pIGFwcGxpY2F0aW9ucyBkbyBub3QgY2FyZSB0aGlzLgotICAgICAgICAgICAgZW5jb2RlZFZhbHVlID0gZXNjYXBlQ2hhcmFjdGVycyhyYXdWYWx1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfREFUQV9TRVBBUkFUT1IpOwotICAgICAgICBtQnVpbGRlci5hcHBlbmQoZW5jb2RlZFZhbHVlKTsKLSAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0VORF9PRl9MSU5FKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhcHBlbmRMaW5lKGZpbmFsIFN0cmluZyBwcm9wZXJ0eU5hbWUsIGZpbmFsIExpc3Q8U3RyaW5nPiByYXdWYWx1ZUxpc3QsCi0gICAgICAgICAgICBmaW5hbCBib29sZWFuIG5lZWRDaGFyc2V0LCBib29sZWFuIG5lZWRRdW90ZWRQcmludGFibGUpIHsKLSAgICAgICAgYXBwZW5kTGluZShwcm9wZXJ0eU5hbWUsIG51bGwsIHJhd1ZhbHVlTGlzdCwgbmVlZENoYXJzZXQsIG5lZWRRdW90ZWRQcmludGFibGUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFwcGVuZExpbmUoZmluYWwgU3RyaW5nIHByb3BlcnR5TmFtZSwgZmluYWwgTGlzdDxTdHJpbmc+IHBhcmFtZXRlckxpc3QsCi0gICAgICAgICAgICBmaW5hbCBMaXN0PFN0cmluZz4gcmF3VmFsdWVMaXN0LCBmaW5hbCBib29sZWFuIG5lZWRDaGFyc2V0LAotICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBuZWVkUXVvdGVkUHJpbnRhYmxlKSB7Ci0gICAgICAgIG1CdWlsZGVyLmFwcGVuZChwcm9wZXJ0eU5hbWUpOwotICAgICAgICBpZiAocGFyYW1ldGVyTGlzdCAhPSBudWxsICYmIHBhcmFtZXRlckxpc3Quc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICBhcHBlbmRUeXBlUGFyYW1ldGVycyhwYXJhbWV0ZXJMaXN0KTsKLSAgICAgICAgfQotICAgICAgICBpZiAobmVlZENoYXJzZXQpIHsKLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKG1WQ2FyZENoYXJzZXRQYXJhbWV0ZXIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChuZWVkUXVvdGVkUHJpbnRhYmxlKSB7Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9FTkNPRElOR19RUCk7Ci0gICAgICAgIH0KLQotICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfREFUQV9TRVBBUkFUT1IpOwotICAgICAgICBib29sZWFuIGZpcnN0ID0gdHJ1ZTsKLSAgICAgICAgZm9yIChTdHJpbmcgcmF3VmFsdWUgOiByYXdWYWx1ZUxpc3QpIHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBlbmNvZGVkVmFsdWU7Ci0gICAgICAgICAgICBpZiAobmVlZFF1b3RlZFByaW50YWJsZSkgewotICAgICAgICAgICAgICAgIGVuY29kZWRWYWx1ZSA9IGVuY29kZVF1b3RlZFByaW50YWJsZShyYXdWYWx1ZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIFRPRE86IG9uZSBsaW5lIG1heSBiZSB0b28gaHVnZSwgd2hpY2ggbWF5IGJlIGludmFsaWQgaW4gdkNhcmQgMy4wCi0gICAgICAgICAgICAgICAgLy8gICAgICAgICh3aGljaCBzYXlzICJXaGVuIGdlbmVyYXRpbmcgYSBjb250ZW50IGxpbmUsIGxpbmVzIGxvbmdlciB0aGFuCi0gICAgICAgICAgICAgICAgLy8gICAgICAgIDc1IGNoYXJhY3RlcnMgU0hPVUxEIGJlIGZvbGRlZCIpLCB0aG91Z2ggc2V2ZXJhbAotICAgICAgICAgICAgICAgIC8vICAgICAgICAoZXZlbiB3ZWxsLWtub3duKSBhcHBsaWNhdGlvbnMgZG8gbm90IGNhcmUgdGhpcy4KLSAgICAgICAgICAgICAgICBlbmNvZGVkVmFsdWUgPSBlc2NhcGVDaGFyYWN0ZXJzKHJhd1ZhbHVlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0lURU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChlbmNvZGVkVmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9FTkRfT0ZfTElORSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVkNBUkRfUEFSQU1fU0VQQVJBVE9SIG11c3QgYmUgYXBwZW5kZWQgYmVmb3JlIHRoaXMgbWV0aG9kIGJlaW5nIGNhbGxlZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgYXBwZW5kVHlwZVBhcmFtZXRlcnMoZmluYWwgTGlzdDxTdHJpbmc+IHR5cGVzKSB7Ci0gICAgICAgIC8vIFdlIG1heSBoYXZlIHRvIG1ha2UgdGhpcyBjb21tYSBzZXBhcmF0ZWQgZm9ybSBsaWtlICJUWVBFPURPTSxXT1JLIiBpbiB0aGUgZnV0dXJlLAotICAgICAgICAvLyB3aGljaCB3b3VsZCBiZSByZWNvbW1lbmRlZCB3YXkgaW4gdmNhcmQgMy4wIHRob3VnaCBub3QgdmFsaWQgaW4gdkNhcmQgMi4xLgotICAgICAgICBib29sZWFuIGZpcnN0ID0gdHJ1ZTsKLSAgICAgICAgZm9yIChmaW5hbCBTdHJpbmcgdHlwZVZhbHVlIDogdHlwZXMpIHsKLSAgICAgICAgICAgIC8vIE5vdGU6IHZDYXJkIDMuMCBzcGVjaWZpZXMgdGhlIGRpZmZlcmVudCB0eXBlIG9mIGFjY2VwdGFibGUgdHlwZSBTdHJpbmdzLCBidXQKLSAgICAgICAgICAgIC8vICAgICAgIHdlIGRvbid0IGVtaXQgdGhhdCBraW5kIG9mIHZDYXJkIDMuMCBzcGVjaWZpYyB0eXBlIHNpbmNlIHRoZXJlIHNob3VsZCBiZQotICAgICAgICAgICAgLy8gICAgICAgaGlnaCBwcm9iYWJpbHl0eSBpbiB3aGljaCBleHRlcm5hbCBpbXBvcnRlcnMgY2Fubm90IHVuZGVyc3RhbmQgdGhlbS4KLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAvLyBlLmcuIFRZUEU9Ilx1NTc4Qlx1MzA2Qlx1MzA4NyIgKHZDYXJkIDMuMCBhbGxvd3Mgbm9uLUFzY2lpIGNoYXJhY3RlcnMgaWYgdGhleQotICAgICAgICAgICAgLy8gICAgICBhcmUgcXVvdGVkLikKLSAgICAgICAgICAgIGlmICghVkNhcmRVdGlscy5pc1YyMVdvcmQodHlwZVZhbHVlKSkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhcHBlbmRUeXBlUGFyYW1ldGVyKHR5cGVWYWx1ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBWQ0FSRF9QQVJBTV9TRVBBUkFUT1IgbXVzdCBiZSBhcHBlbmRlZCBiZWZvcmUgdGhpcyBtZXRob2QgYmVpbmcgY2FsbGVkLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBhcHBlbmRUeXBlUGFyYW1ldGVyKGZpbmFsIFN0cmluZyB0eXBlKSB7Ci0gICAgICAgIGFwcGVuZFR5cGVQYXJhbWV0ZXIobUJ1aWxkZXIsIHR5cGUpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhcHBlbmRUeXBlUGFyYW1ldGVyKGZpbmFsIFN0cmluZ0J1aWxkZXIgYnVpbGRlciwgZmluYWwgU3RyaW5nIHR5cGUpIHsKLSAgICAgICAgLy8gUmVmcmFpbiBmcm9tIHVzaW5nIGFwcGVuZFR5cGUoKSBzbyB0aGF0ICJUWVBFPSIgaXMgbm90IGJlIGFwcGVuZGVkIHdoZW4gdGhlCi0gICAgICAgIC8vIGRldmljZSBpcyBEb0NvTW8ncyAoanVzdCBmb3Igc2FmZXR5KS4KLSAgICAgICAgLy8KLSAgICAgICAgLy8gTm90ZTogSW4gdkNhcmQgMy4wLCBUeXBlIHN0cmluZ3MgYWxzbyBjYW4gYmUgbGlrZSB0aGlzOiAiVFlQRT1IT01FLFBSRUYiCi0gICAgICAgIGlmICgobUlzVjMwIHx8IG1BcHBlbmRUeXBlUGFyYW1OYW1lKSAmJiAhbUlzRG9Db01vKSB7Ci0gICAgICAgICAgICBidWlsZGVyLmFwcGVuZChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFKS5hcHBlbmQoVkNBUkRfUEFSQU1fRVFVQUwpOwotICAgICAgICB9Ci0gICAgICAgIGJ1aWxkZXIuYXBwZW5kKHR5cGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSB3aGVuIHRoZSBwcm9wZXJ0eSBsaW5lIHNob3VsZCBjb250YWluIGNoYXJzZXQgcGFyYW1ldGVyCi0gICAgICogaW5mb3JtYXRpb24uIFRoaXMgbWV0aG9kIG1heSByZXR1cm4gdHJ1ZSBldmVuIHdoZW4gdkNhcmQgdmVyc2lvbiBpcyAzLjAuCi0gICAgICoKLSAgICAgKiBTdHJpY3RseSwgYWRkaW5nIGNoYXJzZXQgaW5mb3JtYXRpb24gaXMgaW52YWxpZCBpbiBWQ2FyZCAzLjAuCi0gICAgICogSG93ZXZlciB3ZSdsbCBhZGQgdGhlIGluZm8gb25seSB3aGVuIGNoYXJzZXQgd2UgdXNlIGlzIG5vdCBVVEYtOAotICAgICAqIGluIHZDYXJkIDMuMCBmb3JtYXQsIHNpbmNlIHBhcnNlciBzaWRlIG1heSBiZSBhYmxlIHRvIHVzZSB0aGUgY2hhcnNldAotICAgICAqIHZpYSB0aGlzIGZpZWxkLCB0aG91Z2ggd2UgbWF5IGVuY291bnRlciBhbm90aGVyIHByb2JsZW0gYnkgYWRkaW5nIGl0LgotICAgICAqCi0gICAgICogZS5nLiBKYXBhbmVzZSBtb2JpbGUgcGhvbmVzIHVzZSBTaGlmdF9KaXMgd2hpbGUgUkZDIDI0MjYKLSAgICAgKiByZWNvbW1lbmRzIFVURi04LiBCeSBhZGRpbmcgdGhpcyBmaWVsZCwgcGFyc2VycyBtYXkgYmUgYWJsZQotICAgICAqIHRvIGtub3cgdGhpcyB0ZXh0IGlzIE5PVCBVVEYtOCBidXQgU2hpZnRfSmlzLgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBzaG91bGRBcHBlbmRDaGFyc2V0UGFyYW0oU3RyaW5nLi4ucHJvcGVydHlWYWx1ZUxpc3QpIHsKLSAgICAgICAgaWYgKCFtU2hvdWxkQXBwZW5kQ2hhcnNldFBhcmFtKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChTdHJpbmcgcHJvcGVydHlWYWx1ZSA6IHByb3BlcnR5VmFsdWVMaXN0KSB7Ci0gICAgICAgICAgICBpZiAoIVZDYXJkVXRpbHMuY29udGFpbnNPbmx5UHJpbnRhYmxlQXNjaWkocHJvcGVydHlWYWx1ZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZW5jb2RlUXVvdGVkUHJpbnRhYmxlKGZpbmFsIFN0cmluZyBzdHIpIHsKLSAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHN0cikpIHsKLSAgICAgICAgICAgIHJldHVybiAiIjsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIGludCBpbmRleCA9IDA7Ci0gICAgICAgIGludCBsaW5lQ291bnQgPSAwOwotICAgICAgICBieXRlW10gc3RyQXJyYXkgPSBudWxsOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzdHJBcnJheSA9IHN0ci5nZXRCeXRlcyhtQ2hhcnNldFN0cmluZyk7Ci0gICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIkNoYXJzZXQgIiArIG1DaGFyc2V0U3RyaW5nICsgIiBjYW5ub3QgYmUgdXNlZC4gIgotICAgICAgICAgICAgICAgICAgICArICJUcnkgZGVmYXVsdCBjaGFyc2V0Iik7Ci0gICAgICAgICAgICBzdHJBcnJheSA9IHN0ci5nZXRCeXRlcygpOwotICAgICAgICB9Ci0gICAgICAgIHdoaWxlIChpbmRleCA8IHN0ckFycmF5Lmxlbmd0aCkgewotICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoU3RyaW5nLmZvcm1hdCgiPSUwMlgiLCBzdHJBcnJheVtpbmRleF0pKTsKLSAgICAgICAgICAgIGluZGV4ICs9IDE7Ci0gICAgICAgICAgICBsaW5lQ291bnQgKz0gMzsKLQotICAgICAgICAgICAgaWYgKGxpbmVDb3VudCA+PSA2NykgewotICAgICAgICAgICAgICAgIC8vIFNwZWNpZmljYXRpb24gcmVxdWlyZXMgQ1JMRiBtdXN0IGJlIGluc2VydGVkIGJlZm9yZSB0aGUKLSAgICAgICAgICAgICAgICAvLyBsZW5ndGggb2YgdGhlIGxpbmUKLSAgICAgICAgICAgICAgICAvLyBiZWNvbWVzIG1vcmUgdGhhbiA3Ni4KLSAgICAgICAgICAgICAgICAvLyBBc3N1bWluZyB0aGF0IHRoZSBuZXh0IGNoYXJhY3RlciBpcyBhIG11bHRpLWJ5dGUgY2hhcmFjdGVyLAotICAgICAgICAgICAgICAgIC8vIGl0IHdpbGwgYmVjb21lCi0gICAgICAgICAgICAgICAgLy8gNiBieXRlcy4KLSAgICAgICAgICAgICAgICAvLyA3NiAtIDYgLSAzID0gNjcKLSAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiPVxyXG4iKTsKLSAgICAgICAgICAgICAgICBsaW5lQ291bnQgPSAwOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGJ1aWxkZXIudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBcHBlbmQgJ1wnIHRvIHRoZSBjaGFyYWN0ZXJzIHdoaWNoIHNob3VsZCBiZSBlc2NhcGVkLiBUaGUgY2hhcmFjdGVyIHNldCBpcyBkaWZmZXJlbnQKLSAgICAgKiBub3Qgb25seSBiZXR3ZWVuIHZDYXJkIDIuMSBhbmQgdkNhcmQgMy4wIGJ1dCBhbHNvIGFtb25nIGVhY2ggZGV2aWNlLgotICAgICAqCi0gICAgICogTm90ZSB0aGF0IFF1b3RlZC1QcmludGFibGUgc3RyaW5nIG11c3Qgbm90IGJlIGlucHV0IGhlcmUuCi0gICAgICovCi0gICAgQFN1cHByZXNzV2FybmluZ3MoImZhbGx0aHJvdWdoIikKLSAgICBwcml2YXRlIFN0cmluZyBlc2NhcGVDaGFyYWN0ZXJzKGZpbmFsIFN0cmluZyB1bmVzY2FwZWQpIHsKLSAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHVuZXNjYXBlZCkpIHsKLSAgICAgICAgICAgIHJldHVybiAiIjsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgdG1wQnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIGZpbmFsIGludCBsZW5ndGggPSB1bmVzY2FwZWQubGVuZ3RoKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGZpbmFsIGNoYXIgY2ggPSB1bmVzY2FwZWQuY2hhckF0KGkpOwotICAgICAgICAgICAgc3dpdGNoIChjaCkgewotICAgICAgICAgICAgICAgIGNhc2UgJzsnOiB7Ci0gICAgICAgICAgICAgICAgICAgIHRtcEJ1aWxkZXIuYXBwZW5kKCdcXCcpOwotICAgICAgICAgICAgICAgICAgICB0bXBCdWlsZGVyLmFwcGVuZCgnOycpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2FzZSAnXHInOiB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpICsgMSA8IGxlbmd0aCkgewotICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBuZXh0Q2hhciA9IHVuZXNjYXBlZC5jaGFyQXQoaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV4dENoYXIgPT0gJ1xuJykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmYWxsIHRocm91Z2gKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaAotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhc2UgJ1xuJzogewotICAgICAgICAgICAgICAgICAgICAvLyBJbiB2Q2FyZCAyLjEsIHRoZXJlJ3Mgbm8gc3BlY2lmaWNhdGlvbiBhYm91dCB0aGlzLCB3aGlsZQotICAgICAgICAgICAgICAgICAgICAvLyB2Q2FyZCAzLjAgZXhwbGljaXRseSByZXF1aXJlcyB0aGlzIHNob3VsZCBiZSBlbmNvZGVkIHRvICJcbiIuCi0gICAgICAgICAgICAgICAgICAgIHRtcEJ1aWxkZXIuYXBwZW5kKCJcXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhc2UgJ1xcJzogewotICAgICAgICAgICAgICAgICAgICBpZiAobUlzVjMwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0bXBCdWlsZGVyLmFwcGVuZCgiXFxcXCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBmYWxsIHRocm91Z2gKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXNlICc8JzoKLSAgICAgICAgICAgICAgICBjYXNlICc+JzogewotICAgICAgICAgICAgICAgICAgICBpZiAobUlzRG9Db01vKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0bXBCdWlsZGVyLmFwcGVuZCgnXFwnKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRtcEJ1aWxkZXIuYXBwZW5kKGNoKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRtcEJ1aWxkZXIuYXBwZW5kKGNoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2FzZSAnLCc6IHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1Jc1YzMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdG1wQnVpbGRlci5hcHBlbmQoIlxcLCIpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgdG1wQnVpbGRlci5hcHBlbmQoY2gpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB7Ci0gICAgICAgICAgICAgICAgICAgIHRtcEJ1aWxkZXIuYXBwZW5kKGNoKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0bXBCdWlsZGVyLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgaWYgKCFtRW5kQXBwZW5kZWQpIHsKLSAgICAgICAgICAgIGlmIChtSXNEb0NvTW8pIHsKLSAgICAgICAgICAgICAgICBhcHBlbmRMaW5lKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1hfQ0xBU1MsIFZDQVJEX0RBVEFfUFVCTElDKTsKLSAgICAgICAgICAgICAgICBhcHBlbmRMaW5lKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1hfUkVEVUNUSU9OLCAiIik7Ci0gICAgICAgICAgICAgICAgYXBwZW5kTGluZShWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9YX05PLCAiIik7Ci0gICAgICAgICAgICAgICAgYXBwZW5kTGluZShWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9YX0RDTV9ITU5fTU9ERSwgIiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYXBwZW5kTGluZShWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9FTkQsIFZDQVJEX0RBVEFfVkNBUkQpOwotICAgICAgICAgICAgbUVuZEFwcGVuZGVkID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbUJ1aWxkZXIudG9TdHJpbmcoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRDb21wb3Nlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkQ29tcG9zZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGU4YjY2NS4uMDAwMDAwMAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRDb21wb3Nlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAotICogdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSAqIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAotICogV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlCi0gKiBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgotICogdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC5waW0udmNhcmQ7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50VmFsdWVzOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5FbnRpdHk7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkVudGl0eUl0ZXJhdG9yOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5FbnRpdHkuTmFtZWRDb250ZW50VmFsdWVzOwotaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yOwotaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZUV4Y2VwdGlvbjsKLWltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7Ci1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuZXhjZXB0aW9uLlZDYXJkRXhjZXB0aW9uOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db250YWN0czsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuRGF0YTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuUmF3Q29udGFjdHM7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LlJhd0NvbnRhY3RzRW50aXR5OwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuRW1haWw7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5FdmVudDsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLkltOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuTmlja25hbWU7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5Ob3RlOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuT3JnYW5pemF0aW9uOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuUGhvbmU7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5QaG90bzsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLlJlbGF0aW9uOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuU3RydWN0dXJlZE5hbWU7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5TdHJ1Y3R1cmVkUG9zdGFsOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuV2Vic2l0ZTsKLWltcG9ydCBhbmRyb2lkLnV0aWwuQ2hhcnNldFV0aWxzOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLldyaXRlcjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlVuc3VwcG9ydGVkQ2hhcnNldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogPHA+Ci0gKiBUaGUgY2xhc3MgZm9yIGNvbXBvc2luZyBWQ2FyZCBmcm9tIENvbnRhY3RzIGluZm9ybWF0aW9uLiBOb3RlIHRoYXQgdGhpcyBpcwotICogY29tcGxldGVseSBkaWZmZXJudCBpbXBsZW1lbnRhdGlvbiBmcm9tCi0gKiBhbmRyb2lkLnN5bmNtbC5waW0udmNhcmQuVkNhcmRDb21wb3Nlciwgd2hpY2ggaXMgbm90IG1haW50YWluZWQgYW55bW9yZS4KLSAqIDwvcD4KLSAqCi0gKiA8cD4KLSAqIFVzdWFsbHksIHRoaXMgY2xhc3Mgc2hvdWxkIGJlIHVzZWQgbGlrZSB0aGlzLgotICogPC9wPgotICoKLSAqIDxwcmUgY2xhc3M9InByZXR0eXByaW50Ij5WQ2FyZENvbXBvc2VyIGNvbXBvc2VyID0gbnVsbDsKLSAqIHRyeSB7Ci0gKiAgICAgY29tcG9zZXIgPSBuZXcgVkNhcmRDb21wb3Nlcihjb250ZXh0KTsKLSAqICAgICBjb21wb3Nlci5hZGRIYW5kbGVyKAotICogICAgICAgICAgICAgY29tcG9zZXIubmV3IEhhbmRsZXJGb3JPdXRwdXRTdHJlYW0ob3V0cHV0U3RyZWFtKSk7Ci0gKiAgICAgaWYgKCFjb21wb3Nlci5pbml0KCkpIHsKLSAqICAgICAgICAgLy8gRG8gc29tZXRoaW5nIGhhbmRsaW5nIHRoZSBzaXR1YXRpb24uCi0gKiAgICAgICAgIHJldHVybjsKLSAqICAgICB9Ci0gKiAgICAgd2hpbGUgKCFjb21wb3Nlci5pc0FmdGVyTGFzdCgpKSB7Ci0gKiAgICAgICAgIGlmIChtQ2FuY2VsZWQpIHsKLSAqICAgICAgICAgICAgIC8vIEFzc3VtZSBhIHVzZXIgbWF5IGNhbmNlbCB0aGlzIG9wZXJhdGlvbiBkdXJpbmcgdGhlIGV4cG9ydC4KLSAqICAgICAgICAgICAgIHJldHVybjsKLSAqICAgICAgICAgfQotICogICAgICAgICBpZiAoIWNvbXBvc2VyLmNyZWF0ZU9uZUVudHJ5KCkpIHsKLSAqICAgICAgICAgICAgIC8vIERvIHNvbWV0aGluZyBoYW5kbGluZyB0aGUgZXJyb3Igc2l0dWF0aW9uLgotICogICAgICAgICAgICAgcmV0dXJuOwotICogICAgICAgICB9Ci0gKiAgICAgfQotICogfSBmaW5hbGx5IHsKLSAqICAgICBpZiAoY29tcG9zZXIgIT0gbnVsbCkgewotICogICAgICAgICBjb21wb3Nlci50ZXJtaW5hdGUoKTsKLSAqICAgICB9Ci0gKiB9IDwvcHJlPgotICovCi1wdWJsaWMgY2xhc3MgVkNhcmRDb21wb3NlciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19UQUcgPSAiVkNhcmRDb21wb3NlciI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX1BIT05FX1RZUEUgPSBQaG9uZS5UWVBFX0hPTUU7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9QT1NUQUxfVFlQRSA9IFN0cnVjdHVyZWRQb3N0YWwuVFlQRV9IT01FOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfRU1BSUxfVFlQRSA9IEVtYWlsLlRZUEVfT1RIRVI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGQUlMVVJFX1JFQVNPTl9GQUlMRURfVE9fR0VUX0RBVEFCQVNFX0lORk8gPQotICAgICAgICAiRmFpbGVkIHRvIGdldCBkYXRhYmFzZSBpbmZvcm1hdGlvbiI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGQUlMVVJFX1JFQVNPTl9OT19FTlRSWSA9Ci0gICAgICAgICJUaGVyZSdzIG5vIGV4cG9ydGFibGUgaW4gdGhlIGRhdGFiYXNlIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZBSUxVUkVfUkVBU09OX05PVF9JTklUSUFMSVpFRCA9Ci0gICAgICAgICJUaGUgdkNhcmQgY29tcG9zZXIgb2JqZWN0IGlzIG5vdCBjb3JyZWN0bHkgaW5pdGlhbGl6ZWQiOwotCi0gICAgLyoqIFNob3VsZCBiZSB2aXNpYmxlIG9ubHkgZnJvbSBkZXZlbG9wZXJzLi4uIChubyBuZWVkIHRvIHRyYW5zbGF0ZSwgaG9wZWZ1bGx5KSAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZBSUxVUkVfUkVBU09OX1VOU1VQUE9SVEVEX1VSSSA9Ci0gICAgICAgICJUaGUgVXJpIHZDYXJkIGNvbXBvc2VyIHJlY2VpdmVkIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIGNvbXBvc2VyLiI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOT19FUlJPUiA9ICJObyBlcnJvciI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQ0FSRF9UWVBFX1NUUklOR19ET0NPTU8gPSAiZG9jb21vIjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTSElGVF9KSVMgPSAiU0hJRlRfSklTIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVRGXzggPSAiVVRGLTgiOwotCi0gICAgLyoqCi0gICAgICogU3BlY2lhbCBVUkkgZm9yIHRlc3RpbmcuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkNBUkRfVEVTVF9BVVRIT1JJVFkgPSAiY29tLmFuZHJvaWQudW5pdF90ZXN0cy52Y2FyZCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBVcmkgVkNBUkRfVEVTVF9BVVRIT1JJVFlfVVJJID0KLSAgICAgICAgVXJpLnBhcnNlKCJjb250ZW50Oi8vIiArIFZDQVJEX1RFU1RfQVVUSE9SSVRZKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVyaSBDT05UQUNUU19URVNUX0NPTlRFTlRfVVJJID0KLSAgICAgICAgVXJpLndpdGhBcHBlbmRlZFBhdGgoVkNBUkRfVEVTVF9BVVRIT1JJVFlfVVJJLCAiY29udGFjdHMiKTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1hcDxJbnRlZ2VyLCBTdHJpbmc+IHNJbU1hcDsKLQotICAgIHN0YXRpYyB7Ci0gICAgICAgIHNJbU1hcCA9IG5ldyBIYXNoTWFwPEludGVnZXIsIFN0cmluZz4oKTsKLSAgICAgICAgc0ltTWFwLnB1dChJbS5QUk9UT0NPTF9BSU0sIFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1hfQUlNKTsKLSAgICAgICAgc0ltTWFwLnB1dChJbS5QUk9UT0NPTF9NU04sIFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1hfTVNOKTsKLSAgICAgICAgc0ltTWFwLnB1dChJbS5QUk9UT0NPTF9ZQUhPTywgVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfWF9ZQUhPTyk7Ci0gICAgICAgIHNJbU1hcC5wdXQoSW0uUFJPVE9DT0xfSUNRLCBWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9YX0lDUSk7Ci0gICAgICAgIHNJbU1hcC5wdXQoSW0uUFJPVE9DT0xfSkFCQkVSLCBWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9YX0pBQkJFUik7Ci0gICAgICAgIHNJbU1hcC5wdXQoSW0uUFJPVE9DT0xfU0tZUEUsIFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1hfU0tZUEVfVVNFUk5BTUUpOwotICAgICAgICAvLyBHb29nbGUgdGFsayBpcyBhIHNwZWNpYWwgY2FzZS4KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGludGVyZmFjZSBPbmVFbnRyeUhhbmRsZXIgewotICAgICAgICBwdWJsaWMgYm9vbGVhbiBvbkluaXQoQ29udGV4dCBjb250ZXh0KTsKLSAgICAgICAgcHVibGljIGJvb2xlYW4gb25FbnRyeUNyZWF0ZWQoU3RyaW5nIHZjYXJkKTsKLSAgICAgICAgcHVibGljIHZvaWQgb25UZXJtaW5hdGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBBbiB1c2VmdWwgZXhhbXBsZSBoYW5kbGVyLCB3aGljaCBlbWl0cyBWQ2FyZCBTdHJpbmcgdG8gb3V0cHV0c3RyZWFtIG9uZSBieSBvbmUuCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIFRoZSBpbnB1dCBPdXRwdXRTdHJlYW0gb2JqZWN0IGlzIGNsb3NlZCgpIG9uIHtAbGluayAjb25UZXJtaW5hdGUoKX0uCi0gICAgICogTXVzdCBub3QgY2xvc2UgdGhlIHN0cmVhbSBvdXRzaWRlLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgY2xhc3MgSGFuZGxlckZvck91dHB1dFN0cmVhbSBpbXBsZW1lbnRzIE9uZUVudHJ5SGFuZGxlciB7Ci0gICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJoaWRpbmciKQotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1RBRyA9ICJ2Y2FyZC5WQ2FyZENvbXBvc2VyLkhhbmRsZXJGb3JPdXRwdXRTdHJlYW0iOwotCi0gICAgICAgIGZpbmFsIHByaXZhdGUgT3V0cHV0U3RyZWFtIG1PdXRwdXRTdHJlYW07IC8vIG1Xcml0ZXIgd2lsbCBjbG9zZSB0aGlzLgotICAgICAgICBwcml2YXRlIFdyaXRlciBtV3JpdGVyOwotCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBtT25UZXJtaW5hdGVJc0NhbGxlZCA9IGZhbHNlOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBJbnB1dCBzdHJlYW0gd2lsbCBiZSBjbG9zZWQgb24gdGhlIGRldHJ1Y3Rpb24gb2YgdGhpcyBvYmplY3QuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgSGFuZGxlckZvck91dHB1dFN0cmVhbShPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtKSB7Ci0gICAgICAgICAgICBtT3V0cHV0U3RyZWFtID0gb3V0cHV0U3RyZWFtOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gb25Jbml0KENvbnRleHQgY29udGV4dCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBtV3JpdGVyID0gbmV3IEJ1ZmZlcmVkV3JpdGVyKG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICBtT3V0cHV0U3RyZWFtLCBtQ2hhcnNldFN0cmluZykpOwotICAgICAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlMSkgewotICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJVbnN1cHBvcnRlZCBjaGFyc2V0OiAiICsgbUNoYXJzZXRTdHJpbmcpOwotICAgICAgICAgICAgICAgIG1FcnJvclJlYXNvbiA9ICJFbmNvZGluZyBpcyBub3Qgc3VwcG9ydGVkICh1c3VhbGx5IHRoaXMgZG9lcyBub3QgaGFwcGVuISk6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgbUNoYXJzZXRTdHJpbmc7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobUlzRG9Db01vKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIG9uZSBlbXB0eSBlbnRyeS4KLSAgICAgICAgICAgICAgICAgICAgbVdyaXRlci53cml0ZShjcmVhdGVPbmVFbnRyeUludGVybmFsKCItMSIsIG51bGwpKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChWQ2FyZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJWQ2FyZEV4Y2VwdGlvbiBoYXMgYmVlbiB0aHJvd24gZHVyaW5nIG9uIEluaXQoKTogIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJT0V4Y2VwdGlvbiBvY2N1cnJlZCBkdXJpbmcgZXhwb3J0T25lQ29udGFjdERhdGE6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgICAgICAgICBtRXJyb3JSZWFzb24gPSAiSU9FeGNlcHRpb24gb2NjdXJyZWQ6ICIgKyBlLmdldE1lc3NhZ2UoKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gb25FbnRyeUNyZWF0ZWQoU3RyaW5nIHZjYXJkKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIG1Xcml0ZXIud3JpdGUodmNhcmQpOwotICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsCi0gICAgICAgICAgICAgICAgICAgICAgICAiSU9FeGNlcHRpb24gb2NjdXJyZWQgZHVyaW5nIGV4cG9ydE9uZUNvbnRhY3REYXRhOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgICAgIG1FcnJvclJlYXNvbiA9ICJJT0V4Y2VwdGlvbiBvY2N1cnJlZDogIiArIGUuZ2V0TWVzc2FnZSgpOwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgb25UZXJtaW5hdGUoKSB7Ci0gICAgICAgICAgICBtT25UZXJtaW5hdGVJc0NhbGxlZCA9IHRydWU7Ci0gICAgICAgICAgICBpZiAobVdyaXRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgLy8gRmx1c2ggYW5kIHN5bmMgdGhlIGRhdGEgc28gdGhhdCBhIHVzZXIgaXMgYWJsZSB0byBwdWxsCi0gICAgICAgICAgICAgICAgICAgIC8vIHRoZSBTRENhcmQganVzdCBhZnRlcgotICAgICAgICAgICAgICAgICAgICAvLyB0aGUgZXhwb3J0LgotICAgICAgICAgICAgICAgICAgICBtV3JpdGVyLmZsdXNoKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtT3V0cHV0U3RyZWFtICE9IG51bGwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBtT3V0cHV0U3RyZWFtIGluc3RhbmNlb2YgRmlsZU91dHB1dFN0cmVhbSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoRmlsZU91dHB1dFN0cmVhbSkgbU91dHB1dFN0cmVhbSkuZ2V0RkQoKS5zeW5jKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIklPRXhjZXB0aW9uIGR1cmluZyBjbG9zaW5nIHRoZSBvdXRwdXQgc3RyZWFtOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgbVdyaXRlci5jbG9zZSgpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgZmluYWxpemUoKSB7Ci0gICAgICAgICAgICBpZiAoIW1PblRlcm1pbmF0ZUlzQ2FsbGVkKSB7Ci0gICAgICAgICAgICAgICAgb25UZXJtaW5hdGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgQ29udGV4dCBtQ29udGV4dDsKLSAgICBwcml2YXRlIGZpbmFsIGludCBtVkNhcmRUeXBlOwotICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBtQ2FyZUhhbmRsZXJFcnJvcnM7Ci0gICAgcHJpdmF0ZSBmaW5hbCBDb250ZW50UmVzb2x2ZXIgbUNvbnRlbnRSZXNvbHZlcjsKLQotICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBtSXNEb0NvTW87Ci0gICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1Vc2VzU2hpZnRKaXM7Ci0gICAgcHJpdmF0ZSBDdXJzb3IgbUN1cnNvcjsKLSAgICBwcml2YXRlIGludCBtSWRDb2x1bW47Ci0KLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtQ2hhcnNldFN0cmluZzsKLSAgICBwcml2YXRlIGJvb2xlYW4gbVRlcm1pbmF0ZUlzQ2FsbGVkOwotICAgIHByaXZhdGUgZmluYWwgTGlzdDxPbmVFbnRyeUhhbmRsZXI+IG1IYW5kbGVyTGlzdDsKLQotICAgIHByaXZhdGUgU3RyaW5nIG1FcnJvclJlYXNvbiA9IE5PX0VSUk9SOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gc0NvbnRhY3RzUHJvamVjdGlvbiA9IG5ldyBTdHJpbmdbXSB7Ci0gICAgICAgIENvbnRhY3RzLl9JRCwKLSAgICB9OwotCi0gICAgcHVibGljIFZDYXJkQ29tcG9zZXIoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIHRoaXMoY29udGV4dCwgVkNhcmRDb25maWcuVkNBUkRfVFlQRV9ERUZBVUxULCB0cnVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVkNhcmRDb21wb3NlcihDb250ZXh0IGNvbnRleHQsIGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgdGhpcyhjb250ZXh0LCB2Y2FyZFR5cGUsIHRydWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBWQ2FyZENvbXBvc2VyKENvbnRleHQgY29udGV4dCwgU3RyaW5nIHZjYXJkVHlwZVN0ciwgYm9vbGVhbiBjYXJlSGFuZGxlckVycm9ycykgewotICAgICAgICB0aGlzKGNvbnRleHQsIFZDYXJkQ29uZmlnLmdldFZDYXJkVHlwZUZyb21TdHJpbmcodmNhcmRUeXBlU3RyKSwgY2FyZUhhbmRsZXJFcnJvcnMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdCBmb3Igc3VwcG9ydGluZyBjYWxsIGxvZyBlbnRyeSB2Q2FyZCBjb21wb3NpbmcuCi0gICAgICovCi0gICAgcHVibGljIFZDYXJkQ29tcG9zZXIoZmluYWwgQ29udGV4dCBjb250ZXh0LCBmaW5hbCBpbnQgdmNhcmRUeXBlLAotICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBjYXJlSGFuZGxlckVycm9ycykgewotICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7Ci0gICAgICAgIG1WQ2FyZFR5cGUgPSB2Y2FyZFR5cGU7Ci0gICAgICAgIG1DYXJlSGFuZGxlckVycm9ycyA9IGNhcmVIYW5kbGVyRXJyb3JzOwotICAgICAgICBtQ29udGVudFJlc29sdmVyID0gY29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKTsKLQotICAgICAgICBtSXNEb0NvTW8gPSBWQ2FyZENvbmZpZy5pc0RvQ29Nbyh2Y2FyZFR5cGUpOwotICAgICAgICBtVXNlc1NoaWZ0SmlzID0gVkNhcmRDb25maWcudXNlc1NoaWZ0SmlzKHZjYXJkVHlwZSk7Ci0gICAgICAgIG1IYW5kbGVyTGlzdCA9IG5ldyBBcnJheUxpc3Q8T25lRW50cnlIYW5kbGVyPigpOwotCi0gICAgICAgIGlmIChtSXNEb0NvTW8pIHsKLSAgICAgICAgICAgIFN0cmluZyBjaGFyc2V0OwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBjaGFyc2V0ID0gQ2hhcnNldFV0aWxzLmNoYXJzZXRGb3JWZW5kb3IoU0hJRlRfSklTLCAiZG9jb21vIikubmFtZSgpOwotICAgICAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRDaGFyc2V0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiRG9Db01vLXNwZWNpZmljIFNISUZUX0pJUyB3YXMgbm90IGZvdW5kLiBVc2UgU0hJRlRfSklTIGFzIGlzLiIpOwotICAgICAgICAgICAgICAgIGNoYXJzZXQgPSBTSElGVF9KSVM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQ2hhcnNldFN0cmluZyA9IGNoYXJzZXQ7Ci0gICAgICAgIH0gZWxzZSBpZiAobVVzZXNTaGlmdEppcykgewotICAgICAgICAgICAgU3RyaW5nIGNoYXJzZXQ7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGNoYXJzZXQgPSBDaGFyc2V0VXRpbHMuY2hhcnNldEZvclZlbmRvcihTSElGVF9KSVMpLm5hbWUoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkQ2hhcnNldEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIlZlbmRvci1zcGVjaWZpYyBTSElGVF9KSVMgd2FzIG5vdCBmb3VuZC4gVXNlIFNISUZUX0pJUyBhcyBpcy4iKTsKLSAgICAgICAgICAgICAgICBjaGFyc2V0ID0gU0hJRlRfSklTOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUNoYXJzZXRTdHJpbmcgPSBjaGFyc2V0OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbUNoYXJzZXRTdHJpbmcgPSBVVEZfODsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIE11c3QgYmUgY2FsbGVkIGJlZm9yZSB7QGxpbmsgI2luaXQoKX0uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkSGFuZGxlcihPbmVFbnRyeUhhbmRsZXIgaGFuZGxlcikgewotICAgICAgICBpZiAoaGFuZGxlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtSGFuZGxlckxpc3QuYWRkKGhhbmRsZXIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBSZXR1cm5zIHRydWUgd2hlbiBpbml0aWFsaXphdGlvbiBpcyBzdWNjZXNzZnVsIGFuZCBhbGwgdGhlIG90aGVyCi0gICAgICogICAgICAgICAgbWV0aG9kcyBhcmUgYXZhaWxhYmxlLiBSZXR1cm5zIGZhbHNlIG90aGVyd2lzZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpbml0KCkgewotICAgICAgICByZXR1cm4gaW5pdChudWxsLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpbml0KGZpbmFsIFN0cmluZyBzZWxlY3Rpb24sIGZpbmFsIFN0cmluZ1tdIHNlbGVjdGlvbkFyZ3MpIHsKLSAgICAgICAgcmV0dXJuIGluaXQoQ29udGFjdHMuQ09OVEVOVF9VUkksIHNlbGVjdGlvbiwgc2VsZWN0aW9uQXJncywgbnVsbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTm90ZSB0aGF0IHRoaXMgaXMgdW5zdGFibGUgaW50ZXJmYWNlLCBtYXkgYmUgZGVsZXRlZCBpbiB0aGUgZnV0dXJlLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGluaXQoZmluYWwgVXJpIGNvbnRlbnRVcmksIGZpbmFsIFN0cmluZyBzZWxlY3Rpb24sCi0gICAgICAgICAgICBmaW5hbCBTdHJpbmdbXSBzZWxlY3Rpb25BcmdzLCBmaW5hbCBTdHJpbmcgc29ydE9yZGVyKSB7Ci0gICAgICAgIGlmIChjb250ZW50VXJpID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtQ2FyZUhhbmRsZXJFcnJvcnMpIHsKLSAgICAgICAgICAgIExpc3Q8T25lRW50cnlIYW5kbGVyPiBmaW5pc2hlZExpc3QgPSBuZXcgQXJyYXlMaXN0PE9uZUVudHJ5SGFuZGxlcj4oCi0gICAgICAgICAgICAgICAgICAgIG1IYW5kbGVyTGlzdC5zaXplKCkpOwotICAgICAgICAgICAgZm9yIChPbmVFbnRyeUhhbmRsZXIgaGFuZGxlciA6IG1IYW5kbGVyTGlzdCkgewotICAgICAgICAgICAgICAgIGlmICghaGFuZGxlci5vbkluaXQobUNvbnRleHQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoT25lRW50cnlIYW5kbGVyIGZpbmlzaGVkIDogZmluaXNoZWRMaXN0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaW5pc2hlZC5vblRlcm1pbmF0ZSgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBKdXN0IGlnbm9yZSB0aGUgZmFsc2UgcmV0dXJuZWQgZnJvbSBvbkluaXQoKS4KLSAgICAgICAgICAgIGZvciAoT25lRW50cnlIYW5kbGVyIGhhbmRsZXIgOiBtSGFuZGxlckxpc3QpIHsKLSAgICAgICAgICAgICAgICBoYW5kbGVyLm9uSW5pdChtQ29udGV4dCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBTdHJpbmdbXSBwcm9qZWN0aW9uOwotICAgICAgICBpZiAoQ29udGFjdHMuQ09OVEVOVF9VUkkuZXF1YWxzKGNvbnRlbnRVcmkpIHx8Ci0gICAgICAgICAgICAgICAgQ09OVEFDVFNfVEVTVF9DT05URU5UX1VSSS5lcXVhbHMoY29udGVudFVyaSkpIHsKLSAgICAgICAgICAgIHByb2plY3Rpb24gPSBzQ29udGFjdHNQcm9qZWN0aW9uOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbUVycm9yUmVhc29uID0gRkFJTFVSRV9SRUFTT05fVU5TVVBQT1JURURfVVJJOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIG1DdXJzb3IgPSBtQ29udGVudFJlc29sdmVyLnF1ZXJ5KAotICAgICAgICAgICAgICAgIGNvbnRlbnRVcmksIHByb2plY3Rpb24sIHNlbGVjdGlvbiwgc2VsZWN0aW9uQXJncywgc29ydE9yZGVyKTsKLQotICAgICAgICBpZiAobUN1cnNvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtRXJyb3JSZWFzb24gPSBGQUlMVVJFX1JFQVNPTl9GQUlMRURfVE9fR0VUX0RBVEFCQVNFX0lORk87Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZ2V0Q291bnQoKSA9PSAwIHx8ICFtQ3Vyc29yLm1vdmVUb0ZpcnN0KCkpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbUN1cnNvci5jbG9zZSgpOwotICAgICAgICAgICAgfSBjYXRjaCAoU1FMaXRlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiU1FMaXRlRXhjZXB0aW9uIG9uIEN1cnNvciNjbG9zZSgpOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICBtQ3Vyc29yID0gbnVsbDsKLSAgICAgICAgICAgICAgICBtRXJyb3JSZWFzb24gPSBGQUlMVVJFX1JFQVNPTl9OT19FTlRSWTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIG1JZENvbHVtbiA9IG1DdXJzb3IuZ2V0Q29sdW1uSW5kZXgoQ29udGFjdHMuX0lEKTsKLQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBjcmVhdGVPbmVFbnRyeSgpIHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZU9uZUVudHJ5KG51bGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBnZXRFbnRpdHlJdGVyYXRvck1ldGhvZCBGb3IgRGVwZW5kZW5jeSBJbmplY3Rpb24uCi0gICAgICogQGhpZGUganVzdCBmb3IgdGVzdGluZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBjcmVhdGVPbmVFbnRyeShNZXRob2QgZ2V0RW50aXR5SXRlcmF0b3JNZXRob2QpIHsKLSAgICAgICAgaWYgKG1DdXJzb3IgPT0gbnVsbCB8fCBtQ3Vyc29yLmlzQWZ0ZXJMYXN0KCkpIHsKLSAgICAgICAgICAgIG1FcnJvclJlYXNvbiA9IEZBSUxVUkVfUkVBU09OX05PVF9JTklUSUFMSVpFRDsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBTdHJpbmcgdmNhcmQ7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAobUlkQ29sdW1uID49IDApIHsKLSAgICAgICAgICAgICAgICB2Y2FyZCA9IGNyZWF0ZU9uZUVudHJ5SW50ZXJuYWwobUN1cnNvci5nZXRTdHJpbmcobUlkQ29sdW1uKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGdldEVudGl0eUl0ZXJhdG9yTWV0aG9kKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIkluY29ycmVjdCBtSWRDb2x1bW46ICIgKyBtSWRDb2x1bW4pOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChWQ2FyZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiVkNhcmRFeGNlcHRpb24gaGFzIGJlZW4gdGhyb3duOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9IGNhdGNoIChPdXRPZk1lbW9yeUVycm9yIGVycm9yKSB7Ci0gICAgICAgICAgICAvLyBNYXliZSBzb21lIGRhdGEgKGUuZy4gcGhvdG8pIGlzIHRvbyBiaWcgdG8gaGF2ZSBpbiBtZW1vcnkuIEJ1dCBpdAotICAgICAgICAgICAgLy8gc2hvdWxkIGJlIHJhcmUuCi0gICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiT3V0T2ZNZW1vcnlFcnJvciBvY2N1cmVkLiBJZ25vcmUgdGhlIGVudHJ5LiIpOwotICAgICAgICAgICAgU3lzdGVtLmdjKCk7Ci0gICAgICAgICAgICAvLyBUT0RPOiBzaG91bGQgdGVsbCB1c2VycyB3aGF0IGhhcHBlbmVkPwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBtQ3Vyc29yLm1vdmVUb05leHQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgY2FyZSB0aGUgT3V0T2ZNZW1vcnlFcnJvciBvbiB0aGUgaGFuZGxlciBzaWRlCi0gICAgICAgIC8vIDotUAotICAgICAgICBpZiAobUNhcmVIYW5kbGVyRXJyb3JzKSB7Ci0gICAgICAgICAgICBMaXN0PE9uZUVudHJ5SGFuZGxlcj4gZmluaXNoZWRMaXN0ID0gbmV3IEFycmF5TGlzdDxPbmVFbnRyeUhhbmRsZXI+KAotICAgICAgICAgICAgICAgICAgICBtSGFuZGxlckxpc3Quc2l6ZSgpKTsKLSAgICAgICAgICAgIGZvciAoT25lRW50cnlIYW5kbGVyIGhhbmRsZXIgOiBtSGFuZGxlckxpc3QpIHsKLSAgICAgICAgICAgICAgICBpZiAoIWhhbmRsZXIub25FbnRyeUNyZWF0ZWQodmNhcmQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmb3IgKE9uZUVudHJ5SGFuZGxlciBoYW5kbGVyIDogbUhhbmRsZXJMaXN0KSB7Ci0gICAgICAgICAgICAgICAgaGFuZGxlci5vbkVudHJ5Q3JlYXRlZCh2Y2FyZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBjcmVhdGVPbmVFbnRyeUludGVybmFsKGZpbmFsIFN0cmluZyBjb250YWN0SWQsCi0gICAgICAgICAgICBNZXRob2QgZ2V0RW50aXR5SXRlcmF0b3JNZXRob2QpIHRocm93cyBWQ2FyZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmFsIE1hcDxTdHJpbmcsIExpc3Q8Q29udGVudFZhbHVlcz4+IGNvbnRlbnRWYWx1ZXNMaXN0TWFwID0KLSAgICAgICAgICAgICAgICBuZXcgSGFzaE1hcDxTdHJpbmcsIExpc3Q8Q29udGVudFZhbHVlcz4+KCk7Ci0gICAgICAgIC8vIFRoZSByZXNvbHZlciBtYXkgcmV0dXJuIHRoZSBlbnRpdHkgaXRlcmF0b3Igd2l0aCBubyBkYXRhLiBJdCBpcyBwb3NzaWJsZS4KLSAgICAgICAgLy8gZS5nLiBJZiBhbGwgdGhlIGRhdGEgaW4gdGhlIGNvbnRhY3Qgb2YgdGhlIGdpdmVuIGNvbnRhY3QgaWQgYXJlIG5vdCBleHBvcnRhYmxlIG9uZXMsCi0gICAgICAgIC8vICAgICAgdGhleSBhcmUgaGlkZGVuIGZyb20gdGhlIHZpZXcgb2YgdGhpcyBtZXRob2QsIHRob3VnaCBjb250YWN0IGlkIGl0c2VsZiBleGlzdHMuCi0gICAgICAgIEVudGl0eUl0ZXJhdG9yIGVudGl0eUl0ZXJhdG9yID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGZpbmFsIFVyaSB1cmkgPSBSYXdDb250YWN0c0VudGl0eS5DT05URU5UX1VSSS5idWlsZFVwb24oKQotICAgICAgICAgICAgICAgICAgICAuYXBwZW5kUXVlcnlQYXJhbWV0ZXIoRGF0YS5GT1JfRVhQT1JUX09OTFksICIxIikKLSAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgc2VsZWN0aW9uID0gRGF0YS5DT05UQUNUX0lEICsgIj0/IjsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZ1tdIHNlbGVjdGlvbkFyZ3MgPSBuZXcgU3RyaW5nW10ge2NvbnRhY3RJZH07Ci0gICAgICAgICAgICBpZiAoZ2V0RW50aXR5SXRlcmF0b3JNZXRob2QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIFBsZWFzZSBub3RlIHRoYXQgdGhpcyBicmFuY2ggaXMgZXhlY3V0ZWQgYnkgc29tZSB0ZXN0cyBvbmx5Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgZW50aXR5SXRlcmF0b3IgPSAoRW50aXR5SXRlcmF0b3IpZ2V0RW50aXR5SXRlcmF0b3JNZXRob2QuaW52b2tlKG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvbnRlbnRSZXNvbHZlciwgdXJpLCBzZWxlY3Rpb24sIHNlbGVjdGlvbkFyZ3MsIG51bGwpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaGFzIGJlZW4gdGhyb3duOiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGhhcyBiZWVuIHRocm93bjogIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBoYXMgYmVlbiB0aHJvd246ICIpOwotICAgICAgICAgICAgICAgICAgICBTdGFja1RyYWNlRWxlbWVudFtdIHN0YWNrVHJhY2VFbGVtZW50cyA9IGUuZ2V0Q2F1c2UoKS5nZXRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoU3RhY2tUcmFjZUVsZW1lbnQgZWxlbWVudCA6IHN0YWNrVHJhY2VFbGVtZW50cykgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIiAgICBhdCAiICsgZWxlbWVudC50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVkNhcmRFeGNlcHRpb24oIkludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gaGFzIGJlZW4gdGhyb3duOiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmdldENhdXNlKCkuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGVudGl0eUl0ZXJhdG9yID0gUmF3Q29udGFjdHMubmV3RW50aXR5SXRlcmF0b3IobUNvbnRlbnRSZXNvbHZlci5xdWVyeSgKLSAgICAgICAgICAgICAgICAgICAgICAgIHVyaSwgbnVsbCwgc2VsZWN0aW9uLCBzZWxlY3Rpb25BcmdzLCBudWxsKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChlbnRpdHlJdGVyYXRvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIkVudGl0eUl0ZXJhdG9yIGlzIG51bGwiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gIiI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghZW50aXR5SXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoTE9HX1RBRywgIkRhdGEgZG9lcyBub3QgZXhpc3QuIGNvbnRhY3RJZDogIiArIGNvbnRhY3RJZCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICIiOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB3aGlsZSAoZW50aXR5SXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgRW50aXR5IGVudGl0eSA9IGVudGl0eUl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgICAgICBmb3IgKE5hbWVkQ29udGVudFZhbHVlcyBuYW1lZENvbnRlbnRWYWx1ZXMgOiBlbnRpdHkuZ2V0U3ViVmFsdWVzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgQ29udGVudFZhbHVlcyBjb250ZW50VmFsdWVzID0gbmFtZWRDb250ZW50VmFsdWVzLnZhbHVlczsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGtleSA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoRGF0YS5NSU1FVFlQRSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChrZXkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxDb250ZW50VmFsdWVzPiBjb250ZW50VmFsdWVzTGlzdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRWYWx1ZXNMaXN0TWFwLmdldChrZXkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnRWYWx1ZXNMaXN0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50VmFsdWVzTGlzdCA9IG5ldyBBcnJheUxpc3Q8Q29udGVudFZhbHVlcz4oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50VmFsdWVzTGlzdE1hcC5wdXQoa2V5LCBjb250ZW50VmFsdWVzTGlzdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50VmFsdWVzTGlzdC5hZGQoY29udGVudFZhbHVlcyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAoZW50aXR5SXRlcmF0b3IgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGVudGl0eUl0ZXJhdG9yLmNsb3NlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBWQ2FyZEJ1aWxkZXIgYnVpbGRlciA9IG5ldyBWQ2FyZEJ1aWxkZXIobVZDYXJkVHlwZSk7Ci0gICAgICAgIGJ1aWxkZXIuYXBwZW5kTmFtZVByb3BlcnRpZXMoY29udGVudFZhbHVlc0xpc3RNYXAuZ2V0KFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKSkKLSAgICAgICAgICAgICAgICAuYXBwZW5kTmlja05hbWVzKGNvbnRlbnRWYWx1ZXNMaXN0TWFwLmdldChOaWNrbmFtZS5DT05URU5UX0lURU1fVFlQRSkpCi0gICAgICAgICAgICAgICAgLmFwcGVuZFBob25lcyhjb250ZW50VmFsdWVzTGlzdE1hcC5nZXQoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpKQotICAgICAgICAgICAgICAgIC5hcHBlbmRFbWFpbHMoY29udGVudFZhbHVlc0xpc3RNYXAuZ2V0KEVtYWlsLkNPTlRFTlRfSVRFTV9UWVBFKSkKLSAgICAgICAgICAgICAgICAuYXBwZW5kUG9zdGFscyhjb250ZW50VmFsdWVzTGlzdE1hcC5nZXQoU3RydWN0dXJlZFBvc3RhbC5DT05URU5UX0lURU1fVFlQRSkpCi0gICAgICAgICAgICAgICAgLmFwcGVuZE9yZ2FuaXphdGlvbnMoY29udGVudFZhbHVlc0xpc3RNYXAuZ2V0KE9yZ2FuaXphdGlvbi5DT05URU5UX0lURU1fVFlQRSkpCi0gICAgICAgICAgICAgICAgLmFwcGVuZFdlYnNpdGVzKGNvbnRlbnRWYWx1ZXNMaXN0TWFwLmdldChXZWJzaXRlLkNPTlRFTlRfSVRFTV9UWVBFKSk7Ci0gICAgICAgIGlmICgobVZDYXJkVHlwZSAmIFZDYXJkQ29uZmlnLkZMQUdfUkVGUkFJTl9JTUFHRV9FWFBPUlQpID09IDApIHsKLSAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kUGhvdG9zKGNvbnRlbnRWYWx1ZXNMaXN0TWFwLmdldChQaG90by5DT05URU5UX0lURU1fVFlQRSkpOwotICAgICAgICB9Ci0gICAgICAgIGJ1aWxkZXIuYXBwZW5kTm90ZXMoY29udGVudFZhbHVlc0xpc3RNYXAuZ2V0KE5vdGUuQ09OVEVOVF9JVEVNX1RZUEUpKQotICAgICAgICAgICAgICAgIC5hcHBlbmRFdmVudHMoY29udGVudFZhbHVlc0xpc3RNYXAuZ2V0KEV2ZW50LkNPTlRFTlRfSVRFTV9UWVBFKSkKLSAgICAgICAgICAgICAgICAuYXBwZW5kSW1zKGNvbnRlbnRWYWx1ZXNMaXN0TWFwLmdldChJbS5DT05URU5UX0lURU1fVFlQRSkpCi0gICAgICAgICAgICAgICAgLmFwcGVuZFJlbGF0aW9uKGNvbnRlbnRWYWx1ZXNMaXN0TWFwLmdldChSZWxhdGlvbi5DT05URU5UX0lURU1fVFlQRSkpOwotICAgICAgICByZXR1cm4gYnVpbGRlci50b1N0cmluZygpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlcm1pbmF0ZSgpIHsKLSAgICAgICAgZm9yIChPbmVFbnRyeUhhbmRsZXIgaGFuZGxlciA6IG1IYW5kbGVyTGlzdCkgewotICAgICAgICAgICAgaGFuZGxlci5vblRlcm1pbmF0ZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1DdXJzb3IgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBtQ3Vyc29yLmNsb3NlKCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChTUUxpdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJTUUxpdGVFeGNlcHRpb24gb24gQ3Vyc29yI2Nsb3NlKCk6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQ3Vyc29yID0gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIG1UZXJtaW5hdGVJc0NhbGxlZCA9IHRydWU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZmluYWxpemUoKSB7Ci0gICAgICAgIGlmICghbVRlcm1pbmF0ZUlzQ2FsbGVkKSB7Ci0gICAgICAgICAgICB0ZXJtaW5hdGUoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0Q291bnQoKSB7Ci0gICAgICAgIGlmIChtQ3Vyc29yID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtQ3Vyc29yLmdldENvdW50KCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNBZnRlckxhc3QoKSB7Ci0gICAgICAgIGlmIChtQ3Vyc29yID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbUN1cnNvci5pc0FmdGVyTGFzdCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gUmV0dXJuIHRoZSBlcnJvciByZWFzb24gaWYgcG9zc2libGUuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRFcnJvclJlYXNvbigpIHsKLSAgICAgICAgcmV0dXJuIG1FcnJvclJlYXNvbjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRDb25maWcuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZENvbmZpZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjE5ODQwLi4wMDAwMDAwCi0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZENvbmZpZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDc3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLnBpbS52Y2FyZDsKLQotaW1wb3J0IGFuZHJvaWQudGVsZXBob255LlBob25lTnVtYmVyVXRpbHM7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotLyoqCi0gKiBUaGUgY2xhc3MgcmVwcmVzZW50aW5nIFZDYXJkIHJlbGF0ZWQgY29uZmlndXJhdGlvbnMuIFVzZWZ1bCBzdGF0aWMgbWV0aG9kcyBhcmUgbm90IGluIHRoaXMgY2xhc3MKLSAqIGJ1dCBpbiBWQ2FyZFV0aWxzLgotICovCi1wdWJsaWMgY2xhc3MgVkNhcmRDb25maWcgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfVEFHID0gIlZDYXJkQ29uZmlnIjsKLQotICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGZpbmFsIGludCBMT0dfTEVWRUxfTk9ORSA9IDA7Ci0gICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgaW50IExPR19MRVZFTF9QRVJGT1JNQU5DRV9NRUFTVVJFTUVOVCA9IDB4MTsKLSAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBmaW5hbCBpbnQgTE9HX0xFVkVMX1NIT1dfV0FSTklORyA9IDB4MjsKLSAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBmaW5hbCBpbnQgTE9HX0xFVkVMX1ZFUkJPU0UgPQotICAgICAgICBMT0dfTEVWRUxfUEVSRk9STUFOQ0VfTUVBU1VSRU1FTlQgfCBMT0dfTEVWRUxfU0hPV19XQVJOSU5HOwotCi0gICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgaW50IExPR19MRVZFTCA9IExPR19MRVZFTF9OT05FOwotCi0gICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgaW50IFBBUlNFX1RZUEVfVU5LTk9XTiA9IDA7Ci0gICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgaW50IFBBUlNFX1RZUEVfQVBQTEUgPSAxOwotICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGZpbmFsIGludCBQQVJTRV9UWVBFX01PQklMRV9QSE9ORV9KUCA9IDI7ICAvLyBGb3IgSmFwYW5lc2UgbW9iaWxlIHBob25lcy4KLSAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBmaW5hbCBpbnQgUEFSU0VfVFlQRV9GT01BID0gMzsgIC8vIEZvciBKYXBhbmVzZSBGT01BIG1vYmlsZSBwaG9uZXMuCi0gICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgaW50IFBBUlNFX1RZUEVfV0lORE9XU19NT0JJTEVfSlAgPSA0OwotCi0gICAgLy8gQXNzdW1lcyB0aGF0ICJpc28tODg1OS0xIiBpcyBhYmxlIHRvIG1hcCAiYWxsIiA4Yml0IGNoYXJhY3RlcnMgdG8gc29tZSB1bmljb2RlIGFuZAotICAgIC8vIGRlY29kZSB0aGUgdW5pY29kZSB0byB0aGUgb3JpZ2luYWwgY2hhcnNldC4gSWYgbm90LCB0aGlzIHNldHRpbmcgd2lsbCBjYXVzZSBzb21lIGJ1Zy4gCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9DSEFSU0VUID0gImlzby04ODU5LTEiOwotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMQUdfVjIxID0gMDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGTEFHX1YzMCA9IDE7Ci0KLSAgICAvLyAweDIgaXMgcmVzZXJ2ZWQgZm9yIHRoZSBmdXR1cmUgdXNlIC4uLgotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTkFNRV9PUkRFUl9ERUZBVUxUID0gMDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOQU1FX09SREVSX0VVUk9QRSA9IDB4NDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOQU1FX09SREVSX0pBUEFORVNFID0gMHg4OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBOQU1FX09SREVSX01BU0sgPSAweEM7Ci0KLSAgICAvLyAweDEwIGlzIHJlc2VydmVkIGZvciBzYWZldHkKLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19DSEFSU0VUX1VURjggPSAwOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGTEFHX0NIQVJTRVRfU0hJRlRfSklTID0gMHgxMDA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZMQUdfQ0hBUlNFVF9NQVNLID0gMHhGMDA7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmxhZyBpbmRpY2F0aW5nIHRoZSB2Q2FyZCBjb21wb3NlciB3aWxsIGFkZCBzb21lICJYLSIgcHJvcGVydGllcyB1c2VkIG9ubHkgaW4gQW5kcm9pZAotICAgICAqIHdoZW4gdGhlIGZvcm1hbCB2Q2FyZCBzcGVjaWZpY2F0aW9uIGRvZXMgbm90IGhhdmUgYXBwcm9wcmlhdGUgZmllbGRzIGZvciB0aGF0IGRhdGEuCi0gICAgICogCi0gICAgICogRm9yIGV4YW1wbGUsIEFuZHJvaWQgYWNjZXB0cyBuaWNrbmFtZSBpbmZvcm1hdGlvbiB3aGlsZSB2Q2FyZCAyLjEgZG9lcyBub3QuCi0gICAgICogV2hlbiB0aGlzIGZsYWcgaXMgb24sIHZDYXJkIGNvbXBvc2VyIGVtaXRzIGFsdGVybmF0aXZlICJYLSIgcHJvcGVydHkgKGxpa2UgIlgtTklDS05BTUUiKQotICAgICAqIGluc3RlYWQgb2YganVzdCBkcm9wcGluZyBpdC4KLSAgICAgKiAKLSAgICAgKiB2Q2FyZCBwYXJzZXIgY29kZSBhdXRvbWF0aWNhbGx5IHBhcnNlcyB0aGUgZmllbGQgZW1pdHRlZCBldmVuIHdoZW4gdGhpcyBmbGFnIGlzIG9mZi4KLSAgICAgKiAKLSAgICAgKiBOb3RlIHRoYXQgdGhpcyBmbGFnIGRvZXMgbm90IGFzc3VyZSBhbGwgdGhlIGluZm9ybWF0aW9uIG11c3QgYmUgaG9sZCBpbiB0aGUgZW1pdHRlZCB2Q2FyZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19VU0VfQU5EUk9JRF9QUk9QRVJUWSA9IDB4ODAwMDAwMDA7Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGhlIGZsYWcgaW5kaWNhdGluZyB0aGUgdkNhcmQgY29tcG9zZXIgd2lsbCBhZGQgc29tZSAiWC0iIHByb3BlcnRpZXMgc2VlbiBpbiB0aGUKLSAgICAgKiB2Q2FyZCBkYXRhIGVtaXR0ZWQgYnkgdGhlIG90aGVyIHNvZnR3YXJlcy9kZXZpY2VzIHdoZW4gdGhlIGZvcm1hbCB2Q2FyZCBzcGVjaWZpY2F0aW9uCi0gICAgICogZG9lcyBub3QgaGF2ZSBhcHByb3ByaWF0ZSBmaWVsZChzKSBmb3IgdGhhdCBkYXRhLiAKLSAgICAgKiAKLSAgICAgKiBPbmUgZXhhbXBsZSBpcyBYLVBIT05FVElDLUZJUlNULU5BTUUvWC1QSE9ORVRJQy1NSURETEUtTkFNRS9YLVBIT05FVElDLUxBU1QtTkFNRSwgd2hpY2ggYXJlCi0gICAgICogZm9yIHBob25ldGljIG5hbWUgKGhvdyB0aGUgbmFtZSBpcyBwcm9ub3VuY2VkKSwgc2VlbiBpbiB0aGUgdkNhcmQgZW1pdHRlZCBieSBzb21lIG90aGVyCi0gICAgICogbm9uLUFuZHJvaWQgZGV2aWNlcy9zb2Z0d2FyZXMuIFdlIGNob3NlIHRvIGVuYWJsZSB0aGUgdkNhcmQgY29tcG9zZXIgdG8gdXNlIHRob3NlCi0gICAgICogZGVmYWN0IHByb3BlcnRpZXMgc2luY2UgdGhleSBhcmUgYWxzbyB1c2VmdWwgZm9yIEFuZHJvaWQgZGV2aWNlcy4KLSAgICAgKiAKLSAgICAgKiBOb3RlIGZvciBkZXZlbG9wZXJzOiBvbmx5ICJYLSIgcHJvcGVydGllcyBzaG91bGQgYmUgYWRkZWQgd2l0aCB0aGlzIGZsYWcuIHZDYXJkIDIuMS8zLjAKLSAgICAgKiBhbGxvd3MgYW55IGtpbmQgb2YgIlgtIiBwcm9wZXJ0aWVzIGJ1dCBkb2VzIG5vdCBhbGxvdyBub24tIlgtIiBwcm9wZXJ0aWVzIChleGNlcHQgSUFOQSB0b2tlbnMKLSAgICAgKiBpbiB2Q2FyZCAzLjApLiBTb21lIGV4dGVybmFsIHBhcnNlcnMgbWF5IGdldCBjb25mdXNlZCB3aXRoIG5vbi12YWxpZCwgbm9uLSJYLSIgcHJvcGVydGllcy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19VU0VfREVGQUNUX1BST1BFUlRZID0gMHg0MDAwMDAwMDsKLQotICAgIC8qKgotICAgICAqIFRoZSBmbGFnIGluZGljYXRpbmcgc29tZSBzcGVjaWZpYyBkaWFsZWN0IHNlZW4gaW4gdmNhcmQgb2YgRG9Db01vIChvbmUgb2YgSmFwYW5lc2UKLSAgICAgKiBtb2JpbGUgY2FyZWVycykgc2hvdWxkIGJlIHVzZWQuIFRoaXMgZmxhZyBkb2VzIG5vdCBpbmNsdWRlIGFueSBvdGhlciBpbmZvcm1hdGlvbiBsaWtlCi0gICAgICogdGhhdCAidGhlIHZDYXJkIGlzIGZvciBKYXBhbmVzZSIuIFNvIGl0IGlzICJwb3NzaWJsZSIgdGhhdCAidGhlIHZDYXJkIHNob3VsZCBoYXZlIERvQ29NbydzCi0gICAgICogZGlhbGVjdCBidXQgdGhlIG5hbWUgb3JkZXIgc2hvdWxkIGJlIEV1cm9wZWFuIiwgYnV0IGl0IGlzIG5vdCByZWNvbW1lbmRlZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19ET0NPTU8gPSAweDIwMDAwMDAwOwotCi0gICAgLyoqCi0gICAgICogPFA+Ci0gICAgICogVGhlIGZsYWcgaW5kaWNhdGluZyB0aGUgdkNhcmQgY29tcG9zZXIgZG9lcyAiTk9UIiB1c2UgUXVvdGVkLVByaW50YWJsZSB0b3dhcmQgInByaW1hcnkiCi0gICAgICogcHJvcGVydGllcyBldmVuIHRob3VnaCBpdCBpcyByZXF1aXJlZCBieSB2Q2FyZCAyLjEgKFFQIGlzIHByb2hpYml0ZWQgaW4gdkNhcmQgMy4wKS4KLSAgICAgKiA8L1A+Ci0gICAgICogPFA+Ci0gICAgICogV2UgYWN0dWFsbHkgY2Fubm90IGRlZmluZSB3aGF0IGlzIHRoZSAicHJpbWFyeSIgcHJvcGVydHkuIE5vdGUgdGhhdCB0aGlzIGlzIE5PVCBkZWZpbmVkCi0gICAgICogaW4gdkNhcmQgc3BlY2lmaWNhdGlvbiBlaXRoZXIuIEFsc28gYmUgYXdhcmUgdGhhdCBpdCBpcyBOT1QgcmVsYXRlZCB0byAicHJpbWFyeSIgbm90aW9uCi0gICAgICogdXNlZCBpbiB7QGxpbmsgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0fS4KLSAgICAgKiBUaGlzIG5vdGlvbiBpcyBqdXN0IGZvciB2Q2FyZCBjb21wb3NpdGlvbiBpbiBBbmRyb2lkLgotICAgICAqIDwvUD4KLSAgICAgKiA8UD4KLSAgICAgKiBXZSBhZGRlZCB0aGlzIEFuZHJvaWQtc3BlY2lmaWMgbm90aW9uIHNpbmNlIHNvbWUgKGluY29tcGxldGUpIHZDYXJkIGV4cG9ydGVycyBmb3IgdkNhcmQgMi4xCi0gICAgICogZG8gTk9UIHVzZSBRdW90ZWQtUHJpbnRhYmxlIGVuY29kaW5nIHRvd2FyZCBzb21lIHByb3BlcnRpZXMgcmVsYXRlZCBuYW1lcyBsaWtlICJOIiwgIkZOIiwgZXRjLgotICAgICAqIGV2ZW4gd2hlbiB0aGVpciB2YWx1ZXMgY29udGFpbiBub24tYXNjaWkgb3IvYW5kIENSL0xGLCB3aGlsZSB0aGV5IHVzZSB0aGUgZW5jb2RpbmcgaW4gdGhlCi0gICAgICogb3RoZXIgcHJvcGVydGllcyBsaWtlICJBRFIiLCAiT1JHIiwgZXRjLgotICAgICAqIDxQPgotICAgICAqIFdlIGFyZSBhZnJhaWQgb2YgdGhlIGNhc2Ugd2hlcmUgc29tZSB2Q2FyZCBpbXBvcnRlciBhbHNvIGZvcmdldCBoYW5kbGluZyBRUCBwcmVzdW1pbmcgUVAgaXMKLSAgICAgKiBub3QgdXNlZCBpbiBzdWNoIGZpZWxkcy4KLSAgICAgKiA8L1A+Ci0gICAgICogPFA+Ci0gICAgICogVGhpcyBmbGFnIGlzIHVzZWZ1bCB3aGVuIHNvbWUgdGFyZ2V0IGltcG9ydGVyIHlvdSBhcmUgZ29pbmcgdG8gZm9jdXMgb24gZG9lcyBub3QgYWNjZXB0Ci0gICAgICogc3VjaCBwcm9wZXJ0aWVzIHdpdGggUXVvdGVkLVByaW50YWJsZSBlbmNvZGluZy4KLSAgICAgKiA8L1A+Ci0gICAgICogPFA+Ci0gICAgICogQWdhaW4sIHdlIHNob3VsZCBub3QgdXNlIHRoaXMgZmxhZyBhdCBhbGwgZm9yIGNvbXBseWluZyB2Q2FyZCAyLjEgc3BlYy4KLSAgICAgKiA8L1A+Ci0gICAgICogPFA+Ci0gICAgICogSW4gdkNhcmQgMy4wLCBRdW90ZWQtUHJpbnRhYmxlIGlzIGV4cGxpY2l0bHkgInByb2hpYml0dGVkIiwgc28gd2UgZG9uJ3QgbmVlZCB0byBjYXJlIHRoaXMKLSAgICAgKiBraW5kIG9mIHByb2JsZW0gKGhvcGVmdWxseSkuCi0gICAgICogPC9QPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMQUdfUkVGUkFJTl9RUF9UT19OQU1FX1BST1BFUlRJRVMgPSAweDEwMDAwMDAwOwotCi0gICAgLyoqCi0gICAgICogPFA+Ci0gICAgICogVGhlIGZsYWcgaW5kaWNhdGluZyB0aGF0IHBob25ldGljIG5hbWUgcmVsYXRlZCBmaWVsZHMgbXVzdCBiZSBjb252ZXJ0ZWQgdG8KLSAgICAgKiBhcHByb3ByaWF0ZSBmb3JtLiBOb3RlIHRoYXQgImFwcHJvcHJpYXRlIiBpcyBub3QgZGVmaW5lZCBpbiBhbnkgdkNhcmQgc3BlY2lmaWNhdGlvbi4KLSAgICAgKiBUaGlzIGlzIEFuZHJvaWQtc3BlY2lmaWMuCi0gICAgICogPC9QPgotICAgICAqIDxQPgotICAgICAqIE9uZSB0eXBpY2FsIChhbmQgY3VycmVudGx5IHNvbGUpIGV4YW1wbGUgd2hlcmUgd2UgbmVlZCB0aGlzIGZsYWcgaXMgdGhlIHRpbWUgd2hlbgotICAgICAqIHdlIG5lZWQgdG8gZW1pdCBKYXBhbmVzZSBwaG9uZXRpYyBuYW1lcyBpbnRvIHZDYXJkIGVudHJpZXMuIFRoZSBwcm9wZXJ0eSB2YWx1ZXMKLSAgICAgKiBzaG91bGQgYmUgZW5jb2RlZCBpbnRvIGhhbGYtd2lkdGgga2F0YWthbmEgd2hlbiB0aGUgdGFyZ2V0IGltcG9ydGVyIGlzIEphcGFuZXNlIG1vYmlsZQotICAgICAqIHBob25lcycsIHdoaWNoIGFyZSBwcm9iYWJseSBub3QgYWJsZSB0byBwYXJzZSBmdWxsLXdpZHRoIGhpcmFnYW5hL2thdGFrYW5hIGZvcgotICAgICAqIGhpc3RvcmljYWwgcmVhc29ucywgd2hpbGUgdGhlIHZDYXJkIGltcG9ydGVycyBlbWJlZGRlZCB0byBzb2Z0d2FyZXMgZm9yIFBDIHNob3VsZCBiZQotICAgICAqIGFibGUgdG8gcGFyc2UgdGhlbSBhcyB3ZSBleHBlY3QuCi0gICAgICogPC9QPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMQUdfQ09OVkVSVF9QSE9ORVRJQ19OQU1FX1NUUklOR1MgPSAweDA4MDAwMDA7Ci0KLSAgICAvKioKLSAgICAgKiA8UD4KLSAgICAgKiBUaGUgZmxhZyBpbmRpY2F0aW5nIHRoZSB2Q2FyZCBjb21wb3NlciAiZm9yIDIuMSIgZW1pdHMgIlRZUEU9IiBzdHJpbmcgdG93YXJkIFRZUEUgcGFyYW1zCi0gICAgICogZXZlcnkgdGltZSBwb3NzaWJsZS4gVGhlIGRlZmF1bHQgYmVoYXZpb3IgZG9lcyBub3QgZW1pdCBpdCBhbmQgaXMgdmFsaWQgaW4gdGhlIHNwZWMuCi0gICAgICogSW4gdkNyYWQgMy4wLCB0aGlzIGZsYWcgaXMgdW5uZWNlc3NhcnksIHNpbmNlICJUWVBFPSIgaXMgTVVTVCBpbiB2Q2FyZCAzLjAgc3BlY2lmaWNhdGlvbi4KLSAgICAgKiA8L1A+Ci0gICAgICogPFA+Ci0gICAgICogRGV0YWlsOgotICAgICAqIEhvdyBtb3JlIHRoYW4gb25lIFRZUEUgZmllbGRzIGFyZSBleHByZXNzZWQgaXMgZGlmZmVyZW50IGJldHdlZW4gdkNhcmQgMi4xIGFuZCB2Q2FyZCAzLjAuCi0gICAgICogPC9wPgotICAgICAqIDxQPgotICAgICAqIGUuZy48QlIgLz4KLSAgICAgKiAxKSBQcm9iYWJseSB2YWxpZCBpbiBib3RoIHZDYXJkIDIuMSBhbmQgdkNhcmQgMy4wOiAiQURSO1RZUEU9RE9NO1RZUEU9SE9NRTouLi4iPEJSIC8+Ci0gICAgICogMikgVmFsaWQgaW4gdkNhcmQgMi4xIGJ1dCBub3QgaW4gdkNhcmQgMy4wOiAiQURSO0RPTTtIT01FOi4uLiI8QlIgLz4KLSAgICAgKiAzKSBWYWxpZCBpbiB2Q2FyZCAzLjAgYnV0IG5vdCBpbiB2Q2FyZCAyLjE6ICJBRFI7VFlQRT1ET00sSE9NRTouLi4iPEJSIC8+Ci0gICAgICogPC9QPgotICAgICAqIDxQPgotICAgICAqIDIpIGhhZCBiZWVuIHRoZSBkZWZhdWx0IG9mIFZDYXJkIGV4cG9ydGVyL2ltcG9ydGVyIGluIEFuZHJvaWQsIGJ1dCBpdCBpcyBmb3VuZCB0aGF0Ci0gICAgICogc29tZSBleHRlcm5hbCBleHBvcnRlciBpcyBub3QgYWJsZSB0byBwYXJzZSB0aGUgdHlwZSBmb3JtYXQgbGlrZSAyKSBidXQgb25seSAzKS4KLSAgICAgKiA8L1A+Ci0gICAgICogPFA+Ci0gICAgICogSWYgeW91IGFyZSB0YXJnZXRpbmcgdG8gdGhlIGltcG9ydGVyIHdoaWNoIGNhbm5vdCBhY2NlcHQgVFlQRSBwYXJhbXMgd2l0aG91dCAiVFlQRT0iCi0gICAgICogc3RyaW5ncyAod2hpY2ggc2hvdWxkIGJlIHJhcmUgdGhvdWdoKSwgcGxlYXNlIHVzZSB0aGlzIGZsYWcuCi0gICAgICogPC9QPgotICAgICAqIDxQPgotICAgICAqIEV4YW1wbGUgdXNhZ2U6IGludCB2Y2FyZFR5cGUgPSAoVkNBUkRfVFlQRV9WMjFfR0VORVJJQyB8IEZMQUdfQVBQRU5EX1RZUEVfUEFSQU0pOwotICAgICAqIDwvUD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGTEFHX0FQUEVORF9UWVBFX1BBUkFNID0gMHgwNDAwMDAwMDsKLQotICAgIC8qKgotICAgICAqIDxQPgotICAgICAqIFRoZSBmbGFnIGFza2luZyBleHBvcnRlciB0byByZWZyYWluIGltYWdlIGV4cG9ydC4KLSAgICAgKiA8L1A+Ci0gICAgICogQGhpZGUgd2lsbCBiZSBkZWxldGVkIGluIHRoZSBuZWFyIGZ1dHVyZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGTEFHX1JFRlJBSU5fSU1BR0VfRVhQT1JUID0gMHgwMjAwMDAwMDsKLQotICAgIC8qKgotICAgICAqIDxQPgotICAgICAqIFRoZSBmbGFnIGluZGljYXRpbmcgdGhlIHZDYXJkIGNvbXBvc2VyIGRvZXMgdG91Y2ggbm90aGluZyB0b3dhcmQgcGhvbmUgbnVtYmVyIFN0cmluZ3MKLSAgICAgKiBidXQgbGVhdmUgaXQgYXMgaXMuCi0gICAgICogPC9QPgotICAgICAqIDxQPgotICAgICAqIFRoZSB2Q2FyZCBzcGVjaWZpY2F0aW9ucyBtZW50aW9uIG5vdGhpbmcgdG93YXJkIHBob25lIG51bWJlcnMsIHdoaWxlIHNvbWUgZGV2aWNlcwotICAgICAqIGRvICh3cm9uZ2x5LCBidXQgd2l0aCBpbm5ldml0YWJsZSByZWFzb25zKS4KLSAgICAgKiBGb3IgZXhhbXBsZSwgdGhlcmUncyBhIHBvc3NpYmlsaXR5IEphcGFuZXNlIG1vYmlsZSBwaG9uZXMgYXJlIGV4cGVjdGVkIHRvIGhhdmUKLSAgICAgKiBqdXN0IG51bWJlcnMsIGh5cGVucywgcGx1cywgZXRjLiBidXQgbm90IHVzdWFsIGFscGhhYmV0cywgd2hpbGUgVVMgbW9iaWxlIHBob25lcwotICAgICAqIHNob3VsZCBnZXQgc3VjaCBjaGFyYWN0ZXJzLiBUbyBtYWtlIGV4cG9ydGVkIHZDYXJkIHNpbXBsZSBmb3IgZXh0ZXJuYWwgcGFyc2VycywKLSAgICAgKiB3ZSBoYXZlIHVzZWQge0BsaW5rIFBob25lTnVtYmVyVXRpbHMjZm9ybWF0TnVtYmVyKFN0cmluZyl9IGR1cmluZyBleHBvcnQsIGFuZAotICAgICAqIHJlbW92ZWQgdW5uZWNlc3NhcnkgY2hhcmFjdGVycyBpbnNpZGUgdGhlIG51bWJlciAoZS5nLiAiMTExLTIyMi0zMzMzIChNaWFtaSkiCi0gICAgICogYmVjb21lcyAiMTExLTIyMi0zMzMzIikuCi0gICAgICogVW5mb3J0dW5hdGUgc2lkZSBlZmZlY3Qgb2YgdGhhdCB1c2Ugd2FzIHNvbWUgY29udHJvbCBjaGFyYWN0ZXJzIHVzZWQgaW4gdGhlIG90aGVyCi0gICAgICogYXJlYXMgbWF5IGJlIGJhZGx5IGFmZmVjdGVkIGJ5IHRoZSBmb3JtYXR0aW5nLgotICAgICAqIDwvUD4KLSAgICAgKiA8UD4KLSAgICAgKiBUaGlzIGZsYWcgZGlzYWJsZXMgdGhhdCBmb3JtYXR0aW5nLCBhZmZlY3RpbmcgYm90aCBpbXBvcnRlciBhbmQgZXhwb3J0ZXIuCi0gICAgICogSWYgdGhlIHVzZXIgaXMgYXdhcmUgb2Ygc29tZSBzaWRlIGVmZmVjdHMgZHVlIHRvIHRoZSBpbXBsaWNpdCBmb3JtYXR0aW5nLCB1c2UgdGhpcyBmbGFnLgotICAgICAqIDwvUD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGTEFHX1JFRlJBSU5fUEhPTkVfTlVNQkVSX0ZPUk1BVFRJTkcgPSAweDAyMDAwMDAwOwotCi0gICAgLy8vLyBUaGUgZm9sbG93aW5ncyBhcmUgVkNhcmQgdHlwZXMgYXZhaWxhYmxlIGZyb20gaW1wb3J0ZXIvZXhwb3J0ZXIuIC8vLy8KLQotICAgIC8qKgotICAgICAqIDxQPgotICAgICAqIEdlbmVyaWMgdkNhcmQgZm9ybWF0IHdpdGggdGhlIHZDYXJkIDIuMS4gVXNlcyBVVEYtOCBmb3IgdGhlIGNoYXJzZXQuCi0gICAgICogV2hlbiBjb21wb3NpbmcgYSB2Q2FyZCBlbnRyeSwgdGhlIFVTIGNvbnZlbnNpb24gd2lsbCBiZSB1c2VkIHRvd2FyZCBmb3JtYXR0aW5nCi0gICAgICogc29tZSB2YWx1ZXMuCi0gICAgICogPC9QPgotICAgICAqIDxQPgotICAgICAqIGUuZy4gVGhlIG9yZGVyIG9mIHRoZSBkaXNwbGF5IG5hbWUgd291bGQgYmUgIlByZWZpeCBHaXZlbiBNaWRkbGUgRmFtaWx5IFN1ZmZpeCIsCi0gICAgICogd2hpbGUgaXQgc2hvdWxkIGJlICJQcmVmaXggRmFtaWx5IE1pZGRsZSBHaXZlbiBTdWZmaXgiIGluIEphcGFuIGZvciBleGFtcGxlLgotICAgICAqIDwvUD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWQ0FSRF9UWVBFX1YyMV9HRU5FUklDX1VURjggPQotICAgICAgICAoRkxBR19WMjEgfCBOQU1FX09SREVSX0RFRkFVTFQgfCBGTEFHX0NIQVJTRVRfVVRGOCB8Ci0gICAgICAgICAgICAgICAgRkxBR19VU0VfREVGQUNUX1BST1BFUlRZIHwgRkxBR19VU0VfQU5EUk9JRF9QUk9QRVJUWSk7Ci0KLSAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBTdHJpbmcgVkNBUkRfVFlQRV9WMjFfR0VORVJJQ19VVEY4X1NUUiA9ICJ2MjFfZ2VuZXJpYyI7Ci0gICAgCi0gICAgLyoqCi0gICAgICogPFA+Ci0gICAgICogR2VuZXJhbCB2Q2FyZCBmb3JtYXQgd2l0aCB0aGUgdmVyc2lvbiAzLjAuIFVzZXMgVVRGLTggZm9yIHRoZSBjaGFyc2V0LgotICAgICAqIDwvUD4KLSAgICAgKiA8UD4KLSAgICAgKiBOb3QgZnVsbHkgcmVhZHkgeWV0LiBVc2Ugd2l0aCBjYXV0aW9uIHdoZW4geW91IHVzZSB0aGlzLgotICAgICAqIDwvUD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWQ0FSRF9UWVBFX1YzMF9HRU5FUklDX1VURjggPQotICAgICAgICAoRkxBR19WMzAgfCBOQU1FX09SREVSX0RFRkFVTFQgfCBGTEFHX0NIQVJTRVRfVVRGOCB8Ci0gICAgICAgICAgICAgICAgRkxBR19VU0VfREVGQUNUX1BST1BFUlRZIHwgRkxBR19VU0VfQU5EUk9JRF9QUk9QRVJUWSk7Ci0KLSAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkNBUkRfVFlQRV9WMzBfR0VORVJJQ19VVEY4X1NUUiA9ICJ2MzBfZ2VuZXJpYyI7Ci0gICAgCi0gICAgLyoqCi0gICAgICogPFA+Ci0gICAgICogR2VuZXJhbCB2Q2FyZCBmb3JtYXQgZm9yIHRoZSB2Q2FyZCAyLjEgd2l0aCBzb21lIEV1cm9wZSBjb252ZW5zaW9uLiBVc2VzIFV0Zi04LgotICAgICAqIEN1cnJlbnRseSwgb25seSBuYW1lIG9yZGVyIGlzIGNvbnNpZGVyZWQgKCJQcmVmaXggTWlkZGxlIEdpdmVuIEZhbWlseSBTdWZmaXgiKQotICAgICAqIDwvUD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWQ0FSRF9UWVBFX1YyMV9FVVJPUEVfVVRGOCA9Ci0gICAgICAgIChGTEFHX1YyMSB8IE5BTUVfT1JERVJfRVVST1BFIHwgRkxBR19DSEFSU0VUX1VURjggfAotICAgICAgICAgICAgICAgIEZMQUdfVVNFX0RFRkFDVF9QUk9QRVJUWSB8IEZMQUdfVVNFX0FORFJPSURfUFJPUEVSVFkpOwotICAgIAotICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGZpbmFsIFN0cmluZyBWQ0FSRF9UWVBFX1YyMV9FVVJPUEVfVVRGOF9TVFIgPSAidjIxX2V1cm9wZSI7Ci0gICAgCi0gICAgLyoqCi0gICAgICogPFA+Ci0gICAgICogR2VuZXJhbCB2Q2FyZCBmb3JtYXQgd2l0aCB0aGUgdmVyc2lvbiAzLjAgd2l0aCBzb21lIEV1cm9wZSBjb252ZW5zaW9uLiBVc2VzIFVURi04LgotICAgICAqIDwvUD4KLSAgICAgKiA8UD4KLSAgICAgKiBOb3QgcmVhZHkgeWV0LiBVc2Ugd2l0aCBjYXV0aW9uIHdoZW4geW91IHVzZSB0aGlzLgotICAgICAqIDwvUD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWQ0FSRF9UWVBFX1YzMF9FVVJPUEVfVVRGOCA9Ci0gICAgICAgIChGTEFHX1YzMCB8IE5BTUVfT1JERVJfRVVST1BFIHwgRkxBR19DSEFSU0VUX1VURjggfAotICAgICAgICAgICAgICAgIEZMQUdfVVNFX0RFRkFDVF9QUk9QRVJUWSB8IEZMQUdfVVNFX0FORFJPSURfUFJPUEVSVFkpOwotICAgIAotICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGZpbmFsIFN0cmluZyBWQ0FSRF9UWVBFX1YzMF9FVVJPUEVfU1RSID0gInYzMF9ldXJvcGUiOwotCi0gICAgLyoqCi0gICAgICogPFA+Ci0gICAgICogVGhlIHZDYXJkIDIuMSBmb3JtYXQgZm9yIG1pc2NlbGxhbmVvdXMgSmFwYW5lc2UgZGV2aWNlcywgdXNpbmcgVVRGLTggYXMgZGVmYXVsdCBjaGFyc2V0LgotICAgICAqIDwvUD4KLSAgICAgKiA8UD4KLSAgICAgKiBOb3QgcmVhZHkgeWV0LiBVc2Ugd2l0aCBjYXV0aW9uIHdoZW4geW91IHVzZSB0aGlzLgotICAgICAqIDwvUD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWQ0FSRF9UWVBFX1YyMV9KQVBBTkVTRV9VVEY4ID0KLSAgICAgICAgKEZMQUdfVjIxIHwgTkFNRV9PUkRFUl9KQVBBTkVTRSB8IEZMQUdfQ0hBUlNFVF9VVEY4IHwKLSAgICAgICAgICAgICAgICBGTEFHX1VTRV9ERUZBQ1RfUFJPUEVSVFkgfCBGTEFHX1VTRV9BTkRST0lEX1BST1BFUlRZKTsKLQotICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGZpbmFsIFN0cmluZyBWQ0FSRF9UWVBFX1YyMV9KQVBBTkVTRV9VVEY4X1NUUiA9ICJ2MjFfamFwYW5lc2VfdXRmOCI7Ci0KLSAgICAvKioKLSAgICAgKiA8UD4KLSAgICAgKiB2Q2FyZCAyLjEgZm9ybWF0IGZvciBtaXNjZWxsYW5lb3VzIEphcGFuZXNlIGRldmljZXMuIFNoaWZ0X0ppcyBpcyB1c2VkIGZvcgotICAgICAqIHBhcnNpbmcvY29tcG9zaW5nIHRoZSB2Q2FyZCBkYXRhLgotICAgICAqIDwvUD4KLSAgICAgKiA8UD4KLSAgICAgKiBOb3QgcmVhZHkgeWV0LiBVc2Ugd2l0aCBjYXV0aW9uIHdoZW4geW91IHVzZSB0aGlzLgotICAgICAqIDwvUD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWQ0FSRF9UWVBFX1YyMV9KQVBBTkVTRV9TSklTID0KLSAgICAgICAgKEZMQUdfVjIxIHwgTkFNRV9PUkRFUl9KQVBBTkVTRSB8IEZMQUdfQ0hBUlNFVF9TSElGVF9KSVMgfAotICAgICAgICAgICAgICAgIEZMQUdfVVNFX0RFRkFDVF9QUk9QRVJUWSB8IEZMQUdfVVNFX0FORFJPSURfUFJPUEVSVFkpOwotCi0gICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgU3RyaW5nIFZDQVJEX1RZUEVfVjIxX0pBUEFORVNFX1NKSVNfU1RSID0gInYyMV9qYXBhbmVzZV9zamlzIjsKLSAgICAKLSAgICAvKioKLSAgICAgKiA8UD4KLSAgICAgKiB2Q2FyZCBmb3JtYXQgZm9yIG1pc2NlbGxhbmVvdXMgSmFwYW5lc2UgZGV2aWNlcywgdXNpbmcgU2hpZnRfSmlzIGZvcgotICAgICAqIHBhcnNpbmcvY29tcG9zaW5nIHRoZSB2Q2FyZCBkYXRhLgotICAgICAqIDwvUD4KLSAgICAgKiA8UD4KLSAgICAgKiBOb3QgcmVhZHkgeWV0LiBVc2Ugd2l0aCBjYXV0aW9uIHdoZW4geW91IHVzZSB0aGlzLgotICAgICAqIDwvUD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWQ0FSRF9UWVBFX1YzMF9KQVBBTkVTRV9TSklTID0KLSAgICAgICAgKEZMQUdfVjMwIHwgTkFNRV9PUkRFUl9KQVBBTkVTRSB8IEZMQUdfQ0hBUlNFVF9TSElGVF9KSVMgfAotICAgICAgICAgICAgICAgIEZMQUdfVVNFX0RFRkFDVF9QUk9QRVJUWSB8IEZMQUdfVVNFX0FORFJPSURfUFJPUEVSVFkpOwotICAgICAgICAKLSAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkNBUkRfVFlQRV9WMzBfSkFQQU5FU0VfU0pJU19TVFIgPSAidjMwX2phcGFuZXNlX3NqaXMiOwotICAgIAotICAgIC8qKgotICAgICAqIDxQPgotICAgICAqIFRoZSB2Q2FyZCAzLjAgZm9ybWF0IGZvciBtaXNjZWxsYW5lb3VzIEphcGFuZXNlIGRldmljZXMsIHVzaW5nIFVURi04IGFzIGRlZmF1bHQgY2hhcnNldC4KLSAgICAgKiA8L1A+Ci0gICAgICogPFA+Ci0gICAgICogTm90IHJlYWR5IHlldC4gVXNlIHdpdGggY2F1dGlvbiB3aGVuIHlvdSB1c2UgdGhpcy4KLSAgICAgKiA8L1A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVkNBUkRfVFlQRV9WMzBfSkFQQU5FU0VfVVRGOCA9Ci0gICAgICAgIChGTEFHX1YzMCB8IE5BTUVfT1JERVJfSkFQQU5FU0UgfCBGTEFHX0NIQVJTRVRfVVRGOCB8Ci0gICAgICAgICAgICAgICAgRkxBR19VU0VfREVGQUNUX1BST1BFUlRZIHwgRkxBR19VU0VfQU5EUk9JRF9QUk9QRVJUWSk7Ci0KLSAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkNBUkRfVFlQRV9WMzBfSkFQQU5FU0VfVVRGOF9TVFIgPSAidjMwX2phcGFuZXNlX3V0ZjgiOwotCi0gICAgLyoqCi0gICAgICogPFA+Ci0gICAgICogVGhlIHZDYXJkIDIuMSBiYXNlZCBmb3JtYXQgd2hpY2ggKHBhcnRpYWxseSkgY29uc2lkZXJzIHRoZSBjb252ZW50aW9uIGluIEphcGFuZXNlCi0gICAgICogbW9iaWxlIHBob25lcywgd2hlcmUgcGhvbmV0aWMgbmFtZXMgYXJlIHRyYW5zbGF0ZWQgdG8gaGFsZi13aWR0aCBrYXRha2FuYSBpZgotICAgICAqIHBvc3NpYmxlLCBldGMuCi0gICAgICogPC9QPgotICAgICAqIDxQPgotICAgICAqIE5vdCByZWFkeSB5ZXQuIFVzZSB3aXRoIGNhdXRpb24gd2hlbiB5b3UgdXNlIHRoaXMuCi0gICAgICogPC9QPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZDQVJEX1RZUEVfVjIxX0pBUEFORVNFX01PQklMRSA9Ci0gICAgICAgIChGTEFHX1YyMSB8IE5BTUVfT1JERVJfSkFQQU5FU0UgfCBGTEFHX0NIQVJTRVRfU0hJRlRfSklTIHwKLSAgICAgICAgICAgICAgICBGTEFHX0NPTlZFUlRfUEhPTkVUSUNfTkFNRV9TVFJJTkdTIHwKLSAgICAgICAgICAgICAgICBGTEFHX1JFRlJBSU5fUVBfVE9fTkFNRV9QUk9QRVJUSUVTKTsKLQotICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGZpbmFsIFN0cmluZyBWQ0FSRF9UWVBFX1YyMV9KQVBBTkVTRV9NT0JJTEVfU1RSID0gInYyMV9qYXBhbmVzZV9tb2JpbGUiOwotCi0gICAgLyoqCi0gICAgICogPFA+Ci0gICAgICogVkNhcmQgZm9ybWF0IHVzZWQgaW4gRG9Db01vLCB3aGljaCBpcyBvbmUgb2YgSmFwYW5lc2UgbW9iaWxlIHBob25lIGNhcmVlcnMuCi0gICAgICogPC9wPgotICAgICAqIDxQPgotICAgICAqIEJhc2UgdmVyc2lvbiBpcyB2Q2FyZCAyLjEsIGJ1dCB0aGUgZGF0YSBoYXMgc2V2ZXJhbCBEb0NvTW8tc3BlY2lmaWMgY29udmVuc2lvbnMuCi0gICAgICogTm8gQW5kcm9pZC1zcGVjaWZpYyBwcm9wZXJ0eSBub3IgZGVmYWN0IHByb3BlcnR5IGlzIGluY2x1ZGVkLiBUaGUgIlByaW1hcnkiIHByb3BlcnRpZXMKLSAgICAgKiBhcmUgTk9UIGVuY29kZWQgdG8gUXVvdGVkLVByaW50YWJsZS4KLSAgICAgKiA8L1A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVkNBUkRfVFlQRV9ET0NPTU8gPQotICAgICAgICAoVkNBUkRfVFlQRV9WMjFfSkFQQU5FU0VfTU9CSUxFIHwgRkxBR19ET0NPTU8pOwotCi0gICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgU3RyaW5nIFZDQVJEX1RZUEVfRE9DT01PX1NUUiA9ICJkb2NvbW8iOwotCi0gICAgcHVibGljIHN0YXRpYyBpbnQgVkNBUkRfVFlQRV9ERUZBVUxUID0gVkNBUkRfVFlQRV9WMjFfR0VORVJJQ19VVEY4OwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPFN0cmluZywgSW50ZWdlcj4gc1ZDYXJkVHlwZU1hcDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTZXQ8SW50ZWdlcj4gc0phcGFuZXNlTW9iaWxlVHlwZVNldDsKLSAgICAKLSAgICBzdGF0aWMgewotICAgICAgICBzVkNhcmRUeXBlTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBJbnRlZ2VyPigpOwotICAgICAgICBzVkNhcmRUeXBlTWFwLnB1dChWQ0FSRF9UWVBFX1YyMV9HRU5FUklDX1VURjhfU1RSLCBWQ0FSRF9UWVBFX1YyMV9HRU5FUklDX1VURjgpOwotICAgICAgICBzVkNhcmRUeXBlTWFwLnB1dChWQ0FSRF9UWVBFX1YzMF9HRU5FUklDX1VURjhfU1RSLCBWQ0FSRF9UWVBFX1YzMF9HRU5FUklDX1VURjgpOwotICAgICAgICBzVkNhcmRUeXBlTWFwLnB1dChWQ0FSRF9UWVBFX1YyMV9FVVJPUEVfVVRGOF9TVFIsIFZDQVJEX1RZUEVfVjIxX0VVUk9QRV9VVEY4KTsKLSAgICAgICAgc1ZDYXJkVHlwZU1hcC5wdXQoVkNBUkRfVFlQRV9WMzBfRVVST1BFX1NUUiwgVkNBUkRfVFlQRV9WMzBfRVVST1BFX1VURjgpOwotICAgICAgICBzVkNhcmRUeXBlTWFwLnB1dChWQ0FSRF9UWVBFX1YyMV9KQVBBTkVTRV9TSklTX1NUUiwgVkNBUkRfVFlQRV9WMjFfSkFQQU5FU0VfU0pJUyk7Ci0gICAgICAgIHNWQ2FyZFR5cGVNYXAucHV0KFZDQVJEX1RZUEVfVjIxX0pBUEFORVNFX1VURjhfU1RSLCBWQ0FSRF9UWVBFX1YyMV9KQVBBTkVTRV9VVEY4KTsKLSAgICAgICAgc1ZDYXJkVHlwZU1hcC5wdXQoVkNBUkRfVFlQRV9WMzBfSkFQQU5FU0VfU0pJU19TVFIsIFZDQVJEX1RZUEVfVjMwX0pBUEFORVNFX1NKSVMpOwotICAgICAgICBzVkNhcmRUeXBlTWFwLnB1dChWQ0FSRF9UWVBFX1YzMF9KQVBBTkVTRV9VVEY4X1NUUiwgVkNBUkRfVFlQRV9WMzBfSkFQQU5FU0VfVVRGOCk7Ci0gICAgICAgIHNWQ2FyZFR5cGVNYXAucHV0KFZDQVJEX1RZUEVfVjIxX0pBUEFORVNFX01PQklMRV9TVFIsIFZDQVJEX1RZUEVfVjIxX0pBUEFORVNFX01PQklMRSk7Ci0gICAgICAgIHNWQ2FyZFR5cGVNYXAucHV0KFZDQVJEX1RZUEVfRE9DT01PX1NUUiwgVkNBUkRfVFlQRV9ET0NPTU8pOwotCi0gICAgICAgIHNKYXBhbmVzZU1vYmlsZVR5cGVTZXQgPSBuZXcgSGFzaFNldDxJbnRlZ2VyPigpOwotICAgICAgICBzSmFwYW5lc2VNb2JpbGVUeXBlU2V0LmFkZChWQ0FSRF9UWVBFX1YyMV9KQVBBTkVTRV9TSklTKTsKLSAgICAgICAgc0phcGFuZXNlTW9iaWxlVHlwZVNldC5hZGQoVkNBUkRfVFlQRV9WMjFfSkFQQU5FU0VfVVRGOCk7Ci0gICAgICAgIHNKYXBhbmVzZU1vYmlsZVR5cGVTZXQuYWRkKFZDQVJEX1RZUEVfVjIxX0pBUEFORVNFX1NKSVMpOwotICAgICAgICBzSmFwYW5lc2VNb2JpbGVUeXBlU2V0LmFkZChWQ0FSRF9UWVBFX1YzMF9KQVBBTkVTRV9TSklTKTsKLSAgICAgICAgc0phcGFuZXNlTW9iaWxlVHlwZVNldC5hZGQoVkNBUkRfVFlQRV9WMzBfSkFQQU5FU0VfVVRGOCk7Ci0gICAgICAgIHNKYXBhbmVzZU1vYmlsZVR5cGVTZXQuYWRkKFZDQVJEX1RZUEVfVjIxX0pBUEFORVNFX01PQklMRSk7Ci0gICAgICAgIHNKYXBhbmVzZU1vYmlsZVR5cGVTZXQuYWRkKFZDQVJEX1RZUEVfRE9DT01PKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGludCBnZXRWQ2FyZFR5cGVGcm9tU3RyaW5nKGZpbmFsIFN0cmluZyB2Y2FyZFR5cGVTdHJpbmcpIHsKLSAgICAgICAgZmluYWwgU3RyaW5nIGxvd2VyZWRLZXkgPSB2Y2FyZFR5cGVTdHJpbmcudG9Mb3dlckNhc2UoKTsKLSAgICAgICAgaWYgKHNWQ2FyZFR5cGVNYXAuY29udGFpbnNLZXkobG93ZXJlZEtleSkpIHsKLSAgICAgICAgICAgIHJldHVybiBzVkNhcmRUeXBlTWFwLmdldChsb3dlcmVkS2V5KTsKLSAgICAgICAgfSBlbHNlIGlmICgiZGVmYXVsdCIuZXF1YWxzSWdub3JlQ2FzZSh2Y2FyZFR5cGVTdHJpbmcpKSB7Ci0gICAgICAgICAgICByZXR1cm4gVkNBUkRfVFlQRV9ERUZBVUxUOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIlVua25vd24gdkNhcmQgdHlwZSBTdHJpbmc6IFwiIiArIHZjYXJkVHlwZVN0cmluZyArICJcIiIpOwotICAgICAgICAgICAgcmV0dXJuIFZDQVJEX1RZUEVfREVGQVVMVDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1YzMChmaW5hbCBpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIHJldHVybiAoKHZjYXJkVHlwZSAmIEZMQUdfVjMwKSAhPSAwKTsgIAotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzaG91bGRVc2VRdW90ZWRQcmludGFibGUoZmluYWwgaW50IHZjYXJkVHlwZSkgewotICAgICAgICByZXR1cm4gIWlzVjMwKHZjYXJkVHlwZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIHVzZXNVdGY4KGZpbmFsIGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgcmV0dXJuICgodmNhcmRUeXBlICYgRkxBR19DSEFSU0VUX01BU0spID09IEZMQUdfQ0hBUlNFVF9VVEY4KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gdXNlc1NoaWZ0SmlzKGZpbmFsIGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgcmV0dXJuICgodmNhcmRUeXBlICYgRkxBR19DSEFSU0VUX01BU0spID09IEZMQUdfQ0hBUlNFVF9TSElGVF9KSVMpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldE5hbWVPcmRlclR5cGUoZmluYWwgaW50IHZjYXJkVHlwZSkgewotICAgICAgICByZXR1cm4gdmNhcmRUeXBlICYgTkFNRV9PUkRFUl9NQVNLOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiB1c2VzQW5kcm9pZFNwZWNpZmljUHJvcGVydHkoZmluYWwgaW50IHZjYXJkVHlwZSkgewotICAgICAgICByZXR1cm4gKCh2Y2FyZFR5cGUgJiBGTEFHX1VTRV9BTkRST0lEX1BST1BFUlRZKSAhPSAwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gdXNlc0RlZmFjdFByb3BlcnR5KGZpbmFsIGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgcmV0dXJuICgodmNhcmRUeXBlICYgRkxBR19VU0VfREVGQUNUX1BST1BFUlRZKSAhPSAwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gc2hvd1BlcmZvcm1hbmNlTG9nKCkgewotICAgICAgICByZXR1cm4gKFZDYXJkQ29uZmlnLkxPR19MRVZFTCAmIFZDYXJkQ29uZmlnLkxPR19MRVZFTF9QRVJGT1JNQU5DRV9NRUFTVVJFTUVOVCkgIT0gMDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gc2hvdWxkUmVmcmFpblFQVG9OYW1lUHJvcGVydGllcyhmaW5hbCBpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgcmV0dXJuICghc2hvdWxkVXNlUXVvdGVkUHJpbnRhYmxlKHZjYXJkVHlwZSkgfHwKLSAgICAgICAgICAgICAgICgodmNhcmRUeXBlICYgRkxBR19SRUZSQUlOX1FQX1RPX05BTUVfUFJPUEVSVElFUykgIT0gMCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBhcHBlbmRUeXBlUGFyYW1OYW1lKGZpbmFsIGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgcmV0dXJuIChpc1YzMCh2Y2FyZFR5cGUpIHx8ICgodmNhcmRUeXBlICYgRkxBR19BUFBFTkRfVFlQRV9QQVJBTSkgIT0gMCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZGV2aWNlIGlzIEphcGFuZXNlIGFuZCBzb21lIEphcGFuZXNlIGNvbnZlbnNpb24gaXMKLSAgICAgKiBhcHBsaWVkIHRvIGNyZWF0aW5nICJmb3JtYXR0ZWQiIHNvbWV0aGluZyBsaWtlIEZPUk1BVFRFRF9BRERSRVNTLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0phcGFuZXNlRGV2aWNlKGZpbmFsIGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgLy8gVE9ETzogU29tZSBtYXNrIHdpbGwgYmUgcmVxdWlyZWQgc28gdGhhdCB0aGlzIG1ldGhvZCB3cm9uZ2x5IGludGVycHJldAotICAgICAgICAvLyAgICAgICAgSmFwYW5lc2UiLWxpa2UiIHZDYXJkIHR5cGUuCi0gICAgICAgIC8vICAgICAgICBlLmcuIFZDQVJEX1RZUEVfVjIxX0pBUEFORVNFX1NKSVMgfCBGTEFHX0FQUEVORF9UWVBFX1BBUkFNUwotICAgICAgICByZXR1cm4gc0phcGFuZXNlTW9iaWxlVHlwZVNldC5jb250YWlucyh2Y2FyZFR5cGUpOwotICAgIH0KLQotICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGJvb2xlYW4gcmVmcmFpblBob25lTnVtYmVyRm9ybWF0dGluZyhmaW5hbCBpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIHJldHVybiAoKHZjYXJkVHlwZSAmIEZMQUdfUkVGUkFJTl9QSE9ORV9OVU1CRVJfRk9STUFUVElORykgIT0gMCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIG5lZWRzVG9Db252ZXJ0UGhvbmV0aWNTdHJpbmcoZmluYWwgaW50IHZjYXJkVHlwZSkgewotICAgICAgICByZXR1cm4gKCh2Y2FyZFR5cGUgJiBGTEFHX0NPTlZFUlRfUEhPTkVUSUNfTkFNRV9TVFJJTkdTKSAhPSAwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gb25seU9uZU5vdGVGaWVsZElzQXZhaWxhYmxlKGZpbmFsIGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgcmV0dXJuIHZjYXJkVHlwZSA9PSBWQ0FSRF9UWVBFX0RPQ09NTzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNEb0NvTW8oZmluYWwgaW50IHZjYXJkVHlwZSkgewotICAgICAgICByZXR1cm4gKCh2Y2FyZFR5cGUgJiBGTEFHX0RPQ09NTykgIT0gMCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBWQ2FyZENvbmZpZygpIHsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRDb25zdGFudHMuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZENvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzA3MTI2Li4wMDAwMDAwCi0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZENvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLnBpbS52Y2FyZDsKLQotLyoqCi0gKiBDb25zdGFudHMgdXNlZCBpbiBib3RoIGV4cG9ydGVyIGFuZCBpbXBvcnRlciBjb2RlLgotICovCi1wdWJsaWMgY2xhc3MgVkNhcmRDb25zdGFudHMgewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZFUlNJT05fVjIxID0gIjIuMSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkVSU0lPTl9WMzAgPSAiMy4wIjsKLQotICAgIC8vIFRoZSBwcm9wZXJ0eSBuYW1lcyB2YWxpZCBib3RoIGluIHZDYXJkIDIuMSBhbmQgMy4wLgotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX0JFR0lOID0gIkJFR0lOIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9WRVJTSU9OID0gIlZFUlNJT04iOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX04gPSAiTiI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfRk4gPSAiRk4iOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX0FEUiA9ICJBRFIiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX0VNQUlMID0gIkVNQUlMIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9OT1RFID0gIk5PVEUiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX09SRyA9ICJPUkciOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX1NPVU5EID0gIlNPVU5EIjsgIC8vIE5vdCBmdWxseSBzdXBwb3J0ZWQuCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfVEVMID0gIlRFTCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfVElUTEUgPSAiVElUTEUiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX1JPTEUgPSAiUk9MRSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfUEhPVE8gPSAiUEhPVE8iOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX0xPR08gPSAiTE9HTyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfVVJMID0gIlVSTCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfQkRBWSA9ICJCREFZIjsgIC8vIEJpcnRoZGF5Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfRU5EID0gIkVORCI7Ci0KLSAgICAvLyBWYWxpZCBwcm9wZXJ0eSBuYW1lcyBub3Qgc3VwcG9ydGVkIChub3QgYXBwcm9wcmlhdGVseSBoYW5kbGVkKSBieSBvdXIgdkNhcmQgaW1wb3J0ZXIgbm93LgotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX1JFViA9ICJSRVYiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX0FHRU5UID0gIkFHRU5UIjsKLQotICAgIC8vIEF2YWlsYWJsZSBpbiB2Q2FyZCAzLjAuIFNob3VkIG5vdCB1c2Ugd2hlbiBjb21wb3NpbmcgdkNhcmQgMi4xIGZpbGUuCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfTkFNRSA9ICJOQU1FIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9OSUNLTkFNRSA9ICJOSUNLTkFNRSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfU09SVF9TVFJJTkcgPSAiU09SVC1TVFJJTkciOwotICAgIAotICAgIC8vIERlLWZhY3QgcHJvcGVydHkgdmFsdWVzIGV4cHJlc3NpbmcgcGhvbmV0aWMgbmFtZXMuCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfWF9QSE9ORVRJQ19GSVJTVF9OQU1FID0gIlgtUEhPTkVUSUMtRklSU1QtTkFNRSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfWF9QSE9ORVRJQ19NSURETEVfTkFNRSA9ICJYLVBIT05FVElDLU1JRERMRS1OQU1FIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9YX1BIT05FVElDX0xBU1RfTkFNRSA9ICJYLVBIT05FVElDLUxBU1QtTkFNRSI7Ci0KLSAgICAvLyBQcm9wZXJ0aWVzIGJvdGggQ29udGFjdHNTdHJ1Y3QgaW4gRWNsYWlyIGFuZCBkZS1mYWN0IHZDYXJkIGV4dGVuc2lvbnMKLSAgICAvLyBzaG93biBpbiBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1ZDYXJkIHN1cHBvcnQgYXJlIGRlZmluZWQgaGVyZS4KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9YX0FJTSA9ICJYLUFJTSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfWF9NU04gPSAiWC1NU04iOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX1hfWUFIT08gPSAiWC1ZQUhPTyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfWF9JQ1EgPSAiWC1JQ1EiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX1hfSkFCQkVSID0gIlgtSkFCQkVSIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9YX0dPT0dMRV9UQUxLID0gIlgtR09PR0xFLVRBTEsiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX1hfU0tZUEVfVVNFUk5BTUUgPSAiWC1TS1lQRS1VU0VSTkFNRSI7Ci0gICAgLy8gUHJvcGVydGllcyBvbmx5IENvbnRhY3RzU3RydWN0IGhhcy4gV2UgYWxzZSB1c2UgdGhpcy4KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9YX1FRID0gIlgtUVEiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX1hfTkVUTUVFVElORyA9ICJYLU5FVE1FRVRJTkciOwotCi0gICAgLy8gUGhvbmUgbnVtYmVyIGZvciBTa3lwZSwgYXZhaWxhYmxlIGFzIHVzdWFsIHBob25lLgotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX1hfU0tZUEVfUFNUTk5VTUJFUiA9ICJYLVNLWVBFLVBTVE5OVU1CRVIiOwotCi0gICAgLy8gUHJvcGVydHkgZm9yIEFuZHJvaWQtc3BlY2lmaWMgZmllbGRzLgotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX1hfQU5EUk9JRF9DVVNUT00gPSAiWC1BTkRST0lELUNVU1RPTSI7Ci0KLSAgICAvLyBQcm9wZXJ0aWVzIGZvciBEb0NvTW8gdkNhcmQuCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfWF9DTEFTUyA9ICJYLUNMQVNTIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9YX1JFRFVDVElPTiA9ICJYLVJFRFVDVElPTiI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfWF9OTyA9ICJYLU5PIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9YX0RDTV9ITU5fTU9ERSA9ICJYLURDTS1ITU4tTU9ERSI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9UWVBFID0gIlRZUEUiOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fVFlQRV9IT01FID0gIkhPTUUiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX1RZUEVfV09SSyA9ICJXT1JLIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9UWVBFX0ZBWCA9ICJGQVgiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX1RZUEVfQ0VMTCA9ICJDRUxMIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9UWVBFX1ZPSUNFID0gIlZPSUNFIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9UWVBFX0lOVEVSTkVUID0gIklOVEVSTkVUIjsKLQotICAgIC8vIEFiYnJldmlhdGlvbiBvZiAicHJlZmVyZWQiIGFjY29yZGluZyB0byB2Q2FyZCAyLjEgc3BlY2lmaWNhdGlvbi4KLSAgICAvLyBXZSBpbnRlcnByZXQgdGhpcyB2YWx1ZSBhcyAicHJpbWFyeSIgcHJvcGVydHkgZHVyaW5nIGltcG9ydC9leHBvcnQuCi0gICAgLy8KLSAgICAvLyBOb3RlOiBCb3RoIHZDYXJkIHNwZWNzIGRvZXMgbm90IG1lbnRpb24gYW55dGhpbmcgYWJvdXQgdGhlIHJlcXVpcmVtZW50IGZvciB0aGlzIHBhcmFtZXRlciwKLSAgICAvLyAgICAgICBidXQgdGhlcmUgbWF5IGJlIHNvbWUgdkNhcmQgaW1wb3J0ZXIgd2hpY2ggd2lsbCBnZXQgY29uZnVzZWQgd2l0aCBtb3JlIHRoYW4KLSAgICAvLyAgICAgICBvbmUgIlBSRUYicyBpbiBvbmUgcHJvcGVydHkgbmFtZSwgd2hpbGUgQW5kcm9pZCBhY2NlcHRzIHRoZW0uCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fVFlQRV9QUkVGID0gIlBSRUYiOwotCi0gICAgLy8gUGhvbmUgdHlwZSBwYXJhbWV0ZXJzIHZhbGlkIGluIHZDYXJkIGFuZCBrbm93biB0byBDb250YWN0c0NvbnRyYWN0LCBidXQgbm90IHNvIGNvbW1vbi4KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9UWVBFX0NBUiA9ICJDQVIiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX1RZUEVfSVNETiA9ICJJU0ROIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9UWVBFX1BBR0VSID0gIlBBR0VSIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9UWVBFX1RMWCA9ICJUTFgiOyAgLy8gVGVsZXgKLQotICAgIC8vIFBob25lIHR5cGVzIGV4aXN0aW5nIGluIHZDYXJkIDIuMSBidXQgbm90IGtub3duIHRvIENvbnRhY3RzQ29udHJhY3QuCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fVFlQRV9NT0RFTSA9ICJNT0RFTSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fVFlQRV9NU0cgPSAiTVNHIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9UWVBFX0JCUyA9ICJCQlMiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX1RZUEVfVklERU8gPSAiVklERU8iOwotCi0gICAgLy8gVFlQRSBwYXJhbWV0ZXJzIGZvciBQaG9uZXMsIHdoaWNoIGFyZSBub3QgZm9ybWFsbHkgdmFsaWQgaW4gdkNhcmQgKGF0IGxlYXN0IDIuMSkuCi0gICAgLy8gVGhlc2UgdHlwZXMgYXJlIGJhc2ljYWxseSBlbmNvZGVkIHRvICJYLSIgcGFyYW1ldGVycyB3aGVuIGNvbXBvc2luZyB2Q2FyZC4KLSAgICAvLyBQYXJzZXIgcGFzc2VzIHRoZXNlIHdoZW4gIlgtIiBpcyBhZGRlZCB0byB0aGUgcGFyYW1ldGVyIG9yIG5vdC4KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9QSE9ORV9FWFRSQV9UWVBFX0NBTExCQUNLID0gIkNBTExCQUNLIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9QSE9ORV9FWFRSQV9UWVBFX1JBRElPID0gIlJBRElPIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9QSE9ORV9FWFRSQV9UWVBFX1RUWV9UREQgPSAiVFRZLVRERCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fUEhPTkVfRVhUUkFfVFlQRV9BU1NJU1RBTlQgPSAiQVNTSVNUQU5UIjsKLSAgICAvLyB2Q2FyZCBjb21wb3NlciB0cmFuc2xhdGVzIHRoaXMgdHlwZSB0byAiV09SSyIgKyAiUFJFRiIuIEp1c3QgZm9yIHBhcnNpbmcuCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fUEhPTkVfRVhUUkFfVFlQRV9DT01QQU5ZX01BSU4gPSAiQ09NUEFOWS1NQUlOIjsKLSAgICAvLyB2Q2FyZCBjb21wb3NlciB0cmFuc2xhdGVzIHRoaXMgdHlwZSB0byAiVk9JQ0UiIEp1c3QgZm9yIHBhcnNpbmcuCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fUEhPTkVfRVhUUkFfVFlQRV9PVEhFUiA9ICJPVEhFUiI7Ci0KLSAgICAvLyBUWVBFIHBhcmFtZXRlcnMgZm9yIHBvc3RhbCBhZGRyZXNzZXMuCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fQURSX1RZUEVfUEFSQ0VMID0gIlBBUkNFTCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fQURSX1RZUEVfRE9NID0gIkRPTSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fQURSX1RZUEVfSU5UTCA9ICJJTlRMIjsKLQotICAgIC8vIFRZUEUgcGFyYW1ldGVycyBub3Qgb2ZmaWNpYWxseSB2YWxpZCBidXQgdXNlZCBpbiBzb21lIHZDYXJkIGV4cG9ydGVyLgotICAgIC8vIERvIG5vdCB1c2UgaW4gY29tcG9zZXIgc2lkZS4KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9FWFRSQV9UWVBFX0NPTVBBTlkgPSAiQ09NUEFOWSI7Ci0KLSAgICAvLyBEb0NvTW8gc3BlY2lmaWMgdHlwZSBwYXJhbWV0ZXIuIFVzZWQgd2l0aCAiU09VTkQiIHByb3BlcnR5LCB3aGljaCBpcyBhbHRlcm5hdGUgb2YgU09SVC1TVFJJTkcgaW4KLSAgICAvLyB2Q2FyZCAzLjAuCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fVFlQRV9YX0lSTUNfTiA9ICJYLUlSTUMtTiI7Ci0KLSAgICBwdWJsaWMgaW50ZXJmYWNlIEltcG9ydE9ubHkgewotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9YX05JQ0tOQU1FID0gIlgtTklDS05BTUUiOwotICAgICAgICAvLyBTb21lIGRldmljZSBlbWl0cyB0aGlzICJYLSIgcGFyYW1ldGVyIGZvciBleHByZXNzaW5nIEdvb2dsZSBUYWxrLAotICAgICAgICAvLyB3aGljaCBpcyBzcGVjaWZpY2FsbHkgaW52YWxpZCBidXQgc2hvdWxkIGJlIGFsd2F5cyBwcm9wZXJseSBhY2NlcHRlZCwgYW5kIGVtaXR0ZWQKLSAgICAgICAgLy8gaW4gc29tZSBzcGVjaWFsIGNhc2UgKGZvciB0aGF0IGRldmljZS9hcHBsaWNhdGlvbikuCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX1hfR09PR0xFX1RBTEtfV0lUSF9TUEFDRSA9ICJYLUdPT0dMRSBUQUxLIjsKLSAgICB9Ci0KLSAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBmaW5hbCBpbnQgTUFYX0RBVEFfQ09MVU1OID0gMTU7Ci0KLSAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBmaW5hbCBpbnQgTUFYX0NIQVJBQ1RFUl9OVU1TX1FQID0gNzY7Ci0gICAgc3RhdGljIGZpbmFsIGludCBNQVhfQ0hBUkFDVEVSX05VTVNfQkFTRTY0X1YzMCA9IDc1OwotCi0gICAgcHJpdmF0ZSBWQ2FyZENvbnN0YW50cygpIHsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkRW50cnkuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZEVudHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjN2U5YjguLjAwMDAwMDAKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkRW50cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NDcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGFuZHJvaWQucGltLnZjYXJkOwotCi1pbXBvcnQgYW5kcm9pZC5hY2NvdW50cy5BY2NvdW50OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UHJvdmlkZXJPcGVyYXRpb247Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRQcm92aWRlclJlc3VsdDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5PcGVyYXRpb25BcHBsaWNhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcjsKLWltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7Ci1pbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0OwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db250YWN0czsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuRGF0YTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuR3JvdXBzOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5SYXdDb250YWN0czsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLkVtYWlsOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuRXZlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5Hcm91cE1lbWJlcnNoaXA7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5JbTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLk5pY2tuYW1lOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuTm90ZTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLk9yZ2FuaXphdGlvbjsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLlBob25lOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuUGhvdG87Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5TdHJ1Y3R1cmVkTmFtZTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLlN0cnVjdHVyZWRQb3N0YWw7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5XZWJzaXRlOwotaW1wb3J0IGFuZHJvaWQudGVsZXBob255LlBob25lTnVtYmVyVXRpbHM7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgYnJpZGdlcyBiZXR3ZWVuIGRhdGEgc3RydWN0dXJlIG9mIENvbnRhY3QgYXBwIGFuZCBWQ2FyZCBkYXRhLgotICovCi1wdWJsaWMgY2xhc3MgVkNhcmRFbnRyeSB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19UQUcgPSAiVkNhcmRFbnRyeSI7Ci0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgREVGQVVMVF9PUkdBTklaQVRJT05fVFlQRSA9IE9yZ2FuaXphdGlvbi5UWVBFX1dPUks7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNDT1VOVF9UWVBFX0dPT0dMRSA9ICJjb20uZ29vZ2xlIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgR09PR0xFX01ZX0NPTlRBQ1RTX0dST1VQID0gIlN5c3RlbSBHcm91cDogTXkgQ29udGFjdHMiOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPFN0cmluZywgSW50ZWdlcj4gc0ltTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBJbnRlZ2VyPigpOwotCi0gICAgc3RhdGljIHsKLSAgICAgICAgc0ltTWFwLnB1dChWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9YX0FJTSwgSW0uUFJPVE9DT0xfQUlNKTsKLSAgICAgICAgc0ltTWFwLnB1dChWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9YX01TTiwgSW0uUFJPVE9DT0xfTVNOKTsKLSAgICAgICAgc0ltTWFwLnB1dChWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9YX1lBSE9PLCBJbS5QUk9UT0NPTF9ZQUhPTyk7Ci0gICAgICAgIHNJbU1hcC5wdXQoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfWF9JQ1EsIEltLlBST1RPQ09MX0lDUSk7Ci0gICAgICAgIHNJbU1hcC5wdXQoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfWF9KQUJCRVIsIEltLlBST1RPQ09MX0pBQkJFUik7Ci0gICAgICAgIHNJbU1hcC5wdXQoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfWF9TS1lQRV9VU0VSTkFNRSwgSW0uUFJPVE9DT0xfU0tZUEUpOwotICAgICAgICBzSW1NYXAucHV0KFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1hfR09PR0xFX1RBTEssIEltLlBST1RPQ09MX0dPT0dMRV9UQUxLKTsKLSAgICAgICAgc0ltTWFwLnB1dChWQ2FyZENvbnN0YW50cy5JbXBvcnRPbmx5LlBST1BFUlRZX1hfR09PR0xFX1RBTEtfV0lUSF9TUEFDRSwKLSAgICAgICAgICAgICAgICBJbS5QUk9UT0NPTF9HT09HTEVfVEFMSyk7Ci0gICAgfQotCi0gICAgc3RhdGljIHB1YmxpYyBjbGFzcyBQaG9uZURhdGEgewotICAgICAgICBwdWJsaWMgZmluYWwgaW50IHR5cGU7Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZGF0YTsKLSAgICAgICAgcHVibGljIGZpbmFsIFN0cmluZyBsYWJlbDsKLSAgICAgICAgLy8gaXNQcmltYXJ5IGlzIGNoYW5nYWJsZSBvbmx5IHdoZW4gdGhlcmUncyBubyBhcHByb3ByaWF0ZSBvbmUgZXhpc3RpbmcgaW4KLSAgICAgICAgLy8gdGhlIG9yaWdpbmFsIFZDYXJkLgotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1ByaW1hcnk7Ci0gICAgICAgIHB1YmxpYyBQaG9uZURhdGEoaW50IHR5cGUsIFN0cmluZyBkYXRhLCBTdHJpbmcgbGFiZWwsIGJvb2xlYW4gaXNQcmltYXJ5KSB7Ci0gICAgICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOwotICAgICAgICAgICAgdGhpcy5kYXRhID0gZGF0YTsKLSAgICAgICAgICAgIHRoaXMubGFiZWwgPSBsYWJlbDsKLSAgICAgICAgICAgIHRoaXMuaXNQcmltYXJ5ID0gaXNQcmltYXJ5OwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0gICAgICAgICAgICBpZiAoIShvYmogaW5zdGFuY2VvZiBQaG9uZURhdGEpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgUGhvbmVEYXRhIHBob25lRGF0YSA9IChQaG9uZURhdGEpb2JqOwotICAgICAgICAgICAgcmV0dXJuICh0eXBlID09IHBob25lRGF0YS50eXBlICYmIGRhdGEuZXF1YWxzKHBob25lRGF0YS5kYXRhKSAmJgotICAgICAgICAgICAgICAgICAgICBsYWJlbC5lcXVhbHMocGhvbmVEYXRhLmxhYmVsKSAmJiBpc1ByaW1hcnkgPT0gcGhvbmVEYXRhLmlzUHJpbWFyeSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCJ0eXBlOiAlZCwgZGF0YTogJXMsIGxhYmVsOiAlcywgaXNQcmltYXJ5OiAlcyIsCi0gICAgICAgICAgICAgICAgICAgIHR5cGUsIGRhdGEsIGxhYmVsLCBpc1ByaW1hcnkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3RhdGljIHB1YmxpYyBjbGFzcyBFbWFpbERhdGEgewotICAgICAgICBwdWJsaWMgZmluYWwgaW50IHR5cGU7Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZGF0YTsKLSAgICAgICAgLy8gVXNlZCBvbmx5IHdoZW4gVFlQRSBpcyBUWVBFX0NVU1RPTS4KLSAgICAgICAgcHVibGljIGZpbmFsIFN0cmluZyBsYWJlbDsKLSAgICAgICAgLy8gaXNQcmltYXJ5IGlzIGNoYW5nYWJsZSBvbmx5IHdoZW4gdGhlcmUncyBubyBhcHByb3ByaWF0ZSBvbmUgZXhpc3RpbmcgaW4KLSAgICAgICAgLy8gdGhlIG9yaWdpbmFsIFZDYXJkLgotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1ByaW1hcnk7Ci0gICAgICAgIHB1YmxpYyBFbWFpbERhdGEoaW50IHR5cGUsIFN0cmluZyBkYXRhLCBTdHJpbmcgbGFiZWwsIGJvb2xlYW4gaXNQcmltYXJ5KSB7Ci0gICAgICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOwotICAgICAgICAgICAgdGhpcy5kYXRhID0gZGF0YTsKLSAgICAgICAgICAgIHRoaXMubGFiZWwgPSBsYWJlbDsKLSAgICAgICAgICAgIHRoaXMuaXNQcmltYXJ5ID0gaXNQcmltYXJ5OwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0gICAgICAgICAgICBpZiAoIShvYmogaW5zdGFuY2VvZiBFbWFpbERhdGEpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgRW1haWxEYXRhIGVtYWlsRGF0YSA9IChFbWFpbERhdGEpb2JqOwotICAgICAgICAgICAgcmV0dXJuICh0eXBlID09IGVtYWlsRGF0YS50eXBlICYmIGRhdGEuZXF1YWxzKGVtYWlsRGF0YS5kYXRhKSAmJgotICAgICAgICAgICAgICAgICAgICBsYWJlbC5lcXVhbHMoZW1haWxEYXRhLmxhYmVsKSAmJiBpc1ByaW1hcnkgPT0gZW1haWxEYXRhLmlzUHJpbWFyeSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCJ0eXBlOiAlZCwgZGF0YTogJXMsIGxhYmVsOiAlcywgaXNQcmltYXJ5OiAlcyIsCi0gICAgICAgICAgICAgICAgICAgIHR5cGUsIGRhdGEsIGxhYmVsLCBpc1ByaW1hcnkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3RhdGljIHB1YmxpYyBjbGFzcyBQb3N0YWxEYXRhIHsKLSAgICAgICAgLy8gRGV0ZXJtaW5lZCBieSB2Q2FyZCBzcGVjLgotICAgICAgICAvLyBQTyBCb3gsIEV4dGVuZGVkIEFkZHIsIFN0cmVldCwgTG9jYWxpdHksIFJlZ2lvbiwgUG9zdGFsIENvZGUsIENvdW50cnkgTmFtZQotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBRERSX01BWF9EQVRBX1NJWkUgPSA3OwotICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZ1tdIGRhdGFBcnJheTsKLSAgICAgICAgcHVibGljIGZpbmFsIFN0cmluZyBwb2JveDsKLSAgICAgICAgcHVibGljIGZpbmFsIFN0cmluZyBleHRlbmRlZEFkZHJlc3M7Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgc3RyZWV0OwotICAgICAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGxvY2FsdHk7Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgcmVnaW9uOwotICAgICAgICBwdWJsaWMgZmluYWwgU3RyaW5nIHBvc3RhbENvZGU7Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgY291bnRyeTsKLSAgICAgICAgcHVibGljIGZpbmFsIGludCB0eXBlOwotICAgICAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGxhYmVsOwotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1ByaW1hcnk7Ci0KLSAgICAgICAgcHVibGljIFBvc3RhbERhdGEoZmluYWwgaW50IHR5cGUsIGZpbmFsIExpc3Q8U3RyaW5nPiBwcm9wVmFsdWVMaXN0LAotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBsYWJlbCwgYm9vbGVhbiBpc1ByaW1hcnkpIHsKLSAgICAgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7Ci0gICAgICAgICAgICBkYXRhQXJyYXkgPSBuZXcgU3RyaW5nW0FERFJfTUFYX0RBVEFfU0laRV07Ci0KLSAgICAgICAgICAgIGludCBzaXplID0gcHJvcFZhbHVlTGlzdC5zaXplKCk7Ci0gICAgICAgICAgICBpZiAoc2l6ZSA+IEFERFJfTUFYX0RBVEFfU0laRSkgewotICAgICAgICAgICAgICAgIHNpemUgPSBBRERSX01BWF9EQVRBX1NJWkU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGFkci12YWx1ZSA9IDAqNih0ZXh0LXZhbHVlICI7IikgdGV4dC12YWx1ZQotICAgICAgICAgICAgLy8gICAgICAgICAgIDsgUE8gQm94LCBFeHRlbmRlZCBBZGRyZXNzLCBTdHJlZXQsIExvY2FsaXR5LCBSZWdpb24sIFBvc3RhbAotICAgICAgICAgICAgLy8gICAgICAgICAgIDsgQ29kZSwgQ291bnRyeSBOYW1lCi0gICAgICAgICAgICAvLwotICAgICAgICAgICAgLy8gVXNlIEl0ZXJhdG9yIGFzc3VtaW5nIExpc3QgbWF5IGJlIExpbmtlZExpc3QsIHRob3VnaCBhY3R1YWxseSBpdCBpcwotICAgICAgICAgICAgLy8gYWx3YXlzIEFycmF5TGlzdCBpbiB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbi4KLSAgICAgICAgICAgIGludCBpID0gMDsKLSAgICAgICAgICAgIGZvciAoU3RyaW5nIGFkZHJlc3NFbGVtZW50IDogcHJvcFZhbHVlTGlzdCkgewotICAgICAgICAgICAgICAgIGRhdGFBcnJheVtpXSA9IGFkZHJlc3NFbGVtZW50OwotICAgICAgICAgICAgICAgIGlmICgrK2kgPj0gc2l6ZSkgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB3aGlsZSAoaSA8IEFERFJfTUFYX0RBVEFfU0laRSkgewotICAgICAgICAgICAgICAgIGRhdGFBcnJheVtpKytdID0gbnVsbDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdGhpcy5wb2JveCA9IGRhdGFBcnJheVswXTsKLSAgICAgICAgICAgIHRoaXMuZXh0ZW5kZWRBZGRyZXNzID0gZGF0YUFycmF5WzFdOwotICAgICAgICAgICAgdGhpcy5zdHJlZXQgPSBkYXRhQXJyYXlbMl07Ci0gICAgICAgICAgICB0aGlzLmxvY2FsdHkgPSBkYXRhQXJyYXlbM107Ci0gICAgICAgICAgICB0aGlzLnJlZ2lvbiA9IGRhdGFBcnJheVs0XTsKLSAgICAgICAgICAgIHRoaXMucG9zdGFsQ29kZSA9IGRhdGFBcnJheVs1XTsKLSAgICAgICAgICAgIHRoaXMuY291bnRyeSA9IGRhdGFBcnJheVs2XTsKLSAgICAgICAgICAgIHRoaXMubGFiZWwgPSBsYWJlbDsKLSAgICAgICAgICAgIHRoaXMuaXNQcmltYXJ5ID0gaXNQcmltYXJ5OwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0gICAgICAgICAgICBpZiAoIShvYmogaW5zdGFuY2VvZiBQb3N0YWxEYXRhKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZpbmFsIFBvc3RhbERhdGEgcG9zdGFsRGF0YSA9IChQb3N0YWxEYXRhKW9iajsKLSAgICAgICAgICAgIHJldHVybiAoQXJyYXlzLmVxdWFscyhkYXRhQXJyYXksIHBvc3RhbERhdGEuZGF0YUFycmF5KSAmJgotICAgICAgICAgICAgICAgICAgICAodHlwZSA9PSBwb3N0YWxEYXRhLnR5cGUgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAodHlwZSA9PSBTdHJ1Y3R1cmVkUG9zdGFsLlRZUEVfQ1VTVE9NID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsYWJlbCA9PSBwb3N0YWxEYXRhLmxhYmVsKSA6IHRydWUpKSAmJgotICAgICAgICAgICAgICAgICAgICAoaXNQcmltYXJ5ID09IHBvc3RhbERhdGEuaXNQcmltYXJ5KSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEZvcm1hdHRlZEFkZHJlc3MoZmluYWwgaW50IHZjYXJkVHlwZSkgewotICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgICAgIGJvb2xlYW4gZW1wdHkgPSB0cnVlOwotICAgICAgICAgICAgaWYgKFZDYXJkQ29uZmlnLmlzSmFwYW5lc2VEZXZpY2UodmNhcmRUeXBlKSkgewotICAgICAgICAgICAgICAgIC8vIEluIEphcGFuLCB0aGUgb3JkZXIgaXMgcmV2ZXJzZWQuCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IEFERFJfTUFYX0RBVEFfU0laRSAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBhZGRyZXNzUGFydCA9IGRhdGFBcnJheVtpXTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShhZGRyZXNzUGFydCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZW1wdHkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgnICcpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXB0eSA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoYWRkcmVzc1BhcnQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IEFERFJfTUFYX0RBVEFfU0laRTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBhZGRyZXNzUGFydCA9IGRhdGFBcnJheVtpXTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShhZGRyZXNzUGFydCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZW1wdHkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgnICcpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXB0eSA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoYWRkcmVzc1BhcnQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gYnVpbGRlci50b1N0cmluZygpLnRyaW0oKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoInR5cGU6ICVkLCBsYWJlbDogJXMsIGlzUHJpbWFyeTogJXMiLAotICAgICAgICAgICAgICAgICAgICB0eXBlLCBsYWJlbCwgaXNQcmltYXJ5KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHN0YXRpYyBwdWJsaWMgY2xhc3MgT3JnYW5pemF0aW9uRGF0YSB7Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBpbnQgdHlwZTsKLSAgICAgICAgLy8gbm9uLWZpbmFsIGlzIEludGVudGlvbmFsOiB3ZSBtYXkgY2hhbmdlIHRoZSB2YWx1ZXMgc2luY2UgdGhpcyBpbmZvIGlzIHNlcGFyYXRlZCBpbnRvCi0gICAgICAgIC8vIHR3byBwYXJ0cyBpbiB2Q2FyZDogIk9SRyIgKyAiVElUTEUiLgotICAgICAgICBwdWJsaWMgU3RyaW5nIGNvbXBhbnlOYW1lOwotICAgICAgICBwdWJsaWMgU3RyaW5nIGRlcGFydG1lbnROYW1lOwotICAgICAgICBwdWJsaWMgU3RyaW5nIHRpdGxlTmFtZTsKLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNQcmltYXJ5OwotCi0gICAgICAgIHB1YmxpYyBPcmdhbml6YXRpb25EYXRhKGludCB0eXBlLAotICAgICAgICAgICAgICAgIFN0cmluZyBjb21wYW55TmFtZSwKLSAgICAgICAgICAgICAgICBTdHJpbmcgZGVwYXJ0bWVudE5hbWUsCi0gICAgICAgICAgICAgICAgU3RyaW5nIHRpdGxlTmFtZSwKLSAgICAgICAgICAgICAgICBib29sZWFuIGlzUHJpbWFyeSkgewotICAgICAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKLSAgICAgICAgICAgIHRoaXMuY29tcGFueU5hbWUgPSBjb21wYW55TmFtZTsKLSAgICAgICAgICAgIHRoaXMuZGVwYXJ0bWVudE5hbWUgPSBkZXBhcnRtZW50TmFtZTsKLSAgICAgICAgICAgIHRoaXMudGl0bGVOYW1lID0gdGl0bGVOYW1lOwotICAgICAgICAgICAgdGhpcy5pc1ByaW1hcnkgPSBpc1ByaW1hcnk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLSAgICAgICAgICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIE9yZ2FuaXphdGlvbkRhdGEpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgT3JnYW5pemF0aW9uRGF0YSBvcmdhbml6YXRpb24gPSAoT3JnYW5pemF0aW9uRGF0YSlvYmo7Ci0gICAgICAgICAgICByZXR1cm4gKHR5cGUgPT0gb3JnYW5pemF0aW9uLnR5cGUgJiYKLSAgICAgICAgICAgICAgICAgICAgVGV4dFV0aWxzLmVxdWFscyhjb21wYW55TmFtZSwgb3JnYW5pemF0aW9uLmNvbXBhbnlOYW1lKSAmJgotICAgICAgICAgICAgICAgICAgICBUZXh0VXRpbHMuZXF1YWxzKGRlcGFydG1lbnROYW1lLCBvcmdhbml6YXRpb24uZGVwYXJ0bWVudE5hbWUpICYmCi0gICAgICAgICAgICAgICAgICAgIFRleHRVdGlscy5lcXVhbHModGl0bGVOYW1lLCBvcmdhbml6YXRpb24udGl0bGVOYW1lKSAmJgotICAgICAgICAgICAgICAgICAgICBpc1ByaW1hcnkgPT0gb3JnYW5pemF0aW9uLmlzUHJpbWFyeSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEZvcm1hdHRlZFN0cmluZygpIHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KGNvbXBhbnlOYW1lKSkgewotICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGNvbXBhbnlOYW1lKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShkZXBhcnRtZW50TmFtZSkpIHsKLSAgICAgICAgICAgICAgICBpZiAoYnVpbGRlci5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIiwgIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGRlcGFydG1lbnROYW1lKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eSh0aXRsZU5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGJ1aWxkZXIubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCIsICIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCh0aXRsZU5hbWUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gYnVpbGRlci50b1N0cmluZygpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgKLSAgICAgICAgICAgICAgICAgICAgInR5cGU6ICVkLCBjb21wYW55OiAlcywgZGVwYXJ0bWVudDogJXMsIHRpdGxlOiAlcywgaXNQcmltYXJ5OiAlcyIsCi0gICAgICAgICAgICAgICAgICAgIHR5cGUsIGNvbXBhbnlOYW1lLCBkZXBhcnRtZW50TmFtZSwgdGl0bGVOYW1lLCBpc1ByaW1hcnkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3RhdGljIHB1YmxpYyBjbGFzcyBJbURhdGEgewotICAgICAgICBwdWJsaWMgZmluYWwgaW50IHByb3RvY29sOwotICAgICAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGN1c3RvbVByb3RvY29sOwotICAgICAgICBwdWJsaWMgZmluYWwgaW50IHR5cGU7Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZGF0YTsKLSAgICAgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gaXNQcmltYXJ5OwotCi0gICAgICAgIHB1YmxpYyBJbURhdGEoZmluYWwgaW50IHByb3RvY29sLCBmaW5hbCBTdHJpbmcgY3VzdG9tUHJvdG9jb2wsIGZpbmFsIGludCB0eXBlLAotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBkYXRhLCBmaW5hbCBib29sZWFuIGlzUHJpbWFyeSkgewotICAgICAgICAgICAgdGhpcy5wcm90b2NvbCA9IHByb3RvY29sOwotICAgICAgICAgICAgdGhpcy5jdXN0b21Qcm90b2NvbCA9IGN1c3RvbVByb3RvY29sOwotICAgICAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKLSAgICAgICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7Ci0gICAgICAgICAgICB0aGlzLmlzUHJpbWFyeSA9IGlzUHJpbWFyeTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotICAgICAgICAgICAgaWYgKCEob2JqIGluc3RhbmNlb2YgSW1EYXRhKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEltRGF0YSBpbURhdGEgPSAoSW1EYXRhKW9iajsKLSAgICAgICAgICAgIHJldHVybiAodHlwZSA9PSBpbURhdGEudHlwZSAmJiBwcm90b2NvbCA9PSBpbURhdGEucHJvdG9jb2wKLSAgICAgICAgICAgICAgICAgICAgJiYgKGN1c3RvbVByb3RvY29sICE9IG51bGwgPyBjdXN0b21Qcm90b2NvbC5lcXVhbHMoaW1EYXRhLmN1c3RvbVByb3RvY29sKSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAoaW1EYXRhLmN1c3RvbVByb3RvY29sID09IG51bGwpKQotICAgICAgICAgICAgICAgICAgICAmJiAoZGF0YSAhPSBudWxsID8gZGF0YS5lcXVhbHMoaW1EYXRhLmRhdGEpIDogKGltRGF0YS5kYXRhID09IG51bGwpKQotICAgICAgICAgICAgICAgICAgICAmJiBpc1ByaW1hcnkgPT0gaW1EYXRhLmlzUHJpbWFyeSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KAotICAgICAgICAgICAgICAgICAgICAidHlwZTogJWQsIHByb3RvY29sOiAlZCwgY3VzdG9tX3Byb3Rjb2w6ICVzLCBkYXRhOiAlcywgaXNQcmltYXJ5OiAlcyIsCi0gICAgICAgICAgICAgICAgICAgIHR5cGUsIHByb3RvY29sLCBjdXN0b21Qcm90b2NvbCwgZGF0YSwgaXNQcmltYXJ5KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUGhvdG9EYXRhIHsKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STUFUX0ZMQVNIID0gIlNXRiI7Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBpbnQgdHlwZTsKLSAgICAgICAgcHVibGljIGZpbmFsIFN0cmluZyBmb3JtYXROYW1lOyAgLy8gdXNlZCB3aGVuIHR5cGUgaXMgbm90IGRlZmluZWQgaW4gQ29udGFjdHNDb250cmFjdC4KLSAgICAgICAgcHVibGljIGZpbmFsIGJ5dGVbXSBwaG90b0J5dGVzOwotICAgICAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBpc1ByaW1hcnk7Ci0KLSAgICAgICAgcHVibGljIFBob3RvRGF0YShpbnQgdHlwZSwgU3RyaW5nIGZvcm1hdE5hbWUsIGJ5dGVbXSBwaG90b0J5dGVzLCBib29sZWFuIGlzUHJpbWFyeSkgewotICAgICAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKLSAgICAgICAgICAgIHRoaXMuZm9ybWF0TmFtZSA9IGZvcm1hdE5hbWU7Ci0gICAgICAgICAgICB0aGlzLnBob3RvQnl0ZXMgPSBwaG90b0J5dGVzOwotICAgICAgICAgICAgdGhpcy5pc1ByaW1hcnkgPSBpc1ByaW1hcnk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLSAgICAgICAgICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIFBob3RvRGF0YSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBQaG90b0RhdGEgcGhvdG9EYXRhID0gKFBob3RvRGF0YSlvYmo7Ci0gICAgICAgICAgICByZXR1cm4gKHR5cGUgPT0gcGhvdG9EYXRhLnR5cGUgJiYKLSAgICAgICAgICAgICAgICAgICAgKGZvcm1hdE5hbWUgPT0gbnVsbCA/IChwaG90b0RhdGEuZm9ybWF0TmFtZSA9PSBudWxsKSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0TmFtZS5lcXVhbHMocGhvdG9EYXRhLmZvcm1hdE5hbWUpKSAmJgotICAgICAgICAgICAgICAgICAgICAoQXJyYXlzLmVxdWFscyhwaG90b0J5dGVzLCBwaG90b0RhdGEucGhvdG9CeXRlcykpICYmCi0gICAgICAgICAgICAgICAgICAgIChpc1ByaW1hcnkgPT0gcGhvdG9EYXRhLmlzUHJpbWFyeSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgidHlwZTogJWQsIGZvcm1hdDogJXM6IHNpemU6ICVkLCBpc1ByaW1hcnk6ICVzIiwKLSAgICAgICAgICAgICAgICAgICAgdHlwZSwgZm9ybWF0TmFtZSwgcGhvdG9CeXRlcy5sZW5ndGgsIGlzUHJpbWFyeSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBjbGFzcyBQcm9wZXJ0eSB7Ci0gICAgICAgIHByaXZhdGUgU3RyaW5nIG1Qcm9wZXJ0eU5hbWU7Ci0gICAgICAgIHByaXZhdGUgTWFwPFN0cmluZywgQ29sbGVjdGlvbjxTdHJpbmc+PiBtUGFyYW1ldGVyTWFwID0KLSAgICAgICAgICAgIG5ldyBIYXNoTWFwPFN0cmluZywgQ29sbGVjdGlvbjxTdHJpbmc+PigpOwotICAgICAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBtUHJvcGVydHlWYWx1ZUxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgcHJpdmF0ZSBieXRlW10gbVByb3BlcnR5Qnl0ZXM7Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHlOYW1lKGZpbmFsIFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLSAgICAgICAgICAgIG1Qcm9wZXJ0eU5hbWUgPSBwcm9wZXJ0eU5hbWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBhZGRQYXJhbWV0ZXIoZmluYWwgU3RyaW5nIHBhcmFtTmFtZSwgZmluYWwgU3RyaW5nIHBhcmFtVmFsdWUpIHsKLSAgICAgICAgICAgIENvbGxlY3Rpb248U3RyaW5nPiB2YWx1ZXM7Ci0gICAgICAgICAgICBpZiAoIW1QYXJhbWV0ZXJNYXAuY29udGFpbnNLZXkocGFyYW1OYW1lKSkgewotICAgICAgICAgICAgICAgIGlmIChwYXJhbU5hbWUuZXF1YWxzKCJUWVBFIikpIHsKLSAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtUGFyYW1ldGVyTWFwLnB1dChwYXJhbU5hbWUsIHZhbHVlcyk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHZhbHVlcyA9IG1QYXJhbWV0ZXJNYXAuZ2V0KHBhcmFtTmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB2YWx1ZXMuYWRkKHBhcmFtVmFsdWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgYWRkVG9Qcm9wZXJ0eVZhbHVlTGlzdChmaW5hbCBTdHJpbmcgcHJvcGVydHlWYWx1ZSkgewotICAgICAgICAgICAgbVByb3BlcnR5VmFsdWVMaXN0LmFkZChwcm9wZXJ0eVZhbHVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5Qnl0ZXMoZmluYWwgYnl0ZVtdIHByb3BlcnR5Qnl0ZXMpIHsKLSAgICAgICAgICAgIG1Qcm9wZXJ0eUJ5dGVzID0gcHJvcGVydHlCeXRlczsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBmaW5hbCBDb2xsZWN0aW9uPFN0cmluZz4gZ2V0UGFyYW1ldGVycyhTdHJpbmcgdHlwZSkgewotICAgICAgICAgICAgcmV0dXJuIG1QYXJhbWV0ZXJNYXAuZ2V0KHR5cGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGZpbmFsIExpc3Q8U3RyaW5nPiBnZXRQcm9wZXJ0eVZhbHVlTGlzdCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtUHJvcGVydHlWYWx1ZUxpc3Q7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKLSAgICAgICAgICAgIG1Qcm9wZXJ0eU5hbWUgPSBudWxsOwotICAgICAgICAgICAgbVBhcmFtZXRlck1hcC5jbGVhcigpOwotICAgICAgICAgICAgbVByb3BlcnR5VmFsdWVMaXN0LmNsZWFyKCk7Ci0gICAgICAgICAgICBtUHJvcGVydHlCeXRlcyA9IG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBtRmFtaWx5TmFtZTsKLSAgICBwcml2YXRlIFN0cmluZyBtR2l2ZW5OYW1lOwotICAgIHByaXZhdGUgU3RyaW5nIG1NaWRkbGVOYW1lOwotICAgIHByaXZhdGUgU3RyaW5nIG1QcmVmaXg7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbVN1ZmZpeDsKLQotICAgIC8vIFVzZWQgb25seSB3aGVuIG5vIGZhbWlseSBub3IgZ2l2ZW4gbmFtZSBpcyBmb3VuZC4KLSAgICBwcml2YXRlIFN0cmluZyBtRnVsbE5hbWU7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBtUGhvbmV0aWNGYW1pbHlOYW1lOwotICAgIHByaXZhdGUgU3RyaW5nIG1QaG9uZXRpY0dpdmVuTmFtZTsKLSAgICBwcml2YXRlIFN0cmluZyBtUGhvbmV0aWNNaWRkbGVOYW1lOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgbVBob25ldGljRnVsbE5hbWU7Ci0KLSAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBtTmlja05hbWVMaXN0OwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgbURpc3BsYXlOYW1lOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgbUJpcnRoZGF5OwotCi0gICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gbU5vdGVMaXN0OwotICAgIHByaXZhdGUgTGlzdDxQaG9uZURhdGE+IG1QaG9uZUxpc3Q7Ci0gICAgcHJpdmF0ZSBMaXN0PEVtYWlsRGF0YT4gbUVtYWlsTGlzdDsKLSAgICBwcml2YXRlIExpc3Q8UG9zdGFsRGF0YT4gbVBvc3RhbExpc3Q7Ci0gICAgcHJpdmF0ZSBMaXN0PE9yZ2FuaXphdGlvbkRhdGE+IG1Pcmdhbml6YXRpb25MaXN0OwotICAgIHByaXZhdGUgTGlzdDxJbURhdGE+IG1JbUxpc3Q7Ci0gICAgcHJpdmF0ZSBMaXN0PFBob3RvRGF0YT4gbVBob3RvTGlzdDsKLSAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBtV2Vic2l0ZUxpc3Q7Ci0gICAgcHJpdmF0ZSBMaXN0PExpc3Q8U3RyaW5nPj4gbUFuZHJvaWRDdXN0b21Qcm9wZXJ0eUxpc3Q7Ci0KLSAgICBwcml2YXRlIGZpbmFsIGludCBtVkNhcmRUeXBlOwotICAgIHByaXZhdGUgZmluYWwgQWNjb3VudCBtQWNjb3VudDsKLQotICAgIHB1YmxpYyBWQ2FyZEVudHJ5KCkgewotICAgICAgICB0aGlzKFZDYXJkQ29uZmlnLlZDQVJEX1RZUEVfVjIxX0dFTkVSSUNfVVRGOCk7Ci0gICAgfQotCi0gICAgcHVibGljIFZDYXJkRW50cnkoaW50IHZjYXJkVHlwZSkgewotICAgICAgICB0aGlzKHZjYXJkVHlwZSwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIFZDYXJkRW50cnkoaW50IHZjYXJkVHlwZSwgQWNjb3VudCBhY2NvdW50KSB7Ci0gICAgICAgIG1WQ2FyZFR5cGUgPSB2Y2FyZFR5cGU7Ci0gICAgICAgIG1BY2NvdW50ID0gYWNjb3VudDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYWRkUGhvbmUoaW50IHR5cGUsIFN0cmluZyBkYXRhLCBTdHJpbmcgbGFiZWwsIGJvb2xlYW4gaXNQcmltYXJ5KSB7Ci0gICAgICAgIGlmIChtUGhvbmVMaXN0ID09IG51bGwpIHsKLSAgICAgICAgICAgIG1QaG9uZUxpc3QgPSBuZXcgQXJyYXlMaXN0PFBob25lRGF0YT4oKTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICBmaW5hbCBTdHJpbmcgdHJpbWVkID0gZGF0YS50cmltKCk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBmb3JtYXR0ZWROdW1iZXI7Ci0gICAgICAgIGlmICh0eXBlID09IFBob25lLlRZUEVfUEFHRVIgfHwgVkNhcmRDb25maWcucmVmcmFpblBob25lTnVtYmVyRm9ybWF0dGluZyhtVkNhcmRUeXBlKSkgewotICAgICAgICAgICAgZm9ybWF0dGVkTnVtYmVyID0gdHJpbWVkOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZmluYWwgaW50IGxlbmd0aCA9IHRyaW1lZC5sZW5ndGgoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBjaGFyIGNoID0gdHJpbWVkLmNoYXJBdChpKTsKLSAgICAgICAgICAgICAgICBpZiAoKCcwJyA8PSBjaCAmJiBjaCA8PSAnOScpIHx8IChpID09IDAgJiYgY2ggPT0gJysnKSkgewotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChjaCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBVc2UgTkFOUCBpbiBkZWZhdWx0IHdoZW4gdGhlcmUncyBubyBpbmZvcm1hdGlvbiBhYm91dCBsb2NhbGUuCi0gICAgICAgICAgICBmaW5hbCBpbnQgZm9ybWF0dGluZ1R5cGUgPSBWQ2FyZFV0aWxzLmdldFBob25lTnVtYmVyRm9ybWF0KG1WQ2FyZFR5cGUpOwotICAgICAgICAgICAgZm9ybWF0dGVkTnVtYmVyID0gUGhvbmVOdW1iZXJVdGlscy5mb3JtYXROdW1iZXIoYnVpbGRlci50b1N0cmluZygpLCBmb3JtYXR0aW5nVHlwZSk7Ci0gICAgICAgIH0KLSAgICAgICAgUGhvbmVEYXRhIHBob25lRGF0YSA9IG5ldyBQaG9uZURhdGEodHlwZSwgZm9ybWF0dGVkTnVtYmVyLCBsYWJlbCwgaXNQcmltYXJ5KTsKLSAgICAgICAgbVBob25lTGlzdC5hZGQocGhvbmVEYXRhKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYWRkTmlja05hbWUoZmluYWwgU3RyaW5nIG5pY2tOYW1lKSB7Ci0gICAgICAgIGlmIChtTmlja05hbWVMaXN0ID09IG51bGwpIHsKLSAgICAgICAgICAgIG1OaWNrTmFtZUxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgfQotICAgICAgICBtTmlja05hbWVMaXN0LmFkZChuaWNrTmFtZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFkZEVtYWlsKGludCB0eXBlLCBTdHJpbmcgZGF0YSwgU3RyaW5nIGxhYmVsLCBib29sZWFuIGlzUHJpbWFyeSl7Ci0gICAgICAgIGlmIChtRW1haWxMaXN0ID09IG51bGwpIHsKLSAgICAgICAgICAgIG1FbWFpbExpc3QgPSBuZXcgQXJyYXlMaXN0PEVtYWlsRGF0YT4oKTsKLSAgICAgICAgfQotICAgICAgICBtRW1haWxMaXN0LmFkZChuZXcgRW1haWxEYXRhKHR5cGUsIGRhdGEsIGxhYmVsLCBpc1ByaW1hcnkpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYWRkUG9zdGFsKGludCB0eXBlLCBMaXN0PFN0cmluZz4gcHJvcFZhbHVlTGlzdCwgU3RyaW5nIGxhYmVsLCBib29sZWFuIGlzUHJpbWFyeSl7Ci0gICAgICAgIGlmIChtUG9zdGFsTGlzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtUG9zdGFsTGlzdCA9IG5ldyBBcnJheUxpc3Q8UG9zdGFsRGF0YT4oMCk7Ci0gICAgICAgIH0KLSAgICAgICAgbVBvc3RhbExpc3QuYWRkKG5ldyBQb3N0YWxEYXRhKHR5cGUsIHByb3BWYWx1ZUxpc3QsIGxhYmVsLCBpc1ByaW1hcnkpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTaG91bGQgYmUgY2FsbGVkIHZpYSB7QGxpbmsgI2hhbmRsZU9yZ1ZhbHVlKGludCwgTGlzdCwgYm9vbGVhbil9IG9yCi0gICAgICoge0BsaW5rICNoYW5kbGVUaXRsZVZhbHVlKFN0cmluZyl9LgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBhZGROZXdPcmdhbml6YXRpb24oaW50IHR5cGUsIGZpbmFsIFN0cmluZyBjb21wYW55TmFtZSwKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBkZXBhcnRtZW50TmFtZSwKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyB0aXRsZU5hbWUsIGJvb2xlYW4gaXNQcmltYXJ5KSB7Ci0gICAgICAgIGlmIChtT3JnYW5pemF0aW9uTGlzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtT3JnYW5pemF0aW9uTGlzdCA9IG5ldyBBcnJheUxpc3Q8T3JnYW5pemF0aW9uRGF0YT4oKTsKLSAgICAgICAgfQotICAgICAgICBtT3JnYW5pemF0aW9uTGlzdC5hZGQobmV3IE9yZ2FuaXphdGlvbkRhdGEodHlwZSwgY29tcGFueU5hbWUsCi0gICAgICAgICAgICAgICAgZGVwYXJ0bWVudE5hbWUsIHRpdGxlTmFtZSwgaXNQcmltYXJ5KSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTGlzdDxTdHJpbmc+IHNFbXB0eUxpc3QgPQotICAgICAgICAgICAgQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChuZXcgQXJyYXlMaXN0PFN0cmluZz4oMCkpOwotCi0gICAgLyoqCi0gICAgICogU2V0ICJPUkciIHJlbGF0ZWQgdmFsdWVzIHRvIHRoZSBhcHByb3ByaWF0ZSBkYXRhLiBJZiB0aGVyZSdzIG1vcmUgdGhhbiBvbmUKLSAgICAgKiB7QGxpbmsgT3JnYW5pemF0aW9uRGF0YX0gb2JqZWN0cywgdGhpcyBpbnB1dCBkYXRhIGFyZSBhdHRhY2hlZCB0byB0aGUgbGFzdCBvbmUgd2hpY2gKLSAgICAgKiBkb2VzIG5vdCBoYXZlIHZhbGlkIHZhbHVlcyAobm90IGluY2x1ZGluZyBlbXB0eSBidXQgb25seSBudWxsKS4gSWYgdGhlcmUncyBubwotICAgICAqIHtAbGluayBPcmdhbml6YXRpb25EYXRhfSBvYmplY3QsIGEgbmV3IHtAbGluayBPcmdhbml6YXRpb25EYXRhfSBpcyBjcmVhdGVkLAotICAgICAqIHdob3NlIHRpdGxlIGlzIHNldCB0byBudWxsLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBoYW5kbGVPcmdWYWx1ZShmaW5hbCBpbnQgdHlwZSwgTGlzdDxTdHJpbmc+IG9yZ0xpc3QsIGJvb2xlYW4gaXNQcmltYXJ5KSB7Ci0gICAgICAgIGlmIChvcmdMaXN0ID09IG51bGwpIHsKLSAgICAgICAgICAgIG9yZ0xpc3QgPSBzRW1wdHlMaXN0OwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIFN0cmluZyBjb21wYW55TmFtZTsKLSAgICAgICAgZmluYWwgU3RyaW5nIGRlcGFydG1lbnROYW1lOwotICAgICAgICBmaW5hbCBpbnQgc2l6ZSA9IG9yZ0xpc3Quc2l6ZSgpOwotICAgICAgICBzd2l0Y2ggKHNpemUpIHsKLSAgICAgICAgICAgIGNhc2UgMDogewotICAgICAgICAgICAgICAgIGNvbXBhbnlOYW1lID0gIiI7Ci0gICAgICAgICAgICAgICAgZGVwYXJ0bWVudE5hbWUgPSBudWxsOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSAxOiB7Ci0gICAgICAgICAgICAgICAgY29tcGFueU5hbWUgPSBvcmdMaXN0LmdldCgwKTsKLSAgICAgICAgICAgICAgICBkZXBhcnRtZW50TmFtZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkZWZhdWx0OiB7ICAvLyBNb3JlIHRoYW4gMS4KLSAgICAgICAgICAgICAgICBjb21wYW55TmFtZSA9IG9yZ0xpc3QuZ2V0KDApOwotICAgICAgICAgICAgICAgIC8vIFdlJ3JlIG5vdCBzdXJlIHdoaWNoIGlzIHRoZSBjb3JyZWN0IHN0cmluZyBmb3IgZGVwYXJ0bWVudC4KLSAgICAgICAgICAgICAgICAvLyBJbiBvcmRlciB0byBrZWVwIGFsbCB0aGUgZGF0YSwgY29uY2F0aW5hdGUgdGhlIHJlc3Qgb2YgZWxlbWVudHMuCi0gICAgICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IHNpemU7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBpZiAoaSA+IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCcgJyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQob3JnTGlzdC5nZXQoaSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBkZXBhcnRtZW50TmFtZSA9IGJ1aWxkZXIudG9TdHJpbmcoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAobU9yZ2FuaXphdGlvbkxpc3QgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gQ3JlYXRlIG5ldyBmaXJzdCBvcmdhbml6YXRpb24gZW50cnksIHdpdGggIm51bGwiIHRpdGxlIHdoaWNoIG1heSBiZQotICAgICAgICAgICAgLy8gYWRkZWQgdmlhIGhhbmRsZVRpdGxlVmFsdWUoKS4KLSAgICAgICAgICAgIGFkZE5ld09yZ2FuaXphdGlvbih0eXBlLCBjb21wYW55TmFtZSwgZGVwYXJ0bWVudE5hbWUsIG51bGwsIGlzUHJpbWFyeSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChPcmdhbml6YXRpb25EYXRhIG9yZ2FuaXphdGlvbkRhdGEgOiBtT3JnYW5pemF0aW9uTGlzdCkgewotICAgICAgICAgICAgLy8gTm90IHVzZSBUZXh0VXRpbHMuaXNFbXB0eSgpIHNpbmNlIE9SRyB3YXMgc2V0IGJ1dCB0aGUgZWxlbWVudHMgbWlnaHQgYmUgZW1wdHkuCi0gICAgICAgICAgICAvLyBlLmcuICJPUkc7UFJFRjo7IiAtPiBCb3RoIGNvbXBhbnlOYW1lIGFuZCBkZXBhcnRtZW50TmFtZSBiZWNvbWUgZW1wdHkgYnV0IG5vdCBudWxsLgotICAgICAgICAgICAgaWYgKG9yZ2FuaXphdGlvbkRhdGEuY29tcGFueU5hbWUgPT0gbnVsbCAmJgotICAgICAgICAgICAgICAgICAgICBvcmdhbml6YXRpb25EYXRhLmRlcGFydG1lbnROYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyBQcm9iYWJseSB0aGUgIlRJVExFIiBwcm9wZXJ0eSBjb21lcyBiZWZvcmUgdGhlICJPUkciIHByb3BlcnR5IHZpYQotICAgICAgICAgICAgICAgIC8vIGhhbmRsZVRpdGxlTGluZSgpLgotICAgICAgICAgICAgICAgIG9yZ2FuaXphdGlvbkRhdGEuY29tcGFueU5hbWUgPSBjb21wYW55TmFtZTsKLSAgICAgICAgICAgICAgICBvcmdhbml6YXRpb25EYXRhLmRlcGFydG1lbnROYW1lID0gZGVwYXJ0bWVudE5hbWU7Ci0gICAgICAgICAgICAgICAgb3JnYW5pemF0aW9uRGF0YS5pc1ByaW1hcnkgPSBpc1ByaW1hcnk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vIE5vIE9yZ2FuaXphdGlvRGF0YSBpcyBhdmFpbGFibGUuIENyZWF0ZSBhbm90aGVyIG9uZSwgd2l0aCAibnVsbCIgdGl0bGUsIHdoaWNoIG1heSBiZQotICAgICAgICAvLyBhZGRlZCB2aWEgaGFuZGxlVGl0bGVWYWx1ZSgpLgotICAgICAgICBhZGROZXdPcmdhbml6YXRpb24odHlwZSwgY29tcGFueU5hbWUsIGRlcGFydG1lbnROYW1lLCBudWxsLCBpc1ByaW1hcnkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCAidGl0bGUiIHZhbHVlIHRvIHRoZSBhcHByb3ByaWF0ZSBkYXRhLiBJZiB0aGVyZSdzIG1vcmUgdGhhbiBvbmUKLSAgICAgKiBPcmdhbml6YXRpb25EYXRhIG9iamVjdHMsIHRoaXMgaW5wdXQgaXMgYXR0YWNoZWQgdG8gdGhlIGxhc3Qgb25lIHdoaWNoIGRvZXMgbm90Ci0gICAgICogaGF2ZSB2YWxpZCB0aXRsZSB2YWx1ZSAobm90IGluY2x1ZGluZyBlbXB0eSBidXQgb25seSBudWxsKS4gSWYgdGhlcmUncyBubwotICAgICAqIE9yZ2FuaXphdGlvbkRhdGEgb2JqZWN0LCBhIG5ldyBPcmdhbml6YXRpb25EYXRhIGlzIGNyZWF0ZWQsIHdob3NlIGNvbXBhbnkgbmFtZSBpcwotICAgICAqIHNldCB0byBudWxsLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBoYW5kbGVUaXRsZVZhbHVlKGZpbmFsIFN0cmluZyB0aXRsZSkgewotICAgICAgICBpZiAobU9yZ2FuaXphdGlvbkxpc3QgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gQ3JlYXRlIG5ldyBmaXJzdCBvcmdhbml6YXRpb24gZW50cnksIHdpdGggIm51bGwiIG90aGVyIGluZm8sIHdoaWNoIG1heSBiZQotICAgICAgICAgICAgLy8gYWRkZWQgdmlhIGhhbmRsZU9yZ1ZhbHVlKCkuCi0gICAgICAgICAgICBhZGROZXdPcmdhbml6YXRpb24oREVGQVVMVF9PUkdBTklaQVRJT05fVFlQRSwgbnVsbCwgbnVsbCwgdGl0bGUsIGZhbHNlKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBmb3IgKE9yZ2FuaXphdGlvbkRhdGEgb3JnYW5pemF0aW9uRGF0YSA6IG1Pcmdhbml6YXRpb25MaXN0KSB7Ci0gICAgICAgICAgICBpZiAob3JnYW5pemF0aW9uRGF0YS50aXRsZU5hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG9yZ2FuaXphdGlvbkRhdGEudGl0bGVOYW1lID0gdGl0bGU7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vIE5vIE9yZ2FuaXphdGlvbiBpcyBhdmFpbGFibGUuIENyZWF0ZSBhbm90aGVyIG9uZSwgd2l0aCAibnVsbCIgb3RoZXIgaW5mbywgd2hpY2ggbWF5IGJlCi0gICAgICAgIC8vIGFkZGVkIHZpYSBoYW5kbGVPcmdWYWx1ZSgpLgotICAgICAgICBhZGROZXdPcmdhbml6YXRpb24oREVGQVVMVF9PUkdBTklaQVRJT05fVFlQRSwgbnVsbCwgbnVsbCwgdGl0bGUsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYWRkSW0oaW50IHByb3RvY29sLCBTdHJpbmcgY3VzdG9tUHJvdG9jb2wsIGludCB0eXBlLAotICAgICAgICAgICAgU3RyaW5nIHByb3BWYWx1ZSwgYm9vbGVhbiBpc1ByaW1hcnkpIHsKLSAgICAgICAgaWYgKG1JbUxpc3QgPT0gbnVsbCkgewotICAgICAgICAgICAgbUltTGlzdCA9IG5ldyBBcnJheUxpc3Q8SW1EYXRhPigpOwotICAgICAgICB9Ci0gICAgICAgIG1JbUxpc3QuYWRkKG5ldyBJbURhdGEocHJvdG9jb2wsIGN1c3RvbVByb3RvY29sLCB0eXBlLCBwcm9wVmFsdWUsIGlzUHJpbWFyeSkpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhZGROb3RlKGZpbmFsIFN0cmluZyBub3RlKSB7Ci0gICAgICAgIGlmIChtTm90ZUxpc3QgPT0gbnVsbCkgewotICAgICAgICAgICAgbU5vdGVMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KDEpOwotICAgICAgICB9Ci0gICAgICAgIG1Ob3RlTGlzdC5hZGQobm90ZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFkZFBob3RvQnl0ZXMoU3RyaW5nIGZvcm1hdE5hbWUsIGJ5dGVbXSBwaG90b0J5dGVzLCBib29sZWFuIGlzUHJpbWFyeSkgewotICAgICAgICBpZiAobVBob3RvTGlzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtUGhvdG9MaXN0ID0gbmV3IEFycmF5TGlzdDxQaG90b0RhdGE+KDEpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIFBob3RvRGF0YSBwaG90b0RhdGEgPSBuZXcgUGhvdG9EYXRhKDAsIG51bGwsIHBob3RvQnl0ZXMsIGlzUHJpbWFyeSk7Ci0gICAgICAgIG1QaG90b0xpc3QuYWRkKHBob3RvRGF0YSk7Ci0gICAgfQotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoImZhbGx0aHJvdWdoIikKLSAgICBwcml2YXRlIHZvaWQgaGFuZGxlTlByb3BlcnR5KExpc3Q8U3RyaW5nPiBlbGVtcykgewotICAgICAgICAvLyBGYW1pbHksIEdpdmVuLCBNaWRkbGUsIFByZWZpeCwgU3VmZml4LiAoMSAtIDUpCi0gICAgICAgIGludCBzaXplOwotICAgICAgICBpZiAoZWxlbXMgPT0gbnVsbCB8fCAoc2l6ZSA9IGVsZW1zLnNpemUoKSkgPCAxKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHNpemUgPiA1KSB7Ci0gICAgICAgICAgICBzaXplID0gNTsKLSAgICAgICAgfQotCi0gICAgICAgIHN3aXRjaCAoc2l6ZSkgewotICAgICAgICAgICAgLy8gZmFsbHRocm91Z2gKLSAgICAgICAgICAgIGNhc2UgNTogbVN1ZmZpeCA9IGVsZW1zLmdldCg0KTsKLSAgICAgICAgICAgIGNhc2UgNDogbVByZWZpeCA9IGVsZW1zLmdldCgzKTsKLSAgICAgICAgICAgIGNhc2UgMzogbU1pZGRsZU5hbWUgPSBlbGVtcy5nZXQoMik7Ci0gICAgICAgICAgICBjYXNlIDI6IG1HaXZlbk5hbWUgPSBlbGVtcy5nZXQoMSk7Ci0gICAgICAgICAgICBkZWZhdWx0OiBtRmFtaWx5TmFtZSA9IGVsZW1zLmdldCgwKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIE5vdGU6IFNvbWUgSmFwYW5lc2UgbW9iaWxlIHBob25lcyB1c2UgdGhpcyBmaWVsZCBmb3IgcGhvbmV0aWMgbmFtZSwKLSAgICAgKiAgICAgICBzaW5jZSB2Q2FyZCAyLjEgZG9lcyBub3QgaGF2ZSAiU09SVC1TVFJJTkciIHR5cGUuCi0gICAgICogICAgICAgQWxzbywgaW4gc29tZSBjYXNlcywgdGhlIGZpZWxkIGhhcyBzb21lICc7J3MgaW4gaXQuCi0gICAgICogICAgICAgQXNzdW1lIHRoZSAnOycgbWVhbnMgdGhlIHNhbWUgbWVhbmluZyBpbiBOIHByb3BlcnR5Ci0gICAgICovCi0gICAgQFN1cHByZXNzV2FybmluZ3MoImZhbGx0aHJvdWdoIikKLSAgICBwcml2YXRlIHZvaWQgaGFuZGxlUGhvbmV0aWNOYW1lRnJvbVNvdW5kKExpc3Q8U3RyaW5nPiBlbGVtcykgewotICAgICAgICBpZiAoIShUZXh0VXRpbHMuaXNFbXB0eShtUGhvbmV0aWNGYW1pbHlOYW1lKSAmJgotICAgICAgICAgICAgICAgIFRleHRVdGlscy5pc0VtcHR5KG1QaG9uZXRpY01pZGRsZU5hbWUpICYmCi0gICAgICAgICAgICAgICAgVGV4dFV0aWxzLmlzRW1wdHkobVBob25ldGljR2l2ZW5OYW1lKSkpIHsKLSAgICAgICAgICAgIC8vIFRoaXMgbWVhbnMgdGhlIG90aGVyIHByb3BlcnRpZXMgbGlrZSAiWC1QSE9ORVRJQy1GSVJTVC1OQU1FIiB3YXMgYWxyZWFkeSBmb3VuZC4KLSAgICAgICAgICAgIC8vIElnbm9yZSAiU09VTkQ7WC1JUk1DLU4iLgotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IHNpemU7Ci0gICAgICAgIGlmIChlbGVtcyA9PSBudWxsIHx8IChzaXplID0gZWxlbXMuc2l6ZSgpKSA8IDEpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEFzc3VtZSB0aGF0IHRoZSBvcmRlciBpcyAiRmFtaWx5LCBHaXZlbiwgTWlkZGxlIi4KLSAgICAgICAgLy8gVGhpcyBpcyBub3QgZnJvbSBzcGVjaWZpY2F0aW9uIGJ1dCBtZXJlIGFzc3VtcHRpb24uIFNvbWUgSmFwYW5lc2UgcGhvbmVzIHVzZSB0aGlzIG9yZGVyLgotICAgICAgICBpZiAoc2l6ZSA+IDMpIHsKLSAgICAgICAgICAgIHNpemUgPSAzOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGVsZW1zLmdldCgwKS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgIGJvb2xlYW4gb25seUZpcnN0RWxlbUlzTm9uRW1wdHkgPSB0cnVlOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAoZWxlbXMuZ2V0KGkpLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBvbmx5Rmlyc3RFbGVtSXNOb25FbXB0eSA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAob25seUZpcnN0RWxlbUlzTm9uRW1wdHkpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmdbXSBuYW1lc0FycmF5ID0gZWxlbXMuZ2V0KDApLnNwbGl0KCIgIik7Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IG5hbWVBcnJheUxlbmd0aCA9IG5hbWVzQXJyYXkubGVuZ3RoOwotICAgICAgICAgICAgICAgIGlmIChuYW1lQXJyYXlMZW5ndGggPT0gMykgewotICAgICAgICAgICAgICAgICAgICAvLyBBc3N1bWUgdGhlIHN0cmluZyBpcyAiRmFtaWx5IE1pZGRsZSBHaXZlbiIuCi0gICAgICAgICAgICAgICAgICAgIG1QaG9uZXRpY0ZhbWlseU5hbWUgPSBuYW1lc0FycmF5WzBdOwotICAgICAgICAgICAgICAgICAgICBtUGhvbmV0aWNNaWRkbGVOYW1lID0gbmFtZXNBcnJheVsxXTsKLSAgICAgICAgICAgICAgICAgICAgbVBob25ldGljR2l2ZW5OYW1lID0gbmFtZXNBcnJheVsyXTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG5hbWVBcnJheUxlbmd0aCA9PSAyKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEFzc3VtZSB0aGUgc3RyaW5nIGlzICJGYW1pbHkgR2l2ZW4iIGJhc2VkIG9uIHRoZSBKYXBhbmVzZSBtb2JpbGUKLSAgICAgICAgICAgICAgICAgICAgLy8gcGhvbmVzJyBwcmVmZXJlbmNlLgotICAgICAgICAgICAgICAgICAgICBtUGhvbmV0aWNGYW1pbHlOYW1lID0gbmFtZXNBcnJheVswXTsKLSAgICAgICAgICAgICAgICAgICAgbVBob25ldGljR2l2ZW5OYW1lID0gbmFtZXNBcnJheVsxXTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBtUGhvbmV0aWNGdWxsTmFtZSA9IGVsZW1zLmdldCgwKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgc3dpdGNoIChzaXplKSB7Ci0gICAgICAgICAgICAvLyBmYWxsdGhyb3VnaAotICAgICAgICAgICAgY2FzZSAzOiBtUGhvbmV0aWNNaWRkbGVOYW1lID0gZWxlbXMuZ2V0KDIpOwotICAgICAgICAgICAgY2FzZSAyOiBtUGhvbmV0aWNHaXZlbk5hbWUgPSBlbGVtcy5nZXQoMSk7Ci0gICAgICAgICAgICBkZWZhdWx0OiBtUGhvbmV0aWNGYW1pbHlOYW1lID0gZWxlbXMuZ2V0KDApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkUHJvcGVydHkoZmluYWwgUHJvcGVydHkgcHJvcGVydHkpIHsKLSAgICAgICAgZmluYWwgU3RyaW5nIHByb3BOYW1lID0gcHJvcGVydHkubVByb3BlcnR5TmFtZTsKLSAgICAgICAgZmluYWwgTWFwPFN0cmluZywgQ29sbGVjdGlvbjxTdHJpbmc+PiBwYXJhbU1hcCA9IHByb3BlcnR5Lm1QYXJhbWV0ZXJNYXA7Ci0gICAgICAgIGZpbmFsIExpc3Q8U3RyaW5nPiBwcm9wVmFsdWVMaXN0ID0gcHJvcGVydHkubVByb3BlcnR5VmFsdWVMaXN0OwotICAgICAgICBieXRlW10gcHJvcEJ5dGVzID0gcHJvcGVydHkubVByb3BlcnR5Qnl0ZXM7Ci0KLSAgICAgICAgaWYgKHByb3BWYWx1ZUxpc3Quc2l6ZSgpID09IDApIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBTdHJpbmcgcHJvcFZhbHVlID0gbGlzdFRvU3RyaW5nKHByb3BWYWx1ZUxpc3QpLnRyaW0oKTsKLQotICAgICAgICBpZiAocHJvcE5hbWUuZXF1YWxzKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1ZFUlNJT04pKSB7Ci0gICAgICAgICAgICAvLyB2Q2FyZCB2ZXJzaW9uLiBJZ25vcmUgdGhpcy4KLSAgICAgICAgfSBlbHNlIGlmIChwcm9wTmFtZS5lcXVhbHMoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfRk4pKSB7Ci0gICAgICAgICAgICBtRnVsbE5hbWUgPSBwcm9wVmFsdWU7Ci0gICAgICAgIH0gZWxzZSBpZiAocHJvcE5hbWUuZXF1YWxzKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX05BTUUpICYmIG1GdWxsTmFtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBPbmx5IGluIHZDYXJkIDMuMC4gVXNlIHRoaXMgaWYgRk4sIHdoaWNoIG11c3QgZXhpc3QgaW4gdkNhcmQgMy4wIGJ1dCBtYXkgbm90Ci0gICAgICAgICAgICAvLyBhY3R1YWxseSBleGlzdCBpbiB0aGUgcmVhbCB2Q2FyZCBkYXRhLCBkb2VzIG5vdCBleGlzdC4KLSAgICAgICAgICAgIG1GdWxsTmFtZSA9IHByb3BWYWx1ZTsKLSAgICAgICAgfSBlbHNlIGlmIChwcm9wTmFtZS5lcXVhbHMoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfTikpIHsKLSAgICAgICAgICAgIGhhbmRsZU5Qcm9wZXJ0eShwcm9wVmFsdWVMaXN0KTsKLSAgICAgICAgfSBlbHNlIGlmIChwcm9wTmFtZS5lcXVhbHMoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfU09SVF9TVFJJTkcpKSB7Ci0gICAgICAgICAgICBtUGhvbmV0aWNGdWxsTmFtZSA9IHByb3BWYWx1ZTsKLSAgICAgICAgfSBlbHNlIGlmIChwcm9wTmFtZS5lcXVhbHMoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfTklDS05BTUUpIHx8Ci0gICAgICAgICAgICAgICAgcHJvcE5hbWUuZXF1YWxzKFZDYXJkQ29uc3RhbnRzLkltcG9ydE9ubHkuUFJPUEVSVFlfWF9OSUNLTkFNRSkpIHsKLSAgICAgICAgICAgIGFkZE5pY2tOYW1lKHByb3BWYWx1ZSk7Ci0gICAgICAgIH0gZWxzZSBpZiAocHJvcE5hbWUuZXF1YWxzKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1NPVU5EKSkgewotICAgICAgICAgICAgQ29sbGVjdGlvbjxTdHJpbmc+IHR5cGVDb2xsZWN0aW9uID0gcGFyYW1NYXAuZ2V0KFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEUpOwotICAgICAgICAgICAgaWYgKHR5cGVDb2xsZWN0aW9uICE9IG51bGwKLSAgICAgICAgICAgICAgICAgICAgJiYgdHlwZUNvbGxlY3Rpb24uY29udGFpbnMoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9YX0lSTUNfTikpIHsKLSAgICAgICAgICAgICAgICAvLyBBcyBvZiAyMDA5LTEwLTA4LCBQYXJzZXIgc2lkZSBkb2VzIG5vdCBzcGxpdCBhIHByb3BlcnR5IHZhbHVlIGludG8gc2VwYXJhdGVkCi0gICAgICAgICAgICAgICAgLy8gdmFsdWVzIHVzaW5nICc7JyAoaW4gb3RoZXIgd29yZHMsIHByb3BWYWx1ZUxpc3Quc2l6ZSgpID09IDEpLAotICAgICAgICAgICAgICAgIC8vIHdoaWNoIGlzIGNvcnJlY3QgYmVoYXZpb3IgZnJvbSB0aGUgdmlldyBvZiB2Q2FyZCAyLjEuCi0gICAgICAgICAgICAgICAgLy8gQnV0IHdlIHdhbnQgaXQgdG8gYmUgc2VwYXJhdGVkLCBzbyBkbyB0aGUgc2VwYXJhdGlvbiBoZXJlLgotICAgICAgICAgICAgICAgIGZpbmFsIExpc3Q8U3RyaW5nPiBwaG9uZXRpY05hbWVMaXN0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIFZDYXJkVXRpbHMuY29uc3RydWN0TGlzdEZyb21WYWx1ZShwcm9wVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZDYXJkQ29uZmlnLmlzVjMwKG1WQ2FyZFR5cGUpKTsKLSAgICAgICAgICAgICAgICBoYW5kbGVQaG9uZXRpY05hbWVGcm9tU291bmQocGhvbmV0aWNOYW1lTGlzdCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIElnbm9yZSB0aGlzIGZpZWxkIHNpbmNlIEFuZHJvaWQgY2Fubm90IHVuZGVyc3RhbmQgd2hhdCBpdCBpcy4KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChwcm9wTmFtZS5lcXVhbHMoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfQURSKSkgewotICAgICAgICAgICAgYm9vbGVhbiB2YWx1ZXNBcmVBbGxFbXB0eSA9IHRydWU7Ci0gICAgICAgICAgICBmb3IgKFN0cmluZyB2YWx1ZSA6IHByb3BWYWx1ZUxpc3QpIHsKLSAgICAgICAgICAgICAgICBpZiAodmFsdWUubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHZhbHVlc0FyZUFsbEVtcHR5ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICh2YWx1ZXNBcmVBbGxFbXB0eSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaW50IHR5cGUgPSAtMTsKLSAgICAgICAgICAgIFN0cmluZyBsYWJlbCA9ICIiOwotICAgICAgICAgICAgYm9vbGVhbiBpc1ByaW1hcnkgPSBmYWxzZTsKLSAgICAgICAgICAgIENvbGxlY3Rpb248U3RyaW5nPiB0eXBlQ29sbGVjdGlvbiA9IHBhcmFtTWFwLmdldChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFKTsKLSAgICAgICAgICAgIGlmICh0eXBlQ29sbGVjdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgdHlwZVN0cmluZyA6IHR5cGVDb2xsZWN0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgIHR5cGVTdHJpbmcgPSB0eXBlU3RyaW5nLnRvVXBwZXJDYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlU3RyaW5nLmVxdWFscyhWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX1BSRUYpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpc1ByaW1hcnkgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVTdHJpbmcuZXF1YWxzKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfSE9NRSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSBTdHJ1Y3R1cmVkUG9zdGFsLlRZUEVfSE9NRTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsID0gIiI7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZVN0cmluZy5lcXVhbHMoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9XT1JLKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVTdHJpbmcuZXF1YWxzSWdub3JlQ2FzZShWQ2FyZENvbnN0YW50cy5QQVJBTV9FWFRSQV9UWVBFX0NPTVBBTlkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyAiQ09NUEFOWSIgc2VlbXMgZW1pdHRlZCBieSBXaW5kb3dzIE1vYmlsZSwgd2hpY2ggaXMgbm90Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBzcGVjaWZpY2FsbHkgc3VwcG9ydGVkIGJ5IHZDYXJkIDIuMS4gV2UgYXNzdW1lIHRoaXMgaXMgc2FtZQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXMgIldPUksiLgotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9IFN0cnVjdHVyZWRQb3N0YWwuVFlQRV9XT1JLOwotICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSAiIjsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlU3RyaW5nLmVxdWFscyhWQ2FyZENvbnN0YW50cy5QQVJBTV9BRFJfVFlQRV9QQVJDRUwpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZVN0cmluZy5lcXVhbHMoVkNhcmRDb25zdGFudHMuUEFSQU1fQURSX1RZUEVfRE9NKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVTdHJpbmcuZXF1YWxzKFZDYXJkQ29uc3RhbnRzLlBBUkFNX0FEUl9UWVBFX0lOVEwpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBkbyBub3QgaGF2ZSBhbnkgYXBwcm9wcmlhdGUgd2F5IHRvIHN0b3JlIHRoaXMgaW5mb3JtYXRpb24uCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZVN0cmluZy5zdGFydHNXaXRoKCJYLSIpICYmIHR5cGUgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZVN0cmluZyA9IHR5cGVTdHJpbmcuc3Vic3RyaW5nKDIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gdkNhcmQgMy4wIGFsbG93cyBpYW5hLXRva2VuLiBBbHNvIHNvbWUgdkNhcmQgMi4xIGV4cG9ydGVycwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gZW1pdCBub24tc3RhbmRhcmQgdHlwZXMuIFdlIGRvIG5vdCBoYW5kbGUgdGhlaXIgdmFsdWVzIG5vdy4KLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSBTdHJ1Y3R1cmVkUG9zdGFsLlRZUEVfQ1VTVE9NOwotICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSB0eXBlU3RyaW5nOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gV2UgdXNlICJIT01FIiBhcyBkZWZhdWx0Ci0gICAgICAgICAgICBpZiAodHlwZSA8IDApIHsKLSAgICAgICAgICAgICAgICB0eXBlID0gU3RydWN0dXJlZFBvc3RhbC5UWVBFX0hPTUU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGFkZFBvc3RhbCh0eXBlLCBwcm9wVmFsdWVMaXN0LCBsYWJlbCwgaXNQcmltYXJ5KTsKLSAgICAgICAgfSBlbHNlIGlmIChwcm9wTmFtZS5lcXVhbHMoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfRU1BSUwpKSB7Ci0gICAgICAgICAgICBpbnQgdHlwZSA9IC0xOwotICAgICAgICAgICAgU3RyaW5nIGxhYmVsID0gbnVsbDsKLSAgICAgICAgICAgIGJvb2xlYW4gaXNQcmltYXJ5ID0gZmFsc2U7Ci0gICAgICAgICAgICBDb2xsZWN0aW9uPFN0cmluZz4gdHlwZUNvbGxlY3Rpb24gPSBwYXJhbU1hcC5nZXQoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRSk7Ci0gICAgICAgICAgICBpZiAodHlwZUNvbGxlY3Rpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIHR5cGVTdHJpbmcgOiB0eXBlQ29sbGVjdGlvbikgewotICAgICAgICAgICAgICAgICAgICB0eXBlU3RyaW5nID0gdHlwZVN0cmluZy50b1VwcGVyQ2FzZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAodHlwZVN0cmluZy5lcXVhbHMoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9QUkVGKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaXNQcmltYXJ5ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlU3RyaW5nLmVxdWFscyhWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX0hPTUUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gRW1haWwuVFlQRV9IT01FOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVTdHJpbmcuZXF1YWxzKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfV09SSykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSBFbWFpbC5UWVBFX1dPUks7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZVN0cmluZy5lcXVhbHMoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9DRUxMKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9IEVtYWlsLlRZUEVfTU9CSUxFOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVTdHJpbmcuc3RhcnRzV2l0aCgiWC0iKSAmJiB0eXBlIDwgMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVTdHJpbmcgPSB0eXBlU3RyaW5nLnN1YnN0cmluZygyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHZDYXJkIDMuMCBhbGxvd3MgaWFuYS10b2tlbi4KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIG1heSBoYXZlIElOVEVSTkVUIChzcGVjaWZpZWQgaW4gdkNhcmQgc3BlYyksCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBTQ0hPT0wsIGV0Yy4KLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSBFbWFpbC5UWVBFX0NVU1RPTTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsID0gdHlwZVN0cmluZzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICh0eXBlIDwgMCkgewotICAgICAgICAgICAgICAgIHR5cGUgPSBFbWFpbC5UWVBFX09USEVSOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYWRkRW1haWwodHlwZSwgcHJvcFZhbHVlLCBsYWJlbCwgaXNQcmltYXJ5KTsKLSAgICAgICAgfSBlbHNlIGlmIChwcm9wTmFtZS5lcXVhbHMoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfT1JHKSkgewotICAgICAgICAgICAgLy8gdkNhcmQgc3BlY2lmaWNhdGlvbiBkb2VzIG5vdCBzcGVjaWZ5IG90aGVyIHR5cGVzLgotICAgICAgICAgICAgZmluYWwgaW50IHR5cGUgPSBPcmdhbml6YXRpb24uVFlQRV9XT1JLOwotICAgICAgICAgICAgYm9vbGVhbiBpc1ByaW1hcnkgPSBmYWxzZTsKLSAgICAgICAgICAgIENvbGxlY3Rpb248U3RyaW5nPiB0eXBlQ29sbGVjdGlvbiA9IHBhcmFtTWFwLmdldChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFKTsKLSAgICAgICAgICAgIGlmICh0eXBlQ29sbGVjdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgdHlwZVN0cmluZyA6IHR5cGVDb2xsZWN0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlU3RyaW5nLmVxdWFscyhWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX1BSRUYpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpc1ByaW1hcnkgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaGFuZGxlT3JnVmFsdWUodHlwZSwgcHJvcFZhbHVlTGlzdCwgaXNQcmltYXJ5KTsKLSAgICAgICAgfSBlbHNlIGlmIChwcm9wTmFtZS5lcXVhbHMoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfVElUTEUpKSB7Ci0gICAgICAgICAgICBoYW5kbGVUaXRsZVZhbHVlKHByb3BWYWx1ZSk7Ci0gICAgICAgIH0gZWxzZSBpZiAocHJvcE5hbWUuZXF1YWxzKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1JPTEUpKSB7Ci0gICAgICAgICAgICAvLyBUaGlzIGNvbmZsaWN0cyB3aXRoIFRJVExFLiBJZ25vcmUgZm9yIG5vdy4uLgotICAgICAgICAgICAgLy8gaGFuZGxlVGl0bGVWYWx1ZShwcm9wVmFsdWUpOwotICAgICAgICB9IGVsc2UgaWYgKHByb3BOYW1lLmVxdWFscyhWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9QSE9UTykgfHwKLSAgICAgICAgICAgICAgICBwcm9wTmFtZS5lcXVhbHMoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfTE9HTykpIHsKLSAgICAgICAgICAgIENvbGxlY3Rpb248U3RyaW5nPiBwYXJhbU1hcFZhbHVlID0gcGFyYW1NYXAuZ2V0KCJWQUxVRSIpOwotICAgICAgICAgICAgaWYgKHBhcmFtTWFwVmFsdWUgIT0gbnVsbCAmJiBwYXJhbU1hcFZhbHVlLmNvbnRhaW5zKCJVUkwiKSkgewotICAgICAgICAgICAgICAgIC8vIEN1cnJlbnRseSB3ZSBkbyBub3QgaGF2ZSBhcHByb3ByaWF0ZSBleGFtcGxlIGZvciB0ZXN0aW5nIHRoaXMgY2FzZS4KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgQ29sbGVjdGlvbjxTdHJpbmc+IHR5cGVDb2xsZWN0aW9uID0gcGFyYW1NYXAuZ2V0KCJUWVBFIik7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGZvcm1hdE5hbWUgPSBudWxsOwotICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNQcmltYXJ5ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgaWYgKHR5cGVDb2xsZWN0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgdHlwZVZhbHVlIDogdHlwZUNvbGxlY3Rpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX1BSRUYuZXF1YWxzKHR5cGVWYWx1ZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1ByaW1hcnkgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmb3JtYXROYW1lID09IG51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdE5hbWUgPSB0eXBlVmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYWRkUGhvdG9CeXRlcyhmb3JtYXROYW1lLCBwcm9wQnl0ZXMsIGlzUHJpbWFyeSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAocHJvcE5hbWUuZXF1YWxzKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1RFTCkpIHsKLSAgICAgICAgICAgIGZpbmFsIENvbGxlY3Rpb248U3RyaW5nPiB0eXBlQ29sbGVjdGlvbiA9IHBhcmFtTWFwLmdldChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFKTsKLSAgICAgICAgICAgIGZpbmFsIE9iamVjdCB0eXBlT2JqZWN0ID0KLSAgICAgICAgICAgICAgICBWQ2FyZFV0aWxzLmdldFBob25lVHlwZUZyb21TdHJpbmdzKHR5cGVDb2xsZWN0aW9uLCBwcm9wVmFsdWUpOwotICAgICAgICAgICAgZmluYWwgaW50IHR5cGU7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgbGFiZWw7Ci0gICAgICAgICAgICBpZiAodHlwZU9iamVjdCBpbnN0YW5jZW9mIEludGVnZXIpIHsKLSAgICAgICAgICAgICAgICB0eXBlID0gKEludGVnZXIpdHlwZU9iamVjdDsKLSAgICAgICAgICAgICAgICBsYWJlbCA9IG51bGw7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHR5cGUgPSBQaG9uZS5UWVBFX0NVU1RPTTsKLSAgICAgICAgICAgICAgICBsYWJlbCA9IHR5cGVPYmplY3QudG9TdHJpbmcoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBpc1ByaW1hcnk7Ci0gICAgICAgICAgICBpZiAodHlwZUNvbGxlY3Rpb24gIT0gbnVsbCAmJiB0eXBlQ29sbGVjdGlvbi5jb250YWlucyhWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX1BSRUYpKSB7Ci0gICAgICAgICAgICAgICAgaXNQcmltYXJ5ID0gdHJ1ZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaXNQcmltYXJ5ID0gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhZGRQaG9uZSh0eXBlLCBwcm9wVmFsdWUsIGxhYmVsLCBpc1ByaW1hcnkpOwotICAgICAgICB9IGVsc2UgaWYgKHByb3BOYW1lLmVxdWFscyhWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9YX1NLWVBFX1BTVE5OVU1CRVIpKSB7Ci0gICAgICAgICAgICAvLyBUaGUgcGhvbmUgbnVtYmVyIGF2YWlsYWJsZSB2aWEgU2t5cGUuCi0gICAgICAgICAgICBDb2xsZWN0aW9uPFN0cmluZz4gdHlwZUNvbGxlY3Rpb24gPSBwYXJhbU1hcC5nZXQoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRSk7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgdHlwZSA9IFBob25lLlRZUEVfT1RIRVI7Ci0gICAgICAgICAgICBmaW5hbCBib29sZWFuIGlzUHJpbWFyeTsKLSAgICAgICAgICAgIGlmICh0eXBlQ29sbGVjdGlvbiAhPSBudWxsICYmIHR5cGVDb2xsZWN0aW9uLmNvbnRhaW5zKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfUFJFRikpIHsKLSAgICAgICAgICAgICAgICBpc1ByaW1hcnkgPSB0cnVlOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpc1ByaW1hcnkgPSBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFkZFBob25lKHR5cGUsIHByb3BWYWx1ZSwgbnVsbCwgaXNQcmltYXJ5KTsKLSAgICAgICAgfSBlbHNlIGlmIChzSW1NYXAuY29udGFpbnNLZXkocHJvcE5hbWUpKSB7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgcHJvdG9jb2wgPSBzSW1NYXAuZ2V0KHByb3BOYW1lKTsKLSAgICAgICAgICAgIGJvb2xlYW4gaXNQcmltYXJ5ID0gZmFsc2U7Ci0gICAgICAgICAgICBpbnQgdHlwZSA9IC0xOwotICAgICAgICAgICAgZmluYWwgQ29sbGVjdGlvbjxTdHJpbmc+IHR5cGVDb2xsZWN0aW9uID0gcGFyYW1NYXAuZ2V0KFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEUpOwotICAgICAgICAgICAgaWYgKHR5cGVDb2xsZWN0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyB0eXBlU3RyaW5nIDogdHlwZUNvbGxlY3Rpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVTdHJpbmcuZXF1YWxzKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfUFJFRikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlzUHJpbWFyeSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlU3RyaW5nLmVxdWFsc0lnbm9yZUNhc2UoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9IT01FKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSBJbS5UWVBFX0hPTUU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVTdHJpbmcuZXF1YWxzSWdub3JlQ2FzZShWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX1dPUkspKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9IEltLlRZUEVfV09SSzsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICh0eXBlIDwgMCkgewotICAgICAgICAgICAgICAgIHR5cGUgPSBQaG9uZS5UWVBFX0hPTUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhZGRJbShwcm90b2NvbCwgbnVsbCwgdHlwZSwgcHJvcFZhbHVlLCBpc1ByaW1hcnkpOwotICAgICAgICB9IGVsc2UgaWYgKHByb3BOYW1lLmVxdWFscyhWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9OT1RFKSkgewotICAgICAgICAgICAgYWRkTm90ZShwcm9wVmFsdWUpOwotICAgICAgICB9IGVsc2UgaWYgKHByb3BOYW1lLmVxdWFscyhWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9VUkwpKSB7Ci0gICAgICAgICAgICBpZiAobVdlYnNpdGVMaXN0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtV2Vic2l0ZUxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oMSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtV2Vic2l0ZUxpc3QuYWRkKHByb3BWYWx1ZSk7Ci0gICAgICAgIH0gZWxzZSBpZiAocHJvcE5hbWUuZXF1YWxzKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX0JEQVkpKSB7Ci0gICAgICAgICAgICBtQmlydGhkYXkgPSBwcm9wVmFsdWU7Ci0gICAgICAgIH0gZWxzZSBpZiAocHJvcE5hbWUuZXF1YWxzKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1hfUEhPTkVUSUNfRklSU1RfTkFNRSkpIHsKLSAgICAgICAgICAgIG1QaG9uZXRpY0dpdmVuTmFtZSA9IHByb3BWYWx1ZTsKLSAgICAgICAgfSBlbHNlIGlmIChwcm9wTmFtZS5lcXVhbHMoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfWF9QSE9ORVRJQ19NSURETEVfTkFNRSkpIHsKLSAgICAgICAgICAgIG1QaG9uZXRpY01pZGRsZU5hbWUgPSBwcm9wVmFsdWU7Ci0gICAgICAgIH0gZWxzZSBpZiAocHJvcE5hbWUuZXF1YWxzKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1hfUEhPTkVUSUNfTEFTVF9OQU1FKSkgewotICAgICAgICAgICAgbVBob25ldGljRmFtaWx5TmFtZSA9IHByb3BWYWx1ZTsKLSAgICAgICAgfSBlbHNlIGlmIChwcm9wTmFtZS5lcXVhbHMoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfWF9BTkRST0lEX0NVU1RPTSkpIHsKLSAgICAgICAgICAgIGZpbmFsIExpc3Q8U3RyaW5nPiBjdXN0b21Qcm9wZXJ0eUxpc3QgPQotICAgICAgICAgICAgICAgIFZDYXJkVXRpbHMuY29uc3RydWN0TGlzdEZyb21WYWx1ZShwcm9wVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBWQ2FyZENvbmZpZy5pc1YzMChtVkNhcmRUeXBlKSk7Ci0gICAgICAgICAgICBoYW5kbGVBbmRyb2lkQ3VzdG9tUHJvcGVydHkoY3VzdG9tUHJvcGVydHlMaXN0KTsKLSAgICAgICAgLyp9IGVsc2UgaWYgKHByb3BOYW1lLmVxdWFscygiUkVWIikpIHsKLSAgICAgICAgICAgIC8vIFJldmlzaW9uIG9mIHRoaXMgVkNhcmQgZW50cnkuIEkgdGhpbmsgd2UgY2FuIGlnbm9yZSB0aGlzLgotICAgICAgICB9IGVsc2UgaWYgKHByb3BOYW1lLmVxdWFscygiVUlEIikpIHsKLSAgICAgICAgfSBlbHNlIGlmIChwcm9wTmFtZS5lcXVhbHMoIktFWSIpKSB7Ci0gICAgICAgICAgICAvLyBUeXBlIGlzIFg1MDkgb3IgUEdQPyBJIGRvbid0IGtub3cgaG93IHRvIGhhbmRsZSB0aGlzLi4uCi0gICAgICAgIH0gZWxzZSBpZiAocHJvcE5hbWUuZXF1YWxzKCJNQUlMRVIiKSkgewotICAgICAgICB9IGVsc2UgaWYgKHByb3BOYW1lLmVxdWFscygiVFoiKSkgewotICAgICAgICB9IGVsc2UgaWYgKHByb3BOYW1lLmVxdWFscygiR0VPIikpIHsKLSAgICAgICAgfSBlbHNlIGlmIChwcm9wTmFtZS5lcXVhbHMoIkNMQVNTIikpIHsKLSAgICAgICAgICAgIC8vIHZDYXJkIDMuMCBvbmx5LgotICAgICAgICAgICAgLy8gZS5nLiBDTEFTUzpDT05GSURFTlRJQUwKLSAgICAgICAgfSBlbHNlIGlmIChwcm9wTmFtZS5lcXVhbHMoIlBST0ZJTEUiKSkgewotICAgICAgICAgICAgLy8gVkNhcmQgMy4wIG9ubHkuIE11c3QgYmUgIlZDQVJEIi4gSSB0aGluayB3ZSBjYW4gaWdub3JlIHRoaXMuCi0gICAgICAgIH0gZWxzZSBpZiAocHJvcE5hbWUuZXF1YWxzKCJDQVRFR09SSUVTIikpIHsKLSAgICAgICAgICAgIC8vIFZDYXJkIDMuMCBvbmx5LgotICAgICAgICAgICAgLy8gZS5nLiBDQVRFR09SSUVTOklOVEVSTkVULElFVEYsSU5EVVNUUlksSU5GT1JNQVRJT04gVEVDSE5PTE9HWQotICAgICAgICB9IGVsc2UgaWYgKHByb3BOYW1lLmVxdWFscygiU09VUkNFIikpIHsKLSAgICAgICAgICAgIC8vIFZDYXJkIDMuMCBvbmx5LgotICAgICAgICB9IGVsc2UgaWYgKHByb3BOYW1lLmVxdWFscygiUFJPRElEIikpIHsKLSAgICAgICAgICAgIC8vIFZDYXJkIDMuMCBvbmx5LgotICAgICAgICAgICAgLy8gVG8gc3BlY2lmeSB0aGUgaWRlbnRpZmllciBmb3IgdGhlIHByb2R1Y3QgdGhhdCBjcmVhdGVkCi0gICAgICAgICAgICAvLyB0aGUgdkNhcmQgb2JqZWN0LiovCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBVbmtub3duIFgtIHdvcmRzIGFuZCBJQU5BIHRva2VuLgotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGhhbmRsZUFuZHJvaWRDdXN0b21Qcm9wZXJ0eShmaW5hbCBMaXN0PFN0cmluZz4gY3VzdG9tUHJvcGVydHlMaXN0KSB7Ci0gICAgICAgIGlmIChtQW5kcm9pZEN1c3RvbVByb3BlcnR5TGlzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtQW5kcm9pZEN1c3RvbVByb3BlcnR5TGlzdCA9IG5ldyBBcnJheUxpc3Q8TGlzdDxTdHJpbmc+PigpOwotICAgICAgICB9Ci0gICAgICAgIG1BbmRyb2lkQ3VzdG9tUHJvcGVydHlMaXN0LmFkZChjdXN0b21Qcm9wZXJ0eUxpc3QpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdCB0aGUgZGlzcGxheSBuYW1lLiBUaGUgY29uc3RydWN0ZWQgZGF0YSBtdXN0IG5vdCBiZSBudWxsLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBjb25zdHJ1Y3REaXNwbGF5TmFtZSgpIHsKLSAgICAgICAgLy8gRnVsbE5hbWUgKGNyZWF0ZWQgdmlhICJGTiIgb3IgIk5BTUUiIGZpZWxkKSBpcyBwcmVmZXJlZC4KLSAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShtRnVsbE5hbWUpKSB7Ci0gICAgICAgICAgICBtRGlzcGxheU5hbWUgPSBtRnVsbE5hbWU7Ci0gICAgICAgIH0gZWxzZSBpZiAoIShUZXh0VXRpbHMuaXNFbXB0eShtRmFtaWx5TmFtZSkgJiYgVGV4dFV0aWxzLmlzRW1wdHkobUdpdmVuTmFtZSkpKSB7Ci0gICAgICAgICAgICBtRGlzcGxheU5hbWUgPSBWQ2FyZFV0aWxzLmNvbnN0cnVjdE5hbWVGcm9tRWxlbWVudHMobVZDYXJkVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgbUZhbWlseU5hbWUsIG1NaWRkbGVOYW1lLCBtR2l2ZW5OYW1lLCBtUHJlZml4LCBtU3VmZml4KTsKLSAgICAgICAgfSBlbHNlIGlmICghKFRleHRVdGlscy5pc0VtcHR5KG1QaG9uZXRpY0ZhbWlseU5hbWUpICYmCi0gICAgICAgICAgICAgICAgVGV4dFV0aWxzLmlzRW1wdHkobVBob25ldGljR2l2ZW5OYW1lKSkpIHsKLSAgICAgICAgICAgIG1EaXNwbGF5TmFtZSA9IFZDYXJkVXRpbHMuY29uc3RydWN0TmFtZUZyb21FbGVtZW50cyhtVkNhcmRUeXBlLAotICAgICAgICAgICAgICAgICAgICBtUGhvbmV0aWNGYW1pbHlOYW1lLCBtUGhvbmV0aWNNaWRkbGVOYW1lLCBtUGhvbmV0aWNHaXZlbk5hbWUpOwotICAgICAgICB9IGVsc2UgaWYgKG1FbWFpbExpc3QgIT0gbnVsbCAmJiBtRW1haWxMaXN0LnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgIG1EaXNwbGF5TmFtZSA9IG1FbWFpbExpc3QuZ2V0KDApLmRhdGE7Ci0gICAgICAgIH0gZWxzZSBpZiAobVBob25lTGlzdCAhPSBudWxsICYmIG1QaG9uZUxpc3Quc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgbURpc3BsYXlOYW1lID0gbVBob25lTGlzdC5nZXQoMCkuZGF0YTsKLSAgICAgICAgfSBlbHNlIGlmIChtUG9zdGFsTGlzdCAhPSBudWxsICYmIG1Qb3N0YWxMaXN0LnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgIG1EaXNwbGF5TmFtZSA9IG1Qb3N0YWxMaXN0LmdldCgwKS5nZXRGb3JtYXR0ZWRBZGRyZXNzKG1WQ2FyZFR5cGUpOwotICAgICAgICB9IGVsc2UgaWYgKG1Pcmdhbml6YXRpb25MaXN0ICE9IG51bGwgJiYgbU9yZ2FuaXphdGlvbkxpc3Quc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgbURpc3BsYXlOYW1lID0gbU9yZ2FuaXphdGlvbkxpc3QuZ2V0KDApLmdldEZvcm1hdHRlZFN0cmluZygpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1EaXNwbGF5TmFtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtRGlzcGxheU5hbWUgPSAiIjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnNvbGlkYXRlIHNldmVyYWwgZmllbHNkcyAobGlrZSBtTmFtZSkgdXNpbmcgbmFtZSBjYW5kaWRhdGVzLAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNvbnNvbGlkYXRlRmllbGRzKCkgewotICAgICAgICBjb25zdHJ1Y3REaXNwbGF5TmFtZSgpOwotCi0gICAgICAgIGlmIChtUGhvbmV0aWNGdWxsTmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtUGhvbmV0aWNGdWxsTmFtZSA9IG1QaG9uZXRpY0Z1bGxOYW1lLnRyaW0oKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBVcmkgcHVzaEludG9Db250ZW50UmVzb2x2ZXIoQ29udGVudFJlc29sdmVyIHJlc29sdmVyKSB7Ci0gICAgICAgIEFycmF5TGlzdDxDb250ZW50UHJvdmlkZXJPcGVyYXRpb24+IG9wZXJhdGlvbkxpc3QgPQotICAgICAgICAgICAgbmV3IEFycmF5TGlzdDxDb250ZW50UHJvdmlkZXJPcGVyYXRpb24+KCk7Ci0gICAgICAgIC8vIEFmdGVyIGFwcGx5aW5nIHRoZSBiYXRjaCB0aGUgZmlyc3QgcmVzdWx0J3MgVXJpIGlzIHJldHVybmVkIHNvIGl0IGlzIGltcG9ydGFudCB0aGF0Ci0gICAgICAgIC8vIHRoZSBSYXdDb250YWN0IGlzIHRoZSBmaXJzdCBvcGVyYXRpb24gdGhhdCBnZXRzIGluc2VydGVkIGludG8gdGhlIGxpc3QKLSAgICAgICAgQ29udGVudFByb3ZpZGVyT3BlcmF0aW9uLkJ1aWxkZXIgYnVpbGRlciA9Ci0gICAgICAgICAgICBDb250ZW50UHJvdmlkZXJPcGVyYXRpb24ubmV3SW5zZXJ0KFJhd0NvbnRhY3RzLkNPTlRFTlRfVVJJKTsKLSAgICAgICAgU3RyaW5nIG15R3JvdXBzSWQgPSBudWxsOwotICAgICAgICBpZiAobUFjY291bnQgIT0gbnVsbCkgewotICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoUmF3Q29udGFjdHMuQUNDT1VOVF9OQU1FLCBtQWNjb3VudC5uYW1lKTsKLSAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKFJhd0NvbnRhY3RzLkFDQ09VTlRfVFlQRSwgbUFjY291bnQudHlwZSk7Ci0KLSAgICAgICAgICAgIC8vIEFzc3VtZSB0aGF0IGNhbGxlciBzaWRlIGNyZWF0ZXMgdGhpcyBncm91cCBpZiBpdCBkb2VzIG5vdCBleGlzdC4KLSAgICAgICAgICAgIGlmIChBQ0NPVU5UX1RZUEVfR09PR0xFLmVxdWFscyhtQWNjb3VudC50eXBlKSkgewotICAgICAgICAgICAgICAgIGZpbmFsIEN1cnNvciBjdXJzb3IgPSByZXNvbHZlci5xdWVyeShHcm91cHMuQ09OVEVOVF9VUkksIG5ldyBTdHJpbmdbXSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBHcm91cHMuU09VUkNFX0lEIH0sCi0gICAgICAgICAgICAgICAgICAgICAgICBHcm91cHMuVElUTEUgKyAiPT8iLCBuZXcgU3RyaW5nW10gewotICAgICAgICAgICAgICAgICAgICAgICAgR09PR0xFX01ZX0NPTlRBQ1RTX0dST1VQIH0sIG51bGwpOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjdXJzb3IgIT0gbnVsbCAmJiBjdXJzb3IubW92ZVRvRmlyc3QoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbXlHcm91cHNJZCA9IGN1cnNvci5nZXRTdHJpbmcoMCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgICAgICBpZiAoY3Vyc29yICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGN1cnNvci5jbG9zZSgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoUmF3Q29udGFjdHMuQUNDT1VOVF9OQU1FLCBudWxsKTsKLSAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKFJhd0NvbnRhY3RzLkFDQ09VTlRfVFlQRSwgbnVsbCk7Ci0gICAgICAgIH0KLSAgICAgICAgb3BlcmF0aW9uTGlzdC5hZGQoYnVpbGRlci5idWlsZCgpKTsKLQotICAgICAgICBpZiAoIW5hbWVGaWVsZHNBcmVFbXB0eSgpKSB7Ci0gICAgICAgICAgICBidWlsZGVyID0gQ29udGVudFByb3ZpZGVyT3BlcmF0aW9uLm5ld0luc2VydChEYXRhLkNPTlRFTlRfVVJJKTsKLSAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlQmFja1JlZmVyZW5jZShTdHJ1Y3R1cmVkTmFtZS5SQVdfQ09OVEFDVF9JRCwgMCk7Ci0gICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShEYXRhLk1JTUVUWVBFLCBTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSk7Ci0KLSAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKFN0cnVjdHVyZWROYW1lLkdJVkVOX05BTUUsIG1HaXZlbk5hbWUpOwotICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoU3RydWN0dXJlZE5hbWUuRkFNSUxZX05BTUUsIG1GYW1pbHlOYW1lKTsKLSAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKFN0cnVjdHVyZWROYW1lLk1JRERMRV9OQU1FLCBtTWlkZGxlTmFtZSk7Ci0gICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShTdHJ1Y3R1cmVkTmFtZS5QUkVGSVgsIG1QcmVmaXgpOwotICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoU3RydWN0dXJlZE5hbWUuU1VGRklYLCBtU3VmZml4KTsKLQotICAgICAgICAgICAgaWYgKCEoVGV4dFV0aWxzLmlzRW1wdHkobVBob25ldGljR2l2ZW5OYW1lKQotICAgICAgICAgICAgICAgICAgICAmJiBUZXh0VXRpbHMuaXNFbXB0eShtUGhvbmV0aWNGYW1pbHlOYW1lKQotICAgICAgICAgICAgICAgICAgICAmJiBUZXh0VXRpbHMuaXNFbXB0eShtUGhvbmV0aWNNaWRkbGVOYW1lKSkpIHsKLSAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19HSVZFTl9OQU1FLCBtUGhvbmV0aWNHaXZlbk5hbWUpOwotICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKFN0cnVjdHVyZWROYW1lLlBIT05FVElDX0ZBTUlMWV9OQU1FLCBtUGhvbmV0aWNGYW1pbHlOYW1lKTsKLSAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19NSURETEVfTkFNRSwgbVBob25ldGljTWlkZGxlTmFtZSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShtUGhvbmV0aWNGdWxsTmFtZSkpIHsKLSAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19HSVZFTl9OQU1FLCBtUGhvbmV0aWNGdWxsTmFtZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKFN0cnVjdHVyZWROYW1lLkRJU1BMQVlfTkFNRSwgZ2V0RGlzcGxheU5hbWUoKSk7Ci0gICAgICAgICAgICBvcGVyYXRpb25MaXN0LmFkZChidWlsZGVyLmJ1aWxkKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1OaWNrTmFtZUxpc3QgIT0gbnVsbCAmJiBtTmlja05hbWVMaXN0LnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgIGZvciAoU3RyaW5nIG5pY2tOYW1lIDogbU5pY2tOYW1lTGlzdCkgewotICAgICAgICAgICAgICAgIGJ1aWxkZXIgPSBDb250ZW50UHJvdmlkZXJPcGVyYXRpb24ubmV3SW5zZXJ0KERhdGEuQ09OVEVOVF9VUkkpOwotICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlQmFja1JlZmVyZW5jZShOaWNrbmFtZS5SQVdfQ09OVEFDVF9JRCwgMCk7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoRGF0YS5NSU1FVFlQRSwgTmlja25hbWUuQ09OVEVOVF9JVEVNX1RZUEUpOwotICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKE5pY2tuYW1lLlRZUEUsIE5pY2tuYW1lLlRZUEVfREVGQVVMVCk7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoTmlja25hbWUuTkFNRSwgbmlja05hbWUpOwotICAgICAgICAgICAgICAgIG9wZXJhdGlvbkxpc3QuYWRkKGJ1aWxkZXIuYnVpbGQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobVBob25lTGlzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKFBob25lRGF0YSBwaG9uZURhdGEgOiBtUGhvbmVMaXN0KSB7Ci0gICAgICAgICAgICAgICAgYnVpbGRlciA9IENvbnRlbnRQcm92aWRlck9wZXJhdGlvbi5uZXdJbnNlcnQoRGF0YS5DT05URU5UX1VSSSk7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWVCYWNrUmVmZXJlbmNlKFBob25lLlJBV19DT05UQUNUX0lELCAwKTsKLSAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShEYXRhLk1JTUVUWVBFLCBQaG9uZS5DT05URU5UX0lURU1fVFlQRSk7Ci0KLSAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShQaG9uZS5UWVBFLCBwaG9uZURhdGEudHlwZSk7Ci0gICAgICAgICAgICAgICAgaWYgKHBob25lRGF0YS50eXBlID09IFBob25lLlRZUEVfQ1VTVE9NKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKFBob25lLkxBQkVMLCBwaG9uZURhdGEubGFiZWwpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShQaG9uZS5OVU1CRVIsIHBob25lRGF0YS5kYXRhKTsKLSAgICAgICAgICAgICAgICBpZiAocGhvbmVEYXRhLmlzUHJpbWFyeSkgewotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShQaG9uZS5JU19QUklNQVJZLCAxKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgb3BlcmF0aW9uTGlzdC5hZGQoYnVpbGRlci5idWlsZCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtT3JnYW5pemF0aW9uTGlzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKE9yZ2FuaXphdGlvbkRhdGEgb3JnYW5pemF0aW9uRGF0YSA6IG1Pcmdhbml6YXRpb25MaXN0KSB7Ci0gICAgICAgICAgICAgICAgYnVpbGRlciA9IENvbnRlbnRQcm92aWRlck9wZXJhdGlvbi5uZXdJbnNlcnQoRGF0YS5DT05URU5UX1VSSSk7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWVCYWNrUmVmZXJlbmNlKE9yZ2FuaXphdGlvbi5SQVdfQ09OVEFDVF9JRCwgMCk7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoRGF0YS5NSU1FVFlQRSwgT3JnYW5pemF0aW9uLkNPTlRFTlRfSVRFTV9UWVBFKTsKLSAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShPcmdhbml6YXRpb24uVFlQRSwgb3JnYW5pemF0aW9uRGF0YS50eXBlKTsKLSAgICAgICAgICAgICAgICBpZiAob3JnYW5pemF0aW9uRGF0YS5jb21wYW55TmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKE9yZ2FuaXphdGlvbi5DT01QQU5ZLCBvcmdhbml6YXRpb25EYXRhLmNvbXBhbnlOYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG9yZ2FuaXphdGlvbkRhdGEuZGVwYXJ0bWVudE5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShPcmdhbml6YXRpb24uREVQQVJUTUVOVCwgb3JnYW5pemF0aW9uRGF0YS5kZXBhcnRtZW50TmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChvcmdhbml6YXRpb25EYXRhLnRpdGxlTmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKE9yZ2FuaXphdGlvbi5USVRMRSwgb3JnYW5pemF0aW9uRGF0YS50aXRsZU5hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAob3JnYW5pemF0aW9uRGF0YS5pc1ByaW1hcnkpIHsKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoT3JnYW5pemF0aW9uLklTX1BSSU1BUlksIDEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBvcGVyYXRpb25MaXN0LmFkZChidWlsZGVyLmJ1aWxkKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1FbWFpbExpc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChFbWFpbERhdGEgZW1haWxEYXRhIDogbUVtYWlsTGlzdCkgewotICAgICAgICAgICAgICAgIGJ1aWxkZXIgPSBDb250ZW50UHJvdmlkZXJPcGVyYXRpb24ubmV3SW5zZXJ0KERhdGEuQ09OVEVOVF9VUkkpOwotICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlQmFja1JlZmVyZW5jZShFbWFpbC5SQVdfQ09OVEFDVF9JRCwgMCk7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoRGF0YS5NSU1FVFlQRSwgRW1haWwuQ09OVEVOVF9JVEVNX1RZUEUpOwotCi0gICAgICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoRW1haWwuVFlQRSwgZW1haWxEYXRhLnR5cGUpOwotICAgICAgICAgICAgICAgIGlmIChlbWFpbERhdGEudHlwZSA9PSBFbWFpbC5UWVBFX0NVU1RPTSkgewotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShFbWFpbC5MQUJFTCwgZW1haWxEYXRhLmxhYmVsKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoRW1haWwuREFUQSwgZW1haWxEYXRhLmRhdGEpOwotICAgICAgICAgICAgICAgIGlmIChlbWFpbERhdGEuaXNQcmltYXJ5KSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKERhdGEuSVNfUFJJTUFSWSwgMSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG9wZXJhdGlvbkxpc3QuYWRkKGJ1aWxkZXIuYnVpbGQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobVBvc3RhbExpc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChQb3N0YWxEYXRhIHBvc3RhbERhdGEgOiBtUG9zdGFsTGlzdCkgewotICAgICAgICAgICAgICAgIGJ1aWxkZXIgPSBDb250ZW50UHJvdmlkZXJPcGVyYXRpb24ubmV3SW5zZXJ0KERhdGEuQ09OVEVOVF9VUkkpOwotICAgICAgICAgICAgICAgIFZDYXJkVXRpbHMuaW5zZXJ0U3RydWN0dXJlZFBvc3RhbERhdGFVc2luZ0NvbnRhY3RzU3RydWN0KAotICAgICAgICAgICAgICAgICAgICAgICAgbVZDYXJkVHlwZSwgYnVpbGRlciwgcG9zdGFsRGF0YSk7Ci0gICAgICAgICAgICAgICAgb3BlcmF0aW9uTGlzdC5hZGQoYnVpbGRlci5idWlsZCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtSW1MaXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoSW1EYXRhIGltRGF0YSA6IG1JbUxpc3QpIHsKLSAgICAgICAgICAgICAgICBidWlsZGVyID0gQ29udGVudFByb3ZpZGVyT3BlcmF0aW9uLm5ld0luc2VydChEYXRhLkNPTlRFTlRfVVJJKTsKLSAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZUJhY2tSZWZlcmVuY2UoSW0uUkFXX0NPTlRBQ1RfSUQsIDApOwotICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKERhdGEuTUlNRVRZUEUsIEltLkNPTlRFTlRfSVRFTV9UWVBFKTsKLSAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShJbS5UWVBFLCBpbURhdGEudHlwZSk7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoSW0uUFJPVE9DT0wsIGltRGF0YS5wcm90b2NvbCk7Ci0gICAgICAgICAgICAgICAgaWYgKGltRGF0YS5wcm90b2NvbCA9PSBJbS5QUk9UT0NPTF9DVVNUT00pIHsKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoSW0uQ1VTVE9NX1BST1RPQ09MLCBpbURhdGEuY3VzdG9tUHJvdG9jb2wpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoaW1EYXRhLmlzUHJpbWFyeSkgewotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShEYXRhLklTX1BSSU1BUlksIDEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtTm90ZUxpc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChTdHJpbmcgbm90ZSA6IG1Ob3RlTGlzdCkgewotICAgICAgICAgICAgICAgIGJ1aWxkZXIgPSBDb250ZW50UHJvdmlkZXJPcGVyYXRpb24ubmV3SW5zZXJ0KERhdGEuQ09OVEVOVF9VUkkpOwotICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlQmFja1JlZmVyZW5jZShOb3RlLlJBV19DT05UQUNUX0lELCAwKTsKLSAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShEYXRhLk1JTUVUWVBFLCBOb3RlLkNPTlRFTlRfSVRFTV9UWVBFKTsKLSAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShOb3RlLk5PVEUsIG5vdGUpOwotICAgICAgICAgICAgICAgIG9wZXJhdGlvbkxpc3QuYWRkKGJ1aWxkZXIuYnVpbGQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobVBob3RvTGlzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKFBob3RvRGF0YSBwaG90b0RhdGEgOiBtUGhvdG9MaXN0KSB7Ci0gICAgICAgICAgICAgICAgYnVpbGRlciA9IENvbnRlbnRQcm92aWRlck9wZXJhdGlvbi5uZXdJbnNlcnQoRGF0YS5DT05URU5UX1VSSSk7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWVCYWNrUmVmZXJlbmNlKFBob3RvLlJBV19DT05UQUNUX0lELCAwKTsKLSAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShEYXRhLk1JTUVUWVBFLCBQaG90by5DT05URU5UX0lURU1fVFlQRSk7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoUGhvdG8uUEhPVE8sIHBob3RvRGF0YS5waG90b0J5dGVzKTsKLSAgICAgICAgICAgICAgICBpZiAocGhvdG9EYXRhLmlzUHJpbWFyeSkgewotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShQaG90by5JU19QUklNQVJZLCAxKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgb3BlcmF0aW9uTGlzdC5hZGQoYnVpbGRlci5idWlsZCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtV2Vic2l0ZUxpc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChTdHJpbmcgd2Vic2l0ZSA6IG1XZWJzaXRlTGlzdCkgewotICAgICAgICAgICAgICAgIGJ1aWxkZXIgPSBDb250ZW50UHJvdmlkZXJPcGVyYXRpb24ubmV3SW5zZXJ0KERhdGEuQ09OVEVOVF9VUkkpOwotICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlQmFja1JlZmVyZW5jZShXZWJzaXRlLlJBV19DT05UQUNUX0lELCAwKTsKLSAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShEYXRhLk1JTUVUWVBFLCBXZWJzaXRlLkNPTlRFTlRfSVRFTV9UWVBFKTsKLSAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShXZWJzaXRlLlVSTCwgd2Vic2l0ZSk7Ci0gICAgICAgICAgICAgICAgLy8gVGhlcmUncyBubyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdHlwZSBvZiBVUkwgaW4gdkNhcmQuCi0gICAgICAgICAgICAgICAgLy8gV2UgdXNlIFRZUEVfSE9NRVBBR0UgZm9yIHNhZmV0eS4KLSAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShXZWJzaXRlLlRZUEUsIFdlYnNpdGUuVFlQRV9IT01FUEFHRSk7Ci0gICAgICAgICAgICAgICAgb3BlcmF0aW9uTGlzdC5hZGQoYnVpbGRlci5idWlsZCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkobUJpcnRoZGF5KSkgewotICAgICAgICAgICAgYnVpbGRlciA9IENvbnRlbnRQcm92aWRlck9wZXJhdGlvbi5uZXdJbnNlcnQoRGF0YS5DT05URU5UX1VSSSk7Ci0gICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZUJhY2tSZWZlcmVuY2UoRXZlbnQuUkFXX0NPTlRBQ1RfSUQsIDApOwotICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoRGF0YS5NSU1FVFlQRSwgRXZlbnQuQ09OVEVOVF9JVEVNX1RZUEUpOwotICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoRXZlbnQuU1RBUlRfREFURSwgbUJpcnRoZGF5KTsKLSAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKEV2ZW50LlRZUEUsIEV2ZW50LlRZUEVfQklSVEhEQVkpOwotICAgICAgICAgICAgb3BlcmF0aW9uTGlzdC5hZGQoYnVpbGRlci5idWlsZCgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtQW5kcm9pZEN1c3RvbVByb3BlcnR5TGlzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKExpc3Q8U3RyaW5nPiBjdXN0b21Qcm9wZXJ0eUxpc3QgOiBtQW5kcm9pZEN1c3RvbVByb3BlcnR5TGlzdCkgewotICAgICAgICAgICAgICAgIGludCBzaXplID0gY3VzdG9tUHJvcGVydHlMaXN0LnNpemUoKTsKLSAgICAgICAgICAgICAgICBpZiAoc2l6ZSA8IDIgfHwgVGV4dFV0aWxzLmlzRW1wdHkoY3VzdG9tUHJvcGVydHlMaXN0LmdldCgwKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzaXplID4gVkNhcmRDb25zdGFudHMuTUFYX0RBVEFfQ09MVU1OICsgMSkgewotICAgICAgICAgICAgICAgICAgICBzaXplID0gVkNhcmRDb25zdGFudHMuTUFYX0RBVEFfQ09MVU1OICsgMTsKLSAgICAgICAgICAgICAgICAgICAgY3VzdG9tUHJvcGVydHlMaXN0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIGN1c3RvbVByb3BlcnR5TGlzdC5zdWJMaXN0KDAsIFZDYXJkQ29uc3RhbnRzLk1BWF9EQVRBX0NPTFVNTiArIDIpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGludCBpID0gMDsKLSAgICAgICAgICAgICAgICBmb3IgKGZpbmFsIFN0cmluZyBjdXN0b21Qcm9wZXJ0eVZhbHVlIDogY3VzdG9tUHJvcGVydHlMaXN0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtaW1lVHlwZSA9IGN1c3RvbVByb3BlcnR5VmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyID0gQ29udGVudFByb3ZpZGVyT3BlcmF0aW9uLm5ld0luc2VydChEYXRhLkNPTlRFTlRfVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlQmFja1JlZmVyZW5jZShHcm91cE1lbWJlcnNoaXAuUkFXX0NPTlRBQ1RfSUQsIDApOwotICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoRGF0YS5NSU1FVFlQRSwgbWltZVR5cGUpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeyAgLy8gMSA8PSBpICYmIGkgPD0gTUFYX0RBVEFfQ09MVU1OUwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShjdXN0b21Qcm9wZXJ0eVZhbHVlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKCJkYXRhIiArIGksIGN1c3RvbVByb3BlcnR5VmFsdWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaSsrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBvcGVyYXRpb25MaXN0LmFkZChidWlsZGVyLmJ1aWxkKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG15R3JvdXBzSWQgIT0gbnVsbCkgewotICAgICAgICAgICAgYnVpbGRlciA9IENvbnRlbnRQcm92aWRlck9wZXJhdGlvbi5uZXdJbnNlcnQoRGF0YS5DT05URU5UX1VSSSk7Ci0gICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZUJhY2tSZWZlcmVuY2UoR3JvdXBNZW1iZXJzaGlwLlJBV19DT05UQUNUX0lELCAwKTsKLSAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKERhdGEuTUlNRVRZUEUsIEdyb3VwTWVtYmVyc2hpcC5DT05URU5UX0lURU1fVFlQRSk7Ci0gICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShHcm91cE1lbWJlcnNoaXAuR1JPVVBfU09VUkNFX0lELCBteUdyb3Vwc0lkKTsKLSAgICAgICAgICAgIG9wZXJhdGlvbkxpc3QuYWRkKGJ1aWxkZXIuYnVpbGQoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgQ29udGVudFByb3ZpZGVyUmVzdWx0W10gcmVzdWx0cyA9IHJlc29sdmVyLmFwcGx5QmF0Y2goCi0gICAgICAgICAgICAgICAgICAgICAgICBDb250YWN0c0NvbnRyYWN0LkFVVEhPUklUWSwgb3BlcmF0aW9uTGlzdCk7Ci0gICAgICAgICAgICAvLyB0aGUgZmlyc3QgcmVzdWx0IGlzIGFsd2F5cyB0aGUgcmF3X2NvbnRhY3QuIHJldHVybiBpdCdzIHVyaSBzbwotICAgICAgICAgICAgLy8gdGhhdCBpdCBjYW4gYmUgZm91bmQgbGF0ZXIuIGRvIG51bGwgY2hlY2tpbmcgZm9yIGJhZGx5IGJlaGF2aW5nCi0gICAgICAgICAgICAvLyBDb250ZW50UmVzb2x2ZXJzCi0gICAgICAgICAgICByZXR1cm4gKHJlc3VsdHMgPT0gbnVsbCB8fCByZXN1bHRzLmxlbmd0aCA9PSAwIHx8IHJlc3VsdHNbMF0gPT0gbnVsbCkKLSAgICAgICAgICAgICAgICA/IG51bGwKLSAgICAgICAgICAgICAgICA6IHJlc3VsdHNbMF0udXJpOwotICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgU3RyaW5nLmZvcm1hdCgiJXM6ICVzIiwgZS50b1N0cmluZygpLCBlLmdldE1lc3NhZ2UoKSkpOwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0gY2F0Y2ggKE9wZXJhdGlvbkFwcGxpY2F0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExvZy5lKExPR19UQUcsIFN0cmluZy5mb3JtYXQoIiVzOiAlcyIsIGUudG9TdHJpbmcoKSwgZS5nZXRNZXNzYWdlKCkpKTsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBWQ2FyZEVudHJ5IGJ1aWxkRnJvbVJlc29sdmVyKENvbnRlbnRSZXNvbHZlciByZXNvbHZlcikgewotICAgICAgICByZXR1cm4gYnVpbGRGcm9tUmVzb2x2ZXIocmVzb2x2ZXIsIENvbnRhY3RzLkNPTlRFTlRfVVJJKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFZDYXJkRW50cnkgYnVpbGRGcm9tUmVzb2x2ZXIoQ29udGVudFJlc29sdmVyIHJlc29sdmVyLCBVcmkgdXJpKSB7Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIG5hbWVGaWVsZHNBcmVFbXB0eSgpIHsKLSAgICAgICAgcmV0dXJuIChUZXh0VXRpbHMuaXNFbXB0eShtRmFtaWx5TmFtZSkKLSAgICAgICAgICAgICAgICAmJiBUZXh0VXRpbHMuaXNFbXB0eShtTWlkZGxlTmFtZSkKLSAgICAgICAgICAgICAgICAmJiBUZXh0VXRpbHMuaXNFbXB0eShtR2l2ZW5OYW1lKQotICAgICAgICAgICAgICAgICYmIFRleHRVdGlscy5pc0VtcHR5KG1QcmVmaXgpCi0gICAgICAgICAgICAgICAgJiYgVGV4dFV0aWxzLmlzRW1wdHkobVN1ZmZpeCkKLSAgICAgICAgICAgICAgICAmJiBUZXh0VXRpbHMuaXNFbXB0eShtRnVsbE5hbWUpCi0gICAgICAgICAgICAgICAgJiYgVGV4dFV0aWxzLmlzRW1wdHkobVBob25ldGljRmFtaWx5TmFtZSkKLSAgICAgICAgICAgICAgICAmJiBUZXh0VXRpbHMuaXNFbXB0eShtUGhvbmV0aWNNaWRkbGVOYW1lKQotICAgICAgICAgICAgICAgICYmIFRleHRVdGlscy5pc0VtcHR5KG1QaG9uZXRpY0dpdmVuTmFtZSkKLSAgICAgICAgICAgICAgICAmJiBUZXh0VXRpbHMuaXNFbXB0eShtUGhvbmV0aWNGdWxsTmFtZSkpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzSWdub3JhYmxlKCkgewotICAgICAgICByZXR1cm4gZ2V0RGlzcGxheU5hbWUoKS5sZW5ndGgoKSA9PSAwOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGxpc3RUb1N0cmluZyhMaXN0PFN0cmluZz4gbGlzdCl7Ci0gICAgICAgIGZpbmFsIGludCBzaXplID0gbGlzdC5zaXplKCk7Ci0gICAgICAgIGlmIChzaXplID4gMSkgewotICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgICAgIGludCBpID0gMDsKLSAgICAgICAgICAgIGZvciAoU3RyaW5nIHR5cGUgOiBsaXN0KSB7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQodHlwZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGkgPCBzaXplIC0gMSkgewotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiOyIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBidWlsZGVyLnRvU3RyaW5nKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoc2l6ZSA9PSAxKSB7Ci0gICAgICAgICAgICByZXR1cm4gbGlzdC5nZXQoMCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gIiI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBBbGwgZ2V0dGVyIG1ldGhvZHMgc2hvdWxkIGJlIHVzZWQgY2FyZWZ1bGx5LCBzaW5jZSB0aGV5IG1heSBjaGFuZ2UKLSAgICAvLyBpbiB0aGUgZnV0dXJlIGFzIG9mIDIwMDktMTAtMDUsIG9uIHdoaWNoIEkgY2Fubm90IGJlIHN1cmUgdGhpcyBzdHJ1Y3R1cmUKLSAgICAvLyBpcyBjb21wbGV0ZWx5IGNvbnNvbGlkYXRlZC4KLSAgICAvLwotICAgIC8vIEFsc28gbm90ZSB0aGF0IHRoZXNlIGdldHRlciBtZXRob2RzIHNob3VsZCBiZSB1c2VkIG9ubHkgYWZ0ZXIKLSAgICAvLyBhbGwgcHJvcGVydGllcyBiZWluZyBwdXNoZWQgaW50byB0aGlzIG9iamVjdC4gSWYgbm90LCBpbmNvcnJlY3QKLSAgICAvLyB2YWx1ZSB3aWxsICJiZSBzdG9yZWQgaW4gdGhlIGxvY2FsIGNhY2hlIGFuZCIgYmUgcmV0dXJuZWQgdG8geW91LgotCi0gICAgcHVibGljIFN0cmluZyBnZXRGYW1pbHlOYW1lKCkgewotICAgICAgICByZXR1cm4gbUZhbWlseU5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRHaXZlbk5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBtR2l2ZW5OYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWlkZGxlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG1NaWRkbGVOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJlZml4KCkgewotICAgICAgICByZXR1cm4gbVByZWZpeDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFN1ZmZpeCgpIHsKLSAgICAgICAgcmV0dXJuIG1TdWZmaXg7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRGdWxsTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG1GdWxsTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBob25ldGljRmFtaWx5TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG1QaG9uZXRpY0ZhbWlseU5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRQaG9uZXRpY0dpdmVuTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG1QaG9uZXRpY0dpdmVuTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBob25ldGljTWlkZGxlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG1QaG9uZXRpY01pZGRsZU5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRQaG9uZXRpY0Z1bGxOYW1lKCkgewotICAgICAgICByZXR1cm4gbVBob25ldGljRnVsbE5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIExpc3Q8U3RyaW5nPiBnZXROaWNrTmFtZUxpc3QoKSB7Ci0gICAgICAgIHJldHVybiBtTmlja05hbWVMaXN0OwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QmlydGhkYXkoKSB7Ci0gICAgICAgIHJldHVybiBtQmlydGhkYXk7Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIExpc3Q8U3RyaW5nPiBnZXROb3RlcygpIHsKLSAgICAgICAgcmV0dXJuIG1Ob3RlTGlzdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZmluYWwgTGlzdDxQaG9uZURhdGE+IGdldFBob25lTGlzdCgpIHsKLSAgICAgICAgcmV0dXJuIG1QaG9uZUxpc3Q7Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIExpc3Q8RW1haWxEYXRhPiBnZXRFbWFpbExpc3QoKSB7Ci0gICAgICAgIHJldHVybiBtRW1haWxMaXN0OwotICAgIH0KLQotICAgIHB1YmxpYyBmaW5hbCBMaXN0PFBvc3RhbERhdGE+IGdldFBvc3RhbExpc3QoKSB7Ci0gICAgICAgIHJldHVybiBtUG9zdGFsTGlzdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZmluYWwgTGlzdDxPcmdhbml6YXRpb25EYXRhPiBnZXRPcmdhbml6YXRpb25MaXN0KCkgewotICAgICAgICByZXR1cm4gbU9yZ2FuaXphdGlvbkxpc3Q7Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIExpc3Q8SW1EYXRhPiBnZXRJbUxpc3QoKSB7Ci0gICAgICAgIHJldHVybiBtSW1MaXN0OwotICAgIH0KLQotICAgIHB1YmxpYyBmaW5hbCBMaXN0PFBob3RvRGF0YT4gZ2V0UGhvdG9MaXN0KCkgewotICAgICAgICByZXR1cm4gbVBob3RvTGlzdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZmluYWwgTGlzdDxTdHJpbmc+IGdldFdlYnNpdGVMaXN0KCkgewotICAgICAgICByZXR1cm4gbVdlYnNpdGVMaXN0OwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGlzcGxheU5hbWUoKSB7Ci0gICAgICAgIGlmIChtRGlzcGxheU5hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgY29uc3RydWN0RGlzcGxheU5hbWUoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbURpc3BsYXlOYW1lOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZEVudHJ5Q29tbWl0dGVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRFbnRyeUNvbW1pdHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OWEyYmFmLi4wMDAwMDAwCi0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZEVudHJ5Q29tbWl0dGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC5waW0udmNhcmQ7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyOwotaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotLyoqCi0gKiA8UD4KLSAqIHtAbGluayBWQ2FyZEVudHJ5SGFuZGxlcn0gaW1wbGVtZW50YXRpb24gd2hpY2ggY29tbWl0cyB0aGUgZW50cnkgdG8gQ29udGVudFJlc29sdmVyLgotICogPC9QPgotICogPFA+Ci0gKiBOb3RlOjxCUiAvPgotICogRWFjaCB2Q2FyZCBtYXkgY29udGFpbiBiaWcgcGhvdG8gaW1hZ2VzIGVuY29kZWQgYnkgQkFTRTY0LAotICogSWYgd2Ugc3RvcmUgYWxsIHZDYXJkIGVudHJpZXMgaW4gbWVtb3J5LCBPdXRPZk1lbW9yeUVycm9yIG1heSBiZSB0aHJvd24uCi0gKiBUaHVzLCB0aGlzIGNsYXNzIHB1c2ggZWFjaCBWQ2FyZCBlbnRyeSBpbnRvIENvbnRlbnRSZXNvbHZlciBpbW1lZGlhdGVseS4KLSAqIDwvUD4KLSAqLwotcHVibGljIGNsYXNzIFZDYXJkRW50cnlDb21taXR0ZXIgaW1wbGVtZW50cyBWQ2FyZEVudHJ5SGFuZGxlciB7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgTE9HX1RBRyA9ICJWQ2FyZEVudHJ5Q29taXR0ZXIiOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBDb250ZW50UmVzb2x2ZXIgbUNvbnRlbnRSZXNvbHZlcjsKLSAgICBwcml2YXRlIGxvbmcgbVRpbWVUb0NvbW1pdDsKLSAgICBwcml2YXRlIEFycmF5TGlzdDxVcmk+IG1DcmVhdGVkVXJpcyA9IG5ldyBBcnJheUxpc3Q8VXJpPigpOwotCi0gICAgcHVibGljIFZDYXJkRW50cnlDb21taXR0ZXIoQ29udGVudFJlc29sdmVyIHJlc29sdmVyKSB7Ci0gICAgICAgIG1Db250ZW50UmVzb2x2ZXIgPSByZXNvbHZlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBvblN0YXJ0KCkgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG9uRW5kKCkgewotICAgICAgICBpZiAoVkNhcmRDb25maWcuc2hvd1BlcmZvcm1hbmNlTG9nKCkpIHsKLSAgICAgICAgICAgIExvZy5kKExPR19UQUcsIFN0cmluZy5mb3JtYXQoInRpbWUgdG8gY29tbWl0IGVudHJpZXM6ICVkIG1zIiwgbVRpbWVUb0NvbW1pdCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgb25FbnRyeUNyZWF0ZWQoZmluYWwgVkNhcmRFbnRyeSBjb250YWN0U3RydWN0KSB7Ci0gICAgICAgIGxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgbUNyZWF0ZWRVcmlzLmFkZChjb250YWN0U3RydWN0LnB1c2hJbnRvQ29udGVudFJlc29sdmVyKG1Db250ZW50UmVzb2x2ZXIpKTsKLSAgICAgICAgbVRpbWVUb0NvbW1pdCArPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHN0YXJ0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGxpc3Qgb2YgY3JlYXRlZCBVcmlzLiBUaGlzIGxpc3Qgc2hvdWxkIG5vdCBiZSBtb2RpZmllZCBieSB0aGUgY2FsbGVyIGFzIGl0IGlzCi0gICAgICogbm90IGEgY2xvbmUuCi0gICAgICovCi0gICBwdWJsaWMgQXJyYXlMaXN0PFVyaT4gZ2V0Q3JlYXRlZFVyaXMoKSB7Ci0gICAgICAgIHJldHVybiBtQ3JlYXRlZFVyaXM7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZEVudHJ5Q29uc3RydWN0b3IuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZEVudHJ5Q29uc3RydWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjkwY2EyYi4uMDAwMDAwMAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRFbnRyeUNvbnN0cnVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGFuZHJvaWQucGltLnZjYXJkOwotCi1pbXBvcnQgYW5kcm9pZC5hY2NvdW50cy5BY2NvdW50OwotaW1wb3J0IGFuZHJvaWQudXRpbC5DaGFyc2V0VXRpbHM7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2RlYy5EZWNvZGVyRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2RlYy5iaW5hcnkuQmFzZTY0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2RlYy5uZXQuUXVvdGVkUHJpbnRhYmxlQ29kZWM7Ci0KLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKLWltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotcHVibGljIGNsYXNzIFZDYXJkRW50cnlDb25zdHJ1Y3RvciBpbXBsZW1lbnRzIFZDYXJkSW50ZXJwcmV0ZXIgewotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBMT0dfVEFHID0gIlZDYXJkRW50cnlDb25zdHJ1Y3RvciI7Ci0KLSAgICAvKioKLSAgICAgKiBJZiB0aGVyZSdzIG5vIG90aGVyIGluZm9ybWF0aW9uIGF2YWlsYWJsZSwgdGhpcyBjbGFzcyB1c2VzIHRoaXMgY2hhcnNldCBmb3IgZW5jb2RpbmcKLSAgICAgKiBieXRlIGFycmF5cyB0byBTdHJpbmcuCi0gICAgICovCi0gICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfQ0hBUlNFVF9GT1JfREVDT0RFRF9CWVRFUyA9ICJVVEYtOCI7Ci0KLSAgICBwcml2YXRlIFZDYXJkRW50cnkuUHJvcGVydHkgbUN1cnJlbnRQcm9wZXJ0eSA9IG5ldyBWQ2FyZEVudHJ5LlByb3BlcnR5KCk7Ci0gICAgcHJpdmF0ZSBWQ2FyZEVudHJ5IG1DdXJyZW50Q29udGFjdFN0cnVjdDsKLSAgICBwcml2YXRlIFN0cmluZyBtUGFyYW1UeXBlOwotICAgIAotICAgIC8qKgotICAgICAqIFRoZSBjaGFyc2V0IHVzaW5nIHdoaWNoIHtAbGluayBWQ2FyZEludGVycHJldGVyfSBwYXJzZXMgdGhlIHRleHQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgbUlucHV0Q2hhcnNldDsKLQotICAgIC8qKgotICAgICAqIFRoZSBjaGFyc2V0IHdpdGggd2hpY2ggYnl0ZSBhcnJheSBpcyBlbmNvZGVkIHRvIFN0cmluZy4KLSAgICAgKi8KLSAgICBmaW5hbCBwcml2YXRlIFN0cmluZyBtQ2hhcnNldEZvckRlY29kZWRCeXRlczsKLSAgICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gbVN0cmljdExpbmVCcmVha1BhcnNpbmc7Ci0gICAgZmluYWwgcHJpdmF0ZSBpbnQgbVZDYXJkVHlwZTsKLSAgICBmaW5hbCBwcml2YXRlIEFjY291bnQgbUFjY291bnQ7Ci0gICAgCi0gICAgLyoqIEZvciBtZWFzdXJpbmcgcGVyZm9ybWFuY2UuICovCi0gICAgcHJpdmF0ZSBsb25nIG1UaW1lUHVzaEludG9Db250ZW50UmVzb2x2ZXI7Ci0KLSAgICBmaW5hbCBwcml2YXRlIExpc3Q8VkNhcmRFbnRyeUhhbmRsZXI+IG1FbnRyeUhhbmRsZXJzID0gbmV3IEFycmF5TGlzdDxWQ2FyZEVudHJ5SGFuZGxlcj4oKTsKLQotICAgIHB1YmxpYyBWQ2FyZEVudHJ5Q29uc3RydWN0b3IoKSB7Ci0gICAgICAgIHRoaXMobnVsbCwgbnVsbCwgZmFsc2UsIFZDYXJkQ29uZmlnLlZDQVJEX1RZUEVfVjIxX0dFTkVSSUNfVVRGOCwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIFZDYXJkRW50cnlDb25zdHJ1Y3RvcihmaW5hbCBpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIHRoaXMobnVsbCwgbnVsbCwgZmFsc2UsIHZjYXJkVHlwZSwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIFZDYXJkRW50cnlDb25zdHJ1Y3RvcihmaW5hbCBTdHJpbmcgY2hhcnNldCwgZmluYWwgYm9vbGVhbiBzdHJpY3RMaW5lQnJlYWtQYXJzaW5nLAotICAgICAgICAgICAgZmluYWwgaW50IHZjYXJkVHlwZSwgZmluYWwgQWNjb3VudCBhY2NvdW50KSB7Ci0gICAgICAgIHRoaXMobnVsbCwgY2hhcnNldCwgc3RyaWN0TGluZUJyZWFrUGFyc2luZywgdmNhcmRUeXBlLCBhY2NvdW50KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVkNhcmRFbnRyeUNvbnN0cnVjdG9yKGZpbmFsIFN0cmluZyBpbnB1dENoYXJzZXQsIGZpbmFsIFN0cmluZyBjaGFyc2V0Rm9yRGV0b2RlZEJ5dGVzLAotICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBzdHJpY3RMaW5lQnJlYWtQYXJzaW5nLCBmaW5hbCBpbnQgdmNhcmRUeXBlLAotICAgICAgICAgICAgZmluYWwgQWNjb3VudCBhY2NvdW50KSB7Ci0gICAgICAgIGlmIChpbnB1dENoYXJzZXQgIT0gbnVsbCkgewotICAgICAgICAgICAgbUlucHV0Q2hhcnNldCA9IGlucHV0Q2hhcnNldDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1JbnB1dENoYXJzZXQgPSBWQ2FyZENvbmZpZy5ERUZBVUxUX0NIQVJTRVQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNoYXJzZXRGb3JEZXRvZGVkQnl0ZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgbUNoYXJzZXRGb3JEZWNvZGVkQnl0ZXMgPSBjaGFyc2V0Rm9yRGV0b2RlZEJ5dGVzOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbUNoYXJzZXRGb3JEZWNvZGVkQnl0ZXMgPSBERUZBVUxUX0NIQVJTRVRfRk9SX0RFQ09ERURfQllURVM7Ci0gICAgICAgIH0KLSAgICAgICAgbVN0cmljdExpbmVCcmVha1BhcnNpbmcgPSBzdHJpY3RMaW5lQnJlYWtQYXJzaW5nOwotICAgICAgICBtVkNhcmRUeXBlID0gdmNhcmRUeXBlOwotICAgICAgICBtQWNjb3VudCA9IGFjY291bnQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkRW50cnlIYW5kbGVyKFZDYXJkRW50cnlIYW5kbGVyIGVudHJ5SGFuZGxlcikgewotICAgICAgICBtRW50cnlIYW5kbGVycy5hZGQoZW50cnlIYW5kbGVyKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc3RhcnQoKSB7Ci0gICAgICAgIGZvciAoVkNhcmRFbnRyeUhhbmRsZXIgZW50cnlIYW5kbGVyIDogbUVudHJ5SGFuZGxlcnMpIHsKLSAgICAgICAgICAgIGVudHJ5SGFuZGxlci5vblN0YXJ0KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBlbmQoKSB7Ci0gICAgICAgIGZvciAoVkNhcmRFbnRyeUhhbmRsZXIgZW50cnlIYW5kbGVyIDogbUVudHJ5SGFuZGxlcnMpIHsKLSAgICAgICAgICAgIGVudHJ5SGFuZGxlci5vbkVuZCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIHdoZW4gdGhlIHBhcnNlIGZhaWxlZCBiZXR3ZWVuIHtAbGluayAjc3RhcnRFbnRyeSgpfSBhbmQge0BsaW5rICNlbmRFbnRyeSgpfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKLSAgICAgICAgbUN1cnJlbnRDb250YWN0U3RydWN0ID0gbnVsbDsKLSAgICAgICAgbUN1cnJlbnRQcm9wZXJ0eSA9IG5ldyBWQ2FyZEVudHJ5LlByb3BlcnR5KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQXNzdW1lIHRoYXQgVkNhcmQgaXMgbm90IG5lc3RlZC4gSW4gb3RoZXIgd29yZHMsIHRoaXMgY29kZSBkb2VzIG5vdCBhY2NlcHQgCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc3RhcnRFbnRyeSgpIHsKLSAgICAgICAgaWYgKG1DdXJyZW50Q29udGFjdFN0cnVjdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiTmVzdGVkIFZDYXJkIGNvZGUgaXMgbm90IHN1cHBvcnRlZCBub3cuIik7Ci0gICAgICAgIH0KLSAgICAgICAgbUN1cnJlbnRDb250YWN0U3RydWN0ID0gbmV3IFZDYXJkRW50cnkobVZDYXJkVHlwZSwgbUFjY291bnQpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGVuZEVudHJ5KCkgewotICAgICAgICBtQ3VycmVudENvbnRhY3RTdHJ1Y3QuY29uc29saWRhdGVGaWVsZHMoKTsKLSAgICAgICAgZm9yIChWQ2FyZEVudHJ5SGFuZGxlciBlbnRyeUhhbmRsZXIgOiBtRW50cnlIYW5kbGVycykgewotICAgICAgICAgICAgZW50cnlIYW5kbGVyLm9uRW50cnlDcmVhdGVkKG1DdXJyZW50Q29udGFjdFN0cnVjdCk7Ci0gICAgICAgIH0KLSAgICAgICAgbUN1cnJlbnRDb250YWN0U3RydWN0ID0gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzdGFydFByb3BlcnR5KCkgewotICAgICAgICBtQ3VycmVudFByb3BlcnR5LmNsZWFyKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZW5kUHJvcGVydHkoKSB7Ci0gICAgICAgIG1DdXJyZW50Q29udGFjdFN0cnVjdC5hZGRQcm9wZXJ0eShtQ3VycmVudFByb3BlcnR5KTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgcHJvcGVydHlOYW1lKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIG1DdXJyZW50UHJvcGVydHkuc2V0UHJvcGVydHlOYW1lKG5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHByb3BlcnR5R3JvdXAoU3RyaW5nIGdyb3VwKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHJvcGVydHlQYXJhbVR5cGUoU3RyaW5nIHR5cGUpIHsKLSAgICAgICAgaWYgKG1QYXJhbVR5cGUgIT0gbnVsbCkgewotICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgInByb3BlcnR5UGFyYW1UeXBlKCkgaXMgY2FsbGVkIG1vcmUgdGhhbiBvbmNlICIgKwotICAgICAgICAgICAgICAgICAgICAiYmVmb3JlIHByb3BlcnR5UGFyYW1WYWx1ZSgpIGlzIGNhbGxlZCIpOwotICAgICAgICB9Ci0gICAgICAgIG1QYXJhbVR5cGUgPSB0eXBlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHByb3BlcnR5UGFyYW1WYWx1ZShTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgaWYgKG1QYXJhbVR5cGUgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gRnJvbSB2Q2FyZCAyLjEgc3BlY2lmaWNhdGlvbi4gdkNhcmQgMy4wIGZvcm1hbGx5IGRvZXMgbm90IGFsbG93IHRoaXMgY2FzZS4KLSAgICAgICAgICAgIG1QYXJhbVR5cGUgPSAiVFlQRSI7Ci0gICAgICAgIH0KLSAgICAgICAgbUN1cnJlbnRQcm9wZXJ0eS5hZGRQYXJhbWV0ZXIobVBhcmFtVHlwZSwgdmFsdWUpOwotICAgICAgICBtUGFyYW1UeXBlID0gbnVsbDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBlbmNvZGVTdHJpbmcoU3RyaW5nIG9yaWdpbmFsU3RyaW5nLCBTdHJpbmcgY2hhcnNldEZvckRlY29kZWRCeXRlcykgewotICAgICAgICBpZiAobUlucHV0Q2hhcnNldC5lcXVhbHNJZ25vcmVDYXNlKGNoYXJzZXRGb3JEZWNvZGVkQnl0ZXMpKSB7Ci0gICAgICAgICAgICByZXR1cm4gb3JpZ2luYWxTdHJpbmc7Ci0gICAgICAgIH0KLSAgICAgICAgQ2hhcnNldCBjaGFyc2V0ID0gQ2hhcnNldC5mb3JOYW1lKG1JbnB1dENoYXJzZXQpOwotICAgICAgICBCeXRlQnVmZmVyIGJ5dGVCdWZmZXIgPSBjaGFyc2V0LmVuY29kZShvcmlnaW5hbFN0cmluZyk7Ci0gICAgICAgIC8vIGJ5dGVCdWZmZXIuYXJyYXkoKSAibWF5IiByZXR1cm4gYnl0ZSBhcnJheSB3aGljaCBpcyBsYXJnZXIgdGhhbgotICAgICAgICAvLyBieXRlQnVmZmVyLnJlbWFpbmluZygpLiBIZXJlLCB3ZSBrZWVwIG9uIHRoZSBzYWZlIHNpZGUuCi0gICAgICAgIGJ5dGVbXSBieXRlcyA9IG5ldyBieXRlW2J5dGVCdWZmZXIucmVtYWluaW5nKCldOwotICAgICAgICBieXRlQnVmZmVyLmdldChieXRlcyk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhieXRlcywgY2hhcnNldEZvckRlY29kZWRCeXRlcyk7Ci0gICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIkZhaWxlZCB0byBlbmNvZGU6IGNoYXJzZXQ9IiArIGNoYXJzZXRGb3JEZWNvZGVkQnl0ZXMpOwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBoYW5kbGVPbmVWYWx1ZShTdHJpbmcgdmFsdWUsIFN0cmluZyBjaGFyc2V0Rm9yRGVjb2RlZEJ5dGVzLCBTdHJpbmcgZW5jb2RpbmcpIHsKLSAgICAgICAgaWYgKGVuY29kaW5nICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChlbmNvZGluZy5lcXVhbHMoIkJBU0U2NCIpIHx8IGVuY29kaW5nLmVxdWFscygiQiIpKSB7Ci0gICAgICAgICAgICAgICAgbUN1cnJlbnRQcm9wZXJ0eS5zZXRQcm9wZXJ0eUJ5dGVzKEJhc2U2NC5kZWNvZGVCYXNlNjQodmFsdWUuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZW5jb2RpbmcuZXF1YWxzKCJRVU9URUQtUFJJTlRBQkxFIikpIHsKLSAgICAgICAgICAgICAgICAvLyAiPSAiIC0+ICIgIiwgIj1cdCIgLT4gIlx0Ii4KLSAgICAgICAgICAgICAgICAvLyBQcmV2aW91cyBjb2RlIGhhZCBkb25lIHRoaXMgcmVwbGFjZW1lbnQuIEtlZXAgb24gdGhlIHNhZmUgc2lkZS4KLSAgICAgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICAgICAgICAgIGludCBsZW5ndGggPSB2YWx1ZS5sZW5ndGgoKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNoYXIgY2ggPSB2YWx1ZS5jaGFyQXQoaSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjaCA9PSAnPScgJiYgaSA8IGxlbmd0aCAtIDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgbmV4dENoID0gdmFsdWUuY2hhckF0KGkgKyAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXh0Q2ggPT0gJyAnIHx8IG5leHRDaCA9PSAnXHQnKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChuZXh0Q2gpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChjaCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFN0cmluZyBxdW90ZWRQcmludGFibGUgPSBidWlsZGVyLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgU3RyaW5nW10gbGluZXM7Ci0gICAgICAgICAgICAgICAgaWYgKG1TdHJpY3RMaW5lQnJlYWtQYXJzaW5nKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxpbmVzID0gcXVvdGVkUHJpbnRhYmxlLnNwbGl0KCJcclxuIik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgICAgICAgICAgICAgIGxlbmd0aCA9IHF1b3RlZFByaW50YWJsZS5sZW5ndGgoKTsKLSAgICAgICAgICAgICAgICAgICAgQXJyYXlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGNoID0gcXVvdGVkUHJpbnRhYmxlLmNoYXJBdChpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaCA9PSAnXG4nKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdC5hZGQoYnVpbGRlci50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJ1xyJykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QuYWRkKGJ1aWxkZXIudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgPCBsZW5ndGggLSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgbmV4dENoID0gcXVvdGVkUHJpbnRhYmxlLmNoYXJBdChpICsgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXh0Q2ggPT0gJ1xuJykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSsrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChjaCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGZpbmFsTGluZSA9IGJ1aWxkZXIudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZpbmFsTGluZS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QuYWRkKGZpbmFsTGluZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbGluZXMgPSBsaXN0LnRvQXJyYXkobmV3IFN0cmluZ1swXSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIGxpbmUgOiBsaW5lcykgewotICAgICAgICAgICAgICAgICAgICBpZiAobGluZS5lbmRzV2l0aCgiPSIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsaW5lID0gbGluZS5zdWJzdHJpbmcoMCwgbGluZS5sZW5ndGgoKSAtIDEpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGxpbmUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBieXRlW10gYnl0ZXM7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgYnl0ZXMgPSBidWlsZGVyLnRvU3RyaW5nKCkuZ2V0Qnl0ZXMobUlucHV0Q2hhcnNldCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlMSkgewotICAgICAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiRmFpbGVkIHRvIGVuY29kZTogY2hhcnNldD0iICsgbUlucHV0Q2hhcnNldCk7Ci0gICAgICAgICAgICAgICAgICAgIGJ5dGVzID0gYnVpbGRlci50b1N0cmluZygpLmdldEJ5dGVzKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ5dGVzID0gUXVvdGVkUHJpbnRhYmxlQ29kZWMuZGVjb2RlUXVvdGVkUHJpbnRhYmxlKGJ5dGVzKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChEZWNvZGVyRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIkZhaWxlZCB0byBkZWNvZGUgcXVvdGVkLXByaW50YWJsZTogIiArIGUpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gIiI7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoYnl0ZXMsIGNoYXJzZXRGb3JEZWNvZGVkQnl0ZXMpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiRmFpbGVkIHRvIGVuY29kZTogY2hhcnNldD0iICsgY2hhcnNldEZvckRlY29kZWRCeXRlcyk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nKGJ5dGVzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBVbmtub3duIGVuY29kaW5nLiBGYWxsIGJhY2sgdG8gZGVmYXVsdC4KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZW5jb2RlU3RyaW5nKHZhbHVlLCBjaGFyc2V0Rm9yRGVjb2RlZEJ5dGVzKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgcHJvcGVydHlWYWx1ZXMoTGlzdDxTdHJpbmc+IHZhbHVlcykgewotICAgICAgICBpZiAodmFsdWVzID09IG51bGwgfHwgdmFsdWVzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgQ29sbGVjdGlvbjxTdHJpbmc+IGNoYXJzZXRDb2xsZWN0aW9uID0gbUN1cnJlbnRQcm9wZXJ0eS5nZXRQYXJhbWV0ZXJzKCJDSEFSU0VUIik7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBjaGFyc2V0ID0KLSAgICAgICAgICAgICgoY2hhcnNldENvbGxlY3Rpb24gIT0gbnVsbCkgPyBjaGFyc2V0Q29sbGVjdGlvbi5pdGVyYXRvcigpLm5leHQoKSA6IG51bGwpOwotICAgICAgICBmaW5hbCBDb2xsZWN0aW9uPFN0cmluZz4gZW5jb2RpbmdDb2xsZWN0aW9uID0gbUN1cnJlbnRQcm9wZXJ0eS5nZXRQYXJhbWV0ZXJzKCJFTkNPRElORyIpOwotICAgICAgICBmaW5hbCBTdHJpbmcgZW5jb2RpbmcgPQotICAgICAgICAgICAgKChlbmNvZGluZ0NvbGxlY3Rpb24gIT0gbnVsbCkgPyBlbmNvZGluZ0NvbGxlY3Rpb24uaXRlcmF0b3IoKS5uZXh0KCkgOiBudWxsKTsKLQotICAgICAgICBTdHJpbmcgY2hhcnNldEZvckRlY29kZWRCeXRlcyA9IENoYXJzZXRVdGlscy5uYW1lRm9yRGVmYXVsdFZlbmRvcihjaGFyc2V0KTsKLSAgICAgICAgaWYgKGNoYXJzZXRGb3JEZWNvZGVkQnl0ZXMgPT0gbnVsbCB8fCBjaGFyc2V0Rm9yRGVjb2RlZEJ5dGVzLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgIGNoYXJzZXRGb3JEZWNvZGVkQnl0ZXMgPSBtQ2hhcnNldEZvckRlY29kZWRCeXRlczsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoZmluYWwgU3RyaW5nIHZhbHVlIDogdmFsdWVzKSB7Ci0gICAgICAgICAgICBtQ3VycmVudFByb3BlcnR5LmFkZFRvUHJvcGVydHlWYWx1ZUxpc3QoCi0gICAgICAgICAgICAgICAgICAgIGhhbmRsZU9uZVZhbHVlKHZhbHVlLCBjaGFyc2V0Rm9yRGVjb2RlZEJ5dGVzLCBlbmNvZGluZykpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2hvd1BlcmZvcm1hbmNlSW5mbygpIHsKLSAgICAgICAgTG9nLmQoTE9HX1RBRywgInRpbWUgZm9yIGluc2VydCBDb250YWN0U3RydWN0IHRvIGRhdGFiYXNlOiAiICsgCi0gICAgICAgICAgICAgICAgbVRpbWVQdXNoSW50b0NvbnRlbnRSZXNvbHZlciArICIgbXMiKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRFbnRyeUNvdW50ZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZEVudHJ5Q291bnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YmFiNTBkLi4wMDAwMDAwCi0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZEVudHJ5Q291bnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGFuZHJvaWQucGltLnZjYXJkOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogVGhlIGNsYXNzIHdoaWNoIGp1c3QgY291bnRzIHRoZSBudW1iZXIgb2YgdkNhcmQgZW50cmllcyBpbiB0aGUgc3BlY2lmaWVkIGlucHV0LgotICovCi1wdWJsaWMgY2xhc3MgVkNhcmRFbnRyeUNvdW50ZXIgaW1wbGVtZW50cyBWQ2FyZEludGVycHJldGVyIHsKLSAgICBwcml2YXRlIGludCBtQ291bnQ7Ci0KLSAgICBwdWJsaWMgaW50IGdldENvdW50KCkgewotICAgICAgICByZXR1cm4gbUNvdW50OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHN0YXJ0KCkgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGVuZCgpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzdGFydEVudHJ5KCkgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGVuZEVudHJ5KCkgewotICAgICAgICBtQ291bnQrKzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzdGFydFByb3BlcnR5KCkgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGVuZFByb3BlcnR5KCkgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHByb3BlcnR5R3JvdXAoU3RyaW5nIGdyb3VwKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHJvcGVydHlOYW1lKFN0cmluZyBuYW1lKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHJvcGVydHlQYXJhbVR5cGUoU3RyaW5nIHR5cGUpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwcm9wZXJ0eVBhcmFtVmFsdWUoU3RyaW5nIHZhbHVlKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHJvcGVydHlWYWx1ZXMoTGlzdDxTdHJpbmc+IHZhbHVlcykgewotICAgIH0gICAgCi19CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRFbnRyeUhhbmRsZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZEVudHJ5SGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4M2E2N2ZlLi4wMDAwMDAwCi0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZEVudHJ5SGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGFuZHJvaWQucGltLnZjYXJkOwotCi0vKioKLSAqIFRoZSBpbnRlcmZhY2UgY2FsbGVkIGJ5IHtAbGluayBWQ2FyZEVudHJ5Q29uc3RydWN0b3J9LiBVc2VmdWwgd2hlbiB5b3UgZG9uJ3Qgd2FudCB0bwotICogaGFuZGxlIGRldGFpbGVkIGluZm9ybWF0aW9uIGFzIHdoYXQge0BsaW5rIFZDYXJkUGFyc2VyfSBwcm92aWRlcyB2aWEge0BsaW5rIFZDYXJkSW50ZXJwcmV0ZXJ9LgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFZDYXJkRW50cnlIYW5kbGVyIHsKLSAgICAvKioKLSAgICAgKiBDYWxsZWQgd2hlbiB0aGUgcGFyc2luZyBzdGFydGVkLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG9uU3RhcnQoKTsKLQotICAgIC8qKgotICAgICAqIFRoZSBtZXRob2QgY2FsbGVkIHdoZW4gb25lIFZDYXJkIGVudHJ5IGlzIHN1Y2Nlc3NmdWxseSBjcmVhdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgb25FbnRyeUNyZWF0ZWQoZmluYWwgVkNhcmRFbnRyeSBlbnRyeSk7Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgd2hlbiB0aGUgcGFyc2luZyBlbmRlZC4KLSAgICAgKiBBYmxlIHRvIGJlIHVzZSB0aGlzIG1ldGhvZCBmb3Igc2hvd2luZyBwZXJmb3JtYW5jZSBsb2csIGV0Yy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBvbkVuZCgpOwotfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkSW50ZXJwcmV0ZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZEludGVycHJldGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1MjM3YzAuLjAwMDAwMDAKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkSW50ZXJwcmV0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC5waW0udmNhcmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiA8UD4KLSAqIFRoZSBpbnRlcmZhY2Ugd2hpY2ggc2hvdWxkIGJlIGltcGxlbWVudGVkIGJ5IHRoZSBjbGFzc2VzIHdoaWNoIGhhdmUgdG8gYW5hbHl6ZSBlYWNoCi0gKiB2Q2FyZCBlbnRyeSBtb3JlIG1pbnV0ZWx5IHRoYW4ge0BsaW5rIFZDYXJkRW50cnl9IGNsYXNzIGFuYWx5c2lzLgotICogPC9QPgotICogPFA+Ci0gKiBIZXJlLCB0aGVyZSBhcmUgc2V2ZXJhbCB0ZXJtcyBzcGVjaWZpYyB0byB2Q2FyZCAoYW5kIHRoaXMgbGlicmFyeSkuCi0gKiA8L1A+Ci0gKiA8UD4KLSAqIFRoZSB0ZXJtICJlbnRyeSIgaXMgb25lIHZDYXJkIHJlcHJlc2VudGF0aW9uIGluIHRoZSBpbnB1dCwgd2hpY2ggc2hvdWxkIHN0YXJ0IHdpdGggIkJFR0lOOlZDQVJEIgotICogYW5kIGVuZCB3aXRoICJFTkQ6VkNBUkQiLgotICogPC9QPgotICogPFA+Ci0gKiBUaGUgdGVybSAicHJvcGVydHkiIGlzIG9uZSBsaW5lIGluIHZDYXJkIGVudHJ5LCB3aGljaCBjb25zaXN0cyBvZiAiZ3JvdXAiLCAicHJvcGVydHkgbmFtZSIsCi0gKiAicGFyYW1ldGVyKHBhcmFtKSBuYW1lcyBhbmQgdmFsdWVzIiwgYW5kICJwcm9wZXJ0eSB2YWx1ZXMiLgotICogPC9QPgotICogPFA+Ci0gKiBlLmcuIGdyb3VwMS5wcm9wTmFtZTtwYXJhbU5hbWUxPXBhcmFtVmFsdWUxO3BhcmFtTmFtZTI9cGFyYW1WYWx1ZTI7cHJvcGVydHlWYWx1ZTE7cHJvcGVydHlWYWx1ZTIuLi4KLSAqIDwvUD4KLSAqLwotcHVibGljIGludGVyZmFjZSBWQ2FyZEludGVycHJldGVyIHsKLSAgICAvKioKLSAgICAgKiBDYWxsZWQgd2hlbiB2Q2FyZCBpbnRlcnByZXRhdGlvbiBzdGFydGVkLgotICAgICAqLwotICAgIHZvaWQgc3RhcnQoKTsKLQotICAgIC8qKgotICAgICAqIENhbGxlZCB3aGVuIHZDYXJkIGludGVycHJldGF0aW9uIGZpbmlzaGVkLgotICAgICAqLwotICAgIHZvaWQgZW5kKCk7Ci0KLSAgICAvKiogCi0gICAgICogQ2FsbGVkIHdoZW4gcGFyc2luZyBvbmUgdkNhcmQgZW50cnkgc3RhcnRlZC4KLSAgICAgKiBNb3JlIHNwZWNpZmljYWxseSwgdGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gIkJFR0lOOlZDQVJEIiBpcyByZWFkLgotICAgICAqLwotICAgIHZvaWQgc3RhcnRFbnRyeSgpOwotCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIHdoZW4gcGFyc2luZyBvbmUgdkNhcmQgZW50cnkgZW5kZWQuCi0gICAgICogTW9yZSBzcGVjaWZpY2FsbHksIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuICJFTkQ6VkNBUkQiIGlzIHJlYWQuCi0gICAgICogTm90ZSB0aGF0IHtAbGluayAjc3RhcnRFbnRyeSgpfSBtYXkgYmUgY2FsbGVkIHNpbmNlCi0gICAgICogdkNhcmQgKGVzcGVjaWFsbHkgMi4xKSBhbGxvd3MgbmVzdGVkIHZDYXJkLgotICAgICAqLwotICAgIHZvaWQgZW5kRW50cnkoKTsKLQotICAgIC8qKgotICAgICAqIENhbGxlZCB3aGVuIHJlYWRpbmcgb25lIHByb3BlcnR5IHN0YXJ0ZWQuCi0gICAgICovCi0gICAgdm9pZCBzdGFydFByb3BlcnR5KCk7Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgd2hlbiByZWFkaW5nIG9uZSBwcm9wZXJ0eSBlbmRlZC4KLSAgICAgKi8KLSAgICB2b2lkIGVuZFByb3BlcnR5KCk7Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gZ3JvdXAgQSBncm91cCBuYW1lLiBUaGlzIG1ldGhvZCBtYXkgYmUgY2FsbGVkIG1vcmUgdGhhbiBvbmNlIG9yIG1heSBub3QgYmUKLSAgICAgKiBjYWxsZWQgYXQgYWxsLCBkZXBlbmRpbmcgb24gaG93IG1hbnkgZ3J1b3VwcyBhcmUgYXBwZW5kZWQgdG8gdGhlIHByb3BlcnR5LgotICAgICAqLwotICAgIHZvaWQgcHJvcGVydHlHcm91cChTdHJpbmcgZ3JvdXApOwotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIG5hbWUgQSBwcm9wZXJ0eSBuYW1lIGxpa2UgIk4iLCAiRk4iLCAiQURSIiwgZXRjLgotICAgICAqLwotICAgIHZvaWQgcHJvcGVydHlOYW1lKFN0cmluZyBuYW1lKTsKLQotICAgIC8qKgotICAgICAqIEBwYXJhbSB0eXBlIEEgcGFyYW1ldGVyIG5hbWUgbGlrZSAiRU5DT0RJTkciLCAiQ0hBUlNFVCIsIGV0Yy4KLSAgICAgKi8KLSAgICB2b2lkIHByb3BlcnR5UGFyYW1UeXBlKFN0cmluZyB0eXBlKTsKLQotICAgIC8qKgotICAgICAqIEBwYXJhbSB2YWx1ZSBBIHBhcmFtZXRlciB2YWx1ZS4gVGhpcyBtZXRob2QgbWF5IGJlIGNhbGxlZCB3aXRob3V0Ci0gICAgICoge0BsaW5rICNwcm9wZXJ0eVBhcmFtVHlwZShTdHJpbmcpfSBiZWluZyBjYWxsZWQgKHdoZW4gdGhlIHZDYXJkIGlzIHZDYXJkIDIuMSkuCi0gICAgICovCi0gICAgdm9pZCBwcm9wZXJ0eVBhcmFtVmFsdWUoU3RyaW5nIHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqIEBwYXJhbSB2YWx1ZXMgTGlzdCBvZiBwcm9wZXJ0eSB2YWx1ZXMuIFRoZSBzaXplIG9mIHZhbHVlcyB3b3VsZCBiZSAxIHVubGVzcwotICAgICAqIGNvcmVzc3BvbmRpbmcgcHJvcGVydHkgbmFtZSBpcyAiTiIsICJBRFIiLCBvciAiT1JHIi4KLSAgICAgKi8KLSAgICB2b2lkIHByb3BlcnR5VmFsdWVzKExpc3Q8U3RyaW5nPiB2YWx1ZXMpOwotfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkSW50ZXJwcmV0ZXJDb2xsZWN0aW9uLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRJbnRlcnByZXRlckNvbGxlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTlmODFmNy4uMDAwMDAwMAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRJbnRlcnByZXRlckNvbGxlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC5waW0udmNhcmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBUaGUge0BsaW5rIFZDYXJkSW50ZXJwcmV0ZXJ9IGltcGxlbWVudGF0aW9uIHdoaWNoIGFnZ3JlZ2F0ZXMgbW9yZSB0aGFuIG9uZQotICoge0BsaW5rIFZDYXJkSW50ZXJwcmV0ZXJ9IG9iamVjdHMgYW5kIG1ha2UgYSB1c2VyIG9iamVjdCB0cmVhdCB0aGVtIGFzIG9uZQotICoge0BsaW5rIFZDYXJkSW50ZXJwcmV0ZXJ9IG9iamVjdC4KLSAqLwotcHVibGljIGNsYXNzIFZDYXJkSW50ZXJwcmV0ZXJDb2xsZWN0aW9uIGltcGxlbWVudHMgVkNhcmRJbnRlcnByZXRlciB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBDb2xsZWN0aW9uPFZDYXJkSW50ZXJwcmV0ZXI+IG1JbnRlcnByZXRlckNvbGxlY3Rpb247Ci0gICAgCi0gICAgcHVibGljIFZDYXJkSW50ZXJwcmV0ZXJDb2xsZWN0aW9uKENvbGxlY3Rpb248VkNhcmRJbnRlcnByZXRlcj4gaW50ZXJwcmV0ZXJDb2xsZWN0aW9uKSB7Ci0gICAgICAgIG1JbnRlcnByZXRlckNvbGxlY3Rpb24gPSBpbnRlcnByZXRlckNvbGxlY3Rpb247Ci0gICAgfQotCi0gICAgcHVibGljIENvbGxlY3Rpb248VkNhcmRJbnRlcnByZXRlcj4gZ2V0Q29sbGVjdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIG1JbnRlcnByZXRlckNvbGxlY3Rpb247Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc3RhcnQoKSB7Ci0gICAgICAgIGZvciAoVkNhcmRJbnRlcnByZXRlciBidWlsZGVyIDogbUludGVycHJldGVyQ29sbGVjdGlvbikgewotICAgICAgICAgICAgYnVpbGRlci5zdGFydCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZW5kKCkgewotICAgICAgICBmb3IgKFZDYXJkSW50ZXJwcmV0ZXIgYnVpbGRlciA6IG1JbnRlcnByZXRlckNvbGxlY3Rpb24pIHsKLSAgICAgICAgICAgIGJ1aWxkZXIuZW5kKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzdGFydEVudHJ5KCkgewotICAgICAgICBmb3IgKFZDYXJkSW50ZXJwcmV0ZXIgYnVpbGRlciA6IG1JbnRlcnByZXRlckNvbGxlY3Rpb24pIHsKLSAgICAgICAgICAgIGJ1aWxkZXIuc3RhcnRFbnRyeSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZW5kRW50cnkoKSB7Ci0gICAgICAgIGZvciAoVkNhcmRJbnRlcnByZXRlciBidWlsZGVyIDogbUludGVycHJldGVyQ29sbGVjdGlvbikgewotICAgICAgICAgICAgYnVpbGRlci5lbmRFbnRyeSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc3RhcnRQcm9wZXJ0eSgpIHsKLSAgICAgICAgZm9yIChWQ2FyZEludGVycHJldGVyIGJ1aWxkZXIgOiBtSW50ZXJwcmV0ZXJDb2xsZWN0aW9uKSB7Ci0gICAgICAgICAgICBidWlsZGVyLnN0YXJ0UHJvcGVydHkoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGVuZFByb3BlcnR5KCkgewotICAgICAgICBmb3IgKFZDYXJkSW50ZXJwcmV0ZXIgYnVpbGRlciA6IG1JbnRlcnByZXRlckNvbGxlY3Rpb24pIHsKLSAgICAgICAgICAgIGJ1aWxkZXIuZW5kUHJvcGVydHkoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHByb3BlcnR5R3JvdXAoU3RyaW5nIGdyb3VwKSB7Ci0gICAgICAgIGZvciAoVkNhcmRJbnRlcnByZXRlciBidWlsZGVyIDogbUludGVycHJldGVyQ29sbGVjdGlvbikgewotICAgICAgICAgICAgYnVpbGRlci5wcm9wZXJ0eUdyb3VwKGdyb3VwKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHByb3BlcnR5TmFtZShTdHJpbmcgbmFtZSkgewotICAgICAgICBmb3IgKFZDYXJkSW50ZXJwcmV0ZXIgYnVpbGRlciA6IG1JbnRlcnByZXRlckNvbGxlY3Rpb24pIHsKLSAgICAgICAgICAgIGJ1aWxkZXIucHJvcGVydHlOYW1lKG5hbWUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHJvcGVydHlQYXJhbVR5cGUoU3RyaW5nIHR5cGUpIHsKLSAgICAgICAgZm9yIChWQ2FyZEludGVycHJldGVyIGJ1aWxkZXIgOiBtSW50ZXJwcmV0ZXJDb2xsZWN0aW9uKSB7Ci0gICAgICAgICAgICBidWlsZGVyLnByb3BlcnR5UGFyYW1UeXBlKHR5cGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHJvcGVydHlQYXJhbVZhbHVlKFN0cmluZyB2YWx1ZSkgewotICAgICAgICBmb3IgKFZDYXJkSW50ZXJwcmV0ZXIgYnVpbGRlciA6IG1JbnRlcnByZXRlckNvbGxlY3Rpb24pIHsKLSAgICAgICAgICAgIGJ1aWxkZXIucHJvcGVydHlQYXJhbVZhbHVlKHZhbHVlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHByb3BlcnR5VmFsdWVzKExpc3Q8U3RyaW5nPiB2YWx1ZXMpIHsKLSAgICAgICAgZm9yIChWQ2FyZEludGVycHJldGVyIGJ1aWxkZXIgOiBtSW50ZXJwcmV0ZXJDb2xsZWN0aW9uKSB7Ci0gICAgICAgICAgICBidWlsZGVyLnByb3BlcnR5VmFsdWVzKHZhbHVlcyk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRQYXJzZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZFBhcnNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1N2M1MmE2Li4wMDAwMDAwCi0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZFBhcnNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLnBpbS52Y2FyZDsKLQotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLmV4Y2VwdGlvbi5WQ2FyZEV4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFZDYXJkUGFyc2VyIHsKLSAgICBwcm90ZWN0ZWQgZmluYWwgaW50IG1QYXJzZVR5cGU7Ci0gICAgcHJvdGVjdGVkIGJvb2xlYW4gbUNhbmNlbGVkOwotCi0gICAgcHVibGljIFZDYXJkUGFyc2VyKCkgewotICAgICAgICB0aGlzKFZDYXJkQ29uZmlnLlBBUlNFX1RZUEVfVU5LTk9XTik7Ci0gICAgfQotCi0gICAgcHVibGljIFZDYXJkUGFyc2VyKGludCBwYXJzZVR5cGUpIHsKLSAgICAgICAgbVBhcnNlVHlwZSA9IHBhcnNlVHlwZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8UD4KLSAgICAgKiBQYXJzZXMgdGhlIGdpdmVuIHN0cmVhbSBhbmQgc2VuZCB0aGUgVkNhcmQgZGF0YSBpbnRvIFZDYXJkQnVpbGRlckJhc2Ugb2JqZWN0LgotICAgICAqIDwvUC4KLSAgICAgKiA8UD4KLSAgICAgKiBOb3RlIHRoYXQgdkNhcmQgMi4xIHNwZWNpZmljYXRpb24gYWxsb3dzICJDSEFSU0VUIiBwYXJhbWV0ZXIsIGFuZCBzb21lIGNhcmVlciBzZXRzCi0gICAgICogbG9jYWwgZW5jb2RpbmcgdG8gaXQuIEZvciBleGFtcGxlLCBKYXBhbmVzZSBwaG9uZSBjYXJlZXIgdXNlcyBTaGlmdF9KSVMsIHdoaWNoIGlzCi0gICAgICogZm9ybWFsbHkgYWxsb3dlZCBpbiBWQ2FyZCAyLjEsIGJ1dCBub3QgcmVjb21tZW5kZWQgaW4gVkNhcmQgMy4wLiBJbiBWQ2FyZCAyLjEsCi0gICAgICogSW4gc29tZSBleHJlbWUgY2FzZSwgc29tZSBWQ2FyZCBtYXkgaGF2ZSBkaWZmZXJlbnQgY2hhcnNldHMgaW4gb25lIFZDYXJkICh0aG91Z2gKLSAgICAgKiB3ZSBkbyBub3Qgc2VlIGFueSBkZXZpY2Ugd2hpY2ggZW1pdHMgc3VjaCBraW5kIG9mIG1hbGljaW91cyBkYXRhKQotICAgICAqIDwvUD4KLSAgICAgKiA8UD4KLSAgICAgKiBJbiBvcmRlciB0byBhdm9pZCAibWlzdW5kZXJzdGFuZGluZyIgY2hhcnNldCBhcyBtdWNoIGFzIHBvc3NpYmxlLCB0aGlzIG1ldGhvZAotICAgICAqIHVzZSAiSVNPLTg4NTktMSIgZm9yIHJlYWRpbmcgdGhlIHN0cmVhbS4gV2hlbiBjaGFyc2V0IGlzIHNwZWNpZmllZCBpbiBzb21lIHByb3BlcnR5Ci0gICAgICogKHdpdGggIkNIQVJTRVQ9Li4uIiBwYXJhbWV0ZXIpLCB0aGUgc3RyaW5nIGlzIGRlY29kZWQgdG8gcmF3IGJ5dGVzIGFuZCBlbmNvZGVkIHRvCi0gICAgICogdGhlIGNoYXJzZXQuIFRoaXMgbWV0aG9kIGFzc3VtZXMgdGhhdCAiSVNPLTg4NTktMSIgaGFzIDEgdG8gMSBtYXBwaW5nIGluIGFsbCA4Yml0Ci0gICAgICogY2hhcmFjdGVycywgd2hpY2ggaXMgbm90IGNvbXBsZXRlbHkgc3VyZS4gSW4gc29tZSBjYXNlcywgdGhpcyAiZGVjb2RpbmctZW5jb2RpbmciCi0gICAgICogc2NoZW1lIG1heSBmYWlsLiBUbyBhdm9pZCB0aGUgY2FzZSwKLSAgICAgKiA8L1A+Ci0gICAgICogPFA+Ci0gICAgICogV2UgcmVjb21tZW5kIHlvdSB0byB1c2Uge0BsaW5rIFZDYXJkU291cmNlRGV0ZWN0b3J9IGFuZCBkZXRlY3Qgd2hpY2gga2luZCBvZiBzb3VyY2UgdGhlCi0gICAgICogVkNhcmQgY29tZXMgZnJvbSBhbmQgZXhwbGljaXRseSBzcGVjaWZ5IGEgY2hhcnNldCB1c2luZyB0aGUgcmVzdWx0LgotICAgICAqIDwvUD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBpcyBUaGUgc291cmNlIHRvIHBhcnNlLgotICAgICAqIEBwYXJhbSBpbnRlcmVwcmV0ZXIgQSB7QGxpbmsgVkNhcmRJbnRlcnByZXRlcn0gb2JqZWN0IHdoaWNoIHVzZWQgdG8gY29uc3RydWN0IGRhdGEuCi0gICAgICogQHJldHVybiBSZXR1cm5zIHRydWUgZm9yIHN1Y2Nlc3MuIE90aGVyd2lzZSByZXR1cm5zIGZhbHNlLgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24sIFZDYXJkRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gcGFyc2UoSW5wdXRTdHJlYW0gaXMsIFZDYXJkSW50ZXJwcmV0ZXIgaW50ZXJlcHJldGVyKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBWQ2FyZEV4Y2VwdGlvbjsKLSAgICAKLSAgICAvKioKLSAgICAgKiA8UD4KLSAgICAgKiBUaGUgbWV0aG9kIHZhcmlhbnRzIHdoaWNoIGFjY2VwdCBjaGFyc2V0LgotICAgICAqIDwvUD4KLSAgICAgKiA8UD4KLSAgICAgKiBSRkMgMjQyNiAicmVjb21tZW5kcyIgKG5vdCBmb3JjZXMpIHRvIHVzZSBVVEYtOCwgc28gaXQgbWF5IGJlIE9LIHRvIHVzZQotICAgICAqIFVURi04IGFzIGFuIGVuY29kaW5nIHdoZW4gcGFyc2luZyB2Q2FyZCAzLjAuIEJ1dCBub3RlIHRoYXQgc29tZSBKYXBhbmVzZQotICAgICAqIHBob25lIHVzZXMgU2hpZnRfSklTIGFzIGEgY2hhcnNldCAoZS5nLiBXNjFTSCksIGFuZCBhbm90aGVyIHVzZXMKLSAgICAgKiAiQ0hBUlNFVD1TSElGVF9KSVMiLCB3aGljaCBpcyBleHBsaWNpdGx5IHByb2hpYml0ZWQgaW4gdkNhcmQgMy4wIHNwZWNpZmljYXRpb24gKGUuZy4gVzUzSykuCi0gICAgICogPC9QPgotICAgICAqCi0gICAgICogQHBhcmFtIGlzIFRoZSBzb3VyY2UgdG8gcGFyc2UuCi0gICAgICogQHBhcmFtIGNoYXJzZXQgQ2hhcnNldCB0byBiZSB1c2VkLgotICAgICAqIEBwYXJhbSBidWlsZGVyIFRoZSBWQ2FyZEJ1aWxkZXJCYXNlIG9iamVjdC4KLSAgICAgKiBAcmV0dXJuIFJldHVybnMgdHJ1ZSB3aGVuIHN1Y2Nlc3NmdWwuIE90aGVyd2lzZSByZXR1cm5zIGZhbHNlLgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24sIFZDYXJkRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gcGFyc2UoSW5wdXRTdHJlYW0gaXMsIFN0cmluZyBjaGFyc2V0LCBWQ2FyZEludGVycHJldGVyIGJ1aWxkZXIpCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFZDYXJkRXhjZXB0aW9uOwotICAgIAotICAgIC8qKgotICAgICAqIFRoZSBtZXRob2QgdmFyaWFudHMgd2hpY2ggdGVsbHMgdGhpcyBvYmplY3QgdGhlIG9wZXJhdGlvbiBpcyBhbHJlYWR5IGNhbmNlbGVkLgotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHBhcnNlKElucHV0U3RyZWFtIGlzLCBTdHJpbmcgY2hhcnNldCwKLSAgICAgICAgICAgIFZDYXJkSW50ZXJwcmV0ZXIgYnVpbGRlciwgYm9vbGVhbiBjYW5jZWxlZCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBWQ2FyZEV4Y2VwdGlvbjsKLSAgICAKLSAgICAvKioKLSAgICAgKiBDYW5jZWwgcGFyc2luZy4KLSAgICAgKiBBY3R1YWwgY2FuY2VsIGlzIGRvbmUgYWZ0ZXIgdGhlIGVuZCBvZiB0aGUgY3VycmVudCBvbmUgdmNhcmQgZW50cnkgcGFyc2luZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjYW5jZWwoKSB7Ci0gICAgICAgIG1DYW5jZWxlZCA9IHRydWU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkUGFyc2VyX1YyMS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkUGFyc2VyX1YyMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZThjZmIwLi4wMDAwMDAwCi0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZFBhcnNlcl9WMjEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC5waW0udmNhcmQ7Ci0KLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5leGNlcHRpb24uVkNhcmRBZ2VudE5vdFN1cHBvcnRlZEV4Y2VwdGlvbjsKLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5leGNlcHRpb24uVkNhcmRFeGNlcHRpb247Ci1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuZXhjZXB0aW9uLlZDYXJkSW52YWxpZENvbW1lbnRMaW5lRXhjZXB0aW9uOwotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLmV4Y2VwdGlvbi5WQ2FyZEludmFsaWRMaW5lRXhjZXB0aW9uOwotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLmV4Y2VwdGlvbi5WQ2FyZE5lc3RlZEV4Y2VwdGlvbjsKLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5leGNlcHRpb24uVkNhcmRWZXJzaW9uRXhjZXB0aW9uOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBwYXJzZSB2Q2FyZC4gUGxlYXNlIHJlZmVyIHRvIHZDYXJkIFNwZWNpZmljYXRpb24gMi4xIGZvciBtb3JlIGRldGFpbC4KLSAqLwotcHVibGljIGNsYXNzIFZDYXJkUGFyc2VyX1YyMSBleHRlbmRzIFZDYXJkUGFyc2VyIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1RBRyA9ICJWQ2FyZFBhcnNlcl9WMjEiOwotCi0gICAgLyoqIFN0b3JlIHRoZSBrbm93bi10eXBlICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSGFzaFNldDxTdHJpbmc+IHNLbm93blR5cGVTZXQgPSBuZXcgSGFzaFNldDxTdHJpbmc+KAotICAgICAgICAgICAgQXJyYXlzLmFzTGlzdCgiRE9NIiwgIklOVEwiLCAiUE9TVEFMIiwgIlBBUkNFTCIsICJIT01FIiwgIldPUksiLAotICAgICAgICAgICAgICAgICAgICAiUFJFRiIsICJWT0lDRSIsICJGQVgiLCAiTVNHIiwgIkNFTEwiLCAiUEFHRVIiLCAiQkJTIiwKLSAgICAgICAgICAgICAgICAgICAgIk1PREVNIiwgIkNBUiIsICJJU0ROIiwgIlZJREVPIiwgIkFPTCIsICJBUFBMRUxJTksiLAotICAgICAgICAgICAgICAgICAgICAiQVRUTUFJTCIsICJDSVMiLCAiRVdPUkxEIiwgIklOVEVSTkVUIiwgIklCTU1BSUwiLAotICAgICAgICAgICAgICAgICAgICAiTUNJTUFJTCIsICJQT1dFUlNIQVJFIiwgIlBST0RJR1kiLCAiVExYIiwgIlg0MDAiLCAiR0lGIiwKLSAgICAgICAgICAgICAgICAgICAgIkNHTSIsICJXTUYiLCAiQk1QIiwgIk1FVCIsICJQTUIiLCAiRElCIiwgIlBJQ1QiLCAiVElGRiIsCi0gICAgICAgICAgICAgICAgICAgICJQREYiLCAiUFMiLCAiSlBFRyIsICJRVElNRSIsICJNUEVHIiwgIk1QRUcyIiwgIkFWSSIsCi0gICAgICAgICAgICAgICAgICAgICJXQVZFIiwgIkFJRkYiLCAiUENNIiwgIlg1MDkiLCAiUEdQIikpOwotCi0gICAgLyoqIFN0b3JlIHRoZSBrbm93bi12YWx1ZSAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEhhc2hTZXQ8U3RyaW5nPiBzS25vd25WYWx1ZVNldCA9IG5ldyBIYXNoU2V0PFN0cmluZz4oCi0gICAgICAgICAgICBBcnJheXMuYXNMaXN0KCJJTkxJTkUiLCAiVVJMIiwgIkNPTlRFTlQtSUQiLCAiQ0lEIikpOwotCi0gICAgLyoqIFN0b3JlIHRoZSBwcm9wZXJ0eSBuYW1lcyBhdmFpbGFibGUgaW4gdkNhcmQgMi4xICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSGFzaFNldDxTdHJpbmc+IHNBdmFpbGFibGVQcm9wZXJ0eU5hbWVTZXRWMjEgPQotICAgICAgICBuZXcgSGFzaFNldDxTdHJpbmc+KEFycmF5cy5hc0xpc3QoCi0gICAgICAgICAgICAgICAgIkJFR0lOIiwgIkxPR08iLCAiUEhPVE8iLCAiTEFCRUwiLCAiRk4iLCAiVElUTEUiLCAiU09VTkQiLAotICAgICAgICAgICAgICAgICJWRVJTSU9OIiwgIlRFTCIsICJFTUFJTCIsICJUWiIsICJHRU8iLCAiTk9URSIsICJVUkwiLAotICAgICAgICAgICAgICAgICJCREFZIiwgIlJPTEUiLCAiUkVWIiwgIlVJRCIsICJLRVkiLCAiTUFJTEVSIikpOwotCi0gICAgLyoqCi0gICAgICogVGhvdWdoIHZDYXJkIDIuMSBzcGVjaWZpY2F0aW9uIGRvZXMgbm90IGFsbG93ICJCIiBlbmNvZGluZywgc29tZSBkYXRhIG1heSBoYXZlIGl0LgotICAgICAqIFdlIGFsbG93IGl0IGZvciBzYWZldHkuLi4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBIYXNoU2V0PFN0cmluZz4gc0F2YWlsYWJsZUVuY29kaW5nVjIxID0KLSAgICAgICAgbmV3IEhhc2hTZXQ8U3RyaW5nPihBcnJheXMuYXNMaXN0KAotICAgICAgICAgICAgICAgICI3QklUIiwgIjhCSVQiLCAiUVVPVEVELVBSSU5UQUJMRSIsICJCQVNFNjQiLCAiQiIpKTsKLSAgICAKLSAgICAvLyBVc2VkIG9ubHkgZm9yIHBhcnNpbmcgRU5EOlZDQVJELgotICAgIHByaXZhdGUgU3RyaW5nIG1QcmV2aW91c0xpbmU7Ci0gICAgCi0gICAgLyoqIFRoZSBidWlsZGVyIHRvIGJ1aWxkIHBhcnNlZCBkYXRhICovCi0gICAgcHJvdGVjdGVkIFZDYXJkSW50ZXJwcmV0ZXIgbUJ1aWxkZXIgPSBudWxsOwotCi0gICAgLyoqIAotICAgICAqIFRoZSBlbmNvZGluZyB0eXBlLiAiRW5jb2RpbmciIGluIHZDYXJkIGlzIGRpZmZlcmVudCBmcm9tICJDaGFyc2V0Ii4KLSAgICAgKiBlLmcuIDdCSVQsIDhCSVQsIFFVT1RFRC1QUklOVEFCTEUuIAotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgbUVuY29kaW5nID0gbnVsbDsKLSAgICAKLSAgICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIHNEZWZhdWx0RW5jb2RpbmcgPSAiOEJJVCI7Ci0gICAgCi0gICAgLy8gU2hvdWxkIG5vdCBkaXJlY3RseSByZWFkIGEgbGluZSBmcm9tIHRoaXMgb2JqZWN0LiBVc2UgZ2V0TGluZSgpIGluc3RlYWQuCi0gICAgcHJvdGVjdGVkIEJ1ZmZlcmVkUmVhZGVyIG1SZWFkZXI7Ci0gICAgCi0gICAgLy8gSW4gc29tZSBjYXNlcywgdkNhcmQgaXMgbmVzdGVkLiBDdXJyZW50bHksIHdlIG9ubHkgY29uc2lkZXIgdGhlIG1vc3QgaW50ZXJpb3IgdkNhcmQgZGF0YS4KLSAgICAvLyBTZWUgdjIxX2ZvbWFfMS52Y2YgaW4gdGVzdCBkaXJlY3RvcnkgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0gICAgcHJpdmF0ZSBpbnQgbU5lc3RDb3VudDsKLSAgICAKLSAgICAvLyBJbiBvcmRlciB0byByZWR1Y2Ugd2FybmluZyBtZXNzYWdlIGFzIG11Y2ggYXMgcG9zc2libGUsIHdlIGhvbGQgdGhlIHZhbHVlIHdoaWNoIG1hZGUgTG9nZ2VyCi0gICAgLy8gZW1pdCBhIHdhcm5pbmcgbWVzc2FnZS4KLSAgICBwcm90ZWN0ZWQgU2V0PFN0cmluZz4gbVVua25vd25UeXBlTWFwID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotICAgIHByb3RlY3RlZCBTZXQ8U3RyaW5nPiBtVW5rbm93blZhbHVlTWFwID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotCi0gICAgLy8gRm9yIG1lYXN1cmluZyBwZXJmb3JtYW5jZS4KLSAgICBwcml2YXRlIGxvbmcgbVRpbWVUb3RhbDsKLSAgICBwcml2YXRlIGxvbmcgbVRpbWVSZWFkU3RhcnRSZWNvcmQ7Ci0gICAgcHJpdmF0ZSBsb25nIG1UaW1lUmVhZEVuZFJlY29yZDsKLSAgICBwcml2YXRlIGxvbmcgbVRpbWVTdGFydFByb3BlcnR5OwotICAgIHByaXZhdGUgbG9uZyBtVGltZUVuZFByb3BlcnR5OwotICAgIHByaXZhdGUgbG9uZyBtVGltZVBhcnNlSXRlbXM7Ci0gICAgcHJpdmF0ZSBsb25nIG1UaW1lUGFyc2VMaW5lQW5kSGFuZGxlR3JvdXA7Ci0gICAgcHJpdmF0ZSBsb25nIG1UaW1lUGFyc2VQcm9wZXJ0eVZhbHVlczsKLSAgICBwcml2YXRlIGxvbmcgbVRpbWVQYXJzZUFkck9yZ047Ci0gICAgcHJpdmF0ZSBsb25nIG1UaW1lSGFuZGxlTWlzY1Byb3BlcnR5VmFsdWU7Ci0gICAgcHJpdmF0ZSBsb25nIG1UaW1lSGFuZGxlUXVvdGVkUHJpbnRhYmxlOwotICAgIHByaXZhdGUgbG9uZyBtVGltZUhhbmRsZUJhc2U2NDsKLQotICAgIHB1YmxpYyBWQ2FyZFBhcnNlcl9WMjEoKSB7Ci0gICAgICAgIHRoaXMobnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIFZDYXJkUGFyc2VyX1YyMShWQ2FyZFNvdXJjZURldGVjdG9yIGRldGVjdG9yKSB7Ci0gICAgICAgIHRoaXMoZGV0ZWN0b3IgIT0gbnVsbCA/IGRldGVjdG9yLmdldEVzdGltYXRlZFR5cGUoKSA6IFZDYXJkQ29uZmlnLlBBUlNFX1RZUEVfVU5LTk9XTik7Ci0gICAgfQotCi0gICAgcHVibGljIFZDYXJkUGFyc2VyX1YyMShpbnQgcGFyc2VUeXBlKSB7Ci0gICAgICAgIHN1cGVyKHBhcnNlVHlwZSk7Ci0gICAgICAgIGlmIChwYXJzZVR5cGUgPT0gVkNhcmRDb25maWcuUEFSU0VfVFlQRV9GT01BKSB7Ci0gICAgICAgICAgICBtTmVzdENvdW50ID0gMTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFBhcnNlcyB0aGUgZmlsZSBhdCB0aGUgZ2l2ZW4gcG9zaXRpb24uCi0gICAgICoKLSAgICAgKiB2Y2FyZF9maWxlID0gW3dzbHNdIHZjYXJkIFt3c2xzXQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHBhcnNlVkNhcmRGaWxlKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBWQ2FyZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGJvb2xlYW4gZmlyc3RSZWFkaW5nID0gdHJ1ZTsKLSAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgICAgIGlmIChtQ2FuY2VsZWQpIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghcGFyc2VPbmVWQ2FyZChmaXJzdFJlYWRpbmcpKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaXJzdFJlYWRpbmcgPSBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtTmVzdENvdW50ID4gMCkgewotICAgICAgICAgICAgYm9vbGVhbiB1c2VDYWNoZSA9IHRydWU7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1OZXN0Q291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgIHJlYWRFbmRWQ2FyZCh1c2VDYWNoZSwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgdXNlQ2FjaGUgPSBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCBpbnQgZ2V0VmVyc2lvbigpIHsKLSAgICAgICAgcmV0dXJuIFZDYXJkQ29uZmlnLkZMQUdfVjIxOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0VmVyc2lvblN0cmluZygpIHsKLSAgICAgICAgcmV0dXJuIFZDYXJkQ29uc3RhbnRzLlZFUlNJT05fVjIxOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdHJ1ZSB3aGVuIHRoZSBwcm9wZXJ0eU5hbWUgaXMgYSB2YWxpZCBwcm9wZXJ0eSBuYW1lLgotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIGlzVmFsaWRQcm9wZXJ0eU5hbWUoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotICAgICAgICBpZiAoIShzQXZhaWxhYmxlUHJvcGVydHlOYW1lU2V0VjIxLmNvbnRhaW5zKHByb3BlcnR5TmFtZS50b1VwcGVyQ2FzZSgpKSB8fAotICAgICAgICAgICAgICAgIHByb3BlcnR5TmFtZS5zdGFydHNXaXRoKCJYLSIpKSAmJiAKLSAgICAgICAgICAgICAgICAhbVVua25vd25UeXBlTWFwLmNvbnRhaW5zKHByb3BlcnR5TmFtZSkpIHsKLSAgICAgICAgICAgIG1Vbmtub3duVHlwZU1hcC5hZGQocHJvcGVydHlOYW1lKTsKLSAgICAgICAgICAgIExvZy53KExPR19UQUcsICJQcm9wZXJ0eSBuYW1lIHVuc3VwcG9ydGVkIGJ5IHZDYXJkIDIuMTogIiArIHByb3BlcnR5TmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0cnVlIHdoZW4gdGhlIGVuY29kaW5nIGlzIGEgdmFsaWQgZW5jb2RpbmcuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNWYWxpZEVuY29kaW5nKFN0cmluZyBlbmNvZGluZykgewotICAgICAgICByZXR1cm4gc0F2YWlsYWJsZUVuY29kaW5nVjIxLmNvbnRhaW5zKGVuY29kaW5nLnRvVXBwZXJDYXNlKCkpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFN0cmluZy4gSXQgbWF5IGJlIG51bGwsIG9yIGl0cyBsZW5ndGggbWF5IGJlIDAKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRMaW5lKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIG1SZWFkZXIucmVhZExpbmUoKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQHJldHVybiBTdHJpbmcgd2l0aCBpdCdzIGxlbmd0aCA+IDAKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogQHRocm93cyBWQ2FyZEV4Y2VwdGlvbiB3aGVuIHRoZSBzdHJlYW0gcmVhY2hlZCBlbmQgb2YgbGluZQotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Tm9uRW1wdHlMaW5lKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBWQ2FyZEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBsaW5lOwotICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICAgICAgbGluZSA9IGdldExpbmUoKTsKLSAgICAgICAgICAgIGlmIChsaW5lID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVkNhcmRFeGNlcHRpb24oIlJlYWNoZWQgZW5kIG9mIGJ1ZmZlci4iKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobGluZS50cmltKCkubGVuZ3RoKCkgPiAwKSB7ICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHJldHVybiBsaW5lOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogdmNhcmQgPSAiQkVHSU4iIFt3c10gIjoiIFt3c10gIlZDQVJEIiBbd3NdIDEqQ1JMRgotICAgICAqICAgICAgICAgaXRlbXMgKkNSTEYKLSAgICAgKiAgICAgICAgICJFTkQiIFt3c10gIjoiIFt3c10gIlZDQVJEIgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBwYXJzZU9uZVZDYXJkKGJvb2xlYW4gZmlyc3RSZWFkaW5nKSB0aHJvd3MgSU9FeGNlcHRpb24sIFZDYXJkRXhjZXB0aW9uIHsKLSAgICAgICAgYm9vbGVhbiBhbGxvd0dhcmJhZ2UgPSBmYWxzZTsKLSAgICAgICAgaWYgKGZpcnN0UmVhZGluZykgewotICAgICAgICAgICAgaWYgKG1OZXN0Q291bnQgPiAwKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtTmVzdENvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFyZWFkQmVnaW5WQ2FyZChhbGxvd0dhcmJhZ2UpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYWxsb3dHYXJiYWdlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIXJlYWRCZWdpblZDYXJkKGFsbG93R2FyYmFnZSkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBsb25nIHN0YXJ0OwotICAgICAgICBpZiAobUJ1aWxkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgIG1CdWlsZGVyLnN0YXJ0RW50cnkoKTsKLSAgICAgICAgICAgIG1UaW1lUmVhZFN0YXJ0UmVjb3JkICs9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gc3RhcnQ7Ci0gICAgICAgIH0KLSAgICAgICAgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgcGFyc2VJdGVtcygpOwotICAgICAgICBtVGltZVBhcnNlSXRlbXMgKz0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzdGFydDsKLSAgICAgICAgcmVhZEVuZFZDYXJkKHRydWUsIGZhbHNlKTsKLSAgICAgICAgaWYgKG1CdWlsZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgICAgICBtQnVpbGRlci5lbmRFbnRyeSgpOwotICAgICAgICAgICAgbVRpbWVSZWFkRW5kUmVjb3JkICs9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gc3RhcnQ7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEByZXR1cm4gVHJ1ZSB3aGVuIHN1Y2Nlc3NmdWwuIEZhbHNlIHdoZW4gcmVhY2hpbmcgdGhlIGVuZCBvZiBsaW5lICAKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogQHRocm93cyBWQ2FyZEV4Y2VwdGlvbgotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIHJlYWRCZWdpblZDYXJkKGJvb2xlYW4gYWxsb3dHYXJiYWdlKSB0aHJvd3MgSU9FeGNlcHRpb24sIFZDYXJkRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIGxpbmU7Ci0gICAgICAgIGRvIHsKLSAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgICAgICAgICAgbGluZSA9IGdldExpbmUoKTsKLSAgICAgICAgICAgICAgICBpZiAobGluZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGxpbmUudHJpbSgpLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTdHJpbmdbXSBzdHJBcnJheSA9IGxpbmUuc3BsaXQoIjoiLCAyKTsKLSAgICAgICAgICAgIGludCBsZW5ndGggPSBzdHJBcnJheS5sZW5ndGg7Ci0KLSAgICAgICAgICAgIC8vIFRob3VnaCB2Q2FyZCAyLjEvMy4wIHNwZWNpZmljYXRpb24gZG9lcyBub3QgYWxsb3cgbG93ZXIgY2FzZXMsCi0gICAgICAgICAgICAvLyB2Q2FyZCBmaWxlIGVtaXR0ZWQgYnkgc29tZSBleHRlcm5hbCB2Q2FyZCBleHBvdGVyIGhhdmUgc3VjaCBpbnZhbGlkIFN0cmluZ3MuCi0gICAgICAgICAgICAvLyBTbyB3ZSBhbGxvdyBpdC4KLSAgICAgICAgICAgIC8vIGUuZy4gQkVHSU46dkNhcmQKLSAgICAgICAgICAgIGlmIChsZW5ndGggPT0gMiAmJgotICAgICAgICAgICAgICAgICAgICBzdHJBcnJheVswXS50cmltKCkuZXF1YWxzSWdub3JlQ2FzZSgiQkVHSU4iKSAmJgotICAgICAgICAgICAgICAgICAgICBzdHJBcnJheVsxXS50cmltKCkuZXF1YWxzSWdub3JlQ2FzZSgiVkNBUkQiKSkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfSBlbHNlIGlmICghYWxsb3dHYXJiYWdlKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1OZXN0Q291bnQgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1QcmV2aW91c0xpbmUgPSBsaW5lOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFZDYXJkRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZCBTdHJpbmcgXCJCRUdJTjpWQ0FSRFwiIGRpZCBub3QgY29tZSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiKEluc3RlYWQsIFwiIiArIGxpbmUgKyAiXCIgY2FtZSkiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gd2hpbGUoYWxsb3dHYXJiYWdlKTsKLQotICAgICAgICB0aHJvdyBuZXcgVkNhcmRFeGNlcHRpb24oIlJlYWNoZWQgd2hlcmUgbXVzdCBub3QgYmUgcmVhY2hlZC4iKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgYXJndW1lbnRzIHVzZUNhY2hlIGFuZCBhbGxvd0dhcmJhc2UgYXJlIHVzdWFsbHkgdHJ1ZSBhbmQgZmFsc2UgYWNjb3JkaW5nbHkgd2hlbgotICAgICAqIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIG91dHNpZGUgdGhpcyBmdW5jdGlvbiBpdHNlbGYuIAotICAgICAqCi0gICAgICogQHBhcmFtIHVzZUNhY2hlIFdoZW4gdHJ1ZSwgbGluZSBpcyBvYnRhaW5lZCBmcm9tIG1QcmV2aW91c2xpbmUuIE90aGVyd2lzZSwgZ2V0TGluZSgpCi0gICAgICogaXMgdXNlZC4KLSAgICAgKiBAcGFyYW0gYWxsb3dHYXJiYWdlIFdoZW4gdHJ1ZSwgaWdub3JlIG5vbiAiRU5EOlZDQVJEIiBsaW5lLgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIFZDYXJkRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgcmVhZEVuZFZDYXJkKGJvb2xlYW4gdXNlQ2FjaGUsIGJvb2xlYW4gYWxsb3dHYXJiYWdlKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBWQ2FyZEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBsaW5lOwotICAgICAgICBkbyB7Ci0gICAgICAgICAgICBpZiAodXNlQ2FjaGUpIHsKLSAgICAgICAgICAgICAgICAvLyBUaG91Z2ggdkNhcmQgc3BlY2lmaWNhdGlvbiBkb2VzIG5vdCBhbGxvdyBsb3dlciBjYXNlcywKLSAgICAgICAgICAgICAgICAvLyBzb21lIGRhdGEgbWF5IGhhdmUgdGhlbSwgc28gd2UgYWxsb3cgaXQuCi0gICAgICAgICAgICAgICAgbGluZSA9IG1QcmV2aW91c0xpbmU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxpbmUgPSBnZXRMaW5lKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChsaW5lID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBWQ2FyZEV4Y2VwdGlvbigiRXhwZWN0ZWQgRU5EOlZDQVJEIHdhcyBub3QgZm91bmQuIik7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobGluZS50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgU3RyaW5nW10gc3RyQXJyYXkgPSBsaW5lLnNwbGl0KCI6IiwgMik7Ci0gICAgICAgICAgICBpZiAoc3RyQXJyYXkubGVuZ3RoID09IDIgJiYKLSAgICAgICAgICAgICAgICAgICAgc3RyQXJyYXlbMF0udHJpbSgpLmVxdWFsc0lnbm9yZUNhc2UoIkVORCIpICYmCi0gICAgICAgICAgICAgICAgICAgIHN0ckFycmF5WzFdLnRyaW0oKS5lcXVhbHNJZ25vcmVDYXNlKCJWQ0FSRCIpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfSBlbHNlIGlmICghYWxsb3dHYXJiYWdlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFZDYXJkRXhjZXB0aW9uKCJFTkQ6VkNBUkQgIT0gXCIiICsgbVByZXZpb3VzTGluZSArICJcIiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdXNlQ2FjaGUgPSBmYWxzZTsKLSAgICAgICAgfSB3aGlsZSAoYWxsb3dHYXJiYWdlKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogaXRlbXMgPSAqQ1JMRiBpdGVtIAotICAgICAqICAgICAgIC8gaXRlbQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHBhcnNlSXRlbXMoKSB0aHJvd3MgSU9FeGNlcHRpb24sIFZDYXJkRXhjZXB0aW9uIHsKLSAgICAgICAgYm9vbGVhbiBlbmRlZCA9IGZhbHNlOwotICAgICAgICAKLSAgICAgICAgaWYgKG1CdWlsZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIGxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgIG1CdWlsZGVyLnN0YXJ0UHJvcGVydHkoKTsKLSAgICAgICAgICAgIG1UaW1lU3RhcnRQcm9wZXJ0eSArPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHN0YXJ0OwotICAgICAgICB9Ci0gICAgICAgIGVuZGVkID0gcGFyc2VJdGVtKCk7Ci0gICAgICAgIGlmIChtQnVpbGRlciAhPSBudWxsICYmICFlbmRlZCkgewotICAgICAgICAgICAgbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICAgICAgbUJ1aWxkZXIuZW5kUHJvcGVydHkoKTsKLSAgICAgICAgICAgIG1UaW1lRW5kUHJvcGVydHkgKz0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzdGFydDsKLSAgICAgICAgfQotCi0gICAgICAgIHdoaWxlICghZW5kZWQpIHsKLSAgICAgICAgICAgIC8vIGZvbGxvdyBWQ0FSRCAsaXQgd29udCByZWFjaCBlbmRQcm9wZXJ0eQotICAgICAgICAgICAgaWYgKG1CdWlsZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuc3RhcnRQcm9wZXJ0eSgpOwotICAgICAgICAgICAgICAgIG1UaW1lU3RhcnRQcm9wZXJ0eSArPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHN0YXJ0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBlbmRlZCA9IHBhcnNlSXRlbSgpOwotICAgICAgICAgICAgfSBjYXRjaCAoVkNhcmRJbnZhbGlkQ29tbWVudExpbmVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJJbnZhbGlkIGxpbmUgd2hpY2ggbG9va3MgbGlrZSBzb21lIGNvbW1lbnQgd2FzIGZvdW5kLiBJZ25vcmVkLiIpOwotICAgICAgICAgICAgICAgIGVuZGVkID0gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobUJ1aWxkZXIgIT0gbnVsbCAmJiAhZW5kZWQpIHsKLSAgICAgICAgICAgICAgICBsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuZW5kUHJvcGVydHkoKTsKLSAgICAgICAgICAgICAgICBtVGltZUVuZFByb3BlcnR5ICs9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gc3RhcnQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogaXRlbSA9IFtncm91cHMgIi4iXSBuYW1lICAgIFtwYXJhbXNdICI6IiB2YWx1ZSBDUkxGCi0gICAgICogICAgICAvIFtncm91cHMgIi4iXSAiQURSIiAgIFtwYXJhbXNdICI6IiBhZGRyZXNzcGFydHMgQ1JMRgotICAgICAqICAgICAgLyBbZ3JvdXBzICIuIl0gIk9SRyIgICBbcGFyYW1zXSAiOiIgb3JncGFydHMgQ1JMRgotICAgICAqICAgICAgLyBbZ3JvdXBzICIuIl0gIk4iICAgICBbcGFyYW1zXSAiOiIgbmFtZXBhcnRzIENSTEYKLSAgICAgKiAgICAgIC8gW2dyb3VwcyAiLiJdICJBR0VOVCIgW3BhcmFtc10gIjoiIHZjYXJkIENSTEYKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBwYXJzZUl0ZW0oKSB0aHJvd3MgSU9FeGNlcHRpb24sIFZDYXJkRXhjZXB0aW9uIHsKLSAgICAgICAgbUVuY29kaW5nID0gc0RlZmF1bHRFbmNvZGluZzsKLQotICAgICAgICBmaW5hbCBTdHJpbmcgbGluZSA9IGdldE5vbkVtcHR5TGluZSgpOwotICAgICAgICBsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0KLSAgICAgICAgU3RyaW5nW10gcHJvcGVydHlOYW1lQW5kVmFsdWUgPSBzZXBhcmF0ZUxpbmVBbmRIYW5kbGVHcm91cChsaW5lKTsKLSAgICAgICAgaWYgKHByb3BlcnR5TmFtZUFuZFZhbHVlID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwcm9wZXJ0eU5hbWVBbmRWYWx1ZS5sZW5ndGggIT0gMikgewotICAgICAgICAgICAgdGhyb3cgbmV3IFZDYXJkSW52YWxpZExpbmVFeGNlcHRpb24oIkludmFsaWQgbGluZSBcIiIgKyBsaW5lICsgIlwiIik7Ci0gICAgICAgIH0KLSAgICAgICAgU3RyaW5nIHByb3BlcnR5TmFtZSA9IHByb3BlcnR5TmFtZUFuZFZhbHVlWzBdLnRvVXBwZXJDYXNlKCk7Ci0gICAgICAgIFN0cmluZyBwcm9wZXJ0eVZhbHVlID0gcHJvcGVydHlOYW1lQW5kVmFsdWVbMV07Ci0KLSAgICAgICAgbVRpbWVQYXJzZUxpbmVBbmRIYW5kbGVHcm91cCArPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHN0YXJ0OwotCi0gICAgICAgIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKCJBRFIiKSB8fCBwcm9wZXJ0eU5hbWUuZXF1YWxzKCJPUkciKSB8fAotICAgICAgICAgICAgICAgIHByb3BlcnR5TmFtZS5lcXVhbHMoIk4iKSkgewotICAgICAgICAgICAgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgIGhhbmRsZU11bHRpcGxlUHJvcGVydHlWYWx1ZShwcm9wZXJ0eU5hbWUsIHByb3BlcnR5VmFsdWUpOwotICAgICAgICAgICAgbVRpbWVQYXJzZUFkck9yZ04gKz0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzdGFydDsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfSBlbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKCJBR0VOVCIpKSB7Ci0gICAgICAgICAgICBoYW5kbGVBZ2VudChwcm9wZXJ0eVZhbHVlKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfSBlbHNlIGlmIChpc1ZhbGlkUHJvcGVydHlOYW1lKHByb3BlcnR5TmFtZSkpIHsKLSAgICAgICAgICAgIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKCJCRUdJTiIpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5VmFsdWUuZXF1YWxzKCJWQ0FSRCIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBWQ2FyZE5lc3RlZEV4Y2VwdGlvbigiVGhpcyB2Q2FyZCBoYXMgbmVzdGVkIHZDYXJkIGRhdGEgaW4gaXQuIik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFZDYXJkRXhjZXB0aW9uKCJVbmtub3duIEJFR0lOIHR5cGU6ICIgKyBwcm9wZXJ0eVZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoIlZFUlNJT04iKSAmJgotICAgICAgICAgICAgICAgICAgICAhcHJvcGVydHlWYWx1ZS5lcXVhbHMoZ2V0VmVyc2lvblN0cmluZygpKSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBWQ2FyZFZlcnNpb25FeGNlcHRpb24oIkluY29tcGF0aWJsZSB2ZXJzaW9uOiAiICsgCi0gICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVZhbHVlICsgIiAhPSAiICsgZ2V0VmVyc2lvblN0cmluZygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgICAgICBoYW5kbGVQcm9wZXJ0eVZhbHVlKHByb3BlcnR5TmFtZSwgcHJvcGVydHlWYWx1ZSk7Ci0gICAgICAgICAgICBtVGltZVBhcnNlUHJvcGVydHlWYWx1ZXMgKz0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzdGFydDsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgdGhyb3cgbmV3IFZDYXJkRXhjZXB0aW9uKCJVbmtub3duIHByb3BlcnR5IG5hbWU6IFwiIiArIHByb3BlcnR5TmFtZSArICJcIiIpOwotICAgIH0KLQotICAgIHN0YXRpYyBwcml2YXRlIGZpbmFsIGludCBTVEFURV9HUk9VUF9PUl9QUk9QTkFNRSA9IDA7Ci0gICAgc3RhdGljIHByaXZhdGUgZmluYWwgaW50IFNUQVRFX1BBUkFNUyA9IDE7Ci0gICAgLy8gdkNhcmQgMy4wIHNwZWNpZmljYXRpb24gYWxsb3dzIGRvdWJsZS1xdW90ZWQgcGFyYW0tdmFsdWUsIHdoaWxlIHZDYXJkIDIuMSBkb2VzIG5vdC4KLSAgICAvLyBUaGlzIGlzIGp1c3QgZm9yIHNhZmV0eS4KLSAgICBzdGF0aWMgcHJpdmF0ZSBmaW5hbCBpbnQgU1RBVEVfUEFSQU1TX0lOX0RRVU9URSA9IDI7Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nW10gc2VwYXJhdGVMaW5lQW5kSGFuZGxlR3JvdXAoU3RyaW5nIGxpbmUpIHRocm93cyBWQ2FyZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGludCBzdGF0ZSA9IFNUQVRFX0dST1VQX09SX1BST1BOQU1FOwotICAgICAgICBpbnQgbmFtZUluZGV4ID0gMDsKLQotICAgICAgICBmaW5hbCBTdHJpbmdbXSBwcm9wZXJ0eU5hbWVBbmRWYWx1ZSA9IG5ldyBTdHJpbmdbMl07Ci0KLSAgICAgICAgZmluYWwgaW50IGxlbmd0aCA9IGxpbmUubGVuZ3RoKCk7Ci0gICAgICAgIGlmIChsZW5ndGggPiAwICYmIGxpbmUuY2hhckF0KDApID09ICcjJykgewotICAgICAgICAgICAgdGhyb3cgbmV3IFZDYXJkSW52YWxpZENvbW1lbnRMaW5lRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBjaGFyIGNoID0gbGluZS5jaGFyQXQoaSk7IAotICAgICAgICAgICAgc3dpdGNoIChzdGF0ZSkgewotICAgICAgICAgICAgICAgIGNhc2UgU1RBVEVfR1JPVVBfT1JfUFJPUE5BTUU6IHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09ICc6JykgewotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHByb3BlcnR5TmFtZSA9IGxpbmUuc3Vic3RyaW5nKG5hbWVJbmRleCwgaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvcGVydHlOYW1lLmVxdWFsc0lnbm9yZUNhc2UoIkVORCIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVByZXZpb3VzTGluZSA9IGxpbmU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobUJ1aWxkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1CdWlsZGVyLnByb3BlcnR5TmFtZShwcm9wZXJ0eU5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlOYW1lQW5kVmFsdWVbMF0gPSBwcm9wZXJ0eU5hbWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSA8IGxlbmd0aCAtIDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eU5hbWVBbmRWYWx1ZVsxXSA9IGxpbmUuc3Vic3RyaW5nKGkgKyAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlOYW1lQW5kVmFsdWVbMV0gPSAiIjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwcm9wZXJ0eU5hbWVBbmRWYWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnLicpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBncm91cE5hbWUgPSBsaW5lLnN1YnN0cmluZyhuYW1lSW5kZXgsIGkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1CdWlsZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQnVpbGRlci5wcm9wZXJ0eUdyb3VwKGdyb3VwTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lSW5kZXggPSBpICsgMTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnOycpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwcm9wZXJ0eU5hbWUgPSBsaW5lLnN1YnN0cmluZyhuYW1lSW5kZXgsIGkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJFTkQiKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QcmV2aW91c0xpbmUgPSBsaW5lOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1CdWlsZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQnVpbGRlci5wcm9wZXJ0eU5hbWUocHJvcGVydHlOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5TmFtZUFuZFZhbHVlWzBdID0gcHJvcGVydHlOYW1lOwotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZUluZGV4ID0gaSArIDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IFNUQVRFX1BBUkFNUzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2FzZSBTVEFURV9QQVJBTVM6IHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09ICciJykgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBTVEFURV9QQVJBTVNfSU5fRFFVT1RFOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoID09ICc7JykgewotICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlUGFyYW1zKGxpbmUuc3Vic3RyaW5nKG5hbWVJbmRleCwgaSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZUluZGV4ID0gaSArIDE7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJzonKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVQYXJhbXMobGluZS5zdWJzdHJpbmcobmFtZUluZGV4LCBpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSA8IGxlbmd0aCAtIDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eU5hbWVBbmRWYWx1ZVsxXSA9IGxpbmUuc3Vic3RyaW5nKGkgKyAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlOYW1lQW5kVmFsdWVbMV0gPSAiIjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwcm9wZXJ0eU5hbWVBbmRWYWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2FzZSBTVEFURV9QQVJBTVNfSU5fRFFVT1RFOiB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjaCA9PSAnIicpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gU1RBVEVfUEFSQU1TOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgdGhyb3cgbmV3IFZDYXJkSW52YWxpZExpbmVFeGNlcHRpb24oIkludmFsaWQgbGluZTogXCIiICsgbGluZSArICJcIiIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHBhcmFtcyAgICAgPSAiOyIgW3dzXSBwYXJhbWxpc3QKLSAgICAgKiBwYXJhbWxpc3QgID0gcGFyYW1saXN0IFt3c10gIjsiIFt3c10gcGFyYW0KLSAgICAgKiAgICAgICAgICAgIC8gcGFyYW0KLSAgICAgKiBwYXJhbSAgICAgID0gIlRZUEUiIFt3c10gIj0iIFt3c10gcHR5cGV2YWwKLSAgICAgKiAgICAgICAgICAgIC8gIlZBTFVFIiBbd3NdICI9IiBbd3NdIHB2YWx1ZXZhbAotICAgICAqICAgICAgICAgICAgLyAiRU5DT0RJTkciIFt3c10gIj0iIFt3c10gcGVuY29kaW5ndmFsCi0gICAgICogICAgICAgICAgICAvICJDSEFSU0VUIiBbd3NdICI9IiBbd3NdIGNoYXJzZXR2YWwKLSAgICAgKiAgICAgICAgICAgIC8gIkxBTkdVQUdFIiBbd3NdICI9IiBbd3NdIGxhbmd2YWwKLSAgICAgKiAgICAgICAgICAgIC8gIlgtIiB3b3JkIFt3c10gIj0iIFt3c10gd29yZAotICAgICAqICAgICAgICAgICAgLyBrbm93bnR5cGUKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVQYXJhbXMoU3RyaW5nIHBhcmFtcykgdGhyb3dzIFZDYXJkRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nW10gc3RyQXJyYXkgPSBwYXJhbXMuc3BsaXQoIj0iLCAyKTsKLSAgICAgICAgaWYgKHN0ckFycmF5Lmxlbmd0aCA9PSAyKSB7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgcGFyYW1OYW1lID0gc3RyQXJyYXlbMF0udHJpbSgpLnRvVXBwZXJDYXNlKCk7Ci0gICAgICAgICAgICBTdHJpbmcgcGFyYW1WYWx1ZSA9IHN0ckFycmF5WzFdLnRyaW0oKTsKLSAgICAgICAgICAgIGlmIChwYXJhbU5hbWUuZXF1YWxzKCJUWVBFIikpIHsKLSAgICAgICAgICAgICAgICBoYW5kbGVUeXBlKHBhcmFtVmFsdWUpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJhbU5hbWUuZXF1YWxzKCJWQUxVRSIpKSB7Ci0gICAgICAgICAgICAgICAgaGFuZGxlVmFsdWUocGFyYW1WYWx1ZSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHBhcmFtTmFtZS5lcXVhbHMoIkVOQ09ESU5HIikpIHsKLSAgICAgICAgICAgICAgICBoYW5kbGVFbmNvZGluZyhwYXJhbVZhbHVlKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAocGFyYW1OYW1lLmVxdWFscygiQ0hBUlNFVCIpKSB7Ci0gICAgICAgICAgICAgICAgaGFuZGxlQ2hhcnNldChwYXJhbVZhbHVlKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAocGFyYW1OYW1lLmVxdWFscygiTEFOR1VBR0UiKSkgewotICAgICAgICAgICAgICAgIGhhbmRsZUxhbmd1YWdlKHBhcmFtVmFsdWUpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJhbU5hbWUuc3RhcnRzV2l0aCgiWC0iKSkgewotICAgICAgICAgICAgICAgIGhhbmRsZUFueVBhcmFtKHBhcmFtTmFtZSwgcGFyYW1WYWx1ZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBWQ2FyZEV4Y2VwdGlvbigiVW5rbm93biB0eXBlIFwiIiArIHBhcmFtTmFtZSArICJcIiIpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaGFuZGxlUGFyYW1XaXRob3V0TmFtZShzdHJBcnJheVswXSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogdkNhcmQgMy4wIHBhcnNlciBtYXkgdGhyb3cgVkNhcmRFeGNlcHRpb24uCi0gICAgICovCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCi0gICAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlUGFyYW1XaXRob3V0TmFtZShmaW5hbCBTdHJpbmcgcGFyYW1WYWx1ZSkgdGhyb3dzIFZDYXJkRXhjZXB0aW9uIHsKLSAgICAgICAgaGFuZGxlVHlwZShwYXJhbVZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBwdHlwZXZhbCA9IGtub3dudHlwZSAvICJYLSIgd29yZAotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZVR5cGUoZmluYWwgU3RyaW5nIHB0eXBldmFsKSB7Ci0gICAgICAgIFN0cmluZyB1cHBlclR5cGVWYWx1ZSA9IHB0eXBldmFsOwotICAgICAgICBpZiAoIShzS25vd25UeXBlU2V0LmNvbnRhaW5zKHVwcGVyVHlwZVZhbHVlKSB8fCB1cHBlclR5cGVWYWx1ZS5zdGFydHNXaXRoKCJYLSIpKSAmJiAKLSAgICAgICAgICAgICAgICAhbVVua25vd25UeXBlTWFwLmNvbnRhaW5zKHB0eXBldmFsKSkgewotICAgICAgICAgICAgbVVua25vd25UeXBlTWFwLmFkZChwdHlwZXZhbCk7Ci0gICAgICAgICAgICBMb2cudyhMT0dfVEFHLCAiVFlQRSB1bnN1cHBvcnRlZCBieSB2Q2FyZCAyLjE6ICIgKyBwdHlwZXZhbCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1CdWlsZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1CdWlsZGVyLnByb3BlcnR5UGFyYW1UeXBlKCJUWVBFIik7Ci0gICAgICAgICAgICBtQnVpbGRlci5wcm9wZXJ0eVBhcmFtVmFsdWUodXBwZXJUeXBlVmFsdWUpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIHB2YWx1ZXZhbCA9ICJJTkxJTkUiIC8gIlVSTCIgLyAiQ09OVEVOVC1JRCIgLyAiQ0lEIiAvICJYLSIgd29yZAotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZVZhbHVlKGZpbmFsIFN0cmluZyBwdmFsdWV2YWwpIHsKLSAgICAgICAgaWYgKCFzS25vd25WYWx1ZVNldC5jb250YWlucyhwdmFsdWV2YWwudG9VcHBlckNhc2UoKSkgJiYKLSAgICAgICAgICAgICAgICBwdmFsdWV2YWwuc3RhcnRzV2l0aCgiWC0iKSAmJgotICAgICAgICAgICAgICAgICFtVW5rbm93blZhbHVlTWFwLmNvbnRhaW5zKHB2YWx1ZXZhbCkpIHsKLSAgICAgICAgICAgIG1Vbmtub3duVmFsdWVNYXAuYWRkKHB2YWx1ZXZhbCk7Ci0gICAgICAgICAgICBMb2cudyhMT0dfVEFHLCAiVkFMVUUgdW5zdXBwb3J0ZWQgYnkgdkNhcmQgMi4xOiAiICsgcHZhbHVldmFsKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobUJ1aWxkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgbUJ1aWxkZXIucHJvcGVydHlQYXJhbVR5cGUoIlZBTFVFIik7Ci0gICAgICAgICAgICBtQnVpbGRlci5wcm9wZXJ0eVBhcmFtVmFsdWUocHZhbHVldmFsKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBwZW5jb2Rpbmd2YWwgPSAiN0JJVCIgLyAiOEJJVCIgLyAiUVVPVEVELVBSSU5UQUJMRSIgLyAiQkFTRTY0IiAvICJYLSIgd29yZAotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZUVuY29kaW5nKFN0cmluZyBwZW5jb2Rpbmd2YWwpIHRocm93cyBWQ2FyZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChpc1ZhbGlkRW5jb2RpbmcocGVuY29kaW5ndmFsKSB8fAotICAgICAgICAgICAgICAgIHBlbmNvZGluZ3ZhbC5zdGFydHNXaXRoKCJYLSIpKSB7Ci0gICAgICAgICAgICBpZiAobUJ1aWxkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1CdWlsZGVyLnByb3BlcnR5UGFyYW1UeXBlKCJFTkNPRElORyIpOwotICAgICAgICAgICAgICAgIG1CdWlsZGVyLnByb3BlcnR5UGFyYW1WYWx1ZShwZW5jb2Rpbmd2YWwpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUVuY29kaW5nID0gcGVuY29kaW5ndmFsOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IFZDYXJkRXhjZXB0aW9uKCJVbmtub3duIGVuY29kaW5nIFwiIiArIHBlbmNvZGluZ3ZhbCArICJcIiIpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIHZDYXJkIDIuMSBzcGVjaWZpY2F0aW9uIG9ubHkgYWxsb3dzIHVzLWFzY2lpIGFuZCBpc28tODg1OS14eHggKFNlZSBSRkMgMTUyMSksCi0gICAgICogYnV0IHRvZGF5J3MgdkNhcmQgb2Z0ZW4gY29udGFpbnMgb3RoZXIgY2hhcnNldCwgc28gd2UgYWxsb3cgdGhlbS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVDaGFyc2V0KFN0cmluZyBjaGFyc2V0dmFsKSB7Ci0gICAgICAgIGlmIChtQnVpbGRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtQnVpbGRlci5wcm9wZXJ0eVBhcmFtVHlwZSgiQ0hBUlNFVCIpOwotICAgICAgICAgICAgbUJ1aWxkZXIucHJvcGVydHlQYXJhbVZhbHVlKGNoYXJzZXR2YWwpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VlIGFsc28gU2VjdGlvbiA3LjEgb2YgUkZDIDE1MjEKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVMYW5ndWFnZShTdHJpbmcgbGFuZ3ZhbCkgdGhyb3dzIFZDYXJkRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nW10gc3RyQXJyYXkgPSBsYW5ndmFsLnNwbGl0KCItIik7Ci0gICAgICAgIGlmIChzdHJBcnJheS5sZW5ndGggIT0gMikgewotICAgICAgICAgICAgdGhyb3cgbmV3IFZDYXJkRXhjZXB0aW9uKCJJbnZhbGlkIExhbmd1YWdlOiBcIiIgKyBsYW5ndmFsICsgIlwiIik7Ci0gICAgICAgIH0KLSAgICAgICAgU3RyaW5nIHRtcCA9IHN0ckFycmF5WzBdOwotICAgICAgICBpbnQgbGVuZ3RoID0gdG1wLmxlbmd0aCgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoIWlzTGV0dGVyKHRtcC5jaGFyQXQoaSkpKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFZDYXJkRXhjZXB0aW9uKCJJbnZhbGlkIExhbmd1YWdlOiBcIiIgKyBsYW5ndmFsICsgIlwiIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgdG1wID0gc3RyQXJyYXlbMV07Ci0gICAgICAgIGxlbmd0aCA9IHRtcC5sZW5ndGgoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaWYgKCFpc0xldHRlcih0bXAuY2hhckF0KGkpKSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBWQ2FyZEV4Y2VwdGlvbigiSW52YWxpZCBMYW5ndWFnZTogXCIiICsgbGFuZ3ZhbCArICJcIiIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChtQnVpbGRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtQnVpbGRlci5wcm9wZXJ0eVBhcmFtVHlwZSgiTEFOR1VBR0UiKTsKLSAgICAgICAgICAgIG1CdWlsZGVyLnByb3BlcnR5UGFyYW1WYWx1ZShsYW5ndmFsKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1haW5seSBmb3IgIlgtIiB0eXBlLiBUaGlzIGFjY2VwdHMgYW55IGtpbmQgb2YgdHlwZSB3aXRob3V0IGNoZWNrLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZUFueVBhcmFtKFN0cmluZyBwYXJhbU5hbWUsIFN0cmluZyBwYXJhbVZhbHVlKSB7Ci0gICAgICAgIGlmIChtQnVpbGRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtQnVpbGRlci5wcm9wZXJ0eVBhcmFtVHlwZShwYXJhbU5hbWUpOwotICAgICAgICAgICAgbUJ1aWxkZXIucHJvcGVydHlQYXJhbVZhbHVlKHBhcmFtVmFsdWUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlUHJvcGVydHlWYWx1ZShTdHJpbmcgcHJvcGVydHlOYW1lLCBTdHJpbmcgcHJvcGVydHlWYWx1ZSkKLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgVkNhcmRFeGNlcHRpb24gewotICAgICAgICBpZiAobUVuY29kaW5nLmVxdWFsc0lnbm9yZUNhc2UoIlFVT1RFRC1QUklOVEFCTEUiKSkgewotICAgICAgICAgICAgZmluYWwgbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICAgICAgZmluYWwgU3RyaW5nIHJlc3VsdCA9IGdldFF1b3RlZFByaW50YWJsZShwcm9wZXJ0eVZhbHVlKTsKLSAgICAgICAgICAgIGlmIChtQnVpbGRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgQXJyYXlMaXN0PFN0cmluZz4gdiA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICAgICAgICAgIHYuYWRkKHJlc3VsdCk7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIucHJvcGVydHlWYWx1ZXModik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtVGltZUhhbmRsZVF1b3RlZFByaW50YWJsZSArPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHN0YXJ0OwotICAgICAgICB9IGVsc2UgaWYgKG1FbmNvZGluZy5lcXVhbHNJZ25vcmVDYXNlKCJCQVNFNjQiKSB8fAotICAgICAgICAgICAgICAgIG1FbmNvZGluZy5lcXVhbHNJZ25vcmVDYXNlKCJCIikpIHsKLSAgICAgICAgICAgIGZpbmFsIGxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgIC8vIEl0IGlzIHZlcnkgcmFyZSwgYnV0IHNvbWUgQkFTRTY0IGRhdGEgbWF5IGJlIHNvIGJpZyB0aGF0Ci0gICAgICAgICAgICAvLyBPdXRPZk1lbW9yeUVycm9yIG9jY3Vycy4gVG8gaWdub3JlIHN1Y2ggY2FzZXMsIHVzZSB0cnktY2F0Y2guCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyByZXN1bHQgPSBnZXRCYXNlNjQocHJvcGVydHlWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgaWYgKG1CdWlsZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgQXJyYXlMaXN0PFN0cmluZz4gdiA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICAgICAgICAgICAgICB2LmFkZChyZXN1bHQpOwotICAgICAgICAgICAgICAgICAgICBtQnVpbGRlci5wcm9wZXJ0eVZhbHVlcyh2KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGNhdGNoIChPdXRPZk1lbW9yeUVycm9yIGVycm9yKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIk91dE9mTWVtb3J5RXJyb3IgaGFwcGVuZWQgZHVyaW5nIHBhcnNpbmcgQkFTRTY0IGRhdGEhIik7Ci0gICAgICAgICAgICAgICAgaWYgKG1CdWlsZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbUJ1aWxkZXIucHJvcGVydHlWYWx1ZXMobnVsbCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgbVRpbWVIYW5kbGVCYXNlNjQgKz0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzdGFydDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmICghKG1FbmNvZGluZyA9PSBudWxsIHx8IG1FbmNvZGluZy5lcXVhbHNJZ25vcmVDYXNlKCI3QklUIikKLSAgICAgICAgICAgICAgICAgICAgfHwgbUVuY29kaW5nLmVxdWFsc0lnbm9yZUNhc2UoIjhCSVQiKQotICAgICAgICAgICAgICAgICAgICB8fCBtRW5jb2RpbmcudG9VcHBlckNhc2UoKS5zdGFydHNXaXRoKCJYLSIpKSkgewotICAgICAgICAgICAgICAgIExvZy53KExPR19UQUcsICJUaGUgZW5jb2RpbmcgdW5zdXBwb3J0ZWQgYnkgdkNhcmQgc3BlYzogXCIiICsgbUVuY29kaW5nICsgIlwiLiIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmaW5hbCBsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgICAgICBpZiAobUJ1aWxkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIEFycmF5TGlzdDxTdHJpbmc+IHYgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgICAgICAgICB2LmFkZChtYXliZVVuZXNjYXBlVGV4dChwcm9wZXJ0eVZhbHVlKSk7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIucHJvcGVydHlWYWx1ZXModik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtVGltZUhhbmRsZU1pc2NQcm9wZXJ0eVZhbHVlICs9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gc3RhcnQ7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRRdW90ZWRQcmludGFibGUoU3RyaW5nIGZpcnN0U3RyaW5nKSB0aHJvd3MgSU9FeGNlcHRpb24sIFZDYXJkRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gU3BlY2lmaWNhbGx5LCB0aGVyZSBtYXkgYmUgc29tZSBwYWRkaW5nIGJldHdlZW4gPSBhbmQgQ1JMRi4KLSAgICAgICAgLy8gU2VlIHRoZSBmb2xsb3dpbmc6Ci0gICAgICAgIC8vCi0gICAgICAgIC8vIHFwLWxpbmUgOj0gKihxcC1zZWdtZW50IHRyYW5zcG9ydC1wYWRkaW5nIENSTEYpCi0gICAgICAgIC8vICAgICAgICAgICAgcXAtcGFydCB0cmFuc3BvcnQtcGFkZGluZwotICAgICAgICAvLyBxcC1zZWdtZW50IDo9IHFwLXNlY3Rpb24gKihTUEFDRSAvIFRBQikgIj0iCi0gICAgICAgIC8vICAgICAgICAgICAgIDsgTWF4aW11bSBsZW5ndGggb2YgNzYgY2hhcmFjdGVycwotICAgICAgICAvLwotICAgICAgICAvLyBlLmcuIChmcm9tIFJGQyAyMDQ1KQotICAgICAgICAvLyBOb3cncyB0aGUgdGltZSA9Ci0gICAgICAgIC8vIGZvciBhbGwgZm9sayB0byBjb21lPQotICAgICAgICAvLyAgdG8gdGhlIGFpZCBvZiB0aGVpciBjb3VudHJ5LgotICAgICAgICBpZiAoZmlyc3RTdHJpbmcudHJpbSgpLmVuZHNXaXRoKCI9IikpIHsKLSAgICAgICAgICAgIC8vIHJlbW92ZSAidHJhbnNwb3J0LXBhZGRpbmciCi0gICAgICAgICAgICBpbnQgcG9zID0gZmlyc3RTdHJpbmcubGVuZ3RoKCkgLSAxOwotICAgICAgICAgICAgd2hpbGUoZmlyc3RTdHJpbmcuY2hhckF0KHBvcykgIT0gJz0nKSB7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoZmlyc3RTdHJpbmcuc3Vic3RyaW5nKDAsIHBvcyArIDEpKTsKLSAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCJcclxuIik7Ci0gICAgICAgICAgICBTdHJpbmcgbGluZTsKLSAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgICAgICAgICAgbGluZSA9IGdldExpbmUoKTsKLSAgICAgICAgICAgICAgICBpZiAobGluZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBWQ2FyZEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmlsZSBlbmRlZCBkdXJpbmcgcGFyc2luZyBxdW90ZWQtcHJpbnRhYmxlIFN0cmluZyIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobGluZS50cmltKCkuZW5kc1dpdGgoIj0iKSkgewotICAgICAgICAgICAgICAgICAgICAvLyByZW1vdmUgInRyYW5zcG9ydC1wYWRkaW5nIgotICAgICAgICAgICAgICAgICAgICBwb3MgPSBsaW5lLmxlbmd0aCgpIC0gMTsKLSAgICAgICAgICAgICAgICAgICAgd2hpbGUobGluZS5jaGFyQXQocG9zKSAhPSAnPScpIHsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChsaW5lLnN1YnN0cmluZygwLCBwb3MgKyAxKSk7Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCJcclxuIik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQobGluZSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBidWlsZGVyLnRvU3RyaW5nKCk7IAotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIGZpcnN0U3RyaW5nOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0QmFzZTY0KFN0cmluZyBmaXJzdFN0cmluZykgdGhyb3dzIElPRXhjZXB0aW9uLCBWQ2FyZEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIGJ1aWxkZXIuYXBwZW5kKGZpcnN0U3RyaW5nKTsKLSAgICAgICAgCi0gICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbGluZSA9IGdldExpbmUoKTsKLSAgICAgICAgICAgIGlmIChsaW5lID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVkNhcmRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAiRmlsZSBlbmRlZCBkdXJpbmcgcGFyc2luZyBCQVNFNjQgYmluYXJ5Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobGluZS5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBidWlsZGVyLmFwcGVuZChsaW5lKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIGJ1aWxkZXIudG9TdHJpbmcoKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogTWFpbmx5IGZvciAiQURSIiwgIk9SRyIsIGFuZCAiTiIKLSAgICAgKiBXZSBkbyBub3QgY2FyZSB0aGUgbnVtYmVyIG9mIHN0cm5vc2VtaSBoZXJlLgotICAgICAqIAotICAgICAqIGFkZHJlc3NwYXJ0cyA9IDAqNihzdHJub3NlbWkgIjsiKSBzdHJub3NlbWkKLSAgICAgKiAgICAgICAgICAgICAgOyBQTyBCb3gsIEV4dGVuZGVkIEFkZHIsIFN0cmVldCwgTG9jYWxpdHksIFJlZ2lvbiwKLSAgICAgKiAgICAgICAgICAgICAgICBQb3N0YWwgQ29kZSwgQ291bnRyeSBOYW1lCi0gICAgICogb3JncGFydHMgICAgID0gKihzdHJub3NlbWkgIjsiKSBzdHJub3NlbWkKLSAgICAgKiAgICAgICAgICAgICAgOyBGaXJzdCBpcyBPcmdhbml6YXRpb24gTmFtZSwKLSAgICAgKiAgICAgICAgICAgICAgICByZW1haW5kZXIgYXJlIE9yZ2FuaXphdGlvbiBVbml0cy4KLSAgICAgKiBuYW1lcGFydHMgICAgPSAwKjQoc3Rybm9zZW1pICI7Iikgc3Rybm9zZW1pCi0gICAgICogICAgICAgICAgICAgIDsgRmFtaWx5LCBHaXZlbiwgTWlkZGxlLCBQcmVmaXgsIFN1ZmZpeC4KLSAgICAgKiAgICAgICAgICAgICAgOyBFeGFtcGxlOlB1YmxpYztKb2huO1EuO1JldmVyZW5kIERyLjtJSUksIEVzcS4KLSAgICAgKiBzdHJub3NlbWkgICAgPSAqKCpub25zZW1pICgiXDsiIC8gIlwiIENSTEYpKSAqbm9uc2VtaQotICAgICAqICAgICAgICAgICAgICA7IFRvIGluY2x1ZGUgYSBzZW1pY29sb24gaW4gdGhpcyBzdHJpbmcsIGl0IG11c3QgYmUgZXNjYXBlZAotICAgICAqICAgICAgICAgICAgICA7IHdpdGggYSAiXCIgY2hhcmFjdGVyLgotICAgICAqICAgICAgICAgICAgICAKLSAgICAgKiBXZSBhcmUgbm90IHN1cmUgd2hldGhlciB3ZSBzaG91bGQgYWRkICJcIiBDUkxGIHRvIGVhY2ggdmFsdWUuCi0gICAgICogRm9yIG5vdywgd2UgZXhjbHVkZSB0aGVtLiAgICAgICAgICAgICAgIAotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZU11bHRpcGxlUHJvcGVydHlWYWx1ZShTdHJpbmcgcHJvcGVydHlOYW1lLCBTdHJpbmcgcHJvcGVydHlWYWx1ZSkKLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgVkNhcmRFeGNlcHRpb24gewotICAgICAgICAvLyB2Q2FyZCAyLjEgZG9lcyBub3QgYWxsb3cgUVVPVEVELVBSSU5UQUJMRSBoZXJlLAotICAgICAgICAvLyBidXQgc29tZSBzb2Z0d2FyZXMvZGV2aWNlcyBlbWl0IHN1Y2ggZGF0YS4KLSAgICAgICAgaWYgKG1FbmNvZGluZy5lcXVhbHNJZ25vcmVDYXNlKCJRVU9URUQtUFJJTlRBQkxFIikpIHsKLSAgICAgICAgICAgIHByb3BlcnR5VmFsdWUgPSBnZXRRdW90ZWRQcmludGFibGUocHJvcGVydHlWYWx1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobUJ1aWxkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgbUJ1aWxkZXIucHJvcGVydHlWYWx1ZXMoVkNhcmRVdGlscy5jb25zdHJ1Y3RMaXN0RnJvbVZhbHVlKAotICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVZhbHVlLCAoZ2V0VmVyc2lvbigpID09IFZDYXJkQ29uZmlnLkZMQUdfVjMwKSkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogdkNhcmQgMi4xIHNwZWNpZmllcyBBR0VOVCBhbGxvd3Mgb25lIHZjYXJkIGVudHJ5LiBJdCBpcyBub3QgZW5jb2RlZCBhdCBhbGwuCi0gICAgICoKLSAgICAgKiBpdGVtICA9IC4uLgotICAgICAqICAgICAgIC8gW2dyb3VwcyAiLiJdICJBR0VOVCIKLSAgICAgKiAgICAgICAgIFtwYXJhbXNdICI6IiB2Y2FyZCBDUkxGCi0gICAgICogdmNhcmQgPSAiQkVHSU4iIFt3c10gIjoiIFt3c10gIlZDQVJEIiBbd3NdIDEqQ1JMRgotICAgICAqICAgICAgICAgaXRlbXMgKkNSTEYgIkVORCIgW3dzXSAiOiIgW3dzXSAiVkNBUkQiCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlQWdlbnQoZmluYWwgU3RyaW5nIHByb3BlcnR5VmFsdWUpIHRocm93cyBWQ2FyZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghcHJvcGVydHlWYWx1ZS50b1VwcGVyQ2FzZSgpLmNvbnRhaW5zKCJCRUdJTjpWQ0FSRCIpKSB7Ci0gICAgICAgICAgICAvLyBBcHBhcmVudGx5IGludmFsaWQgbGluZSBzZWVuIGluIFdpbmRvd3MgTW9iaWxlIDYuNS4gSWdub3JlIHRoZW0uCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVkNhcmRBZ2VudE5vdFN1cHBvcnRlZEV4Y2VwdGlvbigiQUdFTlQgUHJvcGVydHkgaXMgbm90IHN1cHBvcnRlZCBub3cuIik7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gVE9ETzogU3VwcG9ydCBBR0VOVCBwcm9wZXJ0eS4KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogRm9yIHZDYXJkIDMuMC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIG1heWJlVW5lc2NhcGVUZXh0KGZpbmFsIFN0cmluZyB0ZXh0KSB7Ci0gICAgICAgIHJldHVybiB0ZXh0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdW5lc2NhcGVkIFN0cmluZyBpZiB0aGUgY2hhcmFjdGVyIHNob3VsZCBiZSB1bmVzY2FwZWQuIFJldHVybiBudWxsIG90aGVyd2lzZS4KLSAgICAgKiBlLmcuIEluIHZDYXJkIDIuMSwgIlw7IiBzaG91bGQgYmUgdW5lc2NhcGVkIGludG8gIjsiIHdoaWxlICJceCIgc2hvdWxkIG5vdCBiZS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIG1heWJlVW5lc2NhcGVDaGFyYWN0ZXIoZmluYWwgY2hhciBjaCkgewotICAgICAgICByZXR1cm4gdW5lc2NhcGVDaGFyYWN0ZXIoY2gpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHVuZXNjYXBlQ2hhcmFjdGVyKGZpbmFsIGNoYXIgY2gpIHsKLSAgICAgICAgLy8gT3JpZ2luYWwgdkNhcmQgMi4xIHNwZWNpZmljYXRpb24gZG9lcyBub3QgYWxsb3cgdHJhbnNmb3JtYXRpb24KLSAgICAgICAgLy8gIlw6IiAtPiAiOiIsICJcLCIgLT4gIiwiLCBhbmQgIlxcIiAtPiAiXCIsIGJ1dCBwcmV2aW91cyBpbXBsZW1lbnRhdGlvbiBvZgotICAgICAgICAvLyB0aGlzIGNsYXNzIGFsbG93ZWQgdGhlbSwgc28ga2VlcCBpdCBhcyBpcy4KLSAgICAgICAgaWYgKGNoID09ICdcXCcgfHwgY2ggPT0gJzsnIHx8IGNoID09ICc6JyB8fCBjaCA9PSAnLCcpIHsKLSAgICAgICAgICAgIHJldHVybiBTdHJpbmcudmFsdWVPZihjaCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBwYXJzZShmaW5hbCBJbnB1dFN0cmVhbSBpcywgZmluYWwgVkNhcmRJbnRlcnByZXRlciBidWlsZGVyKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBWQ2FyZEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBwYXJzZShpcywgVkNhcmRDb25maWcuREVGQVVMVF9DSEFSU0VULCBidWlsZGVyKTsKLSAgICB9Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gcGFyc2UoSW5wdXRTdHJlYW0gaXMsIFN0cmluZyBjaGFyc2V0LCBWQ2FyZEludGVycHJldGVyIGJ1aWxkZXIpCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFZDYXJkRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGNoYXJzZXQgPT0gbnVsbCkgewotICAgICAgICAgICAgY2hhcnNldCA9IFZDYXJkQ29uZmlnLkRFRkFVTFRfQ0hBUlNFVDsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBJbnB1dFN0cmVhbVJlYWRlciB0bXBSZWFkZXIgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaXMsIGNoYXJzZXQpOwotICAgICAgICBpZiAoVkNhcmRDb25maWcuc2hvd1BlcmZvcm1hbmNlTG9nKCkpIHsKLSAgICAgICAgICAgIG1SZWFkZXIgPSBuZXcgQ3VzdG9tQnVmZmVyZWRSZWFkZXIodG1wUmVhZGVyKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1SZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIodG1wUmVhZGVyKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgbUJ1aWxkZXIgPSBidWlsZGVyOwotCi0gICAgICAgIGxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgaWYgKG1CdWlsZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1CdWlsZGVyLnN0YXJ0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcGFyc2VWQ2FyZEZpbGUoKTsKLSAgICAgICAgaWYgKG1CdWlsZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1CdWlsZGVyLmVuZCgpOwotICAgICAgICB9Ci0gICAgICAgIG1UaW1lVG90YWwgKz0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzdGFydDsKLSAgICAgICAgCi0gICAgICAgIGlmIChWQ2FyZENvbmZpZy5zaG93UGVyZm9ybWFuY2VMb2coKSkgewotICAgICAgICAgICAgc2hvd1BlcmZvcm1hbmNlSW5mbygpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcGFyc2UoSW5wdXRTdHJlYW0gaXMsIFN0cmluZyBjaGFyc2V0LCBWQ2FyZEludGVycHJldGVyIGJ1aWxkZXIsIGJvb2xlYW4gY2FuY2VsZWQpCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFZDYXJkRXhjZXB0aW9uIHsKLSAgICAgICAgbUNhbmNlbGVkID0gY2FuY2VsZWQ7Ci0gICAgICAgIHBhcnNlKGlzLCBjaGFyc2V0LCBidWlsZGVyKTsKLSAgICB9Ci0gICAgICAgIAotICAgIHByaXZhdGUgdm9pZCBzaG93UGVyZm9ybWFuY2VJbmZvKCkgewotICAgICAgICBMb2cuZChMT0dfVEFHLCAiVG90YWwgcGFyc2luZyB0aW1lOiAgIiArIG1UaW1lVG90YWwgKyAiIG1zIik7Ci0gICAgICAgIGlmIChtUmVhZGVyIGluc3RhbmNlb2YgQ3VzdG9tQnVmZmVyZWRSZWFkZXIpIHsKLSAgICAgICAgICAgIExvZy5kKExPR19UQUcsICJUb3RhbCByZWFkTGluZSB0aW1lOiAiICsKLSAgICAgICAgICAgICAgICAgICAgKChDdXN0b21CdWZmZXJlZFJlYWRlciltUmVhZGVyKS5nZXRUb3RhbG1pbGxpc2Vjb25kKCkgKyAiIG1zIik7Ci0gICAgICAgIH0KLSAgICAgICAgTG9nLmQoTE9HX1RBRywgIlRpbWUgZm9yIGhhbmRsaW5nIHRoZSBiZWdnaW5pbmcgb2YgdGhlIHJlY29yZDogIiArCi0gICAgICAgICAgICAgICAgbVRpbWVSZWFkU3RhcnRSZWNvcmQgKyAiIG1zIik7Ci0gICAgICAgIExvZy5kKExPR19UQUcsICJUaW1lIGZvciBoYW5kbGluZyB0aGUgZW5kIG9mIHRoZSByZWNvcmQ6ICIgKwotICAgICAgICAgICAgICAgIG1UaW1lUmVhZEVuZFJlY29yZCArICIgbXMiKTsKLSAgICAgICAgTG9nLmQoTE9HX1RBRywgIlRpbWUgZm9yIHBhcnNpbmcgbGluZSwgYW5kIGhhbmRsaW5nIGdyb3VwOiAiICsKLSAgICAgICAgICAgICAgICBtVGltZVBhcnNlTGluZUFuZEhhbmRsZUdyb3VwICsgIiBtcyIpOwotICAgICAgICBMb2cuZChMT0dfVEFHLCAiVGltZSBmb3IgcGFyc2luZyBBRFIsIE9SRywgYW5kIE4gZmllbGRzOiIgKyBtVGltZVBhcnNlQWRyT3JnTiArICIgbXMiKTsKLSAgICAgICAgTG9nLmQoTE9HX1RBRywgIlRpbWUgZm9yIHBhcnNpbmcgcHJvcGVydHkgdmFsdWVzOiAiICsgbVRpbWVQYXJzZVByb3BlcnR5VmFsdWVzICsgIiBtcyIpOwotICAgICAgICBMb2cuZChMT0dfVEFHLCAiVGltZSBmb3IgaGFuZGxpbmcgbm9ybWFsIHByb3BlcnR5IHZhbHVlczogIiArCi0gICAgICAgICAgICAgICAgbVRpbWVIYW5kbGVNaXNjUHJvcGVydHlWYWx1ZSArICIgbXMiKTsKLSAgICAgICAgTG9nLmQoTE9HX1RBRywgIlRpbWUgZm9yIGhhbmRsaW5nIFF1b3RlZC1QcmludGFibGU6ICIgKwotICAgICAgICAgICAgICAgIG1UaW1lSGFuZGxlUXVvdGVkUHJpbnRhYmxlICsgIiBtcyIpOwotICAgICAgICBMb2cuZChMT0dfVEFHLCAiVGltZSBmb3IgaGFuZGxpbmcgQmFzZTY0OiAiICsgbVRpbWVIYW5kbGVCYXNlNjQgKyAiIG1zIik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzTGV0dGVyKGNoYXIgY2gpIHsKLSAgICAgICAgaWYgKChjaCA+PSAnYScgJiYgY2ggPD0gJ3onKSB8fCAoY2ggPj0gJ0EnICYmIGNoIDw9ICdaJykpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci19Ci0KLWNsYXNzIEN1c3RvbUJ1ZmZlcmVkUmVhZGVyIGV4dGVuZHMgQnVmZmVyZWRSZWFkZXIgewotICAgIHByaXZhdGUgbG9uZyBtVGltZTsKLSAgICAKLSAgICBwdWJsaWMgQ3VzdG9tQnVmZmVyZWRSZWFkZXIoUmVhZGVyIGluKSB7Ci0gICAgICAgIHN1cGVyKGluKTsKLSAgICB9Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyByZWFkTGluZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgU3RyaW5nIHJldCA9IHN1cGVyLnJlYWRMaW5lKCk7Ci0gICAgICAgIGxvbmcgZW5kID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgIG1UaW1lICs9IGVuZCAtIHN0YXJ0OwotICAgICAgICByZXR1cm4gcmV0OwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgbG9uZyBnZXRUb3RhbG1pbGxpc2Vjb25kKCkgewotICAgICAgICByZXR1cm4gbVRpbWU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkUGFyc2VyX1YzMC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkUGFyc2VyX1YzMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZWNmZTk3Li4wMDAwMDAwCi0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZFBhcnNlcl9WMzAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC5waW0udmNhcmQ7Ci0KLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5leGNlcHRpb24uVkNhcmRFeGNlcHRpb247Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLQotLyoqCi0gKiBUaGUgY2xhc3MgdXNlZCB0byBwYXJzZSB2Q2FyZCAzLjAuCi0gKiBQbGVhc2UgcmVmZXIgdG8gdkNhcmQgU3BlY2lmaWNhdGlvbiAzLjAgKGh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzI0MjYpLgotICovCi1wdWJsaWMgY2xhc3MgVkNhcmRQYXJzZXJfVjMwIGV4dGVuZHMgVkNhcmRQYXJzZXJfVjIxIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1RBRyA9ICJWQ2FyZFBhcnNlcl9WMzAiOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSGFzaFNldDxTdHJpbmc+IHNBY2NlcHRhYmxlUHJvcHNXaXRoUGFyYW0gPSBuZXcgSGFzaFNldDxTdHJpbmc+KAotICAgICAgICAgICAgQXJyYXlzLmFzTGlzdCgKLSAgICAgICAgICAgICAgICAgICAgIkJFR0lOIiwgIkxPR08iLCAiUEhPVE8iLCAiTEFCRUwiLCAiRk4iLCAiVElUTEUiLCAiU09VTkQiLCAKLSAgICAgICAgICAgICAgICAgICAgIlZFUlNJT04iLCAiVEVMIiwgIkVNQUlMIiwgIlRaIiwgIkdFTyIsICJOT1RFIiwgIlVSTCIsCi0gICAgICAgICAgICAgICAgICAgICJCREFZIiwgIlJPTEUiLCAiUkVWIiwgIlVJRCIsICJLRVkiLCAiTUFJTEVSIiwgLy8gMi4xCi0gICAgICAgICAgICAgICAgICAgICJOQU1FIiwgIlBST0ZJTEUiLCAiU09VUkNFIiwgIk5JQ0tOQU1FIiwgIkNMQVNTIiwKLSAgICAgICAgICAgICAgICAgICAgIlNPUlQtU1RSSU5HIiwgIkNBVEVHT1JJRVMiLCAiUFJPRElEIikpOyAvLyAzLjAKLSAgICAKLSAgICAvLyBBbHRob3VnaCAiN2JpdCIgYW5kICJCQVNFNjQiIGlzIG5vdCBhbGxvd2VkIGluIHZDYXJkIDMuMCwgd2UgYWxsb3cgaXQgZm9yIHNhZmV0eS4KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBIYXNoU2V0PFN0cmluZz4gc0FjY2VwdGFibGVFbmNvZGluZ1YzMCA9IG5ldyBIYXNoU2V0PFN0cmluZz4oCi0gICAgICAgICAgICBBcnJheXMuYXNMaXN0KCI3QklUIiwgIjhCSVQiLCAiQkFTRTY0IiwgIkIiKSk7Ci0gICAgCi0gICAgLy8gQWx0aG91Z2ggUkZDIDI0MjYgc3BlY2lmaWVzIHNvbWUgcHJvcGVydHkgbXVzdCBub3QgaGF2ZSBwYXJhbWV0ZXJzLCB3ZSBhbGxvdyBpdCwgCi0gICAgLy8gc2luY2UgdGhlcmUgbWF5IGJlIHNvbWUgY2FyZWVycyB3aGljaCB2aW9sYXRlcyB0aGUgUkZDLi4uCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSGFzaFNldDxTdHJpbmc+IGFjY2VwdGFibGVQcm9wc1dpdGhvdXRQYXJhbSA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLQotICAgIHByaXZhdGUgU3RyaW5nIG1QcmV2aW91c0xpbmU7Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gbUVtaXR0ZWRBZ2VudFdhcm5pbmcgPSBmYWxzZTsKLQotICAgIC8qKgotICAgICAqIFRydWUgd2hlbiB0aGUgY2FsbGVyIHdhbnRzIHRoZSBwYXJzZXIgdG8gYmUgc3RyaWN0IGFib3V0IHRoZSBpbnB1dC4KLSAgICAgKiBDdXJyZW50bHkgdGhpcyBpcyBvbmx5IGZvciB0ZXN0aW5nLgotICAgICAqLwotICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBtU3RyaWN0UGFyc2luZzsKLQotICAgIHB1YmxpYyBWQ2FyZFBhcnNlcl9WMzAoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIG1TdHJpY3RQYXJzaW5nID0gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHN0cmljdFBhcnNpbmcgd2hlbiB0cnVlLCB0aGlzIG9iamVjdCB0aHJvd3MgVkNhcmRFeGNlcHRpb24gd2hlbiB0aGUgdmNhcmQgaXMgbm90Ci0gICAgICogdmFsaWQgZnJvbSB0aGUgdmlldyBvZiB2Q2FyZCAzLjAgc3BlY2lmaWNhdGlvbiAoZGVmaW5lZCBpbiBSRkMgMjQyNikuIE5vdGUgdGhhdCB0aGlzIGNsYXNzCi0gICAgICogaXMgbm90IGZ1bGx5IHlldCBmb3IgYmVpbmcgdXNlZCB3aXRoIHRoaXMgZmxhZyBhbmQgbWF5IG5vdCBub3RpY2UgaW52YWxpZCBsaW5lKHMpLgotICAgICAqCi0gICAgICogQGhpZGUgY3VycmVudGx5IG9ubHkgZm9yIHRlc3RpbmchIAotICAgICAqLwotICAgIHB1YmxpYyBWQ2FyZFBhcnNlcl9WMzAoYm9vbGVhbiBzdHJpY3RQYXJzaW5nKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIG1TdHJpY3RQYXJzaW5nID0gc3RyaWN0UGFyc2luZzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVkNhcmRQYXJzZXJfVjMwKGludCBwYXJzZU1vZGUpIHsKLSAgICAgICAgc3VwZXIocGFyc2VNb2RlKTsKLSAgICAgICAgbVN0cmljdFBhcnNpbmcgPSBmYWxzZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgaW50IGdldFZlcnNpb24oKSB7Ci0gICAgICAgIHJldHVybiBWQ2FyZENvbmZpZy5GTEFHX1YzMDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFZlcnNpb25TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiBWQ2FyZENvbnN0YW50cy5WRVJTSU9OX1YzMDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1ZhbGlkUHJvcGVydHlOYW1lKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLSAgICAgICAgaWYgKCEoc0FjY2VwdGFibGVQcm9wc1dpdGhQYXJhbS5jb250YWlucyhwcm9wZXJ0eU5hbWUpIHx8Ci0gICAgICAgICAgICAgICAgYWNjZXB0YWJsZVByb3BzV2l0aG91dFBhcmFtLmNvbnRhaW5zKHByb3BlcnR5TmFtZSkgfHwKLSAgICAgICAgICAgICAgICBwcm9wZXJ0eU5hbWUuc3RhcnRzV2l0aCgiWC0iKSkgJiYKLSAgICAgICAgICAgICAgICAhbVVua25vd25UeXBlTWFwLmNvbnRhaW5zKHByb3BlcnR5TmFtZSkpIHsKLSAgICAgICAgICAgIG1Vbmtub3duVHlwZU1hcC5hZGQocHJvcGVydHlOYW1lKTsKLSAgICAgICAgICAgIExvZy53KExPR19UQUcsICJQcm9wZXJ0eSBuYW1lIHVuc3VwcG9ydGVkIGJ5IHZDYXJkIDMuMDogIiArIHByb3BlcnR5TmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNWYWxpZEVuY29kaW5nKFN0cmluZyBlbmNvZGluZykgewotICAgICAgICByZXR1cm4gc0FjY2VwdGFibGVFbmNvZGluZ1YzMC5jb250YWlucyhlbmNvZGluZy50b1VwcGVyQ2FzZSgpKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldExpbmUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBpZiAobVByZXZpb3VzTGluZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTdHJpbmcgcmV0ID0gbVByZXZpb3VzTGluZTsKLSAgICAgICAgICAgIG1QcmV2aW91c0xpbmUgPSBudWxsOwotICAgICAgICAgICAgcmV0dXJuIHJldDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBtUmVhZGVyLnJlYWRMaW5lKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogdkNhcmQgMy4wIHJlcXVpcmVzIHRoYXQgdGhlIGxpbmUgd2l0aCBzcGFjZSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaW5lCi0gICAgICogbXVzdCBiZSBjb21iaW5lZCB3aXRoIHByZXZpb3VzIGxpbmUuIAotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Tm9uRW1wdHlMaW5lKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBWQ2FyZEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBsaW5lOwotICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBudWxsOwotICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICAgICAgbGluZSA9IG1SZWFkZXIucmVhZExpbmUoKTsKLSAgICAgICAgICAgIGlmIChsaW5lID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoYnVpbGRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBidWlsZGVyLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtUHJldmlvdXNMaW5lICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHJldCA9IG1QcmV2aW91c0xpbmU7Ci0gICAgICAgICAgICAgICAgICAgIG1QcmV2aW91c0xpbmUgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVkNhcmRFeGNlcHRpb24oIlJlYWNoZWQgZW5kIG9mIGJ1ZmZlci4iKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobGluZS5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGJ1aWxkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gYnVpbGRlci50b1N0cmluZygpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobVByZXZpb3VzTGluZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyByZXQgPSBtUHJldmlvdXNMaW5lOwotICAgICAgICAgICAgICAgICAgICBtUHJldmlvdXNMaW5lID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGxpbmUuY2hhckF0KDApID09ICcgJyB8fCBsaW5lLmNoYXJBdCgwKSA9PSAnXHQnKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGJ1aWxkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAvLyBTZWUgU2VjdGlvbiA1LjguMSBvZiBSRkMgMjQyNSAoTUlNRS1ESVIgZG9jdW1lbnQpLgotICAgICAgICAgICAgICAgICAgICAvLyBGb2xsb3dpbmcgaXMgdGhlIGV4Y2VycHRzIGZyb20gaXQuICAKLSAgICAgICAgICAgICAgICAgICAgLy8KLSAgICAgICAgICAgICAgICAgICAgLy8gREVTQ1JJUFRJT046VGhpcyBpcyBhIGxvbmcgZGVzY3JpcHRpb24gdGhhdCBleGlzdHMgb24gYSBsb25nIGxpbmUuCi0gICAgICAgICAgICAgICAgICAgIC8vIAotICAgICAgICAgICAgICAgICAgICAvLyBDYW4gYmUgcmVwcmVzZW50ZWQgYXM6Ci0gICAgICAgICAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAgICAgICAgIC8vIERFU0NSSVBUSU9OOlRoaXMgaXMgYSBsb25nIGRlc2NyaXB0aW9uCi0gICAgICAgICAgICAgICAgICAgIC8vICB0aGF0IGV4aXN0cyBvbiBhIGxvbmcgbGluZS4KLSAgICAgICAgICAgICAgICAgICAgLy8KLSAgICAgICAgICAgICAgICAgICAgLy8gSXQgY291bGQgYWxzbyBiZSByZXByZXNlbnRlZCBhczoKLSAgICAgICAgICAgICAgICAgICAgLy8KLSAgICAgICAgICAgICAgICAgICAgLy8gREVTQ1JJUFRJT046VGhpcyBpcyBhIGxvbmcgZGVzY3JpcAotICAgICAgICAgICAgICAgICAgICAvLyAgdGlvbiB0aGF0IGV4aXN0cyBvCi0gICAgICAgICAgICAgICAgICAgIC8vICBuIGEgbG9uZyBsaW5lLgotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChsaW5lLnN1YnN0cmluZygxKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtUHJldmlvdXNMaW5lICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKG1QcmV2aW91c0xpbmUpOwotICAgICAgICAgICAgICAgICAgICBtUHJldmlvdXNMaW5lID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQobGluZS5zdWJzdHJpbmcoMSkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBWQ2FyZEV4Y2VwdGlvbigiU3BhY2UgZXhpc3RzIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpbmUiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChtUHJldmlvdXNMaW5lID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbVByZXZpb3VzTGluZSA9IGxpbmU7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChidWlsZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBidWlsZGVyLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcmV0ID0gbVByZXZpb3VzTGluZTsKLSAgICAgICAgICAgICAgICAgICAgbVByZXZpb3VzTGluZSA9IGxpbmU7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIAotICAgIC8qKgotICAgICAqIHZjYXJkID0gW2dyb3VwICIuIl0gIkJFR0lOIiAiOiIgIlZDQVJEIiAxICogQ1JMRgotICAgICAqICAgICAgICAgMSAqIChjb250ZW50bGluZSkKLSAgICAgKiAgICAgICAgIDtBIHZDYXJkIG9iamVjdCBNVVNUIGluY2x1ZGUgdGhlIFZFUlNJT04sIEZOIGFuZCBOIHR5cGVzLgotICAgICAqICAgICAgICAgW2dyb3VwICIuIl0gIkVORCIgIjoiICJWQ0FSRCIgMSAqIENSTEYKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiByZWFkQmVnaW5WQ2FyZChib29sZWFuIGFsbG93R2FyYmFnZSkgdGhyb3dzIElPRXhjZXB0aW9uLCBWQ2FyZEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIFRPRE86IHZDYXJkIDMuMCBzdXBwb3J0cyBncm91cC4KLSAgICAgICAgcmV0dXJuIHN1cGVyLnJlYWRCZWdpblZDYXJkKGFsbG93R2FyYmFnZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgcmVhZEVuZFZDYXJkKGJvb2xlYW4gdXNlQ2FjaGUsIGJvb2xlYW4gYWxsb3dHYXJiYWdlKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBWQ2FyZEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIFRPRE86IHZDYXJkIDMuMCBzdXBwb3J0cyBncm91cC4KLSAgICAgICAgc3VwZXIucmVhZEVuZFZDYXJkKHVzZUNhY2hlLCBhbGxvd0dhcmJhZ2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHZDYXJkIDMuMCBhbGxvd3MgaWFuYS10b2tlbiBhcyBwYXJhbVR5cGUsIHdoaWxlIHZDYXJkIDIuMSBkb2VzIG5vdC4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVQYXJhbXMoU3RyaW5nIHBhcmFtcykgdGhyb3dzIFZDYXJkRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHN1cGVyLmhhbmRsZVBhcmFtcyhwYXJhbXMpOwotICAgICAgICB9IGNhdGNoIChWQ2FyZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBtYXliZSBJQU5BIHR5cGUKLSAgICAgICAgICAgIFN0cmluZ1tdIHN0ckFycmF5ID0gcGFyYW1zLnNwbGl0KCI9IiwgMik7Ci0gICAgICAgICAgICBpZiAoc3RyQXJyYXkubGVuZ3RoID09IDIpIHsKLSAgICAgICAgICAgICAgICBoYW5kbGVBbnlQYXJhbShzdHJBcnJheVswXSwgc3RyQXJyYXlbMV0pOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBNdXN0IG5vdCBjb21lIGhlcmUgaW4gdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24uCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFZDYXJkRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgIlVua25vd24gcGFyYW1zIHZhbHVlOiAiICsgcGFyYW1zKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZUFueVBhcmFtKFN0cmluZyBwYXJhbU5hbWUsIFN0cmluZyBwYXJhbVZhbHVlKSB7Ci0gICAgICAgIHN1cGVyLmhhbmRsZUFueVBhcmFtKHBhcmFtTmFtZSwgcGFyYW1WYWx1ZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlUGFyYW1XaXRob3V0TmFtZShmaW5hbCBTdHJpbmcgcGFyYW1WYWx1ZSkgdGhyb3dzIFZDYXJkRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKG1TdHJpY3RQYXJzaW5nKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVkNhcmRFeGNlcHRpb24oIlBhcmFtZXRlciB3aXRob3V0IG5hbWUgaXMgbm90IGFjY2VwdGFibGUgaW4gdkNhcmQgMy4wIik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzdXBlci5oYW5kbGVQYXJhbVdpdGhvdXROYW1lKHBhcmFtVmFsdWUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIHZDYXJkIDMuMCBkZWZpbmVzCi0gICAgICogIAotICAgICAqICBwYXJhbSAgICAgICAgID0gcGFyYW0tbmFtZSAiPSIgcGFyYW0tdmFsdWUgKigiLCIgcGFyYW0tdmFsdWUpCi0gICAgICogIHBhcmFtLW5hbWUgICAgPSBpYW5hLXRva2VuIC8geC1uYW1lCi0gICAgICogIHBhcmFtLXZhbHVlICAgPSBwdGV4dCAvIHF1b3RlZC1zdHJpbmcKLSAgICAgKiAgcXVvdGVkLXN0cmluZyA9IERRVU9URSBRU0FGRS1DSEFSIERRVU9URQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZVR5cGUoU3RyaW5nIHB0eXBldmFsdWVzKSB7Ci0gICAgICAgIFN0cmluZ1tdIHB0eXBlQXJyYXkgPSBwdHlwZXZhbHVlcy5zcGxpdCgiLCIpOwotICAgICAgICBtQnVpbGRlci5wcm9wZXJ0eVBhcmFtVHlwZSgiVFlQRSIpOwotICAgICAgICBmb3IgKFN0cmluZyB2YWx1ZSA6IHB0eXBlQXJyYXkpIHsKLSAgICAgICAgICAgIGludCBsZW5ndGggPSB2YWx1ZS5sZW5ndGgoKTsKLSAgICAgICAgICAgIGlmIChsZW5ndGggPj0gMiAmJiB2YWx1ZS5zdGFydHNXaXRoKCJcIiIpICYmIHZhbHVlLmVuZHNXaXRoKCJcIiIpKSB7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIucHJvcGVydHlQYXJhbVZhbHVlKHZhbHVlLnN1YnN0cmluZygxLCB2YWx1ZS5sZW5ndGgoKSAtIDEpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIucHJvcGVydHlQYXJhbVZhbHVlKHZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZUFnZW50KFN0cmluZyBwcm9wZXJ0eVZhbHVlKSB7Ci0gICAgICAgIC8vIFRoZSB3YXkgaG93IHZDYXJkIDMuMCBzdXBwb3J0cyAiQUdFTlQiIGlzIGNvbXBsZXRlbHkgZGlmZmVyZW50IGZyb20gdkNhcmQgMi4xLgotICAgICAgICAvLwotICAgICAgICAvLyBlLmcuCi0gICAgICAgIC8vIEFHRU5UOkJFR0lOOlZDQVJEXG5GTjpKb2UgRnJpZGF5XG5URUw6KzEtOTE5LTU1NS03ODc4XG4KLSAgICAgICAgLy8gIFRJVExFOkFyZWEgQWRtaW5pc3RyYXRvclwsIEFzc2lzdGFudFxuIEVNQUlMXDtUWVBFPUlOVEVSTlxuCi0gICAgICAgIC8vICBFVDpqZnJpZGF5QGhvc3QuY29tXG5FTkQ6VkNBUkRcbgotICAgICAgICAvLwotICAgICAgICAvLyBUT0RPOiBmaXggdGhpcy4KLSAgICAgICAgLy8KLSAgICAgICAgLy8gaXNzdWU6Ci0gICAgICAgIC8vICB2Q2FyZCAzLjAgYWxzbyBhbGxvd3MgdGhpcyBhcyBhbiBleGFtcGxlLgotICAgICAgICAvLwotICAgICAgICAvLyBBR0VOVDtWQUxVRT11cmk6Ci0gICAgICAgIC8vICBDSUQ6SlFQVUJMSUMucGFydDMuOTYwMTI5VDA4MzAyMC54eXpNYWlsQGhvc3QzLmNvbQotICAgICAgICAvLwotICAgICAgICAvLyBUaGlzIGlzIG5vdCB2Q2FyZC4gU2hvdWxkIHdlIHN1cHBvcnQgdGhpcz8KLSAgICAgICAgLy8KLSAgICAgICAgLy8gSnVzdCBpZ25vcmUgdGhlIGxpbmUgZm9yIG5vdywgc2luY2Ugd2UgY2Fubm90IGtub3cgaG93IHRvIGhhbmRsZSBpdC4uLgotICAgICAgICBpZiAoIW1FbWl0dGVkQWdlbnRXYXJuaW5nKSB7Ci0gICAgICAgICAgICBMb2cudyhMT0dfVEFHLCAiQUdFTlQgaW4gdkNhcmQgMy4wIGlzIG5vdCBzdXBwb3J0ZWQgeWV0LiBJZ25vcmUgaXQiKTsKLSAgICAgICAgICAgIG1FbWl0dGVkQWdlbnRXYXJuaW5nID0gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiB2Q2FyZCAzLjAgZG9lcyBub3QgcmVxdWlyZSB0d28gQ1JMRiBhdCB0aGUgbGFzdCBvZiBCQVNFNjQgZGF0YS4KLSAgICAgKiBJdCBvbmx5IHJlcXVpcmVzIHRoYXQgZGF0YSBzaG91bGQgYmUgTUlNRS1lbmNvZGVkLgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0QmFzZTY0KFN0cmluZyBmaXJzdFN0cmluZykgdGhyb3dzIElPRXhjZXB0aW9uLCBWQ2FyZEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIGJ1aWxkZXIuYXBwZW5kKGZpcnN0U3RyaW5nKTsKLQotICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICAgICAgU3RyaW5nIGxpbmUgPSBnZXRMaW5lKCk7Ci0gICAgICAgICAgICBpZiAobGluZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFZDYXJkRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgIkZpbGUgZW5kZWQgZHVyaW5nIHBhcnNpbmcgQkFTRTY0IGJpbmFyeSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGxpbmUubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfSBlbHNlIGlmICghbGluZS5zdGFydHNXaXRoKCIgIikgJiYgIWxpbmUuc3RhcnRzV2l0aCgiXHQiKSkgewotICAgICAgICAgICAgICAgIG1QcmV2aW91c0xpbmUgPSBsaW5lOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQobGluZSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBidWlsZGVyLnRvU3RyaW5nKCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEVTQ0FQRUQtQ0hBUiA9ICJcXCIgLyAiXDsiIC8gIlwsIiAvICJcbiIgLyAiXE4iKQotICAgICAqICAgICAgICAgICAgICA7IFxcIGVuY29kZXMgXCwgXG4gb3IgXE4gZW5jb2RlcyBuZXdsaW5lCi0gICAgICogICAgICAgICAgICAgIDsgXDsgZW5jb2RlcyA7LCBcLCBlbmNvZGVzICwKLSAgICAgKiAgICAgICAgICAgICAgCi0gICAgICogTm90ZTogQXBwbGUgZXNjYXBlcyAnOicgaW50byAnXDonIHdoaWxlIGRvZXMgbm90IGVzY2FwZSAnXCcKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIG1heWJlVW5lc2NhcGVUZXh0KFN0cmluZyB0ZXh0KSB7Ci0gICAgICAgIHJldHVybiB1bmVzY2FwZVRleHQodGV4dCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgdW5lc2NhcGVUZXh0KFN0cmluZyB0ZXh0KSB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIGludCBsZW5ndGggPSB0ZXh0Lmxlbmd0aCgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBjaGFyIGNoID0gdGV4dC5jaGFyQXQoaSk7Ci0gICAgICAgICAgICBpZiAoY2ggPT0gJ1xcJyAmJiBpIDwgbGVuZ3RoIC0gMSkgewotICAgICAgICAgICAgICAgIGNoYXIgbmV4dF9jaCA9IHRleHQuY2hhckF0KCsraSk7IAotICAgICAgICAgICAgICAgIGlmIChuZXh0X2NoID09ICduJyB8fCBuZXh0X2NoID09ICdOJykgewotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiXG4iKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChuZXh0X2NoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGNoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYnVpbGRlci50b1N0cmluZygpOyAgICAgICAgCi0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBtYXliZVVuZXNjYXBlQ2hhcmFjdGVyKGNoYXIgY2gpIHsKLSAgICAgICAgcmV0dXJuIHVuZXNjYXBlQ2hhcmFjdGVyKGNoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyB1bmVzY2FwZUNoYXJhY3RlcihjaGFyIGNoKSB7Ci0gICAgICAgIGlmIChjaCA9PSAnbicgfHwgY2ggPT0gJ04nKSB7Ci0gICAgICAgICAgICByZXR1cm4gIlxuIjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBTdHJpbmcudmFsdWVPZihjaCk7Ci0gICAgICAgIH0gICAgICAgIAotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZFNvdXJjZURldGVjdG9yLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRTb3VyY2VEZXRlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Mjk3YzUwLi4wMDAwMDAwCi0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZFNvdXJjZURldGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGFuZHJvaWQucGltLnZjYXJkOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi0vKioKLSAqIENsYXNzIHdoaWNoIHRyaWVzIHRvIGRldGVjdHMgdGhlIHNvdXJjZSBvZiB0aGUgdkNhcmQgZnJvbSBpdHMgcHJvcGVydGllcy4KLSAqIEN1cnJlbnRseSB0aGlzIGltcGxlbWVudGF0aW9uIGlzIHZlcnkgcHJlbWF0dXJlLgotICogQGhpZGUKLSAqLwotcHVibGljIGNsYXNzIFZDYXJkU291cmNlRGV0ZWN0b3IgaW1wbGVtZW50cyBWQ2FyZEludGVycHJldGVyIHsKLSAgICBwcml2YXRlIHN0YXRpYyBTZXQ8U3RyaW5nPiBBUFBMRV9TSUdOUyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oQXJyYXlzLmFzTGlzdCgKLSAgICAgICAgICAgICJYLVBIT05FVElDLUZJUlNULU5BTUUiLCAiWC1QSE9ORVRJQy1NSURETEUtTkFNRSIsICJYLVBIT05FVElDLUxBU1QtTkFNRSIsCi0gICAgICAgICAgICAiWC1BQkFEUiIsICJYLUFCVUlEIikpOwotICAgIAotICAgIHByaXZhdGUgc3RhdGljIFNldDxTdHJpbmc+IEpBUEFORVNFX01PQklMRV9QSE9ORV9TSUdOUyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oQXJyYXlzLmFzTGlzdCgKLSAgICAgICAgICAgICJYLUdOTyIsICJYLUdOIiwgIlgtUkVEVUNUSU9OIikpOwotICAgIAotICAgIHByaXZhdGUgc3RhdGljIFNldDxTdHJpbmc+IFdJTkRPV1NfTU9CSUxFX1BIT05FX1NJR05TID0gbmV3IEhhc2hTZXQ8U3RyaW5nPihBcnJheXMuYXNMaXN0KAotICAgICAgICAgICAgIlgtTUlDUk9TT0ZULUFTU1RfVEVMIiwgIlgtTUlDUk9TT0ZULUFTU0lTVEFOVCIsICJYLU1JQ1JPU09GVC1PRkZJQ0VMT0MiKSk7Ci0gICAgCi0gICAgLy8gTm90ZTogdGhlc2Ugc2lnbmVzIGFwcGVhcnMgYmVmb3JlIHRoZSBzaWducyBvZiB0aGUgb3RoZXIgdHlwZSAoZS5nLiAiWC1HTiIpLgotICAgIC8vIEluIG90aGVyIHdvcmRzLCBKYXBhbmVzZSBGT01BIG1vYmlsZSBwaG9uZXMgYXJlIGRldGVjdGVkIGFzIEZPTUEsIG5vdCBKQVBBTkVTRV9NT0JJTEVfUEhPTkVTLgotICAgIHByaXZhdGUgc3RhdGljIFNldDxTdHJpbmc+IEZPTUFfU0lHTlMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KEFycmF5cy5hc0xpc3QoCi0gICAgICAgICAgICAiWC1TRC1WRVJOIiwgIlgtU0QtRk9STUFUX1ZFUiIsICJYLVNELUNBVEVHT1JJRVMiLCAiWC1TRC1DTEFTUyIsICJYLVNELURDUkVBVEVEIiwKLSAgICAgICAgICAgICJYLVNELURFU0NSSVBUSU9OIikpOwotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBUWVBFX0ZPTUFfQ0hBUlNFVF9TSUdOID0gIlgtU0QtQ0hBUl9DT0RFIjsKLSAgICAKLSAgICBwcml2YXRlIGludCBtVHlwZSA9IFZDYXJkQ29uZmlnLlBBUlNFX1RZUEVfVU5LTk9XTjsKLSAgICAvLyBTb21lIG1vYmlsZSBwaG9uZXMgKGxpa2UgRk9NQSkgdGVsbHMgdXMgdGhlIGNoYXJzZXQgb2YgdGhlIGRhdGEuCi0gICAgcHJpdmF0ZSBib29sZWFuIG1OZWVkUGFyc2VTcGVjaWZpZWRDaGFyc2V0OwotICAgIHByaXZhdGUgU3RyaW5nIG1TcGVjaWZpZWRDaGFyc2V0OwotICAgIAotICAgIHB1YmxpYyB2b2lkIHN0YXJ0KCkgewotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBlbmQoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc3RhcnRFbnRyeSgpIHsKLSAgICB9ICAgIAotCi0gICAgcHVibGljIHZvaWQgc3RhcnRQcm9wZXJ0eSgpIHsKLSAgICAgICAgbU5lZWRQYXJzZVNwZWNpZmllZENoYXJzZXQgPSBmYWxzZTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgZW5kUHJvcGVydHkoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZW5kRW50cnkoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHJvcGVydHlHcm91cChTdHJpbmcgZ3JvdXApIHsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgcHJvcGVydHlOYW1lKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIGlmIChuYW1lLmVxdWFsc0lnbm9yZUNhc2UoVFlQRV9GT01BX0NIQVJTRVRfU0lHTikpIHsKLSAgICAgICAgICAgIG1UeXBlID0gVkNhcmRDb25maWcuUEFSU0VfVFlQRV9GT01BOwotICAgICAgICAgICAgbU5lZWRQYXJzZVNwZWNpZmllZENoYXJzZXQgPSB0cnVlOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtVHlwZSAhPSBWQ2FyZENvbmZpZy5QQVJTRV9UWVBFX1VOS05PV04pIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAoV0lORE9XU19NT0JJTEVfUEhPTkVfU0lHTlMuY29udGFpbnMobmFtZSkpIHsKLSAgICAgICAgICAgIG1UeXBlID0gVkNhcmRDb25maWcuUEFSU0VfVFlQRV9XSU5ET1dTX01PQklMRV9KUDsKLSAgICAgICAgfSBlbHNlIGlmIChGT01BX1NJR05TLmNvbnRhaW5zKG5hbWUpKSB7Ci0gICAgICAgICAgICBtVHlwZSA9IFZDYXJkQ29uZmlnLlBBUlNFX1RZUEVfRk9NQTsKLSAgICAgICAgfSBlbHNlIGlmIChKQVBBTkVTRV9NT0JJTEVfUEhPTkVfU0lHTlMuY29udGFpbnMobmFtZSkpIHsKLSAgICAgICAgICAgIG1UeXBlID0gVkNhcmRDb25maWcuUEFSU0VfVFlQRV9NT0JJTEVfUEhPTkVfSlA7Ci0gICAgICAgIH0gZWxzZSBpZiAoQVBQTEVfU0lHTlMuY29udGFpbnMobmFtZSkpIHsKLSAgICAgICAgICAgIG1UeXBlID0gVkNhcmRDb25maWcuUEFSU0VfVFlQRV9BUFBMRTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHByb3BlcnR5UGFyYW1UeXBlKFN0cmluZyB0eXBlKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHJvcGVydHlQYXJhbVZhbHVlKFN0cmluZyB2YWx1ZSkgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHByb3BlcnR5VmFsdWVzKExpc3Q8U3RyaW5nPiB2YWx1ZXMpIHsKLSAgICAgICAgaWYgKG1OZWVkUGFyc2VTcGVjaWZpZWRDaGFyc2V0ICYmIHZhbHVlcy5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICBtU3BlY2lmaWVkQ2hhcnNldCA9IHZhbHVlcy5nZXQoMCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBwYWNrYWdlICovIGludCBnZXRFc3RpbWF0ZWRUeXBlKCkgewotICAgICAgICByZXR1cm4gbVR5cGU7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybiBjaGFyc2V0IFN0cmluZyBndWVzc2VkIGZyb20gdGhlIHNvdXJjZSdzIHByb3BlcnRpZXMuCi0gICAgICogVGhpcyBtZXRob2QgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgcGFyc2luZyB0YXJnZXQgZmlsZShzKS4KLSAgICAgKiBAcmV0dXJuIENoYXJzZXQgU3RyaW5nLiBOdWxsIGlzIHJldHVybmVkIGlmIGd1ZXNzaW5nIHRoZSBzb3VyY2UgZmFpbHMuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRFc3RpbWF0ZWRDaGFyc2V0KCkgewotICAgICAgICBpZiAobVNwZWNpZmllZENoYXJzZXQgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG1TcGVjaWZpZWRDaGFyc2V0OwotICAgICAgICB9Ci0gICAgICAgIHN3aXRjaCAobVR5cGUpIHsKLSAgICAgICAgICAgIGNhc2UgVkNhcmRDb25maWcuUEFSU0VfVFlQRV9XSU5ET1dTX01PQklMRV9KUDoKLSAgICAgICAgICAgIGNhc2UgVkNhcmRDb25maWcuUEFSU0VfVFlQRV9GT01BOgotICAgICAgICAgICAgY2FzZSBWQ2FyZENvbmZpZy5QQVJTRV9UWVBFX01PQklMRV9QSE9ORV9KUDoKLSAgICAgICAgICAgICAgICByZXR1cm4gIlNISUZUX0pJUyI7Ci0gICAgICAgICAgICBjYXNlIFZDYXJkQ29uZmlnLlBBUlNFX1RZUEVfQVBQTEU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJVVEYtOCI7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkVXRpbHMuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZFV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExYjExMmIuLjAwMDAwMDAKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC5waW0udmNhcmQ7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFByb3ZpZGVyT3BlcmF0aW9uOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5EYXRhOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuSW07Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5QaG9uZTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLlN0cnVjdHVyZWRQb3N0YWw7Ci1pbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuUGhvbmVOdW1iZXJVdGlsczsKLWltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotLyoqCi0gKiBVdGlsaXRpZXMgZm9yIFZDYXJkIGhhbmRsaW5nIGNvZGVzLgotICovCi1wdWJsaWMgY2xhc3MgVkNhcmRVdGlscyB7Ci0gICAgLy8gTm90ZSB0aGF0IG5vdCBhbGwgdHlwZXMgYXJlIGluY2x1ZGVkIGluIHRoaXMgbWFwL3NldCwgc2luY2UsIGZvciBleGFtcGxlLCBUWVBFX0hPTUVfRkFYIGlzCi0gICAgLy8gY29udmVydGVkIHRvIHR3byBwYXJhbWV0ZXIgU3RyaW5ncy4gVGhlc2Ugb25seSBjb250YWluIHNvbWUgbWlub3IgZmllbGRzIHZhbGlkIGluIGJvdGgKLSAgICAvLyB2Q2FyZCBhbmQgY3VycmVudCAoYXMgb2YgMjAwOS0wOC0wNykgQ29udGFjdHMgc3RydWN0dXJlLiAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8SW50ZWdlciwgU3RyaW5nPiBzS25vd25QaG9uZVR5cGVzTWFwX0l0b1M7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU2V0PFN0cmluZz4gc1Bob25lVHlwZXNVbmtub3duVG9Db250YWN0c1NldDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8U3RyaW5nLCBJbnRlZ2VyPiBzS25vd25QaG9uZVR5cGVNYXBfU3RvSTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8SW50ZWdlciwgU3RyaW5nPiBzS25vd25JbVByb3BOYW1lTWFwX0l0b1M7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU2V0PFN0cmluZz4gc01vYmlsZVBob25lTGFiZWxTZXQ7Ci0KLSAgICBzdGF0aWMgewotICAgICAgICBzS25vd25QaG9uZVR5cGVzTWFwX0l0b1MgPSBuZXcgSGFzaE1hcDxJbnRlZ2VyLCBTdHJpbmc+KCk7Ci0gICAgICAgIHNLbm93blBob25lVHlwZU1hcF9TdG9JID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBJbnRlZ2VyPigpOwotCi0gICAgICAgIHNLbm93blBob25lVHlwZXNNYXBfSXRvUy5wdXQoUGhvbmUuVFlQRV9DQVIsIFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfQ0FSKTsKLSAgICAgICAgc0tub3duUGhvbmVUeXBlTWFwX1N0b0kucHV0KFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfQ0FSLCBQaG9uZS5UWVBFX0NBUik7Ci0gICAgICAgIHNLbm93blBob25lVHlwZXNNYXBfSXRvUy5wdXQoUGhvbmUuVFlQRV9QQUdFUiwgVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9QQUdFUik7Ci0gICAgICAgIHNLbm93blBob25lVHlwZU1hcF9TdG9JLnB1dChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX1BBR0VSLCBQaG9uZS5UWVBFX1BBR0VSKTsKLSAgICAgICAgc0tub3duUGhvbmVUeXBlc01hcF9JdG9TLnB1dChQaG9uZS5UWVBFX0lTRE4sIFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfSVNETik7Ci0gICAgICAgIHNLbm93blBob25lVHlwZU1hcF9TdG9JLnB1dChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX0lTRE4sIFBob25lLlRZUEVfSVNETik7Ci0gICAgICAgIAotICAgICAgICBzS25vd25QaG9uZVR5cGVNYXBfU3RvSS5wdXQoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9IT01FLCBQaG9uZS5UWVBFX0hPTUUpOwotICAgICAgICBzS25vd25QaG9uZVR5cGVNYXBfU3RvSS5wdXQoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9XT1JLLCBQaG9uZS5UWVBFX1dPUkspOwotICAgICAgICBzS25vd25QaG9uZVR5cGVNYXBfU3RvSS5wdXQoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9DRUxMLCBQaG9uZS5UWVBFX01PQklMRSk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgIHNLbm93blBob25lVHlwZU1hcF9TdG9JLnB1dChWQ2FyZENvbnN0YW50cy5QQVJBTV9QSE9ORV9FWFRSQV9UWVBFX09USEVSLCBQaG9uZS5UWVBFX09USEVSKTsKLSAgICAgICAgc0tub3duUGhvbmVUeXBlTWFwX1N0b0kucHV0KFZDYXJkQ29uc3RhbnRzLlBBUkFNX1BIT05FX0VYVFJBX1RZUEVfQ0FMTEJBQ0ssCi0gICAgICAgICAgICAgICAgUGhvbmUuVFlQRV9DQUxMQkFDSyk7Ci0gICAgICAgIHNLbm93blBob25lVHlwZU1hcF9TdG9JLnB1dCgKLSAgICAgICAgICAgICAgICBWQ2FyZENvbnN0YW50cy5QQVJBTV9QSE9ORV9FWFRSQV9UWVBFX0NPTVBBTllfTUFJTiwgUGhvbmUuVFlQRV9DT01QQU5ZX01BSU4pOwotICAgICAgICBzS25vd25QaG9uZVR5cGVNYXBfU3RvSS5wdXQoVkNhcmRDb25zdGFudHMuUEFSQU1fUEhPTkVfRVhUUkFfVFlQRV9SQURJTywgUGhvbmUuVFlQRV9SQURJTyk7Ci0gICAgICAgIHNLbm93blBob25lVHlwZU1hcF9TdG9JLnB1dChWQ2FyZENvbnN0YW50cy5QQVJBTV9QSE9ORV9FWFRSQV9UWVBFX1RUWV9UREQsCi0gICAgICAgICAgICAgICAgUGhvbmUuVFlQRV9UVFlfVEREKTsKLSAgICAgICAgc0tub3duUGhvbmVUeXBlTWFwX1N0b0kucHV0KFZDYXJkQ29uc3RhbnRzLlBBUkFNX1BIT05FX0VYVFJBX1RZUEVfQVNTSVNUQU5ULAotICAgICAgICAgICAgICAgIFBob25lLlRZUEVfQVNTSVNUQU5UKTsKLQotICAgICAgICBzUGhvbmVUeXBlc1Vua25vd25Ub0NvbnRhY3RzU2V0ID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotICAgICAgICBzUGhvbmVUeXBlc1Vua25vd25Ub0NvbnRhY3RzU2V0LmFkZChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX01PREVNKTsKLSAgICAgICAgc1Bob25lVHlwZXNVbmtub3duVG9Db250YWN0c1NldC5hZGQoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9NU0cpOwotICAgICAgICBzUGhvbmVUeXBlc1Vua25vd25Ub0NvbnRhY3RzU2V0LmFkZChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX0JCUyk7Ci0gICAgICAgIHNQaG9uZVR5cGVzVW5rbm93blRvQ29udGFjdHNTZXQuYWRkKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfVklERU8pOwotCi0gICAgICAgIHNLbm93bkltUHJvcE5hbWVNYXBfSXRvUyA9IG5ldyBIYXNoTWFwPEludGVnZXIsIFN0cmluZz4oKTsKLSAgICAgICAgc0tub3duSW1Qcm9wTmFtZU1hcF9JdG9TLnB1dChJbS5QUk9UT0NPTF9BSU0sIFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1hfQUlNKTsKLSAgICAgICAgc0tub3duSW1Qcm9wTmFtZU1hcF9JdG9TLnB1dChJbS5QUk9UT0NPTF9NU04sIFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1hfTVNOKTsKLSAgICAgICAgc0tub3duSW1Qcm9wTmFtZU1hcF9JdG9TLnB1dChJbS5QUk9UT0NPTF9ZQUhPTywgVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfWF9ZQUhPTyk7Ci0gICAgICAgIHNLbm93bkltUHJvcE5hbWVNYXBfSXRvUy5wdXQoSW0uUFJPVE9DT0xfU0tZUEUsIFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1hfU0tZUEVfVVNFUk5BTUUpOwotICAgICAgICBzS25vd25JbVByb3BOYW1lTWFwX0l0b1MucHV0KEltLlBST1RPQ09MX0dPT0dMRV9UQUxLLAotICAgICAgICAgICAgICAgIFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1hfR09PR0xFX1RBTEspOwotICAgICAgICBzS25vd25JbVByb3BOYW1lTWFwX0l0b1MucHV0KEltLlBST1RPQ09MX0lDUSwgVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfWF9JQ1EpOwotICAgICAgICBzS25vd25JbVByb3BOYW1lTWFwX0l0b1MucHV0KEltLlBST1RPQ09MX0pBQkJFUiwgVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfWF9KQUJCRVIpOwotICAgICAgICBzS25vd25JbVByb3BOYW1lTWFwX0l0b1MucHV0KEltLlBST1RPQ09MX1FRLCBWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9YX1FRKTsKLSAgICAgICAgc0tub3duSW1Qcm9wTmFtZU1hcF9JdG9TLnB1dChJbS5QUk9UT0NPTF9ORVRNRUVUSU5HLCBWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9YX05FVE1FRVRJTkcpOwotCi0gICAgICAgIC8vIFx1NjQzQVx1NUUyRlx1OTZGQlx1OEE3MSA9IEZ1bGwtd2lkdGggSGlyYWdhbmEgIktlaXRhaS1EZW53YSIgKG1vYmlsZSBwaG9uZSkKLSAgICAgICAgLy8gXHU2NDNBXHU1RTJGID0gRnVsbC13aWR0aCBIaXJhZ2FuYSAiS2VpdGFpIiAobW9iaWxlIHBob25lKQotICAgICAgICAvLyBcdTMwQjFcdTMwQTRcdTMwQkZcdTMwQTQgPSBGdWxsLXdpZHRoIEthdGFrYW5hICJLZWl0YWkiIChtb2JpbGUgcGhvbmUpCi0gICAgICAgIC8vIFx1RkY3OVx1RkY3Mlx1RkY4MFx1RkY3MiA9IEhhbGYtd2lkdGggS2F0YWthbmEgIktlaXRhaSIgKG1vYmlsZSBwaG9uZSkKLSAgICAgICAgc01vYmlsZVBob25lTGFiZWxTZXQgPSBuZXcgSGFzaFNldDxTdHJpbmc+KEFycmF5cy5hc0xpc3QoCi0gICAgICAgICAgICAgICAgIk1PQklMRSIsICJcdTY0M0FcdTVFMkZcdTk2RkJcdThBNzEiLCAiXHU2NDNBXHU1RTJGIiwgIlx1MzBCMVx1MzBBNFx1MzBCRlx1MzBBNCIsCi0gICAgICAgICAgICAgICAgIlx1RkY3OVx1RkY3Mlx1RkY4MFx1RkY3MiIpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRQaG9uZVR5cGVTdHJpbmcoSW50ZWdlciB0eXBlKSB7Ci0gICAgICAgIHJldHVybiBzS25vd25QaG9uZVR5cGVzTWFwX0l0b1MuZ2V0KHR5cGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgSW50ZXJnZXIgd2hlbiB0aGUgZ2l2ZW4gdHlwZXMgY2FuIGJlIHBhcnNlZCBhcyBrbm93biB0eXBlLiBSZXR1cm5zIFN0cmluZyBvYmplY3QKLSAgICAgKiB3aGVuIG5vdCwgd2hpY2ggc2hvdWxkIGJlIHNldCB0byBsYWJlbC4gCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0UGhvbmVUeXBlRnJvbVN0cmluZ3MoQ29sbGVjdGlvbjxTdHJpbmc+IHR5cGVzLAotICAgICAgICAgICAgU3RyaW5nIG51bWJlcikgewotICAgICAgICBpZiAobnVtYmVyID09IG51bGwpIHsKLSAgICAgICAgICAgIG51bWJlciA9ICIiOwotICAgICAgICB9Ci0gICAgICAgIGludCB0eXBlID0gLTE7Ci0gICAgICAgIFN0cmluZyBsYWJlbCA9IG51bGw7Ci0gICAgICAgIGJvb2xlYW4gaXNGYXggPSBmYWxzZTsKLSAgICAgICAgYm9vbGVhbiBoYXNQcmVmID0gZmFsc2U7Ci0gICAgICAgIAotICAgICAgICBpZiAodHlwZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChTdHJpbmcgdHlwZVN0cmluZyA6IHR5cGVzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHR5cGVTdHJpbmcgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdHlwZVN0cmluZyA9IHR5cGVTdHJpbmcudG9VcHBlckNhc2UoKTsKLSAgICAgICAgICAgICAgICBpZiAodHlwZVN0cmluZy5lcXVhbHMoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9QUkVGKSkgewotICAgICAgICAgICAgICAgICAgICBoYXNQcmVmID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVTdHJpbmcuZXF1YWxzKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfRkFYKSkgewotICAgICAgICAgICAgICAgICAgICBpc0ZheCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVTdHJpbmcuc3RhcnRzV2l0aCgiWC0iKSAmJiB0eXBlIDwgMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZVN0cmluZyA9IHR5cGVTdHJpbmcuc3Vic3RyaW5nKDIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlU3RyaW5nLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIEludGVnZXIgdG1wID0gc0tub3duUGhvbmVUeXBlTWFwX1N0b0kuZ2V0KHR5cGVTdHJpbmcpOwotICAgICAgICAgICAgICAgICAgICBpZiAodG1wICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCB0eXBlQ2FuZGlkYXRlID0gdG1wOwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gVFlQRV9QQUdFUiBpcyBwcmVmZXJlZCB3aGVuIHRoZSBudW1iZXIgY29udGFpbnMgQCBzdXJyb25kZWQgYnkKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGEgcGFnZXIgbnVtYmVyIGFuZCBhIGRvbWFpbiBuYW1lLgotICAgICAgICAgICAgICAgICAgICAgICAgLy8gZS5nLgotICAgICAgICAgICAgICAgICAgICAgICAgLy8gbyAxMTExQGRvbWFpbi5jb20KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHggQGRvbWFpbi5jb20KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHggMTExMUAKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBpbmRleE9mQXQgPSBudW1iZXIuaW5kZXhPZigiQCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh0eXBlQ2FuZGlkYXRlID09IFBob25lLlRZUEVfUEFHRVIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgMCA8IGluZGV4T2ZBdCAmJiBpbmRleE9mQXQgPCBudW1iZXIubGVuZ3RoKCkgLSAxKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCB0eXBlIDwgMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCB0eXBlID09IFBob25lLlRZUEVfQ1VTVE9NKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9IHRtcDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlIDwgMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9IFBob25lLlRZUEVfQ1VTVE9NOwotICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSB0eXBlU3RyaW5nOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmICh0eXBlIDwgMCkgewotICAgICAgICAgICAgaWYgKGhhc1ByZWYpIHsKLSAgICAgICAgICAgICAgICB0eXBlID0gUGhvbmUuVFlQRV9NQUlOOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBkZWZhdWx0IHRvIFRZUEVfSE9NRQotICAgICAgICAgICAgICAgIHR5cGUgPSBQaG9uZS5UWVBFX0hPTUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlzRmF4KSB7Ci0gICAgICAgICAgICBpZiAodHlwZSA9PSBQaG9uZS5UWVBFX0hPTUUpIHsKLSAgICAgICAgICAgICAgICB0eXBlID0gUGhvbmUuVFlQRV9GQVhfSE9NRTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBQaG9uZS5UWVBFX1dPUkspIHsKLSAgICAgICAgICAgICAgICB0eXBlID0gUGhvbmUuVFlQRV9GQVhfV09SSzsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBQaG9uZS5UWVBFX09USEVSKSB7Ci0gICAgICAgICAgICAgICAgdHlwZSA9IFBob25lLlRZUEVfT1RIRVJfRkFYOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmICh0eXBlID09IFBob25lLlRZUEVfQ1VTVE9NKSB7Ci0gICAgICAgICAgICByZXR1cm4gbGFiZWw7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gdHlwZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzTW9iaWxlUGhvbmVMYWJlbChmaW5hbCBTdHJpbmcgbGFiZWwpIHsKLSAgICAgICAgLy8gRm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuCi0gICAgICAgIC8vIERldGFpbDogVW50aWwgRG9udXQsIHRoZXJlIGlzbid0IFRZUEVfTU9CSUxFIGZvciBlbWFpbCB3aGlsZSB0aGVyZSBpcyBub3cuCi0gICAgICAgIC8vICAgICAgICAgVG8gc3VwcG9ydCBtb2JpbGUgdHlwZSBhdCB0aGF0IHRpbWUsIHRoaXMgY3VzdG9tIGxhYmVsIGhhZCBiZWVuIHVzZWQuCi0gICAgICAgIHJldHVybiAoYW5kcm9pZC5wcm92aWRlci5Db250YWN0cy5Db250YWN0TWV0aG9kc0NvbHVtbnMuTU9CSUxFX0VNQUlMX1RZUEVfTkFNRS5lcXVhbHMobGFiZWwpCi0gICAgICAgICAgICAgICAgfHwgc01vYmlsZVBob25lTGFiZWxTZXQuY29udGFpbnMobGFiZWwpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWYWxpZEluVjIxQnV0VW5rbm93blRvQ29udGFjdHNQaG90ZVR5cGUoZmluYWwgU3RyaW5nIGxhYmVsKSB7Ci0gICAgICAgIHJldHVybiBzUGhvbmVUeXBlc1Vua25vd25Ub0NvbnRhY3RzU2V0LmNvbnRhaW5zKGxhYmVsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRQcm9wZXJ0eU5hbWVGb3JJbShmaW5hbCBpbnQgcHJvdG9jb2wpIHsKLSAgICAgICAgcmV0dXJuIHNLbm93bkltUHJvcE5hbWVNYXBfSXRvUy5nZXQocHJvdG9jb2wpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nW10gc29ydE5hbWVFbGVtZW50cyhmaW5hbCBpbnQgdmNhcmRUeXBlLAotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGZhbWlseU5hbWUsIGZpbmFsIFN0cmluZyBtaWRkbGVOYW1lLCBmaW5hbCBTdHJpbmcgZ2l2ZW5OYW1lKSB7Ci0gICAgICAgIGZpbmFsIFN0cmluZ1tdIGxpc3QgPSBuZXcgU3RyaW5nWzNdOwotICAgICAgICBmaW5hbCBpbnQgbmFtZU9yZGVyVHlwZSA9IFZDYXJkQ29uZmlnLmdldE5hbWVPcmRlclR5cGUodmNhcmRUeXBlKTsKLSAgICAgICAgc3dpdGNoIChuYW1lT3JkZXJUeXBlKSB7Ci0gICAgICAgICAgICBjYXNlIFZDYXJkQ29uZmlnLk5BTUVfT1JERVJfSkFQQU5FU0U6IHsKLSAgICAgICAgICAgICAgICBpZiAoY29udGFpbnNPbmx5UHJpbnRhYmxlQXNjaWkoZmFtaWx5TmFtZSkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5zT25seVByaW50YWJsZUFzY2lpKGdpdmVuTmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgbGlzdFswXSA9IGdpdmVuTmFtZTsKLSAgICAgICAgICAgICAgICAgICAgbGlzdFsxXSA9IG1pZGRsZU5hbWU7Ci0gICAgICAgICAgICAgICAgICAgIGxpc3RbMl0gPSBmYW1pbHlOYW1lOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGxpc3RbMF0gPSBmYW1pbHlOYW1lOwotICAgICAgICAgICAgICAgICAgICBsaXN0WzFdID0gbWlkZGxlTmFtZTsKLSAgICAgICAgICAgICAgICAgICAgbGlzdFsyXSA9IGdpdmVuTmFtZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIFZDYXJkQ29uZmlnLk5BTUVfT1JERVJfRVVST1BFOiB7Ci0gICAgICAgICAgICAgICAgbGlzdFswXSA9IG1pZGRsZU5hbWU7Ci0gICAgICAgICAgICAgICAgbGlzdFsxXSA9IGdpdmVuTmFtZTsKLSAgICAgICAgICAgICAgICBsaXN0WzJdID0gZmFtaWx5TmFtZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRlZmF1bHQ6IHsKLSAgICAgICAgICAgICAgICBsaXN0WzBdID0gZ2l2ZW5OYW1lOwotICAgICAgICAgICAgICAgIGxpc3RbMV0gPSBtaWRkbGVOYW1lOwotICAgICAgICAgICAgICAgIGxpc3RbMl0gPSBmYW1pbHlOYW1lOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBsaXN0OwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldFBob25lTnVtYmVyRm9ybWF0KGZpbmFsIGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgaWYgKFZDYXJkQ29uZmlnLmlzSmFwYW5lc2VEZXZpY2UodmNhcmRUeXBlKSkgewotICAgICAgICAgICAgcmV0dXJuIFBob25lTnVtYmVyVXRpbHMuRk9STUFUX0pBUEFOOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIFBob25lTnVtYmVyVXRpbHMuRk9STUFUX05BTlA7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbnNlcnRzIHBvc3RhbCBkYXRhIGludG8gdGhlIGJ1aWxkZXIgb2JqZWN0LgotICAgICAqIAotICAgICAqIE5vdGUgdGhhdCB0aGUgZGF0YSBzdHJ1Y3R1cmUgb2YgQ29udGFjdHNDb250cmFjdCBpcyBkaWZmZXJlbnQgZnJvbSB0aGF0IGRlZmluZWQgaW4gdkNhcmQuCi0gICAgICogU28gc29tZSBjb252ZXJzaW9uIG1heSBiZSBwZXJmb3JtZWQgaW4gdGhpcyBtZXRob2QuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGluc2VydFN0cnVjdHVyZWRQb3N0YWxEYXRhVXNpbmdDb250YWN0c1N0cnVjdChpbnQgdmNhcmRUeXBlLAotICAgICAgICAgICAgZmluYWwgQ29udGVudFByb3ZpZGVyT3BlcmF0aW9uLkJ1aWxkZXIgYnVpbGRlciwKLSAgICAgICAgICAgIGZpbmFsIFZDYXJkRW50cnkuUG9zdGFsRGF0YSBwb3N0YWxEYXRhKSB7Ci0gICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlQmFja1JlZmVyZW5jZShTdHJ1Y3R1cmVkUG9zdGFsLlJBV19DT05UQUNUX0lELCAwKTsKLSAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoRGF0YS5NSU1FVFlQRSwgU3RydWN0dXJlZFBvc3RhbC5DT05URU5UX0lURU1fVFlQRSk7Ci0KLSAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoU3RydWN0dXJlZFBvc3RhbC5UWVBFLCBwb3N0YWxEYXRhLnR5cGUpOwotICAgICAgICBpZiAocG9zdGFsRGF0YS50eXBlID09IFN0cnVjdHVyZWRQb3N0YWwuVFlQRV9DVVNUT00pIHsKLSAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKFN0cnVjdHVyZWRQb3N0YWwuTEFCRUwsIHBvc3RhbERhdGEubGFiZWwpOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgU3RyaW5nIHN0cmVldFN0cmluZzsKLSAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHBvc3RhbERhdGEuc3RyZWV0KSkgewotICAgICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHBvc3RhbERhdGEuZXh0ZW5kZWRBZGRyZXNzKSkgewotICAgICAgICAgICAgICAgIHN0cmVldFN0cmluZyA9IG51bGw7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHN0cmVldFN0cmluZyA9IHBvc3RhbERhdGEuZXh0ZW5kZWRBZGRyZXNzOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHBvc3RhbERhdGEuZXh0ZW5kZWRBZGRyZXNzKSkgewotICAgICAgICAgICAgICAgIHN0cmVldFN0cmluZyA9IHBvc3RhbERhdGEuc3RyZWV0OwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzdHJlZXRTdHJpbmcgPSBwb3N0YWxEYXRhLnN0cmVldCArICIgIiArIHBvc3RhbERhdGEuZXh0ZW5kZWRBZGRyZXNzOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKFN0cnVjdHVyZWRQb3N0YWwuUE9CT1gsIHBvc3RhbERhdGEucG9ib3gpOwotICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShTdHJ1Y3R1cmVkUG9zdGFsLlNUUkVFVCwgc3RyZWV0U3RyaW5nKTsKLSAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoU3RydWN0dXJlZFBvc3RhbC5DSVRZLCBwb3N0YWxEYXRhLmxvY2FsdHkpOwotICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShTdHJ1Y3R1cmVkUG9zdGFsLlJFR0lPTiwgcG9zdGFsRGF0YS5yZWdpb24pOwotICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShTdHJ1Y3R1cmVkUG9zdGFsLlBPU1RDT0RFLCBwb3N0YWxEYXRhLnBvc3RhbENvZGUpOwotICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShTdHJ1Y3R1cmVkUG9zdGFsLkNPVU5UUlksIHBvc3RhbERhdGEuY291bnRyeSk7Ci0KLSAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoU3RydWN0dXJlZFBvc3RhbC5GT1JNQVRURURfQUREUkVTUywKLSAgICAgICAgICAgICAgICBwb3N0YWxEYXRhLmdldEZvcm1hdHRlZEFkZHJlc3ModmNhcmRUeXBlKSk7Ci0gICAgICAgIGlmIChwb3N0YWxEYXRhLmlzUHJpbWFyeSkgewotICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoRGF0YS5JU19QUklNQVJZLCAxKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnN0cnVjdE5hbWVGcm9tRWxlbWVudHMoZmluYWwgaW50IHZjYXJkVHlwZSwKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBmYW1pbHlOYW1lLCBmaW5hbCBTdHJpbmcgbWlkZGxlTmFtZSwgZmluYWwgU3RyaW5nIGdpdmVuTmFtZSkgewotICAgICAgICByZXR1cm4gY29uc3RydWN0TmFtZUZyb21FbGVtZW50cyh2Y2FyZFR5cGUsIGZhbWlseU5hbWUsIG1pZGRsZU5hbWUsIGdpdmVuTmFtZSwKLSAgICAgICAgICAgICAgICBudWxsLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBjb25zdHJ1Y3ROYW1lRnJvbUVsZW1lbnRzKGZpbmFsIGludCB2Y2FyZFR5cGUsCi0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgZmFtaWx5TmFtZSwgZmluYWwgU3RyaW5nIG1pZGRsZU5hbWUsIGZpbmFsIFN0cmluZyBnaXZlbk5hbWUsCi0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgcHJlZml4LCBmaW5hbCBTdHJpbmcgc3VmZml4KSB7Ci0gICAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIGZpbmFsIFN0cmluZ1tdIG5hbWVMaXN0ID0gc29ydE5hbWVFbGVtZW50cyh2Y2FyZFR5cGUsIGZhbWlseU5hbWUsIG1pZGRsZU5hbWUsIGdpdmVuTmFtZSk7Ci0gICAgICAgIGJvb2xlYW4gZmlyc3QgPSB0cnVlOwotICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KHByZWZpeCkpIHsKLSAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICAgICAgICBidWlsZGVyLmFwcGVuZChwcmVmaXgpOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoZmluYWwgU3RyaW5nIG5hbWVQYXJ0IDogbmFtZUxpc3QpIHsKLSAgICAgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkobmFtZVBhcnQpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoJyAnKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQobmFtZVBhcnQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkoc3VmZml4KSkgewotICAgICAgICAgICAgaWYgKCFmaXJzdCkgewotICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCcgJyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBidWlsZGVyLmFwcGVuZChzdWZmaXgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBidWlsZGVyLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBMaXN0PFN0cmluZz4gY29uc3RydWN0TGlzdEZyb21WYWx1ZShmaW5hbCBTdHJpbmcgdmFsdWUsCi0gICAgICAgICAgICBmaW5hbCBib29sZWFuIGlzVjMwKSB7Ci0gICAgICAgIGZpbmFsIExpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIGludCBsZW5ndGggPSB2YWx1ZS5sZW5ndGgoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotICAgICAgICAgICAgY2hhciBjaCA9IHZhbHVlLmNoYXJBdChpKTsKLSAgICAgICAgICAgIGlmIChjaCA9PSAnXFwnICYmIGkgPCBsZW5ndGggLSAxKSB7Ci0gICAgICAgICAgICAgICAgY2hhciBuZXh0Q2ggPSB2YWx1ZS5jaGFyQXQoaSArIDEpOwotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB1bmVzY2FwZWRTdHJpbmcgPQotICAgICAgICAgICAgICAgICAgICAoaXNWMzAgPyBWQ2FyZFBhcnNlcl9WMzAudW5lc2NhcGVDaGFyYWN0ZXIobmV4dENoKSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICBWQ2FyZFBhcnNlcl9WMjEudW5lc2NhcGVDaGFyYWN0ZXIobmV4dENoKSk7Ci0gICAgICAgICAgICAgICAgaWYgKHVuZXNjYXBlZFN0cmluZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKHVuZXNjYXBlZFN0cmluZyk7Ci0gICAgICAgICAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChjaCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnOycpIHsKLSAgICAgICAgICAgICAgICBsaXN0LmFkZChidWlsZGVyLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChjaCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbGlzdC5hZGQoYnVpbGRlci50b1N0cmluZygpKTsKLSAgICAgICAgcmV0dXJuIGxpc3Q7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zT25seVByaW50YWJsZUFzY2lpKGZpbmFsIFN0cmluZy4uLnZhbHVlcykgewotICAgICAgICBpZiAodmFsdWVzID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjb250YWluc09ubHlQcmludGFibGVBc2NpaShBcnJheXMuYXNMaXN0KHZhbHVlcykpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb250YWluc09ubHlQcmludGFibGVBc2NpaShmaW5hbCBDb2xsZWN0aW9uPFN0cmluZz4gdmFsdWVzKSB7Ci0gICAgICAgIGlmICh2YWx1ZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChmaW5hbCBTdHJpbmcgdmFsdWUgOiB2YWx1ZXMpIHsKLSAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eSh2YWx1ZSkpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghVGV4dFV0aWxzLmlzUHJpbnRhYmxlQXNjaWlPbmx5KHZhbHVlKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIGlzIHVzZWZ1bCB3aGVuIGNoZWNraW5nIHRoZSBzdHJpbmcgc2hvdWxkIGJlIGVuY29kZWQgaW50byBxdW90ZWQtcHJpbnRhYmxlCi0gICAgICogb3Igbm90LCB3aGljaCBpcyByZXF1aXJlZCBieSB2Q2FyZCAyLjEuCi0gICAgICogU2VlIHRoZSBkZWZpbml0aW9uIG9mICI3Yml0IiBpbiB2Q2FyZCAyLjEgc3BlYyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnNPbmx5Tm9uQ3JMZlByaW50YWJsZUFzY2lpKGZpbmFsIFN0cmluZy4uLnZhbHVlcykgewotICAgICAgICBpZiAodmFsdWVzID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjb250YWluc09ubHlOb25DckxmUHJpbnRhYmxlQXNjaWkoQXJyYXlzLmFzTGlzdCh2YWx1ZXMpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnNPbmx5Tm9uQ3JMZlByaW50YWJsZUFzY2lpKGZpbmFsIENvbGxlY3Rpb248U3RyaW5nPiB2YWx1ZXMpIHsKLSAgICAgICAgaWYgKHZhbHVlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBpbnQgYXNjaWlGaXJzdCA9IDB4MjA7Ci0gICAgICAgIGZpbmFsIGludCBhc2NpaUxhc3QgPSAweDdFOyAgLy8gaW5jbHVkZWQKLSAgICAgICAgZm9yIChmaW5hbCBTdHJpbmcgdmFsdWUgOiB2YWx1ZXMpIHsKLSAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eSh2YWx1ZSkpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZpbmFsIGludCBsZW5ndGggPSB2YWx1ZS5sZW5ndGgoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpID0gdmFsdWUub2Zmc2V0QnlDb2RlUG9pbnRzKGksIDEpKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IGMgPSB2YWx1ZS5jb2RlUG9pbnRBdChpKTsKLSAgICAgICAgICAgICAgICBpZiAoIShhc2NpaUZpcnN0IDw9IGMgJiYgYyA8PSBhc2NpaUxhc3QpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU2V0PENoYXJhY3Rlcj4gc1VuQWNjZXB0YWJsZUFzY2lpSW5WMjFXb3JkU2V0ID0KLSAgICAgICAgbmV3IEhhc2hTZXQ8Q2hhcmFjdGVyPihBcnJheXMuYXNMaXN0KCdbJywgJ10nLCAnPScsICc6JywgJy4nLCAnLCcsICcgJykpOwotCi0gICAgLyoqCi0gICAgICogVGhpcyBpcyB1c2VmdWwgc2luY2UgdkNhcmQgMy4wIG9mdGVuIHJlcXVpcmVzIHRoZSAoIlgtIikgcHJvcGVydGllcyBhbmQgZ3JvdXBzCi0gICAgICogc2hvdWxkIGNvbnRhaW4gb25seSBhbHBoYWJldHMsIGRpZ2l0cywgYW5kIGh5cGhlbi4KLSAgICAgKiAKLSAgICAgKiBOb3RlOiBJdCBpcyBhbHJlYWR5IGtub3duIHNvbWUgZGV2aWNlcyAod3JvbmdseSkgb3V0cHV0cyBwcm9wZXJ0aWVzIHdpdGggY2hhcmFjdGVycwotICAgICAqICAgICAgIHdoaWNoIHNob3VsZCBub3QgYmUgaW4gdGhlIGZpZWxkLiBPbmUgZXhhbXBsZSBpcyAiWC1HT09HTEUgVEFMSyIuIFdlIGFjY2VwdAotICAgICAqICAgICAgIHN1Y2gga2luZCBvZiBpbnB1dCBidXQgbXVzdCBuZXZlciBvdXRwdXQgaXQgdW5sZXNzIHRoZSB0YXJnZXQgaXMgdmVyeSBzcGVjaWZpYwotICAgICAqICAgICAgIHRvIHRoZSBkZXZpY2Ugd2hpY2ggaXMgYWJsZSB0byBwYXJzZSB0aGUgbWFsZm9ybWVkIGlucHV0LiAKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnNPbmx5QWxwaGFEaWdpdEh5cGhlbihmaW5hbCBTdHJpbmcuLi52YWx1ZXMpIHsKLSAgICAgICAgaWYgKHZhbHVlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY29udGFpbnNPbmx5QWxwaGFEaWdpdEh5cGhlbihBcnJheXMuYXNMaXN0KHZhbHVlcykpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb250YWluc09ubHlBbHBoYURpZ2l0SHlwaGVuKGZpbmFsIENvbGxlY3Rpb248U3RyaW5nPiB2YWx1ZXMpIHsKLSAgICAgICAgaWYgKHZhbHVlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBpbnQgdXBwZXJBbHBoYWJldEZpcnN0ID0gMHg0MTsgIC8vIEEKLSAgICAgICAgZmluYWwgaW50IHVwcGVyQWxwaGFiZXRBZnRlckxhc3QgPSAweDViOyAgLy8gWwotICAgICAgICBmaW5hbCBpbnQgbG93ZXJBbHBoYWJldEZpcnN0ID0gMHg2MTsgIC8vIGEKLSAgICAgICAgZmluYWwgaW50IGxvd2VyQWxwaGFiZXRBZnRlckxhc3QgPSAweDdiOyAgLy8gewotICAgICAgICBmaW5hbCBpbnQgZGlnaXRGaXJzdCA9IDB4MzA7ICAvLyAwCi0gICAgICAgIGZpbmFsIGludCBkaWdpdEFmdGVyTGFzdCA9IDB4M0E7ICAvLyA6Ci0gICAgICAgIGZpbmFsIGludCBoeXBoZW4gPSAnLSc7Ci0gICAgICAgIGZvciAoZmluYWwgU3RyaW5nIHN0ciA6IHZhbHVlcykgewotICAgICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHN0cikpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZpbmFsIGludCBsZW5ndGggPSBzdHIubGVuZ3RoKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSA9IHN0ci5vZmZzZXRCeUNvZGVQb2ludHMoaSwgMSkpIHsKLSAgICAgICAgICAgICAgICBpbnQgY29kZXBvaW50ID0gc3RyLmNvZGVQb2ludEF0KGkpOwotICAgICAgICAgICAgICAgIGlmICghKChsb3dlckFscGhhYmV0Rmlyc3QgPD0gY29kZXBvaW50ICYmIGNvZGVwb2ludCA8IGxvd2VyQWxwaGFiZXRBZnRlckxhc3QpIHx8Ci0gICAgICAgICAgICAgICAgICAgICh1cHBlckFscGhhYmV0Rmlyc3QgPD0gY29kZXBvaW50ICYmIGNvZGVwb2ludCA8IHVwcGVyQWxwaGFiZXRBZnRlckxhc3QpIHx8Ci0gICAgICAgICAgICAgICAgICAgIChkaWdpdEZpcnN0IDw9IGNvZGVwb2ludCAmJiBjb2RlcG9pbnQgPCBkaWdpdEFmdGVyTGFzdCkgfHwKLSAgICAgICAgICAgICAgICAgICAgKGNvZGVwb2ludCA9PSBoeXBoZW4pKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDxQPgotICAgICAqIFJldHVybnMgdHJ1ZSB3aGVuIHRoZSBnaXZlbiBTdHJpbmcgaXMgY2F0ZWdvcml6ZWQgYXMgIndvcmQiIHNwZWNpZmllZCBpbiB2Q2FyZCBzcGVjIDIuMS4KLSAgICAgKiA8L1A+Ci0gICAgICogPFA+Ci0gICAgICogdkNhcmQgMi4xIHNwZWNpZmllczo8QlIgLz4KLSAgICAgKiB3b3JkID0gJmx0O2FueSBwcmludGFibGUgN2JpdCB1cy1hc2NpaSBleGNlcHQgW109Oi4sICZndDsKLSAgICAgKiA8L1A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzVjIxV29yZChmaW5hbCBTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHZhbHVlKSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgaW50IGFzY2lpRmlyc3QgPSAweDIwOwotICAgICAgICBmaW5hbCBpbnQgYXNjaWlMYXN0ID0gMHg3RTsgIC8vIGluY2x1ZGVkCi0gICAgICAgIGZpbmFsIGludCBsZW5ndGggPSB2YWx1ZS5sZW5ndGgoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkgPSB2YWx1ZS5vZmZzZXRCeUNvZGVQb2ludHMoaSwgMSkpIHsKLSAgICAgICAgICAgIGZpbmFsIGludCBjID0gdmFsdWUuY29kZVBvaW50QXQoaSk7Ci0gICAgICAgICAgICBpZiAoIShhc2NpaUZpcnN0IDw9IGMgJiYgYyA8PSBhc2NpaUxhc3QpIHx8Ci0gICAgICAgICAgICAgICAgICAgIHNVbkFjY2VwdGFibGVBc2NpaUluVjIxV29yZFNldC5jb250YWlucygoY2hhciljKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyB0b0hhbGZXaWR0aFN0cmluZyhmaW5hbCBTdHJpbmcgb3JnU3RyaW5nKSB7Ci0gICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShvcmdTdHJpbmcpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICBmaW5hbCBpbnQgbGVuZ3RoID0gb3JnU3RyaW5nLmxlbmd0aCgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSA9IG9yZ1N0cmluZy5vZmZzZXRCeUNvZGVQb2ludHMoaSwgMSkpIHsKLSAgICAgICAgICAgIC8vIEFsbCBKYXBhbmVzZSBjaGFyYWN0ZXIgaXMgYWJsZSB0byBiZSBleHByZXNzZWQgYnkgY2hhci4KLSAgICAgICAgICAgIC8vIERvIG5vdCBuZWVkIHRvIHVzZSBTdHJpbmcjY29kZXBQb2ludEF0KCkuCi0gICAgICAgICAgICBmaW5hbCBjaGFyIGNoID0gb3JnU3RyaW5nLmNoYXJBdChpKTsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBoYWxmV2lkdGhUZXh0ID0gSmFwYW5lc2VVdGlscy50cnlHZXRIYWxmV2lkdGhUZXh0KGNoKTsKLSAgICAgICAgICAgIGlmIChoYWxmV2lkdGhUZXh0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChoYWxmV2lkdGhUZXh0KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoY2gpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBidWlsZGVyLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR3Vlc3NlcyB0aGUgZm9ybWF0IG9mIGlucHV0IGltYWdlLiBDdXJyZW50bHkganVzdCB0aGUgZmlyc3QgZmV3IGJ5dGVzIGFyZSB1c2VkLgotICAgICAqIFRoZSB0eXBlICJHSUYiLCAiUE5HIiwgb3IgIkpQRUciIGlzIHJldHVybmVkIHdoZW4gcG9zc2libGUuIFJldHVybnMgbnVsbCB3aGVuCi0gICAgICogdGhlIGd1ZXNzIGZhaWxlZC4KLSAgICAgKiBAcGFyYW0gaW5wdXQgSW1hZ2UgYXMgYnl0ZSBhcnJheS4KLSAgICAgKiBAcmV0dXJuIFRoZSBpbWFnZSB0eXBlIG9yIG51bGwgd2hlbiB0aGUgdHlwZSBjYW5ub3QgYmUgZGV0ZXJtaW5lZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBndWVzc0ltYWdlVHlwZShmaW5hbCBieXRlW10gaW5wdXQpIHsKLSAgICAgICAgaWYgKGlucHV0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpbnB1dC5sZW5ndGggPj0gMyAmJiBpbnB1dFswXSA9PSAnRycgJiYgaW5wdXRbMV0gPT0gJ0knICYmIGlucHV0WzJdID09ICdGJykgewotICAgICAgICAgICAgcmV0dXJuICJHSUYiOwotICAgICAgICB9IGVsc2UgaWYgKGlucHV0Lmxlbmd0aCA+PSA0ICYmIGlucHV0WzBdID09IChieXRlKSAweDg5Ci0gICAgICAgICAgICAgICAgJiYgaW5wdXRbMV0gPT0gJ1AnICYmIGlucHV0WzJdID09ICdOJyAmJiBpbnB1dFszXSA9PSAnRycpIHsKLSAgICAgICAgICAgIC8vIE5vdGU6IHZDYXJkIDIuMSBvZmZpY2lhbGx5IGRvZXMgbm90IHN1cHBvcnQgUE5HLCBidXQgd2UgbWF5IGhhdmUgaXQgYW5kCi0gICAgICAgICAgICAvLyAgICAgICB1c2luZyBYLSB3b3JkIGxpa2UgIlgtUE5HIiBtYXkgbm90IGxldCBpbXBvcnRlcnMga25vdyBpdCBpcyBQTkcuCi0gICAgICAgICAgICAvLyAgICAgICBTbyB3ZSB1c2UgdGhlIFN0cmluZyAiUE5HIiBhcyBpcy4uLgotICAgICAgICAgICAgcmV0dXJuICJQTkciOwotICAgICAgICB9IGVsc2UgaWYgKGlucHV0Lmxlbmd0aCA+PSAyICYmIGlucHV0WzBdID09IChieXRlKSAweGZmCi0gICAgICAgICAgICAgICAgJiYgaW5wdXRbMV0gPT0gKGJ5dGUpIDB4ZDgpIHsKLSAgICAgICAgICAgIHJldHVybiAiSlBFRyI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gVHJ1ZSB3aGVuIGFsbCB0aGUgZ2l2ZW4gdmFsdWVzIGFyZSBudWxsIG9yIGVtcHR5IFN0cmluZ3MuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGFyZUFsbEVtcHR5KGZpbmFsIFN0cmluZy4uLnZhbHVlcykgewotICAgICAgICBpZiAodmFsdWVzID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChmaW5hbCBTdHJpbmcgdmFsdWUgOiB2YWx1ZXMpIHsKLSAgICAgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkodmFsdWUpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHByaXZhdGUgVkNhcmRVdGlscygpIHsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvZXhjZXB0aW9uL1ZDYXJkQWdlbnROb3RTdXBwb3J0ZWRFeGNlcHRpb24uamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9leGNlcHRpb24vVkNhcmRBZ2VudE5vdFN1cHBvcnRlZEV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzJjN2RmLi4wMDAwMDAwCi0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9leGNlcHRpb24vVkNhcmRBZ2VudE5vdFN1cHBvcnRlZEV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGFuZHJvaWQucGltLnZjYXJkLmV4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIFZDYXJkQWdlbnROb3RTdXBwb3J0ZWRFeGNlcHRpb24gZXh0ZW5kcyBWQ2FyZE5vdFN1cHBvcnRlZEV4Y2VwdGlvbiB7Ci0gICAgcHVibGljIFZDYXJkQWdlbnROb3RTdXBwb3J0ZWRFeGNlcHRpb24oKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFZDYXJkQWdlbnROb3RTdXBwb3J0ZWRFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSk7Ci0gICAgfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL2V4Y2VwdGlvbi9WQ2FyZEV4Y2VwdGlvbi5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL2V4Y2VwdGlvbi9WQ2FyZEV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTU3MjE5Li4wMDAwMDAwCi0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9leGNlcHRpb24vVkNhcmRFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLnBpbS52Y2FyZC5leGNlcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBWQ2FyZEV4Y2VwdGlvbiBleHRlbmRzIGphdmEubGFuZy5FeGNlcHRpb24gewotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBWQ2FyZEV4Y2VwdGlvbiBvYmplY3QKLSAgICAgKi8KLSAgICBwdWJsaWMgVkNhcmRFeGNlcHRpb24oKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIFZDYXJkRXhjZXB0aW9uIG9iamVjdAotICAgICAqCi0gICAgICogQHBhcmFtIG1lc3NhZ2UgdGhlIGVycm9yIG1lc3NhZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgVkNhcmRFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvZXhjZXB0aW9uL1ZDYXJkSW52YWxpZENvbW1lbnRMaW5lRXhjZXB0aW9uLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvZXhjZXB0aW9uL1ZDYXJkSW52YWxpZENvbW1lbnRMaW5lRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3ZGI2MmMuLjAwMDAwMDAKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL2V4Y2VwdGlvbi9WQ2FyZEludmFsaWRDb21tZW50TGluZUV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5waW0udmNhcmQuZXhjZXB0aW9uOwotCi0vKioKLSAqIFRocm93biB3aGVuIHRoZSB2Q2FyZCBoYXMgc29tZSBsaW5lIHN0YXJ0aW5nIHdpdGggJyMnLiBJbiB0aGUgc3BlY2lmaWNhdGlvbiwKLSAqIGJvdGggdkNhcmQgMi4xIGFuZCB2Q2FyZCAzLjAgZG9lcyBub3QgYWxsb3cgc3VjaCBsaW5lLCBidXQgc29tZSBhY3R1YWwgZXhwb3J0ZXIgZW1pdAotICogc3VjaCBsaW5lcy4KLSAqLwotcHVibGljIGNsYXNzIFZDYXJkSW52YWxpZENvbW1lbnRMaW5lRXhjZXB0aW9uIGV4dGVuZHMgVkNhcmRJbnZhbGlkTGluZUV4Y2VwdGlvbiB7Ci0gICAgcHVibGljIFZDYXJkSW52YWxpZENvbW1lbnRMaW5lRXhjZXB0aW9uKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIHB1YmxpYyBWQ2FyZEludmFsaWRDb21tZW50TGluZUV4Y2VwdGlvbihmaW5hbCBTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICBzdXBlcihtZXNzYWdlKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvZXhjZXB0aW9uL1ZDYXJkSW52YWxpZExpbmVFeGNlcHRpb24uamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9leGNlcHRpb24vVkNhcmRJbnZhbGlkTGluZUV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzAxNTNlLi4wMDAwMDAwCi0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9leGNlcHRpb24vVkNhcmRJbnZhbGlkTGluZUV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5waW0udmNhcmQuZXhjZXB0aW9uOwotCi0vKioKLSAqIFRocm93biB3aGVuIHRoZSB2Q2FyZCBoYXMgc29tZSBsaW5lIHN0YXJ0aW5nIHdpdGggJyMnLiBJbiB0aGUgc3BlY2lmaWNhdGlvbiwKLSAqIGJvdGggdkNhcmQgMi4xIGFuZCB2Q2FyZCAzLjAgZG9lcyBub3QgYWxsb3cgc3VjaCBsaW5lLCBidXQgc29tZSBhY3R1YWwgZXhwb3J0ZXIgZW1pdAotICogc3VjaCBsaW5lcy4KLSAqLwotcHVibGljIGNsYXNzIFZDYXJkSW52YWxpZExpbmVFeGNlcHRpb24gZXh0ZW5kcyBWQ2FyZEV4Y2VwdGlvbiB7Ci0gICAgcHVibGljIFZDYXJkSW52YWxpZExpbmVFeGNlcHRpb24oKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFZDYXJkSW52YWxpZExpbmVFeGNlcHRpb24oZmluYWwgU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL2V4Y2VwdGlvbi9WQ2FyZE5lc3RlZEV4Y2VwdGlvbi5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL2V4Y2VwdGlvbi9WQ2FyZE5lc3RlZEV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDNjMmZiLi4wMDAwMDAwCi0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9leGNlcHRpb24vVkNhcmROZXN0ZWRFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQucGltLnZjYXJkLmV4Y2VwdGlvbjsKLQotLyoqCi0gKiBWQ2FyZEV4Y2VwdGlvbiB0aHJvd24gd2hlbiBWQ2FyZCBpcyBuZXN0ZWQgd2l0aG91dCBWQ2FyZFBhcnNlcidzIGJlaW5nIG5vdGlmaWVkLgotICovCi1wdWJsaWMgY2xhc3MgVkNhcmROZXN0ZWRFeGNlcHRpb24gZXh0ZW5kcyBWQ2FyZE5vdFN1cHBvcnRlZEV4Y2VwdGlvbiB7Ci0gICAgcHVibGljIFZDYXJkTmVzdGVkRXhjZXB0aW9uKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLSAgICBwdWJsaWMgVkNhcmROZXN0ZWRFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL2V4Y2VwdGlvbi9WQ2FyZE5vdFN1cHBvcnRlZEV4Y2VwdGlvbi5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL2V4Y2VwdGlvbi9WQ2FyZE5vdFN1cHBvcnRlZEV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTZhYTc3NjMuLjAwMDAwMDAKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL2V4Y2VwdGlvbi9WQ2FyZE5vdFN1cHBvcnRlZEV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGFuZHJvaWQucGltLnZjYXJkLmV4Y2VwdGlvbjsKLQotLyoqCi0gKiBUaGUgZXhjZXB0aW9uIHdoaWNoIHRlbGxzIHRoYXQgdGhlIGlucHV0IFZDYXJkIGlzIHByb2JhYmx5IHZhbGlkIGZyb20gdGhlIHZpZXcgb2YKLSAqIHNwZWNpZmljYXRpb24gYnV0IG5vdCBzdXBwb3J0ZWQgaW4gdGhlIGN1cnJlbnQgZnJhbWV3b3JrIGZvciBub3cuCi0gKiAKLSAqIFRoaXMgaXMgYSBraW5kIG9mIGEgZ29vZCBuZXdzIGZyb20gdGhlIHZpZXcgb2YgZGV2ZWxvcG1lbnQuCi0gKiBJdCBtYXkgYmUgZ29vZCB0byBhc2sgdXNlcnMgdG8gc2VuZCBhIHJlcG9ydCB3aXRoIHRoZSBWQ2FyZCBleGFtcGxlCi0gKiBmb3IgdGhlIGZ1dHVyZSBkZXZlbG9wbWVudC4KLSAqLwotcHVibGljIGNsYXNzIFZDYXJkTm90U3VwcG9ydGVkRXhjZXB0aW9uIGV4dGVuZHMgVkNhcmRFeGNlcHRpb24gewotICAgIHB1YmxpYyBWQ2FyZE5vdFN1cHBvcnRlZEV4Y2VwdGlvbigpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0gICAgcHVibGljIFZDYXJkTm90U3VwcG9ydGVkRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgIHN1cGVyKG1lc3NhZ2UpOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvZXhjZXB0aW9uL1ZDYXJkVmVyc2lvbkV4Y2VwdGlvbi5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL2V4Y2VwdGlvbi9WQ2FyZFZlcnNpb25FeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWZlOGI3Zi4uMDAwMDAwMAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvZXhjZXB0aW9uL1ZDYXJkVmVyc2lvbkV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5waW0udmNhcmQuZXhjZXB0aW9uOwotCi0vKioKLSAqIFZDYXJkRXhjZXB0aW9uIHVzZWQgb25seSB3aGVuIHRoZSB2ZXJzaW9uIG9mIHRoZSB2Q2FyZCBpcyBkaWZmZXJlbnQuIAotICovCi1wdWJsaWMgY2xhc3MgVkNhcmRWZXJzaW9uRXhjZXB0aW9uIGV4dGVuZHMgVkNhcmRFeGNlcHRpb24gewotICAgIHB1YmxpYyBWQ2FyZFZlcnNpb25FeGNlcHRpb24oKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotICAgIHB1YmxpYyBWQ2FyZFZlcnNpb25FeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL2V4Y2VwdGlvbi9wYWNrYWdlLmh0bWwgYi9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvZXhjZXB0aW9uL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjZiOGEzMi4uMDAwMDAwMAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvZXhjZXB0aW9uL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPEhUTUw+Ci08Qk9EWT4KLXtAaGlkZX0KLTwvQk9EWT4KLTwvSFRNTD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvcGFja2FnZS5odG1sIGIvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjZiOGEzMi4uMDAwMDAwMAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08SFRNTD4KLTxCT0RZPgote0BoaWRlfQotPC9CT0RZPgotPC9IVE1MPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3ByZWZlcmVuY2UvTXVsdGlTZWxlY3RMaXN0UHJlZmVyZW5jZS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcHJlZmVyZW5jZS9NdWx0aVNlbGVjdExpc3RQcmVmZXJlbmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDJkNTU1Y2YKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9wcmVmZXJlbmNlL011bHRpU2VsZWN0TGlzdFByZWZlcmVuY2UuamF2YQpAQCAtMCwwICsxLDI3NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5wcmVmZXJlbmNlOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWxlcnREaWFsb2cuQnVpbGRlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuRGlhbG9nSW50ZXJmYWNlOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuVHlwZWRBcnJheTsKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbDsKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbGFibGU7CitpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKKy8qKgorICogQSB7QGxpbmsgUHJlZmVyZW5jZX0gdGhhdCBkaXNwbGF5cyBhIGxpc3Qgb2YgZW50cmllcyBhcworICogYSBkaWFsb2cuCisgKiA8cD4KKyAqIFRoaXMgcHJlZmVyZW5jZSB3aWxsIHN0b3JlIGEgc2V0IG9mIHN0cmluZ3MgaW50byB0aGUgU2hhcmVkUHJlZmVyZW5jZXMuCisgKiBUaGlzIHNldCB3aWxsIGNvbnRhaW4gb25lIG9yIG1vcmUgdmFsdWVzIGZyb20gdGhlCisgKiB7QGxpbmsgI3NldEVudHJ5VmFsdWVzKENoYXJTZXF1ZW5jZVtdKX0gYXJyYXkuCisgKiAKKyAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI011bHRpU2VsZWN0TGlzdFByZWZlcmVuY2VfZW50cmllcworICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjTXVsdGlTZWxlY3RMaXN0UHJlZmVyZW5jZV9lbnRyeVZhbHVlcworICovCitwdWJsaWMgY2xhc3MgTXVsdGlTZWxlY3RMaXN0UHJlZmVyZW5jZSBleHRlbmRzIERpYWxvZ1ByZWZlcmVuY2UgeworICAgIHByaXZhdGUgQ2hhclNlcXVlbmNlW10gbUVudHJpZXM7CisgICAgcHJpdmF0ZSBDaGFyU2VxdWVuY2VbXSBtRW50cnlWYWx1ZXM7CisgICAgcHJpdmF0ZSBTZXQ8U3RyaW5nPiBtVmFsdWVzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOworICAgIHByaXZhdGUgU2V0PFN0cmluZz4gbU5ld1ZhbHVlcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKKyAgICBwcml2YXRlIGJvb2xlYW4gbVByZWZlcmVuY2VDaGFuZ2VkOworICAgIAorICAgIHB1YmxpYyBNdWx0aVNlbGVjdExpc3RQcmVmZXJlbmNlKENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7CisgICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzKTsKKyAgICAgICAgCisgICAgICAgIFR5cGVkQXJyYXkgYSA9IGNvbnRleHQub2J0YWluU3R5bGVkQXR0cmlidXRlcyhhdHRycywKKyAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5NdWx0aVNlbGVjdExpc3RQcmVmZXJlbmNlLCAwLCAwKTsKKyAgICAgICAgbUVudHJpZXMgPSBhLmdldFRleHRBcnJheShjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5NdWx0aVNlbGVjdExpc3RQcmVmZXJlbmNlX2VudHJpZXMpOworICAgICAgICBtRW50cnlWYWx1ZXMgPSBhLmdldFRleHRBcnJheShjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5NdWx0aVNlbGVjdExpc3RQcmVmZXJlbmNlX2VudHJ5VmFsdWVzKTsKKyAgICAgICAgYS5yZWN5Y2xlKCk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBNdWx0aVNlbGVjdExpc3RQcmVmZXJlbmNlKENvbnRleHQgY29udGV4dCkgeworICAgICAgICB0aGlzKGNvbnRleHQsIG51bGwpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBodW1hbi1yZWFkYWJsZSBlbnRyaWVzIHRvIGJlIHNob3duIGluIHRoZSBsaXN0LiBUaGlzIHdpbGwgYmUKKyAgICAgKiBzaG93biBpbiBzdWJzZXF1ZW50IGRpYWxvZ3MuCisgICAgICogPHA+CisgICAgICogRWFjaCBlbnRyeSBtdXN0IGhhdmUgYSBjb3JyZXNwb25kaW5nIGluZGV4IGluCisgICAgICoge0BsaW5rICNzZXRFbnRyeVZhbHVlcyhDaGFyU2VxdWVuY2VbXSl9LgorICAgICAqIAorICAgICAqIEBwYXJhbSBlbnRyaWVzIFRoZSBlbnRyaWVzLgorICAgICAqIEBzZWUgI3NldEVudHJ5VmFsdWVzKENoYXJTZXF1ZW5jZVtdKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEVudHJpZXMoQ2hhclNlcXVlbmNlW10gZW50cmllcykgeworICAgICAgICBtRW50cmllcyA9IGVudHJpZXM7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEBzZWUgI3NldEVudHJpZXMoQ2hhclNlcXVlbmNlW10pCisgICAgICogQHBhcmFtIGVudHJpZXNSZXNJZCBUaGUgZW50cmllcyBhcnJheSBhcyBhIHJlc291cmNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEVudHJpZXMoaW50IGVudHJpZXNSZXNJZCkgeworICAgICAgICBzZXRFbnRyaWVzKGdldENvbnRleHQoKS5nZXRSZXNvdXJjZXMoKS5nZXRUZXh0QXJyYXkoZW50cmllc1Jlc0lkKSk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFRoZSBsaXN0IG9mIGVudHJpZXMgdG8gYmUgc2hvd24gaW4gdGhlIGxpc3QgaW4gc3Vic2VxdWVudCBkaWFsb2dzLgorICAgICAqIAorICAgICAqIEByZXR1cm4gVGhlIGxpc3QgYXMgYW4gYXJyYXkuCisgICAgICovCisgICAgcHVibGljIENoYXJTZXF1ZW5jZVtdIGdldEVudHJpZXMoKSB7CisgICAgICAgIHJldHVybiBtRW50cmllczsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogVGhlIGFycmF5IHRvIGZpbmQgdGhlIHZhbHVlIHRvIHNhdmUgZm9yIGEgcHJlZmVyZW5jZSB3aGVuIGFuIGVudHJ5IGZyb20KKyAgICAgKiBlbnRyaWVzIGlzIHNlbGVjdGVkLiBJZiBhIHVzZXIgY2xpY2tzIG9uIHRoZSBzZWNvbmQgaXRlbSBpbiBlbnRyaWVzLCB0aGUKKyAgICAgKiBzZWNvbmQgaXRlbSBpbiB0aGlzIGFycmF5IHdpbGwgYmUgc2F2ZWQgdG8gdGhlIHByZWZlcmVuY2UuCisgICAgICogCisgICAgICogQHBhcmFtIGVudHJ5VmFsdWVzIFRoZSBhcnJheSB0byBiZSB1c2VkIGFzIHZhbHVlcyB0byBzYXZlIGZvciB0aGUgcHJlZmVyZW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRFbnRyeVZhbHVlcyhDaGFyU2VxdWVuY2VbXSBlbnRyeVZhbHVlcykgeworICAgICAgICBtRW50cnlWYWx1ZXMgPSBlbnRyeVZhbHVlczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAc2VlICNzZXRFbnRyeVZhbHVlcyhDaGFyU2VxdWVuY2VbXSkKKyAgICAgKiBAcGFyYW0gZW50cnlWYWx1ZXNSZXNJZCBUaGUgZW50cnkgdmFsdWVzIGFycmF5IGFzIGEgcmVzb3VyY2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RW50cnlWYWx1ZXMoaW50IGVudHJ5VmFsdWVzUmVzSWQpIHsKKyAgICAgICAgc2V0RW50cnlWYWx1ZXMoZ2V0Q29udGV4dCgpLmdldFJlc291cmNlcygpLmdldFRleHRBcnJheShlbnRyeVZhbHVlc1Jlc0lkKSk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGFycmF5IG9mIHZhbHVlcyB0byBiZSBzYXZlZCBmb3IgdGhlIHByZWZlcmVuY2UuCisgICAgICogCisgICAgICogQHJldHVybiBUaGUgYXJyYXkgb2YgdmFsdWVzLgorICAgICAqLworICAgIHB1YmxpYyBDaGFyU2VxdWVuY2VbXSBnZXRFbnRyeVZhbHVlcygpIHsKKyAgICAgICAgcmV0dXJuIG1FbnRyeVZhbHVlczsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIGtleS4gVGhpcyBzaG91bGQgY29udGFpbiBlbnRyaWVzIGluCisgICAgICoge0BsaW5rICNnZXRFbnRyeVZhbHVlcygpfS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gdmFsdWVzIFRoZSB2YWx1ZXMgdG8gc2V0IGZvciB0aGUga2V5LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlcyhTZXQ8U3RyaW5nPiB2YWx1ZXMpIHsKKyAgICAgICAgbVZhbHVlcyA9IHZhbHVlczsKKyAgICAgICAgCisgICAgICAgIHBlcnNpc3RTdHJpbmdTZXQodmFsdWVzKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmV0cmlldmVzIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBrZXkuCisgICAgICovCisgICAgcHVibGljIFNldDxTdHJpbmc+IGdldFZhbHVlcygpIHsKKyAgICAgICAgcmV0dXJuIG1WYWx1ZXM7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBnaXZlbiB2YWx1ZSAoaW4gdGhlIGVudHJ5IHZhbHVlcyBhcnJheSkuCisgICAgICogCisgICAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB3aG9zZSBpbmRleCBzaG91bGQgYmUgcmV0dXJuZWQuCisgICAgICogQHJldHVybiBUaGUgaW5kZXggb2YgdGhlIHZhbHVlLCBvciAtMSBpZiBub3QgZm91bmQuCisgICAgICovCisgICAgcHVibGljIGludCBmaW5kSW5kZXhPZlZhbHVlKFN0cmluZyB2YWx1ZSkgeworICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCAmJiBtRW50cnlWYWx1ZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IG1FbnRyeVZhbHVlcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgeworICAgICAgICAgICAgICAgIGlmIChtRW50cnlWYWx1ZXNbaV0uZXF1YWxzKHZhbHVlKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICAKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvblByZXBhcmVEaWFsb2dCdWlsZGVyKEJ1aWxkZXIgYnVpbGRlcikgeworICAgICAgICBzdXBlci5vblByZXBhcmVEaWFsb2dCdWlsZGVyKGJ1aWxkZXIpOworICAgICAgICAKKyAgICAgICAgaWYgKG1FbnRyaWVzID09IG51bGwgfHwgbUVudHJ5VmFsdWVzID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJNdWx0aVNlbGVjdExpc3RQcmVmZXJlbmNlIHJlcXVpcmVzIGFuIGVudHJpZXMgYXJyYXkgYW5kICIgKworICAgICAgICAgICAgICAgICAgICAiYW4gZW50cnlWYWx1ZXMgYXJyYXkuIik7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGJvb2xlYW5bXSBjaGVja2VkSXRlbXMgPSBnZXRTZWxlY3RlZEl0ZW1zKCk7CisgICAgICAgIGJ1aWxkZXIuc2V0TXVsdGlDaG9pY2VJdGVtcyhtRW50cmllcywgY2hlY2tlZEl0ZW1zLAorICAgICAgICAgICAgICAgIG5ldyBEaWFsb2dJbnRlcmZhY2UuT25NdWx0aUNob2ljZUNsaWNrTGlzdGVuZXIoKSB7CisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soRGlhbG9nSW50ZXJmYWNlIGRpYWxvZywgaW50IHdoaWNoLCBib29sZWFuIGlzQ2hlY2tlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzQ2hlY2tlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QcmVmZXJlbmNlQ2hhbmdlZCB8PSBtTmV3VmFsdWVzLmFkZChtRW50cmllc1t3aGljaF0udG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QcmVmZXJlbmNlQ2hhbmdlZCB8PSBtTmV3VmFsdWVzLnJlbW92ZShtRW50cmllc1t3aGljaF0udG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgbU5ld1ZhbHVlcy5jbGVhcigpOworICAgICAgICBtTmV3VmFsdWVzLmFkZEFsbChtVmFsdWVzKTsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBib29sZWFuW10gZ2V0U2VsZWN0ZWRJdGVtcygpIHsKKyAgICAgICAgZmluYWwgQ2hhclNlcXVlbmNlW10gZW50cmllcyA9IG1FbnRyaWVzOworICAgICAgICBmaW5hbCBpbnQgZW50cnlDb3VudCA9IGVudHJpZXMubGVuZ3RoOworICAgICAgICBmaW5hbCBTZXQ8U3RyaW5nPiB2YWx1ZXMgPSBtVmFsdWVzOworICAgICAgICBib29sZWFuW10gcmVzdWx0ID0gbmV3IGJvb2xlYW5bZW50cnlDb3VudF07CisgICAgICAgIAorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVudHJ5Q291bnQ7IGkrKykgeworICAgICAgICAgICAgcmVzdWx0W2ldID0gdmFsdWVzLmNvbnRhaW5zKGVudHJpZXNbaV0udG9TdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICAgIAorICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uRGlhbG9nQ2xvc2VkKGJvb2xlYW4gcG9zaXRpdmVSZXN1bHQpIHsKKyAgICAgICAgc3VwZXIub25EaWFsb2dDbG9zZWQocG9zaXRpdmVSZXN1bHQpOworICAgICAgICAKKyAgICAgICAgaWYgKHBvc2l0aXZlUmVzdWx0ICYmIG1QcmVmZXJlbmNlQ2hhbmdlZCkgeworICAgICAgICAgICAgZmluYWwgU2V0PFN0cmluZz4gdmFsdWVzID0gbU5ld1ZhbHVlczsKKyAgICAgICAgICAgIGlmIChjYWxsQ2hhbmdlTGlzdGVuZXIodmFsdWVzKSkgeworICAgICAgICAgICAgICAgIHNldFZhbHVlcyh2YWx1ZXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1QcmVmZXJlbmNlQ2hhbmdlZCA9IGZhbHNlOworICAgIH0KKyAgICAKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgT2JqZWN0IG9uR2V0RGVmYXVsdFZhbHVlKFR5cGVkQXJyYXkgYSwgaW50IGluZGV4KSB7CisgICAgICAgIGZpbmFsIENoYXJTZXF1ZW5jZVtdIGRlZmF1bHRWYWx1ZXMgPSBhLmdldFRleHRBcnJheShpbmRleCk7CisgICAgICAgIGZpbmFsIGludCB2YWx1ZUNvdW50ID0gZGVmYXVsdFZhbHVlcy5sZW5ndGg7CisgICAgICAgIGZpbmFsIFNldDxTdHJpbmc+IHJlc3VsdCA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKKyAgICAgICAgCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFsdWVDb3VudDsgaSsrKSB7CisgICAgICAgICAgICByZXN1bHQuYWRkKGRlZmF1bHRWYWx1ZXNbaV0udG9TdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICAgIAorICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uU2V0SW5pdGlhbFZhbHVlKGJvb2xlYW4gcmVzdG9yZVZhbHVlLCBPYmplY3QgZGVmYXVsdFZhbHVlKSB7CisgICAgICAgIHNldFZhbHVlcyhyZXN0b3JlVmFsdWUgPyBnZXRQZXJzaXN0ZWRTdHJpbmdTZXQobVZhbHVlcykgOiAoU2V0PFN0cmluZz4pIGRlZmF1bHRWYWx1ZSk7CisgICAgfQorICAgIAorICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBQYXJjZWxhYmxlIG9uU2F2ZUluc3RhbmNlU3RhdGUoKSB7CisgICAgICAgIGZpbmFsIFBhcmNlbGFibGUgc3VwZXJTdGF0ZSA9IHN1cGVyLm9uU2F2ZUluc3RhbmNlU3RhdGUoKTsKKyAgICAgICAgaWYgKGlzUGVyc2lzdGVudCgpKSB7CisgICAgICAgICAgICAvLyBObyBuZWVkIHRvIHNhdmUgaW5zdGFuY2Ugc3RhdGUKKyAgICAgICAgICAgIHJldHVybiBzdXBlclN0YXRlOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBmaW5hbCBTYXZlZFN0YXRlIG15U3RhdGUgPSBuZXcgU2F2ZWRTdGF0ZShzdXBlclN0YXRlKTsKKyAgICAgICAgbXlTdGF0ZS52YWx1ZXMgPSBnZXRWYWx1ZXMoKTsKKyAgICAgICAgcmV0dXJuIG15U3RhdGU7CisgICAgfQorICAgIAorICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFNhdmVkU3RhdGUgZXh0ZW5kcyBCYXNlU2F2ZWRTdGF0ZSB7CisgICAgICAgIFNldDxTdHJpbmc+IHZhbHVlczsKKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBTYXZlZFN0YXRlKFBhcmNlbCBzb3VyY2UpIHsKKyAgICAgICAgICAgIHN1cGVyKHNvdXJjZSk7CisgICAgICAgICAgICB2YWx1ZXMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7CisgICAgICAgICAgICBTdHJpbmdbXSBzdHJpbmdzID0gc291cmNlLnJlYWRTdHJpbmdBcnJheSgpOworICAgICAgICAgICAgCisgICAgICAgICAgICBmaW5hbCBpbnQgc3RyaW5nQ291bnQgPSBzdHJpbmdzLmxlbmd0aDsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3RyaW5nQ291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgIHZhbHVlcy5hZGQoc3RyaW5nc1tpXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBTYXZlZFN0YXRlKFBhcmNlbGFibGUgc3VwZXJTdGF0ZSkgeworICAgICAgICAgICAgc3VwZXIoc3VwZXJTdGF0ZSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZVRvUGFyY2VsKFBhcmNlbCBkZXN0LCBpbnQgZmxhZ3MpIHsKKyAgICAgICAgICAgIHN1cGVyLndyaXRlVG9QYXJjZWwoZGVzdCwgZmxhZ3MpOworICAgICAgICAgICAgZGVzdC53cml0ZVN0cmluZ0FycmF5KHZhbHVlcy50b0FycmF5KG5ldyBTdHJpbmdbMF0pKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBQYXJjZWxhYmxlLkNyZWF0b3I8U2F2ZWRTdGF0ZT4gQ1JFQVRPUiA9CisgICAgICAgICAgICAgICAgbmV3IFBhcmNlbGFibGUuQ3JlYXRvcjxTYXZlZFN0YXRlPigpIHsKKyAgICAgICAgICAgIHB1YmxpYyBTYXZlZFN0YXRlIGNyZWF0ZUZyb21QYXJjZWwoUGFyY2VsIGluKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTYXZlZFN0YXRlKGluKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgcHVibGljIFNhdmVkU3RhdGVbXSBuZXdBcnJheShpbnQgc2l6ZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU2F2ZWRTdGF0ZVtzaXplXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9wcmVmZXJlbmNlL1ByZWZlcmVuY2UuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3ByZWZlcmVuY2UvUHJlZmVyZW5jZS5qYXZhCmluZGV4IDE5N2Q5NzYuLjM4MWY3OTQgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3ByZWZlcmVuY2UvUHJlZmVyZW5jZS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ByZWZlcmVuY2UvUHJlZmVyZW5jZS5qYXZhCkBAIC0xNiw4ICsxNiw3IEBACiAKIHBhY2thZ2UgYW5kcm9pZC5wcmVmZXJlbmNlOwogCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC51dGlsLkNoYXJTZXF1ZW5jZXM7CiAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwpAQCAtMjgsNyArMjcsNiBAQAogaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsYWJsZTsKIGltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwogaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudXRpbC5DaGFyU2VxdWVuY2VzOwogaW1wb3J0IGFuZHJvaWQudmlldy5BYnNTYXZlZFN0YXRlOwogaW1wb3J0IGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlcjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKQEAgLTM2LDYgKzM0LDEwIEBACiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGlzdFZpZXc7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7CiAKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKIC8qKgogICogUmVwcmVzZW50cyB0aGUgYmFzaWMgUHJlZmVyZW5jZSBVSSBidWlsZGluZwogICogYmxvY2sgZGlzcGxheWVkIGJ5IGEge0BsaW5rIFByZWZlcmVuY2VBY3Rpdml0eX0gaW4gdGhlIGZvcm0gb2YgYQpAQCAtMTI1MCw2ICsxMjUyLDYxIEBACiAgICAgfQogICAgIAogICAgIC8qKgorICAgICAqIEF0dGVtcHRzIHRvIHBlcnNpc3QgYSBzZXQgb2YgU3RyaW5ncyB0byB0aGUge0BsaW5rIGFuZHJvaWQuY29udGVudC5TaGFyZWRQcmVmZXJlbmNlc30uCisgICAgICogPHA+CisgICAgICogVGhpcyB3aWxsIGNoZWNrIGlmIHRoaXMgUHJlZmVyZW5jZSBpcyBwZXJzaXN0ZW50LCBnZXQgYW4gZWRpdG9yIGZyb20KKyAgICAgKiB0aGUge0BsaW5rIFByZWZlcmVuY2VNYW5hZ2VyfSwgcHV0IGluIHRoZSBzdHJpbmdzLCBhbmQgY2hlY2sgaWYgd2Ugc2hvdWxkIGNvbW1pdCAoYW5kCisgICAgICogY29tbWl0IGlmIHNvKS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gdmFsdWVzIFRoZSB2YWx1ZXMgdG8gcGVyc2lzdC4KKyAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIFByZWZlcmVuY2UgaXMgcGVyc2lzdGVudC4gKFRoaXMgaXMgbm90IHdoZXRoZXIgdGhlCisgICAgICogICAgICAgICB2YWx1ZSB3YXMgcGVyc2lzdGVkLCBzaW5jZSB3ZSBtYXkgbm90IG5lY2Vzc2FyaWx5IGNvbW1pdCBpZiB0aGVyZQorICAgICAqICAgICAgICAgd2lsbCBiZSBhIGJhdGNoIGNvbW1pdCBsYXRlci4pCisgICAgICogQHNlZSAjZ2V0UGVyc2lzdGVkU3RyaW5nKFNldCkKKyAgICAgKiAKKyAgICAgKiBAaGlkZSBQZW5kaW5nIEFQSSBhcHByb3ZhbAorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIHBlcnNpc3RTdHJpbmdTZXQoU2V0PFN0cmluZz4gdmFsdWVzKSB7CisgICAgICAgIGlmIChzaG91bGRQZXJzaXN0KCkpIHsKKyAgICAgICAgICAgIC8vIFNob3VsZG4ndCBzdG9yZSBudWxsCisgICAgICAgICAgICBpZiAodmFsdWVzLmVxdWFscyhnZXRQZXJzaXN0ZWRTdHJpbmdTZXQobnVsbCkpKSB7CisgICAgICAgICAgICAgICAgLy8gSXQncyBhbHJlYWR5IHRoZXJlLCBzbyB0aGUgc2FtZSBhcyBwZXJzaXN0aW5nCisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIFNoYXJlZFByZWZlcmVuY2VzLkVkaXRvciBlZGl0b3IgPSBtUHJlZmVyZW5jZU1hbmFnZXIuZ2V0RWRpdG9yKCk7CisgICAgICAgICAgICBlZGl0b3IucHV0U3RyaW5nU2V0KG1LZXksIHZhbHVlcyk7CisgICAgICAgICAgICB0cnlDb21taXQoZWRpdG9yKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBdHRlbXB0cyB0byBnZXQgYSBwZXJzaXN0ZWQgc2V0IG9mIFN0cmluZ3MgZnJvbSB0aGUKKyAgICAgKiB7QGxpbmsgYW5kcm9pZC5jb250ZW50LlNoYXJlZFByZWZlcmVuY2VzfS4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIHdpbGwgY2hlY2sgaWYgdGhpcyBQcmVmZXJlbmNlIGlzIHBlcnNpc3RlbnQsIGdldCB0aGUgU2hhcmVkUHJlZmVyZW5jZXMKKyAgICAgKiBmcm9tIHRoZSB7QGxpbmsgUHJlZmVyZW5jZU1hbmFnZXJ9LCBhbmQgZ2V0IHRoZSB2YWx1ZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZGVmYXVsdFJldHVyblZhbHVlIFRoZSBkZWZhdWx0IHZhbHVlIHRvIHJldHVybiBpZiBlaXRoZXIgdGhlCisgICAgICogICAgICAgICAgICBQcmVmZXJlbmNlIGlzIG5vdCBwZXJzaXN0ZW50IG9yIHRoZSBQcmVmZXJlbmNlIGlzIG5vdCBpbiB0aGUKKyAgICAgKiAgICAgICAgICAgIHNoYXJlZCBwcmVmZXJlbmNlcy4KKyAgICAgKiBAcmV0dXJuIFRoZSB2YWx1ZSBmcm9tIHRoZSBTaGFyZWRQcmVmZXJlbmNlcyBvciB0aGUgZGVmYXVsdCByZXR1cm4KKyAgICAgKiAgICAgICAgIHZhbHVlLgorICAgICAqIEBzZWUgI3BlcnNpc3RTdHJpbmdTZXQoU2V0KQorICAgICAqIAorICAgICAqIEBoaWRlIFBlbmRpbmcgQVBJIGFwcHJvdmFsCisgICAgICovCisgICAgcHJvdGVjdGVkIFNldDxTdHJpbmc+IGdldFBlcnNpc3RlZFN0cmluZ1NldChTZXQ8U3RyaW5nPiBkZWZhdWx0UmV0dXJuVmFsdWUpIHsKKyAgICAgICAgaWYgKCFzaG91bGRQZXJzaXN0KCkpIHsKKyAgICAgICAgICAgIHJldHVybiBkZWZhdWx0UmV0dXJuVmFsdWU7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHJldHVybiBtUHJlZmVyZW5jZU1hbmFnZXIuZ2V0U2hhcmVkUHJlZmVyZW5jZXMoKS5nZXRTdHJpbmdTZXQobUtleSwgZGVmYXVsdFJldHVyblZhbHVlKTsKKyAgICB9CisgICAgCisgICAgLyoqCiAgICAgICogQXR0ZW1wdHMgdG8gcGVyc2lzdCBhbiBpbnQgdG8gdGhlIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuU2hhcmVkUHJlZmVyZW5jZXN9LgogICAgICAqIAogICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gcGVyc2lzdC4KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3ByZWZlcmVuY2UvUHJlZmVyZW5jZUFjdGl2aXR5LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9wcmVmZXJlbmNlL1ByZWZlcmVuY2VBY3Rpdml0eS5qYXZhCmluZGV4IDcyNjc5M2QuLjQ2ODY5NzggMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3ByZWZlcmVuY2UvUHJlZmVyZW5jZUFjdGl2aXR5LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvcHJlZmVyZW5jZS9QcmVmZXJlbmNlQWN0aXZpdHkuamF2YQpAQCAtMjMsNyArMjMsMTAgQEAKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKIGltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOworaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXcuT25DbGlja0xpc3RlbmVyOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkJ1dHRvbjsKIAogLyoqCiAgKiBTaG93cyBhIGhpZXJhcmNoeSBvZiB7QGxpbmsgUHJlZmVyZW5jZX0gb2JqZWN0cyBhcwpAQCAtNjksMzAgKzcyLDQzIEBACiAgKiBBcyBhIGNvbnZlbmllbmNlLCB0aGlzIGFjdGl2aXR5IGltcGxlbWVudHMgYSBjbGljayBsaXN0ZW5lciBmb3IgYW55CiAgKiBwcmVmZXJlbmNlIGluIHRoZSBjdXJyZW50IGhpZXJhcmNoeSwgc2VlCiAgKiB7QGxpbmsgI29uUHJlZmVyZW5jZVRyZWVDbGljayhQcmVmZXJlbmNlU2NyZWVuLCBQcmVmZXJlbmNlKX0uCi0gKiAKKyAqCiAgKiBAc2VlIFByZWZlcmVuY2UKICAqIEBzZWUgUHJlZmVyZW5jZVNjcmVlbgogICovCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgUHJlZmVyZW5jZUFjdGl2aXR5IGV4dGVuZHMgTGlzdEFjdGl2aXR5IGltcGxlbWVudHMKICAgICAgICAgUHJlZmVyZW5jZU1hbmFnZXIuT25QcmVmZXJlbmNlVHJlZUNsaWNrTGlzdGVuZXIgewotICAgIAorCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZFUkVOQ0VTX1RBRyA9ICJhbmRyb2lkOnByZWZlcmVuY2VzIjsKLSAgICAKKworICAgIC8vIGV4dHJhcyB0aGF0IGFsbG93IGFueSBwcmVmZXJlbmNlIGFjdGl2aXR5IHRvIGJlIGxhdW5jaGVkIGFzIHBhcnQgb2YgYSB3aXphcmQKKworICAgIC8vIHNob3cgQmFjayBhbmQgTmV4dCBidXR0b25zPyB0YWtlcyBib29sZWFuIHBhcmFtZXRlcgorICAgIC8vIEJhY2sgd2lsbCB0aGVuIHJldHVybiBSRVNVTFRfQ0FOQ0VMRUQgYW5kIE5leHQgUkVTVUxUX09LCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX1BSRUZTX1NIT1dfQlVUVE9OX0JBUiA9ICJleHRyYV9wcmVmc19zaG93X2J1dHRvbl9iYXIiOworCisgICAgLy8gc3BlY2lmeSBjdXN0b20gdGV4dCBmb3IgdGhlIEJhY2sgb3IgTmV4dCBidXR0b25zLCBvciBjYXVzZSBhIGJ1dHRvbiB0byBub3QgYXBwZWFyCisgICAgLy8gYXQgYWxsIGJ5IHNldHRpbmcgaXQgdG8gbnVsbAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9QUkVGU19TRVRfTkVYVF9URVhUID0gImV4dHJhX3ByZWZzX3NldF9uZXh0X3RleHQiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9QUkVGU19TRVRfQkFDS19URVhUID0gImV4dHJhX3ByZWZzX3NldF9iYWNrX3RleHQiOworCisgICAgcHJpdmF0ZSBCdXR0b24gbU5leHRCdXR0b247CisKICAgICBwcml2YXRlIFByZWZlcmVuY2VNYW5hZ2VyIG1QcmVmZXJlbmNlTWFuYWdlcjsKLSAgICAKKwogICAgIHByaXZhdGUgQnVuZGxlIG1TYXZlZEluc3RhbmNlU3RhdGU7CiAKICAgICAvKioKICAgICAgKiBUaGUgc3RhcnRpbmcgcmVxdWVzdCBjb2RlIGdpdmVuIG91dCB0byBwcmVmZXJlbmNlIGZyYW1ld29yay4KICAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRklSU1RfUkVRVUVTVF9DT0RFID0gMTAwOwotICAgIAorCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19CSU5EX1BSRUZFUkVOQ0VTID0gMDsKICAgICBwcml2YXRlIEhhbmRsZXIgbUhhbmRsZXIgPSBuZXcgSGFuZGxlcigpIHsKICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoTWVzc2FnZSBtc2cpIHsKICAgICAgICAgICAgIHN3aXRjaCAobXNnLndoYXQpIHsKLSAgICAgICAgICAgICAgICAKKwogICAgICAgICAgICAgICAgIGNhc2UgTVNHX0JJTkRfUFJFRkVSRU5DRVM6CiAgICAgICAgICAgICAgICAgICAgIGJpbmRQcmVmZXJlbmNlcygpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTEwNSw3ICsxMjEsNDkgQEAKICAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKIAogICAgICAgICBzZXRDb250ZW50Vmlldyhjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmxheW91dC5wcmVmZXJlbmNlX2xpc3RfY29udGVudCk7Ci0gICAgICAgIAorCisgICAgICAgIC8vIHNlZSBpZiB3ZSBzaG91bGQgc2hvdyBCYWNrL05leHQgYnV0dG9ucworICAgICAgICBJbnRlbnQgaW50ZW50ID0gZ2V0SW50ZW50KCk7CisgICAgICAgIGlmIChpbnRlbnQuZ2V0Qm9vbGVhbkV4dHJhKEVYVFJBX1BSRUZTX1NIT1dfQlVUVE9OX0JBUiwgZmFsc2UpKSB7CisKKyAgICAgICAgICAgIGZpbmRWaWV3QnlJZChjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmlkLmJ1dHRvbl9iYXIpLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKworICAgICAgICAgICAgQnV0dG9uIGJhY2tCdXR0b24gPSAoQnV0dG9uKWZpbmRWaWV3QnlJZChjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmlkLmJhY2tfYnV0dG9uKTsKKyAgICAgICAgICAgIGJhY2tCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG5ldyBPbkNsaWNrTGlzdGVuZXIoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKKyAgICAgICAgICAgICAgICAgICAgc2V0UmVzdWx0KFJFU1VMVF9DQU5DRUxFRCk7CisgICAgICAgICAgICAgICAgICAgIGZpbmlzaCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgbU5leHRCdXR0b24gPSAoQnV0dG9uKWZpbmRWaWV3QnlJZChjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmlkLm5leHRfYnV0dG9uKTsKKyAgICAgICAgICAgIG1OZXh0QnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihuZXcgT25DbGlja0xpc3RlbmVyKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7CisgICAgICAgICAgICAgICAgICAgIHNldFJlc3VsdChSRVNVTFRfT0spOworICAgICAgICAgICAgICAgICAgICBmaW5pc2goKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgLy8gc2V0IG91ciB2YXJpb3VzIGJ1dHRvbiBwYXJhbWV0ZXJzCisgICAgICAgICAgICBpZiAoaW50ZW50Lmhhc0V4dHJhKEVYVFJBX1BSRUZTX1NFVF9ORVhUX1RFWFQpKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGJ1dHRvblRleHQgPSBpbnRlbnQuZ2V0U3RyaW5nRXh0cmEoRVhUUkFfUFJFRlNfU0VUX05FWFRfVEVYVCk7CisgICAgICAgICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KGJ1dHRvblRleHQpKSB7CisgICAgICAgICAgICAgICAgICAgIG1OZXh0QnV0dG9uLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG1OZXh0QnV0dG9uLnNldFRleHQoYnV0dG9uVGV4dCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGludGVudC5oYXNFeHRyYShFWFRSQV9QUkVGU19TRVRfQkFDS19URVhUKSkgeworICAgICAgICAgICAgICAgIFN0cmluZyBidXR0b25UZXh0ID0gaW50ZW50LmdldFN0cmluZ0V4dHJhKEVYVFJBX1BSRUZTX1NFVF9CQUNLX1RFWFQpOworICAgICAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShidXR0b25UZXh0KSkgeworICAgICAgICAgICAgICAgICAgICBiYWNrQnV0dG9uLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGJhY2tCdXR0b24uc2V0VGV4dChidXR0b25UZXh0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKwogICAgICAgICBtUHJlZmVyZW5jZU1hbmFnZXIgPSBvbkNyZWF0ZVByZWZlcmVuY2VNYW5hZ2VyKCk7CiAgICAgICAgIGdldExpc3RWaWV3KCkuc2V0U2Nyb2xsQmFyU3R5bGUoVmlldy5TQ1JPTExCQVJTX0lOU0lERV9PVkVSTEFZKTsKICAgICB9CkBAIC0xMTMsMTQgKzE3MSwxMyBAQAogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIG9uU3RvcCgpIHsKICAgICAgICAgc3VwZXIub25TdG9wKCk7Ci0gICAgICAgIAorCiAgICAgICAgIG1QcmVmZXJlbmNlTWFuYWdlci5kaXNwYXRjaEFjdGl2aXR5U3RvcCgpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIG9uRGVzdHJveSgpIHsKICAgICAgICAgc3VwZXIub25EZXN0cm95KCk7Ci0gICAgICAgIAogICAgICAgICBtUHJlZmVyZW5jZU1hbmFnZXIuZGlzcGF0Y2hBY3Rpdml0eURlc3Ryb3koKTsKICAgICB9CiAKQEAgLTE1Niw3ICsyMTMsNyBAQAogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIG9uQWN0aXZpdHlSZXN1bHQoaW50IHJlcXVlc3RDb2RlLCBpbnQgcmVzdWx0Q29kZSwgSW50ZW50IGRhdGEpIHsKICAgICAgICAgc3VwZXIub25BY3Rpdml0eVJlc3VsdChyZXF1ZXN0Q29kZSwgcmVzdWx0Q29kZSwgZGF0YSk7Ci0gICAgICAgIAorCiAgICAgICAgIG1QcmVmZXJlbmNlTWFuYWdlci5kaXNwYXRjaEFjdGl2aXR5UmVzdWx0KHJlcXVlc3RDb2RlLCByZXN1bHRDb2RlLCBkYXRhKTsKICAgICB9CiAKQEAgLTE3Niw3ICsyMzMsNyBAQAogICAgICAgICBpZiAobUhhbmRsZXIuaGFzTWVzc2FnZXMoTVNHX0JJTkRfUFJFRkVSRU5DRVMpKSByZXR1cm47CiAgICAgICAgIG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UoTVNHX0JJTkRfUFJFRkVSRU5DRVMpLnNlbmRUb1RhcmdldCgpOwogICAgIH0KLSAgICAKKwogICAgIHByaXZhdGUgdm9pZCBiaW5kUHJlZmVyZW5jZXMoKSB7CiAgICAgICAgIGZpbmFsIFByZWZlcmVuY2VTY3JlZW4gcHJlZmVyZW5jZVNjcmVlbiA9IGdldFByZWZlcmVuY2VTY3JlZW4oKTsKICAgICAgICAgaWYgKHByZWZlcmVuY2VTY3JlZW4gIT0gbnVsbCkgewpAQCAtMTg3LDEwICsyNDQsMTAgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIENyZWF0ZXMgdGhlIHtAbGluayBQcmVmZXJlbmNlTWFuYWdlcn0uCi0gICAgICogCisgICAgICoKICAgICAgKiBAcmV0dXJuIFRoZSB7QGxpbmsgUHJlZmVyZW5jZU1hbmFnZXJ9IHVzZWQgYnkgdGhpcyBhY3Rpdml0eS4KICAgICAgKi8KICAgICBwcml2YXRlIFByZWZlcmVuY2VNYW5hZ2VyIG9uQ3JlYXRlUHJlZmVyZW5jZU1hbmFnZXIoKSB7CkBAIC0xOTgsNyArMjU1LDcgQEAKICAgICAgICAgcHJlZmVyZW5jZU1hbmFnZXIuc2V0T25QcmVmZXJlbmNlVHJlZUNsaWNrTGlzdGVuZXIodGhpcyk7CiAgICAgICAgIHJldHVybiBwcmVmZXJlbmNlTWFuYWdlcjsKICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSB7QGxpbmsgUHJlZmVyZW5jZU1hbmFnZXJ9IHVzZWQgYnkgdGhpcyBhY3Rpdml0eS4KICAgICAgKiBAcmV0dXJuIFRoZSB7QGxpbmsgUHJlZmVyZW5jZU1hbmFnZXJ9LgpAQCAtMjA2LDcgKzI2Myw3IEBACiAgICAgcHVibGljIFByZWZlcmVuY2VNYW5hZ2VyIGdldFByZWZlcmVuY2VNYW5hZ2VyKCkgewogICAgICAgICByZXR1cm4gbVByZWZlcmVuY2VNYW5hZ2VyOwogICAgIH0KLSAgICAKKwogICAgIHByaXZhdGUgdm9pZCByZXF1aXJlUHJlZmVyZW5jZU1hbmFnZXIoKSB7CiAgICAgICAgIGlmIChtUHJlZmVyZW5jZU1hbmFnZXIgPT0gbnVsbCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlRoaXMgc2hvdWxkIGJlIGNhbGxlZCBhZnRlciBzdXBlci5vbkNyZWF0ZS4iKTsKQEAgLTIxNSw3ICsyNzIsNyBAQAogCiAgICAgLyoqCiAgICAgICogU2V0cyB0aGUgcm9vdCBvZiB0aGUgcHJlZmVyZW5jZSBoaWVyYXJjaHkgdGhhdCB0aGlzIGFjdGl2aXR5IGlzIHNob3dpbmcuCi0gICAgICogCisgICAgICoKICAgICAgKiBAcGFyYW0gcHJlZmVyZW5jZVNjcmVlbiBUaGUgcm9vdCB7QGxpbmsgUHJlZmVyZW5jZVNjcmVlbn0gb2YgdGhlIHByZWZlcmVuY2UgaGllcmFyY2h5LgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldFByZWZlcmVuY2VTY3JlZW4oUHJlZmVyZW5jZVNjcmVlbiBwcmVmZXJlbmNlU2NyZWVuKSB7CkBAIC0yMjgsMzcgKzI4NSwzNyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgcm9vdCBvZiB0aGUgcHJlZmVyZW5jZSBoaWVyYXJjaHkgdGhhdCB0aGlzIGFjdGl2aXR5IGlzIHNob3dpbmcuCi0gICAgICogCisgICAgICoKICAgICAgKiBAcmV0dXJuIFRoZSB7QGxpbmsgUHJlZmVyZW5jZVNjcmVlbn0gdGhhdCBpcyB0aGUgcm9vdCBvZiB0aGUgcHJlZmVyZW5jZQogICAgICAqICAgICAgICAgaGllcmFyY2h5LgogICAgICAqLwogICAgIHB1YmxpYyBQcmVmZXJlbmNlU2NyZWVuIGdldFByZWZlcmVuY2VTY3JlZW4oKSB7CiAgICAgICAgIHJldHVybiBtUHJlZmVyZW5jZU1hbmFnZXIuZ2V0UHJlZmVyZW5jZVNjcmVlbigpOwogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIEFkZHMgcHJlZmVyZW5jZXMgZnJvbSBhY3Rpdml0aWVzIHRoYXQgbWF0Y2ggdGhlIGdpdmVuIHtAbGluayBJbnRlbnR9LgotICAgICAqIAorICAgICAqCiAgICAgICogQHBhcmFtIGludGVudCBUaGUge0BsaW5rIEludGVudH0gdG8gcXVlcnkgYWN0aXZpdGllcy4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBhZGRQcmVmZXJlbmNlc0Zyb21JbnRlbnQoSW50ZW50IGludGVudCkgewogICAgICAgICByZXF1aXJlUHJlZmVyZW5jZU1hbmFnZXIoKTsKLSAgICAgICAgCisKICAgICAgICAgc2V0UHJlZmVyZW5jZVNjcmVlbihtUHJlZmVyZW5jZU1hbmFnZXIuaW5mbGF0ZUZyb21JbnRlbnQoaW50ZW50LCBnZXRQcmVmZXJlbmNlU2NyZWVuKCkpKTsKICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBJbmZsYXRlcyB0aGUgZ2l2ZW4gWE1MIHJlc291cmNlIGFuZCBhZGRzIHRoZSBwcmVmZXJlbmNlIGhpZXJhcmNoeSB0byB0aGUgY3VycmVudAogICAgICAqIHByZWZlcmVuY2UgaGllcmFyY2h5LgotICAgICAqIAorICAgICAqCiAgICAgICogQHBhcmFtIHByZWZlcmVuY2VzUmVzSWQgVGhlIFhNTCByZXNvdXJjZSBJRCB0byBpbmZsYXRlLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGFkZFByZWZlcmVuY2VzRnJvbVJlc291cmNlKGludCBwcmVmZXJlbmNlc1Jlc0lkKSB7CiAgICAgICAgIHJlcXVpcmVQcmVmZXJlbmNlTWFuYWdlcigpOwotICAgICAgICAKKwogICAgICAgICBzZXRQcmVmZXJlbmNlU2NyZWVuKG1QcmVmZXJlbmNlTWFuYWdlci5pbmZsYXRlRnJvbVJlc291cmNlKHRoaXMsIHByZWZlcmVuY2VzUmVzSWQsCiAgICAgICAgICAgICAgICAgZ2V0UHJlZmVyZW5jZVNjcmVlbigpKSk7CiAgICAgfQpAQCAtMjY5LDIwICszMjYsMjAgQEAKICAgICBwdWJsaWMgYm9vbGVhbiBvblByZWZlcmVuY2VUcmVlQ2xpY2soUHJlZmVyZW5jZVNjcmVlbiBwcmVmZXJlbmNlU2NyZWVuLCBQcmVmZXJlbmNlIHByZWZlcmVuY2UpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIEZpbmRzIGEge0BsaW5rIFByZWZlcmVuY2V9IGJhc2VkIG9uIGl0cyBrZXkuCi0gICAgICogCisgICAgICoKICAgICAgKiBAcGFyYW0ga2V5IFRoZSBrZXkgb2YgdGhlIHByZWZlcmVuY2UgdG8gcmV0cmlldmUuCiAgICAgICogQHJldHVybiBUaGUge0BsaW5rIFByZWZlcmVuY2V9IHdpdGggdGhlIGtleSwgb3IgbnVsbC4KICAgICAgKiBAc2VlIFByZWZlcmVuY2VHcm91cCNmaW5kUHJlZmVyZW5jZShDaGFyU2VxdWVuY2UpCiAgICAgICovCiAgICAgcHVibGljIFByZWZlcmVuY2UgZmluZFByZWZlcmVuY2UoQ2hhclNlcXVlbmNlIGtleSkgewotICAgICAgICAKKwogICAgICAgICBpZiAobVByZWZlcmVuY2VNYW5hZ2VyID09IG51bGwpIHsKICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICB9Ci0gICAgICAgIAorCiAgICAgICAgIHJldHVybiBtUHJlZmVyZW5jZU1hbmFnZXIuZmluZFByZWZlcmVuY2Uoa2V5KTsKICAgICB9CiAKQEAgLTI5Miw1ICszNDksMTQgQEAKICAgICAgICAgICAgIG1QcmVmZXJlbmNlTWFuYWdlci5kaXNwYXRjaE5ld0ludGVudChpbnRlbnQpOwogICAgICAgICB9CiAgICAgfQotICAgIAorCisgICAgLy8gZ2l2ZSBzdWJjbGFzc2VzIGFjY2VzcyB0byB0aGUgTmV4dCBidXR0b24KKyAgICAvKiogQGhpZGUgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBoYXNOZXh0QnV0dG9uKCkgeworICAgICAgICByZXR1cm4gbU5leHRCdXR0b24gIT0gbnVsbDsKKyAgICB9CisgICAgLyoqIEBoaWRlICovCisgICAgcHJvdGVjdGVkIEJ1dHRvbiBnZXROZXh0QnV0dG9uKCkgeworICAgICAgICByZXR1cm4gbU5leHRCdXR0b247CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvcHJvdmlkZXIvQ2FsZW5kYXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3Byb3ZpZGVyL0NhbGVuZGFyLmphdmEKaW5kZXggOWEwOTgwNS4uNzRhY2I5OCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvcHJvdmlkZXIvQ2FsZW5kYXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9wcm92aWRlci9DYWxlbmRhci5qYXZhCkBAIC03NiwxMSArNzYsODcgQEAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQUxMRVJfSVNfU1lOQ0FEQVBURVIgPSAiY2FsbGVyX2lzX3N5bmNhZGFwdGVyIjsKIAorCisgICAgLyoqCisgICAgICogQ29sdW1ucyBmb3IgU3luYyBpbmZvcm1hdGlvbiB1c2VkIGJ5IENhbGVuZGFycyBhbmQgRXZlbnRzIHRhYmxlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50ZXJmYWNlIFN5bmNDb2x1bW5zIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBhY2NvdW50IHRoYXQgd2FzIHVzZWQgdG8gc3luYyB0aGUgZW50cnkgdG8gdGhlIGRldmljZS4KKyAgICAgICAgICogPFA+VHlwZTogVEVYVDwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIF9TWU5DX0FDQ09VTlQgPSAiX3N5bmNfYWNjb3VudCI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSB0eXBlIG9mIHRoZSBhY2NvdW50IHRoYXQgd2FzIHVzZWQgdG8gc3luYyB0aGUgZW50cnkgdG8gdGhlIGRldmljZS4KKyAgICAgICAgICogPFA+VHlwZTogVEVYVDwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIF9TWU5DX0FDQ09VTlRfVFlQRSA9ICJfc3luY19hY2NvdW50X3R5cGUiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgdW5pcXVlIElEIGZvciBhIHJvdyBhc3NpZ25lZCBieSB0aGUgc3luYyBzb3VyY2UuIE5VTEwgaWYgdGhlIHJvdyBoYXMgbmV2ZXIgYmVlbiBzeW5jZWQuCisgICAgICAgICAqIDxQPlR5cGU6IFRFWFQ8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBfU1lOQ19JRCA9ICJfc3luY19pZCI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBsYXN0IHRpbWUsIGZyb20gdGhlIHN5bmMgc291cmNlJ3MgcG9pbnQgb2YgdmlldywgdGhhdCB0aGlzIHJvdyBoYXMgYmVlbiBzeW5jaHJvbml6ZWQuCisgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVIgKGxvbmcpPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgX1NZTkNfVElNRSA9ICJfc3luY190aW1lIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHZlcnNpb24gb2YgdGhlIHJvdywgYXMgYXNzaWduZWQgYnkgdGhlIHNlcnZlci4KKyAgICAgICAgICogPFA+VHlwZTogVEVYVDwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIF9TWU5DX1ZFUlNJT04gPSAiX3N5bmNfdmVyc2lvbiI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEZvciB1c2UgYnkgc3luYyBhZGFwdGVyIGF0IGl0cyBkaXNjcmV0aW9uOyBub3QgbW9kaWZpZWQgYnkgQ2FsZW5kYXJQcm92aWRlcgorICAgICAgICAgKiBOb3RlIHRoYXQgdGhpcyBjb2x1bW4gd2FzIGZvcm1lcmx5IG5hbWVkIF9TWU5DX0xPQ0FMX0lELiAgV2UgYXJlIHVzaW5nIGl0IHRvIGF2b2lkIGEKKyAgICAgICAgICogc2NoZW1hIGNoYW5nZS4KKyAgICAgICAgICogVE9ETyBSZXBsYWNlIHRoaXMgd2l0aCBzb21ldGhpbmcgbW9yZSBnZW5lcmFsIGluIHRoZSBmdXR1cmUuCisgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVIgKGxvbmcpPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgX1NZTkNfREFUQSA9ICJfc3luY19sb2NhbF9pZCI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFVzZWQgb25seSBpbiBwZXJzaXN0ZW50IHByb3ZpZGVycywgYW5kIG9ubHkgZHVyaW5nIG1lcmdpbmcuCisgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVIgKGxvbmcpPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgX1NZTkNfTUFSSyA9ICJfc3luY19tYXJrIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVXNlZCB0byBpbmRpY2F0ZSB0aGF0IGxvY2FsLCB1bnN5bmNlZCwgY2hhbmdlcyBhcmUgcHJlc2VudC4KKyAgICAgICAgICogPFA+VHlwZTogSU5URUdFUiAobG9uZyk8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBfU1lOQ19ESVJUWSA9ICJfc3luY19kaXJ0eSI7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb2x1bW5zIGZyb20gdGhlIEFjY291bnQgaW5mb3JtYXRpb24gdXNlZCBieSBDYWxlbmRhcnMgYW5kIEV2ZW50cyB0YWJsZXMuCisgICAgICovCisgICAgcHVibGljIGludGVyZmFjZSBBY2NvdW50Q29sdW1ucyB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgbmFtZSBvZiB0aGUgYWNjb3VudCBpbnN0YW5jZSB0byB3aGljaCB0aGlzIHJvdyBiZWxvbmdzLCB3aGljaCB3aGVuIHBhaXJlZCB3aXRoCisgICAgICAgICAqIHtAbGluayAjQUNDT1VOVF9UWVBFfSBpZGVudGlmaWVzIGEgc3BlY2lmaWMgYWNjb3VudC4KKyAgICAgICAgICogPFA+VHlwZTogVEVYVDwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDQ09VTlRfTkFNRSA9ICJhY2NvdW50X25hbWUiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgdHlwZSBvZiBhY2NvdW50IHRvIHdoaWNoIHRoaXMgcm93IGJlbG9uZ3MsIHdoaWNoIHdoZW4gcGFpcmVkIHdpdGgKKyAgICAgICAgICoge0BsaW5rICNBQ0NPVU5UX05BTUV9IGlkZW50aWZpZXMgYSBzcGVjaWZpYyBhY2NvdW50LgorICAgICAgICAgKiA8UD5UeXBlOiBURVhUPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNDT1VOVF9UWVBFID0gImFjY291bnRfdHlwZSI7CisgICAgfQorCiAgICAgLyoqCiAgICAgICogQ29sdW1ucyBmcm9tIHRoZSBDYWxlbmRhcnMgdGFibGUgdGhhdCBvdGhlciB0YWJsZXMgam9pbiBpbnRvIHRoZW1zZWx2ZXMuCiAgICAgICovCi0gICAgcHVibGljIGludGVyZmFjZSBDYWxlbmRhcnNDb2x1bW5zCi0gICAgeworICAgIHB1YmxpYyBpbnRlcmZhY2UgQ2FsZW5kYXJzQ29sdW1ucyB7CiAgICAgICAgIC8qKgogICAgICAgICAgKiBUaGUgY29sb3Igb2YgdGhlIGNhbGVuZGFyCiAgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVIgKGNvbG9yIHZhbHVlKTwvUD4KQEAgLTEzNSw3NSArMjExLDEwNCBAQAogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTWU5DX1NUQVRFID0gInN5bmNfc3RhdGUiOwogCiAgICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgYWNjb3VudCB0aGF0IHdhcyB1c2VkIHRvIHN5bmMgdGhlIGVudHJ5IHRvIHRoZSBkZXZpY2UuCi0gICAgICAgICAqIDxQPlR5cGU6IFRFWFQ8L1A+CisgICAgICAgICAqIFdoZXRoZXIgdGhlIHJvdyBoYXMgYmVlbiBkZWxldGVkLiAgQSBkZWxldGVkIHJvdyBzaG91bGQgYmUgaWdub3JlZC4KKyAgICAgICAgICogPFA+VHlwZTogSU5URUdFUiAoYm9vbGVhbik8L1A+CiAgICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBfU1lOQ19BQ0NPVU5UID0gIl9zeW5jX2FjY291bnQiOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgdHlwZSBvZiB0aGUgYWNjb3VudCB0aGF0IHdhcyB1c2VkIHRvIHN5bmMgdGhlIGVudHJ5IHRvIHRoZSBkZXZpY2UuCi0gICAgICAgICAqIDxQPlR5cGU6IFRFWFQ8L1A+Ci0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBfU1lOQ19BQ0NPVU5UX1RZUEUgPSAiX3N5bmNfYWNjb3VudF90eXBlIjsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIHVuaXF1ZSBJRCBmb3IgYSByb3cgYXNzaWduZWQgYnkgdGhlIHN5bmMgc291cmNlLiBOVUxMIGlmIHRoZSByb3cgaGFzIG5ldmVyIGJlZW4gc3luY2VkLgotICAgICAgICAgKiA8UD5UeXBlOiBURVhUPC9QPgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgX1NZTkNfSUQgPSAiX3N5bmNfaWQiOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbGFzdCB0aW1lLCBmcm9tIHRoZSBzeW5jIHNvdXJjZSdzIHBvaW50IG9mIHZpZXcsIHRoYXQgdGhpcyByb3cgaGFzIGJlZW4gc3luY2hyb25pemVkLgotICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSIChsb25nKTwvUD4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIF9TWU5DX1RJTUUgPSAiX3N5bmNfdGltZSI7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSB2ZXJzaW9uIG9mIHRoZSByb3csIGFzIGFzc2lnbmVkIGJ5IHRoZSBzZXJ2ZXIuCi0gICAgICAgICAqIDxQPlR5cGU6IFRFWFQ8L1A+Ci0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBfU1lOQ19WRVJTSU9OID0gIl9zeW5jX3ZlcnNpb24iOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBGb3IgdXNlIGJ5IHN5bmMgYWRhcHRlciBhdCBpdHMgZGlzY3JldGlvbjsgbm90IG1vZGlmaWVkIGJ5IENhbGVuZGFyUHJvdmlkZXIKLSAgICAgICAgICogTm90ZSB0aGF0IHRoaXMgY29sdW1uIHdhcyBmb3JtZXJseSBuYW1lZCBfU1lOQ19MT0NBTF9JRC4gIFdlIGFyZSB1c2luZyBpdCB0byBhdm9pZCBhCi0gICAgICAgICAqIHNjaGVtYSBjaGFuZ2UuCi0gICAgICAgICAqIFRPRE8gUmVwbGFjZSB0aGlzIHdpdGggc29tZXRoaW5nIG1vcmUgZ2VuZXJhbCBpbiB0aGUgZnV0dXJlLgotICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSIChsb25nKTwvUD4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIF9TWU5DX0RBVEEgPSAiX3N5bmNfbG9jYWxfaWQiOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBVc2VkIG9ubHkgaW4gcGVyc2lzdGVudCBwcm92aWRlcnMsIGFuZCBvbmx5IGR1cmluZyBtZXJnaW5nLgotICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSIChsb25nKTwvUD4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIF9TWU5DX01BUksgPSAiX3N5bmNfbWFyayI7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFVzZWQgdG8gaW5kaWNhdGUgdGhhdCBsb2NhbCwgdW5zeW5jZWQsIGNoYW5nZXMgYXJlIHByZXNlbnQuCi0gICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVIgKGxvbmcpPC9QPgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgX1NZTkNfRElSVFkgPSAiX3N5bmNfZGlydHkiOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbmFtZSBvZiB0aGUgYWNjb3VudCBpbnN0YW5jZSB0byB3aGljaCB0aGlzIHJvdyBiZWxvbmdzLCB3aGljaCB3aGVuIHBhaXJlZCB3aXRoCi0gICAgICAgICAqIHtAbGluayAjQUNDT1VOVF9UWVBFfSBpZGVudGlmaWVzIGEgc3BlY2lmaWMgYWNjb3VudC4KLSAgICAgICAgICogPFA+VHlwZTogVEVYVDwvUD4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDQ09VTlRfTkFNRSA9ICJhY2NvdW50X25hbWUiOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgdHlwZSBvZiBhY2NvdW50IHRvIHdoaWNoIHRoaXMgcm93IGJlbG9uZ3MsIHdoaWNoIHdoZW4gcGFpcmVkIHdpdGgKLSAgICAgICAgICoge0BsaW5rICNBQ0NPVU5UX05BTUV9IGlkZW50aWZpZXMgYSBzcGVjaWZpYyBhY2NvdW50LgotICAgICAgICAgKiA8UD5UeXBlOiBURVhUPC9QPgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNDT1VOVF9UWVBFID0gImFjY291bnRfdHlwZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFTEVURUQgPSAiZGVsZXRlZCI7CiAgICAgfQogCiAgICAgLyoqCisgICAgICogQ2xhc3MgdGhhdCByZXByZXNlbnRzIGEgQ2FsZW5kYXIgRW50aXR5LiBUaGVyZSBpcyBvbmUgZW50cnkgcGVyIGNhbGVuZGFyLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ2FsZW5kYXJzRW50aXR5IGltcGxlbWVudHMgQmFzZUNvbHVtbnMsIFN5bmNDb2x1bW5zLCBDYWxlbmRhcnNDb2x1bW5zIHsKKworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVyaSBDT05URU5UX1VSSSA9IFVyaS5wYXJzZSgiY29udGVudDovLyIgKyBBVVRIT1JJVFkgKworICAgICAgICAgICAgICAgICIvY2FsZW5kYXJfZW50aXRpZXMiKTsKKworICAgICAgICBwdWJsaWMgc3RhdGljIEVudGl0eUl0ZXJhdG9yIG5ld0VudGl0eUl0ZXJhdG9yKEN1cnNvciBjdXJzb3IsIENvbnRlbnRSZXNvbHZlciByZXNvbHZlcikgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBFbnRpdHlJdGVyYXRvckltcGwoY3Vyc29yLCByZXNvbHZlcik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIEVudGl0eUl0ZXJhdG9yIG5ld0VudGl0eUl0ZXJhdG9yKEN1cnNvciBjdXJzb3IsCisgICAgICAgICAgICAgICAgQ29udGVudFByb3ZpZGVyQ2xpZW50IHByb3ZpZGVyKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEVudGl0eUl0ZXJhdG9ySW1wbChjdXJzb3IsIHByb3ZpZGVyKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEVudGl0eUl0ZXJhdG9ySW1wbCBleHRlbmRzIEN1cnNvckVudGl0eUl0ZXJhdG9yIHsKKyAgICAgICAgICAgIHByaXZhdGUgZmluYWwgQ29udGVudFJlc29sdmVyIG1SZXNvbHZlcjsKKyAgICAgICAgICAgIHByaXZhdGUgZmluYWwgQ29udGVudFByb3ZpZGVyQ2xpZW50IG1Qcm92aWRlcjsKKworICAgICAgICAgICAgcHVibGljIEVudGl0eUl0ZXJhdG9ySW1wbChDdXJzb3IgY3Vyc29yLCBDb250ZW50UmVzb2x2ZXIgcmVzb2x2ZXIpIHsKKyAgICAgICAgICAgICAgICBzdXBlcihjdXJzb3IpOworICAgICAgICAgICAgICAgIG1SZXNvbHZlciA9IHJlc29sdmVyOworICAgICAgICAgICAgICAgIG1Qcm92aWRlciA9IG51bGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBFbnRpdHlJdGVyYXRvckltcGwoQ3Vyc29yIGN1cnNvciwgQ29udGVudFByb3ZpZGVyQ2xpZW50IHByb3ZpZGVyKSB7CisgICAgICAgICAgICAgICAgc3VwZXIoY3Vyc29yKTsKKyAgICAgICAgICAgICAgICBtUmVzb2x2ZXIgPSBudWxsOworICAgICAgICAgICAgICAgIG1Qcm92aWRlciA9IHByb3ZpZGVyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBFbnRpdHkgZ2V0RW50aXR5QW5kSW5jcmVtZW50Q3Vyc29yKEN1cnNvciBjdXJzb3IpIHRocm93cyBSZW1vdGVFeGNlcHRpb24geworICAgICAgICAgICAgICAgIC8vIHdlIGV4cGVjdCB0aGUgY3Vyc29yIGlzIGFscmVhZHkgYXQgdGhlIHJvdyB3ZSBuZWVkIHRvIHJlYWQgZnJvbQorICAgICAgICAgICAgICAgIGZpbmFsIGxvbmcgY2FsZW5kYXJJZCA9IGN1cnNvci5nZXRMb25nKGN1cnNvci5nZXRDb2x1bW5JbmRleE9yVGhyb3coX0lEKSk7CisKKyAgICAgICAgICAgICAgICAvLyBDcmVhdGUgdGhlIGNvbnRlbnQgdmFsdWUKKyAgICAgICAgICAgICAgICBDb250ZW50VmFsdWVzIGN2ID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKKyAgICAgICAgICAgICAgICBjdi5wdXQoX0lELCBjYWxlbmRhcklkKTsKKworICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29yU3RyaW5nVG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsIF9TWU5DX0FDQ09VTlQpOworICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29yU3RyaW5nVG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsIF9TWU5DX0FDQ09VTlRfVFlQRSk7CisKKyAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvclN0cmluZ1RvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LCBfU1lOQ19JRCk7CisgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JTdHJpbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgX1NZTkNfVkVSU0lPTik7CisgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JTdHJpbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgX1NZTkNfVElNRSk7CisgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JTdHJpbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgX1NZTkNfREFUQSk7CisgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JMb25nVG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsIF9TWU5DX0RJUlRZKTsKKyAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvckxvbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgX1NZTkNfTUFSSyk7CisKKyAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvclN0cmluZ1RvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LCBDYWxlbmRhcnMuU0VMRl9VUkwpOworICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29yU3RyaW5nVG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsCisgICAgICAgICAgICAgICAgICAgICAgICBDYWxlbmRhcnMuRURJVF9VUkwpOworICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29yU3RyaW5nVG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsCisgICAgICAgICAgICAgICAgICAgICAgICBDYWxlbmRhcnMuRVZFTlRTX1VSTCk7CisKKyAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvclN0cmluZ1RvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LCBDYWxlbmRhcnMuTkFNRSk7CisgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JTdHJpbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwKKyAgICAgICAgICAgICAgICAgICAgICAgIENhbGVuZGFycy5ESVNQTEFZX05BTUUpOworICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29ySW50VG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsIENhbGVuZGFycy5ISURERU4pOworICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29ySW50VG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsIENhbGVuZGFycy5DT0xPUik7CisgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JJbnRUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgQUNDRVNTX0xFVkVMKTsKKyAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvckludFRvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LCBTRUxFQ1RFRCk7CisgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JJbnRUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgU1lOQ19FVkVOVFMpOworICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29yU3RyaW5nVG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsIENhbGVuZGFycy5MT0NBVElPTik7CisgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JTdHJpbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgVElNRVpPTkUpOworICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29yU3RyaW5nVG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsCisgICAgICAgICAgICAgICAgICAgICAgICBDYWxlbmRhcnMuT1dORVJfQUNDT1VOVCk7CisgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JJbnRUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwKKyAgICAgICAgICAgICAgICAgICAgICAgIENhbGVuZGFycy5PUkdBTklaRVJfQ0FOX1JFU1BPTkQpOworCisgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JJbnRUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgREVMRVRFRCk7CisKKyAgICAgICAgICAgICAgICAvLyBDcmVhdGUgdGhlIEVudGl0eSBmcm9tIHRoZSBDb250ZW50VmFsdWUKKyAgICAgICAgICAgICAgICBFbnRpdHkgZW50aXR5ID0gbmV3IEVudGl0eShjdik7CisKKyAgICAgICAgICAgICAgICAvLyBTZXQgY3Vyc29yIHRvIG5leHQgcm93CisgICAgICAgICAgICAgICAgY3Vyc29yLm1vdmVUb05leHQoKTsKKworICAgICAgICAgICAgICAgIC8vIFJldHVybiB0aGUgY3JlYXRlZCBFbnRpdHkKKyAgICAgICAgICAgICAgICByZXR1cm4gZW50aXR5OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgIH0KKworICAgIC8qKgogICAgICAqIENvbnRhaW5zIGEgbGlzdCBvZiBhdmFpbGFibGUgY2FsZW5kYXJzLgogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ2FsZW5kYXJzIGltcGxlbWVudHMgQmFzZUNvbHVtbnMsIENhbGVuZGFyc0NvbHVtbnMKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIENhbGVuZGFycyBpbXBsZW1lbnRzIEJhc2VDb2x1bW5zLCBTeW5jQ29sdW1ucywgQWNjb3VudENvbHVtbnMsCisgICAgICAgICAgICBDYWxlbmRhcnNDb2x1bW5zCiAgICAgewogICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0hFUkVfREVMRVRFX0ZPUl9BQ0NPVU5UID0gQ2FsZW5kYXJzLl9TWU5DX0FDQ09VTlQgKyAiPT8iCiAgICAgICAgICAgICAgICAgKyAiIEFORCAiICsgQ2FsZW5kYXJzLl9TWU5DX0FDQ09VTlRfVFlQRSArICI9PyI7CkBAIC0yNTgsNiArMzYzLDI0IEBACiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVSTCA9ICJ1cmwiOwogCiAgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgVVJMIGZvciB0aGUgY2FsZW5kYXIgaXRzZWxmCisgICAgICAgICAqIDxQPlR5cGU6IFRFWFQgKFVSTCk8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRUxGX1VSTCA9ICJzZWxmVXJsIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIFVSTCBmb3IgdGhlIGNhbGVuZGFyIHRvIGJlIGVkaXRlZAorICAgICAgICAgKiA8UD5UeXBlOiBURVhUIChVUkwpPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRURJVF9VUkwgPSAiZWRpdFVybCI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBVUkwgZm9yIHRoZSBjYWxlbmRhciBldmVudHMKKyAgICAgICAgICogPFA+VHlwZTogVEVYVCAoVVJMKTwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVWRU5UU19VUkwgPSAiZXZlbnRzVXJsIjsKKworICAgICAgICAvKioKICAgICAgICAgICogVGhlIG5hbWUgb2YgdGhlIGNhbGVuZGFyCiAgICAgICAgICAqIDxQPlR5cGU6IFRFWFQ8L1A+CiAgICAgICAgICAqLwpAQCAtMjk2LDYgKzQxOSw5IEBACiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9SR0FOSVpFUl9DQU5fUkVTUE9ORCA9ICJvcmdhbml6ZXJDYW5SZXNwb25kIjsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBDb2x1bW5zIGZyb20gdGhlIEF0dGVuZGVlcyB0YWJsZSB0aGF0IG90aGVyIHRhYmxlcyBqb2luIGludG8gdGhlbXNlbHZlcy4KKyAgICAgKi8KICAgICBwdWJsaWMgaW50ZXJmYWNlIEF0dGVuZGVlc0NvbHVtbnMgewogCiAgICAgICAgIC8qKgpAQCAtMzYxLDggKzQ4Nyw3IEBACiAgICAgLyoqCiAgICAgICogQ29sdW1ucyBmcm9tIHRoZSBFdmVudHMgdGFibGUgdGhhdCBvdGhlciB0YWJsZXMgam9pbiBpbnRvIHRoZW1zZWx2ZXMuCiAgICAgICovCi0gICAgcHVibGljIGludGVyZmFjZSBFdmVudHNDb2x1bW5zCi0gICAgeworICAgIHB1YmxpYyBpbnRlcmZhY2UgRXZlbnRzQ29sdW1ucyB7CiAgICAgICAgIC8qKgogICAgICAgICAgKiBUaGUgY2FsZW5kYXIgdGhlIGV2ZW50IGJlbG9uZ3MgdG8KICAgICAgICAgICogPFA+VHlwZTogSU5URUdFUiAoZm9yZWlnbiBrZXkgdG8gdGhlIENhbGVuZGFycyB0YWJsZSk8L1A+CkBAIC00MzgsNiArNTYzLDE4IEBACiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERURU5EID0gImR0ZW5kIjsKIAogICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHRpbWUgdGhlIGV2ZW50IHN0YXJ0cyB3aXRoIGFsbERheSBldmVudHMgaW4gYSBsb2NhbCB0egorICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSIChsb25nOyBtaWxsaXMgc2luY2UgZXBvY2gpPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFRTVEFSVDIgPSAiZHRzdGFydDIiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgdGltZSB0aGUgZXZlbnQgZW5kcyB3aXRoIGFsbERheSBldmVudHMgaW4gYSBsb2NhbCB0egorICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSIChsb25nOyBtaWxsaXMgc2luY2UgZXBvY2gpPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFRFTkQyID0gImR0ZW5kMiI7CisKKyAgICAgICAgLyoqCiAgICAgICAgICAqIFRoZSBkdXJhdGlvbiBvZiB0aGUgZXZlbnQKICAgICAgICAgICogPFA+VHlwZTogVEVYVCAoZHVyYXRpb24gaW4gUkZDMjQ0NSBmb3JtYXQpPC9QPgogICAgICAgICAgKi8KQEAgLTQ1MCw2ICs1ODcsMTIgQEAKICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVZFTlRfVElNRVpPTkUgPSAiZXZlbnRUaW1lem9uZSI7CiAKICAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSB0aW1lem9uZSBmb3IgdGhlIGV2ZW50LCBhbGxEYXkgZXZlbnRzIHdpbGwgaGF2ZSBhIGxvY2FsIHR6IGluc3RlYWQgb2YgVVRDCisgICAgICAgICAqIDxQPlR5cGU6IFRFWFQKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVWRU5UX1RJTUVaT05FMiA9ICJldmVudFRpbWV6b25lMiI7CisKKyAgICAgICAgLyoqCiAgICAgICAgICAqIFdoZXRoZXIgdGhlIGV2ZW50IGxhc3RzIGFsbCBkYXkgb3Igbm90CiAgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVIgKGJvb2xlYW4pPC9QPgogICAgICAgICAgKi8KQEAgLTU5OCw3ICs3NDEsOCBAQAogICAgIC8qKgogICAgICAqIENvbnRhaW5zIG9uZSBlbnRyeSBwZXIgY2FsZW5kYXIgZXZlbnQuIFJlY3VycmluZyBldmVudHMgc2hvdyB1cCBhcyBhIHNpbmdsZSBlbnRyeS4KICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEV2ZW50c0VudGl0eSBpbXBsZW1lbnRzIEJhc2VDb2x1bW5zLCBFdmVudHNDb2x1bW5zLCBDYWxlbmRhcnNDb2x1bW5zIHsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEV2ZW50c0VudGl0eSBpbXBsZW1lbnRzIEJhc2VDb2x1bW5zLCBTeW5jQ29sdW1ucywgQWNjb3VudENvbHVtbnMsCisgICAgICAgICAgICBFdmVudHNDb2x1bW5zIHsKICAgICAgICAgLyoqCiAgICAgICAgICAqIFRoZSBjb250ZW50Oi8vIHN0eWxlIFVSTCBmb3IgdGhpcyB0YWJsZQogICAgICAgICAgKi8KQEAgLTcwMyw4ICs4NDcsOSBAQAogICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29yU3RyaW5nVG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsIF9TWU5DX0RBVEEpOwogICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29yTG9uZ1RvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LCBfU1lOQ19ESVJUWSk7CiAgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JTdHJpbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgX1NZTkNfVkVSU0lPTik7Ci0gICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JJbnRUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgREVMRVRFRCk7Ci0gICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JTdHJpbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgQ2FsZW5kYXJzLlVSTCk7CisgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JJbnRUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgRXZlbnRzQ29sdW1ucy5ERUxFVEVEKTsKKyAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvclN0cmluZ1RvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LAorICAgICAgICAgICAgICAgICAgICAgICAgQ2FsZW5kYXJzLkVWRU5UU19VUkwpOwogCiAgICAgICAgICAgICAgICAgRW50aXR5IGVudGl0eSA9IG5ldyBFbnRpdHkoY3YpOwogICAgICAgICAgICAgICAgIEN1cnNvciBzdWJDdXJzb3I7CkBAIC03OTUsNyArOTQwLDggQEAKICAgICAvKioKICAgICAgKiBDb250YWlucyBvbmUgZW50cnkgcGVyIGNhbGVuZGFyIGV2ZW50LiBSZWN1cnJpbmcgZXZlbnRzIHNob3cgdXAgYXMgYSBzaW5nbGUgZW50cnkuCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBFdmVudHMgaW1wbGVtZW50cyBCYXNlQ29sdW1ucywgRXZlbnRzQ29sdW1ucywgQ2FsZW5kYXJzQ29sdW1ucyB7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBFdmVudHMgaW1wbGVtZW50cyBCYXNlQ29sdW1ucywgU3luY0NvbHVtbnMsIEFjY291bnRDb2x1bW5zLAorICAgICAgICAgICAgRXZlbnRzQ29sdW1ucyB7CiAKICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gRkVUQ0hfRU5UUllfQ09MVU1OUyA9CiAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsgRXZlbnRzLl9TWU5DX0FDQ09VTlQsIEV2ZW50cy5fU1lOQ19JRCB9OwpAQCAtOTgxLDcgKzExMjcsNyBAQAogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVhfRVZFTlREQVlTID0gIm1heEV2ZW50RGF5cyI7CiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBDYWxlbmRhck1ldGFEYXRhIGltcGxlbWVudHMgQ2FsZW5kYXJNZXRhRGF0YUNvbHVtbnMgeworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgQ2FsZW5kYXJNZXRhRGF0YSBpbXBsZW1lbnRzIENhbGVuZGFyTWV0YURhdGFDb2x1bW5zLCBCYXNlQ29sdW1ucyB7CiAgICAgfQogCiAgICAgcHVibGljIGludGVyZmFjZSBFdmVudERheXNDb2x1bW5zIHsKQEAgLTEzNzksNCArMTUyNSw0MyBAQAogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVyaSBDT05URU5UX1VSSSA9CiAgICAgICAgICAgICAgICAgVXJpLndpdGhBcHBlbmRlZFBhdGgoQ2FsZW5kYXIuQ09OVEVOVF9VUkksIENPTlRFTlRfRElSRUNUT1JZKTsKICAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb2x1bW5zIGZyb20gdGhlIEV2ZW50c1Jhd1RpbWVzIHRhYmxlCisgICAgICovCisgICAgcHVibGljIGludGVyZmFjZSBFdmVudHNSYXdUaW1lc0NvbHVtbnMgeworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGNvcnJlc3BvbmRpbmcgZXZlbnQgaWQKKyAgICAgICAgICogPFA+VHlwZTogSU5URUdFUiAobG9uZyk8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFVkVOVF9JRCA9ICJldmVudF9pZCI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBSRkMyNDQ1IGNvbXBsaWFudCB0aW1lIHRoZSBldmVudCBzdGFydHMKKyAgICAgICAgICogPFA+VHlwZTogVEVYVDwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERUU1RBUlRfMjQ0NSA9ICJkdHN0YXJ0MjQ0NSI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBSRkMyNDQ1IGNvbXBsaWFudCB0aW1lIHRoZSBldmVudCBlbmRzCisgICAgICAgICAqIDxQPlR5cGU6IFRFWFQ8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEVEVORF8yNDQ1ID0gImR0ZW5kMjQ0NSI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBSRkMyNDQ1IGNvbXBsaWFudCBvcmlnaW5hbCBpbnN0YW5jZSB0aW1lIG9mIHRoZSByZWN1cnJpbmcgZXZlbnQgZm9yIHdoaWNoIHRoaXMKKyAgICAgICAgICogZXZlbnQgaXMgYW4gZXhjZXB0aW9uLgorICAgICAgICAgKiA8UD5UeXBlOiBURVhUPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1JJR0lOQUxfSU5TVEFOQ0VfVElNRV8yNDQ1ID0gIm9yaWdpbmFsSW5zdGFuY2VUaW1lMjQ0NSI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBSRkMyNDQ1IGNvbXBsaWFudCBsYXN0IGRhdGUgdGhpcyBldmVudCByZXBlYXRzIG9uLCBvciBOVUxMIGlmIGl0IG5ldmVyIGVuZHMKKyAgICAgICAgICogPFA+VHlwZTogVEVYVDwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExBU1RfREFURV8yNDQ1ID0gImxhc3REYXRlMjQ0NSI7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBFdmVudHNSYXdUaW1lcyBpbXBsZW1lbnRzIEJhc2VDb2x1bW5zLCBFdmVudHNSYXdUaW1lc0NvbHVtbnMgeworICAgIH0KIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3Byb3ZpZGVyL0NvbnRhY3RzQ29udHJhY3QuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3Byb3ZpZGVyL0NvbnRhY3RzQ29udHJhY3QuamF2YQppbmRleCA0MGE0MDhhLi4yMThmMjFjIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9wcm92aWRlci9Db250YWN0c0NvbnRyYWN0LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvcHJvdmlkZXIvQ29udGFjdHNDb250cmFjdC5qYXZhCkBAIC0xMzAsNiArMTMwLDE3IEBACiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVRVUVTVElOR19QQUNLQUdFX1BBUkFNX0tFWSA9ICJyZXF1ZXN0aW5nX3BhY2thZ2UiOwogCiAgICAgLyoqCisgICAgICogUXVlcnkgcGFyYW1ldGVyIHRoYXQgc2hvdWxkIGJlIHVzZWQgYnkgdGhlIGNsaWVudCB0byBhY2Nlc3MgYSBzcGVjaWZpYworICAgICAqIHtAbGluayBEaXJlY3Rvcnl9LiBUaGUgcGFyYW1ldGVyIHZhbHVlIHNob3VsZCBiZSB0aGUgX0lEIG9mIHRoZSBjb3JyZXNwb25kaW5nCisgICAgICogZGlyZWN0b3J5LCBlLmcuCisgICAgICoge0Bjb2RlIGNvbnRlbnQ6Ly9jb20uYW5kcm9pZC5jb250YWN0cy9kYXRhL2VtYWlscy9maWx0ZXIvYWNtZT9kaXJlY3Rvcnk9M30KKyAgICAgKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElSRUNUT1JZX1BBUkFNX0tFWSA9ICJkaXJlY3RvcnkiOworCisKKyAgICAvKioKICAgICAgKiBAaGlkZQogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgUHJlZmVyZW5jZXMgewpAQCAtMTgxLDYgKzE5MiwyMjcgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBBIERpcmVjdG9yeSByZXByZXNlbnRzIGEgY29udGFjdHMgY29ycHVzLCBlLmcuIExvY2FsIGNvbnRhY3RzLAorICAgICAqIEdvb2dsZSBBcHBzIEdsb2JhbCBBZGRyZXNzIExpc3Qgb3IgQ29ycG9yYXRlIEdsb2JhbCBBZGRyZXNzIExpc3QuCisgICAgICogPHA+CisgICAgICogQSBEaXJlY3RvcnkgaXMgaW1wbGVtZW50ZWQgYXMgYSBjb250ZW50IHByb3ZpZGVyIHdpdGggaXRzIHVuaXF1ZSBhdXRob3JpdHkgYW5kCisgICAgICogdGhlIHNhbWUgQVBJIGFzIHRoZSBtYWluIENvbnRhY3RzIFByb3ZpZGVyLiAgSG93ZXZlciwgdGhlcmUgaXMgbm8gZXhwZWN0YXRpb24gdGhhdAorICAgICAqIGV2ZXJ5IGRpcmVjdG9yeSBwcm92aWRlciB3aWxsIGltcGxlbWVudCB0aGlzIENvbnRyYWN0IGluIGl0cyBlbnRpcmV0eS4gIElmIGEKKyAgICAgKiBkaXJlY3RvcnkgcHJvdmlkZXIgZG9lcyBub3QgaGF2ZSBhbiBpbXBsZW1lbnRhdGlvbiBmb3IgYSBzcGVjaWZpYyByZXF1ZXN0LCBpdAorICAgICAqIHNob3VsZCB0aHJvdyBhbiBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbi4KKyAgICAgKiA8L3A+CisgICAgICogPHA+CisgICAgICogVGhlIG1vc3QgaW1wb3J0YW50IHVzZSBjYXNlIGZvciBEaXJlY3RvcmllcyBpcyBzZWFyY2guICBBIERpcmVjdG9yeSBwcm92aWRlciBpcworICAgICAqIGV4cGVjdGVkIHRvIHN1cHBvcnQgYXQgbGVhc3Qge0BsaW5rIENvbnRhY3RzI0NPTlRFTlRfRklMVEVSX1VSSQorICAgICAqIENvbnRhY3RzI0NPTlRFTlRfRklMVEVSX1VSSX0uICBJZiBhIERpcmVjdG9yeSBwcm92aWRlciB3YW50cyB0byBwYXJ0aWNpcGF0ZQorICAgICAqIGluIGVtYWlsIGFuZCBwaG9uZSBsb29rdXAgZnVuY3Rpb25hbGl0aWVzLCBpdCBzaG91bGQgYWxzbyBpbXBsZW1lbnQKKyAgICAgKiB7QGxpbmsgQ29tbW9uRGF0YUtpbmRzLkVtYWlsI0NPTlRFTlRfRklMVEVSX1VSSSBDb21tb25EYXRhS2luZHMuRW1haWwuQ09OVEVOVF9GSUxURVJfVVJJfQorICAgICAqIGFuZAorICAgICAqIHtAbGluayBDb21tb25EYXRhS2luZHMuUGhvbmUjQ09OVEVOVF9GSUxURVJfVVJJIENvbW1vbkRhdGFLaW5kcy5QaG9uZS5DT05URU5UX0ZJTFRFUl9VUkl9LgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBBIGRpcmVjdG9yeSBwcm92aWRlciBzaG91bGQgcmV0dXJuIE5VTEwgZm9yIGV2ZXJ5IHByb2plY3Rpb24gZmllbGQgaXQgZG9lcyBub3QKKyAgICAgKiByZWNvZ25pemUsIHJhdGhlciB0aGFuIHRocm93aW5nIGFuIGV4Y2VwdGlvbi4gIFRoaXMgd2F5IGl0IHdpbGwgbm90IGJlIGJyb2tlbgorICAgICAqIGlmIENvbnRhY3RzQ29udHJhY3QgaXMgZXh0ZW5kZWQgd2l0aCBuZXcgZmllbGRzIGluIHRoZSBmdXR1cmUuCisgICAgICogPC9wPgorICAgICAqIDxwPgorICAgICAqIFRoZSBjbGllbnQgaW50ZXJhY3RzIHdpdGggYSBkaXJlY3RvcnkgdmlhIENvbnRhY3RzIFByb3ZpZGVyIGJ5IHN1cHBseWluZyBhbgorICAgICAqIG9wdGlvbmFsIHtAY29kZSBkaXJlY3Rvcnk9fSBxdWVyeSBwYXJhbWV0ZXIuCisgICAgICogPHA+CisgICAgICogPHA+CisgICAgICogV2hlbiB0aGUgQ29udGFjdHMgUHJvdmlkZXIgcmVjZWl2ZXMgdGhlIHJlcXVlc3QsIGl0IHRyYW5zZm9ybXMgdGhlIFVSSSBhbmQgZm9yd2FyZHMKKyAgICAgKiB0aGUgcmVxdWVzdCB0byB0aGUgY29ycmVzcG9uZGluZyBkaXJlY3RvcnkgY29udGVudCBwcm92aWRlci4KKyAgICAgKiBUaGUgVVJJIGlzIHRyYW5zZm9ybWVkIGluIHRoZSBmb2xsb3dpbmcgZmFzaGlvbjoKKyAgICAgKiA8dWw+CisgICAgICogPGxpPlRoZSBVUkkgYXV0aG9yaXR5IGlzIHJlcGxhY2VkIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcge0BsaW5rICNESVJFQ1RPUllfQVVUSE9SSVRZfS48L2xpPgorICAgICAqIDxsaT5UaGUge0Bjb2RlIGFjY291bnROYW1lPX0gYW5kIHtAY29kZSBhY2NvdW50VHlwZT19IHBhcmFtZXRlcnMgYXJlIGFkZGVkIG9yCisgICAgICogcmVwbGFjZWQgdXNpbmcgdGhlIGNvcnJlc3BvbmRpbmcge0BsaW5rICNBQ0NPVU5UX1RZUEV9IGFuZCB7QGxpbmsgI0FDQ09VTlRfTkFNRX0gdmFsdWVzLjwvbGk+CisgICAgICogPGxpPklmIHRoZSBVUkkgaXMgbWlzc2luZyBhIHtAbGluayBDb250YWN0c0NvbnRyYWN0I1JFUVVFU1RJTkdfUEFDS0FHRV9QQVJBTV9LRVl9CisgICAgICogcGFyYW1ldGVyLCB0aGlzIHBhcmFtZXRlciBpcyBhZGRlZC48L2xpPgorICAgICAqIDwvdWw+CisgICAgICogPC9wPgorICAgICAqIDxwPgorICAgICAqIENsaWVudHMgc2hvdWxkIHNlbmQgZGlyZWN0b3J5IHJlcXVlc3RzIHRvIENvbnRhY3RzIFByb3ZpZGVyIGFuZCBsZXQgaXQKKyAgICAgKiBmb3J3YXJkIHRoZW0gdG8gdGhlIHJlc3BlY3RpdmUgcHJvdmlkZXJzIHJhdGhlciB0aGFuIGNvbnN0cnVjdGluZyBkaXJlY3RvcnkgcHJvdmlkZXIKKyAgICAgKiBVUklzIGJ5IHRoZW1zZWx2ZXMuICBUaGlzIGxldmVsIG9mIGluZGlyZWN0aW9uIGFsbG93cyBDb250YWN0cyBQcm92aWRlciB0bworICAgICAqIGltcGxlbWVudCBhZGRpdGlvbmFsIHN5c3RlbS1sZXZlbCBmZWF0dXJlcyBhbmQgb3B0aW1pemF0aW9ucy4KKyAgICAgKiBBbHNvLCBkaXJlY3RvcnkgcHJvdmlkZXJzIG1heSByZWplY3QgcmVxdWVzdHMgY29taW5nIGZyb20gb3RoZXIKKyAgICAgKiBjbGllbnRzIHRoYW4gdGhlIENvbnRhY3RzIFByb3ZpZGVyIGl0c2VsZi4KKyAgICAgKiA8L3A+CisgICAgICogPHA+CisgICAgICogVGhlIERpcmVjdG9yeSB0YWJsZSBhbHdheXMgaGFzIGF0IGxlYXN0IHRoZXNlIHR3byByb3dzOgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+CisgICAgICogVGhlIGxvY2FsIGRpcmVjdG9yeS4gSXQgaGFzIHtAbGluayBEaXJlY3RvcnkjX0lEIERpcmVjdG9yeS5fSUR9ID0KKyAgICAgKiB7QGxpbmsgRGlyZWN0b3J5I0RFRkFVTFQgRGlyZWN0b3J5LkRFRkFVTFR9LiBUaGlzIGRpcmVjdG9yeSBjYW4gYmUgdXNlZCB0byBhY2Nlc3MgbG9jYWxseQorICAgICAqIHN0b3JlZCBjb250YWN0cy4gVGhlIHNhbWUgY2FuIGJlIGFjaGlldmVkIGJ5IG9taXR0aW5nIHRoZSB7QGNvZGUgZGlyZWN0b3J5PX0KKyAgICAgKiBwYXJhbWV0ZXIgYWx0b2dldGhlci4KKyAgICAgKiA8L2xpPgorICAgICAqIDxsaT4KKyAgICAgKiBUaGUgbG9jYWwgaW52aXNpYmxlIGNvbnRhY3RzLiBUaGUgY29ycmVzcG9uZGluZyBkaXJlY3RvcnkgSUQgaXMKKyAgICAgKiB7QGxpbmsgRGlyZWN0b3J5I0xPQ0FMX0lOVklTSUJMRSBEaXJlY3RvcnkuTE9DQUxfSU5WSVNJQkxFfS4KKyAgICAgKiA8L2xpPgorICAgICAqIDwvdWw+CisgICAgICogPC9wPgorICAgICAqIDxwPgorICAgICAqIE90aGVyIGRpcmVjdG9yaWVzIHNob3VsZCByZWdpc3RlciB0aGVtc2VsdmVzIGJ5IGV4cGxpY2l0bHkgYWRkaW5nIHJvd3MgdG8gdGhpcyB0YWJsZS4KKyAgICAgKiA8L3A+CisgICAgICogPHA+CisgICAgICogV2hlbiBhIHJvdyBpcyBpbnNlcnRlZCBpbiB0aGlzIHRhYmxlLCBpdCBpcyBhdXRvbWF0aWNhbGx5IGFzc29jaWF0ZWQgd2l0aCB0aGUgcGFja2FnZQorICAgICAqIChhcGspIHRoYXQgbWFkZSB0aGUgcmVxdWVzdC4gIElmIHRoZSBwYWNrYWdlIGlzIGxhdGVyIHVuaW5zdGFsbGVkLCBhbGwgZGlyZWN0b3J5IHJvd3MKKyAgICAgKiBpdCBpbnNlcnRlZCBhcmUgYXV0b21hdGljYWxseSByZW1vdmVkLgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBBIGRpcmVjdG9yeSByb3cgY2FuIGJlIG9wdGlvbmFsbHkgYXNzb2NpYXRlZCB3aXRoIGFuIGFjY291bnQuCisgICAgICogSWYgdGhlIGFjY291bnQgaXMgbGF0ZXIgcmVtb3ZlZCwgdGhlIGNvcnJlc3BvbmRpbmcgZGlyZWN0b3J5IHJvd3MgYXJlCisgICAgICogYXV0b21hdGljYWxseSByZW1vdmVkLgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBEaXJlY3RvcnkgaW1wbGVtZW50cyBCYXNlQ29sdW1ucyB7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIE5vdCBpbnN0YW50aWFibGUuCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIERpcmVjdG9yeSgpIHsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgY29udGVudDovLyBzdHlsZSBVUkkgZm9yIHRoaXMgdGFibGUuICBSZXF1ZXN0cyB0byB0aGlzIFVSSSBjYW4gYmUKKyAgICAgICAgICogcGVyZm9ybWVkIG9uIHRoZSBVSSB0aHJlYWQgYmVjYXVzZSB0aGV5IGFyZSBhbHdheXMgdW5ibG9ja2luZy4KKyAgICAgICAgICoKKyAgICAgICAgICogQGhpZGUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVXJpIENPTlRFTlRfVVJJID0KKyAgICAgICAgICAgICAgICBVcmkud2l0aEFwcGVuZGVkUGF0aChBVVRIT1JJVFlfVVJJLCAiZGlyZWN0b3JpZXMiKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIE1JTUUtdHlwZSBvZiB7QGxpbmsgI0NPTlRFTlRfVVJJfSBwcm92aWRpbmcgYSBkaXJlY3Rvcnkgb2YKKyAgICAgICAgICogY29udGFjdCBkaXJlY3Rvcmllcy4KKyAgICAgICAgICoKKyAgICAgICAgICogQGhpZGUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFTlRfVFlQRSA9CisgICAgICAgICAgICAgICAgInZuZC5hbmRyb2lkLmN1cnNvci5kaXIvY29udGFjdF9kaXJlY3RvcmllcyI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBNSU1FIHR5cGUgb2YgYSB7QGxpbmsgI0NPTlRFTlRfVVJJfSBpdGVtLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVOVF9JVEVNX1RZUEUgPQorICAgICAgICAgICAgICAgICJ2bmQuYW5kcm9pZC5jdXJzb3IuaXRlbS9jb250YWN0X2RpcmVjdG9yeSI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBuYW1lIG9mIHRoZSBwYWNrYWdlIHRoYXQgb3ducyB0aGlzIGRpcmVjdG9yeS4gVGhpcyBmaWVsZCBpcworICAgICAgICAgKiByZXF1aXJlZCBpbiBhbiBpbnNlcnQgcmVxdWVzdCBhbmQgbXVzdCBtYXRjaCB0aGUgbmFtZSBvZiB0aGUgcGFja2FnZQorICAgICAgICAgKiBtYWtpbmcgdGhlIHJlcXVlc3QuIElmIHRoZSBwYWNrYWdlIGlzIGxhdGVyIHVuaW5zdGFsbGVkLCB0aGUKKyAgICAgICAgICogZGlyZWN0b3JpZXMgaXQgb3ducyBhcmUgYXV0b21hdGljYWxseSByZW1vdmVkIGZyb20gdGhpcyB0YWJsZS4gT25seQorICAgICAgICAgKiB0aGUgc3BlY2lmaWVkIHBhY2thZ2UgaXMgYWxsb3dlZCB0byBtb2RpZnkgb3IgZGVsZXRlIHRoaXMgcm93IGxhdGVyLgorICAgICAgICAgKgorICAgICAgICAgKiA8cD5UWVBFOiBURVhUPC9wPgorICAgICAgICAgKgorICAgICAgICAgKiBAaGlkZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFDS0FHRV9OQU1FID0gInBhY2thZ2VOYW1lIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHR5cGUgb2YgZGlyZWN0b3J5IGNhcHR1cmVkIGFzIGEgcmVzb3VyY2UgSUQgaW4gdGhlIGNvbnRleHQgb2YgdGhlCisgICAgICAgICAqIHBhY2thZ2Uge0BsaW5rICNQQUNLQUdFX05BTUV9LCBlLmcuICJDb3Jwb3JhdGUgRGlyZWN0b3J5IgorICAgICAgICAgKgorICAgICAgICAgKiA8cD5UWVBFOiBJTlRFR0VSPC9wPgorICAgICAgICAgKgorICAgICAgICAgKiBAaGlkZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9SRVNPVVJDRV9JRCA9ICJ0eXBlUmVzb3VyY2VJZCI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFuIG9wdGlvbmFsIG5hbWUgdGhhdCBjYW4gYmUgdXNlZCBpbiB0aGUgVUkgdG8gcmVwcmVzZW50IHRoaXMgZGlyZWN0b3J5LAorICAgICAgICAgKiBlLmcuICJBY21lIENvcnAiCisgICAgICAgICAqIDxwPlRZUEU6IHRleHQ8L3A+CisgICAgICAgICAqCisgICAgICAgICAqIEBoaWRlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVNQTEFZX05BTUUgPSAiZGlzcGxheU5hbWUiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgYXV0aG9yaXR5IHRvIHdoaWNoIHRoZSByZXF1ZXN0IHNob3VsZCBmb3J3YXJkZWQgaW4gb3JkZXIgdG8gYWNjZXNzCisgICAgICAgICAqIHRoaXMgZGlyZWN0b3J5LgorICAgICAgICAgKgorICAgICAgICAgKiA8cD5UWVBFOiB0ZXh0PC9wPgorICAgICAgICAgKgorICAgICAgICAgKiBAaGlkZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElSRUNUT1JZX0FVVEhPUklUWSA9ICJhdXRob3JpdHkiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgYWNjb3VudCB0eXBlIHdoaWNoIHRoaXMgZGlyZWN0b3J5IGlzIGFzc29jaWF0ZWQuCisgICAgICAgICAqCisgICAgICAgICAqIDxwPlRZUEU6IHRleHQ8L3A+CisgICAgICAgICAqCisgICAgICAgICAqIEBoaWRlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ0NPVU5UX1RZUEUgPSAiYWNjb3VudFR5cGUiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgYWNjb3VudCB3aXRoIHdoaWNoIHRoaXMgZGlyZWN0b3J5IGlzIGFzc29jaWF0ZWQuIElmIHRoZSBhY2NvdW50IGlzIGxhdGVyCisgICAgICAgICAqIHJlbW92ZWQsIHRoZSBkaXJlY3RvcmllcyBpdCBvd25zIGFyZSBhdXRvbWF0aWNhbGx5IHJlbW92ZWQgZnJvbSB0aGlzIHRhYmxlLgorICAgICAgICAgKgorICAgICAgICAgKiA8cD5UWVBFOiB0ZXh0PC9wPgorICAgICAgICAgKgorICAgICAgICAgKiBAaGlkZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNDT1VOVF9OQU1FID0gImFjY291bnROYW1lIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogT25lIG9mIHtAbGluayAjRVhQT1JUX1NVUFBPUlRfTk9ORX0sIHtAbGluayAjRVhQT1JUX1NVUFBPUlRfQU5ZX0FDQ09VTlR9LAorICAgICAgICAgKiB7QGxpbmsgI0VYUE9SVF9TVVBQT1JUX1NBTUVfQUNDT1VOVF9PTkxZfS4gVGhpcyBpcyB0aGUgZXhwZWN0YXRpb24gdGhlCisgICAgICAgICAqIGRpcmVjdG9yeSBoYXMgZm9yIGRhdGEgZXhwb3J0ZWQgZnJvbSBpdC4gIENsaWVudHMgbXVzdCBvYmV5IHRoaXMgc2V0dGluZy4KKyAgICAgICAgICoKKyAgICAgICAgICogQGhpZGUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYUE9SVF9TVVBQT1JUID0gImV4cG9ydFN1cHBvcnQiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBBbiB7QGxpbmsgI0VYUE9SVF9TVVBQT1JUfSBzZXR0aW5nIHRoYXQgaW5kaWNhdGVzIHRoYXQgdGhlIGRpcmVjdG9yeQorICAgICAgICAgKiBkb2VzIG5vdCBhbGxvdyBhbnkgZGF0YSB0byBiZSBjb3BpZWQgb3V0IG9mIGl0LgorICAgICAgICAgKgorICAgICAgICAgKiBAaGlkZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVhQT1JUX1NVUFBPUlRfTk9ORSA9IDA7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFuIHtAbGluayAjRVhQT1JUX1NVUFBPUlR9IHNldHRpbmcgdGhhdCBpbmRpY2F0ZXMgdGhhdCB0aGUgZGlyZWN0b3J5CisgICAgICAgICAqIGFsbG93IGl0cyBkYXRhIGNvcGllZCBvbmx5IHRvIHRoZSBhY2NvdW50IHNwZWNpZmllZCBieQorICAgICAgICAgKiB7QGxpbmsgI0FDQ09VTlRfVFlQRX0ve0BsaW5rICNBQ0NPVU5UX05BTUV9LgorICAgICAgICAgKgorICAgICAgICAgKiBAaGlkZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVhQT1JUX1NVUFBPUlRfU0FNRV9BQ0NPVU5UX09OTFkgPSAxOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBBbiB7QGxpbmsgI0VYUE9SVF9TVVBQT1JUfSBzZXR0aW5nIHRoYXQgaW5kaWNhdGVzIHRoYXQgdGhlIGRpcmVjdG9yeQorICAgICAgICAgKiBhbGxvdyBpdHMgZGF0YSBjb3BpZWQgdG8gYW55IGNvbnRhY3RzIGFjY291bnQuCisgICAgICAgICAqCisgICAgICAgICAqIEBoaWRlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFWFBPUlRfU1VQUE9SVF9BTllfQUNDT1VOVCA9IDI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIF9JRCBvZiB0aGUgZGVmYXVsdCBkaXJlY3RvcnksIHdoaWNoIHJlcHJlc2VudHMgbG9jYWxseSBzdG9yZWQgY29udGFjdHMuCisgICAgICAgICAqCisgICAgICAgICAqIEBoaWRlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgREVGQVVMVCA9IDA7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIF9JRCBvZiB0aGUgZGlyZWN0b3J5IHRoYXQgcmVwcmVzZW50cyBsb2NhbGx5IHN0b3JlZCBpbnZpc2libGUgY29udGFjdHMuCisgICAgICAgICAqCisgICAgICAgICAqIEBoaWRlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgTE9DQUxfSU5WSVNJQkxFID0gMTsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBAaGlkZSBzaG91bGQgYmUgcmVtb3ZlZCB3aGVuIHVzZXJzIGFyZSB1cGRhdGVkIHRvIHJlZmVyIHRvIFN5bmNTdGF0ZQogICAgICAqIEBkZXByZWNhdGVkIHVzZSBTeW5jU3RhdGUgaW5zdGVhZAogICAgICAqLwpAQCAtNDkwMiw2ICs1MTM0LDIzIEBACiAgICAgICAgICAqIFR5cGU6IElOVEVHRVIgKGJvb2xlYW4pCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTSE9VTERfU1lOQyA9ICJzaG91bGRfc3luYyI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFueSBuZXdseSBjcmVhdGVkIGNvbnRhY3RzIHdpbGwgYXV0b21hdGljYWxseSBiZSBhZGRlZCB0byBncm91cHMgdGhhdCBoYXZlIHRoaXMKKyAgICAgICAgICogZmxhZyBzZXQgdG8gdHJ1ZS4KKyAgICAgICAgICogPHA+CisgICAgICAgICAqIFR5cGU6IElOVEVHRVIgKGJvb2xlYW4pCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVVRPX0FERCA9ICJhdXRvX2FkZCI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFdoZW4gYSBjb250YWN0cyBpcyBtYXJrZWQgYXMgYSBmYXZvcml0ZXMgaXQgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGFkZGVkCisgICAgICAgICAqIHRvIHRoZSBncm91cHMgdGhhdCBoYXZlIHRoaXMgZmxhZyBzZXQsIGFuZCB3aGVuIGl0IGlzIHJlbW92ZWQgZnJvbSBmYXZvcml0ZXMKKyAgICAgICAgICogaXQgd2lsbCBiZSByZW1vdmVkIGZyb20gdGhlc2UgZ3JvdXBzLgorICAgICAgICAgKiA8cD4KKyAgICAgICAgICogVHlwZTogSU5URUdFUiAoYm9vbGVhbikKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZBVk9SSVRFUyA9ICJmYXZvcml0ZXMiOwogICAgIH0KIAogICAgIC8qKgpAQCAtNTA0Miw2ICs1MjkxLDggQEAKICAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvckxvbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCB2YWx1ZXMsIERFTEVURUQpOwogICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29yU3RyaW5nVG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgdmFsdWVzLCBOT1RFUyk7CiAgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JTdHJpbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCB2YWx1ZXMsIFNIT1VMRF9TWU5DKTsKKyAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvclN0cmluZ1RvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIHZhbHVlcywgRkFWT1JJVEVTKTsKKyAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvclN0cmluZ1RvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIHZhbHVlcywgQVVUT19BREQpOwogICAgICAgICAgICAgICAgIGN1cnNvci5tb3ZlVG9OZXh0KCk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBFbnRpdHkodmFsdWVzKTsKICAgICAgICAgICAgIH0KQEAgLTU1NTgsNiArNTgwOSwyOCBAQAogICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5jb250YWN0cy5hY3Rpb24uU0hPV19PUl9DUkVBVEVfQ09OVEFDVCI7CiAKICAgICAgICAgLyoqCisgICAgICAgICAqIFN0YXJ0cyBhbiBBY3Rpdml0eSB0aGF0IGxldHMgdGhlIHVzZXIgc2VsZWN0IHRoZSBtdWx0aXBsZSBwaG9uZXMgZnJvbSBhCisgICAgICAgICAqIGxpc3Qgb2YgcGhvbmUgbnVtYmVycyB3aGljaCBjb21lIGZyb20gdGhlIGNvbnRhY3RzIG9yCisgICAgICAgICAqIHtAbGluayAjRVhUUkFfUEhPTkVfVVJJU30uCisgICAgICAgICAqIDxwPgorICAgICAgICAgKiBUaGUgcGhvbmUgbnVtYmVycyBiZWluZyBwYXNzZWQgaW4gdGhyb3VnaCB7QGxpbmsgI0VYVFJBX1BIT05FX1VSSVN9CisgICAgICAgICAqIGNvdWxkIGJlbG9uZyB0byB0aGUgY29udGFjdHMgb3Igbm90LCBhbmQgd2lsbCBiZSBzZWxlY3RlZCBieSBkZWZhdWx0LgorICAgICAgICAgKiA8cD4KKyAgICAgICAgICogVGhlIHVzZXIncyBzZWxlY3Rpb24gd2lsbCBiZSByZXR1cm5lZCBmcm9tCisgICAgICAgICAqIHtAbGluayBhbmRyb2lkLmFwcC5BY3Rpdml0eSNvbkFjdGl2aXR5UmVzdWx0KGludCwgaW50LCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50KX0KKyAgICAgICAgICogaWYgdGhlIHJlc3VsdENvZGUgaXMKKyAgICAgICAgICoge0BsaW5rIGFuZHJvaWQuYXBwLkFjdGl2aXR5I1JFU1VMVF9PS30sIHRoZSBhcnJheSBvZiBwaWNrZWQgcGhvbmUKKyAgICAgICAgICogbnVtYmVycyBhcmUgaW4gdGhlIEludGVudCdzCisgICAgICAgICAqIHtAbGluayAjRVhUUkFfUEhPTkVfVVJJU307IG90aGVyd2lzZSwgdGhlCisgICAgICAgICAqIHtAbGluayBhbmRyb2lkLmFwcC5BY3Rpdml0eSNSRVNVTFRfQ0FOQ0VMRUR9IGlzIHJldHVybmVkIGlmIHRoZSB1c2VyCisgICAgICAgICAqIGxlZnQgdGhlIEFjdGl2aXR5IHdpdGhvdXQgY2hhbmdpbmcgdGhlIHNlbGVjdGlvbi4KKyAgICAgICAgICoKKyAgICAgICAgICogQGhpZGUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9HRVRfTVVMVElQTEVfUEhPTkVTID0KKyAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQuY29udGFjdHMuYWN0aW9uLkdFVF9NVUxUSVBMRV9QSE9ORVMiOworCisgICAgICAgIC8qKgogICAgICAgICAgKiBVc2VkIHdpdGgge0BsaW5rICNTSE9XX09SX0NSRUFURV9DT05UQUNUfSB0byBmb3JjZSBjcmVhdGluZyBhIG5ldwogICAgICAgICAgKiBjb250YWN0IGlmIG5vIG1hdGNoaW5nIGNvbnRhY3QgZm91bmQuIE90aGVyd2lzZSwgZGVmYXVsdCBiZWhhdmlvciBpcwogICAgICAgICAgKiB0byBwcm9tcHQgdXNlciB3aXRoIGRpYWxvZyBiZWZvcmUgY3JlYXRpbmcuCkBAIC01NTc4LDYgKzU4NTEsMjMgQEAKICAgICAgICAgICAgICJjb20uYW5kcm9pZC5jb250YWN0cy5hY3Rpb24uQ1JFQVRFX0RFU0NSSVBUSU9OIjsKIAogICAgICAgICAvKioKKyAgICAgICAgICogVXNlZCB3aXRoIHtAbGluayAjQUNUSU9OX0dFVF9NVUxUSVBMRV9QSE9ORVN9IGFzIHRoZSBpbnB1dCBvciBvdXRwdXQgdmFsdWUuCisgICAgICAgICAqIDxwPgorICAgICAgICAgKiBUaGUgcGhvbmUgbnVtYmVycyB3YW50IHRvIGJlIHBpY2tlZCBieSBkZWZhdWx0IHNob3VsZCBiZSBwYXNzZWQgaW4gYXMKKyAgICAgICAgICogaW5wdXQgdmFsdWUuIFRoZXNlIHBob25lIG51bWJlcnMgY291bGQgYmVsb25nIHRvIHRoZSBjb250YWN0cyBvciBub3QuCisgICAgICAgICAqIDxwPgorICAgICAgICAgKiBUaGUgcGhvbmUgbnVtYmVycyB3aGljaCB3ZXJlIHBpY2tlZCBieSB0aGUgdXNlciBhcmUgcmV0dXJuZWQgYXMgb3V0cHV0CisgICAgICAgICAqIHZhbHVlLgorICAgICAgICAgKiA8cD4KKyAgICAgICAgICogVHlwZTogYXJyYXkgb2YgVVJJcywgdGhlIHRlbCBVUkkgaXMgdXNlZCBmb3IgdGhlIHBob25lIG51bWJlcnMgd2hpY2ggZG9uJ3QKKyAgICAgICAgICogYmVsb25nIHRvIGFueSBjb250YWN0LCB0aGUgY29udGVudCBVUkkgaXMgdXNlZCBmb3IgcGhvbmUgaWQgaW4gY29udGFjdHMuCisgICAgICAgICAqCisgICAgICAgICAqIEBoaWRlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9QSE9ORV9VUklTID0KKyAgICAgICAgICAgICJjb20uYW5kcm9pZC5jb250YWN0cy5leHRyYS5QSE9ORV9VUklTIjsKKworICAgICAgICAvKioKICAgICAgICAgICogT3B0aW9uYWwgZXh0cmEgdXNlZCB3aXRoIHtAbGluayAjU0hPV19PUl9DUkVBVEVfQ09OVEFDVH0gdG8gc3BlY2lmeSBhCiAgICAgICAgICAqIGRpYWxvZyBsb2NhdGlvbiB1c2luZyBzY3JlZW4gY29vcmRpbmF0ZXMuIFdoZW4gbm90IHNwZWNpZmllZCwgdGhlCiAgICAgICAgICAqIGRpYWxvZyB3aWxsIGJlIGNlbnRlcmVkLgpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvcHJvdmlkZXIvTWVkaWFTdG9yZS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcHJvdmlkZXIvTWVkaWFTdG9yZS5qYXZhCmluZGV4IDQwZWQ5ODAuLjlhM2M2MTggMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3Byb3ZpZGVyL01lZGlhU3RvcmUuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9wcm92aWRlci9NZWRpYVN0b3JlLmphdmEKQEAgLTMxNywyMiArMzE3LDIzIEBACiAgICAgICAgICAgICAvLyBMb2cudihUQUcsICJnZXRUaHVtYm5haWw6IG9yaWdJZD0iK29yaWdJZCsiLCBraW5kPSIra2luZCsiLCBpc1ZpZGVvPSIraXNWaWRlbyk7CiAgICAgICAgICAgICAvLyBJZiB0aGUgbWFnaWMgaXMgbm9uLXplcm8sIHdlIHNpbXBseSByZXR1cm4gdGh1bWJuYWlsIGlmIGl0IGRvZXMgZXhpc3QuCiAgICAgICAgICAgICAvLyBxdWVyeWluZyBNZWRpYVByb3ZpZGVyIGFuZCBzaW1wbHkgcmV0dXJuIHRodW1ibmFpbC4KLSAgICAgICAgICAgIE1pbmlUaHVtYkZpbGUgdGh1bWJGaWxlID0gTWluaVRodW1iRmlsZS5pbnN0YW5jZShiYXNlVXJpKTsKLSAgICAgICAgICAgIGxvbmcgbWFnaWMgPSB0aHVtYkZpbGUuZ2V0TWFnaWMob3JpZ0lkKTsKLSAgICAgICAgICAgIGlmIChtYWdpYyAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGtpbmQgPT0gTUlDUk9fS0lORCkgewotICAgICAgICAgICAgICAgICAgICBieXRlW10gZGF0YSA9IG5ldyBieXRlW01pbmlUaHVtYkZpbGUuQllURVNfUEVSX01JTlRIVU1CXTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHRodW1iRmlsZS5nZXRNaW5pVGh1bWJGcm9tRmlsZShvcmlnSWQsIGRhdGEpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJpdG1hcCA9IEJpdG1hcEZhY3RvcnkuZGVjb2RlQnl0ZUFycmF5KGRhdGEsIDAsIGRhdGEubGVuZ3RoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiaXRtYXAgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgImNvdWxkbid0IGRlY29kZSBieXRlIGFycmF5LiIpOworICAgICAgICAgICAgTWluaVRodW1iRmlsZSB0aHVtYkZpbGUgPSBuZXcgTWluaVRodW1iRmlsZShpc1ZpZGVvID8gVmlkZW8uTWVkaWEuRVhURVJOQUxfQ09OVEVOVF9VUkkKKyAgICAgICAgICAgICAgICAgICAgOiBJbWFnZXMuTWVkaWEuRVhURVJOQUxfQ09OVEVOVF9VUkkpOworICAgICAgICAgICAgQ3Vyc29yIGMgPSBudWxsOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBsb25nIG1hZ2ljID0gdGh1bWJGaWxlLmdldE1hZ2ljKG9yaWdJZCk7CisgICAgICAgICAgICAgICAgaWYgKG1hZ2ljICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPT0gTUlDUk9fS0lORCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIGRhdGEgPSBuZXcgYnl0ZVtNaW5pVGh1bWJGaWxlLkJZVEVTX1BFUl9NSU5USFVNQl07CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGh1bWJGaWxlLmdldE1pbmlUaHVtYkZyb21GaWxlKG9yaWdJZCwgZGF0YSkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdG1hcCA9IEJpdG1hcEZhY3RvcnkuZGVjb2RlQnl0ZUFycmF5KGRhdGEsIDAsIGRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYml0bWFwID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiY291bGRuJ3QgZGVjb2RlIGJ5dGUgYXJyYXkuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBiaXRtYXA7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChraW5kID09IE1JTklfS0lORCkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY29sdW1uID0gaXNWaWRlbyA/ICJ2aWRlb19pZD0iIDogImltYWdlX2lkPSI7Ci0gICAgICAgICAgICAgICAgICAgIEN1cnNvciBjID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiaXRtYXA7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoa2luZCA9PSBNSU5JX0tJTkQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBjb2x1bW4gPSBpc1ZpZGVvID8gInZpZGVvX2lkPSIgOiAiaW1hZ2VfaWQ9IjsKICAgICAgICAgICAgICAgICAgICAgICAgIGMgPSBjci5xdWVyeShiYXNlVXJpLCBQUk9KRUNUSU9OLCBjb2x1bW4gKyBvcmlnSWQsIG51bGwsIG51bGwpOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGMgIT0gbnVsbCAmJiBjLm1vdmVUb0ZpcnN0KCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRtYXAgPSBnZXRNaW5pVGh1bWJGcm9tRmlsZShjLCBiYXNlVXJpLCBjciwgb3B0aW9ucyk7CkBAIC0zNDAsMTcgKzM0MSwxMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYml0bWFwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjICE9IG51bGwpIGMuY2xvc2UoKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgQ3Vyc29yIGMgPSBudWxsOwotICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICBVcmkgYmxvY2tpbmdVcmkgPSBiYXNlVXJpLmJ1aWxkVXBvbigpLmFwcGVuZFF1ZXJ5UGFyYW1ldGVyKCJibG9ja2luZyIsICIxIikKICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmRRdWVyeVBhcmFtZXRlcigib3JpZ19pZCIsIFN0cmluZy52YWx1ZU9mKG9yaWdJZCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kUXVlcnlQYXJhbWV0ZXIoImdyb3VwX2lkIiwgU3RyaW5nLnZhbHVlT2YoZ3JvdXBJZCkpLmJ1aWxkKCk7CisgICAgICAgICAgICAgICAgaWYgKGMgIT0gbnVsbCkgYy5jbG9zZSgpOwogICAgICAgICAgICAgICAgIGMgPSBjci5xdWVyeShibG9ja2luZ1VyaSwgUFJPSkVDVElPTiwgbnVsbCwgbnVsbCwgbnVsbCk7CiAgICAgICAgICAgICAgICAgLy8gVGhpcyBoYXBwZW5zIHdoZW4gb3JpZ2luYWwgaW1hZ2UvdmlkZW8gZG9lc24ndCBleGlzdC4KICAgICAgICAgICAgICAgICBpZiAoYyA9PSBudWxsKSByZXR1cm4gbnVsbDsKQEAgLTM5Nyw2ICszOTQsOSBAQAogICAgICAgICAgICAgICAgIExvZy53KFRBRywgZXgpOwogICAgICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgICAgICBpZiAoYyAhPSBudWxsKSBjLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgLy8gVG8gYXZvaWQgZmlsZSBkZXNjcmlwdG9yIGxlYWsgaW4gYXBwbGljYXRpb24gcHJvY2Vzcy4KKyAgICAgICAgICAgICAgICB0aHVtYkZpbGUuZGVhY3RpdmF0ZSgpOworICAgICAgICAgICAgICAgIHRodW1iRmlsZSA9IG51bGw7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gYml0bWFwOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9wcm92aWRlci9NdHAuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3Byb3ZpZGVyL010cC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1Zjg2NjYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9wcm92aWRlci9NdHAuamF2YQpAQCAtMCwwICsxLDMzNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5wcm92aWRlcjsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50VXJpczsKK2ltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworCisvKioKKyAqIFRoZSBNVFAgcHJvdmlkZXIgc3VwcG9ydHMgYWNjZXNzaW5nIGNvbnRlbnQgb24gTVRQIGFuZCBQVFAgZGV2aWNlcy4KKyAqIEBoaWRlCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBNdHAKK3sKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgVEFHID0gIk10cCI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVVRIT1JJVFkgPSAibXRwIjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URU5UX0FVVEhPUklUWV9TTEFTSCA9ICJjb250ZW50Oi8vIiArIEFVVEhPUklUWSArICIvIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVOVF9BVVRIT1JJVFlfREVWSUNFX1NMQVNIID0gImNvbnRlbnQ6Ly8iICsgQVVUSE9SSVRZICsgIi9kZXZpY2UvIjsKKworICAgIC8qKgorICAgICAqIENvbnRhaW5zIGxpc3Qgb2YgYWxsIE1UUC9QVFAgZGV2aWNlcworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRGV2aWNlIGltcGxlbWVudHMgQmFzZUNvbHVtbnMgeworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVXJpIENPTlRFTlRfVVJJID0gVXJpLnBhcnNlKENPTlRFTlRfQVVUSE9SSVRZX1NMQVNIICsgImRldmljZSIpOworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgVXJpIGdldENvbnRlbnRVcmkoaW50IGRldmljZUlEKSB7CisgICAgICAgICAgICByZXR1cm4gVXJpLnBhcnNlKENPTlRFTlRfQVVUSE9SSVRZX0RFVklDRV9TTEFTSCArIGRldmljZUlEKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgbWFudWZhY3R1cmVyIG9mIHRoZSBkZXZpY2UKKyAgICAgICAgICogPFA+VHlwZTogVEVYVDwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BTlVGQUNUVVJFUiA9ICJtYW51ZmFjdHVyZXIiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgbW9kZWwgbmFtZSBvZiB0aGUgZGV2aWNlCisgICAgICAgICAqIDxQPlR5cGU6IFRFWFQ8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNT0RFTCA9ICJtb2RlbCI7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udGFpbnMgbGlzdCBvZiBzdG9yYWdlIHVuaXRzIGZvciBhbiBNVFAvUFRQIGRldmljZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgU3RvcmFnZSBpbXBsZW1lbnRzIEJhc2VDb2x1bW5zIHsKKworICAgICAgICBwdWJsaWMgc3RhdGljIFVyaSBnZXRDb250ZW50VXJpKGludCBkZXZpY2VJRCkgeworICAgICAgICAgICAgcmV0dXJuIFVyaS5wYXJzZShDT05URU5UX0FVVEhPUklUWV9ERVZJQ0VfU0xBU0ggKyBkZXZpY2VJRCArICIvc3RvcmFnZSIpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBVcmkgZ2V0Q29udGVudFVyaShpbnQgZGV2aWNlSUQsIGludCBzdG9yYWdlSUQpIHsKKyAgICAgICAgICAgIHJldHVybiBVcmkucGFyc2UoQ09OVEVOVF9BVVRIT1JJVFlfREVWSUNFX1NMQVNIICsgZGV2aWNlSUQgKyAiL3N0b3JhZ2UvIiArIHN0b3JhZ2VJRCk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogU3RvcmFnZSB1bml0IGlkZW50aWZpZXIKKyAgICAgICAgICogPFA+VHlwZTogVEVYVDwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElERU5USUZJRVIgPSAiaWRlbnRpZmllciI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFN0b3JhZ2UgdW5pdCBkZXNjcmlwdGlvbgorICAgICAgICAgKiA8UD5UeXBlOiBURVhUPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVTQ1JJUFRJT04gPSAiZGVzY3JpcHRpb24iOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnRhaW5zIGxpc3Qgb2Ygb2JqZWN0cyBvbiBhbiBNVFAvUFRQIGRldmljZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgT2JqZWN0IGltcGxlbWVudHMgQmFzZUNvbHVtbnMgeworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgVXJpIGdldENvbnRlbnRVcmkoaW50IGRldmljZUlELCBpbnQgb2JqZWN0SUQpIHsKKyAgICAgICAgICAgIHJldHVybiBVcmkucGFyc2UoQ09OVEVOVF9BVVRIT1JJVFlfREVWSUNFX1NMQVNIICsgZGV2aWNlSUQKKyAgICAgICAgICAgICAgICAgICAgKyAiL29iamVjdC8iICsgb2JqZWN0SUQpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBVcmkgZ2V0Q29udGVudFVyaUZvck9iamVjdENoaWxkcmVuKGludCBkZXZpY2VJRCwgaW50IG9iamVjdElEKSB7CisgICAgICAgICAgICByZXR1cm4gVXJpLnBhcnNlKENPTlRFTlRfQVVUSE9SSVRZX0RFVklDRV9TTEFTSCArIGRldmljZUlECisgICAgICAgICAgICAgICAgICAgICsgIi9vYmplY3QvIiArIG9iamVjdElEICsgIi9jaGlsZCIpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBVcmkgZ2V0Q29udGVudFVyaUZvclN0b3JhZ2VDaGlsZHJlbihpbnQgZGV2aWNlSUQsIGludCBzdG9yYWdlSUQpIHsKKyAgICAgICAgICAgIHJldHVybiBVcmkucGFyc2UoQ09OVEVOVF9BVVRIT1JJVFlfREVWSUNFX1NMQVNIICsgZGV2aWNlSUQKKyAgICAgICAgICAgICAgICAgICAgKyAiL3N0b3JhZ2UvIiArIHN0b3JhZ2VJRCArICIvY2hpbGQiKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgZm9sbG93aW5nIGNvbHVtbnMgY29ycmVzcG9uZCB0byB0aGUgZmllbGRzIGluIHRoZSBPYmplY3RJbmZvIGRhdGFzZXQKKyAgICAgICAgICogYXMgZGVzY3JpYmVkIGluIHRoZSBNVFAgc3BlY2lmaWNhdGlvbi4KKyAgICAgICAgICovCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBJRCBvZiB0aGUgc3RvcmFnZSB1bml0IGNvbnRhaW5pbmcgdGhlIG9iamVjdC4KKyAgICAgICAgICogPFA+VHlwZTogSU5URUdFUjwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUT1JBR0VfSUQgPSAic3RvcmFnZV9pZCI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBvYmplY3QncyBmb3JtYXQuICBDYW4gYmUgb25lIG9mIHRoZSBGT1JNQVRfKiBzeW1ib2xzIGJlbG93LAorICAgICAgICAgKiBvciBhbnkgb2YgdGhlIHZhbGlkIE1UUCBvYmplY3QgZm9ybWF0cyBhcyBkZWZpbmVkIGluIHRoZSBNVFAgc3BlY2lmaWNhdGlvbi4KKyAgICAgICAgICogPFA+VHlwZTogSU5URUdFUjwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1BVCA9ICJmb3JtYXQiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgcHJvdGVjdGlvbiBzdGF0dXMgb2YgdGhlIG9iamVjdC4gIFNlZSB0aGUgUFJPVEVDVElPTl9TVEFUVVNfKnN5bWJvbHMgYmVsb3cuCisgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVI8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9URUNUSU9OX1NUQVRVUyA9ICJwcm90ZWN0aW9uX3N0YXR1cyI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBzaXplIG9mIHRoZSBvYmplY3QgaW4gYnl0ZXMuCisgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVI8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTSVpFID0gInNpemUiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgb2JqZWN0J3MgdGh1bWJuYWlsIGZvcm1hdC4gIENhbiBiZSBvbmUgb2YgdGhlIEZPUk1BVF8qIHN5bWJvbHMgYmVsb3csCisgICAgICAgICAqIG9yIGFueSBvZiB0aGUgdmFsaWQgTVRQIG9iamVjdCBmb3JtYXRzIGFzIGRlZmluZWQgaW4gdGhlIE1UUCBzcGVjaWZpY2F0aW9uLgorICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEhVTUJfRk9STUFUID0gImZvcm1hdCI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBzaXplIG9mIHRoZSBvYmplY3QncyB0aHVtYm5haWwgaW4gYnl0ZXMuCisgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVI8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUSFVNQl9TSVpFID0gInRodW1iX3NpemUiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgd2lkdGggb2YgdGhlIG9iamVjdCdzIHRodW1ibmFpbCBpbiBwaXhlbHMuCisgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVI8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUSFVNQl9XSURUSCA9ICJ0aHVtYl93aWR0aCI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBoZWlnaHQgb2YgdGhlIG9iamVjdCdzIHRodW1ibmFpbCBpbiBwaXhlbHMuCisgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVI8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUSFVNQl9IRUlHSFQgPSAidGh1bWJfaGVpZ2h0IjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIG9iamVjdCdzIHRodW1ibmFpbC4KKyAgICAgICAgICogPFA+VHlwZTogQkxPQjwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRIVU1CID0gInRodW1iIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHdpZHRoIG9mIHRoZSBvYmplY3QgaW4gcGl4ZWxzLgorICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1BR0VfV0lEVEggPSAiaW1hZ2Vfd2lkdGgiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgaGVpZ2h0IG9mIHRoZSBvYmplY3QgaW4gcGl4ZWxzLgorICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1BR0VfSEVJR0hUID0gImltYWdlX2hlaWdodCI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBkZXB0aCBvZiB0aGUgb2JqZWN0IGluIGJpdHMgcGVyIHBpeGVsLgorICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1BR0VfREVQVEggPSAiaW1hZ2VfZGVwdGgiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgSUQgb2YgdGhlIG9iamVjdCdzIHBhcmVudCwgb3IgemVybyBpZiB0aGUgb2JqZWN0CisgICAgICAgICAqIGlzIGluIHRoZSByb290IG9mIGl0cyBzdG9yYWdlIHVuaXQuCisgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVI8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJFTlQgPSAicGFyZW50IjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGFzc29jaWF0aW9uIHR5cGUgZm9yIGEgY29udGFpbmVyIG9iamVjdC4KKyAgICAgICAgICogRm9yIGZvbGRlcnMgdGhpcyBpcyB0eXBpY2FsbHkge0BsaW5rICNBU1NPQ0lBVElPTl9UWVBFX0dFTkVSSUNfRk9MREVSfQorICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVNTT0NJQVRJT05fVFlQRSA9ICJhc3NvY2lhdGlvbl90eXBlIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ29udGFpbnMgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCBjb250YWluZXIgb2JqZWN0cy4KKyAgICAgICAgICogPFA+VHlwZTogSU5URUdFUjwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFTU09DSUFUSU9OX0RFU0MgPSAiYXNzb2NpYXRpb25fZGVzYyI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBzZXF1ZW5jZSBudW1iZXIgb2YgdGhlIG9iamVjdCwgdHlwaWNhbGx5IHVzZWQgZm9yIGFuIGFzc29jaWF0aW9uCisgICAgICAgICAqIGNvbnRhaW5pbmcgaW1hZ2VzIHRha2VuIGluIHNlcXVlbmNlLgorICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VRVUVOQ0VfTlVNQkVSID0gInNlcXVlbmNlX251bWJlciI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBuYW1lIG9mIHRoZSBvYmplY3QuCisgICAgICAgICAqIDxQPlR5cGU6IFRFWFQ8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FID0gIm5hbWUiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgZGF0ZSB0aGUgb2JqZWN0IHdhcyBjcmVhdGVkLCBpbiBzZWNvbmRzIHNpbmNlIEphbnVhcnkgMSwgMTk3MC4KKyAgICAgICAgICogPFA+VHlwZTogSU5URUdFUjwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERBVEVfQ1JFQVRFRCA9ICJkYXRlX2NyZWF0ZWQiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgZGF0ZSB0aGUgb2JqZWN0IHdhcyBsYXN0IG1vZGlmaWVkLCBpbiBzZWNvbmRzIHNpbmNlIEphbnVhcnkgMSwgMTk3MC4KKyAgICAgICAgICogPFA+VHlwZTogSU5URUdFUjwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERBVEVfTU9ESUZJRUQgPSAiZGF0ZV9tb2RpZmllZCI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEEgbGlzdCBvZiBrZXl3b3JkcyBhc3NvY2lhdGVkIHdpdGggYW4gb2JqZWN0LCBzZXBhcmF0ZWQgYnkgc3BhY2VzLgorICAgICAgICAgKiA8UD5UeXBlOiBURVhUPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZV09SRFMgPSAia2V5d29yZHMiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDb250YW50cyBmb3Ige0BsaW5rICNGT1JNQVR9IGFuZCB7QGxpbmsgI1RIVU1CX0ZPUk1BVH0KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9VTkRFRklORUQgPSAweDMwMDA7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9BU1NPQ0lBVElPTiA9IDB4MzAwMTsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX1NDUklQVCA9IDB4MzAwMjsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX0VYRUNVVEFCTEUgPSAweDMwMDM7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9URVhUID0gMHgzMDA0OworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfSFRNTCA9IDB4MzAwNTsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX0RQT0YgPSAweDMwMDY7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9BSUZGID0gMHgzMDA3OworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfV0FWID0gMHgzMDA4OworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfTVAzID0gMHgzMDA5OworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfQVZJID0gMHgzMDBBOworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfTVBFRyA9IDB4MzAwQjsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX0FTRiA9IDB4MzAwQzsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX0RFRklORUQgPSAweDM4MDA7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9FWElGX0pQRUcgPSAweDM4MDE7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9USUZGX0VQID0gMHgzODAyOworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfRkxBU0hQSVggPSAweDM4MDM7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9CTVAgPSAweDM4MDQ7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9DSUZGID0gMHgzODA1OworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfR0lGID0gMHgzODA3OworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfSkZJRiA9IDB4MzgwODsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX0NEID0gMHgzODA5OworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfUElDVCA9IDB4MzgwQTsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX1BORyA9IDB4MzgwQjsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX1RJRkYgPSAweDM4MEQ7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9USUZGX0lUID0gMHgzODBFOworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfSlAyID0gMHgzODBGOworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfSlBYID0gMHgzODEwOworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfVU5ERUZJTkVEX0ZJUk1XQVJFID0gMHhCODAyOworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfV0lORE9XU19JTUFHRV9GT1JNQVQgPSAweEI4ODE7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9VTkRFRklORURfQVVESU8gPSAweEI5MDA7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9XTUEgPSAweEI5MDE7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9PR0cgPSAweEI5MDI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9BQUMgPSAweEI5MDM7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9BVURJQkxFID0gMHhCOTA0OworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfRkxBQyA9IDB4QjkwNjsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX1VOREVGSU5FRF9WSURFTyA9IDB4Qjk4MDsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX1dNViA9IDB4Qjk4MTsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX01QNF9DT05UQUlORVIgPSAweEI5ODI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9NUDIgPSAweEI5ODM7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF8zR1BfQ09OVEFJTkVSID0gMHhCOTg0OworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfVU5ERUZJTkVEX0NPTExFQ1RJT04gPSAweEJBMDA7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9BQlNUUkFDVF9NVUxUSU1FRElBX0FMQlVNID0gMHhCQTAxOworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfQUJTVFJBQ1RfSU1BR0VfQUxCVU0gPSAweEJBMDI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9BQlNUUkFDVF9BVURJT19BTEJVTSA9IDB4QkEwMzsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX0FCU1RSQUNUX1ZJREVPX0FMQlVNID0gMHhCQTA0OworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfQUJTVFJBQ1RfQVZfUExBWUxJU1QgPSAweEJBMDU7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9BQlNUUkFDVF9DT05UQUNUX0dST1VQID0gMHhCQTA2OworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfQUJTVFJBQ1RfTUVTU0FHRV9GT0xERVIgPSAweEJBMDc7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9BQlNUUkFDVF9DSEFQVEVSRURfUFJPRFVDVElPTiA9IDB4QkEwODsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX0FCU1RSQUNUX0FVRElPX1BMQVlMSVNUID0gMHhCQTA5OworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfQUJTVFJBQ1RfVklERU9fUExBWUxJU1QgPSAweEJBMEE7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9BQlNUUkFDVF9NRURJQUNBU1QgPSAweEJBMEI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9XUExfUExBWUxJU1QgPSAweEJBMTA7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9NM1VfUExBWUxJU1QgPSAweEJBMTE7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9NUExfUExBWUxJU1QgPSAweEJBMTI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9BU1hfUExBWUxJU1QgPSAweEJBMTM7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9QTFNfUExBWUxJU1QgPSAweEJBMTQ7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9VTkRFRklORURfRE9DVU1FTlQgPSAweEJBODA7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9BQlNUUkFDVF9ET0NVTUVOVCA9IDB4QkE4MTsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX1hNTF9ET0NVTUVOVCA9IDB4QkE4MjsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX01TX1dPUkRfRE9DVU1FTlQgPSAweEJBODM7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9NSFRfQ09NUElMRURfSFRNTF9ET0NVTUVOVCA9IDB4QkE4NDsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX01TX0VYQ0VMX1NQUkVBRFNIRUVUID0gMHhCQTg1OworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfTVNfUE9XRVJQT0lOVF9QUkVTRU5UQVRJT04gPSAweEJBODY7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9VTkRFRklORURfTUVTU0FHRSA9IDB4QkIwMDsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX0FCU1RSQUNUX01FU1NTQUdFID0gMHhCQjAxOworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfVU5ERUZJTkVEX0NPTlRBQ1QgPSAweEJCODA7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9BQlNUUkFDVF9DT05UQUNUID0gMHhCQjgxOworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfVkNBUkRfMiA9IDB4QkI4MjsKKworICAgICAgICAvKioKKyAgICAgICAgICogT2JqZWN0IGlzIG5vdCBwcm90ZWN0ZWQuIEl0IG1heSBiZSBtb2RpZmllZCBhbmQgZGVsZXRlZCwgYW5kIGl0cyBwcm9wZXJ0aWVzCisgICAgICAgICAqIG1heSBiZSBtb2RpZmllZC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1RFQ1RJT05fU1RBVFVTX05PTkUgPSAwOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBPYmplY3QgY2FuIG5vdCBiZSBtb2RpZmllZCBvciBkZWxldGVkIGFuZCBpdHMgcHJvcGVydGllcyBjYW4gbm90IGJlIG1vZGlmaWVkLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPVEVDVElPTl9TVEFUVVNfUkVBRF9PTkxZID0gMHg4MDAxOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBPYmplY3QgY2FuIG5vdCBiZSBtb2RpZmllZCBvciBkZWxldGVkIGJ1dCBpdHMgcHJvcGVydGllcyBhcmUgbW9kaWZpYWJsZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1RFQ1RJT05fU1RBVFVTX1JFQURfT05MWV9EQVRBID0gMHg4MDAyOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBPYmplY3QncyBjb250ZW50cyBjYW4gbm90IGJlIHRyYW5zZmVyZWQgZnJvbSB0aGUgZGV2aWNlLCBidXQgdGhlIG9iamVjdAorICAgICAgICAgKiBtYXkgYmUgbW92ZWQgb3IgZGVsZXRlZCBhbmQgaXRzIHByb3BlcnRpZXMgbWF5IGJlIG1vZGlmaWVkLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPVEVDVElPTl9TVEFUVVNfTk9OX1RSQU5TRkVSQUJMRV9EQVRBID0gMHg4MDAzOworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFTU09DSUFUSU9OX1RZUEVfR0VORVJJQ19GT0xERVIgPSAweDAwMDE7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvcHJvdmlkZXIvU2V0dGluZ3MuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3Byb3ZpZGVyL1NldHRpbmdzLmphdmEKaW5kZXggZWE0NzM4Zi4uNGVjNTM2MyAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvcHJvdmlkZXIvU2V0dGluZ3MuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9wcm92aWRlci9TZXR0aW5ncy5qYXZhCkBAIC0xNiwxNCArMTYsMTEgQEAKIAogcGFja2FnZSBhbmRyb2lkLnByb3ZpZGVyOwogCi1pbXBvcnQgY29tLmdvb2dsZS5hbmRyb2lkLmNvbGxlY3QuTWFwczsKIAotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2RlYy5iaW5hcnkuQmFzZTY0OwogCiBpbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLlNka0NvbnN0YW50OwogaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5TZGtDb25zdGFudC5TZGtDb25zdGFudFR5cGU7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWU7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRRdWVyeU1hcDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50VmFsdWVzOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwpAQCAtMzgsMTkgKzM1LDE0IEBACiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5TUUxFeGNlcHRpb247CiBpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOwogaW1wb3J0IGFuZHJvaWQub3MuKjsKLWltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5UZWxlcGhvbnlNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkFuZHJvaWRFeGNlcHRpb247CiBpbXBvcnQgYW5kcm9pZC51dGlsLkNvbmZpZzsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogCiBpbXBvcnQgamF2YS5uZXQuVVJJU3ludGF4RXhjZXB0aW9uOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuTWVzc2FnZURpZ2VzdDsKLWltcG9ydCBqYXZhLnNlY3VyaXR5Lk5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKIAogCiAvKioKQEAgLTEwMDksNyArMTAwMSw3IEBACiAgICAgICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYXNJbnRlcmVzdGluZ0NvbmZpZ3VyYXRpb25DaGFuZ2VzKGludCBjaGFuZ2VzKSB7CiAgICAgICAgICAgICByZXR1cm4gKGNoYW5nZXMmQWN0aXZpdHlJbmZvLkNPTkZJR19GT05UX1NDQUxFKSAhPSAwOwogICAgICAgICB9Ci0gICAgICAgIAorCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXRTaG93R1RhbGtTZXJ2aWNlU3RhdHVzKENvbnRlbnRSZXNvbHZlciBjcikgewogICAgICAgICAgICAgcmV0dXJuIGdldEludChjciwgU0hPV19HVEFMS19TRVJWSUNFX1NUQVRVUywgMCkgIT0gMDsKICAgICAgICAgfQpAQCAtMTIxNiw3ICsxMjA4LDcgQEAKICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9DS19QQVRURVJOX1ZJU0lCTEUgPSAibG9ja19wYXR0ZXJuX3Zpc2libGVfcGF0dGVybiI7CiAKICAgICAgICAgLyoqCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFVzZSAKKyAgICAgICAgICogQGRlcHJlY2F0ZWQgVXNlCiAgICAgICAgICAqIHtAbGluayBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzLlNlY3VyZSNMT0NLX1BBVFRFUk5fVEFDVElMRV9GRUVEQkFDS19FTkFCTEVEfQogICAgICAgICAgKiBpbnN0ZWFkCiAgICAgICAgICAqLwpAQCAtMjI5MCw2ICsyMjgyLDE0IEBACiAgICAgICAgIH0KIAogICAgICAgICAvKioKKyAgICAgICAgICogR2V0IHRoZSBrZXkgdGhhdCByZXRyaWV2ZXMgYSBibHVldG9vdGggSW5wdXQgRGV2aWNlJ3MgcHJpb3JpdHkuCisgICAgICAgICAqIEBoaWRlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBnZXRCbHVldG9vdGhJbnB1dERldmljZVByaW9yaXR5S2V5KFN0cmluZyBhZGRyZXNzKSB7CisgICAgICAgICAgICByZXR1cm4gKCJibHVldG9vdGhfaW5wdXRfZGV2aWNlX3ByaW9yaXR5XyIgKyBhZGRyZXNzLnRvVXBwZXJDYXNlKCkpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCiAgICAgICAgICAqIFdoZXRoZXIgb3Igbm90IGRhdGEgcm9hbWluZyBpcyBlbmFibGVkLiAoMCA9IGZhbHNlLCAxID0gdHJ1ZSkKICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERBVEFfUk9BTUlORyA9ICJkYXRhX3JvYW1pbmciOwpAQCAtMjQxNiw2ICsyNDE2LDE0IEBACiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkVOVEFMX0NPTlRST0xfUkVESVJFQ1RfVVJMID0gInBhcmVudGFsX2NvbnRyb2xfcmVkaXJlY3RfdXJsIjsKIAogICAgICAgICAvKioKKyAgICAgICAgICogQSBwb3NpdGl2ZSB2YWx1ZSBpbmRpY2F0ZXMgdGhlIGZyZXF1ZW5jeSBvZiBTYW1wbGluZ1Byb2ZpbGVyCisgICAgICAgICAqIHRha2luZyBzbmFwc2hvdHMgaW4gaGVydHouIFplcm8gdmFsdWUgbWVhbnMgU2FtcGxpbmdQcm9maWxlciBpcyBkaXNhYmxlZC4KKyAgICAgICAgICoKKyAgICAgICAgICogQGhpZGUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNBTVBMSU5HX1BST0ZJTEVSX0haID0gInNhbXBsaW5nX3Byb2ZpbGVyX2h6IjsKKworICAgICAgICAvKioKICAgICAgICAgICogU2V0dGluZ3MgY2xhc3NuYW1lIHRvIGxhdW5jaCB3aGVuIFNldHRpbmdzIGlzIGNsaWNrZWQgZnJvbSBBbGwKICAgICAgICAgICogQXBwbGljYXRpb25zLiAgTmVlZGVkIGJlY2F1c2Ugb2YgdXNlciB0ZXN0aW5nIGJldHdlZW4gdGhlIG9sZAogICAgICAgICAgKiBhbmQgbmV3IFNldHRpbmdzIGFwcHMuCkBAIC0zNTczLDIwICszNTgxLDggQEAKICAgICAgICAgICAgIC8vIElmIGEgc2hvcnRjdXQgaXMgc3VwcGxpZWQsIGFuZCBpdCBpcyBhbHJlYWR5IGRlZmluZWQgZm9yCiAgICAgICAgICAgICAvLyBhbm90aGVyIGJvb2ttYXJrLCB0aGVuIHJlbW92ZSB0aGUgb2xkIGRlZmluaXRpb24uCiAgICAgICAgICAgICBpZiAoc2hvcnRjdXQgIT0gMCkgewotICAgICAgICAgICAgICAgIEN1cnNvciBjID0gY3IucXVlcnkoQ09OVEVOVF9VUkksCi0gICAgICAgICAgICAgICAgICAgICAgICBzU2hvcnRjdXRQcm9qZWN0aW9uLCBzU2hvcnRjdXRTZWxlY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10geyBTdHJpbmcudmFsdWVPZigoaW50KSBzaG9ydGN1dCkgfSwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGMubW92ZVRvRmlyc3QoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGMuZ2V0Q291bnQoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWMuZGVsZXRlUm93KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ291bGQgbm90IGRlbGV0ZSBleGlzdGluZyBzaG9ydGN1dCByb3ciKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgICAgICBpZiAoYyAhPSBudWxsKSBjLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNyLmRlbGV0ZShDT05URU5UX1VSSSwgc1Nob3J0Y3V0U2VsZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsgU3RyaW5nLnZhbHVlT2YoKGludCkgc2hvcnRjdXQpIH0pOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBDb250ZW50VmFsdWVzIHZhbHVlcyA9IG5ldyBDb250ZW50VmFsdWVzKCk7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9zZXJ2ZXIvQmx1ZXRvb3RoRXZlbnRMb29wLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9zZXJ2ZXIvQmx1ZXRvb3RoRXZlbnRMb29wLmphdmEKaW5kZXggMzVhNTgyZC4uOWI3YTczZCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvc2VydmVyL0JsdWV0b290aEV2ZW50TG9vcC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3NlcnZlci9CbHVldG9vdGhFdmVudExvb3AuamF2YQpAQCAtMjAsNiArMjAsNyBAQAogaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aEFkYXB0ZXI7CiBpbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoQ2xhc3M7CiBpbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoRGV2aWNlOworaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aElucHV0RGV2aWNlOwogaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aFV1aWQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKQEAgLTQyNyw2ICs0MjgsMjAgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIHByaXZhdGUgdm9pZCBvbklucHV0RGV2aWNlUHJvcGVydHlDaGFuZ2VkKFN0cmluZyBwYXRoLCBTdHJpbmdbXSBwcm9wVmFsdWVzKSB7CisgICAgICAgIFN0cmluZyBhZGRyZXNzID0gbUJsdWV0b290aFNlcnZpY2UuZ2V0QWRkcmVzc0Zyb21PYmplY3RQYXRoKHBhdGgpOworICAgICAgICBpZiAoYWRkcmVzcyA9PSBudWxsKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJvbklucHV0RGV2aWNlUHJvcGVydHlDaGFuZ2VkOiBBZGRyZXNzIG9mIHRoZSByZW1vdGUgZGV2aWNlIGluIG51bGwiKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBsb2coIiBJbnB1dCBEZXZpY2UgOiBOYW1lIG9mIFByb3BlcnR5IGlzOiIgKyBwcm9wVmFsdWVzWzBdKTsKKyAgICAgICAgYm9vbGVhbiBzdGF0ZSA9IGZhbHNlOworICAgICAgICBpZiAocHJvcFZhbHVlc1sxXS5lcXVhbHMoInRydWUiKSkgeworICAgICAgICAgICAgc3RhdGUgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIG1CbHVldG9vdGhTZXJ2aWNlLmhhbmRsZUlucHV0RGV2aWNlUHJvcGVydHlDaGFuZ2UoYWRkcmVzcywgc3RhdGUpOworICAgIH0KKwogICAgIHByaXZhdGUgU3RyaW5nIGNoZWNrUGFpcmluZ1JlcXVlc3RBbmRHZXRBZGRyZXNzKFN0cmluZyBvYmplY3RQYXRoLCBpbnQgbmF0aXZlRGF0YSkgewogICAgICAgICBTdHJpbmcgYWRkcmVzcyA9IG1CbHVldG9vdGhTZXJ2aWNlLmdldEFkZHJlc3NGcm9tT2JqZWN0UGF0aChvYmplY3RQYXRoKTsKICAgICAgICAgaWYgKGFkZHJlc3MgPT0gbnVsbCkgewpAQCAtNTczLDYgKzU4OCw4IEBACiAgICAgfQogCiAgICAgcHJpdmF0ZSBib29sZWFuIG9uQWdlbnRBdXRob3JpemUoU3RyaW5nIG9iamVjdFBhdGgsIFN0cmluZyBkZXZpY2VVdWlkKSB7CisgICAgICAgIGlmICghbUJsdWV0b290aFNlcnZpY2UuaXNFbmFibGVkKCkpIHJldHVybiBmYWxzZTsKKwogICAgICAgICBTdHJpbmcgYWRkcmVzcyA9IG1CbHVldG9vdGhTZXJ2aWNlLmdldEFkZHJlc3NGcm9tT2JqZWN0UGF0aChvYmplY3RQYXRoKTsKICAgICAgICAgaWYgKGFkZHJlc3MgPT0gbnVsbCkgewogICAgICAgICAgICAgTG9nLmUoVEFHLCAiVW5hYmxlIHRvIGdldCBkZXZpY2UgYWRkcmVzcyBpbiBvbkF1dGhBZ2VudEF1dGhvcml6ZSIpOwpAQCAtNTgxLDE1ICs1OTgsMTUgQEAKIAogICAgICAgICBib29sZWFuIGF1dGhvcml6ZWQgPSBmYWxzZTsKICAgICAgICAgUGFyY2VsVXVpZCB1dWlkID0gUGFyY2VsVXVpZC5mcm9tU3RyaW5nKGRldmljZVV1aWQpOwotICAgICAgICBCbHVldG9vdGhBMmRwIGEyZHAgPSBuZXcgQmx1ZXRvb3RoQTJkcChtQ29udGV4dCk7CisgICAgICAgIEJsdWV0b290aERldmljZSBkZXZpY2UgPSBtQWRhcHRlci5nZXRSZW1vdGVEZXZpY2UoYWRkcmVzcyk7CiAKICAgICAgICAgLy8gQmx1ZXogc2VuZHMgdGhlIFVVSUQgb2YgdGhlIGxvY2FsIHNlcnZpY2UgYmVpbmcgYWNjZXNzZWQsIF9ub3RfIHRoZQogICAgICAgICAvLyByZW1vdGUgc2VydmljZQotICAgICAgICBpZiAobUJsdWV0b290aFNlcnZpY2UuaXNFbmFibGVkKCkgJiYKLSAgICAgICAgICAgICAgICAoQmx1ZXRvb3RoVXVpZC5pc0F1ZGlvU291cmNlKHV1aWQpIHx8IEJsdWV0b290aFV1aWQuaXNBdnJjcFRhcmdldCh1dWlkKQotICAgICAgICAgICAgICAgICAgICAgICAgfHwgQmx1ZXRvb3RoVXVpZC5pc0FkdkF1ZGlvRGlzdCh1dWlkKSkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICFpc090aGVyU2lua0luTm9uRGlzY29ubmVjdGluZ1N0YXRlKGFkZHJlc3MpKSB7Ci0gICAgICAgICAgICBCbHVldG9vdGhEZXZpY2UgZGV2aWNlID0gbUFkYXB0ZXIuZ2V0UmVtb3RlRGV2aWNlKGFkZHJlc3MpOworICAgICAgICBpZiAoKEJsdWV0b290aFV1aWQuaXNBdWRpb1NvdXJjZSh1dWlkKSB8fCBCbHVldG9vdGhVdWlkLmlzQXZyY3BUYXJnZXQodXVpZCkKKyAgICAgICAgICAgICAgfHwgQmx1ZXRvb3RoVXVpZC5pc0FkdkF1ZGlvRGlzdCh1dWlkKSkgJiYKKyAgICAgICAgICAgICAgIWlzT3RoZXJTaW5rSW5Ob25EaXNjb25uZWN0aW5nU3RhdGUoYWRkcmVzcykpIHsKKyAgICAgICAgICAgIEJsdWV0b290aEEyZHAgYTJkcCA9IG5ldyBCbHVldG9vdGhBMmRwKG1Db250ZXh0KTsKKwogICAgICAgICAgICAgYXV0aG9yaXplZCA9IGEyZHAuZ2V0U2lua1ByaW9yaXR5KGRldmljZSkgPiBCbHVldG9vdGhBMmRwLlBSSU9SSVRZX09GRjsKICAgICAgICAgICAgIGlmIChhdXRob3JpemVkKSB7CiAgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAiQWxsb3dpbmcgaW5jb21pbmcgQTJEUCAvIEFWUkNQIGNvbm5lY3Rpb24gZnJvbSAiICsgYWRkcmVzcyk7CkBAIC01OTcsNiArNjE0LDE1IEBACiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIlJlamVjdGluZyBpbmNvbWluZyBBMkRQIC8gQVZSQ1AgY29ubmVjdGlvbiBmcm9tICIgKyBhZGRyZXNzKTsKICAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChCbHVldG9vdGhVdWlkLmlzSW5wdXREZXZpY2UodXVpZCkgJiYgIWlzT3RoZXJJbnB1dERldmljZUNvbm5lY3RlZChhZGRyZXNzKSkgeworICAgICAgICAgICAgQmx1ZXRvb3RoSW5wdXREZXZpY2UgaW5wdXREZXZpY2UgPSBuZXcgQmx1ZXRvb3RoSW5wdXREZXZpY2UobUNvbnRleHQpOworICAgICAgICAgICAgYXV0aG9yaXplZCA9IGlucHV0RGV2aWNlLmdldElucHV0RGV2aWNlUHJpb3JpdHkoZGV2aWNlKSA+CisgICAgICAgICAgICAgICAgICAgICAgICAgQmx1ZXRvb3RoSW5wdXREZXZpY2UuUFJJT1JJVFlfT0ZGOworICAgICAgICAgICAgIGlmIChhdXRob3JpemVkKSB7CisgICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIkFsbG93aW5nIGluY29taW5nIEhJRCBjb25uZWN0aW9uIGZyb20gIiArIGFkZHJlc3MpOworICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIlJlamVjdGluZyBpbmNvbWluZyBISUQgY29ubmVjdGlvbiBmcm9tICIgKyBhZGRyZXNzKTsKKyAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBMb2cuaShUQUcsICJSZWplY3RpbmcgaW5jb21pbmcgIiArIGRldmljZVV1aWQgKyAiIGNvbm5lY3Rpb24gZnJvbSAiICsgYWRkcmVzcyk7CiAgICAgICAgIH0KQEAgLTYwNCw3ICs2MzAsMTkgQEAKICAgICAgICAgcmV0dXJuIGF1dGhvcml6ZWQ7CiAgICAgfQogCi0gICAgYm9vbGVhbiBpc090aGVyU2lua0luTm9uRGlzY29ubmVjdGluZ1N0YXRlKFN0cmluZyBhZGRyZXNzKSB7CisgICAgcHJpdmF0ZSBib29sZWFuIGlzT3RoZXJJbnB1dERldmljZUNvbm5lY3RlZChTdHJpbmcgYWRkcmVzcykgeworICAgICAgICBTZXQ8Qmx1ZXRvb3RoRGV2aWNlPiBkZXZpY2VzID0KKyAgICAgICAgICAgIG1CbHVldG9vdGhTZXJ2aWNlLmxvb2t1cElucHV0RGV2aWNlc01hdGNoaW5nU3RhdGVzKG5ldyBpbnRbXSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCbHVldG9vdGhJbnB1dERldmljZS5TVEFURV9DT05ORUNUSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmx1ZXRvb3RoSW5wdXREZXZpY2UuU1RBVEVfQ09OTkVDVEVEfSk7CisKKyAgICAgICAgZm9yIChCbHVldG9vdGhEZXZpY2UgZGV2aWNlIDogZGV2aWNlcykgeworICAgICAgICAgICAgaWYgKCFkZXZpY2UuZ2V0QWRkcmVzcygpLmVxdWFscyhhZGRyZXNzKSkgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBpc090aGVyU2lua0luTm9uRGlzY29ubmVjdGluZ1N0YXRlKFN0cmluZyBhZGRyZXNzKSB7CiAgICAgICAgIEJsdWV0b290aEEyZHAgYTJkcCA9IG5ldyBCbHVldG9vdGhBMmRwKG1Db250ZXh0KTsKICAgICAgICAgU2V0PEJsdWV0b290aERldmljZT4gZGV2aWNlcyA9IGEyZHAuZ2V0Tm9uRGlzY29ubmVjdGVkU2lua3MoKTsKICAgICAgICAgaWYgKGRldmljZXMuc2l6ZSgpID09IDApIHJldHVybiBmYWxzZTsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3NlcnZlci9CbHVldG9vdGhTZXJ2aWNlLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9zZXJ2ZXIvQmx1ZXRvb3RoU2VydmljZS5qYXZhCmluZGV4IDMxZTVhN2IuLmVjOTliMGQgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3NlcnZlci9CbHVldG9vdGhTZXJ2aWNlLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvc2VydmVyL0JsdWV0b290aFNlcnZpY2UuamF2YQpAQCAtMjQsMTYgKzI0LDE5IEBACiAKIHBhY2thZ2UgYW5kcm9pZC5zZXJ2ZXI7CiAKK2ltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhBMmRwOwogaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aEFkYXB0ZXI7CiBpbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoQ2xhc3M7CiBpbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoRGV2aWNlOwogaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aEhlYWRzZXQ7CiBpbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoRGV2aWNlUHJvZmlsZVN0YXRlOwogaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aFByb2ZpbGVTdGF0ZTsKK2ltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhJbnB1dERldmljZTsKIGltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhTb2NrZXQ7CiBpbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoVXVpZDsKIGltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5JQmx1ZXRvb3RoOwogaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLklCbHVldG9vdGhDYWxsYmFjazsKK2ltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5JQmx1ZXRvb3RoSGVhZHNldDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQnJvYWRjYXN0UmVjZWl2ZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKQEAgLTcwLDggKzczLDEwIEBACiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwogaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CiAKIHB1YmxpYyBjbGFzcyBCbHVldG9vdGhTZXJ2aWNlIGV4dGVuZHMgSUJsdWV0b290aC5TdHViIHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkJsdWV0b290aFNlcnZpY2UiOwpAQCAtMTI5LDYgKzEzNCw4IEBACiAgICAgcHJpdmF0ZSBmaW5hbCBCbHVldG9vdGhQcm9maWxlU3RhdGUgbUhmcFByb2ZpbGVTdGF0ZTsKIAogICAgIHByaXZhdGUgQmx1ZXRvb3RoQTJkcFNlcnZpY2UgbUEyZHBTZXJ2aWNlOworICAgIHByaXZhdGUgZmluYWwgSGFzaE1hcDxCbHVldG9vdGhEZXZpY2UsIEludGVnZXI+IG1JbnB1dERldmljZXM7CisKICAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgbURvY2tBZGRyZXNzOwogICAgIHByaXZhdGUgU3RyaW5nIG1Eb2NrUGluOwogCkBAIC0xOTgsNiArMjA1LDcgQEAKIAogICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKEludGVudC5BQ1RJT05fRE9DS19FVkVOVCk7CiAgICAgICAgIG1Db250ZXh0LnJlZ2lzdGVyUmVjZWl2ZXIobVJlY2VpdmVyLCBmaWx0ZXIpOworICAgICAgICBtSW5wdXREZXZpY2VzID0gbmV3IEhhc2hNYXA8Qmx1ZXRvb3RoRGV2aWNlLCBJbnRlZ2VyPigpOwogICAgIH0KIAogICAgIHB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIFN0cmluZyByZWFkRG9ja0JsdWV0b290aEFkZHJlc3MoKSB7CkBAIC0xMjIwLDYgKzEyMjgsMTI3IEBACiAgICAgICAgIHJldHVybiBzcC5jb250YWlucyhTSEFSRURfUFJFRkVSRU5DRV9ET0NLX0FERFJFU1MgKyBhZGRyZXNzKTsKICAgICB9CiAKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gY29ubmVjdElucHV0RGV2aWNlKEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKKyAgICAgICAgbUNvbnRleHQuZW5mb3JjZUNhbGxpbmdPclNlbGZQZXJtaXNzaW9uKEJMVUVUT09USF9BRE1JTl9QRVJNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5lZWQgQkxVRVRPT1RIX0FETUlOIHBlcm1pc3Npb24iKTsKKworICAgICAgICBTdHJpbmcgb2JqZWN0UGF0aCA9IGdldE9iamVjdFBhdGhGcm9tQWRkcmVzcyhkZXZpY2UuZ2V0QWRkcmVzcygpKTsKKyAgICAgICAgaWYgKG9iamVjdFBhdGggPT0gbnVsbCB8fCBnZXRDb25uZWN0ZWRJbnB1dERldmljZXMoKS5sZW5ndGggIT0gMCB8fAorICAgICAgICAgICAgZ2V0SW5wdXREZXZpY2VQcmlvcml0eShkZXZpY2UpID09IEJsdWV0b290aElucHV0RGV2aWNlLlBSSU9SSVRZX09GRikgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmKGNvbm5lY3RJbnB1dERldmljZU5hdGl2ZShvYmplY3RQYXRoKSkgeworICAgICAgICAgICAgaGFuZGxlSW5wdXREZXZpY2VTdGF0ZUNoYW5nZShkZXZpY2UsIEJsdWV0b290aElucHV0RGV2aWNlLlNUQVRFX0NPTk5FQ1RJTkcpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBkaXNjb25uZWN0SW5wdXREZXZpY2UoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgeworICAgICAgICBtQ29udGV4dC5lbmZvcmNlQ2FsbGluZ09yU2VsZlBlcm1pc3Npb24oQkxVRVRPT1RIX0FETUlOX1BFUk0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTmVlZCBCTFVFVE9PVEhfQURNSU4gcGVybWlzc2lvbiIpOworCisgICAgICAgIFN0cmluZyBvYmplY3RQYXRoID0gZ2V0T2JqZWN0UGF0aEZyb21BZGRyZXNzKGRldmljZS5nZXRBZGRyZXNzKCkpOworICAgICAgICBpZiAob2JqZWN0UGF0aCA9PSBudWxsIHx8IGdldENvbm5lY3RlZElucHV0RGV2aWNlcygpLmxlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYoZGlzY29ubmVjdElucHV0RGV2aWNlTmF0aXZlKG9iamVjdFBhdGgpKSB7CisgICAgICAgICAgICBoYW5kbGVJbnB1dERldmljZVN0YXRlQ2hhbmdlKGRldmljZSwgQmx1ZXRvb3RoSW5wdXREZXZpY2UuU1RBVEVfRElTQ09OTkVDVElORyk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHVibGljIHN5bmNocm9uaXplZCBpbnQgZ2V0SW5wdXREZXZpY2VTdGF0ZShCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7CisgICAgICAgIG1Db250ZXh0LmVuZm9yY2VDYWxsaW5nT3JTZWxmUGVybWlzc2lvbihCTFVFVE9PVEhfUEVSTSwgIk5lZWQgQkxVRVRPT1RIIHBlcm1pc3Npb24iKTsKKworICAgICAgICBpZiAobUlucHV0RGV2aWNlcy5nZXQoZGV2aWNlKSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gQmx1ZXRvb3RoSW5wdXREZXZpY2UuU1RBVEVfRElTQ09OTkVDVEVEOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtSW5wdXREZXZpY2VzLmdldChkZXZpY2UpOworICAgIH0KKworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgQmx1ZXRvb3RoRGV2aWNlW10gZ2V0Q29ubmVjdGVkSW5wdXREZXZpY2VzKCkgeworICAgICAgICBtQ29udGV4dC5lbmZvcmNlQ2FsbGluZ09yU2VsZlBlcm1pc3Npb24oQkxVRVRPT1RIX1BFUk0sICJOZWVkIEJMVUVUT09USCBwZXJtaXNzaW9uIik7CisgICAgICAgIFNldDxCbHVldG9vdGhEZXZpY2U+IGRldmljZXMgPSBsb29rdXBJbnB1dERldmljZXNNYXRjaGluZ1N0YXRlcygKKyAgICAgICAgICAgIG5ldyBpbnRbXSB7Qmx1ZXRvb3RoSW5wdXREZXZpY2UuU1RBVEVfQ09OTkVDVEVEfSk7CisgICAgICAgIHJldHVybiBkZXZpY2VzLnRvQXJyYXkobmV3IEJsdWV0b290aERldmljZVtkZXZpY2VzLnNpemUoKV0pOworICAgIH0KKworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IGdldElucHV0RGV2aWNlUHJpb3JpdHkoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgeworICAgICAgICBtQ29udGV4dC5lbmZvcmNlQ2FsbGluZ09yU2VsZlBlcm1pc3Npb24oQkxVRVRPT1RIX1BFUk0sICJOZWVkIEJMVUVUT09USCBwZXJtaXNzaW9uIik7CisgICAgICAgIHJldHVybiBTZXR0aW5ncy5TZWN1cmUuZ2V0SW50KG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLAorICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5nZXRCbHVldG9vdGhJbnB1dERldmljZVByaW9yaXR5S2V5KGRldmljZS5nZXRBZGRyZXNzKCkpLAorICAgICAgICAgICAgICAgIEJsdWV0b290aElucHV0RGV2aWNlLlBSSU9SSVRZX1VOREVGSU5FRCk7CisgICAgfQorCisgICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHNldElucHV0RGV2aWNlUHJpb3JpdHkoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgaW50IHByaW9yaXR5KSB7CisgICAgICAgIG1Db250ZXh0LmVuZm9yY2VDYWxsaW5nT3JTZWxmUGVybWlzc2lvbihCTFVFVE9PVEhfQURNSU5fUEVSTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOZWVkIEJMVUVUT09USF9BRE1JTiBwZXJtaXNzaW9uIik7CisgICAgICAgIGlmICghQmx1ZXRvb3RoQWRhcHRlci5jaGVja0JsdWV0b290aEFkZHJlc3MoZGV2aWNlLmdldEFkZHJlc3MoKSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gU2V0dGluZ3MuU2VjdXJlLnB1dEludChtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKSwKKyAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuZ2V0Qmx1ZXRvb3RoSW5wdXREZXZpY2VQcmlvcml0eUtleShkZXZpY2UuZ2V0QWRkcmVzcygpKSwKKyAgICAgICAgICAgICAgICBwcmlvcml0eSk7CisgICAgfQorCisgICAgLypwYWNrYWdlKi9zeW5jaHJvbml6ZWQgU2V0PEJsdWV0b290aERldmljZT4gbG9va3VwSW5wdXREZXZpY2VzTWF0Y2hpbmdTdGF0ZXMoaW50W10gc3RhdGVzKSB7CisgICAgICAgIFNldDxCbHVldG9vdGhEZXZpY2U+IGlucHV0RGV2aWNlcyA9IG5ldyBIYXNoU2V0PEJsdWV0b290aERldmljZT4oKTsKKyAgICAgICAgaWYgKG1JbnB1dERldmljZXMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICByZXR1cm4gaW5wdXREZXZpY2VzOworICAgICAgICB9CisgICAgICAgIGZvciAoQmx1ZXRvb3RoRGV2aWNlIGRldmljZTogbUlucHV0RGV2aWNlcy5rZXlTZXQoKSkgeworICAgICAgICAgICAgaW50IGlucHV0RGV2aWNlU3RhdGUgPSBnZXRJbnB1dERldmljZVN0YXRlKGRldmljZSk7CisgICAgICAgICAgICBmb3IgKGludCBzdGF0ZSA6IHN0YXRlcykgeworICAgICAgICAgICAgICAgIGlmIChzdGF0ZSA9PSBpbnB1dERldmljZVN0YXRlKSB7CisgICAgICAgICAgICAgICAgICAgIGlucHV0RGV2aWNlcy5hZGQoZGV2aWNlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBpbnB1dERldmljZXM7CisgICAgfQorCisgICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBoYW5kbGVJbnB1dERldmljZVN0YXRlQ2hhbmdlKEJsdWV0b290aERldmljZSBkZXZpY2UsIGludCBzdGF0ZSkgeworICAgICAgICBpbnQgcHJldlN0YXRlOworICAgICAgICBpZiAobUlucHV0RGV2aWNlcy5nZXQoZGV2aWNlKSA9PSBudWxsKSB7CisgICAgICAgICAgICBwcmV2U3RhdGUgPSBCbHVldG9vdGhJbnB1dERldmljZS5TVEFURV9ESVNDT05ORUNURUQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwcmV2U3RhdGUgPSBtSW5wdXREZXZpY2VzLmdldChkZXZpY2UpOworICAgICAgICB9CisgICAgICAgIGlmIChwcmV2U3RhdGUgPT0gc3RhdGUpIHJldHVybjsKKworICAgICAgICBtSW5wdXREZXZpY2VzLnB1dChkZXZpY2UsIHN0YXRlKTsKKworICAgICAgICBpZiAoZ2V0SW5wdXREZXZpY2VQcmlvcml0eShkZXZpY2UpID4KKyAgICAgICAgICAgICAgQmx1ZXRvb3RoSW5wdXREZXZpY2UuUFJJT1JJVFlfT0ZGICYmCisgICAgICAgICAgICBzdGF0ZSA9PSBCbHVldG9vdGhJbnB1dERldmljZS5TVEFURV9DT05ORUNUSU5HIHx8CisgICAgICAgICAgICBzdGF0ZSA9PSBCbHVldG9vdGhJbnB1dERldmljZS5TVEFURV9DT05ORUNURUQpIHsKKyAgICAgICAgICAgIC8vIFdlIGhhdmUgY29ubmVjdGVkIG9yIGF0dGVtcHRpbmcgdG8gY29ubmVjdC4KKyAgICAgICAgICAgIC8vIEJ1bXAgcHJpb3JpdHkKKyAgICAgICAgICAgIHNldElucHV0RGV2aWNlUHJpb3JpdHkoZGV2aWNlLCBCbHVldG9vdGhJbnB1dERldmljZS5QUklPUklUWV9BVVRPX0NPTk5FQ1QpOworICAgICAgICB9CisKKyAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoQmx1ZXRvb3RoSW5wdXREZXZpY2UuQUNUSU9OX0lOUFVUX0RFVklDRV9TVEFURV9DSEFOR0VEKTsKKyAgICAgICAgaW50ZW50LnB1dEV4dHJhKEJsdWV0b290aERldmljZS5FWFRSQV9ERVZJQ0UsIGRldmljZSk7CisgICAgICAgIGludGVudC5wdXRFeHRyYShCbHVldG9vdGhJbnB1dERldmljZS5FWFRSQV9QUkVWSU9VU19JTlBVVF9ERVZJQ0VfU1RBVEUsIHByZXZTdGF0ZSk7CisgICAgICAgIGludGVudC5wdXRFeHRyYShCbHVldG9vdGhJbnB1dERldmljZS5FWFRSQV9JTlBVVF9ERVZJQ0VfU1RBVEUsIHN0YXRlKTsKKyAgICAgICAgbUNvbnRleHQuc2VuZEJyb2FkY2FzdChpbnRlbnQsIEJMVUVUT09USF9QRVJNKTsKKworICAgICAgICBpZiAoREJHKSBsb2coIklucHV0RGV2aWNlIHN0YXRlIDogZGV2aWNlOiAiICsgZGV2aWNlICsgIiBTdGF0ZToiICsgcHJldlN0YXRlICsgIi0+IiArIHN0YXRlKTsKKworICAgIH0KKworICAgIC8qcGFja2FnZSovIHZvaWQgaGFuZGxlSW5wdXREZXZpY2VQcm9wZXJ0eUNoYW5nZShTdHJpbmcgcGF0aCwgYm9vbGVhbiBjb25uZWN0ZWQpIHsKKyAgICAgICAgU3RyaW5nIGFkZHJlc3MgPSBnZXRBZGRyZXNzRnJvbU9iamVjdFBhdGgocGF0aCk7CisgICAgICAgIGlmIChhZGRyZXNzID09IG51bGwpIHJldHVybjsKKyAgICAgICAgaW50IHN0YXRlID0gY29ubmVjdGVkID8gQmx1ZXRvb3RoSW5wdXREZXZpY2UuU1RBVEVfQ09OTkVDVEVEIDoKKyAgICAgICAgICAgIEJsdWV0b290aElucHV0RGV2aWNlLlNUQVRFX0RJU0NPTk5FQ1RFRDsKKyAgICAgICAgQmx1ZXRvb3RoRGV2aWNlIGRldmljZSA9IG1BZGFwdGVyLmdldFJlbW90ZURldmljZShhZGRyZXNzKTsKKyAgICAgICAgaGFuZGxlSW5wdXREZXZpY2VTdGF0ZUNoYW5nZShkZXZpY2UsIHN0YXRlKTsKKyAgICB9CisKICAgICAvKnBhY2thZ2UqLyBib29sZWFuIGlzUmVtb3RlRGV2aWNlSW5DYWNoZShTdHJpbmcgYWRkcmVzcykgewogICAgICAgICByZXR1cm4gKG1EZXZpY2VQcm9wZXJ0aWVzLmdldChhZGRyZXNzKSAhPSBudWxsKTsKICAgICB9CkBAIC0yMTAzLDQgKzIyMzIsNiBAQAogICAgICAgICAgICAgc2hvcnQgY2hhbm5lbCk7CiAgICAgcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiByZW1vdmVTZXJ2aWNlUmVjb3JkTmF0aXZlKGludCBoYW5kbGUpOwogICAgIHByaXZhdGUgbmF0aXZlIGJvb2xlYW4gc2V0TGlua1RpbWVvdXROYXRpdmUoU3RyaW5nIHBhdGgsIGludCBudW1fc2xvdHMpOworICAgIHByaXZhdGUgbmF0aXZlIGJvb2xlYW4gY29ubmVjdElucHV0RGV2aWNlTmF0aXZlKFN0cmluZyBwYXRoKTsKKyAgICBwcml2YXRlIG5hdGl2ZSBib29sZWFuIGRpc2Nvbm5lY3RJbnB1dERldmljZU5hdGl2ZShTdHJpbmcgcGF0aCk7CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L0FuZHJvaWRCaWRpLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L0FuZHJvaWRCaWRpLmphdmEKaW5kZXggZTRmOTM0ZS4uZWFjZDQwZCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9BbmRyb2lkQmlkaS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvQW5kcm9pZEJpZGkuamF2YQpAQCAtMTYsNiArMTYsOCBAQAogCiBwYWNrYWdlIGFuZHJvaWQudGV4dDsKIAoraW1wb3J0IGFuZHJvaWQudGV4dC5MYXlvdXQuRGlyZWN0aW9uczsKKwogLyoqCiAgKiBBY2Nlc3MgdGhlIElDVSBiaWRpIGltcGxlbWVudGF0aW9uLgogICogQGhpZGUKQEAgLTQ0LDUgKzQ2LDEzMiBAQAogICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KIAorICAgIC8qKgorICAgICAqIFJldHVybnMgcnVuIGRpcmVjdGlvbiBpbmZvcm1hdGlvbiBmb3IgYSBsaW5lIHdpdGhpbiBhIHBhcmFncmFwaC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkaXIgYmFzZSBsaW5lIGRpcmVjdGlvbiwgZWl0aGVyIExheW91dC5ESVJfTEVGVF9UT19SSUdIVCBvcgorICAgICAqICAgICBMYXlvdXQuRElSX1JJR0hUX1RPX0xFRlQKKyAgICAgKiBAcGFyYW0gbGV2ZWxzIGxldmVscyBhcyByZXR1cm5lZCBmcm9tIHtAbGluayAjYmlkaX0KKyAgICAgKiBAcGFyYW0gbHN0YXJ0IHN0YXJ0IG9mIHRoZSBsaW5lIGluIHRoZSBsZXZlbHMgYXJyYXkKKyAgICAgKiBAcGFyYW0gY2hhcnMgdGhlIGNoYXJhY3RlciBhcnJheSAodXNlZCB0byBkZXRlcm1pbmUgd2hpdGVzcGFjZSkKKyAgICAgKiBAcGFyYW0gY3N0YXJ0IHRoZSBzdGFydCBvZiB0aGUgbGluZSBpbiB0aGUgY2hhcnMgYXJyYXkKKyAgICAgKiBAcGFyYW0gbGVuIHRoZSBsZW5ndGggb2YgdGhlIGxpbmUKKyAgICAgKiBAcmV0dXJuIHRoZSBkaXJlY3Rpb25zCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBEaXJlY3Rpb25zIGRpcmVjdGlvbnMoaW50IGRpciwgYnl0ZVtdIGxldmVscywgaW50IGxzdGFydCwKKyAgICAgICAgICAgIGNoYXJbXSBjaGFycywgaW50IGNzdGFydCwgaW50IGxlbikgeworCisgICAgICAgIGludCBiYXNlTGV2ZWwgPSBkaXIgPT0gTGF5b3V0LkRJUl9MRUZUX1RPX1JJR0hUID8gMCA6IDE7CisgICAgICAgIGludCBjdXJMZXZlbCA9IGxldmVsc1tsc3RhcnRdOworICAgICAgICBpbnQgbWluTGV2ZWwgPSBjdXJMZXZlbDsKKyAgICAgICAgaW50IHJ1bkNvdW50ID0gMTsKKyAgICAgICAgZm9yIChpbnQgaSA9IGxzdGFydCArIDEsIGUgPSBsc3RhcnQgKyBsZW47IGkgPCBlOyArK2kpIHsKKyAgICAgICAgICAgIGludCBsZXZlbCA9IGxldmVsc1tpXTsKKyAgICAgICAgICAgIGlmIChsZXZlbCAhPSBjdXJMZXZlbCkgeworICAgICAgICAgICAgICAgIGN1ckxldmVsID0gbGV2ZWw7CisgICAgICAgICAgICAgICAgKytydW5Db3VudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIGFkZCBmaW5hbCBydW4gZm9yIHRyYWlsaW5nIGNvdW50ZXItZGlyZWN0aW9uYWwgd2hpdGVzcGFjZQorICAgICAgICBpbnQgdmlzTGVuID0gbGVuOworICAgICAgICBpZiAoKGN1ckxldmVsICYgMSkgIT0gKGJhc2VMZXZlbCAmIDEpKSB7CisgICAgICAgICAgICAvLyBsb29rIGZvciB2aXNpYmxlIGVuZAorICAgICAgICAgICAgd2hpbGUgKC0tdmlzTGVuID49IDApIHsKKyAgICAgICAgICAgICAgICBjaGFyIGNoID0gY2hhcnNbY3N0YXJ0ICsgdmlzTGVuXTsKKworICAgICAgICAgICAgICAgIGlmIChjaCA9PSAnXG4nKSB7CisgICAgICAgICAgICAgICAgICAgIC0tdmlzTGVuOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoY2ggIT0gJyAnICYmIGNoICE9ICdcdCcpIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgKyt2aXNMZW47CisgICAgICAgICAgICBpZiAodmlzTGVuICE9IGxlbikgeworICAgICAgICAgICAgICAgICsrcnVuQ291bnQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAocnVuQ291bnQgPT0gMSAmJiBtaW5MZXZlbCA9PSBiYXNlTGV2ZWwpIHsKKyAgICAgICAgICAgIC8vIHdlJ3JlIGRvbmUsIG9ubHkgb25lIHJ1biBvbiB0aGlzIGxpbmUKKyAgICAgICAgICAgIGlmICgobWluTGV2ZWwgJiAxKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIExheW91dC5ESVJTX0FMTF9SSUdIVF9UT19MRUZUOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIExheW91dC5ESVJTX0FMTF9MRUZUX1RPX1JJR0hUOworICAgICAgICB9CisKKyAgICAgICAgaW50W10gbGQgPSBuZXcgaW50W3J1bkNvdW50ICogMl07CisgICAgICAgIGludCBtYXhMZXZlbCA9IG1pbkxldmVsOworICAgICAgICBpbnQgbGV2ZWxCaXRzID0gbWluTGV2ZWwgPDwgTGF5b3V0LlJVTl9MRVZFTF9TSElGVDsKKyAgICAgICAgeworICAgICAgICAgICAgLy8gU3RhcnQgb2YgZmlyc3QgcGFpciBpcyBhbHdheXMgMCwgd2Ugd3JpdGUKKyAgICAgICAgICAgIC8vIGxlbmd0aCB0aGVuIHN0YXJ0IGF0IGVhY2ggbmV3IHJ1biwgYW5kIHRoZQorICAgICAgICAgICAgLy8gbGFzdCBydW4gbGVuZ3RoIGFmdGVyIHdlJ3JlIGRvbmUuCisgICAgICAgICAgICBpbnQgbiA9IDE7CisgICAgICAgICAgICBpbnQgcHJldiA9IGxzdGFydDsKKyAgICAgICAgICAgIGN1ckxldmVsID0gbWluTGV2ZWw7CisgICAgICAgICAgICBmb3IgKGludCBpID0gbHN0YXJ0LCBlID0gbHN0YXJ0ICsgdmlzTGVuOyBpIDwgZTsgKytpKSB7CisgICAgICAgICAgICAgICAgaW50IGxldmVsID0gbGV2ZWxzW2ldOworICAgICAgICAgICAgICAgIGlmIChsZXZlbCAhPSBjdXJMZXZlbCkgeworICAgICAgICAgICAgICAgICAgICBjdXJMZXZlbCA9IGxldmVsOworICAgICAgICAgICAgICAgICAgICBpZiAobGV2ZWwgPiBtYXhMZXZlbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbWF4TGV2ZWwgPSBsZXZlbDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChsZXZlbCA8IG1pbkxldmVsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtaW5MZXZlbCA9IGxldmVsOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIFhYWCBpZ25vcmUgcnVuIGxlbmd0aCBsaW1pdCBvZiAyXlJVTl9MRVZFTF9TSElGVAorICAgICAgICAgICAgICAgICAgICBsZFtuKytdID0gKGkgLSBwcmV2KSB8IGxldmVsQml0czsKKyAgICAgICAgICAgICAgICAgICAgbGRbbisrXSA9IGkgLSBsc3RhcnQ7CisgICAgICAgICAgICAgICAgICAgIGxldmVsQml0cyA9IGN1ckxldmVsIDw8IExheW91dC5SVU5fTEVWRUxfU0hJRlQ7CisgICAgICAgICAgICAgICAgICAgIHByZXYgPSBpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxkW25dID0gKGxzdGFydCArIHZpc0xlbiAtIHByZXYpIHwgbGV2ZWxCaXRzOworICAgICAgICAgICAgaWYgKHZpc0xlbiA8IGxlbikgeworICAgICAgICAgICAgICAgIGxkWysrbl0gPSB2aXNMZW47CisgICAgICAgICAgICAgICAgbGRbKytuXSA9IChsZW4gLSB2aXNMZW4pIHwgKGJhc2VMZXZlbCA8PCBMYXlvdXQuUlVOX0xFVkVMX1NISUZUKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFNlZSBpZiB3ZSBuZWVkIHRvIHN3YXAgYW55IHJ1bnMuCisgICAgICAgIC8vIElmIHRoZSBtaW4gbGV2ZWwgcnVuIGRpcmVjdGlvbiBkb2Vzbid0IG1hdGNoIHRoZSBiYXNlCisgICAgICAgIC8vIGRpcmVjdGlvbiwgd2UgYWx3YXlzIG5lZWQgdG8gc3dhcCAoYXQgdGhpcyBwb2ludAorICAgICAgICAvLyB3ZSBoYXZlIG1vcmUgdGhhbiBvbmUgcnVuKS4KKyAgICAgICAgLy8gT3RoZXJ3aXNlLCB3ZSBkb24ndCBuZWVkIHRvIHN3YXAgdGhlIGxvd2VzdCBsZXZlbC4KKyAgICAgICAgLy8gU2luY2UgdGhlcmUgYXJlIG5vIGxvZ2ljYWxseSBhZGphY2VudCBydW5zIGF0IHRoZSBzYW1lCisgICAgICAgIC8vIGxldmVsLCBpZiB0aGUgbWF4IGxldmVsIGlzIHRoZSBzYW1lIGFzIHRoZSAobmV3KSBtaW4KKyAgICAgICAgLy8gbGV2ZWwsIHdlIGhhdmUgYSBzZXJpZXMgb2YgYWx0ZXJuYXRpbmcgbGV2ZWxzIHRoYXQKKyAgICAgICAgLy8gaXMgYWxyZWFkeSBpbiBvcmRlciwgc28gdGhlcmUncyBubyBtb3JlIHRvIGRvLgorICAgICAgICAvLworICAgICAgICBib29sZWFuIHN3YXA7CisgICAgICAgIGlmICgobWluTGV2ZWwgJiAxKSA9PSBiYXNlTGV2ZWwpIHsKKyAgICAgICAgICAgIG1pbkxldmVsICs9IDE7CisgICAgICAgICAgICBzd2FwID0gbWF4TGV2ZWwgPiBtaW5MZXZlbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN3YXAgPSBydW5Db3VudCA+IDE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN3YXApIHsKKyAgICAgICAgICAgIGZvciAoaW50IGxldmVsID0gbWF4TGV2ZWwgLSAxOyBsZXZlbCA+PSBtaW5MZXZlbDsgLS1sZXZlbCkgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGQubGVuZ3RoOyBpICs9IDIpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxldmVsc1tsZFtpXV0gPj0gbGV2ZWwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBlID0gaSArIDI7CisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoZSA8IGxkLmxlbmd0aCAmJiBsZXZlbHNbbGRbZV1dID49IGxldmVsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSArPSAyOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgbG93ID0gaSwgaGkgPSBlIC0gMjsgbG93IDwgaGk7IGxvdyArPSAyLCBoaSAtPSAyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHggPSBsZFtsb3ddOyBsZFtsb3ddID0gbGRbaGldOyBsZFtoaV0gPSB4OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHggPSBsZFtsb3crMV07IGxkW2xvdysxXSA9IGxkW2hpKzFdOyBsZFtoaSsxXSA9IHg7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpID0gZSArIDI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ldyBEaXJlY3Rpb25zKGxkKTsKKyAgICB9CisKICAgICBwcml2YXRlIG5hdGl2ZSBzdGF0aWMgaW50IHJ1bkJpZGkoaW50IGRpciwgY2hhcltdIGNocywgYnl0ZVtdIGNoSW5mbywgaW50IG4sIGJvb2xlYW4gaGF2ZUluZm8pOwogfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvQm9yaW5nTGF5b3V0LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L0JvcmluZ0xheW91dC5qYXZhCmluZGV4IDk0NGY3MzUuLjkzMDliMDUgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvQm9yaW5nTGF5b3V0LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9Cb3JpbmdMYXlvdXQuamF2YQpAQCAtMjA4LDExICsyMDgsMTEgQEAKICAgICAgICAgICAgICAqIHdpZHRoIGJlY2F1c2UgdGhlIHdpZHRoIHRoYXQgd2FzIHBhc3NlZCBpbiB3YXMgZm9yIHRoZQogICAgICAgICAgICAgICogZnVsbCB0ZXh0LCBub3QgdGhlIGVsbGlwc2l6ZWQgZm9ybS4KICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgc3luY2hyb25pemVkIChzVGVtcCkgewotICAgICAgICAgICAgICAgIG1NYXggPSAoaW50KSAoRmxvYXRNYXRoLmNlaWwoU3R5bGVkLm1lYXN1cmVUZXh0KHBhaW50LCBzVGVtcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZSwgMCwgc291cmNlLmxlbmd0aCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCkpKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFRleHRMaW5lIGxpbmUgPSBUZXh0TGluZS5vYnRhaW4oKTsKKyAgICAgICAgICAgIGxpbmUuc2V0KHBhaW50LCBzb3VyY2UsIDAsIHNvdXJjZS5sZW5ndGgoKSwgTGF5b3V0LkRJUl9MRUZUX1RPX1JJR0hULAorICAgICAgICAgICAgICAgICAgICBMYXlvdXQuRElSU19BTExfTEVGVF9UT19SSUdIVCwgZmFsc2UsIG51bGwpOworICAgICAgICAgICAgbU1heCA9IChpbnQpIEZsb2F0TWF0aC5jZWlsKGxpbmUubWV0cmljcyhudWxsKSk7CisgICAgICAgICAgICBUZXh0TGluZS5yZWN5Y2xlKGxpbmUpOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKGluY2x1ZGVwYWQpIHsKQEAgLTI3NiwxNCArMjc2LDEzIEBACiAgICAgICAgICAgICBpZiAoZm0gPT0gbnVsbCkgewogICAgICAgICAgICAgICAgIGZtID0gbmV3IE1ldHJpY3MoKTsKICAgICAgICAgICAgIH0KLSAgICAKLSAgICAgICAgICAgIGludCB3aWQ7CiAKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAoc1RlbXApIHsKLSAgICAgICAgICAgICAgICB3aWQgPSAoaW50KSAoRmxvYXRNYXRoLmNlaWwoU3R5bGVkLm1lYXN1cmVUZXh0KHBhaW50LCBzVGVtcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQsIDAsIHRleHQubGVuZ3RoKCksIGZtKSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm0ud2lkdGggPSB3aWQ7CisgICAgICAgICAgICBUZXh0TGluZSBsaW5lID0gVGV4dExpbmUub2J0YWluKCk7CisgICAgICAgICAgICBsaW5lLnNldChwYWludCwgdGV4dCwgMCwgdGV4dC5sZW5ndGgoKSwgTGF5b3V0LkRJUl9MRUZUX1RPX1JJR0hULAorICAgICAgICAgICAgICAgICAgICBMYXlvdXQuRElSU19BTExfTEVGVF9UT19SSUdIVCwgZmFsc2UsIG51bGwpOworICAgICAgICAgICAgZm0ud2lkdGggPSAoaW50KSBGbG9hdE1hdGguY2VpbChsaW5lLm1ldHJpY3MoZm0pKTsKKyAgICAgICAgICAgIFRleHRMaW5lLnJlY3ljbGUobGluZSk7CisKICAgICAgICAgICAgIHJldHVybiBmbTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHJldHVybiBudWxsOwpAQCAtMzg5LDcgKzM4OCw3IEBACiAKICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE1ldHJpY3MgZXh0ZW5kcyBQYWludC5Gb250TWV0cmljc0ludCB7CiAgICAgICAgIHB1YmxpYyBpbnQgd2lkdGg7Ci0gICAgICAgIAorCiAgICAgICAgIEBPdmVycmlkZSBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgICAgICAgICAgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCkgKyAiIHdpZHRoPSIgKyB3aWR0aDsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9EeW5hbWljTGF5b3V0LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L0R5bmFtaWNMYXlvdXQuamF2YQppbmRleCAxNGU1NjU1Li5iNmFhMDNhIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L0R5bmFtaWNMYXlvdXQuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L0R5bmFtaWNMYXlvdXQuamF2YQpAQCAtMzEwLDcgKzMxMCw2IEBACiAKICAgICAgICAgRGlyZWN0aW9uc1tdIG9iamVjdHMgPSBuZXcgRGlyZWN0aW9uc1sxXTsKIAotCiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7CiAgICAgICAgICAgICBpbnRzW1NUQVJUXSA9IHJlZmxvd2VkLmdldExpbmVTdGFydChpKSB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgIChyZWZsb3dlZC5nZXRQYXJhZ3JhcGhEaXJlY3Rpb24oaSkgPDwgRElSX1NISUZUKSB8CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L0dyYXBoaWNzT3BlcmF0aW9ucy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9HcmFwaGljc09wZXJhdGlvbnMuamF2YQppbmRleCBjM2JkMGFlLi5kNDI2ZDEyNCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9HcmFwaGljc09wZXJhdGlvbnMuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L0dyYXBoaWNzT3BlcmF0aW9ucy5qYXZhCkBAIC0zNCwxMyArMzQsMzMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB4LCBmbG9hdCB5LCBQYWludCBwKTsKIAogICAgIC8qKgorICAgICAqIEp1c3QgbGlrZSB7QGxpbmsgQ2FudmFzI2RyYXdUZXh0UnVufS4KKyAgICAgKiB7QGhpZGV9CisgICAgICovCisgICAgdm9pZCBkcmF3VGV4dFJ1bihDYW52YXMgYywgaW50IHN0YXJ0LCBpbnQgZW5kLCBpbnQgY29udGV4dFN0YXJ0LCBpbnQgY29udGV4dEVuZCwKKyAgICAgICAgICAgIGZsb2F0IHgsIGZsb2F0IHksIGludCBmbGFncywgUGFpbnQgcCk7CisKKyAgIC8qKgogICAgICAqIEp1c3QgbGlrZSB7QGxpbmsgUGFpbnQjbWVhc3VyZVRleHR9LgogICAgICAqLwogICAgIGZsb2F0IG1lYXN1cmVUZXh0KGludCBzdGFydCwgaW50IGVuZCwgUGFpbnQgcCk7CiAKLQogICAgIC8qKgogICAgICAqIEp1c3QgbGlrZSB7QGxpbmsgUGFpbnQjZ2V0VGV4dFdpZHRoc30uCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXRUZXh0V2lkdGhzKGludCBzdGFydCwgaW50IGVuZCwgZmxvYXRbXSB3aWR0aHMsIFBhaW50IHApOworCisgICAgLyoqCisgICAgICogSnVzdCBsaWtlIHtAbGluayBQYWludCNnZXRUZXh0UnVuQWR2YW5jZXN9LgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgZmxvYXQgZ2V0VGV4dFJ1bkFkdmFuY2VzKGludCBzdGFydCwgaW50IGVuZCwgaW50IGNvbnRleHRTdGFydCwgaW50IGNvbnRleHRFbmQsCisgICAgICAgICAgICBpbnQgZmxhZ3MsIGZsb2F0W10gYWR2YW5jZXMsIGludCBhZHZhbmNlc0luZGV4LCBQYWludCBwYWludCk7CisKKyAgICAvKioKKyAgICAgKiBKdXN0IGxpa2Uge0BsaW5rIFBhaW50I2dldFRleHRSdW5DdXJzb3J9LgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgaW50IGdldFRleHRSdW5DdXJzb3IoaW50IGNvbnRleHRTdGFydCwgaW50IGNvbnRleHRFbmQsIGludCBmbGFncywgaW50IG9mZnNldCwKKyAgICAgICAgICAgIGludCBjdXJzb3JPcHQsIFBhaW50IHApOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9MYXlvdXQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvTGF5b3V0LmphdmEKaW5kZXggMzhhYzliNy4uZjUzMzk0NCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9MYXlvdXQuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L0xheW91dC5qYXZhCkBAIC0xNiwyOSArMTYsMzMgQEAKIAogcGFja2FnZSBhbmRyb2lkLnRleHQ7CiAKLWltcG9ydCBhbmRyb2lkLmVtb2ppLkVtb2ppRmFjdG9yeTsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50OwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3RGOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGF0aDsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC51dGlsLkFycmF5VXRpbHM7CiAKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0OwotaW1wb3J0IGFuZHJvaWQudGV4dC5zdHlsZS4qOworaW1wb3J0IGFuZHJvaWQuZW1vamkuRW1vamlGYWN0b3J5OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYXRoOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKIGltcG9ydCBhbmRyb2lkLnRleHQubWV0aG9kLlRleHRLZXlMaXN0ZW5lcjsKK2ltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuQWxpZ25tZW50U3BhbjsKK2ltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuTGVhZGluZ01hcmdpblNwYW47CitpbXBvcnQgYW5kcm9pZC50ZXh0LnN0eWxlLkxpbmVCYWNrZ3JvdW5kU3BhbjsKK2ltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuUGFyYWdyYXBoU3R5bGU7CitpbXBvcnQgYW5kcm9pZC50ZXh0LnN0eWxlLlJlcGxhY2VtZW50U3BhbjsKK2ltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuVGFiU3RvcFNwYW47CitpbXBvcnQgYW5kcm9pZC50ZXh0LnN0eWxlLkxlYWRpbmdNYXJnaW5TcGFuLkxlYWRpbmdNYXJnaW5TcGFuMjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7CiAKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworCiAvKioKLSAqIEEgYmFzZSBjbGFzcyB0aGF0IG1hbmFnZXMgdGV4dCBsYXlvdXQgaW4gdmlzdWFsIGVsZW1lbnRzIG9uIAotICogdGhlIHNjcmVlbi4gCi0gKiA8cD5Gb3IgdGV4dCB0aGF0IHdpbGwgYmUgZWRpdGVkLCB1c2UgYSB7QGxpbmsgRHluYW1pY0xheW91dH0sIAotICogd2hpY2ggd2lsbCBiZSB1cGRhdGVkIGFzIHRoZSB0ZXh0IGNoYW5nZXMuICAKKyAqIEEgYmFzZSBjbGFzcyB0aGF0IG1hbmFnZXMgdGV4dCBsYXlvdXQgaW4gdmlzdWFsIGVsZW1lbnRzIG9uCisgKiB0aGUgc2NyZWVuLgorICogPHA+Rm9yIHRleHQgdGhhdCB3aWxsIGJlIGVkaXRlZCwgdXNlIGEge0BsaW5rIER5bmFtaWNMYXlvdXR9LAorICogd2hpY2ggd2lsbCBiZSB1cGRhdGVkIGFzIHRoZSB0ZXh0IGNoYW5nZXMuCiAgKiBGb3IgdGV4dCB0aGF0IHdpbGwgbm90IGNoYW5nZSwgdXNlIGEge0BsaW5rIFN0YXRpY0xheW91dH0uCiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBMYXlvdXQgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBmYWxzZTsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQYXJhZ3JhcGhTdHlsZVtdIE5PX1BBUkFfU1BBTlMgPQogICAgICAgICBBcnJheVV0aWxzLmVtcHR5QXJyYXkoUGFyYWdyYXBoU3R5bGUuY2xhc3MpOwogCkBAIC01NCw5ICs1OCw3IEBACiAgICAgICAgICAgICBNSU5fRU1PSkkgPSAtMTsKICAgICAgICAgICAgIE1BWF9FTU9KSSA9IC0xOwogICAgICAgICB9Ci0gICAgfTsKLQotICAgIHByaXZhdGUgUmVjdEYgbUVtb2ppUmVjdDsKKyAgICB9CiAKICAgICAvKioKICAgICAgKiBSZXR1cm4gaG93IHdpZGUgYSBsYXlvdXQgbXVzdCBiZSBpbiBvcmRlciB0byBkaXNwbGF5IHRoZQpAQCAtNjYsNyArNjgsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRleHRQYWludCBwYWludCkgewogICAgICAgICByZXR1cm4gZ2V0RGVzaXJlZFdpZHRoKHNvdXJjZSwgMCwgc291cmNlLmxlbmd0aCgpLCBwYWludCk7CiAgICAgfQotICAgIAorCiAgICAgLyoqCiAgICAgICogUmV0dXJuIGhvdyB3aWRlIGEgbGF5b3V0IG11c3QgYmUgaW4gb3JkZXIgdG8gZGlzcGxheSB0aGUKICAgICAgKiBzcGVjaWZpZWQgdGV4dCBzbGljZSB3aXRoIG9uZSBsaW5lIHBlciBwYXJhZ3JhcGguCkBAIC04NSw4ICs4Nyw3IEBACiAgICAgICAgICAgICAgICAgbmV4dCA9IGVuZDsKIAogICAgICAgICAgICAgLy8gbm90ZSwgb21pdHMgdHJhaWxpbmcgcGFyYWdyYXBoIGNoYXIKLSAgICAgICAgICAgIGZsb2F0IHcgPSBtZWFzdXJlVGV4dChwYWludCwgd29ya1BhaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZSwgaSwgbmV4dCwgbnVsbCwgdHJ1ZSwgbnVsbCk7CisgICAgICAgICAgICBmbG9hdCB3ID0gbWVhc3VyZVBhcmEocGFpbnQsIHdvcmtQYWludCwgc291cmNlLCBpLCBuZXh0KTsKIAogICAgICAgICAgICAgaWYgKHcgPiBuZWVkKQogICAgICAgICAgICAgICAgIG5lZWQgPSB3OwpAQCAtMTE2LDYgKzExNywxNSBAQAogICAgICAgICBpZiAod2lkdGggPCAwKQogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTGF5b3V0OiAiICsgd2lkdGggKyAiIDwgMCIpOwogCisgICAgICAgIC8vIEVuc3VyZSBwYWludCBkb2Vzbid0IGhhdmUgYmFzZWxpbmVTaGlmdCBzZXQuCisgICAgICAgIC8vIFdoaWxlIG5vcm1hbGx5IHdlIGRvbid0IG1vZGlmeSB0aGUgcGFpbnQgdGhlIHVzZXIgcGFzc2VkIGluLAorICAgICAgICAvLyB3ZSB3ZXJlIGFscmVhZHkgZG9pbmcgdGhpcyBpbiBTdHlsZWQuZHJhd1VuaWZvcm1SdW4gd2l0aCBib3RoCisgICAgICAgIC8vIGJhc2VsaW5lU2hpZnQgYW5kIGJnQ29sb3IuICBXZSBwcm9iYWJseSBzaG91bGQgcmVldmFsdWF0ZSBiZ0NvbG9yLgorICAgICAgICBpZiAocGFpbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgcGFpbnQuYmdDb2xvciA9IDA7CisgICAgICAgICAgICBwYWludC5iYXNlbGluZVNoaWZ0ID0gMDsKKyAgICAgICAgfQorCiAgICAgICAgIG1UZXh0ID0gdGV4dDsKICAgICAgICAgbVBhaW50ID0gcGFpbnQ7CiAgICAgICAgIG1Xb3JrUGFpbnQgPSBuZXcgVGV4dFBhaW50KCk7CkBAIC0xNzUsNyArMTg1LDYgQEAKICAgICAgICAgICAgIGRib3R0b20gPSBzVGVtcFJlY3QuYm90dG9tOwogICAgICAgICB9CiAKLQogICAgICAgICBpbnQgdG9wID0gMDsKICAgICAgICAgaW50IGJvdHRvbSA9IGdldExpbmVUb3AoZ2V0TGluZUNvdW50KCkpOwogCkBAIC0xODUsMjYgKzE5NCwyOCBAQAogICAgICAgICBpZiAoZGJvdHRvbSA8IGJvdHRvbSkgewogICAgICAgICAgICAgYm90dG9tID0gZGJvdHRvbTsKICAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaW50IGZpcnN0ID0gZ2V0TGluZUZvclZlcnRpY2FsKHRvcCk7IAorCisgICAgICAgIGludCBmaXJzdCA9IGdldExpbmVGb3JWZXJ0aWNhbCh0b3ApOwogICAgICAgICBpbnQgbGFzdCA9IGdldExpbmVGb3JWZXJ0aWNhbChib3R0b20pOwotICAgICAgICAKKwogICAgICAgICBpbnQgcHJldmlvdXNMaW5lQm90dG9tID0gZ2V0TGluZVRvcChmaXJzdCk7CiAgICAgICAgIGludCBwcmV2aW91c0xpbmVFbmQgPSBnZXRMaW5lU3RhcnQoZmlyc3QpOwotICAgICAgICAKKwogICAgICAgICBUZXh0UGFpbnQgcGFpbnQgPSBtUGFpbnQ7CiAgICAgICAgIENoYXJTZXF1ZW5jZSBidWYgPSBtVGV4dDsKICAgICAgICAgaW50IHdpZHRoID0gbVdpZHRoOwogICAgICAgICBib29sZWFuIHNwYW5uZWRUZXh0ID0gbVNwYW5uZWRUZXh0OwogCiAgICAgICAgIFBhcmFncmFwaFN0eWxlW10gc3BhbnMgPSBOT19QQVJBX1NQQU5TOwotICAgICAgICBpbnQgc3BhbmVuZCA9IDA7CisgICAgICAgIGludCBzcGFuRW5kID0gMDsKICAgICAgICAgaW50IHRleHRMZW5ndGggPSAwOwogCiAgICAgICAgIC8vIEZpcnN0LCBkcmF3IExpbmVCYWNrZ3JvdW5kU3BhbnMuCi0gICAgICAgIC8vIExpbmVCYWNrZ3JvdW5kU3BhbnMga25vdyBub3RoaW5nIGFib3V0IHRoZSBhbGlnbm1lbnQgb3IgZGlyZWN0aW9uIG9mCi0gICAgICAgIC8vIHRoZSBsYXlvdXQgb3IgbGluZS4gIFhYWDogU2hvdWxkIHRoZXk/CisgICAgICAgIC8vIExpbmVCYWNrZ3JvdW5kU3BhbnMga25vdyBub3RoaW5nIGFib3V0IHRoZSBhbGlnbm1lbnQsIG1hcmdpbnMsIG9yCisgICAgICAgIC8vIGRpcmVjdGlvbiBvZiB0aGUgbGF5b3V0IG9yIGxpbmUuICBYWFg6IFNob3VsZCB0aGV5PworICAgICAgICAvLyBUaGV5IGFyZSBldmFsdWF0ZWQgYXQgZWFjaCBsaW5lLgogICAgICAgICBpZiAoc3Bhbm5lZFRleHQpIHsKKyAgICAgICAgICAgIFNwYW5uZWQgc3AgPSAoU3Bhbm5lZCkgYnVmOwogICAgICAgICAgICAgdGV4dExlbmd0aCA9IGJ1Zi5sZW5ndGgoKTsKICAgICAgICAgICAgIGZvciAoaW50IGkgPSBmaXJzdDsgaSA8PSBsYXN0OyBpKyspIHsKICAgICAgICAgICAgICAgICBpbnQgc3RhcnQgPSBwcmV2aW91c0xpbmVFbmQ7CkBAIC0yMTYsMTIgKzIyNywxNCBAQAogICAgICAgICAgICAgICAgIHByZXZpb3VzTGluZUJvdHRvbSA9IGxib3R0b207CiAgICAgICAgICAgICAgICAgaW50IGxiYXNlbGluZSA9IGxib3R0b20gLSBnZXRMaW5lRGVzY2VudChpKTsKIAotICAgICAgICAgICAgICAgIGlmIChzdGFydCA+PSBzcGFuZW5kKSB7Ci0gICAgICAgICAgICAgICAgICAgU3Bhbm5lZCBzcCA9IChTcGFubmVkKSBidWY7Ci0gICAgICAgICAgICAgICAgICAgc3BhbmVuZCA9IHNwLm5leHRTcGFuVHJhbnNpdGlvbihzdGFydCwgdGV4dExlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpbmVCYWNrZ3JvdW5kU3Bhbi5jbGFzcyk7Ci0gICAgICAgICAgICAgICAgICAgc3BhbnMgPSBzcC5nZXRTcGFucyhzdGFydCwgc3BhbmVuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpbmVCYWNrZ3JvdW5kU3Bhbi5jbGFzcyk7CisgICAgICAgICAgICAgICAgaWYgKHN0YXJ0ID49IHNwYW5FbmQpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVGhlc2Ugc2hvdWxkIGJlIGluZnJlcXVlbnQsIHNvIHdlJ2xsIHVzZSB0aGlzIHNvIHRoYXQKKyAgICAgICAgICAgICAgICAgICAgLy8gd2UgZG9uJ3QgaGF2ZSB0byBjaGVjayBhcyBvZnRlbi4KKyAgICAgICAgICAgICAgICAgICAgc3BhbkVuZCA9IHNwLm5leHRTcGFuVHJhbnNpdGlvbihzdGFydCwgdGV4dExlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaW5lQmFja2dyb3VuZFNwYW4uY2xhc3MpOworICAgICAgICAgICAgICAgICAgICAvLyBBbGwgTGluZUJhY2tncm91bmRTcGFucyBvbiBhIGxpbmUgY29udHJpYnV0ZSB0byBpdHMKKyAgICAgICAgICAgICAgICAgICAgLy8gYmFja2dyb3VuZC4KKyAgICAgICAgICAgICAgICAgICBzcGFucyA9IHNwLmdldFNwYW5zKHN0YXJ0LCBlbmQsIExpbmVCYWNrZ3JvdW5kU3Bhbi5jbGFzcyk7CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgZm9yIChpbnQgbiA9IDA7IG4gPCBzcGFucy5sZW5ndGg7IG4rKykgewpAQCAtMjM0LDExICsyNDcsMTEgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAvLyByZXNldCB0byB0aGVpciBvcmlnaW5hbCB2YWx1ZXMKLSAgICAgICAgICAgIHNwYW5lbmQgPSAwOworICAgICAgICAgICAgc3BhbkVuZCA9IDA7CiAgICAgICAgICAgICBwcmV2aW91c0xpbmVCb3R0b20gPSBnZXRMaW5lVG9wKGZpcnN0KTsKICAgICAgICAgICAgIHByZXZpb3VzTGluZUVuZCA9IGdldExpbmVTdGFydChmaXJzdCk7CiAgICAgICAgICAgICBzcGFucyA9IE5PX1BBUkFfU1BBTlM7Ci0gICAgICAgIH0gCisgICAgICAgIH0KIAogICAgICAgICAvLyBUaGVyZSBjYW4gYmUgYSBoaWdobGlnaHQgZXZlbiB3aXRob3V0IHNwYW5zIGlmIHdlIGFyZSBkcmF3aW5nCiAgICAgICAgIC8vIGEgbm9uLXNwYW5uZWQgdHJhbnNmb3JtYXRpb24gb2YgYSBzcGFubmVkIGVkaXRpbmcgYnVmZmVyLgpAQCAtMjU1LDcgKzI2OCwxMSBAQAogICAgICAgICB9CiAKICAgICAgICAgQWxpZ25tZW50IGFsaWduID0gbUFsaWdubWVudDsKLSAgICAgICAgCisgICAgICAgIFRhYlN0b3BzIHRhYlN0b3BzID0gbnVsbDsKKyAgICAgICAgYm9vbGVhbiB0YWJTdG9wc0lzSW5pdGlhbGl6ZWQgPSBmYWxzZTsKKworICAgICAgICBUZXh0TGluZSB0bCA9IFRleHRMaW5lLm9idGFpbigpOworCiAgICAgICAgIC8vIE5leHQgZHJhdyB0aGUgbGluZXMsIG9uZSBhdCBhIHRpbWUuCiAgICAgICAgIC8vIHRoZSBiYXNlbGluZSBpcyB0aGUgdG9wIG9mIHRoZSBmb2xsb3dpbmcgbGluZSBtaW51cyB0aGUgY3VycmVudAogICAgICAgICAvLyBsaW5lJ3MgZGVzY2VudC4KQEAgLTI3MCwxOSArMjg3LDMwIEBACiAgICAgICAgICAgICBwcmV2aW91c0xpbmVCb3R0b20gPSBsYm90dG9tOwogICAgICAgICAgICAgaW50IGxiYXNlbGluZSA9IGxib3R0b20gLSBnZXRMaW5lRGVzY2VudChpKTsKIAotICAgICAgICAgICAgYm9vbGVhbiBpc0ZpcnN0UGFyYUxpbmUgPSBmYWxzZTsKLSAgICAgICAgICAgIGlmIChzcGFubmVkVGV4dCkgeyAKLSAgICAgICAgICAgICAgICBpZiAoc3RhcnQgPT0gMCB8fCBidWYuY2hhckF0KHN0YXJ0IC0gMSkgPT0gJ1xuJykgewotICAgICAgICAgICAgICAgICAgICBpc0ZpcnN0UGFyYUxpbmUgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBOZXcgYmF0Y2ggb2YgcGFyYWdyYXBoIHN0eWxlcywgY29tcHV0ZSB0aGUgYWxpZ25tZW50LgotICAgICAgICAgICAgICAgIC8vIExhc3QgYWxpZ25tZW50IHN0eWxlIHdpbnMuCi0gICAgICAgICAgICAgICAgaWYgKHN0YXJ0ID49IHNwYW5lbmQpIHsKLSAgICAgICAgICAgICAgICAgICAgU3Bhbm5lZCBzcCA9IChTcGFubmVkKSBidWY7Ci0gICAgICAgICAgICAgICAgICAgIHNwYW5lbmQgPSBzcC5uZXh0U3BhblRyYW5zaXRpb24oc3RhcnQsIHRleHRMZW5ndGgsCisgICAgICAgICAgICBpbnQgZGlyID0gZ2V0UGFyYWdyYXBoRGlyZWN0aW9uKGkpOworICAgICAgICAgICAgaW50IGxlZnQgPSAwOworICAgICAgICAgICAgaW50IHJpZ2h0ID0gbVdpZHRoOworCisgICAgICAgICAgICBpZiAoc3Bhbm5lZFRleHQpIHsKKyAgICAgICAgICAgICAgICBTcGFubmVkIHNwID0gKFNwYW5uZWQpIGJ1ZjsKKyAgICAgICAgICAgICAgICBib29sZWFuIGlzRmlyc3RQYXJhTGluZSA9IChzdGFydCA9PSAwIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBidWYuY2hhckF0KHN0YXJ0IC0gMSkgPT0gJ1xuJyk7CisKKyAgICAgICAgICAgICAgICAvLyBOZXcgYmF0Y2ggb2YgcGFyYWdyYXBoIHN0eWxlcywgY29sbGVjdCBpbnRvIHNwYW5zIGFycmF5LgorICAgICAgICAgICAgICAgIC8vIENvbXB1dGUgdGhlIGFsaWdubWVudCwgbGFzdCBhbGlnbm1lbnQgc3R5bGUgd2lucy4KKyAgICAgICAgICAgICAgICAvLyBSZXNldCB0YWJTdG9wcywgd2UnbGwgcmVidWlsZCBpZiB3ZSBlbmNvdW50ZXIgYSBsaW5lIHdpdGgKKyAgICAgICAgICAgICAgICAvLyB0YWJzLgorICAgICAgICAgICAgICAgIC8vIFdlIGV4cGVjdCBwYXJhZ3JhcGggc3BhbnMgdG8gYmUgcmVsYXRpdmVseSBpbmZyZXF1ZW50LCB1c2UKKyAgICAgICAgICAgICAgICAvLyBzcGFuRW5kIHNvIHRoYXQgd2UgY2FuIGNoZWNrIGxlc3MgZnJlcXVlbnRseS4gIFNpbmNlCisgICAgICAgICAgICAgICAgLy8gcGFyYWdyYXBoIHN0eWxlcyBvdWdodCB0byBhcHBseSB0byBlbnRpcmUgcGFyYWdyYXBocywgd2UgY2FuCisgICAgICAgICAgICAgICAgLy8ganVzdCBjb2xsZWN0IHRoZSBvbmVzIHByZXNlbnQgYXQgdGhlIHN0YXJ0IG9mIHRoZSBwYXJhZ3JhcGguCisgICAgICAgICAgICAgICAgLy8gSWYgc3BhbkVuZCBpcyBiZWZvcmUgdGhlIGVuZCBvZiB0aGUgcGFyYWdyYXBoLCB0aGF0J3Mgbm90CisgICAgICAgICAgICAgICAgLy8gb3VyIHByb2JsZW0uCisgICAgICAgICAgICAgICAgaWYgKHN0YXJ0ID49IHNwYW5FbmQgJiYgKGkgPT0gZmlyc3QgfHwgaXNGaXJzdFBhcmFMaW5lKSkgeworICAgICAgICAgICAgICAgICAgICBzcGFuRW5kID0gc3AubmV4dFNwYW5UcmFuc2l0aW9uKHN0YXJ0LCB0ZXh0TGVuZ3RoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFncmFwaFN0eWxlLmNsYXNzKTsKLSAgICAgICAgICAgICAgICAgICAgc3BhbnMgPSBzcC5nZXRTcGFucyhzdGFydCwgc3BhbmVuZCwgUGFyYWdyYXBoU3R5bGUuY2xhc3MpOwotICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgc3BhbnMgPSBzcC5nZXRTcGFucyhzdGFydCwgc3BhbkVuZCwgUGFyYWdyYXBoU3R5bGUuY2xhc3MpOworCiAgICAgICAgICAgICAgICAgICAgIGFsaWduID0gbUFsaWdubWVudDsKICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgbiA9IHNwYW5zLmxlbmd0aC0xOyBuID49IDA7IG4tLSkgewogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNwYW5zW25dIGluc3RhbmNlb2YgQWxpZ25tZW50U3BhbikgewpAQCAtMjkwLDQ1ICszMTgsNDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgaW50IGRpciA9IGdldFBhcmFncmFwaERpcmVjdGlvbihpKTsKLSAgICAgICAgICAgIGludCBsZWZ0ID0gMDsKLSAgICAgICAgICAgIGludCByaWdodCA9IG1XaWR0aDsKIAotICAgICAgICAgICAgLy8gRHJhdyBhbGwgbGVhZGluZyBtYXJnaW4gc3BhbnMuICBBZGp1c3QgbGVmdCBvciByaWdodCBhY2NvcmRpbmcKLSAgICAgICAgICAgIC8vIHRvIHRoZSBwYXJhZ3JhcGggZGlyZWN0aW9uIG9mIHRoZSBsaW5lLgotICAgICAgICAgICAgaWYgKHNwYW5uZWRUZXh0KSB7CisgICAgICAgICAgICAgICAgICAgIHRhYlN0b3BzSXNJbml0aWFsaXplZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIERyYXcgYWxsIGxlYWRpbmcgbWFyZ2luIHNwYW5zLiAgQWRqdXN0IGxlZnQgb3IgcmlnaHQgYWNjb3JkaW5nCisgICAgICAgICAgICAgICAgLy8gdG8gdGhlIHBhcmFncmFwaCBkaXJlY3Rpb24gb2YgdGhlIGxpbmUuCiAgICAgICAgICAgICAgICAgZmluYWwgaW50IGxlbmd0aCA9IHNwYW5zLmxlbmd0aDsKICAgICAgICAgICAgICAgICBmb3IgKGludCBuID0gMDsgbiA8IGxlbmd0aDsgbisrKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChzcGFuc1tuXSBpbnN0YW5jZW9mIExlYWRpbmdNYXJnaW5TcGFuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBMZWFkaW5nTWFyZ2luU3BhbiBtYXJnaW4gPSAoTGVhZGluZ01hcmdpblNwYW4pIHNwYW5zW25dOworICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiB1c2VGaXJzdExpbmVNYXJnaW4gPSBpc0ZpcnN0UGFyYUxpbmU7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWFyZ2luIGluc3RhbmNlb2YgTGVhZGluZ01hcmdpblNwYW4yKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50ID0gKChMZWFkaW5nTWFyZ2luU3BhbjIpIG1hcmdpbikuZ2V0TGVhZGluZ01hcmdpbkxpbmVDb3VudCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydExpbmUgPSBnZXRMaW5lRm9yT2Zmc2V0KHNwLmdldFNwYW5TdGFydChtYXJnaW4pKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VGaXJzdExpbmVNYXJnaW4gPSBpIDwgc3RhcnRMaW5lICsgY291bnQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkaXIgPT0gRElSX1JJR0hUX1RPX0xFRlQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW4uZHJhd0xlYWRpbmdNYXJnaW4oYywgcGFpbnQsIHJpZ2h0LCBkaXIsIGx0b3AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxiYXNlbGluZSwgbGJvdHRvbSwgYnVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCwgZW5kLCBpc0ZpcnN0UGFyYUxpbmUsIHRoaXMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByaWdodCAtPSBtYXJnaW4uZ2V0TGVhZGluZ01hcmdpbihpc0ZpcnN0UGFyYUxpbmUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0IC09IG1hcmdpbi5nZXRMZWFkaW5nTWFyZ2luKHVzZUZpcnN0TGluZU1hcmdpbik7CiAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmdpbi5kcmF3TGVhZGluZ01hcmdpbihjLCBwYWludCwgbGVmdCwgZGlyLCBsdG9wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYmFzZWxpbmUsIGxib3R0b20sIGJ1ZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQsIGVuZCwgaXNGaXJzdFBhcmFMaW5lLCB0aGlzKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gdXNlTWFyZ2luID0gaXNGaXJzdFBhcmFMaW5lOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXJnaW4gaW5zdGFuY2VvZiBMZWFkaW5nTWFyZ2luU3Bhbi5MZWFkaW5nTWFyZ2luU3BhbjIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50ID0gKChMZWFkaW5nTWFyZ2luU3Bhbi5MZWFkaW5nTWFyZ2luU3BhbjIpbWFyZ2luKS5nZXRMZWFkaW5nTWFyZ2luTGluZUNvdW50KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZU1hcmdpbiA9IGNvdW50ID4gaTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdCArPSBtYXJnaW4uZ2V0TGVhZGluZ01hcmdpbih1c2VNYXJnaW4pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQgKz0gbWFyZ2luLmdldExlYWRpbmdNYXJnaW4odXNlRmlyc3RMaW5lTWFyZ2luKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgLy8gQWRqdXN0IHRoZSBwb2ludCBhdCB3aGljaCB0byBzdGFydCByZW5kZXJpbmcgZGVwZW5kaW5nIG9uIHRoZQotICAgICAgICAgICAgLy8gYWxpZ25tZW50IG9mIHRoZSBwYXJhZ3JhcGguCisgICAgICAgICAgICBib29sZWFuIGhhc1RhYk9yRW1vamkgPSBnZXRMaW5lQ29udGFpbnNUYWIoaSk7CisgICAgICAgICAgICAvLyBDYW4ndCB0ZWxsIGlmIHdlIGhhdmUgdGFicyBmb3Igc3VyZSwgY3VycmVudGx5CisgICAgICAgICAgICBpZiAoaGFzVGFiT3JFbW9qaSAmJiAhdGFiU3RvcHNJc0luaXRpYWxpemVkKSB7CisgICAgICAgICAgICAgICAgaWYgKHRhYlN0b3BzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdGFiU3RvcHMgPSBuZXcgVGFiU3RvcHMoVEFCX0lOQ1JFTUVOVCwgc3BhbnMpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHRhYlN0b3BzLnJlc2V0KFRBQl9JTkNSRU1FTlQsIHNwYW5zKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdGFiU3RvcHNJc0luaXRpYWxpemVkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgaW50IHg7CiAgICAgICAgICAgICBpZiAoYWxpZ24gPT0gQWxpZ25tZW50LkFMSUdOX05PUk1BTCkgewogICAgICAgICAgICAgICAgIGlmIChkaXIgPT0gRElSX0xFRlRfVE9fUklHSFQpIHsKQEAgLTMzNyw0MSArMzY5LDgwIEBACiAgICAgICAgICAgICAgICAgICAgIHggPSByaWdodDsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGludCBtYXggPSAoaW50KWdldExpbmVNYXgoaSwgc3BhbnMsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICBpbnQgbWF4ID0gKGludClnZXRMaW5lRXh0ZW50KGksIHRhYlN0b3BzLCBmYWxzZSk7CiAgICAgICAgICAgICAgICAgaWYgKGFsaWduID09IEFsaWdubWVudC5BTElHTl9PUFBPU0lURSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoZGlyID09IERJUl9SSUdIVF9UT19MRUZUKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4ID0gbGVmdCArIG1heDsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRpciA9PSBESVJfTEVGVF9UT19SSUdIVCkgewogICAgICAgICAgICAgICAgICAgICAgICAgeCA9IHJpZ2h0IC0gbWF4OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gQWxpZ25tZW50LkFMSUdOX0NFTlRFUgotICAgICAgICAgICAgICAgICAgICBtYXggPSBtYXggJiB+MTsKLSAgICAgICAgICAgICAgICAgICAgaW50IGhhbGYgPSAocmlnaHQgLSBsZWZ0IC0gbWF4KSA+PiAxOwotICAgICAgICAgICAgICAgICAgICBpZiAoZGlyID09IERJUl9SSUdIVF9UT19MRUZUKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4ID0gcmlnaHQgLSBoYWxmOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgeCA9IGxlZnQgKyBoYWxmOworICAgICAgICAgICAgICAgICAgICAgICAgeCA9IGxlZnQgLSBtYXg7CiAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeyAvLyBBbGlnbm1lbnQuQUxJR05fQ0VOVEVSCisgICAgICAgICAgICAgICAgICAgIG1heCA9IG1heCAmIH4xOworICAgICAgICAgICAgICAgICAgICB4ID0gKHJpZ2h0ICsgbGVmdCAtIG1heCkgPj4gMTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIERpcmVjdGlvbnMgZGlyZWN0aW9ucyA9IGdldExpbmVEaXJlY3Rpb25zKGkpOwotICAgICAgICAgICAgYm9vbGVhbiBoYXNUYWIgPSBnZXRMaW5lQ29udGFpbnNUYWIoaSk7CiAgICAgICAgICAgICBpZiAoZGlyZWN0aW9ucyA9PSBESVJTX0FMTF9MRUZUX1RPX1JJR0hUICYmCi0gICAgICAgICAgICAgICAgICAgICFzcGFubmVkVGV4dCAmJiAhaGFzVGFiKSB7Ci0gICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKGRpciA9PSBESVJfTEVGVF9UT19SSUdIVCk7Ci0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnROb3ROdWxsKGMpOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgIXNwYW5uZWRUZXh0ICYmICFoYXNUYWJPckVtb2ppKSB7CiAgICAgICAgICAgICAgICAgLy8gWFhYOiBhc3N1bWVzIHRoZXJlJ3Mgbm90aGluZyBhZGRpdGlvbmFsIHRvIGJlIGRvbmUKICAgICAgICAgICAgICAgICBjLmRyYXdUZXh0KGJ1Ziwgc3RhcnQsIGVuZCwgeCwgbGJhc2VsaW5lLCBwYWludCk7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGRyYXdUZXh0KGMsIGJ1Ziwgc3RhcnQsIGVuZCwgZGlyLCBkaXJlY3Rpb25zLAotICAgICAgICAgICAgICAgICAgICB4LCBsdG9wLCBsYmFzZWxpbmUsIGxib3R0b20sIHBhaW50LCBtV29ya1BhaW50LAotICAgICAgICAgICAgICAgICAgICBoYXNUYWIsIHNwYW5zKTsKKyAgICAgICAgICAgICAgICB0bC5zZXQocGFpbnQsIGJ1Ziwgc3RhcnQsIGVuZCwgZGlyLCBkaXJlY3Rpb25zLCBoYXNUYWJPckVtb2ppLCB0YWJTdG9wcyk7CisgICAgICAgICAgICAgICAgdGwuZHJhdyhjLCB4LCBsdG9wLCBsYmFzZWxpbmUsIGxib3R0b20pOwogICAgICAgICAgICAgfQogICAgICAgICB9CisKKyAgICAgICAgVGV4dExpbmUucmVjeWNsZSh0bCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBzdGFydCBwb3NpdGlvbiBvZiB0aGUgbGluZSwgZ2l2ZW4gdGhlIGxlZnQgYW5kIHJpZ2h0IGJvdW5kcworICAgICAqIG9mIHRoZSBtYXJnaW5zLgorICAgICAqCisgICAgICogQHBhcmFtIGxpbmUgdGhlIGxpbmUgaW5kZXgKKyAgICAgKiBAcGFyYW0gbGVmdCB0aGUgbGVmdCBib3VuZHMgKDAsIG9yIGxlYWRpbmcgbWFyZ2luIGlmIGx0ciBwYXJhKQorICAgICAqIEBwYXJhbSByaWdodCB0aGUgcmlnaHQgYm91bmRzICh3aWR0aCwgbWludXMgbGVhZGluZyBtYXJnaW4gaWYgcnRsIHBhcmEpCisgICAgICogQHJldHVybiB0aGUgc3RhcnQgcG9zaXRpb24gb2YgdGhlIGxpbmUgKHRvIHJpZ2h0IG9mIGxpbmUgaWYgcnRsIHBhcmEpCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgZ2V0TGluZVN0YXJ0UG9zKGludCBsaW5lLCBpbnQgbGVmdCwgaW50IHJpZ2h0KSB7CisgICAgICAgIC8vIEFkanVzdCB0aGUgcG9pbnQgYXQgd2hpY2ggdG8gc3RhcnQgcmVuZGVyaW5nIGRlcGVuZGluZyBvbiB0aGUKKyAgICAgICAgLy8gYWxpZ25tZW50IG9mIHRoZSBwYXJhZ3JhcGguCisgICAgICAgIEFsaWdubWVudCBhbGlnbiA9IGdldFBhcmFncmFwaEFsaWdubWVudChsaW5lKTsKKyAgICAgICAgaW50IGRpciA9IGdldFBhcmFncmFwaERpcmVjdGlvbihsaW5lKTsKKworICAgICAgICBpbnQgeDsKKyAgICAgICAgaWYgKGFsaWduID09IEFsaWdubWVudC5BTElHTl9OT1JNQUwpIHsKKyAgICAgICAgICAgIGlmIChkaXIgPT0gRElSX0xFRlRfVE9fUklHSFQpIHsKKyAgICAgICAgICAgICAgICB4ID0gbGVmdDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgeCA9IHJpZ2h0OworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgVGFiU3RvcHMgdGFiU3RvcHMgPSBudWxsOworICAgICAgICAgICAgaWYgKG1TcGFubmVkVGV4dCAmJiBnZXRMaW5lQ29udGFpbnNUYWIobGluZSkpIHsKKyAgICAgICAgICAgICAgICBTcGFubmVkIHNwYW5uZWQgPSAoU3Bhbm5lZCkgbVRleHQ7CisgICAgICAgICAgICAgICAgaW50IHN0YXJ0ID0gZ2V0TGluZVN0YXJ0KGxpbmUpOworICAgICAgICAgICAgICAgIGludCBzcGFuRW5kID0gc3Bhbm5lZC5uZXh0U3BhblRyYW5zaXRpb24oc3RhcnQsIHNwYW5uZWQubGVuZ3RoKCksCisgICAgICAgICAgICAgICAgICAgICAgICBUYWJTdG9wU3Bhbi5jbGFzcyk7CisgICAgICAgICAgICAgICAgVGFiU3RvcFNwYW5bXSB0YWJTcGFucyA9IHNwYW5uZWQuZ2V0U3BhbnMoc3RhcnQsIHNwYW5FbmQsIFRhYlN0b3BTcGFuLmNsYXNzKTsKKyAgICAgICAgICAgICAgICBpZiAodGFiU3BhbnMubGVuZ3RoID4gMCkgeworICAgICAgICAgICAgICAgICAgICB0YWJTdG9wcyA9IG5ldyBUYWJTdG9wcyhUQUJfSU5DUkVNRU5ULCB0YWJTcGFucyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50IG1heCA9IChpbnQpZ2V0TGluZUV4dGVudChsaW5lLCB0YWJTdG9wcywgZmFsc2UpOworICAgICAgICAgICAgaWYgKGFsaWduID09IEFsaWdubWVudC5BTElHTl9PUFBPU0lURSkgeworICAgICAgICAgICAgICAgIGlmIChkaXIgPT0gRElSX0xFRlRfVE9fUklHSFQpIHsKKyAgICAgICAgICAgICAgICAgICAgeCA9IHJpZ2h0IC0gbWF4OworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHggPSBsZWZ0IC0gbWF4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7IC8vIEFsaWdubWVudC5BTElHTl9DRU5URVIKKyAgICAgICAgICAgICAgICBtYXggPSBtYXggJiB+MTsKKyAgICAgICAgICAgICAgICB4ID0gKGxlZnQgKyByaWdodCAtIG1heCkgPj4gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4geDsKICAgICB9CiAKICAgICAvKioKQEAgLTQxNyw3ICs0ODgsNyBAQAogCiAgICAgICAgIG1XaWR0aCA9IHdpZDsKICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBSZXR1cm4gdGhlIHRvdGFsIGhlaWdodCBvZiB0aGlzIGxheW91dC4KICAgICAgKi8KQEAgLTQ1MCw3ICs1MjEsNyBAQAogICAgICAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGxpbmVzIG9mIHRleHQgaW4gdGhpcyBsYXlvdXQuCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IGludCBnZXRMaW5lQ291bnQoKTsKLSAgICAKKwogICAgIC8qKgogICAgICAqIFJldHVybiB0aGUgYmFzZWxpbmUgZm9yIHRoZSBzcGVjaWZpZWQgbGluZSAoMCZoZWxsaXA7Z2V0TGluZUNvdW50KCkgLSAxKQogICAgICAqIElmIGJvdW5kcyBpcyBub3QgbnVsbCwgcmV0dXJuIHRoZSB0b3AsIGxlZnQsIHJpZ2h0LCBib3R0b20gZXh0ZW50cwpAQCAtNTI0LDEzICs1OTUsOTUgQEAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgaW50IGdldEJvdHRvbVBhZGRpbmcoKTsKIAorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBjaGFyYWN0ZXIgYXQgb2Zmc2V0IGFuZCB0aGUgcHJlY2VkaW5nIGNoYXJhY3RlcgorICAgICAqIGFyZSBhdCBkaWZmZXJlbnQgcnVuIGxldmVscyAoYW5kIHRodXMgdGhlcmUncyBhIHNwbGl0IGNhcmV0KS4KKyAgICAgKiBAcGFyYW0gb2Zmc2V0IHRoZSBvZmZzZXQKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgYXQgYSBsZXZlbCBib3VuZGFyeQorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBpc0xldmVsQm91bmRhcnkoaW50IG9mZnNldCkgeworICAgICAgICBpbnQgbGluZSA9IGdldExpbmVGb3JPZmZzZXQob2Zmc2V0KTsKKyAgICAgICAgRGlyZWN0aW9ucyBkaXJzID0gZ2V0TGluZURpcmVjdGlvbnMobGluZSk7CisgICAgICAgIGlmIChkaXJzID09IERJUlNfQUxMX0xFRlRfVE9fUklHSFQgfHwgZGlycyA9PSBESVJTX0FMTF9SSUdIVF9UT19MRUZUKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBpbnRbXSBydW5zID0gZGlycy5tRGlyZWN0aW9uczsKKyAgICAgICAgaW50IGxpbmVTdGFydCA9IGdldExpbmVTdGFydChsaW5lKTsKKyAgICAgICAgaW50IGxpbmVFbmQgPSBnZXRMaW5lRW5kKGxpbmUpOworICAgICAgICBpZiAob2Zmc2V0ID09IGxpbmVTdGFydCB8fCBvZmZzZXQgPT0gbGluZUVuZCkgeworICAgICAgICAgICAgaW50IHBhcmFMZXZlbCA9IGdldFBhcmFncmFwaERpcmVjdGlvbihsaW5lKSA9PSAxID8gMCA6IDE7CisgICAgICAgICAgICBpbnQgcnVuSW5kZXggPSBvZmZzZXQgPT0gbGluZVN0YXJ0ID8gMCA6IHJ1bnMubGVuZ3RoIC0gMjsKKyAgICAgICAgICAgIHJldHVybiAoKHJ1bnNbcnVuSW5kZXggKyAxXSA+Pj4gUlVOX0xFVkVMX1NISUZUKSAmIFJVTl9MRVZFTF9NQVNLKSAhPSBwYXJhTGV2ZWw7CisgICAgICAgIH0KKworICAgICAgICBvZmZzZXQgLT0gbGluZVN0YXJ0OworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJ1bnMubGVuZ3RoOyBpICs9IDIpIHsKKyAgICAgICAgICAgIGlmIChvZmZzZXQgPT0gcnVuc1tpXSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gcHJpbWFyeUlzVHJhaWxpbmdQcmV2aW91cyhpbnQgb2Zmc2V0KSB7CisgICAgICAgIGludCBsaW5lID0gZ2V0TGluZUZvck9mZnNldChvZmZzZXQpOworICAgICAgICBpbnQgbGluZVN0YXJ0ID0gZ2V0TGluZVN0YXJ0KGxpbmUpOworICAgICAgICBpbnQgbGluZUVuZCA9IGdldExpbmVFbmQobGluZSk7CisgICAgICAgIGludFtdIHJ1bnMgPSBnZXRMaW5lRGlyZWN0aW9ucyhsaW5lKS5tRGlyZWN0aW9uczsKKworICAgICAgICBpbnQgbGV2ZWxBdCA9IC0xOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJ1bnMubGVuZ3RoOyBpICs9IDIpIHsKKyAgICAgICAgICAgIGludCBzdGFydCA9IGxpbmVTdGFydCArIHJ1bnNbaV07CisgICAgICAgICAgICBpbnQgbGltaXQgPSBzdGFydCArIChydW5zW2krMV0gJiBSVU5fTEVOR1RIX01BU0spOworICAgICAgICAgICAgaWYgKGxpbWl0ID4gbGluZUVuZCkgeworICAgICAgICAgICAgICAgIGxpbWl0ID0gbGluZUVuZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChvZmZzZXQgPj0gc3RhcnQgJiYgb2Zmc2V0IDwgbGltaXQpIHsKKyAgICAgICAgICAgICAgICBpZiAob2Zmc2V0ID4gc3RhcnQpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gUHJldmlvdXMgY2hhcmFjdGVyIGlzIGF0IHNhbWUgbGV2ZWwsIHNvIGRvbid0IHVzZSB0cmFpbGluZy4KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBsZXZlbEF0ID0gKHJ1bnNbaSsxXSA+Pj4gUlVOX0xFVkVMX1NISUZUKSAmIFJVTl9MRVZFTF9NQVNLOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChsZXZlbEF0ID09IC0xKSB7CisgICAgICAgICAgICAvLyBPZmZzZXQgd2FzIGxpbWl0IG9mIGxpbmUuCisgICAgICAgICAgICBsZXZlbEF0ID0gZ2V0UGFyYWdyYXBoRGlyZWN0aW9uKGxpbmUpID09IDEgPyAwIDogMTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEF0IGxldmVsIGJvdW5kYXJ5LCBjaGVjayBwcmV2aW91cyBsZXZlbC4KKyAgICAgICAgaW50IGxldmVsQmVmb3JlID0gLTE7CisgICAgICAgIGlmIChvZmZzZXQgPT0gbGluZVN0YXJ0KSB7CisgICAgICAgICAgICBsZXZlbEJlZm9yZSA9IGdldFBhcmFncmFwaERpcmVjdGlvbihsaW5lKSA9PSAxID8gMCA6IDE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBvZmZzZXQgLT0gMTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcnVucy5sZW5ndGg7IGkgKz0gMikgeworICAgICAgICAgICAgICAgIGludCBzdGFydCA9IGxpbmVTdGFydCArIHJ1bnNbaV07CisgICAgICAgICAgICAgICAgaW50IGxpbWl0ID0gc3RhcnQgKyAocnVuc1tpKzFdICYgUlVOX0xFTkdUSF9NQVNLKTsKKyAgICAgICAgICAgICAgICBpZiAobGltaXQgPiBsaW5lRW5kKSB7CisgICAgICAgICAgICAgICAgICAgIGxpbWl0ID0gbGluZUVuZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG9mZnNldCA+PSBzdGFydCAmJiBvZmZzZXQgPCBsaW1pdCkgeworICAgICAgICAgICAgICAgICAgICBsZXZlbEJlZm9yZSA9IChydW5zW2krMV0gPj4+IFJVTl9MRVZFTF9TSElGVCkgJiBSVU5fTEVWRUxfTUFTSzsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGxldmVsQmVmb3JlIDwgbGV2ZWxBdDsKKyAgICB9CisKICAgICAvKioKICAgICAgKiBHZXQgdGhlIHByaW1hcnkgaG9yaXpvbnRhbCBwb3NpdGlvbiBmb3IgdGhlIHNwZWNpZmllZCB0ZXh0IG9mZnNldC4KICAgICAgKiBUaGlzIGlzIHRoZSBsb2NhdGlvbiB3aGVyZSBhIG5ldyBjaGFyYWN0ZXIgd291bGQgYmUgaW5zZXJ0ZWQgaW4KICAgICAgKiB0aGUgcGFyYWdyYXBoJ3MgcHJpbWFyeSBkaXJlY3Rpb24uCiAgICAgICovCiAgICAgcHVibGljIGZsb2F0IGdldFByaW1hcnlIb3Jpem9udGFsKGludCBvZmZzZXQpIHsKLSAgICAgICAgcmV0dXJuIGdldEhvcml6b250YWwob2Zmc2V0LCBmYWxzZSwgdHJ1ZSk7CisgICAgICAgIGJvb2xlYW4gdHJhaWxpbmcgPSBwcmltYXJ5SXNUcmFpbGluZ1ByZXZpb3VzKG9mZnNldCk7CisgICAgICAgIHJldHVybiBnZXRIb3Jpem9udGFsKG9mZnNldCwgdHJhaWxpbmcpOwogICAgIH0KIAogICAgIC8qKgpAQCAtNTM5LDY2ICs2OTIsNDIgQEAKICAgICAgKiB0aGUgZGlyZWN0aW9uIG90aGVyIHRoYW4gdGhlIHBhcmFncmFwaCdzIHByaW1hcnkgZGlyZWN0aW9uLgogICAgICAqLwogICAgIHB1YmxpYyBmbG9hdCBnZXRTZWNvbmRhcnlIb3Jpem9udGFsKGludCBvZmZzZXQpIHsKLSAgICAgICAgcmV0dXJuIGdldEhvcml6b250YWwob2Zmc2V0LCB0cnVlLCB0cnVlKTsKKyAgICAgICAgYm9vbGVhbiB0cmFpbGluZyA9IHByaW1hcnlJc1RyYWlsaW5nUHJldmlvdXMob2Zmc2V0KTsKKyAgICAgICAgcmV0dXJuIGdldEhvcml6b250YWwob2Zmc2V0LCAhdHJhaWxpbmcpOwogICAgIH0KIAotICAgIHByaXZhdGUgZmxvYXQgZ2V0SG9yaXpvbnRhbChpbnQgb2Zmc2V0LCBib29sZWFuIHRyYWlsaW5nLCBib29sZWFuIGFsdCkgeworICAgIHByaXZhdGUgZmxvYXQgZ2V0SG9yaXpvbnRhbChpbnQgb2Zmc2V0LCBib29sZWFuIHRyYWlsaW5nKSB7CiAgICAgICAgIGludCBsaW5lID0gZ2V0TGluZUZvck9mZnNldChvZmZzZXQpOwogCi0gICAgICAgIHJldHVybiBnZXRIb3Jpem9udGFsKG9mZnNldCwgdHJhaWxpbmcsIGFsdCwgbGluZSk7CisgICAgICAgIHJldHVybiBnZXRIb3Jpem9udGFsKG9mZnNldCwgdHJhaWxpbmcsIGxpbmUpOwogICAgIH0KIAotICAgIHByaXZhdGUgZmxvYXQgZ2V0SG9yaXpvbnRhbChpbnQgb2Zmc2V0LCBib29sZWFuIHRyYWlsaW5nLCBib29sZWFuIGFsdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxpbmUpIHsKKyAgICBwcml2YXRlIGZsb2F0IGdldEhvcml6b250YWwoaW50IG9mZnNldCwgYm9vbGVhbiB0cmFpbGluZywgaW50IGxpbmUpIHsKICAgICAgICAgaW50IHN0YXJ0ID0gZ2V0TGluZVN0YXJ0KGxpbmUpOwotICAgICAgICBpbnQgZW5kID0gZ2V0TGluZVZpc2libGVFbmQobGluZSk7CisgICAgICAgIGludCBlbmQgPSBnZXRMaW5lRW5kKGxpbmUpOwogICAgICAgICBpbnQgZGlyID0gZ2V0UGFyYWdyYXBoRGlyZWN0aW9uKGxpbmUpOwotICAgICAgICBib29sZWFuIHRhYiA9IGdldExpbmVDb250YWluc1RhYihsaW5lKTsKKyAgICAgICAgYm9vbGVhbiBoYXNUYWJPckVtb2ppID0gZ2V0TGluZUNvbnRhaW5zVGFiKGxpbmUpOwogICAgICAgICBEaXJlY3Rpb25zIGRpcmVjdGlvbnMgPSBnZXRMaW5lRGlyZWN0aW9ucyhsaW5lKTsKIAotICAgICAgICBUYWJTdG9wU3BhbltdIHRhYnMgPSBudWxsOwotICAgICAgICBpZiAodGFiICYmIG1UZXh0IGluc3RhbmNlb2YgU3Bhbm5lZCkgewotICAgICAgICAgICAgdGFicyA9ICgoU3Bhbm5lZCkgbVRleHQpLmdldFNwYW5zKHN0YXJ0LCBlbmQsIFRhYlN0b3BTcGFuLmNsYXNzKTsKKyAgICAgICAgVGFiU3RvcHMgdGFiU3RvcHMgPSBudWxsOworICAgICAgICBpZiAoaGFzVGFiT3JFbW9qaSAmJiBtVGV4dCBpbnN0YW5jZW9mIFNwYW5uZWQpIHsKKyAgICAgICAgICAgIC8vIEp1c3QgY2hlY2tpbmcgdGhpcyBsaW5lIHNob3VsZCBiZSBnb29kIGVub3VnaCwgdGFicyBzaG91bGQgYmUKKyAgICAgICAgICAgIC8vIGNvbnNpc3RlbnQgYWNyb3NzIGFsbCBsaW5lcyBpbiBhIHBhcmFncmFwaC4KKyAgICAgICAgICAgIFRhYlN0b3BTcGFuW10gdGFicyA9ICgoU3Bhbm5lZCkgbVRleHQpLmdldFNwYW5zKHN0YXJ0LCBlbmQsIFRhYlN0b3BTcGFuLmNsYXNzKTsKKyAgICAgICAgICAgIGlmICh0YWJzLmxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgICAgICB0YWJTdG9wcyA9IG5ldyBUYWJTdG9wcyhUQUJfSU5DUkVNRU5ULCB0YWJzKTsgLy8gWFhYIHNob3VsZCByZXVzZQorICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgZmxvYXQgd2lkID0gbWVhc3VyZVRleHQobVBhaW50LCBtV29ya1BhaW50LCBtVGV4dCwgc3RhcnQsIG9mZnNldCwgZW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXIsIGRpcmVjdGlvbnMsIHRyYWlsaW5nLCBhbHQsIHRhYiwgdGFicyk7CisgICAgICAgIFRleHRMaW5lIHRsID0gVGV4dExpbmUub2J0YWluKCk7CisgICAgICAgIHRsLnNldChtUGFpbnQsIG1UZXh0LCBzdGFydCwgZW5kLCBkaXIsIGRpcmVjdGlvbnMsIGhhc1RhYk9yRW1vamksIHRhYlN0b3BzKTsKKyAgICAgICAgZmxvYXQgd2lkID0gdGwubWVhc3VyZShvZmZzZXQgLSBzdGFydCwgdHJhaWxpbmcsIG51bGwpOworICAgICAgICBUZXh0TGluZS5yZWN5Y2xlKHRsKTsKIAotICAgICAgICBpZiAob2Zmc2V0ID4gZW5kKSB7Ci0gICAgICAgICAgICBpZiAoZGlyID09IERJUl9SSUdIVF9UT19MRUZUKQotICAgICAgICAgICAgICAgIHdpZCAtPSBtZWFzdXJlVGV4dChtUGFpbnQsIG1Xb3JrUGFpbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1UZXh0LCBlbmQsIG9mZnNldCwgbnVsbCwgdGFiLCB0YWJzKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB3aWQgKz0gbWVhc3VyZVRleHQobVBhaW50LCBtV29ya1BhaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVGV4dCwgZW5kLCBvZmZzZXQsIG51bGwsIHRhYiwgdGFicyk7Ci0gICAgICAgIH0KLQotICAgICAgICBBbGlnbm1lbnQgYWxpZ24gPSBnZXRQYXJhZ3JhcGhBbGlnbm1lbnQobGluZSk7CiAgICAgICAgIGludCBsZWZ0ID0gZ2V0UGFyYWdyYXBoTGVmdChsaW5lKTsKICAgICAgICAgaW50IHJpZ2h0ID0gZ2V0UGFyYWdyYXBoUmlnaHQobGluZSk7CiAKLSAgICAgICAgaWYgKGFsaWduID09IEFsaWdubWVudC5BTElHTl9OT1JNQUwpIHsKLSAgICAgICAgICAgIGlmIChkaXIgPT0gRElSX1JJR0hUX1RPX0xFRlQpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHJpZ2h0ICsgd2lkOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHJldHVybiBsZWZ0ICsgd2lkOwotICAgICAgICB9Ci0KLSAgICAgICAgZmxvYXQgbWF4ID0gZ2V0TGluZU1heChsaW5lKTsKLQotICAgICAgICBpZiAoYWxpZ24gPT0gQWxpZ25tZW50LkFMSUdOX09QUE9TSVRFKSB7Ci0gICAgICAgICAgICBpZiAoZGlyID09IERJUl9SSUdIVF9UT19MRUZUKQotICAgICAgICAgICAgICAgIHJldHVybiBsZWZ0ICsgbWF4ICsgd2lkOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHJldHVybiByaWdodCAtIG1heCArIHdpZDsKLSAgICAgICAgfSBlbHNlIHsgLyogYWxpZ24gPT0gQWxpZ25tZW50LkFMSUdOX0NFTlRFUiAqLwotICAgICAgICAgICAgaW50IGltYXggPSAoKGludCkgbWF4KSAmIH4xOwotCi0gICAgICAgICAgICBpZiAoZGlyID09IERJUl9SSUdIVF9UT19MRUZUKQotICAgICAgICAgICAgICAgIHJldHVybiByaWdodCAtICgoKHJpZ2h0IC0gbGVmdCkgLSBpbWF4KSAvIDIpICsgd2lkOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHJldHVybiBsZWZ0ICsgKChyaWdodCAtIGxlZnQpIC0gaW1heCkgLyAyICsgd2lkOwotICAgICAgICB9CisgICAgICAgIHJldHVybiBnZXRMaW5lU3RhcnRQb3MobGluZSwgbGVmdCwgcmlnaHQpICsgd2lkOwogICAgIH0KIAogICAgIC8qKgpAQCAtNjU2LDM4ICs3ODUsNzYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBob3Jpem9udGFsIGV4dGVudCBvZiB0aGUgc3BlY2lmaWVkIGxpbmUsIGV4Y2x1ZGluZwotICAgICAqIHRyYWlsaW5nIHdoaXRlc3BhY2UuCisgICAgICogR2V0cyB0aGUgdW5zaWduZWQgaG9yaXpvbnRhbCBleHRlbnQgb2YgdGhlIHNwZWNpZmllZCBsaW5lLCBpbmNsdWRpbmcKKyAgICAgKiBsZWFkaW5nIG1hcmdpbiBpbmRlbnQsIGJ1dCBleGNsdWRpbmcgdHJhaWxpbmcgd2hpdGVzcGFjZS4KICAgICAgKi8KICAgICBwdWJsaWMgZmxvYXQgZ2V0TGluZU1heChpbnQgbGluZSkgewotICAgICAgICByZXR1cm4gZ2V0TGluZU1heChsaW5lLCBudWxsLCBmYWxzZSk7CisgICAgICAgIGZsb2F0IG1hcmdpbiA9IGdldFBhcmFncmFwaExlYWRpbmdNYXJnaW4obGluZSk7CisgICAgICAgIGZsb2F0IHNpZ25lZEV4dGVudCA9IGdldExpbmVFeHRlbnQobGluZSwgZmFsc2UpOworICAgICAgICByZXR1cm4gbWFyZ2luICsgc2lnbmVkRXh0ZW50ID49IDAgPyBzaWduZWRFeHRlbnQgOiAtc2lnbmVkRXh0ZW50OwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIGhvcml6b250YWwgZXh0ZW50IG9mIHRoZSBzcGVjaWZpZWQgbGluZSwgaW5jbHVkaW5nCi0gICAgICogdHJhaWxpbmcgd2hpdGVzcGFjZS4KKyAgICAgKiBHZXRzIHRoZSB1bnNpZ25lZCBob3Jpem9udGFsIGV4dGVudCBvZiB0aGUgc3BlY2lmaWVkIGxpbmUsIGluY2x1ZGluZworICAgICAqIGxlYWRpbmcgbWFyZ2luIGluZGVudCBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZS4KICAgICAgKi8KICAgICBwdWJsaWMgZmxvYXQgZ2V0TGluZVdpZHRoKGludCBsaW5lKSB7Ci0gICAgICAgIHJldHVybiBnZXRMaW5lTWF4KGxpbmUsIG51bGwsIHRydWUpOworICAgICAgICBmbG9hdCBtYXJnaW4gPSBnZXRQYXJhZ3JhcGhMZWFkaW5nTWFyZ2luKGxpbmUpOworICAgICAgICBmbG9hdCBzaWduZWRFeHRlbnQgPSBnZXRMaW5lRXh0ZW50KGxpbmUsIHRydWUpOworICAgICAgICByZXR1cm4gbWFyZ2luICsgc2lnbmVkRXh0ZW50ID49IDAgPyBzaWduZWRFeHRlbnQgOiAtc2lnbmVkRXh0ZW50OwogICAgIH0KIAotICAgIHByaXZhdGUgZmxvYXQgZ2V0TGluZU1heChpbnQgbGluZSwgT2JqZWN0W10gdGFicywgYm9vbGVhbiBmdWxsKSB7CisgICAgLyoqCisgICAgICogTGlrZSB7QGxpbmsgI2dldExpbmVFeHRlbnQoaW50LFRhYlN0b3BzLGJvb2xlYW4pfSBidXQgZGV0ZXJtaW5lcyB0aGUKKyAgICAgKiB0YWIgc3RvcHMgaW5zdGVhZCBvZiB1c2luZyB0aGUgb25lcyBwYXNzZWQgaW4uCisgICAgICogQHBhcmFtIGxpbmUgdGhlIGluZGV4IG9mIHRoZSBsaW5lCisgICAgICogQHBhcmFtIGZ1bGwgd2hldGhlciB0byBpbmNsdWRlIHRyYWlsaW5nIHdoaXRlc3BhY2UKKyAgICAgKiBAcmV0dXJuIHRoZSBleHRlbnQgb2YgdGhlIGxpbmUKKyAgICAgKi8KKyAgICBwcml2YXRlIGZsb2F0IGdldExpbmVFeHRlbnQoaW50IGxpbmUsIGJvb2xlYW4gZnVsbCkgewogICAgICAgICBpbnQgc3RhcnQgPSBnZXRMaW5lU3RhcnQobGluZSk7Ci0gICAgICAgIGludCBlbmQ7CisgICAgICAgIGludCBlbmQgPSBmdWxsID8gZ2V0TGluZUVuZChsaW5lKSA6IGdldExpbmVWaXNpYmxlRW5kKGxpbmUpOwogCi0gICAgICAgIGlmIChmdWxsKSB7Ci0gICAgICAgICAgICBlbmQgPSBnZXRMaW5lRW5kKGxpbmUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZW5kID0gZ2V0TGluZVZpc2libGVFbmQobGluZSk7Ci0gICAgICAgIH0gCi0gICAgICAgIGJvb2xlYW4gdGFiID0gZ2V0TGluZUNvbnRhaW5zVGFiKGxpbmUpOwotCi0gICAgICAgIGlmICh0YWJzID09IG51bGwgJiYgdGFiICYmIG1UZXh0IGluc3RhbmNlb2YgU3Bhbm5lZCkgewotICAgICAgICAgICAgdGFicyA9ICgoU3Bhbm5lZCkgbVRleHQpLmdldFNwYW5zKHN0YXJ0LCBlbmQsIFRhYlN0b3BTcGFuLmNsYXNzKTsKKyAgICAgICAgYm9vbGVhbiBoYXNUYWJzT3JFbW9qaSA9IGdldExpbmVDb250YWluc1RhYihsaW5lKTsKKyAgICAgICAgVGFiU3RvcHMgdGFiU3RvcHMgPSBudWxsOworICAgICAgICBpZiAoaGFzVGFic09yRW1vamkgJiYgbVRleHQgaW5zdGFuY2VvZiBTcGFubmVkKSB7CisgICAgICAgICAgICAvLyBKdXN0IGNoZWNraW5nIHRoaXMgbGluZSBzaG91bGQgYmUgZ29vZCBlbm91Z2gsIHRhYnMgc2hvdWxkIGJlCisgICAgICAgICAgICAvLyBjb25zaXN0ZW50IGFjcm9zcyBhbGwgbGluZXMgaW4gYSBwYXJhZ3JhcGguCisgICAgICAgICAgICBUYWJTdG9wU3BhbltdIHRhYnMgPSAoKFNwYW5uZWQpIG1UZXh0KS5nZXRTcGFucyhzdGFydCwgZW5kLCBUYWJTdG9wU3Bhbi5jbGFzcyk7CisgICAgICAgICAgICBpZiAodGFicy5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICAgICAgdGFiU3RvcHMgPSBuZXcgVGFiU3RvcHMoVEFCX0lOQ1JFTUVOVCwgdGFicyk7IC8vIFhYWCBzaG91bGQgcmV1c2UKKyAgICAgICAgICAgIH0KICAgICAgICAgfQorICAgICAgICBEaXJlY3Rpb25zIGRpcmVjdGlvbnMgPSBnZXRMaW5lRGlyZWN0aW9ucyhsaW5lKTsKKyAgICAgICAgaW50IGRpciA9IGdldFBhcmFncmFwaERpcmVjdGlvbihsaW5lKTsKIAotICAgICAgICByZXR1cm4gbWVhc3VyZVRleHQobVBhaW50LCBtV29ya1BhaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRleHQsIHN0YXJ0LCBlbmQsIG51bGwsIHRhYiwgdGFicyk7CisgICAgICAgIFRleHRMaW5lIHRsID0gVGV4dExpbmUub2J0YWluKCk7CisgICAgICAgIHRsLnNldChtUGFpbnQsIG1UZXh0LCBzdGFydCwgZW5kLCBkaXIsIGRpcmVjdGlvbnMsIGhhc1RhYnNPckVtb2ppLCB0YWJTdG9wcyk7CisgICAgICAgIGZsb2F0IHdpZHRoID0gdGwubWV0cmljcyhudWxsKTsKKyAgICAgICAgVGV4dExpbmUucmVjeWNsZSh0bCk7CisgICAgICAgIHJldHVybiB3aWR0aDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBzaWduZWQgaG9yaXpvbnRhbCBleHRlbnQgb2YgdGhlIHNwZWNpZmllZCBsaW5lLCBleGNsdWRpbmcKKyAgICAgKiBsZWFkaW5nIG1hcmdpbi4gIElmIGZ1bGwgaXMgZmFsc2UsIGV4Y2x1ZGVzIHRyYWlsaW5nIHdoaXRlc3BhY2UuCisgICAgICogQHBhcmFtIGxpbmUgdGhlIGluZGV4IG9mIHRoZSBsaW5lCisgICAgICogQHBhcmFtIHRhYlN0b3BzIHRoZSB0YWIgc3RvcHMsIGNhbiBiZSBudWxsIGlmIHdlIGtub3cgdGhleSdyZSBub3QgdXNlZC4KKyAgICAgKiBAcGFyYW0gZnVsbCB3aGV0aGVyIHRvIGluY2x1ZGUgdHJhaWxpbmcgd2hpdGVzcGFjZQorICAgICAqIEByZXR1cm4gdGhlIGV4dGVudCBvZiB0aGUgdGV4dCBvbiB0aGlzIGxpbmUKKyAgICAgKi8KKyAgICBwcml2YXRlIGZsb2F0IGdldExpbmVFeHRlbnQoaW50IGxpbmUsIFRhYlN0b3BzIHRhYlN0b3BzLCBib29sZWFuIGZ1bGwpIHsKKyAgICAgICAgaW50IHN0YXJ0ID0gZ2V0TGluZVN0YXJ0KGxpbmUpOworICAgICAgICBpbnQgZW5kID0gZnVsbCA/IGdldExpbmVFbmQobGluZSkgOiBnZXRMaW5lVmlzaWJsZUVuZChsaW5lKTsKKyAgICAgICAgYm9vbGVhbiBoYXNUYWJzT3JFbW9qaSA9IGdldExpbmVDb250YWluc1RhYihsaW5lKTsKKyAgICAgICAgRGlyZWN0aW9ucyBkaXJlY3Rpb25zID0gZ2V0TGluZURpcmVjdGlvbnMobGluZSk7CisgICAgICAgIGludCBkaXIgPSBnZXRQYXJhZ3JhcGhEaXJlY3Rpb24obGluZSk7CisKKyAgICAgICAgVGV4dExpbmUgdGwgPSBUZXh0TGluZS5vYnRhaW4oKTsKKyAgICAgICAgdGwuc2V0KG1QYWludCwgbVRleHQsIHN0YXJ0LCBlbmQsIGRpciwgZGlyZWN0aW9ucywgaGFzVGFic09yRW1vamksIHRhYlN0b3BzKTsKKyAgICAgICAgZmxvYXQgd2lkdGggPSB0bC5tZXRyaWNzKG51bGwpOworICAgICAgICBUZXh0TGluZS5yZWN5Y2xlKHRsKTsKKyAgICAgICAgcmV0dXJuIHdpZHRoOwogICAgIH0KIAogICAgIC8qKgpAQCAtNzM4LDcgKzkwNSw3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0IHRoZSBjaGFyYWN0ZXIgb2Zmc2V0IG9uIHRoZSBzcGVjZmllZCBsaW5lIHdob3NlIHBvc2l0aW9uIGlzCisgICAgICogR2V0IHRoZSBjaGFyYWN0ZXIgb2Zmc2V0IG9uIHRoZSBzcGVjaWZpZWQgbGluZSB3aG9zZSBwb3NpdGlvbiBpcwogICAgICAqIGNsb3Nlc3QgdG8gdGhlIHNwZWNpZmllZCBob3Jpem9udGFsIHBvc2l0aW9uLgogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0T2Zmc2V0Rm9ySG9yaXpvbnRhbChpbnQgbGluZSwgZmxvYXQgaG9yaXopIHsKQEAgLTc1MiwxNCArOTE5LDEzIEBACiAgICAgICAgIGludCBiZXN0ID0gbWluOwogICAgICAgICBmbG9hdCBiZXN0ZGlzdCA9IE1hdGguYWJzKGdldFByaW1hcnlIb3Jpem9udGFsKGJlc3QpIC0gaG9yaXopOwogCi0gICAgICAgIGludCBoZXJlID0gbWluOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRpcnMubURpcmVjdGlvbnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGludCB0aGVyZSA9IGhlcmUgKyBkaXJzLm1EaXJlY3Rpb25zW2ldOwotICAgICAgICAgICAgaW50IHN3YXAgPSAoKGkgJiAxKSA9PSAwKSA/IDEgOiAtMTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkaXJzLm1EaXJlY3Rpb25zLmxlbmd0aDsgaSArPSAyKSB7CisgICAgICAgICAgICBpbnQgaGVyZSA9IG1pbiArIGRpcnMubURpcmVjdGlvbnNbaV07CisgICAgICAgICAgICBpbnQgdGhlcmUgPSBoZXJlICsgKGRpcnMubURpcmVjdGlvbnNbaSsxXSAmIFJVTl9MRU5HVEhfTUFTSyk7CisgICAgICAgICAgICBpbnQgc3dhcCA9IChkaXJzLm1EaXJlY3Rpb25zW2krMV0gJiBSVU5fUlRMX0ZMQUcpICE9IDAgPyAtMSA6IDE7CiAKICAgICAgICAgICAgIGlmICh0aGVyZSA+IG1heCkKICAgICAgICAgICAgICAgICB0aGVyZSA9IG1heDsKLQogICAgICAgICAgICAgaW50IGhpZ2ggPSB0aGVyZSAtIDEgKyAxLCBsb3cgPSBoZXJlICsgMSAtIDEsIGd1ZXNzOwogCiAgICAgICAgICAgICB3aGlsZSAoaGlnaCAtIGxvdyA+IDEpIHsKQEAgLTc5Miw3ICs5NTgsNyBAQAogCiAgICAgICAgICAgICAgICAgaWYgKGRpc3QgPCBiZXN0ZGlzdCkgewogICAgICAgICAgICAgICAgICAgICBiZXN0ZGlzdCA9IGRpc3Q7Ci0gICAgICAgICAgICAgICAgICAgIGJlc3QgPSBsb3c7ICAgCisgICAgICAgICAgICAgICAgICAgIGJlc3QgPSBsb3c7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCkBAIC04MDIsOCArOTY4LDYgQEAKICAgICAgICAgICAgICAgICBiZXN0ZGlzdCA9IGRpc3Q7CiAgICAgICAgICAgICAgICAgYmVzdCA9IGhlcmU7CiAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGhlcmUgPSB0aGVyZTsKICAgICAgICAgfQogCiAgICAgICAgIGZsb2F0IGRpc3QgPSBNYXRoLmFicyhnZXRQcmltYXJ5SG9yaXpvbnRhbChtYXgpIC0gaG9yaXopOwpAQCAtODIzLDE5ICs5ODcsMTUgQEAKICAgICAgICAgcmV0dXJuIGdldExpbmVTdGFydChsaW5lICsgMSk7CiAgICAgfQogCi0gICAgLyoqIAorICAgIC8qKgogICAgICAqIFJldHVybiB0aGUgdGV4dCBvZmZzZXQgYWZ0ZXIgdGhlIGxhc3QgdmlzaWJsZSBjaGFyYWN0ZXIgKHNvIHdoaXRlc3BhY2UKICAgICAgKiBpcyBub3QgY291bnRlZCkgb24gdGhlIHNwZWNpZmllZCBsaW5lLgogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0TGluZVZpc2libGVFbmQoaW50IGxpbmUpIHsKICAgICAgICAgcmV0dXJuIGdldExpbmVWaXNpYmxlRW5kKGxpbmUsIGdldExpbmVTdGFydChsaW5lKSwgZ2V0TGluZVN0YXJ0KGxpbmUrMSkpOwogICAgIH0KLSAgICAKLSAgICBwcml2YXRlIGludCBnZXRMaW5lVmlzaWJsZUVuZChpbnQgbGluZSwgaW50IHN0YXJ0LCBpbnQgZW5kKSB7Ci0gICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoZ2V0TGluZVN0YXJ0KGxpbmUpID09IHN0YXJ0ICYmIGdldExpbmVTdGFydChsaW5lKzEpID09IGVuZCk7Ci0gICAgICAgIH0KIAorICAgIHByaXZhdGUgaW50IGdldExpbmVWaXNpYmxlRW5kKGludCBsaW5lLCBpbnQgc3RhcnQsIGludCBlbmQpIHsKICAgICAgICAgQ2hhclNlcXVlbmNlIHRleHQgPSBtVGV4dDsKICAgICAgICAgY2hhciBjaDsKICAgICAgICAgaWYgKGxpbmUgPT0gZ2V0TGluZUNvdW50KCkgLSAxKSB7CkBAIC04ODIsMjA3ICsxMDQyLDYyIEBACiAgICAgICAgIHJldHVybiBnZXRMaW5lVG9wKGxpbmUpIC0gKGdldExpbmVUb3AobGluZSsxKSAtIGdldExpbmVEZXNjZW50KGxpbmUpKTsKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIHRleHQgb2Zmc2V0IHRoYXQgd291bGQgYmUgcmVhY2hlZCBieSBtb3ZpbmcgbGVmdAotICAgICAqIChwb3NzaWJseSBvbnRvIGFub3RoZXIgbGluZSkgZnJvbSB0aGUgc3BlY2lmaWVkIG9mZnNldC4KLSAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldE9mZnNldFRvTGVmdE9mKGludCBvZmZzZXQpIHsKLSAgICAgICAgaW50IGxpbmUgPSBnZXRMaW5lRm9yT2Zmc2V0KG9mZnNldCk7Ci0gICAgICAgIGludCBzdGFydCA9IGdldExpbmVTdGFydChsaW5lKTsKLSAgICAgICAgaW50IGVuZCA9IGdldExpbmVFbmQobGluZSk7Ci0gICAgICAgIERpcmVjdGlvbnMgZGlycyA9IGdldExpbmVEaXJlY3Rpb25zKGxpbmUpOwotCi0gICAgICAgIGlmIChsaW5lICE9IGdldExpbmVDb3VudCgpIC0gMSkKLSAgICAgICAgICAgIGVuZC0tOwotCi0gICAgICAgIGZsb2F0IGhvcml6ID0gZ2V0UHJpbWFyeUhvcml6b250YWwob2Zmc2V0KTsKLQotICAgICAgICBpbnQgYmVzdCA9IG9mZnNldDsKLSAgICAgICAgZmxvYXQgYmVzdGggPSBJbnRlZ2VyLk1JTl9WQUxVRTsKLSAgICAgICAgaW50IGNhbmRpZGF0ZTsKLQotICAgICAgICBjYW5kaWRhdGUgPSBUZXh0VXRpbHMuZ2V0T2Zmc2V0QmVmb3JlKG1UZXh0LCBvZmZzZXQpOwotICAgICAgICBpZiAoY2FuZGlkYXRlID49IHN0YXJ0ICYmIGNhbmRpZGF0ZSA8PSBlbmQpIHsKLSAgICAgICAgICAgIGZsb2F0IGggPSBnZXRQcmltYXJ5SG9yaXpvbnRhbChjYW5kaWRhdGUpOwotCi0gICAgICAgICAgICBpZiAoaCA8IGhvcml6ICYmIGggPiBiZXN0aCkgewotICAgICAgICAgICAgICAgIGJlc3QgPSBjYW5kaWRhdGU7Ci0gICAgICAgICAgICAgICAgYmVzdGggPSBoOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgY2FuZGlkYXRlID0gVGV4dFV0aWxzLmdldE9mZnNldEFmdGVyKG1UZXh0LCBvZmZzZXQpOwotICAgICAgICBpZiAoY2FuZGlkYXRlID49IHN0YXJ0ICYmIGNhbmRpZGF0ZSA8PSBlbmQpIHsKLSAgICAgICAgICAgIGZsb2F0IGggPSBnZXRQcmltYXJ5SG9yaXpvbnRhbChjYW5kaWRhdGUpOwotCi0gICAgICAgICAgICBpZiAoaCA8IGhvcml6ICYmIGggPiBiZXN0aCkgewotICAgICAgICAgICAgICAgIGJlc3QgPSBjYW5kaWRhdGU7Ci0gICAgICAgICAgICAgICAgYmVzdGggPSBoOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaW50IGhlcmUgPSBzdGFydDsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkaXJzLm1EaXJlY3Rpb25zLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBpbnQgdGhlcmUgPSBoZXJlICsgZGlycy5tRGlyZWN0aW9uc1tpXTsKLSAgICAgICAgICAgIGlmICh0aGVyZSA+IGVuZCkKLSAgICAgICAgICAgICAgICB0aGVyZSA9IGVuZDsKLQotICAgICAgICAgICAgZmxvYXQgaCA9IGdldFByaW1hcnlIb3Jpem9udGFsKGhlcmUpOwotCi0gICAgICAgICAgICBpZiAoaCA8IGhvcml6ICYmIGggPiBiZXN0aCkgewotICAgICAgICAgICAgICAgIGJlc3QgPSBoZXJlOwotICAgICAgICAgICAgICAgIGJlc3RoID0gaDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FuZGlkYXRlID0gVGV4dFV0aWxzLmdldE9mZnNldEFmdGVyKG1UZXh0LCBoZXJlKTsKLSAgICAgICAgICAgIGlmIChjYW5kaWRhdGUgPj0gc3RhcnQgJiYgY2FuZGlkYXRlIDw9IGVuZCkgewotICAgICAgICAgICAgICAgIGggPSBnZXRQcmltYXJ5SG9yaXpvbnRhbChjYW5kaWRhdGUpOwotCi0gICAgICAgICAgICAgICAgaWYgKGggPCBob3JpeiAmJiBoID4gYmVzdGgpIHsKLSAgICAgICAgICAgICAgICAgICAgYmVzdCA9IGNhbmRpZGF0ZTsKLSAgICAgICAgICAgICAgICAgICAgYmVzdGggPSBoOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FuZGlkYXRlID0gVGV4dFV0aWxzLmdldE9mZnNldEJlZm9yZShtVGV4dCwgdGhlcmUpOwotICAgICAgICAgICAgaWYgKGNhbmRpZGF0ZSA+PSBzdGFydCAmJiBjYW5kaWRhdGUgPD0gZW5kKSB7Ci0gICAgICAgICAgICAgICAgaCA9IGdldFByaW1hcnlIb3Jpem9udGFsKGNhbmRpZGF0ZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoaCA8IGhvcml6ICYmIGggPiBiZXN0aCkgewotICAgICAgICAgICAgICAgICAgICBiZXN0ID0gY2FuZGlkYXRlOwotICAgICAgICAgICAgICAgICAgICBiZXN0aCA9IGg7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBoZXJlID0gdGhlcmU7Ci0gICAgICAgIH0KLQotICAgICAgICBmbG9hdCBoID0gZ2V0UHJpbWFyeUhvcml6b250YWwoZW5kKTsKLQotICAgICAgICBpZiAoaCA8IGhvcml6ICYmIGggPiBiZXN0aCkgewotICAgICAgICAgICAgYmVzdCA9IGVuZDsKLSAgICAgICAgICAgIGJlc3RoID0gaDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChiZXN0ICE9IG9mZnNldCkKLSAgICAgICAgICAgIHJldHVybiBiZXN0OwotCi0gICAgICAgIGludCBkaXIgPSBnZXRQYXJhZ3JhcGhEaXJlY3Rpb24obGluZSk7Ci0KLSAgICAgICAgaWYgKGRpciA+IDApIHsKLSAgICAgICAgICAgIGlmIChsaW5lID09IDApCi0gICAgICAgICAgICAgICAgcmV0dXJuIGJlc3Q7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgcmV0dXJuIGdldE9mZnNldEZvckhvcml6b250YWwobGluZSAtIDEsIDEwMDAwKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChsaW5lID09IGdldExpbmVDb3VudCgpIC0gMSkKLSAgICAgICAgICAgICAgICByZXR1cm4gYmVzdDsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0T2Zmc2V0Rm9ySG9yaXpvbnRhbChsaW5lICsgMSwgMTAwMDApOwotICAgICAgICB9CisgICAgICAgIHJldHVybiBnZXRPZmZzZXRUb0xlZnRSaWdodE9mKG9mZnNldCwgdHJ1ZSk7CiAgICAgfQogCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSB0ZXh0IG9mZnNldCB0aGF0IHdvdWxkIGJlIHJlYWNoZWQgYnkgbW92aW5nIHJpZ2h0Ci0gICAgICogKHBvc3NpYmx5IG9udG8gYW5vdGhlciBsaW5lKSBmcm9tIHRoZSBzcGVjaWZpZWQgb2Zmc2V0LgotICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0T2Zmc2V0VG9SaWdodE9mKGludCBvZmZzZXQpIHsKLSAgICAgICAgaW50IGxpbmUgPSBnZXRMaW5lRm9yT2Zmc2V0KG9mZnNldCk7Ci0gICAgICAgIGludCBzdGFydCA9IGdldExpbmVTdGFydChsaW5lKTsKLSAgICAgICAgaW50IGVuZCA9IGdldExpbmVFbmQobGluZSk7Ci0gICAgICAgIERpcmVjdGlvbnMgZGlycyA9IGdldExpbmVEaXJlY3Rpb25zKGxpbmUpOworICAgICAgICByZXR1cm4gZ2V0T2Zmc2V0VG9MZWZ0UmlnaHRPZihvZmZzZXQsIGZhbHNlKTsKKyAgICB9CiAKLSAgICAgICAgaWYgKGxpbmUgIT0gZ2V0TGluZUNvdW50KCkgLSAxKQotICAgICAgICAgICAgZW5kLS07CisgICAgcHJpdmF0ZSBpbnQgZ2V0T2Zmc2V0VG9MZWZ0UmlnaHRPZihpbnQgY2FyZXQsIGJvb2xlYW4gdG9MZWZ0KSB7CisgICAgICAgIGludCBsaW5lID0gZ2V0TGluZUZvck9mZnNldChjYXJldCk7CisgICAgICAgIGludCBsaW5lU3RhcnQgPSBnZXRMaW5lU3RhcnQobGluZSk7CisgICAgICAgIGludCBsaW5lRW5kID0gZ2V0TGluZUVuZChsaW5lKTsKKyAgICAgICAgaW50IGxpbmVEaXIgPSBnZXRQYXJhZ3JhcGhEaXJlY3Rpb24obGluZSk7CiAKLSAgICAgICAgZmxvYXQgaG9yaXogPSBnZXRQcmltYXJ5SG9yaXpvbnRhbChvZmZzZXQpOwotCi0gICAgICAgIGludCBiZXN0ID0gb2Zmc2V0OwotICAgICAgICBmbG9hdCBiZXN0aCA9IEludGVnZXIuTUFYX1ZBTFVFOwotICAgICAgICBpbnQgY2FuZGlkYXRlOwotCi0gICAgICAgIGNhbmRpZGF0ZSA9IFRleHRVdGlscy5nZXRPZmZzZXRCZWZvcmUobVRleHQsIG9mZnNldCk7Ci0gICAgICAgIGlmIChjYW5kaWRhdGUgPj0gc3RhcnQgJiYgY2FuZGlkYXRlIDw9IGVuZCkgewotICAgICAgICAgICAgZmxvYXQgaCA9IGdldFByaW1hcnlIb3Jpem9udGFsKGNhbmRpZGF0ZSk7Ci0KLSAgICAgICAgICAgIGlmIChoID4gaG9yaXogJiYgaCA8IGJlc3RoKSB7Ci0gICAgICAgICAgICAgICAgYmVzdCA9IGNhbmRpZGF0ZTsKLSAgICAgICAgICAgICAgICBiZXN0aCA9IGg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBjYW5kaWRhdGUgPSBUZXh0VXRpbHMuZ2V0T2Zmc2V0QWZ0ZXIobVRleHQsIG9mZnNldCk7Ci0gICAgICAgIGlmIChjYW5kaWRhdGUgPj0gc3RhcnQgJiYgY2FuZGlkYXRlIDw9IGVuZCkgewotICAgICAgICAgICAgZmxvYXQgaCA9IGdldFByaW1hcnlIb3Jpem9udGFsKGNhbmRpZGF0ZSk7Ci0KLSAgICAgICAgICAgIGlmIChoID4gaG9yaXogJiYgaCA8IGJlc3RoKSB7Ci0gICAgICAgICAgICAgICAgYmVzdCA9IGNhbmRpZGF0ZTsKLSAgICAgICAgICAgICAgICBiZXN0aCA9IGg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgaGVyZSA9IHN0YXJ0OwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRpcnMubURpcmVjdGlvbnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGludCB0aGVyZSA9IGhlcmUgKyBkaXJzLm1EaXJlY3Rpb25zW2ldOwotICAgICAgICAgICAgaWYgKHRoZXJlID4gZW5kKQotICAgICAgICAgICAgICAgIHRoZXJlID0gZW5kOwotCi0gICAgICAgICAgICBmbG9hdCBoID0gZ2V0UHJpbWFyeUhvcml6b250YWwoaGVyZSk7Ci0KLSAgICAgICAgICAgIGlmIChoID4gaG9yaXogJiYgaCA8IGJlc3RoKSB7Ci0gICAgICAgICAgICAgICAgYmVzdCA9IGhlcmU7Ci0gICAgICAgICAgICAgICAgYmVzdGggPSBoOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYW5kaWRhdGUgPSBUZXh0VXRpbHMuZ2V0T2Zmc2V0QWZ0ZXIobVRleHQsIGhlcmUpOwotICAgICAgICAgICAgaWYgKGNhbmRpZGF0ZSA+PSBzdGFydCAmJiBjYW5kaWRhdGUgPD0gZW5kKSB7Ci0gICAgICAgICAgICAgICAgaCA9IGdldFByaW1hcnlIb3Jpem9udGFsKGNhbmRpZGF0ZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoaCA+IGhvcml6ICYmIGggPCBiZXN0aCkgewotICAgICAgICAgICAgICAgICAgICBiZXN0ID0gY2FuZGlkYXRlOwotICAgICAgICAgICAgICAgICAgICBiZXN0aCA9IGg7CisgICAgICAgIGJvb2xlYW4gYWR2YW5jZSA9IHRvTGVmdCA9PSAobGluZURpciA9PSBESVJfUklHSFRfVE9fTEVGVCk7CisgICAgICAgIGlmIChjYXJldCA9PSAoYWR2YW5jZSA/IGxpbmVFbmQgOiBsaW5lU3RhcnQpKSB7CisgICAgICAgICAgICAvLyB3YWxraW5nIG9mZiBsaW5lLCBzbyBsb29rIGF0IHRoZSBsaW5lIHdlJ3JlIGhlYWRlZCB0bworICAgICAgICAgICAgaWYgKGNhcmV0ID09IGxpbmVTdGFydCkgeworICAgICAgICAgICAgICAgIGlmIChsaW5lID4gMCkgeworICAgICAgICAgICAgICAgICAgICAtLWxpbmU7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhcmV0OyAvLyBhdCB2ZXJ5IHN0YXJ0LCBkb24ndCBtb3ZlCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAobGluZSA8IGdldExpbmVDb3VudCgpIC0gMSkgeworICAgICAgICAgICAgICAgICAgICArK2xpbmU7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhcmV0OyAvLyBhdCB2ZXJ5IGVuZCwgZG9uJ3QgbW92ZQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgY2FuZGlkYXRlID0gVGV4dFV0aWxzLmdldE9mZnNldEJlZm9yZShtVGV4dCwgdGhlcmUpOwotICAgICAgICAgICAgaWYgKGNhbmRpZGF0ZSA+PSBzdGFydCAmJiBjYW5kaWRhdGUgPD0gZW5kKSB7Ci0gICAgICAgICAgICAgICAgaCA9IGdldFByaW1hcnlIb3Jpem9udGFsKGNhbmRpZGF0ZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoaCA+IGhvcml6ICYmIGggPCBiZXN0aCkgewotICAgICAgICAgICAgICAgICAgICBiZXN0ID0gY2FuZGlkYXRlOwotICAgICAgICAgICAgICAgICAgICBiZXN0aCA9IGg7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgbGluZVN0YXJ0ID0gZ2V0TGluZVN0YXJ0KGxpbmUpOworICAgICAgICAgICAgbGluZUVuZCA9IGdldExpbmVFbmQobGluZSk7CisgICAgICAgICAgICBpbnQgbmV3RGlyID0gZ2V0UGFyYWdyYXBoRGlyZWN0aW9uKGxpbmUpOworICAgICAgICAgICAgaWYgKG5ld0RpciAhPSBsaW5lRGlyKSB7CisgICAgICAgICAgICAgICAgLy8gdW51c3VhbCBjYXNlLiAgd2Ugd2FudCB0byB3YWxrIG9udG8gdGhlIGxpbmUsIGJ1dCBpdCBydW5zCisgICAgICAgICAgICAgICAgLy8gaW4gYSBkaWZmZXJlbnQgZGlyZWN0aW9uIHRoYW4gdGhpcyBvbmUsIHNvIHdlIGZha2UgbW92ZW1lbnQKKyAgICAgICAgICAgICAgICAvLyBpbiB0aGUgb3Bwb3NpdGUgZGlyZWN0aW9uLgorICAgICAgICAgICAgICAgIHRvTGVmdCA9ICF0b0xlZnQ7CisgICAgICAgICAgICAgICAgbGluZURpciA9IG5ld0RpcjsKICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaGVyZSA9IHRoZXJlOwogICAgICAgICB9CiAKLSAgICAgICAgZmxvYXQgaCA9IGdldFByaW1hcnlIb3Jpem9udGFsKGVuZCk7CisgICAgICAgIERpcmVjdGlvbnMgZGlyZWN0aW9ucyA9IGdldExpbmVEaXJlY3Rpb25zKGxpbmUpOwogCi0gICAgICAgIGlmIChoID4gaG9yaXogJiYgaCA8IGJlc3RoKSB7Ci0gICAgICAgICAgICBiZXN0ID0gZW5kOwotICAgICAgICAgICAgYmVzdGggPSBoOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGJlc3QgIT0gb2Zmc2V0KQotICAgICAgICAgICAgcmV0dXJuIGJlc3Q7Ci0KLSAgICAgICAgaW50IGRpciA9IGdldFBhcmFncmFwaERpcmVjdGlvbihsaW5lKTsKLQotICAgICAgICBpZiAoZGlyID4gMCkgewotICAgICAgICAgICAgaWYgKGxpbmUgPT0gZ2V0TGluZUNvdW50KCkgLSAxKQotICAgICAgICAgICAgICAgIHJldHVybiBiZXN0OwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHJldHVybiBnZXRPZmZzZXRGb3JIb3Jpem9udGFsKGxpbmUgKyAxLCAtMTAwMDApOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKGxpbmUgPT0gMCkKLSAgICAgICAgICAgICAgICByZXR1cm4gYmVzdDsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0T2Zmc2V0Rm9ySG9yaXpvbnRhbChsaW5lIC0gMSwgLTEwMDAwKTsKLSAgICAgICAgfQorICAgICAgICBUZXh0TGluZSB0bCA9IFRleHRMaW5lLm9idGFpbigpOworICAgICAgICAvLyBYWFg6IHdlIGRvbid0IGNhcmUgYWJvdXQgdGFicworICAgICAgICB0bC5zZXQobVBhaW50LCBtVGV4dCwgbGluZVN0YXJ0LCBsaW5lRW5kLCBsaW5lRGlyLCBkaXJlY3Rpb25zLCBmYWxzZSwgbnVsbCk7CisgICAgICAgIGNhcmV0ID0gbGluZVN0YXJ0ICsgdGwuZ2V0T2Zmc2V0VG9MZWZ0UmlnaHRPZihjYXJldCAtIGxpbmVTdGFydCwgdG9MZWZ0KTsKKyAgICAgICAgdGwgPSBUZXh0TGluZS5yZWN5Y2xlKHRsKTsKKyAgICAgICAgcmV0dXJuIGNhcmV0OwogICAgIH0KIAogICAgIHByaXZhdGUgaW50IGdldE9mZnNldEF0U3RhcnRPZihpbnQgb2Zmc2V0KSB7CisgICAgICAgIC8vIFhYWCB0aGlzIHByb2JhYmx5IHNob3VsZCBza2lwIGxvY2FsIHJlb3JkZXJpbmdzIGFuZAorICAgICAgICAvLyB6ZXJvLXdpZHRoIGNoYXJhY3RlcnMsIGxvb2sgYXQgY2FsbGVycwogICAgICAgICBpZiAob2Zmc2V0ID09IDApCiAgICAgICAgICAgICByZXR1cm4gMDsKIApAQCAtMTExNSw3ICsxMTMwLDcgQEAKICAgICAvKioKICAgICAgKiBGaWxscyBpbiB0aGUgc3BlY2lmaWVkIFBhdGggd2l0aCBhIHJlcHJlc2VudGF0aW9uIG9mIGEgY3Vyc29yCiAgICAgICogYXQgdGhlIHNwZWNpZmllZCBvZmZzZXQuICBUaGlzIHdpbGwgb2Z0ZW4gYmUgYSB2ZXJ0aWNhbCBsaW5lCi0gICAgICogYnV0IGNhbiBiZSBtdWx0aXBsZSBkaXNjb250aW5vdXMgbGluZXMgaW4gdGV4dCB3aXRoIG11bHRpcGxlCisgICAgICogYnV0IGNhbiBiZSBtdWx0aXBsZSBkaXNjb250aW51b3VzIGxpbmVzIGluIHRleHQgd2l0aCBtdWx0aXBsZQogICAgICAqIGRpcmVjdGlvbmFsaXRpZXMuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgZ2V0Q3Vyc29yUGF0aChpbnQgcG9pbnQsIFBhdGggZGVzdCwKQEAgLTExMjcsNyArMTE0Miw4IEBACiAgICAgICAgIGludCBib3R0b20gPSBnZXRMaW5lVG9wKGxpbmUrMSk7CiAKICAgICAgICAgZmxvYXQgaDEgPSBnZXRQcmltYXJ5SG9yaXpvbnRhbChwb2ludCkgLSAwLjVmOwotICAgICAgICBmbG9hdCBoMiA9IGdldFNlY29uZGFyeUhvcml6b250YWwocG9pbnQpIC0gMC41ZjsKKyAgICAgICAgZmxvYXQgaDIgPSBpc0xldmVsQm91bmRhcnkocG9pbnQpID8KKyAgICAgICAgICAgICAgICAgICAgZ2V0U2Vjb25kYXJ5SG9yaXpvbnRhbChwb2ludCkgLSAwLjVmIDogaDE7CiAKICAgICAgICAgaW50IGNhcHMgPSBUZXh0S2V5TGlzdGVuZXIuZ2V0TWV0YVN0YXRlKGVkaXRpbmdCdWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXlFdmVudC5NRVRBX1NISUZUX09OKSB8CkBAIC0xMjA0LDkgKzEyMjAsMTAgQEAKICAgICAgICAgaWYgKGxpbmVlbmQgPiBsaW5lc3RhcnQgJiYgbVRleHQuY2hhckF0KGxpbmVlbmQgLSAxKSA9PSAnXG4nKQogICAgICAgICAgICAgbGluZWVuZC0tOwogCi0gICAgICAgIGludCBoZXJlID0gbGluZXN0YXJ0OwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRpcnMubURpcmVjdGlvbnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGludCB0aGVyZSA9IGhlcmUgKyBkaXJzLm1EaXJlY3Rpb25zW2ldOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRpcnMubURpcmVjdGlvbnMubGVuZ3RoOyBpICs9IDIpIHsKKyAgICAgICAgICAgIGludCBoZXJlID0gbGluZXN0YXJ0ICsgZGlycy5tRGlyZWN0aW9uc1tpXTsKKyAgICAgICAgICAgIGludCB0aGVyZSA9IGhlcmUgKyAoZGlycy5tRGlyZWN0aW9uc1tpKzFdICYgUlVOX0xFTkdUSF9NQVNLKTsKKwogICAgICAgICAgICAgaWYgKHRoZXJlID4gbGluZWVuZCkKICAgICAgICAgICAgICAgICB0aGVyZSA9IGxpbmVlbmQ7CiAKQEAgLTEyMTUsMTQgKzEyMzIsMTIgQEAKICAgICAgICAgICAgICAgICBpbnQgZW4gPSBNYXRoLm1pbihlbmQsIHRoZXJlKTsKIAogICAgICAgICAgICAgICAgIGlmIChzdCAhPSBlbikgewotICAgICAgICAgICAgICAgICAgICBmbG9hdCBoMSA9IGdldEhvcml6b250YWwoc3QsIGZhbHNlLCBmYWxzZSwgbGluZSk7Ci0gICAgICAgICAgICAgICAgICAgIGZsb2F0IGgyID0gZ2V0SG9yaXpvbnRhbChlbiwgdHJ1ZSwgZmFsc2UsIGxpbmUpOworICAgICAgICAgICAgICAgICAgICBmbG9hdCBoMSA9IGdldEhvcml6b250YWwoc3QsIGZhbHNlLCBsaW5lKTsKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQgaDIgPSBnZXRIb3Jpem9udGFsKGVuLCB0cnVlLCBsaW5lKTsKIAogICAgICAgICAgICAgICAgICAgICBkZXN0LmFkZFJlY3QoaDEsIHRvcCwgaDIsIGJvdHRvbSwgUGF0aC5EaXJlY3Rpb24uQ1cpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaGVyZSA9IHRoZXJlOwogICAgICAgICB9CiAgICAgfQogCkBAIC0xMjU3LDcgKzEyNzIsNyBAQAogCiAgICAgICAgICAgICBhZGRTZWxlY3Rpb24oc3RhcnRsaW5lLCBzdGFydCwgZ2V0TGluZUVuZChzdGFydGxpbmUpLAogICAgICAgICAgICAgICAgICAgICAgICAgIHRvcCwgZ2V0TGluZUJvdHRvbShzdGFydGxpbmUpLCBkZXN0KTsKLSAgICAgICAgICAgIAorCiAgICAgICAgICAgICBpZiAoZ2V0UGFyYWdyYXBoRGlyZWN0aW9uKHN0YXJ0bGluZSkgPT0gRElSX1JJR0hUX1RPX0xFRlQpCiAgICAgICAgICAgICAgICAgZGVzdC5hZGRSZWN0KGdldExpbmVMZWZ0KHN0YXJ0bGluZSksIHRvcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIGdldExpbmVCb3R0b20oc3RhcnRsaW5lKSwgUGF0aC5EaXJlY3Rpb24uQ1cpOwpAQCAtMTMxMCw0MjIgKzEzMjUsMTczIEBACiAgICAgICogR2V0IHRoZSBsZWZ0IGVkZ2Ugb2YgdGhlIHNwZWNpZmllZCBwYXJhZ3JhcGgsIGluc2V0IGJ5IGxlZnQgbWFyZ2lucy4KICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgaW50IGdldFBhcmFncmFwaExlZnQoaW50IGxpbmUpIHsKLSAgICAgICAgaW50IGRpciA9IGdldFBhcmFncmFwaERpcmVjdGlvbihsaW5lKTsKLQogICAgICAgICBpbnQgbGVmdCA9IDA7Ci0KLSAgICAgICAgYm9vbGVhbiBwYXIgPSBmYWxzZTsKLSAgICAgICAgaW50IG9mZiA9IGdldExpbmVTdGFydChsaW5lKTsKLSAgICAgICAgaWYgKG9mZiA9PSAwIHx8IG1UZXh0LmNoYXJBdChvZmYgLSAxKSA9PSAnXG4nKQotICAgICAgICAgICAgcGFyID0gdHJ1ZTsKLQotICAgICAgICBpZiAoZGlyID09IERJUl9MRUZUX1RPX1JJR0hUKSB7Ci0gICAgICAgICAgICBpZiAobVNwYW5uZWRUZXh0KSB7Ci0gICAgICAgICAgICAgICAgU3Bhbm5lZCBzcCA9IChTcGFubmVkKSBtVGV4dDsKLSAgICAgICAgICAgICAgICBMZWFkaW5nTWFyZ2luU3BhbltdIHNwYW5zID0gc3AuZ2V0U3BhbnMoZ2V0TGluZVN0YXJ0KGxpbmUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRMaW5lRW5kKGxpbmUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMZWFkaW5nTWFyZ2luU3Bhbi5jbGFzcyk7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNwYW5zLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gbWFyZ2luID0gcGFyOwotICAgICAgICAgICAgICAgICAgICBMZWFkaW5nTWFyZ2luU3BhbiBzcGFuID0gc3BhbnNbaV07Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzcGFuIGluc3RhbmNlb2YgTGVhZGluZ01hcmdpblNwYW4uTGVhZGluZ01hcmdpblNwYW4yKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgY291bnQgPSAoKExlYWRpbmdNYXJnaW5TcGFuLkxlYWRpbmdNYXJnaW5TcGFuMilzcGFuKS5nZXRMZWFkaW5nTWFyZ2luTGluZUNvdW50KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW4gPSBjb3VudCA+PSBsaW5lOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGxlZnQgKz0gc3Bhbi5nZXRMZWFkaW5nTWFyZ2luKG1hcmdpbik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQorICAgICAgICBpbnQgZGlyID0gZ2V0UGFyYWdyYXBoRGlyZWN0aW9uKGxpbmUpOworICAgICAgICBpZiAoZGlyID09IERJUl9SSUdIVF9UT19MRUZUIHx8ICFtU3Bhbm5lZFRleHQpIHsKKyAgICAgICAgICAgIHJldHVybiBsZWZ0OyAvLyBsZWFkaW5nIG1hcmdpbiBoYXMgbm8gaW1wYWN0LCBvciBubyBzdHlsZXMKICAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBsZWZ0OworICAgICAgICByZXR1cm4gZ2V0UGFyYWdyYXBoTGVhZGluZ01hcmdpbihsaW5lKTsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBHZXQgdGhlIHJpZ2h0IGVkZ2Ugb2YgdGhlIHNwZWNpZmllZCBwYXJhZ3JhcGgsIGluc2V0IGJ5IHJpZ2h0IG1hcmdpbnMuCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIGludCBnZXRQYXJhZ3JhcGhSaWdodChpbnQgbGluZSkgewotICAgICAgICBpbnQgZGlyID0gZ2V0UGFyYWdyYXBoRGlyZWN0aW9uKGxpbmUpOwotCiAgICAgICAgIGludCByaWdodCA9IG1XaWR0aDsKLQotICAgICAgICBib29sZWFuIHBhciA9IGZhbHNlOwotICAgICAgICBpbnQgb2ZmID0gZ2V0TGluZVN0YXJ0KGxpbmUpOwotICAgICAgICBpZiAob2ZmID09IDAgfHwgbVRleHQuY2hhckF0KG9mZiAtIDEpID09ICdcbicpCi0gICAgICAgICAgICBwYXIgPSB0cnVlOwotCi0KLSAgICAgICAgaWYgKGRpciA9PSBESVJfUklHSFRfVE9fTEVGVCkgewotICAgICAgICAgICAgaWYgKG1TcGFubmVkVGV4dCkgewotICAgICAgICAgICAgICAgIFNwYW5uZWQgc3AgPSAoU3Bhbm5lZCkgbVRleHQ7Ci0gICAgICAgICAgICAgICAgTGVhZGluZ01hcmdpblNwYW5bXSBzcGFucyA9IHNwLmdldFNwYW5zKGdldExpbmVTdGFydChsaW5lKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TGluZUVuZChsaW5lKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGVhZGluZ01hcmdpblNwYW4uY2xhc3MpOwotCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzcGFucy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICByaWdodCAtPSBzcGFuc1tpXS5nZXRMZWFkaW5nTWFyZ2luKHBhcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQorICAgICAgICBpbnQgZGlyID0gZ2V0UGFyYWdyYXBoRGlyZWN0aW9uKGxpbmUpOworICAgICAgICBpZiAoZGlyID09IERJUl9MRUZUX1RPX1JJR0hUIHx8ICFtU3Bhbm5lZFRleHQpIHsKKyAgICAgICAgICAgIHJldHVybiByaWdodDsgLy8gbGVhZGluZyBtYXJnaW4gaGFzIG5vIGltcGFjdCwgb3Igbm8gc3R5bGVzCiAgICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmlnaHQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGRyYXdUZXh0KENhbnZhcyBjYW52YXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFyU2VxdWVuY2UgdGV4dCwgaW50IHN0YXJ0LCBpbnQgZW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRpciwgRGlyZWN0aW9ucyBkaXJlY3Rpb25zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeCwgaW50IHRvcCwgaW50IHksIGludCBib3R0b20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXh0UGFpbnQgcGFpbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXh0UGFpbnQgd29ya1BhaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBoYXNUYWJzLCBPYmplY3RbXSBwYXJzcGFucykgewotICAgICAgICBjaGFyW10gYnVmOwotICAgICAgICBpZiAoIWhhc1RhYnMpIHsKLSAgICAgICAgICAgIGlmIChkaXJlY3Rpb25zID09IERJUlNfQUxMX0xFRlRfVE9fUklHSFQpIHsKLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoRElSX0xFRlRfVE9fUklHSFQgPT0gZGlyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgU3R5bGVkLmRyYXdUZXh0KGNhbnZhcywgdGV4dCwgc3RhcnQsIGVuZCwgZGlyLCBmYWxzZSwgeCwgdG9wLCB5LCBib3R0b20sIHBhaW50LCB3b3JrUGFpbnQsIGZhbHNlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBidWYgPSBudWxsOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYnVmID0gVGV4dFV0aWxzLm9idGFpbihlbmQgLSBzdGFydCk7Ci0gICAgICAgICAgICBUZXh0VXRpbHMuZ2V0Q2hhcnModGV4dCwgc3RhcnQsIGVuZCwgYnVmLCAwKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZsb2F0IGggPSAwOwotCi0gICAgICAgIGludCBoZXJlID0gMDsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkaXJlY3Rpb25zLm1EaXJlY3Rpb25zLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBpbnQgdGhlcmUgPSBoZXJlICsgZGlyZWN0aW9ucy5tRGlyZWN0aW9uc1tpXTsKLSAgICAgICAgICAgIGlmICh0aGVyZSA+IGVuZCAtIHN0YXJ0KQotICAgICAgICAgICAgICAgIHRoZXJlID0gZW5kIC0gc3RhcnQ7Ci0KLSAgICAgICAgICAgIGludCBzZWdzdGFydCA9IGhlcmU7Ci0gICAgICAgICAgICBmb3IgKGludCBqID0gaGFzVGFicyA/IGhlcmUgOiB0aGVyZTsgaiA8PSB0aGVyZTsgaisrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGogPT0gdGhlcmUgfHwgYnVmW2pdID09ICdcdCcpIHsKLSAgICAgICAgICAgICAgICAgICAgaCArPSBTdHlsZWQuZHJhd1RleHQoY2FudmFzLCB0ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCArIHNlZ3N0YXJ0LCBzdGFydCArIGosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpciwgKGkgJiAxKSAhPSAwLCB4ICsgaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9wLCB5LCBib3R0b20sIHBhaW50LCB3b3JrUGFpbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ICsgaiAhPSBlbmQpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChqICE9IHRoZXJlICYmIGJ1ZltqXSA9PSAnXHQnKQotICAgICAgICAgICAgICAgICAgICAgICAgaCA9IGRpciAqIG5leHRUYWIodGV4dCwgc3RhcnQsIGVuZCwgaCAqIGRpciwgcGFyc3BhbnMpOwotCi0gICAgICAgICAgICAgICAgICAgIHNlZ3N0YXJ0ID0gaiArIDE7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChoYXNUYWJzICYmIGJ1ZltqXSA+PSAweEQ4MDAgJiYgYnVmW2pdIDw9IDB4REZGRiAmJiBqICsgMSA8IHRoZXJlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBlbW9qaSA9IENoYXJhY3Rlci5jb2RlUG9pbnRBdChidWYsIGopOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChlbW9qaSA+PSBNSU5fRU1PSkkgJiYgZW1vamkgPD0gTUFYX0VNT0pJKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBCaXRtYXAgYm0gPSBFTU9KSV9GQUNUT1JZLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEJpdG1hcEZyb21BbmRyb2lkUHVhKGVtb2ppKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJtICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBoICs9IFN0eWxlZC5kcmF3VGV4dChjYW52YXMsIHRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgKyBzZWdzdGFydCwgc3RhcnQgKyBqLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpciwgKGkgJiAxKSAhPSAwLCB4ICsgaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3AsIHksIGJvdHRvbSwgcGFpbnQsIHdvcmtQYWludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCArIGogIT0gZW5kKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtRW1vamlSZWN0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUVtb2ppUmVjdCA9IG5ldyBSZWN0RigpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtQYWludC5zZXQocGFpbnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0eWxlZC5tZWFzdXJlVGV4dChwYWludCwgd29ya1BhaW50LCB0ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCArIGosIHN0YXJ0ICsgaiArIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGJpdG1hcEhlaWdodCA9IGJtLmdldEhlaWdodCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHRleHRIZWlnaHQgPSAtd29ya1BhaW50LmFzY2VudCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHNjYWxlID0gdGV4dEhlaWdodCAvIGJpdG1hcEhlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB3aWR0aCA9IGJtLmdldFdpZHRoKCkgKiBzY2FsZTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1FbW9qaVJlY3Quc2V0KHggKyBoLCB5IC0gdGV4dEhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ICsgaCArIHdpZHRoLCB5KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbnZhcy5kcmF3Qml0bWFwKGJtLCBudWxsLCBtRW1vamlSZWN0LCBwYWludCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaCArPSB3aWR0aDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGorKzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWdzdGFydCA9IGogKyAxOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBoZXJlID0gdGhlcmU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaGFzVGFicykKLSAgICAgICAgICAgIFRleHRVdGlscy5yZWN5Y2xlKGJ1Zik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmxvYXQgbWVhc3VyZVRleHQoVGV4dFBhaW50IHBhaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRleHRQYWludCB3b3JrUGFpbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhclNlcXVlbmNlIHRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0LCBpbnQgb2Zmc2V0LCBpbnQgZW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkaXIsIERpcmVjdGlvbnMgZGlyZWN0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHRyYWlsaW5nLCBib29sZWFuIGFsdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGhhc1RhYnMsIE9iamVjdFtdIHRhYnMpIHsKLSAgICAgICAgY2hhcltdIGJ1ZiA9IG51bGw7Ci0KLSAgICAgICAgaWYgKGhhc1RhYnMpIHsKLSAgICAgICAgICAgIGJ1ZiA9IFRleHRVdGlscy5vYnRhaW4oZW5kIC0gc3RhcnQpOwotICAgICAgICAgICAgVGV4dFV0aWxzLmdldENoYXJzKHRleHQsIHN0YXJ0LCBlbmQsIGJ1ZiwgMCk7Ci0gICAgICAgIH0KLQotICAgICAgICBmbG9hdCBoID0gMDsKLQotICAgICAgICBpZiAoYWx0KSB7Ci0gICAgICAgICAgICBpZiAoZGlyID09IERJUl9SSUdIVF9UT19MRUZUKQotICAgICAgICAgICAgICAgIHRyYWlsaW5nID0gIXRyYWlsaW5nOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IGhlcmUgPSAwOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRpcmVjdGlvbnMubURpcmVjdGlvbnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChhbHQpCi0gICAgICAgICAgICAgICAgdHJhaWxpbmcgPSAhdHJhaWxpbmc7Ci0KLSAgICAgICAgICAgIGludCB0aGVyZSA9IGhlcmUgKyBkaXJlY3Rpb25zLm1EaXJlY3Rpb25zW2ldOwotICAgICAgICAgICAgaWYgKHRoZXJlID4gZW5kIC0gc3RhcnQpCi0gICAgICAgICAgICAgICAgdGhlcmUgPSBlbmQgLSBzdGFydDsKLQotICAgICAgICAgICAgaW50IHNlZ3N0YXJ0ID0gaGVyZTsKLSAgICAgICAgICAgIGZvciAoaW50IGogPSBoYXNUYWJzID8gaGVyZSA6IHRoZXJlOyBqIDw9IHRoZXJlOyBqKyspIHsKLSAgICAgICAgICAgICAgICBpbnQgY29kZXB0ID0gMDsKLSAgICAgICAgICAgICAgICBCaXRtYXAgYm0gPSBudWxsOwotCi0gICAgICAgICAgICAgICAgaWYgKGhhc1RhYnMgJiYgaiA8IHRoZXJlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvZGVwdCA9IGJ1ZltqXTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoY29kZXB0ID49IDB4RDgwMCAmJiBjb2RlcHQgPD0gMHhERkZGICYmIGogKyAxIDwgdGhlcmUpIHsKLSAgICAgICAgICAgICAgICAgICAgY29kZXB0ID0gQ2hhcmFjdGVyLmNvZGVQb2ludEF0KGJ1Ziwgaik7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGVwdCA+PSBNSU5fRU1PSkkgJiYgY29kZXB0IDw9IE1BWF9FTU9KSSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYm0gPSBFTU9KSV9GQUNUT1JZLmdldEJpdG1hcEZyb21BbmRyb2lkUHVhKGNvZGVwdCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoaiA9PSB0aGVyZSB8fCBjb2RlcHQgPT0gJ1x0JyB8fCBibSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZsb2F0IHNlZ3c7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG9mZnNldCA8IHN0YXJ0ICsgaiB8fAotICAgICAgICAgICAgICAgICAgICAgICAodHJhaWxpbmcgJiYgb2Zmc2V0IDw9IHN0YXJ0ICsgaikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkaXIgPT0gRElSX0xFRlRfVE9fUklHSFQgJiYgKGkgJiAxKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaCArPSBTdHlsZWQubWVhc3VyZVRleHQocGFpbnQsIHdvcmtQYWludCwgdGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCArIHNlZ3N0YXJ0LCBvZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGg7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkaXIgPT0gRElSX1JJR0hUX1RPX0xFRlQgJiYgKGkgJiAxKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaCAtPSBTdHlsZWQubWVhc3VyZVRleHQocGFpbnQsIHdvcmtQYWludCwgdGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCArIHNlZ3N0YXJ0LCBvZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGg7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBzZWd3ID0gU3R5bGVkLm1lYXN1cmVUZXh0KHBhaW50LCB3b3JrUGFpbnQsIHRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgKyBzZWdzdGFydCwgc3RhcnQgKyBqLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChvZmZzZXQgPCBzdGFydCArIGogfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICh0cmFpbGluZyAmJiBvZmZzZXQgPD0gc3RhcnQgKyBqKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRpciA9PSBESVJfTEVGVF9UT19SSUdIVCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGggKz0gc2VndyAtIFN0eWxlZC5tZWFzdXJlVGV4dChwYWludCwgd29ya1BhaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCArIHNlZ3N0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsIG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBoOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGlyID09IERJUl9SSUdIVF9UT19MRUZUKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaCAtPSBzZWd3IC0gU3R5bGVkLm1lYXN1cmVUZXh0KHBhaW50LCB3b3JrUGFpbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ICsgc2Vnc3RhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGg7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAoZGlyID09IERJUl9SSUdIVF9UT19MRUZUKQotICAgICAgICAgICAgICAgICAgICAgICAgaCAtPSBzZWd3OwotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICBoICs9IHNlZ3c7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGogIT0gdGhlcmUgJiYgYnVmW2pdID09ICdcdCcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvZmZzZXQgPT0gc3RhcnQgKyBqKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBoOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBoID0gZGlyICogbmV4dFRhYih0ZXh0LCBzdGFydCwgZW5kLCBoICogZGlyLCB0YWJzKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmIChibSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3b3JrUGFpbnQuc2V0KHBhaW50KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0eWxlZC5tZWFzdXJlVGV4dChwYWludCwgd29ya1BhaW50LCB0ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGosIGogKyAyLCBudWxsKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgd2lkID0gKGZsb2F0KSBibS5nZXRXaWR0aCgpICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC13b3JrUGFpbnQuYXNjZW50KCkgLyBibS5nZXRIZWlnaHQoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRpciA9PSBESVJfUklHSFRfVE9fTEVGVCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGggLT0gd2lkOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBoICs9IHdpZDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaisrOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgc2Vnc3RhcnQgPSBqICsgMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGhlcmUgPSB0aGVyZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChoYXNUYWJzKQotICAgICAgICAgICAgVGV4dFV0aWxzLnJlY3ljbGUoYnVmKTsKLQotICAgICAgICByZXR1cm4gaDsKKyAgICAgICAgcmV0dXJuIHJpZ2h0IC0gZ2V0UGFyYWdyYXBoTGVhZGluZ01hcmdpbihsaW5lKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBNZWFzdXJlIHdpZHRoIG9mIGEgcnVuIG9mIHRleHQgb24gYSBzaW5nbGUgbGluZSB0aGF0IGlzIGtub3duIHRvIGFsbCBiZQotICAgICAqIGluIHRoZSBzYW1lIGRpcmVjdGlvbiBhcyB0aGUgcGFyYWdyYXBoIGJhc2UgZGlyZWN0aW9uLiBSZXR1cm5zIHRoZSB3aWR0aCwKLSAgICAgKiBhbmQgdGhlIGxpbmUgbWV0cmljcyBpbiBmbSBpZiBmbSBpcyBub3QgbnVsbC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwYWludCB0aGUgcGFpbnQgZm9yIHRoZSB0ZXh0OyB3aWxsIG5vdCBiZSBtb2RpZmllZAotICAgICAqIEBwYXJhbSB3b3JrUGFpbnQgcGFpbnQgYXZhaWxhYmxlIGZvciBtb2RpZmljYXRpb24KLSAgICAgKiBAcGFyYW0gdGV4dCB0ZXh0Ci0gICAgICogQHBhcmFtIHN0YXJ0IHN0YXJ0IG9mIHRoZSBsaW5lCi0gICAgICogQHBhcmFtIGVuZCBsaW1pdCBvZiB0aGUgbGluZQotICAgICAqIEBwYXJhbSBmbSBvYmplY3QgdG8gcmV0dXJuIGludGVnZXIgbWV0cmljcyBpbiwgY2FuIGJlIG51bGwKLSAgICAgKiBAcGFyYW0gaGFzVGFicyB0cnVlIGlmIGl0IGlzIGtub3duIHRoYXQgdGhlIGxpbmUgaGFzIHRhYnMKLSAgICAgKiBAcGFyYW0gdGFicyB0YWIgcG9zaXRpb24gaW5mb3JtYXRpb24KLSAgICAgKiBAcmV0dXJuIHRoZSB3aWR0aCBvZiB0aGUgdGV4dCBmcm9tIHN0YXJ0IHRvIGVuZAorICAgICAqIFJldHVybnMgdGhlIGVmZmVjdGl2ZSBsZWFkaW5nIG1hcmdpbiAodW5zaWduZWQpIGZvciB0aGlzIGxpbmUsCisgICAgICogdGFraW5nIGludG8gYWNjb3VudCBMZWFkaW5nTWFyZ2luU3BhbiBhbmQgTGVhZGluZ01hcmdpblNwYW4yLgorICAgICAqIEBwYXJhbSBsaW5lIHRoZSBsaW5lIGluZGV4CisgICAgICogQHJldHVybiB0aGUgbGVhZGluZyBtYXJnaW4gb2YgdGhpcyBsaW5lCiAgICAgICovCi0gICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmxvYXQgbWVhc3VyZVRleHQoVGV4dFBhaW50IHBhaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRleHRQYWludCB3b3JrUGFpbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhclNlcXVlbmNlIHRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0LCBpbnQgZW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhaW50LkZvbnRNZXRyaWNzSW50IGZtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaGFzVGFicywgT2JqZWN0W10gdGFicykgewotICAgICAgICBjaGFyW10gYnVmID0gbnVsbDsKLSAgCi0gICAgICAgIGlmIChoYXNUYWJzKSB7Ci0gICAgICAgICAgICBidWYgPSBUZXh0VXRpbHMub2J0YWluKGVuZCAtIHN0YXJ0KTsKLSAgICAgICAgICAgIFRleHRVdGlscy5nZXRDaGFycyh0ZXh0LCBzdGFydCwgZW5kLCBidWYsIDApOworICAgIHByaXZhdGUgaW50IGdldFBhcmFncmFwaExlYWRpbmdNYXJnaW4oaW50IGxpbmUpIHsKKyAgICAgICAgaWYgKCFtU3Bhbm5lZFRleHQpIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIFNwYW5uZWQgc3Bhbm5lZCA9IChTcGFubmVkKSBtVGV4dDsKKworICAgICAgICBpbnQgbGluZVN0YXJ0ID0gZ2V0TGluZVN0YXJ0KGxpbmUpOworICAgICAgICBpbnQgbGluZUVuZCA9IGdldExpbmVFbmQobGluZSk7CisgICAgICAgIGludCBzcGFuRW5kID0gc3Bhbm5lZC5uZXh0U3BhblRyYW5zaXRpb24obGluZVN0YXJ0LCBsaW5lRW5kLAorICAgICAgICAgICAgICAgIExlYWRpbmdNYXJnaW5TcGFuLmNsYXNzKTsKKyAgICAgICAgTGVhZGluZ01hcmdpblNwYW5bXSBzcGFucyA9IHNwYW5uZWQuZ2V0U3BhbnMobGluZVN0YXJ0LCBzcGFuRW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGVhZGluZ01hcmdpblNwYW4uY2xhc3MpOworICAgICAgICBpZiAoc3BhbnMubGVuZ3RoID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiAwOyAvLyBubyBsZWFkaW5nIG1hcmdpbiBzcGFuOwogICAgICAgICB9CiAKLSAgICAgICAgaW50IGxlbiA9IGVuZCAtIHN0YXJ0OworICAgICAgICBpbnQgbWFyZ2luID0gMDsKIAotICAgICAgICBpbnQgbGFzdFBvcyA9IDA7Ci0gICAgICAgIGZsb2F0IHdpZHRoID0gMDsKLSAgICAgICAgaW50IGFzY2VudCA9IDAsIGRlc2NlbnQgPSAwLCB0b3AgPSAwLCBib3R0b20gPSAwOworICAgICAgICBib29sZWFuIGlzRmlyc3RQYXJhTGluZSA9IGxpbmVTdGFydCA9PSAwIHx8CisgICAgICAgICAgICBzcGFubmVkLmNoYXJBdChsaW5lU3RhcnQgLSAxKSA9PSAnXG4nOwogCi0gICAgICAgIGlmIChmbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmbS5hc2NlbnQgPSAwOwotICAgICAgICAgICAgZm0uZGVzY2VudCA9IDA7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKGludCBwb3MgPSBoYXNUYWJzID8gMCA6IGxlbjsgcG9zIDw9IGxlbjsgcG9zKyspIHsKLSAgICAgICAgICAgIGludCBjb2RlcHQgPSAwOwotICAgICAgICAgICAgQml0bWFwIGJtID0gbnVsbDsKLQotICAgICAgICAgICAgaWYgKGhhc1RhYnMgJiYgcG9zIDwgbGVuKSB7Ci0gICAgICAgICAgICAgICAgY29kZXB0ID0gYnVmW3Bvc107CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3BhbnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIExlYWRpbmdNYXJnaW5TcGFuIHNwYW4gPSBzcGFuc1tpXTsKKyAgICAgICAgICAgIGJvb2xlYW4gdXNlRmlyc3RMaW5lTWFyZ2luID0gaXNGaXJzdFBhcmFMaW5lOworICAgICAgICAgICAgaWYgKHNwYW4gaW5zdGFuY2VvZiBMZWFkaW5nTWFyZ2luU3BhbjIpIHsKKyAgICAgICAgICAgICAgICBpbnQgc3BTdGFydCA9IHNwYW5uZWQuZ2V0U3BhblN0YXJ0KHNwYW4pOworICAgICAgICAgICAgICAgIGludCBzcGFuTGluZSA9IGdldExpbmVGb3JPZmZzZXQoc3BTdGFydCk7CisgICAgICAgICAgICAgICAgaW50IGNvdW50ID0gKChMZWFkaW5nTWFyZ2luU3BhbjIpc3BhbikuZ2V0TGVhZGluZ01hcmdpbkxpbmVDb3VudCgpOworICAgICAgICAgICAgICAgIHVzZUZpcnN0TGluZU1hcmdpbiA9IGxpbmUgPCBzcGFuTGluZSArIGNvdW50OwogICAgICAgICAgICAgfQorICAgICAgICAgICAgbWFyZ2luICs9IHNwYW4uZ2V0TGVhZGluZ01hcmdpbih1c2VGaXJzdExpbmVNYXJnaW4pOworICAgICAgICB9CiAKLSAgICAgICAgICAgIGlmIChjb2RlcHQgPj0gMHhEODAwICYmIGNvZGVwdCA8PSAweERGRkYgJiYgcG9zIDwgbGVuKSB7Ci0gICAgICAgICAgICAgICAgY29kZXB0ID0gQ2hhcmFjdGVyLmNvZGVQb2ludEF0KGJ1ZiwgcG9zKTsKKyAgICAgICAgcmV0dXJuIG1hcmdpbjsKKyAgICB9CiAKLSAgICAgICAgICAgICAgICBpZiAoY29kZXB0ID49IE1JTl9FTU9KSSAmJiBjb2RlcHQgPD0gTUFYX0VNT0pJKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJtID0gRU1PSklfRkFDVE9SWS5nZXRCaXRtYXBGcm9tQW5kcm9pZFB1YShjb2RlcHQpOworICAgIC8qIHBhY2thZ2UgKi8KKyAgICBzdGF0aWMgZmxvYXQgbWVhc3VyZVBhcmEoVGV4dFBhaW50IHBhaW50LCBUZXh0UGFpbnQgd29ya1BhaW50LAorICAgICAgICAgICAgQ2hhclNlcXVlbmNlIHRleHQsIGludCBzdGFydCwgaW50IGVuZCkgeworCisgICAgICAgIE1lYXN1cmVkVGV4dCBtdCA9IE1lYXN1cmVkVGV4dC5vYnRhaW4oKTsKKyAgICAgICAgVGV4dExpbmUgdGwgPSBUZXh0TGluZS5vYnRhaW4oKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG10LnNldFBhcmEodGV4dCwgc3RhcnQsIGVuZCwgRElSX1JFUVVFU1RfTFRSKTsKKyAgICAgICAgICAgIERpcmVjdGlvbnMgZGlyZWN0aW9uczsKKyAgICAgICAgICAgIGludCBkaXI7CisgICAgICAgICAgICBpZiAobXQubUVhc3kpIHsKKyAgICAgICAgICAgICAgICBkaXJlY3Rpb25zID0gRElSU19BTExfTEVGVF9UT19SSUdIVDsKKyAgICAgICAgICAgICAgICBkaXIgPSBMYXlvdXQuRElSX0xFRlRfVE9fUklHSFQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGRpcmVjdGlvbnMgPSBBbmRyb2lkQmlkaS5kaXJlY3Rpb25zKG10Lm1EaXIsIG10Lm1MZXZlbHMsCisgICAgICAgICAgICAgICAgICAgIDAsIG10Lm1DaGFycywgMCwgbXQubUxlbik7CisgICAgICAgICAgICAgICAgZGlyID0gbXQubURpcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNoYXJbXSBjaGFycyA9IG10Lm1DaGFyczsKKyAgICAgICAgICAgIGludCBsZW4gPSBtdC5tTGVuOworICAgICAgICAgICAgYm9vbGVhbiBoYXNUYWJzID0gZmFsc2U7CisgICAgICAgICAgICBUYWJTdG9wcyB0YWJTdG9wcyA9IG51bGw7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgKytpKSB7CisgICAgICAgICAgICAgICAgaWYgKGNoYXJzW2ldID09ICdcdCcpIHsKKyAgICAgICAgICAgICAgICAgICAgaGFzVGFicyA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGlmICh0ZXh0IGluc3RhbmNlb2YgU3Bhbm5lZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgU3Bhbm5lZCBzcGFubmVkID0gKFNwYW5uZWQpIHRleHQ7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3BhbkVuZCA9IHNwYW5uZWQubmV4dFNwYW5UcmFuc2l0aW9uKHN0YXJ0LCBlbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhYlN0b3BTcGFuLmNsYXNzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFRhYlN0b3BTcGFuW10gc3BhbnMgPSBzcGFubmVkLmdldFNwYW5zKHN0YXJ0LCBzcGFuRW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYWJTdG9wU3Bhbi5jbGFzcyk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3BhbnMubGVuZ3RoID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYlN0b3BzID0gbmV3IFRhYlN0b3BzKFRBQl9JTkNSRU1FTlQsIHNwYW5zKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CisgICAgICAgICAgICB0bC5zZXQocGFpbnQsIHRleHQsIHN0YXJ0LCBlbmQsIGRpciwgZGlyZWN0aW9ucywgaGFzVGFicywgdGFiU3RvcHMpOworICAgICAgICAgICAgcmV0dXJuIHRsLm1ldHJpY3MobnVsbCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBUZXh0TGluZS5yZWN5Y2xlKHRsKTsKKyAgICAgICAgICAgIE1lYXN1cmVkVGV4dC5yZWN5Y2xlKG10KTsKKyAgICAgICAgfQorICAgIH0KIAotICAgICAgICAgICAgaWYgKHBvcyA9PSBsZW4gfHwgY29kZXB0ID09ICdcdCcgfHwgYm0gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHdvcmtQYWludC5iYXNlbGluZVNoaWZ0ID0gMDsKKyAgICAvKioKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGNsYXNzIFRhYlN0b3BzIHsKKyAgICAgICAgcHJpdmF0ZSBpbnRbXSBtU3RvcHM7CisgICAgICAgIHByaXZhdGUgaW50IG1OdW1TdG9wczsKKyAgICAgICAgcHJpdmF0ZSBpbnQgbUluY3JlbWVudDsKIAotICAgICAgICAgICAgICAgIHdpZHRoICs9IFN0eWxlZC5tZWFzdXJlVGV4dChwYWludCwgd29ya1BhaW50LCB0ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ICsgbGFzdFBvcywgc3RhcnQgKyBwb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm0pOworICAgICAgICBUYWJTdG9wcyhpbnQgaW5jcmVtZW50LCBPYmplY3RbXSBzcGFucykgeworICAgICAgICAgICAgcmVzZXQoaW5jcmVtZW50LCBzcGFucyk7CisgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIGlmIChmbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh3b3JrUGFpbnQuYmFzZWxpbmVTaGlmdCA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZtLmFzY2VudCArPSB3b3JrUGFpbnQuYmFzZWxpbmVTaGlmdDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZtLnRvcCArPSB3b3JrUGFpbnQuYmFzZWxpbmVTaGlmdDsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZtLmRlc2NlbnQgKz0gd29ya1BhaW50LmJhc2VsaW5lU2hpZnQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmbS5ib3R0b20gKz0gd29ya1BhaW50LmJhc2VsaW5lU2hpZnQ7CisgICAgICAgIHZvaWQgcmVzZXQoaW50IGluY3JlbWVudCwgT2JqZWN0W10gc3BhbnMpIHsKKyAgICAgICAgICAgIHRoaXMubUluY3JlbWVudCA9IGluY3JlbWVudDsKKworICAgICAgICAgICAgaW50IG5zID0gMDsKKyAgICAgICAgICAgIGlmIChzcGFucyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaW50W10gc3RvcHMgPSB0aGlzLm1TdG9wczsKKyAgICAgICAgICAgICAgICBmb3IgKE9iamVjdCBvIDogc3BhbnMpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBUYWJTdG9wU3BhbikgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0b3BzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9wcyA9IG5ldyBpbnRbMTBdOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChucyA9PSBzdG9wcy5sZW5ndGgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRbXSBuc3RvcHMgPSBuZXcgaW50W25zICogMl07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuczsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zdG9wc1tpXSA9IHN0b3BzW2ldOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9wcyA9IG5zdG9wczsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0b3BzW25zKytdID0gKChUYWJTdG9wU3BhbikgbykuZ2V0VGFiU3RvcCgpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHBvcyAhPSBsZW4pIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGJtID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vIGVtb2ppLCBtdXN0IGhhdmUgaGl0IGEgdGFiCi0gICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCA9IG5leHRUYWIodGV4dCwgc3RhcnQsIGVuZCwgd2lkdGgsIHRhYnMpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBzZXRzIHVwIHdvcmtQYWludCB3aXRoIHRoZSBmb250IG9uIHRoZSBlbW9qaQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGV4dCwgc28gdGhhdCB3ZSBjYW4gZXh0cmFjdCB0aGUgYXNjZW50IGFuZCBzY2FsZS4KLQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgY2FuJ3QgdXNlIHRoZSByZXN1bHQgb2YgdGhlIHByZXZpb3VzIGNhbGwgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1lYXN1cmVUZXh0IGJlY2F1c2UgdGhlIGVtb2ppIG1pZ2h0IGhhdmUgaXRzIG93biBzdHlsZS4KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGhhdmUgdG8gaW5pdGlhbGl6ZSB3b3JrUGFpbnQgaGVyZSBiZWNhdXNlIGlmIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGV4dCBpcyB1bnN0eWxlZCBtZWFzdXJlVGV4dCBtaWdodCBub3QgdXNlIHdvcmtQYWludAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXQgYWxsLgotICAgICAgICAgICAgICAgICAgICAgICAgd29ya1BhaW50LnNldChwYWludCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHlsZWQubWVhc3VyZVRleHQocGFpbnQsIHdvcmtQYWludCwgdGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCArIHBvcywgc3RhcnQgKyBwb3MgKyAxLCBudWxsKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGggKz0gKGZsb2F0KSBibS5nZXRXaWR0aCgpICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC13b3JrUGFpbnQuYXNjZW50KCkgLyBibS5nZXRIZWlnaHQoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2luY2Ugd2UgaGFkIGFuIGVtb2ppLCB3ZSBidW1wIHBhc3QgdGhlIHNlY29uZCBoYWxmCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBvZiB0aGUgc3Vycm9nYXRlIHBhaXIuCi0gICAgICAgICAgICAgICAgICAgICAgICBwb3MrKzsKLSAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChucyA+IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgQXJyYXlzLnNvcnQoc3RvcHMsIDAsIG5zKTsKICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoZm0gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoZm0uYXNjZW50IDwgYXNjZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhc2NlbnQgPSBmbS5hc2NlbnQ7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGZtLmRlc2NlbnQgPiBkZXNjZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZXNjZW50ID0gZm0uZGVzY2VudDsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmIChmbS50b3AgPCB0b3ApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRvcCA9IGZtLnRvcDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoZm0uYm90dG9tID4gYm90dG9tKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBib3R0b20gPSBmbS5ib3R0b207Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvLyBObyBuZWVkIHRvIHRha2UgYml0bWFwIGhlaWdodCBpbnRvIGFjY291bnQgaGVyZSwKLSAgICAgICAgICAgICAgICAgICAgLy8gc2luY2UgaXQgaXMgc2NhbGVkIHRvIG1hdGNoIHRoZSB0ZXh0IGhlaWdodC4KKyAgICAgICAgICAgICAgICBpZiAoc3RvcHMgIT0gdGhpcy5tU3RvcHMpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5tU3RvcHMgPSBzdG9wczsKICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBsYXN0UG9zID0gcG9zICsgMTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRoaXMubU51bVN0b3BzID0gbnM7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoZm0gIT0gbnVsbCkgewotICAgICAgICAgICAgZm0uYXNjZW50ID0gYXNjZW50OwotICAgICAgICAgICAgZm0uZGVzY2VudCA9IGRlc2NlbnQ7Ci0gICAgICAgICAgICBmbS50b3AgPSB0b3A7Ci0gICAgICAgICAgICBmbS5ib3R0b20gPSBib3R0b207CisgICAgICAgIGZsb2F0IG5leHRUYWIoZmxvYXQgaCkgeworICAgICAgICAgICAgaW50IG5zID0gdGhpcy5tTnVtU3RvcHM7CisgICAgICAgICAgICBpZiAobnMgPiAwKSB7CisgICAgICAgICAgICAgICAgaW50W10gc3RvcHMgPSB0aGlzLm1TdG9wczsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5zOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IHN0b3AgPSBzdG9wc1tpXTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0b3AgPiBoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RvcDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBuZXh0RGVmYXVsdFN0b3AoaCwgbUluY3JlbWVudCk7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoaGFzVGFicykKLSAgICAgICAgICAgIFRleHRVdGlscy5yZWN5Y2xlKGJ1Zik7Ci0KLSAgICAgICAgcmV0dXJuIHdpZHRoOworICAgICAgICBwdWJsaWMgc3RhdGljIGZsb2F0IG5leHREZWZhdWx0U3RvcChmbG9hdCBoLCBpbnQgaW5jKSB7CisgICAgICAgICAgICByZXR1cm4gKChpbnQpICgoaCArIGluYykgLyBpbmMpKSAqIGluYzsKKyAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgpAQCAtMTgwNCwyMyArMTU3MCwyMiBAQAogCiAgICAgLyoqCiAgICAgICogU3RvcmVzIGluZm9ybWF0aW9uIGFib3V0IGJpZGlyZWN0aW9uYWwgKGxlZnQtdG8tcmlnaHQgb3IgcmlnaHQtdG8tbGVmdCkKLSAgICAgKiB0ZXh0IHdpdGhpbiB0aGUgbGF5b3V0IG9mIGEgbGluZS4gIFRPRE86IFRoaXMgd29yayBpcyBub3QgY29tcGxldGUKLSAgICAgKiBvciBjb3JyZWN0IGFuZCB3aWxsIGJlIGZsZXNoZWQgb3V0IGluIGEgbGF0ZXIgcmV2aXNpb24uCisgICAgICogdGV4dCB3aXRoaW4gdGhlIGxheW91dCBvZiBhIGxpbmUuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBEaXJlY3Rpb25zIHsKLSAgICAgICAgcHJpdmF0ZSBzaG9ydFtdIG1EaXJlY3Rpb25zOworICAgICAgICAvLyBEaXJlY3Rpb25zIHJlcHJlc2VudHMgZGlyZWN0aW9uYWwgcnVucyB3aXRoaW4gYSBsaW5lIG9mIHRleHQuCisgICAgICAgIC8vIFJ1bnMgYXJlIHBhaXJzIG9mIGludHMgbGlzdGVkIGluIHZpc3VhbCBvcmRlciwgc3RhcnRpbmcgZnJvbSB0aGUKKyAgICAgICAgLy8gbGVhZGluZyBtYXJnaW4uICBUaGUgZmlyc3QgaW50IG9mIGVhY2ggcGFpciBpcyB0aGUgb2Zmc2V0IGZyb20KKyAgICAgICAgLy8gdGhlIGZpcnN0IGNoYXJhY3RlciBvZiB0aGUgbGluZSB0byB0aGUgc3RhcnQgb2YgdGhlIHJ1bi4gIFRoZQorICAgICAgICAvLyBzZWNvbmQgaW50IHJlcHJlc2VudHMgYm90aCB0aGUgbGVuZ3RoIGFuZCBsZXZlbCBvZiB0aGUgcnVuLgorICAgICAgICAvLyBUaGUgbGVuZ3RoIGlzIGluIHRoZSBsb3dlciBiaXRzLCBhY2Nlc3NlZCBieSBtYXNraW5nIHdpdGgKKyAgICAgICAgLy8gRElSX0xFTkdUSF9NQVNLLiAgVGhlIGxldmVsIGlzIGluIHRoZSBoaWdoZXIgYml0cywgYWNjZXNzZWQKKyAgICAgICAgLy8gYnkgc2hpZnRpbmcgYnkgRElSX0xFVkVMX1NISUZUIGFuZCBtYXNraW5nIGJ5IERJUl9MRVZFTF9NQVNLLgorICAgICAgICAvLyBUbyBzaW1wbHkgdGVzdCBmb3IgYW4gUlRMIGRpcmVjdGlvbiwgdGVzdCB0aGUgYml0IHVzaW5nCisgICAgICAgIC8vIERJUl9SVExfRkxBRywgaWYgc2V0IHRoZW4gdGhlIGRpcmVjdGlvbiBpcyBydGwuCiAKLSAgICAgICAgLy8gVGhlIHZhbHVlcyBpbiBtRGlyZWN0aW9ucyBhcmUgdGhlIG9mZnNldHMgZnJvbSB0aGUgZmlyc3QgY2hhcmFjdGVyCi0gICAgICAgIC8vIGluIHRoZSBsaW5lIHRvIHRoZSBuZXh0IGZsaXAgaW4gZGlyZWN0aW9uLiAgUnVucyBhdCBldmVuIGluZGljZXMKLSAgICAgICAgLy8gYXJlIGxlZnQtdG8tcmlnaHQsIHRoZSBvdGhlcnMgYXJlIHJpZ2h0LXRvLWxlZnQuICBTbywgZm9yIGV4YW1wbGUsCi0gICAgICAgIC8vIGEgbGluZSB0aGF0IHN0YXJ0cyB3aXRoIGEgcmlnaHQtdG8tbGVmdCBydW4gaGFzIDAgYXQgbURpcmVjdGlvbnNbMF0sCi0gICAgICAgIC8vIHNpbmNlIHRoZSAnZmlyc3QnIChsdHIpIHJ1biBpcyB6ZXJvIGxlbmd0aC4KLSAgICAgICAgLy8KLSAgICAgICAgLy8gVGhlIGNvZGUgY3VycmVudGx5IGFzc3VtZXMgdGhhdCBlYWNoIHJ1biBpcyBhZGphY2VudCB0byB0aGUgcHJldmlvdXMKLSAgICAgICAgLy8gb25lLCBwcm9ncmVzc2luZyBpbiB0aGUgYmFzZSBsaW5lIGRpcmVjdGlvbi4gIFRoaXMgaXNuJ3Qgc3VmZmljaWVudAotICAgICAgICAvLyB0byBoYW5kbGUgbmVzdGVkIHJ1bnMsIGZvciBleGFtcGxlIG51bWVyaWMgdGV4dCBpbiBhbiBydGwgY29udGV4dAotICAgICAgICAvLyBpbiBhbiBsdHIgcGFyYWdyYXBoLgotICAgICAgICAvKiBwYWNrYWdlICovIERpcmVjdGlvbnMoc2hvcnRbXSBkaXJzKSB7CisgICAgICAgIC8qIHBhY2thZ2UgKi8gaW50W10gbURpcmVjdGlvbnM7CisgICAgICAgIC8qIHBhY2thZ2UgKi8gRGlyZWN0aW9ucyhpbnRbXSBkaXJzKSB7CiAgICAgICAgICAgICBtRGlyZWN0aW9ucyA9IGRpcnM7CiAgICAgICAgIH0KICAgICB9CkBAIC0xODMxLDYgKzE1OTYsNyBAQAogICAgICAqIGxpbmUgaXMgZWxsaXBzaXplZCwgbm90IGdldExpbmVTdGFydCgpLikKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgaW50IGdldEVsbGlwc2lzU3RhcnQoaW50IGxpbmUpOworCiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gYmUgZWxsaXBzaXplZCBhd2F5LCBvciAwIGlmCiAgICAgICogbm8gZWxsaXBzaXMgaXMgdG8gdGFrZSBwbGFjZS4KQEAgLTE4NzAsNyArMTYzNiw3IEBACiAgICAgICAgIHB1YmxpYyBpbnQgbGVuZ3RoKCkgewogICAgICAgICAgICAgcmV0dXJuIG1UZXh0Lmxlbmd0aCgpOwogICAgICAgICB9Ci0gICAgCisKICAgICAgICAgcHVibGljIENoYXJTZXF1ZW5jZSBzdWJTZXF1ZW5jZShpbnQgc3RhcnQsIGludCBlbmQpIHsKICAgICAgICAgICAgIGNoYXJbXSBzID0gbmV3IGNoYXJbZW5kIC0gc3RhcnRdOwogICAgICAgICAgICAgZ2V0Q2hhcnMoc3RhcnQsIGVuZCwgcywgMCk7CkBAIC0xOTM2LDEyICsxNzAyLDE3IEBACiAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBESVJfTEVGVF9UT19SSUdIVCA9IDE7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElSX1JJR0hUX1RPX0xFRlQgPSAtMTsKLSAgICAKKwogICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGZpbmFsIGludCBESVJfUkVRVUVTVF9MVFIgPSAxOwogICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGZpbmFsIGludCBESVJfUkVRVUVTVF9SVEwgPSAtMTsKICAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBmaW5hbCBpbnQgRElSX1JFUVVFU1RfREVGQVVMVF9MVFIgPSAyOwogICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGZpbmFsIGludCBESVJfUkVRVUVTVF9ERUZBVUxUX1JUTCA9IC0yOwogCisgICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgaW50IFJVTl9MRU5HVEhfTUFTSyA9IDB4MDNmZmZmZmY7CisgICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgaW50IFJVTl9MRVZFTF9TSElGVCA9IDI2OworICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGZpbmFsIGludCBSVU5fTEVWRUxfTUFTSyA9IDB4M2Y7CisgICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgaW50IFJVTl9SVExfRkxBRyA9IDEgPDwgUlVOX0xFVkVMX1NISUZUOworCiAgICAgcHVibGljIGVudW0gQWxpZ25tZW50IHsKICAgICAgICAgQUxJR05fTk9STUFMLAogICAgICAgICBBTElHTl9PUFBPU0lURSwKQEAgLTE5NTMsOSArMTcyNCw3IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRBQl9JTkNSRU1FTlQgPSAyMDsKIAogICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGZpbmFsIERpcmVjdGlvbnMgRElSU19BTExfTEVGVF9UT19SSUdIVCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRGlyZWN0aW9ucyhuZXcgc2hvcnRbXSB7IDMyNzY3IH0pOworICAgICAgICBuZXcgRGlyZWN0aW9ucyhuZXcgaW50W10geyAwLCBSVU5fTEVOR1RIX01BU0sgfSk7CiAgICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgRGlyZWN0aW9ucyBESVJTX0FMTF9SSUdIVF9UT19MRUZUID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBEaXJlY3Rpb25zKG5ldyBzaG9ydFtdIHsgMCwgMzI3NjcgfSk7Ci0KKyAgICAgICAgbmV3IERpcmVjdGlvbnMobmV3IGludFtdIHsgMCwgUlVOX0xFTkdUSF9NQVNLIHwgUlVOX1JUTF9GTEFHIH0pOwogfQotCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L01lYXN1cmVkVGV4dC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9NZWFzdXJlZFRleHQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTY5OWYxCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9NZWFzdXJlZFRleHQuamF2YQpAQCAtMCwwICsxLDIyOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC50ZXh0OworCitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudXRpbC5BcnJheVV0aWxzOworCitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludDsKK2ltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuTWV0cmljQWZmZWN0aW5nU3BhbjsKK2ltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuUmVwbGFjZW1lbnRTcGFuOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKKy8qKgorICogQGhpZGUKKyAqLworY2xhc3MgTWVhc3VyZWRUZXh0IHsKKyAgICAvKiBwYWNrYWdlICovIENoYXJTZXF1ZW5jZSBtVGV4dDsKKyAgICAvKiBwYWNrYWdlICovIGludCBtVGV4dFN0YXJ0OworICAgIC8qIHBhY2thZ2UgKi8gZmxvYXRbXSBtV2lkdGhzOworICAgIC8qIHBhY2thZ2UgKi8gY2hhcltdIG1DaGFyczsKKyAgICAvKiBwYWNrYWdlICovIGJ5dGVbXSBtTGV2ZWxzOworICAgIC8qIHBhY2thZ2UgKi8gaW50IG1EaXI7CisgICAgLyogcGFja2FnZSAqLyBib29sZWFuIG1FYXN5OworICAgIC8qIHBhY2thZ2UgKi8gaW50IG1MZW47CisgICAgcHJpdmF0ZSBpbnQgbVBvczsKKyAgICBwcml2YXRlIFRleHRQYWludCBtV29ya1BhaW50OworCisgICAgcHJpdmF0ZSBNZWFzdXJlZFRleHQoKSB7CisgICAgICAgIG1Xb3JrUGFpbnQgPSBuZXcgVGV4dFBhaW50KCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgTWVhc3VyZWRUZXh0W10gY2FjaGVkID0gbmV3IE1lYXN1cmVkVGV4dFszXTsKKworICAgIC8qIHBhY2thZ2UgKi8KKyAgICBzdGF0aWMgTWVhc3VyZWRUZXh0IG9idGFpbigpIHsKKyAgICAgICAgTWVhc3VyZWRUZXh0IG10OworICAgICAgICBzeW5jaHJvbml6ZWQgKGNhY2hlZCkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IGNhY2hlZC5sZW5ndGg7IC0taSA+PSAwOykgeworICAgICAgICAgICAgICAgIGlmIChjYWNoZWRbaV0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBtdCA9IGNhY2hlZFtpXTsKKyAgICAgICAgICAgICAgICAgICAgY2FjaGVkW2ldID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG10OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtdCA9IG5ldyBNZWFzdXJlZFRleHQoKTsKKyAgICAgICAgTG9nLmUoIk1FQVMiLCAibmV3OiAiICsgbXQpOworICAgICAgICByZXR1cm4gbXQ7CisgICAgfQorCisgICAgLyogcGFja2FnZSAqLworICAgIHN0YXRpYyBNZWFzdXJlZFRleHQgcmVjeWNsZShNZWFzdXJlZFRleHQgbXQpIHsKKyAgICAgICAgbXQubVRleHQgPSBudWxsOworICAgICAgICBpZiAobXQubUxlbiA8IDEwMDApIHsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZChjYWNoZWQpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNhY2hlZC5sZW5ndGg7ICsraSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoY2FjaGVkW2ldID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlZFtpXSA9IG10OworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogQW5hbHl6ZXMgdGV4dCBmb3IgYmlkaXJlY3Rpb25hbCBydW5zLiAgQWxsb2NhdGVzIHdvcmtpbmcgYnVmZmVycy4KKyAgICAgKi8KKyAgICAvKiBwYWNrYWdlICovCisgICAgdm9pZCBzZXRQYXJhKENoYXJTZXF1ZW5jZSB0ZXh0LCBpbnQgc3RhcnQsIGludCBlbmQsIGludCBiaWRpUmVxdWVzdCkgeworICAgICAgICBtVGV4dCA9IHRleHQ7CisgICAgICAgIG1UZXh0U3RhcnQgPSBzdGFydDsKKworICAgICAgICBpbnQgbGVuID0gZW5kIC0gc3RhcnQ7CisgICAgICAgIG1MZW4gPSBsZW47CisgICAgICAgIG1Qb3MgPSAwOworCisgICAgICAgIGlmIChtV2lkdGhzID09IG51bGwgfHwgbVdpZHRocy5sZW5ndGggPCBsZW4pIHsKKyAgICAgICAgICAgIG1XaWR0aHMgPSBuZXcgZmxvYXRbQXJyYXlVdGlscy5pZGVhbEZsb2F0QXJyYXlTaXplKGxlbildOworICAgICAgICB9CisgICAgICAgIGlmIChtQ2hhcnMgPT0gbnVsbCB8fCBtQ2hhcnMubGVuZ3RoIDwgbGVuKSB7CisgICAgICAgICAgICBtQ2hhcnMgPSBuZXcgY2hhcltBcnJheVV0aWxzLmlkZWFsQ2hhckFycmF5U2l6ZShsZW4pXTsKKyAgICAgICAgfQorICAgICAgICBUZXh0VXRpbHMuZ2V0Q2hhcnModGV4dCwgc3RhcnQsIGVuZCwgbUNoYXJzLCAwKTsKKworICAgICAgICBpZiAodGV4dCBpbnN0YW5jZW9mIFNwYW5uZWQpIHsKKyAgICAgICAgICAgIFNwYW5uZWQgc3Bhbm5lZCA9IChTcGFubmVkKSB0ZXh0OworICAgICAgICAgICAgUmVwbGFjZW1lbnRTcGFuW10gc3BhbnMgPSBzcGFubmVkLmdldFNwYW5zKHN0YXJ0LCBlbmQsCisgICAgICAgICAgICAgICAgICAgIFJlcGxhY2VtZW50U3Bhbi5jbGFzcyk7CisKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3BhbnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpbnQgc3RhcnRJblBhcmEgPSBzcGFubmVkLmdldFNwYW5TdGFydChzcGFuc1tpXSkgLSBzdGFydDsKKyAgICAgICAgICAgICAgICBpbnQgZW5kSW5QYXJhID0gc3Bhbm5lZC5nZXRTcGFuRW5kKHNwYW5zW2ldKSAtIHN0YXJ0OworICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSBzdGFydEluUGFyYTsgaiA8IGVuZEluUGFyYTsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgIG1DaGFyc1tqXSA9ICdcdUZGRkMnOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChUZXh0VXRpbHMuZG9lc05vdE5lZWRCaWRpKG1DaGFycywgMCwgbGVuKSkgeworICAgICAgICAgICAgbURpciA9IExheW91dC5ESVJfTEVGVF9UT19SSUdIVDsKKyAgICAgICAgICAgIG1FYXN5ID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChtTGV2ZWxzID09IG51bGwgfHwgbUxldmVscy5sZW5ndGggPCBsZW4pIHsKKyAgICAgICAgICAgICAgICBtTGV2ZWxzID0gbmV3IGJ5dGVbQXJyYXlVdGlscy5pZGVhbEJ5dGVBcnJheVNpemUobGVuKV07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtRGlyID0gQW5kcm9pZEJpZGkuYmlkaShiaWRpUmVxdWVzdCwgbUNoYXJzLCBtTGV2ZWxzLCBsZW4sIGZhbHNlKTsKKyAgICAgICAgICAgIG1FYXN5ID0gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmbG9hdCBhZGRTdHlsZVJ1bihUZXh0UGFpbnQgcGFpbnQsIGludCBsZW4sIFBhaW50LkZvbnRNZXRyaWNzSW50IGZtKSB7CisgICAgICAgIGlmIChmbSAhPSBudWxsKSB7CisgICAgICAgICAgICBwYWludC5nZXRGb250TWV0cmljc0ludChmbSk7CisgICAgICAgIH0KKworICAgICAgICBpbnQgcCA9IG1Qb3M7CisgICAgICAgIG1Qb3MgPSBwICsgbGVuOworCisgICAgICAgIGlmIChtRWFzeSkgeworICAgICAgICAgICAgaW50IGZsYWdzID0gbURpciA9PSBMYXlvdXQuRElSX0xFRlRfVE9fUklHSFQKKyAgICAgICAgICAgICAgICA/IENhbnZhcy5ESVJFQ1RJT05fTFRSIDogQ2FudmFzLkRJUkVDVElPTl9SVEw7CisgICAgICAgICAgICByZXR1cm4gcGFpbnQuZ2V0VGV4dFJ1bkFkdmFuY2VzKG1DaGFycywgcCwgbGVuLCBwLCBsZW4sIGZsYWdzLCBtV2lkdGhzLCBwKTsKKyAgICAgICAgfQorCisgICAgICAgIGZsb2F0IHRvdGFsQWR2YW5jZSA9IDA7CisgICAgICAgIGludCBsZXZlbCA9IG1MZXZlbHNbcF07CisgICAgICAgIGZvciAoaW50IHEgPSBwLCBpID0gcCArIDEsIGUgPSBwICsgbGVuOzsgKytpKSB7CisgICAgICAgICAgICBpZiAoaSA9PSBlIHx8IG1MZXZlbHNbaV0gIT0gbGV2ZWwpIHsKKyAgICAgICAgICAgICAgICBpbnQgZmxhZ3MgPSAobGV2ZWwgJiAweDEpID09IDAgPyBDYW52YXMuRElSRUNUSU9OX0xUUiA6IENhbnZhcy5ESVJFQ1RJT05fUlRMOworICAgICAgICAgICAgICAgIHRvdGFsQWR2YW5jZSArPQorICAgICAgICAgICAgICAgICAgICAgICAgcGFpbnQuZ2V0VGV4dFJ1bkFkdmFuY2VzKG1DaGFycywgcSwgaSAtIHEsIHEsIGkgLSBxLCBmbGFncywgbVdpZHRocywgcSk7CisgICAgICAgICAgICAgICAgaWYgKGkgPT0gZSkgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcSA9IGk7CisgICAgICAgICAgICAgICAgbGV2ZWwgPSBtTGV2ZWxzW2ldOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0b3RhbEFkdmFuY2U7CisgICAgfQorCisgICAgZmxvYXQgYWRkU3R5bGVSdW4oVGV4dFBhaW50IHBhaW50LCBNZXRyaWNBZmZlY3RpbmdTcGFuW10gc3BhbnMsIGludCBsZW4sCisgICAgICAgICAgICBQYWludC5Gb250TWV0cmljc0ludCBmbSkgeworCisgICAgICAgIFRleHRQYWludCB3b3JrUGFpbnQgPSBtV29ya1BhaW50OworICAgICAgICB3b3JrUGFpbnQuc2V0KHBhaW50KTsKKyAgICAgICAgLy8gWFhYIHBhaW50IHNob3VsZCBub3QgaGF2ZSBhIGJhc2VsaW5lIHNoaWZ0LCBidXQuLi4KKyAgICAgICAgd29ya1BhaW50LmJhc2VsaW5lU2hpZnQgPSAwOworCisgICAgICAgIFJlcGxhY2VtZW50U3BhbiByZXBsYWNlbWVudCA9IG51bGw7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3BhbnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIE1ldHJpY0FmZmVjdGluZ1NwYW4gc3BhbiA9IHNwYW5zW2ldOworICAgICAgICAgICAgaWYgKHNwYW4gaW5zdGFuY2VvZiBSZXBsYWNlbWVudFNwYW4pIHsKKyAgICAgICAgICAgICAgICByZXBsYWNlbWVudCA9IChSZXBsYWNlbWVudFNwYW4pc3BhbjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3Bhbi51cGRhdGVNZWFzdXJlU3RhdGUod29ya1BhaW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZsb2F0IHdpZDsKKyAgICAgICAgaWYgKHJlcGxhY2VtZW50ID09IG51bGwpIHsKKyAgICAgICAgICAgIHdpZCA9IGFkZFN0eWxlUnVuKHdvcmtQYWludCwgbGVuLCBmbSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBVc2Ugb3JpZ2luYWwgdGV4dC4gIFNob3VsZG4ndCBtYXR0ZXIuCisgICAgICAgICAgICB3aWQgPSByZXBsYWNlbWVudC5nZXRTaXplKHdvcmtQYWludCwgbVRleHQsIG1UZXh0U3RhcnQgKyBtUG9zLAorICAgICAgICAgICAgICAgICAgICBtVGV4dFN0YXJ0ICsgbVBvcyArIGxlbiwgZm0pOworICAgICAgICAgICAgZmxvYXRbXSB3ID0gbVdpZHRoczsKKyAgICAgICAgICAgIHdbbVBvc10gPSB3aWQ7CisgICAgICAgICAgICBmb3IgKGludCBpID0gbVBvcyArIDEsIGUgPSBtUG9zICsgbGVuOyBpIDwgZTsgaSsrKQorICAgICAgICAgICAgICAgIHdbaV0gPSAwOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGZtICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmICh3b3JrUGFpbnQuYmFzZWxpbmVTaGlmdCA8IDApIHsKKyAgICAgICAgICAgICAgICBmbS5hc2NlbnQgKz0gd29ya1BhaW50LmJhc2VsaW5lU2hpZnQ7CisgICAgICAgICAgICAgICAgZm0udG9wICs9IHdvcmtQYWludC5iYXNlbGluZVNoaWZ0OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmbS5kZXNjZW50ICs9IHdvcmtQYWludC5iYXNlbGluZVNoaWZ0OworICAgICAgICAgICAgICAgIGZtLmJvdHRvbSArPSB3b3JrUGFpbnQuYmFzZWxpbmVTaGlmdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB3aWQ7CisgICAgfQorCisgICAgaW50IGJyZWFrVGV4dChpbnQgc3RhcnQsIGludCBsaW1pdCwgYm9vbGVhbiBmb3J3YXJkcywgZmxvYXQgd2lkdGgpIHsKKyAgICAgICAgZmxvYXRbXSB3ID0gbVdpZHRoczsKKyAgICAgICAgaWYgKGZvcndhcmRzKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gc3RhcnQ7IGkgPCBsaW1pdDsgKytpKSB7CisgICAgICAgICAgICAgICAgaWYgKCh3aWR0aCAtPSB3W2ldKSA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkgLSBzdGFydDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gbGltaXQ7IC0taSA+PSBzdGFydDspIHsKKyAgICAgICAgICAgICAgICBpZiAoKHdpZHRoIC09IHdbaV0pIDwgMCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbGltaXQgLSBpIC0xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBsaW1pdCAtIHN0YXJ0OworICAgIH0KKworICAgIGZsb2F0IG1lYXN1cmUoaW50IHN0YXJ0LCBpbnQgbGltaXQpIHsKKyAgICAgICAgZmxvYXQgd2lkdGggPSAwOworICAgICAgICBmbG9hdFtdIHcgPSBtV2lkdGhzOworICAgICAgICBmb3IgKGludCBpID0gc3RhcnQ7IGkgPCBsaW1pdDsgKytpKSB7CisgICAgICAgICAgICB3aWR0aCArPSB3W2ldOworICAgICAgICB9CisgICAgICAgIHJldHVybiB3aWR0aDsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9TcGFubmFibGVTdHJpbmdCdWlsZGVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L1NwYW5uYWJsZVN0cmluZ0J1aWxkZXIuamF2YQppbmRleCBjYWFhZmExLi41NmYxMzAyIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L1NwYW5uYWJsZVN0cmluZ0J1aWxkZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L1NwYW5uYWJsZVN0cmluZ0J1aWxkZXIuamF2YQpAQCAtMTcsOCArMTcsOSBAQAogcGFja2FnZSBhbmRyb2lkLnRleHQ7CiAKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC51dGlsLkFycmF5VXRpbHM7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludDsKKwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQ7CiAKIGltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5BcnJheTsKIApAQCAtNzgwLDcgKzc4MSw3IEBACiAgICAgICAgIH0KIAogICAgICAgICBpZiAoY291bnQgPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIChUW10pIEFycmF5VXRpbHMuZW1wdHlBcnJheShraW5kKTsKKyAgICAgICAgICAgIHJldHVybiBBcnJheVV0aWxzLmVtcHR5QXJyYXkoa2luZCk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGNvdW50ID09IDEpIHsKICAgICAgICAgICAgIHJldCA9IChPYmplY3RbXSkgQXJyYXkubmV3SW5zdGFuY2Uoa2luZCwgMSk7CkBAIC0xMDU0LDcgKzEwNTUsMzIgQEAKICAgICAgICAgfQogICAgIH0KIAorCiAgICAgLyoqCisgICAgICogRG9uJ3QgY2FsbCB0aGlzIHlvdXJzZWxmIC0tIGV4aXN0cyBmb3IgQ2FudmFzIHRvIHVzZSBpbnRlcm5hbGx5LgorICAgICAqIHtAaGlkZX0KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBkcmF3VGV4dFJ1bihDYW52YXMgYywgaW50IHN0YXJ0LCBpbnQgZW5kLAorICAgICAgICAgICAgaW50IGNvbnRleHRTdGFydCwgaW50IGNvbnRleHRFbmQsCisgICAgICAgICAgICBmbG9hdCB4LCBmbG9hdCB5LCBpbnQgZmxhZ3MsIFBhaW50IHApIHsKKyAgICAgICAgY2hlY2tSYW5nZSgiZHJhd1RleHRSdW4iLCBzdGFydCwgZW5kKTsKKworICAgICAgICBpbnQgY29udGV4dExlbiA9IGNvbnRleHRFbmQgLSBjb250ZXh0U3RhcnQ7CisgICAgICAgIGludCBsZW4gPSBlbmQgLSBzdGFydDsKKyAgICAgICAgaWYgKGNvbnRleHRFbmQgPD0gbUdhcFN0YXJ0KSB7CisgICAgICAgICAgICBjLmRyYXdUZXh0UnVuKG1UZXh0LCBzdGFydCwgbGVuLCBjb250ZXh0U3RhcnQsIGNvbnRleHRMZW4sIHgsIHksIGZsYWdzLCBwKTsKKyAgICAgICAgfSBlbHNlIGlmIChjb250ZXh0U3RhcnQgPj0gbUdhcFN0YXJ0KSB7CisgICAgICAgICAgICBjLmRyYXdUZXh0UnVuKG1UZXh0LCBzdGFydCArIG1HYXBMZW5ndGgsIGxlbiwgY29udGV4dFN0YXJ0ICsgbUdhcExlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgY29udGV4dExlbiwgeCwgeSwgZmxhZ3MsIHApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY2hhcltdIGJ1ZiA9IFRleHRVdGlscy5vYnRhaW4oY29udGV4dExlbik7CisgICAgICAgICAgICBnZXRDaGFycyhjb250ZXh0U3RhcnQsIGNvbnRleHRFbmQsIGJ1ZiwgMCk7CisgICAgICAgICAgICBjLmRyYXdUZXh0UnVuKGJ1Ziwgc3RhcnQgLSBjb250ZXh0U3RhcnQsIGxlbiwgMCwgY29udGV4dExlbiwgeCwgeSwgZmxhZ3MsIHApOworICAgICAgICAgICAgVGV4dFV0aWxzLnJlY3ljbGUoYnVmKTsKKyAgICAgICAgfQorICAgIH0KKworICAgLyoqCiAgICAgICogRG9uJ3QgY2FsbCB0aGlzIHlvdXJzZWxmIC0tIGV4aXN0cyBmb3IgUGFpbnQgdG8gdXNlIGludGVybmFsbHkuCiAgICAgICoge0BoaWRlfQogICAgICAqLwpAQCAtMTEwMyw2ICsxMTI5LDU4IEBACiAgICAgICAgIHJldHVybiByZXQ7CiAgICAgfQogCisgICAgLyoqCisgICAgICogRG9uJ3QgY2FsbCB0aGlzIHlvdXJzZWxmIC0tIGV4aXN0cyBmb3IgUGFpbnQgdG8gdXNlIGludGVybmFsbHkuCisgICAgICoge0BoaWRlfQorICAgICAqLworICAgIHB1YmxpYyBmbG9hdCBnZXRUZXh0UnVuQWR2YW5jZXMoaW50IHN0YXJ0LCBpbnQgZW5kLCBpbnQgY29udGV4dFN0YXJ0LCBpbnQgY29udGV4dEVuZCwgaW50IGZsYWdzLAorICAgICAgICAgICAgZmxvYXRbXSBhZHZhbmNlcywgaW50IGFkdmFuY2VzUG9zLCBQYWludCBwKSB7CisKKyAgICAgICAgZmxvYXQgcmV0OworCisgICAgICAgIGludCBjb250ZXh0TGVuID0gY29udGV4dEVuZCAtIGNvbnRleHRTdGFydDsKKyAgICAgICAgaW50IGxlbiA9IGVuZCAtIHN0YXJ0OworCisgICAgICAgIGlmIChlbmQgPD0gbUdhcFN0YXJ0KSB7CisgICAgICAgICAgICByZXQgPSBwLmdldFRleHRSdW5BZHZhbmNlcyhtVGV4dCwgc3RhcnQsIGxlbiwgY29udGV4dFN0YXJ0LCBjb250ZXh0TGVuLAorICAgICAgICAgICAgICAgICAgICBmbGFncywgYWR2YW5jZXMsIGFkdmFuY2VzUG9zKTsKKyAgICAgICAgfSBlbHNlIGlmIChzdGFydCA+PSBtR2FwU3RhcnQpIHsKKyAgICAgICAgICAgIHJldCA9IHAuZ2V0VGV4dFJ1bkFkdmFuY2VzKG1UZXh0LCBzdGFydCArIG1HYXBMZW5ndGgsIGxlbiwKKyAgICAgICAgICAgICAgICAgICAgY29udGV4dFN0YXJ0ICsgbUdhcExlbmd0aCwgY29udGV4dExlbiwgZmxhZ3MsIGFkdmFuY2VzLCBhZHZhbmNlc1Bvcyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjaGFyW10gYnVmID0gVGV4dFV0aWxzLm9idGFpbihjb250ZXh0TGVuKTsKKyAgICAgICAgICAgIGdldENoYXJzKGNvbnRleHRTdGFydCwgY29udGV4dEVuZCwgYnVmLCAwKTsKKyAgICAgICAgICAgIHJldCA9IHAuZ2V0VGV4dFJ1bkFkdmFuY2VzKGJ1Ziwgc3RhcnQgLSBjb250ZXh0U3RhcnQsIGxlbiwKKyAgICAgICAgICAgICAgICAgICAgMCwgY29udGV4dExlbiwgZmxhZ3MsIGFkdmFuY2VzLCBhZHZhbmNlc1Bvcyk7CisgICAgICAgICAgICBUZXh0VXRpbHMucmVjeWNsZShidWYpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFRleHRSdW5DdXJzb3IoaW50IGNvbnRleHRTdGFydCwgaW50IGNvbnRleHRFbmQsIGludCBmbGFncywgaW50IG9mZnNldCwKKyAgICAgICAgICAgIGludCBjdXJzb3JPcHQsIFBhaW50IHApIHsKKworICAgICAgICBpbnQgcmV0OworCisgICAgICAgIGludCBjb250ZXh0TGVuID0gY29udGV4dEVuZCAtIGNvbnRleHRTdGFydDsKKyAgICAgICAgaWYgKGNvbnRleHRFbmQgPD0gbUdhcFN0YXJ0KSB7CisgICAgICAgICAgICByZXQgPSBwLmdldFRleHRSdW5DdXJzb3IobVRleHQsIGNvbnRleHRTdGFydCwgY29udGV4dExlbiwKKyAgICAgICAgICAgICAgICAgICAgZmxhZ3MsIG9mZnNldCwgY3Vyc29yT3B0KTsKKyAgICAgICAgfSBlbHNlIGlmIChjb250ZXh0U3RhcnQgPj0gbUdhcFN0YXJ0KSB7CisgICAgICAgICAgICByZXQgPSBwLmdldFRleHRSdW5DdXJzb3IobVRleHQsIGNvbnRleHRTdGFydCArIG1HYXBMZW5ndGgsIGNvbnRleHRMZW4sCisgICAgICAgICAgICAgICAgICAgIGZsYWdzLCBvZmZzZXQgKyBtR2FwTGVuZ3RoLCBjdXJzb3JPcHQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY2hhcltdIGJ1ZiA9IFRleHRVdGlscy5vYnRhaW4oY29udGV4dExlbik7CisgICAgICAgICAgICBnZXRDaGFycyhjb250ZXh0U3RhcnQsIGNvbnRleHRFbmQsIGJ1ZiwgMCk7CisgICAgICAgICAgICByZXQgPSBwLmdldFRleHRSdW5DdXJzb3IoYnVmLCAwLCBjb250ZXh0TGVuLAorICAgICAgICAgICAgICAgICAgICBmbGFncywgb2Zmc2V0IC0gY29udGV4dFN0YXJ0LCBjdXJzb3JPcHQpICsgY29udGV4dFN0YXJ0OworICAgICAgICAgICAgVGV4dFV0aWxzLnJlY3ljbGUoYnVmKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCiAgICAgLy8gRG9jdW1lbnRhdGlvbiBmcm9tIGludGVyZmFjZQogICAgIHB1YmxpYyB2b2lkIHNldEZpbHRlcnMoSW5wdXRGaWx0ZXJbXSBmaWx0ZXJzKSB7CiAgICAgICAgIGlmIChmaWx0ZXJzID09IG51bGwpIHsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvU3Bhbm5lZC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9TcGFubmVkLmphdmEKaW5kZXggMTU0NDk3ZC4uZDE0ZmNiYzQgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvU3Bhbm5lZC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvU3Bhbm5lZC5qYXZhCkBAIC05MSw3ICs5MSw3IEBACiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1BBTl9FWENMVVNJVkVfRVhDTFVTSVZFID0gU1BBTl9QT0lOVF9NQVJLOwogCiAgICAgLyoqCi0gICAgICogTm9uLTAtbGVuZ3RoIHNwYW5zIG9mIHR5cGUgU1BBTl9JTkNMVVNJVkVfRVhDTFVTSVZFIGV4cGFuZAorICAgICAqIE5vbi0wLWxlbmd0aCBzcGFucyBvZiB0eXBlIFNQQU5fRVhDTFVTSVZFX0lOQ0xVU0lWRSBleHBhbmQKICAgICAgKiB0byBpbmNsdWRlIHRleHQgaW5zZXJ0ZWQgYXQgdGhlaXIgZW5kaW5nIHBvaW50IGJ1dCBub3QgYXQgdGhlaXIKICAgICAgKiBzdGFydGluZyBwb2ludC4gIFdoZW4gMC1sZW5ndGgsIHRoZXkgYmVoYXZlIGxpa2UgcG9pbnRzLgogICAgICAqLwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9TdGF0aWNMYXlvdXQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvU3RhdGljTGF5b3V0LmphdmEKaW5kZXggZjAyYWQyYS4uNDQxNTdkZSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9TdGF0aWNMYXlvdXQuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L1N0YXRpY0xheW91dC5qYXZhCkBAIC0xNiwxNCArMTYsMTUgQEAKIAogcGFja2FnZSBhbmRyb2lkLnRleHQ7CiAKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC51dGlsLkFycmF5VXRpbHM7CisKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50OwotaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnV0aWwuQXJyYXlVdGlsczsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogaW1wb3J0IGFuZHJvaWQudGV4dC5zdHlsZS5MZWFkaW5nTWFyZ2luU3BhbjsKIGltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuTGluZUhlaWdodFNwYW47CiBpbXBvcnQgYW5kcm9pZC50ZXh0LnN0eWxlLk1ldHJpY0FmZmVjdGluZ1NwYW47Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LnN0eWxlLlJlcGxhY2VtZW50U3BhbjsKK2ltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuVGFiU3RvcFNwYW47CitpbXBvcnQgYW5kcm9pZC50ZXh0LnN0eWxlLkxlYWRpbmdNYXJnaW5TcGFuLkxlYWRpbmdNYXJnaW5TcGFuMjsKIAogLyoqCiAgKiBTdGF0aWNMYXlvdXQgaXMgYSBMYXlvdXQgZm9yIHRleHQgdGhhdCB3aWxsIG5vdCBiZSBlZGl0ZWQgYWZ0ZXIgaXQKQEAgLTMxLDggKzMyLDkgQEAKICAqIDxwPlRoaXMgaXMgdXNlZCBieSB3aWRnZXRzIHRvIGNvbnRyb2wgdGV4dCBsYXlvdXQuIFlvdSBzaG91bGQgbm90IG5lZWQKICAqIHRvIHVzZSB0aGlzIGNsYXNzIGRpcmVjdGx5IHVubGVzcyB5b3UgYXJlIGltcGxlbWVudGluZyB5b3VyIG93biB3aWRnZXQKICAqIG9yIGN1c3RvbSBkaXNwbGF5IG9iamVjdCwgb3Igd291bGQgYmUgdGVtcHRlZCB0byBjYWxsCi0gKiB7QGxpbmsgYW5kcm9pZC5ncmFwaGljcy5DYW52YXMjZHJhd1RleHQoamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSwgaW50LCBpbnQsIGZsb2F0LCBmbG9hdCwgYW5kcm9pZC5ncmFwaGljcy5QYWludCkKLSAqICBDYW52YXMuZHJhd1RleHQoKX0gZGlyZWN0bHkuPC9wPgorICoge0BsaW5rIGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzI2RyYXdUZXh0KGphdmEubGFuZy5DaGFyU2VxdWVuY2UsIGludCwgaW50LAorICogZmxvYXQsIGZsb2F0LCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50KQorICogQ2FudmFzLmRyYXdUZXh0KCl9IGRpcmVjdGx5LjwvcD4KICAqLwogcHVibGljIGNsYXNzCiBTdGF0aWNMYXlvdXQKQEAgLTYyLDcgKzY0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaW5jbHVkZXBhZCwKICAgICAgICAgICAgICAgICAgICAgICAgIFRleHRVdGlscy5UcnVuY2F0ZUF0IGVsbGlwc2l6ZSwgaW50IGVsbGlwc2l6ZWRXaWR0aCkgewogICAgICAgICBzdXBlcigoZWxsaXBzaXplID09IG51bGwpCi0gICAgICAgICAgICAgICAgPyBzb3VyY2UgCisgICAgICAgICAgICAgICAgPyBzb3VyY2UKICAgICAgICAgICAgICAgICA6IChzb3VyY2UgaW5zdGFuY2VvZiBTcGFubmVkKQogICAgICAgICAgICAgICAgICAgICA/IG5ldyBTcGFubmVkRWxsaXBzaXplcihzb3VyY2UpCiAgICAgICAgICAgICAgICAgICAgIDogbmV3IEVsbGlwc2l6ZXIoc291cmNlKSwKQEAgLTcyLDcgKzc0LDcgQEAKICAgICAgICAgICogVGhpcyBpcyBhbm5veWluZywgYnV0IHdlIGNhbid0IHJlZmVyIHRvIHRoZSBsYXlvdXQgdW50aWwKICAgICAgICAgICogc3VwZXJjbGFzcyBjb25zdHJ1Y3Rpb24gaXMgZmluaXNoZWQsIGFuZCB0aGUgc3VwZXJjbGFzcwogICAgICAgICAgKiBjb25zdHJ1Y3RvciB3YW50cyB0aGUgcmVmZXJlbmNlIHRvIHRoZSBkaXNwbGF5IHRleHQuCi0gICAgICAgICAqIAorICAgICAgICAgKgogICAgICAgICAgKiBUaGlzIHdpbGwgYnJlYWsgaWYgdGhlIHN1cGVyY2xhc3MgY29uc3RydWN0b3IgZXZlciBhY3R1YWxseQogICAgICAgICAgKiBjYXJlcyBhYm91dCB0aGUgY29udGVudCBpbnN0ZWFkIG9mIGp1c3QgaG9sZGluZyB0aGUgcmVmZXJlbmNlLgogICAgICAgICAgKi8KQEAgLTk0LDEzICs5NiwxMyBAQAogICAgICAgICBtTGluZURpcmVjdGlvbnMgPSBuZXcgRGlyZWN0aW9uc1sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlVdGlscy5pZGVhbEludEFycmF5U2l6ZSgyICogbUNvbHVtbnMpXTsKIAorICAgICAgICBtTWVhc3VyZWQgPSBNZWFzdXJlZFRleHQub2J0YWluKCk7CisKICAgICAgICAgZ2VuZXJhdGUoc291cmNlLCBidWZzdGFydCwgYnVmZW5kLCBwYWludCwgb3V0ZXJ3aWR0aCwgYWxpZ24sCiAgICAgICAgICAgICAgICAgIHNwYWNpbmdtdWx0LCBzcGFjaW5nYWRkLCBpbmNsdWRlcGFkLCBpbmNsdWRlcGFkLAogICAgICAgICAgICAgICAgICBlbGxpcHNpemUgIT0gbnVsbCwgZWxsaXBzaXplZFdpZHRoLCBlbGxpcHNpemUpOwogCi0gICAgICAgIG1DaGRpcnMgPSBudWxsOwotICAgICAgICBtQ2hzID0gbnVsbDsKLSAgICAgICAgbVdpZHRocyA9IG51bGw7CisgICAgICAgIG1NZWFzdXJlZCA9IE1lYXN1cmVkVGV4dC5yZWN5Y2xlKG1NZWFzdXJlZCk7CiAgICAgICAgIG1Gb250TWV0cmljc0ludCA9IG51bGw7CiAgICAgfQogCkBAIC0xMTEsNiArMTEzLDcgQEAKICAgICAgICAgbUxpbmVzID0gbmV3IGludFtBcnJheVV0aWxzLmlkZWFsSW50QXJyYXlTaXplKDIgKiBtQ29sdW1ucyldOwogICAgICAgICBtTGluZURpcmVjdGlvbnMgPSBuZXcgRGlyZWN0aW9uc1sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlVdGlscy5pZGVhbEludEFycmF5U2l6ZSgyICogbUNvbHVtbnMpXTsKKyAgICAgICAgbU1lYXN1cmVkID0gTWVhc3VyZWRUZXh0Lm9idGFpbigpOwogICAgIH0KIAogICAgIC8qIHBhY2thZ2UgKi8gdm9pZCBnZW5lcmF0ZShDaGFyU2VxdWVuY2Ugc291cmNlLCBpbnQgYnVmc3RhcnQsIGludCBidWZlbmQsCkBAIC0xMjgsNTkgKzEzMSw1MCBAQAogICAgICAgICBQYWludC5Gb250TWV0cmljc0ludCBmbSA9IG1Gb250TWV0cmljc0ludDsKICAgICAgICAgaW50W10gY2hvb3NlaHR2ID0gbnVsbDsKIAotICAgICAgICBpbnQgZW5kID0gVGV4dFV0aWxzLmluZGV4T2Yoc291cmNlLCAnXG4nLCBidWZzdGFydCwgYnVmZW5kKTsKLSAgICAgICAgaW50IGJ1ZnNpeiA9IGVuZCA+PSAwID8gZW5kIC0gYnVmc3RhcnQgOiBidWZlbmQgLSBidWZzdGFydDsKLSAgICAgICAgYm9vbGVhbiBmaXJzdCA9IHRydWU7CisgICAgICAgIE1lYXN1cmVkVGV4dCBtZWFzdXJlZCA9IG1NZWFzdXJlZDsKIAotICAgICAgICBpZiAobUNoZGlycyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtQ2hkaXJzID0gbmV3IGJ5dGVbQXJyYXlVdGlscy5pZGVhbEJ5dGVBcnJheVNpemUoYnVmc2l6ICsgMSldOwotICAgICAgICAgICAgbUNocyA9IG5ldyBjaGFyW0FycmF5VXRpbHMuaWRlYWxDaGFyQXJyYXlTaXplKGJ1ZnNpeiArIDEpXTsKLSAgICAgICAgICAgIG1XaWR0aHMgPSBuZXcgZmxvYXRbQXJyYXlVdGlscy5pZGVhbEludEFycmF5U2l6ZSgoYnVmc2l6ICsgMSkgKiAyKV07Ci0gICAgICAgIH0KLQotICAgICAgICBieXRlW10gY2hkaXJzID0gbUNoZGlyczsKLSAgICAgICAgY2hhcltdIGNocyA9IG1DaHM7Ci0gICAgICAgIGZsb2F0W10gd2lkdGhzID0gbVdpZHRoczsKLQotICAgICAgICBBbHRlcmVkQ2hhclNlcXVlbmNlIGFsdGVyID0gbnVsbDsKICAgICAgICAgU3Bhbm5lZCBzcGFubmVkID0gbnVsbDsKLQogICAgICAgICBpZiAoc291cmNlIGluc3RhbmNlb2YgU3Bhbm5lZCkKICAgICAgICAgICAgIHNwYW5uZWQgPSAoU3Bhbm5lZCkgc291cmNlOwogCiAgICAgICAgIGludCBERUZBVUxUX0RJUiA9IERJUl9MRUZUX1RPX1JJR0hUOyAvLyBYWFgKIAotICAgICAgICBmb3IgKGludCBzdGFydCA9IGJ1ZnN0YXJ0OyBzdGFydCA8PSBidWZlbmQ7IHN0YXJ0ID0gZW5kKSB7Ci0gICAgICAgICAgICBpZiAoZmlyc3QpCi0gICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgaW50IHBhcmFFbmQ7CisgICAgICAgIGZvciAoaW50IHBhcmFTdGFydCA9IGJ1ZnN0YXJ0OyBwYXJhU3RhcnQgPD0gYnVmZW5kOyBwYXJhU3RhcnQgPSBwYXJhRW5kKSB7CisgICAgICAgICAgICBwYXJhRW5kID0gVGV4dFV0aWxzLmluZGV4T2Yoc291cmNlLCAnXG4nLCBwYXJhU3RhcnQsIGJ1ZmVuZCk7CisgICAgICAgICAgICBpZiAocGFyYUVuZCA8IDApCisgICAgICAgICAgICAgICAgcGFyYUVuZCA9IGJ1ZmVuZDsKICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBlbmQgPSBUZXh0VXRpbHMuaW5kZXhPZihzb3VyY2UsICdcbicsIHN0YXJ0LCBidWZlbmQpOworICAgICAgICAgICAgICAgIHBhcmFFbmQrKzsKKyAgICAgICAgICAgIGludCBwYXJhTGVuID0gcGFyYUVuZCAtIHBhcmFTdGFydDsKIAotICAgICAgICAgICAgaWYgKGVuZCA8IDApCi0gICAgICAgICAgICAgICAgZW5kID0gYnVmZW5kOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGVuZCsrOwotCi0gICAgICAgICAgICBpbnQgZmlyc3RXaWR0aExpbmVDb3VudCA9IDE7CisgICAgICAgICAgICBpbnQgZmlyc3RXaWR0aExpbmVMaW1pdCA9IG1MaW5lQ291bnQgKyAxOwogICAgICAgICAgICAgaW50IGZpcnN0d2lkdGggPSBvdXRlcndpZHRoOwogICAgICAgICAgICAgaW50IHJlc3R3aWR0aCA9IG91dGVyd2lkdGg7CiAKICAgICAgICAgICAgIExpbmVIZWlnaHRTcGFuW10gY2hvb3NlaHQgPSBudWxsOwogCiAgICAgICAgICAgICBpZiAoc3Bhbm5lZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTGVhZGluZ01hcmdpblNwYW5bXSBzcDsKLQotICAgICAgICAgICAgICAgIHNwID0gc3Bhbm5lZC5nZXRTcGFucyhzdGFydCwgZW5kLCBMZWFkaW5nTWFyZ2luU3Bhbi5jbGFzcyk7CisgICAgICAgICAgICAgICAgTGVhZGluZ01hcmdpblNwYW5bXSBzcCA9IHNwYW5uZWQuZ2V0U3BhbnMocGFyYVN0YXJ0LCBwYXJhRW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgTGVhZGluZ01hcmdpblNwYW4uY2xhc3MpOwogICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3AubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgTGVhZGluZ01hcmdpblNwYW4gbG1zID0gc3BbaV07CiAgICAgICAgICAgICAgICAgICAgIGZpcnN0d2lkdGggLT0gc3BbaV0uZ2V0TGVhZGluZ01hcmdpbih0cnVlKTsKICAgICAgICAgICAgICAgICAgICAgcmVzdHdpZHRoIC09IHNwW2ldLmdldExlYWRpbmdNYXJnaW4oZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICBpZiAobG1zIGluc3RhbmNlb2YgTGVhZGluZ01hcmdpblNwYW4uTGVhZGluZ01hcmdpblNwYW4yKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFdpZHRoTGluZUNvdW50ID0gKChMZWFkaW5nTWFyZ2luU3Bhbi5MZWFkaW5nTWFyZ2luU3BhbjIpbG1zKS5nZXRMZWFkaW5nTWFyZ2luTGluZUNvdW50KCk7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAvLyBMZWFkaW5nTWFyZ2luU3BhbjIgaXMgb2RkLiAgVGhlIGNvdW50IGFmZmVjdHMgYWxsCisgICAgICAgICAgICAgICAgICAgIC8vIGxlYWRpbmcgbWFyZ2luIHNwYW5zLCBub3QganVzdCB0aGlzIHBhcnRpY3VsYXIgb25lLAorICAgICAgICAgICAgICAgICAgICAvLyBhbmQgc3RhcnQgZnJvbSB0aGUgdG9wIG9mIHRoZSBzcGFuLCBub3QgdGhlIHRvcCBvZiB0aGUKKyAgICAgICAgICAgICAgICAgICAgLy8gcGFyYWdyYXBoLgorICAgICAgICAgICAgICAgICAgICBpZiAobG1zIGluc3RhbmNlb2YgTGVhZGluZ01hcmdpblNwYW4yKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMZWFkaW5nTWFyZ2luU3BhbjIgbG1zMiA9IChMZWFkaW5nTWFyZ2luU3BhbjIpIGxtczsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBsbXNGaXJzdExpbmUgPSBnZXRMaW5lRm9yT2Zmc2V0KHNwYW5uZWQuZ2V0U3BhblN0YXJ0KGxtczIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0V2lkdGhMaW5lTGltaXQgPSBsbXNGaXJzdExpbmUgKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbXMyLmdldExlYWRpbmdNYXJnaW5MaW5lQ291bnQoKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIGNob29zZWh0ID0gc3Bhbm5lZC5nZXRTcGFucyhzdGFydCwgZW5kLCBMaW5lSGVpZ2h0U3Bhbi5jbGFzcyk7CisgICAgICAgICAgICAgICAgY2hvb3NlaHQgPSBzcGFubmVkLmdldFNwYW5zKHBhcmFTdGFydCwgcGFyYUVuZCwgTGluZUhlaWdodFNwYW4uY2xhc3MpOwogCiAgICAgICAgICAgICAgICAgaWYgKGNob29zZWh0Lmxlbmd0aCAhPSAwKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChjaG9vc2VodHYgPT0gbnVsbCB8fApAQCAtMTkyLDExICsxODYsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaG9vc2VodC5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgaW50IG8gPSBzcGFubmVkLmdldFNwYW5TdGFydChjaG9vc2VodFtpXSk7CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvIDwgc3RhcnQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvIDwgcGFyYVN0YXJ0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RhcnRzIGluIHRoaXMgbGF5b3V0LCBiZWZvcmUgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3VycmVudCBwYXJhZ3JhcGgKIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNob29zZWh0dltpXSA9IGdldExpbmVUb3AoZ2V0TGluZUZvck9mZnNldChvKSk7IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNob29zZWh0dltpXSA9IGdldExpbmVUb3AoZ2V0TGluZUZvck9mZnNldChvKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0YXJ0cyBpbiB0aGlzIHBhcmFncmFwaAogCkBAIC0yMDYsMTYyICsyMDAsODcgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGlmIChlbmQgLSBzdGFydCA+IGNoZGlycy5sZW5ndGgpIHsKLSAgICAgICAgICAgICAgICBjaGRpcnMgPSBuZXcgYnl0ZVtBcnJheVV0aWxzLmlkZWFsQnl0ZUFycmF5U2l6ZShlbmQgLSBzdGFydCldOwotICAgICAgICAgICAgICAgIG1DaGRpcnMgPSBjaGRpcnM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZW5kIC0gc3RhcnQgPiBjaHMubGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgY2hzID0gbmV3IGNoYXJbQXJyYXlVdGlscy5pZGVhbENoYXJBcnJheVNpemUoZW5kIC0gc3RhcnQpXTsKLSAgICAgICAgICAgICAgICBtQ2hzID0gY2hzOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKChlbmQgLSBzdGFydCkgKiAyID4gd2lkdGhzLmxlbmd0aCkgewotICAgICAgICAgICAgICAgIHdpZHRocyA9IG5ldyBmbG9hdFtBcnJheVV0aWxzLmlkZWFsSW50QXJyYXlTaXplKChlbmQgLSBzdGFydCkgKiAyKV07Ci0gICAgICAgICAgICAgICAgbVdpZHRocyA9IHdpZHRoczsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1lYXN1cmVkLnNldFBhcmEoc291cmNlLCBwYXJhU3RhcnQsIHBhcmFFbmQsIERJUl9SRVFVRVNUX0RFRkFVTFRfTFRSKTsKKyAgICAgICAgICAgIGNoYXJbXSBjaHMgPSBtZWFzdXJlZC5tQ2hhcnM7CisgICAgICAgICAgICBmbG9hdFtdIHdpZHRocyA9IG1lYXN1cmVkLm1XaWR0aHM7CisgICAgICAgICAgICBieXRlW10gY2hkaXJzID0gbWVhc3VyZWQubUxldmVsczsKKyAgICAgICAgICAgIGludCBkaXIgPSBtZWFzdXJlZC5tRGlyOworICAgICAgICAgICAgYm9vbGVhbiBlYXN5ID0gbWVhc3VyZWQubUVhc3k7CiAKLSAgICAgICAgICAgIFRleHRVdGlscy5nZXRDaGFycyhzb3VyY2UsIHN0YXJ0LCBlbmQsIGNocywgMCk7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgbiA9IGVuZCAtIHN0YXJ0OwotCi0gICAgICAgICAgICBib29sZWFuIGVhc3kgPSB0cnVlOwotICAgICAgICAgICAgYm9vbGVhbiBhbHRlcmVkID0gZmFsc2U7Ci0gICAgICAgICAgICBpbnQgZGlyID0gREVGQVVMVF9ESVI7IC8vIFhYWAotCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgewotICAgICAgICAgICAgICAgIGlmIChjaHNbaV0gPj0gRklSU1RfUklHSFRfVE9fTEVGVCkgewotICAgICAgICAgICAgICAgICAgICBlYXN5ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gRW5zdXJlIHRoYXQgbm9uZSBvZiB0aGUgdW5kZXJseWluZyBjaGFyYWN0ZXJzIGFyZSB0cmVhdGVkCi0gICAgICAgICAgICAvLyBhcyB2aWFibGUgYnJlYWtwb2ludHMsIGFuZCB0aGF0IHRoZSBlbnRpcmUgcnVuIGdldHMgdGhlCi0gICAgICAgICAgICAvLyBzYW1lIGJpZGkgZGlyZWN0aW9uLgotCi0gICAgICAgICAgICBpZiAoc291cmNlIGluc3RhbmNlb2YgU3Bhbm5lZCkgewotICAgICAgICAgICAgICAgIFNwYW5uZWQgc3AgPSAoU3Bhbm5lZCkgc291cmNlOwotICAgICAgICAgICAgICAgIFJlcGxhY2VtZW50U3BhbltdIHNwYW5zID0gc3AuZ2V0U3BhbnMoc3RhcnQsIGVuZCwgUmVwbGFjZW1lbnRTcGFuLmNsYXNzKTsKLQotICAgICAgICAgICAgICAgIGZvciAoaW50IHkgPSAwOyB5IDwgc3BhbnMubGVuZ3RoOyB5KyspIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IGEgPSBzcC5nZXRTcGFuU3RhcnQoc3BhbnNbeV0pOwotICAgICAgICAgICAgICAgICAgICBpbnQgYiA9IHNwLmdldFNwYW5FbmQoc3BhbnNbeV0pOwotCi0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IHggPSBhOyB4IDwgYjsgeCsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjaHNbeCAtIHN0YXJ0XSA9ICdcdUZGRkMnOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIWVhc3kpIHsKLSAgICAgICAgICAgICAgICAvLyBYWFggcHV0IG92ZXJyaWRlIGZsYWdzLCBldGMuIGludG8gY2hkaXJzCi0gICAgICAgICAgICAgICAgZGlyID0gYmlkaShkaXIsIGNocywgY2hkaXJzLCBuLCBmYWxzZSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBEbyBtaXJyb3JpbmcgZm9yIHJpZ2h0LXRvLWxlZnQgc2VnbWVudHMKLQotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjaGRpcnNbaV0gPT0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX1JJR0hUX1RPX0xFRlQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBqOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGogPSBpOyBqIDwgbjsgaisrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoZGlyc1tqXSAhPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfUklHSFRfVE9fTEVGVCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBbmRyb2lkQ2hhcmFjdGVyLm1pcnJvcihjaHMsIGksIGogLSBpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHRlcmVkID0gdHJ1ZTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaSA9IGogLSAxOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBDaGFyU2VxdWVuY2Ugc3ViOwotCi0gICAgICAgICAgICBpZiAoYWx0ZXJlZCkgewotICAgICAgICAgICAgICAgIGlmIChhbHRlciA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICBhbHRlciA9IEFsdGVyZWRDaGFyU2VxdWVuY2UubWFrZShzb3VyY2UsIGNocywgc3RhcnQsIGVuZCk7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBhbHRlci51cGRhdGUoY2hzLCBzdGFydCwgZW5kKTsKLQotICAgICAgICAgICAgICAgIHN1YiA9IGFsdGVyOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzdWIgPSBzb3VyY2U7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBDaGFyU2VxdWVuY2Ugc3ViID0gc291cmNlOwogCiAgICAgICAgICAgICBpbnQgd2lkdGggPSBmaXJzdHdpZHRoOwogCiAgICAgICAgICAgICBmbG9hdCB3ID0gMDsKLSAgICAgICAgICAgIGludCBoZXJlID0gc3RhcnQ7CisgICAgICAgICAgICBpbnQgaGVyZSA9IHBhcmFTdGFydDsKIAotICAgICAgICAgICAgaW50IG9rID0gc3RhcnQ7CisgICAgICAgICAgICBpbnQgb2sgPSBwYXJhU3RhcnQ7CiAgICAgICAgICAgICBmbG9hdCBva3dpZHRoID0gdzsKICAgICAgICAgICAgIGludCBva2FzY2VudCA9IDAsIG9rZGVzY2VudCA9IDAsIG9rdG9wID0gMCwgb2tib3R0b20gPSAwOwogCi0gICAgICAgICAgICBpbnQgZml0ID0gc3RhcnQ7CisgICAgICAgICAgICBpbnQgZml0ID0gcGFyYVN0YXJ0OwogICAgICAgICAgICAgZmxvYXQgZml0d2lkdGggPSB3OwogICAgICAgICAgICAgaW50IGZpdGFzY2VudCA9IDAsIGZpdGRlc2NlbnQgPSAwLCBmaXR0b3AgPSAwLCBmaXRib3R0b20gPSAwOwogCi0gICAgICAgICAgICBib29sZWFuIHRhYiA9IGZhbHNlOworICAgICAgICAgICAgYm9vbGVhbiBoYXNUYWJPckVtb2ppID0gZmFsc2U7CisgICAgICAgICAgICBib29sZWFuIGhhc1RhYiA9IGZhbHNlOworICAgICAgICAgICAgVGFiU3RvcHMgdGFiU3RvcHMgPSBudWxsOwogCi0gICAgICAgICAgICBpbnQgbmV4dDsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSBzdGFydDsgaSA8IGVuZDsgaSA9IG5leHQpIHsKLSAgICAgICAgICAgICAgICBpZiAoc3Bhbm5lZCA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICBuZXh0ID0gZW5kOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgbmV4dCA9IHNwYW5uZWQubmV4dFNwYW5UcmFuc2l0aW9uKGksIGVuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldHJpY0FmZmVjdGluZ1NwYW4uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcyk7CisgICAgICAgICAgICBmb3IgKGludCBzcGFuU3RhcnQgPSBwYXJhU3RhcnQsIHNwYW5FbmQgPSBzcGFuU3RhcnQsIG5leHRTcGFuU3RhcnQ7CisgICAgICAgICAgICAgICAgICAgIHNwYW5TdGFydCA8IHBhcmFFbmQ7IHNwYW5TdGFydCA9IG5leHRTcGFuU3RhcnQpIHsKIAotICAgICAgICAgICAgICAgIGlmIChzcGFubmVkID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcGFpbnQuZ2V0VGV4dFdpZHRocyhzdWIsIGksIG5leHQsIHdpZHRocyk7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkod2lkdGhzLCAwLCB3aWR0aHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kIC0gc3RhcnQgKyAoaSAtIHN0YXJ0KSwgbmV4dCAtIGkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBwYWludC5nZXRGb250TWV0cmljc0ludChmbSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbVdvcmtQYWludC5iYXNlbGluZVNoaWZ0ID0gMDsKKyAgICAgICAgICAgICAgICBpZiAoc3BhblN0YXJ0ID09IHNwYW5FbmQpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNwYW5uZWQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwYW5FbmQgPSBwYXJhRW5kOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBzcGFuRW5kID0gc3Bhbm5lZC5uZXh0U3BhblRyYW5zaXRpb24oc3BhblN0YXJ0LCBwYXJhRW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRyaWNBZmZlY3RpbmdTcGFuLmNsYXNzKTsKIAotICAgICAgICAgICAgICAgICAgICBTdHlsZWQuZ2V0VGV4dFdpZHRocyhwYWludCwgbVdvcmtQYWludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Bhbm5lZCwgaSwgbmV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGhzLCBmbSk7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkod2lkdGhzLCAwLCB3aWR0aHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kIC0gc3RhcnQgKyAoaSAtIHN0YXJ0KSwgbmV4dCAtIGkpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChtV29ya1BhaW50LmJhc2VsaW5lU2hpZnQgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmbS5hc2NlbnQgKz0gbVdvcmtQYWludC5iYXNlbGluZVNoaWZ0OwotICAgICAgICAgICAgICAgICAgICAgICAgZm0udG9wICs9IG1Xb3JrUGFpbnQuYmFzZWxpbmVTaGlmdDsKKyAgICAgICAgICAgICAgICAgICAgaW50IHNwYW5MZW4gPSBzcGFuRW5kIC0gc3BhblN0YXJ0OworICAgICAgICAgICAgICAgICAgICBpZiAoc3Bhbm5lZCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtZWFzdXJlZC5hZGRTdHlsZVJ1bihwYWludCwgc3BhbkxlbiwgZm0pOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgZm0uZGVzY2VudCArPSBtV29ya1BhaW50LmJhc2VsaW5lU2hpZnQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmbS5ib3R0b20gKz0gbVdvcmtQYWludC5iYXNlbGluZVNoaWZ0OworICAgICAgICAgICAgICAgICAgICAgICAgTWV0cmljQWZmZWN0aW5nU3BhbltdIHNwYW5zID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGFubmVkLmdldFNwYW5zKHNwYW5TdGFydCwgc3BhbkVuZCwgTWV0cmljQWZmZWN0aW5nU3Bhbi5jbGFzcyk7CisgICAgICAgICAgICAgICAgICAgICAgICBtZWFzdXJlZC5hZGRTdHlsZVJ1bihwYWludCwgc3BhbnMsIHNwYW5MZW4sIGZtKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgICAgIG5leHRTcGFuU3RhcnQgPSBzcGFuRW5kOworICAgICAgICAgICAgICAgIGludCBzdGFydEluUGFyYSA9IHNwYW5TdGFydCAtIHBhcmFTdGFydDsKKyAgICAgICAgICAgICAgICBpbnQgZW5kSW5QYXJhID0gc3BhbkVuZCAtIHBhcmFTdGFydDsKKwogICAgICAgICAgICAgICAgIGludCBmbXRvcCA9IGZtLnRvcDsKICAgICAgICAgICAgICAgICBpbnQgZm1ib3R0b20gPSBmbS5ib3R0b207CiAgICAgICAgICAgICAgICAgaW50IGZtYXNjZW50ID0gZm0uYXNjZW50OwogICAgICAgICAgICAgICAgIGludCBmbWRlc2NlbnQgPSBmbS5kZXNjZW50OwogCi0gICAgICAgICAgICAgICAgaWYgKGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gaTsgaiA8IG5leHQ7IGorKykgewotICAgICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKHdpZHRoc1tqIC0gc3RhcnQgKyAoZW5kIC0gc3RhcnQpXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoJyAnKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIExvZy5lKCJ0ZXh0Iiwgc2IudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IGk7IGogPCBuZXh0OyBqKyspIHsKLSAgICAgICAgICAgICAgICAgICAgY2hhciBjID0gY2hzW2ogLSBzdGFydF07CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IHNwYW5TdGFydDsgaiA8IHNwYW5FbmQ7IGorKykgeworICAgICAgICAgICAgICAgICAgICBjaGFyIGMgPSBjaHNbaiAtIHBhcmFTdGFydF07CiAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGJlZm9yZSA9IHc7CiAKICAgICAgICAgICAgICAgICAgICAgaWYgKGMgPT0gJ1xuJykgewogICAgICAgICAgICAgICAgICAgICAgICAgOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGMgPT0gJ1x0JykgewotICAgICAgICAgICAgICAgICAgICAgICAgdyA9IExheW91dC5uZXh0VGFiKHN1Yiwgc3RhcnQsIGVuZCwgdywgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0YWIgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGMgPj0gMHhEODAwICYmIGMgPD0gMHhERkZGICYmIGogKyAxIDwgbmV4dCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVtb2ppID0gQ2hhcmFjdGVyLmNvZGVQb2ludEF0KGNocywgaiAtIHN0YXJ0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoYXNUYWIgPT0gZmFsc2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNUYWIgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc1RhYk9yRW1vamkgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzcGFubmVkICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmlyc3QgdGFiIHRoaXMgcGFyYSwgY2hlY2sgZm9yIHRhYnN0b3BzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhYlN0b3BTcGFuW10gc3BhbnMgPSBzcGFubmVkLmdldFNwYW5zKHBhcmFTdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhRW5kLCBUYWJTdG9wU3Bhbi5jbGFzcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzcGFucy5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJTdG9wcyA9IG5ldyBUYWJTdG9wcyhUQUJfSU5DUkVNRU5ULCBzcGFucyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGFiU3RvcHMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHcgPSB0YWJTdG9wcy5uZXh0VGFiKHcpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ID0gVGFiU3RvcHMubmV4dERlZmF1bHRTdG9wKHcsIFRBQl9JTkNSRU1FTlQpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGMgPj0gMHhEODAwICYmIGMgPD0gMHhERkZGICYmIGogKyAxIDwgc3BhbkVuZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVtb2ppID0gQ2hhcmFjdGVyLmNvZGVQb2ludEF0KGNocywgaiAtIHBhcmFTdGFydCk7CiAKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbW9qaSA+PSBNSU5fRU1PSkkgJiYgZW1vamkgPD0gTUFYX0VNT0pJKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQml0bWFwIGJtID0gRU1PSklfRkFDVE9SWS4KQEAgLTM3NiwyMSArMjk1LDIxIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaFBhaW50ID0gbVdvcmtQYWludDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHdpZCA9IChmbG9hdCkgYm0uZ2V0V2lkdGgoKSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHdpZCA9IGJtLmdldFdpZHRoKCkgKgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtd2hpY2hQYWludC5hc2NlbnQoKSAvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJtLmdldEhlaWdodCgpOwogCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHcgKz0gd2lkOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWIgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNUYWJPckVtb2ppID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaisrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHcgKz0gd2lkdGhzW2ogLSBzdGFydCArIChlbmQgLSBzdGFydCldOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ICs9IHdpZHRoc1tqIC0gcGFyYVN0YXJ0XTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHcgKz0gd2lkdGhzW2ogLSBzdGFydCArIChlbmQgLSBzdGFydCldOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHcgKz0gd2lkdGhzW2ogLSBwYXJhU3RhcnRdOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgdyArPSB3aWR0aHNbaiAtIHN0YXJ0ICsgKGVuZCAtIHN0YXJ0KV07CisgICAgICAgICAgICAgICAgICAgICAgICB3ICs9IHdpZHRoc1tqIC0gcGFyYVN0YXJ0XTsKICAgICAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgICAgIC8vIExvZy5lKCJ0ZXh0IiwgIndhcyAiICsgYmVmb3JlICsgIiBub3cgIiArIHcgKyAiIGFmdGVyICIgKyBjICsgIiB3aXRoaW4gIiArIHdpZHRoKTsKQEAgLTQxMSw3ICszMzAsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAgICAgICAgICAqIEZyb20gdGhlIFVuaWNvZGUgTGluZSBCcmVha2luZyBBbGdvcml0aG06CiAgICAgICAgICAgICAgICAgICAgICAgICAgKiAoYXQgbGVhc3QgYXBwcm94aW1hdGVseSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAqICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAqCiAgICAgICAgICAgICAgICAgICAgICAgICAgKiAuLDo7IGFyZSBjbGFzcyBJUzogYnJlYWtwb2ludHMKICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgICAgZXhjZXB0IHdoZW4gYWRqYWNlbnQgdG8gZGlnaXRzCiAgICAgICAgICAgICAgICAgICAgICAgICAgKiAvICAgIGlzIGNsYXNzIFNZOiBhIGJyZWFrcG9pbnQKQEAgLTQyNiwxMiArMzQ1LDEyIEBACiAKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjID09ICcgJyB8fCBjID09ICdcdCcgfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGMgPT0gJy4nICB8fCBjID09ICcsJyB8fCBjID09ICc6JyB8fCBjID09ICc7JykgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGogLSAxIDwgaGVyZSB8fCAhQ2hhcmFjdGVyLmlzRGlnaXQoY2hzW2ogLSAxIC0gc3RhcnRdKSkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGogKyAxID49IG5leHQgfHwgIUNoYXJhY3Rlci5pc0RpZ2l0KGNoc1tqICsgMSAtIHN0YXJ0XSkpKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaiAtIDEgPCBoZXJlIHx8ICFDaGFyYWN0ZXIuaXNEaWdpdChjaHNbaiAtIDEgLSBwYXJhU3RhcnRdKSkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGogKyAxID49IHNwYW5FbmQgfHwgIUNoYXJhY3Rlci5pc0RpZ2l0KGNoc1tqICsgMSAtIHBhcmFTdGFydF0pKSkgfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGMgPT0gJy8nIHx8IGMgPT0gJy0nKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaiArIDEgPj0gbmV4dCB8fCAhQ2hhcmFjdGVyLmlzRGlnaXQoY2hzW2ogKyAxIC0gc3RhcnRdKSkpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChqICsgMSA+PSBzcGFuRW5kIHx8ICFDaGFyYWN0ZXIuaXNEaWdpdChjaHNbaiArIDEgLSBwYXJhU3RhcnRdKSkpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGMgPj0gRklSU1RfQ0pLICYmIGlzSWRlb2dyYXBoaWMoYywgdHJ1ZSkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaiArIDEgPCBuZXh0ICYmIGlzSWRlb2dyYXBoaWMoY2hzW2ogKyAxIC0gc3RhcnRdLCBmYWxzZSkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGogKyAxIDwgc3BhbkVuZCAmJiBpc0lkZW9ncmFwaGljKGNoc1tqICsgMSAtIHBhcmFTdGFydF0sIGZhbHNlKSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBva3dpZHRoID0gdzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvayA9IGogKyAxOwogCkBAIC00NDgsNyArMzY3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvayAhPSBoZXJlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTG9nLmUoInRleHQiLCAib3V0cHV0IG9rICIgKyBoZXJlICsgIiB0byAiICtvayk7CiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAob2sgPCBuZXh0ICYmIGNoc1tvayAtIHN0YXJ0XSA9PSAnICcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAob2sgPCBzcGFuRW5kICYmIGNoc1tvayAtIHBhcmFTdGFydF0gPT0gJyAnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9rKys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogCkBAIC00NTcsMTAgKzM3NiwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2thc2NlbnQsIG9rZGVzY2VudCwgb2t0b3AsIG9rYm90dG9tLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYWNpbmdtdWx0LCBzcGFjaW5nYWRkLCBjaG9vc2VodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNob29zZWh0diwgZm0sIHRhYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRNdWx0aXBseSwgc3RhcnQsIGNoZGlycywgZGlyLCBlYXN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hvb3NlaHR2LCBmbSwgaGFzVGFiT3JFbW9qaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRNdWx0aXBseSwgcGFyYVN0YXJ0LCBjaGRpcnMsIGRpciwgZWFzeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9rID09IGJ1ZmVuZCwgaW5jbHVkZXBhZCwgdHJhY2twYWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aHMsIHN0YXJ0LCBlbmQgLSBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNocywgd2lkdGhzLCBoZXJlIC0gcGFyYVN0YXJ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmUsIGVsbGlwc2l6ZWRXaWR0aCwgb2t3aWR0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhaW50KTsKIApAQCAtNDg0LDcgKzQwMyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob2sgIT0gaGVyZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIExvZy5lKCJ0ZXh0IiwgIm91dHB1dCBvayAiICsgaGVyZSArICIgdG8gIiArb2spOwogCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKG9rIDwgbmV4dCAmJiBjaHNbb2sgLSBzdGFydF0gPT0gJyAnKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKG9rIDwgc3BhbkVuZCAmJiBjaHNbb2sgLSBwYXJhU3RhcnRdID09ICcgJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvaysrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KIApAQCAtNDkzLDEwICs0MTIsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9rYXNjZW50LCBva2Rlc2NlbnQsIG9rdG9wLCBva2JvdHRvbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGFjaW5nbXVsdCwgc3BhY2luZ2FkZCwgY2hvb3NlaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaG9vc2VodHYsIGZtLCB0YWIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWVkTXVsdGlwbHksIHN0YXJ0LCBjaGRpcnMsIGRpciwgZWFzeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNob29zZWh0diwgZm0sIGhhc1RhYk9yRW1vamksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWVkTXVsdGlwbHksIHBhcmFTdGFydCwgY2hkaXJzLCBkaXIsIGVhc3ksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvayA9PSBidWZlbmQsIGluY2x1ZGVwYWQsIHRyYWNrcGFkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGhzLCBzdGFydCwgZW5kIC0gc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaHMsIHdpZHRocywgaGVyZSAtIHBhcmFTdGFydCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlLCBlbGxpcHNpemVkV2lkdGgsIG9rd2lkdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWludCk7CiAKQEAgLTUwOSwxOSArNDI4LDIwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXR0b3AsIGZpdGJvdHRvbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGFjaW5nbXVsdCwgc3BhY2luZ2FkZCwgY2hvb3NlaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaG9vc2VodHYsIGZtLCB0YWIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWVkTXVsdGlwbHksIHN0YXJ0LCBjaGRpcnMsIGRpciwgZWFzeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNob29zZWh0diwgZm0sIGhhc1RhYk9yRW1vamksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWVkTXVsdGlwbHksIHBhcmFTdGFydCwgY2hkaXJzLCBkaXIsIGVhc3ksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXQgPT0gYnVmZW5kLCBpbmNsdWRlcGFkLCB0cmFja3BhZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRocywgc3RhcnQsIGVuZCAtIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hzLCB3aWR0aHMsIGhlcmUgLSBwYXJhU3RhcnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSwgZWxsaXBzaXplZFdpZHRoLCBmaXR3aWR0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhaW50KTsKIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlcmUgPSBmaXQ7CiAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIExvZy5lKCJ0ZXh0IiwgIm91dHB1dCBvbmUgIiArIGhlcmUgKyAiIHRvICIgKyhoZXJlICsgMSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lYXN1cmVUZXh0KHBhaW50LCBtV29ya1BhaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZSwgaGVyZSwgaGVyZSArIDEsIGZtLCB0YWIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gWFhYIG5vdCBzdXJlIHdoeSB0aGUgZXhpc3RpbmcgZm0gd2Fzbid0IG9rLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1lYXN1cmVUZXh0KHBhaW50LCBtV29ya1BhaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgIHNvdXJjZSwgaGVyZSwgaGVyZSArIDEsIGZtLCB0YWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgbnVsbCk7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ID0gb3V0KHNvdXJjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlcmUsIGhlcmUrMSwKQEAgLTUyOSwxOSArNDQ5LDIyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbS50b3AsIGZtLmJvdHRvbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGFjaW5nbXVsdCwgc3BhY2luZ2FkZCwgY2hvb3NlaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaG9vc2VodHYsIGZtLCB0YWIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWVkTXVsdGlwbHksIHN0YXJ0LCBjaGRpcnMsIGRpciwgZWFzeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNob29zZWh0diwgZm0sIGhhc1RhYk9yRW1vamksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWVkTXVsdGlwbHksIHBhcmFTdGFydCwgY2hkaXJzLCBkaXIsIGVhc3ksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZXJlICsgMSA9PSBidWZlbmQsIGluY2x1ZGVwYWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja3BhZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRocywgc3RhcnQsIGVuZCAtIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hzLCB3aWR0aHMsIGhlcmUgLSBwYXJhU3RhcnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSwgZWxsaXBzaXplZFdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGhzW2hlcmUgLSBzdGFydF0sIHBhaW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoc1toZXJlIC0gcGFyYVN0YXJ0XSwgcGFpbnQpOwogCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVyZSA9IGhlcmUgKyAxOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGVyZSA8IGkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBqID0gbmV4dCA9IGhlcmU7IC8vIG11c3QgcmVtZWFzdXJlCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGVyZSA8IHNwYW5TdGFydCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRpZG4ndCBvdXRwdXQgYWxsIHRoZSB0ZXh0IGZvciB0aGlzIHNwYW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSd2ZSBtZWFzdXJlZCB0aGUgcmF3IHdpZHRocywgdGhvdWdoLCBzbworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGp1c3QgcmVzZXQgdGhlIHN0YXJ0IHBvaW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaiA9IG5leHRTcGFuU3RhcnQgPSBoZXJlOwogICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqID0gaGVyZSAtIDE7ICAgIC8vIGNvbnRpbnVlIGxvb3BpbmcKICAgICAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTU1MSwxNCArNDc0LDE0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBmaXRhc2NlbnQgPSBmaXRkZXNjZW50ID0gZml0dG9wID0gZml0Ym90dG9tID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgIG9rYXNjZW50ID0gb2tkZXNjZW50ID0gb2t0b3AgPSBva2JvdHRvbSA9IDA7CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgtLWZpcnN0V2lkdGhMaW5lQ291bnQgPD0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKC0tZmlyc3RXaWR0aExpbmVMaW1pdCA8PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGggPSByZXN0d2lkdGg7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGlmIChlbmQgIT0gaGVyZSkgeworICAgICAgICAgICAgaWYgKHBhcmFFbmQgIT0gaGVyZSkgewogICAgICAgICAgICAgICAgIGlmICgoZml0dG9wIHwgZml0Ym90dG9tIHwgZml0ZGVzY2VudCB8IGZpdGFzY2VudCkgPT0gMCkgewogICAgICAgICAgICAgICAgICAgICBwYWludC5nZXRGb250TWV0cmljc0ludChmbSk7CiAKQEAgLTU3MSwyMCArNDk0LDIwIEBACiAgICAgICAgICAgICAgICAgLy8gTG9nLmUoInRleHQiLCAib3V0cHV0IHJlc3QgIiArIGhlcmUgKyAiIHRvICIgKyBlbmQpOwogCiAgICAgICAgICAgICAgICAgdiA9IG91dChzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICBoZXJlLCBlbmQsIGZpdGFzY2VudCwgZml0ZGVzY2VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGhlcmUsIHBhcmFFbmQsIGZpdGFzY2VudCwgZml0ZGVzY2VudCwKICAgICAgICAgICAgICAgICAgICAgICAgIGZpdHRvcCwgZml0Ym90dG9tLAogICAgICAgICAgICAgICAgICAgICAgICAgdiwKICAgICAgICAgICAgICAgICAgICAgICAgIHNwYWNpbmdtdWx0LCBzcGFjaW5nYWRkLCBjaG9vc2VodCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNob29zZWh0diwgZm0sIHRhYiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRNdWx0aXBseSwgc3RhcnQsIGNoZGlycywgZGlyLCBlYXN5LAotICAgICAgICAgICAgICAgICAgICAgICAgZW5kID09IGJ1ZmVuZCwgaW5jbHVkZXBhZCwgdHJhY2twYWQsCi0gICAgICAgICAgICAgICAgICAgICAgICB3aWR0aHMsIHN0YXJ0LCBlbmQgLSBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNob29zZWh0diwgZm0sIGhhc1RhYk9yRW1vamksCisgICAgICAgICAgICAgICAgICAgICAgICBuZWVkTXVsdGlwbHksIHBhcmFTdGFydCwgY2hkaXJzLCBkaXIsIGVhc3ksCisgICAgICAgICAgICAgICAgICAgICAgICBwYXJhRW5kID09IGJ1ZmVuZCwgaW5jbHVkZXBhZCwgdHJhY2twYWQsCisgICAgICAgICAgICAgICAgICAgICAgICBjaHMsIHdpZHRocywgaGVyZSAtIHBhcmFTdGFydCwKICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlLCBlbGxpcHNpemVkV2lkdGgsIHcsIHBhaW50KTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgc3RhcnQgPSBlbmQ7CisgICAgICAgICAgICBwYXJhU3RhcnQgPSBwYXJhRW5kOwogCi0gICAgICAgICAgICBpZiAoZW5kID09IGJ1ZmVuZCkKKyAgICAgICAgICAgIGlmIChwYXJhRW5kID09IGJ1ZmVuZCkKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCkBAIC01OTksMjQ2ICs1MjIsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgdiwKICAgICAgICAgICAgICAgICAgICAgc3BhY2luZ211bHQsIHNwYWNpbmdhZGQsIG51bGwsCiAgICAgICAgICAgICAgICAgICAgIG51bGwsIGZtLCBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgbmVlZE11bHRpcGx5LCBidWZlbmQsIGNoZGlycywgREVGQVVMVF9ESVIsIHRydWUsCisgICAgICAgICAgICAgICAgICAgIG5lZWRNdWx0aXBseSwgYnVmZW5kLCBudWxsLCBERUZBVUxUX0RJUiwgdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwgaW5jbHVkZXBhZCwgdHJhY2twYWQsCi0gICAgICAgICAgICAgICAgICAgIHdpZHRocywgYnVmc3RhcnQsIDAsCisgICAgICAgICAgICAgICAgICAgIG51bGwsIG51bGwsIGJ1ZnN0YXJ0LAogICAgICAgICAgICAgICAgICAgICB3aGVyZSwgZWxsaXBzaXplZFdpZHRoLCAwLCBwYWludCk7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBSdW5zIHRoZSB1bmljb2RlIGJpZGkgYWxnb3JpdGhtIG9uIHRoZSBmaXJzdCBuIGNoYXJzIGluIGNocywgcmV0dXJuaW5nCi0gICAgICogdGhlIGNoYXIgZGlycyBpbiBjaEluZm8gYW5kIHRoZSBiYXNlIGxpbmUgZGlyZWN0aW9uIG9mIHRoZSBmaXJzdAotICAgICAqIHBhcmFncmFwaC4KLSAgICAgKiAKLSAgICAgKiBYWFggY2hhbmdlIHJlc3VsdCBmcm9tIGRpcnMgdG8gbGV2ZWxzCi0gICAgICogIAotICAgICAqIEBwYXJhbSBkaXIgdGhlIGRpcmVjdGlvbiBmbGFnLCBlaXRoZXIgRElSX1JFUVVFU1RfTFRSLAotICAgICAqIERJUl9SRVFVRVNUX1JUTCwgRElSX1JFUVVFU1RfREVGQVVMVF9MVFIsIG9yIERJUl9SRVFVRVNUX0RFRkFVTFRfUlRMLgotICAgICAqIEBwYXJhbSBjaHMgdGhlIHRleHQgdG8gZXhhbWluZQotICAgICAqIEBwYXJhbSBjaEluZm8gb24gaW5wdXQsIGlmIGhhc0luZm8gaXMgdHJ1ZSwgb3ZlcnJpZGUgYW5kIG90aGVyIGZsYWdzIAotICAgICAqIHJlcHJlc2VudGluZyBvdXQtb2YtYmFuZCBlbWJlZGRpbmcgaW5mb3JtYXRpb24uIE9uIG91dHB1dCwgdGhlIGdlbmVyYXRlZCAKLSAgICAgKiBkaXJzIG9mIHRoZSB0ZXh0LgotICAgICAqIEBwYXJhbSBuIHRoZSBsZW5ndGggb2YgdGhlIHRleHQvaW5mb3JtYXRpb24gaW4gY2hzIGFuZCBjaEluZm8KLSAgICAgKiBAcGFyYW0gaGFzSW5mbyB0cnVlIGlmIGNoSW5mbyBoYXMgaW5wdXQgaW5mb3JtYXRpb24sIG90aGVyd2lzZSB0aGUKLSAgICAgKiBpbnB1dCBkYXRhIGluIGNoSW5mbyBpcyBpZ25vcmVkLgotICAgICAqIEByZXR1cm4gdGhlIHJlc29sdmVkIGRpcmVjdGlvbiBsZXZlbCBvZiB0aGUgZmlyc3QgcGFyYWdyYXBoLCBlaXRoZXIKLSAgICAgKiBESVJfTEVGVF9UT19SSUdIVCBvciBESVJfUklHSFRfVE9fTEVGVC4KLSAgICAgKi8KLSAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBpbnQgYmlkaShpbnQgZGlyLCBjaGFyW10gY2hzLCBieXRlW10gY2hJbmZvLCBpbnQgbiwgCi0gICAgICAgICAgICBib29sZWFuIGhhc0luZm8pIHsKLSAgICAgICAgCi0gICAgICAgIEFuZHJvaWRDaGFyYWN0ZXIuZ2V0RGlyZWN0aW9uYWxpdGllcyhjaHMsIGNoSW5mbywgbik7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogRGV0ZXJtaW5lIHByaW1hcnkgcGFyYWdyYXBoIGRpcmVjdGlvbiBpZiBub3Qgc3BlY2lmaWVkCi0gICAgICAgICAqLwotICAgICAgICBpZiAoZGlyICE9IERJUl9SRVFVRVNUX0xUUiAmJiBkaXIgIT0gRElSX1JFUVVFU1RfUlRMKSB7Ci0gICAgICAgICAgICAvLyBzZXQgdXAgZGVmYXVsdAotICAgICAgICAgICAgZGlyID0gZGlyID49IDAgPyBESVJfTEVGVF9UT19SSUdIVCA6IERJUl9SSUdIVF9UT19MRUZUOwotICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBuOyBqKyspIHsKLSAgICAgICAgICAgICAgICBpbnQgZCA9IGNoSW5mb1tqXTsKLQotICAgICAgICAgICAgICAgIGlmIChkID09IENoYXJhY3Rlci5ESVJFQ1RJT05BTElUWV9MRUZUX1RPX1JJR0hUKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRpciA9IERJUl9MRUZUX1RPX1JJR0hUOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGQgPT0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX1JJR0hUX1RPX0xFRlQpIHsKLSAgICAgICAgICAgICAgICAgICAgZGlyID0gRElSX1JJR0hUX1RPX0xFRlQ7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIGJ5dGUgU09SID0gZGlyID09IERJUl9MRUZUX1RPX1JJR0hUID8KLSAgICAgICAgICAgICAgICBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfTEVGVF9UT19SSUdIVCA6Ci0gICAgICAgICAgICAgICAgQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX1JJR0hUX1RPX0xFRlQ7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogWFhYIEV4cGxpY2l0IG92ZXJyaWRlcyBzaG91bGQgZ28gaGVyZQotICAgICAgICAgKi8KLQotICAgICAgICAvKgotICAgICAgICAgKiBXZWFrIHR5cGUgcmVzb2x1dGlvbgotICAgICAgICAgKi8KLQotICAgICAgICAvLyBkdW1wKGNoZGlycywgbiwgImluaXRpYWwiKTsKLQotICAgICAgICAvLyBXMSBub24gc3BhY2luZyBtYXJrcwotICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IG47IGorKykgewotICAgICAgICAgICAgaWYgKGNoSW5mb1tqXSA9PSBDaGFyYWN0ZXIuTk9OX1NQQUNJTkdfTUFSSykgewotICAgICAgICAgICAgICAgIGlmIChqID09IDApCi0gICAgICAgICAgICAgICAgICAgIGNoSW5mb1tqXSA9IFNPUjsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIGNoSW5mb1tqXSA9IGNoSW5mb1tqIC0gMV07Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBkdW1wKGNoZGlycywgbiwgIlcxIik7Ci0KLSAgICAgICAgLy8gVzIgZXVyb3BlYW4gbnVtYmVycwotICAgICAgICBieXRlIGN1ciA9IFNPUjsKLSAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBuOyBqKyspIHsKLSAgICAgICAgICAgIGJ5dGUgZCA9IGNoSW5mb1tqXTsKLQotICAgICAgICAgICAgaWYgKGQgPT0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX0xFRlRfVE9fUklHSFQgfHwKLSAgICAgICAgICAgICAgICBkID09IENoYXJhY3Rlci5ESVJFQ1RJT05BTElUWV9SSUdIVF9UT19MRUZUIHx8Ci0gICAgICAgICAgICAgICAgZCA9PSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfUklHSFRfVE9fTEVGVF9BUkFCSUMpCi0gICAgICAgICAgICAgICAgY3VyID0gZDsKLSAgICAgICAgICAgIGVsc2UgaWYgKGQgPT0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX0VVUk9QRUFOX05VTUJFUikgewotICAgICAgICAgICAgICAgICBpZiAoY3VyID09Ci0gICAgICAgICAgICAgICAgICAgIENoYXJhY3Rlci5ESVJFQ1RJT05BTElUWV9SSUdIVF9UT19MRUZUX0FSQUJJQykKLSAgICAgICAgICAgICAgICAgICAgY2hJbmZvW2pdID0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX0FSQUJJQ19OVU1CRVI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBkdW1wKGNoZGlycywgbiwgIlcyIik7Ci0KLSAgICAgICAgLy8gVzMgYXJhYmljIGxldHRlcnMKLSAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBuOyBqKyspIHsKLSAgICAgICAgICAgIGlmIChjaEluZm9bal0gPT0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX1JJR0hUX1RPX0xFRlRfQVJBQklDKQotICAgICAgICAgICAgICAgIGNoSW5mb1tqXSA9IENoYXJhY3Rlci5ESVJFQ1RJT05BTElUWV9SSUdIVF9UT19MRUZUOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZHVtcChjaGRpcnMsIG4sICJXMyIpOwotCi0gICAgICAgIC8vIFc0IHNpbmdsZSBzZXBhcmF0b3IgYmV0d2VlbiBudW1iZXJzCi0gICAgICAgIGZvciAoaW50IGogPSAxOyBqIDwgbiAtIDE7IGorKykgewotICAgICAgICAgICAgYnl0ZSBkID0gY2hJbmZvW2pdOwotICAgICAgICAgICAgYnl0ZSBwcmV2ID0gY2hJbmZvW2ogLSAxXTsKLSAgICAgICAgICAgIGJ5dGUgbmV4dCA9IGNoSW5mb1tqICsgMV07Ci0KLSAgICAgICAgICAgIGlmIChkID09IENoYXJhY3Rlci5ESVJFQ1RJT05BTElUWV9FVVJPUEVBTl9OVU1CRVJfU0VQQVJBVE9SKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHByZXYgPT0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX0VVUk9QRUFOX05VTUJFUiAmJgotICAgICAgICAgICAgICAgICAgICBuZXh0ID09IENoYXJhY3Rlci5ESVJFQ1RJT05BTElUWV9FVVJPUEVBTl9OVU1CRVIpCi0gICAgICAgICAgICAgICAgICAgIGNoSW5mb1tqXSA9IENoYXJhY3Rlci5ESVJFQ1RJT05BTElUWV9FVVJPUEVBTl9OVU1CRVI7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGQgPT0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX0NPTU1PTl9OVU1CRVJfU0VQQVJBVE9SKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHByZXYgPT0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX0VVUk9QRUFOX05VTUJFUiAmJgotICAgICAgICAgICAgICAgICAgICBuZXh0ID09IENoYXJhY3Rlci5ESVJFQ1RJT05BTElUWV9FVVJPUEVBTl9OVU1CRVIpCi0gICAgICAgICAgICAgICAgICAgIGNoSW5mb1tqXSA9IENoYXJhY3Rlci5ESVJFQ1RJT05BTElUWV9FVVJPUEVBTl9OVU1CRVI7Ci0gICAgICAgICAgICAgICAgaWYgKHByZXYgPT0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX0FSQUJJQ19OVU1CRVIgJiYKLSAgICAgICAgICAgICAgICAgICAgbmV4dCA9PSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfQVJBQklDX05VTUJFUikKLSAgICAgICAgICAgICAgICAgICAgY2hJbmZvW2pdID0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX0FSQUJJQ19OVU1CRVI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBkdW1wKGNoZGlycywgbiwgIlc0Iik7Ci0KLSAgICAgICAgLy8gVzUgZXVyb3BlYW4gbnVtYmVyIHRlcm1pbmF0b3JzCi0gICAgICAgIGJvb2xlYW4gYWRqYWNlbnQgPSBmYWxzZTsKLSAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBuOyBqKyspIHsKLSAgICAgICAgICAgIGJ5dGUgZCA9IGNoSW5mb1tqXTsKLQotICAgICAgICAgICAgaWYgKGQgPT0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX0VVUk9QRUFOX05VTUJFUikKLSAgICAgICAgICAgICAgICBhZGphY2VudCA9IHRydWU7Ci0gICAgICAgICAgICBlbHNlIGlmIChkID09IENoYXJhY3Rlci5ESVJFQ1RJT05BTElUWV9FVVJPUEVBTl9OVU1CRVJfVEVSTUlOQVRPUiAmJiBhZGphY2VudCkKLSAgICAgICAgICAgICAgICBjaEluZm9bal0gPSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfRVVST1BFQU5fTlVNQkVSOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGFkamFjZW50ID0gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICAvL2R1bXAoY2hkaXJzLCBuLCAiVzUiKTsKLQotICAgICAgICAvLyBXNSBldXJvcGVhbiBudW1iZXIgdGVybWluYXRvcnMgcGFydCAyLAotICAgICAgICAvLyBXNiBzZXBhcmF0b3JzIGFuZCB0ZXJtaW5hdG9ycwotICAgICAgICBhZGphY2VudCA9IGZhbHNlOwotICAgICAgICBmb3IgKGludCBqID0gbiAtIDE7IGogPj0gMDsgai0tKSB7Ci0gICAgICAgICAgICBieXRlIGQgPSBjaEluZm9bal07Ci0KLSAgICAgICAgICAgIGlmIChkID09IENoYXJhY3Rlci5ESVJFQ1RJT05BTElUWV9FVVJPUEVBTl9OVU1CRVIpCi0gICAgICAgICAgICAgICAgYWRqYWNlbnQgPSB0cnVlOwotICAgICAgICAgICAgZWxzZSBpZiAoZCA9PSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfRVVST1BFQU5fTlVNQkVSX1RFUk1JTkFUT1IpIHsKLSAgICAgICAgICAgICAgICBpZiAoYWRqYWNlbnQpCi0gICAgICAgICAgICAgICAgICAgIGNoSW5mb1tqXSA9IENoYXJhY3Rlci5ESVJFQ1RJT05BTElUWV9FVVJPUEVBTl9OVU1CRVI7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBjaEluZm9bal0gPSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfT1RIRVJfTkVVVFJBTFM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBhZGphY2VudCA9IGZhbHNlOwotCi0gICAgICAgICAgICAgICAgaWYgKGQgPT0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX0VVUk9QRUFOX05VTUJFUl9TRVBBUkFUT1IgfHwKLSAgICAgICAgICAgICAgICAgICAgZCA9PSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfQ09NTU9OX05VTUJFUl9TRVBBUkFUT1IgfHwKLSAgICAgICAgICAgICAgICAgICAgZCA9PSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfUEFSQUdSQVBIX1NFUEFSQVRPUiB8fAotICAgICAgICAgICAgICAgICAgICBkID09IENoYXJhY3Rlci5ESVJFQ1RJT05BTElUWV9TRUdNRU5UX1NFUEFSQVRPUikKLSAgICAgICAgICAgICAgICAgICAgY2hJbmZvW2pdID0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX09USEVSX05FVVRSQUxTOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZHVtcChjaGRpcnMsIG4sICJXNiIpOwotCi0gICAgICAgIC8vIFc3IHN0cm9uZyBkaXJlY3Rpb24gb2YgZXVyb3BlYW4gbnVtYmVycwotICAgICAgICBjdXIgPSBTT1I7Ci0gICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbjsgaisrKSB7Ci0gICAgICAgICAgICBieXRlIGQgPSBjaEluZm9bal07Ci0KLSAgICAgICAgICAgIGlmIChkID09IFNPUiB8fAotICAgICAgICAgICAgICAgIGQgPT0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX0xFRlRfVE9fUklHSFQgfHwKLSAgICAgICAgICAgICAgICBkID09IENoYXJhY3Rlci5ESVJFQ1RJT05BTElUWV9SSUdIVF9UT19MRUZUKQotICAgICAgICAgICAgICAgIGN1ciA9IGQ7Ci0KLSAgICAgICAgICAgIGlmIChkID09IENoYXJhY3Rlci5ESVJFQ1RJT05BTElUWV9FVVJPUEVBTl9OVU1CRVIpCi0gICAgICAgICAgICAgICAgY2hJbmZvW2pdID0gY3VyOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZHVtcChjaGRpcnMsIG4sICJXNyIpOwotCi0gICAgICAgIC8vIE4xLCBOMiBuZXV0cmFscwotICAgICAgICBjdXIgPSBTT1I7Ci0gICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbjsgaisrKSB7Ci0gICAgICAgICAgICBieXRlIGQgPSBjaEluZm9bal07Ci0KLSAgICAgICAgICAgIGlmIChkID09IENoYXJhY3Rlci5ESVJFQ1RJT05BTElUWV9MRUZUX1RPX1JJR0hUIHx8Ci0gICAgICAgICAgICAgICAgZCA9PSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfUklHSFRfVE9fTEVGVCkgewotICAgICAgICAgICAgICAgIGN1ciA9IGQ7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGQgPT0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX0VVUk9QRUFOX05VTUJFUiB8fAotICAgICAgICAgICAgICAgICAgICAgICBkID09IENoYXJhY3Rlci5ESVJFQ1RJT05BTElUWV9BUkFCSUNfTlVNQkVSKSB7Ci0gICAgICAgICAgICAgICAgY3VyID0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX1JJR0hUX1RPX0xFRlQ7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGJ5dGUgZGQgPSBTT1I7Ci0gICAgICAgICAgICAgICAgaW50IGs7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKGsgPSBqICsgMTsgayA8IG47IGsrKykgewotICAgICAgICAgICAgICAgICAgICBkZCA9IGNoSW5mb1trXTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoZGQgPT0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX0xFRlRfVE9fUklHSFQgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRkID09IENoYXJhY3Rlci5ESVJFQ1RJT05BTElUWV9SSUdIVF9UT19MRUZUKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoZGQgPT0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX0VVUk9QRUFOX05VTUJFUiB8fAotICAgICAgICAgICAgICAgICAgICAgICAgZGQgPT0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX0FSQUJJQ19OVU1CRVIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRkID0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX1JJR0hUX1RPX0xFRlQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGZvciAoaW50IHkgPSBqOyB5IDwgazsgeSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChkZCA9PSBjdXIpCi0gICAgICAgICAgICAgICAgICAgICAgICBjaEluZm9beV0gPSBjdXI7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoSW5mb1t5XSA9IFNPUjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBqID0gayAtIDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBkdW1wKGNoZGlycywgbiwgImZpbmFsIik7Ci0KLSAgICAgICAgLy8gZXh0cmE6IGVuZm9yY2UgdGhhdCBhbGwgdGFicyBhbmQgc3Vycm9nYXRlIGNoYXJhY3RlcnMgZ28gdGhlCi0gICAgICAgIC8vIHByaW1hcnkgZGlyZWN0aW9uCi0gICAgICAgIC8vIFRPRE86IGFjdHVhbGx5IGRvIGRpcmVjdGlvbnMgcmlnaHQgZm9yIHN1cnJvZ2F0ZXMKLQotICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IG47IGorKykgewotICAgICAgICAgICAgY2hhciBjID0gY2hzW2pdOwotCi0gICAgICAgICAgICBpZiAoYyA9PSAnXHQnIHx8IChjID49IDB4RDgwMCAmJiBjIDw9IDB4REZGRikpIHsKLSAgICAgICAgICAgICAgICBjaEluZm9bal0gPSBTT1I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBkaXI7Ci0gICAgfQotCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBGSVJTVF9DSksgPSAnXHUyRTgwJzsKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIgaXMgb25lIG9mIHRob3NlIHNwZWNpZmllZApAQCAtOTQ0LDM3ICs2MzQsMTUgQEAKICAgICB9CiAqLwogCi0gICAgcHJpdmF0ZSBzdGF0aWMgaW50IGdldEZpdChUZXh0UGFpbnQgcGFpbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXh0UGFpbnQgd29ya1BhaW50LAotICAgICAgICAgICAgICAgICAgICAgICBDaGFyU2VxdWVuY2UgdGV4dCwgaW50IHN0YXJ0LCBpbnQgZW5kLAotICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB3aWQpIHsKLSAgICAgICAgaW50IGhpZ2ggPSBlbmQgKyAxLCBsb3cgPSBzdGFydCAtIDEsIGd1ZXNzOwotCi0gICAgICAgIHdoaWxlIChoaWdoIC0gbG93ID4gMSkgewotICAgICAgICAgICAgZ3Vlc3MgPSAoaGlnaCArIGxvdykgLyAyOwotCi0gICAgICAgICAgICBpZiAobWVhc3VyZVRleHQocGFpbnQsIHdvcmtQYWludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0LCBzdGFydCwgZ3Vlc3MsIG51bGwsIHRydWUsIG51bGwpID4gd2lkKQotICAgICAgICAgICAgICAgIGhpZ2ggPSBndWVzczsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBsb3cgPSBndWVzczsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChsb3cgPCBzdGFydCkKLSAgICAgICAgICAgIHJldHVybiBzdGFydDsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuIGxvdzsKLSAgICB9Ci0KICAgICBwcml2YXRlIGludCBvdXQoQ2hhclNlcXVlbmNlIHRleHQsIGludCBzdGFydCwgaW50IGVuZCwKICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWJvdmUsIGludCBiZWxvdywgaW50IHRvcCwgaW50IGJvdHRvbSwgaW50IHYsCiAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgc3BhY2luZ211bHQsIGZsb2F0IHNwYWNpbmdhZGQsCiAgICAgICAgICAgICAgICAgICAgICAgTGluZUhlaWdodFNwYW5bXSBjaG9vc2VodCwgaW50W10gY2hvb3NlaHR2LAotICAgICAgICAgICAgICAgICAgICAgIFBhaW50LkZvbnRNZXRyaWNzSW50IGZtLCBib29sZWFuIHRhYiwKKyAgICAgICAgICAgICAgICAgICAgICBQYWludC5Gb250TWV0cmljc0ludCBmbSwgYm9vbGVhbiBoYXNUYWJPckVtb2ppLAogICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gbmVlZE11bHRpcGx5LCBpbnQgcHN0YXJ0LCBieXRlW10gY2hkaXJzLAogICAgICAgICAgICAgICAgICAgICAgIGludCBkaXIsIGJvb2xlYW4gZWFzeSwgYm9vbGVhbiBsYXN0LAogICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaW5jbHVkZXBhZCwgYm9vbGVhbiB0cmFja3BhZCwKLSAgICAgICAgICAgICAgICAgICAgICBmbG9hdFtdIHdpZHRocywgaW50IHdpZHN0YXJ0LCBpbnQgd2lkb2ZmLAorICAgICAgICAgICAgICAgICAgICAgIGNoYXJbXSBjaHMsIGZsb2F0W10gd2lkdGhzLCBpbnQgd2lkc3RhcnQsCiAgICAgICAgICAgICAgICAgICAgICAgVGV4dFV0aWxzLlRydW5jYXRlQXQgZWxsaXBzaXplLCBmbG9hdCBlbGxpcHNpc3dpZHRoLAogICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHRleHR3aWR0aCwgVGV4dFBhaW50IHBhaW50KSB7CiAgICAgICAgIGludCBqID0gbUxpbmVDb3VudDsKQEAgLTk4Miw4ICs2NTAsNiBAQAogICAgICAgICBpbnQgd2FudCA9IG9mZiArIG1Db2x1bW5zICsgVE9QOwogICAgICAgICBpbnRbXSBsaW5lcyA9IG1MaW5lczsKIAotICAgICAgICAvLyBMb2cuZSgidGV4dCIsICJsaW5lICIgKyBzdGFydCArICIgdG8gIiArIGVuZCArIChsYXN0ID8gIj09PSIgOiAiIikpOwotCiAgICAgICAgIGlmICh3YW50ID49IGxpbmVzLmxlbmd0aCkgewogICAgICAgICAgICAgaW50IG5sZW4gPSBBcnJheVV0aWxzLmlkZWFsSW50QXJyYXlTaXplKHdhbnQgKyAxKTsKICAgICAgICAgICAgIGludFtdIGdyb3cgPSBuZXcgaW50W25sZW5dOwpAQCAtMTA1OSw1OSArNzI1LDIzIEBACiAgICAgICAgIGxpbmVzW29mZiArIG1Db2x1bW5zICsgU1RBUlRdID0gZW5kOwogICAgICAgICBsaW5lc1tvZmYgKyBtQ29sdW1ucyArIFRPUF0gPSB2OwogCi0gICAgICAgIGlmICh0YWIpCisgICAgICAgIGlmIChoYXNUYWJPckVtb2ppKQogICAgICAgICAgICAgbGluZXNbb2ZmICsgVEFCXSB8PSBUQUJfTUFTSzsKIAotICAgICAgICB7Ci0gICAgICAgICAgICBsaW5lc1tvZmYgKyBESVJdIHw9IGRpciA8PCBESVJfU0hJRlQ7Ci0KLSAgICAgICAgICAgIGludCBjdXIgPSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfTEVGVF9UT19SSUdIVDsKLSAgICAgICAgICAgIGludCBjb3VudCA9IDA7Ci0KLSAgICAgICAgICAgIGlmICghZWFzeSkgewotICAgICAgICAgICAgICAgIGZvciAoaW50IGsgPSBzdGFydDsgayA8IGVuZDsgaysrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjaGRpcnNbayAtIHBzdGFydF0gIT0gY3VyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb3VudCsrOwotICAgICAgICAgICAgICAgICAgICAgICAgY3VyID0gY2hkaXJzW2sgLSBwc3RhcnRdOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBEaXJlY3Rpb25zIGxpbmVkaXJzOwotCi0gICAgICAgICAgICBpZiAoY291bnQgPT0gMCkgewotICAgICAgICAgICAgICAgIGxpbmVkaXJzID0gRElSU19BTExfTEVGVF9UT19SSUdIVDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc2hvcnRbXSBsZCA9IG5ldyBzaG9ydFtjb3VudCArIDFdOwotCi0gICAgICAgICAgICAgICAgY3VyID0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX0xFRlRfVE9fUklHSFQ7Ci0gICAgICAgICAgICAgICAgY291bnQgPSAwOwotICAgICAgICAgICAgICAgIGludCBoZXJlID0gc3RhcnQ7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKGludCBrID0gc3RhcnQ7IGsgPCBlbmQ7IGsrKykgewotICAgICAgICAgICAgICAgICAgICBpZiAoY2hkaXJzW2sgLSBwc3RhcnRdICE9IGN1cikgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gWFhYIGNoZWNrIHRvIG1ha2Ugc3VyZSB3ZSBkb24ndAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIG92ZXJmbG93IHNob3J0Ci0gICAgICAgICAgICAgICAgICAgICAgICBsZFtjb3VudCsrXSA9IChzaG9ydCkgKGsgLSBoZXJlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGN1ciA9IGNoZGlyc1trIC0gcHN0YXJ0XTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGhlcmUgPSBrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgbGRbY291bnRdID0gKHNob3J0KSAoZW5kIC0gaGVyZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoY291bnQgPT0gMSAmJiBsZFswXSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxpbmVkaXJzID0gRElSU19BTExfUklHSFRfVE9fTEVGVDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBsaW5lZGlycyA9IG5ldyBEaXJlY3Rpb25zKGxkKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KKyAgICAgICAgbGluZXNbb2ZmICsgRElSXSB8PSBkaXIgPDwgRElSX1NISUZUOworICAgICAgICBEaXJlY3Rpb25zIGxpbmVkaXJzID0gRElSU19BTExfTEVGVF9UT19SSUdIVDsKKyAgICAgICAgLy8gZWFzeSBtZWFucyBhbGwgY2hhcnMgPCB0aGUgZmlyc3QgUlRMLCBzbyBubyBlbW9qaSwgbm8gbm90aGluZworICAgICAgICAvLyBYWFggYSBydW4gd2l0aCBubyB0ZXh0IG9yIGFsbCBzcGFjZXMgaXMgZWFzeSBidXQgbWlnaHQgYmUgYW4gZW1wdHkKKyAgICAgICAgLy8gUlRMIHBhcmFncmFwaC4gIE1ha2Ugc3VyZSBlYXN5IGlzIGZhbHNlIGlmIHRoaXMgaXMgdGhlIGNhc2UuCisgICAgICAgIGlmIChlYXN5KSB7CiAgICAgICAgICAgICBtTGluZURpcmVjdGlvbnNbal0gPSBsaW5lZGlyczsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1MaW5lRGlyZWN0aW9uc1tqXSA9IEFuZHJvaWRCaWRpLmRpcmVjdGlvbnMoZGlyLCBjaGRpcnMsIHdpZHN0YXJ0LCBjaHMsCisgICAgICAgICAgICAgICAgICAgIHdpZHN0YXJ0LCBlbmQgLSBzdGFydCk7CiAKICAgICAgICAgICAgIC8vIElmIGVsbGlwc2l6ZSBpcyBpbiBtYXJxdWVlIG1vZGUsIGRvIG5vdCBhcHBseSBlbGxpcHNpcyBvbiB0aGUgZmlyc3QgbGluZQogICAgICAgICAgICAgaWYgKGVsbGlwc2l6ZSAhPSBudWxsICYmIChlbGxpcHNpemUgIT0gVGV4dFV0aWxzLlRydW5jYXRlQXQuTUFSUVVFRSB8fCBqICE9IDApKSB7Ci0gICAgICAgICAgICAgICAgY2FsY3VsYXRlRWxsaXBzaXMoc3RhcnQsIGVuZCwgd2lkdGhzLCB3aWRzdGFydCwgd2lkb2ZmLAorICAgICAgICAgICAgICAgIGNhbGN1bGF0ZUVsbGlwc2lzKHN0YXJ0LCBlbmQsIHdpZHRocywgd2lkc3RhcnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxsaXBzaXN3aWR0aCwgZWxsaXBzaXplLCBqLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHR3aWR0aCwgcGFpbnQpOwogICAgICAgICAgICAgfQpAQCAtMTEyMiw3ICs3NTIsNyBAQAogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBjYWxjdWxhdGVFbGxpcHNpcyhpbnQgbGluZXN0YXJ0LCBpbnQgbGluZWVuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXRbXSB3aWR0aHMsIGludCB3aWRzdGFydCwgaW50IHdpZG9mZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXRbXSB3aWR0aHMsIGludCB3aWRzdGFydCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYXZhaWwsIFRleHRVdGlscy5UcnVuY2F0ZUF0IHdoZXJlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGluZSwgZmxvYXQgdGV4dHdpZHRoLCBUZXh0UGFpbnQgcGFpbnQpIHsKICAgICAgICAgaW50IGxlbiA9IGxpbmVlbmQgLSBsaW5lc3RhcnQ7CkBAIC0xMTQyLDcgKzc3Miw3IEBACiAgICAgICAgICAgICBpbnQgaTsKIAogICAgICAgICAgICAgZm9yIChpID0gbGVuOyBpID49IDA7IGktLSkgewotICAgICAgICAgICAgICAgIGZsb2F0IHcgPSB3aWR0aHNbaSAtIDEgKyBsaW5lc3RhcnQgLSB3aWRzdGFydCArIHdpZG9mZl07CisgICAgICAgICAgICAgICAgZmxvYXQgdyA9IHdpZHRoc1tpIC0gMSArIGxpbmVzdGFydCAtIHdpZHN0YXJ0XTsKIAogICAgICAgICAgICAgICAgIGlmICh3ICsgc3VtICsgZWxsaXBzaXN3aWQgPiBhdmFpbCkgewogICAgICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTExNTgsNyArNzg4LDcgQEAKICAgICAgICAgICAgIGludCBpOwogCiAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLSAgICAgICAgICAgICAgICBmbG9hdCB3ID0gd2lkdGhzW2kgKyBsaW5lc3RhcnQgLSB3aWRzdGFydCArIHdpZG9mZl07CisgICAgICAgICAgICAgICAgZmxvYXQgdyA9IHdpZHRoc1tpICsgbGluZXN0YXJ0IC0gd2lkc3RhcnRdOwogCiAgICAgICAgICAgICAgICAgaWYgKHcgKyBzdW0gKyBlbGxpcHNpc3dpZCA+IGF2YWlsKSB7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtMTE3NSw3ICs4MDUsNyBAQAogCiAgICAgICAgICAgICBmbG9hdCByYXZhaWwgPSAoYXZhaWwgLSBlbGxpcHNpc3dpZCkgLyAyOwogICAgICAgICAgICAgZm9yIChyaWdodCA9IGxlbjsgcmlnaHQgPj0gMDsgcmlnaHQtLSkgewotICAgICAgICAgICAgICAgIGZsb2F0IHcgPSB3aWR0aHNbcmlnaHQgLSAxICsgbGluZXN0YXJ0IC0gd2lkc3RhcnQgKyB3aWRvZmZdOworICAgICAgICAgICAgICAgIGZsb2F0IHcgPSB3aWR0aHNbcmlnaHQgLSAxICsgbGluZXN0YXJ0IC0gd2lkc3RhcnRdOwogCiAgICAgICAgICAgICAgICAgaWYgKHcgKyByc3VtID4gcmF2YWlsKSB7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtMTE4Niw3ICs4MTYsNyBAQAogCiAgICAgICAgICAgICBmbG9hdCBsYXZhaWwgPSBhdmFpbCAtIGVsbGlwc2lzd2lkIC0gcnN1bTsKICAgICAgICAgICAgIGZvciAobGVmdCA9IDA7IGxlZnQgPCByaWdodDsgbGVmdCsrKSB7Ci0gICAgICAgICAgICAgICAgZmxvYXQgdyA9IHdpZHRoc1tsZWZ0ICsgbGluZXN0YXJ0IC0gd2lkc3RhcnQgKyB3aWRvZmZdOworICAgICAgICAgICAgICAgIGZsb2F0IHcgPSB3aWR0aHNbbGVmdCArIGxpbmVzdGFydCAtIHdpZHN0YXJ0XTsKIAogICAgICAgICAgICAgICAgIGlmICh3ICsgbHN1bSA+IGxhdmFpbCkgewogICAgICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTEyMDMsNyArODMzLDcgQEAKICAgICAgICAgbUxpbmVzW21Db2x1bW5zICogbGluZSArIEVMTElQU0lTX0NPVU5UXSA9IGVsbGlwc2lzQ291bnQ7CiAgICAgfQogCi0gICAgLy8gT3ZlcnJpZGUgdGhlIGJhc2VjbGFzcyBzbyB3ZSBjYW4gZGlyZWN0bHkgYWNjZXNzIG91ciBtZW1iZXJzLAorICAgIC8vIE92ZXJyaWRlIHRoZSBiYXNlIGNsYXNzIHNvIHdlIGNhbiBkaXJlY3RseSBhY2Nlc3Mgb3VyIG1lbWJlcnMsCiAgICAgLy8gcmF0aGVyIHRoYW4gcmVseWluZyBvbiBtZW1iZXIgZnVuY3Rpb25zLgogICAgIC8vIFRoZSBsb2dpYyBtaXJyb3JzIHRoYXQgb2YgTGF5b3V0LmdldExpbmVGb3JWZXJ0aWNhbAogICAgIC8vIEZJWE1FOiBJdCBtYXkgYmUgZmFzdGVyIHRvIGRvIGEgbGluZWFyIHNlYXJjaCBmb3IgbGF5b3V0cyB3aXRob3V0IG1hbnkgbGluZXMuCkBAIC0xMjMyLDExICs4NjIsMTEgQEAKICAgICB9CiAKICAgICBwdWJsaWMgaW50IGdldExpbmVUb3AoaW50IGxpbmUpIHsKLSAgICAgICAgcmV0dXJuIG1MaW5lc1ttQ29sdW1ucyAqIGxpbmUgKyBUT1BdOyAgICAKKyAgICAgICAgcmV0dXJuIG1MaW5lc1ttQ29sdW1ucyAqIGxpbmUgKyBUT1BdOwogICAgIH0KIAogICAgIHB1YmxpYyBpbnQgZ2V0TGluZURlc2NlbnQoaW50IGxpbmUpIHsKLSAgICAgICAgcmV0dXJuIG1MaW5lc1ttQ29sdW1ucyAqIGxpbmUgKyBERVNDRU5UXTsgICAKKyAgICAgICAgcmV0dXJuIG1MaW5lc1ttQ29sdW1ucyAqIGxpbmUgKyBERVNDRU5UXTsKICAgICB9CiAKICAgICBwdWJsaWMgaW50IGdldExpbmVTdGFydChpbnQgbGluZSkgewpAQCAtMTMwOSwxMyArOTM5LDExIEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERJUl9TSElGVCAgPSAzMDsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVEFCX01BU0sgICA9IDB4MjAwMDAwMDA7CiAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIEZJUlNUX1JJR0hUX1RPX0xFRlQgPSAnXHUwNTkwJzsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVEFCX0lOQ1JFTUVOVCA9IDIwOyAvLyBzYW1lIGFzIExheW91dCwgYnV0IHRoYXQncyBwcml2YXRlCiAKICAgICAvKgotICAgICAqIFRoZXNlIGFyZSByZXVzZWQgYWNyb3NzIGNhbGxzIHRvIGdlbmVyYXRlKCkKKyAgICAgKiBUaGlzIGlzIHJldXNlZCBhY3Jvc3MgY2FsbHMgdG8gZ2VuZXJhdGUoKQogICAgICAqLwotICAgIHByaXZhdGUgYnl0ZVtdIG1DaGRpcnM7Ci0gICAgcHJpdmF0ZSBjaGFyW10gbUNoczsKLSAgICBwcml2YXRlIGZsb2F0W10gbVdpZHRoczsKKyAgICBwcml2YXRlIE1lYXN1cmVkVGV4dCBtTWVhc3VyZWQ7CiAgICAgcHJpdmF0ZSBQYWludC5Gb250TWV0cmljc0ludCBtRm9udE1ldHJpY3NJbnQgPSBuZXcgUGFpbnQuRm9udE1ldHJpY3NJbnQoKTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvU3R5bGVkLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L1N0eWxlZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MTNiMmNkLi4wMDAwMDAwCi0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvU3R5bGVkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MzQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGFuZHJvaWQudGV4dDsKLQotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQ7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LnN0eWxlLkNoYXJhY3RlclN0eWxlOwotaW1wb3J0IGFuZHJvaWQudGV4dC5zdHlsZS5NZXRyaWNBZmZlY3RpbmdTcGFuOwotaW1wb3J0IGFuZHJvaWQudGV4dC5zdHlsZS5SZXBsYWNlbWVudFNwYW47Ci0KLS8qKgotICogVGhpcyBjbGFzcyBwcm92aWRlcyBzdGF0aWMgbWV0aG9kcyBmb3IgZHJhd2luZyBhbmQgbWVhc3VyaW5nIHN0eWxlZCB0ZXh0LAotICogbGlrZSB7QGxpbmsgYW5kcm9pZC50ZXh0LlNwYW5uZWR9IG9iamVjdCB3aXRoCi0gKiB7QGxpbmsgYW5kcm9pZC50ZXh0LnN0eWxlLlJlcGxhY2VtZW50U3Bhbn0uCi0gKgotICogQGhpZGUKLSAqLwotcHVibGljIGNsYXNzIFN0eWxlZAotewotICAgIC8qKgotICAgICAqIERyYXdzIGFuZC9vciBtZWFzdXJlcyBhIHVuaWZvcm0gcnVuIG9mIHRleHQgb24gYSBzaW5nbGUgbGluZS4gTm8gc3BhbiBvZgotICAgICAqIGludGVyZXN0IHNob3VsZCBzdGFydCBvciBlbmQgaW4gdGhlIG1pZGRsZSBvZiB0aGlzIHJ1biAoaWYgbm90Ci0gICAgICogZHJhd2luZywgY2hhcmFjdGVyIHNwYW5zIHRoYXQgZG9uJ3QgYWZmZWN0IG1ldHJpY3MgY2FuIGJlIGlnbm9yZWQpLgotICAgICAqIE5laXRoZXIgc2hvdWxkIHRoZSBydW4gZGlyZWN0aW9uIGNoYW5nZSBpbiB0aGUgbWlkZGxlIG9mIHRoZSBydW4uCi0gICAgICoKLSAgICAgKiA8cD5UaGUgeCBwb3NpdGlvbiBpcyB0aGUgbGVhZGluZyBlZGdlIG9mIHRoZSB0ZXh0LiBJbiBhIHJpZ2h0LXRvLWxlZnQKLSAgICAgKiBwYXJhZ3JhcGgsIHRoaXMgd2lsbCBiZSB0byB0aGUgcmlnaHQgb2YgdGhlIHRleHQgdG8gYmUgZHJhd24uIFBhaW50Ci0gICAgICogc2hvdWxkIG5vdCBoYXZlIGFuIEFsaWduIHZhbHVlIG90aGVyIHRoYW4gTEVGVCBvciBwb3NpdGlvbmluZyB3aWxsIGdldAotICAgICAqIGNvbmZ1c2VkLgotICAgICAqCi0gICAgICogPHA+T24gcmV0dXJuLCB3b3JrUGFpbnQgd2lsbCByZWZsZWN0IHRoZSBvcmlnaW5hbCBwYWludCBwbHVzIGFueQotICAgICAqIG1vZGlmaWNhdGlvbnMgbWFkZSBieSBjaGFyYWN0ZXIgc3R5bGVzIG9uIHRoZSBydW4uCi0gICAgICoKLSAgICAgKiA8cD5UaGUgcmV0dXJuZWQgd2lkdGggaXMgc2lnbmVkIGFuZCB3aWxsIGJlIDwgMCBpZiB0aGUgcGFyYWdyYXBoCi0gICAgICogZGlyZWN0aW9uIGlzIHJpZ2h0LXRvLWxlZnQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmxvYXQgZHJhd1VuaWZvcm1SdW4oQ2FudmFzIGNhbnZhcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNwYW5uZWQgdGV4dCwgaW50IHN0YXJ0LCBpbnQgZW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRpciwgYm9vbGVhbiBydW5Jc1J0bCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHgsIGludCB0b3AsIGludCB5LCBpbnQgYm90dG9tLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFpbnQuRm9udE1ldHJpY3NJbnQgZm1pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGV4dFBhaW50IHBhaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGV4dFBhaW50IHdvcmtQYWludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gbmVlZFdpZHRoKSB7Ci0KLSAgICAgICAgYm9vbGVhbiBoYXZlV2lkdGggPSBmYWxzZTsKLSAgICAgICAgZmxvYXQgcmV0ID0gMDsKLSAgICAgICAgQ2hhcmFjdGVyU3R5bGVbXSBzcGFucyA9IHRleHQuZ2V0U3BhbnMoc3RhcnQsIGVuZCwgQ2hhcmFjdGVyU3R5bGUuY2xhc3MpOwotCi0gICAgICAgIFJlcGxhY2VtZW50U3BhbiByZXBsYWNlbWVudCA9IG51bGw7Ci0KLSAgICAgICAgLy8gWFhYOiBUaGlzIHNob3VsZG4ndCBiZSBtb2RpZnlpbmcgcGFpbnQsIG9ubHkgd29ya1BhaW50LgotICAgICAgICAvLyBIb3dldmVyLCB0aGUgbWVtYmVycyBiZWxvbmdpbmcgdG8gVGV4dFBhaW50IHNob3VsZCBoYXZlIGRlZmF1bHQKLSAgICAgICAgLy8gdmFsdWVzIGFueXdheS4gIEJldHRlciB0byBlbnN1cmUgdGhpcyBpbiB0aGUgTGF5b3V0IGNvbnN0cnVjdG9yLgotICAgICAgICBwYWludC5iZ0NvbG9yID0gMDsKLSAgICAgICAgcGFpbnQuYmFzZWxpbmVTaGlmdCA9IDA7Ci0gICAgICAgIHdvcmtQYWludC5zZXQocGFpbnQpOwotCi0JCWlmIChzcGFucy5sZW5ndGggPiAwKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNwYW5zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJQ2hhcmFjdGVyU3R5bGUgc3BhbiA9IHNwYW5zW2ldOwotCi0JCQkJaWYgKHNwYW4gaW5zdGFuY2VvZiBSZXBsYWNlbWVudFNwYW4pIHsKLQkJCQkJcmVwbGFjZW1lbnQgPSAoUmVwbGFjZW1lbnRTcGFuKXNwYW47Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlzcGFuLnVwZGF0ZURyYXdTdGF0ZSh3b3JrUGFpbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0gICAgICAgIGlmIChyZXBsYWNlbWVudCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBDaGFyU2VxdWVuY2UgdG1wOwotICAgICAgICAgICAgaW50IHRtcHN0YXJ0LCB0bXBlbmQ7Ci0KLSAgICAgICAgICAgIGlmIChydW5Jc1J0bCkgewotICAgICAgICAgICAgICAgIHRtcCA9IFRleHRVdGlscy5nZXRSZXZlcnNlKHRleHQsIHN0YXJ0LCBlbmQpOwotICAgICAgICAgICAgICAgIHRtcHN0YXJ0ID0gMDsKLSAgICAgICAgICAgICAgICAvLyBYWFg6IGFzc3VtZXMgZ2V0UmV2ZXJzZSBkb2Vzbid0IGNoYW5nZSB0aGUgbGVuZ3RoIG9mIHRoZSB0ZXh0Ci0gICAgICAgICAgICAgICAgdG1wZW5kID0gZW5kIC0gc3RhcnQ7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRtcCA9IHRleHQ7Ci0gICAgICAgICAgICAgICAgdG1wc3RhcnQgPSBzdGFydDsKLSAgICAgICAgICAgICAgICB0bXBlbmQgPSBlbmQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChmbWkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHdvcmtQYWludC5nZXRGb250TWV0cmljc0ludChmbWkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoY2FudmFzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAod29ya1BhaW50LmJnQ29sb3IgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICBpbnQgYyA9IHdvcmtQYWludC5nZXRDb2xvcigpOwotICAgICAgICAgICAgICAgICAgICBQYWludC5TdHlsZSBzID0gd29ya1BhaW50LmdldFN0eWxlKCk7Ci0gICAgICAgICAgICAgICAgICAgIHdvcmtQYWludC5zZXRDb2xvcih3b3JrUGFpbnQuYmdDb2xvcik7Ci0gICAgICAgICAgICAgICAgICAgIHdvcmtQYWludC5zZXRTdHlsZShQYWludC5TdHlsZS5GSUxMKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoIWhhdmVXaWR0aCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gd29ya1BhaW50Lm1lYXN1cmVUZXh0KHRtcCwgdG1wc3RhcnQsIHRtcGVuZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBoYXZlV2lkdGggPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGRpciA9PSBMYXlvdXQuRElSX1JJR0hUX1RPX0xFRlQpCi0gICAgICAgICAgICAgICAgICAgICAgICBjYW52YXMuZHJhd1JlY3QoeCAtIHJldCwgdG9wLCB4LCBib3R0b20sIHdvcmtQYWludCk7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhbnZhcy5kcmF3UmVjdCh4LCB0b3AsIHggKyByZXQsIGJvdHRvbSwgd29ya1BhaW50KTsKLQotICAgICAgICAgICAgICAgICAgICB3b3JrUGFpbnQuc2V0U3R5bGUocyk7Ci0gICAgICAgICAgICAgICAgICAgIHdvcmtQYWludC5zZXRDb2xvcihjKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoZGlyID09IExheW91dC5ESVJfUklHSFRfVE9fTEVGVCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoIWhhdmVXaWR0aCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gd29ya1BhaW50Lm1lYXN1cmVUZXh0KHRtcCwgdG1wc3RhcnQsIHRtcGVuZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBoYXZlV2lkdGggPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgY2FudmFzLmRyYXdUZXh0KHRtcCwgdG1wc3RhcnQsIHRtcGVuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHggLSByZXQsIHkgKyB3b3JrUGFpbnQuYmFzZWxpbmVTaGlmdCwgd29ya1BhaW50KTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZiAobmVlZFdpZHRoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWhhdmVXaWR0aCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IHdvcmtQYWludC5tZWFzdXJlVGV4dCh0bXAsIHRtcHN0YXJ0LCB0bXBlbmQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhdmVXaWR0aCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBjYW52YXMuZHJhd1RleHQodG1wLCB0bXBzdGFydCwgdG1wZW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCwgeSArIHdvcmtQYWludC5iYXNlbGluZVNoaWZ0LCB3b3JrUGFpbnQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKG5lZWRXaWR0aCAmJiAhaGF2ZVdpZHRoKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldCA9IHdvcmtQYWludC5tZWFzdXJlVGV4dCh0bXAsIHRtcHN0YXJ0LCB0bXBlbmQpOwotICAgICAgICAgICAgICAgICAgICBoYXZlV2lkdGggPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldCA9IHJlcGxhY2VtZW50LmdldFNpemUod29ya1BhaW50LCB0ZXh0LCBzdGFydCwgZW5kLCBmbWkpOwotCi0gICAgICAgICAgICBpZiAoY2FudmFzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoZGlyID09IExheW91dC5ESVJfUklHSFRfVE9fTEVGVCkKLSAgICAgICAgICAgICAgICAgICAgcmVwbGFjZW1lbnQuZHJhdyhjYW52YXMsIHRleHQsIHN0YXJ0LCBlbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCAtIHJldCwgdG9wLCB5LCBib3R0b20sIHdvcmtQYWludCk7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICByZXBsYWNlbWVudC5kcmF3KGNhbnZhcywgdGV4dCwgc3RhcnQsIGVuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4LCB0b3AsIHksIGJvdHRvbSwgd29ya1BhaW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChkaXIgPT0gTGF5b3V0LkRJUl9SSUdIVF9UT19MRUZUKQotICAgICAgICAgICAgcmV0dXJuIC1yZXQ7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgYWR2YW5jZSB3aWR0aHMgZm9yIGEgdW5pZm9ybSBsZWZ0LXRvLXJpZ2h0IHJ1biBvZiB0ZXh0IHdpdGgKLSAgICAgKiBubyBzdHlsZSBjaGFuZ2VzIGluIHRoZSBtaWRkbGUgb2YgdGhlIHJ1bi4gSWYgYW55IHN0eWxlIGlzIHJlcGxhY2VtZW50Ci0gICAgICogdGV4dCwgdGhlIGZpcnN0IGNoYXJhY3RlciB3aWxsIGdldCB0aGUgd2lkdGggb2YgdGhlIHJlcGxhY2VtZW50IGFuZCB0aGUKLSAgICAgKiByZW1haW5pbmcgY2hhcmFjdGVycyB3aWxsIGdldCBhIHdpZHRoIG9mIDAuCi0gICAgICogCi0gICAgICogQHBhcmFtIHBhaW50IHRoZSBwYWludCwgd2lsbCBub3QgYmUgbW9kaWZpZWQKLSAgICAgKiBAcGFyYW0gd29ya1BhaW50IGEgcGFpbnQgdG8gbW9kaWZ5OyBvbiByZXR1cm4gd2lsbCByZWZsZWN0IHRoZSBvcmlnaW5hbAotICAgICAqICAgICAgICBwYWludCBwbHVzIHRoZSBlZmZlY3Qgb2YgYWxsIHNwYW5zIG9uIHRoZSBydW4KLSAgICAgKiBAcGFyYW0gdGV4dCB0aGUgdGV4dAotICAgICAqIEBwYXJhbSBzdGFydCB0aGUgc3RhcnQgb2YgdGhlIHJ1bgotICAgICAqIEBwYXJhbSBlbmQgdGhlIGxpbWl0IG9mIHRoZSBydW4KLSAgICAgKiBAcGFyYW0gd2lkdGhzIGFycmF5IHRvIHJlY2VpdmUgdGhlIGFkdmFuY2Ugd2lkdGhzIG9mIHRoZSBjaGFyYWN0ZXJzLiBNdXN0Ci0gICAgICogICAgICAgIGJlIGF0IGxlYXN0IGEgbGFyZ2UgYXMgKGVuZCAtIHN0YXJ0KS4KLSAgICAgKiBAcGFyYW0gZm1pIEZvbnRNZXRyaWNzIGluZm9ybWF0aW9uOyBjYW4gYmUgbnVsbAotICAgICAqIEByZXR1cm4gdGhlIGFjdHVhbCBudW1iZXIgb2Ygd2lkdGhzIHJldHVybmVkCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0VGV4dFdpZHRocyhUZXh0UGFpbnQgcGFpbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXh0UGFpbnQgd29ya1BhaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3Bhbm5lZCB0ZXh0LCBpbnQgc3RhcnQsIGludCBlbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdFtdIHdpZHRocywgUGFpbnQuRm9udE1ldHJpY3NJbnQgZm1pKSB7Ci0gICAgICAgIE1ldHJpY0FmZmVjdGluZ1NwYW5bXSBzcGFucyA9Ci0gICAgICAgICAgICB0ZXh0LmdldFNwYW5zKHN0YXJ0LCBlbmQsIE1ldHJpY0FmZmVjdGluZ1NwYW4uY2xhc3MpOwotCi0JCVJlcGxhY2VtZW50U3BhbiByZXBsYWNlbWVudCA9IG51bGw7Ci0gICAgICAgIHdvcmtQYWludC5zZXQocGFpbnQpOwotCQkKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzcGFucy5sZW5ndGg7IGkrKykgewotCQkJTWV0cmljQWZmZWN0aW5nU3BhbiBzcGFuID0gc3BhbnNbaV07Ci0JCQlpZiAoc3BhbiBpbnN0YW5jZW9mIFJlcGxhY2VtZW50U3BhbikgewotCQkJCXJlcGxhY2VtZW50ID0gKFJlcGxhY2VtZW50U3BhbilzcGFuOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJc3Bhbi51cGRhdGVNZWFzdXJlU3RhdGUod29ya1BhaW50KTsKLQkJCX0KLQkJfQotCQotICAgICAgICBpZiAocmVwbGFjZW1lbnQgPT0gbnVsbCkgewotICAgICAgICAgICAgd29ya1BhaW50LmdldEZvbnRNZXRyaWNzSW50KGZtaSk7Ci0gICAgICAgICAgICB3b3JrUGFpbnQuZ2V0VGV4dFdpZHRocyh0ZXh0LCBzdGFydCwgZW5kLCB3aWR0aHMpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaW50IHdpZCA9IHJlcGxhY2VtZW50LmdldFNpemUod29ya1BhaW50LCB0ZXh0LCBzdGFydCwgZW5kLCBmbWkpOwotCi0gICAgICAgICAgICBpZiAoZW5kID4gc3RhcnQpIHsKLSAgICAgICAgICAgICAgICB3aWR0aHNbMF0gPSB3aWQ7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IHN0YXJ0ICsgMTsgaSA8IGVuZDsgaSsrKQotICAgICAgICAgICAgICAgICAgICB3aWR0aHNbaSAtIHN0YXJ0XSA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGVuZCAtIHN0YXJ0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlbmRlcnMgYW5kL29yIG1lYXN1cmVzIGEgZGlyZWN0aW9uYWwgcnVuIG9mIHRleHQgb24gYSBzaW5nbGUgbGluZS4KLSAgICAgKiBVbmxpa2Uge0BsaW5rICNkcmF3VW5pZm9ybVJ1bn0sIHRoaXMgY2FuIHJlbmRlciBydW5zIHRoYXQgY3Jvc3Mgc3R5bGUKLSAgICAgKiBib3VuZGFyaWVzLiAgUmV0dXJucyB0aGUgc2lnbmVkIGFkdmFuY2Ugd2lkdGgsIGlmIHJlcXVlc3RlZC4KLSAgICAgKgotICAgICAqIDxwPlRoZSB4IHBvc2l0aW9uIGlzIHRoZSBsZWFkaW5nIGVkZ2Ugb2YgdGhlIHRleHQuIEluIGEgcmlnaHQtdG8tbGVmdAotICAgICAqIHBhcmFncmFwaCwgdGhpcyB3aWxsIGJlIHRvIHRoZSByaWdodCBvZiB0aGUgdGV4dCB0byBiZSBkcmF3bi4gUGFpbnQKLSAgICAgKiBzaG91bGQgbm90IGhhdmUgYW4gQWxpZ24gdmFsdWUgb3RoZXIgdGhhbiBMRUZUIG9yIHBvc2l0aW9uaW5nIHdpbGwgZ2V0Ci0gICAgICogY29uZnVzZWQuCi0gICAgICoKLSAgICAgKiA8cD5UaGlzIG9wdGltaXplcyBmb3IgdW5zdHlsZWQgdGV4dCBhbmQgc28gd29ya1BhaW50IG1pZ2h0IG5vdCBiZQotICAgICAqIG1vZGlmaWVkIGJ5IHRoaXMgY2FsbC4KLSAgICAgKgotICAgICAqIDxwPlRoZSByZXR1cm5lZCBhZHZhbmNlIHdpZHRoIHdpbGwgYmUgPCAwIGlmIHRoZSBwYXJhZ3JhcGgKLSAgICAgKiBkaXJlY3Rpb24gaXMgcmlnaHQtdG8tbGVmdC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmbG9hdCBkcmF3RGlyZWN0aW9uYWxSdW4oQ2FudmFzIGNhbnZhcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJTZXF1ZW5jZSB0ZXh0LCBpbnQgc3RhcnQsIGludCBlbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGlyLCBib29sZWFuIHJ1bklzUnRsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeCwgaW50IHRvcCwgaW50IHksIGludCBib3R0b20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYWludC5Gb250TWV0cmljc0ludCBmbWksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXh0UGFpbnQgcGFpbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXh0UGFpbnQgd29ya1BhaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBuZWVkV2lkdGgpIHsKLQotICAgICAgICAvLyBYWFg6IEl0IGxvb2tzIGxpa2UgYWxsIGNhbGxzIHRvIHRoaXMgQVBJIG1hdGNoIGRpciBhbmQgcnVuSXNSdGwsIHNvCi0gICAgICAgIC8vIGhhdmluZyBib3RoIHBhcmFtZXRlcnMgaXMgcmVkdW5kYW50IGFuZCBjb25mdXNpbmcuCi0KLSAgICAgICAgLy8gZmFzdCBwYXRoIGZvciB1bnN0eWxlZCB0ZXh0Ci0gICAgICAgIGlmICghKHRleHQgaW5zdGFuY2VvZiBTcGFubmVkKSkgewotICAgICAgICAgICAgZmxvYXQgcmV0ID0gMDsKLQotICAgICAgICAgICAgaWYgKHJ1bklzUnRsKSB7Ci0gICAgICAgICAgICAgICAgQ2hhclNlcXVlbmNlIHRtcCA9IFRleHRVdGlscy5nZXRSZXZlcnNlKHRleHQsIHN0YXJ0LCBlbmQpOwotICAgICAgICAgICAgICAgIC8vIFhYWDogdGhpcyBhc3N1bWVzIGdldFJldmVyc2UgZG9lc24ndCB0d2VhayB0aGUgbGVuZ3RoIG9mCi0gICAgICAgICAgICAgICAgLy8gdGhlIHRleHQKLSAgICAgICAgICAgICAgICBpbnQgdG1wZW5kID0gZW5kIC0gc3RhcnQ7Ci0KLSAgICAgICAgICAgICAgICBpZiAoY2FudmFzICE9IG51bGwgfHwgbmVlZFdpZHRoKQotICAgICAgICAgICAgICAgICAgICByZXQgPSBwYWludC5tZWFzdXJlVGV4dCh0bXAsIDAsIHRtcGVuZCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoY2FudmFzICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIGNhbnZhcy5kcmF3VGV4dCh0bXAsIDAsIHRtcGVuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHggLSByZXQsIHksIHBhaW50KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKG5lZWRXaWR0aCkKLSAgICAgICAgICAgICAgICAgICAgcmV0ID0gcGFpbnQubWVhc3VyZVRleHQodGV4dCwgc3RhcnQsIGVuZCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoY2FudmFzICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIGNhbnZhcy5kcmF3VGV4dCh0ZXh0LCBzdGFydCwgZW5kLCB4LCB5LCBwYWludCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChmbWkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHBhaW50LmdldEZvbnRNZXRyaWNzSW50KGZtaSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiByZXQgKiBkaXI7ICAgLy8gTGF5b3V0LkRJUl9SSUdIVF9UT19MRUZUID09IC0xCi0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGZsb2F0IG94ID0geDsKLSAgICAgICAgaW50IG1pbkFzY2VudCA9IDAsIG1heERlc2NlbnQgPSAwLCBtaW5Ub3AgPSAwLCBtYXhCb3R0b20gPSAwOwotCi0gICAgICAgIFNwYW5uZWQgc3AgPSAoU3Bhbm5lZCkgdGV4dDsKLSAgICAgICAgQ2xhc3M8Pz4gZGl2aXNpb247Ci0KLSAgICAgICAgaWYgKGNhbnZhcyA9PSBudWxsKQotICAgICAgICAgICAgZGl2aXNpb24gPSBNZXRyaWNBZmZlY3RpbmdTcGFuLmNsYXNzOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBkaXZpc2lvbiA9IENoYXJhY3RlclN0eWxlLmNsYXNzOwotCi0gICAgICAgIGludCBuZXh0OwotICAgICAgICBmb3IgKGludCBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkgPSBuZXh0KSB7Ci0gICAgICAgICAgICBuZXh0ID0gc3AubmV4dFNwYW5UcmFuc2l0aW9uKGksIGVuZCwgZGl2aXNpb24pOwotCi0gICAgICAgICAgICAvLyBYWFg6IGlmIGRpciBhbmQgcnVuSXNSdGwgd2VyZSBub3QgdGhlIHNhbWUsIHRoaXMgd291bGQgZHJhdwotICAgICAgICAgICAgLy8gc3BhbnMgaW4gdGhlIHdyb25nIG9yZGVyLCBidXQgbm8gb25lIGFwcGVhcnMgdG8gY2FsbCBpdCB0aGlzCi0gICAgICAgICAgICAvLyB3YXkuCi0gICAgICAgICAgICB4ICs9IGRyYXdVbmlmb3JtUnVuKGNhbnZhcywgc3AsIGksIG5leHQsIGRpciwgcnVuSXNSdGwsCi0gICAgICAgICAgICAgICAgICB4LCB0b3AsIHksIGJvdHRvbSwgZm1pLCBwYWludCwgd29ya1BhaW50LAotICAgICAgICAgICAgICAgICAgbmVlZFdpZHRoIHx8IG5leHQgIT0gZW5kKTsKLQotICAgICAgICAgICAgaWYgKGZtaSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGZtaS5hc2NlbnQgPCBtaW5Bc2NlbnQpCi0gICAgICAgICAgICAgICAgICAgIG1pbkFzY2VudCA9IGZtaS5hc2NlbnQ7Ci0gICAgICAgICAgICAgICAgaWYgKGZtaS5kZXNjZW50ID4gbWF4RGVzY2VudCkKLSAgICAgICAgICAgICAgICAgICAgbWF4RGVzY2VudCA9IGZtaS5kZXNjZW50OwotCi0gICAgICAgICAgICAgICAgaWYgKGZtaS50b3AgPCBtaW5Ub3ApCi0gICAgICAgICAgICAgICAgICAgIG1pblRvcCA9IGZtaS50b3A7Ci0gICAgICAgICAgICAgICAgaWYgKGZtaS5ib3R0b20gPiBtYXhCb3R0b20pCi0gICAgICAgICAgICAgICAgICAgIG1heEJvdHRvbSA9IGZtaS5ib3R0b207Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZm1pICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChzdGFydCA9PSBlbmQpIHsKLSAgICAgICAgICAgICAgICBwYWludC5nZXRGb250TWV0cmljc0ludChmbWkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBmbWkuYXNjZW50ID0gbWluQXNjZW50OwotICAgICAgICAgICAgICAgIGZtaS5kZXNjZW50ID0gbWF4RGVzY2VudDsKLSAgICAgICAgICAgICAgICBmbWkudG9wID0gbWluVG9wOwotICAgICAgICAgICAgICAgIGZtaS5ib3R0b20gPSBtYXhCb3R0b207Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4geCAtIG94OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERyYXdzIGEgdW5pZGlyZWN0aW9uYWwgcnVuIG9mIHRleHQgb24gYSBzaW5nbGUgbGluZSwgYW5kIG9wdGlvbmFsbHkKLSAgICAgKiByZXR1cm5zIHRoZSBzaWduZWQgYWR2YW5jZS4gIFVubGlrZSBkcmF3RGlyZWN0aW9uYWxSdW4sIHRoZSBwYXJhZ3JhcGgKLSAgICAgKiBkaXJlY3Rpb24gYW5kIHJ1biBkaXJlY3Rpb24gY2FuIGJlIGRpZmZlcmVudC4KLSAgICAgKi8KLSAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBmbG9hdCBkcmF3VGV4dChDYW52YXMgY2FudmFzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhclNlcXVlbmNlIHRleHQsIGludCBzdGFydCwgaW50IGVuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkaXIsIGJvb2xlYW4gcnVuSXNSdGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB4LCBpbnQgdG9wLCBpbnQgeSwgaW50IGJvdHRvbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRleHRQYWludCBwYWludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRleHRQYWludCB3b3JrUGFpbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIG5lZWRXaWR0aCkgewotICAgICAgICAvLyBYWFggdGhpcyBsb2dpYyBpcyAoZGlyID09IERJUl9MRUZUX1RPX1JJR0hUKSA9PSBydW5Jc1J0bAotICAgICAgICBpZiAoKGRpciA9PSBMYXlvdXQuRElSX1JJR0hUX1RPX0xFRlQgJiYgIXJ1bklzUnRsKSB8fAotICAgICAgICAgICAgKHJ1bklzUnRsICYmIGRpciA9PSBMYXlvdXQuRElSX0xFRlRfVE9fUklHSFQpKSB7Ci0gICAgICAgICAgICAvLyBUT0RPOiB0aGlzIG5lZWRzIHRoZSByZWFsIGRpcmVjdGlvbgotICAgICAgICAgICAgZmxvYXQgY2ggPSBkcmF3RGlyZWN0aW9uYWxSdW4obnVsbCwgdGV4dCwgc3RhcnQsIGVuZCwKLSAgICAgICAgICAgICAgICAgICAgTGF5b3V0LkRJUl9MRUZUX1RPX1JJR0hULCBmYWxzZSwgMCwgMCwgMCwgMCwgbnVsbCwgcGFpbnQsCi0gICAgICAgICAgICAgICAgICAgIHdvcmtQYWludCwgdHJ1ZSk7Ci0KLSAgICAgICAgICAgIGNoICo9IGRpcjsgIC8vIERJUl9SSUdIVF9UT19MRUZUID09IC0xCi0gICAgICAgICAgICBkcmF3RGlyZWN0aW9uYWxSdW4oY2FudmFzLCB0ZXh0LCBzdGFydCwgZW5kLCAtZGlyLAotICAgICAgICAgICAgICAgICAgICBydW5Jc1J0bCwgeCArIGNoLCB0b3AsIHksIGJvdHRvbSwgbnVsbCwgcGFpbnQsCi0gICAgICAgICAgICAgICAgICAgIHdvcmtQYWludCwgdHJ1ZSk7Ci0KLSAgICAgICAgICAgIHJldHVybiBjaDsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBkcmF3RGlyZWN0aW9uYWxSdW4oY2FudmFzLCB0ZXh0LCBzdGFydCwgZW5kLCBkaXIsIHJ1bklzUnRsLAotICAgICAgICAgICAgICAgICAgICAgICB4LCB0b3AsIHksIGJvdHRvbSwgbnVsbCwgcGFpbnQsIHdvcmtQYWludCwKLSAgICAgICAgICAgICAgICAgICAgICAgbmVlZFdpZHRoKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogRHJhd3MgYSBydW4gb2YgdGV4dCBvbiBhIHNpbmdsZSBsaW5lLCB3aXRoIGl0cwotICAgICAqIG9yaWdpbiBhdCAoeCx5KSwgaW4gdGhlIHNwZWNpZmllZCBQYWludC4gVGhlIG9yaWdpbiBpcyBpbnRlcnByZXRlZCBiYXNlZAotICAgICAqIG9uIHRoZSBBbGlnbiBzZXR0aW5nIGluIHRoZSBQYWludC4KLSAgICAgKgotICAgICAqIFRoaXMgbWV0aG9kIGNvbnNpZGVycyBzdHlsZSBpbmZvcm1hdGlvbiBpbiB0aGUgdGV4dCAoZS5nLiBldmVuIHdoZW4gdGV4dAotICAgICAqIGlzIGFuIGluc3RhbmNlIG9mIHtAbGluayBhbmRyb2lkLnRleHQuU3Bhbm5lZH0sIHRoaXMgbWV0aG9kIGNvcnJlY3RseQotICAgICAqIGRyYXdzIHRoZSB0ZXh0KS4gU2VlIGFsc28KLSAgICAgKiB7QGxpbmsgYW5kcm9pZC5ncmFwaGljcy5DYW52YXMjZHJhd1RleHQoQ2hhclNlcXVlbmNlLCBpbnQsIGludCwgZmxvYXQsCi0gICAgICogZmxvYXQsIFBhaW50KX0gYW5kCi0gICAgICoge0BsaW5rIGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzI2RyYXdSZWN0KGZsb2F0LCBmbG9hdCwgZmxvYXQsIGZsb2F0LAotICAgICAqIFBhaW50KX0uCi0gICAgICogCi0gICAgICogQHBhcmFtIGNhbnZhcyBUaGUgdGFyZ2V0IGNhbnZhcwotICAgICAqIEBwYXJhbSB0ZXh0IFRoZSB0ZXh0IHRvIGJlIGRyYXduCi0gICAgICogQHBhcmFtIHN0YXJ0IFRoZSBpbmRleCBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyIGluIHRleHQgdG8gZHJhdwotICAgICAqIEBwYXJhbSBlbmQgKGVuZCAtIDEpIGlzIHRoZSBpbmRleCBvZiB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGV4dCB0byBkcmF3Ci0gICAgICogQHBhcmFtIGRpcmVjdGlvbiBUaGUgZGlyZWN0aW9uIG9mIHRoZSB0ZXh0LiBUaGlzIG11c3QgYmUKLSAgICAgKiAgICAgICAge0BsaW5rIGFuZHJvaWQudGV4dC5MYXlvdXQjRElSX0xFRlRfVE9fUklHSFR9IG9yCi0gICAgICogICAgICAgIHtAbGluayBhbmRyb2lkLnRleHQuTGF5b3V0I0RJUl9SSUdIVF9UT19MRUZUfS4KLSAgICAgKiBAcGFyYW0geCBUaGUgeC1jb29yZGluYXRlIG9mIG9yaWdpbiBmb3Igd2hlcmUgdG8gZHJhdyB0aGUgdGV4dAotICAgICAqIEBwYXJhbSB0b3AgVGhlIHRvcCBzaWRlIG9mIHRoZSByZWN0YW5nbGUgdG8gYmUgZHJhd24KLSAgICAgKiBAcGFyYW0geSBUaGUgeS1jb29yZGluYXRlIG9mIG9yaWdpbiBmb3Igd2hlcmUgdG8gZHJhdyB0aGUgdGV4dAotICAgICAqIEBwYXJhbSBib3R0b20gVGhlIGJvdHRvbSBzaWRlIG9mIHRoZSByZWN0YW5nbGUgdG8gYmUgZHJhd24KLSAgICAgKiBAcGFyYW0gcGFpbnQgVGhlIG1haW4ge0BsaW5rIFRleHRQYWludH0gb2JqZWN0LgotICAgICAqIEBwYXJhbSB3b3JrUGFpbnQgVGhlIHtAbGluayBUZXh0UGFpbnR9IG9iamVjdCB1c2VkIGZvciB0ZW1wb3JhbAotICAgICAqICAgICAgICB3b3Jrc3BhY2UuCi0gICAgICogQHBhcmFtIG5lZWRXaWR0aCBJZiB0cnVlLCB0aGlzIG1ldGhvZCByZXR1cm5zIHRoZSB3aWR0aCBvZiBkcmF3biB0ZXh0Ci0gICAgICogQHJldHVybiBXaWR0aCBvZiB0aGUgZHJhd24gdGV4dCBpZiBuZWVkV2lkdGggaXMgdHJ1ZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmxvYXQgZHJhd1RleHQoQ2FudmFzIGNhbnZhcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJTZXF1ZW5jZSB0ZXh0LCBpbnQgc3RhcnQsIGludCBlbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGlyZWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeCwgaW50IHRvcCwgaW50IHksIGludCBib3R0b20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXh0UGFpbnQgcGFpbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXh0UGFpbnQgd29ya1BhaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBuZWVkV2lkdGgpIHsKLSAgICAgICAgLy8gRm9yIHNhZmV0eS4KLSAgICAgICAgZGlyZWN0aW9uID0gZGlyZWN0aW9uID49IDAgPyBMYXlvdXQuRElSX0xFRlRfVE9fUklHSFQKLSAgICAgICAgICAgICAgICA6IExheW91dC5ESVJfUklHSFRfVE9fTEVGVDsKLQotICAgICAgICAvLyBIaWRlIHJ1bklzUnRsIHBhcmFtZXRlciBzaW5jZSBpdCBpcyBtZWFuaW5nbGVzcyBmb3IgZXh0ZXJuYWwKLSAgICAgICAgLy8gZGV2ZWxvcGVycy4KLSAgICAgICAgLy8gWFhYOiB0aGUgcnVuSXNSdGwgcHJvYmFibHkgb3VnaHQgdG8gYmUgdGhlIHNhbWUgYXMgZGlyZWN0aW9uLCB0aGVuCi0gICAgICAgIC8vIHRoaXMgY291bGQgZHJhdyBydGwgdGV4dC4KLSAgICAgICAgcmV0dXJuIGRyYXdUZXh0KGNhbnZhcywgdGV4dCwgc3RhcnQsIGVuZCwgZGlyZWN0aW9uLCBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHgsIHRvcCwgeSwgYm90dG9tLCBwYWludCwgd29ya1BhaW50LCBuZWVkV2lkdGgpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB3aWR0aCBvZiBhIHJ1biBvZiBsZWZ0LXRvLXJpZ2h0IHRleHQgb24gYSBzaW5nbGUgbGluZSwKLSAgICAgKiBjb25zaWRlcmluZyBzdHlsZSBpbmZvcm1hdGlvbiBpbiB0aGUgdGV4dCAoZS5nLiBldmVuIHdoZW4gdGV4dCBpcyBhbgotICAgICAqIGluc3RhbmNlIG9mIHtAbGluayBhbmRyb2lkLnRleHQuU3Bhbm5lZH0sIHRoaXMgbWV0aG9kIGNvcnJlY3RseSBtZWFzdXJlcwotICAgICAqIHRoZSB3aWR0aCBvZiB0aGUgdGV4dCkuCi0gICAgICogCi0gICAgICogQHBhcmFtIHBhaW50IHRoZSBtYWluIHtAbGluayBUZXh0UGFpbnR9IG9iamVjdDsgd2lsbCBub3QgYmUgbW9kaWZpZWQKLSAgICAgKiBAcGFyYW0gd29ya1BhaW50IHRoZSB7QGxpbmsgVGV4dFBhaW50fSBvYmplY3QgYXZhaWxhYmxlIGZvciBtb2RpZmljYXRpb247Ci0gICAgICogICAgICAgIHdpbGwgbm90IG5lY2Vzc2FyaWx5IGJlIHVzZWQKLSAgICAgKiBAcGFyYW0gdGV4dCB0aGUgdGV4dCB0byBtZWFzdXJlCi0gICAgICogQHBhcmFtIHN0YXJ0IHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyIHRvIHN0YXJ0IG1lYXN1cmluZwotICAgICAqIEBwYXJhbSBlbmQgMSBiZXlvbmQgdGhlIGluZGV4IG9mIHRoZSBsYXN0IGNoYXJhY3RlciB0byBtZWFzdXJlCi0gICAgICogQHBhcmFtIGZtaSBGb250TWV0cmljcyBpbmZvcm1hdGlvbjsgY2FuIGJlIG51bGwKLSAgICAgKiBAcmV0dXJuIFRoZSB3aWR0aCBvZiB0aGUgdGV4dAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmxvYXQgbWVhc3VyZVRleHQoVGV4dFBhaW50IHBhaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGV4dFBhaW50IHdvcmtQYWludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJTZXF1ZW5jZSB0ZXh0LCBpbnQgc3RhcnQsIGludCBlbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYWludC5Gb250TWV0cmljc0ludCBmbWkpIHsKLSAgICAgICAgcmV0dXJuIGRyYXdEaXJlY3Rpb25hbFJ1bihudWxsLCB0ZXh0LCBzdGFydCwgZW5kLAotICAgICAgICAgICAgICAgICAgICAgICBMYXlvdXQuRElSX0xFRlRfVE9fUklHSFQsIGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAwLCAwLCBmbWksIHBhaW50LCB3b3JrUGFpbnQsIHRydWUpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvVGV4dExpbmUuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvVGV4dExpbmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zM2M5NTU0Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9UZXh0TGluZS5qYXZhCkBAIC0wLDAgKzEsOTQwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnRleHQ7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC51dGlsLkFycmF5VXRpbHM7CisKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdEY7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludC5Gb250TWV0cmljc0ludDsKK2ltcG9ydCBhbmRyb2lkLnRleHQuTGF5b3V0LkRpcmVjdGlvbnM7CitpbXBvcnQgYW5kcm9pZC50ZXh0LkxheW91dC5UYWJTdG9wczsKK2ltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuQ2hhcmFjdGVyU3R5bGU7CitpbXBvcnQgYW5kcm9pZC50ZXh0LnN0eWxlLk1ldHJpY0FmZmVjdGluZ1NwYW47CitpbXBvcnQgYW5kcm9pZC50ZXh0LnN0eWxlLlJlcGxhY2VtZW50U3BhbjsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCisvKioKKyAqIFJlcHJlc2VudHMgYSBsaW5lIG9mIHN0eWxlZCB0ZXh0LCBmb3IgbWVhc3VyaW5nIGluIHZpc3VhbCBvcmRlciBhbmQKKyAqIGZvciByZW5kZXJpbmcuCisgKgorICogPHA+R2V0IGEgbmV3IGluc3RhbmNlIHVzaW5nIG9idGFpbigpLCBhbmQgd2hlbiBmaW5pc2hlZCB3aXRoIGl0LCByZXR1cm4gaXQKKyAqIHRvIHRoZSBwb29sIHVzaW5nIHJlY3ljbGUoKS4KKyAqCisgKiA8cD5DYWxsIHNldCB0byBwcmVwYXJlIHRoZSBpbnN0YW5jZSBmb3IgdXNlLCB0aGVuIGVpdGhlciBkcmF3LCBtZWFzdXJlLAorICogbWV0cmljcywgb3IgY2FyZXRUb0xlZnRSaWdodE9mLgorICoKKyAqIEBoaWRlCisgKi8KK2NsYXNzIFRleHRMaW5lIHsKKyAgICBwcml2YXRlIFRleHRQYWludCBtUGFpbnQ7CisgICAgcHJpdmF0ZSBDaGFyU2VxdWVuY2UgbVRleHQ7CisgICAgcHJpdmF0ZSBpbnQgbVN0YXJ0OworICAgIHByaXZhdGUgaW50IG1MZW47CisgICAgcHJpdmF0ZSBpbnQgbURpcjsKKyAgICBwcml2YXRlIERpcmVjdGlvbnMgbURpcmVjdGlvbnM7CisgICAgcHJpdmF0ZSBib29sZWFuIG1IYXNUYWJzOworICAgIHByaXZhdGUgVGFiU3RvcHMgbVRhYnM7CisgICAgcHJpdmF0ZSBjaGFyW10gbUNoYXJzOworICAgIHByaXZhdGUgYm9vbGVhbiBtQ2hhcnNWYWxpZDsKKyAgICBwcml2YXRlIFNwYW5uZWQgbVNwYW5uZWQ7CisgICAgcHJpdmF0ZSBmaW5hbCBUZXh0UGFpbnQgbVdvcmtQYWludCA9IG5ldyBUZXh0UGFpbnQoKTsKKworICAgIHByaXZhdGUgc3RhdGljIFRleHRMaW5lW10gY2FjaGVkID0gbmV3IFRleHRMaW5lWzNdOworCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIG5ldyBUZXh0TGluZSBmcm9tIHRoZSBzaGFyZWQgcG9vbC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYW4gdW5pbml0aWFsaXplZCBUZXh0TGluZQorICAgICAqLworICAgIHN0YXRpYyBUZXh0TGluZSBvYnRhaW4oKSB7CisgICAgICAgIFRleHRMaW5lIHRsOworICAgICAgICBzeW5jaHJvbml6ZWQgKGNhY2hlZCkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IGNhY2hlZC5sZW5ndGg7IC0taSA+PSAwOykgeworICAgICAgICAgICAgICAgIGlmIChjYWNoZWRbaV0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB0bCA9IGNhY2hlZFtpXTsKKyAgICAgICAgICAgICAgICAgICAgY2FjaGVkW2ldID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB0bCA9IG5ldyBUZXh0TGluZSgpOworICAgICAgICBMb2cuZSgiVExJTkUiLCAibmV3OiAiICsgdGwpOworICAgICAgICByZXR1cm4gdGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHV0cyBhIFRleHRMaW5lIGJhY2sgaW50byB0aGUgc2hhcmVkIHBvb2wuIERvIG5vdCB1c2UgdGhpcyBUZXh0TGluZSBvbmNlCisgICAgICogaXQgaGFzIGJlZW4gcmV0dXJuZWQuCisgICAgICogQHBhcmFtIHRsIHRoZSB0ZXh0TGluZQorICAgICAqIEByZXR1cm4gbnVsbCwgYXMgYSBjb252ZW5pZW5jZSBmcm9tIGNsZWFyaW5nIHJlZmVyZW5jZXMgdG8gdGhlIHByb3ZpZGVkCisgICAgICogVGV4dExpbmUKKyAgICAgKi8KKyAgICBzdGF0aWMgVGV4dExpbmUgcmVjeWNsZShUZXh0TGluZSB0bCkgeworICAgICAgICB0bC5tVGV4dCA9IG51bGw7CisgICAgICAgIHRsLm1QYWludCA9IG51bGw7CisgICAgICAgIHRsLm1EaXJlY3Rpb25zID0gbnVsbDsKKyAgICAgICAgaWYgKHRsLm1MZW4gPCAyNTApIHsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZChjYWNoZWQpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNhY2hlZC5sZW5ndGg7ICsraSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoY2FjaGVkW2ldID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlZFtpXSA9IHRsOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5pdGlhbGl6ZXMgYSBUZXh0TGluZSBhbmQgcHJlcGFyZXMgaXQgZm9yIHVzZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYWludCB0aGUgYmFzZSBwYWludCBmb3IgdGhlIGxpbmUKKyAgICAgKiBAcGFyYW0gdGV4dCB0aGUgdGV4dCwgY2FuIGJlIFN0eWxlZAorICAgICAqIEBwYXJhbSBzdGFydCB0aGUgc3RhcnQgb2YgdGhlIGxpbmUgcmVsYXRpdmUgdG8gdGhlIHRleHQKKyAgICAgKiBAcGFyYW0gbGltaXQgdGhlIGxpbWl0IG9mIHRoZSBsaW5lIHJlbGF0aXZlIHRvIHRoZSB0ZXh0CisgICAgICogQHBhcmFtIGRpciB0aGUgcGFyYWdyYXBoIGRpcmVjdGlvbiBvZiB0aGlzIGxpbmUKKyAgICAgKiBAcGFyYW0gZGlyZWN0aW9ucyB0aGUgZGlyZWN0aW9ucyBpbmZvcm1hdGlvbiBvZiB0aGlzIGxpbmUKKyAgICAgKiBAcGFyYW0gaGFzVGFicyB0cnVlIGlmIHRoZSBsaW5lIG1pZ2h0IGNvbnRhaW4gdGFicyBvciBlbW9qaQorICAgICAqIEBwYXJhbSB0YWJTdG9wcyB0aGUgdGFiU3RvcHMuIENhbiBiZSBudWxsLgorICAgICAqLworICAgIHZvaWQgc2V0KFRleHRQYWludCBwYWludCwgQ2hhclNlcXVlbmNlIHRleHQsIGludCBzdGFydCwgaW50IGxpbWl0LCBpbnQgZGlyLAorICAgICAgICAgICAgRGlyZWN0aW9ucyBkaXJlY3Rpb25zLCBib29sZWFuIGhhc1RhYnMsIFRhYlN0b3BzIHRhYlN0b3BzKSB7CisgICAgICAgIG1QYWludCA9IHBhaW50OworICAgICAgICBtVGV4dCA9IHRleHQ7CisgICAgICAgIG1TdGFydCA9IHN0YXJ0OworICAgICAgICBtTGVuID0gbGltaXQgLSBzdGFydDsKKyAgICAgICAgbURpciA9IGRpcjsKKyAgICAgICAgbURpcmVjdGlvbnMgPSBkaXJlY3Rpb25zOworICAgICAgICBtSGFzVGFicyA9IGhhc1RhYnM7CisgICAgICAgIG1TcGFubmVkID0gbnVsbDsKKworICAgICAgICBib29sZWFuIGhhc1JlcGxhY2VtZW50ID0gZmFsc2U7CisgICAgICAgIGlmICh0ZXh0IGluc3RhbmNlb2YgU3Bhbm5lZCkgeworICAgICAgICAgICAgbVNwYW5uZWQgPSAoU3Bhbm5lZCkgdGV4dDsKKyAgICAgICAgICAgIGhhc1JlcGxhY2VtZW50ID0gbVNwYW5uZWQuZ2V0U3BhbnMoc3RhcnQsIGxpbWl0LAorICAgICAgICAgICAgICAgICAgICBSZXBsYWNlbWVudFNwYW4uY2xhc3MpLmxlbmd0aCA+IDA7CisgICAgICAgIH0KKworICAgICAgICBtQ2hhcnNWYWxpZCA9IGhhc1JlcGxhY2VtZW50IHx8IGhhc1RhYnMgfHwKKyAgICAgICAgICAgIGRpcmVjdGlvbnMgIT0gTGF5b3V0LkRJUlNfQUxMX0xFRlRfVE9fUklHSFQ7CisKKyAgICAgICAgaWYgKG1DaGFyc1ZhbGlkKSB7CisgICAgICAgICAgICBpZiAobUNoYXJzID09IG51bGwgfHwgbUNoYXJzLmxlbmd0aCA8IG1MZW4pIHsKKyAgICAgICAgICAgICAgICBtQ2hhcnMgPSBuZXcgY2hhcltBcnJheVV0aWxzLmlkZWFsQ2hhckFycmF5U2l6ZShtTGVuKV07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBUZXh0VXRpbHMuZ2V0Q2hhcnModGV4dCwgc3RhcnQsIGxpbWl0LCBtQ2hhcnMsIDApOworICAgICAgICAgICAgaWYgKGhhc1JlcGxhY2VtZW50KSB7CisgICAgICAgICAgICAgICAgLy8gSGFuZGxlIHRoZXNlIGFsbCBhdCBvbmNlIHNvIHdlIGRvbid0IGhhdmUgdG8gZG8gaXQgYXMgd2UgZ28uCisgICAgICAgICAgICAgICAgLy8gUmVwbGFjZSB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIGVhY2ggcmVwbGFjZW1lbnQgcnVuIHdpdGggdGhlCisgICAgICAgICAgICAgICAgLy8gb2JqZWN0LXJlcGxhY2VtZW50IGNoYXJhY3RlciBhbmQgdGhlIHJlbWFpbmRlciB3aXRoIHplcm8gd2lkdGgKKyAgICAgICAgICAgICAgICAvLyBub24tYnJlYWsgc3BhY2UgYWthIEJPTS4gIEN1cnNvciBtb3ZlbWVudCBjb2RlIHNraXBzIHRoZXNlCisgICAgICAgICAgICAgICAgLy8gemVyby13aWR0aCBjaGFyYWN0ZXJzLgorICAgICAgICAgICAgICAgIGNoYXJbXSBjaGFycyA9IG1DaGFyczsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gc3RhcnQsIGluZXh0OyBpIDwgbGltaXQ7IGkgPSBpbmV4dCkgeworICAgICAgICAgICAgICAgICAgICBpbmV4dCA9IG1TcGFubmVkLm5leHRTcGFuVHJhbnNpdGlvbihpLCBsaW1pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXBsYWNlbWVudFNwYW4uY2xhc3MpOworICAgICAgICAgICAgICAgICAgICBpZiAobVNwYW5uZWQuZ2V0U3BhbnMoaSwgaW5leHQsIFJlcGxhY2VtZW50U3Bhbi5jbGFzcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAubGVuZ3RoID4gMCkgeyAvLyB0cmFuc2l0aW9uIGludG8gYSBzcGFuCisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyc1tpIC0gc3RhcnRdID0gJ1x1ZmZmYyc7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gaSAtIHN0YXJ0ICsgMSwgZSA9IGluZXh0IC0gc3RhcnQ7IGogPCBlOyArK2opIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyc1tqXSA9ICdcdWZlZmYnOyAvLyB1c2VkIGFzIFpXTkJTLCBtYXJrcyBwb3NpdGlvbnMgdG8gc2tpcAorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1UYWJzID0gdGFiU3RvcHM7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVuZGVycyB0aGUgVGV4dExpbmUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYyB0aGUgY2FudmFzIHRvIHJlbmRlciBvbgorICAgICAqIEBwYXJhbSB4IHRoZSBsZWFkaW5nIG1hcmdpbiBwb3NpdGlvbgorICAgICAqIEBwYXJhbSB0b3AgdGhlIHRvcCBvZiB0aGUgbGluZQorICAgICAqIEBwYXJhbSB5IHRoZSBiYXNlbGluZQorICAgICAqIEBwYXJhbSBib3R0b20gdGhlIGJvdHRvbSBvZiB0aGUgbGluZQorICAgICAqLworICAgIHZvaWQgZHJhdyhDYW52YXMgYywgZmxvYXQgeCwgaW50IHRvcCwgaW50IHksIGludCBib3R0b20pIHsKKyAgICAgICAgaWYgKCFtSGFzVGFicykgeworICAgICAgICAgICAgaWYgKG1EaXJlY3Rpb25zID09IExheW91dC5ESVJTX0FMTF9MRUZUX1RPX1JJR0hUKSB7CisgICAgICAgICAgICAgICAgZHJhd1J1bihjLCAwLCAwLCBtTGVuLCBmYWxzZSwgeCwgdG9wLCB5LCBib3R0b20sIGZhbHNlKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobURpcmVjdGlvbnMgPT0gTGF5b3V0LkRJUlNfQUxMX1JJR0hUX1RPX0xFRlQpIHsKKyAgICAgICAgICAgICAgICBkcmF3UnVuKGMsIDAsIDAsIG1MZW4sIHRydWUsIHgsIHRvcCwgeSwgYm90dG9tLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZmxvYXQgaCA9IDA7CisgICAgICAgIGludFtdIHJ1bnMgPSBtRGlyZWN0aW9ucy5tRGlyZWN0aW9uczsKKyAgICAgICAgUmVjdEYgZW1vamlSZWN0ID0gbnVsbDsKKworICAgICAgICBpbnQgbGFzdFJ1bkluZGV4ID0gcnVucy5sZW5ndGggLSAyOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJ1bnMubGVuZ3RoOyBpICs9IDIpIHsKKyAgICAgICAgICAgIGludCBydW5TdGFydCA9IHJ1bnNbaV07CisgICAgICAgICAgICBpbnQgcnVuTGltaXQgPSBydW5TdGFydCArIChydW5zW2krMV0gJiBMYXlvdXQuUlVOX0xFTkdUSF9NQVNLKTsKKyAgICAgICAgICAgIGlmIChydW5MaW1pdCA+IG1MZW4pIHsKKyAgICAgICAgICAgICAgICBydW5MaW1pdCA9IG1MZW47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBib29sZWFuIHJ1bklzUnRsID0gKHJ1bnNbaSsxXSAmIExheW91dC5SVU5fUlRMX0ZMQUcpICE9IDA7CisKKyAgICAgICAgICAgIGludCBzZWdzdGFydCA9IHJ1blN0YXJ0OworICAgICAgICAgICAgY2hhcltdIGNoYXJzID0gbUNoYXJzOworICAgICAgICAgICAgZm9yIChpbnQgaiA9IG1IYXNUYWJzID8gcnVuU3RhcnQgOiBydW5MaW1pdDsgaiA8PSBydW5MaW1pdDsgaisrKSB7CisgICAgICAgICAgICAgICAgaW50IGNvZGVwdCA9IDA7CisgICAgICAgICAgICAgICAgQml0bWFwIGJtID0gbnVsbDsKKworICAgICAgICAgICAgICAgIGlmIChtSGFzVGFicyAmJiBqIDwgcnVuTGltaXQpIHsKKyAgICAgICAgICAgICAgICAgICAgY29kZXB0ID0gbUNoYXJzW2pdOworICAgICAgICAgICAgICAgICAgICBpZiAoY29kZXB0ID49IDB4ZDgwMCAmJiBjb2RlcHQgPCAweGRjMDAgJiYgaiArIDEgPCBydW5MaW1pdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgY29kZXB0ID0gQ2hhcmFjdGVyLmNvZGVQb2ludEF0KG1DaGFycywgaik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZXB0ID49IExheW91dC5NSU5fRU1PSkkgJiYgY29kZXB0IDw9IExheW91dC5NQVhfRU1PSkkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBibSA9IExheW91dC5FTU9KSV9GQUNUT1JZLmdldEJpdG1hcEZyb21BbmRyb2lkUHVhKGNvZGVwdCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNvZGVwdCA+IDB4ZmZmZikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICsrajsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChqID09IHJ1bkxpbWl0IHx8IGNvZGVwdCA9PSAnXHQnIHx8IGJtICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgaCArPSBkcmF3UnVuKGMsIGksIHNlZ3N0YXJ0LCBqLCBydW5Jc1J0bCwgeCtoLCB0b3AsIHksIGJvdHRvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpICE9IGxhc3RSdW5JbmRleCB8fCBqICE9IG1MZW4pOworCisgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlcHQgPT0gJ1x0JykgeworICAgICAgICAgICAgICAgICAgICAgICAgaCA9IG1EaXIgKiBuZXh0VGFiKGggKiBtRGlyKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChibSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBibUFzY2VudCA9IGFzY2VudChqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGJpdG1hcEhlaWdodCA9IGJtLmdldEhlaWdodCgpOworICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgc2NhbGUgPSAtYm1Bc2NlbnQgLyBiaXRtYXBIZWlnaHQ7CisgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB3aWR0aCA9IGJtLmdldFdpZHRoKCkgKiBzY2FsZTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVtb2ppUmVjdCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1vamlSZWN0ID0gbmV3IFJlY3RGKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbW9qaVJlY3Quc2V0KHggKyBoLCB5ICsgYm1Bc2NlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHggKyBoICsgd2lkdGgsIHkpOworICAgICAgICAgICAgICAgICAgICAgICAgYy5kcmF3Qml0bWFwKGJtLCBudWxsLCBlbW9qaVJlY3QsIG1QYWludCk7CisgICAgICAgICAgICAgICAgICAgICAgICBoICs9IHdpZHRoOworICAgICAgICAgICAgICAgICAgICAgICAgaisrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHNlZ3N0YXJ0ID0gaiArIDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBtZXRyaWNzIGluZm9ybWF0aW9uIGZvciB0aGUgZW50aXJlIGxpbmUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZm1pIHJlY2VpdmVzIGZvbnQgbWV0cmljcyBpbmZvcm1hdGlvbiwgY2FuIGJlIG51bGwKKyAgICAgKiBAcmV0dXJuIHRoZSBzaWduZWQgd2lkdGggb2YgdGhlIGxpbmUKKyAgICAgKi8KKyAgICBmbG9hdCBtZXRyaWNzKEZvbnRNZXRyaWNzSW50IGZtaSkgeworICAgICAgICByZXR1cm4gbWVhc3VyZShtTGVuLCBmYWxzZSwgZm1pKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGluZm9ybWF0aW9uIGFib3V0IGEgcG9zaXRpb24gb24gdGhlIGxpbmUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gb2Zmc2V0IHRoZSBsaW5lLXJlbGF0aXZlIGNoYXJhY3RlciBvZmZzZXQsIGJldHdlZW4gMCBhbmQgdGhlCisgICAgICogbGluZSBsZW5ndGgsIGluY2x1c2l2ZQorICAgICAqIEBwYXJhbSB0cmFpbGluZyB0cnVlIHRvIG1lYXN1cmUgdGhlIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIGNoYXJhY3RlcgorICAgICAqIGJlZm9yZSBvZmZzZXQsIGZhbHNlIHRvIG1lYXN1cmUgdGhlIGxlYWRpbmcgZWRnZSBvZiB0aGUgY2hhcmFjdGVyCisgICAgICogYXQgb2Zmc2V0LgorICAgICAqIEBwYXJhbSBmbWkgcmVjZWl2ZXMgbWV0cmljcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcmVxdWVzdGVkCisgICAgICogY2hhcmFjdGVyLCBjYW4gYmUgbnVsbC4KKyAgICAgKiBAcmV0dXJuIHRoZSBzaWduZWQgb2Zmc2V0IGZyb20gdGhlIGxlYWRpbmcgbWFyZ2luIHRvIHRoZSByZXF1ZXN0ZWQKKyAgICAgKiBjaGFyYWN0ZXIgZWRnZS4KKyAgICAgKi8KKyAgICBmbG9hdCBtZWFzdXJlKGludCBvZmZzZXQsIGJvb2xlYW4gdHJhaWxpbmcsIEZvbnRNZXRyaWNzSW50IGZtaSkgeworICAgICAgICBpbnQgdGFyZ2V0ID0gdHJhaWxpbmcgPyBvZmZzZXQgLSAxIDogb2Zmc2V0OworICAgICAgICBpZiAodGFyZ2V0IDwgMCkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworICAgICAgICBmbG9hdCBoID0gMDsKKworICAgICAgICBpZiAoIW1IYXNUYWJzKSB7CisgICAgICAgICAgICBpZiAobURpcmVjdGlvbnMgPT0gTGF5b3V0LkRJUlNfQUxMX0xFRlRfVE9fUklHSFQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbWVhc3VyZVJ1bigwLCAwLCBvZmZzZXQsIG1MZW4sIGZhbHNlLCBmbWkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1EaXJlY3Rpb25zID09IExheW91dC5ESVJTX0FMTF9SSUdIVF9UT19MRUZUKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1lYXN1cmVSdW4oMCwgMCwgb2Zmc2V0LCBtTGVuLCB0cnVlLCBmbWkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgY2hhcltdIGNoYXJzID0gbUNoYXJzOworICAgICAgICBpbnRbXSBydW5zID0gbURpcmVjdGlvbnMubURpcmVjdGlvbnM7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcnVucy5sZW5ndGg7IGkgKz0gMikgeworICAgICAgICAgICAgaW50IHJ1blN0YXJ0ID0gcnVuc1tpXTsKKyAgICAgICAgICAgIGludCBydW5MaW1pdCA9IHJ1blN0YXJ0ICsgKHJ1bnNbaSsxXSAmIExheW91dC5SVU5fTEVOR1RIX01BU0spOworICAgICAgICAgICAgaWYgKHJ1bkxpbWl0ID4gbUxlbikgeworICAgICAgICAgICAgICAgIHJ1bkxpbWl0ID0gbUxlbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJvb2xlYW4gcnVuSXNSdGwgPSAocnVuc1tpKzFdICYgTGF5b3V0LlJVTl9SVExfRkxBRykgIT0gMDsKKworICAgICAgICAgICAgaW50IHNlZ3N0YXJ0ID0gcnVuU3RhcnQ7CisgICAgICAgICAgICBmb3IgKGludCBqID0gbUhhc1RhYnMgPyBydW5TdGFydCA6IHJ1bkxpbWl0OyBqIDw9IHJ1bkxpbWl0OyBqKyspIHsKKyAgICAgICAgICAgICAgICBpbnQgY29kZXB0ID0gMDsKKyAgICAgICAgICAgICAgICBCaXRtYXAgYm0gPSBudWxsOworCisgICAgICAgICAgICAgICAgaWYgKG1IYXNUYWJzICYmIGogPCBydW5MaW1pdCkgeworICAgICAgICAgICAgICAgICAgICBjb2RlcHQgPSBjaGFyc1tqXTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGVwdCA+PSAweGQ4MDAgJiYgY29kZXB0IDwgMHhkYzAwICYmIGogKyAxIDwgcnVuTGltaXQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVwdCA9IENoYXJhY3Rlci5jb2RlUG9pbnRBdChjaGFycywgaik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZXB0ID49IExheW91dC5NSU5fRU1PSkkgJiYgY29kZXB0IDw9IExheW91dC5NQVhfRU1PSkkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBibSA9IExheW91dC5FTU9KSV9GQUNUT1JZLmdldEJpdG1hcEZyb21BbmRyb2lkUHVhKGNvZGVwdCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNvZGVwdCA+IDB4ZmZmZikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICsrajsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChqID09IHJ1bkxpbWl0IHx8IGNvZGVwdCA9PSAnXHQnIHx8IGJtICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpblNlZ21lbnQgPSB0YXJnZXQgPj0gc2Vnc3RhcnQgJiYgdGFyZ2V0IDwgajsKKworICAgICAgICAgICAgICAgICAgICBib29sZWFuIGFkdmFuY2UgPSAobURpciA9PSBMYXlvdXQuRElSX1JJR0hUX1RPX0xFRlQpID09IHJ1bklzUnRsOworICAgICAgICAgICAgICAgICAgICBpZiAoaW5TZWdtZW50ICYmIGFkdmFuY2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBoICs9IG1lYXN1cmVSdW4oaSwgc2Vnc3RhcnQsIG9mZnNldCwgaiwgcnVuSXNSdGwsIGZtaSk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBmbG9hdCB3ID0gbWVhc3VyZVJ1bihpLCBzZWdzdGFydCwgaiwgaiwgcnVuSXNSdGwsIGZtaSk7CisgICAgICAgICAgICAgICAgICAgIGggKz0gYWR2YW5jZSA/IHcgOiAtdzsKKworICAgICAgICAgICAgICAgICAgICBpZiAoaW5TZWdtZW50KSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaCArPSBtZWFzdXJlUnVuKGksIHNlZ3N0YXJ0LCBvZmZzZXQsIGosIHJ1bklzUnRsLCBudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlcHQgPT0gJ1x0JykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9mZnNldCA9PSBqKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGg7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBoID0gbURpciAqIG5leHRUYWIoaCAqIG1EaXIpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRhcmdldCA9PSBqKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGg7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAoYm0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYm1Bc2NlbnQgPSBhc2NlbnQoaik7CisgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB3aWQgPSBibS5nZXRXaWR0aCgpICogLWJtQXNjZW50IC8gYm0uZ2V0SGVpZ2h0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBoICs9IG1EaXIgKiB3aWQ7CisgICAgICAgICAgICAgICAgICAgICAgICBqKys7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBzZWdzdGFydCA9IGogKyAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBoOworICAgIH0KKworICAgIC8qKgorICAgICAqIERyYXdzIGEgdW5pZGlyZWN0aW9uYWwgKGJ1dCBwb3NzaWJseSBtdWx0aS1zdHlsZWQpIHJ1biBvZiB0ZXh0LgorICAgICAqCisgICAgICogQHBhcmFtIGMgdGhlIGNhbnZhcyB0byBkcmF3IG9uCisgICAgICogQHBhcmFtIHJ1bkluZGV4IHRoZSBpbmRleCBvZiB0aGlzIGRpcmVjdGlvbmFsIHJ1bgorICAgICAqIEBwYXJhbSBzdGFydCB0aGUgbGluZS1yZWxhdGl2ZSBzdGFydAorICAgICAqIEBwYXJhbSBsaW1pdCB0aGUgbGluZS1yZWxhdGl2ZSBsaW1pdAorICAgICAqIEBwYXJhbSBydW5Jc1J0bCB0cnVlIGlmIHRoZSBydW4gaXMgcmlnaHQtdG8tbGVmdAorICAgICAqIEBwYXJhbSB4IHRoZSBwb3NpdGlvbiBvZiB0aGUgcnVuIHRoYXQgaXMgY2xvc2VzdCB0byB0aGUgbGVhZGluZyBtYXJnaW4KKyAgICAgKiBAcGFyYW0gdG9wIHRoZSB0b3Agb2YgdGhlIGxpbmUKKyAgICAgKiBAcGFyYW0geSB0aGUgYmFzZWxpbmUKKyAgICAgKiBAcGFyYW0gYm90dG9tIHRoZSBib3R0b20gb2YgdGhlIGxpbmUKKyAgICAgKiBAcGFyYW0gbmVlZFdpZHRoIHRydWUgaWYgdGhlIHdpZHRoIHZhbHVlIGlzIHJlcXVpcmVkLgorICAgICAqIEByZXR1cm4gdGhlIHNpZ25lZCB3aWR0aCBvZiB0aGUgcnVuLCBiYXNlZCBvbiB0aGUgcGFyYWdyYXBoIGRpcmVjdGlvbi4KKyAgICAgKiBPbmx5IHZhbGlkIGlmIG5lZWRXaWR0aCBpcyB0cnVlLgorICAgICAqLworICAgIHByaXZhdGUgZmxvYXQgZHJhd1J1bihDYW52YXMgYywgaW50IHJ1bkluZGV4LCBpbnQgc3RhcnQsCisgICAgICAgICAgICBpbnQgbGltaXQsIGJvb2xlYW4gcnVuSXNSdGwsIGZsb2F0IHgsIGludCB0b3AsIGludCB5LCBpbnQgYm90dG9tLAorICAgICAgICAgICAgYm9vbGVhbiBuZWVkV2lkdGgpIHsKKworICAgICAgICBpZiAoKG1EaXIgPT0gTGF5b3V0LkRJUl9MRUZUX1RPX1JJR0hUKSA9PSBydW5Jc1J0bCkgeworICAgICAgICAgICAgZmxvYXQgdyA9IC1tZWFzdXJlUnVuKHJ1bkluZGV4LCBzdGFydCwgbGltaXQsIGxpbWl0LCBydW5Jc1J0bCwgbnVsbCk7CisgICAgICAgICAgICBoYW5kbGVSdW4ocnVuSW5kZXgsIHN0YXJ0LCBsaW1pdCwgbGltaXQsIHJ1bklzUnRsLCBjLCB4ICsgdywgdG9wLAorICAgICAgICAgICAgICAgICAgICB5LCBib3R0b20sIG51bGwsIGZhbHNlKTsKKyAgICAgICAgICAgIHJldHVybiB3OworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGhhbmRsZVJ1bihydW5JbmRleCwgc3RhcnQsIGxpbWl0LCBsaW1pdCwgcnVuSXNSdGwsIGMsIHgsIHRvcCwKKyAgICAgICAgICAgICAgICB5LCBib3R0b20sIG51bGwsIG5lZWRXaWR0aCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTWVhc3VyZXMgYSB1bmlkaXJlY3Rpb25hbCAoYnV0IHBvc3NpYmx5IG11bHRpLXN0eWxlZCkgcnVuIG9mIHRleHQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcnVuSW5kZXggdGhlIHJ1biBpbmRleAorICAgICAqIEBwYXJhbSBzdGFydCB0aGUgbGluZS1yZWxhdGl2ZSBzdGFydCBvZiB0aGUgcnVuCisgICAgICogQHBhcmFtIG9mZnNldCB0aGUgb2Zmc2V0IHRvIG1lYXN1cmUgdG8sIGJldHdlZW4gc3RhcnQgYW5kIGxpbWl0IGluY2x1c2l2ZQorICAgICAqIEBwYXJhbSBsaW1pdCB0aGUgbGluZS1yZWxhdGl2ZSBsaW1pdCBvZiB0aGUgcnVuCisgICAgICogQHBhcmFtIHJ1bklzUnRsIHRydWUgaWYgdGhlIHJ1biBpcyByaWdodC10by1sZWZ0CisgICAgICogQHBhcmFtIGZtaSByZWNlaXZlcyBtZXRyaWNzIGluZm9ybWF0aW9uIGFib3V0IHRoZSByZXF1ZXN0ZWQKKyAgICAgKiBydW4sIGNhbiBiZSBudWxsLgorICAgICAqIEByZXR1cm4gdGhlIHNpZ25lZCB3aWR0aCBmcm9tIHRoZSBzdGFydCBvZiB0aGUgcnVuIHRvIHRoZSBsZWFkaW5nIGVkZ2UKKyAgICAgKiBvZiB0aGUgY2hhcmFjdGVyIGF0IG9mZnNldCwgYmFzZWQgb24gdGhlIHJ1biAobm90IHBhcmFncmFwaCkgZGlyZWN0aW9uCisgICAgICovCisgICAgcHJpdmF0ZSBmbG9hdCBtZWFzdXJlUnVuKGludCBydW5JbmRleCwgaW50IHN0YXJ0LAorICAgICAgICAgICAgaW50IG9mZnNldCwgaW50IGxpbWl0LCBib29sZWFuIHJ1bklzUnRsLCBGb250TWV0cmljc0ludCBmbWkpIHsKKyAgICAgICAgcmV0dXJuIGhhbmRsZVJ1bihydW5JbmRleCwgc3RhcnQsIG9mZnNldCwgbGltaXQsIHJ1bklzUnRsLCBudWxsLAorICAgICAgICAgICAgICAgIDAsIDAsIDAsIDAsIGZtaSwgdHJ1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2FsayB0aGUgY3Vyc29yIHRocm91Z2ggdGhpcyBsaW5lLCBza2lwcGluZyBjb25qdW5jdHMgYW5kCisgICAgICogemVyby13aWR0aCBjaGFyYWN0ZXJzLgorICAgICAqCisgICAgICogPHA+VGhpcyBmdW5jdGlvbiBjYW5ub3QgcHJvcGVybHkgd2FsayB0aGUgY3Vyc29yIG9mZiB0aGUgZW5kcyBvZiB0aGUgbGluZQorICAgICAqIHNpbmNlIGl0IGRvZXMgbm90IGtub3cgYWJvdXQgYW55IHNoYXBpbmcgb24gdGhlIHByZXZpb3VzL2ZvbGxvd2luZyBsaW5lCisgICAgICogdGhhdCBtaWdodCBhZmZlY3QgdGhlIGN1cnNvciBwb3NpdGlvbi4gQ2FsbGVycyBtdXN0IGVpdGhlciBhdm9pZCB0aGVzZQorICAgICAqIHNpdHVhdGlvbnMgb3IgaGFuZGxlIHRoZSByZXN1bHQgc3BlY2lhbGx5LgorICAgICAqCisgICAgICogQHBhcmFtIGN1cnNvciB0aGUgc3RhcnRpbmcgcG9zaXRpb24gb2YgdGhlIGN1cnNvciwgYmV0d2VlbiAwIGFuZCB0aGUKKyAgICAgKiBsZW5ndGggb2YgdGhlIGxpbmUsIGluY2x1c2l2ZQorICAgICAqIEBwYXJhbSB0b0xlZnQgdHJ1ZSBpZiB0aGUgY2FyZXQgaXMgbW92aW5nIHRvIHRoZSBsZWZ0LgorICAgICAqIEByZXR1cm4gdGhlIG5ldyBvZmZzZXQuICBJZiBpdCBpcyBsZXNzIHRoYW4gMCBvciBncmVhdGVyIHRoYW4gdGhlIGxlbmd0aAorICAgICAqIG9mIHRoZSBsaW5lLCB0aGUgcHJldmlvdXMvZm9sbG93aW5nIGxpbmUgc2hvdWxkIGJlIGV4YW1pbmVkIHRvIGdldCB0aGUKKyAgICAgKiBhY3R1YWwgb2Zmc2V0LgorICAgICAqLworICAgIGludCBnZXRPZmZzZXRUb0xlZnRSaWdodE9mKGludCBjdXJzb3IsIGJvb2xlYW4gdG9MZWZ0KSB7CisgICAgICAgIC8vIDEpIFRoZSBjYXJldCBtYXJrcyB0aGUgbGVhZGluZyBlZGdlIG9mIGEgY2hhcmFjdGVyLiBUaGUgY2hhcmFjdGVyCisgICAgICAgIC8vIGxvZ2ljYWxseSBiZWZvcmUgaXQgbWlnaHQgYmUgb24gYSBkaWZmZXJlbnQgbGV2ZWwsIGFuZCB0aGUgYWN0aXZlIGNhcmV0CisgICAgICAgIC8vIHBvc2l0aW9uIGlzIG9uIHRoZSBjaGFyYWN0ZXIgYXQgdGhlIGxvd2VyIGxldmVsLiBJZiB0aGF0IGNoYXJhY3RlcgorICAgICAgICAvLyB3YXMgdGhlIHByZXZpb3VzIGNoYXJhY3RlciwgdGhlIGNhcmV0IGlzIG9uIGl0cyB0cmFpbGluZyBlZGdlLgorICAgICAgICAvLyAyKSBUYWtlIHRoaXMgY2hhcmFjdGVyL2VkZ2UgYW5kIG1vdmUgaXQgaW4gdGhlIGluZGljYXRlZCBkaXJlY3Rpb24uCisgICAgICAgIC8vIFRoaXMgZ2l2ZXMgeW91IGEgbmV3IGNoYXJhY3RlciBhbmQgYSBuZXcgZWRnZS4KKyAgICAgICAgLy8gMykgVGhpcyBwb3NpdGlvbiBpcyBiZXR3ZWVuIHR3byB2aXN1YWxseSBhZGphY2VudCBjaGFyYWN0ZXJzLiAgT25lIG9mCisgICAgICAgIC8vIHRoZXNlIG1pZ2h0IGJlIGF0IGEgbG93ZXIgbGV2ZWwuICBUaGUgYWN0aXZlIHBvc2l0aW9uIGlzIG9uIHRoZQorICAgICAgICAvLyBjaGFyYWN0ZXIgYXQgdGhlIGxvd2VyIGxldmVsLgorICAgICAgICAvLyA0KSBJZiB0aGUgYWN0aXZlIHBvc2l0aW9uIGlzIG9uIHRoZSB0cmFpbGluZyBlZGdlIG9mIHRoZSBjaGFyYWN0ZXIsCisgICAgICAgIC8vIHRoZSBuZXcgY2FyZXQgcG9zaXRpb24gaXMgdGhlIGZvbGxvd2luZyBsb2dpY2FsIGNoYXJhY3RlciwgZWxzZSBpdAorICAgICAgICAvLyBpcyB0aGUgY2hhcmFjdGVyLgorCisgICAgICAgIGludCBsaW5lU3RhcnQgPSAwOworICAgICAgICBpbnQgbGluZUVuZCA9IG1MZW47CisgICAgICAgIGJvb2xlYW4gcGFyYUlzUnRsID0gbURpciA9PSAtMTsKKyAgICAgICAgaW50W10gcnVucyA9IG1EaXJlY3Rpb25zLm1EaXJlY3Rpb25zOworCisgICAgICAgIGludCBydW5JbmRleCwgcnVuTGV2ZWwgPSAwLCBydW5TdGFydCA9IGxpbmVTdGFydCwgcnVuTGltaXQgPSBsaW5lRW5kLCBuZXdDYXJldCA9IC0xOworICAgICAgICBib29sZWFuIHRyYWlsaW5nID0gZmFsc2U7CisKKyAgICAgICAgaWYgKGN1cnNvciA9PSBsaW5lU3RhcnQpIHsKKyAgICAgICAgICAgIHJ1bkluZGV4ID0gLTI7CisgICAgICAgIH0gZWxzZSBpZiAoY3Vyc29yID09IGxpbmVFbmQpIHsKKyAgICAgICAgICAgIHJ1bkluZGV4ID0gcnVucy5sZW5ndGg7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgLy8gRmlyc3QsIGdldCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcnVuIGNvbnRhaW5pbmcgdGhlIGNoYXJhY3RlciB3aXRoCisgICAgICAgICAgLy8gdGhlIGFjdGl2ZSBjYXJldC4KKyAgICAgICAgICBmb3IgKHJ1bkluZGV4ID0gMDsgcnVuSW5kZXggPCBydW5zLmxlbmd0aDsgcnVuSW5kZXggKz0gMikgeworICAgICAgICAgICAgcnVuU3RhcnQgPSBsaW5lU3RhcnQgKyBydW5zW3J1bkluZGV4XTsKKyAgICAgICAgICAgIGlmIChjdXJzb3IgPj0gcnVuU3RhcnQpIHsKKyAgICAgICAgICAgICAgcnVuTGltaXQgPSBydW5TdGFydCArIChydW5zW3J1bkluZGV4KzFdICYgTGF5b3V0LlJVTl9MRU5HVEhfTUFTSyk7CisgICAgICAgICAgICAgIGlmIChydW5MaW1pdCA+IGxpbmVFbmQpIHsKKyAgICAgICAgICAgICAgICAgIHJ1bkxpbWl0ID0gbGluZUVuZDsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBpZiAoY3Vyc29yIDwgcnVuTGltaXQpIHsKKyAgICAgICAgICAgICAgICBydW5MZXZlbCA9IChydW5zW3J1bkluZGV4KzFdID4+PiBMYXlvdXQuUlVOX0xFVkVMX1NISUZUKSAmCisgICAgICAgICAgICAgICAgICAgIExheW91dC5SVU5fTEVWRUxfTUFTSzsKKyAgICAgICAgICAgICAgICBpZiAoY3Vyc29yID09IHJ1blN0YXJ0KSB7CisgICAgICAgICAgICAgICAgICAvLyBUaGUgY2FyZXQgaXMgb24gYSBydW4gYm91bmRhcnksIHNlZSBpZiB3ZSBzaG91bGQKKyAgICAgICAgICAgICAgICAgIC8vIHVzZSB0aGUgcG9zaXRpb24gb24gdGhlIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIHByZXZpb3VzCisgICAgICAgICAgICAgICAgICAvLyBsb2dpY2FsIGNoYXJhY3RlciBpbnN0ZWFkLgorICAgICAgICAgICAgICAgICAgaW50IHByZXZSdW5JbmRleCwgcHJldlJ1bkxldmVsLCBwcmV2UnVuU3RhcnQsIHByZXZSdW5MaW1pdDsKKyAgICAgICAgICAgICAgICAgIGludCBwb3MgPSBjdXJzb3IgLSAxOworICAgICAgICAgICAgICAgICAgZm9yIChwcmV2UnVuSW5kZXggPSAwOyBwcmV2UnVuSW5kZXggPCBydW5zLmxlbmd0aDsgcHJldlJ1bkluZGV4ICs9IDIpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJldlJ1blN0YXJ0ID0gbGluZVN0YXJ0ICsgcnVuc1twcmV2UnVuSW5kZXhdOworICAgICAgICAgICAgICAgICAgICBpZiAocG9zID49IHByZXZSdW5TdGFydCkgeworICAgICAgICAgICAgICAgICAgICAgIHByZXZSdW5MaW1pdCA9IHByZXZSdW5TdGFydCArCisgICAgICAgICAgICAgICAgICAgICAgICAgIChydW5zW3ByZXZSdW5JbmRleCsxXSAmIExheW91dC5SVU5fTEVOR1RIX01BU0spOworICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmV2UnVuTGltaXQgPiBsaW5lRW5kKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZSdW5MaW1pdCA9IGxpbmVFbmQ7CisgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgIGlmIChwb3MgPCBwcmV2UnVuTGltaXQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByZXZSdW5MZXZlbCA9IChydW5zW3ByZXZSdW5JbmRleCsxXSA+Pj4gTGF5b3V0LlJVTl9MRVZFTF9TSElGVCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmIExheW91dC5SVU5fTEVWRUxfTUFTSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmV2UnVuTGV2ZWwgPCBydW5MZXZlbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTdGFydCBmcm9tIGxvZ2ljYWxseSBwcmV2aW91cyBjaGFyYWN0ZXIuCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bkluZGV4ID0gcHJldlJ1bkluZGV4OworICAgICAgICAgICAgICAgICAgICAgICAgICBydW5MZXZlbCA9IHByZXZSdW5MZXZlbDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuU3RhcnQgPSBwcmV2UnVuU3RhcnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bkxpbWl0ID0gcHJldlJ1bkxpbWl0OworICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFpbGluZyA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKworICAgICAgICAgIC8vIGNhcmV0IG1pZ2h0IGJlID09IGxpbmVFbmQuICBUaGlzIGlzIGdlbmVyYWxseSBhIHNwYWNlIG9yIHBhcmFncmFwaAorICAgICAgICAgIC8vIHNlcGFyYXRvciBhbmQgaGFzIGFuIGFzc29jaWF0ZWQgcnVuLCBidXQgbWlnaHQgYmUgdGhlIGVuZCBvZgorICAgICAgICAgIC8vIHRleHQsIGluIHdoaWNoIGNhc2UgaXQgZG9lc24ndC4gIElmIHRoYXQgaGFwcGVucywgd2UgcmFuIG9mZiB0aGUKKyAgICAgICAgICAvLyBlbmQgb2YgdGhlIHJ1biBsaXN0LCBhbmQgcnVuSW5kZXggPT0gcnVucy5sZW5ndGguICBJbiB0aGlzIGNhc2UsCisgICAgICAgICAgLy8gd2UgYXJlIGF0IGEgcnVuIGJvdW5kYXJ5IHNvIHdlIHNraXAgdGhlIGJlbG93IHRlc3QuCisgICAgICAgICAgaWYgKHJ1bkluZGV4ICE9IHJ1bnMubGVuZ3RoKSB7CisgICAgICAgICAgICAgIGJvb2xlYW4gcnVuSXNSdGwgPSAocnVuTGV2ZWwgJiAweDEpICE9IDA7CisgICAgICAgICAgICAgIGJvb2xlYW4gYWR2YW5jZSA9IHRvTGVmdCA9PSBydW5Jc1J0bDsKKyAgICAgICAgICAgICAgaWYgKGN1cnNvciAhPSAoYWR2YW5jZSA/IHJ1bkxpbWl0IDogcnVuU3RhcnQpIHx8IGFkdmFuY2UgIT0gdHJhaWxpbmcpIHsKKyAgICAgICAgICAgICAgICAgIC8vIE1vdmluZyB3aXRoaW4gb3IgaW50byB0aGUgcnVuLCBzbyB3ZSBjYW4gbW92ZSBsb2dpY2FsbHkuCisgICAgICAgICAgICAgICAgICBuZXdDYXJldCA9IGdldE9mZnNldEJlZm9yZUFmdGVyKHJ1bkluZGV4LCBydW5TdGFydCwgcnVuTGltaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklzUnRsLCBjdXJzb3IsIGFkdmFuY2UpOworICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIG5ldyBwb3NpdGlvbiBpcyBpbnRlcm5hbCB0byB0aGUgcnVuLCB3ZSdyZSBhdCB0aGUgc3Ryb25nCisgICAgICAgICAgICAgICAgICAvLyBwb3NpdGlvbiBhbHJlYWR5IHNvIHdlJ3JlIGZpbmlzaGVkLgorICAgICAgICAgICAgICAgICAgaWYgKG5ld0NhcmV0ICE9IChhZHZhbmNlID8gcnVuTGltaXQgOiBydW5TdGFydCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3Q2FyZXQ7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBJZiBuZXdDYXJldCBpcyAtMSwgd2UncmUgc3RhcnRpbmcgYXQgYSBydW4gYm91bmRhcnkgYW5kIGNyb3NzaW5nCisgICAgICAgIC8vIGludG8gYW5vdGhlciBydW4uIE90aGVyd2lzZSB3ZSd2ZSBhcnJpdmVkIGF0IGEgcnVuIGJvdW5kYXJ5LCBhbmQKKyAgICAgICAgLy8gbmVlZCB0byBmaWd1cmUgb3V0IHdoaWNoIGNoYXJhY3RlciB0byBhdHRhY2ggdG8uICBOb3RlIHdlIG1pZ2h0CisgICAgICAgIC8vIG5lZWQgdG8gcnVuIHRoaXMgdHdpY2UsIGlmIHdlIGNyb3NzIGEgcnVuIGJvdW5kYXJ5IGFuZCBlbmQgdXAgYXQKKyAgICAgICAgLy8gYW5vdGhlciBydW4gYm91bmRhcnkuCisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgYm9vbGVhbiBhZHZhbmNlID0gdG9MZWZ0ID09IHBhcmFJc1J0bDsKKyAgICAgICAgICBpbnQgb3RoZXJSdW5JbmRleCA9IHJ1bkluZGV4ICsgKGFkdmFuY2UgPyAyIDogLTIpOworICAgICAgICAgIGlmIChvdGhlclJ1bkluZGV4ID49IDAgJiYgb3RoZXJSdW5JbmRleCA8IHJ1bnMubGVuZ3RoKSB7CisgICAgICAgICAgICBpbnQgb3RoZXJSdW5TdGFydCA9IGxpbmVTdGFydCArIHJ1bnNbb3RoZXJSdW5JbmRleF07CisgICAgICAgICAgICBpbnQgb3RoZXJSdW5MaW1pdCA9IG90aGVyUnVuU3RhcnQgKworICAgICAgICAgICAgKHJ1bnNbb3RoZXJSdW5JbmRleCsxXSAmIExheW91dC5SVU5fTEVOR1RIX01BU0spOworICAgICAgICAgICAgaWYgKG90aGVyUnVuTGltaXQgPiBsaW5lRW5kKSB7CisgICAgICAgICAgICAgICAgb3RoZXJSdW5MaW1pdCA9IGxpbmVFbmQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQgb3RoZXJSdW5MZXZlbCA9IChydW5zW290aGVyUnVuSW5kZXgrMV0gPj4+IExheW91dC5SVU5fTEVWRUxfU0hJRlQpICYKKyAgICAgICAgICAgICAgICBMYXlvdXQuUlVOX0xFVkVMX01BU0s7CisgICAgICAgICAgICBib29sZWFuIG90aGVyUnVuSXNSdGwgPSAob3RoZXJSdW5MZXZlbCAmIDEpICE9IDA7CisKKyAgICAgICAgICAgIGFkdmFuY2UgPSB0b0xlZnQgPT0gb3RoZXJSdW5Jc1J0bDsKKyAgICAgICAgICAgIGlmIChuZXdDYXJldCA9PSAtMSkgeworICAgICAgICAgICAgICAgIG5ld0NhcmV0ID0gZ2V0T2Zmc2V0QmVmb3JlQWZ0ZXIob3RoZXJSdW5JbmRleCwgb3RoZXJSdW5TdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyUnVuTGltaXQsIG90aGVyUnVuSXNSdGwsCisgICAgICAgICAgICAgICAgICAgICAgICBhZHZhbmNlID8gb3RoZXJSdW5TdGFydCA6IG90aGVyUnVuTGltaXQsIGFkdmFuY2UpOworICAgICAgICAgICAgICAgIGlmIChuZXdDYXJldCA9PSAoYWR2YW5jZSA/IG90aGVyUnVuTGltaXQgOiBvdGhlclJ1blN0YXJ0KSkgeworICAgICAgICAgICAgICAgICAgICAvLyBDcm9zc2VkIGFuZCBlbmRlZCB1cCBhdCBhIG5ldyBib3VuZGFyeSwKKyAgICAgICAgICAgICAgICAgICAgLy8gcmVwZWF0IGEgc2Vjb25kIGFuZCBmaW5hbCB0aW1lLgorICAgICAgICAgICAgICAgICAgICBydW5JbmRleCA9IG90aGVyUnVuSW5kZXg7CisgICAgICAgICAgICAgICAgICAgIHJ1bkxldmVsID0gb3RoZXJSdW5MZXZlbDsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBUaGUgbmV3IGNhcmV0IGlzIGF0IGEgYm91bmRhcnkuCisgICAgICAgICAgICBpZiAob3RoZXJSdW5MZXZlbCA8IHJ1bkxldmVsKSB7CisgICAgICAgICAgICAgIC8vIFRoZSBzdHJvbmcgY2hhcmFjdGVyIGlzIGluIHRoZSBvdGhlciBydW4uCisgICAgICAgICAgICAgIG5ld0NhcmV0ID0gYWR2YW5jZSA/IG90aGVyUnVuU3RhcnQgOiBvdGhlclJ1bkxpbWl0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKG5ld0NhcmV0ID09IC0xKSB7CisgICAgICAgICAgICAgIC8vIFdlJ3JlIHdhbGtpbmcgb2ZmIHRoZSBlbmQgb2YgdGhlIGxpbmUuICBUaGUgcGFyYWdyYXBoCisgICAgICAgICAgICAgIC8vIGxldmVsIGlzIGFsd2F5cyBlcXVhbCB0byBvciBsb3dlciB0aGFuIGFueSBpbnRlcm5hbCBsZXZlbCwgc28KKyAgICAgICAgICAgICAgLy8gdGhlIGJvdW5kYXJpZXMgZ2V0IHRoZSBzdHJvbmcgY2FyZXQuCisgICAgICAgICAgICAgIG5ld0NhcmV0ID0gYWR2YW5jZSA/IG1MZW4gKyAxIDogLTE7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKworICAgICAgICAgIC8vIEVsc2Ugd2UndmUgYXJyaXZlZCBhdCB0aGUgZW5kIG9mIHRoZSBsaW5lLiAgVGhhdCdzIGEgc3Ryb25nIHBvc2l0aW9uLgorICAgICAgICAgIC8vIFdlIG1pZ2h0IGhhdmUgYXJyaXZlZCBoZXJlIGJ5IGNyb3NzaW5nIG92ZXIgYSBydW4gd2l0aCBubyBpbnRlcm5hbAorICAgICAgICAgIC8vIGJyZWFrcyBhbmQgZHJvcHBpbmcgb3V0IG9mIHRoZSBhYm92ZSBsb29wIGJlZm9yZSBhZHZhbmNpbmcgb25lIGZpbmFsCisgICAgICAgICAgLy8gdGltZSwgc28gcmVzZXQgdGhlIGNhcmV0LgorICAgICAgICAgIC8vIE5vdGUsIHdlIHVzZSAnPD0nIGJlbG93IHRvIGhhbmRsZSBhIHNpdHVhdGlvbiB3aGVyZSB0aGUgb25seSBydW4KKyAgICAgICAgICAvLyBvbiB0aGUgbGluZSBpcyBhIGNvdW50ZXItZGlyZWN0aW9uYWwgcnVuLiAgSWYgd2UncmUgbm90IGFkdmFuY2luZywKKyAgICAgICAgICAvLyB3ZSBjYW4gZW5kIHVwIGF0IHRoZSAnbGluZUVuZCcgcG9zaXRpb24gYnV0IHRoZSBjYXJldCB3ZSB3YW50IGlzIGF0CisgICAgICAgICAgLy8gdGhlIGxpbmVTdGFydC4KKyAgICAgICAgICBpZiAobmV3Q2FyZXQgPD0gbGluZUVuZCkgeworICAgICAgICAgICAgICBuZXdDYXJldCA9IGFkdmFuY2UgPyBsaW5lRW5kIDogbGluZVN0YXJ0OworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBuZXdDYXJldDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBuZXh0IHZhbGlkIG9mZnNldCB3aXRoaW4gdGhpcyBkaXJlY3Rpb25hbCBydW4sIHNraXBwaW5nCisgICAgICogY29uanVuY3RzIGFuZCB6ZXJvLXdpZHRoIGNoYXJhY3RlcnMuICBUaGlzIHNob3VsZCBub3QgYmUgY2FsbGVkIHRvIHdhbGsKKyAgICAgKiBvZmYgdGhlIGVuZCBvZiB0aGUgbGluZSwgc2luY2UgdGhlIHRoZSByZXR1cm5lZCB2YWx1ZXMgbWlnaHQgbm90IGJlIHZhbGlkCisgICAgICogb24gbmVpZ2hib3JpbmcgbGluZXMuICBJZiB0aGUgcmV0dXJuZWQgb2Zmc2V0IGlzIGxlc3MgdGhhbiB6ZXJvIG9yCisgICAgICogZ3JlYXRlciB0aGFuIHRoZSBsaW5lIGxlbmd0aCwgdGhlIG9mZnNldCBzaG91bGQgYmUgcmVjb21wdXRlZCBvbiB0aGUKKyAgICAgKiBwcmVjZWRpbmcgb3IgZm9sbG93aW5nIGxpbmUsIHJlc3BlY3RpdmVseS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBydW5JbmRleCB0aGUgcnVuIGluZGV4CisgICAgICogQHBhcmFtIHJ1blN0YXJ0IHRoZSBzdGFydCBvZiB0aGUgcnVuCisgICAgICogQHBhcmFtIHJ1bkxpbWl0IHRoZSBsaW1pdCBvZiB0aGUgcnVuCisgICAgICogQHBhcmFtIHJ1bklzUnRsIHRydWUgaWYgdGhlIHJ1biBpcyByaWdodC10by1sZWZ0CisgICAgICogQHBhcmFtIG9mZnNldCB0aGUgb2Zmc2V0CisgICAgICogQHBhcmFtIGFmdGVyIHRydWUgaWYgdGhlIG5ldyBvZmZzZXQgc2hvdWxkIGxvZ2ljYWxseSBmb2xsb3cgdGhlIHByb3ZpZGVkCisgICAgICogb2Zmc2V0CisgICAgICogQHJldHVybiB0aGUgbmV3IG9mZnNldAorICAgICAqLworICAgIHByaXZhdGUgaW50IGdldE9mZnNldEJlZm9yZUFmdGVyKGludCBydW5JbmRleCwgaW50IHJ1blN0YXJ0LCBpbnQgcnVuTGltaXQsCisgICAgICAgICAgICBib29sZWFuIHJ1bklzUnRsLCBpbnQgb2Zmc2V0LCBib29sZWFuIGFmdGVyKSB7CisKKyAgICAgICAgaWYgKHJ1bkluZGV4IDwgMCB8fCBvZmZzZXQgPT0gKGFmdGVyID8gbUxlbiA6IDApKSB7CisgICAgICAgICAgICAvLyBXYWxraW5nIG9mZiBlbmQgb2YgbGluZS4gIFNpbmNlIHdlIGRvbid0IGtub3cKKyAgICAgICAgICAgIC8vIHdoYXQgY3Vyc29yIHBvc2l0aW9ucyBhcmUgYXZhaWxhYmxlIG9uIG90aGVyIGxpbmVzLCB3ZSBjYW4ndAorICAgICAgICAgICAgLy8gcmV0dXJuIGFjY3VyYXRlIHZhbHVlcy4gIFRoZXNlIGFyZSBhIGd1ZXNzLgorICAgICAgICAgICAgaWYgKGFmdGVyKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRleHRVdGlscy5nZXRPZmZzZXRBZnRlcihtVGV4dCwgb2Zmc2V0ICsgbVN0YXJ0KSAtIG1TdGFydDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBUZXh0VXRpbHMuZ2V0T2Zmc2V0QmVmb3JlKG1UZXh0LCBvZmZzZXQgKyBtU3RhcnQpIC0gbVN0YXJ0OworICAgICAgICB9CisKKyAgICAgICAgVGV4dFBhaW50IHdwID0gbVdvcmtQYWludDsKKyAgICAgICAgd3Auc2V0KG1QYWludCk7CisKKyAgICAgICAgaW50IHNwYW5TdGFydCA9IHJ1blN0YXJ0OworICAgICAgICBpbnQgc3BhbkxpbWl0OworICAgICAgICBpZiAobVNwYW5uZWQgPT0gbnVsbCkgeworICAgICAgICAgICAgc3BhbkxpbWl0ID0gcnVuTGltaXQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpbnQgdGFyZ2V0ID0gYWZ0ZXIgPyBvZmZzZXQgKyAxIDogb2Zmc2V0OworICAgICAgICAgICAgaW50IGxpbWl0ID0gbVN0YXJ0ICsgcnVuTGltaXQ7CisgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgICAgIHNwYW5MaW1pdCA9IG1TcGFubmVkLm5leHRTcGFuVHJhbnNpdGlvbihtU3RhcnQgKyBzcGFuU3RhcnQsIGxpbWl0LAorICAgICAgICAgICAgICAgICAgICAgICAgTWV0cmljQWZmZWN0aW5nU3Bhbi5jbGFzcykgLSBtU3RhcnQ7CisgICAgICAgICAgICAgICAgaWYgKHNwYW5MaW1pdCA+PSB0YXJnZXQpIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNwYW5TdGFydCA9IHNwYW5MaW1pdDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgTWV0cmljQWZmZWN0aW5nU3BhbltdIHNwYW5zID0gbVNwYW5uZWQuZ2V0U3BhbnMobVN0YXJ0ICsgc3BhblN0YXJ0LAorICAgICAgICAgICAgICAgICAgICBtU3RhcnQgKyBzcGFuTGltaXQsIE1ldHJpY0FmZmVjdGluZ1NwYW4uY2xhc3MpOworCisgICAgICAgICAgICBpZiAoc3BhbnMubGVuZ3RoID4gMCkgeworICAgICAgICAgICAgICAgIFJlcGxhY2VtZW50U3BhbiByZXBsYWNlbWVudCA9IG51bGw7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBzcGFucy5sZW5ndGg7IGorKykgeworICAgICAgICAgICAgICAgICAgICBNZXRyaWNBZmZlY3RpbmdTcGFuIHNwYW4gPSBzcGFuc1tqXTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNwYW4gaW5zdGFuY2VvZiBSZXBsYWNlbWVudFNwYW4pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2VtZW50ID0gKFJlcGxhY2VtZW50U3BhbilzcGFuOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgc3Bhbi51cGRhdGVNZWFzdXJlU3RhdGUod3ApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHJlcGxhY2VtZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gSWYgd2UgaGF2ZSBhIHJlcGxhY2VtZW50IHNwYW4sIHdlJ3JlIG1vdmluZyBlaXRoZXIgdG8KKyAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHN0YXJ0IG9yIGVuZCBvZiB0aGlzIHNwYW4uCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBhZnRlciA/IHNwYW5MaW1pdCA6IHNwYW5TdGFydDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpbnQgZmxhZ3MgPSBydW5Jc1J0bCA/IFBhaW50LkRJUkVDVElPTl9SVEwgOiBQYWludC5ESVJFQ1RJT05fTFRSOworICAgICAgICBpbnQgY3Vyc29yT3B0ID0gYWZ0ZXIgPyBQYWludC5DVVJTT1JfQUZURVIgOiBQYWludC5DVVJTT1JfQkVGT1JFOworICAgICAgICBpZiAobUNoYXJzVmFsaWQpIHsKKyAgICAgICAgICAgIHJldHVybiB3cC5nZXRUZXh0UnVuQ3Vyc29yKG1DaGFycywgc3BhblN0YXJ0LCBzcGFuTGltaXQgLSBzcGFuU3RhcnQsCisgICAgICAgICAgICAgICAgICAgIGZsYWdzLCBvZmZzZXQsIGN1cnNvck9wdCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gd3AuZ2V0VGV4dFJ1bkN1cnNvcihtVGV4dCwgbVN0YXJ0ICsgc3BhblN0YXJ0LAorICAgICAgICAgICAgICAgICAgICBtU3RhcnQgKyBzcGFuTGltaXQsIGZsYWdzLCBtU3RhcnQgKyBvZmZzZXQsIGN1cnNvck9wdCkgLSBtU3RhcnQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVdGlsaXR5IGZ1bmN0aW9uIGZvciBtZWFzdXJpbmcgYW5kIHJlbmRlcmluZyB0ZXh0LiAgVGhlIHRleHQgbXVzdAorICAgICAqIG5vdCBpbmNsdWRlIGEgdGFiIG9yIGVtb2ppLgorICAgICAqCisgICAgICogQHBhcmFtIHdwIHRoZSB3b3JraW5nIHBhaW50CisgICAgICogQHBhcmFtIHN0YXJ0IHRoZSBzdGFydCBvZiB0aGUgdGV4dAorICAgICAqIEBwYXJhbSBlbmQgdGhlIGVuZCBvZiB0aGUgdGV4dAorICAgICAqIEBwYXJhbSBydW5Jc1J0bCB0cnVlIGlmIHRoZSBydW4gaXMgcmlnaHQtdG8tbGVmdAorICAgICAqIEBwYXJhbSBjIHRoZSBjYW52YXMsIGNhbiBiZSBudWxsIGlmIHJlbmRlcmluZyBpcyBub3QgbmVlZGVkCisgICAgICogQHBhcmFtIHggdGhlIGVkZ2Ugb2YgdGhlIHJ1biBjbG9zZXN0IHRvIHRoZSBsZWFkaW5nIG1hcmdpbgorICAgICAqIEBwYXJhbSB0b3AgdGhlIHRvcCBvZiB0aGUgbGluZQorICAgICAqIEBwYXJhbSB5IHRoZSBiYXNlbGluZQorICAgICAqIEBwYXJhbSBib3R0b20gdGhlIGJvdHRvbSBvZiB0aGUgbGluZQorICAgICAqIEBwYXJhbSBmbWkgcmVjZWl2ZXMgbWV0cmljcyBpbmZvcm1hdGlvbiwgY2FuIGJlIG51bGwKKyAgICAgKiBAcGFyYW0gbmVlZFdpZHRoIHRydWUgaWYgdGhlIHdpZHRoIG9mIHRoZSBydW4gaXMgbmVlZGVkCisgICAgICogQHJldHVybiB0aGUgc2lnbmVkIHdpZHRoIG9mIHRoZSBydW4gYmFzZWQgb24gdGhlIHJ1biBkaXJlY3Rpb247IG9ubHkKKyAgICAgKiB2YWxpZCBpZiBuZWVkV2lkdGggaXMgdHJ1ZQorICAgICAqLworICAgIHByaXZhdGUgZmxvYXQgaGFuZGxlVGV4dChUZXh0UGFpbnQgd3AsIGludCBzdGFydCwgaW50IGVuZCwKKyAgICAgICAgICAgIGludCBjb250ZXh0U3RhcnQsIGludCBjb250ZXh0RW5kLCBib29sZWFuIHJ1bklzUnRsLAorICAgICAgICAgICAgQ2FudmFzIGMsIGZsb2F0IHgsIGludCB0b3AsIGludCB5LCBpbnQgYm90dG9tLAorICAgICAgICAgICAgRm9udE1ldHJpY3NJbnQgZm1pLCBib29sZWFuIG5lZWRXaWR0aCkgeworCisgICAgICAgIGZsb2F0IHJldCA9IDA7CisKKyAgICAgICAgaW50IHJ1bkxlbiA9IGVuZCAtIHN0YXJ0OworICAgICAgICBpbnQgY29udGV4dExlbiA9IGNvbnRleHRFbmQgLSBjb250ZXh0U3RhcnQ7CisgICAgICAgIGlmIChuZWVkV2lkdGggfHwgKGMgIT0gbnVsbCAmJiAod3AuYmdDb2xvciAhPSAwIHx8IHJ1bklzUnRsKSkpIHsKKyAgICAgICAgICAgIGludCBmbGFncyA9IHJ1bklzUnRsID8gUGFpbnQuRElSRUNUSU9OX1JUTCA6IFBhaW50LkRJUkVDVElPTl9MVFI7CisgICAgICAgICAgICBpZiAobUNoYXJzVmFsaWQpIHsKKyAgICAgICAgICAgICAgICByZXQgPSB3cC5nZXRUZXh0UnVuQWR2YW5jZXMobUNoYXJzLCBzdGFydCwgcnVuTGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dFN0YXJ0LCBjb250ZXh0TGVuLCBmbGFncywgbnVsbCwgMCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGludCBkZWx0YSA9IG1TdGFydDsKKyAgICAgICAgICAgICAgICByZXQgPSB3cC5nZXRUZXh0UnVuQWR2YW5jZXMobVRleHQsIGRlbHRhICsgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICBkZWx0YSArIGVuZCwgZGVsdGEgKyBjb250ZXh0U3RhcnQsIGRlbHRhICsgY29udGV4dEVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLCBudWxsLCAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChmbWkgIT0gbnVsbCkgeworICAgICAgICAgICAgd3AuZ2V0Rm9udE1ldHJpY3NJbnQoZm1pKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChydW5Jc1J0bCkgeworICAgICAgICAgICAgICAgIHggLT0gcmV0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAod3AuYmdDb2xvciAhPSAwKSB7CisgICAgICAgICAgICAgICAgaW50IGNvbG9yID0gd3AuZ2V0Q29sb3IoKTsKKyAgICAgICAgICAgICAgICBQYWludC5TdHlsZSBzID0gd3AuZ2V0U3R5bGUoKTsKKyAgICAgICAgICAgICAgICB3cC5zZXRDb2xvcih3cC5iZ0NvbG9yKTsKKyAgICAgICAgICAgICAgICB3cC5zZXRTdHlsZShQYWludC5TdHlsZS5GSUxMKTsKKworICAgICAgICAgICAgICAgIGMuZHJhd1JlY3QoeCwgdG9wLCB4ICsgcmV0LCBib3R0b20sIHdwKTsKKworICAgICAgICAgICAgICAgIHdwLnNldFN0eWxlKHMpOworICAgICAgICAgICAgICAgIHdwLnNldENvbG9yKGNvbG9yKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZHJhd1RleHRSdW4oYywgd3AsIHN0YXJ0LCBlbmQsIGNvbnRleHRTdGFydCwgY29udGV4dEVuZCwgcnVuSXNSdGwsCisgICAgICAgICAgICAgICAgICAgIHgsIHkgKyB3cC5iYXNlbGluZVNoaWZ0KTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBydW5Jc1J0bCA/IC1yZXQgOiByZXQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogVXRpbGl0eSBmdW5jdGlvbiBmb3IgbWVhc3VyaW5nIGFuZCByZW5kZXJpbmcgYSByZXBsYWNlbWVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXBsYWNlbWVudCB0aGUgcmVwbGFjZW1lbnQKKyAgICAgKiBAcGFyYW0gd3AgdGhlIHdvcmsgcGFpbnQKKyAgICAgKiBAcGFyYW0gcnVuSW5kZXggdGhlIHJ1biBpbmRleAorICAgICAqIEBwYXJhbSBzdGFydCB0aGUgc3RhcnQgb2YgdGhlIHJ1bgorICAgICAqIEBwYXJhbSBsaW1pdCB0aGUgbGltaXQgb2YgdGhlIHJ1bgorICAgICAqIEBwYXJhbSBydW5Jc1J0bCB0cnVlIGlmIHRoZSBydW4gaXMgcmlnaHQtdG8tbGVmdAorICAgICAqIEBwYXJhbSBjIHRoZSBjYW52YXMsIGNhbiBiZSBudWxsIGlmIG5vdCByZW5kZXJpbmcKKyAgICAgKiBAcGFyYW0geCB0aGUgZWRnZSBvZiB0aGUgcmVwbGFjZW1lbnQgY2xvc2VzdCB0byB0aGUgbGVhZGluZyBtYXJnaW4KKyAgICAgKiBAcGFyYW0gdG9wIHRoZSB0b3Agb2YgdGhlIGxpbmUKKyAgICAgKiBAcGFyYW0geSB0aGUgYmFzZWxpbmUKKyAgICAgKiBAcGFyYW0gYm90dG9tIHRoZSBib3R0b20gb2YgdGhlIGxpbmUKKyAgICAgKiBAcGFyYW0gZm1pIHJlY2VpdmVzIG1ldHJpY3MgaW5mb3JtYXRpb24sIGNhbiBiZSBudWxsCisgICAgICogQHBhcmFtIG5lZWRXaWR0aCB0cnVlIGlmIHRoZSB3aWR0aCBvZiB0aGUgcmVwbGFjZW1lbnQgaXMgbmVlZGVkCisgICAgICogQHJldHVybiB0aGUgc2lnbmVkIHdpZHRoIG9mIHRoZSBydW4gYmFzZWQgb24gdGhlIHJ1biBkaXJlY3Rpb247IG9ubHkKKyAgICAgKiB2YWxpZCBpZiBuZWVkV2lkdGggaXMgdHJ1ZQorICAgICAqLworICAgIHByaXZhdGUgZmxvYXQgaGFuZGxlUmVwbGFjZW1lbnQoUmVwbGFjZW1lbnRTcGFuIHJlcGxhY2VtZW50LCBUZXh0UGFpbnQgd3AsCisgICAgICAgICAgICBpbnQgcnVuSW5kZXgsIGludCBzdGFydCwgaW50IGxpbWl0LCBib29sZWFuIHJ1bklzUnRsLCBDYW52YXMgYywKKyAgICAgICAgICAgIGZsb2F0IHgsIGludCB0b3AsIGludCB5LCBpbnQgYm90dG9tLCBGb250TWV0cmljc0ludCBmbWksCisgICAgICAgICAgICBib29sZWFuIG5lZWRXaWR0aCkgeworCisgICAgICAgIGZsb2F0IHJldCA9IDA7CisKKyAgICAgICAgaW50IHRleHRTdGFydCA9IG1TdGFydCArIHN0YXJ0OworICAgICAgICBpbnQgdGV4dExpbWl0ID0gbVN0YXJ0ICsgbGltaXQ7CisKKyAgICAgICAgaWYgKG5lZWRXaWR0aCB8fCAoYyAhPSBudWxsICYmIHJ1bklzUnRsKSkgeworICAgICAgICAgICAgcmV0ID0gcmVwbGFjZW1lbnQuZ2V0U2l6ZSh3cCwgbVRleHQsIHRleHRTdGFydCwgdGV4dExpbWl0LCBmbWkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGMgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKHJ1bklzUnRsKSB7CisgICAgICAgICAgICAgICAgeCAtPSByZXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXBsYWNlbWVudC5kcmF3KGMsIG1UZXh0LCB0ZXh0U3RhcnQsIHRleHRMaW1pdCwKKyAgICAgICAgICAgICAgICAgICAgeCwgdG9wLCB5LCBib3R0b20sIHdwKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBydW5Jc1J0bCA/IC1yZXQgOiByZXQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogVXRpbGl0eSBmdW5jdGlvbiBmb3IgaGFuZGxpbmcgYSB1bmlkaXJlY3Rpb25hbCBydW4uICBUaGUgcnVuIG11c3Qgbm90CisgICAgICogY29udGFpbiB0YWJzIG9yIGVtb2ppIGJ1dCBjYW4gY29udGFpbiBzdHlsZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcnVuSW5kZXggdGhlIHJ1biBpbmRleAorICAgICAqIEBwYXJhbSBzdGFydCB0aGUgbGluZS1yZWxhdGl2ZSBzdGFydCBvZiB0aGUgcnVuCisgICAgICogQHBhcmFtIG1lYXN1cmVMaW1pdCB0aGUgb2Zmc2V0IHRvIG1lYXN1cmUgdG8sIGJldHdlZW4gc3RhcnQgYW5kIGxpbWl0IGluY2x1c2l2ZQorICAgICAqIEBwYXJhbSBsaW1pdCB0aGUgbGltaXQgb2YgdGhlIHJ1bgorICAgICAqIEBwYXJhbSBydW5Jc1J0bCB0cnVlIGlmIHRoZSBydW4gaXMgcmlnaHQtdG8tbGVmdAorICAgICAqIEBwYXJhbSBjIHRoZSBjYW52YXMsIGNhbiBiZSBudWxsCisgICAgICogQHBhcmFtIHggdGhlIGVuZCBvZiB0aGUgcnVuIGNsb3Nlc3QgdG8gdGhlIGxlYWRpbmcgbWFyZ2luCisgICAgICogQHBhcmFtIHRvcCB0aGUgdG9wIG9mIHRoZSBsaW5lCisgICAgICogQHBhcmFtIHkgdGhlIGJhc2VsaW5lCisgICAgICogQHBhcmFtIGJvdHRvbSB0aGUgYm90dG9tIG9mIHRoZSBsaW5lCisgICAgICogQHBhcmFtIGZtaSByZWNlaXZlcyBtZXRyaWNzIGluZm9ybWF0aW9uLCBjYW4gYmUgbnVsbAorICAgICAqIEBwYXJhbSBuZWVkV2lkdGggdHJ1ZSBpZiB0aGUgd2lkdGggaXMgcmVxdWlyZWQKKyAgICAgKiBAcmV0dXJuIHRoZSBzaWduZWQgd2lkdGggb2YgdGhlIHJ1biBiYXNlZCBvbiB0aGUgcnVuIGRpcmVjdGlvbjsgb25seQorICAgICAqIHZhbGlkIGlmIG5lZWRXaWR0aCBpcyB0cnVlCisgICAgICovCisgICAgcHJpdmF0ZSBmbG9hdCBoYW5kbGVSdW4oaW50IHJ1bkluZGV4LCBpbnQgc3RhcnQsIGludCBtZWFzdXJlTGltaXQsCisgICAgICAgICAgICBpbnQgbGltaXQsIGJvb2xlYW4gcnVuSXNSdGwsIENhbnZhcyBjLCBmbG9hdCB4LCBpbnQgdG9wLCBpbnQgeSwKKyAgICAgICAgICAgIGludCBib3R0b20sIEZvbnRNZXRyaWNzSW50IGZtaSwgYm9vbGVhbiBuZWVkV2lkdGgpIHsKKworICAgICAgICAvLyBTaGFwaW5nIG5lZWRzIHRvIHRha2UgaW50byBhY2NvdW50IGNvbnRleHQgdXAgdG8gbWV0cmljIGJvdW5kYXJpZXMsCisgICAgICAgIC8vIGJ1dCByZW5kZXJpbmcgbmVlZHMgdG8gdGFrZSBpbnRvIGFjY291bnQgY2hhcmFjdGVyIHN0eWxlIGJvdW5kYXJpZXMuCisgICAgICAgIC8vIFNvIHdlIGl0ZXJhdGUgdGhyb3VnaCBtZXRyaWMgcnVucyB0byBnZXQgbWV0cmljIGJvdW5kcywKKyAgICAgICAgLy8gdGhlbiB3aXRoaW4gZWFjaCBtZXRyaWMgcnVuIGl0ZXJhdGUgdGhyb3VnaCBjaGFyYWN0ZXIgc3R5bGUgcnVucworICAgICAgICAvLyBmb3IgdGhlIHJ1biBib3VuZHMuCisgICAgICAgIGZsb2F0IG94ID0geDsKKyAgICAgICAgZm9yIChpbnQgaSA9IHN0YXJ0LCBpbmV4dDsgaSA8IG1lYXN1cmVMaW1pdDsgaSA9IGluZXh0KSB7CisgICAgICAgICAgICBUZXh0UGFpbnQgd3AgPSBtV29ya1BhaW50OworICAgICAgICAgICAgd3Auc2V0KG1QYWludCk7CisKKyAgICAgICAgICAgIGludCBtbGltaXQ7CisgICAgICAgICAgICBpZiAobVNwYW5uZWQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGluZXh0ID0gbGltaXQ7CisgICAgICAgICAgICAgICAgbWxpbWl0ID0gbWVhc3VyZUxpbWl0OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbmV4dCA9IG1TcGFubmVkLm5leHRTcGFuVHJhbnNpdGlvbihtU3RhcnQgKyBpLCBtU3RhcnQgKyBsaW1pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIE1ldHJpY0FmZmVjdGluZ1NwYW4uY2xhc3MpIC0gbVN0YXJ0OworCisgICAgICAgICAgICAgICAgbWxpbWl0ID0gaW5leHQgPCBtZWFzdXJlTGltaXQgPyBpbmV4dCA6IG1lYXN1cmVMaW1pdDsKKyAgICAgICAgICAgICAgICBNZXRyaWNBZmZlY3RpbmdTcGFuW10gc3BhbnMgPSBtU3Bhbm5lZC5nZXRTcGFucyhtU3RhcnQgKyBpLAorICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXJ0ICsgbWxpbWl0LCBNZXRyaWNBZmZlY3RpbmdTcGFuLmNsYXNzKTsKKworICAgICAgICAgICAgICAgIGlmIChzcGFucy5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIFJlcGxhY2VtZW50U3BhbiByZXBsYWNlbWVudCA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgc3BhbnMubGVuZ3RoOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIE1ldHJpY0FmZmVjdGluZ1NwYW4gc3BhbiA9IHNwYW5zW2pdOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNwYW4gaW5zdGFuY2VvZiBSZXBsYWNlbWVudFNwYW4pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlbWVudCA9IChSZXBsYWNlbWVudFNwYW4pc3BhbjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgbWlnaHQgaGF2ZSBhIHJlcGxhY2VtZW50IHRoYXQgdXNlcyB0aGUgZHJhdworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0YXRlLCBvdGhlcndpc2UgbWVhc3VyZSBzdGF0ZSB3b3VsZCBzdWZmaWNlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYW4udXBkYXRlRHJhd1N0YXRlKHdwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmIChyZXBsYWNlbWVudCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB4ICs9IGhhbmRsZVJlcGxhY2VtZW50KHJlcGxhY2VtZW50LCB3cCwgcnVuSW5kZXgsIGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1saW1pdCwgcnVuSXNSdGwsIGMsIHgsIHRvcCwgeSwgYm90dG9tLCBmbWksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRXaWR0aCB8fCBtbGltaXQgPCBtZWFzdXJlTGltaXQpOworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChtU3Bhbm5lZCA9PSBudWxsIHx8IGMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHggKz0gaGFuZGxlVGV4dCh3cCwgaSwgbWxpbWl0LCBpLCBpbmV4dCwgcnVuSXNSdGwsIGMsIHgsIHRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHksIGJvdHRvbSwgZm1pLCBuZWVkV2lkdGggfHwgbWxpbWl0IDwgbWVhc3VyZUxpbWl0KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IGksIGpuZXh0OyBqIDwgbWxpbWl0OyBqID0gam5leHQpIHsKKyAgICAgICAgICAgICAgICAgICAgam5leHQgPSBtU3Bhbm5lZC5uZXh0U3BhblRyYW5zaXRpb24obVN0YXJ0ICsgaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3RhcnQgKyBtbGltaXQsIENoYXJhY3RlclN0eWxlLmNsYXNzKSAtIG1TdGFydDsKKworICAgICAgICAgICAgICAgICAgICBDaGFyYWN0ZXJTdHlsZVtdIHNwYW5zID0gbVNwYW5uZWQuZ2V0U3BhbnMobVN0YXJ0ICsgaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3RhcnQgKyBqbmV4dCwgQ2hhcmFjdGVyU3R5bGUuY2xhc3MpOworCisgICAgICAgICAgICAgICAgICAgIHdwLnNldChtUGFpbnQpOworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IHNwYW5zLmxlbmd0aDsgaysrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBDaGFyYWN0ZXJTdHlsZSBzcGFuID0gc3BhbnNba107CisgICAgICAgICAgICAgICAgICAgICAgICBzcGFuLnVwZGF0ZURyYXdTdGF0ZSh3cCk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB4ICs9IGhhbmRsZVRleHQod3AsIGosIGpuZXh0LCBpLCBpbmV4dCwgcnVuSXNSdGwsIGMsIHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9wLCB5LCBib3R0b20sIGZtaSwgbmVlZFdpZHRoIHx8IGpuZXh0IDwgbWVhc3VyZUxpbWl0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4geCAtIG94OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlbmRlciBhIHRleHQgcnVuIHdpdGggdGhlIHNldC11cCBwYWludC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjIHRoZSBjYW52YXMKKyAgICAgKiBAcGFyYW0gd3AgdGhlIHBhaW50IHVzZWQgdG8gcmVuZGVyIHRoZSB0ZXh0CisgICAgICogQHBhcmFtIHN0YXJ0IHRoZSBzdGFydCBvZiB0aGUgcnVuCisgICAgICogQHBhcmFtIGVuZCB0aGUgZW5kIG9mIHRoZSBydW4KKyAgICAgKiBAcGFyYW0gY29udGV4dFN0YXJ0IHRoZSBzdGFydCBvZiBjb250ZXh0IGZvciB0aGUgcnVuCisgICAgICogQHBhcmFtIGNvbnRleHRFbmQgdGhlIGVuZCBvZiB0aGUgY29udGV4dCBmb3IgdGhlIHJ1bgorICAgICAqIEBwYXJhbSBydW5Jc1J0bCB0cnVlIGlmIHRoZSBydW4gaXMgcmlnaHQtdG8tbGVmdAorICAgICAqIEBwYXJhbSB4IHRoZSB4IHBvc2l0aW9uIG9mIHRoZSBsZWZ0IGVkZ2Ugb2YgdGhlIHJ1bgorICAgICAqIEBwYXJhbSB5IHRoZSBiYXNlbGluZSBvZiB0aGUgcnVuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGRyYXdUZXh0UnVuKENhbnZhcyBjLCBUZXh0UGFpbnQgd3AsIGludCBzdGFydCwgaW50IGVuZCwKKyAgICAgICAgICAgIGludCBjb250ZXh0U3RhcnQsIGludCBjb250ZXh0RW5kLCBib29sZWFuIHJ1bklzUnRsLCBmbG9hdCB4LCBpbnQgeSkgeworCisgICAgICAgIGludCBmbGFncyA9IHJ1bklzUnRsID8gQ2FudmFzLkRJUkVDVElPTl9SVEwgOiBDYW52YXMuRElSRUNUSU9OX0xUUjsKKyAgICAgICAgaWYgKG1DaGFyc1ZhbGlkKSB7CisgICAgICAgICAgICBpbnQgY291bnQgPSBlbmQgLSBzdGFydDsKKyAgICAgICAgICAgIGludCBjb250ZXh0Q291bnQgPSBjb250ZXh0RW5kIC0gY29udGV4dFN0YXJ0OworICAgICAgICAgICAgYy5kcmF3VGV4dFJ1bihtQ2hhcnMsIHN0YXJ0LCBjb3VudCwgY29udGV4dFN0YXJ0LCBjb250ZXh0Q291bnQsCisgICAgICAgICAgICAgICAgICAgIHgsIHksIGZsYWdzLCB3cCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpbnQgZGVsdGEgPSBtU3RhcnQ7CisgICAgICAgICAgICBjLmRyYXdUZXh0UnVuKG1UZXh0LCBkZWx0YSArIHN0YXJ0LCBkZWx0YSArIGVuZCwKKyAgICAgICAgICAgICAgICAgICAgZGVsdGEgKyBjb250ZXh0U3RhcnQsIGRlbHRhICsgY29udGV4dEVuZCwgeCwgeSwgZmxhZ3MsIHdwKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGFzY2VudCBvZiB0aGUgdGV4dCBhdCBzdGFydC4gIFRoaXMgaXMgdXNlZCBmb3Igc2NhbGluZworICAgICAqIGVtb2ppLgorICAgICAqCisgICAgICogQHBhcmFtIHBvcyB0aGUgbGluZS1yZWxhdGl2ZSBwb3NpdGlvbgorICAgICAqIEByZXR1cm4gdGhlIGFzY2VudCBvZiB0aGUgdGV4dCBhdCBzdGFydAorICAgICAqLworICAgIGZsb2F0IGFzY2VudChpbnQgcG9zKSB7CisgICAgICAgIGlmIChtU3Bhbm5lZCA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbVBhaW50LmFzY2VudCgpOworICAgICAgICB9CisKKyAgICAgICAgcG9zICs9IG1TdGFydDsKKyAgICAgICAgTWV0cmljQWZmZWN0aW5nU3BhbltdIHNwYW5zID0gbVNwYW5uZWQuZ2V0U3BhbnMocG9zLCBwb3MgKyAxLAorICAgICAgICAgICAgICAgIE1ldHJpY0FmZmVjdGluZ1NwYW4uY2xhc3MpOworICAgICAgICBpZiAoc3BhbnMubGVuZ3RoID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBtUGFpbnQuYXNjZW50KCk7CisgICAgICAgIH0KKworICAgICAgICBUZXh0UGFpbnQgd3AgPSBtV29ya1BhaW50OworICAgICAgICB3cC5zZXQobVBhaW50KTsKKyAgICAgICAgZm9yIChNZXRyaWNBZmZlY3RpbmdTcGFuIHNwYW4gOiBzcGFucykgeworICAgICAgICAgICAgc3Bhbi51cGRhdGVNZWFzdXJlU3RhdGUod3ApOworICAgICAgICB9CisgICAgICAgIHJldHVybiB3cC5hc2NlbnQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBuZXh0IHRhYiBwb3NpdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBoIHRoZSAodW5zaWduZWQpIG9mZnNldCBmcm9tIHRoZSBsZWFkaW5nIG1hcmdpbgorICAgICAqIEByZXR1cm4gdGhlICh1bnNpZ25lZCkgdGFiIHBvc2l0aW9uIGFmdGVyIHRoaXMgb2Zmc2V0CisgICAgICovCisgICAgZmxvYXQgbmV4dFRhYihmbG9hdCBoKSB7CisgICAgICAgIGlmIChtVGFicyAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbVRhYnMubmV4dFRhYihoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gVGFiU3RvcHMubmV4dERlZmF1bHRTdG9wKGgsIFRBQl9JTkNSRU1FTlQpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUQUJfSU5DUkVNRU5UID0gMjA7Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L1RleHRVdGlscy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9UZXh0VXRpbHMuamF2YQppbmRleCA5NTg5YmYzLi4yZDZjN2I2IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L1RleHRVdGlscy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvVGV4dFV0aWxzLmphdmEKQEAgLTE3LDEyICsxNywxMSBAQAogcGFja2FnZSBhbmRyb2lkLnRleHQ7CiAKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnV0aWwuQXJyYXlVdGlsczsKIAotaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQ29sb3JTdGF0ZUxpc3Q7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWw7CiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxhYmxlOwotaW1wb3J0IGFuZHJvaWQudGV4dC5tZXRob2QuVGV4dEtleUxpc3RlbmVyLkNhcGl0YWxpemU7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LnN0eWxlLkFic29sdXRlU2l6ZVNwYW47CiBpbXBvcnQgYW5kcm9pZC50ZXh0LnN0eWxlLkFsaWdubWVudFNwYW47CiBpbXBvcnQgYW5kcm9pZC50ZXh0LnN0eWxlLkJhY2tncm91bmRDb2xvclNwYW47CkBAIC00NSwxMCArNDQsOCBAQAogaW1wb3J0IGFuZHJvaWQudGV4dC5zdHlsZS5VbmRlcmxpbmVTcGFuOwogaW1wb3J0IGFuZHJvaWQudXRpbC5QcmludGVyOwogCi1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudXRpbC5BcnJheVV0aWxzOwotCi1pbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47CiBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwogCiBwdWJsaWMgY2xhc3MgVGV4dFV0aWxzIHsKICAgICBwcml2YXRlIFRleHRVdGlscygpIHsgLyogY2Fubm90IGJlIGluc3RhbnRpYXRlZCAqLyB9CkBAIC05ODMsNyArOTgwLDcgQEAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBvcmlnaW5hbCB0ZXh0IGlmIGl0IGZpdHMgaW4gdGhlIHNwZWNpZmllZCB3aWR0aAogICAgICAqIGdpdmVuIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBzcGVjaWZpZWQgUGFpbnQsCi0gICAgICogb3IsIGlmIGl0IGRvZXMgbm90IGZpdCwgYSBjb3B5IHdpdGggZWxsaXBzaXMgY2hhcmFjdGVyIGFkZGVkIAorICAgICAqIG9yLCBpZiBpdCBkb2VzIG5vdCBmaXQsIGEgY29weSB3aXRoIGVsbGlwc2lzIGNoYXJhY3RlciBhZGRlZAogICAgICAqIGF0IHRoZSBzcGVjaWZpZWQgZWRnZSBvciBjZW50ZXIuCiAgICAgICogSWYgPGNvZGU+cHJlc2VydmVMZW5ndGg8L2NvZGU+IGlzIHNwZWNpZmllZCwgdGhlIHJldHVybmVkIGNvcHkKICAgICAgKiB3aWxsIGJlIHBhZGRlZCB3aXRoIHplcm8td2lkdGggc3BhY2VzIHRvIHByZXNlcnZlIHRoZSBvcmlnaW5hbApAQCAtOTkyLDcgKzk4OSw3IEBACiAgICAgICogcmVwb3J0IHRoZSBzdGFydCBhbmQgZW5kIG9mIHRoZSBlbGxpcHNpemVkIHJhbmdlLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgQ2hhclNlcXVlbmNlIGVsbGlwc2l6ZShDaGFyU2VxdWVuY2UgdGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGV4dFBhaW50IHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRleHRQYWludCBwYWludCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYXZhaWwsIFRydW5jYXRlQXQgd2hlcmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gcHJlc2VydmVMZW5ndGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVsbGlwc2l6ZUNhbGxiYWNrIGNhbGxiYWNrKSB7CkBAIC0xMDAzLDEzICsxMDAwLDEyIEBACiAKICAgICAgICAgaW50IGxlbiA9IHRleHQubGVuZ3RoKCk7CiAKLSAgICAgICAgLy8gVXNlIFBhaW50LmJyZWFrVGV4dCgpIGZvciB0aGUgbm9uLVNwYW5uZWQgY2FzZSB0byBhdm9pZCBoYXZpbmcKLSAgICAgICAgLy8gdG8gYWxsb2NhdGUgbWVtb3J5IGFuZCBhY2N1bXVsYXRlIHRoZSBjaGFyYWN0ZXIgd2lkdGhzIG91cnNlbHZlcy4KKyAgICAgICAgTWVhc3VyZWRUZXh0IG10ID0gTWVhc3VyZWRUZXh0Lm9idGFpbigpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgZmxvYXQgd2lkdGggPSBzZXRQYXJhKG10LCBwYWludCwgdGV4dCwgMCwgdGV4dC5sZW5ndGgoKSwKKyAgICAgICAgICAgICAgICAgICAgTGF5b3V0LkRJUl9SRVFVRVNUX0RFRkFVTFRfTFRSKTsKIAotICAgICAgICBpZiAoISh0ZXh0IGluc3RhbmNlb2YgU3Bhbm5lZCkpIHsKLSAgICAgICAgICAgIGZsb2F0IHdpZCA9IHAubWVhc3VyZVRleHQodGV4dCwgMCwgbGVuKTsKLQotICAgICAgICAgICAgaWYgKHdpZCA8PSBhdmFpbCkgeworICAgICAgICAgICAgaWYgKHdpZHRoIDw9IGF2YWlsKSB7CiAgICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2suZWxsaXBzaXplZCgwLCAwKTsKICAgICAgICAgICAgICAgICB9CkBAIC0xMDE3LDI1MCArMTAxMyw2OSBAQAogICAgICAgICAgICAgICAgIHJldHVybiB0ZXh0OwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBmbG9hdCBlbGxpcHNpc3dpZCA9IHAubWVhc3VyZVRleHQoc0VsbGlwc2lzKTsKKyAgICAgICAgICAgIC8vIFhYWCBhc3N1bWVzIGVsbGlwc2lzIHN0cmluZyBkb2VzIG5vdCByZXF1aXJlIHNoYXBpbmcgYW5kCisgICAgICAgICAgICAvLyBpcyB1bmFmZmVjdGVkIGJ5IHN0eWxlCisgICAgICAgICAgICBmbG9hdCBlbGxpcHNpc3dpZCA9IHBhaW50Lm1lYXN1cmVUZXh0KHNFbGxpcHNpcyk7CisgICAgICAgICAgICBhdmFpbCAtPSBlbGxpcHNpc3dpZDsKIAotICAgICAgICAgICAgaWYgKGVsbGlwc2lzd2lkID4gYXZhaWwpIHsKLSAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2sgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5lbGxpcHNpemVkKDAsIGxlbik7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHByZXNlcnZlTGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNoYXJbXSBidWYgPSBvYnRhaW4obGVuKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgYnVmW2ldID0gJ1x1RkVGRic7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHJldCA9IG5ldyBTdHJpbmcoYnVmLCAwLCBsZW4pOwotICAgICAgICAgICAgICAgICAgICByZWN5Y2xlKGJ1Zik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICIiOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHdoZXJlID09IFRydW5jYXRlQXQuU1RBUlQpIHsKLSAgICAgICAgICAgICAgICBpbnQgZml0ID0gcC5icmVha1RleHQodGV4dCwgMCwgbGVuLCBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZhaWwgLSBlbGxpcHNpc3dpZCwgbnVsbCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2sgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5lbGxpcHNpemVkKDAsIGxlbiAtIGZpdCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHByZXNlcnZlTGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBibGFuayh0ZXh0LCAwLCBsZW4gLSBmaXQpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBzRWxsaXBzaXMgKyB0ZXh0LnRvU3RyaW5nKCkuc3Vic3RyaW5nKGxlbiAtIGZpdCwgbGVuKTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQgbGVmdCA9IDA7CisgICAgICAgICAgICBpbnQgcmlnaHQgPSBsZW47CisgICAgICAgICAgICBpZiAoYXZhaWwgPCAwKSB7CisgICAgICAgICAgICAgICAgLy8gaXQgYWxsIGdvZXMKKyAgICAgICAgICAgIH0gZWxzZSBpZiAod2hlcmUgPT0gVHJ1bmNhdGVBdC5TVEFSVCkgeworICAgICAgICAgICAgICAgIHJpZ2h0ID0gbGVuIC0gbXQuYnJlYWtUZXh0KDAsIGxlbiwgZmFsc2UsIGF2YWlsKTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAod2hlcmUgPT0gVHJ1bmNhdGVBdC5FTkQpIHsKLSAgICAgICAgICAgICAgICBpbnQgZml0ID0gcC5icmVha1RleHQodGV4dCwgMCwgbGVuLCB0cnVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmFpbCAtIGVsbGlwc2lzd2lkLCBudWxsKTsKLQotICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjayAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLmVsbGlwc2l6ZWQoZml0LCBsZW4pOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChwcmVzZXJ2ZUxlbmd0aCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmxhbmsodGV4dCwgZml0LCBsZW4pOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0ZXh0LnRvU3RyaW5nKCkuc3Vic3RyaW5nKDAsIGZpdCkgKyBzRWxsaXBzaXM7Ci0gICAgICAgICAgICAgICAgfSAKLSAgICAgICAgICAgIH0gZWxzZSAvKiB3aGVyZSA9PSBUcnVuY2F0ZUF0Lk1JRERMRSAqLyB7Ci0gICAgICAgICAgICAgICAgaW50IHJpZ2h0ID0gcC5icmVha1RleHQodGV4dCwgMCwgbGVuLCBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXZhaWwgLSBlbGxpcHNpc3dpZCkgLyAyLCBudWxsKTsKLSAgICAgICAgICAgICAgICBmbG9hdCB1c2VkID0gcC5tZWFzdXJlVGV4dCh0ZXh0LCBsZW4gLSByaWdodCwgbGVuKTsKLSAgICAgICAgICAgICAgICBpbnQgbGVmdCA9IHAuYnJlYWtUZXh0KHRleHQsIDAsIGxlbiAtIHJpZ2h0LCB0cnVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZhaWwgLSBlbGxpcHNpc3dpZCAtIHVzZWQsIG51bGwpOwotCi0gICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2suZWxsaXBzaXplZChsZWZ0LCBsZW4gLSByaWdodCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHByZXNlcnZlTGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBibGFuayh0ZXh0LCBsZWZ0LCBsZW4gLSByaWdodCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHMgPSB0ZXh0LnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBzLnN1YnN0cmluZygwLCBsZWZ0KSArIHNFbGxpcHNpcyArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzLnN1YnN0cmluZyhsZW4gLSByaWdodCwgbGVuKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBCdXQgZG8gdGhlIFNwYW5uZWQgY2FzZXMgYnkgaGFuZCwgYmVjYXVzZSBpdCdzIHN1Y2ggYSBwYWluCi0gICAgICAgIC8vIHRvIGl0ZXJhdGUgdGhlIHNwYW4gdHJhbnNpdGlvbnMgYmFja3dhcmRzIGFuZCBnZXRUZXh0V2lkdGhzKCkKLSAgICAgICAgLy8gd2lsbCBnaXZlIHVzIHRoZSBpbmZvcm1hdGlvbiB3ZSBuZWVkLgotCi0gICAgICAgIC8vIGdldFRleHRXaWR0aHMoKSBhbHdheXMgd3JpdGVzIGludG8gdGhlIHN0YXJ0IG9mIHRoZSBhcnJheSwKLSAgICAgICAgLy8gc28gbWVhc3VyZSBlYWNoIHNwYW4gaW50byB0aGUgZmlyc3QgaGFsZiBhbmQgdGhlbiBjb3B5IHRoZQotICAgICAgICAvLyByZXN1bHRzIGludG8gdGhlIHNlY29uZCBoYWxmIHRvIHVzZSBsYXRlci4KLQotICAgICAgICBmbG9hdFtdIHdpZCA9IG5ldyBmbG9hdFtsZW4gKiAyXTsKLSAgICAgICAgVGV4dFBhaW50IHRlbXBwYWludCA9IG5ldyBUZXh0UGFpbnQoKTsKLSAgICAgICAgU3Bhbm5lZCBzcCA9IChTcGFubmVkKSB0ZXh0OwotCi0gICAgICAgIGludCBuZXh0OwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSA9IG5leHQpIHsKLSAgICAgICAgICAgIG5leHQgPSBzcC5uZXh0U3BhblRyYW5zaXRpb24oaSwgbGVuLCBNZXRyaWNBZmZlY3RpbmdTcGFuLmNsYXNzKTsKLQotICAgICAgICAgICAgU3R5bGVkLmdldFRleHRXaWR0aHMocCwgdGVtcHBhaW50LCBzcCwgaSwgbmV4dCwgd2lkLCBudWxsKTsKLSAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkod2lkLCAwLCB3aWQsIGxlbiArIGksIG5leHQgLSBpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZsb2F0IHN1bSA9IDA7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLSAgICAgICAgICAgIHN1bSArPSB3aWRbbGVuICsgaV07Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc3VtIDw9IGF2YWlsKSB7Ci0gICAgICAgICAgICBpZiAoY2FsbGJhY2sgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGNhbGxiYWNrLmVsbGlwc2l6ZWQoMCwgMCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiB0ZXh0OwotICAgICAgICB9Ci0KLSAgICAgICAgZmxvYXQgZWxsaXBzaXN3aWQgPSBwLm1lYXN1cmVUZXh0KHNFbGxpcHNpcyk7Ci0KLSAgICAgICAgaWYgKGVsbGlwc2lzd2lkID4gYXZhaWwpIHsKLSAgICAgICAgICAgIGlmIChjYWxsYmFjayAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgY2FsbGJhY2suZWxsaXBzaXplZCgwLCBsZW4pOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAocHJlc2VydmVMZW5ndGgpIHsKLSAgICAgICAgICAgICAgICBjaGFyW10gYnVmID0gb2J0YWluKGxlbik7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotICAgICAgICAgICAgICAgICAgICBidWZbaV0gPSAnXHVGRUZGJzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgU3Bhbm5hYmxlU3RyaW5nIHNzID0gbmV3IFNwYW5uYWJsZVN0cmluZyhuZXcgU3RyaW5nKGJ1ZiwgMCwgbGVuKSk7Ci0gICAgICAgICAgICAgICAgcmVjeWNsZShidWYpOwotICAgICAgICAgICAgICAgIGNvcHlTcGFuc0Zyb20oc3AsIDAsIGxlbiwgT2JqZWN0LmNsYXNzLCBzcywgMCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHNzOworICAgICAgICAgICAgICAgIGxlZnQgPSBtdC5icmVha1RleHQoMCwgbGVuLCB0cnVlLCBhdmFpbCk7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiAiIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICh3aGVyZSA9PSBUcnVuY2F0ZUF0LlNUQVJUKSB7Ci0gICAgICAgICAgICBzdW0gPSAwOwotICAgICAgICAgICAgaW50IGk7Ci0KLSAgICAgICAgICAgIGZvciAoaSA9IGxlbjsgaSA+PSAwOyBpLS0pIHsKLSAgICAgICAgICAgICAgICBmbG9hdCB3ID0gd2lkW2xlbiArIGkgLSAxXTsKLQotICAgICAgICAgICAgICAgIGlmICh3ICsgc3VtICsgZWxsaXBzaXN3aWQgPiBhdmFpbCkgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBzdW0gKz0gdzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGNhbGxiYWNrICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjYWxsYmFjay5lbGxpcHNpemVkKDAsIGkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAocHJlc2VydmVMZW5ndGgpIHsKLSAgICAgICAgICAgICAgICBTcGFubmFibGVTdHJpbmcgc3MgPSBuZXcgU3Bhbm5hYmxlU3RyaW5nKGJsYW5rKHRleHQsIDAsIGkpKTsKLSAgICAgICAgICAgICAgICBjb3B5U3BhbnNGcm9tKHNwLCAwLCBsZW4sIE9iamVjdC5jbGFzcywgc3MsIDApOwotICAgICAgICAgICAgICAgIHJldHVybiBzczsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlciBvdXQgPSBuZXcgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlcihzRWxsaXBzaXMpOwotICAgICAgICAgICAgICAgIG91dC5pbnNlcnQoMSwgdGV4dCwgaSwgbGVuKTsKLQotICAgICAgICAgICAgICAgIHJldHVybiBvdXQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAod2hlcmUgPT0gVHJ1bmNhdGVBdC5FTkQpIHsKLSAgICAgICAgICAgIHN1bSA9IDA7Ci0gICAgICAgICAgICBpbnQgaTsKLQotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgZmxvYXQgdyA9IHdpZFtsZW4gKyBpXTsKLQotICAgICAgICAgICAgICAgIGlmICh3ICsgc3VtICsgZWxsaXBzaXN3aWQgPiBhdmFpbCkgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBzdW0gKz0gdzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGNhbGxiYWNrICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjYWxsYmFjay5lbGxpcHNpemVkKGksIGxlbik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChwcmVzZXJ2ZUxlbmd0aCkgewotICAgICAgICAgICAgICAgIFNwYW5uYWJsZVN0cmluZyBzcyA9IG5ldyBTcGFubmFibGVTdHJpbmcoYmxhbmsodGV4dCwgaSwgbGVuKSk7Ci0gICAgICAgICAgICAgICAgY29weVNwYW5zRnJvbShzcCwgMCwgbGVuLCBPYmplY3QuY2xhc3MsIHNzLCAwKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gc3M7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIFNwYW5uYWJsZVN0cmluZ0J1aWxkZXIgb3V0ID0gbmV3IFNwYW5uYWJsZVN0cmluZ0J1aWxkZXIoc0VsbGlwc2lzKTsKLSAgICAgICAgICAgICAgICBvdXQuaW5zZXJ0KDAsIHRleHQsIDAsIGkpOwotCi0gICAgICAgICAgICAgICAgcmV0dXJuIG91dDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIC8qIHdoZXJlID0gVHJ1bmNhdGVBdC5NSURETEUgKi8gewotICAgICAgICAgICAgZmxvYXQgbHN1bSA9IDAsIHJzdW0gPSAwOwotICAgICAgICAgICAgaW50IGxlZnQgPSAwLCByaWdodCA9IGxlbjsKLQotICAgICAgICAgICAgZmxvYXQgcmF2YWlsID0gKGF2YWlsIC0gZWxsaXBzaXN3aWQpIC8gMjsKLSAgICAgICAgICAgIGZvciAocmlnaHQgPSBsZW47IHJpZ2h0ID49IDA7IHJpZ2h0LS0pIHsKLSAgICAgICAgICAgICAgICBmbG9hdCB3ID0gd2lkW2xlbiArIHJpZ2h0IC0gMV07Ci0KLSAgICAgICAgICAgICAgICBpZiAodyArIHJzdW0gPiByYXZhaWwpIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcnN1bSArPSB3OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmbG9hdCBsYXZhaWwgPSBhdmFpbCAtIGVsbGlwc2lzd2lkIC0gcnN1bTsKLSAgICAgICAgICAgIGZvciAobGVmdCA9IDA7IGxlZnQgPCByaWdodDsgbGVmdCsrKSB7Ci0gICAgICAgICAgICAgICAgZmxvYXQgdyA9IHdpZFtsZW4gKyBsZWZ0XTsKLQotICAgICAgICAgICAgICAgIGlmICh3ICsgbHN1bSA+IGxhdmFpbCkgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBsc3VtICs9IHc7CisgICAgICAgICAgICAgICAgcmlnaHQgPSBsZW4gLSBtdC5icmVha1RleHQoMCwgbGVuLCBmYWxzZSwgYXZhaWwgLyAyKTsKKyAgICAgICAgICAgICAgICBhdmFpbCAtPSBtdC5tZWFzdXJlKHJpZ2h0LCBsZW4pOworICAgICAgICAgICAgICAgIGxlZnQgPSBtdC5icmVha1RleHQoMCwgcmlnaHQsIHRydWUsIGF2YWlsKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaWYgKGNhbGxiYWNrICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICBjYWxsYmFjay5lbGxpcHNpemVkKGxlZnQsIHJpZ2h0KTsKICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgY2hhcltdIGJ1ZiA9IG10Lm1DaGFyczsKKyAgICAgICAgICAgIFNwYW5uZWQgc3AgPSB0ZXh0IGluc3RhbmNlb2YgU3Bhbm5lZCA/IChTcGFubmVkKSB0ZXh0IDogbnVsbDsKKworICAgICAgICAgICAgaW50IHJlbWFpbmluZyA9IGxlbiAtIChyaWdodCAtIGxlZnQpOwogICAgICAgICAgICAgaWYgKHByZXNlcnZlTGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgU3Bhbm5hYmxlU3RyaW5nIHNzID0gbmV3IFNwYW5uYWJsZVN0cmluZyhibGFuayh0ZXh0LCBsZWZ0LCByaWdodCkpOworICAgICAgICAgICAgICAgIGlmIChyZW1haW5pbmcgPiAwKSB7IC8vIGVsc2UgZWxpbWluYXRlIHRoZSBlbGxpcHNpcyB0b28KKyAgICAgICAgICAgICAgICAgICAgYnVmW2xlZnQrK10gPSAnXHUyMDI2JzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IGxlZnQ7IGkgPCByaWdodDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGJ1ZltpXSA9ICdcdUZFRkYnOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBTdHJpbmcgcyA9IG5ldyBTdHJpbmcoYnVmLCAwLCBsZW4pOworICAgICAgICAgICAgICAgIGlmIChzcCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBTcGFubmFibGVTdHJpbmcgc3MgPSBuZXcgU3Bhbm5hYmxlU3RyaW5nKHMpOwogICAgICAgICAgICAgICAgIGNvcHlTcGFuc0Zyb20oc3AsIDAsIGxlbiwgT2JqZWN0LmNsYXNzLCBzcywgMCk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIHNzOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBTcGFubmFibGVTdHJpbmdCdWlsZGVyIG91dCA9IG5ldyBTcGFubmFibGVTdHJpbmdCdWlsZGVyKHNFbGxpcHNpcyk7Ci0gICAgICAgICAgICAgICAgb3V0Lmluc2VydCgwLCB0ZXh0LCAwLCBsZWZ0KTsKLSAgICAgICAgICAgICAgICBvdXQuaW5zZXJ0KG91dC5sZW5ndGgoKSwgdGV4dCwgcmlnaHQsIGxlbik7Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gb3V0OwogICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQogCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGJsYW5rKENoYXJTZXF1ZW5jZSBzb3VyY2UsIGludCBzdGFydCwgaW50IGVuZCkgewotICAgICAgICBpbnQgbGVuID0gc291cmNlLmxlbmd0aCgpOwotICAgICAgICBjaGFyW10gYnVmID0gb2J0YWluKGxlbik7Ci0KLSAgICAgICAgaWYgKHN0YXJ0ICE9IDApIHsKLSAgICAgICAgICAgIGdldENoYXJzKHNvdXJjZSwgMCwgc3RhcnQsIGJ1ZiwgMCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGVuZCAhPSBsZW4pIHsKLSAgICAgICAgICAgIGdldENoYXJzKHNvdXJjZSwgZW5kLCBsZW4sIGJ1ZiwgZW5kKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChzdGFydCAhPSBlbmQpIHsKLSAgICAgICAgICAgIGJ1ZltzdGFydF0gPSAnXHUyMDI2JzsKLQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IHN0YXJ0ICsgMTsgaSA8IGVuZDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgYnVmW2ldID0gJ1x1RkVGRic7CisgICAgICAgICAgICBpZiAocmVtYWluaW5nID09IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gIiI7CiAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAKLSAgICAgICAgU3RyaW5nIHJldCA9IG5ldyBTdHJpbmcoYnVmLCAwLCBsZW4pOwotICAgICAgICByZWN5Y2xlKGJ1Zik7CiAKLSAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgIGlmIChzcCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKHJlbWFpbmluZyArIHNFbGxpcHNpcy5sZW5ndGgoKSk7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKGJ1ZiwgMCwgbGVmdCk7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKHNFbGxpcHNpcyk7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKGJ1ZiwgcmlnaHQsIGxlbiAtIHJpZ2h0KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlciBzc2IgPSBuZXcgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgc3NiLmFwcGVuZCh0ZXh0LCAwLCBsZWZ0KTsKKyAgICAgICAgICAgIHNzYi5hcHBlbmQoc0VsbGlwc2lzKTsKKyAgICAgICAgICAgIHNzYi5hcHBlbmQodGV4dCwgcmlnaHQsIGxlbik7CisgICAgICAgICAgICByZXR1cm4gc3NiOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgTWVhc3VyZWRUZXh0LnJlY3ljbGUobXQpOworICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCkBAIC0xMjc4LDgwICsxMDkzLDEyMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRleHRQYWludCBwLCBmbG9hdCBhdmFpbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgb25lTW9yZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbW9yZSkgewotICAgICAgICBpbnQgbGVuID0gdGV4dC5sZW5ndGgoKTsKLSAgICAgICAgY2hhcltdIGJ1ZiA9IG5ldyBjaGFyW2xlbl07Ci0gICAgICAgIFRleHRVdGlscy5nZXRDaGFycyh0ZXh0LCAwLCBsZW4sIGJ1ZiwgMCk7CiAKLSAgICAgICAgaW50IGNvbW1hQ291bnQgPSAwOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoYnVmW2ldID09ICcsJykgewotICAgICAgICAgICAgICAgIGNvbW1hQ291bnQrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGZsb2F0W10gd2lkOwotCi0gICAgICAgIGlmICh0ZXh0IGluc3RhbmNlb2YgU3Bhbm5lZCkgewotICAgICAgICAgICAgU3Bhbm5lZCBzcCA9IChTcGFubmVkKSB0ZXh0OwotICAgICAgICAgICAgVGV4dFBhaW50IHRlbXBwYWludCA9IG5ldyBUZXh0UGFpbnQoKTsKLSAgICAgICAgICAgIHdpZCA9IG5ldyBmbG9hdFtsZW4gKiAyXTsKLQotICAgICAgICAgICAgaW50IG5leHQ7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSA9IG5leHQpIHsKLSAgICAgICAgICAgICAgICBuZXh0ID0gc3AubmV4dFNwYW5UcmFuc2l0aW9uKGksIGxlbiwgTWV0cmljQWZmZWN0aW5nU3Bhbi5jbGFzcyk7Ci0KLSAgICAgICAgICAgICAgICBTdHlsZWQuZ2V0VGV4dFdpZHRocyhwLCB0ZW1wcGFpbnQsIHNwLCBpLCBuZXh0LCB3aWQsIG51bGwpOwotICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkod2lkLCAwLCB3aWQsIGxlbiArIGksIG5leHQgLSBpKTsKKyAgICAgICAgTWVhc3VyZWRUZXh0IG10ID0gTWVhc3VyZWRUZXh0Lm9idGFpbigpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IGxlbiA9IHRleHQubGVuZ3RoKCk7CisgICAgICAgICAgICBmbG9hdCB3aWR0aCA9IHNldFBhcmEobXQsIHAsIHRleHQsIDAsIGxlbiwgTGF5b3V0LkRJUl9SRVFVRVNUX0RFRkFVTFRfTFRSKTsKKyAgICAgICAgICAgIGlmICh3aWR0aCA8PSBhdmFpbCkgeworICAgICAgICAgICAgICAgIHJldHVybiB0ZXh0OwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHdpZCwgbGVuLCB3aWQsIDAsIGxlbik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB3aWQgPSBuZXcgZmxvYXRbbGVuXTsKLSAgICAgICAgICAgIHAuZ2V0VGV4dFdpZHRocyh0ZXh0LCAwLCBsZW4sIHdpZCk7Ci0gICAgICAgIH0KKyAgICAgICAgICAgIGNoYXJbXSBidWYgPSBtdC5tQ2hhcnM7CiAKLSAgICAgICAgaW50IG9rID0gMDsKLSAgICAgICAgaW50IG9rUmVtYWluaW5nID0gY29tbWFDb3VudCArIDE7Ci0gICAgICAgIFN0cmluZyBva0Zvcm1hdCA9ICIiOwotCi0gICAgICAgIGludCB3ID0gMDsKLSAgICAgICAgaW50IGNvdW50ID0gMDsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0gICAgICAgICAgICB3ICs9IHdpZFtpXTsKLQotICAgICAgICAgICAgaWYgKGJ1ZltpXSA9PSAnLCcpIHsKLSAgICAgICAgICAgICAgICBjb3VudCsrOwotCi0gICAgICAgICAgICAgICAgaW50IHJlbWFpbmluZyA9IGNvbW1hQ291bnQgLSBjb3VudCArIDE7Ci0gICAgICAgICAgICAgICAgZmxvYXQgbW9yZVdpZDsKLSAgICAgICAgICAgICAgICBTdHJpbmcgZm9ybWF0OwotCi0gICAgICAgICAgICAgICAgaWYgKHJlbWFpbmluZyA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvcm1hdCA9ICIgIiArIG9uZU1vcmU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZm9ybWF0ID0gIiAiICsgU3RyaW5nLmZvcm1hdChtb3JlLCByZW1haW5pbmcpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIG1vcmVXaWQgPSBwLm1lYXN1cmVUZXh0KGZvcm1hdCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAodyArIG1vcmVXaWQgPD0gYXZhaWwpIHsKLSAgICAgICAgICAgICAgICAgICAgb2sgPSBpICsgMTsKLSAgICAgICAgICAgICAgICAgICAgb2tSZW1haW5pbmcgPSByZW1haW5pbmc7Ci0gICAgICAgICAgICAgICAgICAgIG9rRm9ybWF0ID0gZm9ybWF0OworICAgICAgICAgICAgaW50IGNvbW1hQ291bnQgPSAwOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChidWZbaV0gPT0gJywnKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbW1hQ291bnQrKzsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0gICAgICAgIH0KIAotICAgICAgICBpZiAodyA8PSBhdmFpbCkgewotICAgICAgICAgICAgcmV0dXJuIHRleHQ7Ci0gICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpbnQgcmVtYWluaW5nID0gY29tbWFDb3VudCArIDE7CisKKyAgICAgICAgICAgIGludCBvayA9IDA7CisgICAgICAgICAgICBpbnQgb2tSZW1haW5pbmcgPSByZW1haW5pbmc7CisgICAgICAgICAgICBTdHJpbmcgb2tGb3JtYXQgPSAiIjsKKworICAgICAgICAgICAgaW50IHcgPSAwOworICAgICAgICAgICAgaW50IGNvdW50ID0gMDsKKyAgICAgICAgICAgIGZsb2F0W10gd2lkdGhzID0gbXQubVdpZHRoczsKKworICAgICAgICAgICAgaW50IHJlcXVlc3QgPSBtdC5tRGlyID09IDEgPyBMYXlvdXQuRElSX1JFUVVFU1RfTFRSIDoKKyAgICAgICAgICAgICAgICBMYXlvdXQuRElSX1JFUVVFU1RfUlRMOworCisgICAgICAgICAgICBNZWFzdXJlZFRleHQgdGVtcE10ID0gTWVhc3VyZWRUZXh0Lm9idGFpbigpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgeworICAgICAgICAgICAgICAgIHcgKz0gd2lkdGhzW2ldOworCisgICAgICAgICAgICAgICAgaWYgKGJ1ZltpXSA9PSAnLCcpIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQrKzsKKworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZm9ybWF0OworICAgICAgICAgICAgICAgICAgICAvLyBYWFggc2hvdWxkIG5vdCBpbnNlcnQgc3BhY2VzLCBzaG91bGQgYmUgcGFydCBvZiBzdHJpbmcKKyAgICAgICAgICAgICAgICAgICAgLy8gWFhYIHNob3VsZCB1c2UgcGx1cmFsIHJ1bGVzIGFuZCBub3QgYXNzdW1lIEVuZ2xpc2ggcGx1cmFscworICAgICAgICAgICAgICAgICAgICBpZiAoLS1yZW1haW5pbmcgPT0gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0ID0gIiAiICsgb25lTW9yZTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCA9ICIgIiArIFN0cmluZy5mb3JtYXQobW9yZSwgcmVtYWluaW5nKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vIFhYWCB0aGlzIGlzIHByb2JhYmx5IG9rLCBidXQgbmVlZCB0byBsb29rIGF0IGl0IG1vcmUKKyAgICAgICAgICAgICAgICAgICAgdGVtcE10LnNldFBhcmEoZm9ybWF0LCAwLCBmb3JtYXQubGVuZ3RoKCksIHJlcXVlc3QpOworICAgICAgICAgICAgICAgICAgICBmbG9hdCBtb3JlV2lkID0gbXQuYWRkU3R5bGVSdW4ocCwgbXQubUxlbiwgbnVsbCk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHcgKyBtb3JlV2lkIDw9IGF2YWlsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvayA9IGkgKyAxOworICAgICAgICAgICAgICAgICAgICAgICAgb2tSZW1haW5pbmcgPSByZW1haW5pbmc7CisgICAgICAgICAgICAgICAgICAgICAgICBva0Zvcm1hdCA9IGZvcm1hdDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIE1lYXN1cmVkVGV4dC5yZWN5Y2xlKHRlbXBNdCk7CisKICAgICAgICAgICAgIFNwYW5uYWJsZVN0cmluZ0J1aWxkZXIgb3V0ID0gbmV3IFNwYW5uYWJsZVN0cmluZ0J1aWxkZXIob2tGb3JtYXQpOwogICAgICAgICAgICAgb3V0Lmluc2VydCgwLCB0ZXh0LCAwLCBvayk7CiAgICAgICAgICAgICByZXR1cm4gb3V0OworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgTWVhc3VyZWRUZXh0LnJlY3ljbGUobXQpOwogICAgICAgICB9CiAgICAgfQogCisgICAgcHJpdmF0ZSBzdGF0aWMgZmxvYXQgc2V0UGFyYShNZWFzdXJlZFRleHQgbXQsIFRleHRQYWludCBwYWludCwKKyAgICAgICAgICAgIENoYXJTZXF1ZW5jZSB0ZXh0LCBpbnQgc3RhcnQsIGludCBlbmQsIGludCBiaWRpUmVxdWVzdCkgeworCisgICAgICAgIG10LnNldFBhcmEodGV4dCwgc3RhcnQsIGVuZCwgYmlkaVJlcXVlc3QpOworCisgICAgICAgIGZsb2F0IHdpZHRoOworICAgICAgICBTcGFubmVkIHNwID0gdGV4dCBpbnN0YW5jZW9mIFNwYW5uZWQgPyAoU3Bhbm5lZCkgdGV4dCA6IG51bGw7CisgICAgICAgIGludCBsZW4gPSBlbmQgLSBzdGFydDsKKyAgICAgICAgaWYgKHNwID09IG51bGwpIHsKKyAgICAgICAgICAgIHdpZHRoID0gbXQuYWRkU3R5bGVSdW4ocGFpbnQsIGxlbiwgbnVsbCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB3aWR0aCA9IDA7CisgICAgICAgICAgICBpbnQgc3BhbkVuZDsKKyAgICAgICAgICAgIGZvciAoaW50IHNwYW5TdGFydCA9IDA7IHNwYW5TdGFydCA8IGxlbjsgc3BhblN0YXJ0ID0gc3BhbkVuZCkgeworICAgICAgICAgICAgICAgIHNwYW5FbmQgPSBzcC5uZXh0U3BhblRyYW5zaXRpb24oc3BhblN0YXJ0LCBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICBNZXRyaWNBZmZlY3RpbmdTcGFuLmNsYXNzKTsKKyAgICAgICAgICAgICAgICBNZXRyaWNBZmZlY3RpbmdTcGFuW10gc3BhbnMgPSBzcC5nZXRTcGFucygKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwYW5TdGFydCwgc3BhbkVuZCwgTWV0cmljQWZmZWN0aW5nU3Bhbi5jbGFzcyk7CisgICAgICAgICAgICAgICAgd2lkdGggKz0gbXQuYWRkU3R5bGVSdW4ocGFpbnQsIHNwYW5zLCBzcGFuRW5kIC0gc3BhblN0YXJ0LCBudWxsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB3aWR0aDsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIEZJUlNUX1JJR0hUX1RPX0xFRlQgPSAnXHUwNTkwJzsKKworICAgIC8qIHBhY2thZ2UgKi8KKyAgICBzdGF0aWMgYm9vbGVhbiBkb2VzTm90TmVlZEJpZGkoQ2hhclNlcXVlbmNlIHMsIGludCBzdGFydCwgaW50IGVuZCkgeworICAgICAgICBmb3IgKGludCBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykgeworICAgICAgICAgICAgaWYgKHMuY2hhckF0KGkpID49IEZJUlNUX1JJR0hUX1RPX0xFRlQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLyogcGFja2FnZSAqLworICAgIHN0YXRpYyBib29sZWFuIGRvZXNOb3ROZWVkQmlkaShjaGFyW10gdGV4dCwgaW50IHN0YXJ0LCBpbnQgbGVuKSB7CisgICAgICAgIGZvciAoaW50IGkgPSBzdGFydCwgZSA9IGkgKyBsZW47IGkgPCBlOyBpKyspIHsKKyAgICAgICAgICAgIGlmICh0ZXh0W2ldID49IEZJUlNUX1JJR0hUX1RPX0xFRlQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCiAgICAgLyogcGFja2FnZSAqLyBzdGF0aWMgY2hhcltdIG9idGFpbihpbnQgbGVuKSB7CiAgICAgICAgIGNoYXJbXSBidWY7CiAKQEAgLTE1MjksNyArMTM4NSw3IEBACiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0FQX01PREVfQ0hBUkFDVEVSUwogICAgICAgICAgICAgPSBJbnB1dFR5cGUuVFlQRV9URVhUX0ZMQUdfQ0FQX0NIQVJBQ1RFUlM7Ci0gICAgCisKICAgICAvKioKICAgICAgKiBDYXBpdGFsaXphdGlvbiBtb2RlIGZvciB7QGxpbmsgI2dldENhcHNNb2RlfTogY2FwaXRhbGl6ZSB0aGUgZmlyc3QKICAgICAgKiBjaGFyYWN0ZXIgb2YgYWxsIHdvcmRzLiAgVGhpcyB2YWx1ZSBpcyBleHBsaWNpdGx5IGRlZmluZWQgdG8gYmUgdGhlIHNhbWUgYXMKQEAgLTE1MzcsNyArMTM5Myw3IEBACiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0FQX01PREVfV09SRFMKICAgICAgICAgICAgID0gSW5wdXRUeXBlLlRZUEVfVEVYVF9GTEFHX0NBUF9XT1JEUzsKLSAgICAKKwogICAgIC8qKgogICAgICAqIENhcGl0YWxpemF0aW9uIG1vZGUgZm9yIHtAbGluayAjZ2V0Q2Fwc01vZGV9OiBjYXBpdGFsaXplIHRoZSBmaXJzdAogICAgICAqIGNoYXJhY3RlciBvZiBlYWNoIHNlbnRlbmNlLiAgVGhpcyB2YWx1ZSBpcyBleHBsaWNpdGx5IGRlZmluZWQgdG8gYmUgdGhlIHNhbWUgYXMKQEAgLTE1NDUsMTMgKzE0MDEsMTMgQEAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDQVBfTU9ERV9TRU5URU5DRVMKICAgICAgICAgICAgID0gSW5wdXRUeXBlLlRZUEVfVEVYVF9GTEFHX0NBUF9TRU5URU5DRVM7Ci0gICAgCisKICAgICAvKioKICAgICAgKiBEZXRlcm1pbmUgd2hhdCBjYXBzIG1vZGUgc2hvdWxkIGJlIGluIGVmZmVjdCBhdCB0aGUgY3VycmVudCBvZmZzZXQgaW4KICAgICAgKiB0aGUgdGV4dC4gIE9ubHkgdGhlIG1vZGUgYml0cyBzZXQgaW4gPHZhcj5yZXFNb2RlczwvdmFyPiB3aWxsIGJlCiAgICAgICogY2hlY2tlZC4gIE5vdGUgdGhhdCB0aGUgY2FwcyBtb2RlIGZsYWdzIGhlcmUgYXJlIGV4cGxpY2l0bHkgZGVmaW5lZAogICAgICAqIHRvIG1hdGNoIHRob3NlIGluIHtAbGluayBJbnB1dFR5cGV9LgotICAgICAqIAorICAgICAqCiAgICAgICogQHBhcmFtIGNzIFRoZSB0ZXh0IHRoYXQgc2hvdWxkIGJlIGNoZWNrZWQgZm9yIGNhcHMgbW9kZXMuCiAgICAgICogQHBhcmFtIG9mZiBMb2NhdGlvbiBpbiB0aGUgdGV4dCBhdCB3aGljaCB0byBjaGVjay4KICAgICAgKiBAcGFyYW0gcmVxTW9kZXMgVGhlIG1vZGVzIHRvIGJlIGNoZWNrZWQ6IG1heSBiZSBhbnkgY29tYmluYXRpb24gb2YKQEAgLTE2NTEsNyArMTUwNyw3IEBACiAKICAgICAgICAgcmV0dXJuIG1vZGU7CiAgICAgfQotICAgIAorCiAgICAgcHJpdmF0ZSBzdGF0aWMgT2JqZWN0IHNMb2NrID0gbmV3IE9iamVjdCgpOwogICAgIHByaXZhdGUgc3RhdGljIGNoYXJbXSBzVGVtcCA9IG51bGw7CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L21ldGhvZC9Ub3VjaC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9tZXRob2QvVG91Y2guamF2YQppbmRleCA0MmFkMTBlLi5jMzBkYjIwIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L21ldGhvZC9Ub3VjaC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvbWV0aG9kL1RvdWNoLmphdmEKQEAgLTE4LDEzICsxOCwxMiBAQAogCiBpbXBvcnQgYW5kcm9pZC50ZXh0LkxheW91dDsKIGltcG9ydCBhbmRyb2lkLnRleHQuTm9Db3B5U3BhbjsKLWltcG9ydCBhbmRyb2lkLnRleHQuTGF5b3V0LkFsaWdubWVudDsKIGltcG9ydCBhbmRyb2lkLnRleHQuU3Bhbm5hYmxlOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC50ZXh0LkxheW91dC5BbGlnbm1lbnQ7CitpbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OwogaW1wb3J0IGFuZHJvaWQudmlldy5Nb3Rpb25FdmVudDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0NvbmZpZ3VyYXRpb247CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OwogCiBwdWJsaWMgY2xhc3MgVG91Y2ggewogICAgIHByaXZhdGUgVG91Y2goKSB7IH0KQEAgLTQ1LDYgKzQ0LDcgQEAKICAgICAgICAgaW50IGxlZnQgPSBJbnRlZ2VyLk1BWF9WQUxVRTsKICAgICAgICAgaW50IHJpZ2h0ID0gMDsKICAgICAgICAgQWxpZ25tZW50IGEgPSBudWxsOworICAgICAgICBib29sZWFuIGx0ciA9IHRydWU7CiAKICAgICAgICAgZm9yIChpbnQgaSA9IHRvcDsgaSA8PSBib3R0b207IGkrKykgewogICAgICAgICAgICAgbGVmdCA9IChpbnQpIE1hdGgubWluKGxlZnQsIGxheW91dC5nZXRMaW5lTGVmdChpKSk7CkBAIC01Miw2ICs1Miw3IEBACiAKICAgICAgICAgICAgIGlmIChhID09IG51bGwpIHsKICAgICAgICAgICAgICAgICBhID0gbGF5b3V0LmdldFBhcmFncmFwaEFsaWdubWVudChpKTsKKyAgICAgICAgICAgICAgICBsdHIgPSBsYXlvdXQuZ2V0UGFyYWdyYXBoRGlyZWN0aW9uKGkpID4gMDsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC01OSwxMCArNjAsMTIgQEAKICAgICAgICAgaW50IHdpZHRoID0gd2lkZ2V0LmdldFdpZHRoKCk7CiAgICAgICAgIGludCBkaWZmID0gMDsKIAorICAgICAgICAvLyBhbGlnbl9vcHBvc2l0ZSBkb2VzIE5PVCBtZWFuIGFsaWduX3JpZ2h0LCB3ZSBuZWVkIHRoZSBwYXJhZ3JhcGgKKyAgICAgICAgLy8gZGlyZWN0aW9uIHRvIHJlc29sdmUgaXQgdG8gbGVmdCBvciByaWdodAogICAgICAgICBpZiAocmlnaHQgLSBsZWZ0IDwgd2lkdGggLSBwYWRkaW5nKSB7CiAgICAgICAgICAgICBpZiAoYSA9PSBBbGlnbm1lbnQuQUxJR05fQ0VOVEVSKSB7CiAgICAgICAgICAgICAgICAgZGlmZiA9ICh3aWR0aCAtIHBhZGRpbmcgLSAocmlnaHQgLSBsZWZ0KSkgLyAyOwotICAgICAgICAgICAgfSBlbHNlIGlmIChhID09IEFsaWdubWVudC5BTElHTl9PUFBPU0lURSkgeworICAgICAgICAgICAgfSBlbHNlIGlmIChsdHIgPT0gKGEgPT0gQWxpZ25tZW50LkFMSUdOX09QUE9TSVRFKSkgewogICAgICAgICAgICAgICAgIGRpZmYgPSB3aWR0aCAtIHBhZGRpbmcgLSAocmlnaHQgLSBsZWZ0KTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdXRpbC9DaGFyc2V0VXRpbHMuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3V0aWwvQ2hhcnNldFV0aWxzLmphdmEKaW5kZXggOWQ5MWFjYS4uYTc2M2E2OSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdXRpbC9DaGFyc2V0VXRpbHMuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC91dGlsL0NoYXJzZXRVdGlscy5qYXZhCkBAIC0xNywzNiArMTcsNTggQEAKIHBhY2thZ2UgYW5kcm9pZC51dGlsOwogCiBpbXBvcnQgYW5kcm9pZC5vcy5CdWlsZDsKK2ltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwogCiBpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0OwogaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuSWxsZWdhbENoYXJzZXROYW1lRXhjZXB0aW9uOwogaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuVW5zdXBwb3J0ZWRDaGFyc2V0RXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CiAKIC8qKgorICogPHA+CiAgKiBBIGNsYXNzIGNvbnRhaW5pbmcgdXRpbGl0eSBtZXRob2RzIHJlbGF0ZWQgdG8gY2hhcmFjdGVyIHNldHMuIFRoaXMKICAqIGNsYXNzIGlzIHByaW1hcmlseSB1c2VmdWwgZm9yIGNvZGUgdGhhdCB3aXNoZXMgdG8gYmUgdmVuZG9yLWF3YXJlCi0gKiBpbiBpdHMgaW50ZXJwcmV0YXRpb24gb2YgSmFwYW5lc2UgZW5jb2RpbmcgbmFtZXMuCi0gKiAKLSAqIDxwPkFzIG9mIHRoaXMgd3JpdGluZywgdGhlIG9ubHkgdmVuZG9yIHRoYXQgaXMgcmVjb2duaXplZCBieSB0aGlzCi0gKiBjbGFzcyBpcyBEb2NvbW8gKGlkZW50aWZpZWQgY2FzZS1pbnNlbnNpdGl2ZWx5IGFzIHtAY29kZSAiZG9jb21vIn0pLjwvcD4KLSAqIAotICogPGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MgaXMgaGlkZGVuIGluIEN1cGNha2UsIHdpdGggYSBwbGFuIHRvCi0gKiB1bi1oaWRlIGluIERvbnV0LiBUaGlzIHdhcyBkb25lIGJlY2F1c2UgdGhlIGZpcnN0IGRlcGxveW1lbnQgdG8gdXNlCi0gKiB0aGlzIGNvZGUgaXMgYmFzZWQgb24gQ3VwY2FrZSwgYnV0IHRoZSBBUEkgaGFkIHRvIGJlIGludHJvZHVjZWQKLSAqIGFmdGVyIHRoZSBwdWJsaWMgQVBJIGZyZWV6ZSBmb3IgdGhhdCByZWxlYXNlLiBUaGUgdXBzaG90IGlzIHRoYXQKLSAqIG9ubHkgc3lzdGVtIGFwcGxpY2F0aW9ucyBjYW4gc2FmZWx5IHVzZSB0aGlzIGNsYXNzIHVudGlsIERvbnV0IGlzCi0gKiBhdmFpbGFibGUuCi0gKiAKKyAqIGluIGl0cyBpbnRlcnByZXRhdGlvbiBvZiBKYXBhbmVzZSBjaGFyc2V0IG5hbWVzICh1c2VkIGluIERvQ29NbywKKyAqIEtEREksIGFuZCBTb2Z0QmFuaykuCisgKiA8L3A+CisgKgorICogPHA+CisgKiA8Yj5Ob3RlOjwvYj4gRGV2ZWxvcGVycyB3aWxsIG5lZWQgdG8gYWRkIGFuIGFwcHJvcHJpYXRlIG1hcHBpbmcgZm9yCisgKiBlYWNoIHZlbmRvci1zcGVjaWZpYyBjaGFyc2V0LiBZb3UgbWF5IG5lZWQgdG8gbW9kaWZ5IHRoZSBDIGxpYnJhcmllcworICogbGlrZSBpY3U0YyBpbiBvcmRlciB0byBsZXQgQW5kcm9pZCBzdXBwb3J0IGFuIGFkZGl0aW9uYWwgY2hhcnNldC4KKyAqIDwvcD4KKyAqCiAgKiBAaGlkZQogICovCiBwdWJsaWMgZmluYWwgY2xhc3MgQ2hhcnNldFV0aWxzIHsKICAgICAvKioKLSAgICAgKiBuYW1lIG9mIHRoZSB2ZW5kb3IgIkRvY29tbyIuIDxiPk5vdGU6PC9iPiBUaGlzIGlzbid0IGEgcHVibGljCisgICAgICogbmFtZSBvZiB0aGUgdmVuZG9yICJEb0NvTW8iLiA8Yj5Ob3RlOjwvYj4gVGhpcyBpc24ndCBhIHB1YmxpYwogICAgICAqIGNvbnN0YW50LCBpbiBvcmRlciB0byBrZWVwIHRoaXMgY2xhc3MgZnJvbSBiZWNvbWluZyBhIGRlIGZhY3RvCiAgICAgICogcmVmZXJlbmNlIGxpc3Qgb2YgdmVuZG9yIG5hbWVzLgogICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWRU5ET1JfRE9DT01PID0gImRvY29tbyI7Ci0gICAgCisgICAgLyoqCisgICAgICogTmFtZSBvZiB0aGUgdmVuZG9yICJLRERJIi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkVORE9SX0tEREkgPSAia2RkaSI7CisgICAgLyoqCisgICAgICogTmFtZSBvZiB0aGUgdmVuZG9yICJTb2Z0QmFuayIuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZFTkRPUl9TT0ZUQkFOSyA9ICJzb2Z0YmFuayI7CisKKyAgICAvKioKKyAgICAgKiBSZXByZXNlbnRzIG9uZS10by1vbmUgbWFwcGluZyBmcm9tIGEgdmVuZG9yIG5hbWUgdG8gYSBjaGFyc2V0IHNwZWNpZmljIHRvIHRoZSB2ZW5kb3IuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPFN0cmluZywgU3RyaW5nPiBzVmVuZG9yU2hpZnRKaXNNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKworICAgIHN0YXRpYyB7CisgICAgICAgIC8vIFRoZXNlIHZhcmlhbnRzIG9mIFNoaWZ0X0pJUyBjb21lIGZyb20gaWN1J3MgbWFwcGluZyBkYXRhIChjb252cnRycy50eHQpCisgICAgICAgIHNWZW5kb3JTaGlmdEppc01hcC5wdXQoVkVORE9SX0RPQ09NTywgImRvY29tby1zaGlmdF9qaXMtMjAwNyIpOworICAgICAgICBzVmVuZG9yU2hpZnRKaXNNYXAucHV0KFZFTkRPUl9LRERJLCAia2RkaS1zaGlmdF9qaXMtMjAwNyIpOworICAgICAgICBzVmVuZG9yU2hpZnRKaXNNYXAucHV0KFZFTkRPUl9TT0ZUQkFOSywgInNvZnRiYW5rLXNoaWZ0X2ppcy0yMDA3Iik7CisgICAgfQorCiAgICAgLyoqCiAgICAgICogVGhpcyBjbGFzcyBpcyB1bmluc3RhbnRpYWJsZS4KICAgICAgKi8KQEAgLTU4LDIwICs4MCwyMiBAQAogICAgICAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIHZlbmRvci1zcGVjaWZpYyBjaGFyYWN0ZXIgc2V0CiAgICAgICogY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gb3JpZ2luYWwgY2hhcmFjdGVyIHNldCBuYW1lIGFuZAogICAgICAqIHZlbmRvci4gSWYgdGhlcmUgaXMgbm8gdmVuZG9yLXNwZWNpZmljIGNoYXJhY3RlciBzZXQgZm9yIHRoZQotICAgICAqIGdpdmVuIG5hbWUvdmVuZG9yIHBhaXIsIHRoaXMgcmV0dXJucyB0aGUgb3JpZ2luYWwgY2hhcmFjdGVyIHNldAotICAgICAqIG5hbWUuIFRoZSB2ZW5kb3IgbmFtZSBpcyBtYXRjaGVkIGNhc2UtaW5zZW5zaXRpdmVseS4KLSAgICAgKiAKKyAgICAgKiBnaXZlbiBuYW1lL3ZlbmRvciBwYWlyLCB0aGlzIHJldHVybnMgdGhlIG9yaWdpbmFsIGNoYXJhY3RlciBzZXQgbmFtZS4KKyAgICAgKgogICAgICAqIEBwYXJhbSBjaGFyc2V0TmFtZSB0aGUgYmFzZSBjaGFyYWN0ZXIgc2V0IG5hbWUKLSAgICAgKiBAcGFyYW0gdmVuZG9yIHRoZSB2ZW5kb3IgdG8gc3BlY2lhbGl6ZSBmb3IKKyAgICAgKiBAcGFyYW0gdmVuZG9yIHRoZSB2ZW5kb3IgdG8gc3BlY2lhbGl6ZSBmb3IuIEFsbCBjaGFyYWN0ZXJzIHNob3VsZCBiZSBsb3dlci1jYXNlZC4KICAgICAgKiBAcmV0dXJuIHRoZSBzcGVjaWFsaXplZCBjaGFyYWN0ZXIgc2V0IG5hbWUsIG9yIHtAY29kZSBjaGFyc2V0TmFtZX0gaWYKICAgICAgKiB0aGVyZSBpcyBubyBzcGVjaWFsaXplZCBuYW1lCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgbmFtZUZvclZlbmRvcihTdHJpbmcgY2hhcnNldE5hbWUsIFN0cmluZyB2ZW5kb3IpIHsKLSAgICAgICAgLy8gVE9ETzogRXZlbnR1YWxseSwgdGhpcyBtYXkgd2FudCB0byBiZSB0YWJsZS1kcml2ZW4uCi0KLSAgICAgICAgaWYgKHZlbmRvci5lcXVhbHNJZ25vcmVDYXNlKFZFTkRPUl9ET0NPTU8pCi0gICAgICAgICAgICAgICAgJiYgaXNTaGlmdEppcyhjaGFyc2V0TmFtZSkpIHsKLSAgICAgICAgICAgIHJldHVybiAiZG9jb21vLXNoaWZ0X2ppcy0yMDA3IjsKKyAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShjaGFyc2V0TmFtZSkgJiYgIVRleHRVdGlscy5pc0VtcHR5KHZlbmRvcikpIHsKKyAgICAgICAgICAgIC8vIFlvdSBjYW4gYWRkIHlvdXIgb3duIG1hcHBpbmcgaGVyZS4KKyAgICAgICAgICAgIGlmIChpc1NoaWZ0SmlzKGNoYXJzZXROYW1lKSkgeworICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB2ZW5kb3JTaGlmdEppcyA9IHNWZW5kb3JTaGlmdEppc01hcC5nZXQodmVuZG9yKTsKKyAgICAgICAgICAgICAgICBpZiAodmVuZG9yU2hpZnRKaXMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmVuZG9yU2hpZnRKaXM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgcmV0dXJuIGNoYXJzZXROYW1lOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdXRpbC9QYXR0ZXJucy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdXRpbC9QYXR0ZXJucy5qYXZhCmluZGV4IDVjYmZkMjkuLjNiY2QyNjYgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3V0aWwvUGF0dGVybnMuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC91dGlsL1BhdHRlcm5zLmphdmEKQEAgLTI1LDcgKzI1LDcgQEAKIHB1YmxpYyBjbGFzcyBQYXR0ZXJucyB7CiAgICAgLyoqCiAgICAgICogIFJlZ3VsYXIgZXhwcmVzc2lvbiB0byBtYXRjaCBhbGwgSUFOQSB0b3AtbGV2ZWwgZG9tYWlucy4KLSAgICAgKiAgTGlzdCBhY2N1cmF0ZSBhcyBvZiAyMDEwLzAyLzA1LiAgTGlzdCB0YWtlbiBmcm9tOgorICAgICAqICBMaXN0IGFjY3VyYXRlIGFzIG9mIDIwMTAvMDUvMDYuICBMaXN0IHRha2VuIGZyb206CiAgICAgICogIGh0dHA6Ly9kYXRhLmlhbmEub3JnL1RMRC90bGRzLWFscGhhLWJ5LWRvbWFpbi50eHQKICAgICAgKiAgVGhpcyBwYXR0ZXJuIGlzIGF1dG8tZ2VuZXJhdGVkIGJ5IGZyYW1ld29ya3MvYmFzZS9jb21tb24vdG9vbHMvbWFrZS1pYW5hLXRsZC1wYXR0ZXJuLnB5CiAgICAgICovCkBAIC01Myw4ICs1Myw4IEBACiAgICAgICAgICsgInx1W2Fna3N5el0iCiAgICAgICAgICsgInx2W2FjZWdpbnVdIgogICAgICAgICArICJ8d1tmc10iCi0gICAgICAgICsgInwoeG5cXC1cXC0wendtNTZkfHhuXFwtXFwtMTFiNWJzM2E5YWo2Z3x4blxcLVxcLTgwYWtoYnlrbmo0Znx4blxcLVxcLTl0NGIxMXlpNWF8eG5cXC1cXC1kZWJhMGFkfHhuXFwtXFwtZzZ3MjUxZHx4blxcLVxcLWhnYms2YWo3ZjUzYmJhfHhuXFwtXFwtaGxjajZheWE5ZXNjN2F8eG5cXC1cXC1qeGFscGRscHx4blxcLVxcLWtnYmVjaHR2fHhuXFwtXFwtemNremFoKSIKLSAgICAgICAgKyAifHlbZXR1XSIKKyAgICAgICAgKyAifCh4blxcLVxcLTB6d201NmR8eG5cXC1cXC0xMWI1YnMzYTlhajZnfHhuXFwtXFwtODBha2hieWtuajRmfHhuXFwtXFwtOXQ0YjExeWk1YXx4blxcLVxcLWRlYmEwYWR8eG5cXC1cXC1nNncyNTFkfHhuXFwtXFwtaGdiazZhajdmNTNiYmF8eG5cXC1cXC1obGNqNmF5YTllc2M3YXx4blxcLVxcLWp4YWxwZGxwfHhuXFwtXFwta2diZWNodHZ8eG5cXC1cXC1tZ2JhYW03YThofHhuXFwtXFwtbWdiZXJwNGE1ZDRhcnx4blxcLVxcLXdnYmgxY3x4blxcLVxcLXpja3phaCkiCisgICAgICAgICsgInx5W2V0XSIKICAgICAgICAgKyAifHpbYW13XSkiOwogCiAgICAgLyoqCkBAIC02NSw3ICs2NSw3IEBACiAKICAgICAvKioKICAgICAgKiAgUmVndWxhciBleHByZXNzaW9uIHRvIG1hdGNoIGFsbCBJQU5BIHRvcC1sZXZlbCBkb21haW5zIGZvciBXRUJfVVJMLgotICAgICAqICBMaXN0IGFjY3VyYXRlIGFzIG9mIDIwMTAvMDIvMDUuICBMaXN0IHRha2VuIGZyb206CisgICAgICogIExpc3QgYWNjdXJhdGUgYXMgb2YgMjAxMC8wNS8wNi4gIExpc3QgdGFrZW4gZnJvbToKICAgICAgKiAgaHR0cDovL2RhdGEuaWFuYS5vcmcvVExEL3RsZHMtYWxwaGEtYnktZG9tYWluLnR4dAogICAgICAqICBUaGlzIHBhdHRlcm4gaXMgYXV0by1nZW5lcmF0ZWQgYnkgZnJhbWV3b3Jrcy9iYXNlL2NvbW1vbi90b29scy9tYWtlLWlhbmEtdGxkLXBhdHRlcm4ucHkKICAgICAgKi8KQEAgLTk0LDggKzk0LDggQEAKICAgICAgICAgKyAifHVbYWdrc3l6XSIKICAgICAgICAgKyAifHZbYWNlZ2ludV0iCiAgICAgICAgICsgInx3W2ZzXSIKLSAgICAgICAgKyAifCg/OnhuXFwtXFwtMHp3bTU2ZHx4blxcLVxcLTExYjViczNhOWFqNmd8eG5cXC1cXC04MGFraGJ5a25qNGZ8eG5cXC1cXC05dDRiMTF5aTVhfHhuXFwtXFwtZGViYTBhZHx4blxcLVxcLWc2dzI1MWR8eG5cXC1cXC1oZ2JrNmFqN2Y1M2JiYXx4blxcLVxcLWhsY2o2YXlhOWVzYzdhfHhuXFwtXFwtanhhbHBkbHB8eG5cXC1cXC1rZ2JlY2h0dnx4blxcLVxcLXpja3phaCkiCi0gICAgICAgICsgInx5W2V0dV0iCisgICAgICAgICsgInwoPzp4blxcLVxcLTB6d201NmR8eG5cXC1cXC0xMWI1YnMzYTlhajZnfHhuXFwtXFwtODBha2hieWtuajRmfHhuXFwtXFwtOXQ0YjExeWk1YXx4blxcLVxcLWRlYmEwYWR8eG5cXC1cXC1nNncyNTFkfHhuXFwtXFwtaGdiazZhajdmNTNiYmF8eG5cXC1cXC1obGNqNmF5YTllc2M3YXx4blxcLVxcLWp4YWxwZGxwfHhuXFwtXFwta2diZWNodHZ8eG5cXC1cXC1tZ2JhYW03YThofHhuXFwtXFwtbWdiZXJwNGE1ZDRhcnx4blxcLVxcLXdnYmgxY3x4blxcLVxcLXpja3phaCkiCisgICAgICAgICsgInx5W2V0XSIKICAgICAgICAgKyAifHpbYW13XSkpIjsKIAogICAgIC8qKgpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9BY3Rpb25CYXJWaWV3LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L0FjdGlvbkJhclZpZXcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTQyYzUwCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9BY3Rpb25CYXJWaWV3LmphdmEKQEAgLTAsMCArMSw1MjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQudmlldzsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLlI7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5tZW51LkFjdGlvbk1lbnU7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5tZW51LkFjdGlvbk1lbnVJdGVtOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcubWVudS5BY3Rpb25NZW51VmlldzsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuTWVudUJ1aWxkZXI7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpb25CYXI7CitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aW9uQmFyLkNhbGxiYWNrOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5BcHBsaWNhdGlvbkluZm87CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuVHlwZWRBcnJheTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBvcnRlckR1ZmY7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Qb3J0ZXJEdWZmQ29sb3JGaWx0ZXI7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OworaW1wb3J0IGFuZHJvaWQudXRpbC5EaXNwbGF5TWV0cmljczsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuU3BhcnNlQXJyYXk7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQWRhcHRlclZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuSW1hZ2VWaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlNwaW5uZXI7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuU3Bpbm5lckFkYXB0ZXI7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7CisKKy8qKgorICogQGhpZGUKKyAqLworcHVibGljIGNsYXNzIEFjdGlvbkJhclZpZXcgZXh0ZW5kcyBWaWV3R3JvdXAgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiQWN0aW9uQmFyVmlldyI7CisgICAgCisgICAgLy8gVE9ETzogVGhpcyBtdXN0IGJlIGRlZmluZWQgaW4gdGhlIGRlZmF1bHQgdGhlbWUKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ09OVEVOVF9IRUlHSFRfRElQID0gNTA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENPTlRFTlRfUEFERElOR19ESVAgPSAzOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDT05URU5UX1NQQUNJTkdfRElQID0gNjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ09OVEVOVF9BQ1RJT05fU1BBQ0lOR19ESVAgPSAxMjsKKyAgICAKKyAgICAvKioKKyAgICAgKiBEaXNwbGF5IG9wdGlvbnMgYXBwbGllZCBieSBkZWZhdWx0CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElTUExBWV9ERUZBVUxUID0gMDsKKworICAgIC8qKgorICAgICAqIERpc3BsYXkgb3B0aW9ucyB0aGF0IHJlcXVpcmUgcmUtbGF5b3V0IGFzIG9wcG9zZWQgdG8gYSBzaW1wbGUgaW52YWxpZGF0ZQorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBESVNQTEFZX1JFTEFZT1VUX01BU0sgPQorICAgICAgICAgICAgQWN0aW9uQmFyLkRJU1BMQVlfSElERV9IT01FIHwKKyAgICAgICAgICAgIEFjdGlvbkJhci5ESVNQTEFZX1VTRV9MT0dPOworICAgIAorICAgIHByaXZhdGUgZmluYWwgaW50IG1Db250ZW50SGVpZ2h0OworCisgICAgcHJpdmF0ZSBpbnQgbU5hdmlnYXRpb25Nb2RlOworICAgIHByaXZhdGUgaW50IG1EaXNwbGF5T3B0aW9uczsKKyAgICBwcml2YXRlIGludCBtU3BhY2luZzsKKyAgICBwcml2YXRlIGludCBtQWN0aW9uU3BhY2luZzsKKyAgICBwcml2YXRlIENoYXJTZXF1ZW5jZSBtVGl0bGU7CisgICAgcHJpdmF0ZSBDaGFyU2VxdWVuY2UgbVN1YnRpdGxlOworICAgIHByaXZhdGUgRHJhd2FibGUgbUljb247CisgICAgcHJpdmF0ZSBEcmF3YWJsZSBtTG9nbzsKKworICAgIHByaXZhdGUgSW1hZ2VWaWV3IG1JY29uVmlldzsKKyAgICBwcml2YXRlIEltYWdlVmlldyBtTG9nb1ZpZXc7CisgICAgcHJpdmF0ZSBUZXh0VmlldyBtVGl0bGVWaWV3OworICAgIHByaXZhdGUgVGV4dFZpZXcgbVN1YnRpdGxlVmlldzsKKyAgICBwcml2YXRlIFNwaW5uZXIgbVNwaW5uZXI7CisgICAgcHJpdmF0ZSBWaWV3IG1DdXN0b21OYXZWaWV3OworICAgIAorICAgIHByaXZhdGUgYm9vbGVhbiBtU2hvd01lbnU7CisKKyAgICBwcml2YXRlIE1lbnVCdWlsZGVyIG1PcHRpb25zTWVudTsKKyAgICBwcml2YXRlIEFjdGlvbk1lbnVWaWV3IG1NZW51VmlldzsKKyAgICAKKyAgICBwcml2YXRlIEFjdGlvbk1lbnVJdGVtIG1Mb2dvTmF2SXRlbTsKKyAgICAKKyAgICBwcml2YXRlIFNwYXJzZUFycmF5PEFjdGlvbk1lbnU+IG1Db250ZXh0TWVudXM7CisgICAgCisgICAgcHJpdmF0ZSBDYWxsYmFjayBtQ2FsbGJhY2s7CisKKyAgICBwcml2YXRlIGZpbmFsIEFkYXB0ZXJWaWV3Lk9uSXRlbVNlbGVjdGVkTGlzdGVuZXIgbU5hdkl0ZW1TZWxlY3RlZExpc3RlbmVyID0KKyAgICAgICAgICAgIG5ldyBBZGFwdGVyVmlldy5Pbkl0ZW1TZWxlY3RlZExpc3RlbmVyKCkgeworICAgICAgICBwdWJsaWMgdm9pZCBvbkl0ZW1TZWxlY3RlZChBZGFwdGVyVmlldyBwYXJlbnQsIFZpZXcgdmlldywgaW50IHBvc2l0aW9uLCBsb25nIGlkKSB7CisgICAgICAgICAgICBpZiAobUNhbGxiYWNrICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtQ2FsbGJhY2sub25OYXZpZ2F0aW9uSXRlbVNlbGVjdGVkKHBvc2l0aW9uLCBpZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIHZvaWQgb25Ob3RoaW5nU2VsZWN0ZWQoQWRhcHRlclZpZXcgcGFyZW50KSB7CisgICAgICAgICAgICAvLyBEbyBub3RoaW5nCisgICAgICAgIH0KKyAgICB9OworCisgICAgcHJpdmF0ZSBPbkNsaWNrTGlzdGVuZXIgbUhvbWVDbGlja0xpc3RlbmVyID0gbnVsbDsKKworICAgIHB1YmxpYyBBY3Rpb25CYXJWaWV3KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7CisgICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzKTsKKworICAgICAgICBmaW5hbCBEaXNwbGF5TWV0cmljcyBtZXRyaWNzID0gY29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXREaXNwbGF5TWV0cmljcygpOworICAgICAgICBtQ29udGVudEhlaWdodCA9IChpbnQpIChDT05URU5UX0hFSUdIVF9ESVAgKiBtZXRyaWNzLmRlbnNpdHkgKyAwLjVmKTsKKworICAgICAgICBUeXBlZEFycmF5IGEgPSBjb250ZXh0Lm9idGFpblN0eWxlZEF0dHJpYnV0ZXMoYXR0cnMsIFIuc3R5bGVhYmxlLkFjdGlvbkJhcik7CisKKyAgICAgICAgZmluYWwgaW50IGNvbG9yRmlsdGVyID0gYS5nZXRDb2xvcihSLnN0eWxlYWJsZS5BY3Rpb25CYXJfY29sb3JGaWx0ZXIsIDApOworCisgICAgICAgIGlmIChjb2xvckZpbHRlciAhPSAwKSB7CisgICAgICAgICAgICBmaW5hbCBEcmF3YWJsZSBkID0gZ2V0QmFja2dyb3VuZCgpOworICAgICAgICAgICAgZC5zZXREaXRoZXIodHJ1ZSk7CisgICAgICAgICAgICBkLnNldENvbG9yRmlsdGVyKG5ldyBQb3J0ZXJEdWZmQ29sb3JGaWx0ZXIoY29sb3JGaWx0ZXIsIFBvcnRlckR1ZmYuTW9kZS5PVkVSTEFZKSk7CisgICAgICAgIH0KKworICAgICAgICBBcHBsaWNhdGlvbkluZm8gaW5mbyA9IGNvbnRleHQuZ2V0QXBwbGljYXRpb25JbmZvKCk7CisgICAgICAgIFBhY2thZ2VNYW5hZ2VyIHBtID0gY29udGV4dC5nZXRQYWNrYWdlTWFuYWdlcigpOworICAgICAgICBtTmF2aWdhdGlvbk1vZGUgPSBhLmdldEludChSLnN0eWxlYWJsZS5BY3Rpb25CYXJfbmF2aWdhdGlvbk1vZGUsIEFjdGlvbkJhci5OQVZJR0FUSU9OX01PREVfU1RBTkRBUkQpOworICAgICAgICBtVGl0bGUgPSBhLmdldFRleHQoUi5zdHlsZWFibGUuQWN0aW9uQmFyX3RpdGxlKTsKKyAgICAgICAgbVN1YnRpdGxlID0gYS5nZXRUZXh0KFIuc3R5bGVhYmxlLkFjdGlvbkJhcl9zdWJ0aXRsZSk7CisgICAgICAgIG1EaXNwbGF5T3B0aW9ucyA9IGEuZ2V0SW50KFIuc3R5bGVhYmxlLkFjdGlvbkJhcl9kaXNwbGF5T3B0aW9ucywgRElTUExBWV9ERUZBVUxUKTsKKyAgICAgICAgCisgICAgICAgIG1Mb2dvID0gYS5nZXREcmF3YWJsZShSLnN0eWxlYWJsZS5BY3Rpb25CYXJfbG9nbyk7CisgICAgICAgIGlmIChtTG9nbyA9PSBudWxsKSB7CisgICAgICAgICAgICBtTG9nbyA9IGluZm8ubG9hZExvZ28ocG0pOworICAgICAgICB9CisgICAgICAgIG1JY29uID0gYS5nZXREcmF3YWJsZShSLnN0eWxlYWJsZS5BY3Rpb25CYXJfaWNvbik7CisgICAgICAgIGlmIChtSWNvbiA9PSBudWxsKSB7CisgICAgICAgICAgICBtSWNvbiA9IGluZm8ubG9hZEljb24ocG0pOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBEcmF3YWJsZSBiYWNrZ3JvdW5kID0gYS5nZXREcmF3YWJsZShSLnN0eWxlYWJsZS5BY3Rpb25CYXJfYmFja2dyb3VuZCk7CisgICAgICAgIGlmIChiYWNrZ3JvdW5kICE9IG51bGwpIHsKKyAgICAgICAgICAgIHNldEJhY2tncm91bmREcmF3YWJsZShiYWNrZ3JvdW5kKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgZmluYWwgaW50IGN1c3RvbU5hdklkID0gYS5nZXRSZXNvdXJjZUlkKFIuc3R5bGVhYmxlLkFjdGlvbkJhcl9jdXN0b21OYXZpZ2F0aW9uTGF5b3V0LCAwKTsKKyAgICAgICAgaWYgKGN1c3RvbU5hdklkICE9IDApIHsKKyAgICAgICAgICAgIExheW91dEluZmxhdGVyIGluZmxhdGVyID0gTGF5b3V0SW5mbGF0ZXIuZnJvbShjb250ZXh0KTsKKyAgICAgICAgICAgIG1DdXN0b21OYXZWaWV3ID0gKFZpZXcpIGluZmxhdGVyLmluZmxhdGUoY3VzdG9tTmF2SWQsIG51bGwpOworICAgICAgICAgICAgbU5hdmlnYXRpb25Nb2RlID0gQWN0aW9uQmFyLk5BVklHQVRJT05fTU9ERV9DVVNUT007CisgICAgICAgIH0KKworICAgICAgICBhLnJlY3ljbGUoKTsKKworICAgICAgICAvLyBUT0RPOiBTZXQgdGhpcyBpbiB0aGUgdGhlbWUKKyAgICAgICAgaW50IHBhZGRpbmcgPSAoaW50KSAoQ09OVEVOVF9QQURESU5HX0RJUCAqIG1ldHJpY3MuZGVuc2l0eSArIDAuNWYpOworICAgICAgICBzZXRQYWRkaW5nKHBhZGRpbmcsIHBhZGRpbmcsIHBhZGRpbmcsIHBhZGRpbmcpOworCisgICAgICAgIG1TcGFjaW5nID0gKGludCkgKENPTlRFTlRfU1BBQ0lOR19ESVAgKiBtZXRyaWNzLmRlbnNpdHkgKyAwLjVmKTsKKyAgICAgICAgbUFjdGlvblNwYWNpbmcgPSAoaW50KSAoQ09OVEVOVF9BQ1RJT05fU1BBQ0lOR19ESVAgKiBtZXRyaWNzLmRlbnNpdHkgKyAwLjVmKTsKKyAgICAgICAgCisgICAgICAgIGlmIChtTG9nbyAhPSBudWxsIHx8IG1JY29uICE9IG51bGwgfHwgbVRpdGxlICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1Mb2dvTmF2SXRlbSA9IG5ldyBBY3Rpb25NZW51SXRlbShjb250ZXh0LCAwLCBhbmRyb2lkLlIuaWQuaG9tZSwgMCwgMCwgbVRpdGxlKTsKKyAgICAgICAgICAgIG1Ib21lQ2xpY2tMaXN0ZW5lciA9IG5ldyBPbkNsaWNrTGlzdGVuZXIoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKKyAgICAgICAgICAgICAgICAgICAgQ29udGV4dCBjb250ZXh0ID0gZ2V0Q29udGV4dCgpOworICAgICAgICAgICAgICAgICAgICBpZiAoY29udGV4dCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBY3Rpdml0eSBhY3Rpdml0eSA9IChBY3Rpdml0eSkgY29udGV4dDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2aXR5Lm9uT3B0aW9uc0l0ZW1TZWxlY3RlZChtTG9nb05hdkl0ZW0pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgbUNvbnRleHRNZW51cyA9IG5ldyBTcGFyc2VBcnJheTxBY3Rpb25NZW51PigpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBzZXRDYWxsYmFjayhDYWxsYmFjayBjYWxsYmFjaykgeworICAgICAgICBtQ2FsbGJhY2sgPSBjYWxsYmFjazsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgc2V0TWVudShNZW51IG1lbnUpIHsKKyAgICAgICAgTWVudUJ1aWxkZXIgYnVpbGRlciA9IChNZW51QnVpbGRlcikgbWVudTsKKyAgICAgICAgbU9wdGlvbnNNZW51ID0gYnVpbGRlcjsKKyAgICAgICAgaWYgKG1NZW51VmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICByZW1vdmVWaWV3KG1NZW51Vmlldyk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgQWN0aW9uTWVudVZpZXcgbWVudVZpZXcgPSAoQWN0aW9uTWVudVZpZXcpIGJ1aWxkZXIuZ2V0TWVudVZpZXcoCisgICAgICAgICAgICAgICAgTWVudUJ1aWxkZXIuVFlQRV9BQ1RJT05fQlVUVE9OLCBudWxsKTsKKyAgICAgICAgbUFjdGlvblNwYWNpbmcgPSBtZW51Vmlldy5nZXRJdGVtTWFyZ2luKCk7CisgICAgICAgIGZpbmFsIExheW91dFBhcmFtcyBsYXlvdXRQYXJhbXMgPSBuZXcgTGF5b3V0UGFyYW1zKExheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQsCisgICAgICAgICAgICAgICAgTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCk7CisgICAgICAgIG1lbnVWaWV3LnNldExheW91dFBhcmFtcyhsYXlvdXRQYXJhbXMpOworICAgICAgICBhZGRWaWV3KG1lbnVWaWV3KTsKKyAgICAgICAgbU1lbnVWaWV3ID0gbWVudVZpZXc7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHNldEN1c3RvbU5hdmlnYXRpb25WaWV3KFZpZXcgdmlldykgeworICAgICAgICBtQ3VzdG9tTmF2VmlldyA9IHZpZXc7CisgICAgICAgIGlmICh2aWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHNldE5hdmlnYXRpb25Nb2RlKEFjdGlvbkJhci5OQVZJR0FUSU9OX01PREVfQ1VTVE9NKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgQ2hhclNlcXVlbmNlIGdldFRpdGxlKCkgeworICAgICAgICByZXR1cm4gbVRpdGxlOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBzZXRUaXRsZShDaGFyU2VxdWVuY2UgdGl0bGUpIHsKKyAgICAgICAgbVRpdGxlID0gdGl0bGU7CisgICAgICAgIGlmIChtVGl0bGVWaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1UaXRsZVZpZXcuc2V0VGV4dCh0aXRsZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1Mb2dvTmF2SXRlbSAhPSBudWxsKSB7CisgICAgICAgICAgICBtTG9nb05hdkl0ZW0uc2V0VGl0bGUodGl0bGUpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHB1YmxpYyBDaGFyU2VxdWVuY2UgZ2V0U3VidGl0bGUoKSB7CisgICAgICAgIHJldHVybiBtU3VidGl0bGU7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHNldFN1YnRpdGxlKENoYXJTZXF1ZW5jZSBzdWJ0aXRsZSkgeworICAgICAgICBtU3VidGl0bGUgPSBzdWJ0aXRsZTsKKyAgICAgICAgaWYgKG1TdWJ0aXRsZVZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgbVN1YnRpdGxlVmlldy5zZXRUZXh0KHN1YnRpdGxlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBzZXREaXNwbGF5T3B0aW9ucyhpbnQgb3B0aW9ucykgeworICAgICAgICBmaW5hbCBpbnQgZmxhZ3NDaGFuZ2VkID0gb3B0aW9ucyBeIG1EaXNwbGF5T3B0aW9uczsKKyAgICAgICAgbURpc3BsYXlPcHRpb25zID0gb3B0aW9uczsKKyAgICAgICAgaWYgKChmbGFnc0NoYW5nZWQgJiBESVNQTEFZX1JFTEFZT1VUX01BU0spICE9IDApIHsKKyAgICAgICAgICAgIGZpbmFsIGludCB2aXMgPSAob3B0aW9ucyAmIEFjdGlvbkJhci5ESVNQTEFZX0hJREVfSE9NRSkgIT0gMCA/IEdPTkUgOiBWSVNJQkxFOworICAgICAgICAgICAgaWYgKG1Mb2dvVmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUxvZ29WaWV3LnNldFZpc2liaWxpdHkodmlzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtSWNvblZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1JY29uVmlldy5zZXRWaXNpYmlsaXR5KHZpcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHJlcXVlc3RMYXlvdXQoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGludmFsaWRhdGUoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE5hdmlnYXRpb25Nb2RlKGludCBtb2RlKSB7CisgICAgICAgIGZpbmFsIGludCBvbGRNb2RlID0gbU5hdmlnYXRpb25Nb2RlOworICAgICAgICBpZiAobW9kZSAhPSBvbGRNb2RlKSB7CisgICAgICAgICAgICBzd2l0Y2ggKG9sZE1vZGUpIHsKKyAgICAgICAgICAgIGNhc2UgQWN0aW9uQmFyLk5BVklHQVRJT05fTU9ERV9TVEFOREFSRDoKKyAgICAgICAgICAgICAgICBpZiAobVRpdGxlVmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHJlbW92ZVZpZXcobVRpdGxlVmlldyk7CisgICAgICAgICAgICAgICAgICAgIG1UaXRsZVZpZXcgPSBudWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQWN0aW9uQmFyLk5BVklHQVRJT05fTU9ERV9EUk9QRE9XTl9MSVNUOgorICAgICAgICAgICAgICAgIGlmIChtU3Bpbm5lciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHJlbW92ZVZpZXcobVNwaW5uZXIpOworICAgICAgICAgICAgICAgICAgICBtU3Bpbm5lciA9IG51bGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBY3Rpb25CYXIuTkFWSUdBVElPTl9NT0RFX0NVU1RPTToKKyAgICAgICAgICAgICAgICBpZiAobUN1c3RvbU5hdlZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICByZW1vdmVWaWV3KG1DdXN0b21OYXZWaWV3KTsKKyAgICAgICAgICAgICAgICAgICAgbUN1c3RvbU5hdlZpZXcgPSBudWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgc3dpdGNoIChtb2RlKSB7CisgICAgICAgICAgICBjYXNlIEFjdGlvbkJhci5OQVZJR0FUSU9OX01PREVfU1RBTkRBUkQ6CisgICAgICAgICAgICAgICAgaW5pdFRpdGxlKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFjdGlvbkJhci5OQVZJR0FUSU9OX01PREVfRFJPUERPV05fTElTVDoKKyAgICAgICAgICAgICAgICBtU3Bpbm5lciA9IG5ldyBTcGlubmVyKG1Db250ZXh0LCBudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hdHRyLmRyb3BEb3duU3Bpbm5lclN0eWxlKTsKKyAgICAgICAgICAgICAgICBtU3Bpbm5lci5zZXRPbkl0ZW1TZWxlY3RlZExpc3RlbmVyKG1OYXZJdGVtU2VsZWN0ZWRMaXN0ZW5lcik7CisgICAgICAgICAgICAgICAgbVNwaW5uZXIuc2V0TGF5b3V0UGFyYW1zKG5ldyBMYXlvdXRQYXJhbXMoTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIExheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQpKTsKKyAgICAgICAgICAgICAgICBhZGRWaWV3KG1TcGlubmVyKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQWN0aW9uQmFyLk5BVklHQVRJT05fTU9ERV9DVVNUT006CisgICAgICAgICAgICAgICAgbUN1c3RvbU5hdlZpZXcuc2V0TGF5b3V0UGFyYW1zKG5ldyBMYXlvdXRQYXJhbXMoTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIExheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQpKTsKKyAgICAgICAgICAgICAgICBhZGRWaWV3KG1DdXN0b21OYXZWaWV3KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1OYXZpZ2F0aW9uTW9kZSA9IG1vZGU7CisgICAgICAgICAgICByZXF1ZXN0TGF5b3V0KCk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgc2V0RHJvcGRvd25BZGFwdGVyKFNwaW5uZXJBZGFwdGVyIGFkYXB0ZXIpIHsKKyAgICAgICAgbVNwaW5uZXIuc2V0QWRhcHRlcihhZGFwdGVyKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIFZpZXcgZ2V0Q3VzdG9tTmF2aWdhdGlvblZpZXcoKSB7CisgICAgICAgIHJldHVybiBtQ3VzdG9tTmF2VmlldzsKKyAgICB9CisgICAgCisgICAgcHVibGljIGludCBnZXROYXZpZ2F0aW9uTW9kZSgpIHsKKyAgICAgICAgcmV0dXJuIG1OYXZpZ2F0aW9uTW9kZTsKKyAgICB9CisgICAgCisgICAgcHVibGljIGludCBnZXREaXNwbGF5T3B0aW9ucygpIHsKKyAgICAgICAgcmV0dXJuIG1EaXNwbGF5T3B0aW9uczsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgc2V0Q29udGV4dE1vZGUoaW50IG1vZGUpIHsKKyAgICAgICAgQ2FsbGJhY2sgY2FsbGJhY2sgPSBtQ2FsbGJhY2s7CisgICAgICAgIGlmIChjYWxsYmFjayA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiQXR0ZW1wdGVkIHRvIHNldCBBY3Rpb25CYXIgY29udGV4dCBtb2RlIHdpdGggbm8gY2FsbGJhY2siKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgQWN0aW9uTWVudSBtZW51ID0gbUNvbnRleHRNZW51cy5nZXQobW9kZSk7CisgICAgICAgIGlmIChtZW51ID09IG51bGwpIHsKKyAgICAgICAgICAgIC8vIEluaXRpYWxpemUgdGhlIG5ldyBtb2RlCisgICAgICAgICAgICBtZW51ID0gbmV3IEFjdGlvbk1lbnUoZ2V0Q29udGV4dCgpKTsKKworICAgICAgICAgICAgaWYgKCFjYWxsYmFjay5vbkNyZWF0ZUNvbnRleHRNb2RlKG1vZGUsIG1lbnUpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICJBY3Rpb25CYXIgY2FsbGJhY2sgZG9lcyBub3Qga25vdyBob3cgdG8gY3JlYXRlIGNvbnRleHQgbW9kZSAiICsgbW9kZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQ29udGV4dE1lbnVzLnB1dChtb2RlLCBtZW51KTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKGNhbGxiYWNrLm9uUHJlcGFyZUNvbnRleHRNb2RlKG1vZGUsIG1lbnUpKSB7CisgICAgICAgICAgICAvLyBUT0RPIFNldCBtb2RlLCBhbmltYXRlLCBldGMuCisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgZXhpdENvbnRleHRNb2RlKCkgeworICAgICAgICAvLyBUT0RPIFR1cm4gb2ZmIGNvbnRleHQgbW9kZTsgZ28gYmFjayB0byBub3JtYWwuCisgICAgfQorICAgIAorICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uRmluaXNoSW5mbGF0ZSgpIHsKKyAgICAgICAgc3VwZXIub25GaW5pc2hJbmZsYXRlKCk7CisKKyAgICAgICAgaWYgKChtRGlzcGxheU9wdGlvbnMgJiBBY3Rpb25CYXIuRElTUExBWV9ISURFX0hPTUUpID09IDApIHsKKyAgICAgICAgICAgIGlmIChtTG9nbyAhPSBudWxsICYmIChtRGlzcGxheU9wdGlvbnMgJiBBY3Rpb25CYXIuRElTUExBWV9VU0VfTE9HTykgIT0gMCkgeworICAgICAgICAgICAgICAgIG1Mb2dvVmlldyA9IG5ldyBJbWFnZVZpZXcoZ2V0Q29udGV4dCgpKTsKKyAgICAgICAgICAgICAgICBtTG9nb1ZpZXcuc2V0QWRqdXN0Vmlld0JvdW5kcyh0cnVlKTsKKyAgICAgICAgICAgICAgICBtTG9nb1ZpZXcuc2V0TGF5b3V0UGFyYW1zKG5ldyBMYXlvdXRQYXJhbXMoTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIExheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQpKTsKKyAgICAgICAgICAgICAgICBtTG9nb1ZpZXcuc2V0SW1hZ2VEcmF3YWJsZShtTG9nbyk7CisgICAgICAgICAgICAgICAgbUxvZ29WaWV3LnNldENsaWNrYWJsZSh0cnVlKTsKKyAgICAgICAgICAgICAgICBtTG9nb1ZpZXcuc2V0Rm9jdXNhYmxlKHRydWUpOworICAgICAgICAgICAgICAgIG1Mb2dvVmlldy5zZXRPbkNsaWNrTGlzdGVuZXIobUhvbWVDbGlja0xpc3RlbmVyKTsKKyAgICAgICAgICAgICAgICBhZGRWaWV3KG1Mb2dvVmlldyk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1JY29uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtSWNvblZpZXcgPSBuZXcgSW1hZ2VWaWV3KGdldENvbnRleHQoKSk7CisgICAgICAgICAgICAgICAgbUljb25WaWV3LnNldEFkanVzdFZpZXdCb3VuZHModHJ1ZSk7CisgICAgICAgICAgICAgICAgbUljb25WaWV3LnNldExheW91dFBhcmFtcyhuZXcgTGF5b3V0UGFyYW1zKExheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQsCisgICAgICAgICAgICAgICAgICAgICAgICBMYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UKSk7CisgICAgICAgICAgICAgICAgbUljb25WaWV3LnNldEltYWdlRHJhd2FibGUobUljb24pOworICAgICAgICAgICAgICAgIG1JY29uVmlldy5zZXRDbGlja2FibGUodHJ1ZSk7CisgICAgICAgICAgICAgICAgbUljb25WaWV3LnNldEZvY3VzYWJsZSh0cnVlKTsKKyAgICAgICAgICAgICAgICBtSWNvblZpZXcuc2V0T25DbGlja0xpc3RlbmVyKG1Ib21lQ2xpY2tMaXN0ZW5lcik7CisgICAgICAgICAgICAgICAgYWRkVmlldyhtSWNvblZpZXcpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgc3dpdGNoIChtTmF2aWdhdGlvbk1vZGUpIHsKKyAgICAgICAgY2FzZSBBY3Rpb25CYXIuTkFWSUdBVElPTl9NT0RFX1NUQU5EQVJEOgorICAgICAgICAgICAgaWYgKG1Mb2dvVmlldyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgaW5pdFRpdGxlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIAorICAgICAgICBjYXNlIEFjdGlvbkJhci5OQVZJR0FUSU9OX01PREVfRFJPUERPV05fTElTVDoKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIkluZmxhdGluZyBkcm9wZG93biBsaXN0IG5hdmlnYXRpb24gaXNuJ3Qgc3VwcG9ydGVkIHlldCEiKTsKKyAgICAgICAgICAgIAorICAgICAgICBjYXNlIEFjdGlvbkJhci5OQVZJR0FUSU9OX01PREVfVEFCUzoKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIlRhYiBuYXZpZ2F0aW9uIGlzbid0IHN1cHBvcnRlZCB5ZXQhIik7CisgICAgICAgICAgICAKKyAgICAgICAgY2FzZSBBY3Rpb25CYXIuTkFWSUdBVElPTl9NT0RFX0NVU1RPTToKKyAgICAgICAgICAgIGlmIChtQ3VzdG9tTmF2VmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgYWRkVmlldyhtQ3VzdG9tTmF2Vmlldyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwcml2YXRlIHZvaWQgaW5pdFRpdGxlKCkgeworICAgICAgICBMYXlvdXRJbmZsYXRlciBpbmZsYXRlciA9IExheW91dEluZmxhdGVyLmZyb20oZ2V0Q29udGV4dCgpKTsKKyAgICAgICAgbVRpdGxlVmlldyA9IChUZXh0VmlldykgaW5mbGF0ZXIuaW5mbGF0ZShSLmxheW91dC5hY3Rpb25fYmFyX3RpdGxlX2l0ZW0sIG51bGwpOworICAgICAgICBtVGl0bGVWaWV3LnNldExheW91dFBhcmFtcyhuZXcgTGF5b3V0UGFyYW1zKExheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQsCisgICAgICAgICAgICAgICAgTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCkpOworICAgICAgICBpZiAobVRpdGxlICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1UaXRsZVZpZXcuc2V0VGV4dChtVGl0bGUpOworICAgICAgICB9CisgICAgICAgIGFkZFZpZXcobVRpdGxlVmlldyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25NZWFzdXJlKGludCB3aWR0aE1lYXN1cmVTcGVjLCBpbnQgaGVpZ2h0TWVhc3VyZVNwZWMpIHsKKyAgICAgICAgaW50IHdpZHRoTW9kZSA9IE1lYXN1cmVTcGVjLmdldE1vZGUod2lkdGhNZWFzdXJlU3BlYyk7CisgICAgICAgIGlmICh3aWR0aE1vZGUgIT0gTWVhc3VyZVNwZWMuRVhBQ1RMWSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihnZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSArICIgY2FuIG9ubHkgYmUgdXNlZCAiICsKKyAgICAgICAgICAgICAgICAgICAgIndpdGggYW5kcm9pZDpsYXlvdXRfd2lkdGg9XCJtYXRjaF9wYXJlbnRcIiAob3IgZmlsbF9wYXJlbnQpIik7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGludCBoZWlnaHRNb2RlID0gTWVhc3VyZVNwZWMuZ2V0TW9kZShoZWlnaHRNZWFzdXJlU3BlYyk7CisgICAgICAgIGlmIChoZWlnaHRNb2RlICE9IE1lYXN1cmVTcGVjLkFUX01PU1QpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkgKyAiIGNhbiBvbmx5IGJlIHVzZWQgIiArCisgICAgICAgICAgICAgICAgICAgICJ3aXRoIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD1cIndyYXBfY29udGVudFwiIik7CisgICAgICAgIH0KKworICAgICAgICBpbnQgY29udGVudFdpZHRoID0gTWVhc3VyZVNwZWMuZ2V0U2l6ZSh3aWR0aE1lYXN1cmVTcGVjKTsKKyAgICAgICAgCisgICAgICAgIGludCBhdmFpbGFibGVXaWR0aCA9IGNvbnRlbnRXaWR0aCAtIGdldFBhZGRpbmdMZWZ0KCkgLSBnZXRQYWRkaW5nUmlnaHQoKTsKKyAgICAgICAgZmluYWwgaW50IGhlaWdodCA9IG1Db250ZW50SGVpZ2h0IC0gZ2V0UGFkZGluZ1RvcCgpIC0gZ2V0UGFkZGluZ0JvdHRvbSgpOworICAgICAgICBmaW5hbCBpbnQgY2hpbGRTcGVjSGVpZ2h0ID0gTWVhc3VyZVNwZWMubWFrZU1lYXN1cmVTcGVjKGhlaWdodCwgTWVhc3VyZVNwZWMuQVRfTU9TVCk7CisKKyAgICAgICAgaWYgKG1Mb2dvVmlldyAhPSBudWxsICYmIG1Mb2dvVmlldy5nZXRWaXNpYmlsaXR5KCkgIT0gR09ORSkgeworICAgICAgICAgICAgYXZhaWxhYmxlV2lkdGggPSBtZWFzdXJlQ2hpbGRWaWV3KG1Mb2dvVmlldywgYXZhaWxhYmxlV2lkdGgsIGNoaWxkU3BlY0hlaWdodCwgbVNwYWNpbmcpOworICAgICAgICB9CisgICAgICAgIGlmIChtSWNvblZpZXcgIT0gbnVsbCAmJiBtSWNvblZpZXcuZ2V0VmlzaWJpbGl0eSgpICE9IEdPTkUpIHsKKyAgICAgICAgICAgIGF2YWlsYWJsZVdpZHRoID0gbWVhc3VyZUNoaWxkVmlldyhtSWNvblZpZXcsIGF2YWlsYWJsZVdpZHRoLCBjaGlsZFNwZWNIZWlnaHQsIG1TcGFjaW5nKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKG1NZW51VmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICBhdmFpbGFibGVXaWR0aCA9IG1lYXN1cmVDaGlsZFZpZXcobU1lbnVWaWV3LCBhdmFpbGFibGVXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgY2hpbGRTcGVjSGVpZ2h0LCAwKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgc3dpdGNoIChtTmF2aWdhdGlvbk1vZGUpIHsKKyAgICAgICAgY2FzZSBBY3Rpb25CYXIuTkFWSUdBVElPTl9NT0RFX1NUQU5EQVJEOgorICAgICAgICAgICAgaWYgKG1UaXRsZVZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1lYXN1cmVDaGlsZFZpZXcobVRpdGxlVmlldywgYXZhaWxhYmxlV2lkdGgsIGNoaWxkU3BlY0hlaWdodCwgbVNwYWNpbmcpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQWN0aW9uQmFyLk5BVklHQVRJT05fTU9ERV9EUk9QRE9XTl9MSVNUOgorICAgICAgICAgICAgaWYgKG1TcGlubmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtU3Bpbm5lci5tZWFzdXJlKAorICAgICAgICAgICAgICAgICAgICAgICAgTWVhc3VyZVNwZWMubWFrZU1lYXN1cmVTcGVjKGF2YWlsYWJsZVdpZHRoLCBNZWFzdXJlU3BlYy5FWEFDVExZKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIE1lYXN1cmVTcGVjLm1ha2VNZWFzdXJlU3BlYyhoZWlnaHQsIE1lYXN1cmVTcGVjLkVYQUNUTFkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFjdGlvbkJhci5OQVZJR0FUSU9OX01PREVfQ1VTVE9NOgorICAgICAgICAgICAgaWYgKG1DdXN0b21OYXZWaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtQ3VzdG9tTmF2Vmlldy5tZWFzdXJlKAorICAgICAgICAgICAgICAgICAgICAgICAgTWVhc3VyZVNwZWMubWFrZU1lYXN1cmVTcGVjKGF2YWlsYWJsZVdpZHRoLCBNZWFzdXJlU3BlYy5FWEFDVExZKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIE1lYXN1cmVTcGVjLm1ha2VNZWFzdXJlU3BlYyhoZWlnaHQsIE1lYXN1cmVTcGVjLkVYQUNUTFkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgc2V0TWVhc3VyZWREaW1lbnNpb24oY29udGVudFdpZHRoLCBtQ29udGVudEhlaWdodCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBpbnQgbWVhc3VyZUNoaWxkVmlldyhWaWV3IGNoaWxkLCBpbnQgYXZhaWxhYmxlV2lkdGgsIGludCBjaGlsZFNwZWNIZWlnaHQsIGludCBzcGFjaW5nKSB7CisgICAgICAgIGNoaWxkLm1lYXN1cmUoTWVhc3VyZVNwZWMubWFrZU1lYXN1cmVTcGVjKGF2YWlsYWJsZVdpZHRoLCBNZWFzdXJlU3BlYy5BVF9NT1NUKSwKKyAgICAgICAgICAgICAgICBjaGlsZFNwZWNIZWlnaHQpOworCisgICAgICAgIGF2YWlsYWJsZVdpZHRoIC09IGNoaWxkLmdldE1lYXN1cmVkV2lkdGgoKTsKKyAgICAgICAgYXZhaWxhYmxlV2lkdGggLT0gc3BhY2luZzsKKworICAgICAgICByZXR1cm4gYXZhaWxhYmxlV2lkdGg7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25MYXlvdXQoYm9vbGVhbiBjaGFuZ2VkLCBpbnQgbCwgaW50IHQsIGludCByLCBpbnQgYikgeworICAgICAgICBpbnQgeCA9IGdldFBhZGRpbmdMZWZ0KCk7CisgICAgICAgIGZpbmFsIGludCB5ID0gZ2V0UGFkZGluZ1RvcCgpOworICAgICAgICBmaW5hbCBpbnQgY29udGVudEhlaWdodCA9IGIgLSB0IC0gZ2V0UGFkZGluZ1RvcCgpIC0gZ2V0UGFkZGluZ0JvdHRvbSgpOworCisgICAgICAgIGlmIChtTG9nb1ZpZXcgIT0gbnVsbCAmJiBtTG9nb1ZpZXcuZ2V0VmlzaWJpbGl0eSgpICE9IEdPTkUpIHsKKyAgICAgICAgICAgIHggKz0gcG9zaXRpb25DaGlsZChtTG9nb1ZpZXcsIHgsIHksIGNvbnRlbnRIZWlnaHQpICsgbVNwYWNpbmc7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1JY29uVmlldyAhPSBudWxsICYmIG1JY29uVmlldy5nZXRWaXNpYmlsaXR5KCkgIT0gR09ORSkgeworICAgICAgICAgICAgeCArPSBwb3NpdGlvbkNoaWxkKG1JY29uVmlldywgeCwgeSwgY29udGVudEhlaWdodCkgKyBtU3BhY2luZzsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgc3dpdGNoIChtTmF2aWdhdGlvbk1vZGUpIHsKKyAgICAgICAgY2FzZSBBY3Rpb25CYXIuTkFWSUdBVElPTl9NT0RFX1NUQU5EQVJEOgorICAgICAgICAgICAgaWYgKG1UaXRsZVZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHggKz0gcG9zaXRpb25DaGlsZChtVGl0bGVWaWV3LCB4LCB5LCBjb250ZW50SGVpZ2h0KSArIG1TcGFjaW5nOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQWN0aW9uQmFyLk5BVklHQVRJT05fTU9ERV9EUk9QRE9XTl9MSVNUOgorICAgICAgICAgICAgaWYgKG1TcGlubmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB4ICs9IHBvc2l0aW9uQ2hpbGQobVNwaW5uZXIsIHgsIHksIGNvbnRlbnRIZWlnaHQpICsgbVNwYWNpbmc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBY3Rpb25CYXIuTkFWSUdBVElPTl9NT0RFX0NVU1RPTToKKyAgICAgICAgICAgIGlmIChtQ3VzdG9tTmF2VmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgeCArPSBwb3NpdGlvbkNoaWxkKG1DdXN0b21OYXZWaWV3LCB4LCB5LCBjb250ZW50SGVpZ2h0KSArIG1TcGFjaW5nOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICB4ID0gciAtIGwgLSBnZXRQYWRkaW5nUmlnaHQoKTsKKworICAgICAgICBpZiAobU1lbnVWaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHggLT0gcG9zaXRpb25DaGlsZEludmVyc2UobU1lbnVWaWV3LCB4ICsgbUFjdGlvblNwYWNpbmcsIHksIGNvbnRlbnRIZWlnaHQpCisgICAgICAgICAgICAgICAgICAgIC0gbUFjdGlvblNwYWNpbmc7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGludCBwb3NpdGlvbkNoaWxkKFZpZXcgY2hpbGQsIGludCB4LCBpbnQgeSwgaW50IGNvbnRlbnRIZWlnaHQpIHsKKyAgICAgICAgaW50IGNoaWxkV2lkdGggPSBjaGlsZC5nZXRNZWFzdXJlZFdpZHRoKCk7CisgICAgICAgIGludCBjaGlsZEhlaWdodCA9IGNoaWxkLmdldE1lYXN1cmVkSGVpZ2h0KCk7CisgICAgICAgIGludCBjaGlsZFRvcCA9IHkgKyAoY29udGVudEhlaWdodCAtIGNoaWxkSGVpZ2h0KSAvIDI7CisKKyAgICAgICAgY2hpbGQubGF5b3V0KHgsIGNoaWxkVG9wLCB4ICsgY2hpbGRXaWR0aCwgY2hpbGRUb3AgKyBjaGlsZEhlaWdodCk7CisKKyAgICAgICAgcmV0dXJuIGNoaWxkV2lkdGg7CisgICAgfQorICAgIAorICAgIHByaXZhdGUgaW50IHBvc2l0aW9uQ2hpbGRJbnZlcnNlKFZpZXcgY2hpbGQsIGludCB4LCBpbnQgeSwgaW50IGNvbnRlbnRIZWlnaHQpIHsKKyAgICAgICAgaW50IGNoaWxkV2lkdGggPSBjaGlsZC5nZXRNZWFzdXJlZFdpZHRoKCk7CisgICAgICAgIGludCBjaGlsZEhlaWdodCA9IGNoaWxkLmdldE1lYXN1cmVkSGVpZ2h0KCk7CisgICAgICAgIGludCBjaGlsZFRvcCA9IHkgKyAoY29udGVudEhlaWdodCAtIGNoaWxkSGVpZ2h0KSAvIDI7CisKKyAgICAgICAgY2hpbGQubGF5b3V0KHggLSBjaGlsZFdpZHRoLCBjaGlsZFRvcCwgeCwgY2hpbGRUb3AgKyBjaGlsZEhlaWdodCk7CisKKyAgICAgICAgcmV0dXJuIGNoaWxkV2lkdGg7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9HTEVTMjBDYW52YXMuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvR0xFUzIwQ2FudmFzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWFmZDNmZgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvR0xFUzIwQ2FudmFzLmphdmEKQEAgLTAsMCArMSw1NjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQudmlldzsKKworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuRHJhd0ZpbHRlcjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLk1hdHJpeDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGF0aDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBpY3R1cmU7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Qb3J0ZXJEdWZmOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3RGOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVnaW9uOworCitpbXBvcnQgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3Mub3BlbmdsZXMuR0w7CisKKy8qKgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgQ2FudmFzIG9uIHRvcCBvZiBPcGVuR0wgRVMgMi4wLgorICovCitAU3VwcHJlc3NXYXJuaW5ncyh7ImRlcHJlY2F0aW9uIn0pCitjbGFzcyBHTEVTMjBDYW52YXMgZXh0ZW5kcyBDYW52YXMgeworICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsiRmllbGRDYW5CZUxvY2FsIiwgIlVudXNlZERlY2xhcmF0aW9uIn0pCisgICAgcHJpdmF0ZSBmaW5hbCBHTCBtR2w7CisgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1PcGFxdWU7CisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbVJlbmRlcmVyOworICAgIAorICAgIHByaXZhdGUgaW50IG1XaWR0aDsKKyAgICBwcml2YXRlIGludCBtSGVpZ2h0OworCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgLy8gQ29uc3RydWN0b3JzCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgCisgICAgR0xFUzIwQ2FudmFzKEdMIGdsLCBib29sZWFuIHRyYW5zbHVjZW50KSB7CisgICAgICAgIG1HbCA9IGdsOworICAgICAgICBtT3BhcXVlID0gIXRyYW5zbHVjZW50OworCisgICAgICAgIG1SZW5kZXJlciA9IG5DcmVhdGVSZW5kZXJlcigpOworICAgIH0KKworICAgIHByaXZhdGUgbmF0aXZlIGludCBuQ3JlYXRlUmVuZGVyZXIoKTsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzdXBlci5maW5hbGl6ZSgpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgbkRlc3Ryb3lSZW5kZXJlcihtUmVuZGVyZXIpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgbkRlc3Ryb3lSZW5kZXJlcihpbnQgcmVuZGVyZXIpOworCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgLy8gQ2FudmFzIG1hbmFnZW1lbnQKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0hhcmR3YXJlQWNjZWxlcmF0ZWQoKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBHTCBnZXRHTCgpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0Qml0bWFwKEJpdG1hcCBiaXRtYXApIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNPcGFxdWUoKSB7CisgICAgICAgIHJldHVybiBtT3BhcXVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgZ2V0V2lkdGgoKSB7CisgICAgICAgIHJldHVybiBtV2lkdGg7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBnZXRIZWlnaHQoKSB7CisgICAgICAgIHJldHVybiBtSGVpZ2h0OworICAgIH0KKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIC8vIFNldHVwCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRWaWV3cG9ydChpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKKyAgICAgICAgbVdpZHRoID0gd2lkdGg7CisgICAgICAgIG1IZWlnaHQgPSBoZWlnaHQ7CisKKyAgICAgICAgblNldFZpZXdwb3J0KG1SZW5kZXJlciwgd2lkdGgsIGhlaWdodCk7CisgICAgfQorICAgIAorICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgblNldFZpZXdwb3J0KGludCByZW5kZXJlciwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKKworICAgIHZvaWQgb25QcmVEcmF3KCkgeworICAgICAgICBuUHJlcGFyZShtUmVuZGVyZXIpOworICAgIH0KKyAgICAKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5QcmVwYXJlKGludCByZW5kZXJlcik7CisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAvLyBDbGlwcGluZworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gY2xpcFBhdGgoUGF0aCBwYXRoKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGNsaXBQYXRoKFBhdGggcGF0aCwgUmVnaW9uLk9wIG9wKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGNsaXBSZWN0KGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSkgeworICAgICAgICByZXR1cm4gbkNsaXBSZWN0KG1SZW5kZXJlciwgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tKTsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiBuQ2xpcFJlY3QoaW50IHJlbmRlcmVyLCBmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20pOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gY2xpcFJlY3QoZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tLCBSZWdpb24uT3Agb3ApIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gY2xpcFJlY3QoaW50IGxlZnQsIGludCB0b3AsIGludCByaWdodCwgaW50IGJvdHRvbSkgeworICAgICAgICByZXR1cm4gbkNsaXBSZWN0KG1SZW5kZXJlciwgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tKTsgICAgICAgIAorICAgIH0KKyAgICAKKyAgICBwcml2YXRlIG5hdGl2ZSBib29sZWFuIG5DbGlwUmVjdChpbnQgcmVuZGVyZXIsIGludCBsZWZ0LCBpbnQgdG9wLCBpbnQgcmlnaHQsIGludCBib3R0b20pOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gY2xpcFJlY3QoUmVjdCByZWN0KSB7CisgICAgICAgIHJldHVybiBjbGlwUmVjdChyZWN0LmxlZnQsIHJlY3QudG9wLCByZWN0LnJpZ2h0LCByZWN0LmJvdHRvbSk7ICAgICAgICAKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBjbGlwUmVjdChSZWN0IHJlY3QsIFJlZ2lvbi5PcCBvcCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBjbGlwUmVjdChSZWN0RiByZWN0KSB7CisgICAgICAgIHJldHVybiBjbGlwUmVjdChyZWN0LmxlZnQsIHJlY3QudG9wLCByZWN0LnJpZ2h0LCByZWN0LmJvdHRvbSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gY2xpcFJlY3QoUmVjdEYgcmVjdCwgUmVnaW9uLk9wIG9wKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGNsaXBSZWdpb24oUmVnaW9uIHJlZ2lvbikgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBjbGlwUmVnaW9uKFJlZ2lvbiByZWdpb24sIFJlZ2lvbi5PcCBvcCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRDbGlwQm91bmRzKFJlY3QgYm91bmRzKSB7CisgICAgICAgIHJldHVybiBuR2V0Q2xpcEJvdW5kcyhtUmVuZGVyZXIsIGJvdW5kcyk7CisgICAgfQorCisgICAgcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiBuR2V0Q2xpcEJvdW5kcyhpbnQgcmVuZGVyZXIsIFJlY3QgYm91bmRzKTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIHF1aWNrUmVqZWN0KGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSwgRWRnZVR5cGUgdHlwZSkgeworICAgICAgICByZXR1cm4gblF1aWNrUmVqZWN0KG1SZW5kZXJlciwgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tLCB0eXBlLm5hdGl2ZUludCk7CisgICAgfQorICAgIAorICAgIHByaXZhdGUgbmF0aXZlIGJvb2xlYW4gblF1aWNrUmVqZWN0KGludCByZW5kZXJlciwgZmxvYXQgbGVmdCwgZmxvYXQgdG9wLAorICAgICAgICAgICAgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSwgaW50IGVkZ2UpOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gcXVpY2tSZWplY3QoUGF0aCBwYXRoLCBFZGdlVHlwZSB0eXBlKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIHF1aWNrUmVqZWN0KFJlY3RGIHJlY3QsIEVkZ2VUeXBlIHR5cGUpIHsKKyAgICAgICAgcmV0dXJuIHF1aWNrUmVqZWN0KHJlY3QubGVmdCwgcmVjdC50b3AsIHJlY3QucmlnaHQsIHJlY3QuYm90dG9tLCB0eXBlKTsKKyAgICB9CisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAvLyBUcmFuc2Zvcm1hdGlvbnMKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHRyYW5zbGF0ZShmbG9hdCBkeCwgZmxvYXQgZHkpIHsKKyAgICAgICAgblRyYW5zbGF0ZShtUmVuZGVyZXIsIGR4LCBkeSk7CisgICAgfQorICAgIAorICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgblRyYW5zbGF0ZShpbnQgcmVuZGVyZXIsIGZsb2F0IGR4LCBmbG9hdCBkeSk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBza2V3KGZsb2F0IHN4LCBmbG9hdCBzeSkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCByb3RhdGUoZmxvYXQgZGVncmVlcykgeworICAgICAgICBuUm90YXRlKG1SZW5kZXJlciwgZGVncmVlcyk7CisgICAgfQorICAgIAorICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgblJvdGF0ZShpbnQgcmVuZGVyZXIsIGZsb2F0IGRlZ3JlZXMpOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2NhbGUoZmxvYXQgc3gsIGZsb2F0IHN5KSB7CisgICAgICAgIG5TY2FsZShtUmVuZGVyZXIsIHN4LCBzeSk7CisgICAgfQorICAgIAorICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgblNjYWxlKGludCByZW5kZXJlciwgZmxvYXQgc3gsIGZsb2F0IHN5KTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldE1hdHJpeChNYXRyaXggbWF0cml4KSB7CisgICAgICAgIG5TZXRNYXRyaXgobVJlbmRlcmVyLCBtYXRyaXgubmF0aXZlX2luc3RhbmNlKTsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuU2V0TWF0cml4KGludCByZW5kZXJlciwgaW50IG1hdHJpeCk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBnZXRNYXRyaXgoTWF0cml4IG1hdHJpeCkgeworICAgICAgICBuR2V0TWF0cml4KG1SZW5kZXJlciwgbWF0cml4Lm5hdGl2ZV9pbnN0YW5jZSk7CisgICAgfQorICAgIAorICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgbkdldE1hdHJpeChpbnQgcmVuZGVyZXIsIGludCBtYXRyaXgpOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgY29uY2F0KE1hdHJpeCBtYXRyaXgpIHsKKyAgICAgICAgbkNvbmNhdE1hdHJpeChtUmVuZGVyZXIsIG1hdHJpeC5uYXRpdmVfaW5zdGFuY2UpOworICAgIH0KKyAgICAKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5Db25jYXRNYXRyaXgoaW50IHJlbmRlcmVyLCBpbnQgbWF0cml4KTsKKyAgICAKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAvLyBTdGF0ZSBtYW5hZ2VtZW50CisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IHNhdmUoKSB7CisgICAgICAgIHJldHVybiBuU2F2ZShtUmVuZGVyZXIsIDApOworICAgIH0KKyAgICAKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IHNhdmUoaW50IHNhdmVGbGFncykgeworICAgICAgICByZXR1cm4gblNhdmUobVJlbmRlcmVyLCBzYXZlRmxhZ3MpOworICAgIH0KKworICAgIHByaXZhdGUgbmF0aXZlIGludCBuU2F2ZShpbnQgcmVuZGVyZXIsIGludCBmbGFncyk7CisgICAgCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBzYXZlTGF5ZXIoUmVjdEYgYm91bmRzLCBQYWludCBwYWludCwgaW50IHNhdmVGbGFncykgeworICAgICAgICByZXR1cm4gc2F2ZUxheWVyKGJvdW5kcy5sZWZ0LCBib3VuZHMudG9wLCBib3VuZHMucmlnaHQsIGJvdW5kcy5ib3R0b20sIHBhaW50LCBzYXZlRmxhZ3MpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgc2F2ZUxheWVyKGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSwgUGFpbnQgcGFpbnQsCisgICAgICAgICAgICBpbnQgc2F2ZUZsYWdzKSB7CisgICAgICAgIGludCBuYXRpdmVQYWludCA9IHBhaW50ID09IG51bGwgPyAwIDogcGFpbnQubU5hdGl2ZVBhaW50OworICAgICAgICByZXR1cm4gblNhdmVMYXllcihtUmVuZGVyZXIsIGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSwgbmF0aXZlUGFpbnQsIHNhdmVGbGFncyk7CisgICAgfQorCisgICAgcHJpdmF0ZSBuYXRpdmUgaW50IG5TYXZlTGF5ZXIoaW50IHJlbmRlcmVyLCBmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20sCisgICAgICAgICAgICBpbnQgcGFpbnQsIGludCBzYXZlRmxhZ3MpOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBzYXZlTGF5ZXJBbHBoYShSZWN0RiBib3VuZHMsIGludCBhbHBoYSwgaW50IHNhdmVGbGFncykgeworICAgICAgICByZXR1cm4gc2F2ZUxheWVyQWxwaGEoYm91bmRzLmxlZnQsIGJvdW5kcy50b3AsIGJvdW5kcy5yaWdodCwgYm91bmRzLmJvdHRvbSwKKyAgICAgICAgICAgICAgICBhbHBoYSwgc2F2ZUZsYWdzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IHNhdmVMYXllckFscGhhKGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSwgaW50IGFscGhhLAorICAgICAgICAgICAgaW50IHNhdmVGbGFncykgeworICAgICAgICByZXR1cm4gblNhdmVMYXllckFscGhhKG1SZW5kZXJlciwgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tLCBhbHBoYSwgc2F2ZUZsYWdzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIG5hdGl2ZSBpbnQgblNhdmVMYXllckFscGhhKGludCByZW5kZXJlciwgZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBmbG9hdCByaWdodCwKKyAgICAgICAgICAgIGZsb2F0IGJvdHRvbSwgaW50IGFscGhhLCBpbnQgc2F2ZUZsYWdzKTsKKyAgICAKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCByZXN0b3JlKCkgeworICAgICAgICBuUmVzdG9yZShtUmVuZGVyZXIpOworICAgIH0KKyAgICAKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5SZXN0b3JlKGludCByZW5kZXJlcik7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCByZXN0b3JlVG9Db3VudChpbnQgc2F2ZUNvdW50KSB7CisgICAgICAgIG5SZXN0b3JlVG9Db3VudChtUmVuZGVyZXIsIHNhdmVDb3VudCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuUmVzdG9yZVRvQ291bnQoaW50IHJlbmRlcmVyLCBpbnQgc2F2ZUNvdW50KTsKKyAgICAKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGdldFNhdmVDb3VudCgpIHsKKyAgICAgICAgcmV0dXJuIG5HZXRTYXZlQ291bnQobVJlbmRlcmVyKTsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBuYXRpdmUgaW50IG5HZXRTYXZlQ291bnQoaW50IHJlbmRlcmVyKTsKKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIC8vIEZpbHRlcmluZworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0RHJhd0ZpbHRlcihEcmF3RmlsdGVyIGZpbHRlcikgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgRHJhd0ZpbHRlciBnZXREcmF3RmlsdGVyKCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAvLyBEcmF3aW5nCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3QXJjKFJlY3RGIG92YWwsIGZsb2F0IHN0YXJ0QW5nbGUsIGZsb2F0IHN3ZWVwQW5nbGUsIGJvb2xlYW4gdXNlQ2VudGVyLAorICAgICAgICAgICAgUGFpbnQgcGFpbnQpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZHJhd0FSR0IoaW50IGEsIGludCByLCBpbnQgZywgaW50IGIpIHsKKyAgICAgICAgZHJhd0NvbG9yKChhICYgMHhGRikgPDwgMjQgfCAociAmIDB4RkYpIDw8IDE2IHwgKGcgJiAweEZGKSA8PCA4IHwgKGIgJiAweEZGKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZHJhd0JpdG1hcChCaXRtYXAgYml0bWFwLCBmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIFBhaW50IHBhaW50KSB7CisgICAgICAgIC8vIFRPRE86IEltcGxlbWVudAorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRyYXdCaXRtYXAoQml0bWFwIGJpdG1hcCwgTWF0cml4IG1hdHJpeCwgUGFpbnQgcGFpbnQpIHsKKyAgICAgICAgLy8gVE9ETzogSW1wbGVtZW50CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZHJhd0JpdG1hcChCaXRtYXAgYml0bWFwLCBSZWN0IHNyYywgUmVjdCBkc3QsIFBhaW50IHBhaW50KSB7CisgICAgICAgIC8vIFRPRE86IEltcGxlbWVudAorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRyYXdCaXRtYXAoQml0bWFwIGJpdG1hcCwgUmVjdCBzcmMsIFJlY3RGIGRzdCwgUGFpbnQgcGFpbnQpIHsKKyAgICAgICAgLy8gVE9ETzogSW1wbGVtZW50CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZHJhd0JpdG1hcChpbnRbXSBjb2xvcnMsIGludCBvZmZzZXQsIGludCBzdHJpZGUsIGZsb2F0IHgsIGZsb2F0IHksCisgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGJvb2xlYW4gaGFzQWxwaGEsIFBhaW50IHBhaW50KSB7CisKKyAgICAgICAgLy8gVE9ETzogSW1wbGVtZW50CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZHJhd0JpdG1hcChpbnRbXSBjb2xvcnMsIGludCBvZmZzZXQsIGludCBzdHJpZGUsIGludCB4LCBpbnQgeSwKKyAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgYm9vbGVhbiBoYXNBbHBoYSwgUGFpbnQgcGFpbnQpIHsKKworICAgICAgICAvLyBUT0RPOiBJbXBsZW1lbnQKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3Qml0bWFwTWVzaChCaXRtYXAgYml0bWFwLCBpbnQgbWVzaFdpZHRoLCBpbnQgbWVzaEhlaWdodCwgZmxvYXRbXSB2ZXJ0cywKKyAgICAgICAgICAgIGludCB2ZXJ0T2Zmc2V0LCBpbnRbXSBjb2xvcnMsIGludCBjb2xvck9mZnNldCwgUGFpbnQgcGFpbnQpIHsKKworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3Q2lyY2xlKGZsb2F0IGN4LCBmbG9hdCBjeSwgZmxvYXQgcmFkaXVzLCBQYWludCBwYWludCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3Q29sb3IoaW50IGNvbG9yKSB7CisgICAgICAgIGRyYXdDb2xvcihjb2xvciwgUG9ydGVyRHVmZi5Nb2RlLlNSQ19PVkVSKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3Q29sb3IoaW50IGNvbG9yLCBQb3J0ZXJEdWZmLk1vZGUgbW9kZSkgeworICAgICAgICBuRHJhd0NvbG9yKG1SZW5kZXJlciwgY29sb3IsIG1vZGUubmF0aXZlSW50KTsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuRHJhd0NvbG9yKGludCByZW5kZXJlciwgaW50IGNvbG9yLCBpbnQgbW9kZSk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3TGluZShmbG9hdCBzdGFydFgsIGZsb2F0IHN0YXJ0WSwgZmxvYXQgc3RvcFgsIGZsb2F0IHN0b3BZLCBQYWludCBwYWludCkgeworICAgICAgICAvLyBUT0RPOiBJbXBsZW1lbnQKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3TGluZXMoZmxvYXRbXSBwdHMsIGludCBvZmZzZXQsIGludCBjb3VudCwgUGFpbnQgcGFpbnQpIHsKKyAgICAgICAgLy8gVE9ETzogSW1wbGVtZW50CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZHJhd0xpbmVzKGZsb2F0W10gcHRzLCBQYWludCBwYWludCkgeworICAgICAgICAvLyBUT0RPOiBJbXBsZW1lbnQKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3T3ZhbChSZWN0RiBvdmFsLCBQYWludCBwYWludCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3UGFpbnQoUGFpbnQgcGFpbnQpIHsKKyAgICAgICAgLy8gVE9ETzogSW1wbGVtZW50CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZHJhd1BhdGgoUGF0aCBwYXRoLCBQYWludCBwYWludCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3UGljdHVyZShQaWN0dXJlIHBpY3R1cmUpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZHJhd1BpY3R1cmUoUGljdHVyZSBwaWN0dXJlLCBSZWN0IGRzdCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3UGljdHVyZShQaWN0dXJlIHBpY3R1cmUsIFJlY3RGIGRzdCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3UG9pbnQoZmxvYXQgeCwgZmxvYXQgeSwgUGFpbnQgcGFpbnQpIHsKKyAgICAgICAgLy8gVE9ETzogSW1wbGVtZW50CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZHJhd1BvaW50cyhmbG9hdFtdIHB0cywgaW50IG9mZnNldCwgaW50IGNvdW50LCBQYWludCBwYWludCkgeworICAgICAgICAvLyBUT0RPOiBJbXBsZW1lbnQKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3UG9pbnRzKGZsb2F0W10gcHRzLCBQYWludCBwYWludCkgeworICAgICAgICAvLyBUT0RPOiBJbXBsZW1lbnQKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3UG9zVGV4dChjaGFyW10gdGV4dCwgaW50IGluZGV4LCBpbnQgY291bnQsIGZsb2F0W10gcG9zLCBQYWludCBwYWludCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3UG9zVGV4dChTdHJpbmcgdGV4dCwgZmxvYXRbXSBwb3MsIFBhaW50IHBhaW50KSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRyYXdSZWN0KGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSwgUGFpbnQgcGFpbnQpIHsKKyAgICAgICAgbkRyYXdSZWN0KG1SZW5kZXJlciwgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tLCBwYWludC5tTmF0aXZlUGFpbnQpOworICAgIH0KKworICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgbkRyYXdSZWN0KGludCByZW5kZXJlciwgZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tLAorICAgICAgICAgICAgaW50IHBhaW50KTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRyYXdSZWN0KFJlY3QgciwgUGFpbnQgcGFpbnQpIHsKKyAgICAgICAgZHJhd1JlY3Qoci5sZWZ0LCByLnRvcCwgci5yaWdodCwgci5ib3R0b20sIHBhaW50KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3UmVjdChSZWN0RiByLCBQYWludCBwYWludCkgeworICAgICAgICBkcmF3UmVjdChyLmxlZnQsIHIudG9wLCByLnJpZ2h0LCByLmJvdHRvbSwgcGFpbnQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRyYXdSR0IoaW50IHIsIGludCBnLCBpbnQgYikgeworICAgICAgICBkcmF3Q29sb3IoMHhGRjAwMDAwMCB8IChyICYgMHhGRikgPDwgMTYgfCAoZyAmIDB4RkYpIDw8IDggfCAoYiAmIDB4RkYpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3Um91bmRSZWN0KFJlY3RGIHJlY3QsIGZsb2F0IHJ4LCBmbG9hdCByeSwgUGFpbnQgcGFpbnQpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZHJhd1RleHQoY2hhcltdIHRleHQsIGludCBpbmRleCwgaW50IGNvdW50LCBmbG9hdCB4LCBmbG9hdCB5LCBQYWludCBwYWludCkgeworICAgICAgICAvLyBUT0RPOiBJbXBsZW1lbnQKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3VGV4dChDaGFyU2VxdWVuY2UgdGV4dCwgaW50IHN0YXJ0LCBpbnQgZW5kLCBmbG9hdCB4LCBmbG9hdCB5LCBQYWludCBwYWludCkgeworICAgICAgICAvLyBUT0RPOiBJbXBsZW1lbnQKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3VGV4dChTdHJpbmcgdGV4dCwgaW50IHN0YXJ0LCBpbnQgZW5kLCBmbG9hdCB4LCBmbG9hdCB5LCBQYWludCBwYWludCkgeworICAgICAgICAvLyBUT0RPOiBJbXBsZW1lbnQKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3VGV4dChTdHJpbmcgdGV4dCwgZmxvYXQgeCwgZmxvYXQgeSwgUGFpbnQgcGFpbnQpIHsKKyAgICAgICAgLy8gVE9ETzogSW1wbGVtZW50CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZHJhd1RleHRPblBhdGgoY2hhcltdIHRleHQsIGludCBpbmRleCwgaW50IGNvdW50LCBQYXRoIHBhdGgsIGZsb2F0IGhPZmZzZXQsCisgICAgICAgICAgICBmbG9hdCB2T2Zmc2V0LCBQYWludCBwYWludCkgeworCisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRyYXdUZXh0T25QYXRoKFN0cmluZyB0ZXh0LCBQYXRoIHBhdGgsIGZsb2F0IGhPZmZzZXQsIGZsb2F0IHZPZmZzZXQsIFBhaW50IHBhaW50KSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRyYXdUZXh0UnVuKGNoYXJbXSB0ZXh0LCBpbnQgaW5kZXgsIGludCBjb3VudCwgaW50IGNvbnRleHRJbmRleCwgaW50IGNvbnRleHRDb3VudCwKKyAgICAgICAgICAgIGZsb2F0IHgsIGZsb2F0IHksIGludCBkaXIsIFBhaW50IHBhaW50KSB7CisgICAgICAgIAorICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3VGV4dFJ1bihDaGFyU2VxdWVuY2UgdGV4dCwgaW50IHN0YXJ0LCBpbnQgZW5kLCBpbnQgY29udGV4dFN0YXJ0LCBpbnQgY29udGV4dEVuZCwKKyAgICAgICAgICAgIGZsb2F0IHgsIGZsb2F0IHksIGludCBkaXIsIFBhaW50IHBhaW50KSB7CisKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZHJhd1ZlcnRpY2VzKFZlcnRleE1vZGUgbW9kZSwgaW50IHZlcnRleENvdW50LCBmbG9hdFtdIHZlcnRzLCBpbnQgdmVydE9mZnNldCwKKyAgICAgICAgICAgIGZsb2F0W10gdGV4cywgaW50IHRleE9mZnNldCwgaW50W10gY29sb3JzLCBpbnQgY29sb3JPZmZzZXQsIHNob3J0W10gaW5kaWNlcywKKyAgICAgICAgICAgIGludCBpbmRleE9mZnNldCwgaW50IGluZGV4Q291bnQsIFBhaW50IHBhaW50KSB7CisKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9IYXJkd2FyZVJlbmRlcmVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L0hhcmR3YXJlUmVuZGVyZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jN2ZlMzFiCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9IYXJkd2FyZVJlbmRlcmVyLmphdmEKQEAgLTAsMCArMSw1NzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2UgYW5kcm9pZC52aWV3OworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Db21wYXRpYmlsaXR5SW5mbzsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKK2ltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOworaW1wb3J0IGFuZHJvaWQudXRpbC5EaXNwbGF5TWV0cmljczsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitpbXBvcnQgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLkVHTDEwOworaW1wb3J0IGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC5FR0wxMTsKK2ltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMQ29uZmlnOworaW1wb3J0IGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC5FR0xDb250ZXh0OworaW1wb3J0IGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC5FR0xEaXNwbGF5OworaW1wb3J0IGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC5FR0xTdXJmYWNlOworaW1wb3J0IGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLm9wZW5nbGVzLkdMOworaW1wb3J0IGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLm9wZW5nbGVzLkdMMTE7CisKK2ltcG9ydCBzdGF0aWMgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3Mub3BlbmdsZXMuR0wxMC5HTF9DT0xPUl9CVUZGRVJfQklUOworaW1wb3J0IHN0YXRpYyBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5vcGVuZ2xlcy5HTDEwLkdMX1NDSVNTT1JfVEVTVDsKKworLyoqCisgKiBJbnRlcmZhY2UgZm9yIHJlbmRlcmluZyBhIFZpZXdSb290IHVzaW5nIGhhcmR3YXJlIGFjY2VsZXJhdGlvbi4KKyAqIAorICogQGhpZGUKKyAqLworYWJzdHJhY3QgY2xhc3MgSGFyZHdhcmVSZW5kZXJlciB7CisgICAgcHJpdmF0ZSBib29sZWFuIG1FbmFibGVkOworICAgIHByaXZhdGUgYm9vbGVhbiBtUmVxdWVzdGVkID0gdHJ1ZTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1RBRyA9ICJIYXJkd2FyZVJlbmRlcmVyIjsKKworICAgIC8qKgorICAgICAqIERlc3Ryb3lzIHRoZSBoYXJkd2FyZSByZW5kZXJpbmcgY29udGV4dC4KKyAgICAgKi8KKyAgICBhYnN0cmFjdCB2b2lkIGRlc3Ryb3koKTsKKworICAgIC8qKgorICAgICAqIEluaXRpYWxpemVzIHRoZSBoYXJkd2FyZSByZW5kZXJlciBmb3IgdGhlIHNwZWNpZmllZCBzdXJmYWNlLgorICAgICAqIAorICAgICAqIEBwYXJhbSBob2xkZXIgVGhlIGhvbGRlciBmb3IgdGhlIHN1cmZhY2UgdG8gaGFyZHdhcmUgYWNjZWxlcmF0ZS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGluaXRpYWxpemF0aW9uIHdhcyBzdWNjZXNzZnVsLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICovCisgICAgYWJzdHJhY3QgYm9vbGVhbiBpbml0aWFsaXplKFN1cmZhY2VIb2xkZXIgaG9sZGVyKTsKKworICAgIC8qKgorICAgICAqIFNldHVwIHRoZSBoYXJkd2FyZSByZW5kZXJlciBmb3IgZHJhd2luZy4gVGhpcyBpcyBjYWxsZWQgZm9yIGV2ZXJ5CisgICAgICogZnJhbWUgdG8gZHJhdy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gd2lkdGggV2lkdGggb2YgdGhlIGRyYXdpbmcgc3VyZmFjZS4KKyAgICAgKiBAcGFyYW0gaGVpZ2h0IEhlaWdodCBvZiB0aGUgZHJhd2luZyBzdXJmYWNlLgorICAgICAqIEBwYXJhbSBhdHRhY2hJbmZvIFRoZSBBdHRhY2hJbmZvIHVzZWQgdG8gcmVuZGVyIHRoZSBWaWV3Um9vdC4gCisgICAgICovCisgICAgYWJzdHJhY3Qgdm9pZCBzZXR1cChpbnQgd2lkdGgsIGludCBoZWlnaHQsIFZpZXcuQXR0YWNoSW5mbyBhdHRhY2hJbmZvKTsKKworICAgIC8qKgorICAgICAqIERyYXdzIHRoZSBzcGVjaWZpZWQgdmlldy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gdmlldyBUaGUgdmlldyB0byBkcmF3LgorICAgICAqIEBwYXJhbSBhdHRhY2hJbmZvIEF0dGFjaEluZm8gdGllZCB0byB0aGUgc3BlY2lmaWVkIHZpZXcuCisgICAgICogQHBhcmFtIHRyYW5zbGF0b3IgVHJhbnNsYXRvciB1c2VkIHRvIGRyYXcgYXBwbGljYXRpb25zIGluIGNvbXBhdGliaWxpdHkgbW9kZS4KKyAgICAgKiBAcGFyYW0geW9mZiBUaGUgdmVydGljYWwgb2Zmc2V0IGZvciB0aGUgZHJhd2luZy4KKyAgICAgKiBAcGFyYW0gc2NhbGluZ1JlcXVpcmVkIFdoZXRoZXIgZHJhd2luZyBzaG91bGQgYmUgc2NhbGVkLgorICAgICAqLworICAgIGFic3RyYWN0IHZvaWQgZHJhdyhWaWV3IHZpZXcsIFZpZXcuQXR0YWNoSW5mbyBhdHRhY2hJbmZvLAorICAgICAgICAgICAgQ29tcGF0aWJpbGl0eUluZm8uVHJhbnNsYXRvciB0cmFuc2xhdG9yLCBpbnQgeW9mZiwgYm9vbGVhbiBzY2FsaW5nUmVxdWlyZWQpOworCisgICAgLyoqCisgICAgICogSW5pdGlhbGl6ZXMgdGhlIGhhcmR3YXJlIHJlbmRlcmVyIGZvciB0aGUgc3BlY2lmaWVkIHN1cmZhY2UgYW5kIHNldHVwIHRoZQorICAgICAqIHJlbmRlcmVyIGZvciBkcmF3aW5nLCBpZiBuZWVkZWQuIFRoaXMgaXMgaW52b2tlZCB3aGVuIHRoZSBWaWV3Um9vdCBoYXMKKyAgICAgKiBwb3RlbnRpYWxseSBsb3N0IHRoZSBoYXJkd2FyZSByZW5kZXJlci4gVGhlIGhhcmR3YXJlIHJlbmRlcmVyIHNob3VsZCBiZQorICAgICAqIHJlaW5pdGlhbGl6ZWQgYW5kIHNldHVwIHdoZW4gdGhlIHJlbmRlciB7QGxpbmsgI2lzUmVxdWVzdGVkKCl9IGFuZAorICAgICAqIHtAbGluayAjaXNFbmFibGVkKCl9LgorICAgICAqIAorICAgICAqIEBwYXJhbSB3aWR0aCBUaGUgd2lkdGggb2YgdGhlIGRyYXdpbmcgc3VyZmFjZS4KKyAgICAgKiBAcGFyYW0gaGVpZ2h0IFRoZSBoZWlnaHQgb2YgdGhlIGRyYXdpbmcgc3VyZmFjZS4KKyAgICAgKiBAcGFyYW0gYXR0YWNoSW5mbyBUaGUgCisgICAgICogQHBhcmFtIGhvbGRlcgorICAgICAqLworICAgIHZvaWQgaW5pdGlhbGl6ZUlmTmVlZGVkKGludCB3aWR0aCwgaW50IGhlaWdodCwgVmlldy5BdHRhY2hJbmZvIGF0dGFjaEluZm8sCisgICAgICAgICAgICBTdXJmYWNlSG9sZGVyIGhvbGRlcikgeworCisgICAgICAgIGlmIChpc1JlcXVlc3RlZCgpKSB7CisgICAgICAgICAgICAvLyBXZSBsb3N0IHRoZSBnbCBjb250ZXh0LCBzbyByZWNyZWF0ZSBpdC4KKyAgICAgICAgICAgIGlmICghaXNFbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoaW5pdGlhbGl6ZShob2xkZXIpKSB7CisgICAgICAgICAgICAgICAgICAgIHNldHVwKHdpZHRoLCBoZWlnaHQsIGF0dGFjaEluZm8pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSAgICAgICAgCisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIGhhcmR3YXJlIHJlbmRlcmVyIHVzaW5nIE9wZW5HTC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZ2xWZXJzaW9uIFRoZSB2ZXJzaW9uIG9mIE9wZW5HTCB0byB1c2UgKDEgZm9yIE9wZW5HTCAxLCAxMSBmb3IgT3BlbkdMIDEuMSwgZXRjLikKKyAgICAgKiBAcGFyYW0gdHJhbnNsdWNlbnQgVHJ1ZSBpZiB0aGUgc3VyZmFjZSBpcyB0cmFuc2x1Y2VudCwgZmFsc2Ugb3RoZXJ3aXNlCisgICAgICogCisgICAgICogQHJldHVybiBBIGhhcmR3YXJlIHJlbmRlcmVyIGJhY2tlZCBieSBPcGVuR0wuCisgICAgICovCisgICAgc3RhdGljIEhhcmR3YXJlUmVuZGVyZXIgY3JlYXRlR2xSZW5kZXJlcihpbnQgZ2xWZXJzaW9uLCBib29sZWFuIHRyYW5zbHVjZW50KSB7CisgICAgICAgIHN3aXRjaCAoZ2xWZXJzaW9uKSB7CisgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBHbDEwUmVuZGVyZXIodHJhbnNsdWNlbnQpOworICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgIHJldHVybiBuZXcgR2wyMFJlbmRlcmVyKHRyYW5zbHVjZW50KTsKKyAgICAgICAgfQorICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbmtub3duIEdMIHZlcnNpb246ICIgKyBnbFZlcnNpb24pOworICAgIH0KKworICAgIC8qKgorICAgICAqIEluZGljYXRlcyB3aGV0aGVyIGhhcmR3YXJlIGFjY2VsZXJhdGlvbiBpcyBjdXJyZW50bHkgZW5hYmxlZC4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIFRydWUgaWYgaGFyZHdhcmUgYWNjZWxlcmF0aW9uIGlzIGluIHVzZSwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqLworICAgIGJvb2xlYW4gaXNFbmFibGVkKCkgeworICAgICAgICByZXR1cm4gbUVuYWJsZWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgaGFyZHdhcmUgYWNjZWxlcmF0aW9uIGlzIGN1cnJlbnRseSBlbmFibGVkLgorICAgICAqIAorICAgICAqIEBwYXJhbSBlbmFibGVkIFRydWUgaWYgdGhlIGhhcmR3YXJlIHJlbmRlcmVyIGlzIGluIHVzZSwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqLworICAgIHZvaWQgc2V0RW5hYmxlZChib29sZWFuIGVuYWJsZWQpIHsKKyAgICAgICAgbUVuYWJsZWQgPSBlbmFibGVkOworICAgIH0KKworICAgIC8qKgorICAgICAqIEluZGljYXRlcyB3aGV0aGVyIGhhcmR3YXJlIGFjY2VsZXJhdGlvbiBpcyBjdXJyZW50bHkgcmVxdWVzdCBidXQgbm90CisgICAgICogbmVjZXNzYXJpbHkgZW5hYmxlZCB5ZXQuCisgICAgICogCisgICAgICogQHJldHVybiBUcnVlIGlmIHJlcXVlc3RlZCwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqLworICAgIGJvb2xlYW4gaXNSZXF1ZXN0ZWQoKSB7CisgICAgICAgIHJldHVybiBtUmVxdWVzdGVkOworICAgIH0KKworICAgIC8qKgorICAgICAqIEluZGljYXRlcyB3aGV0aGVyIGhhcmR3YXJlIGFjY2VsZXJhdGlvbiBpcyBjdXJyZW50bHkgcmVxdWVzdCBidXQgbm90CisgICAgICogbmVjZXNzYXJpbHkgZW5hYmxlZCB5ZXQuCisgICAgICogCisgICAgICogQHJldHVybiBUcnVlIHRvIHJlcXVlc3QgaGFyZHdhcmUgYWNjZWxlcmF0aW9uLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICovCisgICAgdm9pZCBzZXRSZXF1ZXN0ZWQoYm9vbGVhbiByZXF1ZXN0ZWQpIHsKKyAgICAgICAgbVJlcXVlc3RlZCA9IHJlcXVlc3RlZDsKKyAgICB9CisKKyAgICBAU3VwcHJlc3NXYXJuaW5ncyh7ImRlcHJlY2F0aW9uIn0pCisgICAgc3RhdGljIGFic3RyYWN0IGNsYXNzIEdsUmVuZGVyZXIgZXh0ZW5kcyBIYXJkd2FyZVJlbmRlcmVyIHsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVHTF9DT05URVhUX0NMSUVOVF9WRVJTSU9OID0gMHgzMDk4OworCisgICAgICAgIEVHTDEwIG1FZ2w7CisgICAgICAgIEVHTERpc3BsYXkgbUVnbERpc3BsYXk7CisgICAgICAgIEVHTENvbnRleHQgbUVnbENvbnRleHQ7CisgICAgICAgIEVHTFN1cmZhY2UgbUVnbFN1cmZhY2U7CisgICAgICAgIEVHTENvbmZpZyBtRWdsQ29uZmlnOworCisgICAgICAgIEdMIG1HbDsKKyAgICAgICAgQ2FudmFzIG1DYW52YXM7CisKKyAgICAgICAgZmluYWwgaW50IG1HbFZlcnNpb247CisgICAgICAgIGZpbmFsIGJvb2xlYW4gbVRyYW5zbHVjZW50OworCisgICAgICAgIEdsUmVuZGVyZXIoaW50IGdsVmVyc2lvbiwgYm9vbGVhbiB0cmFuc2x1Y2VudCkgeworICAgICAgICAgICAgbUdsVmVyc2lvbiA9IGdsVmVyc2lvbjsKKyAgICAgICAgICAgIG1UcmFuc2x1Y2VudCA9IHRyYW5zbHVjZW50OworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENoZWNrcyBmb3IgT3BlbkdMIGVycm9ycy4gSWYgYW4gZXJyb3IgaGFzIG9jY3VyZWQsIHtAbGluayAjZGVzdHJveSgpfQorICAgICAgICAgKiBpcyBpbnZva2VkIGFuZCB0aGUgcmVxdWVzdGVkIGZsYWcgaXMgdHVybmVkIG9mZi4gVGhlIGVycm9yIGNvZGUgaXMKKyAgICAgICAgICogYWxzbyBsb2dnZWQgYXMgYSB3YXJuaW5nLgorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCBjaGVja0Vycm9ycygpIHsKKyAgICAgICAgICAgIGlmIChpc0VuYWJsZWQoKSkgeworICAgICAgICAgICAgICAgIGludCBlcnJvciA9IG1FZ2wuZWdsR2V0RXJyb3IoKTsKKyAgICAgICAgICAgICAgICBpZiAoZXJyb3IgIT0gRUdMMTAuRUdMX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gc29tZXRoaW5nIGJhZCBoYXMgaGFwcGVuZWQgcmV2ZXJ0IHRvCisgICAgICAgICAgICAgICAgICAgIC8vIG5vcm1hbCByZW5kZXJpbmcuCisgICAgICAgICAgICAgICAgICAgIGRlc3Ryb3koKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yICE9IEVHTDExLkVHTF9DT05URVhUX0xPU1QpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlJ2xsIHRyeSBhZ2FpbiBpZiBpdCB3YXMgY29udGV4dCBsb3N0CisgICAgICAgICAgICAgICAgICAgICAgICBzZXRSZXF1ZXN0ZWQoZmFsc2UpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIExvZy53KExPR19UQUcsICJPcGVuR0wgZXJyb3I6ICIgKyBlcnJvcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgYm9vbGVhbiBpbml0aWFsaXplKFN1cmZhY2VIb2xkZXIgaG9sZGVyKSB7CisgICAgICAgICAgICBpZiAoaXNSZXF1ZXN0ZWQoKSAmJiAhaXNFbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICBpbml0aWFsaXplRWdsKCk7CisgICAgICAgICAgICAgICAgbUdsID0gY3JlYXRlRWdsU3VyZmFjZShob2xkZXIpOworCisgICAgICAgICAgICAgICAgaWYgKG1HbCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBlcnIgPSBtRWdsLmVnbEdldEVycm9yKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gRUdMMTAuRUdMX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Ryb3koKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldFJlcXVlc3RlZChmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtQ2FudmFzID0gY3JlYXRlQ2FudmFzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUNhbnZhcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0RW5hYmxlZCh0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoTE9HX1RBRywgIkhhcmR3YXJlIGFjY2VsZXJhdGVkIENhbnZhcyBjb3VsZCBub3QgYmUgY3JlYXRlZCIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1DYW52YXMgIT0gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBhYnN0cmFjdCBDYW52YXMgY3JlYXRlQ2FudmFzKCk7CisKKyAgICAgICAgdm9pZCBpbml0aWFsaXplRWdsKCkgeworICAgICAgICAgICAgbUVnbCA9IChFR0wxMCkgRUdMQ29udGV4dC5nZXRFR0woKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gR2V0IHRvIHRoZSBkZWZhdWx0IGRpc3BsYXkuCisgICAgICAgICAgICBtRWdsRGlzcGxheSA9IG1FZ2wuZWdsR2V0RGlzcGxheShFR0wxMC5FR0xfREVGQVVMVF9ESVNQTEFZKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKG1FZ2xEaXNwbGF5ID09IEVHTDEwLkVHTF9OT19ESVNQTEFZKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oImVnbEdldERpc3BsYXkgZmFpbGVkIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIFdlIGNhbiBub3cgaW5pdGlhbGl6ZSBFR0wgZm9yIHRoYXQgZGlzcGxheQorICAgICAgICAgICAgaW50W10gdmVyc2lvbiA9IG5ldyBpbnRbMl07CisgICAgICAgICAgICBpZiAoIW1FZ2wuZWdsSW5pdGlhbGl6ZShtRWdsRGlzcGxheSwgdmVyc2lvbikpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiZWdsSW5pdGlhbGl6ZSBmYWlsZWQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1FZ2xDb25maWcgPSBnZXRDb25maWdDaG9vc2VyKG1HbFZlcnNpb24pLmNob29zZUNvbmZpZyhtRWdsLCBtRWdsRGlzcGxheSk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAqIENyZWF0ZSBhbiBFR0wgY29udGV4dC4gV2Ugd2FudCB0byBkbyB0aGlzIGFzIHJhcmVseSBhcyB3ZSBjYW4sIGJlY2F1c2UgYW4KKyAgICAgICAgICAgICogRUdMIGNvbnRleHQgaXMgYSBzb21ld2hhdCBoZWF2eSBvYmplY3QuCisgICAgICAgICAgICAqLworICAgICAgICAgICAgbUVnbENvbnRleHQgPSBjcmVhdGVDb250ZXh0KG1FZ2wsIG1FZ2xEaXNwbGF5LCBtRWdsQ29uZmlnKTsKKyAgICAgICAgfQorCisgICAgICAgIEdMIGNyZWF0ZUVnbFN1cmZhY2UoU3VyZmFjZUhvbGRlciBob2xkZXIpIHsKKyAgICAgICAgICAgIC8vIENoZWNrIHByZWNvbmRpdGlvbnMuCisgICAgICAgICAgICBpZiAobUVnbCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oImVnbCBub3QgaW5pdGlhbGl6ZWQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtRWdsRGlzcGxheSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oImVnbERpc3BsYXkgbm90IGluaXRpYWxpemVkIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobUVnbENvbmZpZyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIm1FZ2xDb25maWcgbm90IGluaXRpYWxpemVkIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiAgVGhlIHdpbmRvdyBzaXplIGhhcyBjaGFuZ2VkLCBzbyB3ZSBuZWVkIHRvIGNyZWF0ZSBhIG5ldworICAgICAgICAgICAgICogIHN1cmZhY2UuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmIChtRWdsU3VyZmFjZSAhPSBudWxsICYmIG1FZ2xTdXJmYWNlICE9IEVHTDEwLkVHTF9OT19TVVJGQUNFKSB7CisKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqIFVuYmluZCBhbmQgZGVzdHJveSB0aGUgb2xkIEVHTCBzdXJmYWNlLCBpZgorICAgICAgICAgICAgICAgICAqIHRoZXJlIGlzIG9uZS4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBtRWdsLmVnbE1ha2VDdXJyZW50KG1FZ2xEaXNwbGF5LCBFR0wxMC5FR0xfTk9fU1VSRkFDRSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9OT19TVVJGQUNFLCBFR0wxMC5FR0xfTk9fQ09OVEVYVCk7CisgICAgICAgICAgICAgICAgbUVnbC5lZ2xEZXN0cm95U3VyZmFjZShtRWdsRGlzcGxheSwgbUVnbFN1cmZhY2UpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBDcmVhdGUgYW4gRUdMIHN1cmZhY2Ugd2UgY2FuIHJlbmRlciBpbnRvLgorICAgICAgICAgICAgbUVnbFN1cmZhY2UgPSBtRWdsLmVnbENyZWF0ZVdpbmRvd1N1cmZhY2UobUVnbERpc3BsYXksIG1FZ2xDb25maWcsIGhvbGRlciwgbnVsbCk7CisKKyAgICAgICAgICAgIGlmIChtRWdsU3VyZmFjZSA9PSBudWxsIHx8IG1FZ2xTdXJmYWNlID09IEVHTDEwLkVHTF9OT19TVVJGQUNFKSB7CisgICAgICAgICAgICAgICAgaW50IGVycm9yID0gbUVnbC5lZ2xHZXRFcnJvcigpOworICAgICAgICAgICAgICAgIGlmIChlcnJvciA9PSBFR0wxMC5FR0xfQkFEX05BVElWRV9XSU5ET1cpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmUoIkVnbEhlbHBlciIsICJjcmVhdGVXaW5kb3dTdXJmYWNlIHJldHVybmVkIEVHTF9CQURfTkFUSVZFX1dJTkRPVy4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJjcmVhdGVXaW5kb3dTdXJmYWNlIGZhaWxlZCIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogQmVmb3JlIHdlIGNhbiBpc3N1ZSBHTCBjb21tYW5kcywgd2UgbmVlZCB0byBtYWtlIHN1cmUKKyAgICAgICAgICAgICAqIHRoZSBjb250ZXh0IGlzIGN1cnJlbnQgYW5kIGJvdW5kIHRvIGEgc3VyZmFjZS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKCFtRWdsLmVnbE1ha2VDdXJyZW50KG1FZ2xEaXNwbGF5LCBtRWdsU3VyZmFjZSwgbUVnbFN1cmZhY2UsIG1FZ2xDb250ZXh0KSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJlZ2xNYWtlQ3VycmVudCBmYWlsZWQiKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIG1FZ2xDb250ZXh0LmdldEdMKCk7CisgICAgICAgIH0KKworICAgICAgICBFR0xDb250ZXh0IGNyZWF0ZUNvbnRleHQoRUdMMTAgZWdsLCBFR0xEaXNwbGF5IGVnbERpc3BsYXksIEVHTENvbmZpZyBlZ2xDb25maWcpIHsKKyAgICAgICAgICAgIGludFtdIGF0dHJpYl9saXN0ID0geyBFR0xfQ09OVEVYVF9DTElFTlRfVkVSU0lPTiwgbUdsVmVyc2lvbiwgRUdMMTAuRUdMX05PTkUgfTsKKworICAgICAgICAgICAgcmV0dXJuIGVnbC5lZ2xDcmVhdGVDb250ZXh0KGVnbERpc3BsYXksIGVnbENvbmZpZywgRUdMMTAuRUdMX05PX0NPTlRFWFQsCisgICAgICAgICAgICAgICAgICAgIG1HbFZlcnNpb24gIT0gMCA/IGF0dHJpYl9saXN0IDogbnVsbCk7ICAgICAgICAgICAgCisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgdm9pZCBpbml0aWFsaXplSWZOZWVkZWQoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBWaWV3LkF0dGFjaEluZm8gYXR0YWNoSW5mbywKKyAgICAgICAgICAgICAgICBTdXJmYWNlSG9sZGVyIGhvbGRlcikgeworCisgICAgICAgICAgICBpZiAoaXNSZXF1ZXN0ZWQoKSkgeworICAgICAgICAgICAgICAgIGNoZWNrRXJyb3JzKCk7CisgICAgICAgICAgICAgICAgc3VwZXIuaW5pdGlhbGl6ZUlmTmVlZGVkKHdpZHRoLCBoZWlnaHQsIGF0dGFjaEluZm8sIGhvbGRlcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICB2b2lkIGRlc3Ryb3koKSB7CisgICAgICAgICAgICBpZiAoIWlzRW5hYmxlZCgpKSByZXR1cm47CisKKyAgICAgICAgICAgIG1FZ2wuZWdsTWFrZUN1cnJlbnQobUVnbERpc3BsYXksIEVHTDEwLkVHTF9OT19TVVJGQUNFLAorICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfTk9fU1VSRkFDRSwgRUdMMTAuRUdMX05PX0NPTlRFWFQpOworICAgICAgICAgICAgbUVnbC5lZ2xEZXN0cm95Q29udGV4dChtRWdsRGlzcGxheSwgbUVnbENvbnRleHQpOworICAgICAgICAgICAgbUVnbC5lZ2xEZXN0cm95U3VyZmFjZShtRWdsRGlzcGxheSwgbUVnbFN1cmZhY2UpOworICAgICAgICAgICAgbUVnbC5lZ2xUZXJtaW5hdGUobUVnbERpc3BsYXkpOworCisgICAgICAgICAgICBtRWdsQ29udGV4dCA9IG51bGw7CisgICAgICAgICAgICBtRWdsU3VyZmFjZSA9IG51bGw7CisgICAgICAgICAgICBtRWdsRGlzcGxheSA9IG51bGw7CisgICAgICAgICAgICBtRWdsID0gbnVsbDsKKyAgICAgICAgICAgIG1HbCA9IG51bGw7CisgICAgICAgICAgICBtQ2FudmFzID0gbnVsbDsKKworICAgICAgICAgICAgc2V0RW5hYmxlZChmYWxzZSk7CisgICAgICAgIH0gICAgICAgIAorICAgICAgICAKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHZvaWQgc2V0dXAoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBWaWV3LkF0dGFjaEluZm8gYXR0YWNoSW5mbykgeworICAgICAgICAgICAgZmluYWwgZmxvYXQgc2NhbGUgPSBhdHRhY2hJbmZvLm1BcHBsaWNhdGlvblNjYWxlOworICAgICAgICAgICAgbUNhbnZhcy5zZXRWaWV3cG9ydCgoaW50KSAod2lkdGggKiBzY2FsZSArIDAuNWYpLCAoaW50KSAoaGVpZ2h0ICogc2NhbGUgKyAwLjVmKSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGJvb2xlYW4gY2FuRHJhdygpIHsKKyAgICAgICAgICAgIHJldHVybiBtR2wgIT0gbnVsbCAmJiBtQ2FudmFzICE9IG51bGw7CisgICAgICAgIH0gICAgICAgIAorICAgICAgICAKKyAgICAgICAgdm9pZCBvblByZURyYXcoKSB7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogRGVmaW5lcyB0aGUgRUdMIGNvbmZpZ3VyYXRpb24gZm9yIHRoaXMgcmVuZGVyZXIuIFRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24KKyAgICAgICAgICogaXMgUkdCWCwgbm8gZGVwdGgsIG5vIHN0ZW5jaWwuCisgICAgICAgICAqIAorICAgICAgICAgKiBAcmV0dXJuIEFuIHtAbGluayBhbmRyb2lkLnZpZXcuSGFyZHdhcmVSZW5kZXJlci5HbFJlbmRlcmVyLkVnbENvbmZpZ0Nob29zZXJ9LgorICAgICAgICAgKiBAcGFyYW0gZ2xWZXJzaW9uCisgICAgICAgICAqLworICAgICAgICBFZ2xDb25maWdDaG9vc2VyIGdldENvbmZpZ0Nob29zZXIoaW50IGdsVmVyc2lvbikgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21wb25lbnRTaXplQ2hvb3NlcihnbFZlcnNpb24sIDgsIDgsIDgsIG1UcmFuc2x1Y2VudCA/IDggOiAwLCAwLCAwKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICB2b2lkIGRyYXcoVmlldyB2aWV3LCBWaWV3LkF0dGFjaEluZm8gYXR0YWNoSW5mbywgQ29tcGF0aWJpbGl0eUluZm8uVHJhbnNsYXRvciB0cmFuc2xhdG9yLAorICAgICAgICAgICAgICAgIGludCB5b2ZmLCBib29sZWFuIHNjYWxpbmdSZXF1aXJlZCkgeworCisgICAgICAgICAgICBpZiAoY2FuRHJhdygpKSB7CisgICAgICAgICAgICAgICAgYXR0YWNoSW5mby5tRHJhd2luZ1RpbWUgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKTsKKyAgICAgICAgICAgICAgICBhdHRhY2hJbmZvLm1JZ25vcmVEaXJ0eVN0YXRlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB2aWV3Lm1Qcml2YXRlRmxhZ3MgfD0gVmlldy5EUkFXTjsKKworICAgICAgICAgICAgICAgIG9uUHJlRHJhdygpOworCisgICAgICAgICAgICAgICAgQ2FudmFzIGNhbnZhcyA9IG1DYW52YXM7CisgICAgICAgICAgICAgICAgaW50IHNhdmVDb3VudCA9IGNhbnZhcy5zYXZlKENhbnZhcy5NQVRSSVhfU0FWRV9GTEFHKTsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDAsIC15b2ZmKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRyYW5zbGF0b3IgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNsYXRvci50cmFuc2xhdGVDYW52YXMoY2FudmFzKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjYW52YXMuc2V0U2NyZWVuRGVuc2l0eShzY2FsaW5nUmVxdWlyZWQgPyBEaXNwbGF5TWV0cmljcy5ERU5TSVRZX0RFVklDRSA6IDApOworICAgIAorICAgICAgICAgICAgICAgICAgICB2aWV3LmRyYXcoY2FudmFzKTsKKyAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICBjYW52YXMucmVzdG9yZVRvQ291bnQoc2F2ZUNvdW50KTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBhdHRhY2hJbmZvLm1JZ25vcmVEaXJ0eVN0YXRlID0gZmFsc2U7CisKKyAgICAgICAgICAgICAgICBtRWdsLmVnbFN3YXBCdWZmZXJzKG1FZ2xEaXNwbGF5LCBtRWdsU3VyZmFjZSk7CisgICAgICAgICAgICAgICAgY2hlY2tFcnJvcnMoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBFZ2xDb25maWdDaG9vc2VyIHsKKyAgICAgICAgICAgIGZpbmFsIGludFtdIG1Db25maWdTcGVjOworICAgICAgICAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbUdsVmVyc2lvbjsKKworICAgICAgICAgICAgRWdsQ29uZmlnQ2hvb3NlcihpbnQgZ2xWZXJzaW9uLCBpbnRbXSBjb25maWdTcGVjKSB7CisgICAgICAgICAgICAgICAgbUdsVmVyc2lvbiA9IGdsVmVyc2lvbjsKKyAgICAgICAgICAgICAgICBtQ29uZmlnU3BlYyA9IGZpbHRlckNvbmZpZ1NwZWMoY29uZmlnU3BlYyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEVHTENvbmZpZyBjaG9vc2VDb25maWcoRUdMMTAgZWdsLCBFR0xEaXNwbGF5IGRpc3BsYXkpIHsKKyAgICAgICAgICAgICAgICBpbnRbXSBudW1fY29uZmlnID0gbmV3IGludFsxXTsKKyAgICAgICAgICAgICAgICBpZiAoIWVnbC5lZ2xDaG9vc2VDb25maWcoZGlzcGxheSwgbUNvbmZpZ1NwZWMsIG51bGwsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICBudW1fY29uZmlnKSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJlZ2xDaG9vc2VDb25maWcgZmFpbGVkIik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaW50IG51bUNvbmZpZ3MgPSBudW1fY29uZmlnWzBdOworCisgICAgICAgICAgICAgICAgaWYgKG51bUNvbmZpZ3MgPD0gMCkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJObyBjb25maWdzIG1hdGNoIGNvbmZpZ1NwZWMiKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBFR0xDb25maWdbXSBjb25maWdzID0gbmV3IEVHTENvbmZpZ1tudW1Db25maWdzXTsKKyAgICAgICAgICAgICAgICBpZiAoIWVnbC5lZ2xDaG9vc2VDb25maWcoZGlzcGxheSwgbUNvbmZpZ1NwZWMsIGNvbmZpZ3MsIG51bUNvbmZpZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICBudW1fY29uZmlnKSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJlZ2xDaG9vc2VDb25maWcjMiBmYWlsZWQiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgRUdMQ29uZmlnIGNvbmZpZyA9IGNob29zZUNvbmZpZyhlZ2wsIGRpc3BsYXksIGNvbmZpZ3MpOworICAgICAgICAgICAgICAgIGlmIChjb25maWcgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJObyBjb25maWcgY2hvc2VuIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBjb25maWc7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGFic3RyYWN0IEVHTENvbmZpZyBjaG9vc2VDb25maWcoRUdMMTAgZWdsLCBFR0xEaXNwbGF5IGRpc3BsYXksCisgICAgICAgICAgICAgICAgICAgIEVHTENvbmZpZ1tdIGNvbmZpZ3MpOworCisgICAgICAgICAgICBwcml2YXRlIGludFtdIGZpbHRlckNvbmZpZ1NwZWMoaW50W10gY29uZmlnU3BlYykgeworICAgICAgICAgICAgICAgIGlmIChtR2xWZXJzaW9uICE9IDIpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbmZpZ1NwZWM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8qIFdlIGtub3cgbm9uZSBvZiB0aGUgc3ViY2xhc3NlcyBkZWZpbmUgRUdMX1JFTkRFUkFCTEVfVFlQRS4KKyAgICAgICAgICAgICAgICAgKiBBbmQgd2Uga25vdyB0aGUgY29uZmlnU3BlYyBpcyB3ZWxsIGZvcm1lZC4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBpbnQgbGVuID0gY29uZmlnU3BlYy5sZW5ndGg7CisgICAgICAgICAgICAgICAgaW50W10gbmV3Q29uZmlnU3BlYyA9IG5ldyBpbnRbbGVuICsgMl07CisgICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShjb25maWdTcGVjLCAwLCBuZXdDb25maWdTcGVjLCAwLCBsZW4tMSk7CisgICAgICAgICAgICAgICAgbmV3Q29uZmlnU3BlY1tsZW4tMV0gPSBFR0wxMC5FR0xfUkVOREVSQUJMRV9UWVBFOworICAgICAgICAgICAgICAgIG5ld0NvbmZpZ1NwZWNbbGVuXSA9IDQ7IC8qIEVHTF9PUEVOR0xfRVMyX0JJVCAqLworICAgICAgICAgICAgICAgIG5ld0NvbmZpZ1NwZWNbbGVuKzFdID0gRUdMMTAuRUdMX05PTkU7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ld0NvbmZpZ1NwZWM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ2hvb3NlIGEgY29uZmlndXJhdGlvbiB3aXRoIGV4YWN0bHkgdGhlIHNwZWNpZmllZCByLGcsYixhIHNpemVzLAorICAgICAgICAgKiBhbmQgYXQgbGVhc3QgdGhlIHNwZWNpZmllZCBkZXB0aCBhbmQgc3RlbmNpbCBzaXplcy4KKyAgICAgICAgICovCisgICAgICAgIHN0YXRpYyBjbGFzcyBDb21wb25lbnRTaXplQ2hvb3NlciBleHRlbmRzIEVnbENvbmZpZ0Nob29zZXIgeworICAgICAgICAgICAgcHJpdmF0ZSBpbnRbXSBtVmFsdWU7CisKKyAgICAgICAgICAgIHByaXZhdGUgaW50IG1SZWRTaXplOworICAgICAgICAgICAgcHJpdmF0ZSBpbnQgbUdyZWVuU2l6ZTsKKyAgICAgICAgICAgIHByaXZhdGUgaW50IG1CbHVlU2l6ZTsKKyAgICAgICAgICAgIHByaXZhdGUgaW50IG1BbHBoYVNpemU7CisgICAgICAgICAgICBwcml2YXRlIGludCBtRGVwdGhTaXplOworICAgICAgICAgICAgcHJpdmF0ZSBpbnQgbVN0ZW5jaWxTaXplOworCisgICAgICAgICAgICBDb21wb25lbnRTaXplQ2hvb3NlcihpbnQgZ2xWZXJzaW9uLCBpbnQgcmVkU2l6ZSwgaW50IGdyZWVuU2l6ZSwgaW50IGJsdWVTaXplLAorICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFTaXplLCBpbnQgZGVwdGhTaXplLCBpbnQgc3RlbmNpbFNpemUpIHsKKyAgICAgICAgICAgICAgICBzdXBlcihnbFZlcnNpb24sIG5ldyBpbnRbXSB7CisgICAgICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfUkVEX1NJWkUsIHJlZFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfR1JFRU5fU0laRSwgZ3JlZW5TaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX0JMVUVfU0laRSwgYmx1ZVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfQUxQSEFfU0laRSwgYWxwaGFTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX0RFUFRIX1NJWkUsIGRlcHRoU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9TVEVOQ0lMX1NJWkUsIHN0ZW5jaWxTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX05PTkUgfSk7CisgICAgICAgICAgICAgICAgbVZhbHVlID0gbmV3IGludFsxXTsKKyAgICAgICAgICAgICAgICBtUmVkU2l6ZSA9IHJlZFNpemU7CisgICAgICAgICAgICAgICAgbUdyZWVuU2l6ZSA9IGdyZWVuU2l6ZTsKKyAgICAgICAgICAgICAgICBtQmx1ZVNpemUgPSBibHVlU2l6ZTsKKyAgICAgICAgICAgICAgICBtQWxwaGFTaXplID0gYWxwaGFTaXplOworICAgICAgICAgICAgICAgIG1EZXB0aFNpemUgPSBkZXB0aFNpemU7CisgICAgICAgICAgICAgICAgbVN0ZW5jaWxTaXplID0gc3RlbmNpbFNpemU7CisgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBFR0xDb25maWcgY2hvb3NlQ29uZmlnKEVHTDEwIGVnbCwgRUdMRGlzcGxheSBkaXNwbGF5LCBFR0xDb25maWdbXSBjb25maWdzKSB7CisgICAgICAgICAgICAgICAgZm9yIChFR0xDb25maWcgY29uZmlnIDogY29uZmlncykgeworICAgICAgICAgICAgICAgICAgICBpbnQgZCA9IGZpbmRDb25maWdBdHRyaWIoZWdsLCBkaXNwbGF5LCBjb25maWcsIEVHTDEwLkVHTF9ERVBUSF9TSVpFLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IHMgPSBmaW5kQ29uZmlnQXR0cmliKGVnbCwgZGlzcGxheSwgY29uZmlnLCBFR0wxMC5FR0xfU1RFTkNJTF9TSVpFLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChkID49IG1EZXB0aFNpemUpICYmIChzID49IG1TdGVuY2lsU2l6ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCByID0gZmluZENvbmZpZ0F0dHJpYihlZ2wsIGRpc3BsYXksIGNvbmZpZywgRUdMMTAuRUdMX1JFRF9TSVpFLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBnID0gZmluZENvbmZpZ0F0dHJpYihlZ2wsIGRpc3BsYXksIGNvbmZpZywgRUdMMTAuRUdMX0dSRUVOX1NJWkUsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGIgPSBmaW5kQ29uZmlnQXR0cmliKGVnbCwgZGlzcGxheSwgY29uZmlnLCBFR0wxMC5FR0xfQkxVRV9TSVpFLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBhID0gZmluZENvbmZpZ0F0dHJpYihlZ2wsIGRpc3BsYXksIGNvbmZpZywgRUdMMTAuRUdMX0FMUEhBX1NJWkUsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChyID09IG1SZWRTaXplKSAmJiAoZyA9PSBtR3JlZW5TaXplKSAmJiAoYiA9PSBtQmx1ZVNpemUpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhID09IG1BbHBoYVNpemUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbmZpZzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHJpdmF0ZSBpbnQgZmluZENvbmZpZ0F0dHJpYihFR0wxMCBlZ2wsIEVHTERpc3BsYXkgZGlzcGxheSwKKyAgICAgICAgICAgICAgICAgICAgRUdMQ29uZmlnIGNvbmZpZywgaW50IGF0dHJpYnV0ZSwgaW50IGRlZmF1bHRWYWx1ZSkgeworCisgICAgICAgICAgICAgICAgaWYgKGVnbC5lZ2xHZXRDb25maWdBdHRyaWIoZGlzcGxheSwgY29uZmlnLCBhdHRyaWJ1dGUsIG1WYWx1ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1WYWx1ZVswXTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICB9ICAgICAgICAKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogSGFyZHdhcmUgcmVuZGVyZXIgdXNpbmcgT3BlbkdMIEVTIDIuMC4KKyAgICAgKi8KKyAgICBzdGF0aWMgY2xhc3MgR2wyMFJlbmRlcmVyIGV4dGVuZHMgR2xSZW5kZXJlciB7CisgICAgICAgIHByaXZhdGUgR0xFUzIwQ2FudmFzIG1HbENhbnZhczsKKworICAgICAgICBHbDIwUmVuZGVyZXIoYm9vbGVhbiB0cmFuc2x1Y2VudCkgeworICAgICAgICAgICAgc3VwZXIoMiwgdHJhbnNsdWNlbnQpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIENhbnZhcyBjcmVhdGVDYW52YXMoKSB7CisgICAgICAgICAgICByZXR1cm4gbUdsQ2FudmFzID0gbmV3IEdMRVMyMENhbnZhcyhtR2wsIG1UcmFuc2x1Y2VudCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgdm9pZCBvblByZURyYXcoKSB7CisgICAgICAgICAgICBtR2xDYW52YXMub25QcmVEcmF3KCk7CisgICAgICAgIH0gICAgICAgIAorICAgIH0KKworICAgIC8qKgorICAgICAqIEhhcmR3YXJlIHJlbmRlcmVyIHVzaW5nIE9wZW5HTCBFUyAxLjAuCisgICAgICovCisgICAgQFN1cHByZXNzV2FybmluZ3MoeyJkZXByZWNhdGlvbiJ9KQorICAgIHN0YXRpYyBjbGFzcyBHbDEwUmVuZGVyZXIgZXh0ZW5kcyBHbFJlbmRlcmVyIHsKKyAgICAgICAgR2wxMFJlbmRlcmVyKGJvb2xlYW4gdHJhbnNsdWNlbnQpIHsKKyAgICAgICAgICAgIHN1cGVyKDEsIHRyYW5zbHVjZW50KTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBDYW52YXMgY3JlYXRlQ2FudmFzKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBDYW52YXMobUdsKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICB2b2lkIGRlc3Ryb3koKSB7CisgICAgICAgICAgICBpZiAoaXNFbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICBuYXRpdmVBYmFuZG9uR2xDYWNoZXMoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3VwZXIuZGVzdHJveSgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHZvaWQgb25QcmVEcmF3KCkgeworICAgICAgICAgICAgR0wxMSBnbCA9IChHTDExKSBtR2w7CisgICAgICAgICAgICBnbC5nbERpc2FibGUoR0xfU0NJU1NPUl9URVNUKTsKKyAgICAgICAgICAgIGdsLmdsQ2xlYXJDb2xvcigwLCAwLCAwLCAwKTsKKyAgICAgICAgICAgIGdsLmdsQ2xlYXIoR0xfQ09MT1JfQlVGRkVSX0JJVCk7CisgICAgICAgICAgICBnbC5nbEVuYWJsZShHTF9TQ0lTU09SX1RFU1QpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gSW5mb3JtIFNraWEgdG8ganVzdCBhYmFuZG9uIGl0cyB0ZXh0dXJlIGNhY2hlIElEcyBkb2Vzbid0IGNhbGwgZ2xEZWxldGVUZXh0dXJlcworICAgIC8vIFVzZWQgb25seSBieSB0aGUgbmF0aXZlIFNraWEgT3BlbkdMIEVTIDEueCBpbXBsZW1lbnRhdGlvbgorICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIG5hdGl2ZUFiYW5kb25HbENhY2hlcygpOworfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9MYXlvdXRJbmZsYXRlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9MYXlvdXRJbmZsYXRlci5qYXZhCmluZGV4IGU1OTg1YzEuLjQ3OWU3NTcgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvTGF5b3V0SW5mbGF0ZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L0xheW91dEluZmxhdGVyLmphdmEKQEAgLTE2LDE1ICsxNiwxNSBAQAogCiBwYWNrYWdlIGFuZHJvaWQudmlldzsKIAoraW1wb3J0IG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXI7CitpbXBvcnQgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjsKKwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuVHlwZWRBcnJheTsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlhtbFJlc291cmNlUGFyc2VyOwogaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlhtbDsKIAotaW1wb3J0IG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXI7Ci1pbXBvcnQgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjsKLQogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3I7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CkBAIC03MSwxMSArNzEsMTEgQEAKIAogICAgIHByaXZhdGUgZmluYWwgT2JqZWN0W10gbUNvbnN0cnVjdG9yQXJncyA9IG5ldyBPYmplY3RbMl07CiAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzc1tdIG1Db25zdHJ1Y3RvclNpZ25hdHVyZSA9IG5ldyBDbGFzc1tdIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzczw/PltdIG1Db25zdHJ1Y3RvclNpZ25hdHVyZSA9IG5ldyBDbGFzc1tdIHsKICAgICAgICAgICAgIENvbnRleHQuY2xhc3MsIEF0dHJpYnV0ZVNldC5jbGFzc307CiAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBIYXNoTWFwPFN0cmluZywgQ29uc3RydWN0b3I+IHNDb25zdHJ1Y3Rvck1hcCA9Ci0gICAgICAgICAgICBuZXcgSGFzaE1hcDxTdHJpbmcsIENvbnN0cnVjdG9yPigpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEhhc2hNYXA8U3RyaW5nLCBDb25zdHJ1Y3Rvcjw/IGV4dGVuZHMgVmlldz4+IHNDb25zdHJ1Y3Rvck1hcCA9CisgICAgICAgICAgICBuZXcgSGFzaE1hcDxTdHJpbmcsIENvbnN0cnVjdG9yPD8gZXh0ZW5kcyBWaWV3Pj4oKTsKICAgICAKICAgICBwcml2YXRlIEhhc2hNYXA8U3RyaW5nLCBCb29sZWFuPiBtRmlsdGVyTWFwOwogCkBAIC05Nyw2ICs5Nyw3IEBACiAgICAgICAgICAqIAogICAgICAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhpcyBjbGFzcyBpcyBhbGxvd2VkIHRvIGJlIGluZmxhdGVkLCBvciBmYWxzZSBvdGhlcndpc2UKICAgICAgICAgICovCisgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQogICAgICAgICBib29sZWFuIG9uTG9hZENsYXNzKENsYXNzIGNsYXp6KTsKICAgICB9CiAgICAgCkBAIC0zNzksNyArMzgwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiVmlld0dyb3VwIHJvb3QgYW5kIGF0dGFjaFRvUm9vdD10cnVlIik7CiAgICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgICBySW5mbGF0ZShwYXJzZXIsIHJvb3QsIGF0dHJzKTsKKyAgICAgICAgICAgICAgICAgICAgckluZmxhdGUocGFyc2VyLCByb290LCBhdHRycywgZmFsc2UpOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIFRlbXAgaXMgdGhlIHJvb3QgdmlldyB0aGF0IHdhcyBmb3VuZCBpbiB0aGUgeG1sCiAgICAgICAgICAgICAgICAgICAgIFZpZXcgdGVtcCA9IGNyZWF0ZVZpZXdGcm9tVGFnKG5hbWUsIGF0dHJzKTsKQEAgLTQwNCw3ICs0MDUsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCItLS0tLT4gc3RhcnQgaW5mbGF0aW5nIGNoaWxkcmVuIik7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgLy8gSW5mbGF0ZSBhbGwgY2hpbGRyZW4gdW5kZXIgdGVtcAotICAgICAgICAgICAgICAgICAgICBySW5mbGF0ZShwYXJzZXIsIHRlbXAsIGF0dHJzKTsKKyAgICAgICAgICAgICAgICAgICAgckluZmxhdGUocGFyc2VyLCB0ZW1wLCBhdHRycywgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgewogICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCItLS0tLT4gZG9uZSBpbmZsYXRpbmcgY2hpbGRyZW4iKTsKICAgICAgICAgICAgICAgICAgICAgfQpAQCAtNDUzLDE4ICs0NTQsMTggQEAKICAgICAgKiBAcGFyYW0gbmFtZSBUaGUgZnVsbCBuYW1lIG9mIHRoZSBjbGFzcyB0byBiZSBpbnN0YW50aWF0ZWQuCiAgICAgICogQHBhcmFtIGF0dHJzIFRoZSBYTUwgYXR0cmlidXRlcyBzdXBwbGllZCBmb3IgdGhpcyBpbnN0YW5jZS4KICAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFZpZXcgVGhlIG5ld2x5IGluc3RhbnRpZWQgdmlldywgb3IgbnVsbC4KKyAgICAgKiBAcmV0dXJuIFZpZXcgVGhlIG5ld2x5IGluc3RhbnRpYXRlZCB2aWV3LCBvciBudWxsLgogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBWaWV3IGNyZWF0ZVZpZXcoU3RyaW5nIG5hbWUsIFN0cmluZyBwcmVmaXgsIEF0dHJpYnV0ZVNldCBhdHRycykKICAgICAgICAgICAgIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uLCBJbmZsYXRlRXhjZXB0aW9uIHsKLSAgICAgICAgQ29uc3RydWN0b3IgY29uc3RydWN0b3IgPSBzQ29uc3RydWN0b3JNYXAuZ2V0KG5hbWUpOwotICAgICAgICBDbGFzcyBjbGF6eiA9IG51bGw7CisgICAgICAgIENvbnN0cnVjdG9yPD8gZXh0ZW5kcyBWaWV3PiBjb25zdHJ1Y3RvciA9IHNDb25zdHJ1Y3Rvck1hcC5nZXQobmFtZSk7CisgICAgICAgIENsYXNzPD8gZXh0ZW5kcyBWaWV3PiBjbGF6eiA9IG51bGw7CiAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGlmIChjb25zdHJ1Y3RvciA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgLy8gQ2xhc3Mgbm90IGZvdW5kIGluIHRoZSBjYWNoZSwgc2VlIGlmIGl0J3MgcmVhbCwgYW5kIHRyeSB0byBhZGQgaXQKICAgICAgICAgICAgICAgICBjbGF6eiA9IG1Db250ZXh0LmdldENsYXNzTG9hZGVyKCkubG9hZENsYXNzKAotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ICE9IG51bGwgPyAocHJlZml4ICsgbmFtZSkgOiBuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCAhPSBudWxsID8gKHByZWZpeCArIG5hbWUpIDogbmFtZSkuYXNTdWJjbGFzcyhWaWV3LmNsYXNzKTsKICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICBpZiAobUZpbHRlciAhPSBudWxsICYmIGNsYXp6ICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBhbGxvd2VkID0gbUZpbHRlci5vbkxvYWRDbGFzcyhjbGF6eik7CkBAIC00ODIsNyArNDgzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgaWYgKGFsbG93ZWRTdGF0ZSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOZXcgY2xhc3MgLS0gcmVtZW1iZXIgd2hldGhlciBpdCBpcyBhbGxvd2VkCiAgICAgICAgICAgICAgICAgICAgICAgICBjbGF6eiA9IG1Db250ZXh0LmdldENsYXNzTG9hZGVyKCkubG9hZENsYXNzKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggIT0gbnVsbCA/IChwcmVmaXggKyBuYW1lKSA6IG5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggIT0gbnVsbCA/IChwcmVmaXggKyBuYW1lKSA6IG5hbWUpLmFzU3ViY2xhc3MoVmlldy5jbGFzcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gYWxsb3dlZCA9IGNsYXp6ICE9IG51bGwgJiYgbUZpbHRlci5vbkxvYWRDbGFzcyhjbGF6eik7CiAgICAgICAgICAgICAgICAgICAgICAgICBtRmlsdGVyTWFwLnB1dChuYW1lLCBhbGxvd2VkKTsKQEAgLTQ5Nyw3ICs0OTgsNyBAQAogCiAgICAgICAgICAgICBPYmplY3RbXSBhcmdzID0gbUNvbnN0cnVjdG9yQXJnczsKICAgICAgICAgICAgIGFyZ3NbMV0gPSBhdHRyczsKLSAgICAgICAgICAgIHJldHVybiAoVmlldykgY29uc3RydWN0b3IubmV3SW5zdGFuY2UoYXJncyk7CisgICAgICAgICAgICByZXR1cm4gY29uc3RydWN0b3IubmV3SW5zdGFuY2UoYXJncyk7CiAKICAgICAgICAgfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIEluZmxhdGVFeGNlcHRpb24gaWUgPSBuZXcgSW5mbGF0ZUV4Y2VwdGlvbihhdHRycy5nZXRQb3NpdGlvbkRlc2NyaXB0aW9uKCkKQEAgLTUwNiw2ICs1MDcsMTMgQEAKICAgICAgICAgICAgIGllLmluaXRDYXVzZShlKTsKICAgICAgICAgICAgIHRocm93IGllOwogCisgICAgICAgIH0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBJZiBsb2FkZWQgY2xhc3MgaXMgbm90IGEgVmlldyBzdWJjbGFzcworICAgICAgICAgICAgSW5mbGF0ZUV4Y2VwdGlvbiBpZSA9IG5ldyBJbmZsYXRlRXhjZXB0aW9uKGF0dHJzLmdldFBvc2l0aW9uRGVzY3JpcHRpb24oKQorICAgICAgICAgICAgICAgICAgICArICI6IENsYXNzIGlzIG5vdCBhIFZpZXcgIgorICAgICAgICAgICAgICAgICAgICArIChwcmVmaXggIT0gbnVsbCA/IChwcmVmaXggKyBuYW1lKSA6IG5hbWUpKTsKKyAgICAgICAgICAgIGllLmluaXRDYXVzZShlKTsKKyAgICAgICAgICAgIHRocm93IGllOwogICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIC8vIElmIGxvYWRDbGFzcyBmYWlscywgd2Ugc2hvdWxkIHByb3BhZ2F0ZSB0aGUgZXhjZXB0aW9uLgogICAgICAgICAgICAgdGhyb3cgZTsKQEAgLTUxOSw3ICs1MjcsNyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFRocm93IGFuIGV4Y3BldGlvbiBiZWNhdXNlIHRoZSBzcGVjaWZpZWQgY2xhc3MgaXMgbm90IGFsbG93ZWQgdG8gYmUgaW5mbGF0ZWQuCisgICAgICogVGhyb3cgYW4gZXhjZXB0aW9uIGJlY2F1c2UgdGhlIHNwZWNpZmllZCBjbGFzcyBpcyBub3QgYWxsb3dlZCB0byBiZSBpbmZsYXRlZC4KICAgICAgKi8KICAgICBwcml2YXRlIHZvaWQgZmFpbE5vdEFsbG93ZWQoU3RyaW5nIG5hbWUsIFN0cmluZyBwcmVmaXgsIEF0dHJpYnV0ZVNldCBhdHRycykgewogICAgICAgICBJbmZsYXRlRXhjZXB0aW9uIGllID0gbmV3IEluZmxhdGVFeGNlcHRpb24oYXR0cnMuZ2V0UG9zaXRpb25EZXNjcmlwdGlvbigpCkBAIC01OTAsOCArNTk4LDggQEAKICAgICAgKiBSZWN1cnNpdmUgbWV0aG9kIHVzZWQgdG8gZGVzY2VuZCBkb3duIHRoZSB4bWwgaGllcmFyY2h5IGFuZCBpbnN0YW50aWF0ZQogICAgICAqIHZpZXdzLCBpbnN0YW50aWF0ZSB0aGVpciBjaGlsZHJlbiwgYW5kIHRoZW4gY2FsbCBvbkZpbmlzaEluZmxhdGUoKS4KICAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgckluZmxhdGUoWG1sUHVsbFBhcnNlciBwYXJzZXIsIFZpZXcgcGFyZW50LCBmaW5hbCBBdHRyaWJ1dGVTZXQgYXR0cnMpCi0gICAgICAgICAgICB0aHJvd3MgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgIHByaXZhdGUgdm9pZCBySW5mbGF0ZShYbWxQdWxsUGFyc2VyIHBhcnNlciwgVmlldyBwYXJlbnQsIGZpbmFsIEF0dHJpYnV0ZVNldCBhdHRycywKKyAgICAgICAgICAgIGJvb2xlYW4gZmluaXNoSW5mbGF0ZSkgdGhyb3dzIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKIAogICAgICAgICBmaW5hbCBpbnQgZGVwdGggPSBwYXJzZXIuZ2V0RGVwdGgoKTsKICAgICAgICAgaW50IHR5cGU7CkBAIC02MTgsMTIgKzYyNiwxMiBAQAogICAgICAgICAgICAgICAgIGZpbmFsIFZpZXcgdmlldyA9IGNyZWF0ZVZpZXdGcm9tVGFnKG5hbWUsIGF0dHJzKTsKICAgICAgICAgICAgICAgICBmaW5hbCBWaWV3R3JvdXAgdmlld0dyb3VwID0gKFZpZXdHcm91cCkgcGFyZW50OwogICAgICAgICAgICAgICAgIGZpbmFsIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMgcGFyYW1zID0gdmlld0dyb3VwLmdlbmVyYXRlTGF5b3V0UGFyYW1zKGF0dHJzKTsKLSAgICAgICAgICAgICAgICBySW5mbGF0ZShwYXJzZXIsIHZpZXcsIGF0dHJzKTsKKyAgICAgICAgICAgICAgICBySW5mbGF0ZShwYXJzZXIsIHZpZXcsIGF0dHJzLCB0cnVlKTsKICAgICAgICAgICAgICAgICB2aWV3R3JvdXAuYWRkVmlldyh2aWV3LCBwYXJhbXMpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgcGFyZW50Lm9uRmluaXNoSW5mbGF0ZSgpOworICAgICAgICBpZiAoZmluaXNoSW5mbGF0ZSkgcGFyZW50Lm9uRmluaXNoSW5mbGF0ZSgpOwogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBwYXJzZVJlcXVlc3RGb2N1cyhYbWxQdWxsUGFyc2VyIHBhcnNlciwgVmlldyBwYXJlbnQpCkBAIC02NzQsNyArNjgyLDcgQEAKIAogICAgICAgICAgICAgICAgICAgICBpZiAoVEFHX01FUkdFLmVxdWFscyhjaGlsZE5hbWUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbmZsYXRlIGFsbCBjaGlsZHJlbi4KLSAgICAgICAgICAgICAgICAgICAgICAgIHJJbmZsYXRlKGNoaWxkUGFyc2VyLCBwYXJlbnQsIGNoaWxkQXR0cnMpOworICAgICAgICAgICAgICAgICAgICAgICAgckluZmxhdGUoY2hpbGRQYXJzZXIsIHBhcmVudCwgY2hpbGRBdHRycywgZmFsc2UpOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgVmlldyB2aWV3ID0gY3JlYXRlVmlld0Zyb21UYWcoY2hpbGROYW1lLCBjaGlsZEF0dHJzKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFZpZXdHcm91cCBncm91cCA9IChWaWV3R3JvdXApIHBhcmVudDsKQEAgLTY5OSw3ICs3MDcsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbmZsYXRlIGFsbCBjaGlsZHJlbi4KLSAgICAgICAgICAgICAgICAgICAgICAgIHJJbmZsYXRlKGNoaWxkUGFyc2VyLCB2aWV3LCBjaGlsZEF0dHJzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJJbmZsYXRlKGNoaWxkUGFyc2VyLCB2aWV3LCBjaGlsZEF0dHJzLCB0cnVlKTsKIAogICAgICAgICAgICAgICAgICAgICAgICAgLy8gQXR0ZW1wdCB0byBvdmVycmlkZSB0aGUgaW5jbHVkZWQgbGF5b3V0J3MgYW5kcm9pZDppZCB3aXRoIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAgLy8gb25lIHNldCBvbiB0aGUgPGluY2x1ZGUgLz4gdGFnIGl0c2VsZi4KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvTWVudUluZmxhdGVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L01lbnVJbmZsYXRlci5qYXZhCmluZGV4IDQ2YzgwNWMuLjMzMzVlODUgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvTWVudUluZmxhdGVyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9NZW51SW5mbGF0ZXIuamF2YQpAQCAtMTYsOSArMTYsOCBAQAogCiBwYWNrYWdlIGFuZHJvaWQudmlldzsKIAotaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcubWVudS5NZW51SXRlbUltcGw7Ci0KIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKIAogaW1wb3J0IG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXI7CiBpbXBvcnQgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjsKQEAgLTMwLDYgKzI5LDggQEAKIGltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OwogaW1wb3J0IGFuZHJvaWQudXRpbC5YbWw7CiAKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuTWVudUl0ZW1JbXBsOworCiAvKioKICAqIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBpbnN0YW50aWF0ZSBtZW51IFhNTCBmaWxlcyBpbnRvIE1lbnUgb2JqZWN0cy4KICAqIDxwPgpAQCAtMTY2LDYgKzE2Nyw0MSBAQAogICAgICAgICB9CiAgICAgfQogICAgIAorICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEluZmxhdGVkT25NZW51SXRlbUNsaWNrTGlzdGVuZXIKKyAgICAgICAgICAgIGltcGxlbWVudHMgTWVudUl0ZW0uT25NZW51SXRlbUNsaWNrTGlzdGVuZXIgeworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzc1tdIFBBUkFNX1RZUEVTID0gbmV3IENsYXNzW10geyBNZW51SXRlbS5jbGFzcyB9OworICAgICAgICAKKyAgICAgICAgcHJpdmF0ZSBDb250ZXh0IG1Db250ZXh0OworICAgICAgICBwcml2YXRlIE1ldGhvZCBtTWV0aG9kOworICAgICAgICAKKyAgICAgICAgcHVibGljIEluZmxhdGVkT25NZW51SXRlbUNsaWNrTGlzdGVuZXIoQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgbWV0aG9kTmFtZSkgeworICAgICAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OworICAgICAgICAgICAgQ2xhc3MgYyA9IGNvbnRleHQuZ2V0Q2xhc3MoKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbU1ldGhvZCA9IGMuZ2V0TWV0aG9kKG1ldGhvZE5hbWUsIFBBUkFNX1RZUEVTKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgSW5mbGF0ZUV4Y2VwdGlvbiBleCA9IG5ldyBJbmZsYXRlRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkbid0IHJlc29sdmUgbWVudSBpdGVtIG9uQ2xpY2sgaGFuZGxlciAiICsgbWV0aG9kTmFtZSArCisgICAgICAgICAgICAgICAgICAgICAgICAiIGluIGNsYXNzICIgKyBjLmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgZXguaW5pdENhdXNlKGUpOworICAgICAgICAgICAgICAgIHRocm93IGV4OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwdWJsaWMgYm9vbGVhbiBvbk1lbnVJdGVtQ2xpY2soTWVudUl0ZW0gaXRlbSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBpZiAobU1ldGhvZC5nZXRSZXR1cm5UeXBlKCkgPT0gQm9vbGVhbi5UWVBFKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAoQm9vbGVhbikgbU1ldGhvZC5pbnZva2UobUNvbnRleHQsIGl0ZW0pOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG1NZXRob2QuaW52b2tlKG1Db250ZXh0LCBpdGVtKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAKICAgICAvKioKICAgICAgKiBTdGF0ZSBmb3IgdGhlIGN1cnJlbnQgbWVudS4KICAgICAgKiA8cD4KQEAgLTIwNSw2ICsyNDEsMTYgQEAKICAgICAgICAgcHJpdmF0ZSBib29sZWFuIGl0ZW1WaXNpYmxlOwogICAgICAgICBwcml2YXRlIGJvb2xlYW4gaXRlbUVuYWJsZWQ7CiAgICAgICAgIAorICAgICAgICAvKioKKyAgICAgICAgICogU3luYyB0byBhdHRycy54bWwgZW51bToKKyAgICAgICAgICogLSAwOiBuZXZlcgorICAgICAgICAgKiAtIDE6IGlmUm9vbQorICAgICAgICAgKiAtIDI6IGFsd2F5cworICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBpbnQgaXRlbVNob3dBc0FjdGlvbjsKKyAgICAgICAgCisgICAgICAgIHByaXZhdGUgU3RyaW5nIGl0ZW1MaXN0ZW5lck1ldGhvZE5hbWU7CisgICAgICAgIAogICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgZGVmYXVsdEdyb3VwSWQgPSBOT19JRDsKICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IGRlZmF1bHRJdGVtSWQgPSBOT19JRDsKICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IGRlZmF1bHRJdGVtQ2F0ZWdvcnkgPSAwOwpAQCAtMjc2LDYgKzMyMiw4IEBACiAgICAgICAgICAgICBpdGVtQ2hlY2tlZCA9IGEuZ2V0Qm9vbGVhbihjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5NZW51SXRlbV9jaGVja2VkLCBkZWZhdWx0SXRlbUNoZWNrZWQpOwogICAgICAgICAgICAgaXRlbVZpc2libGUgPSBhLmdldEJvb2xlYW4oY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuTWVudUl0ZW1fdmlzaWJsZSwgZ3JvdXBWaXNpYmxlKTsKICAgICAgICAgICAgIGl0ZW1FbmFibGVkID0gYS5nZXRCb29sZWFuKGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLk1lbnVJdGVtX2VuYWJsZWQsIGdyb3VwRW5hYmxlZCk7CisgICAgICAgICAgICBpdGVtU2hvd0FzQWN0aW9uID0gYS5nZXRJbnQoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuTWVudUl0ZW1fc2hvd0FzQWN0aW9uLCAwKTsKKyAgICAgICAgICAgIGl0ZW1MaXN0ZW5lck1ldGhvZE5hbWUgPSBhLmdldFN0cmluZyhjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5NZW51SXRlbV9vbkNsaWNrKTsKICAgICAgICAgICAgIAogICAgICAgICAgICAgYS5yZWN5Y2xlKCk7CiAgICAgICAgICAgICAKQEAgLTI5OSw5ICszNDcsMTggQEAKICAgICAgICAgICAgICAgICAuc2V0SWNvbihpdGVtSWNvblJlc0lkKQogICAgICAgICAgICAgICAgIC5zZXRBbHBoYWJldGljU2hvcnRjdXQoaXRlbUFscGhhYmV0aWNTaG9ydGN1dCkKICAgICAgICAgICAgICAgICAuc2V0TnVtZXJpY1Nob3J0Y3V0KGl0ZW1OdW1lcmljU2hvcnRjdXQpOworICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoaXRlbUxpc3RlbmVyTWV0aG9kTmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaXRlbS5zZXRPbk1lbnVJdGVtQ2xpY2tMaXN0ZW5lcigKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBJbmZsYXRlZE9uTWVudUl0ZW1DbGlja0xpc3RlbmVyKG1Db250ZXh0LCBpdGVtTGlzdGVuZXJNZXRob2ROYW1lKSk7CisgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGlmIChpdGVtQ2hlY2thYmxlID49IDIpIHsKLSAgICAgICAgICAgICAgICAoKE1lbnVJdGVtSW1wbCkgaXRlbSkuc2V0RXhjbHVzaXZlQ2hlY2thYmxlKHRydWUpOworICAgICAgICAgICAgaWYgKGl0ZW0gaW5zdGFuY2VvZiBNZW51SXRlbUltcGwpIHsKKyAgICAgICAgICAgICAgICBNZW51SXRlbUltcGwgaW1wbCA9IChNZW51SXRlbUltcGwpIGl0ZW07CisgICAgICAgICAgICAgICAgaWYgKGl0ZW1DaGVja2FibGUgPj0gMikgeworICAgICAgICAgICAgICAgICAgICBpbXBsLnNldEV4Y2x1c2l2ZUNoZWNrYWJsZSh0cnVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaW1wbC5zZXRTaG93QXNBY3Rpb24oaXRlbVNob3dBc0FjdGlvbik7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1ZpZXcuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvVmlldy5qYXZhCmluZGV4IDExZTVhZDEuLjM0NjFjYmYgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvVmlldy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvVmlldy5qYXZhCkBAIC04ODcsNiArODg3LDIwIEBACiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSEFQVElDX0ZFRURCQUNLX0VOQUJMRUQgPSAweDEwMDAwMDAwOwogCiAgICAgLyoqCisgICAgICogPHA+SW5kaWNhdGVzIHRoYXQgdGhlIHZpZXcgaGllcmFyY2h5IHNob3VsZCBzdG9wIHNhdmluZyBzdGF0ZSB3aGVuCisgICAgICogaXQgcmVhY2hlcyB0aGlzIHZpZXcuICBJZiBzdGF0ZSBzYXZpbmcgaXMgaW5pdGlhdGVkIGltbWVkaWF0ZWx5IGF0CisgICAgICogdGhlIHZpZXcsIGl0IHdpbGwgYmUgYWxsb3dlZC4KKyAgICAgKiB7QGhpZGV9CisgICAgICovCisgICAgc3RhdGljIGZpbmFsIGludCBQQVJFTlRfU0FWRV9ESVNBQkxFRCA9IDB4MjAwMDAwMDA7CisKKyAgICAvKioKKyAgICAgKiA8cD5NYXNrIGZvciB1c2Ugd2l0aCBzZXRGbGFncyBpbmRpY2F0aW5nIGJpdHMgdXNlZCBmb3IgUEFSRU5UX1NBVkVfRElTQUJMRUQuPC9wPgorICAgICAqIHtAaGlkZX0KKyAgICAgKi8KKyAgICBzdGF0aWMgZmluYWwgaW50IFBBUkVOVF9TQVZFX0RJU0FCTEVEX01BU0sgPSAweDIwMDAwMDAwOworCisgICAgLyoqCiAgICAgICogVmlldyBmbGFnIGluZGljYXRpbmcgd2hldGhlciB7QGxpbmsgI2FkZEZvY3VzYWJsZXMoQXJyYXlMaXN0LCBpbnQsIGludCl9CiAgICAgICogc2hvdWxkIGFkZCBhbGwgZm9jdXNhYmxlIFZpZXdzIHJlZ2FyZGxlc3MgaWYgdGhleSBhcmUgZm9jdXNhYmxlIGluIHRvdWNoIG1vZGUuCiAgICAgICovCkBAIC0zMzQyLDYgKzMzNTYsMzggQEAKIAogCiAgICAgLyoqCisgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGVudGlyZSBoaWVyYXJjaHkgdW5kZXIgdGhpcyB2aWV3IHdpbGwgc2F2ZSBpdHMKKyAgICAgKiBzdGF0ZSB3aGVuIGEgc3RhdGUgc2F2aW5nIHRyYXZlcnNhbCBvY2N1cnMgZnJvbSBpdHMgcGFyZW50LiAgVGhlIGRlZmF1bHQKKyAgICAgKiBpcyB0cnVlOyBpZiBmYWxzZSwgdGhlc2Ugdmlld3Mgd2lsbCBub3QgYmUgc2F2ZWQgdW5sZXNzCisgICAgICoge0BsaW5rICNzYXZlSGllcmFyY2h5U3RhdGUoU3BhcnNlQXJyYXkpfSBpcyBjYWxsZWQgZGlyZWN0bHkgb24gdGhpcyB2aWV3LgorICAgICAqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRydWUgaWYgdGhlIHZpZXcgc3RhdGUgc2F2aW5nIGZyb20gcGFyZW50IGlzIGVuYWJsZWQsIGVsc2UgZmFsc2UuCisgICAgICoKKyAgICAgKiBAc2VlICNzZXRTYXZlRnJvbVBhcmVudEVuYWJsZWQoYm9vbGVhbikKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1NhdmVGcm9tUGFyZW50RW5hYmxlZCgpIHsKKyAgICAgICAgcmV0dXJuIChtVmlld0ZsYWdzICYgUEFSRU5UX1NBVkVfRElTQUJMRURfTUFTSykgIT0gUEFSRU5UX1NBVkVfRElTQUJMRUQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udHJvbHMgd2hldGhlciB0aGUgZW50aXJlIGhpZXJhcmNoeSB1bmRlciB0aGlzIHZpZXcgd2lsbCBzYXZlIGl0cworICAgICAqIHN0YXRlIHdoZW4gYSBzdGF0ZSBzYXZpbmcgdHJhdmVyc2FsIG9jY3VycyBmcm9tIGl0cyBwYXJlbnQuICBUaGUgZGVmYXVsdAorICAgICAqIGlzIHRydWU7IGlmIGZhbHNlLCB0aGVzZSB2aWV3cyB3aWxsIG5vdCBiZSBzYXZlZCB1bmxlc3MKKyAgICAgKiB7QGxpbmsgI3NhdmVIaWVyYXJjaHlTdGF0ZShTcGFyc2VBcnJheSl9IGlzIGNhbGxlZCBkaXJlY3RseSBvbiB0aGlzIHZpZXcuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZW5hYmxlZCBTZXQgdG8gZmFsc2UgdG8gPGVtPmRpc2FibGU8L2VtPiBzdGF0ZSBzYXZpbmcsIG9yIHRydWUKKyAgICAgKiAodGhlIGRlZmF1bHQpIHRvIGFsbG93IGl0LgorICAgICAqCisgICAgICogQHNlZSAjaXNTYXZlRnJvbVBhcmVudEVuYWJsZWQoKQorICAgICAqIEBzZWUgI3NldElkKGludCkKKyAgICAgKiBAc2VlICNvblNhdmVJbnN0YW5jZVN0YXRlKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTYXZlRnJvbVBhcmVudEVuYWJsZWQoYm9vbGVhbiBlbmFibGVkKSB7CisgICAgICAgIHNldEZsYWdzKGVuYWJsZWQgPyAwIDogUEFSRU5UX1NBVkVfRElTQUJMRUQsIFBBUkVOVF9TQVZFX0RJU0FCTEVEX01BU0spOworICAgIH0KKworCisgICAgLyoqCiAgICAgICogUmV0dXJucyB3aGV0aGVyIHRoaXMgVmlldyBpcyBhYmxlIHRvIHRha2UgZm9jdXMuCiAgICAgICoKICAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhpcyB2aWV3IGNhbiB0YWtlIGZvY3VzLCBvciBmYWxzZSBvdGhlcndpc2UuCkBAIC04NTQ4LDEzICs4NTk0LDEyIEBACiAgICAgICAgIGlmIChtQXR0YWNoSW5mbyA9PSBudWxsKSB7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKChmbGFncyZIYXB0aWNGZWVkYmFja0NvbnN0YW50cy5GTEFHX0lHTk9SRV9WSUVXX1NFVFRJTkcpID09IDAKKyAgICAgICAgaWYgKChmbGFncyAmIEhhcHRpY0ZlZWRiYWNrQ29uc3RhbnRzLkZMQUdfSUdOT1JFX1ZJRVdfU0VUVElORykgPT0gMAogICAgICAgICAgICAgICAgICYmICFpc0hhcHRpY0ZlZWRiYWNrRW5hYmxlZCgpKSB7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1BdHRhY2hJbmZvLm1Sb290Q2FsbGJhY2tzLnBlcmZvcm1IYXB0aWNGZWVkYmFjaygKLSAgICAgICAgICAgICAgICBmZWVkYmFja0NvbnN0YW50LAotICAgICAgICAgICAgICAgIChmbGFncyZIYXB0aWNGZWVkYmFja0NvbnN0YW50cy5GTEFHX0lHTk9SRV9HTE9CQUxfU0VUVElORykgIT0gMCk7CisgICAgICAgIHJldHVybiBtQXR0YWNoSW5mby5tUm9vdENhbGxiYWNrcy5wZXJmb3JtSGFwdGljRmVlZGJhY2soZmVlZGJhY2tDb25zdGFudCwKKyAgICAgICAgICAgICAgICAoZmxhZ3MgJiBIYXB0aWNGZWVkYmFja0NvbnN0YW50cy5GTEFHX0lHTk9SRV9HTE9CQUxfU0VUVElORykgIT0gMCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC04NjI1LDggKzg2NzAsNyBAQAogICAgICAgICAgICAgICAgIFZpZXdDb25maWd1cmF0aW9uLmdldExvbmdQcmVzc1RpbWVvdXQoKSAtIGRlbGF5T2Zmc2V0KTsKICAgICB9CiAKLSAgICBwcml2YXRlIHN0YXRpYyBpbnRbXSBzdGF0ZVNldFVuaW9uKGZpbmFsIGludFtdIHN0YXRlU2V0MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludFtdIHN0YXRlU2V0MikgeworICAgIHByaXZhdGUgc3RhdGljIGludFtdIHN0YXRlU2V0VW5pb24oZmluYWwgaW50W10gc3RhdGVTZXQxLCBmaW5hbCBpbnRbXSBzdGF0ZVNldDIpIHsKICAgICAgICAgZmluYWwgaW50IHN0YXRlU2V0MUxlbmd0aCA9IHN0YXRlU2V0MS5sZW5ndGg7CiAgICAgICAgIGZpbmFsIGludCBzdGF0ZVNldDJMZW5ndGggPSBzdGF0ZVNldDIubGVuZ3RoOwogICAgICAgICBmaW5hbCBpbnRbXSBuZXdTZXQgPSBuZXcgaW50W3N0YXRlU2V0MUxlbmd0aCArIHN0YXRlU2V0Mkxlbmd0aF07CkBAIC04NjY0LDcgKzg3MDgsNyBAQAogICAgICAgICBMYXlvdXRJbmZsYXRlciBmYWN0b3J5ID0gTGF5b3V0SW5mbGF0ZXIuZnJvbShjb250ZXh0KTsKICAgICAgICAgcmV0dXJuIGZhY3RvcnkuaW5mbGF0ZShyZXNvdXJjZSwgcm9vdCk7CiAgICAgfQotCisgICAgCiAgICAgLyoqCiAgICAgICogQSBNZWFzdXJlU3BlYyBlbmNhcHN1bGF0ZXMgdGhlIGxheW91dCByZXF1aXJlbWVudHMgcGFzc2VkIGZyb20gcGFyZW50IHRvIGNoaWxkLgogICAgICAqIEVhY2ggTWVhc3VyZVNwZWMgcmVwcmVzZW50cyBhIHJlcXVpcmVtZW50IGZvciBlaXRoZXIgdGhlIHdpZHRoIG9yIHRoZSBoZWlnaHQuCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1ZpZXdHcm91cC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9WaWV3R3JvdXAuamF2YQppbmRleCBlN2I2YzUwLi4zNDc3N2NlIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1ZpZXdHcm91cC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvVmlld0dyb3VwLmphdmEKQEAgLTg2LDEwICs4NiwyMyBAQAogICAgIC8vIFRoZSB2aWV3IGNvbnRhaW5lZCB3aXRoaW4gdGhpcyBWaWV3R3JvdXAgdGhhdCBoYXMgb3IgY29udGFpbnMgZm9jdXMuCiAgICAgcHJpdmF0ZSBWaWV3IG1Gb2N1c2VkOwogCi0gICAgLy8gVGhlIGN1cnJlbnQgdHJhbnNmb3JtYXRpb24gdG8gYXBwbHkgb24gdGhlIGNoaWxkIGJlaW5nIGRyYXduCi0gICAgcHJpdmF0ZSBUcmFuc2Zvcm1hdGlvbiBtQ2hpbGRUcmFuc2Zvcm1hdGlvbjsKKyAgICAvKioKKyAgICAgKiBBIFRyYW5zZm9ybWF0aW9uIHVzZWQgd2hlbiBkcmF3aW5nIGNoaWxkcmVuLCB0bworICAgICAqIGFwcGx5IG9uIHRoZSBjaGlsZCBiZWluZyBkcmF3bi4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIFRyYW5zZm9ybWF0aW9uIG1DaGlsZFRyYW5zZm9ybWF0aW9uID0gbmV3IFRyYW5zZm9ybWF0aW9uKCk7CisKKyAgICAvKioKKyAgICAgKiBVc2VkIHRvIHRyYWNrIHRoZSBjdXJyZW50IGludmFsaWRhdGlvbiByZWdpb24uCisgICAgICovCiAgICAgcHJpdmF0ZSBSZWN0RiBtSW52YWxpZGF0ZVJlZ2lvbjsKIAorICAgIC8qKgorICAgICAqIEEgVHJhbnNmb3JtYXRpb24gdXNlZCB0byBjYWxjdWxhdGUgYSBjb3JyZWN0CisgICAgICogaW52YWxpZGF0aW9uIGFyZWEgd2hlbiB0aGUgYXBwbGljYXRpb24gaXMgYXV0b3NjYWxlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIFRyYW5zZm9ybWF0aW9uIG1JbnZhbGlkYXRpb25UcmFuc2Zvcm1hdGlvbjsKKwogICAgIC8vIFRhcmdldCBvZiBNb3Rpb24gZXZlbnRzCiAgICAgcHJpdmF0ZSBWaWV3IG1Nb3Rpb25UYXJnZXQ7CiAgICAgcHJpdmF0ZSBmaW5hbCBSZWN0IG1UZW1wUmVjdCA9IG5ldyBSZWN0KCk7CkBAIC0xMTgyLDcgKzExOTUsMTAgQEAKICAgICAgICAgZmluYWwgaW50IGNvdW50ID0gbUNoaWxkcmVuQ291bnQ7CiAgICAgICAgIGZpbmFsIFZpZXdbXSBjaGlsZHJlbiA9IG1DaGlsZHJlbjsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICBjaGlsZHJlbltpXS5kaXNwYXRjaFNhdmVJbnN0YW5jZVN0YXRlKGNvbnRhaW5lcik7CisgICAgICAgICAgICBWaWV3IGMgPSBjaGlsZHJlbltpXTsKKyAgICAgICAgICAgIGlmICgoYy5tVmlld0ZsYWdzICYgUEFSRU5UX1NBVkVfRElTQUJMRURfTUFTSykgIT0gUEFSRU5UX1NBVkVfRElTQUJMRUQpIHsKKyAgICAgICAgICAgICAgICBjLmRpc3BhdGNoU2F2ZUluc3RhbmNlU3RhdGUoY29udGFpbmVyKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIApAQCAtMTIwNyw3ICsxMjIzLDEwIEBACiAgICAgICAgIGZpbmFsIGludCBjb3VudCA9IG1DaGlsZHJlbkNvdW50OwogICAgICAgICBmaW5hbCBWaWV3W10gY2hpbGRyZW4gPSBtQ2hpbGRyZW47CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgY2hpbGRyZW5baV0uZGlzcGF0Y2hSZXN0b3JlSW5zdGFuY2VTdGF0ZShjb250YWluZXIpOworICAgICAgICAgICAgVmlldyBjID0gY2hpbGRyZW5baV07CisgICAgICAgICAgICBpZiAoKGMubVZpZXdGbGFncyAmIFBBUkVOVF9TQVZFX0RJU0FCTEVEX01BU0spICE9IFBBUkVOVF9TQVZFX0RJU0FCTEVEKSB7CisgICAgICAgICAgICAgICAgYy5kaXNwYXRjaFJlc3RvcmVJbnN0YW5jZVN0YXRlKGNvbnRhaW5lcik7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTE0NzcsMjEgKzE0OTYsMjUgQEAKICAgICAgICAgZmluYWwgaW50IGZsYWdzID0gbUdyb3VwRmxhZ3M7CiAKICAgICAgICAgaWYgKChmbGFncyAmIEZMQUdfQ0xFQVJfVFJBTlNGT1JNQVRJT04pID09IEZMQUdfQ0xFQVJfVFJBTlNGT1JNQVRJT04pIHsKLSAgICAgICAgICAgIGlmIChtQ2hpbGRUcmFuc2Zvcm1hdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUNoaWxkVHJhbnNmb3JtYXRpb24uY2xlYXIoKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1DaGlsZFRyYW5zZm9ybWF0aW9uLmNsZWFyKCk7CiAgICAgICAgICAgICBtR3JvdXBGbGFncyAmPSB+RkxBR19DTEVBUl9UUkFOU0ZPUk1BVElPTjsKICAgICAgICAgfQogCiAgICAgICAgIFRyYW5zZm9ybWF0aW9uIHRyYW5zZm9ybVRvQXBwbHkgPSBudWxsOworICAgICAgICBUcmFuc2Zvcm1hdGlvbiBpbnZhbGlkYXRpb25UcmFuc2Zvcm07CiAgICAgICAgIGZpbmFsIEFuaW1hdGlvbiBhID0gY2hpbGQuZ2V0QW5pbWF0aW9uKCk7CiAgICAgICAgIGJvb2xlYW4gY29uY2F0TWF0cml4ID0gZmFsc2U7CiAKKyAgICAgICAgYm9vbGVhbiBzY2FsaW5nUmVxdWlyZWQgPSBmYWxzZTsKKyAgICAgICAgYm9vbGVhbiBjYWNoaW5nID0gZmFsc2U7CisgICAgICAgIGlmICghY2FudmFzLmlzSGFyZHdhcmVBY2NlbGVyYXRlZCgpICYmCisgICAgICAgICAgICAgICAgKGZsYWdzICYgRkxBR19DSElMRFJFTl9EUkFXTl9XSVRIX0NBQ0hFKSA9PSBGTEFHX0NISUxEUkVOX0RSQVdOX1dJVEhfQ0FDSEUgfHwKKyAgICAgICAgICAgICAgICAoZmxhZ3MgJiBGTEFHX0FMV0FZU19EUkFXTl9XSVRIX0NBQ0hFKSA9PSBGTEFHX0FMV0FZU19EUkFXTl9XSVRIX0NBQ0hFKSB7CisgICAgICAgICAgICBjYWNoaW5nID0gdHJ1ZTsKKyAgICAgICAgICAgIGlmIChtQXR0YWNoSW5mbyAhPSBudWxsKSBzY2FsaW5nUmVxdWlyZWQgPSBtQXR0YWNoSW5mby5tU2NhbGluZ1JlcXVpcmVkOworICAgICAgICB9CisKICAgICAgICAgaWYgKGEgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKG1JbnZhbGlkYXRlUmVnaW9uID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtSW52YWxpZGF0ZVJlZ2lvbiA9IG5ldyBSZWN0RigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmluYWwgUmVjdEYgcmVnaW9uID0gbUludmFsaWRhdGVSZWdpb247CiAKICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gaW5pdGlhbGl6ZWQgPSBhLmlzSW5pdGlhbGl6ZWQoKTsKICAgICAgICAgICAgIGlmICghaW5pdGlhbGl6ZWQpIHsKQEAgLTE1MDAsMTAgKzE1MjMsMTcgQEAKICAgICAgICAgICAgICAgICBjaGlsZC5vbkFuaW1hdGlvblN0YXJ0KCk7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGlmIChtQ2hpbGRUcmFuc2Zvcm1hdGlvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUNoaWxkVHJhbnNmb3JtYXRpb24gPSBuZXcgVHJhbnNmb3JtYXRpb24oKTsKKyAgICAgICAgICAgIG1vcmUgPSBhLmdldFRyYW5zZm9ybWF0aW9uKGRyYXdpbmdUaW1lLCBtQ2hpbGRUcmFuc2Zvcm1hdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgc2NhbGluZ1JlcXVpcmVkID8gbUF0dGFjaEluZm8ubUFwcGxpY2F0aW9uU2NhbGUgOiAxZik7CisgICAgICAgICAgICBpZiAoc2NhbGluZ1JlcXVpcmVkICYmIG1BdHRhY2hJbmZvLm1BcHBsaWNhdGlvblNjYWxlICE9IDFmKSB7CisgICAgICAgICAgICAgICAgaWYgKG1JbnZhbGlkYXRpb25UcmFuc2Zvcm1hdGlvbiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG1JbnZhbGlkYXRpb25UcmFuc2Zvcm1hdGlvbiA9IG5ldyBUcmFuc2Zvcm1hdGlvbigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpbnZhbGlkYXRpb25UcmFuc2Zvcm0gPSBtSW52YWxpZGF0aW9uVHJhbnNmb3JtYXRpb247CisgICAgICAgICAgICAgICAgYS5nZXRUcmFuc2Zvcm1hdGlvbihkcmF3aW5nVGltZSwgaW52YWxpZGF0aW9uVHJhbnNmb3JtLCAxZik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGludmFsaWRhdGlvblRyYW5zZm9ybSA9IG1DaGlsZFRyYW5zZm9ybWF0aW9uOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgbW9yZSA9IGEuZ2V0VHJhbnNmb3JtYXRpb24oZHJhd2luZ1RpbWUsIG1DaGlsZFRyYW5zZm9ybWF0aW9uKTsKICAgICAgICAgICAgIHRyYW5zZm9ybVRvQXBwbHkgPSBtQ2hpbGRUcmFuc2Zvcm1hdGlvbjsKIAogICAgICAgICAgICAgY29uY2F0TWF0cml4ID0gYS53aWxsQ2hhbmdlVHJhbnNmb3JtYXRpb25NYXRyaXgoKTsKQEAgLTE1MjAsNyArMTU1MCwxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgaW52YWxpZGF0ZShjbCwgY3QsIGNyLCBjYik7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBhLmdldEludmFsaWRhdGVSZWdpb24oMCwgMCwgY3IgLSBjbCwgY2IgLSBjdCwgcmVnaW9uLCB0cmFuc2Zvcm1Ub0FwcGx5KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1JbnZhbGlkYXRlUmVnaW9uID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1JbnZhbGlkYXRlUmVnaW9uID0gbmV3IFJlY3RGKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZmluYWwgUmVjdEYgcmVnaW9uID0gbUludmFsaWRhdGVSZWdpb247CisgICAgICAgICAgICAgICAgICAgIGEuZ2V0SW52YWxpZGF0ZVJlZ2lvbigwLCAwLCBjciAtIGNsLCBjYiAtIGN0LCByZWdpb24sIGludmFsaWRhdGlvblRyYW5zZm9ybSk7CiAKICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGNoaWxkIG5lZWQgdG8gZHJhdyBhbiBhbmltYXRpb24sIHBvdGVudGlhbGx5IG9mZnNjcmVlbiwgc28KICAgICAgICAgICAgICAgICAgICAgLy8gbWFrZSBzdXJlIHdlIGRvIG5vdCBjYW5jZWwgaW52YWxpZGF0ZSByZXF1ZXN0cwpAQCAtMTUzMyw5ICsxNTY3LDYgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIGlmICgoZmxhZ3MgJiBGTEFHX1NVUFBPUlRfU1RBVElDX1RSQU5TRk9STUFUSU9OUykgPT0KICAgICAgICAgICAgICAgICBGTEFHX1NVUFBPUlRfU1RBVElDX1RSQU5TRk9STUFUSU9OUykgewotICAgICAgICAgICAgaWYgKG1DaGlsZFRyYW5zZm9ybWF0aW9uID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtQ2hpbGRUcmFuc2Zvcm1hdGlvbiA9IG5ldyBUcmFuc2Zvcm1hdGlvbigpOwotICAgICAgICAgICAgfQogICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBoYXNUcmFuc2Zvcm0gPSBnZXRDaGlsZFN0YXRpY1RyYW5zZm9ybWF0aW9uKGNoaWxkLCBtQ2hpbGRUcmFuc2Zvcm1hdGlvbik7CiAgICAgICAgICAgICBpZiAoaGFzVHJhbnNmb3JtKSB7CiAgICAgICAgICAgICAgICAgZmluYWwgaW50IHRyYW5zZm9ybVR5cGUgPSBtQ2hpbGRUcmFuc2Zvcm1hdGlvbi5nZXRUcmFuc2Zvcm1hdGlvblR5cGUoKTsKQEAgLTE1NTksMTIgKzE1OTAsOSBAQAogICAgICAgICBmaW5hbCBpbnQgc3ggPSBjaGlsZC5tU2Nyb2xsWDsKICAgICAgICAgZmluYWwgaW50IHN5ID0gY2hpbGQubVNjcm9sbFk7CiAKLSAgICAgICAgYm9vbGVhbiBzY2FsaW5nUmVxdWlyZWQgPSBmYWxzZTsKICAgICAgICAgQml0bWFwIGNhY2hlID0gbnVsbDsKLSAgICAgICAgaWYgKChmbGFncyAmIEZMQUdfQ0hJTERSRU5fRFJBV05fV0lUSF9DQUNIRSkgPT0gRkxBR19DSElMRFJFTl9EUkFXTl9XSVRIX0NBQ0hFIHx8Ci0gICAgICAgICAgICAgICAgKGZsYWdzICYgRkxBR19BTFdBWVNfRFJBV05fV0lUSF9DQUNIRSkgPT0gRkxBR19BTFdBWVNfRFJBV05fV0lUSF9DQUNIRSkgeworICAgICAgICBpZiAoY2FjaGluZykgewogICAgICAgICAgICAgY2FjaGUgPSBjaGlsZC5nZXREcmF3aW5nQ2FjaGUodHJ1ZSk7Ci0gICAgICAgICAgICBpZiAobUF0dGFjaEluZm8gIT0gbnVsbCkgc2NhbGluZ1JlcXVpcmVkID0gbUF0dGFjaEluZm8ubVNjYWxpbmdSZXF1aXJlZDsKICAgICAgICAgfQogCiAgICAgICAgIGZpbmFsIGJvb2xlYW4gaGFzTm9DYWNoZSA9IGNhY2hlID09IG51bGw7CkBAIC0yODcwLDcgKzI4OTgsNyBAQAogICAgICAqLwogICAgIEBWaWV3RGVidWcuRXhwb3J0ZWRQcm9wZXJ0eShtYXBwaW5nID0gewogICAgICAgICBAVmlld0RlYnVnLkludFRvU3RyaW5nKGZyb20gPSBQRVJTSVNURU5UX05PX0NBQ0hFLCAgICAgICAgdG8gPSAiTk9ORSIpLAotICAgICAgICBAVmlld0RlYnVnLkludFRvU3RyaW5nKGZyb20gPSBQRVJTSVNURU5UX0FMTF9DQUNIRVMsICAgICAgdG8gPSAiQU5JTUFUSU9OIiksCisgICAgICAgIEBWaWV3RGVidWcuSW50VG9TdHJpbmcoZnJvbSA9IFBFUlNJU1RFTlRfQU5JTUFUSU9OX0NBQ0hFLCB0byA9ICJBTklNQVRJT04iKSwKICAgICAgICAgQFZpZXdEZWJ1Zy5JbnRUb1N0cmluZyhmcm9tID0gUEVSU0lTVEVOVF9TQ1JPTExJTkdfQ0FDSEUsIHRvID0gIlNDUk9MTElORyIpLAogICAgICAgICBAVmlld0RlYnVnLkludFRvU3RyaW5nKGZyb20gPSBQRVJTSVNURU5UX0FMTF9DQUNIRVMsICAgICAgdG8gPSAiQUxMIikKICAgICB9KQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9WaWV3Um9vdC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9WaWV3Um9vdC5qYXZhCmluZGV4IDQ4NTQxOTAuLjcwMDQ5ZWQgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvVmlld1Jvb3QuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1ZpZXdSb290LmphdmEKQEAgLTE2LDYgKzE2LDcgQEAKIAogcGFja2FnZSBhbmRyb2lkLnZpZXc7CiAKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uQXBwbGljYXRpb25JbmZvOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcuQmFzZVN1cmZhY2VIb2xkZXI7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5JSW5wdXRNZXRob2RDYWxsYmFjazsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3LklJbnB1dE1ldGhvZFNlc3Npb247CkBAIC0zMyw3ICszNCw2IEBACiBpbXBvcnQgYW5kcm9pZC51dGlsLkRpc3BsYXlNZXRyaWNzOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkV2ZW50TG9nOwotaW1wb3J0IGFuZHJvaWQudXRpbC5TbG9nOwogaW1wb3J0IGFuZHJvaWQudXRpbC5TcGFyc2VBcnJheTsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlldy5NZWFzdXJlU3BlYzsKIGltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5RXZlbnQ7CkBAIC01MiwxNSArNTIsMTAgQEAKIGltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvTWFuYWdlcjsKIAogaW1wb3J0IGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVEZXNjcmlwdG9yOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIAotaW1wb3J0IGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC4qOwotaW1wb3J0IGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLm9wZW5nbGVzLio7Ci1pbXBvcnQgc3RhdGljIGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLm9wZW5nbGVzLkdMMTAuKjsKLQogLyoqCiAgKiBUaGUgdG9wIG9mIGEgdmlldyBoaWVyYXJjaHksIGltcGxlbWVudGluZyB0aGUgbmVlZGVkIHByb3RvY29sIGJldHdlZW4gVmlldwogICogYW5kIHRoZSBXaW5kb3dNYW5hZ2VyLiAgVGhpcyBpcyBmb3IgdGhlIG1vc3QgcGFydCBhbiBpbnRlcm5hbCBpbXBsZW1lbnRhdGlvbgpAQCAtNjgsMTQgKzYzLDEyIEBACiAgKgogICoge0BoaWRlfQogICovCi1AU3VwcHJlc3NXYXJuaW5ncyh7IkVtcHR5Q2F0Y2hCbG9jayJ9KQotcHVibGljIGZpbmFsIGNsYXNzIFZpZXdSb290IGV4dGVuZHMgSGFuZGxlciBpbXBsZW1lbnRzIFZpZXdQYXJlbnQsCi0gICAgICAgIFZpZXcuQXR0YWNoSW5mby5DYWxsYmFja3MgeworQFN1cHByZXNzV2FybmluZ3MoeyJFbXB0eUNhdGNoQmxvY2siLCAiUG9pbnRsZXNzQm9vbGVhbkV4cHJlc3Npb24ifSkKK3B1YmxpYyBmaW5hbCBjbGFzcyBWaWV3Um9vdCBleHRlbmRzIEhhbmRsZXIgaW1wbGVtZW50cyBWaWV3UGFyZW50LCBWaWV3LkF0dGFjaEluZm8uQ2FsbGJhY2tzIHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlZpZXdSb290IjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERCRyA9IGZhbHNlOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gU0hPV19GUFMgPSBmYWxzZTsKLSAgICBAU3VwcHJlc3NXYXJuaW5ncyh7IkNvbnN0YW50Q29uZGl0aW9uYWxFeHByZXNzaW9uIn0pCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBMT0NBTF9MT0dWID0gZmFsc2UgPyBDb25maWcuTE9HRCA6IENvbmZpZy5MT0dWOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gTE9DQUxfTE9HViA9IGZhbHNlOwogICAgIC8qKiBAbm9pbnNwZWN0aW9uIFBvaW50bGVzc0Jvb2xlYW5FeHByZXNzaW9uKi8KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHX0RSQVcgPSBmYWxzZSB8fCBMT0NBTF9MT0dWOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUdfTEFZT1VUID0gZmFsc2UgfHwgTE9DQUxfTE9HVjsKQEAgLTIwNSwxNCArMTk4LDcgQEAKICAgICBpbnQgbUN1clNjcm9sbFk7CiAgICAgU2Nyb2xsZXIgbVNjcm9sbGVyOwogCi0gICAgRUdMMTAgbUVnbDsKLSAgICBFR0xEaXNwbGF5IG1FZ2xEaXNwbGF5OwotICAgIEVHTENvbnRleHQgbUVnbENvbnRleHQ7Ci0gICAgRUdMU3VyZmFjZSBtRWdsU3VyZmFjZTsKLSAgICBHTDExIG1HTDsKLSAgICBDYW52YXMgbUdsQ2FudmFzOwotICAgIGJvb2xlYW4gbVVzZUdMOwotICAgIGJvb2xlYW4gbUdsV2FudGVkOworICAgIEhhcmR3YXJlUmVuZGVyZXIgbUh3UmVuZGVyZXI7CiAKICAgICBmaW5hbCBWaWV3Q29uZmlndXJhdGlvbiBtVmlld0NvbmZpZ3VyYXRpb247CiAKQEAgLTI0Miw4ICsyMjgsMTAgQEAKICAgICBwdWJsaWMgVmlld1Jvb3QoQ29udGV4dCBjb250ZXh0KSB7CiAgICAgICAgIHN1cGVyKCk7CiAKLSAgICAgICAgaWYgKE1FQVNVUkVfTEFURU5DWSAmJiBsdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBsdCA9IG5ldyBMYXRlbmN5VGltZXIoMTAwLCAxMDAwKTsKKyAgICAgICAgaWYgKE1FQVNVUkVfTEFURU5DWSkgeworICAgICAgICAgICAgaWYgKGx0ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBsdCA9IG5ldyBMYXRlbmN5VGltZXIoMTAwLCAxMDAwKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIC8vIEZvciBkZWJ1ZyBvbmx5CkBAIC0zMzEsMTIyICszMTksMTggQEAKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIHByaXZhdGUgdm9pZCBpbml0aWFsaXplR0woKSB7Ci0gICAgICAgIGluaXRpYWxpemVHTElubmVyKCk7Ci0gICAgICAgIGludCBlcnIgPSBtRWdsLmVnbEdldEVycm9yKCk7Ci0gICAgICAgIGlmIChlcnIgIT0gRUdMMTAuRUdMX1NVQ0NFU1MpIHsKLSAgICAgICAgICAgIC8vIGdpdmUtdXAgb24gdXNpbmcgR0wKLSAgICAgICAgICAgIGRlc3Ryb3lHTCgpOwotICAgICAgICAgICAgbUdsV2FudGVkID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZUdMSW5uZXIoKSB7Ci0gICAgICAgIGZpbmFsIEVHTDEwIGVnbCA9IChFR0wxMCkgRUdMQ29udGV4dC5nZXRFR0woKTsKLSAgICAgICAgbUVnbCA9IGVnbDsKLQotICAgICAgICAvKgotICAgICAgICAgKiBHZXQgdG8gdGhlIGRlZmF1bHQgZGlzcGxheS4KLSAgICAgICAgICovCi0gICAgICAgIGZpbmFsIEVHTERpc3BsYXkgZWdsRGlzcGxheSA9IGVnbC5lZ2xHZXREaXNwbGF5KEVHTDEwLkVHTF9ERUZBVUxUX0RJU1BMQVkpOwotICAgICAgICBtRWdsRGlzcGxheSA9IGVnbERpc3BsYXk7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogV2UgY2FuIG5vdyBpbml0aWFsaXplIEVHTCBmb3IgdGhhdCBkaXNwbGF5Ci0gICAgICAgICAqLwotICAgICAgICBpbnRbXSB2ZXJzaW9uID0gbmV3IGludFsyXTsKLSAgICAgICAgZWdsLmVnbEluaXRpYWxpemUoZWdsRGlzcGxheSwgdmVyc2lvbik7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogU3BlY2lmeSBhIGNvbmZpZ3VyYXRpb24gZm9yIG91ciBvcGVuZ2wgc2Vzc2lvbgotICAgICAgICAgKiBhbmQgZ3JhYiB0aGUgZmlyc3QgY29uZmlndXJhdGlvbiB0aGF0IG1hdGNoZXMgaXMKLSAgICAgICAgICovCi0gICAgICAgIGZpbmFsIGludFtdIGNvbmZpZ1NwZWMgPSB7Ci0gICAgICAgICAgICAgICAgRUdMMTAuRUdMX1JFRF9TSVpFLCAgICAgIDUsCi0gICAgICAgICAgICAgICAgRUdMMTAuRUdMX0dSRUVOX1NJWkUsICAgIDYsCi0gICAgICAgICAgICAgICAgRUdMMTAuRUdMX0JMVUVfU0laRSwgICAgIDUsCi0gICAgICAgICAgICAgICAgRUdMMTAuRUdMX0RFUFRIX1NJWkUsICAgIDAsCi0gICAgICAgICAgICAgICAgRUdMMTAuRUdMX05PTkUKLSAgICAgICAgfTsKLSAgICAgICAgZmluYWwgRUdMQ29uZmlnW10gY29uZmlncyA9IG5ldyBFR0xDb25maWdbMV07Ci0gICAgICAgIGZpbmFsIGludFtdIG51bV9jb25maWcgPSBuZXcgaW50WzFdOwotICAgICAgICBlZ2wuZWdsQ2hvb3NlQ29uZmlnKGVnbERpc3BsYXksIGNvbmZpZ1NwZWMsIGNvbmZpZ3MsIDEsIG51bV9jb25maWcpOwotICAgICAgICBmaW5hbCBFR0xDb25maWcgY29uZmlnID0gY29uZmlnc1swXTsKLQotICAgICAgICAvKgotICAgICAgICAgKiBDcmVhdGUgYW4gT3BlbkdMIEVTIGNvbnRleHQuIFRoaXMgbXVzdCBiZSBkb25lIG9ubHkgb25jZSwgYW4KLSAgICAgICAgICogT3BlbkdMIGNvbnRleHQgaXMgYSBzb21ld2hhdCBoZWF2eSBvYmplY3QuCi0gICAgICAgICAqLwotICAgICAgICBmaW5hbCBFR0xDb250ZXh0IGNvbnRleHQgPSBlZ2wuZWdsQ3JlYXRlQ29udGV4dChlZ2xEaXNwbGF5LCBjb25maWcsCi0gICAgICAgICAgICAgICAgRUdMMTAuRUdMX05PX0NPTlRFWFQsIG51bGwpOwotICAgICAgICBtRWdsQ29udGV4dCA9IGNvbnRleHQ7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogQ3JlYXRlIGFuIEVHTCBzdXJmYWNlIHdlIGNhbiByZW5kZXIgaW50by4KLSAgICAgICAgICovCi0gICAgICAgIGZpbmFsIEVHTFN1cmZhY2Ugc3VyZmFjZSA9IGVnbC5lZ2xDcmVhdGVXaW5kb3dTdXJmYWNlKGVnbERpc3BsYXksIGNvbmZpZywgbUhvbGRlciwgbnVsbCk7Ci0gICAgICAgIG1FZ2xTdXJmYWNlID0gc3VyZmFjZTsKLQotICAgICAgICAvKgotICAgICAgICAgKiBCZWZvcmUgd2UgY2FuIGlzc3VlIEdMIGNvbW1hbmRzLCB3ZSBuZWVkIHRvIG1ha2Ugc3VyZQotICAgICAgICAgKiB0aGUgY29udGV4dCBpcyBjdXJyZW50IGFuZCBib3VuZCB0byBhIHN1cmZhY2UuCi0gICAgICAgICAqLwotICAgICAgICBlZ2wuZWdsTWFrZUN1cnJlbnQoZWdsRGlzcGxheSwgc3VyZmFjZSwgc3VyZmFjZSwgY29udGV4dCk7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogR2V0IHRvIHRoZSBhcHByb3ByaWF0ZSBHTCBpbnRlcmZhY2UuCi0gICAgICAgICAqIFRoaXMgaXMgc2ltcGx5IGRvbmUgYnkgY2FzdGluZyB0aGUgR0wgY29udGV4dCB0byBlaXRoZXIKLSAgICAgICAgICogR0wxMCBvciBHTDExLgotICAgICAgICAgKi8KLSAgICAgICAgZmluYWwgR0wxMSBnbCA9IChHTDExKSBjb250ZXh0LmdldEdMKCk7Ci0gICAgICAgIG1HTCA9IGdsOwotICAgICAgICBtR2xDYW52YXMgPSBuZXcgQ2FudmFzKGdsKTsKLSAgICAgICAgbVVzZUdMID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZGVzdHJveUdMKCkgewotICAgICAgICAvLyBpbmZvcm0gc2tpYSB0aGF0IHRoZSBjb250ZXh0IGlzIGdvbmUKLSAgICAgICAgbmF0aXZlQWJhbmRvbkdsQ2FjaGVzKCk7Ci0KLSAgICAgICAgbUVnbC5lZ2xNYWtlQ3VycmVudChtRWdsRGlzcGxheSwgRUdMMTAuRUdMX05PX1NVUkZBQ0UsCi0gICAgICAgICAgICAgICAgRUdMMTAuRUdMX05PX1NVUkZBQ0UsIEVHTDEwLkVHTF9OT19DT05URVhUKTsKLSAgICAgICAgbUVnbC5lZ2xEZXN0cm95Q29udGV4dChtRWdsRGlzcGxheSwgbUVnbENvbnRleHQpOwotICAgICAgICBtRWdsLmVnbERlc3Ryb3lTdXJmYWNlKG1FZ2xEaXNwbGF5LCBtRWdsU3VyZmFjZSk7Ci0gICAgICAgIG1FZ2wuZWdsVGVybWluYXRlKG1FZ2xEaXNwbGF5KTsKLSAgICAgICAgbUVnbENvbnRleHQgPSBudWxsOwotICAgICAgICBtRWdsU3VyZmFjZSA9IG51bGw7Ci0gICAgICAgIG1FZ2xEaXNwbGF5ID0gbnVsbDsKLSAgICAgICAgbUVnbCA9IG51bGw7Ci0gICAgICAgIG1HbENhbnZhcyA9IG51bGw7Ci0gICAgICAgIG1HTCA9IG51bGw7Ci0gICAgICAgIG1Vc2VHTCA9IGZhbHNlOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjaGVja0VnbEVycm9ycygpIHsKLSAgICAgICAgaWYgKG1Vc2VHTCkgewotICAgICAgICAgICAgaW50IGVyciA9IG1FZ2wuZWdsR2V0RXJyb3IoKTsKLSAgICAgICAgICAgIGlmIChlcnIgIT0gRUdMMTAuRUdMX1NVQ0NFU1MpIHsKLSAgICAgICAgICAgICAgICAvLyBzb21ldGhpbmcgYmFkIGhhcyBoYXBwZW5lZCByZXZlcnQgdG8KLSAgICAgICAgICAgICAgICAvLyBub3JtYWwgcmVuZGVyaW5nLgotICAgICAgICAgICAgICAgIGRlc3Ryb3lHTCgpOwotICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gRUdMMTEuRUdMX0NPTlRFWFRfTE9TVCkgewotICAgICAgICAgICAgICAgICAgICAvLyB3ZSdsbCB0cnkgYWdhaW4gaWYgaXQgd2FzIGNvbnRleHQgbG9zdAotICAgICAgICAgICAgICAgICAgICBtR2xXYW50ZWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KICAgICAvKioKICAgICAgKiBXZSBoYXZlIG9uZSBjaGlsZAogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFZpZXcoVmlldyB2aWV3LCBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcyBhdHRycywKLSAgICAgICAgICAgIFZpZXcgcGFuZWxQYXJlbnRWaWV3KSB7CisgICAgcHVibGljIHZvaWQgc2V0VmlldyhWaWV3IHZpZXcsIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zIGF0dHJzLCBWaWV3IHBhbmVsUGFyZW50VmlldykgewogICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKICAgICAgICAgICAgIGlmIChtVmlldyA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgbVZpZXcgPSB2aWV3OwogICAgICAgICAgICAgICAgIG1XaW5kb3dBdHRyaWJ1dGVzLmNvcHlGcm9tKGF0dHJzKTsKICAgICAgICAgICAgICAgICBhdHRycyA9IG1XaW5kb3dBdHRyaWJ1dGVzOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGVuYWJsZUhhcmR3YXJlQWNjZWxlcmF0aW9uKHZpZXcsIGF0dHJzKTsKKwogICAgICAgICAgICAgICAgIGlmICh2aWV3IGluc3RhbmNlb2YgUm9vdFZpZXdTdXJmYWNlVGFrZXIpIHsKICAgICAgICAgICAgICAgICAgICAgbVN1cmZhY2VIb2xkZXJDYWxsYmFjayA9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSb290Vmlld1N1cmZhY2VUYWtlcil2aWV3KS53aWxsWW91VGFrZVRoZVN1cmZhY2UoKTsKQEAgLTU3Nyw2ICs0NjEsMjAgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIHByaXZhdGUgdm9pZCBlbmFibGVIYXJkd2FyZUFjY2VsZXJhdGlvbihWaWV3IHZpZXcsIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zIGF0dHJzKSB7CisgICAgICAgIC8vIE9ubHkgZW5hYmxlIGhhcmR3YXJlIGFjY2VsZXJhdGlvbiBpZiB3ZSBhcmUgbm90IGluIHRoZSBzeXN0ZW0gcHJvY2VzcworICAgICAgICAvLyBUaGUgd2luZG93IG1hbmFnZXIgY3JlYXRlcyBWaWV3Um9vdHMgdG8gZGlzcGxheSBhbmltYXRlZCBwcmV2aWV3IHdpbmRvd3MKKyAgICAgICAgLy8gb2YgbGF1bmNoaW5nIGFwcHMgYW5kIHdlIGRvbid0IHdhbnQgdGhvc2UgdG8gYmUgaGFyZHdhcmUgYWNjZWxlcmF0ZWQKKyAgICAgICAgaWYgKFByb2Nlc3MubXlVaWQoKSAhPSBQcm9jZXNzLlNZU1RFTV9VSUQpIHsKKyAgICAgICAgICAgIC8vIFRyeSB0byBlbmFibGUgaGFyZHdhcmUgYWNjZWxlcmF0aW9uIGlmIHJlcXVlc3RlZAorICAgICAgICAgICAgaWYgKCh2aWV3LmdldENvbnRleHQoKS5nZXRBcHBsaWNhdGlvbkluZm8oKS5mbGFncyAmCisgICAgICAgICAgICAgICAgICAgIEFwcGxpY2F0aW9uSW5mby5GTEFHX0hBUkRXQVJFX0FDQ0VMRVJBVEVEKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiB0cmFuc2x1Y2VudCA9IGF0dHJzLmZvcm1hdCAhPSBQaXhlbEZvcm1hdC5PUEFRVUU7CisgICAgICAgICAgICAgICAgbUh3UmVuZGVyZXIgPSBIYXJkd2FyZVJlbmRlcmVyLmNyZWF0ZUdsUmVuZGVyZXIoMiwgdHJhbnNsdWNlbnQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCiAgICAgcHVibGljIFZpZXcgZ2V0VmlldygpIHsKICAgICAgICAgcmV0dXJuIG1WaWV3OwogICAgIH0KQEAgLTczMyw4ICs2MzEsNiBAQAogICAgICAgICBib29sZWFuIHZpZXdWaXNpYmlsaXR5Q2hhbmdlZCA9IG1WaWV3VmlzaWJpbGl0eSAhPSB2aWV3VmlzaWJpbGl0eQogICAgICAgICAgICAgICAgIHx8IG1OZXdTdXJmYWNlTmVlZGVkOwogCi0gICAgICAgIGZsb2F0IGFwcFNjYWxlID0gbUF0dGFjaEluZm8ubUFwcGxpY2F0aW9uU2NhbGU7Ci0KICAgICAgICAgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMgcGFyYW1zID0gbnVsbDsKICAgICAgICAgaWYgKG1XaW5kb3dBdHRyaWJ1dGVzQ2hhbmdlZCkgewogICAgICAgICAgICAgbVdpbmRvd0F0dHJpYnV0ZXNDaGFuZ2VkID0gZmFsc2U7CkBAIC03ODIsOCArNjc4LDggQEAKICAgICAgICAgICAgIGF0dGFjaEluZm8ubVdpbmRvd1Zpc2liaWxpdHkgPSB2aWV3VmlzaWJpbGl0eTsKICAgICAgICAgICAgIGhvc3QuZGlzcGF0Y2hXaW5kb3dWaXNpYmlsaXR5Q2hhbmdlZCh2aWV3VmlzaWJpbGl0eSk7CiAgICAgICAgICAgICBpZiAodmlld1Zpc2liaWxpdHkgIT0gVmlldy5WSVNJQkxFIHx8IG1OZXdTdXJmYWNlTmVlZGVkKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1Vc2VHTCkgewotICAgICAgICAgICAgICAgICAgICBkZXN0cm95R0woKTsKKyAgICAgICAgICAgICAgICBpZiAobUh3UmVuZGVyZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBtSHdSZW5kZXJlci5kZXN0cm95KCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKHZpZXdWaXNpYmlsaXR5ID09IFZpZXcuR09ORSkgewpAQCAtODk5LDEwICs3OTUsMTIgQEAKIAogICAgICAgICBmaW5hbCBib29sZWFuIGNvbXB1dGVzSW50ZXJuYWxJbnNldHMgPQogICAgICAgICAgICAgICAgIGF0dGFjaEluZm8ubVRyZWVPYnNlcnZlci5oYXNDb21wdXRlSW50ZXJuYWxJbnNldHNMaXN0ZW5lcnMoKTsKKwogICAgICAgICBib29sZWFuIGluc2V0c1BlbmRpbmcgPSBmYWxzZTsKICAgICAgICAgaW50IHJlbGF5b3V0UmVzdWx0ID0gMDsKLSAgICAgICAgaWYgKG1GaXJzdCB8fCB3aW5kb3dTaG91bGRSZXNpemUgfHwgaW5zZXRzQ2hhbmdlZAotICAgICAgICAgICAgICAgIHx8IHZpZXdWaXNpYmlsaXR5Q2hhbmdlZCB8fCBwYXJhbXMgIT0gbnVsbCkgeworCisgICAgICAgIGlmIChtRmlyc3QgfHwgd2luZG93U2hvdWxkUmVzaXplIHx8IGluc2V0c0NoYW5nZWQgfHwKKyAgICAgICAgICAgICAgICB2aWV3VmlzaWJpbGl0eUNoYW5nZWQgfHwgcGFyYW1zICE9IG51bGwpIHsKIAogICAgICAgICAgICAgaWYgKHZpZXdWaXNpYmlsaXR5ID09IFZpZXcuVklTSUJMRSkgewogICAgICAgICAgICAgICAgIC8vIElmIHRoaXMgd2luZG93IGlzIGdpdmluZyBpbnRlcm5hbCBpbnNldHMgdG8gdGhlIHdpbmRvdwpAQCAtOTE0LDE1ICs4MTIsNyBAQAogICAgICAgICAgICAgICAgIC8vIHdpbmRvdywgd2FpdGluZyB1bnRpbCB3ZSBjYW4gZmluaXNoIGxheWluZyBvdXQgdGhpcyB3aW5kb3cKICAgICAgICAgICAgICAgICAvLyBhbmQgZ2V0IGJhY2sgdG8gdGhlIHdpbmRvdyBtYW5hZ2VyIHdpdGggdGhlIHVsdGltYXRlbHkKICAgICAgICAgICAgICAgICAvLyBjb21wdXRlZCBpbnNldHMuCi0gICAgICAgICAgICAgICAgaW5zZXRzUGVuZGluZyA9IGNvbXB1dGVzSW50ZXJuYWxJbnNldHMKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIChtRmlyc3QgfHwgdmlld1Zpc2liaWxpdHlDaGFuZ2VkKTsKLQotICAgICAgICAgICAgICAgIGlmIChtV2luZG93QXR0cmlidXRlcy5tZW1vcnlUeXBlID09IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLk1FTU9SWV9UWVBFX0dQVSkgewotICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW1zID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcyA9IG1XaW5kb3dBdHRyaWJ1dGVzOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1HbFdhbnRlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGluc2V0c1BlbmRpbmcgPSBjb21wdXRlc0ludGVybmFsSW5zZXRzICYmIChtRmlyc3QgfHwgdmlld1Zpc2liaWxpdHlDaGFuZ2VkKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaWYgKG1TdXJmYWNlSG9sZGVyICE9IG51bGwpIHsKQEAgLTkzMSwxMSArODIxLDEyIEBACiAgICAgICAgICAgICAgICAgbHAuZm9ybWF0ID0gbVN1cmZhY2VIb2xkZXIuZ2V0UmVxdWVzdGVkRm9ybWF0KCk7CiAgICAgICAgICAgICAgICAgbHAudHlwZSA9IG1TdXJmYWNlSG9sZGVyLmdldFJlcXVlc3RlZFR5cGUoKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgYm9vbGVhbiBpbml0aWFsaXplZCA9IGZhbHNlOworCisgICAgICAgICAgICBib29sZWFuIGh3SW50aWFsaXplZCA9IGZhbHNlOwogICAgICAgICAgICAgYm9vbGVhbiBjb250ZW50SW5zZXRzQ2hhbmdlZCA9IGZhbHNlOwogICAgICAgICAgICAgYm9vbGVhbiB2aXNpYmxlSW5zZXRzQ2hhbmdlZDsKICAgICAgICAgICAgIGJvb2xlYW4gaGFkU3VyZmFjZSA9IG1TdXJmYWNlLmlzVmFsaWQoKTsKKwogICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICBpbnQgZmwgPSAwOwogICAgICAgICAgICAgICAgIGlmIChwYXJhbXMgIT0gbnVsbCkgewpAQCAtOTk1LDkgKzg4Niw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBmdWxsUmVkcmF3TmVlZGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgIG1QcmV2aW91c1RyYW5zcGFyZW50UmVnaW9uLnNldEVtcHR5KCk7CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtR2xXYW50ZWQgJiYgIW1Vc2VHTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxpemVHTCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxpemVkID0gbUdsQ2FudmFzICE9IG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUh3UmVuZGVyZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh3SW50aWFsaXplZCA9IG1Id1JlbmRlcmVyLmluaXRpYWxpemUobUhvbGRlcik7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFtU3VyZmFjZS5pc1ZhbGlkKCkpIHsKQEAgLTEwNzUsOSArOTY1LDggQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChpbml0aWFsaXplZCkgewotICAgICAgICAgICAgICAgIG1HbENhbnZhcy5zZXRWaWV3cG9ydCgoaW50KSAobVdpZHRoICogYXBwU2NhbGUgKyAwLjVmKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpIChtSGVpZ2h0ICogYXBwU2NhbGUgKyAwLjVmKSk7CisgICAgICAgICAgICBpZiAoaHdJbnRpYWxpemVkKSB7CisgICAgICAgICAgICAgICAgbUh3UmVuZGVyZXIuc2V0dXAobVdpZHRoLCBtSGVpZ2h0LCBtQXR0YWNoSW5mbyk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGJvb2xlYW4gZm9jdXNDaGFuZ2VkRHVlVG9Ub3VjaE1vZGUgPSBlbnN1cmVUb3VjaE1vZGVMb2NhbGx5KApAQCAtMTMzOCw3ICsxMjI3LDggQEAKICAgICAgICAgaWYgKCFzRmlyc3REcmF3Q29tcGxldGUpIHsKICAgICAgICAgICAgIHN5bmNocm9uaXplZCAoc0ZpcnN0RHJhd0hhbmRsZXJzKSB7CiAgICAgICAgICAgICAgICAgc0ZpcnN0RHJhd0NvbXBsZXRlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8c0ZpcnN0RHJhd0hhbmRsZXJzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgZmluYWwgaW50IGNvdW50ID0gc0ZpcnN0RHJhd0hhbmRsZXJzLnNpemUoKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaTwgY291bnQ7IGkrKykgewogICAgICAgICAgICAgICAgICAgICBwb3N0KHNGaXJzdERyYXdIYW5kbGVycy5nZXQoaSkpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KQEAgLTEzNzIsNTMgKzEyNjIsMTYgQEAKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogICAgICAgICAKLSAgICAgICAgaWYgKG1Vc2VHTCkgeworICAgICAgICBpZiAobUh3UmVuZGVyZXIgIT0gbnVsbCAmJiBtSHdSZW5kZXJlci5pc0VuYWJsZWQoKSkgewogICAgICAgICAgICAgaWYgKCFkaXJ0eS5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBDYW52YXMgY2FudmFzID0gbUdsQ2FudmFzOwotICAgICAgICAgICAgICAgIGlmIChtR0wgIT0gbnVsbCAmJiBjYW52YXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtR0wuZ2xEaXNhYmxlKEdMX1NDSVNTT1JfVEVTVCk7Ci0gICAgICAgICAgICAgICAgICAgIG1HTC5nbENsZWFyQ29sb3IoMCwgMCwgMCwgMCk7Ci0gICAgICAgICAgICAgICAgICAgIG1HTC5nbENsZWFyKEdMX0NPTE9SX0JVRkZFUl9CSVQpOwotICAgICAgICAgICAgICAgICAgICBtR0wuZ2xFbmFibGUoR0xfU0NJU1NPUl9URVNUKTsKLQotICAgICAgICAgICAgICAgICAgICBtQXR0YWNoSW5mby5tRHJhd2luZ1RpbWUgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgICAgICAgICAgbUF0dGFjaEluZm8ubUlnbm9yZURpcnR5U3RhdGUgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBtVmlldy5tUHJpdmF0ZUZsYWdzIHw9IFZpZXcuRFJBV047Ci0KLSAgICAgICAgICAgICAgICAgICAgaW50IHNhdmVDb3VudCA9IGNhbnZhcy5zYXZlKENhbnZhcy5NQVRSSVhfU0FWRV9GTEFHKTsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMCwgLXlvZmYpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1UcmFuc2xhdG9yICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVHJhbnNsYXRvci50cmFuc2xhdGVDYW52YXMoY2FudmFzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhbnZhcy5zZXRTY3JlZW5EZW5zaXR5KHNjYWxpbmdSZXF1aXJlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IERpc3BsYXlNZXRyaWNzLkRFTlNJVFlfREVWSUNFIDogMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtVmlldy5kcmF3KGNhbnZhcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoQ29uZmlnLkRFQlVHICYmIFZpZXdEZWJ1Zy5jb25zaXN0ZW5jeUNoZWNrRW5hYmxlZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1WaWV3LmRpc3BhdGNoQ29uc2lzdGVuY3lDaGVjayhWaWV3RGVidWcuQ09OU0lTVEVOQ1lfRFJBV0lORyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYW52YXMucmVzdG9yZVRvQ291bnQoc2F2ZUNvdW50KTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIG1BdHRhY2hJbmZvLm1JZ25vcmVEaXJ0eVN0YXRlID0gZmFsc2U7Ci0KLSAgICAgICAgICAgICAgICAgICAgbUVnbC5lZ2xTd2FwQnVmZmVycyhtRWdsRGlzcGxheSwgbUVnbFN1cmZhY2UpOwotICAgICAgICAgICAgICAgICAgICBjaGVja0VnbEVycm9ycygpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChTSE9XX0ZQUyB8fCBDb25maWcuREVCVUcgJiYgVmlld0RlYnVnLnNob3dGcHMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBub3cgPSAoaW50KVN5c3RlbUNsb2NrLmVsYXBzZWRSZWFsdGltZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNEcmF3VGltZSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlU2hvd0ZQUyhjYW52YXMsIG5vdyAtIHNEcmF3VGltZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBzRHJhd1RpbWUgPSBub3c7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbUh3UmVuZGVyZXIuZHJhdyhtVmlldywgbUF0dGFjaEluZm8sIG1UcmFuc2xhdG9yLCB5b2ZmLCBzY2FsaW5nUmVxdWlyZWQpOwogICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBpZiAoc2Nyb2xsaW5nKSB7CiAgICAgICAgICAgICAgICAgbUZ1bGxSZWRyYXdOZWVkZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgIHNjaGVkdWxlVHJhdmVyc2FscygpOwogICAgICAgICAgICAgfQorCiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIApAQCAtMTczMCw4ICsxNTgzLDYgQEAKICAgICB9CiAKICAgICB2b2lkIGRpc3BhdGNoRGV0YWNoZWRGcm9tV2luZG93KCkgewotICAgICAgICBpZiAoQ29uZmlnLkxPR1YpIExvZy52KCJWaWV3Um9vdCIsICJEZXRhY2hpbmcgaW4gIiArIHRoaXMgKyAiIG9mICIgKyBtU3VyZmFjZSk7Ci0KICAgICAgICAgaWYgKG1WaWV3ICE9IG51bGwpIHsKICAgICAgICAgICAgIG1WaWV3LmRpc3BhdGNoRGV0YWNoZWRGcm9tV2luZG93KCk7CiAgICAgICAgIH0KQEAgLTE3NDAsOCArMTU5MSw4IEBACiAgICAgICAgIG1BdHRhY2hJbmZvLm1Sb290VmlldyA9IG51bGw7CiAgICAgICAgIG1BdHRhY2hJbmZvLm1TdXJmYWNlID0gbnVsbDsKIAotICAgICAgICBpZiAobVVzZUdMKSB7Ci0gICAgICAgICAgICBkZXN0cm95R0woKTsKKyAgICAgICAgaWYgKG1Id1JlbmRlcmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1Id1JlbmRlcmVyLmRlc3Ryb3koKTsKICAgICAgICAgfQogICAgICAgICBtU3VyZmFjZS5yZWxlYXNlKCk7CiAKQEAgLTE4NzIsOCArMTcyMywxMCBAQAogICAgICAgICAgICAgICAgIGV2ZW50ID0gZ2V0UGVuZGluZ1BvaW50ZXJNb3Rpb25FdmVudCgpOwogCiAgICAgICAgICAgICAgICAgaWYgKE1FQVNVUkVfTEFURU5DWSAmJiBldmVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGx0LnNhbXBsZSgiOSBDbGllbnQgZ290IGV2ZW50cyAgICAgICIsIFN5c3RlbS5uYW5vVGltZSgpIC0gZXZlbnQuZ2V0RXZlbnRUaW1lTmFubygpKTsKLSAgICAgICAgICAgICAgICAgICAgbHQuc2FtcGxlKCI4IENsaWVudCBnZXR0aW5nIGV2ZW50cyAgIiwgdGltZUJlZm9yZUdldHRpbmdFdmVudHMgLSBldmVudC5nZXRFdmVudFRpbWVOYW5vKCkpOworICAgICAgICAgICAgICAgICAgICBsdC5zYW1wbGUoIjkgQ2xpZW50IGdvdCBldmVudHMgICAgICAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5uYW5vVGltZSgpIC0gZXZlbnQuZ2V0RXZlbnRUaW1lTmFubygpKTsKKyAgICAgICAgICAgICAgICAgICAgbHQuc2FtcGxlKCI4IENsaWVudCBnZXR0aW5nIGV2ZW50cyAgIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lQmVmb3JlR2V0dGluZ0V2ZW50cyAtIGV2ZW50LmdldEV2ZW50VGltZU5hbm8oKSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGNhbGxXaGVuRG9uZSA9IGZhbHNlOwogICAgICAgICAgICAgfQpAQCAtMTg5NiwxMSArMTc0OSwxMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQub2Zmc2V0TG9jYXRpb24oMCwgbUN1clNjcm9sbFkpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGlmIChNRUFTVVJFX0xBVEVOQ1kpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGx0LnNhbXBsZSgiQSBEaXNwYXRjaGluZyBUb3VjaEV2ZW50cyIsIFN5c3RlbS5uYW5vVGltZSgpIC0gZXZlbnQuZ2V0RXZlbnRUaW1lTmFubygpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGx0LnNhbXBsZSgiQSBEaXNwYXRjaGluZyBUb3VjaEV2ZW50cyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5uYW5vVGltZSgpIC0gZXZlbnQuZ2V0RXZlbnRUaW1lTmFubygpKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBoYW5kbGVkID0gbVZpZXcuZGlzcGF0Y2hUb3VjaEV2ZW50KGV2ZW50KTsKICAgICAgICAgICAgICAgICAgICAgaWYgKE1FQVNVUkVfTEFURU5DWSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbHQuc2FtcGxlKCJCIERpc3BhdGNoZWQgVG91Y2hFdmVudHMgIiwgU3lzdGVtLm5hbm9UaW1lKCkgLSBldmVudC5nZXRFdmVudFRpbWVOYW5vKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgbHQuc2FtcGxlKCJCIERpc3BhdGNoZWQgVG91Y2hFdmVudHMgIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm5hbm9UaW1lKCkgLSBldmVudC5nZXRFdmVudFRpbWVOYW5vKCkpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGlmICghaGFuZGxlZCAmJiBpc0Rvd24pIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlZGdlU2xvcCA9IG1WaWV3Q29uZmlndXJhdGlvbi5nZXRTY2FsZWRFZGdlU2xvcCgpOwpAQCAtMjAwNSwxOCArMTg2MCw4IEBACiAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaW5Ub3VjaE1vZGUgPSBtc2cuYXJnMiAhPSAwOwogICAgICAgICAgICAgICAgICAgICBlbnN1cmVUb3VjaE1vZGVMb2NhbGx5KGluVG91Y2hNb2RlKTsKIAotICAgICAgICAgICAgICAgICAgICBpZiAobUdsV2FudGVkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjaGVja0VnbEVycm9ycygpOwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgbG9zdCB0aGUgZ2wgY29udGV4dCwgc28gcmVjcmVhdGUgaXQuCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobUdsV2FudGVkICYmICFtVXNlR0wpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsaXplR0woKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUdsQ2FudmFzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYXBwU2NhbGUgPSBtQXR0YWNoSW5mby5tQXBwbGljYXRpb25TY2FsZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUdsQ2FudmFzLnNldFZpZXdwb3J0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpIChtV2lkdGggKiBhcHBTY2FsZSArIDAuNWYpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpIChtSGVpZ2h0ICogYXBwU2NhbGUgKyAwLjVmKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAobUh3UmVuZGVyZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbUh3UmVuZGVyZXIuaW5pdGlhbGl6ZUlmTmVlZGVkKG1XaWR0aCwgbUhlaWdodCwgbUF0dGFjaEluZm8sIG1Ib2xkZXIpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogCkBAIC0yMDY2LDggKzE5MTEsNyBAQAogICAgICAgICAgICAgaWYgKChldmVudC5nZXRGbGFncygpJktleUV2ZW50LkZMQUdfRlJPTV9TWVNURU0pICE9IDApIHsKICAgICAgICAgICAgICAgICAvLyBUaGUgSU1FIGlzIHRyeWluZyB0byBzYXkgdGhpcyBldmVudCBpcyBmcm9tIHRoZQogICAgICAgICAgICAgICAgIC8vIHN5c3RlbSEgIEJhZCBiYWQgYmFkIQotICAgICAgICAgICAgICAgIGV2ZW50ID0gS2V5RXZlbnQuY2hhbmdlRmxhZ3MoZXZlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICBldmVudC5nZXRGbGFncygpJn5LZXlFdmVudC5GTEFHX0ZST01fU1lTVEVNKTsKKyAgICAgICAgICAgICAgICBldmVudCA9IEtleUV2ZW50LmNoYW5nZUZsYWdzKGV2ZW50LCBldmVudC5nZXRGbGFncygpICYgfktleUV2ZW50LkZMQUdfRlJPTV9TWVNURU0pOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgZGVsaXZlcktleUV2ZW50VG9WaWV3SGllcmFyY2h5KChLZXlFdmVudCltc2cub2JqLCBmYWxzZSk7CiAgICAgICAgIH0gYnJlYWs7CkBAIC0yNTU1LDggKzIzOTksNyBAQAogICAgIHByaXZhdGUgdm9pZCBkZWxpdmVyS2V5RXZlbnQoS2V5RXZlbnQgZXZlbnQsIGJvb2xlYW4gc2VuZERvbmUpIHsKICAgICAgICAgLy8gSWYgbVZpZXcgaXMgbnVsbCwgd2UganVzdCBjb25zdW1lIHRoZSBrZXkgZXZlbnQgYmVjYXVzZSBpdCBkb2Vzbid0CiAgICAgICAgIC8vIG1ha2Ugc2Vuc2UgdG8gZG8gYW55dGhpbmcgZWxzZSB3aXRoIGl0LgotICAgICAgICBib29sZWFuIGhhbmRsZWQgPSBtVmlldyAhPSBudWxsCi0gICAgICAgICAgICAgICAgPyBtVmlldy5kaXNwYXRjaEtleUV2ZW50UHJlSW1lKGV2ZW50KSA6IHRydWU7CisgICAgICAgIGJvb2xlYW4gaGFuZGxlZCA9IG1WaWV3ID09IG51bGwgfHwgbVZpZXcuZGlzcGF0Y2hLZXlFdmVudFByZUltZShldmVudCk7CiAgICAgICAgIGlmIChoYW5kbGVkKSB7CiAgICAgICAgICAgICBpZiAoc2VuZERvbmUpIHsKICAgICAgICAgICAgICAgICBpZiAoTE9DQUxfTE9HVikgTG9nLnYoCkBAIC0yNTkwLDcgKzI0MzMsNiBAQAogICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBzZW5kRG9uZSA9IHNlcSA+PSAwOwogICAgICAgICAgICAgaWYgKCFoYW5kbGVkKSB7CiAgICAgICAgICAgICAgICAgZGVsaXZlcktleUV2ZW50VG9WaWV3SGllcmFyY2h5KGV2ZW50LCBzZW5kRG9uZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfSBlbHNlIGlmIChzZW5kRG9uZSkgewogICAgICAgICAgICAgICAgIGlmIChMT0NBTF9MT0dWKSBMb2cudigKICAgICAgICAgICAgICAgICAgICAgICAgICJWaWV3Um9vdCIsICJUZWxsaW5nIHdpbmRvdyBtYW5hZ2VyIGtleSBpcyBmaW5pc2hlZCIpOwpAQCAtMjc5MSw3ICsyNjMzLDcgQEAKIAogICAgIHZvaWQgZG9EaWUoKSB7CiAgICAgICAgIGNoZWNrVGhyZWFkKCk7Ci0gICAgICAgIGlmIChDb25maWcuTE9HVikgTG9nLnYoIlZpZXdSb290IiwgIkRJRSBpbiAiICsgdGhpcyArICIgb2YgIiArIG1TdXJmYWNlKTsKKyAgICAgICAgaWYgKExPQ0FMX0xPR1YpIExvZy52KCJWaWV3Um9vdCIsICJESUUgaW4gIiArIHRoaXMgKyAiIG9mICIgKyBtU3VyZmFjZSk7CiAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewogICAgICAgICAgICAgaWYgKG1BZGRlZCAmJiAhbUZpcnN0KSB7CiAgICAgICAgICAgICAgICAgaW50IHZpZXdWaXNpYmlsaXR5ID0gbVZpZXcuZ2V0VmlzaWJpbGl0eSgpOwpAQCAtMjg5OSwxMyArMjc0MSwxMiBAQAogICAgICAgICBpZiAoZXZlbnQuZ2V0QWN0aW9uKCkgPT0gS2V5RXZlbnQuQUNUSU9OX0RPV04pIHsKICAgICAgICAgICAgIC8vbm9pbnNwZWN0aW9uIENvbnN0YW50Q29uZGl0aW9ucwogICAgICAgICAgICAgaWYgKGZhbHNlICYmIGV2ZW50LmdldEtleUNvZGUoKSA9PSBLZXlFdmVudC5LRVlDT0RFX0NBTUVSQSkgewotICAgICAgICAgICAgICAgIGlmIChDb25maWcuTE9HRCkgTG9nLmQoImtleWRpc3AiLAotICAgICAgICAgICAgICAgICAgICAgICAgIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIpOwotICAgICAgICAgICAgICAgIGlmIChDb25maWcuTE9HRCkgTG9nLmQoImtleWRpc3AiLCAiRm9jdXNlZCB2aWV3IEhpZXJhcmNoeSBpczoiKTsKKyAgICAgICAgICAgICAgICBpZiAoREJHKSBMb2cuZCgia2V5ZGlzcCIsICI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iKTsKKyAgICAgICAgICAgICAgICBpZiAoREJHKSBMb2cuZCgia2V5ZGlzcCIsICJGb2N1c2VkIHZpZXcgSGllcmFyY2h5IGlzOiIpOworCiAgICAgICAgICAgICAgICAgZGVidWcoKTsKIAotICAgICAgICAgICAgICAgIGlmIChDb25maWcuTE9HRCkgTG9nLmQoImtleWRpc3AiLAotICAgICAgICAgICAgICAgICAgICAgICAgIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIpOworICAgICAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKCJrZXlkaXNwIiwgIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTM1NTgsOCArMzM5OSw0IEBACiAgICAgfQogCiAgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgbmF0aXZlU2hvd0ZQUyhDYW52YXMgY2FudmFzLCBpbnQgZHVyYXRpb25NaWxsaXMpOwotCi0gICAgLy8gaW5mb3JtIHNraWEgdG8ganVzdCBhYmFuZG9uIGl0cyB0ZXh0dXJlIGNhY2hlIElEcwotICAgIC8vIGRvZXNuJ3QgY2FsbCBnbERlbGV0ZVRleHR1cmVzCi0gICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgbmF0aXZlQWJhbmRvbkdsQ2FjaGVzKCk7CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1dpbmRvdy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9XaW5kb3cuamF2YQppbmRleCBmNDA3MzRiLi45YjMxYjljIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1dpbmRvdy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvV2luZG93LmphdmEKQEAgLTYxLDYgKzYxLDEzIEBACiAgICAgICAgIEBoaWRlCiAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGRUFUVVJFX09QRU5HTCA9IDg7CisgICAgLyoqCisgICAgICogRmxhZyBmb3IgZW5hYmxpbmcgdGhlIEFjdGlvbiBCYXIuCisgICAgICogVGhpcyBpcyBlbmFibGVkIGJ5IGRlZmF1bHQgZm9yIHNvbWUgZGV2aWNlcy4gVGhlIEFjdGlvbiBCYXIKKyAgICAgKiByZXBsYWNlcyB0aGUgdGl0bGUgYmFyIGFuZCBwcm92aWRlcyBhbiBhbHRlcm5hdGUgbG9jYXRpb24KKyAgICAgKiBmb3IgYW4gb24tc2NyZWVuIG1lbnUgYnV0dG9uIG9uIHNvbWUgZGV2aWNlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGRUFUVVJFX0FDVElPTl9CQVIgPSA5OwogICAgIC8qKiBGbGFnIGZvciBzZXR0aW5nIHRoZSBwcm9ncmVzcyBiYXIncyB2aXNpYmlsaXR5IHRvIFZJU0lCTEUgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9HUkVTU19WSVNJQklMSVRZX09OID0gLTE7CiAgICAgLyoqIEZsYWcgZm9yIHNldHRpbmcgdGhlIHByb2dyZXNzIGJhcidzIHZpc2liaWxpdHkgdG8gR09ORSAqLwpAQCAtODE3LDYgKzgyNCw4IEBACiAKICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCB0b2dnbGVQYW5lbChpbnQgZmVhdHVyZUlkLCBLZXlFdmVudCBldmVudCk7CiAKKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBpbnZhbGlkYXRlUGFuZWxNZW51KGludCBmZWF0dXJlSWQpOworICAgIAogICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIHBlcmZvcm1QYW5lbFNob3J0Y3V0KGludCBmZWF0dXJlSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGtleUNvZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5RXZlbnQgZXZlbnQsCkBAIC05OTYsNiArMTAwNSwxNiBAQAogICAgIHsKICAgICAgICAgcmV0dXJuIG1GZWF0dXJlczsKICAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUXVlcnkgZm9yIHRoZSBhdmFpbGFiaWxpdHkgb2YgYSBjZXJ0YWluIGZlYXR1cmUuCisgICAgICogCisgICAgICogQHBhcmFtIGZlYXR1cmUgVGhlIGZlYXR1cmUgSUQgdG8gY2hlY2sKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGZlYXR1cmUgaXMgZW5hYmxlZCwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGhhc0ZlYXR1cmUoaW50IGZlYXR1cmUpIHsKKyAgICAgICAgcmV0dXJuIChnZXRGZWF0dXJlcygpICYgKDEgPDwgZmVhdHVyZSkpICE9IDA7CisgICAgfQogCiAgICAgLyoqCiAgICAgICogUmV0dXJuIHRoZSBmZWF0dXJlIGJpdHMgdGhhdCBhcmUgYmVpbmcgaW1wbGVtZW50ZWQgYnkgdGhpcyBXaW5kb3cuCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L2FjY2Vzc2liaWxpdHkvQWNjZXNzaWJpbGl0eUV2ZW50LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L2FjY2Vzc2liaWxpdHkvQWNjZXNzaWJpbGl0eUV2ZW50LmphdmEKaW5kZXggYzIyZjk5MS4uZmM2MTcwMCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9hY2Nlc3NpYmlsaXR5L0FjY2Vzc2liaWxpdHlFdmVudC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvYWNjZXNzaWJpbGl0eS9BY2Nlc3NpYmlsaXR5RXZlbnQuamF2YQpAQCAtNjIyLDYgKzYyMiw3IEBACiAgICAgICAgIG1QYWNrYWdlTmFtZSA9IG51bGw7CiAgICAgICAgIG1Db250ZW50RGVzY3JpcHRpb24gPSBudWxsOwogICAgICAgICBtQmVmb3JlVGV4dCA9IG51bGw7CisgICAgICAgIG1QYXJjZWxhYmxlRGF0YSA9IG51bGw7CiAgICAgICAgIG1UZXh0LmNsZWFyKCk7CiAgICAgfQogCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L2FjY2Vzc2liaWxpdHkvQWNjZXNzaWJpbGl0eU1hbmFnZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvYWNjZXNzaWJpbGl0eS9BY2Nlc3NpYmlsaXR5TWFuYWdlci5qYXZhCmluZGV4IDAxODYyNzAuLmY0MDZkYTkgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvYWNjZXNzaWJpbGl0eS9BY2Nlc3NpYmlsaXR5TWFuYWdlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvYWNjZXNzaWJpbGl0eS9BY2Nlc3NpYmlsaXR5TWFuYWdlci5qYXZhCkBAIC05NCw3ICs5NCw5IEBACiAgICAgcHVibGljIHN0YXRpYyBBY2Nlc3NpYmlsaXR5TWFuYWdlciBnZXRJbnN0YW5jZShDb250ZXh0IGNvbnRleHQpIHsKICAgICAgICAgc3luY2hyb25pemVkIChzSW5zdGFuY2VTeW5jKSB7CiAgICAgICAgICAgICBpZiAoc0luc3RhbmNlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBzSW5zdGFuY2UgPSBuZXcgQWNjZXNzaWJpbGl0eU1hbmFnZXIoY29udGV4dCk7CisgICAgICAgICAgICAgICAgSUJpbmRlciBpQmluZGVyID0gU2VydmljZU1hbmFnZXIuZ2V0U2VydmljZShDb250ZXh0LkFDQ0VTU0lCSUxJVFlfU0VSVklDRSk7CisgICAgICAgICAgICAgICAgSUFjY2Vzc2liaWxpdHlNYW5hZ2VyIHNlcnZpY2UgPSBJQWNjZXNzaWJpbGl0eU1hbmFnZXIuU3R1Yi5hc0ludGVyZmFjZShpQmluZGVyKTsKKyAgICAgICAgICAgICAgICBzSW5zdGFuY2UgPSBuZXcgQWNjZXNzaWJpbGl0eU1hbmFnZXIoY29udGV4dCwgc2VydmljZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHNJbnN0YW5jZTsKQEAgLTEwNCwxMyArMTA2LDE2IEBACiAgICAgICogQ3JlYXRlIGFuIGluc3RhbmNlLgogICAgICAqCiAgICAgICogQHBhcmFtIGNvbnRleHQgQSB7QGxpbmsgQ29udGV4dH0uCisgICAgICogQHBhcmFtIHNlcnZpY2UgQW4gaW50ZXJmYWNlIHRvIHRoZSBiYWNraW5nIHNlcnZpY2UuCisgICAgICoKKyAgICAgKiBAaGlkZQogICAgICAqLwotICAgIHByaXZhdGUgQWNjZXNzaWJpbGl0eU1hbmFnZXIoQ29udGV4dCBjb250ZXh0KSB7CisgICAgcHVibGljIEFjY2Vzc2liaWxpdHlNYW5hZ2VyKENvbnRleHQgY29udGV4dCwgSUFjY2Vzc2liaWxpdHlNYW5hZ2VyIHNlcnZpY2UpIHsKICAgICAgICAgbUhhbmRsZXIgPSBuZXcgTXlIYW5kbGVyKGNvbnRleHQuZ2V0TWFpbkxvb3BlcigpKTsKLSAgICAgICAgSUJpbmRlciBpQmluZGVyID0gU2VydmljZU1hbmFnZXIuZ2V0U2VydmljZShDb250ZXh0LkFDQ0VTU0lCSUxJVFlfU0VSVklDRSk7Ci0gICAgICAgIG1TZXJ2aWNlID0gSUFjY2Vzc2liaWxpdHlNYW5hZ2VyLlN0dWIuYXNJbnRlcmZhY2UoaUJpbmRlcik7CisgICAgICAgIG1TZXJ2aWNlID0gc2VydmljZTsKKwogICAgICAgICB0cnkgewotICAgICAgICAgICAgbVNlcnZpY2UuYWRkQ2xpZW50KG1DbGllbnQpOworICAgICAgICAgICAgbUlzRW5hYmxlZCA9IG1TZXJ2aWNlLmFkZENsaWVudChtQ2xpZW50KTsKICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIHJlKSB7CiAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiQWNjZXNzaWJpbGl0eU1hbmFnZXJTZXJ2aWNlIGlzIGRlYWQiLCByZSk7CiAgICAgICAgIH0KQEAgLTEyOCw2ICsxMzMsMTggQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBjbGllbnQgaW50ZXJmYWNlIHRoaXMgaW5zdGFuY2UgcmVnaXN0ZXJzIGluCisgICAgICogdGhlIGNlbnRyYWxpemVkIGFjY2Vzc2liaWxpdHkgbWFuYWdlciBzZXJ2aWNlLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgY2xpZW50LgorICAgICAqCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgSUFjY2Vzc2liaWxpdHlNYW5hZ2VyQ2xpZW50IGdldENsaWVudCgpIHsKKyAgICAgICByZXR1cm4gKElBY2Nlc3NpYmlsaXR5TWFuYWdlckNsaWVudCkgbUNsaWVudC5hc0JpbmRlcigpOyAKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBTZW5kcyBhbiB7QGxpbmsgQWNjZXNzaWJpbGl0eUV2ZW50fS4gSWYgdGhpcyB7QGxpbmsgQWNjZXNzaWJpbGl0eU1hbmFnZXJ9IGlzIG5vdAogICAgICAqIGVuYWJsZWQgdGhlIGNhbGwgaXMgYSBOT09QLgogICAgICAqCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L2FjY2Vzc2liaWxpdHkvSUFjY2Vzc2liaWxpdHlNYW5hZ2VyLmFpZGwgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L2FjY2Vzc2liaWxpdHkvSUFjY2Vzc2liaWxpdHlNYW5hZ2VyLmFpZGwKaW5kZXggMzI3ODhiZS4uNzYzMzU2OWQgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvYWNjZXNzaWJpbGl0eS9JQWNjZXNzaWJpbGl0eU1hbmFnZXIuYWlkbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L2FjY2Vzc2liaWxpdHkvSUFjY2Vzc2liaWxpdHlNYW5hZ2VyLmFpZGwKQEAgLTI5LDcgKzI5LDcgQEAKICAqLwogaW50ZXJmYWNlIElBY2Nlc3NpYmlsaXR5TWFuYWdlciB7CiAKLSAgICB2b2lkIGFkZENsaWVudChJQWNjZXNzaWJpbGl0eU1hbmFnZXJDbGllbnQgY2xpZW50KTsKKyAgICBib29sZWFuIGFkZENsaWVudChJQWNjZXNzaWJpbGl0eU1hbmFnZXJDbGllbnQgY2xpZW50KTsKIAogICAgIGJvb2xlYW4gc2VuZEFjY2Vzc2liaWxpdHlFdmVudChpbiBBY2Nlc3NpYmlsaXR5RXZlbnQgdWlFdmVudCk7CiAKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvYW5pbWF0aW9uL0FuaW1hdGlvbi5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9hbmltYXRpb24vQW5pbWF0aW9uLmphdmEKaW5kZXggMzQ5YjdlNS4uZjMzOTJkOSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9hbmltYXRpb24vQW5pbWF0aW9uLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9hbmltYXRpb24vQW5pbWF0aW9uLmphdmEKQEAgLTE3NCw3ICsxNzQsMTMgQEAKICAgICAgKiBEZXNpcmVkIFogb3JkZXIgbW9kZSBkdXJpbmcgYW5pbWF0aW9uLgogICAgICAqLwogICAgIHByaXZhdGUgaW50IG1aQWRqdXN0bWVudDsKLSAgICAKKworICAgIC8qKgorICAgICAqIHNjYWxlZmFjdG9yIHRvIGFwcGx5IHRvIHBpdm90IHBvaW50cywgZXRjLiBkdXJpbmcgYW5pbWF0aW9uLiBTdWJjbGFzc2VzIHJldHJpZXZlIHRoZQorICAgICAqIHZhbHVlIHZpYSBnZXRTY2FsZUZhY3RvcigpLgorICAgICAqLworICAgIHByaXZhdGUgZmxvYXQgbVNjYWxlRmFjdG9yID0gMWY7CisKICAgICAvKioKICAgICAgKiBEb24ndCBhbmltYXRlIHRoZSB3YWxscGFwZXIuCiAgICAgICovCkBAIC01NTMsNiArNTU5LDE5IEBACiAgICAgfQogICAgIAogICAgIC8qKgorICAgICAqIFRoZSBzY2FsZSBmYWN0b3IgaXMgc2V0IGJ5IHRoZSBjYWxsIHRvIDxjb2RlPmdldFRyYW5zZm9ybWF0aW9uPC9jb2RlPi4gT3ZlcnJpZGVzIG9mIAorICAgICAqIHtAbGluayAjZ2V0VHJhbnNmb3JtYXRpb24obG9uZywgVHJhbnNmb3JtYXRpb24sIGZsb2F0KX0gd2lsbCBnZXQgdGhpcyB2YWx1ZQorICAgICAqIGRpcmVjdGx5LiBPdmVycmlkZXMgb2Yge0BsaW5rICNhcHBseVRyYW5zZm9ybWF0aW9uKGZsb2F0LCBUcmFuc2Zvcm1hdGlvbil9IGNhbgorICAgICAqIGNhbGwgdGhpcyBtZXRob2QgdG8gZ2V0IHRoZSB2YWx1ZS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIGZsb2F0IFRoZSBzY2FsZSBmYWN0b3IgdGhhdCBzaG91bGQgYmUgYXBwbGllZCB0byBwcmUtc2NhbGVkIHZhbHVlcyBpbgorICAgICAqIGFuIEFuaW1hdGlvbiBzdWNoIGFzIHRoZSBwaXZvdCBwb2ludHMgaW4ge0BsaW5rIFNjYWxlQW5pbWF0aW9ufSBhbmQge0BsaW5rIFJvdGF0ZUFuaW1hdGlvbn0uCisgICAgICovCisgICAgcHJvdGVjdGVkIGZsb2F0IGdldFNjYWxlRmFjdG9yKCkgeworICAgICAgICByZXR1cm4gbVNjYWxlRmFjdG9yOworICAgIH0KKworICAgIC8qKgogICAgICAqIElmIGRldGFjaFdhbGxwYXBlciBpcyB0cnVlLCBhbmQgdGhpcyBpcyBhIHdpbmRvdyBhbmltYXRpb24gb2YgYSB3aW5kb3cKICAgICAgKiB0aGF0IGhhcyBhIHdhbGxwYXBlciBiYWNrZ3JvdW5kLCB0aGVuIHRoZSB3aW5kb3cgd2lsbCBiZSBkZXRhY2hlZCBmcm9tCiAgICAgICogdGhlIHdhbGxwYXBlciB3aGlsZSBpdCBydW5zLiAgVGhhdCBpcywgdGhlIGFuaW1hdGlvbiB3aWxsIG9ubHkgYmUgYXBwbGllZApAQCAtNzM1LDYgKzc1NCw3IEBACiAgICAgICogQHJldHVybiBUcnVlIGlmIHRoZSBhbmltYXRpb24gaXMgc3RpbGwgcnVubmluZwogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGdldFRyYW5zZm9ybWF0aW9uKGxvbmcgY3VycmVudFRpbWUsIFRyYW5zZm9ybWF0aW9uIG91dFRyYW5zZm9ybWF0aW9uKSB7CisKICAgICAgICAgaWYgKG1TdGFydFRpbWUgPT0gLTEpIHsKICAgICAgICAgICAgIG1TdGFydFRpbWUgPSBjdXJyZW50VGltZTsKICAgICAgICAgfQpAQCAtODA2LDYgKzgyNiwyNCBAQAogCiAgICAgICAgIHJldHVybiBtTW9yZTsKICAgICB9CisgICAgCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgdHJhbnNmb3JtYXRpb24gdG8gYXBwbHkgYXQgYSBzcGVjaWZpZWQgcG9pbnQgaW4gdGltZS4gSW1wbGVtZW50YXRpb25zIG9mIHRoaXMKKyAgICAgKiBtZXRob2Qgc2hvdWxkIGFsd2F5cyByZXBsYWNlIHRoZSBzcGVjaWZpZWQgVHJhbnNmb3JtYXRpb24gb3IgZG9jdW1lbnQgdGhleSBhcmUgZG9pbmcKKyAgICAgKiBvdGhlcndpc2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY3VycmVudFRpbWUgV2hlcmUgd2UgYXJlIGluIHRoZSBhbmltYXRpb24uIFRoaXMgaXMgd2FsbCBjbG9jayB0aW1lLgorICAgICAqIEBwYXJhbSBvdXRUcmFuc2Zvcm1hdGlvbiBBIHRyYW5mb3JtYXRpb24gb2JqZWN0IHRoYXQgaXMgcHJvdmlkZWQgYnkgdGhlCisgICAgICogICAgICAgIGNhbGxlciBhbmQgd2lsbCBiZSBmaWxsZWQgaW4gYnkgdGhlIGFuaW1hdGlvbi4KKyAgICAgKiBAcGFyYW0gc2NhbGUgU2NhbGluZyBmYWN0b3IgdG8gYXBwbHkgdG8gYW55IGlucHV0cyB0byB0aGUgdHJhbnNmb3JtIG9wZXJhdGlvbiwgc3VjaAorICAgICAqICAgICAgICBwaXZvdCBwb2ludHMgYmVpbmcgcm90YXRlZCBvciBzY2FsZWQgYXJvdW5kLgorICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgYW5pbWF0aW9uIGlzIHN0aWxsIHJ1bm5pbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRUcmFuc2Zvcm1hdGlvbihsb25nIGN1cnJlbnRUaW1lLCBUcmFuc2Zvcm1hdGlvbiBvdXRUcmFuc2Zvcm1hdGlvbiwKKyAgICAgICAgICAgIGZsb2F0IHNjYWxlKSB7CisgICAgICAgIG1TY2FsZUZhY3RvciA9IHNjYWxlOworICAgICAgICByZXR1cm4gZ2V0VHJhbnNmb3JtYXRpb24oY3VycmVudFRpbWUsIG91dFRyYW5zZm9ybWF0aW9uKTsKKyAgICB9CiAKICAgICAvKioKICAgICAgKiA8cD5JbmRpY2F0ZXMgd2hldGhlciB0aGlzIGFuaW1hdGlvbiBoYXMgc3RhcnRlZCBvciBub3QuPC9wPgpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9hbmltYXRpb24vQW5pbWF0aW9uU2V0LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L2FuaW1hdGlvbi9BbmltYXRpb25TZXQuamF2YQppbmRleCAxNTQ2ZGNkLi44NzNjZTUzIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L2FuaW1hdGlvbi9BbmltYXRpb25TZXQuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L2FuaW1hdGlvbi9BbmltYXRpb25TZXQuamF2YQpAQCAtMzEyLDcgKzMxMiw3IEBACiAgICAgICAgICAgICBmaW5hbCBBbmltYXRpb24gYSA9IGFuaW1hdGlvbnMuZ2V0KGkpOwogCiAgICAgICAgICAgICB0ZW1wLmNsZWFyKCk7Ci0gICAgICAgICAgICBtb3JlID0gYS5nZXRUcmFuc2Zvcm1hdGlvbihjdXJyZW50VGltZSwgdGVtcCkgfHwgbW9yZTsKKyAgICAgICAgICAgIG1vcmUgPSBhLmdldFRyYW5zZm9ybWF0aW9uKGN1cnJlbnRUaW1lLCB0ZW1wLCBnZXRTY2FsZUZhY3RvcigpKSB8fCBtb3JlOwogICAgICAgICAgICAgdC5jb21wb3NlKHRlbXApOwogCiAgICAgICAgICAgICBzdGFydGVkID0gc3RhcnRlZCB8fCBhLmhhc1N0YXJ0ZWQoKTsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvYW5pbWF0aW9uL1JvdGF0ZUFuaW1hdGlvbi5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9hbmltYXRpb24vUm90YXRlQW5pbWF0aW9uLmphdmEKaW5kZXggMjg0Y2NjZS4uNThiZjA4NCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9hbmltYXRpb24vUm90YXRlQW5pbWF0aW9uLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9hbmltYXRpb24vUm90YXRlQW5pbWF0aW9uLmphdmEKQEAgLTE0OCwxMSArMTQ4LDEyIEBACiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgYXBwbHlUcmFuc2Zvcm1hdGlvbihmbG9hdCBpbnRlcnBvbGF0ZWRUaW1lLCBUcmFuc2Zvcm1hdGlvbiB0KSB7CiAgICAgICAgIGZsb2F0IGRlZ3JlZXMgPSBtRnJvbURlZ3JlZXMgKyAoKG1Ub0RlZ3JlZXMgLSBtRnJvbURlZ3JlZXMpICogaW50ZXJwb2xhdGVkVGltZSk7Ci0KKyAgICAgICAgZmxvYXQgc2NhbGUgPSBnZXRTY2FsZUZhY3RvcigpOworICAgICAgICAKICAgICAgICAgaWYgKG1QaXZvdFggPT0gMC4wZiAmJiBtUGl2b3RZID09IDAuMGYpIHsKICAgICAgICAgICAgIHQuZ2V0TWF0cml4KCkuc2V0Um90YXRlKGRlZ3JlZXMpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdC5nZXRNYXRyaXgoKS5zZXRSb3RhdGUoZGVncmVlcywgbVBpdm90WCwgbVBpdm90WSk7CisgICAgICAgICAgICB0LmdldE1hdHJpeCgpLnNldFJvdGF0ZShkZWdyZWVzLCBtUGl2b3RYICogc2NhbGUsIG1QaXZvdFkgKiBzY2FsZSk7CiAgICAgICAgIH0KICAgICB9CiAKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvYW5pbWF0aW9uL1NjYWxlQW5pbWF0aW9uLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L2FuaW1hdGlvbi9TY2FsZUFuaW1hdGlvbi5qYXZhCmluZGV4IDFhNTZjOGIuLjg1MzdkNDIgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvYW5pbWF0aW9uL1NjYWxlQW5pbWF0aW9uLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9hbmltYXRpb24vU2NhbGVBbmltYXRpb24uamF2YQpAQCAtMTYxLDYgKzE2MSw3IEBACiAgICAgcHJvdGVjdGVkIHZvaWQgYXBwbHlUcmFuc2Zvcm1hdGlvbihmbG9hdCBpbnRlcnBvbGF0ZWRUaW1lLCBUcmFuc2Zvcm1hdGlvbiB0KSB7CiAgICAgICAgIGZsb2F0IHN4ID0gMS4wZjsKICAgICAgICAgZmxvYXQgc3kgPSAxLjBmOworICAgICAgICBmbG9hdCBzY2FsZSA9IGdldFNjYWxlRmFjdG9yKCk7CiAKICAgICAgICAgaWYgKG1Gcm9tWCAhPSAxLjBmIHx8IG1Ub1ggIT0gMS4wZikgewogICAgICAgICAgICAgc3ggPSBtRnJvbVggKyAoKG1Ub1ggLSBtRnJvbVgpICogaW50ZXJwb2xhdGVkVGltZSk7CkBAIC0xNzIsNyArMTczLDcgQEAKICAgICAgICAgaWYgKG1QaXZvdFggPT0gMCAmJiBtUGl2b3RZID09IDApIHsKICAgICAgICAgICAgIHQuZ2V0TWF0cml4KCkuc2V0U2NhbGUoc3gsIHN5KTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHQuZ2V0TWF0cml4KCkuc2V0U2NhbGUoc3gsIHN5LCBtUGl2b3RYLCBtUGl2b3RZKTsKKyAgICAgICAgICAgIHQuZ2V0TWF0cml4KCkuc2V0U2NhbGUoc3gsIHN5LCBzY2FsZSAqIG1QaXZvdFgsIHNjYWxlICogbVBpdm90WSk7CiAgICAgICAgIH0KICAgICB9CiAKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9BY2Nlc3NpYmlsaXR5SW5qZWN0b3IuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9BY2Nlc3NpYmlsaXR5SW5qZWN0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OWRkYzE5Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L0FjY2Vzc2liaWxpdHlJbmplY3Rvci5qYXZhCkBAIC0wLDAgKzEsOTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQud2Via2l0OworCitpbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OworaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlFdmVudDsKK2ltcG9ydCBhbmRyb2lkLndlYmtpdC5XZWJWaWV3Q29yZS5FdmVudEh1YjsKKworLyoqCisgKiBUaGlzIGNsYXNzIGluamVjdHMgYWNjZXNzaWJpbGl0eSBpbnRvIFdlYlZpZXdzIHdpdGggZGlzYWJsZWQgSmF2YVNjcmlwdCBvcgorICogV2ViVmlld3Mgd2l0aCBlbmFibGVkIEphdmFTY3JpcHQgYnV0IGZvciB3aGljaCB3ZSBoYXZlIG5vIGFjY2Vzc2liaWxpdHkKKyAqIHNjcmlwdCB0byBpbmplY3QuCisgKi8KK2NsYXNzIEFjY2Vzc2liaWxpdHlJbmplY3RvciB7CisKKyAgICAvLyBIYW5kbGUgdG8gdGhlIFdlYlZpZXcgdGhpcyBpbmplY3RvciBpcyBhc3NvY2lhdGVkIHdpdGguCisgICAgcHJpdmF0ZSBmaW5hbCBXZWJWaWV3IG1XZWJWaWV3OworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyBpbmplY3RvciBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbiBWd2ViVmlldy4KKyAgICAgKgorICAgICAqIEBwYXJhbSB3ZWJWaWV3IFRoZSBhc3NvY2lhdGVkIFdlYlZpZXcuCisgICAgICovCisgICAgcHVibGljIEFjY2Vzc2liaWxpdHlJbmplY3RvcihXZWJWaWV3IHdlYlZpZXcpIHsKKyAgICAgICAgbVdlYlZpZXcgPSB3ZWJWaWV3OworICAgIH0KKworICAgIC8qKgorICAgICAqIFByb2Nlc3NlcyBhIGtleSBkb3duIDxjb2RlPmV2ZW50PC9jb2RlPi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgZXZlbnQgd2FzIHByb2Nlc3NlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBvbktleUV2ZW50KEtleUV2ZW50IGV2ZW50KSB7CisKKyAgICAgICAgLy8gYXMgYSBwcm9vZiBvZiBjb25jZXB0IGxldCB1cyBkbyB0aGUgc2ltcGxlc3QgZXhhbXBsZQorCisgICAgICAgIGlmIChldmVudC5nZXRBY3Rpb24oKSAhPSBLZXlFdmVudC5BQ1RJT05fVVApIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGludCBrZXlDb2RlID0gZXZlbnQuZ2V0S2V5Q29kZSgpOworCisgICAgICAgIHN3aXRjaCAoa2V5Q29kZSkgeworICAgICAgICAgICAgY2FzZSBLZXlFdmVudC5LRVlDT0RFX046CisgICAgICAgICAgICAgICAgbW9kaWZ5U2VsZWN0aW9uKCJleHRlbmQiLCAiZm9yd2FyZCIsICJzZW50ZW5jZSIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBLZXlFdmVudC5LRVlDT0RFX1A6CisgICAgICAgICAgICAgICAgbW9kaWZ5U2VsZWN0aW9uKCJleHRlbmQiLCAiYmFja3dhcmQiLCAic2VudGVuY2UiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgd2hlbiB0aGUgPGNvZGU+c2VsZWN0aW9uU3RyaW5nPC9jb2RlPiBoYXMgY2hhbmdlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBvblNlbGVjdGlvblN0cmluZ0NoYW5nZShTdHJpbmcgc2VsZWN0aW9uU3RyaW5nKSB7CisgICAgICAgIC8vIHB1dCB0aGUgc2VsZWN0aW9uIHN0cmluZyBpbiBhbiBBY2Nlc3NpYmlsaXR5RXZlbnQgYW5kIHNlbmQgaXQKKyAgICAgICAgQWNjZXNzaWJpbGl0eUV2ZW50IGV2ZW50ID0gQWNjZXNzaWJpbGl0eUV2ZW50Lm9idGFpbihBY2Nlc3NpYmlsaXR5RXZlbnQuVFlQRV9WSUVXX0ZPQ1VTRUQpOworICAgICAgICBldmVudC5nZXRUZXh0KCkuYWRkKHNlbGVjdGlvblN0cmluZyk7CisgICAgICAgIG1XZWJWaWV3LnNlbmRBY2Nlc3NpYmlsaXR5RXZlbnRVbmNoZWNrZWQoZXZlbnQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIE1vZGlmaWVzIHRoZSBjdXJyZW50IHNlbGVjdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhbHRlciBTcGVjaWZpZXMgaG93IHRvIGFsdGVyIHRoZSBzZWxlY3Rpb24uCisgICAgICogQHBhcmFtIGRpcmVjdGlvbiBUaGUgZGlyZWN0aW9uIGluIHdoaWNoIHRvIGFsdGVyIHRoZSBzZWxlY3Rpb24uCisgICAgICogQHBhcmFtIGdyYW51bGFyaXR5IFRoZSBncmFudWxhcml0eSBvZiB0aGUgc2VsZWN0aW9uIG1vZGlmaWNhdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgbW9kaWZ5U2VsZWN0aW9uKFN0cmluZyBhbHRlciwgU3RyaW5nIGRpcmVjdGlvbiwgU3RyaW5nIGdyYW51bGFyaXR5KSB7CisgICAgICAgIFdlYlZpZXdDb3JlIHdlYlZpZXdDb3JlID0gbVdlYlZpZXcuZ2V0V2ViVmlld0NvcmUoKTsKKworICAgICAgICBpZiAod2ViVmlld0NvcmUgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgV2ViVmlld0NvcmUuTW9kaWZ5U2VsZWN0aW9uRGF0YSBkYXRhID0gbmV3IFdlYlZpZXdDb3JlLk1vZGlmeVNlbGVjdGlvbkRhdGEoKTsKKyAgICAgICAgZGF0YS5tQWx0ZXIgPSBhbHRlcjsKKyAgICAgICAgZGF0YS5tRGlyZWN0aW9uID0gZGlyZWN0aW9uOworICAgICAgICBkYXRhLm1HcmFudWxhcml0eSA9IGdyYW51bGFyaXR5OworICAgICAgICB3ZWJWaWV3Q29yZS5zZW5kTWVzc2FnZShFdmVudEh1Yi5NT0RJRllfU0VMRUNUSU9OLCBkYXRhKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvQnJvd3NlckZyYW1lLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvQnJvd3NlckZyYW1lLmphdmEKaW5kZXggMjE5YTQ2OS4uN2IxYWFiMiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L0Jyb3dzZXJGcmFtZS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9Ccm93c2VyRnJhbWUuamF2YQpAQCAtNzIsNiArNzIsOCBAQAogICAgIC8vIHF1ZXVlIGhhcyBiZWVuIGNsZWFyZWQsdGhleSBhcmUgaWdub3JlZC4KICAgICBwcml2YXRlIGJvb2xlYW4gbUJsb2NrTWVzc2FnZXMgPSBmYWxzZTsKIAorICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBzRGF0YURpcmVjdG9yeSA9ICIiOworCiAgICAgLy8gSXMgdGhpcyBmcmFtZSB0aGUgbWFpbiBmcmFtZT8KICAgICBwcml2YXRlIGJvb2xlYW4gbUlzTWFpbkZyYW1lOwogCkBAIC0yMjQsNiArMjI2LDExIEBACiAgICAgICAgIEFzc2V0TWFuYWdlciBhbSA9IGNvbnRleHQuZ2V0QXNzZXRzKCk7CiAgICAgICAgIG5hdGl2ZUNyZWF0ZUZyYW1lKHcsIGFtLCBwcm94eS5nZXRCYWNrRm9yd2FyZExpc3QoKSk7CiAKKyAgICAgICAgaWYgKHNEYXRhRGlyZWN0b3J5Lmxlbmd0aCgpID09IDApIHsKKyAgICAgICAgICAgIFN0cmluZyBkaXIgPSBhcHBDb250ZXh0LmdldEZpbGVzRGlyKCkuZ2V0QWJzb2x1dGVQYXRoKCk7CisgICAgICAgICAgICBzRGF0YURpcmVjdG9yeSA9ICBkaXIuc3Vic3RyaW5nKDAsIGRpci5sYXN0SW5kZXhPZignLycpKTsKKyAgICAgICAgfQorCiAgICAgICAgIGlmIChEZWJ1Z0ZsYWdzLkJST1dTRVJfRlJBTUUpIHsKICAgICAgICAgICAgIExvZy52KExPR1RBRywgIkJyb3dzZXJGcmFtZSBjb25zdHJ1Y3RvcjogdGhpcz0iICsgdGhpcyk7CiAgICAgICAgIH0KQEAgLTUxMCwxMiArNTE3LDIxIEBACiAgICAgcHJpdmF0ZSBuYXRpdmUgU3RyaW5nIGV4dGVybmFsUmVwcmVzZW50YXRpb24oKTsKIAogICAgIC8qKgotICAgICAqIFJldHJpZXZlcyB0aGUgdmlzdWFsIHRleHQgb2YgdGhlIGN1cnJlbnQgZnJhbWUsIHB1dHMgaXQgYXMgdGhlIG9iamVjdCBmb3IKKyAgICAgKiBSZXRyaWV2ZXMgdGhlIHZpc3VhbCB0ZXh0IG9mIHRoZSBmcmFtZXMsIHB1dHMgaXQgYXMgdGhlIG9iamVjdCBmb3IKICAgICAgKiB0aGUgbWVzc2FnZSBhbmQgc2VuZHMgdGhlIG1lc3NhZ2UuCiAgICAgICogQHBhcmFtIGNhbGxiYWNrIHRoZSBtZXNzYWdlIHRvIHVzZSB0byBzZW5kIHRoZSB2aXN1YWwgdGV4dAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGRvY3VtZW50QXNUZXh0KE1lc3NhZ2UgY2FsbGJhY2spIHsKLSAgICAgICAgY2FsbGJhY2sub2JqID0gZG9jdW1lbnRBc1RleHQoKTs7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgdGV4dCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIGlmIChjYWxsYmFjay5hcmcxICE9IDApIHsKKyAgICAgICAgICAgIC8vIER1bXAgdG9wIGZyYW1lIGFzIHRleHQuCisgICAgICAgICAgICB0ZXh0LmFwcGVuZChkb2N1bWVudEFzVGV4dCgpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoY2FsbGJhY2suYXJnMiAhPSAwKSB7CisgICAgICAgICAgICAvLyBEdW1wIGNoaWxkIGZyYW1lcyBhcyB0ZXh0LgorICAgICAgICAgICAgdGV4dC5hcHBlbmQoY2hpbGRGcmFtZXNBc1RleHQoKSk7CisgICAgICAgIH0KKyAgICAgICAgY2FsbGJhY2sub2JqID0gdGV4dC50b1N0cmluZygpOwogICAgICAgICBjYWxsYmFjay5zZW5kVG9UYXJnZXQoKTsKICAgICB9CiAKQEAgLTUyNCw2ICs1NDAsMTEgQEAKICAgICAgKi8KICAgICBwcml2YXRlIG5hdGl2ZSBTdHJpbmcgZG9jdW1lbnRBc1RleHQoKTsKIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgdGV4dCBkcmF3biBvbiB0aGUgY2hpbGQgZnJhbWVzIGFzIGEgc3RyaW5nCisgICAgICovCisgICAgcHJpdmF0ZSBuYXRpdmUgU3RyaW5nIGNoaWxkRnJhbWVzQXNUZXh0KCk7CisKICAgICAvKgogICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSBXZWJDb3JlIHRvIGluZm9ybSB0aGUgZnJhbWUgdGhhdAogICAgICAqIHRoZSBKYXZhc2NyaXB0IHdpbmRvdyBvYmplY3QgaGFzIGJlZW4gY2xlYXJlZC4KQEAgLTYxNyw2ICs2MzgsMTQgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBDYWxsZWQgYnkgSk5JLiBHZXRzIHRoZSBhcHBsaWNhdGlvbnMgZGF0YSBkaXJlY3RvcnkKKyAgICAgKiBAcmV0dXJuIFN0cmluZyBUaGUgYXBwbGljYXRpb25zIGRhdGEgZGlyZWN0b3J5CisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldERhdGFEaXJlY3RvcnkoKSB7CisgICAgICAgIHJldHVybiBzRGF0YURpcmVjdG9yeTsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBTdGFydCBsb2FkaW5nIGEgcmVzb3VyY2UuCiAgICAgICogQHBhcmFtIGxvYWRlckhhbmRsZSBUaGUgbmF0aXZlIFJlc291cmNlTG9hZGVyIHRoYXQgaXMgdGhlIHRhcmdldCBvZiB0aGUKICAgICAgKiAgICAgICAgICAgICAgICAgICAgIGRhdGEuCkBAIC03ODUsMTEgKzgxNCw3IEBACiAgICAgICogQHJldHVybiBUaGUgQnJvd3NlckZyYW1lIG9iamVjdCBzdG9yZWQgaW4gdGhlIG5ldyBXZWJWaWV3LgogICAgICAqLwogICAgIHByaXZhdGUgQnJvd3NlckZyYW1lIGNyZWF0ZVdpbmRvdyhib29sZWFuIGRpYWxvZywgYm9vbGVhbiB1c2VyR2VzdHVyZSkgewotICAgICAgICBXZWJWaWV3IHcgPSBtQ2FsbGJhY2tQcm94eS5jcmVhdGVXaW5kb3coZGlhbG9nLCB1c2VyR2VzdHVyZSk7Ci0gICAgICAgIGlmICh3ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiB3LmdldFdlYlZpZXdDb3JlKCkuZ2V0QnJvd3NlckZyYW1lKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIHJldHVybiBtQ2FsbGJhY2tQcm94eS5jcmVhdGVXaW5kb3coZGlhbG9nLCB1c2VyR2VzdHVyZSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC04NDYsNiArODcxLDcgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRklMRV9VUExPQURfTEFCRUwgPSA0OwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSRVNFVF9MQUJFTCA9IDU7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNVQk1JVF9MQUJFTCA9IDY7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZJTEVfVVBMT0FEX05PX0ZJTEVfQ0hPU0VOID0gNzsKIAogICAgIFN0cmluZyBnZXRSYXdSZXNGaWxlbmFtZShpbnQgaWQpIHsKICAgICAgICAgaW50IHJlc2lkOwpAQCAtODc1LDYgKzkwMSwxMCBAQAogICAgICAgICAgICAgICAgIHJldHVybiBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRTdHJpbmcoCiAgICAgICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0cmluZy5zdWJtaXQpOwogCisgICAgICAgICAgICBjYXNlIEZJTEVfVVBMT0FEX05PX0ZJTEVfQ0hPU0VOOgorICAgICAgICAgICAgICAgIHJldHVybiBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRTdHJpbmcoCisgICAgICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0cmluZy5ub19maWxlX2Nob3Nlbik7CisKICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgTG9nLmUoTE9HVEFHLCAiZ2V0UmF3UmVzRmlsZW5hbWUgZ290IGluY29tcGF0aWJsZSByZXNvdXJjZSBJRCIpOwogICAgICAgICAgICAgICAgIHJldHVybiAiIjsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9DYWxsYmFja1Byb3h5LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvQ2FsbGJhY2tQcm94eS5qYXZhCmluZGV4IDBlMGUwMzIuLjQyNzNiYzMgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9DYWxsYmFja1Byb3h5LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L0NhbGxiYWNrUHJveHkuamF2YQpAQCAtMTYsNiArMTYsNyBAQAogCiBwYWNrYWdlIGFuZHJvaWQud2Via2l0OwogCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CiBpbXBvcnQgYW5kcm9pZC5hcHAuQWxlcnREaWFsb2c7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkFjdGl2aXR5Tm90Rm91bmRFeGNlcHRpb247CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CkBAIC00MSw2ICs0Miw3IEBACiBpbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwogaW1wb3J0IGphdmEubmV0LlVSTDsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOwogCiAvKioKICAqIFRoaXMgY2xhc3MgaXMgYSBwcm94eSBjbGFzcyBmb3IgaGFuZGxpbmcgV2ViQ29yZSAtPiBVSSB0aHJlYWQgbWVzc2FnaW5nLiBBbGwKQEAgLTUwMCwxOCArNTAyLDMyIEBACiAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB1cmwgPSBtc2cuZ2V0RGF0YSgpLmdldFN0cmluZygidXJsIik7CiAgICAgICAgICAgICAgICAgICAgIGlmICghbVdlYkNocm9tZUNsaWVudC5vbkpzQWxlcnQobVdlYlZpZXcsIHVybCwgbWVzc2FnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXMpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBvbmx5IGRpc3BsYXkgdGhlIGFsZXJ0IGRpYWxvZyBpZiB0aGUgbUNvbnRleHQgaXMKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFjdGl2aXR5IGFuZCBpdHMgd2luZG93IGhhcyB0aGUgZm9jdXMuCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShtQ29udGV4dCBpbnN0YW5jZW9mIEFjdGl2aXR5KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAhKChBY3Rpdml0eSkgbUNvbnRleHQpLmhhc1dpbmRvd0ZvY3VzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXMuY2FuY2VsKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzLnNldFJlYWR5KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQWxlcnREaWFsb2cuQnVpbGRlcihtQ29udGV4dCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFRpdGxlKGdldEpzRGlhbG9nVGl0bGUodXJsKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldE1lc3NhZ2UobWVzc2FnZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFBvc2l0aXZlQnV0dG9uKFIuc3RyaW5nLm9rLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBbGVydERpYWxvZy5PbkNsaWNrTGlzdGVuZXIoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IERpYWxvZ0ludGVyZmFjZS5PbkNsaWNrTGlzdGVuZXIoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlhbG9nSW50ZXJmYWNlIGRpYWxvZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2hpY2gpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcy5jb25maXJtKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0Q2FuY2VsYWJsZShmYWxzZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldE9uQ2FuY2VsTGlzdGVuZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IERpYWxvZ0ludGVyZmFjZS5PbkNhbmNlbExpc3RlbmVyKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNhbmNlbCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaWFsb2dJbnRlcmZhY2UgZGlhbG9nKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXMuY2FuY2VsKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2hvdygpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIHJlcy5zZXRSZWFkeSgpOwpAQCAtNTI1LDYgKzU0MSwxNCBAQAogICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdXJsID0gbXNnLmdldERhdGEoKS5nZXRTdHJpbmcoInVybCIpOwogICAgICAgICAgICAgICAgICAgICBpZiAoIW1XZWJDaHJvbWVDbGllbnQub25Kc0NvbmZpcm0obVdlYlZpZXcsIHVybCwgbWVzc2FnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXMpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBvbmx5IGRpc3BsYXkgdGhlIGFsZXJ0IGRpYWxvZyBpZiB0aGUgbUNvbnRleHQgaXMKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFjdGl2aXR5IGFuZCBpdHMgd2luZG93IGhhcyB0aGUgZm9jdXMuCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShtQ29udGV4dCBpbnN0YW5jZW9mIEFjdGl2aXR5KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAhKChBY3Rpdml0eSkgbUNvbnRleHQpLmhhc1dpbmRvd0ZvY3VzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXMuY2FuY2VsKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzLnNldFJlYWR5KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQWxlcnREaWFsb2cuQnVpbGRlcihtQ29udGV4dCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFRpdGxlKGdldEpzRGlhbG9nVGl0bGUodXJsKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldE1lc3NhZ2UobWVzc2FnZSkKQEAgLTU2NSw2ICs1ODksMTQgQEAKICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHVybCA9IG1zZy5nZXREYXRhKCkuZ2V0U3RyaW5nKCJ1cmwiKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKCFtV2ViQ2hyb21lQ2xpZW50Lm9uSnNQcm9tcHQobVdlYlZpZXcsIHVybCwgbWVzc2FnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFZhbCwgcmVzKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gb25seSBkaXNwbGF5IHRoZSBhbGVydCBkaWFsb2cgaWYgdGhlIG1Db250ZXh0IGlzCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBBY3Rpdml0eSBhbmQgaXRzIHdpbmRvdyBoYXMgdGhlIGZvY3VzLgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEobUNvbnRleHQgaW5zdGFuY2VvZiBBY3Rpdml0eSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgISgoQWN0aXZpdHkpIG1Db250ZXh0KS5oYXNXaW5kb3dGb2N1cygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzLmNhbmNlbCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcy5zZXRSZWFkeSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTGF5b3V0SW5mbGF0ZXIgZmFjdG9yeSA9IExheW91dEluZmxhdGVyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5mcm9tKG1Db250ZXh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFZpZXcgdmlldyA9IGZhY3RvcnkuaW5mbGF0ZShSLmxheW91dC5qc19wcm9tcHQsCkBAIC02MTYsNiArNjQ4LDE0IEBACiAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB1cmwgPSBtc2cuZ2V0RGF0YSgpLmdldFN0cmluZygidXJsIik7CiAgICAgICAgICAgICAgICAgICAgIGlmICghbVdlYkNocm9tZUNsaWVudC5vbkpzQmVmb3JlVW5sb2FkKG1XZWJWaWV3LCB1cmwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSwgcmVzKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gb25seSBkaXNwbGF5IHRoZSBhbGVydCBkaWFsb2cgaWYgdGhlIG1Db250ZXh0IGlzCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBBY3Rpdml0eSBhbmQgaXRzIHdpbmRvdyBoYXMgdGhlIGZvY3VzLgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEobUNvbnRleHQgaW5zdGFuY2VvZiBBY3Rpdml0eSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgISgoQWN0aXZpdHkpIG1Db250ZXh0KS5oYXNXaW5kb3dGb2N1cygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzLmNhbmNlbCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcy5zZXRSZWFkeSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIG0gPSBtQ29udGV4dC5nZXRTdHJpbmcoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFIuc3RyaW5nLmpzX2RpYWxvZ19iZWZvcmVfdW5sb2FkLCBtZXNzYWdlKTsKICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBbGVydERpYWxvZy5CdWlsZGVyKG1Db250ZXh0KQpAQCAtNzI1LDcgKzc2NSw4IEBACiAKICAgICAgICAgICAgIGNhc2UgT1BFTl9GSUxFX0NIT09TRVI6CiAgICAgICAgICAgICAgICAgaWYgKG1XZWJDaHJvbWVDbGllbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtV2ViQ2hyb21lQ2xpZW50Lm9wZW5GaWxlQ2hvb3NlcigoVXBsb2FkRmlsZSkgbXNnLm9iaik7CisgICAgICAgICAgICAgICAgICAgIFVwbG9hZEZpbGVNZXNzYWdlRGF0YSBkYXRhID0gKFVwbG9hZEZpbGVNZXNzYWdlRGF0YSltc2cub2JqOworICAgICAgICAgICAgICAgICAgICBtV2ViQ2hyb21lQ2xpZW50Lm9wZW5GaWxlQ2hvb3NlcihkYXRhLmdldFVwbG9hZEZpbGUoKSwgZGF0YS5nZXRBY2NlcHRUeXBlKCkpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKIApAQCAtMTA4NywxMCArMTEyOCwxNSBAQAogICAgIHB1YmxpYyB2b2lkIG9uUHJvZ3Jlc3NDaGFuZ2VkKGludCBuZXdQcm9ncmVzcykgewogICAgICAgICAvLyBTeW5jaHJvbml6ZSBzbyB0aGF0IG1MYXRlc3RQcm9ncmVzcyBpcyB1cC10by1kYXRlLgogICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLSAgICAgICAgICAgIGlmIChtV2ViQ2hyb21lQ2xpZW50ID09IG51bGwgfHwgbUxhdGVzdFByb2dyZXNzID09IG5ld1Byb2dyZXNzKSB7CisgICAgICAgICAgICAvLyB1cGRhdGUgbUxhdGVzdFByb2dyZXNzIGV2ZW4gbVdlYkNocm9tZUNsaWVudCBpcyBudWxsIGFzCisgICAgICAgICAgICAvLyBXZWJWaWV3LmdldFByb2dyZXNzKCkgbmVlZHMgaXQKKyAgICAgICAgICAgIGlmIChtTGF0ZXN0UHJvZ3Jlc3MgPT0gbmV3UHJvZ3Jlc3MpIHsKICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBtTGF0ZXN0UHJvZ3Jlc3MgPSBuZXdQcm9ncmVzczsKKyAgICAgICAgICAgIGlmIChtV2ViQ2hyb21lQ2xpZW50ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoIW1Qcm9ncmVzc1VwZGF0ZVBlbmRpbmcpIHsKICAgICAgICAgICAgICAgICBzZW5kRW1wdHlNZXNzYWdlKFBST0dSRVNTKTsKICAgICAgICAgICAgICAgICBtUHJvZ3Jlc3NVcGRhdGVQZW5kaW5nID0gdHJ1ZTsKQEAgLTEwOTgsNyArMTE0NCw3IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwdWJsaWMgV2ViVmlldyBjcmVhdGVXaW5kb3coYm9vbGVhbiBkaWFsb2csIGJvb2xlYW4gdXNlckdlc3R1cmUpIHsKKyAgICBwdWJsaWMgQnJvd3NlckZyYW1lIGNyZWF0ZVdpbmRvdyhib29sZWFuIGRpYWxvZywgYm9vbGVhbiB1c2VyR2VzdHVyZSkgewogICAgICAgICAvLyBEbyBhbiB1bnN5bmNocm9uaXplZCBxdWljayBjaGVjayB0byBhdm9pZCBwb3N0aW5nIGlmIG5vIGNhbGxiYWNrIGhhcwogICAgICAgICAvLyBiZWVuIHNldC4KICAgICAgICAgaWYgKG1XZWJDaHJvbWVDbGllbnQgPT0gbnVsbCkgewpAQCAtMTEyMiw5ICsxMTY4LDE1IEBACiAKICAgICAgICAgV2ViVmlldyB3ID0gdHJhbnNwb3J0LmdldFdlYlZpZXcoKTsKICAgICAgICAgaWYgKHcgIT0gbnVsbCkgewotICAgICAgICAgICAgdy5nZXRXZWJWaWV3Q29yZSgpLmluaXRpYWxpemVTdWJ3aW5kb3coKTsKKyAgICAgICAgICAgIFdlYlZpZXdDb3JlIGNvcmUgPSB3LmdldFdlYlZpZXdDb3JlKCk7CisgICAgICAgICAgICAvLyBJZiBXZWJWaWV3LmRlc3Ryb3koKSBoYXMgYmVlbiBjYWxsZWQsIGNvcmUgbWF5IGJlIG51bGwuICBTa2lwCisgICAgICAgICAgICAvLyBpbml0aWFsaXphdGlvbiBpbiB0aGF0IGNhc2UgYW5kIHJldHVybiBudWxsLgorICAgICAgICAgICAgaWYgKGNvcmUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGNvcmUuaW5pdGlhbGl6ZVN1YndpbmRvdygpOworICAgICAgICAgICAgICAgIHJldHVybiBjb3JlLmdldEJyb3dzZXJGcmFtZSgpOworICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIHJldHVybiB3OworICAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBvblJlcXVlc3RGb2N1cygpIHsKQEAgLTE0MjYsNiArMTQ3OCwyNCBAQAogICAgICAgICBzZW5kTWVzc2FnZShtc2cpOwogICAgIH0KIAorICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFVwbG9hZEZpbGVNZXNzYWdlRGF0YSB7CisgICAgICAgIHByaXZhdGUgVXBsb2FkRmlsZSBtQ2FsbGJhY2s7CisgICAgICAgIHByaXZhdGUgU3RyaW5nIG1BY2NlcHRUeXBlOworCisgICAgICAgIHB1YmxpYyBVcGxvYWRGaWxlTWVzc2FnZURhdGEoVXBsb2FkRmlsZSB1cGxvYWRGaWxlLCBTdHJpbmcgYWNjZXB0VHlwZSkgeworICAgICAgICAgICAgbUNhbGxiYWNrID0gdXBsb2FkRmlsZTsKKyAgICAgICAgICAgIG1BY2NlcHRUeXBlID0gYWNjZXB0VHlwZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBVcGxvYWRGaWxlIGdldFVwbG9hZEZpbGUoKSB7CisgICAgICAgICAgICByZXR1cm4gbUNhbGxiYWNrOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRBY2NlcHRUeXBlKCkgeworICAgICAgICAgICAgcmV0dXJuIG1BY2NlcHRUeXBlOworICAgICAgICB9CisgICAgfQorCiAgICAgcHJpdmF0ZSBjbGFzcyBVcGxvYWRGaWxlIGltcGxlbWVudHMgVmFsdWVDYWxsYmFjazxVcmk+IHsKICAgICAgICAgcHJpdmF0ZSBVcmkgbVZhbHVlOwogICAgICAgICBwdWJsaWMgdm9pZCBvblJlY2VpdmVWYWx1ZShVcmkgdmFsdWUpIHsKQEAgLTE0NDIsMTMgKzE1MTIsMTQgQEAKICAgICAvKioKICAgICAgKiBDYWxsZWQgYnkgV2ViVmlld0NvcmUgdG8gb3BlbiBhIGZpbGUgY2hvb3Nlci4KICAgICAgKi8KLSAgICAvKiBwYWNrYWdlICovIFVyaSBvcGVuRmlsZUNob29zZXIoKSB7CisgICAgLyogcGFja2FnZSAqLyBVcmkgb3BlbkZpbGVDaG9vc2VyKFN0cmluZyBhY2NlcHRUeXBlKSB7CiAgICAgICAgIGlmIChtV2ViQ2hyb21lQ2xpZW50ID09IG51bGwpIHsKICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICB9CiAgICAgICAgIE1lc3NhZ2UgbXlNZXNzYWdlID0gb2J0YWluTWVzc2FnZShPUEVOX0ZJTEVfQ0hPT1NFUik7CiAgICAgICAgIFVwbG9hZEZpbGUgdXBsb2FkRmlsZSA9IG5ldyBVcGxvYWRGaWxlKCk7Ci0gICAgICAgIG15TWVzc2FnZS5vYmogPSB1cGxvYWRGaWxlOworICAgICAgICBVcGxvYWRGaWxlTWVzc2FnZURhdGEgZGF0YSA9IG5ldyBVcGxvYWRGaWxlTWVzc2FnZURhdGEodXBsb2FkRmlsZSwgYWNjZXB0VHlwZSk7CisgICAgICAgIG15TWVzc2FnZS5vYmogPSBkYXRhOwogICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKICAgICAgICAgICAgIHNlbmRNZXNzYWdlKG15TWVzc2FnZSk7CiAgICAgICAgICAgICB0cnkgewpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L0dlb2xvY2F0aW9uU2VydmljZS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L0dlb2xvY2F0aW9uU2VydmljZS5qYXZhCmluZGV4IDI0MzA2ZjQuLjE4M2IzYzAgMTAwNzU1Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9HZW9sb2NhdGlvblNlcnZpY2UuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvR2VvbG9jYXRpb25TZXJ2aWNlLmphdmEKQEAgLTYyLDkgKzYyLDEwIEBACiAgICAgLyoqCiAgICAgICogU3RhcnQgbGlzdGVuaW5nIGZvciBsb2NhdGlvbiB1cGRhdGVzLgogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHN0YXJ0KCkgeworICAgIHB1YmxpYyBib29sZWFuIHN0YXJ0KCkgewogICAgICAgICByZWdpc3RlckZvckxvY2F0aW9uVXBkYXRlcygpOwogICAgICAgICBtSXNSdW5uaW5nID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIG1Jc05ldHdvcmtQcm92aWRlckF2YWlsYWJsZSB8fCBtSXNHcHNQcm92aWRlckF2YWlsYWJsZTsKICAgICB9CiAKICAgICAvKioKQEAgLTg3LDYgKzg4LDggQEAKICAgICAgICAgICAgICAgICAvLyBvbmx5IHVucmVnaXN0ZXIgZnJvbSBhbGwsIHRoZW4gcmVyZWdpc3RlciB3aXRoIGFsbCBidXQgdGhlIEdQUy4KICAgICAgICAgICAgICAgICB1bnJlZ2lzdGVyRnJvbUxvY2F0aW9uVXBkYXRlcygpOwogICAgICAgICAgICAgICAgIHJlZ2lzdGVyRm9yTG9jYXRpb25VcGRhdGVzKCk7CisgICAgICAgICAgICAgICAgLy8gQ2hlY2sgdGhhdCB0aGUgcHJvdmlkZXJzIGFyZSBzdGlsbCBhdmFpbGFibGUgYWZ0ZXIgd2UgcmUtcmVnaXN0ZXIuCisgICAgICAgICAgICAgICAgbWF5YmVSZXBvcnRFcnJvcigiVGhlIGxhc3QgbG9jYXRpb24gcHJvdmlkZXIgaXMgbm8gbG9uZ2VyIGF2YWlsYWJsZSIpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtMTU2LDExICsxNTksMTYgQEAKICAgICAgKi8KICAgICBwcml2YXRlIHZvaWQgcmVnaXN0ZXJGb3JMb2NhdGlvblVwZGF0ZXMoKSB7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBtTG9jYXRpb25NYW5hZ2VyLnJlcXVlc3RMb2NhdGlvblVwZGF0ZXMoTG9jYXRpb25NYW5hZ2VyLk5FVFdPUktfUFJPVklERVIsIDAsIDAsIHRoaXMpOwotICAgICAgICAgICAgbUlzTmV0d29ya1Byb3ZpZGVyQXZhaWxhYmxlID0gdHJ1ZTsKKyAgICAgICAgICAgIC8vIFJlZ2lzdHJhdGlvbiBtYXkgZmFpbCBpZiBwcm92aWRlcnMgYXJlIG5vdCBwcmVzZW50IG9uIHRoZSBkZXZpY2UuCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1Mb2NhdGlvbk1hbmFnZXIucmVxdWVzdExvY2F0aW9uVXBkYXRlcyhMb2NhdGlvbk1hbmFnZXIuTkVUV09SS19QUk9WSURFUiwgMCwgMCwgdGhpcyk7CisgICAgICAgICAgICAgICAgbUlzTmV0d29ya1Byb3ZpZGVyQXZhaWxhYmxlID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gY2F0Y2goSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsgfQogICAgICAgICAgICAgaWYgKG1Jc0dwc0VuYWJsZWQpIHsKLSAgICAgICAgICAgICAgICBtTG9jYXRpb25NYW5hZ2VyLnJlcXVlc3RMb2NhdGlvblVwZGF0ZXMoTG9jYXRpb25NYW5hZ2VyLkdQU19QUk9WSURFUiwgMCwgMCwgdGhpcyk7Ci0gICAgICAgICAgICAgICAgbUlzR3BzUHJvdmlkZXJBdmFpbGFibGUgPSB0cnVlOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIG1Mb2NhdGlvbk1hbmFnZXIucmVxdWVzdExvY2F0aW9uVXBkYXRlcyhMb2NhdGlvbk1hbmFnZXIuR1BTX1BST1ZJREVSLCAwLCAwLCB0aGlzKTsKKyAgICAgICAgICAgICAgICAgICAgbUlzR3BzUHJvdmlkZXJBdmFpbGFibGUgPSB0cnVlOworICAgICAgICAgICAgICAgIH0gY2F0Y2goSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsgfQogICAgICAgICAgICAgfQogICAgICAgICB9IGNhdGNoKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIExvZy5lKFRBRywgIkNhdWdodCBzZWN1cml0eSBleGNlcHRpb24gcmVnaXN0ZXJpbmcgZm9yIGxvY2F0aW9uIHVwZGF0ZXMgZnJvbSBzeXN0ZW0uICIgKwpAQCAtMTczLDYgKzE4MSw4IEBACiAgICAgICovCiAgICAgcHJpdmF0ZSB2b2lkIHVucmVnaXN0ZXJGcm9tTG9jYXRpb25VcGRhdGVzKCkgewogICAgICAgICBtTG9jYXRpb25NYW5hZ2VyLnJlbW92ZVVwZGF0ZXModGhpcyk7CisgICAgICAgIG1Jc05ldHdvcmtQcm92aWRlckF2YWlsYWJsZSA9IGZhbHNlOworICAgICAgICBtSXNHcHNQcm92aWRlckF2YWlsYWJsZSA9IGZhbHNlOwogICAgIH0KIAogICAgIC8qKgpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L0hUTUw1QXVkaW8uamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9IVE1MNUF1ZGlvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDI5Mjg4MQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9IVE1MNUF1ZGlvLmphdmEKQEAgLTAsMCArMSwyMjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQud2Via2l0OworCitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXllcjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyLk9uQnVmZmVyaW5nVXBkYXRlTGlzdGVuZXI7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXllci5PbkNvbXBsZXRpb25MaXN0ZW5lcjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyLk9uRXJyb3JMaXN0ZW5lcjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyLk9uUHJlcGFyZWRMaXN0ZW5lcjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyLk9uU2Vla0NvbXBsZXRlTGlzdGVuZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuVGltZXI7CitpbXBvcnQgamF2YS51dGlsLlRpbWVyVGFzazsKKworLyoqCisgKiA8cD5IVE1MNSBzdXBwb3J0IGNsYXNzIGZvciBBdWRpby4KKyAqLworY2xhc3MgSFRNTDVBdWRpbyBleHRlbmRzIEhhbmRsZXIKKyAgICAgICAgICAgICAgICAgaW1wbGVtZW50cyBNZWRpYVBsYXllci5PbkJ1ZmZlcmluZ1VwZGF0ZUxpc3RlbmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhUGxheWVyLk9uQ29tcGxldGlvbkxpc3RlbmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhUGxheWVyLk9uRXJyb3JMaXN0ZW5lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVBsYXllci5PblByZXBhcmVkTGlzdGVuZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFQbGF5ZXIuT25TZWVrQ29tcGxldGVMaXN0ZW5lciB7CisgICAgLy8gTG9nZ2luZyB0YWcuCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR1RBRyA9ICJIVE1MNUF1ZGlvIjsKKworICAgIHByaXZhdGUgTWVkaWFQbGF5ZXIgbU1lZGlhUGxheWVyOworCisgICAgLy8gVGhlIEMrKyBNZWRpYVBsYXllclByaXZhdGVBbmRyb2lkIG9iamVjdC4KKyAgICBwcml2YXRlIGludCBtTmF0aXZlUG9pbnRlcjsKKworICAgIHByaXZhdGUgc3RhdGljIGludCBJRExFICAgICAgICA9ICAwOworICAgIHByaXZhdGUgc3RhdGljIGludCBJTklUSUFMSVpFRCA9ICAxOworICAgIHByaXZhdGUgc3RhdGljIGludCBQUkVQQVJFRCAgICA9ICAyOworICAgIHByaXZhdGUgc3RhdGljIGludCBTVEFSVEVEICAgICA9ICA0OworICAgIHByaXZhdGUgc3RhdGljIGludCBDT01QTEVURSAgICA9ICA1OworICAgIHByaXZhdGUgc3RhdGljIGludCBQQVVTRUQgICAgICA9ICA2OworICAgIHByaXZhdGUgc3RhdGljIGludCBTVE9QUEVEICAgICA9IC0yOworICAgIHByaXZhdGUgc3RhdGljIGludCBFUlJPUiAgICAgICA9IC0xOworCisgICAgcHJpdmF0ZSBpbnQgbVN0YXRlID0gSURMRTsKKworICAgIHByaXZhdGUgU3RyaW5nIG1Vcmw7CisgICAgcHJpdmF0ZSBib29sZWFuIG1Bc2tUb1BsYXkgPSBmYWxzZTsKKworICAgIC8vIFRpbWVyIHRocmVhZCAtPiBVSSB0aHJlYWQKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVElNRVVQREFURSA9IDEwMDsKKworICAgIC8vIFRoZSBzcGVjIHNheXMgdGhlIHRpbWVyIHNob3VsZCBmaXJlIGV2ZXJ5IDI1MCBtcyBvciBsZXNzLgorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUSU1FVVBEQVRFX1BFUklPRCA9IDI1MDsgIC8vIG1zCisgICAgLy8gVGhlIHRpbWVyIGZvciB0aW1ldXBhdGUgZXZlbnRzLgorICAgIC8vIFNlZSBodHRwOi8vd3d3LndoYXR3Zy5vcmcvc3BlY3Mvd2ViLWFwcHMvY3VycmVudC13b3JrLyNldmVudC1tZWRpYS10aW1ldXBkYXRlCisgICAgcHJpdmF0ZSBUaW1lciBtVGltZXI7CisgICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBUaW1ldXBkYXRlVGFzayBleHRlbmRzIFRpbWVyVGFzayB7CisgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgIEhUTUw1QXVkaW8udGhpcy5vYnRhaW5NZXNzYWdlKFRJTUVVUERBVEUpLnNlbmRUb1RhcmdldCgpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZShNZXNzYWdlIG1zZykgeworICAgICAgICBzd2l0Y2ggKG1zZy53aGF0KSB7CisgICAgICAgICAgICBjYXNlIFRJTUVVUERBVEU6IHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBpZiAobVN0YXRlICE9IEVSUk9SICYmIG1NZWRpYVBsYXllci5pc1BsYXlpbmcoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBvc2l0aW9uID0gbU1lZGlhUGxheWVyLmdldEN1cnJlbnRQb3NpdGlvbigpOworICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlT25UaW1ldXBkYXRlKHBvc2l0aW9uLCBtTmF0aXZlUG9pbnRlcik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBtU3RhdGUgPSBFUlJPUjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBldmVudCBsaXN0ZW5lcnMgZm9yIE1lZGlhUGxheWVyCisgICAgLy8gVGhvc2UgYXJlIGNhbGxlZCBmcm9tIHRoZSBzYW1lIHRocmVhZCB3ZSBjcmVhdGVkIHRoZSBNZWRpYVBsYXllcgorICAgIC8vIChpLmUuIHRoZSB3ZWJ2aWV3Y29yZSB0aHJlYWQgaGVyZSkKKworICAgIC8vIE1lZGlhUGxheWVyLk9uQnVmZmVyaW5nVXBkYXRlTGlzdGVuZXIKKyAgICBwdWJsaWMgdm9pZCBvbkJ1ZmZlcmluZ1VwZGF0ZShNZWRpYVBsYXllciBtcCwgaW50IHBlcmNlbnQpIHsKKyAgICAgICAgbmF0aXZlT25CdWZmZXJpbmcocGVyY2VudCwgbU5hdGl2ZVBvaW50ZXIpOworICAgIH0KKworICAgIC8vIE1lZGlhUGxheWVyLk9uQ29tcGxldGlvbkxpc3RlbmVyOworICAgIHB1YmxpYyB2b2lkIG9uQ29tcGxldGlvbihNZWRpYVBsYXllciBtcCkgeworICAgICAgICByZXNldE1lZGlhUGxheWVyKCk7CisgICAgICAgIG1TdGF0ZSA9IElETEU7CisgICAgICAgIG5hdGl2ZU9uRW5kZWQobU5hdGl2ZVBvaW50ZXIpOworICAgIH0KKworICAgIC8vIE1lZGlhUGxheWVyLk9uRXJyb3JMaXN0ZW5lcgorICAgIHB1YmxpYyBib29sZWFuIG9uRXJyb3IoTWVkaWFQbGF5ZXIgbXAsIGludCB3aGF0LCBpbnQgZXh0cmEpIHsKKyAgICAgICAgbVN0YXRlID0gRVJST1I7CisgICAgICAgIHJlc2V0TWVkaWFQbGF5ZXIoKTsKKyAgICAgICAgbVN0YXRlID0gSURMRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIE1lZGlhUGxheWVyLk9uUHJlcGFyZWRMaXN0ZW5lcgorICAgIHB1YmxpYyB2b2lkIG9uUHJlcGFyZWQoTWVkaWFQbGF5ZXIgbXApIHsKKyAgICAgICAgbVN0YXRlID0gUFJFUEFSRUQ7CisgICAgICAgIGlmIChtVGltZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgbVRpbWVyLnNjaGVkdWxlKG5ldyBUaW1ldXBkYXRlVGFzaygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJTUVVUERBVEVfUEVSSU9ELCBUSU1FVVBEQVRFX1BFUklPRCk7CisgICAgICAgIH0KKyAgICAgICAgbmF0aXZlT25QcmVwYXJlZChtcC5nZXREdXJhdGlvbigpLCAwLCAwLCBtTmF0aXZlUG9pbnRlcik7CisgICAgICAgIGlmIChtQXNrVG9QbGF5KSB7CisgICAgICAgICAgICBtQXNrVG9QbGF5ID0gZmFsc2U7CisgICAgICAgICAgICBwbGF5KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBNZWRpYVBsYXllci5PblNlZWtDb21wbGV0ZUxpc3RlbmVyCisgICAgcHVibGljIHZvaWQgb25TZWVrQ29tcGxldGUoTWVkaWFQbGF5ZXIgbXApIHsKKyAgICAgICAgbmF0aXZlT25UaW1ldXBkYXRlKG1wLmdldEN1cnJlbnRQb3NpdGlvbigpLCBtTmF0aXZlUG9pbnRlcik7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gbmF0aXZlUHRyIGlzIHRoZSBDKysgcG9pbnRlciB0byB0aGUgTWVkaWFQbGF5ZXJQcml2YXRlIG9iamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgSFRNTDVBdWRpbyhpbnQgbmF0aXZlUHRyKSB7CisgICAgICAgIC8vIFNhdmUgdGhlIG5hdGl2ZSBwdHIKKyAgICAgICAgbU5hdGl2ZVBvaW50ZXIgPSBuYXRpdmVQdHI7CisgICAgICAgIHJlc2V0TWVkaWFQbGF5ZXIoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcmVzZXRNZWRpYVBsYXllcigpIHsKKyAgICAgICAgaWYgKG1NZWRpYVBsYXllciA9PSBudWxsKSB7CisgICAgICAgICAgICBtTWVkaWFQbGF5ZXIgPSBuZXcgTWVkaWFQbGF5ZXIoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1NZWRpYVBsYXllci5yZXNldCgpOworICAgICAgICB9CisgICAgICAgIG1NZWRpYVBsYXllci5zZXRPbkJ1ZmZlcmluZ1VwZGF0ZUxpc3RlbmVyKHRoaXMpOworICAgICAgICBtTWVkaWFQbGF5ZXIuc2V0T25Db21wbGV0aW9uTGlzdGVuZXIodGhpcyk7CisgICAgICAgIG1NZWRpYVBsYXllci5zZXRPbkVycm9yTGlzdGVuZXIodGhpcyk7CisgICAgICAgIG1NZWRpYVBsYXllci5zZXRPblByZXBhcmVkTGlzdGVuZXIodGhpcyk7CisgICAgICAgIG1NZWRpYVBsYXllci5zZXRPblNlZWtDb21wbGV0ZUxpc3RlbmVyKHRoaXMpOworCisgICAgICAgIGlmIChtVGltZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgbVRpbWVyLmNhbmNlbCgpOworICAgICAgICB9CisgICAgICAgIG1UaW1lciA9IG5ldyBUaW1lcigpOworICAgICAgICBtU3RhdGUgPSBJRExFOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzZXREYXRhU291cmNlKFN0cmluZyB1cmwpIHsKKyAgICAgICAgbVVybCA9IHVybDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChtU3RhdGUgIT0gSURMRSkgeworICAgICAgICAgICAgICAgIHJlc2V0TWVkaWFQbGF5ZXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1NZWRpYVBsYXllci5zZXREYXRhU291cmNlKHVybCk7CisgICAgICAgICAgICBtU3RhdGUgPSBJTklUSUFMSVpFRDsKKyAgICAgICAgICAgIG1NZWRpYVBsYXllci5wcmVwYXJlQXN5bmMoKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoTE9HVEFHLCAiY291bGRuJ3QgbG9hZCB0aGUgcmVzb3VyY2U6ICIgKyB1cmwgKyAiIGV4YzogIiArIGUpOworICAgICAgICAgICAgcmVzZXRNZWRpYVBsYXllcigpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHBsYXkoKSB7CisgICAgICAgIGlmICgobVN0YXRlID09IEVSUk9SIHx8IG1TdGF0ZSA9PSBJRExFKSAmJiBtVXJsICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJlc2V0TWVkaWFQbGF5ZXIoKTsKKyAgICAgICAgICAgIHNldERhdGFTb3VyY2UobVVybCk7CisgICAgICAgICAgICBtQXNrVG9QbGF5ID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtU3RhdGUgPj0gUFJFUEFSRUQpIHsKKyAgICAgICAgICAgIG1NZWRpYVBsYXllci5zdGFydCgpOworICAgICAgICAgICAgbVN0YXRlID0gU1RBUlRFRDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBwYXVzZSgpIHsKKyAgICAgICAgaWYgKG1TdGF0ZSA9PSBTVEFSVEVEKSB7CisgICAgICAgICAgICBpZiAobVRpbWVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtVGltZXIucHVyZ2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1NZWRpYVBsYXllci5wYXVzZSgpOworICAgICAgICAgICAgbVN0YXRlID0gUEFVU0VEOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNlZWsoaW50IG1zZWMpIHsKKyAgICAgICAgaWYgKG1TdGF0ZSA+PSBQUkVQQVJFRCkgeworICAgICAgICAgICAgbU1lZGlhUGxheWVyLnNlZWtUbyhtc2VjKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZWFyZG93bigpIHsKKyAgICAgICAgbU1lZGlhUGxheWVyLnJlbGVhc2UoKTsKKyAgICAgICAgbVN0YXRlID0gRVJST1I7CisgICAgICAgIG1OYXRpdmVQb2ludGVyID0gMDsKKyAgICB9CisKKyAgICBwcml2YXRlIGZsb2F0IGdldE1heFRpbWVTZWVrYWJsZSgpIHsKKyAgICAgICAgcmV0dXJuIG1NZWRpYVBsYXllci5nZXREdXJhdGlvbigpIC8gMTAwMC4wZjsKKyAgICB9CisKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5hdGl2ZU9uQnVmZmVyaW5nKGludCBwZXJjZW50LCBpbnQgbmF0aXZlUG9pbnRlcik7CisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuYXRpdmVPbkVuZGVkKGludCBuYXRpdmVQb2ludGVyKTsKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5hdGl2ZU9uUHJlcGFyZWQoaW50IGR1cmF0aW9uLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBuYXRpdmVQb2ludGVyKTsKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5hdGl2ZU9uVGltZXVwZGF0ZShpbnQgcG9zaXRpb24sIGludCBuYXRpdmVQb2ludGVyKTsKK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9KV2ViQ29yZUphdmFCcmlkZ2UuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9KV2ViQ29yZUphdmFCcmlkZ2UuamF2YQppbmRleCBlNzY2NjkzLi5lY2FkMjYxIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvSldlYkNvcmVKYXZhQnJpZGdlLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L0pXZWJDb3JlSmF2YUJyaWRnZS5qYXZhCkBAIC0xNiwxMCArMTYsMTIgQEAKIAogcGFja2FnZSBhbmRyb2lkLndlYmtpdDsKIAoraW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKIGltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiAKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuU2V0OwogCiBmaW5hbCBjbGFzcyBKV2ViQ29yZUphdmFCcmlkZ2UgZXh0ZW5kcyBIYW5kbGVyIHsKQEAgLTQ5LDEyICs1MSwxNSBAQAogICAgIC8qIHBhY2thZ2UgKi8KICAgICBzdGF0aWMgZmluYWwgaW50IFJFRlJFU0hfUExVR0lOUyA9IDEwMDsKIAorICAgIHByaXZhdGUgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4gbUNvbnRlbnRVcmlUb0ZpbGVQYXRoTWFwOworCiAgICAgLyoqCiAgICAgICogQ29uc3RydWN0IGEgbmV3IEpXZWJDb3JlSmF2YUJyaWRnZSB0byBpbnRlcmZhY2Ugd2l0aAogICAgICAqIFdlYkNvcmUgdGltZXJzIGFuZCBjb29raWVzLgogICAgICAqLwogICAgIHB1YmxpYyBKV2ViQ29yZUphdmFCcmlkZ2UoKSB7CiAgICAgICAgIG5hdGl2ZUNvbnN0cnVjdG9yKCk7CisKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTI2Nyw2ICsyNzIsMjggQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIC8vIENhbGxlZCBvbiB0aGUgV2ViQ29yZSB0aHJlYWQgdGhyb3VnaCBKTkkuCisgICAgcHJpdmF0ZSBTdHJpbmcgcmVzb2x2ZUZpbGVQYXRoRm9yQ29udGVudFVyaShTdHJpbmcgdXJpKSB7CisgICAgICAgIGlmIChtQ29udGVudFVyaVRvRmlsZVBhdGhNYXAgIT0gbnVsbCkgeworICAgICAgICAgICAgU3RyaW5nIGZpbGVOYW1lID0gbUNvbnRlbnRVcmlUb0ZpbGVQYXRoTWFwLmdldCh1cmkpOworICAgICAgICAgICAgaWYgKGZpbGVOYW1lICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmlsZU5hbWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBGYWlsc2FmZSBmYWxsYmFjayB0byBqdXN0IHVzZSB0aGUgbGFzdCBwYXRoIHNlZ21lbnQuCisgICAgICAgIC8vIChTZWUgT3BlbmFibGVDb2x1bW5zIGRvY3VtZW50YXRpb24gaW4gdGhlIFNESykKKyAgICAgICAgVXJpIGpVcmkgPSBVcmkucGFyc2UodXJpKTsKKyAgICAgICAgcmV0dXJuIGpVcmkuZ2V0TGFzdFBhdGhTZWdtZW50KCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc3RvcmVGaWxlUGF0aEZvckNvbnRlbnRVcmkoU3RyaW5nIHBhdGgsIFN0cmluZyBjb250ZW50VXJpKSB7CisgICAgICAgIGlmIChtQ29udGVudFVyaVRvRmlsZVBhdGhNYXAgPT0gbnVsbCkgeworICAgICAgICAgICAgbUNvbnRlbnRVcmlUb0ZpbGVQYXRoTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CisgICAgICAgIH0KKyAgICAgICAgbUNvbnRlbnRVcmlUb0ZpbGVQYXRoTWFwLnB1dChjb250ZW50VXJpLCBwYXRoKTsKKyAgICB9CisKICAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5hdGl2ZUNvbnN0cnVjdG9yKCk7CiAgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuYXRpdmVGaW5hbGl6ZSgpOwogICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgc2hhcmVkVGltZXJGaXJlZCgpOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L05ldHdvcmsuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9OZXR3b3JrLmphdmEKaW5kZXggNTk4ZjIwZC4uMGYwMzI1OCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L05ldHdvcmsuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvTmV0d29yay5qYXZhCkBAIC0xNiw3ICsxNiwxMiBAQAogCiBwYWNrYWdlIGFuZHJvaWQud2Via2l0OwogCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkJyb2FkY2FzdFJlY2VpdmVyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudEZpbHRlcjsKK2ltcG9ydCBhbmRyb2lkLm5ldC5Db25uZWN0aXZpdHlNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQubmV0Lk5ldHdvcmtJbmZvOwogaW1wb3J0IGFuZHJvaWQubmV0Lmh0dHAuKjsKIGltcG9ydCBhbmRyb2lkLm9zLio7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKQEAgLTc2LDYgKzgxLDE5IEBACiAgICAgICovCiAgICAgcHJpdmF0ZSBIdHRwQXV0aEhhbmRsZXIgbUh0dHBBdXRoSGFuZGxlcjsKIAorICAgIHByaXZhdGUgQ29udGV4dCBtQ29udGV4dDsKKworICAgIC8qKgorICAgICAqIFRydWUgaWYgdGhlIGN1cnJlbnRseSB1c2VkIG5ldHdvcmsgY29ubmVjdGlvbiBpcyBhIHJvYW1pbmcgcGhvbmUKKyAgICAgKiBjb25uZWN0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBtUm9hbWluZzsKKworICAgIC8qKgorICAgICAqIFRyYWNrcyBpZiB3ZSBhcmUgcm9hbWluZy4KKyAgICAgKi8KKyAgICBwcml2YXRlIFJvYW1pbmdNb25pdG9yIG1Sb2FtaW5nTW9uaXRvcjsKKwogICAgIC8qKgogICAgICAqIEByZXR1cm4gVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgbmV0d29yay4KICAgICAgKi8KQEAgLTEwNyw2ICsxMjUsNyBAQAogICAgICAgICBpZiAoKytzUGxhdGZvcm1Ob3RpZmljYXRpb25FbmFibGVSZWZDb3VudCA9PSAxKSB7CiAgICAgICAgICAgICBpZiAoc05ldHdvcmsgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIHNOZXR3b3JrLm1SZXF1ZXN0UXVldWUuZW5hYmxlUGxhdGZvcm1Ob3RpZmljYXRpb25zKCk7CisgICAgICAgICAgICAgICAgc05ldHdvcmsubW9uaXRvclJvYW1pbmcoKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgc1BsYXRmb3JtTm90aWZpY2F0aW9ucyA9IHRydWU7CiAgICAgICAgICAgICB9CkBAIC0xMjEsNiArMTQwLDcgQEAKICAgICAgICAgaWYgKC0tc1BsYXRmb3JtTm90aWZpY2F0aW9uRW5hYmxlUmVmQ291bnQgPT0gMCkgewogICAgICAgICAgICAgaWYgKHNOZXR3b3JrICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICBzTmV0d29yay5tUmVxdWVzdFF1ZXVlLmRpc2FibGVQbGF0Zm9ybU5vdGlmaWNhdGlvbnMoKTsKKyAgICAgICAgICAgICAgICBzTmV0d29yay5zdG9wTW9uaXRvcmluZ1JvYW1pbmcoKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgc1BsYXRmb3JtTm90aWZpY2F0aW9ucyA9IGZhbHNlOwogICAgICAgICAgICAgfQpAQCAtMTM2LDEyICsxNTYsMzkgQEAKICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKFRocmVhZC5jdXJyZW50VGhyZWFkKCkuCiAgICAgICAgICAgICAgICAgICAgIGdldE5hbWUoKS5lcXVhbHMoV2ViVmlld0NvcmUuVEhSRUFEX05BTUUpKTsKICAgICAgICAgfQorICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7CiAgICAgICAgIG1Tc2xFcnJvckhhbmRsZXIgPSBuZXcgU3NsRXJyb3JIYW5kbGVyKCk7CiAgICAgICAgIG1IdHRwQXV0aEhhbmRsZXIgPSBuZXcgSHR0cEF1dGhIYW5kbGVyKHRoaXMpOwogCiAgICAgICAgIG1SZXF1ZXN0UXVldWUgPSBuZXcgUmVxdWVzdFF1ZXVlKGNvbnRleHQpOwogICAgIH0KIAorICAgIHByaXZhdGUgY2xhc3MgUm9hbWluZ01vbml0b3IgZXh0ZW5kcyBCcm9hZGNhc3RSZWNlaXZlciB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblJlY2VpdmUoQ29udGV4dCBjb250ZXh0LCBJbnRlbnQgaW50ZW50KSB7CisgICAgICAgICAgICBpZiAoIUNvbm5lY3Rpdml0eU1hbmFnZXIuQ09OTkVDVElWSVRZX0FDVElPTi5lcXVhbHMoaW50ZW50LmdldEFjdGlvbigpKSkKKyAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgIE5ldHdvcmtJbmZvIGluZm8gPSAoTmV0d29ya0luZm8paW50ZW50LmdldFBhcmNlbGFibGVFeHRyYShDb25uZWN0aXZpdHlNYW5hZ2VyLkVYVFJBX05FVFdPUktfSU5GTyk7CisgICAgICAgICAgICBpZiAoaW5mbyAhPSBudWxsKQorICAgICAgICAgICAgICAgIG1Sb2FtaW5nID0gaW5mby5pc1JvYW1pbmcoKTsKKyAgICAgICAgfTsKKyAgICB9OworCisgICAgcHJpdmF0ZSB2b2lkIG1vbml0b3JSb2FtaW5nKCkgeworICAgICAgICBtUm9hbWluZ01vbml0b3IgPSBuZXcgUm9hbWluZ01vbml0b3IoKTsKKyAgICAgICAgSW50ZW50RmlsdGVyIGZpbHRlciA9IG5ldyBJbnRlbnRGaWx0ZXIoKTsKKyAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihDb25uZWN0aXZpdHlNYW5hZ2VyLkNPTk5FQ1RJVklUWV9BQ1RJT04pOworICAgICAgICBtQ29udGV4dC5yZWdpc3RlclJlY2VpdmVyKHNOZXR3b3JrLm1Sb2FtaW5nTW9uaXRvciwgZmlsdGVyKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc3RvcE1vbml0b3JpbmdSb2FtaW5nKCkgeworICAgICAgICBpZiAobVJvYW1pbmdNb25pdG9yICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1Db250ZXh0LnVucmVnaXN0ZXJSZWNlaXZlcihtUm9hbWluZ01vbml0b3IpOworICAgICAgICAgICAgbVJvYW1pbmdNb25pdG9yID0gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKwogICAgIC8qKgogICAgICAqIFJlcXVlc3QgYSB1cmwgZnJvbSBlaXRoZXIgdGhlIG5ldHdvcmsgb3IgdGhlIGZpbGUgc3lzdGVtLgogICAgICAqIEBwYXJhbSB1cmwgVGhlIHVybCB0byBsb2FkLgpAQCAtMTcwLDYgKzIxNywxMSBAQAogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAKKyAgICAgICAgLy8gSWYgdGhpcyBpcyBhIHByZWZldGNoLCBhYm9ydCBpdCBpZiB3ZSdyZSByb2FtaW5nLgorICAgICAgICBpZiAobVJvYW1pbmcgJiYgaGVhZGVycy5jb250YWluc0tleSgiWC1Nb3oiKSAmJiAicHJlZmV0Y2giLmVxdWFscyhoZWFkZXJzLmdldCgiWC1Nb3oiKSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCiAgICAgICAgIC8qIEZJWE1FOiB0aGlzIGlzIGxhbWUuICBQYXNzIGFuIElucHV0U3RyZWFtIGluLCByYXRoZXIgdGhhbgogICAgICAgICAgICBtYWtpbmcgdGhpcyBsYW1lIG9uZSBoZXJlICovCiAgICAgICAgIElucHV0U3RyZWFtIGJvZHlQcm92aWRlciA9IG51bGw7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvV2ViQ2hyb21lQ2xpZW50LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvV2ViQ2hyb21lQ2xpZW50LmphdmEKaW5kZXggMWQ1YWFjNy4uZWQwNmEzYSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1dlYkNocm9tZUNsaWVudC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9XZWJDaHJvbWVDbGllbnQuamF2YQpAQCAtMzE0LDEwICszMTQsMjcgQEAKICAgICAvKioKICAgICAgKiBUZWxsIHRoZSBjbGllbnQgdG8gb3BlbiBhIGZpbGUgY2hvb3Nlci4KICAgICAgKiBAcGFyYW0gdXBsb2FkRmlsZSBBIFZhbHVlQ2FsbGJhY2sgdG8gc2V0IHRoZSBVUkkgb2YgdGhlIGZpbGUgdG8gdXBsb2FkLgotICAgICAqICAgICAgb25SZWNlaXZlVmFsdWUgbXVzdCBiZSBjYWxsZWQgdG8gd2FrZSB1cCB0aGUgdGhyZWFkLgorICAgICAqICAgICAgb25SZWNlaXZlVmFsdWUgbXVzdCBiZSBjYWxsZWQgdG8gd2FrZSB1cCB0aGUgdGhyZWFkLmEKKyAgICAgKiBAcGFyYW0gYWNjZXB0VHlwZSBUaGUgdmFsdWUgb2YgdGhlICdhY2NlcHQnIGF0dHJpYnV0ZSBvZiB0aGUgaW5wdXQgdGFnCisgICAgICogICAgICAgICBhc3NvY2lhdGVkIHdpdGggdGhpcyBmaWxlIHBpY2tlci4KICAgICAgKiBAaGlkZQogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG9wZW5GaWxlQ2hvb3NlcihWYWx1ZUNhbGxiYWNrPFVyaT4gdXBsb2FkRmlsZSkgeworICAgIHB1YmxpYyB2b2lkIG9wZW5GaWxlQ2hvb3NlcihWYWx1ZUNhbGxiYWNrPFVyaT4gdXBsb2FkRmlsZSwgU3RyaW5nIGFjY2VwdFR5cGUpIHsKICAgICAgICAgdXBsb2FkRmlsZS5vblJlY2VpdmVWYWx1ZShudWxsKTsKICAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZWxsIHRoZSBjbGllbnQgdGhhdCB0aGUgc2VsZWN0aW9uIGhhcyBiZWVuIGluaXRpYXRlZC4KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG9uU2VsZWN0aW9uU3RhcnQoKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVsbCB0aGUgY2xpZW50IHRoYXQgdGhlIHNlbGVjdGlvbiBoYXMgYmVlbiBjb3BpZWQgb3IgY2FuY2VsZWQuCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBvblNlbGVjdGlvbkRvbmUoKSB7CisgICAgfQorCiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvV2ViU2V0dGluZ3MuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9XZWJTZXR0aW5ncy5qYXZhCmluZGV4IGI3NjdmMTEuLmZhYmRhMDggMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9XZWJTZXR0aW5ncy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9XZWJTZXR0aW5ncy5qYXZhCkBAIC0xODQsNiArMTg0LDcgQEAKICAgICBwcml2YXRlIGJvb2xlYW4gICAgICAgICBtRG9tU3RvcmFnZUVuYWJsZWQgPSBmYWxzZTsKICAgICBwcml2YXRlIGJvb2xlYW4gICAgICAgICBtV29ya2Vyc0VuYWJsZWQgPSBmYWxzZTsgIC8vIG9ubHkgYWZmZWN0cyBWOC4KICAgICBwcml2YXRlIGJvb2xlYW4gICAgICAgICBtR2VvbG9jYXRpb25FbmFibGVkID0gdHJ1ZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gICAgICAgICBtWFNTQXVkaXRvckVuYWJsZWQgPSBmYWxzZTsKICAgICAvLyBIVE1MNSBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMKICAgICBwcml2YXRlIGxvbmcgICAgICAgICAgICBtQXBwQ2FjaGVNYXhTaXplID0gTG9uZy5NQVhfVkFMVUU7CiAgICAgcHJpdmF0ZSBTdHJpbmcgICAgICAgICAgbUFwcENhY2hlUGF0aCA9ICIiOwpAQCAtMjA3LDYgKzIwOCw3IEBACiAgICAgcHJpdmF0ZSBib29sZWFuICAgICAgICAgbUJ1aWx0SW5ab29tQ29udHJvbHMgPSBmYWxzZTsKICAgICBwcml2YXRlIGJvb2xlYW4gICAgICAgICBtQWxsb3dGaWxlQWNjZXNzID0gdHJ1ZTsKICAgICBwcml2YXRlIGJvb2xlYW4gICAgICAgICBtTG9hZFdpdGhPdmVydmlld01vZGUgPSBmYWxzZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gICAgICAgICBtRW5hYmxlU21vb3RoVHJhbnNpdGlvbiA9IGZhbHNlOwogCiAgICAgLy8gcHJpdmF0ZSBXZWJTZXR0aW5ncywgbm90IGFjY2Vzc2libGUgYnkgdGhlIGhvc3QgYWN0aXZpdHkKICAgICBzdGF0aWMgcHJpdmF0ZSBpbnQgICAgICBtRG91YmxlVGFwVG9hc3RDb3VudCA9IDM7CkBAIC0yOTYsMTMgKzI5OCwxMyBAQAogICAgICAgICAgICAgIk1vemlsbGEvNS4wIChNYWNpbnRvc2g7IFU7IEludGVsIE1hYyBPUyBYIDEwXzVfNzsgZW4tdXMpIgogICAgICAgICAgICAgKyAiIEFwcGxlV2ViS2l0LzUzMC4xNyAoS0hUTUwsIGxpa2UgR2Vja28pIFZlcnNpb24vNC4wIgogICAgICAgICAgICAgKyAiIFNhZmFyaS81MzAuMTciOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJUEhPTkVfVVNFUkFHRU5UID0gCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElQSE9ORV9VU0VSQUdFTlQgPQogICAgICAgICAgICAgIk1vemlsbGEvNS4wIChpUGhvbmU7IFU7IENQVSBpUGhvbmUgT1MgM18wIGxpa2UgTWFjIE9TIFg7IGVuLXVzKSIKICAgICAgICAgICAgICsgIiBBcHBsZVdlYktpdC81MjguMTggKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzQuMCIKICAgICAgICAgICAgICsgIiBNb2JpbGUvN0EzNDEgU2FmYXJpLzUyOC4xNiI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgTG9jYWxlIHNMb2NhbGU7CiAgICAgcHJpdmF0ZSBzdGF0aWMgT2JqZWN0IHNMb2NrRm9yTG9jYWxlU2V0dGluZ3M7Ci0gICAgCisKICAgICAvKioKICAgICAgKiBQYWNrYWdlIGNvbnN0cnVjdG9yIHRvIHByZXZlbnQgY2xpZW50cyBmcm9tIGNyZWF0aW5nIGEgbmV3IHNldHRpbmdzCiAgICAgICogaW5zdGFuY2UuCkBAIC0zMjcsNiArMzI5LDggQEAKICAgICAgICAgICAgICAgICBhbmRyb2lkLm9zLlByb2Nlc3MubXlVaWQoKSkgIT0gUGFja2FnZU1hbmFnZXIuUEVSTUlTU0lPTl9HUkFOVEVEOwogICAgIH0KIAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBQ0NFUFRfTEFOR19GT1JfVVNfTE9DQUxFID0gImVuLVVTIjsKKwogICAgIC8qKgogICAgICAqIExvb2tzIGF0IHNMb2NhbGUgYW5kIHJldHVybnMgY3VycmVudCBBY2NlcHRMYW5ndWFnZSBTdHJpbmcuCiAgICAgICogQHJldHVybiBDdXJyZW50IEFjY2VwdExhbmd1YWdlIFN0cmluZy4KQEAgLTMzNiwzMiArMzQwLDUzIEBACiAgICAgICAgIHN5bmNocm9uaXplZChzTG9ja0ZvckxvY2FsZVNldHRpbmdzKSB7CiAgICAgICAgICAgICBsb2NhbGUgPSBzTG9jYWxlOwogICAgICAgICB9Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBsYW5ndWFnZSA9IGxvY2FsZS5nZXRMYW5ndWFnZSgpOwotICAgICAgICBpZiAobGFuZ3VhZ2UgIT0gbnVsbCkgewotICAgICAgICAgICAgYnVmZmVyLmFwcGVuZChsYW5ndWFnZSk7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgY291bnRyeSA9IGxvY2FsZS5nZXRDb3VudHJ5KCk7Ci0gICAgICAgICAgICBpZiAoY291bnRyeSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgiLSIpOwotICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoY291bnRyeSk7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgYWRkTG9jYWxlVG9IdHRwQWNjZXB0TGFuZ3VhZ2UoYnVmZmVyLCBsb2NhbGUpOworCisgICAgICAgIGlmICghTG9jYWxlLlVTLmVxdWFscyhsb2NhbGUpKSB7CisgICAgICAgICAgICBpZiAoYnVmZmVyLmxlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoIiwgIik7CiAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFsb2NhbGUuZXF1YWxzKExvY2FsZS5VUykpIHsKLSAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoIiwgIik7Ci0gICAgICAgICAgICBqYXZhLnV0aWwuTG9jYWxlIHVzID0gTG9jYWxlLlVTOwotICAgICAgICAgICAgaWYgKHVzLmdldExhbmd1YWdlKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQodXMuZ2V0TGFuZ3VhZ2UoKSk7Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGNvdW50cnkgPSB1cy5nZXRDb3VudHJ5KCk7Ci0gICAgICAgICAgICAgICAgaWYgKGNvdW50cnkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKCItIik7Ci0gICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoY291bnRyeSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQorICAgICAgICAgICAgYnVmZmVyLmFwcGVuZChBQ0NFUFRfTEFOR19GT1JfVVNfTE9DQUxFKTsKICAgICAgICAgfQogCiAgICAgICAgIHJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKICAgICB9Ci0gICAgCisKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0IG9ic29sZXRlIGxhbmd1YWdlIGNvZGVzLCBpbmNsdWRpbmcgSGVicmV3L0luZG9uZXNpYW4vWWlkZGlzaCwKKyAgICAgKiB0byBuZXcgc3RhbmRhcmQuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGNvbnZlcnRPYnNvbGV0ZUxhbmd1YWdlQ29kZVRvTmV3KFN0cmluZyBsYW5nQ29kZSkgeworICAgICAgICBpZiAobGFuZ0NvZGUgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCJpdyIuZXF1YWxzKGxhbmdDb2RlKSkgeworICAgICAgICAgICAgLy8gSGVicmV3CisgICAgICAgICAgICByZXR1cm4gImhlIjsKKyAgICAgICAgfSBlbHNlIGlmICgiaW4iLmVxdWFscyhsYW5nQ29kZSkpIHsKKyAgICAgICAgICAgIC8vIEluZG9uZXNpYW4KKyAgICAgICAgICAgIHJldHVybiAiaWQiOworICAgICAgICB9IGVsc2UgaWYgKCJqaSIuZXF1YWxzKGxhbmdDb2RlKSkgeworICAgICAgICAgICAgLy8gWWlkZGlzaAorICAgICAgICAgICAgcmV0dXJuICJ5aSI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGxhbmdDb2RlOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgYWRkTG9jYWxlVG9IdHRwQWNjZXB0TGFuZ3VhZ2UoU3RyaW5nQnVpbGRlciBidWlsZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9jYWxlIGxvY2FsZSkgeworICAgICAgICBTdHJpbmcgbGFuZ3VhZ2UgPSBjb252ZXJ0T2Jzb2xldGVMYW5ndWFnZUNvZGVUb05ldyhsb2NhbGUuZ2V0TGFuZ3VhZ2UoKSk7CisgICAgICAgIGlmIChsYW5ndWFnZSAhPSBudWxsKSB7CisgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChsYW5ndWFnZSk7CisgICAgICAgICAgICBTdHJpbmcgY291bnRyeSA9IGxvY2FsZS5nZXRDb3VudHJ5KCk7CisgICAgICAgICAgICBpZiAoY291bnRyeSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIi0iKTsKKyAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChjb3VudHJ5KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKwogICAgIC8qKgogICAgICAqIExvb2tzIGF0IHNMb2NhbGUgYW5kIG1Db250ZXh0IGFuZCByZXR1cm5zIGN1cnJlbnQgVXNlckFnZW50IFN0cmluZy4KICAgICAgKiBAcmV0dXJuIEN1cnJlbnQgVXNlckFnZW50IFN0cmluZy4KQEAgLTM3OSwxMSArNDA0LDExIEBACiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvLyBkZWZhdWx0IHRvICIxLjAiCiAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKCIxLjAiKTsKLSAgICAgICAgfSAgCisgICAgICAgIH0KICAgICAgICAgYnVmZmVyLmFwcGVuZCgiOyAiKTsKICAgICAgICAgZmluYWwgU3RyaW5nIGxhbmd1YWdlID0gbG9jYWxlLmdldExhbmd1YWdlKCk7CiAgICAgICAgIGlmIChsYW5ndWFnZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBidWZmZXIuYXBwZW5kKGxhbmd1YWdlLnRvTG93ZXJDYXNlKCkpOworICAgICAgICAgICAgYnVmZmVyLmFwcGVuZChjb252ZXJ0T2Jzb2xldGVMYW5ndWFnZUNvZGVUb05ldyhsYW5ndWFnZSkpOwogICAgICAgICAgICAgZmluYWwgU3RyaW5nIGNvdW50cnkgPSBsb2NhbGUuZ2V0Q291bnRyeSgpOwogICAgICAgICAgICAgaWYgKGNvdW50cnkgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoIi0iKTsKQEAgLTQyNiw2ICs0NTEsMjEgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBJZiBXZWJWaWV3IG9ubHkgc3VwcG9ydHMgdG91Y2gsIGEgZGlmZmVyZW50IG5hdmlnYXRpb24gbW9kZWwgd2lsbCBiZQorICAgICAqIGFwcGxpZWQuIE90aGVyd2lzZSwgdGhlIG5hdmlnYXRpb24gdG8gc3VwcG9ydCBib3RoIHRvdWNoIGFuZCBrZXlib2FyZAorICAgICAqIHdpbGwgYmUgdXNlZC4KKyAgICAgKiBAaGlkZQorICAgIHB1YmxpYyB2b2lkIHNldFN1cHBvcnRUb3VjaE9ubHkoYm9vbGVhbiB0b3VjaE9ubHkpIHsKKyAgICAgICAgbVN1cHBvcnRUb3VuY2hPbmx5ID0gdG91Y2hPbmx5OworICAgIH0KKyAgICAgKi8KKworICAgIGJvb2xlYW4gc3VwcG9ydFRvdWNoT25seSgpIHsKKyAgICAgICAgLy8gZm9yIGRlYnVnIG9ubHksIHVzZSBtTGlnaHRUb3VjaEVuYWJsZWQgZm9yIG1TdXBwb3J0VG91bmNoT25seQorICAgICAgICByZXR1cm4gbUxpZ2h0VG91Y2hFbmFibGVkOworICAgIH0KKworICAgIC8qKgogICAgICAqIFNldCB3aGV0aGVyIHRoZSBXZWJWaWV3IHN1cHBvcnRzIHpvb20KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRTdXBwb3J0Wm9vbShib29sZWFuIHN1cHBvcnQpIHsKQEAgLTQ4NSw2ICs1MjUsMjUgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBTZXQgd2hldGhlciB0aGUgV2ViVmlldyB3aWxsIGVuYWJsZSBzbW9vdGggdHJhbnNpdGlvbiB3aGlsZSBwYW5uaW5nIG9yCisgICAgICogem9vbWluZy4gSWYgaXQgaXMgdHJ1ZSwgV2ViVmlldyB3aWxsIGNob29zZSBhIHNvbHV0aW9uIHRvIG1heGltaXplIHRoZQorICAgICAqIHBlcmZvcm1hbmNlLiBlLmcuIHRoZSBXZWJWaWV3J3MgY29udGVudCBtYXkgbm90IGJlIHVwZGF0ZWQgZHVyaW5nIHRoZQorICAgICAqIHRyYW5zaXRpb24uIElmIGl0IGlzIGZhbHNlLCBXZWJWaWV3IHdpbGwga2VlcCBpdHMgZmlkZWxpdHkuIFRoZSBkZWZhdWx0CisgICAgICogdmFsdWUgaXMgZmFsc2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RW5hYmxlU21vb3RoVHJhbnNpdGlvbihib29sZWFuIGVuYWJsZSkgeworICAgICAgICBtRW5hYmxlU21vb3RoVHJhbnNpdGlvbiA9IGVuYWJsZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIFdlYlZpZXcgZW5hYmxlcyBzbW9vdGggdHJhbnNpdGlvbiB3aGlsZSBwYW5uaW5nIG9yCisgICAgICogem9vbWluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBlbmFibGVTbW9vdGhUcmFuc2l0aW9uKCkgeworICAgICAgICByZXR1cm4gbUVuYWJsZVNtb290aFRyYW5zaXRpb247CisgICAgfQorCisgICAgLyoqCiAgICAgICogU3RvcmUgd2hldGhlciB0aGUgV2ViVmlldyBpcyBzYXZpbmcgZm9ybSBkYXRhLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldFNhdmVGb3JtRGF0YShib29sZWFuIHNhdmUpIHsKQEAgLTExNzYsNiArMTIzNSwxOCBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIFNldHMgd2hldGhlciBYU1MgQXVkaXRvciBpcyBlbmFibGVkLgorICAgICAqIEBwYXJhbSBmbGFnIFdoZXRoZXIgWFNTIEF1ZGl0b3Igc2hvdWxkIGJlIGVuYWJsZWQuCisgICAgICogQGhpZGUgT25seSB1c2VkIGJ5IExheW91dFRlc3RDb250cm9sbGVyLgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRYU1NBdWRpdG9yRW5hYmxlZChib29sZWFuIGZsYWcpIHsKKyAgICAgICAgaWYgKG1YU1NBdWRpdG9yRW5hYmxlZCAhPSBmbGFnKSB7CisgICAgICAgICAgICBtWFNTQXVkaXRvckVuYWJsZWQgPSBmbGFnOworICAgICAgICAgICAgcG9zdFN5bmMoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgogICAgICAqIFJldHVybiB0cnVlIGlmIGphdmFzY3JpcHQgaXMgZW5hYmxlZC4gPGI+Tm90ZTogVGhlIGRlZmF1bHQgaXMgZmFsc2UuPC9iPgogICAgICAqIEByZXR1cm4gVHJ1ZSBpZiBqYXZhc2NyaXB0IGlzIGVuYWJsZWQuCiAgICAgICovCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvV2ViVGV4dFZpZXcuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9XZWJUZXh0Vmlldy5qYXZhCmluZGV4IDE5YWJlYzEuLmViMzZiNWQgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9XZWJUZXh0Vmlldy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9XZWJUZXh0Vmlldy5qYXZhCkBAIC0yOCw2ICsyOCw3IEBACiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKIGltcG9ydCBhbmRyb2lkLnRleHQuRWRpdGFibGU7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LklucHV0RmlsdGVyOworaW1wb3J0IGFuZHJvaWQudGV4dC5MYXlvdXQ7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LlNlbGVjdGlvbjsKIGltcG9ydCBhbmRyb2lkLnRleHQuU3Bhbm5hYmxlOwogaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0UGFpbnQ7CkBAIC0zMDAsNiArMzAxLDMzIEBACiAgICAgICAgIHJldHVybiBjb25uZWN0aW9uOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIEluIGdlbmVyYWwsIFRleHRWaWV3IG1ha2VzIGEgY2FsbCB0byBJbnB1dE1ldGhvZE1hbmFnZXIudXBkYXRlU2VsZWN0aW9uCisgICAgICogaW4gb25EcmF3LiAgSG93ZXZlciwgaW4gdGhlIGdlbmVyYWwgY2FzZSBvZiBXZWJUZXh0Vmlldywgd2UgZG8gbm90IGRyYXcuCisgICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IFdlYlZpZXcub25EcmF3IHRvIHRha2UgY2FyZSBvZiB0aGUgcGFydCB0aGF0CisgICAgICogbmVlZHMgdG8gYmUgY2FsbGVkLgorICAgICAqLworICAgIC8qIHBhY2thZ2UgKi8gdm9pZCBvbkRyYXdTdWJzdGl0dXRlKCkgeworICAgICAgICBpZiAoIXdpbGxOb3REcmF3KCkpIHsKKyAgICAgICAgICAgIC8vIElmIHRoZSBXZWJUZXh0VmlldyBpcyBzZXQgdG8gZHJhdywgc3VjaCBhcyBpbiB0aGUgY2FzZSBvZiBhCisgICAgICAgICAgICAvLyBwYXNzd29yZCwgb25EcmF3IGNhbGxzIHVwZGF0ZVNlbGVjdGlvbigpLCBzbyB0aGlzIGNvZGUgcGF0aCBpcworICAgICAgICAgICAgLy8gdW5uZWNlc3NhcnkuCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgLy8gVGhpcyBjb2RlIGlzIGNvcGllZCBmcm9tIFRleHRWaWV3Lm9uRHJhdygpLiAgVGhhdCBjb2RlIGRvZXMgbm90IGdldAorICAgICAgICAvLyBleGVjdXRlZCwgaG93ZXZlciwgYmVjYXVzZSB0aGUgV2ViVGV4dFZpZXcgZG9lcyBub3QgZHJhdywgYWxsb3dpbmcKKyAgICAgICAgLy8gd2Via2l0J3MgZHJhd2luZyB0byBzaG93IHRocm91Z2guCisgICAgICAgIElucHV0TWV0aG9kTWFuYWdlciBpbW0gPSBJbnB1dE1ldGhvZE1hbmFnZXIucGVla0luc3RhbmNlKCk7CisgICAgICAgIGlmIChpbW0gIT0gbnVsbCAmJiBpbW0uaXNBY3RpdmUodGhpcykpIHsKKyAgICAgICAgICAgIFNwYW5uYWJsZSBzcCA9IChTcGFubmFibGUpIGdldFRleHQoKTsKKyAgICAgICAgICAgIGludCBzZWxTdGFydCA9IFNlbGVjdGlvbi5nZXRTZWxlY3Rpb25TdGFydChzcCk7CisgICAgICAgICAgICBpbnQgc2VsRW5kID0gU2VsZWN0aW9uLmdldFNlbGVjdGlvbkVuZChzcCk7CisgICAgICAgICAgICBpbnQgY2FuZFN0YXJ0ID0gRWRpdGFibGVJbnB1dENvbm5lY3Rpb24uZ2V0Q29tcG9zaW5nU3BhblN0YXJ0KHNwKTsKKyAgICAgICAgICAgIGludCBjYW5kRW5kID0gRWRpdGFibGVJbnB1dENvbm5lY3Rpb24uZ2V0Q29tcG9zaW5nU3BhbkVuZChzcCk7CisgICAgICAgICAgICBpbW0udXBkYXRlU2VsZWN0aW9uKHRoaXMsIHNlbFN0YXJ0LCBzZWxFbmQsIGNhbmRTdGFydCwgY2FuZEVuZCk7CisgICAgICAgIH0KKyAgICB9CisKICAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBvbkRyYXcoQ2FudmFzIGNhbnZhcykgewogICAgICAgICAvLyBvbkRyYXcgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGZvciBwYXNzd29yZCBmaWVsZHMuICBJZiBXZWJUZXh0VmlldyBpcwpAQCAtMzYwLDE5ICszODgsOCBAQAogCiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgb25TZWxlY3Rpb25DaGFuZ2VkKGludCBzZWxTdGFydCwgaW50IHNlbEVuZCkgewotICAgICAgICBpZiAobUluU2V0VGV4dEFuZEtlZXBTZWxlY3Rpb24pIHJldHVybjsKLSAgICAgICAgLy8gVGhpcyBjb2RlIGlzIGNvcGllZCBmcm9tIFRleHRWaWV3Lm9uRHJhdygpLiAgVGhhdCBjb2RlIGRvZXMgbm90IGdldAotICAgICAgICAvLyBleGVjdXRlZCwgaG93ZXZlciwgYmVjYXVzZSB0aGUgV2ViVGV4dFZpZXcgZG9lcyBub3QgZHJhdywgYWxsb3dpbmcKLSAgICAgICAgLy8gd2Via2l0J3MgZHJhd2luZyB0byBzaG93IHRocm91Z2guCi0gICAgICAgIElucHV0TWV0aG9kTWFuYWdlciBpbW0gPSBJbnB1dE1ldGhvZE1hbmFnZXIucGVla0luc3RhbmNlKCk7Ci0gICAgICAgIGlmIChpbW0gIT0gbnVsbCAmJiBpbW0uaXNBY3RpdmUodGhpcykpIHsKLSAgICAgICAgICAgIFNwYW5uYWJsZSBzcCA9IChTcGFubmFibGUpIGdldFRleHQoKTsKLSAgICAgICAgICAgIGludCBjYW5kU3RhcnQgPSBFZGl0YWJsZUlucHV0Q29ubmVjdGlvbi5nZXRDb21wb3NpbmdTcGFuU3RhcnQoc3ApOwotICAgICAgICAgICAgaW50IGNhbmRFbmQgPSBFZGl0YWJsZUlucHV0Q29ubmVjdGlvbi5nZXRDb21wb3NpbmdTcGFuRW5kKHNwKTsKLSAgICAgICAgICAgIGltbS51cGRhdGVTZWxlY3Rpb24odGhpcywgc2VsU3RhcnQsIHNlbEVuZCwgY2FuZFN0YXJ0LCBjYW5kRW5kKTsKLSAgICAgICAgfQogICAgICAgICBpZiAoIW1Gcm9tV2ViS2l0ICYmICFtRnJvbUZvY3VzQ2hhbmdlICYmICFtRnJvbVNldElucHV0VHlwZQotICAgICAgICAgICAgICAgICYmIG1XZWJWaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAmJiBtV2ViVmlldyAhPSBudWxsICYmICFtSW5TZXRUZXh0QW5kS2VlcFNlbGVjdGlvbikgewogICAgICAgICAgICAgaWYgKERlYnVnRmxhZ3MuV0VCX1RFWFRfVklFVykgewogICAgICAgICAgICAgICAgIExvZy52KExPR1RBRywgIm9uU2VsZWN0aW9uQ2hhbmdlZCBzZWxTdGFydD0iICsgc2VsU3RhcnQKICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBzZWxFbmQ9IiArIHNlbEVuZCk7CkBAIC00ODEsOSArNDk4LDEwIEBACiAgICAgICAgICAgICAvLyB0byBiaWcgZm9yIHRoZSBjYXNlIG9mIGEgc21hbGwgdGV4dGZpZWxkLgogICAgICAgICAgICAgaW50IHNtYWxsZXJTbG9wID0gc2xvcC8yOwogICAgICAgICAgICAgaWYgKGR4ID4gc21hbGxlclNsb3AgfHwgZHkgPiBzbWFsbGVyU2xvcCkgewotICAgICAgICAgICAgICAgIGlmIChtV2ViVmlldyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZsb2F0IG1heFNjcm9sbFggPSAoZmxvYXQpIFRvdWNoLmdldE1heFNjcm9sbFgodGhpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TGF5b3V0KCksIG1TY3JvbGxZKTsKKyAgICAgICAgICAgICAgICBMYXlvdXQgbGF5b3V0ID0gZ2V0TGF5b3V0KCk7CisgICAgICAgICAgICAgICAgaWYgKG1XZWJWaWV3ICE9IG51bGwgJiYgbGF5b3V0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQgbWF4U2Nyb2xsWCA9IChmbG9hdCkgVG91Y2guZ2V0TWF4U2Nyb2xsWCh0aGlzLCBsYXlvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNjcm9sbFkpOwogICAgICAgICAgICAgICAgICAgICBpZiAoRGVidWdGbGFncy5XRUJfVEVYVF9WSUVXKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBMb2cudihMT0dUQUcsICJvblRvdWNoRXZlbnQgeD0iICsgbVNjcm9sbFggKyAiIHk9IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG1TY3JvbGxZICsgIiBtYXhYPSIgKyBtYXhTY3JvbGxYKTsKQEAgLTY2Nyw2ICs2ODUsNyBAQAogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgU2VsZWN0aW9uLnNldFNlbGVjdGlvbih0ZXh0LCBzZWxlY3Rpb24sIHNlbGVjdGlvbik7CiAgICAgICAgIH0KKyAgICAgICAgaWYgKG1XZWJWaWV3ICE9IG51bGwpIG1XZWJWaWV3LmluY3JlbWVudFRleHRHZW5lcmF0aW9uKCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC05MTksMTQgKzkzOCw0IEBACiAgICAgLyogcGFja2FnZSAqLyB2b2lkIHVwZGF0ZUNhY2hlZFRleHRmaWVsZCgpIHsKICAgICAgICAgbVdlYlZpZXcudXBkYXRlQ2FjaGVkVGV4dGZpZWxkKGdldFRleHQoKS50b1N0cmluZygpKTsKICAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiByZXF1ZXN0UmVjdGFuZ2xlT25TY3JlZW4oUmVjdCByZWN0YW5nbGUpIHsKLSAgICAgICAgLy8gZG9uJ3Qgc2Nyb2xsIHdoaWxlIGluIHpvb20gYW5pbWF0aW9uLiBXaGVuIGl0IGlzIGRvbmUsIHdlIHdpbGwgYWRqdXN0Ci0gICAgICAgIC8vIHRoZSBXZWJUZXh0VmlldyBpZiBpdCBpcyBpbiBlZGl0aW5nIG1vZGUuCi0gICAgICAgIGlmICghbVdlYlZpZXcuaW5BbmltYXRlWm9vbSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gc3VwZXIucmVxdWVzdFJlY3RhbmdsZU9uU2NyZWVuKHJlY3RhbmdsZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9XZWJWaWV3LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvV2ViVmlldy5qYXZhCmluZGV4IDRjYTIxMGYuLjIxZTdiNjMgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9XZWJWaWV3LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1dlYlZpZXcuamF2YQpAQCAtMjUsMTkgKzI1LDE2IEBACiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuRGF0YVNldE9ic2VydmVyOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwRmFjdG9yeTsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcFNoYWRlcjsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNvbG9yOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ29ybmVyUGF0aEVmZmVjdDsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkludGVycG9sYXRvcjsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLk1hdHJpeDsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50OwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGljdHVyZTsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBvaW50OwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3RGOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVnaW9uOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuU2hhZGVyOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7CiBpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOwogaW1wb3J0IGFuZHJvaWQubmV0Lmh0dHAuU3NsQ2VydGlmaWNhdGU7CkBAIC00Niw2ICs0Myw3IEBACiBpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOwogaW1wb3J0IGFuZHJvaWQub3MuU2VydmljZU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKK2ltcG9ydCBhbmRyb2lkLnNwZWVjaC50dHMuVGV4dFRvU3BlZWNoOwogaW1wb3J0IGFuZHJvaWQudGV4dC5JQ2xpcGJvYXJkOwogaW1wb3J0IGFuZHJvaWQudGV4dC5TZWxlY3Rpb247CiBpbXBvcnQgYW5kcm9pZC50ZXh0LlNwYW5uYWJsZTsKQEAgLTY0LDMyICs2MiwyOSBAQAogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3Q29uZmlndXJhdGlvbjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3VHJlZU9ic2VydmVyOwotaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uQWxwaGFBbmltYXRpb247CitpbXBvcnQgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLkVkaXRvckluZm87CiBpbXBvcnQgYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLklucHV0Q29ubmVjdGlvbjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuSW5wdXRNZXRob2RNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQud2Via2l0LldlYlRleHRWaWV3LkF1dG9Db21wbGV0ZUFkYXB0ZXI7CiBpbXBvcnQgYW5kcm9pZC53ZWJraXQuV2ViVmlld0NvcmUuRXZlbnRIdWI7CiBpbXBvcnQgYW5kcm9pZC53ZWJraXQuV2ViVmlld0NvcmUuVG91Y2hFdmVudERhdGE7CitpbXBvcnQgYW5kcm9pZC53ZWJraXQuV2ViVmlld0NvcmUuVG91Y2hIaWdobGlnaHREYXRhOwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkFic29sdXRlTGF5b3V0OwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXI7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuQWRhcHRlclZpZXc7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuQXJyYXlBZGFwdGVyOwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkNoZWNrZWRUZXh0VmlldzsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5GcmFtZUxheW91dDsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5MaW5lYXJMYXlvdXQ7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGlzdFZpZXc7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuU2Nyb2xsZXI7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuVG9hc3Q7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuWm9vbUJ1dHRvbnNDb250cm9sbGVyOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0Llpvb21Db250cm9sczsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5BZGFwdGVyVmlldy5Pbkl0ZW1DbGlja0xpc3RlbmVyOwogCiBpbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEubmV0LlVSTERlY29kZXI7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKQEAgLTMxMCw0OSArMzA1LDcgQEAKIAogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HVEFHID0gIndlYnZpZXciOwogCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRXh0ZW5kZWRab29tQ29udHJvbHMgZXh0ZW5kcyBGcmFtZUxheW91dCB7Ci0gICAgICAgIHB1YmxpYyBFeHRlbmRlZFpvb21Db250cm9scyhDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycykgewotICAgICAgICAgICAgc3VwZXIoY29udGV4dCwgYXR0cnMpOwotICAgICAgICAgICAgTGF5b3V0SW5mbGF0ZXIgaW5mbGF0ZXIgPSAoTGF5b3V0SW5mbGF0ZXIpCi0gICAgICAgICAgICAgICAgICAgIGNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LkxBWU9VVF9JTkZMQVRFUl9TRVJWSUNFKTsKLSAgICAgICAgICAgIGluZmxhdGVyLmluZmxhdGUoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5sYXlvdXQuem9vbV9tYWduaWZ5LCB0aGlzLCB0cnVlKTsKLSAgICAgICAgICAgIG1QbHVzTWludXNab29tQ29udHJvbHMgPSAoWm9vbUNvbnRyb2xzKSBmaW5kVmlld0J5SWQoCi0gICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuaWQuem9vbUNvbnRyb2xzKTsKLSAgICAgICAgICAgIGZpbmRWaWV3QnlJZChjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmlkLnpvb21NYWduaWZ5KS5zZXRWaXNpYmlsaXR5KAotICAgICAgICAgICAgICAgICAgICBWaWV3LkdPTkUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2hvdyhib29sZWFuIHNob3dab29tLCBib29sZWFuIGNhblpvb21PdXQpIHsKLSAgICAgICAgICAgIG1QbHVzTWludXNab29tQ29udHJvbHMuc2V0VmlzaWJpbGl0eSgKLSAgICAgICAgICAgICAgICAgICAgc2hvd1pvb20gPyBWaWV3LlZJU0lCTEUgOiBWaWV3LkdPTkUpOwotICAgICAgICAgICAgZmFkZShWaWV3LlZJU0lCTEUsIDAuMGYsIDEuMGYpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgaGlkZSgpIHsKLSAgICAgICAgICAgIGZhZGUoVmlldy5HT05FLCAxLjBmLCAwLjBmKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBmYWRlKGludCB2aXNpYmlsaXR5LCBmbG9hdCBzdGFydEFscGhhLCBmbG9hdCBlbmRBbHBoYSkgewotICAgICAgICAgICAgQWxwaGFBbmltYXRpb24gYW5pbSA9IG5ldyBBbHBoYUFuaW1hdGlvbihzdGFydEFscGhhLCBlbmRBbHBoYSk7Ci0gICAgICAgICAgICBhbmltLnNldER1cmF0aW9uKDUwMCk7Ci0gICAgICAgICAgICBzdGFydEFuaW1hdGlvbihhbmltKTsKLSAgICAgICAgICAgIHNldFZpc2liaWxpdHkodmlzaWJpbGl0eSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNGb2N1cygpIHsKLSAgICAgICAgICAgIHJldHVybiBtUGx1c01pbnVzWm9vbUNvbnRyb2xzLmhhc0ZvY3VzKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRPblpvb21JbkNsaWNrTGlzdGVuZXIoT25DbGlja0xpc3RlbmVyIGxpc3RlbmVyKSB7Ci0gICAgICAgICAgICBtUGx1c01pbnVzWm9vbUNvbnRyb2xzLnNldE9uWm9vbUluQ2xpY2tMaXN0ZW5lcihsaXN0ZW5lcik7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRPblpvb21PdXRDbGlja0xpc3RlbmVyKE9uQ2xpY2tMaXN0ZW5lciBsaXN0ZW5lcikgewotICAgICAgICAgICAgbVBsdXNNaW51c1pvb21Db250cm9scy5zZXRPblpvb21PdXRDbGlja0xpc3RlbmVyKGxpc3RlbmVyKTsKLSAgICAgICAgfQotCi0gICAgICAgIFpvb21Db250cm9scyAgICBtUGx1c01pbnVzWm9vbUNvbnRyb2xzOwotICAgIH0KKyAgICBwcml2YXRlIFpvb21NYW5hZ2VyIG1ab29tTWFuYWdlcjsKIAogICAgIC8qKgogICAgICAqICBUcmFuc3BvcnRhdGlvbiBvYmplY3QgZm9yIHJldHVybmluZyBXZWJWaWV3IGFjcm9zcyB0aHJlYWQgYm91bmRhcmllcy4KQEAgLTM5OCw2ICszNTEsOCBAQAogICAgIC8vIG1vcmUga2V5IGV2ZW50cy4KICAgICBwcml2YXRlIGludCBtVGV4dEdlbmVyYXRpb247CiAKKyAgICAvKiBwYWNrYWdlICovIHZvaWQgaW5jcmVtZW50VGV4dEdlbmVyYXRpb24oKSB7IG1UZXh0R2VuZXJhdGlvbisrOyB9CisKICAgICAvLyBVc2VkIGJ5IFdlYlZpZXdDb3JlIHRvIGNyZWF0ZSBjaGlsZCB2aWV3cy4KICAgICAvKiBwYWNrYWdlICovIGZpbmFsIFZpZXdNYW5hZ2VyIG1WaWV3TWFuYWdlcjsKIApAQCAtNDQ1LDYgKzQwMCwxMCBAQAogICAgIHByaXZhdGUgZmxvYXQgbUxhc3RWZWxYOwogICAgIHByaXZhdGUgZmxvYXQgbUxhc3RWZWxZOwogCisgICAgLy8gb25seSB0cmlnZ2VyIGFjY2VsZXJhdGVkIGZsaW5nIGlmIHRoZSBuZXcgdmVsb2NpdHkgaXMgYXQgbGVhc3QKKyAgICAvLyBNSU5JTVVNX1ZFTE9DSVRZX1JBVElPX0ZPUl9BQ0NFTEVSQVRJT04gdGltZXMgb2YgdGhlIHByZXZpb3VzIHZlbG9jaXR5CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZmxvYXQgTUlOSU1VTV9WRUxPQ0lUWV9SQVRJT19GT1JfQUNDRUxFUkFUSU9OID0gMC4yZjsKKwogICAgIC8qKgogICAgICAqIFRvdWNoIG1vZGUKICAgICAgKi8KQEAgLTQ1Niw4ICs0MTUsNyBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUT1VDSF9TSE9SVFBSRVNTX01PREUgPSA1OwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUT1VDSF9ET1VCTEVfVEFQX01PREUgPSA2OwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUT1VDSF9ET05FX01PREUgPSA3OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUT1VDSF9TRUxFQ1RfTU9ERSA9IDg7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRPVUNIX1BJTkNIX0RSQUcgPSA5OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUT1VDSF9QSU5DSF9EUkFHID0gODsKIAogICAgIC8vIFdoZXRoZXIgdG8gZm9yd2FyZCB0aGUgdG91Y2ggZXZlbnRzIHRvIFdlYkNvcmUKICAgICBwcml2YXRlIGJvb2xlYW4gbUZvcndhcmRUb3VjaEV2ZW50cyA9IGZhbHNlOwpAQCAtNTIxLDkgKzQ3OSw2IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1JTl9GTElOR19USU1FID0gMjUwOwogICAgIC8vIGRyYXcgdW5maWx0ZXJlZCBhZnRlciBkcmFnIGlzIGhlbGQgd2l0aG91dCBtb3ZlbWVudAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNT1RJT05MRVNTX1RJTUUgPSAxMDA7Ci0gICAgLy8gVGhlIHRpbWUgdGhhdCB0aGUgWm9vbSBDb250cm9scyBhcmUgdmlzaWJsZSBiZWZvcmUgZmFkaW5nIGF3YXkKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIFpPT01fQ09OVFJPTFNfVElNRU9VVCA9Ci0gICAgICAgICAgICBWaWV3Q29uZmlndXJhdGlvbi5nZXRab29tQ29udHJvbHNUaW1lb3V0KCk7CiAgICAgLy8gVGhlIGFtb3VudCBvZiBjb250ZW50IHRvIG92ZXJsYXAgYmV0d2VlbiB0d28gc2NyZWVucyB3aGVuIGdvaW5nIHRocm91Z2gKICAgICAvLyBwYWdlcyB3aXRoIHRoZSBzcGFjZSBiYXIsIGluIHBpeGVscy4KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUEFHRV9TQ1JPTExfT1ZFUkxBUCA9IDI0OwpAQCAtNTY0LDE1ICs1MTksMjQgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTU9USU9OTEVTU19JR05PUkUgICAgICAgICAgPSAzOwogICAgIHByaXZhdGUgaW50IG1IZWxkTW90aW9ubGVzczsKIAotICAgIC8vIHdoZXRoZXIgc3VwcG9ydCBtdWx0aS10b3VjaAotICAgIHByaXZhdGUgYm9vbGVhbiBtU3VwcG9ydE11bHRpVG91Y2g7Ci0gICAgLy8gdXNlIHRoZSBmcmFtZXdvcmsncyBTY2FsZUdlc3R1cmVEZXRlY3RvciB0byBoYW5kbGUgbXVsdGktdG91Y2gKLSAgICBwcml2YXRlIFNjYWxlR2VzdHVyZURldGVjdG9yIG1TY2FsZURldGVjdG9yOworICAgIC8vIEFuIGluc3RhbmNlIGZvciBpbmplY3RpbmcgYWNjZXNzaWJpbGl0eSBpbiBXZWJWaWV3cyB3aXRoIGRpc2FibGVkCisgICAgLy8gSmF2YVNjcmlwdCBvciBvbmVzIGZvciB3aGljaCBubyBhY2Nlc3NpYmlsaXR5IHNjcmlwdCBleGlzdHMKKyAgICBwcml2YXRlIEFjY2Vzc2liaWxpdHlJbmplY3RvciBtQWNjZXNzaWJpbGl0eUluamVjdG9yOwogCi0gICAgLy8gdGhlIGFuY2hvciBwb2ludCBpbiB0aGUgZG9jdW1lbnQgc3BhY2Ugd2hlcmUgVklFV19TSVpFX0NIQU5HRUQgc2hvdWxkCi0gICAgLy8gYXBwbHkgdG8KLSAgICBwcml2YXRlIGludCBtQW5jaG9yWDsKLSAgICBwcml2YXRlIGludCBtQW5jaG9yWTsKKyAgICAvLyB0aGUgY29sb3IgdXNlZCB0byBoaWdobGlnaHQgdGhlIHRvdWNoIHJlY3RhbmdsZXMKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgbUhpZ2h0bGlnaHRDb2xvciA9IDB4MzMwMDAwMDA7CisgICAgLy8gdGhlIHJvdW5kIGNvcm5lciBmb3IgdGhlIGhpZ2hsaWdodCBwYXRoCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZmxvYXQgVE9VQ0hfSElHSExJR0hUX0FSQyA9IDUuMGY7CisgICAgLy8gdGhlIHJlZ2lvbiBpbmRpY2F0aW5nIHdoZXJlIHRoZSB1c2VyIHRvdWNoZWQgb24gdGhlIHNjcmVlbgorICAgIHByaXZhdGUgUmVnaW9uIG1Ub3VjaEhpZ2hsaWdodFJlZ2lvbiA9IG5ldyBSZWdpb24oKTsKKyAgICAvLyB0aGUgcGFpbnQgZm9yIHRoZSB0b3VjaCBoaWdobGlnaHQKKyAgICBwcml2YXRlIFBhaW50IG1Ub3VjaEhpZ2h0bGlnaHRQYWludDsKKyAgICAvLyBkZWJ1ZyBvbmx5CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVR19UT1VDSF9ISUdITElHSFQgPSB0cnVlOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUT1VDSF9ISUdITElHSFRfRUxBUFNFX1RJTUUgPSAyMDAwOworICAgIHByaXZhdGUgUGFpbnQgbVRvdWNoQ3Jvc3NIYWlyQ29sb3I7CisgICAgcHJpdmF0ZSBpbnQgbVRvdWNoSGlnaGxpZ2h0WDsKKyAgICBwcml2YXRlIGludCBtVG91Y2hIaWdobGlnaHRZOwogCiAgICAgLyoKICAgICAgKiBQcml2YXRlIG1lc3NhZ2UgaWRzCkBAIC02MDYsNyArNTcwLDcgQEAKICAgICBzdGF0aWMgZmluYWwgaW50IFdFQkNPUkVfSU5JVElBTElaRURfTVNHX0lEICAgICAgICAgPSAxMDc7CiAgICAgc3RhdGljIGZpbmFsIGludCBVUERBVEVfVEVYVEZJRUxEX1RFWFRfTVNHX0lEICAgICAgID0gMTA4OwogICAgIHN0YXRpYyBmaW5hbCBpbnQgVVBEQVRFX1pPT01fUkFOR0UgICAgICAgICAgICAgICAgICA9IDEwOTsKLSAgICBzdGF0aWMgZmluYWwgaW50IE1PVkVfT1VUX09GX1BMVUdJTiAgICAgICAgICAgICAgICAgPSAxMTA7CisgICAgc3RhdGljIGZpbmFsIGludCBVTkhBTkRMRURfTkFWX0tFWSAgICAgICAgICAgICAgICAgID0gMTEwOwogICAgIHN0YXRpYyBmaW5hbCBpbnQgQ0xFQVJfVEVYVF9FTlRSWSAgICAgICAgICAgICAgICAgICA9IDExMTsKICAgICBzdGF0aWMgZmluYWwgaW50IFVQREFURV9URVhUX1NFTEVDVElPTl9NU0dfSUQgICAgICAgPSAxMTI7CiAgICAgc3RhdGljIGZpbmFsIGludCBTSE9XX1JFQ1RfTVNHX0lEICAgICAgICAgICAgICAgICAgID0gMTEzOwpAQCAtNjI3LDkgKzU5MSwxMSBAQAogICAgIHN0YXRpYyBmaW5hbCBpbnQgQ0VOVEVSX0ZJVF9SRUNUICAgICAgICAgICAgICAgICAgICA9IDEyNzsKICAgICBzdGF0aWMgZmluYWwgaW50IFJFUVVFU1RfS0VZQk9BUkRfV0lUSF9TRUxFQ1RJT05fTVNHX0lEID0gMTI4OwogICAgIHN0YXRpYyBmaW5hbCBpbnQgU0VUX1NDUk9MTEJBUl9NT0RFUyAgICAgICAgICAgICAgICA9IDEyOTsKKyAgICBzdGF0aWMgZmluYWwgaW50IFNFTEVDVElPTl9TVFJJTkdfQ0hBTkdFRCAgICAgICAgICAgPSAxMzA7CisgICAgc3RhdGljIGZpbmFsIGludCBTRVRfVE9VQ0hfSElHSExJR0hUX1JFQ1RTICAgICAgICAgID0gMTMxOwogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZJUlNUX1BBQ0tBR0VfTVNHX0lEID0gU0NST0xMX1RPX01TR19JRDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTEFTVF9QQUNLQUdFX01TR19JRCA9IFNFVF9TQ1JPTExCQVJfTU9ERVM7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IExBU1RfUEFDS0FHRV9NU0dfSUQgPSBTRVRfVE9VQ0hfSElHSExJR0hUX1JFQ1RTOwogCiAgICAgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEhhbmRsZXJQcml2YXRlRGVidWdTdHJpbmcgPSB7CiAgICAgICAgICJSRU1FTUJFUl9QQVNTV09SRCIsIC8vICAgICAgICAgICAgICA9IDE7CkBAIC02NTQsNyArNjIwLDcgQEAKICAgICAgICAgIldFQkNPUkVfSU5JVElBTElaRURfTVNHX0lEIiwgLy8gICAgID0gMTA3OwogICAgICAgICAiVVBEQVRFX1RFWFRGSUVMRF9URVhUX01TR19JRCIsIC8vICAgPSAxMDg7CiAgICAgICAgICJVUERBVEVfWk9PTV9SQU5HRSIsIC8vICAgICAgICAgICAgICA9IDEwOTsKLSAgICAgICAgIk1PVkVfT1VUX09GX1BMVUdJTiIsIC8vICAgICAgICAgICAgID0gMTEwOworICAgICAgICAiVU5IQU5ETEVEX05BVl9LRVkiLCAvLyAgICAgICAgICAgICAgPSAxMTA7CiAgICAgICAgICJDTEVBUl9URVhUX0VOVFJZIiwgLy8gICAgICAgICAgICAgICA9IDExMTsKICAgICAgICAgIlVQREFURV9URVhUX1NFTEVDVElPTl9NU0dfSUQiLCAvLyAgID0gMTEyOwogICAgICAgICAiU0hPV19SRUNUX01TR19JRCIsIC8vICAgICAgICAgICAgICAgPSAxMTM7CkBAIC02NzMsNyArNjM5LDkgQEAKICAgICAgICAgIkZJTkRfQUdBSU4iLCAvLyAgICAgICAgICAgICAgICAgICAgID0gMTI2OwogICAgICAgICAiQ0VOVEVSX0ZJVF9SRUNUIiwgLy8gICAgICAgICAgICAgICAgPSAxMjc7CiAgICAgICAgICJSRVFVRVNUX0tFWUJPQVJEX1dJVEhfU0VMRUNUSU9OX01TR19JRCIsIC8vID0gMTI4OwotICAgICAgICAiU0VUX1NDUk9MTEJBUl9NT0RFUyIgLy8gICAgICAgICAgICAgPSAxMjk7CisgICAgICAgICJTRVRfU0NST0xMQkFSX01PREVTIiwgLy8gICAgICAgICAgICA9IDEyOTsKKyAgICAgICAgIlNFTEVDVElPTl9TVFJJTkdfQ0hBTkdFRCIsIC8vICAgICAgID0gMTMwOworICAgICAgICAiU0VUX1RPVUNIX0hJR0hMSUdIVF9SRUNUUyIgLy8gICAgICAgPSAxMzE7CiAgICAgfTsKIAogICAgIC8vIElmIHRoZSBzaXRlIGRvZXNuJ3QgdXNlIHRoZSB2aWV3cG9ydCBtZXRhIHRhZyB0byBzcGVjaWZ5IHRoZSB2aWV3cG9ydCwKQEAgLTY4Niw0OSArNjU0LDkgQEAKICAgICAvLyB0aGUgbWluaW11bSBwcmVmZXJyZWQgd2lkdGggaXMgaHVnZSwgYW4gdXBwZXIgbGltaXQgaXMgbmVlZGVkLgogICAgIHN0YXRpYyBpbnQgc01heFZpZXdwb3J0V2lkdGggPSBERUZBVUxUX1ZJRVdQT1JUX1dJRFRIOwogCi0gICAgLy8gZGVmYXVsdCBzY2FsZSBsaW1pdC4gRGVwZW5kaW5nIG9uIHRoZSBkaXNwbGF5IGRlbnNpdHkKLSAgICBwcml2YXRlIHN0YXRpYyBmbG9hdCBERUZBVUxUX01BWF9aT09NX1NDQUxFOwotICAgIHByaXZhdGUgc3RhdGljIGZsb2F0IERFRkFVTFRfTUlOX1pPT01fU0NBTEU7Ci0gICAgLy8gc2NhbGUgbGltaXQsIHdoaWNoIGNhbiBiZSBzZXQgdGhyb3VnaCB2aWV3cG9ydCBtZXRhIHRhZyBpbiB0aGUgd2ViIHBhZ2UKLSAgICBwcml2YXRlIGZsb2F0IG1NYXhab29tU2NhbGU7Ci0gICAgcHJpdmF0ZSBmbG9hdCBtTWluWm9vbVNjYWxlOwotICAgIHByaXZhdGUgYm9vbGVhbiBtTWluWm9vbVNjYWxlRml4ZWQgPSB0cnVlOwotCiAgICAgLy8gaW5pdGlhbCBzY2FsZSBpbiBwZXJjZW50LiAwIG1lYW5zIHVzaW5nIGRlZmF1bHQuCiAgICAgcHJpdmF0ZSBpbnQgbUluaXRpYWxTY2FsZUluUGVyY2VudCA9IDA7CiAKLSAgICAvLyB3aGlsZSBpbiB0aGUgem9vbSBvdmVydmlldyBtb2RlLCB0aGUgcGFnZSdzIHdpZHRoIGlzIGZ1bGx5IGZpdCB0byB0aGUKLSAgICAvLyBjdXJyZW50IHdpbmRvdy4gVGhlIHBhZ2UgaXMgYWxpdmUsIGluIGFub3RoZXIgd29yZHMsIHlvdSBjYW4gY2xpY2sgdG8KLSAgICAvLyBmb2xsb3cgdGhlIGxpbmtzLiBEb3VibGUgdGFwIHdpbGwgdG9nZ2xlIGJldHdlZW4gem9vbSBvdmVydmlldyBtb2RlIGFuZAotICAgIC8vIHRoZSBsYXN0IHpvb20gc2NhbGUuCi0gICAgYm9vbGVhbiBtSW5ab29tT3ZlcnZpZXcgPSBmYWxzZTsKLQotICAgIC8vIGlkZWFsbHkgbVpvb21PdmVydmlld1dpZHRoIHNob3VsZCBiZSBtQ29udGVudFdpZHRoLiBCdXQgc2l0ZXMgbGlrZSBlc3BuLAotICAgIC8vIGVuZ2FkZ2V0IGFsd2F5cyBoYXZlIHdpZGVyIG1Db250ZW50V2lkdGggbm8gbWF0dGVyIHdoYXQgdmlld3BvcnQgc2l6ZSBpcy4KLSAgICBpbnQgbVpvb21PdmVydmlld1dpZHRoID0gREVGQVVMVF9WSUVXUE9SVF9XSURUSDsKLSAgICBmbG9hdCBtVGV4dFdyYXBTY2FsZTsKLQotICAgIC8vIGRlZmF1bHQgc2NhbGUuIERlcGVuZGluZyBvbiB0aGUgZGlzcGxheSBkZW5zaXR5LgotICAgIHN0YXRpYyBpbnQgREVGQVVMVF9TQ0FMRV9QRVJDRU5UOwotICAgIHByaXZhdGUgZmxvYXQgbURlZmF1bHRTY2FsZTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZsb2F0IE1JTklNVU1fU0NBTEVfSU5DUkVNRU5UID0gMC4wMWY7Ci0KLSAgICAvLyBzZXQgdG8gdHJ1ZSB0ZW1wb3JhcmlseSBkdXJpbmcgU2NhbGVHZXN0dXJlIHRyaWdnZXJlZCB6b29tCi0gICAgcHJpdmF0ZSBib29sZWFuIG1QcmV2aWV3Wm9vbU9ubHkgPSBmYWxzZTsKLQotICAgIC8vIGNvbXB1dGVkIHNjYWxlIGFuZCBpbnZlcnNlLCBmcm9tIG1ab29tV2lkdGguCi0gICAgcHJpdmF0ZSBmbG9hdCBtQWN0dWFsU2NhbGU7Ci0gICAgcHJpdmF0ZSBmbG9hdCBtSW52QWN0dWFsU2NhbGU7Ci0gICAgLy8gaWYgdGhpcyBpcyBub24temVybywgaXQgaXMgdXNlZCBvbiBkcmF3aW5nIHJhdGhlciB0aGFuIG1BY3R1YWxTY2FsZQotICAgIHByaXZhdGUgZmxvYXQgbVpvb21TY2FsZTsKLSAgICBwcml2YXRlIGZsb2F0IG1JbnZJbml0aWFsWm9vbVNjYWxlOwotICAgIHByaXZhdGUgZmxvYXQgbUludkZpbmFsWm9vbVNjYWxlOwotICAgIHByaXZhdGUgaW50IG1Jbml0aWFsU2Nyb2xsWDsKLSAgICBwcml2YXRlIGludCBtSW5pdGlhbFNjcm9sbFk7Ci0gICAgcHJpdmF0ZSBsb25nIG1ab29tU3RhcnQ7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFpPT01fQU5JTUFUSU9OX0xFTkdUSCA9IDUwMDsKLQogICAgIHByaXZhdGUgYm9vbGVhbiBtVXNlclNjcm9sbCA9IGZhbHNlOwogCiAgICAgcHJpdmF0ZSBpbnQgbVNuYXBTY3JvbGxNb2RlID0gU05BUF9OT05FOwpAQCAtNzUyLDYgKzY4MCwxOSBAQAogICAgIHByaXZhdGUgaW50IG1Ib3Jpem9udGFsU2Nyb2xsQmFyTW9kZSA9IFNDUk9MTEJBUl9BVVRPOwogICAgIHByaXZhdGUgaW50IG1WZXJ0aWNhbFNjcm9sbEJhck1vZGUgPSBTQ1JPTExCQVJfQVVUTzsKIAorICAgIC8vIHRoZSBhbGlhcyB2aWEgd2hpY2ggYWNjZXNzaWJpbGl0eSBKYXZhU2NyaXB0IGludGVyZmFjZSBpcyBleHBvc2VkCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFMSUFTX0FDQ0VTU0lCSUxJVFlfSlNfSU5URVJGQUNFID0gImFjY2Vzc2liaWxpdHkiOworCisgICAgLy8gSmF2YVNjcmlwdCB0byBpbmplY3QgdGhlIHNjcmlwdCBjaG9vc2VyIHdoaWNoIHdpbGwKKyAgICAvLyBwaWNrIHRoZSByaWdodCBzY3JpcHQgZm9yIHRoZSBjdXJyZW50IFVSTAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBQ0NFU1NJQklMSVRZX1NDUklQVF9DSE9PU0VSX0pBVkFTQ1JJUFQgPQorICAgICAgICAiamF2YXNjcmlwdDooZnVuY3Rpb24oKSB7IiArCisgICAgICAgICIgICAgdmFyIGNob29zZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTsiICsKKyAgICAgICAgIiAgICBjaG9vc2VyLnR5cGUgPSAndGV4dC9qYXZhc2NyaXB0JzsiICsKKyAgICAgICAgIiAgICBjaG9vc2VyLnNyYyA9ICdodHRwczovL3NzbC5nc3RhdGljLmNvbS9hY2Nlc3NpYmlsaXR5L2phdmFzY3JpcHQvYW5kcm9pZC9BbmRyb2lkU2NyaXB0Q2hvb3Nlci51c2VyLmpzJzsiICsKKyAgICAgICAgIiAgICBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaGVhZCcpWzBdLmFwcGVuZENoaWxkKGNob29zZXIpOyIgKworICAgICAgICAiICB9KSgpOyI7CisKICAgICAvLyBVc2VkIHRvIG1hdGNoIGtleSBkb3ducyBhbmQga2V5IHVwcwogICAgIHByaXZhdGUgYm9vbGVhbiBtR290S2V5RG93bjsKIApAQCAtODU2LDQzICs3OTcsNiBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgLy8gVGhlIFZpZXcgY29udGFpbmluZyB0aGUgem9vbSBjb250cm9scwotICAgIHByaXZhdGUgRXh0ZW5kZWRab29tQ29udHJvbHMgbVpvb21Db250cm9sczsKLSAgICBwcml2YXRlIFJ1bm5hYmxlIG1ab29tQ29udHJvbFJ1bm5hYmxlOwotCi0gICAgLy8gbVpvb21CdXR0b25zQ29udHJvbGxlciB3aWxsIGJlIGxhenkgaW5pdGlhbGl6ZWQgaW4KLSAgICAvLyBnZXRab29tQnV0dG9uc0NvbnRyb2xsZXIoKSB0byBnZXQgYmV0dGVyIHBlcmZvcm1hbmNlLgotICAgIHByaXZhdGUgWm9vbUJ1dHRvbnNDb250cm9sbGVyIG1ab29tQnV0dG9uc0NvbnRyb2xsZXI7Ci0KLSAgICAvLyBUaGVzZSBrZWVwIHRyYWNrIG9mIHRoZSBjZW50ZXIgcG9pbnQgb2YgdGhlIHpvb20uICBUaGV5IGFyZSB1c2VkIHRvCi0gICAgLy8gZGV0ZXJtaW5lIHRoZSBwb2ludCBhcm91bmQgd2hpY2ggd2Ugc2hvdWxkIHpvb20uCi0gICAgcHJpdmF0ZSBmbG9hdCBtWm9vbUNlbnRlclg7Ci0gICAgcHJpdmF0ZSBmbG9hdCBtWm9vbUNlbnRlclk7Ci0KLSAgICBwcml2YXRlIFpvb21CdXR0b25zQ29udHJvbGxlci5Pblpvb21MaXN0ZW5lciBtWm9vbUxpc3RlbmVyID0KLSAgICAgICAgICAgIG5ldyBab29tQnV0dG9uc0NvbnRyb2xsZXIuT25ab29tTGlzdGVuZXIoKSB7Ci0KLSAgICAgICAgcHVibGljIHZvaWQgb25WaXNpYmlsaXR5Q2hhbmdlZChib29sZWFuIHZpc2libGUpIHsKLSAgICAgICAgICAgIGlmICh2aXNpYmxlKSB7Ci0gICAgICAgICAgICAgICAgc3dpdGNoT3V0RHJhd0hpc3RvcnkoKTsKLSAgICAgICAgICAgICAgICAvLyBCcmluZyBiYWNrIHRoZSBoaWRkZW4gem9vbSBjb250cm9scy4KLSAgICAgICAgICAgICAgICBtWm9vbUJ1dHRvbnNDb250cm9sbGVyLmdldFpvb21Db250cm9scygpLnNldFZpc2liaWxpdHkoCi0gICAgICAgICAgICAgICAgICAgICAgICBWaWV3LlZJU0lCTEUpOwotICAgICAgICAgICAgICAgIHVwZGF0ZVpvb21CdXR0b25zRW5hYmxlZCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgb25ab29tKGJvb2xlYW4gem9vbUluKSB7Ci0gICAgICAgICAgICBpZiAoem9vbUluKSB7Ci0gICAgICAgICAgICAgICAgem9vbUluKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHpvb21PdXQoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdXBkYXRlWm9vbUJ1dHRvbnNFbmFibGVkKCk7Ci0gICAgICAgIH0KLSAgICB9OwotCiAgICAgLyoqCiAgICAgICogQ29uc3RydWN0IGEgbmV3IFdlYlZpZXcgd2l0aCBhIENvbnRleHQgb2JqZWN0LgogICAgICAqIEBwYXJhbSBjb250ZXh0IEEgQ29udGV4dCBvYmplY3QgdXNlZCB0byBhY2Nlc3MgYXBwbGljYXRpb24gYXNzZXRzLgpAQCAtOTI4LDUxICs4MzIsMzcgQEAKICAgICAgKiBAcGFyYW0gY29udGV4dCBBIENvbnRleHQgb2JqZWN0IHVzZWQgdG8gYWNjZXNzIGFwcGxpY2F0aW9uIGFzc2V0cy4KICAgICAgKiBAcGFyYW0gYXR0cnMgQW4gQXR0cmlidXRlU2V0IHBhc3NlZCB0byBvdXIgcGFyZW50LgogICAgICAqIEBwYXJhbSBkZWZTdHlsZSBUaGUgZGVmYXVsdCBzdHlsZSByZXNvdXJjZSBJRC4KLSAgICAgKiBAcGFyYW0gamF2YXNjcmlwdEludGVyZmFjZXMgaXMgYSBNYXAgb2YgaW50YXJlZmFjZSBuYW1lcywgYXMga2V5cywgYW5kCisgICAgICogQHBhcmFtIGphdmFzY3JpcHRJbnRlcmZhY2VzIGlzIGEgTWFwIG9mIGludGVyZmFjZSBuYW1lcywgYXMga2V5cywgYW5kCiAgICAgICogb2JqZWN0IGltcGxlbWVudGluZyB0aG9zZSBpbnRlcmZhY2VzLCBhcyB2YWx1ZXMuCiAgICAgICogQGhpZGUgcGVuZGluZyBBUEkgY291bmNpbCBhcHByb3ZhbC4KICAgICAgKi8KICAgICBwcm90ZWN0ZWQgV2ViVmlldyhDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGRlZlN0eWxlLAogICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBqYXZhc2NyaXB0SW50ZXJmYWNlcykgewogICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycywgZGVmU3R5bGUpOwotICAgICAgICBpbml0KCk7CisKKyAgICAgICAgaWYgKEFjY2Vzc2liaWxpdHlNYW5hZ2VyLmdldEluc3RhbmNlKGNvbnRleHQpLmlzRW5hYmxlZCgpKSB7CisgICAgICAgICAgICBpZiAoamF2YXNjcmlwdEludGVyZmFjZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGphdmFzY3JpcHRJbnRlcmZhY2VzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBleHBvc2VBY2Nlc3NpYmlsaXR5SmF2YVNjcmlwdEFwaShqYXZhc2NyaXB0SW50ZXJmYWNlcyk7CisgICAgICAgIH0KIAogICAgICAgICBtQ2FsbGJhY2tQcm94eSA9IG5ldyBDYWxsYmFja1Byb3h5KGNvbnRleHQsIHRoaXMpOwogICAgICAgICBtVmlld01hbmFnZXIgPSBuZXcgVmlld01hbmFnZXIodGhpcyk7CiAgICAgICAgIG1XZWJWaWV3Q29yZSA9IG5ldyBXZWJWaWV3Q29yZShjb250ZXh0LCB0aGlzLCBtQ2FsbGJhY2tQcm94eSwgamF2YXNjcmlwdEludGVyZmFjZXMpOwogICAgICAgICBtRGF0YWJhc2UgPSBXZWJWaWV3RGF0YWJhc2UuZ2V0SW5zdGFuY2UoY29udGV4dCk7CiAgICAgICAgIG1TY3JvbGxlciA9IG5ldyBTY3JvbGxlcihjb250ZXh0KTsKKyAgICAgICAgbVpvb21NYW5hZ2VyID0gbmV3IFpvb21NYW5hZ2VyKHRoaXMsIG1DYWxsYmFja1Byb3h5KTsKIAorICAgICAgICAvKiBUaGUgaW5pdCBtZXRob2QgbXVzdCBmb2xsb3cgdGhlIGNyZWF0aW9uIG9mIGNlcnRhaW4gbWVtYmVyIHZhcmlhYmxlcywKKyAgICAgICAgICogc3VjaCBhcyB0aGUgbVpvb21NYW5hZ2VyLgorICAgICAgICAgKi8KKyAgICAgICAgaW5pdCgpOwogICAgICAgICB1cGRhdGVNdWx0aVRvdWNoU3VwcG9ydChjb250ZXh0KTsKICAgICB9CiAKICAgICB2b2lkIHVwZGF0ZU11bHRpVG91Y2hTdXBwb3J0KENvbnRleHQgY29udGV4dCkgewotICAgICAgICBXZWJTZXR0aW5ncyBzZXR0aW5ncyA9IGdldFNldHRpbmdzKCk7Ci0gICAgICAgIG1TdXBwb3J0TXVsdGlUb3VjaCA9IGNvbnRleHQuZ2V0UGFja2FnZU1hbmFnZXIoKS5oYXNTeXN0ZW1GZWF0dXJlKAotICAgICAgICAgICAgICAgIFBhY2thZ2VNYW5hZ2VyLkZFQVRVUkVfVE9VQ0hTQ1JFRU5fTVVMVElUT1VDSCkKLSAgICAgICAgICAgICAgICAmJiBzZXR0aW5ncy5zdXBwb3J0Wm9vbSgpICYmIHNldHRpbmdzLmdldEJ1aWx0SW5ab29tQ29udHJvbHMoKTsKLSAgICAgICAgaWYgKG1TdXBwb3J0TXVsdGlUb3VjaCAmJiAobVNjYWxlRGV0ZWN0b3IgPT0gbnVsbCkpIHsKLSAgICAgICAgICAgIG1TY2FsZURldGVjdG9yID0gbmV3IFNjYWxlR2VzdHVyZURldGVjdG9yKGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgIG5ldyBTY2FsZURldGVjdG9yTGlzdGVuZXIoKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoIW1TdXBwb3J0TXVsdGlUb3VjaCAmJiAobVNjYWxlRGV0ZWN0b3IgIT0gbnVsbCkpIHsKLSAgICAgICAgICAgIG1TY2FsZURldGVjdG9yID0gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVab29tQnV0dG9uc0VuYWJsZWQoKSB7Ci0gICAgICAgIGlmIChtWm9vbUJ1dHRvbnNDb250cm9sbGVyID09IG51bGwpIHJldHVybjsKLSAgICAgICAgYm9vbGVhbiBjYW5ab29tSW4gPSBtQWN0dWFsU2NhbGUgPCBtTWF4Wm9vbVNjYWxlOwotICAgICAgICBib29sZWFuIGNhblpvb21PdXQgPSBtQWN0dWFsU2NhbGUgPiBtTWluWm9vbVNjYWxlICYmICFtSW5ab29tT3ZlcnZpZXc7Ci0gICAgICAgIGlmICghY2FuWm9vbUluICYmICFjYW5ab29tT3V0KSB7Ci0gICAgICAgICAgICAvLyBIaWRlIHRoZSB6b29tIGluIGFuZCBvdXQgYnV0dG9ucywgYXMgd2VsbCBhcyB0aGUgZml0IHRvIHBhZ2UKLSAgICAgICAgICAgIC8vIGJ1dHRvbiwgaWYgdGhlIHBhZ2UgY2Fubm90IHpvb20KLSAgICAgICAgICAgIG1ab29tQnV0dG9uc0NvbnRyb2xsZXIuZ2V0Wm9vbUNvbnRyb2xzKCkuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gU2V0IGVhY2ggb25lIGluZGl2aWR1YWxseSwgYXMgYSBwYWdlIG1heSBiZSBhYmxlIHRvIHpvb20gaW4KLSAgICAgICAgICAgIC8vIG9yIG91dC4KLSAgICAgICAgICAgIG1ab29tQnV0dG9uc0NvbnRyb2xsZXIuc2V0Wm9vbUluRW5hYmxlZChjYW5ab29tSW4pOwotICAgICAgICAgICAgbVpvb21CdXR0b25zQ29udHJvbGxlci5zZXRab29tT3V0RW5hYmxlZChjYW5ab29tT3V0KTsKLSAgICAgICAgfQorICAgICAgICBtWm9vbU1hbmFnZXIudXBkYXRlTXVsdGlUb3VjaFN1cHBvcnQoY29udGV4dCk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIGluaXQoKSB7CkBAIC05OTIsMzQgKzg4MiwzNSBAQAogICAgICAgICAvLyB1c2Ugb25lIGxpbmUgaGVpZ2h0LCAxNiBiYXNlZCBvbiBvdXIgY3VycmVudCBkZWZhdWx0IGZvbnQsIGZvciBob3cKICAgICAgICAgLy8gZmFyIHdlIGFsbG93IGEgdG91Y2ggYmUgYXdheSBmcm9tIHRoZSBlZGdlIG9mIGEgbGluawogICAgICAgICBtTmF2U2xvcCA9IChpbnQpICgxNiAqIGRlbnNpdHkpOwotICAgICAgICAvLyBkZW5zaXR5IGFkanVzdGVkIHNjYWxlIGZhY3RvcnMKLSAgICAgICAgREVGQVVMVF9TQ0FMRV9QRVJDRU5UID0gKGludCkgKDEwMCAqIGRlbnNpdHkpOwotICAgICAgICBtRGVmYXVsdFNjYWxlID0gZGVuc2l0eTsKLSAgICAgICAgbUFjdHVhbFNjYWxlID0gZGVuc2l0eTsKLSAgICAgICAgbUludkFjdHVhbFNjYWxlID0gMSAvIGRlbnNpdHk7Ci0gICAgICAgIG1UZXh0V3JhcFNjYWxlID0gZGVuc2l0eTsKLSAgICAgICAgREVGQVVMVF9NQVhfWk9PTV9TQ0FMRSA9IDQuMGYgKiBkZW5zaXR5OwotICAgICAgICBERUZBVUxUX01JTl9aT09NX1NDQUxFID0gMC4yNWYgKiBkZW5zaXR5OwotICAgICAgICBtTWF4Wm9vbVNjYWxlID0gREVGQVVMVF9NQVhfWk9PTV9TQ0FMRTsKLSAgICAgICAgbU1pblpvb21TY2FsZSA9IERFRkFVTFRfTUlOX1pPT01fU0NBTEU7CisgICAgICAgIG1ab29tTWFuYWdlci5pbml0KGRlbnNpdHkpOwogICAgICAgICBtTWF4aW11bUZsaW5nID0gY29uZmlndXJhdGlvbi5nZXRTY2FsZWRNYXhpbXVtRmxpbmdWZWxvY2l0eSgpOwogICAgIH0KIAotICAgIC8qIHBhY2thZ2UgKi92b2lkIHVwZGF0ZURlZmF1bHRab29tRGVuc2l0eShpbnQgem9vbURlbnNpdHkpIHsKLSAgICAgICAgZmluYWwgZmxvYXQgZGVuc2l0eSA9IGdldENvbnRleHQoKS5nZXRSZXNvdXJjZXMoKS5nZXREaXNwbGF5TWV0cmljcygpLmRlbnNpdHkKLSAgICAgICAgICAgICAgICAqIDEwMCAvIHpvb21EZW5zaXR5OwotICAgICAgICBpZiAoTWF0aC5hYnMoZGVuc2l0eSAtIG1EZWZhdWx0U2NhbGUpID4gMC4wMSkgewotICAgICAgICAgICAgZmxvYXQgc2NhbGVGYWN0b3IgPSBkZW5zaXR5IC8gbURlZmF1bHRTY2FsZTsKLSAgICAgICAgICAgIC8vIGFkanVzdCB0aGUgbGltaXRzCi0gICAgICAgICAgICBtTmF2U2xvcCA9IChpbnQpICgxNiAqIGRlbnNpdHkpOwotICAgICAgICAgICAgREVGQVVMVF9TQ0FMRV9QRVJDRU5UID0gKGludCkgKDEwMCAqIGRlbnNpdHkpOwotICAgICAgICAgICAgREVGQVVMVF9NQVhfWk9PTV9TQ0FMRSA9IDQuMGYgKiBkZW5zaXR5OwotICAgICAgICAgICAgREVGQVVMVF9NSU5fWk9PTV9TQ0FMRSA9IDAuMjVmICogZGVuc2l0eTsKLSAgICAgICAgICAgIG1EZWZhdWx0U2NhbGUgPSBkZW5zaXR5OwotICAgICAgICAgICAgbU1heFpvb21TY2FsZSAqPSBzY2FsZUZhY3RvcjsKLSAgICAgICAgICAgIG1NaW5ab29tU2NhbGUgKj0gc2NhbGVGYWN0b3I7Ci0gICAgICAgICAgICBzZXROZXdab29tU2NhbGUobUFjdHVhbFNjYWxlICogc2NhbGVGYWN0b3IsIHRydWUsIGZhbHNlKTsKKyAgICAvKioKKyAgICAgKiBFeHBvc2VzIGFjY2Vzc2liaWxpdHkgQVBJcyB0byBKYXZhU2NyaXB0IGJ5IGFwcGVuZGluZyB0aGVtIHRvIHRoZSBKYXZhU2NyaXB0CisgICAgICogaW50ZXJmYWNlcyBtYXAgcHJvdmlkZWQgYnkgdGhlIFdlYlZpZXcgY2xpZW50LiBJbiBjYXNlIG9mIGNvbmZsaWN0aW5nCisgICAgICogYWxpYXMgd2l0aCB0aGUgb25lIG9mIHRoZSBhY2Nlc3NpYmlsaXR5IEFQSSB0aGUgdXNlciBzcGVjaWZpZWQgb25lIHdpbnMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gamF2YXNjcmlwdEludGVyZmFjZXMgQSBtYXAgd2l0aCBpbnRlcmZhY2VzIHRvIGJlIGV4cG9zZWQgdG8gSmF2YVNjcmlwdC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgZXhwb3NlQWNjZXNzaWJpbGl0eUphdmFTY3JpcHRBcGkoTWFwPFN0cmluZywgT2JqZWN0PiBqYXZhc2NyaXB0SW50ZXJmYWNlcykgeworICAgICAgICBpZiAoamF2YXNjcmlwdEludGVyZmFjZXMuY29udGFpbnNLZXkoQUxJQVNfQUNDRVNTSUJJTElUWV9KU19JTlRFUkZBQ0UpKSB7CisgICAgICAgICAgICBMb2cudyhMT0dUQUcsICJKYXZhU2NyaXB0IGludGVyZmFjZSBtYXBwZWQgdG8gXCIiICsgQUxJQVNfQUNDRVNTSUJJTElUWV9KU19JTlRFUkZBQ0UKKyAgICAgICAgICAgICAgICAgICAgKyAiXCIgb3ZlcnJpZGVzIHRoZSBhY2Nlc3NpYmlsaXR5IEFQSSBKYXZhU2NyaXB0IGludGVyZmFjZS4gTm8gYWNjZXNzaWJpbGl0eSIKKyAgICAgICAgICAgICAgICAgICAgKyAiQVBJIHdpbGwgYmUgZXhwb3NlZCB0byBKYXZhU2NyaXB0ISIpOworICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CisKKyAgICAgICAgLy8gZXhwb3NlIHRoZSBUVFMgZm9yIG5vdyAuLi4KKyAgICAgICAgamF2YXNjcmlwdEludGVyZmFjZXMucHV0KEFMSUFTX0FDQ0VTU0lCSUxJVFlfSlNfSU5URVJGQUNFLAorICAgICAgICAgICAgICAgIG5ldyBUZXh0VG9TcGVlY2goZ2V0Q29udGV4dCgpLCBudWxsKSk7CisgICAgfQorCisgICAgLyogcGFja2FnZSAqL3ZvaWQgdXBkYXRlRGVmYXVsdFpvb21EZW5zaXR5KGludCB6b29tRGVuc2l0eSkgeworICAgICAgICBmaW5hbCBmbG9hdCBkZW5zaXR5ID0gbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0RGlzcGxheU1ldHJpY3MoKS5kZW5zaXR5CisgICAgICAgICAgICAgICAgKiAxMDAgLyB6b29tRGVuc2l0eTsKKyAgICAgICAgbU5hdlNsb3AgPSAoaW50KSAoMTYgKiBkZW5zaXR5KTsKKyAgICAgICAgbVpvb21NYW5hZ2VyLnVwZGF0ZURlZmF1bHRab29tRGVuc2l0eShkZW5zaXR5KTsKICAgICB9CiAKICAgICAvKiBwYWNrYWdlICovIGJvb2xlYW4gb25TYXZlUGFzc3dvcmQoU3RyaW5nIHNjaGVtZVBsdXNIb3N0LCBTdHJpbmcgdXNlcm5hbWUsCkBAIC0xMTM2LDE0ICsxMDI3LDE0IEBACiAgICAgICogcmV0dXJucyB0aGUgaGVpZ2h0IG9mIHRoZSB0aXRsZWJhcnZpZXcgKGlmIGFueSkuIERvZXMgbm90IGNhcmUgYWJvdXQKICAgICAgKiBzY3JvbGxpbmcKICAgICAgKi8KLSAgICBwcml2YXRlIGludCBnZXRUaXRsZUhlaWdodCgpIHsKKyAgICBpbnQgZ2V0VGl0bGVIZWlnaHQoKSB7CiAgICAgICAgIHJldHVybiBtVGl0bGVCYXIgIT0gbnVsbCA/IG1UaXRsZUJhci5nZXRIZWlnaHQoKSA6IDA7CiAgICAgfQogCiAgICAgLyoKICAgICAgKiBSZXR1cm4gdGhlIGFtb3VudCBvZiB0aGUgdGl0bGViYXJ2aWV3IChpZiBhbnkpIHRoYXQgaXMgdmlzaWJsZQogICAgICAqLwotICAgIHByaXZhdGUgaW50IGdldFZpc2libGVUaXRsZUhlaWdodCgpIHsKKyAgICBpbnQgZ2V0VmlzaWJsZVRpdGxlSGVpZ2h0KCkgewogICAgICAgICByZXR1cm4gTWF0aC5tYXgoZ2V0VGl0bGVIZWlnaHQoKSAtIG1TY3JvbGxZLCAwKTsKICAgICB9CiAKQEAgLTE0MDQsMjkgKzEyOTUsMjMgQEAKICAgICAgICAgLy8gbm93IHVwZGF0ZSB0aGUgYnVuZGxlCiAgICAgICAgIGIucHV0SW50KCJzY3JvbGxYIiwgbVNjcm9sbFgpOwogICAgICAgICBiLnB1dEludCgic2Nyb2xsWSIsIG1TY3JvbGxZKTsKLSAgICAgICAgYi5wdXRGbG9hdCgic2NhbGUiLCBtQWN0dWFsU2NhbGUpOwotICAgICAgICBiLnB1dEZsb2F0KCJ0ZXh0d3JhcFNjYWxlIiwgbVRleHRXcmFwU2NhbGUpOwotICAgICAgICBiLnB1dEJvb2xlYW4oIm92ZXJ2aWV3IiwgbUluWm9vbU92ZXJ2aWV3KTsKKyAgICAgICAgbVpvb21NYW5hZ2VyLnNhdmVab29tU3RhdGUoYik7CiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCByZXN0b3JlSGlzdG9yeVBpY3R1cmVGaWVsZHMoUGljdHVyZSBwLCBCdW5kbGUgYikgewogICAgICAgICBpbnQgc3ggPSBiLmdldEludCgic2Nyb2xsWCIsIDApOwogICAgICAgICBpbnQgc3kgPSBiLmdldEludCgic2Nyb2xsWSIsIDApOwotICAgICAgICBmbG9hdCBzY2FsZSA9IGIuZ2V0RmxvYXQoInNjYWxlIiwgMS4wZik7CisKICAgICAgICAgbURyYXdIaXN0b3J5ID0gdHJ1ZTsKICAgICAgICAgbUhpc3RvcnlQaWN0dXJlID0gcDsKICAgICAgICAgbVNjcm9sbFggPSBzeDsKICAgICAgICAgbVNjcm9sbFkgPSBzeTsKKyAgICAgICAgbVpvb21NYW5hZ2VyLnJlc3RvcmVab29tU3RhdGUoYik7CisgICAgICAgIGZpbmFsIGZsb2F0IHNjYWxlID0gbVpvb21NYW5hZ2VyLmdldFNjYWxlKCk7CiAgICAgICAgIG1IaXN0b3J5V2lkdGggPSBNYXRoLnJvdW5kKHAuZ2V0V2lkdGgoKSAqIHNjYWxlKTsKICAgICAgICAgbUhpc3RvcnlIZWlnaHQgPSBNYXRoLnJvdW5kKHAuZ2V0SGVpZ2h0KCkgKiBzY2FsZSk7Ci0gICAgICAgIC8vIGFzIGdldFdpZHRoKCkgLyBnZXRIZWlnaHQoKSBvZiB0aGUgdmlldyBhcmUgbm90IGF2YWlsYWJsZSB5ZXQsIHNldCB1cAotICAgICAgICAvLyBtQWN0dWFsU2NhbGUsIHNvIHRoYXQgd2hlbiBvblNpemVDaGFuZ2VkKCkgaXMgY2FsbGVkLCB0aGUgcmVzdCB3aWxsCi0gICAgICAgIC8vIGJlIHNldCBjb3JyZWN0bHkKLSAgICAgICAgbUFjdHVhbFNjYWxlID0gc2NhbGU7Ci0gICAgICAgIG1JbnZBY3R1YWxTY2FsZSA9IDEgLyBzY2FsZTsKLSAgICAgICAgbVRleHRXcmFwU2NhbGUgPSBiLmdldEZsb2F0KCJ0ZXh0d3JhcFNjYWxlIiwgc2NhbGUpOwotICAgICAgICBtSW5ab29tT3ZlcnZpZXcgPSBiLmdldEJvb2xlYW4oIm92ZXJ2aWV3Iik7CisKICAgICAgICAgaW52YWxpZGF0ZSgpOwogICAgIH0KIApAQCAtMTg0OSw3ICsxNzM0LDcgQEAKICAgICAgKiBAcmV0dXJuIFRoZSBjdXJyZW50IHNjYWxlLgogICAgICAqLwogICAgIHB1YmxpYyBmbG9hdCBnZXRTY2FsZSgpIHsKLSAgICAgICAgcmV0dXJuIG1BY3R1YWxTY2FsZTsKKyAgICAgICAgcmV0dXJuIG1ab29tTWFuYWdlci5nZXRTY2FsZSgpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTg2MSw3ICsxNzQ2LDcgQEAKICAgICAgKiBAcGFyYW0gc2NhbGVJblBlcmNlbnQgVGhlIGluaXRpYWwgc2NhbGUgaW4gcGVyY2VudC4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRJbml0aWFsU2NhbGUoaW50IHNjYWxlSW5QZXJjZW50KSB7Ci0gICAgICAgIG1Jbml0aWFsU2NhbGVJblBlcmNlbnQgPSBzY2FsZUluUGVyY2VudDsKKyAgICAgICAgbVpvb21NYW5hZ2VyLnNldEluaXRpYWxTY2FsZUluUGVyY2VudChzY2FsZUluUGVyY2VudCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xODc1LDEzICsxNzYwLDcgQEAKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogICAgICAgICBjbGVhclRleHRFbnRyeShmYWxzZSk7Ci0gICAgICAgIGlmIChnZXRTZXR0aW5ncygpLmdldEJ1aWx0SW5ab29tQ29udHJvbHMoKSkgewotICAgICAgICAgICAgZ2V0Wm9vbUJ1dHRvbnNDb250cm9sbGVyKCkuc2V0VmlzaWJsZSh0cnVlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1Qcml2YXRlSGFuZGxlci5yZW1vdmVDYWxsYmFja3MobVpvb21Db250cm9sUnVubmFibGUpOwotICAgICAgICAgICAgbVByaXZhdGVIYW5kbGVyLnBvc3REZWxheWVkKG1ab29tQ29udHJvbFJ1bm5hYmxlLAotICAgICAgICAgICAgICAgICAgICBaT09NX0NPTlRST0xTX1RJTUVPVVQpOwotICAgICAgICB9CisgICAgICAgIG1ab29tTWFuYWdlci5pbnZva2Vab29tUGlja2VyKCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xOTk2LDcgKzE4NzUsNyBAQAogICAgICAgICBtc2cuc2VuZFRvVGFyZ2V0KCk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBzdGF0aWMgaW50IHBpbkxvYyhpbnQgeCwgaW50IHZpZXdNYXgsIGludCBkb2NNYXgpIHsKKyAgICBzdGF0aWMgaW50IHBpbkxvYyhpbnQgeCwgaW50IHZpZXdNYXgsIGludCBkb2NNYXgpIHsKIC8vICAgICAgICBMb2cuZChMT0dUQUcsICItLSBwaW5Mb2MgIiArIHggKyAiICIgKyB2aWV3TWF4ICsgIiAiICsgZG9jTWF4KTsKICAgICAgICAgaWYgKGRvY01heCA8IHZpZXdNYXgpIHsgICAvLyB0aGUgZG9jIGhhcyByb29tIG9uIHRoZSBzaWRlcyBmb3IgImJsYW5rIgogICAgICAgICAgICAgLy8gcGluIHRoZSBzaG9ydCBkb2N1bWVudCB0byB0aGUgdG9wL2xlZnQgb2YgdGhlIHNjcmVlbgpAQCAtMjAxMywxMiArMTg5MiwxMiBAQAogICAgIH0KIAogICAgIC8vIEV4cGVjdHMgeCBpbiB2aWV3IGNvb3JkaW5hdGVzCi0gICAgcHJpdmF0ZSBpbnQgcGluTG9jWChpbnQgeCkgeworICAgIGludCBwaW5Mb2NYKGludCB4KSB7CiAgICAgICAgIHJldHVybiBwaW5Mb2MoeCwgZ2V0Vmlld1dpZHRoKCksIGNvbXB1dGVIb3Jpem9udGFsU2Nyb2xsUmFuZ2UoKSk7CiAgICAgfQogCiAgICAgLy8gRXhwZWN0cyB5IGluIHZpZXcgY29vcmRpbmF0ZXMKLSAgICBwcml2YXRlIGludCBwaW5Mb2NZKGludCB5KSB7CisgICAgaW50IHBpbkxvY1koaW50IHkpIHsKICAgICAgICAgcmV0dXJuIHBpbkxvYyh5LCBnZXRWaWV3SGVpZ2h0V2l0aFRpdGxlKCksCiAgICAgICAgICAgICAgICAgICAgICAgY29tcHV0ZVZlcnRpY2FsU2Nyb2xsUmFuZ2UoKSArIGdldFRpdGxlSGVpZ2h0KCkpOwogICAgIH0KQEAgLTIwNjgsNyArMTk0Nyw3IEBACiAgICAgICogaGVpZ2h0LgogICAgICAqLwogICAgIHByaXZhdGUgaW50IHZpZXdUb0NvbnRlbnREaW1lbnNpb24oaW50IGQpIHsKLSAgICAgICAgcmV0dXJuIE1hdGgucm91bmQoZCAqIG1JbnZBY3R1YWxTY2FsZSk7CisgICAgICAgIHJldHVybiBNYXRoLnJvdW5kKGQgKiBtWm9vbU1hbmFnZXIuZ2V0SW52U2NhbGUoKSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0yMDk0LDcgKzE5NzMsNyBAQAogICAgICAqIFJldHVybnMgdGhlIHJlc3VsdCBhcyBhIGZsb2F0LgogICAgICAqLwogICAgIHByaXZhdGUgZmxvYXQgdmlld1RvQ29udGVudFhmKGludCB4KSB7Ci0gICAgICAgIHJldHVybiB4ICogbUludkFjdHVhbFNjYWxlOworICAgICAgICByZXR1cm4geCAqIG1ab29tTWFuYWdlci5nZXRJbnZTY2FsZSgpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMjEwMyw3ICsxOTgyLDcgQEAKICAgICAgKiBlbWJlZGRlZCBpbnRvIHRoZSBXZWJWaWV3LiBSZXR1cm5zIHRoZSByZXN1bHQgYXMgYSBmbG9hdC4KICAgICAgKi8KICAgICBwcml2YXRlIGZsb2F0IHZpZXdUb0NvbnRlbnRZZihpbnQgeSkgewotICAgICAgICByZXR1cm4gKHkgLSBnZXRUaXRsZUhlaWdodCgpKSAqIG1JbnZBY3R1YWxTY2FsZTsKKyAgICAgICAgcmV0dXJuICh5IC0gZ2V0VGl0bGVIZWlnaHQoKSkgKiBtWm9vbU1hbmFnZXIuZ2V0SW52U2NhbGUoKTsKICAgICB9CiAKICAgICAvKioKQEAgLTIxMTMsNyArMTk5Miw3IEBACiAgICAgICogaGVpZ2h0LgogICAgICAqLwogICAgIC8qcGFja2FnZSovIGludCBjb250ZW50VG9WaWV3RGltZW5zaW9uKGludCBkKSB7Ci0gICAgICAgIHJldHVybiBNYXRoLnJvdW5kKGQgKiBtQWN0dWFsU2NhbGUpOworICAgICAgICByZXR1cm4gTWF0aC5yb3VuZChkICogbVpvb21NYW5hZ2VyLmdldFNjYWxlKCkpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMjE1NCw3ICsyMDMzLDcgQEAKICAgICAvLyBDYWxsZWQgYnkgSk5JIHRvIGludmFsaWRhdGUgdGhlIFZpZXcsIGdpdmVuIHJlY3RhbmdsZSBjb29yZGluYXRlcyBpbgogICAgIC8vIGNvbnRlbnQgc3BhY2UKICAgICBwcml2YXRlIHZvaWQgdmlld0ludmFsaWRhdGUoaW50IGwsIGludCB0LCBpbnQgciwgaW50IGIpIHsKLSAgICAgICAgZmluYWwgZmxvYXQgc2NhbGUgPSBtQWN0dWFsU2NhbGU7CisgICAgICAgIGZpbmFsIGZsb2F0IHNjYWxlID0gbVpvb21NYW5hZ2VyLmdldFNjYWxlKCk7CiAgICAgICAgIGZpbmFsIGludCBkeSA9IGdldFRpdGxlSGVpZ2h0KCk7CiAgICAgICAgIGludmFsaWRhdGUoKGludClNYXRoLmZsb29yKGwgKiBzY2FsZSksCiAgICAgICAgICAgICAgICAgICAgKGludClNYXRoLmZsb29yKHQgKiBzY2FsZSkgKyBkeSwKQEAgLTIxNjUsNyArMjA0NCw3IEBACiAgICAgLy8gQ2FsbGVkIGJ5IEpOSSB0byBpbnZhbGlkYXRlIHRoZSBWaWV3IGFmdGVyIGEgZGVsYXksIGdpdmVuIHJlY3RhbmdsZQogICAgIC8vIGNvb3JkaW5hdGVzIGluIGNvbnRlbnQgc3BhY2UKICAgICBwcml2YXRlIHZvaWQgdmlld0ludmFsaWRhdGVEZWxheWVkKGxvbmcgZGVsYXksIGludCBsLCBpbnQgdCwgaW50IHIsIGludCBiKSB7Ci0gICAgICAgIGZpbmFsIGZsb2F0IHNjYWxlID0gbUFjdHVhbFNjYWxlOworICAgICAgICBmaW5hbCBmbG9hdCBzY2FsZSA9IG1ab29tTWFuYWdlci5nZXRTY2FsZSgpOwogICAgICAgICBmaW5hbCBpbnQgZHkgPSBnZXRUaXRsZUhlaWdodCgpOwogICAgICAgICBwb3N0SW52YWxpZGF0ZURlbGF5ZWQoZGVsYXksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KU1hdGguZmxvb3IobCAqIHNjYWxlKSwKQEAgLTIyMDMsMTMgKzIwODIsNyBAQAogICAgICAgICAgICAgLy8gdXBkYXRlZCB3aGVuIHdlIGdldCBvdXQgb2YgdGhhdCBtb2RlLgogICAgICAgICAgICAgaWYgKCFtRHJhd0hpc3RvcnkpIHsKICAgICAgICAgICAgICAgICAvLyByZXBpbiBvdXIgc2Nyb2xsLCB0YWtpbmcgaW50byBhY2NvdW50IHRoZSBuZXcgY29udGVudCBzaXplCi0gICAgICAgICAgICAgICAgaW50IG9sZFggPSBtU2Nyb2xsWDsKLSAgICAgICAgICAgICAgICBpbnQgb2xkWSA9IG1TY3JvbGxZOwotICAgICAgICAgICAgICAgIG1TY3JvbGxYID0gcGluTG9jWChtU2Nyb2xsWCk7Ci0gICAgICAgICAgICAgICAgbVNjcm9sbFkgPSBwaW5Mb2NZKG1TY3JvbGxZKTsKLSAgICAgICAgICAgICAgICBpZiAob2xkWCAhPSBtU2Nyb2xsWCB8fCBvbGRZICE9IG1TY3JvbGxZKSB7Ci0gICAgICAgICAgICAgICAgICAgIG9uU2Nyb2xsQ2hhbmdlZChtU2Nyb2xsWCwgbVNjcm9sbFksIG9sZFgsIG9sZFkpOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB1cGRhdGVTY3JvbGxDb29yZGluYXRlcyhwaW5Mb2NYKG1TY3JvbGxYKSwgcGluTG9jWShtU2Nyb2xsWSkpOwogICAgICAgICAgICAgICAgIGlmICghbVNjcm9sbGVyLmlzRmluaXNoZWQoKSkgewogICAgICAgICAgICAgICAgICAgICAvLyBXZSBhcmUgaW4gdGhlIG1pZGRsZSBvZiBhIHNjcm9sbC4gIFJlcGluIHRoZSBmaW5hbCBzY3JvbGwKICAgICAgICAgICAgICAgICAgICAgLy8gcG9zaXRpb24uCkBAIC0yMjIxLDc3ICsyMDk0LDEyIEBACiAgICAgICAgIGNvbnRlbnRTaXplQ2hhbmdlZCh1cGRhdGVMYXlvdXQpOwogICAgIH0KIAotICAgIHByaXZhdGUgdm9pZCBzZXROZXdab29tU2NhbGUoZmxvYXQgc2NhbGUsIGJvb2xlYW4gdXBkYXRlVGV4dFdyYXBTY2FsZSwKLSAgICAgICAgICAgIGJvb2xlYW4gZm9yY2UpIHsKLSAgICAgICAgaWYgKHNjYWxlIDwgbU1pblpvb21TY2FsZSkgewotICAgICAgICAgICAgc2NhbGUgPSBtTWluWm9vbVNjYWxlOwotICAgICAgICAgICAgLy8gc2V0IG1Jblpvb21PdmVydmlldyBmb3Igbm9uIG1vYmlsZSBzaXRlcwotICAgICAgICAgICAgaWYgKHNjYWxlIDwgbURlZmF1bHRTY2FsZSkgbUluWm9vbU92ZXJ2aWV3ID0gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIGlmIChzY2FsZSA+IG1NYXhab29tU2NhbGUpIHsKLSAgICAgICAgICAgIHNjYWxlID0gbU1heFpvb21TY2FsZTsKLSAgICAgICAgfQotICAgICAgICBpZiAodXBkYXRlVGV4dFdyYXBTY2FsZSkgewotICAgICAgICAgICAgbVRleHRXcmFwU2NhbGUgPSBzY2FsZTsKLSAgICAgICAgICAgIC8vIHJlc2V0IG1MYXN0SGVpZ2h0U2VudCB0byBmb3JjZSBWSUVXX1NJWkVfQ0hBTkdFRCBzZW50IHRvIFdlYktpdAotICAgICAgICAgICAgbUxhc3RIZWlnaHRTZW50ID0gMDsKLSAgICAgICAgfQotICAgICAgICBpZiAoc2NhbGUgIT0gbUFjdHVhbFNjYWxlIHx8IGZvcmNlKSB7Ci0gICAgICAgICAgICBpZiAobURyYXdIaXN0b3J5KSB7Ci0gICAgICAgICAgICAgICAgLy8gSWYgaGlzdG9yeSBQaWN0dXJlIGlzIGRyYXduLCBkb24ndCB1cGRhdGUgc2Nyb2xsLiBUaGV5IHdpbGwKLSAgICAgICAgICAgICAgICAvLyBiZSB1cGRhdGVkIHdoZW4gd2UgZ2V0IG91dCBvZiB0aGF0IG1vZGUuCi0gICAgICAgICAgICAgICAgaWYgKHNjYWxlICE9IG1BY3R1YWxTY2FsZSAmJiAhbVByZXZpZXdab29tT25seSkgewotICAgICAgICAgICAgICAgICAgICBtQ2FsbGJhY2tQcm94eS5vblNjYWxlQ2hhbmdlZChtQWN0dWFsU2NhbGUsIHNjYWxlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbUFjdHVhbFNjYWxlID0gc2NhbGU7Ci0gICAgICAgICAgICAgICAgbUludkFjdHVhbFNjYWxlID0gMSAvIHNjYWxlOwotICAgICAgICAgICAgICAgIHNlbmRWaWV3U2l6ZVpvb20oKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gdXBkYXRlIG91ciBzY3JvbGwgc28gd2UgZG9uJ3QgYXBwZWFyIHRvIGp1bXAKLSAgICAgICAgICAgICAgICAvLyBpLmUuIGtlZXAgdGhlIGNlbnRlciBvZiB0aGUgZG9jIGluIHRoZSBjZW50ZXIgb2YgdGhlIHZpZXcKLQotICAgICAgICAgICAgICAgIGludCBvbGRYID0gbVNjcm9sbFg7Ci0gICAgICAgICAgICAgICAgaW50IG9sZFkgPSBtU2Nyb2xsWTsKLSAgICAgICAgICAgICAgICBmbG9hdCByYXRpbyA9IHNjYWxlICogbUludkFjdHVhbFNjYWxlOyAgIC8vIG9sZCBpbnZlcnNlCi0gICAgICAgICAgICAgICAgZmxvYXQgc3ggPSByYXRpbyAqIG9sZFggKyAocmF0aW8gLSAxKSAqIG1ab29tQ2VudGVyWDsKLSAgICAgICAgICAgICAgICBmbG9hdCBzeSA9IHJhdGlvICogb2xkWSArIChyYXRpbyAtIDEpCi0gICAgICAgICAgICAgICAgICAgICAgICAqIChtWm9vbUNlbnRlclkgLSBnZXRUaXRsZUhlaWdodCgpKTsKLQotICAgICAgICAgICAgICAgIC8vIG5vdyB1cGRhdGUgb3VyIG5ldyBzY2FsZSBhbmQgaW52ZXJzZQotICAgICAgICAgICAgICAgIGlmIChzY2FsZSAhPSBtQWN0dWFsU2NhbGUgJiYgIW1QcmV2aWV3Wm9vbU9ubHkpIHsKLSAgICAgICAgICAgICAgICAgICAgbUNhbGxiYWNrUHJveHkub25TY2FsZUNoYW5nZWQobUFjdHVhbFNjYWxlLCBzY2FsZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1BY3R1YWxTY2FsZSA9IHNjYWxlOwotICAgICAgICAgICAgICAgIG1JbnZBY3R1YWxTY2FsZSA9IDEgLyBzY2FsZTsKLQotICAgICAgICAgICAgICAgIC8vIFNjYWxlIGFsbCB0aGUgY2hpbGQgdmlld3MKLSAgICAgICAgICAgICAgICBtVmlld01hbmFnZXIuc2NhbGVBbGwoKTsKLQotICAgICAgICAgICAgICAgIC8vIGFzIHdlIGRvbid0IGhhdmUgYW5pbWF0aW9uIGZvciBzY2FsaW5nLCBkb24ndCBkbyBhbmltYXRpb24KLSAgICAgICAgICAgICAgICAvLyBmb3Igc2Nyb2xsaW5nLCBhcyBpdCBjYXVzZXMgd2VpcmQgaW50ZXJtZWRpYXRlIHN0YXRlCi0gICAgICAgICAgICAgICAgLy8gICAgICAgIHBpblNjcm9sbFRvKE1hdGgucm91bmQoc3gpLCBNYXRoLnJvdW5kKHN5KSk7Ci0gICAgICAgICAgICAgICAgbVNjcm9sbFggPSBwaW5Mb2NYKE1hdGgucm91bmQoc3gpKTsKLSAgICAgICAgICAgICAgICBtU2Nyb2xsWSA9IHBpbkxvY1koTWF0aC5yb3VuZChzeSkpOwotCi0gICAgICAgICAgICAgICAgLy8gdXBkYXRlIHdlYmtpdAotICAgICAgICAgICAgICAgIGlmIChvbGRYICE9IG1TY3JvbGxYIHx8IG9sZFkgIT0gbVNjcm9sbFkpIHsKLSAgICAgICAgICAgICAgICAgICAgb25TY3JvbGxDaGFuZ2VkKG1TY3JvbGxYLCBtU2Nyb2xsWSwgb2xkWCwgb2xkWSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHNjcm9sbCBwb3NpdGlvbiBpcyBhZGp1c3RlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZQotICAgICAgICAgICAgICAgICAgICAvLyB6b29tIGFuaW1hdGlvbi4gQnV0IHdlIHdhbnQgdG8gdXBkYXRlIHRoZSBXZWJLaXQgYXQgdGhlCi0gICAgICAgICAgICAgICAgICAgIC8vIGVuZCBvZiB0aGUgem9vbSBhbmltYXRpb24uIFNlZSBjb21tZW50cyBpbiBvblNjYWxlRW5kKCkuCi0gICAgICAgICAgICAgICAgICAgIHNlbmRPdXJWaXNpYmxlUmVjdCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzZW5kVmlld1NpemVab29tKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KICAgICAvLyBVc2VkIHRvIGF2b2lkIHNlbmRpbmcgbWFueSB2aXNpYmxlIHJlY3QgbWVzc2FnZXMuCiAgICAgcHJpdmF0ZSBSZWN0IG1MYXN0VmlzaWJsZVJlY3RTZW50OwogICAgIHByaXZhdGUgUmVjdCBtTGFzdEdsb2JhbFJlY3Q7CiAKLSAgICBwcml2YXRlIFJlY3Qgc2VuZE91clZpc2libGVSZWN0KCkgewotICAgICAgICBpZiAobVByZXZpZXdab29tT25seSkgcmV0dXJuIG1MYXN0VmlzaWJsZVJlY3RTZW50OworICAgIFJlY3Qgc2VuZE91clZpc2libGVSZWN0KCkgeworICAgICAgICBpZiAobVpvb21NYW5hZ2VyLmlzUHJldmVudGluZ1dlYmtpdFVwZGF0ZXMoKSkgcmV0dXJuIG1MYXN0VmlzaWJsZVJlY3RTZW50OwogCiAgICAgICAgIFJlY3QgcmVjdCA9IG5ldyBSZWN0KCk7CiAgICAgICAgIGNhbGNPdXJDb250ZW50VmlzaWJsZVJlY3QocmVjdCk7CkBAIC0yMzI0LDkgKzIxMzIsNiBAQAogICAgICAgICBQb2ludCBwID0gbmV3IFBvaW50KCk7CiAgICAgICAgIGdldEdsb2JhbFZpc2libGVSZWN0KHIsIHApOwogICAgICAgICByLm9mZnNldCgtcC54LCAtcC55KTsKLSAgICAgICAgaWYgKG1GaW5kSXNVcCkgewotICAgICAgICAgICAgci5ib3R0b20gLT0gbUZpbmRIZWlnaHQ7Ci0gICAgICAgIH0KICAgICB9CiAKICAgICAvLyBTZXRzIHIgdG8gYmUgb3VyIHZpc2libGUgcmVjdGFuZ2xlIGluIGNvbnRlbnQgY29vcmRpbmF0ZXMKQEAgLTIzNzMsMTYgKzIxNzgsMTkgQEAKIAogICAgIC8qKgogICAgICAqIENvbXB1dGUgdW56b29tZWQgd2lkdGggYW5kIGhlaWdodCwgYW5kIGlmIHRoZXkgZGlmZmVyIGZyb20gdGhlIGxhc3QKLSAgICAgKiB2YWx1ZXMgd2Ugc2VudCwgc2VuZCB0aGVtIHRvIHdlYmtpdCAodG8gYmUgdXNlZCBoYXMgbmV3IHZpZXdwb3J0KQorICAgICAqIHZhbHVlcyB3ZSBzZW50LCBzZW5kIHRoZW0gdG8gd2Via2l0ICh0byBiZSB1c2VkIGFzIG5ldyB2aWV3cG9ydCkKKyAgICAgKgorICAgICAqIEBwYXJhbSBmb3JjZSBlbnN1cmVzIHRoYXQgdGhlIG1lc3NhZ2UgaXMgc2VudCB0byB3ZWJraXQgZXZlbiBpZiB0aGUgd2lkdGgKKyAgICAgKiBvciBoZWlnaHQgaGFzIG5vdCBjaGFuZ2VkIHNpbmNlIHRoZSBsYXN0IG1lc3NhZ2UKICAgICAgKgogICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBuZXcgdmFsdWVzIHdlcmUgc2VudAogICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBzZW5kVmlld1NpemVab29tKCkgewotICAgICAgICBpZiAobVByZXZpZXdab29tT25seSkgcmV0dXJuIGZhbHNlOworICAgIGJvb2xlYW4gc2VuZFZpZXdTaXplWm9vbShib29sZWFuIGZvcmNlKSB7CisgICAgICAgIGlmIChtWm9vbU1hbmFnZXIuaXNQcmV2ZW50aW5nV2Via2l0VXBkYXRlcygpKSByZXR1cm4gZmFsc2U7CiAKICAgICAgICAgaW50IHZpZXdXaWR0aCA9IGdldFZpZXdXaWR0aCgpOwotICAgICAgICBpbnQgbmV3V2lkdGggPSBNYXRoLnJvdW5kKHZpZXdXaWR0aCAqIG1JbnZBY3R1YWxTY2FsZSk7Ci0gICAgICAgIGludCBuZXdIZWlnaHQgPSBNYXRoLnJvdW5kKGdldFZpZXdIZWlnaHQoKSAqIG1JbnZBY3R1YWxTY2FsZSk7CisgICAgICAgIGludCBuZXdXaWR0aCA9IE1hdGgucm91bmQodmlld1dpZHRoICogbVpvb21NYW5hZ2VyLmdldEludlNjYWxlKCkpOworICAgICAgICBpbnQgbmV3SGVpZ2h0ID0gTWF0aC5yb3VuZChnZXRWaWV3SGVpZ2h0KCkgKiBtWm9vbU1hbmFnZXIuZ2V0SW52U2NhbGUoKSk7CiAgICAgICAgIC8qCiAgICAgICAgICAqIEJlY2F1c2UgdGhlIG5hdGl2ZSBzaWRlIG1heSBoYXZlIGFscmVhZHkgZG9uZSBhIGxheW91dCBiZWZvcmUgdGhlCiAgICAgICAgICAqIFZpZXcgc3lzdGVtIHdhcyBhYmxlIHRvIG1lYXN1cmUgdXMsIHdlIGhhdmUgdG8gc2VuZCBhIGhlaWdodCBvZiAwIHRvCkBAIC0yMzk1LDE5ICsyMjAzLDIwIEBACiAgICAgICAgICAgICBuZXdIZWlnaHQgPSAwOwogICAgICAgICB9CiAgICAgICAgIC8vIEF2b2lkIHNlbmRpbmcgYW5vdGhlciBtZXNzYWdlIGlmIHRoZSBkaW1lbnNpb25zIGhhdmUgbm90IGNoYW5nZWQuCi0gICAgICAgIGlmIChuZXdXaWR0aCAhPSBtTGFzdFdpZHRoU2VudCB8fCBuZXdIZWlnaHQgIT0gbUxhc3RIZWlnaHRTZW50KSB7CisgICAgICAgIGlmIChuZXdXaWR0aCAhPSBtTGFzdFdpZHRoU2VudCB8fCBuZXdIZWlnaHQgIT0gbUxhc3RIZWlnaHRTZW50IHx8IGZvcmNlKSB7CiAgICAgICAgICAgICBWaWV3U2l6ZURhdGEgZGF0YSA9IG5ldyBWaWV3U2l6ZURhdGEoKTsKICAgICAgICAgICAgIGRhdGEubVdpZHRoID0gbmV3V2lkdGg7CiAgICAgICAgICAgICBkYXRhLm1IZWlnaHQgPSBuZXdIZWlnaHQ7Ci0gICAgICAgICAgICBkYXRhLm1UZXh0V3JhcFdpZHRoID0gTWF0aC5yb3VuZCh2aWV3V2lkdGggLyBtVGV4dFdyYXBTY2FsZSk7OwotICAgICAgICAgICAgZGF0YS5tU2NhbGUgPSBtQWN0dWFsU2NhbGU7Ci0gICAgICAgICAgICBkYXRhLm1JZ25vcmVIZWlnaHQgPSBtWm9vbVNjYWxlICE9IDAgJiYgIW1IZWlnaHRDYW5NZWFzdXJlOwotICAgICAgICAgICAgZGF0YS5tQW5jaG9yWCA9IG1BbmNob3JYOwotICAgICAgICAgICAgZGF0YS5tQW5jaG9yWSA9IG1BbmNob3JZOworICAgICAgICAgICAgZGF0YS5tVGV4dFdyYXBXaWR0aCA9IE1hdGgucm91bmQodmlld1dpZHRoIC8gbVpvb21NYW5hZ2VyLmdldFRleHRXcmFwU2NhbGUoKSk7CisgICAgICAgICAgICBkYXRhLm1TY2FsZSA9IG1ab29tTWFuYWdlci5nZXRTY2FsZSgpOworICAgICAgICAgICAgZGF0YS5tSWdub3JlSGVpZ2h0ID0gbVpvb21NYW5hZ2VyLmlzRml4ZWRMZW5ndGhBbmltYXRpb25JblByb2dyZXNzKCkKKyAgICAgICAgICAgICAgICAgICAgJiYgIW1IZWlnaHRDYW5NZWFzdXJlOworICAgICAgICAgICAgZGF0YS5tQW5jaG9yWCA9IG1ab29tTWFuYWdlci5nZXREb2N1bWVudEFuY2hvclgoKTsKKyAgICAgICAgICAgIGRhdGEubUFuY2hvclkgPSBtWm9vbU1hbmFnZXIuZ2V0RG9jdW1lbnRBbmNob3JZKCk7CiAgICAgICAgICAgICBtV2ViVmlld0NvcmUuc2VuZE1lc3NhZ2UoRXZlbnRIdWIuVklFV19TSVpFX0NIQU5HRUQsIGRhdGEpOwogICAgICAgICAgICAgbUxhc3RXaWR0aFNlbnQgPSBuZXdXaWR0aDsKICAgICAgICAgICAgIG1MYXN0SGVpZ2h0U2VudCA9IG5ld0hlaWdodDsKLSAgICAgICAgICAgIG1BbmNob3JYID0gbUFuY2hvclkgPSAwOworICAgICAgICAgICAgbVpvb21NYW5hZ2VyLmNsZWFyRG9jdW1lbnRBbmNob3IoKTsKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBmYWxzZTsKQEAgLTI0MTgsMTIgKzIyMjcsMTIgQEAKICAgICAgICAgaWYgKG1EcmF3SGlzdG9yeSkgewogICAgICAgICAgICAgcmV0dXJuIG1IaXN0b3J5V2lkdGg7CiAgICAgICAgIH0gZWxzZSBpZiAobUhvcml6b250YWxTY3JvbGxCYXJNb2RlID09IFNDUk9MTEJBUl9BTFdBWVNPRkYKLSAgICAgICAgICAgICAgICAmJiAobUFjdHVhbFNjYWxlIC0gbU1pblpvb21TY2FsZSA8PSBNSU5JTVVNX1NDQUxFX0lOQ1JFTUVOVCkpIHsKKyAgICAgICAgICAgICAgICAmJiAhbVpvb21NYW5hZ2VyLmNhblpvb21PdXQoKSkgewogICAgICAgICAgICAgLy8gb25seSBob25vciB0aGUgc2Nyb2xsYmFyIG1vZGUgd2hlbiBpdCBpcyBhdCBtaW5pbXVtIHpvb20gbGV2ZWwKICAgICAgICAgICAgIHJldHVybiBjb21wdXRlSG9yaXpvbnRhbFNjcm9sbEV4dGVudCgpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgLy8gdG8gYXZvaWQgcm91bmRpbmcgZXJyb3IgY2F1c2VkIHVubmVjZXNzYXJ5IHNjcm9sbGJhciwgdXNlIGZsb29yCi0gICAgICAgICAgICByZXR1cm4gKGludCkgTWF0aC5mbG9vcihtQ29udGVudFdpZHRoICogbUFjdHVhbFNjYWxlKTsKKyAgICAgICAgICAgIHJldHVybiAoaW50KSBNYXRoLmZsb29yKG1Db250ZW50V2lkdGggKiBtWm9vbU1hbmFnZXIuZ2V0U2NhbGUoKSk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTI0MzIsMTIgKzIyNDEsMTIgQEAKICAgICAgICAgaWYgKG1EcmF3SGlzdG9yeSkgewogICAgICAgICAgICAgcmV0dXJuIG1IaXN0b3J5SGVpZ2h0OwogICAgICAgICB9IGVsc2UgaWYgKG1WZXJ0aWNhbFNjcm9sbEJhck1vZGUgPT0gU0NST0xMQkFSX0FMV0FZU09GRgotICAgICAgICAgICAgICAgICYmIChtQWN0dWFsU2NhbGUgLSBtTWluWm9vbVNjYWxlIDw9IE1JTklNVU1fU0NBTEVfSU5DUkVNRU5UKSkgeworICAgICAgICAgICAgICAgICYmICFtWm9vbU1hbmFnZXIuY2FuWm9vbU91dCgpKSB7CiAgICAgICAgICAgICAvLyBvbmx5IGhvbm9yIHRoZSBzY3JvbGxiYXIgbW9kZSB3aGVuIGl0IGlzIGF0IG1pbmltdW0gem9vbSBsZXZlbAogICAgICAgICAgICAgcmV0dXJuIGNvbXB1dGVWZXJ0aWNhbFNjcm9sbEV4dGVudCgpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgLy8gdG8gYXZvaWQgcm91bmRpbmcgZXJyb3IgY2F1c2VkIHVubmVjZXNzYXJ5IHNjcm9sbGJhciwgdXNlIGZsb29yCi0gICAgICAgICAgICByZXR1cm4gKGludCkgTWF0aC5mbG9vcihtQ29udGVudEhlaWdodCAqIG1BY3R1YWxTY2FsZSk7CisgICAgICAgICAgICByZXR1cm4gKGludCkgTWF0aC5mbG9vcihtQ29udGVudEhlaWdodCAqIG1ab29tTWFuYWdlci5nZXRTY2FsZSgpKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMjY4MiwxOSArMjQ5MSwyMiBAQAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldEZpbmRJc1VwKGJvb2xlYW4gaXNVcCkgewogICAgICAgICBtRmluZElzVXAgPSBpc1VwOwotICAgICAgICBpZiAoaXNVcCkgewotICAgICAgICAgICAgcmVjb3JkTmV3Q29udGVudFNpemUobUNvbnRlbnRXaWR0aCwgbUNvbnRlbnRIZWlnaHQgKyBtRmluZEhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgZmFsc2UpOwotICAgICAgICB9CiAgICAgICAgIGlmICgwID09IG1OYXRpdmVDbGFzcykgcmV0dXJuOyAvLyBjbGllbnQgaXNuJ3QgaW5pdGlhbGl6ZWQKICAgICAgICAgbmF0aXZlU2V0RmluZElzVXAoaXNVcCk7CiAgICAgfQogCisgICAgLyoqCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGZpbmRJbmRleCgpIHsKKyAgICAgICAgaWYgKDAgPT0gbU5hdGl2ZUNsYXNzKSByZXR1cm4gLTE7CisgICAgICAgIHJldHVybiBuYXRpdmVGaW5kSW5kZXgoKTsKKyAgICB9CisKICAgICAvLyBVc2VkIHRvIGtub3cgd2hldGhlciB0aGUgZmluZCBkaWFsb2cgaXMgb3Blbi4gIEFmZmVjdHMgd2hldGhlcgogICAgIC8vIG9yIG5vdCB3ZSBkcmF3IHRoZSBoaWdobGlnaHRzIGZvciBtYXRjaGVzLgogICAgIHByaXZhdGUgYm9vbGVhbiBtRmluZElzVXA7CiAKLSAgICBwcml2YXRlIGludCBtRmluZEhlaWdodDsKICAgICAvLyBLZWVwIHRyYWNrIG9mIHRoZSBsYXN0IHN0cmluZyBzZW50LCBzbyB3ZSBjYW4gc2VhcmNoIGFnYWluIGFmdGVyIGFuCiAgICAgLy8gb3JpZW50YXRpb24gY2hhbmdlIG9yIHRoZSBkaXNtaXNzYWwgb2YgdGhlIHNvZnQga2V5Ym9hcmQuCiAgICAgcHJpdmF0ZSBTdHJpbmcgbUxhc3RGaW5kOwpAQCAtMjc2OSw4ICsyNTgxLDYgQEAKICAgICAgICAgfQogICAgICAgICBjbGVhck1hdGNoZXMoKTsKICAgICAgICAgc2V0RmluZElzVXAoZmFsc2UpOwotICAgICAgICByZWNvcmROZXdDb250ZW50U2l6ZShtQ29udGVudFdpZHRoLCBtQ29udGVudEhlaWdodCAtIG1GaW5kSGVpZ2h0LAotICAgICAgICAgICAgICAgIGZhbHNlKTsKICAgICAgICAgLy8gTm93IHRoYXQgdGhlIGRpYWxvZyBoYXMgYmVlbiByZW1vdmVkLCBlbnN1cmUgdGhhdCB3ZSBzY3JvbGwgdG8gYQogICAgICAgICAvLyBsb2NhdGlvbiB0aGF0IGlzIG5vdCBiZXlvbmQgdGhlIGVuZCBvZiB0aGUgcGFnZS4KICAgICAgICAgcGluU2Nyb2xsVG8obVNjcm9sbFgsIG1TY3JvbGxZLCBmYWxzZSwgMCk7CkBAIC0yNzc4LDE2ICsyNTg4LDYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAaGlkZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEZpbmREaWFsb2dIZWlnaHQoaW50IGhlaWdodCkgewotICAgICAgICBpZiAoRGVidWdGbGFncy5XRUJfVklFVykgewotICAgICAgICAgICAgTG9nLnYoTE9HVEFHLCAic2V0RmluZERpYWxvZ0hlaWdodCBoZWlnaHQ9IiArIGhlaWdodCk7Ci0gICAgICAgIH0KLSAgICAgICAgbUZpbmRIZWlnaHQgPSBoZWlnaHQ7Ci0gICAgfQotCi0gICAgLyoqCiAgICAgICogUXVlcnkgdGhlIGRvY3VtZW50IHRvIHNlZSBpZiBpdCBjb250YWlucyBhbnkgaW1hZ2UgcmVmZXJlbmNlcy4gVGhlCiAgICAgICogbWVzc2FnZSBvYmplY3Qgd2lsbCBiZSBkaXNwYXRjaGVkIHdpdGggYXJnMSBiZWluZyBzZXQgdG8gMSBpZiBpbWFnZXMKICAgICAgKiB3ZXJlIGZvdW5kIGFuZCAwIGlmIHRoZSBkb2N1bWVudCBkb2VzIG5vdCByZWZlcmVuY2UgYW55IGltYWdlcy4KQEAgLTI4MTAsNiArMjYxMCwxMSBAQAogICAgICAgICAgICAgcG9zdEludmFsaWRhdGUoKTsgIC8vIFNvIHdlIGRyYXcgYWdhaW4KICAgICAgICAgICAgIGlmIChvbGRYICE9IG1TY3JvbGxYIHx8IG9sZFkgIT0gbVNjcm9sbFkpIHsKICAgICAgICAgICAgICAgICBvblNjcm9sbENoYW5nZWQobVNjcm9sbFgsIG1TY3JvbGxZLCBvbGRYLCBvbGRZKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYWJvcnRBbmltYXRpb24oKTsKKyAgICAgICAgICAgICAgICBtUHJpdmF0ZUhhbmRsZXIucmVtb3ZlTWVzc2FnZXMoUkVTVU1FX1dFQkNPUkVfUFJJT1JJVFkpOworICAgICAgICAgICAgICAgIFdlYlZpZXdDb3JlLnJlc3VtZVByaW9yaXR5KCk7CisgICAgICAgICAgICAgICAgV2ViVmlld0NvcmUucmVzdW1lVXBkYXRlUGljdHVyZShtV2ViVmlld0NvcmUpOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgc3VwZXIuY29tcHV0ZVNjcm9sbCgpOwpAQCAtMjg5OCw2ICsyNzAzLDI5IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBtUGFnZVRoYXROZWVkc1RvU2xpZGVUaXRsZUJhck9mZlNjcmVlbiA9IG51bGw7CiAgICAgICAgIH0KKworICAgICAgICBpbmplY3RBY2Nlc3NpYmlsaXR5Rm9yVXJsKHVybCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2QgaW5qZWN0cyBhY2Nlc3NpYmlsaXR5IGluIHRoZSBsb2FkZWQgZG9jdW1lbnQgaWYgYWNjZXNzaWJpbGl0eQorICAgICAqIGlzIGVuYWJsZWQuIElmIEphdmFTY3JpcHQgaXMgZW5hYmxlZCB3ZSB0cnkgdG8gaW5qZWN0IGEgVVJMIHNwZWNpZmljIHNjcmlwdC4KKyAgICAgKiBJZiBubyBVUkwgc3BlY2lmaWMgc2NyaXB0IGlzIGZvdW5kIG9yIEphdmFTY3JpcHQgaXMgZGlzYWJsZWQgd2UgZmFsbGJhY2sgdG8KKyAgICAgKiB0aGUgZGVmYXVsdCB7QGxpbmsgQWNjZXNzaWJpbGl0eUluamVjdG9yfSBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1cmwgVGhlIFVSTCBsb2FkZWQgYnkgdGhpcyB7QGxpbmsgV2ViVmlld30uCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGluamVjdEFjY2Vzc2liaWxpdHlGb3JVcmwoU3RyaW5nIHVybCkgeworICAgICAgICBpZiAoQWNjZXNzaWJpbGl0eU1hbmFnZXIuZ2V0SW5zdGFuY2UobUNvbnRleHQpLmlzRW5hYmxlZCgpKSB7CisgICAgICAgICAgICBpZiAoZ2V0U2V0dGluZ3MoKS5nZXRKYXZhU2NyaXB0RW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgbG9hZFVybChBQ0NFU1NJQklMSVRZX1NDUklQVF9DSE9PU0VSX0pBVkFTQ1JJUFQpOworICAgICAgICAgICAgfSBlbHNlIGlmIChtQWNjZXNzaWJpbGl0eUluamVjdG9yID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtQWNjZXNzaWJpbGl0eUluamVjdG9yID0gbmV3IEFjY2Vzc2liaWxpdHlJbmplY3Rvcih0aGlzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIGl0IGlzIHBvc3NpYmxlIHRoYXQgYWNjZXNzaWJpbGl0eSB3YXMgdHVybmVkIG9mZiBiZXR3ZWVuIHJlbG9hZHMKKyAgICAgICAgICAgIG1BY2Nlc3NpYmlsaXR5SW5qZWN0b3IgPSBudWxsOworICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCkBAIC0zMDE0LDcgKzI4NDIsNyBAQAogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgLy8gSWYgd2UgZG9uJ3QgcmVxdWVzdCBhIGxheW91dCwgdHJ5IHRvIHNlbmQgb3VyIHZpZXcgc2l6ZSB0byB0aGUKICAgICAgICAgICAgIC8vIG5hdGl2ZSBzaWRlIHRvIGVuc3VyZSB0aGF0IFdlYkNvcmUgaGFzIHRoZSBjb3JyZWN0IGRpbWVuc2lvbnMuCi0gICAgICAgICAgICBzZW5kVmlld1NpemVab29tKCk7CisgICAgICAgICAgICBzZW5kVmlld1NpemVab29tKGZhbHNlKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMzE0NCw3ICsyOTcyLDcgQEAKICAgICAgKiAgICAgICAgIHNldHRpbmdzLgogICAgICAqLwogICAgIHB1YmxpYyBXZWJTZXR0aW5ncyBnZXRTZXR0aW5ncygpIHsKLSAgICAgICAgcmV0dXJuIG1XZWJWaWV3Q29yZS5nZXRTZXR0aW5ncygpOworICAgICAgICByZXR1cm4gKG1XZWJWaWV3Q29yZSAhPSBudWxsKSA/IG1XZWJWaWV3Q29yZS5nZXRTZXR0aW5ncygpIDogbnVsbDsKICAgICB9CiAKICAgICAvKioKQEAgLTMyODUsNyArMzExMyw0NyBAQAogICAgICAgICBpZiAoQVVUT19SRURSQVdfSEFDSyAmJiBtQXV0b1JlZHJhdykgewogICAgICAgICAgICAgaW52YWxpZGF0ZSgpOwogICAgICAgICB9CisgICAgICAgIGlmIChpbkVkaXRpbmdNb2RlKCkpIG1XZWJUZXh0Vmlldy5vbkRyYXdTdWJzdGl0dXRlKCk7CiAgICAgICAgIG1XZWJWaWV3Q29yZS5zaWduYWxSZXBhaW50RG9uZSgpOworCisgICAgICAgIC8vIHBhaW50IHRoZSBoaWdobGlnaHQgaW4gdGhlIGVuZAorICAgICAgICBpZiAoIW1Ub3VjaEhpZ2hsaWdodFJlZ2lvbi5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIGlmIChtVG91Y2hIaWdodGxpZ2h0UGFpbnQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1Ub3VjaEhpZ2h0bGlnaHRQYWludCA9IG5ldyBQYWludCgpOworICAgICAgICAgICAgICAgIG1Ub3VjaEhpZ2h0bGlnaHRQYWludC5zZXRDb2xvcihtSGlnaHRsaWdodENvbG9yKTsKKyAgICAgICAgICAgICAgICBtVG91Y2hIaWdodGxpZ2h0UGFpbnQuc2V0QW50aUFsaWFzKHRydWUpOworICAgICAgICAgICAgICAgIG1Ub3VjaEhpZ2h0bGlnaHRQYWludC5zZXRQYXRoRWZmZWN0KG5ldyBDb3JuZXJQYXRoRWZmZWN0KAorICAgICAgICAgICAgICAgICAgICAgICAgVE9VQ0hfSElHSExJR0hUX0FSQykpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FudmFzLmRyYXdQYXRoKG1Ub3VjaEhpZ2hsaWdodFJlZ2lvbi5nZXRCb3VuZGFyeVBhdGgoKSwKKyAgICAgICAgICAgICAgICAgICAgbVRvdWNoSGlnaHRsaWdodFBhaW50KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoREVCVUdfVE9VQ0hfSElHSExJR0hUKSB7CisgICAgICAgICAgICBpZiAoZ2V0U2V0dGluZ3MoKS5nZXROYXZEdW1wKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoKG1Ub3VjaEhpZ2hsaWdodFggfCBtVG91Y2hIaWdobGlnaHRZKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChtVG91Y2hDcm9zc0hhaXJDb2xvciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtVG91Y2hDcm9zc0hhaXJDb2xvciA9IG5ldyBQYWludCgpOworICAgICAgICAgICAgICAgICAgICAgICAgbVRvdWNoQ3Jvc3NIYWlyQ29sb3Iuc2V0Q29sb3IoQ29sb3IuUkVEKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjYW52YXMuZHJhd0xpbmUobVRvdWNoSGlnaGxpZ2h0WCAtIG1OYXZTbG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ub3VjaEhpZ2hsaWdodFkgLSBtTmF2U2xvcCwgbVRvdWNoSGlnaGxpZ2h0WAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBtTmF2U2xvcCArIDEsIG1Ub3VjaEhpZ2hsaWdodFkgKyBtTmF2U2xvcAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAxLCBtVG91Y2hDcm9zc0hhaXJDb2xvcik7CisgICAgICAgICAgICAgICAgICAgIGNhbnZhcy5kcmF3TGluZShtVG91Y2hIaWdobGlnaHRYICsgbU5hdlNsb3AgKyAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ub3VjaEhpZ2hsaWdodFkgLSBtTmF2U2xvcCwgbVRvdWNoSGlnaGxpZ2h0WAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBtTmF2U2xvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVG91Y2hIaWdobGlnaHRZICsgbU5hdlNsb3AgKyAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ub3VjaENyb3NzSGFpckNvbG9yKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcmVtb3ZlVG91Y2hIaWdobGlnaHQoYm9vbGVhbiByZW1vdmVQZW5kaW5nTWVzc2FnZSkgeworICAgICAgICBpZiAocmVtb3ZlUGVuZGluZ01lc3NhZ2UpIHsKKyAgICAgICAgICAgIG1XZWJWaWV3Q29yZS5yZW1vdmVNZXNzYWdlcyhFdmVudEh1Yi5HRVRfVE9VQ0hfSElHSExJR0hUX1JFQ1RTKTsKKyAgICAgICAgfQorICAgICAgICBtV2ViVmlld0NvcmUuc2VuZE1lc3NhZ2UoRXZlbnRIdWIuUkVNT1ZFX1RPVUNIX0hJR0hMSUdIVF9SRUNUUyk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC0zMzA2LDI3ICszMTc0LDM1IEBACiAgICAgICAgICAgICAvLyBTZW5kIHRoZSBjbGljayBzbyB0aGF0IHRoZSB0ZXh0ZmllbGQgaXMgaW4gZm9jdXMKICAgICAgICAgICAgIGNlbnRlcktleVByZXNzT25UZXh0RmllbGQoKTsKICAgICAgICAgICAgIHJlYnVpbGRXZWJUZXh0VmlldygpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY2xlYXJUZXh0RW50cnkodHJ1ZSk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGluRWRpdGluZ01vZGUoKSkgewogICAgICAgICAgICAgcmV0dXJuIG1XZWJUZXh0Vmlldy5wZXJmb3JtTG9uZ0NsaWNrKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gc3VwZXIucGVyZm9ybUxvbmdDbGljaygpOwogICAgICAgICB9CisgICAgICAgIC8qIGlmIGxvbmcgY2xpY2sgYnJpbmdzIHVwIGEgY29udGV4dCBtZW51LCB0aGUgc3VwZXIgZnVuY3Rpb24KKyAgICAgICAgICogcmV0dXJucyB0cnVlIGFuZCB3ZSdyZSBkb25lLiBPdGhlcndpc2UsIG5vdGhpbmcgaGFwcGVuZWQgd2hlbgorICAgICAgICAgKiB0aGUgdXNlciBjbGlja2VkLiAqLworICAgICAgICBpZiAoc3VwZXIucGVyZm9ybUxvbmdDbGljaygpKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICAvKiBJbiB0aGUgY2FzZSB3aGVyZSB0aGUgYXBwbGljYXRpb24gaGFzbid0IGFscmVhZHkgaGFuZGxlZCB0aGUgbG9uZworICAgICAgICAgKiBjbGljayBhY3Rpb24sIGxvb2sgZm9yIGEgd29yZCB1bmRlciB0aGUgIGNsaWNrLiBJZiBvbmUgaXMgZm91bmQsCisgICAgICAgICAqIGFuaW1hdGUgdGhlIHRleHQgc2VsZWN0aW9uIGludG8gdmlldy4KKyAgICAgICAgICogRklYTUU6IG5vIGFuaW1hdGlvbiBjb2RlIHlldCAqLworICAgICAgICBpZiAobVNlbGVjdGluZ1RleHQpIHJldHVybiBmYWxzZTsgLy8gbG9uZyBjbGljayBkb2VzIG5vdGhpbmcgb24gc2VsZWN0aW9uCisgICAgICAgIGludCB4ID0gdmlld1RvQ29udGVudFgoKGludCkgbUxhc3RUb3VjaFggKyBtU2Nyb2xsWCk7CisgICAgICAgIGludCB5ID0gdmlld1RvQ29udGVudFkoKGludCkgbUxhc3RUb3VjaFkgKyBtU2Nyb2xsWSk7CisgICAgICAgIHNldFVwU2VsZWN0KCk7CisgICAgICAgIGlmIChtTmF0aXZlQ2xhc3MgIT0gMCAmJiBuYXRpdmVXb3JkU2VsZWN0aW9uKHgsIHkpKSB7CisgICAgICAgICAgICBuYXRpdmVTZXRFeHRlbmRTZWxlY3Rpb24oKTsKKyAgICAgICAgICAgIGdldFdlYkNocm9tZUNsaWVudCgpLm9uU2VsZWN0aW9uU3RhcnQoKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIG5vdGlmeVNlbGVjdERpYWxvZ0Rpc21pc3NlZCgpOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCi0gICAgYm9vbGVhbiBpbkFuaW1hdGVab29tKCkgewotICAgICAgICByZXR1cm4gbVpvb21TY2FsZSAhPSAwOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE5lZWQgdG8gYWRqdXN0IHRoZSBXZWJUZXh0VmlldyBhZnRlciBhIGNoYW5nZSBpbiB6b29tLCBzaW5jZSBtQWN0dWFsU2NhbGUKLSAgICAgKiBoYXMgY2hhbmdlZC4gIFRoaXMgaXMgZXNwZWNpYWxseSBpbXBvcnRhbnQgZm9yIHBhc3N3b3JkIGZpZWxkcywgd2hpY2ggYXJlCi0gICAgICogZHJhd24gYnkgdGhlIFdlYlRleHRWaWV3LCBzaW5jZSBpdCBjb252ZXlzIG1vcmUgaW5mb3JtYXRpb24gdGhhbiB3aGF0Ci0gICAgICogd2Via2l0IGRyYXdzLiAgVGh1cyB3ZSBuZWVkIHRvIHJlcG9zaXRpb24gaXQgdG8gc2hvdyBpbiB0aGUgY29ycmVjdAotICAgICAqIHBsYWNlLgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBtTmVlZFRvQWRqdXN0V2ViVGV4dFZpZXc7Ci0KICAgICBwcml2YXRlIGJvb2xlYW4gZGlkVXBkYXRlVGV4dFZpZXdCb3VuZHMoYm9vbGVhbiBhbGxvd0ludGVyc2VjdCkgewogICAgICAgICBSZWN0IGNvbnRlbnRCb3VuZHMgPSBuYXRpdmVGb2N1c0NhbmRpZGF0ZU5vZGVCb3VuZHMoKTsKICAgICAgICAgUmVjdCB2Qm94ID0gY29udGVudFRvVmlld1JlY3QoY29udGVudEJvdW5kcyk7CkBAIC0zMzY0LDE1ICszMjQwLDQxIEBACiAgICAgICAgIGNhbnZhcy5zZXREcmF3RmlsdGVyKG51bGwpOwogICAgIH0KIAorICAgIHByaXZhdGUgdm9pZCBvblpvb21BbmltYXRpb25TdGFydCgpIHsKKyAgICAgICAgLy8gSWYgaXQgaXMgaW4gcGFzc3dvcmQgbW9kZSwgdHVybiBpdCBvZmYgc28gaXQgZG9lcyBub3QgZHJhdyBtaXNwbGFjZWQuCisgICAgICAgIGlmIChpbkVkaXRpbmdNb2RlKCkgJiYgbmF0aXZlRm9jdXNDYW5kaWRhdGVJc1Bhc3N3b3JkKCkpIHsKKyAgICAgICAgICAgIG1XZWJUZXh0Vmlldy5zZXRJblBhc3N3b3JkKGZhbHNlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBvblpvb21BbmltYXRpb25FbmQoKSB7CisgICAgICAgIC8vIGFkanVzdCB0aGUgZWRpdCB0ZXh0IHZpZXcgaWYgbmVlZGVkCisgICAgICAgIGlmIChpbkVkaXRpbmdNb2RlKCkgJiYgZGlkVXBkYXRlVGV4dFZpZXdCb3VuZHMoZmFsc2UpICYmIG5hdGl2ZUZvY3VzQ2FuZGlkYXRlSXNQYXNzd29yZCgpKSB7CisgICAgICAgICAgICAvLyBJZiBpdCBpcyBhIHBhc3N3b3JkIGZpZWxkLCBzdGFydCBkcmF3aW5nIHRoZSBXZWJUZXh0VmlldyBvbmNlCisgICAgICAgICAgICAvLyBhZ2Fpbi4KKyAgICAgICAgICAgIG1XZWJUZXh0Vmlldy5zZXRJblBhc3N3b3JkKHRydWUpOworICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCBvbkZpeGVkTGVuZ3RoWm9vbUFuaW1hdGlvblN0YXJ0KCkgeworICAgICAgICBXZWJWaWV3Q29yZS5wYXVzZVVwZGF0ZVBpY3R1cmUoZ2V0V2ViVmlld0NvcmUoKSk7CisgICAgICAgIG9uWm9vbUFuaW1hdGlvblN0YXJ0KCk7CisgICAgfQorCisgICAgdm9pZCBvbkZpeGVkTGVuZ3RoWm9vbUFuaW1hdGlvbkVuZCgpIHsKKyAgICAgICAgV2ViVmlld0NvcmUucmVzdW1lVXBkYXRlUGljdHVyZShtV2ViVmlld0NvcmUpOworICAgICAgICBvblpvb21BbmltYXRpb25FbmQoKTsKKyAgICB9CisKICAgICBwcml2YXRlIHZvaWQgZHJhd0NvcmVBbmRDdXJzb3JSaW5nKENhbnZhcyBjYW52YXMsIGludCBjb2xvciwKICAgICAgICAgYm9vbGVhbiBkcmF3Q3Vyc29yUmluZykgewogICAgICAgICBpZiAobURyYXdIaXN0b3J5KSB7Ci0gICAgICAgICAgICBjYW52YXMuc2NhbGUobUFjdHVhbFNjYWxlLCBtQWN0dWFsU2NhbGUpOworICAgICAgICAgICAgY2FudmFzLnNjYWxlKG1ab29tTWFuYWdlci5nZXRTY2FsZSgpLCBtWm9vbU1hbmFnZXIuZ2V0U2NhbGUoKSk7CiAgICAgICAgICAgICBjYW52YXMuZHJhd1BpY3R1cmUobUhpc3RvcnlQaWN0dXJlKTsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCi0gICAgICAgIGJvb2xlYW4gYW5pbWF0ZVpvb20gPSBtWm9vbVNjYWxlICE9IDA7CisgICAgICAgIGJvb2xlYW4gYW5pbWF0ZVpvb20gPSBtWm9vbU1hbmFnZXIuaXNGaXhlZExlbmd0aEFuaW1hdGlvbkluUHJvZ3Jlc3MoKTsKICAgICAgICAgYm9vbGVhbiBhbmltYXRlU2Nyb2xsID0gKCghbVNjcm9sbGVyLmlzRmluaXNoZWQoKQogICAgICAgICAgICAgICAgIHx8IG1WZWxvY2l0eVRyYWNrZXIgIT0gbnVsbCkKICAgICAgICAgICAgICAgICAmJiAobVRvdWNoTW9kZSAhPSBUT1VDSF9EUkFHX01PREUgfHwKQEAgLTMzOTEsNTkgKzMyOTMsOSBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGlmIChhbmltYXRlWm9vbSkgewotICAgICAgICAgICAgZmxvYXQgem9vbVNjYWxlOwotICAgICAgICAgICAgaW50IGludGVydmFsID0gKGludCkgKFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpIC0gbVpvb21TdGFydCk7Ci0gICAgICAgICAgICBpZiAoaW50ZXJ2YWwgPCBaT09NX0FOSU1BVElPTl9MRU5HVEgpIHsKLSAgICAgICAgICAgICAgICBmbG9hdCByYXRpbyA9IChmbG9hdCkgaW50ZXJ2YWwgLyBaT09NX0FOSU1BVElPTl9MRU5HVEg7Ci0gICAgICAgICAgICAgICAgem9vbVNjYWxlID0gMS4wZiAvIChtSW52SW5pdGlhbFpvb21TY2FsZQotICAgICAgICAgICAgICAgICAgICAgICAgKyAobUludkZpbmFsWm9vbVNjYWxlIC0gbUludkluaXRpYWxab29tU2NhbGUpICogcmF0aW8pOwotICAgICAgICAgICAgICAgIGludmFsaWRhdGUoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgem9vbVNjYWxlID0gbVpvb21TY2FsZTsKLSAgICAgICAgICAgICAgICAvLyBzZXQgbVpvb21TY2FsZSB0byBiZSAwIGFzIHdlIGhhdmUgZG9uZSBhbmltYXRpb24KLSAgICAgICAgICAgICAgICBtWm9vbVNjYWxlID0gMDsKLSAgICAgICAgICAgICAgICBXZWJWaWV3Q29yZS5yZXN1bWVVcGRhdGVQaWN0dXJlKG1XZWJWaWV3Q29yZSk7Ci0gICAgICAgICAgICAgICAgLy8gY2FsbCBpbnZhbGlkYXRlKCkgYWdhaW4gdG8gZHJhdyB3aXRoIHRoZSBmaW5hbCBmaWx0ZXJzCi0gICAgICAgICAgICAgICAgaW52YWxpZGF0ZSgpOwotICAgICAgICAgICAgICAgIGlmIChtTmVlZFRvQWRqdXN0V2ViVGV4dFZpZXcpIHsKLSAgICAgICAgICAgICAgICAgICAgbU5lZWRUb0FkanVzdFdlYlRleHRWaWV3ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChkaWRVcGRhdGVUZXh0Vmlld0JvdW5kcyhmYWxzZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBuYXRpdmVGb2N1c0NhbmRpZGF0ZUlzUGFzc3dvcmQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgaXQgaXMgYSBwYXNzd29yZCBmaWVsZCwgc3RhcnQgZHJhd2luZyB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlYlRleHRWaWV3IG9uY2UgYWdhaW4uCi0gICAgICAgICAgICAgICAgICAgICAgICBtV2ViVGV4dFZpZXcuc2V0SW5QYXNzd29yZCh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIGNhbGN1bGF0ZSB0aGUgaW50ZXJtZWRpYXRlIHNjcm9sbCBwb3NpdGlvbi4gQXMgd2UgbmVlZCB0byB1c2UKLSAgICAgICAgICAgIC8vIHpvb21TY2FsZSwgd2UgY2FuJ3QgdXNlIHBpbkxvY1gvWSBkaXJlY3RseS4gQ29weSB0aGUgbG9naWMgaGVyZS4KLSAgICAgICAgICAgIGZsb2F0IHNjYWxlID0gem9vbVNjYWxlICogbUludkluaXRpYWxab29tU2NhbGU7Ci0gICAgICAgICAgICBpbnQgdHggPSBNYXRoLnJvdW5kKHNjYWxlICogKG1Jbml0aWFsU2Nyb2xsWCArIG1ab29tQ2VudGVyWCkKLSAgICAgICAgICAgICAgICAgICAgLSBtWm9vbUNlbnRlclgpOwotICAgICAgICAgICAgdHggPSAtcGluTG9jKHR4LCBnZXRWaWV3V2lkdGgoKSwgTWF0aC5yb3VuZChtQ29udGVudFdpZHRoCi0gICAgICAgICAgICAgICAgICAgICogem9vbVNjYWxlKSkgKyBtU2Nyb2xsWDsKLSAgICAgICAgICAgIGludCB0aXRsZUhlaWdodCA9IGdldFRpdGxlSGVpZ2h0KCk7Ci0gICAgICAgICAgICBpbnQgdHkgPSBNYXRoLnJvdW5kKHNjYWxlCi0gICAgICAgICAgICAgICAgICAgICogKG1Jbml0aWFsU2Nyb2xsWSArIG1ab29tQ2VudGVyWSAtIHRpdGxlSGVpZ2h0KQotICAgICAgICAgICAgICAgICAgICAtIChtWm9vbUNlbnRlclkgLSB0aXRsZUhlaWdodCkpOwotICAgICAgICAgICAgdHkgPSAtKHR5IDw9IHRpdGxlSGVpZ2h0ID8gTWF0aC5tYXgodHksIDApIDogcGluTG9jKHR5Ci0gICAgICAgICAgICAgICAgICAgIC0gdGl0bGVIZWlnaHQsIGdldFZpZXdIZWlnaHQoKSwgTWF0aC5yb3VuZChtQ29udGVudEhlaWdodAotICAgICAgICAgICAgICAgICAgICAqIHpvb21TY2FsZSkpICsgdGl0bGVIZWlnaHQpICsgbVNjcm9sbFk7Ci0gICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKHR4LCB0eSk7Ci0gICAgICAgICAgICBjYW52YXMuc2NhbGUoem9vbVNjYWxlLCB6b29tU2NhbGUpOwotICAgICAgICAgICAgaWYgKGluRWRpdGluZ01vZGUoKSAmJiAhbU5lZWRUb0FkanVzdFdlYlRleHRWaWV3Ci0gICAgICAgICAgICAgICAgICAgICYmIG1ab29tU2NhbGUgIT0gMCkgewotICAgICAgICAgICAgICAgIC8vIFRoZSBXZWJUZXh0VmlldyBpcyB1cC4gIEtlZXAgdHJhY2sgb2YgdGhpcyBzbyB3ZSBjYW4gYWRqdXN0Ci0gICAgICAgICAgICAgICAgLy8gaXRzIHNpemUgYW5kIHBsYWNlbWVudCB3aGVuIHdlIGZpbmlzaCB6b29taW5nCi0gICAgICAgICAgICAgICAgbU5lZWRUb0FkanVzdFdlYlRleHRWaWV3ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAvLyBJZiBpdCBpcyBpbiBwYXNzd29yZCBtb2RlLCB0dXJuIGl0IG9mZiBzbyBpdCBkb2VzIG5vdCBkcmF3Ci0gICAgICAgICAgICAgICAgLy8gbWlzcGxhY2VkLgotICAgICAgICAgICAgICAgIGlmIChuYXRpdmVGb2N1c0NhbmRpZGF0ZUlzUGFzc3dvcmQoKSkgewotICAgICAgICAgICAgICAgICAgICBtV2ViVGV4dFZpZXcuc2V0SW5QYXNzd29yZChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQorICAgICAgICAgICAgbVpvb21NYW5hZ2VyLmFuaW1hdGVab29tKGNhbnZhcyk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjYW52YXMuc2NhbGUobUFjdHVhbFNjYWxlLCBtQWN0dWFsU2NhbGUpOworICAgICAgICAgICAgY2FudmFzLnNjYWxlKG1ab29tTWFuYWdlci5nZXRTY2FsZSgpLCBtWm9vbU1hbmFnZXIuZ2V0U2NhbGUoKSk7CiAgICAgICAgIH0KIAogICAgICAgICBib29sZWFuIFVJQW5pbWF0aW9uc1J1bm5pbmcgPSBmYWxzZTsKQEAgLTM0NTYsMjUgKzMzMDgsMjUgQEAKICAgICAgICAgICAgIGludmFsaWRhdGUoKTsKICAgICAgICAgfQogICAgICAgICBtV2ViVmlld0NvcmUuZHJhd0NvbnRlbnRQaWN0dXJlKGNhbnZhcywgY29sb3IsCi0gICAgICAgICAgICAgICAgKGFuaW1hdGVab29tIHx8IG1QcmV2aWV3Wm9vbU9ubHkgfHwgVUlBbmltYXRpb25zUnVubmluZyksCisgICAgICAgICAgICAgICAgKG1ab29tTWFuYWdlci5pc1pvb21BbmltYXRpbmcoKSB8fCBVSUFuaW1hdGlvbnNSdW5uaW5nKSwKICAgICAgICAgICAgICAgICBhbmltYXRlU2Nyb2xsKTsKICAgICAgICAgaWYgKG1OYXRpdmVDbGFzcyA9PSAwKSByZXR1cm47CiAgICAgICAgIC8vIGRlY2lkZSB3aGljaCBhZG9ybm1lbnRzIHRvIGRyYXcKICAgICAgICAgaW50IGV4dHJhcyA9IERSQVdfRVhUUkFTX05PTkU7CisgICAgICAgIGlmIChEZWJ1Z0ZsYWdzLldFQl9WSUVXKSB7CisgICAgICAgICAgICBMb2cudihMT0dUQUcsICJtRmluZElzVXA9IiArIG1GaW5kSXNVcAorICAgICAgICAgICAgICAgICAgICArICIgbVNlbGVjdGluZ1RleHQ9IiArIG1TZWxlY3RpbmdUZXh0CisgICAgICAgICAgICAgICAgICAgICsgIiBuYXRpdmVQYWdlU2hvdWxkSGFuZGxlU2hpZnRBbmRBcnJvd3MoKT0iCisgICAgICAgICAgICAgICAgICAgICsgbmF0aXZlUGFnZVNob3VsZEhhbmRsZVNoaWZ0QW5kQXJyb3dzKCkKKyAgICAgICAgICAgICAgICAgICAgKyAiIGFuaW1hdGVab29tPSIgKyBhbmltYXRlWm9vbSk7CisgICAgICAgIH0KICAgICAgICAgaWYgKG1GaW5kSXNVcCkgewotICAgICAgICAgICAgLy8gV2hlbiB0aGUgRmluZERpYWxvZyBpcyB1cCwgb25seSBkcmF3IHRoZSBtYXRjaGVzIGlmIHdlIGFyZSBub3QgaW4KLSAgICAgICAgICAgIC8vIHRoZSBwcm9jZXNzIG9mIHNjcm9sbGluZyB0aGVtIGludG8gdmlldy4KLSAgICAgICAgICAgIGlmICghYW5pbWF0ZVNjcm9sbCkgewotICAgICAgICAgICAgICAgIGV4dHJhcyA9IERSQVdfRVhUUkFTX0ZJTkQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAobVNoaWZ0SXNQcmVzc2VkICYmICFuYXRpdmVGb2N1c0lzUGx1Z2luKCkpIHsKLSAgICAgICAgICAgIGlmICghYW5pbWF0ZVpvb20gJiYgIW1QcmV2aWV3Wm9vbU9ubHkpIHsKLSAgICAgICAgICAgICAgICBleHRyYXMgPSBEUkFXX0VYVFJBU19TRUxFQ1RJT047Ci0gICAgICAgICAgICAgICAgbmF0aXZlU2V0U2VsZWN0aW9uUmVnaW9uKG1Ub3VjaFNlbGVjdGlvbiB8fCBtRXh0ZW5kU2VsZWN0aW9uKTsKLSAgICAgICAgICAgICAgICBuYXRpdmVTZXRTZWxlY3Rpb25Qb2ludGVyKCFtVG91Y2hTZWxlY3Rpb24sIG1JbnZBY3R1YWxTY2FsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TZWxlY3RYLCBtU2VsZWN0WSAtIGdldFRpdGxlSGVpZ2h0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICBtRXh0ZW5kU2VsZWN0aW9uKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGV4dHJhcyA9IERSQVdfRVhUUkFTX0ZJTkQ7CisgICAgICAgIH0gZWxzZSBpZiAobVNlbGVjdGluZ1RleHQpIHsKKyAgICAgICAgICAgIGV4dHJhcyA9IERSQVdfRVhUUkFTX1NFTEVDVElPTjsKKyAgICAgICAgICAgIG5hdGl2ZVNldFNlbGVjdGlvblBvaW50ZXIobURyYXdTZWxlY3Rpb25Qb2ludGVyLAorICAgICAgICAgICAgICAgICAgICBtWm9vbU1hbmFnZXIuZ2V0SW52U2NhbGUoKSwKKyAgICAgICAgICAgICAgICAgICAgbVNlbGVjdFgsIG1TZWxlY3RZIC0gZ2V0VGl0bGVIZWlnaHQoKSk7CiAgICAgICAgIH0gZWxzZSBpZiAoZHJhd0N1cnNvclJpbmcpIHsKICAgICAgICAgICAgIGV4dHJhcyA9IERSQVdfRVhUUkFTX0NVUlNPUl9SSU5HOwogICAgICAgICB9CkBAIC0zNDgzLDExICszMzM1LDYgQEAKICAgICAgICAgaWYgKGV4dHJhcyA9PSBEUkFXX0VYVFJBU19DVVJTT1JfUklORykgewogICAgICAgICAgICAgaWYgKG1Ub3VjaE1vZGUgPT0gVE9VQ0hfU0hPUlRQUkVTU19TVEFSVF9NT0RFKSB7CiAgICAgICAgICAgICAgICAgbVRvdWNoTW9kZSA9IFRPVUNIX1NIT1JUUFJFU1NfTU9ERTsKLSAgICAgICAgICAgICAgICBIaXRUZXN0UmVzdWx0IGhpdFRlc3QgPSBnZXRIaXRUZXN0UmVzdWx0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKGhpdFRlc3QgPT0gbnVsbAotICAgICAgICAgICAgICAgICAgICAgICAgfHwgaGl0VGVzdC5tVHlwZSA9PSBIaXRUZXN0UmVzdWx0LlVOS05PV05fVFlQRSkgewotICAgICAgICAgICAgICAgICAgICBtUHJpdmF0ZUhhbmRsZXIucmVtb3ZlTWVzc2FnZXMoU1dJVENIX1RPX0xPTkdQUkVTUyk7Ci0gICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGlmIChtRm9jdXNTaXplQ2hhbmdlZCkgewpAQCAtMzUxMiw2ICszMzU5LDEwIEBACiAgICAgICAgIHJldHVybiBtRHJhd0hpc3Rvcnk7CiAgICAgfQogCisgICAgaW50IGdldEhpc3RvcnlQaWN0dXJlV2lkdGgoKSB7CisgICAgICAgIHJldHVybiAobUhpc3RvcnlQaWN0dXJlICE9IG51bGwpID8gbUhpc3RvcnlQaWN0dXJlLmdldFdpZHRoKCkgOiAwOworICAgIH0KKwogICAgIC8vIFNob3VsZCBvbmx5IGJlIGNhbGxlZCBpbiBVSSB0aHJlYWQKICAgICB2b2lkIHN3aXRjaE91dERyYXdIaXN0b3J5KCkgewogICAgICAgICBpZiAobnVsbCA9PSBtV2ViVmlld0NvcmUpIHJldHVybjsgLy8gQ2FsbGJhY2tQcm94eSBtYXkgdHJpZ2dlciB0aGlzCkBAIC0zNTY2LDcgKzM0MTcsOSBAQAogICAgICAqICBAcGFyYW0gIGVuZCAgICAgRW5kIG9mIHNlbGVjdGlvbi4KICAgICAgKi8KICAgICAvKiBwYWNrYWdlICovIHZvaWQgc2V0U2VsZWN0aW9uKGludCBzdGFydCwgaW50IGVuZCkgewotICAgICAgICBtV2ViVmlld0NvcmUuc2VuZE1lc3NhZ2UoRXZlbnRIdWIuU0VUX1NFTEVDVElPTiwgc3RhcnQsIGVuZCk7CisgICAgICAgIGlmIChtV2ViVmlld0NvcmUgIT0gbnVsbCkgeworICAgICAgICAgICAgbVdlYlZpZXdDb3JlLnNlbmRNZXNzYWdlKEV2ZW50SHViLlNFVF9TRUxFQ1RJT04sIHN0YXJ0LCBlbmQpOworICAgICAgICB9CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC0zNTg1LDEzICszNDM4LDEwIEBACiAgICAgICAgICAgICAgICAgZ2V0Q29udGV4dCgpLmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5JTlBVVF9NRVRIT0RfU0VSVklDRSk7CiAKICAgICAgICAgLy8gYnJpbmcgaXQgYmFjayB0byB0aGUgZGVmYXVsdCBzY2FsZSBzbyB0aGF0IHVzZXIgY2FuIGVudGVyIHRleHQKLSAgICAgICAgYm9vbGVhbiB6b29tID0gbUFjdHVhbFNjYWxlIDwgbURlZmF1bHRTY2FsZTsKKyAgICAgICAgYm9vbGVhbiB6b29tID0gbVpvb21NYW5hZ2VyLmdldFNjYWxlKCkgPCBtWm9vbU1hbmFnZXIuZ2V0RGVmYXVsdFNjYWxlKCk7CiAgICAgICAgIGlmICh6b29tKSB7Ci0gICAgICAgICAgICBtSW5ab29tT3ZlcnZpZXcgPSBmYWxzZTsKLSAgICAgICAgICAgIG1ab29tQ2VudGVyWCA9IG1MYXN0VG91Y2hYOwotICAgICAgICAgICAgbVpvb21DZW50ZXJZID0gbUxhc3RUb3VjaFk7Ci0gICAgICAgICAgICAvLyBkbyBub3QgY2hhbmdlIHRleHQgd3JhcCBzY2FsZSBzbyB0aGF0IHRoZXJlIGlzIG5vIHJlZmxvdwotICAgICAgICAgICAgc2V0TmV3Wm9vbVNjYWxlKG1EZWZhdWx0U2NhbGUsIGZhbHNlLCBmYWxzZSk7CisgICAgICAgICAgICBtWm9vbU1hbmFnZXIuc2V0Wm9vbUNlbnRlcihtTGFzdFRvdWNoWCwgbUxhc3RUb3VjaFkpOworICAgICAgICAgICAgbVpvb21NYW5hZ2VyLnNldFpvb21TY2FsZShtWm9vbU1hbmFnZXIuZ2V0RGVmYXVsdFNjYWxlKCksIGZhbHNlKTsKICAgICAgICAgfQogICAgICAgICBpZiAoaXNUZXh0VmlldykgewogICAgICAgICAgICAgcmVidWlsZFdlYlRleHRWaWV3KCk7CkBAIC0zODE3LDE3ICszNjY3LDE5IEBACiAgICAgICAgIC8vIEJ1YmJsZSB1cCB0aGUga2V5IGV2ZW50IGlmCiAgICAgICAgIC8vIDEuIGl0IGlzIGEgc3lzdGVtIGtleTsgb3IKICAgICAgICAgLy8gMi4gdGhlIGhvc3QgYXBwbGljYXRpb24gd2FudHMgdG8gaGFuZGxlIGl0OworICAgICAgICAvLyAzLiB0aGUgYWNjZXNzaWJpbGl0eSBpbmplY3RvciBpcyBwcmVzZW50IGFuZCB3YW50cyB0byBoYW5kbGUgaXQ7CiAgICAgICAgIGlmIChldmVudC5pc1N5c3RlbSgpCi0gICAgICAgICAgICAgICAgfHwgbUNhbGxiYWNrUHJveHkudWlPdmVycmlkZUtleUV2ZW50KGV2ZW50KSkgeworICAgICAgICAgICAgICAgIHx8IG1DYWxsYmFja1Byb3h5LnVpT3ZlcnJpZGVLZXlFdmVudChldmVudCkKKyAgICAgICAgICAgICAgICB8fCAobUFjY2Vzc2liaWxpdHlJbmplY3RvciAhPSBudWxsICYmIG1BY2Nlc3NpYmlsaXR5SW5qZWN0b3Iub25LZXlFdmVudChldmVudCkpKSB7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoa2V5Q29kZSA9PSBLZXlFdmVudC5LRVlDT0RFX1NISUZUX0xFRlQKICAgICAgICAgICAgICAgICB8fCBrZXlDb2RlID09IEtleUV2ZW50LktFWUNPREVfU0hJRlRfUklHSFQpIHsKLSAgICAgICAgICAgIGlmIChuYXRpdmVGb2N1c0lzUGx1Z2luKCkpIHsKKyAgICAgICAgICAgIGlmIChuYXRpdmVQYWdlU2hvdWxkSGFuZGxlU2hpZnRBbmRBcnJvd3MoKSkgewogICAgICAgICAgICAgICAgIG1TaGlmdElzUHJlc3NlZCA9IHRydWU7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCFuYXRpdmVDdXJzb3JXYW50c0tleUV2ZW50cygpICYmICFtU2hpZnRJc1ByZXNzZWQpIHsKLSAgICAgICAgICAgICAgICBzZXRVcFNlbGVjdFhZKCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCFuYXRpdmVDdXJzb3JXYW50c0tleUV2ZW50cygpICYmICFtU2VsZWN0aW5nVGV4dCkgeworICAgICAgICAgICAgICAgIHNldFVwU2VsZWN0KCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApAQCAtMzg0NCwxMSArMzY5NiwxMSBAQAogICAgICAgICBpZiAoa2V5Q29kZSA+PSBLZXlFdmVudC5LRVlDT0RFX0RQQURfVVAKICAgICAgICAgICAgICAgICAmJiBrZXlDb2RlIDw9IEtleUV2ZW50LktFWUNPREVfRFBBRF9SSUdIVCkgewogICAgICAgICAgICAgc3dpdGNoT3V0RHJhd0hpc3RvcnkoKTsKLSAgICAgICAgICAgIGlmIChuYXRpdmVGb2N1c0lzUGx1Z2luKCkpIHsKLSAgICAgICAgICAgICAgICBsZXRQbHVnaW5IYW5kbGVOYXZLZXkoa2V5Q29kZSwgZXZlbnQuZ2V0RXZlbnRUaW1lKCksIHRydWUpOworICAgICAgICAgICAgaWYgKG5hdGl2ZVBhZ2VTaG91bGRIYW5kbGVTaGlmdEFuZEFycm93cygpKSB7CisgICAgICAgICAgICAgICAgbGV0UGFnZUhhbmRsZU5hdktleShrZXlDb2RlLCBldmVudC5nZXRFdmVudFRpbWUoKSwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobVNoaWZ0SXNQcmVzc2VkKSB7CisgICAgICAgICAgICBpZiAobVNlbGVjdGluZ1RleHQpIHsKICAgICAgICAgICAgICAgICBpbnQgeFJhdGUgPSBrZXlDb2RlID09IEtleUV2ZW50LktFWUNPREVfRFBBRF9MRUZUCiAgICAgICAgICAgICAgICAgICAgID8gLTEgOiBrZXlDb2RlID09IEtleUV2ZW50LktFWUNPREVfRFBBRF9SSUdIVCA/IDEgOiAwOwogICAgICAgICAgICAgICAgIGludCB5UmF0ZSA9IGtleUNvZGUgPT0gS2V5RXZlbnQuS0VZQ09ERV9EUEFEX1VQID8KQEAgLTM4NjgsNyArMzcyMCw3IEBACiAgICAgICAgIGlmIChrZXlDb2RlID09IEtleUV2ZW50LktFWUNPREVfRFBBRF9DRU5URVIpIHsKICAgICAgICAgICAgIHN3aXRjaE91dERyYXdIaXN0b3J5KCk7CiAgICAgICAgICAgICBpZiAoZXZlbnQuZ2V0UmVwZWF0Q291bnQoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1TaGlmdElzUHJlc3NlZCAmJiAhbmF0aXZlRm9jdXNJc1BsdWdpbigpKSB7CisgICAgICAgICAgICAgICAgaWYgKG1TZWxlY3RpbmdUZXh0KSB7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOyAvLyBkaXNjYXJkIHByZXNzIGlmIGNvcHkgaW4gcHJvZ3Jlc3MKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgbUdvdENlbnRlckRvd24gPSB0cnVlOwpAQCAtMzg4NiwxMCArMzczOCw4IEBACiAgICAgICAgIGlmIChrZXlDb2RlICE9IEtleUV2ZW50LktFWUNPREVfU0hJRlRfTEVGVAogICAgICAgICAgICAgICAgICYmIGtleUNvZGUgIT0gS2V5RXZlbnQuS0VZQ09ERV9TSElGVF9SSUdIVCkgewogICAgICAgICAgICAgLy8gdHVybiBvZmYgY29weSBzZWxlY3QgaWYgYSBzaGlmdC1rZXkgY29tYm8gaXMgcHJlc3NlZAotICAgICAgICAgICAgbUV4dGVuZFNlbGVjdGlvbiA9IG1TaGlmdElzUHJlc3NlZCA9IGZhbHNlOwotICAgICAgICAgICAgaWYgKG1Ub3VjaE1vZGUgPT0gVE9VQ0hfU0VMRUNUX01PREUpIHsKLSAgICAgICAgICAgICAgICBtVG91Y2hNb2RlID0gVE9VQ0hfSU5JVF9NT0RFOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgc2VsZWN0aW9uRG9uZSgpOworICAgICAgICAgICAgbVNoaWZ0SXNQcmVzc2VkID0gZmFsc2U7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoZ2V0U2V0dGluZ3MoKS5nZXROYXZEdW1wKCkpIHsKQEAgLTM5NzEsMjMgKzM4MjEsMjcgQEAKICAgICAgICAgLy8gQnViYmxlIHVwIHRoZSBrZXkgZXZlbnQgaWYKICAgICAgICAgLy8gMS4gaXQgaXMgYSBzeXN0ZW0ga2V5OyBvcgogICAgICAgICAvLyAyLiB0aGUgaG9zdCBhcHBsaWNhdGlvbiB3YW50cyB0byBoYW5kbGUgaXQ7Ci0gICAgICAgIGlmIChldmVudC5pc1N5c3RlbSgpIHx8IG1DYWxsYmFja1Byb3h5LnVpT3ZlcnJpZGVLZXlFdmVudChldmVudCkpIHsKKyAgICAgICAgLy8gMy4gdGhlIGFjY2Vzc2liaWxpdHkgaW5qZWN0b3IgaXMgcHJlc2VudCBhbmQgd2FudHMgdG8gaGFuZGxlIGl0OworICAgICAgICBpZiAoZXZlbnQuaXNTeXN0ZW0oKQorICAgICAgICAgICAgICAgIHx8IG1DYWxsYmFja1Byb3h5LnVpT3ZlcnJpZGVLZXlFdmVudChldmVudCkKKyAgICAgICAgICAgICAgICB8fCAobUFjY2Vzc2liaWxpdHlJbmplY3RvciAhPSBudWxsICYmIG1BY2Nlc3NpYmlsaXR5SW5qZWN0b3Iub25LZXlFdmVudChldmVudCkpKSB7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoa2V5Q29kZSA9PSBLZXlFdmVudC5LRVlDT0RFX1NISUZUX0xFRlQKICAgICAgICAgICAgICAgICB8fCBrZXlDb2RlID09IEtleUV2ZW50LktFWUNPREVfU0hJRlRfUklHSFQpIHsKLSAgICAgICAgICAgIGlmIChuYXRpdmVGb2N1c0lzUGx1Z2luKCkpIHsKKyAgICAgICAgICAgIGlmIChuYXRpdmVQYWdlU2hvdWxkSGFuZGxlU2hpZnRBbmRBcnJvd3MoKSkgewogICAgICAgICAgICAgICAgIG1TaGlmdElzUHJlc3NlZCA9IGZhbHNlOwotICAgICAgICAgICAgfSBlbHNlIGlmIChjb21taXRDb3B5KCkpIHsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoY29weVNlbGVjdGlvbigpKSB7CisgICAgICAgICAgICAgICAgc2VsZWN0aW9uRG9uZSgpOwogICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgaWYgKGtleUNvZGUgPj0gS2V5RXZlbnQuS0VZQ09ERV9EUEFEX1VQCiAgICAgICAgICAgICAgICAgJiYga2V5Q29kZSA8PSBLZXlFdmVudC5LRVlDT0RFX0RQQURfUklHSFQpIHsKLSAgICAgICAgICAgIGlmIChuYXRpdmVGb2N1c0lzUGx1Z2luKCkpIHsKLSAgICAgICAgICAgICAgICBsZXRQbHVnaW5IYW5kbGVOYXZLZXkoa2V5Q29kZSwgZXZlbnQuZ2V0RXZlbnRUaW1lKCksIGZhbHNlKTsKKyAgICAgICAgICAgIGlmIChuYXRpdmVQYWdlU2hvdWxkSGFuZGxlU2hpZnRBbmRBcnJvd3MoKSkgeworICAgICAgICAgICAgICAgIGxldFBhZ2VIYW5kbGVOYXZLZXkoa2V5Q29kZSwgZXZlbnQuZ2V0RXZlbnRUaW1lKCksIGZhbHNlKTsKICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vIGFsd2F5cyBoYW5kbGUgdGhlIG5hdmlnYXRpb24ga2V5cyBpbiB0aGUgVUkgdGhyZWFkCkBAIC00MDAwLDExICszODU0LDEzIEBACiAgICAgICAgICAgICBtUHJpdmF0ZUhhbmRsZXIucmVtb3ZlTWVzc2FnZXMoTE9OR19QUkVTU19DRU5URVIpOwogICAgICAgICAgICAgbUdvdENlbnRlckRvd24gPSBmYWxzZTsKIAotICAgICAgICAgICAgaWYgKG1TaGlmdElzUHJlc3NlZCAmJiAhbmF0aXZlRm9jdXNJc1BsdWdpbigpKSB7CisgICAgICAgICAgICBpZiAobVNlbGVjdGluZ1RleHQpIHsKICAgICAgICAgICAgICAgICBpZiAobUV4dGVuZFNlbGVjdGlvbikgewotICAgICAgICAgICAgICAgICAgICBjb21taXRDb3B5KCk7CisgICAgICAgICAgICAgICAgICAgIGNvcHlTZWxlY3Rpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uRG9uZSgpOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIG1FeHRlbmRTZWxlY3Rpb24gPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBuYXRpdmVTZXRFeHRlbmRTZWxlY3Rpb24oKTsKICAgICAgICAgICAgICAgICAgICAgaW52YWxpZGF0ZSgpOyAvLyBkcmF3IHRoZSBpLWJlYW0gaW5zdGVhZCBvZiB0aGUgYXJyb3cKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7IC8vIGRpc2NhcmQgcHJlc3MgaWYgY29weSBpbiBwcm9ncmVzcwpAQCAtNDA0OSw5ICszOTA1LDE4IEBACiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICBwcml2YXRlIHZvaWQgc2V0VXBTZWxlY3RYWSgpIHsKKyAgICAvKioKKyAgICAgKiBAaGlkZSBwZW5kaW5nIEFQSSBjb3VuY2lsIGFwcHJvdmFsLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFVwU2VsZWN0KCkgeworICAgICAgICBpZiAoMCA9PSBtTmF0aXZlQ2xhc3MpIHJldHVybjsgLy8gY2xpZW50IGlzbid0IGluaXRpYWxpemVkCisgICAgICAgIGlmIChpbkZ1bGxTY3JlZW5Nb2RlKCkpIHJldHVybjsKKyAgICAgICAgaWYgKG1TZWxlY3RpbmdUZXh0KSByZXR1cm47CiAgICAgICAgIG1FeHRlbmRTZWxlY3Rpb24gPSBmYWxzZTsKLSAgICAgICAgbVNoaWZ0SXNQcmVzc2VkID0gdHJ1ZTsKKyAgICAgICAgbVNlbGVjdGluZ1RleHQgPSBtRHJhd1NlbGVjdGlvblBvaW50ZXIgPSB0cnVlOworICAgICAgICAvLyBkb24ndCBsZXQgdGhlIHBpY3R1cmUgY2hhbmdlIGR1cmluZyB0ZXh0IHNlbGVjdGlvbgorICAgICAgICBXZWJWaWV3Q29yZS5wYXVzZVVwZGF0ZVBpY3R1cmUobVdlYlZpZXdDb3JlKTsKKyAgICAgICAgbmF0aXZlUmVzZXRTZWxlY3Rpb24oKTsKICAgICAgICAgaWYgKG5hdGl2ZUhhc0N1cnNvck5vZGUoKSkgewogICAgICAgICAgICAgUmVjdCByZWN0ID0gbmF0aXZlQ3Vyc29yTm9kZUJvdW5kcygpOwogICAgICAgICAgICAgbVNlbGVjdFggPSBjb250ZW50VG9WaWV3WChyZWN0LmxlZnQpOwpAQCAtNDA3MSw0MCArMzkzNiw4MiBAQAogICAgICAqIERvIG5vdCByZWx5IG9uIHRoaXMgZnVuY3Rpb25hbGl0eTsgaXQgd2lsbCBiZSBkZXByZWNhdGVkIGluIHRoZSBmdXR1cmUuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgZW11bGF0ZVNoaWZ0SGVsZCgpIHsKLSAgICAgICAgaWYgKDAgPT0gbU5hdGl2ZUNsYXNzKSByZXR1cm47IC8vIGNsaWVudCBpc24ndCBpbml0aWFsaXplZAotICAgICAgICBzZXRVcFNlbGVjdFhZKCk7CisgICAgICAgIHNldFVwU2VsZWN0KCk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBib29sZWFuIGNvbW1pdENvcHkoKSB7CisgICAgLyoqCisgICAgICogQGhpZGUgcGVuZGluZyBBUEkgY291bmNpbCBhcHByb3ZhbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZWxlY3RBbGwoKSB7CisgICAgICAgIGlmICgwID09IG1OYXRpdmVDbGFzcykgcmV0dXJuOyAvLyBjbGllbnQgaXNuJ3QgaW5pdGlhbGl6ZWQKKyAgICAgICAgaWYgKGluRnVsbFNjcmVlbk1vZGUoKSkgcmV0dXJuOworICAgICAgICBpZiAoIW1TZWxlY3RpbmdUZXh0KSBzZXRVcFNlbGVjdCgpOworICAgICAgICBuYXRpdmVTZWxlY3RBbGwoKTsKKyAgICAgICAgbURyYXdTZWxlY3Rpb25Qb2ludGVyID0gZmFsc2U7CisgICAgICAgIG1FeHRlbmRTZWxlY3Rpb24gPSB0cnVlOworICAgICAgICBpbnZhbGlkYXRlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQGhpZGUgcGVuZGluZyBBUEkgY291bmNpbCBhcHByb3ZhbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBzZWxlY3REaWFsb2dJc1VwKCkgeworICAgICAgICByZXR1cm4gbVNlbGVjdGluZ1RleHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQGhpZGUgcGVuZGluZyBBUEkgY291bmNpbCBhcHByb3ZhbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBub3RpZnlTZWxlY3REaWFsb2dEaXNtaXNzZWQoKSB7CisgICAgICAgIG1TZWxlY3RpbmdUZXh0ID0gZmFsc2U7CisgICAgICAgIFdlYlZpZXdDb3JlLnJlc3VtZVVwZGF0ZVBpY3R1cmUobVdlYlZpZXdDb3JlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAaGlkZSBwZW5kaW5nIEFQSSBjb3VuY2lsIGFwcHJvdmFsLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNlbGVjdGlvbkRvbmUoKSB7CisgICAgICAgIGlmIChtU2VsZWN0aW5nVGV4dCkgeworICAgICAgICAgICAgZ2V0V2ViQ2hyb21lQ2xpZW50KCkub25TZWxlY3Rpb25Eb25lKCk7CisgICAgICAgICAgICBpbnZhbGlkYXRlKCk7IC8vIHJlZHJhdyB3aXRob3V0IHNlbGVjdGlvbgorICAgICAgICAgICAgbm90aWZ5U2VsZWN0RGlhbG9nRGlzbWlzc2VkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAaGlkZSBwZW5kaW5nIEFQSSBjb3VuY2lsIGFwcHJvdmFsLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGNvcHlTZWxlY3Rpb24oKSB7CiAgICAgICAgIGJvb2xlYW4gY29waWVkU29tZXRoaW5nID0gZmFsc2U7Ci0gICAgICAgIGlmIChtRXh0ZW5kU2VsZWN0aW9uKSB7Ci0gICAgICAgICAgICBTdHJpbmcgc2VsZWN0aW9uID0gbmF0aXZlR2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgICAgICBpZiAoc2VsZWN0aW9uICE9ICIiKSB7Ci0gICAgICAgICAgICAgICAgaWYgKERlYnVnRmxhZ3MuV0VCX1ZJRVcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLnYoTE9HVEFHLCAiY29tbWl0Q29weSBcIiIgKyBzZWxlY3Rpb24gKyAiXCIiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgVG9hc3QubWFrZVRleHQobUNvbnRleHQKLSAgICAgICAgICAgICAgICAgICAgICAgICwgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHJpbmcudGV4dF9jb3BpZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICwgVG9hc3QuTEVOR1RIX1NIT1JUKS5zaG93KCk7Ci0gICAgICAgICAgICAgICAgY29waWVkU29tZXRoaW5nID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBJQ2xpcGJvYXJkIGNsaXAgPSBJQ2xpcGJvYXJkLlN0dWIuYXNJbnRlcmZhY2UoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VydmljZU1hbmFnZXIuZ2V0U2VydmljZSgiY2xpcGJvYXJkIikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaXAuc2V0Q2xpcGJvYXJkVGV4dChzZWxlY3Rpb24pOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmUoTE9HVEFHLCAiQ2xpcGJvYXJkIGZhaWxlZCIsIGUpOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIHNlbGVjdGlvbiA9IGdldFNlbGVjdGlvbigpOworICAgICAgICBpZiAoc2VsZWN0aW9uICE9ICIiKSB7CisgICAgICAgICAgICBpZiAoRGVidWdGbGFncy5XRUJfVklFVykgeworICAgICAgICAgICAgICAgIExvZy52KExPR1RBRywgImNvcHlTZWxlY3Rpb24gXCIiICsgc2VsZWN0aW9uICsgIlwiIik7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtRXh0ZW5kU2VsZWN0aW9uID0gZmFsc2U7CisgICAgICAgICAgICBUb2FzdC5tYWtlVGV4dChtQ29udGV4dAorICAgICAgICAgICAgICAgICAgICAsIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3RyaW5nLnRleHRfY29waWVkCisgICAgICAgICAgICAgICAgICAgICwgVG9hc3QuTEVOR1RIX1NIT1JUKS5zaG93KCk7CisgICAgICAgICAgICBjb3BpZWRTb21ldGhpbmcgPSB0cnVlOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBJQ2xpcGJvYXJkIGNsaXAgPSBJQ2xpcGJvYXJkLlN0dWIuYXNJbnRlcmZhY2UoCisgICAgICAgICAgICAgICAgICAgICAgICBTZXJ2aWNlTWFuYWdlci5nZXRTZXJ2aWNlKCJjbGlwYm9hcmQiKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBjbGlwLnNldENsaXBib2FyZFRleHQoc2VsZWN0aW9uKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cuZShMT0dUQUcsICJDbGlwYm9hcmQgZmFpbGVkIiwgZSk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgbVNoaWZ0SXNQcmVzc2VkID0gZmFsc2U7CiAgICAgICAgIGludmFsaWRhdGUoKTsgLy8gcmVtb3ZlIHNlbGVjdGlvbiByZWdpb24gYW5kIHBvaW50ZXIKLSAgICAgICAgaWYgKG1Ub3VjaE1vZGUgPT0gVE9VQ0hfU0VMRUNUX01PREUpIHsKLSAgICAgICAgICAgIG1Ub3VjaE1vZGUgPSBUT1VDSF9JTklUX01PREU7Ci0gICAgICAgIH0KICAgICAgICAgcmV0dXJuIGNvcGllZFNvbWV0aGluZzsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBAaGlkZSBwZW5kaW5nIEFQSSBjb3VuY2lsIGFwcHJvdmFsLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2VsZWN0aW9uKCkgeworICAgICAgICBpZiAobU5hdGl2ZUNsYXNzID09IDApIHJldHVybiAiIjsKKyAgICAgICAgcmV0dXJuIG5hdGl2ZUdldFNlbGVjdGlvbigpOworICAgIH0KKwogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIG9uQXR0YWNoZWRUb1dpbmRvdygpIHsKICAgICAgICAgc3VwZXIub25BdHRhY2hlZFRvV2luZG93KCk7CkBAIC00MTE0LDExICs0MDIxLDIxIEBACiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgb25EZXRhY2hlZEZyb21XaW5kb3coKSB7CiAgICAgICAgIGNsZWFyVGV4dEVudHJ5KGZhbHNlKTsKLSAgICAgICAgZGlzbWlzc1pvb21Db250cm9sKCk7CisgICAgICAgIG1ab29tTWFuYWdlci5kaXNtaXNzWm9vbVBpY2tlcigpOwogICAgICAgICBpZiAoaGFzV2luZG93Rm9jdXMoKSkgc2V0QWN0aXZlKGZhbHNlKTsKICAgICAgICAgc3VwZXIub25EZXRhY2hlZEZyb21XaW5kb3coKTsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvblZpc2liaWxpdHlDaGFuZ2VkKFZpZXcgY2hhbmdlZFZpZXcsIGludCB2aXNpYmlsaXR5KSB7CisgICAgICAgIHN1cGVyLm9uVmlzaWJpbGl0eUNoYW5nZWQoY2hhbmdlZFZpZXcsIHZpc2liaWxpdHkpOworICAgICAgICAvLyBUaGUgem9vbU1hbmFnZXIgbWF5IGJlIG51bGwgaWYgdGhlIHdlYnZpZXcgaXMgY3JlYXRlZCBmcm9tIFhNTCB0aGF0CisgICAgICAgIC8vIHNwZWNpZmllcyB0aGUgdmlldydzIHZpc2liaWxpdHkgcGFyYW0gYXMgbm90IHZpc2libGUgKHNlZSBodHRwOi8vYi8yNzk0ODQxKQorICAgICAgICBpZiAodmlzaWJpbGl0eSAhPSBWaWV3LlZJU0lCTEUgJiYgbVpvb21NYW5hZ2VyICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1ab29tTWFuYWdlci5kaXNtaXNzWm9vbVBpY2tlcigpOworICAgICAgICB9CisgICAgfQorCiAgICAgLyoqCiAgICAgICogQGRlcHJlY2F0ZWQgV2ViVmlldyBubyBsb25nZXIgbmVlZHMgdG8gaW1wbGVtZW50CiAgICAgICogVmlld0dyb3VwLk9uSGllcmFyY2h5Q2hhbmdlTGlzdGVuZXIuICBUaGlzIG1ldGhvZCBkb2VzIG5vdGhpbmcgbm93LgpAQCAtNDE2MywxNyArNDA4MCwxNCBAQAogICAgICAgICAgICAgICAgIC8vIGZhbHNlIGZvciB0aGUgZmlyc3QgcGFyYW1ldGVyCiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAobVdlYlZpZXdDb3JlICE9IG51bGwgJiYgZ2V0U2V0dGluZ3MoKS5nZXRCdWlsdEluWm9vbUNvbnRyb2xzKCkKLSAgICAgICAgICAgICAgICAgICAgJiYgKG1ab29tQnV0dG9uc0NvbnRyb2xsZXIgPT0gbnVsbCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICFtWm9vbUJ1dHRvbnNDb250cm9sbGVyLmlzVmlzaWJsZSgpKSkgeworICAgICAgICAgICAgaWYgKCFtWm9vbU1hbmFnZXIuaXNab29tUGlja2VyVmlzaWJsZSgpKSB7CiAgICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgKiBUaGUgem9vbSBjb250cm9scyBjb21lIGluIHRoZWlyIG93biB3aW5kb3csIHNvIG91ciB3aW5kb3cKLSAgICAgICAgICAgICAgICAgKiBsb3NlcyBmb2N1cy4gT3VyIHBvbGljeSBpcyB0byBub3QgZHJhdyB0aGUgY3Vyc29yIHJpbmcgaWYKLSAgICAgICAgICAgICAgICAgKiBvdXIgd2luZG93IGlzIG5vdCBmb2N1c2VkLCBidXQgdGhpcyBpcyBhbiBleGNlcHRpb24gc2luY2UKKyAgICAgICAgICAgICAgICAgKiBUaGUgZXh0ZXJuYWwgem9vbSBjb250cm9scyBjb21lIGluIHRoZWlyIG93biB3aW5kb3csIHNvIG91cgorICAgICAgICAgICAgICAgICAqIHdpbmRvdyBsb3NlcyBmb2N1cy4gT3VyIHBvbGljeSBpcyB0byBub3QgZHJhdyB0aGUgY3Vyc29yIHJpbmcKKyAgICAgICAgICAgICAgICAgKiBpZiBvdXIgd2luZG93IGlzIG5vdCBmb2N1c2VkLCBidXQgdGhpcyBpcyBhbiBleGNlcHRpb24gc2luY2UKICAgICAgICAgICAgICAgICAgKiB0aGUgdXNlciBjYW4gc3RpbGwgbmF2aWdhdGUgdGhlIHdlYiBwYWdlIHdpdGggdGhlIHpvb20KICAgICAgICAgICAgICAgICAgKiBjb250cm9scyBzaG93aW5nLgogICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIC8vIElmIG91ciB3aW5kb3cgaGFzIGxvc3QgZm9jdXMsIHN0b3AgZHJhd2luZyB0aGUgY3Vyc29yIHJpbmcKICAgICAgICAgICAgICAgICBtRHJhd0N1cnNvclJpbmcgPSBmYWxzZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1Hb3RLZXlEb3duID0gZmFsc2U7CkBAIC00MjYyLDgxICs0MTc2LDI0IEBACiAgICAgICAgICAgICAvLyBzeXN0ZW0gd29uJ3QgY2FsbCBvblNpemVDaGFuZ2VkIGlmIHRoZSBkaW1lbnNpb24gaXMgbm90IGNoYW5nZWQuCiAgICAgICAgICAgICAvLyBJbiB0aGlzIGNhc2UsIHdlIG5lZWQgdG8gY2FsbCBzZW5kVmlld1NpemVab29tKCkgZXhwbGljaXRseSB0bwogICAgICAgICAgICAgLy8gbm90aWZ5IHRoZSBXZWJLaXQgYWJvdXQgdGhlIG5ldyBkaW1lbnNpb25zLgotICAgICAgICAgICAgc2VuZFZpZXdTaXplWm9vbSgpOworICAgICAgICAgICAgc2VuZFZpZXdTaXplWm9vbShmYWxzZSk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIGNoYW5nZWQ7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUG9zdFNjYWxlIGltcGxlbWVudHMgUnVubmFibGUgewotICAgICAgICBmaW5hbCBXZWJWaWV3IG1XZWJWaWV3OwotICAgICAgICBmaW5hbCBib29sZWFuIG1VcGRhdGVUZXh0V3JhcDsKLQotICAgICAgICBwdWJsaWMgUG9zdFNjYWxlKFdlYlZpZXcgd2ViVmlldywgYm9vbGVhbiB1cGRhdGVUZXh0V3JhcCkgewotICAgICAgICAgICAgbVdlYlZpZXcgPSB3ZWJWaWV3OwotICAgICAgICAgICAgbVVwZGF0ZVRleHRXcmFwID0gdXBkYXRlVGV4dFdyYXA7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICBpZiAobVdlYlZpZXcubVdlYlZpZXdDb3JlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyB3ZSBhbHdheXMgZm9yY2UsIGluIGNhc2Ugb3VyIGhlaWdodCBjaGFuZ2VkLCBpbiB3aGljaCBjYXNlIHdlCi0gICAgICAgICAgICAgICAgLy8gc3RpbGwgd2FudCB0byBzZW5kIHRoZSBub3RpZmljYXRpb24gb3ZlciB0byB3ZWJraXQuCi0gICAgICAgICAgICAgICAgbVdlYlZpZXcuc2V0TmV3Wm9vbVNjYWxlKG1XZWJWaWV3Lm1BY3R1YWxTY2FsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1VcGRhdGVUZXh0V3JhcCwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgLy8gdXBkYXRlIHRoZSB6b29tIGJ1dHRvbnMgYXMgdGhlIHNjYWxlIGNhbiBiZSBjaGFuZ2VkCi0gICAgICAgICAgICAgICAgaWYgKG1XZWJWaWV3LmdldFNldHRpbmdzKCkuZ2V0QnVpbHRJblpvb21Db250cm9scygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1XZWJWaWV3LnVwZGF0ZVpvb21CdXR0b25zRW5hYmxlZCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIG9uU2l6ZUNoYW5nZWQoaW50IHcsIGludCBoLCBpbnQgb3csIGludCBvaCkgewogICAgICAgICBzdXBlci5vblNpemVDaGFuZ2VkKHcsIGgsIG93LCBvaCk7Ci0gICAgICAgIC8vIENlbnRlciB6b29taW5nIHRvIHRoZSBjZW50ZXIgb2YgdGhlIHNjcmVlbi4KLSAgICAgICAgaWYgKG1ab29tU2NhbGUgPT0gMCkgeyAvLyB1bmxlc3Mgd2UncmUgYWxyZWFkeSB6b29taW5nCi0gICAgICAgICAgICAvLyBUbyBhbmNob3IgYXQgdG9wIGxlZnQgY29ybmVyLgotICAgICAgICAgICAgbVpvb21DZW50ZXJYID0gMDsKLSAgICAgICAgICAgIG1ab29tQ2VudGVyWSA9IGdldFZpc2libGVUaXRsZUhlaWdodCgpOwotICAgICAgICAgICAgbUFuY2hvclggPSB2aWV3VG9Db250ZW50WCgoaW50KSBtWm9vbUNlbnRlclggKyBtU2Nyb2xsWCk7Ci0gICAgICAgICAgICBtQW5jaG9yWSA9IHZpZXdUb0NvbnRlbnRZKChpbnQpIG1ab29tQ2VudGVyWSArIG1TY3JvbGxZKTsKLSAgICAgICAgfQogCiAgICAgICAgIC8vIGFkanVzdCB0aGUgbWF4IHZpZXdwb3J0IHdpZHRoIGRlcGVuZGluZyBvbiB0aGUgdmlldyBkaW1lbnNpb25zLiBUaGlzCiAgICAgICAgIC8vIGlzIHRvIGVuc3VyZSB0aGUgc2NhbGluZyBpcyBub3QgZ29pbmcgaW5zYW5lLiBTbyBkbyBub3Qgc2hyaW5rIGl0IGlmCiAgICAgICAgIC8vIHRoZSB2aWV3IHNpemUgaXMgdGVtcG9yYXJpbHkgc21hbGxlciwgZS5nLiB3aGVuIHNvZnQga2V5Ym9hcmQgaXMgdXAuCi0gICAgICAgIGludCBuZXdNYXhWaWV3cG9ydFdpZHRoID0gKGludCkgKE1hdGgubWF4KHcsIGgpIC8gREVGQVVMVF9NSU5fWk9PTV9TQ0FMRSk7CisgICAgICAgIGludCBuZXdNYXhWaWV3cG9ydFdpZHRoID0gKGludCkgKE1hdGgubWF4KHcsIGgpIC8gbVpvb21NYW5hZ2VyLmdldERlZmF1bHRNaW5ab29tU2NhbGUoKSk7CiAgICAgICAgIGlmIChuZXdNYXhWaWV3cG9ydFdpZHRoID4gc01heFZpZXdwb3J0V2lkdGgpIHsKICAgICAgICAgICAgIHNNYXhWaWV3cG9ydFdpZHRoID0gbmV3TWF4Vmlld3BvcnRXaWR0aDsKICAgICAgICAgfQogCi0gICAgICAgIC8vIHVwZGF0ZSBtTWluWm9vbVNjYWxlIGlmIHRoZSBtaW5pbXVtIHpvb20gc2NhbGUgaXMgbm90IGZpeGVkCi0gICAgICAgIGlmICghbU1pblpvb21TY2FsZUZpeGVkKSB7Ci0gICAgICAgICAgICAvLyB3aGVuIGNoYW5nZSBmcm9tIG5hcnJvdyBzY3JlZW4gdG8gd2lkZSBzY3JlZW4sIHRoZSBuZXcgdmlld1dpZHRoCi0gICAgICAgICAgICAvLyBjYW4gYmUgd2lkZXIgdGhhbiB0aGUgb2xkIGNvbnRlbnQgd2lkdGguIFdlIGxpbWl0IHRoZSBtaW5pbXVtCi0gICAgICAgICAgICAvLyBzY2FsZSB0byAxLjBmLiBUaGUgcHJvcGVyIG1pbmltdW0gc2NhbGUgd2lsbCBiZSBjYWxjdWxhdGVkIHdoZW4KLSAgICAgICAgICAgIC8vIHRoZSBuZXcgcGljdHVyZSBzaG93cyB1cC4KLSAgICAgICAgICAgIG1NaW5ab29tU2NhbGUgPSBNYXRoLm1pbigxLjBmLCAoZmxvYXQpIGdldFZpZXdXaWR0aCgpCi0gICAgICAgICAgICAgICAgICAgIC8gKG1EcmF3SGlzdG9yeSA/IG1IaXN0b3J5UGljdHVyZS5nZXRXaWR0aCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBtWm9vbU92ZXJ2aWV3V2lkdGgpKTsKLSAgICAgICAgICAgIGlmIChtSW5pdGlhbFNjYWxlSW5QZXJjZW50ID4gMCkgewotICAgICAgICAgICAgICAgIC8vIGxpbWl0IHRoZSBtaW5ab29tU2NhbGUgdG8gdGhlIGluaXRpYWxTY2FsZSBpZiBpdCBpcyBzZXQKLSAgICAgICAgICAgICAgICBmbG9hdCBpbml0aWFsU2NhbGUgPSBtSW5pdGlhbFNjYWxlSW5QZXJjZW50IC8gMTAwLjBmOwotICAgICAgICAgICAgICAgIGlmIChtTWluWm9vbVNjYWxlID4gaW5pdGlhbFNjYWxlKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1NaW5ab29tU2NhbGUgPSBpbml0aWFsU2NhbGU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgZGlzbWlzc1pvb21Db250cm9sKCk7Ci0KLSAgICAgICAgLy8gb25TaXplQ2hhbmdlZCgpIGlzIGNhbGxlZCBkdXJpbmcgV2ViVmlldyBsYXlvdXQuIEFuZCBhbnkKLSAgICAgICAgLy8gcmVxdWVzdExheW91dCgpIGlzIGJsb2NrZWQgZHVyaW5nIGxheW91dC4gQXMgc2V0TmV3Wm9vbVNjYWxlKCkgd2lsbAotICAgICAgICAvLyBjYWxsIGl0cyBjaGlsZCBWaWV3IHRvIHJlcG9zaXRpb24gaXRzZWxmIHRocm91Z2ggVmlld01hbmFnZXIncwotICAgICAgICAvLyBzY2FsZUFsbCgpLCB3ZSBuZWVkIHRvIHBvc3QgYSBSdW5uYWJsZSB0byBlbnN1cmUgcmVxdWVzdExheW91dCgpLgotICAgICAgICAvLyA8Yi8+Ci0gICAgICAgIC8vIG9ubHkgdXBkYXRlIHRoZSB0ZXh0IHdyYXAgc2NhbGUgaWYgd2lkdGggY2hhbmdlZC4KLSAgICAgICAgcG9zdChuZXcgUG9zdFNjYWxlKHRoaXMsIHcgIT0gb3cpKTsKKyAgICAgICAgbVpvb21NYW5hZ2VyLm9uU2l6ZUNoYW5nZWQodywgaCwgb3csIG9oKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTQzNDcsNyArNDIwNCw3IEBACiAgICAgICAgIC8vIGFzIGdldFZpc2libGVUaXRsZUhlaWdodC4KICAgICAgICAgaW50IHRpdGxlSGVpZ2h0ID0gZ2V0VGl0bGVIZWlnaHQoKTsKICAgICAgICAgaWYgKE1hdGgubWF4KHRpdGxlSGVpZ2h0IC0gdCwgMCkgIT0gTWF0aC5tYXgodGl0bGVIZWlnaHQgLSBvbGR0LCAwKSkgewotICAgICAgICAgICAgc2VuZFZpZXdTaXplWm9vbSgpOworICAgICAgICAgICAgc2VuZFZpZXdTaXplWm9vbShmYWxzZSk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTQzNTUsOSArNDIxMiwxMSBAQAogICAgIHB1YmxpYyBib29sZWFuIGRpc3BhdGNoS2V5RXZlbnQoS2V5RXZlbnQgZXZlbnQpIHsKICAgICAgICAgYm9vbGVhbiBkaXNwYXRjaCA9IHRydWU7CiAKLSAgICAgICAgLy8gVGV4dGZpZWxkcyBhbmQgcGx1Z2lucyBuZWVkIHRvIHJlY2VpdmUgdGhlIHNoaWZ0IHVwIGtleSBldmVuIGlmCi0gICAgICAgIC8vIGFub3RoZXIga2V5IHdhcyByZWxlYXNlZCB3aGlsZSB0aGUgc2hpZnQga2V5IHdhcyBoZWxkIGRvd24uCi0gICAgICAgIGlmICghaW5FZGl0aW5nTW9kZSgpICYmIChtTmF0aXZlQ2xhc3MgPT0gMCB8fCAhbmF0aXZlRm9jdXNJc1BsdWdpbigpKSkgeworICAgICAgICAvLyBUZXh0ZmllbGRzLCBwbHVnaW5zLCBhbmQgY29udGVudEVkaXRhYmxlIG5vZGVzIG5lZWQgdG8gcmVjZWl2ZSB0aGUKKyAgICAgICAgLy8gc2hpZnQgdXAga2V5IGV2ZW4gaWYgYW5vdGhlciBrZXkgd2FzIHJlbGVhc2VkIHdoaWxlIHRoZSBzaGlmdCBrZXkKKyAgICAgICAgLy8gd2FzIGhlbGQgZG93bi4KKyAgICAgICAgaWYgKCFpbkVkaXRpbmdNb2RlKCkgJiYgKG1OYXRpdmVDbGFzcyA9PSAwCisgICAgICAgICAgICAgICAgfHwgIW5hdGl2ZVBhZ2VTaG91bGRIYW5kbGVTaGlmdEFuZEFycm93cygpKSkgewogICAgICAgICAgICAgaWYgKGV2ZW50LmdldEFjdGlvbigpID09IEtleUV2ZW50LkFDVElPTl9ET1dOKSB7CiAgICAgICAgICAgICAgICAgbUdvdEtleURvd24gPSB0cnVlOwogICAgICAgICAgICAgfSBlbHNlIHsKQEAgLTQ1OTEsODEgKzQ0NTAsNiBAQAogICAgIHByaXZhdGUgRHJhZ1RyYWNrZXIgbURyYWdUcmFja2VyOwogICAgIHByaXZhdGUgRHJhZ1RyYWNrZXJIYW5kbGVyIG1EcmFnVHJhY2tlckhhbmRsZXI7CiAKLSAgICBwcml2YXRlIGNsYXNzIFNjYWxlRGV0ZWN0b3JMaXN0ZW5lciBpbXBsZW1lbnRzCi0gICAgICAgICAgICBTY2FsZUdlc3R1cmVEZXRlY3Rvci5PblNjYWxlR2VzdHVyZUxpc3RlbmVyIHsKLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBvblNjYWxlQmVnaW4oU2NhbGVHZXN0dXJlRGV0ZWN0b3IgZGV0ZWN0b3IpIHsKLSAgICAgICAgICAgIC8vIGNhbmNlbCB0aGUgc2luZ2xlIHRvdWNoIGhhbmRsaW5nCi0gICAgICAgICAgICBjYW5jZWxUb3VjaCgpOwotICAgICAgICAgICAgZGlzbWlzc1pvb21Db250cm9sKCk7Ci0gICAgICAgICAgICAvLyByZXNldCB0aGUgem9vbSBvdmVydmlldyBtb2RlIHNvIHRoYXQgdGhlIHBhZ2Ugd29uJ3QgYXV0byBncm93Ci0gICAgICAgICAgICBtSW5ab29tT3ZlcnZpZXcgPSBmYWxzZTsKLSAgICAgICAgICAgIC8vIElmIGl0IGlzIGluIHBhc3N3b3JkIG1vZGUsIHR1cm4gaXQgb2ZmIHNvIGl0IGRvZXMgbm90IGRyYXcKLSAgICAgICAgICAgIC8vIG1pc3BsYWNlZC4KLSAgICAgICAgICAgIGlmIChpbkVkaXRpbmdNb2RlKCkgJiYgbmF0aXZlRm9jdXNDYW5kaWRhdGVJc1Bhc3N3b3JkKCkpIHsKLSAgICAgICAgICAgICAgICBtV2ViVGV4dFZpZXcuc2V0SW5QYXNzd29yZChmYWxzZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1WaWV3TWFuYWdlci5zdGFydFpvb20oKTsKLQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBvblNjYWxlRW5kKFNjYWxlR2VzdHVyZURldGVjdG9yIGRldGVjdG9yKSB7Ci0gICAgICAgICAgICBpZiAobVByZXZpZXdab29tT25seSkgewotICAgICAgICAgICAgICAgIG1QcmV2aWV3Wm9vbU9ubHkgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBtQW5jaG9yWCA9IHZpZXdUb0NvbnRlbnRYKChpbnQpIG1ab29tQ2VudGVyWCArIG1TY3JvbGxYKTsKLSAgICAgICAgICAgICAgICBtQW5jaG9yWSA9IHZpZXdUb0NvbnRlbnRZKChpbnQpIG1ab29tQ2VudGVyWSArIG1TY3JvbGxZKTsKLSAgICAgICAgICAgICAgICAvLyBkb24ndCByZWZsb3cgd2hlbiB6b29tIGluOyB3aGVuIHpvb20gb3V0LCBkbyByZWZsb3cgaWYgdGhlCi0gICAgICAgICAgICAgICAgLy8gbmV3IHNjYWxlIGlzIGFsbW9zdCBtaW5pbXVtIHNjYWxlOwotICAgICAgICAgICAgICAgIGJvb2xlYW4gcmVmbG93Tm93ID0gKG1BY3R1YWxTY2FsZSAtIG1NaW5ab29tU2NhbGUKLSAgICAgICAgICAgICAgICAgICAgICAgIDw9IE1JTklNVU1fU0NBTEVfSU5DUkVNRU5UKQotICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChtQWN0dWFsU2NhbGUgPD0gMC44ICogbVRleHRXcmFwU2NhbGUpKTsKLSAgICAgICAgICAgICAgICAvLyBmb3JjZSB6b29tIGFmdGVyIG1QcmV2aWV3Wm9vbU9ubHkgaXMgc2V0IHRvIGZhbHNlIHNvIHRoYXQgdGhlCi0gICAgICAgICAgICAgICAgLy8gbmV3IHZpZXcgc2l6ZSB3aWxsIGJlIHBhc3NlZCB0byB0aGUgV2ViS2l0Ci0gICAgICAgICAgICAgICAgc2V0TmV3Wm9vbVNjYWxlKG1BY3R1YWxTY2FsZSwgcmVmbG93Tm93LCB0cnVlKTsKLSAgICAgICAgICAgICAgICAvLyBjYWxsIGludmFsaWRhdGUoKSB0byBkcmF3IHdpdGhvdXQgem9vbSBmaWx0ZXIKLSAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBhZGp1c3QgdGhlIGVkaXQgdGV4dCB2aWV3IGlmIG5lZWRlZAotICAgICAgICAgICAgaWYgKGluRWRpdGluZ01vZGUoKSAmJiBkaWRVcGRhdGVUZXh0Vmlld0JvdW5kcyhmYWxzZSkKLSAgICAgICAgICAgICAgICAgICAgJiYgbmF0aXZlRm9jdXNDYW5kaWRhdGVJc1Bhc3N3b3JkKCkpIHsKLSAgICAgICAgICAgICAgICAvLyBJZiBpdCBpcyBhIHBhc3N3b3JkIGZpZWxkLCBzdGFydCBkcmF3aW5nIHRoZQotICAgICAgICAgICAgICAgIC8vIFdlYlRleHRWaWV3IG9uY2UgYWdhaW4uCi0gICAgICAgICAgICAgICAgbVdlYlRleHRWaWV3LnNldEluUGFzc3dvcmQodHJ1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBzdGFydCBhIGRyYWcsIFRPVUNIX1BJTkNIX0RSQUcsIGNhbid0IHVzZSBUT1VDSF9JTklUX01PREUgYXMgaXQKLSAgICAgICAgICAgIC8vIG1heSB0cmlnZ2VyIHRoZSB1bndhbnRlZCBjbGljaywgY2FuJ3QgdXNlIFRPVUNIX0RSQUdfTU9ERSBhcyBpdAotICAgICAgICAgICAgLy8gbWF5IHRyaWdnZXIgdGhlIHVud2FudGVkIGZsaW5nLgotICAgICAgICAgICAgbVRvdWNoTW9kZSA9IFRPVUNIX1BJTkNIX0RSQUc7Ci0gICAgICAgICAgICBtQ29uZmlybU1vdmUgPSB0cnVlOwotICAgICAgICAgICAgc3RhcnRUb3VjaChkZXRlY3Rvci5nZXRGb2N1c1goKSwgZGV0ZWN0b3IuZ2V0Rm9jdXNZKCksCi0gICAgICAgICAgICAgICAgICAgIG1MYXN0VG91Y2hUaW1lKTsKLQotICAgICAgICAgICAgbVZpZXdNYW5hZ2VyLmVuZFpvb20oKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIG9uU2NhbGUoU2NhbGVHZXN0dXJlRGV0ZWN0b3IgZGV0ZWN0b3IpIHsKLSAgICAgICAgICAgIGZsb2F0IHNjYWxlID0gKGZsb2F0KSAoTWF0aC5yb3VuZChkZXRlY3Rvci5nZXRTY2FsZUZhY3RvcigpCi0gICAgICAgICAgICAgICAgICAgICogbUFjdHVhbFNjYWxlICogMTAwKSAvIDEwMC4wKTsKLSAgICAgICAgICAgIGlmIChNYXRoLmFicyhzY2FsZSAtIG1BY3R1YWxTY2FsZSkgPj0gTUlOSU1VTV9TQ0FMRV9JTkNSRU1FTlQpIHsKLSAgICAgICAgICAgICAgICBtUHJldmlld1pvb21Pbmx5ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAvLyBsaW1pdCB0aGUgc2NhbGUgY2hhbmdlIHBlciBzdGVwCi0gICAgICAgICAgICAgICAgaWYgKHNjYWxlID4gbUFjdHVhbFNjYWxlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNjYWxlID0gTWF0aC5taW4oc2NhbGUsIG1BY3R1YWxTY2FsZSAqIDEuMjVmKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBzY2FsZSA9IE1hdGgubWF4KHNjYWxlLCBtQWN0dWFsU2NhbGUgKiAwLjhmKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbVpvb21DZW50ZXJYID0gZGV0ZWN0b3IuZ2V0Rm9jdXNYKCk7Ci0gICAgICAgICAgICAgICAgbVpvb21DZW50ZXJZID0gZGV0ZWN0b3IuZ2V0Rm9jdXNZKCk7Ci0gICAgICAgICAgICAgICAgc2V0TmV3Wm9vbVNjYWxlKHNjYWxlLCBmYWxzZSwgZmFsc2UpOwotICAgICAgICAgICAgICAgIGludmFsaWRhdGUoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQogICAgIHByaXZhdGUgYm9vbGVhbiBoaXRGb2N1c2VkUGx1Z2luKGludCBjb250ZW50WCwgaW50IGNvbnRlbnRZKSB7CiAgICAgICAgIGlmIChEZWJ1Z0ZsYWdzLldFQl9WSUVXKSB7CiAgICAgICAgICAgICBMb2cudihMT0dUQUcsICJuYXRpdmVGb2N1c0lzUGx1Z2luKCk9IiArIG5hdGl2ZUZvY3VzSXNQbHVnaW4oKSk7CkBAIC00Njc5LDcgKzQ0NjMsNyBAQAogCiAgICAgcHJpdmF0ZSBib29sZWFuIHNob3VsZEZvcndhcmRUb3VjaEV2ZW50KCkgewogICAgICAgICByZXR1cm4gbUZ1bGxTY3JlZW5Ib2xkZXIgIT0gbnVsbCB8fCAobUZvcndhcmRUb3VjaEV2ZW50cwotICAgICAgICAgICAgICAgICYmIG1Ub3VjaE1vZGUgIT0gVE9VQ0hfU0VMRUNUX01PREUKKyAgICAgICAgICAgICAgICAmJiAhbVNlbGVjdGluZ1RleHQKICAgICAgICAgICAgICAgICAmJiBtUHJldmVudERlZmF1bHQgIT0gUFJFVkVOVF9ERUZBVUxUX0lHTk9SRSk7CiAgICAgfQogCkBAIC00Njg3LDYgKzQ0NzEsMjIgQEAKICAgICAgICAgcmV0dXJuIG1GdWxsU2NyZWVuSG9sZGVyICE9IG51bGw7CiAgICAgfQogCisgICAgdm9pZCBvblBpbmNoVG9ab29tQW5pbWF0aW9uU3RhcnQoKSB7CisgICAgICAgIC8vIGNhbmNlbCB0aGUgc2luZ2xlIHRvdWNoIGhhbmRsaW5nCisgICAgICAgIGNhbmNlbFRvdWNoKCk7CisgICAgICAgIG9uWm9vbUFuaW1hdGlvblN0YXJ0KCk7CisgICAgfQorCisgICAgdm9pZCBvblBpbmNoVG9ab29tQW5pbWF0aW9uRW5kKFNjYWxlR2VzdHVyZURldGVjdG9yIGRldGVjdG9yKSB7CisgICAgICAgIG9uWm9vbUFuaW1hdGlvbkVuZCgpOworICAgICAgICAvLyBzdGFydCBhIGRyYWcsIFRPVUNIX1BJTkNIX0RSQUcsIGNhbid0IHVzZSBUT1VDSF9JTklUX01PREUgYXMKKyAgICAgICAgLy8gaXQgbWF5IHRyaWdnZXIgdGhlIHVud2FudGVkIGNsaWNrLCBjYW4ndCB1c2UgVE9VQ0hfRFJBR19NT0RFCisgICAgICAgIC8vIGFzIGl0IG1heSB0cmlnZ2VyIHRoZSB1bndhbnRlZCBmbGluZy4KKyAgICAgICAgbVRvdWNoTW9kZSA9IFRPVUNIX1BJTkNIX0RSQUc7CisgICAgICAgIG1Db25maXJtTW92ZSA9IHRydWU7CisgICAgICAgIHN0YXJ0VG91Y2goZGV0ZWN0b3IuZ2V0Rm9jdXNYKCksIGRldGVjdG9yLmdldEZvY3VzWSgpLCBtTGFzdFRvdWNoVGltZSk7CisgICAgfQorCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gb25Ub3VjaEV2ZW50KE1vdGlvbkV2ZW50IGV2KSB7CiAgICAgICAgIGlmIChtTmF0aXZlQ2xhc3MgPT0gMCB8fCAhaXNDbGlja2FibGUoKSB8fCAhaXNMb25nQ2xpY2thYmxlKCkpIHsKQEAgLTQ3MDQsMzIgKzQ1MDQsMzYgQEAKIAogICAgICAgICAvLyBGSVhNRTogd2UgbWF5IGNvbnNpZGVyIHRvIGdpdmUgV2ViS2l0IGFuIG9wdGlvbiB0byBoYW5kbGUgbXVsdGktdG91Y2gKICAgICAgICAgLy8gZXZlbnRzIGxhdGVyLgotICAgICAgICBpZiAobVN1cHBvcnRNdWx0aVRvdWNoICYmIGV2LmdldFBvaW50ZXJDb3VudCgpID4gMSkgewotICAgICAgICAgICAgaWYgKG1NaW5ab29tU2NhbGUgPCBtTWF4Wm9vbVNjYWxlKSB7Ci0gICAgICAgICAgICAgICAgbVNjYWxlRGV0ZWN0b3Iub25Ub3VjaEV2ZW50KGV2KTsKLSAgICAgICAgICAgICAgICBpZiAobVNjYWxlRGV0ZWN0b3IuaXNJblByb2dyZXNzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbUxhc3RUb3VjaFRpbWUgPSBldmVudFRpbWU7CisgICAgICAgIGlmIChtWm9vbU1hbmFnZXIuc3VwcG9ydHNNdWx0aVRvdWNoWm9vbSgpICYmIGV2LmdldFBvaW50ZXJDb3VudCgpID4gMSkgeworCisgICAgICAgICAgICAvLyBpZiB0aGUgcGFnZSBkaXNhbGxvd3Mgem9vbSwgdGhlbiBza2lwIG11bHRpLXBvaW50ZXIgYWN0aW9uCisgICAgICAgICAgICBpZiAobVpvb21NYW5hZ2VyLmlzWm9vbVNjYWxlRml4ZWQoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTY2FsZUdlc3R1cmVEZXRlY3RvciBkZXRlY3RvciA9IG1ab29tTWFuYWdlci5nZXRNdWx0aVRvdWNoR2VzdHVyZURldGVjdG9yKCk7CisgICAgICAgICAgICBkZXRlY3Rvci5vblRvdWNoRXZlbnQoZXYpOworCisgICAgICAgICAgICBpZiAoZGV0ZWN0b3IuaXNJblByb2dyZXNzKCkpIHsKKyAgICAgICAgICAgICAgICBtTGFzdFRvdWNoVGltZSA9IGV2ZW50VGltZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgeCA9IGRldGVjdG9yLmdldEZvY3VzWCgpOworICAgICAgICAgICAgeSA9IGRldGVjdG9yLmdldEZvY3VzWSgpOworICAgICAgICAgICAgYWN0aW9uID0gZXYuZ2V0QWN0aW9uKCkgJiBNb3Rpb25FdmVudC5BQ1RJT05fTUFTSzsKKyAgICAgICAgICAgIGlmIChhY3Rpb24gPT0gTW90aW9uRXZlbnQuQUNUSU9OX1BPSU5URVJfRE9XTikgeworICAgICAgICAgICAgICAgIGNhbmNlbFRvdWNoKCk7CisgICAgICAgICAgICAgICAgYWN0aW9uID0gTW90aW9uRXZlbnQuQUNUSU9OX0RPV047CisgICAgICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbiA9PSBNb3Rpb25FdmVudC5BQ1RJT05fUE9JTlRFUl9VUCkgeworICAgICAgICAgICAgICAgIC8vIHNldCBtTGFzdFRvdWNoWC9ZIHRvIHRoZSByZW1haW5pbmcgcG9pbnQKKyAgICAgICAgICAgICAgICBtTGFzdFRvdWNoWCA9IHg7CisgICAgICAgICAgICAgICAgbUxhc3RUb3VjaFkgPSB5OworICAgICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24gPT0gTW90aW9uRXZlbnQuQUNUSU9OX01PVkUpIHsKKyAgICAgICAgICAgICAgICAvLyBuZWdhdGl2ZSB4IG9yIHkgaW5kaWNhdGUgaXQgaXMgb24gdGhlIGVkZ2UsIHNraXAgaXQuCisgICAgICAgICAgICAgICAgaWYgKHggPCAwIHx8IHkgPCAwKSB7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB4ID0gbVNjYWxlRGV0ZWN0b3IuZ2V0Rm9jdXNYKCk7Ci0gICAgICAgICAgICAgICAgeSA9IG1TY2FsZURldGVjdG9yLmdldEZvY3VzWSgpOwotICAgICAgICAgICAgICAgIGFjdGlvbiA9IGV2LmdldEFjdGlvbigpICYgTW90aW9uRXZlbnQuQUNUSU9OX01BU0s7Ci0gICAgICAgICAgICAgICAgaWYgKGFjdGlvbiA9PSBNb3Rpb25FdmVudC5BQ1RJT05fUE9JTlRFUl9ET1dOKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhbmNlbFRvdWNoKCk7Ci0gICAgICAgICAgICAgICAgICAgIGFjdGlvbiA9IE1vdGlvbkV2ZW50LkFDVElPTl9ET1dOOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uID09IE1vdGlvbkV2ZW50LkFDVElPTl9QT0lOVEVSX1VQKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHNldCBtTGFzdFRvdWNoWC9ZIHRvIHRoZSByZW1haW5pbmcgcG9pbnQKLSAgICAgICAgICAgICAgICAgICAgbUxhc3RUb3VjaFggPSB4OwotICAgICAgICAgICAgICAgICAgICBtTGFzdFRvdWNoWSA9IHk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24gPT0gTW90aW9uRXZlbnQuQUNUSU9OX01PVkUpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gbmVnYXRpdmUgeCBvciB5IGluZGljYXRlIGl0IGlzIG9uIHRoZSBlZGdlLCBza2lwIGl0LgotICAgICAgICAgICAgICAgICAgICBpZiAoeCA8IDAgfHwgeSA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBpZiB0aGUgcGFnZSBkaXNhbGxvdyB6b29tLCBza2lwIG11bHRpLXBvaW50ZXIgYWN0aW9uCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBhY3Rpb24gPSBldi5nZXRBY3Rpb24oKTsKQEAgLTQ3NjcsMTggKzQ1NzEsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgbVRvdWNoTW9kZSA9IFRPVUNIX0RSQUdfU1RBUlRfTU9ERTsKICAgICAgICAgICAgICAgICAgICAgbUNvbmZpcm1Nb3ZlID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgbVByaXZhdGVIYW5kbGVyLnJlbW92ZU1lc3NhZ2VzKFJFU1VNRV9XRUJDT1JFX1BSSU9SSVRZKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFpbkZ1bGxTY3JlZW5Nb2RlKCkgJiYgbVNoaWZ0SXNQcmVzc2VkKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1TZWxlY3RYID0gbVNjcm9sbFggKyAoaW50KSB4OwotICAgICAgICAgICAgICAgICAgICBtU2VsZWN0WSA9IG1TY3JvbGxZICsgKGludCkgeTsKLSAgICAgICAgICAgICAgICAgICAgbVRvdWNoTW9kZSA9IFRPVUNIX1NFTEVDVF9NT0RFOwotICAgICAgICAgICAgICAgICAgICBpZiAoRGVidWdGbGFncy5XRUJfVklFVykgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLnYoTE9HVEFHLCAic2VsZWN0PSIgKyBtU2VsZWN0WCArICIsIiArIG1TZWxlY3RZKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBuYXRpdmVNb3ZlU2VsZWN0aW9uKGNvbnRlbnRYLCBjb250ZW50WSwgZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICBtVG91Y2hTZWxlY3Rpb24gPSBtRXh0ZW5kU2VsZWN0aW9uID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgaW52YWxpZGF0ZSgpOyAvLyBkcmF3IHRoZSBpLWJlYW0gaW5zdGVhZCBvZiB0aGUgYXJyb3cKICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1Qcml2YXRlSGFuZGxlci5oYXNNZXNzYWdlcyhSRUxFQVNFX1NJTkdMRV9UQVApKSB7CiAgICAgICAgICAgICAgICAgICAgIG1Qcml2YXRlSGFuZGxlci5yZW1vdmVNZXNzYWdlcyhSRUxFQVNFX1NJTkdMRV9UQVApOworICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0U2V0dGluZ3MoKS5zdXBwb3J0VG91Y2hPbmx5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZVRvdWNoSGlnaGxpZ2h0KHRydWUpOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGlmIChkZWx0YVggKiBkZWx0YVggKyBkZWx0YVkgKiBkZWx0YVkgPCBtRG91YmxlVGFwU2xvcFNxdWFyZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgbVRvdWNoTW9kZSA9IFRPVUNIX0RPVUJMRV9UQVBfTU9ERTsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKQEAgLTQ3OTAsMTcgKzQ1ODcsNDUgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudFgsIGNvbnRlbnRZKSA6IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsgLy8gdGhlIG5vcm1hbCBjYXNlCi0gICAgICAgICAgICAgICAgICAgIG1QcmV2aWV3Wm9vbU9ubHkgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgbVRvdWNoTW9kZSA9IFRPVUNIX0lOSVRfTU9ERTsKICAgICAgICAgICAgICAgICAgICAgbURlZmVyVG91Y2hQcm9jZXNzID0gKCFpbkZ1bGxTY3JlZW5Nb2RlKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBtRm9yd2FyZFRvdWNoRXZlbnRzKSA/IGhpdEZvY3VzZWRQbHVnaW4oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudFgsIGNvbnRlbnRZKSA6IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICBtV2ViVmlld0NvcmUuc2VuZE1lc3NhZ2UoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRIdWIuVVBEQVRFX0ZSQU1FX0NBQ0hFX0lGX0xPQURJTkcpOworICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0U2V0dGluZ3MoKS5zdXBwb3J0VG91Y2hPbmx5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFRvdWNoSGlnaGxpZ2h0RGF0YSBkYXRhID0gbmV3IFRvdWNoSGlnaGxpZ2h0RGF0YSgpOworICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5tWCA9IGNvbnRlbnRYOworICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5tWSA9IGNvbnRlbnRZOworICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5tU2xvcCA9IHZpZXdUb0NvbnRlbnREaW1lbnNpb24obU5hdlNsb3ApOworICAgICAgICAgICAgICAgICAgICAgICAgbVdlYlZpZXdDb3JlLnNlbmRNZXNzYWdlRGVsYXllZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRIdWIuR0VUX1RPVUNIX0hJR0hMSUdIVF9SRUNUUywgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlld0NvbmZpZ3VyYXRpb24uZ2V0VGFwVGltZW91dCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVR19UT1VDSF9ISUdITElHSFQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0U2V0dGluZ3MoKS5nZXROYXZEdW1wKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRvdWNoSGlnaGxpZ2h0WCA9IChpbnQpIHggKyBtU2Nyb2xsWDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRvdWNoSGlnaGxpZ2h0WSA9IChpbnQpIHkgKyBtU2Nyb2xsWTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVByaXZhdGVIYW5kbGVyLnBvc3REZWxheWVkKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVG91Y2hIaWdobGlnaHRYID0gbVRvdWNoSGlnaGxpZ2h0WSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW52YWxpZGF0ZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBUT1VDSF9ISUdITElHSFRfRUxBUFNFX1RJTUUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBpZiAobUxvZ0V2ZW50ICYmIGV2ZW50VGltZSAtIG1MYXN0VG91Y2hVcFRpbWUgPCAxMDAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KEV2ZW50TG9nVGFncy5CUk9XU0VSX0RPVUJMRV9UQVBfRFVSQVRJT04sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChldmVudFRpbWUgLSBtTGFzdFRvdWNoVXBUaW1lKSwgZXZlbnRUaW1lKTsKICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAobVNlbGVjdGluZ1RleHQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1EcmF3U2VsZWN0aW9uUG9pbnRlciA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgbVNlbGVjdGlvblN0YXJ0ZWQgPSBuYXRpdmVTdGFydFNlbGVjdGlvbihjb250ZW50WCwgY29udGVudFkpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERlYnVnRmxhZ3MuV0VCX1ZJRVcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cudihMT0dUQUcsICJzZWxlY3Q9IiArIGNvbnRlbnRYICsgIiwiICsgY29udGVudFkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaW52YWxpZGF0ZSgpOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIC8vIFRyaWdnZXIgdGhlIGxpbmsKICAgICAgICAgICAgICAgICBpZiAobVRvdWNoTW9kZSA9PSBUT1VDSF9JTklUX01PREUKQEAgLTQ4MjQsMTcgKzQ2NDksMTUgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIHRlZC5tWSA9IGNvbnRlbnRZOwogICAgICAgICAgICAgICAgICAgICAgICAgdGVkLm1NZXRhU3RhdGUgPSBldi5nZXRNZXRhU3RhdGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHRlZC5tUmVwcm9jZXNzID0gbURlZmVyVG91Y2hQcm9jZXNzOworICAgICAgICAgICAgICAgICAgICAgICAgbVdlYlZpZXdDb3JlLnNlbmRNZXNzYWdlKEV2ZW50SHViLlRPVUNIX0VWRU5ULCB0ZWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1EZWZlclRvdWNoUHJvY2VzcykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0aWxsIG5lZWRzIHRvIHNldCB0aGVtIGZvciBjb21wdXRlIGRlbHRhWC9ZCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3RUb3VjaFggPSB4OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1MYXN0VG91Y2hZID0geTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZWQubVZpZXdYID0geDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZWQubVZpZXdZID0geTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtV2ViVmlld0NvcmUuc2VuZE1lc3NhZ2UoRXZlbnRIdWIuVE9VQ0hfRVZFTlQsIHRlZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBtV2ViVmlld0NvcmUuc2VuZE1lc3NhZ2UoRXZlbnRIdWIuVE9VQ0hfRVZFTlQsIHRlZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWluRnVsbFNjcmVlbk1vZGUoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Qcml2YXRlSGFuZGxlci5yZW1vdmVNZXNzYWdlcyhQUkVWRU5UX0RFRkFVTFRfVElNRU9VVCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVByaXZhdGVIYW5kbGVyLnNlbmRNZXNzYWdlRGVsYXllZChtUHJpdmF0ZUhhbmRsZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5vYnRhaW5NZXNzYWdlKFBSRVZFTlRfREVGQVVMVF9USU1FT1VULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb24sIDApLCBUQVBfVElNRU9VVCk7CkBAIC00ODU1LDI0ICs0Njc4LDI0IEBACiAgICAgICAgICAgICAgICAgICAgIGlmIChtVG91Y2hNb2RlID09IFRPVUNIX0RPVUJMRV9UQVBfTU9ERSkgewogICAgICAgICAgICAgICAgICAgICAgICAgbVRvdWNoTW9kZSA9IFRPVUNIX0lOSVRfTU9ERTsKICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0U2V0dGluZ3MoKS5zdXBwb3J0VG91Y2hPbmx5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZVRvdWNoSGlnaGxpZ2h0KHRydWUpOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIC8vIHBhc3MgdGhlIHRvdWNoIGV2ZW50cyBmcm9tIFVJIHRocmVhZCB0byBXZWJDb3JlIHRocmVhZAogICAgICAgICAgICAgICAgIGlmIChzaG91bGRGb3J3YXJkVG91Y2hFdmVudCgpICYmIG1Db25maXJtTW92ZSAmJiAoZmlyc3RNb3ZlCiAgICAgICAgICAgICAgICAgICAgICAgICB8fCBldmVudFRpbWUgLSBtTGFzdFNlbnRUb3VjaFRpbWUgPiBtQ3VycmVudFRvdWNoSW50ZXJ2YWwpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1MYXN0U2VudFRvdWNoVGltZSA9IGV2ZW50VGltZTsKICAgICAgICAgICAgICAgICAgICAgVG91Y2hFdmVudERhdGEgdGVkID0gbmV3IFRvdWNoRXZlbnREYXRhKCk7CiAgICAgICAgICAgICAgICAgICAgIHRlZC5tQWN0aW9uID0gYWN0aW9uOwogICAgICAgICAgICAgICAgICAgICB0ZWQubVggPSBjb250ZW50WDsKICAgICAgICAgICAgICAgICAgICAgdGVkLm1ZID0gY29udGVudFk7CiAgICAgICAgICAgICAgICAgICAgIHRlZC5tTWV0YVN0YXRlID0gZXYuZ2V0TWV0YVN0YXRlKCk7CiAgICAgICAgICAgICAgICAgICAgIHRlZC5tUmVwcm9jZXNzID0gbURlZmVyVG91Y2hQcm9jZXNzOworICAgICAgICAgICAgICAgICAgICBtV2ViVmlld0NvcmUuc2VuZE1lc3NhZ2UoRXZlbnRIdWIuVE9VQ0hfRVZFTlQsIHRlZCk7CisgICAgICAgICAgICAgICAgICAgIG1MYXN0U2VudFRvdWNoVGltZSA9IGV2ZW50VGltZTsKICAgICAgICAgICAgICAgICAgICAgaWYgKG1EZWZlclRvdWNoUHJvY2VzcykgewotICAgICAgICAgICAgICAgICAgICAgICAgdGVkLm1WaWV3WCA9IHg7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0ZWQubVZpZXdZID0geTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1XZWJWaWV3Q29yZS5zZW5kTWVzc2FnZShFdmVudEh1Yi5UT1VDSF9FVkVOVCwgdGVkKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1XZWJWaWV3Q29yZS5zZW5kTWVzc2FnZShFdmVudEh1Yi5UT1VDSF9FVkVOVCwgdGVkKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKGZpcnN0TW92ZSAmJiAhaW5GdWxsU2NyZWVuTW9kZSgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBtUHJpdmF0ZUhhbmRsZXIuc2VuZE1lc3NhZ2VEZWxheWVkKG1Qcml2YXRlSGFuZGxlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAub2J0YWluTWVzc2FnZShQUkVWRU5UX0RFRkFVTFRfVElNRU9VVCwKQEAgLTQ4OTIsMjAgKzQ3MTUsMjAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgbVRvdWNoTW9kZSA9ICIgKyBtVG91Y2hNb2RlKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgbVZlbG9jaXR5VHJhY2tlci5hZGRNb3ZlbWVudChldik7Ci0gICAgICAgICAgICAgICAgaWYgKG1Ub3VjaE1vZGUgIT0gVE9VQ0hfRFJBR19NT0RFKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtVG91Y2hNb2RlID09IFRPVUNIX1NFTEVDVF9NT0RFKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU2VsZWN0WCA9IG1TY3JvbGxYICsgKGludCkgeDsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TZWxlY3RZID0gbVNjcm9sbFkgKyAoaW50KSB5OwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERlYnVnRmxhZ3MuV0VCX1ZJRVcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cudihMT0dUQUcsICJ4dGVuZD0iICsgbVNlbGVjdFggKyAiLCIgKyBtU2VsZWN0WSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVNb3ZlU2VsZWN0aW9uKGNvbnRlbnRYLCBjb250ZW50WSwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBpZiAobVNlbGVjdGluZ1RleHQgJiYgbVNlbGVjdGlvblN0YXJ0ZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKERlYnVnRmxhZ3MuV0VCX1ZJRVcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZy52KExPR1RBRywgImV4dGVuZD0iICsgY29udGVudFggKyAiLCIgKyBjb250ZW50WSk7CiAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbmF0aXZlRXh0ZW5kU2VsZWN0aW9uKGNvbnRlbnRYLCBjb250ZW50WSk7CisgICAgICAgICAgICAgICAgICAgIGludmFsaWRhdGUoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChtVG91Y2hNb2RlICE9IFRPVUNIX0RSQUdfTU9ERSkgeworCiAgICAgICAgICAgICAgICAgICAgIGlmICghbUNvbmZpcm1Nb3ZlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAgICAgICAgIGlmIChtUHJldmVudERlZmF1bHQgPT0gUFJFVkVOVF9ERUZBVUxUX01BWUJFX1lFUwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IG1QcmV2ZW50RGVmYXVsdCA9PSBQUkVWRU5UX0RFRkFVTFRfTk9fRlJPTV9UT1VDSF9ET1dOKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cmFjayBtTGFzdFRvdWNoVGltZSBhcyB3ZSBtYXkgbmVlZCB0byBkbyBmbGluZyBhdApAQCAtNTAzMyw2ICs0ODU2LDcgQEAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGNhc2UgTW90aW9uRXZlbnQuQUNUSU9OX1VQOiB7CisgICAgICAgICAgICAgICAgaWYgKCFpc0ZvY3VzZWQoKSkgcmVxdWVzdEZvY3VzKCk7CiAgICAgICAgICAgICAgICAgLy8gcGFzcyB0aGUgdG91Y2ggZXZlbnRzIGZyb20gVUkgdGhyZWFkIHRvIFdlYkNvcmUgdGhyZWFkCiAgICAgICAgICAgICAgICAgaWYgKHNob3VsZEZvcndhcmRUb3VjaEV2ZW50KCkpIHsKICAgICAgICAgICAgICAgICAgICAgVG91Y2hFdmVudERhdGEgdGVkID0gbmV3IFRvdWNoRXZlbnREYXRhKCk7CkBAIC01MDQxLDEwICs0ODY1LDYgQEAKICAgICAgICAgICAgICAgICAgICAgdGVkLm1ZID0gY29udGVudFk7CiAgICAgICAgICAgICAgICAgICAgIHRlZC5tTWV0YVN0YXRlID0gZXYuZ2V0TWV0YVN0YXRlKCk7CiAgICAgICAgICAgICAgICAgICAgIHRlZC5tUmVwcm9jZXNzID0gbURlZmVyVG91Y2hQcm9jZXNzOwotICAgICAgICAgICAgICAgICAgICBpZiAobURlZmVyVG91Y2hQcm9jZXNzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0ZWQubVZpZXdYID0geDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRlZC5tVmlld1kgPSB5OwotICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIG1XZWJWaWV3Q29yZS5zZW5kTWVzc2FnZShFdmVudEh1Yi5UT1VDSF9FVkVOVCwgdGVkKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgbUxhc3RUb3VjaFVwVGltZSA9IGV2ZW50VGltZTsKQEAgLTUwNTksMjAgKzQ4NzksMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZWQubVkgPSBjb250ZW50WTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZWQubU1ldGFTdGF0ZSA9IGV2LmdldE1ldGFTdGF0ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlZC5tUmVwcm9jZXNzID0gbURlZmVyVG91Y2hQcm9jZXNzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtRGVmZXJUb3VjaFByb2Nlc3MpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVkLm1WaWV3WCA9IHg7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlZC5tVmlld1kgPSB5OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtV2ViVmlld0NvcmUuc2VuZE1lc3NhZ2UoRXZlbnRIdWIuVE9VQ0hfRVZFTlQsIHRlZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1QcmV2ZW50RGVmYXVsdCAhPSBQUkVWRU5UX0RFRkFVTFRfWUVTKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb0RvdWJsZVRhcCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ab29tTWFuYWdlci5oYW5kbGVEb3VibGVUYXAobUxhc3RUb3VjaFgsIG1MYXN0VG91Y2hZKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVG91Y2hNb2RlID0gVE9VQ0hfRE9ORV9NT0RFOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgVE9VQ0hfU0VMRUNUX01PREU6Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb21taXRDb3B5KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtVG91Y2hTZWxlY3Rpb24gPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICBjYXNlIFRPVUNIX0lOSVRfTU9ERTogLy8gdGFwCiAgICAgICAgICAgICAgICAgICAgIGNhc2UgVE9VQ0hfU0hPUlRQUkVTU19TVEFSVF9NT0RFOgogICAgICAgICAgICAgICAgICAgICBjYXNlIFRPVUNIX1NIT1JUUFJFU1NfTU9ERToKQEAgLTUwODQsOSArNDg5NiwxNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtUHJldmVudERlZmF1bHQgIT0gUFJFVkVOVF9ERUZBVUxUX1lFUwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKGNvbXB1dGVNYXhTY3JvbGxYKCkgPiAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGNvbXB1dGVNYXhTY3JvbGxZKCkgPiAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBVSSB0YWtlcyBjb250cm9sIGJhY2ssIGNhbmNlbCBXZWJDb3JlIHRvdWNoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbmNlbFdlYkNvcmVUb3VjaEV2ZW50KGNvbnRlbnRYLCBjb250ZW50WSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIHVzZXIgaGFzIHBlcmZvcm1lZCBhIHZlcnkgcXVpY2sgdG91Y2gKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2VxdWVuY2UgaXQgaXMgcG9zc2libGUgdGhhdCB3ZSBtYXkgZ2V0IGhlcmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmVmb3JlIFdlYkNvcmUgaGFzIGhhZCBhIGNoYW5jZSB0byBwcm9jZXNzIHRoZSBldmVudHMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluIHRoaXMgY2FzZSwgYW55IGNhbGwgdG8gcHJldmVudERlZmF1bHQgaW4gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEpTIHRvdWNoIGhhbmRsZXIgd2lsbCBub3QgaGF2ZSBiZWVuIGV4ZWN1dGVkIHlldC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSGVuY2Ugd2Ugd2lsbCBzZWUgYm90aCB0aGUgVUkgKG5vdykgYW5kIFdlYkNvcmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKHdoZW4gY29udGV4dCBzd2l0Y2hlcykgaGFuZGxpbmcgdGhlIGV2ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlIHdlYiBkZXZlbG9wZXIgYWN0dWFsbHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG9lc2VzIHByZXZlbnREZWZhdWx0IGluIHRoZWlyIHRvdWNoIGhhbmRsZXIuIFRoaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXMgdGhlIG5hdHVyZSBvZiBvdXIgYXN5bmNocm9ub3VzIHRvdWNoIG1vZGVsLgorCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIHdpbGwgbm90IHJld3JpdGUgZHJhZyBjb2RlIGhlcmUsIGJ1dCB3ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aWxsIHRyeSBmbGluZyBpZiBpdCBhcHBsaWVzLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJWaWV3Q29yZS5yZWR1Y2VQcmlvcml0eSgpOwpAQCAtNTEwMyw3ICs0OTIzLDE3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1Ub3VjaE1vZGUgPT0gVE9VQ0hfSU5JVF9NT0RFKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1TZWxlY3RpbmdUZXh0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRhcHBpbmcgb24gc2VsZWN0aW9uIG9yIGNvbnRyb2xzIGRvZXMgbm90aGluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW5hdGl2ZUhpdFNlbGVjdGlvbihjb250ZW50WCwgY29udGVudFkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25Eb25lKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9ubHkgdHJpZ2dlciBkb3VibGUgdGFwIGlmIHRoZSBXZWJWaWV3IGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2NhbGFibGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVRvdWNoTW9kZSA9PSBUT1VDSF9JTklUX01PREUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIChjYW5ab29tSW4oKSB8fCBjYW5ab29tT3V0KCkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Qcml2YXRlSGFuZGxlci5zZW5kRW1wdHlNZXNzYWdlRGVsYXllZCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUxFQVNFX1NJTkdMRV9UQVAsIFZpZXdDb25maWd1cmF0aW9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0RG91YmxlVGFwVGltZW91dCgpKTsKQEAgLTUxOTQsMjEgKzUwMjQsMTAgQEAKICAgICAgICAgaWYgKCFtRHJhZ0Zyb21UZXh0SW5wdXQpIHsKICAgICAgICAgICAgIG5hdGl2ZUhpZGVDdXJzb3IoKTsKICAgICAgICAgfQotICAgICAgICBXZWJTZXR0aW5ncyBzZXR0aW5ncyA9IGdldFNldHRpbmdzKCk7Ci0gICAgICAgIGlmIChzZXR0aW5ncy5zdXBwb3J0Wm9vbSgpCi0gICAgICAgICAgICAgICAgJiYgc2V0dGluZ3MuZ2V0QnVpbHRJblpvb21Db250cm9scygpCi0gICAgICAgICAgICAgICAgJiYgIWdldFpvb21CdXR0b25zQ29udHJvbGxlcigpLmlzVmlzaWJsZSgpCi0gICAgICAgICAgICAgICAgJiYgbU1pblpvb21TY2FsZSA8IG1NYXhab29tU2NhbGUKLSAgICAgICAgICAgICAgICAmJiAobUhvcml6b250YWxTY3JvbGxCYXJNb2RlICE9IFNDUk9MTEJBUl9BTFdBWVNPRkYKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IG1WZXJ0aWNhbFNjcm9sbEJhck1vZGUgIT0gU0NST0xMQkFSX0FMV0FZU09GRikpIHsKLSAgICAgICAgICAgIG1ab29tQnV0dG9uc0NvbnRyb2xsZXIuc2V0VmlzaWJsZSh0cnVlKTsKLSAgICAgICAgICAgIGludCBjb3VudCA9IHNldHRpbmdzLmdldERvdWJsZVRhcFRvYXN0Q291bnQoKTsKLSAgICAgICAgICAgIGlmIChtSW5ab29tT3ZlcnZpZXcgJiYgY291bnQgPiAwKSB7Ci0gICAgICAgICAgICAgICAgc2V0dGluZ3Muc2V0RG91YmxlVGFwVG9hc3RDb3VudCgtLWNvdW50KTsKLSAgICAgICAgICAgICAgICBUb2FzdC5tYWtlVGV4dChtQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3RyaW5nLmRvdWJsZV90YXBfdG9hc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICBUb2FzdC5MRU5HVEhfTE9ORykuc2hvdygpOwotICAgICAgICAgICAgfQorCisgICAgICAgIGlmIChtSG9yaXpvbnRhbFNjcm9sbEJhck1vZGUgIT0gU0NST0xMQkFSX0FMV0FZU09GRgorICAgICAgICAgICAgICAgIHx8IG1WZXJ0aWNhbFNjcm9sbEJhck1vZGUgIT0gU0NST0xMQkFSX0FMV0FZU09GRikgeworICAgICAgICAgICAgbVpvb21NYW5hZ2VyLmludm9rZVpvb21QaWNrZXIoKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtNTIxNiwxOCArNTAzNSw3IEBACiAgICAgICAgIGlmICgoZGVsdGFYIHwgZGVsdGFZKSAhPSAwKSB7CiAgICAgICAgICAgICBzY3JvbGxCeShkZWx0YVgsIGRlbHRhWSk7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKCFnZXRTZXR0aW5ncygpLmdldEJ1aWx0SW5ab29tQ29udHJvbHMoKSkgewotICAgICAgICAgICAgYm9vbGVhbiBzaG93UGx1c01pbnVzID0gbU1pblpvb21TY2FsZSA8IG1NYXhab29tU2NhbGU7Ci0gICAgICAgICAgICBpZiAobVpvb21Db250cm9scyAhPSBudWxsICYmIHNob3dQbHVzTWludXMpIHsKLSAgICAgICAgICAgICAgICBpZiAobVpvb21Db250cm9scy5nZXRWaXNpYmlsaXR5KCkgPT0gVmlldy5WSVNJQkxFKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Qcml2YXRlSGFuZGxlci5yZW1vdmVDYWxsYmFja3MobVpvb21Db250cm9sUnVubmFibGUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG1ab29tQ29udHJvbHMuc2hvdyhzaG93UGx1c01pbnVzLCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1Qcml2YXRlSGFuZGxlci5wb3N0RGVsYXllZChtWm9vbUNvbnRyb2xSdW5uYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFpPT01fQ09OVFJPTFNfVElNRU9VVCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgICAgICAgbVpvb21NYW5hZ2VyLmtlZXBab29tUGlja2VyVmlzaWJsZSgpOwogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBzdG9wVG91Y2goKSB7CkBAIC01MjYyLDYgKzUwNzAsOSBAQAogICAgICAgICBtUHJpdmF0ZUhhbmRsZXIucmVtb3ZlTWVzc2FnZXMoU1dJVENIX1RPX0xPTkdQUkVTUyk7CiAgICAgICAgIG1Qcml2YXRlSGFuZGxlci5yZW1vdmVNZXNzYWdlcyhEUkFHX0hFTERfTU9USU9OTEVTUyk7CiAgICAgICAgIG1Qcml2YXRlSGFuZGxlci5yZW1vdmVNZXNzYWdlcyhBV0FLRU5fU0NST0xMX0JBUlMpOworICAgICAgICBpZiAoZ2V0U2V0dGluZ3MoKS5zdXBwb3J0VG91Y2hPbmx5KCkpIHsKKyAgICAgICAgICAgIHJlbW92ZVRvdWNoSGlnaGxpZ2h0KHRydWUpOworICAgICAgICB9CiAgICAgICAgIG1IZWxkTW90aW9ubGVzcyA9IE1PVElPTkxFU1NfVFJVRTsKICAgICAgICAgbVRvdWNoTW9kZSA9IFRPVUNIX0RPTkVfTU9ERTsKICAgICAgICAgbmF0aXZlSGlkZUN1cnNvcigpOwpAQCAtNTI3Myw4ICs1MDg0LDEwIEBACiAgICAgcHJpdmF0ZSBmbG9hdCBtVHJhY2tiYWxsUmVtYWluc1kgPSAwLjBmOwogICAgIHByaXZhdGUgaW50IG1UcmFja2JhbGxYTW92ZSA9IDA7CiAgICAgcHJpdmF0ZSBpbnQgbVRyYWNrYmFsbFlNb3ZlID0gMDsKKyAgICBwcml2YXRlIGJvb2xlYW4gbVNlbGVjdGluZ1RleHQgPSBmYWxzZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gbVNlbGVjdGlvblN0YXJ0ZWQgPSBmYWxzZTsKICAgICBwcml2YXRlIGJvb2xlYW4gbUV4dGVuZFNlbGVjdGlvbiA9IGZhbHNlOwotICAgIHByaXZhdGUgYm9vbGVhbiBtVG91Y2hTZWxlY3Rpb24gPSBmYWxzZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gbURyYXdTZWxlY3Rpb25Qb2ludGVyID0gZmFsc2U7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRSQUNLQkFMTF9LRVlfVElNRU9VVCA9IDEwMDA7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRSQUNLQkFMTF9USU1FT1VUID0gMjAwOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUUkFDS0JBTExfV0FJVCA9IDEwMDsKQEAgLTUzMTMsMTAgKzUxMjYsOCBAQAogICAgICAgICAgICAgaWYgKGV2LmdldFkoKSA8IDApIHBhZ2VVcCh0cnVlKTsKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9Ci0gICAgICAgIGJvb2xlYW4gc2hpZnRQcmVzc2VkID0gbVNoaWZ0SXNQcmVzc2VkICYmIChtTmF0aXZlQ2xhc3MgPT0gMAotICAgICAgICAgICAgICAgIHx8ICFuYXRpdmVGb2N1c0lzUGx1Z2luKCkpOwogICAgICAgICBpZiAoZXYuZ2V0QWN0aW9uKCkgPT0gTW90aW9uRXZlbnQuQUNUSU9OX0RPV04pIHsKLSAgICAgICAgICAgIGlmIChzaGlmdFByZXNzZWQpIHsKKyAgICAgICAgICAgIGlmIChtU2VsZWN0aW5nVGV4dCkgewogICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOyAvLyBkaXNjYXJkIHByZXNzIGlmIGNvcHkgaW4gcHJvZ3Jlc3MKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1UcmFja2JhbGxEb3duID0gdHJ1ZTsKQEAgLTUzNDEsMTEgKzUxNTIsMTMgQEAKICAgICAgICAgICAgIG1Qcml2YXRlSGFuZGxlci5yZW1vdmVNZXNzYWdlcyhMT05HX1BSRVNTX0NFTlRFUik7CiAgICAgICAgICAgICBtVHJhY2tiYWxsRG93biA9IGZhbHNlOwogICAgICAgICAgICAgbVRyYWNrYmFsbFVwVGltZSA9IHRpbWU7Ci0gICAgICAgICAgICBpZiAoc2hpZnRQcmVzc2VkKSB7CisgICAgICAgICAgICBpZiAobVNlbGVjdGluZ1RleHQpIHsKICAgICAgICAgICAgICAgICBpZiAobUV4dGVuZFNlbGVjdGlvbikgewotICAgICAgICAgICAgICAgICAgICBjb21taXRDb3B5KCk7CisgICAgICAgICAgICAgICAgICAgIGNvcHlTZWxlY3Rpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uRG9uZSgpOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIG1FeHRlbmRTZWxlY3Rpb24gPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBuYXRpdmVTZXRFeHRlbmRTZWxlY3Rpb24oKTsKICAgICAgICAgICAgICAgICAgICAgaW52YWxpZGF0ZSgpOyAvLyBkcmF3IHRoZSBpLWJlYW0gaW5zdGVhZCBvZiB0aGUgYXJyb3cKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7IC8vIGRpc2NhcmQgcHJlc3MgaWYgY29weSBpbiBwcm9ncmVzcwpAQCAtNTQxMiw4ICs1MjI1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgKyAiIHlSYXRlPSIgKyB5UmF0ZQogICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICB9Ci0gICAgICAgIG5hdGl2ZU1vdmVTZWxlY3Rpb24odmlld1RvQ29udGVudFgobVNlbGVjdFgpLAotICAgICAgICAgICAgICAgIHZpZXdUb0NvbnRlbnRZKG1TZWxlY3RZKSwgbUV4dGVuZFNlbGVjdGlvbik7CisgICAgICAgIG5hdGl2ZU1vdmVTZWxlY3Rpb24odmlld1RvQ29udGVudFgobVNlbGVjdFgpLCB2aWV3VG9Db250ZW50WShtU2VsZWN0WSkpOwogICAgICAgICBpbnQgc2Nyb2xsWCA9IG1TZWxlY3RYIDwgbVNjcm9sbFggPyAtU0VMRUNUX0NVUlNPUl9PRkZTRVQKICAgICAgICAgICAgICAgICA6IG1TZWxlY3RYID4gbWF4WCAtIFNFTEVDVF9DVVJTT1JfT0ZGU0VUID8gU0VMRUNUX0NVUlNPUl9PRkZTRVQKICAgICAgICAgICAgICAgICA6IDA7CkBAIC01NDc5LDcgKzUyOTEsMTYgQEAKICAgICAgICAgZmxvYXQgeVJhdGUgPSBtVHJhY2tiYWxsUmVtYWluc1kgKiAxMDAwIC8gZWxhcHNlZDsKICAgICAgICAgaW50IHZpZXdXaWR0aCA9IGdldFZpZXdXaWR0aCgpOwogICAgICAgICBpbnQgdmlld0hlaWdodCA9IGdldFZpZXdIZWlnaHQoKTsKLSAgICAgICAgaWYgKG1TaGlmdElzUHJlc3NlZCAmJiAobU5hdGl2ZUNsYXNzID09IDAgfHwgIW5hdGl2ZUZvY3VzSXNQbHVnaW4oKSkpIHsKKyAgICAgICAgaWYgKG1TZWxlY3RpbmdUZXh0KSB7CisgICAgICAgICAgICBpZiAoIW1EcmF3U2VsZWN0aW9uUG9pbnRlcikgeworICAgICAgICAgICAgICAgIC8vIFRoZSBsYXN0IHNlbGVjdGlvbiB3YXMgbWFkZSBieSB0b3VjaCwgZGlzYWJsaW5nIGRyYXdpbmcgdGhlCisgICAgICAgICAgICAgICAgLy8gc2VsZWN0aW9uIHBvaW50ZXIuIEFsbG93IHRoZSB0cmFja2JhbGwgdG8gYWRqdXN0IHRoZQorICAgICAgICAgICAgICAgIC8vIHBvc2l0aW9uIG9mIHRoZSB0b3VjaCBjb250cm9sLgorICAgICAgICAgICAgICAgIG1TZWxlY3RYID0gY29udGVudFRvVmlld1gobmF0aXZlU2VsZWN0aW9uWCgpKTsKKyAgICAgICAgICAgICAgICBtU2VsZWN0WSA9IGNvbnRlbnRUb1ZpZXdZKG5hdGl2ZVNlbGVjdGlvblkoKSk7CisgICAgICAgICAgICAgICAgbURyYXdTZWxlY3Rpb25Qb2ludGVyID0gbUV4dGVuZFNlbGVjdGlvbiA9IHRydWU7CisgICAgICAgICAgICAgICAgbmF0aXZlU2V0RXh0ZW5kU2VsZWN0aW9uKCk7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBtb3ZlU2VsZWN0aW9uKHNjYWxlVHJhY2tiYWxsWCh4UmF0ZSwgdmlld1dpZHRoKSwKICAgICAgICAgICAgICAgICAgICAgc2NhbGVUcmFja2JhbGxZKHlSYXRlLCB2aWV3SGVpZ2h0KSk7CiAgICAgICAgICAgICBtVHJhY2tiYWxsUmVtYWluc1ggPSBtVHJhY2tiYWxsUmVtYWluc1kgPSAwOwpAQCAtNTUxNywxMSArNTMzOCwxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgKyAiIG1UcmFja2JhbGxSZW1haW5zWD0iICsgbVRyYWNrYmFsbFJlbWFpbnNYCiAgICAgICAgICAgICAgICAgICAgICAgICArICIgbVRyYWNrYmFsbFJlbWFpbnNZPSIgKyBtVHJhY2tiYWxsUmVtYWluc1kpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1OYXRpdmVDbGFzcyAhPSAwICYmIG5hdGl2ZUZvY3VzSXNQbHVnaW4oKSkgeworICAgICAgICAgICAgaWYgKG1OYXRpdmVDbGFzcyAhPSAwICYmIG5hdGl2ZVBhZ2VTaG91bGRIYW5kbGVTaGlmdEFuZEFycm93cygpKSB7CiAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxldFBsdWdpbkhhbmRsZU5hdktleShzZWxlY3RLZXlDb2RlLCB0aW1lLCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgbGV0UGFnZUhhbmRsZU5hdktleShzZWxlY3RLZXlDb2RlLCB0aW1lLCB0cnVlKTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbGV0UGx1Z2luSGFuZGxlTmF2S2V5KHNlbGVjdEtleUNvZGUsIHRpbWUsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICBsZXRQYWdlSGFuZGxlTmF2S2V5KHNlbGVjdEtleUNvZGUsIHRpbWUsIGZhbHNlKTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAobmF2SGFuZGxlZEtleShzZWxlY3RLZXlDb2RlLCBjb3VudCwgZmFsc2UsIHRpbWUpKSB7CiAgICAgICAgICAgICAgICAgcGxheVNvdW5kRWZmZWN0KGtleUNvZGVUb1NvdW5kc0VmZmVjdChzZWxlY3RLZXlDb2RlKSk7CiAgICAgICAgICAgICB9CkBAIC01NTYwLDYgKzUzODEsMTkgQEAKICAgICAgICAgICAgICAgICAtIGdldFZpZXdIZWlnaHRXaXRoVGl0bGUoKSwgMCk7CiAgICAgfQogCisgICAgYm9vbGVhbiB1cGRhdGVTY3JvbGxDb29yZGluYXRlcyhpbnQgeCwgaW50IHkpIHsKKyAgICAgICAgaW50IG9sZFggPSBtU2Nyb2xsWDsKKyAgICAgICAgaW50IG9sZFkgPSBtU2Nyb2xsWTsKKyAgICAgICAgbVNjcm9sbFggPSB4OworICAgICAgICBtU2Nyb2xsWSA9IHk7CisgICAgICAgIGlmIChvbGRYICE9IG1TY3JvbGxYIHx8IG9sZFkgIT0gbVNjcm9sbFkpIHsKKyAgICAgICAgICAgIG9uU2Nyb2xsQ2hhbmdlZChtU2Nyb2xsWCwgbVNjcm9sbFksIG9sZFgsIG9sZFkpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKICAgICBwdWJsaWMgdm9pZCBmbGluZ1Njcm9sbChpbnQgdngsIGludCB2eSkgewogICAgICAgICBtU2Nyb2xsZXIuZmxpbmcobVNjcm9sbFgsIG1TY3JvbGxZLCB2eCwgdnksIDAsIGNvbXB1dGVNYXhTY3JvbGxYKCksIDAsCiAgICAgICAgICAgICAgICAgY29tcHV0ZU1heFNjcm9sbFkoKSk7CkBAIC01NTk1LDEzICs1NDI5LDE2IEBACiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICAgICAgZmxvYXQgY3VycmVudFZlbG9jaXR5ID0gbVNjcm9sbGVyLmdldEN1cnJWZWxvY2l0eSgpOwotICAgICAgICBpZiAobUxhc3RWZWxvY2l0eSA+IDAgJiYgY3VycmVudFZlbG9jaXR5ID4gMCkgeworICAgICAgICBmbG9hdCB2ZWxvY2l0eSA9IChmbG9hdCkgTWF0aC5oeXBvdCh2eCwgdnkpOworICAgICAgICBpZiAobUxhc3RWZWxvY2l0eSA+IDAgJiYgY3VycmVudFZlbG9jaXR5ID4gMCAmJiB2ZWxvY2l0eQorICAgICAgICAgICAgICAgID4gbUxhc3RWZWxvY2l0eSAqIE1JTklNVU1fVkVMT0NJVFlfUkFUSU9fRk9SX0FDQ0VMRVJBVElPTikgewogICAgICAgICAgICAgZmxvYXQgZGVsdGFSID0gKGZsb2F0KSAoTWF0aC5hYnMoTWF0aC5hdGFuMihtTGFzdFZlbFksIG1MYXN0VmVsWCkKICAgICAgICAgICAgICAgICAgICAgLSBNYXRoLmF0YW4yKHZ5LCB2eCkpKTsKICAgICAgICAgICAgIGZpbmFsIGZsb2F0IGNpcmNsZSA9IChmbG9hdCkgKE1hdGguUEkpICogMi4wZjsKICAgICAgICAgICAgIGlmIChkZWx0YVIgPiBjaXJjbGUgKiAwLjlmIHx8IGRlbHRhUiA8IGNpcmNsZSAqIDAuMWYpIHsKICAgICAgICAgICAgICAgICB2eCArPSBjdXJyZW50VmVsb2NpdHkgKiBtTGFzdFZlbFggLyBtTGFzdFZlbG9jaXR5OwogICAgICAgICAgICAgICAgIHZ5ICs9IGN1cnJlbnRWZWxvY2l0eSAqIG1MYXN0VmVsWSAvIG1MYXN0VmVsb2NpdHk7CisgICAgICAgICAgICAgICAgdmVsb2NpdHkgPSAoZmxvYXQpIE1hdGguaHlwb3QodngsIHZ5KTsKICAgICAgICAgICAgICAgICBpZiAoRGVidWdGbGFncy5XRUJfVklFVykgewogICAgICAgICAgICAgICAgICAgICBMb2cudihMT0dUQUcsICJkb0ZsaW5nIHZ4PSAiICsgdnggKyAiIHZ5PSIgKyB2eSk7CiAgICAgICAgICAgICAgICAgfQpAQCAtNTYxNyw3ICs1NDU0LDcgQEAKICAgICAgICAgfQogICAgICAgICBtTGFzdFZlbFggPSB2eDsKICAgICAgICAgbUxhc3RWZWxZID0gdnk7Ci0gICAgICAgIG1MYXN0VmVsb2NpdHkgPSAoZmxvYXQpIE1hdGguaHlwb3QodngsIHZ5KTsKKyAgICAgICAgbUxhc3RWZWxvY2l0eSA9IHZlbG9jaXR5OwogCiAgICAgICAgIG1TY3JvbGxlci5mbGluZyhtU2Nyb2xsWCwgbVNjcm9sbFksIC12eCwgLXZ5LCAwLCBtYXhYLCAwLCBtYXhZKTsKICAgICAgICAgLy8gVE9ETzogZHVyYXRpb24gaXMgY2FsY3VsYXRlZCBiYXNlZCBvbiB2ZWxvY2l0eSwgaWYgdGhlIHJhbmdlIGlzCkBAIC01NjMwLDMyICs1NDY3LDYgQEAKICAgICAgICAgaW52YWxpZGF0ZSgpOwogICAgIH0KIAotICAgIHByaXZhdGUgYm9vbGVhbiB6b29tV2l0aFByZXZpZXcoZmxvYXQgc2NhbGUsIGJvb2xlYW4gdXBkYXRlVGV4dFdyYXBTY2FsZSkgewotICAgICAgICBmbG9hdCBvbGRTY2FsZSA9IG1BY3R1YWxTY2FsZTsKLSAgICAgICAgbUluaXRpYWxTY3JvbGxYID0gbVNjcm9sbFg7Ci0gICAgICAgIG1Jbml0aWFsU2Nyb2xsWSA9IG1TY3JvbGxZOwotCi0gICAgICAgIC8vIHNuYXAgdG8gREVGQVVMVF9TQ0FMRSBpZiBpdCBpcyBjbG9zZQotICAgICAgICBpZiAoTWF0aC5hYnMoc2NhbGUgLSBtRGVmYXVsdFNjYWxlKSA8IE1JTklNVU1fU0NBTEVfSU5DUkVNRU5UKSB7Ci0gICAgICAgICAgICBzY2FsZSA9IG1EZWZhdWx0U2NhbGU7Ci0gICAgICAgIH0KLQotICAgICAgICBzZXROZXdab29tU2NhbGUoc2NhbGUsIHVwZGF0ZVRleHRXcmFwU2NhbGUsIGZhbHNlKTsKLQotICAgICAgICBpZiAob2xkU2NhbGUgIT0gbUFjdHVhbFNjYWxlKSB7Ci0gICAgICAgICAgICAvLyB1c2UgbVpvb21QaWNrZXJTY2FsZSB0byBzZWUgem9vbSBwcmV2aWV3IGZpcnN0Ci0gICAgICAgICAgICBtWm9vbVN0YXJ0ID0gU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCk7Ci0gICAgICAgICAgICBtSW52SW5pdGlhbFpvb21TY2FsZSA9IDEuMGYgLyBvbGRTY2FsZTsKLSAgICAgICAgICAgIG1JbnZGaW5hbFpvb21TY2FsZSA9IDEuMGYgLyBtQWN0dWFsU2NhbGU7Ci0gICAgICAgICAgICBtWm9vbVNjYWxlID0gbUFjdHVhbFNjYWxlOwotICAgICAgICAgICAgV2ViVmlld0NvcmUucGF1c2VVcGRhdGVQaWN0dXJlKG1XZWJWaWV3Q29yZSk7Ci0gICAgICAgICAgICBpbnZhbGlkYXRlKCk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQogICAgIC8qKgogICAgICAqIFJldHVybnMgYSB2aWV3IGNvbnRhaW5pbmcgem9vbSBjb250cm9scyBpLmUuICsvLSBidXR0b25zLiBUaGUgY2FsbGVyIGlzCiAgICAgICogaW4gY2hhcmdlIG9mIGluc3RhbGxpbmcgdGhpcyB2aWV3IHRvIHRoZSB2aWV3IGhpZXJhcmNoeS4gVGhpcyB2aWV3IHdpbGwKQEAgLTU2NzUsODEgKzU0ODYsMjkgQEAKICAgICAgICAgICAgIExvZy53KExPR1RBRywgIlRoaXMgV2ViVmlldyBkb2Vzbid0IHN1cHBvcnQgem9vbS4iKTsKICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICB9Ci0gICAgICAgIGlmIChtWm9vbUNvbnRyb2xzID09IG51bGwpIHsKLSAgICAgICAgICAgIG1ab29tQ29udHJvbHMgPSBjcmVhdGVab29tQ29udHJvbHMoKTsKLQotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIG5lZWQgdG8gYmUgc2V0IHRvIFZJU0lCTEUgZmlyc3Qgc28gdGhhdCBnZXRNZWFzdXJlZEhlaWdodCgpIGluCi0gICAgICAgICAgICAgKiB7QGxpbmsgI29uU2l6ZUNoYW5nZWQoKX0gY2FuIHJldHVybiB0aGUgbWVhc3VyZWQgdmFsdWUgZm9yIHByb3BlcgotICAgICAgICAgICAgICogbGF5b3V0LgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBtWm9vbUNvbnRyb2xzLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgIG1ab29tQ29udHJvbFJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLQotICAgICAgICAgICAgICAgICAgICAvKiBEb24ndCBkaXNtaXNzIHRoZSBjb250cm9scyBpZiB0aGUgdXNlciBoYXMKLSAgICAgICAgICAgICAgICAgICAgICogZm9jdXMgb24gdGhlbS4gV2FpdCBhbmQgY2hlY2sgYWdhaW4gbGF0ZXIuCi0gICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICBpZiAoIW1ab29tQ29udHJvbHMuaGFzRm9jdXMoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbVpvb21Db250cm9scy5oaWRlKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtUHJpdmF0ZUhhbmRsZXIucmVtb3ZlQ2FsbGJhY2tzKG1ab29tQ29udHJvbFJ1bm5hYmxlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Qcml2YXRlSGFuZGxlci5wb3N0RGVsYXllZChtWm9vbUNvbnRyb2xSdW5uYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWk9PTV9DT05UUk9MU19USU1FT1VUKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH07Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1ab29tQ29udHJvbHM7CisgICAgICAgIHJldHVybiBtWm9vbU1hbmFnZXIuZ2V0RXh0ZXJuYWxab29tUGlja2VyKCk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBFeHRlbmRlZFpvb21Db250cm9scyBjcmVhdGVab29tQ29udHJvbHMoKSB7Ci0gICAgICAgIEV4dGVuZGVkWm9vbUNvbnRyb2xzIHpvb21Db250cm9scyA9IG5ldyBFeHRlbmRlZFpvb21Db250cm9scyhtQ29udGV4dAotICAgICAgICAgICAgLCBudWxsKTsKLSAgICAgICAgem9vbUNvbnRyb2xzLnNldE9uWm9vbUluQ2xpY2tMaXN0ZW5lcihuZXcgT25DbGlja0xpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKLSAgICAgICAgICAgICAgICAvLyByZXNldCB0aW1lIG91dAotICAgICAgICAgICAgICAgIG1Qcml2YXRlSGFuZGxlci5yZW1vdmVDYWxsYmFja3MobVpvb21Db250cm9sUnVubmFibGUpOwotICAgICAgICAgICAgICAgIG1Qcml2YXRlSGFuZGxlci5wb3N0RGVsYXllZChtWm9vbUNvbnRyb2xSdW5uYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFpPT01fQ09OVFJPTFNfVElNRU9VVCk7Ci0gICAgICAgICAgICAgICAgem9vbUluKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICB6b29tQ29udHJvbHMuc2V0T25ab29tT3V0Q2xpY2tMaXN0ZW5lcihuZXcgT25DbGlja0xpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKLSAgICAgICAgICAgICAgICAvLyByZXNldCB0aW1lIG91dAotICAgICAgICAgICAgICAgIG1Qcml2YXRlSGFuZGxlci5yZW1vdmVDYWxsYmFja3MobVpvb21Db250cm9sUnVubmFibGUpOwotICAgICAgICAgICAgICAgIG1Qcml2YXRlSGFuZGxlci5wb3N0RGVsYXllZChtWm9vbUNvbnRyb2xSdW5uYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFpPT01fQ09OVFJPTFNfVElNRU9VVCk7Ci0gICAgICAgICAgICAgICAgem9vbU91dCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgcmV0dXJuIHpvb21Db250cm9sczsKKyAgICB2b2lkIGRpc21pc3Nab29tQ29udHJvbCgpIHsKKyAgICAgICAgbVpvb21NYW5hZ2VyLmRpc21pc3Nab29tUGlja2VyKCk7CisgICAgfQorCisgICAgZmxvYXQgZ2V0RGVmYXVsdFpvb21TY2FsZSgpIHsKKyAgICAgICAgcmV0dXJuIG1ab29tTWFuYWdlci5nZXREZWZhdWx0U2NhbGUoKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB7QGxpbmsgWm9vbUJ1dHRvbnNDb250cm9sbGVyfSB3aGljaCBjYW4gYmUgdXNlZCB0byBhZGQKLSAgICAgKiBhZGRpdGlvbmFsIGJ1dHRvbnMgdG8gdGhlIHpvb20gY29udHJvbHMgd2luZG93LgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgaW5zdGFuY2Ugb2Yge0BsaW5rIFpvb21CdXR0b25zQ29udHJvbGxlcn0gdXNlZCBieSB0aGlzIGNsYXNzLAotICAgICAqICAgICAgICAgb3IgbnVsbCBpZiBpdCBpcyB1bmF2YWlsYWJsZS4KLSAgICAgKiBAaGlkZQorICAgICAqIEByZXR1cm4gVFJVRSBpZiB0aGUgV2ViVmlldyBjYW4gYmUgem9vbWVkIGluLgogICAgICAqLwotICAgIHB1YmxpYyBab29tQnV0dG9uc0NvbnRyb2xsZXIgZ2V0Wm9vbUJ1dHRvbnNDb250cm9sbGVyKCkgewotICAgICAgICBpZiAobVpvb21CdXR0b25zQ29udHJvbGxlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtWm9vbUJ1dHRvbnNDb250cm9sbGVyID0gbmV3IFpvb21CdXR0b25zQ29udHJvbGxlcih0aGlzKTsKLSAgICAgICAgICAgIG1ab29tQnV0dG9uc0NvbnRyb2xsZXIuc2V0T25ab29tTGlzdGVuZXIobVpvb21MaXN0ZW5lcik7Ci0gICAgICAgICAgICAvLyBab29tQnV0dG9uc0NvbnRyb2xsZXIgcG9zaXRpb25zIHRoZSBidXR0b25zIGF0IHRoZSBib3R0b20sIGJ1dCBpbgotICAgICAgICAgICAgLy8gdGhlIG1pZGRsZS4gQ2hhbmdlIHRoZWlyIGxheW91dCBwYXJhbWV0ZXJzIHNvIHRoZXkgYXBwZWFyIG9uIHRoZQotICAgICAgICAgICAgLy8gcmlnaHQuCi0gICAgICAgICAgICBWaWV3IGNvbnRyb2xzID0gbVpvb21CdXR0b25zQ29udHJvbGxlci5nZXRab29tQ29udHJvbHMoKTsKLSAgICAgICAgICAgIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMgcGFyYW1zID0gY29udHJvbHMuZ2V0TGF5b3V0UGFyYW1zKCk7Ci0gICAgICAgICAgICBpZiAocGFyYW1zIGluc3RhbmNlb2YgRnJhbWVMYXlvdXQuTGF5b3V0UGFyYW1zKSB7Ci0gICAgICAgICAgICAgICAgRnJhbWVMYXlvdXQuTGF5b3V0UGFyYW1zIGZyYW1lUGFyYW1zID0gKEZyYW1lTGF5b3V0LkxheW91dFBhcmFtcykgcGFyYW1zOwotICAgICAgICAgICAgICAgIGZyYW1lUGFyYW1zLmdyYXZpdHkgPSBHcmF2aXR5LlJJR0hUOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtWm9vbUJ1dHRvbnNDb250cm9sbGVyOworICAgIHB1YmxpYyBib29sZWFuIGNhblpvb21JbigpIHsKKyAgICAgICAgcmV0dXJuIG1ab29tTWFuYWdlci5jYW5ab29tSW4oKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFRSVUUgaWYgdGhlIFdlYlZpZXcgY2FuIGJlIHpvb21lZCBvdXQuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gY2FuWm9vbU91dCgpIHsKKyAgICAgICAgcmV0dXJuIG1ab29tTWFuYWdlci5jYW5ab29tT3V0KCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC01NzU3LDE1ICs1NTE2LDcgQEAKICAgICAgKiBAcmV0dXJuIFRSVUUgaWYgem9vbSBpbiBzdWNjZWVkcy4gRkFMU0UgaWYgbm8gem9vbSBjaGFuZ2VzLgogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIHpvb21JbigpIHsKLSAgICAgICAgLy8gVE9ETzogYWx0ZXJuYXRpdmVseSB3ZSBjYW4gZGlzYWxsb3cgdGhpcyBkdXJpbmcgZHJhdyBoaXN0b3J5IG1vZGUKLSAgICAgICAgc3dpdGNoT3V0RHJhd0hpc3RvcnkoKTsKLSAgICAgICAgbUluWm9vbU92ZXJ2aWV3ID0gZmFsc2U7Ci0gICAgICAgIC8vIENlbnRlciB6b29taW5nIHRvIHRoZSBjZW50ZXIgb2YgdGhlIHNjcmVlbi4KLSAgICAgICAgbVpvb21DZW50ZXJYID0gZ2V0Vmlld1dpZHRoKCkgKiAuNWY7Ci0gICAgICAgIG1ab29tQ2VudGVyWSA9IGdldFZpZXdIZWlnaHQoKSAqIC41ZjsKLSAgICAgICAgbUFuY2hvclggPSB2aWV3VG9Db250ZW50WCgoaW50KSBtWm9vbUNlbnRlclggKyBtU2Nyb2xsWCk7Ci0gICAgICAgIG1BbmNob3JZID0gdmlld1RvQ29udGVudFkoKGludCkgbVpvb21DZW50ZXJZICsgbVNjcm9sbFkpOwotICAgICAgICByZXR1cm4gem9vbVdpdGhQcmV2aWV3KG1BY3R1YWxTY2FsZSAqIDEuMjVmLCB0cnVlKTsKKyAgICAgICAgcmV0dXJuIG1ab29tTWFuYWdlci56b29tSW4oKTsKICAgICB9CiAKICAgICAvKioKQEAgLTU3NzMsMTQgKzU1MjQsNyBAQAogICAgICAqIEByZXR1cm4gVFJVRSBpZiB6b29tIG91dCBzdWNjZWVkcy4gRkFMU0UgaWYgbm8gem9vbSBjaGFuZ2VzLgogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIHpvb21PdXQoKSB7Ci0gICAgICAgIC8vIFRPRE86IGFsdGVybmF0aXZlbHkgd2UgY2FuIGRpc2FsbG93IHRoaXMgZHVyaW5nIGRyYXcgaGlzdG9yeSBtb2RlCi0gICAgICAgIHN3aXRjaE91dERyYXdIaXN0b3J5KCk7Ci0gICAgICAgIC8vIENlbnRlciB6b29taW5nIHRvIHRoZSBjZW50ZXIgb2YgdGhlIHNjcmVlbi4KLSAgICAgICAgbVpvb21DZW50ZXJYID0gZ2V0Vmlld1dpZHRoKCkgKiAuNWY7Ci0gICAgICAgIG1ab29tQ2VudGVyWSA9IGdldFZpZXdIZWlnaHQoKSAqIC41ZjsKLSAgICAgICAgbUFuY2hvclggPSB2aWV3VG9Db250ZW50WCgoaW50KSBtWm9vbUNlbnRlclggKyBtU2Nyb2xsWCk7Ci0gICAgICAgIG1BbmNob3JZID0gdmlld1RvQ29udGVudFkoKGludCkgbVpvb21DZW50ZXJZICsgbVNjcm9sbFkpOwotICAgICAgICByZXR1cm4gem9vbVdpdGhQcmV2aWV3KG1BY3R1YWxTY2FsZSAqIDAuOGYsIHRydWUpOworICAgICAgICByZXR1cm4gbVpvb21NYW5hZ2VyLnpvb21PdXQoKTsKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgdXBkYXRlU2VsZWN0aW9uKCkgewpAQCAtNTg4MSw3ICs1NjI1LDE0IEBACiAgICAgICAgIC8vIG1MYXN0VG91Y2hYIGFuZCBtTGFzdFRvdWNoWSBhcmUgdGhlIHBvaW50IGluIHRoZSBjdXJyZW50IHZpZXdwb3J0CiAgICAgICAgIGludCBjb250ZW50WCA9IHZpZXdUb0NvbnRlbnRYKChpbnQpIG1MYXN0VG91Y2hYICsgbVNjcm9sbFgpOwogICAgICAgICBpbnQgY29udGVudFkgPSB2aWV3VG9Db250ZW50WSgoaW50KSBtTGFzdFRvdWNoWSArIG1TY3JvbGxZKTsKLSAgICAgICAgaWYgKG5hdGl2ZVBvaW50SW5OYXZDYWNoZShjb250ZW50WCwgY29udGVudFksIG1OYXZTbG9wKSkgeworICAgICAgICBpZiAoZ2V0U2V0dGluZ3MoKS5zdXBwb3J0VG91Y2hPbmx5KCkpIHsKKyAgICAgICAgICAgIHJlbW92ZVRvdWNoSGlnaGxpZ2h0KGZhbHNlKTsKKyAgICAgICAgICAgIFdlYlZpZXdDb3JlLlRvdWNoVXBEYXRhIHRvdWNoVXBEYXRhID0gbmV3IFdlYlZpZXdDb3JlLlRvdWNoVXBEYXRhKCk7CisgICAgICAgICAgICAvLyB1c2UgIjAiIGFzIGdlbmVyYXRpb24gaWQgdG8gaW5mb3JtIFdlYktpdCB0byB1c2UgdGhlIHNhbWUgeC95IGFzCisgICAgICAgICAgICAvLyBpdCB1c2VkIHdoZW4gcHJvY2Vzc2luZyBHRVRfVE9VQ0hfSElHSExJR0hUX1JFQ1RTCisgICAgICAgICAgICB0b3VjaFVwRGF0YS5tTW92ZUdlbmVyYXRpb24gPSAwOworICAgICAgICAgICAgbVdlYlZpZXdDb3JlLnNlbmRNZXNzYWdlKEV2ZW50SHViLlRPVUNIX1VQLCB0b3VjaFVwRGF0YSk7CisgICAgICAgIH0gZWxzZSBpZiAobmF0aXZlUG9pbnRJbk5hdkNhY2hlKGNvbnRlbnRYLCBjb250ZW50WSwgbU5hdlNsb3ApKSB7CiAgICAgICAgICAgICBXZWJWaWV3Q29yZS5Nb3Rpb25VcERhdGEgbW90aW9uVXBEYXRhID0gbmV3IFdlYlZpZXdDb3JlCiAgICAgICAgICAgICAgICAgICAgIC5Nb3Rpb25VcERhdGEoKTsKICAgICAgICAgICAgIG1vdGlvblVwRGF0YS5tRnJhbWUgPSBuYXRpdmVDYWNoZUhpdEZyYW1lUG9pbnRlcigpOwpAQCAtNTkwOSwyNyArNTY2MCwxNiBAQAogICAgICAqIFJldHVybiB0cnVlIGlmIHRoZSB2aWV3IChQbHVnaW4pIGlzIGZ1bGx5IHZpc2libGUgYW5kIG1heGltaXplZCBpbnNpZGUKICAgICAgKiB0aGUgV2ViVmlldy4KICAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNQbHVnaW5GaXRPblNjcmVlbihWaWV3TWFuYWdlci5DaGlsZFZpZXcgdmlldykgewotICAgICAgICBpbnQgdmlld1dpZHRoID0gZ2V0Vmlld1dpZHRoKCk7Ci0gICAgICAgIGludCB2aWV3SGVpZ2h0ID0gZ2V0Vmlld0hlaWdodFdpdGhUaXRsZSgpOwotICAgICAgICBmbG9hdCBzY2FsZSA9IE1hdGgubWluKChmbG9hdCkgdmlld1dpZHRoIC8gdmlldy53aWR0aCwKLSAgICAgICAgICAgICAgICAoZmxvYXQpIHZpZXdIZWlnaHQgLyB2aWV3LmhlaWdodCk7Ci0gICAgICAgIGlmIChzY2FsZSA8IG1NaW5ab29tU2NhbGUpIHsKLSAgICAgICAgICAgIHNjYWxlID0gbU1pblpvb21TY2FsZTsKLSAgICAgICAgfSBlbHNlIGlmIChzY2FsZSA+IG1NYXhab29tU2NhbGUpIHsKLSAgICAgICAgICAgIHNjYWxlID0gbU1heFpvb21TY2FsZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoTWF0aC5hYnMoc2NhbGUgLSBtQWN0dWFsU2NhbGUpIDwgTUlOSU1VTV9TQ0FMRV9JTkNSRU1FTlQpIHsKLSAgICAgICAgICAgIGlmIChjb250ZW50VG9WaWV3WCh2aWV3LngpID49IG1TY3JvbGxYCi0gICAgICAgICAgICAgICAgICAgICYmIGNvbnRlbnRUb1ZpZXdYKHZpZXcueCArIHZpZXcud2lkdGgpIDw9IG1TY3JvbGxYCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB2aWV3V2lkdGgKLSAgICAgICAgICAgICAgICAgICAgJiYgY29udGVudFRvVmlld1kodmlldy55KSA+PSBtU2Nyb2xsWQotICAgICAgICAgICAgICAgICAgICAmJiBjb250ZW50VG9WaWV3WSh2aWV3LnkgKyB2aWV3LmhlaWdodCkgPD0gbVNjcm9sbFkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHZpZXdIZWlnaHQpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgYm9vbGVhbiBpc1BsdWdpbkZpdE9uU2NyZWVuKFZpZXdNYW5hZ2VyLkNoaWxkVmlldyB2aWV3KSB7CisgICAgICAgIGZpbmFsIGludCB2aWV3V2lkdGggPSBnZXRWaWV3V2lkdGgoKTsKKyAgICAgICAgZmluYWwgaW50IHZpZXdIZWlnaHQgPSBnZXRWaWV3SGVpZ2h0V2l0aFRpdGxlKCk7CisgICAgICAgIGZsb2F0IHNjYWxlID0gTWF0aC5taW4oKGZsb2F0KSB2aWV3V2lkdGggLyB2aWV3LndpZHRoLCAoZmxvYXQpIHZpZXdIZWlnaHQgLyB2aWV3LmhlaWdodCk7CisgICAgICAgIHNjYWxlID0gbVpvb21NYW5hZ2VyLmNvbXB1dGVTY2FsZVdpdGhMaW1pdHMoc2NhbGUpOworICAgICAgICByZXR1cm4gIW1ab29tTWFuYWdlci53aWxsU2NhbGVUcmlnZ2VyWm9vbShzY2FsZSkKKyAgICAgICAgICAgICAgICAmJiBjb250ZW50VG9WaWV3WCh2aWV3LngpID49IG1TY3JvbGxYCisgICAgICAgICAgICAgICAgJiYgY29udGVudFRvVmlld1godmlldy54ICsgdmlldy53aWR0aCkgPD0gbVNjcm9sbFggKyB2aWV3V2lkdGgKKyAgICAgICAgICAgICAgICAmJiBjb250ZW50VG9WaWV3WSh2aWV3LnkpID49IG1TY3JvbGxZCisgICAgICAgICAgICAgICAgJiYgY29udGVudFRvVmlld1kodmlldy55ICsgdmlldy5oZWlnaHQpIDw9IG1TY3JvbGxZICsgdmlld0hlaWdodDsKICAgICB9CiAKICAgICAvKgpAQCAtNTkzOCwyMiArNTY3OCwxOSBAQAogICAgICAqIGFuaW1hdGVkIHNjcm9sbCB0byBjZW50ZXIgaXQuIElmIHRoZSB6b29tIG5lZWRzIHRvIGJlIGNoYW5nZWQsIGZpbmQgdGhlCiAgICAgICogem9vbSBjZW50ZXIgYW5kIGRvIGEgc21vb3RoIHpvb20gdHJhbnNpdGlvbi4KICAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgY2VudGVyRml0UmVjdChpbnQgZG9jWCwgaW50IGRvY1ksIGludCBkb2NXaWR0aCwgaW50IGRvY0hlaWdodCkgeworICAgIHZvaWQgY2VudGVyRml0UmVjdChpbnQgZG9jWCwgaW50IGRvY1ksIGludCBkb2NXaWR0aCwgaW50IGRvY0hlaWdodCkgewogICAgICAgICBpbnQgdmlld1dpZHRoID0gZ2V0Vmlld1dpZHRoKCk7CiAgICAgICAgIGludCB2aWV3SGVpZ2h0ID0gZ2V0Vmlld0hlaWdodFdpdGhUaXRsZSgpOwogICAgICAgICBmbG9hdCBzY2FsZSA9IE1hdGgubWluKChmbG9hdCkgdmlld1dpZHRoIC8gZG9jV2lkdGgsIChmbG9hdCkgdmlld0hlaWdodAogICAgICAgICAgICAgICAgIC8gZG9jSGVpZ2h0KTsKLSAgICAgICAgaWYgKHNjYWxlIDwgbU1pblpvb21TY2FsZSkgewotICAgICAgICAgICAgc2NhbGUgPSBtTWluWm9vbVNjYWxlOwotICAgICAgICB9IGVsc2UgaWYgKHNjYWxlID4gbU1heFpvb21TY2FsZSkgewotICAgICAgICAgICAgc2NhbGUgPSBtTWF4Wm9vbVNjYWxlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChNYXRoLmFicyhzY2FsZSAtIG1BY3R1YWxTY2FsZSkgPCBNSU5JTVVNX1NDQUxFX0lOQ1JFTUVOVCkgeworICAgICAgICBzY2FsZSA9IG1ab29tTWFuYWdlci5jb21wdXRlU2NhbGVXaXRoTGltaXRzKHNjYWxlKTsKKyAgICAgICAgaWYgKCFtWm9vbU1hbmFnZXIud2lsbFNjYWxlVHJpZ2dlclpvb20oc2NhbGUpKSB7CiAgICAgICAgICAgICBwaW5TY3JvbGxUbyhjb250ZW50VG9WaWV3WChkb2NYICsgZG9jV2lkdGggLyAyKSAtIHZpZXdXaWR0aCAvIDIsCiAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRUb1ZpZXdZKGRvY1kgKyBkb2NIZWlnaHQgLyAyKSAtIHZpZXdIZWlnaHQgLyAyLAogICAgICAgICAgICAgICAgICAgICB0cnVlLCAwKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZsb2F0IG9sZFNjcmVlblggPSBkb2NYICogbUFjdHVhbFNjYWxlIC0gbVNjcm9sbFg7CisgICAgICAgICAgICBmbG9hdCBhY3R1YWxTY2FsZSA9IG1ab29tTWFuYWdlci5nZXRTY2FsZSgpOworICAgICAgICAgICAgZmxvYXQgb2xkU2NyZWVuWCA9IGRvY1ggKiBhY3R1YWxTY2FsZSAtIG1TY3JvbGxYOwogICAgICAgICAgICAgZmxvYXQgcmVjdFZpZXdYID0gZG9jWCAqIHNjYWxlOwogICAgICAgICAgICAgZmxvYXQgcmVjdFZpZXdXaWR0aCA9IGRvY1dpZHRoICogc2NhbGU7CiAgICAgICAgICAgICBmbG9hdCBuZXdNYXhXaWR0aCA9IG1Db250ZW50V2lkdGggKiBzY2FsZTsKQEAgLTU5NjQsOSArNTcwMSw5IEBACiAgICAgICAgICAgICB9IGVsc2UgaWYgKG5ld1NjcmVlblggPiAobmV3TWF4V2lkdGggLSByZWN0Vmlld1ggLSByZWN0Vmlld1dpZHRoKSkgewogICAgICAgICAgICAgICAgIG5ld1NjcmVlblggPSB2aWV3V2lkdGggLSAobmV3TWF4V2lkdGggLSByZWN0Vmlld1gpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgbVpvb21DZW50ZXJYID0gKG9sZFNjcmVlblggKiBzY2FsZSAtIG5ld1NjcmVlblggKiBtQWN0dWFsU2NhbGUpCi0gICAgICAgICAgICAgICAgICAgIC8gKHNjYWxlIC0gbUFjdHVhbFNjYWxlKTsKLSAgICAgICAgICAgIGZsb2F0IG9sZFNjcmVlblkgPSBkb2NZICogbUFjdHVhbFNjYWxlICsgZ2V0VGl0bGVIZWlnaHQoKQorICAgICAgICAgICAgZmxvYXQgem9vbUNlbnRlclggPSAob2xkU2NyZWVuWCAqIHNjYWxlIC0gbmV3U2NyZWVuWCAqIGFjdHVhbFNjYWxlKQorICAgICAgICAgICAgICAgICAgICAvIChzY2FsZSAtIGFjdHVhbFNjYWxlKTsKKyAgICAgICAgICAgIGZsb2F0IG9sZFNjcmVlblkgPSBkb2NZICogYWN0dWFsU2NhbGUgKyBnZXRUaXRsZUhlaWdodCgpCiAgICAgICAgICAgICAgICAgICAgIC0gbVNjcm9sbFk7CiAgICAgICAgICAgICBmbG9hdCByZWN0Vmlld1kgPSBkb2NZICogc2NhbGUgKyBnZXRUaXRsZUhlaWdodCgpOwogICAgICAgICAgICAgZmxvYXQgcmVjdFZpZXdIZWlnaHQgPSBkb2NIZWlnaHQgKiBzY2FsZTsKQEAgLTU5NzgsMTA5ICs1NzE1LDEwIEBACiAgICAgICAgICAgICB9IGVsc2UgaWYgKG5ld1NjcmVlblkgPiAobmV3TWF4SGVpZ2h0IC0gcmVjdFZpZXdZIC0gcmVjdFZpZXdIZWlnaHQpKSB7CiAgICAgICAgICAgICAgICAgbmV3U2NyZWVuWSA9IHZpZXdIZWlnaHQgLSAobmV3TWF4SGVpZ2h0IC0gcmVjdFZpZXdZKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1ab29tQ2VudGVyWSA9IChvbGRTY3JlZW5ZICogc2NhbGUgLSBuZXdTY3JlZW5ZICogbUFjdHVhbFNjYWxlKQotICAgICAgICAgICAgICAgICAgICAvIChzY2FsZSAtIG1BY3R1YWxTY2FsZSk7Ci0gICAgICAgICAgICB6b29tV2l0aFByZXZpZXcoc2NhbGUsIGZhbHNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgZGlzbWlzc1pvb21Db250cm9sKCkgewotICAgICAgICBpZiAobVdlYlZpZXdDb3JlID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIG1heWJlIGNhbGxlZCBhZnRlciBXZWJWaWV3J3MgZGVzdHJveSgpLiBBcyB3ZSBjYW4ndCBnZXQgc2V0dGluZ3MsCi0gICAgICAgICAgICAvLyBqdXN0IGhpZGUgem9vbSBjb250cm9sIGZvciBib3RoIHN0eWxlcy4KLSAgICAgICAgICAgIGlmIChtWm9vbUJ1dHRvbnNDb250cm9sbGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtWm9vbUJ1dHRvbnNDb250cm9sbGVyLnNldFZpc2libGUoZmFsc2UpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1ab29tQ29udHJvbHMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1ab29tQ29udHJvbHMuaGlkZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIFdlYlNldHRpbmdzIHNldHRpbmdzID0gZ2V0U2V0dGluZ3MoKTsKLSAgICAgICAgaWYgKHNldHRpbmdzLmdldEJ1aWx0SW5ab29tQ29udHJvbHMoKSkgewotICAgICAgICAgICAgaWYgKG1ab29tQnV0dG9uc0NvbnRyb2xsZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1ab29tQnV0dG9uc0NvbnRyb2xsZXIuc2V0VmlzaWJsZShmYWxzZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAobVpvb21Db250cm9sUnVubmFibGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1Qcml2YXRlSGFuZGxlci5yZW1vdmVDYWxsYmFja3MobVpvb21Db250cm9sUnVubmFibGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1ab29tQ29udHJvbHMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1ab29tQ29udHJvbHMuaGlkZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gUnVsZSBmb3IgZG91YmxlIHRhcDoKLSAgICAvLyAxLiBpZiB0aGUgY3VycmVudCBzY2FsZSBpcyBub3Qgc2FtZSBhcyB0aGUgdGV4dCB3cmFwIHNjYWxlIGFuZCBsYXlvdXQKLSAgICAvLyAgICBhbGdvcml0aG0gaXMgTkFSUk9XX0NPTFVNTlMsIGZpdCB0byBjb2x1bW47Ci0gICAgLy8gMi4gaWYgdGhlIGN1cnJlbnQgc3RhdGUgaXMgbm90IG92ZXJ2aWV3IG1vZGUsIGNoYW5nZSB0byBvdmVydmlldyBtb2RlOwotICAgIC8vIDMuIGlmIHRoZSBjdXJyZW50IHN0YXRlIGlzIG92ZXJ2aWV3IG1vZGUsIGNoYW5nZSB0byBkZWZhdWx0IHNjYWxlLgotICAgIHByaXZhdGUgdm9pZCBkb0RvdWJsZVRhcCgpIHsKLSAgICAgICAgaWYgKG1XZWJWaWV3Q29yZS5nZXRTZXR0aW5ncygpLmdldFVzZVdpZGVWaWV3UG9ydCgpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgbVpvb21DZW50ZXJYID0gbUxhc3RUb3VjaFg7Ci0gICAgICAgIG1ab29tQ2VudGVyWSA9IG1MYXN0VG91Y2hZOwotICAgICAgICBtQW5jaG9yWCA9IHZpZXdUb0NvbnRlbnRYKChpbnQpIG1ab29tQ2VudGVyWCArIG1TY3JvbGxYKTsKLSAgICAgICAgbUFuY2hvclkgPSB2aWV3VG9Db250ZW50WSgoaW50KSBtWm9vbUNlbnRlclkgKyBtU2Nyb2xsWSk7Ci0gICAgICAgIFdlYlNldHRpbmdzIHNldHRpbmdzID0gZ2V0U2V0dGluZ3MoKTsKLSAgICAgICAgc2V0dGluZ3Muc2V0RG91YmxlVGFwVG9hc3RDb3VudCgwKTsKLSAgICAgICAgLy8gcmVtb3ZlIHRoZSB6b29tIGNvbnRyb2wgYWZ0ZXIgZG91YmxlIHRhcAotICAgICAgICBkaXNtaXNzWm9vbUNvbnRyb2woKTsKLSAgICAgICAgVmlld01hbmFnZXIuQ2hpbGRWaWV3IHBsdWdpbiA9IG1WaWV3TWFuYWdlci5oaXRUZXN0KG1BbmNob3JYLCBtQW5jaG9yWSk7Ci0gICAgICAgIGlmIChwbHVnaW4gIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGlzUGx1Z2luRml0T25TY3JlZW4ocGx1Z2luKSkgewotICAgICAgICAgICAgICAgIG1Jblpvb21PdmVydmlldyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgLy8gRm9yY2UgdGhlIHRpdGxlYmFyIGZ1bGx5IHJldmVhbCBpbiBvdmVydmlldyBtb2RlCi0gICAgICAgICAgICAgICAgaWYgKG1TY3JvbGxZIDwgZ2V0VGl0bGVIZWlnaHQoKSkgbVNjcm9sbFkgPSAwOwotICAgICAgICAgICAgICAgIHpvb21XaXRoUHJldmlldygoZmxvYXQpIGdldFZpZXdXaWR0aCgpIC8gbVpvb21PdmVydmlld1dpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1Jblpvb21PdmVydmlldyA9IGZhbHNlOwotICAgICAgICAgICAgICAgIGNlbnRlckZpdFJlY3QocGx1Z2luLngsIHBsdWdpbi55LCBwbHVnaW4ud2lkdGgsIHBsdWdpbi5oZWlnaHQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGJvb2xlYW4gem9vbVRvRGVmYXVsdCA9IGZhbHNlOwotICAgICAgICBpZiAoKHNldHRpbmdzLmdldExheW91dEFsZ29yaXRobSgpID09IFdlYlNldHRpbmdzLkxheW91dEFsZ29yaXRobS5OQVJST1dfQ09MVU1OUykKLSAgICAgICAgICAgICAgICAmJiAoTWF0aC5hYnMobUFjdHVhbFNjYWxlIC0gbVRleHRXcmFwU2NhbGUpID49IE1JTklNVU1fU0NBTEVfSU5DUkVNRU5UKSkgewotICAgICAgICAgICAgc2V0TmV3Wm9vbVNjYWxlKG1BY3R1YWxTY2FsZSwgdHJ1ZSwgdHJ1ZSk7Ci0gICAgICAgICAgICBmbG9hdCBvdmVydmlld1NjYWxlID0gKGZsb2F0KSBnZXRWaWV3V2lkdGgoKSAvIG1ab29tT3ZlcnZpZXdXaWR0aDsKLSAgICAgICAgICAgIGlmIChNYXRoLmFicyhtQWN0dWFsU2NhbGUgLSBvdmVydmlld1NjYWxlKSA8IE1JTklNVU1fU0NBTEVfSU5DUkVNRU5UKSB7Ci0gICAgICAgICAgICAgICAgbUluWm9vbU92ZXJ2aWV3ID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmICghbUluWm9vbU92ZXJ2aWV3KSB7Ci0gICAgICAgICAgICBmbG9hdCBuZXdTY2FsZSA9IChmbG9hdCkgZ2V0Vmlld1dpZHRoKCkgLyBtWm9vbU92ZXJ2aWV3V2lkdGg7Ci0gICAgICAgICAgICBpZiAoTWF0aC5hYnMobUFjdHVhbFNjYWxlIC0gbmV3U2NhbGUpID49IE1JTklNVU1fU0NBTEVfSU5DUkVNRU5UKSB7Ci0gICAgICAgICAgICAgICAgbUluWm9vbU92ZXJ2aWV3ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAvLyBGb3JjZSB0aGUgdGl0bGViYXIgZnVsbHkgcmV2ZWFsIGluIG92ZXJ2aWV3IG1vZGUKLSAgICAgICAgICAgICAgICBpZiAobVNjcm9sbFkgPCBnZXRUaXRsZUhlaWdodCgpKSBtU2Nyb2xsWSA9IDA7Ci0gICAgICAgICAgICAgICAgem9vbVdpdGhQcmV2aWV3KG5ld1NjYWxlLCB0cnVlKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoTWF0aC5hYnMobUFjdHVhbFNjYWxlIC0gbURlZmF1bHRTY2FsZSkgPj0gTUlOSU1VTV9TQ0FMRV9JTkNSRU1FTlQpIHsKLSAgICAgICAgICAgICAgICB6b29tVG9EZWZhdWx0ID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHpvb21Ub0RlZmF1bHQgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmICh6b29tVG9EZWZhdWx0KSB7Ci0gICAgICAgICAgICBtSW5ab29tT3ZlcnZpZXcgPSBmYWxzZTsKLSAgICAgICAgICAgIGludCBsZWZ0ID0gbmF0aXZlR2V0QmxvY2tMZWZ0RWRnZShtQW5jaG9yWCwgbUFuY2hvclksIG1BY3R1YWxTY2FsZSk7Ci0gICAgICAgICAgICBpZiAobGVmdCAhPSBOT19MRUZURURHRSkgewotICAgICAgICAgICAgICAgIC8vIGFkZCBhIDVwdCBwYWRkaW5nIHRvIHRoZSBsZWZ0IGVkZ2UuCi0gICAgICAgICAgICAgICAgaW50IHZpZXdMZWZ0ID0gY29udGVudFRvVmlld1gobGVmdCA8IDUgPyAwIDogKGxlZnQgLSA1KSkKLSAgICAgICAgICAgICAgICAgICAgICAgIC0gbVNjcm9sbFg7Ci0gICAgICAgICAgICAgICAgLy8gUmUtY2FsY3VsYXRlIHRoZSB6b29tIGNlbnRlciBzbyB0aGF0IHRoZSBuZXcgc2Nyb2xsIHggd2lsbCBiZQotICAgICAgICAgICAgICAgIC8vIG9uIHRoZSBsZWZ0IGVkZ2UuCi0gICAgICAgICAgICAgICAgaWYgKHZpZXdMZWZ0ID4gMCkgewotICAgICAgICAgICAgICAgICAgICBtWm9vbUNlbnRlclggPSB2aWV3TGVmdCAqIG1EZWZhdWx0U2NhbGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvIChtRGVmYXVsdFNjYWxlIC0gbUFjdHVhbFNjYWxlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBzY3JvbGxCeSh2aWV3TGVmdCwgMCk7Ci0gICAgICAgICAgICAgICAgICAgIG1ab29tQ2VudGVyWCA9IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgem9vbVdpdGhQcmV2aWV3KG1EZWZhdWx0U2NhbGUsIHRydWUpOworICAgICAgICAgICAgZmxvYXQgem9vbUNlbnRlclkgPSAob2xkU2NyZWVuWSAqIHNjYWxlIC0gbmV3U2NyZWVuWSAqIGFjdHVhbFNjYWxlKQorICAgICAgICAgICAgICAgICAgICAvIChzY2FsZSAtIGFjdHVhbFNjYWxlKTsKKyAgICAgICAgICAgIG1ab29tTWFuYWdlci5zZXRab29tQ2VudGVyKHpvb21DZW50ZXJYLCB6b29tQ2VudGVyWSk7CisgICAgICAgICAgICBtWm9vbU1hbmFnZXIuc3RhcnRab29tQW5pbWF0aW9uKHNjYWxlLCBmYWxzZSk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTYwOTIsNiArNTczMCw5IEBACiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiByZXF1ZXN0Rm9jdXMoaW50IGRpcmVjdGlvbiwgUmVjdCBwcmV2aW91c2x5Rm9jdXNlZFJlY3QpIHsKKyAgICAgICAgLy8gRklYTUU6IElmIGEgc3Vid2luZG93IGlzIHNob3dpbmcgZmluZCwgYW5kIHRoZSB1c2VyIHRvdWNoZXMgdGhlCisgICAgICAgIC8vIGJhY2tncm91bmQgd2luZG93LCBpdCBjYW4gc3RlYWwgZm9jdXMuCisgICAgICAgIGlmIChtRmluZElzVXApIHJldHVybiBmYWxzZTsKICAgICAgICAgYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKICAgICAgICAgaWYgKGluRWRpdGluZ01vZGUoKSkgewogICAgICAgICAgICAgcmVzdWx0ID0gbVdlYlRleHRWaWV3LnJlcXVlc3RGb2N1cyhkaXJlY3Rpb24sCkBAIC02MTc5LDYgKzU4MjAsMTIgQEAKICAgICBwdWJsaWMgYm9vbGVhbiByZXF1ZXN0Q2hpbGRSZWN0YW5nbGVPblNjcmVlbihWaWV3IGNoaWxkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlY3QgcmVjdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGltbWVkaWF0ZSkgeworICAgICAgICAvLyBkb24ndCBzY3JvbGwgd2hpbGUgaW4gem9vbSBhbmltYXRpb24uIFdoZW4gaXQgaXMgZG9uZSwgd2Ugd2lsbCBhZGp1c3QKKyAgICAgICAgLy8gdGhlIG5lY2Vzc2FyeSBjb21wb25lbnRzIChlLmcuLCBXZWJUZXh0VmlldyBpZiBpdCBpcyBpbiBlZGl0aW5nIG1vZGUpCisgICAgICAgIGlmIChtWm9vbU1hbmFnZXIuaXNGaXhlZExlbmd0aEFuaW1hdGlvbkluUHJvZ3Jlc3MoKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKICAgICAgICAgcmVjdC5vZmZzZXQoY2hpbGQuZ2V0TGVmdCgpIC0gY2hpbGQuZ2V0U2Nyb2xsWCgpLAogICAgICAgICAgICAgICAgIGNoaWxkLmdldFRvcCgpIC0gY2hpbGQuZ2V0U2Nyb2xsWSgpKTsKIApAQCAtNjMyMSw3ICs1OTY4LDggQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgY2FzZSBTV0lUQ0hfVE9fU0hPUlRQUkVTUzogewogICAgICAgICAgICAgICAgICAgICBpZiAobVRvdWNoTW9kZSA9PSBUT1VDSF9JTklUX01PREUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtUHJldmVudERlZmF1bHQgIT0gUFJFVkVOVF9ERUZBVUxUX1lFUykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFnZXRTZXR0aW5ncygpLnN1cHBvcnRUb3VjaE9ubHkoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBtUHJldmVudERlZmF1bHQgIT0gUFJFVkVOVF9ERUZBVUxUX1lFUykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ub3VjaE1vZGUgPSBUT1VDSF9TSE9SVFBSRVNTX1NUQVJUX01PREU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlU2VsZWN0aW9uKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewpAQCAtNjMzNSw2ICs1OTgzLDkgQEAKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGNhc2UgU1dJVENIX1RPX0xPTkdQUkVTUzogeworICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0U2V0dGluZ3MoKS5zdXBwb3J0VG91Y2hPbmx5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZVRvdWNoSGlnaGxpZ2h0KGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBpZiAoaW5GdWxsU2NyZWVuTW9kZSgpIHx8IG1EZWZlclRvdWNoUHJvY2VzcykgewogICAgICAgICAgICAgICAgICAgICAgICAgVG91Y2hFdmVudERhdGEgdGVkID0gbmV3IFRvdWNoRXZlbnREYXRhKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICB0ZWQubUFjdGlvbiA9IFdlYlZpZXdDb3JlLkFDVElPTl9MT05HUFJFU1M7CkBAIC02MzQ2LDE1ICs1OTk3LDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzaW1wbGljaXR5IGZvciBub3csIHdlIGRvbid0IHNldCBpdC4KICAgICAgICAgICAgICAgICAgICAgICAgIHRlZC5tTWV0YVN0YXRlID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgIHRlZC5tUmVwcm9jZXNzID0gbURlZmVyVG91Y2hQcm9jZXNzOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1EZWZlclRvdWNoUHJvY2VzcykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlZC5tVmlld1ggPSBtTGFzdFRvdWNoWDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZWQubVZpZXdZID0gbUxhc3RUb3VjaFk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICBtV2ViVmlld0NvcmUuc2VuZE1lc3NhZ2UoRXZlbnRIdWIuVE9VQ0hfRVZFTlQsIHRlZCk7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobVByZXZlbnREZWZhdWx0ICE9IFBSRVZFTlRfREVGQVVMVF9ZRVMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIG1Ub3VjaE1vZGUgPSBUT1VDSF9ET05FX01PREU7CiAgICAgICAgICAgICAgICAgICAgICAgICBwZXJmb3JtTG9uZ0NsaWNrKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZWJ1aWxkV2ViVGV4dFZpZXcoKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CkBAIC02Mzg3LDExICs2MDMzLDkgQEAKICAgICAgICAgICAgICAgICAgICAgc3Bhd25Db250ZW50U2Nyb2xsVG8obXNnLmFyZzEsIG1zZy5hcmcyKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSBVUERBVEVfWk9PTV9SQU5HRTogewotICAgICAgICAgICAgICAgICAgICBXZWJWaWV3Q29yZS5SZXN0b3JlU3RhdGUgcmVzdG9yZVN0YXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAoV2ViVmlld0NvcmUuUmVzdG9yZVN0YXRlKSBtc2cub2JqOworICAgICAgICAgICAgICAgICAgICBXZWJWaWV3Q29yZS5WaWV3U3RhdGUgdmlld1N0YXRlID0gKFdlYlZpZXdDb3JlLlZpZXdTdGF0ZSkgbXNnLm9iajsKICAgICAgICAgICAgICAgICAgICAgLy8gbVNjcm9sbFggY29udGFpbnMgdGhlIG5ldyBtaW5QcmVmV2lkdGgKLSAgICAgICAgICAgICAgICAgICAgdXBkYXRlWm9vbVJhbmdlKHJlc3RvcmVTdGF0ZSwgZ2V0Vmlld1dpZHRoKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdG9yZVN0YXRlLm1TY3JvbGxYLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgIG1ab29tTWFuYWdlci51cGRhdGVab29tUmFuZ2Uodmlld1N0YXRlLCBnZXRWaWV3V2lkdGgoKSwgdmlld1N0YXRlLm1TY3JvbGxYKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGNhc2UgTkVXX1BJQ1RVUkVfTVNHX0lEOiB7CkBAIC02NDAxLDU2ICs2MDQ1LDI0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBtRGVsYXllZERlbGV0ZVJvb3RMYXllciA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlU2V0Um9vdExheWVyKDApOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIFdlYlNldHRpbmdzIHNldHRpbmdzID0gbVdlYlZpZXdDb3JlLmdldFNldHRpbmdzKCk7CiAgICAgICAgICAgICAgICAgICAgIC8vIGNhbGxlZCBmb3IgbmV3IGNvbnRlbnQKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IHZpZXdXaWR0aCA9IGdldFZpZXdXaWR0aCgpOwotICAgICAgICAgICAgICAgICAgICBmaW5hbCBXZWJWaWV3Q29yZS5EcmF3RGF0YSBkcmF3ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoV2ViVmlld0NvcmUuRHJhd0RhdGEpIG1zZy5vYmo7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIFBvaW50IHZpZXdTaXplID0gZHJhdy5tVmlld1BvaW50OwotICAgICAgICAgICAgICAgICAgICBib29sZWFuIHVzZVdpZGVWaWV3cG9ydCA9IHNldHRpbmdzLmdldFVzZVdpZGVWaWV3UG9ydCgpOwotICAgICAgICAgICAgICAgICAgICBXZWJWaWV3Q29yZS5SZXN0b3JlU3RhdGUgcmVzdG9yZVN0YXRlID0gZHJhdy5tUmVzdG9yZVN0YXRlOwotICAgICAgICAgICAgICAgICAgICBib29sZWFuIGhhc1Jlc3RvcmVTdGF0ZSA9IHJlc3RvcmVTdGF0ZSAhPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBpZiAoaGFzUmVzdG9yZVN0YXRlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVab29tUmFuZ2UocmVzdG9yZVN0YXRlLCB2aWV3U2l6ZS54LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcmF3Lm1NaW5QcmVmV2lkdGgsIHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFtRHJhd0hpc3RvcnkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSW5ab29tT3ZlcnZpZXcgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgV2ViVmlld0NvcmUuRHJhd0RhdGEgZHJhdyA9IChXZWJWaWV3Q29yZS5EcmF3RGF0YSkgbXNnLm9iajsKIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtSW5pdGlhbFNjYWxlSW5QZXJjZW50ID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXROZXdab29tU2NhbGUobUluaXRpYWxTY2FsZUluUGVyY2VudCAvIDEwMC4wZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Jbml0aWFsU2NhbGVJblBlcmNlbnQgIT0gbVRleHRXcmFwU2NhbGUgKiAxMDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXN0b3JlU3RhdGUubVZpZXdTY2FsZSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRleHRXcmFwU2NhbGUgPSByZXN0b3JlU3RhdGUubVRleHRXcmFwU2NhbGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldE5ld1pvb21TY2FsZShyZXN0b3JlU3RhdGUubVZpZXdTY2FsZSwgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUluWm9vbU92ZXJ2aWV3ID0gdXNlV2lkZVZpZXdwb3J0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBzZXR0aW5ncy5nZXRMb2FkV2l0aE92ZXJ2aWV3TW9kZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBzY2FsZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1Jblpvb21PdmVydmlldykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGUgPSAoZmxvYXQpIHZpZXdXaWR0aAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gREVGQVVMVF9WSUVXUE9SVF9XSURUSDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlID0gcmVzdG9yZVN0YXRlLm1UZXh0V3JhcFNjYWxlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldE5ld1pvb21TY2FsZShzY2FsZSwgTWF0aC5hYnMoc2NhbGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gbVRleHRXcmFwU2NhbGUpID49IE1JTklNVU1fU0NBTEVfSU5DUkVNRU5ULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRDb250ZW50U2Nyb2xsVG8ocmVzdG9yZVN0YXRlLm1TY3JvbGxYLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN0b3JlU3RhdGUubVNjcm9sbFkpOworICAgICAgICAgICAgICAgICAgICBmaW5hbCBQb2ludCB2aWV3U2l6ZSA9IGRyYXcubVZpZXdQb2ludDsKKyAgICAgICAgICAgICAgICAgICAgV2ViVmlld0NvcmUuVmlld1N0YXRlIHZpZXdTdGF0ZSA9IGRyYXcubVZpZXdTdGF0ZTsKKyAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc1BpY3R1cmVBZnRlckZpcnN0TGF5b3V0ID0gdmlld1N0YXRlICE9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIGlmIChpc1BpY3R1cmVBZnRlckZpcnN0TGF5b3V0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtWm9vbU1hbmFnZXIub25GaXJzdExheW91dChkcmF3KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbURyYXdIaXN0b3J5KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0Q29udGVudFNjcm9sbFRvKHZpZXdTdGF0ZS5tU2Nyb2xsWCwgdmlld1N0YXRlLm1TY3JvbGxZKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBcyB3ZSBhcmUgb24gYSBuZXcgcGFnZSwgcmVtb3ZlIHRoZSBXZWJUZXh0Vmlldy4gVGhpcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIG5lY2Vzc2FyeSBmb3IgcGFnZSBsb2FkcyBkcml2ZW4gYnkgd2Via2l0LCBhbmQgaW4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwYXJ0aWN1bGFyIHdoZW4gdGhlIHVzZXIgd2FzIG9uIGEgcGFzc3dvcmQgZmllbGQsIHNvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIFdlYlRleHRWaWV3IHdhcyB2aXNpYmxlLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGV4dEVudHJ5KGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1cGRhdGUgdGhlIHpvb20gYnV0dG9ucyBhcyB0aGUgc2NhbGUgY2FuIGJlIGNoYW5nZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0U2V0dGluZ3MoKS5nZXRCdWlsdEluWm9vbUNvbnRyb2xzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlWm9vbUJ1dHRvbnNFbmFibGVkKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CisKICAgICAgICAgICAgICAgICAgICAgLy8gV2UgdXBkYXRlIHRoZSBsYXlvdXQgKGkuZS4gcmVxdWVzdCBhIGxheW91dCBmcm9tIHRoZQogICAgICAgICAgICAgICAgICAgICAvLyB2aWV3IHN5c3RlbSkgaWYgdGhlIGxhc3QgdmlldyBzaXplIHRoYXQgd2Ugc2VudCB0bwogICAgICAgICAgICAgICAgICAgICAvLyBXZWJDb3JlIG1hdGNoZXMgdGhlIHZpZXcgc2l6ZSBvZiB0aGUgcGljdHVyZSB3ZSBqdXN0CkBAIC02NDU4LDQ1ICs2MDcwLDI1IEBACiAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gdXBkYXRlTGF5b3V0ID0gdmlld1NpemUueCA9PSBtTGFzdFdpZHRoU2VudAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHZpZXdTaXplLnkgPT0gbUxhc3RIZWlnaHRTZW50OwogICAgICAgICAgICAgICAgICAgICByZWNvcmROZXdDb250ZW50U2l6ZShkcmF3Lm1XaWR0aEhlaWdodC54LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyYXcubVdpZHRoSGVpZ2h0LnkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArIChtRmluZElzVXAgPyBtRmluZEhlaWdodCA6IDApLCB1cGRhdGVMYXlvdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyYXcubVdpZHRoSGVpZ2h0LnksIHVwZGF0ZUxheW91dCk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChEZWJ1Z0ZsYWdzLldFQl9WSUVXKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBSZWN0IGIgPSBkcmF3Lm1JbnZhbFJlZ2lvbi5nZXRCb3VuZHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIExvZy52KExPR1RBRywgIk5FV19QSUNUVVJFX01TR19JRCB7IiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIubGVmdCsiLCIrYi50b3ArIiwiK2IucmlnaHQrIiwiK2IuYm90dG9tKyJ9Iik7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgaW52YWxpZGF0ZUNvbnRlbnRSZWN0KGRyYXcubUludmFsUmVnaW9uLmdldEJvdW5kcygpKTsKKwogICAgICAgICAgICAgICAgICAgICBpZiAobVBpY3R1cmVMaXN0ZW5lciAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBtUGljdHVyZUxpc3RlbmVyLm9uTmV3UGljdHVyZShXZWJWaWV3LnRoaXMsIGNhcHR1cmVQaWN0dXJlKCkpOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmICh1c2VXaWRlVmlld3BvcnQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxpbWl0IG1ab29tT3ZlcnZpZXdXaWR0aCB1cHBlciBib3VuZCB0bwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gc01heFZpZXdwb3J0V2lkdGggc28gdGhhdCBpZiB0aGUgcGFnZSBkb2Vzbid0IGJlaGF2ZQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2VsbCwgdGhlIFdlYlZpZXcgd29uJ3QgZ28gaW5zYW5lLiBsaW1pdCB0aGUgbG93ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJvdW5kIHRvIG1hdGNoIHRoZSBkZWZhdWx0IHNjYWxlIGZvciBtb2JpbGUgc2l0ZXMuCi0gICAgICAgICAgICAgICAgICAgICAgICBtWm9vbU92ZXJ2aWV3V2lkdGggPSBNYXRoLm1pbihzTWF4Vmlld3BvcnRXaWR0aCwgTWF0aAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWF4KChpbnQpICh2aWV3V2lkdGggLyBtRGVmYXVsdFNjYWxlKSwgTWF0aAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXgoZHJhdy5tTWluUHJlZldpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJhdy5tVmlld1BvaW50LngpKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCFtTWluWm9vbVNjYWxlRml4ZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1NaW5ab29tU2NhbGUgPSAoZmxvYXQpIHZpZXdXaWR0aCAvIG1ab29tT3ZlcnZpZXdXaWR0aDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoIW1EcmF3SGlzdG9yeSAmJiBtSW5ab29tT3ZlcnZpZXcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpdCB0aGUgY29udGVudCB3aWR0aCB0byB0aGUgY3VycmVudCB2aWV3LiBJZ25vcmUKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSByb3VuZGluZyBlcnJvciBjYXNlLgotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE1hdGguYWJzKCh2aWV3V2lkdGggKiBtSW52QWN0dWFsU2NhbGUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gbVpvb21PdmVydmlld1dpZHRoKSA+IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXROZXdab29tU2NhbGUoKGZsb2F0KSB2aWV3V2lkdGgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gbVpvb21PdmVydmlld1dpZHRoLCBNYXRoLmFicyhtQWN0dWFsU2NhbGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gbVRleHRXcmFwU2NhbGUpIDwgTUlOSU1VTV9TQ0FMRV9JTkNSRU1FTlQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyB1cGRhdGUgdGhlIHpvb20gaW5mb3JtYXRpb24gYmFzZWQgb24gdGhlIG5ldyBwaWN0dXJlCisgICAgICAgICAgICAgICAgICAgIG1ab29tTWFuYWdlci5vbk5ld1BpY3R1cmUoZHJhdyk7CisKICAgICAgICAgICAgICAgICAgICAgaWYgKGRyYXcubUZvY3VzU2l6ZUNoYW5nZWQgJiYgaW5FZGl0aW5nTW9kZSgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBtRm9jdXNTaXplQ2hhbmdlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGhhc1Jlc3RvcmVTdGF0ZSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoaXNQaWN0dXJlQWZ0ZXJGaXJzdExheW91dCkgewogICAgICAgICAgICAgICAgICAgICAgICAgbVZpZXdNYW5hZ2VyLnBvc3RSZWFkeVRvRHJhd0FsbCgpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtNjUzMCwxNCArNjEyMiw4IEBACiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgUkVRVUVTVF9LRVlCT0FSRF9XSVRIX1NFTEVDVElPTl9NU0dfSUQ6CiAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlTb2Z0S2V5Ym9hcmQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIHVwZGF0ZVRleHRTZWxlY3Rpb25Gcm9tTWVzc2FnZShtc2cuYXJnMSwgbXNnLmFyZzIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKFdlYlZpZXdDb3JlLlRleHRTZWxlY3Rpb25EYXRhKSBtc2cub2JqKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaCB0byBVUERBVEVfVEVYVF9TRUxFQ1RJT05fTVNHX0lECiAgICAgICAgICAgICAgICAgY2FzZSBVUERBVEVfVEVYVF9TRUxFQ1RJT05fTVNHX0lEOgotICAgICAgICAgICAgICAgICAgICAvLyBJZiBubyB0ZXh0ZmllbGQgd2FzIGluIGZvY3VzLCBhbmQgdGhlIHVzZXIgdG91Y2hlZCBvbmUsCi0gICAgICAgICAgICAgICAgICAgIC8vIGNhdXNpbmcgaXQgdG8gc2VuZCB0aGlzIG1lc3NhZ2UsIHRoZW4gV2ViVGV4dFZpZXcgaGFzIG5vdAotICAgICAgICAgICAgICAgICAgICAvLyBiZWVuIHNldCB1cCB5ZXQuICBSZWJ1aWxkIGl0IHNvIGl0IGNhbiBzZXQgaXRzIHNlbGVjdGlvbi4KLSAgICAgICAgICAgICAgICAgICAgcmVidWlsZFdlYlRleHRWaWV3KCk7CiAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZVRleHRTZWxlY3Rpb25Gcm9tTWVzc2FnZShtc2cuYXJnMSwgbXNnLmFyZzIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFdlYlZpZXdDb3JlLlRleHRTZWxlY3Rpb25EYXRhKSBtc2cub2JqKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC02NTU1LDcgKzYxNDEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgTU9WRV9PVVRfT0ZfUExVR0lOOgorICAgICAgICAgICAgICAgIGNhc2UgVU5IQU5ETEVEX05BVl9LRVk6CiAgICAgICAgICAgICAgICAgICAgIG5hdkhhbmRsZWRLZXkobXNnLmFyZzEsIDEsIGZhbHNlLCAwKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSBVUERBVEVfVEVYVF9FTlRSWV9NU0dfSUQ6CkBAIC02NjQwLDMzICs2MjI2LDQwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVByZXZlbnREZWZhdWx0ID0gbXNnLmFyZzIgPT0gMSA/IFBSRVZFTlRfREVGQVVMVF9ZRVMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogUFJFVkVOVF9ERUZBVUxUX05POwogICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1QcmV2ZW50RGVmYXVsdCA9PSBQUkVWRU5UX0RFRkFVTFRfWUVTKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRvdWNoSGlnaGxpZ2h0UmVnaW9uLnNldEVtcHR5KCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobXNnLmFyZzIgPT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJldmVudCBkZWZhdWx0IGlzIG5vdCBjYWxsZWQgaW4gV2ViQ29yZSwgc28gdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtZXNzYWdlIG5lZWRzIHRvIGJlIHJlcHJvY2Vzc2VkIGluIFVJCiAgICAgICAgICAgICAgICAgICAgICAgICBUb3VjaEV2ZW50RGF0YSB0ZWQgPSAoVG91Y2hFdmVudERhdGEpIG1zZy5vYmo7CiAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHRlZC5tQWN0aW9uKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNb3Rpb25FdmVudC5BQ1RJT05fRE9XTjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3REZWZlclRvdWNoWCA9IHRlZC5tVmlld1g7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1MYXN0RGVmZXJUb3VjaFkgPSB0ZWQubVZpZXdZOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTGFzdERlZmVyVG91Y2hYID0gY29udGVudFRvVmlld1godGVkLm1YKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gbVNjcm9sbFg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1MYXN0RGVmZXJUb3VjaFkgPSBjb250ZW50VG9WaWV3WSh0ZWQubVkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBtU2Nyb2xsWTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbURlZmVyVG91Y2hNb2RlID0gVE9VQ0hfSU5JVF9NT0RFOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE1vdGlvbkV2ZW50LkFDVElPTl9NT1ZFOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vIHNuYXBwaW5nIGluIGRlZmVyIHByb2Nlc3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHggPSBjb250ZW50VG9WaWV3WCh0ZWQubVgpIC0gbVNjcm9sbFg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB5ID0gY29udGVudFRvVmlld1kodGVkLm1ZKSAtIG1TY3JvbGxZOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobURlZmVyVG91Y2hNb2RlICE9IFRPVUNIX0RSQUdfTU9ERSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbURlZmVyVG91Y2hNb2RlID0gVE9VQ0hfRFJBR19NT0RFOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3REZWZlclRvdWNoWCA9IHRlZC5tVmlld1g7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTGFzdERlZmVyVG91Y2hZID0gdGVkLm1WaWV3WTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1MYXN0RGVmZXJUb3VjaFggPSB4OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3REZWZlclRvdWNoWSA9IHk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydERyYWcoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsdGFYID0gcGluTG9jWCgoaW50KSAobVNjcm9sbFgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG1MYXN0RGVmZXJUb3VjaFggLSB0ZWQubVZpZXdYKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG1MYXN0RGVmZXJUb3VjaFggLSB4KSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIG1TY3JvbGxYOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsdGFZID0gcGluTG9jWSgoaW50KSAobVNjcm9sbFkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG1MYXN0RGVmZXJUb3VjaFkgLSB0ZWQubVZpZXdZKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG1MYXN0RGVmZXJUb3VjaFkgLSB5KSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIG1TY3JvbGxZOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb0RyYWcoZGVsdGFYLCBkZWx0YVkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVsdGFYICE9IDApIG1MYXN0RGVmZXJUb3VjaFggPSB0ZWQubVZpZXdYOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVsdGFZICE9IDApIG1MYXN0RGVmZXJUb3VjaFkgPSB0ZWQubVZpZXdZOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVsdGFYICE9IDApIG1MYXN0RGVmZXJUb3VjaFggPSB4OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVsdGFZICE9IDApIG1MYXN0RGVmZXJUb3VjaFkgPSB5OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNb3Rpb25FdmVudC5BQ1RJT05fVVA6CkBAIC02NjgwLDkgKzYyNzMsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFdlYlZpZXdDb3JlLkFDVElPTl9ET1VCTEVUQVA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvRG91YmxlVGFwKCkgbmVlZHMgbUxhc3RUb3VjaFgvWSBhcyBhbmNob3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3RUb3VjaFggPSB0ZWQubVZpZXdYOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTGFzdFRvdWNoWSA9IHRlZC5tVmlld1k7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvRG91YmxlVGFwKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1MYXN0VG91Y2hYID0gY29udGVudFRvVmlld1godGVkLm1YKSAtIG1TY3JvbGxYOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTGFzdFRvdWNoWSA9IGNvbnRlbnRUb1ZpZXdZKHRlZC5tWSkgLSBtU2Nyb2xsWTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVpvb21NYW5hZ2VyLmhhbmRsZURvdWJsZVRhcChtTGFzdFRvdWNoWCwgbUxhc3RUb3VjaFkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRGVmZXJUb3VjaE1vZGUgPSBUT1VDSF9ET05FX01PREU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgV2ViVmlld0NvcmUuQUNUSU9OX0xPTkdQUkVTUzoKQEAgLTY2OTAsNyArNjI4Myw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoaXRUZXN0ICE9IG51bGwgJiYgaGl0VGVzdC5tVHlwZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICE9IEhpdFRlc3RSZXN1bHQuVU5LTk9XTl9UWVBFKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJmb3JtTG9uZ0NsaWNrKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWJ1aWxkV2ViVGV4dFZpZXcoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRGVmZXJUb3VjaE1vZGUgPSBUT1VDSF9ET05FX01PREU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtNjgxNCw3ICs2NDA2LDYgQEAKIAogICAgICAgICAgICAgICAgIGNhc2UgQ0VOVEVSX0ZJVF9SRUNUOgogICAgICAgICAgICAgICAgICAgICBSZWN0IHIgPSAoUmVjdCltc2cub2JqOwotICAgICAgICAgICAgICAgICAgICBtSW5ab29tT3ZlcnZpZXcgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgY2VudGVyRml0UmVjdChyLmxlZnQsIHIudG9wLCByLndpZHRoKCksIHIuaGVpZ2h0KCkpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKIApAQCAtNjgyMyw2ICs2NDE0LDM2IEBACiAgICAgICAgICAgICAgICAgICAgIG1WZXJ0aWNhbFNjcm9sbEJhck1vZGUgPSBtc2cuYXJnMjsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAKKyAgICAgICAgICAgICAgICBjYXNlIFNFTEVDVElPTl9TVFJJTkdfQ0hBTkdFRDoKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1BY2Nlc3NpYmlsaXR5SW5qZWN0b3IgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNlbGVjdGlvblN0cmluZyA9IChTdHJpbmcpIG1zZy5vYmo7CisgICAgICAgICAgICAgICAgICAgICAgICBtQWNjZXNzaWJpbGl0eUluamVjdG9yLm9uU2VsZWN0aW9uU3RyaW5nQ2hhbmdlKHNlbGVjdGlvblN0cmluZyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIFNFVF9UT1VDSF9ISUdITElHSFRfUkVDVFM6CisgICAgICAgICAgICAgICAgICAgIGludmFsaWRhdGUobVRvdWNoSGlnaGxpZ2h0UmVnaW9uLmdldEJvdW5kcygpKTsKKyAgICAgICAgICAgICAgICAgICAgbVRvdWNoSGlnaGxpZ2h0UmVnaW9uLnNldEVtcHR5KCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChtc2cub2JqICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5TGlzdDxSZWN0PiByZWN0cyA9IChBcnJheUxpc3Q8UmVjdD4pIG1zZy5vYmo7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKFJlY3QgcmVjdCA6IHJlY3RzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVjdCB2aWV3UmVjdCA9IGNvbnRlbnRUb1ZpZXdSZWN0KHJlY3QpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNvbWUgc2l0ZXMsIGxpa2Ugc3RvcmllcyBpbiBueXRpbWVzLmNvbSwgc2V0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbW91c2UgZXZlbnQgaGFuZGxlciBpbiB0aGUgdG9wIGRpdi4gSXQgaXMgbm90CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXNlciBmcmllbmRseSB0byBoaWdobGlnaHQgdGhlIGRpdiBpZiBpdCBjb3ZlcnMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtb3JlIHRoYW4gaGFsZiBvZiB0aGUgc2NyZWVuLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2aWV3UmVjdC53aWR0aCgpIDwgZ2V0V2lkdGgoKSA+PiAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCB2aWV3UmVjdC5oZWlnaHQoKSA8IGdldEhlaWdodCgpID4+IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRvdWNoSGlnaGxpZ2h0UmVnaW9uLnVuaW9uKHZpZXdSZWN0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW52YWxpZGF0ZSh2aWV3UmVjdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoTE9HVEFHLCAiU2tpcCB0aGUgaHVnZSBzZWxlY3Rpb24gcmVjdDoiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB2aWV3UmVjdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCiAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgc3VwZXIuaGFuZGxlTWVzc2FnZShtc2cpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTcxMzAsMzcgKzY3NTEsNiBAQAogICAgICAgICAgICAgICAgIG5ldyBJbnZva2VMaXN0Qm94KGFycmF5LCBlbmFibGVkQXJyYXksIHNlbGVjdGVkQXJyYXkpKTsKICAgICB9CiAKLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlWm9vbVJhbmdlKFdlYlZpZXdDb3JlLlJlc3RvcmVTdGF0ZSByZXN0b3JlU3RhdGUsCi0gICAgICAgICAgICBpbnQgdmlld1dpZHRoLCBpbnQgbWluUHJlZldpZHRoLCBib29sZWFuIHVwZGF0ZVpvb21PdmVydmlldykgewotICAgICAgICBpZiAocmVzdG9yZVN0YXRlLm1NaW5TY2FsZSA9PSAwKSB7Ci0gICAgICAgICAgICBpZiAocmVzdG9yZVN0YXRlLm1Nb2JpbGVTaXRlKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1pblByZWZXaWR0aCA+IE1hdGgubWF4KDAsIHZpZXdXaWR0aCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbU1pblpvb21TY2FsZSA9IChmbG9hdCkgdmlld1dpZHRoIC8gbWluUHJlZldpZHRoOwotICAgICAgICAgICAgICAgICAgICBtTWluWm9vbVNjYWxlRml4ZWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHVwZGF0ZVpvb21PdmVydmlldykgewotICAgICAgICAgICAgICAgICAgICAgICAgV2ViU2V0dGluZ3Mgc2V0dGluZ3MgPSBnZXRTZXR0aW5ncygpOwotICAgICAgICAgICAgICAgICAgICAgICAgbUluWm9vbU92ZXJ2aWV3ID0gc2V0dGluZ3MuZ2V0VXNlV2lkZVZpZXdQb3J0KCkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MuZ2V0TG9hZFdpdGhPdmVydmlld01vZGUoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG1NaW5ab29tU2NhbGUgPSByZXN0b3JlU3RhdGUubURlZmF1bHRTY2FsZTsKLSAgICAgICAgICAgICAgICAgICAgbU1pblpvb21TY2FsZUZpeGVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1NaW5ab29tU2NhbGUgPSBERUZBVUxUX01JTl9aT09NX1NDQUxFOwotICAgICAgICAgICAgICAgIG1NaW5ab29tU2NhbGVGaXhlZCA9IGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbU1pblpvb21TY2FsZSA9IHJlc3RvcmVTdGF0ZS5tTWluU2NhbGU7Ci0gICAgICAgICAgICBtTWluWm9vbVNjYWxlRml4ZWQgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChyZXN0b3JlU3RhdGUubU1heFNjYWxlID09IDApIHsKLSAgICAgICAgICAgIG1NYXhab29tU2NhbGUgPSBERUZBVUxUX01BWF9aT09NX1NDQUxFOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbU1heFpvb21TY2FsZSA9IHJlc3RvcmVTdGF0ZS5tTWF4U2NhbGU7Ci0gICAgICAgIH0KLSAgICB9Ci0KICAgICAvKgogICAgICAqIFJlcXVlc3QgYSBkcm9wZG93biBtZW51IGZvciBhIGxpc3Rib3ggd2l0aCBzaW5nbGUgc2VsZWN0aW9uIG9yIGEgc2luZ2xlCiAgICAgICogPHNlbGVjdD4gZWxlbWVudC4KQEAgLTcyNDMsNyArNjgzMyw3IEBACiAgICAgICAgIC8vIEZJWE1FIHRoZSBkaXZpc29yIHNob3VsZCBiZSByZXRyaWV2ZWQgZnJvbSBzb21ld2hlcmUKICAgICAgICAgLy8gdGhlIGNsb3Nlc3QgdGhpbmcgdG9kYXkgaXMgaGFyZC1jb2RlZCBpbnRvIFNjcm9sbFZpZXcuamF2YQogICAgICAgICAvLyAoZnJvbSBTY3JvbGxWaWV3LmphdmEsIGxpbmUgMzYzKSAgIGludCBtYXhKdW1wID0gaGVpZ2h0LzI7Ci0gICAgICAgIHJldHVybiBNYXRoLnJvdW5kKGhlaWdodCAqIG1JbnZBY3R1YWxTY2FsZSk7CisgICAgICAgIHJldHVybiBNYXRoLnJvdW5kKGhlaWdodCAqIG1ab29tTWFuYWdlci5nZXRJbnZTY2FsZSgpKTsKICAgICB9CiAKICAgICAvKioKQEAgLTcyNTQsMTAgKzY4NDQsMTAgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBQYXNzIHRoZSBrZXkgdG8gdGhlIHBsdWdpbi4gIFRoaXMgYXNzdW1lcyB0aGF0IG5hdGl2ZUZvY3VzSXNQbHVnaW4oKQotICAgICAqIHJldHVybmVkIHRydWUuCisgICAgICogUGFzcyB0aGUga2V5IGRpcmVjdGx5IHRvIHRoZSBwYWdlLiAgVGhpcyBhc3N1bWVzIHRoYXQKKyAgICAgKiBuYXRpdmVQYWdlU2hvdWxkSGFuZGxlU2hpZnRBbmRBcnJvd3MoKSByZXR1cm5lZCB0cnVlLgogICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBsZXRQbHVnaW5IYW5kbGVOYXZLZXkoaW50IGtleUNvZGUsIGxvbmcgdGltZSwgYm9vbGVhbiBkb3duKSB7CisgICAgcHJpdmF0ZSB2b2lkIGxldFBhZ2VIYW5kbGVOYXZLZXkoaW50IGtleUNvZGUsIGxvbmcgdGltZSwgYm9vbGVhbiBkb3duKSB7CiAgICAgICAgIGludCBrZXlFdmVudEFjdGlvbjsKICAgICAgICAgaW50IGV2ZW50SHViQWN0aW9uOwogICAgICAgICBpZiAoZG93bikgewpAQCAtNzM5OCw5ICs2OTg4LDEwIEBACiAgICAgcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiAgbmF0aXZlQ3Vyc29yV2FudHNLZXlFdmVudHMoKTsKICAgICBwcml2YXRlIG5hdGl2ZSB2b2lkICAgICBuYXRpdmVEZWJ1Z0R1bXAoKTsKICAgICBwcml2YXRlIG5hdGl2ZSB2b2lkICAgICBuYXRpdmVEZXN0cm95KCk7Ci0gICAgcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiAgbmF0aXZlRXZhbHVhdGVMYXllcnNBbmltYXRpb25zKCk7CiAgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCAgICAgbmF0aXZlRHJhd0V4dHJhcyhDYW52YXMgY2FudmFzLCBpbnQgZXh0cmEpOwogICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgICAgIG5hdGl2ZUR1bXBEaXNwbGF5VHJlZShTdHJpbmcgdXJsT3JOdWxsKTsKKyAgICBwcml2YXRlIG5hdGl2ZSBib29sZWFuICBuYXRpdmVFdmFsdWF0ZUxheWVyc0FuaW1hdGlvbnMoKTsKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkICAgICBuYXRpdmVFeHRlbmRTZWxlY3Rpb24oaW50IHgsIGludCB5KTsKICAgICBwcml2YXRlIG5hdGl2ZSBpbnQgICAgICBuYXRpdmVGaW5kQWxsKFN0cmluZyBmaW5kTG93ZXIsIFN0cmluZyBmaW5kVXBwZXIpOwogICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgICAgIG5hdGl2ZUZpbmROZXh0KGJvb2xlYW4gZm9yd2FyZCk7CiAgICAgLyogcGFja2FnZSAqLyBuYXRpdmUgaW50ICAgICAgbmF0aXZlRm9jdXNDYW5kaWRhdGVGcmFtZVBvaW50ZXIoKTsKQEAgLTc0MjcsNiArNzAxOCw3IEBACiAgICAgcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiAgbmF0aXZlSGFzQ3Vyc29yTm9kZSgpOwogICAgIHByaXZhdGUgbmF0aXZlIGJvb2xlYW4gIG5hdGl2ZUhhc0ZvY3VzTm9kZSgpOwogICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgICAgIG5hdGl2ZUhpZGVDdXJzb3IoKTsKKyAgICBwcml2YXRlIG5hdGl2ZSBib29sZWFuICBuYXRpdmVIaXRTZWxlY3Rpb24oaW50IHgsIGludCB5KTsKICAgICBwcml2YXRlIG5hdGl2ZSBTdHJpbmcgICBuYXRpdmVJbWFnZVVSSShpbnQgeCwgaW50IHkpOwogICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgICAgIG5hdGl2ZUluc3RydW1lbnRSZXBvcnQoKTsKICAgICAvKiBwYWNrYWdlICovIG5hdGl2ZSBib29sZWFuIG5hdGl2ZU1vdmVDdXJzb3JUb05leHRUZXh0SW5wdXQoKTsKQEAgLTc0MzYsMjkgKzcwMjgsNDMgQEAKICAgICBwcml2YXRlIG5hdGl2ZSBib29sZWFuICBuYXRpdmVNb3ZlQ3Vyc29yKGludCBrZXlDb2RlLCBpbnQgY291bnQsCiAgICAgICAgICAgICBib29sZWFuIG5vU2Nyb2xsKTsKICAgICBwcml2YXRlIG5hdGl2ZSBpbnQgICAgICBuYXRpdmVNb3ZlR2VuZXJhdGlvbigpOwotICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgICAgIG5hdGl2ZU1vdmVTZWxlY3Rpb24oaW50IHgsIGludCB5LAotICAgICAgICAgICAgYm9vbGVhbiBleHRlbmRTZWxlY3Rpb24pOworICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgICAgIG5hdGl2ZU1vdmVTZWxlY3Rpb24oaW50IHgsIGludCB5KTsKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHBhZ2Ugc2hvdWxkIGdldCB0aGUgc2hpZnQgYW5kIGFycm93IGtleXMsIHJhdGhlcgorICAgICAqIHRoYW4gc2VsZWN0IHRleHQvbmF2aWdhdGlvbi4KKyAgICAgKgorICAgICAqIElmIHRoZSBmb2N1cyBpcyBhIHBsdWdpbiwgb3IgaWYgdGhlIGZvY3VzIGFuZCBjdXJzb3IgbWF0Y2ggYW5kIGFyZQorICAgICAqIGEgY29udGVudEVkaXRhYmxlIGVsZW1lbnQsIHRoZW4gdGhlIHBhZ2Ugc2hvdWxkIGhhbmRsZSB0aGVzZSBrZXlzLgorICAgICAqLworICAgIHByaXZhdGUgbmF0aXZlIGJvb2xlYW4gIG5hdGl2ZVBhZ2VTaG91bGRIYW5kbGVTaGlmdEFuZEFycm93cygpOwogICAgIHByaXZhdGUgbmF0aXZlIGJvb2xlYW4gIG5hdGl2ZVBvaW50SW5OYXZDYWNoZShpbnQgeCwgaW50IHksIGludCBzbG9wKTsKICAgICAvLyBMaWtlIG1hbnkgb3RoZXIgb2Ygb3VyIG5hdGl2ZSBtZXRob2RzLCB5b3UgbXVzdCBtYWtlIHN1cmUgdGhhdAogICAgIC8vIG1OYXRpdmVDbGFzcyBpcyBub3QgbnVsbCBiZWZvcmUgY2FsbGluZyB0aGlzIG1ldGhvZC4KICAgICBwcml2YXRlIG5hdGl2ZSB2b2lkICAgICBuYXRpdmVSZWNvcmRCdXR0b25zKGJvb2xlYW4gZm9jdXNlZCwKICAgICAgICAgICAgIGJvb2xlYW4gcHJlc3NlZCwgYm9vbGVhbiBpbnZhbGlkYXRlKTsKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkICAgICBuYXRpdmVSZXNldFNlbGVjdGlvbigpOworICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgICAgIG5hdGl2ZVNlbGVjdEFsbCgpOwogICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgICAgIG5hdGl2ZVNlbGVjdEJlc3RBdChSZWN0IHJlY3QpOworICAgIHByaXZhdGUgbmF0aXZlIGludCAgICAgIG5hdGl2ZVNlbGVjdGlvblgoKTsKKyAgICBwcml2YXRlIG5hdGl2ZSBpbnQgICAgICBuYXRpdmVTZWxlY3Rpb25ZKCk7CisgICAgcHJpdmF0ZSBuYXRpdmUgaW50ICAgICAgbmF0aXZlRmluZEluZGV4KCk7CisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCAgICAgbmF0aXZlU2V0RXh0ZW5kU2VsZWN0aW9uKCk7CiAgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCAgICAgbmF0aXZlU2V0RmluZElzRW1wdHkoKTsKICAgICBwcml2YXRlIG5hdGl2ZSB2b2lkICAgICBuYXRpdmVTZXRGaW5kSXNVcChib29sZWFuIGlzVXApOwogICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgICAgIG5hdGl2ZVNldEZvbGxvd2VkTGluayhib29sZWFuIGZvbGxvd2VkKTsKICAgICBwcml2YXRlIG5hdGl2ZSB2b2lkICAgICBuYXRpdmVTZXRIZWlnaHRDYW5NZWFzdXJlKGJvb2xlYW4gbWVhc3VyZSk7CiAgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCAgICAgbmF0aXZlU2V0Um9vdExheWVyKGludCBsYXllcik7CiAgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCAgICAgbmF0aXZlU2V0U2VsZWN0aW9uUG9pbnRlcihib29sZWFuIHNldCwKLSAgICAgICAgICAgIGZsb2F0IHNjYWxlLCBpbnQgeCwgaW50IHksIGJvb2xlYW4gZXh0ZW5kU2VsZWN0aW9uKTsKLSAgICBwcml2YXRlIG5hdGl2ZSB2b2lkICAgICBuYXRpdmVTZXRTZWxlY3Rpb25SZWdpb24oYm9vbGVhbiBzZXQpOworICAgICAgICAgICAgZmxvYXQgc2NhbGUsIGludCB4LCBpbnQgeSk7CisgICAgcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiAgbmF0aXZlU3RhcnRTZWxlY3Rpb24oaW50IHgsIGludCB5KTsKICAgICBwcml2YXRlIG5hdGl2ZSBSZWN0ICAgICBuYXRpdmVTdWJ0cmFjdExheWVycyhSZWN0IGNvbnRlbnQpOwogICAgIHByaXZhdGUgbmF0aXZlIGludCAgICAgIG5hdGl2ZVRleHRHZW5lcmF0aW9uKCk7CiAgICAgLy8gTmV2ZXIgY2FsbCB0aGlzIHZlcnNpb24gZXhjZXB0IGJ5IHVwZGF0ZUNhY2hlZFRleHRmaWVsZChTdHJpbmcpIC0KICAgICAvLyB3ZSBhbHdheXMgd2FudCB0byBwYXNzIGluIG91ciBnZW5lcmF0aW9uIG51bWJlci4KICAgICBwcml2YXRlIG5hdGl2ZSB2b2lkICAgICBuYXRpdmVVcGRhdGVDYWNoZWRUZXh0ZmllbGQoU3RyaW5nIHVwZGF0ZWRUZXh0LAogICAgICAgICAgICAgaW50IGdlbmVyYXRpb24pOworICAgIHByaXZhdGUgbmF0aXZlIGJvb2xlYW4gIG5hdGl2ZVdvcmRTZWxlY3Rpb24oaW50IHgsIGludCB5KTsKICAgICAvLyByZXR1cm4gTk9fTEVGVEVER0UgbWVhbnMgZmFpbHVyZS4KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTk9fTEVGVEVER0UgPSAtMTsKLSAgICBwcml2YXRlIG5hdGl2ZSBpbnQgICAgICBuYXRpdmVHZXRCbG9ja0xlZnRFZGdlKGludCB4LCBpbnQgeSwgZmxvYXQgc2NhbGUpOworICAgIHN0YXRpYyBmaW5hbCBpbnQgTk9fTEVGVEVER0UgPSAtMTsKKyAgICBuYXRpdmUgaW50IG5hdGl2ZUdldEJsb2NrTGVmdEVkZ2UoaW50IHgsIGludCB5LCBmbG9hdCBzY2FsZSk7CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvV2ViVmlld0NvcmUuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9XZWJWaWV3Q29yZS5qYXZhCmluZGV4IDQxMTgxMTkuLjNjMTU3NDYzIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvV2ViVmlld0NvcmUuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvV2ViVmlld0NvcmUuamF2YQpAQCAtMTcsNyArMTcsNiBAQAogcGFja2FnZSBhbmRyb2lkLndlYmtpdDsKIAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyLk5hbWVOb3RGb3VuZEV4Y2VwdGlvbjsKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcjsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKQEAgLTMzLDEyICszMiwxMSBAQAogaW1wb3J0IGFuZHJvaWQub3MuTG9vcGVyOwogaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKIGltcG9ydCBhbmRyb2lkLm9zLlByb2Nlc3M7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Ccm93c2VyOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuT3BlbmFibGVDb2x1bW5zOworaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuTWVkaWFTdG9yZTsKK2ltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLk1lZGlhU3RvcmUuSW1hZ2VzLk1lZGlhOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlNwYXJzZUJvb2xlYW5BcnJheTsKIGltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlN1cmZhY2VIb2xkZXI7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlN1cmZhY2VWaWV3OwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwogCkBAIC0xMTcsNyArMTE1LDcgQEAKICAgICBwcml2YXRlIGludCBtVmlld3BvcnREZW5zaXR5RHBpID0gLTE7CiAKICAgICBwcml2YXRlIGludCBtUmVzdG9yZWRTY2FsZSA9IDA7Ci0gICAgcHJpdmF0ZSBpbnQgbVJlc3RvcmVkU2NyZWVuV2lkdGhTY2FsZSA9IDA7CisgICAgcHJpdmF0ZSBpbnQgbVJlc3RvcmVkVGV4dFdyYXBTY2FsZSA9IDA7CiAgICAgcHJpdmF0ZSBpbnQgbVJlc3RvcmVkWCA9IDA7CiAgICAgcHJpdmF0ZSBpbnQgbVJlc3RvcmVkWSA9IDA7CiAKQEAgLTI3OSwzNCArMjc3LDM2IEBACiAKICAgICAvKioKICAgICAgKiBDYWxsZWQgYnkgSk5JLiAgT3BlbiBhIGZpbGUgY2hvb3NlciB0byB1cGxvYWQgYSBmaWxlLgotICAgICAqIEByZXR1cm4gU3RyaW5nIHZlcnNpb24gb2YgdGhlIFVSSSBwbHVzIHRoZSBuYW1lIG9mIHRoZSBmaWxlLgotICAgICAqIEZJWE1FOiBKdXN0IHJldHVybiB0aGUgVVJJIGhlcmUsIGFuZCBpbiBGaWxlU3lzdGVtOjpwYXRoR2V0RmlsZU5hbWUsIGNhbGwKLSAgICAgKiBpbnRvIEphdmEgdG8gZ2V0IHRoZSBmaWxlbmFtZS4KKyAgICAgKiBAcGFyYW0gYWNjZXB0VHlwZSBUaGUgdmFsdWUgb2YgdGhlICdhY2NlcHQnIGF0dHJpYnV0ZSBvZiB0aGUKKyAgICAgKiAgICAgICAgIGlucHV0IHRhZyBhc3NvY2lhdGVkIHdpdGggdGhpcyBmaWxlIHBpY2tlci4KKyAgICAgKiBAcmV0dXJuIFN0cmluZyB2ZXJzaW9uIG9mIHRoZSBVUkkuCiAgICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgb3BlbkZpbGVDaG9vc2VyKCkgewotICAgICAgICBVcmkgdXJpID0gbUNhbGxiYWNrUHJveHkub3BlbkZpbGVDaG9vc2VyKCk7Ci0gICAgICAgIGlmICh1cmkgPT0gbnVsbCkgcmV0dXJuICIiOwotICAgICAgICAvLyBGaW5kIG91dCB0aGUgbmFtZSwgYW5kIGFwcGVuZCBpdCB0byB0aGUgVVJJLgotICAgICAgICAvLyBXZWJraXQgd2lsbCB0cmVhdCB0aGUgbmFtZSBhcyB0aGUgZmlsZW5hbWUsIGFuZAotICAgICAgICAvLyB0aGUgVVJJIGFzIHRoZSBwYXRoLiAgVGhlIFVSSSB3aWxsIGJlIHVzZWQKLSAgICAgICAgLy8gaW4gQnJvd3NlckZyYW1lIHRvIGdldCB0aGUgYWN0dWFsIGRhdGEuCi0gICAgICAgIEN1cnNvciBjdXJzb3IgPSBtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKS5xdWVyeSgKLSAgICAgICAgICAgICAgICB1cmksCi0gICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsgT3BlbmFibGVDb2x1bW5zLkRJU1BMQVlfTkFNRSB9LAotICAgICAgICAgICAgICAgIG51bGwsCi0gICAgICAgICAgICAgICAgbnVsbCwKLSAgICAgICAgICAgICAgICBudWxsKTsKLSAgICAgICAgU3RyaW5nIG5hbWUgPSAiIjsKLSAgICAgICAgaWYgKGN1cnNvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGlmIChjdXJzb3IubW92ZVRvTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG5hbWUgPSBjdXJzb3IuZ2V0U3RyaW5nKDApOworICAgIHByaXZhdGUgU3RyaW5nIG9wZW5GaWxlQ2hvb3NlcihTdHJpbmcgYWNjZXB0VHlwZSkgeworICAgICAgICBVcmkgdXJpID0gbUNhbGxiYWNrUHJveHkub3BlbkZpbGVDaG9vc2VyKGFjY2VwdFR5cGUpOworICAgICAgICBpZiAodXJpICE9IG51bGwpIHsKKyAgICAgICAgICAgIFN0cmluZyBmaWxlUGF0aCA9ICIiOworICAgICAgICAgICAgLy8gTm90ZSAtIHF1ZXJ5aW5nIGZvciBNZWRpYVN0b3JlLkltYWdlcy5NZWRpYS5EQVRBCisgICAgICAgICAgICAvLyBzZWVtcyB0byB3b3JrIGZvciBhbGwgY29udGVudCBVUklzLCBub3QganVzdCBpbWFnZXMKKyAgICAgICAgICAgIEN1cnNvciBjdXJzb3IgPSBtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKS5xdWVyeSgKKyAgICAgICAgICAgICAgICAgICAgdXJpLAorICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10geyBNZWRpYVN0b3JlLkltYWdlcy5NZWRpYS5EQVRBIH0sCisgICAgICAgICAgICAgICAgICAgIG51bGwsIG51bGwsIG51bGwpOworICAgICAgICAgICAgaWYgKGN1cnNvciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnNvci5tb3ZlVG9OZXh0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVQYXRoID0gY3Vyc29yLmdldFN0cmluZygwKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgIGN1cnNvci5jbG9zZSgpOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgY3Vyc29yLmNsb3NlKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZpbGVQYXRoID0gdXJpLmdldExhc3RQYXRoU2VnbWVudCgpOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgU3RyaW5nIHVyaVN0cmluZyA9IHVyaS50b1N0cmluZygpOworICAgICAgICAgICAgQnJvd3NlckZyYW1lLnNKYXZhQnJpZGdlLnN0b3JlRmlsZVBhdGhGb3JDb250ZW50VXJpKGZpbGVQYXRoLCB1cmlTdHJpbmcpOworICAgICAgICAgICAgcmV0dXJuIHVyaVN0cmluZzsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gdXJpLnRvU3RyaW5nKCkgKyAiLyIgKyBuYW1lOworICAgICAgICByZXR1cm4gIiI7CiAgICAgfQogCiAgICAgLyoqCkBAIC00ODAsMTIgKzQ4MCwxMiBAQAogICAgICAgICBvZiBsYXlvdXQvbGluZS1icmVha2luZy4gVGhlc2UgY29vcmRpbmF0ZXMgYXJlIGluIGRvY3VtZW50IHNwYWNlLAogICAgICAgICB3aGljaCBpcyB0aGUgc2FtZSBhcyBWaWV3IGNvb3JkcyB1bmxlc3Mgd2UgaGF2ZSB6b29tZWQgdGhlIGRvY3VtZW50CiAgICAgICAgIChzZWUgbmF0aXZlU2V0Wm9vbSkuCi0gICAgICAgIHNjcmVlbldpZHRoIGlzIHVzZWQgYnkgbGF5b3V0IHRvIHdyYXAgY29sdW1uIGFyb3VuZC4gSWYgdmlld3BvcnQgdXNlcwotICAgICAgICBmaXhlZCBzaXplLCBzY3JlZW5XaWR0aCBjYW4gYmUgZGlmZmVyZW50IGZyb20gd2lkdGggd2l0aCB6b29taW5nLgorICAgICAgICB0ZXh0V3JhcFdpZHRoIGlzIHVzZWQgYnkgbGF5b3V0IHRvIHdyYXAgY29sdW1uIGFyb3VuZC4gSWYgdmlld3BvcnQgdXNlcworICAgICAgICBmaXhlZCBzaXplLCB0ZXh0V3JhcFdpZHRoIGNhbiBiZSBkaWZmZXJlbnQgZnJvbSB3aWR0aCB3aXRoIHpvb21pbmcuCiAgICAgICAgIHNob3VsZCB0aGlzIGJlIGNhbGxlZCBuYXRpdmVTZXRWaWV3UG9ydFNpemU/CiAgICAgKi8KLSAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5hdGl2ZVNldFNpemUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgc2NyZWVuV2lkdGgsCi0gICAgICAgICAgICBmbG9hdCBzY2FsZSwgaW50IHJlYWxTY3JlZW5XaWR0aCwgaW50IHNjcmVlbkhlaWdodCwgaW50IGFuY2hvclgsCisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuYXRpdmVTZXRTaXplKGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHRleHRXcmFwV2lkdGgsCisgICAgICAgICAgICBmbG9hdCBzY2FsZSwgaW50IHNjcmVlbldpZHRoLCBpbnQgc2NyZWVuSGVpZ2h0LCBpbnQgYW5jaG9yWCwKICAgICAgICAgICAgIGludCBhbmNob3JZLCBib29sZWFuIGlnbm9yZUhlaWdodCk7CiAKICAgICBwcml2YXRlIG5hdGl2ZSBpbnQgbmF0aXZlR2V0Q29udGVudE1pblByZWZXaWR0aCgpOwpAQCAtNTc2LDcgKzU3NiwxOCBAQAogICAgIC8qKgogICAgICAqIFByb3ZpZGUgV2ViQ29yZSB3aXRoIHRoZSBwcmV2aW91c2x5IHZpc3RlZCBsaW5rcyBmcm9tIHRoZSBoaXN0b3J5IGRhdGFiYXNlCiAgICAgICovCi0gICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCAgbmF0aXZlUHJvdmlkZVZpc2l0ZWRIaXN0b3J5KFN0cmluZ1tdIGhpc3RvcnkpOworICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgbmF0aXZlUHJvdmlkZVZpc2l0ZWRIaXN0b3J5KFN0cmluZ1tdIGhpc3RvcnkpOworCisgICAgLyoqCisgICAgICogTW9kaWZpZXMgdGhlIGN1cnJlbnQgc2VsZWN0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGFsdGVyIFNwZWNpZmllcyBob3cgdG8gYWx0ZXIgdGhlIHNlbGVjdGlvbi4KKyAgICAgKiBAcGFyYW0gZGlyZWN0aW9uIFRoZSBkaXJlY3Rpb24gaW4gd2hpY2ggdG8gYWx0ZXIgdGhlIHNlbGVjdGlvbi4KKyAgICAgKiBAcGFyYW0gZ3JhbnVsYXJpdHkgVGhlIGdyYW51bGFyaXR5IG9mIHRoZSBzZWxlY3Rpb24gbW9kaWZpY2F0aW9uLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgc2VsZWN0aW9uIHN0cmluZy4KKyAgICAgKi8KKyAgICBwcml2YXRlIG5hdGl2ZSBTdHJpbmcgbmF0aXZlTW9kaWZ5U2VsZWN0aW9uKFN0cmluZyBhbHRlciwgU3RyaW5nIGRpcmVjdGlvbiwgU3RyaW5nIGdyYW51bGFyaXR5KTsKIAogICAgIC8vIEV2ZW50SHViIGZvciBwcm9jZXNzaW5nIG1lc3NhZ2VzCiAgICAgcHJpdmF0ZSBmaW5hbCBFdmVudEh1YiBtRXZlbnRIdWI7CkBAIC02OTcsNiArNzA4LDEyIEBACiAgICAgICAgIGludCBtWTsKICAgICB9CiAKKyAgICBzdGF0aWMgY2xhc3MgVG91Y2hIaWdobGlnaHREYXRhIHsKKyAgICAgICAgaW50IG1YOworICAgICAgICBpbnQgbVk7CisgICAgICAgIGludCBtU2xvcDsKKyAgICB9CisKICAgICAvLyBtQWN0aW9uIG9mIFRvdWNoRXZlbnREYXRhIGNhbiBiZSBNb3Rpb25FdmVudC5nZXRBY3Rpb24oKSB3aGljaCB1c2VzIHRoZQogICAgIC8vIGxhc3QgdHdvIGJ5dGVzIG9yIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlcwogICAgIHN0YXRpYyBmaW5hbCBpbnQgQUNUSU9OX0xPTkdQUkVTUyA9IDB4MTAwOwpAQCAtNzA4LDggKzcyNSw2IEBACiAgICAgICAgIGludCBtWTsKICAgICAgICAgaW50IG1NZXRhU3RhdGU7CiAgICAgICAgIGJvb2xlYW4gbVJlcHJvY2VzczsKLSAgICAgICAgZmxvYXQgbVZpZXdYOwotICAgICAgICBmbG9hdCBtVmlld1k7CiAgICAgfQogCiAgICAgc3RhdGljIGNsYXNzIEdlb2xvY2F0aW9uUGVybWlzc2lvbnNEYXRhIHsKQEAgLTcxOCw3ICs3MzMsMTEgQEAKICAgICAgICAgYm9vbGVhbiBtUmVtZW1iZXI7CiAgICAgfQogCi0KKyAgICBzdGF0aWMgY2xhc3MgTW9kaWZ5U2VsZWN0aW9uRGF0YSB7CisgICAgICAgIFN0cmluZyBtQWx0ZXI7CisgICAgICAgIFN0cmluZyBtRGlyZWN0aW9uOworICAgICAgICBTdHJpbmcgbUdyYW51bGFyaXR5OworICAgIH0KIAogICAgICAgICBzdGF0aWMgZmluYWwgU3RyaW5nW10gSGFuZGxlckRlYnVnU3RyaW5nID0gewogICAgICAgICAgICAgIlJFUVVFU1RfTEFCRUwiLCAvLyA5NwpAQCAtODY1LDYgKzg4NCwxMiBAQAogICAgICAgICBzdGF0aWMgZmluYWwgaW50IEFERF9QQUNLQUdFX05BTUUgPSAxODU7CiAgICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgUkVNT1ZFX1BBQ0tBR0VfTkFNRSA9IDE4NjsKIAorICAgICAgICBzdGF0aWMgZmluYWwgaW50IEdFVF9UT1VDSF9ISUdITElHSFRfUkVDVFMgPSAxODc7CisgICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgUkVNT1ZFX1RPVUNIX0hJR0hMSUdIVF9SRUNUUyA9IDE4ODsKKworICAgICAgICAvLyBhY2Nlc3NpYmlsaXR5IHN1cHBvcnQKKyAgICAgICAgc3RhdGljIGZpbmFsIGludCBNT0RJRllfU0VMRUNUSU9OID0gMTkwOworCiAgICAgICAgIC8vIHByaXZhdGUgbWVzc2FnZSBpZHMKICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFU1RST1kgPSAgICAgMjAwOwogCkBAIC0xMjM4LDYgKzEyNjMsMTkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVTZXRTZWxlY3Rpb24obXNnLmFyZzEsIG1zZy5hcmcyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKIAorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNT0RJRllfU0VMRUNUSU9OOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZGlmeVNlbGVjdGlvbkRhdGEgbW9kaWZ5U2VsZWN0aW9uRGF0YSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNb2RpZnlTZWxlY3Rpb25EYXRhKSBtc2cub2JqOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzZWxlY3Rpb25TdHJpbmcgPSBuYXRpdmVNb2RpZnlTZWxlY3Rpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RpZnlTZWxlY3Rpb25EYXRhLm1BbHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGlmeVNlbGVjdGlvbkRhdGEubURpcmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGlmeVNlbGVjdGlvbkRhdGEubUdyYW51bGFyaXR5KTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1XZWJWaWV3Lm1Qcml2YXRlSGFuZGxlci5vYnRhaW5NZXNzYWdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViVmlldy5TRUxFQ1RJT05fU1RSSU5HX0NIQU5HRUQsIHNlbGVjdGlvblN0cmluZykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZW5kVG9UYXJnZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKwogICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBMSVNUQk9YX0NIT0lDRVM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3BhcnNlQm9vbGVhbkFycmF5IGNob2ljZXMgPSAoU3BhcnNlQm9vbGVhbkFycmF5KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnLm9iajsKQEAgLTEzNTcsNiArMTM5NSwyMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJyb3dzZXJGcmFtZS5zSmF2YUJyaWRnZS5yZW1vdmVQYWNrYWdlTmFtZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChTdHJpbmcpIG1zZy5vYmopOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEdFVF9UT1VDSF9ISUdITElHSFRfUkVDVFM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVG91Y2hIaWdobGlnaHREYXRhIGQgPSAoVG91Y2hIaWdobGlnaHREYXRhKSBtc2cub2JqOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5TGlzdDxSZWN0PiByZWN0cyA9IG5hdGl2ZUdldFRvdWNoSGlnaGxpZ2h0UmVjdHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkLm1YLCBkLm1ZLCBkLm1TbG9wKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtV2ViVmlldy5tUHJpdmF0ZUhhbmRsZXIub2J0YWluTWVzc2FnZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlZpZXcuU0VUX1RPVUNIX0hJR0hMSUdIVF9SRUNUUywgcmVjdHMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2VuZFRvVGFyZ2V0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUkVNT1ZFX1RPVUNIX0hJR0hMSUdIVF9SRUNUUzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtV2ViVmlldy5tUHJpdmF0ZUhhbmRsZXIub2J0YWluTWVzc2FnZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlZpZXcuU0VUX1RPVUNIX0hJR0hMSUdIVF9SRUNUUywgbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZW5kVG9UYXJnZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH07CkBAIC0xNTc1LDExICsxNjI4LDEyIEBACiAgICAgICAgICAgICBpZiAoa2V5Q29kZSA+PSBLZXlFdmVudC5LRVlDT0RFX0RQQURfVVAKICAgICAgICAgICAgICAgICAgICAgJiYga2V5Q29kZSA8PSBLZXlFdmVudC5LRVlDT0RFX0RQQURfUklHSFQpIHsKICAgICAgICAgICAgICAgICBpZiAoRGVidWdGbGFncy5XRUJfVklFV19DT1JFKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy52KExPR1RBRywgImtleTogYXJyb3cgdW51c2VkIGJ5IHBsdWdpbjogIiArIGtleUNvZGUpOworICAgICAgICAgICAgICAgICAgICBMb2cudihMT0dUQUcsICJrZXk6IGFycm93IHVudXNlZCBieSBwYWdlOiAiICsga2V5Q29kZSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGlmIChtV2ViVmlldyAhPSBudWxsICYmIGV2dC5pc0Rvd24oKSkgewogICAgICAgICAgICAgICAgICAgICBNZXNzYWdlLm9idGFpbihtV2ViVmlldy5tUHJpdmF0ZUhhbmRsZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViVmlldy5NT1ZFX09VVF9PRl9QTFVHSU4sIGtleUNvZGUpLnNlbmRUb1RhcmdldCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlZpZXcuVU5IQU5ETEVEX05BVl9LRVksIGtleUNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCkuc2VuZFRvVGFyZ2V0KCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KQEAgLTE2ODQsMTEgKzE3MzgsMTEgQEAKICAgICAvLyBVc2VkIHRvIHN1c3BlbmQgZHJhd2luZy4KICAgICBwcml2YXRlIGJvb2xlYW4gbURyYXdJc1BhdXNlZDsKIAotICAgIC8vIG1SZXN0b3JlU3RhdGUgaXMgc2V0IGluIGRpZEZpcnN0TGF5b3V0KCksIGFuZCByZXNldCBpbiB0aGUgbmV4dAotICAgIC8vIHdlYmtpdERyYXcgYWZ0ZXIgcGFzc2luZyBpdCB0byB0aGUgVUkgdGhyZWFkLgotICAgIHByaXZhdGUgUmVzdG9yZVN0YXRlIG1SZXN0b3JlU3RhdGUgPSBudWxsOworICAgIC8vIG1Jbml0aWFsVmlld1N0YXRlIGlzIHNldCBieSBkaWRGaXJzdExheW91dCgpIGFuZCB0aGVuIHJlc2V0IGluIHRoZQorICAgIC8vIG5leHQgd2Via2l0RHJhdyBhZnRlciBwYXNzaW5nIHRoZSBzdGF0ZSB0byB0aGUgVUkgdGhyZWFkLgorICAgIHByaXZhdGUgVmlld1N0YXRlIG1Jbml0aWFsVmlld1N0YXRlID0gbnVsbDsKIAotICAgIHN0YXRpYyBjbGFzcyBSZXN0b3JlU3RhdGUgeworICAgIHN0YXRpYyBjbGFzcyBWaWV3U3RhdGUgewogICAgICAgICBmbG9hdCBtTWluU2NhbGU7CiAgICAgICAgIGZsb2F0IG1NYXhTY2FsZTsKICAgICAgICAgZmxvYXQgbVZpZXdTY2FsZTsKQEAgLTE3MDgsOCArMTc2Miw4IEBACiAgICAgICAgIFBvaW50IG1WaWV3UG9pbnQ7CiAgICAgICAgIFBvaW50IG1XaWR0aEhlaWdodDsKICAgICAgICAgaW50IG1NaW5QcmVmV2lkdGg7Ci0gICAgICAgIFJlc3RvcmVTdGF0ZSBtUmVzdG9yZVN0YXRlOyAvLyBvbmx5IG5vbi1udWxsIGlmIGl0IGlzIGZvciB0aGUgZmlyc3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBpY3R1cmUgc2V0IGFmdGVyIHRoZSBmaXJzdCBsYXlvdXQKKyAgICAgICAgLy8gb25seSBub24tbnVsbCBpZiBpdCBpcyBmb3IgdGhlIGZpcnN0IHBpY3R1cmUgc2V0IGFmdGVyIHRoZSBmaXJzdCBsYXlvdXQKKyAgICAgICAgVmlld1N0YXRlIG1WaWV3U3RhdGU7CiAgICAgICAgIGJvb2xlYW4gbUZvY3VzU2l6ZUNoYW5nZWQ7CiAgICAgfQogCkBAIC0xNzM0LDkgKzE3ODgsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbVZpZXdwb3J0V2lkdGgpLAogICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlR2V0Q29udGVudE1pblByZWZXaWR0aCgpKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtUmVzdG9yZVN0YXRlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBkcmF3Lm1SZXN0b3JlU3RhdGUgPSBtUmVzdG9yZVN0YXRlOwotICAgICAgICAgICAgICAgIG1SZXN0b3JlU3RhdGUgPSBudWxsOworICAgICAgICAgICAgaWYgKG1Jbml0aWFsVmlld1N0YXRlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBkcmF3Lm1WaWV3U3RhdGUgPSBtSW5pdGlhbFZpZXdTdGF0ZTsKKyAgICAgICAgICAgICAgICBtSW5pdGlhbFZpZXdTdGF0ZSA9IG51bGw7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoRGVidWdGbGFncy5XRUJfVklFV19DT1JFKSBMb2cudihMT0dUQUcsICJ3ZWJraXREcmF3IE5FV19QSUNUVVJFX01TR19JRCIpOwogICAgICAgICAgICAgTWVzc2FnZS5vYnRhaW4obVdlYlZpZXcubVByaXZhdGVIYW5kbGVyLApAQCAtMTgxNyw2ICsxODcxLDggQEAKICAgICAgICAgLy8gY2FsbGVkIGZyb20gVUkgdGhyZWFkIHdoaWxlIFdFQktJVF9EUkFXIGlzIGp1c3QgcHVsbGVkIG91dCBvZiB0aGUKICAgICAgICAgLy8gcXVldWUgaW4gV2ViQ29yZSB0aHJlYWQgdG8gYmUgZXhlY3V0ZWQuIFRoZW4gdXBkYXRlIHdvbid0IGJlIGJsb2NrZWQuCiAgICAgICAgIGlmIChjb3JlICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmICghY29yZS5nZXRTZXR0aW5ncygpLmVuYWJsZVNtb290aFRyYW5zaXRpb24oKSkgcmV0dXJuOworCiAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKGNvcmUpIHsKICAgICAgICAgICAgICAgICBjb3JlLm1EcmF3SXNQYXVzZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgIGlmIChjb3JlLm1EcmF3SXNTY2hlZHVsZWQpIHsKQEAgLTE4MjksNiArMTg4NSwxMCBAQAogCiAgICAgc3RhdGljIHZvaWQgcmVzdW1lVXBkYXRlUGljdHVyZShXZWJWaWV3Q29yZSBjb3JlKSB7CiAgICAgICAgIGlmIChjb3JlICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8vIGlmIG1EcmF3SXNQYXVzZWQgaXMgdHJ1ZSwgaWdub3JlIHRoZSBzZXR0aW5nLCBjb250aW51ZSB0byByZXN1bWUKKyAgICAgICAgICAgIGlmICghY29yZS5tRHJhd0lzUGF1c2VkCisgICAgICAgICAgICAgICAgICAgICYmICFjb3JlLmdldFNldHRpbmdzKCkuZW5hYmxlU21vb3RoVHJhbnNpdGlvbigpKSByZXR1cm47CisKICAgICAgICAgICAgIHN5bmNocm9uaXplZCAoY29yZSkgewogICAgICAgICAgICAgICAgIGNvcmUubURyYXdJc1BhdXNlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgIGlmIChjb3JlLm1EcmF3SXNTY2hlZHVsZWQpIHsKQEAgLTIwMDUsMTggKzIwNjUsMjQgQEAKIAogICAgICAgICBpZiAobVdlYlZpZXcgPT0gbnVsbCkgcmV0dXJuOwogCi0gICAgICAgIGJvb2xlYW4gdXBkYXRlUmVzdG9yZVN0YXRlID0gc3RhbmRhcmRMb2FkIHx8IG1SZXN0b3JlZFNjYWxlID4gMDsKLSAgICAgICAgc2V0dXBWaWV3cG9ydCh1cGRhdGVSZXN0b3JlU3RhdGUpOworICAgICAgICBib29sZWFuIHVwZGF0ZVZpZXdTdGF0ZSA9IHN0YW5kYXJkTG9hZCB8fCBtUmVzdG9yZWRTY2FsZSA+IDA7CisgICAgICAgIHNldHVwVmlld3BvcnQodXBkYXRlVmlld1N0YXRlKTsKICAgICAgICAgLy8gaWYgdXBkYXRlUmVzdG9yZVN0YXRlIGlzIHRydWUsIFZpZXdNYW5hZ2VyLnBvc3RSZWFkeVRvRHJhd0FsbCgpIHdpbGwKLSAgICAgICAgLy8gYmUgY2FsbGVkIGFmdGVyIHRoZSBXZWJWaWV3IHJlc3RvcmUgdGhlIHN0YXRlLiBJZiB1cGRhdGVSZXN0b3JlU3RhdGUKKyAgICAgICAgLy8gYmUgY2FsbGVkIGFmdGVyIHRoZSBXZWJWaWV3IHVwZGF0ZXMgaXRzIHN0YXRlLiBJZiB1cGRhdGVSZXN0b3JlU3RhdGUKICAgICAgICAgLy8gaXMgZmFsc2UsIHN0YXJ0IHRvIGRyYXcgbm93IGFzIGl0IGlzIHJlYWR5LgotICAgICAgICBpZiAoIXVwZGF0ZVJlc3RvcmVTdGF0ZSkgeworICAgICAgICBpZiAoIXVwZGF0ZVZpZXdTdGF0ZSkgewogICAgICAgICAgICAgbVdlYlZpZXcubVZpZXdNYW5hZ2VyLnBvc3RSZWFkeVRvRHJhd0FsbCgpOwogICAgICAgICB9CiAKKyAgICAgICAgLy8gcmVtb3ZlIHRoZSB0b3VjaCBoaWdobGlnaHQgd2hlbiBtb3ZpbmcgdG8gYSBuZXcgcGFnZQorICAgICAgICBpZiAoZ2V0U2V0dGluZ3MoKS5zdXBwb3J0VG91Y2hPbmx5KCkpIHsKKyAgICAgICAgICAgIG1FdmVudEh1Yi5zZW5kTWVzc2FnZShNZXNzYWdlLm9idGFpbihudWxsLAorICAgICAgICAgICAgICAgICAgICBFdmVudEh1Yi5SRU1PVkVfVE9VQ0hfSElHSExJR0hUX1JFQ1RTKSk7CisgICAgICAgIH0KKwogICAgICAgICAvLyByZXNldCB0aGUgc2Nyb2xsIHBvc2l0aW9uLCB0aGUgcmVzdG9yZWQgb2Zmc2V0IGFuZCBzY2FsZXMKICAgICAgICAgbVdlYmtpdFNjcm9sbFggPSBtV2Via2l0U2Nyb2xsWSA9IG1SZXN0b3JlZFggPSBtUmVzdG9yZWRZCi0gICAgICAgICAgICAgICAgPSBtUmVzdG9yZWRTY2FsZSA9IG1SZXN0b3JlZFNjcmVlbldpZHRoU2NhbGUgPSAwOworICAgICAgICAgICAgICAgID0gbVJlc3RvcmVkU2NhbGUgPSBtUmVzdG9yZWRUZXh0V3JhcFNjYWxlID0gMDsKICAgICB9CiAKICAgICAvLyBjYWxsZWQgYnkgSk5JCkBAIC0yMDMwLDE1ICsyMDk2LDE3IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwcml2YXRlIHZvaWQgc2V0dXBWaWV3cG9ydChib29sZWFuIHVwZGF0ZVJlc3RvcmVTdGF0ZSkgeworICAgIHByaXZhdGUgdm9pZCBzZXR1cFZpZXdwb3J0KGJvb2xlYW4gdXBkYXRlVmlld1N0YXRlKSB7CiAgICAgICAgIC8vIHNldCB0aGUgdmlld3BvcnQgc2V0dGluZ3MgZnJvbSBXZWJLaXQKICAgICAgICAgc2V0Vmlld3BvcnRTZXR0aW5nc0Zyb21OYXRpdmUoKTsKIAogICAgICAgICAvLyBhZGp1c3QgdGhlIGRlZmF1bHQgc2NhbGUgdG8gbWF0Y2ggdGhlIGRlbnNpdHlEcGkKICAgICAgICAgZmxvYXQgYWRqdXN0ID0gMS4wZjsKICAgICAgICAgaWYgKG1WaWV3cG9ydERlbnNpdHlEcGkgPT0gLTEpIHsKLSAgICAgICAgICAgIGlmIChXZWJWaWV3LkRFRkFVTFRfU0NBTEVfUEVSQ0VOVCAhPSAxMDApIHsKLSAgICAgICAgICAgICAgICBhZGp1c3QgPSBXZWJWaWV3LkRFRkFVTFRfU0NBTEVfUEVSQ0VOVCAvIDEwMC4wZjsKKyAgICAgICAgICAgIC8vIGNvbnZlcnQgZGVmYXVsdCB6b29tIHNjYWxlIHRvIGEgaW50ZWdlciAocGVyY2VudGFnZSkgdG8gYXZvaWQgYW55CisgICAgICAgICAgICAvLyBpc3N1ZXMgd2l0aCBmbG9hdGluZyBwb2ludCBjb21wYXJpc29ucworICAgICAgICAgICAgaWYgKG1XZWJWaWV3ICE9IG51bGwgJiYgKGludCkobVdlYlZpZXcuZ2V0RGVmYXVsdFpvb21TY2FsZSgpICogMTAwKSAhPSAxMDApIHsKKyAgICAgICAgICAgICAgICBhZGp1c3QgPSBtV2ViVmlldy5nZXREZWZhdWx0Wm9vbVNjYWxlKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSBpZiAobVZpZXdwb3J0RGVuc2l0eURwaSA+IDApIHsKICAgICAgICAgICAgIGFkanVzdCA9IChmbG9hdCkgbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0RGlzcGxheU1ldHJpY3MoKS5kZW5zaXR5RHBpCkBAIC0yMDgwLDE3ICsyMTQ4LDE3IEBACiAgICAgICAgIH0KIAogICAgICAgICAvLyBpZiBtVmlld3BvcnRXaWR0aCBpcyAwLCBpdCBtZWFucyBkZXZpY2Utd2lkdGgsIGFsd2F5cyB1cGRhdGUuCi0gICAgICAgIGlmIChtVmlld3BvcnRXaWR0aCAhPSAwICYmICF1cGRhdGVSZXN0b3JlU3RhdGUpIHsKLSAgICAgICAgICAgIFJlc3RvcmVTdGF0ZSByZXN0b3JlU3RhdGUgPSBuZXcgUmVzdG9yZVN0YXRlKCk7Ci0gICAgICAgICAgICByZXN0b3JlU3RhdGUubU1pblNjYWxlID0gbVZpZXdwb3J0TWluaW11bVNjYWxlIC8gMTAwLjBmOwotICAgICAgICAgICAgcmVzdG9yZVN0YXRlLm1NYXhTY2FsZSA9IG1WaWV3cG9ydE1heGltdW1TY2FsZSAvIDEwMC4wZjsKLSAgICAgICAgICAgIHJlc3RvcmVTdGF0ZS5tRGVmYXVsdFNjYWxlID0gYWRqdXN0OworICAgICAgICBpZiAobVZpZXdwb3J0V2lkdGggIT0gMCAmJiAhdXBkYXRlVmlld1N0YXRlKSB7CisgICAgICAgICAgICBWaWV3U3RhdGUgdmlld1N0YXRlID0gbmV3IFZpZXdTdGF0ZSgpOworICAgICAgICAgICAgdmlld1N0YXRlLm1NaW5TY2FsZSA9IG1WaWV3cG9ydE1pbmltdW1TY2FsZSAvIDEwMC4wZjsKKyAgICAgICAgICAgIHZpZXdTdGF0ZS5tTWF4U2NhbGUgPSBtVmlld3BvcnRNYXhpbXVtU2NhbGUgLyAxMDAuMGY7CisgICAgICAgICAgICB2aWV3U3RhdGUubURlZmF1bHRTY2FsZSA9IGFkanVzdDsKICAgICAgICAgICAgIC8vIGFzIG1WaWV3cG9ydFdpZHRoIGlzIG5vdCAwLCBpdCBpcyBub3QgbW9iaWxlIHNpdGUuCi0gICAgICAgICAgICByZXN0b3JlU3RhdGUubU1vYmlsZVNpdGUgPSBmYWxzZTsKKyAgICAgICAgICAgIHZpZXdTdGF0ZS5tTW9iaWxlU2l0ZSA9IGZhbHNlOwogICAgICAgICAgICAgLy8gZm9yIG5vbi1tb2JpbGUgc2l0ZSwgd2UgZG9uJ3QgbmVlZCBtaW5QcmVmV2lkdGgsIHNldCBpdCBhcyAwCi0gICAgICAgICAgICByZXN0b3JlU3RhdGUubVNjcm9sbFggPSAwOworICAgICAgICAgICAgdmlld1N0YXRlLm1TY3JvbGxYID0gMDsKICAgICAgICAgICAgIE1lc3NhZ2Uub2J0YWluKG1XZWJWaWV3Lm1Qcml2YXRlSGFuZGxlciwKLSAgICAgICAgICAgICAgICAgICAgV2ViVmlldy5VUERBVEVfWk9PTV9SQU5HRSwgcmVzdG9yZVN0YXRlKS5zZW5kVG9UYXJnZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgV2ViVmlldy5VUERBVEVfWk9PTV9SQU5HRSwgdmlld1N0YXRlKS5zZW5kVG9UYXJnZXQoKTsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCkBAIC0yMTExLDMyICsyMTc5LDMxIEBACiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICB3ZWJWaWV3V2lkdGggPSBNYXRoLnJvdW5kKHZpZXdwb3J0V2lkdGggKiBtQ3VycmVudFZpZXdTY2FsZSk7CiAgICAgICAgIH0KLSAgICAgICAgbVJlc3RvcmVTdGF0ZSA9IG5ldyBSZXN0b3JlU3RhdGUoKTsKLSAgICAgICAgbVJlc3RvcmVTdGF0ZS5tTWluU2NhbGUgPSBtVmlld3BvcnRNaW5pbXVtU2NhbGUgLyAxMDAuMGY7Ci0gICAgICAgIG1SZXN0b3JlU3RhdGUubU1heFNjYWxlID0gbVZpZXdwb3J0TWF4aW11bVNjYWxlIC8gMTAwLjBmOwotICAgICAgICBtUmVzdG9yZVN0YXRlLm1EZWZhdWx0U2NhbGUgPSBhZGp1c3Q7Ci0gICAgICAgIG1SZXN0b3JlU3RhdGUubVNjcm9sbFggPSBtUmVzdG9yZWRYOwotICAgICAgICBtUmVzdG9yZVN0YXRlLm1TY3JvbGxZID0gbVJlc3RvcmVkWTsKLSAgICAgICAgbVJlc3RvcmVTdGF0ZS5tTW9iaWxlU2l0ZSA9ICgwID09IG1WaWV3cG9ydFdpZHRoKTsKKyAgICAgICAgbUluaXRpYWxWaWV3U3RhdGUgPSBuZXcgVmlld1N0YXRlKCk7CisgICAgICAgIG1Jbml0aWFsVmlld1N0YXRlLm1NaW5TY2FsZSA9IG1WaWV3cG9ydE1pbmltdW1TY2FsZSAvIDEwMC4wZjsKKyAgICAgICAgbUluaXRpYWxWaWV3U3RhdGUubU1heFNjYWxlID0gbVZpZXdwb3J0TWF4aW11bVNjYWxlIC8gMTAwLjBmOworICAgICAgICBtSW5pdGlhbFZpZXdTdGF0ZS5tRGVmYXVsdFNjYWxlID0gYWRqdXN0OworICAgICAgICBtSW5pdGlhbFZpZXdTdGF0ZS5tU2Nyb2xsWCA9IG1SZXN0b3JlZFg7CisgICAgICAgIG1Jbml0aWFsVmlld1N0YXRlLm1TY3JvbGxZID0gbVJlc3RvcmVkWTsKKyAgICAgICAgbUluaXRpYWxWaWV3U3RhdGUubU1vYmlsZVNpdGUgPSAoMCA9PSBtVmlld3BvcnRXaWR0aCk7CiAgICAgICAgIGlmIChtUmVzdG9yZWRTY2FsZSA+IDApIHsKLSAgICAgICAgICAgIG1SZXN0b3JlU3RhdGUubVZpZXdTY2FsZSA9IG1SZXN0b3JlZFNjYWxlIC8gMTAwLjBmOwotICAgICAgICAgICAgaWYgKG1SZXN0b3JlZFNjcmVlbldpZHRoU2NhbGUgPiAwKSB7Ci0gICAgICAgICAgICAgICAgbVJlc3RvcmVTdGF0ZS5tVGV4dFdyYXBTY2FsZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBtUmVzdG9yZWRTY3JlZW5XaWR0aFNjYWxlIC8gMTAwLjBmOworICAgICAgICAgICAgbUluaXRpYWxWaWV3U3RhdGUubVZpZXdTY2FsZSA9IG1SZXN0b3JlZFNjYWxlIC8gMTAwLjBmOworICAgICAgICAgICAgaWYgKG1SZXN0b3JlZFRleHRXcmFwU2NhbGUgPiAwKSB7CisgICAgICAgICAgICAgICAgbUluaXRpYWxWaWV3U3RhdGUubVRleHRXcmFwU2NhbGUgPSBtUmVzdG9yZWRUZXh0V3JhcFNjYWxlIC8gMTAwLjBmOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtUmVzdG9yZVN0YXRlLm1UZXh0V3JhcFNjYWxlID0gbVJlc3RvcmVTdGF0ZS5tVmlld1NjYWxlOworICAgICAgICAgICAgICAgIG1Jbml0aWFsVmlld1N0YXRlLm1UZXh0V3JhcFNjYWxlID0gbUluaXRpYWxWaWV3U3RhdGUubVZpZXdTY2FsZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGlmIChtVmlld3BvcnRJbml0aWFsU2NhbGUgPiAwKSB7Ci0gICAgICAgICAgICAgICAgbVJlc3RvcmVTdGF0ZS5tVmlld1NjYWxlID0gbVJlc3RvcmVTdGF0ZS5tVGV4dFdyYXBTY2FsZSA9CisgICAgICAgICAgICAgICAgbUluaXRpYWxWaWV3U3RhdGUubVZpZXdTY2FsZSA9IG1Jbml0aWFsVmlld1N0YXRlLm1UZXh0V3JhcFNjYWxlID0KICAgICAgICAgICAgICAgICAgICAgICAgIG1WaWV3cG9ydEluaXRpYWxTY2FsZSAvIDEwMC4wZjsKICAgICAgICAgICAgIH0gZWxzZSBpZiAobVZpZXdwb3J0V2lkdGggPiAwICYmIG1WaWV3cG9ydFdpZHRoIDwgd2ViVmlld1dpZHRoKSB7Ci0gICAgICAgICAgICAgICAgbVJlc3RvcmVTdGF0ZS5tVmlld1NjYWxlID0gbVJlc3RvcmVTdGF0ZS5tVGV4dFdyYXBTY2FsZSA9CisgICAgICAgICAgICAgICAgbUluaXRpYWxWaWV3U3RhdGUubVZpZXdTY2FsZSA9IG1Jbml0aWFsVmlld1N0YXRlLm1UZXh0V3JhcFNjYWxlID0KICAgICAgICAgICAgICAgICAgICAgICAgIChmbG9hdCkgd2ViVmlld1dpZHRoIC8gbVZpZXdwb3J0V2lkdGg7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1SZXN0b3JlU3RhdGUubVRleHRXcmFwU2NhbGUgPSBhZGp1c3Q7CisgICAgICAgICAgICAgICAgbUluaXRpYWxWaWV3U3RhdGUubVRleHRXcmFwU2NhbGUgPSBhZGp1c3Q7CiAgICAgICAgICAgICAgICAgLy8gMCB3aWxsIHRyaWdnZXIgV2ViVmlldyB0byB0dXJuIG9uIHpvb20gb3ZlcnZpZXcgbW9kZQotICAgICAgICAgICAgICAgIG1SZXN0b3JlU3RhdGUubVZpZXdTY2FsZSA9IDA7CisgICAgICAgICAgICAgICAgbUluaXRpYWxWaWV3U3RhdGUubVZpZXdTY2FsZSA9IDA7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApAQCAtMjE3NywxNSArMjI0NCwxNSBAQAogICAgICAgICAgICAgICAgIC8vIG1WaWV3U2NhbGUgYXMgMCBtZWFucyBpdCBpcyBpbiB6b29tIG92ZXJ2aWV3IG1vZGUuIFNvIHdlIGRvbid0CiAgICAgICAgICAgICAgICAgLy8ga25vdyB0aGUgZXhhY3Qgc2NhbGUuIElmIG1SZXN0b3JlZFNjYWxlIGlzIG5vbi16ZXJvLCB1c2UgaXQ7CiAgICAgICAgICAgICAgICAgLy8gb3RoZXJ3aXNlIGp1c3QgdXNlIG1UZXh0V3JhcFNjYWxlIGFzIHRoZSBpbml0aWFsIHNjYWxlLgotICAgICAgICAgICAgICAgIGRhdGEubVNjYWxlID0gbVJlc3RvcmVTdGF0ZS5tVmlld1NjYWxlID09IDAKKyAgICAgICAgICAgICAgICBkYXRhLm1TY2FsZSA9IG1Jbml0aWFsVmlld1N0YXRlLm1WaWV3U2NhbGUgPT0gMAogICAgICAgICAgICAgICAgICAgICAgICAgPyAobVJlc3RvcmVkU2NhbGUgPiAwID8gbVJlc3RvcmVkU2NhbGUgLyAxMDAuMGYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBtUmVzdG9yZVN0YXRlLm1UZXh0V3JhcFNjYWxlKQotICAgICAgICAgICAgICAgICAgICAgICAgOiBtUmVzdG9yZVN0YXRlLm1WaWV3U2NhbGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbUluaXRpYWxWaWV3U3RhdGUubVRleHRXcmFwU2NhbGUpCisgICAgICAgICAgICAgICAgICAgICAgICA6IG1Jbml0aWFsVmlld1N0YXRlLm1WaWV3U2NhbGU7CiAgICAgICAgICAgICAgICAgaWYgKERlYnVnRmxhZ3MuV0VCX1ZJRVdfQ09SRSkgewogICAgICAgICAgICAgICAgICAgICBMb2cudihMT0dUQUcsICJzZXR1cFZpZXdwb3J0IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgbVJlc3RvcmVkU2NhbGU9IiArIG1SZXN0b3JlZFNjYWxlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBtVmlld1NjYWxlPSIgKyBtUmVzdG9yZVN0YXRlLm1WaWV3U2NhbGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIG1UZXh0V3JhcFNjYWxlPSIgKyBtUmVzdG9yZVN0YXRlLm1UZXh0V3JhcFNjYWxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBtVmlld1NjYWxlPSIgKyBtSW5pdGlhbFZpZXdTdGF0ZS5tVmlld1NjYWxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBtVGV4dFdyYXBTY2FsZT0iICsgbUluaXRpYWxWaWV3U3RhdGUubVRleHRXcmFwU2NhbGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgZGF0YS5tV2lkdGggPSBNYXRoLnJvdW5kKHdlYlZpZXdXaWR0aCAvIGRhdGEubVNjYWxlKTsKQEAgLTIxOTgsNyArMjI2NSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBNYXRoLnJvdW5kKG1XZWJWaWV3LmdldFZpZXdIZWlnaHQoKSAvIGRhdGEubVNjYWxlKQogICAgICAgICAgICAgICAgICAgICAgICAgOiBtQ3VycmVudFZpZXdIZWlnaHQgKiBkYXRhLm1XaWR0aCAvIHZpZXdwb3J0V2lkdGg7CiAgICAgICAgICAgICAgICAgZGF0YS5tVGV4dFdyYXBXaWR0aCA9IE1hdGgucm91bmQod2ViVmlld1dpZHRoCi0gICAgICAgICAgICAgICAgICAgICAgICAvIG1SZXN0b3JlU3RhdGUubVRleHRXcmFwU2NhbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgLyBtSW5pdGlhbFZpZXdTdGF0ZS5tVGV4dFdyYXBTY2FsZSk7CiAgICAgICAgICAgICAgICAgZGF0YS5tSWdub3JlSGVpZ2h0ID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgZGF0YS5tQW5jaG9yWCA9IGRhdGEubUFuY2hvclkgPSAwOwogICAgICAgICAgICAgICAgIC8vIHNlbmQgVklFV19TSVpFX0NIQU5HRUQgdG8gdGhlIGZyb250IG9mIHRoZSBxdWV1ZSBzbyB0aGF0IHdlCkBAIC0yMjExLDIwICsyMjc4LDEyIEBACiAgICAgfQogCiAgICAgLy8gY2FsbGVkIGJ5IEpOSQotICAgIHByaXZhdGUgdm9pZCByZXN0b3JlU2NhbGUoaW50IHNjYWxlKSB7CisgICAgcHJpdmF0ZSB2b2lkIHJlc3RvcmVTY2FsZShpbnQgc2NhbGUsIGludCB0ZXh0V3JhcFNjYWxlKSB7CiAgICAgICAgIGlmIChtQnJvd3NlckZyYW1lLmZpcnN0TGF5b3V0RG9uZSgpID09IGZhbHNlKSB7CiAgICAgICAgICAgICBtUmVzdG9yZWRTY2FsZSA9IHNjYWxlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gY2FsbGVkIGJ5IEpOSQotICAgIHByaXZhdGUgdm9pZCByZXN0b3JlU2NyZWVuV2lkdGhTY2FsZShpbnQgc2NhbGUpIHsKLSAgICAgICAgaWYgKCFtU2V0dGluZ3MuZ2V0VXNlV2lkZVZpZXdQb3J0KCkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtQnJvd3NlckZyYW1lLmZpcnN0TGF5b3V0RG9uZSgpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICBtUmVzdG9yZWRTY3JlZW5XaWR0aFNjYWxlID0gc2NhbGU7CisgICAgICAgICAgICBpZiAobVNldHRpbmdzLmdldFVzZVdpZGVWaWV3UG9ydCgpKSB7CisgICAgICAgICAgICAgICAgbVJlc3RvcmVkVGV4dFdyYXBTY2FsZSA9IHRleHRXcmFwU2NhbGU7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTI0NjksNCArMjUyOCw2IEBACiAgICAgcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiBuYXRpdmVWYWxpZE5vZGVBbmRCb3VuZHMoaW50IGZyYW1lLCBpbnQgbm9kZSwKICAgICAgICAgICAgIFJlY3QgYm91bmRzKTsKIAorICAgIHByaXZhdGUgbmF0aXZlIEFycmF5TGlzdDxSZWN0PiBuYXRpdmVHZXRUb3VjaEhpZ2hsaWdodFJlY3RzKGludCB4LCBpbnQgeSwKKyAgICAgICAgICAgIGludCBzbG9wKTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9XZWJWaWV3RGF0YWJhc2UuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9XZWJWaWV3RGF0YWJhc2UuamF2YQppbmRleCBiMTg0MTlkLi5kNzVkNDIxIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvV2ViVmlld0RhdGFiYXNlLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1dlYlZpZXdEYXRhYmFzZS5qYXZhCkBAIC0xNzMsMTEyICsxNzMsMTQwIEBACiAKICAgICBwcml2YXRlIHN0YXRpYyBpbnQgbUNhY2hlVHJhbnNhY3Rpb25SZWZjb3VudDsKIAotICAgIHByaXZhdGUgV2ViVmlld0RhdGFiYXNlKCkgeworICAgIC8vIEluaXRpYWxseSB0cnVlIHVudGlsIHRoZSBiYWNrZ3JvdW5kIHRocmVhZCBjb21wbGV0ZXMuCisgICAgcHJpdmF0ZSBib29sZWFuIG1Jbml0aWFsaXplZCA9IGZhbHNlOworCisgICAgcHJpdmF0ZSBXZWJWaWV3RGF0YWJhc2UoZmluYWwgQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIG5ldyBUaHJlYWQoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICBpbml0KGNvbnRleHQpOworICAgICAgICAgICAgfQorICAgICAgICB9LnN0YXJ0KCk7CisKICAgICAgICAgLy8gU2luZ2xldG9uIG9ubHksIHVzZSBnZXRJbnN0YW5jZSgpCiAgICAgfQogCiAgICAgcHVibGljIHN0YXRpYyBzeW5jaHJvbml6ZWQgV2ViVmlld0RhdGFiYXNlIGdldEluc3RhbmNlKENvbnRleHQgY29udGV4dCkgewogICAgICAgICBpZiAobUluc3RhbmNlID09IG51bGwpIHsKLSAgICAgICAgICAgIG1JbnN0YW5jZSA9IG5ldyBXZWJWaWV3RGF0YWJhc2UoKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbURhdGFiYXNlID0gY29udGV4dAotICAgICAgICAgICAgICAgICAgICAgICAgLm9wZW5PckNyZWF0ZURhdGFiYXNlKERBVEFCQVNFX0ZJTEUsIDAsIG51bGwpOwotICAgICAgICAgICAgfSBjYXRjaCAoU1FMaXRlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyB0cnkgYWdhaW4gYnkgZGVsZXRpbmcgdGhlIG9sZCBkYiBhbmQgY3JlYXRlIGEgbmV3IG9uZQotICAgICAgICAgICAgICAgIGlmIChjb250ZXh0LmRlbGV0ZURhdGFiYXNlKERBVEFCQVNFX0ZJTEUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1EYXRhYmFzZSA9IGNvbnRleHQub3Blbk9yQ3JlYXRlRGF0YWJhc2UoREFUQUJBU0VfRklMRSwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBtSW5zdGFuY2UgPSBuZXcgV2ViVmlld0RhdGFiYXNlKGNvbnRleHQpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtSW5zdGFuY2U7CisgICAgfQogCi0gICAgICAgICAgICAvLyBtRGF0YWJhc2Ugc2hvdWxkIG5vdCBiZSBudWxsLCAKLSAgICAgICAgICAgIC8vIHRoZSBvbmx5IGNhc2UgaXMgUmVxdWVzdEFQSSB0ZXN0IGhhcyBwcm9ibGVtIHRvIGNyZWF0ZSBkYiAKLSAgICAgICAgICAgIGlmIChtRGF0YWJhc2UgIT0gbnVsbCAmJiBtRGF0YWJhc2UuZ2V0VmVyc2lvbigpICE9IERBVEFCQVNFX1ZFUlNJT04pIHsKLSAgICAgICAgICAgICAgICBtRGF0YWJhc2UuYmVnaW5UcmFuc2FjdGlvbigpOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIHVwZ3JhZGVEYXRhYmFzZSgpOwotICAgICAgICAgICAgICAgICAgICBtRGF0YWJhc2Uuc2V0VHJhbnNhY3Rpb25TdWNjZXNzZnVsKCk7Ci0gICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICAgICAgbURhdGFiYXNlLmVuZFRyYW5zYWN0aW9uKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQorICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgaW5pdChDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgaWYgKG1Jbml0aWFsaXplZCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CiAKLSAgICAgICAgICAgIGlmIChtRGF0YWJhc2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIHVzZSBwZXIgdGFibGUgTXV0ZXggbG9jaywgdHVybiBvZmYgZGF0YWJhc2UgbG9jaywgdGhpcwotICAgICAgICAgICAgICAgIC8vIGltcHJvdmVzIHBlcmZvcm1hbmNlIGFzIGRhdGFiYXNlJ3MgUmVlbnRyYW50TG9jayBpcyBleHBhbnNpdmUKLSAgICAgICAgICAgICAgICBtRGF0YWJhc2Uuc2V0TG9ja2luZ0VuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIG1DYWNoZURhdGFiYXNlID0gY29udGV4dC5vcGVuT3JDcmVhdGVEYXRhYmFzZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIENBQ0hFX0RBVEFCQVNFX0ZJTEUsIDAsIG51bGwpOwotICAgICAgICAgICAgfSBjYXRjaCAoU1FMaXRlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyB0cnkgYWdhaW4gYnkgZGVsZXRpbmcgdGhlIG9sZCBkYiBhbmQgY3JlYXRlIGEgbmV3IG9uZQotICAgICAgICAgICAgICAgIGlmIChjb250ZXh0LmRlbGV0ZURhdGFiYXNlKENBQ0hFX0RBVEFCQVNFX0ZJTEUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1DYWNoZURhdGFiYXNlID0gY29udGV4dC5vcGVuT3JDcmVhdGVEYXRhYmFzZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQUNIRV9EQVRBQkFTRV9GSUxFLCAwLCBudWxsKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIG1DYWNoZURhdGFiYXNlIHNob3VsZCBub3QgYmUgbnVsbCwgCi0gICAgICAgICAgICAvLyB0aGUgb25seSBjYXNlIGlzIFJlcXVlc3RBUEkgdGVzdCBoYXMgcHJvYmxlbSB0byBjcmVhdGUgZGIgCi0gICAgICAgICAgICBpZiAobUNhY2hlRGF0YWJhc2UgIT0gbnVsbAotICAgICAgICAgICAgICAgICAgICAmJiBtQ2FjaGVEYXRhYmFzZS5nZXRWZXJzaW9uKCkgIT0gQ0FDSEVfREFUQUJBU0VfVkVSU0lPTikgewotICAgICAgICAgICAgICAgIG1DYWNoZURhdGFiYXNlLmJlZ2luVHJhbnNhY3Rpb24oKTsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICB1cGdyYWRlQ2FjaGVEYXRhYmFzZSgpOwotICAgICAgICAgICAgICAgICAgICBib290c3RyYXBDYWNoZURhdGFiYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1DYWNoZURhdGFiYXNlLnNldFRyYW5zYWN0aW9uU3VjY2Vzc2Z1bCgpOwotICAgICAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgICAgIG1DYWNoZURhdGFiYXNlLmVuZFRyYW5zYWN0aW9uKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIEVyYXNlIHRoZSBmaWxlcyBmcm9tIHRoZSBmaWxlIHN5c3RlbSBpbiB0aGUgCi0gICAgICAgICAgICAgICAgLy8gY2FzZSB0aGF0IHRoZSBkYXRhYmFzZSB3YXMgdXBkYXRlZCBhbmQgdGhlIAotICAgICAgICAgICAgICAgIC8vIHRoZXJlIHdlcmUgZXhpc3RpbmcgY2FjaGUgY29udGVudAotICAgICAgICAgICAgICAgIENhY2hlTWFuYWdlci5yZW1vdmVBbGxDYWNoZUZpbGVzKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtQ2FjaGVEYXRhYmFzZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gdXNlIHJlYWRfdW5jb21taXR0ZWQgdG8gc3BlZWQgdXAgUkVBRAotICAgICAgICAgICAgICAgIG1DYWNoZURhdGFiYXNlLmV4ZWNTUUwoIlBSQUdNQSByZWFkX3VuY29tbWl0dGVkID0gdHJ1ZTsiKTsKLSAgICAgICAgICAgICAgICAvLyBhcyBvbmx5IFJFQUQgY2FuIGJlIGNhbGxlZCBpbiB0aGUgbm9uLVdlYlZpZXdXb3JrZXJUaHJlYWQsCi0gICAgICAgICAgICAgICAgLy8gYW5kIHJlYWRfdW5jb21taXR0ZWQgaXMgdXNlZCwgd2UgY2FuIHR1cm4gb2ZmIGRhdGFiYXNlIGxvY2sKLSAgICAgICAgICAgICAgICAvLyB0byB1c2UgdHJhbnNhY3Rpb24uCi0gICAgICAgICAgICAgICAgbUNhY2hlRGF0YWJhc2Uuc2V0TG9ja2luZ0VuYWJsZWQoZmFsc2UpOwotCi0gICAgICAgICAgICAgICAgLy8gdXNlIEluc2VydEhlbHBlciBmb3IgZmFzdGVyIGluc2VydGlvbgotICAgICAgICAgICAgICAgIG1DYWNoZUluc2VydGVyID0gbmV3IERhdGFiYXNlVXRpbHMuSW5zZXJ0SGVscGVyKG1DYWNoZURhdGFiYXNlLAotICAgICAgICAgICAgICAgICAgICAgICAgImNhY2hlIik7Ci0gICAgICAgICAgICAgICAgbUNhY2hlVXJsQ29sSW5kZXggPSBtQ2FjaGVJbnNlcnRlcgotICAgICAgICAgICAgICAgICAgICAgICAgLmdldENvbHVtbkluZGV4KENBQ0hFX1VSTF9DT0wpOwotICAgICAgICAgICAgICAgIG1DYWNoZUZpbGVQYXRoQ29sSW5kZXggPSBtQ2FjaGVJbnNlcnRlcgotICAgICAgICAgICAgICAgICAgICAgICAgLmdldENvbHVtbkluZGV4KENBQ0hFX0ZJTEVfUEFUSF9DT0wpOwotICAgICAgICAgICAgICAgIG1DYWNoZUxhc3RNb2RpZnlDb2xJbmRleCA9IG1DYWNoZUluc2VydGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0Q29sdW1uSW5kZXgoQ0FDSEVfTEFTVF9NT0RJRllfQ09MKTsKLSAgICAgICAgICAgICAgICBtQ2FjaGVFVGFnQ29sSW5kZXggPSBtQ2FjaGVJbnNlcnRlcgotICAgICAgICAgICAgICAgICAgICAgICAgLmdldENvbHVtbkluZGV4KENBQ0hFX0VUQUdfQ09MKTsKLSAgICAgICAgICAgICAgICBtQ2FjaGVFeHBpcmVzQ29sSW5kZXggPSBtQ2FjaGVJbnNlcnRlcgotICAgICAgICAgICAgICAgICAgICAgICAgLmdldENvbHVtbkluZGV4KENBQ0hFX0VYUElSRVNfQ09MKTsKLSAgICAgICAgICAgICAgICBtQ2FjaGVFeHBpcmVzU3RyaW5nQ29sSW5kZXggPSBtQ2FjaGVJbnNlcnRlcgotICAgICAgICAgICAgICAgICAgICAgICAgLmdldENvbHVtbkluZGV4KENBQ0hFX0VYUElSRVNfU1RSSU5HX0NPTCk7Ci0gICAgICAgICAgICAgICAgbUNhY2hlTWltZVR5cGVDb2xJbmRleCA9IG1DYWNoZUluc2VydGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0Q29sdW1uSW5kZXgoQ0FDSEVfTUlNRVRZUEVfQ09MKTsKLSAgICAgICAgICAgICAgICBtQ2FjaGVFbmNvZGluZ0NvbEluZGV4ID0gbUNhY2hlSW5zZXJ0ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRDb2x1bW5JbmRleChDQUNIRV9FTkNPRElOR19DT0wpOwotICAgICAgICAgICAgICAgIG1DYWNoZUh0dHBTdGF0dXNDb2xJbmRleCA9IG1DYWNoZUluc2VydGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0Q29sdW1uSW5kZXgoQ0FDSEVfSFRUUF9TVEFUVVNfQ09MKTsKLSAgICAgICAgICAgICAgICBtQ2FjaGVMb2NhdGlvbkNvbEluZGV4ID0gbUNhY2hlSW5zZXJ0ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRDb2x1bW5JbmRleChDQUNIRV9MT0NBVElPTl9DT0wpOwotICAgICAgICAgICAgICAgIG1DYWNoZUNvbnRlbnRMZW5ndGhDb2xJbmRleCA9IG1DYWNoZUluc2VydGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0Q29sdW1uSW5kZXgoQ0FDSEVfQ09OVEVOVExFTkdUSF9DT0wpOwotICAgICAgICAgICAgICAgIG1DYWNoZUNvbnRlbnREaXNwb3NpdGlvbkNvbEluZGV4ID0gbUNhY2hlSW5zZXJ0ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRDb2x1bW5JbmRleChDQUNIRV9DT05URU5URElTUE9TSVRJT05fQ09MKTsKLSAgICAgICAgICAgICAgICBtQ2FjaGVDcm9zc0RvbWFpbkNvbEluZGV4ID0gbUNhY2hlSW5zZXJ0ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRDb2x1bW5JbmRleChDQUNIRV9DUk9TU0RPTUFJTl9DT0wpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgbURhdGFiYXNlID0gY29udGV4dC5vcGVuT3JDcmVhdGVEYXRhYmFzZShEQVRBQkFTRV9GSUxFLCAwLCBudWxsKTsKKyAgICAgICAgfSBjYXRjaCAoU1FMaXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIHRyeSBhZ2FpbiBieSBkZWxldGluZyB0aGUgb2xkIGRiIGFuZCBjcmVhdGUgYSBuZXcgb25lCisgICAgICAgICAgICBpZiAoY29udGV4dC5kZWxldGVEYXRhYmFzZShEQVRBQkFTRV9GSUxFKSkgeworICAgICAgICAgICAgICAgIG1EYXRhYmFzZSA9IGNvbnRleHQub3Blbk9yQ3JlYXRlRGF0YWJhc2UoREFUQUJBU0VfRklMRSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG51bGwpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgcmV0dXJuIG1JbnN0YW5jZTsKKyAgICAgICAgLy8gbURhdGFiYXNlIHNob3VsZCBub3QgYmUgbnVsbCwKKyAgICAgICAgLy8gdGhlIG9ubHkgY2FzZSBpcyBSZXF1ZXN0QVBJIHRlc3QgaGFzIHByb2JsZW0gdG8gY3JlYXRlIGRiCisgICAgICAgIGlmIChtRGF0YWJhc2UgPT0gbnVsbCkgeworICAgICAgICAgICAgbUluaXRpYWxpemVkID0gdHJ1ZTsKKyAgICAgICAgICAgIG5vdGlmeSgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1EYXRhYmFzZS5nZXRWZXJzaW9uKCkgIT0gREFUQUJBU0VfVkVSU0lPTikgeworICAgICAgICAgICAgbURhdGFiYXNlLmJlZ2luVHJhbnNhY3Rpb24oKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgdXBncmFkZURhdGFiYXNlKCk7CisgICAgICAgICAgICAgICAgbURhdGFiYXNlLnNldFRyYW5zYWN0aW9uU3VjY2Vzc2Z1bCgpOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBtRGF0YWJhc2UuZW5kVHJhbnNhY3Rpb24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIHVzZSBwZXIgdGFibGUgTXV0ZXggbG9jaywgdHVybiBvZmYgZGF0YWJhc2UgbG9jaywgdGhpcworICAgICAgICAvLyBpbXByb3ZlcyBwZXJmb3JtYW5jZSBhcyBkYXRhYmFzZSdzIFJlZW50cmFudExvY2sgaXMKKyAgICAgICAgLy8gZXhwYW5zaXZlCisgICAgICAgIG1EYXRhYmFzZS5zZXRMb2NraW5nRW5hYmxlZChmYWxzZSk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1DYWNoZURhdGFiYXNlID0gY29udGV4dC5vcGVuT3JDcmVhdGVEYXRhYmFzZSgKKyAgICAgICAgICAgICAgICAgICAgQ0FDSEVfREFUQUJBU0VfRklMRSwgMCwgbnVsbCk7CisgICAgICAgIH0gY2F0Y2ggKFNRTGl0ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyB0cnkgYWdhaW4gYnkgZGVsZXRpbmcgdGhlIG9sZCBkYiBhbmQgY3JlYXRlIGEgbmV3IG9uZQorICAgICAgICAgICAgaWYgKGNvbnRleHQuZGVsZXRlRGF0YWJhc2UoQ0FDSEVfREFUQUJBU0VfRklMRSkpIHsKKyAgICAgICAgICAgICAgICBtQ2FjaGVEYXRhYmFzZSA9IGNvbnRleHQub3Blbk9yQ3JlYXRlRGF0YWJhc2UoCisgICAgICAgICAgICAgICAgICAgICAgICBDQUNIRV9EQVRBQkFTRV9GSUxFLCAwLCBudWxsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIG1DYWNoZURhdGFiYXNlIHNob3VsZCBub3QgYmUgbnVsbCwKKyAgICAgICAgLy8gdGhlIG9ubHkgY2FzZSBpcyBSZXF1ZXN0QVBJIHRlc3QgaGFzIHByb2JsZW0gdG8gY3JlYXRlIGRiCisgICAgICAgIGlmIChtQ2FjaGVEYXRhYmFzZSA9PSBudWxsKSB7CisgICAgICAgICAgICBtSW5pdGlhbGl6ZWQgPSB0cnVlOworICAgICAgICAgICAgbm90aWZ5KCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAobUNhY2hlRGF0YWJhc2UuZ2V0VmVyc2lvbigpICE9IENBQ0hFX0RBVEFCQVNFX1ZFUlNJT04pIHsKKyAgICAgICAgICAgIG1DYWNoZURhdGFiYXNlLmJlZ2luVHJhbnNhY3Rpb24oKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgdXBncmFkZUNhY2hlRGF0YWJhc2UoKTsKKyAgICAgICAgICAgICAgICBib290c3RyYXBDYWNoZURhdGFiYXNlKCk7CisgICAgICAgICAgICAgICAgbUNhY2hlRGF0YWJhc2Uuc2V0VHJhbnNhY3Rpb25TdWNjZXNzZnVsKCk7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIG1DYWNoZURhdGFiYXNlLmVuZFRyYW5zYWN0aW9uKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBFcmFzZSB0aGUgZmlsZXMgZnJvbSB0aGUgZmlsZSBzeXN0ZW0gaW4gdGhlCisgICAgICAgICAgICAvLyBjYXNlIHRoYXQgdGhlIGRhdGFiYXNlIHdhcyB1cGRhdGVkIGFuZCB0aGUKKyAgICAgICAgICAgIC8vIHRoZXJlIHdlcmUgZXhpc3RpbmcgY2FjaGUgY29udGVudAorICAgICAgICAgICAgQ2FjaGVNYW5hZ2VyLnJlbW92ZUFsbENhY2hlRmlsZXMoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHVzZSByZWFkX3VuY29tbWl0dGVkIHRvIHNwZWVkIHVwIFJFQUQKKyAgICAgICAgbUNhY2hlRGF0YWJhc2UuZXhlY1NRTCgiUFJBR01BIHJlYWRfdW5jb21taXR0ZWQgPSB0cnVlOyIpOworICAgICAgICAvLyBhcyBvbmx5IFJFQUQgY2FuIGJlIGNhbGxlZCBpbiB0aGUKKyAgICAgICAgLy8gbm9uLVdlYlZpZXdXb3JrZXJUaHJlYWQsIGFuZCByZWFkX3VuY29tbWl0dGVkIGlzIHVzZWQsCisgICAgICAgIC8vIHdlIGNhbiB0dXJuIG9mZiBkYXRhYmFzZSBsb2NrIHRvIHVzZSB0cmFuc2FjdGlvbi4KKyAgICAgICAgbUNhY2hlRGF0YWJhc2Uuc2V0TG9ja2luZ0VuYWJsZWQoZmFsc2UpOworCisgICAgICAgIC8vIHVzZSBJbnNlcnRIZWxwZXIgZm9yIGZhc3RlciBpbnNlcnRpb24KKyAgICAgICAgbUNhY2hlSW5zZXJ0ZXIgPQorICAgICAgICAgICAgICAgIG5ldyBEYXRhYmFzZVV0aWxzLkluc2VydEhlbHBlcihtQ2FjaGVEYXRhYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjYWNoZSIpOworICAgICAgICBtQ2FjaGVVcmxDb2xJbmRleCA9IG1DYWNoZUluc2VydGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldENvbHVtbkluZGV4KENBQ0hFX1VSTF9DT0wpOworICAgICAgICBtQ2FjaGVGaWxlUGF0aENvbEluZGV4ID0gbUNhY2hlSW5zZXJ0ZXIKKyAgICAgICAgICAgICAgICAuZ2V0Q29sdW1uSW5kZXgoQ0FDSEVfRklMRV9QQVRIX0NPTCk7CisgICAgICAgIG1DYWNoZUxhc3RNb2RpZnlDb2xJbmRleCA9IG1DYWNoZUluc2VydGVyCisgICAgICAgICAgICAgICAgLmdldENvbHVtbkluZGV4KENBQ0hFX0xBU1RfTU9ESUZZX0NPTCk7CisgICAgICAgIG1DYWNoZUVUYWdDb2xJbmRleCA9IG1DYWNoZUluc2VydGVyCisgICAgICAgICAgICAgICAgLmdldENvbHVtbkluZGV4KENBQ0hFX0VUQUdfQ09MKTsKKyAgICAgICAgbUNhY2hlRXhwaXJlc0NvbEluZGV4ID0gbUNhY2hlSW5zZXJ0ZXIKKyAgICAgICAgICAgICAgICAuZ2V0Q29sdW1uSW5kZXgoQ0FDSEVfRVhQSVJFU19DT0wpOworICAgICAgICBtQ2FjaGVFeHBpcmVzU3RyaW5nQ29sSW5kZXggPSBtQ2FjaGVJbnNlcnRlcgorICAgICAgICAgICAgICAgIC5nZXRDb2x1bW5JbmRleChDQUNIRV9FWFBJUkVTX1NUUklOR19DT0wpOworICAgICAgICBtQ2FjaGVNaW1lVHlwZUNvbEluZGV4ID0gbUNhY2hlSW5zZXJ0ZXIKKyAgICAgICAgICAgICAgICAuZ2V0Q29sdW1uSW5kZXgoQ0FDSEVfTUlNRVRZUEVfQ09MKTsKKyAgICAgICAgbUNhY2hlRW5jb2RpbmdDb2xJbmRleCA9IG1DYWNoZUluc2VydGVyCisgICAgICAgICAgICAgICAgLmdldENvbHVtbkluZGV4KENBQ0hFX0VOQ09ESU5HX0NPTCk7CisgICAgICAgIG1DYWNoZUh0dHBTdGF0dXNDb2xJbmRleCA9IG1DYWNoZUluc2VydGVyCisgICAgICAgICAgICAgICAgLmdldENvbHVtbkluZGV4KENBQ0hFX0hUVFBfU1RBVFVTX0NPTCk7CisgICAgICAgIG1DYWNoZUxvY2F0aW9uQ29sSW5kZXggPSBtQ2FjaGVJbnNlcnRlcgorICAgICAgICAgICAgICAgIC5nZXRDb2x1bW5JbmRleChDQUNIRV9MT0NBVElPTl9DT0wpOworICAgICAgICBtQ2FjaGVDb250ZW50TGVuZ3RoQ29sSW5kZXggPSBtQ2FjaGVJbnNlcnRlcgorICAgICAgICAgICAgICAgIC5nZXRDb2x1bW5JbmRleChDQUNIRV9DT05URU5UTEVOR1RIX0NPTCk7CisgICAgICAgIG1DYWNoZUNvbnRlbnREaXNwb3NpdGlvbkNvbEluZGV4ID0gbUNhY2hlSW5zZXJ0ZXIKKyAgICAgICAgICAgICAgICAuZ2V0Q29sdW1uSW5kZXgoQ0FDSEVfQ09OVEVOVERJU1BPU0lUSU9OX0NPTCk7CisgICAgICAgIG1DYWNoZUNyb3NzRG9tYWluQ29sSW5kZXggPSBtQ2FjaGVJbnNlcnRlcgorICAgICAgICAgICAgICAgIC5nZXRDb2x1bW5JbmRleChDQUNIRV9DUk9TU0RPTUFJTl9DT0wpOworCisgICAgICAgIC8vIFRocmVhZCBkb25lLCBub3RpZnkuCisgICAgICAgIG1Jbml0aWFsaXplZCA9IHRydWU7CisgICAgICAgIG5vdGlmeSgpOwogICAgIH0KIAogICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdXBncmFkZURhdGFiYXNlKCkgewpAQCAtMzkxLDggKzQxOSwyNSBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgLy8gV2FpdCBmb3IgdGhlIGJhY2tncm91bmQgaW5pdGlhbGl6YXRpb24gdGhyZWFkIHRvIGNvbXBsZXRlIGFuZCBjaGVjayB0aGUKKyAgICAvLyBkYXRhYmFzZSBjcmVhdGlvbiBzdGF0dXMuCisgICAgcHJpdmF0ZSBib29sZWFuIGNoZWNrSW5pdGlhbGl6ZWQoKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgd2hpbGUgKCFtSW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICB3YWl0KCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBMb2cuZShMT0dUQUcsICJDYXVnaHQgZXhjZXB0aW9uIHdoaWxlIGNoZWNraW5nICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbml0aWFsaXphdGlvbiIpOworICAgICAgICAgICAgICAgICAgICBMb2cuZShMT0dUQUcsIExvZy5nZXRTdGFja1RyYWNlU3RyaW5nKGUpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1EYXRhYmFzZSAhPSBudWxsOworICAgIH0KKwogICAgIHByaXZhdGUgYm9vbGVhbiBoYXNFbnRyaWVzKGludCB0YWJsZUlkKSB7Ci0gICAgICAgIGlmIChtRGF0YWJhc2UgPT0gbnVsbCkgeworICAgICAgICBpZiAoIWNoZWNrSW5pdGlhbGl6ZWQoKSkgewogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAKQEAgLTQyMiw3ICs0NjcsNyBAQAogICAgICAqLwogICAgIEFycmF5TGlzdDxDb29raWU+IGdldENvb2tpZXNGb3JEb21haW4oU3RyaW5nIGRvbWFpbikgewogICAgICAgICBBcnJheUxpc3Q8Q29va2llPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxDb29raWU+KCk7Ci0gICAgICAgIGlmIChkb21haW4gPT0gbnVsbCB8fCBtRGF0YWJhc2UgPT0gbnVsbCkgeworICAgICAgICBpZiAoZG9tYWluID09IG51bGwgfHwgIWNoZWNrSW5pdGlhbGl6ZWQoKSkgewogICAgICAgICAgICAgcmV0dXJuIGxpc3Q7CiAgICAgICAgIH0KIApAQCAtNDgxLDcgKzUyNiw3IEBACiAgICAgICogICAgICAgICAgICBkZWxldGVkLgogICAgICAqLwogICAgIHZvaWQgZGVsZXRlQ29va2llcyhTdHJpbmcgZG9tYWluLCBTdHJpbmcgcGF0aCwgU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgaWYgKGRvbWFpbiA9PSBudWxsIHx8IG1EYXRhYmFzZSA9PSBudWxsKSB7CisgICAgICAgIGlmIChkb21haW4gPT0gbnVsbCB8fCAhY2hlY2tJbml0aWFsaXplZCgpKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIApAQCAtNTAxLDcgKzU0Niw3IEBACiAgICAgICovCiAgICAgdm9pZCBhZGRDb29raWUoQ29va2llIGNvb2tpZSkgewogICAgICAgICBpZiAoY29va2llLmRvbWFpbiA9PSBudWxsIHx8IGNvb2tpZS5wYXRoID09IG51bGwgfHwgY29va2llLm5hbWUgPT0gbnVsbAotICAgICAgICAgICAgICAgIHx8IG1EYXRhYmFzZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgfHwgIWNoZWNrSW5pdGlhbGl6ZWQoKSkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKQEAgLTUzNCw3ICs1NzksNyBAQAogICAgICAqIENsZWFyIGNvb2tpZSBkYXRhYmFzZQogICAgICAqLwogICAgIHZvaWQgY2xlYXJDb29raWVzKCkgewotICAgICAgICBpZiAobURhdGFiYXNlID09IG51bGwpIHsKKyAgICAgICAgaWYgKCFjaGVja0luaXRpYWxpemVkKCkpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCkBAIC01NDcsNyArNTkyLDcgQEAKICAgICAgKiBDbGVhciBzZXNzaW9uIGNvb2tpZXMsIHdoaWNoIG1lYW5zIGNvb2tpZSBkb2Vzbid0IGhhdmUgRVhQSVJFUy4KICAgICAgKi8KICAgICB2b2lkIGNsZWFyU2Vzc2lvbkNvb2tpZXMoKSB7Ci0gICAgICAgIGlmIChtRGF0YWJhc2UgPT0gbnVsbCkgeworICAgICAgICBpZiAoIWNoZWNrSW5pdGlhbGl6ZWQoKSkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKQEAgLTU2NCw3ICs2MDksNyBAQAogICAgICAqIEBwYXJhbSBub3cgVGltZSBmb3Igbm93CiAgICAgICovCiAgICAgdm9pZCBjbGVhckV4cGlyZWRDb29raWVzKGxvbmcgbm93KSB7Ci0gICAgICAgIGlmIChtRGF0YWJhc2UgPT0gbnVsbCkgeworICAgICAgICBpZiAoIWNoZWNrSW5pdGlhbGl6ZWQoKSkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKQEAgLTYyMCw3ICs2NjUsNyBAQAogICAgICAqIEByZXR1cm4gQ2FjaGVSZXN1bHQgVGhlIENhY2hlTWFuYWdlci5DYWNoZVJlc3VsdAogICAgICAqLwogICAgIENhY2hlUmVzdWx0IGdldENhY2hlKFN0cmluZyB1cmwpIHsKLSAgICAgICAgaWYgKHVybCA9PSBudWxsIHx8IG1DYWNoZURhdGFiYXNlID09IG51bGwpIHsKKyAgICAgICAgaWYgKHVybCA9PSBudWxsIHx8ICFjaGVja0luaXRpYWxpemVkKCkpIHsKICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICB9CiAKQEAgLTY2MCw3ICs3MDUsNyBAQAogICAgICAqIEBwYXJhbSB1cmwgVGhlIHVybAogICAgICAqLwogICAgIHZvaWQgcmVtb3ZlQ2FjaGUoU3RyaW5nIHVybCkgewotICAgICAgICBpZiAodXJsID09IG51bGwgfHwgbUNhY2hlRGF0YWJhc2UgPT0gbnVsbCkgeworICAgICAgICBpZiAodXJsID09IG51bGwgfHwgIWNoZWNrSW5pdGlhbGl6ZWQoKSkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKQEAgLTY3NCw3ICs3MTksNyBAQAogICAgICAqIEBwYXJhbSBjIFRoZSBDYWNoZU1hbmFnZXIuQ2FjaGVSZXN1bHQKICAgICAgKi8KICAgICB2b2lkIGFkZENhY2hlKFN0cmluZyB1cmwsIENhY2hlUmVzdWx0IGMpIHsKLSAgICAgICAgaWYgKHVybCA9PSBudWxsIHx8IG1DYWNoZURhdGFiYXNlID09IG51bGwpIHsKKyAgICAgICAgaWYgKHVybCA9PSBudWxsIHx8ICFjaGVja0luaXRpYWxpemVkKCkpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCkBAIC03MDAsNyArNzQ1LDcgQEAKICAgICAgKiBDbGVhciBjYWNoZSBkYXRhYmFzZQogICAgICAqLwogICAgIHZvaWQgY2xlYXJDYWNoZSgpIHsKLSAgICAgICAgaWYgKG1DYWNoZURhdGFiYXNlID09IG51bGwpIHsKKyAgICAgICAgaWYgKCFjaGVja0luaXRpYWxpemVkKCkpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCkBAIC03MDgsNyArNzUzLDcgQEAKICAgICB9CiAKICAgICBib29sZWFuIGhhc0NhY2hlKCkgewotICAgICAgICBpZiAobUNhY2hlRGF0YWJhc2UgPT0gbnVsbCkgeworICAgICAgICBpZiAoIWNoZWNrSW5pdGlhbGl6ZWQoKSkgewogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAKQEAgLTgzMSw3ICs4NzYsNyBAQAogICAgICAqLwogICAgIHZvaWQgc2V0VXNlcm5hbWVQYXNzd29yZChTdHJpbmcgc2NoZW1lUGx1c0hvc3QsIFN0cmluZyB1c2VybmFtZSwKICAgICAgICAgICAgICAgICBTdHJpbmcgcGFzc3dvcmQpIHsKLSAgICAgICAgaWYgKHNjaGVtZVBsdXNIb3N0ID09IG51bGwgfHwgbURhdGFiYXNlID09IG51bGwpIHsKKyAgICAgICAgaWYgKHNjaGVtZVBsdXNIb3N0ID09IG51bGwgfHwgIWNoZWNrSW5pdGlhbGl6ZWQoKSkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKQEAgLTg1Myw3ICs4OTgsNyBAQAogICAgICAqICAgICAgICAgU3RyaW5nWzFdIGlzIHBhc3N3b3JkLiBSZXR1cm4gbnVsbCBpZiBpdCBjYW4ndCBmaW5kIGFueXRoaW5nLgogICAgICAqLwogICAgIFN0cmluZ1tdIGdldFVzZXJuYW1lUGFzc3dvcmQoU3RyaW5nIHNjaGVtZVBsdXNIb3N0KSB7Ci0gICAgICAgIGlmIChzY2hlbWVQbHVzSG9zdCA9PSBudWxsIHx8IG1EYXRhYmFzZSA9PSBudWxsKSB7CisgICAgICAgIGlmIChzY2hlbWVQbHVzSG9zdCA9PSBudWxsIHx8ICFjaGVja0luaXRpYWxpemVkKCkpIHsKICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICB9CiAKQEAgLTg5OSw3ICs5NDQsNyBAQAogICAgICAqIENsZWFyIHBhc3N3b3JkIGRhdGFiYXNlCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgY2xlYXJVc2VybmFtZVBhc3N3b3JkKCkgewotICAgICAgICBpZiAobURhdGFiYXNlID09IG51bGwpIHsKKyAgICAgICAgaWYgKCFjaGVja0luaXRpYWxpemVkKCkpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCkBAIC05MjQsNyArOTY5LDcgQEAKICAgICAgKi8KICAgICB2b2lkIHNldEh0dHBBdXRoVXNlcm5hbWVQYXNzd29yZChTdHJpbmcgaG9zdCwgU3RyaW5nIHJlYWxtLCBTdHJpbmcgdXNlcm5hbWUsCiAgICAgICAgICAgICBTdHJpbmcgcGFzc3dvcmQpIHsKLSAgICAgICAgaWYgKGhvc3QgPT0gbnVsbCB8fCByZWFsbSA9PSBudWxsIHx8IG1EYXRhYmFzZSA9PSBudWxsKSB7CisgICAgICAgIGlmIChob3N0ID09IG51bGwgfHwgcmVhbG0gPT0gbnVsbCB8fCAhY2hlY2tJbml0aWFsaXplZCgpKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIApAQCAtOTQ5LDcgKzk5NCw3IEBACiAgICAgICogICAgICAgICBTdHJpbmdbMV0gaXMgcGFzc3dvcmQuIFJldHVybiBudWxsIGlmIGl0IGNhbid0IGZpbmQgYW55dGhpbmcuCiAgICAgICovCiAgICAgU3RyaW5nW10gZ2V0SHR0cEF1dGhVc2VybmFtZVBhc3N3b3JkKFN0cmluZyBob3N0LCBTdHJpbmcgcmVhbG0pIHsKLSAgICAgICAgaWYgKGhvc3QgPT0gbnVsbCB8fCByZWFsbSA9PSBudWxsIHx8IG1EYXRhYmFzZSA9PSBudWxsKXsKKyAgICAgICAgaWYgKGhvc3QgPT0gbnVsbCB8fCByZWFsbSA9PSBudWxsIHx8ICFjaGVja0luaXRpYWxpemVkKCkpewogICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgIH0KIApAQCAtOTk2LDcgKzEwNDEsNyBAQAogICAgICAqIENsZWFyIEhUVFAgYXV0aGVudGljYXRpb24gcGFzc3dvcmQgZGF0YWJhc2UKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBjbGVhckh0dHBBdXRoVXNlcm5hbWVQYXNzd29yZCgpIHsKLSAgICAgICAgaWYgKG1EYXRhYmFzZSA9PSBudWxsKSB7CisgICAgICAgIGlmICghY2hlY2tJbml0aWFsaXplZCgpKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIApAQCAtMTAxNyw3ICsxMDYyLDcgQEAKICAgICAgKiBAcGFyYW0gZm9ybWRhdGEgVGhlIGZvcm0gZGF0YSBpbiBIYXNoTWFwCiAgICAgICovCiAgICAgdm9pZCBzZXRGb3JtRGF0YShTdHJpbmcgdXJsLCBIYXNoTWFwPFN0cmluZywgU3RyaW5nPiBmb3JtZGF0YSkgewotICAgICAgICBpZiAodXJsID09IG51bGwgfHwgZm9ybWRhdGEgPT0gbnVsbCB8fCBtRGF0YWJhc2UgPT0gbnVsbCkgeworICAgICAgICBpZiAodXJsID09IG51bGwgfHwgZm9ybWRhdGEgPT0gbnVsbCB8fCAhY2hlY2tJbml0aWFsaXplZCgpKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIApAQCAtMTA2Niw3ICsxMTExLDcgQEAKICAgICAgKi8KICAgICBBcnJheUxpc3Q8U3RyaW5nPiBnZXRGb3JtRGF0YShTdHJpbmcgdXJsLCBTdHJpbmcgbmFtZSkgewogICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiB2YWx1ZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgaWYgKHVybCA9PSBudWxsIHx8IG5hbWUgPT0gbnVsbCB8fCBtRGF0YWJhc2UgPT0gbnVsbCkgeworICAgICAgICBpZiAodXJsID09IG51bGwgfHwgbmFtZSA9PSBudWxsIHx8ICFjaGVja0luaXRpYWxpemVkKCkpIHsKICAgICAgICAgICAgIHJldHVybiB2YWx1ZXM7CiAgICAgICAgIH0KIApAQCAtMTEyNiw3ICsxMTcxLDcgQEAKICAgICAgKiBDbGVhciBmb3JtIGRhdGFiYXNlCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgY2xlYXJGb3JtRGF0YSgpIHsKLSAgICAgICAgaWYgKG1EYXRhYmFzZSA9PSBudWxsKSB7CisgICAgICAgIGlmICghY2hlY2tJbml0aWFsaXplZCgpKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1pvb21Db250cm9sQmFzZS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1pvb21Db250cm9sQmFzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlOWU4ZjMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvWm9vbUNvbnRyb2xCYXNlLmphdmEKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGFuZHJvaWQud2Via2l0OworCitpbnRlcmZhY2UgWm9vbUNvbnRyb2xCYXNlIHsKKworICAgIC8qKgorICAgICAqIENhdXNlcyB0aGUgb24tc2NyZWVuIHpvb20gY29udHJvbCB0byBiZSBtYWRlIHZpc2libGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzaG93KCk7CisKKyAgICAvKioKKyAgICAgKiBDYXVzZXMgdGhlIG9uLXNjcmVlbiB6b29tIGNvbnRyb2wgdG8gZGlzYXBwZWFyCisgICAgICovCisgICAgcHVibGljIHZvaWQgaGlkZSgpOworCisgICAgLyoqCisgICAgICogRW5hYmxlcyB0aGUgY29udHJvbCB0byB1cGRhdGUgaXRzIHN0YXRlIGlmIG5lY2Vzc2FyeSBpbiByZXNwb25zZSB0byBhCisgICAgICogY2hhbmdlIGluIHRoZSBwYWdlcyB6b29tIGxldmVsLiBGb3IgZXhhbXBsZSwgaWYgdGhlIG1heCB6b29tIGxldmVsIGlzCisgICAgICogcmVhY2hlZCB0aGVuIHRoZSBjb250cm9sIGNhbiBkaXNhYmxlIHRoZSBidXR0b24gZm9yIHpvb21pbmcgaW4uCisgICAgICovCisgICAgcHVibGljIHZvaWQgdXBkYXRlKCk7CisKKyAgICAvKioKKyAgICAgKiBDaGVja3MgdG8gc2VlIGlmIHRoZSBjb250cm9sIGlzIGN1cnJlbnRseSB2aXNpYmxlIHRvIHRoZSB1c2VyLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzVmlzaWJsZSgpOworfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1pvb21Db250cm9sRW1iZWRkZWQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9ab29tQ29udHJvbEVtYmVkZGVkLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzI5ZTcyYgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9ab29tQ29udHJvbEVtYmVkZGVkLmphdmEKQEAgLTAsMCArMSwxMTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBhbmRyb2lkLndlYmtpdDsKKworaW1wb3J0IGFuZHJvaWQudmlldy5HcmF2aXR5OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuRnJhbWVMYXlvdXQ7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuVG9hc3Q7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuWm9vbUJ1dHRvbnNDb250cm9sbGVyOworCitjbGFzcyBab29tQ29udHJvbEVtYmVkZGVkIGltcGxlbWVudHMgWm9vbUNvbnRyb2xCYXNlIHsKKworICAgIHByaXZhdGUgZmluYWwgWm9vbU1hbmFnZXIgbVpvb21NYW5hZ2VyOworICAgIHByaXZhdGUgZmluYWwgV2ViVmlldyBtV2ViVmlldzsKKworICAgIC8vIFRoZSBjb250cm9sbGVyIGlzIGxhemlseSBpbml0aWFsaXplZCBpbiBnZXRDb250cm9scygpIGZvciBwZXJmb3JtYW5jZS4KKyAgICBwcml2YXRlIFpvb21CdXR0b25zQ29udHJvbGxlciBtWm9vbUJ1dHRvbnNDb250cm9sbGVyOworCisgICAgcHVibGljIFpvb21Db250cm9sRW1iZWRkZWQoWm9vbU1hbmFnZXIgem9vbU1hbmFnZXIsIFdlYlZpZXcgd2ViVmlldykgeworICAgICAgICBtWm9vbU1hbmFnZXIgPSB6b29tTWFuYWdlcjsKKyAgICAgICAgbVdlYlZpZXcgPSB3ZWJWaWV3OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNob3coKSB7CisgICAgICAgIGlmICghZ2V0Q29udHJvbHMoKS5pc1Zpc2libGUoKSAmJiAhbVpvb21NYW5hZ2VyLmlzWm9vbVNjYWxlRml4ZWQoKSkgeworCisgICAgICAgICAgICBtWm9vbUJ1dHRvbnNDb250cm9sbGVyLnNldFZpc2libGUodHJ1ZSk7CisKKyAgICAgICAgICAgIFdlYlNldHRpbmdzIHNldHRpbmdzID0gbVdlYlZpZXcuZ2V0U2V0dGluZ3MoKTsKKyAgICAgICAgICAgIGludCBjb3VudCA9IHNldHRpbmdzLmdldERvdWJsZVRhcFRvYXN0Q291bnQoKTsKKyAgICAgICAgICAgIGlmIChtWm9vbU1hbmFnZXIuaXNJblpvb21PdmVydmlldygpICYmIGNvdW50ID4gMCkgeworICAgICAgICAgICAgICAgIHNldHRpbmdzLnNldERvdWJsZVRhcFRvYXN0Q291bnQoLS1jb3VudCk7CisgICAgICAgICAgICAgICAgVG9hc3QubWFrZVRleHQobVdlYlZpZXcuZ2V0Q29udGV4dCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHJpbmcuZG91YmxlX3RhcF90b2FzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFRvYXN0LkxFTkdUSF9MT05HKS5zaG93KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBoaWRlKCkgeworICAgICAgICBpZiAobVpvb21CdXR0b25zQ29udHJvbGxlciAhPSBudWxsKSB7CisgICAgICAgICAgICBtWm9vbUJ1dHRvbnNDb250cm9sbGVyLnNldFZpc2libGUoZmFsc2UpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNWaXNpYmxlKCkgeworICAgICAgICByZXR1cm4gbVpvb21CdXR0b25zQ29udHJvbGxlciAhPSBudWxsICYmIG1ab29tQnV0dG9uc0NvbnRyb2xsZXIuaXNWaXNpYmxlKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdXBkYXRlKCkgeworICAgICAgICBpZiAobVpvb21CdXR0b25zQ29udHJvbGxlciA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBib29sZWFuIGNhblpvb21JbiA9IG1ab29tTWFuYWdlci5jYW5ab29tSW4oKTsKKyAgICAgICAgYm9vbGVhbiBjYW5ab29tT3V0ID0gbVpvb21NYW5hZ2VyLmNhblpvb21PdXQoKSAmJiAhbVpvb21NYW5hZ2VyLmlzSW5ab29tT3ZlcnZpZXcoKTsKKyAgICAgICAgaWYgKCFjYW5ab29tSW4gJiYgIWNhblpvb21PdXQpIHsKKyAgICAgICAgICAgIC8vIEhpZGUgdGhlIHpvb20gaW4gYW5kIG91dCBidXR0b25zIGlmIHRoZSBwYWdlIGNhbm5vdCB6b29tCisgICAgICAgICAgICBtWm9vbUJ1dHRvbnNDb250cm9sbGVyLmdldFpvb21Db250cm9scygpLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIFNldCBlYWNoIG9uZSBpbmRpdmlkdWFsbHksIGFzIGEgcGFnZSBtYXkgYmUgYWJsZSB0byB6b29tIGluIG9yIG91dAorICAgICAgICAgICAgbVpvb21CdXR0b25zQ29udHJvbGxlci5zZXRab29tSW5FbmFibGVkKGNhblpvb21Jbik7CisgICAgICAgICAgICBtWm9vbUJ1dHRvbnNDb250cm9sbGVyLnNldFpvb21PdXRFbmFibGVkKGNhblpvb21PdXQpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBab29tQnV0dG9uc0NvbnRyb2xsZXIgZ2V0Q29udHJvbHMoKSB7CisgICAgICAgIGlmIChtWm9vbUJ1dHRvbnNDb250cm9sbGVyID09IG51bGwpIHsKKyAgICAgICAgICAgIG1ab29tQnV0dG9uc0NvbnRyb2xsZXIgPSBuZXcgWm9vbUJ1dHRvbnNDb250cm9sbGVyKG1XZWJWaWV3KTsKKyAgICAgICAgICAgIG1ab29tQnV0dG9uc0NvbnRyb2xsZXIuc2V0T25ab29tTGlzdGVuZXIobmV3IFpvb21MaXN0ZW5lcigpKTsKKyAgICAgICAgICAgIC8vIFpvb21CdXR0b25zQ29udHJvbGxlciBwb3NpdGlvbnMgdGhlIGJ1dHRvbnMgYXQgdGhlIGJvdHRvbSwgYnV0IGluCisgICAgICAgICAgICAvLyB0aGUgbWlkZGxlLiBDaGFuZ2UgdGhlaXIgbGF5b3V0IHBhcmFtZXRlcnMgc28gdGhleSBhcHBlYXIgb24gdGhlCisgICAgICAgICAgICAvLyByaWdodC4KKyAgICAgICAgICAgIFZpZXcgY29udHJvbHMgPSBtWm9vbUJ1dHRvbnNDb250cm9sbGVyLmdldFpvb21Db250cm9scygpOworICAgICAgICAgICAgVmlld0dyb3VwLkxheW91dFBhcmFtcyBwYXJhbXMgPSBjb250cm9scy5nZXRMYXlvdXRQYXJhbXMoKTsKKyAgICAgICAgICAgIGlmIChwYXJhbXMgaW5zdGFuY2VvZiBGcmFtZUxheW91dC5MYXlvdXRQYXJhbXMpIHsKKyAgICAgICAgICAgICAgICAoKEZyYW1lTGF5b3V0LkxheW91dFBhcmFtcykgcGFyYW1zKS5ncmF2aXR5ID0gR3Jhdml0eS5SSUdIVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbVpvb21CdXR0b25zQ29udHJvbGxlcjsKKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIFpvb21MaXN0ZW5lciBpbXBsZW1lbnRzIFpvb21CdXR0b25zQ29udHJvbGxlci5Pblpvb21MaXN0ZW5lciB7CisKKyAgICAgICAgcHVibGljIHZvaWQgb25WaXNpYmlsaXR5Q2hhbmdlZChib29sZWFuIHZpc2libGUpIHsKKyAgICAgICAgICAgIGlmICh2aXNpYmxlKSB7CisgICAgICAgICAgICAgICAgbVdlYlZpZXcuc3dpdGNoT3V0RHJhd0hpc3RvcnkoKTsKKyAgICAgICAgICAgICAgICAvLyBCcmluZyBiYWNrIHRoZSBoaWRkZW4gem9vbSBjb250cm9scy4KKyAgICAgICAgICAgICAgICBtWm9vbUJ1dHRvbnNDb250cm9sbGVyLmdldFpvb21Db250cm9scygpLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICAgICAgICAgICAgICB1cGRhdGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIG9uWm9vbShib29sZWFuIHpvb21JbikgeworICAgICAgICAgICAgaWYgKHpvb21JbikgeworICAgICAgICAgICAgICAgIG1XZWJWaWV3Lnpvb21JbigpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtV2ViVmlldy56b29tT3V0KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB1cGRhdGUoKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9ab29tQ29udHJvbEV4dGVybmFsLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvWm9vbUNvbnRyb2xFeHRlcm5hbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3NTMxM2UKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvWm9vbUNvbnRyb2xFeHRlcm5hbC5qYXZhCkBAIC0wLDAgKzEsMTU5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgYW5kcm9pZC53ZWJraXQ7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3Q29uZmlndXJhdGlvbjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldy5PbkNsaWNrTGlzdGVuZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BbHBoYUFuaW1hdGlvbjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5GcmFtZUxheW91dDsKKworQERlcHJlY2F0ZWQKK2NsYXNzIFpvb21Db250cm9sRXh0ZXJuYWwgaW1wbGVtZW50cyBab29tQ29udHJvbEJhc2UgeworCisgICAgLy8gVGhlIHRpbWUgdGhhdCB0aGUgZXh0ZXJuYWwgY29udHJvbHMgYXJlIHZpc2libGUgYmVmb3JlIGZhZGluZyBhd2F5CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBaT09NX0NPTlRST0xTX1RJTUVPVVQgPQorICAgICAgICAgICAgVmlld0NvbmZpZ3VyYXRpb24uZ2V0Wm9vbUNvbnRyb2xzVGltZW91dCgpOworICAgIC8vIFRoZSB2aWV3IGNvbnRhaW5pbmcgdGhlIGV4dGVybmFsIHpvb20gY29udHJvbHMKKyAgICBwcml2YXRlIEV4dGVuZGVkWm9vbUNvbnRyb2xzIG1ab29tQ29udHJvbHM7CisgICAgcHJpdmF0ZSBSdW5uYWJsZSBtWm9vbUNvbnRyb2xSdW5uYWJsZTsKKyAgICBwcml2YXRlIGZpbmFsIEhhbmRsZXIgbVByaXZhdGVIYW5kbGVyID0gbmV3IEhhbmRsZXIoKTsKKworICAgIHByaXZhdGUgZmluYWwgV2ViVmlldyBtV2ViVmlldzsKKworICAgIHB1YmxpYyBab29tQ29udHJvbEV4dGVybmFsKFdlYlZpZXcgd2ViVmlldykgeworICAgICAgICBtV2ViVmlldyA9IHdlYlZpZXc7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2hvdygpIHsKKyAgICAgICAgaWYobVpvb21Db250cm9sUnVubmFibGUgIT0gbnVsbCkgeworICAgICAgICAgICAgbVByaXZhdGVIYW5kbGVyLnJlbW92ZUNhbGxiYWNrcyhtWm9vbUNvbnRyb2xSdW5uYWJsZSk7CisgICAgICAgIH0KKyAgICAgICAgZ2V0Q29udHJvbHMoKS5zaG93KHRydWUpOworICAgICAgICBtUHJpdmF0ZUhhbmRsZXIucG9zdERlbGF5ZWQobVpvb21Db250cm9sUnVubmFibGUsIFpPT01fQ09OVFJPTFNfVElNRU9VVCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgaGlkZSgpIHsKKyAgICAgICAgaWYgKG1ab29tQ29udHJvbFJ1bm5hYmxlICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1Qcml2YXRlSGFuZGxlci5yZW1vdmVDYWxsYmFja3MobVpvb21Db250cm9sUnVubmFibGUpOworICAgICAgICB9CisgICAgICAgIGlmIChtWm9vbUNvbnRyb2xzICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1ab29tQ29udHJvbHMuaGlkZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNWaXNpYmxlKCkgeworICAgICAgICByZXR1cm4gbVpvb21Db250cm9scyAhPSBudWxsICYmIG1ab29tQ29udHJvbHMuaXNTaG93bigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsgfQorCisgICAgcHVibGljIEV4dGVuZGVkWm9vbUNvbnRyb2xzIGdldENvbnRyb2xzKCkgeworICAgICAgICBpZiAobVpvb21Db250cm9scyA9PSBudWxsKSB7CisgICAgICAgICAgICBtWm9vbUNvbnRyb2xzID0gY3JlYXRlWm9vbUNvbnRyb2xzKCk7CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBuZWVkIHRvIGJlIHNldCB0byBWSVNJQkxFIGZpcnN0IHNvIHRoYXQgZ2V0TWVhc3VyZWRIZWlnaHQoKSBpbgorICAgICAgICAgICAgICoge0BsaW5rICNvblNpemVDaGFuZ2VkKCl9IGNhbiByZXR1cm4gdGhlIG1lYXN1cmVkIHZhbHVlIGZvciBwcm9wZXIKKyAgICAgICAgICAgICAqIGxheW91dC4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgbVpvb21Db250cm9scy5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgICAgICAgICBtWm9vbUNvbnRyb2xSdW5uYWJsZSA9IG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIERvbid0IGRpc21pc3MgdGhlIGNvbnRyb2xzIGlmIHRoZSB1c2VyIGhhcworICAgICAgICAgICAgICAgICAgICAgKiBmb2N1cyBvbiB0aGVtLiBXYWl0IGFuZCBjaGVjayBhZ2FpbiBsYXRlci4KKyAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgIGlmICghbVpvb21Db250cm9scy5oYXNGb2N1cygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtWm9vbUNvbnRyb2xzLmhpZGUoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Qcml2YXRlSGFuZGxlci5yZW1vdmVDYWxsYmFja3MobVpvb21Db250cm9sUnVubmFibGUpOworICAgICAgICAgICAgICAgICAgICAgICAgbVByaXZhdGVIYW5kbGVyLnBvc3REZWxheWVkKG1ab29tQ29udHJvbFJ1bm5hYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaT09NX0NPTlRST0xTX1RJTUVPVVQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbVpvb21Db250cm9sczsKKyAgICB9CisKKyAgICBwcml2YXRlIEV4dGVuZGVkWm9vbUNvbnRyb2xzIGNyZWF0ZVpvb21Db250cm9scygpIHsKKyAgICAgICAgRXh0ZW5kZWRab29tQ29udHJvbHMgem9vbUNvbnRyb2xzID0gbmV3IEV4dGVuZGVkWm9vbUNvbnRyb2xzKG1XZWJWaWV3LmdldENvbnRleHQoKSk7CisgICAgICAgIHpvb21Db250cm9scy5zZXRPblpvb21JbkNsaWNrTGlzdGVuZXIobmV3IE9uQ2xpY2tMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7CisgICAgICAgICAgICAgICAgLy8gcmVzZXQgdGltZSBvdXQKKyAgICAgICAgICAgICAgICBtUHJpdmF0ZUhhbmRsZXIucmVtb3ZlQ2FsbGJhY2tzKG1ab29tQ29udHJvbFJ1bm5hYmxlKTsKKyAgICAgICAgICAgICAgICBtUHJpdmF0ZUhhbmRsZXIucG9zdERlbGF5ZWQobVpvb21Db250cm9sUnVubmFibGUsIFpPT01fQ09OVFJPTFNfVElNRU9VVCk7CisgICAgICAgICAgICAgICAgbVdlYlZpZXcuem9vbUluKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgICB6b29tQ29udHJvbHMuc2V0T25ab29tT3V0Q2xpY2tMaXN0ZW5lcihuZXcgT25DbGlja0xpc3RlbmVyKCkgeworICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKKyAgICAgICAgICAgICAgICAvLyByZXNldCB0aW1lIG91dAorICAgICAgICAgICAgICAgIG1Qcml2YXRlSGFuZGxlci5yZW1vdmVDYWxsYmFja3MobVpvb21Db250cm9sUnVubmFibGUpOworICAgICAgICAgICAgICAgIG1Qcml2YXRlSGFuZGxlci5wb3N0RGVsYXllZChtWm9vbUNvbnRyb2xSdW5uYWJsZSwgWk9PTV9DT05UUk9MU19USU1FT1VUKTsKKyAgICAgICAgICAgICAgICBtV2ViVmlldy56b29tT3V0KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgICByZXR1cm4gem9vbUNvbnRyb2xzOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEV4dGVuZGVkWm9vbUNvbnRyb2xzIGV4dGVuZHMgRnJhbWVMYXlvdXQgeworCisgICAgICAgIHByaXZhdGUgYW5kcm9pZC53aWRnZXQuWm9vbUNvbnRyb2xzIG1QbHVzTWludXNab29tQ29udHJvbHM7CisKKyAgICAgICAgcHVibGljIEV4dGVuZGVkWm9vbUNvbnRyb2xzKENvbnRleHQgY29udGV4dCkgeworICAgICAgICAgICAgc3VwZXIoY29udGV4dCwgbnVsbCk7CisgICAgICAgICAgICBMYXlvdXRJbmZsYXRlciBpbmZsYXRlciA9IChMYXlvdXRJbmZsYXRlcikKKyAgICAgICAgICAgICAgICAgICAgY29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuTEFZT1VUX0lORkxBVEVSX1NFUlZJQ0UpOworICAgICAgICAgICAgaW5mbGF0ZXIuaW5mbGF0ZShjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmxheW91dC56b29tX21hZ25pZnksIHRoaXMsIHRydWUpOworICAgICAgICAgICAgbVBsdXNNaW51c1pvb21Db250cm9scyA9IChhbmRyb2lkLndpZGdldC5ab29tQ29udHJvbHMpIGZpbmRWaWV3QnlJZCgKKyAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5pZC56b29tQ29udHJvbHMpOworICAgICAgICAgICAgZmluZFZpZXdCeUlkKGNvbS5hbmRyb2lkLmludGVybmFsLlIuaWQuem9vbU1hZ25pZnkpLnNldFZpc2liaWxpdHkoCisgICAgICAgICAgICAgICAgICAgIFZpZXcuR09ORSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzaG93KGJvb2xlYW4gc2hvd1pvb20pIHsKKyAgICAgICAgICAgIG1QbHVzTWludXNab29tQ29udHJvbHMuc2V0VmlzaWJpbGl0eShzaG93Wm9vbSA/IFZpZXcuVklTSUJMRSA6IFZpZXcuR09ORSk7CisgICAgICAgICAgICBmYWRlKFZpZXcuVklTSUJMRSwgMC4wZiwgMS4wZik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBoaWRlKCkgeworICAgICAgICAgICAgZmFkZShWaWV3LkdPTkUsIDEuMGYsIDAuMGYpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIGZhZGUoaW50IHZpc2liaWxpdHksIGZsb2F0IHN0YXJ0QWxwaGEsIGZsb2F0IGVuZEFscGhhKSB7CisgICAgICAgICAgICBBbHBoYUFuaW1hdGlvbiBhbmltID0gbmV3IEFscGhhQW5pbWF0aW9uKHN0YXJ0QWxwaGEsIGVuZEFscGhhKTsKKyAgICAgICAgICAgIGFuaW0uc2V0RHVyYXRpb24oNTAwKTsKKyAgICAgICAgICAgIHN0YXJ0QW5pbWF0aW9uKGFuaW0pOworICAgICAgICAgICAgc2V0VmlzaWJpbGl0eSh2aXNpYmlsaXR5KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc0ZvY3VzKCkgeworICAgICAgICAgICAgcmV0dXJuIG1QbHVzTWludXNab29tQ29udHJvbHMuaGFzRm9jdXMoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldE9uWm9vbUluQ2xpY2tMaXN0ZW5lcihPbkNsaWNrTGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICAgICAgICAgIG1QbHVzTWludXNab29tQ29udHJvbHMuc2V0T25ab29tSW5DbGlja0xpc3RlbmVyKGxpc3RlbmVyKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldE9uWm9vbU91dENsaWNrTGlzdGVuZXIoT25DbGlja0xpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgICAgICAgICBtUGx1c01pbnVzWm9vbUNvbnRyb2xzLnNldE9uWm9vbU91dENsaWNrTGlzdGVuZXIobGlzdGVuZXIpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1pvb21NYW5hZ2VyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvWm9vbU1hbmFnZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMGZhZGI1Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1pvb21NYW5hZ2VyLmphdmEKQEAgLTAsMCArMSw5MDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQud2Via2l0OworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUG9pbnQ7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5TY2FsZUdlc3R1cmVEZXRlY3RvcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKKworLyoqCisgKiBUaGUgWm9vbU1hbmFnZXIgaXMgcmVzcG9uc2libGUgZm9yIG1haW50YWluaW5nIHRoZSBXZWJWaWV3J3MgY3VycmVudCB6b29tCisgKiBsZXZlbCBzdGF0ZS4gIEl0IGlzIGFsc28gcmVzcG9uc2libGUgZm9yIG1hbmFnaW5nIHRoZSBvbi1zY3JlZW4gem9vbSBjb250cm9scworICogYXMgd2VsbCBhcyBhbnkgYW5pbWF0aW9uIG9mIHRoZSBXZWJWaWV3IGR1ZSB0byB6b29taW5nLgorICoKKyAqIEN1cnJlbnRseSwgdGhlcmUgYXJlIHR3byBtZXRob2RzIGZvciBhbmltYXRpbmcgdGhlIHpvb20gb2YgYSBXZWJWaWV3LgorICoKKyAqICgxKSBUaGUgZmlyc3QgbWV0aG9kIGlzIHRyaWdnZXJlZCBieSBzdGFydFpvb21BbmltYXRpb24oLi4uKSBhbmQgaXMgYSBmaXhlZAorICogbGVuZ3RoIGFuaW1hdGlvbiB3aGVyZSB0aGUgZmluYWwgem9vbSBzY2FsZSBpcyBrbm93biBhdCBzdGFydHVwLiAgVGhpcyB0eXBlIG9mCisgKiBhbmltYXRpb24gbm90aWZpZXMgd2Via2l0IG9mIHRoZSBmaW5hbCBzY2FsZSBCRUZPUkUgaXQgYW5pbWF0ZXMuIFRoZSBhbmltYXRpb24KKyAqIGlzIHRoZW4gZG9uZSBieSBzY2FsaW5nIHRoZSBDQU5WQVMgaW5jcmVtZW50YWxseSBiYXNlZCBvbiBhIHN0ZXBwaW5nIGZ1bmN0aW9uLgorICoKKyAqICgyKSBUaGUgc2Vjb25kIG1ldGhvZCBpcyB0cmlnZ2VyZWQgYnkgYSBtdWx0aS10b3VjaCBwaW5jaCBhbmQgdGhlIG5ldyBzY2FsZQorICogaXMgZGV0ZXJtaW5lZCBkeW5hbWljYWxseSBiYXNlZCBvbiB0aGUgdXNlcidzIGdlc3R1cmUuIFRoaXMgdHlwZSBvZiBhbmltYXRpb24KKyAqIG9ubHkgbm90aWZpZXMgd2Via2l0IG9mIG5ldyBzY2FsZSBBRlRFUiB0aGUgZ2VzdHVyZSBpcyBjb21wbGV0ZS4gVGhlIGFuaW1hdGlvbgorICogZWZmZWN0IGlzIGFjaGlldmVkIGJ5IHNjYWxpbmcgdGhlIFZJRVdTIChib3RoIFdlYlZpZXcgYW5kIFZpZXdNYW5hZ2VyLkNoaWxkVmlldykKKyAqIHRvIHRoZSBuZXcgc2NhbGUgaW4gcmVzcG9uc2UgdG8gZXZlbnRzIHJlbGF0ZWQgdG8gdGhlIHVzZXIncyBnZXN0dXJlLgorICovCitjbGFzcyBab29tTWFuYWdlciB7CisKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIExPR1RBRyA9ICJ3ZWJ2aWV3Wm9vbSI7CisKKyAgICBwcml2YXRlIGZpbmFsIFdlYlZpZXcgbVdlYlZpZXc7CisgICAgcHJpdmF0ZSBmaW5hbCBDYWxsYmFja1Byb3h5IG1DYWxsYmFja1Byb3h5OworCisgICAgLy8gV2lkZ2V0cyByZXNwb25zaWJsZSBmb3IgdGhlIG9uLXNjcmVlbiB6b29tIGZ1bmN0aW9ucyBvZiB0aGUgV2ViVmlldy4KKyAgICBwcml2YXRlIFpvb21Db250cm9sRW1iZWRkZWQgbUVtYmVkZGVkWm9vbUNvbnRyb2w7CisgICAgcHJpdmF0ZSBab29tQ29udHJvbEV4dGVybmFsIG1FeHRlcm5hbFpvb21Db250cm9sOworCisgICAgLyoKKyAgICAgKiBUaGUgc2NhbGUgZmFjdG9ycyB0aGF0IGRldGVybWluZSB0aGUgdXBwZXIgYW5kIGxvd2VyIGJvdW5kcyBmb3IgdGhlCisgICAgICogZGVmYXVsdCB6b29tIHNjYWxlLgorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgZmxvYXQgREVGQVVMVF9NQVhfWk9PTV9TQ0FMRV9GQUNUT1IgPSA0LjAwZjsKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGZsb2F0IERFRkFVTFRfTUlOX1pPT01fU0NBTEVfRkFDVE9SID0gMC4yNWY7CisKKyAgICAvLyBUaGUgZGVmYXVsdCBzY2FsZSBsaW1pdHMsIHdoaWNoIGFyZSBkZXBlbmRlbnQgb24gdGhlIGRpc3BsYXkgZGVuc2l0eS4KKyAgICBwcml2YXRlIGZsb2F0IG1EZWZhdWx0TWF4Wm9vbVNjYWxlOworICAgIHByaXZhdGUgZmxvYXQgbURlZmF1bHRNaW5ab29tU2NhbGU7CisKKyAgICAvLyBUaGUgYWN0dWFsIHNjYWxlIGxpbWl0cywgd2hpY2ggY2FuIGJlIHNldCB0aHJvdWdoIGEgd2VicGFnZSdzIHZpZXdwb3J0CisgICAgLy8gbWV0YS10YWcuCisgICAgcHJpdmF0ZSBmbG9hdCBtTWF4Wm9vbVNjYWxlOworICAgIHByaXZhdGUgZmxvYXQgbU1pblpvb21TY2FsZTsKKworICAgIC8vIExvY2tzIHRoZSBtaW5pbXVtIFpvb21TY2FsZSB0byB0aGUgdmFsdWUgY3VycmVudGx5IHNldCBpbiBtTWluWm9vbVNjYWxlLgorICAgIHByaXZhdGUgYm9vbGVhbiBtTWluWm9vbVNjYWxlRml4ZWQgPSB0cnVlOworCisgICAgLyoKKyAgICAgKiBXaGVuIGxvYWRpbmcgYSBuZXcgcGFnZSB0aGUgV2ViVmlldyBkb2VzIG5vdCBpbml0aWFsbHkga25vdyB0aGUgZmluYWwKKyAgICAgKiB3aWR0aCBvZiB0aGUgcGFnZS4gVGhlcmVmb3JlLCB3aGVuIGEgbmV3IHBhZ2UgaXMgbG9hZGVkIGluIG92ZXJ2aWV3IG1vZGUKKyAgICAgKiB0aGUgb3ZlcnZpZXcgc2NhbGUgaXMgaW5pdGlhbGl6ZWQgdG8gYSBkZWZhdWx0IHZhbHVlLiBUaGlzIGZsYWcgaXMgdGhlbgorICAgICAqIHNldCBhbmQgdXNlZCB0byBub3RpZnkgdGhlIFpvb21NYW5hZ2VyIHRvIHRha2UgdGhlIHdpZHRoIG9mIHRoZSBuZXh0CisgICAgICogcGljdHVyZSBmcm9tIHdlYmtpdCBhbmQgdXNlIHRoYXQgd2lkdGggdG8gZW50ZXIgaW50byB6b29tIG92ZXJ2aWV3IG1vZGUuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIG1Jbml0aWFsWm9vbU92ZXJ2aWV3ID0gZmFsc2U7CisKKyAgICAvKgorICAgICAqIFdoZW4gaW4gdGhlIHpvb20gb3ZlcnZpZXcgbW9kZSwgdGhlIHBhZ2UncyB3aWR0aCBpcyBmdWxseSBmaXQgdG8gdGhlCisgICAgICogY3VycmVudCB3aW5kb3cuIEFkZGl0aW9uYWxseSB3aGlsZSB0aGUgcGFnZSBpcyBpbiB0aGlzIHN0YXRlIGl0IGlzCisgICAgICogYWN0aXZlLCBpbiBvdGhlciB3b3JkcywgeW91IGNhbiBjbGljayB0byBmb2xsb3cgdGhlIGxpbmtzLiBXZSBjYWNoZSBhCisgICAgICogYm9vbGVhbiB0byBlbmFibGUgdXMgdG8gcXVpY2tseSBjaGVjayB3aGV0aGVyIG9yIG5vdCB3ZSBhcmUgaW4gb3ZlcnZpZXcKKyAgICAgKiBtb2RlLCBidXQgdGhpcyB2YWx1ZSBzaG91bGQgb25seSBiZSBtb2RpZmllZCBieSBjaGFuZ2VzIHRvIHRoZSB6b29tCisgICAgICogc2NhbGUuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIG1Jblpvb21PdmVydmlldyA9IGZhbHNlOworICAgIHByaXZhdGUgaW50IG1ab29tT3ZlcnZpZXdXaWR0aDsKKyAgICBwcml2YXRlIGZsb2F0IG1JbnZab29tT3ZlcnZpZXdXaWR0aDsKKworICAgIC8qCisgICAgICogVGhlc2UgdmFyaWFibGVzIHRyYWNrIHRoZSBjZW50ZXIgcG9pbnQgb2YgdGhlIHpvb20gYW5kIHRoZXkgYXJlIHVzZWQgdG8KKyAgICAgKiBkZXRlcm1pbmUgdGhlIHBvaW50IGFyb3VuZCB3aGljaCB3ZSBzaG91bGQgem9vbS4gVGhleSBhcmUgc3RvcmVkIGluIHZpZXcKKyAgICAgKiBjb29yZGluYXRlcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZsb2F0IG1ab29tQ2VudGVyWDsKKyAgICBwcml2YXRlIGZsb2F0IG1ab29tQ2VudGVyWTsKKworICAgIC8qCisgICAgICogVGhlc2UgdmFsdWVzIHJlcHJlc2VudCB0aGUgcG9pbnQgYXJvdW5kIHdoaWNoIHRoZSBzY3JlZW4gc2hvdWxkIGJlCisgICAgICogY2VudGVyZWQgYWZ0ZXIgem9vbWluZy4gSW4gb3RoZXIgd29yZHMgaXQgaXMgdXNlZCB0byBkZXRlcm1pbmUgdGhlIGNlbnRlcgorICAgICAqIHBvaW50IG9mIHRoZSB2aXNpYmxlIGRvY3VtZW50IGFmdGVyIHRoZSBwYWdlIGhhcyBmaW5pc2hlZCB6b29taW5nLiBUaGlzCisgICAgICogaXMgaW1wb3J0YW50IGJlY2F1c2UgdGhlIHpvb20gbWF5IGhhdmUgcG90ZW50aWFsbHkgcmVmbG93ZWQgdGhlIHRleHQgYW5kCisgICAgICogd2UgbmVlZCB0byBlbnN1cmUgdGhlIHByb3BlciBwb3J0aW9uIG9mIHRoZSBkb2N1bWVudCByZW1haW5zIG9uIHRoZQorICAgICAqIHNjcmVlbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBtQW5jaG9yWDsKKyAgICBwcml2YXRlIGludCBtQW5jaG9yWTsKKworICAgIC8vIFRoZSBzY2FsZSBmYWN0b3IgdGhhdCBpcyB1c2VkIHRvIGRldGVybWluZSB0aGUgY29sdW1uIHdpZHRoIGZvciB0ZXh0CisgICAgcHJpdmF0ZSBmbG9hdCBtVGV4dFdyYXBTY2FsZTsKKworICAgIC8qCisgICAgICogVGhlIGRlZmF1bHQgem9vbSBzY2FsZSBpcyB0aGUgc2NhbGUgZmFjdG9yIHVzZWQgd2hlbiB0aGUgdXNlciB0cmlnZ2VycyBhCisgICAgICogem9vbSBpbiBieSBkb3VibGUgdGFwcGluZyBvbiB0aGUgV2ViVmlldy4gVGhlIHZhbHVlIGlzIGluaXRpYWxseSBzZXQKKyAgICAgKiBiYXNlZCBvbiB0aGUgZGlzcGxheSBkZW5zaXR5LCBidXQgY2FuIGJlIGNoYW5nZWQgYXQgYW55IHRpbWUgdmlhIHRoZQorICAgICAqIFdlYlNldHRpbmdzLgorICAgICAqLworICAgIHByaXZhdGUgZmxvYXQgbURlZmF1bHRTY2FsZTsKKyAgICBwcml2YXRlIGZsb2F0IG1JbnZEZWZhdWx0U2NhbGU7CisKKyAgICAvLyB0aGUgY3VycmVudCBjb21wdXRlZCB6b29tIHNjYWxlIGFuZCBpdHMgaW52ZXJzZS4KKyAgICBwcml2YXRlIGZsb2F0IG1BY3R1YWxTY2FsZTsKKyAgICBwcml2YXRlIGZsb2F0IG1JbnZBY3R1YWxTY2FsZTsKKyAgICAKKyAgICAvKgorICAgICAqIFRoZSBpbml0aWFsIHNjYWxlIGZvciB0aGUgV2ViVmlldy4gMCBtZWFucyBkZWZhdWx0LiBJZiBpbml0aWFsIHNjYWxlIGlzCisgICAgICogZ3JlYXRlciB0aGFuIDAgdGhlIFdlYlZpZXcgc3RhcnRzIHdpdGggdGhpcyB2YWx1ZSBhcyBpdHMgaW5pdGlhbCBzY2FsZS4gVGhlCisgICAgICogdmFsdWUgaXMgY29udmVydGVkIGZyb20gYW4gaW50ZWdlciBwZXJjZW50YWdlIHNvIGl0IGlzIGd1YXJlbnRlZWQgdG8gaGF2ZQorICAgICAqIG5vIG1vcmUgdGhhbiAyIHNpZ25pZmljYW50IGRpZ2l0cyBhZnRlciB0aGUgZGVjaW1hbC4gIFRoaXMgcmVzdHJpY3Rpb24KKyAgICAgKiBhbGxvd3MgdXMgdG8gY29udmVydCB0aGUgc2NhbGUgYmFjayB0byB0aGUgb3JpZ2luYWwgcGVyY2VudGFnZSBieSBzaW1wbHkKKyAgICAgKiBtdWx0aXBseWluZyB0aGUgdmFsdWUgYnkgMTAwLgorICAgICAqLworICAgIHByaXZhdGUgZmxvYXQgbUluaXRpYWxTY2FsZTsKKworICAgIHByaXZhdGUgc3RhdGljIGZsb2F0IE1JTklNVU1fU0NBTEVfSU5DUkVNRU5UID0gMC4wMWY7CisKKyAgICAvKgorICAgICAqIFRoZSBmb2xsb3dpbmcgbWVtYmVyIHZhcmlhYmxlcyBhcmUgb25seSB0byBiZSB1c2VkIGZvciBhbmltYXRpbmcgem9vbS4gSWYKKyAgICAgKiBtWm9vbVNjYWxlIGlzIG5vbi16ZXJvIHRoZW4gd2UgYXJlIGluIHRoZSBtaWRkbGUgb2YgYSB6b29tIGFuaW1hdGlvbi4gVGhlCisgICAgICogb3RoZXIgdmFyaWFibGVzIGFyZSB1c2VkIGFzIGEgY2FjaGUgKGUuZy4gaW52ZXJzZSkgb3IgYXMgYSB3YXkgdG8gc3RvcmUKKyAgICAgKiB0aGUgc3RhdGUgb2YgdGhlIHZpZXcgcHJpb3IgdG8gYW5pbWF0aW5nIChlLmcuIGluaXRpYWwgc2Nyb2xsIGNvb3JkcykuCisgICAgICovCisgICAgcHJpdmF0ZSBmbG9hdCBtWm9vbVNjYWxlOworICAgIHByaXZhdGUgZmxvYXQgbUludkluaXRpYWxab29tU2NhbGU7CisgICAgcHJpdmF0ZSBmbG9hdCBtSW52RmluYWxab29tU2NhbGU7CisgICAgcHJpdmF0ZSBpbnQgbUluaXRpYWxTY3JvbGxYOworICAgIHByaXZhdGUgaW50IG1Jbml0aWFsU2Nyb2xsWTsKKyAgICBwcml2YXRlIGxvbmcgbVpvb21TdGFydDsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBaT09NX0FOSU1BVElPTl9MRU5HVEggPSA1MDA7CisKKyAgICAvLyB3aGV0aGVyIHN1cHBvcnQgbXVsdGktdG91Y2gKKyAgICBwcml2YXRlIGJvb2xlYW4gbVN1cHBvcnRNdWx0aVRvdWNoOworCisgICAgLy8gdXNlIHRoZSBmcmFtZXdvcmsncyBTY2FsZUdlc3R1cmVEZXRlY3RvciB0byBoYW5kbGUgbXVsdGktdG91Y2gKKyAgICBwcml2YXRlIFNjYWxlR2VzdHVyZURldGVjdG9yIG1TY2FsZURldGVjdG9yOworICAgIHByaXZhdGUgYm9vbGVhbiBtUGluY2hUb1pvb21BbmltYXRpbmcgPSBmYWxzZTsKKworICAgIHB1YmxpYyBab29tTWFuYWdlcihXZWJWaWV3IHdlYlZpZXcsIENhbGxiYWNrUHJveHkgY2FsbGJhY2tQcm94eSkgeworICAgICAgICBtV2ViVmlldyA9IHdlYlZpZXc7CisgICAgICAgIG1DYWxsYmFja1Byb3h5ID0gY2FsbGJhY2tQcm94eTsKKworICAgICAgICAvKgorICAgICAgICAgKiBJZGVhbGx5IG1ab29tT3ZlcnZpZXdXaWR0aCBzaG91bGQgYmUgbUNvbnRlbnRXaWR0aC4gQnV0IHNpdGVzIGxpa2UKKyAgICAgICAgICogRVNQTiBhbmQgRW5nYWRnZXQgYWx3YXlzIGhhdmUgd2lkZXIgbUNvbnRlbnRXaWR0aCBubyBtYXR0ZXIgd2hhdCB0aGUKKyAgICAgICAgICogdmlld3BvcnQgc2l6ZSBpcy4KKyAgICAgICAgICovCisgICAgICAgIHNldFpvb21PdmVydmlld1dpZHRoKFdlYlZpZXcuREVGQVVMVF9WSUVXUE9SVF9XSURUSCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5pdGlhbGl6ZSBib3RoIHRoZSBkZWZhdWx0IGFuZCBhY3R1YWwgem9vbSBzY2FsZSB0byB0aGUgZ2l2ZW4gZGVuc2l0eS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkZW5zaXR5IFRoZSBsb2dpY2FsIGRlbnNpdHkgb2YgdGhlIGRpc3BsYXkuIFRoaXMgaXMgYSBzY2FsaW5nIGZhY3RvcgorICAgICAqIGZvciB0aGUgRGVuc2l0eSBJbmRlcGVuZGVudCBQaXhlbCB1bml0LCB3aGVyZSBvbmUgRElQIGlzIG9uZSBwaXhlbCBvbiBhbgorICAgICAqIGFwcHJveGltYXRlbHkgMTYwIGRwaSBzY3JlZW4gKHNlZSBhbmRyb2lkLnV0aWwuRGlzcGxheU1ldHJpY3MuZGVuc2l0eSkuCisgICAgICovCisgICAgcHVibGljIHZvaWQgaW5pdChmbG9hdCBkZW5zaXR5KSB7CisgICAgICAgIGFzc2VydCBkZW5zaXR5ID4gMDsKKworICAgICAgICBzZXREZWZhdWx0Wm9vbVNjYWxlKGRlbnNpdHkpOworICAgICAgICBtQWN0dWFsU2NhbGUgPSBkZW5zaXR5OworICAgICAgICBtSW52QWN0dWFsU2NhbGUgPSAxIC8gZGVuc2l0eTsKKyAgICAgICAgbVRleHRXcmFwU2NhbGUgPSBkZW5zaXR5OworICAgIH0KKworICAgIC8qKgorICAgICAqIFVwZGF0ZSB0aGUgZGVmYXVsdCB6b29tIHNjYWxlIHVzaW5nIHRoZSBnaXZlbiBkZW5zaXR5LiBJdCB3aWxsIGFsc28gcmVzZXQKKyAgICAgKiB0aGUgY3VycmVudCBtaW4gYW5kIG1heCB6b29tIHNjYWxlcyB0byB0aGUgZGVmYXVsdCBib3VuZGFyaWVzIGFzIHdlbGwgYXMKKyAgICAgKiBlbnN1cmUgdGhhdCB0aGUgYWN0dWFsIHNjYWxlIGZhbGxzIHdpdGhpbiB0aG9zZSBib3VuZGFyaWVzLgorICAgICAqCisgICAgICogQHBhcmFtIGRlbnNpdHkgVGhlIGxvZ2ljYWwgZGVuc2l0eSBvZiB0aGUgZGlzcGxheS4gVGhpcyBpcyBhIHNjYWxpbmcgZmFjdG9yCisgICAgICogZm9yIHRoZSBEZW5zaXR5IEluZGVwZW5kZW50IFBpeGVsIHVuaXQsIHdoZXJlIG9uZSBESVAgaXMgb25lIHBpeGVsIG9uIGFuCisgICAgICogYXBwcm94aW1hdGVseSAxNjAgZHBpIHNjcmVlbiAoc2VlIGFuZHJvaWQudXRpbC5EaXNwbGF5TWV0cmljcy5kZW5zaXR5KS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB1cGRhdGVEZWZhdWx0Wm9vbURlbnNpdHkoZmxvYXQgZGVuc2l0eSkgeworICAgICAgICBhc3NlcnQgZGVuc2l0eSA+IDA7CisKKyAgICAgICAgaWYgKE1hdGguYWJzKGRlbnNpdHkgLSBtRGVmYXVsdFNjYWxlKSA+IE1JTklNVU1fU0NBTEVfSU5DUkVNRU5UKSB7CisgICAgICAgICAgICAvLyBzZXQgdGhlIG5ldyBkZWZhdWx0IGRlbnNpdHkKKyAgICAgICAgICAgIHNldERlZmF1bHRab29tU2NhbGUoZGVuc2l0eSk7CisgICAgICAgICAgICAvLyBhZGp1c3QgdGhlIHNjYWxlIGlmIGl0IGZhbGxzIG91dHNpZGUgdGhlIG5ldyB6b29tIGJvdW5kcworICAgICAgICAgICAgc2V0Wm9vbVNjYWxlKG1BY3R1YWxTY2FsZSwgdHJ1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2V0RGVmYXVsdFpvb21TY2FsZShmbG9hdCBkZWZhdWx0U2NhbGUpIHsKKyAgICAgICAgbURlZmF1bHRTY2FsZSA9IGRlZmF1bHRTY2FsZTsKKyAgICAgICAgbUludkRlZmF1bHRTY2FsZSA9IDEgLyBkZWZhdWx0U2NhbGU7CisgICAgICAgIG1EZWZhdWx0TWF4Wm9vbVNjYWxlID0gZGVmYXVsdFNjYWxlICogREVGQVVMVF9NQVhfWk9PTV9TQ0FMRV9GQUNUT1I7CisgICAgICAgIG1EZWZhdWx0TWluWm9vbVNjYWxlID0gZGVmYXVsdFNjYWxlICogREVGQVVMVF9NSU5fWk9PTV9TQ0FMRV9GQUNUT1I7CisgICAgICAgIG1NYXhab29tU2NhbGUgPSBtRGVmYXVsdE1heFpvb21TY2FsZTsKKyAgICAgICAgbU1pblpvb21TY2FsZSA9IG1EZWZhdWx0TWluWm9vbVNjYWxlOworICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCBmbG9hdCBnZXRTY2FsZSgpIHsKKyAgICAgICAgcmV0dXJuIG1BY3R1YWxTY2FsZTsKKyAgICB9CisKKyAgICBwdWJsaWMgZmluYWwgZmxvYXQgZ2V0SW52U2NhbGUoKSB7CisgICAgICAgIHJldHVybiBtSW52QWN0dWFsU2NhbGU7CisgICAgfQorCisgICAgcHVibGljIGZpbmFsIGZsb2F0IGdldFRleHRXcmFwU2NhbGUoKSB7CisgICAgICAgIHJldHVybiBtVGV4dFdyYXBTY2FsZTsKKyAgICB9CisKKyAgICBwdWJsaWMgZmluYWwgZmxvYXQgZ2V0TWF4Wm9vbVNjYWxlKCkgeworICAgICAgICByZXR1cm4gbU1heFpvb21TY2FsZTsKKyAgICB9CisKKyAgICBwdWJsaWMgZmluYWwgZmxvYXQgZ2V0TWluWm9vbVNjYWxlKCkgeworICAgICAgICByZXR1cm4gbU1pblpvb21TY2FsZTsKKyAgICB9CisKKyAgICBwdWJsaWMgZmluYWwgZmxvYXQgZ2V0RGVmYXVsdFNjYWxlKCkgeworICAgICAgICByZXR1cm4gbURlZmF1bHRTY2FsZTsKKyAgICB9CisKKyAgICBwdWJsaWMgZmluYWwgZmxvYXQgZ2V0SW52RGVmYXVsdFNjYWxlKCkgeworICAgICAgICByZXR1cm4gbUludkRlZmF1bHRTY2FsZTsKKyAgICB9CisKKyAgICBwdWJsaWMgZmluYWwgZmxvYXQgZ2V0RGVmYXVsdE1heFpvb21TY2FsZSgpIHsKKyAgICAgICAgcmV0dXJuIG1EZWZhdWx0TWF4Wm9vbVNjYWxlOworICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCBmbG9hdCBnZXREZWZhdWx0TWluWm9vbVNjYWxlKCkgeworICAgICAgICByZXR1cm4gbURlZmF1bHRNaW5ab29tU2NhbGU7CisgICAgfQorCisgICAgcHVibGljIGZpbmFsIGludCBnZXREb2N1bWVudEFuY2hvclgoKSB7CisgICAgICAgIHJldHVybiBtQW5jaG9yWDsKKyAgICB9CisKKyAgICBwdWJsaWMgZmluYWwgaW50IGdldERvY3VtZW50QW5jaG9yWSgpIHsKKyAgICAgICAgcmV0dXJuIG1BbmNob3JZOworICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCB2b2lkIGNsZWFyRG9jdW1lbnRBbmNob3IoKSB7CisgICAgICAgIG1BbmNob3JYID0gbUFuY2hvclkgPSAwOworICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHNldFpvb21DZW50ZXIoZmxvYXQgeCwgZmxvYXQgeSkgeworICAgICAgICBtWm9vbUNlbnRlclggPSB4OworICAgICAgICBtWm9vbUNlbnRlclkgPSB5OworICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHNldEluaXRpYWxTY2FsZUluUGVyY2VudChpbnQgc2NhbGVJblBlcmNlbnQpIHsKKyAgICAgICAgbUluaXRpYWxTY2FsZSA9IHNjYWxlSW5QZXJjZW50ICogMC4wMWY7CisgICAgfQorCisgICAgcHVibGljIGZpbmFsIGZsb2F0IGNvbXB1dGVTY2FsZVdpdGhMaW1pdHMoZmxvYXQgc2NhbGUpIHsKKyAgICAgICAgaWYgKHNjYWxlIDwgbU1pblpvb21TY2FsZSkgeworICAgICAgICAgICAgc2NhbGUgPSBtTWluWm9vbVNjYWxlOworICAgICAgICB9IGVsc2UgaWYgKHNjYWxlID4gbU1heFpvb21TY2FsZSkgeworICAgICAgICAgICAgc2NhbGUgPSBtTWF4Wm9vbVNjYWxlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzY2FsZTsKKyAgICB9CisKKyAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBpc1pvb21TY2FsZUZpeGVkKCkgeworICAgICAgICByZXR1cm4gbU1pblpvb21TY2FsZSA+PSBtTWF4Wm9vbVNjYWxlOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBleGNlZWRzTWluU2NhbGVJbmNyZW1lbnQoZmxvYXQgc2NhbGVBLCBmbG9hdCBzY2FsZUIpIHsKKyAgICAgICAgcmV0dXJuIE1hdGguYWJzKHNjYWxlQSAtIHNjYWxlQikgPj0gTUlOSU1VTV9TQ0FMRV9JTkNSRU1FTlQ7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gd2lsbFNjYWxlVHJpZ2dlclpvb20oZmxvYXQgc2NhbGUpIHsKKyAgICAgICAgcmV0dXJuIGV4Y2VlZHNNaW5TY2FsZUluY3JlbWVudChzY2FsZSwgbUFjdHVhbFNjYWxlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBjYW5ab29tSW4oKSB7CisgICAgICAgIHJldHVybiBtTWF4Wm9vbVNjYWxlIC0gbUFjdHVhbFNjYWxlID4gTUlOSU1VTV9TQ0FMRV9JTkNSRU1FTlQ7CisgICAgfQorCisgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gY2FuWm9vbU91dCgpIHsKKyAgICAgICAgcmV0dXJuIG1BY3R1YWxTY2FsZSAtIG1NaW5ab29tU2NhbGUgPiBNSU5JTVVNX1NDQUxFX0lOQ1JFTUVOVDsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiB6b29tSW4oKSB7CisgICAgICAgIHJldHVybiB6b29tKDEuMjVmKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiB6b29tT3V0KCkgeworICAgICAgICByZXR1cm4gem9vbSgwLjhmKTsKKyAgICB9CisKKyAgICAvLyByZXR1cm5zIFRSVUUgaWYgem9vbSBvdXQgc3VjY2VlZHMgYW5kIEZBTFNFIGlmIG5vIHpvb20gY2hhbmdlcy4KKyAgICBwcml2YXRlIGJvb2xlYW4gem9vbShmbG9hdCB6b29tTXVsdGlwbGllcikgeworICAgICAgICAvLyBUT0RPOiBhbHRlcm5hdGl2ZWx5IHdlIGNhbiBkaXNhbGxvdyB0aGlzIGR1cmluZyBkcmF3IGhpc3RvcnkgbW9kZQorICAgICAgICBtV2ViVmlldy5zd2l0Y2hPdXREcmF3SGlzdG9yeSgpOworICAgICAgICAvLyBDZW50ZXIgem9vbWluZyB0byB0aGUgY2VudGVyIG9mIHRoZSBzY3JlZW4uCisgICAgICAgIG1ab29tQ2VudGVyWCA9IG1XZWJWaWV3LmdldFZpZXdXaWR0aCgpICogLjVmOworICAgICAgICBtWm9vbUNlbnRlclkgPSBtV2ViVmlldy5nZXRWaWV3SGVpZ2h0KCkgKiAuNWY7CisgICAgICAgIG1BbmNob3JYID0gbVdlYlZpZXcudmlld1RvQ29udGVudFgoKGludCkgbVpvb21DZW50ZXJYICsgbVdlYlZpZXcuZ2V0U2Nyb2xsWCgpKTsKKyAgICAgICAgbUFuY2hvclkgPSBtV2ViVmlldy52aWV3VG9Db250ZW50WSgoaW50KSBtWm9vbUNlbnRlclkgKyBtV2ViVmlldy5nZXRTY3JvbGxZKCkpOworICAgICAgICByZXR1cm4gc3RhcnRab29tQW5pbWF0aW9uKG1BY3R1YWxTY2FsZSAqIHpvb21NdWx0aXBsaWVyLCB0cnVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbml0aWF0ZXMgYW4gYW5pbWF0ZWQgem9vbSBvZiB0aGUgV2ViVmlldy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgbmV3IHNjYWxlIHRyaWdnZXJlZCBhbiBhbmltYXRpb24gYW5kIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBzdGFydFpvb21BbmltYXRpb24oZmxvYXQgc2NhbGUsIGJvb2xlYW4gcmVmbG93VGV4dCkgeworICAgICAgICBmbG9hdCBvbGRTY2FsZSA9IG1BY3R1YWxTY2FsZTsKKyAgICAgICAgbUluaXRpYWxTY3JvbGxYID0gbVdlYlZpZXcuZ2V0U2Nyb2xsWCgpOworICAgICAgICBtSW5pdGlhbFNjcm9sbFkgPSBtV2ViVmlldy5nZXRTY3JvbGxZKCk7CisKKyAgICAgICAgLy8gc25hcCB0byBERUZBVUxUX1NDQUxFIGlmIGl0IGlzIGNsb3NlCisgICAgICAgIGlmICghZXhjZWVkc01pblNjYWxlSW5jcmVtZW50KHNjYWxlLCBtRGVmYXVsdFNjYWxlKSkgeworICAgICAgICAgICAgc2NhbGUgPSBtRGVmYXVsdFNjYWxlOworICAgICAgICB9CisKKyAgICAgICAgc2V0Wm9vbVNjYWxlKHNjYWxlLCByZWZsb3dUZXh0KTsKKworICAgICAgICBpZiAob2xkU2NhbGUgIT0gbUFjdHVhbFNjYWxlKSB7CisgICAgICAgICAgICAvLyB1c2UgbVpvb21QaWNrZXJTY2FsZSB0byBzZWUgem9vbSBwcmV2aWV3IGZpcnN0CisgICAgICAgICAgICBtWm9vbVN0YXJ0ID0gU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCk7CisgICAgICAgICAgICBtSW52SW5pdGlhbFpvb21TY2FsZSA9IDEuMGYgLyBvbGRTY2FsZTsKKyAgICAgICAgICAgIG1JbnZGaW5hbFpvb21TY2FsZSA9IDEuMGYgLyBtQWN0dWFsU2NhbGU7CisgICAgICAgICAgICBtWm9vbVNjYWxlID0gbUFjdHVhbFNjYWxlOworICAgICAgICAgICAgbVdlYlZpZXcub25GaXhlZExlbmd0aFpvb21BbmltYXRpb25TdGFydCgpOworICAgICAgICAgICAgbVdlYlZpZXcuaW52YWxpZGF0ZSgpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgdGhlIFdlYlZpZXcncyBkcmF3aW5nIGNvZGUgd2hlbiBhIGZpeGVkIGxlbmd0aCB6b29tCisgICAgICogYW5pbWF0aW9uIGlzIG9jY3VycmluZy4gSXRzIHB1cnBvc2UgaXMgdG8gYW5pbWF0ZSB0aGUgem9vbWluZyBvZiB0aGUgY2FudmFzCisgICAgICogdG8gdGhlIGRlc2lyZWQgc2NhbGUgd2hpY2ggd2FzIHNwZWNpZmllZCBpbiBzdGFydFpvb21BbmltYXRpb24oLi4uKS4KKyAgICAgKgorICAgICAqIEEgZml4ZWQgbGVuZ3RoIGFuaW1hdGlvbiBiZWdpbnMgd2hlbiBzdGFydFpvb21BbmltYXRpb24oLi4uKSBpcyBjYWxsZWQgYW5kCisgICAgICogY29udGludWVzIHVudGlsIHRoZSBaT09NX0FOSU1BVElPTl9MRU5HVEggdGltZSBoYXMgZWxhcHNlZC4gRHVyaW5nIHRoYXQKKyAgICAgKiBpbnRlcnZhbCBlYWNoIHRpbWUgdGhlIFdlYlZpZXcgZHJhd3MgaXQgY2FsbHMgdGhpcyBmdW5jdGlvbiB3aGljaCBpcyAKKyAgICAgKiByZXNwb25zaWJsZSBmb3IgZ2VuZXJhdGluZyB0aGUgYW5pbWF0aW9uLgorICAgICAqCisgICAgICogQWRkaXRpb25hbGx5LCB0aGUgV2ViVmlldyBjYW4gY2hlY2sgdG8gc2VlIGlmIHN1Y2ggYW4gYW5pbWF0aW9uIGlzIGN1cnJlbnRseQorICAgICAqIGluIHByb2dyZXNzIGJ5IGNhbGxpbmcgaXNGaXhlZExlbmd0aEFuaW1hdGlvbkluUHJvZ3Jlc3MoKS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhbmltYXRlWm9vbShDYW52YXMgY2FudmFzKSB7CisgICAgICAgIGlmIChtWm9vbVNjYWxlID09IDApIHsKKyAgICAgICAgICAgIExvZy53KExPR1RBRywgIkEgV2ViVmlldyBpcyBhdHRlbXB0aW5nIHRvIHBlcmZvcm0gYSBmaXhlZCBsZW5ndGggIgorICAgICAgICAgICAgICAgICAgICArICJ6b29tIGFuaW1hdGlvbiB3aGVuIG5vIHpvb20gaXMgaW4gcHJvZ3Jlc3MiKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGZsb2F0IHpvb21TY2FsZTsKKyAgICAgICAgaW50IGludGVydmFsID0gKGludCkgKFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpIC0gbVpvb21TdGFydCk7CisgICAgICAgIGlmIChpbnRlcnZhbCA8IFpPT01fQU5JTUFUSU9OX0xFTkdUSCkgeworICAgICAgICAgICAgZmxvYXQgcmF0aW8gPSAoZmxvYXQpIGludGVydmFsIC8gWk9PTV9BTklNQVRJT05fTEVOR1RIOworICAgICAgICAgICAgem9vbVNjYWxlID0gMS4wZiAvIChtSW52SW5pdGlhbFpvb21TY2FsZQorICAgICAgICAgICAgICAgICAgICArIChtSW52RmluYWxab29tU2NhbGUgLSBtSW52SW5pdGlhbFpvb21TY2FsZSkgKiByYXRpbyk7CisgICAgICAgICAgICBtV2ViVmlldy5pbnZhbGlkYXRlKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB6b29tU2NhbGUgPSBtWm9vbVNjYWxlOworICAgICAgICAgICAgLy8gc2V0IG1ab29tU2NhbGUgdG8gYmUgMCBhcyB3ZSBoYXZlIGZpbmlzaGVkIGFuaW1hdGluZworICAgICAgICAgICAgbVpvb21TY2FsZSA9IDA7CisgICAgICAgICAgICBtV2ViVmlldy5vbkZpeGVkTGVuZ3RoWm9vbUFuaW1hdGlvbkVuZCgpOworICAgICAgICB9CisgICAgICAgIC8vIGNhbGN1bGF0ZSB0aGUgaW50ZXJtZWRpYXRlIHNjcm9sbCBwb3NpdGlvbi4gU2luY2Ugd2UgbmVlZCB0byB1c2UKKyAgICAgICAgLy8gem9vbVNjYWxlLCB3ZSBjYW4ndCB1c2UgdGhlIFdlYlZpZXcncyBwaW5Mb2NYL1kgZnVuY3Rpb25zIGRpcmVjdGx5LgorICAgICAgICBmbG9hdCBzY2FsZSA9IHpvb21TY2FsZSAqIG1JbnZJbml0aWFsWm9vbVNjYWxlOworICAgICAgICBpbnQgdHggPSBNYXRoLnJvdW5kKHNjYWxlICogKG1Jbml0aWFsU2Nyb2xsWCArIG1ab29tQ2VudGVyWCkgLSBtWm9vbUNlbnRlclgpOworICAgICAgICB0eCA9IC1XZWJWaWV3LnBpbkxvYyh0eCwgbVdlYlZpZXcuZ2V0Vmlld1dpZHRoKCksIE1hdGgucm91bmQobVdlYlZpZXcuZ2V0Q29udGVudFdpZHRoKCkKKyAgICAgICAgICAgICAgICAqIHpvb21TY2FsZSkpICsgbVdlYlZpZXcuZ2V0U2Nyb2xsWCgpOworICAgICAgICBpbnQgdGl0bGVIZWlnaHQgPSBtV2ViVmlldy5nZXRUaXRsZUhlaWdodCgpOworICAgICAgICBpbnQgdHkgPSBNYXRoLnJvdW5kKHNjYWxlCisgICAgICAgICAgICAgICAgKiAobUluaXRpYWxTY3JvbGxZICsgbVpvb21DZW50ZXJZIC0gdGl0bGVIZWlnaHQpCisgICAgICAgICAgICAgICAgLSAobVpvb21DZW50ZXJZIC0gdGl0bGVIZWlnaHQpKTsKKyAgICAgICAgdHkgPSAtKHR5IDw9IHRpdGxlSGVpZ2h0ID8gTWF0aC5tYXgodHksIDApIDogV2ViVmlldy5waW5Mb2ModHkKKyAgICAgICAgICAgICAgICAtIHRpdGxlSGVpZ2h0LCBtV2ViVmlldy5nZXRWaWV3SGVpZ2h0KCksIE1hdGgucm91bmQobVdlYlZpZXcuZ2V0Q29udGVudEhlaWdodCgpCisgICAgICAgICAgICAgICAgKiB6b29tU2NhbGUpKSArIHRpdGxlSGVpZ2h0KSArIG1XZWJWaWV3LmdldFNjcm9sbFkoKTsKKworICAgICAgICBjYW52YXMudHJhbnNsYXRlKHR4LCB0eSk7CisgICAgICAgIGNhbnZhcy5zY2FsZSh6b29tU2NhbGUsIHpvb21TY2FsZSk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNab29tQW5pbWF0aW5nKCkgeworICAgICAgICByZXR1cm4gaXNGaXhlZExlbmd0aEFuaW1hdGlvbkluUHJvZ3Jlc3MoKSB8fCBtUGluY2hUb1pvb21BbmltYXRpbmc7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNGaXhlZExlbmd0aEFuaW1hdGlvbkluUHJvZ3Jlc3MoKSB7CisgICAgICAgIHJldHVybiBtWm9vbVNjYWxlICE9IDA7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVmcmVzaFpvb21TY2FsZShib29sZWFuIHJlZmxvd1RleHQpIHsKKyAgICAgICAgc2V0Wm9vbVNjYWxlKG1BY3R1YWxTY2FsZSwgcmVmbG93VGV4dCwgdHJ1ZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Wm9vbVNjYWxlKGZsb2F0IHNjYWxlLCBib29sZWFuIHJlZmxvd1RleHQpIHsKKyAgICAgICAgc2V0Wm9vbVNjYWxlKHNjYWxlLCByZWZsb3dUZXh0LCBmYWxzZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNldFpvb21TY2FsZShmbG9hdCBzY2FsZSwgYm9vbGVhbiByZWZsb3dUZXh0LCBib29sZWFuIGZvcmNlKSB7CisgICAgICAgIGZpbmFsIGJvb2xlYW4gaXNTY2FsZUxlc3NUaGFuTWluWm9vbSA9IHNjYWxlIDwgbU1pblpvb21TY2FsZTsKKyAgICAgICAgc2NhbGUgPSBjb21wdXRlU2NhbGVXaXRoTGltaXRzKHNjYWxlKTsKKworICAgICAgICAvLyBkZXRlcm1pbmUgd2hldGhlciBvciBub3Qgd2UgYXJlIGluIHRoZSB6b29tIG92ZXJ2aWV3IG1vZGUKKyAgICAgICAgaWYgKGlzU2NhbGVMZXNzVGhhbk1pblpvb20gJiYgbU1pblpvb21TY2FsZSA8IG1EZWZhdWx0U2NhbGUpIHsKKyAgICAgICAgICAgIG1Jblpvb21PdmVydmlldyA9IHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtSW5ab29tT3ZlcnZpZXcgPSAhZXhjZWVkc01pblNjYWxlSW5jcmVtZW50KHNjYWxlLCBnZXRab29tT3ZlcnZpZXdTY2FsZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChyZWZsb3dUZXh0KSB7CisgICAgICAgICAgICBtVGV4dFdyYXBTY2FsZSA9IHNjYWxlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHNjYWxlICE9IG1BY3R1YWxTY2FsZSB8fCBmb3JjZSkgeworICAgICAgICAgICAgZmxvYXQgb2xkU2NhbGUgPSBtQWN0dWFsU2NhbGU7CisgICAgICAgICAgICBmbG9hdCBvbGRJbnZTY2FsZSA9IG1JbnZBY3R1YWxTY2FsZTsKKworICAgICAgICAgICAgaWYgKHNjYWxlICE9IG1BY3R1YWxTY2FsZSAmJiAhbVBpbmNoVG9ab29tQW5pbWF0aW5nKSB7CisgICAgICAgICAgICAgICAgbUNhbGxiYWNrUHJveHkub25TY2FsZUNoYW5nZWQobUFjdHVhbFNjYWxlLCBzY2FsZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1BY3R1YWxTY2FsZSA9IHNjYWxlOworICAgICAgICAgICAgbUludkFjdHVhbFNjYWxlID0gMSAvIHNjYWxlOworCisgICAgICAgICAgICBpZiAoIW1XZWJWaWV3LmRyYXdIaXN0b3J5KCkpIHsKKworICAgICAgICAgICAgICAgIC8vIElmIGhpc3RvcnkgUGljdHVyZSBpcyBkcmF3biwgZG9uJ3QgdXBkYXRlIHNjcm9sbC4gVGhleSB3aWxsCisgICAgICAgICAgICAgICAgLy8gYmUgdXBkYXRlZCB3aGVuIHdlIGdldCBvdXQgb2YgdGhhdCBtb2RlLgorICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSBvdXIgc2Nyb2xsIHNvIHdlIGRvbid0IGFwcGVhciB0byBqdW1wCisgICAgICAgICAgICAgICAgLy8gaS5lLiBrZWVwIHRoZSBjZW50ZXIgb2YgdGhlIGRvYyBpbiB0aGUgY2VudGVyIG9mIHRoZSB2aWV3CisgICAgICAgICAgICAgICAgaW50IG9sZFggPSBtV2ViVmlldy5nZXRTY3JvbGxYKCk7CisgICAgICAgICAgICAgICAgaW50IG9sZFkgPSBtV2ViVmlldy5nZXRTY3JvbGxZKCk7CisgICAgICAgICAgICAgICAgZmxvYXQgcmF0aW8gPSBzY2FsZSAqIG9sZEludlNjYWxlOworICAgICAgICAgICAgICAgIGZsb2F0IHN4ID0gcmF0aW8gKiBvbGRYICsgKHJhdGlvIC0gMSkgKiBtWm9vbUNlbnRlclg7CisgICAgICAgICAgICAgICAgZmxvYXQgc3kgPSByYXRpbyAqIG9sZFkgKyAocmF0aW8gLSAxKQorICAgICAgICAgICAgICAgICAgICAgICAgKiAobVpvb21DZW50ZXJZIC0gbVdlYlZpZXcuZ2V0VGl0bGVIZWlnaHQoKSk7CisKKyAgICAgICAgICAgICAgICAvLyBTY2FsZSBhbGwgdGhlIGNoaWxkIHZpZXdzCisgICAgICAgICAgICAgICAgbVdlYlZpZXcubVZpZXdNYW5hZ2VyLnNjYWxlQWxsKCk7CisKKyAgICAgICAgICAgICAgICAvLyBhcyB3ZSBkb24ndCBoYXZlIGFuaW1hdGlvbiBmb3Igc2NhbGluZywgZG9uJ3QgZG8gYW5pbWF0aW9uCisgICAgICAgICAgICAgICAgLy8gZm9yIHNjcm9sbGluZywgYXMgaXQgY2F1c2VzIHdlaXJkIGludGVybWVkaWF0ZSBzdGF0ZQorICAgICAgICAgICAgICAgIGludCBzY3JvbGxYID0gbVdlYlZpZXcucGluTG9jWChNYXRoLnJvdW5kKHN4KSk7CisgICAgICAgICAgICAgICAgaW50IHNjcm9sbFkgPSBtV2ViVmlldy5waW5Mb2NZKE1hdGgucm91bmQoc3kpKTsKKyAgICAgICAgICAgICAgICBpZighbVdlYlZpZXcudXBkYXRlU2Nyb2xsQ29vcmRpbmF0ZXMoc2Nyb2xsWCwgc2Nyb2xsWSkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHNjcm9sbCBwb3NpdGlvbiBpcyBhZGp1c3RlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZQorICAgICAgICAgICAgICAgICAgICAvLyB6b29tIGFuaW1hdGlvbi4gQnV0IHdlIHdhbnQgdG8gdXBkYXRlIHRoZSBXZWJLaXQgYXQgdGhlCisgICAgICAgICAgICAgICAgICAgIC8vIGVuZCBvZiB0aGUgem9vbSBhbmltYXRpb24uIFNlZSBjb21tZW50cyBpbiBvblNjYWxlRW5kKCkuCisgICAgICAgICAgICAgICAgICAgIG1XZWJWaWV3LnNlbmRPdXJWaXNpYmxlUmVjdCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gaWYgdGhlIHdlIG5lZWQgdG8gcmVmbG93IHRoZSB0ZXh0IHRoZW4gZm9yY2UgdGhlIFZJRVdfU0laRV9DSEFOR0VECisgICAgICAgICAgICAvLyBldmVudCB0byBiZSBzZW50IHRvIFdlYktpdAorICAgICAgICAgICAgbVdlYlZpZXcuc2VuZFZpZXdTaXplWm9vbShyZWZsb3dUZXh0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBkb3VibGUgdGFwIGdlc3R1cmUgY2FuIHJlc3VsdCBpbiBkaWZmZXJlbnQgYmVoYXZpb3JzIGRlcGVuZGluZyBvbiB0aGUKKyAgICAgKiBjb250ZW50IHRoYXQgaXMgdGFwcGVkLgorICAgICAqCisgICAgICogKDEpIFBMVUdJTlM6IElmIHRoZSB0YXBzIG9jY3VyIG9uIGEgcGx1Z2luIHRoZW4gd2UgbWF4aW1pemUgdGhlIHBsdWdpbiBvbgorICAgICAqIHRoZSBzY3JlZW4uIElmIHRoZSBwbHVnaW4gaXMgYWxyZWFkeSBtYXhpbWl6ZWQgdGhlbiB6b29tIHRoZSB1c2VyIGludG8KKyAgICAgKiBvdmVydmlldyBtb2RlLgorICAgICAqCisgICAgICogKDIpIEhUTUwvT1RIRVI6IElmIHRoZSB0YXBzIG9jY3VyIG91dHNpZGUgYSBwbHVnaW4gdGhlbiB0aGUgZm9sbG93aW5nCisgICAgICogaGV1cmlzdGljIGlzIHVzZWQuCisgICAgICogICBBLiBJZiB0aGUgY3VycmVudCBzY2FsZSBpcyBub3QgdGhlIHNhbWUgYXMgdGhlIHRleHQgd3JhcCBzY2FsZSBhbmQgdGhlCisgICAgICogICAgICBsYXlvdXQgYWxnb3JpdGhtIHNwZWNpZmllcyB0aGUgdXNlIG9mIE5BUlJPV19DT0xVTU5TLCB0aGVuIGZpdCB0bworICAgICAqICAgICAgY29sdW1uIGJ5IHJlZmxvd2luZyB0aGUgdGV4dC4KKyAgICAgKiAgIEIuIElmIHRoZSBwYWdlIGlzIG5vdCBpbiBvdmVydmlldyBtb2RlIHRoZW4gY2hhbmdlIHRvIG92ZXJ2aWV3IG1vZGUuCisgICAgICogICBDLiBJZiB0aGUgcGFnZSBpcyBpbiBvdmVybW9kZSB0aGVuIGNoYW5nZSB0byB0aGUgZGVmYXVsdCBzY2FsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBoYW5kbGVEb3VibGVUYXAoZmxvYXQgbGFzdFRvdWNoWCwgZmxvYXQgbGFzdFRvdWNoWSkgeworICAgICAgICBXZWJTZXR0aW5ncyBzZXR0aW5ncyA9IG1XZWJWaWV3LmdldFNldHRpbmdzKCk7CisgICAgICAgIGlmIChzZXR0aW5ncyA9PSBudWxsIHx8IHNldHRpbmdzLmdldFVzZVdpZGVWaWV3UG9ydCgpID09IGZhbHNlKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBzZXRab29tQ2VudGVyKGxhc3RUb3VjaFgsIGxhc3RUb3VjaFkpOworICAgICAgICBtQW5jaG9yWCA9IG1XZWJWaWV3LnZpZXdUb0NvbnRlbnRYKChpbnQpIGxhc3RUb3VjaFggKyBtV2ViVmlldy5nZXRTY3JvbGxYKCkpOworICAgICAgICBtQW5jaG9yWSA9IG1XZWJWaWV3LnZpZXdUb0NvbnRlbnRZKChpbnQpIGxhc3RUb3VjaFkgKyBtV2ViVmlldy5nZXRTY3JvbGxZKCkpOworICAgICAgICBzZXR0aW5ncy5zZXREb3VibGVUYXBUb2FzdENvdW50KDApOworCisgICAgICAgIC8vIHJlbW92ZSB0aGUgem9vbSBjb250cm9sIGFmdGVyIGRvdWJsZSB0YXAKKyAgICAgICAgZGlzbWlzc1pvb21QaWNrZXIoKTsKKworICAgICAgICAvKgorICAgICAgICAgKiBJZiB0aGUgZG91YmxlIHRhcCB3YXMgb24gYSBwbHVnaW4gdGhlbiBlaXRoZXIgem9vbSB0byBtYXhpbWl6ZSB0aGUKKyAgICAgICAgICogcGx1Z2luIG9uIHRoZSBzY3JlZW4gb3Igc2NhbGUgdG8gb3ZlcnZpZXcgbW9kZS4KKyAgICAgICAgICovCisgICAgICAgIFZpZXdNYW5hZ2VyLkNoaWxkVmlldyBwbHVnaW4gPSBtV2ViVmlldy5tVmlld01hbmFnZXIuaGl0VGVzdChtQW5jaG9yWCwgbUFuY2hvclkpOworICAgICAgICBpZiAocGx1Z2luICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChtV2ViVmlldy5pc1BsdWdpbkZpdE9uU2NyZWVuKHBsdWdpbikpIHsKKyAgICAgICAgICAgICAgICB6b29tVG9PdmVydmlldygpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtV2ViVmlldy5jZW50ZXJGaXRSZWN0KHBsdWdpbi54LCBwbHVnaW4ueSwgcGx1Z2luLndpZHRoLCBwbHVnaW4uaGVpZ2h0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzZXR0aW5ncy5nZXRMYXlvdXRBbGdvcml0aG0oKSA9PSBXZWJTZXR0aW5ncy5MYXlvdXRBbGdvcml0aG0uTkFSUk9XX0NPTFVNTlMKKyAgICAgICAgICAgICAgICAmJiB3aWxsU2NhbGVUcmlnZ2VyWm9vbShtVGV4dFdyYXBTY2FsZSkpIHsKKyAgICAgICAgICAgIHJlZnJlc2hab29tU2NhbGUodHJ1ZSk7CisgICAgICAgIH0gZWxzZSBpZiAoIW1Jblpvb21PdmVydmlldykgeworICAgICAgICAgICAgem9vbVRvT3ZlcnZpZXcoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHpvb21Ub0RlZmF1bHRMZXZlbCgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNldFpvb21PdmVydmlld1dpZHRoKGludCB3aWR0aCkgeworICAgICAgICBtWm9vbU92ZXJ2aWV3V2lkdGggPSB3aWR0aDsKKyAgICAgICAgbUludlpvb21PdmVydmlld1dpZHRoID0gMS4wZiAvIHdpZHRoOworICAgIH0KKworICAgIHByaXZhdGUgZmxvYXQgZ2V0Wm9vbU92ZXJ2aWV3U2NhbGUoKSB7CisgICAgICAgIHJldHVybiBtV2ViVmlldy5nZXRWaWV3V2lkdGgoKSAqIG1JbnZab29tT3ZlcnZpZXdXaWR0aDsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0luWm9vbU92ZXJ2aWV3KCkgeworICAgICAgICByZXR1cm4gbUluWm9vbU92ZXJ2aWV3OworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB6b29tVG9PdmVydmlldygpIHsKKyAgICAgICAgaWYgKCF3aWxsU2NhbGVUcmlnZ2VyWm9vbShnZXRab29tT3ZlcnZpZXdTY2FsZSgpKSkgcmV0dXJuOworCisgICAgICAgIC8vIEZvcmNlIHRoZSB0aXRsZWJhciBmdWxseSByZXZlYWwgaW4gb3ZlcnZpZXcgbW9kZQorICAgICAgICBpbnQgc2Nyb2xsWSA9IG1XZWJWaWV3LmdldFNjcm9sbFkoKTsKKyAgICAgICAgaWYgKHNjcm9sbFkgPCBtV2ViVmlldy5nZXRUaXRsZUhlaWdodCgpKSB7CisgICAgICAgICAgICBtV2ViVmlldy51cGRhdGVTY3JvbGxDb29yZGluYXRlcyhtV2ViVmlldy5nZXRTY3JvbGxYKCksIDApOworICAgICAgICB9CisgICAgICAgIHN0YXJ0Wm9vbUFuaW1hdGlvbihnZXRab29tT3ZlcnZpZXdTY2FsZSgpLCB0cnVlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgem9vbVRvRGVmYXVsdExldmVsKCkgeworICAgICAgICBpbnQgbGVmdCA9IG1XZWJWaWV3Lm5hdGl2ZUdldEJsb2NrTGVmdEVkZ2UobUFuY2hvclgsIG1BbmNob3JZLCBtQWN0dWFsU2NhbGUpOworICAgICAgICBpZiAobGVmdCAhPSBXZWJWaWV3Lk5PX0xFRlRFREdFKSB7CisgICAgICAgICAgICAvLyBhZGQgYSA1cHQgcGFkZGluZyB0byB0aGUgbGVmdCBlZGdlLgorICAgICAgICAgICAgaW50IHZpZXdMZWZ0ID0gbVdlYlZpZXcuY29udGVudFRvVmlld1gobGVmdCA8IDUgPyAwIDogKGxlZnQgLSA1KSkKKyAgICAgICAgICAgICAgICAgICAgLSBtV2ViVmlldy5nZXRTY3JvbGxYKCk7CisgICAgICAgICAgICAvLyBSZS1jYWxjdWxhdGUgdGhlIHpvb20gY2VudGVyIHNvIHRoYXQgdGhlIG5ldyBzY3JvbGwgeCB3aWxsIGJlCisgICAgICAgICAgICAvLyBvbiB0aGUgbGVmdCBlZGdlLgorICAgICAgICAgICAgaWYgKHZpZXdMZWZ0ID4gMCkgeworICAgICAgICAgICAgICAgIG1ab29tQ2VudGVyWCA9IHZpZXdMZWZ0ICogbURlZmF1bHRTY2FsZSAvIChtRGVmYXVsdFNjYWxlIC0gbUFjdHVhbFNjYWxlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbVdlYlZpZXcuc2Nyb2xsQnkodmlld0xlZnQsIDApOworICAgICAgICAgICAgICAgIG1ab29tQ2VudGVyWCA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc3RhcnRab29tQW5pbWF0aW9uKG1EZWZhdWx0U2NhbGUsIHRydWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHVwZGF0ZU11bHRpVG91Y2hTdXBwb3J0KENvbnRleHQgY29udGV4dCkgeworICAgICAgICAvLyBjaGVjayB0aGUgcHJlY29uZGl0aW9ucworICAgICAgICBhc3NlcnQgbVdlYlZpZXcuZ2V0U2V0dGluZ3MoKSAhPSBudWxsOworCisgICAgICAgIFdlYlNldHRpbmdzIHNldHRpbmdzID0gbVdlYlZpZXcuZ2V0U2V0dGluZ3MoKTsKKyAgICAgICAgbVN1cHBvcnRNdWx0aVRvdWNoID0gY29udGV4dC5nZXRQYWNrYWdlTWFuYWdlcigpLmhhc1N5c3RlbUZlYXR1cmUoCisgICAgICAgICAgICAgICAgUGFja2FnZU1hbmFnZXIuRkVBVFVSRV9UT1VDSFNDUkVFTl9NVUxUSVRPVUNIKQorICAgICAgICAgICAgICAgICYmIHNldHRpbmdzLnN1cHBvcnRab29tKCkgJiYgc2V0dGluZ3MuZ2V0QnVpbHRJblpvb21Db250cm9scygpOworICAgICAgICBpZiAobVN1cHBvcnRNdWx0aVRvdWNoICYmIChtU2NhbGVEZXRlY3RvciA9PSBudWxsKSkgeworICAgICAgICAgICAgbVNjYWxlRGV0ZWN0b3IgPSBuZXcgU2NhbGVHZXN0dXJlRGV0ZWN0b3IoY29udGV4dCwgbmV3IFNjYWxlRGV0ZWN0b3JMaXN0ZW5lcigpKTsKKyAgICAgICAgfSBlbHNlIGlmICghbVN1cHBvcnRNdWx0aVRvdWNoICYmIChtU2NhbGVEZXRlY3RvciAhPSBudWxsKSkgeworICAgICAgICAgICAgbVNjYWxlRGV0ZWN0b3IgPSBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNNdWx0aVRvdWNoWm9vbSgpIHsKKyAgICAgICAgcmV0dXJuIG1TdXBwb3J0TXVsdGlUb3VjaDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBOb3RpZmllcyB0aGUgY2FsbGVyIHRoYXQgdGhlIFpvb21NYW5hZ2VyIGlzIHJlcXVlc3RpbmcgdGhhdCBzY2FsZSByZWxhdGVkCisgICAgICogdXBkYXRlcyBzaG91bGQgbm90IGJlIHNlbnQgdG8gd2Via2l0LiBUaGlzIGNhbiBvY2N1ciBpbiBjYXNlcyB3aGVyZSB0aGUKKyAgICAgKiBab29tTWFuYWdlciBpcyBwZXJmb3JtaW5nIGFuIGFuaW1hdGlvbiBhbmQgZG9lcyBub3Qgd2FudCB3ZWJraXQgdG8gdXBkYXRlCisgICAgICogdW50aWwgdGhlIGFuaW1hdGlvbiBpcyBjb21wbGV0ZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBzY2FsZSByZWxhdGVkIHVwZGF0ZXMgc2hvdWxkIG5vdCBiZSBzZW50IHRvIHdlYmtpdCBhbmQKKyAgICAgKiAgICAgICAgIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1ByZXZlbnRpbmdXZWJraXRVcGRhdGVzKCkgeworICAgICAgICAvLyBjdXJyZW50bHkgb25seSBhbmltYXRpbmcgYSBtdWx0aS10b3VjaCB6b29tIHByZXZlbnRzIHVwZGF0ZXMsIGJ1dAorICAgICAgICAvLyBvdGhlcnMgY2FuIGFkZCB0aGVpciBvd24gY29uZGl0aW9ucyB0byB0aGlzIG1ldGhvZCBpZiBuZWNlc3NhcnkuCisgICAgICAgIHJldHVybiBtUGluY2hUb1pvb21BbmltYXRpbmc7CisgICAgfQorCisgICAgcHVibGljIFNjYWxlR2VzdHVyZURldGVjdG9yIGdldE11bHRpVG91Y2hHZXN0dXJlRGV0ZWN0b3IoKSB7CisgICAgICAgIHJldHVybiBtU2NhbGVEZXRlY3RvcjsKKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIFNjYWxlRGV0ZWN0b3JMaXN0ZW5lciBpbXBsZW1lbnRzIFNjYWxlR2VzdHVyZURldGVjdG9yLk9uU2NhbGVHZXN0dXJlTGlzdGVuZXIgeworCisgICAgICAgIHB1YmxpYyBib29sZWFuIG9uU2NhbGVCZWdpbihTY2FsZUdlc3R1cmVEZXRlY3RvciBkZXRlY3RvcikgeworICAgICAgICAgICAgZGlzbWlzc1pvb21QaWNrZXIoKTsKKyAgICAgICAgICAgIG1XZWJWaWV3Lm1WaWV3TWFuYWdlci5zdGFydFpvb20oKTsKKyAgICAgICAgICAgIG1XZWJWaWV3Lm9uUGluY2hUb1pvb21BbmltYXRpb25TdGFydCgpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBvblNjYWxlKFNjYWxlR2VzdHVyZURldGVjdG9yIGRldGVjdG9yKSB7CisgICAgICAgICAgICBmbG9hdCBzY2FsZSA9IE1hdGgucm91bmQoZGV0ZWN0b3IuZ2V0U2NhbGVGYWN0b3IoKSAqIG1BY3R1YWxTY2FsZSAqIDEwMCkgKiAwLjAxZjsKKyAgICAgICAgICAgIGlmICh3aWxsU2NhbGVUcmlnZ2VyWm9vbShzY2FsZSkpIHsKKyAgICAgICAgICAgICAgICBtUGluY2hUb1pvb21BbmltYXRpbmcgPSB0cnVlOworICAgICAgICAgICAgICAgIC8vIGxpbWl0IHRoZSBzY2FsZSBjaGFuZ2UgcGVyIHN0ZXAKKyAgICAgICAgICAgICAgICBpZiAoc2NhbGUgPiBtQWN0dWFsU2NhbGUpIHsKKyAgICAgICAgICAgICAgICAgICAgc2NhbGUgPSBNYXRoLm1pbihzY2FsZSwgbUFjdHVhbFNjYWxlICogMS4yNWYpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHNjYWxlID0gTWF0aC5tYXgoc2NhbGUsIG1BY3R1YWxTY2FsZSAqIDAuOGYpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzZXRab29tQ2VudGVyKGRldGVjdG9yLmdldEZvY3VzWCgpLCBkZXRlY3Rvci5nZXRGb2N1c1koKSk7CisgICAgICAgICAgICAgICAgc2V0Wm9vbVNjYWxlKHNjYWxlLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgbVdlYlZpZXcuaW52YWxpZGF0ZSgpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgb25TY2FsZUVuZChTY2FsZUdlc3R1cmVEZXRlY3RvciBkZXRlY3RvcikgeworICAgICAgICAgICAgaWYgKG1QaW5jaFRvWm9vbUFuaW1hdGluZykgeworICAgICAgICAgICAgICAgIG1QaW5jaFRvWm9vbUFuaW1hdGluZyA9IGZhbHNlOworICAgICAgICAgICAgICAgIG1BbmNob3JYID0gbVdlYlZpZXcudmlld1RvQ29udGVudFgoKGludCkgbVpvb21DZW50ZXJYICsgbVdlYlZpZXcuZ2V0U2Nyb2xsWCgpKTsKKyAgICAgICAgICAgICAgICBtQW5jaG9yWSA9IG1XZWJWaWV3LnZpZXdUb0NvbnRlbnRZKChpbnQpIG1ab29tQ2VudGVyWSArIG1XZWJWaWV3LmdldFNjcm9sbFkoKSk7CisgICAgICAgICAgICAgICAgLy8gZG9uJ3QgcmVmbG93IHdoZW4gem9vbSBpbjsgd2hlbiB6b29tIG91dCwgZG8gcmVmbG93IGlmIHRoZQorICAgICAgICAgICAgICAgIC8vIG5ldyBzY2FsZSBpcyBhbG1vc3QgbWluaW11bSBzY2FsZTsKKyAgICAgICAgICAgICAgICBib29sZWFuIHJlZmxvd05vdyA9ICFjYW5ab29tT3V0KCkgfHwgKG1BY3R1YWxTY2FsZSA8PSAwLjggKiBtVGV4dFdyYXBTY2FsZSk7CisgICAgICAgICAgICAgICAgLy8gZm9yY2Ugem9vbSBhZnRlciBtUHJldmlld1pvb21Pbmx5IGlzIHNldCB0byBmYWxzZSBzbyB0aGF0IHRoZQorICAgICAgICAgICAgICAgIC8vIG5ldyB2aWV3IHNpemUgd2lsbCBiZSBwYXNzZWQgdG8gdGhlIFdlYktpdAorICAgICAgICAgICAgICAgIHJlZnJlc2hab29tU2NhbGUocmVmbG93Tm93KTsKKyAgICAgICAgICAgICAgICAvLyBjYWxsIGludmFsaWRhdGUoKSB0byBkcmF3IHdpdGhvdXQgem9vbSBmaWx0ZXIKKyAgICAgICAgICAgICAgICBtV2ViVmlldy5pbnZhbGlkYXRlKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1XZWJWaWV3Lm1WaWV3TWFuYWdlci5lbmRab29tKCk7CisgICAgICAgICAgICBtV2ViVmlldy5vblBpbmNoVG9ab29tQW5pbWF0aW9uRW5kKGRldGVjdG9yKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG9uU2l6ZUNoYW5nZWQoaW50IHcsIGludCBoLCBpbnQgb3csIGludCBvaCkgeworICAgICAgICAvLyByZXNldCB6b29tIGFuZCBhbmNob3IgdG8gdGhlIHRvcCBsZWZ0IGNvcm5lciBvZiB0aGUgc2NyZWVuCisgICAgICAgIC8vIHVubGVzcyB3ZSBhcmUgYWxyZWFkeSB6b29taW5nCisgICAgICAgIGlmICghaXNGaXhlZExlbmd0aEFuaW1hdGlvbkluUHJvZ3Jlc3MoKSkgeworICAgICAgICAgICAgaW50IHZpc2libGVUaXRsZUhlaWdodCA9IG1XZWJWaWV3LmdldFZpc2libGVUaXRsZUhlaWdodCgpOworICAgICAgICAgICAgbVpvb21DZW50ZXJYID0gMDsKKyAgICAgICAgICAgIG1ab29tQ2VudGVyWSA9IHZpc2libGVUaXRsZUhlaWdodDsKKyAgICAgICAgICAgIG1BbmNob3JYID0gbVdlYlZpZXcudmlld1RvQ29udGVudFgobVdlYlZpZXcuZ2V0U2Nyb2xsWCgpKTsKKyAgICAgICAgICAgIG1BbmNob3JZID0gbVdlYlZpZXcudmlld1RvQ29udGVudFkodmlzaWJsZVRpdGxlSGVpZ2h0ICsgbVdlYlZpZXcuZ2V0U2Nyb2xsWSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHVwZGF0ZSBtTWluWm9vbVNjYWxlIGlmIHRoZSBtaW5pbXVtIHpvb20gc2NhbGUgaXMgbm90IGZpeGVkCisgICAgICAgIGlmICghbU1pblpvb21TY2FsZUZpeGVkKSB7CisgICAgICAgICAgICAvLyB3aGVuIGNoYW5nZSBmcm9tIG5hcnJvdyBzY3JlZW4gdG8gd2lkZSBzY3JlZW4sIHRoZSBuZXcgdmlld1dpZHRoCisgICAgICAgICAgICAvLyBjYW4gYmUgd2lkZXIgdGhhbiB0aGUgb2xkIGNvbnRlbnQgd2lkdGguIFdlIGxpbWl0IHRoZSBtaW5pbXVtCisgICAgICAgICAgICAvLyBzY2FsZSB0byAxLjBmLiBUaGUgcHJvcGVyIG1pbmltdW0gc2NhbGUgd2lsbCBiZSBjYWxjdWxhdGVkIHdoZW4KKyAgICAgICAgICAgIC8vIHRoZSBuZXcgcGljdHVyZSBzaG93cyB1cC4KKyAgICAgICAgICAgIG1NaW5ab29tU2NhbGUgPSBNYXRoLm1pbigxLjBmLCAoZmxvYXQpIG1XZWJWaWV3LmdldFZpZXdXaWR0aCgpCisgICAgICAgICAgICAgICAgICAgIC8gKG1XZWJWaWV3LmRyYXdIaXN0b3J5KCkgPyBtV2ViVmlldy5nZXRIaXN0b3J5UGljdHVyZVdpZHRoKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG1ab29tT3ZlcnZpZXdXaWR0aCkpOworICAgICAgICAgICAgLy8gbGltaXQgdGhlIG1pblpvb21TY2FsZSB0byB0aGUgaW5pdGlhbFNjYWxlIGlmIGl0IGlzIHNldAorICAgICAgICAgICAgaWYgKG1Jbml0aWFsU2NhbGUgPiAwICYmIG1Jbml0aWFsU2NhbGUgPCBtTWluWm9vbVNjYWxlKSB7CisgICAgICAgICAgICAgICAgbU1pblpvb21TY2FsZSA9IG1Jbml0aWFsU2NhbGU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBkaXNtaXNzWm9vbVBpY2tlcigpOworCisgICAgICAgIC8vIG9uU2l6ZUNoYW5nZWQoKSBpcyBjYWxsZWQgZHVyaW5nIFdlYlZpZXcgbGF5b3V0LiBBbmQgYW55CisgICAgICAgIC8vIHJlcXVlc3RMYXlvdXQoKSBpcyBibG9ja2VkIGR1cmluZyBsYXlvdXQuIEFzIHJlZnJlc2hab29tU2NhbGUoKSB3aWxsCisgICAgICAgIC8vIGNhdXNlIGl0cyBjaGlsZCBWaWV3IHRvIHJlcG9zaXRpb24gaXRzZWxmIHRocm91Z2ggVmlld01hbmFnZXIncworICAgICAgICAvLyBzY2FsZUFsbCgpLCB3ZSBuZWVkIHRvIHBvc3QgYSBSdW5uYWJsZSB0byBlbnN1cmUgcmVxdWVzdExheW91dCgpLgorICAgICAgICAvLyBBZGRpdGlvbmFsbHksIG9ubHkgdXBkYXRlIHRoZSB0ZXh0IHdyYXAgc2NhbGUgaWYgdGhlIHdpZHRoIGNoYW5nZWQuCisgICAgICAgIG1XZWJWaWV3LnBvc3QobmV3IFBvc3RTY2FsZSh3ICE9IG93KSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBQb3N0U2NhbGUgaW1wbGVtZW50cyBSdW5uYWJsZSB7CisgICAgICAgIGZpbmFsIGJvb2xlYW4gbVVwZGF0ZVRleHRXcmFwOworCisgICAgICAgIHB1YmxpYyBQb3N0U2NhbGUoYm9vbGVhbiB1cGRhdGVUZXh0V3JhcCkgeworICAgICAgICAgICAgbVVwZGF0ZVRleHRXcmFwID0gdXBkYXRlVGV4dFdyYXA7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICBpZiAobVdlYlZpZXcuZ2V0V2ViVmlld0NvcmUoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgLy8gd2UgYWx3YXlzIGZvcmNlLCBpbiBjYXNlIG91ciBoZWlnaHQgY2hhbmdlZCwgaW4gd2hpY2ggY2FzZSB3ZQorICAgICAgICAgICAgICAgIC8vIHN0aWxsIHdhbnQgdG8gc2VuZCB0aGUgbm90aWZpY2F0aW9uIG92ZXIgdG8gd2Via2l0LgorICAgICAgICAgICAgICAgIHJlZnJlc2hab29tU2NhbGUobVVwZGF0ZVRleHRXcmFwKTsKKyAgICAgICAgICAgICAgICAvLyB1cGRhdGUgdGhlIHpvb20gYnV0dG9ucyBhcyB0aGUgc2NhbGUgY2FuIGJlIGNoYW5nZWQKKyAgICAgICAgICAgICAgICB1cGRhdGVab29tUGlja2VyKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB1cGRhdGVab29tUmFuZ2UoV2ViVmlld0NvcmUuVmlld1N0YXRlIHZpZXdTdGF0ZSwKKyAgICAgICAgICAgIGludCB2aWV3V2lkdGgsIGludCBtaW5QcmVmV2lkdGgpIHsKKyAgICAgICAgaWYgKHZpZXdTdGF0ZS5tTWluU2NhbGUgPT0gMCkgeworICAgICAgICAgICAgaWYgKHZpZXdTdGF0ZS5tTW9iaWxlU2l0ZSkgeworICAgICAgICAgICAgICAgIGlmIChtaW5QcmVmV2lkdGggPiBNYXRoLm1heCgwLCB2aWV3V2lkdGgpKSB7CisgICAgICAgICAgICAgICAgICAgIG1NaW5ab29tU2NhbGUgPSAoZmxvYXQpIHZpZXdXaWR0aCAvIG1pblByZWZXaWR0aDsKKyAgICAgICAgICAgICAgICAgICAgbU1pblpvb21TY2FsZUZpeGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbU1pblpvb21TY2FsZSA9IHZpZXdTdGF0ZS5tRGVmYXVsdFNjYWxlOworICAgICAgICAgICAgICAgICAgICBtTWluWm9vbVNjYWxlRml4ZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbU1pblpvb21TY2FsZSA9IG1EZWZhdWx0TWluWm9vbVNjYWxlOworICAgICAgICAgICAgICAgIG1NaW5ab29tU2NhbGVGaXhlZCA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbU1pblpvb21TY2FsZSA9IHZpZXdTdGF0ZS5tTWluU2NhbGU7CisgICAgICAgICAgICBtTWluWm9vbVNjYWxlRml4ZWQgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIGlmICh2aWV3U3RhdGUubU1heFNjYWxlID09IDApIHsKKyAgICAgICAgICAgIG1NYXhab29tU2NhbGUgPSBtRGVmYXVsdE1heFpvb21TY2FsZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1NYXhab29tU2NhbGUgPSB2aWV3U3RhdGUubU1heFNjYWxlOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVXBkYXRlcyB6b29tIHZhbHVlcyB3aGVuIFdlYmtpdCBwcm9kdWNlcyBhIG5ldyBwaWN0dXJlLiBUaGlzIG1ldGhvZAorICAgICAqIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBmcm9tIHRoZSBVSSB0aHJlYWQncyBtZXNzYWdlIGhhbmRsZXIuCisgICAgICovCisgICAgcHVibGljIHZvaWQgb25OZXdQaWN0dXJlKFdlYlZpZXdDb3JlLkRyYXdEYXRhIGRyYXdEYXRhKSB7CisgICAgICAgIGZpbmFsIGludCB2aWV3V2lkdGggPSBtV2ViVmlldy5nZXRWaWV3V2lkdGgoKTsKKworICAgICAgICBpZiAobVdlYlZpZXcuZ2V0U2V0dGluZ3MoKS5nZXRVc2VXaWRlVmlld1BvcnQoKSkgeworICAgICAgICAgICAgLy8gbGltaXQgbVpvb21PdmVydmlld1dpZHRoIHVwcGVyIGJvdW5kIHRvCisgICAgICAgICAgICAvLyBzTWF4Vmlld3BvcnRXaWR0aCBzbyB0aGF0IGlmIHRoZSBwYWdlIGRvZXNuJ3QgYmVoYXZlCisgICAgICAgICAgICAvLyB3ZWxsLCB0aGUgV2ViVmlldyB3b24ndCBnbyBpbnNhbmUuIGxpbWl0IHRoZSBsb3dlcgorICAgICAgICAgICAgLy8gYm91bmQgdG8gbWF0Y2ggdGhlIGRlZmF1bHQgc2NhbGUgZm9yIG1vYmlsZSBzaXRlcy4KKyAgICAgICAgICAgIHNldFpvb21PdmVydmlld1dpZHRoKE1hdGgubWluKFdlYlZpZXcuc01heFZpZXdwb3J0V2lkdGgsCisgICAgICAgICAgICAgICAgICAgIE1hdGgubWF4KChpbnQpICh2aWV3V2lkdGggKiBtSW52RGVmYXVsdFNjYWxlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXRoLm1heChkcmF3RGF0YS5tTWluUHJlZldpZHRoLCBkcmF3RGF0YS5tVmlld1BvaW50LngpKSkpOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgZmxvYXQgem9vbU92ZXJ2aWV3U2NhbGUgPSBnZXRab29tT3ZlcnZpZXdTY2FsZSgpOworICAgICAgICBpZiAoIW1NaW5ab29tU2NhbGVGaXhlZCkgeworICAgICAgICAgICAgbU1pblpvb21TY2FsZSA9IHpvb21PdmVydmlld1NjYWxlOworICAgICAgICB9CisgICAgICAgIC8vIGZpdCB0aGUgY29udGVudCB3aWR0aCB0byB0aGUgY3VycmVudCB2aWV3LiBJZ25vcmUgdGhlIHJvdW5kaW5nIGVycm9yIGNhc2UuCisgICAgICAgIGlmICghbVdlYlZpZXcuZHJhd0hpc3RvcnkoKSAmJiAobUluWm9vbU92ZXJ2aWV3IHx8IG1Jbml0aWFsWm9vbU92ZXJ2aWV3KQorICAgICAgICAgICAgICAgICYmIE1hdGguYWJzKCh2aWV3V2lkdGggKiBtSW52QWN0dWFsU2NhbGUpIC0gbVpvb21PdmVydmlld1dpZHRoKSA+IDEpIHsKKyAgICAgICAgICAgIG1Jbml0aWFsWm9vbU92ZXJ2aWV3ID0gZmFsc2U7CisgICAgICAgICAgICBzZXRab29tU2NhbGUoem9vbU92ZXJ2aWV3U2NhbGUsICF3aWxsU2NhbGVUcmlnZ2VyWm9vbShtVGV4dFdyYXBTY2FsZSkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVXBkYXRlcyB6b29tIHZhbHVlcyBhZnRlciBXZWJraXQgY29tcGxldGVzIHRoZSBpbml0aWFsIHBhZ2UgbGF5b3V0LiBJdAorICAgICAqIGlzIGNhbGxlZCB3aGVuIHZpc2l0aW5nIGEgcGFnZSBmb3IgdGhlIGZpcnN0IHRpbWUgYXMgd2VsbCBhcyB3aGVuIHRoZQorICAgICAqIHVzZXIgbmF2aWdhdGVzIGJhY2sgdG8gYSBwYWdlIChpbiB3aGljaCBjYXNlIHdlIG1heSBuZWVkIHRvIHJlc3RvcmUgdGhlCisgICAgICogem9vbSBsZXZlbHMgdG8gdGhlIHN0YXRlIHRoZXkgd2VyZSB3aGVuIHlvdSBsZWZ0IHRoZSBwYWdlKS4gVGhpcyBtZXRob2QKKyAgICAgKiBzaG91bGQgb25seSBiZSBjYWxsZWQgZnJvbSB0aGUgVUkgdGhyZWFkJ3MgbWVzc2FnZSBoYW5kbGVyLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG9uRmlyc3RMYXlvdXQoV2ViVmlld0NvcmUuRHJhd0RhdGEgZHJhd0RhdGEpIHsKKyAgICAgICAgLy8gcHJlY29uZGl0aW9uIGNoZWNrCisgICAgICAgIGFzc2VydCBkcmF3RGF0YSAhPSBudWxsOworICAgICAgICBhc3NlcnQgZHJhd0RhdGEubVZpZXdTdGF0ZSAhPSBudWxsOworICAgICAgICBhc3NlcnQgbVdlYlZpZXcuZ2V0U2V0dGluZ3MoKSAhPSBudWxsOworCisgICAgICAgIFdlYlZpZXdDb3JlLlZpZXdTdGF0ZSB2aWV3U3RhdGUgPSBkcmF3RGF0YS5tVmlld1N0YXRlOworICAgICAgICBmaW5hbCBQb2ludCB2aWV3U2l6ZSA9IGRyYXdEYXRhLm1WaWV3UG9pbnQ7CisgICAgICAgIHVwZGF0ZVpvb21SYW5nZSh2aWV3U3RhdGUsIHZpZXdTaXplLngsIGRyYXdEYXRhLm1NaW5QcmVmV2lkdGgpOworCisgICAgICAgIGlmICghbVdlYlZpZXcuZHJhd0hpc3RvcnkoKSkgeworICAgICAgICAgICAgZmluYWwgZmxvYXQgc2NhbGU7CisgICAgICAgICAgICBmaW5hbCBib29sZWFuIHJlZmxvd1RleHQ7CisKKyAgICAgICAgICAgIGlmIChtSW5pdGlhbFNjYWxlID4gMCkgeworICAgICAgICAgICAgICAgIHNjYWxlID0gbUluaXRpYWxTY2FsZTsKKyAgICAgICAgICAgICAgICByZWZsb3dUZXh0ID0gZXhjZWVkc01pblNjYWxlSW5jcmVtZW50KG1UZXh0V3JhcFNjYWxlLCBzY2FsZSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHZpZXdTdGF0ZS5tVmlld1NjYWxlID4gMCkgeworICAgICAgICAgICAgICAgIG1UZXh0V3JhcFNjYWxlID0gdmlld1N0YXRlLm1UZXh0V3JhcFNjYWxlOworICAgICAgICAgICAgICAgIHNjYWxlID0gdmlld1N0YXRlLm1WaWV3U2NhbGU7CisgICAgICAgICAgICAgICAgcmVmbG93VGV4dCA9IGZhbHNlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBXZWJTZXR0aW5ncyBzZXR0aW5ncyA9IG1XZWJWaWV3LmdldFNldHRpbmdzKCk7CisgICAgICAgICAgICAgICAgaWYgKHNldHRpbmdzLmdldFVzZVdpZGVWaWV3UG9ydCgpICYmIHNldHRpbmdzLmdldExvYWRXaXRoT3ZlcnZpZXdNb2RlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbUluaXRpYWxab29tT3ZlcnZpZXcgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBzY2FsZSA9IChmbG9hdCkgbVdlYlZpZXcuZ2V0Vmlld1dpZHRoKCkgLyBXZWJWaWV3LkRFRkFVTFRfVklFV1BPUlRfV0lEVEg7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgc2NhbGUgPSB2aWV3U3RhdGUubVRleHRXcmFwU2NhbGU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJlZmxvd1RleHQgPSBleGNlZWRzTWluU2NhbGVJbmNyZW1lbnQobVRleHRXcmFwU2NhbGUsIHNjYWxlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldFpvb21TY2FsZShzY2FsZSwgcmVmbG93VGV4dCk7CisKKyAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgem9vbSBidXR0b25zIGFzIHRoZSBzY2FsZSBjYW4gYmUgY2hhbmdlZAorICAgICAgICAgICAgdXBkYXRlWm9vbVBpY2tlcigpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2F2ZVpvb21TdGF0ZShCdW5kbGUgYikgeworICAgICAgICBiLnB1dEZsb2F0KCJzY2FsZSIsIG1BY3R1YWxTY2FsZSk7CisgICAgICAgIGIucHV0RmxvYXQoInRleHR3cmFwU2NhbGUiLCBtVGV4dFdyYXBTY2FsZSk7CisgICAgICAgIGIucHV0Qm9vbGVhbigib3ZlcnZpZXciLCBtSW5ab29tT3ZlcnZpZXcpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlc3RvcmVab29tU3RhdGUoQnVuZGxlIGIpIHsKKyAgICAgICAgLy8gYXMgZ2V0V2lkdGgoKSAvIGdldEhlaWdodCgpIG9mIHRoZSB2aWV3IGFyZSBub3QgYXZhaWxhYmxlIHlldCwgc2V0IHVwCisgICAgICAgIC8vIG1BY3R1YWxTY2FsZSwgc28gdGhhdCB3aGVuIG9uU2l6ZUNoYW5nZWQoKSBpcyBjYWxsZWQsIHRoZSByZXN0IHdpbGwKKyAgICAgICAgLy8gYmUgc2V0IGNvcnJlY3RseQorICAgICAgICBtQWN0dWFsU2NhbGUgPSBiLmdldEZsb2F0KCJzY2FsZSIsIDEuMGYpOworICAgICAgICBtSW52QWN0dWFsU2NhbGUgPSAxIC8gbUFjdHVhbFNjYWxlOworICAgICAgICBtVGV4dFdyYXBTY2FsZSA9IGIuZ2V0RmxvYXQoInRleHR3cmFwU2NhbGUiLCBtQWN0dWFsU2NhbGUpOworICAgICAgICBtSW5ab29tT3ZlcnZpZXcgPSBiLmdldEJvb2xlYW4oIm92ZXJ2aWV3Iik7CisgICAgfQorCisgICAgcHJpdmF0ZSBab29tQ29udHJvbEJhc2UgZ2V0Q3VycmVudFpvb21Db250cm9sKCkgeworICAgICAgICBpZiAobVdlYlZpZXcuZ2V0U2V0dGluZ3MoKSAhPSBudWxsICYmIG1XZWJWaWV3LmdldFNldHRpbmdzKCkuc3VwcG9ydFpvb20oKSkgeworICAgICAgICAgICAgaWYgKG1XZWJWaWV3LmdldFNldHRpbmdzKCkuZ2V0QnVpbHRJblpvb21Db250cm9scygpKSB7CisgICAgICAgICAgICAgICAgaWYgKG1FbWJlZGRlZFpvb21Db250cm9sID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbUVtYmVkZGVkWm9vbUNvbnRyb2wgPSBuZXcgWm9vbUNvbnRyb2xFbWJlZGRlZCh0aGlzLCBtV2ViVmlldyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBtRW1iZWRkZWRab29tQ29udHJvbDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKG1FeHRlcm5hbFpvb21Db250cm9sID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbUV4dGVybmFsWm9vbUNvbnRyb2wgPSBuZXcgWm9vbUNvbnRyb2xFeHRlcm5hbChtV2ViVmlldyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBtRXh0ZXJuYWxab29tQ29udHJvbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBpbnZva2Vab29tUGlja2VyKCkgeworICAgICAgICBab29tQ29udHJvbEJhc2UgY29udHJvbCA9IGdldEN1cnJlbnRab29tQ29udHJvbCgpOworICAgICAgICBpZiAoY29udHJvbCAhPSBudWxsKSB7CisgICAgICAgICAgICBjb250cm9sLnNob3coKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGRpc21pc3Nab29tUGlja2VyKCkgeworICAgICAgICBab29tQ29udHJvbEJhc2UgY29udHJvbCA9IGdldEN1cnJlbnRab29tQ29udHJvbCgpOworICAgICAgICBpZiAoY29udHJvbCAhPSBudWxsKSB7CisgICAgICAgICAgICBjb250cm9sLmhpZGUoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzWm9vbVBpY2tlclZpc2libGUoKSB7CisgICAgICAgIFpvb21Db250cm9sQmFzZSBjb250cm9sID0gZ2V0Q3VycmVudFpvb21Db250cm9sKCk7CisgICAgICAgIHJldHVybiAoY29udHJvbCAhPSBudWxsKSA/IGNvbnRyb2wuaXNWaXNpYmxlKCkgOiBmYWxzZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB1cGRhdGVab29tUGlja2VyKCkgeworICAgICAgICBab29tQ29udHJvbEJhc2UgY29udHJvbCA9IGdldEN1cnJlbnRab29tQ29udHJvbCgpOworICAgICAgICBpZiAoY29udHJvbCAhPSBudWxsKSB7CisgICAgICAgICAgICBjb250cm9sLnVwZGF0ZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGVtYmVkZGVkIHpvb20gY29udHJvbCBpbnRlcmNlcHRzIHRvdWNoIGV2ZW50cyBhbmQgYXV0b21hdGljYWxseSBzdGF5cworICAgICAqIHZpc2libGUuIFRoZSBleHRlcm5hbCBjb250cm9sIG5lZWRzIHRvIGNvbnN0YW50bHkgcmVmcmVzaCBpdHMgaW50ZXJuYWwKKyAgICAgKiB0aW1lciB0byBzdGF5IHZpc2libGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQga2VlcFpvb21QaWNrZXJWaXNpYmxlKCkgeworICAgICAgICBab29tQ29udHJvbEJhc2UgY29udHJvbCA9IGdldEN1cnJlbnRab29tQ29udHJvbCgpOworICAgICAgICBpZiAoY29udHJvbCAhPSBudWxsICYmIGNvbnRyb2wgPT0gbUV4dGVybmFsWm9vbUNvbnRyb2wpIHsKKyAgICAgICAgICAgIGNvbnRyb2wuc2hvdygpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIFZpZXcgZ2V0RXh0ZXJuYWxab29tUGlja2VyKCkgeworICAgICAgICBab29tQ29udHJvbEJhc2UgY29udHJvbCA9IGdldEN1cnJlbnRab29tQ29udHJvbCgpOworICAgICAgICBpZiAoY29udHJvbCAhPSBudWxsICYmIGNvbnRyb2wgPT0gbUV4dGVybmFsWm9vbUNvbnRyb2wpIHsKKyAgICAgICAgICAgIHJldHVybiBtRXh0ZXJuYWxab29tQ29udHJvbC5nZXRDb250cm9scygpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJydW50aW1lL1dlYlJ1bnRpbWVBY3Rpdml0eS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2VicnVudGltZS9XZWJSdW50aW1lQWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZGExYTdhCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2VicnVudGltZS9XZWJSdW50aW1lQWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDE3NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC53ZWJydW50aW1lOworCitpbXBvcnQgYW5kcm9pZC5NYW5pZmVzdDsKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5BY3Rpdml0eUluZm87CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93OworaW1wb3J0IGFuZHJvaWQud2Via2l0Lkdlb2xvY2F0aW9uUGVybWlzc2lvbnM7CitpbXBvcnQgYW5kcm9pZC53ZWJraXQuV2ViQ2hyb21lQ2xpZW50OworaW1wb3J0IGFuZHJvaWQud2Via2l0LldlYlZpZXc7CitpbXBvcnQgYW5kcm9pZC53ZWJraXQuV2ViVmlld0NsaWVudDsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5JbWFnZVZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuVG9hc3Q7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SOworCitpbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKKworLyoqCisgKiBUaGUgcnVudGltZSB1c2VkIHRvIGRpc3BsYXkgaW5zdGFsbGVkIHdlYiBhcHBsaWNhdGlvbnMuCisgKiBAaGlkZQorICovCitwdWJsaWMgY2xhc3MgV2ViUnVudGltZUFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkKK3sKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgTE9HVEFHID0gIldlYlJ1bnRpbWVBY3Rpdml0eSI7CisKKyAgICBwcml2YXRlIFdlYlZpZXcgbVdlYlZpZXc7CisgICAgcHJpdmF0ZSBVUkwgbUJhc2VVcmw7CisgICAgcHJpdmF0ZSBJbWFnZVZpZXcgbVNwbGFzaFNjcmVlbjsKKworICAgIC8qKiBDYWxsZWQgd2hlbiB0aGUgYWN0aXZpdHkgaXMgZmlyc3QgY3JlYXRlZC4gKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKQorICAgIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKworICAgICAgICAvLyBDYW4ndCBnZXQgbWV0YSBkYXRhIHVzaW5nIGdldEFwcGxpY2F0aW9uSW5mbygpIGFzIGl0IGRvZXNuJ3QgcGFzcyBHRVRfTUVUQV9EQVRBCisgICAgICAgIFBhY2thZ2VNYW5hZ2VyIHBhY2thZ2VNYW5hZ2VyID0gZ2V0UGFja2FnZU1hbmFnZXIoKTsKKyAgICAgICAgQ29tcG9uZW50TmFtZSBjb21wb25lbnROYW1lID0gbmV3IENvbXBvbmVudE5hbWUodGhpcywgZ2V0Q2xhc3MoKSk7CisgICAgICAgIEFjdGl2aXR5SW5mbyBhY3Rpdml0eUluZm8gPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgYWN0aXZpdHlJbmZvID0gcGFja2FnZU1hbmFnZXIuZ2V0QWN0aXZpdHlJbmZvKGNvbXBvbmVudE5hbWUsIFBhY2thZ2VNYW5hZ2VyLkdFVF9NRVRBX0RBVEEpOworICAgICAgICB9IGNhdGNoIChQYWNrYWdlTWFuYWdlci5OYW1lTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmQoTE9HVEFHLCAiRmFpbGVkIHRvIGZpbmQgY29tcG9uZW50Iik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKGFjdGl2aXR5SW5mbyA9PSBudWxsKSB7CisgICAgICAgICAgICBMb2cuZChMT0dUQUcsICJGYWlsZWQgdG8gZ2V0IGFjdGl2aXR5IGluZm8iKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIEJ1bmRsZSBtZXRhRGF0YSA9IGFjdGl2aXR5SW5mby5tZXRhRGF0YTsKKyAgICAgICAgaWYgKG1ldGFEYXRhID09IG51bGwpIHsKKyAgICAgICAgICAgIExvZy5kKExPR1RBRywgIk5vIG1ldGEgZGF0YSIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIHVybCA9IG1ldGFEYXRhLmdldFN0cmluZygiYW5kcm9pZC53ZWJydW50aW1lLnVybCIpOworICAgICAgICBpZiAodXJsID09IG51bGwpIHsKKyAgICAgICAgICAgIExvZy5kKExPR1RBRywgIk5vIFVSTCIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1CYXNlVXJsID0gbmV3IFVSTCh1cmwpOworICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmQoTE9HVEFHLCAiSW52YWxpZCBVUkwiKTsKKyAgICAgICAgfQorCisgICAgICAgIGdldFdpbmRvdygpLnJlcXVlc3RGZWF0dXJlKFdpbmRvdy5GRUFUVVJFX05PX1RJVExFKTsKKyAgICAgICAgc2V0Q29udGVudFZpZXcoUi5sYXlvdXQud2ViX3J1bnRpbWUpOworICAgICAgICBtV2ViVmlldyA9IChXZWJWaWV3KSBmaW5kVmlld0J5SWQoUi5pZC53ZWJ2aWV3KTsKKyAgICAgICAgbVNwbGFzaFNjcmVlbiA9IChJbWFnZVZpZXcpIGZpbmRWaWV3QnlJZChSLmlkLnNwbGFzaHNjcmVlbik7CisgICAgICAgIG1TcGxhc2hTY3JlZW4uc2V0SW1hZ2VSZXNvdXJjZSgKKyAgICAgICAgICAgICAgICBnZXRSZXNvdXJjZXMoKS5nZXRJZGVudGlmaWVyKCJzcGxhc2hfc2NyZWVuIiwgImRyYXdhYmxlIiwgZ2V0UGFja2FnZU5hbWUoKSkpOworICAgICAgICBtV2ViVmlldy5nZXRTZXR0aW5ncygpLnNldEphdmFTY3JpcHRFbmFibGVkKHRydWUpOworICAgICAgICBtV2ViVmlldy5zZXRXZWJWaWV3Q2xpZW50KG5ldyBXZWJWaWV3Q2xpZW50KCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBzaG91bGRPdmVycmlkZVVybExvYWRpbmcoV2ViVmlldyB2aWV3LCBTdHJpbmcgdXJsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgVVJMIG5ld09yaWdpbiA9IG5ldyBVUkwodXJsKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5ld09yaWdpbi5nZXRIb3N0KCkuZXF1YWxzKG1CYXNlVXJsLmdldEhvc3QoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHNpbXBsZSBzYW1lIG9yaWdpbiB0ZXN0IHBhc3NlcywgbG9hZCBpbiB0aGUgd2Vidmlldy4KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FOiBXZSBzaG91bGQgZG8gYSBtb3JlIHJvYnVzdCBTT1AgY2hlY2suCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGNhdGNoKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIERvbid0IGxvYWQgYW55dGhpbmcgaWYgdGhpcyB3YXNuJ3QgYSBwcm9wZXIgVVJMLgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBPdGhlcndpc2UgdGhpcyBpcyBhIFVSTCB0aGF0IGlzIG5vdCBzYW1lIG9yaWdpbiBzbyBwYXNzIGl0IHRvIHRoZQorICAgICAgICAgICAgICAgIC8vIEJyb3dzZXIgdG8gbG9hZC4KKyAgICAgICAgICAgICAgICBzdGFydEFjdGl2aXR5KG5ldyBJbnRlbnQoSW50ZW50LkFDVElPTl9WSUVXLCBVcmkucGFyc2UodXJsKSkpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uUGFnZUZpbmlzaGVkKFdlYlZpZXcgdmlldywgU3RyaW5nIHVybCkgeworICAgICAgICAgICAgICAgIGlmIChtU3BsYXNoU2NyZWVuLmdldFZpc2liaWxpdHkoKSA9PSBWaWV3LlZJU0lCTEUpIHsKKyAgICAgICAgICAgICAgICAgICAgbVNwbGFzaFNjcmVlbi5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CisgICAgICAgICAgICAgICAgICAgIG1TcGxhc2hTY3JlZW4gPSBudWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisKKyAgICAgICAgLy8gVXNlIGEgY3VzdG9tIFdlYkNocm9tZUNsaWVudCB3aXRoIGdlb2xvY2F0aW9uIHBlcm1pc3Npb25zIGhhbmRsaW5nIHRvIGFsd2F5cworICAgICAgICAvLyBhbGxvdyBvciBkZW55LCBiYXNlZCBvbiB0aGUgYXBwJ3MgcGVybWlzc2lvbnMuCisgICAgICAgIFN0cmluZyBwYWNrYWdlTmFtZSA9IGNvbXBvbmVudE5hbWUuZ2V0UGFja2FnZU5hbWUoKTsKKyAgICAgICAgZmluYWwgYm9vbGVhbiBhbGxvd2VkID0gcGFja2FnZU1hbmFnZXIuY2hlY2tQZXJtaXNzaW9uKAorICAgICAgICAgICAgICAgIE1hbmlmZXN0LnBlcm1pc3Npb24uQUNDRVNTX0ZJTkVfTE9DQVRJT04sIHBhY2thZ2VOYW1lKQorICAgICAgICAgICAgICAgID09IFBhY2thZ2VNYW5hZ2VyLlBFUk1JU1NJT05fR1JBTlRFRDsKKyAgICAgICAgbVdlYlZpZXcuc2V0V2ViQ2hyb21lQ2xpZW50KG5ldyBXZWJDaHJvbWVDbGllbnQoKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkdlb2xvY2F0aW9uUGVybWlzc2lvbnNTaG93UHJvbXB0KAorICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG9yaWdpbiwgR2VvbG9jYXRpb25QZXJtaXNzaW9ucy5DYWxsYmFjayBjYWxsYmFjaykgeworICAgICAgICAgICAgICAgIGNhbGxiYWNrLmludm9rZShvcmlnaW4sIGFsbG93ZWQsIHRydWUpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKworICAgICAgICAvLyBTZXQgdGhlIERCIGxvY2F0aW9uLiBPcHRpb25hbC4gR2VvbG9jYXRpb24gd29ya3Mgd2l0aG91dCBEQnMuCisgICAgICAgIG1XZWJWaWV3LmdldFNldHRpbmdzKCkuc2V0R2VvbG9jYXRpb25EYXRhYmFzZVBhdGgoCisgICAgICAgICAgICAgICAgZ2V0RGlyKCJnZW9sb2NhdGlvbiIsIE1PREVfUFJJVkFURSkuZ2V0UGF0aCgpKTsKKworICAgICAgICBTdHJpbmcgdGl0bGUgPSBtZXRhRGF0YS5nZXRTdHJpbmcoImFuZHJvaWQud2VicnVudGltZS50aXRsZSIpOworICAgICAgICAvLyBXZSB0dXJuZWQgb2ZmIHRoZSB0aXRsZSBiYXIgdG8gZ28gZnVsbCBzY3JlZW4gc28gZGlzcGxheSB0aGUKKyAgICAgICAgLy8gd2ViYXBwJ3MgdGl0bGUgYXMgYSB0b2FzdC4KKyAgICAgICAgaWYgKHRpdGxlICE9IG51bGwpIHsKKyAgICAgICAgICAgIFRvYXN0Lm1ha2VUZXh0KHRoaXMsIHRpdGxlLCBUb2FzdC5MRU5HVEhfU0hPUlQpLnNob3coKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIExvYWQgdGhlIHdlYmFwcCdzIGJhc2UgVVJMLgorICAgICAgICBtV2ViVmlldy5sb2FkVXJsKHVybCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gb25LZXlEb3duKGludCBrZXlDb2RlLCBLZXlFdmVudCBldmVudCkgeworICAgICAgICBpZiAoa2V5Q29kZSA9PSBLZXlFdmVudC5LRVlDT0RFX0JBQ0sgJiYgbVdlYlZpZXcuY2FuR29CYWNrKCkpIHsKKyAgICAgICAgICAgIG1XZWJWaWV3LmdvQmFjaygpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN1cGVyLm9uS2V5RG93bihrZXlDb2RlLCBldmVudCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gb25DcmVhdGVPcHRpb25zTWVudShNZW51IG1lbnUpIHsKKyAgICAgICAgbWVudS5hZGQoMCwgMCwgMCwgIk1lbnUgaXRlbSAxIik7CisgICAgICAgIG1lbnUuYWRkKDAsIDEsIDAsICJNZW51IGl0ZW0gMiIpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvQWJzTGlzdFZpZXcuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9BYnNMaXN0Vmlldy5qYXZhCmluZGV4IDZjZmViNjguLjEwOTI3YTcgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9BYnNMaXN0Vmlldy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9BYnNMaXN0Vmlldy5qYXZhCkBAIC01NTksNiArNTU5LDE2IEBACiAKICAgICAgICAgYm9vbGVhbiBzbW9vdGhTY3JvbGxiYXIgPSBhLmdldEJvb2xlYW4oUi5zdHlsZWFibGUuQWJzTGlzdFZpZXdfc21vb3RoU2Nyb2xsYmFyLCB0cnVlKTsKICAgICAgICAgc2V0U21vb3RoU2Nyb2xsYmFyRW5hYmxlZChzbW9vdGhTY3JvbGxiYXIpOworICAgICAgICAKKyAgICAgICAgZmluYWwgaW50IGFkYXB0ZXJJZCA9IGEuZ2V0UmVzb3VyY2VJZChSLnN0eWxlYWJsZS5BYnNMaXN0Vmlld19hZGFwdGVyLCAwKTsKKyAgICAgICAgaWYgKGFkYXB0ZXJJZCAhPSAwKSB7CisgICAgICAgICAgICBmaW5hbCBDb250ZXh0IGMgPSBjb250ZXh0OworICAgICAgICAgICAgcG9zdChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICBzZXRBZGFwdGVyKEFkYXB0ZXJzLmxvYWRBZGFwdGVyKGMsIGFkYXB0ZXJJZCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICB9CiAKICAgICAgICAgYS5yZWN5Y2xlKCk7CiAgICAgfQpAQCAtMTU3NSw2ICsxNTg1LDExIEBACiAgICAgICAgICAgICAgICAgdHJlZU9ic2VydmVyLmFkZE9uR2xvYmFsTGF5b3V0TGlzdGVuZXIodGhpcyk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmIChtQWRhcHRlciAhPSBudWxsICYmIG1EYXRhU2V0T2JzZXJ2ZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgbURhdGFTZXRPYnNlcnZlciA9IG5ldyBBZGFwdGVyRGF0YVNldE9ic2VydmVyKCk7CisgICAgICAgICAgICBtQWRhcHRlci5yZWdpc3RlckRhdGFTZXRPYnNlcnZlcihtRGF0YVNldE9ic2VydmVyKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIEBPdmVycmlkZQpAQCAtMTU5NSw2ICsxNjEwLDExIEBACiAgICAgICAgICAgICAgICAgbUdsb2JhbExheW91dExpc3RlbmVyQWRkZWRGaWx0ZXIgPSBmYWxzZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQorCisgICAgICAgIGlmIChtQWRhcHRlciAhPSBudWxsKSB7CisgICAgICAgICAgICBtQWRhcHRlci51bnJlZ2lzdGVyRGF0YVNldE9ic2VydmVyKG1EYXRhU2V0T2JzZXJ2ZXIpOworICAgICAgICAgICAgbURhdGFTZXRPYnNlcnZlciA9IG51bGw7CisgICAgICAgIH0KICAgICB9CiAKICAgICBAT3ZlcnJpZGUKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9BZGFwdGVycy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0FkYXB0ZXJzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ZkN2ZiNQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9BZGFwdGVycy5qYXZhCkBAIC0wLDAgKzEsMTIzMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC53aWRnZXQ7CisKK2ltcG9ydCBvcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyOworaW1wb3J0IG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXJFeGNlcHRpb247CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlR5cGVkQXJyYXk7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5YbWxSZXNvdXJjZVBhcnNlcjsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcEZhY3Rvcnk7CitpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOworaW1wb3J0IGFuZHJvaWQub3MuQXN5bmNUYXNrOworaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CitpbXBvcnQgYW5kcm9pZC51dGlsLlhtbDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3I7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworCisvKioKKyAqIDxwPlRoaXMgY2xhc3MgY2FuIGJlIHVzZWQgdG8gbG9hZCB7QGxpbmsgYW5kcm9pZC53aWRnZXQuQWRhcHRlciBhZGFwdGVyc30gZGVmaW5lZCBpbgorICogWE1MIHJlc291cmNlcy4gWE1MLWRlZmluZWQgYWRhcHRlcnMgY2FuIGJlIHVzZWQgdG8gZWFzaWx5IGNyZWF0ZSBhZGFwdGVycyBpbiB5b3VyCisgKiBvd24gYXBwbGljYXRpb24gb3IgdG8gcGFzcyBhZGFwdGVycyB0byBvdGhlciBwcm9jZXNzZXMuPC9wPgorICogCisgKiA8aDI+VHlwZXMgb2YgYWRhcHRlcnM8L2gyPgorICogPHA+QWRhcHRlcnMgZGVmaW5lZCB1c2luZyBYTUwgcmVzb3VyY2VzIGNhbiBvbmx5IGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHN1cHBvcnRlZAorICogdHlwZXMuIEFyYml0cmFyeSBhZGFwdGVycyBhcmUgbm90IHN1cHBvcnRlZCB0byBndWFyYW50ZWUgdGhlIHNhZmV0eSBvZiB0aGUgbG9hZGVkCisgKiBjb2RlIHdoZW4gYWRhcHRlcnMgYXJlIGxvYWRlZCBhY3Jvc3MgcGFja2FnZXMuPC9wPgorICogPHVsPgorICogIDxsaT48YSBocmVmPSIjeG1sLWN1cnNvci1hZGFwdGVyIj5DdXJzb3IgYWRhcHRlcjwvYT46IGEgY3Vyc29yIGFkYXB0ZXIgY2FuIGJlIHVzZWQKKyAqICB0byBkaXNwbGF5IHRoZSBjb250ZW50IG9mIGEgY3Vyc29yLCBtb3N0IG9mdGVuIGNvbWluZyBmcm9tIGEgY29udGVudCBwcm92aWRlcjwvbGk+CisgKiA8L3VsPgorICogPHA+VGhlIGNvbXBsZXRlIFhNTCBmb3JtYXQgZGVmaW5pdGlvbiBvZiBlYWNoIGFkYXB0ZXIgdHlwZSBpcyBhdmFpbGFibGUgYmVsb3cuPC9wPgorICogCisgKiA8YSBuYW1lPSJ4bWwtY3Vyc29yLWFkYXB0ZXIiIC8+CisgKiA8aDI+Q3Vyc29yIGFkYXB0ZXI8L2gyPgorICogPHA+QSBjdXJzb3IgYWRhcHRlciBYTUwgZGVmaW5pdGlvbiBzdGFydHMgd2l0aCB0aGUKKyAqIDxhIGhyZWY9IiN4bWwtY3Vyc29yLWFkYXB0ZXItdGFnIj48Y29kZT4mbHQ7Y3Vyc29yLWFkYXB0ZXIgLyZndDs8L2NvZGU+PC9hPgorICogdGFnIGFuZCBtYXkgY29udGFpbiBvbmUgb3IgbW9yZSBpbnN0YW5jZXMgb2YgdGhlIGZvbGxvd2luZyB0YWdzOjwvcD4KKyAqIDx1bD4KKyAqICA8bGk+PGEgaHJlZj0iI3htbC1jdXJzb3ItYWRhcHRlci1zZWxlY3QtdGFnIj48Y29kZT4mbHQ7c2VsZWN0IC8mZ3Q7PC9jb2RlPjwvYT48L2xpPgorICogIDxsaT48YSBocmVmPSIjeG1sLWN1cnNvci1hZGFwdGVyLWJpbmQtdGFnIj48Y29kZT4mbHQ7YmluZCAvJmd0OzwvY29kZT48L2E+PC9saT4KKyAqIDwvdWw+CisgKiAKKyAqIDxhIG5hbWU9InhtbC1jdXJzb3ItYWRhcHRlci10YWciIC8+CisgKiA8aDM+Jmx0O2N1cnNvci1hZGFwdGVyIC8mZ3Q7PC9oMz4KKyAqIDxwPlRoZSA8Y29kZT4mbHQ7Y3Vyc29yLWFkYXB0ZXIgLyZndDs8L2NvZGU+IGVsZW1lbnQgZGVmaW5lcyB0aGUgYmVnaW5uaW5nIG9mIHRoZQorICogZG9jdW1lbnQgYW5kIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczo8L3A+CisgKiA8dWw+CisgKiAgPGxpPjxjb2RlPmFuZHJvaWQ6bGF5b3V0PC9jb2RlPjogUmVmZXJlbmNlIHRvIHRoZSBYTUwgbGF5b3V0IHRvIGJlIGluZmxhdGVkIGZvcgorICogIGVhY2ggaXRlbSBvZiB0aGUgYWRhcHRlci4gVGhpcyBhdHRyaWJ1dGUgaXMgbWFuZGF0b3J5LjwvbGk+CisgKiAgPGxpPjxjb2RlPmFuZHJvaWQ6c2VsZWN0aW9uPC9jb2RlPjogU2VsZWN0aW9uIGV4cHJlc3Npb24sIHVzZWQgd2hlbiB0aGUKKyAqICA8Y29kZT5hbmRyb2lkOnVyaTwvY29kZT4gYXR0cmlidXRlIGlzIGRlZmluZWQgb3Igd2hlbiB0aGUgYWRhcHRlciBpcyBsb2FkZWQgd2l0aAorICogIHtAbGluayBhbmRyb2lkLndpZGdldC5BZGFwdGVycyNsb2FkQ3Vyc29yQWRhcHRlcihhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCwgaW50LCBTdHJpbmcsIE9iamVjdFtdKX0uCisgKiAgVGhpcyBhdHRyaWJ1dGUgaXMgb3B0aW9uYWwuPC9saT4KKyAqICA8bGk+PGNvZGU+YW5kcm9pZDpzb3J0T3JkZXI8L2NvZGU+OiBTb3J0IGV4cHJlc3Npb24sIHVzZWQgd2hlbiB0aGUKKyAqICA8Y29kZT5hbmRyb2lkOnVyaTwvY29kZT4gYXR0cmlidXRlIGlzIGRlZmluZWQgb3Igd2hlbiB0aGUgYWRhcHRlciBpcyBsb2FkZWQgd2l0aAorICogIHtAbGluayBhbmRyb2lkLndpZGdldC5BZGFwdGVycyNsb2FkQ3Vyc29yQWRhcHRlcihhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCwgaW50LCBTdHJpbmcsIE9iamVjdFtdKX0uCisgKiAgVGhpcyBhdHRyaWJ1dGUgaXMgb3B0aW9uYWwuPC9saT4KKyAqICA8bGk+PGNvZGU+YW5kcm9pZDp1cmk8L2NvZGU+OiBVUkkgb2YgdGhlIGNvbnRlbnQgcHJvdmlkZXIgdG8gcXVlcnkgdG8gcmV0cmlldmUgYSBjdXJzb3IuCisgKiAgU3BlY2lmeWluZyB0aGlzIGF0dHJpYnV0ZSBpcyBlcXVpdmFsZW50IHRvIGNhbGxpbmcKKyAqICB7QGxpbmsgYW5kcm9pZC53aWRnZXQuQWRhcHRlcnMjbG9hZEN1cnNvckFkYXB0ZXIoYW5kcm9pZC5jb250ZW50LkNvbnRleHQsIGludCwgU3RyaW5nLCBPYmplY3RbXSl9LgorICogIElmIHlvdSBjYWxsIHRoaXMgbWV0aG9kLCB0aGUgdmFsdWUgb2YgdGhlIFhNTCBhdHRyaWJ1dGUgaXMgaWdub3JlZC4gVGhpcyBhdHRyaWJ1dGUgaXMKKyAqICBvcHRpb25hbC48L2xpPgorICogPC91bD4KKyAqIDxwPkluIGFkZGl0aW9uLCB5b3UgY2FuIHNwZWNpZnkgb25lIG9yIG1vcmUgaW5zdGFuY2VzIG9mCisgKiA8YSBocmVmPSIjeG1sLWN1cnNvci1hZGFwdGVyLXNlbGVjdC10YWciPjxjb2RlPiZsdDtzZWxlY3QgLyZndDs8L2NvZGU+PC9hPiBhbmQKKyAqIDxhIGhyZWY9IiN4bWwtY3Vyc29yLWFkYXB0ZXItYmluZC10YWciPjxjb2RlPiZsdDtiaW5kIC8mZ3Q7PC9jb2RlPjwvYT4gdGFncyBhcyBjaGlsZHJlbgorICogb2YgPGNvZGU+Jmx0O2N1cnNvci1hZGFwdGVyIC8mZ3Q7PC9jb2RlPi48L3A+CisgKiAKKyAqIDxhIG5hbWU9InhtbC1jdXJzb3ItYWRhcHRlci1zZWxlY3QtdGFnIiAvPgorICogPGgzPiZsdDtzZWxlY3QgLyZndDs8L2gzPgorICogPHA+VGhlIDxjb2RlPiZsdDtzZWxlY3QgLyZndDs8L2NvZGU+IHRhZyBpcyB1c2VkIHRvIHNlbGVjdCBjb2x1bW5zIGZyb20gdGhlIGN1cnNvcgorICogd2hlbiBkb2luZyB0aGUgcXVlcnkuIFRoaXMgY2FuIGJlIHZlcnkgdXNlZnVsIHdoZW4gdXNpbmcgdHJhbnNmb3JtYXRpb25zIGluIHRoZQorICogPGNvZGU+Jmx0O2JpbmQgLyZndDs8L2NvZGU+IGVsZW1lbnRzLiBJdCBjYW4gYWxzbyBiZSB2ZXJ5IHVzZWZ1bCBpZiB5b3UgYXJlIHByb3ZpZGluZworICogeW91ciBvd24gPGEgaHJlZj0iI3htbC1jdXJzb3ItYWRhcHRlci1iaW5kLWRhdGEtdHlwZXMiPmJpbmRlcjwvYT4gb3IKKyAqIDxhIGhyZWY9IiN4bWwtY3Vyc29yLWFkYXB0ZXItYmluZC1kYXRhLXR5cGVzIj50cmFuc2Zvcm1hdGlvbjwvYT4gY2xhc3Nlcy4KKyAqIDxjb2RlPiZsdDtzZWxlY3QgLyZndDs8L2NvZGU+IGVsZW1lbnRzIGFyZSBpZ25vcmVkIGlmIHlvdSBzdXBwbHkgdGhlIGN1cnNvciB5b3Vyc2VsZi48L3A+CisgKiA8cD5UaGUgPGNvZGU+Jmx0O3NlbGVjdCAvJmd0OzwvY29kZT4gc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOjwvcD4KKyAqIDx1bD4KKyAqICA8bGk+PGNvZGU+YW5kcm9pZDpjb2x1bW48L2NvZGU+OiBOYW1lIG9mIHRoZSBjb2x1bW4gdG8gc2VsZWN0IGluIHRoZSBjdXJzb3IgZHVyaW5nIHRoZQorICogIHF1ZXJ5IG9wZXJhdGlvbjwvbGk+CisgKiA8L3VsPgorICogPHA+PHN0cm9uZz5Ob3RlOjwvc3Ryb25nPiBUaGUgY29sdW1uIG5hbWVkIDxjb2RlPl9pZDwvY29kZT4gaXMgYWx3YXlzIGltcGxpY2l0bHkKKyAqIHNlbGVjdGVkLjwvcD4KKyAqIAorICogPGEgbmFtZT0ieG1sLWN1cnNvci1hZGFwdGVyLWJpbmQtdGFnIiAvPgorICogPGgzPiZsdDtiaW5kIC8mZ3Q7PC9oMz4KKyAqIDxwPlRoZSA8Y29kZT4mbHQ7YmluZCAvJmd0OzwvY29kZT4gdGFnIGlzIHVzZWQgdG8gYmluZCBhIGNvbHVtbiBmcm9tIHRoZSBjdXJzb3IgdG8KKyAqIGEge0BsaW5rIGFuZHJvaWQudmlldy5WaWV3fS4gQSBjb2x1bW4gYm91bmQgdXNpbmcgdGhpcyB0YWcgaXMgYXV0b21hdGljYWxseSBzZWxlY3RlZAorICogZHVyaW5nIHRoZSBxdWVyeSBhbmQgYSBtYXRjaGluZworICogPGEgaHJlZj0iI3htbC1jdXJzb3ItYWRhcHRlci1zZWxlY3QtdGFnIj48Y29kZT4mbHQ7c2VsZWN0IC8mZ3Q7PC9jb2RlPiB0YWcgaXMgdGhlcmVmb3JlCisgKiBub3QgcmVxdWlyZWQuPC9wPgorICogCisgKiA8cD5FYWNoIGJpbmRpbmcgaXMgZGVjbGFyZWQgYXMgYSBvbmUgdG8gb25lIG1hdGNoaW5nIGJ1dAorICogY3VzdG9tIGJpbmRlciBjbGFzc2VzIG9yIHNwZWNpYWwKKyAqIDxhIGhyZWY9IiN4bWwtY3Vyc29yLWFkYXB0ZXItYmluZC1kYXRhLXRyYW5zZm9ybWF0aW9uIj5kYXRhIHRyYW5zZm9ybWF0aW9uczwvYT4gY2FuCisgKiBhbGxvdyB5b3UgdG8gYmluZCBzZXZlcmFsIGNvbHVtbnMgdG8gYSBzaW5nbGUgdmlldy4gSW4gdGhpcyBjYXNlIHlvdSBtdXN0IHVzZSB0aGUKKyAqIDxhIGhyZWY9IiN4bWwtY3Vyc29yLWFkYXB0ZXItc2VsZWN0LXRhZyI+PGNvZGU+Jmx0O3NlbGVjdCAvJmd0OzwvY29kZT4gdGFnIHRvIG1ha2UKKyAqIHN1cmUgYW55IHJlcXVpcmVkIGNvbHVtbiBpcyBwYXJ0IG9mIHRoZSBxdWVyeS48L3A+CisgKiAKKyAqIDxwPlRoZSA8Y29kZT4mbHQ7YmluZCAvJmd0OzwvY29kZT4gdGFnIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczo8L3A+CisgKiA8dWw+CisgKiAgPGxpPjxjb2RlPmFuZHJvaWQ6ZnJvbTwvY29kZT46IFRoZSBuYW1lIG9mIHRoZSBjb2x1bW4gdG8gYmluZCBmcm9tLgorICogIFRoaXMgYXR0cmlidXRlIGlzIG1hbmRhdG9yeS4gTm90ZSB0aGF0IDxjb2RlPkA8L2NvZGU+IHdoaWNoIGFyZSBub3QgdXNlZCB0byByZWZlcmVuY2UgcmVzb3VyY2VzCisgKiAgc2hvdWxkIGJlIGJhY2tzbGFzaCBwcm90ZWN0ZWQgYXMgaW4gPGNvZGU+XEA8L2NvZGU+LjwvbGk+CisgKiAgPGxpPjxjb2RlPmFuZHJvaWQ6dG88L2NvZGU+OiBUaGUgaWQgb2YgdGhlIHZpZXcgdG8gYmluZCB0by4gVGhpcyBhdHRyaWJ1dGUgaXMgbWFuZGF0b3J5LjwvbGk+CisgKiAgPGxpPjxjb2RlPmFuZHJvaWQ6YXM8L2NvZGU+OiBUaGUgPGEgaHJlZj0iI3htbC1jdXJzb3ItYWRhcHRlci1iaW5kLWRhdGEtdHlwZXMiPmRhdGEgdHlwZTwvYT4KKyAqICBvZiB0aGUgYmluZGluZy4gVGhpcyBhdHRyaWJ1dGUgaXMgbWFuZGF0b3J5LjwvbGk+CisgKiA8L3VsPgorICogCisgKiA8cD5JbiBhZGRpdGlvbiwgYSA8Y29kZT4mbHQ7YmluZCAvJmd0OzwvY29kZT4gY2FuIGNvbnRhaW4gemVybyBvciBtb3JlIGluc3RhbmNlcyBvZgorICogPGEgaHJlZj0iI3htbC1jdXJzb3ItYWRhcHRlci1iaW5kLWRhdGEtdHJhbnNmb3JtYXRpb24iPmRhdGEgdHJhbnNmb3JtYXRpb25zPC9hPiBjaGlsZHJlbgorICogdGFncy48L3A+CisgKgorICogPGEgbmFtZT0ieG1sLWN1cnNvci1hZGFwdGVyLWJpbmQtZGF0YS10eXBlcyIgLz4KKyAqIDxoND5CaW5kaW5nIGRhdGEgdHlwZXM8L2g0PgorICogPHA+Rm9yIGEgYmluZGluZyB0byBvY2N1ciB0aGUgZGF0YSB0eXBlIG9mIHRoZSBib3VuZCBjb2x1bW4vdmlldyBwYWlyIG11c3QgYmUgc3BlY2lmaWVkLgorICogVGhlIGZvbGxvd2luZyBkYXRhIHR5cGVzIGFyZSBjdXJyZW50bHkgc3VwcG9ydGVkOjwvcD4KKyAqIDx1bD4KKyAqICA8bGk+PGNvZGU+c3RyaW5nPC9jb2RlPjogVGhlIGNvbnRlbnQgb2YgdGhlIGNvbHVtbiBpcyBpbnRlcnByZXRlZCBhcyBhIHN0cmluZyBhbmQgbXVzdCBiZQorICogIGJvdW5kIHRvIGEge0BsaW5rIGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3fTwvbGk+CisgKiAgPGxpPjxjb2RlPmltYWdlPC9jb2RlPjogVGhlIGNvbnRlbnQgb2YgdGhlIGNvbHVtbiBpcyBpbnRlcnByZXRlZCBhcyBhIGJsb2IgZGVzY3JpYmluZyBhbgorICogIGltYWdlIGFuZCBtdXN0IGJlIGJvdW5kIHRvIGFuIHtAbGluayBhbmRyb2lkLndpZGdldC5JbWFnZVZpZXd9PC9saT4KKyAqICA8bGk+PGNvZGU+aW1hZ2UtdXJpPC9jb2RlPjogVGhlIGNvbnRlbnQgb2YgdGhlIGNvbHVtbiBpcyBpbnRlcnByZXRlZCBhcyBhIFVSSSB0byBhbiBpbWFnZQorICogIGFuZCBtdXN0IGJlIGJvdW5kIHRvIGFuIHtAbGluayBhbmRyb2lkLndpZGdldC5JbWFnZVZpZXd9PC9saT4KKyAqICA8bGk+PGNvZGU+ZHJhd2FibGU8L2NvZGU+OiBUaGUgY29udGVudCBvZiB0aGUgY29sdW1uIGlzIGludGVycHJldGVkIGFzIGEgcmVzb3VyY2UgaWQgdG8gYQorICogIGRyYXdhYmxlIGFuZCBtdXN0IGJlIGJvdW5kIHRvIGFuIHtAbGluayBhbmRyb2lkLndpZGdldC5JbWFnZVZpZXd9PC9saT4KKyAqICA8bGk+PGNvZGU+dGFnPC9jb2RlPjogVGhlIGNvbnRlbnQgb2YgdGhlIGNvbHVtbiBpcyBpbnRlcnByZXRlZCBhcyBhIHN0cmluZyBhbmQgd2lsbCBiZSBzZXQgYXMKKyAqICB0aGUgdGFnICh1c2luZyB7QGxpbmsgVmlldyNzZXRUYWcoT2JqZWN0KX0gb2YgdGhlIGFzc29jaWF0ZWQgVmlldy4gVGhpcyBjYW4gYmUgdXNlZCB0bworICogIGFzc29jaWF0ZSBtZXRhLWRhdGEgdG8geW91ciB2aWV3LCB0aGF0IGNhbiBiZSB1c2VkIGZvciBpbnN0YW5jZSBieSBhIGxpc3RlbmVyLjwvbGk+CisgKiAgPGxpPkEgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWU6IFRoZSBuYW1lIG9mIGEgY2xhc3MgY29ycmVzcG9uZGluZyB0byBhbiBpbXBsZW1lbnRhdGlvbiBvZgorICogIHtAbGluayBhbmRyb2lkLndpZGdldC5BZGFwdGVycy5DdXJzb3JCaW5kZXJ9LiBDdXJzb3IgYmluZGVycyBjYW4gYmUgdXNlZCB0byBwcm92aWRlCisgKiAgYmluZGluZ3Mgbm90IHN1cHBvcnRlZCBieSBkZWZhdWx0LiBDdXN0b20gYmluZGVycyBjYW5ub3QgYmUgdXNlZCB3aXRoCisgKiAge0BsaW5rIGFuZHJvaWQuY29udGVudC5Db250ZXh0I2lzUmVzdHJpY3RlZCgpIHJlc3RyaWN0ZWQgY29udGV4dHN9LCBmb3IgaW5zdGFuY2UgaW4gYW4KKyAqICBhcHBsaWNhdGlvbiB3aWRnZXQ8L2xpPgorICogPC91bD4KKyAqIAorICogPGEgbmFtZT0ieG1sLWN1cnNvci1hZGFwdGVyLWJpbmQtdHJhbnNmb3JtYXRpb24iIC8+CisgKiA8aDQ+QmluZGluZyB0cmFuc2Zvcm1hdGlvbnM8L2g0PgorICogPHA+V2hlbiBkZWZpbmluZyBhIGRhdGEgYmluZGluZyB5b3UgY2FuIHNwZWNpZnkgYW4gb3B0aW9uYWwgdHJhbnNmb3JtYXRpb24gYnkgdXNpbmcgb25lCisgKiBvZiB0aGUgZm9sbG93aW5nIHRhZ3MgYXMgYSBjaGlsZCBvZiBhIDxjb2RlPiZsdDtiaW5kIC8mZ3Q7PC9jb2RlPiBlbGVtZW50czo8L3A+CisgKiA8dWw+CisgKiAgPGxpPjxjb2RlPiZsdDttYXAgLyZndDs8L2NvZGU+OiBNYXBzIGEgY29uc3RhbnQgc3RyaW5nIHRvIGEgc3RyaW5nIG9yIGEgcmVzb3VyY2UuIFVzZQorICogIG9uZSBpbnN0YW5jZSBvZiB0aGlzIHRhZyBwZXIgdmFsdWUgeW91IHdhbnQgdG8gbWFwPC9saT4KKyAqICA8bGk+PGNvZGU+Jmx0O3RyYW5zZm9ybSAvJmd0OzwvY29kZT46IFRyYW5zZm9ybXMgYSBjb2x1bW4ncyB2YWx1ZSB1c2luZyBhbiBleHByZXNzaW9uCisgKiAgb3IgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJzLkN1cnNvclRyYW5zZm9ybWF0aW9ufTwvbGk+CisgKiA8L3VsPgorICogPHA+V2hpbGUgc2V2ZXJhbCA8Y29kZT4mbHQ7bWFwIC8mZ3Q7PC9jb2RlPiB0YWdzIGNhbiBiZSB1c2VkIGF0IHRoZSBzYW1lIHRpbWUsIHlvdSBjYW5ub3QKKyAqIG1peCA8Y29kZT4mbHQ7bWFwIC8mZ3Q7PC9jb2RlPiBhbmQgPGNvZGU+Jmx0O3RyYW5zZm9ybSAvJmd0OzwvY29kZT4gdGFncy4gSWYgc2V2ZXJhbAorICogPGNvZGU+Jmx0O3RyYW5zZm9ybSAvJmd0OzwvY29kZT4gdGFncyBhcmUgc3BlY2lmaWVkLCBvbmx5IHRoZSBsYXN0IG9uZSBpcyByZXRhaW5lZC48L3A+CisgKiAKKyAqIDxhIG5hbWU9InhtbC1jdXJzb3ItYWRhcHRlci1iaW5kLXRyYW5zZm9ybWF0aW9uLW1hcCIgLz4KKyAqIDxwPjxzdHJvbmc+Jmx0O21hcCAvJmd0Ozwvc3Ryb25nPjwvcD4KKyAqIDxwPkEgbWFwIGVsZW1lbnQgc2ltcGx5IHNwZWNpZmllcyBhIHZhbHVlIHRvIG1hdGNoIGZyb20gYW5kIGEgdmFsdWUgdG8gbWF0Y2ggdG8uIFdoZW4KKyAqIGEgY29sdW1uJ3MgdmFsdWUgZXF1YWxzIHRoZSB2YWx1ZSB0byBtYXRjaCBmcm9tLCBpdCBpcyByZXBsYWNlZCB3aXRoIHRoZSB2YWx1ZSB0byBtYXRjaAorICogdG8uIFRoZSBmb2xsb3dpbmcgYXR0cmlidXRlcyBhcmUgc3VwcG9ydGVkOjwvcD4KKyAqIDx1bD4KKyAqICA8bGk+PGNvZGU+YW5kcm9pZDpmcm9tVmFsdWU8L2NvZGU+OiBUaGUgdmFsdWUgdG8gbWF0Y2ggZnJvbS4gVGhpcyBhdHRyaWJ1dGUgaXMgbWFuZGF0b3J5PC9saT4KKyAqICA8bGk+PGNvZGU+YW5kcm9pZDp0b1ZhbHVlPC9jb2RlPjogVGhlIHZhbHVlIHRvIG1hdGNoIHRvLiBUaGlzIHZhbHVlIGNhbiBiZSBlaXRoZXIgYSBzdHJpbmcKKyAqICBvciBhIHJlc291cmNlIGlkZW50aWZpZXIuIFRoaXMgdmFsdWUgaXMgaW50ZXJwcmV0ZWQgYXMgYSByZXNvdXJjZSBpZGVudGlmaWVyIHdoZW4gdGhlCisgKiAgZGF0YSBiaW5kaW5nIGlzIG9mIHR5cGUgPGNvZGU+ZHJhd2FibGU8L2NvZGU+LiBUaGlzIGF0dHJpYnV0ZSBpcyBtYW5kYXRvcnk8L2xpPgorICogPC91bD4KKyAqIAorICogPGEgbmFtZT0ieG1sLWN1cnNvci1hZGFwdGVyLWJpbmQtdHJhbnNmb3JtYXRpb24tdHJhbnNmb3JtIiAvPgorICogPHA+PHN0cm9uZz4mbHQ7dHJhbnNmb3JtIC8mZ3Q7PC9zdHJvbmc+PC9wPgorICogPHA+QSBzaW1wbGUgdHJhbnNmb3JtIHRoYXQgb2NjdXJzIGVpdGhlciBieSBjYWxsaW5nIGEgc3BlY2lmaWVkIGNsYXNzIG9yIGJ5IHBlcmZvcm1pbmcKKyAqIHNpbXBsZSB0ZXh0IHN1YnN0aXR1dGlvbi4gVGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzIGFyZSBzdXBwb3J0ZWQ6PC9wPgorICogPHVsPgorICogIDxsaT48Y29kZT5hbmRyb2lkOndpdGhFeHByZXNzaW9uPC9jb2RlPjogVGhlIHRyYW5zZm9ybWF0aW9uIGV4cHJlc3Npb24uIFRoZSBleHByZXNzaW9uIGlzCisgKiAgYSBzdHJpbmcgY29udGFpbmluZyBjb2x1bW4gbmFtZXMgc3Vycm91bmRlZCB3aXRoIGN1cmx5IGJyYWNlcyB7IGFuZCB9LiBEdXJpbmcgdGhlCisgKiAgdHJhbnNmb3JtYXRpb24gZWFjaCBjb2x1bW4gbmFtZSBpcyByZXBsYWNlZCBieSBpdHMgdmFsdWUuIEFsbCBjb2x1bW5zIG11c3QgaGF2ZSBiZWVuCisgKiAgc2VsZWN0ZWQgaW4gdGhlIHF1ZXJ5LiBBbiBleGFtcGxlIG9mIGV4cHJlc3Npb24gaXMgPGNvZGU+IkZpcnN0IG5hbWU6IHtmaXJzdF9uYW1lfSwKKyAqICBsYXN0IG5hbWU6IHtsYXN0X25hbWV9IjwvY29kZT4uIFRoaXMgYXR0cmlidXRlIGlzIG1hbmRhdG9yeQorICogIGlmIDxjb2RlPmFuZHJvaWQ6d2l0aENsYXNzPC9jb2RlPiBpcyBub3Qgc3BlY2lmaWVkIGFuZCBpZ25vcmVkIGlmIDxjb2RlPmFuZHJvaWQ6d2l0aENsYXNzPC9jb2RlPgorICogIGlzIHNwZWNpZmllZDwvbGk+CisgKiAgPGxpPjxjb2RlPmFuZHJvaWQ6d2l0aENsYXNzPC9jb2RlPjogQSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBjb3JyZXNwb25kaW5nIHRvIGFuCisgKiAgaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJzLkN1cnNvclRyYW5zZm9ybWF0aW9ufS4gQ3VzdG9tCisgKiAgdHJhbnNmb3JtYXRpb25zIGNhbm5vdCBiZSB1c2VkIHdpdGgKKyAqICB7QGxpbmsgYW5kcm9pZC5jb250ZW50LkNvbnRleHQjaXNSZXN0cmljdGVkKCkgcmVzdHJpY3RlZCBjb250ZXh0c30sIGZvciBpbnN0YW5jZSBpbgorICogIGFuIGFwcCB3aWRnZXQgVGhpcyBhdHRyaWJ1dGUgaXMgbWFuZGF0b3J5IGlmIDxjb2RlPmFuZHJvaWQ6d2l0aEV4cHJlc3Npb248L2NvZGU+IGlzCisgKiAgbm90IHNwZWNpZmllZDwvbGk+CisgKiA8L3VsPgorICogCisgKiA8aDM+RXhhbXBsZTwvaDM+CisgKiA8cD5UaGUgZm9sbG93aW5nIGV4YW1wbGUgZGVmaW5lcyBhIGN1cnNvciBhZGFwdGVyIHRoYXQgcXVlcmllcyBhbGwgdGhlIGNvbnRhY3RzIHdpdGgKKyAqIGEgcGhvbmUgbnVtYmVyIHVzaW5nIHRoZSBjb250YWN0cyBjb250ZW50IHByb3ZpZGVyLiBFYWNoIGNvbnRhY3QgaXMgZGlzcGxheWVkIHdpdGgKKyAqIGl0cyBkaXNwbGF5IG5hbWUsIGl0cyBmYXZvcml0ZSBzdGF0dXMgYW5kIGl0cyBwaG90by4gVG8gZGlzcGxheSBwaG90b3MsIGEgY3VzdG9tIGRhdGEKKyAqIGJpbmRlciBpcyBkZWNsYXJlZDo8L3A+CisgKiAKKyAqIDxwcmUgY2xhc3M9InByZXR0eXByaW50Ij4KKyAqICZsdDtjdXJzb3ItYWRhcHRlciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgKiAgICAgYW5kcm9pZDp1cmk9ImNvbnRlbnQ6Ly9jb20uYW5kcm9pZC5jb250YWN0cy9jb250YWN0cyIKKyAqICAgICBhbmRyb2lkOnNlbGVjdGlvbj0iaGFzX3Bob25lX251bWJlcj0xIgorICogICAgIGFuZHJvaWQ6bGF5b3V0PSJAbGF5b3V0L2NvbnRhY3RfaXRlbSImZ3Q7CisgKgorICogICAgICZsdDtiaW5kIGFuZHJvaWQ6ZnJvbT0iZGlzcGxheV9uYW1lIiBhbmRyb2lkOnRvPSJAaWQvbmFtZSIgYW5kcm9pZDphcz0ic3RyaW5nIiAvJmd0OworICogICAgICZsdDtiaW5kIGFuZHJvaWQ6ZnJvbT0ic3RhcnJlZCIgYW5kcm9pZDp0bz0iQGlkL3N0YXIiIGFuZHJvaWQ6YXM9ImRyYXdhYmxlIiZndDsKKyAqICAgICAgICAgJmx0O21hcCBhbmRyb2lkOmZyb21WYWx1ZT0iMCIgYW5kcm9pZDp0b1ZhbHVlPSJAYW5kcm9pZDpkcmF3YWJsZS9zdGFyX2JpZ19vZmYiIC8mZ3Q7CisgKiAgICAgICAgICZsdDttYXAgYW5kcm9pZDpmcm9tVmFsdWU9IjEiIGFuZHJvaWQ6dG9WYWx1ZT0iQGFuZHJvaWQ6ZHJhd2FibGUvc3Rhcl9iaWdfb24iIC8mZ3Q7CisgKiAgICAgJmx0Oy9iaW5kJmd0OworICogICAgICZsdDtiaW5kIGFuZHJvaWQ6ZnJvbT0iX2lkIiBhbmRyb2lkOnRvPSJAaWQvbmFtZSIKKyAqICAgICAgICAgICAgICBhbmRyb2lkOmFzPSJjb20uZ29vZ2xlLmFuZHJvaWQudGVzdC5hZGFwdGVycy5Db250YWN0UGhvdG9CaW5kZXIiIC8mZ3Q7CisgKgorICogJmx0Oy9jdXJzb3ItYWRhcHRlciZndDsKKyAqIDwvcHJlPgorICogCisgKiA8aDM+UmVsYXRlZCBBUElzPC9oMz4KKyAqIDx1bD4KKyAqICA8bGk+e0BsaW5rIGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJzI2xvYWRBZGFwdGVyKGFuZHJvaWQuY29udGVudC5Db250ZXh0LCBpbnQsIE9iamVjdFtdKX08L2xpPgorICogIDxsaT57QGxpbmsgYW5kcm9pZC53aWRnZXQuQWRhcHRlcnMjbG9hZEN1cnNvckFkYXB0ZXIoYW5kcm9pZC5jb250ZW50LkNvbnRleHQsIGludCwgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IsIE9iamVjdFtdKX08L2xpPgorICogIDxsaT57QGxpbmsgYW5kcm9pZC53aWRnZXQuQWRhcHRlcnMjbG9hZEN1cnNvckFkYXB0ZXIoYW5kcm9pZC5jb250ZW50LkNvbnRleHQsIGludCwgU3RyaW5nLCBPYmplY3RbXSl9PC9saT4KKyAqICA8bGk+e0BsaW5rIGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJzLkN1cnNvckJpbmRlcn08L2xpPgorICogIDxsaT57QGxpbmsgYW5kcm9pZC53aWRnZXQuQWRhcHRlcnMuQ3Vyc29yVHJhbnNmb3JtYXRpb259PC9saT4KKyAqICA8bGk+e0BsaW5rIGFuZHJvaWQud2lkZ2V0LkN1cnNvckFkYXB0ZXJ9PC9saT4KKyAqIDwvdWw+CisgKiAKKyAqIEBzZWUgYW5kcm9pZC53aWRnZXQuQWRhcHRlcgorICogQHNlZSBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFByb3ZpZGVyCisgKiAKKyAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI0N1cnNvckFkYXB0ZXJfbGF5b3V0IAorICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjQ3Vyc29yQWRhcHRlcl9zZWxlY3Rpb24gCisgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNDdXJzb3JBZGFwdGVyX3NvcnRPcmRlciAKKyAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI0N1cnNvckFkYXB0ZXJfdXJpIAorICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjQ3Vyc29yQWRhcHRlcl9CaW5kSXRlbV9hcyAKKyAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI0N1cnNvckFkYXB0ZXJfQmluZEl0ZW1fZnJvbSAKKyAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI0N1cnNvckFkYXB0ZXJfQmluZEl0ZW1fdG8KKyAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI0N1cnNvckFkYXB0ZXJfTWFwSXRlbV9mcm9tVmFsdWUgCisgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNDdXJzb3JBZGFwdGVyX01hcEl0ZW1fdG9WYWx1ZSAKKyAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI0N1cnNvckFkYXB0ZXJfU2VsZWN0SXRlbV9jb2x1bW4gCisgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNDdXJzb3JBZGFwdGVyX1RyYW5zZm9ybUl0ZW1fd2l0aENsYXNzIAorICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjQ3Vyc29yQWRhcHRlcl9UcmFuc2Zvcm1JdGVtX3dpdGhFeHByZXNzaW9uIAorICovCitAU3VwcHJlc3NXYXJuaW5ncyh7IkphdmFkb2NSZWZlcmVuY2UifSkKK3B1YmxpYyBjbGFzcyBBZGFwdGVycyB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFEQVBURVJfQ1VSU09SID0gImN1cnNvci1hZGFwdGVyIjsKKworICAgIC8qKgorICAgICAqIDxwPkludGVyZmFjZSB1c2VkIHRvIGJpbmQgYSB7QGxpbmsgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3J9IGNvbHVtbiB0byBhIFZpZXcuIFRoaXMKKyAgICAgKiBpbnRlcmZhY2UgY2FuIGJlIHVzZWQgdG8gcHJvdmlkZSBiaW5kaW5ncyBmb3IgZGF0YSB0eXBlcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZQorICAgICAqIHN0YW5kYXJkIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBhbmRyb2lkLndpZGdldC5BZGFwdGVyc30uPC9wPgorICAgICAqIAorICAgICAqIDxwPkEgYmluZGVyIGlzIHByb3ZpZGVkIHdpdGggYSBjdXJzb3IgdHJhbnNmb3JtYXRpb24gd2hpY2ggbWF5IG9yIG1heSBub3QgYmUgdXNlZAorICAgICAqIHRvIHRyYW5zZm9ybSB0aGUgdmFsdWUgcmV0cmlldmVkIGZyb20gdGhlIGN1cnNvci4gVGhlIHRyYW5zZm9ybWF0aW9uIGlzIGd1YXJhbnRlZWQKKyAgICAgKiB0byBuZXZlciBiZSBudWxsIHNvIGl0J3MgYWx3YXlzIHNhZmUgdG8gYXBwbHkgdGhlIHRyYW5zZm9ybWF0aW9uLjwvcD4KKyAgICAgKiAKKyAgICAgKiA8cD5UaGUgYmluZGVyIGlzIGFzc29jaWF0ZWQgd2l0aCBhIENvbnRleHQgYnV0IGNhbiBiZSByZS11c2VkIHdpdGggbXVsdGlwbGUgY3Vyc29ycy4KKyAgICAgKiBBcyBzdWNoLCB0aGUgaW1wbGVtZW50YXRpb24gc2hvdWxkIG1ha2Ugbm8gYXNzdW1wdGlvbiBhYm91dCB0aGUgQ3Vyc29yIGluIHVzZS48L3A+CisgICAgICoKKyAgICAgKiBAc2VlIGFuZHJvaWQudmlldy5WaWV3IAorICAgICAqIEBzZWUgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IKKyAgICAgKiBAc2VlIGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJzLkN1cnNvclRyYW5zZm9ybWF0aW9uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBDdXJzb3JCaW5kZXIgeworICAgICAgICAvKioKKyAgICAgICAgICogPHA+VGhlIGNvbnRleHQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgYmluZGVyLjwvcD4KKyAgICAgICAgICovCisgICAgICAgIHByb3RlY3RlZCBmaW5hbCBDb250ZXh0IG1Db250ZXh0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiA8cD5UaGUgdHJhbnNmb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoaXMgYmluZGVyLiBUaGlzIHRyYW5zZm9ybWF0aW9uIGlzIG5ldmVyCisgICAgICAgICAqIG51bGwgYW5kIG1heSBvciBtYXkgbm90IGJlIGFwcGxpZWQgdG8gdGhlIEN1cnNvciBkYXRhIGR1cmluZyB0aGUKKyAgICAgICAgICoge0BsaW5rICNiaW5kKGFuZHJvaWQudmlldy5WaWV3LCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvciwgaW50KX0gb3BlcmF0aW9uLjwvcD4KKyAgICAgICAgICogCisgICAgICAgICAqIEBzZWUgI2JpbmQoYW5kcm9pZC52aWV3LlZpZXcsIGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yLCBpbnQpIAorICAgICAgICAgKi8KKyAgICAgICAgcHJvdGVjdGVkIGZpbmFsIEN1cnNvclRyYW5zZm9ybWF0aW9uIG1UcmFuc2Zvcm1hdGlvbjsKKworICAgICAgICAvKioKKyAgICAgICAgICogPHA+Q3JlYXRlcyBhIG5ldyBDdXJzb3IgYmluZGVyLjwvcD4gCisgICAgICAgICAqIAorICAgICAgICAgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCBhc3NvY2lhdGVkIHdpdGggdGhpcyBiaW5kZXIuCisgICAgICAgICAqIEBwYXJhbSB0cmFuc2Zvcm1hdGlvbiBUaGUgdHJhbnNmb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoaXMgYmluZGVyLiBUaGlzCisgICAgICAgICAqICAgICAgICB0cmFuc2Zvcm1hdGlvbiBtYXkgb3IgbWF5IG5vdCBiZSBhcHBsaWVkIGJ5IHRoZSBiaW5kZXIgYW5kIGlzIGd1YXJhbnRlZWQKKyAgICAgICAgICogICAgICAgIHRvIG5vdCBiZSBudWxsLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEN1cnNvckJpbmRlcihDb250ZXh0IGNvbnRleHQsIEN1cnNvclRyYW5zZm9ybWF0aW9uIHRyYW5zZm9ybWF0aW9uKSB7CisgICAgICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7CisgICAgICAgICAgICBtVHJhbnNmb3JtYXRpb24gPSB0cmFuc2Zvcm1hdGlvbjsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiA8cD5CaW5kcyB0aGUgc3BlY2lmaWVkIEN1cnNvciBjb2x1bW4gdG8gdGhlIHN1cHBsaWVkIFZpZXcuIFRoZSBiaW5kaW5nIG9wZXJhdGlvbgorICAgICAgICAgKiBjYW4gcXVlcnkgb3RoZXIgQ3Vyc29yIGNvbHVtbnMgYXMgbmVlZGVkLiBEdXJpbmcgdGhlIGJpbmRpbmcgb3BlcmF0aW9uLCB2YWx1ZXMKKyAgICAgICAgICogcmV0cmlldmVkIGZyb20gdGhlIEN1cnNvciBtYXkgb3IgbWF5IG5vdCBiZSB0cmFuc2Zvcm1lZCB1c2luZyB0aGlzIGJpbmRlcidzCisgICAgICAgICAqIGN1cnNvciB0cmFuc2Zvcm1hdGlvbi48L3A+CisgICAgICAgICAqIAorICAgICAgICAgKiBAcGFyYW0gdmlldyBUaGUgdmlldyB0byBiaW5kIGRhdGEgdG8uCisgICAgICAgICAqIEBwYXJhbSBjdXJzb3IgVGhlIGN1cnNvciB0byBiaW5kIGRhdGEgZnJvbS4KKyAgICAgICAgICogQHBhcmFtIGNvbHVtbkluZGV4IFRoZSBjb2x1bW4gaW5kZXggaW4gdGhlIGN1cnNvciB3aGVyZSB0aGUgZGF0YSB0byBiaW5kIHJlc2lkZXMuCisgICAgICAgICAqIAorICAgICAgICAgKiBAc2VlICNtVHJhbnNmb3JtYXRpb24KKyAgICAgICAgICogCisgICAgICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgY29sdW1uIHdhcyBzdWNjZXNzZnVsbHkgYm91bmQgdG8gdGhlIFZpZXcsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGJpbmQoVmlldyB2aWV3LCBDdXJzb3IgY3Vyc29yLCBpbnQgY29sdW1uSW5kZXgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIDxwPkludGVyZmFjZSB1c2VkIHRvIHRyYW5zZm9ybSBkYXRhIGNvbWluZyBvdXQgb2YgYSB7QGxpbmsgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3J9CisgICAgICogYmVmb3JlIGl0IGlzIGJvdW5kIHRvIGEge0BsaW5rIGFuZHJvaWQudmlldy5WaWV3fS48L3A+CisgICAgICogCisgICAgICogPHA+VHJhbnNmb3JtYXRpb25zIGFyZSB1c2VkIHRvIHRyYW5zZm9ybSB0ZXh0LWJhc2VkIGRhdGEgKGluIHRoZSBmb3JtIG9mIGEgU3RyaW5nKSwKKyAgICAgKiBvciB0byB0cmFuc2Zvcm0gZGF0YSBpbnRvIGEgcmVzb3VyY2UgaWRlbnRpZmllci4gQSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGlzIHByb3ZpZGVkCisgICAgICogdG8gZ2VuZXJhdGUgcmVzb3VyY2UgaWRlbnRpZmllcnMuPC9wPgorICAgICAqIAorICAgICAqIEBzZWUgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IKKyAgICAgKiBAc2VlIGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJzLkN1cnNvckJpbmRlcgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgQ3Vyc29yVHJhbnNmb3JtYXRpb24geworICAgICAgICAvKioKKyAgICAgICAgICogPHA+VGhlIGNvbnRleHQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgdHJhbnNmb3JtYXRpb24uPC9wPgorICAgICAgICAgKi8KKyAgICAgICAgcHJvdGVjdGVkIGZpbmFsIENvbnRleHQgbUNvbnRleHQ7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIDxwPkNyZWF0ZXMgYSBuZXcgQ3Vyc29yIHRyYW5zZm9ybWF0aW9uLjwvcD4KKyAgICAgICAgICogCisgICAgICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IGFzc29jaWF0ZWQgd2l0aCB0aGlzIHRyYW5zZm9ybWF0aW9uLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEN1cnNvclRyYW5zZm9ybWF0aW9uKENvbnRleHQgY29udGV4dCkgeworICAgICAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIDxwPlRyYW5zZm9ybXMgdGhlIHNwZWNpZmllZCBDdXJzb3IgY29sdW1uIGludG8gYSBTdHJpbmcuIFRoZSB0cmFuc2Zvcm1hdGlvbgorICAgICAgICAgKiBjYW4gc2ltcGx5IHJldHVybiB0aGUgY29udGVudCBvZiB0aGUgY29sdW1uIGFzIGEgU3RyaW5nICh0aGlzIGlzIGtub3duCisgICAgICAgICAqIGFzIHRoZSBpZGVudGl0eSB0cmFuc2Zvcm1hdGlvbikgb3IgbWFuaXB1bGF0ZSB0aGUgY29udGVudC4gRm9yIGluc3RhbmNlLAorICAgICAgICAgKiBhIHRyYW5zZm9ybWF0aW9uIGNhbiBwZXJmb3JtIHRleHQgc3Vic3RpdHV0aW9ucyBvciBjb25jYXRlbmF0ZSBvdGhlcgorICAgICAgICAgKiBjb2x1bW5zIHdpdGggdGhlIHNwZWNpZmllZCBjb2x1bW4uPC9wPgorICAgICAgICAgKiAKKyAgICAgICAgICogQHBhcmFtIGN1cnNvciBUaGUgY3Vyc29yIHRoYXQgY29udGFpbnMgdGhlIGRhdGEgdG8gdHJhbnNmb3JtLiAKKyAgICAgICAgICogQHBhcmFtIGNvbHVtbkluZGV4IFRoZSBpbmRleCBvZiB0aGUgY29sdW1uIHRvIHRyYW5zZm9ybS4KKyAgICAgICAgICogCisgICAgICAgICAqIEByZXR1cm4gQSBTdHJpbmcgY29udGFpbmluZyB0aGUgdHJhbnNmb3JtZWQgdmFsdWUgb2YgdGhlIGNvbHVtbi4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgdHJhbnNmb3JtKEN1cnNvciBjdXJzb3IsIGludCBjb2x1bW5JbmRleCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIDxwPlRyYW5zZm9ybXMgdGhlIHNwZWNpZmllZCBDdXJzb3IgY29sdW1uIGludG8gYSByZXNvdXJjZSBpZGVudGlmaWVyLgorICAgICAgICAgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBzaW1wbHkgaW50ZXJwcmV0cyB0aGUgY29udGVudCBvZiB0aGUgY29sdW1uCisgICAgICAgICAqIGFzIGFuIGludGVnZXIuPC9wPgorICAgICAgICAgKiAKKyAgICAgICAgICogQHBhcmFtIGN1cnNvciBUaGUgY3Vyc29yIHRoYXQgY29udGFpbnMgdGhlIGRhdGEgdG8gdHJhbnNmb3JtLiAKKyAgICAgICAgICogQHBhcmFtIGNvbHVtbkluZGV4IFRoZSBpbmRleCBvZiB0aGUgY29sdW1uIHRvIHRyYW5zZm9ybS4KKyAgICAgICAgICogCisgICAgICAgICAqIEByZXR1cm4gQSByZXNvdXJjZSBpZGVudGlmaWVyLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGludCB0cmFuc2Zvcm1Ub1Jlc291cmNlKEN1cnNvciBjdXJzb3IsIGludCBjb2x1bW5JbmRleCkgeworICAgICAgICAgICAgcmV0dXJuIGN1cnNvci5nZXRJbnQoY29sdW1uSW5kZXgpOworICAgICAgICB9ICAgICAgICAKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiA8cD5Mb2FkcyB0aGUge0BsaW5rIGFuZHJvaWQud2lkZ2V0LkN1cnNvckFkYXB0ZXJ9IGRlZmluZWQgaW4gdGhlIHNwZWNpZmllZAorICAgICAqIFhNTCByZXNvdXJjZS4gVGhlIGNvbnRlbnQgb2YgdGhlIGFkYXB0ZXIgaXMgbG9hZGVkIGZyb20gdGhlIGNvbnRlbnQgcHJvdmlkZXIKKyAgICAgKiBpZGVudGlmaWVkIGJ5IHRoZSBzdXBwbGllZCBVUkkuPC9wPgorICAgICAqIAorICAgICAqIDxwPjxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4gSWYgdGhlIHN1cHBsaWVkIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dH0gaXMKKyAgICAgKiBhbiB7QGxpbmsgYW5kcm9pZC5hcHAuQWN0aXZpdHl9LCB0aGUgY3Vyc29yIHJldHVybmVkIGJ5IHRoZSBjb250ZW50IHByb3ZpZGVyCisgICAgICogd2lsbCBiZSBhdXRvbWF0aWNhbGx5IG1hbmFnZWQuIE90aGVyd2lzZSwgeW91IGFyZSByZXNwb25zaWJsZSBmb3IgbWFuYWdpbmcgdGhlCisgICAgICogY3Vyc29yIHlvdXJzZWxmLjwvcD4KKyAgICAgKiAKKyAgICAgKiA8cD5UaGUgZm9ybWF0IG9mIHRoZSBYTUwgZGVmaW5pdGlvbiBvZiB0aGUgY3Vyc29yIGFkYXB0ZXIgaXMgZG9jdW1lbnRlZCBhdAorICAgICAqIHRoZSB0b3Agb2YgdGhpcyBwYWdlLjwvcD4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCB0byBsb2FkIHRoZSBYTUwgcmVzb3VyY2UgZnJvbS4KKyAgICAgKiBAcGFyYW0gaWQgVGhlIGlkZW50aWZpZXIgb2YgdGhlIFhNTCByZXNvdXJjZSBkZWNsYXJpbmcgdGhlIGFkYXB0ZXIuCisgICAgICogQHBhcmFtIHVyaSBUaGUgVVJJIG9mIHRoZSBjb250ZW50IHByb3ZpZGVyLgorICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJzIE9wdGlvbmFsIHBhcmFtZXRlcnMgdG8gcGFzcyB0byB0aGUgQ3Vyc29yQWRhcHRlciwgdXNlZAorICAgICAqICAgICAgICB0byBzdWJzdGl0dXRlIHZhbHVlcyBpbiB0aGUgc2VsZWN0aW9uIGV4cHJlc3Npb24uCisgICAgICogCisgICAgICogQHJldHVybiBBIHtAbGluayBhbmRyb2lkLndpZGdldC5DdXJzb3JBZGFwdGVyfQorICAgICAqIAorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIElmIHRoZSBYTUwgcmVzb3VyY2UgZG9lcyBub3QgY29udGFpbgorICAgICAqICAgICAgICAgYSB2YWxpZCAmbHQ7Y3Vyc29yLWFkYXB0ZXIgLyZndDsgZGVmaW5pdGlvbi4KKyAgICAgKiAKKyAgICAgKiBAc2VlIGFuZHJvaWQuY29udGVudC5Db250ZW50UHJvdmlkZXIKKyAgICAgKiBAc2VlIGFuZHJvaWQud2lkZ2V0LkN1cnNvckFkYXB0ZXIKKyAgICAgKiBAc2VlICNsb2FkQWRhcHRlcihhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCwgaW50LCBPYmplY3RbXSkgCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBDdXJzb3JBZGFwdGVyIGxvYWRDdXJzb3JBZGFwdGVyKENvbnRleHQgY29udGV4dCwgaW50IGlkLCBTdHJpbmcgdXJpLAorICAgICAgICAgICAgT2JqZWN0Li4uIHBhcmFtZXRlcnMpIHsKKworICAgICAgICBYbWxDdXJzb3JBZGFwdGVyIGFkYXB0ZXIgPSAoWG1sQ3Vyc29yQWRhcHRlcikgbG9hZEFkYXB0ZXIoY29udGV4dCwgaWQsIEFEQVBURVJfQ1VSU09SLAorICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMpOworCisgICAgICAgIGlmICh1cmkgIT0gbnVsbCkgeworICAgICAgICAgICAgYWRhcHRlci5zZXRVcmkodXJpKTsKKyAgICAgICAgfQorICAgICAgICBhZGFwdGVyLmxvYWQoKTsKKworICAgICAgICByZXR1cm4gYWRhcHRlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiA8cD5Mb2FkcyB0aGUge0BsaW5rIGFuZHJvaWQud2lkZ2V0LkN1cnNvckFkYXB0ZXJ9IGRlZmluZWQgaW4gdGhlIHNwZWNpZmllZAorICAgICAqIFhNTCByZXNvdXJjZS4gVGhlIGNvbnRlbnQgb2YgdGhlIGFkYXB0ZXIgaXMgbG9hZGVkIGZyb20gdGhlIHNwZWNpZmllZCBjdXJzb3IuCisgICAgICogWW91IGFyZSByZXNwb25zaWJsZSBmb3IgbWFuYWdpbmcgdGhlIHN1cHBsaWVkIGN1cnNvci48L3A+CisgICAgICogCisgICAgICogPHA+VGhlIGZvcm1hdCBvZiB0aGUgWE1MIGRlZmluaXRpb24gb2YgdGhlIGN1cnNvciBhZGFwdGVyIGlzIGRvY3VtZW50ZWQgYXQKKyAgICAgKiB0aGUgdG9wIG9mIHRoaXMgcGFnZS48L3A+CisgICAgICogCisgICAgICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQgdG8gbG9hZCB0aGUgWE1MIHJlc291cmNlIGZyb20uCisgICAgICogQHBhcmFtIGlkIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBYTUwgcmVzb3VyY2UgZGVjbGFyaW5nIHRoZSBhZGFwdGVyLgorICAgICAqIEBwYXJhbSBjdXJzb3IgVGhlIGN1cnNvciBjb250YWluaW5nIHRoZSBkYXRhIGZvciB0aGUgYWRhcHRlci4KKyAgICAgKiBAcGFyYW0gcGFyYW1ldGVycyBPcHRpb25hbCBwYXJhbWV0ZXJzIHRvIHBhc3MgdG8gdGhlIEN1cnNvckFkYXB0ZXIsIHVzZWQKKyAgICAgKiAgICAgICAgdG8gc3Vic3RpdHV0ZSB2YWx1ZXMgaW4gdGhlIHNlbGVjdGlvbiBleHByZXNzaW9uLgorICAgICAqIAorICAgICAqIEByZXR1cm4gQSB7QGxpbmsgYW5kcm9pZC53aWRnZXQuQ3Vyc29yQWRhcHRlcn0KKyAgICAgKiAKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBJZiB0aGUgWE1MIHJlc291cmNlIGRvZXMgbm90IGNvbnRhaW4KKyAgICAgKiAgICAgICAgIGEgdmFsaWQgJmx0O2N1cnNvci1hZGFwdGVyIC8mZ3Q7IGRlZmluaXRpb24uCisgICAgICogCisgICAgICogQHNlZSBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFByb3ZpZGVyCisgICAgICogQHNlZSBhbmRyb2lkLndpZGdldC5DdXJzb3JBZGFwdGVyCisgICAgICogQHNlZSBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcgorICAgICAqIEBzZWUgI2xvYWRBZGFwdGVyKGFuZHJvaWQuY29udGVudC5Db250ZXh0LCBpbnQsIE9iamVjdFtdKSAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEN1cnNvckFkYXB0ZXIgbG9hZEN1cnNvckFkYXB0ZXIoQ29udGV4dCBjb250ZXh0LCBpbnQgaWQsIEN1cnNvciBjdXJzb3IsCisgICAgICAgICAgICBPYmplY3QuLi4gcGFyYW1ldGVycykgeworCisgICAgICAgIFhtbEN1cnNvckFkYXB0ZXIgYWRhcHRlciA9IChYbWxDdXJzb3JBZGFwdGVyKSBsb2FkQWRhcHRlcihjb250ZXh0LCBpZCwgQURBUFRFUl9DVVJTT1IsCisgICAgICAgICAgICAgICAgcGFyYW1ldGVycyk7CisKKyAgICAgICAgaWYgKGN1cnNvciAhPSBudWxsKSB7CisgICAgICAgICAgICBhZGFwdGVyLmNoYW5nZUN1cnNvcihjdXJzb3IpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGFkYXB0ZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogPHA+TG9hZHMgdGhlIGFkYXB0ZXIgZGVmaW5lZCBpbiB0aGUgc3BlY2lmaWVkIFhNTCByZXNvdXJjZS4gVGhlIFhNTCBkZWZpbml0aW9uIG9mCisgICAgICogdGhlIGFkYXB0ZXIgbXVzdCBmb2xsb3cgdGhlIGZvcm1hdCBkZWZpbml0aW9uIG9mIG9uZSBvZiB0aGUgc3VwcG9ydGVkIGFkYXB0ZXIKKyAgICAgKiB0eXBlcyBkZXNjcmliZWQgYXQgdGhlIHRvcCBvZiB0aGlzIHBhZ2UuPC9wPgorICAgICAqIAorICAgICAqIDxwPjxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4gSWYgdGhlIGxvYWRlZCBhZGFwdGVyIGlzIGEge0BsaW5rIGFuZHJvaWQud2lkZ2V0LkN1cnNvckFkYXB0ZXJ9CisgICAgICogYW5kIHRoZSBzdXBwbGllZCB7QGxpbmsgYW5kcm9pZC5jb250ZW50LkNvbnRleHR9IGlzIGFuIHtAbGluayBhbmRyb2lkLmFwcC5BY3Rpdml0eX0sCisgICAgICogdGhlIGN1cnNvciByZXR1cm5lZCBieSB0aGUgY29udGVudCBwcm92aWRlciB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgbWFuYWdlZC4gT3RoZXJ3aXNlLAorICAgICAqIHlvdSBhcmUgcmVzcG9uc2libGUgZm9yIG1hbmFnaW5nIHRoZSBjdXJzb3IgeW91cnNlbGYuPC9wPgorICAgICAqIAorICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IHRvIGxvYWQgdGhlIFhNTCByZXNvdXJjZSBmcm9tLgorICAgICAqIEBwYXJhbSBpZCBUaGUgaWRlbnRpZmllciBvZiB0aGUgWE1MIHJlc291cmNlIGRlY2xhcmluZyB0aGUgYWRhcHRlci4KKyAgICAgKiBAcGFyYW0gcGFyYW1ldGVycyBPcHRpb25hbCBwYXJhbWV0ZXJzIHRvIHBhc3MgdG8gdGhlIGFkYXB0ZXIuCisgICAgICogIAorICAgICAqIEByZXR1cm4gQW4gYWRhcHRlciBpbnN0YW5jZS4KKyAgICAgKiAKKyAgICAgKiBAc2VlICNsb2FkQ3Vyc29yQWRhcHRlcihhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCwgaW50LCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvciwgT2JqZWN0W10pIAorICAgICAqIEBzZWUgI2xvYWRDdXJzb3JBZGFwdGVyKGFuZHJvaWQuY29udGVudC5Db250ZXh0LCBpbnQsIFN0cmluZywgT2JqZWN0W10pIAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQmFzZUFkYXB0ZXIgbG9hZEFkYXB0ZXIoQ29udGV4dCBjb250ZXh0LCBpbnQgaWQsIE9iamVjdC4uLiBwYXJhbWV0ZXJzKSB7CisgICAgICAgIGZpbmFsIEJhc2VBZGFwdGVyIGFkYXB0ZXIgPSBsb2FkQWRhcHRlcihjb250ZXh0LCBpZCwgbnVsbCwgcGFyYW1ldGVycyk7CisgICAgICAgIGlmIChhZGFwdGVyIGluc3RhbmNlb2YgTWFuYWdlZEFkYXB0ZXIpIHsKKyAgICAgICAgICAgICgoTWFuYWdlZEFkYXB0ZXIpIGFkYXB0ZXIpLmxvYWQoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYWRhcHRlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMb2FkcyBhbiBhZGFwdGVyIGZyb20gdGhlIHNwZWNpZmllZCBYTUwgcmVzb3VyY2UuIFRoZSBvcHRpb25hbCBhc3NlcnROYW1lIGNhbgorICAgICAqIGJlIHVzZWQgdG8gZXhpdCBlYXJseSBpZiB0aGUgYWRhcHRlciBkZWZpbmVkIGluIHRoZSBYTUwgcmVzb3VyY2UgaXMgbm90IG9mIHRoZQorICAgICAqIGV4cGVjdGVkIHR5cGUuCisgICAgICogCisgICAgICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQgdG8gYXNzb2NpYXRlIHdpdGggdGhlIGFkYXB0ZXIuCisgICAgICogQHBhcmFtIGlkIFRoZSByZXNvdXJjZSBpZCBvZiB0aGUgWE1MIGRvY3VtZW50IGRlZmluaW5nIHRoZSBhZGFwdGVyLgorICAgICAqIEBwYXJhbSBhc3NlcnROYW1lIFRoZSBtYW5kYXRvcnkgbmFtZSBvZiB0aGUgYWRhcHRlciBpbiB0aGUgWE1MIGRvY3VtZW50LgorICAgICAqICAgICAgICBJZ25vcmVkIGlmIG51bGwuCisgICAgICogQHBhcmFtIHBhcmFtZXRlcnMgT3B0aW9uYWwgcGFyYW1ldGVycyBwYXNzZWQgdG8gdGhlIGFkYXB0ZXIuCisgICAgICogCisgICAgICogQHJldHVybiBBbiBpbnN0YW5jZSBvZiB7QGxpbmsgYW5kcm9pZC53aWRnZXQuQmFzZUFkYXB0ZXJ9LgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIEJhc2VBZGFwdGVyIGxvYWRBZGFwdGVyKENvbnRleHQgY29udGV4dCwgaW50IGlkLCBTdHJpbmcgYXNzZXJ0TmFtZSwKKyAgICAgICAgICAgIE9iamVjdC4uLiBwYXJhbWV0ZXJzKSB7CisKKyAgICAgICAgWG1sUmVzb3VyY2VQYXJzZXIgcGFyc2VyID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHBhcnNlciA9IGNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0WG1sKGlkKTsKKyAgICAgICAgICAgIHJldHVybiBjcmVhdGVBZGFwdGVyRnJvbVhtbChjb250ZXh0LCBwYXJzZXIsIFhtbC5hc0F0dHJpYnV0ZVNldChwYXJzZXIpLAorICAgICAgICAgICAgICAgICAgICBpZCwgcGFyYW1ldGVycywgYXNzZXJ0TmFtZSk7CisgICAgICAgIH0gY2F0Y2ggKFhtbFB1bGxQYXJzZXJFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIFJlc291cmNlcy5Ob3RGb3VuZEV4Y2VwdGlvbiBybmYgPSBuZXcgUmVzb3VyY2VzLk5vdEZvdW5kRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiQ2FuJ3QgbG9hZCBhZGFwdGVyIHJlc291cmNlIElEICIgKworICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmdldFJlc291cmNlcygpLmdldFJlc291cmNlRW50cnlOYW1lKGlkKSk7CisgICAgICAgICAgICBybmYuaW5pdENhdXNlKGV4KTsKKyAgICAgICAgICAgIHRocm93IHJuZjsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIFJlc291cmNlcy5Ob3RGb3VuZEV4Y2VwdGlvbiBybmYgPSBuZXcgUmVzb3VyY2VzLk5vdEZvdW5kRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiQ2FuJ3QgbG9hZCBhZGFwdGVyIHJlc291cmNlIElEICIgKworICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmdldFJlc291cmNlcygpLmdldFJlc291cmNlRW50cnlOYW1lKGlkKSk7CisgICAgICAgICAgICBybmYuaW5pdENhdXNlKGV4KTsKKyAgICAgICAgICAgIHRocm93IHJuZjsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChwYXJzZXIgIT0gbnVsbCkgcGFyc2VyLmNsb3NlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZW5lcmF0ZXMgYW4gYWRhcHRlciB1c2luZyB0aGUgc3BlY2lmaWVkIFhNTCBwYXJzZXIuIFRoaXMgbWV0aG9kIGlzIHJlc3BvbnNpYmxlCisgICAgICogZm9yIGNob29zaW5nIHRoZSB0eXBlIG9mIHRoZSBhZGFwdGVyIHRvIGNyZWF0ZSBiYXNlZCBvbiB0aGUgY29udGVudCBvZiB0aGUKKyAgICAgKiBYTUwgcGFyc2VyLgorICAgICAqIAorICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgZ2VuZXJhdGUgYW4ge0BsaW5rIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbn0gaWYKKyAgICAgKiA8Y29kZT5hc3NlcnROYW1lPC9jb2RlPiBpcyBub3QgbnVsbCBhbmQgZG9lcyBub3QgbWF0Y2ggdGhlIHJvb3QgdGFnIG9mIHRoZSBYTUwKKyAgICAgKiBkb2N1bWVudC4gCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgQmFzZUFkYXB0ZXIgY3JlYXRlQWRhcHRlckZyb21YbWwoQ29udGV4dCBjLAorICAgICAgICAgICAgWG1sUHVsbFBhcnNlciBwYXJzZXIsIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGlkLCBPYmplY3RbXSBwYXJhbWV0ZXJzLAorICAgICAgICAgICAgU3RyaW5nIGFzc2VydE5hbWUpIHRocm93cyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgQmFzZUFkYXB0ZXIgYWRhcHRlciA9IG51bGw7CisKKyAgICAgICAgLy8gTWFrZSBzdXJlIHdlIGFyZSBvbiBhIHN0YXJ0IHRhZy4KKyAgICAgICAgaW50IHR5cGU7CisgICAgICAgIGludCBkZXB0aCA9IHBhcnNlci5nZXREZXB0aCgpOworCisgICAgICAgIHdoaWxlICgoKHR5cGUgPSBwYXJzZXIubmV4dCgpKSAhPSBYbWxQdWxsUGFyc2VyLkVORF9UQUcgfHwgcGFyc2VyLmdldERlcHRoKCkgPiBkZXB0aCkgJiYKKyAgICAgICAgICAgICAgICB0eXBlICE9IFhtbFB1bGxQYXJzZXIuRU5EX0RPQ1VNRU5UKSB7CisKKyAgICAgICAgICAgIGlmICh0eXBlICE9IFhtbFB1bGxQYXJzZXIuU1RBUlRfVEFHKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFN0cmluZyBuYW1lID0gcGFyc2VyLmdldE5hbWUoKTsKKyAgICAgICAgICAgIGlmIChhc3NlcnROYW1lICE9IG51bGwgJiYgIWFzc2VydE5hbWUuZXF1YWxzKG5hbWUpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGFkYXB0ZXIgZGVmaW5lZCBpbiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgIGMuZ2V0UmVzb3VyY2VzKCkuZ2V0UmVzb3VyY2VFbnRyeU5hbWUoaWQpICsgIiBtdXN0IGJlIGEgPCIgKyBuYW1lICsgIiAvPiIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoQURBUFRFUl9DVVJTT1IuZXF1YWxzKG5hbWUpKSB7CisgICAgICAgICAgICAgICAgYWRhcHRlciA9IGNyZWF0ZUN1cnNvckFkYXB0ZXIoYywgcGFyc2VyLCBhdHRycywgaWQsIHBhcmFtZXRlcnMpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbmtub3duIGFkYXB0ZXIgbmFtZSAiICsgcGFyc2VyLmdldE5hbWUoKSArCisgICAgICAgICAgICAgICAgICAgICAgICAiIGluICIgKyBjLmdldFJlc291cmNlcygpLmdldFJlc291cmNlRW50cnlOYW1lKGlkKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gYWRhcHRlcjsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYW4gWG1sQ3Vyc29yQWRhcHRlciB1c2luZyBhbiBYbWxDdXJzb3JBZGFwdGVyUGFyc2VyLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIFhtbEN1cnNvckFkYXB0ZXIgY3JlYXRlQ3Vyc29yQWRhcHRlcihDb250ZXh0IGMsIFhtbFB1bGxQYXJzZXIgcGFyc2VyLAorICAgICAgICAgICAgQXR0cmlidXRlU2V0IGF0dHJzLCBpbnQgaWQsIE9iamVjdFtdIHBhcmFtZXRlcnMpCisgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24geworCisgICAgICAgIHJldHVybiBuZXcgWG1sQ3Vyc29yQWRhcHRlclBhcnNlcihjLCBwYXJzZXIsIGF0dHJzLCBpZCkucGFyc2UocGFyYW1ldGVycyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFyc2VyIHRoYXQgY2FuIGdlbmVyYXRlIFhtbEN1cnNvckFkYXB0ZXIgaW5zdGFuY2VzLiBUaGlzIHBhcnNlciBpcyByZXNwb25zaWJsZSBmb3IKKyAgICAgKiBoYW5kbGluZyBhbGwgdGhlIGF0dHJpYnV0ZXMgYW5kIGNoaWxkIG5vZGVzIGZvciBhICZsdDtjdXJzb3ItYWRhcHRlciAvJmd0Oy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBYbWxDdXJzb3JBZGFwdGVyUGFyc2VyIHsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFEQVBURVJfQ1VSU09SX0JJTkQgPSAiYmluZCI7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBREFQVEVSX0NVUlNPUl9TRUxFQ1QgPSAic2VsZWN0IjsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFEQVBURVJfQ1VSU09SX0FTX1NUUklORyA9ICJzdHJpbmciOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQURBUFRFUl9DVVJTT1JfQVNfSU1BR0UgPSAiaW1hZ2UiOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQURBUFRFUl9DVVJTT1JfQVNfVEFHID0gInRhZyI7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBREFQVEVSX0NVUlNPUl9BU19JTUFHRV9VUkkgPSAiaW1hZ2UtdXJpIjsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFEQVBURVJfQ1VSU09SX0FTX0RSQVdBQkxFID0gImRyYXdhYmxlIjsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFEQVBURVJfQ1VSU09SX01BUCA9ICJtYXAiOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQURBUFRFUl9DVVJTT1JfVFJBTlNGT1JNID0gInRyYW5zZm9ybSI7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBDb250ZXh0IG1Db250ZXh0OworICAgICAgICBwcml2YXRlIGZpbmFsIFhtbFB1bGxQYXJzZXIgbVBhcnNlcjsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBBdHRyaWJ1dGVTZXQgbUF0dHJzOworICAgICAgICBwcml2YXRlIGZpbmFsIGludCBtSWQ7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBIYXNoTWFwPFN0cmluZywgQ3Vyc29yQmluZGVyPiBtQmluZGVyczsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Q8U3RyaW5nPiBtRnJvbTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Q8SW50ZWdlcj4gbVRvOworICAgICAgICBwcml2YXRlIGZpbmFsIEN1cnNvclRyYW5zZm9ybWF0aW9uIG1JZGVudGl0eTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBSZXNvdXJjZXMgbVJlc291cmNlczsKKworICAgICAgICBwdWJsaWMgWG1sQ3Vyc29yQWRhcHRlclBhcnNlcihDb250ZXh0IGMsIFhtbFB1bGxQYXJzZXIgcGFyc2VyLCBBdHRyaWJ1dGVTZXQgYXR0cnMsIGludCBpZCkgeworICAgICAgICAgICAgbUNvbnRleHQgPSBjOworICAgICAgICAgICAgbVBhcnNlciA9IHBhcnNlcjsKKyAgICAgICAgICAgIG1BdHRycyA9IGF0dHJzOworICAgICAgICAgICAgbUlkID0gaWQ7CisKKyAgICAgICAgICAgIG1SZXNvdXJjZXMgPSBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKTsKKyAgICAgICAgICAgIG1CaW5kZXJzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBDdXJzb3JCaW5kZXI+KCk7CisgICAgICAgICAgICBtRnJvbSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworICAgICAgICAgICAgbVRvID0gbmV3IEFycmF5TGlzdDxJbnRlZ2VyPigpOworICAgICAgICAgICAgbUlkZW50aXR5ID0gbmV3IElkZW50aXR5VHJhbnNmb3JtYXRpb24obUNvbnRleHQpOyAgICAgICAgICAgIAorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFhtbEN1cnNvckFkYXB0ZXIgcGFyc2UoT2JqZWN0W10gcGFyYW1ldGVycykKKyAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiB7CisKKyAgICAgICAgICAgIFJlc291cmNlcyByZXNvdXJjZXMgPSBtUmVzb3VyY2VzOworICAgICAgICAgICAgVHlwZWRBcnJheSBhID0gcmVzb3VyY2VzLm9idGFpbkF0dHJpYnV0ZXMobUF0dHJzLCBhbmRyb2lkLlIuc3R5bGVhYmxlLkN1cnNvckFkYXB0ZXIpOworCisgICAgICAgICAgICBTdHJpbmcgdXJpID0gYS5nZXRTdHJpbmcoYW5kcm9pZC5SLnN0eWxlYWJsZS5DdXJzb3JBZGFwdGVyX3VyaSk7CisgICAgICAgICAgICBTdHJpbmcgc2VsZWN0aW9uID0gYS5nZXRTdHJpbmcoYW5kcm9pZC5SLnN0eWxlYWJsZS5DdXJzb3JBZGFwdGVyX3NlbGVjdGlvbik7CisgICAgICAgICAgICBTdHJpbmcgc29ydE9yZGVyID0gYS5nZXRTdHJpbmcoYW5kcm9pZC5SLnN0eWxlYWJsZS5DdXJzb3JBZGFwdGVyX3NvcnRPcmRlcik7CisgICAgICAgICAgICBpbnQgbGF5b3V0ID0gYS5nZXRSZXNvdXJjZUlkKGFuZHJvaWQuUi5zdHlsZWFibGUuQ3Vyc29yQWRhcHRlcl9sYXlvdXQsIDApOworICAgICAgICAgICAgaWYgKGxheW91dCA9PSAwKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGxheW91dCBzcGVjaWZpZWQgaW4gIiArCisgICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0UmVzb3VyY2VFbnRyeU5hbWUobUlkKSArICIgZG9lcyBub3QgZXhpc3QiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYS5yZWN5Y2xlKCk7CisKKyAgICAgICAgICAgIFhtbFB1bGxQYXJzZXIgcGFyc2VyID0gbVBhcnNlcjsKKyAgICAgICAgICAgIGludCB0eXBlOworICAgICAgICAgICAgaW50IGRlcHRoID0gcGFyc2VyLmdldERlcHRoKCk7CisKKyAgICAgICAgICAgIHdoaWxlICgoKHR5cGUgPSBwYXJzZXIubmV4dCgpKSAhPSBYbWxQdWxsUGFyc2VyLkVORF9UQUcgfHwgcGFyc2VyLmdldERlcHRoKCkgPiBkZXB0aCkgJiYKKyAgICAgICAgICAgICAgICAgICAgdHlwZSAhPSBYbWxQdWxsUGFyc2VyLkVORF9ET0NVTUVOVCkgeworCisgICAgICAgICAgICAgICAgaWYgKHR5cGUgIT0gWG1sUHVsbFBhcnNlci5TVEFSVF9UQUcpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBwYXJzZXIuZ2V0TmFtZSgpOworCisgICAgICAgICAgICAgICAgaWYgKEFEQVBURVJfQ1VSU09SX0JJTkQuZXF1YWxzKG5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgIHBhcnNlQmluZFRhZygpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoQURBUFRFUl9DVVJTT1JfU0VMRUNULmVxdWFscyhuYW1lKSkgeworICAgICAgICAgICAgICAgICAgICBwYXJzZVNlbGVjdFRhZygpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJVbmtub3duIHRhZyBuYW1lICIgKyBwYXJzZXIuZ2V0TmFtZSgpICsgIiBpbiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0UmVzb3VyY2VFbnRyeU5hbWUobUlkKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTdHJpbmdbXSBmcm9tQXJyYXkgPSBtRnJvbS50b0FycmF5KG5ldyBTdHJpbmdbbUZyb20uc2l6ZSgpXSk7CisgICAgICAgICAgICBpbnRbXSB0b0FycmF5ID0gbmV3IGludFttVG8uc2l6ZSgpXTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdG9BcnJheS5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIHRvQXJyYXlbaV0gPSBtVG8uZ2V0KGkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTdHJpbmdbXSBzZWxlY3Rpb25BcmdzID0gbnVsbDsKKyAgICAgICAgICAgIGlmIChwYXJhbWV0ZXJzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzZWxlY3Rpb25BcmdzID0gbmV3IFN0cmluZ1twYXJhbWV0ZXJzLmxlbmd0aF07CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZWxlY3Rpb25BcmdzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbkFyZ3NbaV0gPSAoU3RyaW5nKSBwYXJhbWV0ZXJzW2ldOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxDdXJzb3JBZGFwdGVyKG1Db250ZXh0LCBsYXlvdXQsIHVyaSwgZnJvbUFycmF5LCB0b0FycmF5LCBzZWxlY3Rpb24sCisgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbkFyZ3MsIHNvcnRPcmRlciwgbUJpbmRlcnMpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIHBhcnNlU2VsZWN0VGFnKCkgeworICAgICAgICAgICAgVHlwZWRBcnJheSBhID0gbVJlc291cmNlcy5vYnRhaW5BdHRyaWJ1dGVzKG1BdHRycywKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZC5SLnN0eWxlYWJsZS5DdXJzb3JBZGFwdGVyX1NlbGVjdEl0ZW0pOworCisgICAgICAgICAgICBTdHJpbmcgZnJvbU5hbWUgPSBhLmdldFN0cmluZyhhbmRyb2lkLlIuc3R5bGVhYmxlLkN1cnNvckFkYXB0ZXJfU2VsZWN0SXRlbV9jb2x1bW4pOworICAgICAgICAgICAgaWYgKGZyb21OYW1lID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJBIHNlbGVjdCBpdGVtIGluICIgKworICAgICAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXRSZXNvdXJjZUVudHJ5TmFtZShtSWQpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICIgZG9lcyBub3QgaGF2ZSBhICdjb2x1bW4nIGF0dHJpYnV0ZSIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhLnJlY3ljbGUoKTsKKworICAgICAgICAgICAgbUZyb20uYWRkKGZyb21OYW1lKTsKKyAgICAgICAgICAgIG1Uby5hZGQoVmlldy5OT19JRCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgcGFyc2VCaW5kVGFnKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIFJlc291cmNlcyByZXNvdXJjZXMgPSBtUmVzb3VyY2VzOworICAgICAgICAgICAgVHlwZWRBcnJheSBhID0gcmVzb3VyY2VzLm9idGFpbkF0dHJpYnV0ZXMobUF0dHJzLAorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkLlIuc3R5bGVhYmxlLkN1cnNvckFkYXB0ZXJfQmluZEl0ZW0pOworCisgICAgICAgICAgICBTdHJpbmcgZnJvbU5hbWUgPSBhLmdldFN0cmluZyhhbmRyb2lkLlIuc3R5bGVhYmxlLkN1cnNvckFkYXB0ZXJfQmluZEl0ZW1fZnJvbSk7CisgICAgICAgICAgICBpZiAoZnJvbU5hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkEgYmluZCBpdGVtIGluICIgKworICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldFJlc291cmNlRW50cnlOYW1lKG1JZCkgKyAiIGRvZXMgbm90IGhhdmUgYSAnZnJvbScgYXR0cmlidXRlIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGludCB0b05hbWUgPSBhLmdldFJlc291cmNlSWQoYW5kcm9pZC5SLnN0eWxlYWJsZS5DdXJzb3JBZGFwdGVyX0JpbmRJdGVtX3RvLCAwKTsKKyAgICAgICAgICAgIGlmICh0b05hbWUgPT0gMCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkEgYmluZCBpdGVtIGluICIgKworICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldFJlc291cmNlRW50cnlOYW1lKG1JZCkgKyAiIGRvZXMgbm90IGhhdmUgYSAndG8nIGF0dHJpYnV0ZSIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTdHJpbmcgYXNUeXBlID0gYS5nZXRTdHJpbmcoYW5kcm9pZC5SLnN0eWxlYWJsZS5DdXJzb3JBZGFwdGVyX0JpbmRJdGVtX2FzKTsKKyAgICAgICAgICAgIGlmIChhc1R5cGUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkEgYmluZCBpdGVtIGluICIgKworICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldFJlc291cmNlRW50cnlOYW1lKG1JZCkgKyAiIGRvZXMgbm90IGhhdmUgYW4gJ2FzJyBhdHRyaWJ1dGUiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbUZyb20uYWRkKGZyb21OYW1lKTsKKyAgICAgICAgICAgIG1Uby5hZGQodG9OYW1lKTsKKyAgICAgICAgICAgIG1CaW5kZXJzLnB1dChmcm9tTmFtZSwgZmluZEJpbmRlcihhc1R5cGUpKTsKKworICAgICAgICAgICAgYS5yZWN5Y2xlKCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIEN1cnNvckJpbmRlciBmaW5kQmluZGVyKFN0cmluZyB0eXBlKSB0aHJvd3MgSU9FeGNlcHRpb24sIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24geworICAgICAgICAgICAgZmluYWwgWG1sUHVsbFBhcnNlciBwYXJzZXIgPSBtUGFyc2VyOworICAgICAgICAgICAgZmluYWwgQ29udGV4dCBjb250ZXh0ID0gbUNvbnRleHQ7CisgICAgICAgICAgICBDdXJzb3JUcmFuc2Zvcm1hdGlvbiB0cmFuc2Zvcm1hdGlvbiA9IG1JZGVudGl0eTsKKworICAgICAgICAgICAgaW50IHRhZ1R5cGU7CisgICAgICAgICAgICBpbnQgZGVwdGggPSBwYXJzZXIuZ2V0RGVwdGgoKTsKKworICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBpc0RyYXdhYmxlID0gQURBUFRFUl9DVVJTT1JfQVNfRFJBV0FCTEUuZXF1YWxzKHR5cGUpOyAgICAgICAgICAgIAorCisgICAgICAgICAgICB3aGlsZSAoKCh0YWdUeXBlID0gcGFyc2VyLm5leHQoKSkgIT0gWG1sUHVsbFBhcnNlci5FTkRfVEFHIHx8IHBhcnNlci5nZXREZXB0aCgpID4gZGVwdGgpCisgICAgICAgICAgICAgICAgICAgICYmIHRhZ1R5cGUgIT0gWG1sUHVsbFBhcnNlci5FTkRfRE9DVU1FTlQpIHsKKworICAgICAgICAgICAgICAgIGlmICh0YWdUeXBlICE9IFhtbFB1bGxQYXJzZXIuU1RBUlRfVEFHKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gcGFyc2VyLmdldE5hbWUoKTsKKworICAgICAgICAgICAgICAgIGlmIChBREFQVEVSX0NVUlNPUl9UUkFOU0ZPUk0uZXF1YWxzKG5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybWF0aW9uID0gZmluZFRyYW5zZm9ybWF0aW9uKCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChBREFQVEVSX0NVUlNPUl9NQVAuZXF1YWxzKG5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghKHRyYW5zZm9ybWF0aW9uIGluc3RhbmNlb2YgTWFwVHJhbnNmb3JtYXRpb24pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm1hdGlvbiA9IG5ldyBNYXBUcmFuc2Zvcm1hdGlvbihjb250ZXh0KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBmaW5kTWFwKCgoTWFwVHJhbnNmb3JtYXRpb24pIHRyYW5zZm9ybWF0aW9uKSwgaXNEcmF3YWJsZSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlVua25vd24gdGFnIG5hbWUgIiArIHBhcnNlci5nZXROYW1lKCkgKyAiIGluICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0UmVzb3VyY2VFbnRyeU5hbWUobUlkKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoQURBUFRFUl9DVVJTT1JfQVNfU1RSSU5HLmVxdWFscyh0eXBlKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nQmluZGVyKGNvbnRleHQsIHRyYW5zZm9ybWF0aW9uKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoQURBUFRFUl9DVVJTT1JfQVNfVEFHLmVxdWFscyh0eXBlKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVGFnQmluZGVyKGNvbnRleHQsIHRyYW5zZm9ybWF0aW9uKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoQURBUFRFUl9DVVJTT1JfQVNfSU1BR0UuZXF1YWxzKHR5cGUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBJbWFnZUJpbmRlcihjb250ZXh0LCB0cmFuc2Zvcm1hdGlvbik7ICAgICAgICAgICAgCisgICAgICAgICAgICB9IGVsc2UgaWYgKEFEQVBURVJfQ1VSU09SX0FTX0lNQUdFX1VSSS5lcXVhbHModHlwZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEltYWdlVXJpQmluZGVyKGNvbnRleHQsIHRyYW5zZm9ybWF0aW9uKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNEcmF3YWJsZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRHJhd2FibGVCaW5kZXIoY29udGV4dCwgdHJhbnNmb3JtYXRpb24pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gY3JlYXRlQmluZGVyKHR5cGUsIHRyYW5zZm9ybWF0aW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgQ3Vyc29yQmluZGVyIGNyZWF0ZUJpbmRlcihTdHJpbmcgdHlwZSwgQ3Vyc29yVHJhbnNmb3JtYXRpb24gdHJhbnNmb3JtYXRpb24pIHsKKyAgICAgICAgICAgIGlmIChtQ29udGV4dC5pc1Jlc3RyaWN0ZWQoKSkgcmV0dXJuIG51bGw7CisKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgZmluYWwgQ2xhc3M8Pz4ga2xhc3MgPSBDbGFzcy5mb3JOYW1lKHR5cGUsIHRydWUsIG1Db250ZXh0LmdldENsYXNzTG9hZGVyKCkpOworICAgICAgICAgICAgICAgIGlmIChDdXJzb3JCaW5kZXIuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShrbGFzcykpIHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgQ29uc3RydWN0b3I8Pz4gYyA9IGtsYXNzLmdldERlY2xhcmVkQ29uc3RydWN0b3IoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGV4dC5jbGFzcywgQ3Vyc29yVHJhbnNmb3JtYXRpb24uY2xhc3MpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gKEN1cnNvckJpbmRlcikgYy5uZXdJbnN0YW5jZShtQ29udGV4dCwgdHJhbnNmb3JtYXRpb24pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNhbm5vdCBpbnN0YW5jaWF0ZSBiaW5kZXIgdHlwZSBpbiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Db250ZXh0LmdldFJlc291cmNlcygpLmdldFJlc291cmNlRW50cnlOYW1lKG1JZCkgKyAiOiAiICsgdHlwZSwgZSk7CisgICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNhbm5vdCBpbnN0YW5jaWF0ZSBiaW5kZXIgdHlwZSBpbiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Db250ZXh0LmdldFJlc291cmNlcygpLmdldFJlc291cmNlRW50cnlOYW1lKG1JZCkgKyAiOiAiICsgdHlwZSwgZSk7CisgICAgICAgICAgICB9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDYW5ub3QgaW5zdGFuY2lhdGUgYmluZGVyIHR5cGUgaW4gIiArCisgICAgICAgICAgICAgICAgICAgICAgICBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRSZXNvdXJjZUVudHJ5TmFtZShtSWQpICsgIjogIiArIHR5cGUsIGUpOworICAgICAgICAgICAgfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ2Fubm90IGluc3RhbmNpYXRlIGJpbmRlciB0eXBlIGluICIgKworICAgICAgICAgICAgICAgICAgICAgICAgbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0UmVzb3VyY2VFbnRyeU5hbWUobUlkKSArICI6ICIgKyB0eXBlLCBlKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNhbm5vdCBpbnN0YW5jaWF0ZSBiaW5kZXIgdHlwZSBpbiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Db250ZXh0LmdldFJlc291cmNlcygpLmdldFJlc291cmNlRW50cnlOYW1lKG1JZCkgKyAiOiAiICsgdHlwZSwgZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIGZpbmRNYXAoTWFwVHJhbnNmb3JtYXRpb24gdHJhbnNmb3JtYXRpb24sIGJvb2xlYW4gZHJhd2FibGUpIHsKKyAgICAgICAgICAgIFJlc291cmNlcyByZXNvdXJjZXMgPSBtUmVzb3VyY2VzOworCisgICAgICAgICAgICBUeXBlZEFycmF5IGEgPSByZXNvdXJjZXMub2J0YWluQXR0cmlidXRlcyhtQXR0cnMsCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQuUi5zdHlsZWFibGUuQ3Vyc29yQWRhcHRlcl9NYXBJdGVtKTsKKworICAgICAgICAgICAgU3RyaW5nIGZyb20gPSBhLmdldFN0cmluZyhhbmRyb2lkLlIuc3R5bGVhYmxlLkN1cnNvckFkYXB0ZXJfTWFwSXRlbV9mcm9tVmFsdWUpOworICAgICAgICAgICAgaWYgKGZyb20gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkEgbWFwIGl0ZW0gaW4gIiArCisgICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0UmVzb3VyY2VFbnRyeU5hbWUobUlkKSArCisgICAgICAgICAgICAgICAgICAgICAgICAiIGRvZXMgbm90IGhhdmUgYSAnZnJvbVZhbHVlJyBhdHRyaWJ1dGUiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFkcmF3YWJsZSkgeworICAgICAgICAgICAgICAgIFN0cmluZyB0byA9IGEuZ2V0U3RyaW5nKGFuZHJvaWQuUi5zdHlsZWFibGUuQ3Vyc29yQWRhcHRlcl9NYXBJdGVtX3RvVmFsdWUpOworICAgICAgICAgICAgICAgIGlmICh0byA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkEgbWFwIGl0ZW0gaW4gIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldFJlc291cmNlRW50cnlOYW1lKG1JZCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgZG9lcyBub3QgaGF2ZSBhICd0b1ZhbHVlJyBhdHRyaWJ1dGUiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdHJhbnNmb3JtYXRpb24uYWRkU3RyaW5nTWFwcGluZyhmcm9tLCB0byk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGludCB0byA9IGEuZ2V0UmVzb3VyY2VJZChhbmRyb2lkLlIuc3R5bGVhYmxlLkN1cnNvckFkYXB0ZXJfTWFwSXRlbV90b1ZhbHVlLCAwKTsKKyAgICAgICAgICAgICAgICBpZiAodG8gPT0gMCkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJBIG1hcCBpdGVtIGluICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlcy5nZXRSZXNvdXJjZUVudHJ5TmFtZShtSWQpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGRvZXMgbm90IGhhdmUgYSAndG9WYWx1ZScgYXR0cmlidXRlIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRyYW5zZm9ybWF0aW9uLmFkZFJlc291cmNlTWFwcGluZyhmcm9tLCB0byk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGEucmVjeWNsZSgpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBDdXJzb3JUcmFuc2Zvcm1hdGlvbiBmaW5kVHJhbnNmb3JtYXRpb24oKSB7CisgICAgICAgICAgICBSZXNvdXJjZXMgcmVzb3VyY2VzID0gbVJlc291cmNlczsKKyAgICAgICAgICAgIEN1cnNvclRyYW5zZm9ybWF0aW9uIHRyYW5zZm9ybWF0aW9uID0gbnVsbDsKKyAgICAgICAgICAgIFR5cGVkQXJyYXkgYSA9IHJlc291cmNlcy5vYnRhaW5BdHRyaWJ1dGVzKG1BdHRycywKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZC5SLnN0eWxlYWJsZS5DdXJzb3JBZGFwdGVyX1RyYW5zZm9ybUl0ZW0pOworCisgICAgICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gYS5nZXRTdHJpbmcoYW5kcm9pZC5SLnN0eWxlYWJsZS5DdXJzb3JBZGFwdGVyX1RyYW5zZm9ybUl0ZW1fd2l0aENsYXNzKTsKKyAgICAgICAgICAgIGlmIChjbGFzc05hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIFN0cmluZyBleHByZXNzaW9uID0gYS5nZXRTdHJpbmcoCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkLlIuc3R5bGVhYmxlLkN1cnNvckFkYXB0ZXJfVHJhbnNmb3JtSXRlbV93aXRoRXhwcmVzc2lvbik7CisgICAgICAgICAgICAgICAgdHJhbnNmb3JtYXRpb24gPSBjcmVhdGVFeHByZXNzaW9uVHJhbnNmb3JtYXRpb24oZXhwcmVzc2lvbik7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCFtQ29udGV4dC5pc1Jlc3RyaWN0ZWQoKSkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIENsYXNzPD8+IGtsYXMgPSBDbGFzcy5mb3JOYW1lKGNsYXNzTmFtZSwgdHJ1ZSwgbUNvbnRleHQuZ2V0Q2xhc3NMb2FkZXIoKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChDdXJzb3JUcmFuc2Zvcm1hdGlvbi5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGtsYXMpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBDb25zdHJ1Y3Rvcjw/PiBjID0ga2xhcy5nZXREZWNsYXJlZENvbnN0cnVjdG9yKENvbnRleHQuY2xhc3MpOworICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtYXRpb24gPSAoQ3Vyc29yVHJhbnNmb3JtYXRpb24pIGMubmV3SW5zdGFuY2UobUNvbnRleHQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNhbm5vdCBpbnN0YW5jaWF0ZSB0cmFuc2Zvcm0gdHlwZSBpbiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db250ZXh0LmdldFJlc291cmNlcygpLmdldFJlc291cmNlRW50cnlOYW1lKG1JZCkgKyAiOiAiICsgY2xhc3NOYW1lLCBlKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDYW5ub3QgaW5zdGFuY2lhdGUgdHJhbnNmb3JtIHR5cGUgaW4gIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRSZXNvdXJjZUVudHJ5TmFtZShtSWQpICsgIjogIiArIGNsYXNzTmFtZSwgZSk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNhbm5vdCBpbnN0YW5jaWF0ZSB0cmFuc2Zvcm0gdHlwZSBpbiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db250ZXh0LmdldFJlc291cmNlcygpLmdldFJlc291cmNlRW50cnlOYW1lKG1JZCkgKyAiOiAiICsgY2xhc3NOYW1lLCBlKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ2Fubm90IGluc3RhbmNpYXRlIHRyYW5zZm9ybSB0eXBlIGluICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0UmVzb3VyY2VFbnRyeU5hbWUobUlkKSArICI6ICIgKyBjbGFzc05hbWUsIGUpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDYW5ub3QgaW5zdGFuY2lhdGUgdHJhbnNmb3JtIHR5cGUgaW4gIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRSZXNvdXJjZUVudHJ5TmFtZShtSWQpICsgIjogIiArIGNsYXNzTmFtZSwgZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhLnJlY3ljbGUoKTsKKworICAgICAgICAgICAgaWYgKHRyYW5zZm9ybWF0aW9uID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJBIHRyYW5zZm9ybSBpdGVtIGluICIgKworICAgICAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0UmVzb3VyY2VFbnRyeU5hbWUobUlkKSArICIgbXVzdCBoYXZlIGEgJ3dpdGhDbGFzcycgb3IgIiArCisgICAgICAgICAgICAgICAgICAgICInd2l0aEV4cHJlc3Npb24nIGF0dHJpYnV0ZSIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gdHJhbnNmb3JtYXRpb247CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIEN1cnNvclRyYW5zZm9ybWF0aW9uIGNyZWF0ZUV4cHJlc3Npb25UcmFuc2Zvcm1hdGlvbihTdHJpbmcgZXhwcmVzc2lvbikgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBFeHByZXNzaW9uVHJhbnNmb3JtYXRpb24obUNvbnRleHQsIGV4cHJlc3Npb24pOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogSW50ZXJmYWNlIHVzZWQgYnkgYWRhcHRlcnMgdGhhdCByZXF1aXJlIHRvIGJlIGxvYWRlZCBhZnRlciBjcmVhdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBpbnRlcmZhY2UgTWFuYWdlZEFkYXB0ZXIgeworICAgICAgICAvKioKKyAgICAgICAgICogTG9hZHMgdGhlIGNvbnRlbnQgb2YgdGhlIGFkYXB0ZXIsIGFzeW5jaHJvbm91c2x5LgorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCBsb2FkKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW1wbGVtZW50YXRpb24gb2YgYSBDdXJzb3IgYWRhcHRlciBkZWZpbmVkIGluIFhNTC4gVGhpcyBjbGFzcyBpcyBhIHRoaW4gd3JhcHBlcgorICAgICAqIG9mIGEgU2ltcGxlQ3Vyc29yQWRhcHRlci4gVGhlIG1haW4gZGlmZmVyZW5jZSBpcyB0aGUgYWJpbGl0eSB0byBoYW5kbGUgQ3Vyc29yQmluZGVycy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBYbWxDdXJzb3JBZGFwdGVyIGV4dGVuZHMgU2ltcGxlQ3Vyc29yQWRhcHRlciBpbXBsZW1lbnRzIE1hbmFnZWRBZGFwdGVyIHsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbVVyaTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbVNlbGVjdGlvbjsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmdbXSBtU2VsZWN0aW9uQXJnczsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbVNvcnRPcmRlcjsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmdbXSBtQ29sdW1uczsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBDdXJzb3JCaW5kZXJbXSBtQmluZGVyczsKKyAgICAgICAgcHJpdmF0ZSBBc3luY1Rhc2s8Vm9pZCxWb2lkLEN1cnNvcj4gbUxvYWRUYXNrOworCisgICAgICAgIFhtbEN1cnNvckFkYXB0ZXIoQ29udGV4dCBjb250ZXh0LCBpbnQgbGF5b3V0LCBTdHJpbmcgdXJpLCBTdHJpbmdbXSBmcm9tLCBpbnRbXSB0bywKKyAgICAgICAgICAgICAgICBTdHJpbmcgc2VsZWN0aW9uLCBTdHJpbmdbXSBzZWxlY3Rpb25BcmdzLCBTdHJpbmcgc29ydE9yZGVyLAorICAgICAgICAgICAgICAgIEhhc2hNYXA8U3RyaW5nLCBDdXJzb3JCaW5kZXI+IGJpbmRlcnMpIHsKKworICAgICAgICAgICAgc3VwZXIoY29udGV4dCwgbGF5b3V0LCBudWxsLCBmcm9tLCB0byk7CisgICAgICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7CisgICAgICAgICAgICBtVXJpID0gdXJpOworICAgICAgICAgICAgbVNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKKyAgICAgICAgICAgIG1TZWxlY3Rpb25BcmdzID0gc2VsZWN0aW9uQXJnczsKKyAgICAgICAgICAgIG1Tb3J0T3JkZXIgPSBzb3J0T3JkZXI7CisgICAgICAgICAgICBtQ29sdW1ucyA9IG5ldyBTdHJpbmdbZnJvbS5sZW5ndGggKyAxXTsKKyAgICAgICAgICAgIC8vIFRoaXMgaXMgbWFuZGF0b3J5IGluIEN1cnNvckFkYXB0ZXIKKyAgICAgICAgICAgIG1Db2x1bW5zWzBdID0gIl9pZCI7CisgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGZyb20sIDAsIG1Db2x1bW5zLCAxLCBmcm9tLmxlbmd0aCk7CisKKyAgICAgICAgICAgIEN1cnNvckJpbmRlciBiYXNpYyA9IG5ldyBTdHJpbmdCaW5kZXIoY29udGV4dCwgbmV3IElkZW50aXR5VHJhbnNmb3JtYXRpb24oY29udGV4dCkpOworICAgICAgICAgICAgZmluYWwgaW50IGNvdW50ID0gZnJvbS5sZW5ndGg7CisgICAgICAgICAgICBtQmluZGVycyA9IG5ldyBDdXJzb3JCaW5kZXJbY291bnRdOworCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICBDdXJzb3JCaW5kZXIgYmluZGVyID0gYmluZGVycy5nZXQoZnJvbVtpXSk7CisgICAgICAgICAgICAgICAgaWYgKGJpbmRlciA9PSBudWxsKSBiaW5kZXIgPSBiYXNpYzsKKyAgICAgICAgICAgICAgICBtQmluZGVyc1tpXSA9IGJpbmRlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBiaW5kVmlldyhWaWV3IHZpZXcsIENvbnRleHQgY29udGV4dCwgQ3Vyc29yIGN1cnNvcikgeworICAgICAgICAgICAgZmluYWwgaW50IGNvdW50ID0gbVRvLmxlbmd0aDsKKyAgICAgICAgICAgIGZpbmFsIGludFtdIGZyb20gPSBtRnJvbTsKKyAgICAgICAgICAgIGZpbmFsIGludFtdIHRvID0gbVRvOworICAgICAgICAgICAgZmluYWwgQ3Vyc29yQmluZGVyW10gYmluZGVycyA9IG1CaW5kZXJzOworCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBWaWV3IHYgPSB2aWV3LmZpbmRWaWV3QnlJZCh0b1tpXSk7CisgICAgICAgICAgICAgICAgaWYgKHYgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBiaW5kZXJzW2ldLmJpbmQodiwgY3Vyc29yLCBmcm9tW2ldKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBsb2FkKCkgeworICAgICAgICAgICAgaWYgKG1VcmkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1Mb2FkVGFzayA9IG5ldyBRdWVyeVRhc2soKS5leGVjdXRlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHNldFVyaShTdHJpbmcgdXJpKSB7CisgICAgICAgICAgICBtVXJpID0gdXJpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGNoYW5nZUN1cnNvcihDdXJzb3IgYykgeworICAgICAgICAgICAgaWYgKG1Mb2FkVGFzayAhPSBudWxsICYmIG1Mb2FkVGFzay5nZXRTdGF0dXMoKSAhPSBRdWVyeVRhc2suU3RhdHVzLkZJTklTSEVEKSB7CisgICAgICAgICAgICAgICAgbUxvYWRUYXNrLmNhbmNlbCh0cnVlKTsKKyAgICAgICAgICAgICAgICBtTG9hZFRhc2sgPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3VwZXIuY2hhbmdlQ3Vyc29yKGMpOworICAgICAgICB9CisKKyAgICAgICAgY2xhc3MgUXVlcnlUYXNrIGV4dGVuZHMgQXN5bmNUYXNrPFZvaWQsIFZvaWQsIEN1cnNvcj4geworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwcm90ZWN0ZWQgQ3Vyc29yIGRvSW5CYWNrZ3JvdW5kKFZvaWQuLi4gcGFyYW1zKSB7CisgICAgICAgICAgICAgICAgaWYgKG1Db250ZXh0IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgoQWN0aXZpdHkpIG1Db250ZXh0KS5tYW5hZ2VkUXVlcnkoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXJpLnBhcnNlKG1VcmkpLCBtQ29sdW1ucywgbVNlbGVjdGlvbiwgbVNlbGVjdGlvbkFyZ3MsIG1Tb3J0T3JkZXIpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKS5xdWVyeSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVcmkucGFyc2UobVVyaSksIG1Db2x1bW5zLCBtU2VsZWN0aW9uLCBtU2VsZWN0aW9uQXJncywgbVNvcnRPcmRlcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHByb3RlY3RlZCB2b2lkIG9uUG9zdEV4ZWN1dGUoQ3Vyc29yIGN1cnNvcikgeworICAgICAgICAgICAgICAgIGlmICghaXNDYW5jZWxsZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBYbWxDdXJzb3JBZGFwdGVyLnN1cGVyLmNoYW5nZUN1cnNvcihjdXJzb3IpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIElkZW50aXR5IHRyYW5zZm9ybWF0aW9uLCByZXR1cm5zIHRoZSBjb250ZW50IG9mIHRoZSBzcGVjaWZpZWQgY29sdW1uIGFzIGEgU3RyaW5nLAorICAgICAqIHdpdGhvdXQgcGVyZm9ybWluZyBhbnkgbWFuaXB1bGF0aW9uLiBUaGlzIGlzIHVzZWQgd2hlbiBubyB0cmFuc2Zvcm1hdGlvbiBpcyBzcGVjaWZpZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSWRlbnRpdHlUcmFuc2Zvcm1hdGlvbiBleHRlbmRzIEN1cnNvclRyYW5zZm9ybWF0aW9uIHsKKyAgICAgICAgcHVibGljIElkZW50aXR5VHJhbnNmb3JtYXRpb24oQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgICAgICBzdXBlcihjb250ZXh0KTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIHRyYW5zZm9ybShDdXJzb3IgY3Vyc29yLCBpbnQgY29sdW1uSW5kZXgpIHsKKyAgICAgICAgICAgIHJldHVybiBjdXJzb3IuZ2V0U3RyaW5nKGNvbHVtbkluZGV4KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEFuIGV4cHJlc3Npb24gdHJhbnNmb3JtYXRpb24gaXMgYSBzaW1wbGUgdGVtcGxhdGUgYmFzZWQgcmVwbGFjZW1lbnQgdXRpbGl0eS4KKyAgICAgKiBJbiBhbiBleHByZXNzaW9uLCBlYWNoIHNlZ21lbnQgb2YgdGhlIGZvcm0gPGNvZGU+eyhbXn1dKyl9PC9jb2RlPiBpcyByZXBsYWNlZAorICAgICAqIHdpdGggdGhlIHZhbHVlIG9mIHRoZSBjb2x1bW4gb2YgbmFtZSAkMS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBFeHByZXNzaW9uVHJhbnNmb3JtYXRpb24gZXh0ZW5kcyBDdXJzb3JUcmFuc2Zvcm1hdGlvbiB7CisgICAgICAgIHByaXZhdGUgZmluYWwgRXhwcmVzc2lvbk5vZGUgbUZpcnN0Tm9kZSA9IG5ldyBDb25zdGFudEV4cHJlc3Npb25Ob2RlKCIiKTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmdCdWlsZGVyIG1CdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKworICAgICAgICBwdWJsaWMgRXhwcmVzc2lvblRyYW5zZm9ybWF0aW9uKENvbnRleHQgY29udGV4dCwgU3RyaW5nIGV4cHJlc3Npb24pIHsKKyAgICAgICAgICAgIHN1cGVyKGNvbnRleHQpOworCisgICAgICAgICAgICBwYXJzZShleHByZXNzaW9uKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBwYXJzZShTdHJpbmcgZXhwcmVzc2lvbikgeworICAgICAgICAgICAgRXhwcmVzc2lvbk5vZGUgbm9kZSA9IG1GaXJzdE5vZGU7CisgICAgICAgICAgICBpbnQgc2VnbWVudFN0YXJ0OworICAgICAgICAgICAgaW50IGNvdW50ID0gZXhwcmVzc2lvbi5sZW5ndGgoKTsKKworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgY2hhciBjID0gZXhwcmVzc2lvbi5jaGFyQXQoaSk7CisgICAgICAgICAgICAgICAgLy8gU3RhcnQgYSBjb2x1bW4gbmFtZSBzZWdtZW50CisgICAgICAgICAgICAgICAgc2VnbWVudFN0YXJ0ID0gaTsKKyAgICAgICAgICAgICAgICBpZiAoYyA9PSAneycpIHsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGkgPCBjb3VudCAmJiAoYyA9IGV4cHJlc3Npb24uY2hhckF0KGkpKSAhPSAnfScpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyBXZSd2ZSByZWFjaGVkIHRoZSBlbmQsIGJ1dCB0aGUgZXhwcmVzc2lvbiBkaWRuJ3QgY2xvc2UKKyAgICAgICAgICAgICAgICAgICAgaWYgKGMgIT0gJ30nKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJUaGUgdHJhbnNmb3JtIGV4cHJlc3Npb24gY29udGFpbnMgYSAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5vbi1jbG9zZWQgY29sdW1uIG5hbWU6ICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uLnN1YnN0cmluZyhzZWdtZW50U3RhcnQgKyAxLCBpKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbm9kZS5uZXh0ID0gbmV3IENvbHVtbkV4cHJlc3Npb25Ob2RlKGV4cHJlc3Npb24uc3Vic3RyaW5nKHNlZ21lbnRTdGFydCArIDEsIGkpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaSA8IGNvdW50ICYmIChjID0gZXhwcmVzc2lvbi5jaGFyQXQoaSkpICE9ICd7JykgeworICAgICAgICAgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG5vZGUubmV4dCA9IG5ldyBDb25zdGFudEV4cHJlc3Npb25Ob2RlKGV4cHJlc3Npb24uc3Vic3RyaW5nKHNlZ21lbnRTdGFydCwgaSkpOworICAgICAgICAgICAgICAgICAgICAvLyBSZXdpbmQgaWYgd2UndmUgcmVhY2hlZCBhIGNvbHVtbiBleHByZXNzaW9uCisgICAgICAgICAgICAgICAgICAgIGlmIChjID09ICd7JykgaS0tOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBub2RlID0gbm9kZS5uZXh0OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdHJhbnNmb3JtKEN1cnNvciBjdXJzb3IsIGludCBjb2x1bW5JbmRleCkgeworICAgICAgICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbUJ1aWxkZXI7CisgICAgICAgICAgICBidWlsZGVyLmRlbGV0ZSgwLCBidWlsZGVyLmxlbmd0aCgpKTsKKworICAgICAgICAgICAgRXhwcmVzc2lvbk5vZGUgbm9kZSA9IG1GaXJzdE5vZGU7CisgICAgICAgICAgICAvLyBTa2lwIHRoZSBmaXJzdCBub2RlCisgICAgICAgICAgICB3aGlsZSAoKG5vZGUgPSBub2RlLm5leHQpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChub2RlLmFzU3RyaW5nKGN1cnNvcikpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gYnVpbGRlci50b1N0cmluZygpOworICAgICAgICB9CisKKyAgICAgICAgc3RhdGljIGFic3RyYWN0IGNsYXNzIEV4cHJlc3Npb25Ob2RlIHsKKyAgICAgICAgICAgIHB1YmxpYyBFeHByZXNzaW9uTm9kZSBuZXh0OworCisgICAgICAgICAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGFzU3RyaW5nKEN1cnNvciBjdXJzb3IpOworICAgICAgICB9CisKKyAgICAgICAgc3RhdGljIGNsYXNzIENvbnN0YW50RXhwcmVzc2lvbk5vZGUgZXh0ZW5kcyBFeHByZXNzaW9uTm9kZSB7CisgICAgICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtQ29uc3RhbnQ7CisKKyAgICAgICAgICAgIENvbnN0YW50RXhwcmVzc2lvbk5vZGUoU3RyaW5nIGNvbnN0YW50KSB7CisgICAgICAgICAgICAgICAgbUNvbnN0YW50ID0gY29uc3RhbnQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIFN0cmluZyBhc1N0cmluZyhDdXJzb3IgY3Vyc29yKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1Db25zdGFudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHN0YXRpYyBjbGFzcyBDb2x1bW5FeHByZXNzaW9uTm9kZSBleHRlbmRzIEV4cHJlc3Npb25Ob2RlIHsKKyAgICAgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1Db2x1bW5OYW1lOworICAgICAgICAgICAgcHJpdmF0ZSBDdXJzb3IgbVNpZ25hdHVyZTsKKyAgICAgICAgICAgIHByaXZhdGUgaW50IG1Db2x1bW5JbmRleCA9IC0xOworCisgICAgICAgICAgICBDb2x1bW5FeHByZXNzaW9uTm9kZShTdHJpbmcgY29sdW1uTmFtZSkgeworICAgICAgICAgICAgICAgIG1Db2x1bW5OYW1lID0gY29sdW1uTmFtZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGFzU3RyaW5nKEN1cnNvciBjdXJzb3IpIHsKKyAgICAgICAgICAgICAgICBpZiAoY3Vyc29yICE9IG1TaWduYXR1cmUgfHwgbUNvbHVtbkluZGV4ID09IC0xKSB7CisgICAgICAgICAgICAgICAgICAgIG1Db2x1bW5JbmRleCA9IGN1cnNvci5nZXRDb2x1bW5JbmRleChtQ29sdW1uTmFtZSk7CisgICAgICAgICAgICAgICAgICAgIG1TaWduYXR1cmUgPSBjdXJzb3I7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmV0dXJuIGN1cnNvci5nZXRTdHJpbmcobUNvbHVtbkluZGV4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEEgbWFwIHRyYW5zZm9ybWF0aW9uIG9mZmVycyBhIHNpbXBsZSBtYXBwaW5nIGJldHdlZW4gc3BlY2lmaWVkIFN0cmluZyB2YWx1ZXMKKyAgICAgKiB0byBTdHJpbmdzIG9yIGludGVnZXJzLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIE1hcFRyYW5zZm9ybWF0aW9uIGV4dGVuZHMgQ3Vyc29yVHJhbnNmb3JtYXRpb24geworICAgICAgICBwcml2YXRlIGZpbmFsIEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+IG1TdHJpbmdNYXBwaW5nczsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBIYXNoTWFwPFN0cmluZywgSW50ZWdlcj4gbVJlc291cmNlTWFwcGluZ3M7CisKKyAgICAgICAgcHVibGljIE1hcFRyYW5zZm9ybWF0aW9uKENvbnRleHQgY29udGV4dCkgeworICAgICAgICAgICAgc3VwZXIoY29udGV4dCk7CisgICAgICAgICAgICBtU3RyaW5nTWFwcGluZ3MgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKyAgICAgICAgICAgIG1SZXNvdXJjZU1hcHBpbmdzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBJbnRlZ2VyPigpOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBhZGRTdHJpbmdNYXBwaW5nKFN0cmluZyBmcm9tLCBTdHJpbmcgdG8pIHsKKyAgICAgICAgICAgIG1TdHJpbmdNYXBwaW5ncy5wdXQoZnJvbSwgdG8pOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBhZGRSZXNvdXJjZU1hcHBpbmcoU3RyaW5nIGZyb20sIGludCB0bykgeworICAgICAgICAgICAgbVJlc291cmNlTWFwcGluZ3MucHV0KGZyb20sIHRvKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIHRyYW5zZm9ybShDdXJzb3IgY3Vyc29yLCBpbnQgY29sdW1uSW5kZXgpIHsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyB2YWx1ZSA9IGN1cnNvci5nZXRTdHJpbmcoY29sdW1uSW5kZXgpOworICAgICAgICAgICAgZmluYWwgU3RyaW5nIHRyYW5zZm9ybWVkID0gbVN0cmluZ01hcHBpbmdzLmdldCh2YWx1ZSk7CisgICAgICAgICAgICByZXR1cm4gdHJhbnNmb3JtZWQgPT0gbnVsbCA/IHZhbHVlIDogdHJhbnNmb3JtZWQ7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCB0cmFuc2Zvcm1Ub1Jlc291cmNlKEN1cnNvciBjdXJzb3IsIGludCBjb2x1bW5JbmRleCkgeworICAgICAgICAgICAgZmluYWwgU3RyaW5nIHZhbHVlID0gY3Vyc29yLmdldFN0cmluZyhjb2x1bW5JbmRleCk7CisgICAgICAgICAgICBmaW5hbCBJbnRlZ2VyIHRyYW5zZm9ybWVkID0gbVJlc291cmNlTWFwcGluZ3MuZ2V0KHZhbHVlKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRyYW5zZm9ybWVkID09IG51bGwgPyBJbnRlZ2VyLnBhcnNlSW50KHZhbHVlKSA6IHRyYW5zZm9ybWVkOworICAgICAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEJpbmRzIGEgU3RyaW5nIHRvIGEgVGV4dFZpZXcuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU3RyaW5nQmluZGVyIGV4dGVuZHMgQ3Vyc29yQmluZGVyIHsKKyAgICAgICAgcHVibGljIFN0cmluZ0JpbmRlcihDb250ZXh0IGNvbnRleHQsIEN1cnNvclRyYW5zZm9ybWF0aW9uIHRyYW5zZm9ybWF0aW9uKSB7CisgICAgICAgICAgICBzdXBlcihjb250ZXh0LCB0cmFuc2Zvcm1hdGlvbik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gYmluZChWaWV3IHZpZXcsIEN1cnNvciBjdXJzb3IsIGludCBjb2x1bW5JbmRleCkgeworICAgICAgICAgICAgaWYgKHZpZXcgaW5zdGFuY2VvZiBUZXh0VmlldykgeworICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB0ZXh0ID0gbVRyYW5zZm9ybWF0aW9uLnRyYW5zZm9ybShjdXJzb3IsIGNvbHVtbkluZGV4KTsKKyAgICAgICAgICAgICAgICAoKFRleHRWaWV3KSB2aWV3KS5zZXRUZXh0KHRleHQpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQmluZHMgYW4gaW1hZ2UgYmxvYiB0byBhbiBJbWFnZVZpZXcuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSW1hZ2VCaW5kZXIgZXh0ZW5kcyBDdXJzb3JCaW5kZXIgeworICAgICAgICBwdWJsaWMgSW1hZ2VCaW5kZXIoQ29udGV4dCBjb250ZXh0LCBDdXJzb3JUcmFuc2Zvcm1hdGlvbiB0cmFuc2Zvcm1hdGlvbikgeworICAgICAgICAgICAgc3VwZXIoY29udGV4dCwgdHJhbnNmb3JtYXRpb24pOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGJpbmQoVmlldyB2aWV3LCBDdXJzb3IgY3Vyc29yLCBpbnQgY29sdW1uSW5kZXgpIHsKKyAgICAgICAgICAgIGlmICh2aWV3IGluc3RhbmNlb2YgSW1hZ2VWaWV3KSB7CisgICAgICAgICAgICAgICAgZmluYWwgYnl0ZVtdIGRhdGEgPSBjdXJzb3IuZ2V0QmxvYihjb2x1bW5JbmRleCk7CisgICAgICAgICAgICAgICAgKChJbWFnZVZpZXcpIHZpZXcpLnNldEltYWdlQml0bWFwKEJpdG1hcEZhY3RvcnkuZGVjb2RlQnl0ZUFycmF5KGRhdGEsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmxlbmd0aCkpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVGFnQmluZGVyIGV4dGVuZHMgQ3Vyc29yQmluZGVyIHsKKyAgICAgICAgcHVibGljIFRhZ0JpbmRlcihDb250ZXh0IGNvbnRleHQsIEN1cnNvclRyYW5zZm9ybWF0aW9uIHRyYW5zZm9ybWF0aW9uKSB7CisgICAgICAgICAgICBzdXBlcihjb250ZXh0LCB0cmFuc2Zvcm1hdGlvbik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gYmluZChWaWV3IHZpZXcsIEN1cnNvciBjdXJzb3IsIGludCBjb2x1bW5JbmRleCkgeworICAgICAgICAgICAgZmluYWwgU3RyaW5nIHRleHQgPSBtVHJhbnNmb3JtYXRpb24udHJhbnNmb3JtKGN1cnNvciwgY29sdW1uSW5kZXgpOworICAgICAgICAgICAgdmlldy5zZXRUYWcodGV4dCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEJpbmRzIGFuIGltYWdlIFVSSSB0byBhbiBJbWFnZVZpZXcuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSW1hZ2VVcmlCaW5kZXIgZXh0ZW5kcyBDdXJzb3JCaW5kZXIgeworICAgICAgICBwdWJsaWMgSW1hZ2VVcmlCaW5kZXIoQ29udGV4dCBjb250ZXh0LCBDdXJzb3JUcmFuc2Zvcm1hdGlvbiB0cmFuc2Zvcm1hdGlvbikgeworICAgICAgICAgICAgc3VwZXIoY29udGV4dCwgdHJhbnNmb3JtYXRpb24pOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGJpbmQoVmlldyB2aWV3LCBDdXJzb3IgY3Vyc29yLCBpbnQgY29sdW1uSW5kZXgpIHsKKyAgICAgICAgICAgIGlmICh2aWV3IGluc3RhbmNlb2YgSW1hZ2VWaWV3KSB7CisgICAgICAgICAgICAgICAgKChJbWFnZVZpZXcpIHZpZXcpLnNldEltYWdlVVJJKFVyaS5wYXJzZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIG1UcmFuc2Zvcm1hdGlvbi50cmFuc2Zvcm0oY3Vyc29yLCBjb2x1bW5JbmRleCkpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEJpbmRzIGEgZHJhd2FibGUgcmVzb3VyY2UgaWRlbnRpZmllciB0byBhbiBJbWFnZVZpZXcuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRHJhd2FibGVCaW5kZXIgZXh0ZW5kcyBDdXJzb3JCaW5kZXIgeworICAgICAgICBwdWJsaWMgRHJhd2FibGVCaW5kZXIoQ29udGV4dCBjb250ZXh0LCBDdXJzb3JUcmFuc2Zvcm1hdGlvbiB0cmFuc2Zvcm1hdGlvbikgeworICAgICAgICAgICAgc3VwZXIoY29udGV4dCwgdHJhbnNmb3JtYXRpb24pOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGJpbmQoVmlldyB2aWV3LCBDdXJzb3IgY3Vyc29yLCBpbnQgY29sdW1uSW5kZXgpIHsKKyAgICAgICAgICAgIGlmICh2aWV3IGluc3RhbmNlb2YgSW1hZ2VWaWV3KSB7CisgICAgICAgICAgICAgICAgZmluYWwgaW50IHJlc291cmNlID0gbVRyYW5zZm9ybWF0aW9uLnRyYW5zZm9ybVRvUmVzb3VyY2UoY3Vyc29yLCBjb2x1bW5JbmRleCk7CisgICAgICAgICAgICAgICAgaWYgKHJlc291cmNlID09IDApIHJldHVybiBmYWxzZTsKKworICAgICAgICAgICAgICAgICgoSW1hZ2VWaWV3KSB2aWV3KS5zZXRJbWFnZVJlc291cmNlKHJlc291cmNlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9BdXRvQ29tcGxldGVUZXh0Vmlldy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0F1dG9Db21wbGV0ZVRleHRWaWV3LmphdmEKaW5kZXggZTE1YTUyMC4uMzRhZWY5OSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0F1dG9Db21wbGV0ZVRleHRWaWV3LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0F1dG9Db21wbGV0ZVRleHRWaWV3LmphdmEKQEAgLTI5LDEzICsyOSwxMiBAQAogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiBpbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OwogaW1wb3J0IGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlcjsKLWltcG9ydCBhbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQ7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuQ29tcGxldGlvbkluZm87Ci1pbXBvcnQgYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLklucHV0TWV0aG9kTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuRWRpdG9ySW5mbzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuSW5wdXRNZXRob2RNYW5hZ2VyOwogCiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuUjsKIApAQCAtOTAsNDUgKzg5LDIxIEBACiAgICAgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBmYWxzZTsKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJBdXRvQ29tcGxldGVUZXh0VmlldyI7CiAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSElOVF9WSUVXX0lEID0gMHgxNzsKLQotICAgIC8qKgotICAgICAqIFRoaXMgdmFsdWUgY29udHJvbHMgdGhlIGxlbmd0aCBvZiB0aW1lIHRoYXQgdGhlIHVzZXIKLSAgICAgKiBtdXN0IGxlYXZlIGEgcG9pbnRlciBkb3duIHdpdGhvdXQgc2Nyb2xsaW5nIHRvIGV4cGFuZAotICAgICAqIHRoZSBhdXRvY29tcGxldGUgZHJvcGRvd24gbGlzdCB0byBjb3ZlciB0aGUgSU1FLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFWFBBTkRfTElTVF9USU1FT1VUID0gMjUwOwotCiAgICAgcHJpdmF0ZSBDaGFyU2VxdWVuY2UgbUhpbnRUZXh0OworICAgIHByaXZhdGUgVGV4dFZpZXcgbUhpbnRWaWV3OwogICAgIHByaXZhdGUgaW50IG1IaW50UmVzb3VyY2U7CiAKICAgICBwcml2YXRlIExpc3RBZGFwdGVyIG1BZGFwdGVyOwogICAgIHByaXZhdGUgRmlsdGVyIG1GaWx0ZXI7CiAgICAgcHJpdmF0ZSBpbnQgbVRocmVzaG9sZDsKIAotICAgIHByaXZhdGUgUG9wdXBXaW5kb3cgbVBvcHVwOwotICAgIHByaXZhdGUgRHJvcERvd25MaXN0VmlldyBtRHJvcERvd25MaXN0OwotICAgIHByaXZhdGUgaW50IG1Ecm9wRG93blZlcnRpY2FsT2Zmc2V0OwotICAgIHByaXZhdGUgaW50IG1Ecm9wRG93bkhvcml6b250YWxPZmZzZXQ7CisgICAgcHJpdmF0ZSBMaXN0UG9wdXBXaW5kb3cgbVBvcHVwOwogICAgIHByaXZhdGUgaW50IG1Ecm9wRG93bkFuY2hvcklkOwotICAgIHByaXZhdGUgVmlldyBtRHJvcERvd25BbmNob3JWaWV3OyAgLy8gdmlldyBpcyByZXRyaWV2ZWQgbGF6aWx5IGZyb20gaWQgb25jZSBuZWVkZWQKLSAgICBwcml2YXRlIGludCBtRHJvcERvd25XaWR0aDsKLSAgICBwcml2YXRlIGludCBtRHJvcERvd25IZWlnaHQ7Ci0gICAgcHJpdmF0ZSBmaW5hbCBSZWN0IG1UZW1wUmVjdCA9IG5ldyBSZWN0KCk7Ci0KLSAgICBwcml2YXRlIERyYXdhYmxlIG1Ecm9wRG93bkxpc3RIaWdobGlnaHQ7CiAKICAgICBwcml2YXRlIEFkYXB0ZXJWaWV3Lk9uSXRlbUNsaWNrTGlzdGVuZXIgbUl0ZW1DbGlja0xpc3RlbmVyOwogICAgIHByaXZhdGUgQWRhcHRlclZpZXcuT25JdGVtU2VsZWN0ZWRMaXN0ZW5lciBtSXRlbVNlbGVjdGVkTGlzdGVuZXI7CiAKLSAgICBwcml2YXRlIGZpbmFsIERyb3BEb3duSXRlbUNsaWNrTGlzdGVuZXIgbURyb3BEb3duSXRlbUNsaWNrTGlzdGVuZXIgPQotICAgICAgICAgICAgbmV3IERyb3BEb3duSXRlbUNsaWNrTGlzdGVuZXIoKTsKLQotICAgIHByaXZhdGUgYm9vbGVhbiBtRHJvcERvd25BbHdheXNWaXNpYmxlID0gZmFsc2U7Ci0KICAgICBwcml2YXRlIGJvb2xlYW4gbURyb3BEb3duRGlzbWlzc2VkT25Db21wbGV0aW9uID0gdHJ1ZTsKLSAgICAKLSAgICBwcml2YXRlIGJvb2xlYW4gbUZvcmNlSWdub3JlT3V0c2lkZVRvdWNoID0gZmFsc2U7CiAKICAgICBwcml2YXRlIGludCBtTGFzdEtleUNvZGUgPSBLZXlFdmVudC5LRVlDT0RFX1VOS05PV047CiAgICAgcHJpdmF0ZSBib29sZWFuIG1PcGVuQmVmb3JlOwpAQCAtMTM3LDEwICsxMTIsNiBAQAogCiAgICAgcHJpdmF0ZSBib29sZWFuIG1CbG9ja0NvbXBsZXRpb247CiAKLSAgICBwcml2YXRlIExpc3RTZWxlY3RvckhpZGVyIG1IaWRlU2VsZWN0b3I7Ci0gICAgcHJpdmF0ZSBSdW5uYWJsZSBtU2hvd0Ryb3BEb3duUnVubmFibGU7Ci0gICAgcHJpdmF0ZSBSdW5uYWJsZSBtUmVzaXplUG9wdXBSdW5uYWJsZSA9IG5ldyBSZXNpemVQb3B1cFJ1bm5hYmxlKCk7Ci0KICAgICBwcml2YXRlIFBhc3NUaHJvdWdoQ2xpY2tMaXN0ZW5lciBtUGFzc1Rocm91Z2hDbGlja0xpc3RlbmVyOwogICAgIHByaXZhdGUgUG9wdXBEYXRhU2V0T2JzZXJ2ZXIgbU9ic2VydmVyOwogCkBAIC0xNTUsOSArMTI2LDEwIEBACiAgICAgcHVibGljIEF1dG9Db21wbGV0ZVRleHRWaWV3KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzLCBpbnQgZGVmU3R5bGUpIHsKICAgICAgICAgc3VwZXIoY29udGV4dCwgYXR0cnMsIGRlZlN0eWxlKTsKIAotICAgICAgICBtUG9wdXAgPSBuZXcgUG9wdXBXaW5kb3coY29udGV4dCwgYXR0cnMsCisgICAgICAgIG1Qb3B1cCA9IG5ldyBMaXN0UG9wdXBXaW5kb3coY29udGV4dCwgYXR0cnMsCiAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hdHRyLmF1dG9Db21wbGV0ZVRleHRWaWV3U3R5bGUpOwogICAgICAgICBtUG9wdXAuc2V0U29mdElucHV0TW9kZShXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5TT0ZUX0lOUFVUX0FESlVTVF9SRVNJWkUpOworICAgICAgICBtUG9wdXAuc2V0UHJvbXB0UG9zaXRpb24oTGlzdFBvcHVwV2luZG93LlBPU0lUSU9OX1BST01QVF9CRUxPVyk7CiAKICAgICAgICAgVHlwZWRBcnJheSBhID0KICAgICAgICAgICAgIGNvbnRleHQub2J0YWluU3R5bGVkQXR0cmlidXRlcygKQEAgLTE2NiwxNCArMTM4LDExIEBACiAgICAgICAgIG1UaHJlc2hvbGQgPSBhLmdldEludCgKICAgICAgICAgICAgICAgICBSLnN0eWxlYWJsZS5BdXRvQ29tcGxldGVUZXh0Vmlld19jb21wbGV0aW9uVGhyZXNob2xkLCAyKTsKIAotICAgICAgICBtSGludFRleHQgPSBhLmdldFRleHQoUi5zdHlsZWFibGUuQXV0b0NvbXBsZXRlVGV4dFZpZXdfY29tcGxldGlvbkhpbnQpOwotCi0gICAgICAgIG1Ecm9wRG93bkxpc3RIaWdobGlnaHQgPSBhLmdldERyYXdhYmxlKAotICAgICAgICAgICAgICAgIFIuc3R5bGVhYmxlLkF1dG9Db21wbGV0ZVRleHRWaWV3X2Ryb3BEb3duU2VsZWN0b3IpOwotICAgICAgICBtRHJvcERvd25WZXJ0aWNhbE9mZnNldCA9IChpbnQpCi0gICAgICAgICAgICAgICAgYS5nZXREaW1lbnNpb24oUi5zdHlsZWFibGUuQXV0b0NvbXBsZXRlVGV4dFZpZXdfZHJvcERvd25WZXJ0aWNhbE9mZnNldCwgMC4wZik7Ci0gICAgICAgIG1Ecm9wRG93bkhvcml6b250YWxPZmZzZXQgPSAoaW50KQotICAgICAgICAgICAgICAgIGEuZ2V0RGltZW5zaW9uKFIuc3R5bGVhYmxlLkF1dG9Db21wbGV0ZVRleHRWaWV3X2Ryb3BEb3duSG9yaXpvbnRhbE9mZnNldCwgMC4wZik7CisgICAgICAgIG1Qb3B1cC5zZXRMaXN0U2VsZWN0b3IoYS5nZXREcmF3YWJsZShSLnN0eWxlYWJsZS5BdXRvQ29tcGxldGVUZXh0Vmlld19kcm9wRG93blNlbGVjdG9yKSk7CisgICAgICAgIG1Qb3B1cC5zZXRWZXJ0aWNhbE9mZnNldCgoaW50KQorICAgICAgICAgICAgICAgIGEuZ2V0RGltZW5zaW9uKFIuc3R5bGVhYmxlLkF1dG9Db21wbGV0ZVRleHRWaWV3X2Ryb3BEb3duVmVydGljYWxPZmZzZXQsIDAuMGYpKTsKKyAgICAgICAgbVBvcHVwLnNldEhvcml6b250YWxPZmZzZXQoKGludCkKKyAgICAgICAgICAgICAgICBhLmdldERpbWVuc2lvbihSLnN0eWxlYWJsZS5BdXRvQ29tcGxldGVUZXh0Vmlld19kcm9wRG93bkhvcml6b250YWxPZmZzZXQsIDAuMGYpKTsKICAgICAgICAgCiAgICAgICAgIC8vIEdldCB0aGUgYW5jaG9yJ3MgaWQgbm93LCBidXQgdGhlIHZpZXcgd29uJ3QgYmUgcmVhZHksIHNvIHdhaXQgdG8gYWN0dWFsbHkgZ2V0IHRoZQogICAgICAgICAvLyB2aWV3IGFuZCBzdG9yZSBpdCBpbiBtRHJvcERvd25BbmNob3JWaWV3IGxhemlseSBpbiBnZXREcm9wRG93bkFuY2hvclZpZXcgbGF0ZXIuCkBAIC0xODQsMTMgKzE1MywxOCBAQAogICAgICAgICAKICAgICAgICAgLy8gRm9yIGRyb3Bkb3duIHdpZHRoLCB0aGUgZGV2ZWxvcGVyIGNhbiBzcGVjaWZ5IGEgc3BlY2lmaWMgd2lkdGgsIG9yIE1BVENIX1BBUkVOVAogICAgICAgICAvLyAoZm9yIGZ1bGwgc2NyZWVuIHdpZHRoKSBvciBXUkFQX0NPTlRFTlQgKHRvIG1hdGNoIHRoZSB3aWR0aCBvZiB0aGUgYW5jaG9yZWQgdmlldykuCi0gICAgICAgIG1Ecm9wRG93bldpZHRoID0gYS5nZXRMYXlvdXREaW1lbnNpb24oUi5zdHlsZWFibGUuQXV0b0NvbXBsZXRlVGV4dFZpZXdfZHJvcERvd25XaWR0aCwKLSAgICAgICAgICAgICAgICBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCk7Ci0gICAgICAgIG1Ecm9wRG93bkhlaWdodCA9IGEuZ2V0TGF5b3V0RGltZW5zaW9uKFIuc3R5bGVhYmxlLkF1dG9Db21wbGV0ZVRleHRWaWV3X2Ryb3BEb3duSGVpZ2h0LAotICAgICAgICAgICAgICAgIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuV1JBUF9DT05URU5UKTsKKyAgICAgICAgbVBvcHVwLnNldFdpZHRoKGEuZ2V0TGF5b3V0RGltZW5zaW9uKAorICAgICAgICAgICAgICAgIFIuc3R5bGVhYmxlLkF1dG9Db21wbGV0ZVRleHRWaWV3X2Ryb3BEb3duV2lkdGgsCisgICAgICAgICAgICAgICAgVmlld0dyb3VwLkxheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQpKTsKKyAgICAgICAgbVBvcHVwLnNldEhlaWdodChhLmdldExheW91dERpbWVuc2lvbigKKyAgICAgICAgICAgICAgICBSLnN0eWxlYWJsZS5BdXRvQ29tcGxldGVUZXh0Vmlld19kcm9wRG93bkhlaWdodCwKKyAgICAgICAgICAgICAgICBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCkpOwogCiAgICAgICAgIG1IaW50UmVzb3VyY2UgPSBhLmdldFJlc291cmNlSWQoUi5zdHlsZWFibGUuQXV0b0NvbXBsZXRlVGV4dFZpZXdfY29tcGxldGlvbkhpbnRWaWV3LAogICAgICAgICAgICAgICAgIFIubGF5b3V0LnNpbXBsZV9kcm9wZG93bl9oaW50KTsKKyAgICAgICAgCisgICAgICAgIG1Qb3B1cC5zZXRPbkl0ZW1DbGlja0xpc3RlbmVyKG5ldyBEcm9wRG93bkl0ZW1DbGlja0xpc3RlbmVyKCkpOworICAgICAgICBzZXRDb21wbGV0aW9uSGludChhLmdldFRleHQoUi5zdHlsZWFibGUuQXV0b0NvbXBsZXRlVGV4dFZpZXdfY29tcGxldGlvbkhpbnQpKTsKIAogICAgICAgICAvLyBBbHdheXMgdHVybiBvbiB0aGUgYXV0byBjb21wbGV0ZSBpbnB1dCB0eXBlIGZsYWcsIHNpbmNlIGl0CiAgICAgICAgIC8vIG1ha2VzIG5vIHNlbnNlIHRvIHVzZSB0aGlzIHdpZGdldCB3aXRob3V0IGl0LgpAQCAtMjM4LDYgKzIxMiwyMCBAQAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldENvbXBsZXRpb25IaW50KENoYXJTZXF1ZW5jZSBoaW50KSB7CiAgICAgICAgIG1IaW50VGV4dCA9IGhpbnQ7CisgICAgICAgIGlmIChoaW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChtSGludFZpZXcgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZpbmFsIFRleHRWaWV3IGhpbnRWaWV3ID0gKFRleHRWaWV3KSBMYXlvdXRJbmZsYXRlci5mcm9tKGdldENvbnRleHQoKSkuaW5mbGF0ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIG1IaW50UmVzb3VyY2UsIG51bGwpLmZpbmRWaWV3QnlJZChjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmlkLnRleHQxKTsKKyAgICAgICAgICAgICAgICBoaW50Vmlldy5zZXRUZXh0KG1IaW50VGV4dCk7CisgICAgICAgICAgICAgICAgbUhpbnRWaWV3ID0gaGludFZpZXc7CisgICAgICAgICAgICAgICAgbVBvcHVwLnNldFByb21wdFZpZXcoaGludFZpZXcpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtSGludFZpZXcuc2V0VGV4dChoaW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1Qb3B1cC5zZXRQcm9tcHRWaWV3KG51bGwpOworICAgICAgICAgICAgbUhpbnRWaWV3ID0gbnVsbDsKKyAgICAgICAgfQogICAgIH0KICAgICAKICAgICAvKioKQEAgLTI1MCw3ICsyMzgsNyBAQAogICAgICAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI0F1dG9Db21wbGV0ZVRleHRWaWV3X2Ryb3BEb3duV2lkdGgKICAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldERyb3BEb3duV2lkdGgoKSB7Ci0gICAgICAgIHJldHVybiBtRHJvcERvd25XaWR0aDsKKyAgICAgICAgcmV0dXJuIG1Qb3B1cC5nZXRXaWR0aCgpOwogICAgIH0KICAgICAKICAgICAvKioKQEAgLTI2Myw3ICsyNTEsNyBAQAogICAgICAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI0F1dG9Db21wbGV0ZVRleHRWaWV3X2Ryb3BEb3duV2lkdGgKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXREcm9wRG93bldpZHRoKGludCB3aWR0aCkgewotICAgICAgICBtRHJvcERvd25XaWR0aCA9IHdpZHRoOworICAgICAgICBtUG9wdXAuc2V0V2lkdGgod2lkdGgpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMjc3LDcgKzI2NSw3IEBACiAgICAgICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjQXV0b0NvbXBsZXRlVGV4dFZpZXdfZHJvcERvd25IZWlnaHQKICAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldERyb3BEb3duSGVpZ2h0KCkgewotICAgICAgICByZXR1cm4gbURyb3BEb3duSGVpZ2h0OworICAgICAgICByZXR1cm4gbVBvcHVwLmdldEhlaWdodCgpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMjkxLDcgKzI3OSw3IEBACiAgICAgICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjQXV0b0NvbXBsZXRlVGV4dFZpZXdfZHJvcERvd25IZWlnaHQKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXREcm9wRG93bkhlaWdodChpbnQgaGVpZ2h0KSB7Ci0gICAgICAgIG1Ecm9wRG93bkhlaWdodCA9IGhlaWdodDsKKyAgICAgICAgbVBvcHVwLnNldEhlaWdodChoZWlnaHQpOwogICAgIH0KICAgICAKICAgICAvKioKQEAgLTMxNiw3ICszMDQsNyBAQAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldERyb3BEb3duQW5jaG9yKGludCBpZCkgewogICAgICAgICBtRHJvcERvd25BbmNob3JJZCA9IGlkOwotICAgICAgICBtRHJvcERvd25BbmNob3JWaWV3ID0gbnVsbDsKKyAgICAgICAgbVBvcHVwLnNldEFuY2hvclZpZXcobnVsbCk7CiAgICAgfQogICAgIAogICAgIC8qKgpAQCAtMzU4LDcgKzM0Niw3IEBACiAgICAgICogQHBhcmFtIG9mZnNldCB0aGUgdmVydGljYWwgb2Zmc2V0CiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0RHJvcERvd25WZXJ0aWNhbE9mZnNldChpbnQgb2Zmc2V0KSB7Ci0gICAgICAgIG1Ecm9wRG93blZlcnRpY2FsT2Zmc2V0ID0gb2Zmc2V0OworICAgICAgICBtUG9wdXAuc2V0VmVydGljYWxPZmZzZXQob2Zmc2V0KTsKICAgICB9CiAgICAgCiAgICAgLyoqCkBAIC0zNjcsNyArMzU1LDcgQEAKICAgICAgKiBAcmV0dXJuIHRoZSB2ZXJ0aWNhbCBvZmZzZXQKICAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldERyb3BEb3duVmVydGljYWxPZmZzZXQoKSB7Ci0gICAgICAgIHJldHVybiBtRHJvcERvd25WZXJ0aWNhbE9mZnNldDsKKyAgICAgICAgcmV0dXJuIG1Qb3B1cC5nZXRWZXJ0aWNhbE9mZnNldCgpOwogICAgIH0KICAgICAKICAgICAvKioKQEAgLTM3Niw3ICszNjQsNyBAQAogICAgICAqIEBwYXJhbSBvZmZzZXQgdGhlIGhvcml6b250YWwgb2Zmc2V0CiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0RHJvcERvd25Ib3Jpem9udGFsT2Zmc2V0KGludCBvZmZzZXQpIHsKLSAgICAgICAgbURyb3BEb3duSG9yaXpvbnRhbE9mZnNldCA9IG9mZnNldDsKKyAgICAgICAgbVBvcHVwLnNldEhvcml6b250YWxPZmZzZXQob2Zmc2V0KTsKICAgICB9CiAgICAgCiAgICAgLyoqCkBAIC0zODUsNyArMzczLDcgQEAKICAgICAgKiBAcmV0dXJuIHRoZSBob3Jpem9udGFsIG9mZnNldAogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0RHJvcERvd25Ib3Jpem9udGFsT2Zmc2V0KCkgewotICAgICAgICByZXR1cm4gbURyb3BEb3duSG9yaXpvbnRhbE9mZnNldDsKKyAgICAgICAgcmV0dXJuIG1Qb3B1cC5nZXRIb3Jpem9udGFsT2Zmc2V0KCk7CiAgICAgfQogCiAgICAgIC8qKgpAQCAtNDIyLDcgKzQxMCw3IEBACiAgICAgICogQGhpZGUgUGVuZGluZyBBUEkgY291bmNpbCBhcHByb3ZhbAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGlzRHJvcERvd25BbHdheXNWaXNpYmxlKCkgewotICAgICAgICByZXR1cm4gbURyb3BEb3duQWx3YXlzVmlzaWJsZTsKKyAgICAgICAgcmV0dXJuIG1Qb3B1cC5pc0Ryb3BEb3duQWx3YXlzVmlzaWJsZSgpOwogICAgIH0KIAogICAgIC8qKgpAQCAtNDM5LDcgKzQyNyw3IEBACiAgICAgICogQGhpZGUgUGVuZGluZyBBUEkgY291bmNpbCBhcHByb3ZhbAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldERyb3BEb3duQWx3YXlzVmlzaWJsZShib29sZWFuIGRyb3BEb3duQWx3YXlzVmlzaWJsZSkgewotICAgICAgICBtRHJvcERvd25BbHdheXNWaXNpYmxlID0gZHJvcERvd25BbHdheXNWaXNpYmxlOworICAgICAgICBtUG9wdXAuc2V0RHJvcERvd25BbHdheXNWaXNpYmxlKGRyb3BEb3duQWx3YXlzVmlzaWJsZSk7CiAgICAgfQogICAgCiAgICAgLyoqCkBAIC02MDYsMTUgKzU5NCwxMyBAQAogICAgICAgICAgICAgbUZpbHRlciA9IG51bGw7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAobURyb3BEb3duTGlzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtRHJvcERvd25MaXN0LnNldEFkYXB0ZXIobUFkYXB0ZXIpOwotICAgICAgICB9CisgICAgICAgIG1Qb3B1cC5zZXRBZGFwdGVyKG1BZGFwdGVyKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBvbktleVByZUltZShpbnQga2V5Q29kZSwgS2V5RXZlbnQgZXZlbnQpIHsKICAgICAgICAgaWYgKGtleUNvZGUgPT0gS2V5RXZlbnQuS0VZQ09ERV9CQUNLICYmIGlzUG9wdXBTaG93aW5nKCkKLSAgICAgICAgICAgICAgICAmJiAhbURyb3BEb3duQWx3YXlzVmlzaWJsZSkgeworICAgICAgICAgICAgICAgICYmICFtUG9wdXAuaXNEcm9wRG93bkFsd2F5c1Zpc2libGUoKSkgewogICAgICAgICAgICAgLy8gc3BlY2lhbCBjYXNlIGZvciB0aGUgYmFjayBrZXksIHdlIGRvIG5vdCBldmVuIHRyeSB0byBzZW5kIGl0CiAgICAgICAgICAgICAvLyB0byB0aGUgZHJvcCBkb3duIGxpc3QgYnV0IGluc3RlYWQsIGNvbnN1bWUgaXQgaW1tZWRpYXRlbHkKICAgICAgICAgICAgIGlmIChldmVudC5nZXRBY3Rpb24oKSA9PSBLZXlFdmVudC5BQ1RJT05fRE9XTiAmJiBldmVudC5nZXRSZXBlYXRDb3VudCgpID09IDApIHsKQEAgLTYzMywxOCArNjE5LDE2IEBACiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBvbktleVVwKGludCBrZXlDb2RlLCBLZXlFdmVudCBldmVudCkgewotICAgICAgICBpZiAoaXNQb3B1cFNob3dpbmcoKSAmJiBtRHJvcERvd25MaXN0LmdldFNlbGVjdGVkSXRlbVBvc2l0aW9uKCkgPj0gMCkgewotICAgICAgICAgICAgYm9vbGVhbiBjb25zdW1lZCA9IG1Ecm9wRG93bkxpc3Qub25LZXlVcChrZXlDb2RlLCBldmVudCk7Ci0gICAgICAgICAgICBpZiAoY29uc3VtZWQpIHsKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKGtleUNvZGUpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIGxpc3QgYWNjZXB0cyB0aGUga2V5IGV2ZW50cyBhbmQgdGhlIGtleSBldmVudAotICAgICAgICAgICAgICAgICAgICAvLyB3YXMgYSBjbGljaywgdGhlIHRleHQgdmlldyBnZXRzIHRoZSBzZWxlY3RlZCBpdGVtCi0gICAgICAgICAgICAgICAgICAgIC8vIGZyb20gdGhlIGRyb3AgZG93biBhcyBpdHMgY29udGVudAotICAgICAgICAgICAgICAgICAgICBjYXNlIEtleUV2ZW50LktFWUNPREVfRU5URVI6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0NFTlRFUjoKLSAgICAgICAgICAgICAgICAgICAgICAgIHBlcmZvcm1Db21wbGV0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgIGJvb2xlYW4gY29uc3VtZWQgPSBtUG9wdXAub25LZXlVcChrZXlDb2RlLCBldmVudCk7CisgICAgICAgIGlmIChjb25zdW1lZCkgeworICAgICAgICAgICAgc3dpdGNoIChrZXlDb2RlKSB7CisgICAgICAgICAgICAvLyBpZiB0aGUgbGlzdCBhY2NlcHRzIHRoZSBrZXkgZXZlbnRzIGFuZCB0aGUga2V5IGV2ZW50CisgICAgICAgICAgICAvLyB3YXMgYSBjbGljaywgdGhlIHRleHQgdmlldyBnZXRzIHRoZSBzZWxlY3RlZCBpdGVtCisgICAgICAgICAgICAvLyBmcm9tIHRoZSBkcm9wIGRvd24gYXMgaXRzIGNvbnRlbnQKKyAgICAgICAgICAgIGNhc2UgS2V5RXZlbnQuS0VZQ09ERV9FTlRFUjoKKyAgICAgICAgICAgIGNhc2UgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0NFTlRFUjoKKyAgICAgICAgICAgICAgICBwZXJmb3JtQ29tcGxldGlvbigpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIHJldHVybiBzdXBlci5vbktleVVwKGtleUNvZGUsIGV2ZW50KTsKQEAgLTY1Miw4NyArNjM2LDExIEBACiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBvbktleURvd24oaW50IGtleUNvZGUsIEtleUV2ZW50IGV2ZW50KSB7Ci0gICAgICAgIC8vIHdoZW4gdGhlIGRyb3AgZG93biBpcyBzaG93biwgd2UgZHJpdmUgaXQgZGlyZWN0bHkKLSAgICAgICAgaWYgKGlzUG9wdXBTaG93aW5nKCkpIHsKLSAgICAgICAgICAgIC8vIHRoZSBrZXkgZXZlbnRzIGFyZSBmb3J3YXJkZWQgdG8gdGhlIGxpc3QgaW4gdGhlIGRyb3AgZG93biB2aWV3Ci0gICAgICAgICAgICAvLyBub3RlIHRoYXQgTGlzdFZpZXcgaGFuZGxlcyBzcGFjZSBidXQgd2UgZG9uJ3Qgd2FudCB0aGF0IHRvIGhhcHBlbgotICAgICAgICAgICAgLy8gYWxzbyBpZiBzZWxlY3Rpb24gaXMgbm90IGN1cnJlbnRseSBpbiB0aGUgZHJvcCBkb3duLCB0aGVuIGRvbid0Ci0gICAgICAgICAgICAvLyBsZXQgY2VudGVyIG9yIGVudGVyIHByZXNzZXMgZ28gdGhlcmUgc2luY2UgdGhhdCB3b3VsZCBjYXVzZSBpdAotICAgICAgICAgICAgLy8gdG8gc2VsZWN0IG9uZSBvZiBpdHMgaXRlbXMKLSAgICAgICAgICAgIGlmIChrZXlDb2RlICE9IEtleUV2ZW50LktFWUNPREVfU1BBQ0UKLSAgICAgICAgICAgICAgICAgICAgJiYgKG1Ecm9wRG93bkxpc3QuZ2V0U2VsZWN0ZWRJdGVtUG9zaXRpb24oKSA+PSAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKGtleUNvZGUgIT0gS2V5RXZlbnQuS0VZQ09ERV9FTlRFUgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYga2V5Q29kZSAhPSBLZXlFdmVudC5LRVlDT0RFX0RQQURfQ0VOVEVSKSkpIHsKLSAgICAgICAgICAgICAgICBpbnQgY3VySW5kZXggPSBtRHJvcERvd25MaXN0LmdldFNlbGVjdGVkSXRlbVBvc2l0aW9uKCk7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBjb25zdW1lZDsKLQotICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gYmVsb3cgPSAhbVBvcHVwLmlzQWJvdmVBbmNob3IoKTsKLQotICAgICAgICAgICAgICAgIGZpbmFsIExpc3RBZGFwdGVyIGFkYXB0ZXIgPSBtQWRhcHRlcjsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBib29sZWFuIGFsbEVuYWJsZWQ7Ci0gICAgICAgICAgICAgICAgaW50IGZpcnN0SXRlbSA9IEludGVnZXIuTUFYX1ZBTFVFOwotICAgICAgICAgICAgICAgIGludCBsYXN0SXRlbSA9IEludGVnZXIuTUlOX1ZBTFVFOwotCi0gICAgICAgICAgICAgICAgaWYgKGFkYXB0ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBhbGxFbmFibGVkID0gYWRhcHRlci5hcmVBbGxJdGVtc0VuYWJsZWQoKTsKLSAgICAgICAgICAgICAgICAgICAgZmlyc3RJdGVtID0gYWxsRW5hYmxlZCA/IDAgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ecm9wRG93bkxpc3QubG9va0ZvclNlbGVjdGFibGVQb3NpdGlvbigwLCB0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgbGFzdEl0ZW0gPSBhbGxFbmFibGVkID8gYWRhcHRlci5nZXRDb3VudCgpIC0gMSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbURyb3BEb3duTGlzdC5sb29rRm9yU2VsZWN0YWJsZVBvc2l0aW9uKGFkYXB0ZXIuZ2V0Q291bnQoKSAtIDEsIGZhbHNlKTsgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAoKGJlbG93ICYmIGtleUNvZGUgPT0gS2V5RXZlbnQuS0VZQ09ERV9EUEFEX1VQICYmIGN1ckluZGV4IDw9IGZpcnN0SXRlbSkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICghYmVsb3cgJiYga2V5Q29kZSA9PSBLZXlFdmVudC5LRVlDT0RFX0RQQURfRE9XTiAmJiBjdXJJbmRleCA+PSBsYXN0SXRlbSkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gV2hlbiB0aGUgc2VsZWN0aW9uIGlzIGF0IHRoZSB0b3AsIHdlIGJsb2NrIHRoZSBrZXkKLSAgICAgICAgICAgICAgICAgICAgLy8gZXZlbnQgdG8gcHJldmVudCBmb2N1cyBmcm9tIG1vdmluZy4KLSAgICAgICAgICAgICAgICAgICAgY2xlYXJMaXN0U2VsZWN0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1Qb3B1cC5zZXRJbnB1dE1ldGhvZE1vZGUoUG9wdXBXaW5kb3cuSU5QVVRfTUVUSE9EX05FRURFRCk7Ci0gICAgICAgICAgICAgICAgICAgIHNob3dEcm9wRG93bigpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBXQVJOSU5HOiBQbGVhc2UgcmVhZCB0aGUgY29tbWVudCB3aGVyZSBtTGlzdFNlbGVjdGlvbkhpZGRlbgotICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICBpcyBkZWNsYXJlZAotICAgICAgICAgICAgICAgICAgICBtRHJvcERvd25MaXN0Lm1MaXN0U2VsZWN0aW9uSGlkZGVuID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgY29uc3VtZWQgPSBtRHJvcERvd25MaXN0Lm9uS2V5RG93bihrZXlDb2RlLCBldmVudCk7Ci0gICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICJLZXkgZG93bjogY29kZT0iICsga2V5Q29kZSArICIgbGlzdCBjb25zdW1lZD0iICsgY29uc3VtZWQpOwotCi0gICAgICAgICAgICAgICAgaWYgKGNvbnN1bWVkKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIElmIGl0IGhhbmRsZWQgdGhlIGtleSBldmVudCwgdGhlbiB0aGUgdXNlciBpcwotICAgICAgICAgICAgICAgICAgICAvLyBuYXZpZ2F0aW5nIGluIHRoZSBsaXN0LCBzbyB3ZSBzaG91bGQgcHV0IGl0IGluIGZyb250LgotICAgICAgICAgICAgICAgICAgICBtUG9wdXAuc2V0SW5wdXRNZXRob2RNb2RlKFBvcHVwV2luZG93LklOUFVUX01FVEhPRF9OT1RfTkVFREVEKTsKLSAgICAgICAgICAgICAgICAgICAgLy8gSGVyZSdzIGEgbGl0dGxlIHRyaWNrIHdlIG5lZWQgdG8gZG8gdG8gbWFrZSBzdXJlIHRoYXQKLSAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGxpc3QgdmlldyBpcyBhY3R1YWxseSBzaG93aW5nIGl0cyBmb2N1cyBpbmRpY2F0b3IsCi0gICAgICAgICAgICAgICAgICAgIC8vIGJ5IGVuc3VyaW5nIGl0IGhhcyBmb2N1cyBhbmQgZ2V0dGluZyBpdHMgd2luZG93IG91dAotICAgICAgICAgICAgICAgICAgICAvLyBvZiB0b3VjaCBtb2RlLgotICAgICAgICAgICAgICAgICAgICBtRHJvcERvd25MaXN0LnJlcXVlc3RGb2N1c0Zyb21Ub3VjaCgpOwotICAgICAgICAgICAgICAgICAgICBzaG93RHJvcERvd24oKTsKLQotICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGtleUNvZGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGF2b2lkIHBhc3NpbmcgdGhlIGZvY3VzIGZyb20gdGhlIHRleHQgdmlldyB0byB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5leHQgY29tcG9uZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEtleUV2ZW50LktFWUNPREVfRU5URVI6Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEtleUV2ZW50LktFWUNPREVfRFBBRF9DRU5URVI6Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEtleUV2ZW50LktFWUNPREVfRFBBRF9ET1dOOgotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBLZXlFdmVudC5LRVlDT0RFX0RQQURfVVA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZiAoYmVsb3cgJiYga2V5Q29kZSA9PSBLZXlFdmVudC5LRVlDT0RFX0RQQURfRE9XTikgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2hlbiB0aGUgc2VsZWN0aW9uIGlzIGF0IHRoZSBib3R0b20sIHdlIGJsb2NrIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXZlbnQgdG8gYXZvaWQgZ29pbmcgdG8gdGhlIG5leHQgZm9jdXNhYmxlIHdpZGdldAotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1ckluZGV4ID09IGxhc3RJdGVtKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWJlbG93ICYmIGtleUNvZGUgPT0gS2V5RXZlbnQuS0VZQ09ERV9EUEFEX1VQICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VySW5kZXggPT0gZmlyc3RJdGVtKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKG1Qb3B1cC5vbktleURvd24oa2V5Q29kZSwgZXZlbnQpKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKCFpc1BvcHVwU2hvd2luZygpKSB7CiAgICAgICAgICAgICBzd2l0Y2goa2V5Q29kZSkgewogICAgICAgICAgICAgY2FzZSBLZXlFdmVudC5LRVlDT0RFX0RQQURfRE9XTjoKICAgICAgICAgICAgICAgICBwZXJmb3JtVmFsaWRhdGlvbigpOwpAQCAtNzQzLDcgKzY1MSw3IEBACiAgICAgICAgIGJvb2xlYW4gaGFuZGxlZCA9IHN1cGVyLm9uS2V5RG93bihrZXlDb2RlLCBldmVudCk7CiAgICAgICAgIG1MYXN0S2V5Q29kZSA9IEtleUV2ZW50LktFWUNPREVfVU5LTk9XTjsKIAotICAgICAgICBpZiAoaGFuZGxlZCAmJiBpc1BvcHVwU2hvd2luZygpICYmIG1Ecm9wRG93bkxpc3QgIT0gbnVsbCkgeworICAgICAgICBpZiAoaGFuZGxlZCAmJiBpc1BvcHVwU2hvd2luZygpKSB7CiAgICAgICAgICAgICBjbGVhckxpc3RTZWxlY3Rpb24oKTsKICAgICAgICAgfQogCkBAIC04MDQsMTEgKzcxMiwxMiBAQAogICAgICAgICBpZiAoZW5vdWdoVG9GaWx0ZXIoKSkgewogICAgICAgICAgICAgaWYgKG1GaWx0ZXIgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIHBlcmZvcm1GaWx0ZXJpbmcoZ2V0VGV4dCgpLCBtTGFzdEtleUNvZGUpOworICAgICAgICAgICAgICAgIGJ1aWxkSW1lQ29tcGxldGlvbnMoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIC8vIGRyb3AgZG93biBpcyBhdXRvbWF0aWNhbGx5IGRpc21pc3NlZCB3aGVuIGVub3VnaCBjaGFyYWN0ZXJzCiAgICAgICAgICAgICAvLyBhcmUgZGVsZXRlZCBmcm9tIHRoZSB0ZXh0IHZpZXcKLSAgICAgICAgICAgIGlmICghbURyb3BEb3duQWx3YXlzVmlzaWJsZSkgZGlzbWlzc0Ryb3BEb3duKCk7CisgICAgICAgICAgICBpZiAoIW1Qb3B1cC5pc0Ryb3BEb3duQWx3YXlzVmlzaWJsZSgpKSBkaXNtaXNzRHJvcERvd24oKTsKICAgICAgICAgICAgIGlmIChtRmlsdGVyICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICBtRmlsdGVyLmZpbHRlcihudWxsKTsKICAgICAgICAgICAgIH0KQEAgLTg0MSwxMyArNzUwLDcgQEAKICAgICAgKiBpdCBiYWNrLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGNsZWFyTGlzdFNlbGVjdGlvbigpIHsKLSAgICAgICAgZmluYWwgRHJvcERvd25MaXN0VmlldyBsaXN0ID0gbURyb3BEb3duTGlzdDsKLSAgICAgICAgaWYgKGxpc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgLy8gV0FSTklORzogUGxlYXNlIHJlYWQgdGhlIGNvbW1lbnQgd2hlcmUgbUxpc3RTZWxlY3Rpb25IaWRkZW4gaXMgZGVjbGFyZWQKLSAgICAgICAgICAgIGxpc3QubUxpc3RTZWxlY3Rpb25IaWRkZW4gPSB0cnVlOwotICAgICAgICAgICAgbGlzdC5oaWRlU2VsZWN0b3IoKTsKLSAgICAgICAgICAgIGxpc3QucmVxdWVzdExheW91dCgpOwotICAgICAgICB9CisgICAgICAgIG1Qb3B1cC5jbGVhckxpc3RTZWxlY3Rpb24oKTsKICAgICB9CiAgICAgCiAgICAgLyoqCkBAIC04NTYsMTEgKzc1OSw3IEBACiAgICAgICogQHBhcmFtIHBvc2l0aW9uIFRoZSBwb3NpdGlvbiB0byBtb3ZlIHRoZSBzZWxlY3RvciB0by4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRMaXN0U2VsZWN0aW9uKGludCBwb3NpdGlvbikgewotICAgICAgICBpZiAobVBvcHVwLmlzU2hvd2luZygpICYmIChtRHJvcERvd25MaXN0ICE9IG51bGwpKSB7Ci0gICAgICAgICAgICBtRHJvcERvd25MaXN0Lm1MaXN0U2VsZWN0aW9uSGlkZGVuID0gZmFsc2U7Ci0gICAgICAgICAgICBtRHJvcERvd25MaXN0LnNldFNlbGVjdGlvbihwb3NpdGlvbik7Ci0gICAgICAgICAgICAvLyBMaXN0Vmlldy5zZXRTZWxlY3Rpb24oKSB3aWxsIGNhbGwgcmVxdWVzdExheW91dCgpCi0gICAgICAgIH0KKyAgICAgICAgbVBvcHVwLnNldFNlbGVjdGlvbihwb3NpdGlvbik7CiAgICAgfQogCiAgICAgLyoqCkBAIC04NzQsMTAgKzc3Myw3IEBACiAgICAgICogQHNlZSBMaXN0VmlldyNnZXRTZWxlY3RlZEl0ZW1Qb3NpdGlvbigpCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXRMaXN0U2VsZWN0aW9uKCkgewotICAgICAgICBpZiAobVBvcHVwLmlzU2hvd2luZygpICYmIChtRHJvcERvd25MaXN0ICE9IG51bGwpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbURyb3BEb3duTGlzdC5nZXRTZWxlY3RlZEl0ZW1Qb3NpdGlvbigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBMaXN0Vmlldy5JTlZBTElEX1BPU0lUSU9OOworICAgICAgICByZXR1cm4gbVBvcHVwLmdldFNlbGVjdGVkSXRlbVBvc2l0aW9uKCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC05MTEsMTMgKzgwNyw3IEBACiAgICAgICAgICAgICByZXBsYWNlVGV4dChjb21wbGV0aW9uLmdldFRleHQoKSk7CiAgICAgICAgICAgICBtQmxvY2tDb21wbGV0aW9uID0gZmFsc2U7CiAKLSAgICAgICAgICAgIGlmIChtSXRlbUNsaWNrTGlzdGVuZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZpbmFsIERyb3BEb3duTGlzdFZpZXcgbGlzdCA9IG1Ecm9wRG93bkxpc3Q7Ci0gICAgICAgICAgICAgICAgLy8gTm90ZSB0aGF0IHdlIGRvbid0IGhhdmUgYSBWaWV3IGhlcmUsIHNvIHdlIHdpbGwgbmVlZCB0bwotICAgICAgICAgICAgICAgIC8vIHN1cHBseSBudWxsLiAgSG9wZWZ1bGx5IG5vIGV4aXN0aW5nIGFwcHMgY3Jhc2guLi4KLSAgICAgICAgICAgICAgICBtSXRlbUNsaWNrTGlzdGVuZXIub25JdGVtQ2xpY2sobGlzdCwgbnVsbCwgY29tcGxldGlvbi5nZXRQb3NpdGlvbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGlvbi5nZXRJZCgpKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1Qb3B1cC5wZXJmb3JtSXRlbUNsaWNrKGNvbXBsZXRpb24uZ2V0UG9zaXRpb24oKSk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTkyNSw3ICs4MTUsNyBAQAogICAgICAgICBpZiAoaXNQb3B1cFNob3dpbmcoKSkgewogICAgICAgICAgICAgT2JqZWN0IHNlbGVjdGVkSXRlbTsKICAgICAgICAgICAgIGlmIChwb3NpdGlvbiA8IDApIHsKLSAgICAgICAgICAgICAgICBzZWxlY3RlZEl0ZW0gPSBtRHJvcERvd25MaXN0LmdldFNlbGVjdGVkSXRlbSgpOworICAgICAgICAgICAgICAgIHNlbGVjdGVkSXRlbSA9IG1Qb3B1cC5nZXRTZWxlY3RlZEl0ZW0oKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgc2VsZWN0ZWRJdGVtID0gbUFkYXB0ZXIuZ2V0SXRlbShwb3NpdGlvbik7CiAgICAgICAgICAgICB9CkBAIC05MzksMTggKzgyOSwxOCBAQAogICAgICAgICAgICAgbUJsb2NrQ29tcGxldGlvbiA9IGZhbHNlOyAgICAgICAgICAgIAogCiAgICAgICAgICAgICBpZiAobUl0ZW1DbGlja0xpc3RlbmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBEcm9wRG93bkxpc3RWaWV3IGxpc3QgPSBtRHJvcERvd25MaXN0OworICAgICAgICAgICAgICAgIGZpbmFsIExpc3RQb3B1cFdpbmRvdyBsaXN0ID0gbVBvcHVwOwogCiAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdGVkVmlldyA9PSBudWxsIHx8IHBvc2l0aW9uIDwgMCkgewogICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZFZpZXcgPSBsaXN0LmdldFNlbGVjdGVkVmlldygpOwogICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IGxpc3QuZ2V0U2VsZWN0ZWRJdGVtUG9zaXRpb24oKTsKICAgICAgICAgICAgICAgICAgICAgaWQgPSBsaXN0LmdldFNlbGVjdGVkSXRlbUlkKCk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1JdGVtQ2xpY2tMaXN0ZW5lci5vbkl0ZW1DbGljayhsaXN0LCBzZWxlY3RlZFZpZXcsIHBvc2l0aW9uLCBpZCk7CisgICAgICAgICAgICAgICAgbUl0ZW1DbGlja0xpc3RlbmVyLm9uSXRlbUNsaWNrKGxpc3QuZ2V0TGlzdFZpZXcoKSwgc2VsZWN0ZWRWaWV3LCBwb3NpdGlvbiwgaWQpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgaWYgKG1Ecm9wRG93bkRpc21pc3NlZE9uQ29tcGxldGlvbiAmJiAhbURyb3BEb3duQWx3YXlzVmlzaWJsZSkgeworICAgICAgICBpZiAobURyb3BEb3duRGlzbWlzc2VkT25Db21wbGV0aW9uICYmICFtUG9wdXAuaXNEcm9wRG93bkFsd2F5c1Zpc2libGUoKSkgewogICAgICAgICAgICAgZGlzbWlzc0Ryb3BEb3duKCk7CiAgICAgICAgIH0KICAgICB9CkBAIC0xMDAwLDcgKzg5MCw2IEBACiAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KICAgICBwdWJsaWMgdm9pZCBvbkZpbHRlckNvbXBsZXRlKGludCBjb3VudCkgewogICAgICAgICB1cGRhdGVEcm9wRG93bkZvckZpbHRlcihjb3VudCk7Ci0KICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgdXBkYXRlRHJvcERvd25Gb3JGaWx0ZXIoaW50IGNvdW50KSB7CkBAIC0xMDE0LDExICs5MDMsMTIgQEAKICAgICAgICAgICogdG8gZmlsdGVyLgogICAgICAgICAgKi8KIAotICAgICAgICBpZiAoKGNvdW50ID4gMCB8fCBtRHJvcERvd25BbHdheXNWaXNpYmxlKSAmJiBlbm91Z2hUb0ZpbHRlcigpKSB7CisgICAgICAgIGZpbmFsIGJvb2xlYW4gZHJvcERvd25BbHdheXNWaXNpYmxlID0gbVBvcHVwLmlzRHJvcERvd25BbHdheXNWaXNpYmxlKCk7CisgICAgICAgIGlmICgoY291bnQgPiAwIHx8IGRyb3BEb3duQWx3YXlzVmlzaWJsZSkgJiYgZW5vdWdoVG9GaWx0ZXIoKSkgewogICAgICAgICAgICAgaWYgKGhhc0ZvY3VzKCkgJiYgaGFzV2luZG93Rm9jdXMoKSkgewogICAgICAgICAgICAgICAgIHNob3dEcm9wRG93bigpOwogICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKCFtRHJvcERvd25BbHdheXNWaXNpYmxlKSB7CisgICAgICAgIH0gZWxzZSBpZiAoIWRyb3BEb3duQWx3YXlzVmlzaWJsZSkgewogICAgICAgICAgICAgZGlzbWlzc0Ryb3BEb3duKCk7CiAgICAgICAgIH0KICAgICB9CkBAIC0xMDI2LDcgKzkxNiw3IEBACiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgb25XaW5kb3dGb2N1c0NoYW5nZWQoYm9vbGVhbiBoYXNXaW5kb3dGb2N1cykgewogICAgICAgICBzdXBlci5vbldpbmRvd0ZvY3VzQ2hhbmdlZChoYXNXaW5kb3dGb2N1cyk7Ci0gICAgICAgIGlmICghaGFzV2luZG93Rm9jdXMgJiYgIW1Ecm9wRG93bkFsd2F5c1Zpc2libGUpIHsKKyAgICAgICAgaWYgKCFoYXNXaW5kb3dGb2N1cyAmJiAhbVBvcHVwLmlzRHJvcERvd25BbHdheXNWaXNpYmxlKCkpIHsKICAgICAgICAgICAgIGRpc21pc3NEcm9wRG93bigpOwogICAgICAgICB9CiAgICAgfQpAQCAtMTAzNiw3ICs5MjYsNyBAQAogICAgICAgICBzdXBlci5vbkRpc3BsYXlIaW50KGhpbnQpOwogICAgICAgICBzd2l0Y2ggKGhpbnQpIHsKICAgICAgICAgICAgIGNhc2UgSU5WSVNJQkxFOgotICAgICAgICAgICAgICAgIGlmICghbURyb3BEb3duQWx3YXlzVmlzaWJsZSkgeworICAgICAgICAgICAgICAgIGlmICghbVBvcHVwLmlzRHJvcERvd25BbHdheXNWaXNpYmxlKCkpIHsKICAgICAgICAgICAgICAgICAgICAgZGlzbWlzc0Ryb3BEb3duKCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtMTA1MCw3ICs5NDAsNyBAQAogICAgICAgICBpZiAoIWZvY3VzZWQpIHsKICAgICAgICAgICAgIHBlcmZvcm1WYWxpZGF0aW9uKCk7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKCFmb2N1c2VkICYmICFtRHJvcERvd25BbHdheXNWaXNpYmxlKSB7CisgICAgICAgIGlmICghZm9jdXNlZCAmJiAhbVBvcHVwLmlzRHJvcERvd25BbHdheXNWaXNpYmxlKCkpIHsKICAgICAgICAgICAgIGRpc21pc3NEcm9wRG93bigpOwogICAgICAgICB9CiAgICAgfQpAQCAtMTA3NSw4ICs5NjUsNiBAQAogICAgICAgICAgICAgaW1tLmRpc3BsYXlDb21wbGV0aW9ucyh0aGlzLCBudWxsKTsKICAgICAgICAgfQogICAgICAgICBtUG9wdXAuZGlzbWlzcygpOwotICAgICAgICBtUG9wdXAuc2V0Q29udGVudFZpZXcobnVsbCk7Ci0gICAgICAgIG1Ecm9wRG93bkxpc3QgPSBudWxsOwogICAgIH0KIAogICAgIEBPdmVycmlkZQpAQCAtMTA4OSwxOCArOTc3LDYgQEAKIAogICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiA8cD5Vc2VkIGZvciBsYXp5IGluc3RhbnRpYXRpb24gb2YgdGhlIGFuY2hvciB2aWV3IGZyb20gdGhlIGlkIHdlIGhhdmUuIElmIHRoZSB2YWx1ZSBvZgotICAgICAqIHRoZSBpZCBpcyBOT19JRCBvciB3ZSBjYW4ndCBmaW5kIGEgdmlldyBmb3IgdGhlIGdpdmVuIGlkLCB3ZSByZXR1cm4gdGhpcyBUZXh0VmlldyBhcwotICAgICAqIHRoZSBkZWZhdWx0IGFuY2hvcmluZyBwb2ludC48L3A+Ci0gICAgICovCi0gICAgcHJpdmF0ZSBWaWV3IGdldERyb3BEb3duQW5jaG9yVmlldygpIHsKLSAgICAgICAgaWYgKG1Ecm9wRG93bkFuY2hvclZpZXcgPT0gbnVsbCAmJiBtRHJvcERvd25BbmNob3JJZCAhPSBWaWV3Lk5PX0lEKSB7Ci0gICAgICAgICAgICBtRHJvcERvd25BbmNob3JWaWV3ID0gZ2V0Um9vdFZpZXcoKS5maW5kVmlld0J5SWQobURyb3BEb3duQW5jaG9ySWQpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtRHJvcERvd25BbmNob3JWaWV3ID09IG51bGwgPyB0aGlzIDogbURyb3BEb3duQW5jaG9yVmlldzsKLSAgICB9CiAKICAgICAvKioKICAgICAgKiBJc3N1ZXMgYSBydW5uYWJsZSB0byBzaG93IHRoZSBkcm9wZG93biBhcyBzb29uIGFzIHBvc3NpYmxlLgpAQCAtMTEwOCw3ICs5ODQsNyBAQAogICAgICAqIEBoaWRlIGludGVybmFsIHVzZWQgb25seSBieSBTZWFyY2hEaWFsb2cKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzaG93RHJvcERvd25BZnRlckxheW91dCgpIHsKLSAgICAgICAgcG9zdChtU2hvd0Ryb3BEb3duUnVubmFibGUpOworICAgICAgICBtUG9wdXAucG9zdFNob3coKTsKICAgICB9CiAgICAgCiAgICAgLyoqCkBAIC0xMTE5LDcgKzk5NSw3IEBACiAgICAgICovCiAgICAgcHVibGljIHZvaWQgZW5zdXJlSW1lVmlzaWJsZShib29sZWFuIHZpc2libGUpIHsKICAgICAgICAgbVBvcHVwLnNldElucHV0TWV0aG9kTW9kZSh2aXNpYmxlCi0gICAgICAgICAgICAgICAgPyBQb3B1cFdpbmRvdy5JTlBVVF9NRVRIT0RfTkVFREVEIDogUG9wdXBXaW5kb3cuSU5QVVRfTUVUSE9EX05PVF9ORUVERUQpOworICAgICAgICAgICAgICAgID8gTGlzdFBvcHVwV2luZG93LklOUFVUX01FVEhPRF9ORUVERUQgOiBMaXN0UG9wdXBXaW5kb3cuSU5QVVRfTUVUSE9EX05PVF9ORUVERUQpOwogICAgICAgICBzaG93RHJvcERvd24oKTsKICAgICB9CiAKQEAgLTExMjcsODkgKzEwMDMsMjEgQEAKICAgICAgKiBAaGlkZSBpbnRlcm5hbCB1c2VkIG9ubHkgaGVyZSBhbmQgU2VhcmNoRGlhbG9nCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaXNJbnB1dE1ldGhvZE5vdE5lZWRlZCgpIHsKLSAgICAgICAgcmV0dXJuIG1Qb3B1cC5nZXRJbnB1dE1ldGhvZE1vZGUoKSA9PSBQb3B1cFdpbmRvdy5JTlBVVF9NRVRIT0RfTk9UX05FRURFRDsKKyAgICAgICAgcmV0dXJuIG1Qb3B1cC5nZXRJbnB1dE1ldGhvZE1vZGUoKSA9PSBMaXN0UG9wdXBXaW5kb3cuSU5QVVRfTUVUSE9EX05PVF9ORUVERUQ7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogPHA+RGlzcGxheXMgdGhlIGRyb3AgZG93biBvbiBzY3JlZW4uPC9wPgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNob3dEcm9wRG93bigpIHsKLSAgICAgICAgaW50IGhlaWdodCA9IGJ1aWxkRHJvcERvd24oKTsKLQotICAgICAgICBpbnQgd2lkdGhTcGVjID0gMDsKLSAgICAgICAgaW50IGhlaWdodFNwZWMgPSAwOwotCi0gICAgICAgIGJvb2xlYW4gbm9JbnB1dE1ldGhvZCA9IGlzSW5wdXRNZXRob2ROb3ROZWVkZWQoKTsKLQotICAgICAgICBpZiAobVBvcHVwLmlzU2hvd2luZygpKSB7Ci0gICAgICAgICAgICBpZiAobURyb3BEb3duV2lkdGggPT0gVmlld0dyb3VwLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQpIHsKLSAgICAgICAgICAgICAgICAvLyBUaGUgY2FsbCB0byBQb3B1cFdpbmRvdydzIHVwZGF0ZSBtZXRob2QgYmVsb3cgY2FuIGFjY2VwdCAtMSBmb3IgYW55Ci0gICAgICAgICAgICAgICAgLy8gdmFsdWUgeW91IGRvIG5vdCB3YW50IHRvIHVwZGF0ZS4KLSAgICAgICAgICAgICAgICB3aWR0aFNwZWMgPSAtMTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobURyb3BEb3duV2lkdGggPT0gVmlld0dyb3VwLkxheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQpIHsKLSAgICAgICAgICAgICAgICB3aWR0aFNwZWMgPSBnZXREcm9wRG93bkFuY2hvclZpZXcoKS5nZXRXaWR0aCgpOworICAgICAgICBpZiAobVBvcHVwLmdldEFuY2hvclZpZXcoKSA9PSBudWxsKSB7CisgICAgICAgICAgICBpZiAobURyb3BEb3duQW5jaG9ySWQgIT0gVmlldy5OT19JRCkgeworICAgICAgICAgICAgICAgIG1Qb3B1cC5zZXRBbmNob3JWaWV3KGdldFJvb3RWaWV3KCkuZmluZFZpZXdCeUlkKG1Ecm9wRG93bkFuY2hvcklkKSk7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHdpZHRoU3BlYyA9IG1Ecm9wRG93bldpZHRoOworICAgICAgICAgICAgICAgIG1Qb3B1cC5zZXRBbmNob3JWaWV3KHRoaXMpOwogICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobURyb3BEb3duSGVpZ2h0ID09IFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UKSB7Ci0gICAgICAgICAgICAgICAgLy8gVGhlIGNhbGwgdG8gUG9wdXBXaW5kb3cncyB1cGRhdGUgbWV0aG9kIGJlbG93IGNhbiBhY2NlcHQgLTEgZm9yIGFueQotICAgICAgICAgICAgICAgIC8vIHZhbHVlIHlvdSBkbyBub3Qgd2FudCB0byB1cGRhdGUuCi0gICAgICAgICAgICAgICAgaGVpZ2h0U3BlYyA9IG5vSW5wdXRNZXRob2QgPyBoZWlnaHQgOiBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVDsKLSAgICAgICAgICAgICAgICBpZiAobm9JbnB1dE1ldGhvZCkgewotICAgICAgICAgICAgICAgICAgICBtUG9wdXAuc2V0V2luZG93TGF5b3V0TW9kZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRHJvcERvd25XaWR0aCA9PSBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCA6IDAsIDApOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Qb3B1cC5zZXRXaW5kb3dMYXlvdXRNb2RlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ecm9wRG93bldpZHRoID09IFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UIDogMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChtRHJvcERvd25IZWlnaHQgPT0gVmlld0dyb3VwLkxheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQpIHsKLSAgICAgICAgICAgICAgICBoZWlnaHRTcGVjID0gaGVpZ2h0OwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBoZWlnaHRTcGVjID0gbURyb3BEb3duSGVpZ2h0OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtUG9wdXAuc2V0T3V0c2lkZVRvdWNoYWJsZSghbUZvcmNlSWdub3JlT3V0c2lkZVRvdWNoICYmICFtRHJvcERvd25BbHdheXNWaXNpYmxlKTsKLQotICAgICAgICAgICAgbVBvcHVwLnVwZGF0ZShnZXREcm9wRG93bkFuY2hvclZpZXcoKSwgbURyb3BEb3duSG9yaXpvbnRhbE9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgbURyb3BEb3duVmVydGljYWxPZmZzZXQsIHdpZHRoU3BlYywgaGVpZ2h0U3BlYyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAobURyb3BEb3duV2lkdGggPT0gVmlld0dyb3VwLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQpIHsKLSAgICAgICAgICAgICAgICB3aWR0aFNwZWMgPSBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1Ecm9wRG93bldpZHRoID09IFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuV1JBUF9DT05URU5UKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Qb3B1cC5zZXRXaWR0aChnZXREcm9wRG93bkFuY2hvclZpZXcoKS5nZXRXaWR0aCgpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBtUG9wdXAuc2V0V2lkdGgobURyb3BEb3duV2lkdGgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1Ecm9wRG93bkhlaWdodCA9PSBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCkgewotICAgICAgICAgICAgICAgIGhlaWdodFNwZWMgPSBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1Ecm9wRG93bkhlaWdodCA9PSBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCkgewotICAgICAgICAgICAgICAgICAgICBtUG9wdXAuc2V0SGVpZ2h0KGhlaWdodCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbVBvcHVwLnNldEhlaWdodChtRHJvcERvd25IZWlnaHQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbVBvcHVwLnNldFdpbmRvd0xheW91dE1vZGUod2lkdGhTcGVjLCBoZWlnaHRTcGVjKTsKLSAgICAgICAgICAgIG1Qb3B1cC5zZXRJbnB1dE1ldGhvZE1vZGUoUG9wdXBXaW5kb3cuSU5QVVRfTUVUSE9EX05FRURFRCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIHVzZSBvdXRzaWRlIHRvdWNoYWJsZSB0byBkaXNtaXNzIGRyb3AgZG93biB3aGVuIHRvdWNoaW5nIG91dHNpZGUgb2YgaXQsIHNvCi0gICAgICAgICAgICAvLyBvbmx5IHNldCB0aGlzIGlmIHRoZSBkcm9wZG93biBpcyBub3QgYWx3YXlzIHZpc2libGUKLSAgICAgICAgICAgIG1Qb3B1cC5zZXRPdXRzaWRlVG91Y2hhYmxlKCFtRm9yY2VJZ25vcmVPdXRzaWRlVG91Y2ggJiYgIW1Ecm9wRG93bkFsd2F5c1Zpc2libGUpOwotICAgICAgICAgICAgbVBvcHVwLnNldFRvdWNoSW50ZXJjZXB0b3IobmV3IFBvcHVwVG91Y2hJbnRlcmNlcHRvcigpKTsKLSAgICAgICAgICAgIG1Qb3B1cC5zaG93QXNEcm9wRG93bihnZXREcm9wRG93bkFuY2hvclZpZXcoKSwKLSAgICAgICAgICAgICAgICAgICAgbURyb3BEb3duSG9yaXpvbnRhbE9mZnNldCwgbURyb3BEb3duVmVydGljYWxPZmZzZXQpOwotICAgICAgICAgICAgbURyb3BEb3duTGlzdC5zZXRTZWxlY3Rpb24oTGlzdFZpZXcuSU5WQUxJRF9QT1NJVElPTik7Ci0gICAgICAgICAgICBjbGVhckxpc3RTZWxlY3Rpb24oKTsKLSAgICAgICAgICAgIHBvc3QobUhpZGVTZWxlY3Rvcik7CiAgICAgICAgIH0KKyAgICAgICAgbVBvcHVwLnNob3coKTsKICAgICB9CiAgICAgCiAgICAgLyoqCkBAIC0xMjIwLDE5ICsxMDI4LDEwIEBACiAgICAgICogQGhpZGUgdXNlZCBvbmx5IGJ5IFNlYXJjaERpYWxvZwogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldEZvcmNlSWdub3JlT3V0c2lkZVRvdWNoKGJvb2xlYW4gZm9yY2VJZ25vcmVPdXRzaWRlVG91Y2gpIHsKLSAgICAgICAgbUZvcmNlSWdub3JlT3V0c2lkZVRvdWNoID0gZm9yY2VJZ25vcmVPdXRzaWRlVG91Y2g7CisgICAgICAgIG1Qb3B1cC5zZXRGb3JjZUlnbm9yZU91dHNpZGVUb3VjaChmb3JjZUlnbm9yZU91dHNpZGVUb3VjaCk7CiAgICAgfQotCi0gICAgLyoqCi0gICAgICogPHA+QnVpbGRzIHRoZSBwb3B1cCB3aW5kb3cncyBjb250ZW50IGFuZCByZXR1cm5zIHRoZSBoZWlnaHQgdGhlIHBvcHVwCi0gICAgICogc2hvdWxkIGhhdmUuIFJldHVybnMgLTEgd2hlbiB0aGUgY29udGVudCBhbHJlYWR5IGV4aXN0cy48L3A+Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBjb250ZW50J3MgaGVpZ2h0IG9yIC0xIGlmIGNvbnRlbnQgYWxyZWFkeSBleGlzdHMKLSAgICAgKi8KLSAgICBwcml2YXRlIGludCBidWlsZERyb3BEb3duKCkgewotICAgICAgICBWaWV3R3JvdXAgZHJvcERvd25WaWV3OwotICAgICAgICBpbnQgb3RoZXJIZWlnaHRzID0gMDsKLQorICAgIAorICAgIHByaXZhdGUgdm9pZCBidWlsZEltZUNvbXBsZXRpb25zKCkgewogICAgICAgICBmaW5hbCBMaXN0QWRhcHRlciBhZGFwdGVyID0gbUFkYXB0ZXI7CiAgICAgICAgIGlmIChhZGFwdGVyICE9IG51bGwpIHsKICAgICAgICAgICAgIElucHV0TWV0aG9kTWFuYWdlciBpbW0gPSBJbnB1dE1ldGhvZE1hbmFnZXIucGVla0luc3RhbmNlKCk7CkBAIC0xMjYwLDEzNSArMTA1OSw2IEBACiAgICAgICAgICAgICAgICAgaW1tLmRpc3BsYXlDb21wbGV0aW9ucyh0aGlzLCBjb21wbGV0aW9ucyk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLQotICAgICAgICBpZiAobURyb3BEb3duTGlzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBDb250ZXh0IGNvbnRleHQgPSBnZXRDb250ZXh0KCk7Ci0KLSAgICAgICAgICAgIG1IaWRlU2VsZWN0b3IgPSBuZXcgTGlzdFNlbGVjdG9ySGlkZXIoKTsKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBUaGlzIFJ1bm5hYmxlIGV4aXN0cyBmb3IgdGhlIHNvbGUgcHVycG9zZSBvZiBjaGVja2luZyBpZiB0aGUgdmlldyBsYXlvdXQgaGFzIGdvdAotICAgICAgICAgICAgICogY29tcGxldGVkIGFuZCBpZiBzbyBjYWxsIHNob3dEcm9wRG93biB0byBkaXNwbGF5IHRoZSBkcm9wIGRvd24uIFRoaXMgaXMgdXNlZCB0byBzaG93Ci0gICAgICAgICAgICAgKiB0aGUgZHJvcCBkb3duIGFzIHNvb24gYXMgcG9zc2libGUgYWZ0ZXIgdXNlciBvcGVucyB1cCB0aGUgc2VhcmNoIGRpYWxvZywgd2l0aG91dAotICAgICAgICAgICAgICogd2FpdGluZyBmb3IgdGhlIG5vcm1hbCBVSSBwaXBlbGluZSB0byBkbyBpdCdzIGpvYiB3aGljaCBpcyBzbG93ZXIgdGhhbiB0aGlzIG1ldGhvZC4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgbVNob3dEcm9wRG93blJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gVmlldyBsYXlvdXQgc2hvdWxkIGJlIGFsbCBkb25lIGJlZm9yZSBkaXNwbGF5aW5nIHRoZSBkcm9wIGRvd24uCi0gICAgICAgICAgICAgICAgICAgIFZpZXcgdmlldyA9IGdldERyb3BEb3duQW5jaG9yVmlldygpOwotICAgICAgICAgICAgICAgICAgICBpZiAodmlldyAhPSBudWxsICYmIHZpZXcuZ2V0V2luZG93VG9rZW4oKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzaG93RHJvcERvd24oKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH07Ci0KLSAgICAgICAgICAgIG1Ecm9wRG93bkxpc3QgPSBuZXcgRHJvcERvd25MaXN0Vmlldyhjb250ZXh0KTsKLSAgICAgICAgICAgIG1Ecm9wRG93bkxpc3Quc2V0U2VsZWN0b3IobURyb3BEb3duTGlzdEhpZ2hsaWdodCk7Ci0gICAgICAgICAgICBtRHJvcERvd25MaXN0LnNldEFkYXB0ZXIoYWRhcHRlcik7Ci0gICAgICAgICAgICBtRHJvcERvd25MaXN0LnNldFZlcnRpY2FsRmFkaW5nRWRnZUVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICBtRHJvcERvd25MaXN0LnNldE9uSXRlbUNsaWNrTGlzdGVuZXIobURyb3BEb3duSXRlbUNsaWNrTGlzdGVuZXIpOwotICAgICAgICAgICAgbURyb3BEb3duTGlzdC5zZXRGb2N1c2FibGUodHJ1ZSk7Ci0gICAgICAgICAgICBtRHJvcERvd25MaXN0LnNldEZvY3VzYWJsZUluVG91Y2hNb2RlKHRydWUpOwotICAgICAgICAgICAgbURyb3BEb3duTGlzdC5zZXRPbkl0ZW1TZWxlY3RlZExpc3RlbmVyKG5ldyBBZGFwdGVyVmlldy5Pbkl0ZW1TZWxlY3RlZExpc3RlbmVyKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uSXRlbVNlbGVjdGVkKEFkYXB0ZXJWaWV3PD8+IHBhcmVudCwgVmlldyB2aWV3LAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBvc2l0aW9uLCBsb25nIGlkKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uICE9IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBEcm9wRG93bkxpc3RWaWV3IGRyb3BEb3duTGlzdCA9IG1Ecm9wRG93bkxpc3Q7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkcm9wRG93bkxpc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyb3BEb3duTGlzdC5tTGlzdFNlbGVjdGlvbkhpZGRlbiA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25Ob3RoaW5nU2VsZWN0ZWQoQWRhcHRlclZpZXc8Pz4gcGFyZW50KSB7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICBtRHJvcERvd25MaXN0LnNldE9uU2Nyb2xsTGlzdGVuZXIobmV3IFBvcHVwU2Nyb2xsTGlzdGVuZXIoKSk7Ci0KLSAgICAgICAgICAgIGlmIChtSXRlbVNlbGVjdGVkTGlzdGVuZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1Ecm9wRG93bkxpc3Quc2V0T25JdGVtU2VsZWN0ZWRMaXN0ZW5lcihtSXRlbVNlbGVjdGVkTGlzdGVuZXIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBkcm9wRG93blZpZXcgPSBtRHJvcERvd25MaXN0OwotCi0gICAgICAgICAgICBWaWV3IGhpbnRWaWV3ID0gZ2V0SGludFZpZXcoY29udGV4dCk7Ci0gICAgICAgICAgICBpZiAoaGludFZpZXcgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIGlmIGFuIGhpbnQgaGFzIGJlZW4gc3BlY2lmaWVkLCB3ZSBhY2NvbW9kYXRlIG1vcmUgc3BhY2UgZm9yIGl0IGFuZAotICAgICAgICAgICAgICAgIC8vIGFkZCBhIHRleHQgdmlldyBpbiB0aGUgZHJvcCBkb3duIG1lbnUsIGF0IHRoZSBib3R0b20gb2YgdGhlIGxpc3QKLSAgICAgICAgICAgICAgICBMaW5lYXJMYXlvdXQgaGludENvbnRhaW5lciA9IG5ldyBMaW5lYXJMYXlvdXQoY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgaGludENvbnRhaW5lci5zZXRPcmllbnRhdGlvbihMaW5lYXJMYXlvdXQuVkVSVElDQUwpOwotCi0gICAgICAgICAgICAgICAgTGluZWFyTGF5b3V0LkxheW91dFBhcmFtcyBoaW50UGFyYW1zID0gbmV3IExpbmVhckxheW91dC5MYXlvdXRQYXJhbXMoCi0gICAgICAgICAgICAgICAgICAgICAgICBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCwgMCwgMS4wZgotICAgICAgICAgICAgICAgICk7Ci0gICAgICAgICAgICAgICAgaGludENvbnRhaW5lci5hZGRWaWV3KGRyb3BEb3duVmlldywgaGludFBhcmFtcyk7Ci0gICAgICAgICAgICAgICAgaGludENvbnRhaW5lci5hZGRWaWV3KGhpbnRWaWV3KTsKLQotICAgICAgICAgICAgICAgIC8vIG1lYXN1cmUgdGhlIGhpbnQncyBoZWlnaHQgdG8gZmluZCBob3cgbXVjaCBtb3JlIHZlcnRpY2FsIHNwYWNlCi0gICAgICAgICAgICAgICAgLy8gd2UgbmVlZCB0byBhZGQgdG8gdGhlIGRyb3AgZG93bidzIGhlaWdodAotICAgICAgICAgICAgICAgIGludCB3aWR0aFNwZWMgPSBNZWFzdXJlU3BlYy5tYWtlTWVhc3VyZVNwZWMoZ2V0V2lkdGgoKSwgTWVhc3VyZVNwZWMuQVRfTU9TVCk7Ci0gICAgICAgICAgICAgICAgaW50IGhlaWdodFNwZWMgPSBNZWFzdXJlU3BlYy5VTlNQRUNJRklFRDsKLSAgICAgICAgICAgICAgICBoaW50Vmlldy5tZWFzdXJlKHdpZHRoU3BlYywgaGVpZ2h0U3BlYyk7Ci0KLSAgICAgICAgICAgICAgICBoaW50UGFyYW1zID0gKExpbmVhckxheW91dC5MYXlvdXRQYXJhbXMpIGhpbnRWaWV3LmdldExheW91dFBhcmFtcygpOwotICAgICAgICAgICAgICAgIG90aGVySGVpZ2h0cyA9IGhpbnRWaWV3LmdldE1lYXN1cmVkSGVpZ2h0KCkgKyBoaW50UGFyYW1zLnRvcE1hcmdpbgotICAgICAgICAgICAgICAgICAgICAgICAgKyBoaW50UGFyYW1zLmJvdHRvbU1hcmdpbjsKLQotICAgICAgICAgICAgICAgIGRyb3BEb3duVmlldyA9IGhpbnRDb250YWluZXI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1Qb3B1cC5zZXRDb250ZW50Vmlldyhkcm9wRG93blZpZXcpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZHJvcERvd25WaWV3ID0gKFZpZXdHcm91cCkgbVBvcHVwLmdldENvbnRlbnRWaWV3KCk7Ci0gICAgICAgICAgICBmaW5hbCBWaWV3IHZpZXcgPSBkcm9wRG93blZpZXcuZmluZFZpZXdCeUlkKEhJTlRfVklFV19JRCk7Ci0gICAgICAgICAgICBpZiAodmlldyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTGluZWFyTGF5b3V0LkxheW91dFBhcmFtcyBoaW50UGFyYW1zID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChMaW5lYXJMYXlvdXQuTGF5b3V0UGFyYW1zKSB2aWV3LmdldExheW91dFBhcmFtcygpOwotICAgICAgICAgICAgICAgIG90aGVySGVpZ2h0cyA9IHZpZXcuZ2V0TWVhc3VyZWRIZWlnaHQoKSArIGhpbnRQYXJhbXMudG9wTWFyZ2luCi0gICAgICAgICAgICAgICAgICAgICAgICArIGhpbnRQYXJhbXMuYm90dG9tTWFyZ2luOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gTWF4IGhlaWdodCBhdmFpbGFibGUgb24gdGhlIHNjcmVlbiBmb3IgYSBwb3B1cC4KLSAgICAgICAgYm9vbGVhbiBpZ25vcmVCb3R0b21EZWNvcmF0aW9ucyA9Ci0gICAgICAgICAgICAgICAgbVBvcHVwLmdldElucHV0TWV0aG9kTW9kZSgpID09IFBvcHVwV2luZG93LklOUFVUX01FVEhPRF9OT1RfTkVFREVEOwotICAgICAgICBmaW5hbCBpbnQgbWF4SGVpZ2h0ID0gbVBvcHVwLmdldE1heEF2YWlsYWJsZUhlaWdodCgKLSAgICAgICAgICAgICAgICBnZXREcm9wRG93bkFuY2hvclZpZXcoKSwgbURyb3BEb3duVmVydGljYWxPZmZzZXQsIGlnbm9yZUJvdHRvbURlY29yYXRpb25zKTsKLQotICAgICAgICAvLyBnZXRNYXhBdmFpbGFibGVIZWlnaHQoKSBzdWJ0cmFjdHMgdGhlIHBhZGRpbmcsIHNvIHdlIHB1dCBpdCBiYWNrLAotICAgICAgICAvLyB0byBnZXQgdGhlIGF2YWlsYWJsZSBoZWlnaHQgZm9yIHRoZSB3aG9sZSB3aW5kb3cKLSAgICAgICAgaW50IHBhZGRpbmcgPSAwOwotICAgICAgICBEcmF3YWJsZSBiYWNrZ3JvdW5kID0gbVBvcHVwLmdldEJhY2tncm91bmQoKTsKLSAgICAgICAgaWYgKGJhY2tncm91bmQgIT0gbnVsbCkgewotICAgICAgICAgICAgYmFja2dyb3VuZC5nZXRQYWRkaW5nKG1UZW1wUmVjdCk7Ci0gICAgICAgICAgICBwYWRkaW5nID0gbVRlbXBSZWN0LnRvcCArIG1UZW1wUmVjdC5ib3R0b207Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobURyb3BEb3duQWx3YXlzVmlzaWJsZSB8fCBtRHJvcERvd25IZWlnaHQgPT0gVmlld0dyb3VwLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQpIHsKLSAgICAgICAgICAgIHJldHVybiBtYXhIZWlnaHQgKyBwYWRkaW5nOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgaW50IGxpc3RDb250ZW50ID0gbURyb3BEb3duTGlzdC5tZWFzdXJlSGVpZ2h0T2ZDaGlsZHJlbihNZWFzdXJlU3BlYy5VTlNQRUNJRklFRCwKLSAgICAgICAgICAgICAgICAwLCBMaXN0Vmlldy5OT19QT1NJVElPTiwgbWF4SGVpZ2h0IC0gb3RoZXJIZWlnaHRzLCAyKTsKLSAgICAgICAgLy8gYWRkIHBhZGRpbmcgb25seSBpZiB0aGUgbGlzdCBoYXMgaXRlbXMgaW4gaXQsIHRoYXQgd2F5IHdlIGRvbid0IHNob3cKLSAgICAgICAgLy8gdGhlIHBvcHVwIGlmIGl0IGlzIG5vdCBuZWVkZWQKLSAgICAgICAgaWYgKGxpc3RDb250ZW50ID4gMCkgb3RoZXJIZWlnaHRzICs9IHBhZGRpbmc7Ci0KLSAgICAgICAgcmV0dXJuIGxpc3RDb250ZW50ICsgb3RoZXJIZWlnaHRzOwotICAgIH0KLQotICAgIHByaXZhdGUgVmlldyBnZXRIaW50VmlldyhDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgaWYgKG1IaW50VGV4dCAhPSBudWxsICYmIG1IaW50VGV4dC5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgIGZpbmFsIFRleHRWaWV3IGhpbnRWaWV3ID0gKFRleHRWaWV3KSBMYXlvdXRJbmZsYXRlci5mcm9tKGNvbnRleHQpLmluZmxhdGUoCi0gICAgICAgICAgICAgICAgICAgIG1IaW50UmVzb3VyY2UsIG51bGwpLmZpbmRWaWV3QnlJZChjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmlkLnRleHQxKTsKLSAgICAgICAgICAgIGhpbnRWaWV3LnNldFRleHQobUhpbnRUZXh0KTsKLSAgICAgICAgICAgIGhpbnRWaWV3LnNldElkKEhJTlRfVklFV19JRCk7Ci0gICAgICAgICAgICByZXR1cm4gaGludFZpZXc7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgpAQCAtMTQ0MCw0NyArMTExMCw2IEBACiAgICAgICAgIHJldHVybiBtRmlsdGVyOwogICAgIH0KIAotICAgIHByaXZhdGUgY2xhc3MgTGlzdFNlbGVjdG9ySGlkZXIgaW1wbGVtZW50cyBSdW5uYWJsZSB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgIGNsZWFyTGlzdFNlbGVjdGlvbigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBjbGFzcyBSZXNpemVQb3B1cFJ1bm5hYmxlIGltcGxlbWVudHMgUnVubmFibGUgewotICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICBtUG9wdXAuc2V0SW5wdXRNZXRob2RNb2RlKFBvcHVwV2luZG93LklOUFVUX01FVEhPRF9OT1RfTkVFREVEKTsKLSAgICAgICAgICAgIHNob3dEcm9wRG93bigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBjbGFzcyBQb3B1cFRvdWNoSW50ZXJjZXB0b3IgaW1wbGVtZW50cyBPblRvdWNoTGlzdGVuZXIgewotICAgICAgICBwdWJsaWMgYm9vbGVhbiBvblRvdWNoKFZpZXcgdiwgTW90aW9uRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgIGZpbmFsIGludCBhY3Rpb24gPSBldmVudC5nZXRBY3Rpb24oKTsKLSAgICAgICAgICAgIGlmIChhY3Rpb24gPT0gTW90aW9uRXZlbnQuQUNUSU9OX0RPV04gJiYKLSAgICAgICAgICAgICAgICAgICAgbVBvcHVwICE9IG51bGwgJiYgbVBvcHVwLmlzU2hvd2luZygpKSB7Ci0gICAgICAgICAgICAgICAgcG9zdERlbGF5ZWQobVJlc2l6ZVBvcHVwUnVubmFibGUsIEVYUEFORF9MSVNUX1RJTUVPVVQpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24gPT0gTW90aW9uRXZlbnQuQUNUSU9OX1VQKSB7Ci0gICAgICAgICAgICAgICAgcmVtb3ZlQ2FsbGJhY2tzKG1SZXNpemVQb3B1cFJ1bm5hYmxlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIGNsYXNzIFBvcHVwU2Nyb2xsTGlzdGVuZXIgaW1wbGVtZW50cyBMaXN0Vmlldy5PblNjcm9sbExpc3RlbmVyIHsKLSAgICAgICAgcHVibGljIHZvaWQgb25TY3JvbGwoQWJzTGlzdFZpZXcgdmlldywgaW50IGZpcnN0VmlzaWJsZUl0ZW0sIGludCB2aXNpYmxlSXRlbUNvdW50LAotICAgICAgICAgICAgICAgIGludCB0b3RhbEl0ZW1Db3VudCkgewotCi0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBvblNjcm9sbFN0YXRlQ2hhbmdlZChBYnNMaXN0VmlldyB2aWV3LCBpbnQgc2Nyb2xsU3RhdGUpIHsKLSAgICAgICAgICAgIGlmIChzY3JvbGxTdGF0ZSA9PSBTQ1JPTExfU1RBVEVfVE9VQ0hfU0NST0xMICYmCi0gICAgICAgICAgICAgICAgICAgICFpc0lucHV0TWV0aG9kTm90TmVlZGVkKCkgJiYgbVBvcHVwLmdldENvbnRlbnRWaWV3KCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJlbW92ZUNhbGxiYWNrcyhtUmVzaXplUG9wdXBSdW5uYWJsZSk7Ci0gICAgICAgICAgICAgICAgbVJlc2l6ZVBvcHVwUnVubmFibGUucnVuKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KICAgICBwcml2YXRlIGNsYXNzIERyb3BEb3duSXRlbUNsaWNrTGlzdGVuZXIgaW1wbGVtZW50cyBBZGFwdGVyVmlldy5Pbkl0ZW1DbGlja0xpc3RlbmVyIHsKICAgICAgICAgcHVibGljIHZvaWQgb25JdGVtQ2xpY2soQWRhcHRlclZpZXcgcGFyZW50LCBWaWV3IHYsIGludCBwb3NpdGlvbiwgbG9uZyBpZCkgewogICAgICAgICAgICAgcGVyZm9ybUNvbXBsZXRpb24odiwgcG9zaXRpb24sIGlkKTsKQEAgLTE0ODgsMTIzICsxMTE3LDYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiA8cD5XcmFwcGVyIGNsYXNzIGZvciBhIExpc3RWaWV3LiBUaGlzIHdyYXBwZXIgaGlqYWNrcyB0aGUgZm9jdXMgdG8KLSAgICAgKiBtYWtlIHN1cmUgdGhlIGxpc3QgdXNlcyB0aGUgYXBwcm9wcmlhdGUgZHJhd2FibGVzIGFuZCBzdGF0ZXMgd2hlbgotICAgICAqIGRpc3BsYXllZCBvbiBzY3JlZW4gd2l0aGluIGEgZHJvcCBkb3duLiBUaGUgZm9jdXMgaXMgbmV2ZXIgYWN0dWFsbHkKLSAgICAgKiBwYXNzZWQgdG8gdGhlIGRyb3AgZG93bjsgdGhlIGxpc3Qgb25seSBsb29rcyBmb2N1c2VkLjwvcD4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBEcm9wRG93bkxpc3RWaWV3IGV4dGVuZHMgTGlzdFZpZXcgewotICAgICAgICAvKgotICAgICAgICAgKiBXQVJOSU5HOiBUaGlzIGlzIGEgd29ya2Fyb3VuZCBmb3IgYSB0b3VjaCBtb2RlIGlzc3VlLgotICAgICAgICAgKgotICAgICAgICAgKiBUb3VjaCBtb2RlIGlzIHByb3BhZ2F0ZWQgbGF6aWx5IHRvIHdpbmRvd3MuIFRoaXMgY2F1c2VzIHByb2JsZW1zIGluCi0gICAgICAgICAqIHRoZSBmb2xsb3dpbmcgc2NlbmFyaW86Ci0gICAgICAgICAqIC0gVHlwZSBzb21ldGhpbmcgaW4gdGhlIEF1dG9Db21wbGV0ZVRleHRWaWV3IGFuZCBnZXQgc29tZSByZXN1bHRzCi0gICAgICAgICAqIC0gTW92ZSBkb3duIHdpdGggdGhlIGQtcGFkIHRvIHNlbGVjdCBhbiBpdGVtIGluIHRoZSBsaXN0Ci0gICAgICAgICAqIC0gTW92ZSB1cCB3aXRoIHRoZSBkLXBhZCB1bnRpbCB0aGUgc2VsZWN0aW9uIGRpc2FwcGVhcnMKLSAgICAgICAgICogLSBUeXBlIG1vcmUgdGV4dCBpbiB0aGUgQXV0b0NvbXBsZXRlVGV4dFZpZXcgKnVzaW5nIHRoZSBzb2Z0IGtleWJvYXJkKgotICAgICAgICAgKiAgIGFuZCBnZXQgbmV3IHJlc3VsdHM7IHlvdSBhcmUgbm93IGluIHRvdWNoIG1vZGUKLSAgICAgICAgICogLSBUaGUgc2VsZWN0aW9uIGNvbWVzIGJhY2sgb24gdGhlIGZpcnN0IGl0ZW0gaW4gdGhlIGxpc3QsIGV2ZW4gdGhvdWdoCi0gICAgICAgICAqICAgdGhlIGxpc3QgaXMgc3VwcG9zZWQgdG8gYmUgaW4gdG91Y2ggbW9kZQotICAgICAgICAgKgotICAgICAgICAgKiBVc2luZyB0aGUgc29mdCBrZXlib2FyZCB0cmlnZ2VycyB0aGUgdG91Y2ggbW9kZSBjaGFuZ2UgYnV0IHRoYXQgY2hhbmdlCi0gICAgICAgICAqIGlzIHByb3BhZ2F0ZWQgdG8gb3VyIHdpbmRvdyBvbmx5IGFmdGVyIHRoZSBmaXJzdCBsaXN0IGxheW91dCwgdGhlcmVmb3JlCi0gICAgICAgICAqIGFmdGVyIHRoZSBsaXN0IGF0dGVtcHRzIHRvIHJlc3VycmVjdCB0aGUgc2VsZWN0aW9uLgotICAgICAgICAgKgotICAgICAgICAgKiBUaGUgdHJpY2sgdG8gd29yayBhcm91bmQgdGhpcyBpc3N1ZSBpcyB0byBwcmV0ZW5kIHRoZSBsaXN0IGlzIGluIHRvdWNoCi0gICAgICAgICAqIG1vZGUgd2hlbiB3ZSBrbm93IHRoYXQgdGhlIHNlbGVjdGlvbiBzaG91bGQgbm90IGFwcGVhciwgdGhhdCBpcyB3aGVuCi0gICAgICAgICAqIHdlIGtub3cgdGhlIHVzZXIgbW92ZWQgdGhlIHNlbGVjdGlvbiBhd2F5IGZyb20gdGhlIGxpc3QuCi0gICAgICAgICAqCi0gICAgICAgICAqIFRoaXMgYm9vbGVhbiBpcyBzZXQgdG8gdHJ1ZSB3aGVuZXZlciB3ZSBleHBsaWNpdGVseSBoaWRlIHRoZSBsaXN0J3MKLSAgICAgICAgICogc2VsZWN0aW9uIGFuZCByZXNldCB0byBmYWxzZSB3aGVudmVyIHdlIGtub3cgdGhlIHVzZXIgbW92ZWQgdGhlCi0gICAgICAgICAqIHNlbGVjdGlvbiBiYWNrIHRvIHRoZSBsaXN0LgotICAgICAgICAgKgotICAgICAgICAgKiBXaGVuIHRoaXMgYm9vbGVhbiBpcyB0cnVlLCBpc0luVG91Y2hNb2RlKCkgcmV0dXJucyB0cnVlLCBvdGhlcndpc2UgaXQKLSAgICAgICAgICogcmV0dXJucyBzdXBlci5pc0luVG91Y2hNb2RlKCkuCi0gICAgICAgICAqLwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gbUxpc3RTZWxlY3Rpb25IaWRkZW47Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIDxwPkNyZWF0ZXMgYSBuZXcgbGlzdCB2aWV3IHdyYXBwZXIuPC9wPgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gY29udGV4dCB0aGlzIHZpZXcncyBjb250ZXh0Ci0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgRHJvcERvd25MaXN0VmlldyhDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgICAgIHN1cGVyKGNvbnRleHQsIG51bGwsIGNvbS5hbmRyb2lkLmludGVybmFsLlIuYXR0ci5kcm9wRG93bkxpc3RWaWV3U3R5bGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIDxwPkF2b2lkcyBqYXJyaW5nIHNjcm9sbGluZyBlZmZlY3QgYnkgZW5zdXJpbmcgdGhhdCBsaXN0IGVsZW1lbnRzCi0gICAgICAgICAqIG1hZGUgb2YgYSB0ZXh0IHZpZXcgZml0IG9uIGEgc2luZ2xlIGxpbmUuPC9wPgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gcG9zaXRpb24gdGhlIGl0ZW0gaW5kZXggaW4gdGhlIGxpc3QgdG8gZ2V0IGEgdmlldyBmb3IKLSAgICAgICAgICogQHJldHVybiB0aGUgdmlldyBmb3IgdGhlIHNwZWNpZmllZCBpdGVtCi0gICAgICAgICAqLwotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgVmlldyBvYnRhaW5WaWV3KGludCBwb3NpdGlvbiwgYm9vbGVhbltdIGlzU2NyYXApIHsKLSAgICAgICAgICAgIFZpZXcgdmlldyA9IHN1cGVyLm9idGFpblZpZXcocG9zaXRpb24sIGlzU2NyYXApOwotCi0gICAgICAgICAgICBpZiAodmlldyBpbnN0YW5jZW9mIFRleHRWaWV3KSB7Ci0gICAgICAgICAgICAgICAgKChUZXh0Vmlldykgdmlldykuc2V0SG9yaXpvbnRhbGx5U2Nyb2xsaW5nKHRydWUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gdmlldzsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0luVG91Y2hNb2RlKCkgewotICAgICAgICAgICAgLy8gV0FSTklORzogUGxlYXNlIHJlYWQgdGhlIGNvbW1lbnQgd2hlcmUgbUxpc3RTZWxlY3Rpb25IaWRkZW4gaXMgZGVjbGFyZWQKLSAgICAgICAgICAgIHJldHVybiBtTGlzdFNlbGVjdGlvbkhpZGRlbiB8fCBzdXBlci5pc0luVG91Y2hNb2RlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogPHA+UmV0dXJucyB0aGUgZm9jdXMgc3RhdGUgaW4gdGhlIGRyb3AgZG93bi48L3A+Ci0gICAgICAgICAqCi0gICAgICAgICAqIEByZXR1cm4gdHJ1ZSBhbHdheXMKLSAgICAgICAgICovCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNXaW5kb3dGb2N1cygpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIDxwPlJldHVybnMgdGhlIGZvY3VzIHN0YXRlIGluIHRoZSBkcm9wIGRvd24uPC9wPgotICAgICAgICAgKgotICAgICAgICAgKiBAcmV0dXJuIHRydWUgYWx3YXlzCi0gICAgICAgICAqLwotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNGb2N1c2VkKCkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogPHA+UmV0dXJucyB0aGUgZm9jdXMgc3RhdGUgaW4gdGhlIGRyb3AgZG93bi48L3A+Ci0gICAgICAgICAqCi0gICAgICAgICAqIEByZXR1cm4gdHJ1ZSBhbHdheXMKLSAgICAgICAgICovCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNGb2N1cygpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwcm90ZWN0ZWQgaW50W10gb25DcmVhdGVEcmF3YWJsZVN0YXRlKGludCBleHRyYVNwYWNlKSB7Ci0gICAgICAgICAgICBpbnRbXSByZXMgPSBzdXBlci5vbkNyZWF0ZURyYXdhYmxlU3RhdGUoZXh0cmFTcGFjZSk7Ci0gICAgICAgICAgICAvL25vaW5zcGVjdGlvbiBDb25zdGFudElmU3RhdGVtZW50Ci0gICAgICAgICAgICBpZiAoZmFsc2UpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoIkNyZWF0ZWQgZHJhd2FibGUgc3RhdGU6IFsiKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8cmVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpID4gMCkgc2IuYXBwZW5kKCIsICIpOwotICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIjB4Iik7Ci0gICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZChJbnRlZ2VyLnRvSGV4U3RyaW5nKHJlc1tpXSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIl0iKTsKLSAgICAgICAgICAgICAgICBMb2cuaShUQUcsIHNiLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHJlczsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgogICAgICAqIFRoaXMgaW50ZXJmYWNlIGlzIHVzZWQgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIHRleHQgZW50ZXJlZCBpbiB0aGlzIFRleHRWaWV3IGNvbXBsaWVzIHRvCiAgICAgICogYSBjZXJ0YWluIGZvcm1hdC4gIFNpbmNlIHRoZXJlIGlzIG5vIGZvb2xwcm9vZiB3YXkgdG8gcHJldmVudCB0aGUgdXNlciBmcm9tIGxlYXZpbmcKICAgICAgKiB0aGlzIFZpZXcgd2l0aCBhbiBpbmNvcnJlY3QgdmFsdWUgaW4gaXQsIGFsbCB3ZSBjYW4gZG8gaXMgdHJ5IHRvIGZpeCBpdCBvdXJzZWx2ZXMKQEAgLTE2NTIsMTAgKzExNjQsNyBAQAogICAgIHByaXZhdGUgY2xhc3MgUG9wdXBEYXRhU2V0T2JzZXJ2ZXIgZXh0ZW5kcyBEYXRhU2V0T2JzZXJ2ZXIgewogICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIHZvaWQgb25DaGFuZ2VkKCkgewotICAgICAgICAgICAgaWYgKGlzUG9wdXBTaG93aW5nKCkpIHsKLSAgICAgICAgICAgICAgICAvLyBUaGlzIHdpbGwgcmVzaXplIHRoZSBwb3B1cCB0byBmaXQgdGhlIG5ldyBhZGFwdGVyJ3MgY29udGVudAotICAgICAgICAgICAgICAgIHNob3dEcm9wRG93bigpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChtQWRhcHRlciAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAobUFkYXB0ZXIgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIC8vIElmIHRoZSBwb3B1cCBpcyBub3Qgc2hvd2luZyBhbHJlYWR5LCBzaG93aW5nIGl0IHdpbGwgY2F1c2UKICAgICAgICAgICAgICAgICAvLyB0aGUgbGlzdCBvZiBkYXRhIHNldCBvYnNlcnZlcnMgYXR0YWNoZWQgdG8gdGhlIGFkYXB0ZXIgdG8KICAgICAgICAgICAgICAgICAvLyBjaGFuZ2UuIFdlIGNhbid0IGRvIGl0IGZyb20gaGVyZSwgYmVjYXVzZSB3ZSBhcmUgaW4gdGhlIG1pZGRsZQpAQCAtMTY3MCwxNCArMTE3OSw1IEBACiAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25JbnZhbGlkYXRlZCgpIHsKLSAgICAgICAgICAgIGlmICghbURyb3BEb3duQWx3YXlzVmlzaWJsZSkgewotICAgICAgICAgICAgICAgIC8vIFRoZXJlJ3Mgbm8gZGF0YSB0byBkaXNwbGF5IHNvIG1ha2Ugc3VyZSB3ZSdyZSBub3Qgc2hvd2luZwotICAgICAgICAgICAgICAgIC8vIHRoZSBkcm9wIGRvd24gYW5kIGl0cyBsaXN0Ci0gICAgICAgICAgICAgICAgZGlzbWlzc0Ryb3BEb3duKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KICAgICB9CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvQ3Vyc29yQWRhcHRlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0N1cnNvckFkYXB0ZXIuamF2YQppbmRleCBiYWE2ODMzLi40Y2Y4Nzg1IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvQ3Vyc29yQWRhcHRlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9DdXJzb3JBZGFwdGVyLmphdmEKQEAgLTgwLDYgKzgwLDE4IEBACiAgICAgcHJvdGVjdGVkIEZpbHRlclF1ZXJ5UHJvdmlkZXIgbUZpbHRlclF1ZXJ5UHJvdmlkZXI7CiAKICAgICAvKioKKyAgICAgKiBJZiBzZXQgdGhlIGFkYXB0ZXIgd2lsbCBjYWxsIHJlcXVlcnkoKSBvbiB0aGUgY3Vyc29yIHdoZW5ldmVyIGEgY29udGVudCBjaGFuZ2UKKyAgICAgKiBub3RpZmljYXRpb24gaXMgZGVsaXZlcmVkLiBJbXBsaWVzIHtAbGluayAjRkxBR19SRUdJU1RFUl9DT05URU5UX09CU0VSVkVSfQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMQUdfQVVUT19SRVFVRVJZID0gMHgwMTsKKworICAgIC8qKgorICAgICAqIElmIHNldCB0aGUgYWRhcHRlciB3aWxsIHJlZ2lzdGVyIGEgY29udGVudCBvYnNlcnZlciBvbiB0aGUgY3Vyc29yIGFuZCB3aWxsIGNhbGwKKyAgICAgKiB7QGxpbmsgI29uQ29udGVudENoYW5nZWQoKX0gd2hlbiBhIG5vdGlmaWNhdGlvbiBjb21lcyBpbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGTEFHX1JFR0lTVEVSX0NPTlRFTlRfT0JTRVJWRVIgPSAweDAyOworCisgICAgLyoqCiAgICAgICogQ29uc3RydWN0b3IuIFRoZSBhZGFwdGVyIHdpbGwgY2FsbCByZXF1ZXJ5KCkgb24gdGhlIGN1cnNvciB3aGVuZXZlcgogICAgICAqIGl0IGNoYW5nZXMgc28gdGhhdCB0aGUgbW9zdCByZWNlbnQgZGF0YSBpcyBhbHdheXMgZGlzcGxheWVkLgogICAgICAqCkBAIC04Nyw3ICs5OSw3IEBACiAgICAgICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQKICAgICAgKi8KICAgICBwdWJsaWMgQ3Vyc29yQWRhcHRlcihDb250ZXh0IGNvbnRleHQsIEN1cnNvciBjKSB7Ci0gICAgICAgIGluaXQoY29udGV4dCwgYywgdHJ1ZSk7CisgICAgICAgIGluaXQoY29udGV4dCwgYywgRkxBR19BVVRPX1JFUVVFUlkpOwogICAgIH0KIAogICAgIC8qKgpAQCAtOTksMTkgKzExMSw0MyBAQAogICAgICAqICAgICAgICAgICAgICAgICAgICBkYXRhIGlzIGFsd2F5cyBkaXNwbGF5ZWQuCiAgICAgICovCiAgICAgcHVibGljIEN1cnNvckFkYXB0ZXIoQ29udGV4dCBjb250ZXh0LCBDdXJzb3IgYywgYm9vbGVhbiBhdXRvUmVxdWVyeSkgewotICAgICAgICBpbml0KGNvbnRleHQsIGMsIGF1dG9SZXF1ZXJ5KTsKKyAgICAgICAgaW5pdChjb250ZXh0LCBjLCBhdXRvUmVxdWVyeSA/IEZMQUdfQVVUT19SRVFVRVJZIDogRkxBR19SRUdJU1RFUl9DT05URU5UX09CU0VSVkVSKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvcgorICAgICAqIEBwYXJhbSBjIFRoZSBjdXJzb3IgZnJvbSB3aGljaCB0byBnZXQgdGhlIGRhdGEuCisgICAgICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQKKyAgICAgKiBAcGFyYW0gZmxhZ3MgZmxhZ3MgdXNlZCB0byBkZXRlcm1pbmUgdGhlIGJlaGF2aW9yIG9mIHRoZSBhZGFwdGVyCisgICAgICovCisgICAgcHVibGljIEN1cnNvckFkYXB0ZXIoQ29udGV4dCBjb250ZXh0LCBDdXJzb3IgYywgaW50IGZsYWdzKSB7CisgICAgICAgIGluaXQoY29udGV4dCwgYywgZmxhZ3MpOwogICAgIH0KIAogICAgIHByb3RlY3RlZCB2b2lkIGluaXQoQ29udGV4dCBjb250ZXh0LCBDdXJzb3IgYywgYm9vbGVhbiBhdXRvUmVxdWVyeSkgeworICAgICAgICBpbml0KGNvbnRleHQsIGMsIGF1dG9SZXF1ZXJ5ID8gRkxBR19BVVRPX1JFUVVFUlkgOiBGTEFHX1JFR0lTVEVSX0NPTlRFTlRfT0JTRVJWRVIpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGluaXQoQ29udGV4dCBjb250ZXh0LCBDdXJzb3IgYywgaW50IGZsYWdzKSB7CisgICAgICAgIGlmICgoZmxhZ3MgJiBGTEFHX0FVVE9fUkVRVUVSWSkgPT0gRkxBR19BVVRPX1JFUVVFUlkpIHsKKyAgICAgICAgICAgIGZsYWdzIHw9IEZMQUdfUkVHSVNURVJfQ09OVEVOVF9PQlNFUlZFUjsKKyAgICAgICAgICAgIG1BdXRvUmVxdWVyeSA9IHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtQXV0b1JlcXVlcnkgPSBmYWxzZTsKKyAgICAgICAgfQogICAgICAgICBib29sZWFuIGN1cnNvclByZXNlbnQgPSBjICE9IG51bGw7Ci0gICAgICAgIG1BdXRvUmVxdWVyeSA9IGF1dG9SZXF1ZXJ5OwogICAgICAgICBtQ3Vyc29yID0gYzsKICAgICAgICAgbURhdGFWYWxpZCA9IGN1cnNvclByZXNlbnQ7CiAgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKICAgICAgICAgbVJvd0lEQ29sdW1uID0gY3Vyc29yUHJlc2VudCA/IGMuZ2V0Q29sdW1uSW5kZXhPclRocm93KCJfaWQiKSA6IC0xOwotICAgICAgICBtQ2hhbmdlT2JzZXJ2ZXIgPSBuZXcgQ2hhbmdlT2JzZXJ2ZXIoKTsKKyAgICAgICAgaWYgKChmbGFncyAmIEZMQUdfUkVHSVNURVJfQ09OVEVOVF9PQlNFUlZFUikgPT0gRkxBR19SRUdJU1RFUl9DT05URU5UX09CU0VSVkVSKSB7CisgICAgICAgICAgICBtQ2hhbmdlT2JzZXJ2ZXIgPSBuZXcgQ2hhbmdlT2JzZXJ2ZXIoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1DaGFuZ2VPYnNlcnZlciA9IG51bGw7CisgICAgICAgIH0KKwogICAgICAgICBpZiAoY3Vyc29yUHJlc2VudCkgewotICAgICAgICAgICAgYy5yZWdpc3RlckNvbnRlbnRPYnNlcnZlcihtQ2hhbmdlT2JzZXJ2ZXIpOworICAgICAgICAgICAgaWYgKG1DaGFuZ2VPYnNlcnZlciAhPSBudWxsKSBjLnJlZ2lzdGVyQ29udGVudE9ic2VydmVyKG1DaGFuZ2VPYnNlcnZlcik7CiAgICAgICAgICAgICBjLnJlZ2lzdGVyRGF0YVNldE9ic2VydmVyKG1EYXRhU2V0T2JzZXJ2ZXIpOwogICAgICAgICB9CiAgICAgfQpAQCAtMjQ2LDEzICsyODIsMTMgQEAKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogICAgICAgICBpZiAobUN1cnNvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtQ3Vyc29yLnVucmVnaXN0ZXJDb250ZW50T2JzZXJ2ZXIobUNoYW5nZU9ic2VydmVyKTsKKyAgICAgICAgICAgIGlmIChtQ2hhbmdlT2JzZXJ2ZXIgIT0gbnVsbCkgbUN1cnNvci51bnJlZ2lzdGVyQ29udGVudE9ic2VydmVyKG1DaGFuZ2VPYnNlcnZlcik7CiAgICAgICAgICAgICBtQ3Vyc29yLnVucmVnaXN0ZXJEYXRhU2V0T2JzZXJ2ZXIobURhdGFTZXRPYnNlcnZlcik7CiAgICAgICAgICAgICBtQ3Vyc29yLmNsb3NlKCk7CiAgICAgICAgIH0KICAgICAgICAgbUN1cnNvciA9IGN1cnNvcjsKICAgICAgICAgaWYgKGN1cnNvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBjdXJzb3IucmVnaXN0ZXJDb250ZW50T2JzZXJ2ZXIobUNoYW5nZU9ic2VydmVyKTsKKyAgICAgICAgICAgIGlmIChtQ2hhbmdlT2JzZXJ2ZXIgIT0gbnVsbCkgY3Vyc29yLnJlZ2lzdGVyQ29udGVudE9ic2VydmVyKG1DaGFuZ2VPYnNlcnZlcik7CiAgICAgICAgICAgICBjdXJzb3IucmVnaXN0ZXJEYXRhU2V0T2JzZXJ2ZXIobURhdGFTZXRPYnNlcnZlcik7CiAgICAgICAgICAgICBtUm93SURDb2x1bW4gPSBjdXJzb3IuZ2V0Q29sdW1uSW5kZXhPclRocm93KCJfaWQiKTsKICAgICAgICAgICAgIG1EYXRhVmFsaWQgPSB0cnVlOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0dhbGxlcnkuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9HYWxsZXJ5LmphdmEKaW5kZXggMWVkNmIxNi4uYzQ3MjkyZiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0dhbGxlcnkuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvR2FsbGVyeS5qYXZhCkBAIC0xMjA3LDcgKzEyMDcsNyBAQAogCiAgICAgICAgIC8vIFdlIHVuZm9jdXMgdGhlIG9sZCBjaGlsZCBkb3duIGhlcmUgc28gdGhlIGFib3ZlIGhhc0ZvY3VzIGNoZWNrCiAgICAgICAgIC8vIHJldHVybnMgdHJ1ZQotICAgICAgICBpZiAob2xkU2VsZWN0ZWRDaGlsZCAhPSBudWxsKSB7CisgICAgICAgIGlmIChvbGRTZWxlY3RlZENoaWxkICE9IG51bGwgJiYgb2xkU2VsZWN0ZWRDaGlsZCAhPSBjaGlsZCkgewogCiAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgaXRzIGRyYXdhYmxlIHN0YXRlIGRvZXNuJ3QgY29udGFpbiAnc2VsZWN0ZWQnCiAgICAgICAgICAgICBvbGRTZWxlY3RlZENoaWxkLnNldFNlbGVjdGVkKGZhbHNlKTsKQEAgLTEyNjMsNiArMTI2Myw3IEBACiAgICAgICAgICAqLwogICAgICAgICBpZiAoZ2FpbkZvY3VzICYmIG1TZWxlY3RlZENoaWxkICE9IG51bGwpIHsKICAgICAgICAgICAgIG1TZWxlY3RlZENoaWxkLnJlcXVlc3RGb2N1cyhkaXJlY3Rpb24pOworICAgICAgICAgICAgbVNlbGVjdGVkQ2hpbGQuc2V0U2VsZWN0ZWQodHJ1ZSk7CiAgICAgICAgIH0KIAogICAgIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9HcmlkVmlldy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0dyaWRWaWV3LmphdmEKaW5kZXggZDI4MjlkYi4uZmU2OWExMyAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0dyaWRWaWV3LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0dyaWRWaWV3LmphdmEKQEAgLTIzLDYgKzIzLDcgQEAKIGltcG9ydCBhbmRyb2lkLnZpZXcuR3Jhdml0eTsKIGltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdEZWJ1ZzsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOwogaW1wb3J0IGFuZHJvaWQudmlldy5Tb3VuZEVmZmVjdENvbnN0YW50czsKIGltcG9ydCBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkdyaWRMYXlvdXRBbmltYXRpb25Db250cm9sbGVyOwpAQCAtMTEyLDcgKzExMyw3IEBACiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgc2V0QWRhcHRlcihMaXN0QWRhcHRlciBhZGFwdGVyKSB7Ci0gICAgICAgIGlmIChudWxsICE9IG1BZGFwdGVyKSB7CisgICAgICAgIGlmIChtQWRhcHRlciAhPSBudWxsICYmIG1EYXRhU2V0T2JzZXJ2ZXIgIT0gbnVsbCkgewogICAgICAgICAgICAgbUFkYXB0ZXIudW5yZWdpc3RlckRhdGFTZXRPYnNlcnZlcihtRGF0YVNldE9ic2VydmVyKTsKICAgICAgICAgfQogCkBAIC0xNzc0LDYgKzE3NzUsMTkgQEAKICAgICAgICAgICAgIHJlcXVlc3RMYXlvdXRJZk5lY2Vzc2FyeSgpOwogICAgICAgICB9CiAgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEdldCB0aGUgbnVtYmVyIG9mIGNvbHVtbnMgaW4gdGhlIGdyaWQuIAorICAgICAqIFJldHVybnMge0BsaW5rICNBVVRPX0ZJVH0gaWYgdGhlIEdyaWQgaGFzIG5ldmVyIGJlZW4gbGFpZCBvdXQuCisgICAgICoKKyAgICAgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNHcmlkVmlld19udW1Db2x1bW5zCisgICAgICogCisgICAgICogQHNlZSAjc2V0TnVtQ29sdW1ucyhpbnQpCisgICAgICovCisgICAgQFZpZXdEZWJ1Zy5FeHBvcnRlZFByb3BlcnR5CisgICAgcHVibGljIGludCBnZXROdW1Db2x1bW5zKCkgeyAgCisgICAgICAgIHJldHVybiBtTnVtQ29sdW1uczsKKyAgICB9CiAKICAgICAvKioKICAgICAgKiBNYWtlIHN1cmUgdmlld3MgYXJlIHRvdWNoaW5nIHRoZSB0b3Agb3IgYm90dG9tIGVkZ2UsIGFzIGFwcHJvcHJpYXRlIGZvcgpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0xpbmVhckxheW91dC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0xpbmVhckxheW91dC5qYXZhCmluZGV4IGJkMDdlMWYuLjcyNTRjM2MgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9MaW5lYXJMYXlvdXQuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvTGluZWFyTGF5b3V0LmphdmEKQEAgLTQwLDYgKzQwLDEzIEBACiAgKiA8cD4KICAqIEFsc28gc2VlIHtAbGluayBMaW5lYXJMYXlvdXQuTGF5b3V0UGFyYW1zIGFuZHJvaWQud2lkZ2V0LkxpbmVhckxheW91dC5MYXlvdXRQYXJhbXN9CiAgKiBmb3IgbGF5b3V0IGF0dHJpYnV0ZXMgPC9wPgorICoKKyAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI0xpbmVhckxheW91dF9iYXNlbGluZUFsaWduZWQKKyAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI0xpbmVhckxheW91dF9iYXNlbGluZUFsaWduZWRDaGlsZEluZGV4CisgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNMaW5lYXJMYXlvdXRfZ3Jhdml0eQorICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjTGluZWFyTGF5b3V0X21lYXN1cmVXaXRoTGFyZ2VzdENoaWxkCisgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNMaW5lYXJMYXlvdXRfb3JpZW50YXRpb24KKyAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI0xpbmVhckxheW91dF93ZWlnaHRTdW0KICAqLwogQFJlbW90ZVZpZXcKIHB1YmxpYyBjbGFzcyBMaW5lYXJMYXlvdXQgZXh0ZW5kcyBWaWV3R3JvdXAgewpAQCAtMTEyLDcgKzExOSwxMSBAQAogICAgIH0KIAogICAgIHB1YmxpYyBMaW5lYXJMYXlvdXQoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMpIHsKLSAgICAgICAgc3VwZXIoY29udGV4dCwgYXR0cnMpOworICAgICAgICB0aGlzKGNvbnRleHQsIGF0dHJzLCAwKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIExpbmVhckxheW91dChDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGRlZlN0eWxlKSB7CisgICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzLCBkZWZTdHlsZSk7CiAKICAgICAgICAgVHlwZWRBcnJheSBhID0gCiAgICAgICAgICAgICBjb250ZXh0Lm9idGFpblN0eWxlZEF0dHJpYnV0ZXMoYXR0cnMsIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkxpbmVhckxheW91dCk7CkBAIC0xMzcsOCArMTQ4LDcgQEAKICAgICAgICAgbUJhc2VsaW5lQWxpZ25lZENoaWxkSW5kZXggPQogICAgICAgICAgICAgICAgIGEuZ2V0SW50KGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkxpbmVhckxheW91dF9iYXNlbGluZUFsaWduZWRDaGlsZEluZGV4LCAtMSk7CiAKLSAgICAgICAgLy8gVE9ETzogQmV0dGVyIG5hbWUsIGFkZCBKYXZhIEFQSXMsIG1ha2UgaXQgcHVibGljCi0gICAgICAgIG1Vc2VMYXJnZXN0Q2hpbGQgPSBhLmdldEJvb2xlYW4oUi5zdHlsZWFibGUuTGluZWFyTGF5b3V0X3VzZUxhcmdlc3RDaGlsZCwgZmFsc2UpOworICAgICAgICBtVXNlTGFyZ2VzdENoaWxkID0gYS5nZXRCb29sZWFuKFIuc3R5bGVhYmxlLkxpbmVhckxheW91dF9tZWFzdXJlV2l0aExhcmdlc3RDaGlsZCwgZmFsc2UpOwogCiAgICAgICAgIGEucmVjeWNsZSgpOwogICAgIH0KQEAgLTE2Nyw2ICsxNzcsMzMgQEAKICAgICAgICAgbUJhc2VsaW5lQWxpZ25lZCA9IGJhc2VsaW5lQWxpZ25lZDsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBXaGVuIHRydWUsIGFsbCBjaGlsZHJlbiB3aXRoIGEgd2VpZ2h0IHdpbGwgYmUgY29uc2lkZXJlZCBoYXZpbmcKKyAgICAgKiB0aGUgbWluaW11bSBzaXplIG9mIHRoZSBsYXJnZXN0IGNoaWxkLiBJZiBmYWxzZSwgYWxsIGNoaWxkcmVuIGFyZQorICAgICAqIG1lYXN1cmVkIG5vcm1hbGx5LgorICAgICAqIAorICAgICAqIEByZXR1cm4gVHJ1ZSB0byBtZWFzdXJlIGNoaWxkcmVuIHdpdGggYSB3ZWlnaHQgdXNpbmcgdGhlIG1pbmltdW0KKyAgICAgKiAgICAgICAgIHNpemUgb2YgdGhlIGxhcmdlc3QgY2hpbGQsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc01lYXN1cmVXaXRoTGFyZ2VzdENoaWxkRW5hYmxlZCgpIHsKKyAgICAgICAgcmV0dXJuIG1Vc2VMYXJnZXN0Q2hpbGQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2hlbiBzZXQgdG8gdHJ1ZSwgYWxsIGNoaWxkcmVuIHdpdGggYSB3ZWlnaHQgd2lsbCBiZSBjb25zaWRlcmVkIGhhdmluZworICAgICAqIHRoZSBtaW5pbXVtIHNpemUgb2YgdGhlIGxhcmdlc3QgY2hpbGQuIElmIGZhbHNlLCBhbGwgY2hpbGRyZW4gYXJlCisgICAgICogbWVhc3VyZWQgbm9ybWFsbHkuCisgICAgICogCisgICAgICogRGlzYWJsZWQgYnkgZGVmYXVsdC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZW5hYmxlZCBUcnVlIHRvIG1lYXN1cmUgY2hpbGRyZW4gd2l0aCBhIHdlaWdodCB1c2luZyB0aGUKKyAgICAgKiAgICAgICAgbWluaW11bSBzaXplIG9mIHRoZSBsYXJnZXN0IGNoaWxkLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICovCisgICAgQGFuZHJvaWQudmlldy5SZW1vdGFibGVWaWV3TWV0aG9kCisgICAgcHVibGljIHZvaWQgc2V0TWVhc3VyZVdpdGhMYXJnZXN0Q2hpbGRFbmFibGVkKGJvb2xlYW4gZW5hYmxlZCkgeworICAgICAgICBtVXNlTGFyZ2VzdENoaWxkID0gZW5hYmxlZDsKKyAgICB9CisKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgaW50IGdldEJhc2VsaW5lKCkgewogICAgICAgICBpZiAobUJhc2VsaW5lQWxpZ25lZENoaWxkSW5kZXggPCAwKSB7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvTGlzdFBvcHVwV2luZG93LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvTGlzdFBvcHVwV2luZG93LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTlkZTM4NQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9MaXN0UG9wdXBXaW5kb3cuamF2YQpAQCAtMCwwICsxLDEyMTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQud2lkZ2V0OworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5EYXRhU2V0T2JzZXJ2ZXI7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdQYXJlbnQ7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXcuTWVhc3VyZVNwZWM7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXcuT25Ub3VjaExpc3RlbmVyOworCisvKioKKyAqIEEgTGlzdFBvcHVwV2luZG93IGFuY2hvcnMgaXRzZWxmIHRvIGEgaG9zdCB2aWV3IGFuZCBkaXNwbGF5cyBhCisgKiBsaXN0IG9mIGNob2ljZXMuIFdoZW4gb25lIGlzIHNlbGVjdGVkLCB0aGUgcG9wdXAgaXMgZGlzbWlzc2VkLgorICogCisgKiA8cD5MaXN0UG9wdXBXaW5kb3cgY29udGFpbnMgYSBudW1iZXIgb2YgdHJpY2t5IGJlaGF2aW9ycyBzdXJyb3VuZGluZworICogcG9zaXRpb25pbmcsIHNjcm9sbGluZyBwYXJlbnRzIHRvIGZpdCB0aGUgZHJvcGRvd24sIGludGVyYWN0aW5nCisgKiBzYW5lbHkgd2l0aCB0aGUgSU1FIGlmIHByZXNlbnQsIGFuZCBvdGhlcnMuCisgKiAKKyAqIEBzZWUgYW5kcm9pZC53aWRnZXQuQXV0b0NvbXBsZXRlVGV4dFZpZXcKKyAqIEBzZWUgYW5kcm9pZC53aWRnZXQuU3Bpbm5lcgorICovCitwdWJsaWMgY2xhc3MgTGlzdFBvcHVwV2luZG93IHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkxpc3RQb3B1cFdpbmRvdyI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IGZhbHNlOworCisgICAgLyoqCisgICAgICogVGhpcyB2YWx1ZSBjb250cm9scyB0aGUgbGVuZ3RoIG9mIHRpbWUgdGhhdCB0aGUgdXNlcgorICAgICAqIG11c3QgbGVhdmUgYSBwb2ludGVyIGRvd24gd2l0aG91dCBzY3JvbGxpbmcgdG8gZXhwYW5kCisgICAgICogdGhlIGF1dG9jb21wbGV0ZSBkcm9wZG93biBsaXN0IHRvIGNvdmVyIHRoZSBJTUUuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVYUEFORF9MSVNUX1RJTUVPVVQgPSAyNTA7CisKKyAgICBwcml2YXRlIENvbnRleHQgbUNvbnRleHQ7CisgICAgcHJpdmF0ZSBQb3B1cFdpbmRvdyBtUG9wdXA7CisgICAgcHJpdmF0ZSBMaXN0QWRhcHRlciBtQWRhcHRlcjsKKyAgICBwcml2YXRlIERyb3BEb3duTGlzdFZpZXcgbURyb3BEb3duTGlzdDsKKworICAgIHByaXZhdGUgaW50IG1Ecm9wRG93bkhlaWdodCA9IFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuV1JBUF9DT05URU5UOworICAgIHByaXZhdGUgaW50IG1Ecm9wRG93bldpZHRoID0gVmlld0dyb3VwLkxheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQ7CisgICAgcHJpdmF0ZSBpbnQgbURyb3BEb3duSG9yaXpvbnRhbE9mZnNldDsKKyAgICBwcml2YXRlIGludCBtRHJvcERvd25WZXJ0aWNhbE9mZnNldDsKKworICAgIHByaXZhdGUgYm9vbGVhbiBtRHJvcERvd25BbHdheXNWaXNpYmxlID0gZmFsc2U7CisgICAgcHJpdmF0ZSBib29sZWFuIG1Gb3JjZUlnbm9yZU91dHNpZGVUb3VjaCA9IGZhbHNlOworCisgICAgcHJpdmF0ZSBWaWV3IG1Qcm9tcHRWaWV3OworICAgIHByaXZhdGUgaW50IG1Qcm9tcHRQb3NpdGlvbiA9IFBPU0lUSU9OX1BST01QVF9BQk9WRTsKKworICAgIHByaXZhdGUgRGF0YVNldE9ic2VydmVyIG1PYnNlcnZlcjsKKworICAgIHByaXZhdGUgVmlldyBtRHJvcERvd25BbmNob3JWaWV3OworCisgICAgcHJpdmF0ZSBEcmF3YWJsZSBtRHJvcERvd25MaXN0SGlnaGxpZ2h0OworCisgICAgcHJpdmF0ZSBBZGFwdGVyVmlldy5Pbkl0ZW1DbGlja0xpc3RlbmVyIG1JdGVtQ2xpY2tMaXN0ZW5lcjsKKyAgICBwcml2YXRlIEFkYXB0ZXJWaWV3Lk9uSXRlbVNlbGVjdGVkTGlzdGVuZXIgbUl0ZW1TZWxlY3RlZExpc3RlbmVyOworCisgICAgcHJpdmF0ZSBmaW5hbCAgUmVzaXplUG9wdXBSdW5uYWJsZSBtUmVzaXplUG9wdXBSdW5uYWJsZSA9IG5ldyBSZXNpemVQb3B1cFJ1bm5hYmxlKCk7CisgICAgcHJpdmF0ZSBmaW5hbCBQb3B1cFRvdWNoSW50ZXJjZXB0b3IgbVRvdWNoSW50ZXJjZXB0b3IgPSBuZXcgUG9wdXBUb3VjaEludGVyY2VwdG9yKCk7CisgICAgcHJpdmF0ZSBmaW5hbCBQb3B1cFNjcm9sbExpc3RlbmVyIG1TY3JvbGxMaXN0ZW5lciA9IG5ldyBQb3B1cFNjcm9sbExpc3RlbmVyKCk7CisgICAgcHJpdmF0ZSBmaW5hbCBMaXN0U2VsZWN0b3JIaWRlciBtSGlkZVNlbGVjdG9yID0gbmV3IExpc3RTZWxlY3RvckhpZGVyKCk7CisgICAgcHJpdmF0ZSBSdW5uYWJsZSBtU2hvd0Ryb3BEb3duUnVubmFibGU7CisKKyAgICBwcml2YXRlIEhhbmRsZXIgbUhhbmRsZXIgPSBuZXcgSGFuZGxlcigpOworCisgICAgcHJpdmF0ZSBSZWN0IG1UZW1wUmVjdCA9IG5ldyBSZWN0KCk7CisKKyAgICBwcml2YXRlIGJvb2xlYW4gbU1vZGFsOworCisgICAgLyoqCisgICAgICogVGhlIHByb3ZpZGVkIHByb21wdCB2aWV3IHNob3VsZCBhcHBlYXIgYWJvdmUgbGlzdCBjb250ZW50LgorICAgICAqIAorICAgICAqIEBzZWUgI3NldFByb21wdFBvc2l0aW9uKGludCkKKyAgICAgKiBAc2VlICNnZXRQcm9tcHRQb3NpdGlvbigpCisgICAgICogQHNlZSAjc2V0UHJvbXB0VmlldyhWaWV3KQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBPU0lUSU9OX1BST01QVF9BQk9WRSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBUaGUgcHJvdmlkZWQgcHJvbXB0IHZpZXcgc2hvdWxkIGFwcGVhciBiZWxvdyBsaXN0IGNvbnRlbnQuCisgICAgICogCisgICAgICogQHNlZSAjc2V0UHJvbXB0UG9zaXRpb24oaW50KQorICAgICAqIEBzZWUgI2dldFByb21wdFBvc2l0aW9uKCkKKyAgICAgKiBAc2VlICNzZXRQcm9tcHRWaWV3KFZpZXcpCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUE9TSVRJT05fUFJPTVBUX0JFTE9XID0gMTsKKworICAgIC8qKgorICAgICAqIEFsaWFzIGZvciB7QGxpbmsgVmlld0dyb3VwLkxheW91dFBhcmFtcyNNQVRDSF9QQVJFTlR9LgorICAgICAqIElmIHVzZWQgdG8gc3BlY2lmeSBhIHBvcHVwIHdpZHRoLCB0aGUgcG9wdXAgd2lsbCBtYXRjaCB0aGUgd2lkdGggb2YgdGhlIGFuY2hvciB2aWV3LgorICAgICAqIElmIHVzZWQgdG8gc3BlY2lmeSBhIHBvcHVwIGhlaWdodCwgdGhlIHBvcHVwIHdpbGwgZmlsbCBhdmFpbGFibGUgc3BhY2UuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFUQ0hfUEFSRU5UID0gVmlld0dyb3VwLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQ7CisgICAgCisgICAgLyoqCisgICAgICogQWxpYXMgZm9yIHtAbGluayBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zI1dSQVBfQ09OVEVOVH0uCisgICAgICogSWYgdXNlZCB0byBzcGVjaWZ5IGEgcG9wdXAgd2lkdGgsIHRoZSBwb3B1cCB3aWxsIHVzZSB0aGUgd2lkdGggb2YgaXRzIGNvbnRlbnQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV1JBUF9DT05URU5UID0gVmlld0dyb3VwLkxheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQ7CisgICAgCisgICAgLyoqCisgICAgICogTW9kZSBmb3Ige0BsaW5rICNzZXRJbnB1dE1ldGhvZE1vZGUoaW50KX06IHRoZSByZXF1aXJlbWVudHMgZm9yIHRoZQorICAgICAqIGlucHV0IG1ldGhvZCBzaG91bGQgYmUgYmFzZWQgb24gdGhlIGZvY3VzYWJpbGl0eSBvZiB0aGUgcG9wdXAuICBUaGF0IGlzCisgICAgICogaWYgaXQgaXMgZm9jdXNhYmxlIHRoYW4gaXQgbmVlZHMgdG8gd29yayB3aXRoIHRoZSBpbnB1dCBtZXRob2QsIGVsc2UKKyAgICAgKiBpdCBkb2Vzbid0LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOUFVUX01FVEhPRF9GUk9NX0ZPQ1VTQUJMRSA9IFBvcHVwV2luZG93LklOUFVUX01FVEhPRF9GUk9NX0ZPQ1VTQUJMRTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBNb2RlIGZvciB7QGxpbmsgI3NldElucHV0TWV0aG9kTW9kZShpbnQpfTogdGhpcyBwb3B1cCBhbHdheXMgbmVlZHMgdG8KKyAgICAgKiB3b3JrIHdpdGggYW4gaW5wdXQgbWV0aG9kLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgaXQgaXMgZm9jdXNhYmxlLiAgVGhpcworICAgICAqIG1lYW5zIHRoYXQgaXQgd2lsbCBhbHdheXMgYmUgZGlzcGxheWVkIHNvIHRoYXQgdGhlIHVzZXIgY2FuIGFsc28gb3BlcmF0ZQorICAgICAqIHRoZSBpbnB1dCBtZXRob2Qgd2hpbGUgaXQgaXMgc2hvd24uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5QVVRfTUVUSE9EX05FRURFRCA9IFBvcHVwV2luZG93LklOUFVUX01FVEhPRF9ORUVERUQ7CisgICAgCisgICAgLyoqCisgICAgICogTW9kZSBmb3Ige0BsaW5rICNzZXRJbnB1dE1ldGhvZE1vZGUoaW50KX06IHRoaXMgcG9wdXAgbmV2ZXIgbmVlZHMgdG8KKyAgICAgKiB3b3JrIHdpdGggYW4gaW5wdXQgbWV0aG9kLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgaXQgaXMgZm9jdXNhYmxlLiAgVGhpcworICAgICAqIG1lYW5zIHRoYXQgaXQgd2lsbCBhbHdheXMgYmUgZGlzcGxheWVkIHRvIHVzZSBhcyBtdWNoIHNwYWNlIG9uIHRoZQorICAgICAqIHNjcmVlbiBhcyBuZWVkZWQsIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGlzIGNvdmVycyB0aGUgaW5wdXQgbWV0aG9kLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOUFVUX01FVEhPRF9OT1RfTkVFREVEID0gUG9wdXBXaW5kb3cuSU5QVVRfTUVUSE9EX05PVF9ORUVERUQ7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcsIGVtcHR5IHBvcHVwIHdpbmRvdyBjYXBhYmxlIG9mIGRpc3BsYXlpbmcgaXRlbXMgZnJvbSBhIExpc3RBZGFwdGVyLgorICAgICAqIEJhY2tncm91bmRzIHNob3VsZCBiZSBzZXQgdXNpbmcge0BsaW5rICNzZXRCYWNrZ3JvdW5kRHJhd2FibGUoRHJhd2FibGUpfS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gY29udGV4dCBDb250ZXh0IHVzZWQgZm9yIGNvbnRhaW5lZCB2aWV3cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdFBvcHVwV2luZG93KENvbnRleHQgY29udGV4dCkgeworICAgICAgICB0aGlzKGNvbnRleHQsIG51bGwsIDAsIDApOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldywgZW1wdHkgcG9wdXAgd2luZG93IGNhcGFibGUgb2YgZGlzcGxheWluZyBpdGVtcyBmcm9tIGEgTGlzdEFkYXB0ZXIuCisgICAgICogQmFja2dyb3VuZHMgc2hvdWxkIGJlIHNldCB1c2luZyB7QGxpbmsgI3NldEJhY2tncm91bmREcmF3YWJsZShEcmF3YWJsZSl9LgorICAgICAqIAorICAgICAqIEBwYXJhbSBjb250ZXh0IENvbnRleHQgdXNlZCBmb3IgY29udGFpbmVkIHZpZXdzLgorICAgICAqIEBwYXJhbSBhdHRycyBBdHRyaWJ1dGVzIGZyb20gaW5mbGF0aW5nIHBhcmVudCB2aWV3cyB1c2VkIHRvIHN0eWxlIHRoZSBwb3B1cC4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdFBvcHVwV2luZG93KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7CisgICAgICAgIHRoaXMoY29udGV4dCwgYXR0cnMsIDAsIDApOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldywgZW1wdHkgcG9wdXAgd2luZG93IGNhcGFibGUgb2YgZGlzcGxheWluZyBpdGVtcyBmcm9tIGEgTGlzdEFkYXB0ZXIuCisgICAgICogQmFja2dyb3VuZHMgc2hvdWxkIGJlIHNldCB1c2luZyB7QGxpbmsgI3NldEJhY2tncm91bmREcmF3YWJsZShEcmF3YWJsZSl9LgorICAgICAqIAorICAgICAqIEBwYXJhbSBjb250ZXh0IENvbnRleHQgdXNlZCBmb3IgY29udGFpbmVkIHZpZXdzLgorICAgICAqIEBwYXJhbSBhdHRycyBBdHRyaWJ1dGVzIGZyb20gaW5mbGF0aW5nIHBhcmVudCB2aWV3cyB1c2VkIHRvIHN0eWxlIHRoZSBwb3B1cC4KKyAgICAgKiBAcGFyYW0gZGVmU3R5bGVBdHRyIERlZmF1bHQgc3R5bGUgYXR0cmlidXRlIHRvIHVzZSBmb3IgcG9wdXAgY29udGVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdFBvcHVwV2luZG93KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzLCBpbnQgZGVmU3R5bGVBdHRyKSB7CisgICAgICAgIHRoaXMoY29udGV4dCwgYXR0cnMsIGRlZlN0eWxlQXR0ciwgMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3LCBlbXB0eSBwb3B1cCB3aW5kb3cgY2FwYWJsZSBvZiBkaXNwbGF5aW5nIGl0ZW1zIGZyb20gYSBMaXN0QWRhcHRlci4KKyAgICAgKiBCYWNrZ3JvdW5kcyBzaG91bGQgYmUgc2V0IHVzaW5nIHtAbGluayAjc2V0QmFja2dyb3VuZERyYXdhYmxlKERyYXdhYmxlKX0uCisgICAgICogCisgICAgICogQHBhcmFtIGNvbnRleHQgQ29udGV4dCB1c2VkIGZvciBjb250YWluZWQgdmlld3MuCisgICAgICogQHBhcmFtIGF0dHJzIEF0dHJpYnV0ZXMgZnJvbSBpbmZsYXRpbmcgcGFyZW50IHZpZXdzIHVzZWQgdG8gc3R5bGUgdGhlIHBvcHVwLgorICAgICAqIEBwYXJhbSBkZWZTdHlsZUF0dHIgU3R5bGUgYXR0cmlidXRlIHRvIHJlYWQgZm9yIGRlZmF1bHQgc3R5bGluZyBvZiBwb3B1cCBjb250ZW50LgorICAgICAqIEBwYXJhbSBkZWZTdHlsZVJlcyBTdHlsZSByZXNvdXJjZSBJRCB0byB1c2UgZm9yIGRlZmF1bHQgc3R5bGluZyBvZiBwb3B1cCBjb250ZW50LgorICAgICAqLworICAgIHB1YmxpYyBMaXN0UG9wdXBXaW5kb3coQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMsIGludCBkZWZTdHlsZUF0dHIsIGludCBkZWZTdHlsZVJlcykgeworICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7CisgICAgICAgIG1Qb3B1cCA9IG5ldyBQb3B1cFdpbmRvdyhjb250ZXh0LCBhdHRycywgZGVmU3R5bGVBdHRyLCBkZWZTdHlsZVJlcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgYWRhcHRlciB0aGF0IHByb3ZpZGVzIHRoZSBkYXRhIGFuZCB0aGUgdmlld3MgdG8gcmVwcmVzZW50IHRoZSBkYXRhCisgICAgICogaW4gdGhpcyBwb3B1cCB3aW5kb3cuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYWRhcHRlciBUaGUgYWRhcHRlciB0byB1c2UgdG8gY3JlYXRlIHRoaXMgd2luZG93J3MgY29udGVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBZGFwdGVyKExpc3RBZGFwdGVyIGFkYXB0ZXIpIHsKKyAgICAgICAgaWYgKG1PYnNlcnZlciA9PSBudWxsKSB7CisgICAgICAgICAgICBtT2JzZXJ2ZXIgPSBuZXcgUG9wdXBEYXRhU2V0T2JzZXJ2ZXIoKTsKKyAgICAgICAgfSBlbHNlIGlmIChtQWRhcHRlciAhPSBudWxsKSB7CisgICAgICAgICAgICBtQWRhcHRlci51bnJlZ2lzdGVyRGF0YVNldE9ic2VydmVyKG1PYnNlcnZlcik7CisgICAgICAgIH0KKyAgICAgICAgbUFkYXB0ZXIgPSBhZGFwdGVyOworICAgICAgICBpZiAobUFkYXB0ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgYWRhcHRlci5yZWdpc3RlckRhdGFTZXRPYnNlcnZlcihtT2JzZXJ2ZXIpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAobURyb3BEb3duTGlzdCAhPSBudWxsKSB7CisgICAgICAgICAgICBtRHJvcERvd25MaXN0LnNldEFkYXB0ZXIobUFkYXB0ZXIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHdoZXJlIHRoZSBvcHRpb25hbCBwcm9tcHQgdmlldyBzaG91bGQgYXBwZWFyLiBUaGUgZGVmYXVsdCBpcworICAgICAqIHtAbGluayAjUE9TSVRJT05fUFJPTVBUX0FCT1ZFfS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcG9zaXRpb24gQSBwb3NpdGlvbiBjb25zdGFudCBkZWNsYXJpbmcgd2hlcmUgdGhlIHByb21wdCBzaG91bGQgYmUgZGlzcGxheWVkLgorICAgICAqIAorICAgICAqIEBzZWUgI1BPU0lUSU9OX1BST01QVF9BQk9WRQorICAgICAqIEBzZWUgI1BPU0lUSU9OX1BST01QVF9CRUxPVworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFByb21wdFBvc2l0aW9uKGludCBwb3NpdGlvbikgeworICAgICAgICBtUHJvbXB0UG9zaXRpb24gPSBwb3NpdGlvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFdoZXJlIHRoZSBvcHRpb25hbCBwcm9tcHQgdmlldyBzaG91bGQgYXBwZWFyLgorICAgICAqIAorICAgICAqIEBzZWUgI1BPU0lUSU9OX1BST01QVF9BQk9WRQorICAgICAqIEBzZWUgI1BPU0lUSU9OX1BST01QVF9CRUxPVworICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0UHJvbXB0UG9zaXRpb24oKSB7CisgICAgICAgIHJldHVybiBtUHJvbXB0UG9zaXRpb247CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHdoZXRoZXIgdGhpcyB3aW5kb3cgc2hvdWxkIGJlIG1vZGFsIHdoZW4gc2hvd24uCisgICAgICogCisgICAgICogPHA+SWYgYSBwb3B1cCB3aW5kb3cgaXMgbW9kYWwsIGl0IHdpbGwgcmVjZWl2ZSBhbGwgdG91Y2ggYW5kIGtleSBpbnB1dC4KKyAgICAgKiBJZiB0aGUgdXNlciB0b3VjaGVzIG91dHNpZGUgdGhlIHBvcHVwIHdpbmRvdydzIGNvbnRlbnQgYXJlYSB0aGUgcG9wdXAgd2luZG93CisgICAgICogd2lsbCBiZSBkaXNtaXNzZWQuCisgICAgICogCisgICAgICogQHBhcmFtIG1vZGFsIHtAY29kZSB0cnVlfSBpZiB0aGUgcG9wdXAgd2luZG93IHNob3VsZCBiZSBtb2RhbCwge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TW9kYWwoYm9vbGVhbiBtb2RhbCkgeworICAgICAgICBtTW9kYWwgPSB0cnVlOworICAgICAgICBtUG9wdXAuc2V0Rm9jdXNhYmxlKG1vZGFsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHBvcHVwIHdpbmRvdyB3aWxsIGJlIG1vZGFsIHdoZW4gc2hvd24uCisgICAgICogCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHBvcHVwIHdpbmRvdyB3aWxsIGJlIG1vZGFsLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc01vZGFsKCkgeworICAgICAgICByZXR1cm4gbU1vZGFsOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZvcmNlcyBvdXRzaWRlIHRvdWNoZXMgdG8gYmUgaWdub3JlZC4gTm9ybWFsbHkgaWYge0BsaW5rICNpc0Ryb3BEb3duQWx3YXlzVmlzaWJsZSgpfSBpcworICAgICAqIGZhbHNlLCB3ZSBhbGxvdyBvdXRzaWRlIHRvdWNoIHRvIGRpc21pc3MgdGhlIGRyb3Bkb3duLiBJZiB0aGlzIGlzIHNldCB0byB0cnVlLCB0aGVuIHdlCisgICAgICogaWdub3JlIG91dHNpZGUgdG91Y2ggZXZlbiB3aGVuIHRoZSBkcm9wIGRvd24gaXMgbm90IHNldCB0byBhbHdheXMgdmlzaWJsZS4KKyAgICAgKiAKKyAgICAgKiBAaGlkZSBVc2VkIG9ubHkgYnkgQXV0b0NvbXBsZXRlVGV4dFZpZXcgdG8gaGFuZGxlIHNvbWUgaW50ZXJuYWwgc3BlY2lhbCBjYXNlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRGb3JjZUlnbm9yZU91dHNpZGVUb3VjaChib29sZWFuIGZvcmNlSWdub3JlT3V0c2lkZVRvdWNoKSB7CisgICAgICAgIG1Gb3JjZUlnbm9yZU91dHNpZGVUb3VjaCA9IGZvcmNlSWdub3JlT3V0c2lkZVRvdWNoOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgd2hldGhlciB0aGUgZHJvcC1kb3duIHNob3VsZCByZW1haW4gdmlzaWJsZSB1bmRlciBjZXJ0YWluIGNvbmRpdGlvbnMuCisgICAgICoKKyAgICAgKiBUaGUgZHJvcC1kb3duIHdpbGwgb2NjdXB5IHRoZSBlbnRpcmUgc2NyZWVuIGJlbG93IHtAbGluayAjZ2V0QW5jaG9yVmlld30gcmVnYXJkbGVzcworICAgICAqIG9mIHRoZSBzaXplIG9yIGNvbnRlbnQgb2YgdGhlIGxpc3QuICB7QGxpbmsgI2dldEJhY2tncm91bmQoKX0gd2lsbCBmaWxsIGFueSBzcGFjZQorICAgICAqIHRoYXQgaXMgbm90IHVzZWQgYnkgdGhlIGxpc3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZHJvcERvd25BbHdheXNWaXNpYmxlIFdoZXRoZXIgdG8ga2VlcCB0aGUgZHJvcC1kb3duIHZpc2libGUuCisgICAgICoKKyAgICAgKiBAaGlkZSBPbmx5IHVzZWQgYnkgQXV0b0NvbXBsZXRlVGV4dFZpZXcgdW5kZXIgc3BlY2lhbCBjb25kaXRpb25zLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERyb3BEb3duQWx3YXlzVmlzaWJsZShib29sZWFuIGRyb3BEb3duQWx3YXlzVmlzaWJsZSkgeworICAgICAgICBtRHJvcERvd25BbHdheXNWaXNpYmxlID0gZHJvcERvd25BbHdheXNWaXNpYmxlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gV2hldGhlciB0aGUgZHJvcC1kb3duIGlzIHZpc2libGUgdW5kZXIgc3BlY2lhbCBjb25kaXRpb25zLgorICAgICAqCisgICAgICogQGhpZGUgT25seSB1c2VkIGJ5IEF1dG9Db21wbGV0ZVRleHRWaWV3IHVuZGVyIHNwZWNpYWwgY29uZGl0aW9ucy4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0Ryb3BEb3duQWx3YXlzVmlzaWJsZSgpIHsKKyAgICAgICAgcmV0dXJuIG1Ecm9wRG93bkFsd2F5c1Zpc2libGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgb3BlcmF0aW5nIG1vZGUgZm9yIHRoZSBzb2Z0IGlucHV0IGFyZWEuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbW9kZSBUaGUgZGVzaXJlZCBtb2RlLCBzZWUKKyAgICAgKiAgICAgICAge0BsaW5rIGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcyNzb2Z0SW5wdXRNb2RlfQorICAgICAqICAgICAgICBmb3IgdGhlIGZ1bGwgbGlzdAorICAgICAqCisgICAgICogQHNlZSBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMjc29mdElucHV0TW9kZQorICAgICAqIEBzZWUgI2dldFNvZnRJbnB1dE1vZGUoKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNvZnRJbnB1dE1vZGUoaW50IG1vZGUpIHsKKyAgICAgICAgbVBvcHVwLnNldFNvZnRJbnB1dE1vZGUobW9kZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgY3VycmVudCB2YWx1ZSBpbiB7QGxpbmsgI3NldFNvZnRJbnB1dE1vZGUoaW50KX0uCisgICAgICoKKyAgICAgKiBAc2VlICNzZXRTb2Z0SW5wdXRNb2RlKGludCkKKyAgICAgKiBAc2VlIGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcyNzb2Z0SW5wdXRNb2RlCisgICAgICovCisgICAgcHVibGljIGludCBnZXRTb2Z0SW5wdXRNb2RlKCkgeworICAgICAgICByZXR1cm4gbVBvcHVwLmdldFNvZnRJbnB1dE1vZGUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIGEgZHJhd2FibGUgdG8gdXNlIGFzIHRoZSBsaXN0IGl0ZW0gc2VsZWN0b3IuCisgICAgICogCisgICAgICogQHBhcmFtIHNlbGVjdG9yIExpc3Qgc2VsZWN0b3IgZHJhd2FibGUgdG8gdXNlIGluIHRoZSBwb3B1cC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRMaXN0U2VsZWN0b3IoRHJhd2FibGUgc2VsZWN0b3IpIHsKKyAgICAgICAgbURyb3BEb3duTGlzdEhpZ2hsaWdodCA9IHNlbGVjdG9yOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gVGhlIGJhY2tncm91bmQgZHJhd2FibGUgZm9yIHRoZSBwb3B1cCB3aW5kb3cuCisgICAgICovCisgICAgcHVibGljIERyYXdhYmxlIGdldEJhY2tncm91bmQoKSB7CisgICAgICAgIHJldHVybiBtUG9wdXAuZ2V0QmFja2dyb3VuZCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgYSBkcmF3YWJsZSB0byBiZSB0aGUgYmFja2dyb3VuZCBmb3IgdGhlIHBvcHVwIHdpbmRvdy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZCBBIGRyYXdhYmxlIHRvIHNldCBhcyB0aGUgYmFja2dyb3VuZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRCYWNrZ3JvdW5kRHJhd2FibGUoRHJhd2FibGUgZCkgeworICAgICAgICBtUG9wdXAuc2V0QmFja2dyb3VuZERyYXdhYmxlKGQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCBhbiBhbmltYXRpb24gc3R5bGUgdG8gdXNlIHdoZW4gdGhlIHBvcHVwIHdpbmRvdyBpcyBzaG93biBvciBkaXNtaXNzZWQuCisgICAgICogCisgICAgICogQHBhcmFtIGFuaW1hdGlvblN0eWxlIEFuaW1hdGlvbiBzdHlsZSB0byB1c2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QW5pbWF0aW9uU3R5bGUoaW50IGFuaW1hdGlvblN0eWxlKSB7CisgICAgICAgIG1Qb3B1cC5zZXRBbmltYXRpb25TdHlsZShhbmltYXRpb25TdHlsZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgYW5pbWF0aW9uIHN0eWxlIHRoYXQgd2lsbCBiZSB1c2VkIHdoZW4gdGhlIHBvcHVwIHdpbmRvdyBpcworICAgICAqIHNob3duIG9yIGRpc21pc3NlZC4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIEFuaW1hdGlvbiBzdHlsZSB0aGF0IHdpbGwgYmUgdXNlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldEFuaW1hdGlvblN0eWxlKCkgeworICAgICAgICByZXR1cm4gbVBvcHVwLmdldEFuaW1hdGlvblN0eWxlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgdmlldyB0aGF0IHdpbGwgYmUgdXNlZCB0byBhbmNob3IgdGhpcyBwb3B1cC4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIFRoZSBwb3B1cCdzIGFuY2hvciB2aWV3CisgICAgICovCisgICAgcHVibGljIFZpZXcgZ2V0QW5jaG9yVmlldygpIHsKKyAgICAgICAgcmV0dXJuIG1Ecm9wRG93bkFuY2hvclZpZXc7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgcG9wdXAncyBhbmNob3Igdmlldy4gVGhpcyBwb3B1cCB3aWxsIGFsd2F5cyBiZSBwb3NpdGlvbmVkIHJlbGF0aXZlIHRvCisgICAgICogdGhlIGFuY2hvciB2aWV3IHdoZW4gc2hvd24uCisgICAgICogCisgICAgICogQHBhcmFtIGFuY2hvciBUaGUgdmlldyB0byB1c2UgYXMgYW4gYW5jaG9yLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEFuY2hvclZpZXcoVmlldyBhbmNob3IpIHsKKyAgICAgICAgbURyb3BEb3duQW5jaG9yVmlldyA9IGFuY2hvcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFRoZSBob3Jpem9udGFsIG9mZnNldCBvZiB0aGUgcG9wdXAgZnJvbSBpdHMgYW5jaG9yIGluIHBpeGVscy4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldEhvcml6b250YWxPZmZzZXQoKSB7CisgICAgICAgIHJldHVybiBtRHJvcERvd25Ib3Jpem9udGFsT2Zmc2V0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgaG9yaXpvbnRhbCBvZmZzZXQgb2YgdGhpcyBwb3B1cCBmcm9tIGl0cyBhbmNob3IgdmlldyBpbiBwaXhlbHMuCisgICAgICogCisgICAgICogQHBhcmFtIG9mZnNldCBUaGUgaG9yaXpvbnRhbCBvZmZzZXQgb2YgdGhlIHBvcHVwIGZyb20gaXRzIGFuY2hvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRIb3Jpem9udGFsT2Zmc2V0KGludCBvZmZzZXQpIHsKKyAgICAgICAgbURyb3BEb3duSG9yaXpvbnRhbE9mZnNldCA9IG9mZnNldDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFRoZSB2ZXJ0aWNhbCBvZmZzZXQgb2YgdGhlIHBvcHVwIGZyb20gaXRzIGFuY2hvciBpbiBwaXhlbHMuCisgICAgICovCisgICAgcHVibGljIGludCBnZXRWZXJ0aWNhbE9mZnNldCgpIHsKKyAgICAgICAgcmV0dXJuIG1Ecm9wRG93blZlcnRpY2FsT2Zmc2V0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgdmVydGljYWwgb2Zmc2V0IG9mIHRoaXMgcG9wdXAgZnJvbSBpdHMgYW5jaG9yIHZpZXcgaW4gcGl4ZWxzLgorICAgICAqIAorICAgICAqIEBwYXJhbSBvZmZzZXQgVGhlIHZlcnRpY2FsIG9mZnNldCBvZiB0aGUgcG9wdXAgZnJvbSBpdHMgYW5jaG9yLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFZlcnRpY2FsT2Zmc2V0KGludCBvZmZzZXQpIHsKKyAgICAgICAgbURyb3BEb3duVmVydGljYWxPZmZzZXQgPSBvZmZzZXQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBUaGUgd2lkdGggb2YgdGhlIHBvcHVwIHdpbmRvdyBpbiBwaXhlbHMuCisgICAgICovCisgICAgcHVibGljIGludCBnZXRXaWR0aCgpIHsKKyAgICAgICAgcmV0dXJuIG1Ecm9wRG93bldpZHRoOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHdpZHRoIG9mIHRoZSBwb3B1cCB3aW5kb3cgaW4gcGl4ZWxzLiBDYW4gYWxzbyBiZSB7QGxpbmsgI01BVENIX1BBUkVOVH0KKyAgICAgKiBvciB7QGxpbmsgI1dSQVBfQ09OVEVOVH0uCisgICAgICogCisgICAgICogQHBhcmFtIHdpZHRoIFdpZHRoIG9mIHRoZSBwb3B1cCB3aW5kb3cuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0V2lkdGgoaW50IHdpZHRoKSB7CisgICAgICAgIG1Ecm9wRG93bldpZHRoID0gd2lkdGg7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBUaGUgaGVpZ2h0IG9mIHRoZSBwb3B1cCB3aW5kb3cgaW4gcGl4ZWxzLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0SGVpZ2h0KCkgeworICAgICAgICByZXR1cm4gbURyb3BEb3duSGVpZ2h0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGhlaWdodCBvZiB0aGUgcG9wdXAgd2luZG93IGluIHBpeGVscy4gQ2FuIGFsc28gYmUge0BsaW5rICNNQVRDSF9QQVJFTlR9LgorICAgICAqIAorICAgICAqIEBwYXJhbSBoZWlnaHQgSGVpZ2h0IG9mIHRoZSBwb3B1cCB3aW5kb3cuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SGVpZ2h0KGludCBoZWlnaHQpIHsKKyAgICAgICAgbURyb3BEb3duSGVpZ2h0ID0gaGVpZ2h0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgYSBsaXN0ZW5lciB0byByZWNlaXZlIGV2ZW50cyB3aGVuIGEgbGlzdCBpdGVtIGlzIGNsaWNrZWQuCisgICAgICogCisgICAgICogQHBhcmFtIGNsaWNrTGlzdGVuZXIgTGlzdGVuZXIgdG8gcmVnaXN0ZXIKKyAgICAgKiAKKyAgICAgKiBAc2VlIExpc3RWaWV3I3NldE9uSXRlbUNsaWNrTGlzdGVuZXIoYW5kcm9pZC53aWRnZXQuQWRhcHRlclZpZXcuT25JdGVtQ2xpY2tMaXN0ZW5lcikKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRPbkl0ZW1DbGlja0xpc3RlbmVyKEFkYXB0ZXJWaWV3Lk9uSXRlbUNsaWNrTGlzdGVuZXIgY2xpY2tMaXN0ZW5lcikgeworICAgICAgICBtSXRlbUNsaWNrTGlzdGVuZXIgPSBjbGlja0xpc3RlbmVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgYSBsaXN0ZW5lciB0byByZWNlaXZlIGV2ZW50cyB3aGVuIGEgbGlzdCBpdGVtIGlzIHNlbGVjdGVkLgorICAgICAqIAorICAgICAqIEBwYXJhbSBzZWxlY3RlZExpc3RlbmVyIExpc3RlbmVyIHRvIHJlZ2lzdGVyLgorICAgICAqIAorICAgICAqIEBzZWUgTGlzdFZpZXcjc2V0T25JdGVtU2VsZWN0ZWRMaXN0ZW5lcihhbmRyb2lkLndpZGdldC5BZGFwdGVyVmlldy5Pbkl0ZW1TZWxlY3RlZExpc3RlbmVyKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE9uSXRlbVNlbGVjdGVkTGlzdGVuZXIoQWRhcHRlclZpZXcuT25JdGVtU2VsZWN0ZWRMaXN0ZW5lciBzZWxlY3RlZExpc3RlbmVyKSB7CisgICAgICAgIG1JdGVtU2VsZWN0ZWRMaXN0ZW5lciA9IHNlbGVjdGVkTGlzdGVuZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IGEgdmlldyB0byBhY3QgYXMgYSB1c2VyIHByb21wdCBmb3IgdGhpcyBwb3B1cCB3aW5kb3cuIFdoZXJlIHRoZSBwcm9tcHQgdmlldyB3aWxsIGFwcGVhcgorICAgICAqIGlzIGNvbnRyb2xsZWQgYnkge0BsaW5rICNzZXRQcm9tcHRQb3NpdGlvbihpbnQpfS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcHJvbXB0IFZpZXcgdG8gdXNlIGFzIGFuIGluZm9ybWF0aW9uYWwgcHJvbXB0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFByb21wdFZpZXcoVmlldyBwcm9tcHQpIHsKKyAgICAgICAgYm9vbGVhbiBzaG93aW5nID0gaXNTaG93aW5nKCk7CisgICAgICAgIGlmIChzaG93aW5nKSB7CisgICAgICAgICAgICByZW1vdmVQcm9tcHRWaWV3KCk7CisgICAgICAgIH0KKyAgICAgICAgbVByb21wdFZpZXcgPSBwcm9tcHQ7CisgICAgICAgIGlmIChzaG93aW5nKSB7CisgICAgICAgICAgICBzaG93KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQb3N0IGEge0BsaW5rICNzaG93KCl9IGNhbGwgdG8gdGhlIFVJIHRocmVhZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwb3N0U2hvdygpIHsKKyAgICAgICAgbUhhbmRsZXIucG9zdChtU2hvd0Ryb3BEb3duUnVubmFibGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNob3cgdGhlIHBvcHVwIGxpc3QuIElmIHRoZSBsaXN0IGlzIGFscmVhZHkgc2hvd2luZywgdGhpcyBtZXRob2QKKyAgICAgKiB3aWxsIHJlY2FsY3VsYXRlIHRoZSBwb3B1cCdzIHNpemUgYW5kIHBvc2l0aW9uLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNob3coKSB7CisgICAgICAgIGludCBoZWlnaHQgPSBidWlsZERyb3BEb3duKCk7CisKKyAgICAgICAgaW50IHdpZHRoU3BlYyA9IDA7CisgICAgICAgIGludCBoZWlnaHRTcGVjID0gMDsKKworICAgICAgICBib29sZWFuIG5vSW5wdXRNZXRob2QgPSBpc0lucHV0TWV0aG9kTm90TmVlZGVkKCk7CisKKyAgICAgICAgaWYgKG1Qb3B1cC5pc1Nob3dpbmcoKSkgeworICAgICAgICAgICAgaWYgKG1Ecm9wRG93bldpZHRoID09IFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UKSB7CisgICAgICAgICAgICAgICAgLy8gVGhlIGNhbGwgdG8gUG9wdXBXaW5kb3cncyB1cGRhdGUgbWV0aG9kIGJlbG93IGNhbiBhY2NlcHQgLTEgZm9yIGFueQorICAgICAgICAgICAgICAgIC8vIHZhbHVlIHlvdSBkbyBub3Qgd2FudCB0byB1cGRhdGUuCisgICAgICAgICAgICAgICAgd2lkdGhTcGVjID0gLTE7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1Ecm9wRG93bldpZHRoID09IFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuV1JBUF9DT05URU5UKSB7CisgICAgICAgICAgICAgICAgd2lkdGhTcGVjID0gZ2V0QW5jaG9yVmlldygpLmdldFdpZHRoKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHdpZHRoU3BlYyA9IG1Ecm9wRG93bldpZHRoOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobURyb3BEb3duSGVpZ2h0ID09IFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UKSB7CisgICAgICAgICAgICAgICAgLy8gVGhlIGNhbGwgdG8gUG9wdXBXaW5kb3cncyB1cGRhdGUgbWV0aG9kIGJlbG93IGNhbiBhY2NlcHQgLTEgZm9yIGFueQorICAgICAgICAgICAgICAgIC8vIHZhbHVlIHlvdSBkbyBub3Qgd2FudCB0byB1cGRhdGUuCisgICAgICAgICAgICAgICAgaGVpZ2h0U3BlYyA9IG5vSW5wdXRNZXRob2QgPyBoZWlnaHQgOiBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVDsKKyAgICAgICAgICAgICAgICBpZiAobm9JbnB1dE1ldGhvZCkgeworICAgICAgICAgICAgICAgICAgICBtUG9wdXAuc2V0V2luZG93TGF5b3V0TW9kZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRHJvcERvd25XaWR0aCA9PSBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCA6IDAsIDApOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG1Qb3B1cC5zZXRXaW5kb3dMYXlvdXRNb2RlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ecm9wRG93bldpZHRoID09IFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UIDogMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChtRHJvcERvd25IZWlnaHQgPT0gVmlld0dyb3VwLkxheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQpIHsKKyAgICAgICAgICAgICAgICBoZWlnaHRTcGVjID0gaGVpZ2h0OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBoZWlnaHRTcGVjID0gbURyb3BEb3duSGVpZ2h0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtUG9wdXAuc2V0T3V0c2lkZVRvdWNoYWJsZSghbUZvcmNlSWdub3JlT3V0c2lkZVRvdWNoICYmICFtRHJvcERvd25BbHdheXNWaXNpYmxlKTsKKworICAgICAgICAgICAgbVBvcHVwLnVwZGF0ZShnZXRBbmNob3JWaWV3KCksIG1Ecm9wRG93bkhvcml6b250YWxPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgIG1Ecm9wRG93blZlcnRpY2FsT2Zmc2V0LCB3aWR0aFNwZWMsIGhlaWdodFNwZWMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKG1Ecm9wRG93bldpZHRoID09IFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UKSB7CisgICAgICAgICAgICAgICAgd2lkdGhTcGVjID0gVmlld0dyb3VwLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChtRHJvcERvd25XaWR0aCA9PSBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCkgeworICAgICAgICAgICAgICAgICAgICBtUG9wdXAuc2V0V2lkdGgoZ2V0QW5jaG9yVmlldygpLmdldFdpZHRoKCkpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG1Qb3B1cC5zZXRXaWR0aChtRHJvcERvd25XaWR0aCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobURyb3BEb3duSGVpZ2h0ID09IFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UKSB7CisgICAgICAgICAgICAgICAgaGVpZ2h0U3BlYyA9IFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAobURyb3BEb3duSGVpZ2h0ID09IFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuV1JBUF9DT05URU5UKSB7CisgICAgICAgICAgICAgICAgICAgIG1Qb3B1cC5zZXRIZWlnaHQoaGVpZ2h0KTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBtUG9wdXAuc2V0SGVpZ2h0KG1Ecm9wRG93bkhlaWdodCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtUG9wdXAuc2V0V2luZG93TGF5b3V0TW9kZSh3aWR0aFNwZWMsIGhlaWdodFNwZWMpOworICAgICAgICAgICAgbVBvcHVwLnNldElucHV0TWV0aG9kTW9kZShQb3B1cFdpbmRvdy5JTlBVVF9NRVRIT0RfTkVFREVEKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gdXNlIG91dHNpZGUgdG91Y2hhYmxlIHRvIGRpc21pc3MgZHJvcCBkb3duIHdoZW4gdG91Y2hpbmcgb3V0c2lkZSBvZiBpdCwgc28KKyAgICAgICAgICAgIC8vIG9ubHkgc2V0IHRoaXMgaWYgdGhlIGRyb3Bkb3duIGlzIG5vdCBhbHdheXMgdmlzaWJsZQorICAgICAgICAgICAgbVBvcHVwLnNldE91dHNpZGVUb3VjaGFibGUoIW1Gb3JjZUlnbm9yZU91dHNpZGVUb3VjaCAmJiAhbURyb3BEb3duQWx3YXlzVmlzaWJsZSk7CisgICAgICAgICAgICBtUG9wdXAuc2V0VG91Y2hJbnRlcmNlcHRvcihtVG91Y2hJbnRlcmNlcHRvcik7CisgICAgICAgICAgICBtUG9wdXAuc2hvd0FzRHJvcERvd24oZ2V0QW5jaG9yVmlldygpLAorICAgICAgICAgICAgICAgICAgICBtRHJvcERvd25Ib3Jpem9udGFsT2Zmc2V0LCBtRHJvcERvd25WZXJ0aWNhbE9mZnNldCk7CisgICAgICAgICAgICBtRHJvcERvd25MaXN0LnNldFNlbGVjdGlvbihMaXN0Vmlldy5JTlZBTElEX1BPU0lUSU9OKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKCFtTW9kYWwgfHwgbURyb3BEb3duTGlzdC5pc0luVG91Y2hNb2RlKCkpIHsKKyAgICAgICAgICAgICAgICBjbGVhckxpc3RTZWxlY3Rpb24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghbU1vZGFsKSB7CisgICAgICAgICAgICAgICAgbUhhbmRsZXIucG9zdChtSGlkZVNlbGVjdG9yKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIERpc21pc3MgdGhlIHBvcHVwIHdpbmRvdy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBkaXNtaXNzKCkgeworICAgICAgICBtUG9wdXAuZGlzbWlzcygpOworICAgICAgICByZW1vdmVQcm9tcHRWaWV3KCk7CisgICAgICAgIG1Qb3B1cC5zZXRDb250ZW50VmlldyhudWxsKTsKKyAgICAgICAgbURyb3BEb3duTGlzdCA9IG51bGw7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHJlbW92ZVByb21wdFZpZXcoKSB7CisgICAgICAgIGlmIChtUHJvbXB0VmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICBmaW5hbCBWaWV3UGFyZW50IHBhcmVudCA9IG1Qcm9tcHRWaWV3LmdldFBhcmVudCgpOworICAgICAgICAgICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIFZpZXdHcm91cCkgeworICAgICAgICAgICAgICAgIGZpbmFsIFZpZXdHcm91cCBncm91cCA9IChWaWV3R3JvdXApIHBhcmVudDsKKyAgICAgICAgICAgICAgICBncm91cC5yZW1vdmVWaWV3KG1Qcm9tcHRWaWV3KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnRyb2wgaG93IHRoZSBwb3B1cCBvcGVyYXRlcyB3aXRoIGFuIGlucHV0IG1ldGhvZDogb25lIG9mCisgICAgICoge0BsaW5rICNJTlBVVF9NRVRIT0RfRlJPTV9GT0NVU0FCTEV9LCB7QGxpbmsgI0lOUFVUX01FVEhPRF9ORUVERUR9LAorICAgICAqIG9yIHtAbGluayAjSU5QVVRfTUVUSE9EX05PVF9ORUVERUR9LgorICAgICAqIAorICAgICAqIDxwPklmIHRoZSBwb3B1cCBpcyBzaG93aW5nLCBjYWxsaW5nIHRoaXMgbWV0aG9kIHdpbGwgdGFrZSBlZmZlY3Qgb25seQorICAgICAqIHRoZSBuZXh0IHRpbWUgdGhlIHBvcHVwIGlzIHNob3duIG9yIHRocm91Z2ggYSBtYW51YWwgY2FsbCB0byB0aGUge0BsaW5rICNzaG93KCl9CisgICAgICogbWV0aG9kLjwvcD4KKyAgICAgKiAKKyAgICAgKiBAc2VlICNnZXRJbnB1dE1ldGhvZE1vZGUoKQorICAgICAqIEBzZWUgI3Nob3coKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldElucHV0TWV0aG9kTW9kZShpbnQgbW9kZSkgeworICAgICAgICBtUG9wdXAuc2V0SW5wdXRNZXRob2RNb2RlKG1vZGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgY3VycmVudCB2YWx1ZSBpbiB7QGxpbmsgI3NldElucHV0TWV0aG9kTW9kZShpbnQpfS4KKyAgICAgKiAKKyAgICAgKiBAc2VlICNzZXRJbnB1dE1ldGhvZE1vZGUoaW50KQorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0SW5wdXRNZXRob2RNb2RlKCkgeworICAgICAgICByZXR1cm4gbVBvcHVwLmdldElucHV0TWV0aG9kTW9kZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgc2VsZWN0ZWQgcG9zaXRpb24gb2YgdGhlIGxpc3QuCisgICAgICogT25seSB2YWxpZCB3aGVuIHtAbGluayAjaXNTaG93aW5nKCl9ID09IHtAY29kZSB0cnVlfS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcG9zaXRpb24gTGlzdCBwb3NpdGlvbiB0byBzZXQgYXMgc2VsZWN0ZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKGludCBwb3NpdGlvbikgeworICAgICAgICBEcm9wRG93bkxpc3RWaWV3IGxpc3QgPSBtRHJvcERvd25MaXN0OworICAgICAgICBpZiAoaXNTaG93aW5nKCkgJiYgbGlzdCAhPSBudWxsKSB7CisgICAgICAgICAgICBsaXN0Lm1MaXN0U2VsZWN0aW9uSGlkZGVuID0gZmFsc2U7CisgICAgICAgICAgICBsaXN0LnNldFNlbGVjdGlvbihwb3NpdGlvbik7CisgICAgICAgICAgICBpZiAobGlzdC5nZXRDaG9pY2VNb2RlKCkgIT0gTGlzdFZpZXcuQ0hPSUNFX01PREVfTk9ORSkgeworICAgICAgICAgICAgICAgIGxpc3Quc2V0SXRlbUNoZWNrZWQocG9zaXRpb24sIHRydWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xlYXIgYW55IGN1cnJlbnQgbGlzdCBzZWxlY3Rpb24uCisgICAgICogT25seSB2YWxpZCB3aGVuIHtAbGluayAjaXNTaG93aW5nKCl9ID09IHtAY29kZSB0cnVlfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjbGVhckxpc3RTZWxlY3Rpb24oKSB7CisgICAgICAgIGZpbmFsIERyb3BEb3duTGlzdFZpZXcgbGlzdCA9IG1Ecm9wRG93bkxpc3Q7CisgICAgICAgIGlmIChsaXN0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8vIFdBUk5JTkc6IFBsZWFzZSByZWFkIHRoZSBjb21tZW50IHdoZXJlIG1MaXN0U2VsZWN0aW9uSGlkZGVuIGlzIGRlY2xhcmVkCisgICAgICAgICAgICBsaXN0Lm1MaXN0U2VsZWN0aW9uSGlkZGVuID0gdHJ1ZTsKKyAgICAgICAgICAgIGxpc3QuaGlkZVNlbGVjdG9yKCk7CisgICAgICAgICAgICBsaXN0LnJlcXVlc3RMYXlvdXQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBwb3B1cCBpcyBjdXJyZW50bHkgc2hvd2luZywge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNTaG93aW5nKCkgeworICAgICAgICByZXR1cm4gbVBvcHVwLmlzU2hvd2luZygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoaXMgcG9wdXAgaXMgY29uZmlndXJlZCB0byBhc3N1bWUgdGhlIHVzZXIgZG9lcyBub3QgbmVlZAorICAgICAqIHRvIGludGVyYWN0IHdpdGggdGhlIElNRSB3aGlsZSBpdCBpcyBzaG93aW5nLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0lucHV0TWV0aG9kTm90TmVlZGVkKCkgeworICAgICAgICByZXR1cm4gbVBvcHVwLmdldElucHV0TWV0aG9kTW9kZSgpID09IElOUFVUX01FVEhPRF9OT1RfTkVFREVEOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBlcmZvcm0gYW4gaXRlbSBjbGljayBvcGVyYXRpb24gb24gdGhlIHNwZWNpZmllZCBsaXN0IGFkYXB0ZXIgcG9zaXRpb24uCisgICAgICogCisgICAgICogQHBhcmFtIHBvc2l0aW9uIEFkYXB0ZXIgcG9zaXRpb24gZm9yIHBlcmZvcm1pbmcgdGhlIGNsaWNrCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBjbGljayBhY3Rpb24gY291bGQgYmUgcGVyZm9ybWVkLCBmYWxzZSBpZiBub3QuCisgICAgICogICAgICAgICAoZS5nLiBpZiB0aGUgcG9wdXAgd2FzIG5vdCBzaG93aW5nLCB0aGlzIG1ldGhvZCB3b3VsZCByZXR1cm4gZmFsc2UuKQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHBlcmZvcm1JdGVtQ2xpY2soaW50IHBvc2l0aW9uKSB7CisgICAgICAgIGlmIChpc1Nob3dpbmcoKSkgeworICAgICAgICAgICAgaWYgKG1JdGVtQ2xpY2tMaXN0ZW5lciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZmluYWwgRHJvcERvd25MaXN0VmlldyBsaXN0ID0gbURyb3BEb3duTGlzdDsKKyAgICAgICAgICAgICAgICBmaW5hbCBWaWV3IGNoaWxkID0gbGlzdC5nZXRDaGlsZEF0KHBvc2l0aW9uIC0gbGlzdC5nZXRGaXJzdFZpc2libGVQb3NpdGlvbigpKTsKKyAgICAgICAgICAgICAgICBtSXRlbUNsaWNrTGlzdGVuZXIub25JdGVtQ2xpY2sobGlzdCwgY2hpbGQsIHBvc2l0aW9uLCBjaGlsZC5nZXRJZCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgaXRlbSBvciBudWxsIGlmIHRoZSBwb3B1cCBpcyBub3Qgc2hvd2luZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGdldFNlbGVjdGVkSXRlbSgpIHsKKyAgICAgICAgaWYgKCFpc1Nob3dpbmcoKSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1Ecm9wRG93bkxpc3QuZ2V0U2VsZWN0ZWRJdGVtKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBUaGUgcG9zaXRpb24gb2YgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBpdGVtIG9yIHtAbGluayBMaXN0VmlldyNJTlZBTElEX1BPU0lUSU9OfQorICAgICAqIGlmIHtAbGluayAjaXNTaG93aW5nKCl9ID09IHtAY29kZSBmYWxzZX0uCisgICAgICogCisgICAgICogQHNlZSBMaXN0VmlldyNnZXRTZWxlY3RlZEl0ZW1Qb3NpdGlvbigpCisgICAgICovCisgICAgcHVibGljIGludCBnZXRTZWxlY3RlZEl0ZW1Qb3NpdGlvbigpIHsKKyAgICAgICAgaWYgKCFpc1Nob3dpbmcoKSkgeworICAgICAgICAgICAgcmV0dXJuIExpc3RWaWV3LklOVkFMSURfUE9TSVRJT047CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1Ecm9wRG93bkxpc3QuZ2V0U2VsZWN0ZWRJdGVtUG9zaXRpb24oKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFRoZSBJRCBvZiB0aGUgY3VycmVudGx5IHNlbGVjdGVkIGl0ZW0gb3Ige0BsaW5rIExpc3RWaWV3I0lOVkFMSURfUk9XX0lEfQorICAgICAqIGlmIHtAbGluayAjaXNTaG93aW5nKCl9ID09IHtAY29kZSBmYWxzZX0uCisgICAgICogCisgICAgICogQHNlZSBMaXN0VmlldyNnZXRTZWxlY3RlZEl0ZW1JZCgpCisgICAgICovCisgICAgcHVibGljIGxvbmcgZ2V0U2VsZWN0ZWRJdGVtSWQoKSB7CisgICAgICAgIGlmICghaXNTaG93aW5nKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBMaXN0Vmlldy5JTlZBTElEX1JPV19JRDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbURyb3BEb3duTGlzdC5nZXRTZWxlY3RlZEl0ZW1JZCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gVGhlIFZpZXcgZm9yIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgaXRlbSBvciBudWxsIGlmCisgICAgICoge0BsaW5rICNpc1Nob3dpbmcoKX0gPT0ge0Bjb2RlIGZhbHNlfS4KKyAgICAgKiAKKyAgICAgKiBAc2VlIExpc3RWaWV3I2dldFNlbGVjdGVkVmlldygpCisgICAgICovCisgICAgcHVibGljIFZpZXcgZ2V0U2VsZWN0ZWRWaWV3KCkgeworICAgICAgICBpZiAoIWlzU2hvd2luZygpKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbURyb3BEb3duTGlzdC5nZXRTZWxlY3RlZFZpZXcoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFRoZSB7QGxpbmsgTGlzdFZpZXd9IGRpc3BsYXllZCB3aXRoaW4gdGhlIHBvcHVwIHdpbmRvdy4KKyAgICAgKiBPbmx5IHZhbGlkIHdoZW4ge0BsaW5rICNpc1Nob3dpbmcoKX0gPT0ge0Bjb2RlIHRydWV9LgorICAgICAqLworICAgIHB1YmxpYyBMaXN0VmlldyBnZXRMaXN0VmlldygpIHsKKyAgICAgICAgcmV0dXJuIG1Ecm9wRG93bkxpc3Q7CisgICAgfQorCisgICAgLyoqCisgICAgICogRmlsdGVyIGtleSBkb3duIGV2ZW50cy4gQnkgZm9yd2FyZGluZyBrZXkgdXAgZXZlbnRzIHRvIHRoaXMgZnVuY3Rpb24sCisgICAgICogdmlld3MgdXNpbmcgbm9uLW1vZGFsIExpc3RQb3B1cFdpbmRvdyBjYW4gaGF2ZSBpdCBoYW5kbGUga2V5IHNlbGVjdGlvbiBvZiBpdGVtcy4KKyAgICAgKiAgCisgICAgICogQHBhcmFtIGtleUNvZGUga2V5Q29kZSBwYXJhbSBwYXNzZWQgdG8gdGhlIGhvc3QgdmlldydzIG9uS2V5RG93bgorICAgICAqIEBwYXJhbSBldmVudCBldmVudCBwYXJhbSBwYXNzZWQgdG8gdGhlIGhvc3QgdmlldydzIG9uS2V5RG93bgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZXZlbnQgd2FzIGhhbmRsZWQsIGZhbHNlIGlmIGl0IHdhcyBpZ25vcmVkLgorICAgICAqIAorICAgICAqIEBzZWUgI3NldE1vZGFsKGJvb2xlYW4pCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gb25LZXlEb3duKGludCBrZXlDb2RlLCBLZXlFdmVudCBldmVudCkgeworICAgICAgICAvLyB3aGVuIHRoZSBkcm9wIGRvd24gaXMgc2hvd24sIHdlIGRyaXZlIGl0IGRpcmVjdGx5CisgICAgICAgIGlmIChpc1Nob3dpbmcoKSkgeworICAgICAgICAgICAgLy8gdGhlIGtleSBldmVudHMgYXJlIGZvcndhcmRlZCB0byB0aGUgbGlzdCBpbiB0aGUgZHJvcCBkb3duIHZpZXcKKyAgICAgICAgICAgIC8vIG5vdGUgdGhhdCBMaXN0VmlldyBoYW5kbGVzIHNwYWNlIGJ1dCB3ZSBkb24ndCB3YW50IHRoYXQgdG8gaGFwcGVuCisgICAgICAgICAgICAvLyBhbHNvIGlmIHNlbGVjdGlvbiBpcyBub3QgY3VycmVudGx5IGluIHRoZSBkcm9wIGRvd24sIHRoZW4gZG9uJ3QKKyAgICAgICAgICAgIC8vIGxldCBjZW50ZXIgb3IgZW50ZXIgcHJlc3NlcyBnbyB0aGVyZSBzaW5jZSB0aGF0IHdvdWxkIGNhdXNlIGl0CisgICAgICAgICAgICAvLyB0byBzZWxlY3Qgb25lIG9mIGl0cyBpdGVtcworICAgICAgICAgICAgaWYgKGtleUNvZGUgIT0gS2V5RXZlbnQuS0VZQ09ERV9TUEFDRQorICAgICAgICAgICAgICAgICAgICAmJiAobURyb3BEb3duTGlzdC5nZXRTZWxlY3RlZEl0ZW1Qb3NpdGlvbigpID49IDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoa2V5Q29kZSAhPSBLZXlFdmVudC5LRVlDT0RFX0VOVEVSCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBrZXlDb2RlICE9IEtleUV2ZW50LktFWUNPREVfRFBBRF9DRU5URVIpKSkgeworICAgICAgICAgICAgICAgIGludCBjdXJJbmRleCA9IG1Ecm9wRG93bkxpc3QuZ2V0U2VsZWN0ZWRJdGVtUG9zaXRpb24oKTsKKyAgICAgICAgICAgICAgICBib29sZWFuIGNvbnN1bWVkOworCisgICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBiZWxvdyA9ICFtUG9wdXAuaXNBYm92ZUFuY2hvcigpOworCisgICAgICAgICAgICAgICAgZmluYWwgTGlzdEFkYXB0ZXIgYWRhcHRlciA9IG1BZGFwdGVyOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGJvb2xlYW4gYWxsRW5hYmxlZDsKKyAgICAgICAgICAgICAgICBpbnQgZmlyc3RJdGVtID0gSW50ZWdlci5NQVhfVkFMVUU7CisgICAgICAgICAgICAgICAgaW50IGxhc3RJdGVtID0gSW50ZWdlci5NSU5fVkFMVUU7CisKKyAgICAgICAgICAgICAgICBpZiAoYWRhcHRlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGFsbEVuYWJsZWQgPSBhZGFwdGVyLmFyZUFsbEl0ZW1zRW5hYmxlZCgpOworICAgICAgICAgICAgICAgICAgICBmaXJzdEl0ZW0gPSBhbGxFbmFibGVkID8gMCA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbURyb3BEb3duTGlzdC5sb29rRm9yU2VsZWN0YWJsZVBvc2l0aW9uKDAsIHRydWUpOworICAgICAgICAgICAgICAgICAgICBsYXN0SXRlbSA9IGFsbEVuYWJsZWQgPyBhZGFwdGVyLmdldENvdW50KCkgLSAxIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRHJvcERvd25MaXN0Lmxvb2tGb3JTZWxlY3RhYmxlUG9zaXRpb24oYWRhcHRlci5nZXRDb3VudCgpIC0gMSwgZmFsc2UpOyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGlmICgoYmVsb3cgJiYga2V5Q29kZSA9PSBLZXlFdmVudC5LRVlDT0RFX0RQQURfVVAgJiYgY3VySW5kZXggPD0gZmlyc3RJdGVtKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgKCFiZWxvdyAmJiBrZXlDb2RlID09IEtleUV2ZW50LktFWUNPREVfRFBBRF9ET1dOICYmIGN1ckluZGV4ID49IGxhc3RJdGVtKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBXaGVuIHRoZSBzZWxlY3Rpb24gaXMgYXQgdGhlIHRvcCwgd2UgYmxvY2sgdGhlIGtleQorICAgICAgICAgICAgICAgICAgICAvLyBldmVudCB0byBwcmV2ZW50IGZvY3VzIGZyb20gbW92aW5nLgorICAgICAgICAgICAgICAgICAgICBjbGVhckxpc3RTZWxlY3Rpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgbVBvcHVwLnNldElucHV0TWV0aG9kTW9kZShQb3B1cFdpbmRvdy5JTlBVVF9NRVRIT0RfTkVFREVEKTsKKyAgICAgICAgICAgICAgICAgICAgc2hvdygpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyBXQVJOSU5HOiBQbGVhc2UgcmVhZCB0aGUgY29tbWVudCB3aGVyZSBtTGlzdFNlbGVjdGlvbkhpZGRlbgorICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICBpcyBkZWNsYXJlZAorICAgICAgICAgICAgICAgICAgICBtRHJvcERvd25MaXN0Lm1MaXN0U2VsZWN0aW9uSGlkZGVuID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY29uc3VtZWQgPSBtRHJvcERvd25MaXN0Lm9uS2V5RG93bihrZXlDb2RlLCBldmVudCk7CisgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICJLZXkgZG93bjogY29kZT0iICsga2V5Q29kZSArICIgbGlzdCBjb25zdW1lZD0iICsgY29uc3VtZWQpOworCisgICAgICAgICAgICAgICAgaWYgKGNvbnN1bWVkKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIElmIGl0IGhhbmRsZWQgdGhlIGtleSBldmVudCwgdGhlbiB0aGUgdXNlciBpcworICAgICAgICAgICAgICAgICAgICAvLyBuYXZpZ2F0aW5nIGluIHRoZSBsaXN0LCBzbyB3ZSBzaG91bGQgcHV0IGl0IGluIGZyb250LgorICAgICAgICAgICAgICAgICAgICBtUG9wdXAuc2V0SW5wdXRNZXRob2RNb2RlKFBvcHVwV2luZG93LklOUFVUX01FVEhPRF9OT1RfTkVFREVEKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gSGVyZSdzIGEgbGl0dGxlIHRyaWNrIHdlIG5lZWQgdG8gZG8gdG8gbWFrZSBzdXJlIHRoYXQKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGxpc3QgdmlldyBpcyBhY3R1YWxseSBzaG93aW5nIGl0cyBmb2N1cyBpbmRpY2F0b3IsCisgICAgICAgICAgICAgICAgICAgIC8vIGJ5IGVuc3VyaW5nIGl0IGhhcyBmb2N1cyBhbmQgZ2V0dGluZyBpdHMgd2luZG93IG91dAorICAgICAgICAgICAgICAgICAgICAvLyBvZiB0b3VjaCBtb2RlLgorICAgICAgICAgICAgICAgICAgICBtRHJvcERvd25MaXN0LnJlcXVlc3RGb2N1c0Zyb21Ub3VjaCgpOworICAgICAgICAgICAgICAgICAgICBzaG93KCk7CisKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChrZXlDb2RlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBhdm9pZCBwYXNzaW5nIHRoZSBmb2N1cyBmcm9tIHRoZSB0ZXh0IHZpZXcgdG8gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZXh0IGNvbXBvbmVudAorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBLZXlFdmVudC5LRVlDT0RFX0VOVEVSOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBLZXlFdmVudC5LRVlDT0RFX0RQQURfQ0VOVEVSOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBLZXlFdmVudC5LRVlDT0RFX0RQQURfRE9XTjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX1VQOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGJlbG93ICYmIGtleUNvZGUgPT0gS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0RPV04pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdoZW4gdGhlIHNlbGVjdGlvbiBpcyBhdCB0aGUgYm90dG9tLCB3ZSBibG9jayB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV2ZW50IHRvIGF2b2lkIGdvaW5nIHRvIHRoZSBuZXh0IGZvY3VzYWJsZSB3aWRnZXQKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJJbmRleCA9PSBsYXN0SXRlbSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFiZWxvdyAmJiBrZXlDb2RlID09IEtleUV2ZW50LktFWUNPREVfRFBBRF9VUCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1ckluZGV4ID09IGZpcnN0SXRlbSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogRmlsdGVyIGtleSBkb3duIGV2ZW50cy4gQnkgZm9yd2FyZGluZyBrZXkgdXAgZXZlbnRzIHRvIHRoaXMgZnVuY3Rpb24sCisgICAgICogdmlld3MgdXNpbmcgbm9uLW1vZGFsIExpc3RQb3B1cFdpbmRvdyBjYW4gaGF2ZSBpdCBoYW5kbGUga2V5IHNlbGVjdGlvbiBvZiBpdGVtcy4KKyAgICAgKiAgCisgICAgICogQHBhcmFtIGtleUNvZGUga2V5Q29kZSBwYXJhbSBwYXNzZWQgdG8gdGhlIGhvc3QgdmlldydzIG9uS2V5VXAKKyAgICAgKiBAcGFyYW0gZXZlbnQgZXZlbnQgcGFyYW0gcGFzc2VkIHRvIHRoZSBob3N0IHZpZXcncyBvbktleVVwCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBldmVudCB3YXMgaGFuZGxlZCwgZmFsc2UgaWYgaXQgd2FzIGlnbm9yZWQuCisgICAgICogCisgICAgICogQHNlZSAjc2V0TW9kYWwoYm9vbGVhbikKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBvbktleVVwKGludCBrZXlDb2RlLCBLZXlFdmVudCBldmVudCkgeworICAgICAgICBpZiAoaXNTaG93aW5nKCkgJiYgbURyb3BEb3duTGlzdC5nZXRTZWxlY3RlZEl0ZW1Qb3NpdGlvbigpID49IDApIHsKKyAgICAgICAgICAgIGJvb2xlYW4gY29uc3VtZWQgPSBtRHJvcERvd25MaXN0Lm9uS2V5VXAoa2V5Q29kZSwgZXZlbnQpOworICAgICAgICAgICAgaWYgKGNvbnN1bWVkKSB7CisgICAgICAgICAgICAgICAgc3dpdGNoIChrZXlDb2RlKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBsaXN0IGFjY2VwdHMgdGhlIGtleSBldmVudHMgYW5kIHRoZSBrZXkgZXZlbnQKKyAgICAgICAgICAgICAgICAgICAgLy8gd2FzIGEgY2xpY2ssIHRoZSB0ZXh0IHZpZXcgZ2V0cyB0aGUgc2VsZWN0ZWQgaXRlbQorICAgICAgICAgICAgICAgICAgICAvLyBmcm9tIHRoZSBkcm9wIGRvd24gYXMgaXRzIGNvbnRlbnQKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBLZXlFdmVudC5LRVlDT0RFX0VOVEVSOgorICAgICAgICAgICAgICAgICAgICBjYXNlIEtleUV2ZW50LktFWUNPREVfRFBBRF9DRU5URVI6CisgICAgICAgICAgICAgICAgICAgICAgICBkaXNtaXNzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gY29uc3VtZWQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZpbHRlciBwcmUtSU1FIGtleSBldmVudHMuIEJ5IGZvcndhcmRpbmcge0BsaW5rIFZpZXcjb25LZXlQcmVJbWUoaW50LCBLZXlFdmVudCl9CisgICAgICogZXZlbnRzIHRvIHRoaXMgZnVuY3Rpb24sIHZpZXdzIHVzaW5nIExpc3RQb3B1cFdpbmRvdyBjYW4gaGF2ZSBpdCBkaXNtaXNzIHRoZSBwb3B1cAorICAgICAqIHdoZW4gdGhlIGJhY2sga2V5IGlzIHByZXNzZWQuCisgICAgICogIAorICAgICAqIEBwYXJhbSBrZXlDb2RlIGtleUNvZGUgcGFyYW0gcGFzc2VkIHRvIHRoZSBob3N0IHZpZXcncyBvbktleVByZUltZQorICAgICAqIEBwYXJhbSBldmVudCBldmVudCBwYXJhbSBwYXNzZWQgdG8gdGhlIGhvc3QgdmlldydzIG9uS2V5UHJlSW1lCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBldmVudCB3YXMgaGFuZGxlZCwgZmFsc2UgaWYgaXQgd2FzIGlnbm9yZWQuCisgICAgICogCisgICAgICogQHNlZSAjc2V0TW9kYWwoYm9vbGVhbikKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBvbktleVByZUltZShpbnQga2V5Q29kZSwgS2V5RXZlbnQgZXZlbnQpIHsKKyAgICAgICAgaWYgKGtleUNvZGUgPT0gS2V5RXZlbnQuS0VZQ09ERV9CQUNLICYmIGlzU2hvd2luZygpKSB7CisgICAgICAgICAgICAvLyBzcGVjaWFsIGNhc2UgZm9yIHRoZSBiYWNrIGtleSwgd2UgZG8gbm90IGV2ZW4gdHJ5IHRvIHNlbmQgaXQKKyAgICAgICAgICAgIC8vIHRvIHRoZSBkcm9wIGRvd24gbGlzdCBidXQgaW5zdGVhZCwgY29uc3VtZSBpdCBpbW1lZGlhdGVseQorICAgICAgICAgICAgZmluYWwgVmlldyBhbmNob3JWaWV3ID0gbURyb3BEb3duQW5jaG9yVmlldzsKKyAgICAgICAgICAgIGlmIChldmVudC5nZXRBY3Rpb24oKSA9PSBLZXlFdmVudC5BQ1RJT05fRE9XTiAmJiBldmVudC5nZXRSZXBlYXRDb3VudCgpID09IDApIHsKKyAgICAgICAgICAgICAgICBhbmNob3JWaWV3LmdldEtleURpc3BhdGNoZXJTdGF0ZSgpLnN0YXJ0VHJhY2tpbmcoZXZlbnQsIHRoaXMpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfSBlbHNlIGlmIChldmVudC5nZXRBY3Rpb24oKSA9PSBLZXlFdmVudC5BQ1RJT05fVVApIHsKKyAgICAgICAgICAgICAgICBhbmNob3JWaWV3LmdldEtleURpc3BhdGNoZXJTdGF0ZSgpLmhhbmRsZVVwRXZlbnQoZXZlbnQpOworICAgICAgICAgICAgICAgIGlmIChldmVudC5pc1RyYWNraW5nKCkgJiYgIWV2ZW50LmlzQ2FuY2VsZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBkaXNtaXNzKCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogPHA+QnVpbGRzIHRoZSBwb3B1cCB3aW5kb3cncyBjb250ZW50IGFuZCByZXR1cm5zIHRoZSBoZWlnaHQgdGhlIHBvcHVwCisgICAgICogc2hvdWxkIGhhdmUuIFJldHVybnMgLTEgd2hlbiB0aGUgY29udGVudCBhbHJlYWR5IGV4aXN0cy48L3A+CisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBjb250ZW50J3MgaGVpZ2h0IG9yIC0xIGlmIGNvbnRlbnQgYWxyZWFkeSBleGlzdHMKKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBidWlsZERyb3BEb3duKCkgeworICAgICAgICBWaWV3R3JvdXAgZHJvcERvd25WaWV3OworICAgICAgICBpbnQgb3RoZXJIZWlnaHRzID0gMDsKKworICAgICAgICBpZiAobURyb3BEb3duTGlzdCA9PSBudWxsKSB7CisgICAgICAgICAgICBDb250ZXh0IGNvbnRleHQgPSBtQ29udGV4dDsKKworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBUaGlzIFJ1bm5hYmxlIGV4aXN0cyBmb3IgdGhlIHNvbGUgcHVycG9zZSBvZiBjaGVja2luZyBpZiB0aGUgdmlldyBsYXlvdXQgaGFzIGdvdAorICAgICAgICAgICAgICogY29tcGxldGVkIGFuZCBpZiBzbyBjYWxsIHNob3dEcm9wRG93biB0byBkaXNwbGF5IHRoZSBkcm9wIGRvd24uIFRoaXMgaXMgdXNlZCB0byBzaG93CisgICAgICAgICAgICAgKiB0aGUgZHJvcCBkb3duIGFzIHNvb24gYXMgcG9zc2libGUgYWZ0ZXIgdXNlciBvcGVucyB1cCB0aGUgc2VhcmNoIGRpYWxvZywgd2l0aG91dAorICAgICAgICAgICAgICogd2FpdGluZyBmb3IgdGhlIG5vcm1hbCBVSSBwaXBlbGluZSB0byBkbyBpdCdzIGpvYiB3aGljaCBpcyBzbG93ZXIgdGhhbiB0aGlzIG1ldGhvZC4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgbVNob3dEcm9wRG93blJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVmlldyBsYXlvdXQgc2hvdWxkIGJlIGFsbCBkb25lIGJlZm9yZSBkaXNwbGF5aW5nIHRoZSBkcm9wIGRvd24uCisgICAgICAgICAgICAgICAgICAgIFZpZXcgdmlldyA9IGdldEFuY2hvclZpZXcoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHZpZXcgIT0gbnVsbCAmJiB2aWV3LmdldFdpbmRvd1Rva2VuKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2hvdygpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgbURyb3BEb3duTGlzdCA9IG5ldyBEcm9wRG93bkxpc3RWaWV3KGNvbnRleHQsICFtTW9kYWwpOworICAgICAgICAgICAgaWYgKG1Ecm9wRG93bkxpc3RIaWdobGlnaHQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1Ecm9wRG93bkxpc3Quc2V0U2VsZWN0b3IobURyb3BEb3duTGlzdEhpZ2hsaWdodCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtRHJvcERvd25MaXN0LnNldEFkYXB0ZXIobUFkYXB0ZXIpOworICAgICAgICAgICAgbURyb3BEb3duTGlzdC5zZXRWZXJ0aWNhbEZhZGluZ0VkZ2VFbmFibGVkKHRydWUpOworICAgICAgICAgICAgbURyb3BEb3duTGlzdC5zZXRPbkl0ZW1DbGlja0xpc3RlbmVyKG1JdGVtQ2xpY2tMaXN0ZW5lcik7CisgICAgICAgICAgICBtRHJvcERvd25MaXN0LnNldEZvY3VzYWJsZSh0cnVlKTsKKyAgICAgICAgICAgIG1Ecm9wRG93bkxpc3Quc2V0Rm9jdXNhYmxlSW5Ub3VjaE1vZGUodHJ1ZSk7CisgICAgICAgICAgICBtRHJvcERvd25MaXN0LnNldE9uSXRlbVNlbGVjdGVkTGlzdGVuZXIobmV3IEFkYXB0ZXJWaWV3Lk9uSXRlbVNlbGVjdGVkTGlzdGVuZXIoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25JdGVtU2VsZWN0ZWQoQWRhcHRlclZpZXc8Pz4gcGFyZW50LCBWaWV3IHZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcG9zaXRpb24sIGxvbmcgaWQpIHsKKworICAgICAgICAgICAgICAgICAgICBpZiAocG9zaXRpb24gIT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIERyb3BEb3duTGlzdFZpZXcgZHJvcERvd25MaXN0ID0gbURyb3BEb3duTGlzdDsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRyb3BEb3duTGlzdCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJvcERvd25MaXN0Lm1MaXN0U2VsZWN0aW9uSGlkZGVuID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbk5vdGhpbmdTZWxlY3RlZChBZGFwdGVyVmlldzw/PiBwYXJlbnQpIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIG1Ecm9wRG93bkxpc3Quc2V0T25TY3JvbGxMaXN0ZW5lcihtU2Nyb2xsTGlzdGVuZXIpOworCisgICAgICAgICAgICBpZiAobUl0ZW1TZWxlY3RlZExpc3RlbmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtRHJvcERvd25MaXN0LnNldE9uSXRlbVNlbGVjdGVkTGlzdGVuZXIobUl0ZW1TZWxlY3RlZExpc3RlbmVyKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZHJvcERvd25WaWV3ID0gbURyb3BEb3duTGlzdDsKKworICAgICAgICAgICAgVmlldyBoaW50VmlldyA9IG1Qcm9tcHRWaWV3OworICAgICAgICAgICAgaWYgKGhpbnRWaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAvLyBpZiBhbiBoaW50IGhhcyBiZWVuIHNwZWNpZmllZCwgd2UgYWNjb21vZGF0ZSBtb3JlIHNwYWNlIGZvciBpdCBhbmQKKyAgICAgICAgICAgICAgICAvLyBhZGQgYSB0ZXh0IHZpZXcgaW4gdGhlIGRyb3AgZG93biBtZW51LCBhdCB0aGUgYm90dG9tIG9mIHRoZSBsaXN0CisgICAgICAgICAgICAgICAgTGluZWFyTGF5b3V0IGhpbnRDb250YWluZXIgPSBuZXcgTGluZWFyTGF5b3V0KGNvbnRleHQpOworICAgICAgICAgICAgICAgIGhpbnRDb250YWluZXIuc2V0T3JpZW50YXRpb24oTGluZWFyTGF5b3V0LlZFUlRJQ0FMKTsKKworICAgICAgICAgICAgICAgIExpbmVhckxheW91dC5MYXlvdXRQYXJhbXMgaGludFBhcmFtcyA9IG5ldyBMaW5lYXJMYXlvdXQuTGF5b3V0UGFyYW1zKAorICAgICAgICAgICAgICAgICAgICAgICAgVmlld0dyb3VwLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQsIDAsIDEuMGYKKyAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHN3aXRjaCAobVByb21wdFBvc2l0aW9uKSB7CisgICAgICAgICAgICAgICAgY2FzZSBQT1NJVElPTl9QUk9NUFRfQkVMT1c6CisgICAgICAgICAgICAgICAgICAgIGhpbnRDb250YWluZXIuYWRkVmlldyhkcm9wRG93blZpZXcsIGhpbnRQYXJhbXMpOworICAgICAgICAgICAgICAgICAgICBoaW50Q29udGFpbmVyLmFkZFZpZXcoaGludFZpZXcpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgY2FzZSBQT1NJVElPTl9QUk9NUFRfQUJPVkU6CisgICAgICAgICAgICAgICAgICAgIGhpbnRDb250YWluZXIuYWRkVmlldyhoaW50Vmlldyk7CisgICAgICAgICAgICAgICAgICAgIGhpbnRDb250YWluZXIuYWRkVmlldyhkcm9wRG93blZpZXcsIGhpbnRQYXJhbXMpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiSW52YWxpZCBoaW50IHBvc2l0aW9uICIgKyBtUHJvbXB0UG9zaXRpb24pOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBtZWFzdXJlIHRoZSBoaW50J3MgaGVpZ2h0IHRvIGZpbmQgaG93IG11Y2ggbW9yZSB2ZXJ0aWNhbCBzcGFjZQorICAgICAgICAgICAgICAgIC8vIHdlIG5lZWQgdG8gYWRkIHRvIHRoZSBkcm9wIGRvd24ncyBoZWlnaHQKKyAgICAgICAgICAgICAgICBpbnQgd2lkdGhTcGVjID0gTWVhc3VyZVNwZWMubWFrZU1lYXN1cmVTcGVjKG1Ecm9wRG93bldpZHRoLCBNZWFzdXJlU3BlYy5BVF9NT1NUKTsKKyAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0U3BlYyA9IE1lYXN1cmVTcGVjLlVOU1BFQ0lGSUVEOworICAgICAgICAgICAgICAgIGhpbnRWaWV3Lm1lYXN1cmUod2lkdGhTcGVjLCBoZWlnaHRTcGVjKTsKKworICAgICAgICAgICAgICAgIGhpbnRQYXJhbXMgPSAoTGluZWFyTGF5b3V0LkxheW91dFBhcmFtcykgaGludFZpZXcuZ2V0TGF5b3V0UGFyYW1zKCk7CisgICAgICAgICAgICAgICAgb3RoZXJIZWlnaHRzID0gaGludFZpZXcuZ2V0TWVhc3VyZWRIZWlnaHQoKSArIGhpbnRQYXJhbXMudG9wTWFyZ2luCisgICAgICAgICAgICAgICAgICAgICAgICArIGhpbnRQYXJhbXMuYm90dG9tTWFyZ2luOworCisgICAgICAgICAgICAgICAgZHJvcERvd25WaWV3ID0gaGludENvbnRhaW5lcjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbVBvcHVwLnNldENvbnRlbnRWaWV3KGRyb3BEb3duVmlldyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkcm9wRG93blZpZXcgPSAoVmlld0dyb3VwKSBtUG9wdXAuZ2V0Q29udGVudFZpZXcoKTsKKyAgICAgICAgICAgIGZpbmFsIFZpZXcgdmlldyA9IG1Qcm9tcHRWaWV3OworICAgICAgICAgICAgaWYgKHZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIExpbmVhckxheW91dC5MYXlvdXRQYXJhbXMgaGludFBhcmFtcyA9CisgICAgICAgICAgICAgICAgICAgICAgICAoTGluZWFyTGF5b3V0LkxheW91dFBhcmFtcykgdmlldy5nZXRMYXlvdXRQYXJhbXMoKTsKKyAgICAgICAgICAgICAgICBvdGhlckhlaWdodHMgPSB2aWV3LmdldE1lYXN1cmVkSGVpZ2h0KCkgKyBoaW50UGFyYW1zLnRvcE1hcmdpbgorICAgICAgICAgICAgICAgICAgICAgICAgKyBoaW50UGFyYW1zLmJvdHRvbU1hcmdpbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIE1heCBoZWlnaHQgYXZhaWxhYmxlIG9uIHRoZSBzY3JlZW4gZm9yIGEgcG9wdXAuCisgICAgICAgIGJvb2xlYW4gaWdub3JlQm90dG9tRGVjb3JhdGlvbnMgPQorICAgICAgICAgICAgICAgIG1Qb3B1cC5nZXRJbnB1dE1ldGhvZE1vZGUoKSA9PSBQb3B1cFdpbmRvdy5JTlBVVF9NRVRIT0RfTk9UX05FRURFRDsKKyAgICAgICAgZmluYWwgaW50IG1heEhlaWdodCA9IG1Qb3B1cC5nZXRNYXhBdmFpbGFibGVIZWlnaHQoCisgICAgICAgICAgICAgICAgZ2V0QW5jaG9yVmlldygpLCBtRHJvcERvd25WZXJ0aWNhbE9mZnNldCwgaWdub3JlQm90dG9tRGVjb3JhdGlvbnMpOworCisgICAgICAgIC8vIGdldE1heEF2YWlsYWJsZUhlaWdodCgpIHN1YnRyYWN0cyB0aGUgcGFkZGluZywgc28gd2UgcHV0IGl0IGJhY2ssCisgICAgICAgIC8vIHRvIGdldCB0aGUgYXZhaWxhYmxlIGhlaWdodCBmb3IgdGhlIHdob2xlIHdpbmRvdworICAgICAgICBpbnQgcGFkZGluZyA9IDA7CisgICAgICAgIERyYXdhYmxlIGJhY2tncm91bmQgPSBtUG9wdXAuZ2V0QmFja2dyb3VuZCgpOworICAgICAgICBpZiAoYmFja2dyb3VuZCAhPSBudWxsKSB7CisgICAgICAgICAgICBiYWNrZ3JvdW5kLmdldFBhZGRpbmcobVRlbXBSZWN0KTsKKyAgICAgICAgICAgIHBhZGRpbmcgPSBtVGVtcFJlY3QudG9wICsgbVRlbXBSZWN0LmJvdHRvbTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtRHJvcERvd25BbHdheXNWaXNpYmxlIHx8IG1Ecm9wRG93bkhlaWdodCA9PSBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCkgeworICAgICAgICAgICAgcmV0dXJuIG1heEhlaWdodCArIHBhZGRpbmc7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBpbnQgbGlzdENvbnRlbnQgPSBtRHJvcERvd25MaXN0Lm1lYXN1cmVIZWlnaHRPZkNoaWxkcmVuKE1lYXN1cmVTcGVjLlVOU1BFQ0lGSUVELAorICAgICAgICAgICAgICAgIDAsIExpc3RWaWV3Lk5PX1BPU0lUSU9OLCBtYXhIZWlnaHQgLSBvdGhlckhlaWdodHMsIDIpOworICAgICAgICAvLyBhZGQgcGFkZGluZyBvbmx5IGlmIHRoZSBsaXN0IGhhcyBpdGVtcyBpbiBpdCwgdGhhdCB3YXkgd2UgZG9uJ3Qgc2hvdworICAgICAgICAvLyB0aGUgcG9wdXAgaWYgaXQgaXMgbm90IG5lZWRlZAorICAgICAgICBpZiAobGlzdENvbnRlbnQgPiAwKSBvdGhlckhlaWdodHMgKz0gcGFkZGluZzsKKworICAgICAgICByZXR1cm4gbGlzdENvbnRlbnQgKyBvdGhlckhlaWdodHM7CisgICAgfQorCisgICAgLyoqCisgICAgICogPHA+V3JhcHBlciBjbGFzcyBmb3IgYSBMaXN0Vmlldy4gVGhpcyB3cmFwcGVyIGNhbiBoaWphY2sgdGhlIGZvY3VzIHRvCisgICAgICogbWFrZSBzdXJlIHRoZSBsaXN0IHVzZXMgdGhlIGFwcHJvcHJpYXRlIGRyYXdhYmxlcyBhbmQgc3RhdGVzIHdoZW4KKyAgICAgKiBkaXNwbGF5ZWQgb24gc2NyZWVuIHdpdGhpbiBhIGRyb3AgZG93bi4gVGhlIGZvY3VzIGlzIG5ldmVyIGFjdHVhbGx5CisgICAgICogcGFzc2VkIHRvIHRoZSBkcm9wIGRvd24gaW4gdGhpcyBtb2RlOyB0aGUgbGlzdCBvbmx5IGxvb2tzIGZvY3VzZWQuPC9wPgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIERyb3BEb3duTGlzdFZpZXcgZXh0ZW5kcyBMaXN0VmlldyB7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSBMaXN0UG9wdXBXaW5kb3cuVEFHICsgIi5Ecm9wRG93bkxpc3RWaWV3IjsKKyAgICAgICAgLyoKKyAgICAgICAgICogV0FSTklORzogVGhpcyBpcyBhIHdvcmthcm91bmQgZm9yIGEgdG91Y2ggbW9kZSBpc3N1ZS4KKyAgICAgICAgICoKKyAgICAgICAgICogVG91Y2ggbW9kZSBpcyBwcm9wYWdhdGVkIGxhemlseSB0byB3aW5kb3dzLiBUaGlzIGNhdXNlcyBwcm9ibGVtcyBpbgorICAgICAgICAgKiB0aGUgZm9sbG93aW5nIHNjZW5hcmlvOgorICAgICAgICAgKiAtIFR5cGUgc29tZXRoaW5nIGluIHRoZSBBdXRvQ29tcGxldGVUZXh0VmlldyBhbmQgZ2V0IHNvbWUgcmVzdWx0cworICAgICAgICAgKiAtIE1vdmUgZG93biB3aXRoIHRoZSBkLXBhZCB0byBzZWxlY3QgYW4gaXRlbSBpbiB0aGUgbGlzdAorICAgICAgICAgKiAtIE1vdmUgdXAgd2l0aCB0aGUgZC1wYWQgdW50aWwgdGhlIHNlbGVjdGlvbiBkaXNhcHBlYXJzCisgICAgICAgICAqIC0gVHlwZSBtb3JlIHRleHQgaW4gdGhlIEF1dG9Db21wbGV0ZVRleHRWaWV3ICp1c2luZyB0aGUgc29mdCBrZXlib2FyZCoKKyAgICAgICAgICogICBhbmQgZ2V0IG5ldyByZXN1bHRzOyB5b3UgYXJlIG5vdyBpbiB0b3VjaCBtb2RlCisgICAgICAgICAqIC0gVGhlIHNlbGVjdGlvbiBjb21lcyBiYWNrIG9uIHRoZSBmaXJzdCBpdGVtIGluIHRoZSBsaXN0LCBldmVuIHRob3VnaAorICAgICAgICAgKiAgIHRoZSBsaXN0IGlzIHN1cHBvc2VkIHRvIGJlIGluIHRvdWNoIG1vZGUKKyAgICAgICAgICoKKyAgICAgICAgICogVXNpbmcgdGhlIHNvZnQga2V5Ym9hcmQgdHJpZ2dlcnMgdGhlIHRvdWNoIG1vZGUgY2hhbmdlIGJ1dCB0aGF0IGNoYW5nZQorICAgICAgICAgKiBpcyBwcm9wYWdhdGVkIHRvIG91ciB3aW5kb3cgb25seSBhZnRlciB0aGUgZmlyc3QgbGlzdCBsYXlvdXQsIHRoZXJlZm9yZQorICAgICAgICAgKiBhZnRlciB0aGUgbGlzdCBhdHRlbXB0cyB0byByZXN1cnJlY3QgdGhlIHNlbGVjdGlvbi4KKyAgICAgICAgICoKKyAgICAgICAgICogVGhlIHRyaWNrIHRvIHdvcmsgYXJvdW5kIHRoaXMgaXNzdWUgaXMgdG8gcHJldGVuZCB0aGUgbGlzdCBpcyBpbiB0b3VjaAorICAgICAgICAgKiBtb2RlIHdoZW4gd2Uga25vdyB0aGF0IHRoZSBzZWxlY3Rpb24gc2hvdWxkIG5vdCBhcHBlYXIsIHRoYXQgaXMgd2hlbgorICAgICAgICAgKiB3ZSBrbm93IHRoZSB1c2VyIG1vdmVkIHRoZSBzZWxlY3Rpb24gYXdheSBmcm9tIHRoZSBsaXN0LgorICAgICAgICAgKgorICAgICAgICAgKiBUaGlzIGJvb2xlYW4gaXMgc2V0IHRvIHRydWUgd2hlbmV2ZXIgd2UgZXhwbGljaXRseSBoaWRlIHRoZSBsaXN0J3MKKyAgICAgICAgICogc2VsZWN0aW9uIGFuZCByZXNldCB0byBmYWxzZSB3aGVuZXZlciB3ZSBrbm93IHRoZSB1c2VyIG1vdmVkIHRoZQorICAgICAgICAgKiBzZWxlY3Rpb24gYmFjayB0byB0aGUgbGlzdC4KKyAgICAgICAgICoKKyAgICAgICAgICogV2hlbiB0aGlzIGJvb2xlYW4gaXMgdHJ1ZSwgaXNJblRvdWNoTW9kZSgpIHJldHVybnMgdHJ1ZSwgb3RoZXJ3aXNlIGl0CisgICAgICAgICAqIHJldHVybnMgc3VwZXIuaXNJblRvdWNoTW9kZSgpLgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1MaXN0U2VsZWN0aW9uSGlkZGVuOworICAgICAgICAKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRydWUgaWYgdGhpcyB3cmFwcGVyIHNob3VsZCBmYWtlIGZvY3VzLgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1IaWphY2tGb2N1czsKKworICAgICAgICAvKioKKyAgICAgICAgICogPHA+Q3JlYXRlcyBhIG5ldyBsaXN0IHZpZXcgd3JhcHBlci48L3A+CisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBjb250ZXh0IHRoaXMgdmlldydzIGNvbnRleHQKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBEcm9wRG93bkxpc3RWaWV3KENvbnRleHQgY29udGV4dCwgYm9vbGVhbiBoaWphY2tGb2N1cykgeworICAgICAgICAgICAgc3VwZXIoY29udGV4dCwgbnVsbCwgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hdHRyLmRyb3BEb3duTGlzdFZpZXdTdHlsZSk7CisgICAgICAgICAgICBtSGlqYWNrRm9jdXMgPSBoaWphY2tGb2N1czsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiA8cD5Bdm9pZHMgamFycmluZyBzY3JvbGxpbmcgZWZmZWN0IGJ5IGVuc3VyaW5nIHRoYXQgbGlzdCBlbGVtZW50cworICAgICAgICAgKiBtYWRlIG9mIGEgdGV4dCB2aWV3IGZpdCBvbiBhIHNpbmdsZSBsaW5lLjwvcD4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHBvc2l0aW9uIHRoZSBpdGVtIGluZGV4IGluIHRoZSBsaXN0IHRvIGdldCBhIHZpZXcgZm9yCisgICAgICAgICAqIEByZXR1cm4gdGhlIHZpZXcgZm9yIHRoZSBzcGVjaWZpZWQgaXRlbQorICAgICAgICAgKi8KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIFZpZXcgb2J0YWluVmlldyhpbnQgcG9zaXRpb24sIGJvb2xlYW5bXSBpc1NjcmFwKSB7CisgICAgICAgICAgICBWaWV3IHZpZXcgPSBzdXBlci5vYnRhaW5WaWV3KHBvc2l0aW9uLCBpc1NjcmFwKTsKKworICAgICAgICAgICAgaWYgKHZpZXcgaW5zdGFuY2VvZiBUZXh0VmlldykgeworICAgICAgICAgICAgICAgICgoVGV4dFZpZXcpIHZpZXcpLnNldEhvcml6b250YWxseVNjcm9sbGluZyh0cnVlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIHZpZXc7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNJblRvdWNoTW9kZSgpIHsKKyAgICAgICAgICAgIC8vIFdBUk5JTkc6IFBsZWFzZSByZWFkIHRoZSBjb21tZW50IHdoZXJlIG1MaXN0U2VsZWN0aW9uSGlkZGVuIGlzIGRlY2xhcmVkCisgICAgICAgICAgICByZXR1cm4gKG1IaWphY2tGb2N1cyAmJiBtTGlzdFNlbGVjdGlvbkhpZGRlbikgfHwgc3VwZXIuaXNJblRvdWNoTW9kZSgpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIDxwPlJldHVybnMgdGhlIGZvY3VzIHN0YXRlIGluIHRoZSBkcm9wIGRvd24uPC9wPgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIHRydWUgYWx3YXlzIGlmIGhpamFja2luZyBmb2N1cworICAgICAgICAgKi8KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc1dpbmRvd0ZvY3VzKCkgeworICAgICAgICAgICAgcmV0dXJuIG1IaWphY2tGb2N1cyB8fCBzdXBlci5oYXNXaW5kb3dGb2N1cygpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIDxwPlJldHVybnMgdGhlIGZvY3VzIHN0YXRlIGluIHRoZSBkcm9wIGRvd24uPC9wPgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIHRydWUgYWx3YXlzIGlmIGhpamFja2luZyBmb2N1cworICAgICAgICAgKi8KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzRm9jdXNlZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtSGlqYWNrRm9jdXMgfHwgc3VwZXIuaXNGb2N1c2VkKCk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogPHA+UmV0dXJucyB0aGUgZm9jdXMgc3RhdGUgaW4gdGhlIGRyb3AgZG93bi48L3A+CisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gdHJ1ZSBhbHdheXMgaWYgaGlqYWNraW5nIGZvY3VzCisgICAgICAgICAqLworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzRm9jdXMoKSB7CisgICAgICAgICAgICByZXR1cm4gbUhpamFja0ZvY3VzIHx8IHN1cGVyLmhhc0ZvY3VzKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIFBvcHVwRGF0YVNldE9ic2VydmVyIGV4dGVuZHMgRGF0YVNldE9ic2VydmVyIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2hhbmdlZCgpIHsKKyAgICAgICAgICAgIGlmIChpc1Nob3dpbmcoKSkgeworICAgICAgICAgICAgICAgIC8vIFJlc2l6ZSB0aGUgcG9wdXAgdG8gZml0IG5ldyBjb250ZW50CisgICAgICAgICAgICAgICAgc2hvdygpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25JbnZhbGlkYXRlZCgpIHsKKyAgICAgICAgICAgIGRpc21pc3MoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgTGlzdFNlbGVjdG9ySGlkZXIgaW1wbGVtZW50cyBSdW5uYWJsZSB7CisgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgIGNsZWFyTGlzdFNlbGVjdGlvbigpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBSZXNpemVQb3B1cFJ1bm5hYmxlIGltcGxlbWVudHMgUnVubmFibGUgeworICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICBtUG9wdXAuc2V0SW5wdXRNZXRob2RNb2RlKFBvcHVwV2luZG93LklOUFVUX01FVEhPRF9OT1RfTkVFREVEKTsKKyAgICAgICAgICAgIHNob3coKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgUG9wdXBUb3VjaEludGVyY2VwdG9yIGltcGxlbWVudHMgT25Ub3VjaExpc3RlbmVyIHsKKyAgICAgICAgcHVibGljIGJvb2xlYW4gb25Ub3VjaChWaWV3IHYsIE1vdGlvbkV2ZW50IGV2ZW50KSB7CisgICAgICAgICAgICBmaW5hbCBpbnQgYWN0aW9uID0gZXZlbnQuZ2V0QWN0aW9uKCk7CisgICAgICAgICAgICBmaW5hbCBpbnQgeCA9IChpbnQpIGV2ZW50LmdldFgoKTsKKyAgICAgICAgICAgIGZpbmFsIGludCB5ID0gKGludCkgZXZlbnQuZ2V0WSgpOworICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoYWN0aW9uID09IE1vdGlvbkV2ZW50LkFDVElPTl9ET1dOICYmCisgICAgICAgICAgICAgICAgICAgIG1Qb3B1cCAhPSBudWxsICYmIG1Qb3B1cC5pc1Nob3dpbmcoKSAmJgorICAgICAgICAgICAgICAgICAgICAoeCA+PSAwICYmIHggPCBnZXRXaWR0aCgpICYmIHkgPj0gMCAmJiB5IDwgZ2V0SGVpZ2h0KCkpKSB7CisgICAgICAgICAgICAgICAgbUhhbmRsZXIucG9zdERlbGF5ZWQobVJlc2l6ZVBvcHVwUnVubmFibGUsIEVYUEFORF9MSVNUX1RJTUVPVVQpOworICAgICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24gPT0gTW90aW9uRXZlbnQuQUNUSU9OX1VQKSB7CisgICAgICAgICAgICAgICAgbUhhbmRsZXIucmVtb3ZlQ2FsbGJhY2tzKG1SZXNpemVQb3B1cFJ1bm5hYmxlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgUG9wdXBTY3JvbGxMaXN0ZW5lciBpbXBsZW1lbnRzIExpc3RWaWV3Lk9uU2Nyb2xsTGlzdGVuZXIgeworICAgICAgICBwdWJsaWMgdm9pZCBvblNjcm9sbChBYnNMaXN0VmlldyB2aWV3LCBpbnQgZmlyc3RWaXNpYmxlSXRlbSwgaW50IHZpc2libGVJdGVtQ291bnQsCisgICAgICAgICAgICAgICAgaW50IHRvdGFsSXRlbUNvdW50KSB7CisKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIG9uU2Nyb2xsU3RhdGVDaGFuZ2VkKEFic0xpc3RWaWV3IHZpZXcsIGludCBzY3JvbGxTdGF0ZSkgeworICAgICAgICAgICAgaWYgKHNjcm9sbFN0YXRlID09IFNDUk9MTF9TVEFURV9UT1VDSF9TQ1JPTEwgJiYKKyAgICAgICAgICAgICAgICAgICAgIWlzSW5wdXRNZXRob2ROb3ROZWVkZWQoKSAmJiBtUG9wdXAuZ2V0Q29udGVudFZpZXcoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUhhbmRsZXIucmVtb3ZlQ2FsbGJhY2tzKG1SZXNpemVQb3B1cFJ1bm5hYmxlKTsKKyAgICAgICAgICAgICAgICBtUmVzaXplUG9wdXBSdW5uYWJsZS5ydW4oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9MaXN0Vmlldy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0xpc3RWaWV3LmphdmEKaW5kZXggODkyYzQ0YS4uOTFmNDk0NiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0xpc3RWaWV3LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0xpc3RWaWV3LmphdmEKQEAgLTQxNSw3ICs0MTUsNyBAQAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHNldEFkYXB0ZXIoTGlzdEFkYXB0ZXIgYWRhcHRlcikgewotICAgICAgICBpZiAobnVsbCAhPSBtQWRhcHRlcikgeworICAgICAgICBpZiAobUFkYXB0ZXIgIT0gbnVsbCAmJiBtRGF0YVNldE9ic2VydmVyICE9IG51bGwpIHsKICAgICAgICAgICAgIG1BZGFwdGVyLnVucmVnaXN0ZXJEYXRhU2V0T2JzZXJ2ZXIobURhdGFTZXRPYnNlcnZlcik7CiAgICAgICAgIH0KIApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1BvcHVwV2luZG93LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvUG9wdXBXaW5kb3cuamF2YQppbmRleCAwMzc4MzI4Li5kNDA0Y2U3IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvUG9wdXBXaW5kb3cuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvUG9wdXBXaW5kb3cuamF2YQpAQCAtMTYsMjcgKzE2LDI4IEBACiAKIHBhY2thZ2UgYW5kcm9pZC53aWRnZXQ7CiAKLWltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SOworaW1wb3J0IGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZTsKIAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuVHlwZWRBcnJheTsKLWltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7Ci1pbXBvcnQgYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50OwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwotaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQudmlldy5HcmF2aXR5OwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdUcmVlT2JzZXJ2ZXI7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdUcmVlT2JzZXJ2ZXIuT25TY3JvbGxDaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXcuT25Ub3VjaExpc3RlbmVyOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGl4ZWxGb3JtYXQ7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5TdGF0ZUxpc3REcmF3YWJsZTsKIGltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5HcmF2aXR5OworaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQ7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld1RyZWVPYnNlcnZlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldy5PblRvdWNoTGlzdGVuZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdUcmVlT2JzZXJ2ZXIuT25TY3JvbGxDaGFuZ2VkTGlzdGVuZXI7CiAKLWltcG9ydCBqYXZhLmxhbmcucmVmLldlYWtSZWZlcmVuY2U7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuUjsKIAogLyoqCiAgKiA8cD5BIHBvcHVwIHdpbmRvdyB0aGF0IGNhbiBiZSB1c2VkIHRvIGRpc3BsYXkgYW4gYXJiaXRyYXJ5IHZpZXcuIFRoZSBwb3B1cApAQCAtMTU3LDEyICsxNTgsMjEgQEAKICAgICAgKiA8cD5UaGUgcG9wdXAgZG9lcyBwcm92aWRlIGEgYmFja2dyb3VuZC48L3A+CiAgICAgICovCiAgICAgcHVibGljIFBvcHVwV2luZG93KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzLCBpbnQgZGVmU3R5bGUpIHsKKyAgICAgICAgdGhpcyhjb250ZXh0LCBhdHRycywgZGVmU3R5bGUsIDApOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiA8cD5DcmVhdGUgYSBuZXcsIGVtcHR5LCBub24gZm9jdXNhYmxlIHBvcHVwIHdpbmRvdyBvZiBkaW1lbnNpb24gKDAsMCkuPC9wPgorICAgICAqIAorICAgICAqIDxwPlRoZSBwb3B1cCBkb2VzIG5vdCBwcm92aWRlIGEgYmFja2dyb3VuZC48L3A+CisgICAgICovCisgICAgcHVibGljIFBvcHVwV2luZG93KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzLCBpbnQgZGVmU3R5bGVBdHRyLCBpbnQgZGVmU3R5bGVSZXMpIHsKICAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OwogICAgICAgICBtV2luZG93TWFuYWdlciA9IChXaW5kb3dNYW5hZ2VyKWNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LldJTkRPV19TRVJWSUNFKTsKIAogICAgICAgICBUeXBlZEFycmF5IGEgPQogICAgICAgICAgICAgY29udGV4dC5vYnRhaW5TdHlsZWRBdHRyaWJ1dGVzKAotICAgICAgICAgICAgICAgIGF0dHJzLCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5Qb3B1cFdpbmRvdywgZGVmU3R5bGUsIDApOworICAgICAgICAgICAgICAgIGF0dHJzLCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5Qb3B1cFdpbmRvdywgZGVmU3R5bGVBdHRyLCBkZWZTdHlsZVJlcyk7CiAKICAgICAgICAgbUJhY2tncm91bmQgPSBhLmdldERyYXdhYmxlKFIuc3R5bGVhYmxlLlBvcHVwV2luZG93X3BvcHVwQmFja2dyb3VuZCk7CiAKQEAgLTEzMTUsNiArMTMyNSw3IEBACiAgICAgfQogCiAgICAgcHJpdmF0ZSBjbGFzcyBQb3B1cFZpZXdDb250YWluZXIgZXh0ZW5kcyBGcmFtZUxheW91dCB7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiUG9wdXBXaW5kb3cuUG9wdXBWaWV3Q29udGFpbmVyIjsKIAogICAgICAgICBwdWJsaWMgUG9wdXBWaWV3Q29udGFpbmVyKENvbnRleHQgY29udGV4dCkgewogICAgICAgICAgICAgc3VwZXIoY29udGV4dCk7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvUHJvZ3Jlc3NCYXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9Qcm9ncmVzc0Jhci5qYXZhCmluZGV4IDhlOWViMDUuLjcxZjBjMmYgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9Qcm9ncmVzc0Jhci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9Qcm9ncmVzc0Jhci5qYXZhCkBAIC03MTUsOCArNzE1LDggQEAKICAgICAgICAgICAgIG1BbmltYXRpb24uc2V0RHVyYXRpb24obUR1cmF0aW9uKTsKICAgICAgICAgICAgIG1BbmltYXRpb24uc2V0SW50ZXJwb2xhdG9yKG1JbnRlcnBvbGF0b3IpOwogICAgICAgICAgICAgbUFuaW1hdGlvbi5zZXRTdGFydFRpbWUoQW5pbWF0aW9uLlNUQVJUX09OX0ZJUlNUX0ZSQU1FKTsKLSAgICAgICAgICAgIHBvc3RJbnZhbGlkYXRlKCk7CiAgICAgICAgIH0KKyAgICAgICAgcG9zdEludmFsaWRhdGUoKTsKICAgICB9CiAKICAgICAvKioKQEAgLTcyOSw2ICs3MjksNyBAQAogICAgICAgICAgICAgKChBbmltYXRhYmxlKSBtSW5kZXRlcm1pbmF0ZURyYXdhYmxlKS5zdG9wKCk7CiAgICAgICAgICAgICBtU2hvdWxkU3RhcnRBbmltYXRpb25EcmF3YWJsZSA9IGZhbHNlOwogICAgICAgICB9CisgICAgICAgIHBvc3RJbnZhbGlkYXRlKCk7CiAgICAgfQogCiAgICAgLyoqCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvUXVpY2tDb250YWN0QmFkZ2UuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9RdWlja0NvbnRhY3RCYWRnZS5qYXZhCmluZGV4IDA3YzNlNGIuLjUwZmJiNmIgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9RdWlja0NvbnRhY3RCYWRnZS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9RdWlja0NvbnRhY3RCYWRnZS5qYXZhCkBAIC00OCw2ICs0OCw3IEBACiAgICAgcHJpdmF0ZSBRdWVyeUhhbmRsZXIgbVF1ZXJ5SGFuZGxlcjsKICAgICBwcml2YXRlIERyYXdhYmxlIG1CYWRnZUJhY2tncm91bmQ7CiAgICAgcHJpdmF0ZSBEcmF3YWJsZSBtTm9CYWRnZUJhY2tncm91bmQ7CisgICAgcHJpdmF0ZSBEcmF3YWJsZSBtRGVmYXVsdEF2YXRhcjsKIAogICAgIHByb3RlY3RlZCBTdHJpbmdbXSBtRXhjbHVkZU1pbWVzID0gbnVsbDsKIApAQCAtMTE3LDYgKzExOCwxNiBAQAogICAgIHB1YmxpYyB2b2lkIHNldE1vZGUoaW50IHNpemUpIHsKICAgICAgICAgbU1vZGUgPSBzaXplOwogICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXNldHMgdGhlIGNvbnRhY3QgcGhvdG8gdG8gdGhlIGRlZmF1bHQgc3RhdGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SW1hZ2VUb0RlZmF1bHQoKSB7CisgICAgICAgIGlmIChtRGVmYXVsdEF2YXRhciA9PSBudWxsKSB7CisgICAgICAgICAgICBtRGVmYXVsdEF2YXRhciA9IGdldFJlc291cmNlcygpLmdldERyYXdhYmxlKFIuZHJhd2FibGUuaWNfY29udGFjdF9waWN0dXJlKTsKKyAgICAgICAgfQorICAgICAgICBzZXRJbWFnZURyYXdhYmxlKG1EZWZhdWx0QXZhdGFyKTsKKyAgICB9CiAKICAgICAvKioKICAgICAgKiBBc3NpZ24gdGhlIGNvbnRhY3QgdXJpIHRoYXQgdGhpcyBRdWlja0NvbnRhY3RCYWRnZSBzaG91bGQgYmUgYXNzb2NpYXRlZApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1JlbW90ZVZpZXdzLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvUmVtb3RlVmlld3MuamF2YQppbmRleCA3YTcwYzgwLi5mYzAyYWNmIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvUmVtb3RlVmlld3MuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvUmVtb3RlVmlld3MuamF2YQpAQCAtNjAsMTIgKzYwLDEyIEBACiAgICAgICogVGhlIHBhY2thZ2UgbmFtZSBvZiB0aGUgcGFja2FnZSBjb250YWluaW5nIHRoZSBsYXlvdXQgCiAgICAgICogcmVzb3VyY2UuIChBZGRlZCB0byB0aGUgcGFyY2VsKQogICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIG1QYWNrYWdlOworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1QYWNrYWdlOwogICAgIAogICAgIC8qKgogICAgICAqIFRoZSByZXNvdXJjZSBJRCBvZiB0aGUgbGF5b3V0IGZpbGUuIChBZGRlZCB0byB0aGUgcGFyY2VsKQogICAgICAqLwotICAgIHByaXZhdGUgaW50IG1MYXlvdXRJZDsKKyAgICBwcml2YXRlIGZpbmFsIGludCBtTGF5b3V0SWQ7CiAKICAgICAvKioKICAgICAgKiBBbiBhcnJheSBvZiBhY3Rpb25zIHRvIHBlcmZvcm0gb24gdGhlIHZpZXcgdHJlZSBvbmNlIGl0IGhhcyBiZWVuCkBAIC01NjksNiArNTY5LDcgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBSZW1vdGVWaWV3cyBjbG9uZSgpIHsKICAgICAgICAgZmluYWwgUmVtb3RlVmlld3MgdGhhdCA9IG5ldyBSZW1vdGVWaWV3cyhtUGFja2FnZSwgbUxheW91dElkKTsKICAgICAgICAgaWYgKG1BY3Rpb25zICE9IG51bGwpIHsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9TaW1wbGVDdXJzb3JBZGFwdGVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvU2ltcGxlQ3Vyc29yQWRhcHRlci5qYXZhCmluZGV4IDdkMzQ1OWUuLmQxYzIyNzAgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9TaW1wbGVDdXJzb3JBZGFwdGVyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1NpbXBsZUN1cnNvckFkYXB0ZXIuamF2YQpAQCAtNjIsNyArNjIsOCBAQAogICAgIHByaXZhdGUgaW50IG1TdHJpbmdDb252ZXJzaW9uQ29sdW1uID0gLTE7CiAgICAgcHJpdmF0ZSBDdXJzb3JUb1N0cmluZ0NvbnZlcnRlciBtQ3Vyc29yVG9TdHJpbmdDb252ZXJ0ZXI7CiAgICAgcHJpdmF0ZSBWaWV3QmluZGVyIG1WaWV3QmluZGVyOwotICAgIHByaXZhdGUgU3RyaW5nW10gbU9yaWdpbmFsRnJvbTsKKworICAgIFN0cmluZ1tdIG1PcmlnaW5hbEZyb207CiAKICAgICAvKioKICAgICAgKiBDb25zdHJ1Y3Rvci4KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9TcGlubmVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvU3Bpbm5lci5qYXZhCmluZGV4IDJmNmRkMWUuLjYwZTg1NjggMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9TcGlubmVyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1NwaW5uZXIuamF2YQpAQCAtMjQsNiArMjQsNyBAQAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuVHlwZWRBcnJheTsKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkRhdGFTZXRPYnNlcnZlcjsKIGltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OworaW1wb3J0IGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlcjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOwogCkBAIC0zNywxMCArMzgsMjEgQEAKICAqLwogQFdpZGdldAogcHVibGljIGNsYXNzIFNwaW5uZXIgZXh0ZW5kcyBBYnNTcGlubmVyIGltcGxlbWVudHMgT25DbGlja0xpc3RlbmVyIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlNwaW5uZXIiOwogICAgIAotICAgIHByaXZhdGUgQ2hhclNlcXVlbmNlIG1Qcm9tcHQ7Ci0gICAgcHJpdmF0ZSBBbGVydERpYWxvZyBtUG9wdXA7Ci0KKyAgICAvKioKKyAgICAgKiBVc2UgYSBkaWFsb2cgd2luZG93IGZvciBzZWxlY3Rpbmcgc3Bpbm5lciBvcHRpb25zLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1PREVfRElBTE9HID0gMDsKKyAgICAKKyAgICAvKioKKyAgICAgKiBVc2UgYSBkcm9wZG93biBhbmNob3JlZCB0byB0aGUgU3Bpbm5lciBmb3Igc2VsZWN0aW5nIHNwaW5uZXIgb3B0aW9ucy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNT0RFX0RST1BET1dOID0gMTsKKyAgICAKKyAgICBwcml2YXRlIFNwaW5uZXJQb3B1cCBtUG9wdXA7CisgICAgcHJpdmF0ZSBEcm9wRG93bkFkYXB0ZXIgbVRlbXBBZGFwdGVyOworICAgIAogICAgIHB1YmxpYyBTcGlubmVyKENvbnRleHQgY29udGV4dCkgewogICAgICAgICB0aGlzKGNvbnRleHQsIG51bGwpOwogICAgIH0KQEAgLTU1LDkgKzY3LDU0IEBACiAgICAgICAgIFR5cGVkQXJyYXkgYSA9IGNvbnRleHQub2J0YWluU3R5bGVkQXR0cmlidXRlcyhhdHRycywKICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5TcGlubmVyLCBkZWZTdHlsZSwgMCk7CiAgICAgICAgIAotICAgICAgICBtUHJvbXB0ID0gYS5nZXRTdHJpbmcoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuU3Bpbm5lcl9wcm9tcHQpOworICAgICAgICBmaW5hbCBpbnQgbW9kZSA9IGEuZ2V0SW50KGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLlNwaW5uZXJfc3Bpbm5lck1vZGUsCisgICAgICAgICAgICAgICAgTU9ERV9ESUFMT0cpOworICAgICAgICAKKyAgICAgICAgc3dpdGNoIChtb2RlKSB7CisgICAgICAgIGNhc2UgTU9ERV9ESUFMT0c6IHsKKyAgICAgICAgICAgIG1Qb3B1cCA9IG5ldyBEaWFsb2dQb3B1cCgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGNhc2UgTU9ERV9EUk9QRE9XTjogeworICAgICAgICAgICAgZmluYWwgaW50IGhpbnRSZXNvdXJjZSA9IGEuZ2V0UmVzb3VyY2VJZCgKKyAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuU3Bpbm5lcl9wb3B1cFByb21wdFZpZXcsIDApOworCisgICAgICAgICAgICBEcm9wZG93blBvcHVwIHBvcHVwID0gbmV3IERyb3Bkb3duUG9wdXAoY29udGV4dCwgYXR0cnMsIGRlZlN0eWxlLCBoaW50UmVzb3VyY2UpOworCisgICAgICAgICAgICBwb3B1cC5zZXRCYWNrZ3JvdW5kRHJhd2FibGUoYS5nZXREcmF3YWJsZSgKKyAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuU3Bpbm5lcl9wb3B1cEJhY2tncm91bmQpKTsKKyAgICAgICAgICAgIHBvcHVwLnNldFZlcnRpY2FsT2Zmc2V0KGEuZ2V0RGltZW5zaW9uUGl4ZWxPZmZzZXQoCisgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLlNwaW5uZXJfZHJvcERvd25WZXJ0aWNhbE9mZnNldCwgMCkpOworICAgICAgICAgICAgcG9wdXAuc2V0SG9yaXpvbnRhbE9mZnNldChhLmdldERpbWVuc2lvblBpeGVsT2Zmc2V0KAorICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5TcGlubmVyX2Ryb3BEb3duSG9yaXpvbnRhbE9mZnNldCwgMCkpOworCisgICAgICAgICAgICBtUG9wdXAgPSBwb3B1cDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIG1Qb3B1cC5zZXRQcm9tcHRUZXh0KGEuZ2V0U3RyaW5nKGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLlNwaW5uZXJfcHJvbXB0KSk7CiAKICAgICAgICAgYS5yZWN5Y2xlKCk7CisKKyAgICAgICAgLy8gQmFzZSBjb25zdHJ1Y3RvciBjYW4gY2FsbCBzZXRBZGFwdGVyIGJlZm9yZSB3ZSBpbml0aWFsaXplIG1Qb3B1cC4KKyAgICAgICAgLy8gRmluaXNoIHNldHRpbmcgdGhpbmdzIHVwIGlmIHRoaXMgaGFwcGVuZWQuCisgICAgICAgIGlmIChtVGVtcEFkYXB0ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgbVBvcHVwLnNldEFkYXB0ZXIobVRlbXBBZGFwdGVyKTsKKyAgICAgICAgICAgIG1UZW1wQWRhcHRlciA9IG51bGw7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0QWRhcHRlcihTcGlubmVyQWRhcHRlciBhZGFwdGVyKSB7CisgICAgICAgIHN1cGVyLnNldEFkYXB0ZXIoYWRhcHRlcik7CisKKyAgICAgICAgaWYgKG1Qb3B1cCAhPSBudWxsKSB7CisgICAgICAgICAgICBtUG9wdXAuc2V0QWRhcHRlcihuZXcgRHJvcERvd25BZGFwdGVyKGFkYXB0ZXIpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1UZW1wQWRhcHRlciA9IG5ldyBEcm9wRG93bkFkYXB0ZXIoYWRhcHRlcik7CisgICAgICAgIH0KICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTE5NCw4ICsyNTEsNiBAQAogICAgICAgICByZXR1cm4gY2hpbGQ7CiAgICAgfQogCi0KLQogICAgIC8qKgogICAgICAqIEhlbHBlciBmb3IgbWFrZUFuZEFkZFZpZXcgdG8gc2V0IHRoZSBwb3NpdGlvbiBvZiBhIHZpZXcKICAgICAgKiBhbmQgZmlsbCBvdXQgaXRzIGxheW91dCBwYXJhbXRlcnMuCkBAIC0yNDYsMTUgKzMwMSwxMCBAQAogICAgICAgICAKICAgICAgICAgaWYgKCFoYW5kbGVkKSB7CiAgICAgICAgICAgICBoYW5kbGVkID0gdHJ1ZTsKLSAgICAgICAgICAgIENvbnRleHQgY29udGV4dCA9IGdldENvbnRleHQoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZmluYWwgRHJvcERvd25BZGFwdGVyIGFkYXB0ZXIgPSBuZXcgRHJvcERvd25BZGFwdGVyKGdldEFkYXB0ZXIoKSk7CiAKLSAgICAgICAgICAgIEFsZXJ0RGlhbG9nLkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBBbGVydERpYWxvZy5CdWlsZGVyKGNvbnRleHQpOwotICAgICAgICAgICAgaWYgKG1Qcm9tcHQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGJ1aWxkZXIuc2V0VGl0bGUobVByb21wdCk7CisgICAgICAgICAgICBpZiAoIW1Qb3B1cC5pc1Nob3dpbmcoKSkgeworICAgICAgICAgICAgICAgIG1Qb3B1cC5zaG93KCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtUG9wdXAgPSBidWlsZGVyLnNldFNpbmdsZUNob2ljZUl0ZW1zKGFkYXB0ZXIsIGdldFNlbGVjdGVkSXRlbVBvc2l0aW9uKCksIHRoaXMpLnNob3coKTsKICAgICAgICAgfQogCiAgICAgICAgIHJldHVybiBoYW5kbGVkOwpAQCAtMjcxLDcgKzMyMSw3IEBACiAgICAgICogQHBhcmFtIHByb21wdCB0aGUgcHJvbXB0IHRvIHNldAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldFByb21wdChDaGFyU2VxdWVuY2UgcHJvbXB0KSB7Ci0gICAgICAgIG1Qcm9tcHQgPSBwcm9tcHQ7CisgICAgICAgIG1Qb3B1cC5zZXRQcm9tcHRUZXh0KHByb21wdCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0yNzksMTQgKzMyOSwxNCBAQAogICAgICAqIEBwYXJhbSBwcm9tcHRJZCB0aGUgcmVzb3VyY2UgSUQgb2YgdGhlIHByb21wdCB0byBkaXNwbGF5IHdoZW4gdGhlIGRpYWxvZyBpcyBzaG93bgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldFByb21wdElkKGludCBwcm9tcHRJZCkgewotICAgICAgICBtUHJvbXB0ID0gZ2V0Q29udGV4dCgpLmdldFRleHQocHJvbXB0SWQpOworICAgICAgICBzZXRQcm9tcHQoZ2V0Q29udGV4dCgpLmdldFRleHQocHJvbXB0SWQpKTsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBAcmV0dXJuIFRoZSBwcm9tcHQgdG8gZGlzcGxheSB3aGVuIHRoZSBkaWFsb2cgaXMgc2hvd24KICAgICAgKi8KICAgICBwdWJsaWMgQ2hhclNlcXVlbmNlIGdldFByb21wdCgpIHsKLSAgICAgICAgcmV0dXJuIG1Qcm9tcHQ7CisgICAgICAgIHJldHVybiBtUG9wdXAuZ2V0SGludFRleHQoKTsKICAgICB9CiAgICAgCiAgICAgLyoqCkBAIC0zODQsNCArNDM0LDEyMyBAQAogICAgICAgICAgICAgcmV0dXJuIGdldENvdW50KCkgPT0gMDsKICAgICAgICAgfQogICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBJbXBsZW1lbnRzIHNvbWUgc29ydCBvZiBwb3B1cCBzZWxlY3Rpb24gaW50ZXJmYWNlIGZvciBzZWxlY3RpbmcgYSBzcGlubmVyIG9wdGlvbi4KKyAgICAgKiBBbGxvd3MgZm9yIGRpZmZlcmVudCBzcGlubmVyIG1vZGVzLgorICAgICAqLworICAgIHByaXZhdGUgaW50ZXJmYWNlIFNwaW5uZXJQb3B1cCB7CisgICAgICAgIHB1YmxpYyB2b2lkIHNldEFkYXB0ZXIoTGlzdEFkYXB0ZXIgYWRhcHRlcik7CisgICAgICAgIAorICAgICAgICAvKioKKyAgICAgICAgICogU2hvdyB0aGUgcG9wdXAKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHNob3coKTsKKyAgICAgICAgCisgICAgICAgIC8qKgorICAgICAgICAgKiBEaXNtaXNzIHRoZSBwb3B1cAorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgZGlzbWlzcygpOworICAgICAgICAKKyAgICAgICAgLyoqCisgICAgICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcG9wdXAgaXMgc2hvd2luZywgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNTaG93aW5nKCk7CisgICAgICAgIAorICAgICAgICAvKioKKyAgICAgICAgICogU2V0IGhpbnQgdGV4dCB0byBiZSBkaXNwbGF5ZWQgdG8gdGhlIHVzZXIuIFRoaXMgc2hvdWxkIHByb3ZpZGUKKyAgICAgICAgICogYSBkZXNjcmlwdGlvbiBvZiB0aGUgY2hvaWNlIGJlaW5nIG1hZGUuCisgICAgICAgICAqIEBwYXJhbSBoaW50VGV4dCBIaW50IHRleHQgdG8gc2V0LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgc2V0UHJvbXB0VGV4dChDaGFyU2VxdWVuY2UgaGludFRleHQpOworICAgICAgICBwdWJsaWMgQ2hhclNlcXVlbmNlIGdldEhpbnRUZXh0KCk7CisgICAgfQorICAgIAorICAgIHByaXZhdGUgY2xhc3MgRGlhbG9nUG9wdXAgaW1wbGVtZW50cyBTcGlubmVyUG9wdXAsIERpYWxvZ0ludGVyZmFjZS5PbkNsaWNrTGlzdGVuZXIgeworICAgICAgICBwcml2YXRlIEFsZXJ0RGlhbG9nIG1Qb3B1cDsKKyAgICAgICAgcHJpdmF0ZSBMaXN0QWRhcHRlciBtTGlzdEFkYXB0ZXI7CisgICAgICAgIHByaXZhdGUgQ2hhclNlcXVlbmNlIG1Qcm9tcHQ7CisKKyAgICAgICAgcHVibGljIHZvaWQgZGlzbWlzcygpIHsKKyAgICAgICAgICAgIG1Qb3B1cC5kaXNtaXNzKCk7CisgICAgICAgICAgICBtUG9wdXAgPSBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNTaG93aW5nKCkgeworICAgICAgICAgICAgcmV0dXJuIG1Qb3B1cCAhPSBudWxsID8gbVBvcHVwLmlzU2hvd2luZygpIDogZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRBZGFwdGVyKExpc3RBZGFwdGVyIGFkYXB0ZXIpIHsKKyAgICAgICAgICAgIG1MaXN0QWRhcHRlciA9IGFkYXB0ZXI7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRQcm9tcHRUZXh0KENoYXJTZXF1ZW5jZSBoaW50VGV4dCkgeworICAgICAgICAgICAgbVByb21wdCA9IGhpbnRUZXh0OworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwdWJsaWMgQ2hhclNlcXVlbmNlIGdldEhpbnRUZXh0KCkgeworICAgICAgICAgICAgcmV0dXJuIG1Qcm9tcHQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzaG93KCkgeworICAgICAgICAgICAgQWxlcnREaWFsb2cuQnVpbGRlciBidWlsZGVyID0gbmV3IEFsZXJ0RGlhbG9nLkJ1aWxkZXIoZ2V0Q29udGV4dCgpKTsKKyAgICAgICAgICAgIGlmIChtUHJvbXB0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBidWlsZGVyLnNldFRpdGxlKG1Qcm9tcHQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbVBvcHVwID0gYnVpbGRlci5zZXRTaW5nbGVDaG9pY2VJdGVtcyhtTGlzdEFkYXB0ZXIsCisgICAgICAgICAgICAgICAgICAgIGdldFNlbGVjdGVkSXRlbVBvc2l0aW9uKCksIHRoaXMpLnNob3coKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhEaWFsb2dJbnRlcmZhY2UgZGlhbG9nLCBpbnQgd2hpY2gpIHsKKyAgICAgICAgICAgIHNldFNlbGVjdGlvbih3aGljaCk7CisgICAgICAgICAgICBkaXNtaXNzKCk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBjbGFzcyBEcm9wZG93blBvcHVwIGV4dGVuZHMgTGlzdFBvcHVwV2luZG93IGltcGxlbWVudHMgU3Bpbm5lclBvcHVwIHsKKyAgICAgICAgcHJpdmF0ZSBDaGFyU2VxdWVuY2UgbUhpbnRUZXh0OworICAgICAgICBwcml2YXRlIFRleHRWaWV3IG1IaW50VmlldzsKKyAgICAgICAgcHJpdmF0ZSBpbnQgbUhpbnRSZXNvdXJjZTsKKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBEcm9wZG93blBvcHVwKENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzLAorICAgICAgICAgICAgICAgIGludCBkZWZTdHlsZVJlcywgaW50IGhpbnRSZXNvdXJjZSkgeworICAgICAgICAgICAgc3VwZXIoY29udGV4dCwgYXR0cnMsIDAsIGRlZlN0eWxlUmVzKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgbUhpbnRSZXNvdXJjZSA9IGhpbnRSZXNvdXJjZTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgc2V0QW5jaG9yVmlldyhTcGlubmVyLnRoaXMpOworICAgICAgICAgICAgc2V0TW9kYWwodHJ1ZSk7CisgICAgICAgICAgICBzZXRQcm9tcHRQb3NpdGlvbihQT1NJVElPTl9QUk9NUFRfQkVMT1cpOworICAgICAgICAgICAgc2V0T25JdGVtQ2xpY2tMaXN0ZW5lcihuZXcgT25JdGVtQ2xpY2tMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkl0ZW1DbGljayhBZGFwdGVyVmlldyBwYXJlbnQsIFZpZXcgdiwgaW50IHBvc2l0aW9uLCBsb25nIGlkKSB7CisgICAgICAgICAgICAgICAgICAgIFNwaW5uZXIudGhpcy5zZXRTZWxlY3Rpb24ocG9zaXRpb24pOworICAgICAgICAgICAgICAgICAgICBkaXNtaXNzKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBDaGFyU2VxdWVuY2UgZ2V0SGludFRleHQoKSB7CisgICAgICAgICAgICByZXR1cm4gbUhpbnRUZXh0OworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwdWJsaWMgdm9pZCBzZXRQcm9tcHRUZXh0KENoYXJTZXF1ZW5jZSBoaW50VGV4dCkgeworICAgICAgICAgICAgbUhpbnRUZXh0ID0gaGludFRleHQ7CisgICAgICAgICAgICBpZiAobUhpbnRWaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtSGludFZpZXcuc2V0VGV4dChoaW50VGV4dCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHB1YmxpYyB2b2lkIHNob3coKSB7CisgICAgICAgICAgICBpZiAobUhpbnRWaWV3ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBUZXh0VmlldyB0ZXh0VmlldyA9IChUZXh0VmlldykgTGF5b3V0SW5mbGF0ZXIuZnJvbShnZXRDb250ZXh0KCkpLmluZmxhdGUoCisgICAgICAgICAgICAgICAgICAgICAgICBtSGludFJlc291cmNlLCBudWxsKS5maW5kVmlld0J5SWQoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5pZC50ZXh0MSk7CisgICAgICAgICAgICAgICAgdGV4dFZpZXcuc2V0VGV4dChtSGludFRleHQpOworICAgICAgICAgICAgICAgIHNldFByb21wdFZpZXcodGV4dFZpZXcpOworICAgICAgICAgICAgICAgIG1IaW50VmlldyA9IHRleHRWaWV3OworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3VwZXIuc2hvdygpOworICAgICAgICAgICAgZ2V0TGlzdFZpZXcoKS5zZXRDaG9pY2VNb2RlKExpc3RWaWV3LkNIT0lDRV9NT0RFX1NJTkdMRSk7CisgICAgICAgICAgICBzZXRTZWxlY3Rpb24oU3Bpbm5lci50aGlzLmdldFNlbGVjdGVkSXRlbVBvc2l0aW9uKCkpOworICAgICAgICB9CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1RleHRWaWV3LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvVGV4dFZpZXcuamF2YQppbmRleCBlNmVkNzBhLi4xNzk2N2Q5IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvVGV4dFZpZXcuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvVGV4dFZpZXcuamF2YQpAQCAtMzIxLDYgKzMyMSw3IEBACiAgICAgICAgIHRoaXMoY29udGV4dCwgYXR0cnMsIGNvbS5hbmRyb2lkLmludGVybmFsLlIuYXR0ci50ZXh0Vmlld1N0eWxlKTsKICAgICB9CiAKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQogICAgIHB1YmxpYyBUZXh0VmlldyhDb250ZXh0IGNvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZVNldCBhdHRycywKICAgICAgICAgICAgICAgICAgICAgaW50IGRlZlN0eWxlKSB7CkBAIC03MTQsNyArNzE1LDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIGlmIChpbnB1dE1ldGhvZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBDbGFzcyBjOworICAgICAgICAgICAgQ2xhc3M8Pz4gYzsKIAogICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICBjID0gQ2xhc3MuZm9yTmFtZShpbnB1dE1ldGhvZC50b1N0cmluZygpKTsKQEAgLTIzMzUsNiArMjMzNiw3IEBACiAgICAgICAgICAgICByZXR1cm4gc3RyICsgIn0iOwogICAgICAgICB9CiAKKyAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoImhpZGluZyIpCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUGFyY2VsYWJsZS5DcmVhdG9yPFNhdmVkU3RhdGU+IENSRUFUT1IKICAgICAgICAgICAgICAgICA9IG5ldyBQYXJjZWxhYmxlLkNyZWF0b3I8U2F2ZWRTdGF0ZT4oKSB7CiAgICAgICAgICAgICBwdWJsaWMgU2F2ZWRTdGF0ZSBjcmVhdGVGcm9tUGFyY2VsKFBhcmNlbCBpbikgewpAQCAtMjc1Niw2ICsyNzU4LDcgQEAKICAgICAgICAgICAgIHJldHVybiBtQ2hhcnNbb2ZmICsgbVN0YXJ0XTsKICAgICAgICAgfQogCisgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcobUNoYXJzLCBtU3RhcnQsIG1MZW5ndGgpOwogICAgICAgICB9CkBAIC0yNzgxLDYgKzI3ODQsMTQgQEAKICAgICAgICAgICAgIGMuZHJhd1RleHQobUNoYXJzLCBzdGFydCArIG1TdGFydCwgZW5kIC0gc3RhcnQsIHgsIHksIHApOwogICAgICAgICB9CiAKKyAgICAgICAgcHVibGljIHZvaWQgZHJhd1RleHRSdW4oQ2FudmFzIGMsIGludCBzdGFydCwgaW50IGVuZCwKKyAgICAgICAgICAgICAgICBpbnQgY29udGV4dFN0YXJ0LCBpbnQgY29udGV4dEVuZCwgZmxvYXQgeCwgZmxvYXQgeSwgaW50IGZsYWdzLCBQYWludCBwKSB7CisgICAgICAgICAgICBpbnQgY291bnQgPSBlbmQgLSBzdGFydDsKKyAgICAgICAgICAgIGludCBjb250ZXh0Q291bnQgPSBjb250ZXh0RW5kIC0gY29udGV4dFN0YXJ0OworICAgICAgICAgICAgYy5kcmF3VGV4dFJ1bihtQ2hhcnMsIHN0YXJ0ICsgbVN0YXJ0LCBjb3VudCwgY29udGV4dFN0YXJ0ICsgbVN0YXJ0LAorICAgICAgICAgICAgICAgICAgICBjb250ZXh0Q291bnQsIHgsIHksIGZsYWdzLCBwKTsKKyAgICAgICAgfQorCiAgICAgICAgIHB1YmxpYyBmbG9hdCBtZWFzdXJlVGV4dChpbnQgc3RhcnQsIGludCBlbmQsIFBhaW50IHApIHsKICAgICAgICAgICAgIHJldHVybiBwLm1lYXN1cmVUZXh0KG1DaGFycywgc3RhcnQgKyBtU3RhcnQsIGVuZCAtIHN0YXJ0KTsKICAgICAgICAgfQpAQCAtMjc4OCw2ICsyNzk5LDIzIEBACiAgICAgICAgIHB1YmxpYyBpbnQgZ2V0VGV4dFdpZHRocyhpbnQgc3RhcnQsIGludCBlbmQsIGZsb2F0W10gd2lkdGhzLCBQYWludCBwKSB7CiAgICAgICAgICAgICByZXR1cm4gcC5nZXRUZXh0V2lkdGhzKG1DaGFycywgc3RhcnQgKyBtU3RhcnQsIGVuZCAtIHN0YXJ0LCB3aWR0aHMpOwogICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGZsb2F0IGdldFRleHRSdW5BZHZhbmNlcyhpbnQgc3RhcnQsIGludCBlbmQsIGludCBjb250ZXh0U3RhcnQsCisgICAgICAgICAgICAgICAgaW50IGNvbnRleHRFbmQsIGludCBmbGFncywgZmxvYXRbXSBhZHZhbmNlcywgaW50IGFkdmFuY2VzSW5kZXgsCisgICAgICAgICAgICAgICAgUGFpbnQgcCkgeworICAgICAgICAgICAgaW50IGNvdW50ID0gZW5kIC0gc3RhcnQ7CisgICAgICAgICAgICBpbnQgY29udGV4dENvdW50ID0gY29udGV4dEVuZCAtIGNvbnRleHRTdGFydDsKKyAgICAgICAgICAgIHJldHVybiBwLmdldFRleHRSdW5BZHZhbmNlcyhtQ2hhcnMsIHN0YXJ0ICsgbVN0YXJ0LCBjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgY29udGV4dFN0YXJ0ICsgbVN0YXJ0LCBjb250ZXh0Q291bnQsIGZsYWdzLCBhZHZhbmNlcywKKyAgICAgICAgICAgICAgICAgICAgYWR2YW5jZXNJbmRleCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IGdldFRleHRSdW5DdXJzb3IoaW50IGNvbnRleHRTdGFydCwgaW50IGNvbnRleHRFbmQsIGludCBmbGFncywKKyAgICAgICAgICAgICAgICBpbnQgb2Zmc2V0LCBpbnQgY3Vyc29yT3B0LCBQYWludCBwKSB7CisgICAgICAgICAgICBpbnQgY29udGV4dENvdW50ID0gY29udGV4dEVuZCAtIGNvbnRleHRTdGFydDsKKyAgICAgICAgICAgIHJldHVybiBwLmdldFRleHRSdW5DdXJzb3IobUNoYXJzLCBjb250ZXh0U3RhcnQgKyBtU3RhcnQsCisgICAgICAgICAgICAgICAgICAgIGNvbnRleHRDb3VudCwgZmxhZ3MsIG9mZnNldCArIG1TdGFydCwgY3Vyc29yT3B0KTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgpAQCAtMzE5OCw3ICszMjI2LDcgQEAKICAgICAgKgogICAgICAqIEBwYXJhbSBjcmVhdGUgSWYgdHJ1ZSwgdGhlIGV4dHJhcyB3aWxsIGJlIGNyZWF0ZWQgaWYgdGhleSBkb24ndCBhbHJlYWR5CiAgICAgICogZXhpc3QuICBPdGhlcndpc2UsIG51bGwgd2lsbCBiZSByZXR1cm5lZCBpZiBub25lIGhhdmUgYmVlbiBjcmVhdGVkLgotICAgICAqIEBzZWUgI3NldElucHV0RXh0cmFzKGludClWaWV3CisgICAgICogQHNlZSAjc2V0SW5wdXRFeHRyYXMoaW50KQogICAgICAqIEBzZWUgRWRpdG9ySW5mbyNleHRyYXMKICAgICAgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNUZXh0Vmlld19lZGl0b3JFeHRyYXMKICAgICAgKi8KQEAgLTMzMTIsNyArMzM0MCw3IEBACiAKICAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBFcnJvclBvcHVwIGV4dGVuZHMgUG9wdXBXaW5kb3cgewogICAgICAgICBwcml2YXRlIGJvb2xlYW4gbUFib3ZlID0gZmFsc2U7Ci0gICAgICAgIHByaXZhdGUgVGV4dFZpZXcgbVZpZXc7CisgICAgICAgIHByaXZhdGUgZmluYWwgVGV4dFZpZXcgbVZpZXc7CiAKICAgICAgICAgRXJyb3JQb3B1cChUZXh0VmlldyB2LCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKICAgICAgICAgICAgIHN1cGVyKHYsIHdpZHRoLCBoZWlnaHQpOwpAQCAtNDg0Nyw2ICs0ODc1LDggQEAKICAgICAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICAgICAgY2FzZSBHcmF2aXR5LlJJR0hUOgorICAgICAgICAgICAgICAgIC8vIE5vdGUsIExheW91dCByZXNvbHZlcyBBTElHTl9PUFBPU0lURSB0byBsZWZ0IG9yCisgICAgICAgICAgICAgICAgLy8gcmlnaHQgYmFzZWQgb24gdGhlIHBhcmFncmFwaCBkaXJlY3Rpb24uCiAgICAgICAgICAgICAgICAgYWxpZ25tZW50ID0gTGF5b3V0LkFsaWdubWVudC5BTElHTl9PUFBPU0lURTsKICAgICAgICAgICAgICAgICBicmVhazsKIApAQCAtNTYzMiw2ICs1NjYyLDggQEAKICAgICAgKiB0byB0aGUgdXNlci4gIFRoaXMgd2lsbCBub3QgbW92ZSB0aGUgY3Vyc29yIGlmIGl0IHJlcHJlc2VudHMgbW9yZSB0aGFuCiAgICAgICogb25lIGNoYXJhY3RlciAoYSBzZWxlY3Rpb24gcmFuZ2UpLiAgVGhpcyB3aWxsIG9ubHkgd29yayBpZiB0aGUKICAgICAgKiBUZXh0VmlldyBjb250YWlucyBzcGFubmFibGUgdGV4dDsgb3RoZXJ3aXNlIGl0IHdpbGwgZG8gbm90aGluZy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgY3Vyc29yIHdhcyBhY3R1YWxseSBtb3ZlZCwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIG1vdmVDdXJzb3JUb1Zpc2libGVPZmZzZXQoKSB7CiAgICAgICAgIGlmICghKG1UZXh0IGluc3RhbmNlb2YgU3Bhbm5hYmxlKSkgewpAQCAtNTY2OCwxMSArNTcwMCwxNSBAQAogICAgICAgICBmaW5hbCBpbnQgbGVmdENoYXIgPSBtTGF5b3V0LmdldE9mZnNldEZvckhvcml6b250YWwobGluZSwgaHMpOwogICAgICAgICBmaW5hbCBpbnQgcmlnaHRDaGFyID0gbUxheW91dC5nZXRPZmZzZXRGb3JIb3Jpem9udGFsKGxpbmUsIGhzcGFjZStocyk7CiAgICAgICAgIAorICAgICAgICAvLyBsaW5lIG1pZ2h0IGNvbnRhaW4gYmlkaXJlY3Rpb25hbCB0ZXh0CisgICAgICAgIGZpbmFsIGludCBsb3dDaGFyID0gbGVmdENoYXIgPCByaWdodENoYXIgPyBsZWZ0Q2hhciA6IHJpZ2h0Q2hhcjsKKyAgICAgICAgZmluYWwgaW50IGhpZ2hDaGFyID0gbGVmdENoYXIgPiByaWdodENoYXIgPyBsZWZ0Q2hhciA6IHJpZ2h0Q2hhcjsKKwogICAgICAgICBpbnQgbmV3U3RhcnQgPSBzdGFydDsKLSAgICAgICAgaWYgKG5ld1N0YXJ0IDwgbGVmdENoYXIpIHsKLSAgICAgICAgICAgIG5ld1N0YXJ0ID0gbGVmdENoYXI7Ci0gICAgICAgIH0gZWxzZSBpZiAobmV3U3RhcnQgPiByaWdodENoYXIpIHsKLSAgICAgICAgICAgIG5ld1N0YXJ0ID0gcmlnaHRDaGFyOworICAgICAgICBpZiAobmV3U3RhcnQgPCBsb3dDaGFyKSB7CisgICAgICAgICAgICBuZXdTdGFydCA9IGxvd0NoYXI7CisgICAgICAgIH0gZWxzZSBpZiAobmV3U3RhcnQgPiBoaWdoQ2hhcikgeworICAgICAgICAgICAgbmV3U3RhcnQgPSBoaWdoQ2hhcjsKICAgICAgICAgfQogICAgICAgICAKICAgICAgICAgaWYgKG5ld1N0YXJ0ICE9IHN0YXJ0KSB7CkBAIC01OTM1LDcgKzU5NzEsNyBAQAogICAgICAgICBwcml2YXRlIGZpbmFsIFdlYWtSZWZlcmVuY2U8VGV4dFZpZXc+IG1WaWV3OwogCiAgICAgICAgIHByaXZhdGUgYnl0ZSBtU3RhdHVzID0gTUFSUVVFRV9TVE9QUEVEOwotICAgICAgICBwcml2YXRlIGZsb2F0IG1TY3JvbGxVbml0OworICAgICAgICBwcml2YXRlIGZpbmFsIGZsb2F0IG1TY3JvbGxVbml0OwogICAgICAgICBwcml2YXRlIGZsb2F0IG1NYXhTY3JvbGw7CiAgICAgICAgIGZsb2F0IG1NYXhGYWRlU2Nyb2xsOwogICAgICAgICBwcml2YXRlIGZsb2F0IG1HaG9zdFN0YXJ0OwpAQCAtNTk0Nyw3ICs1OTgzLDcgQEAKIAogICAgICAgICBNYXJxdWVlKFRleHRWaWV3IHYpIHsKICAgICAgICAgICAgIGZpbmFsIGZsb2F0IGRlbnNpdHkgPSB2LmdldENvbnRleHQoKS5nZXRSZXNvdXJjZXMoKS5nZXREaXNwbGF5TWV0cmljcygpLmRlbnNpdHk7Ci0gICAgICAgICAgICBtU2Nyb2xsVW5pdCA9IChNQVJRVUVFX1BJWEVMU19QRVJfU0VDT05EICogZGVuc2l0eSkgLyAoZmxvYXQpIE1BUlFVRUVfUkVTT0xVVElPTjsKKyAgICAgICAgICAgIG1TY3JvbGxVbml0ID0gKE1BUlFVRUVfUElYRUxTX1BFUl9TRUNPTkQgKiBkZW5zaXR5KSAvIE1BUlFVRUVfUkVTT0xVVElPTjsKICAgICAgICAgICAgIG1WaWV3ID0gbmV3IFdlYWtSZWZlcmVuY2U8VGV4dFZpZXc+KHYpOwogICAgICAgICB9CiAKQEAgLTY1MzIsMjQgKzY1NjgsMzcgQEAKICAgICB9CiAKICAgICBjbGFzcyBDb21taXRTZWxlY3Rpb25SZWNlaXZlciBleHRlbmRzIFJlc3VsdFJlY2VpdmVyIHsKLSAgICAgICAgaW50IG1OZXdTdGFydDsKLSAgICAgICAgaW50IG1OZXdFbmQ7Ci0gICAgICAgIAotICAgICAgICBDb21taXRTZWxlY3Rpb25SZWNlaXZlcigpIHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbVByZXZTdGFydCwgbVByZXZFbmQ7CisgICAgICAgIHByaXZhdGUgZmluYWwgaW50IG1OZXdTdGFydCwgbU5ld0VuZDsKKworICAgICAgICBwdWJsaWMgQ29tbWl0U2VsZWN0aW9uUmVjZWl2ZXIoaW50IG1QcmV2U3RhcnQsIGludCBtUHJldkVuZCwgaW50IG1OZXdTdGFydCwgaW50IG1OZXdFbmQpIHsKICAgICAgICAgICAgIHN1cGVyKGdldEhhbmRsZXIoKSk7CisgICAgICAgICAgICB0aGlzLm1QcmV2U3RhcnQgPSBtUHJldlN0YXJ0OworICAgICAgICAgICAgdGhpcy5tUHJldkVuZCA9IG1QcmV2RW5kOworICAgICAgICAgICAgdGhpcy5tTmV3U3RhcnQgPSBtTmV3U3RhcnQ7CisgICAgICAgICAgICB0aGlzLm1OZXdFbmQgPSBtTmV3RW5kOwogICAgICAgICB9Ci0gICAgICAgIAorCisgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvblJlY2VpdmVSZXN1bHQoaW50IHJlc3VsdENvZGUsIEJ1bmRsZSByZXN1bHREYXRhKSB7Ci0gICAgICAgICAgICBpZiAocmVzdWx0Q29kZSAhPSBJbnB1dE1ldGhvZE1hbmFnZXIuUkVTVUxUX1NIT1dOKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IGxlbiA9IG1UZXh0Lmxlbmd0aCgpOwotICAgICAgICAgICAgICAgIGlmIChtTmV3U3RhcnQgPiBsZW4pIHsKLSAgICAgICAgICAgICAgICAgICAgbU5ld1N0YXJ0ID0gbGVuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobU5ld0VuZCA+IGxlbikgewotICAgICAgICAgICAgICAgICAgICBtTmV3RW5kID0gbGVuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBTZWxlY3Rpb24uc2V0U2VsZWN0aW9uKChTcGFubmFibGUpbVRleHQsIG1OZXdTdGFydCwgbU5ld0VuZCk7CisgICAgICAgICAgICBpbnQgc3RhcnQgPSBtTmV3U3RhcnQ7CisgICAgICAgICAgICBpbnQgZW5kID0gbU5ld0VuZDsKKworICAgICAgICAgICAgLy8gTW92ZSB0aGUgY3Vyc29yIHRvIHRoZSBuZXcgcG9zaXRpb24sIHVubGVzcyB0aGlzIHRhcCB3YXMgYWN0dWFsbHkKKyAgICAgICAgICAgIC8vIHVzZSB0byBzaG93IHRoZSBJTU0uIExlYXZlIGN1cnNvciB1bmNoYW5nZWQgaW4gdGhhdCBjYXNlLgorICAgICAgICAgICAgaWYgKHJlc3VsdENvZGUgPT0gSW5wdXRNZXRob2RNYW5hZ2VyLlJFU1VMVF9TSE9XTikgeworICAgICAgICAgICAgICAgIHN0YXJ0ID0gbVByZXZTdGFydDsKKyAgICAgICAgICAgICAgICBlbmQgPSBtUHJldkVuZDsKICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZmluYWwgaW50IGxlbiA9IG1UZXh0Lmxlbmd0aCgpOworICAgICAgICAgICAgaWYgKHN0YXJ0ID4gbGVuKSB7CisgICAgICAgICAgICAgICAgc3RhcnQgPSBsZW47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZW5kID4gbGVuKSB7CisgICAgICAgICAgICAgICAgZW5kID0gbGVuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU2VsZWN0aW9uLnNldFNlbGVjdGlvbigoU3Bhbm5hYmxlKW1UZXh0LCBzdGFydCwgZW5kKTsKICAgICAgICAgfQogICAgIH0KICAgICAKQEAgLTY1NjIsNyArNjYxMSw3IEBACiAgICAgICAgICAgICBtVG91Y2hGb2N1c1NlbGVjdGVkID0gZmFsc2U7CiAgICAgICAgICAgICBtU2Nyb2xsZWQgPSBmYWxzZTsKICAgICAgICAgfQotICAgICAgICAKKwogICAgICAgICBmaW5hbCBib29sZWFuIHN1cGVyUmVzdWx0ID0gc3VwZXIub25Ub3VjaEV2ZW50KGV2ZW50KTsKIAogICAgICAgICAvKgpAQCAtNjU3NSw3ICs2NjI0LDggQEAKICAgICAgICAgICAgIHJldHVybiBzdXBlclJlc3VsdDsKICAgICAgICAgfQogCi0gICAgICAgIGlmICgobU1vdmVtZW50ICE9IG51bGwgfHwgb25DaGVja0lzVGV4dEVkaXRvcigpKSAmJiBtVGV4dCBpbnN0YW5jZW9mIFNwYW5uYWJsZSAmJiBtTGF5b3V0ICE9IG51bGwpIHsKKyAgICAgICAgaWYgKChtTW92ZW1lbnQgIT0gbnVsbCB8fCBvbkNoZWNrSXNUZXh0RWRpdG9yKCkpICYmCisgICAgICAgICAgICAgICAgbVRleHQgaW5zdGFuY2VvZiBTcGFubmFibGUgJiYgbUxheW91dCAhPSBudWxsKSB7CiAgICAgICAgICAgICAKICAgICAgICAgICAgIGJvb2xlYW4gaGFuZGxlZCA9IGZhbHNlOwogICAgICAgICAgICAgCkBAIC02NTkwLDI5ICs2NjQwLDE3IEBACiAgICAgICAgICAgICAgICAgaWYgKGFjdGlvbiA9PSBNb3Rpb25FdmVudC5BQ1RJT05fVVAgJiYgaXNGb2N1c2VkKCkgJiYgIW1TY3JvbGxlZCkgewogICAgICAgICAgICAgICAgICAgICBJbnB1dE1ldGhvZE1hbmFnZXIgaW1tID0gKElucHV0TWV0aG9kTWFuYWdlcikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRDb250ZXh0KCkuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LklOUFVUX01FVEhPRF9TRVJWSUNFKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgZ29pbmcgdG8gYmUgZ3Jvc3MuLi4gIGlmIHRhcHBpbmcgb24gdGhlIHRleHQgdmlldwotICAgICAgICAgICAgICAgICAgICAvLyBjYXVzZXMgdGhlIElNRSB0byBiZSBkaXNwbGF5ZWQsIHdlIGRvbid0IHdhbnQgdGhlIHNlbGVjdGlvbgotICAgICAgICAgICAgICAgICAgICAvLyB0byBjaGFuZ2UuICBCdXQgdGhlIHNlbGVjdGlvbiBoYXMgYWxyZWFkeSBjaGFuZ2VkLCBhbmQKLSAgICAgICAgICAgICAgICAgICAgLy8gd2Ugd29uJ3Qga25vdyByaWdodCBhd2F5IHdoZXRoZXIgdGhlIElNRSBpcyBnZXR0aW5nCi0gICAgICAgICAgICAgICAgICAgIC8vIGRpc3BsYXllZCwgc28uLi4KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGludCBuZXdTZWxTdGFydCA9IFNlbGVjdGlvbi5nZXRTZWxlY3Rpb25TdGFydChtVGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIGludCBuZXdTZWxFbmQgPSBTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uRW5kKG1UZXh0KTsKKworICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgbmV3U2VsU3RhcnQgPSBTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uU3RhcnQobVRleHQpOworICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgbmV3U2VsRW5kID0gU2VsZWN0aW9uLmdldFNlbGVjdGlvbkVuZChtVGV4dCk7CisKICAgICAgICAgICAgICAgICAgICAgQ29tbWl0U2VsZWN0aW9uUmVjZWl2ZXIgY3NyID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1NlbFN0YXJ0ICE9IG9sZFNlbFN0YXJ0IHx8IG5ld1NlbEVuZCAhPSBvbGRTZWxFbmQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNzciA9IG5ldyBDb21taXRTZWxlY3Rpb25SZWNlaXZlcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgY3NyLm1OZXdTdGFydCA9IG5ld1NlbFN0YXJ0OwotICAgICAgICAgICAgICAgICAgICAgICAgY3NyLm1OZXdFbmQgPSBuZXdTZWxFbmQ7CisgICAgICAgICAgICAgICAgICAgICAgICBjc3IgPSBuZXcgQ29tbWl0U2VsZWN0aW9uUmVjZWl2ZXIob2xkU2VsU3RhcnQsIG9sZFNlbEVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3U2VsU3RhcnQsIG5ld1NlbEVuZCk7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGlmIChpbW0uc2hvd1NvZnRJbnB1dCh0aGlzLCAwLCBjc3IpICYmIGNzciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgSU1FIG1pZ2h0IGdldCBzaG93biAtLSByZXZlcnQgdG8gdGhlIG9sZAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2VsZWN0aW9uLCBhbmQgY2hhbmdlIHRvIHRoZSBuZXcgd2hlbiB3ZSBmaW5hbGx5Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBmaW5kIG91dCBvZiBpdCBpcyBva2F5LgotICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0aW9uLnNldFNlbGVjdGlvbigoU3Bhbm5hYmxlKW1UZXh0LCBvbGRTZWxTdGFydCwgb2xkU2VsRW5kKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaGFuZGxlZCA9IGltbS5zaG93U29mdElucHV0KHRoaXMsIDAsIGNzcikgJiYgKGNzciAhPSBudWxsKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKQEAgLTY2NTcsNyArNjY5NSw3IEBACiAgICAgfQogCiAgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQmxpbmsgZXh0ZW5kcyBIYW5kbGVyIGltcGxlbWVudHMgUnVubmFibGUgewotICAgICAgICBwcml2YXRlIFdlYWtSZWZlcmVuY2U8VGV4dFZpZXc+IG1WaWV3OworICAgICAgICBwcml2YXRlIGZpbmFsIFdlYWtSZWZlcmVuY2U8VGV4dFZpZXc+IG1WaWV3OwogICAgICAgICBwcml2YXRlIGJvb2xlYW4gbUNhbmNlbGxlZDsKIAogICAgICAgICBwdWJsaWMgQmxpbmsoVGV4dFZpZXcgdikgewpAQCAtNzI5MSw2ICs3MzI5LDcgQEAKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIHBlcmZvcm1Mb25nQ2xpY2soKSB7CiAgICAgICAgIGlmIChzdXBlci5wZXJmb3JtTG9uZ0NsaWNrKCkpIHsKICAgICAgICAgICAgIG1FYXRUb3VjaFJlbGVhc2UgPSB0cnVlOwpAQCAtNzMxOCw5ICs3MzU3LDkgQEAKICAgICBwcml2YXRlIEFycmF5TGlzdDxUZXh0V2F0Y2hlcj4gIG1MaXN0ZW5lcnMgPSBudWxsOwogCiAgICAgLy8gZGlzcGxheSBhdHRyaWJ1dGVzCi0gICAgcHJpdmF0ZSBUZXh0UGFpbnQgICAgICAgICAgICAgICBtVGV4dFBhaW50OworICAgIHByaXZhdGUgZmluYWwgVGV4dFBhaW50ICAgICAgICAgbVRleHRQYWludDsKICAgICBwcml2YXRlIGJvb2xlYW4gICAgICAgICAgICAgICAgIG1Vc2VyU2V0VGV4dFNjYWxlWDsKLSAgICBwcml2YXRlIFBhaW50ICAgICAgICAgICAgICAgICAgIG1IaWdobGlnaHRQYWludDsKKyAgICBwcml2YXRlIGZpbmFsIFBhaW50ICAgICAgICAgICAgIG1IaWdobGlnaHRQYWludDsKICAgICBwcml2YXRlIGludCAgICAgICAgICAgICAgICAgICAgIG1IaWdobGlnaHRDb2xvciA9IDB4RkZCQkRERkY7CiAgICAgcHJpdmF0ZSBMYXlvdXQgICAgICAgICAgICAgICAgICBtTGF5b3V0OwogCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvVmlld0FuaW1hdG9yLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvVmlld0FuaW1hdG9yLmphdmEKaW5kZXggOTA3Y2ZiMy4uN2I2Njg5MyAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1ZpZXdBbmltYXRvci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9WaWV3QW5pbWF0b3IuamF2YQpAQCAtMzEsMTEgKzMxLDEzIEBACiAgKgogICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjVmlld0FuaW1hdG9yX2luQW5pbWF0aW9uCiAgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNWaWV3QW5pbWF0b3Jfb3V0QW5pbWF0aW9uCisgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNWaWV3QW5pbWF0b3JfYW5pbWF0ZUZpcnN0VmlldwogICovCiBwdWJsaWMgY2xhc3MgVmlld0FuaW1hdG9yIGV4dGVuZHMgRnJhbWVMYXlvdXQgewogCiAgICAgaW50IG1XaGljaENoaWxkID0gMDsKICAgICBib29sZWFuIG1GaXJzdFRpbWUgPSB0cnVlOworCiAgICAgYm9vbGVhbiBtQW5pbWF0ZUZpcnN0VGltZSA9IHRydWU7CiAKICAgICBBbmltYXRpb24gbUluQW5pbWF0aW9uOwpAQCAtNTksNiArNjEsMTAgQEAKICAgICAgICAgaWYgKHJlc291cmNlID4gMCkgewogICAgICAgICAgICAgc2V0T3V0QW5pbWF0aW9uKGNvbnRleHQsIHJlc291cmNlKTsKICAgICAgICAgfQorCisgICAgICAgIGJvb2xlYW4gZmxhZyA9IGEuZ2V0Qm9vbGVhbihjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5WaWV3QW5pbWF0b3JfYW5pbWF0ZUZpcnN0VmlldywgdHJ1ZSk7CisgICAgICAgIHNldEFuaW1hdGVGaXJzdFZpZXcoZmxhZyk7CisKICAgICAgICAgYS5yZWN5Y2xlKCk7CiAKICAgICAgICAgaW5pdFZpZXdBbmltYXRvcihjb250ZXh0LCBhdHRycyk7CkBAIC04NCwxMCArOTAsMTAgQEAKICAgICAgICAgc2V0TWVhc3VyZUFsbENoaWxkcmVuKG1lYXN1cmVBbGxDaGlsZHJlbik7CiAgICAgICAgIGEucmVjeWNsZSgpOwogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIFNldHMgd2hpY2ggY2hpbGQgdmlldyB3aWxsIGJlIGRpc3BsYXllZC4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIEBwYXJhbSB3aGljaENoaWxkIHRoZSBpbmRleCBvZiB0aGUgY2hpbGQgdmlldyB0byBkaXNwbGF5CiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0RGlzcGxheWVkQ2hpbGQoaW50IHdoaWNoQ2hpbGQpIHsKQEAgLTEwNSwxNCArMTExLDE0IEBACiAgICAgICAgICAgICByZXF1ZXN0Rm9jdXMoRk9DVVNfRk9SV0FSRCk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgY3VycmVudGx5IGRpc3BsYXllZCBjaGlsZCB2aWV3LgogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0RGlzcGxheWVkQ2hpbGQoKSB7CiAgICAgICAgIHJldHVybiBtV2hpY2hDaGlsZDsKICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBNYW51YWxseSBzaG93cyB0aGUgbmV4dCBjaGlsZC4KICAgICAgKi8KQEAgLTEyOCw2ICsxMzQsMzUgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBTaG93cyBvbmx5IHRoZSBzcGVjaWZpZWQgY2hpbGQuIFRoZSBvdGhlciBkaXNwbGF5cyBWaWV3cyBleGl0IHRoZSBzY3JlZW4sCisgICAgICogb3B0aW9uYWxseSB3aXRoIHRoZSB3aXRoIHRoZSB7QGxpbmsgI2dldE91dEFuaW1hdGlvbigpIG91dCBhbmltYXRpb259IGFuZAorICAgICAqIHRoZSBzcGVjaWZpZWQgY2hpbGQgZW50ZXJzIHRoZSBzY3JlZW4sIG9wdGlvbmFsbHkgd2l0aCB0aGUKKyAgICAgKiB7QGxpbmsgI2dldEluQW5pbWF0aW9uKCkgaW4gYW5pbWF0aW9ufS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjaGlsZEluZGV4IFRoZSBpbmRleCBvZiB0aGUgY2hpbGQgdG8gYmUgc2hvd24uCisgICAgICogQHBhcmFtIGFuaW1hdGUgV2hldGhlciBvciBub3QgdG8gdXNlIHRoZSBpbiBhbmQgb3V0IGFuaW1hdGlvbnMsIGRlZmF1bHRzCisgICAgICogICAgICAgICAgICB0byB0cnVlLgorICAgICAqLworICAgIHZvaWQgc2hvd09ubHkoaW50IGNoaWxkSW5kZXgsIGJvb2xlYW4gYW5pbWF0ZSkgeworICAgICAgICBmaW5hbCBpbnQgY291bnQgPSBnZXRDaGlsZENvdW50KCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgICAgZmluYWwgVmlldyBjaGlsZCA9IGdldENoaWxkQXQoaSk7CisgICAgICAgICAgICBpZiAoaSA9PSBjaGlsZEluZGV4KSB7CisgICAgICAgICAgICAgICAgaWYgKGFuaW1hdGUgJiYgbUluQW5pbWF0aW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RhcnRBbmltYXRpb24obUluQW5pbWF0aW9uKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2hpbGQuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworICAgICAgICAgICAgICAgIG1GaXJzdFRpbWUgPSBmYWxzZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKGFuaW1hdGUgJiYgbU91dEFuaW1hdGlvbiAhPSBudWxsICYmIGNoaWxkLmdldFZpc2liaWxpdHkoKSA9PSBWaWV3LlZJU0lCTEUpIHsKKyAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RhcnRBbmltYXRpb24obU91dEFuaW1hdGlvbik7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaGlsZC5nZXRBbmltYXRpb24oKSA9PSBtSW5BbmltYXRpb24pCisgICAgICAgICAgICAgICAgICAgIGNoaWxkLmNsZWFyQW5pbWF0aW9uKCk7CisgICAgICAgICAgICAgICAgY2hpbGQuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIC8qKgogICAgICAqIFNob3dzIG9ubHkgdGhlIHNwZWNpZmllZCBjaGlsZC4gVGhlIG90aGVyIGRpc3BsYXlzIFZpZXdzIGV4aXQgdGhlIHNjcmVlbgogICAgICAqIHdpdGggdGhlIHtAbGluayAjZ2V0T3V0QW5pbWF0aW9uKCkgb3V0IGFuaW1hdGlvbn0gYW5kIHRoZSBzcGVjaWZpZWQgY2hpbGQKICAgICAgKiBlbnRlcnMgdGhlIHNjcmVlbiB3aXRoIHRoZSB7QGxpbmsgI2dldEluQW5pbWF0aW9uKCkgaW4gYW5pbWF0aW9ufS4KQEAgLTEzNSwyNCArMTcwLDggQEAKICAgICAgKiBAcGFyYW0gY2hpbGRJbmRleCBUaGUgaW5kZXggb2YgdGhlIGNoaWxkIHRvIGJlIHNob3duLgogICAgICAqLwogICAgIHZvaWQgc2hvd09ubHkoaW50IGNoaWxkSW5kZXgpIHsKLSAgICAgICAgZmluYWwgaW50IGNvdW50ID0gZ2V0Q2hpbGRDb3VudCgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgIGZpbmFsIFZpZXcgY2hpbGQgPSBnZXRDaGlsZEF0KGkpOwotICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBjaGVja0ZvckZpcnN0ID0gKCFtRmlyc3RUaW1lIHx8IG1BbmltYXRlRmlyc3RUaW1lKTsKLSAgICAgICAgICAgIGlmIChpID09IGNoaWxkSW5kZXgpIHsKLSAgICAgICAgICAgICAgICBpZiAoY2hlY2tGb3JGaXJzdCAmJiBtSW5BbmltYXRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGFydEFuaW1hdGlvbihtSW5BbmltYXRpb24pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjaGlsZC5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICAgICAgbUZpcnN0VGltZSA9IGZhbHNlOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAoY2hlY2tGb3JGaXJzdCAmJiBtT3V0QW5pbWF0aW9uICE9IG51bGwgJiYgY2hpbGQuZ2V0VmlzaWJpbGl0eSgpID09IFZpZXcuVklTSUJMRSkgewotICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGFydEFuaW1hdGlvbihtT3V0QW5pbWF0aW9uKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoaWxkLmdldEFuaW1hdGlvbigpID09IG1JbkFuaW1hdGlvbikKLSAgICAgICAgICAgICAgICAgICAgY2hpbGQuY2xlYXJBbmltYXRpb24oKTsKLSAgICAgICAgICAgICAgICBjaGlsZC5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgICAgICAgZmluYWwgYm9vbGVhbiBhbmltYXRlID0gKCFtRmlyc3RUaW1lIHx8IG1BbmltYXRlRmlyc3RUaW1lKTsKKyAgICAgICAgc2hvd09ubHkoY2hpbGRJbmRleCwgYW5pbWF0ZSk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvVmlld0ZsaXBwZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9WaWV3RmxpcHBlci5qYXZhCmluZGV4IDgwMzQ5NjEuLmM2ZjZlODEgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9WaWV3RmxpcHBlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9WaWV3RmxpcHBlci5qYXZhCkBAIC03NSw3ICs3NSw3IEBACiAgICAgICAgICAgICAgICAgdXBkYXRlUnVubmluZygpOwogICAgICAgICAgICAgfSBlbHNlIGlmIChJbnRlbnQuQUNUSU9OX1VTRVJfUFJFU0VOVC5lcXVhbHMoYWN0aW9uKSkgewogICAgICAgICAgICAgICAgIG1Vc2VyUHJlc2VudCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgdXBkYXRlUnVubmluZygpOworICAgICAgICAgICAgICAgIHVwZGF0ZVJ1bm5pbmcoZmFsc2UpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfTsKQEAgLTEwOSw3ICsxMDksNyBAQAogICAgIHByb3RlY3RlZCB2b2lkIG9uV2luZG93VmlzaWJpbGl0eUNoYW5nZWQoaW50IHZpc2liaWxpdHkpIHsKICAgICAgICAgc3VwZXIub25XaW5kb3dWaXNpYmlsaXR5Q2hhbmdlZCh2aXNpYmlsaXR5KTsKICAgICAgICAgbVZpc2libGUgPSB2aXNpYmlsaXR5ID09IFZJU0lCTEU7Ci0gICAgICAgIHVwZGF0ZVJ1bm5pbmcoKTsKKyAgICAgICAgdXBkYXRlUnVubmluZyhmYWxzZSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xNDQsMTAgKzE0NCwyMiBAQAogICAgICAqIG9uIHtAbGluayAjbVJ1bm5pbmd9IGFuZCB7QGxpbmsgI21WaXNpYmxlfSBzdGF0ZS4KICAgICAgKi8KICAgICBwcml2YXRlIHZvaWQgdXBkYXRlUnVubmluZygpIHsKKyAgICAgICAgdXBkYXRlUnVubmluZyh0cnVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbnRlcm5hbCBtZXRob2QgdG8gc3RhcnQgb3Igc3RvcCBkaXNwYXRjaGluZyBmbGlwIHtAbGluayBNZXNzYWdlfSBiYXNlZAorICAgICAqIG9uIHtAbGluayAjbVJ1bm5pbmd9IGFuZCB7QGxpbmsgI21WaXNpYmxlfSBzdGF0ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmbGlwTm93IERldGVybWluZXMgd2hldGhlciBvciBub3QgdG8gZXhlY3V0ZSB0aGUgYW5pbWF0aW9uIG5vdywgaW4KKyAgICAgKiAgICAgICAgICAgIGFkZGl0aW9uIHRvIHF1ZXVpbmcgZnV0dXJlIGZsaXBzLiBJZiBvbWl0dGVkLCBkZWZhdWx0cyB0bworICAgICAqICAgICAgICAgICAgdHJ1ZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgdXBkYXRlUnVubmluZyhib29sZWFuIGZsaXBOb3cpIHsKICAgICAgICAgYm9vbGVhbiBydW5uaW5nID0gbVZpc2libGUgJiYgbVN0YXJ0ZWQgJiYgbVVzZXJQcmVzZW50OwogICAgICAgICBpZiAocnVubmluZyAhPSBtUnVubmluZykgewogICAgICAgICAgICAgaWYgKHJ1bm5pbmcpIHsKLSAgICAgICAgICAgICAgICBzaG93T25seShtV2hpY2hDaGlsZCk7CisgICAgICAgICAgICAgICAgc2hvd09ubHkobVdoaWNoQ2hpbGQsIGZsaXBOb3cpOwogICAgICAgICAgICAgICAgIE1lc3NhZ2UgbXNnID0gbUhhbmRsZXIub2J0YWluTWVzc2FnZShGTElQX01TRyk7CiAgICAgICAgICAgICAgICAgbUhhbmRsZXIuc2VuZE1lc3NhZ2VEZWxheWVkKG1zZywgbUZsaXBJbnRlcnZhbCk7CiAgICAgICAgICAgICB9IGVsc2UgewpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1pvb21CdXR0b25zQ29udHJvbGxlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1pvb21CdXR0b25zQ29udHJvbGxlci5qYXZhCmluZGV4IDNkZjQxOWEuLjQ1MGM5NjYgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9ab29tQnV0dG9uc0NvbnRyb2xsZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvWm9vbUJ1dHRvbnNDb250cm9sbGVyLmphdmEKQEAgLTY2LDggKzY2LDkgQEAKICAqIHtAbGluayAjc2V0Wm9vbUluRW5hYmxlZChib29sZWFuKX0gYW5kIHtAbGluayAjc2V0Wm9vbU91dEVuYWJsZWQoYm9vbGVhbil9LgogICogPHA+CiAgKiBJZiB5b3UgYXJlIHVzaW5nIHRoaXMgd2l0aCBhIGN1c3RvbSBWaWV3LCBwbGVhc2UgY2FsbAotICoge0BsaW5rICNzZXRWaXNpYmxlKGJvb2xlYW4pIHNldFZpc2libGUoZmFsc2UpfSBmcm9tIHRoZQotICoge0BsaW5rIFZpZXcjb25EZXRhY2hlZEZyb21XaW5kb3d9LgorICoge0BsaW5rICNzZXRWaXNpYmxlKGJvb2xlYW4pIHNldFZpc2libGUoZmFsc2UpfSBmcm9tCisgKiB7QGxpbmsgVmlldyNvbkRldGFjaGVkRnJvbVdpbmRvd30gYW5kIGZyb20ge0BsaW5rIFZpZXcjb25WaXNpYmlsaXR5Q2hhbmdlZH0KKyAqIHdoZW4gPGNvZGU+dmlzaWJpbGl0eSAhPSBWaWV3LlZJU0lCTEU8L2NvZGU+LgogICoKICAqLwogcHVibGljIGNsYXNzIFpvb21CdXR0b25zQ29udHJvbGxlciBpbXBsZW1lbnRzIFZpZXcuT25Ub3VjaExpc3RlbmVyIHsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9hcHAvU3BsaXRBY3Rpb25CYXIuamF2YSBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9hcHAvU3BsaXRBY3Rpb25CYXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNWFlNzkzCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL2FwcC9TcGxpdEFjdGlvbkJhci5qYXZhCkBAIC0wLDAgKzEsMTA1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC5hcHA7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpb25CYXI7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuQWN0aW9uQmFyVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5MaW5lYXJMYXlvdXQ7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuU3Bpbm5lckFkYXB0ZXI7CisKKy8qKgorICogU3BsaXRBY3Rpb25CYXIgaXMgdGhlIEFjdGlvbkJhciBpbXBsZW1lbnRhdGlvbiB1c2VkCisgKiBieSBzbWFsbC1zY3JlZW4gZGV2aWNlcy4gSXQgZXhwZWN0cyB0byBzcGxpdCBjb250ZXh0dWFsCisgKiBtb2RlcyBhY3Jvc3MgYm90aCB0aGUgQWN0aW9uQmFyVmlldyBhdCB0aGUgdG9wIG9mIHRoZSBzY3JlZW4KKyAqIGFuZCBhIGhvcml6b250YWwgTGluZWFyTGF5b3V0IGF0IHRoZSBib3R0b20gd2hpY2ggaXMgbm9ybWFsbHkKKyAqIGhpZGRlbi4KKyAqLworcHVibGljIGNsYXNzIFNwbGl0QWN0aW9uQmFyIGV4dGVuZHMgQWN0aW9uQmFyIHsKKyAgICBwcml2YXRlIEFjdGlvbkJhclZpZXcgbUFjdGlvblZpZXc7CisgICAgcHJpdmF0ZSBMaW5lYXJMYXlvdXQgbUNvbnRleHRWaWV3OworICAgIAorICAgIHB1YmxpYyBTcGxpdEFjdGlvbkJhcihBY3Rpb25CYXJWaWV3IHZpZXcsIExpbmVhckxheW91dCBjb250ZXh0VmlldykgeworICAgICAgICBtQWN0aW9uVmlldyA9IHZpZXc7CisgICAgICAgIG1Db250ZXh0VmlldyA9IGNvbnRleHRWaWV3OworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBzZXRDYWxsYmFjayhDYWxsYmFjayBjYWxsYmFjaykgeworICAgICAgICBtQWN0aW9uVmlldy5zZXRDYWxsYmFjayhjYWxsYmFjayk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q3VzdG9tTmF2aWdhdGlvbk1vZGUoVmlldyB2aWV3KSB7CisgICAgICAgIG1BY3Rpb25WaWV3LnNldEN1c3RvbU5hdmlnYXRpb25WaWV3KHZpZXcpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBzZXREcm9wZG93bk5hdmlnYXRpb25Nb2RlKFNwaW5uZXJBZGFwdGVyIGFkYXB0ZXIpIHsKKyAgICAgICAgbUFjdGlvblZpZXcuc2V0TmF2aWdhdGlvbk1vZGUoTkFWSUdBVElPTl9NT0RFX0RST1BET1dOX0xJU1QpOworICAgICAgICBtQWN0aW9uVmlldy5zZXREcm9wZG93bkFkYXB0ZXIoYWRhcHRlcik7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHNldFN0YW5kYXJkTmF2aWdhdGlvbk1vZGUoQ2hhclNlcXVlbmNlIHRpdGxlKSB7CisgICAgICAgIHNldFN0YW5kYXJkTmF2aWdhdGlvbk1vZGUodGl0bGUsIG51bGwpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBzZXRTdGFuZGFyZE5hdmlnYXRpb25Nb2RlKENoYXJTZXF1ZW5jZSB0aXRsZSwgQ2hhclNlcXVlbmNlIHN1YnRpdGxlKSB7CisgICAgICAgIG1BY3Rpb25WaWV3LnNldE5hdmlnYXRpb25Nb2RlKE5BVklHQVRJT05fTU9ERV9TVEFOREFSRCk7CisgICAgICAgIG1BY3Rpb25WaWV3LnNldFRpdGxlKHRpdGxlKTsKKyAgICAgICAgbUFjdGlvblZpZXcuc2V0U3VidGl0bGUoc3VidGl0bGUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFRpdGxlKENoYXJTZXF1ZW5jZSB0aXRsZSkgeworICAgICAgICBtQWN0aW9uVmlldy5zZXRUaXRsZSh0aXRsZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U3VidGl0bGUoQ2hhclNlcXVlbmNlIHN1YnRpdGxlKSB7CisgICAgICAgIG1BY3Rpb25WaWV3LnNldFN1YnRpdGxlKHN1YnRpdGxlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXREaXNwbGF5T3B0aW9ucyhpbnQgb3B0aW9ucykgeworICAgICAgICBtQWN0aW9uVmlldy5zZXREaXNwbGF5T3B0aW9ucyhvcHRpb25zKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgc2V0RGlzcGxheU9wdGlvbnMoaW50IG9wdGlvbnMsIGludCBtYXNrKSB7CisgICAgICAgIGZpbmFsIGludCBjdXJyZW50ID0gbUFjdGlvblZpZXcuZ2V0RGlzcGxheU9wdGlvbnMoKTsgCisgICAgICAgIG1BY3Rpb25WaWV3LnNldERpc3BsYXlPcHRpb25zKChvcHRpb25zICYgbWFzaykgfCAoY3VycmVudCAmIH5tYXNrKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0QmFja2dyb3VuZERyYXdhYmxlKERyYXdhYmxlIGQpIHsKKyAgICAgICAgbUFjdGlvblZpZXcuc2V0QmFja2dyb3VuZERyYXdhYmxlKGQpOworICAgIH0KKworICAgIHB1YmxpYyBWaWV3IGdldEN1c3RvbU5hdmlnYXRpb25WaWV3KCkgeworICAgICAgICByZXR1cm4gbUFjdGlvblZpZXcuZ2V0Q3VzdG9tTmF2aWdhdGlvblZpZXcoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ2hhclNlcXVlbmNlIGdldFRpdGxlKCkgeworICAgICAgICByZXR1cm4gbUFjdGlvblZpZXcuZ2V0VGl0bGUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ2hhclNlcXVlbmNlIGdldFN1YnRpdGxlKCkgeworICAgICAgICByZXR1cm4gbUFjdGlvblZpZXcuZ2V0U3VidGl0bGUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldE5hdmlnYXRpb25Nb2RlKCkgeworICAgICAgICByZXR1cm4gbUFjdGlvblZpZXcuZ2V0TmF2aWdhdGlvbk1vZGUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldERpc3BsYXlPcHRpb25zKCkgeworICAgICAgICByZXR1cm4gbUFjdGlvblZpZXcuZ2V0RGlzcGxheU9wdGlvbnMoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvZGF0YWJhc2UvU29ydEN1cnNvci5qYXZhIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL2RhdGFiYXNlL1NvcnRDdXJzb3IuamF2YQppbmRleCA5OTQxMGJjLi4wMDI1NTEyIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvZGF0YWJhc2UvU29ydEN1cnNvci5qYXZhCisrKyBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9kYXRhYmFzZS9Tb3J0Q3Vyc29yLmphdmEKQEAgLTE4MiwyNCArMTgyLDYgQEAKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBkZWxldGVSb3coKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1DdXJzb3IuZGVsZXRlUm93KCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gY29tbWl0VXBkYXRlcygpIHsKLSAgICAgICAgaW50IGxlbmd0aCA9IG1DdXJzb3JzLmxlbmd0aDsKLSAgICAgICAgZm9yIChpbnQgaSA9IDAgOyBpIDwgbGVuZ3RoIDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAobUN1cnNvcnNbaV0gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1DdXJzb3JzW2ldLmNvbW1pdFVwZGF0ZXMoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBvbkNoYW5nZSh0cnVlKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZyBnZXRTdHJpbmcoaW50IGNvbHVtbikKICAgICB7CiAgICAgICAgIHJldHVybiBtQ3Vyc29yLmdldFN0cmluZyhjb2x1bW4pOwpAQCAtMjM2LDYgKzIxOCwxMSBAQAogICAgIH0KIAogICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgZ2V0VHlwZShpbnQgY29sdW1uKSB7CisgICAgICAgIHJldHVybiBtQ3Vyc29yLmdldFR5cGUoY29sdW1uKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBpc051bGwoaW50IGNvbHVtbikKICAgICB7CiAgICAgICAgIHJldHVybiBtQ3Vyc29yLmlzTnVsbChjb2x1bW4pOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL29zL1Bvd2VyUHJvZmlsZS5qYXZhIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL29zL1Bvd2VyUHJvZmlsZS5qYXZhCmluZGV4IDIzNjlkMjUuLjEyN2VkNjggMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9vcy9Qb3dlclByb2ZpbGUuamF2YQorKysgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvb3MvUG93ZXJQcm9maWxlLmphdmEKQEAgLTEyNiw2ICsxMjYsMTEgQEAKIAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBPV0VSX0NQVV9TUEVFRFMgPSAiY3B1LnNwZWVkcyI7CiAKKyAgICAvKioKKyAgICAgKiBCYXR0ZXJ5IGNhcGFjaXR5IGluIG1pbGxpQW1wSG91ciAobUFoKS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQT1dFUl9CQVRURVJZX0NBUEFDSVRZID0gImJhdHRlcnkuY2FwYWNpdHkiOworCiAgICAgc3RhdGljIGZpbmFsIEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+IHNQb3dlck1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOwogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19ERVZJQ0UgPSAiZGV2aWNlIjsKQEAgLTI0Myw2ICsyNDgsMTkgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGJhdHRlcnkgY2FwYWNpdHksIGlmIGF2YWlsYWJsZSwgaW4gbWlsbGkgQW1wIEhvdXJzLiBJZiBub3QgYXZhaWxhYmxlLAorICAgICAqIGl0IHJldHVybnMgemVyby4KKyAgICAgKiBAcmV0dXJuIHRoZSBiYXR0ZXJ5IGNhcGFjaXR5IGluIG1BaAorICAgICAqLworICAgIHB1YmxpYyBkb3VibGUgZ2V0QmF0dGVyeUNhcGFjaXR5KCkgeworICAgICAgICByZXR1cm4gZ2V0QXZlcmFnZVBvd2VyKFBPV0VSX0JBVFRFUllfQ0FQQUNJVFkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBzcGVlZHMgdGhhdCB0aGUgQ1BVIGNhbiBiZSBydW4gYXQuCisgICAgICogQHJldHVybgorICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0TnVtU3BlZWRTdGVwcygpIHsKICAgICAgICAgT2JqZWN0IHZhbHVlID0gc1Bvd2VyTWFwLmdldChQT1dFUl9DUFVfU1BFRURTKTsKICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwgJiYgdmFsdWUgaW5zdGFuY2VvZiBEb3VibGVbXSkgewpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL29zL1NhbXBsaW5nUHJvZmlsZXJJbnRlZ3JhdGlvbi5qYXZhIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL29zL1NhbXBsaW5nUHJvZmlsZXJJbnRlZ3JhdGlvbi5qYXZhCmluZGV4IDVmNWM3YTQuLjM4MzYyYzEgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9vcy9TYW1wbGluZ1Byb2ZpbGVySW50ZWdyYXRpb24uamF2YQorKysgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvb3MvU2FtcGxpbmdQcm9maWxlckludGVncmF0aW9uLmphdmEKQEAgLTE2LDE0ICsxNiwxNSBAQAogCiBwYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLm9zOwogCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VJbmZvOwogaW1wb3J0IGRhbHZpay5zeXN0ZW0uU2FtcGxpbmdQcm9maWxlcjsKIAogaW1wb3J0IGphdmEuaW8uRmlsZTsKIGltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcjsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcnM7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0Jvb2xlYW47CiAKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogaW1wb3J0IGFuZHJvaWQub3MuKjsKQEAgLTM1LDE1ICszNiwyNyBAQAogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJTYW1wbGluZ1Byb2ZpbGVySW50ZWdyYXRpb24iOwogCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU05BUFNIT1RfRElSID0gIi9kYXRhL3NuYXBzaG90cyI7CisKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIGVuYWJsZWQ7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRXhlY3V0b3Igc25hcHNob3RXcml0ZXI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IHNhbXBsaW5nUHJvZmlsZXJIejsKKyAgICAKKyAgICAvKiogV2hldGhlciBvciBub3Qgd2UndmUgY3JlYXRlZCB0aGUgc25hcHNob3RzIGRpci4gKi8KKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGRpck1hZGUgPSBmYWxzZTsKKworICAgIC8qKiBXaGV0aGVyIG9yIG5vdCBhIHNuYXBzaG90IGlzIGJlaW5nIHBlcnNpc3RlZC4gKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBBdG9taWNCb29sZWFuIHBlbmRpbmcgPSBuZXcgQXRvbWljQm9vbGVhbihmYWxzZSk7CisKICAgICBzdGF0aWMgewotICAgICAgICBlbmFibGVkID0gIjEiLmVxdWFscyhTeXN0ZW1Qcm9wZXJ0aWVzLmdldCgicGVyc2lzdC5zYW1wbGluZ19wcm9maWxlciIpKTsKLSAgICAgICAgaWYgKGVuYWJsZWQpIHsKKyAgICAgICAgc2FtcGxpbmdQcm9maWxlckh6ID0gU3lzdGVtUHJvcGVydGllcy5nZXRJbnQoInBlcnNpc3Quc3lzLnByb2ZpbGVyX2h6IiwgMCk7CisgICAgICAgIGlmIChzYW1wbGluZ1Byb2ZpbGVySHogPiAwKSB7CiAgICAgICAgICAgICBzbmFwc2hvdFdyaXRlciA9IEV4ZWN1dG9ycy5uZXdTaW5nbGVUaHJlYWRFeGVjdXRvcigpOwotICAgICAgICAgICAgTG9nLmkoVEFHLCAiUHJvZmlsZXIgaXMgZW5hYmxlZC4iKTsKKyAgICAgICAgICAgIGVuYWJsZWQgPSB0cnVlOworICAgICAgICAgICAgTG9nLmkoVEFHLCAiUHJvZmlsZXIgaXMgZW5hYmxlZC4gU2FtcGxpbmcgUHJvZmlsZXIgSHo6ICIgKyBzYW1wbGluZ1Byb2ZpbGVySHopOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgc25hcHNob3RXcml0ZXIgPSBudWxsOworICAgICAgICAgICAgZW5hYmxlZCA9IGZhbHNlOwogICAgICAgICAgICAgTG9nLmkoVEFHLCAiUHJvZmlsZXIgaXMgZGlzYWJsZWQuIik7CiAgICAgICAgIH0KICAgICB9CkBAIC02MCw0NSArNzMsNDUgQEAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc3RhcnQoKSB7CiAgICAgICAgIGlmICghZW5hYmxlZCkgcmV0dXJuOwotICAgICAgICBTYW1wbGluZ1Byb2ZpbGVyLmdldEluc3RhbmNlKCkuc3RhcnQoMTApOworICAgICAgICBTYW1wbGluZ1Byb2ZpbGVyLmdldEluc3RhbmNlKCkuc3RhcnQoc2FtcGxpbmdQcm9maWxlckh6KTsKICAgICB9CiAKLSAgICAvKiogV2hldGhlciBvciBub3Qgd2UndmUgY3JlYXRlZCB0aGUgc25hcHNob3RzIGRpci4gKi8KLSAgICBzdGF0aWMgYm9vbGVhbiBkaXJNYWRlID0gZmFsc2U7Ci0KLSAgICAvKiogV2hldGhlciBvciBub3QgYSBzbmFwc2hvdCBpcyBiZWluZyBwZXJzaXN0ZWQuICovCi0gICAgc3RhdGljIHZvbGF0aWxlIGJvb2xlYW4gcGVuZGluZzsKLQogICAgIC8qKgotICAgICAqIFdyaXRlcyBhIHNuYXBzaG90IHRvIHRoZSBTRCBjYXJkIGlmIHByb2ZpbGluZyBpcyBlbmFibGVkLgorICAgICAqIFdyaXRlcyBhIHNuYXBzaG90IGlmIHByb2ZpbGluZyBpcyBlbmFibGVkLgogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZVNuYXBzaG90KGZpbmFsIFN0cmluZyBuYW1lKSB7CisgICAgcHVibGljIHN0YXRpYyB2b2lkIHdyaXRlU25hcHNob3QoZmluYWwgU3RyaW5nIHByb2Nlc3NOYW1lLCBmaW5hbCBQYWNrYWdlSW5mbyBwYWNrYWdlSW5mbykgewogICAgICAgICBpZiAoIWVuYWJsZWQpIHJldHVybjsKIAogICAgICAgICAvKgotICAgICAgICAgKiBJZiB3ZSdyZSBhbHJlYWR5IHdyaXRpbmcgYSBzbmFwc2hvdCwgZG9uJ3QgYm90aGVyIGVucXVlaW5nIGFub3RoZXIKKyAgICAgICAgICogSWYgd2UncmUgYWxyZWFkeSB3cml0aW5nIGEgc25hcHNob3QsIGRvbid0IGJvdGhlciBlbnF1ZXVlaW5nIGFub3RoZXIKICAgICAgICAgICogcmVxdWVzdCByaWdodCBub3cuIFRoaXMgd2lsbCByZWR1Y2UgdGhlIG51bWJlciBvZiBpbmRpdmlkdWFsCiAgICAgICAgICAqIHNuYXBzaG90cyBhbmQgaW4gdHVybiB0aGUgdG90YWwgYW1vdW50IG9mIG1lbW9yeSBjb25zdW1lZCAob25lIGJpZwogICAgICAgICAgKiBzbmFwc2hvdCBpcyBzbWFsbGVyIHRoYW4gTiBzdWJzZXQgc25hcHNob3RzKS4KICAgICAgICAgICovCi0gICAgICAgIGlmICghcGVuZGluZykgewotICAgICAgICAgICAgcGVuZGluZyA9IHRydWU7CisgICAgICAgIGlmIChwZW5kaW5nLmNvbXBhcmVBbmRTZXQoZmFsc2UsIHRydWUpKSB7CiAgICAgICAgICAgICBzbmFwc2hvdFdyaXRlci5leGVjdXRlKG5ldyBSdW5uYWJsZSgpIHsKICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBkaXIgPSAiL3NkY2FyZC9zbmFwc2hvdHMiOwogICAgICAgICAgICAgICAgICAgICBpZiAoIWRpck1hZGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBGaWxlKGRpcikubWtkaXJzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3IEZpbGUoZGlyKS5pc0RpcmVjdG9yeSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBGaWxlIGRpciA9IG5ldyBGaWxlKFNOQVBTSE9UX0RJUik7CisgICAgICAgICAgICAgICAgICAgICAgICBkaXIubWtkaXJzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgZGlyZWN0b3J5IG5lZWRzIHRvIGJlIHdyaXRhYmxlIHRvIGFueWJvZHkKKyAgICAgICAgICAgICAgICAgICAgICAgIGRpci5zZXRXcml0YWJsZSh0cnVlLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgZGlyZWN0b3J5IG5lZWRzIHRvIGJlIGV4ZWN1dGFibGUgdG8gYW55Ym9keQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG9uJ3Qga25vdyB3aHkgeWV0LCBidXQgbW9kZSA3MjMgd291bGQgd29yaywgd2hpbGUKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1vZGUgNzIyIHRocm93cyBGaWxlTm90Rm91bmRFeGVjcHRpb24gYXQgbGluZSAxNTEKKyAgICAgICAgICAgICAgICAgICAgICAgIGRpci5zZXRFeGVjdXRhYmxlKHRydWUsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXcgRmlsZShTTkFQU0hPVF9ESVIpLmlzRGlyZWN0b3J5KCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJNYWRlID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ3JlYXRpb24gb2YgIiArIGRpciArICIgZmFpbGVkLiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNyZWF0aW9uIG9mICIgKyBTTkFQU0hPVF9ESVIgKyAiIGZhaWxlZC4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nLnNldChmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3cml0ZVNuYXBzaG90KGRpciwgbmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZVNuYXBzaG90KFNOQVBTSE9UX0RJUiwgcHJvY2Vzc05hbWUsIHBhY2thZ2VJbmZvKTsKICAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmcgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmcuc2V0KGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0pOwpAQCAtMTEwLDEzICsxMjMsMTMgQEAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVaeWdvdGVTbmFwc2hvdCgpIHsKICAgICAgICAgaWYgKCFlbmFibGVkKSByZXR1cm47Ci0KLSAgICAgICAgU3RyaW5nIGRpciA9ICIvZGF0YS96eWdvdGUvc25hcHNob3RzIjsKLSAgICAgICAgbmV3IEZpbGUoZGlyKS5ta2RpcnMoKTsKLSAgICAgICAgd3JpdGVTbmFwc2hvdChkaXIsICJ6eWdvdGUiKTsKKyAgICAgICAgd3JpdGVTbmFwc2hvdCgienlnb3RlIiwgbnVsbCk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB3cml0ZVNuYXBzaG90KFN0cmluZyBkaXIsIFN0cmluZyBuYW1lKSB7CisgICAgLyoqCisgICAgICogcGFzcyBpbiBQYWNrYWdlSW5mbyB0byByZXRyaWV2ZSB2YXJpb3VzIHZhbHVlcyBmb3Igc25hcHNob3QgaGVhZGVyCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB3cml0ZVNuYXBzaG90KFN0cmluZyBkaXIsIFN0cmluZyBwcm9jZXNzTmFtZSwgUGFja2FnZUluZm8gcGFja2FnZUluZm8pIHsKICAgICAgICAgYnl0ZVtdIHNuYXBzaG90ID0gU2FtcGxpbmdQcm9maWxlci5nZXRJbnN0YW5jZSgpLnNuYXBzaG90KCk7CiAgICAgICAgIGlmIChzbmFwc2hvdCA9PSBudWxsKSB7CiAgICAgICAgICAgICByZXR1cm47CkBAIC0xMjgsMzkgKzE0MSw1NCBAQAogICAgICAgICAgKiB3ZSBjYXB0dXJlIHR3byBzbmFwc2hvdHMgaW4gcmFwaWQgc3VjY2Vzc2lvbi4KICAgICAgICAgICovCiAgICAgICAgIGxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgU3RyaW5nIHBhdGggPSBkaXIgKyAiLyIgKyBuYW1lLnJlcGxhY2UoJzonLCAnLicpICsgIi0iICsKLSAgICAgICAgICAgICAgICArIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpICsgIi5zbmFwc2hvdCI7CisgICAgICAgIFN0cmluZyBuYW1lID0gcHJvY2Vzc05hbWUucmVwbGFjZUFsbCgiOiIsICIuIik7CisgICAgICAgIFN0cmluZyBwYXRoID0gZGlyICsgIi8iICsgbmFtZSArICItIiArU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgKyAiLnNuYXBzaG90IjsKKyAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBvdXQgPSBudWxsOwogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gVHJ5IHRvIG9wZW4gdGhlIGZpbGUgYSBmZXcgdGltZXMuIFRoZSBTRCBjYXJkIG1heSBub3QgYmUgbW91bnRlZC4KLSAgICAgICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gb3V0OwotICAgICAgICAgICAgaW50IGNvdW50ID0gMDsKLSAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgb3V0ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0ocGF0aCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgrK2NvdW50ID4gMykgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiQ291bGQgbm90IG9wZW4gIiArIHBhdGggKyAiLiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gU2xlZXAgZm9yIGEgYml0IGFuZCB0aGVuIHRyeSBhZ2Fpbi4KLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCgyNTAwKTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZTEpIHsgLyogaWdub3JlICovIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgb3V0LndyaXRlKHNuYXBzaG90KTsKLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgb3V0LmNsb3NlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBsb25nIGVsYXBzZWQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHN0YXJ0OwotICAgICAgICAgICAgTG9nLmkoVEFHLCAiV3JvdGUgc25hcHNob3QgZm9yICIgKyBuYW1lCi0gICAgICAgICAgICAgICAgICAgICsgIiBpbiAiICsgZWxhcHNlZCArICJtcy4iKTsKKyAgICAgICAgICAgIG91dCA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKHBhdGgpOworICAgICAgICAgICAgZ2VuZXJhdGVTbmFwc2hvdEhlYWRlcihuYW1lLCBwYWNrYWdlSW5mbywgb3V0KTsKKyAgICAgICAgICAgIG91dC53cml0ZShzbmFwc2hvdCk7CiAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIExvZy5lKFRBRywgIkVycm9yIHdyaXRpbmcgc25hcHNob3QuIiwgZSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGlmKG91dCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG91dC5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgLy8gbGV0IGl0IGdvLgorICAgICAgICAgICAgfQogICAgICAgICB9CisgICAgICAgIC8vIHNldCBmaWxlIHJlYWRhYmxlIHRvIHRoZSB3b3JsZCBzbyB0aGF0IFNhbXBsaW5nUHJvZmlsZXJTZXJ2aWNlCisgICAgICAgIC8vIGNhbiBwdXQgaXQgdG8gZHJvcGJveAorICAgICAgICBuZXcgRmlsZShwYXRoKS5zZXRSZWFkYWJsZSh0cnVlLCBmYWxzZSk7CisKKyAgICAgICAgbG9uZyBlbGFwc2VkID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzdGFydDsKKyAgICAgICAgTG9nLmkoVEFHLCAiV3JvdGUgc25hcHNob3QgZm9yICIgKyBuYW1lICsgIiBpbiAiICsgZWxhcHNlZCArICJtcy4iKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBnZW5lcmF0ZSBoZWFkZXIgZm9yIHNuYXBzaG90cywgd2l0aCB0aGUgZm9sbG93aW5nIGZvcm1hdCAobGlrZSBodHRwIGhlYWRlcik6CisgICAgICoKKyAgICAgKiBWZXJzaW9uOiA8dmVyc2lvbiBudW1iZXIgb2YgcHJvZmlsZXI+XG4KKyAgICAgKiBQcm9jZXNzOiA8cHJvY2VzcyBuYW1lPlxuCisgICAgICogUGFja2FnZTogPHBhY2thZ2UgbmFtZSwgaWYgZXhpc3RzPlxuCisgICAgICogUGFja2FnZS1WZXJzaW9uOiA8dmVyc2lvbiBudW1iZXIgb2YgdGhlIHBhY2thZ2UsIGlmIGV4aXN0cz5cbgorICAgICAqIEJ1aWxkOiA8ZmluZ2VycHJpbnQ+XG4KKyAgICAgKiBcbgorICAgICAqIDx0aGUgYWN0dWFsIHNuYXBzaG90IGNvbnRlbnQgYmVnaW5zIGhlcmUuLi4+CisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBnZW5lcmF0ZVNuYXBzaG90SGVhZGVyKFN0cmluZyBwcm9jZXNzTmFtZSwgUGFja2FnZUluZm8gcGFja2FnZUluZm8sCisgICAgICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gcHJvZmlsZXIgdmVyc2lvbgorICAgICAgICBvdXQud3JpdGUoIlZlcnNpb246IDFcbiIuZ2V0Qnl0ZXMoKSk7CisgICAgICAgIG91dC53cml0ZSgoIlByb2Nlc3M6ICIgKyBwcm9jZXNzTmFtZSArICJcbiIpLmdldEJ5dGVzKCkpOworICAgICAgICBpZihwYWNrYWdlSW5mbyAhPSBudWxsKSB7CisgICAgICAgICAgICBvdXQud3JpdGUoKCJQYWNrYWdlOiAiICsgcGFja2FnZUluZm8ucGFja2FnZU5hbWUgKyAiXG4iKS5nZXRCeXRlcygpKTsKKyAgICAgICAgICAgIG91dC53cml0ZSgoIlBhY2thZ2UtVmVyc2lvbjogIiArIHBhY2thZ2VJbmZvLnZlcnNpb25Db2RlICsgIlxuIikuZ2V0Qnl0ZXMoKSk7CisgICAgICAgIH0KKyAgICAgICAgb3V0LndyaXRlKCgiQnVpbGQ6ICIgKyBCdWlsZC5GSU5HRVJQUklOVCArICJcbiIpLmdldEJ5dGVzKCkpOworICAgICAgICAvLyBzaW5nbGUgYmxhbmsgbGluZSBtZWFucyB0aGUgZW5kIG9mIHNuYXBzaG90IGhlYWRlci4KKyAgICAgICAgb3V0LndyaXRlKCJcbiIuZ2V0Qnl0ZXMoKSk7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL29zL1p5Z290ZUluaXQuamF2YSBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9vcy9aeWdvdGVJbml0LmphdmEKaW5kZXggYjY3N2IxZS4uOWZjZDNmNSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL29zL1p5Z290ZUluaXQuamF2YQorKysgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvb3MvWnlnb3RlSW5pdC5qYXZhCkBAIC02NiwxMCArNjYsNiBAQAogICAgIC8qKiB3aGVuIHByZWxvYWRpbmcsIEdDIGFmdGVyIGFsbG9jYXRpbmcgdGhpcyBtYW55IGJ5dGVzICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBSRUxPQURfR0NfVEhSRVNIT0xEID0gNTAwMDA7CiAKLSAgICAvKiogdGhyb3cgb24gbWlzc2luZyBwcmVsb2FkLCBvbmx5IGlmIHRoaXMgbG9va3MgbGlrZSBhIGRldmVsb3BlciAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gVEhST1dfT05fTUlTU0lOR19QUkVMT0FEID0KLSAgICAgICAgICAgICIxIi5lcXVhbHMoU3lzdGVtUHJvcGVydGllcy5nZXQoInBlcnNpc3Quc2VydmljZS5hZGIuZW5hYmxlIikpOwotCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNBR0VfU1RSSU5HID0KICAgICAgICAgICAgICIgPFwidHJ1ZVwifFwiZmFsc2VcIiBmb3Igc3RhcnRTeXN0ZW1TZXJ2ZXI+IjsKIApAQCAtMjg3LDcgKzI4Myw2IEBACiAKICAgICAgICAgICAgICAgICBpbnQgY291bnQgPSAwOwogICAgICAgICAgICAgICAgIFN0cmluZyBsaW5lOwotICAgICAgICAgICAgICAgIFN0cmluZyBtaXNzaW5nQ2xhc3NlcyA9IG51bGw7CiAgICAgICAgICAgICAgICAgd2hpbGUgKChsaW5lID0gYnIucmVhZExpbmUoKSkgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAvLyBTa2lwIGNvbW1lbnRzIGFuZCBibGFuayBsaW5lcy4KICAgICAgICAgICAgICAgICAgICAgbGluZSA9IGxpbmUudHJpbSgpOwpAQCAtMzExLDEyICszMDYsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgY291bnQrKzsKICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJDbGFzcyBub3QgZm91bmQgZm9yIHByZWxvYWRpbmc6ICIgKyBsaW5lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtaXNzaW5nQ2xhc3NlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlzc2luZ0NsYXNzZXMgPSBsaW5lOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaXNzaW5nQ2xhc3NlcyArPSAiICIgKyBsaW5lOwotICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2xhc3Mgbm90IGZvdW5kIGZvciBwcmVsb2FkaW5nOiAiICsgbGluZSk7CiAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJFcnJvciBwcmVsb2FkaW5nICIgKyBsaW5lICsgIi4iLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0IGluc3RhbmNlb2YgRXJyb3IpIHsKQEAgLTMyOSwxMyArMzE5LDYgQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIGlmIChUSFJPV19PTl9NSVNTSU5HX1BSRUxPQUQgJiYKLSAgICAgICAgICAgICAgICAgICAgbWlzc2luZ0NsYXNzZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNaXNzaW5nIGNsYXNzKGVzKSBmb3IgcHJlbG9hZGluZywgdXBkYXRlIHByZWxvYWRlZC1jbGFzc2VzIFsiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBtaXNzaW5nQ2xhc3NlcyArICJdIik7Ci0gICAgICAgICAgICAgICAgfQotCiAgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAiLi4ucHJlbG9hZGVkICIgKyBjb3VudCArICIgY2xhc3NlcyBpbiAiCiAgICAgICAgICAgICAgICAgICAgICAgICArIChTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKS1zdGFydFRpbWUpICsgIm1zLiIpOwogICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3V0aWwvSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lLmphdmEgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdXRpbC9IaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmUuamF2YQppbmRleCBjNTk5ZDY4Li43MTM4YjVjIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdXRpbC9IaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmUuamF2YQorKysgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdXRpbC9IaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmUuamF2YQpAQCAtMTE5Nyw2ICsxMTk3LDM1IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogR2V0IGEgbWVzc2FnZSBhbmQgc2V0IE1lc3NhZ2UudGFyZ2V0ID0gdGhpcywKKyAgICAgKiB3aGF0LCBhcmcxIGFuZCBhcmcyCisgICAgICoKKyAgICAgKiBAcGFyYW0gd2hhdCAgaXMgYXNzaWduZWQgdG8gTWVzc2FnZS53aGF0CisgICAgICogQHBhcmFtIGFyZzEgIGlzIGFzc2lnbmVkIHRvIE1lc3NhZ2UuYXJnMQorICAgICAqIEBwYXJhbSBhcmcyICBpcyBhc3NpZ25lZCB0byBNZXNzYWdlLmFyZzIKKyAgICAgKiBAcmV0dXJuICBBIE1lc3NhZ2Ugb2JqZWN0IGZyb20gdGhlIGdsb2JhbCBwb29sLgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBNZXNzYWdlIG9idGFpbk1lc3NhZ2UoaW50IHdoYXQsIGludCBhcmcxLCBpbnQgYXJnMikKKyAgICB7CisgICAgICAgIHJldHVybiBNZXNzYWdlLm9idGFpbihtSHNtSGFuZGxlciwgd2hhdCwgYXJnMSwgYXJnMik7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IGEgbWVzc2FnZSBhbmQgc2V0IE1lc3NhZ2UudGFyZ2V0ID0gdGhpcywKKyAgICAgKiB3aGF0LCBhcmcxLCBhcmcyIGFuZCBvYmoKKyAgICAgKgorICAgICAqIEBwYXJhbSB3aGF0ICBpcyBhc3NpZ25lZCB0byBNZXNzYWdlLndoYXQKKyAgICAgKiBAcGFyYW0gYXJnMSAgaXMgYXNzaWduZWQgdG8gTWVzc2FnZS5hcmcxCisgICAgICogQHBhcmFtIGFyZzIgIGlzIGFzc2lnbmVkIHRvIE1lc3NhZ2UuYXJnMgorICAgICAqIEBwYXJhbSBvYmogaXMgYXNzaWduZWQgdG8gTWVzc2FnZS5vYmoKKyAgICAgKiBAcmV0dXJuICBBIE1lc3NhZ2Ugb2JqZWN0IGZyb20gdGhlIGdsb2JhbCBwb29sLgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBNZXNzYWdlIG9idGFpbk1lc3NhZ2UoaW50IHdoYXQsIGludCBhcmcxLCBpbnQgYXJnMiwgT2JqZWN0IG9iaikKKyAgICB7CisgICAgICAgIHJldHVybiBNZXNzYWdlLm9idGFpbihtSHNtSGFuZGxlciwgd2hhdCwgYXJnMSwgYXJnMiwgb2JqKTsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBFbnF1ZXVlIGEgbWVzc2FnZSB0byB0aGlzIHN0YXRlIG1hY2hpbmUuCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIHZvaWQgc2VuZE1lc3NhZ2UoaW50IHdoYXQpIHsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC91dGlsL1htbFV0aWxzLmphdmEgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdXRpbC9YbWxVdGlscy5qYXZhCmluZGV4IDhkOGRmMTYuLmUwMGE4NTMgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC91dGlsL1htbFV0aWxzLmphdmEKKysrIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3V0aWwvWG1sVXRpbHMuamF2YQpAQCAtMjYsNiArMjYsNyBAQAogaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CiBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5NYXA7CkBAIC0yODQsNiArMjg1LDI2IEBACiAKICAgICAgICAgb3V0LmVuZFRhZyhudWxsLCAibGlzdCIpOwogICAgIH0KKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIHZvaWQgd3JpdGVTZXRYbWwoU2V0IHZhbCwgU3RyaW5nIG5hbWUsIFhtbFNlcmlhbGl6ZXIgb3V0KQorICAgICAgICAgICAgdGhyb3dzIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICBpZiAodmFsID09IG51bGwpIHsKKyAgICAgICAgICAgIG91dC5zdGFydFRhZyhudWxsLCAibnVsbCIpOworICAgICAgICAgICAgb3V0LmVuZFRhZyhudWxsLCAibnVsbCIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBvdXQuc3RhcnRUYWcobnVsbCwgInNldCIpOworICAgICAgICBpZiAobmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgICBvdXQuYXR0cmlidXRlKG51bGwsICJuYW1lIiwgbmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGZvciAoT2JqZWN0IHYgOiB2YWwpIHsKKyAgICAgICAgICAgIHdyaXRlVmFsdWVYbWwodiwgbnVsbCwgb3V0KTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgb3V0LmVuZFRhZyhudWxsLCAic2V0Iik7CisgICAgfQogCiAgICAgLyoqCiAgICAgICogRmxhdHRlbiBhIGJ5dGVbXSBpbnRvIGFuIFhtbFNlcmlhbGl6ZXIuICBUaGUgbGlzdCBjYW4gbGF0ZXIgYmUgcmVhZCBiYWNrCkBAIC00MjYsNiArNDQ3LDkgQEAKICAgICAgICAgfSBlbHNlIGlmICh2IGluc3RhbmNlb2YgTGlzdCkgewogICAgICAgICAgICAgd3JpdGVMaXN0WG1sKChMaXN0KXYsIG5hbWUsIG91dCk7CiAgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0gZWxzZSBpZiAodiBpbnN0YW5jZW9mIFNldCkgeworICAgICAgICAgICAgd3JpdGVTZXRYbWwoKFNldCl2LCBuYW1lLCBvdXQpOworICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9IGVsc2UgaWYgKHYgaW5zdGFuY2VvZiBDaGFyU2VxdWVuY2UpIHsKICAgICAgICAgICAgIC8vIFhYWCBUaGlzIGlzIHRvIGFsbG93IHVzIHRvIGF0IGxlYXN0IHdyaXRlIHNvbWV0aGluZyBpZgogICAgICAgICAgICAgLy8gd2UgZW5jb3VudGVyIHN0eWxlZCB0ZXh0Li4uICBidXQgaXQgbWVhbnMgd2Ugd2lsbCBkcm9wIGFsbApAQCAtNDc2LDcgKzUwMCw3IEBACiAgICAgICoKICAgICAgKiBAcGFyYW0gaW4gVGhlIElucHV0U3RyZWFtIGZyb20gd2hpY2ggdG8gcmVhZC4KICAgICAgKgotICAgICAqIEByZXR1cm4gSGFzaE1hcCBUaGUgcmVzdWx0aW5nIGxpc3QuCisgICAgICogQHJldHVybiBBcnJheUxpc3QgVGhlIHJlc3VsdGluZyBsaXN0LgogICAgICAqCiAgICAgICogQHNlZSAjcmVhZE1hcFhtbAogICAgICAqIEBzZWUgI3JlYWRWYWx1ZVhtbApAQCAtNDkwLDYgKzUxNCwyOSBAQAogICAgICAgICBwYXJzZXIuc2V0SW5wdXQoaW4sIG51bGwpOwogICAgICAgICByZXR1cm4gKEFycmF5TGlzdClyZWFkVmFsdWVYbWwocGFyc2VyLCBuZXcgU3RyaW5nWzFdKTsKICAgICB9CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogUmVhZCBhIEhhc2hTZXQgZnJvbSBhbiBJbnB1dFN0cmVhbSBjb250YWluaW5nIFhNTC4gVGhlIHN0cmVhbSBjYW4KKyAgICAgKiBwcmV2aW91c2x5IGhhdmUgYmVlbiB3cml0dGVuIGJ5IHdyaXRlU2V0WG1sKCkuCisgICAgICogCisgICAgICogQHBhcmFtIGluIFRoZSBJbnB1dFN0cmVhbSBmcm9tIHdoaWNoIHRvIHJlYWQuCisgICAgICogCisgICAgICogQHJldHVybiBIYXNoU2V0IFRoZSByZXN1bHRpbmcgc2V0LgorICAgICAqIAorICAgICAqIEB0aHJvd3MgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbgorICAgICAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgorICAgICAqIAorICAgICAqIEBzZWUgI3JlYWRWYWx1ZVhtbAorICAgICAqIEBzZWUgI3JlYWRUaGlzU2V0WG1sCisgICAgICogQHNlZSAjd3JpdGVTZXRYbWwKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEhhc2hTZXQgcmVhZFNldFhtbChJbnB1dFN0cmVhbSBpbikKKyAgICAgICAgICAgIHRocm93cyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgWG1sUHVsbFBhcnNlciBwYXJzZXIgPSBYbWwubmV3UHVsbFBhcnNlcigpOworICAgICAgICBwYXJzZXIuc2V0SW5wdXQoaW4sIG51bGwpOworICAgICAgICByZXR1cm4gKEhhc2hTZXQpIHJlYWRWYWx1ZVhtbChwYXJzZXIsIG5ldyBTdHJpbmdbMV0pOworICAgIH0KIAogICAgIC8qKgogICAgICAqIFJlYWQgYSBIYXNoTWFwIG9iamVjdCBmcm9tIGFuIFhtbFB1bGxQYXJzZXIuICBUaGUgWE1MIGRhdGEgY291bGQKQEAgLTU3Myw2ICs2MjAsNDcgQEAKICAgICAgICAgdGhyb3cgbmV3IFhtbFB1bGxQYXJzZXJFeGNlcHRpb24oCiAgICAgICAgICAgICAiRG9jdW1lbnQgZW5kZWQgYmVmb3JlICIgKyBlbmRUYWcgKyAiIGVuZCB0YWciKTsKICAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmVhZCBhIEhhc2hTZXQgb2JqZWN0IGZyb20gYW4gWG1sUHVsbFBhcnNlci4gVGhlIFhNTCBkYXRhIGNvdWxkIHByZXZpb3VzbHkKKyAgICAgKiBoYXZlIGJlZW4gZ2VuZXJhdGVkIGJ5IHdyaXRlU2V0WG1sKCkuIFRoZSBYbWxQdWxsUGFyc2VyIG11c3QgYmUgcG9zaXRpb25lZAorICAgICAqIDxlbT5hZnRlcjwvZW0+IHRoZSB0YWcgdGhhdCBiZWdpbnMgdGhlIHNldC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcGFyc2VyIFRoZSBYbWxQdWxsUGFyc2VyIGZyb20gd2hpY2ggdG8gcmVhZCB0aGUgc2V0IGRhdGEuCisgICAgICogQHBhcmFtIGVuZFRhZyBOYW1lIG9mIHRoZSB0YWcgdGhhdCB3aWxsIGVuZCB0aGUgc2V0LCB1c3VhbGx5ICJzZXQiLgorICAgICAqIEBwYXJhbSBuYW1lIEFuIGFycmF5IG9mIG9uZSBzdHJpbmcsIHVzZWQgdG8gcmV0dXJuIHRoZSBuYW1lIGF0dHJpYnV0ZQorICAgICAqICAgICAgICAgICAgIG9mIHRoZSBzZXQncyB0YWcuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIEhhc2hTZXQgVGhlIG5ld2x5IGdlbmVyYXRlZCBzZXQuCisgICAgICogCisgICAgICogQHRocm93cyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uCisgICAgICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCisgICAgICogCisgICAgICogQHNlZSAjcmVhZFNldFhtbAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgSGFzaFNldCByZWFkVGhpc1NldFhtbChYbWxQdWxsUGFyc2VyIHBhcnNlciwgU3RyaW5nIGVuZFRhZywgU3RyaW5nW10gbmFtZSkKKyAgICAgICAgICAgIHRocm93cyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgSGFzaFNldCBzZXQgPSBuZXcgSGFzaFNldCgpOworICAgICAgICAKKyAgICAgICAgaW50IGV2ZW50VHlwZSA9IHBhcnNlci5nZXRFdmVudFR5cGUoKTsKKyAgICAgICAgZG8geworICAgICAgICAgICAgaWYgKGV2ZW50VHlwZSA9PSBwYXJzZXIuU1RBUlRfVEFHKSB7CisgICAgICAgICAgICAgICAgT2JqZWN0IHZhbCA9IHJlYWRUaGlzVmFsdWVYbWwocGFyc2VyLCBuYW1lKTsKKyAgICAgICAgICAgICAgICBzZXQuYWRkKHZhbCk7CisgICAgICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIkFkZGluZyB0byBzZXQ6ICIgKyB2YWwpOworICAgICAgICAgICAgfSBlbHNlIGlmIChldmVudFR5cGUgPT0gcGFyc2VyLkVORF9UQUcpIHsKKyAgICAgICAgICAgICAgICBpZiAocGFyc2VyLmdldE5hbWUoKS5lcXVhbHMoZW5kVGFnKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2V0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZCAiICsgZW5kVGFnICsgIiBlbmQgdGFnIGF0OiAiICsgcGFyc2VyLmdldE5hbWUoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBldmVudFR5cGUgPSBwYXJzZXIubmV4dCgpOworICAgICAgICB9IHdoaWxlIChldmVudFR5cGUgIT0gcGFyc2VyLkVORF9ET0NVTUVOVCk7CisgICAgICAgIAorICAgICAgICB0aHJvdyBuZXcgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAiRG9jdW1lbnQgZW5kZWQgYmVmb3JlICIgKyBlbmRUYWcgKyAiIGVuZCB0YWciKTsKKyAgICB9CiAKICAgICAvKioKICAgICAgKiBSZWFkIGFuIGludFtdIG9iamVjdCBmcm9tIGFuIFhtbFB1bGxQYXJzZXIuICBUaGUgWE1MIGRhdGEgY291bGQKQEAgLTc0MCw2ICs4MjgsMTIgQEAKICAgICAgICAgICAgIG5hbWVbMF0gPSB2YWx1ZU5hbWU7CiAgICAgICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiUmV0dXJuaW5nIHZhbHVlIGZvciAiICsgdmFsdWVOYW1lICsgIjogIiArIHJlcyk7CiAgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9IGVsc2UgaWYgKHRhZ05hbWUuZXF1YWxzKCJzZXQiKSkgeworICAgICAgICAgICAgcGFyc2VyLm5leHQoKTsKKyAgICAgICAgICAgIHJlcyA9IHJlYWRUaGlzU2V0WG1sKHBhcnNlciwgInNldCIsIG5hbWUpOworICAgICAgICAgICAgbmFtZVswXSA9IHZhbHVlTmFtZTsKKyAgICAgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJSZXR1cm5pbmcgdmFsdWUgZm9yICIgKyB2YWx1ZU5hbWUgKyAiOiAiICsgcmVzKTsKKyAgICAgICAgICAgIHJldHVybiByZXM7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbigKICAgICAgICAgICAgICAgICAiVW5rbm93biB0YWc6ICIgKyB0YWdOYW1lKTsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC92aWV3L21lbnUvQWN0aW9uTWVudS5qYXZhIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvbWVudS9BY3Rpb25NZW51LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q0NGViYwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC92aWV3L21lbnUvQWN0aW9uTWVudS5qYXZhCkBAIC0wLDAgKzEsMjYzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnU7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWU7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlJlc29sdmVJbmZvOworaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudUl0ZW07CitpbXBvcnQgYW5kcm9pZC52aWV3LlN1Yk1lbnU7CisKKy8qKgorICogQGhpZGUKKyAqLworcHVibGljIGNsYXNzIEFjdGlvbk1lbnUgaW1wbGVtZW50cyBNZW51IHsKKyAgICBwcml2YXRlIENvbnRleHQgbUNvbnRleHQ7CisgICAgCisgICAgcHJpdmF0ZSBib29sZWFuIG1Jc1F3ZXJ0eTsKKyAgICAKKyAgICBwcml2YXRlIEFycmF5TGlzdDxBY3Rpb25NZW51SXRlbT4gbUl0ZW1zOworICAgIAorICAgIHB1YmxpYyBBY3Rpb25NZW51KENvbnRleHQgY29udGV4dCkgeworICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7CisgICAgICAgIG1JdGVtcyA9IG5ldyBBcnJheUxpc3Q8QWN0aW9uTWVudUl0ZW0+KCk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBDb250ZXh0IGdldENvbnRleHQoKSB7CisgICAgICAgIHJldHVybiBtQ29udGV4dDsKKyAgICB9CisKKyAgICBwdWJsaWMgTWVudUl0ZW0gYWRkKENoYXJTZXF1ZW5jZSB0aXRsZSkgeworICAgICAgICByZXR1cm4gYWRkKDAsIDAsIDAsIHRpdGxlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTWVudUl0ZW0gYWRkKGludCB0aXRsZVJlcykgeworICAgICAgICByZXR1cm4gYWRkKDAsIDAsIDAsIHRpdGxlUmVzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTWVudUl0ZW0gYWRkKGludCBncm91cElkLCBpbnQgaXRlbUlkLCBpbnQgb3JkZXIsIGludCB0aXRsZVJlcykgeworICAgICAgICByZXR1cm4gYWRkKGdyb3VwSWQsIGl0ZW1JZCwgb3JkZXIsIG1Db250ZXh0LmdldFJlc291cmNlcygpLmdldFN0cmluZyh0aXRsZVJlcykpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgTWVudUl0ZW0gYWRkKGludCBncm91cElkLCBpbnQgaXRlbUlkLCBpbnQgb3JkZXIsIENoYXJTZXF1ZW5jZSB0aXRsZSkgeworICAgICAgICBBY3Rpb25NZW51SXRlbSBpdGVtID0gbmV3IEFjdGlvbk1lbnVJdGVtKGdldENvbnRleHQoKSwKKyAgICAgICAgICAgICAgICBncm91cElkLCBpdGVtSWQsIDAsIG9yZGVyLCB0aXRsZSk7CisgICAgICAgIG1JdGVtcy5hZGQob3JkZXIsIGl0ZW0pOworICAgICAgICByZXR1cm4gaXRlbTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGFkZEludGVudE9wdGlvbnMoaW50IGdyb3VwSWQsIGludCBpdGVtSWQsIGludCBvcmRlciwKKyAgICAgICAgICAgIENvbXBvbmVudE5hbWUgY2FsbGVyLCBJbnRlbnRbXSBzcGVjaWZpY3MsIEludGVudCBpbnRlbnQsIGludCBmbGFncywKKyAgICAgICAgICAgIE1lbnVJdGVtW10gb3V0U3BlY2lmaWNJdGVtcykgeworICAgICAgICBQYWNrYWdlTWFuYWdlciBwbSA9IG1Db250ZXh0LmdldFBhY2thZ2VNYW5hZ2VyKCk7CisgICAgICAgIGZpbmFsIExpc3Q8UmVzb2x2ZUluZm8+IGxyaSA9CisgICAgICAgICAgICAgICAgcG0ucXVlcnlJbnRlbnRBY3Rpdml0eU9wdGlvbnMoY2FsbGVyLCBzcGVjaWZpY3MsIGludGVudCwgMCk7CisgICAgICAgIGZpbmFsIGludCBOID0gbHJpICE9IG51bGwgPyBscmkuc2l6ZSgpIDogMDsKKworICAgICAgICBpZiAoKGZsYWdzICYgRkxBR19BUFBFTkRfVE9fR1JPVVApID09IDApIHsKKyAgICAgICAgICAgIHJlbW92ZUdyb3VwKGdyb3VwSWQpOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpPE47IGkrKykgeworICAgICAgICAgICAgZmluYWwgUmVzb2x2ZUluZm8gcmkgPSBscmkuZ2V0KGkpOworICAgICAgICAgICAgSW50ZW50IHJpbnRlbnQgPSBuZXcgSW50ZW50KAorICAgICAgICAgICAgICAgIHJpLnNwZWNpZmljSW5kZXggPCAwID8gaW50ZW50IDogc3BlY2lmaWNzW3JpLnNwZWNpZmljSW5kZXhdKTsKKyAgICAgICAgICAgIHJpbnRlbnQuc2V0Q29tcG9uZW50KG5ldyBDb21wb25lbnROYW1lKAorICAgICAgICAgICAgICAgICAgICByaS5hY3Rpdml0eUluZm8uYXBwbGljYXRpb25JbmZvLnBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgICByaS5hY3Rpdml0eUluZm8ubmFtZSkpOworICAgICAgICAgICAgZmluYWwgTWVudUl0ZW0gaXRlbSA9IGFkZChncm91cElkLCBpdGVtSWQsIG9yZGVyLCByaS5sb2FkTGFiZWwocG0pKQorICAgICAgICAgICAgICAgICAgICAuc2V0SWNvbihyaS5sb2FkSWNvbihwbSkpCisgICAgICAgICAgICAgICAgICAgIC5zZXRJbnRlbnQocmludGVudCk7CisgICAgICAgICAgICBpZiAob3V0U3BlY2lmaWNJdGVtcyAhPSBudWxsICYmIHJpLnNwZWNpZmljSW5kZXggPj0gMCkgeworICAgICAgICAgICAgICAgIG91dFNwZWNpZmljSXRlbXNbcmkuc3BlY2lmaWNJbmRleF0gPSBpdGVtOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIE47CisgICAgfQorCisgICAgcHVibGljIFN1Yk1lbnUgYWRkU3ViTWVudShDaGFyU2VxdWVuY2UgdGl0bGUpIHsKKyAgICAgICAgLy8gVE9ETyBJbXBsZW1lbnQgc3VibWVudXMKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHVibGljIFN1Yk1lbnUgYWRkU3ViTWVudShpbnQgdGl0bGVSZXMpIHsKKyAgICAgICAgLy8gVE9ETyBJbXBsZW1lbnQgc3VibWVudXMKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHVibGljIFN1Yk1lbnUgYWRkU3ViTWVudShpbnQgZ3JvdXBJZCwgaW50IGl0ZW1JZCwgaW50IG9yZGVyLAorICAgICAgICAgICAgQ2hhclNlcXVlbmNlIHRpdGxlKSB7CisgICAgICAgIC8vIFRPRE8gSW1wbGVtZW50IHN1Ym1lbnVzCisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBTdWJNZW51IGFkZFN1Yk1lbnUoaW50IGdyb3VwSWQsIGludCBpdGVtSWQsIGludCBvcmRlciwgaW50IHRpdGxlUmVzKSB7CisgICAgICAgIC8vIFRPRE8gSW1wbGVtZW50IHN1Ym1lbnVzCisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgeworICAgICAgICBtSXRlbXMuY2xlYXIoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBpbnQgZmluZEl0ZW1JbmRleChpbnQgaWQpIHsKKyAgICAgICAgZmluYWwgQXJyYXlMaXN0PEFjdGlvbk1lbnVJdGVtPiBpdGVtcyA9IG1JdGVtczsKKyAgICAgICAgZmluYWwgaW50IGl0ZW1Db3VudCA9IGl0ZW1zLnNpemUoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtQ291bnQ7IGkrKykgeworICAgICAgICAgICAgaWYgKGl0ZW1zLmdldChpKS5nZXRJdGVtSWQoKSA9PSBpZCkgeworICAgICAgICAgICAgICAgIHJldHVybiBpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgcHVibGljIE1lbnVJdGVtIGZpbmRJdGVtKGludCBpZCkgeworICAgICAgICByZXR1cm4gbUl0ZW1zLmdldChmaW5kSXRlbUluZGV4KGlkKSk7CisgICAgfQorCisgICAgcHVibGljIE1lbnVJdGVtIGdldEl0ZW0oaW50IGluZGV4KSB7CisgICAgICAgIHJldHVybiBtSXRlbXMuZ2V0KGluZGV4KTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNWaXNpYmxlSXRlbXMoKSB7CisgICAgICAgIGZpbmFsIEFycmF5TGlzdDxBY3Rpb25NZW51SXRlbT4gaXRlbXMgPSBtSXRlbXM7CisgICAgICAgIGZpbmFsIGludCBpdGVtQ291bnQgPSBpdGVtcy5zaXplKCk7CisgICAgICAgIAorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1Db3VudDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoaXRlbXMuZ2V0KGkpLmlzVmlzaWJsZSgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBBY3Rpb25NZW51SXRlbSBmaW5kSXRlbVdpdGhTaG9ydGN1dChpbnQga2V5Q29kZSwgS2V5RXZlbnQgZXZlbnQpIHsKKyAgICAgICAgLy8gVE9ETyBNYWtlIHRoaXMgc21hcnRlci4KKyAgICAgICAgZmluYWwgYm9vbGVhbiBxd2VydHkgPSBtSXNRd2VydHk7CisgICAgICAgIGZpbmFsIEFycmF5TGlzdDxBY3Rpb25NZW51SXRlbT4gaXRlbXMgPSBtSXRlbXM7CisgICAgICAgIGZpbmFsIGludCBpdGVtQ291bnQgPSBpdGVtcy5zaXplKCk7CisgICAgICAgIAorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1Db3VudDsgaSsrKSB7CisgICAgICAgICAgICBBY3Rpb25NZW51SXRlbSBpdGVtID0gaXRlbXMuZ2V0KGkpOworICAgICAgICAgICAgZmluYWwgY2hhciBzaG9ydGN1dCA9IHF3ZXJ0eSA/IGl0ZW0uZ2V0QWxwaGFiZXRpY1Nob3J0Y3V0KCkgOgorICAgICAgICAgICAgICAgICAgICBpdGVtLmdldE51bWVyaWNTaG9ydGN1dCgpOworICAgICAgICAgICAgaWYgKGtleUNvZGUgPT0gc2hvcnRjdXQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gaXRlbTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1Nob3J0Y3V0S2V5KGludCBrZXlDb2RlLCBLZXlFdmVudCBldmVudCkgeworICAgICAgICByZXR1cm4gZmluZEl0ZW1XaXRoU2hvcnRjdXQoa2V5Q29kZSwgZXZlbnQpICE9IG51bGw7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gcGVyZm9ybUlkZW50aWZpZXJBY3Rpb24oaW50IGlkLCBpbnQgZmxhZ3MpIHsKKyAgICAgICAgZmluYWwgaW50IGluZGV4ID0gZmluZEl0ZW1JbmRleChpZCk7CisgICAgICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBtSXRlbXMuZ2V0KGluZGV4KS5pbnZva2UoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBwZXJmb3JtU2hvcnRjdXQoaW50IGtleUNvZGUsIEtleUV2ZW50IGV2ZW50LCBpbnQgZmxhZ3MpIHsKKyAgICAgICAgQWN0aW9uTWVudUl0ZW0gaXRlbSA9IGZpbmRJdGVtV2l0aFNob3J0Y3V0KGtleUNvZGUsIGV2ZW50KTsKKyAgICAgICAgaWYgKGl0ZW0gPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICByZXR1cm4gaXRlbS5pbnZva2UoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZW1vdmVHcm91cChpbnQgZ3JvdXBJZCkgeworICAgICAgICBmaW5hbCBBcnJheUxpc3Q8QWN0aW9uTWVudUl0ZW0+IGl0ZW1zID0gbUl0ZW1zOworICAgICAgICBpbnQgaXRlbUNvdW50ID0gaXRlbXMuc2l6ZSgpOworICAgICAgICBpbnQgaSA9IDA7CisgICAgICAgIHdoaWxlIChpIDwgaXRlbUNvdW50KSB7CisgICAgICAgICAgICBpZiAoaXRlbXMuZ2V0KGkpLmdldEdyb3VwSWQoKSA9PSBncm91cElkKSB7CisgICAgICAgICAgICAgICAgaXRlbXMucmVtb3ZlKGkpOworICAgICAgICAgICAgICAgIGl0ZW1Db3VudC0tOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZW1vdmVJdGVtKGludCBpZCkgeworICAgICAgICBtSXRlbXMucmVtb3ZlKGZpbmRJdGVtSW5kZXgoaWQpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRHcm91cENoZWNrYWJsZShpbnQgZ3JvdXAsIGJvb2xlYW4gY2hlY2thYmxlLAorICAgICAgICAgICAgYm9vbGVhbiBleGNsdXNpdmUpIHsKKyAgICAgICAgZmluYWwgQXJyYXlMaXN0PEFjdGlvbk1lbnVJdGVtPiBpdGVtcyA9IG1JdGVtczsKKyAgICAgICAgZmluYWwgaW50IGl0ZW1Db3VudCA9IGl0ZW1zLnNpemUoKTsKKyAgICAgICAgCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXRlbUNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIEFjdGlvbk1lbnVJdGVtIGl0ZW0gPSBpdGVtcy5nZXQoaSk7CisgICAgICAgICAgICBpZiAoaXRlbS5nZXRHcm91cElkKCkgPT0gZ3JvdXApIHsKKyAgICAgICAgICAgICAgICBpdGVtLnNldENoZWNrYWJsZShjaGVja2FibGUpOworICAgICAgICAgICAgICAgIGl0ZW0uc2V0RXhjbHVzaXZlQ2hlY2thYmxlKGV4Y2x1c2l2ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRHcm91cEVuYWJsZWQoaW50IGdyb3VwLCBib29sZWFuIGVuYWJsZWQpIHsKKyAgICAgICAgZmluYWwgQXJyYXlMaXN0PEFjdGlvbk1lbnVJdGVtPiBpdGVtcyA9IG1JdGVtczsKKyAgICAgICAgZmluYWwgaW50IGl0ZW1Db3VudCA9IGl0ZW1zLnNpemUoKTsKKyAgICAgICAgCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXRlbUNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIEFjdGlvbk1lbnVJdGVtIGl0ZW0gPSBpdGVtcy5nZXQoaSk7CisgICAgICAgICAgICBpZiAoaXRlbS5nZXRHcm91cElkKCkgPT0gZ3JvdXApIHsKKyAgICAgICAgICAgICAgICBpdGVtLnNldEVuYWJsZWQoZW5hYmxlZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRHcm91cFZpc2libGUoaW50IGdyb3VwLCBib29sZWFuIHZpc2libGUpIHsKKyAgICAgICAgZmluYWwgQXJyYXlMaXN0PEFjdGlvbk1lbnVJdGVtPiBpdGVtcyA9IG1JdGVtczsKKyAgICAgICAgZmluYWwgaW50IGl0ZW1Db3VudCA9IGl0ZW1zLnNpemUoKTsKKyAgICAgICAgCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXRlbUNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIEFjdGlvbk1lbnVJdGVtIGl0ZW0gPSBpdGVtcy5nZXQoaSk7CisgICAgICAgICAgICBpZiAoaXRlbS5nZXRHcm91cElkKCkgPT0gZ3JvdXApIHsKKyAgICAgICAgICAgICAgICBpdGVtLnNldFZpc2libGUodmlzaWJsZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRRd2VydHlNb2RlKGJvb2xlYW4gaXNRd2VydHkpIHsKKyAgICAgICAgbUlzUXdlcnR5ID0gaXNRd2VydHk7CisgICAgfQorCisgICAgcHVibGljIGludCBzaXplKCkgeworICAgICAgICByZXR1cm4gbUl0ZW1zLnNpemUoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9tZW51L0FjdGlvbk1lbnVJdGVtLmphdmEgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9tZW51L0FjdGlvbk1lbnVJdGVtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDdkNWZiOQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC92aWV3L21lbnUvQWN0aW9uTWVudUl0ZW0uamF2YQpAQCAtMCwwICsxLDIyMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5tZW51OworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51SXRlbTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuU3ViTWVudTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuQ29udGV4dE1lbnUuQ29udGV4dE1lbnVJbmZvOworCisvKioKKyAqIEBoaWRlCisgKi8KK3B1YmxpYyBjbGFzcyBBY3Rpb25NZW51SXRlbSBpbXBsZW1lbnRzIE1lbnVJdGVtIHsKKyAgICBwcml2YXRlIGZpbmFsIGludCBtSWQ7CisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbUdyb3VwOworICAgIHByaXZhdGUgZmluYWwgaW50IG1DYXRlZ29yeU9yZGVyOworICAgIHByaXZhdGUgZmluYWwgaW50IG1PcmRlcmluZzsKKyAgICAKKyAgICBwcml2YXRlIENoYXJTZXF1ZW5jZSBtVGl0bGU7CisgICAgcHJpdmF0ZSBDaGFyU2VxdWVuY2UgbVRpdGxlQ29uZGVuc2VkOworICAgIHByaXZhdGUgSW50ZW50IG1JbnRlbnQ7CisgICAgcHJpdmF0ZSBjaGFyIG1TaG9ydGN1dE51bWVyaWNDaGFyOworICAgIHByaXZhdGUgY2hhciBtU2hvcnRjdXRBbHBoYWJldGljQ2hhcjsKKyAgICAKKyAgICBwcml2YXRlIERyYXdhYmxlIG1JY29uRHJhd2FibGU7CisgICAgcHJpdmF0ZSBpbnQgbUljb25SZXNJZCA9IE5PX0lDT047CisgICAgCisgICAgcHJpdmF0ZSBDb250ZXh0IG1Db250ZXh0OworICAgIAorICAgIHByaXZhdGUgTWVudUl0ZW0uT25NZW51SXRlbUNsaWNrTGlzdGVuZXIgbUNsaWNrTGlzdGVuZXI7CisgICAgCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5PX0lDT04gPSAwOworICAgIAorICAgIHByaXZhdGUgaW50IG1GbGFncyA9IEVOQUJMRUQ7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENIRUNLQUJMRSAgICAgID0gMHgwMDAwMDAwMTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ0hFQ0tFRCAgICAgICAgPSAweDAwMDAwMDAyOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFWENMVVNJVkUgICAgICA9IDB4MDAwMDAwMDQ7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEhJRERFTiAgICAgICAgID0gMHgwMDAwMDAwODsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRU5BQkxFRCAgICAgICAgPSAweDAwMDAwMDEwOworICAgIAorICAgIHB1YmxpYyBBY3Rpb25NZW51SXRlbShDb250ZXh0IGNvbnRleHQsIGludCBncm91cCwgaW50IGlkLCBpbnQgY2F0ZWdvcnlPcmRlciwgaW50IG9yZGVyaW5nLAorICAgICAgICAgICAgQ2hhclNlcXVlbmNlIHRpdGxlKSB7CisgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKKyAgICAgICAgbUlkID0gaWQ7CisgICAgICAgIG1Hcm91cCA9IGdyb3VwOworICAgICAgICBtQ2F0ZWdvcnlPcmRlciA9IGNhdGVnb3J5T3JkZXI7CisgICAgICAgIG1PcmRlcmluZyA9IG9yZGVyaW5nOworICAgICAgICBtVGl0bGUgPSB0aXRsZTsKKyAgICB9CisgICAgCisgICAgcHVibGljIGNoYXIgZ2V0QWxwaGFiZXRpY1Nob3J0Y3V0KCkgeworICAgICAgICByZXR1cm4gbVNob3J0Y3V0QWxwaGFiZXRpY0NoYXI7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRHcm91cElkKCkgeworICAgICAgICByZXR1cm4gbUdyb3VwOworICAgIH0KKworICAgIHB1YmxpYyBEcmF3YWJsZSBnZXRJY29uKCkgeworICAgICAgICByZXR1cm4gbUljb25EcmF3YWJsZTsKKyAgICB9CisKKyAgICBwdWJsaWMgSW50ZW50IGdldEludGVudCgpIHsKKyAgICAgICAgcmV0dXJuIG1JbnRlbnQ7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRJdGVtSWQoKSB7CisgICAgICAgIHJldHVybiBtSWQ7CisgICAgfQorCisgICAgcHVibGljIENvbnRleHRNZW51SW5mbyBnZXRNZW51SW5mbygpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHVibGljIGNoYXIgZ2V0TnVtZXJpY1Nob3J0Y3V0KCkgeworICAgICAgICByZXR1cm4gbVNob3J0Y3V0TnVtZXJpY0NoYXI7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRPcmRlcigpIHsKKyAgICAgICAgcmV0dXJuIG1PcmRlcmluZzsKKyAgICB9CisKKyAgICBwdWJsaWMgU3ViTWVudSBnZXRTdWJNZW51KCkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgQ2hhclNlcXVlbmNlIGdldFRpdGxlKCkgeworICAgICAgICByZXR1cm4gbVRpdGxlOworICAgIH0KKworICAgIHB1YmxpYyBDaGFyU2VxdWVuY2UgZ2V0VGl0bGVDb25kZW5zZWQoKSB7CisgICAgICAgIHJldHVybiBtVGl0bGVDb25kZW5zZWQ7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaGFzU3ViTWVudSgpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzQ2hlY2thYmxlKCkgeworICAgICAgICByZXR1cm4gKG1GbGFncyAmIENIRUNLQUJMRSkgIT0gMDsgCisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNDaGVja2VkKCkgeworICAgICAgICByZXR1cm4gKG1GbGFncyAmIENIRUNLRUQpICE9IDA7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKCkgeworICAgICAgICByZXR1cm4gKG1GbGFncyAmIEVOQUJMRUQpICE9IDA7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNWaXNpYmxlKCkgeworICAgICAgICByZXR1cm4gKG1GbGFncyAmIEhJRERFTikgPT0gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgTWVudUl0ZW0gc2V0QWxwaGFiZXRpY1Nob3J0Y3V0KGNoYXIgYWxwaGFDaGFyKSB7CisgICAgICAgIG1TaG9ydGN1dEFscGhhYmV0aWNDaGFyID0gYWxwaGFDaGFyOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgTWVudUl0ZW0gc2V0Q2hlY2thYmxlKGJvb2xlYW4gY2hlY2thYmxlKSB7CisgICAgICAgIG1GbGFncyA9IChtRmxhZ3MgJiB+Q0hFQ0tBQkxFKSB8IChjaGVja2FibGUgPyBDSEVDS0FCTEUgOiAwKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBBY3Rpb25NZW51SXRlbSBzZXRFeGNsdXNpdmVDaGVja2FibGUoYm9vbGVhbiBleGNsdXNpdmUpIHsKKyAgICAgICAgbUZsYWdzID0gKG1GbGFncyAmIH5FWENMVVNJVkUpIHwgKGV4Y2x1c2l2ZSA/IEVYQ0xVU0lWRSA6IDApOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgTWVudUl0ZW0gc2V0Q2hlY2tlZChib29sZWFuIGNoZWNrZWQpIHsKKyAgICAgICAgbUZsYWdzID0gKG1GbGFncyAmIH5DSEVDS0VEKSB8IChjaGVja2VkID8gQ0hFQ0tFRCA6IDApOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgTWVudUl0ZW0gc2V0RW5hYmxlZChib29sZWFuIGVuYWJsZWQpIHsKKyAgICAgICAgbUZsYWdzID0gKG1GbGFncyAmIH5FTkFCTEVEKSB8IChlbmFibGVkID8gRU5BQkxFRCA6IDApOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgTWVudUl0ZW0gc2V0SWNvbihEcmF3YWJsZSBpY29uKSB7CisgICAgICAgIG1JY29uRHJhd2FibGUgPSBpY29uOworICAgICAgICBtSWNvblJlc0lkID0gTk9fSUNPTjsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIE1lbnVJdGVtIHNldEljb24oaW50IGljb25SZXMpIHsKKyAgICAgICAgbUljb25SZXNJZCA9IGljb25SZXM7CisgICAgICAgIG1JY29uRHJhd2FibGUgPSBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXREcmF3YWJsZShpY29uUmVzKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIE1lbnVJdGVtIHNldEludGVudChJbnRlbnQgaW50ZW50KSB7CisgICAgICAgIG1JbnRlbnQgPSBpbnRlbnQ7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBNZW51SXRlbSBzZXROdW1lcmljU2hvcnRjdXQoY2hhciBudW1lcmljQ2hhcikgeworICAgICAgICBtU2hvcnRjdXROdW1lcmljQ2hhciA9IG51bWVyaWNDaGFyOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgTWVudUl0ZW0gc2V0T25NZW51SXRlbUNsaWNrTGlzdGVuZXIoT25NZW51SXRlbUNsaWNrTGlzdGVuZXIgbWVudUl0ZW1DbGlja0xpc3RlbmVyKSB7CisgICAgICAgIG1DbGlja0xpc3RlbmVyID0gbWVudUl0ZW1DbGlja0xpc3RlbmVyOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgTWVudUl0ZW0gc2V0U2hvcnRjdXQoY2hhciBudW1lcmljQ2hhciwgY2hhciBhbHBoYUNoYXIpIHsKKyAgICAgICAgbVNob3J0Y3V0TnVtZXJpY0NoYXIgPSBudW1lcmljQ2hhcjsKKyAgICAgICAgbVNob3J0Y3V0QWxwaGFiZXRpY0NoYXIgPSBhbHBoYUNoYXI7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBNZW51SXRlbSBzZXRUaXRsZShDaGFyU2VxdWVuY2UgdGl0bGUpIHsKKyAgICAgICAgbVRpdGxlID0gdGl0bGU7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBNZW51SXRlbSBzZXRUaXRsZShpbnQgdGl0bGUpIHsKKyAgICAgICAgbVRpdGxlID0gbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0U3RyaW5nKHRpdGxlKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIE1lbnVJdGVtIHNldFRpdGxlQ29uZGVuc2VkKENoYXJTZXF1ZW5jZSB0aXRsZSkgeworICAgICAgICBtVGl0bGVDb25kZW5zZWQgPSB0aXRsZTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIE1lbnVJdGVtIHNldFZpc2libGUoYm9vbGVhbiB2aXNpYmxlKSB7CisgICAgICAgIG1GbGFncyA9IChtRmxhZ3MgJiBISURERU4pIHwgKHZpc2libGUgPyAwIDogSElEREVOKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaW52b2tlKCkgeworICAgICAgICBpZiAobUNsaWNrTGlzdGVuZXIgIT0gbnVsbCAmJiBtQ2xpY2tMaXN0ZW5lci5vbk1lbnVJdGVtQ2xpY2sodGhpcykpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAobUludGVudCAhPSBudWxsKSB7CisgICAgICAgICAgICBtQ29udGV4dC5zdGFydEFjdGl2aXR5KG1JbnRlbnQpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9tZW51L0FjdGlvbk1lbnVJdGVtVmlldy5qYXZhIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvbWVudS9BY3Rpb25NZW51SXRlbVZpZXcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGQ5ZjYwCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvbWVudS9BY3Rpb25NZW51SXRlbVZpZXcuamF2YQpAQCAtMCwwICsxLDExMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5tZW51OworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OworaW1wb3J0IGFuZHJvaWQudmlldy5Tb3VuZEVmZmVjdENvbnN0YW50czsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5JbWFnZUJ1dHRvbjsKKworLyoqCisgKiBAaGlkZQorICovCitwdWJsaWMgY2xhc3MgQWN0aW9uTWVudUl0ZW1WaWV3IGV4dGVuZHMgSW1hZ2VCdXR0b24gaW1wbGVtZW50cyBNZW51Vmlldy5JdGVtVmlldyB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJBY3Rpb25NZW51SXRlbVZpZXciOworICAgIAorICAgIHByaXZhdGUgTWVudUl0ZW1JbXBsIG1JdGVtRGF0YTsKKyAgICBwcml2YXRlIENoYXJTZXF1ZW5jZSBtVGl0bGU7CisgICAgcHJpdmF0ZSBNZW51QnVpbGRlci5JdGVtSW52b2tlciBtSXRlbUludm9rZXI7CisgICAgCisgICAgcHVibGljIEFjdGlvbk1lbnVJdGVtVmlldyhDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgdGhpcyhjb250ZXh0LCBudWxsKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIEFjdGlvbk1lbnVJdGVtVmlldyhDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycykgeworICAgICAgICB0aGlzKGNvbnRleHQsIGF0dHJzLCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmF0dHIuYWN0aW9uQnV0dG9uU3R5bGUpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgQWN0aW9uTWVudUl0ZW1WaWV3KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzLCBpbnQgZGVmU3R5bGUpIHsKKyAgICAgICAgc3VwZXIoY29udGV4dCwgYXR0cnMsIGRlZlN0eWxlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTWVudUl0ZW1JbXBsIGdldEl0ZW1EYXRhKCkgeworICAgICAgICByZXR1cm4gbUl0ZW1EYXRhOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGluaXRpYWxpemUoTWVudUl0ZW1JbXBsIGl0ZW1EYXRhLCBpbnQgbWVudVR5cGUpIHsKKyAgICAgICAgbUl0ZW1EYXRhID0gaXRlbURhdGE7CisgICAgICAgIAorICAgICAgICBzZXRDbGlja2FibGUodHJ1ZSk7CisgICAgICAgIHNldEZvY3VzYWJsZSh0cnVlKTsKKyAgICAgICAgc2V0VGl0bGUoaXRlbURhdGEuZ2V0VGl0bGUoKSk7CisgICAgICAgIHNldEljb24oaXRlbURhdGEuZ2V0SWNvbigpKTsKKyAgICAgICAgc2V0SWQoaXRlbURhdGEuZ2V0SXRlbUlkKCkpOworICAgICAgICAKKyAgICAgICAgc2V0VmlzaWJpbGl0eShpdGVtRGF0YS5pc1Zpc2libGUoKSA/IFZpZXcuVklTSUJMRSA6IFZpZXcuR09ORSk7CisgICAgICAgIHNldEVuYWJsZWQoaXRlbURhdGEuaXNFbmFibGVkKCkpOworICAgIH0KKyAgICAKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBwZXJmb3JtQ2xpY2soKSB7CisgICAgICAgIC8vIExldCB0aGUgdmlldydzIGxpc3RlbmVyIGhhdmUgdG9wIHByaW9yaXR5CisgICAgICAgIGlmIChzdXBlci5wZXJmb3JtQ2xpY2soKSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmIChtSXRlbUludm9rZXIgIT0gbnVsbCAmJiBtSXRlbUludm9rZXIuaW52b2tlSXRlbShtSXRlbURhdGEpKSB7CisgICAgICAgICAgICBwbGF5U291bmRFZmZlY3QoU291bmRFZmZlY3RDb25zdGFudHMuQ0xJQ0spOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgc2V0SXRlbUludm9rZXIoTWVudUJ1aWxkZXIuSXRlbUludm9rZXIgaW52b2tlcikgeworICAgICAgICBtSXRlbUludm9rZXIgPSBpbnZva2VyOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIHByZWZlcnNDb25kZW5zZWRUaXRsZSgpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldENoZWNrYWJsZShib29sZWFuIGNoZWNrYWJsZSkgeworICAgICAgICAvLyBUT0RPIFN1cHBvcnQgY2hlY2thYmxlIGFjdGlvbiBpdGVtcworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldENoZWNrZWQoYm9vbGVhbiBjaGVja2VkKSB7CisgICAgICAgIC8vIFRPRE8gU3VwcG9ydCBjaGVja2FibGUgYWN0aW9uIGl0ZW1zCisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0SWNvbihEcmF3YWJsZSBpY29uKSB7CisgICAgICAgIHNldEltYWdlRHJhd2FibGUoaWNvbik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U2hvcnRjdXQoYm9vbGVhbiBzaG93U2hvcnRjdXQsIGNoYXIgc2hvcnRjdXRLZXkpIHsKKyAgICAgICAgLy8gQWN0aW9uIGJ1dHRvbnMgZG9uJ3Qgc2hvdyB0ZXh0IGZvciBzaG9ydGN1dCBrZXlzLgorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFRpdGxlKENoYXJTZXF1ZW5jZSB0aXRsZSkgeworICAgICAgICBtVGl0bGUgPSB0aXRsZTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBzaG93c0ljb24oKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvbWVudS9BY3Rpb25NZW51Vmlldy5qYXZhIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvbWVudS9BY3Rpb25NZW51Vmlldy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3ZDI3YWMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9tZW51L0FjdGlvbk1lbnVWaWV3LmphdmEKQEAgLTAsMCArMSwxMjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnU7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlR5cGVkQXJyYXk7CitpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkxpbmVhckxheW91dDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CisKKy8qKgorICogQGhpZGUKKyAqLworcHVibGljIGNsYXNzIEFjdGlvbk1lbnVWaWV3IGV4dGVuZHMgTGluZWFyTGF5b3V0IGltcGxlbWVudHMgTWVudUJ1aWxkZXIuSXRlbUludm9rZXIsIE1lbnVWaWV3IHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkFjdGlvbk1lbnVWaWV3IjsKKyAgICAKKyAgICBwcml2YXRlIE1lbnVCdWlsZGVyIG1NZW51OworCisgICAgcHJpdmF0ZSBpbnQgbUl0ZW1QYWRkaW5nOworICAgIHByaXZhdGUgaW50IG1JdGVtTWFyZ2luOworICAgIHByaXZhdGUgaW50IG1NYXhJdGVtczsKKyAgICAKKyAgICBwdWJsaWMgQWN0aW9uTWVudVZpZXcoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIHRoaXMoY29udGV4dCwgbnVsbCk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBBY3Rpb25NZW51VmlldyhDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycykgeworICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycyk7CisgICAgICAgIAorICAgICAgICBUeXBlZEFycmF5IGEgPSBjb250ZXh0Lm9idGFpblN0eWxlZEF0dHJpYnV0ZXMoYXR0cnMsCisgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuVGhlbWUpOworICAgICAgICBtSXRlbVBhZGRpbmcgPSBhLmdldERpbWVuc2lvblBpeGVsT2Zmc2V0KAorICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLlRoZW1lX2FjdGlvbkJ1dHRvblBhZGRpbmcsIDApOworICAgICAgICBtSXRlbU1hcmdpbiA9IG1JdGVtUGFkZGluZyAvIDI7CisgICAgICAgIGEucmVjeWNsZSgpOworICAgICAgICAKKyAgICAgICAgZmluYWwgUmVzb3VyY2VzIHJlcyA9IGdldFJlc291cmNlcygpOworICAgICAgICBmaW5hbCBpbnQgc2l6ZSA9IHJlcy5nZXREaW1lbnNpb25QaXhlbFNpemUoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5kaW1lbi5hY3Rpb25faWNvbl9zaXplKTsKKyAgICAgICAgZmluYWwgaW50IHNwYWNlQXZhaWxhYmxlID0gcmVzLmdldERpc3BsYXlNZXRyaWNzKCkud2lkdGhQaXhlbHMgLyAyOworICAgICAgICBmaW5hbCBpbnQgaXRlbVNwYWNlID0gc2l6ZSArIG1JdGVtUGFkZGluZzsgCisgICAgICAgIAorICAgICAgICBtTWF4SXRlbXMgPSBzcGFjZUF2YWlsYWJsZSAvIChpdGVtU3BhY2UgPiAwID8gaXRlbVNwYWNlIDogMSk7CisgICAgfQorICAgIAorICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBib29sZWFuIGNoZWNrTGF5b3V0UGFyYW1zKFZpZXdHcm91cC5MYXlvdXRQYXJhbXMgcCkgeworICAgICAgICBpZiAocCBpbnN0YW5jZW9mIExheW91dFBhcmFtcykgeworICAgICAgICAgICAgTGF5b3V0UGFyYW1zIGxwID0gKExheW91dFBhcmFtcykgcDsKKyAgICAgICAgICAgIHJldHVybiBscC5sZWZ0TWFyZ2luID09IG1JdGVtTWFyZ2luICYmIGxwLnJpZ2h0TWFyZ2luID09IG1JdGVtTWFyZ2luICYmCisgICAgICAgICAgICAgICAgICAgIGxwLndpZHRoID09IExheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQgJiYgbHAuaGVpZ2h0ID09IExheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgTGF5b3V0UGFyYW1zIGdlbmVyYXRlRGVmYXVsdExheW91dFBhcmFtcygpIHsKKyAgICAgICAgTGF5b3V0UGFyYW1zIHBhcmFtcyA9IG5ldyBMYXlvdXRQYXJhbXMoTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCwKKyAgICAgICAgICAgICAgICBMYXlvdXRQYXJhbXMuV1JBUF9DT05URU5UKTsKKyAgICAgICAgcGFyYW1zLmxlZnRNYXJnaW4gPSBtSXRlbU1hcmdpbjsKKyAgICAgICAgcGFyYW1zLnJpZ2h0TWFyZ2luID0gbUl0ZW1NYXJnaW47CisgICAgICAgIHJldHVybiBwYXJhbXM7CisgICAgfQorICAgIAorICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBMYXlvdXRQYXJhbXMgZ2VuZXJhdGVMYXlvdXRQYXJhbXMoVmlld0dyb3VwLkxheW91dFBhcmFtcyBwKSB7CisgICAgICAgIHJldHVybiBnZW5lcmF0ZURlZmF1bHRMYXlvdXRQYXJhbXMoKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIGludCBnZXRJdGVtTWFyZ2luKCkgeworICAgICAgICByZXR1cm4gbUl0ZW1NYXJnaW47CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaW52b2tlSXRlbShNZW51SXRlbUltcGwgaXRlbSkgeworICAgICAgICByZXR1cm4gbU1lbnUucGVyZm9ybUl0ZW1BY3Rpb24oaXRlbSwgMCk7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRXaW5kb3dBbmltYXRpb25zKCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBpbml0aWFsaXplKE1lbnVCdWlsZGVyIG1lbnUsIGludCBtZW51VHlwZSkgeworICAgICAgICBtZW51LnNldE1heEFjdGlvbkl0ZW1zKG1NYXhJdGVtcyk7CisgICAgICAgIG1NZW51ID0gbWVudTsKKyAgICAgICAgdXBkYXRlQ2hpbGRyZW4odHJ1ZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdXBkYXRlQ2hpbGRyZW4oYm9vbGVhbiBjbGVhcmVkKSB7CisgICAgICAgIHJlbW92ZUFsbFZpZXdzKCk7CisgICAgICAgIAorICAgICAgICBmaW5hbCBBcnJheUxpc3Q8TWVudUl0ZW1JbXBsPiBpdGVtc1RvU2hvdyA9IG1NZW51LmdldEFjdGlvbkl0ZW1zKCk7CisgICAgICAgIGZpbmFsIGludCBpdGVtQ291bnQgPSBpdGVtc1RvU2hvdy5zaXplKCk7CisgICAgICAgIAorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1Db3VudDsgaSsrKSB7CisgICAgICAgICAgICBmaW5hbCBNZW51SXRlbUltcGwgaXRlbURhdGEgPSBpdGVtc1RvU2hvdy5nZXQoaSk7CisgICAgICAgICAgICBhZGRJdGVtVmlldygoQWN0aW9uTWVudUl0ZW1WaWV3KSBpdGVtRGF0YS5nZXRJdGVtVmlldyhNZW51QnVpbGRlci5UWVBFX0FDVElPTl9CVVRUT04sCisgICAgICAgICAgICAgICAgICAgIHRoaXMpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhZGRJdGVtVmlldyhBY3Rpb25NZW51SXRlbVZpZXcgdmlldykgeworICAgICAgICB2aWV3LnNldEl0ZW1JbnZva2VyKHRoaXMpOworICAgICAgICBhZGRWaWV3KHZpZXcpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC92aWV3L21lbnUvSWNvbk1lbnVWaWV3LmphdmEgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9tZW51L0ljb25NZW51Vmlldy5qYXZhCmluZGV4IGJlYjU3YmEuLmJiZjdjNjggMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC92aWV3L21lbnUvSWNvbk1lbnVWaWV3LmphdmEKKysrIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvbWVudS9JY29uTWVudVZpZXcuamF2YQpAQCAtMzM3LDcgKzMzNyw3IEBACiAgICAgICAgIC8vIFRoaXMgbWV0aG9kIGRvZXMgYSBjbGVhciByZWZyZXNoIG9mIGNoaWxkcmVuCiAgICAgICAgIHJlbW92ZUFsbFZpZXdzKCk7CiAgICAgICAgIAotICAgICAgICBmaW5hbCBBcnJheUxpc3Q8TWVudUl0ZW1JbXBsPiBpdGVtc1RvU2hvdyA9IG1NZW51LmdldFZpc2libGVJdGVtcygpOworICAgICAgICBmaW5hbCBBcnJheUxpc3Q8TWVudUl0ZW1JbXBsPiBpdGVtc1RvU2hvdyA9IG1NZW51LmdldE5vbkFjdGlvbkl0ZW1zKCk7CiAgICAgICAgIGZpbmFsIGludCBudW1JdGVtcyA9IGl0ZW1zVG9TaG93LnNpemUoKTsKICAgICAgICAgZmluYWwgaW50IG51bUl0ZW1zVGhhdENhbkZpdCA9IG1NYXhJdGVtczsKICAgICAgICAgLy8gTWluaW11bSBvZiB0aGUgbnVtIHRoYXQgY2FuIGZpdCBhbmQgdGhlIG51bSB0aGF0IHdlIGhhdmUKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC92aWV3L21lbnUvTWVudUJ1aWxkZXIuamF2YSBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC92aWV3L21lbnUvTWVudUJ1aWxkZXIuamF2YQppbmRleCAyMjhkNWQwLi5hOTYyMjEyIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9tZW51L01lbnVCdWlsZGVyLmphdmEKKysrIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvbWVudS9NZW51QnVpbGRlci5qYXZhCkBAIC0yNywxNiArMjcsMTcgQEAKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOwogaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwogaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsYWJsZTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogaW1wb3J0IGFuZHJvaWQudXRpbC5TcGFyc2VBcnJheTsKIGltcG9ydCBhbmRyb2lkLnZpZXcuQ29udGV4dFRoZW1lV3JhcHBlcjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuS2V5Q2hhcmFjdGVyTWFwOwogaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXI7CiBpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnU7CiBpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnVJdGVtOwogaW1wb3J0IGFuZHJvaWQudmlldy5TdWJNZW51OwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyOwogaW1wb3J0IGFuZHJvaWQudmlldy5Db250ZXh0TWVudS5Db250ZXh0TWVudUluZm87CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuQWRhcHRlclZpZXc7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuQmFzZUFkYXB0ZXI7CkBAIC01NCw3ICs1NSw3IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR1RBRyA9ICJNZW51QnVpbGRlciI7CiAgICAgCiAgICAgLyoqIFRoZSBudW1iZXIgb2YgZGlmZmVyZW50IG1lbnUgdHlwZXMgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOVU1fVFlQRVMgPSAzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5VTV9UWVBFUyA9IDQ7CiAgICAgLyoqIFRoZSBtZW51IHR5cGUgdGhhdCByZXByZXNlbnRzIHRoZSBpY29uIG1lbnUgdmlldyAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfSUNPTiA9IDA7CiAgICAgLyoqIFRoZSBtZW51IHR5cGUgdGhhdCByZXByZXNlbnRzIHRoZSBleHBhbmRlZCBtZW51IHZpZXcgKi8KQEAgLTY1LDYgKzY2LDExIEBACiAgICAgICogaGF2ZSBhbiBJdGVtVmlldy4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX0RJQUxPRyA9IDI7CisgICAgCisgICAgLyoqCisgICAgICogVGhlIG1lbnUgdHlwZSB0aGF0IHJlcHJlc2VudHMgYSBidXR0b24gaW4gdGhlIGFwcGxpY2F0aW9uJ3MgYWN0aW9uIGJhci4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX0FDVElPTl9CVVRUT04gPSAzOwogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZJRVdTX1RBRyA9ICJhbmRyb2lkOnZpZXdzIjsKICAgICAKQEAgLTczLDYgKzc5LDcgQEAKICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZS5UaGVtZV9JY29uTWVudSwKICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZS5UaGVtZV9FeHBhbmRlZE1lbnUsCiAgICAgICAgIDAsCisgICAgICAgIDAsCiAgICAgfTsKICAgICAKICAgICAvLyBPcmRlciBtdXN0IGJlIHRoZSBzYW1lIG9yZGVyIGFzIHRoZSBUWVBFXyoKQEAgLTgwLDYgKzg3LDcgQEAKICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5sYXlvdXQuaWNvbl9tZW51X2xheW91dCwKICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5sYXlvdXQuZXhwYW5kZWRfbWVudV9sYXlvdXQsCiAgICAgICAgIDAsCisgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIubGF5b3V0LmFjdGlvbl9tZW51X2xheW91dCwKICAgICB9OwogCiAgICAgLy8gT3JkZXIgbXVzdCBiZSB0aGUgc2FtZSBvcmRlciBhcyB0aGUgVFlQRV8qCkBAIC04Nyw2ICs5NSw3IEBACiAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIubGF5b3V0Lmljb25fbWVudV9pdGVtX2xheW91dCwKICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5sYXlvdXQubGlzdF9tZW51X2l0ZW1fbGF5b3V0LAogICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmxheW91dC5saXN0X21lbnVfaXRlbV9sYXlvdXQsCisgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIubGF5b3V0LmFjdGlvbl9tZW51X2l0ZW1fbGF5b3V0LAogICAgIH07CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnRbXSAgc0NhdGVnb3J5VG9PcmRlciA9IG5ldyBpbnRbXSB7CkBAIC0xMzAsNiArMTM5LDI0IEBACiAgICAgICogZmV0Y2hlZCBmcm9tIHtAbGluayAjZ2V0VmlzaWJsZUl0ZW1zKCl9CiAgICAgICovIAogICAgIHByaXZhdGUgYm9vbGVhbiBtSXNWaXNpYmxlSXRlbXNTdGFsZTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBDb250YWlucyBvbmx5IHRoZSBpdGVtcyB0aGF0IHNob3VsZCBhcHBlYXIgaW4gdGhlIEFjdGlvbiBCYXIsIGlmIHByZXNlbnQuCisgICAgICovCisgICAgcHJpdmF0ZSBBcnJheUxpc3Q8TWVudUl0ZW1JbXBsPiBtQWN0aW9uSXRlbXM7CisgICAgLyoqCisgICAgICogQ29udGFpbnMgaXRlbXMgdGhhdCBzaG91bGQgTk9UIGFwcGVhciBpbiB0aGUgQWN0aW9uIEJhciwgaWYgcHJlc2VudC4KKyAgICAgKi8KKyAgICBwcml2YXRlIEFycmF5TGlzdDxNZW51SXRlbUltcGw+IG1Ob25BY3Rpb25JdGVtczsKKyAgICAvKioKKyAgICAgKiBUaGUgbnVtYmVyIG9mIHZpc2libGUgYWN0aW9uIGJ1dHRvbnMgcGVybWl0dGVkIGluIHRoaXMgbWVudQorICAgICAqLworICAgIHByaXZhdGUgaW50IG1NYXhBY3Rpb25JdGVtczsKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgaXRlbXMgKG9yIGFueSBvbmUgaXRlbSdzIGFjdGlvbiBzdGF0ZSkgaGFzIGNoYW5nZWQgc2luY2UgaXQgd2FzCisgICAgICogbGFzdCBmZXRjaGVkLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBtSXNBY3Rpb25JdGVtc1N0YWxlOwogCiAgICAgLyoqCiAgICAgICogQ3VycmVudCB1c2UgY2FzZSBpcyBDb250ZXh0IE1lbnVzOiBBcyBWaWV3cyBwb3B1bGF0ZSB0aGUgY29udGV4dCBtZW51LCBlYWNoIG9uZSBoYXMKQEAgLTI4MSw2ICszMDgsMTAgQEAKICAgICAgICAgbVZpc2libGVJdGVtcyA9IG5ldyBBcnJheUxpc3Q8TWVudUl0ZW1JbXBsPigpOwogICAgICAgICBtSXNWaXNpYmxlSXRlbXNTdGFsZSA9IHRydWU7CiAgICAgICAgIAorICAgICAgICBtQWN0aW9uSXRlbXMgPSBuZXcgQXJyYXlMaXN0PE1lbnVJdGVtSW1wbD4oKTsKKyAgICAgICAgbU5vbkFjdGlvbkl0ZW1zID0gbmV3IEFycmF5TGlzdDxNZW51SXRlbUltcGw+KCk7CisgICAgICAgIG1Jc0FjdGlvbkl0ZW1zU3RhbGUgPSB0cnVlOworICAgICAgICAKICAgICAgICAgbVNob3J0Y3V0c1Zpc2libGUgPQogICAgICAgICAgICAgICAgIChtUmVzb3VyY2VzLmdldENvbmZpZ3VyYXRpb24oKS5rZXlib2FyZCAhPSBDb25maWd1cmF0aW9uLktFWUJPQVJEX05PS0VZUyk7CiAgICAgfQpAQCAtOTAwLDYgKzkzMSw3IEBACiAgICAgcHJpdmF0ZSB2b2lkIG9uSXRlbXNDaGFuZ2VkKGJvb2xlYW4gY2xlYXJlZCkgewogICAgICAgICBpZiAoIW1QcmV2ZW50RGlzcGF0Y2hpbmdJdGVtc0NoYW5nZWQpIHsKICAgICAgICAgICAgIGlmIChtSXNWaXNpYmxlSXRlbXNTdGFsZSA9PSBmYWxzZSkgbUlzVmlzaWJsZUl0ZW1zU3RhbGUgPSB0cnVlOworICAgICAgICAgICAgaWYgKG1Jc0FjdGlvbkl0ZW1zU3RhbGUgPT0gZmFsc2UpIG1Jc0FjdGlvbkl0ZW1zU3RhbGUgPSB0cnVlOwogICAgICAgICAgICAgCiAgICAgICAgICAgICBNZW51VHlwZVtdIG1lbnVUeXBlcyA9IG1NZW51VHlwZXM7CiAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE5VTV9UWVBFUzsgaSsrKSB7CkBAIC05MjAsNiArOTUyLDE1IEBACiAgICAgICAgIG9uSXRlbXNDaGFuZ2VkKGZhbHNlKTsKICAgICB9CiAgICAgCisgICAgLyoqCisgICAgICogQ2FsbGVkIGJ5IHtAbGluayBNZW51SXRlbUltcGx9IHdoZW4gaXRzIGFjdGlvbiByZXF1ZXN0IHN0YXR1cyBpcyBjaGFuZ2VkLgorICAgICAqIEBwYXJhbSBpdGVtIFRoZSBpdGVtIHRoYXQgaGFzIGdvbmUgdGhyb3VnaCBhIGNoYW5nZSBpbiBhY3Rpb24gcmVxdWVzdCBzdGF0dXMuCisgICAgICovCisgICAgdm9pZCBvbkl0ZW1BY3Rpb25SZXF1ZXN0Q2hhbmdlZChNZW51SXRlbUltcGwgaXRlbSkgeworICAgICAgICAvLyBOb3RpZnkgb2YgaXRlbXMgYmVpbmcgY2hhbmdlZAorICAgICAgICBvbkl0ZW1zQ2hhbmdlZChmYWxzZSk7CisgICAgfQorICAgIAogICAgIEFycmF5TGlzdDxNZW51SXRlbUltcGw+IGdldFZpc2libGVJdGVtcygpIHsKICAgICAgICAgaWYgKCFtSXNWaXNpYmxlSXRlbXNTdGFsZSkgcmV0dXJuIG1WaXNpYmxlSXRlbXM7CiAgICAgICAgIApAQCAtOTM0LDkgKzk3NSw2NCBAQAogICAgICAgICB9CiAgICAgICAgIAogICAgICAgICBtSXNWaXNpYmxlSXRlbXNTdGFsZSA9IGZhbHNlOworICAgICAgICBtSXNBY3Rpb25JdGVtc1N0YWxlID0gdHJ1ZTsKICAgICAgICAgCiAgICAgICAgIHJldHVybiBtVmlzaWJsZUl0ZW1zOwogICAgIH0KKyAgICAKKyAgICBwcml2YXRlIHZvaWQgZmxhZ0FjdGlvbkl0ZW1zKCkgeworICAgICAgICBpZiAoIW1Jc0FjdGlvbkl0ZW1zU3RhbGUpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgZmluYWwgQXJyYXlMaXN0PE1lbnVJdGVtSW1wbD4gdmlzaWJsZUl0ZW1zID0gZ2V0VmlzaWJsZUl0ZW1zKCk7CisgICAgICAgIGZpbmFsIGludCBpdGVtc1NpemUgPSB2aXNpYmxlSXRlbXMuc2l6ZSgpOworICAgICAgICBpbnQgbWF4QWN0aW9ucyA9IG1NYXhBY3Rpb25JdGVtczsKKyAgICAgICAgCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXNTaXplOyBpKyspIHsKKyAgICAgICAgICAgIE1lbnVJdGVtSW1wbCBpdGVtID0gdmlzaWJsZUl0ZW1zLmdldChpKTsKKyAgICAgICAgICAgIGlmIChpdGVtLnJlcXVpcmVzQWN0aW9uQnV0dG9uKCkpIHsKKyAgICAgICAgICAgICAgICBtYXhBY3Rpb25zLS07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vIEZsYWcgYXMgbWFueSBtb3JlIHJlcXVlc3RlZCBpdGVtcyBhcyB3aWxsIGZpdC4KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtc1NpemU7IGkrKykgeworICAgICAgICAgICAgTWVudUl0ZW1JbXBsIGl0ZW0gPSB2aXNpYmxlSXRlbXMuZ2V0KGkpOworICAgICAgICAgICAgaWYgKGl0ZW0ucmVxdWVzdHNBY3Rpb25CdXR0b24oKSkgeworICAgICAgICAgICAgICAgIGl0ZW0uc2V0SXNBY3Rpb25CdXR0b24obWF4QWN0aW9ucyA+IDApOworICAgICAgICAgICAgICAgIG1heEFjdGlvbnMtLTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgbUFjdGlvbkl0ZW1zLmNsZWFyKCk7CisgICAgICAgIG1Ob25BY3Rpb25JdGVtcy5jbGVhcigpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zU2l6ZTsgaSsrKSB7CisgICAgICAgICAgICBNZW51SXRlbUltcGwgaXRlbSA9IHZpc2libGVJdGVtcy5nZXQoaSk7CisgICAgICAgICAgICBpZiAoaXRlbS5pc0FjdGlvbkJ1dHRvbigpKSB7CisgICAgICAgICAgICAgICAgbUFjdGlvbkl0ZW1zLmFkZChpdGVtKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbU5vbkFjdGlvbkl0ZW1zLmFkZChpdGVtKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgbUlzQWN0aW9uSXRlbXNTdGFsZSA9IGZhbHNlOworICAgIH0KKyAgICAKKyAgICBBcnJheUxpc3Q8TWVudUl0ZW1JbXBsPiBnZXRBY3Rpb25JdGVtcygpIHsKKyAgICAgICAgZmxhZ0FjdGlvbkl0ZW1zKCk7CisgICAgICAgIHJldHVybiBtQWN0aW9uSXRlbXM7CisgICAgfQorICAgIAorICAgIEFycmF5TGlzdDxNZW51SXRlbUltcGw+IGdldE5vbkFjdGlvbkl0ZW1zKCkgeworICAgICAgICBmbGFnQWN0aW9uSXRlbXMoKTsKKyAgICAgICAgcmV0dXJuIG1Ob25BY3Rpb25JdGVtczsKKyAgICB9CisgICAgCisgICAgdm9pZCBzZXRNYXhBY3Rpb25JdGVtcyhpbnQgbWF4QWN0aW9uSXRlbXMpIHsKKyAgICAgICAgbU1heEFjdGlvbkl0ZW1zID0gbWF4QWN0aW9uSXRlbXM7CisgICAgICAgIG1Jc0FjdGlvbkl0ZW1zU3RhbGUgPSB0cnVlOworICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIGNsZWFySGVhZGVyKCkgewogICAgICAgICBtSGVhZGVySWNvbiA9IG51bGw7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9tZW51L01lbnVJdGVtSW1wbC5qYXZhIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvbWVudS9NZW51SXRlbUltcGwuamF2YQppbmRleCA5YjU4MjA1Li5kYzFlODFmIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9tZW51L01lbnVJdGVtSW1wbC5qYXZhCisrKyBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC92aWV3L21lbnUvTWVudUl0ZW1JbXBsLmphdmEKQEAgLTc0LDYgKzc0LDE1IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVYQ0xVU0lWRSAgICAgID0gMHgwMDAwMDAwNDsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSElEREVOICAgICAgICAgPSAweDAwMDAwMDA4OwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFTkFCTEVEICAgICAgICA9IDB4MDAwMDAwMTA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElTX0FDVElPTiAgICAgID0gMHgwMDAwMDAyMDsKKyAgICAKKyAgICAvKgorICAgICAqIFRoZXNlIHNob3VsZCBiZSBrZXB0IGluIHN5bmMgd2l0aCBhdHRycy54bWwgZW51bSBjb25zdGFudHMgZm9yIHNob3dBc0FjdGlvbgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTSE9XX0FTX0FDVElPTl9ORVZFUiA9IDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNIT1dfQVNfQUNUSU9OX0lGX1JPT00gPSAxOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTSE9XX0FTX0FDVElPTl9BTFdBWVMgPSAyOworICAgIHByaXZhdGUgaW50IG1TaG93QXNBY3Rpb24gPSBTSE9XX0FTX0FDVElPTl9ORVZFUjsKIAogICAgIC8qKiBVc2VkIGZvciB0aGUgaWNvbiByZXNvdXJjZSBJRCBpZiB0aGlzIGl0ZW0gZG9lcyBub3QgaGF2ZSBhbiBpY29uICovCiAgICAgc3RhdGljIGZpbmFsIGludCBOT19JQ09OID0gMDsKQEAgLTYzMCw0ICs2MzksMzUgQEAKICAgICBwdWJsaWMgYm9vbGVhbiBzaG91bGRTaG93SWNvbihpbnQgbWVudVR5cGUpIHsKICAgICAgICAgcmV0dXJuIG1lbnVUeXBlID09IE1lbnVCdWlsZGVyLlRZUEVfSUNPTiB8fCBtTWVudS5nZXRPcHRpb25hbEljb25zVmlzaWJsZSgpOwogICAgIH0KKyAgICAKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0FjdGlvbkJ1dHRvbigpIHsKKyAgICAgICAgcmV0dXJuIChtRmxhZ3MgJiBJU19BQ1RJT04pID09IElTX0FDVElPTiB8fCByZXF1aXJlc0FjdGlvbkJ1dHRvbigpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgYm9vbGVhbiByZXF1ZXN0c0FjdGlvbkJ1dHRvbigpIHsKKyAgICAgICAgcmV0dXJuIG1TaG93QXNBY3Rpb24gPT0gU0hPV19BU19BQ1RJT05fSUZfUk9PTTsKKyAgICB9CisgICAgCisgICAgcHVibGljIGJvb2xlYW4gcmVxdWlyZXNBY3Rpb25CdXR0b24oKSB7CisgICAgICAgIHJldHVybiBtU2hvd0FzQWN0aW9uID09IFNIT1dfQVNfQUNUSU9OX0FMV0FZUzsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRJc0FjdGlvbkJ1dHRvbihib29sZWFuIGlzQWN0aW9uQnV0dG9uKSB7CisgICAgICAgIGlmIChpc0FjdGlvbkJ1dHRvbikgeworICAgICAgICAgICAgbUZsYWdzIHw9IElTX0FDVElPTjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1GbGFncyAmPSB+SVNfQUNUSU9OOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFVzZWQgYnkgTWVudUluZmxhdGVyIHRvIHNldCBob3cgdGhpcyBpdGVtIHNob3VsZCBkaXNwbGF5IGluIHRoZSBwcmVzZW5jZSBvZgorICAgICAqIGFuIEFjdGlvbiBCYXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYWN0aW9uRW51bSBFbnVtIGZsYWcgYXMgZGVmaW5lZCBpbiBhdHRycy54bWwvU0hPV19BU18gY29uc3RhbnRzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNob3dBc0FjdGlvbihpbnQgYWN0aW9uRW51bSkgeworICAgICAgICBtU2hvd0FzQWN0aW9uID0gYWN0aW9uRW51bTsKKyAgICAgICAgbU1lbnUub25JdGVtQWN0aW9uUmVxdWVzdENoYW5nZWQodGhpcyk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9Db250YWN0SGVhZGVyV2lkZ2V0LmphdmEgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L0NvbnRhY3RIZWFkZXJXaWRnZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQyMTQ2Ni4uMDAwMDAwMAotLS0gYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L0NvbnRhY3RIZWFkZXJXaWRnZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQ7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SOwotCi1pbXBvcnQgYW5kcm9pZC5NYW5pZmVzdDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQXN5bmNRdWVyeUhhbmRsZXI7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFVyaXM7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXM7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlci5OYW1lTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXMuTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3I7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXBGYWN0b3J5OwotaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKLWltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db250YWN0czsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuRGF0YTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuUGhvbmVMb29rdXA7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LlJhd0NvbnRhY3RzOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5TdGF0dXNVcGRhdGVzOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuRW1haWw7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5QaG90bzsKLWltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwotaW1wb3J0IGFuZHJvaWQudGV4dC5mb3JtYXQuRGF0ZVV0aWxzOwotaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXI7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuQ2hlY2tCb3g7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuUXVpY2tDb250YWN0QmFkZ2U7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuRnJhbWVMYXlvdXQ7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuSW1hZ2VWaWV3OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OwotCi0vKioKLSAqIEhlYWRlciB1c2VkIGFjcm9zcyBzeXN0ZW0gZm9yIGRpc3BsYXlpbmcgYSB0aXRsZSBiYXIgd2l0aCBjb250YWN0IGluZm8uIFlvdQotICogY2FuIGJpbmQgc3BlY2lmaWMgdmFsdWVzIG9uIHRoZSBoZWFkZXIsIG9yIHVzZSBoZWxwZXIgbWV0aG9kcyBsaWtlCi0gKiB7QGxpbmsgI2JpbmRGcm9tQ29udGFjdElkKGxvbmcpfSB0byBwb3B1bGF0ZSBhc3luY2hyb25vdXNseS4KLSAqIDxwPgotICogVGhlIHBhcmVudCBtdXN0IHJlcXVlc3QgdGhlIHtAbGluayBNYW5pZmVzdC5wZXJtaXNzaW9uI1JFQURfQ09OVEFDVFN9Ci0gKiBwZXJtaXNzaW9uIHRvIGFjY2VzcyBjb250YWN0IGRhdGEuCi0gKi8KLXB1YmxpYyBjbGFzcyBDb250YWN0SGVhZGVyV2lkZ2V0IGV4dGVuZHMgRnJhbWVMYXlvdXQgaW1wbGVtZW50cyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lciB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkNvbnRhY3RIZWFkZXJXaWRnZXQiOwotCi0gICAgcHJpdmF0ZSBUZXh0VmlldyBtRGlzcGxheU5hbWVWaWV3OwotICAgIHByaXZhdGUgVmlldyBtQWdncmVnYXRlQmFkZ2U7Ci0gICAgcHJpdmF0ZSBUZXh0VmlldyBtUGhvbmV0aWNOYW1lVmlldzsKLSAgICBwcml2YXRlIENoZWNrQm94IG1TdGFycmVkVmlldzsKLSAgICBwcml2YXRlIFF1aWNrQ29udGFjdEJhZGdlIG1QaG90b1ZpZXc7Ci0gICAgcHJpdmF0ZSBJbWFnZVZpZXcgbVByZXNlbmNlVmlldzsKLSAgICBwcml2YXRlIFRleHRWaWV3IG1TdGF0dXNWaWV3OwotICAgIHByaXZhdGUgVGV4dFZpZXcgbVN0YXR1c0F0dHJpYnV0aW9uVmlldzsKLSAgICBwcml2YXRlIGludCBtTm9QaG90b1Jlc291cmNlOwotICAgIHByaXZhdGUgUXVlcnlIYW5kbGVyIG1RdWVyeUhhbmRsZXI7Ci0KLSAgICBwcm90ZWN0ZWQgVXJpIG1Db250YWN0VXJpOwotCi0gICAgcHJvdGVjdGVkIFN0cmluZ1tdIG1FeGNsdWRlTWltZXMgPSBudWxsOwotCi0gICAgcHJvdGVjdGVkIENvbnRlbnRSZXNvbHZlciBtQ29udGVudFJlc29sdmVyOwotCi0gICAgLyoqCi0gICAgICogSW50ZXJmYWNlIGZvciBjYWxsYmFja3MgaW52b2tlZCB3aGVuIHRoZSB1c2VyIGludGVyYWN0cyB3aXRoIGEgaGVhZGVyLgotICAgICAqLwotICAgIHB1YmxpYyBpbnRlcmZhY2UgQ29udGFjdEhlYWRlckxpc3RlbmVyIHsKLSAgICAgICAgcHVibGljIHZvaWQgb25QaG90b0NsaWNrKFZpZXcgdmlldyk7Ci0gICAgICAgIHB1YmxpYyB2b2lkIG9uRGlzcGxheU5hbWVDbGljayhWaWV3IHZpZXcpOwotICAgIH0KLQotICAgIHByaXZhdGUgQ29udGFjdEhlYWRlckxpc3RlbmVyIG1MaXN0ZW5lcjsKLQotCi0gICAgcHJpdmF0ZSBpbnRlcmZhY2UgQ29udGFjdFF1ZXJ5IHsKLSAgICAgICAgLy9Qcm9qZWN0aW9uIHVzZWQgZm9yIHRoZSBzdW1tYXJ5IGluZm8gaW4gdGhlIGhlYWRlci4KLSAgICAgICAgU3RyaW5nW10gQ09MVU1OUyA9IG5ldyBTdHJpbmdbXSB7Ci0gICAgICAgICAgICBDb250YWN0cy5fSUQsCi0gICAgICAgICAgICBDb250YWN0cy5MT09LVVBfS0VZLAotICAgICAgICAgICAgQ29udGFjdHMuUEhPVE9fSUQsCi0gICAgICAgICAgICBDb250YWN0cy5ESVNQTEFZX05BTUUsCi0gICAgICAgICAgICBDb250YWN0cy5QSE9ORVRJQ19OQU1FLAotICAgICAgICAgICAgQ29udGFjdHMuU1RBUlJFRCwKLSAgICAgICAgICAgIENvbnRhY3RzLkNPTlRBQ1RfUFJFU0VOQ0UsCi0gICAgICAgICAgICBDb250YWN0cy5DT05UQUNUX1NUQVRVUywKLSAgICAgICAgICAgIENvbnRhY3RzLkNPTlRBQ1RfU1RBVFVTX1RJTUVTVEFNUCwKLSAgICAgICAgICAgIENvbnRhY3RzLkNPTlRBQ1RfU1RBVFVTX1JFU19QQUNLQUdFLAotICAgICAgICAgICAgQ29udGFjdHMuQ09OVEFDVF9TVEFUVVNfTEFCRUwsCi0gICAgICAgIH07Ci0gICAgICAgIGludCBfSUQgPSAwOwotICAgICAgICBpbnQgTE9PS1VQX0tFWSA9IDE7Ci0gICAgICAgIGludCBQSE9UT19JRCA9IDI7Ci0gICAgICAgIGludCBESVNQTEFZX05BTUUgPSAzOwotICAgICAgICBpbnQgUEhPTkVUSUNfTkFNRSA9IDQ7Ci0gICAgICAgIC8vVE9ETzogV2UgbmVlZCB0byBmaWd1cmUgb3V0IGhvdyB3ZSdyZSBnb2luZyB0byBnZXQgdGhlIHBob25ldGljIG5hbWUuCi0gICAgICAgIC8vc3RhdGljIGZpbmFsIGludCBIRUFERVJfUEhPTkVUSUNfTkFNRV9DT0xVTU5fSU5ERVgKLSAgICAgICAgaW50IFNUQVJSRUQgPSA1OwotICAgICAgICBpbnQgQ09OVEFDVF9QUkVTRU5DRV9TVEFUVVMgPSA2OwotICAgICAgICBpbnQgQ09OVEFDVF9TVEFUVVMgPSA3OwotICAgICAgICBpbnQgQ09OVEFDVF9TVEFUVVNfVElNRVNUQU1QID0gODsKLSAgICAgICAgaW50IENPTlRBQ1RfU1RBVFVTX1JFU19QQUNLQUdFID0gOTsKLSAgICAgICAgaW50IENPTlRBQ1RfU1RBVFVTX0xBQkVMID0gMTA7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBpbnRlcmZhY2UgUGhvdG9RdWVyeSB7Ci0gICAgICAgIFN0cmluZ1tdIENPTFVNTlMgPSBuZXcgU3RyaW5nW10gewotICAgICAgICAgICAgUGhvdG8uUEhPVE8KLSAgICAgICAgfTsKLQotICAgICAgICBpbnQgUEhPVE8gPSAwOwotICAgIH0KLQotICAgIC8vUHJvamVjdGlvbiB1c2VkIGZvciBsb29raW5nIHVwIGNvbnRhY3QgaWQgZnJvbSBwaG9uZSBudW1iZXIKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFBIT05FX0xPT0tVUF9QUk9KRUNUSU9OID0gbmV3IFN0cmluZ1tdIHsKLSAgICAgICAgUGhvbmVMb29rdXAuX0lELAotICAgICAgICBQaG9uZUxvb2t1cC5MT09LVVBfS0VZLAotICAgIH07Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgUEhPTkVfTE9PS1VQX0NPTlRBQ1RfSURfQ09MVU1OX0lOREVYID0gMDsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBQSE9ORV9MT09LVVBfQ09OVEFDVF9MT09LVVBfS0VZX0NPTFVNTl9JTkRFWCA9IDE7Ci0KLSAgICAvL1Byb2plY3Rpb24gdXNlZCBmb3IgbG9va2luZyB1cCBjb250YWN0IGlkIGZyb20gZW1haWwgYWRkcmVzcwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nW10gRU1BSUxfTE9PS1VQX1BST0pFQ1RJT04gPSBuZXcgU3RyaW5nW10gewotICAgICAgICBSYXdDb250YWN0cy5DT05UQUNUX0lELAotICAgICAgICBDb250YWN0cy5MT09LVVBfS0VZLAotICAgIH07Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgRU1BSUxfTE9PS1VQX0NPTlRBQ1RfSURfQ09MVU1OX0lOREVYID0gMDsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBFTUFJTF9MT09LVVBfQ09OVEFDVF9MT09LVVBfS0VZX0NPTFVNTl9JTkRFWCA9IDE7Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZ1tdIENPTlRBQ1RfTE9PS1VQX1BST0pFQ1RJT04gPSBuZXcgU3RyaW5nW10gewotICAgICAgICBDb250YWN0cy5fSUQsCi0gICAgfTsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBDT05UQUNUX0xPT0tVUF9JRF9DT0xVTU5fSU5ERVggPSAwOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRPS0VOX0NPTlRBQ1RfSU5GTyA9IDA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRPS0VOX1BIT05FX0xPT0tVUCA9IDE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRPS0VOX0VNQUlMX0xPT0tVUCA9IDI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRPS0VOX1BIT1RPX1FVRVJZID0gMzsKLQotICAgIHB1YmxpYyBDb250YWN0SGVhZGVyV2lkZ2V0KENvbnRleHQgY29udGV4dCkgewotICAgICAgICB0aGlzKGNvbnRleHQsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBDb250YWN0SGVhZGVyV2lkZ2V0KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7Ci0gICAgICAgIHRoaXMoY29udGV4dCwgYXR0cnMsIDApOwotICAgIH0KLQotICAgIHB1YmxpYyBDb250YWN0SGVhZGVyV2lkZ2V0KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzLCBpbnQgZGVmU3R5bGUpIHsKLSAgICAgICAgc3VwZXIoY29udGV4dCwgYXR0cnMsIGRlZlN0eWxlKTsKLQotICAgICAgICBtQ29udGVudFJlc29sdmVyID0gbUNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCk7Ci0KLSAgICAgICAgTGF5b3V0SW5mbGF0ZXIgaW5mbGF0ZXIgPQotICAgICAgICAgICAgKExheW91dEluZmxhdGVyKSBtQ29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuTEFZT1VUX0lORkxBVEVSX1NFUlZJQ0UpOwotICAgICAgICBpbmZsYXRlci5pbmZsYXRlKFIubGF5b3V0LmNvbnRhY3RfaGVhZGVyLCB0aGlzKTsKLQotICAgICAgICBtRGlzcGxheU5hbWVWaWV3ID0gKFRleHRWaWV3KSBmaW5kVmlld0J5SWQoUi5pZC5uYW1lKTsKLSAgICAgICAgbUFnZ3JlZ2F0ZUJhZGdlID0gZmluZFZpZXdCeUlkKFIuaWQuYWdncmVnYXRlX2JhZGdlKTsKLQotICAgICAgICBtUGhvbmV0aWNOYW1lVmlldyA9IChUZXh0VmlldykgZmluZFZpZXdCeUlkKFIuaWQucGhvbmV0aWNfbmFtZSk7Ci0KLSAgICAgICAgbVN0YXJyZWRWaWV3ID0gKENoZWNrQm94KWZpbmRWaWV3QnlJZChSLmlkLnN0YXIpOwotICAgICAgICBtU3RhcnJlZFZpZXcuc2V0T25DbGlja0xpc3RlbmVyKHRoaXMpOwotCi0gICAgICAgIG1QaG90b1ZpZXcgPSAoUXVpY2tDb250YWN0QmFkZ2UpIGZpbmRWaWV3QnlJZChSLmlkLnBob3RvKTsKLQotICAgICAgICBtUHJlc2VuY2VWaWV3ID0gKEltYWdlVmlldykgZmluZFZpZXdCeUlkKFIuaWQucHJlc2VuY2UpOwotCi0gICAgICAgIG1TdGF0dXNWaWV3ID0gKFRleHRWaWV3KWZpbmRWaWV3QnlJZChSLmlkLnN0YXR1cyk7Ci0gICAgICAgIG1TdGF0dXNBdHRyaWJ1dGlvblZpZXcgPSAoVGV4dFZpZXcpZmluZFZpZXdCeUlkKFIuaWQuc3RhdHVzX2RhdGUpOwotCi0gICAgICAgIC8vIFNldCB0aGUgcGhvdG8gd2l0aCBhIHJhbmRvbSAibm8gY29udGFjdCIgaW1hZ2UKLSAgICAgICAgbG9uZyBub3cgPSBTeXN0ZW1DbG9jay5lbGFwc2VkUmVhbHRpbWUoKTsKLSAgICAgICAgaW50IG51bSA9IChpbnQpIG5vdyAmIDB4ZjsKLSAgICAgICAgaWYgKG51bSA8IDkpIHsKLSAgICAgICAgICAgIC8vIExlYW5pbmcgaW4gZnJvbSByaWdodCwgY29tbW9uCi0gICAgICAgICAgICBtTm9QaG90b1Jlc291cmNlID0gUi5kcmF3YWJsZS5pY19jb250YWN0X3BpY3R1cmU7Ci0gICAgICAgIH0gZWxzZSBpZiAobnVtIDwgMTQpIHsKLSAgICAgICAgICAgIC8vIExlYW5pbmcgaW4gZnJvbSBsZWZ0IHVuY29tbW9uCi0gICAgICAgICAgICBtTm9QaG90b1Jlc291cmNlID0gUi5kcmF3YWJsZS5pY19jb250YWN0X3BpY3R1cmVfMjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIENvbWluZyBpbiBmcm9tIHRoZSB0b3AsIHJhcmUKLSAgICAgICAgICAgIG1Ob1Bob3RvUmVzb3VyY2UgPSBSLmRyYXdhYmxlLmljX2NvbnRhY3RfcGljdHVyZV8zOwotICAgICAgICB9Ci0KLSAgICAgICAgcmVzZXRBc3luY1F1ZXJ5SGFuZGxlcigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGVuYWJsZUNsaWNrTGlzdGVuZXJzKCkgewotICAgICAgICBtRGlzcGxheU5hbWVWaWV3LnNldE9uQ2xpY2tMaXN0ZW5lcih0aGlzKTsKLSAgICAgICAgbVBob3RvVmlldy5zZXRPbkNsaWNrTGlzdGVuZXIodGhpcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBnaXZlbiB7QGxpbmsgQ29udGFjdEhlYWRlckxpc3RlbmVyfSB0byBoYW5kbGUgaGVhZGVyIGV2ZW50cy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDb250YWN0SGVhZGVyTGlzdGVuZXIoQ29udGFjdEhlYWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0gICAgICAgIG1MaXN0ZW5lciA9IGxpc3RlbmVyOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBwZXJmb3JtUGhvdG9DbGljaygpIHsKLSAgICAgICAgaWYgKG1MaXN0ZW5lciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtTGlzdGVuZXIub25QaG90b0NsaWNrKG1QaG90b1ZpZXcpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHBlcmZvcm1EaXNwbGF5TmFtZUNsaWNrKCkgewotICAgICAgICBpZiAobUxpc3RlbmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1MaXN0ZW5lci5vbkRpc3BsYXlOYW1lQ2xpY2sobURpc3BsYXlOYW1lVmlldyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGNsYXNzIFF1ZXJ5SGFuZGxlciBleHRlbmRzIEFzeW5jUXVlcnlIYW5kbGVyIHsKLQotICAgICAgICBwdWJsaWMgUXVlcnlIYW5kbGVyKENvbnRlbnRSZXNvbHZlciBjcikgewotICAgICAgICAgICAgc3VwZXIoY3IpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIG9uUXVlcnlDb21wbGV0ZShpbnQgdG9rZW4sIE9iamVjdCBjb29raWUsIEN1cnNvciBjdXJzb3IpIHsKLSAgICAgICAgICAgIHRyeXsKLSAgICAgICAgICAgICAgICBpZiAodGhpcyAhPSBtUXVlcnlIYW5kbGVyKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIm9uUXVlcnlDb21wbGV0ZTogZGlzY2FyZCByZXN1bHQsIHRoZSBxdWVyeSBoYW5kbGVyIGlzIHJlc2V0ISIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgc3dpdGNoICh0b2tlbikgewotICAgICAgICAgICAgICAgICAgICBjYXNlIFRPS0VOX1BIT1RPX1FVRVJZOiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvL1NldCB0aGUgcGhvdG8KLSAgICAgICAgICAgICAgICAgICAgICAgIEJpdG1hcCBwaG90b0JpdG1hcCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3Vyc29yICE9IG51bGwgJiYgY3Vyc29yLm1vdmVUb0ZpcnN0KCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgIWN1cnNvci5pc051bGwoUGhvdG9RdWVyeS5QSE9UTykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlW10gcGhvdG9EYXRhID0gY3Vyc29yLmdldEJsb2IoUGhvdG9RdWVyeS5QSE9UTyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGhvdG9CaXRtYXAgPSBCaXRtYXBGYWN0b3J5LmRlY29kZUJ5dGVBcnJheShwaG90b0RhdGEsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaG90b0RhdGEubGVuZ3RoLCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBob3RvQml0bWFwID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaG90b0JpdG1hcCA9IGxvYWRQbGFjZWhvbGRlclBob3RvKG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgbVBob3RvVmlldy5zZXRJbWFnZUJpdG1hcChwaG90b0JpdG1hcCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29va2llICE9IG51bGwgJiYgY29va2llIGluc3RhbmNlb2YgVXJpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBob3RvVmlldy5hc3NpZ25Db250YWN0VXJpKChVcmkpIGNvb2tpZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjYXNlIFRPS0VOX0NPTlRBQ1RfSU5GTzogewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnNvciAhPSBudWxsICYmIGN1cnNvci5tb3ZlVG9GaXJzdCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZENvbnRhY3RJbmZvKGN1cnNvcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVXJpIGxvb2t1cFVyaSA9IENvbnRhY3RzLmdldExvb2t1cFVyaShjdXJzb3IuZ2V0TG9uZyhDb250YWN0UXVlcnkuX0lEKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnNvci5nZXRTdHJpbmcoQ29udGFjdFF1ZXJ5LkxPT0tVUF9LRVkpKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGxvbmcgcGhvdG9JZCA9IGN1cnNvci5nZXRMb25nKENvbnRhY3RRdWVyeS5QSE9UT19JRCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGhvdG9JZCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QaG90b1ZpZXcuc2V0SW1hZ2VCaXRtYXAobG9hZFBsYWNlaG9sZGVyUGhvdG8obnVsbCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29va2llICE9IG51bGwgJiYgY29va2llIGluc3RhbmNlb2YgVXJpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUGhvdG9WaWV3LmFzc2lnbkNvbnRhY3RVcmkoKFVyaSkgY29va2llKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRQaG90b1F1ZXJ5KHBob3RvSWQsIGxvb2t1cFVyaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKiBkb24ndCByZXNldCBxdWVyeSBoYW5kbGVyICovKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNob3VsZG4ndCByZWFsbHkgaGFwcGVuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0RGlzcGxheU5hbWUobnVsbCwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0U29jaWFsU25pcHBldChudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRQaG90byhsb2FkUGxhY2Vob2xkZXJQaG90byhudWxsKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjYXNlIFRPS0VOX1BIT05FX0xPT0tVUDogewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnNvciAhPSBudWxsICYmIGN1cnNvci5tb3ZlVG9GaXJzdCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBjb250YWN0SWQgPSBjdXJzb3IuZ2V0TG9uZyhQSE9ORV9MT09LVVBfQ09OVEFDVF9JRF9DT0xVTU5fSU5ERVgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsb29rdXBLZXkgPSBjdXJzb3IuZ2V0U3RyaW5nKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEhPTkVfTE9PS1VQX0NPTlRBQ1RfTE9PS1VQX0tFWV9DT0xVTU5fSU5ERVgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRGcm9tQ29udGFjdFVyaUludGVybmFsKENvbnRhY3RzLmdldExvb2t1cFVyaShjb250YWN0SWQsIGxvb2t1cEtleSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKiBkb24ndCByZXNldCBxdWVyeSBoYW5kbGVyICovKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBob25lTnVtYmVyID0gKFN0cmluZykgY29va2llOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldERpc3BsYXlOYW1lKHBob25lTnVtYmVyLCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTb2NpYWxTbmlwcGV0KG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFBob3RvKGxvYWRQbGFjZWhvbGRlclBob3RvKG51bGwpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUGhvdG9WaWV3LmFzc2lnbkNvbnRhY3RGcm9tUGhvbmUocGhvbmVOdW1iZXIsIHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBUT0tFTl9FTUFJTF9MT09LVVA6IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJzb3IgIT0gbnVsbCAmJiBjdXJzb3IubW92ZVRvRmlyc3QoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgY29udGFjdElkID0gY3Vyc29yLmdldExvbmcoRU1BSUxfTE9PS1VQX0NPTlRBQ1RfSURfQ09MVU1OX0lOREVYKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbG9va3VwS2V5ID0gY3Vyc29yLmdldFN0cmluZygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVNQUlMX0xPT0tVUF9DT05UQUNUX0xPT0tVUF9LRVlfQ09MVU1OX0lOREVYKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kRnJvbUNvbnRhY3RVcmlJbnRlcm5hbChDb250YWN0cy5nZXRMb29rdXBVcmkoY29udGFjdElkLCBsb29rdXBLZXkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgLyogZG9uJ3QgcmVzZXQgcXVlcnkgaGFuZGxlciAqLyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBlbWFpbEFkZHJlc3MgPSAoU3RyaW5nKSBjb29raWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0RGlzcGxheU5hbWUoZW1haWxBZGRyZXNzLCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTb2NpYWxTbmlwcGV0KG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFBob3RvKGxvYWRQbGFjZWhvbGRlclBob3RvKG51bGwpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUGhvdG9WaWV3LmFzc2lnbkNvbnRhY3RGcm9tRW1haWwoZW1haWxBZGRyZXNzLCB0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICBpZiAoY3Vyc29yICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgY3Vyc29yLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVHVybiBvbi9vZmYgc2hvd2luZyBvZiB0aGUgYWdncmVnYXRlIGJhZGdlIGVsZW1lbnQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2hvd0FnZ3JlZ2F0ZUJhZGdlKGJvb2xlYW4gc2hvd0JhZ2RlKSB7Ci0gICAgICAgIG1BZ2dyZWdhdGVCYWRnZS5zZXRWaXNpYmlsaXR5KHNob3dCYWdkZSA/IFZpZXcuVklTSUJMRSA6IFZpZXcuR09ORSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVHVybiBvbi9vZmYgc2hvd2luZyBvZiB0aGUgc3RhciBlbGVtZW50LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNob3dTdGFyKGJvb2xlYW4gc2hvd1N0YXIpIHsKLSAgICAgICAgbVN0YXJyZWRWaWV3LnNldFZpc2liaWxpdHkoc2hvd1N0YXIgPyBWaWV3LlZJU0lCTEUgOiBWaWV3LkdPTkUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1hbnVhbGx5IHNldCB0aGUgc3RhcnJlZCBzdGF0ZSBvZiB0aGlzIGhlYWRlciB3aWRnZXQuIFRoaXMgZG9lc24ndCBjaGFuZ2UKLSAgICAgKiB0aGUgdW5kZXJseWluZyB7QGxpbmsgQ29udGFjdHN9IHZhbHVlLCBvbmx5IHRoZSBVSSBzdGF0ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTdGFyZWQoYm9vbGVhbiBzdGFycmVkKSB7Ci0gICAgICAgIG1TdGFycmVkVmlldy5zZXRDaGVja2VkKHN0YXJyZWQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1hbnVhbGx5IHNldCB0aGUgcHJlc2VuY2UuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UHJlc2VuY2UoaW50IHByZXNlbmNlKSB7Ci0gICAgICAgIG1QcmVzZW5jZVZpZXcuc2V0SW1hZ2VSZXNvdXJjZShTdGF0dXNVcGRhdGVzLmdldFByZXNlbmNlSWNvblJlc291cmNlSWQocHJlc2VuY2UpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNYW51YWxseSBzZXQgdGhlIGNvbnRhY3QgdXJpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q29udGFjdFVyaShVcmkgdXJpKSB7Ci0gICAgICAgIHNldENvbnRhY3RVcmkodXJpLCB0cnVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNYW51YWxseSBzZXQgdGhlIGNvbnRhY3QgdXJpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q29udGFjdFVyaShVcmkgdXJpLCBib29sZWFuIHNlbmRUb0Zhc3RyYWNrKSB7Ci0gICAgICAgIG1Db250YWN0VXJpID0gdXJpOwotICAgICAgICBpZiAoc2VuZFRvRmFzdHJhY2spIHsKLSAgICAgICAgICAgIG1QaG90b1ZpZXcuYXNzaWduQ29udGFjdFVyaSh1cmkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTWFudWFsbHkgc2V0IHRoZSBwaG90byB0byBkaXNwbGF5IGluIHRoZSBoZWFkZXIuIFRoaXMgZG9lc24ndCBjaGFuZ2UgdGhlCi0gICAgICogdW5kZXJseWluZyB7QGxpbmsgQ29udGFjdHN9LCBvbmx5IHRoZSBVSSBzdGF0ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQaG90byhCaXRtYXAgYml0bWFwKSB7Ci0gICAgICAgIG1QaG90b1ZpZXcuc2V0SW1hZ2VCaXRtYXAoYml0bWFwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNYW51YWxseSBzZXQgdGhlIGRpc3BsYXkgbmFtZSBhbmQgcGhvbmV0aWMgbmFtZSB0byBzaG93IGluIHRoZSBoZWFkZXIuCi0gICAgICogVGhpcyBkb2Vzbid0IGNoYW5nZSB0aGUgdW5kZXJseWluZyB7QGxpbmsgQ29udGFjdHN9LCBvbmx5IHRoZSBVSSBzdGF0ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXREaXNwbGF5TmFtZShDaGFyU2VxdWVuY2UgZGlzcGxheU5hbWUsIENoYXJTZXF1ZW5jZSBwaG9uZXRpY05hbWUpIHsKLSAgICAgICAgbURpc3BsYXlOYW1lVmlldy5zZXRUZXh0KGRpc3BsYXlOYW1lKTsKLSAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShwaG9uZXRpY05hbWUpKSB7Ci0gICAgICAgICAgICBtUGhvbmV0aWNOYW1lVmlldy5zZXRUZXh0KHBob25ldGljTmFtZSk7Ci0gICAgICAgICAgICBtUGhvbmV0aWNOYW1lVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtUGhvbmV0aWNOYW1lVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNYW51YWxseSBzZXQgdGhlIHNvY2lhbCBzbmlwcGV0IHRleHQgdG8gZGlzcGxheSBpbiB0aGUgaGVhZGVyLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFNvY2lhbFNuaXBwZXQoQ2hhclNlcXVlbmNlIHNuaXBwZXQpIHsKLSAgICAgICAgaWYgKHNuaXBwZXQgPT0gbnVsbCkgewotICAgICAgICAgICAgbVN0YXR1c1ZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICAgICAgbVN0YXR1c0F0dHJpYnV0aW9uVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtU3RhdHVzVmlldy5zZXRUZXh0KHNuaXBwZXQpOwotICAgICAgICAgICAgbVN0YXR1c1ZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IGEgbGlzdCBvZiBzcGVjaWZpYyBNSU1FLXR5cGVzIHRvIGV4Y2x1ZGUgYW5kIG5vdCBkaXNwbGF5LiBGb3IKLSAgICAgKiBleGFtcGxlLCB0aGlzIGNhbiBiZSB1c2VkIHRvIGhpZGUgdGhlIHtAbGluayBDb250YWN0cyNDT05URU5UX0lURU1fVFlQRX0KLSAgICAgKiBwcm9maWxlIGljb24uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RXhjbHVkZU1pbWVzKFN0cmluZ1tdIGV4Y2x1ZGVNaW1lcykgewotICAgICAgICBtRXhjbHVkZU1pbWVzID0gZXhjbHVkZU1pbWVzOwotICAgICAgICBtUGhvdG9WaWV3LnNldEV4Y2x1ZGVNaW1lcyhleGNsdWRlTWltZXMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlbmllbmNlIG1ldGhvZCBmb3IgYmluZGluZyBhbGwgYXZhaWxhYmxlIGRhdGEgZnJvbSBhbiBleGlzdGluZwotICAgICAqIGNvbnRhY3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29udGFjdExvb2t1cFVyaSBhIHtDb250YWN0cy5DT05URU5UX0xPT0tVUF9VUkl9IHN0eWxlIFVSSS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBiaW5kRnJvbUNvbnRhY3RMb29rdXBVcmkoVXJpIGNvbnRhY3RMb29rdXBVcmkpIHsKLSAgICAgICAgYmluZEZyb21Db250YWN0VXJpSW50ZXJuYWwoY29udGFjdExvb2t1cFVyaSwgdHJ1ZSAvKiByZXNldCBxdWVyeSBoYW5kbGVyICovKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QgZm9yIGJpbmRpbmcgYWxsIGF2YWlsYWJsZSBkYXRhIGZyb20gYW4gZXhpc3RpbmcKLSAgICAgKiBjb250YWN0LgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbnRhY3RVcmkgYSB7Q29udGFjdHMuQ09OVEVOVF9VUkl9IHN0eWxlIFVSSS4KLSAgICAgKiBAcGFyYW0gcmVzZXRRdWVyeUhhbmRsZXIgd2hldGhlciB0byB1c2UgYSBuZXcgQXN5bmNRdWVyeUhhbmRsZXIgb3Igbm90LgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBiaW5kRnJvbUNvbnRhY3RVcmlJbnRlcm5hbChVcmkgY29udGFjdFVyaSwgYm9vbGVhbiByZXNldFF1ZXJ5SGFuZGxlcikgewotICAgICAgICBtQ29udGFjdFVyaSA9IGNvbnRhY3RVcmk7Ci0gICAgICAgIHN0YXJ0Q29udGFjdFF1ZXJ5KGNvbnRhY3RVcmksIHJlc2V0UXVlcnlIYW5kbGVyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QgZm9yIGJpbmRpbmcgYWxsIGF2YWlsYWJsZSBkYXRhIGZyb20gYW4gZXhpc3RpbmcKLSAgICAgKiBjb250YWN0LgotICAgICAqCi0gICAgICogQHBhcmFtIGVtYWlsQWRkcmVzcyBUaGUgZW1haWwgYWRkcmVzcyB1c2VkIHRvIGRvIGEgcmV2ZXJzZSBsb29rdXAgaW4KLSAgICAgKiB0aGUgY29udGFjdHMgZGF0YWJhc2UuIElmIG1vcmUgdGhhbiBvbmUgY29udGFjdCBjb250YWlucyB0aGlzIGVtYWlsCi0gICAgICogYWRkcmVzcywgb25lIG9mIHRoZW0gd2lsbCBiZSBjaG9zZW4gdG8gYmluZCB0by4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBiaW5kRnJvbUVtYWlsKFN0cmluZyBlbWFpbEFkZHJlc3MpIHsKLSAgICAgICAgcmVzZXRBc3luY1F1ZXJ5SGFuZGxlcigpOwotCi0gICAgICAgIG1RdWVyeUhhbmRsZXIuc3RhcnRRdWVyeShUT0tFTl9FTUFJTF9MT09LVVAsIGVtYWlsQWRkcmVzcywKLSAgICAgICAgICAgICAgICBVcmkud2l0aEFwcGVuZGVkUGF0aChFbWFpbC5DT05URU5UX0xPT0tVUF9VUkksIFVyaS5lbmNvZGUoZW1haWxBZGRyZXNzKSksCi0gICAgICAgICAgICAgICAgRU1BSUxfTE9PS1VQX1BST0pFQ1RJT04sIG51bGwsIG51bGwsIG51bGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlbmllbmNlIG1ldGhvZCBmb3IgYmluZGluZyBhbGwgYXZhaWxhYmxlIGRhdGEgZnJvbSBhbiBleGlzdGluZwotICAgICAqIGNvbnRhY3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbnVtYmVyIFRoZSBwaG9uZSBudW1iZXIgdXNlZCB0byBkbyBhIHJldmVyc2UgbG9va3VwIGluCi0gICAgICogdGhlIGNvbnRhY3RzIGRhdGFiYXNlLiBJZiBtb3JlIHRoYW4gb25lIGNvbnRhY3QgY29udGFpbnMgdGhpcyBwaG9uZQotICAgICAqIG51bWJlciwgb25lIG9mIHRoZW0gd2lsbCBiZSBjaG9zZW4gdG8gYmluZCB0by4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBiaW5kRnJvbVBob25lTnVtYmVyKFN0cmluZyBudW1iZXIpIHsKLSAgICAgICAgcmVzZXRBc3luY1F1ZXJ5SGFuZGxlcigpOwotCi0gICAgICAgIG1RdWVyeUhhbmRsZXIuc3RhcnRRdWVyeShUT0tFTl9QSE9ORV9MT09LVVAsIG51bWJlciwKLSAgICAgICAgICAgICAgICBVcmkud2l0aEFwcGVuZGVkUGF0aChQaG9uZUxvb2t1cC5DT05URU5UX0ZJTFRFUl9VUkksIFVyaS5lbmNvZGUobnVtYmVyKSksCi0gICAgICAgICAgICAgICAgUEhPTkVfTE9PS1VQX1BST0pFQ1RJT04sIG51bGwsIG51bGwsIG51bGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHN0YXJ0Q29udGFjdFF1ZXJ5Ci0gICAgICoKLSAgICAgKiBpbnRlcm5hbCBtZXRob2QgdG8gcXVlcnkgY29udGFjdCBieSBVcmkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29udGFjdFVyaSB0aGUgY29udGFjdCB1cmkKLSAgICAgKiBAcGFyYW0gcmVzZXRRdWVyeUhhbmRsZXIgd2hldGhlciB0byB1c2UgYSBuZXcgQXN5bmNRdWVyeUhhbmRsZXIgb3Igbm90Ci0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHN0YXJ0Q29udGFjdFF1ZXJ5KFVyaSBjb250YWN0VXJpLCBib29sZWFuIHJlc2V0UXVlcnlIYW5kbGVyKSB7Ci0gICAgICAgIGlmIChyZXNldFF1ZXJ5SGFuZGxlcikgewotICAgICAgICAgICAgcmVzZXRBc3luY1F1ZXJ5SGFuZGxlcigpOwotICAgICAgICB9Ci0KLSAgICAgICAgbVF1ZXJ5SGFuZGxlci5zdGFydFF1ZXJ5KFRPS0VOX0NPTlRBQ1RfSU5GTywgY29udGFjdFVyaSwgY29udGFjdFVyaSwgQ29udGFjdFF1ZXJ5LkNPTFVNTlMsCi0gICAgICAgICAgICAgICAgbnVsbCwgbnVsbCwgbnVsbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogc3RhcnRQaG90b1F1ZXJ5Ci0gICAgICoKLSAgICAgKiBpbnRlcm5hbCBtZXRob2QgdG8gcXVlcnkgY29udGFjdCBwaG90byBieSBwaG90byBpZCBhbmQgdXJpLgotICAgICAqCi0gICAgICogQHBhcmFtIHBob3RvSWQgdGhlIHBob3RvIGlkLgotICAgICAqIEBwYXJhbSBsb29rdXBLZXkgdGhlIGxvb2t1cCB1cmkuCi0gICAgICogQHBhcmFtIHJlc2V0UXVlcnlIYW5kbGVyIHdoZXRoZXIgdG8gdXNlIGEgbmV3IEFzeW5jUXVlcnlIYW5kbGVyIG9yIG5vdC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBzdGFydFBob3RvUXVlcnkobG9uZyBwaG90b0lkLCBVcmkgbG9va3VwS2V5LCBib29sZWFuIHJlc2V0UXVlcnlIYW5kbGVyKSB7Ci0gICAgICAgIGlmIChyZXNldFF1ZXJ5SGFuZGxlcikgewotICAgICAgICAgICAgcmVzZXRBc3luY1F1ZXJ5SGFuZGxlcigpOwotICAgICAgICB9Ci0KLSAgICAgICAgbVF1ZXJ5SGFuZGxlci5zdGFydFF1ZXJ5KFRPS0VOX1BIT1RPX1FVRVJZLCBsb29rdXBLZXksCi0gICAgICAgICAgICAgICAgQ29udGVudFVyaXMud2l0aEFwcGVuZGVkSWQoRGF0YS5DT05URU5UX1VSSSwgcGhvdG9JZCksIFBob3RvUXVlcnkuQ09MVU1OUywKLSAgICAgICAgICAgICAgICBudWxsLCBudWxsLCBudWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNZXRob2QgdG8gZm9yY2UgdGhpcyB3aWRnZXQgdG8gZm9yZ2V0IGV2ZXJ5dGhpbmcgaXQga25vd3MgYWJvdXQgdGhlIGNvbnRhY3QuCi0gICAgICogV2UgbmVlZCB0byBzdG9wIGFueSBleGlzdGluZyBhc3luYyBxdWVyaWVzIGZvciBwaG9uZSwgZW1haWwsIGNvbnRhY3QsIGFuZCBwaG90b3MuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgd2lwZUNsZWFuKCkgewotICAgICAgICByZXNldEFzeW5jUXVlcnlIYW5kbGVyKCk7Ci0KLSAgICAgICAgc2V0RGlzcGxheU5hbWUobnVsbCwgbnVsbCk7Ci0gICAgICAgIHNldFBob3RvKGxvYWRQbGFjZWhvbGRlclBob3RvKG51bGwpKTsKLSAgICAgICAgc2V0U29jaWFsU25pcHBldChudWxsKTsKLSAgICAgICAgc2V0UHJlc2VuY2UoMCk7Ci0gICAgICAgIG1Db250YWN0VXJpID0gbnVsbDsKLSAgICAgICAgbUV4Y2x1ZGVNaW1lcyA9IG51bGw7Ci0gICAgfQotCi0KLSAgICBwcml2YXRlIHZvaWQgcmVzZXRBc3luY1F1ZXJ5SGFuZGxlcigpIHsKLSAgICAgICAgLy8gdGhlIGFwaSBBc3luY1F1ZXJ5SGFuZGxlci5jYW5jZWxPcGVyYXRpb24oKSBkb2Vzbid0IHJlYWxseSB3b3JrLiBTaW5jZSB3ZSByZWFsbHkKLSAgICAgICAgLy8gbmVlZCB0aGUgb2xkIGFzeW5jIHF1ZXJpZXMgdG8gYmUgY2FuY2VsbGVkLCBsZXQncyBkbyBpdCB0aGUgaGFyZCB3YXkuCi0gICAgICAgIG1RdWVyeUhhbmRsZXIgPSBuZXcgUXVlcnlIYW5kbGVyKG1Db250ZW50UmVzb2x2ZXIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEJpbmQgdGhlIGNvbnRhY3QgZGV0YWlscyBwcm92aWRlZCBieSB0aGUgZ2l2ZW4ge0BsaW5rIEN1cnNvcn0uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgYmluZENvbnRhY3RJbmZvKEN1cnNvciBjKSB7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBkaXNwbGF5TmFtZSA9IGMuZ2V0U3RyaW5nKENvbnRhY3RRdWVyeS5ESVNQTEFZX05BTUUpOwotICAgICAgICBmaW5hbCBTdHJpbmcgcGhvbmV0aWNOYW1lID0gYy5nZXRTdHJpbmcoQ29udGFjdFF1ZXJ5LlBIT05FVElDX05BTUUpOwotICAgICAgICB0aGlzLnNldERpc3BsYXlOYW1lKGRpc3BsYXlOYW1lLCBwaG9uZXRpY05hbWUpOwotCi0gICAgICAgIGZpbmFsIGJvb2xlYW4gc3RhcnJlZCA9IGMuZ2V0SW50KENvbnRhY3RRdWVyeS5TVEFSUkVEKSAhPSAwOwotICAgICAgICBtU3RhcnJlZFZpZXcuc2V0Q2hlY2tlZChzdGFycmVkKTsKLQotICAgICAgICAvL1NldCB0aGUgcHJlc2VuY2Ugc3RhdHVzCi0gICAgICAgIGlmICghYy5pc051bGwoQ29udGFjdFF1ZXJ5LkNPTlRBQ1RfUFJFU0VOQ0VfU1RBVFVTKSkgewotICAgICAgICAgICAgaW50IHByZXNlbmNlID0gYy5nZXRJbnQoQ29udGFjdFF1ZXJ5LkNPTlRBQ1RfUFJFU0VOQ0VfU1RBVFVTKTsKLSAgICAgICAgICAgIG1QcmVzZW5jZVZpZXcuc2V0SW1hZ2VSZXNvdXJjZShTdGF0dXNVcGRhdGVzLmdldFByZXNlbmNlSWNvblJlc291cmNlSWQocHJlc2VuY2UpKTsKLSAgICAgICAgICAgIG1QcmVzZW5jZVZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbVByZXNlbmNlVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvL1NldCB0aGUgc3RhdHVzIHVwZGF0ZQotICAgICAgICBTdHJpbmcgc3RhdHVzID0gYy5nZXRTdHJpbmcoQ29udGFjdFF1ZXJ5LkNPTlRBQ1RfU1RBVFVTKTsKLSAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShzdGF0dXMpKSB7Ci0gICAgICAgICAgICBtU3RhdHVzVmlldy5zZXRUZXh0KHN0YXR1cyk7Ci0gICAgICAgICAgICBtU3RhdHVzVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0KLSAgICAgICAgICAgIENoYXJTZXF1ZW5jZSB0aW1lc3RhbXAgPSBudWxsOwotCi0gICAgICAgICAgICBpZiAoIWMuaXNOdWxsKENvbnRhY3RRdWVyeS5DT05UQUNUX1NUQVRVU19USU1FU1RBTVApKSB7Ci0gICAgICAgICAgICAgICAgbG9uZyBkYXRlID0gYy5nZXRMb25nKENvbnRhY3RRdWVyeS5DT05UQUNUX1NUQVRVU19USU1FU1RBTVApOwotCi0gICAgICAgICAgICAgICAgLy8gU2V0IHRoZSBkYXRlL3RpbWUgZmllbGQgYnkgbWl4aW5nIHJlbGF0aXZlIGFuZCBhYnNvbHV0ZQotICAgICAgICAgICAgICAgIC8vIHRpbWVzLgotICAgICAgICAgICAgICAgIGludCBmbGFncyA9IERhdGVVdGlscy5GT1JNQVRfQUJCUkVWX1JFTEFUSVZFOwotCi0gICAgICAgICAgICAgICAgdGltZXN0YW1wID0gRGF0ZVV0aWxzLmdldFJlbGF0aXZlVGltZVNwYW5TdHJpbmcoZGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpLCBEYXRlVXRpbHMuTUlOVVRFX0lOX01JTExJUywgZmxhZ3MpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBTdHJpbmcgbGFiZWwgPSBudWxsOwotCi0gICAgICAgICAgICBpZiAoIWMuaXNOdWxsKENvbnRhY3RRdWVyeS5DT05UQUNUX1NUQVRVU19MQUJFTCkpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcmVzUGFja2FnZSA9IGMuZ2V0U3RyaW5nKENvbnRhY3RRdWVyeS5DT05UQUNUX1NUQVRVU19SRVNfUEFDS0FHRSk7Ci0gICAgICAgICAgICAgICAgaW50IGxhYmVsUmVzb3VyY2UgPSBjLmdldEludChDb250YWN0UXVlcnkuQ09OVEFDVF9TVEFUVVNfTEFCRUwpOwotICAgICAgICAgICAgICAgIFJlc291cmNlcyByZXNvdXJjZXM7Ci0gICAgICAgICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHJlc1BhY2thZ2UpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc291cmNlcyA9IGdldFJlc291cmNlcygpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIFBhY2thZ2VNYW5hZ2VyIHBtID0gZ2V0Q29udGV4dCgpLmdldFBhY2thZ2VNYW5hZ2VyKCk7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZXMgPSBwbS5nZXRSZXNvdXJjZXNGb3JBcHBsaWNhdGlvbihyZXNQYWNrYWdlKTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoTmFtZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNvbnRhY3Qgc3RhdHVzIHVwZGF0ZSByZXNvdXJjZSBwYWNrYWdlIG5vdCBmb3VuZDogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHJlc1BhY2thZ2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChyZXNvdXJjZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSByZXNvdXJjZXMuZ2V0U3RyaW5nKGxhYmVsUmVzb3VyY2UpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDb250YWN0IHN0YXR1cyB1cGRhdGUgcmVzb3VyY2Ugbm90IGZvdW5kOiAiICsgcmVzUGFja2FnZSArICJAIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGxhYmVsUmVzb3VyY2UpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBDaGFyU2VxdWVuY2UgYXR0cmlidXRpb247Ci0gICAgICAgICAgICBpZiAodGltZXN0YW1wICE9IG51bGwgJiYgbGFiZWwgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGF0dHJpYnV0aW9uID0gZ2V0Q29udGV4dCgpLmdldFN0cmluZygKLSAgICAgICAgICAgICAgICAgICAgICAgIFIuc3RyaW5nLmNvbnRhY3Rfc3RhdHVzX3VwZGF0ZV9hdHRyaWJ1dGlvbl93aXRoX2RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAsIGxhYmVsKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAodGltZXN0YW1wID09IG51bGwgJiYgbGFiZWwgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGF0dHJpYnV0aW9uID0gZ2V0Q29udGV4dCgpLmdldFN0cmluZygKLSAgICAgICAgICAgICAgICAgICAgICAgIFIuc3RyaW5nLmNvbnRhY3Rfc3RhdHVzX3VwZGF0ZV9hdHRyaWJ1dGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAodGltZXN0YW1wICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBhdHRyaWJ1dGlvbiA9IHRpbWVzdGFtcDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYXR0cmlidXRpb24gPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGF0dHJpYnV0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtU3RhdHVzQXR0cmlidXRpb25WaWV3LnNldFRleHQoYXR0cmlidXRpb24pOwotICAgICAgICAgICAgICAgIG1TdGF0dXNBdHRyaWJ1dGlvblZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtU3RhdHVzQXR0cmlidXRpb25WaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1TdGF0dXNWaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgICAgIG1TdGF0dXNBdHRyaWJ1dGlvblZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHZpZXcpIHsKLSAgICAgICAgc3dpdGNoICh2aWV3LmdldElkKCkpIHsKLSAgICAgICAgICAgIGNhc2UgUi5pZC5zdGFyOiB7Ci0gICAgICAgICAgICAgICAgLy8gVG9nZ2xlICJzdGFycmVkIiBzdGF0ZQotICAgICAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGVyZSBpcyBhIGNvbnRhY3QKLSAgICAgICAgICAgICAgICBpZiAobUNvbnRhY3RVcmkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBDb250ZW50VmFsdWVzIHZhbHVlcyA9IG5ldyBDb250ZW50VmFsdWVzKDEpOwotICAgICAgICAgICAgICAgICAgICB2YWx1ZXMucHV0KENvbnRhY3RzLlNUQVJSRUQsIG1TdGFycmVkVmlldy5pc0NoZWNrZWQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIG1Db250ZW50UmVzb2x2ZXIudXBkYXRlKG1Db250YWN0VXJpLCB2YWx1ZXMsIG51bGwsIG51bGwpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgUi5pZC5waG90bzogewotICAgICAgICAgICAgICAgIHBlcmZvcm1QaG90b0NsaWNrKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIFIuaWQubmFtZTogewotICAgICAgICAgICAgICAgIHBlcmZvcm1EaXNwbGF5TmFtZUNsaWNrKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIEJpdG1hcCBsb2FkUGxhY2Vob2xkZXJQaG90byhCaXRtYXBGYWN0b3J5Lk9wdGlvbnMgb3B0aW9ucykgewotICAgICAgICBpZiAobU5vUGhvdG9SZXNvdXJjZSA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gQml0bWFwRmFjdG9yeS5kZWNvZGVSZXNvdXJjZShtQ29udGV4dC5nZXRSZXNvdXJjZXMoKSwKLSAgICAgICAgICAgICAgICBtTm9QaG90b1Jlc291cmNlLCBvcHRpb25zKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L0RpZ2l0YWxDbG9jay5qYXZhIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9EaWdpdGFsQ2xvY2suamF2YQppbmRleCBmYTQ3ZmY2Li4yM2UyMjc3IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L0RpZ2l0YWxDbG9jay5qYXZhCisrKyBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvRGlnaXRhbENsb2NrLmphdmEKQEAgLTMwLDcgKzMwLDcgQEAKIGltcG9ydCBhbmRyb2lkLnRleHQuZm9ybWF0LkRhdGVGb3JtYXQ7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5MaW5lYXJMYXlvdXQ7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuUmVsYXRpdmVMYXlvdXQ7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7CiAKIGltcG9ydCBqYXZhLnRleHQuRGF0ZUZvcm1hdFN5bWJvbHM7CkBAIC0zOSw3ICszOSw3IEBACiAvKioKICAqIERpc3BsYXlzIHRoZSB0aW1lCiAgKi8KLXB1YmxpYyBjbGFzcyBEaWdpdGFsQ2xvY2sgZXh0ZW5kcyBMaW5lYXJMYXlvdXQgeworcHVibGljIGNsYXNzIERpZ2l0YWxDbG9jayBleHRlbmRzIFJlbGF0aXZlTGF5b3V0IHsKIAogICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBNMTIgPSAiaDptbSI7CiAgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIE0yNCA9ICJrazptbSI7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L0xvY2tQYXR0ZXJuVXRpbHMuamF2YSBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvTG9ja1BhdHRlcm5VdGlscy5qYXZhCmluZGV4IGRiYmQyODYuLjBiNjJhNjcgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvTG9ja1BhdHRlcm5VdGlscy5qYXZhCisrKyBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvTG9ja1BhdHRlcm5VdGlscy5qYXZhCkBAIC05Miw2ICs5Miw4IEBACiAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUEFTU1dPUkRfVFlQRV9LRVkgPSAibG9ja3NjcmVlbi5wYXNzd29yZF90eXBlIjsKICAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgTE9DS19QQVNTV09SRF9TQUxUX0tFWSA9ICJsb2Nrc2NyZWVuLnBhc3N3b3JkX3NhbHQiOwogCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFBBU1NXT1JEX0hJU1RPUllfS0VZID0gImxvY2tzY3JlZW4ucGFzc3dvcmRoaXN0b3J5IjsKKwogICAgIHByaXZhdGUgZmluYWwgQ29udGV4dCBtQ29udGV4dDsKICAgICBwcml2YXRlIGZpbmFsIENvbnRlbnRSZXNvbHZlciBtQ29udGVudFJlc29sdmVyOwogICAgIHByaXZhdGUgRGV2aWNlUG9saWN5TWFuYWdlciBtRGV2aWNlUG9saWN5TWFuYWdlcjsKQEAgLTEzOCw2ICsxNDAsMzMgQEAKICAgICAgICAgcmV0dXJuIGdldERldmljZVBvbGljeU1hbmFnZXIoKS5nZXRQYXNzd29yZFF1YWxpdHkobnVsbCk7CiAgICAgfQogCisgICAgcHVibGljIGludCBnZXRSZXF1ZXN0ZWRQYXNzd29yZEhpc3RvcnlMZW5ndGgoKSB7CisgICAgICAgIHJldHVybiBnZXREZXZpY2VQb2xpY3lNYW5hZ2VyKCkuZ2V0UGFzc3dvcmRIaXN0b3J5TGVuZ3RoKG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0UmVxdWVzdGVkUGFzc3dvcmRNaW5pbXVtTGV0dGVycygpIHsKKyAgICAgICAgcmV0dXJuIGdldERldmljZVBvbGljeU1hbmFnZXIoKS5nZXRQYXNzd29yZE1pbmltdW1MZXR0ZXJzKG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0UmVxdWVzdGVkUGFzc3dvcmRNaW5pbXVtVXBwZXJDYXNlKCkgeworICAgICAgICByZXR1cm4gZ2V0RGV2aWNlUG9saWN5TWFuYWdlcigpLmdldFBhc3N3b3JkTWluaW11bVVwcGVyQ2FzZShudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFJlcXVlc3RlZFBhc3N3b3JkTWluaW11bUxvd2VyQ2FzZSgpIHsKKyAgICAgICAgcmV0dXJuIGdldERldmljZVBvbGljeU1hbmFnZXIoKS5nZXRQYXNzd29yZE1pbmltdW1Mb3dlckNhc2UobnVsbCk7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRSZXF1ZXN0ZWRQYXNzd29yZE1pbmltdW1OdW1lcmljKCkgeworICAgICAgICByZXR1cm4gZ2V0RGV2aWNlUG9saWN5TWFuYWdlcigpLmdldFBhc3N3b3JkTWluaW11bU51bWVyaWMobnVsbCk7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRSZXF1ZXN0ZWRQYXNzd29yZE1pbmltdW1TeW1ib2xzKCkgeworICAgICAgICByZXR1cm4gZ2V0RGV2aWNlUG9saWN5TWFuYWdlcigpLmdldFBhc3N3b3JkTWluaW11bVN5bWJvbHMobnVsbCk7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRSZXF1ZXN0ZWRQYXNzd29yZE1pbmltdW1Ob25MZXR0ZXIoKSB7CisgICAgICAgIHJldHVybiBnZXREZXZpY2VQb2xpY3lNYW5hZ2VyKCkuZ2V0UGFzc3dvcmRNaW5pbXVtTm9uTGV0dGVyKG51bGwpOworICAgIH0KICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBhY3R1YWwgcGFzc3dvcmQgbW9kZSwgYXMgc2V0IGJ5IGtleWd1YXJkIGFmdGVyIHVwZGF0aW5nIHRoZSBwYXNzd29yZC4KICAgICAgKgpAQCAtMjAyLDggKzIzMSwzNiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENoZWNrcyB0byBzZWUgaWYgdGhlIGdpdmVuIGZpbGUgZXhpc3RzIGFuZCBjb250YWlucyBhbnkgZGF0YS4gUmV0dXJucyB0cnVlIGlmIGl0IGRvZXMsCi0gICAgICogZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqIENoZWNrIHRvIHNlZSBpZiBhIHBhc3N3b3JkIG1hdGNoZXMgYW55IG9mIHRoZSBwYXNzd29yZHMgc3RvcmVkIGluIHRoZQorICAgICAqIHBhc3N3b3JkIGhpc3RvcnkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGFzc3dvcmQgVGhlIHBhc3N3b3JkIHRvIGNoZWNrLgorICAgICAqIEByZXR1cm4gV2hldGhlciB0aGUgcGFzc3dvcmQgbWF0Y2hlcyBhbnkgaW4gdGhlIGhpc3RvcnkuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gY2hlY2tQYXNzd29yZEhpc3RvcnkoU3RyaW5nIHBhc3N3b3JkKSB7CisgICAgICAgIFN0cmluZyBwYXNzd29yZEhhc2hTdHJpbmcgPSBuZXcgU3RyaW5nKHBhc3N3b3JkVG9IYXNoKHBhc3N3b3JkKSk7CisgICAgICAgIFN0cmluZyBwYXNzd29yZEhpc3RvcnkgPSBnZXRTdHJpbmcoUEFTU1dPUkRfSElTVE9SWV9LRVkpOworICAgICAgICBpZiAocGFzc3dvcmRIaXN0b3J5ID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICAvLyBQYXNzd29yZCBIaXN0b3J5IG1heSBiZSB0b28gbG9uZy4uLgorICAgICAgICBpbnQgcGFzc3dvcmRIYXNoTGVuZ3RoID0gcGFzc3dvcmRIYXNoU3RyaW5nLmxlbmd0aCgpOworICAgICAgICBpbnQgcGFzc3dvcmRIaXN0b3J5TGVuZ3RoID0gZ2V0UmVxdWVzdGVkUGFzc3dvcmRIaXN0b3J5TGVuZ3RoKCk7CisgICAgICAgIGlmKHBhc3N3b3JkSGlzdG9yeUxlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaW50IG5lZWRlZFBhc3N3b3JkSGlzdG9yeUxlbmd0aCA9IHBhc3N3b3JkSGFzaExlbmd0aCAqIHBhc3N3b3JkSGlzdG9yeUxlbmd0aAorICAgICAgICAgICAgICAgICsgcGFzc3dvcmRIaXN0b3J5TGVuZ3RoIC0gMTsKKyAgICAgICAgaWYgKHBhc3N3b3JkSGlzdG9yeS5sZW5ndGgoKSA+IG5lZWRlZFBhc3N3b3JkSGlzdG9yeUxlbmd0aCkgeworICAgICAgICAgICAgcGFzc3dvcmRIaXN0b3J5ID0gcGFzc3dvcmRIaXN0b3J5LnN1YnN0cmluZygwLCBuZWVkZWRQYXNzd29yZEhpc3RvcnlMZW5ndGgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBwYXNzd29yZEhpc3RvcnkuY29udGFpbnMocGFzc3dvcmRIYXNoU3RyaW5nKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGVja3MgdG8gc2VlIGlmIHRoZSBnaXZlbiBmaWxlIGV4aXN0cyBhbmQgY29udGFpbnMgYW55IGRhdGEuIFJldHVybnMKKyAgICAgKiB0cnVlIGlmIGl0IGRvZXMsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKgogICAgICAqIEBwYXJhbSBmaWxlbmFtZQogICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBmaWxlIGV4aXN0cyBhbmQgaXMgbm9uLWVtcHR5LgogICAgICAqLwpAQCAtMjc0LDYgKzMzMSwxMSBAQAogICAgICAgICAgICAgICAgICAgICBhY3RpdmVQYXNzd29yZFF1YWxpdHkgPSBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfQUxQSEFOVU1FUklDOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX0NPTVBMRVg6CisgICAgICAgICAgICAgICAgaWYgKGlzTG9ja1Bhc3N3b3JkRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGFjdGl2ZVBhc3N3b3JkUXVhbGl0eSA9IERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9DT01QTEVYOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gYWN0aXZlUGFzc3dvcmRRdWFsaXR5OwogICAgIH0KQEAgLTI4Miw4ICszNDQsNiBAQAogICAgICAqIENsZWFyIGFueSBsb2NrIHBhdHRlcm4gb3IgcGFzc3dvcmQuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgY2xlYXJMb2NrKCkgewotICAgICAgICBnZXREZXZpY2VQb2xpY3lNYW5hZ2VyKCkuc2V0QWN0aXZlUGFzc3dvcmRTdGF0ZSgKLSAgICAgICAgICAgICAgICBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfVU5TUEVDSUZJRUQsIDApOwogICAgICAgICBzYXZlTG9ja1Bhc3N3b3JkKG51bGwsIERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9TT01FVEhJTkcpOwogICAgICAgICBzZXRMb2NrUGF0dGVybkVuYWJsZWQoZmFsc2UpOwogICAgICAgICBzYXZlTG9ja1BhdHRlcm4obnVsbCk7CkBAIC0yOTYsNyArMzU2LDcgQEAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzYXZlTG9ja1BhdHRlcm4oTGlzdDxMb2NrUGF0dGVyblZpZXcuQ2VsbD4gcGF0dGVybikgewogICAgICAgICAvLyBDb21wdXRlIHRoZSBoYXNoCi0gICAgICAgIGZpbmFsIGJ5dGVbXSBoYXNoICA9IExvY2tQYXR0ZXJuVXRpbHMucGF0dGVyblRvSGFzaChwYXR0ZXJuKTsKKyAgICAgICAgZmluYWwgYnl0ZVtdIGhhc2ggPSBMb2NrUGF0dGVyblV0aWxzLnBhdHRlcm5Ub0hhc2gocGF0dGVybik7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAvLyBXcml0ZSB0aGUgaGFzaCB0byBmaWxlCiAgICAgICAgICAgICBSYW5kb21BY2Nlc3NGaWxlIHJhZiA9IG5ldyBSYW5kb21BY2Nlc3NGaWxlKHNMb2NrUGF0dGVybkZpbGVuYW1lLCAicnciKTsKQEAgLTMxMSwxNCArMzcxLDE1IEBACiAgICAgICAgICAgICBpZiAocGF0dGVybiAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgc2V0Qm9vbGVhbihQQVRURVJOX0VWRVJfQ0hPU0VOX0tFWSwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgc2V0TG9uZyhQQVNTV09SRF9UWVBFX0tFWSwgRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX1NPTUVUSElORyk7Ci0gICAgICAgICAgICAgICAgZHBtLnNldEFjdGl2ZVBhc3N3b3JkU3RhdGUoCi0gICAgICAgICAgICAgICAgICAgICAgICBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfU09NRVRISU5HLCBwYXR0ZXJuLnNpemUoKSk7CisgICAgICAgICAgICAgICAgZHBtLnNldEFjdGl2ZVBhc3N3b3JkU3RhdGUoRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX1NPTUVUSElORywgcGF0dGVybgorICAgICAgICAgICAgICAgICAgICAgICAgLnNpemUoKSwgMCwgMCwgMCwgMCwgMCwgMCk7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGRwbS5zZXRBY3RpdmVQYXNzd29yZFN0YXRlKAotICAgICAgICAgICAgICAgICAgICAgICAgRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX1VOU1BFQ0lGSUVELCAwKTsKKyAgICAgICAgICAgICAgICBkcG0uc2V0QWN0aXZlUGFzc3dvcmRTdGF0ZShEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfVU5TUEVDSUZJRUQsIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAwLCAwLCAwKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGZuZmUpIHsKLSAgICAgICAgICAgIC8vIENhbnQgZG8gbXVjaCwgdW5sZXNzIHdlIHdhbnQgdG8gZmFpbCBvdmVyIHRvIHVzaW5nIHRoZSBzZXR0aW5ncyBwcm92aWRlcgorICAgICAgICAgICAgLy8gQ2FudCBkbyBtdWNoLCB1bmxlc3Mgd2Ugd2FudCB0byBmYWlsIG92ZXIgdG8gdXNpbmcgdGhlIHNldHRpbmdzCisgICAgICAgICAgICAvLyBwcm92aWRlcgogICAgICAgICAgICAgTG9nLmUoVEFHLCAiVW5hYmxlIHRvIHNhdmUgbG9jayBwYXR0ZXJuIHRvICIgKyBzTG9ja1BhdHRlcm5GaWxlbmFtZSk7CiAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewogICAgICAgICAgICAgLy8gQ2FudCBkbyBtdWNoCkBAIC0zNzYsMTcgKzQzNyw1OSBAQAogICAgICAgICAgICAgRGV2aWNlUG9saWN5TWFuYWdlciBkcG0gPSBnZXREZXZpY2VQb2xpY3lNYW5hZ2VyKCk7CiAgICAgICAgICAgICBpZiAocGFzc3dvcmQgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIGludCBjb21wdXRlZFF1YWxpdHkgPSBjb21wdXRlUGFzc3dvcmRRdWFsaXR5KHBhc3N3b3JkKTsKLSAgICAgICAgICAgICAgICBzZXRMb25nKFBBU1NXT1JEX1RZUEVfS0VZLCBjb21wdXRlZFF1YWxpdHkpOworICAgICAgICAgICAgICAgIHNldExvbmcoUEFTU1dPUkRfVFlQRV9LRVksIE1hdGgubWF4KHF1YWxpdHksIGNvbXB1dGVkUXVhbGl0eSkpOwogICAgICAgICAgICAgICAgIGlmIChjb21wdXRlZFF1YWxpdHkgIT0gRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX1VOU1BFQ0lGSUVEKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRwbS5zZXRBY3RpdmVQYXNzd29yZFN0YXRlKGNvbXB1dGVkUXVhbGl0eSwgcGFzc3dvcmQubGVuZ3RoKCkpOworICAgICAgICAgICAgICAgICAgICBpbnQgbGV0dGVycyA9IDA7CisgICAgICAgICAgICAgICAgICAgIGludCB1cHBlcmNhc2UgPSAwOworICAgICAgICAgICAgICAgICAgICBpbnQgbG93ZXJjYXNlID0gMDsKKyAgICAgICAgICAgICAgICAgICAgaW50IG51bWJlcnMgPSAwOworICAgICAgICAgICAgICAgICAgICBpbnQgc3ltYm9scyA9IDA7CisgICAgICAgICAgICAgICAgICAgIGludCBub25sZXR0ZXIgPSAwOworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhc3N3b3JkLmxlbmd0aCgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgYyA9IHBhc3N3b3JkLmNoYXJBdChpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjID49ICdBJyAmJiBjIDw9ICdaJykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldHRlcnMrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cHBlcmNhc2UrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYyA+PSAnYScgJiYgYyA8PSAneicpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXR0ZXJzKys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG93ZXJjYXNlKys7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGMgPj0gJzAnICYmIGMgPD0gJzknKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVycysrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbmxldHRlcisrOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW1ib2xzKys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9ubGV0dGVyKys7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZHBtLnNldEFjdGl2ZVBhc3N3b3JkU3RhdGUoTWF0aC5tYXgocXVhbGl0eSwgY29tcHV0ZWRRdWFsaXR5KSwgcGFzc3dvcmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAubGVuZ3RoKCksIGxldHRlcnMsIHVwcGVyY2FzZSwgbG93ZXJjYXNlLCBudW1iZXJzLCBzeW1ib2xzLCBub25sZXR0ZXIpOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBwYXNzd29yZCBpcyBub3QgYW55dGhpbmcuCiAgICAgICAgICAgICAgICAgICAgIGRwbS5zZXRBY3RpdmVQYXNzd29yZFN0YXRlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9VTlNQRUNJRklFRCwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX1VOU1BFQ0lGSUVELCAwLCAwLCAwLCAwLCAwLCAwLCAwKTsKICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gQWRkIHRoZSBwYXNzd29yZCB0byB0aGUgcGFzc3dvcmQgaGlzdG9yeS4gV2UgYXNzdW1lIGFsbAorICAgICAgICAgICAgICAgIC8vIHBhc3N3b3JkCisgICAgICAgICAgICAgICAgLy8gaGFzaGVzIGhhdmUgdGhlIHNhbWUgbGVuZ3RoIGZvciBzaW1wbGljaXR5IG9mIGltcGxlbWVudGF0aW9uLgorICAgICAgICAgICAgICAgIFN0cmluZyBwYXNzd29yZEhpc3RvcnkgPSBnZXRTdHJpbmcoUEFTU1dPUkRfSElTVE9SWV9LRVkpOworICAgICAgICAgICAgICAgIGlmIChwYXNzd29yZEhpc3RvcnkgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBwYXNzd29yZEhpc3RvcnkgPSBuZXcgU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGludCBwYXNzd29yZEhpc3RvcnlMZW5ndGggPSBnZXRSZXF1ZXN0ZWRQYXNzd29yZEhpc3RvcnlMZW5ndGgoKTsKKyAgICAgICAgICAgICAgICBpZiAocGFzc3dvcmRIaXN0b3J5TGVuZ3RoID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcGFzc3dvcmRIaXN0b3J5ID0gIiI7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcGFzc3dvcmRIaXN0b3J5ID0gbmV3IFN0cmluZyhoYXNoKSArICIsIiArIHBhc3N3b3JkSGlzdG9yeTsKKyAgICAgICAgICAgICAgICAgICAgLy8gQ3V0IGl0IHRvIGNvbnRhaW4gcGFzc3dvcmRIaXN0b3J5TGVuZ3RoIGhhc2hlcworICAgICAgICAgICAgICAgICAgICAvLyBhbmQgcGFzc3dvcmRIaXN0b3J5TGVuZ3RoIC0xIGNvbW1hcy4KKyAgICAgICAgICAgICAgICAgICAgcGFzc3dvcmRIaXN0b3J5ID0gcGFzc3dvcmRIaXN0b3J5LnN1YnN0cmluZygwLCBNYXRoLm1pbihoYXNoLmxlbmd0aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICogcGFzc3dvcmRIaXN0b3J5TGVuZ3RoICsgcGFzc3dvcmRIaXN0b3J5TGVuZ3RoIC0gMSwgcGFzc3dvcmRIaXN0b3J5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmxlbmd0aCgpKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNldFN0cmluZyhQQVNTV09SRF9ISVNUT1JZX0tFWSwgcGFzc3dvcmRIaXN0b3J5KTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgZHBtLnNldEFjdGl2ZVBhc3N3b3JkU3RhdGUoCi0gICAgICAgICAgICAgICAgICAgICAgICBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfVU5TUEVDSUZJRUQsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX1VOU1BFQ0lGSUVELCAwLCAwLCAwLCAwLCAwLCAwLCAwKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGZuZmUpIHsKICAgICAgICAgICAgIC8vIENhbnQgZG8gbXVjaCwgdW5sZXNzIHdlIHdhbnQgdG8gZmFpbCBvdmVyIHRvIHVzaW5nIHRoZSBzZXR0aW5ncyBwcm92aWRlcgpAQCAtNTI2LDcgKzYyOSw4IEBACiAgICAgICAgIHJldHVybiBzYXZlZFBhc3N3b3JkRXhpc3RzKCkgJiYKICAgICAgICAgICAgICAgICAobW9kZSA9PSBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfQUxQSEFCRVRJQwogICAgICAgICAgICAgICAgICAgICAgICAgfHwgbW9kZSA9PSBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfTlVNRVJJQwotICAgICAgICAgICAgICAgICAgICAgICAgfHwgbW9kZSA9PSBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfQUxQSEFOVU1FUklDKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IG1vZGUgPT0gRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX0FMUEhBTlVNRVJJQworICAgICAgICAgICAgICAgICAgICAgICAgfHwgbW9kZSA9PSBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfQ09NUExFWCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC02NTAsMTIgKzc1NCwyMSBAQAogICAgICAgICBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzLlNlY3VyZS5wdXRMb25nKG1Db250ZW50UmVzb2x2ZXIsIHNlY3VyZVNldHRpbmdLZXksIHZhbHVlKTsKICAgICB9CiAKKyAgICBwcml2YXRlIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIHNlY3VyZVNldHRpbmdLZXkpIHsKKyAgICAgICAgcmV0dXJuIGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3MuU2VjdXJlLmdldFN0cmluZyhtQ29udGVudFJlc29sdmVyLCBzZWN1cmVTZXR0aW5nS2V5KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2V0U3RyaW5nKFN0cmluZyBzZWN1cmVTZXR0aW5nS2V5LCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5ncy5TZWN1cmUucHV0U3RyaW5nKG1Db250ZW50UmVzb2x2ZXIsIHNlY3VyZVNldHRpbmdLZXksIHZhbHVlKTsKKyAgICB9CisKICAgICBwdWJsaWMgYm9vbGVhbiBpc1NlY3VyZSgpIHsKICAgICAgICAgbG9uZyBtb2RlID0gZ2V0S2V5Z3VhcmRTdG9yZWRQYXNzd29yZFF1YWxpdHkoKTsKICAgICAgICAgZmluYWwgYm9vbGVhbiBpc1BhdHRlcm4gPSBtb2RlID09IERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9TT01FVEhJTkc7CiAgICAgICAgIGZpbmFsIGJvb2xlYW4gaXNQYXNzd29yZCA9IG1vZGUgPT0gRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX05VTUVSSUMKICAgICAgICAgICAgICAgICB8fCBtb2RlID09IERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9BTFBIQUJFVElDCi0gICAgICAgICAgICAgICAgfHwgbW9kZSA9PSBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfQUxQSEFOVU1FUklDOworICAgICAgICAgICAgICAgIHx8IG1vZGUgPT0gRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX0FMUEhBTlVNRVJJQworICAgICAgICAgICAgICAgIHx8IG1vZGUgPT0gRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX0NPTVBMRVg7CiAgICAgICAgIGZpbmFsIGJvb2xlYW4gc2VjdXJlID0gaXNQYXR0ZXJuICYmIGlzTG9ja1BhdHRlcm5FbmFibGVkKCkgJiYgc2F2ZWRQYXR0ZXJuRXhpc3RzKCkKICAgICAgICAgICAgICAgICB8fCBpc1Bhc3N3b3JkICYmIHNhdmVkUGFzc3dvcmRFeGlzdHMoKTsKICAgICAgICAgcmV0dXJuIHNlY3VyZTsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvU2xpZGluZ1RhYi5qYXZhIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9TbGlkaW5nVGFiLmphdmEKaW5kZXggOTE1MjcyOS4uMzIxOGJhOCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9TbGlkaW5nVGFiLmphdmEKKysrIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9TbGlkaW5nVGFiLmphdmEKQEAgLTE3LDEwICsxNyw4IEBACiBwYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLndpZGdldDsKIAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQ29uZmlndXJhdGlvbjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlR5cGVkQXJyYXk7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5WaWJyYXRvcjsKQEAgLTM4LDYgKzM2LDcgQEAKIGltcG9ydCBhbmRyb2lkLndpZGdldC5JbWFnZVZpZXc7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuSW1hZ2VWaWV3LlNjYWxlVHlwZTsKKwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLlI7CiAKIC8qKgpAQCAtNjksMjEgKzY4LDIxIEBACiAgICAgcHJpdmF0ZSBpbnQgbUdyYWJiZWRTdGF0ZSA9IE9uVHJpZ2dlckxpc3RlbmVyLk5PX0hBTkRMRTsKICAgICBwcml2YXRlIGJvb2xlYW4gbVRyaWdnZXJlZCA9IGZhbHNlOwogICAgIHByaXZhdGUgVmlicmF0b3IgbVZpYnJhdG9yOwotICAgIHByaXZhdGUgZmxvYXQgbURlbnNpdHk7IC8vIHVzZWQgdG8gc2NhbGUgZGltZW5zaW9ucyBmb3IgYml0bWFwcy4KKyAgICBwcml2YXRlIGZpbmFsIGZsb2F0IG1EZW5zaXR5OyAvLyB1c2VkIHRvIHNjYWxlIGRpbWVuc2lvbnMgZm9yIGJpdG1hcHMuCiAKICAgICAvKioKICAgICAgKiBFaXRoZXIge0BsaW5rICNIT1JJWk9OVEFMfSBvciB7QGxpbmsgI1ZFUlRJQ0FMfS4KICAgICAgKi8KLSAgICBwcml2YXRlIGludCBtT3JpZW50YXRpb247CisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbU9yaWVudGF0aW9uOwogCi0gICAgcHJpdmF0ZSBTbGlkZXIgbUxlZnRTbGlkZXI7Ci0gICAgcHJpdmF0ZSBTbGlkZXIgbVJpZ2h0U2xpZGVyOworICAgIHByaXZhdGUgZmluYWwgU2xpZGVyIG1MZWZ0U2xpZGVyOworICAgIHByaXZhdGUgZmluYWwgU2xpZGVyIG1SaWdodFNsaWRlcjsKICAgICBwcml2YXRlIFNsaWRlciBtQ3VycmVudFNsaWRlcjsKICAgICBwcml2YXRlIGJvb2xlYW4gbVRyYWNraW5nOwogICAgIHByaXZhdGUgZmxvYXQgbVRocmVzaG9sZDsKICAgICBwcml2YXRlIFNsaWRlciBtT3RoZXJTbGlkZXI7CiAgICAgcHJpdmF0ZSBib29sZWFuIG1BbmltYXRpbmc7Ci0gICAgcHJpdmF0ZSBSZWN0IG1UbXBSZWN0OworICAgIHByaXZhdGUgZmluYWwgUmVjdCBtVG1wUmVjdDsKIAogICAgIC8qKgogICAgICAqIExpc3RlbmVyIHVzZWQgdG8gcmVzZXQgdGhlIHZpZXcgd2hlbiB0aGUgY3VycmVudCBhbmltYXRpb24gY29tcGxldGVzLgpAQCAtNjA4LDE0ICs2MDcsNyBAQAogCiAgICAgICAgICAgICAgICAgY2FzZSBNb3Rpb25FdmVudC5BQ1RJT05fVVA6CiAgICAgICAgICAgICAgICAgY2FzZSBNb3Rpb25FdmVudC5BQ1RJT05fQ0FOQ0VMOgotICAgICAgICAgICAgICAgICAgICBtVHJhY2tpbmcgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgbVRyaWdnZXJlZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBtT3RoZXJTbGlkZXIuc2hvdyh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRTbGlkZXIucmVzZXQoZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFNsaWRlci5oaWRlVGFyZ2V0KCk7Ci0gICAgICAgICAgICAgICAgICAgIG1DdXJyZW50U2xpZGVyID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgbU90aGVyU2xpZGVyID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgc2V0R3JhYmJlZFN0YXRlKE9uVHJpZ2dlckxpc3RlbmVyLk5PX0hBTkRMRSk7CisgICAgICAgICAgICAgICAgICAgIGNhbmNlbEdyYWIoKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTYyMyw2ICs2MTUsMTcgQEAKICAgICAgICAgcmV0dXJuIG1UcmFja2luZyB8fCBzdXBlci5vblRvdWNoRXZlbnQoZXZlbnQpOwogICAgIH0KIAorICAgIHByaXZhdGUgdm9pZCBjYW5jZWxHcmFiKCkgeworICAgICAgICBtVHJhY2tpbmcgPSBmYWxzZTsKKyAgICAgICAgbVRyaWdnZXJlZCA9IGZhbHNlOworICAgICAgICBtT3RoZXJTbGlkZXIuc2hvdyh0cnVlKTsKKyAgICAgICAgbUN1cnJlbnRTbGlkZXIucmVzZXQoZmFsc2UpOworICAgICAgICBtQ3VycmVudFNsaWRlci5oaWRlVGFyZ2V0KCk7CisgICAgICAgIG1DdXJyZW50U2xpZGVyID0gbnVsbDsKKyAgICAgICAgbU90aGVyU2xpZGVyID0gbnVsbDsKKyAgICAgICAgc2V0R3JhYmJlZFN0YXRlKE9uVHJpZ2dlckxpc3RlbmVyLk5PX0hBTkRMRSk7CisgICAgfQorCiAgICAgdm9pZCBzdGFydEFuaW1hdGluZyhmaW5hbCBib29sZWFuIGhvbGRBZnRlcikgewogICAgICAgICBtQW5pbWF0aW5nID0gdHJ1ZTsKICAgICAgICAgZmluYWwgQW5pbWF0aW9uIHRyYW5zMTsKQEAgLTgzMiw2ICs4MzUsMTcgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uVmlzaWJpbGl0eUNoYW5nZWQoVmlldyBjaGFuZ2VkVmlldywgaW50IHZpc2liaWxpdHkpIHsKKyAgICAgICAgc3VwZXIub25WaXNpYmlsaXR5Q2hhbmdlZChjaGFuZ2VkVmlldywgdmlzaWJpbGl0eSk7CisgICAgICAgIC8vIFdoZW4gdmlzaWJpbGl0eSBjaGFuZ2VzIGFuZCB0aGUgdXNlciBoYXMgYSB0YWIgc2VsZWN0ZWQsIHVuc2VsZWN0IGl0IGFuZAorICAgICAgICAvLyBtYWtlIHN1cmUgdGhlaXIgY2FsbGJhY2sgZ2V0cyBjYWxsZWQuCisgICAgICAgIGlmIChjaGFuZ2VkVmlldyA9PSB0aGlzICYmIHZpc2liaWxpdHkgIT0gVklTSUJMRQorICAgICAgICAgICAgICAgICYmIG1HcmFiYmVkU3RhdGUgIT0gT25UcmlnZ2VyTGlzdGVuZXIuTk9fSEFORExFKSB7CisgICAgICAgICAgICBjYW5jZWxHcmFiKCk7CisgICAgICAgIH0KKyAgICB9CisKICAgICAvKioKICAgICAgKiBTZXRzIHRoZSBjdXJyZW50IGdyYWJiZWQgc3RhdGUsIGFuZCBkaXNwYXRjaGVzIGEgZ3JhYmJlZCBzdGF0ZSBjaGFuZ2UKICAgICAgKiBldmVudCB0byBvdXIgbGlzdGVuZXIuCmRpZmYgLS1naXQgYS9jb3JlL2puaS9BbmRyb2lkLm1rIGIvY29yZS9qbmkvQW5kcm9pZC5tawppbmRleCBkODU0ZTg3Li4xOTQyOGY5IDEwMDY0NAotLS0gYS9jb3JlL2puaS9BbmRyb2lkLm1rCisrKyBiL2NvcmUvam5pL0FuZHJvaWQubWsKQEAgLTI0LDcgKzI0LDYgQEAKIExPQ0FMX1NSQ19GSUxFUzo9IFwKIAlBY3Rpdml0eU1hbmFnZXIuY3BwIFwKIAlBbmRyb2lkUnVudGltZS5jcHAgXAotCUN1cnNvcldpbmRvdy5jcHAgXAogCVRpbWUuY3BwIFwKIAljb21fZ29vZ2xlX2FuZHJvaWRfZ2xlc19qbmlfRUdMSW1wbC5jcHAgXAogCWNvbV9nb29nbGVfYW5kcm9pZF9nbGVzX2puaV9HTEltcGwuY3BwLmFybSBcCkBAIC00OSw2ICs0OCw4IEBACiAJYW5kcm9pZF92aWV3X0lucHV0UXVldWUuY3BwIFwKIAlhbmRyb2lkX3ZpZXdfSW5wdXRUYXJnZXQuY3BwIFwKIAlhbmRyb2lkX3ZpZXdfS2V5RXZlbnQuY3BwIFwKKwlhbmRyb2lkX3ZpZXdfSGFyZHdhcmVSZW5kZXJlci5jcHAgXAorCWFuZHJvaWRfdmlld19HTEVTMjBDYW52YXMuY3BwIFwKIAlhbmRyb2lkX3ZpZXdfTW90aW9uRXZlbnQuY3BwIFwKIAlhbmRyb2lkX3RleHRfQW5kcm9pZENoYXJhY3Rlci5jcHAgXAogCWFuZHJvaWRfdGV4dF9BbmRyb2lkQmlkaS5jcHAgXApAQCAtMTEyLDYgKzExMyw4IEBACiAJYW5kcm9pZF9tZWRpYV9BdWRpb1N5c3RlbS5jcHAgXAogCWFuZHJvaWRfbWVkaWFfQXVkaW9UcmFjay5jcHAgXAogCWFuZHJvaWRfbWVkaWFfSmV0UGxheWVyLmNwcCBcCisJYW5kcm9pZF9tZWRpYV9NdHBDbGllbnQuY3BwIFwKKwlhbmRyb2lkX21lZGlhX010cEN1cnNvci5jcHAgXAogCWFuZHJvaWRfbWVkaWFfVG9uZUdlbmVyYXRvci5jcHAgXAogCWFuZHJvaWRfaGFyZHdhcmVfQ2FtZXJhLmNwcCBcCiAJYW5kcm9pZF9oYXJkd2FyZV9TZW5zb3JNYW5hZ2VyLmNwcCBcCkBAIC0xNDAsMTEgKzE0MywxMyBAQAogTE9DQUxfQ19JTkNMVURFUyArPSBcCiAJJChKTklfSF9JTkNMVURFKSBcCiAJJChMT0NBTF9QQVRIKS9hbmRyb2lkL2dyYXBoaWNzIFwKKwkkKExPQ0FMX1BBVEgpLy4uLy4uL2xpYnMvaHd1aSBcCiAJJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGJsdWVkcm9pZCkgXAogCSQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBsaWJoYXJkd2FyZSkvaGFyZHdhcmUgXAogCSQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBsaWJoYXJkd2FyZV9sZWdhY3kpL2hhcmR3YXJlX2xlZ2FjeSBcCiAJJChMT0NBTF9QQVRIKS8uLi8uLi9pbmNsdWRlL3VpIFwKIAkkKExPQ0FMX1BBVEgpLy4uLy4uL2luY2x1ZGUvdXRpbHMgXAorCSQoTE9DQUxfUEFUSCkvLi4vLi4vbWVkaWEvbXRwIFwKIAlleHRlcm5hbC9za2lhL2luY2x1ZGUvY29yZSBcCiAJZXh0ZXJuYWwvc2tpYS9pbmNsdWRlL2VmZmVjdHMgXAogCWV4dGVybmFsL3NraWEvaW5jbHVkZS9pbWFnZXMgXApAQCAtMTY4LDYgKzE3Myw3IEBACiAJbGliYmluZGVyIFwKIAlsaWJuZXR1dGlscyBcCiAJbGlidWkgXAorCWxpYmh3dWkgXAogCWxpYnN1cmZhY2VmbGluZ2VyX2NsaWVudCBcCiAJbGliY2FtZXJhX2NsaWVudCBcCiAJbGlic2tpYWdsIFwKQEAgLTE5MCw2ICsxOTYsOCBAQAogCWxpYndwYV9jbGllbnQgXAogCWxpYmpwZWcKIAorTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBsaWJtdHBob3N0IGxpYnVzYmhvc3QKKwogaWZlcSAoJChCT0FSRF9IQVZFX0JMVUVUT09USCksdHJ1ZSkKIExPQ0FMX0NfSU5DTFVERVMgKz0gXAogCWV4dGVybmFsL2RidXMgXApkaWZmIC0tZ2l0IGEvY29yZS9qbmkvQW5kcm9pZFJ1bnRpbWUuY3BwIGIvY29yZS9qbmkvQW5kcm9pZFJ1bnRpbWUuY3BwCmluZGV4IDNlNjljNzguLjViMmQ5NjYgMTAwNjQ0Ci0tLSBhL2NvcmUvam5pL0FuZHJvaWRSdW50aW1lLmNwcAorKysgYi9jb3JlL2puaS9BbmRyb2lkUnVudGltZS5jcHAKQEAgLTExNCw2ICsxMTQsOCBAQAogZXh0ZXJuIGludCByZWdpc3Rlcl9hbmRyb2lkX2dyYXBoaWNzX1BpeGVsRm9ybWF0KEpOSUVudiogZW52KTsKIGV4dGVybiBpbnQgcmVnaXN0ZXJfY29tX2FuZHJvaWRfaW50ZXJuYWxfZ3JhcGhpY3NfTmF0aXZlVXRpbHMoSk5JRW52ICplbnYpOwogZXh0ZXJuIGludCByZWdpc3Rlcl9hbmRyb2lkX3ZpZXdfRGlzcGxheShKTklFbnYqIGVudik7CitleHRlcm4gaW50IHJlZ2lzdGVyX2FuZHJvaWRfdmlld19HTEVTMjBDYW52YXMoSk5JRW52KiBlbnYpOworZXh0ZXJuIGludCByZWdpc3Rlcl9hbmRyb2lkX3ZpZXdfSGFyZHdhcmVSZW5kZXJlcihKTklFbnYqIGVudik7CiBleHRlcm4gaW50IHJlZ2lzdGVyX2FuZHJvaWRfdmlld19TdXJmYWNlKEpOSUVudiogZW52KTsKIGV4dGVybiBpbnQgcmVnaXN0ZXJfYW5kcm9pZF92aWV3X1ZpZXdSb290KEpOSUVudiogZW52KTsKIGV4dGVybiBpbnQgcmVnaXN0ZXJfYW5kcm9pZF9kYXRhYmFzZV9DdXJzb3JXaW5kb3coSk5JRW52KiBlbnYpOwpAQCAtMTI0LDYgKzEyNiw4IEBACiBleHRlcm4gaW50IHJlZ2lzdGVyX2FuZHJvaWRfZGF0YWJhc2VfU1FMaXRlUXVlcnkoSk5JRW52KiBlbnYpOwogZXh0ZXJuIGludCByZWdpc3Rlcl9hbmRyb2lkX2RhdGFiYXNlX1NRTGl0ZVN0YXRlbWVudChKTklFbnYqIGVudik7CiBleHRlcm4gaW50IHJlZ2lzdGVyX2FuZHJvaWRfZGVidWdfSk5JVGVzdChKTklFbnYqIGVudik7CitleHRlcm4gaW50IHJlZ2lzdGVyX2FuZHJvaWRfbWVkaWFfTXRwQ2xpZW50KEpOSUVudiAqZW52KTsKK2V4dGVybiBpbnQgcmVnaXN0ZXJfYW5kcm9pZF9tZWRpYV9NdHBDdXJzb3IoSk5JRW52ICplbnYpOwogZXh0ZXJuIGludCByZWdpc3Rlcl9hbmRyb2lkX25pb191dGlscyhKTklFbnYqIGVudik7CiBleHRlcm4gaW50IHJlZ2lzdGVyX2FuZHJvaWRfcGltX0V2ZW50UmVjdXJyZW5jZShKTklFbnYqIGVudik7CiBleHRlcm4gaW50IHJlZ2lzdGVyX2FuZHJvaWRfdGV4dF9mb3JtYXRfVGltZShKTklFbnYqIGVudik7CkBAIC0xMjEyLDYgKzEyMTYsOCBAQAogICAgIFJFR19KTkkocmVnaXN0ZXJfYW5kcm9pZF9uaW9fdXRpbHMpLAogICAgIFJFR19KTkkocmVnaXN0ZXJfYW5kcm9pZF9ncmFwaGljc19QaXhlbEZvcm1hdCksCiAgICAgUkVHX0pOSShyZWdpc3Rlcl9hbmRyb2lkX2dyYXBoaWNzX0dyYXBoaWNzKSwKKyAgICBSRUdfSk5JKHJlZ2lzdGVyX2FuZHJvaWRfdmlld19HTEVTMjBDYW52YXMpLAorICAgIFJFR19KTkkocmVnaXN0ZXJfYW5kcm9pZF92aWV3X0hhcmR3YXJlUmVuZGVyZXIpLAogICAgIFJFR19KTkkocmVnaXN0ZXJfYW5kcm9pZF92aWV3X1N1cmZhY2UpLAogICAgIFJFR19KTkkocmVnaXN0ZXJfYW5kcm9pZF92aWV3X1ZpZXdSb290KSwKICAgICBSRUdfSk5JKHJlZ2lzdGVyX2NvbV9nb29nbGVfYW5kcm9pZF9nbGVzX2puaV9FR0xJbXBsKSwKQEAgLTEyNzYsNiArMTI4Miw4IEBACiAgICAgUkVHX0pOSShyZWdpc3Rlcl9hbmRyb2lkX21lZGlhX0F1ZGlvU3lzdGVtKSwKICAgICBSRUdfSk5JKHJlZ2lzdGVyX2FuZHJvaWRfbWVkaWFfQXVkaW9UcmFjayksCiAgICAgUkVHX0pOSShyZWdpc3Rlcl9hbmRyb2lkX21lZGlhX0pldFBsYXllciksCisgICAgUkVHX0pOSShyZWdpc3Rlcl9hbmRyb2lkX21lZGlhX010cENsaWVudCksCisgICAgUkVHX0pOSShyZWdpc3Rlcl9hbmRyb2lkX21lZGlhX010cEN1cnNvciksCiAgICAgUkVHX0pOSShyZWdpc3Rlcl9hbmRyb2lkX21lZGlhX1RvbmVHZW5lcmF0b3IpLAogCiAgICAgUkVHX0pOSShyZWdpc3Rlcl9hbmRyb2lkX29wZW5nbF9jbGFzc2VzKSwKZGlmZiAtLWdpdCBhL2NvcmUvam5pL2FuZHJvaWQvZ3JhcGhpY3MvQml0bWFwLmNwcCBiL2NvcmUvam5pL2FuZHJvaWQvZ3JhcGhpY3MvQml0bWFwLmNwcAppbmRleCA4OGJiYWZkLi5iMDYyMjY0IDEwMDY0NAotLS0gYS9jb3JlL2puaS9hbmRyb2lkL2dyYXBoaWNzL0JpdG1hcC5jcHAKKysrIGIvY29yZS9qbmkvYW5kcm9pZC9ncmFwaGljcy9CaXRtYXAuY3BwCkBAIC0zMTMsNiArMzEzLDEwIEBACiAgICAgcmV0dXJuIGJpdG1hcC0+Y29uZmlnKCk7DQogfQ0KIA0KK3N0YXRpYyBpbnQgQml0bWFwX2dldEdlbmVyYXRpb25JZChKTklFbnYqIGVudiwgam9iamVjdCwgU2tCaXRtYXAqIGJpdG1hcCkgew0KKyAgICByZXR1cm4gYml0bWFwLT5nZXRHZW5lcmF0aW9uSUQoKTsNCit9DQorDQogc3RhdGljIGpib29sZWFuIEJpdG1hcF9oYXNBbHBoYShKTklFbnYqIGVudiwgam9iamVjdCwgU2tCaXRtYXAqIGJpdG1hcCkgew0KICAgICByZXR1cm4gIWJpdG1hcC0+aXNPcGFxdWUoKTsNCiB9DQpAQCAtNjA2LDYgKzYxMCw3IEBACiAgICAgICAgICh2b2lkKilCaXRtYXBfd3JpdGVUb1BhcmNlbCB9LA0KICAgICB7ICAgIm5hdGl2ZUV4dHJhY3RBbHBoYSIsICAgICAgICIoSUlbSSlMYW5kcm9pZC9ncmFwaGljcy9CaXRtYXA7IiwNCiAgICAgICAgICh2b2lkKilCaXRtYXBfZXh0cmFjdEFscGhhIH0sDQorICAgIHsgICAibmF0aXZlR2VuZXJhdGlvbklkIiwgICAgICAgIihJKUkiLCAodm9pZCopQml0bWFwX2dldEdlbmVyYXRpb25JZCB9LA0KICAgICB7ICAgIm5hdGl2ZUdldFBpeGVsIiwgICAgICAgICAgICIoSUlJKUkiLCAodm9pZCopQml0bWFwX2dldFBpeGVsIH0sDQogICAgIHsgICAibmF0aXZlR2V0UGl4ZWxzIiwgICAgICAgICAgIihJW0lJSUlJSUkpViIsICh2b2lkKilCaXRtYXBfZ2V0UGl4ZWxzIH0sDQogICAgIHsgICAibmF0aXZlU2V0UGl4ZWwiLCAgICAgICAgICAgIihJSUlJKVYiLCAodm9pZCopQml0bWFwX3NldFBpeGVsIH0sDQpkaWZmIC0tZ2l0IGEvY29yZS9qbmkvYW5kcm9pZC9ncmFwaGljcy9DYW52YXMuY3BwIGIvY29yZS9qbmkvYW5kcm9pZC9ncmFwaGljcy9DYW52YXMuY3BwCmluZGV4IGUxZTk1MzYuLmIwNDQyNzEgMTAwNjQ0Ci0tLSBhL2NvcmUvam5pL2FuZHJvaWQvZ3JhcGhpY3MvQ2FudmFzLmNwcAorKysgYi9jb3JlL2puaS9hbmRyb2lkL2dyYXBoaWNzL0NhbnZhcy5jcHAKQEAgLTMwLDYgKzMwLDEyIEBACiAjaW5jbHVkZSAiU2tCb3VuZGFyeVBhdGNoLmgiCiAjaW5jbHVkZSAiU2tNZXNoVXRpbHMuaCIKIAorI2luY2x1ZGUgInVuaWNvZGUvdWJpZGkuaCIKKyNpbmNsdWRlICJ1bmljb2RlL3VzaGFwZS5oIgorCisvLyB0ZW1wb3JhcnkgZm9yIGRlYnVnZ2luZworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCiAjZGVmaW5lIFRJTUVfRFJBV3gKIAogc3RhdGljIHVpbnQzMl90IGdldF90aHJlYWRfbXNlYygpIHsKQEAgLTUyLDYgKzU4LDI0IEBACiBjbGFzcyBTa0NhbnZhc0dsdWUgewogcHVibGljOgogCisgICAgZW51bSB7CisgICAgICBrRGlyZWN0aW9uX0xUUiA9IDAsCisgICAgICBrRGlyZWN0aW9uX1JUTCA9IDEKKyAgICB9OworCisgICAgZW51bSB7CisgICAgICBrRGlyZWN0aW9uX01hc2sgPSAweDEKKyAgICB9OworCisgICAgZW51bSB7CisgICAgICBrQmlkaV9MVFIgPSAwLAorICAgICAga0JpZGlfUlRMID0gMSwKKyAgICAgIGtCaWRpX0RlZmF1bHRfTFRSID0gMiwKKyAgICAgIGtCaWRpX0RlZmF1bHRfUlRMID0gMywKKyAgICAgIGtCaWRpX0ZvcmNlX0xUUiA9IDQsCisgICAgICBrQmlkaV9Gb3JjZV9SVEwgPSA1CisgICAgfTsKKwogICAgIHN0YXRpYyB2b2lkIGZpbmFsaXplcihKTklFbnYqIGVudiwgam9iamVjdCBjbGF6eiwgU2tDYW52YXMqIGNhbnZhcykgewogICAgICAgICBjYW52YXMtPnVucmVmKCk7CiAgICAgfQpAQCAtNzQzLDQ1ICs3NjcsMjE4IEBACiAgICAgICAgIGNhbnZhcy0+ZHJhd1ZlcnRpY2VzKG1vZGUsIHB0Q291bnQsIHZlcnRzLCB0ZXhzLCBjb2xvcnMsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGljZXMsIGluZGV4Q291bnQsICpwYWludCk7CiAgICAgfQotICAgIAotICAgIHN0YXRpYyB2b2lkIGRyYXdUZXh0X19fQ0lJRkZQYWludChKTklFbnYqIGVudiwgam9iamVjdCwgU2tDYW52YXMqIGNhbnZhcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamNoYXJBcnJheSB0ZXh0LCBpbnQgaW5kZXgsIGludCBjb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamZsb2F0IHgsIGpmbG9hdCB5LCBTa1BhaW50KiBwYWludCkgewotICAgICAgICBqY2hhciogdGV4dEFycmF5ID0gZW52LT5HZXRDaGFyQXJyYXlFbGVtZW50cyh0ZXh0LCBOVUxMKTsKLSAgICAgICAganNpemUgdGV4dENvdW50ID0gZW52LT5HZXRBcnJheUxlbmd0aCh0ZXh0KTsKLSAgICAgICAgU2tTY2FsYXIgeF8gPSBTa0Zsb2F0VG9TY2FsYXIoeCk7Ci0gICAgICAgIFNrU2NhbGFyIHlfID0gU2tGbG9hdFRvU2NhbGFyKHkpOwotICAgICAgICBjYW52YXMtPmRyYXdUZXh0KHRleHRBcnJheSArIGluZGV4LCBjb3VudCA8PCAxLCB4XywgeV8sICpwYWludCk7Ci0gICAgICAgIGVudi0+UmVsZWFzZUNoYXJBcnJheUVsZW1lbnRzKHRleHQsIHRleHRBcnJheSwgMCk7Ci0gICAgfQotIAotICAgIHN0YXRpYyB2b2lkIGRyYXdUZXh0X19TdHJpbmdJSUZGUGFpbnQoSk5JRW52KiBlbnYsIGpvYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU2tDYW52YXMqIGNhbnZhcywganN0cmluZyB0ZXh0LCBpbnQgc3RhcnQsIGludCBlbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqZmxvYXQgeCwgamZsb2F0IHksIFNrUGFpbnQqIHBhaW50KSB7Ci0gICAgICAgIGNvbnN0IHZvaWQqIHRleHRfID0gZW52LT5HZXRTdHJpbmdDaGFycyh0ZXh0LCBOVUxMKTsKLSAgICAgICAgU2tTY2FsYXIgeF8gPSBTa0Zsb2F0VG9TY2FsYXIoeCk7Ci0gICAgICAgIFNrU2NhbGFyIHlfID0gU2tGbG9hdFRvU2NhbGFyKHkpOwotICAgICAgICBjYW52YXMtPmRyYXdUZXh0KChjb25zdCB1aW50MTZfdCopdGV4dF8gKyBzdGFydCwgKGVuZCAtIHN0YXJ0KSA8PCAxLAotICAgICAgICAgICAgICAgICAgICAgICAgIHhfLCB5XywgKnBhaW50KTsKLSAgICAgICAgZW52LT5SZWxlYXNlU3RyaW5nQ2hhcnModGV4dCwgKGNvbnN0IGpjaGFyKikgdGV4dF8pOwotICAgIH0KLSAgICAKLSAgICBzdGF0aWMgdm9pZCBkcmF3U3RyaW5nKEpOSUVudiogZW52LCBqb2JqZWN0IGNhbnZhcywganN0cmluZyB0ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgamZsb2F0IHgsIGpmbG9hdCB5LCBqb2JqZWN0IHBhaW50KSB7Ci0gICAgICAgIE5QRV9DSEVDS19SRVRVUk5fVk9JRChlbnYsIGNhbnZhcyk7Ci0gICAgICAgIE5QRV9DSEVDS19SRVRVUk5fVk9JRChlbnYsIHBhaW50KTsKLSAgICAgICAgTlBFX0NIRUNLX1JFVFVSTl9WT0lEKGVudiwgdGV4dCk7Ci0gICAgICAgIHNpemVfdCBjb3VudCA9IGVudi0+R2V0U3RyaW5nTGVuZ3RoKHRleHQpOwotICAgICAgICBpZiAoMCA9PSBjb3VudCkgewotICAgICAgICAgICAgcmV0dXJuOworCisgICAgLyoqCisgICAgICogQGNvbnRleHQgdGhlIHRleHQgY29udGV4dAorICAgICAqIEBzdGFydCB0aGUgc3RhcnQgb2YgdGhlIHRleHQgdG8gcmVuZGVyCisgICAgICogQGNvdW50IHRoZSBsZW5ndGggb2YgdGhlIHRleHQgdG8gcmVuZGVyLCBzdGFydCArIGNvdW50ICBtdXN0IGJlIDw9IGxlbgorICAgICAqIEBjb250ZXh0Q291bnQgdGhlIGxlbmd0aCBvZiB0aGUgY29udGV4dAorICAgICAqIEBzaGFwZWQgd2hlcmUgdG8gcHV0IHRoZSBzaGFwZWQgdGV4dCwgbXVzdCBoYXZlIGNhcGFjaXR5IGZvciBjb3VudCB1Y2hhcnMKKyAgICAgKiBAcmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlIHNoYXBlZCB0ZXh0LCBvciAtMSBpZiBlcnJvcgorICAgICAqLworICAgIHN0YXRpYyBpbnQgc2hhcGVSdGxUZXh0X18oY29uc3QgamNoYXIqIGNvbnRleHQsIGpzaXplIHN0YXJ0LCBqc2l6ZSBjb3VudCwganNpemUgY29udGV4dENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamNoYXIqIHNoYXBlZCwgVUVycm9yQ29kZSAmc3RhdHVzKSB7CisgICAgICAgIGpjaGFyIGJ1ZmZlcltjb250ZXh0Q291bnRdOworCisgICAgICAgIC8vIFdlJ2QgcmF0aGVyIHVzZSBoYXJmYnV6eiBoZXJlLiAgVXNlIGNoYXJhY3RlciBiYXNlZCBzaGFwaW5nIGZvciBub3cuCisKKyAgICAgICAgLy8gVXNlIGZpeGVkIGxlbmd0aCBzaW5jZSB3ZSBuZWVkIHRvIGtlZXAgc3RhcnQgYW5kIGNvdW50IHZhbGlkCisgICAgICAgIHVfc2hhcGVBcmFiaWMoY29udGV4dCwgY29udGV4dENvdW50LCBidWZmZXIsIGNvbnRleHRDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgVV9TSEFQRV9MRU5HVEhfRklYRURfU1BBQ0VTX05FQVIgfAorICAgICAgICAgICAgICAgICAgICAgICBVX1NIQVBFX1RFWFRfRElSRUNUSU9OX0xPR0lDQUwgfCBVX1NIQVBFX0xFVFRFUlNfU0hBUEUgfAorICAgICAgICAgICAgICAgICAgICAgICBVX1NIQVBFX1hfTEFNQUxFRl9TVUJfQUxURVJOQVRFLCAmc3RhdHVzKTsKKworICAgICAgICBpZiAoIVVfU1VDQ0VTUyhzdGF0dXMpKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgfQotICAgICAgICBjb25zdCBqY2hhciogdGV4dF8gPSBlbnYtPkdldFN0cmluZ0NoYXJzKHRleHQsIE5VTEwpOwotICAgICAgICBTa0NhbnZhcyogYyA9IEdyYXBoaWNzSk5JOjpnZXROYXRpdmVDYW52YXMoZW52LCBjYW52YXMpOwotICAgICAgICBjLT5kcmF3VGV4dCh0ZXh0XywgY291bnQgPDwgMSwgU2tGbG9hdFRvU2NhbGFyKHgpLCBTa0Zsb2F0VG9TY2FsYXIoeSksCi0gICAgICAgICAgICAgICAgICAgICpHcmFwaGljc0pOSTo6Z2V0TmF0aXZlUGFpbnQoZW52LCBwYWludCkpOwotICAgICAgICBlbnYtPlJlbGVhc2VTdHJpbmdDaGFycyh0ZXh0LCB0ZXh0Xyk7CisKKyAgICAgICAgLy8gdHJpbSBvdXQgMHhmZmZmIGZvbGxvd2luZyBsaWdhdHVyZXMsIGlmIGFueQorICAgICAgICBpbnQgZW5kID0gMDsKKyAgICAgICAgZm9yIChpbnQgaSA9IHN0YXJ0LCBlID0gc3RhcnQgKyBjb3VudDsgaSA8IGU7ICsraSkgeworICAgICAgICAgICAgaWYgKGJ1ZmZlcltpXSA9PSAweGZmZmYpIHsKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBidWZmZXJbZW5kKytdID0gYnVmZmVyW2ldOworICAgICAgICB9CisgICAgICAgIGNvdW50ID0gZW5kOworICAgICAgICAvLyBMT0coTE9HX0lORk8sICJDU1JUTCIsICJzdGFydCAlZCBjb3VudCAlZCBjY291bnQgJWRcbiIsIHN0YXJ0LCBjb3VudCwgY29udGV4dENvdW50KTsKKyAgICAgICAgdWJpZGlfd3JpdGVSZXZlcnNlKGJ1ZmZlciwgY291bnQsIHNoYXBlZCwgY291bnQsIFVCSURJX0RPX01JUlJPUklORyB8IFVCSURJX09VVFBVVF9SRVZFUlNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFVCSURJX0tFRVBfQkFTRV9DT01CSU5JTkcsICZzdGF0dXMpOworICAgICAgICByZXR1cm4gY291bnQ7CiAgICAgfQotICAgIAorCisgICAgc3RhdGljIHZvaWQgZHJhd1RleHRfXyhKTklFbnYqIGVudiwgU2tDYW52YXMqIGNhbnZhcywgY29uc3QgamNoYXIqIHRleHQsIGpzaXplIGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGpmbG9hdCB4LCBqZmxvYXQgeSwgaW50IGZsYWdzLCBTa1BhaW50KiBwYWludCkgeworICAgICAgICBTa1NjYWxhciB4XyA9IFNrRmxvYXRUb1NjYWxhcih4KTsKKyAgICAgICAgU2tTY2FsYXIgeV8gPSBTa0Zsb2F0VG9TY2FsYXIoeSk7CisKKyAgICAgICAgU2tQYWludDo6QWxpZ24gaG9yaXogPSBwYWludC0+Z2V0VGV4dEFsaWduKCk7CisKKyAgICAgICAgYm9vbCBuZWVkQmlkaSA9IChmbGFncyA9PSBrQmlkaV9SVEwpIHx8IChmbGFncyA9PSBrQmlkaV9EZWZhdWx0X1JUTCk7CisgICAgICAgIGlmICghbmVlZEJpZGkgJiYgZmxhZ3MgPCBrQmlkaV9Gb3JjZV9MVFIpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyArK2kpIHsKKyAgICAgICAgICAgICAgICBpZiAodGV4dFtpXSA+PSAweDA1OTApIHsKKyAgICAgICAgICAgICAgICAgICAgbmVlZEJpZGkgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpbnQgZGlyID0gKGZsYWdzID09IGtCaWRpX0ZvcmNlX1JUTCkgPyBrRGlyZWN0aW9uX1JUTCA6IGtEaXJlY3Rpb25fTFRSOyAvLyB3aWxsIGJlIHJlc2V0IGlmIHdlIHJ1biBiaWRpCisgICAgICAgIFVFcnJvckNvZGUgc3RhdHVzID0gVV9aRVJPX0VSUk9SOworICAgICAgICBqY2hhciAqc2hhcGVkID0gTlVMTDsKKyAgICAgICAgaW50MzJfdCBzbGVuID0gMDsKKyAgICAgICAgaWYgKG5lZWRCaWRpIHx8IChmbGFncyA9PSBrQmlkaV9Gb3JjZV9SVEwpKSB7CisgICAgICAgICAgICBzaGFwZWQgPSAoamNoYXIgKiltYWxsb2MobGVuICogc2l6ZW9mKGpjaGFyKSk7CisgICAgICAgICAgICBpZiAoIXNoYXBlZCkgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IFVfTUVNT1JZX0FMTE9DQVRJT05fRVJST1I7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChuZWVkQmlkaSkgeworICAgICAgICAgICAgICAgICAgICBzdGF0aWMgaW50IFJUTF9PUFRTID0gVUJJRElfRE9fTUlSUk9SSU5HIHwgVUJJRElfS0VFUF9CQVNFX0NPTUJJTklORyB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUJJRElfUkVNT1ZFX0JJRElfQ09OVFJPTFMgfCBVQklESV9PVVRQVVRfUkVWRVJTRTsKKyAgICAgICAgICAgICAgICAgICAgamludCBsaW5lRGlyID0gMDsKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChmbGFncykgeworICAgICAgICAgICAgICAgICAgICBjYXNlIGtCaWRpX0xUUjogbGluZURpciA9IDA7IGJyZWFrOyAvLyBubyBJQ1UgY29uc3RhbnQsIGNhbm9uaWNhbCBMVFIgbGV2ZWwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBrQmlkaV9SVEw6IGxpbmVEaXIgPSAxOyBicmVhazsgLy8gbm8gSUNVIGNvbnN0YW50LCBjYW5vbmljYWwgUlRMIGxldmVsCisgICAgICAgICAgICAgICAgICAgIGNhc2Uga0JpZGlfRGVmYXVsdF9MVFI6IGxpbmVEaXIgPSBVQklESV9ERUZBVUxUX0xUUjsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2Uga0JpZGlfRGVmYXVsdF9SVEw6IGxpbmVEaXIgPSBVQklESV9ERUZBVUxUX1JUTDsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBVQmlEaSogYmlkaSA9IHViaWRpX29wZW4oKTsKKyAgICAgICAgICAgICAgICAgICAgdWJpZGlfc2V0UGFyYShiaWRpLCB0ZXh0LCBsZW4sIGxpbmVEaXIsIE5VTEwsICZzdGF0dXMpOworICAgICAgICAgICAgICAgICAgICBpZiAoVV9TVUNDRVNTKHN0YXR1cykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRpciA9IHViaWRpX2dldFBhcmFMZXZlbChiaWRpKSAmIDB4MTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJjID0gdWJpZGlfY291bnRSdW5zKGJpZGksICZzdGF0dXMpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFVfU1VDQ0VTUyhzdGF0dXMpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzdGFydDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGxlbmd0aDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQmlEaURpcmVjdGlvbiBkaXI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgamNoYXIgKmJ1ZmZlciA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByYzsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpciA9IHViaWRpX2dldFZpc3VhbFJ1bihiaWRpLCBpLCAmc3RhcnQsICZsZW5ndGgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmYWtlIHNoYXBpbmcsIGV4Y2VwdCBpdCBkb2Vzbid0IHNoYXBlLCBqdXN0IG1pcnJvcnMgYW5kIHJldmVyc2VzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVzZSBoYXJmYnV6eiB3aGVuIGF2YWlsYWJsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGlyID09IFVCSURJX1JUTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xlbiArPSB1YmlkaV93cml0ZVJldmVyc2UodGV4dCArIHN0YXJ0LCBsZW5ndGgsIHNoYXBlZCArIHNsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGgsIFJUTF9PUFRTLCAmc3RhdHVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFwZWRbc2xlbiArIGldID0gdGV4dFtzdGFydCArIGldOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xlbiArPSBsZW5ndGg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB1YmlkaV9jbG9zZShiaWRpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICBsZW4gPSBzaGFwZVJ0bFRleHRfXyh0ZXh0LCAwLCBsZW4sIGxlbiwgc2hhcGVkLCBzdGF0dXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICghVV9TVUNDRVNTKHN0YXR1cykpIHsKKyAgICAgICAgICAgIGNoYXIgYnVmZmVyWzM1XTsKKyAgICAgICAgICAgIHNwcmludGYoYnVmZmVyLCAiRHJhd1RleHQgYmlkaSBlcnJvciAlZCIsIHN0YXR1cyk7CisgICAgICAgICAgICBkb1Rocm93SUFFKGVudiwgYnVmZmVyKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGJvb2wgdHJpbUxlZnQgPSBmYWxzZTsKKyAgICAgICAgICAgIGJvb2wgdHJpbVJpZ2h0ID0gZmFsc2U7CisKKyAgICAgICAgICAgIHN3aXRjaCAoaG9yaXopIHsKKyAgICAgICAgICAgIGNhc2UgU2tQYWludDo6a0xlZnRfQWxpZ246IHRyaW1MZWZ0ID0gZGlyICYga0RpcmVjdGlvbl9NYXNrOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgU2tQYWludDo6a0NlbnRlcl9BbGlnbjogdHJpbUxlZnQgPSB0cmltUmlnaHQgPSB0cnVlOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgU2tQYWludDo6a1JpZ2h0X0FsaWduOiB0cmltUmlnaHQgPSAhKGRpciAmIGtEaXJlY3Rpb25fTWFzayk7CisgICAgICAgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbnN0IGpjaGFyKiB3b3JrVGV4dCA9IHNoYXBlZCA/IHNoYXBlZCA6IHRleHQ7CisgICAgICAgICAgICBjb25zdCBqY2hhciogd29ya0xpbWl0ID0gd29ya1RleHQgKyBsZW47CisKKyAgICAgICAgICAgIGlmICh0cmltTGVmdCkgeworICAgICAgICAgICAgICAgIHdoaWxlICh3b3JrVGV4dCA8IHdvcmtMaW1pdCAmJiAqd29ya1RleHQgPT0gJyAnKSB7CisgICAgICAgICAgICAgICAgICAgICsrd29ya1RleHQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHRyaW1SaWdodCkgeworICAgICAgICAgICAgICAgIHdoaWxlICh3b3JrTGltaXQgPiB3b3JrVGV4dCAmJiAqKHdvcmtMaW1pdCAtIDEpID09ICcgJykgeworICAgICAgICAgICAgICAgICAgICAtLXdvcmtMaW1pdDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQzMl90IHdvcmtCeXRlcyA9ICh3b3JrTGltaXQgLSB3b3JrVGV4dCkgPDwgMTsKKworICAgICAgICAgICAgY2FudmFzLT5kcmF3VGV4dCh3b3JrVGV4dCwgd29ya0J5dGVzLCB4XywgeV8sICpwYWludCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoc2hhcGVkKSB7CisgICAgICAgICAgICBmcmVlKHNoYXBlZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0aWMgdm9pZCBkcmF3VGV4dF9fX0NJSUZGSVBhaW50KEpOSUVudiogZW52LCBqb2JqZWN0LCBTa0NhbnZhcyogY2FudmFzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqY2hhckFycmF5IHRleHQsIGludCBpbmRleCwgaW50IGNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqZmxvYXQgeCwgamZsb2F0IHksIGludCBmbGFncywgU2tQYWludCogcGFpbnQpIHsKKyAgICAgICAgamNoYXIqIHRleHRBcnJheSA9IGVudi0+R2V0Q2hhckFycmF5RWxlbWVudHModGV4dCwgTlVMTCk7CisgICAgICAgIGRyYXdUZXh0X18oZW52LCBjYW52YXMsIHRleHRBcnJheSArIGluZGV4LCBjb3VudCwgeCwgeSwgZmxhZ3MsIHBhaW50KTsKKyAgICAgICAgZW52LT5SZWxlYXNlQ2hhckFycmF5RWxlbWVudHModGV4dCwgdGV4dEFycmF5LCBKTklfQUJPUlQpOworICAgIH0KKworICAgIHN0YXRpYyB2b2lkIGRyYXdUZXh0X19TdHJpbmdJSUZGSVBhaW50KEpOSUVudiogZW52LCBqb2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2tDYW52YXMqIGNhbnZhcywganN0cmluZyB0ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0LCBpbnQgZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamZsb2F0IHgsIGpmbG9hdCB5LCBpbnQgZmxhZ3MsIFNrUGFpbnQqIHBhaW50KSB7CisgICAgICAgIGNvbnN0IGpjaGFyKiB0ZXh0QXJyYXkgPSBlbnYtPkdldFN0cmluZ0NoYXJzKHRleHQsIE5VTEwpOworICAgICAgICBkcmF3VGV4dF9fKGVudiwgY2FudmFzLCB0ZXh0QXJyYXkgKyBzdGFydCwgZW5kIC0gc3RhcnQsIHgsIHksIGZsYWdzLCBwYWludCk7CisgICAgICAgIGVudi0+UmVsZWFzZVN0cmluZ0NoYXJzKHRleHQsIHRleHRBcnJheSk7CisgICAgfQorCisgICAgLy8gRHJhd3MgYSB1bmlkaXJlY3Rpb25hbCBydW4gb2YgdGV4dC4KKyAgICBzdGF0aWMgdm9pZCBkcmF3VGV4dFJ1bl9fKEpOSUVudiogZW52LCBTa0NhbnZhcyogY2FudmFzLCBjb25zdCBqY2hhciogY2hhcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqaW50IHN0YXJ0LCBqaW50IGNvdW50LCBqaW50IGNvbnRleHRDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpmbG9hdCB4LCBqZmxvYXQgeSwgaW50IGZsYWdzLCBTa1BhaW50KiBwYWludCkgeworCisgICAgICAgIFNrU2NhbGFyIHhfID0gU2tGbG9hdFRvU2NhbGFyKHgpOworICAgICAgICBTa1NjYWxhciB5XyA9IFNrRmxvYXRUb1NjYWxhcih5KTsKKworICAgICAgICB1aW50OF90IHJ0bCA9IGZsYWdzICYgMHgxOworICAgICAgICBpZiAocnRsKSB7CisgICAgICAgICAgICBqY2hhciBjb250ZXh0W2NvbnRleHRDb3VudF07CisgICAgICAgICAgICBVRXJyb3JDb2RlIHN0YXR1cyA9IFVfWkVST19FUlJPUjsKKyAgICAgICAgICAgIGNvdW50ID0gc2hhcGVSdGxUZXh0X18oY2hhcnMsIHN0YXJ0LCBjb3VudCwgY29udGV4dENvdW50LCBjb250ZXh0LCBzdGF0dXMpOworICAgICAgICAgICAgaWYgKFVfU1VDQ0VTUyhzdGF0dXMpKSB7CisgICAgICAgICAgICAgICAgY2FudmFzLT5kcmF3VGV4dChjb250ZXh0LCBjb3VudCA8PCAxLCB4XywgeV8sICpwYWludCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGRvVGhyb3dJQUUoZW52LCAic2hhcGluZyBlcnJvciIpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY2FudmFzLT5kcmF3VGV4dChjaGFycyArIHN0YXJ0LCBjb3VudCA8PCAxLCB4XywgeV8sICpwYWludCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0aWMgdm9pZCBkcmF3VGV4dFJ1bl9fX0NJSUlJRkZJUGFpbnQoCisgICAgICAgIEpOSUVudiogZW52LCBqb2JqZWN0LCBTa0NhbnZhcyogY2FudmFzLCBqY2hhckFycmF5IHRleHQsIGludCBpbmRleCwKKyAgICAgICAgaW50IGNvdW50LCBpbnQgY29udGV4dEluZGV4LCBpbnQgY29udGV4dENvdW50LAorICAgICAgICBqZmxvYXQgeCwgamZsb2F0IHksIGludCBmbGFncywgU2tQYWludCogcGFpbnQpIHsKKworICAgICAgICBqY2hhciogY2hhcnMgPSBlbnYtPkdldENoYXJBcnJheUVsZW1lbnRzKHRleHQsIE5VTEwpOworICAgICAgICBkcmF3VGV4dFJ1bl9fKGVudiwgY2FudmFzLCBjaGFycyArIGNvbnRleHRJbmRleCwgaW5kZXggLSBjb250ZXh0SW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgY291bnQsIGNvbnRleHRDb3VudCwgeCwgeSwgZmxhZ3MsIHBhaW50KTsKKyAgICAgICAgZW52LT5SZWxlYXNlQ2hhckFycmF5RWxlbWVudHModGV4dCwgY2hhcnMsIEpOSV9BQk9SVCk7CisgICAgfQorCisgICAgc3RhdGljIHZvaWQgZHJhd1RleHRSdW5fX1N0cmluZ0lJSUlGRklQYWludCgKKyAgICAgICAgSk5JRW52KiBlbnYsIGpvYmplY3Qgb2JqLCBTa0NhbnZhcyogY2FudmFzLCBqc3RyaW5nIHRleHQsIGppbnQgc3RhcnQsCisgICAgICAgIGppbnQgZW5kLCBqaW50IGNvbnRleHRTdGFydCwgamludCBjb250ZXh0RW5kLAorICAgICAgICBqZmxvYXQgeCwgamZsb2F0IHksIGppbnQgZmxhZ3MsIFNrUGFpbnQqIHBhaW50KSB7CisKKyAgICAgICAgamludCBjb3VudCA9IGVuZCAtIHN0YXJ0OworICAgICAgICBqaW50IGNvbnRleHRDb3VudCA9IGNvbnRleHRFbmQgLSBjb250ZXh0U3RhcnQ7CisgICAgICAgIGNvbnN0IGpjaGFyKiBjaGFycyA9IGVudi0+R2V0U3RyaW5nQ2hhcnModGV4dCwgTlVMTCk7CisgICAgICAgIGRyYXdUZXh0UnVuX18oZW52LCBjYW52YXMsIGNoYXJzICsgY29udGV4dFN0YXJ0LCBzdGFydCAtIGNvbnRleHRTdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICBjb3VudCwgY29udGV4dENvdW50LCB4LCB5LCBmbGFncywgcGFpbnQpOworICAgICAgICBlbnYtPlJlbGVhc2VTdHJpbmdDaGFycyh0ZXh0LCBjaGFycyk7CisgICAgfQorCiAgICAgc3RhdGljIHZvaWQgZHJhd1Bvc1RleHRfX19DSUlfRlBhaW50KEpOSUVudiogZW52LCBqb2JqZWN0LCBTa0NhbnZhcyogY2FudmFzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqY2hhckFycmF5IHRleHQsIGludCBpbmRleCwgaW50IGNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqZmxvYXRBcnJheSBwb3MsIFNrUGFpbnQqIHBhaW50KSB7CkBAIC04MDQsNyArMTAwMSw3IEBACiAgICAgICAgIH0KICAgICAgICAgZGVsZXRlW10gcG9zUHRyOwogICAgIH0KLSAKKwogICAgIHN0YXRpYyB2b2lkIGRyYXdQb3NUZXh0X19TdHJpbmdfRlBhaW50KEpOSUVudiogZW52LCBqb2JqZWN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNrQ2FudmFzKiBjYW52YXMsIGpzdHJpbmcgdGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqZmxvYXRBcnJheSBwb3MsIFNrUGFpbnQqIHBhaW50KSB7CkBAIC04MjcsNyArMTAyNCw3IEBACiAgICAgICAgIH0KICAgICAgICAgZGVsZXRlW10gcG9zUHRyOwogICAgIH0KLSAKKwogICAgIHN0YXRpYyB2b2lkIGRyYXdUZXh0T25QYXRoX19fQ0lJUGF0aEZGUGFpbnQoSk5JRW52KiBlbnYsIGpvYmplY3QsCiAgICAgICAgICAgICAgICAgICAgICAgICBTa0NhbnZhcyogY2FudmFzLCBqY2hhckFycmF5IHRleHQsIGludCBpbmRleCwgaW50IGNvdW50LAogICAgICAgICAgICAgICAgIFNrUGF0aCogcGF0aCwgamZsb2F0IGhPZmZzZXQsIGpmbG9hdCB2T2Zmc2V0LCBTa1BhaW50KiBwYWludCkgewpAQCAtODM3LDcgKzEwMzQsNyBAQAogICAgICAgICAgICAgICAgICAgICBTa0Zsb2F0VG9TY2FsYXIoaE9mZnNldCksIFNrRmxvYXRUb1NjYWxhcih2T2Zmc2V0KSwgKnBhaW50KTsKICAgICAgICAgZW52LT5SZWxlYXNlQ2hhckFycmF5RWxlbWVudHModGV4dCwgdGV4dEFycmF5LCAwKTsKICAgICB9Ci0gCisKICAgICBzdGF0aWMgdm9pZCBkcmF3VGV4dE9uUGF0aF9fU3RyaW5nUGF0aEZGUGFpbnQoSk5JRW52KiBlbnYsIGpvYmplY3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2tDYW52YXMqIGNhbnZhcywganN0cmluZyB0ZXh0LCBTa1BhdGgqIHBhdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamZsb2F0IGhPZmZzZXQsIGpmbG9hdCB2T2Zmc2V0LCBTa1BhaW50KiBwYWludCkgewpAQCAtODQ3LDcgKzEwNDQsNyBAQAogICAgICAgICAgICAgICAgICAgICBTa0Zsb2F0VG9TY2FsYXIoaE9mZnNldCksIFNrRmxvYXRUb1NjYWxhcih2T2Zmc2V0KSwgKnBhaW50KTsKICAgICAgICAgZW52LT5SZWxlYXNlU3RyaW5nQ2hhcnModGV4dCwgdGV4dF8pOwogICAgIH0KLSAKKwogICAgIHN0YXRpYyBib29sIGdldENsaXBCb3VuZHMoSk5JRW52KiBlbnYsIGpvYmplY3QsIFNrQ2FudmFzKiBjYW52YXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqb2JqZWN0IGJvdW5kcykgewogICAgICAgICBTa1JlY3QgICByOwpAQCAtOTQwLDE5ICsxMTM3LDIwIEBACiAgICAgICAgICh2b2lkKikgU2tDYW52YXNHbHVlOjpkcmF3Qml0bWFwUlJ9LAogICAgIHsibmF0aXZlX2RyYXdCaXRtYXAiLCAiKElbSUlJRkZJSVpJKVYiLAogICAgICh2b2lkKilTa0NhbnZhc0dsdWU6OmRyYXdCaXRtYXBBcnJheX0sCi0gICAgCiAgICAgeyJuYXRpdmVEcmF3Qml0bWFwTWF0cml4IiwgIihJSUlJKVYiLAogICAgICAgICAodm9pZCopU2tDYW52YXNHbHVlOjpkcmF3Qml0bWFwTWF0cml4fSwKICAgICB7Im5hdGl2ZURyYXdCaXRtYXBNZXNoIiwgIihJSUlJW0ZJW0lJSSlWIiwKICAgICAgICAgKHZvaWQqKVNrQ2FudmFzR2x1ZTo6ZHJhd0JpdG1hcE1lc2h9LAogICAgIHsibmF0aXZlRHJhd1ZlcnRpY2VzIiwgIihJSUlbRklbRklbSUlbU0lJSSlWIiwKICAgICAgICAgKHZvaWQqKVNrQ2FudmFzR2x1ZTo6ZHJhd1ZlcnRpY2VzfSwKLSAgICB7Im5hdGl2ZV9kcmF3VGV4dCIsIihJW0NJSUZGSSlWIiwKLSAgICAgICAgKHZvaWQqKSBTa0NhbnZhc0dsdWU6OmRyYXdUZXh0X19fQ0lJRkZQYWludH0sCi0gICAgeyJuYXRpdmVfZHJhd1RleHQiLCIoSUxqYXZhL2xhbmcvU3RyaW5nO0lJRkZJKVYiLAotICAgICAgICAodm9pZCopIFNrQ2FudmFzR2x1ZTo6ZHJhd1RleHRfX1N0cmluZ0lJRkZQYWludH0sCi0gICAgeyJkcmF3VGV4dCIsIihMamF2YS9sYW5nL1N0cmluZztGRkxhbmRyb2lkL2dyYXBoaWNzL1BhaW50OylWIiwKLSAgICAgICAgKHZvaWQqKSBTa0NhbnZhc0dsdWU6OmRyYXdTdHJpbmd9LAorICAgIHsibmF0aXZlX2RyYXdUZXh0IiwiKElbQ0lJRkZJSSlWIiwKKyAgICAgICAgKHZvaWQqKSBTa0NhbnZhc0dsdWU6OmRyYXdUZXh0X19fQ0lJRkZJUGFpbnR9LAorICAgIHsibmF0aXZlX2RyYXdUZXh0IiwiKElMamF2YS9sYW5nL1N0cmluZztJSUZGSUkpViIsCisgICAgICAgICh2b2lkKikgU2tDYW52YXNHbHVlOjpkcmF3VGV4dF9fU3RyaW5nSUlGRklQYWludH0sCisgICAgeyJuYXRpdmVfZHJhd1RleHRSdW4iLCIoSVtDSUlJSUZGSUkpViIsCisgICAgICAgICh2b2lkKikgU2tDYW52YXNHbHVlOjpkcmF3VGV4dFJ1bl9fX0NJSUlJRkZJUGFpbnR9LAorICAgIHsibmF0aXZlX2RyYXdUZXh0UnVuIiwiKElMamF2YS9sYW5nL1N0cmluZztJSUlJRkZJSSlWIiwKKyAgICAgICAgKHZvaWQqKSBTa0NhbnZhc0dsdWU6OmRyYXdUZXh0UnVuX19TdHJpbmdJSUlJRkZJUGFpbnR9LAogICAgIHsibmF0aXZlX2RyYXdQb3NUZXh0IiwiKElbQ0lJW0ZJKVYiLAogICAgICAgICAodm9pZCopIFNrQ2FudmFzR2x1ZTo6ZHJhd1Bvc1RleHRfX19DSUlfRlBhaW50fSwKICAgICB7Im5hdGl2ZV9kcmF3UG9zVGV4dCIsIihJTGphdmEvbGFuZy9TdHJpbmc7W0ZJKVYiLApkaWZmIC0tZ2l0IGEvY29yZS9qbmkvYW5kcm9pZC9ncmFwaGljcy9QYWludC5jcHAgYi9jb3JlL2puaS9hbmRyb2lkL2dyYXBoaWNzL1BhaW50LmNwcAppbmRleCA3ODBiYWRjLi5jYTljOWRlIDEwMDY0NAotLS0gYS9jb3JlL2puaS9hbmRyb2lkL2dyYXBoaWNzL1BhaW50LmNwcAorKysgYi9jb3JlL2puaS9hbmRyb2lkL2dyYXBoaWNzL1BhaW50LmNwcApAQCAtMzEsNiArMzEsMTAgQEAKICNpbmNsdWRlICJTa1NoYWRlci5oIgogI2luY2x1ZGUgIlNrVHlwZWZhY2UuaCIKICNpbmNsdWRlICJTa1hmZXJtb2RlLmgiCisjaW5jbHVkZSAidW5pY29kZS91c2hhcGUuaCIKKworLy8gdGVtcG9yYXJ5IGZvciBkZWJ1Z2dpbmcKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC01Nyw2ICs2MSw5IEBACiAKIGNsYXNzIFNrUGFpbnRHbHVlIHsKIHB1YmxpYzoKKyAgICBlbnVtIE1vdmVPcHQgeworICAgICAgICBBRlRFUiwgQVRfT1JfQUZURVIsIEJFRk9SRSwgQVRfT1JfQkVGT1JFLCBBVAorICAgIH07CiAKICAgICBzdGF0aWMgdm9pZCBmaW5hbGl6ZXIoSk5JRW52KiBlbnYsIGpvYmplY3QgY2xhenosIFNrUGFpbnQqIG9iaikgewogICAgICAgICBkZWxldGUgb2JqOwpAQCAtMzk1LDcgKzQwMiwxODQgQEAKICAgICAgICAgZW52LT5SZWxlYXNlU3RyaW5nQ2hhcnModGV4dCwgdGV4dEFycmF5KTsKICAgICAgICAgcmV0dXJuIGNvdW50OwogICAgIH0KLSAgICAKKworICAgIHN0YXRpYyBqZmxvYXQgZG9UZXh0UnVuQWR2YW5jZXMoSk5JRW52ICplbnYsIFNrUGFpbnQgKnBhaW50LCBjb25zdCBqY2hhciAqdGV4dCwgamludCBzdGFydCwgamludCBjb3VudCwgamludCBjb250ZXh0Q291bnQsIGppbnQgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqZmxvYXRBcnJheSBhZHZhbmNlcywgamludCBhZHZhbmNlc0luZGV4KSB7CisgICAgICAgIGpmbG9hdCBhZHZhbmNlc0FycmF5W2NvdW50XTsKKyAgICAgICAgamNoYXIgYnVmZmVyW2NvbnRleHRDb3VudF07CisKKyAgICAgICAgU2tTY2FsYXIqIHNjYWxhckFycmF5ID0gKFNrU2NhbGFyICopYWR2YW5jZXNBcnJheTsKKyAgICAgICAgamZsb2F0IHRvdGFsQWR2YW5jZSA9IDA7CisKKyAgICAgICAgLy8gdGhpcyBpcyB3aGVyZSB3ZSdkIGNhbGwgaGFyZmJ1enoKKyAgICAgICAgLy8gZm9yIG5vdyB3ZSBqdXN0IHVzZSB1c2hhcGUuYworCisgICAgICAgIGludCB3aWR0aHM7CisgICAgICAgIGlmIChmbGFncyAmIDB4MSkgeyAvLyBydGwsIGNhbGwgYXJhYmljIHNoYXBpbmcgaW4gY2FzZQorICAgICAgICAgICAgVUVycm9yQ29kZSBzdGF0dXMgPSBVX1pFUk9fRVJST1I7CisgICAgICAgICAgICAvLyBVc2UgZml4ZWQgbGVuZ3RoIHNpbmNlIHdlIG5lZWQgdG8ga2VlcCBzdGFydCBhbmQgY291bnQgdmFsaWQKKyAgICAgICAgICAgIHVfc2hhcGVBcmFiaWModGV4dCwgY29udGV4dENvdW50LCBidWZmZXIsIGNvbnRleHRDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVV9TSEFQRV9MRU5HVEhfRklYRURfU1BBQ0VTX05FQVIgfAorICAgICAgICAgICAgICAgICAgICAgICAgICBVX1NIQVBFX1RFWFRfRElSRUNUSU9OX0xPR0lDQUwgfCBVX1NIQVBFX0xFVFRFUlNfU0hBUEUgfAorICAgICAgICAgICAgICAgICAgICAgICAgICBVX1NIQVBFX1hfTEFNQUxFRl9TVUJfQUxURVJOQVRFLCAmc3RhdHVzKTsKKyAgICAgICAgICAgIC8vIHdlIHNob3VsZG4ndCBmYWlsIHVubGVzcyB0aGVyZSdzIGFuIG91dCBvZiBtZW1vcnkgY29uZGl0aW9uLAorICAgICAgICAgICAgLy8gaW4gd2hpY2ggY2FzZSB3ZSdyZSBob3NlZCBhbnl3YXkKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSBzdGFydCwgZSA9IGkgKyBjb3VudDsgaSA8IGU7ICsraSkgeworICAgICAgICAgICAgICBpZiAoYnVmZmVyW2ldID09IDB4ZmZmZikgeworICAgICAgICAgICAgICAgIGJ1ZmZlcltpXSA9IDB4MjAwYjsgLy8gemVyby13aWR0aC1zcGFjZSBmb3Igc2tpYQorICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3aWR0aHMgPSBwYWludC0+Z2V0VGV4dFdpZHRocyhidWZmZXIgKyBzdGFydCwgY291bnQgPDwgMSwgc2NhbGFyQXJyYXkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgd2lkdGhzID0gcGFpbnQtPmdldFRleHRXaWR0aHModGV4dCArIHN0YXJ0LCBjb3VudCA8PCAxLCBzY2FsYXJBcnJheSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAod2lkdGhzIDwgY291bnQpIHsKKyAgICAgICAgICAgIC8vIFNraWEgb3BlcmF0ZXMgb24gY29kZSBwb2ludHMsIG5vdCBjb2RlIHVuaXRzLCBzbyBzdXJyb2dhdGUgcGFpcnMgcmV0dXJuIG9ubHkKKyAgICAgICAgICAgIC8vIG9uZSB2YWx1ZS4gRXhwYW5kIHRoZSByZXN1bHQgc28gd2UgaGF2ZSBvbmUgdmFsdWUgcGVyIFVURi0xNiBjb2RlIHVuaXQuCisKKyAgICAgICAgICAgIC8vIE5vdGUsIHNraWEncyBnZXRUZXh0V2lkdGggZ2V0cyBjb25mdXNlZCBpZiBpdCBlbmNvdW50ZXJzIGEgc3Vycm9nYXRlIHBhaXIsCisgICAgICAgICAgICAvLyBsZWF2aW5nIHRoZSByZW1haW5pbmcgd2lkdGhzIHplcm8uICBOb3QgbmljZS4KKyAgICAgICAgICAgIGNvbnN0IGpjaGFyICpjaGFycyA9IHRleHQgKyBzdGFydDsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwLCBwID0gMDsgaSA8IHdpZHRoczsgKytpKSB7CisgICAgICAgICAgICAgICAgdG90YWxBZHZhbmNlICs9IGFkdmFuY2VzQXJyYXlbcCsrXSA9IFNrU2NhbGFyVG9GbG9hdChzY2FsYXJBcnJheVtpXSk7CisgICAgICAgICAgICAgICAgaWYgKHAgPCBjb3VudCAmJiBjaGFyc1twXSA+PSAweGRjMDAgJiYgY2hhcnNbcF0gPCAweGUwMDAgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJzW3AtMV0gPj0gMHhkODAwICYmIGNoYXJzW3AtMV0gPCAweGRjMDApIHsKKyAgICAgICAgICAgICAgICAgICAgYWR2YW5jZXNBcnJheVtwKytdID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICB0b3RhbEFkdmFuY2UgKz0gYWR2YW5jZXNBcnJheVtpXSA9IFNrU2NhbGFyVG9GbG9hdChzY2FsYXJBcnJheVtpXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoYWR2YW5jZXMgIT0gTlVMTCkgeworICAgICAgICAgICAgZW52LT5TZXRGbG9hdEFycmF5UmVnaW9uKGFkdmFuY2VzLCBhZHZhbmNlc0luZGV4LCBjb3VudCwgYWR2YW5jZXNBcnJheSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRvdGFsQWR2YW5jZTsKKyAgICB9CisKKyAgICBzdGF0aWMgZmxvYXQgZ2V0VGV4dFJ1bkFkdmFuY2VzX19fQ0lJSUlJX0ZJKEpOSUVudiogZW52LCBqb2JqZWN0IGNsYXp6LCBTa1BhaW50KiBwYWludCwKKyAgICAgICAgICAgIGpjaGFyQXJyYXkgdGV4dCwgamludCBpbmRleCwgamludCBjb3VudCwgamludCBjb250ZXh0SW5kZXgsIGppbnQgY29udGV4dENvdW50LAorICAgICAgICAgICAgamludCBmbGFncywgamZsb2F0QXJyYXkgYWR2YW5jZXMsIGppbnQgYWR2YW5jZXNJbmRleCkgeworICAgICAgICBqY2hhciogdGV4dEFycmF5ID0gZW52LT5HZXRDaGFyQXJyYXlFbGVtZW50cyh0ZXh0LCBOVUxMKTsKKyAgICAgICAgamZsb2F0IHJlc3VsdCA9IGRvVGV4dFJ1bkFkdmFuY2VzKGVudiwgcGFpbnQsIHRleHRBcnJheSArIGNvbnRleHRJbmRleCwKKyAgICAgICAgICAgIGluZGV4IC0gY29udGV4dEluZGV4LCBjb3VudCwgY29udGV4dENvdW50LCBmbGFncywgYWR2YW5jZXMsIGFkdmFuY2VzSW5kZXgpOworICAgICAgICBlbnYtPlJlbGVhc2VDaGFyQXJyYXlFbGVtZW50cyh0ZXh0LCB0ZXh0QXJyYXksIEpOSV9BQk9SVCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgc3RhdGljIGZsb2F0IGdldFRleHRSdW5BZHZhbmNlc19fU3RyaW5nSUlJSUlfRkkoSk5JRW52KiBlbnYsIGpvYmplY3QgY2xhenosIFNrUGFpbnQqIHBhaW50LAorICAgICAgICAgICAganN0cmluZyB0ZXh0LCBqaW50IHN0YXJ0LCBqaW50IGVuZCwgamludCBjb250ZXh0U3RhcnQsIGppbnQgY29udGV4dEVuZCwgamludCBmbGFncywKKyAgICAgICAgICAgIGpmbG9hdEFycmF5IGFkdmFuY2VzLCBqaW50IGFkdmFuY2VzSW5kZXgpIHsKKyAgICAgICAgY29uc3QgamNoYXIqIHRleHRBcnJheSA9IGVudi0+R2V0U3RyaW5nQ2hhcnModGV4dCwgTlVMTCk7CisgICAgICAgIGpmbG9hdCByZXN1bHQgPSBkb1RleHRSdW5BZHZhbmNlcyhlbnYsIHBhaW50LCB0ZXh0QXJyYXkgKyBjb250ZXh0U3RhcnQsCisgICAgICAgICAgICBzdGFydCAtIGNvbnRleHRTdGFydCwgZW5kIC0gc3RhcnQsIGNvbnRleHRFbmQgLSBjb250ZXh0U3RhcnQsIGZsYWdzLCBhZHZhbmNlcywKKyAgICAgICAgICAgIGFkdmFuY2VzSW5kZXgpOworICAgICAgICBlbnYtPlJlbGVhc2VTdHJpbmdDaGFycyh0ZXh0LCB0ZXh0QXJyYXkpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIHN0YXRpYyBqaW50IGRvVGV4dFJ1bkN1cnNvcihKTklFbnYgKmVudiwgU2tQYWludCogcGFpbnQsIGNvbnN0IGpjaGFyICp0ZXh0LCBqaW50IHN0YXJ0LAorICAgICAgICAgICAgamludCBjb3VudCwgamludCBmbGFncywgamludCBvZmZzZXQsIGppbnQgb3B0KSB7CisgICAgICAgIFNrU2NhbGFyIHNjYWxhckFycmF5W2NvdW50XTsKKyAgICAgICAgamNoYXIgYnVmZmVyW2NvdW50XTsKKworICAgICAgICAvLyB0aGlzIGlzIHdoZXJlIHdlJ2QgY2FsbCBoYXJmYnV6egorICAgICAgICAvLyBmb3Igbm93IHdlIGp1c3QgdXNlIHVzaGFwZS5jIGFuZCB3aWR0aHMgcmV0dXJuZWQgZnJvbSBza2lhCisKKyAgICAgICAgaW50IHdpZHRoczsKKyAgICAgICAgaWYgKGZsYWdzICYgMHgxKSB7IC8vIHJ0bCwgY2FsbCBhcmFiaWMgc2hhcGluZyBpbiBjYXNlCisgICAgICAgICAgICBVRXJyb3JDb2RlIHN0YXR1cyA9IFVfWkVST19FUlJPUjsKKyAgICAgICAgICAgIC8vIFVzZSBmaXhlZCBsZW5ndGggc2luY2Ugd2UgbmVlZCB0byBrZWVwIHN0YXJ0IGFuZCBjb3VudCB2YWxpZAorICAgICAgICAgICAgdV9zaGFwZUFyYWJpYyh0ZXh0ICsgc3RhcnQsIGNvdW50LCBidWZmZXIsIGNvdW50LAorICAgICAgICAgICAgICAgICAgICBVX1NIQVBFX0xFTkdUSF9GSVhFRF9TUEFDRVNfTkVBUiB8IFVfU0hBUEVfVEVYVF9ESVJFQ1RJT05fTE9HSUNBTCB8CisgICAgICAgICAgICAgICAgICAgIFVfU0hBUEVfTEVUVEVSU19TSEFQRSB8IFVfU0hBUEVfWF9MQU1BTEVGX1NVQl9BTFRFUk5BVEUsICZzdGF0dXMpOworICAgICAgICAgICAgLy8gd2Ugc2hvdWxkbid0IGZhaWwgdW5sZXNzIHRoZXJlJ3MgYW4gb3V0IG9mIG1lbW9yeSBjb25kaXRpb24sCisgICAgICAgICAgICAvLyBpbiB3aGljaCBjYXNlIHdlJ3JlIGhvc2VkIGFueXdheQorICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7CisgICAgICAgICAgICAgIGlmIChidWZmZXJbaV0gPT0gMHhmZmZmKSB7CisgICAgICAgICAgICAgICAgYnVmZmVyW2ldID0gMHgyMDBiOyAvLyB6ZXJvLXdpZHRoLXNwYWNlIGZvciBza2lhCisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdpZHRocyA9IHBhaW50LT5nZXRUZXh0V2lkdGhzKGJ1ZmZlciwgY291bnQgPDwgMSwgc2NhbGFyQXJyYXkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgd2lkdGhzID0gcGFpbnQtPmdldFRleHRXaWR0aHModGV4dCArIHN0YXJ0LCBjb3VudCA8PCAxLCBzY2FsYXJBcnJheSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAod2lkdGhzIDwgY291bnQpIHsKKyAgICAgICAgICAgIC8vIFNraWEgb3BlcmF0ZXMgb24gY29kZSBwb2ludHMsIG5vdCBjb2RlIHVuaXRzLCBzbyBzdXJyb2dhdGUgcGFpcnMgcmV0dXJuIG9ubHkgb25lCisgICAgICAgICAgICAvLyB2YWx1ZS4gRXhwYW5kIHRoZSByZXN1bHQgc28gd2UgaGF2ZSBvbmUgdmFsdWUgcGVyIFVURi0xNiBjb2RlIHVuaXQuCisKKyAgICAgICAgICAgIC8vIE5vdGUsIHNraWEncyBnZXRUZXh0V2lkdGggZ2V0cyBjb25mdXNlZCBpZiBpdCBlbmNvdW50ZXJzIGEgc3Vycm9nYXRlIHBhaXIsCisgICAgICAgICAgICAvLyBsZWF2aW5nIHRoZSByZW1haW5pbmcgd2lkdGhzIHplcm8uICBOb3QgbmljZS4KKyAgICAgICAgICAgIGNvbnN0IGpjaGFyICpjaGFycyA9IHRleHQgKyBzdGFydDsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSBjb3VudCwgcCA9IHdpZHRocyAtIDE7IC0taSA+IHA7KSB7CisgICAgICAgICAgICAgICAgaWYgKGNoYXJzW2ldID49IDB4ZGMwMCAmJiBjaGFyc1tpXSA8IDB4ZTAwMCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgY2hhcnNbaS0xXSA+PSAweGQ4MDAgJiYgY2hhcnNbaS0xXSA8IDB4ZGMwMCkgeworICAgICAgICAgICAgICAgICAgICBzY2FsYXJBcnJheVtpXSA9IDA7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgIHNjYWxhckFycmF5W2ldID0gc2NhbGFyQXJyYXlbLS1wXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBqaW50IHBvcyA9IG9mZnNldCAtIHN0YXJ0OworICAgICAgICBzd2l0Y2ggKG9wdCkgeworICAgICAgICBjYXNlIEFGVEVSOgorICAgICAgICAgIGlmIChwb3MgPCBjb3VudCkgeworICAgICAgICAgICAgcG9zICs9IDE7CisgICAgICAgICAgfQorICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaAorICAgICAgICBjYXNlIEFUX09SX0FGVEVSOgorICAgICAgICAgIHdoaWxlIChwb3MgPCBjb3VudCAmJiBzY2FsYXJBcnJheVtwb3NdID09IDApIHsKKyAgICAgICAgICAgICsrcG9zOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCRUZPUkU6CisgICAgICAgICAgaWYgKHBvcyA+IDApIHsKKyAgICAgICAgICAgIC0tcG9zOworICAgICAgICAgIH0KKyAgICAgICAgICAvLyBmYWxsIHRocm91Z2gKKyAgICAgICAgY2FzZSBBVF9PUl9CRUZPUkU6CisgICAgICAgICAgd2hpbGUgKHBvcyA+IDAgJiYgc2NhbGFyQXJyYXlbcG9zXSA9PSAwKSB7CisgICAgICAgICAgICAtLXBvczsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVQ6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgaWYgKHNjYWxhckFycmF5W3Bvc10gPT0gMCkgeworICAgICAgICAgICAgcG9zID0gLTE7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHBvcyAhPSAtMSkgeworICAgICAgICAgIHBvcyArPSBzdGFydDsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBwb3M7CisgICAgfQorCisgICAgc3RhdGljIGppbnQgZ2V0VGV4dFJ1bkN1cnNvcl9fX0MoSk5JRW52KiBlbnYsIGpvYmplY3QgY2xhenosIFNrUGFpbnQqIHBhaW50LCBqY2hhckFycmF5IHRleHQsCisgICAgICAgICAgICBqaW50IGNvbnRleHRTdGFydCwgamludCBjb250ZXh0Q291bnQsIGppbnQgZmxhZ3MsIGppbnQgb2Zmc2V0LCBqaW50IGN1cnNvck9wdCkgeworICAgICAgICBqY2hhciogdGV4dEFycmF5ID0gZW52LT5HZXRDaGFyQXJyYXlFbGVtZW50cyh0ZXh0LCBOVUxMKTsKKyAgICAgICAgamludCByZXN1bHQgPSBkb1RleHRSdW5DdXJzb3IoZW52LCBwYWludCwgdGV4dEFycmF5LCBjb250ZXh0U3RhcnQsIGNvbnRleHRDb3VudCwgZmxhZ3MsCisgICAgICAgICAgICAgICAgb2Zmc2V0LCBjdXJzb3JPcHQpOworICAgICAgICBlbnYtPlJlbGVhc2VDaGFyQXJyYXlFbGVtZW50cyh0ZXh0LCB0ZXh0QXJyYXksIEpOSV9BQk9SVCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgc3RhdGljIGppbnQgZ2V0VGV4dFJ1bkN1cnNvcl9fU3RyaW5nKEpOSUVudiogZW52LCBqb2JqZWN0IGNsYXp6LCBTa1BhaW50KiBwYWludCwganN0cmluZyB0ZXh0LAorICAgICAgICAgICAgamludCBjb250ZXh0U3RhcnQsIGppbnQgY29udGV4dEVuZCwgamludCBmbGFncywgamludCBvZmZzZXQsIGppbnQgY3Vyc29yT3B0KSB7CisgICAgICAgIGNvbnN0IGpjaGFyKiB0ZXh0QXJyYXkgPSBlbnYtPkdldFN0cmluZ0NoYXJzKHRleHQsIE5VTEwpOworICAgICAgICBqaW50IHJlc3VsdCA9IGRvVGV4dFJ1bkN1cnNvcihlbnYsIHBhaW50LCB0ZXh0QXJyYXksIGNvbnRleHRTdGFydCwKKyAgICAgICAgICAgICAgICBjb250ZXh0RW5kIC0gY29udGV4dFN0YXJ0LCBmbGFncywgb2Zmc2V0LCBjdXJzb3JPcHQpOworICAgICAgICBlbnYtPlJlbGVhc2VTdHJpbmdDaGFycyh0ZXh0LCB0ZXh0QXJyYXkpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKwogICAgIHN0YXRpYyB2b2lkIGdldFRleHRQYXRoX19fQ0lJRkZQYXRoKEpOSUVudiogZW52LCBqb2JqZWN0IGNsYXp6LCBTa1BhaW50KiBwYWludCwgamNoYXJBcnJheSB0ZXh0LCBpbnQgaW5kZXgsIGludCBjb3VudCwgamZsb2F0IHgsIGpmbG9hdCB5LCBTa1BhdGgqIHBhdGgpIHsKICAgICAgICAgY29uc3QgamNoYXIqIHRleHRBcnJheSA9IGVudi0+R2V0Q2hhckFycmF5RWxlbWVudHModGV4dCwgTlVMTCk7CiAgICAgICAgIHBhaW50LT5nZXRUZXh0UGF0aCh0ZXh0QXJyYXkgKyBpbmRleCwgY291bnQgPDwgMSwgU2tGbG9hdFRvU2NhbGFyKHgpLCBTa0Zsb2F0VG9TY2FsYXIoeSksIHBhdGgpOwpAQCAtNTc2LDYgKzc2MCwxMyBAQAogICAgIHsibmF0aXZlX2JyZWFrVGV4dCIsIihMamF2YS9sYW5nL1N0cmluZztaRltGKUkiLCAodm9pZCopIFNrUGFpbnRHbHVlOjpicmVha1RleHRTfSwKICAgICB7Im5hdGl2ZV9nZXRUZXh0V2lkdGhzIiwiKElbQ0lJW0YpSSIsICh2b2lkKikgU2tQYWludEdsdWU6OmdldFRleHRXaWR0aHNfX19DSUlfRn0sCiAgICAgeyJuYXRpdmVfZ2V0VGV4dFdpZHRocyIsIihJTGphdmEvbGFuZy9TdHJpbmc7SUlbRilJIiwgKHZvaWQqKSBTa1BhaW50R2x1ZTo6Z2V0VGV4dFdpZHRoc19fU3RyaW5nSUlfRn0sCisgICAgeyJuYXRpdmVfZ2V0VGV4dFJ1bkFkdmFuY2VzIiwiKElbQ0lJSUlJW0ZJKUYiLCAodm9pZCopCisgICAgICAgIFNrUGFpbnRHbHVlOjpnZXRUZXh0UnVuQWR2YW5jZXNfX19DSUlJSUlfRkl9LAorICAgIHsibmF0aXZlX2dldFRleHRSdW5BZHZhbmNlcyIsIihJTGphdmEvbGFuZy9TdHJpbmc7SUlJSUlbRkkpRiIsCisgICAgICAgICh2b2lkKikgU2tQYWludEdsdWU6OmdldFRleHRSdW5BZHZhbmNlc19fU3RyaW5nSUlJSUlfRkl9LAorICAgIHsibmF0aXZlX2dldFRleHRSdW5DdXJzb3IiLCAiKElbQ0lJSUlJKUkiLCAodm9pZCopIFNrUGFpbnRHbHVlOjpnZXRUZXh0UnVuQ3Vyc29yX19fQ30sCisgICAgeyJuYXRpdmVfZ2V0VGV4dFJ1bkN1cnNvciIsICIoSUxqYXZhL2xhbmcvU3RyaW5nO0lJSUlJKUkiLAorICAgICAgICAodm9pZCopIFNrUGFpbnRHbHVlOjpnZXRUZXh0UnVuQ3Vyc29yX19TdHJpbmd9LAogICAgIHsibmF0aXZlX2dldFRleHRQYXRoIiwiKElbQ0lJRkZJKVYiLCAodm9pZCopIFNrUGFpbnRHbHVlOjpnZXRUZXh0UGF0aF9fX0NJSUZGUGF0aH0sCiAgICAgeyJuYXRpdmVfZ2V0VGV4dFBhdGgiLCIoSUxqYXZhL2xhbmcvU3RyaW5nO0lJRkZJKVYiLCAodm9pZCopIFNrUGFpbnRHbHVlOjpnZXRUZXh0UGF0aF9fU3RyaW5nSUlGRlBhdGh9LAogICAgIHsibmF0aXZlR2V0U3RyaW5nQm91bmRzIiwgIihJTGphdmEvbGFuZy9TdHJpbmc7SUlMYW5kcm9pZC9ncmFwaGljcy9SZWN0OylWIiwKZGlmZiAtLWdpdCBhL2NvcmUvam5pL2FuZHJvaWRfYmx1ZXRvb3RoX2NvbW1vbi5jcHAgYi9jb3JlL2puaS9hbmRyb2lkX2JsdWV0b290aF9jb21tb24uY3BwCmluZGV4IDlhOGYxYjguLjUzYWM2MjUgMTAwNjQ0Ci0tLSBhL2NvcmUvam5pL2FuZHJvaWRfYmx1ZXRvb3RoX2NvbW1vbi5jcHAKKysrIGIvY29yZS9qbmkvYW5kcm9pZF9ibHVldG9vdGhfY29tbW9uLmNwcApAQCAtNjgsNiArNjgsMTAgQEAKICAgICB7IlVVSURzIiwgREJVU19UWVBFX0FSUkFZfSwKIH07CiAKK3N0YXRpYyBQcm9wZXJ0aWVzIGlucHV0X3Byb3BlcnRpZXNbXSA9IHsKKyAgICB7IkNvbm5lY3RlZCIsIERCVVNfVFlQRV9CT09MRUFOfSwKK307CisKIHR5cGVkZWYgdW5pb24gewogICAgIGNoYXIgKnN0cl92YWw7CiAgICAgaW50IGludF92YWw7CkBAIC02OTgsNiArNzAyLDExIEBACiAgICAgICAgICAgICAgICAgICAgIHNpemVvZihyZW1vdGVfZGV2aWNlX3Byb3BlcnRpZXMpIC8gc2l6ZW9mKFByb3BlcnRpZXMpKTsKIH0KIAoram9iamVjdEFycmF5IHBhcnNlX2lucHV0X3Byb3BlcnR5X2NoYW5nZShKTklFbnYgKmVudiwgREJ1c01lc3NhZ2UgKm1zZykgeworICAgIHJldHVybiBwYXJzZV9wcm9wZXJ0eV9jaGFuZ2UoZW52LCBtc2csIChQcm9wZXJ0aWVzICopICZpbnB1dF9wcm9wZXJ0aWVzLAorICAgICAgICAgICAgICAgICAgICBzaXplb2YoaW5wdXRfcHJvcGVydGllcykgLyBzaXplb2YoUHJvcGVydGllcykpOworfQorCiBqb2JqZWN0QXJyYXkgcGFyc2VfYWRhcHRlcl9wcm9wZXJ0aWVzKEpOSUVudiAqZW52LCBEQnVzTWVzc2FnZUl0ZXIgKml0ZXIpIHsKICAgICByZXR1cm4gcGFyc2VfcHJvcGVydGllcyhlbnYsIGl0ZXIsIChQcm9wZXJ0aWVzICopICZhZGFwdGVyX3Byb3BlcnRpZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGFkYXB0ZXJfcHJvcGVydGllcykgLyBzaXplb2YoUHJvcGVydGllcykpOwpAQCAtNzA4LDYgKzcxNywxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YocmVtb3RlX2RldmljZV9wcm9wZXJ0aWVzKSAvIHNpemVvZihQcm9wZXJ0aWVzKSk7CiB9CiAKK2pvYmplY3RBcnJheSBwYXJzZV9pbnB1dF9wcm9wZXJ0aWVzKEpOSUVudiAqZW52LCBEQnVzTWVzc2FnZUl0ZXIgKml0ZXIpIHsKKyAgICByZXR1cm4gcGFyc2VfcHJvcGVydGllcyhlbnYsIGl0ZXIsIChQcm9wZXJ0aWVzICopICZpbnB1dF9wcm9wZXJ0aWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoaW5wdXRfcHJvcGVydGllcykgLyBzaXplb2YoUHJvcGVydGllcykpOworfQorCiBpbnQgZ2V0X2JkYWRkcihjb25zdCBjaGFyICpzdHIsIGJkYWRkcl90ICpiYSkgewogICAgIGNoYXIgKmQgPSAoKGNoYXIgKiliYSkgKyA1LCAqZW5kcDsKICAgICBpbnQgaTsKZGlmZiAtLWdpdCBhL2NvcmUvam5pL2FuZHJvaWRfYmx1ZXRvb3RoX2NvbW1vbi5oIGIvY29yZS9qbmkvYW5kcm9pZF9ibHVldG9vdGhfY29tbW9uLmgKaW5kZXggMzc4YmI2Zi4uMjdhMDBhZSAxMDA2NDQKLS0tIGEvY29yZS9qbmkvYW5kcm9pZF9ibHVldG9vdGhfY29tbW9uLmgKKysrIGIvY29yZS9qbmkvYW5kcm9pZF9ibHVldG9vdGhfY29tbW9uLmgKQEAgLTE2Miw2ICsxNjIsOCBAQAogam9iamVjdEFycmF5IHBhcnNlX3JlbW90ZV9kZXZpY2VfcHJvcGVydGllcyhKTklFbnYgKmVudiwgREJ1c01lc3NhZ2VJdGVyICppdGVyKTsKIGpvYmplY3RBcnJheSBwYXJzZV9yZW1vdGVfZGV2aWNlX3Byb3BlcnR5X2NoYW5nZShKTklFbnYgKmVudiwgREJ1c01lc3NhZ2UgKm1zZyk7CiBqb2JqZWN0QXJyYXkgcGFyc2VfYWRhcHRlcl9wcm9wZXJ0eV9jaGFuZ2UoSk5JRW52ICplbnYsIERCdXNNZXNzYWdlICptc2cpOworam9iamVjdEFycmF5IHBhcnNlX2lucHV0X3Byb3BlcnRpZXMoSk5JRW52ICplbnYsIERCdXNNZXNzYWdlSXRlciAqaXRlcik7Citqb2JqZWN0QXJyYXkgcGFyc2VfaW5wdXRfcHJvcGVydHlfY2hhbmdlKEpOSUVudiAqZW52LCBEQnVzTWVzc2FnZSAqbXNnKTsKIHZvaWQgYXBwZW5kX3ZhcmlhbnQoREJ1c01lc3NhZ2VJdGVyICppdGVyLCBpbnQgdHlwZSwgdm9pZCAqdmFsKTsKIGludCBnZXRfYmRhZGRyKGNvbnN0IGNoYXIgKnN0ciwgYmRhZGRyX3QgKmJhKTsKIHZvaWQgZ2V0X2JkYWRkcl9hc19zdHJpbmcoY29uc3QgYmRhZGRyX3QgKmJhLCBjaGFyICpzdHIpOwpkaWZmIC0tZ2l0IGEvY29yZS9qbmkvYW5kcm9pZF9kYXRhYmFzZV9DdXJzb3JXaW5kb3cuY3BwIGIvY29yZS9qbmkvYW5kcm9pZF9kYXRhYmFzZV9DdXJzb3JXaW5kb3cuY3BwCmluZGV4IDkxNDQ5YmMuLjA0MGRhYzMgMTAwNjQ0Ci0tLSBhL2NvcmUvam5pL2FuZHJvaWRfZGF0YWJhc2VfQ3Vyc29yV2luZG93LmNwcAorKysgYi9jb3JlL2puaS9hbmRyb2lkX2RhdGFiYXNlX0N1cnNvcldpbmRvdy5jcHAKQEAgLTI5LDcgKzI5LDcgQEAKICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KIAotI2luY2x1ZGUgIkN1cnNvcldpbmRvdy5oIgorI2luY2x1ZGUgImJpbmRlci9DdXJzb3JXaW5kb3cuaCIKICNpbmNsdWRlICJzcWxpdGUzX2V4Y2VwdGlvbi5oIgogI2luY2x1ZGUgImFuZHJvaWRfdXRpbF9CaW5kZXIuaCIKIApAQCAtMjI1LDcwICsyMjUsNiBAQAogICAgIHJldHVybiBOVUxMOwogfQogCi1zdGF0aWMgamJvb2xlYW4gaXNCbG9iX25hdGl2ZShKTklFbnYqIGVudiwgam9iamVjdCBvYmplY3QsIGppbnQgcm93LCBqaW50IGNvbHVtbikKLXsKLSAgICBpbnQzMl90IGVycjsKLSAgICBDdXJzb3JXaW5kb3cgKiB3aW5kb3cgPSBHRVRfV0lORE9XKGVudiwgb2JqZWN0KTsKLUxPR19XSU5ET1coIkNoZWNraW5nIGlmIGNvbHVtbiBpcyBhIGJsb2Igb3IgbnVsbCBmb3IgJWQsJWQgZnJvbSAlcCIsIHJvdywgY29sdW1uLCB3aW5kb3cpOwotCi0gICAgZmllbGRfc2xvdF90IGZpZWxkOwotICAgIGVyciA9IHdpbmRvdy0+cmVhZF9maWVsZF9zbG90KHJvdywgY29sdW1uLCAmZmllbGQpOwotICAgIGlmIChlcnIgIT0gMCkgewotICAgICAgICB0aHJvd0V4Y2VwdGlvbldpdGhSb3dDb2woZW52LCByb3csIGNvbHVtbik7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIHJldHVybiBmaWVsZC50eXBlID09IEZJRUxEX1RZUEVfQkxPQiB8fCBmaWVsZC50eXBlID09IEZJRUxEX1RZUEVfTlVMTDsKLX0KLQotc3RhdGljIGpib29sZWFuIGlzU3RyaW5nX25hdGl2ZShKTklFbnYqIGVudiwgam9iamVjdCBvYmplY3QsIGppbnQgcm93LCBqaW50IGNvbHVtbikKLXsKLSAgICBpbnQzMl90IGVycjsKLSAgICBDdXJzb3JXaW5kb3cgKiB3aW5kb3cgPSBHRVRfV0lORE9XKGVudiwgb2JqZWN0KTsKLUxPR19XSU5ET1coIkNoZWNraW5nIGlmIGNvbHVtbiBpcyBhIHN0cmluZyBvciBudWxsIGZvciAlZCwlZCBmcm9tICVwIiwgcm93LCBjb2x1bW4sIHdpbmRvdyk7Ci0KLSAgICBmaWVsZF9zbG90X3QgZmllbGQ7Ci0gICAgZXJyID0gd2luZG93LT5yZWFkX2ZpZWxkX3Nsb3Qocm93LCBjb2x1bW4sICZmaWVsZCk7Ci0gICAgaWYgKGVyciAhPSAwKSB7Ci0gICAgICAgIHRocm93RXhjZXB0aW9uV2l0aFJvd0NvbChlbnYsIHJvdywgY29sdW1uKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgcmV0dXJuIGZpZWxkLnR5cGUgPT0gRklFTERfVFlQRV9TVFJJTkcgfHwgZmllbGQudHlwZSA9PSBGSUVMRF9UWVBFX05VTEw7Ci19Ci0KLXN0YXRpYyBqYm9vbGVhbiBpc0ludGVnZXJfbmF0aXZlKEpOSUVudiogZW52LCBqb2JqZWN0IG9iamVjdCwgamludCByb3csIGppbnQgY29sdW1uKQotewotICAgIGludDMyX3QgZXJyOwotICAgIEN1cnNvcldpbmRvdyAqIHdpbmRvdyA9IEdFVF9XSU5ET1coZW52LCBvYmplY3QpOwotTE9HX1dJTkRPVygiQ2hlY2tpbmcgaWYgY29sdW1uIGlzIGFuIGludGVnZXIgZm9yICVkLCVkIGZyb20gJXAiLCByb3csIGNvbHVtbiwgd2luZG93KTsKLQotICAgIGZpZWxkX3Nsb3RfdCBmaWVsZDsKLSAgICBlcnIgPSB3aW5kb3ctPnJlYWRfZmllbGRfc2xvdChyb3csIGNvbHVtbiwgJmZpZWxkKTsKLSAgICBpZiAoZXJyICE9IDApIHsKLSAgICAgICAgdGhyb3dFeGNlcHRpb25XaXRoUm93Q29sKGVudiwgcm93LCBjb2x1bW4pOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICByZXR1cm4gZmllbGQudHlwZSA9PSBGSUVMRF9UWVBFX0lOVEVHRVI7Ci19Ci0KLXN0YXRpYyBqYm9vbGVhbiBpc0Zsb2F0X25hdGl2ZShKTklFbnYqIGVudiwgam9iamVjdCBvYmplY3QsIGppbnQgcm93LCBqaW50IGNvbHVtbikKLXsKLSAgICBpbnQzMl90IGVycjsKLSAgICBDdXJzb3JXaW5kb3cgKiB3aW5kb3cgPSBHRVRfV0lORE9XKGVudiwgb2JqZWN0KTsKLUxPR19XSU5ET1coIkNoZWNraW5nIGlmIGNvbHVtbiBpcyBhIGZsb2F0IGZvciAlZCwlZCBmcm9tICVwIiwgcm93LCBjb2x1bW4sIHdpbmRvdyk7Ci0KLSAgICBmaWVsZF9zbG90X3QgZmllbGQ7Ci0gICAgZXJyID0gd2luZG93LT5yZWFkX2ZpZWxkX3Nsb3Qocm93LCBjb2x1bW4sICZmaWVsZCk7Ci0gICAgaWYgKGVyciAhPSAwKSB7Ci0gICAgICAgIHRocm93RXhjZXB0aW9uV2l0aFJvd0NvbChlbnYsIHJvdywgY29sdW1uKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgcmV0dXJuIGZpZWxkLnR5cGUgPT0gRklFTERfVFlQRV9GTE9BVDsKLX0KLQogc3RhdGljIGpzdHJpbmcgZ2V0U3RyaW5nX25hdGl2ZShKTklFbnYqIGVudiwgam9iamVjdCBvYmplY3QsIGppbnQgcm93LCBqaW50IGNvbHVtbikKIHsKICAgICBpbnQzMl90IGVycjsKQEAgLTQ4NywxMCArNDIzLDkgQEAKICAgICB9CiB9CiAKLXN0YXRpYyBqYm9vbGVhbiBpc051bGxfbmF0aXZlKEpOSUVudiogZW52LCBqb2JqZWN0IG9iamVjdCwgamludCByb3csIGppbnQgY29sdW1uKQorYm9vbCBpc051bGxfbmF0aXZlKEN1cnNvcldpbmRvdyAqd2luZG93LCBqaW50IHJvdywgamludCBjb2x1bW4pCiB7Ci0gICAgQ3Vyc29yV2luZG93ICogd2luZG93ID0gR0VUX1dJTkRPVyhlbnYsIG9iamVjdCk7Ci1MT0dfV0lORE9XKCJDaGVja2luZyBmb3IgTlVMTCBhdCAlZCwlZCBmcm9tICVwIiwgcm93LCBjb2x1bW4sIHdpbmRvdyk7CisgICAgTE9HX1dJTkRPVygiQ2hlY2tpbmcgZm9yIE5VTEwgYXQgJWQsJWQgZnJvbSAlcCIsIHJvdywgY29sdW1uLCB3aW5kb3cpOwogCiAgICAgYm9vbCBpc051bGw7CiAgICAgaWYgKHdpbmRvdy0+Z2V0TnVsbChyb3csIGNvbHVtbiwgJmlzTnVsbCkpIHsKQEAgLTY1Miw2ICs1ODcsMjYgQEAKICAgICB3aW5kb3ctPmZyZWVMYXN0Um93KCk7CiB9CiAKK3N0YXRpYyBqaW50IGdldFR5cGVfbmF0aXZlKEpOSUVudiogZW52LCBqb2JqZWN0IG9iamVjdCwgamludCByb3csIGppbnQgY29sdW1uKQoreworICAgIGludDMyX3QgZXJyOworICAgIEN1cnNvcldpbmRvdyAqIHdpbmRvdyA9IEdFVF9XSU5ET1coZW52LCBvYmplY3QpOworICAgIExPR19XSU5ET1coInJldHVybmluZyBjb2x1bW4gdHlwZSBhZmZpbml0eSBmb3IgJWQsJWQgZnJvbSAlcCIsIHJvdywgY29sdW1uLCB3aW5kb3cpOworCisgICAgaWYgKGlzTnVsbF9uYXRpdmUod2luZG93LCByb3csIGNvbHVtbikpIHsKKyAgICAgIHJldHVybiBGSUVMRF9UWVBFX05VTEw7CisgICAgfQorCisgICAgZmllbGRfc2xvdF90IGZpZWxkOworICAgIGVyciA9IHdpbmRvdy0+cmVhZF9maWVsZF9zbG90KHJvdywgY29sdW1uLCAmZmllbGQpOworICAgIGlmIChlcnIgIT0gMCkgeworICAgICAgICB0aHJvd0V4Y2VwdGlvbldpdGhSb3dDb2woZW52LCByb3csIGNvbHVtbik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHJldHVybiBmaWVsZC50eXBlOworfQorCiBzdGF0aWMgSk5JTmF0aXZlTWV0aG9kIHNNZXRob2RzW10gPQogewogICAgICAvKiBuYW1lLCBzaWduYXR1cmUsIGZ1bmNQdHIgKi8KQEAgLTY2MiwxMSArNjE3LDkgQEAKICAgICB7ImNsb3NlX25hdGl2ZSIsICIoKVYiLCAodm9pZCAqKW5hdGl2ZV9jbG9zZX0sCiAgICAgeyJnZXRMb25nX25hdGl2ZSIsICIoSUkpSiIsICh2b2lkICopZ2V0TG9uZ19uYXRpdmV9LAogICAgIHsiZ2V0QmxvYl9uYXRpdmUiLCAiKElJKVtCIiwgKHZvaWQgKilnZXRCbG9iX25hdGl2ZX0sCi0gICAgeyJpc0Jsb2JfbmF0aXZlIiwgIihJSSlaIiwgKHZvaWQgKilpc0Jsb2JfbmF0aXZlfSwKICAgICB7ImdldFN0cmluZ19uYXRpdmUiLCAiKElJKUxqYXZhL2xhbmcvU3RyaW5nOyIsICh2b2lkICopZ2V0U3RyaW5nX25hdGl2ZX0sCiAgICAgeyJjb3B5U3RyaW5nVG9CdWZmZXJfbmF0aXZlIiwgIihJSUlMYW5kcm9pZC9kYXRhYmFzZS9DaGFyQXJyYXlCdWZmZXI7KVtDIiwgKHZvaWQgKiljb3B5U3RyaW5nVG9CdWZmZXJfbmF0aXZlfSwKICAgICB7ImdldERvdWJsZV9uYXRpdmUiLCAiKElJKUQiLCAodm9pZCAqKWdldERvdWJsZV9uYXRpdmV9LAotICAgIHsiaXNOdWxsX25hdGl2ZSIsICIoSUkpWiIsICh2b2lkICopaXNOdWxsX25hdGl2ZX0sCiAgICAgeyJnZXROdW1Sb3dzX25hdGl2ZSIsICIoKUkiLCAodm9pZCAqKWdldE51bVJvd3N9LAogICAgIHsic2V0TnVtQ29sdW1uc19uYXRpdmUiLCAiKEkpWiIsICh2b2lkICopc2V0TnVtQ29sdW1uc30sCiAgICAgeyJhbGxvY1Jvd19uYXRpdmUiLCAiKClaIiwgKHZvaWQgKilhbGxvY1Jvd30sCkBAIC02NzYsOSArNjI5LDcgQEAKICAgICB7InB1dERvdWJsZV9uYXRpdmUiLCAiKERJSSlaIiwgKHZvaWQgKilwdXREb3VibGVfbmF0aXZlfSwKICAgICB7ImZyZWVMYXN0Um93X25hdGl2ZSIsICIoKVYiLCAodm9pZCAqKWZyZWVMYXN0Um93fSwKICAgICB7InB1dE51bGxfbmF0aXZlIiwgIihJSSlaIiwgKHZvaWQgKilwdXROdWxsX25hdGl2ZX0sCi0gICAgeyJpc1N0cmluZ19uYXRpdmUiLCAiKElJKVoiLCAodm9pZCAqKWlzU3RyaW5nX25hdGl2ZX0sCi0gICAgeyJpc0Zsb2F0X25hdGl2ZSIsICIoSUkpWiIsICh2b2lkICopaXNGbG9hdF9uYXRpdmV9LAotICAgIHsiaXNJbnRlZ2VyX25hdGl2ZSIsICIoSUkpWiIsICh2b2lkICopaXNJbnRlZ2VyX25hdGl2ZX0sCisgICAgeyJnZXRUeXBlX25hdGl2ZSIsICIoSUkpSSIsICh2b2lkICopZ2V0VHlwZV9uYXRpdmV9LAogfTsKIAogaW50IHJlZ2lzdGVyX2FuZHJvaWRfZGF0YWJhc2VfQ3Vyc29yV2luZG93KEpOSUVudiAqIGVudikKZGlmZiAtLWdpdCBhL2NvcmUvam5pL2FuZHJvaWRfZGF0YWJhc2VfU1FMaXRlQ29tcGlsZWRTcWwuY3BwIGIvY29yZS9qbmkvYW5kcm9pZF9kYXRhYmFzZV9TUUxpdGVDb21waWxlZFNxbC5jcHAKaW5kZXggOGQxYzM5ZWUuLmRlNGM1YzggMTAwNjQ0Ci0tLSBhL2NvcmUvam5pL2FuZHJvaWRfZGF0YWJhc2VfU1FMaXRlQ29tcGlsZWRTcWwuY3BwCisrKyBiL2NvcmUvam5pL2FuZHJvaWRfZGF0YWJhc2VfU1FMaXRlQ29tcGlsZWRTcWwuY3BwCkBAIC05MSwyMiArOTEsMTEgQEAKICAgICBjb21waWxlKGVudiwgb2JqZWN0LCBHRVRfSEFORExFKGVudiwgb2JqZWN0KSwgc3FsU3RyaW5nKTsKIH0KIAotc3RhdGljIHZvaWQgbmF0aXZlX2ZpbmFsaXplKEpOSUVudiogZW52LCBqb2JqZWN0IG9iamVjdCkKLXsKLSAgICBpbnQgZXJyOwotICAgIHNxbGl0ZTNfc3RtdCAqIHN0YXRlbWVudCA9IEdFVF9TVEFURU1FTlQoZW52LCBvYmplY3QpOwotCi0gICAgaWYgKHN0YXRlbWVudCAhPSBOVUxMKSB7Ci0gICAgICAgIHNxbGl0ZTNfZmluYWxpemUoc3RhdGVtZW50KTsKLSAgICAgICAgZW52LT5TZXRJbnRGaWVsZChvYmplY3QsIGdTdGF0ZW1lbnRGaWVsZCwgMCk7Ci0gICAgfQotfQogCiBzdGF0aWMgSk5JTmF0aXZlTWV0aG9kIHNNZXRob2RzW10gPQogewogICAgICAvKiBuYW1lLCBzaWduYXR1cmUsIGZ1bmNQdHIgKi8KICAgICB7Im5hdGl2ZV9jb21waWxlIiwgIihMamF2YS9sYW5nL1N0cmluZzspViIsICh2b2lkICopbmF0aXZlX2NvbXBpbGV9LAotICAgIHsibmF0aXZlX2ZpbmFsaXplIiwgIigpViIsICh2b2lkICopbmF0aXZlX2ZpbmFsaXplfSwKIH07CiAKIGludCByZWdpc3Rlcl9hbmRyb2lkX2RhdGFiYXNlX1NRTGl0ZUNvbXBpbGVkU3FsKEpOSUVudiAqIGVudikKZGlmZiAtLWdpdCBhL2NvcmUvam5pL2FuZHJvaWRfZGF0YWJhc2VfU1FMaXRlRGF0YWJhc2UuY3BwIGIvY29yZS9qbmkvYW5kcm9pZF9kYXRhYmFzZV9TUUxpdGVEYXRhYmFzZS5jcHAKaW5kZXggMzYyMzRhOS4uNWE5MjE5MyAxMDA2NDQKLS0tIGEvY29yZS9qbmkvYW5kcm9pZF9kYXRhYmFzZV9TUUxpdGVEYXRhYmFzZS5jcHAKKysrIGIvY29yZS9qbmkvYW5kcm9pZF9kYXRhYmFzZV9TUUxpdGVEYXRhYmFzZS5jcHAKQEAgLTYzLDggKzYzLDggQEAKIAogc3RhdGljIGpmaWVsZElEIG9mZnNldF9kYl9oYW5kbGU7CiAKLXN0YXRpYyBjaGFyICpjcmVhdGVTdHIoY29uc3QgY2hhciAqcGF0aCkgewotICAgIGludCBsZW4gPSBzdHJsZW4ocGF0aCk7CitzdGF0aWMgY2hhciAqY3JlYXRlU3RyKGNvbnN0IGNoYXIgKnBhdGgsIHNob3J0IGV4dHJhKSB7CisgICAgaW50IGxlbiA9IHN0cmxlbihwYXRoKSArIGV4dHJhOwogICAgIGNoYXIgKnN0ciA9IChjaGFyICopbWFsbG9jKGxlbiArIDEpOwogICAgIHN0cm5jcHkoc3RyLCBwYXRoLCBsZW4pOwogICAgIHN0cltsZW5dID0gTlVMTDsKQEAgLTg1LDcgKzg1LDcgQEAKICAgICB9CiAKICAgICBMT0dWKCJSZWdpc3RlcmluZyBzcWxpdGUgbG9nZ2luZyBmdW5jIFxuIik7Ci0gICAgaW50IGVyciA9IHNxbGl0ZTNfY29uZmlnKFNRTElURV9DT05GSUdfTE9HLCAmc3FsTG9nZ2VyLCAodm9pZCAqKWNyZWF0ZVN0cihwYXRoKSk7CisgICAgaW50IGVyciA9IHNxbGl0ZTNfY29uZmlnKFNRTElURV9DT05GSUdfTE9HLCAmc3FsTG9nZ2VyLCAodm9pZCAqKWNyZWF0ZVN0cihwYXRoLCAwKSk7CiAgICAgaWYgKGVyciAhPSBTUUxJVEVfT0spIHsKICAgICAgICAgTE9HRSgic3FsaXRlX2NvbmZpZyBmYWlsZWQgZXJyb3JfY29kZSA9ICVkLiBUSElTIFNIT1VMRCBORVZFUiBvY2N1ci5cbiIsIGVycik7CiAgICAgICAgIHJldHVybjsKQEAgLTE3NiwxMyArMTc2LDE3IEBACiAgICAgaWYgKGhhbmRsZSAhPSBOVUxMKSBzcWxpdGUzX2Nsb3NlKGhhbmRsZSk7CiB9CiAKLXN0YXRpYyBjaGFyICpnZXREYXRhYmFzZU5hbWUoSk5JRW52KiBlbnYsIHNxbGl0ZTMgKiBoYW5kbGUsIGpzdHJpbmcgZGF0YWJhc2VOYW1lKSB7CitzdGF0aWMgY2hhciAqZ2V0RGF0YWJhc2VOYW1lKEpOSUVudiogZW52LCBzcWxpdGUzICogaGFuZGxlLCBqc3RyaW5nIGRhdGFiYXNlTmFtZSwgc2hvcnQgY29ubk51bSkgewogICAgIGNoYXIgY29uc3QgKnBhdGggPSBlbnYtPkdldFN0cmluZ1VURkNoYXJzKGRhdGFiYXNlTmFtZSwgTlVMTCk7CiAgICAgaWYgKHBhdGggPT0gTlVMTCkgewogICAgICAgICBMT0dFKCJGYWlsdXJlIGluIGdldERhdGFiYXNlTmFtZSgpLiBWTSByYW4gb3V0IG9mIG1lbW9yeT9cbiIpOwogICAgICAgICByZXR1cm4gTlVMTDsgLy8gVk0gd291bGQgaGF2ZSB0aHJvd24gT3V0T2ZNZW1vcnlFcnJvcgogICAgIH0KLSAgICBjaGFyICpkYk5hbWVTdHIgPSBjcmVhdGVTdHIocGF0aCk7CisgICAgY2hhciAqZGJOYW1lU3RyID0gY3JlYXRlU3RyKHBhdGgsIDQpOworICAgIGlmIChjb25uTnVtID4gOTk5KSB7IC8vIFRPRE86IGlmIG51bWJlciBvZiBwb29sZWQgY29ubmVjdGlvbnMgPiA5OTksIGZpeCB0aGlzIGxpbmUuCisgICAgICBjb25uTnVtID0gLTE7CisgICAgfQorICAgIHNwcmludGYoZGJOYW1lU3RyICsgc3RybGVuKHBhdGgpLCAifCUwM2QiLCBjb25uTnVtKTsKICAgICBlbnYtPlJlbGVhc2VTdHJpbmdVVEZDaGFycyhkYXRhYmFzZU5hbWUsIHBhdGgpOwogICAgIHJldHVybiBkYk5hbWVTdHI7CiB9CkBAIC0xOTIsMTAgKzE5NiwxMCBAQAogfQogCiAvKiBwdWJsaWMgbmF0aXZlIHZvaWQgZW5hYmxlU3FsVHJhY2luZygpOyAqLwotc3RhdGljIHZvaWQgZW5hYmxlU3FsVHJhY2luZyhKTklFbnYqIGVudiwgam9iamVjdCBvYmplY3QsIGpzdHJpbmcgZGF0YWJhc2VOYW1lKQorc3RhdGljIHZvaWQgZW5hYmxlU3FsVHJhY2luZyhKTklFbnYqIGVudiwgam9iamVjdCBvYmplY3QsIGpzdHJpbmcgZGF0YWJhc2VOYW1lLCBqc2hvcnQgY29ublR5cGUpCiB7CiAgICAgc3FsaXRlMyAqIGhhbmRsZSA9IChzcWxpdGUzICopZW52LT5HZXRJbnRGaWVsZChvYmplY3QsIG9mZnNldF9kYl9oYW5kbGUpOwotICAgIHNxbGl0ZTNfdHJhY2UoaGFuZGxlLCAmc3FsVHJhY2UsICh2b2lkICopZ2V0RGF0YWJhc2VOYW1lKGVudiwgaGFuZGxlLCBkYXRhYmFzZU5hbWUpKTsKKyAgICBzcWxpdGUzX3RyYWNlKGhhbmRsZSwgJnNxbFRyYWNlLCAodm9pZCAqKWdldERhdGFiYXNlTmFtZShlbnYsIGhhbmRsZSwgZGF0YWJhc2VOYW1lLCBjb25uVHlwZSkpOwogfQogCiBzdGF0aWMgdm9pZCBzcWxQcm9maWxlKHZvaWQgKmRhdGFiYXNlTmFtZSwgY29uc3QgY2hhciAqc3FsLCBzcWxpdGUzX3VpbnQ2NCB0bSkgewpAQCAtMjA0LDEzICsyMDgsMTMgQEAKIH0KIAogLyogcHVibGljIG5hdGl2ZSB2b2lkIGVuYWJsZVNxbFByb2ZpbGluZygpOyAqLwotc3RhdGljIHZvaWQgZW5hYmxlU3FsUHJvZmlsaW5nKEpOSUVudiogZW52LCBqb2JqZWN0IG9iamVjdCwganN0cmluZyBkYXRhYmFzZU5hbWUpCitzdGF0aWMgdm9pZCBlbmFibGVTcWxQcm9maWxpbmcoSk5JRW52KiBlbnYsIGpvYmplY3Qgb2JqZWN0LCBqc3RyaW5nIGRhdGFiYXNlTmFtZSwganNob3J0IGNvbm5UeXBlKQogewogICAgIHNxbGl0ZTMgKiBoYW5kbGUgPSAoc3FsaXRlMyAqKWVudi0+R2V0SW50RmllbGQob2JqZWN0LCBvZmZzZXRfZGJfaGFuZGxlKTsKLSAgICBzcWxpdGUzX3Byb2ZpbGUoaGFuZGxlLCAmc3FsUHJvZmlsZSwgKHZvaWQgKilnZXREYXRhYmFzZU5hbWUoZW52LCBoYW5kbGUsIGRhdGFiYXNlTmFtZSkpOworICAgIHNxbGl0ZTNfcHJvZmlsZShoYW5kbGUsICZzcWxQcm9maWxlLCAodm9pZCAqKWdldERhdGFiYXNlTmFtZShlbnYsIGhhbmRsZSwgZGF0YWJhc2VOYW1lLAorICAgICAgICAgICAgY29ublR5cGUpKTsKIH0KIAotCiAvKiBwdWJsaWMgbmF0aXZlIHZvaWQgY2xvc2UoKTsgKi8KIHN0YXRpYyB2b2lkIGRiY2xvc2UoSk5JRW52KiBlbnYsIGpvYmplY3Qgb2JqZWN0KQogewpAQCAtMjUxLDcgKzI1NSw4IEBACiAgICAganNpemUgc3FsTGVuID0gZW52LT5HZXRTdHJpbmdMZW5ndGgoc3FsU3RyaW5nKTsKIAogICAgIGlmIChzcWwgPT0gTlVMTCB8fCBzcWxMZW4gPT0gMCkgewotICAgICAgICBqbmlUaHJvd0V4Y2VwdGlvbihlbnYsICJqYXZhL2xhbmcvSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIiwgIllvdSBtdXN0IHN1cHBseSBhbiBTUUwgc3RyaW5nIik7CisgICAgICAgIGpuaVRocm93RXhjZXB0aW9uKGVudiwgImphdmEvbGFuZy9JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24iLAorICAgICAgICAgICAgICAgICJZb3UgbXVzdCBzdXBwbHkgYW4gU1FMIHN0cmluZyIpOwogICAgICAgICByZXR1cm47CiAgICAgfQogCkBAIC0yNjEsNyArMjY2LDggQEAKIAogICAgIGlmIChlcnIgIT0gU1FMSVRFX09LKSB7CiAgICAgICAgIGNoYXIgY29uc3QgKiBzcWw4ID0gZW52LT5HZXRTdHJpbmdVVEZDaGFycyhzcWxTdHJpbmcsIE5VTEwpOwotICAgICAgICBMT0dFKCJGYWlsdXJlICVkICglcykgb24gJXAgd2hlbiBwcmVwYXJpbmcgJyVzJy5cbiIsIGVyciwgc3FsaXRlM19lcnJtc2coaGFuZGxlKSwgaGFuZGxlLCBzcWw4KTsKKyAgICAgICAgTE9HRSgiRmFpbHVyZSAlZCAoJXMpIG9uICVwIHdoZW4gcHJlcGFyaW5nICclcycuXG4iLCBlcnIsIHNxbGl0ZTNfZXJybXNnKGhhbmRsZSksCisgICAgICAgICAgICAgICAgaGFuZGxlLCBzcWw4KTsKICAgICAgICAgdGhyb3dfc3FsaXRlM19leGNlcHRpb24oZW52LCBoYW5kbGUsIHNxbDgpOwogICAgICAgICBlbnYtPlJlbGVhc2VTdHJpbmdVVEZDaGFycyhzcWxTdHJpbmcsIHNxbDgpOwogICAgICAgICByZXR1cm47CkBAIC0yNzIsMTAgKzI3OCwxMiBAQAogCiAgICAgaWYgKHN0ZXBFcnIgIT0gU1FMSVRFX0RPTkUpIHsKICAgICAgICAgaWYgKHN0ZXBFcnIgPT0gU1FMSVRFX1JPVykgewotICAgICAgICAgICAgdGhyb3dfc3FsaXRlM19leGNlcHRpb24oZW52LCAiUXVlcmllcyBjYW5ub3QgYmUgcGVyZm9ybWVkIHVzaW5nIGV4ZWNTUUwoKSwgdXNlIHF1ZXJ5KCkgaW5zdGVhZC4iKTsKKyAgICAgICAgICAgIHRocm93X3NxbGl0ZTNfZXhjZXB0aW9uKGVudiwKKyAgICAgICAgICAgICAgICAgICAgIlF1ZXJpZXMgY2Fubm90IGJlIHBlcmZvcm1lZCB1c2luZyBleGVjU1FMKCksIHVzZSBxdWVyeSgpIGluc3RlYWQuIik7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBjaGFyIGNvbnN0ICogc3FsOCA9IGVudi0+R2V0U3RyaW5nVVRGQ2hhcnMoc3FsU3RyaW5nLCBOVUxMKTsKLSAgICAgICAgICAgIExPR0UoIkZhaWx1cmUgJWQgKCVzKSBvbiAlcCB3aGVuIGV4ZWN1dGluZyAnJXMnXG4iLCBlcnIsIHNxbGl0ZTNfZXJybXNnKGhhbmRsZSksIGhhbmRsZSwgc3FsOCk7CisgICAgICAgICAgICBMT0dFKCJGYWlsdXJlICVkICglcykgb24gJXAgd2hlbiBleGVjdXRpbmcgJyVzJ1xuIiwgZXJyLCBzcWxpdGUzX2Vycm1zZyhoYW5kbGUpLAorICAgICAgICAgICAgICAgICAgICBoYW5kbGUsIHNxbDgpOwogICAgICAgICAgICAgdGhyb3dfc3FsaXRlM19leGNlcHRpb24oZW52LCBoYW5kbGUsIHNxbDgpOwogICAgICAgICAgICAgZW52LT5SZWxlYXNlU3RyaW5nVVRGQ2hhcnMoc3FsU3RyaW5nLCBzcWw4KTsKIApAQCAtNDQzLDE5ICs0NTEsMjcgQEAKICAgICByZXR1cm4gc3FsaXRlM19yZWxlYXNlX21lbW9yeShTUUxJVEVfU09GVF9IRUFQX0xJTUlUKTsKIH0KIAorc3RhdGljIHZvaWQgbmF0aXZlX2ZpbmFsaXplKEpOSUVudiogZW52LCBqb2JqZWN0IG9iamVjdCwgamludCBzdGF0ZW1lbnRJZCkKK3sKKyAgICBpZiAoc3RhdGVtZW50SWQgPiAwKSB7CisgICAgICAgIHNxbGl0ZTNfZmluYWxpemUoKHNxbGl0ZTNfc3RtdCAqKXN0YXRlbWVudElkKTsKKyAgICB9Cit9CisKIHN0YXRpYyBKTklOYXRpdmVNZXRob2Qgc01ldGhvZHNbXSA9CiB7CiAgICAgLyogbmFtZSwgc2lnbmF0dXJlLCBmdW5jUHRyICovCiAgICAgeyJkYm9wZW4iLCAiKExqYXZhL2xhbmcvU3RyaW5nO0kpViIsICh2b2lkICopZGJvcGVufSwKICAgICB7ImRiY2xvc2UiLCAiKClWIiwgKHZvaWQgKilkYmNsb3NlfSwKLSAgICB7ImVuYWJsZVNxbFRyYWNpbmciLCAiKExqYXZhL2xhbmcvU3RyaW5nOylWIiwgKHZvaWQgKillbmFibGVTcWxUcmFjaW5nfSwKLSAgICB7ImVuYWJsZVNxbFByb2ZpbGluZyIsICIoTGphdmEvbGFuZy9TdHJpbmc7KVYiLCAodm9pZCAqKWVuYWJsZVNxbFByb2ZpbGluZ30sCisgICAgeyJlbmFibGVTcWxUcmFjaW5nIiwgIihMamF2YS9sYW5nL1N0cmluZztTKVYiLCAodm9pZCAqKWVuYWJsZVNxbFRyYWNpbmd9LAorICAgIHsiZW5hYmxlU3FsUHJvZmlsaW5nIiwgIihMamF2YS9sYW5nL1N0cmluZztTKVYiLCAodm9pZCAqKWVuYWJsZVNxbFByb2ZpbGluZ30sCiAgICAgeyJuYXRpdmVfZXhlY1NRTCIsICIoTGphdmEvbGFuZy9TdHJpbmc7KVYiLCAodm9pZCAqKW5hdGl2ZV9leGVjU1FMfSwKICAgICB7Imxhc3RJbnNlcnRSb3ciLCAiKClKIiwgKHZvaWQgKilsYXN0SW5zZXJ0Um93fSwKICAgICB7Imxhc3RDaGFuZ2VDb3VudCIsICIoKUkiLCAodm9pZCAqKWxhc3RDaGFuZ2VDb3VudH0sCiAgICAgeyJuYXRpdmVfc2V0TG9jYWxlIiwgIihMamF2YS9sYW5nL1N0cmluZztJKVYiLCAodm9pZCAqKW5hdGl2ZV9zZXRMb2NhbGV9LAogICAgIHsibmF0aXZlX2dldERiTG9va2FzaWRlIiwgIigpSSIsICh2b2lkICopbmF0aXZlX2dldERiTG9va2FzaWRlfSwKICAgICB7InJlbGVhc2VNZW1vcnkiLCAiKClJIiwgKHZvaWQgKiluYXRpdmVfcmVsZWFzZU1lbW9yeX0sCisgICAgeyJuYXRpdmVfZmluYWxpemUiLCAiKEkpViIsICh2b2lkICopbmF0aXZlX2ZpbmFsaXplfSwKIH07CiAKIGludCByZWdpc3Rlcl9hbmRyb2lkX2RhdGFiYXNlX1NRTGl0ZURhdGFiYXNlKEpOSUVudiAqZW52KQpAQCAtNDc0LDcgKzQ5MCw4IEBACiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAKLSAgICByZXR1cm4gQW5kcm9pZFJ1bnRpbWU6OnJlZ2lzdGVyTmF0aXZlTWV0aG9kcyhlbnYsICJhbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVEYXRhYmFzZSIsIHNNZXRob2RzLCBORUxFTShzTWV0aG9kcykpOworICAgIHJldHVybiBBbmRyb2lkUnVudGltZTo6cmVnaXN0ZXJOYXRpdmVNZXRob2RzKGVudiwgImFuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZURhdGFiYXNlIiwKKyAgICAgICAgICAgIHNNZXRob2RzLCBORUxFTShzTWV0aG9kcykpOwogfQogCiAvKiB0aHJvdyBhIFNRTGl0ZUV4Y2VwdGlvbiB3aXRoIGEgbWVzc2FnZSBhcHByb3ByaWF0ZSBmb3IgdGhlIGVycm9yIGluIGhhbmRsZSAqLwpAQCAtNTIzLDYgKzU0MCw3IEBACiAgICAgICAgICAgICBleGNlcHRpb25DbGFzcyA9ICJhbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVEaXNrSU9FeGNlcHRpb24iOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgU1FMSVRFX0NPUlJVUFQ6CisgICAgICAgIGNhc2UgU1FMSVRFX05PVEFEQjogLy8gdHJlYXQgInVuc3VwcG9ydGVkIGZpbGUgZm9ybWF0IiBlcnJvciBhcyBjb3JydXB0aW9uIGFsc28KICAgICAgICAgICAgIGV4Y2VwdGlvbkNsYXNzID0gImFuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZURhdGFiYXNlQ29ycnVwdEV4Y2VwdGlvbiI7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBTUUxJVEVfQ09OU1RSQUlOVDoKZGlmZiAtLWdpdCBhL2NvcmUvam5pL2FuZHJvaWRfZGF0YWJhc2VfU1FMaXRlUXVlcnkuY3BwIGIvY29yZS9qbmkvYW5kcm9pZF9kYXRhYmFzZV9TUUxpdGVRdWVyeS5jcHAKaW5kZXggNDQyNzE2ODMuLjc0N2VlNTAgMTAwNjQ0Ci0tLSBhL2NvcmUvam5pL2FuZHJvaWRfZGF0YWJhc2VfU1FMaXRlUXVlcnkuY3BwCisrKyBiL2NvcmUvam5pL2FuZHJvaWRfZGF0YWJhc2VfU1FMaXRlUXVlcnkuY3BwCkBAIC0yOSw3ICsyOSw3IEBACiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAKLSNpbmNsdWRlICJDdXJzb3JXaW5kb3cuaCIKKyNpbmNsdWRlICJiaW5kZXIvQ3Vyc29yV2luZG93LmgiCiAjaW5jbHVkZSAic3FsaXRlM19leGNlcHRpb24uaCIKIAogCmRpZmYgLS1naXQgYS9jb3JlL2puaS9hbmRyb2lkX2RhdGFiYXNlX1NRTGl0ZVN0YXRlbWVudC5jcHAgYi9jb3JlL2puaS9hbmRyb2lkX2RhdGFiYXNlX1NRTGl0ZVN0YXRlbWVudC5jcHAKaW5kZXggZmYyZWQ1ZC4uMDM0MWUwYiAxMDA2NDQKLS0tIGEvY29yZS9qbmkvYW5kcm9pZF9kYXRhYmFzZV9TUUxpdGVTdGF0ZW1lbnQuY3BwCisrKyBiL2NvcmUvam5pL2FuZHJvaWRfZGF0YWJhc2VfU1FMaXRlU3RhdGVtZW50LmNwcApAQCAtNTgsNyArNTgsOSBAQAogICAgIGVyciA9IHNxbGl0ZTNfc3RlcChzdGF0ZW1lbnQpOwogCiAgICAgLy8gVGhyb3cgYW4gZXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VyZWQKLSAgICBpZiAoZXJyICE9IFNRTElURV9ET05FKSB7CisgICAgaWYgKGVyciA9PSBTUUxJVEVfUk9XKSB7CisgICAgICAgIExPR1YoIlF1ZXJpZXMgY2Fubm90IGJlIHBlcmZvcm1lZCB1c2luZyBleGVjdXRlKCkuIHVzZSBTUUxpdGVEYXRhYmFzZS5xdWVyeSgpIGluc3RlYWQuIik7CisgICAgfSBlbHNlIGlmIChlcnIgIT0gU1FMSVRFX0RPTkUpIHsKICAgICAgICAgdGhyb3dfc3FsaXRlM19leGNlcHRpb25fZXJyY29kZShlbnYsIGVyciwgc3FsaXRlM19lcnJtc2coaGFuZGxlKSk7CiAgICAgfQogCmRpZmYgLS1naXQgYS9jb3JlL2puaS9hbmRyb2lkX21lZGlhX010cENsaWVudC5jcHAgYi9jb3JlL2puaS9hbmRyb2lkX21lZGlhX010cENsaWVudC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZlZWQyYwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvam5pL2FuZHJvaWRfbWVkaWFfTXRwQ2xpZW50LmNwcApAQCAtMCwwICsxLDI2NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiTXRwQ2xpZW50Sk5JIgorI2luY2x1ZGUgInV0aWxzL0xvZy5oIgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KKworI2luY2x1ZGUgImpuaS5oIgorI2luY2x1ZGUgIkpOSUhlbHAuaCIKKyNpbmNsdWRlICJhbmRyb2lkX3J1bnRpbWUvQW5kcm9pZFJ1bnRpbWUuaCIKKworI2luY2x1ZGUgIk10cENsaWVudC5oIgorI2luY2x1ZGUgIk10cERldmljZS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIGptZXRob2RJRCBtZXRob2RfZGV2aWNlQWRkZWQ7CitzdGF0aWMgam1ldGhvZElEIG1ldGhvZF9kZXZpY2VSZW1vdmVkOworc3RhdGljIGpmaWVsZElEIGZpZWxkX2NvbnRleHQ7CisKK2NsYXNzIE15Q2xpZW50IDogcHVibGljIE10cENsaWVudCB7Citwcml2YXRlOgorCisgICAgZW51bSB7CisgICAgICAgIGtEZXZpY2VBZGRlZCA9IDEsCisgICAgICAgIGtEZXZpY2VSZW1vdmVkLAorICAgIH07CisKKyAgICB2aXJ0dWFsIHZvaWQgICAgZGV2aWNlQWRkZWQoTXRwRGV2aWNlICpkZXZpY2UpOworICAgIHZpcnR1YWwgdm9pZCAgICBkZXZpY2VSZW1vdmVkKE10cERldmljZSAqZGV2aWNlKTsKKworICAgIGJvb2wgICAgICAgICAgICByZXBvcnREZXZpY2VBZGRlZChKTklFbnYgKmVudiwgTXRwRGV2aWNlICpkZXZpY2UpOworICAgIGJvb2wgICAgICAgICAgICByZXBvcnREZXZpY2VSZW1vdmVkKEpOSUVudiAqZW52LCBNdHBEZXZpY2UgKmRldmljZSk7CisKKyAgICBKTklFbnYqICAgICAgICAgbUVudjsKKyAgICBqb2JqZWN0ICAgICAgICAgbUNsaWVudDsKKyAgICBNdXRleCAgICAgICAgICAgbUV2ZW50TG9jazsKKyAgICBDb25kaXRpb24gICAgICAgbUV2ZW50Q29uZGl0aW9uOworICAgIE11dGV4ICAgICAgICAgICBtQWNrTG9jazsKKyAgICBDb25kaXRpb24gICAgICAgbUFja0NvbmRpdGlvbjsKKyAgICBpbnQgICAgICAgICAgICAgbUV2ZW50OworICAgIE10cERldmljZSogICAgICBtRXZlbnREZXZpY2U7CisKK3B1YmxpYzoKKyAgICAgICAgICAgICAgICAgICAgTXlDbGllbnQoSk5JRW52ICplbnYsIGpvYmplY3QgY2xpZW50KTsKKyAgICB2aXJ0dWFsICAgICAgICAgfk15Q2xpZW50KCk7CisgICAgdm9pZCAgICAgICAgICAgIHdhaXRGb3JFdmVudChKTklFbnYgKmVudik7CisKK307CisKK010cENsaWVudCogZ2V0X2NsaWVudF9mcm9tX29iamVjdChKTklFbnYqIGVudiwgam9iamVjdCBqYXZhQ2xpZW50KQoreworICAgIHJldHVybiAoTXRwQ2xpZW50KillbnYtPkdldEludEZpZWxkKGphdmFDbGllbnQsIGZpZWxkX2NvbnRleHQpOworfQorCisKK015Q2xpZW50OjpNeUNsaWVudChKTklFbnYgKmVudiwgam9iamVjdCBjbGllbnQpCisgICAgOiAgIG1FbnYoZW52KSwKKyAgICAgICAgbUNsaWVudChlbnYtPk5ld0dsb2JhbFJlZihjbGllbnQpKSwKKyAgICAgICAgbUV2ZW50KDApLAorICAgICAgICBtRXZlbnREZXZpY2UoTlVMTCkKK3sKK30KKworTXlDbGllbnQ6On5NeUNsaWVudCgpIHsKKyAgICBtRW52LT5EZWxldGVHbG9iYWxSZWYobUNsaWVudCk7Cit9CisKKwordm9pZCBNeUNsaWVudDo6ZGV2aWNlQWRkZWQoTXRwRGV2aWNlICpkZXZpY2UpIHsKKyAgICBMT0dEKCJNeUNsaWVudDo6ZGV2aWNlQWRkZWRcbiIpOworICAgIG1BY2tMb2NrLmxvY2soKTsKKyAgICBtRXZlbnRMb2NrLmxvY2soKTsKKyAgICBtRXZlbnQgPSBrRGV2aWNlQWRkZWQ7CisgICAgbUV2ZW50RGV2aWNlID0gZGV2aWNlOworICAgIG1FdmVudENvbmRpdGlvbi5zaWduYWwoKTsKKyAgICBtRXZlbnRMb2NrLnVubG9jaygpOworICAgIG1BY2tDb25kaXRpb24ud2FpdChtQWNrTG9jayk7CisgICAgbUFja0xvY2sudW5sb2NrKCk7Cit9CisKK3ZvaWQgTXlDbGllbnQ6OmRldmljZVJlbW92ZWQoTXRwRGV2aWNlICpkZXZpY2UpIHsKKyAgICBMT0dEKCJNeUNsaWVudDo6ZGV2aWNlUmVtb3ZlZFxuIik7CisgICAgbUFja0xvY2subG9jaygpOworICAgIG1FdmVudExvY2subG9jaygpOworICAgIG1FdmVudCA9IGtEZXZpY2VSZW1vdmVkOworICAgIG1FdmVudERldmljZSA9IGRldmljZTsKKyAgICBtRXZlbnRDb25kaXRpb24uc2lnbmFsKCk7CisgICAgbUV2ZW50TG9jay51bmxvY2soKTsKKyAgICBtQWNrQ29uZGl0aW9uLndhaXQobUFja0xvY2spOworICAgIG1BY2tMb2NrLnVubG9jaygpOworfQorCitib29sIE15Q2xpZW50OjpyZXBvcnREZXZpY2VBZGRlZChKTklFbnYgKmVudiwgTXRwRGV2aWNlICpkZXZpY2UpIHsKKyAgICBjb25zdCBjaGFyKiBuYW1lID0gZGV2aWNlLT5nZXREZXZpY2VOYW1lKCk7CisgICAgTE9HRCgiTXlDbGllbnQ6OnJlcG9ydERldmljZUFkZGVkICVzXG4iLCBuYW1lKTsKKworICAgIGVudi0+Q2FsbFZvaWRNZXRob2QobUNsaWVudCwgbWV0aG9kX2RldmljZUFkZGVkLCBkZXZpY2UtPmdldElEKCkpOworCisgICAgcmV0dXJuICghZW52LT5FeGNlcHRpb25DaGVjaygpKTsKK30KKworYm9vbCBNeUNsaWVudDo6cmVwb3J0RGV2aWNlUmVtb3ZlZChKTklFbnYgKmVudiwgTXRwRGV2aWNlICpkZXZpY2UpIHsKKyAgIGNvbnN0IGNoYXIqIG5hbWUgPSBkZXZpY2UtPmdldERldmljZU5hbWUoKTsKKyAgICBMT0dEKCJNeUNsaWVudDo6cmVwb3J0RGV2aWNlUmVtb3ZlZCAlc1xuIiwgbmFtZSk7CisKKyAgICBlbnYtPkNhbGxWb2lkTWV0aG9kKG1DbGllbnQsIG1ldGhvZF9kZXZpY2VSZW1vdmVkLCBkZXZpY2UtPmdldElEKCkpOworCisgICAgcmV0dXJuICghZW52LT5FeGNlcHRpb25DaGVjaygpKTsKK30KKwordm9pZCBNeUNsaWVudDo6d2FpdEZvckV2ZW50KEpOSUVudiAqZW52KSB7CisgICAgbUV2ZW50TG9jay5sb2NrKCk7CisgICAgbUV2ZW50Q29uZGl0aW9uLndhaXQobUV2ZW50TG9jayk7CisgICAgbUV2ZW50TG9jay51bmxvY2soKTsKKworICAgIHN3aXRjaCAobUV2ZW50KSB7CisgICAgICAgIGNhc2Uga0RldmljZUFkZGVkOgorICAgICAgICAgICAgcmVwb3J0RGV2aWNlQWRkZWQoZW52LCBtRXZlbnREZXZpY2UpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2Uga0RldmljZVJlbW92ZWQ6CisgICAgICAgICAgICByZXBvcnREZXZpY2VSZW1vdmVkKGVudiwgbUV2ZW50RGV2aWNlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIG1BY2tMb2NrLmxvY2soKTsKKyAgICBtQWNrQ29uZGl0aW9uLnNpZ25hbCgpOworICAgIG1BY2tMb2NrLnVubG9jaygpOworfQorCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIGJvb2wgRXhjZXB0aW9uQ2hlY2sodm9pZCogZW52KQoreworICAgIHJldHVybiAoKEpOSUVudiAqKWVudiktPkV4Y2VwdGlvbkNoZWNrKCk7Cit9CisKK3N0YXRpYyB2b2lkCithbmRyb2lkX21lZGlhX010cENsaWVudF9zZXR1cChKTklFbnYgKmVudiwgam9iamVjdCB0aGl6KQoreworICAgIExPR0QoInNldHVwXG4iKTsKKyAgICBNeUNsaWVudCogY2xpZW50ID0gbmV3IE15Q2xpZW50KGVudiwgdGhpeik7CisgICAgY2xpZW50LT5zdGFydCgpOworICAgIGVudi0+U2V0SW50RmllbGQodGhpeiwgZmllbGRfY29udGV4dCwgKGludCljbGllbnQpOworfQorCitzdGF0aWMgdm9pZAorYW5kcm9pZF9tZWRpYV9NdHBDbGllbnRfZmluYWxpemUoSk5JRW52ICplbnYsIGpvYmplY3QgdGhpeikKK3sKKyAgICBMT0dEKCJmaW5hbGl6ZVxuIik7CisgICAgTXlDbGllbnQgKmNsaWVudCA9IChNeUNsaWVudCAqKWVudi0+R2V0SW50RmllbGQodGhpeiwgZmllbGRfY29udGV4dCk7CisgICAgZGVsZXRlIGNsaWVudDsKK30KKworc3RhdGljIHZvaWQKK2FuZHJvaWRfbWVkaWFfTXRwQ2xpZW50X3dhaXRfZm9yX2V2ZW50KEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXopCit7CisgICAgTE9HRCgid2FpdF9mb3JfZXZlbnRcbiIpOworICAgIE15Q2xpZW50ICpjbGllbnQgPSAoTXlDbGllbnQgKillbnYtPkdldEludEZpZWxkKHRoaXosIGZpZWxkX2NvbnRleHQpOworICAgIGNsaWVudC0+d2FpdEZvckV2ZW50KGVudik7Cit9CisKK3N0YXRpYyBqYm9vbGVhbgorYW5kcm9pZF9tZWRpYV9NdHBDbGllbnRfZGVsZXRlX29iamVjdChKTklFbnYgKmVudiwgam9iamVjdCB0aGl6LAorICAgICAgICBqaW50IGRldmljZV9pZCwgamludCBvYmplY3RfaWQpCit7CisgICAgTXlDbGllbnQgKmNsaWVudCA9IChNeUNsaWVudCAqKWVudi0+R2V0SW50RmllbGQodGhpeiwgZmllbGRfY29udGV4dCk7CisgICAgTXRwRGV2aWNlKiBkZXZpY2UgPSBjbGllbnQtPmdldERldmljZShkZXZpY2VfaWQpOworICAgIGlmIChkZXZpY2UpCisgICAgICAgIHJldHVybiBkZXZpY2UtPmRlbGV0ZU9iamVjdChvYmplY3RfaWQpOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBqaW50CithbmRyb2lkX21lZGlhX010cENsaWVudF9nZXRfcGFyZW50KEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXosCisgICAgICAgIGppbnQgZGV2aWNlX2lkLCBqaW50IG9iamVjdF9pZCkKK3sKKyAgICBNeUNsaWVudCAqY2xpZW50ID0gKE15Q2xpZW50ICopZW52LT5HZXRJbnRGaWVsZCh0aGl6LCBmaWVsZF9jb250ZXh0KTsKKyAgICBNdHBEZXZpY2UqIGRldmljZSA9IGNsaWVudC0+Z2V0RGV2aWNlKGRldmljZV9pZCk7CisgICAgaWYgKGRldmljZSkKKyAgICAgICAgcmV0dXJuIGRldmljZS0+Z2V0UGFyZW50KG9iamVjdF9pZCk7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBqaW50CithbmRyb2lkX21lZGlhX010cENsaWVudF9nZXRfc3RvcmFnZV9pZChKTklFbnYgKmVudiwgam9iamVjdCB0aGl6LAorICAgICAgICBqaW50IGRldmljZV9pZCwgamludCBvYmplY3RfaWQpCit7CisgICAgTXlDbGllbnQgKmNsaWVudCA9IChNeUNsaWVudCAqKWVudi0+R2V0SW50RmllbGQodGhpeiwgZmllbGRfY29udGV4dCk7CisgICAgTXRwRGV2aWNlKiBkZXZpY2UgPSBjbGllbnQtPmdldERldmljZShkZXZpY2VfaWQpOworICAgIGlmIChkZXZpY2UpCisgICAgICAgIHJldHVybiBkZXZpY2UtPmdldFN0b3JhZ2VJRChvYmplY3RfaWQpOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIC0xOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBKTklOYXRpdmVNZXRob2QgZ01ldGhvZHNbXSA9IHsKKyAgICB7Im5hdGl2ZV9zZXR1cCIsICAgICAgICAgICAgIigpViIsICAodm9pZCAqKWFuZHJvaWRfbWVkaWFfTXRwQ2xpZW50X3NldHVwfSwKKyAgICB7Im5hdGl2ZV9maW5hbGl6ZSIsICAgICAgICAgIigpViIsICAodm9pZCAqKWFuZHJvaWRfbWVkaWFfTXRwQ2xpZW50X2ZpbmFsaXplfSwKKyAgICB7Im5hdGl2ZV93YWl0X2Zvcl9ldmVudCIsICAgIigpViIsICAodm9pZCAqKWFuZHJvaWRfbWVkaWFfTXRwQ2xpZW50X3dhaXRfZm9yX2V2ZW50fSwKKyAgICB7Im5hdGl2ZV9kZWxldGVfb2JqZWN0IiwgICAiKElJKVoiLCAodm9pZCAqKWFuZHJvaWRfbWVkaWFfTXRwQ2xpZW50X2RlbGV0ZV9vYmplY3R9LAorICAgIHsibmF0aXZlX2dldF9wYXJlbnQiLCAgICAgICIoSUkpSSIsICh2b2lkICopYW5kcm9pZF9tZWRpYV9NdHBDbGllbnRfZ2V0X3BhcmVudH0sCisgICAgeyJuYXRpdmVfZ2V0X3N0b3JhZ2VfaWQiLCAgIihJSSlJIiwgKHZvaWQgKilhbmRyb2lkX21lZGlhX010cENsaWVudF9nZXRfc3RvcmFnZV9pZH0sCit9OworCitzdGF0aWMgY29uc3QgY2hhciogY29uc3Qga0NsYXNzUGF0aE5hbWUgPSAiYW5kcm9pZC9tZWRpYS9NdHBDbGllbnQiOworCitpbnQgcmVnaXN0ZXJfYW5kcm9pZF9tZWRpYV9NdHBDbGllbnQoSk5JRW52ICplbnYpCit7CisgICAgamNsYXNzIGNsYXp6OworCisgICAgTE9HRCgicmVnaXN0ZXJfYW5kcm9pZF9tZWRpYV9NdHBDbGllbnRcbiIpOworCisgICAgY2xhenogPSBlbnYtPkZpbmRDbGFzcygiYW5kcm9pZC9tZWRpYS9NdHBDbGllbnQiKTsKKyAgICBpZiAoY2xhenogPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJDYW4ndCBmaW5kIGFuZHJvaWQvbWVkaWEvTXRwQ2xpZW50Iik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgbWV0aG9kX2RldmljZUFkZGVkID0gZW52LT5HZXRNZXRob2RJRChjbGF6eiwgImRldmljZUFkZGVkIiwgIihJKVYiKTsKKyAgICBpZiAobWV0aG9kX2RldmljZUFkZGVkID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiQ2FuJ3QgZmluZCBkZXZpY2VBZGRlZCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIG1ldGhvZF9kZXZpY2VSZW1vdmVkID0gZW52LT5HZXRNZXRob2RJRChjbGF6eiwgImRldmljZVJlbW92ZWQiLCAiKEkpViIpOworICAgIGlmIChtZXRob2RfZGV2aWNlUmVtb3ZlZCA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIkNhbid0IGZpbmQgZGV2aWNlUmVtb3ZlZCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGZpZWxkX2NvbnRleHQgPSBlbnYtPkdldEZpZWxkSUQoY2xhenosICJtTmF0aXZlQ29udGV4dCIsICJJIik7CisgICAgaWYgKGZpZWxkX2NvbnRleHQgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJDYW4ndCBmaW5kIE10cENsaWVudC5tTmF0aXZlQ29udGV4dCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgcmV0dXJuIEFuZHJvaWRSdW50aW1lOjpyZWdpc3Rlck5hdGl2ZU1ldGhvZHMoZW52LAorICAgICAgICAgICAgICAgICJhbmRyb2lkL21lZGlhL010cENsaWVudCIsIGdNZXRob2RzLCBORUxFTShnTWV0aG9kcykpOworfQorCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9jb3JlL2puaS9hbmRyb2lkX21lZGlhX010cEN1cnNvci5jcHAgYi9jb3JlL2puaS9hbmRyb2lkX21lZGlhX010cEN1cnNvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2IwYjdiNwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvam5pL2FuZHJvaWRfbWVkaWFfTXRwQ3Vyc29yLmNwcApAQCAtMCwwICsxLDEzMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiTXRwQ3Vyc29ySk5JIgorI2luY2x1ZGUgInV0aWxzL0xvZy5oIgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorCisjaW5jbHVkZSAiam5pLmgiCisjaW5jbHVkZSAiSk5JSGVscC5oIgorI2luY2x1ZGUgImFuZHJvaWRfcnVudGltZS9BbmRyb2lkUnVudGltZS5oIgorI2luY2x1ZGUgImJpbmRlci9DdXJzb3JXaW5kb3cuaCIKKworI2luY2x1ZGUgIk10cENsaWVudC5oIgorI2luY2x1ZGUgIk10cEN1cnNvci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0YXRpYyBqZmllbGRJRCBmaWVsZF9jb250ZXh0OworCisvLyBGcm9tIGFuZHJvaWRfZGF0YWJhc2VfQ3Vyc29yV2luZG93LmNwcAorQ3Vyc29yV2luZG93ICogZ2V0X3dpbmRvd19mcm9tX29iamVjdChKTklFbnYgKiBlbnYsIGpvYmplY3QgamF2YVdpbmRvdyk7CisKKy8vIEZyb20gYW5kcm9pZF9tZWRpYV9NdHBDbGllbnQuY3BwCitNdHBDbGllbnQgKiBnZXRfY2xpZW50X2Zyb21fb2JqZWN0KEpOSUVudiAqIGVudiwgam9iamVjdCBqYXZhQ2xpZW50KTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgYm9vbCBFeGNlcHRpb25DaGVjayh2b2lkKiBlbnYpCit7CisgICAgcmV0dXJuICgoSk5JRW52ICopZW52KS0+RXhjZXB0aW9uQ2hlY2soKTsKK30KKworc3RhdGljIHZvaWQKK2FuZHJvaWRfbWVkaWFfTXRwQ3Vyc29yX3NldHVwKEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXosIGpvYmplY3QgamF2YUNsaWVudCwKKyAgICAgICAgamludCBxdWVyeVR5cGUsIGppbnQgZGV2aWNlSUQsIGppbnQgc3RvcmFnZUlELCBqaW50IG9iamVjdElELCBqaW50QXJyYXkgamF2YUNvbHVtbnMpCit7CisgICAgTE9HRCgiYW5kcm9pZF9tZWRpYV9NdHBDdXJzb3Jfc2V0dXAgcXVlcnlUeXBlOiAlZCBkZXZpY2VJRDogJWQgc3RvcmFnZUlEOiAlZCBvYmplY3RJRDogJWRcbiIsCisgICAgICAgICAgICAgICAgcXVlcnlUeXBlLCBkZXZpY2VJRCwgc3RvcmFnZUlELCBvYmplY3RJRCk7CisKKyAgICBpbnQqIGNvbHVtbnMgPSBOVUxMOworICAgIGludCBjb2x1bW5Db3VudCA9IDA7CisgICAgaWYgKGphdmFDb2x1bW5zKSB7CisgICAgICAgIGNvbHVtbnMgPSBlbnYtPkdldEludEFycmF5RWxlbWVudHMoamF2YUNvbHVtbnMsIDApOworICAgICAgICBjb2x1bW5Db3VudCA9IGVudi0+R2V0QXJyYXlMZW5ndGgoamF2YUNvbHVtbnMpOworICAgIH0KKworICAgIE10cENsaWVudCogY2xpZW50ID0gZ2V0X2NsaWVudF9mcm9tX29iamVjdChlbnYsIGphdmFDbGllbnQpOworICAgIE10cEN1cnNvciogY3Vyc29yID0gbmV3IE10cEN1cnNvcihjbGllbnQsIHF1ZXJ5VHlwZSwKKyAgICAgICAgICAgIGRldmljZUlELCBzdG9yYWdlSUQsIG9iamVjdElELCBjb2x1bW5Db3VudCwgY29sdW1ucyk7CisKKyAgICBpZiAoY29sdW1ucykKKyAgICAgICAgZW52LT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhqYXZhQ29sdW1ucywgY29sdW1ucywgMCk7CisgICAgZW52LT5TZXRJbnRGaWVsZCh0aGl6LCBmaWVsZF9jb250ZXh0LCAoaW50KWN1cnNvcik7Cit9CisKK3N0YXRpYyB2b2lkCithbmRyb2lkX21lZGlhX010cEN1cnNvcl9maW5hbGl6ZShKTklFbnYgKmVudiwgam9iamVjdCB0aGl6KQoreworICAgIExPR0QoImZpbmFsaXplXG4iKTsKKyAgICBNdHBDdXJzb3IgKmN1cnNvciA9IChNdHBDdXJzb3IgKillbnYtPkdldEludEZpZWxkKHRoaXosIGZpZWxkX2NvbnRleHQpOworICAgIGRlbGV0ZSBjdXJzb3I7Cit9CisKK3N0YXRpYyBqaW50CithbmRyb2lkX21lZGlhX010cEN1cnNvcl9maWxsX3dpbmRvdyhKTklFbnYgKmVudiwgam9iamVjdCB0aGl6LCBqb2JqZWN0IGphdmFXaW5kb3csIGppbnQgc3RhcnRQb3MpCit7CisgICAgQ3Vyc29yV2luZG93KiB3aW5kb3cgPSBnZXRfd2luZG93X2Zyb21fb2JqZWN0KGVudiwgamF2YVdpbmRvdyk7CisgICAgaWYgKCF3aW5kb3cpIHsKKyAgICAgICAgTE9HRSgiSW52YWxpZCBDdXJzb3JXaW5kb3ciKTsKKyAgICAgICAgam5pVGhyb3dFeGNlcHRpb24oZW52LCAiamF2YS9sYW5nL0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJCYWQgQ3Vyc29yV2luZG93Iik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBNdHBDdXJzb3IgKmN1cnNvciA9IChNdHBDdXJzb3IgKillbnYtPkdldEludEZpZWxkKHRoaXosIGZpZWxkX2NvbnRleHQpOworCisgICAgcmV0dXJuIGN1cnNvci0+ZmlsbFdpbmRvdyh3aW5kb3csIHN0YXJ0UG9zKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgSk5JTmF0aXZlTWV0aG9kIGdNZXRob2RzW10gPSB7CisgICAgeyJuYXRpdmVfc2V0dXAiLCAgICAgICAgICAgICIoTGFuZHJvaWQvbWVkaWEvTXRwQ2xpZW50O0lJSUlbSSlWIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKWFuZHJvaWRfbWVkaWFfTXRwQ3Vyc29yX3NldHVwfSwKKyAgICB7Im5hdGl2ZV9maW5hbGl6ZSIsICAgICAgICAgIigpViIsICAodm9pZCAqKWFuZHJvaWRfbWVkaWFfTXRwQ3Vyc29yX2ZpbmFsaXplfSwKKyAgICB7Im5hdGl2ZV9maWxsX3dpbmRvdyIsICAgICAgIihMYW5kcm9pZC9kYXRhYmFzZS9DdXJzb3JXaW5kb3c7SSlJIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKWFuZHJvaWRfbWVkaWFfTXRwQ3Vyc29yX2ZpbGxfd2luZG93fSwKKworfTsKKworc3RhdGljIGNvbnN0IGNoYXIqIGNvbnN0IGtDbGFzc1BhdGhOYW1lID0gImFuZHJvaWQvbWVkaWEvTXRwQ3Vyc29yIjsKKworaW50IHJlZ2lzdGVyX2FuZHJvaWRfbWVkaWFfTXRwQ3Vyc29yKEpOSUVudiAqZW52KQoreworICAgIGpjbGFzcyBjbGF6ejsKKworICAgIExPR0QoInJlZ2lzdGVyX2FuZHJvaWRfbWVkaWFfTXRwQ3Vyc29yXG4iKTsKKworICAgIGNsYXp6ID0gZW52LT5GaW5kQ2xhc3MoImFuZHJvaWQvbWVkaWEvTXRwQ3Vyc29yIik7CisgICAgaWYgKGNsYXp6ID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiQ2FuJ3QgZmluZCBhbmRyb2lkL21lZGlhL010cEN1cnNvciIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGZpZWxkX2NvbnRleHQgPSBlbnYtPkdldEZpZWxkSUQoY2xhenosICJtTmF0aXZlQ29udGV4dCIsICJJIik7CisgICAgaWYgKGZpZWxkX2NvbnRleHQgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJDYW4ndCBmaW5kIE10cEN1cnNvci5tTmF0aXZlQ29udGV4dCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgcmV0dXJuIEFuZHJvaWRSdW50aW1lOjpyZWdpc3Rlck5hdGl2ZU1ldGhvZHMoZW52LAorICAgICAgICAgICAgICAgICJhbmRyb2lkL21lZGlhL010cEN1cnNvciIsIGdNZXRob2RzLCBORUxFTShnTWV0aG9kcykpOworfQorCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9jb3JlL2puaS9hbmRyb2lkX25ldF9OZXRVdGlscy5jcHAgYi9jb3JlL2puaS9hbmRyb2lkX25ldF9OZXRVdGlscy5jcHAKaW5kZXggNTBkZjlkMy4uZmViMGRhZCAxMDA2NDQKLS0tIGEvY29yZS9qbmkvYW5kcm9pZF9uZXRfTmV0VXRpbHMuY3BwCisrKyBiL2NvcmUvam5pL2FuZHJvaWRfbmV0X05ldFV0aWxzLmNwcApAQCAtMjIsOCArMjIsMjkgQEAKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDxhcnBhL2luZXQuaD4KIAotI2luY2x1ZGUgPG5ldHV0aWxzL2lmYy5oPgotI2luY2x1ZGUgPG5ldHV0aWxzL2RoY3AuaD4KK2V4dGVybiAiQyIgeworaW50IGlmY19lbmFibGUoY29uc3QgY2hhciAqaWZuYW1lKTsKK2ludCBpZmNfZGlzYWJsZShjb25zdCBjaGFyICppZm5hbWUpOworaW50IGlmY19hZGRfaG9zdF9yb3V0ZShjb25zdCBjaGFyICppZm5hbWUsIHVpbnQzMl90IGFkZHIpOworaW50IGlmY19yZW1vdmVfaG9zdF9yb3V0ZXMoY29uc3QgY2hhciAqaWZuYW1lKTsKK2ludCBpZmNfc2V0X2RlZmF1bHRfcm91dGUoY29uc3QgY2hhciAqaWZuYW1lLCB1aW50MzJfdCBnYXRld2F5KTsKK2ludCBpZmNfZ2V0X2RlZmF1bHRfcm91dGUoY29uc3QgY2hhciAqaWZuYW1lKTsKK2ludCBpZmNfcmVtb3ZlX2RlZmF1bHRfcm91dGUoY29uc3QgY2hhciAqaWZuYW1lKTsKK2ludCBpZmNfcmVzZXRfY29ubmVjdGlvbnMoY29uc3QgY2hhciAqaWZuYW1lKTsKK2ludCBpZmNfY29uZmlndXJlKGNvbnN0IGNoYXIgKmlmbmFtZSwgaW5fYWRkcl90IGlwYWRkciwgaW5fYWRkcl90IG5ldG1hc2ssIGluX2FkZHJfdCBnYXRld2F5LCBpbl9hZGRyX3QgZG5zMSwgaW5fYWRkcl90IGRuczIpOworCitpbnQgZGhjcF9kb19yZXF1ZXN0KGNvbnN0IGNoYXIgKmlmbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgaW5fYWRkcl90ICppcGFkZHIsCisgICAgICAgICAgICAgICAgICAgIGluX2FkZHJfdCAqZ2F0ZXdheSwKKyAgICAgICAgICAgICAgICAgICAgaW5fYWRkcl90ICptYXNrLAorICAgICAgICAgICAgICAgICAgICBpbl9hZGRyX3QgKmRuczEsCisgICAgICAgICAgICAgICAgICAgIGluX2FkZHJfdCAqZG5zMiwKKyAgICAgICAgICAgICAgICAgICAgaW5fYWRkcl90ICpzZXJ2ZXIsCisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAqbGVhc2UpOworaW50IGRoY3Bfc3RvcChjb25zdCBjaGFyICppZm5hbWUpOworaW50IGRoY3BfcmVsZWFzZV9sZWFzZShjb25zdCBjaGFyICppZm5hbWUpOworY2hhciAqZGhjcF9nZXRfZXJybXNnKCk7Cit9CiAKICNkZWZpbmUgTkVUVVRJTFNfUEtHX05BTUUgImFuZHJvaWQvbmV0L05ldHdvcmtVdGlscyIKIApkaWZmIC0tZ2l0IGEvY29yZS9qbmkvYW5kcm9pZF9uZXRfd2lmaV9XaWZpLmNwcCBiL2NvcmUvam5pL2FuZHJvaWRfbmV0X3dpZmlfV2lmaS5jcHAKaW5kZXggM2ZjMGQ1OC4uNzM5MjQ0MiAxMDA2NDQKLS0tIGEvY29yZS9qbmkvYW5kcm9pZF9uZXRfd2lmaV9XaWZpLmNwcAorKysgYi9jb3JlL2puaS9hbmRyb2lkX25ldF93aWZpX1dpZmkuY3BwCkBAIC0zMCw2ICszMCwyMyBAQAogCiBzdGF0aWMgamJvb2xlYW4gc1NjYW5Nb2RlQWN0aXZlID0gZmFsc2U7CiAKKy8qCisgKiBUaGUgZm9sbG93aW5nIHJlbWVtYmVycyB0aGUgamZpZWxkSUQncyBvZiB0aGUgZmllbGRzCisgKiBvZiB0aGUgRGhjcEluZm8gSmF2YSBvYmplY3QsIHNvIHRoYXQgd2UgZG9uJ3QgaGF2ZQorICogdG8gbG9vayB0aGVtIHVwIGV2ZXJ5IHRpbWUuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgZmllbGRJZHMgeworICAgIGpjbGFzcyBkaGNwSW5mb0NsYXNzOworICAgIGptZXRob2RJRCBjb25zdHJ1Y3RvcklkOworICAgIGpmaWVsZElEIGlwYWRkcmVzczsKKyAgICBqZmllbGRJRCBnYXRld2F5OworICAgIGpmaWVsZElEIG5ldG1hc2s7CisgICAgamZpZWxkSUQgZG5zMTsKKyAgICBqZmllbGRJRCBkbnMyOworICAgIGpmaWVsZElEIHNlcnZlckFkZHJlc3M7CisgICAgamZpZWxkSUQgbGVhc2VEdXJhdGlvbjsKK30gZGhjcEluZm9GaWVsZElkczsKKwogc3RhdGljIGludCBkb0NvbW1hbmQoY29uc3QgY2hhciAqY21kLCBjaGFyICpyZXBseWJ1ZiwgaW50IHJlcGx5YnVmbGVuKQogewogICAgIHNpemVfdCByZXBseV9sZW4gPSByZXBseWJ1ZmxlbiAtIDE7CkBAIC00NzYsNiArNDkzLDI4IEBACiAgICAgcmV0dXJuIGRvQm9vbGVhbkNvbW1hbmQoIkJMQUNLTElTVCBjbGVhciIsICJPSyIpOwogfQogCitzdGF0aWMgamJvb2xlYW4gYW5kcm9pZF9uZXRfd2lmaV9kb0RoY3BSZXF1ZXN0KEpOSUVudiogZW52LCBqb2JqZWN0IGNsYXp6LCBqb2JqZWN0IGluZm8pCit7CisgICAgamludCBpcGFkZHIsIGdhdGV3YXksIG1hc2ssIGRuczEsIGRuczIsIHNlcnZlciwgbGVhc2U7CisgICAgamJvb2xlYW4gc3VjY2VlZGVkID0gKChqYm9vbGVhbik6OmRvX2RoY3BfcmVxdWVzdCgmaXBhZGRyLCAmZ2F0ZXdheSwgJm1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRuczEsICZkbnMyLCAmc2VydmVyLCAmbGVhc2UpID09IDApOworICAgIGlmIChzdWNjZWVkZWQgJiYgZGhjcEluZm9GaWVsZElkcy5kaGNwSW5mb0NsYXNzICE9IE5VTEwpIHsKKyAgICAgICAgZW52LT5TZXRJbnRGaWVsZChpbmZvLCBkaGNwSW5mb0ZpZWxkSWRzLmlwYWRkcmVzcywgaXBhZGRyKTsKKyAgICAgICAgZW52LT5TZXRJbnRGaWVsZChpbmZvLCBkaGNwSW5mb0ZpZWxkSWRzLmdhdGV3YXksIGdhdGV3YXkpOworICAgICAgICBlbnYtPlNldEludEZpZWxkKGluZm8sIGRoY3BJbmZvRmllbGRJZHMubmV0bWFzaywgbWFzayk7CisgICAgICAgIGVudi0+U2V0SW50RmllbGQoaW5mbywgZGhjcEluZm9GaWVsZElkcy5kbnMxLCBkbnMxKTsKKyAgICAgICAgZW52LT5TZXRJbnRGaWVsZChpbmZvLCBkaGNwSW5mb0ZpZWxkSWRzLmRuczIsIGRuczIpOworICAgICAgICBlbnYtPlNldEludEZpZWxkKGluZm8sIGRoY3BJbmZvRmllbGRJZHMuc2VydmVyQWRkcmVzcywgc2VydmVyKTsKKyAgICAgICAgZW52LT5TZXRJbnRGaWVsZChpbmZvLCBkaGNwSW5mb0ZpZWxkSWRzLmxlYXNlRHVyYXRpb24sIGxlYXNlKTsKKyAgICB9CisgICAgcmV0dXJuIHN1Y2NlZWRlZDsKK30KKworc3RhdGljIGpzdHJpbmcgYW5kcm9pZF9uZXRfd2lmaV9nZXREaGNwRXJyb3IoSk5JRW52KiBlbnYsIGpvYmplY3QgY2xhenopCit7CisgICAgcmV0dXJuIGVudi0+TmV3U3RyaW5nVVRGKDo6Z2V0X2RoY3BfZXJyb3Jfc3RyaW5nKCkpOworfQorCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIC8qCkBAIC01MzIsNiArNTcxLDkgQEAKICAgICB7ICJzZXRTY2FuUmVzdWx0SGFuZGxpbmdDb21tYW5kIiwgIihJKVoiLCAodm9pZCopIGFuZHJvaWRfbmV0X3dpZmlfc2V0U2NhblJlc3VsdEhhbmRsaW5nQ29tbWFuZCB9LAogICAgIHsgImFkZFRvQmxhY2tsaXN0Q29tbWFuZCIsICIoTGphdmEvbGFuZy9TdHJpbmc7KVoiLCAodm9pZCopIGFuZHJvaWRfbmV0X3dpZmlfYWRkVG9CbGFja2xpc3RDb21tYW5kIH0sCiAgICAgeyAiY2xlYXJCbGFja2xpc3RDb21tYW5kIiwgIigpWiIsICh2b2lkKikgYW5kcm9pZF9uZXRfd2lmaV9jbGVhckJsYWNrbGlzdENvbW1hbmQgfSwKKworICAgIHsgImRvRGhjcFJlcXVlc3QiLCAiKExhbmRyb2lkL25ldC9EaGNwSW5mbzspWiIsICh2b2lkKikgYW5kcm9pZF9uZXRfd2lmaV9kb0RoY3BSZXF1ZXN0IH0sCisgICAgeyAiZ2V0RGhjcEVycm9yIiwgIigpTGphdmEvbGFuZy9TdHJpbmc7IiwgKHZvaWQqKSBhbmRyb2lkX25ldF93aWZpX2dldERoY3BFcnJvciB9LAogfTsKIAogaW50IHJlZ2lzdGVyX2FuZHJvaWRfbmV0X3dpZmlfV2lmaU1hbmFnZXIoSk5JRW52KiBlbnYpCkBAIC01MzksNiArNTgxLDE4IEBACiAgICAgamNsYXNzIHdpZmkgPSBlbnYtPkZpbmRDbGFzcyhXSUZJX1BLR19OQU1FKTsKICAgICBMT0dfRkFUQUxfSUYod2lmaSA9PSBOVUxMLCAiVW5hYmxlIHRvIGZpbmQgY2xhc3MgIiBXSUZJX1BLR19OQU1FKTsKIAorICAgIGRoY3BJbmZvRmllbGRJZHMuZGhjcEluZm9DbGFzcyA9IGVudi0+RmluZENsYXNzKCJhbmRyb2lkL25ldC9EaGNwSW5mbyIpOworICAgIGlmIChkaGNwSW5mb0ZpZWxkSWRzLmRoY3BJbmZvQ2xhc3MgIT0gTlVMTCkgeworICAgICAgICBkaGNwSW5mb0ZpZWxkSWRzLmNvbnN0cnVjdG9ySWQgPSBlbnYtPkdldE1ldGhvZElEKGRoY3BJbmZvRmllbGRJZHMuZGhjcEluZm9DbGFzcywgIjxpbml0PiIsICIoKVYiKTsKKyAgICAgICAgZGhjcEluZm9GaWVsZElkcy5pcGFkZHJlc3MgPSBlbnYtPkdldEZpZWxkSUQoZGhjcEluZm9GaWVsZElkcy5kaGNwSW5mb0NsYXNzLCAiaXBBZGRyZXNzIiwgIkkiKTsKKyAgICAgICAgZGhjcEluZm9GaWVsZElkcy5nYXRld2F5ID0gZW52LT5HZXRGaWVsZElEKGRoY3BJbmZvRmllbGRJZHMuZGhjcEluZm9DbGFzcywgImdhdGV3YXkiLCAiSSIpOworICAgICAgICBkaGNwSW5mb0ZpZWxkSWRzLm5ldG1hc2sgPSBlbnYtPkdldEZpZWxkSUQoZGhjcEluZm9GaWVsZElkcy5kaGNwSW5mb0NsYXNzLCAibmV0bWFzayIsICJJIik7CisgICAgICAgIGRoY3BJbmZvRmllbGRJZHMuZG5zMSA9IGVudi0+R2V0RmllbGRJRChkaGNwSW5mb0ZpZWxkSWRzLmRoY3BJbmZvQ2xhc3MsICJkbnMxIiwgIkkiKTsKKyAgICAgICAgZGhjcEluZm9GaWVsZElkcy5kbnMyID0gZW52LT5HZXRGaWVsZElEKGRoY3BJbmZvRmllbGRJZHMuZGhjcEluZm9DbGFzcywgImRuczIiLCAiSSIpOworICAgICAgICBkaGNwSW5mb0ZpZWxkSWRzLnNlcnZlckFkZHJlc3MgPSBlbnYtPkdldEZpZWxkSUQoZGhjcEluZm9GaWVsZElkcy5kaGNwSW5mb0NsYXNzLCAic2VydmVyQWRkcmVzcyIsICJJIik7CisgICAgICAgIGRoY3BJbmZvRmllbGRJZHMubGVhc2VEdXJhdGlvbiA9IGVudi0+R2V0RmllbGRJRChkaGNwSW5mb0ZpZWxkSWRzLmRoY3BJbmZvQ2xhc3MsICJsZWFzZUR1cmF0aW9uIiwgIkkiKTsKKyAgICB9CisKICAgICByZXR1cm4gQW5kcm9pZFJ1bnRpbWU6OnJlZ2lzdGVyTmF0aXZlTWV0aG9kcyhlbnYsCiAgICAgICAgICAgICBXSUZJX1BLR19OQU1FLCBnV2lmaU1ldGhvZHMsIE5FTEVNKGdXaWZpTWV0aG9kcykpOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9qbmkvYW5kcm9pZF9zZXJ2ZXJfQmx1ZXRvb3RoRXZlbnRMb29wLmNwcCBiL2NvcmUvam5pL2FuZHJvaWRfc2VydmVyX0JsdWV0b290aEV2ZW50TG9vcC5jcHAKaW5kZXggMDFiNjcxMS4uM2M4ODE1OCAxMDA2NDQKLS0tIGEvY29yZS9qbmkvYW5kcm9pZF9zZXJ2ZXJfQmx1ZXRvb3RoRXZlbnRMb29wLmNwcAorKysgYi9jb3JlL2puaS9hbmRyb2lkX3NlcnZlcl9CbHVldG9vdGhFdmVudExvb3AuY3BwCkBAIC02NCw2ICs2NCw4IEBACiBzdGF0aWMgam1ldGhvZElEIG1ldGhvZF9vbkFnZW50QXV0aG9yaXplOwogc3RhdGljIGptZXRob2RJRCBtZXRob2Rfb25BZ2VudENhbmNlbDsKIAorc3RhdGljIGptZXRob2RJRCBtZXRob2Rfb25JbnB1dERldmljZVByb3BlcnR5Q2hhbmdlZDsKKwogdHlwZWRlZiBldmVudF9sb29wX25hdGl2ZV9kYXRhX3QgbmF0aXZlX2RhdGFfdDsKIAogI2RlZmluZSBFVkVOVF9MT09QX1JFRlMgMTAKQEAgLTExNiw2ICsxMTgsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKExqYXZhL2xhbmcvU3RyaW5nO0kpViIpOwogICAgIG1ldGhvZF9vbkRpc3BsYXlQYXNza2V5ID0gZW52LT5HZXRNZXRob2RJRChjbGF6eiwgIm9uRGlzcGxheVBhc3NrZXkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKExqYXZhL2xhbmcvU3RyaW5nO0lJKVYiKTsKKyAgICBtZXRob2Rfb25JbnB1dERldmljZVByb3BlcnR5Q2hhbmdlZCA9IGVudi0+R2V0TWV0aG9kSUQoY2xhenosICJvbklucHV0RGV2aWNlUHJvcGVydHlDaGFuZ2VkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoTGphdmEvbGFuZy9TdHJpbmc7W0xqYXZhL2xhbmcvU3RyaW5nOylWIik7CisKIAogICAgIGZpZWxkX21OYXRpdmVEYXRhID0gZW52LT5HZXRGaWVsZElEKGNsYXp6LCAibU5hdGl2ZURhdGEiLCAiSSIpOwogI2VuZGlmCkBAIC04NTMsNiArODU4LDIyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kX29uRGV2aWNlRGlzY29ubmVjdFJlcXVlc3RlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnYtPk5ld1N0cmluZ1VURihyZW1vdGVfZGV2aWNlX3BhdGgpKTsKICAgICAgICAgZ290byBzdWNjZXNzOworICAgIH0gZWxzZSBpZiAoZGJ1c19tZXNzYWdlX2lzX3NpZ25hbChtc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYmx1ZXouSW5wdXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUHJvcGVydHlDaGFuZ2VkIikpIHsKKworICAgICAgICBqb2JqZWN0QXJyYXkgc3RyX2FycmF5ID0KKyAgICAgICAgICAgICAgICAgICAgcGFyc2VfaW5wdXRfcHJvcGVydHlfY2hhbmdlKGVudiwgbXNnKTsKKyAgICAgICAgaWYgKHN0cl9hcnJheSAhPSBOVUxMKSB7CisgICAgICAgICAgICBjb25zdCBjaGFyICpjX3BhdGggPSBkYnVzX21lc3NhZ2VfZ2V0X3BhdGgobXNnKTsKKyAgICAgICAgICAgIGVudi0+Q2FsbFZvaWRNZXRob2QobmF0LT5tZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kX29uSW5wdXREZXZpY2VQcm9wZXJ0eUNoYW5nZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudi0+TmV3U3RyaW5nVVRGKGNfcGF0aCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cl9hcnJheSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMT0dfQU5EX0ZSRUVfREJVU19FUlJPUl9XSVRIX01TRygmZXJyLCBtc2cpOworICAgICAgICB9CisgICAgICAgIGdvdG8gc3VjY2VzczsKICAgICB9CiAKICAgICByZXQgPSBhMmRwX2V2ZW50X2ZpbHRlcihtc2csIGVudik7CmRpZmYgLS1naXQgYS9jb3JlL2puaS9hbmRyb2lkX3NlcnZlcl9CbHVldG9vdGhTZXJ2aWNlLmNwcCBiL2NvcmUvam5pL2FuZHJvaWRfc2VydmVyX0JsdWV0b290aFNlcnZpY2UuY3BwCmluZGV4IDQ0MjBhY2EuLmE1MmE3NGMgMTAwNjQ0Ci0tLSBhL2NvcmUvam5pL2FuZHJvaWRfc2VydmVyX0JsdWV0b290aFNlcnZpY2UuY3BwCisrKyBiL2NvcmUvam5pL2FuZHJvaWRfc2VydmVyX0JsdWV0b290aFNlcnZpY2UuY3BwCkBAIC0xNiw2ICsxNiw4IEBACiAKICNkZWZpbmUgREJVU19BREFQVEVSX0lGQUNFIEJMVUVaX0RCVVNfQkFTRV9JRkMgIi5BZGFwdGVyIgogI2RlZmluZSBEQlVTX0RFVklDRV9JRkFDRSBCTFVFWl9EQlVTX0JBU0VfSUZDICIuRGV2aWNlIgorI2RlZmluZSBEQlVTX0lOUFVUX0lGQUNFIEJMVUVaX0RCVVNfQkFTRV9JRkMgIi5JbnB1dCIKKwogI2RlZmluZSBMT0dfVEFHICJCbHVldG9vdGhTZXJ2aWNlLmNwcCIKIAogI2luY2x1ZGUgImFuZHJvaWRfYmx1ZXRvb3RoX2NvbW1vbi5oIgpAQCAtODgxLDYgKzg4Myw0MyBAQAogICAgIHJldHVybiBKTklfRkFMU0U7CiB9CiAKK3N0YXRpYyBqYm9vbGVhbiBjb25uZWN0SW5wdXREZXZpY2VOYXRpdmUoSk5JRW52ICplbnYsIGpvYmplY3Qgb2JqZWN0LCBqc3RyaW5nIHBhdGgpIHsKKyAgICBMT0dWKF9fRlVOQ1RJT05fXyk7CisjaWZkZWYgSEFWRV9CTFVFVE9PVEgKKyAgICBuYXRpdmVfZGF0YV90ICpuYXQgPSBnZXRfbmF0aXZlX2RhdGEoZW52LCBvYmplY3QpOworICAgIGlmIChuYXQpIHsKKyAgICAgICAgY29uc3QgY2hhciAqY19wYXRoID0gZW52LT5HZXRTdHJpbmdVVEZDaGFycyhwYXRoLCBOVUxMKTsKKworICAgICAgICBib29sIHJldCA9IGRidXNfZnVuY19hcmdzX2FzeW5jKGVudiwgbmF0LT5jb25uLCAtMSwgTlVMTCwgTlVMTCwgbmF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY19wYXRoLCBEQlVTX0lOUFVUX0lGQUNFLCAiQ29ubmVjdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCk7CisKKyAgICAgICAgZW52LT5SZWxlYXNlU3RyaW5nVVRGQ2hhcnMocGF0aCwgY19wYXRoKTsKKyAgICAgICAgcmV0dXJuIHJldCA/IEpOSV9UUlVFIDogSk5JX0ZBTFNFOworICAgIH0KKyNlbmRpZgorICAgIHJldHVybiBKTklfRkFMU0U7Cit9CisKK3N0YXRpYyBqYm9vbGVhbiBkaXNjb25uZWN0SW5wdXREZXZpY2VOYXRpdmUoSk5JRW52ICplbnYsIGpvYmplY3Qgb2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpzdHJpbmcgcGF0aCkgeworICAgIExPR1YoX19GVU5DVElPTl9fKTsKKyNpZmRlZiBIQVZFX0JMVUVUT09USAorICAgIG5hdGl2ZV9kYXRhX3QgKm5hdCA9IGdldF9uYXRpdmVfZGF0YShlbnYsIG9iamVjdCk7CisgICAgaWYgKG5hdCkgeworICAgICAgICBjb25zdCBjaGFyICpjX3BhdGggPSBlbnYtPkdldFN0cmluZ1VURkNoYXJzKHBhdGgsIE5VTEwpOworCisgICAgICAgIGJvb2wgcmV0ID0gZGJ1c19mdW5jX2FyZ3NfYXN5bmMoZW52LCBuYXQtPmNvbm4sIC0xLCBOVUxMLCBOVUxMLCBuYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjX3BhdGgsIERCVVNfSU5QVVRfSUZBQ0UsICJEaXNjb25uZWN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlZBTElEKTsKKworICAgICAgICBlbnYtPlJlbGVhc2VTdHJpbmdVVEZDaGFycyhwYXRoLCBjX3BhdGgpOworICAgICAgICByZXR1cm4gcmV0ID8gSk5JX1RSVUUgOiBKTklfRkFMU0U7CisgICAgfQorI2VuZGlmCisgICAgcmV0dXJuIEpOSV9GQUxTRTsKK30KKwogc3RhdGljIEpOSU5hdGl2ZU1ldGhvZCBzTWV0aG9kc1tdID0gewogICAgICAvKiBuYW1lLCBzaWduYXR1cmUsIGZ1bmNQdHIgKi8KICAgICB7ImNsYXNzSW5pdE5hdGl2ZSIsICIoKVYiLCAodm9pZCopY2xhc3NJbml0TmF0aXZlfSwKQEAgLTkyNiw2ICs5NjUsOSBAQAogICAgIHsiYWRkUmZjb21tU2VydmljZVJlY29yZE5hdGl2ZSIsICIoTGphdmEvbGFuZy9TdHJpbmc7SkpTKUkiLCAodm9pZCAqKWFkZFJmY29tbVNlcnZpY2VSZWNvcmROYXRpdmV9LAogICAgIHsicmVtb3ZlU2VydmljZVJlY29yZE5hdGl2ZSIsICIoSSlaIiwgKHZvaWQgKilyZW1vdmVTZXJ2aWNlUmVjb3JkTmF0aXZlfSwKICAgICB7InNldExpbmtUaW1lb3V0TmF0aXZlIiwgIihMamF2YS9sYW5nL1N0cmluZztJKVoiLCAodm9pZCAqKXNldExpbmtUaW1lb3V0TmF0aXZlfSwKKyAgICAvLyBISUQgZnVuY3Rpb25zCisgICAgeyJjb25uZWN0SW5wdXREZXZpY2VOYXRpdmUiLCAiKExqYXZhL2xhbmcvU3RyaW5nOylaIiwgKHZvaWQgKiljb25uZWN0SW5wdXREZXZpY2VOYXRpdmV9LAorICAgIHsiZGlzY29ubmVjdElucHV0RGV2aWNlTmF0aXZlIiwgIihMamF2YS9sYW5nL1N0cmluZzspWiIsICh2b2lkICopZGlzY29ubmVjdElucHV0RGV2aWNlTmF0aXZlfSwKIH07CiAKIGludCByZWdpc3Rlcl9hbmRyb2lkX3NlcnZlcl9CbHVldG9vdGhTZXJ2aWNlKEpOSUVudiAqZW52KSB7CmRpZmYgLS1naXQgYS9jb3JlL2puaS9hbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzLmNwcCBiL2NvcmUvam5pL2FuZHJvaWRfdmlld19HTEVTMjBDYW52YXMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkOWNlNDQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2puaS9hbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzLmNwcApAQCAtMCwwICsxLDI0NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJqbmkuaCIKKyNpbmNsdWRlIDxuYXRpdmVoZWxwZXIvSk5JSGVscC5oPgorI2luY2x1ZGUgPGFuZHJvaWRfcnVudGltZS9BbmRyb2lkUnVudGltZS5oPgorCisjaW5jbHVkZSA8U2tDYW52YXMuaD4KKyNpbmNsdWRlIDxTa01hdHJpeC5oPgorI2luY2x1ZGUgPFNrUGFpbnQuaD4KKyNpbmNsdWRlIDxTa1hmZXJtb2RlLmg+CisKKyNpbmNsdWRlIDxPcGVuR0xSZW5kZXJlci5oPgorI2luY2x1ZGUgPFJlY3QuaD4KKyNpbmNsdWRlIDx1aS9SZWN0Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKwordXNpbmcgbmFtZXNwYWNlIHVpcmVuZGVyZXI7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEphdmEgQVBJcworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgc3RydWN0IHsKKyAgICBqY2xhc3MgY2xheno7CisgICAgam1ldGhvZElEIHNldDsKK30gZ1JlY3RDbGFzc0luZm87CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIENvbnN0cnVjdG9ycworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgT3BlbkdMUmVuZGVyZXIqIGFuZHJvaWRfdmlld19HTEVTMjBSZW5kZXJlcl9jcmVhdGVSZW5kZXJlcihKTklFbnYqIGVudiwgam9iamVjdCBjYW52YXMpIHsKKyAgICByZXR1cm4gbmV3IE9wZW5HTFJlbmRlcmVyOworfQorCitzdGF0aWMgdm9pZCBhbmRyb2lkX3ZpZXdfR0xFUzIwUmVuZGVyZXJfZGVzdHJveVJlbmRlcmVyKEpOSUVudiogZW52LCBqb2JqZWN0IGNhbnZhcywKKyAgICAgICAgT3BlbkdMUmVuZGVyZXIqIHJlbmRlcmVyKSB7CisgICAgZGVsZXRlIHJlbmRlcmVyOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBTZXR1cAorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZCBhbmRyb2lkX3ZpZXdfR0xFUzIwUmVuZGVyZXJfc2V0Vmlld3BvcnQoSk5JRW52KiBlbnYsIGpvYmplY3QgY2FudmFzLAorICAgICAgICBPcGVuR0xSZW5kZXJlciogcmVuZGVyZXIsIGppbnQgd2lkdGgsIGppbnQgaGVpZ2h0KSB7CisgICAgcmVuZGVyZXItPnNldFZpZXdwb3J0KHdpZHRoLCBoZWlnaHQpOworfQorCitzdGF0aWMgdm9pZCBhbmRyb2lkX3ZpZXdfR0xFUzIwUmVuZGVyZXJfcHJlcGFyZShKTklFbnYqIGVudiwgam9iamVjdCBjYW52YXMsCisgICAgICAgIE9wZW5HTFJlbmRlcmVyKiByZW5kZXJlcikgeworICAgIHJlbmRlcmVyLT5wcmVwYXJlKCk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFN0YXRlCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBqaW50IGFuZHJvaWRfdmlld19HTEVTMjBSZW5kZXJlcl9zYXZlKEpOSUVudiogZW52LCBqb2JqZWN0IGNhbnZhcywgT3BlbkdMUmVuZGVyZXIqIHJlbmRlcmVyLAorICAgICAgICBqaW50IGZsYWdzKSB7CisgICAgcmV0dXJuIHJlbmRlcmVyLT5zYXZlKGZsYWdzKTsKK30KKworc3RhdGljIGppbnQgYW5kcm9pZF92aWV3X0dMRVMyMFJlbmRlcmVyX2dldFNhdmVDb3VudChKTklFbnYqIGVudiwgam9iamVjdCBjYW52YXMsCisgICAgICAgIE9wZW5HTFJlbmRlcmVyKiByZW5kZXJlcikgeworICAgIHJldHVybiByZW5kZXJlci0+Z2V0U2F2ZUNvdW50KCk7Cit9CisKK3N0YXRpYyB2b2lkIGFuZHJvaWRfdmlld19HTEVTMjBSZW5kZXJlcl9yZXN0b3JlKEpOSUVudiogZW52LCBqb2JqZWN0IGNhbnZhcywKKyAgICAgICAgT3BlbkdMUmVuZGVyZXIqIHJlbmRlcmVyKSB7CisgICAgcmVuZGVyZXItPnJlc3RvcmUoKTsKK30KKworc3RhdGljIHZvaWQgYW5kcm9pZF92aWV3X0dMRVMyMFJlbmRlcmVyX3Jlc3RvcmVUb0NvdW50KEpOSUVudiogZW52LCBqb2JqZWN0IGNhbnZhcywKKyAgICAgICAgT3BlbkdMUmVuZGVyZXIqIHJlbmRlcmVyLCBqaW50IHNhdmVDb3VudCkgeworICAgIHJlbmRlcmVyLT5yZXN0b3JlVG9Db3VudChzYXZlQ291bnQpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBMYXllcnMKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIGppbnQgYW5kcm9pZF92aWV3X0dMRVMyMFJlbmRlcmVyX3NhdmVMYXllcihKTklFbnYqIGVudiwgam9iamVjdCBjYW52YXMsCisgICAgICAgIE9wZW5HTFJlbmRlcmVyKiByZW5kZXJlciwgamZsb2F0IGxlZnQsIGpmbG9hdCB0b3AsIGpmbG9hdCByaWdodCwgamZsb2F0IGJvdHRvbSwKKyAgICAgICAgU2tQYWludCogcGFpbnQsIGppbnQgc2F2ZUZsYWdzKSB7CisgICAgcmV0dXJuIHJlbmRlcmVyLT5zYXZlTGF5ZXIobGVmdCwgdG9wLCByaWdodCwgYm90dG9tLCBwYWludCwgc2F2ZUZsYWdzKTsKK30KKworc3RhdGljIGppbnQgYW5kcm9pZF92aWV3X0dMRVMyMFJlbmRlcmVyX3NhdmVMYXllckFscGhhKEpOSUVudiogZW52LCBqb2JqZWN0IGNhbnZhcywKKyAgICAgICAgT3BlbkdMUmVuZGVyZXIqIHJlbmRlcmVyLCBqZmxvYXQgbGVmdCwgamZsb2F0IHRvcCwgamZsb2F0IHJpZ2h0LCBqZmxvYXQgYm90dG9tLAorICAgICAgICBqaW50IGFscGhhLCBqaW50IHNhdmVGbGFncykgeworICAgIHJldHVybiByZW5kZXJlci0+c2F2ZUxheWVyQWxwaGEobGVmdCwgdG9wLCByaWdodCwgYm90dG9tLCBhbHBoYSwgc2F2ZUZsYWdzKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQ2xpcHBpbmcKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIGJvb2wgYW5kcm9pZF92aWV3X0dMRVMyMFJlbmRlcmVyX3F1aWNrUmVqZWN0KEpOSUVudiogZW52LCBqb2JqZWN0IGNhbnZhcywKKyAgICAgICAgT3BlbkdMUmVuZGVyZXIqIHJlbmRlcmVyLCBqZmxvYXQgbGVmdCwgamZsb2F0IHRvcCwgamZsb2F0IHJpZ2h0LCBqZmxvYXQgYm90dG9tLAorICAgICAgICBTa0NhbnZhczo6RWRnZVR5cGUgZWRnZSkgeworICAgIHJldHVybiByZW5kZXJlci0+cXVpY2tSZWplY3QobGVmdCwgdG9wLCByaWdodCwgYm90dG9tKTsKK30KKworc3RhdGljIGJvb2wgYW5kcm9pZF92aWV3X0dMRVMyMFJlbmRlcmVyX2NsaXBSZWN0RihKTklFbnYqIGVudiwgam9iamVjdCBjYW52YXMsCisgICAgICAgIE9wZW5HTFJlbmRlcmVyKiByZW5kZXJlciwgamZsb2F0IGxlZnQsIGpmbG9hdCB0b3AsIGpmbG9hdCByaWdodCwgamZsb2F0IGJvdHRvbSkgeworICAgIHJldHVybiByZW5kZXJlci0+Y2xpcFJlY3QobGVmdCwgdG9wLCByaWdodCwgYm90dG9tKTsKK30KKworc3RhdGljIGJvb2wgYW5kcm9pZF92aWV3X0dMRVMyMFJlbmRlcmVyX2NsaXBSZWN0KEpOSUVudiogZW52LCBqb2JqZWN0IGNhbnZhcywKKyAgICAgICAgT3BlbkdMUmVuZGVyZXIqIHJlbmRlcmVyLCBqaW50IGxlZnQsIGppbnQgdG9wLCBqaW50IHJpZ2h0LCBqaW50IGJvdHRvbSkgeworICAgIHJldHVybiByZW5kZXJlci0+Y2xpcFJlY3QoZmxvYXQobGVmdCksIGZsb2F0KHRvcCksIGZsb2F0KHJpZ2h0KSwgZmxvYXQoYm90dG9tKSk7Cit9CisKK3N0YXRpYyBib29sIGFuZHJvaWRfdmlld19HTEVTMjBSZW5kZXJlcl9nZXRDbGlwQm91bmRzKEpOSUVudiogZW52LCBqb2JqZWN0IGNhbnZhcywKKyAgICAgICAgT3BlbkdMUmVuZGVyZXIqIHJlbmRlcmVyLCBqb2JqZWN0IHJlY3QpIHsKKworICAgIGNvbnN0IGFuZHJvaWQ6OnVpcmVuZGVyZXI6OlJlY3QmIGJvdW5kcyhyZW5kZXJlci0+Z2V0Q2xpcEJvdW5kcygpKTsKKworICAgIGVudi0+Q2FsbFZvaWRNZXRob2QocmVjdCwgZ1JlY3RDbGFzc0luZm8uc2V0LAorICAgICAgICAgICAgaW50KGJvdW5kcy5sZWZ0KSwgaW50KGJvdW5kcy50b3ApLCBpbnQoYm91bmRzLnJpZ2h0KSwgaW50KGJvdW5kcy5ib3R0b20pKTsKKworICAgIHJldHVybiAhYm91bmRzLmlzRW1wdHkoKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVHJhbnNmb3JtcworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZCBhbmRyb2lkX3ZpZXdfR0xFUzIwUmVuZGVyZXJfdHJhbnNsYXRlKEpOSUVudiogZW52LCBqb2JqZWN0IGNhbnZhcywKKyAgICAgICAgT3BlbkdMUmVuZGVyZXIqIHJlbmRlcmVyLCBqZmxvYXQgZHgsIGpmbG9hdCBkeSkgeworICAgIHJlbmRlcmVyLT50cmFuc2xhdGUoZHgsIGR5KTsKK30KKworc3RhdGljIHZvaWQgYW5kcm9pZF92aWV3X0dMRVMyMFJlbmRlcmVyX3JvdGF0ZShKTklFbnYqIGVudiwgam9iamVjdCBjYW52YXMsCisgICAgICAgIE9wZW5HTFJlbmRlcmVyKiByZW5kZXJlciwgamZsb2F0IGRlZ3JlZXMpIHsKKyAgICByZW5kZXJlci0+cm90YXRlKGRlZ3JlZXMpOworfQorCitzdGF0aWMgdm9pZCBhbmRyb2lkX3ZpZXdfR0xFUzIwUmVuZGVyZXJfc2NhbGUoSk5JRW52KiBlbnYsIGpvYmplY3QgY2FudmFzLAorICAgICAgICBPcGVuR0xSZW5kZXJlciogcmVuZGVyZXIsIGpmbG9hdCBzeCwgamZsb2F0IHN5KSB7CisgICAgcmVuZGVyZXItPnNjYWxlKHN4LCBzeSk7Cit9CisKK3N0YXRpYyB2b2lkIGFuZHJvaWRfdmlld19HTEVTMjBSZW5kZXJlcl9zZXRNYXRyaXgoSk5JRW52KiBlbnYsIGpvYmplY3QgY2FudmFzLAorICAgICAgICBPcGVuR0xSZW5kZXJlciogcmVuZGVyZXIsIFNrTWF0cml4KiBtYXRyaXgpIHsKKyAgICByZW5kZXJlci0+c2V0TWF0cml4KG1hdHJpeCk7Cit9CisKK3N0YXRpYyB2b2lkIGFuZHJvaWRfdmlld19HTEVTMjBSZW5kZXJlcl9nZXRNYXRyaXgoSk5JRW52KiBlbnYsIGpvYmplY3QgY2FudmFzLAorICAgICAgICBPcGVuR0xSZW5kZXJlciogcmVuZGVyZXIsIFNrTWF0cml4KiBtYXRyaXgpIHsKKyAgICByZW5kZXJlci0+Z2V0TWF0cml4KG1hdHJpeCk7Cit9CisKK3N0YXRpYyB2b2lkIGFuZHJvaWRfdmlld19HTEVTMjBSZW5kZXJlcl9jb25jYXRNYXRyaXgoSk5JRW52KiBlbnYsIGpvYmplY3QgY2FudmFzLAorICAgICAgICBPcGVuR0xSZW5kZXJlciogcmVuZGVyZXIsIFNrTWF0cml4KiBtYXRyaXgpIHsKKyAgICByZW5kZXJlci0+Y29uY2F0TWF0cml4KG1hdHJpeCk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIERyYXdpbmcKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQgYW5kcm9pZF92aWV3X0dMRVMyMFJlbmRlcmVyX2RyYXdDb2xvcihKTklFbnYqIGVudiwgam9iamVjdCBjYW52YXMsCisgICAgICAgIE9wZW5HTFJlbmRlcmVyKiByZW5kZXJlciwgamludCBjb2xvciwgamludCBtb2RlKSB7CisgICAgcmVuZGVyZXItPmRyYXdDb2xvcihjb2xvciwgKFNrWGZlcm1vZGU6Ok1vZGUpIG1vZGUpOworfQorCitzdGF0aWMgdm9pZCBhbmRyb2lkX3ZpZXdfR0xFUzIwUmVuZGVyZXJfZHJhd1JlY3QoSk5JRW52KiBlbnYsIGpvYmplY3QgY2FudmFzLAorICAgICAgICBPcGVuR0xSZW5kZXJlciogcmVuZGVyZXIsIGpmbG9hdCBsZWZ0LCBqZmxvYXQgdG9wLCBqZmxvYXQgcmlnaHQsIGpmbG9hdCBib3R0b20sCisgICAgICAgIFNrUGFpbnQqIHBhaW50KSB7CisgICAgcmVuZGVyZXItPmRyYXdSZWN0KGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSwgcGFpbnQpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBKTkkgR2x1ZQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjb25zdCBjaGFyKiBjb25zdCBrQ2xhc3NQYXRoTmFtZSA9ICJhbmRyb2lkL3ZpZXcvR0xFUzIwQ2FudmFzIjsKKworc3RhdGljIEpOSU5hdGl2ZU1ldGhvZCBnTWV0aG9kc1tdID0geworICAgIHsgICAibkNyZWF0ZVJlbmRlcmVyIiwgICAgIigpSSIsICAgICAgICAodm9pZCopIGFuZHJvaWRfdmlld19HTEVTMjBSZW5kZXJlcl9jcmVhdGVSZW5kZXJlciB9LAorICAgIHsgICAibkRlc3Ryb3lSZW5kZXJlciIsICAgIihJKVYiLCAgICAgICAodm9pZCopIGFuZHJvaWRfdmlld19HTEVTMjBSZW5kZXJlcl9kZXN0cm95UmVuZGVyZXIgfSwKKyAgICB7ICAgIm5TZXRWaWV3cG9ydCIsICAgICAgICIoSUlJKVYiLCAgICAgKHZvaWQqKSBhbmRyb2lkX3ZpZXdfR0xFUzIwUmVuZGVyZXJfc2V0Vmlld3BvcnQgfSwKKyAgICB7ICAgIm5QcmVwYXJlIiwgICAgICAgICAgICIoSSlWIiwgICAgICAgKHZvaWQqKSBhbmRyb2lkX3ZpZXdfR0xFUzIwUmVuZGVyZXJfcHJlcGFyZSB9LAorCisgICAgeyAgICJuU2F2ZSIsICAgICAgICAgICAgICAiKElJKUkiLCAgICAgICh2b2lkKikgYW5kcm9pZF92aWV3X0dMRVMyMFJlbmRlcmVyX3NhdmUgfSwKKyAgICB7ICAgIm5SZXN0b3JlIiwgICAgICAgICAgICIoSSlWIiwgICAgICAgKHZvaWQqKSBhbmRyb2lkX3ZpZXdfR0xFUzIwUmVuZGVyZXJfcmVzdG9yZSB9LAorICAgIHsgICAiblJlc3RvcmVUb0NvdW50IiwgICAgIihJSSlWIiwgICAgICAodm9pZCopIGFuZHJvaWRfdmlld19HTEVTMjBSZW5kZXJlcl9yZXN0b3JlVG9Db3VudCB9LAorICAgIHsgICAibkdldFNhdmVDb3VudCIsICAgICAgIihJKUkiLCAgICAgICAodm9pZCopIGFuZHJvaWRfdmlld19HTEVTMjBSZW5kZXJlcl9nZXRTYXZlQ291bnQgfSwKKworICAgIHsgICAiblNhdmVMYXllciIsICAgICAgICAgIihJRkZGRklJKUkiLCAodm9pZCopIGFuZHJvaWRfdmlld19HTEVTMjBSZW5kZXJlcl9zYXZlTGF5ZXIgfSwKKyAgICB7ICAgIm5TYXZlTGF5ZXJBbHBoYSIsICAgICIoSUZGRkZJSSlJIiwgKHZvaWQqKSBhbmRyb2lkX3ZpZXdfR0xFUzIwUmVuZGVyZXJfc2F2ZUxheWVyQWxwaGEgfSwKKworICAgIHsgICAiblF1aWNrUmVqZWN0IiwgICAgICAgIihJRkZGRkkpWiIsICAodm9pZCopIGFuZHJvaWRfdmlld19HTEVTMjBSZW5kZXJlcl9xdWlja1JlamVjdCB9LAorICAgIHsgICAibkNsaXBSZWN0IiwgICAgICAgICAgIihJRkZGRilaIiwgICAodm9pZCopIGFuZHJvaWRfdmlld19HTEVTMjBSZW5kZXJlcl9jbGlwUmVjdEYgfSwKKyAgICB7ICAgIm5DbGlwUmVjdCIsICAgICAgICAgICIoSUlJSUkpWiIsICAgKHZvaWQqKSBhbmRyb2lkX3ZpZXdfR0xFUzIwUmVuZGVyZXJfY2xpcFJlY3QgfSwKKworICAgIHsgICAiblRyYW5zbGF0ZSIsICAgICAgICAgIihJRkYpViIsICAgICAodm9pZCopIGFuZHJvaWRfdmlld19HTEVTMjBSZW5kZXJlcl90cmFuc2xhdGUgfSwKKyAgICB7ICAgIm5Sb3RhdGUiLCAgICAgICAgICAgICIoSUYpViIsICAgICAgKHZvaWQqKSBhbmRyb2lkX3ZpZXdfR0xFUzIwUmVuZGVyZXJfcm90YXRlIH0sCisgICAgeyAgICJuU2NhbGUiLCAgICAgICAgICAgICAiKElGRilWIiwgICAgICh2b2lkKikgYW5kcm9pZF92aWV3X0dMRVMyMFJlbmRlcmVyX3NjYWxlIH0sCisKKyAgICB7ICAgIm5TZXRNYXRyaXgiLCAgICAgICAgICIoSUkpViIsICAgICAgKHZvaWQqKSBhbmRyb2lkX3ZpZXdfR0xFUzIwUmVuZGVyZXJfc2V0TWF0cml4IH0sCisgICAgeyAgICJuR2V0TWF0cml4IiwgICAgICAgICAiKElJKVYiLCAgICAgICh2b2lkKikgYW5kcm9pZF92aWV3X0dMRVMyMFJlbmRlcmVyX2dldE1hdHJpeCB9LAorICAgIHsgICAibkNvbmNhdE1hdHJpeCIsICAgICAgIihJSSlWIiwgICAgICAodm9pZCopIGFuZHJvaWRfdmlld19HTEVTMjBSZW5kZXJlcl9jb25jYXRNYXRyaXggfSwKKworICAgIHsgICAibkRyYXdDb2xvciIsICAgICAgICAgIihJSUkpViIsICAgICAodm9pZCopIGFuZHJvaWRfdmlld19HTEVTMjBSZW5kZXJlcl9kcmF3Q29sb3IgfSwKKyAgICB7ICAgIm5EcmF3UmVjdCIsICAgICAgICAgICIoSUZGRkZJKVYiLCAgKHZvaWQqKSBhbmRyb2lkX3ZpZXdfR0xFUzIwUmVuZGVyZXJfZHJhd1JlY3QgfSwKKworICAgIHsgICAibkdldENsaXBCb3VuZHMiLCAgICAgIihJTGFuZHJvaWQvZ3JhcGhpY3MvUmVjdDspWiIsCisgICAgICAgICAgICAodm9pZCopIGFuZHJvaWRfdmlld19HTEVTMjBSZW5kZXJlcl9nZXRDbGlwQm91bmRzIH0sCit9OworCisjZGVmaW5lIEZJTkRfQ0xBU1ModmFyLCBjbGFzc05hbWUpIFwKKyAgICAgICAgdmFyID0gZW52LT5GaW5kQ2xhc3MoY2xhc3NOYW1lKTsgXAorICAgICAgICBMT0dfRkFUQUxfSUYoISB2YXIsICJVbmFibGUgdG8gZmluZCBjbGFzcyAiIGNsYXNzTmFtZSk7IFwKKyAgICAgICAgdmFyID0gamNsYXNzKGVudi0+TmV3R2xvYmFsUmVmKHZhcikpOworCisjZGVmaW5lIEdFVF9NRVRIT0RfSUQodmFyLCBjbGF6eiwgbWV0aG9kTmFtZSwgbWV0aG9kRGVzY3JpcHRvcikgXAorICAgICAgICB2YXIgPSBlbnYtPkdldE1ldGhvZElEKGNsYXp6LCBtZXRob2ROYW1lLCBtZXRob2REZXNjcmlwdG9yKTsgXAorICAgICAgICBMT0dfRkFUQUxfSUYoISB2YXIsICJVbmFibGUgdG8gZmluZCBtZXRob2QgIiBtZXRob2ROYW1lKTsKKworaW50IHJlZ2lzdGVyX2FuZHJvaWRfdmlld19HTEVTMjBDYW52YXMoSk5JRW52KiBlbnYpIHsKKyAgICBGSU5EX0NMQVNTKGdSZWN0Q2xhc3NJbmZvLmNsYXp6LCAiYW5kcm9pZC9ncmFwaGljcy9SZWN0Iik7CisgICAgR0VUX01FVEhPRF9JRChnUmVjdENsYXNzSW5mby5zZXQsIGdSZWN0Q2xhc3NJbmZvLmNsYXp6LCAic2V0IiwgIihJSUlJKVYiKTsKKworICAgIHJldHVybiBBbmRyb2lkUnVudGltZTo6cmVnaXN0ZXJOYXRpdmVNZXRob2RzKGVudiwga0NsYXNzUGF0aE5hbWUsIGdNZXRob2RzLCBORUxFTShnTWV0aG9kcykpOworfQorCit9OwpkaWZmIC0tZ2l0IGEvY29yZS9qbmkvYW5kcm9pZF92aWV3X0hhcmR3YXJlUmVuZGVyZXIuY3BwIGIvY29yZS9qbmkvYW5kcm9pZF92aWV3X0hhcmR3YXJlUmVuZGVyZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiZDc4OGIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2puaS9hbmRyb2lkX3ZpZXdfSGFyZHdhcmVSZW5kZXJlci5jcHAKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDx1dGlscy9Ta0dMQ2FudmFzLmg+CisKKyNpbmNsdWRlICJqbmkuaCIKKyNpbmNsdWRlIDxuYXRpdmVoZWxwZXIvSk5JSGVscC5oPgorI2luY2x1ZGUgPGFuZHJvaWRfcnVudGltZS9BbmRyb2lkUnVudGltZS5oPgorI2luY2x1ZGUgPHV0aWxzL21pc2MuaD4KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0YXRpYyB2b2lkIGFuZHJvaWRfdmlld19IYXJkd2FyZVJlbmRlcmVyX2FiYW5kb25HbENhY2hlcyhKTklFbnYqIGVudiwgam9iamVjdCkgeworICAgIFNrR0xDYW52YXM6OkFiYW5kb25BbGxUZXh0dXJlcygpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NvbnN0IGNoYXIqIGNvbnN0IGtDbGFzc1BhdGhOYW1lID0gImFuZHJvaWQvdmlldy9IYXJkd2FyZVJlbmRlcmVyIjsKKworc3RhdGljIEpOSU5hdGl2ZU1ldGhvZCBnTWV0aG9kc1tdID0geworICAgIHsgICAibmF0aXZlQWJhbmRvbkdsQ2FjaGVzIiwgIigpViIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopYW5kcm9pZF92aWV3X0hhcmR3YXJlUmVuZGVyZXJfYWJhbmRvbkdsQ2FjaGVzIH0sCit9OworCitpbnQgcmVnaXN0ZXJfYW5kcm9pZF92aWV3X0hhcmR3YXJlUmVuZGVyZXIoSk5JRW52KiBlbnYpIHsKKyAgICByZXR1cm4gQW5kcm9pZFJ1bnRpbWU6OnJlZ2lzdGVyTmF0aXZlTWV0aG9kcyhlbnYsCisgICAgICAgICAgICBrQ2xhc3NQYXRoTmFtZSwgZ01ldGhvZHMsIE5FTEVNKGdNZXRob2RzKSk7Cit9CisKK307CmRpZmYgLS1naXQgYS9jb3JlL2puaS9hbmRyb2lkX3ZpZXdfVmlld1Jvb3QuY3BwIGIvY29yZS9qbmkvYW5kcm9pZF92aWV3X1ZpZXdSb290LmNwcAppbmRleCA1MTczYmI4Li4yOTg4YWU4IDEwMDY0NAotLS0gYS9jb3JlL2puaS9hbmRyb2lkX3ZpZXdfVmlld1Jvb3QuY3BwCisrKyBiL2NvcmUvam5pL2FuZHJvaWRfdmlld19WaWV3Um9vdC5jcHAKQEAgLTc2LDEwICs3Niw2IEBACiAgICAgY2FudmFzLT5yZXN0b3JlKCk7CiB9CiAKLXN0YXRpYyB2b2lkIGFuZHJvaWRfdmlld19WaWV3Um9vdF9hYmFuZG9uR2xDYWNoZXMoSk5JRW52KiBlbnYsIGpvYmplY3QpIHsKLSAgICBTa0dMQ2FudmFzOjpBYmFuZG9uQWxsVGV4dHVyZXMoKTsKLX0KLQogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKQEAgLTg3LDkgKzgzLDcgQEAKIAogc3RhdGljIEpOSU5hdGl2ZU1ldGhvZCBnTWV0aG9kc1tdID0gewogICAgIHsgICAibmF0aXZlU2hvd0ZQUyIsICIoTGFuZHJvaWQvZ3JhcGhpY3MvQ2FudmFzO0kpViIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKWFuZHJvaWRfdmlld19WaWV3Um9vdF9zaG93RlBTIH0sCi0gICAgeyAgICJuYXRpdmVBYmFuZG9uR2xDYWNoZXMiLCAiKClWIiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKilhbmRyb2lkX3ZpZXdfVmlld1Jvb3RfYWJhbmRvbkdsQ2FjaGVzIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopYW5kcm9pZF92aWV3X1ZpZXdSb290X3Nob3dGUFMgfQogfTsKIAogaW50IHJlZ2lzdGVyX2FuZHJvaWRfdmlld19WaWV3Um9vdChKTklFbnYqIGVudikgewpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2NvcmUvcmVzL0FuZHJvaWRNYW5pZmVzdC54bWwKaW5kZXggYjFmODFkZi4uZTA0NGMyYSAxMDA2NDQKLS0tIGEvY29yZS9yZXMvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgYi9jb3JlL3Jlcy9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0zNDcsNiArMzQ3LDEzIEBACiAgICAgICAgIGFuZHJvaWQ6ZGVzY3JpcHRpb249IkBzdHJpbmcvcGVybWRlc2NfYWNjb3VudE1hbmFnZXJTZXJ2aWNlIgogICAgICAgICBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL3Blcm1sYWJfYWNjb3VudE1hbmFnZXJTZXJ2aWNlIiAvPgogCisgICAgPCEtLSBBbGxvd3MgYW4gaW50ZXJuYWwgdXNlciB0byB1c2UgcHJpdmFsZWRnZWQgQ29ubmVjdGl2aXR5TWFuYWdlcgorICAgIEFQSXMuCisgICAgICAgIEBoaWRlIC0tPgorICAgIDxwZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLkNPTk5FQ1RJVklUWV9JTlRFUk5BTCIKKyAgICAgICAgYW5kcm9pZDpwZXJtaXNzaW9uR3JvdXA9ImFuZHJvaWQucGVybWlzc2lvbi1ncm91cC5ORVRXT1JLIgorICAgICAgICBhbmRyb2lkOnByb3RlY3Rpb25MZXZlbD0ic2lnbmF0dXJlT3JTeXN0ZW0iIC8+CisKICAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CiAgICAgPCEtLSBQZXJtaXNzaW9ucyBmb3IgYWNjZXNzaW5nIGFjY291bnRzIC0tPgogICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL2Fzc2V0cy9pbWFnZXMvY29tYm9ib3gtZGlzYWJsZWQucG5nIGIvY29yZS9yZXMvYXNzZXRzL2ltYWdlcy9jb21ib2JveC1kaXNhYmxlZC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlMjIwZTQuLjAwMDAwMDAKLS0tIGEvY29yZS9yZXMvYXNzZXRzL2ltYWdlcy9jb21ib2JveC1kaXNhYmxlZC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9hc3NldHMvaW1hZ2VzL2NvbWJvYm94LW5vSGlnaGxpZ2h0LnBuZyBiL2NvcmUvcmVzL2Fzc2V0cy9pbWFnZXMvY29tYm9ib3gtbm9IaWdobGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmNkZjcyLi4wMDAwMDAwCi0tLSBhL2NvcmUvcmVzL2Fzc2V0cy9pbWFnZXMvY29tYm9ib3gtbm9IaWdobGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvYXNzZXRzL3dlYmtpdC9oeXBoX2VuX1VTLmRpYyBiL2NvcmUvcmVzL2Fzc2V0cy93ZWJraXQvaHlwaF9lbl9VUy5kaWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDkxMjA0YgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL2Fzc2V0cy93ZWJraXQvaHlwaF9lbl9VUy5kaWMKQEAgLTAsMCArMSw5Nzg0IEBACitJU084ODU5LTEKK0xFRlRIWVBIRU5NSU4gMgorUklHSFRIWVBIRU5NSU4gMworLmEyY2g0CisuYWQ0ZGVyCisuYTJkCisuYWQxZDQKKy5hMmYxdAorLmEyZgorLmE0bDN0CisuYW01YXQKKy40YTFtYQorLmFuNWMKKy5hMm4KKy4yYW5nNAorLmFuMWk1bQorLmFuMXQ0CisuYW4zdGUKKy5hbnRpNXMKKy5hbnQyaQorLmE0cjVzMgorLjJhMnIKKy5hcjR0MmllNAorLmFyMXRpCisuYXI0dHkKKy5hczNjCisuYXMxcAorLmEyczFzCisuYXN0ZXI1CisuYTJ0b201CisuYTF0bworLmF1MWQKKy5hdjRpCisuYXduNAorLmJhNGcKKy5iYTVuYQorLmJhMm4KKy5iYXM0ZQorLmJlcjQKKy5iZTVyMWEKKy5iZTNzMW0KKy40YmVzNAorLmI0ZTVzMnRvCisuYnJpMgorLmJ1dDR0aQorLmJ1NHQzdDIKKy5jYW00cGUKKy4xY2EKKy5jYTRtMXAKKy5jYW41YworLmNhMm4KKy5jYXBhNWIKKy5jYTFwYQorLmNhcjVvbAorLmMyYTJyCisuY2E0dAorLmNlNGxhCisuMmNoNAorLmNoaWxsNWkKKy5jaDRpbDIKKy5jaGlsMWwKKy4xY2kyCisuY2l0NXIKKy4yYzFpdAorLmNvM2UyCisuMWNvCisuY280cgorLmNvcjVuMWVyCisuY29ybjJlCisuZGU0bW9pMgorLmQ0ZW0KKy5kZTFtbworLmRlM28KKy5kZTNyMWEKKy5kZTNyMWkKKy5kZTFzNGMKKy5kZXMyCisuZGljMXQyaW81CisuM2RpMmMxdAorLmRvNHQKKy4xZG8KKy5kdTRjCisuMWR1CisuZHU0bTFiNQorLmVhcnRoNQorLmVhcjJ0CisuZTJhMnIKKy5lYXMzaQorLjJlMWI0CisuZWVyNAorLmVnMgorLmUybDVkCisuZWwzZW0KKy5lbmFtMworLmUxbmEKKy5lbjNnCisuZTJuM3MyCisuZXE1dWk1dAorLmUxcQorLmVxdTIKKy5lcTJ1aTIKKy5lcjRyaQorLmVyMXI0CisuZXMzCisuNGV1MworLmV5ZTUKKy5mZXMzCisuZm9yNW1lcgorLjFmbworLmZvMnIKKy5mb3IxbQorLmZvcjJtZQorLjFnYTIKKy5nZTIKKy5nZW4zdDQKKy4xZ2VuCisuZ2U1bzJnCisuMWdlbworLjFnMmk1YQorLmdpNGIKKy5nbzRyCisuMWdvCisuaGFuZDVpCisuaGEybgorLmg0YW5kCisuaGE0bjVrMgorLmhlMgorLmhlcm81aTIKKy5oMmVybworLmgxZXMzCisuaGU0dDMKKy5oaTNiCisuaGkzZXIKKy5oMmllNAorLmhvbjVleQorLmhvMm4KKy5ob24zbworLmhvdjUKKy5pZDRsCisuMmlkCisuaWRvbDMKKy5pMWRvCisuaW0zbQorLmltNXAxaTJuCisuaTRtMXAKKy5pbTJwaQorLmluMQorLmluM2NpCisuMmluZTIKKy40aTRuMmsyCisuMmkybjNzMgorLmlyNXI0CisuNGlyCisuaXM0aQorLmp1M3IKKy5sYTRjeQorLmxhNG0KKy5sYXQ1ZXIKKy5sNGF0aDUKKy5sZTIKKy5sZWc1ZQorLmxlbjQKKy5sZXA1CisubGV2MQorLmwyaTRnCisubGkxZzVhCisubGkybgorLmwyaTNvCisubDFpNHQKKy5tYTFnNWE1CisuMW1hCisubWFsNW8KKy5tYTFuNWEKKy5tYTJuCisubWFyNXRpCisubTJhMnIKKy5tZTIKKy5tZXIzYworLm1lNXRlcgorLm1lMXRlCisubTJpczEKKy5taXM0dDVpCisubW9uM2UKKy4xbW8KKy5tbzJuCisubW8zcm8KKy5tbzJyCisubXU1dGEKKy4xbXUKKy5tdTJ0YTViCisubmk0YworLm9kMgorLm9kMWQ1Cisub2Y1dGUKKy5vMmZ0Cisub3I1YTF0bworLm8xcmEKKy5vcjNjCisub3IxZAorLm9yM3QKKy5vczMKKy5vczR0bAorLjRvdGgzCisub3V0MworLm91MgorLnBlZDVhbAorLjJwMmVkCisucDJlMmQyYQorLnBlNXRlCisucGUydAorLnBlNXRpdAorLnAyaTRlNAorLnBpbzVuNAorLjNwMmkxbworLnBpMnQKKy5wcmUzbQorLnByMgorLnJhNGMKKy5yYW40dAorLnJhMm4KKy5yYXRpbzVuMWEKKy5yYXRpbzJuNAorLnJhMXQyaW8KKy5yZWUyCisucmU1bWl0CisucmVzMgorLnJlNXN0YXQKKy5yZXMydAorLnJlczF0YQorLnIyaTRnCisucmkydDV1Cisucm80cQorLnJvczV0Cisucm93NWQKKy5ydTRkCisuM3M0YzJpM2U0CisuczFjaQorLjVzZTJsMmY1Cisuc2VsMWw1Cisuc2UybgorLnNlNXIyaWU0Cisuc2VyMWkKKy5zMmgyCisuc2kyCisuczNpbmc0CisuMnMxaW4KKy5zdDQKKy5zdGE1YjJsMgorLnMxdGEKKy5zMnRhYgorLnM0eTIKKy4xdGE0CisudGU0CisuM3RlbjVhMm4KKy50ZTFuYQorLnRoMgorLnRpMgorLnRpbDQKKy50aTFtNW81CisuMXRpbQorLnRpbmc0CisuMnQxaW4KKy50NGk0bjVrMgorLnRvMW40YQorLjF0bworLnRvMm4KKy50bzRwCisudG9wNWkKKy50bzJ1NXMKKy50b3UyCisudHJpYjV1dAorLnRyNGliCisudTFuMWEKKy51bjNjZQorLnVuZGVyNQorLnVuMWRlCisudTJuMWUKKy51NG41azIKKy51bjVvCisudW4zdTQKKy51cDMKKy51cmUzCisudXM1YTIKKy4ydXMKKy52ZW40ZGUKKy52ZTVyMWEKKy53aWw1aQorLndpMgorLndpbDIKKy55ZTQKKzRhYi4KK2E1YmFsCithNWJhMm4KK2FiZTIKK2FiNWVyZAorYWIyaTVhCithYjVpMnQ1YWIKK2FiaTJ0CithYmkxdGEKK2FiNWxhdAorYWIybDIKK2FiNW81bDFpegorYWJvbDJpCis0YWJyCithYjVyb2cKK2FiM3VsCithNGMyYTJyCithMWNhCithYzVhcmQKK2FjNWFybworYTVjZW91MgorYWMxZXIKK2E1Y2hlNHQKK2EyY2gKK2FjaGUyCis0YTJjaQorYTNjMmllNAorYTJjMWluCithM2MyaW8KK2FjNXJvYgorYWN0NWlmMgorYTJjMXQKK2FjM3VsCithYzR1bQorYTJkCithZDRkMWluCithZDFkNAorYWQ1ZXIuCisyYWRpCithM2Q0aTNhCithZDNpMWNhCithZGk0ZXIKK2FkMmllNAorYTNkMmlvCithM2RpdAorYTVkaTF1CithZDRsZQorYWQzb3cKK2ExZG8KK2FkNXJhMm4KK2ExZHIKK2FkNHN1CithMmQxczIKKzRhMWR1CithM2R1MmMKK2FkNXVtCithZTRyCithZXIyaTRlNAorYWVyMWkKK2EyZgorYTRmMWY0CithNGdhYgorYTFnYQorYWdhNG4KK2FnNWVsMWwKK2ExZ2U0bworNGFnNGV1CithZzFpCis0YWc0bDIKK2FnMW4KK2EyZ28KKzNhM2c0bzRnCithZzNvM25pCithZ28ybjIKK2E1Z3VlcgorYTJndWUKK2FnNXVsCithNGd5CithM2hhCithM2hlCithNGg0bDQKK2EzaG8KK2FpMgorYTVpMWEKK2EzaWMuCithaTVseQorYTRpNG4KK2FpbjVpbgorYTJpbmkKK2EyaTFuNW8KK2FpdDVlbgorYTJpdGUKK2ExagorYWsxZW4KK2FsNWFiCithbDNhMmQKK2E0bDJhMnIKKzRhbGRpNAorYTJsZAorMmFsZQorYWwzZW5kCithNGxlbnQyaQorYTFsZW4xdAorYTVsZTVvCithbDFpCithbDRpYS4KK2FsMmkxYQorYWwyaTRlNAorYWw1bGV2CithbDFsCithbDJsZQorNGFsbGljCithbGwyaQorNGEybG0KK2E1bG9nLgorYTRseS4KK2ExbHkKKzRhMmx5czQKKzVhNWx5czF0Cis1YWx5dAorM2FseXoKKzRhMW1hCithMm01YWIKK2FtM2FnCithbWE1cmEKK2FtMmEycgorYW01YXNjCithNG1hM3RpcworYTRtNWExdG8KK2FtNWVyMWEKK2FtM2ljCithbTVpZgorYW01aTFseQorYW0xaW4KK2FtMmk0bm8KK2EybW8KK2E1bW8ybgorYW1vcjVpCithbW8ycgorYW1wNWVuCithNG0xcAorYTJuCithbjNhZ2UKK2ExbmEKKzNhbmExbHkKK2EzbjJhMnIKK2FuM2FyM2MKK2FuYXI0aQorYTNuYXRpCithbjJhdAorNGFuZAorYW5kZTRzMgorYW4xZGUKK2FuM2RpczEKK2FuMWRsCithbjRkb3cKK2FuMWRvCithNW5lZQorYTNuZW4KK2FuNWUyc3QuCithMW5lcworYTJuZXN0CithM240ZXUKKzJhbmcKK2FuZzVpZTQKK2FuMWdsMgorYTRuMWljCithM25pZXMKK2FuMmllNAorYW4zaTNmCithbjRpbWUKK2FuMWltCithNW5pbTFpCithNW4yaW5lCithbjFpbgorYW4zaTRvCithM24yaXAKK2FuM2lzMmgKK2FuM2l0CithM25pMXUKK2FuNGtsaQorYTRuazIKK2FuMWsxbAorNWFubml6CithNG4xbjIKK2FubzQKK2FuNW90CithbjRvdGg1CithbjJzYTIKK2EybjFzMgorYW40czFjbworYW5zNGMKK2FuNHMxbjQKK2FuMnNwCithbnMzcG8KK2FuNHN0CithbjRzdTJyCithbjFzdQorYW50YTJsNAorYW4xdAorYW4xdGEKK2FuNHQyaWU0CithbnQyaQorNGFuMXRvCithbjJ0cgorYW40dHc0CithbjN1MWEKK2FuM3VsCithNW51cgorNGFvCithcDJhMnI0CithMXBhCithcDVhdAorYXA1ZXIzbworYTNwaDRlcgorNGFwaGkKK2E0cGlsbGEKK2FwaWwxbAorYXA1aWxsMmEycgorYXAzaTJuCithcDNpMXRhCithM3BpMnR1CithMnAybDIKK2FwbzRjNQorYXA1bzFsYQorYXBvcjVpCithMXA0b3IKK2Fwb3MzdAorYTFwb3MKK2FwczVlNHMKK2EycDFzMgorYXAyc2UKK2EzcHUKK2FxdWU1CithcXUyCisyYTJyCithcjNhMmMxdAorYTVyYWRlCithcmEyZAorYXI1YWRpczEKK2FyMmFkaQorYXIzYWwKK2E1cmFtZTF0ZQorYXJhbTNldAorYXIyYW40ZworYXJhMm4KK2FyYTNwCithcjRhdAorYTVyYTF0MmlvCithcjVhMXQyaXYKK2E1cmF1CithcjVhdjQKK2FyYXc0CithcmJhbDQKK2FyMWIKK2FyNGNoYTJuCithcjFjCithcjNjaGEKK2FyMmNoCithcjVkMmluZQorYXJkMmkKK2FyZDFpbjQKK2FyNGRyCithcjVlYXMKK2EzcmVlCithcjNlbjF0CithNXIyZTJzcworYXI0ZmkKK2FyMWYKK2FyNGY0bDIKK2FyMWkKK2FyNWkyYWwKK2FyMmkzYQorYXIzaTJhMm4KK2Ezcmk1ZXQKK2FyMmllNAorYXI0aW0KK2FyNWluMmF0CithcjJpMW5hCithcjNpMW8KK2FyMml6CithcjJtaQorYXIxbQorYXI1bzVkCithNXJvbmkKK2FybzJuCithM3JvbzIKK2FyMnAKK2FyM3EKK2FycmU0CithcjFyNAorYXI0c2EyCithNHJzMgorYXIyczJoCis0YXMuCithMnM0YWIKK2FzYTIKK2FzM2FuMXQKK2FzYTJuCithc2hpNAorYXMyaAorYTVzaWEuCithczJpMWEKK2Ezc2kxYgorYTNzaWMKKzVhNXNpNHQKK2FzazNpCithc2syCithczRsMgorYTRzb2MKK2Exc28KK2FzNXBoCithczRzMmgKK2Eyc3MKK2FzM3RlbgorYXMxdDRyCithc3UxcjVhCithMXN1Cithc3UycgorYTJ0YQorYXQzYWIybDIKK2EydGFiCithdDVhYworYXQzYWxvCithdGEybAorYXQ1YXAKK2F0ZTVjCithdDVlMmNoCithdDNlMWdvCithdGVnNAorYXQzZW4uCithdDNlcjFhCithdGVyNW4KK2E1dGVyMW5hCithdDNlc3QKK2F0NWV2Cis0YXRoCithdGg1ZW0KK2F0aDJlCithNXRoZTJuCithdDRobworYXRoNW9tCis0YXRpLgorYTV0MmkxYQorYTJ0NWk1YgorYXQxaWMKK2F0M2lmMgorYXRpb241YTJyCithMXQyaW8KK2F0aW8ybgorYXRpbzFuMWEKK2F0M2kxdHUKK2E0dG9nCithMXRvCithMnRvbQorYXQ1b20yaXoKK2E0dG9wCithNHRvczIKK2ExdHIKK2F0NXJvcAorYXQ0c2syCithNHQxczIKK2F0NHRhZworYTR0M3QyCithdDF0YQorYXQ1dGUKK2F0NHRoCithMnR1CithdDV1MWEKK2E0dDV1ZQorYXQzdWwKK2F0M3UxcmEKK2EydHkKK2F1NGIKK2F1Z2gzCithdTNndQorYXU0bDIKK2F1bjVkCithdTNyCithdTVzaTFiCithMnVzCithNHV0NWVuCithdTF0aAorYTJ2YQorYXYzYWc0CithNXZhMm4KK2F2NGU0bm8KK2F2M2VyMWEKK2F2NWVybgorYXY1ZXJ5CithdjFpCithdmk0ZXIKK2F2MmllNAorYXYzaWcKK2F2NW9jCithMXZvcgorM2F3YXkKK2F3M2kyCithdzRseQorYXdzNAorYXg0aTVjCitheDNpCitheDRpZAorYXk1YWwKK2F5ZTQKK2F5czQKK2F6aTRlcgorYTJ6MWkKK2F6MmllNAorYXoyejVpCithNHoxejIKKzViYS4KK2JhZDVnZXIKK2JhMmQKK2JhNGdlCitiYWwxYQorYmFuNWRhZworYmEybgorYjRhbmQKK2JhbjFkMmEKK2JhbjRlCitiYW4zaQorYmFyYmk1CitiMmEycgorYmFyMWIKK2JhcjJpNGEKK2JhcjFpCitiYXM0c2kKK2JhMnNzCisxYmF0CitiYTR6CisyYjFiCitiMmJlCitiM2JlcgorYmJpNG5hCis0YjFkCis0YmUuCitiZWFrNAorYmVhMnQzCis0YmUyZAorYjJlM2QyYQorYmUzZGUKK2I0ZTNkaQorYmUzZ2kKK2JlNWd1CisxYmVsCitiZTFsMmkKK2JlM2xvCis0YmU1bQorYmU1bjJpZworYmU1bnUKKzRiZXM0CitiZTNzcAorYjJlNXN0NHIKKzNiZXQKK2JlMXQ1aXoKK2JlNXRyCitiZTN0dzQKK2JlM3cKK2JlNXkxbzQKKzJiZgorNGIzaAorYmkyYgorYjJpNGQKKzNiMmllNAorYmk1ZW4KK2JpNGVyCisyYjNpZgorMWJpbAorYmkzbDJpegorYmlsMWkKK2JpbjJhNXI0CitiaTFuYQorYjRpbjRkCitiaTVuZXQKK2IyaW5lCitiaTNvMmdyCitiMmlvCitiaTVvdTIKK2JpMnQKKzNiMmkzdDJpbworYmkxdGkKK2JpM3RyCiszYml0NXUxYQorYmkxdHUKK2I1aTR0egorYjFqCitiazQKK2IybDIKK2JsNGF0aDUKK2I0bGUuCitibGVuNAorNWJsZTFzcAorYmxlczIKK2IzbGlzCitiNGxvCitibHVuNHQKKzRiMW0KKzRiM24KK2JuZTVnCiszYm9kCitib2QzaQorYm80ZQorYm9sM2ljCitib2wyaQorYm9tNGJpCitibzRtMWIKK2JvMW40YQorYm8ybgorYm9uNWF0CiszYm9vMgorNWJvci4KKzRiMW8xcmEKK2JvcjVkCis1Ym9yZQorNWJvcmkKKzVib3M0CitiNW8xdGEKK2I0b3RoNQorYm80dG8KK2JvdW4yZDMKK2JvdTIKKzRicAorNGJyaXQKK2JyNG90aDMKKzJiNXMyCitic29yNAorYjFzbworMmJ0CitiMnQ0bAorYjR0bworYjN0cgorYnVmNGZlcjEKK2J1NGYxZgorYnU0Z2EKK2J1M2wyaQorYnUxbWk0CitidTRuCitidW50NGkKK2J1bjF0CitidTNyZQorYnVzNWllNAorYjJ1cworYnVzczRlCitidTJzcworNWJ1c3QKKzRidTF0YQorM2J1MXQyaW8KK2I0dTF0MmkKK2I1dTF0bworYjF2Cis0YjV3Cis1YnkuCitieXM0CisxY2EKK2NhYjNpbgorY2ExYjJsMgorY2EyY2g0CitjYTVkZW4KK2NhMmQKKzRjYWc0CisyYzVhaAorY2EzbGF0CitjYWw0bGEKK2NhbDFsCitjYWwybDVpbjQKK2NhbGwyaQorNGNhbG8KK2M0YW41ZAorY2EybgorY2FuNGUKK2NhNG40aWMKK2NhbjVpcworY2FuM2l6CitjYW40dHkKK2NhbjF0CitjYW55NAorY2E1cGVyCitjYXI1b20KK2MyYTJyCitjYXN0NWVyCitjYXM1dDJpZworY2FzdDJpCis0Y2FzNHkKK2M0YTR0aAorNGNhMXQyaXYKK2NhdjVhbAorY2EydmEKK2MzYworY2NoYTUKK2MyY2gKK2MzYzJpNGEKK2MxY2kKK2Njb20xcGE1CitjMWNvCitjY280bTFwCitjY28ybjQKK2Njb3UzdAorY2NvdTIKKzJjZS4KKzRjZWQuCis0Y2UxZGVuCiszY2VpMgorNWNlbC4KKzNjZWwxbAorMWNlbgorM2NlbmMKKzJjZW40ZQorNGNlbmkKKzNjZW4xdAorM2NlcAorY2U1cmFtCitjZXIxYQorNGNlMXM0YTIKKzNjZXMxc2kKK2MyZTJzcworY2VzNXNpNWIKK2NlczV0CitjZXQ0CitjNWU0dGEKK2NldzQKKzJjaAorNGNoLgorNGNoM2FiCis1Y2hhNG4xaWMKK2NoYTJuCitjaDVhNW5pcworY2hlMgorY2hlYXAzCis0Y2g0ZWQKK2NoNWU1bG8KKzNjaGVtaQorY2g1ZW5lCitjaGUybgorY2gzZXIuCitjaDNlNHIxczIKKzRjaDFpbgorNWNoaTJuZS4KK2NoMmluZQorY2g1aTVuMmUyc3MKK2NoaTFuZXMKKzVjaDJpbmkKKzVjaDJpbworM2NoaXQKK2NoaTJ6CiszY2hvMgorY2g0dGkKKzFjaQorM2MyaTFhCitjaTJhNWIKK2NpMmE1cgorY2k1YworNGNpZXIKK2MyaWU0Cis1YzRpMmYzaWMuCitjaTFmaQorNGM0aTVpNAorY2k0bGEKKzNjaWwxaQorMmNpbQorMmNpbgorYzRpMW5hCiszY2luMmF0CitjaW4zZW0KK2MyaW5lCitjMWluZworYzVpbmcuCis1YzJpMW5vCitjaW8ybjQKK2MyaW8KKzRjaXBlNAorYzJpcAorY2kzcGgKKzRjaXA0aWMKK2NpcDNpCis0Y2lzMXRhCis0Y2lzMXQyaQorMmMxaXQKK2NpMXQzaXoKK2NpMXRpCis1Y2l6CitjazEKK2NrM2kKKzFjNGw0Cis0Y2wyYTJyCitjNWxhNXJhMXQyaW8KK2NsYXI0YXQKKzVjbGFyZQorY2xlNG0KKzRjbGljCitjbGltNAorYzFseTQKK2M1bgorMWNvCitjbzVhZworYzRvYQorY29lMgorMmNvZworY280Z3IKK2NvaTQKK2NvM2luYworY29sNWkKKzVjb2xvCitjb2wzbzRyCitjb201ZXIKK2NvMm1lCitjbzFuNGEKK2NvMm4KK2M0b25lCitjb24zZworY29uNXQKK2NvM3BhCitjb3AzaWMKK2NvNHAybDIKKzRjb3IxYgorY29ybzNuCitjb3M0ZQorY292MQorY292ZTQKK2NvdzVhCitjbzJ6NWUKK2NvNXoxaQorYzFxCitjcmFzNXQKK2NyMmFzCis1Y3JhdC4KKzVjcmF0MWljCitjcmUzYTJ0Cis1YzJyMmVkCis0YzNyZTF0YQorY3JlNHYyCitjcmkyCitjcmk1ZgorYzRyaW4KK2NyMmlzNAorNWNyaTF0aQorY3JvNHAybDIKK2Nyb3A1bworY3JvczRlCitjcnU0ZAorNGMzczIKKzJjMXQKK2MydGE0YgorYzF0YQorY3Q1YW5nCitjdGEybgorYzV0YW4xdAorYzJ0ZQorYzN0ZXIKK2M0dDRpYzF1CitjdGltM2kKK2MxdGltCitjdHU0cgorYzF0dQorYzR0dzQKK2N1ZDUKK2M0dWYKK2M0dWkyCitjdTVpMXR5Cis1Y3VsMmkKK2N1bDR0aXM0CitjdWwxdGkKK2N1NGx0CiszYzR1bDF0dTIKK2N1Mm1hCitjM3VtZQorY3U0bWkKKzNjdW4KK2N1M3BpCitjdTVweQorY3UycjVhNGIKK2N1MXJhCitjdTVyMmkzYQorMWMydXMKK2N1czFzNGkKK2N1MnNzCiszYzR1dAorY3U0dDJpZTQKK2M0dTF0MmkKKzRjNXUxdDJpdgorNGN1dHIKKzFjeQorYzJ6ZTQKKzFkMmEKKzVkYS4KKzJkM2E0YgorZGEyY2g0Cis0ZGEyZgorMmRhZworZGEybTIKK2QyYW4zZworZGEybgorZGFyZDUKK2QyYTJyCitkYXJrNQorNGRhcnkKKzNkYXQKKzRkYTF0Mml2Cis0ZGExdG8KKzVkYXY0CitkYXY1ZQorNWRheQorZDFiCitkNWMKK2QxZDQKKzJkZS4KK2RlYTJmNQorZGU0YjVpMnQKK2QyZTFiCitkZTRibzJuCitkZWNhMm40CitkZTFjYQorZGU0Y2lsCitkZTFjMmkKK2RlNWNvbQorZGUxY28KKzJkMWVkCis0ZGVlLgorZGU1aWYKK2RlaTIKK2RlbDJpNGU0CitkZWwyaQorZGU0bDVpNXEKK2RlNWxvCitkNGVtCis1ZGVtLgorM2RlbWljCitkZW01aWMuCitkZTVtaWwKK2RlNG1vMm4zczIKK2RlMW1vCitkZW1vMm4KK2RlbW8ycjUKKzFkZW4KK2RlNG4yYTJyCitkZTFuYQorZDRlM25vCitkZW50aTVmMgorZGVuMXQKK2RlbnQyaQorZGUzbnUKK2RlMXAKK2RlM3BhCitkZXBpNAorZGUycHUKK2QzZTFxCitkNGVyMWg0Cis1ZGVyM200CitkNWVybjVpegorZGU0cjVzMgorZGVzMgorZDJlcy4KK2RlMXMyYworZGUyczVvCitkZXMzdDJpCitkMmUzc3Q0cgorZGU0c3UKK2RlMXQKK2RlMnRvCitkZTF2CitkZTJ2M2k0bAorZGUxdmkKKzRkZXkKKzRkMWYKK2Q0Z2EKK2QzZ2U0dAorZGcxaQorZDJneQorZDFoMgorNWRpLgorMWQ0aTNhCitkaWE1YgorZDRpNGNhbQorZGkxY2EKK2Q0aWNlCiszZGkyYzF0CiszZDJpZAorNWRpM2VuCitkMmllNAorZDFpZgorZGkzZ2UKK2QyaWcKK2RpNGxhMXRvCitkaTFsYQorZDFpbgorMWRpMW5hCiszZGkybmUuCitkMmluZQorNWQyaW5pCitkaTVuaXoKKzFkMmlvCitkaW81ZworZGk0cDJsMgorZDJpcAorZDRpcjIKK2RpMXJlCitkaXIxdDVpCitkaXMxCis1ZGlzaQorZDRpczN0CitkMmkxdGkKKzFkMmkxdgorZDFqCitkNWsyCis0ZDVsYQorM2RsZS4KKzNkbGVkCiszZGxlcy4KK2RsZXMyCis0ZDNsMmUyc3MKKzJkM2xvCis0ZDVsdQorMmQxbHkKK2QxbQorNGQxbjQKKzFkbworM2RvLgorZG81ZGUKKzVkb2UKKzJkNW9mCitkNG9nCitkbzRsYQorZG9sMmk0CitkbzVsbzRyCitkb201aXoKK2RvM24yYXQKK2RvMm4KK2RvMW4xYQorZG9uaTQKK2RvbzNkCitkb28yCitkbzRwNHAKK2Q0b3IKKzNkb3MKKzRkNW91dAorZG91MgorZG80dgorM2RveAorZDFwCisxZHIKK2RyYWc1bzJuMgorZHJhMmdvCis0ZHIyYWkyCitkcmU0CitkcmUyYTVyCis1ZHJlbgorZHI0aTRiCitkcmlsNAorZHJvNHAKKzRkcm93Cis1ZHJ1cGxpCitkcnUzcDJsMgorNGRyeQorMmQxczIKK2RzNHAKK2Q0c3cyCitkNHM0eQorZDJ0aAorMWR1CitkMXUxYQorZHUyYworZDF1M2NhCitkdWM1ZXIKKzRkdWN0LgorZHUyYzF0Cis0ZHVjNHQxczIKK2R1NWVsCitkdTRnCitkM3VsNGUKK2R1bTRiZQorZHU0bTFiCitkdTRuCis0ZHVwCitkdTRwZQorZDF2CitkMXcKK2QyeQorNWR5bgorZHk0czJlCitkeXM1cAorZTFhNGIKK2UzYTJjMXQKK2VhMmQxCitlYWQ1aWU0CitlMmFkaQorZWE0Z2UKK2VhNWdlcgorZWE0bAorZWFsNWVyCitlMmFsZQorZWFsM291MgorZWFtM2VyCitlNWFuZAorZWEybgorZWFyM2EKK2UyYTJyCitlYXI0YworZWFyNWVzCitlYXI0aWMKK2VhcjFpCitlYXI0aWwKK2VhcjVrCitlYXIydAorZWFydDNlCitlYTVzcAorZTNhMnNzCitlYXN0MworZWEydAorZWF0NWVuCitlYXRoM2kKK2U0YXRoCitlNWF0M2lmMgorZTRhM3R1CitlYTJ2CitlYXYzZW4KK2VhdjVpCitlYXY1bworMmUxYgorZTRiZWwuCitlMWJlbAorZTRiZTJsMXMyCitlNGJlbgorZTRiaTJ0CitlM2JyCitlNGNhMmQKK2UxY2EKK2VjYW41YworZWNhMm4KK2VjMWNhNQorZWMzYworZTFjZQorZWM1ZXMxc2EyCitlYzJlMnNzCitlMWMyaQorZTRjaWIKK2VjNWlmaWNhdAorZWNpMWZpCitlY2lmaTFjYQorZWM1aTNmMmllNAorZWM1aTFmeQorZTJjM2ltCitlMmMxaTR0CitlNWMyaXRlCitlNGNsYW0KK2UxYzRsNAorZTRjbDJ1cworZTJjb2wKK2UxY28KK2U0Y29tMW0KK2U0Y29tcGUKK2VjbzRtMXAKK2U0Y29uMWMKK2VjbzJuCitlMmNvcgorZWMzbzFyYQorZWNvNXJvCitlMWNyCitlNGNyZW0KK2VjNHRhMm4KK2UyYzF0CitlYzF0YQorZWM0dGUKK2UxY3UKK2U0Y3VsCitlYzN1MWxhCisyZTJkMmEKKzRlZDNkNAorZTRkMWVyCitlZGU0czIKKzRlZGkKK2UzZDRpM2EKK2VkM2liCitlZDNpMWNhCitlZDNpbQorZWQxaXQKK2VkaTV6Cis0ZTFkbworZTRkb2wKK2VkbzJuMgorZTRkcmkKK2UxZHIKK2U0ZHVsCitlMWR1CitlZDV1MWw0bworZWUyYworZTRlZDNpCitlZTJmCitlZWwzaQorZWU0bHkKK2VlMm0KK2VlNG5hCitlZTRwMQorZWUyczQKK2Vlc3Q0CitlZTR0eQorZTVleAorZTFmCitlNGYzZXJlCitlZmVyMQorMWU0ZjFmCitlNGZpYworZTFmaQorNWVmMmkxYzRpCitlZmlsNAorZTNmMmkybmUKK2UyZmluCitlZjVpNW4yaXRlCitlZjJpbmkKK2VmaW4yaXQKKzNlZml0CitlZm9yNWVzCitlMWZvCitlZm8ycgorZTRmdTRzZS4KK2UzZnUKK2VmMnVzCis0ZWdhbAorZTFnYQorZWdlcjQKK2VnNWliCitlZzRpYworZWc1aW5nCitlNWdpdDUKK2VnNW4KK2U0Z28uCitlMWdvCitlNGdvcworZWcxdWwKK2U1Z3VyCis1ZTFneQorZTFoNAorZWhlcjQKK2VpMgorZTVpYworZTJpNWQKK2UyaWcyCitlaTVnNGwyCitlM2k0bTFiCitlM2luM2YKK2UxaW5nCitlNWluc3QKK2UyaTJuMXMyCitlaXI0ZAorZTRpcgorZTJpdDNlCitlMmkzdGgKK2U1aTF0eQorZTFqCitlNGp1ZAorZWo1dWRpCitla2k0bgorZWsxaQorZWs0bGEKK2VrMWwKK2UxbGEKK2U0bGEuCitlNGxhYworZTNsNGFuNGQKK2VsYTJuCitlNGw1YTF0Mml2CitlNGxhdworZWxheDFhNAorZTNsZTJhCitlbDVlYnJhCitlbDJlMWIKK2VsZTNicgorNWVsZWMKK2U0bGVkCitlbDNlMWdhCitlNWxlbgorZTRsMWVyCitlMWxlczIKK2UybDJmCitlbDJpCitlM2xpYmU0CitlNGw1aWMuCitlbDNpMWNhCitlM2xpZXIKK2VsMmllNAorZWw1aTNnaWIKK2VsMmlnCitlbDRpZ2kKK2U1bGltCitlNGwzaW5nCitlM2wyaW8KK2UybGlzCitlbDVpczJoCitlM2wyaXYzCis0ZWxsYQorZWwxbAorZWw0bGFiCitlbGw0bzQKK2U1bG9jCitlbDVvZworZWwzb3AuCitlbDJzMmgKK2UybDFzMgorZWw0dGEKK2U0bHQKK2U1bHVkCitlbDV1ZworZTRtYWMKK2UxbWEKK2U0bWFnCitlNW1hMm4KK2VtNWExbmEKK2U0bTViCitlMW1lCitlMm1lbAorZTRtZXQKK2VtM2kxY2EKK2VtMmk0ZTQKK2VtNWlncmEKK2VtMmlnNAorZW1pMWdyCitlbTFpbjIKK2VtNWluZQorZW0zaTNuaQorZTRtMmlzCitlbTVpczJoCitlNW00aTJzMXMKK2VtM2l6Cis1ZW1uaXoKK2U0bTFuCitlbW80ZworZTFtbworZW1vM24yaTVvCitlbW8ybgorZW0zcGkKK2U0bTFwCitlNG11bAorZTFtdQorZW01dTFsYQorZW11M24yCitlM215CitlbjVhMm1vCitlMW5hCitlNG5hbjF0CitlbjJhMm4KK2VuY2g0ZXIKK2VuMmNoCitlbmNoZTIKK2VuM2RpYworZTVuZWEKK2U1bmVlCitlbjNlbQorZW41ZXJvCitlbjFlcgorZW41ZTFzaQorZTFuZXMKK2UybjVlc3QKK2VuM2V0cgorZTNuZTR3CitlbjVpNGMzczIKK2U1bjJpZTQKK2U1bmlsCitlM24yaTRvCitlbjNpczJoCitlbjNpdAorZTVuaTF1Cis1ZW5pegorNGU0bjFuMgorNGVubworZTRubzRnCitlNG5vcworZW4zb3YKK2VuNHN3MgorZTJuMXMyCitlbnQ1YWdlCitlbjF0CitlbjF0YQorNGVudGgxZXMKK2VudGgyZQorZW4zdTFhCitlbjV1ZgorZTNueS4KKzRlNG4zegorZTVvZgorZW8yZworZTRvaTQKK2Uzb2wKK2VvcDNhMnIKK2VvMnBhCitlMW9yCitlbzNyZQorZW81cm9sCitlb3M0CitlNG90CitlbzR0bworZTVvdXQKK2VvdTIKK2U1b3cKK2UycGEKK2UzcDRhaTIKK2VwNWFuYworZXBhMm4KK2U1cGVsCitlM3BlbjF0CitlcDVlNXQyaTF0MmlvCitlcGUydAorZXBldGkxdGkKK2VwaGU0CitlNHBsaQorZTFwMmwyCitlMXBvCitlNHByZWMKK2VwcjIKK2VwNXJlMWNhCitlNHAycjJlZAorZXAzcmUxaDQKK2UzcHJvCitlNHByb2IKK2VwNHM0aAorZTJwMXMyCitlcDV0aTViCitlMnAxdAorZTRwdTJ0CitlcDV1MXRhCitlMXEKK2VxdWkzbAorZXF1MgorZXEydWkyCitlNHEzdWkzcworZXIxYQorZTJyYTRiCis0ZXI0YW5kCitlcmEybgorZXIzYTJyCis0ZXI0YXRpLgorMmVyMWIKK2VyNGIybDIKK2VyM2NoCitlcjFjCitlcjRjaGUyCisyZTJyZS4KK2UzcmUxYTRsCitlcmU1Y28KK2VyZTNpbgorZXJlaTIKK2VyNWVsLgorZXIzZTFtbworZXI1ZTFuYQorZXI1ZW5jZQorNGVyZW5lCitlcjNlbjF0CitlcmU0cQorZXI1ZTJzcworZXIzZXMydAorZXJldDQKK2VyMWg0CitlcjFpCitlMXIyaTNhNAorNWVyaWNrMQorZTNyaWVuCitlcjJpZTQKK2VyaTRlcgorZXIzaW40ZQorZTFyMmkxbworNGVyaXQKK2VyNGkxdQorZXIyaTR2CitlNHJpMXZhCitlcjNtNAorZXI0bmlzNAorNGVyM24yaXQKKzVlcm5pegorZXIzbm80CisyZXJvCitlcjVvYgorZTVyMm9jCitlcm80cgorZXIxb3UyCitlNHIxczIKK2VyM3NldAorZXIyc2UKK2VydDNlcgorNGVyMnRsCitlcjN0dzQKKzRlcnUKK2VydTR0Cis1ZXJ3YXUKK2VyMXcKK2UxczRhMgorZTRzYTJnZS4KK2U0c2FnZXMKK2VzMmMKK2UyczFjYQorZXM1Y2EybgorZTNzY3IKK2VzNWN1CitlMXMyZQorZTJzZWMKK2VzNWUxY3IKK2U0czVlbmMKK2U0c2VydC4KK2U0c2VyNHQxczIKK2U0c2VyMXZhCis0ZXMyaAorZTNzaGEKK2VzaDVlMm4KK2Uxc2kKK2Uyc2ljCitlMnMyaWQKK2VzNWkxZGVuCitlNHM1aWcxbjRhCitlczJpZworZTJzNWltCitlMnM0aTRuCitlc2lzNHRlCitlMXNpcworZTVzaTR1CitlNXNraW4KK2VzazIKK2VzazFpCitlczRtaQorZTJzMW0KK2Uyc29sCitlMXNvCitlczNvbHUKK2Uyc28ybgorZXM1bzFuMWE0CitlMXNwCitlMnMzcGVyCitlczVwaTFyYQorZXNwNGlyCitlczRwcmUKK2VzcHIyCisyZTJzcworZXM0c2k0YgorZXMxc2kKK2VzdGEybjQKK2VzMXRhCitlczN0MmlnCitlc3QyaQorZXM1dGltCis0ZXMydG8KK2Uzc3RvMm4KKzJlc3Q0cgorZTVzdHJvCitlc3RydWM1CitlMnN1MnIKK2Uxc3UKK2VzNXVyMXI0CitlczR3MgorZTJ0YTRiCitlMXRhCitlM3RlbjRkCitlM3RlbworZXRob2QzCitldDFpYworZTV0aWRlCitldDJpZAorZTJ0MWluNAorZXQyaTRubworZTV0NGlyCitlNXQyaTF0MmlvCitldGkxdGkKK2V0NWkxdDJpdgorNGUydDFuMgorZXQ1bzFuMWEKK2UxdG8KK2V0bzJuCitlM3RyYQorZTN0cmUKK2V0M3JpYworZXQ1cmlmCitldDNyb2cKK2V0NXJvcworZXQzdTFhCitlMXR1CitldDV5bQorZTF0eQorZTR0NXoKKzRldQorZTV1bgorZTN1cAorZXUzcm8KK2UydXM0CitldXRlNAorZXV0aTVsCitlNHUxdDJpCitldTV0cgorZXZhMnA1CitlMXZhCitlMnZhcworZXY1YXN0CitlNXZlYQorZXYzZWwxbAorZXZlNGwzbworZTV2ZW5nCitldmVuNGkKK2V2MWVyCitlNXYyZXIxYgorZTF2aQorZXYzaWQKK2Uydmk0bAorZTR2MWluCitlM3YyaTR2CitlNXZvYworZTV2dQorZTF3YQorZTR3YWcKK2U1d2VlCitlM3doCitld2lsNQorZXdpMgorZXczaW40ZworZTN3aXQKKzFleDNwCis1ZXkxYworNWV5ZS4KK2V5czQKKzFmYQorZmEzYjJsMgorZjRhYjNyCitmYTRjZQorNGZhZworZmE0aTRuNAorZmFpMgorZmFsMmw1ZQorZmFsMWwKKzRmNGE0bWEKK2ZhbTVpcworNWYyYTJyCitmYXI1dGgKK2ZhM3RhCitmYTN0aDJlCitmNGF0aAorNGZhMXRvCitmYXU0bHQ1CitmYXU0bDIKKzRmNWIKKzRmZAorNGZlLgorZmVhczQKK2ZlNGF0aDMKK2ZlYTJ0CitmMmU0YgorNGZlMWNhCis1ZmUyYzF0CisyZmVkCitmZTNsMmkKK2ZlNG1vCitmZW4yZAorZmVuMWQ1ZQorZmVyMQorNWZlcjFyNAorZmV2NAorNGYxZgorZjRmZXMKK2Y0ZjJpZTQKK2YxZmkKK2Y1ZjJpbi4KK2YyZmluCitmMmY1aXMKK2Y0ZjJseTUKK2ZmNGwyCitmMmZ5Cis0ZmgKKzFmaQorZjJpM2EKKzJmM2ljLgorNGYzaWNhbAorZmkxY2EKK2YzaWNhMm4KKzRmaWNhdGUKK2YzaTFjZW4KK2ZpM2NlcgorZjJpMWM0aQorNWZpM2MyaTFhCis1ZmljMmllNAorNGZpNGMzczIKK2ZpM2N1CitmaTVkZWwKK2YyaWQKK2ZpZ2h0NQorZjJpZworZmlsNWkKK2ZpbDJsNWluNAorZmlsMWwKK2ZpbGwyaQorNGZpMWx5CisyZmluCis1ZmkxbmEKK2Y0aW4yZDUKK2YyaTJuZQorZjFpbjNnCitmMmk0bjRuMgorZmlzNHQyaQorZjRsMgorZjVsMmUyc3MKK2ZsZXMyCitmbGluNAorZmxvM3JlCitmMmx5NQorNGZtCis0Zm4KKzFmbworNWZvMm4KK2ZvbjRkZQorZjJvbmQKK2ZvbjR0CitmbzJyCitmbzVyYXQKK2ZvMXJhCitmb3I1YXkKK2ZvcmU1dAorZm9yNGkKK2ZvcjF0NWEKK2ZvczUKKzRmNXAKK2ZyYTR0CitmNXJlYQorZnJlczVjCitmcmkyCitmcmlsNAorZnJvbDUKKzJmM3MKKzJmdAorZjR0bworZjJ0eQorM2Z1CitmdTVlbAorNGZ1ZworZnU0bWluCitmdTFtaQorZnU1bmUKK2Z1M3JpCitmdXNpNAorZjJ1cworZnUyczRzCis0ZnUxdGEKKzFmeQorMWdhCitnYTJmNAorNWdhbC4KKzNnYWwxaQorZ2EzbG8KKzJnYW0KK2dhNW1ldAorZzVhMm1vCitnYW41aXMKK2dhMm4KK2dhM25pegorZ2FuaTV6YTEKKzRnYW5vNAorZ2FyNW40CitnMmEycgorZ2Eyc3M0CitnNGF0aDMKKzRnYTF0Mml2Cis0Z2F6CitnM2IKK2dkNAorMmdlLgorMmdlZAorZ2VlejQKK2dlbDRpbgorZ2VsMmkKK2dlNWxpcworZ2U1bDFpegorNGdlMWx5CisxZ2VuCitnZTRuMmF0CitnZTFuYQorZzVlNW5pegorNGc0ZW5vCis0Z2VueQorMWdlbworZ2Uzb20KK2c0ZXJ5Cis1Z2Uxc2kKK2dldGg1Cis0Z2UxdG8KK2dlNHR5CitnZTR2Cis0ZzFnMgorZzJnZQorZzNnZXIKK2dnbHU1CitnZ2wyCitnMWdvNAorZ2gzaW4KK2doNW91dAorZ2hvdTIKK2doNHRvCis1Z2kuCisxZzJpNGEKK2dpMmE1cgorZzFpYworNWdpM2MyaTFhCitnMmkxY2kKK2c0aTFjbworZ2llbjUKK2cyaWU0Cis1Z2llcy4KK2dpbDQKK2czaTFtZW4KKzNnNGluLgorZzRpbjVnZQorNWc0aTJuMXMyCis1ZzJpbworM2c0aXIKK2dpcjRsCitnM2lzMWwyCitnaTR1Cis1ZzJpdgorM2dpegorZ2wyCitnbGE0CitnbDJhZDVpCitnbGEyZAorNWdsYXMKKzFnbGUKK2dsaTRiCitnM2wyaWcKKzNnbG8KK2dsbzNyCitnMW0KK2c0bXkKK2cxbjRhCitnNG5hLgorZ25lNHQ0dDIKK2cxbmkKK2cybjFpbgorZzRuMmk0bworZzFubworZzRubzRuCisxZ28KKzNnby4KK2dvYjUKKzVnb2UKKzNnNG80ZworZ28zaXMKK2dvaTIKK2dvMm4yCis0ZzNvM24xYQorZ29uNWRvNQorZzJvbmQKK2dvM25pCis1Z29vMgorZ281cml6Citnb3I1b3UyCis1Z29zLgorZ292MQorZzNwCisxZ3IKKzRncmExZDJhCitncmEyZAorZzRyMmFpMgorZ3JhMm4yCis1Z3JhNHBoLgorZzVyYTNwaDRlcgorNWdyYXBoMWljCitncjRhcGhpCis0ZzNyYTFwaHkKKzRncmF5CitncmU0bgorNGdyZXNzLgorZ3IyZTJzcworNGdyaXQKK2c0cm8KK2dydWY0CitnczIKK2c1c3RlCitndGgzCitndTRhCiszZ3VhcjJkCitndTJhMnIKKzJndWUKKzVndWk1dAorZzJ1aTIKKzNndW4KKzNnMnVzCis0Z3U0dAorZzN3CisxZ3kKKzJnNXkzbgorZ3k1cmEKK2gzYWI0bDIKK2hhMmNoNAoraGFlNG0KK2hhZTR0CitoNWFndQoraGEzbGEKK2hhbGEzbQoraGE0bQoraGFuNGNpCitoYTJuCitoYW40Y3kKKzVoYW5kLgoraDRhbmQKK2gyYW40ZworaGFuZzVlcgoraGFuMWc1bworaDVhNW5pegoraGE0bjRrMgoraGFuNHRlCitoYW4xdAoraGEycDNsMgoraGEycDV0CitoYTNyYTJuCitoMmEycgoraGE1cjJhcworaGFyMmQKK2hhcmQzZQoraGFyNGxlNAoraGFyMWwKK2hhcnA1ZW4KK2hhcjJwCitoYXI1dGVyCitoYTJzNXMKK2hhdW40Cis1aGF6CitoYXozYTEKK2gxYgorMWhlYTJkMQorM2hlMmEycgoraGU0Y2EybgoraGUxY2EKK2g1ZWNhdAoraDRlZAoraDRlNWRvNQoraGUzbDRpCitoZWw0bGlzCitoZWwxbAoraGVsbDJpCitoZWw0bHkKK2g1ZWxvCitoZTRtNHAKK2hlMm4KK2hlMW5hNAoraGVuNWF0CitoZTFvNXIKK2hlcDUKK2g0ZXIxYQoraGVyYTNwCitoZXI0YmEKK2gyZXIxYgoraGVyZTVhCitoM2VybgoraDVlcjFvdTIKK2gyZXJvCitoM2VyeQoraDFlcworaGUyczVwCitoZTR0CitoZTJ0NGVkCitoNGV1NAoraDFmCitoMWgKK2hpNWEybgoraDJpMWEKK2hpNGNvCitoaWdoNQoraDJpZworaDRpbDIKK2hpbWVyNAoraDRpMW5hCitoaW9uNGUKK2gyaW8KK2hpbzJuCitoMmk0cAoraGlyNGwKK2g0aXIKK2hpM3JvCitoaXI0cAoraGlyNHI0CitoaXMzZWwKK2g0aXNlCitoNGkyczRzCitoaXRoNWVyCitoMml0aAoraGl0aDJlCitoMmkydgorNGhrCis0aDFsNAoraGxhMm40CitoMmxvCitobG8zcmkKKzRoMW0KK2htZXQ0CisyaDFuCitoNW9kaXoKK2g1bzJkMXMyCitobzRnCitobzFnZTQKK2hvbDVhMnIKK2hvMWxhCiszaG9sNGUKK2hvNG1hCitobzJtZTMKK2hvMW40YQoraG8ybgoraG81bnkKKzNob29kCitob28yCitob28ybjQKK2hvcjVhdAoraG8xcmEKK2hvNXIyaXMKK2hvcnQzZQoraG81cnUKK2hvczRlCitobzVzZW4KK2hvczFwCisxaG8ydXMKK2hvdTIKK2hvdXNlMworaG92NWVsCis0aDVwCis0aHI0CitocmVlNQoraHJvNW5pegoraHJvMm4KK2hybzNwbworNGgxczIKK2g0czJoCitoNHQyYTJyCitoMXRhCitodDFlbgoraHQ1ZXMKK2g0dHkKK2h1NGcKK2h1NG1pbgoraHUxbWkKK2h1bjVrZQoraHU0bmsyCitodW40dAoraHVzM3Q0CitoMnVzCitodTR0CitoMXcKK2g0d2FyNHQKK2h3MmEycgoraHkzcGUKK2h5M3BoCitoeTJzCisyaTFhCitpMmFsCitpYW00CitpYW01ZTF0ZQoraTJhMm4KKzRpYW5jCitpYW4zaQorNGlhbjR0CitpYTVwZQoraWEyc3M0CitpNGExdDJpdgoraWE0dHJpYworaWExdHIKK2k0YTJ0dQoraWJlNAoraWIzZXIxYQoraWI1ZXJ0CitpYjVpMWEKK2liM2luCitpYjVpdC4KK2liaTJ0CitpYjVpdGUKK2kxYjJsMgoraWIzbGkKK2k1Ym8KK2kxYnIKK2kyYjVyaQoraTVidTRuCis0aWNhbQoraTFjYQorNWljYXAKKzRpYzJhMnIKK2k0Y2FyLgoraTRjYXJhCitpY2FzNQoraTRjYXkKK2ljY3U0CitpYzNjCis0aWNlbworNGkyY2gKKzJpMWNpCitpNWMyaWQKK2ljNWkxbmEKK2kyY2luCitpMmMyaXAKK2ljM2kxcGEKK2k0YzFseTQKK2kxYzRsNAoraTJjNW9jCitpMWNvCis0aTFjcgorNWljcmEKK2k0Y3J5CitpYzR0ZQoraTJjMXQKK2ljMXR1MgoraWM0dDN1MWEKK2ljM3UxbGEKK2ljNHVtCitpYzV1bworaTNjdXIKKzJpZAoraTRkYWkyCitpMWQyYQoraWQ1YW5jCitpZGEybgoraWQ1ZDQKK2lkZTNhNGwKK2lkZTRzMgoraTJkaQoraWQ1aTJhMm4KK2kxZDRpM2EKK2lkaTRhMnIKK2k1ZDJpZTQKK2kxZDNpbworaWRpNW91MgoraWQxaXQKK2lkNWkxdQoraTNkbGUKK2k0ZG9tCitpMWRvCitpZDNvdworaTRkcgoraTJkdQoraWQ1dW8KKzJpZTQKK2llZDRlCis1aWU1Z2EKK2llMmxkMworaWUxbjVhNAoraWVuNGUKK2k1ZTRuMW4yCitpM2VudDJpCitpZW4xdAoraTFlci4KK2kzZXMyYworaTFlc3QKK2kzZXQKKzRpZi4KK2lmNWVybworaWZlcjEKK2lmZjVlbgoraTRmMWYKK2lmNGZyCis0aTJmM2ljLgoraTFmaQoraTNmMmllNAoraTNmNGwyCis0aTJmdAorMmlnCitpZ2E1YgoraTFnYQoraWczZXIxYQoraWdodDNpCis0aWdpCitpM2dpYgoraWczaWw0CitpZzNpbgoraWczaXQKK2k0ZzRsMgoraTJnbworaWczb3IKK2lnNW90CitpNWdyZQoraTFncgoraWcydTVpMgoraWcxdXIKK2kzaAorNGk1aTQKK2kzagorNGlrCitpMWxhCitpbDNhNGIKK2k0bDRhZGUKK2lsYTJkCitpMmw1YW0KK2lsYTVyYQoraWwyYTJyCitpM2xlZworaWwxZXIKK2lsZXY0CitpMmw1ZgoraWwxaQoraWwzaTFhCitpbDJpYgoraWwzaW8KK2lsNGlzdAorMmlsMWl0CitpbDJpegoraWxsNWFiCitpbDFsCis0aTJsMW4yCitpbDNvMXEKK2lsNHR5CitpNGx0CitpbDV1cgoraWwzdgoraTRtYWcKK2kxbWEKK2ltM2FnZQoraW1hNXJ5CitpbTJhMnIKK2ltZW50MmE1cgoraTFtZW4KK2kzbWVuMXQKK2ltZW4xdGEKKzRpbWV0CitpbTFpCitpbTVpMWQ0YQoraW0yaWQKK2ltaTVsZQoraTVtMmluaQorNGltaXQKK2ltNG5pCitpNG0xbgoraTNtbzJuCitpMW1vCitpMm11CitpbTN1MWxhCisyaW4uCitpNG4zYXUKK2kxbmEKKzRpbmF2CitpbmNlbDQKK2luM2NlcgorNGluZAoraW41ZGxpbmcKKzJpbmUKK2kzbmVlCitpbjRlcjRhMnIKK2luMWVyCitpbmVyMWEKK2k1bjJlMnNzCitpMW5lcworNGluMWdhCis0aW5nZQoraW41Z2VuCis0aW5naQoraW41Z2xpbmcKK2luZ2wyCis0aW4xZ28KKzRpbjFndQorMmluaQoraTVuaS4KK2k0bjRpMWEKK2luM2k0bworaW4xaXMKK2k1bmk0dGUuCitpbjJpdAoraW4yaXRlCis1aTNuMmkxdDJpbworaW5pMXRpCitpbjNpMXR5Cis0aTRuazIKKzRpNG4xbAorMmk0bjFuMgorMmkxbm8KK2k0bm80YworaW5vNHMKK2k0bm90CisyaTJuMXMyCitpbjNzZQoraW5zdTFyNWEKK2luMXN1CitpbnN1MnIKKzJpbnQuCitpbjF0CisyaW40dGgKK2luMXUKK2k1bjJ1cworNGlueQorMmlvCis0aW8uCitpbzFnZTQKK2lvMmdyCitpMW9sCitpbzRtCitpb24zYXQKK2lvMm4KK2lvMW4xYQoraW9uNGVyeQoraW9uMWVyCitpb24zaQoraTJvNXBoCitpb3IzaQoraTRvcworaTRvNXRoCitpNW90aQoraW80dG8KK2k0b3VyCitpb3UyCisyaXAKK2lwZTQKK2lwaHIyYXM0CitpcDRocjQKK2lwM2kKK2lwNGljCitpcDRyZTQKK2lwcjIKK2lwM3VsCitpM3F1YQoraXF1MgoraXE1dWUxZgoraXEzdTJpZAoraXEydWkyCitpcTN1aTN0Cis0aXIKK2kxcmEKK2kycmE0YgoraTRyYWMKK2lyZDVlCitpcmU0ZGUKK2kycjJlZAoraTRyZTFmCitpNHJlbDQKK2k0cmVzCitpcjVnaQoraXJnMgoraXIxaQoraXJpNWRlCitpcjJpZAoraXI0aXMKK2lyaTN0dQorNWk1cjJpegoraXI0bWluCitpcjFtCitpcm80ZworNWlyb24uCitpcm8ybgoraXI1dWwKKzJpcy4KK2lzNWFnCitpc2EyCitpczNhMnIKK2lzYXM1CisyaXMxYworaXMzY2gyCis0aXNlCitpczNlcgorM2k0czNmCitpczVoYTJuCitpczJoCitpczNobzJuMworaXNobzQKK2lzaDVvcAoraXMzaTFiCitpczJpNGQKK2k1c2lzCitpczVpMXQyaXYKK2lzaTF0aQorNGlzNGsyCitpc2xhMm40CitpczFsMgorNGlzNG0xczIKK2kyczFtCitpMnNvCitpc281bWVyCitpM3NvbQoraXNvMm1lCitpczFwCitpczJwaQoraXM0cHkKKzRpMnMxcworaXM0c2FsCitpczFzYTIKK2lzc2VuNAoraXM0czFlNHMKK2lzNHRhLgoraXMxdGEKK2lzMXRlCitpczF0MmkKK2lzdDRseQoraXMydGwKKzRpc3RyYWwKK2lzdDRyCitpczF0cmEKK2kyc3UKK2lzNXVzCis0aTN0YS4KK2kxdGEKK2l0YTRiaQoraTJ0YWIKK2k0dGFnCis0aXRhNW0KK2kzdGEybgoraTN0YXQKKzJpdGUKK2l0M2VyMWEKK2k1dGVyMWkKK2l0NGVzCisyaXRoCitpMXRpCis0aTF0MmkxYQorNGkydGljCitpdDNpMWNhCis1aTV0aWNrMQoraTJ0M2lnCitpdDVpbDFsCitpMnRpbQorMmkxdDJpbworNGl0aXMKK2k0dGkyczRtCitpMnQ1bzVtCitpMXRvCis0aXRvMm4KK2k0dHJhbQoraTF0cmEKK2l0NXJ5Cis0aTR0M3QyCitpdDN1MWF0CitpMXR1CitpdHUxYQoraTV0dWQyCitpdDN1bAorNGl0ei4KK2k0dHoKK2kxdQorMml2CitpdjNlbDFsCitpdjNlbi4KK2k0djNlci4KK2k0dmVycy4KK2l2ZTRyMXMyCitpdjVpbC4KK2kydmlsCitpdjVpbworaXYxaXQKK2k1dm9yZQoraXYzbzNybworaTR2M290Cis0aTV3CitpeDRvCis0aXkKKzRpejJhMnIyCitpemExCitpMnoxaTQKKzVpem9uMXQKK2kxem8KK2l6bzJuCis1amEKK2phYzRxCitqYTRwCisxamUKK2plNHI1czIKKzRqZXM0dDJpZTQKK2plc3QyaQorNGplczJ0eQoramV3Mworam80cAorNWp1ZGcKKzNrYS4KK2szYWIKK2s1YWcKK2thaXM0CitrYWkyCitrYWw0CitrMWIKK2syZWQKKzFrZWUKK2tlNGcKK2tlNWwyaQorazNlbjRkCitrMWVyCitrZXM0CitrM2Uyc3QuCitrZTR0eQorazNmCitraDQKK2sxaQorNWtpLgorNWsyaWMKK2s0aWwxbAora2lsbzUKK2s0aW0KK2s0aW4uCitraW40ZGUKK2s0aW5kCitrNWk1bjJlMnNzCitrMmluZQora2kxbmVzCitraW40ZworazJpNHAKK2tpczQKK2s1aXMyaAora2s0CitrMWwKKzRrM2xleQorNGsxbHkKK2sxbQorazVuZXMKKzFrMm5vCitrbzVyCitrb3MyaDQKK2szb3UyCitrcm81bgorNGsxczIKK2s0c2MKK2tzNGwyCitrNHM0eQorazV0CitrMXcKK2xhYjNpYworbDRhYm8KK2w0YTJjaTQKK2w0YWRlCitsYTJkCitsYTNkMnkKK2xhZzRuCitsYTJtM28KKzNsNGFuZAorbGEybgorbGFuNGRsCitsYW41ZXQKK2xhbjR0ZQorbGFuMXQKK2xhcjRnMgorbDJhMnIKK2xhcjNpCitsYXM0ZQorbGE1dGEybgorbGEydGEKKzRsYXRlbDJpNAorNGxhMXQyaXYKKzRsYXYKK2xhNHY0YQorMmwxYgorbGJpbjQKKzRsMWMyCitsY2U0CitsM2NpCisybGQKK2wyZGUKK2xkNGVyZQorbGQ0ZXIxaQorbGRpNAorbGQ1aXMxCitsM2RyCitsNGRyaQorbGUyYQorbGU0YmkKK2wyZTFiCitsZTJmdDUKK2xlMWYKKzVsZWcuCis1bGU0ZzFnMgorbGU0bWF0CitsZTFtYQorbGVtNWF0MWljCis0bGVuLgorM2xlbmMKKzVsZTJuZS4KKzFsZW4xdAorbGUzcGgKK2xlNHByMgorbGUycmE1YgorbGVyMWEKK2xlcjRlCiszbGVyZzIKKzNsNGVyMWkKK2w0ZXJvCitsZXMyCitsZTVzMWNvCitsZXMyYworNWxlc3EKKzNsMmUyc3MKKzVsZXNzLgorbDNlMXZhCitsZXY0ZXIuCitsZXYxZXIKK2xldjRlcjFhCitsZXY0ZTRyMXMyCiszbGV5Cis0bGV5ZQorMmxmCitsNWZyCis0bDFnNAorbDVnYQorbGcyYTJyMworbDRnZXMKK2wxZ28zCisybDNoCitsaTRhZworbDJpMWEKK2xpMmFtNAorbGlhcjVpegorbGkyYTJyCitsaWFyMWkKK2xpNGFzCitsaTRhMXRvCitsaTViaQorNWxpYzJpbworbDJpMWNpCitsaTRjb3IKK2xpMWNvCis0bGk0YzNzMgorNGxpY3QuCitsaTJjMXQKK2w0aWN1CitsM2kxY3kKK2wzaTFkMmEKK2wyaWQKK2xpZDVlcgorM2xpMmRpCitsaWYzZXIxCitsNGk0ZjFmCitsaTRmNGwyCis1bGlnYXRlCitsMmlnCitsaTFnYQorM2xpZ2gKK2xpNGdyYQorbGkxZ3IKKzNsNGlrCis0bDRpNGwKK2xpbTRiMmwyCitsaTRtMWIKK2xpbTNpCitsaTRtbworbDRpNG00cAorbDRpMW5hCisxbDRpbmUKK2xpbjNlYQorbDJpbjNpCitsaW5rNWVyCitsNGk0bmsyCitsaTVvZworbDJpbworNGw0aXEKK2xpczRwCitsMWl0CitsMml0LgorNWxpdDNpMWNhCitsaTF0aQorbDRpMnRpYworbDVpNXRpNGMzczIKK2xpdjNlcgorbDJpdgorbDFpegorNGxqCitsa2EzCitsM2thbDQKK2xrYTR0CitsMWwKK2w0bGF3CitsMmxlCitsNWxlMmEKK2wzbGVjCitsM2xlZworbDNsZWwKK2wzbGU0bgorbDNsZTR0CitsbDJpCitsMmxpbjQKK2w1bDRpMW5hCitsbDRvCitsbG9xMnVpNQorbGxvMXEKK2xsb3F1MgorbDJsNW91dAorbGxvdTIKK2w1bG93CisybG0KK2w1bWV0CitsbTNpbmcKK2w0bW8yZDEKK2wxbW8KK2xtbzJuNAorMmwxbjIKKzNsby4KK2xvYjVhbAorbG80Y2kKKzRsb2YKKzNsb2cxaWMKK2w1bzFnbworM2xvZ3UKK2xvbTNlcgorbG8ybWUKKzVsb25nCitsbzJuCitsb240aQorbDNvM25pegorbG9vZDUKK2xvbzIKKzVsbzRwZS4KK2xvcDNpCitsM280cDFtCitsbzFyYTQKK2xvNHJhMXRvCitsbzVyMmllNAorbG9yNW91MgorNWxvcy4KK2xvczVldAorNWxvczVvM3BoaXoKK2xvMnNvCitsb3M0b3AKK2xvczJvcGgKKzVsb3M1bzFwaHkKK2xvczR0CitsbzR0YQorbG91bjVkCitsb3UyCisybG91dAorNGxvdgorMmxwCitscGE1YgorbDFwYQorbDNwaGEKK2w1cGhpCitscDVpbmcKK2xwaTJuCitsM3BpdAorbDRwMmwyCitsNXByMgorNGwxcgorMmwxczIKK2w0c2MKK2wyc2UKK2w0czJpZTQKKzRsdAorbHQ1YWcKK2wxdGEKK2x0YW5lNQorbHRhMm4KK2wxdGUKK2x0ZW40CitsdGVyMWE0CitsdGgzaQorbDV0aWVzLgorbHQyaWU0CitsdGlzNAorbDF0cgorbDF0dTIKK2x0dTFyM2EKK2x1NWEKK2x1M2JyCitsdTJjaDQKK2x1M2NpCitsdTNlbgorbHVmNAorbHU1aWQKK2wydWkyCitsdTRtYQorNWx1MW1pCitsNXVtbi4KK2x1NG0xbgorNWx1bTNuNGkxYQorbHUzbworbHVvM3IKKzRsdXAKK2x1MnNzNAorbDJ1cworbHVzM3RlCisxbHV0CitsNXZlbgorbDV2ZXQ0CisybDF3CisxbHkKKzRseWEKKzRseTFiCitseTVtZTQKK2x5M25vCisybHlzNAorbDV5M3MyZQorMW1hCisybWFiCittYTJjYQorbWE1Y2gyaW5lCittYTJjaAorbWE0Y2gxaW4KK21hNGM0bDQKK21hZzVpbgorbWFnMWkKKzVtYWcxbgorMm1haAorbWEyaWQ1CittYWkyCis0bWEybGQKK21hM2wyaWcKK21hbDFpCittYTVsaW4KK21hbDRsMmkKK21hbDFsCittYWw0dHkKK21hNGx0Cis1bWEzbjRpMWEKK21hMm4KK21hbjVpcworbWFuM2l6Cis0bWFwCittYTVyaTJuZS4KK20yYTJyCittYXIxaQorbWFyMmluNGUKK21hNXIyaXoKK21hcjRseQorbWFyMWwKK21hcjN2CittYTVzY2UKK21hczRlCittYXMxdAorNW1hdGUKK200YXRoMworbWEzdGlzCis0bWF0aTN6YTEKK21hMXRpegorNG0xYgorbTFiYTR0NQorbTViaWwKK200YjNpbmcKK21iMmk0dgorNG01YworNG1lLgorMm1lZAorNG1lZC4KKzVtZTNkNGkzYQorbTRlZGkKK21lM2QyaWU0CittNWU1ZDJ5CittZTJnCittZWw1bzJuCittZTRsNHQKK21lMm0KK21lMW0xbzMKKzFtZW4KK21lMW40YQorbWVuNWFjCittZW40ZGUKKzRtZW5lCittZW40aQorbWUybjFzNAorbWVuMXN1NQorM21lbjF0CittZW40dGUKK21lNW8ybgorbTVlcjFzYTIKK21lNHIxczIKKzJtZXMKKzNtZXN0MmkKK21lNHRhCittZXQzYTJsCittZTF0ZQorbWU1dGhpCittNGV0cgorNW1ldDNyaWMKK21lNXRyMmllNAorbWUzdHJ5CittZTR2Cis0bTFmCisybWgKKzVtaS4KK20yaTNhCittaTFkNGEKK20yaWQKK21pZDRnCittMmlnNAorM21pbDNpMWEKK21pbDFpCittNWk1bDJpZTQKK200aWwxbAorbWkxbjRhCiszbTRpbmQKK201aTNuZWUKK20yaW5lCittNGluZ2wyCittaW41Z2xpCittNWluZzFseQorbWluNHQKK200aW4xdQorbWlvdDQKK20yaW8KK20yaXMKK21pNHM0ZXIuCittNGlzZQorbWlzM2VyCittaXM1bDIKK21pczR0MmkKK201aTRzdHJ5CittaXN0NHIKKzRtMml0aAorbTJpegorNG1rCis0bTFsCittMW0KK21tYTVyeQorbTFtYQorbW0yYTJyCis0bTFuCittMW40YQorbTRuMWluCittbjRvCisxbW8KKzRtb2NyCis1bW9jNXJhMXRpegorbW8yZDEKK21vNGdvCittb2lzMgorbW9pMgorbW80aTVzZQorNG0yb2sKK21vNWxlc3QKK21vbGVzMgorbW8zbWUKK21vbjVldAorbW8ybgorbW9uNWdlCittbzNuNGkzYQorbW9uNGkyczFtCittb24xaXMKK21vbjRpc3QKK21vM25pegorbW9ub2w0CittbzNueS4KK21vMnIKKzRtbzVyYS4KK21vMXJhCittb3MyCittbzVzZXkKK21vM3NwCittNG90aDMKK201b3VmCittb3UyCiszbW8ydXMKK21vMnYKKzRtMXAKK21wYXJhNQorbTFwYQorbXAyYTJyCittcGE1cmFiCittcDRhNHI1aQorbTNwZTJ0CittcGhhczQKK20ycGkKK21wMmk0YQorbXA1aWVzCittcDJpZTQKK200cDFpMm4KK201cDRpcgorbXA1aXMKK21wbzNyaQorbTFwNG9yCittcG9zNWl0ZQorbTFwb3MKK200cG8ydXMKK21wb3UyCittcG92NQorbXA0dHIKK20ycDF0CittMnB5Cis0bTNyCis0bTFzMgorbTRzMmgKK201c2kKKzRtdAorMW11CittdWwyYTVyNAorbXUxbGEKKzVtdTRsdAorbXVsMXRpMworM211bQorbXVuMgorNG11cAorbXU0dQorNG13CisxbmEKKzJuMWEyYgorbjRhYnUKKzRuYWMuCituYTRjYQorbjVhMmMxdAorbmFnNWVyLgorbmFrNAorbmE0bDFpCituYTVsMmkxYQorNG5hNGx0CituYTVtaXQKK24yYTJuCituYW4xY2k0CituYW40aXQKK25hNG5rNAorbmFyM2MKK24yYTJyCis0bmFyZQorbmFyM2kKK25hcjRsCituNWFyMW0KK240YXMKK25hczRjCituYXM1dDJpCituMmF0CituYTN0YTJsCituYTJ0YQorbmF0NW81bTJpegorbmEydG9tCituYTF0bworbjJhdQorbmF1M3NlCituYTJ1cworM25hdXQKK25hdjRlCis0bjFiNAorbmMyYTJyNQorbjFjYQorbjRjZXMuCituM2NoYQorbjJjaAorbjVjaGVvCituY2hlMgorbjVjaDRpbDIKK24zY2hpcworbjJjMWluCituMWNpCituMmM0aXQKK25jb3UxcjVhCituMWNvCituY291MgorbjFjcgorbjFjdQorbjRkYWkyCituMWQyYQorbjVkYTJuCituMWRlCituZDVlMnN0LgorbmRlczIKK25kaTRiCituNWQyaWYKK24xZGl0CituM2RpegorbjVkdTJjCituMWR1CituZHU0cgorbmQyd2UKK25kMXcKKzJuZS4KK24zZTJhMnIKK24yZTJiCituZWIzdQorbmUyYworNW5lY2sxCisybmVkCituZTRnYXQKK25lMWdhCituZTRnNWExdDJpdgorNW5lZ2UKK25lNGxhCituZWw1aXoKK25lbDJpCituZTVtaQorbmU0bW8KKzFuZW4KKzRuZW5lCiszbmVvCituZTRwbworbmUycQorbjFlcgorbmUycmE1YgorbmVyMWEKK240ZXIzYTJyCituMmVyZQorbjRlcjVpCituZXI0cjQKKzFuZXMKKzJuZXMuCis0bmUxc3AKKzJuZXN0Cis0bmVzNHcyCiszbmV0MWljCituZTR2CituNWV2ZQorbmU0dworbjNmCituNGdhYgorbjFnYQorbjNnZWwKK25nZTRuNGUKK24xZ2VuCituNWdlcmUKK24zZ2VyMWkKK25nNWhhCituM2dpYgorbmcxaW4KK241Z2l0CituNGdsYTQKK25nbDIKK25nb3Y0CituMWdvCituZzVzMmgKK25nczIKK24xZ3UKK240Z3VtCituMmd5Cis0bjFoNAorbmhhNAorbmhhYjMKK25oZTQKKzNuNGkxYQorbmkzYTJuCituaTRhcAorbmkzYmEKK25pNGIybDIKK24yaTRkCituaTVkaQorbmk0ZXIKK24yaWU0CituaTJmaQorbmk1ZmljYXQKK25pZmkxY2EKK241aTFncgorbjJpZworbjRpazQKK24xaW0KK25pM20yaXoKK25pbTFpCituMWluCis1bmkybmUuCituMmluZQorbmluNGcKK24yaTRvCis1bjJpcy4KK25pczR0YQorbjJpdAorbjRpdGgKKzNuMmkxdDJpbworbmkxdGkKK24zaXRvcgorbmkxdG8KK25pM3RyCituMWoKKzRuazIKK241azJlcm8KK25rMWVyCituM2tldAorbmszaW4KK25rMWkKK24xazFsCis0bjFsCituNW0KK25tZTQKK25tZXQ0Cis0bjFuMgorbm5lNAorbm5pM2FsCituM240aTFhCitubjJpNHYKK25vYjRsMgorbm8zYmxlCituNW8xYzRsNAorNG4zbzJkCiszbm9lCis0bm9nCitubzFnZTQKK25vaXM1aQorbm9pMgorbm81bDRpCis1bm9sMW8xZ2lzCiszbm9taWMKK241bzVtMml6CitubzRtbworbm8zbXkKK25vNG4KK25vbjRhZworbm8xbjFhCitub241aQorbjVvbml6Cis0bm9wCis1bm9wNW81bDJpCitubzJyNWFiCitubzFyYQorbm80cmFyeQorbm9yMmEycgorNG5vczJjCitub3M0ZQorbm9zNXQKK25vNXRhCisxbm91MgorM25vdW4KK25vdjNlbDMKK25vd2wzCituMXA0CitucGk0CitucHJlNGMKK25wcjIKK24xcQorbjFyCitucnU0CisybjFzMgorbjJzNWFiCituc2EyCituc2F0aTQKK25zNGMKK24yc2UKK240czNlNHMKK25zMmlkMQorbnMyaWc0CituMnMxbDIKK24yczNtCituNHNvYworbjFzbworbnM0cGUKK241c3BpCituc3RhNWIybDIKK25zMXRhCituczJ0YWIKK24xdAorbjJ0YTRiCituMXRhCitudGU0cjNzMgorbnQyaQorbjV0aTJiCitudGk0ZXIKK250MmllNAorbnRpMmYyCituM3QyaW5lCituMnQxaW4KK240dDNpbmcKK250Mmk0cAorbnRyb2w1bDJpCitudHJvbDFsCituNHQ0czIKK250dTNtZQorbjF0dQorbjN0dW0KK251MWEKK251NGQKK251NWVuCitudWY0ZmUKK251NGYxZgorbjN1aTRuCituMnVpMgorM251M2l0CituNHVtCitudTFtZQorbjV1MW1pCiszbnU0bgorbjN1bworbnUzdHIKK24xdjIKK24xdzQKK255bTQKK255cDQKKzRuegorbjN6YTEKKzRvYQorb2EyZDMKK281YTVsZXMyCitvMmFsZQorb2FyZDMKK28yYTJyCitvYXM0ZQorb2FzdDVlCitvYXQ1aQorb2IzYTNiCitvNWIyYTJyCitvMWJlNGwKK28xYmkKK28yYmluCitvYjVpbmcKK28zYnIKK29iM3VsCitvMWNlCitvMmNoNAorbzNjaGU0dAorb2NoZTIKK29jaWYzCitvMWNpCitvNGNpbAorbzRjbGFtCitvMWM0bDQKK280Y29kCitvMWNvCitvYzNyYWMKK29jNXJhMXRpegorb2NyZTMKKzVvY3JpdAorb2NyaTIKK29jdG8ycjVhCitvMmMxdAorb2MxdG8KK29jM3UxbGEKK281Y3VyZQorb2Q1ZDFlZAorb2QxZDQKK29kM2ljCitvMWQyaTNvCitvMmRvNAorb2Q0b3IzCitvNGQ1dWN0LgorbzFkdQorb2R1MmMKK29kdTJjMXQKK280ZDV1YzR0MXMyCitvNGVsCitvNWVuZworbzNlcgorb2U0dGEKK28zZXYKK28yZmkKK29mNWl0ZQorb2Y0aTR0NHQyCitvMmc1YTVyCitvMWdhCitvNGc1YTF0Mml2CitvNGdhMXRvCitvMWdlCitvNWdlbmUKK28xZ2VuCitvNWdlbworbzRnZXIKK28zZzJpZTQKKzFvMWdpcworb2czaXQKK280Z2wyCitvNWcybHkKKzNvZ25pegorb2cxbmkKK280ZzRybworbzFncgorb2cydTVpMgorMW8xZ3kKKzJvMmc1eTNuCitvMWgyCitvaGFiNQorb2kyCitvaWMzZXMKK29pM2RlcgorbzJpZAorb2k0ZjFmNAorbzJpZzQKK29pNWxldAorbzNpbmcKK29pbnQ1ZXIKK29pbjF0CitvNWkyczFtCitvaTVzbzJuCitvaTJzbworb2lzdDVlbgorb2lzMXRlCitvaTN0ZXIKK28yaXRlCitvNWoKKzJvaworbzNrZW4KK29rNWllNAorb2sxaQorbzFsYQorbzRsYTJuCitvbGEyc3M0CitvMmwyZAorb2wyZDFlCitvbDNlcgorbzNsZXMyYworb2xlczIKK28zbGV0CitvbDRmaQorbzJsZgorb2wyaQorbzNsMmkxYQorbzNsaWNlCitvbDVpZC4KK29sMmlkCitvM2xpNGYKK281bDRpNGwKK29sM2luZworbzVsMmlvCitvNWwyaXMuCitvbDNpczJoCitvNWwyaXRlCitvbDFpdAorbzVsMmkxdDJpbworb2xpMXRpCitvNWwyaXYKK29sbDJpNGU0CitvbDFsCitvbGwyaQorb2w1bzNnaXoKK29sbzRyCitvbDVwMmwyCitvMmxwCitvNGwydAorb2wzdWIKK29sM3VtZQorb2wzdW4KK281bDJ1cworb2wydgorbzJseQorbzJtNWFoCitvMW1hCitvbWE1bAorb201YTF0aXoKK29tMmJlCitvNG0xYgorb200YjJsMgorbzJtZQorb20zZTFuNGEKK28xbWVuCitvbTVlcjJzZQorb21lNHIxczIKK280bWV0CitvbTVlM3RyeQorb200ZXRyCitvM20yaTNhCitvbTNpYy4KK29tM2kxY2EKK281bTJpZAorb20xaW4KK281bTJpbmkKKzVvbW1lbmQKK29tMW0KK29tMW1lbgorb21vNGdlCitvMW1vCitvNG1vMm4KK29tM3BpCitvNG0xcAorb21wcm81CitvbXByMgorbzJuCitvMW4xYQorb240YWMKK28zbjJhMm4KK29uMWMKKzNvbmNpbAorb24xY2kKKzJvbmQKK29uNWRvCitvM25lbgorbzJuNWVzdAorbzFuZXMKK29uNGd1CitvbjFpYworbzNuMmk0bworb24xaXMKK281bmkxdQorb24za2V5CitvNG5rMgorb240b2RpCitvNG4zbzJkCitvbjNvM215CitvMm4zczIKK29uNXNwaTQKK29uc3BpMXI1YQorb25zcDRpcgorb24xc3U0CitvbnRlbjQKK29uMXQKK29uM3Q0aQorb250aTJmNQorb241dW0KK29uMXZhNQorb24xdjIKK29vMgorb29kNWUKK29vZDVpCitvMm80aworb29wM2kKK28zb3JkCitvb3N0NQorbzJwYQorbzJwMmU1ZAorb3AxZXIKKzNvcGVyMWEKKzRvcDRlcmFnCisyb3BoCitvNXBoYTJuCitvNXBoNGVyCitvcDNpbmcKK29waTJuCitvM3BpdAorbzVwbzJuCitvNHBvc2kKK28xcG9zCitvMXByMgorb3AxdQorb3B5NQorbzFxCitvMXJhCitvNXJhLgorbzRyM2FnCitvcjVhbDFpegorb3JhbDFpCitvcjVhbjRnZQorb3JhMm4KK29yMmFuZworb3JlNWEKK281cmUxYTRsCitvcjNlaTIKK29yNGU1czJoCitvcjVlMnN0Lgorb3JlczJ0CitvcmV3NAorb3I0Z3UKK29yZzIKKzRvNXIyaTNhCitvcjNpMWNhCitvNXJpbAorb3IxaW4KK28xcjJpMW8KK29yM2kxdHkKK28zcmkxdQorb3IybWkKK29yMW0KK29ybjJlCitvNXJvZgorb3Izb3VnCitvcm91Mgorb3I1cGUKK29yMXAKKzNvcnJoNAorb3IxcjQKK29yNHNlCitvNHJzMgorb3JzNWVuCitvcnN0NAorb3IzdGhpCitvcjN0aHkKK29yNHR5CitvNXJ1bQorbzFyeQorb3MzYWwKK29zYTIKK29zMmMKK29zNGNlCitvM3Njb3AKK29zMWNvCis0b3Njb3BpCitvNXNjcgorb3M0aTRlNAorb3M1aTF0Mml2Citvc2kxdGkKK29zM2kxdG8KK29zM2kxdHkKK281c2k0dQorb3M0bDIKK28yc28KK28yczRwYQorb3M0cG8KK29zMnRhCitvNXN0YXRpCitvczV0aWwKK29zdDJpCitvczV0aXQKK280dGEybgorbzF0YQorb3RlbGU0Zworb3QzZXIuCitvdDVlNHIxczIKK280dGVzCis0b3RoCitvdGg1ZTFzaQorb3RoMmUKK290aDFlcworb3RoM2k0CitvdDNpYy4KK290NWkxY2EKK28zdGljZQorbzN0aWYyCitvM3Rpcworb3RvNXMyCitvMXRvCitvdTIKK291M2IybDIKK291Y2g1aQorb3UyY2gKK291NWV0CitvdTRsCitvdW5jNWVyCitvdW4yZAorb3U1djIKK292NGVuCitvdmVyNG5lCitvdmU0cjNzMgorb3Y0ZXJ0CitvM3ZpcworbzR2aTF0aTQKK281djRvbAorb3czZGVyCitvdzNlbAorb3c1ZXN0Mworb3cxaTIKK293bjVpCitvNHdvMgorb3kxYQorMXBhCitwYTRjYQorcGE0Y2UKK3BhMmM0dAorcDRhMmQKKzVwYWdhNG4KK3BhMWdhCitwM2FnYXQKK3A0YWkyCitwYTRpNG40CitwNGFsCitwYTFuNGEKK3BhMm4KK3BhbjNlbAorcGFuNHR5CitwYW4xdAorcGEzbnkKK3BhMXAKK3BhNHB1CitwYXJhNWIybDIKK3AyYTJyCitwYTJyYWIKK3BhcjVhZ2UKK3BhcjVkMmkKKzNwYXJlCitwYXI1ZWwKK3A0YTRyMWkKK3BhcjRpcworcGEydGUKK3BhNXRlcgorNXBhdGhpYworcDRhdGgKK3BhNXRoeQorcGE0dHJpYworcGExdHIKK3BhdjQKKzNwYXkKKzRwMWIKK3BkNAorNHBlLgorM3BlNGEKK3BlYXI0bAorcGUyYTJyCitwZTJjCisycDJlZAorM3BlZGUKKzNwNGVkaQorcGUzZDRpM2E0CitwZWQ0aWMKK3A0ZWUKK3BlZTRkCitwZWs0CitwZTRsYQorcGVsMmk0ZTQKK3BlbDJpCitwZTRuMmEybgorcGUxbmEKK3A0ZW5jCitwZW40dGgKK3BlbjF0CitwZTVvMm4KK3A0ZXJhLgorcGVyMWEKK3BlcmE1YjJsMgorcGUycmE0YgorcDRlcmFnCitwNGVyMWkKK3Blcmk1c3QKK3BlcjJpcworcGVyNG1hbAorcGVyM200CitwZXIxbWEKK3BlcjJtZTUKK3A0ZXJuCitwMmVyM28KK3BlcjN0aQorcDRlNXJ1CitwZXIxdgorcGUydAorcGU1dGVuCitwZTV0aXoKKzRwZgorNHBnCis0cGguCitwaGFyNWkKK3BoMmEycgorcGg0ZTNubworcGhlMm4KK3BoNGVyCitwaDRlcy4KK3BoMWVzCitwaDFpYworNXBoMmllNAorcGg1aW5nCis1cGhpczF0MmkKKzNwaGl6CitwNGgybDQKKzNwaG9iCiszcGhvbmUKK3BobzJuCis1cGhvbmkKK3BobzRyCis0cDRoMXMyCitwaDN0Cis1cGh1CisxcGh5CitwMmkzYQorcGkyYTJuNAorcGk0YzJpZTQKK3AyaTFjaQorcGk0Y3kKK3A0aWQKK3A1aTFkMmEKK3BpM2RlCis1cGkyZGkKKzNwaWVjCitwMmllNAorcGkzZW4KK3BpNGdyYXAKK3AyaWcKK3BpMWdyCitwaTNsbworcGkybgorcDRpbi4KK3A0aW5kNAorcDRpMW5vCiszcDJpMW8KK3BpbzJuNAorcDNpdGgKK3BpNXRoYQorcGkydHUKKzJwM2syCisxcDJsMgorM3BsYTJuCitwbGFzNXQKK3BsMmkzYQorcGxpNWVyCitwbDJpZTQKKzRwbDJpZworcGxpNG4KK3Bsb2k0CitwbHU0bQorcGx1NG00YgorNHAxbQorMnAzbgorcG80YworNXBvZC4KK3BvNWVtCitwbzNldDUKKzVwbzRnCitwb2luMgorcG9pMgorNXBvaW4xdAorcG9seTV0CitwbzJseQorcG80bmkKK3BvMm4KK3BvNHAKKzFwNG9yCitwbzRyeQorMXBvcworcG8yczFzCitwNG90CitwbzR0YQorNXBvdW4KK3BvdTIKKzRwMXAKK3BwYTVyYQorcDFwYQorcHAyYTJyCitwMnBlCitwNHAyZWQKK3A1cGVsCitwM3BlbgorcDNwZXIKK3AzcGUydAorcHBvNXMyaXRlCitwMXBvcworcHIyCitwcmF5NGU0Cis1cHJlMWMyaQorcHJlNWNvCitwcmUzZTJtCitwcmU0ZjVhYworcHJlMWYKK3ByZTFmYQorcHJlNGxhCitwcjFlM3I0CitwM3JlMXMyZQorM3ByMmUyc3MKK3ByZTV0ZW4KK3ByZTN2MgorNXByMmk0ZTQKK3ByaW40dDMKK3ByMmk0cworcHJpMnMzbworcDNybzFjYQorcHIyb2MKK3Byb2Y1aXQKK3BybzJmaQorcHJvM2wKK3Byb3MzZQorcHJvMXQKKzJwMXMyCitwMnNlCitwczRoCitwNHNpMWIKKzJwMXQKK3AydDVhNGIKK3AxdGEKK3AydGUKK3AydGgKK3AxdGkzbQorcHR1NHIKK3AxdHUKK3A0dHc0CitwdWIzCitwdWU0CitwdWY0CitwdTRsM2MyCitwdTRtCitwdTJuCitwdXI0cjQKKzVwMnVzCitwdTJ0Cis1cHV0ZQorcHV0M2VyCitwdTN0cgorcHV0NHQxZWQKK3B1NHQzdDIKK3B1dDR0MWluCitwM3cKK3F1MgorcXVhNXY0CisycXVlLgorM3F1ZXIKKzNxdWV0CisycmFiCityYTNiaQorcmFjaDRlMgorcmEyY2gKK3I1YTFjNGw0CityYWY1ZmkKK3JhMmYKK3JhNGYxZjQKK3JhMmY0dAorcjJhaTIKK3JhNGxvCityYW0zZXQKK3IyYW1pCityYTNuZTVvCityYTJuCityYW40Z2UKK3IyYW5nCityNGFuaQorcmE1bm80CityYXAzZXIKKzNyYTFwaHkKK3JhcjVjCityMmEycgorcmFyZTQKK3JhcjVlMWYKKzRyYXJpbAorcmFyMWkKK3IyYXMKK3JhdGlvMm40CityYTF0MmlvCityYXU0dAorcmE1dmFpMgorcmEydmEKK3JhdjNlbAorcmE1ejJpZTQKK3JhMnoxaQorcjFiCityNGJhYgorcjRiYWcKK3JiaTIKK3IyYjNpNGYKK3IyYmluCityNWIyaW5lCityYjVpbmcuCityYjRvCityMWMKK3IyY2UKK3IxY2VuNAorcjNjaGEKK3IyY2gKK3JjaDRlcgorcmNoZTIKK3I0Y2k0YgorcjFjaQorcjJjNGl0CityY3VtMworcjRkYWwKK3IxZDJhCityZDJpCityMWQ0aTRhCityZGk0ZXIKK3JkMmllNAorcmQxaW40CityZDNpbmcKKzJyZS4KK3JlMWE0bAorcmUzYTJuCityZTVhcjFyNAorcmUyYTJyCis1cmVhMnYKK3JlNGF3CityNWVicmF0CityMmUxYgorcmUzYnIKK3JlYzVvbDFsCityZTJjb2wKK3JlMWNvCityZTRjNW9tcGUKK3JlY280bTFwCityZTRjcmUKK3JlMWNyCisycjJlZAorcmUxZGUKK3JlM2RpczEKK3I0ZWRpCityZWQ1aXQKK3JlNGZhYworcmUxZgorcmUxZmEKK3JlMmZlCityZTVmZXIuCityZWZlcjEKK3JlM2ZpCityZTRmeQorcmVnM2lzCityZTVpdAorcmVpMgorcmUxbDJpCityZTVsdQorcjRlbjR0YQorcmVuMXQKK3JlbjR0ZQorcmUxbworcmU1cGkybgorcmU0cG9zaQorcmUxcG8KK3JlMXBvcworcmUxcHUKK3IxZXI0CityNGVyMWkKK3IyZXJvNAorcjRlNXJ1CityNGVzLgorcmU0c3BpCityZTFzcAorcmVzNHM1aTRiCityMmUyc3MKK3JlczFzaQorcmVzMnQKK3JlNXMydGEybAorcmVzMXRhCityMmUzc3Q0cgorcmU0dGVyCityZTR0aTR6CityZTN0cmkKK3I0ZXUyCityZTV1MXQyaQorcmV2MgorcmU0dmFsCityZTF2YQorcmV2M2VsCityNWV2NWVyLgorcmV2MWVyCityZTV2ZTRyMXMyCityZTV2ZXJ0CityZTV2aTRsCityZTF2aQorcmV2NW9sdQorcmU0d2gKK3IxZgorcjNmdTQKK3I0ZnkKK3JnMgorcmczZXIKK3IzZ2V0CityM2cxaWMKK3JnaTRuCityZzNpbmcKK3I1Z2lzCityNWdpdAorcjFnbDIKK3JnbzRuMgorcjFnbworcjNndQorcmg0Cis0cmguCis0cmhhbAorcjJpM2EKK3JpYTRiCityaTRhZworcjRpYgorcmliM2EKK3JpYzVhczUKK3JpMWNhCityNGljZQorNHIyaTFjaQorNXJpNWMyaWQKK3JpNGMyaWU0CityNGkxY28KK3JpZDVlcgorcjJpZAorcmkzZW5jCityMmllNAorcmkzZW4xdAorcmkxZXIKK3JpNWV0CityaWc1YTJuCityMmlnCityaTFnYQorNXI0aWdpCityaWwzaXoKK3JpbDFpCis1cmltYTJuCityaTFtYQorcmltNWkKKzNyaTFtbworcmltNHBlCityaTRtMXAKK3IyaTFuYQorNXJpbmEuCityNGluNGQKK3IyaW40ZQorcmluNGcKK3IyaTFvCis1cmlwaAorcjJpcAorcmlwaDVlCityaTJwMmwyCityaXA1bGljCityNGlxCityMmlzCityNGlzLgorcjJpczRjCityM2lzMmgKK3JpczRwCityaTN0YTNiCityaTF0YQorcjVpdGVkLgorcjJpdGUKK3JpMnQxZWQKK3JpdDVlci4KK3JpdDVlNHIxczIKK3I0aTJ0M2ljCityaTF0aQorcmkydHUKK3JpdDV1cgorcml2NWVsCityMml2CityaXYzZXQKK3JpdjNpCityM2oKK3Iza2V0CityazRsZQorcmsxbAorcms0bGluCityMWwKK3JsZTQKK3IybGVkCityNGwyaWcKK3I0bGlzCitybDVpczJoCityM2xvNAorcjFtCitybWE1YworcjFtYQorcjJtZQorcjNtZW4KK3JtNWU0cjFzMgorcm0zaW5nCityNG1pbmcuCityNG0yaW8KK3IzbWl0CityNG15CityNG4yYTJyCityMW5hCityM25lbAorcjRuMWVyCityNW5ldAorcjNuZXkKK3I1bmljCityMW5pczQKK3IzbjJpdAorcjNuMml2Citybm80CityNG5vdTIKK3IzbnUKK3JvYjNsMgorcjJvYworcm8zY3IKK3JvNGUKK3JvMWZlCitybzVmaWwKK3JvMmZpCityMm9rMgorcm81azFlcgorNXJvbGUuCityb201ZTF0ZQorcm8ybWUKK3JvNG1ldAorcm9tNGkKK3JvNG00cAorcm9uNGFsCitybzJuCitybzFuMWEKK3JvbjRlCitybzVuNGlzCityb240dGEKK3JvbjF0Cisxcm9vbQorcm9vMgorNXJvb3QKK3JvM3BlbAorcm9wM2ljCityb3IzaQorcm81cm8KK3JvMnM1cGVyCitybzJzNHMKK3JvNHRoMmUKK3I0b3RoCitybzR0eQorcm80dmEKK3JvdjVlbAorcm94NQorcjFwCityNHBlNGEKK3I1cGVuMXQKK3JwNWVyLgorcjNwZTJ0CitycDRoNAorcnAzaW5nCitycGkybgorcjNwbworcjFyNAorcnJlNGMKK3JyZTRmCityNHJlMW8KK3JyZTRzMnQKK3JyMmk0bworcnIyaTR2Citycm8ybjQKK3Jyb3M0CitycnlzNAorNHJzMgorcjFzYTIKK3JzYTV0aQorcnM0YworcjJzZQorcjNzZWMKK3JzZTRjcgorcjRzNWVyLgorcnMzZTRzCityNXNlNXYyCityMXMyaAorcjVzaGEKK3Ixc2kKK3I0c2k0YgorcnNvMm4zCityMXNvCityMXNwCityNXN3MgorcnRhMmNoNAorcjF0YQorcjR0YWcKK3IzdDJlMWIKK3IzdGVuNGQKK3IxdGU1bworcjF0aQorcjJ0NWkyYgorcnQyaTRkCityNHRpZXIKK3J0MmllNAorcjN0MmlnCitydGlsM2kKK3J0aWw0bAorcjR0aTFseQorcjR0aXN0CityNHQyaXYKK3IzdHJpCitydHIyb3BoNAorcnQ0czJoNAorcjR0MXMyCitydTNhCitydTNlNGwKK3J1M2VuCitydTRnbDIKK3J1M2k0bgorcjJ1aTIKK3J1bTNwMmwyCitydTRtMnAKK3J1Mm4KK3J1NG5rNQorcnVuNHR5CitydW4xdAorcjV1c2MyCityMnVzCitydTJ0MWk1bgorcjR1MXQyaQorcnY0ZQorcnZlbDRpCityM3ZlbgorcnY1ZXIuCityNXZlc3QKK3J2NGUycworcjN2ZXkKK3IzdmljCityM3YyaTR2CityM3ZvCityMXcKK3J5NGMKKzVyeW5nZQorcnluNWcKK3J5M3QKK3NhMgorMnMxYWIKKzVzYWNrMQorc2FjM3JpMgorczNhMmMxdAorNXNhaTIKK3NhNGwyYTJyNAorczRhMmw0bQorc2E1bG8KK3NhNGw0dAorM3NhbmMKK3NhMm4KK3NhbjRkZQorczRhbmQKK3MxYXAKK3NhNXRhCis1c2EzdDJpbworc2EydDN1CitzYXU0CitzYTV2b3IKKzVzYXcKKzRzNWIKK3NjYW40dDUKK3MxY2EKK3NjYTJuCitzY2E0cAorc2NhdjUKK3M0Y2VkCis0czNjZWkyCitzNGNlcworczJjaDIKK3M0Y2hvMgorM3M0YzJpZTQKK3MxY2kKKzVzYzRpbjRkCitzMmNpbgorc2NsZTUKK3MxYzRsNAorczRjbGkKK3Njb2Y0CitzMWNvCis0c2NvcHk1CitzY291MXI1YQorc2NvdTIKK3MxY3UKKzRzNWQKKzRzZS4KK3NlNGEKK3NlYXM0CitzZWE1dworc2UyYzNvCiszc2UyYzF0Cis0czRlZAorc2U0ZDRlCitzNWVkbAorc2UyZworc2UxZzNyCis1c2VpMgorc2UxbGUKKzVzZTJsMmYKKzVzZWx2Cis0c2UxbWUKK3NlNG1vbAorc2UxbW8KK3NlbjVhdAorc2UxbmEKKzRzZW5jCitzZW40ZAorczVlMm5lZAorc2VuNWcKK3M1ZW4xaW4KKzRzZW40dDFkCitzZW4xdAorNHNlbjJ0bAorc2UycDNhMworNHMxZXIuCitzNGVyMWwKK3MyZXI0bworNHNlcjN2bworczFlNHMKK3M0ZTVzMmgKK3NlczV0Cis1c2U1dW0KK3M0ZXUKKzVzZXYKK3NldjNlbgorc2V3NGkyCis1c2V4Cis0czNmCisyczNnCitzMmgKKzJzaC4KK3NoMWVyCis1c2hldgorc2gxaW4KK3NoM2lvCiszc2gyaTRwCitzaDJpMnY1CitzaG80CitzaDVvMmwyZAorc2hvMm4zCitzaG9yNAorc2hvcnQ1Cis0c2gxdworc2kxYgorczVpYzNjCiszc2kyZGUuCitzMmlkCis1c2lkZTRzMgorNXNpMmRpCitzaTVkaXoKKzRzaWcxbjRhCitzMmlnCitzaWw0ZQorNHNpMWx5CisyczFpbgorczJpMW5hCis1c2kybmUuCitzMmluZQorczNpbmcKKzFzMmlvCis1c2lvMm4KK3NpbzFuNWEKK3M0aTJyCitzaTFyNWEKKzFzaXMKKzNzMmkxdDJpbworc2kxdGkKKzVzaTF1CisxczJpdgorNXNpegorc2syCis0c2tlCitzM2tldAorc2s1aW5lCitzazFpCitzazVpbjRnCitzMWwyCitzM2xhdAorczJsZQorc2wyaXRoNQorc2wxaXQKKzJzMW0KK3MzbWEKK3NtYWwxbDMKK3NtYTJuMworc21lbDQKK3M1bWVuCis1czRtMml0aAorc21vMmw1ZDQKK3MxbW8KK3MxbjQKKzFzbworc280Y2UKK3NvMmZ0Mworc280bGFiCitzbzFsYQorc28ybDNkMgorc28zbGljCitzb2wyaQorNXNvbDJ2Ciszc29tCiszczRvbi4KK3NvMm4KK3NvMW4xYTQKK3NvbjRnCitzNG9wCis1c29waDFpYworczJvcGgKK3M1bzNwaGl6CitzNW8xcGh5Citzb3I1Yworc29yNWQKKzRzb3YKK3NvNXZpCisyczFwYQorNXNwNGFpMgorc3BhNG4KK3NwZW40ZAorMnM1cGVvCisyc3BlcgorczJwaGUKKzNzcGg0ZXIKK3NwaG81CitzcGlsNAorc3A1aW5nCitzcGkybgorNHMzcDJpMW8KK3M0cDFseQorczFwMmwyCitzNHBvMm4KK3MxcDRvcjQKKzRzcDRvdAorc3F1YWw0bAorc3F1MgorczFyCisyc3MKK3Mxc2EyCitzc2FzMworczJzNWMKK3Mzc2VsCitzNXNlbjVnCitzNHNlcy4KK3NzMWU0cworczVzZXQKK3Mxc2kKK3M0czJpZTQKK3NzaTRlcgorczRzNWkxbHkKK3M0czFsMgorc3M0bGkKK3M0czFuNAorc3NwZW40ZDQKK3NzMnQKK3NzdTFyNWEKK3Mxc3UKK3NzdTJyCitzczV3MgorMnN0LgorczJ0YWcKK3MxdGEKK3MydGEybAorc3RhbTRpCis1c3Q0YW5kCitzdGEybgorczR0YTRwCis1c3RhdC4KK3M0dDFlZAorc3Rlcm41aQorczV0MmVybworc3RlMncKK3N0ZTF3NWEKK3MzdGgyZQorc3QyaQorczR0aS4KK3M1dDJpMWEKK3MxdGljCis1czR0aWNrMQorczR0MmllNAorczN0aWYyCitzdDNpbmcKK3MydDFpbgorNXN0NGlyCitzMXRsZQorczJ0bAorNXN0b2NrMQorczF0bworc3RvMm0zYQorNXN0b25lCitzdG8ybgorczR0b3AKKzNzdG9yZQorc3Q0cgorczR0cmEyZAorczF0cmEKKzVzdHJhMnR1CitzNHRyYXkKK3M0dHIyaWQKKzRzdHJ5Cis0c3QzdzQKK3MydHkKKzFzdQorc3UxYWwKK3N1NGIzCitzdTJnMworc3U1aXMKK3MydWkyCitzdWl0MworczR1bAorc3UybQorc3UxbTNpCitzdTJuCitzdTJyCis0c3YKK3N3MgorNHMxd28yCitzNHkKKzRzeTFjCiszc3lsCitzeW41bworc3k1cmluCisxdGEKKzN0YS4KKzJ0YWIKK3RhNWJsZXMyCit0YWIybDIKKzV0YWI1bzVsMWl6Cit0YWJvbDJpCis0dDRhMmNpCit0YTVkbwordGEyZAorNHRhMmY0Cit0YWk1bG8KK3RhaTIKK3RhMmwKK3RhNWxhCit0YWw1ZW4KK3QyYWxlCit0YWwzaQorNHRhbGsKK3RhbDRsaXMKK3RhbDFsCit0YWxsMmkKK3RhNWxvZwordGE1bW8KK3RhbjRkZQordGEybgordDRhbmQKKzF0YW4xdGEzCit0YW4xdAordGE1cGVyCit0YTVwMmwyCit0YXI0YQordDJhMnIKKzR0YXIxYworNHRhcmUKK3RhM3IyaXoKK3RhcjFpCit0YXM0ZQordGE1czR5Cis0dGF0MWljCit0YTR0dXIKK3RhMnR1Cit0YXVuNAordGF2NAorMnRhdwordGF4NGlzCit0YXgzaQorMnQxYgorNHRjCit0NGNoCit0Y2g1ZTR0Cit0Y2hlMgorNHQxZAorNHRlLgordGUyYWQ0aQordGVhMmQxCis0dGVhMnQKK3RlMWNlNAorNXRlMmMxdAorMnQxZWQKK3Q0ZTVkaQorMXRlZQordGVnNAordGU1Z2VyNAordGU1Z2kKKzN0ZWwuCit0ZWwyaTQKKzV0ZTJsMXMyCit0ZTJtYTIKK3RlbTNhdAorM3RlbjJhMm4KK3RlMW5hCiszdGVuYworM3RlbmQKKzR0ZTFuZXMKKzF0ZW4xdAordGVuNHRhZwordGVuMXRhCisxdGVvCit0ZTRwCit0ZTVwZQordGVyM2MKKzV0ZXIzZAorMXRlcjFpCit0ZXI1aWVzCit0ZXIyaWU0Cit0ZXIzaXMKK3Rlcmk1emExCis1dDRlcjNuMml0Cit0ZXI1dgorNHRlcy4KKzR0MmUyc3MKK3QzZXNzLgordGV0aDVlCiszdDRldQorM3RleAorNHRleQorMnQxZgorNHQxZworMnRoLgordGhhMm40Cit0aDJlCis0dGhlYQordGgzZWFzCit0aGU1YTJ0Cit0aGUzaXMKK3RoZWkyCiszdGhlNHQKK3RoNWljLgordGg1aTFjYQorNHRoNGlsMgorNXRoNGk0bmsyCis0dDRoMWw0Cit0aDVvZGUKKzV0aG9kM2ljCis0dGhvbzIKK3Rob3I1aXQKK3RobzVyaXoKKzJ0NGgxczIKKzF0MmkxYQordGk0YWIKK3RpNGExdG8KKzJ0aTJiCis0dGljazEKK3Q0aTFjbwordDRpYzF1Cis1dGkyZGkKK3QyaWQKKzN0aWVuCit0MmllNAordGlmMgordGk1ZnkKKzJ0MmlnCis1dGlndQordGlsMmw1aW40Cit0aWwxbAordGlsbDJpCisxdGltCis0dGk0bTFwCit0aW01dWwKK3RpMm11CisydDFpbgordDJpMW5hCiszdGkybmUuCit0MmluZQorM3QyaW5pCisxdDJpbwordGk1b2MKK3Rpb241ZWUKK3RpbzJuCis1dGlxCit0aTNzYTIKKzN0NGlzZQordGkyczRtCit0aTVzbwordGlzNHAKKzV0aXN0aTFjYQordGlzMXQyaQordGlzMXRpYwordGkzdGwKK3RpNHUKKzF0Mml2Cit0aTF2NGEKKzF0aXoKK3RpM3phMQordGkzemU0bgordGkyemUKKzJ0bAordDVsYQordGxhMm40CiszdGxlLgorM3RsZWQKKzN0bGVzLgordGxlczIKK3Q1bGV0LgordDVsbworNHQxbQordG1lNAorMnQxbjIKKzF0bwordG8zYgordG81Y3JhdAorNHRvMmRvNAorMnRvZgordG8yZ3IKK3RvNWljCit0b2kyCit0bzJtYQordG80bTRiCit0bzNteQordG9uNGE0bDFpCit0bzJuCit0bzFuMWEKK3RvM24yYXQKKzR0b25vCis0dG9ueQordG8ycmEKK3RvM3IyaWU0Cit0b3I1aXoKK3RvczIKKzV0b3VyCit0b3UyCis0dG91dAordG8zdzJhMnIKKzR0MXAKKzF0cmEKK3QycmEzYgordHJhNWNoCit0cjRhMmNpNAordHJhMmM0aXQKK3RyYWM0dGUKK3RyYTJjMXQKK3RyMmFzNAordHJhNXZlbgordHJhdjVlMnM1Cit0cmU1ZgordHJlNG0KK3RyZW01aQorNXRyMmkzYQordHJpNWNlcwordHI0aWNlCis1dHJpM2MyaTFhCit0NHIyaTFjaQorNHRyaTRjM3MyCisydHJpbQordHIyaTR2Cit0cm81bTRpCit0cm9uNWkKK3RybzJuCis0dHJvbnkKK3RybzVwaGUKK3RyMm9waAordHJvM3NwCit0cm8zdgordHIydTVpMgordHIydXM0Cis0dDFzMgordDRzYwordHMyaDQKK3Q0c3cyCis0dDN0MgordDR0ZXMKK3Q1dG8KK3QxdHU0CisxdHUKK3R1MWEKK3R1M2EycgordHU0YjRpCit0dWQyCis0dHVlCis0dHVmNAorNXQydTNpMgorM3R1bQordHU0bmlzCit0dTFuaQorMnQzdXAuCiszdHVyZQorNXR1cmkKK3R1cjNpcwordHVyNW8KK3R1NXJ5CiszdDJ1cworNHR2Cit0dzQKKzR0MXdhCit0d2lzNAordHdpMgorNHQxd28yCisxdHkKKzR0eWEKKzJ0eWwKK3R5cGUzCit0eTVwaAorNHR6Cit0Mno0ZQorNHVhYgordWFjNAordWE1bmEKK3VhMm4KK3VhbjRpCit1YXI1YW4xdAordTJhMnIKK3VhcmEybgordWFyMmQKK3VhcjNpCit1YXIzdAordTFhdAordWF2NAordWI0ZQordTRiZWwKK3UzYmVyCit1NGIyZXJvCit1MWI0aQordTRiNWluZwordTNiNGxlLgordWIybDIKK3UzY2EKK3VjaTRiCit1MWNpCit1MmM0aXQKK3VjbGUzCit1MWM0bDQKK3UzY3IKK3UzY3UKK3U0Y3kKK3VkNWQ0Cit1ZDNlcgordWQ1ZXN0Cit1ZGVzMgordWRlMXY0Cit1MWRpYwordWQzaWVkCit1ZDJpZTQKK3VkM2llcwordWQ1aXMxCit1NWRpdAordTRkbzJuCit1MWRvCit1ZDRzaQordTJkMXMyCit1NGR1Cit1NGVuZQordWUybjFzNAordWVuNHRlCit1ZW4xdAordWVyNGlsCit1ZXIxaQorM3UxZmEKK3UzZjRsMgordWdoM2UybgordWc1aW4KKzJ1aTIKK3VpbDVpegordWlsMWkKK3VpNG4KK3UxaW5nCit1aXI0bQordTRpcgordWkxdGE0Cit1Mml2MwordWk0djRlci4KK3U1agorNHVrCit1MWxhCit1bGE1YgordTVsYXRpCit1bDJjaDQKK3U0bDFjMgorNXVsY2hlMgordWwzZGVyCit1MmxkCit1bDJkZQordWw0ZQordTFsZW4KK3VsNGdpCit1NGwxZzQKK3VsMmkKK3U1bDJpMWEKK3VsM2luZwordWw1aXMyaAordWw0bDJhMnIKK3VsMWwKK3VsNGxpNGIKK3VsbDJpCit1bDRsaXMKKzR1MmwzbQordTFsNG8KKzR1MmwxczIKK3VsczVlNHMKK3VsMnNlCit1bDF0aQordTRsdAordWwxdHJhMwordWwxdHIKKzR1bDF0dTIKK3UzbHUKK3VsNXVsCit1bDV2Cit1Mm01YWIKK3UxbWEKK3VtNGJpCit1NG0xYgordW00YjFseQordW1iMmwyCit1MW1pCit1NG0zaW5nCit1bW9yNW8KK3UxbW8KK3VtbzJyCit1NG0ycAordW4yYXQ0Cit1MW5hCit1Mm5lCit1bjRlcgordTFuaQordW40aW0KK3UybjFpbgordW41aXMyaAordW4yaTN2Cit1Mm4zczQKK3VuNHN3MgordW4ydDNhNGIKK3VuMXQKK3VuMXRhCit1bjR0ZXIuCit1bjR0ZXMKK3VudTQKK3VuNXkKK3U0bjV6Cit1NG80cnMyCit1NW9zCit1MW91MgordTFwZQordXBlNHI1czIKK3U1cDJpM2EKK3VwM2luZwordXBpMm4KK3UzcDJsMgordTRwM3AKK3VwcG9ydDUKK3VwMXA0b3IKK3VwMnQ1aTJiCit1MnAxdAordXAxdHU0Cit1MXJhCis0dXJhLgordTRyYWcKK3U0cjJhcwordXI0YmUKK3VyMWIKK3VyMWM0Cit1cjFkCit1cmU1YTJ0Cit1cjRmZXIxCit1cjFmCit1cjRmcgordTNyaWYKK3VyaTRmaWMKK3VyaTFmaQordXIxaW4KK3UzcjJpMW8KK3Uxcml0Cit1cjNpegordXIybAordXJsNWluZy4KK3VyNG5vNAordXJvczQKK3VyNHBlCit1cjFwCit1cjRwaQordXJzNWVyCit1NHJzMgordXIyc2UKK3VyNXRlcwordXIzdGgyZQordXIxdGk0Cit1cjR0MmllNAordTNydQorMnVzCit1NXNhMmQKK3VzYTIKK3U1c2EybgordXM0YXAKK3VzYzIKK3VzM2NpCit1c2U1YQordTVzMmkxYQordTNzaWMKK3VzNGxpbgordXMxbDIKK3VzMXAKK3VzNXMxbDIKK3Uyc3MKK3VzNXRlcmUKK3VzMXQ0cgordTJzdQordXN1MnI0Cit1MnRhNGIKK3UxdGEKK3UzdGF0Cis0dTR0ZS4KKzR1dGVsCis0dXRlbgordXRlbjRpCis0dTF0MmkKK3V0aTVsMml6Cit1dGlsMWkKK3UzdDJpbmUKK3UydDFpbgordXQzaW5nCit1dGlvMW41YQordTF0MmlvCit1dGlvMm4KK3U0dGlzCis1dTV0aXoKK3U0dDFsCit1MnQ1b2YKK3UxdG8KK3V0bzVnCit1dG81bWF0MWljCit1dG8ybWEKK3U1dG8ybgordTR0b3UyCit1NHQxczQKK3UzdQordXU0bQordTF2MgordXgxdTMKK3UyejRlCisxdmEKKzV2YS4KKzJ2MWE0YgordmFjNWlsCit2NGEyY2kKK3ZhYzN1Cit2YWc0Cit2YTRnZQordmE1bDJpNGU0Cit2YWwxaQordmFsNW8KK3ZhbDF1Cit2YTVtbwordmE1bml6Cit2YTJuCit2YTVwaQordmFyNWllZAordjJhMnIKK3ZhcjFpCit2YXIyaWU0CiszdmF0Cis0dmUuCis0dmVkCit2ZWczCit2M2VsLgordmVsM2wyaQordmVsMWwKK3ZlNGxvCit2NGUxbHkKK3ZlbjNvbQordjRlbm8KK3Y1ZW51ZQordjRlcmQKKzV2MmUycmUuCit2NGVyZWwKK3YzZXJlbgordmVyNWVuYwordjRlcmVzCit2ZXIzaWU0Cit2ZXIxaQordmVybWk0bgordmVyM200CiszdmVyMnNlCit2ZTRyMXMyCit2ZXIzdGgKK3Y0ZTJzCis0dmVzLgordmVzNHRlCit2ZTR0ZQordmV0M2VyCit2ZTR0eQordmk1YWwxaQordjJpMWEKK3ZpMmFsCis1dmkyYTJuCis1dmkyZGUuCit2MmlkCis1dmkyZDFlZAorNHYzaTFkZW4KKzV2aWRlNHMyCis1dmkyZGkKK3YzaWYKK3ZpNWduCit2MmlnCit2NGlrNAorMnZpbAorNXYyaWwxaXQKK3ZpbDFpCit2M2kzbDJpegordjFpbgorNHZpNG5hCit2MmluYwordjRpbjVkCis0dmluZwordmkxbzNsCit2MmlvCit2M2lvNHIKK3ZpMW91MgordjJpNHAKK3ZpNXJvCit2NGlyCit2aXMzaXQKK3ZpM3NvCit2aTNzdQorNHZpMXRpCit2aXQzcgorNHZpMXR5CiszdjJpdgorNXZvLgordm9pNAorM3Yyb2sKK3ZvNGxhCit2NW9sZQorNXZvNGwydAorM3ZvbDJ2Cit2b201aQordm8ycjVhYgordm8xcmEKK3Zvcmk0Cit2bzRyeQordm80dGEKKzR2bzF0ZWUKKzR2djQKK3Y0eQordzVhYjJsMgorMndhYword2E1Z2VyCit3YTJnNW8KK3dhaXQ1Cit3YWkyCit3NWFsLgord2FtNAord2FyNHQKK3cyYTJyCit3YXM0dAord2ExdGUKK3dhNXZlcgordzFiCit3ZWE1cjJpZTQKK3dlMmEycgord2VhcjFpCit3ZTRhdGgzCit3ZWEydAord2U0ZDRuNAord2VldDMKK3dlZTV2Cit3ZWw0bAordzFlcgord2VzdDMKK3czZXYKK3doaTQKK3dpMgord2lsMgord2lsMmw1aW40Cit3aWwxbAord2lsbDJpCit3aW40ZGUKK3c0aW5kCit3aW40ZwordzRpcjQKKzN3NGlzZQordzJpdGgzCit3aXo1Cit3NGsKK3dsNGVzMgord2wzaW4KK3c0bm8KKzF3bzIKK3dvbTEKK3dvNXY0ZW4KK3c1cAord3JhNAord3JpNAord3JpMXRhNAordzNzMmgKK3dzNGwyCit3czRwZQordzVzNHQKKzR3dAord3k0Cit4MWEKK3hhYzVlCit4NGEyZ28KK3hhbTMKK3g0YXAKK3hhczUKK3gzYzIKK3gxZQoreGU0Y3UxdG8KK3hlMWN1Cit4ZTNjNHV0Cit4MmVkCit4ZXI0aQoreDJlNXJvCit4MWgKK3hoaTIKK3hoNGlsNQoreGh1NAoreDNpCit4Mmk1YQoreGk1YworeGk1ZGkKK3gyaWQKK3g0aW1lCit4aTVtMml6Cit4aW0xaQoreDNvCit4NG9iCit4M3AKK3hwNGFuNGQKK3gxcGEKK3hwYTJuCit4cGVjMXRvNQoreHBlMmMKK3hwZTJjMXQKK3gycDJlM2QKK3gxdDIKK3gzdGkKK3gxdQoreHUzYQoreHg0Cit5NWFjCiszeTJhMnI0Cit5NWF0Cit5MWIKK3kxYworeTJjZQoreWM1ZXIKK3kzY2gKK3ljaDRlMgoreWNvbTQKK3kxY28KK3ljb3Q0Cit5MWQKK3k1ZWUKK3kxZXIKK3k0ZXIxZgoreWVzNAoreWU0dAoreTVnaQorNHkzaAoreTFpCit5M2xhCit5bGxhNWIybDIKK3lsMWwKK3kzbG8KK3k1bHUKK3ltYm9sNQoreTRtMWIKK3ltZTQKK3ltMXBhMworeTRtMXAKK3luM2M0aHI0Cit5bjJjaAoreW41ZAoreW41ZworeW41aWMKKzV5bngKK3kxbzQKK3lvNWQKK3k0bzVnCit5b200Cit5bzVuZXQKK3lvMm4KK3k0bzJuM3MyCit5NG9zCit5NHAyZWQKK3lwZXI1Cit5cDNpCit5M3BvCit5NHBvNGMKK3lwMnRhCit5MnAxdAoreTVwdQoreXJhNW0KK3lyNWkzYQoreTNybworeXI0cjQKK3lzNGMKK3kzczJlCit5czNpMWNhCit5MXMzaW8KKzN5MXNpcworeTRzbworeTJzczQKK3lzMXQKK3lzM3RhCit5c3UycjQKK3kxc3UKK3kzdGhpbgoreXQzaWMKK3kxdworemExCit6NWEyYgorejJhMnIyCis0emIKKzJ6ZQoremU0bgoremU0cAorejFlcgorejJlM3JvCit6ZXQ0CisyejFpCit6NGlsCit6NGlzCis1emwKKzR6bQorMXpvCit6bzRtCit6bzVvbAorem9vMgorenRlNAorNHoxejIKK3o0enkKKy5hczlzOG85YzhpOGE4dGUuCisuYXMxc28KKy5hc3NvMWNpCisuYXNzbzNjMmkxYQorLmFzOXM4bzljOGk4YTh0OGVzLgorLmRlOGM5bDhpOW44YTl0OGk4b24uCisuZGUxYzRsNAorLmRlY2w0aTFuYQorLmRlY2xpbjJhdAorLmRlY2xpbmExdDJpbworLmRlY2xpbmF0aW8ybgorLm9iOGw4aThnOWE5dDhvOHJ5LgorLm9iMmwyCisub2JsMmlnCisub2JsaTFnYQorLm9ibGlnYTF0bworLm9ibGlnYXRvMXJ5CisucGg4aThsOWE4bjl0OGg4cjhvOHA4aWMuCisucGg0aWwyCisucGhpMWxhCisucGhpbGEybgorLnBoaWxhbjF0CisucGhpbGFudDRocjQKKy5waGlsYW50aHJvcDNpYworLnByOGU4czhlOG50LgorLnAzcmUxczJlCisucHJlc2VuMXQKKy5wcjhlOHM4ZThuOHRzLgorLnByZXNlbjR0NHMyCisucHI4bzhqOGU4Y3QuCisucHJvNWoKKy5wcm8xamUKKy5wcm9qZTJjMXQKKy5wcjhvOGo4ZThjOHRzLgorLnByb2plYzR0MXMyCisucmU4YzlpOXA4cjhvOGM5aTl0OHkuCisucmUxYzJpCisucmVjMmlwCisucmVjaXByMgorLnJlY2lwcjJvYworLnJlMWNpcHJvMWNpCisucmVjaXBybzJjMWl0CisucmVjaXByb2NpMXR5CisucmU5YzhvOGc5bjhpOXo4YThuOGNlLgorLnJlMWNvCisucmUyY29nCisucmVjM29nbml6CisucmVjb2cxbmkKKy5yZWNvZ25pemExCisucmVjb2duaXphMm4KKy5yZThmOW84cjltOGE5dDhpOG9uLgorLnJlMWYKKy5yZTFmbworLnJlZm8ycgorLnJlZm9yMW0KKy5yZWZvcjFtYQorLnJlZm9ybWExdDJpbworLnJlZm9ybWF0aW8ybgorLnJlOHQ5cjhpOWI4dTl0OGk4b24uCisucmUzdHJpCisucmV0cjRpYgorLnJldHJpM2J1MXQyaW8KKy5yZXRyaWI0dTF0MmkKKy5yZXRyaWJ1dGlvMm4KKy50YTliOGxlLgorLjJ0YWIKKy50YWIybDIKKy5hYzhhOGQ5ZTltOHkuCisuYTFjYQorLmFjYTJkCisuYWNhZDRlbQorLmFjYWRlM215CisuYWM4YThkOWU5bThpOGU4cy4KKy5hY2FkZW0yaTRlNAorLmFjOWM4dTlzOGE5dDhpOHY4ZS4KKy5hYzNjCisuYWMxYzJ1cworLmFjY3VzYTIKKy5hY2N1c2ExdDJpdgorLmFjOHI4bzluOHk4bS4KKy5hY3JvMm4KKy5hY3JvbnltNAorLmFjOHI4eThsOWE4bThpOGQ4ZS4KKy5hY3J5M2xhCisuYWNyeWxhbTJpZAorLmFjOHI4eThsOWE4bThpOGQ4ZThzLgorLmFjcnlsYW1pZGU0czIKKy5hYzhyOHk4bDlhOGw4ZDhlOWg4eThkOGUuCisuYWNyeWxhMmxkCisuYWNyeWxhbDJkZQorLmFjcnlsYWxkZTFoNAorLmFjcnlsYWxkZWh5MWQKKy5hZDhkOWE5YjhsOGUuCisuYWQxZDJhCisuYWQyZDNhNGIKKy5hZGRhYjJsMgorLmFkOGQ5aTliOGw4ZS4KKy5hZGRpMWIybDIKKy5hZDhyOGU4bjlhOWw4aThuOGUuCisuYTFkcgorLmFkcmU0CisuYTVkcmVuCisuYWRyZTFuYQorLmFkcmVuYTRsMWkKKy5hZHJlbmExbDRpbmUKKy5hZThyOG85czhwOGE4YzhlLgorLmFlNHIKKy5hMmVybworLmFlcm8yczRwYQorLmFlcm9zcGE0Y2UKKy5hZjl0OGU4cjl0OGg4bzh1OGc4aDh0LgorLmFmdGVydGhvdTIKKy5hZjl0OGU4cjl0OGg4bzh1OGc4aDh0OHMuCisuYWZ0ZXJ0aG91Z2g0dDFzMgorLmFnOHI4bzhuOW85bThpOHM4dC4KKy5hMWdyCisuYWc0cm8KKy5hZ3JvMm4KKy5hZ3Jvbm9tMmlzCisuYWc4cjhvOG45bzltOGk4czh0OHMuCisuYWdyb25vbWlzNHQxczIKKy5hbDlnOGU5YjhyOGE5aTljOGE4bDlsOHkuCisuYTRsMWc0CisuYWxnMmUxYgorLmFsZ2UzYnIKKy5hbGdlYnIyYWkyCisuYWxnZWJyYWkxY2EKKy5hbGdlYnJhaWNhbDFsCisuYWxnZWJyYWljYWwxbHkKKy5hbTlwOGg4ZTh0OWE5bThpOG44ZS4KKy5hNG0xcAorLmFtcGhlNHQKKy5hbXBoZTF0YQorLmFtcGhldGFtMWluCisuYW1waGV0YW0yaW5lCisuYW05cDhoOGU4dDlhOW04aThuOGU4cy4KKy5hbXBoZXRhbWkxbmVzCisuYW45YTlsOHk4czhlLgorLjNhbmExbHkKKy5hMW5hCisuYW40YTJseXM0CisuYW5hbDV5M3MyZQorLmFuOWE5bDh5OHM4ZThkLgorLmFuYWx5NHM0ZWQKKy5hbjhhOGw4eTlzOGU4cy4KKy5hbmFseXMxZTRzCisuYW45aThzOG85dDhyOG84cDlpOGMuCisuYW5pMnNvCisuYW5pc290cm9wM2ljCisuYW45aThzOG85dDhyOG84cDlpOWM4YThsOWw4eS4KKy5hbmlzb3Ryb3BpMWNhCisuYW5pc290cm9waWNhbDFsCisuYW5pc290cm9waWNhbDFseQorLmFuOWk4czhvOHQ5cjhvOXA4aThzOG0uCisuYW5pc290cm9waTJzMW0KKy5hbjlpOHM4bzh0OXI4bzhwOHkuCisuYW5pc290cm9weTUKKy5hbjhvOG05YThsOHkuCisuYW5vNAorLmFub21hNWwKKy5hbm8xbWEKKy5hbm9tYTFseQorLmFuOG84bTlhOGw4aThlOHMuCisuYW5vbWFsMWkKKy5hbm9tYWwyaTRlNAorLmFuOHQ4aTlkOGU4cjhpOHY5YTl0OGk4djhlLgorLmFudDJpZAorLmFudGlkZXIxaQorLmFudGlkZXIyaTR2CisuYW50aWRlNHJpMXZhCisuYW50aWRlcmkzdmF0CisuYW50aWRlcjJpdmExdDJpdgorLmFuOHQ4aTlkOGU4cjhpOHY5YTl0OGk4djhlOHMuCisuYW50aWRlcml2YXRpdjRlMnMKKy5hbjh0OGk5aDhvOGw4bzltOG84cjlwOGg4aThjLgorLmFudGkzaAorLmFudGlob2xvMW1vCisuYW50aWhvbG9tbzJyCisuYW50aWhvbG9tb3IxcAorLmFudGlob2xvbW9ycDRoNAorLmFudGlob2xvbW9ycGgxaWMKKy5hbjl0OGk4bjlvOW04eS4KKy5hbjJ0MWluCisuYW50Mmkxbm8KKy5hbnRpbm8zbXkKKy5hbjl0OGk4bjlvOW04aThlOHMuCisuYW50aW5vbTJpZTQKKy5hbjl0OGk5bjh1OWM4bDhlOGE4ci4KKy5hbnRpbjF1CisuYW50aW51Y2xlMworLmFudGludTFjNGw0CisuYW50aW51Y2xlMmEKKy5hbnRpbnVjbGUyYTJyCisuYW45dDhpOW44dTljOGw4ZTlvOG4uCisuYW50aW51Y2xlbzJuCisuYW45dDhpOXI4ZTh2OW85bDh1OXQ4aThvOG45YThyOHkuCisuYW50NGlyCisuYW50aXJldjIKKy5hbnRpcmV2NW9sdQorLmFudGlyZXZvMWx1dAorLmFudGlyZXZvbDR1MXQyaQorLmFudGlyZXZvbHV0aW8xbjVhCisuYW50aXJldm9sdTF0MmlvCisuYW50aXJldm9sdXRpbzJuCisuYW50aXJldm9sdXRpb24yYTJyCisuYXA4bzh0OGg5ZTlvOXM4ZThzLgorLmFwNG90CisuYXA0b3RoCisuYXBvdGgyZQorLmFwb3RoZW9zNAorLmFwb3RoZW9zMWU0cworLmFwOG84dDhoOWU5bzlzOGk4cy4KKy5hcG90aGVvMXNpcworLmFwOXA4ZThuOWQ4aTh4LgorLmE0cDFwCisuYXAycGUKKy5hcDNwZW4KKy5hcjljOGg4aTltOGU5ZDhlOGE4bi4KKy5hcjFjCisuYXIyY2gKKy5hcmNoaTJtZWQKKy5hcmNoaW1lZGVhMm4KKy5hcjljOGg4aTlwOGU4bDlhOGc4by4KKy5hcmNoMmk0cAorLmFyY2hpcGU0CisuYXJjaGlwZTRsYQorLmFyY2hpcGVsYTJnbworLmFyOWM4aDhpOXA4ZThsOWE5ZzhvOHMuCisuYXI5YzhoOGk4djhlLgorLmFyY2gyaTJ2CisuYXI5YzhoOGk4djhlOHMuCisuYXJjaGl2NGUycworLmFyOWM4aDhpOHY5aThuOGcuCisuYXJjaGl2MWluCisuYXJjaGk0dmluZworLmFyOWM4aDhpOHY5aThzOHQuCisuYXI5YzhoOGk4djlpOHM4dDhzLgorLmFyY2hpdmlzNHQxczIKKy5hcjljOGg4ZTl0OHk4cDlhOGwuCisuYXJjaGUyCisuYXJjaGU0dAorLmFyY2hlMXR5CisuYXJjaGV0eTFwYQorLmFyY2hldHlwNGFsCisuYXI5YzhoOGU5dDh5OHA5aTljOGE4bC4KKy5hcmNoZXR5cDNpCisuYXJjaGV0eXBpMWNhCisuYXI4Yzl0OGE4bjlnOGU4bjh0LgorLmFyMmMxdAorLmFyY3Q1YW5nCisuYXJjMXRhCisuYXJjdGEybgorLmFyY3RhbjFnZW4KKy5hcmN0YW5nZW4xdAorLmFyOGM5dDhhOG45ZzhlOG44dDhzLgorLmFyY3RhbmdlbjR0NHMyCisuYXM5czhpOGc4bjlhOWI4bDhlLgorLmFzMXNpCisuYXM0c2lnMW40YQorLmFzczJpZworLmFzc2lnMm4xYTJiCisuYXNzaWduYWIybDIKKy5hczlzOGk4ZzhuOW84ci4KKy5hc3NpZzFubworLmFzOXM4aThnOG45bzhyOHMuCisuYXNzaWdubzRyczIKKy5hczlzOGk4czh0OWE4bjh0OXM4aDhpOHAuCisuYXMxc2lzCisuYXNzaXMxdGEKKy5hc3Npc3RhMm4KKy5hc3Npc3RhbjF0CisuYXNzaXN0YW40dDRzMgorLmFzc2lzdGFudHMyaDQKKy5hc3Npc3RhbnQzc2gyaTRwCisuYXM5czhpOHM4dDlhOG44dDlzOGg4aThwOHMuCisuYXNzaXN0YW50c2hpMnAxczIKKy5hczh5OG04cDl0OG85bThhOHQ4aThjLgorLmFzNHkKKy5hc3k0bTFwCisuYXN5bTJwMXQKKy5hc3ltcDF0bworLmFzeW1wdG8ybWEKKy5hc3ltcHRvbWF0MWljCisuYXM5eThtOHA5dDhvOHQ5aThjLgorLmFzOHk4bjljOGg4cjhvOW44bzh1OHMuCisuYXN5bjNjNGhyNAorLmFzeW4yY2gKKy5hc3luY2hybzJuCisuYXN5bmNocm8xbm91MgorLmFzeW5jaHJvbm8ydXMKKy5hdDhoOWU4cjlvOXM4YzhsOGU5cjhvOXM4aThzLgorLjRhdGgKKy5hdGgyZQorLmF0aDJlcm8KKy5hdGhlcm9zMmMKKy5hdGhlcm9zY2xlNQorLmF0aGVyb3MxYzRsNAorLmF0aDJlcm9zY2w0ZXJvCisuYXRoZXJvc2NsZXJvMXNpcworLmF0OW04bzhzOXA4aDhlOHI4ZS4KKy5hNHQxbQorLmF0MW1vCisuYXRtb3MyCisuYXRtbzNzcAorLmF0bW9zMnBoZQorLmF0bW8zc3BoNGVyCisuYXQ5bThvOHM5cDhoOGU4cjhlOHMuCisuYXQ5dDhyOGk4Yjl1OHQ4ZThkLgorLmE0dDN0MgorLmF0dHI0aWIKKy5hdHRyaWJ1MnQxZWQKKy5hdDl0OHI4aThiOXU4dDlhOGI4bDhlLgorLmF0dHJpNGJ1MXRhCisuYXR0cmlidTJ0YTRiCisuYXR0cmlidXRhYjJsMgorLmF1OXQ4bzltOGE5dDhpOG84bi4KKy5hdTF0bworLmF1dG8ybWEKKy5hdXRvbWExdDJpbworLmF1dG9tYXRpbzJuCisuYXU5dDhvOG05YTl0OG84bi4KKy5hdXRvbWExdG8KKy5hdXRvbWF0bzJuCisuYXU5dDhvOG05YTl0OGEuCisuYXV0b21hMnRhCisuYXU5dDhvOW44dThtOWI4ZThyOWk4bjhnLgorLmF1NXRvMm4KKy5hdXRvbjV1bQorLmF1dG9udTRtMWIKKy5hdXRvbnVtYmVyMWkKKy5hdXRvbnVtYmVyaW40ZworLmF1OXQ4bzhuOW85bThvOHU4cy4KKy5hdTR0b25vCisuYXV0b25vNG1vCisuYXV0b25vM21vMnVzCisuYXV0b25vbW91MgorLmF1OHQ4bzlyOG84dThuOGQ5aThuOGcuCisuYXV0b3JvdTIKKy5hdXRvcm91bjJkCisuYXV0b3JvdW5kMWluCisuYXY5bzhpOHI5ZDh1OXA4bzhpOHMuCisuYXZvaTQKKy5hdm80aXIKKy5hdm9pcjFkdQorLmF2b2lyNGR1cAorLmF2b2lyZHVwb2kyCisuYmE4bjhkOWw4ZThhOGQ4ZThyLgorLmI0YW5kCisuYmFuMWRsCisuYmFuZGxlMmEKKy5iYW5kbGVhMmQxCisuYmE4bjhkOWw4ZThhOGQ4ZThyOHMuCisuYmFuZGxlYWRlNHI1czIKKy5iYThuOGs5cjh1OHA4dC4KKy5iYTRuazIKKy5iYW5rcnUycDF0CisuYmE4bjhrOXI4dThwOHQ5Yzh5LgorLmJhbmtydXA0dGMKKy5iYW5rcnVwdDFjeQorLmJhOG44azlyOHU4cDh0OWM4aThlOHMuCisuYmFua3J1cHQxY2kKKy5iYW5rcnVwdGMyaWU0CisuYmE4cjlvOG44aThlOHMuCisuYjJhMnIKKy5iYTVyb25pCisuYmFybzJuCisuYmFyb24yaWU0CisuYmE4czhlOWw4aThuOGU5czhrOGk4cC4KKy5iYXNlbDJpCisuYmFzZTFsNGluZQorLmJhc2VsaTFuZXMKKy5iYXNlbGluZXNrMgorLmJhc2VsaW5lc2sxaQorLmJhc2VsaW5lc2syaTRwCisuYmE5dDhoOHk4bTllOXQ4cjh5LgorLjFiYXQKKy5iNGF0aAorLmJhdGh5bWU0CisuYmF0aHltNGV0cgorLmJhdGh5bWUzdHJ5CisuYmE4dDhoOHk5czhjOGE4cDhoOGUuCisuYmF0aHkycworLmJhdGh5czRjCisuYmF0aHlzY2E0cAorLmJhdGh5czFjYQorLmJlOGE4bjlpOGU4cy4KKy5iZWEybgorLmJlYTNuaWVzCisuYmVhbjJpZTQKKy5iZTloOGE4djlpOG84dThyLgorLmJlMWg0CisuYmVoYXYxaQorLmJlaGF2aTFvdTIKKy5iZWhhdjJpbworLmJlaGF2aTRvdXIKKy5iZTloOGE4djlpOG84dThyOHMuCisuYmVoYXZpb3U0cnMyCisuYmU4djhpOGU4cy4KKy5iZTF2aQorLmJldjJpZTQKKy5iaThiOWw4aTlvOGc5cjhhOXA4aDh5OXM4dDh5OGw4ZS4KKy5iaTJiCisuYmkxYjJsMgorLmJpYjNsaQorLmJpYmxpNW9nCisuYmlibDJpbworLmJpYmxpbzJncgorLmJpYmxpbzRnM3JhMXBoeQorLmJpYmxpb2dyYXBoeTJzCisuYmlibGlvZ3JhcGh5czF0CisuYmlibGlvZ3JhcGh5czJ0eQorLmJpYmxpb2dyYXBoeXMydHlsCisuYmk5ZDhpOGY5ZjhlOHI5ZThuOXQ4aThhOGwuCisuYjJpNGQKKy5iaTJkaQorLmJpZDFpZgorLmJpZGk0ZjFmCisuYmlkaWZmZXIxCisuYmlkaWZmZXIzZW4xdAorLmJpZGlmZmVyZW50MmkKKy5iaWRpZmZlcmVuMXQyaTFhCisuYmlkaWZmZXJlbnRpMmFsCisuYmk4ZzlnOGU4czh0LgorLmIyaWcKKy5iaTRnMWcyCisuYmlnMmdlCisuYmk4bDhsOWE4YjhsOGUuCisuMWJpbAorLmJpbGw1YWIKKy5iaWwxbAorLmJpbGxhYjJsMgorLmJpOG85bThhOHQ4aDllOW04YTh0OWk4YzhzLgorLmIyaW8KKy5iaW80bQorLmJpbzFtYQorLmJpb200YXRoMworLmJpb21hdGg1ZW0KKy5iaW9tYXRoMmUKKy5iaW9tYXRoZTFtYQorLmJpb21hdGhlbWF0MWljCisuYmlvbWF0aGVtYXRpNGMzczIKKy5iaThvOW04ZThkOWk5YzhhOGwuCisuYmlvMm1lCisuYmlvMm1lZAorLmJpb200ZWRpCisuYmlvbWVkM2kxY2EKKy5iaThvOW04ZThkOWk5YzhpOG44ZS4KKy5iaW9tZWQyaTFjaQorLmJpb21lZGkyY2luCisuYmlvbWVkaWMyaW5lCisuYmk4bzlyOGg4eTh0OGg4bThzLgorLmJpb3JoNAorLmJpb3JoeXQ0aDFtCisuYmlvcmh5dGg0bTFzMgorLmJpOHQ5bThhOHAuCisuYmkydAorLmJpNHQxbQorLmJpdDFtYQorLmJpdDRtYXAKKy5iaTh0OW04YThwOHMuCisuYml0bWEycDFzMgorLmJsOGE4bjhkOWU4ci4KKy5iMmwyCisuYjNsNGFuZAorLmJsYTJuCisuYmxhbjFkZQorLmJsOGE4bjhkOWU4czh0LgorLmJsYW5kZTRzMgorLmJsOGk4bjhkOWU4ci4KKy5ibDRpbmQKKy5ibGluMWRlCisuYmw4bzhuOGQ4ZThzLgorLmI0bG8KKy5ibG8ybgorLmJsMm9uZAorLmJsb24xZGUKKy5ibG9uZGVzMgorLmJsOHU4ZTlwOHI4aThuOHQuCisuYmx1ZXByMgorLmJsdWVwcmluNHQzCisuYmw4dThlOXA4cjhpOG44dDhzLgorLmJsdWVwcmluNHQ0czIKKy5ibzlsOG84bTllOXQ4ZThyLgorLmJvbG8ybWUKKy5ib2xvNG1ldAorLmJvbG9tZTF0ZQorLmJvOG84azlzOGU4bDhsOWU4ci4KKy4zYm9vMgorLmJvMm80aworLmJvbzRrMXMyCisuYm9va3NlbDFsCisuYm9va3NlbDJsZQorLmJvOG84azlzOGU4bDhsOWU4cjhzLgorLmJvb2tzZWxsZTRyMXMyCisuYm84bzhsOWU4YThuLgorLmJvb2xlMmEKKy5ib29sZWEybgorLmJvOG84bDllOGE4bjhzLgorLmJvb2xlYTJuMXMyCisuYm84cjluOG85bDhvOGc5aTljOGE4bC4KKy5ib3JubzQKKy5ib3JubzNsb2cxaWMKKy5ib3Jub2xvZ2kxY2EKKy5ibzh0OXU5bDhpOHM4bS4KKy5ibzF0dQorLmJvdHVsMmkKKy5ib3R1bGkyczFtCisuYnI4dThzOHE4dThlOHIuCisuYnIydXMKKy5icnVzcXUyCisuYnJ1czNxdWVyCisuYnU4ZjlmOGU4ci4KKy5idWY0ZmVyMQorLmJ1NGYxZgorLmJ1OGY5ZjhlOHI4cy4KKy5idWZmZTRyMXMyCisuYnU4czhpOGU4ci4KKy5idXM1aWU0CisuYjJ1cworLmJ1OHM4aThlOHM4dC4KKy5idXNpMWVzdAorLmJ1OHM4czhpOG44Zy4KKy5idTJzcworLmJ1czFzaQorLmJ1czJzMWluCisuYnVzczNpbmcKKy5idTh0OHQ4ZThkLgorLmJ1dDJ0MWVkCisuYnU4ejh6OXc4bzhyOGQuCisuYnU0ejF6MgorLmJ1enoxd28yCisuYnU4ejh6OXc4bzhyOGQ4cy4KKy5idXp6d29yMmQxczIKKy5jYTljOG84cDhoOW85bjh5LgorLmNhMWNvCisuY2FjMm9waAorLmNhY29waG81bnkKKy5jYWNvcGhvMm4KKy5jYTljOG84cDhoOW85bjhpOGU4cy4KKy5jYWNvNXBob25pCisuY2Fjb3Bob24yaWU0CisuY2E4bDhsOWU4ci4KKy5jYWwxbAorLmNhbDJsZQorLmNhOGw4bDllOHI4cy4KKy5jYWxsZTRyMXMyCisuY2E4bTllOHI4YTltOGU4bi4KKy5jYW01ZXIxYQorLmNhbWVyYTFtZW4KKy5jYThyOHQ5dzhoOGU4ZThsLgorLmNhcnR3NAorLmNhOHI4dDl3OGg4ZThlOGw4cy4KKy5jYXJ0d2hlZTJsMXMyCisuY2E5dDhhOHI4cjhoOHMuCisuY2EydGEKKy5jYXQyYTJyCisuY2F0YXIxcjQKKy5jYXRhcnJoNAorLmNhdGFycjRoMXMyCisuY2E4dDlhOXM4dDhyOG84cDhoOWk4Yy4KKy5jYXRhczF0NHIKKy5jYXRhc3RyMm9waAorLmNhdGFzdHJvcGgxaWMKKy5jYTh0OWE5czh0OHI4bzhwOGg5aTljOGE4bDhsOHkuCisuY2F0YXN0cm9waGkxY2EKKy5jYXRhc3Ryb3BoaWNhbDFsCisuY2F0YXN0cm9waGljYWwxbHkKKy5jYTh0OWU5bjhvOGk4ZC4KKy5jYXQ0ZW5vCisuY2F0ZW5vaTIKKy5jYXRlbm8yaWQKKy5jYTh0OWU5bjhvOGk4ZDhzLgorLmNhdGVub2kyZDFzMgorLmNhOHU5bDhpOWY4bDhvOHc5ZThyLgorLmNhdTRsMgorLmNhdWwyaQorLmNhdWxpNGY0bDIKKy5jYXVsaWZsb3cxZXIKKy5jaDhhOHA5YThyOXI4YThsLgorLmNoYXAyYTJyNAorLmNoYTFwYQorLmNoYXBhcjFyNAorLmNoOGE4cjl0OHI4ZTh1OHM4ZS4KKy5jaDJhMnIKKy5jaGFydHI0ZXUyCisuY2hhcnRyZTJ1czQKKy5jaDhlOG04bzl0OGg4ZThyOWE4cDh5LgorLmNoZTIKKy5jaGUxbW8KKy5jaGVtNG90aDMKKy5jaGVtb3RoMmUKKy5jaGVtb3RoNGVyMWEKKy5jaGVtb3RoZXJhM3AKKy5jaDhlOG04bzl0OGg4ZThyOWE5cDhpOGU4cy4KKy5jaGVtb3RoZXJhcDJpZTQKKy5jaDhsOG84cjhvOW04ZTh0OGg5YThuOGUuCisuYzRoMWw0CisuY2gybG8KKy5jaGxvcm8ybWUKKy5jaGxvcm80bWV0CisuY2hsb3JvbWV0aGEybjQKKy5jaDhsOG84cjhvOW04ZTh0OGg5YThuOGU4cy4KKy5jaGxvcm9tZXRoYTFuZXMKKy5jaDhvOWw4ZThzOXQ4ZThyOGk4Yy4KKy4zY2hvMgorLmMzaG9sNGUKKy5jaG9sZXMyCisuY2hvbGVzMXRlcjFpCisuY2k4ZzlhOXI4ZTh0OHQ4ZS4KKy5jMmlnCisuY2kxZ2EKKy5jaWcyYTJyCisuY2lnYXJlNHQzdDIKKy5jaThnOWE5cjhlOHQ4dDhlOHMuCisuY2lnYXJldDR0ZXMKKy5jaThuOHE4dThlOWY4bzhpOGwuCisuMmNpbgorLmNpbjFxCisuY2lucXUyCisuY2lucXVlMWYKKy5jaW5xdWUxZm8KKy5jaW5xdWVmb2kyCisuY285YThzOHM4bzljOGk4YTl0OGk4djhlLgorLmM0b2EKKy5jb2Eyc3MKKy5jb2FzMXNvCisuY29hc3NvMWNpCisuY29hc3NvM2MyaTFhCisuY29hc3NvY2k0YTF0Mml2CisuY285ZzhuOGE4Yy4KKy4yY29nCisuY29nMW40YQorLmNvOWc4bjhhOGM4cy4KKy5jb2duYTRjM3MyCisuY285azhlOHI5bjhlOGwuCisuYzJvaworLmNvazFlcgorLmNva2VyM25lbAorLmNvOWs4ZThyOW44ZThsOHMuCisuY29rZXJuZTJsMXMyCisuY284bDlsOGk4bjllOGE5dDhpOG84bi4KKy5jb2wxbAorLmNvbGwyaQorLmNvbDJsaW40CisuY29sMWw0aW5lCisuY29sbGluM2VhCisuY29sbGluZWEydAorLmNvbGxpbmVhMXQyaW8KKy5jb2xsaW5lYXRpbzJuCisuY284bDl1OG04bjhzLgorLmNvbHU0bTFuCisuY29sdW0ybjFzMgorLmNvOG05cDhhOHI5YThuOGQuCisuY280bTFwCisuY29tcGFyYTUKKy5jb20xcGEKKy5jb21wMmEycgorLmNvbXBhcmEybgorLmNvbXBhcjRhbmQKKy5jbzhtOXA4YThyOWE4bjhkOHMuCisuY29tcGFyYW4yZDFzMgorLmNvOG05cDhlOG45ZDhpOHU4bS4KKy5jb21wZW5kaTF1CisuY284bTlwOG85bjhlOG44dDl3OGk4czhlLgorLmNvbXBvMm4KKy5jb21wbzNuZW4KKy5jb21wb25lbjF0CisuY29tcG9uZW50dzQKKy5jb21wb25lbnR3aXM0CisuY29tcG9uZW50d2kyCisuY29tcG9uZW50M3c0aXNlCisuY284bThwOXQ4cjhvOGw5bDhlOHIuCisuY29tcDR0cgorLmNvbTJwMXQKKy5jb21wdHJvbDFsCisuY29tcHRyb2wybGUKKy5jbzhtOHA5dDhyOG84bDlsOGU4cjhzLgorLmNvbXB0cm9sbGU0cjFzMgorLmNvOG45ZjhvOHI4bTlhOGI4bDhlLgorLmNvMm4KKy5jb24zZgorLmNvbjFmbworLmNvbmZvMnIKKy5jb25mb3IxbQorLmNvbmZvcjFtYQorLmNvbmZvcjJtYWIKKy5jb25mb3JtYWIybDIKKy5jbzhuOWY4bzhyOG05aThzOHQuCisuY29uZm9yMm1pCisuY29uZm9ybTJpcworLmNvOG45ZjhvOHI4bTlpOHM4dDhzLgorLmNvbmZvcm1pczR0MXMyCisuY284bjlmOG84cjhtOWk4dDh5LgorLmNvbmZvcjNtaXQKKy5jb25mb3JtaTF0eQorLmNvOG45ZzhyOGU4czhzLgorLmNvbjNnCisuY29uMWdyCisuY29uZ3IyZTJzcworLmNvOG45ZzhyOGU4czhzOGU4cy4KKy5jb25ncmVzczFlNHMKKy5jbzhuOXQ4cjhpOGI5dTh0OGUuCisuY29uNXQKKy5jb250cjRpYgorLmNvOG45dDhyOGk4Yjl1OHQ4ZThzLgorLmNvOG45dDhyOGk4Yjl1OHQ4ZThkLgorLmNvbnRyaWJ1MnQxZWQKKy5jbzlyOGU5bDhhOXQ4aThvOG4uCisuY29yZTFsYQorLmNvcmVsYTF0MmlvCisuY29yZWxhdGlvMm4KKy5jbzlyOGU5bDhhOXQ4aThvOG44cy4KKy5jb3JlbGF0aW8ybjNzMgorLmNvOXI4ZTlsOGk5ZzhpOG84bjlpOHM4dC4KKy5jb3JlMWwyaQorLmNvcmVsMmlnCisuY29yZWw0aWdpCisuY29yZWxpNWcyaW8KKy5jb3JlbGlnaW9uM2kKKy5jb3JlbGlnaW8ybgorLmNvcmVsaWdpb24xaXMKKy5jbzlyOGU5bDhpOWc4aThvOG45aThzOHQ4cy4KKy5jb3JlbGlnaW9uaXM0dDFzMgorLmNvOXI4ZTlvOHA5czhpOHMuCisuY29yZTFvCisuY29yZW8ycDFzMgorLmNvcmVvcDFzaXMKKy5jbzlyOGU5czhwOG84bjlkOGU4bjh0LgorLmNvcmUxc3AKKy5jb3JlczRwbzJuCisuY29yZXNwMm9uZAorLmNvcmVzcG9uMWRlCisuY29yZXNwb24xZGVuCisuY29yZXNwb25kZW4xdAorLmNvOXI4ZTlzOHA4bzhuOWQ4ZThuOHQ4cy4KKy5jb3Jlc3BvbmRlbjR0NHMyCisuY285czhlOWM4YThuOHQuCisuY29zNGUKKy5jb3NlMWNhCisuY29zZWNhMm4KKy5jb3NlY2FuMXQKKy5jbzl0OGE4bjlnOGU4bjh0LgorLmNvNHRhMm4KKy5jbzF0YQorLmNvdDJhbmcKKy5jb3RhbjFnZW4KKy5jb3RhbmdlbjF0CisuY284dThyOXM4ZThzLgorLmNvdTIKKy5jb3U0cnMyCisuY291cjJzZQorLmNvdXJzM2U0cworLmNvOXc4bzhyOGs5ZThyLgorLmNvNHdvMgorLmNvd29yazFlcgorLmNvOXc4bzhyOGs5ZThyOHMuCisuY293b3JrZTRyMXMyCisuY3I4YThuOGs5YzhhOHM4ZS4KKy5jcmEybgorLmNyYTRuazIKKy5jcmFuazFjYQorLmNyOGE4bjhrOXM4aDhhOGY4dC4KKy5jcmFuNGsxczIKKy5jcmFua3MyaAorLmNyYW5rc2hhMmYKKy5jcmFua3NoYTJmdAorLmNyOG84YzlvOWQ4aThsOGUuCisuY3Iyb2MKKy5jcm80Y29kCisuY3JvMWNvCisuY3I4bzhjOW85ZDhpOGw4ZThzLgorLmNyb2NvZGlsZXMyCisuY3I4bzhzOHM5aDhhOHQ4YzhoLgorLmNybzJzNHMKKy5jcm9zczJoCisuY3Jvc3NoYTR0YworLmNyb3NzaGF0NGNoCisuY3I4bzhzOHM5aDhhOHQ4YzhoOGU4ZC4KKy5jcm9zc2hhdGNoZTIKKy5jcm9zc2hhdDRjaDRlZAorLmNyOG84czhzOW84djhlOHIuCisuY3JvczFzbworLmNyb3M0c292CisuY3I4eThwOXQ4bzlnOHI4YThtLgorLmNyeTJwMXQKKy5jcnlwMXRvCisuY3J5cHRvMmdyCisuY3I4eThwOXQ4bzlnOHI4YThtOHMuCisuY3J5cHRvZ3JhNG0xczIKKy5jdThmOGY5bDhpOG44ay4KKy5jNHVmCisuY3U0ZjFmCisuY3VmZjRsMgorLmN1ZmZsaW40CisuY3VmZmw0aTRuazIKKy5jdThmOGY5bDhpOG44azhzLgorLmN1ZmZsaW40azFzMgorLmN1OW44ZThpOWY4bzhyOG0uCisuM2N1bgorLmN1Mm5lCisuY3VuZWkyCisuY3VuZWkxZm8KKy5jdW5laWZvMnIKKy5jdW5laWZvcjFtCisuY3U4czl0OG84bTlpOHo5YTliOGw4ZS4KKy4xYzJ1cworLmN1czF0bworLmN1c3RvbTJpegorLmN1c3RvbWl6YTEKKy5jdXN0b21pejVhMmIKKy5jdXN0b21pemFiMmwyCisuY3U4czl0OG84bTlpOHo4ZS4KKy5jdXN0b21pMnplCisuY3U4czl0OG84bTlpOHo4ZThzLgorLmN1OHM5dDhvOG05aTh6OGU4ZC4KKy5kYThjOGg4czloOHU4bjhkLgorLjFkMmEKKy5kYTJjaDQKKy5kYWM0aDFzMgorLmRhY2g0czJoCisuZGE4bTlzOGU4bDlmOGw4eS4KKy5kYTJtMgorLmRhNG0xczIKKy5kYW01c2UybDJmCisuZGFtc2VsZjRsMgorLmRhbXNlbGYybHk1CisuZGE4bTlzOGU4bDlmOGw4aThlOHMuCisuZGFtc2VsZmwyaWU0CisuZGE4Yzh0OHk4bDlvOWc4cjhhOG0uCisuZGEyYzF0CisuZGFjMXR5CisuZGFjMnR5bAorLmRhY3R5M2xvCisuZGFjdHlsbzFncgorLmRhOGM4dDh5OGw5bzlnOHI4YThwOGguCisuZGE4dDhhOWI4YThzOGUuCisuM2RhdAorLmRhMnRhCisuZGEydGFiCisuZGE4dDhhOWI4YThzOGU4cy4KKy5kYXRhYmFzMWU0cworLmRhOHQ4YTlwOGE4dDhoLgorLmRhdDVhcAorLmRhdGFwNWF0CisuZGF0YTFwYQorLmRhdGFwNGF0aAorLmRhOHQ4YTlwOGE4dDhoOHMuCisuZGF0YXBhMnQ0aDFzMgorLmRhOHQ4ZTlzOHQ4YThtOHAuCisuZGF0M2VzdAorLmRhdGVzMXRhCisuZGF0ZXN0YTRtMXAKKy5kYTh0OGU5czh0OGE4bThwOHMuCisuZGF0ZXN0YW0ycDFzMgorLmRlOWM4bDhhOHI5YThiOGw4ZS4KKy5kZTRjbDJhMnIKKy5kZWNsYTJyYWIKKy5kZWNsYXJhYjJsMgorLmRlOWY4aThuOWk5dDhpOHY4ZS4KKy5kZTFmCisuZGUxZmkKKy5kZTJmaW4KKy5kZWYyaW5pCisuZGVmaW4yaXQKKy5kZWZpbmkxdGkKKy5kZWZpbmkxdDJpdgorLmRlOWw4ZThjOXQ4YTliOGw4ZS4KKy5kNWVsZWMKKy5kZWxlMmMxdAorLmRlbGVjMnRhNGIKKy5kZWxlYzF0YQorLmRlbGVjdGFiMmwyCisuZGU4bThpOXM4ZThtOGk5cTh1OGE5djhlOHIuCisuZGU0bTJpcworLmRlbTRpc2UKKy5kZW1pc2VtaTNxdWEKKy5kZW1pc2VtaXF1MgorLmRlbWlzZW1pcXVhNXY0CisuZGU4bThpOXM4ZThtOGk5cTh1OGE5djhlOHI4cy4KKy5kZW1pc2VtaXF1YXZlNHIxczIKKy5kZTltOG84YzlyOGE5dDhpOHM4bS4KKy5kZTRtb2NyCisuZGVtb2NyYXRpMnM0bQorLmRlOG04bzhzLgorLmRlbW9zMgorLmRlOXI4aTh2OWE5dDhpOHY4ZS4KKy5kZXIyaTR2CisuZGU0cmkxdmEKKy5kZXJpM3ZhdAorLmRlcjJpdmExdDJpdgorLmRlOXI4aTh2OWE5dDhpOHY4ZThzLgorLmRlcml2YXRpdjRlMnMKKy5kaThhOWw4ZThjOXQ4aThjLgorLjFkNGkzYQorLmRpMmFsCisuZGkyYWxlCisuZGlhbGUyYzF0CisuZGk4YTlsOGU4Yzl0OGk4YzhzLgorLmRpYWxlY3RpNGMzczIKKy5kaThhOWw4ZThjOXQ4aTljOGk4YThuLgorLmRpYWxlY3QyaTFjaQorLmQyaTFhbGVjdGkzYzJpMWEKKy5kaWFsZWN0aWNpMmEybgorLmRpOGE5bDhlOGM5dDhpOWM4aThhOG44cy4KKy5kaWFsZWN0aWNpYTJuMXMyCisuZGk5YzhoOGw4bzhyOG85bThlOHQ4aDlhOG44ZS4KKy5kNGkyY2gKKy5kaWM0aDFsNAorLmRpY2gybG8KKy5kaWNobG9ybzJtZQorLmRpY2hsb3JvNG1ldAorLmRpY2hsb3JvbWV0aGEybjQKKy5kaThmOWY4cjhhOGM4dC4KKy5kMWlmCisuZGlmNGZyCisuZGk0ZjFmCisuZGlmZnJhMmMxdAorLmRpOGY5ZjhyOGE4Yzh0OHMuCisuZGlmZnJhYzR0MXMyCisuZGk4ZjlmOHI4YThjOXQ4aThvOG4uCisuZGlmZnJhYzF0MmlvCisuZGlmZnJhY3RpbzJuCisuZGk4ZjlmOHI4YThjOXQ4aThvOG44cy4KKy5kaWZmcmFjdGlvMm4zczIKKy5kaThyOGU4ci4KKy5kNGlyMgorLmRpMXJlCisuZGlyMWVyNAorLmRpOHI4ZTluOGU4czhzLgorLmRpcmUxbmVzCisuZGlyZW4yZTJzcworLmRpOHM5cDhhOHI5YThuOGQuCisuZGlzMQorLmRpczFwCisuZGkyczFwYQorLmRpc3AyYTJyCisuZGlzcGFyYTJuCisuZGlzcGFyNGFuZAorLmRpOHM5cDhhOHI5YThuOGQ4cy4KKy5kaXNwYXJhbjJkMXMyCisuZGk4czl0OHI4YTh1OGc4aDh0OWw4eS4KKy5kNGlzM3QKKy5kaXN0NHIKKy5kaXMxdHJhCisuZGlzdHJhdWdoMworLmRpc3RyYXVnaDJ0bAorLmRpc3RyYXVnaHQxbHkKKy5kaThzOXQ4cjhpOGI5dTh0OGUuCisuZGlzdHI0aWIKKy5kaThzOXQ4cjhpOGI5dTh0OGU4cy4KKy5kaThzOXQ4cjhpOGI5dTh0OGU4ZC4KKy5kaXN0cmlidTJ0MWVkCisuZG84dTliOGw4ZTlzOHA4YThjOGUuCisuZG91MgorLmRvdTNiMmwyCisuZG91NWJsZTFzcAorLmRvdWJsZXMyCisuZG91YmxlMnMxcGEKKy5kb3VibGVzcGE0Y2UKKy5kbzh1OWI4bDhlOXM4cDhhOGM5aThuOGcuCisuZG91Ymxlc3A0YTJjaQorLmRvdWJsZXNwYTJjMWluCisuZG91Ymxlc3BhYzFpbmcKKy5kbzhsOGw5aThzOGguCisuZG9sMWwKKy5kb2xsMmkKKy5kb2xsaXMyaAorLmRyOGk4Zjh0OWE4ZzhlLgorLjFkcgorLmRyNGkyZnQKKy5kcmlmMXRhCisuZHI4aTh2OWU4cjhzLgorLmRyMml2CisuZHJpdmU0cjFzMgorLmRyOG84bTllOWQ4YThyOHkuCisuZHJvMm1lCisuZHJvMm1lZAorLmRyb20yZTJkMmEKKy5kcm9tZTRkYXJ5CisuZHJvbWVkMmEycgorLmRyOG84bTllOWQ4YThyOGk4ZThzLgorLmRyb21lZGFyMWkKKy5kcm9tZWRhcjJpZTQKKy5kdTlvOHA5bzlsOGk4czh0LgorLmR1b3BvbDJpCisuZHU5bzhwOW85bDhpOHM4dDhzLgorLmR1b3BvbGlzNHQxczIKKy5kdTlvOHA5bzhsOHkuCisuZHVvcG8ybHkKKy5keThzOWw4ZTh4OGk4YS4KKy5kMnkKKy5keXMxbDIKKy5keXMybGUKKy5keXNsZXgzaQorLmR5c2xleDJpNWEKKy5keThzOWw4ZThjOXQ4aThjLgorLmR5c2xlMmMxdAorLmVhOHM4dDllOG44ZDllOHI4cy4KKy5lYXN0MworLmVhczN0ZW4KKy5lYXMzdGVuZAorLmVhc3RlbjFkZQorLmVhc3RlbmRlNHI1czIKKy5lYzhvOW44bzhtOWk4YzhzLgorLmUxY28KKy5lY28ybgorLmVjbzNub21pYworLmVjb25vbWk0YzNzMgorLmVjOG84bjlvOW04aThzOHQuCisuZWNvbm9tMmlzCisuZWM4bzhuOW85bThpOHM4dDhzLgorLmVjb25vbWlzNHQxczIKKy5laTlnOGU4bjljOGw4YThzOHMuCisuZWkyCisuZTJpZzIKKy5laTFnZW4KKy5laWdlbjFjNGw0CisuZWlnZW5jbGEyc3MKKy5laTlnOGU4bjljOGw4YThzOHM4ZThzLgorLmVpZ2VuY2xhc3MxZTRzCisuZWk5ZzhlOG45djhhOGw5dThlLgorLmVpZ2VuMXYyCisuZWlnZW4xdmEKKy5laWdlbnZhbDF1CisuZWk5ZzhlOG45djhhOGw5dThlOHMuCisuZWw4ZThjOHQ4cjhvOW04ZThjOGg4YThuOWk5YzhhOGwuCisuNWVsZWMKKy5lbGUyYzF0CisuZWxlY3RybzJtZQorLmVsZWN0cm9tZTJjaAorLmVsZWN0cm9tZTVjaGE0bjFpYworLmVsZWN0cm9tZWNoYTJuCisuZWxlY3Ryb21lY2hhbmkxY2EKKy5lbDhlOGM4dDhyOG85bThlOGM4aDhhOG44bzlhOGM4bzh1OHM4dDhpOGMuCisuZWxlY3Ryb21lY2hhbm80CisuZWxlY3Ryb21lY2hhbjRvYQorLmVsZWN0cm9tZWNoYW5vYTFjbworLmVsZWN0cm9tZWNoYW5vYWNvdTIKKy5lbGVjdHJvbWVjaGFub2FjbzJ1cworLmVsZWN0cm9tZWNoYW5vYWNvdXN0MmkKKy5lbGVjdHJvbWVjaGFub2Fjb3VzMXRpYworLmVsOGk4dDlpOHM4dC4KKy5lbDJpCisuZWwxaXQKKy5lbGkxdGkKKy5lbDRpdGlzCisuZWw4aTh0OWk4czh0OHMuCisuZWxpdGlzNHQxczIKKy5lbjl0OHI4ZTlwOHI4ZTluOGU4dThyLgorLmVuMXQKKy5lbnRyZXByMgorLmVudHJlcHJlbjRldQorLmVuOXQ4cjhlOXA4cjhlOW44ZTh1OHI5aThhOGwuCisuZW50cmVwcmVuZXVyMmkzYQorLmVudHJlcHJlbmV1cmkyYWwKKy5lcDlpOW44ZThwOGg5cjhpOG44ZS4KKy5lcGkybgorLmVwMmluZQorLmVwaW5lcDRocjQKKy5lcDJpbmVwaHIyaW40ZQorLmVxOHU4aTl2OGE4cjhpOWE4bjh0LgorLmVxdTJpdjMKKy5lcXVpMXZhCisuZXF1aXYyYTJyCisuZXF1aXZhcjFpCisuZXF1aXZhcjNpMmEybgorLmVxdWl2YXIyaTNhCisuZXF1aXZhcjRpYW40dAorLmVxOHU4aTl2OGE4cjhpOWE4bjhjOGUuCisuZXF1aXZhcjRpYW5jCisuZXQ4aDlhOG44ZS4KKy5ldGhhMm40CisuZXQ4aDl5OGw5ZThuOGUuCisuZXY4ZThyOXM4aTliOGw4ZS4KKy5ldjFlcgorLmV2ZTRyMXMyCisuZXZlcjFzaQorLmV2ZXI0c2k0YgorLmV2ZXJzaTFiMmwyCisuZXY4ZThyOHQuCisuZXY4ZThyOHQ4cy4KKy5ldmVyNHQxczIKKy5ldjhlOHI4dDllOGQuCisuZXZlcjJ0MWVkCisuZXY4ZThyOHQ5aThuOGcuCisuZXZlcjF0aQorLmV2ZXIydDFpbgorLmV4OXE4dThpOHM5aTh0OGUuCisuZXhxdTIKKy5leHEydWkyCisuZXhxdWlzMml0ZQorLmV4OXQ4cjhhOW84cjlkOGk5bjhhOHI4eS4KKy5leDF0MgorLmV4MXRyYQorLmV4dHI0YW8KKy5leHRyYW9yZDJpCisuZXh0cmFvcmQxaW40CisuZXh0cmFvcjFkaTFuYQorLmV4dHJhb3JkaW4yYTJyCisuZmE4bDhsOWk4bjhnLgorLjFmYQorLmZhbDFsCisuZmFsbDJpCisuZmFsMmxpbjQKKy5mZThyOG04aTlvOG44cy4KKy5mZXIxCisuZmVyM200CisuZmVyNG0yaW8KKy5mZXJtaW8ybgorLmZlcm1pbzJuM3MyCisuZmk5bjhpOHQ4ZTlsOHkuCisuMWZpCisuMmZpbgorLmYyaW5pCisuZmluMml0CisuZmluMml0ZQorLmZpbml0ZTFseQorLmZsOGE5ZzhlOGw5bDh1OG0uCisuZjRsMgorLmZsYWc1ZWwxbAorLmZsOGE5ZzhlOGw5bDhhLgorLmZsYWc0ZWxsYQorLmZsOGE4bTltOGE5YjhsOGU4cy4KKy5mbGFtMW0KKy5mbGFtMW1hCisuZmxhbTJtYWIKKy5mbGFtbWFiMmwyCisuZmxhbW1hYmxlczIKKy5mbDhlOGQ4ZzlsOGk4bjhnLgorLmZsZWRnbDIKKy5mbDhvOHc5YzhoOGE4cjh0LgorLmZsb3cyY2gKKy5mbG93Y2gyYTJyCisuZmw4bzh3OWM4aDhhOHI4dDhzLgorLmZsb3djaGFyNHQxczIKKy5mbDh1OG84cjhvOWM4YThyOWI4bzhuLgorLmZsdTNvCisuZmx1bzNyCisuZmx1b3Iyb2MKKy5mbHVvcm8xY2EKKy5mbHVvcm9jMmEycgorLmZsdW9yb2NhcjFiCisuZmx1b3JvY2FyYjRvCisuZmx1b3JvY2FyYm8ybgorLmZvOHI5bThpOWQ4YTliOGw4ZS4KKy5mb3IybWkKKy5mb3JtaTFkNGEKKy5mb3JtMmlkCisuZm9ybWkyZDNhNGIKKy5mb3JtaWRhYjJsMgorLmZvOHI5bThpOWQ4YTliOGw4eS4KKy5mb3JtaWRhYjFseQorLmZvOHI5czh5OHQ4aDlpOGEuCisuZm80cnMyCisuZm9yczR5CisuZm9yc3l0aDJpMWEKKy5mbzhyOHQ4aDlyOGk4ZzhoOHQuCisuZm9ydDRocjQKKy5mb3J0aHIyaWcKKy5mcjhlOGU5bDhvOGE4ZDhlOHIuCisuZnJlZWw0b2EKKy5mcmVlbG9hMmQzCisuZnI4ZThlOWw4bzhhOGQ4ZThyOHMuCisuZnJlZWxvYWRlNHI1czIKKy5mcjhpOGU4bjhkOWw4aThlOHIuCisuZnJpMgorLmZyMmllNAorLmZyaWVuZGwyaWU0CisuZnI4aTl2OG84bDlpOHQ4eS4KKy5mcjJpdgorLmZyaXZvbDJpCisuZnJpdm9sMWl0CisuZnJpdm9saTF0eQorLmZyOGk5djhvOGw5aTl0OGk4ZThzLgorLmZyaXZvbGkxdGkKKy5mcml2b2xpdDJpZTQKKy5mcjhpOHY5bzlsOG84dThzLgorLmZyaXZvbG91MgorLmZyaXZvbG8ydXMKKy5nYTlsOGE4Yzl0OGk4Yy4KKy5nYWxhMmMxdAorLmdhOGw5YTh4OHkuCisuZ2E4bDlhOHg5aThlOHMuCisuZ2FsYXgzaQorLmdhbGF4MmllNAorLmdhOHM5bzhtOWU5dDhlOHIuCisuZ2Exc28KKy5nYTNzb20KKy5nYXNvMm1lCisuZ2FzbzRtZXQKKy5nYXNvbWUxdGUKKy5nZTlvOWQ4ZThzOWk4Yy4KKy5nZW9kZXMyCisuZ2VvZGUxc2kKKy5nZW9kZTJzaWMKKy5nZTlvOWQ4ZTh0OWk4Yy4KKy5nZW9kZTF0CisuZ2VvZGV0MWljCisuZ2U4bzltOGU4dDlyOGk4Yy4KKy5nZTNvbQorLmdlbzJtZQorLmdlbzRtZXQKKy5nZW9tNGV0cgorLmdlbzVtZXQzcmljCisuZ2U4bzltOGU4dDlyOGk4YzhzLgorLmdlb21lNHRyaTRjM3MyCisuZ2U5bzlzOHQ4cjhvOHA4aDhpOGMuCisuZ2VvczQKKy5nZW9zdDRyCisuZ2Vvc3RyMm9waAorLmdlb3N0cm9waDFpYworLmdlOG85dDhoOGU4cjltOGE4bC4KKy5nZTRvdAorLmdlNG90aAorLmdlb3RoMmUKKy5nZW90aGVyM200CisuZ2VvdGhlcjFtYQorLmdlOW84dDlyOG85cDhpOHM4bS4KKy5nZW90cm9waTJzMW0KKy5nbjhvOW04bzhuLgorLmcxbm8KKy5nbm80bW8KKy5nbm80bW8ybgorLmduOG85bThvOG44cy4KKy5nbm9tbzJuM3MyCisuZ3I4YThuOGQ5dThuOGM4bDhlLgorLjFncgorLmdyYTJuMgorLmdyNGFuZAorLmdyYW4xZHUKKy5ncmFuZHU0bgorLmdyYW5kdW4xYzRsNAorLmdyOGE4bjhkOXU4bjhjOGw4ZThzLgorLmdyYW5kdW5jbGVzMgorLmdyOGk4ZTh2OWE4bjhjOGUuCisuZ3IyaWU0CisuZ3JpZTF2YQorLmdyaWV2YTJuCisuZ3I4aThlOHY5YThuOGM4ZThzLgorLmdyOGk4ZTh2OW84dThzLgorLmdyaWV2b3UyCisuZ3JpZXZvMnVzCisuZ3I4aThlOHY5bzh1OHM5bDh5LgorLmdyaWV2b3VzMWwyCisuZ3JpZXZvdXMxbHkKKy5oYThpOHI5czh0OHk4bDhlLgorLmhhaTIKKy5oYTRpcgorLmhhaTRyczIKKy5oYWlyczJ0eQorLmhhaXJzMnR5bAorLmhhOGk4cjlzOHQ4eThsOGU4cy4KKy5oYWlyc3R5bGVzMgorLmhhOGk4cjlzOHQ4eThsOWk4czh0LgorLmhhOGk4cjlzOHQ4eThsOWk4czh0OHMuCisuaGFpcnN0eWxpczR0MXMyCisuaGE4bDhmOXM4cDhhOGM4ZS4KKy5oYTJsZgorLmhhbDJmM3MKKy5oYWxmMnMxcGEKKy5oYWxmc3BhNGNlCisuaGE4bDhmOXM4cDhhOGM4ZThzLgorLmhhOGw4Zjl3OGE4eS4KKy5oYThyOWI4aThuOWc4ZThyLgorLmgyYTJyCisuaGFyMWIKKy5oYXJiaTIKKy5oYXIyYmluCisuaGFyYjRpbmdlCisuaGE4cjliOGk4bjlnOGU4cjhzLgorLmhhcmJpbmdlNHIxczIKKy5oYThyOWw4ZTlxOHU4aThuLgorLmhhcjRsZTQKKy5oYXIxbAorLmhhcmxlMXEKKy5oYXJsZXF1MgorLmhhcmxlcTJ1aTIKKy5oYXJsZXF1aTRuCisuaGE4cjlsOGU5cTh1OGk4bjhzLgorLmhhcmxlcXUyaTJuMXMyCisuaGE4dDhjOGg5ZThyOGk4ZThzLgorLmhhNHRjCisuaGF0NGNoCisuaGF0Y2hlMgorLmhhdGNoZXIxaQorLmhhdGNoZXIyaWU0CisuaGU4bThpOWQ4ZThtOGk5czhlOG04aTlxOHU4YTl2OGU4ci4KKy5oZW0yaWQKKy5oZW1pZDRlbQorLmhlbWlkZTRtMmlzCisuaGVtaWRlbTRpc2UKKy5oZW1pZGVtaXNlbWkzcXVhCisuaGVtaWRlbWlzZW1pcXUyCisuaGVtaWRlbWlzZW1pcXVhNXY0CisuaGU4bThpOWQ4ZThtOGk5czhlOG04aTlxOHU4YTl2OGU4cjhzLgorLmhlbWlkZW1pc2VtaXF1YXZlNHIxczIKKy5oZTltOG85ZzhsOG85YjhpOG4uCisuaGVtbzRnCisuaGUxbW8KKy5oZW1vNGdsMgorLmhlbW8zZ2xvCisuaGVtb2dsbzFiaQorLmhlbW9nbG8yYmluCisuaGU5bThvOXA4aDhpOGw5aThhLgorLmhlbTJvcGgKKy5oZW1vcGg0aWwyCisuaGVtb3BoaWwxaQorLmhlbW9waGlsM2kxYQorLmhlOW04bzlwOGg4aThsOWk4YThjLgorLmhlOW04bzlwOGg4aThsOWk4YThjOHMuCisuaGVtb3BoaWxpYTRjM3MyCisuaGU4bThvOXI4aDhlOW84bDlvOGc4eS4KKy5oZW1vMnIKKy5oZW1vcmg0CisuaGVtb3JoZTNvbAorLmhlbW9yaGVvbDFvMWd5CisuaGU5cDhhOHQ5aThjLgorLmhlcDUKKy5oZTJwYQorLmhlcGF0MWljCisuaGU4cjltOGE4cDhoOXI4bzlkOGk4dDhlLgorLmhlcjNtNAorLmhlcjFtYQorLmhlcjRtYXAKKy5oZXJtYXA0aHI0CisuaGVybWFwaHJvZDJpdGUKKy5oZThyOW04YThwOGg5cjhvOWQ4aTh0OWk4Yy4KKy5oZXJtYXBocm9kMmkxdGkKKy5oZXJtYXBocm9kNGkydGljCisuaGU5cjhvOGU4cy4KKy5oZXJvNGUKKy5oZTh4OGE5ZDhlOGM5aTltOGE4bC4KKy5oZXgxYQorLmhleGEyZAorLmhleGFkZTFjMmkKKy5oZXhhZGUyYzNpbQorLmhleGFkZWNpMW1hCisuaG85bDhvOW44bzltOHkuCisuaG9sbzJuCisuaG9sb24zbzNteQorLmhvOW04ZThvOW04bzhyOXA4aDhpOGMuCisuaG8ybWUzCisuaG9tZW8xbW8KKy5ob21lb21vMnIKKy5ob21lb21vcjFwCisuaG9tZW9tb3JwNGg0CisuaG9tZW9tb3JwaDFpYworLmhvOW04ZThvOW04bzhyOXA4aDhpOHM4bS4KKy5ob21lb21vcnBoaTJzMW0KKy5obzltOG85dDhoOGU4dDhpOGMuCisuaG8xbW8KKy5ob200b3RoMworLmhvbW90aDJlCisuaG9tbzN0aGU0dAorLmhvbW90aGV0MWljCisuaG84cjhzOGU5cjhhOGQ5aThzOGguCisuaG9yNHNlCisuaG80cnMyCisuaG9yc2VyMWEKKy5ob3JzZXJhMmQKKy5ob3JzZXIyYWRpCisuaG9yc2VyYWRpczEKKy5ob3JzZXJhZGlzMmgKKy5obzh0OWI4ZThkLgorLmhvMnQxYgorLmhvdDRiZTJkCisuaG84dDliOGU4ZDhzLgorLmhvdGJlMmQxczIKKy5oeTlkOHI4bzl0OGg4ZThyOW04YThsLgorLmh5MWQKKy5oeTFkcgorLmh5ZHJvNHRoMmUKKy5oeWRyNG90aAorLmh5ZHJvdGhlcjNtNAorLmh5ZHJvdGhlcjFtYQorLmh5OXA4bzl0OGg4YThsOWE5bTh1OHMuCisuaHkzcG8KKy5oeXA0b3QKKy5oeXA0b3RoCisuaHlwb3RoYTNsYQorLmh5cG90aGFsYTNtCisuaHlwb3RoYWxhMW11CisuaHlwb3RoYWxhbTJ1cworLmlkOGU4YThsOHMuCisuaWRlM2E0bAorLmlkZWEybDFzMgorLmlkOGU4bzlnOHI4YThwOGg4cy4KKy5pZGVvMmcKKy5pZGVvMWdyCisuaWRlb2dyYTRwNGgxczIKKy5pZDhpOG85czh5OG45YzhyOGE4czh5LgorLmkyZGkKKy5pMWQzaW8KKy5pZGk0b3MKKy5pZGlvczR5CisuaWRpb3N5bjFjcgorLmlkaW9zeW5jcjJhcworLmlkaW9zeW5jcmFzNHkKKy5pZDhpOG85czh5OG45YzhyOGE5czhpOGU4cy4KKy5pZGlvc3luY3JhczJpZTQKKy5pZDhpOG85czh5OG45YzhyOGE4dDhpOGMuCisuaWRpb3N5bjVjcmF0MWljCisuaWQ4aThvOXM4eThuOWM4cjhhOHQ5aTljOGE4bDlsOHkuCisuaWRpb3N5bmNyYXRpMWNhCisuaWRpb3N5bmNyYXRpY2FsMWwKKy5pZGlvc3luY3JhdGljYWwxbHkKKy5pZzluOGk4dDllOHIuCisuMmlnCisuaWcxbmkKKy5pZ24yaXQKKy5pZ24yaXRlCisuaWc5bjhpOHQ5ZThyOHMuCisuaWduaXRlNHIxczIKKy5pZzluOGk5dDhvOHIuCisuaWduM2l0b3IKKy5pZ25pMXRvCisuaWc4bjhvOHI4ZTlzOHA4YThjOGU4cy4KKy5pZzFubworLmlnbm9yZTFzcAorLmlnbm9yZTJzMXBhCisuaWdub3Jlc3BhNGNlCisuaW05cDhlOGQ5YThuOGM4ZS4KKy5pbTJwMmVkCisuaW1wMmUyZDJhCisuaW1wZWRhMm4KKy5pbTlwOGU4ZDlhOG44YzhlOHMuCisuaW45ZDh1OWI4aTl0OGE5YjhsOGUuCisuNGluZAorLmluMWR1CisuaW5kdTFiNGkKKy5pbmR1YmkydAorLmluZHViaTF0YQorLmluZHViaTJ0YWIKKy5pbmR1Yml0YWIybDIKKy5pbjlmOGk4bjlpOHQ4ZTlsOHkuCisuaW4zZgorLmluMWZpCisuaW4yZmluCisuaW5mMmluaQorLmluZmluMml0CisuaW5maW4yaXRlCisuaW5maW5pdGUxbHkKKy5pbjlmOGk4bjlpOXQ4ZThzOWk5bThhOGwuCisuaW5maW5pdDRlcworLmluZmluaXRlMXNpCisuaW5maW5pdGUyczVpbQorLmluZmluaXRlc2kxbWEKKy5pbjlmOHI4YTlzOHQ4cjh1OGM5dDh1OHI4ZS4KKy5pbmZyMmFzCisuaW5mcmFzMXQ0cgorLmluZnJhc3RydTJjMXQKKy5pbmZyYXN0cnVjdHU0cgorLmluZnJhc3RydWMxdHUKKy5pbmZyYXN0cnVjM3R1cmUKKy5pbjlmOHI4YTlzOHQ4cjh1OGM5dDh1OHI4ZThzLgorLmluOXM4dDhhOGw4bDllOHIuCisuaW5zMnRhMmwKKy5pbnMxdGEKKy5pbnN0YWwxbAorLmluc3RhbDJsZQorLmluOXM4dDhhOGw4bDllOHI4cy4KKy5pbnN0YWxsZTRyMXMyCisuaW45dDhlOHI5ZDhpOHM5YzhpOXA4bDhpOW44YThyOHkuCisuaW4xdAorLmluNXRlcjNkCisuaW50ZXJkMmkKKy5pbnRlcmRpczEKKy5pbnRlcmQyaXMxYworLmludGVyZGlzMWNpCisuaW50ZXJkaXNjMmlwCisuaW50ZXJkaXNjaTFwMmwyCisuaW50ZXJkaXNjaXBsaTRuCisuaW50ZXJkaXNjaXBsNGkxbmEKKy5pbnRlcmRpc2NpcGxpbjJhMnIKKy5pbjl0OGU4cjlnOGE5bDhhOGM5dDhpOGMuCisuaW50ZXJnMgorLmludGVyMWdhCisuaW50ZXJnYWxhMmMxdAorLmluOXU4dDhpOGw4ZS4KKy5pbjF1CisuaW40dTF0MmkKKy5pbjl1OHQ4aThsOWk5dDh5LgorLmludXRpbDFpCisuaW51dDJpbDFpdAorLmludXRpbGkxdHkKKy5pcjlyOGU5ZDh1OGM5aThiOGw4ZS4KKy5pcjJyMmVkCisuaXJyZTFkdQorLmlycmVkdTJjCisuaXJyZWR1Y2k0YgorLmlycmVkdTFjaQorLmlycmVkdWNpMWIybDIKKy5pcjlyOGU5ZDh1OGM5aThiOGw4eS4KKy5pcnJlZHVjaWIxbHkKKy5pcjlyOGU4djlvOWM4YTliOGw4ZS4KKy5pcnJldjIKKy5pcnJlNXZvYworLmlycmV2bzFjYQorLmlycmV2b2NhMWIybDIKKy5pczhvOHQ5cjhvOHA4eS4KKy5pMnNvCisuaXNvdHJvcHk1CisuaXM4bzl0OHI4bzhwOWk4Yy4KKy5pc290cm9wM2ljCisuaXQ4aThuOWU4cjlhOHI4eS4KKy5pMXRpCisuaTJ0MWluCisuaXQyaW5lCisuaXRpbjRlcjRhMnIKKy5pdGluMWVyCisuaXRpbmVyMWEKKy5pdDhpOG45ZThyOWE4cjlpOGU4cy4KKy5pdGluZXJhcjFpCisuaXRpbmVyYXIyaWU0CisuamU5cjhlOW04aTlhOGQ4cy4KKy4xamUKKy5qZXJlbTJpM2EKKy5qZXJlbWlhMmQKKy5qZXJlbWlhMmQxczIKKy5rZTh5OW44bzh0OGUuCisua2U4eTluOG84dDhlOHMuCisua2V5bm80dGVzCisua2U4eTlzOHQ4cjhvOGs4ZS4KKy5rZXlzNAorLmtleXMxdAorLmtleXN0NHIKKy5rZXlzdHIyb2syCisua2U4eTlzOHQ4cjhvOGs4ZThzLgorLmtleXN0cm9rZXM0Cisua2k4bDhuOWk4bjhnLgorLmsxaQorLms0aTJsMW4yCisua2lsbjFpbgorLmtpbG5pbjRnCisubGE4YzlpOWU4czh0LgorLmw0YTJjaTQKKy5sYTNjMmllNAorLmxhY2kxZXN0CisubGE4bTllOG45dDhhOWI4bDhlLgorLmxhMW1lbgorLmxhM21lbjF0CisubGFtZW4ydGE0YgorLmxhbWVuMXRhCisubGFtZW50YWIybDIKKy5sYThuOGQ5czhjOGE4cDllOHIuCisuM2w0YW5kCisubGEybgorLmxhbjJkMXMyCisubGFuZHNjYTRwCisubGFuZHMxY2EKKy5sYW5kc2NhNXBlcgorLmxhOG44ZDlzOGM4YThwOWU4cjhzLgorLmxhbmRzY2FwZTRyMXMyCisubGE4cjljOGU5bjh5LgorLmwyYTJyCisubGFyMWMKKy5sYXIyY2UKKy5sYXIxY2VuNAorLmxhOHI5YzhlOW45aThzOHQuCisubGFyNGNlbmkKKy5sZThhOGY5aDhvOHA5cDhlOHIuCisubGUyYQorLmxlYTJmCisubGVhNGZoCisubGVhZmhvNHAxcAorLmxlYWZob3AycGUKKy5sZWFmaG9wM3BlcgorLmxlOGE4ZjloOG84cDlwOGU4cjhzLgorLmxlYWZob3BwZTRyMXMyCisubGU4dDl0OGU4cjlzOHA4YThjOWk4bjhnLgorLmxlNHQzdDIKKy5sZXR0ZTRyMXMyCisubGV0dGVyMXNwCisubGV0dGVyMnMxcGEKKy5sZXR0ZXJzcDRhMmNpCisubGV0dGVyc3BhMmMxaW4KKy5sZXR0ZXJzcGFjMWluZworLmxpOGY4ZTlzOHA4YThuLgorLmxpZmUxc3AKKy5saWZlMnMxcGEKKy5saWZlc3BhNG4KKy5saThmOGU5czhwOGE4bjhzLgorLmxpZmVzcGEybjFzMgorLmxpOGY4ZTlzOHQ4eThsOGUuCisubGlmZXMydHkKKy5saWZlczJ0eWwKKy5saThmOGU5czh0OHk4bDhlOHMuCisubGlmZXN0eWxlczIKKy5saThnOGg4dDl3OGU4aThnOGg4dC4KKy4zbGlnaAorLmxpZ2h0dzQKKy5saWdodHdlaTIKKy5sMmlnaHR3ZTJpZzIKKy5saThtOW84dTlzOGk4bjhlOHMuCisubGk0bW8KKy5saTNtbzJ1cworLmxpbW91MgorLmxpbW91MnMxaW4KKy5saW1vdXMyaW5lCisubGltb3VzaTFuZXMKKy5saThuOGU5YjhhOGM4azhlOHIuCisuMWw0aW5lCisubGluMmUyYgorLmxpbmViYWNrMQorLmxpbmViYWNrMWVyCisubGk4bjhlOXM4cDhhOGM4aThuOGcuCisubGkxbmVzCisubGk0bmUxc3AKKy5saW5lMnMxcGEKKy5saW5lc3A0YTJjaQorLmxpbmVzcGEyYzFpbgorLmxpbmVzcGFjMWluZworLmxpOW84bjllOHM4cy4KKy5saW8ybgorLmxpbzFuZXMKKy5saW9uMmUyc3MKKy5saTh0OGg5bzlnOHI4YThwOGg4ZThkLgorLmwyaXRoCisubGl0aG80ZworLmxpdGhvMWdyCisubGl0aG9ncmFwaDRlZAorLmxpOHQ4aDlvOWc4cjhhOHA4aDhzLgorLmxpdGhvZ3JhNHA0aDFzMgorLmxvOWI4bzh0OW84bTh5LgorLmxvYm80dG8KKy5sb2JvdG8zbXkKKy5sbzliOG84dDlvOG05aTh6OGUuCisubG9ib3RvbTJpegorLmxvYm90b21pMnplCisubG84ZzhlOHMuCisubG8xZ2UKKy5sbzhuOGc5ZThzOHQuCisuNWxvbmcKKy5sbzJuCisubG85cTh1OGE4YzlpOHQ4eS4KKy5sbzFxCisubG9xdTIKKy5sb3F1YWM0CisubG9xdTRhMmNpCisubG9xdWEyYzFpdAorLmxvcXVhY2kxdHkKKy5sbzh2OGU5czh0OHI4dThjOGsuCisuNGxvdgorLmxvdjRlMnMKKy5sb3YyZXN0NHIKKy5sb3Zlc3RydWM1CisubG92ZXN0cnVjazEKKy5tYThjOHI4bzllOGM4bzluOG84bThpOGM4cy4KKy5tYWNybzRlCisubWFjcm9lMWNvCisubWFjcm9lY28ybgorLm1hY3JvZWNvM25vbWljCisubWFjcm9lY29ub21pNGMzczIKKy5tYThsOWE5cDhyOG84cDlpOHM4bS4KKy5tYWxhcHIyCisubWFsYXByb3BpMnMxbQorLm1hOGw5YTlwOHI4bzhwOWk4czhtOHMuCisubWFsYXByb3A0aXM0bTFzMgorLm1hOG45czhsOGE4dThnOGg5dDhlOHIuCisubWEybjFzMgorLm1hbjJzMWwyCisubWFuc2xhdWdoMworLm1hOG45dTlzOGM4cjhpOHA4dC4KKy5tYW4ydXMKKy5tYW51c2MyCisubWFudXNjcmkyCisubWFudXNjcjJpcAorLm1hbnVzY3JpMnAxdAorLm1hOHI5ZzhpOG45YThsLgorLm1hcmcyCisubWFyZ2k0bgorLm1hcmdpMW5hCisubWE4dDhoOWU5bThhOXQ4aTljOGk4YThuLgorLm00YXRoMworLm1hdGg1ZW0KKy5tYXRoMmUKKy4xbWF0aGUxbWEKKy5tYXRoZW1hdDFpYworLm1hdGhlbWF0MmkxY2kKKy5tYXRoZW1hdGkzYzJpMWEKKy5tYXRoZW1hdGljaTJhMm4KKy5tYTh0OGg5ZTltOGE5dDhpOWM4aThhOG44cy4KKy5tYXRoZW1hdGljaWEybjFzMgorLm1hOHQ4dDhlOHMuCisubWF0NXRlCisubWE0dDN0MgorLm1hdDR0ZXMKKy5tZThkOWk4YzlhOGk4ZC4KKy4ybWVkCisubTRlZGkKKy5tZWQzaTFjYQorLm1lZGljYWkyCisubWVkaWNhMmlkCisubWU4ZDhpOW84YzhyOGUuCisubWUxZDJpbworLm1lZGlvY3JlMworLm1lOGQ4aTlvOGM5cjhpOXQ4aThlOHMuCisubWVkaTVvY3JpdAorLm1lZGlvY3JpMgorLm1lZGlvNWNyaTF0aQorLm1lZGlvY3JpdDJpZTQKKy5tZThnOGE5bDhpOHQ4aC4KKy5tZTJnCisubTRlZ2FsCisubWUxZ2EKKy5tZTNnYWwxaQorLm1lZ2FsMWl0CisubWVnYWwyaXRoCisubWU4ZzhhOWw4aTh0OGg4cy4KKy5tZWdhbGkydDRoMXMyCisubWU4dDhhOWI4bzhsOWk4Yy4KKy5tZTR0YQorLm1lMnRhNGIKKy5tZXRhYm9sM2ljCisubWV0YWJvbDJpCisubWU5dDhhOGI5bzlsOGk4czhtLgorLm1ldGFib2xpMnMxbQorLm1lOXQ4YThiOW85bDhpOHM4bThzLgorLm1ldGFib2w0aXM0bTFzMgorLm1lOXQ4YThiOW85bDhpOHQ4ZS4KKy5tZXRhYm81bDJpdGUKKy5tZXRhYm9sMWl0CisubWU5dDhhOGI5bzlsOGk4dDhlOHMuCisubWV0YWJvbGl0NGVzCisubWU4dDhhOWw4YThuOWc4dThhOGc4ZS4KKy5tZXQzYTJsCisubWV0YTVsYQorLm1ldGFsYTJuCisubWV0YWwyYW5nCisubWV0YWxhbjFndQorLm1ldGFsYW5ndTRhCisubWU4dDhhOWw4YThuOWc4dThhOGc4ZThzLgorLm1lOHQ4YTlwOGg4bzhyOWk4Yy4KKy5tZXRhcGhvNHIKKy5tZTh0OGg5YThuOGUuCisubWV0aGEybjQKKy5tZTl0OHI4bzhwOW85bDhpOHMuCisubTRldHIKKy5tZXRyb3BvbDJpCisubWU5dDhyOG84cDlvOWw4aThzOGU4cy4KKy5tZXRyb3BvbDRpc2UKKy5tZXRyb3BvbGlzMWU0cworLm1lOHQ5cjhvOXA4bzhsOWk5dDhhOG4uCisubWV0cm9wb2wxaXQKKy5tZXRyb3BvbGkzdGEybgorLm1ldHJvcG9saTF0YQorLm1lOHQ5cjhvOXA4bzhsOWk5dDhhOG44cy4KKy5tZXRyb3BvbGl0YTJuMXMyCisubWk4YzhyOG85ZThjOG85bjhvOG04aThjOHMuCisubTRpMWNyCisubWljcm80ZQorLm1pY3JvZTFjbworLm1pY3JvZWNvMm4KKy5taWNyb2VjbzNub21pYworLm1pY3JvZWNvbm9taTRjM3MyCisubWk5YzhyOG85ZjhpOGM4aDhlLgorLm1pY3JvMmZpCisubWljcm9mNGkyY2gKKy5taWNyb2ZpY2hlMgorLm1pOWM4cjhvOWY4aThjOGg4ZThzLgorLm1pY3JvZmljaDFlcworLm1pOGM4cjhvOW84cjhnOGE4bjlpOHM4bS4KKy5taWNyb28yCisubWljcm9vcmcyCisubWljcm9vcjFnYQorLm1pY3Jvb3JnYW41aXMKKy5taWNyb29yZ2EybgorLm1pY3Jvb3JnYW5pMnMxbQorLm1pOGM4cjhvOW84cjhnOGE4bjlpOHM4bThzLgorLm1pY3Jvb3JnYW40aXM0bTFzMgorLm1pOGw4bDlhOGc4ZS4KKy5tNGlsMWwKKy5taThsOWw4aTlsOGk4dDhlOHIuCisubWlsbDJpCisubWlsNGw0aTRsCisubWlsbGlsMWkKKy5taWxsMmlsMWl0CisubWlsbGlsMml0ZQorLm1pOG04ZThvOWc4cjhhOHA4aDhlOGQuCisubWltZW8yZworLm1pbWVvMWdyCisubWltZW9ncmFwaDRlZAorLm1pOG04ZThvOWc4cjhhOHA4aDhzLgorLm1pbWVvZ3JhNHA0aDFzMgorLm1pOG05aThjOXI4aThlOHMuCisubWltMWkKKy5taW00aTFjcgorLm1pbWljcmkyCisubWltaWNyMmllNAorLm1pOG45aThzLgorLm0yaW5pCisubWluMWlzCisubWk4bjhpOXM4eThtOXA4bzlzOGk4dThtLgorLm1pbmlzNHkKKy5taW5pc3k0bTFwCisubWluaXN5bTFwb3MKKy5taW5pc3ltcG81c2k0dQorLm1pOG44aTlzOHk4bTlwOG85czhpOGEuCisubWluaXN5bXBvczJpMWEKKy5taTluOHU4dDllOHIuCisubTRpbjF1CisubWk5bjh1OHQ5ZThzOHQuCisubWk4czljOGg4aThlOXY4bzh1OHM5bDh5LgorLm0yaXMxYworLm1pczNjaDIKKy5taXNjaDJpZTQKKy5taXNjaGlldm91MgorLm1pc2NoaWV2bzJ1cworLm1pc2NoaWV2b3VzMWwyCisubWlzY2hpZXZvdXMxbHkKKy5taTlzOGU4cjhzLgorLm00aXNlCisubWlzM2VyCisubWlzZTRyMXMyCisubWk5czhvOGc5YTltOHkuCisubWkyc28KKy5taXNvMWdhCisubWlzbzJnYW0KKy5tbzhkOWU4bDlsOGk4bjhnLgorLm1vMmQxCisubW9kZWwxbAorLm1vZGVsbDJpCisubW9kZWwybGluNAorLm1vOGw5ZTljOHU4bDhlLgorLm1vbGUxY3UKKy5tb2xlNGN1bAorLm1vbGVjdWw0ZQorLm1vOGw5ZTljOHU4bDhlOHMuCisubW9sZWN1bGVzMgorLm1vOG45YThyOGM4aDhzLgorLm1vMW4xYQorLm1vbmFyM2MKKy5tb24yYTJyCisubW9uYXIyY2gKKy5tb25hcmM0aDFzMgorLm1vOG44ZTh5OWw4ZThuOWQ4ZThyLgorLm1vbmV5bGVuMWRlCisubW84bjhlOHk5bDhlOG45ZDhlOHI4cy4KKy5tb25leWxlbmRlNHI1czIKKy5tbzhuOG85YzhoOHI4bzhtOGUuCisubW9ubzJjaDQKKy5tb25vYzRocjQKKy5tb25vY2hybzJtZQorLm1vOG44bzllOG45ZThyOWc4ZTh0OGk4Yy4KKy5tbzNub2UKKy5tb25vZW4xZXIKKy5tb25vZW5lcmcyCisubW9ub2VuZXIzZ2V0CisubW9ub2VuZXJnZXQxaWMKKy5tbzhuOW84aThkLgorLm1vbm9pMgorLm1vbm8yaWQKKy5tbzhuOG85cDhvOGw4ZS4KKy5tbzRub3AKKy5tbzhuOG85cDhvOGw4ZThzLgorLm1vbm9wb2xlczIKKy5tbzluOG84cDlvOGw4eS4KKy5tb25vcG8ybHkKKy5tbzhuOG85czhwOGw4aThuOGUuCisubW9ub3MxcDJsMgorLm1vbm9zcGxpNG4KKy5tb25vc3AxbDRpbmUKKy5tbzhuOG85czhwOGw4aThuOGU4cy4KKy5tb25vc3BsaTFuZXMKKy5tbzhuOG85czh0OHI4bzhmOGk4Yy4KKy5tb25vczV0CisubW9ub3N0NHIKKy5tb25vc3RybzJmaQorLm1vOW44bzh0OW85bjhpOGU4cy4KKy5tb25vMXRvCisubW8ybm90bzJuCisubW9ub3RvbjJpZTQKKy5tbzluOG84dDlvOW44bzh1OHMuCisubW9ubzR0b25vCisubW9ub3RvMW5vdTIKKy5tb25vdG9ubzJ1cworLm1vOXI4bzhuOWk4czhtLgorLm1vcm81bjRpcworLm1vcm8ybgorLm1vcm9uaTJzMW0KKy5tbzhzOXE4dThpOXQ4by4KKy5tb3MyCisubW9zcXUyCisubW9zcTJ1aTIKKy5tb3NxdWkxdG8KKy5tbzhzOXE4dThpOXQ4bzhzLgorLm1vc3F1aXRvczIKKy5tbzhzOXE4dThpOXQ4bzhlOHMuCisubXU4ZDlyOG84bzhtLgorLm11MWRyCisubXVkMXJvb20KKy5tdWRyb28yCisubXU4ZDlyOG84bzhtOHMuCisubXVkcm9vNG0xczIKKy5tdThsOXQ4aTlmOGE4YzllOHQ4ZThkLgorLjVtdTRsdAorLm11bDF0aTMKKy5tdWx0aWYyCisubXVsdGkxZmEKKy5tdWx0aWZhNGNlCisubXVsdGlmYWNldDQKKy5tdWx0aWZhY2UydDFlZAorLm11OGw5dDhpOXA4bDhpOGM5YThiOGw4ZS4KKy5tdWx0MmlwCisubXVsdGkxcDJsMgorLm11bHRpcGxpMWNhCisubXVsdGlwbGljYTFiMmwyCisubXU4bDh0OGk5dThzOGU4ci4KKy5tdWx0aTR1CisubXVsdGkydXMKKy5uZThvOWY4aThlOGw4ZDhzLgorLjNuZW8KKy5uZTVvZgorLm5lbzJmaQorLm5lb2YyaWU0CisubmVvZmllMmxkMworLm5lb2ZpZWwyZDFzMgorLm5lOG85bjhhOHo4aS4KKy5uZW8ybgorLm5lbzFuMWEKKy5uZW9uYTJ6MWkKKy5uZThvOW44YTh6OGk4cy4KKy5uZW9uYXo0aXMKKy5uZThwOGg5ZTh3OHMuCisubmVwaGU0CisubmU4cDhoOXI4aTh0OGUuCisubmVwNGhyNAorLm5lcGhyMml0ZQorLm5lOHA4aDlyOGk4dDhpOGMuCisubmVwaHI0aTJ0M2ljCisubmVwaHJpMXRpCisubmU4dzllOHM4dC4KKy5uZTR3CisubmV3ZXN0MworLm5lOHc4czlsOGU4dDl0OGU4ci4KKy5uZXdzNGwyCisubmV3czJsZQorLm5ld3NsZTR0M3QyCisubmU4dzhzOWw4ZTh0OXQ4ZThyOHMuCisubmV3c2xldHRlNHIxczIKKy5uaTh0OHI4bzltOGU4dDhoOWE4bjhlLgorLm4yaXQKKy5uaTN0cgorLm5pdHJvMm1lCisubml0cm80bWV0Cisubml0cm9tZXRoYTJuNAorLm5vOW44YThtOGUuCisubm80bgorLm5vMW4xYQorLm5vOG45YThyOWk4dDhoOW04ZTh0OWk4Yy4KKy5ub25hcjNpCisubm9uMmEycgorLm5vbmFyMml0aAorLm5vbmFyaXQ0aDFtCisubm9uYXJpdGhtZXQ0Cisubm9uYXJpdGhtZXQxaWMKKy5ubzhuOWU4bThlOHI5ZzhlOG44Yzh5LgorLm5vbmUxbWUKKy5ub25lbWVyZzIKKy5ub25lbWVyMWdlbgorLm5vbmVtZXJnZW4xY3kKKy5ubzhuOWU4cTh1OGk5djhhOHI4aTlhOG44YzhlLgorLm5vbmUycQorLm5vbmVxdTIKKy5ub25lcTJ1aTIKKy5ub25lcXUyaXYzCisubm9uZXF1aTF2YQorLm5vbmVxdWl2MmEycgorLm5vbmVxdWl2YXIxaQorLm5vbmVxdWl2YXIzaTJhMm4KKy5ub25lcXVpdmFyMmkzYQorLm5vbmVxdWl2YXI0aWFuYworLm5vOG44ZTl0OGg4ZTlsOGU4czhzLgorLm5vbmV0aDJlCisubm9uZXRoZTFsZXMyCisubm9uZXRoZTNsMmUyc3MKKy5ubzhuOWU4dThjOGw4aThkOWU4YThuLgorLm5vbjRldQorLm5vbmV1MWM0bDQKKy5ub25ldWNsMmlkCisubm9uZXVjbGlkZWEybgorLm5vOG45aThzOG85bThvOHI5cDhoOGk4Yy4KKy5ub241aQorLm5vbjFpcworLm5vbmkyc28KKy5ub25pM3NvbQorLm5vbmlzbzFtbworLm5vbmlzb21vMnIKKy5ub25pc29tb3IxcAorLm5vbmlzb21vcnA0aDQKKy5ub25pc29tb3JwaDFpYworLm5vOG45cDhzOGU4dThkOG85YzhvOG05cDhhOGM4dC4KKy5ub24xcDQKKy5ub24ycDFzMgorLm5vbnAyc2UKKy5ub25wczRldQorLm5vbnBzZXUxZG8KKy5ub25wc2V1ZG8xY28KKy5ub25wc2V1ZG9jbzRtMXAKKy5ub25wc2V1ZG9jb20xcGEKKy5ub25wc2V1ZG9jb21wYTJjNHQKKy5ubzhuOXM4bThvOG84dDhoLgorLm5vMm4zczIKKy5ub24yczNtCisubm9uczFtbworLm5vbnNtb28yCisubm9uc21vNG90aAorLm5vOG45dThuOGk5ZjhvOHI4bS4KKy5ubzNudTRuCisubm9udTFuaQorLm5vbnVuaTFmbworLm5vbnVuaWZvMnIKKy5ub251bmlmb3IxbQorLm5vOG45dThuOGk5ZjhvOHI4bTlsOHkuCisubm9udW5pZm9yNG0xbAorLm5vbnVuaWZvcm0xbHkKKy5ubzhyOWU4cDlpOW44ZThwOGg5cjhpOG44ZS4KKy5ub3JlNXBpMm4KKy5ub3JlcDJpbmUKKy5ub3JlcGluZXA0aHI0Cisubm9yZXAyaW5lcGhyMmluNGUKKy5ubzh0OXc4aTh0OGg5czh0OGE4bjhkOWk4bjhnLgorLm5vdHc0Cisubm90d2kyCisubm90dzJpdGgzCisubm90d2kydDRoMXMyCisubm90d2l0aDVzdDRhbmQKKy5ub3R3aXRoczF0YQorLm5vdHdpdGhzdGEybgorLm5vdHdpdGhzdGFuZDFpbgorLm51OWM4bDhlOG85dDhpOGQ4ZS4KKy5udWNsZTMKKy5udTFjNGw0CisubnVjbGU0b3QKKy5udWNsZW90MmlkCisubnU5YzhsOGU4bzl0OGk4ZDhlOHMuCisubnVjbGVvdGlkZTRzMgorLm51OHQ5YzhyOGE4YzhrOWU4ci4KKy5udTR0YworLm51dGNyYWNrMQorLm51dGNyYWNrMWVyCisubnU4dDljOHI4YThjOGs5ZThyOHMuCisubnV0Y3JhY2tlNHIxczIKKy5vZThyOXM4dDhlOGQ4cy4KKy5vM2VyCisub2U0cjFzMgorLm9lcnM0dDFlZAorLm9lcnN0ZTJkMXMyCisub2Y4ZjlsOGk4bjhlLgorLm80ZjFmCisub2ZmNGwyCisub2ZmbGluNAorLm9mZjFsNGluZQorLm9mOGY5bDhvOGE4ZC4KKy5vZmZsNG9hCisub2ZmbG9hMmQzCisub2Y4ZjlsOG84YThkOHMuCisub2ZmbG9hMmQxczIKKy5vZjhmOWw4bzhhOGQ4ZThkLgorLm9mZmxvYTJkMWVkCisub2w4aTlnOG84cDlvOWw4aThzOHQuCisub2wyaQorLm9sMmlnCisub2xpMmdvCisub2wyaWdvcG9sMmkKKy5vbDhpOWc4bzhwOW85bDhpOHM4dDhzLgorLm9saWdvcG9saXM0dDFzMgorLm9sOGk5ZzhvOHA5bzhsOHkuCisub2xpZ29wbzJseQorLm9sOGk5ZzhvOHA5bzhsOWk4ZThzLgorLm9saWdvcG9sMmllNAorLm9wOWU4cjlhOG44ZC4KKy5vcDFlcgorLjNvcGVyMWEKKy5vcDRlcjRhbmQKKy5vcGVyYTJuCisub3A5ZThyOWE4bjhkOHMuCisub3BlcmFuMmQxczIKKy5vcjhhOG44Zzl1OHQ4YThuLgorLm9yYTJuCisub3IyYW5nCisub3JhbjFndQorLm9yYW40Z3U0dAorLm9yYW5ndTF0YQorLm9yYTJuZ3V0YTJuCisub3I4YThuOGc5dTh0OGE4bjhzLgorLm9yYW5ndXRhMm4xczIKKy5vcjl0OGg4bzlkOG84bjl0OGk4czh0LgorLm9ydGhvMmRvNAorLm9ydGhvZG8ybgorLm9ydGhvZG9uM3Q0aQorLm9ydGhvZG9uMXQKKy5vcjl0OGg4bzlkOG84bjl0OGk4czh0OHMuCisub3J0aG9kb250aXM0dDFzMgorLm9yOXQ4aDhvOWs4ZThyOWE5dDhvOGw5bzhnOHkuCisub3J0aDJvaworLm9ydGhvazFlcgorLm9ydGhva2VyMWEKKy5vcnRob2tlcmExdG8KKy5vcnRob2tlcmF0b2wxbzFneQorLm9yOHQ4aDhvOW44aTh0OHI4bzl0OG84bDh1OGU4bjhlLgorLm9ydGhvMm4KKy5vcnRob24yaXQKKy5vcnRob25pM3RyCisub3J0aG9uaXRybzF0bworLm9ydGhvbml0cm90b2x1M2VuCisub3J0aG9uaXRyb3RvbHU0ZW5lCisub3Y4ZThyOXY4aThlOHcuCisub3ZlcnYyaWU0Cisub3Y4ZThyOXY4aThlOHc4cy4KKy5veDlpOGQ5aThjLgorLm94M2kKKy5veGk1ZGkKKy5veDJpZAorLnBhOGQ5ZDhpOG44Zy4KKy4xcGEKKy5wNGEyZAorLnBhZDRkMWluCisucGFkMWQ0CisucGE4aThuOWw4ZThzOHM5bDh5LgorLnA0YWkyCisucGE0aTRuNAorLnBhNGk0bjFsCisucGFpbmxlczIKKy5wYWluM2wyZTJzcworLnBhaW5sZXM0czFsMgorLnBhaW5sZXNzMWx5CisucGE4bDllOHQ4dDhlLgorLnA0YWwKKy5wMmFsZQorLnBhbGU0dDN0MgorLnBhOGw5ZTh0OHQ4ZThzLgorLnBhbGV0NHRlcworLnBhOHI5YTliOG84bDhhLgorLnAyYTJyCisucGEycmFiCisucGFyYWJvMWxhCisucGE4cjlhOWI4bzhsOWk4Yy4KKy5wYXJhYm9sM2ljCisucGFyYWJvbDJpCisucGE5cjhhOGI5bzlsOG84aThkLgorLnBhcmFib2xvaTIKKy5wYXJhYm9sbzJpZAorLnBhOHI5YTlkOGk4ZzhtLgorLnBhcmEyZAorLnBhcjJhZGkKKy5wYXJhZDJpZworLnBhcmFkaWcxbQorLnBhOHI5YTlkOGk4ZzhtOHMuCisucGFyYWRpZzRtMXMyCisucGE4cjhhOWM4aDh1OHQ4ZS4KKy5wYXJhMmNoCisucGFyYWNodTR0CisucGE4cjhhOWM4aDh1OHQ4ZThzLgorLnBhOHI4YTlkOGk5bThlOHQ4aDh5OGw5YjhlOG44ejhlOG44ZS4KKy5wYXJhZDRpbWV0CisucGFyYWRpbWV0aHkybDFiCisucGFyYWRpbWV0aHlsYjRlNG4zegorLnBhcmFkaW1ldGh5bGJlbjJ6ZQorLnBhcmFkaW1ldGh5bGJlbnplNG4KKy5wYThyOGE5ZjhsOHU4bzhyOG85dDhvOGw4dThlOG44ZS4KKy5wYXJhMmYKKy5wYXJhZjRsMgorLnBhcmFmbHUzbworLnBhcmFmbHVvM3IKKy5wYXJhZmx1b3JvMXRvCisucGFyYWZsdW9yb3RvbHUzZW4KKy5wYXJhZmx1b3JvdG9sdTRlbmUKKy5wYThyOGE5ZzhyOGE4cDhoOWU4ci4KKy5wYXJhMWdyCisucGFyYWc1cmEzcGg0ZXIKKy5wYThyOGE5bDhlOWc4YThsLgorLnBhcjNhbAorLnBhcjJhbGUKKy5wYXJhbDRlZ2FsCisucGFyYWxlMWdhCisucGE4cjlhOGw5bDhlOGw5aThzOG0uCisucGFyYWwxbAorLnBhcmFsMmxlCisucGFyYWwzbGVsCisucGFyYWxsZWwyaQorLnBhcmFsbGUybGlzCisucGFyYWxsZWxpMnMxbQorLnBhOHI4YTltOGE4ZzluOGU4dDlpOHM4bS4KKy5wYXI0YTFtYQorLnBhcmFtM2FnCisucGFyYTVtYWcxbgorLnBhcmFtYWduZXRpMnM0bQorLnBhOHI4YTltOGU4ZDhpOGMuCisucGFyYTJtZWQKKy5wYXJhbTRlZGkKKy5wYThyOGE5bThlOHQ4aDh5OGw5YThuOGk4czhvOGw4ZS4KKy5wYXJhbTNldAorLnBhcmFtZXRoeTNsYQorLnBhcmFtZXRoeWxhMm4KKy5wYXJhbWV0aHlsYW5pMnNvCisucGE5cjhhOG05ZTl0OHI4aTh6OGUuCisucGFyYW00ZXRyCisucGFyYW1ldHJpMnplCisucGE4cjhhOW04aThsOWk5dDhhOHI4eS4KKy5wYXIyYW1pCisucGFyYW1pbDFpCisucGFyYW0yaWwxaXQKKy5wYXJhbWlsaTF0YQorLnBhcmFtaWxpdDJhMnIKKy5wYThyOGE5bThvOHU4bjh0LgorLnBhcmEybW8KKy5wYXJhbW91MgorLnBhcmFtb3VuMXQKKy5wYTh0OGg5bzlnOGU4bjlpOGMuCisucDRhdGgKKy5wYXQ0aG8KKy5wYXRobzRnCisucGF0aG8xZ2U0CisucGF0aG8xZ2VuCisucGU4ZTh2OWk4czhoLgorLnA0ZWUKKy5wZWUxdmkKKy5wZWV2aXMyaAorLnBlOGU4djlpOHM4aDluOGU4czhzLgorLnBlZXZpczJoMW4KKy5wZWV2aXNoMW5lcworLnBlZXZpc2huMmUyc3MKKy5wZThuOXQ4YTlnOG84bi4KKy5wZW4xdAorLnBlbjF0YQorLnBlbnRhMmdvCisucGVudGFnbzJuMgorLnBlOG45dDhhOWc4bzhuOHMuCisucGVudGFnbzJuM3MyCisucGU5dDhyOG85bDhlOXU4bS4KKy5wZXRyb2w0ZXUKKy5waDhlOW44bzhtOWU5bjhvOG4uCisucGg0ZTNubworLnBoZTJuCisucGhlbm8ybWUKKy5waGVubzFtZW4KKy5waGVub200ZW5vCisucGhlbm9tZW5vNG4KKy5waDhlOG44eThsOWE4bDhhOW44aThuOGUuCisucGhlbnkzbGEKKy5waGVueWxhbGEybgorLnBoZW55bGFsYTVuMmluZQorLnBoZW55bGFsYW4xaW4KKy5waDhpOWw4YTh0OWU5bDhpOHM4dC4KKy5waGk0bGF0ZWwyaTQKKy5waGlsYXRlMmxpcworLnBoOGk5bDhhOHQ5ZTlsOGk4czh0OHMuCisucGhpbGF0ZWxpczR0MXMyCisucGg4bzluOGU4bThlLgorLjNwaG9uZQorLnBobzJuCisucGhvbmUxbWUKKy5waDhvOW44ZThtOGU4cy4KKy5waG9uZTJtZXMKKy5waDhvOW44ZTltOGk4Yy4KKy5waG9uZTVtaQorLnBoOG84czlwOGg4bzhyOWk4Yy4KKy5waG9zMXAKKy5waG9zcGhvNQorLnBob3NwaG80cgorLnBoOG85dDhvOWc4cjhhOHA4aDhzLgorLnBobzF0bworLnBob3RvMmdyCisucGhvdG9ncmE0cDRoMXMyCisucGg4bzl0OG85bzhmOGY5czhlOHQuCisucGhvdG9vMgorLnBob3RvbzRmMWYKKy5waG90b29mMmYzcworLnBpOGM5YTlkOG84ci4KKy5waTFjYQorLnBpY2EyZAorLnBpY2ExZG8KKy5waWNhZDRvcgorLnBpOGM5YTlkOG84cjhzLgorLnBpY2FkbzRyczIKKy5waThwOGU5bDhpOG44ZS4KKy5wMmlwCisucGlwZTQKKy5waXBlbDJpCisucGlwZTFsNGluZQorLnBpOHA4ZTlsOGk4bjhlOHMuCisucGlwZWxpMW5lcworLnBpOHA4ZTlsOGk4bjlpOG44Zy4KKy5waXBlbDJpbjNpCisucGlwZWxpbjFpbgorLnBpcGVsaW5pbjRnCisucGk5cjhhOW44aDhhOHMuCisucDRpcgorLnBpMXJhCisucGlyYTJuCisucGlyYTRuMWg0CisucGlyYW5oYTQKKy5wbDhhOGM4YTliOGw4ZS4KKy4xcDJsMgorLnBsYTFjYQorLnBsYWNhMWIybDIKKy5wbDhhOG44dDloOG84cDlwOGU4ci4KKy4zcGxhMm4KKy5wbGFuMXQKKy5wbGFudGhvNHAxcAorLnBsYW50aG9wMnBlCisucGxhbnRob3AzcGVyCisucGw4YThuOHQ5aDhvOHA5cDhlOHI4cy4KKy5wbGFudGhvcHBlNHIxczIKKy5wbDhlOGE4czlhOG44YzhlLgorLnBsZTJhCisucGxlYXNhMgorLnBsZWEzc2FuYworLnBsZWFzYTJuCisucGw4dThnOWk4bi4KKy5wbHVnNWluCisucGw4dThnOWk4bjhzLgorLnBsdTVnNGkybjFzMgorLnBvOGw5dDhlOHI5ZzhlOGk4czh0LgorLnBvNGwydAorLnBvbDF0ZQorLnBvbHRlcmcyCisucG9sdGVyZ2VpMgorLnBvOGw4eTllOG44ZS4KKy5wbzJseQorLnBvOGw4eTllOHQ4aDl5OGw5ZThuOGUuCisucG9seWU0dAorLnBvOWw4eThnOWE5bThpOHM4dC4KKy5wb2x5MWdhCisucG9seTJnYW0KKy5wb2x5Z2FtMmlzCisucG85bDh5OGc5YTltOGk4czh0OHMuCisucG9seWdhbWlzNHQxczIKKy5wbzhsOHk4ZzlvOG45aTl6OGE5dDhpOG84bi4KKy5wb2x5MWdvCisucG9seWdvMm4yCisucG9seWdvM25pCisucG9seWdvbml6YTEKKy5wb2x5Z29uaXphMXQyaW8KKy5wb2x5Z29uaXphdGlvMm4KKy5wbzlsOHk4cDhoOW85bjhvOHU4cy4KKy5wb2x5cGhvMm4KKy5wb2x5cGhvMW5vdTIKKy5wb2x5cGhvbm8ydXMKKy5wbzhsOHk5czh0OHk4cjhlOG44ZS4KKy5wbzJseXM0CisucG9seXMxdAorLnBvbHlzMnR5CisucG84bThlOWc4cjhhOG45YTh0OGUuCisucG8ybWUKKy5wb21lMmcKKy5wb21lMWdyCisucG9tZWdyYTJuMgorLnBvbWVncmExbmEKKy5wb21lZ3JhbjJhdAorLnBvOHI4bzllOGw4YThzOXQ4aThjLgorLjFwNG9yCisucG9ybzRlCisucG9ybzRlbAorLnBvcm9lMWxhCisucG9yb2VsYXN0MmkKKy5wb3JvZWxhczF0aWMKKy5wbzhyOW84dThzLgorLnBvcm91MgorLnBvcm8ydXMKKy5wbzhyOXQ4YTliOGw4ZS4KKy5wb3IxdGEKKy5wb3IydGFiCisucG9ydGFiMmwyCisucG84czh0OWE4bTliOGw4ZS4KKy4xcG9zCisucG9zMnRhCisucG9zdGE0bTFiCisucG9zdGFtYjJsMgorLnBvOHM4dDlhOG05YjhsOGU4cy4KKy5wb3N0YW1ibGVzMgorLnBvOHM4dDloOHU5bThvOHU4cy4KKy5wb3N0aHUxbW8KKy5wb3N0aHUzbW8ydXMKKy5wb3N0aHVtb3UyCisucG84czh0OXM4YzhyOGk4cDh0LgorLnBvczR0MXMyCisucG9zdDRzYworLnBvc3RzY3JpMgorLnBvc3RzY3IyaXAKKy5wb3N0c2NyaTJwMXQKKy5wbzhzOHQ5czhjOHI4aThwOHQ4cy4KKy5wb3N0c2NyaXA0dDFzMgorLnBvOHM5dDh1OHI5YThsLgorLnBvczF0dQorLnBvc3R1MXJhCisucHI4ZTlhOG05YjhsOGUuCisucHJlYTRtMWIKKy5wcmVhbWIybDIKKy5wcjhlOWE4bTliOGw4ZThzLgorLnByZWFtYmxlczIKKy5wcjhlOWw4bzhhOGQ4ZThkLgorLnByZWw0b2EKKy5wcmVsb2EyZDMKKy5wcmVsb2EyZDFlZAorLnByOGU5cDhhOHI5aThuOGcuCisucHJlMnBhCisucHJlcDRhNHIxaQorLnByZXAyYTJyCisucHJlcGFyaW40ZworLnByOGU5cDhyOGk4bjh0LgorLnByMmVwcjIKKy5wcmVwcmluNHQzCisucHI4ZTlwOHI4aThuOHQ4cy4KKy5wcmVwcmluNHQ0czIKKy5wcjhlOXA4cjhvOGM4ZThzOXM4bzhyLgorLnByZTNwcm8KKy5wcmVwcjJvYworLnByZXBybzFjZQorLnByZXByb2MyZTJzcworLnByZXByb2NlczFzbworLnByOGU5cDhyOG84YzhlOHM5czhvOHI4cy4KKy5wcmVwcm9jZXNzbzRyczIKKy5wcjhlOXM4cDhsOGk4dDl0OGk4bjhnLgorLnByZTFzcAorLnByZXMxcDJsMgorLnByZXNwbDFpdAorLnByZXNwbDRpNHQzdDIKKy5wcmVzcGxpdDJ0MWluCisucHI4ZTl3OHI4YThwLgorLnByZXdyYTQKKy5wcjhlOXc4cjhhOHA4cDhlOGQuCisucHJld3JhNHAxcAorLnByZXdyYXAycGUKKy5wcmV3cmFwNHAyZWQKKy5wcjhpOGU4czh0OWU4czhzOGU4cy4KKy41cHIyaTRlNAorLnByaTFlc3QKKy5wcmllczR0MmUyc3MKKy5wcmllc3Rlc3MxZTRzCisucHI4ZTh0OXQ4eTlwOHI4aThuOXQ4ZThyLgorLnByZTR0M3QyCisucHJldDF0eQorLnByMmV0dHlwcjIKKy5wcmV0dHlwcmluNHQzCisucHI4ZTh0OXQ4eTlwOHI4aThuOXQ4aThuOGcuCisucHJldHR5cHJpbnQyaQorLnByZXR0eXByaW40dDNpbmcKKy5wcmV0dHlwcmluMnQxaW4KKy5wcjhvOWM4ZTlkOHU4cjlhOGwuCisucHIyb2MKKy5wcm8xY2UKKy5wcm9jZTFkdQorLnByb2NlZHUxcmEKKy5wcjhvOGM4ZThzOHMuCisucHJvYzJlMnNzCisucHI4bzljOHU4cjlhOG44YzhlLgorLnByb2N1MXJhCisucHJvY3VyYTJuCisucHI4bzhnOWU5bjhpOGU4cy4KKy5wcm8xZ2UKKy5wcm8xZ2VuCisucHJvZ2U1bjJpZTQKKy5wcjhvOGc5ZTluOHkuCisucHJvNGdlbnkKKy5wcjhvOWc4cjhhOG05bThhOGI4bDhlLgorLnBybzFncgorLnByb2dyYW0xbQorLnByb2dyYW0xbWEKKy5wcm9ncmFtMm1hYgorLnByb2dyYW1tYWIybDIKKy5wcjhvOG05aTluOGU4bjh0LgorLnByb200aQorLnByb20xaW4KKy5wcm9tMmluZQorLnByb21pMW5lbgorLnByb21pbmVuMXQKKy5wcjhvOW04aThzOWM4dTlvOHU4cy4KKy5wcm9tMmlzCisucHJvbTJpczFjCisucHJvbWlzMWN1CisucHJvbWlzY3Uxb3UyCisucHJvbWlzY3VvMnVzCisucHI4bzhtOWk4czlzOG84cjh5LgorLnByb200aTJzMXMKKy5wcm9taXMxc28KKy5wcm9taXNzbzFyeQorLnByOG84bTlpOHM4ZS4KKy5wcm9tNGlzZQorLnByOG84bTlpOHM4ZThzLgorLnByb21pczFlNHMKKy5wcjhvOXA4ZThsOWw4ZThyLgorLnBybzNwZWwKKy5wcm9wZWwxbAorLnByb3BlbDJsZQorLnByOG85cDhlOGw5bDhlOHI4cy4KKy5wcm9wZWxsZTRyMXMyCisucHI4bzlwOGU4bDlsOGk4bjhnLgorLnByb3BlbGwyaQorLnByb3BlbDJsaW40CisucHI4bzloOGk4YjlpOXQ4aTh2OGUuCisucHJvMWgyCisucHJvaGliaTJ0CisucHJvaGliaTF0aQorLnByb2hpYmkxdDJpdgorLnByOG85aDhpOGI5aTl0OGk4djhlOWw4eS4KKy5wcm9oaWJpdGl2NGUxbHkKKy5wcjhvOXM4YzhpOHU4dDl0OG8uCisucHJvczJjCisucHJvczFjaQorLnByb3NjaTF1CisucHJvc2NpdTR0M3QyCisucHJvc2NpdXQ1dG8KKy5wcjhvOXQ4ZThzOHQ5ZThyLgorLnBybzF0CisucHJvNHRlcworLnByOG85dDhlOHM4dDllOHI4cy4KKy5wcm90ZXN0ZTRyMXMyCisucHI4bzl0OGU4czl0OG84ci4KKy5wcm90NGVzMnRvCisucHI4bzl0OGU4czl0OG84cjhzLgorLnByb3Rlc3RvNHJzMgorLnByOG85dDhvOWw4YThuOWc4dThhOGc4ZS4KKy5wcm8xdG8KKy5wcm90bzFsYQorLnByb3RvNGxhMm4KKy5wcm90b2wyYW5nCisucHJvdG9sYW4xZ3UKKy5wcm90b2xhbmd1NGEKKy5wcjhvOXQ4bzl0OHk4cDlhOGwuCisucHJvdG8xdHkKKy5wcm90b3R5MXBhCisucHJvdG90eXA0YWwKKy5wcjhvOHY5aThuOGM4ZS4KKy5wcm92MWluCisucHJvdjJpbmMKKy5wcjhvOHY5aThuOGM4ZThzLgorLnByOG85djhpOG45YzhpOGE4bC4KKy5wcm92aW4xY2kKKy5wcm92aW4zYzJpMWEKKy5wcm92aW5jaTJhbAorLnByOG84dzllOHM4cy4KKy5wcm93MmUyc3MKKy5wczhlOHU5ZDhvOWQ4aThmOWY4ZThyOWU4bjl0OGk4YThsLgorLjJwMXMyCisucDJzZQorLnBzNGV1CisucHNldTFkbworLnBzZXVkb2QxaWYKKy5wc2V1ZG9kaTRmMWYKKy5wc2V1ZG9kaWZmZXIxCisucHNldWRvZGlmZmVyM2VuMXQKKy5wc2V1ZG9kaWZmZXJlbnQyaQorLnBzZXVkb2RpZmZlcmVuMXQyaTFhCisucHNldWRvZGlmZmVyZW50aTJhbAorLnBzOGU4dTlkOG85ZjhpOW44aTh0OGUuCisucHNldTJkNW9mCisucHNldWRvMmZpCisucHNldWRvMmZpbgorLnBzZXVkb2YyaW5pCisucHNldWRvZmluMml0CisucHNldWRvZmluMml0ZQorLnBzOGU4dTlkOG85ZjhpOW44aTh0OGU5bDh5LgorLnBzZXVkb2Zpbml0ZTFseQorLnBzOGU4dTlkOG85ZjhvOHI4YzhlOHMuCisucHNldWRvMWZvCisucHNldWRvZm8ycgorLnBzZXVkb2ZvcjFjCisucHNldWRvZm9yMmNlCisucHM4ZTh1OWQ4bzhnOXI4YTlwOGg4ZThyLgorLnBzZXVkNG9nCisucHNldWRvMWdyCisucHNldWRvZzVyYTNwaDRlcgorLnBzOGU4dTlkOG85ZzhyOG84dThwLgorLnBzZXVkbzRnNHJvCisucHNldWRvZ3JvdTIKKy5wczhlOHU5ZDhvOWc4cjhvOHU4cDhzLgorLnBzZXVkb2dyb3UycDFzMgorLnBzOGU4dTlkOG85bjh5OG0uCisucHNldTRkbzJuCisucHNldWRvbnltNAorLnBzOGU4dTlkOG85bjh5OG04cy4KKy5wc2V1ZG9ueTRtMXMyCisucHM4ZTh1OWQ4bzl3OG84cjhkLgorLnBzZXVkbzR3bzIKKy5wczhlOHU5ZDhvOXc4bzhyOGQ4cy4KKy5wc2V1ZG93b3IyZDFzMgorLnBzOHk5YzhoOGU5ZDhlOGw5aThjLgorLnBzNHkKKy5wNHN5MWMKKy5wc3kzY2gKKy5wc3ljaDRlMgorLnBzeTRjaDRlZAorLnBzeWNoZWRlbDJpCisucHM4eThjOGg4cy4KKy5wc3ljNGgxczIKKy5wdTliOGU4czljOGU4bjhjOGUuCisucHViMworLnB1YjRlCisucHU0YmVzNAorLnB1YmVzMmMKKy5wdWJlczFjZW4KKy5wdWJlczNjZW5jCisucXU4YThkOWQ4aThuOGcuCisucXUyCisucXVhMmQKKy5xdWFkNGQxaW4KKy5xdWFkMWQ0CisucXU4YTlkOHI4YTh0OWk4Yy4KKy5xdWExZHIKKy5xdWFkcmF0MWljCisucXU4YTlkOHI4YTh0OWk4YzhzLgorLnF1YWRyYXRpNGMzczIKKy5xdThhOGQ5cjhhOXQ4dThyOGUuCisucXVhZHJhMnR1CisucXVhZHJhM3R1cmUKKy5xdThhOGQ5cjhpOXA4bDhlOGc5aThjLgorLnF1YWRyaTJwMmwyCisucXVhZHIyaXAKKy5xdWFkcmlwbGVnNGljCisucXU4YThpOG44dDllOHIuCisucXVhaTIKKy5xdWE0aTRuCisucXVhaW4xdAorLnF1OGE4aThuOHQ5ZThzOHQuCisucXU4YTlzOGk5ZThxOHU4aTh2OWE5bDhlOG44YzhlLgorLnF1YXMyaWU0CisucXVhc2llMXEKKy5xdTJhc2llcXUyCisucXVhc2llcTJ1aTIKKy5xdWFzaWVxdTJpdjMKKy5xdWFzaWVxdWkxdmEKKy5xdWFzaWVxdWl2MmFsZQorLnF1YXNpZXF1aXZhM2xlbmMKKy5xdThhOXM4aTllOHE4dThpOHY5YTlsOGU4bjhjOGU4cy4KKy5xdThhOXM4aTllOHE4dThpOHY5YTlsOGU4bjh0LgorLnF1YXNpZXF1aXZhMWxlbjF0CisucXU4YTlzOGk5aDh5OXA4bzluOG84cjltOGE4bC4KKy5xdWFzaTNoCisucXVhc2loeTNwbworLnF1YXNpaHlwbzJuCisucXVhc2loeXBvbm9yMW0KKy5xdWFzaWh5cG9ub3IxbWEKKy5xdThhOXM4aTlyOGE4ZDlpOWM4YThsLgorLnF1YXM0aTJyCisucXVhc2kxcjVhCisucXVhc2lyYTJkCisucXVhc2lyMmFkaQorLnF1YXNpcmFkM2kxY2EKKy5xdThhOXM4aTlyOGU4czhpOGQ5dThhOGwuCisucXVhc2k0cmVzCisucXVhc2lyZTFzaQorLnF1YXNpcmUyczJpZAorLnF1YXNpcmVzaTJkdQorLnF1YXNpcmVzaWQxdTFhCisucXU4YTlzOGk5czhtOG84bzh0OGguCisucXVhMXNpcworLnF1YXNpMnMxbQorLnF1YXNpczFtbworLnF1YXNpc21vbzIKKy5xdWFzaXNtbzRvdGgKKy5xdThhOXM4aTlzOHQ4YTl0OGk4bzhuOWE4cjh5LgorLnF1YXNpczF0YQorLnF1YXNpc3RhdGlvbjVhMnIKKy5xdWFzaXN0YTF0MmlvCisucXVhc2lzdGF0aW8ybgorLnF1YXNpc3RhdGlvMW4xYQorLnF1OGE5czhpOXQ4bzhwOG84cy4KKy5xdTVhNXNpNHQKKy5xdWFzaTF0bworLnF1YXNpdG8xcG9zCisucXU4YTlzOGk5dDhyOGk5YThuOWc4dTlsOGE4ci4KKy5xdWFzaTV0cjJpM2EKKy5xdWFzaXRyaTJhMm4KKy5xdWFzaXRyaTJhbmcKKy5xdWFzaXRyaWFuMWd1CisucXVhc2l0cmlhbmd1MWxhCisucXVhc2l0cmlhbmd1bDJhMnIKKy5xdThhOXM4aTl0OHI4aTh2OWk4YThsLgorLnF1YXNpdHIyaTR2CisucXVhc2l0cml2M2kKKy5xdWFzaXRyaXYyaTFhCisucXVhc2l0cml2aTJhbAorLnF1OGk4bjl0OGU4czlzOGU4bjhjOGUuCisucTJ1aTIKKy5xdWk0bgorLnF1aW4xdAorLnF1aW40dDJlMnNzCisucXVpbnRlczRzZW5jCisucXU4aThuOXQ4ZThzOXM4ZThuOGM4ZThzLgorLnF1OGk4bjl0OGU4czlzOGU4bjl0OGk4YThsLgorLnF1aW50ZXNzZW4xdAorLnF1aW50ZXNzZW50MmkKKy5xdWludGVzc2VuMXQyaTFhCisucXVpbnRlc3NlbnRpMmFsCisucmE4YjliOGk4dDlyOHkuCisuMnJhYgorLnJhMmIxYgorLnJhYmJpMnQKKy5yYWJiaTN0cgorLnJhYmJpdDVyeQorLnJhOWQ4aTlvOGc5cjhhOXA4aDh5LgorLnJhMmQKKy5yMmFkaQorLnJhM2QyaW8KKy5yYWRpbzVnCisucmFkaW8yZ3IKKy5yYWRpbzRnM3JhMXBoeQorLnJhOGY4ZjlpOHM4aC4KKy5yYWY1ZmkKKy5yYTJmCisucmE0ZjFmNAorLnJhZjJmNWlzCisucmFmZmlzMmgKKy5yYThmOGY5aThzOGg5bDh5LgorLnJhZmZpczRoMWw0CisucmFmZmlzaDFseQorLnJhOG05czhoOGE4YzhrOGw4ZS4KKy5yYTRtMXMyCisucmFtNHMyaAorLnJhbXNoYWNrMQorLnJhbXNoYWNrMWwKKy5yYTh2OWU4bjlvOHU4cy4KKy5yYXY0ZTRubworLnJhdmUxbm91MgorLnJhdmVubzJ1cworLnJlOWE4cjhyOGE4bjhnOGU5bThlOG44dC4KKy5yZTVhcjFyNAorLnJlMmEycgorLnJlYXJyYW40Z2UKKy5yZWFycmEybgorLnJlYXJyMmFuZworLnJlYXJyYW5nZTFtZQorLnJlYXJyYW5nZTFtZW4KKy5yZWFycmFuZ2UzbWVuMXQKKy5yZTlhOHI4cjhhOG44ZzhlOW04ZThuOHQ4cy4KKy5yZWFycmFuZ2VtZW40dDRzMgorLnJlOGM5aTlwOHI4bzhjOWk5dDhpOGU4cy4KKy5yZWNpcHJvY2kxdGkKKy5yZWNpcHJvY2l0MmllNAorLnJlOGM5dDhhOG45ZzhsOGUuCisucmVjNHRhMm4KKy5yZTJjMXQKKy5yZWN0NWFuZworLnJlYzF0YQorLnJlY3RhbjFnbDIKKy5yZWN0YW4xZ2xlCisucmU4Yzl0OGE4bjlnOGw4ZThzLgorLnJlY3RhbmdsZXMyCisucmU4Yzl0OGE4bjlnOHU5bDhhOHIuCisucmVjdGFuMWd1CisucmVjdGFuZ3UxbGEKKy5yZWN0YW5ndWwyYTJyCisucmU5ZDhpOXI4ZThjOHQuCisuMnIyZWQKKy5yNGVkaQorLnJlZDRpcjIKKy5yZWRpMXJlCisucmVkaXJlMmMxdAorLnJlOWQ4aTlyOGU4Yzh0OWk4bzhuLgorLnJlZGlyZWMxdDJpbworLnJlZGlyZWN0aW8ybgorLnJlOWQ4dThjOWk4YjhsOGUuCisucmUxZHUKKy5yZWR1MmMKKy5yZWR1Y2k0YgorLnJlZHUxY2kKKy5yZWR1Y2kxYjJsMgorLnJlOWU4YzhoOG8uCisucmVlMmMKKy5yZWUyY2gKKy5yZWUzY2hvMgorLnJlOXA4aDhyOGE4czhlLgorLnJlcDRocjQKKy5yZXBocjJhcworLnJlOXA4aDhyOGE4czhlOHMuCisucmVwaHJhczFlNHMKKy5yZTlwOGg4cjhhOHM4ZThkLgorLnJlcGhyYTRzNGVkCisucmU5cDhvOXM4aTl0OGk4bzhuLgorLnJlNHBvc2kKKy5yZTFwbworLnJlMXBvcworLnJlcG8zczJpMXQyaW8KKy5yZXBvc2kxdGkKKy5yZXBvc2l0aW8ybgorLnJlOXA4bzlzOGk5dDhpOG84bjhzLgorLnJlcG9zaXRpbzJuM3MyCisucmU5cDhyOGk4bjh0LgorLnJlcHIyCisucmVwcmluNHQzCisucmU5cDhyOGk4bjh0OHMuCisucmVwcmluNHQ0czIKKy5yZTlzOHQ4bzhyOWE4YjhsOGUuCisucjRlczJ0bworLnJlc3RvMnJhCisucmVzdG8ycmFiCisucmVzdG9yYWIybDIKKy5yZTh0OHI4bzlmOGk4dC4KKy5yZXRybzJmaQorLnJlOHQ4cjhvOWY4aTh0OXQ4ZThkLgorLnJldHJvZjRpNHQ0dDIKKy5yZXRyb2ZpdDJ0MWVkCisucmU5dThzOWE4YjhsOGUuCisucjRldTIKKy5yZTJ1czQKKy5yZXVzYTIKKy5yZXUyczFhYgorLnJldXNhYjJsMgorLnJlOXU4czhlLgorLnJlOXc4aThyOGUuCisucmV3aTIKKy5yZXc0aXI0CisucmU5dzhyOGE4cC4KKy5yZXdyYTQKKy5yZTl3OHI4YThwOHA4ZThkLgorLnJld3JhNHAxcAorLnJld3JhcDJwZQorLnJld3JhcDRwMmVkCisucmU5dzhyOGk4dDhlLgorLnJld3JpNAorLnJld3IyaXRlCisucmg4aTluOG84YzllOHI5bzhzLgorLnJoNAorLnJoMmkxbm8KKy5yaGk0bm80YworLnJoaW5vMWNlCisucmhpbm9jMmVybworLnJpOGc4aDh0OWU4bzh1OHMuCisucmlnaDF0ZW8KKy5yaWdodGVvdTIKKy5yaWdodGVvMnVzCisucmk4ZzhoOHQ5ZThvOHU4czluOGU4czhzLgorLnJpZ2h0ZW91czFuNAorLnJpZ2h0ZW91czFuZXMKKy5yaWdodGVvdXNuMmUyc3MKKy5yaThuOGc5bDhlOGE4ZDhlOHIuCisucmluNGcKKy5yaW5nbDIKKy5yaW4xZ2xlCisucmluZ2xlMmEKKy5yaW5nbGVhMmQxCisucmk4bjhnOWw4ZThhOGQ4ZThyOHMuCisucmluZ2xlYWRlNHI1czIKKy5ybzliOG84dC4KKy5ybzliOG84dDhzLgorLnJvYm80dDFzMgorLnJvOWI4bzh0OGk4Yy4KKy5ybzliOG84dDlpOGM4cy4KKy5yb2JvdGk0YzNzMgorLnJvOHU4bjhkOXQ4YThiOGw4ZS4KKy5yb3UyCisucm91bjJkCisucm91bmQxdGEKKy5yb3VuZDJ0YWIKKy5yb3VuZHRhYjJsMgorLnJvOHU4bjhkOXQ4YThiOGw4ZThzLgorLnJvdW5kdGE1YmxlczIKKy5zYThsOGU4czljOGw4ZThyOGsuCisuc2EyCisuczJhbGUKKy5zYWxlczIKKy5zYWxlczJjCisuc2FsZXNjbGU1Cisuc2FsZXMxYzRsNAorLnNhOGw4ZThzOWM4bDhlOHI4azhzLgorLnNhbGVzY2xlcjRrMXMyCisuc2E4bDhlOHM5dzhvOG04YThuLgorLnNhbGVzNHcyCisuc2FsZTRzMXdvMgorLnNhbGVzd29tMQorLnNhbGVzd28xbWEKKy5zYWxlc3dvbWEybgorLnNhOGw4ZThzOXc4bzhtOGU4bi4KKy5zYWxlc3dvMm1lCisuc2FsZXN3bzFtZW4KKy5zYThsOW04bzluOGU4bDlsOGEuCisuczRhMmw0bQorLnNhbG1vMm40Cisuc2FsMW1vCisuc2FsbW9uNGVsbGEKKy5zYWxtb25lbDFsCisuc2E4bDl0OGE5dDhpOG84bi4KKy5zYTRsNHQKKy5zYWwxdGEKKy5zYWx0YTF0MmlvCisuc2FsdGF0aW8ybgorLnNhOHI5czhhOXA4YThyOWk4bDlsOGEuCisuczJhMnIKKy5zYTJyNHNhMgorLnNhNHJzMgorLnNhcnMxYXAKKy5zMmEycnNhcDJhMnI0Cisuc2Fyc2ExcGEKKy5zYXJzYXA0YTRyMWkKKy5zYXJzYXBhcmlsMWwKKy5zYTh1OGU4cjlrOHI4YTh1OHQuCisuc2F1NAorLnNhdWVya3JhdTR0Cisuc2M4YTh0OW85bDhvOGc5aTljOGE4bC4KKy5zMWNhCisuc2NhMXRvCisuc2NhdG8zbG9nMWljCisuc2NhdG9sb2dpMWNhCisuc2M4aDhlOGQ5dThsOWk4bjhnLgorLnMyY2gyCisuc2NoZTIKKy5zNGNoNGVkCisuc2NoZTRkdWwKKy5zY2hlMWR1Cisuc2NoZWR1bDJpCisuc2NoZWR1bDNpbmcKKy5zYzhoOGk4ejlvOXA4aDhyOGU4bjhpOGMuCisuc2NoaTJ6Cisuc2NoaTF6bworLnNjaGl6Mm9waAorLnNjaGl6b3A0aHI0Cisuc2M4aDhuOGE4dTl6OGU4ci4KKy5zYzJoMW4KKy5zY2gxbmEKKy5zY2huMmF1Cisuc2NobmF1Mno0ZQorLnNjaG5hdXoxZXIKKy5zYzhoOG84bzhsOWM4aDhpOGw4ZC4KKy5zNGNobzIKKy5zY2hvbzIKKy5zY2hvbzRsMWMyCisuczJjaG9vbDJjaAorLnNjaG9vbGNoNGlsMgorLnNjaG9vbGNoaTJsZAorLnNjOGg4bzhvOGw5YzhoOGk4bDhkOXI4ZThuLgorLnNjaG9vbGNoaWwzZHIKKy5zY2hvb2xjaGlsZHJlNAorLnNjaG9vbGNoaWw1ZHJlbgorLnNjOGg4bzhvOGw5dDhlOGE4YzhoOGU4ci4KKy5zY2hvbzRsMnQKKy5zY2hvb2wxdGUKKy5zMmNob29sdGVhMmNoCisuc2Nob29sdGVhY2hlMgorLnNjOGg4bzhvOGw5dDhlOGE4YzhoOWU4cjhzLgorLnNjaG9vbHRlYWNoM2U0cjFzMgorLnNjOHI4dTl0OGk5bjh5LgorLnNjcnUydDFpNW4KKy5zY3I0dTF0MmkKKy5zY3J1dDRpbnkKKy5zYzh5OHQ4aDlpOG44Zy4KKy5zMWN5Cisuc2N5M3RoaW4KKy5zZThsOGw5ZThyLgorLnNlbDJsZQorLnNlOGw4bDllOHI4cy4KKy5zZWxsZTRyMXMyCisuc2U4YzlyOGU5dDhhOHI5aThhOHQuCisuc2UxY3IKKy5zZTRjM3JlMXRhCisuc2VjcmV0MmEycgorLnNlY3JldGFyMWkKKy5zZWNyZXRhcjJpM2EKKy5zZThjOXI4ZTl0OGE4cjlpOGE4dDhzLgorLnNlY3JldGFyaWE0dDFzMgorLnNlOG05YTlwOGg4bzhyOGUuCisuc2UxbWEKKy5zZTRtYXAKKy5zZW1hcGhvNHIKKy5zZThtOWE5cDhoOG84cjhlOHMuCisuc2U5bThlOHM5dDhlOHIuCisuNHNlMW1lCisuc2UybWVzCisuc2U4bThpOWQ4ZThmOWk5bjhpOHQ4ZS4KKy5zZW0yaWQKKy5zZW1pZGUxZgorLnNlbWlkZWY1aTVuMml0ZQorLnNlbWlkZTFmaQorLnNlbWlkZTJmaW4KKy5zZW1pZGVmMmluaQorLnNlbWlkZWZpbjJpdAorLnNlOG04aTlkOGk5cjhlOGM4dC4KKy5zZW1pMmRpCisuc2VtaWQ0aXIyCisuc2VtaWRpMXJlCisuc2VtaWRpcmUyYzF0Cisuc2U4bThpOWg4bzltOG85dDhoOGU4dDlpOGMuCisuc2VtaTNoCisuc2VtaWhvMW1vCisuc2VtaWhvbTRvdGgzCisuc2VtaWhvbW90aDJlCisuc2VtaWhvbW8zdGhlNHQKKy5zZW1paG9tb3RoZXQxaWMKKy5zZThtOGk5cjhpOG44Zy4KKy5zZW00aXIKKy5zZW1pcjFpCisuc2VtaXJpbjRnCisuc2U4bThpOXI4aThuOGc4cy4KKy5zZW1pcmluZ3MyCisuc2U4bThpOXM4aThtOXA4bDhlLgorLnNlNG0yaXMKKy5zZW1pc2k0bTFwCisuc2VtaXNpbTFwMmwyCisuc2U4bThpOXM4azhpOGw4bDhlOGQuCisuc2VtNGlzNGsyCisuc2VtaXNrMWkKKy5zZW1pc2s0aWwxbAorLnNlbWlza2lsMmxlCisuc2U4cjhvOWU4cDhpOWQ4ZTltOGk5bzlsOG84ZzlpOWM4YThsLgorLnMyZXI0bworLnNlcm80ZQorLnNlcm9lcDRpZAorLnNlcm9lcGkzZGUKKy5zZXJvZXBpZDRlbQorLnNlcm9lcGlkZW0yaW8KKy5zZXJvZXBpZGVtaTFvbAorLnNlcm9lcGlkZW1pbzNsb2cxaWMKKy5zZXJvZXBpZGVtaW9sb2dpMWNhCisuc2U4cjl2OG85bThlOGM4aDlhOG44aThzOG0uCisuNHNlcjN2bworLnNlcnZvMm1lCisuc2Vydm9tZTJjaAorLnNlcnZvbWVjaDVhNW5pcworLnNlcnZvbWVjaGEybgorLnNlcnZvbWVjaGFuaTJzMW0KKy5zZThyOXY4bzltOGU4YzhoOWE4bjhpOHM4bThzLgorLnNlcnZvbWVjaGFuNGlzNG0xczIKKy5zZThzOXE4dThpOXA4ZTlkOGE5bDhpOGE4bi4KKy5zMWU0cworLnNlc3F1MgorLnNlc3EydWkyCisuc2VzcXUyaXAKKy5zZXNxdWlwZTQKKy5zZXNxdWkycDJlZAorLnNlc3F1aXAyZTJkMmEKKy5zZXNxdWlwZWRhbDFpCisuc2VzcXVpcGVkYWwyaTFhCisuc2VzcXVpcGVkYWxpMmEybgorLnNlOHQ5dThwLgorLnNlMXR1Cisuc2U4dDl1OHA4cy4KKy5zZXR1MnAxczIKKy5zZTl2OGU4cjhlOWw4eS4KKy41c2V2Cisuc2V2MWVyCisuc2V2NGVyZWwKKy5zZXZlcmUxbHkKKy5zaDhhOHA4ZTlhOGI4bDhlLgorLnNoYTNwZTRhCisuc2hhcGUxYTRiCisuc2hhcGVhYjJsMgorLnNoOG84ZTlzOHQ4cjhpOG44Zy4KKy5zaG80Cisuc2hvMmVzdDRyCisuc2hvZXN0cmluNGcKKy5zaDhvOGU5czh0OHI4aThuOGc4cy4KKy5zaG9lc3RyaW5nczIKKy5zaThkOGU5czh0OGU4cC4KKy41c2lkZTRzMgorLnMyaWQKKy5zaWRlc3RlNHAKKy5zaThkOGU5czh0OGU4cDhzLgorLnNpZGVzdGUycDFzMgorLnNpOGQ4ZTlzOHc4aThwOGUuCisuc2lkZXM0dzIKKy5zaWRlc3dpMgorLnNpZGVzdzJpcAorLnNpZGVzd2lwZTQKKy5zazh5OXM4YzhyOGE4cDhlOHIuCisuc2syCisuc2t5czRjCisuc2t5c2NyYXAzZXIKKy5zazh5OXM4YzhyOGE4cDhlOHI4cy4KKy5za3lzY3JhcGU0cjFzMgorLnNtOG84azhlOXM4dDhhOGM4ay4KKy4yczFtCisuczFtbworLnM0bTJvaworLnNtb2tlczQKKy5zbW9rZXMxdGEKKy5zbW9rZXN0YWNrMQorLnNtOG84azhlOXM4dDhhOGM4azhzLgorLnNtb2tlc3RhYzRrMXMyCisuc244bzhyOWs4ZThsOWk4bjhnLgorLnMxbjQKKy5zbm9ya2U1bDJpCisuc25vcmtlNGwzaW5nCisuc285bDhlOW44bzhpOGQuCisuMXNvCisuc29sNGVubworLnNvbGVub2kyCisuc29sZW5vMmlkCisuc285bDhlOW44bzhpOGQ4cy4KKy5zb2xlbm9pMmQxczIKKy5zbzhsOHU4dDhlLgorLnNvMWx1dAorLnNvOGw4dTh0OGU4cy4KKy5zbzh2OWU4cjllOGk4ZzhuLgorLjRzb3YKKy5zb3ZlcmVpMgorLnNvdmVyZTJpZzIKKy5zbzh2OWU4cjllOGk4ZzhuOHMuCisuc292ZXJlaWcybjFzMgorLnNwOGE5YzhlOHMuCisuMnMxcGEKKy5zcGE0Y2UKKy5zcDhlOWM4aThvOHU4cy4KKy5zcGUyYworLnNwZTFjMmkKKy5zcGVjMmlvCisuc3BlY2lvdTIKKy5zcGVjaW8ydXMKKy5zcDhlOGw4bDllOHIuCisuc3BlbDFsCisuc3BlbDJsZQorLnNwOGU4bDhsOWU4cjhzLgorLnNwZWxsZTRyMXMyCisuc3A4ZThsOGw5aThuOGcuCisuc3BlbGwyaQorLnNwZWwybGluNAorLnNwOGU5bDh1OG44azllOHIuCisuc3BlbHU0bmsyCisuc3BlbHVuazFlcgorLnNwOGU4bjhkOXQ4aDhyOGk4Zjh0LgorLnNwZW40ZAorLnNwZW5kMnRoCisuc3BlbmR0NGhyNAorLnNwZW5kdGhyNGkyZnQKKy5zcDhoOGU4cjlvOGk4ZC4KKy5zMnBoZQorLjNzcGg0ZXIKKy5zcGgyZXJvCisuc3BoZXJvaTIKKy5zcGhlcm8yaWQKKy5zcDhoOGU4cjlvOGk4ZDlhOGwuCisuc3BoZXJvaTFkMmEKKy5zcDhoOGk4bjlnOGU4cy4KKy5zcGg1aW5nCisuc3BoNGluZ2UKKy5zcDhpOGM5aTlsOHkuCisuc3AyaTFjaQorLnNwaWNpMWx5Cisuc3A4aThuOW84cjhzLgorLnNwaTJuCisuc3A0aTFubworLnNwaW5vNHJzMgorLnNwOG84azhlOHM5dzhvOG04YThuLgorLnNwMm9rCisuc3Bva2VzNAorLnNwb2tlczR3MgorLnNwb2tlNHMxd28yCisuc3Bva2Vzd29tMQorLnNwb2tlc3dvMW1hCisuc3Bva2Vzd29tYTJuCisuc3A4bzhrOGU4czl3OG84bThlOG4uCisuc3Bva2Vzd28ybWUKKy5zcG9rZXN3bzFtZW4KKy5zcDhvOHI4dDhzOWM4YThzOHQuCisuczFwNG9yNAorLnNwb3I0dDFzMgorLnNwb3J0NHNjCisuc3BvcnRzMWNhCisuc3A4bzhyOHQ4czljOGE4czh0OWU4ci4KKy5zcG9ydHNjYXN0NWVyCisuc3A4bzhyOXQ4aTh2OGU5bDh5LgorLnNwb3IxdGkKKy5zcG9yNHQyaXYKKy5zcG9ydGl2NGUxbHkKKy5zcDhvOHI4dDhzOXc4ZThhOHIuCisuc3BvcnQ0c3cyCisuc3BvcnRzd2UyYTJyCisuc3A4bzhyOHQ4czl3OHI4aTh0OGU4ci4KKy5zcG9ydHN3cmk0Cisuc3BvcnRzd3IyaXRlCisuc3A4bzhyOHQ4czl3OHI4aTh0OGU4cjhzLgorLnNwb3J0c3dyaXQ1ZTRyMXMyCisuc3A4cjhpOGc4aDh0OWw4aThlOHIuCisuc3ByMgorLnNwcjJpZworLnNwcmlnaDJ0bAorLnNwcmlnaHRsMmllNAorLnNxOHU4ZThhOW04aThzOGguCisuc3F1MgorLnNxdWVhbTJpcworLnNxdWVhbWlzMmgKKy5zdDhhOG44ZDlhOGw4bzhuOGUuCisuNXN0NGFuZAorLnN0YTJuCisuc3RhbjFkMmEKKy5zdGFuZGFsbzJuCisuc3Q4YThyOXQ4bDhpOG44Zy4KKy5zdDJhMnIKKy5zdGFyMnRsCisuc3Q4YThyOXQ4bDhpOG44ZzlsOHkuCisuc3RhcnRsaW5nbDIKKy5zdGFydGxpbmcxbHkKKy5zdDhhOXQ4aThzOXQ4aThjOHMuCisuc3RhdGlzMXQyaQorLnN0YXRpczF0aWMKKy5zdGF0aXN0aTRjM3MyCisuc3Q4ZThhOGw4dDhoOWk4bDh5LgorLnN0ZWE0bAorLnN0ZWE0bHQKKy5zdGVhbHRoM2kKKy5zdGVhbDR0aDRpbDIKKy5zdGVhbHRoaTFseQorLnN0OGU4ZThwOGw4ZTljOGg4YThzOGUuCisuczF0ZWUKKy5zdGVlNHAxCisuc3RlZTFwMmwyCisuc3RlZXBsZTJjaAorLnN0OGU4cjhlOG85ZzhyOGE4cDhoOWk4Yy4KKy5zdGVyZTFvCisuc3RlcmVvMmcKKy5zdGVyZW8xZ3IKKy5zdGVyZW81Z3JhcGgxaWMKKy5zdGVyZW9ncjRhcGhpCisuc3Q4bzljOGg4YThzOXQ4aThjLgorLnMxdG8KKy5zdG8yY2g0Cisuc3RvY2hhc3QyaQorLnN0b2NoYXMxdGljCisuc3Q4cjhhOG44ZzhlOW44ZThzOHMuCisuc3Q0cgorLnMxdHJhCisuc3RyYW40Z2UKKy5zdHJhMm4KKy5zdHIyYW5nCisuc3RyYW5nZTRuNGUKKy5zdHJhbjFnZW4KKy5zdHJhbmdlMW5lcworLnN0cmFuZ2VuMmUyc3MKKy5zdDhyOGE4cDloOGE4bjhnOGU4ci4KKy5zdHJhcGgyYW40ZworLnN0cmFwaGFuZzVlcgorLnN0cmFwaGEybgorLnN0OHI4YTh0OWE5ZzhlOG0uCisuc3RyYTJ0YQorLnN0OHI4YTh0OWE5ZzhlOG04cy4KKy5zdHJhdGFnZTRtMXMyCisuc3Q4cjhlOHQ4YzhoOWk5ZThyLgorLnN0cmU0dGMKKy5zdHJldDRjaAorLnN0cmV0Y2gyaWU0Cisuc3Q4cjhpOHA5dDhlOGE4czhlLgorLnN0cjJpcAorLnN0cmkycDF0Cisuc3RyaXAydGUKKy5zdDhyOG84bjhnOWg4bzhsOGQuCisuc3RybzJuCisuc3Ryb25naG8ybDJkCisuc3Q4cjhvOG44ZzllOHM4dC4KKy5zdDh1OXA4aThkOWU4ci4KKy5zMXR1Cisuc3R1cDRpZAorLnN0dXBpM2RlCisuc3Q4dTlwOGk4ZDllOHM4dC4KKy5zdHVwaWRlNHMyCisuc3U4YjlkOGk4ZjlmOGU4cjllOG45dDhpOGE4bC4KKy4xc3UKKy5zdTRiMworLnN1NGIxZAorLnN1YmQxaWYKKy5zdWJkaTRmMWYKKy5zdWJkaWZmZXIxCisuc3ViZGlmZmVyM2VuMXQKKy5zdWJkaWZmZXJlbnQyaQorLnN1YmRpZmZlcmVuMXQyaTFhCisuc3ViZGlmZmVyZW50aTJhbAorLnN1OGI5ZTh4OXA4cjhlOHM5czhpOG84bi4KKy5zdWI0ZQorLnN1YjFleDNwCisuc3ViZXhwcjIKKy5zdWJleDNwcjJlMnNzCisuc3ViZXhwcmVzMXNpCisuc3ViZXhwcmVzMXMyaW8KKy5zdWJleHByZXM1c2lvMm4KKy5zdThiOWU4eDlwOHI4ZThzOXM4aThvOG44cy4KKy5zdWJleHByZXNzaW8ybjNzMgorLnN1OG05bThhOWI4bDhlLgorLnN1Mm0KKy5zdW0xbQorLnN1bTFtYQorLnN1bTJtYWIKKy5zdW1tYWIybDIKKy5zdThwOGU4cjllOGc4by4KKy5zdTFwZQorLnN1cGVyZTFnbworLnN1OHA4ZThyOWU4ZzhvOHMuCisuc3VwZXJlNGdvcworLnN1OXA4cjhlOG05YTljOGk4czh0LgorLnN1cHIyCisuc3VwcmU0bWFjCisuc3VwcmUxbWEKKy5zdXByZW00YTJjaQorLnN1OXA4cjhlOG05YTljOGk4czh0OHMuCisuc3VwcmVtYWNpczR0MXMyCisuc3U4cjl2OGU4aThsOWw4YThuOGM4ZS4KKy5zdTJyCisuc3VydjRlCisuc3VydmVpMgorLnN1cnZlaWwxbAorLnN1cnZlaWxsYTJuCisuc3c4aThtOW04aThuOGc5bDh5LgorLnN3MgorLnN3aTIKKy5zd2ltMW0KKy5zd2ltbTRpbmdsMgorLnN3aW1tNWluZzFseQorLnN5OG04cDl0OG85bThhOHQ4aThjLgorLnN5NG0xcAorLnN5bTJwMXQKKy5zeW1wMXRvCisuc3ltcHRvMm1hCisuc3ltcHRvbWF0MWljCisuc3k4bjljOGg4cjhvOW04ZThzOGguCisuc3luM2M0aHI0Cisuc3luMmNoCisuc3luY2hybzJtZQorLnN5bmNocm8ybWVzCisuc3luY2hyb200ZXMyaAorLnN5OG45YzhoOHI4bzluOG84dThzLgorLnN5bmNocm8ybgorLnN5bmNocm8xbm91MgorLnN5bmNocm9ubzJ1cworLnN5OG45YzhoOHI4bzl0OHI4bzhuLgorLnN5bmNocm90cm8ybgorLnRhOGY4ZjlyOGE4aThsLgorLjR0YTJmNAorLnRhNGYxZjQKKy50YWZmcjJhaTIKKy50YThsOGs5YTl0OGk4djhlLgorLnRhMmwKKy40dGFsaworLnRhbGthMworLnRhbGthNHQKKy50YWxrYTF0Mml2CisudGE5cDhlOHM5dDhyOHkuCisudGFwMmVzdDRyCisudGFwZTRzdHJ5CisudGE5cDhlOHM5dDhyOGk4ZThzLgorLnRhcGVzdHIyaWU0CisudGE4cjlwOGE4dTlsOGk4bi4KKy50MmEycgorLnRhcjJwCisudGFyMXBhCisudGFycGF1NGwyCisudGFycGF1bDJpCisudGE4cjlwOGE4dTlsOGk4bjhzLgorLnRhcnBhdWwyaTJuMXMyCisudGU5bDhlOGc5cjhhOXA4aDhlOHIuCisudGVsZTFncgorLnRlbGVnNXJhM3BoNGVyCisudGU5bDhlOGc5cjhhOXA4aDhlOHI4cy4KKy50ZWxlZ3JhcGhlNHIxczIKKy50ZThsOGU5azhpOW44ZTh0OWk4Yy4KKy50ZWxla2k0bgorLnRlbGVrMWkKKy50ZWxlazJpbmUKKy50ZWxla2kzbmV0MWljCisudGU4bDhlOWs4aTluOGU4dDlpOGM4cy4KKy50ZWxla2luZXRpNGMzczIKKy50ZThsOGU5cjhvOWI4bzh0OWk4YzhzLgorLnRlNGwxZXIKKy50ZWw0ZXJvCisudGVsZXI1b2IKKy50ZWxlcm9ib3RpNGMzczIKKy50ZThsOGw5ZThyLgorLnRlbDFsCisudGVsMmxlCisudGU4bDhsOWU4cjhzLgorLnRlbGxlNHIxczIKKy50ZThtOXA4bzlyOGE4cjlpOGw4eS4KKy50ZTRtMXAKKy50ZW0xcDRvcgorLnRlbXBvMXJhCisudGVtcG80cmFyaWwKKy50ZW1wb3IyYTJyCisudGVtcG9yYXIxaQorLnRlbXBvcmFyaTFseQorLnRlOG45dThyOGUuCisudGU4czh0OWI4ZThkLgorLnRlczJ0MWIKKy50ZXN0NGJlMmQKKy50ZTh4OHQ5dzhpOGQ4dDhoLgorLjN0ZXgKKy50ZXgxdDIKKy50ZXh0dzQKKy50ZXh0d2kyCisudGV4dHcyaWQKKy50ZXh0d2lkMnRoCisudGg4YThsOWE5bTh1OHMuCisudGhhM2xhCisudGhhbGEzbQorLnRoYWxhMW11CisudGhhbGFtMnVzCisudGg4ZThyOW04bzllOGw4YThzOXQ4aThjLgorLnRoMmUKKy50aGVyM200CisudGhlcjFtbworLnRoZXJtbzRlbAorLnRoZXJtb2UxbGEKKy50aGVybW9lbGFzdDJpCisudGhlcm1vZWxhczF0aWMKKy50aThtOGU5czh0OGE4bThwLgorLnRpMm1lcworLnRpbWVzMXRhCisudGltZXN0YTRtMXAKKy50aThtOGU5czh0OGE4bThwOHMuCisudGltZXN0YW0ycDFzMgorLnRvOG84bDlrOGk4dC4KKy50b28yCisudG9vbGsxaQorLnRvOG84bDlrOGk4dDhzLgorLnRvb2xraTR0MXMyCisudG84cDhvOWc4cjhhOHA4aDlpOWM4YThsLgorLnRvNXBvNGcKKy50b3BvMWdyCisudG9wbzVncmFwaDFpYworLnRvcG9ncjRhcGhpCisudG9wb2dyYXBoaTFjYQorLnRvOHE4dThlOHMuCisudG8xcQorLnRvcXUyCisudHI4YThpOXQ4bzhyOW84dThzLgorLjF0cmEKKy50cjJhaTIKKy50cmFpMXRvCisudHJhaXRvcm91MgorLnRyYWl0b3JvMnVzCisudHI4YThuOHM5YzhlOGk4djhlOHIuCisudHJhMm4KKy50cmEybjFzMgorLnRyYW5zNGMKKy50cmFuNHMzY2VpMgorLnRyYW5zY2UyaXYKKy50cjhhOG44czljOGU4aTh2OGU4cjhzLgorLnRyYW5zY2VpdmU0cjFzMgorLnRyOGE4bjhzOWc4cjhlOHM4cy4KKy50cmFuMnMzZworLnRyYW5zMWdyCisudHJhbnNncjJlMnNzCisudHI4YThuOHM5djhlOHI5czhhOGwuCisudHJhbjRzdgorLnRyYW5zdmU0cjFzMgorLnRyYW5zdmVyMXNhMgorLnRyOGE4bjhzOXY4ZThyOXM4YThsOHMuCisudHJhbnN2ZXJzYTJsMXMyCisudHI4YThuOHM5djhlOHM5dDhpOHQ4ZS4KKy50cmFuc3Y0ZTJzCisudHJhbnN2ZXN0MmkKKy50cmFuc3Zlc3QyaXRlCisudHI4YThuOHM5djhlOHM5dDhpOHQ4ZThzLgorLnRyYW5zdmVzdGl0NGVzCisudHI4YTl2OGU4cjhzOWE5YjhsOGUuCisudHJhdmU0cjFzMgorLnRyYXZlcjFzYTIKKy50cmF2ZXIyczFhYgorLnRyYXZlcnNhYjJsMgorLnRyOGE5djhlOHI5czhhOGwuCisudHI4YTl2OGU4cjlzOGE4bDhzLgorLnRyYXZlcnNhMmwxczIKKy50cjhpOWU4dDhoOHk4bDlhOG04aThuOGUuCisudHJpNWV0CisudHIyaWU0CisudHJpZXRoeTNsYQorLnRyaWV0aHlsYW0xaW4KKy50cmlldGh5bGFtMmluZQorLnRyOGU4YThjOGg5ZThyOGk4ZThzLgorLnRyZWEyY2gKKy50cmVhY2hlMgorLnRyZWFjaGVyMWkKKy50cmVhY2hlcjJpZTQKKy50cjhvOHU5YjhhOWQ4bzh1OHIuCisudHJvdTIKKy50cm91YmEyZAorLnRyb3ViYTFkbworLnRyb3ViYWRvdTIKKy50dThyOWs4ZTh5LgorLjF0dQorLnR1OHI5azhlOHk4cy4KKy50dXJrZXlzNAorLnR1OHI4bjlhOHI4bzh1OG44ZC4KKy50dXI0bjJhMnIKKy50dXIxbmEKKy50dXJuYXJvdTIKKy50dXJuYXJvdW4yZAorLnR1OHI4bjlhOHI4bzh1OG44ZDhzLgorLnR1cm5hcm91bjJkMXMyCisudHk4cDlhOGwuCisuMXR5CisudHkxcGEKKy50eXA0YWwKKy51bjlhOHQ5dDhhOGM4aDhlOGQuCisudW4yYXQ0CisudW5hNHQzdDIKKy51bmF0MXRhCisudW5hdHRhMmNoCisudW5hdHRhY2hlMgorLnVuYXR0YTRjaDRlZAorLnVuOWU4cjhyOWk4bjhnOWw4eS4KKy51bjRlcgorLnVuZXI0cjQKKy51bmVycmluNGcKKy51bmVycmluZ2wyCisudW5lcnJpbmcxbHkKKy51bjlmOHI4aThlOG44ZDlsOHkuCisudW4zZgorLnVuZnJpMgorLnVuZnIyaWU0CisudW5mcmllbjJkMWx5CisudW45ZjhyOGk4ZThuOGQ5bDhpOWU4ci4KKy51bmZyaWVuZGwyaWU0CisudmE4Zzh1OGU4ci4KKy4xdmEKKy52YWc0CisudmE1Z3VlcgorLnZhMmd1ZQorLnZhOHU4ZDhlOXY4aThsOGw4ZS4KKy52YXVkZTF2NAorLnZhdWRlMnYzaTRsCisudmF1ZGUxdmkKKy52YXVkZXZpbDFsCisudmF1ZGV2aWwybGUKKy52aThjOWE4cjhzLgorLnY0aWMyYTJyCisudmkxY2EKKy52aWNhNHJzMgorLnZpOGw5bDhhOGk4bjllOHM4cy4KKy4ydmlsCisudmlsMWwKKy52aWxsYWkyCisudmlsbGE0aTRuCisudmlsbGEyaW5lCisudmlsbGFpNW4yZTJzcworLnZpbGxhaTFuZXMKKy52aThzOXU4YThsLgorLnZpM3N1CisudmlzdTFhbAorLnZpOHM5dThhOGw5bDh5LgorLnZpc3VhbDFsCisudmlzdWFsMWx5Cisudmk5djhpOHA5YTlyOG84dThzLgorLjN2Mml2Cisudml2Mmk0cAorLnZpdmkxcGEKKy52aXZpcDJhMnIKKy52aXZpcGFyb3UyCisudml2aXBhcm8ydXMKKy52bzhpOGM4ZTlwOHI4aThuOHQuCisudm9pNAorLnZvaTNjZXAKKy52b2ljZXByMgorLnZvaWNlcHJpbjR0MworLnZzOHA4YThjOGUuCisudjJzMXBhCisudnNwYTRjZQorLndhOGQ5ZDhpOG44Zy4KKy53YTJkCisud2FkNGQxaW4KKy53YWQxZDQKKy53YThsOGw5ZjhsOG84dzhlOHIuCisud2FsMWwKKy53YWwybGYKKy53YWxsZjRsMgorLndhbGxmbG93MWVyCisud2E4bDhsOWY4bDhvOHc5ZThyOHMuCisud2FsbGZsb3dlNHIxczIKKy53YThyOG05ZThzOHQuCisudzJhMnIKKy53YXIxbQorLndhcjJtZQorLndhcjJtZXMKKy53YThzOHQ4ZTl3OGE4dDhlOHIuCisud2FzNHQKKy53YXN0ZTJ3Cisud2FzdGUxdzVhCisud2FzdGV3YTF0ZQorLndhOHY4ZTlnOHU4aThkOGUuCisud2F2ZWczCisud2F2ZWcydWkyCisud2F2ZWd1MmlkCisud2E4djhlOWc4dThpOGQ4ZThzLgorLndhdmVndWlkZTRzMgorLndhOHY4ZTlsOGU4dC4KKy53YTh2OGU5bDhlOHQ4cy4KKy53YXZlbGU0dDFzMgorLndlOGI5bDhpOGs4ZS4KKy53MmUxYgorLndlYjJsMgorLndlYjNsNGlrCisud2U4ZThrOW44aThnOGg4dC4KKy53ZWVrbjJpZworLndlOGU4azluOGk4ZzhoOHQ4cy4KKy53ZWVrbmlnaDR0MXMyCisud2g4ZThlOGw5YzhoOGE4aThyLgorLndoZWU0bDFjMgorLndoZWVsMmNoCisud2hlZWxjaGFpMgorLndoZWVsY2hhNGlyCisud2g4ZThlOGw5YzhoOGE4aThyOHMuCisud2hlZWxjaGFpNHJzMgorLndoOGk4YzhoOWU4djhlOHIuCisud2hpNAorLndoNGkyY2gKKy53aGljaGUyCisud2hpY2hldjFlcgorLndoOGk4dDhlOXM4aThkOGU4ZC4KKy53aDJpdGUKKy53aGl0NGVzCisud2hpdGUxc2kKKy53aGl0ZTJzMmlkCisud2hpdGVzaTJkMWVkCisud2g4aTh0OGU5czhwOGE4YzhlLgorLndoaXRlMXNwCisud2hpdGUyczFwYQorLndoaXRlc3BhNGNlCisud2g4aTh0OGU5czhwOGE4YzhlOHMuCisud2k4ZDhlOXM4cDhyOGU4YThkLgorLncyaWQKKy53aWRlNHMyCisud2lkZTFzcAorLndpZGVzNHByZQorLndpZGVzcHIyCisud2lkZXNwcmVhMmQxCisud2k4bjhnOXM4cDhhOG4uCisud2luNGcKKy53aW5nczIKKy53aW5nMnMxcGEKKy53aW5nc3BhNG4KKy53aThuOGc5czhwOGE4bjhzLgorLndpbmdzcGEybjFzMgorLndpOG44ZzlzOHA4cjhlOGE4ZC4KKy53aW5nc3ByMgorLndpbmdzcHJlYTJkMQorLndpOHQ4YzhoOWM4cjhhOGY4dC4KKy53aTR0YworLndpdDRjaAorLndpdGNoY3JhMmY0dAorLndpdGNoY3JhMmYKKy53bzhyOGQ5czhwOGE4YzlpOG44Zy4KKy4xd28yCisud29yMmQxczIKKy53b3JkczRwCisud29yZDJzMXBhCisud29yZHNwNGEyY2kKKy53b3Jkc3BhMmMxaW4KKy53b3Jkc3BhYzFpbmcKKy53bzhyOGs5YThyOG84dThuOGQuCisud29yazJhMnIKKy53b3JrYXJvdTIKKy53b3JrYXJvdW4yZAorLndvOHI4azlhOHI4bzh1OG44ZDhzLgorLndvcmthcm91bjJkMXMyCisud284cjhrOWg4bzhyOHM4ZS4KKy53b3JraDQKKy53b3JraG9yNHNlCisud29ya2hvNHJzMgorLndvOHI4azloOG84cjhzOGU4cy4KKy53b3JraG9yczNlNHMKKy53cjhhOHA5YThyOG84dThuOGQuCisud3JhNAorLndyYXAyYTJyNAorLndyYTFwYQorLndyYXBhcm91MgorLndyYXBhcm91bjJkCisud3I4ZTh0OGM4aDllOGQuCisud3JlNHRjCisud3JldDRjaAorLndyZXRjaGUyCisud3JldDRjaDRlZAorLndyOGU4dDhjOGg5ZThkOWw4eS4KKy53cmV0Y2hlMmQxbHkKKy55ZThzOXQ4ZThyOXk4ZThhOHIuCisueWVzNAorLnllc3RlcnllMmEycgorLmFsOWc4ZTliOHI4YThpOXM4YzhoOGUuCisuYWxnZWJyYTJpczFjCisuYWxnZWJyYWlzM2NoMgorLmFsZ2VicmFpc2NoZTIKKy5hbDlsOGU5ZzhoOGU5bjh5LgorLmFsMWwKKy5hbDJsZQorLmFsM2xlZworLmFsbGVnaGUybgorLmFyOWs4YThuOXM4YThzLgorLmFya2EybgorLmFya2FuMnNhMgorLmFya2EybjFzMgorLmF0OHA5YThzOGUuCisuYTR0MXAKKy5hdDFwYQorLmF0OHA5YThzOGU4cy4KKy5hdHBhczFlNHMKKy5hdThzOXQ4cjhhOGw5YThzOGk4YThuLgorLmEydXMKKy5hdXMxdDRyCisuYXVzMXRyYQorLmF1c3RyYWxhczJpMWEKKy5hdXN0cmFsYXNpMmEybgorLmF1OHQ4bzltOGE4dDhpOXM4aThlOHI5dDhlOHIuCisuYXV0b21hM3RpcworLmF1dG9tYXRpczJpZTQKKy5hdXRvbWF0aXNpZXJ0M2VyCisuYmU5ZDhpOGU5bjh1OG44Zy4KKy40YmUyZAorLmI0ZTNkaQorLmJlNWRpM2VuCisuYmVkMmllNAorLmJlZGllM251NG4KKy5iZThtOGI4by4KKy40YmU1bQorLmJlNG01YgorLmJpOGI5bDhpOW85ZzhyOGE5cDhoOGk5czhjOGg4ZS4KKy5iaWJsaW9ncjRhcGhpCisuYmlibGlvZ3JhcGgyaXMxYworLmJpYmxpb2dyYXBoaXMzY2gyCisuYmlibGlvZ3JhcGhpc2NoZTIKKy5ibzhzOXQ4bzhuLgorLjVib3M0CisuYm9zMXRvCisuYm9zdG8ybgorLmJyOG84dzhuOWk4YThuLgorLmJyb3duNWkKKy5icm93M240aTFhCisuYnJvd25pM2EybgorLmJyOHU4bjhzOXc4aThjOGsuCisuYnJ1Mm4KKy5icnUybjNzNAorLmJydW40c3cyCisuYnJ1bnN3aTIKKy5icnVuc3dpY2sxCisuYnU5ZDhhOXA4ZThzOHQuCisuYnUxZDJhCisuY2E4cjlpOGI5YjhlOGE4bi4KKy5jYXIxaQorLmNhcjRpYgorLmNhcmkyYjFiCisuY2FyaWIyYmUKKy5jYXJpYmJlYTJuCisuY2g4YThyOGw4ZThzOXQ4bzhuLgorLmNoYXI0bGU0CisuY2hhcjFsCisuY2hhcmxlczIKKy5jaGFybDRlczJ0bworLmNoYXJsZTNzdG8ybgorLmNoOGE4cjlsOG84dDh0OGU4czl2OGk4bDhsOGUuCisuY2hhcjNsbzQKKy5jaGFybG80dDN0MgorLmNoYXJsb3Q0dGVzCisuY2hhcmxvdHRlNHN2CisuY2hhcmxvdHRlczJ2aWwKKy5jaGFybG90dGVzdmlsMWwKKy5jaGFybG90dGVzdmlsMmxlCisuY285bDh1OG05YjhpOGEuCisuY29sdW00YmkKKy5jb2x1NG0xYgorLmNvbHVtYjJpMWEKKy5jejhlOGM4aDhvOXM4bDhvOXY4YTlrOGk4YS4KKy5jMnplNAorLmN6ZTJjaAorLmN6ZTNjaG8yCisuY3plY2hvczRsMgorLmN6ZWNob3M0bG92CisuY3plY2hvc2xvMXZhCisuY3plY2hvc2xvdmFrMWkKKy5jemVjaG9zbG92YWsyaTFhCisuZGU4bDlhOXc4YThyOGUuCisuZGUxbGEKKy5kZTRsYXcKKy5kZWxhdzJhMnIKKy5kaThqOGs5czh0OHI4YS4KKy5kaTNqCisuZGlqNGsxczIKKy5kaWprc3Q0cgorLmRpamtzMXRyYQorLmR1OGE4bjhlLgorLmQxdTFhCisuZHVhMm4KKy5keTluOGE5bThpOXM4YzhoOGUuCisuNWR5bgorLmR5MW5hCisuZHluYW0yaXMKKy5keW5hbTJpczFjCisuZHluYW1pczNjaDIKKy5keW5hbWlzY2hlMgorLmVuOGc5bDhpOHM4aC4KKy5lbmdsMgorLmVuZ2xpczJoCisuZXU4bDhlOHI5aThhOG4uCisuZXVsNGUKKy5ldTNsNGVyMWkKKy5ldWxlMXIyaTNhNAorLmV1bGVyaTJhMm4KKy5ldjhhOG45czh0OG84bi4KKy5lMXZhCisuZXZhMm4KKy5ldmFuNHN0CisuZXZhMm4xczIKKy5ldmFuczF0bworLmV2YW5zdG8ybgorLmZlOGI5cjh1OWE4cjh5LgorLmYyZTRiCisuZmUzYnIKKy5mZWJydTNhCisuZmVicnUyYTJyCisuZmU4czh0OXM4YzhoOHI4aThmOHQuCisuZmVzNHQxczIKKy5mZXN0NHNjCisuZmVzdHMyY2gyCisuZmVzdHNjNGhyNAorLmZlc3RzY2hyNGkyZnQKKy5mbDhvOHI5aTlkOGEuCisuZmxvcjJpZAorLmZsb3JpMWQyYQorLmZsOG84cjlpOWQ5aThhOG4uCisuZmxvcmkyZGkKKy5mbG9yaWQ1aTJhMm4KKy5mbG9yaTFkNGkzYQorLmZvOHI5czhjOGg4dThuOGc4czlpOG45czh0OGk5dDh1OHQuCisuZm9yczRjCisuZm9yczJjaDIKKy5mb3JzY2h1bmdzMgorLmZvcnNjaHVuZzJzMWluCisuZm9yc2NodW5nczJpMm4xczIKKy5mb3JzY2h1bmdzaW5zdDJpCisuZm9yc2NodW5nc2luc3RpMXR1CisuZnI4ZThlOWI4czhkLgorLmZyZTJlMWIKKy5mcmVlMmI1czIKKy5mcmVlYjRzNWQKKy5mdThuOGs5dDhzOGk4bzhuOGE4bC4KKy4zZnUKKy5mdTRuazIKKy5mdW5rNXQKKy5mdW5rNHQxczIKKy5mdW5rdDFzMmlvCisuZnVua3Q1c2lvMm4KKy5mdW5rdHNpbzFuNWEKKy5nYTh1OHM4czlpOGE4bi4KKy5nYTJ1cworLmdhdTJzcworLmdhdXMxc2kKKy5nYXVzczJpMWEKKy5nYXVzc2kyYTJuCisuZ2g4bzhzOHQ5czhjOHI4aThwOHQuCisuZ2hvczR0MXMyCisuZ2hvc3Q0c2MKKy5naG9zdHNjcmkyCisuZ2hvc3RzY3IyaXAKKy5naG9zdHNjcmkycDF0CisuZ2g4bzhzOHQ5djhpOGU4dy4KKy5naG9zNHR2CisuZ2hvc3R2MmllNAorLmdyOGE4czhzOW04YThuOG45aThhOG4uCisuZ3IyYXMKKy5ncmEyc3MKKy5ncmFzMnMxbQorLmdyYXNzM21hCisuZ3Jhc3NtYTJuMworLmdyYXNzbWE0bjFuMgorLmdyYXNzbWFuM240aTFhCisuZ3Jhc3NtYTJubmkzYTJuCisuZ3I4ZThpOGY4czl3OGE4bDhkLgorLmdyZWkyCisuZ3JlaTJmM3MKKy5ncmVpZnN3MgorLmdyZWlmc3dhMmxkCisuZ3I4bzh0OGg4ZThuOWQ4aThlOGM4ay4KKy5nNHJvCisuZ3JvNHRoMmUKKy5ncjRvdGgKKy5ncm90aGUybgorLmdyb3RoZW5kMmllNAorLmdyb3RoZW5kaWVjazEKKy5ncjh1OG44ZDlsOGU4aDlyOGU4bi4KKy5ncnUybgorLmdydW5kbGUxaDQKKy5ncnVuZGxlNGhyNAorLmhhOWQ4YTltOGE4cjhkLgorLmhhMmQKKy5oYTFkMmEKKy5oYWRhMm0yCisuaGFkNGExbWEKKy5oYWRhbTJhMnIKKy5oYThpOWY4YS4KKy5oYWkxZmEKKy5oYThtOGk4bDl0OG84bjlpOGE4bi4KKy5oYTRtCisuaGFtaTRsdAorLmhhbWlsMXRvCisuaGFtaWx0bzJuCisuaGFtaWx0bzNuNGkxYQorLmhhbWlsdG9uaTNhMm4KKy5oZThsOXM4aThuOGs4aS4KKy5oZTJsMXMyCisuaGVsMnMxaW4KKy5oZWxzNGk0bmsyCisuaGVsc2luazFpCisuaGU4cjltOGk4dDlpOGE4bi4KKy5oZXIzbWl0CisuaGVybWkxdGkKKy5oZXJtNGkxdDJpMWEKKy5oZXJtaXRpMmEybgorLmhpOGI4YjhzLgorLmhpMmIxYgorLmhpYjJiNXMyCisuaG84azlrOGE4aTlkOG8uCisuaDJvaworLmhva2s0CisuaG9ra2FpMgorLmhva2thMmlkCisuaG9ra2FpMWRvCisuamE4YzlrOG84dzlzOGs4aS4KKy41amEKKy5qYWNrMQorLmphY2tvd3NrMgorLmphY2tvd3NrMWkKKy5qYThuOXU5YThyOHkuCisuamEybgorLmphbjN1MWEKKy5qYW51MmEycgorLmphOXA4YTluOGU4czhlLgorLmphNHAKKy5qYTFwYQorLmphcGEybgorLmphcGExbmVzCisuamFwYW5lMXMyZQorLmthOGQ5bzhtOXQ4czhlOHYuCisua2EyZAorLmthMWRvCisua2FkbzRtdAorLmthZG9tNHQxczIKKy5rYWRvbXQ1c2V2Cisua2E4bjlzOGE4cy4KKy5rYTJuCisua2FuMnNhMgorLmthMm4xczIKKy5rYThyOGw4czlyOHU4aDhlLgorLmsyYTJyCisua2FyMWwKKy5rYXIybDFzMgorLmthcmxzMXIKKy5rbzhyOXQ4ZTl3OGU4Zy4KKy5rbzVyCisua3I4aThzOGg4bjhhLgorLmtyMmlzCisua3IzaXMyaAorLmtyaXMyaDFuCisua3Jpc2gxbmEKKy5rcjhpOHM4aDluOGE5aThzOG0uCisua3Jpc2huYWkyCisua3Jpc2huYWkyczFtCisua3I4aThzOGg5bjhhOG4uCisua3Jpc2huMmEybgorLmxhOG45YzhhOHM5dDhlOHIuCisubGFuMWNhCisubGFuY2FzdDVlcgorLmxlOWc4ZThuOGQ4cjhlLgorLmxlMWdlbgorLmxlZ2VuMWRyCisubGVnZW5kcmU0CisubGU4aThjOGU4czl0OGU4ci4KKy5sZWkyCisubGU1aWMKKy5sZWljZXM1dAorLmxpOHA5czhjOGg4aTh0OHouCisubDJpcAorLmxpMnAxczIKKy5saXBzMmNoMgorLmxpcHMzY2hpdAorLmxpcHNjaGk0dHoKKy5saThwOXM4YzhoOGk4dDh6OWk4YThuLgorLmxpcHNjaGl0MnoxaQorLmxpcHNjaGl0ejJpMWEKKy5saXBzY2hpdHppMmEybgorLmxvOGo5YjhhOG4uCisubG81agorLmxvamJhMm4KKy5sbzh1OWk5czhpOWE4bjhhLgorLmxvdTIKKy5sbzJ1aTIKKy5sb3VpczJpMWEKKy5sb3Vpc2kyYTJuCisubG91aXNpYTFuYQorLm1hOGM5bzhzLgorLm1hMWNvCisubWE4bjljOGg4ZThzOXQ4ZThyLgorLm1hbjJjaAorLm1hbmNoZTIKKy5tYW5jaDFlcworLm1hOHI5azhvOHY5aThhOG4uCisubWFya281dmkyYTJuCisubWFya292MmkxYQorLm1hOHI4azh0OW84YjhlOHI5ZDhvOHI4Zi4KKy5tYXJrNXQKKy5tYXJrMXRvCisubWFya3RvM2IKKy5tYXJrdG9iZXIxZG8KKy5tYXJrdG9iZXJkNG9yCisubWFya3RvYmVyZG9yMWYKKy5tYThzOHM5YTljOGg4dTlzOGU4dDh0OHMuCisubWEyc3MKKy5tYXMxc2EyCisubWFzc2EyY2gKKy5tYXNzYWNoMnVzCisubWFzc2FjaHVzZTR0M3QyCisubWFzc2FjaHVzZXQ0dDFzMgorLm1hOHg5dzhlOGw4bC4KKy5tYXh3ZWw0bAorLm1pOWM4cjhvOXM4bzhmOHQuCisubWljcm8yc28KKy5taWNyb3NvMmZ0MworLm1pOG45bjhlOWE4cDlvOWw4aThzLgorLm0yaTRuMW4yCisubWlubmU0CisubWlubmVhcG9sMmkKKy5taThuOW44ZTlzOG84dDhhLgorLm1pbjFuZXMKKy5taW5uZTFzbworLm1pbm5lc28xdGEKKy5tbzhzOWM4bzh3LgorLm1vczJjCisubW9zMWNvCisubmE4YzhoOXI4aThjOGg4dDhlOG4uCisuMW5hCisubmEyY2gKKy5uYWM0aHI0CisubmEyY2hyNGkyY2gKKy5uYWNocmljaHQxZW4KKy5uYThzOGg5djhpOGw4bDhlLgorLm40YXMKKy5uYXMyaAorLm5hc2gydmlsCisubmFzaHZpbDFsCisubmFzaHZpbDJsZQorLm5lOHQ5YjhzOGQuCisubmUydDFiCisubmV0MmI1czIKKy5uZXRiNHM1ZAorLm5lOHQ5czhjOGE4cDhlLgorLm5lNHQxczIKKy5uZXQ0c2MKKy5uZXRzY2E0cAorLm5ldHMxY2EKKy5uaThqOW04ZTlnOGU4bi4KKy5uaTNqCisubmlqbWUyZworLm5pam1lMWdlbgorLm5vOGU5dDhoOGU4cjlpOGE4bi4KKy4zbm9lCisubm9ldGgyZQorLm5vZXRoZXIxaQorLm5vZXRoZTFyMmkzYTQKKy5ub2V0aGVyaTJhMm4KKy5ubzhvOHI4ZDl3OGk4ajhrOGU4cjloOG84dTh0LgorLm5vbzIKKy5ubzNvcmQKKy5ub29yZDF3Cisubm9vcmR3aTIKKy5ub29yZHdpM2oKKy5ub29yZHdpamsxZXIKKy5ub29yZHdpamtlcjFoNAorLm5vb3Jkd2lqa2VyaG91MgorLm5vOXY4ZThtOWI4ZThyLgorLm5vdmU0bTViCisub3A4ZThuOWI4czhkLgorLm9wZTRuMWI0Cisub3BlbjJiNXMyCisub3BlbmI0czVkCisub3A4ZThuOW84ZjhmOGk4YzhlLgorLm9wNGVubworLm9wZW5vNGYxZgorLm9wZW5vZjFmaQorLnBhOGw4YTl0OGk4bjhvLgorLnBhbGEydDFpbgorLnBhbGF0Mmkxbm8KKy5wYTlsOGU4cjltOG8uCisucGFsZXIzbTQKKy5wYWxlcjFtbworLnBlOXQ4cjhvOHY5czhrOGkuCisucGV0cm8zdgorLnBldHJvdnNrMgorLnBldHJvdnNrMWkKKy5wZjhhOGY4ZjlpOGE4bi4KKy40cGYKKy5wMWZhCisucGZhMmYKKy5wZmE0ZjFmNAorLnBmYWYxZmkKKy5wZmFmZjJpM2EKKy5wZmFmZmkyYTJuCisucGg4aThsOWE5ZDhlOGw5cDhoOGk4YS4KKy5waGk0bDRhZGUKKy5waGlsYTJkCisucGhpbGFkZTJscAorLnBoaWxhZGVsNXBoaQorLnBoaWxhZGVscGgyaTFhCisucGg4aThsOW85czhvOHA4aDlpOXM4YzhoOGUuCisucGhpbG8yc28KKy5waGlsb3M0b3AKKy5waGlsb3Myb3BoCisucGhpbG9zb3BoMmlzMWMKKy5waGlsb3NvcGhpczNjaDIKKy5waGlsb3NvcGhpc2NoZTIKKy5wbzhpOG45YzhhOHI4ZS4KKy5wb2luMgorLnBvaTIKKy5wb2luYzJhMnI1CisucG9pbjFjYQorLnBvOXQ4ZThuOXQ4aThhOGw5ZzhsOGU4aTljOGg4dThuOGcuCisucDRvdAorLnBvMXRlbjF0CisucG90ZW50MmkKKy5wb3RlbjF0MmkxYQorLnBvdGVudGkyYWwKKy5wb3RlbnRpYTRsMWc0CisucG90ZW50aWFsZ2wyCisucG90ZW50aWFsMWdsZQorLnBvdGVudGlhbGdsZWkyCisucG90ZW50aWFsZ2xlNWljCisucG90ZW50aWFsZ2xlNGkyY2gKKy5yYTlkOGg4YTlrOHI4aThzOGg5bjhhOG4uCisucmFkMWgyCisucmFkaGFrcjJpcworLnJhZGhha3IzaXMyaAorLnJhZGhha3JpczJoMW4KKy5yYWRoYWtyaXNoMW5hCisucmFkaGFrcmlzaG4yYTJuCisucmE4dDhoOHM5azhlOGw5bDhlOHIuCisucjRhdGgKKy5yYTJ0NGgxczIKKy5yYXRoc2syCisucmF0aDRza2UKKy5yYXRoc2tlbDFsCisucmF0aHNrZWwybGUKKy5yaThlOW04YThuOG45aThhOG4uCisucjJpZTQKKy5yaWU1bWEybgorLnJpZTFtYQorLnJpZW1hNG4xbjIKKy5yaWVtYW4zbjRpMWEKKy5yaWVtYTJubmkzYTJuCisucnk4ZDliOGU4cjhnLgorLnJ5MWQKKy5yeWQxYgorLnJ5ZGJlcmcyCisuc2M4aDhvOHQ5dDhpOHM4YzhoOGUuCisuc2NobzR0M3QyCisuc2Nob3R0MmlzMWMKKy5zMmNoMm90dGlzM2NoMgorLnNjaG90dGlzY2hlMgorLnNjOGg4cjhvOWQ4aThuOGc5ZThyLgorLnNjNGhyNAorLnNjaHJvZDFpbgorLnNjaHJvZDRpbmdlCisuc2M4aDh3OGE5YjhhOWM4aDhlOHIuCisuc2NoMXcKKy5zY2h3YWJhMmNoCisuc2Nod2FiYWNoZTIKKy5zYzhoOHc4YThyOHo5czhjOGg4aThsOGQuCisuc2NodzJhMnIKKy5zMmNod2FyenMyY2gyCisuc2Nod2FyenNjaDRpbDIKKy5zY2h3YXJ6c2NoaTJsZAorLnNlOHA5dDhlOG05YjhlOHIuCisuc2UycDF0Cisuc2VwMnRlCisuc2VwdGU0bTViCisuc3Q4bzhrOGU4czlzOGM4aDhlLgorLnN0Mm9rCisuc3Rva2VzNAorLnN0b2syZTJzcworLnN0b2tlczJzNWMKKy5zdG9rZXNzMmNoMgorLnN0b2tlc3NjaGUyCisuc3Q4dTh0OHQ5ZzhhOHI4dC4KKy5zdHU0dDN0MgorLnN0dXQ0dDFnCisuc3R1dHQxZ2EKKy5zdHV0dGcyYTJyCisuc3U4czlxOHU4ZTloOGE4bjluOGEuCisuczJ1cworLnN1c3F1MgorLnN1c3F1ZTFoNAorLnN1c3F1ZWhhMm4KKy5zdXNxdWVoYTRuMW4yCisuc3VzcXVlaGFuMW5hCisudGE4dTliOGU4cjlpOGE4bi4KKy50YXU0YgorLnRhdWI0ZQorLnRhdTNiZXIKKy50YXViZXIxaQorLnRhdWJlMXIyaTNhNAorLnRhdWJlcmkyYTJuCisudGU4YzhoOW44aTlzOGM4aDhlLgorLnRlMmNoCisudGVjMmgxbgorLnRlY2huMmlzMWMKKy50ZTJjaG5pczNjaDIKKy50ZWNobmlzY2hlMgorLnRlOG45bjhlOHM5czhlOGUuCisudDRlNG4xbjIKKy50ZW5uZTQKKy50ZW4xbmVzCisudGVubjJlMnNzCisudG85bThhOXM4ejhlOHc5czhrOGkuCisudG8ybWEKKy50b21hczJ6ZQorLnRvbWFzemV3c2syCisudG9tYXN6ZXdzazFpCisudHk5cDhvOWc4cjhhOHA4aDhpOHE4dThlLgorLnR5M3BvCisudHk1cG80ZworLnR5cG8xZ3IKKy50eXBvZ3I0YXBoaQorLnR5cG9ncmFwaGlxdTIKKy51azhyOGE4aThuOWk4YThuLgorLjR1aworLnVrcjJhaTIKKy51a3JhNGk0bgorLnVrcmEyaW5pCisudWtyYWk0bjRpMWEKKy51a3JhaW5pM2EybgorLnZlOHI5YThsOGw5ZzhlOW04ZThpOG45ZThyOHQ4ZS4KKy52ZXJhbDFsCisudmVyYWw0bDFnNAorLnZlcmFsbGdlMW1lCisudmVyYWxsZ2VtZWkyCisudmVyYWxsZ2VtZTJpbmUKKy52ZXJhbGxnZW1laW4xZXIKKy52ZThyOWU4aThuOWk5Zzh1OG44Zy4KKy52ZXJlM2luCisudmVyZWkyCisudmVyZTJpbmkKKy52ZXJlaW4yaWcKKy52ZXJlaW5pM2d1bgorLnZlOHI5dDhlOGk5bDh1OG45ZzhlOG4uCisudmVydGVpMgorLnZlcnRlaWx1bjFnZW4KKy52aThpOGk4dDhoLgorLnY0aTVpNAorLnZpNGk1aTQKKy52aWkyaXRoCisudmk4aTh0OGguCisudmkyaXRoCisud2E4aDhyOXM4YzhoOGU4aThuOWw4aThjOGg5azhlOGk4dDhzOXQ4aDhlOG85cjhpOGUuCisud2E0aHI0Cisud2FoNHJzMgorLndhaHJzNGMKKy53YWhyczJjaDIKKy53YWhyc2NoZTIKKy53YWhyc2NoZWkyCisud2FocnNjaGU0aTRuMWwKKy53YWhyczJjaGVpbmw0aTJjaAorLndhaHJzY2hlaW5saWM0aGsKKy53YWhyc2NoZWlubGljaGtlaTIKKy53YWhyc2NoZWlubGljaGtlaTR0MXMyCisud2FocnNjaGVpbmxpY2hrZWl0czN0aDJlCisud2FocnNjaGVpbmxpY2hrZWl0c3RoZTFvNXIKKy53YWhyc2NoZWlubGljaGtlaXRzdGhlb3IyaWU0Cisud2U4cjluOGU4ci4KKy53MWVyCisud2VyNG4xZXIKKy53ZThyOXQ4aDhlOHI5aThhOG4uCisud2VydGgyZQorLndlcnRoZXIxaQorLndlcnRoZTFyMmkzYTQKKy53ZXJ0aGVyaTJhMm4KKy53aThuOWM4aDhlOHM5dDhlOHIuCisud2luMmNoCisud2luY2hlMgorLndpbmNoMWVzCisud2k4cjh0OXM4YzhoOGE4Zjh0LgorLnc0aXI0Cisud2lyNHQxczIKKy53aXJ0NHNjCisud2lydHMyY2gyCisud2lydHNjaGEyZgorLndpcnRzY2hhMmZ0Cisud2k4czlzOGU4bjlzOGM4aDhhOGY4dDlsOGk4YzhoLgorLnc0aTJzMXMKKy53aXNzZW40Cisud2lzc2UybjFzMgorLndpc3NlbnM0YworLndpc3NlbnMyY2gyCisud2lzc2Vuc2NoYTJmCisud2lzc2Vuc2NoYTJmdAorLndpc3NlbnNjaGFmMnRsCisud2lzc2VuczJjaGFmdGw0aTJjaAorLnh2OGk4aThpOHQ4aC4KKy54djRpNWk0CisueHZpNGk1aTQKKy54dmlpMml0aAorLnh2OGk4aTh0OGguCisueHZpMml0aAorLnh4OGk4aThpOHI4ZC4KKy54eDQKKy54eDNpCisueHg0aTVpNAorLnh4aTRpNWk0CisueHhpaTRpcgorLnh4OGk4aThuOGQuCisueHhpNGluZAorLnlpOG44Zzl5OG84bjhnLgorLnkxaQorLnlpbjJneQorLnlpbmd5MW80CisueWluZ3lvMm4KKy5zaDh1OXg4dThlLgorLnNodXgxdTMKKy5qaTlzOHU4YThuLgorLmppMnN1CisuamlzdWEybgorLnplOGE5bDhhOG44ZC4KKy4yemUKKy56ZWE0bAorLnplYTNsNGFuZAorLnplYWxhMm4KKy56ZThpOHQ5czhjOGg4cjhpOGY4dC4KKy56ZWkyCisuemVpNHQxczIKKy56ZWl0NHNjCisuemVpdHMyY2gyCisuemVpdHNjNGhyNAorLnplaXRzY2hyNGkyZnQKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2NvbWJvYm94X2Rpc2FibGVkLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2NvbWJvYm94X2Rpc2FibGVkLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGViNDVlCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvY29tYm9ib3hfZGlzYWJsZWQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2NvbWJvYm94X25vaGlnaGxpZ2h0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2NvbWJvYm94X25vaGlnaGxpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDYwMzAxCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvY29tYm9ib3hfbm9oaWdobGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX2FnZ3JlZ2F0ZWQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfYWdncmVnYXRlZC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjYTE1YjEuLjAwMDAwMDAKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfYWdncmVnYXRlZC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9xdWlja2NvbnRhY3Rfbm9iYWRnZS45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3F1aWNrY29udGFjdF9ub2JhZGdlLjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4ZDQzYzQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9xdWlja2NvbnRhY3Rfbm9iYWRnZS45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zeW1fYWN0aW9uX2NhbGwucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3ltX2FjdGlvbl9jYWxsLnBuZwppbmRleCAxMDVmN2QwLi5kYThhZmVlIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zeW1fYWN0aW9uX2NhbGwucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N5bV9hY3Rpb25fY2FsbC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvY29tYm9ib3hfZGlzYWJsZWQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvY29tYm9ib3hfZGlzYWJsZWQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzMmRiN2UKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9jb21ib2JveF9kaXNhYmxlZC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvY29tYm9ib3hfbm9oaWdobGlnaHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvY29tYm9ib3hfbm9oaWdobGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5NjMzMTYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9jb21ib2JveF9ub2hpZ2hsaWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfYWdncmVnYXRlZC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19hZ2dyZWdhdGVkLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2MyZTJiMC4uMDAwMDAwMAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19hZ2dyZWdhdGVkLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL3F1aWNrY29udGFjdF9ub2JhZGdlLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvcXVpY2tjb250YWN0X25vYmFkZ2UuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWJlNzQ3YgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL3F1aWNrY29udGFjdF9ub2JhZGdlLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1ub2RwaS9sb2FkaW5nX3RpbGVfYW5kcm9pZC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbm9kcGkvbG9hZGluZ190aWxlX2FuZHJvaWQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmZGU0NmYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbm9kcGkvbG9hZGluZ190aWxlX2FuZHJvaWQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1ub2RwaS9ub190aWxlXzI1Ni5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbm9kcGkvbm9fdGlsZV8yNTYucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4ODIzNGUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbm9kcGkvbm9fdGlsZV8yNTYucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9hY3Rpb25fYmFyX2JhY2tncm91bmQueG1sIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlL2FjdGlvbl9iYXJfYmFja2dyb3VuZC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzkyOWQ3ZgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9hY3Rpb25fYmFyX2JhY2tncm91bmQueG1sCkBAIC0wLDAgKzEsMjIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxzaGFwZSB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorICAgIDxncmFkaWVudAorICAgICAgICBhbmRyb2lkOnN0YXJ0Q29sb3I9IiNmZmQxZDJkNCIKKyAgICAgICAgYW5kcm9pZDplbmRDb2xvcj0iI2ZmODU4NzhhIgorICAgICAgICBhbmRyb2lkOmFuZ2xlPSIyNzAiIC8+Cis8L3NoYXBlPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlL2FjdGlvbl9iYXJfZGl2aWRlci54bWwgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvYWN0aW9uX2Jhcl9kaXZpZGVyLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTQzMDlmCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlL2FjdGlvbl9iYXJfZGl2aWRlci54bWwKQEAgLTAsMCArMSwyMiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHNoYXBlIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+CisgICAgPGdyYWRpZW50CisgICAgICAgIGFuZHJvaWQ6c3RhcnRDb2xvcj0iI2ZmZTFlMmU0IgorICAgICAgICBhbmRyb2lkOmVuZENvbG9yPSIjZmY5NTk3OWEiCisgICAgICAgIGFuZHJvaWQ6YW5nbGU9IjI3MCIgLz4KKzwvc2hhcGU+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvaWNfYnRuX2JhY2sucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlL2ljX2J0bl9iYWNrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOWJmZjRjCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlL2ljX2J0bl9iYWNrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvaWNfYnRuX25leHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlL2ljX2J0bl9uZXh0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jNmNmNDM2Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlL2ljX2J0bl9uZXh0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvcXVpY2tjb250YWN0X25vYmFkZ2UueG1sIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlL3F1aWNrY29udGFjdF9ub2JhZGdlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTIyZmEwZS4uMDAwMDAwMAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvcXVpY2tjb250YWN0X25vYmFkZ2UueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0KLS8qIGJ1YmJsZV93aXRoX2NoYXRzLnhtbAotKioKLSoqIENvcHlyaWdodCAyMDA5LCBHb29nbGUgSW5jLgotKioKLSoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0qKgotKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotKioKLSoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0qKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLS0tPgotPHNlbGVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+Ci0gICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9wcmVzc2VkPSJ0cnVlIiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvcXVpY2tjb250YWN0X25vYmFkZ2VfcHJlc3NlZCIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX3NlbGVjdGVkPSJ0cnVlIiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvcXVpY2tjb250YWN0X25vYmFkZ2VfaGlnaGxpZ2h0IiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfZm9jdXNlZD0idHJ1ZSIgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL3F1aWNrY29udGFjdF9ub2JhZGdlX2hpZ2hsaWdodCIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2VuYWJsZWQ9ImZhbHNlIiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvcXVpY2tjb250YWN0X25vYmFkZ2Vfbm9ybWFsIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9xdWlja2NvbnRhY3Rfbm9iYWRnZV9ub3JtYWwiIC8+Ci08L3NlbGVjdG9yPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlL3F1aWNrY29udGFjdF9ub2JhZGdlX2hpZ2hsaWdodC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9xdWlja2NvbnRhY3Rfbm9iYWRnZV9oaWdobGlnaHQuOS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwZjUwYjMuLjAwMDAwMDAKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlL3F1aWNrY29udGFjdF9ub2JhZGdlX2hpZ2hsaWdodC45LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9xdWlja2NvbnRhY3Rfbm9iYWRnZV9ub3JtYWwuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvcXVpY2tjb250YWN0X25vYmFkZ2Vfbm9ybWFsLjkucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMWNjOWRjLi4wMDAwMDAwCi0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9xdWlja2NvbnRhY3Rfbm9iYWRnZV9ub3JtYWwuOS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvcXVpY2tjb250YWN0X25vYmFkZ2VfcHJlc3NlZC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9xdWlja2NvbnRhY3Rfbm9iYWRnZV9wcmVzc2VkLjkucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTIyYzg3Li4wMDAwMDAwCi0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9xdWlja2NvbnRhY3Rfbm9iYWRnZV9wcmVzc2VkLjkucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2xheW91dC9hY3Rpb25fYmFyX3RpdGxlX2l0ZW0ueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC9hY3Rpb25fYmFyX3RpdGxlX2l0ZW0ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3ZjdjMTMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L2FjdGlvbl9iYXJfdGl0bGVfaXRlbS54bWwKQEAgLTAsMCArMSwyMiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAgCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgIAorICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxUZXh0VmlldworICAgIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKworICAgIGFuZHJvaWQ6c2luZ2xlTGluZT0idHJ1ZSIKKyAgICBhbmRyb2lkOmVsbGlwc2l6ZT0iZW5kIgorICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VNZWRpdW1JbnZlcnNlIiAvPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2xheW91dC9hY3Rpb25fbWVudV9pdGVtX2xheW91dC54bWwgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L2FjdGlvbl9tZW51X2l0ZW1fbGF5b3V0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjA2MjUxZQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvYWN0aW9uX21lbnVfaXRlbV9sYXlvdXQueG1sCkBAIC0wLDAgKzEsMjAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgIAorICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8Y29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5tZW51LkFjdGlvbk1lbnVJdGVtVmlldyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAvPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2xheW91dC9hY3Rpb25fbWVudV9sYXlvdXQueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC9hY3Rpb25fbWVudV9sYXlvdXQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4ZDU1MzEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L2FjdGlvbl9tZW51X2xheW91dC54bWwKQEAgLTAsMCArMSwyMCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAgCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgIAorICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuQWN0aW9uTWVudVZpZXcKKyAgICAgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIgLz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvYWxlcnRfZGlhbG9nLnhtbCBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvYWxlcnRfZGlhbG9nLnhtbAppbmRleCA3YWU2OGY5Li5iNzQ2ZDI4IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L2FsZXJ0X2RpYWxvZy54bWwKKysrIGIvY29yZS9yZXMvcmVzL2xheW91dC9hbGVydF9kaWFsb2cueG1sCkBAIC0xMTIsNyArMTEyLDcgQEAKICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1RvcD0iNGRpcCIKICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjJkaXAiCiAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iMmRpcCIKLSAgICAgICAgICAgIGFuZHJvaWQ6dXNlTGFyZ2VzdENoaWxkPSJ0cnVlIj4KKyAgICAgICAgICAgIGFuZHJvaWQ6bWVhc3VyZVdpdGhMYXJnZXN0Q2hpbGQ9InRydWUiPgogICAgICAgICAgICAgPExpbmVhckxheW91dCBhbmRyb2lkOmlkPSJAK2lkL2xlZnRTcGFjZXIiCiAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIwLjI1IgogICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIwZGlwIgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2xheW91dC9jb250YWN0X2hlYWRlci54bWwgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L2NvbnRhY3RfaGVhZGVyLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY0NjdkMy4uMDAwMDAwMAotLS0gYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L2NvbnRhY3RfaGVhZGVyLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICBhbmRyb2lkOmlkPSJAK2lkL2Jhbm5lciIKLSAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgotICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgotICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCi0gICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAZHJhd2FibGUvdGl0bGVfYmFyX21lZGl1bSIKLSAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iNWRpcCI+Ci0KLSAgICA8YW5kcm9pZC53aWRnZXQuUXVpY2tDb250YWN0QmFkZ2UgYW5kcm9pZDppZD0iQCtpZC9waG90byIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iY2VudGVyX3ZlcnRpY2FsIgotICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5SaWdodD0iOGRpcCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iLTFkaXAiCi0gICAgICAgIHN0eWxlPSJAKmFuZHJvaWQ6c3R5bGUvV2lkZ2V0LlF1aWNrQ29udGFjdEJhZGdlLldpbmRvd1NtYWxsIiAvPgotICAgIC8+Ci0KLSAgICA8TGluZWFyTGF5b3V0Ci0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIwZGlwIgotICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIgotICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iY2VudGVyX3ZlcnRpY2FsIiA+Ci0KLSAgICAgICAgPExpbmVhckxheW91dAotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCI+Ci0KLSAgICAgICAgICAgIDxJbWFnZVZpZXcKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2FnZ3JlZ2F0ZV9iYWRnZSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSIzZGlwIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1RvcD0iM2RpcCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnNyYz0iQGRyYXdhYmxlL2ljX2FnZ3JlZ2F0ZWQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIgotICAgICAgICAgICAgLz4KLQotICAgICAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvbmFtZSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6c2luZ2xlTGluZT0idHJ1ZSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmVsbGlwc2l6ZT0iZW5kIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VNZWRpdW0iCi0gICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U3R5bGU9ImJvbGQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpzaGFkb3dDb2xvcj0iI0JCMDAwMDAwIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6c2hhZG93UmFkaXVzPSIyLjc1IgotICAgICAgICAgICAgICAgIC8+Ci0gICAgICAgIDwvTGluZWFyTGF5b3V0PgotCi0gICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL3Bob25ldGljX25hbWUiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlU21hbGwiCi0gICAgICAgICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9InRydWUiCi0gICAgICAgICAgICBhbmRyb2lkOmVsbGlwc2l6ZT0iZW5kIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luVG9wPSItMmRpcCIKLSAgICAgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSIKLSAgICAgICAgLz4KLQotICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9zdGF0dXMiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlU21hbGwiCi0gICAgICAgICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9InRydWUiCi0gICAgICAgICAgICBhbmRyb2lkOmVsbGlwc2l6ZT0iZW5kIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luVG9wPSItMmRpcCIKLSAgICAgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSIKLSAgICAgICAgLz4KLQotICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9zdGF0dXNfZGF0ZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjBkaXAiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiCi0gICAgICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlU21hbGwiCi0gICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIxMnNwIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luVG9wPSItMmRpcCIKLSAgICAgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSIKLSAgICAgICAgLz4KLSAgICA8L0xpbmVhckxheW91dD4KLQotICAgIDxJbWFnZVZpZXcKLSAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9wcmVzZW5jZSIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImNlbnRlcl92ZXJ0aWNhbCIKLSAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iM2RpcCIKLSAgICAgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IjZkaXAiCi0gICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSIKLSAgICAvPgotCi0gICAgPENoZWNrQm94Ci0gICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvc3RhciIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImNlbnRlcl92ZXJ0aWNhbCIKLSAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIgotICAgICAgICBhbmRyb2lkOmNvbnRlbnREZXNjcmlwdGlvbj0iQHN0cmluZy9kZXNjcmlwdGlvbl9zdGFyIgotICAgICAgICBzdHlsZT0iP2FuZHJvaWQ6YXR0ci9zdGFyU3R5bGUiIC8+Ci0KLTwvTGluZWFyTGF5b3V0PgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2xheW91dC9rZXlndWFyZF9zY3JlZW5fdW5sb2NrX2xhbmRzY2FwZS54bWwgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L2tleWd1YXJkX3NjcmVlbl91bmxvY2tfbGFuZHNjYXBlLnhtbAppbmRleCBjMWI0MDZmLi44MzM4MWExIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L2tleWd1YXJkX3NjcmVlbl91bmxvY2tfbGFuZHNjYXBlLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L2tleWd1YXJkX3NjcmVlbl91bmxvY2tfbGFuZHNjYXBlLnhtbApAQCAtNTgsMTggKzU4LDE5IEBACiAgICAgICAgICAgICBhbmRyb2lkOmVsbGlwc2l6ZT0ibWFycXVlZSIKICAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0icmlnaHR8Ym90dG9tIgogICAgICAgICAgICAgLz4KKwogICAgICAgICA8Y29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0LkRpZ2l0YWxDbG9jayBhbmRyb2lkOmlkPSJAK2lkL3RpbWUiCiAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgogICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCiAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudFRvcD0idHJ1ZSIKICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50TGVmdD0idHJ1ZSIKICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblRvcD0iOGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkJvdHRvbT0iOGRpcCIKICAgICAgICAgICAgID4KIAogICAgICAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvdGltZURpc3BsYXkiCiAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImJvdHRvbSIKICAgICAgICAgICAgICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9InRydWUiCiAgICAgICAgICAgICAgICAgYW5kcm9pZDplbGxpcHNpemU9Im5vbmUiCiAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iNzJzcCIKQEAgLTg0LDggKzg1LDkgQEAKIAogICAgICAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvYW1fcG0iCiAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImJvdHRvbSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF90b1JpZ2h0T2Y9IkBpZC90aW1lRGlzcGxheSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnbkJhc2VsaW5lPSJAaWQvdGltZURpc3BsYXkiCiAgICAgICAgICAgICAgICAgYW5kcm9pZDpzaW5nbGVMaW5lPSJ0cnVlIgogICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZWxsaXBzaXplPSJub25lIgogICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjIyc3AiCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L2tleWd1YXJkX3NjcmVlbl91bmxvY2tfcG9ydHJhaXQueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC9rZXlndWFyZF9zY3JlZW5fdW5sb2NrX3BvcnRyYWl0LnhtbAppbmRleCA3NGEwZWVlLi44ZGFjZmFmIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L2tleWd1YXJkX3NjcmVlbl91bmxvY2tfcG9ydHJhaXQueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQva2V5Z3VhcmRfc2NyZWVuX3VubG9ja19wb3J0cmFpdC54bWwKQEAgLTU1LDEyICs1NSwxMiBAQAogICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRUb3A9InRydWUiCiAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Ub3A9IjE1ZGlwIgogICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iMjBkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Cb3R0b209IjhkaXAiCiAgICAgICAgICAgICA+CiAKICAgICAgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL3RpbWVEaXNwbGF5IgogICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCiAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJib3R0b20iCiAgICAgICAgICAgICAgICAgYW5kcm9pZDpzaW5nbGVMaW5lPSJ0cnVlIgogICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZWxsaXBzaXplPSJub25lIgogICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjU2c3AiCkBAIC03NCw4ICs3NCw5IEBACiAKICAgICAgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL2FtX3BtIgogICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJib3R0b20iCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfdG9SaWdodE9mPSJAaWQvdGltZURpc3BsYXkiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25CYXNlbGluZT0iQGlkL3RpbWVEaXNwbGF5IgogICAgICAgICAgICAgICAgIGFuZHJvaWQ6c2luZ2xlTGluZT0idHJ1ZSIKICAgICAgICAgICAgICAgICBhbmRyb2lkOmVsbGlwc2l6ZT0ibm9uZSIKICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIxOHNwIgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2xheW91dC9wcmVmZXJlbmNlX2xpc3RfY29udGVudC54bWwgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L3ByZWZlcmVuY2VfbGlzdF9jb250ZW50LnhtbAppbmRleCA4Zjg2OTgxLi44NDRkMzM4IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L3ByZWZlcmVuY2VfbGlzdF9jb250ZW50LnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L3ByZWZlcmVuY2VfbGlzdF9jb250ZW50LnhtbApAQCAtNCwyMiArNCw1OCBAQAogKioKICoqIENvcHlyaWdodCAyMDA2LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CiAqKgotKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAotKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKLSoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqKgotKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoqCi0qKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAotKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCi0qKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCi0qKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAqLwogLS0+Ci08TGlzdFZpZXcgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIiBhbmRyb2lkOmlkPSJAYW5kcm9pZDppZC9saXN0IgotICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiIAorCis8TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKLSAgICBhbmRyb2lkOmRyYXdTZWxlY3Rvck9uVG9wPSJmYWxzZSIKLSAgICBhbmRyb2lkOnNjcm9sbGJhckFsd2F5c0RyYXdWZXJ0aWNhbFRyYWNrPSJ0cnVlIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiPgorCisgICAgPExpc3RWaWV3IGFuZHJvaWQ6aWQ9IkBhbmRyb2lkOmlkL2xpc3QiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJmaWxsX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIgorICAgICAgICBhbmRyb2lkOmRyYXdTZWxlY3Rvck9uVG9wPSJmYWxzZSIKKyAgICAgICAgYW5kcm9pZDpzY3JvbGxiYXJBbHdheXNEcmF3VmVydGljYWxUcmFjaz0idHJ1ZSIKICAgICAvPgorCisgICAgPFJlbGF0aXZlTGF5b3V0IGFuZHJvaWQ6aWQ9IkAraWQvYnV0dG9uX2JhciIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIwIgorICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBhbmRyb2lkOmRyYXdhYmxlL2JvdHRvbV9iYXIiCisgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSI+CisKKyAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL2JhY2tfYnV0dG9uIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjE1MGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luPSI1ZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRMZWZ0PSJ0cnVlIgorICAgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZUxlZnQ9IkBkcmF3YWJsZS9pY19idG5fYmFjayIKKyAgICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGVQYWRkaW5nPSIzZGlwIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2JhY2tfYnV0dG9uX2xhYmVsIgorICAgICAgICAvPgorCisgICAgICAgIDxCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9uZXh0X2J1dHRvbiIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIxNTBkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbj0iNWRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50UmlnaHQ9InRydWUiCisgICAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlUmlnaHQ9IkBkcmF3YWJsZS9pY19idG5fbmV4dCIKKyAgICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGVQYWRkaW5nPSIzZGlwIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL25leHRfYnV0dG9uX2xhYmVsIgorICAgICAgICAvPgorICAgIDwvUmVsYXRpdmVMYXlvdXQ+Cis8L0xpbmVhckxheW91dD4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvc2NyZWVuX2FjdGlvbl9iYXIueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC9zY3JlZW5fYWN0aW9uX2Jhci54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDFhNGI0MgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvc2NyZWVuX2FjdGlvbl9iYXIueG1sCkBAIC0wLDAgKzEsNDAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgIAorICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8IS0tCitUaGlzIGlzIGFuIG9wdGltaXplZCBsYXlvdXQgZm9yIGEgc2NyZWVuIHdpdGggdGhlIEFjdGlvbiBCYXIgZW5hYmxlZC4KKy0tPgorCis8TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKKyAgICBhbmRyb2lkOmZpdHNTeXN0ZW1XaW5kb3dzPSJ0cnVlIj4KKyAgICA8QWN0aW9uQmFyVmlldyBhbmRyb2lkOmlkPSJAK2lkL2FjdGlvbl9iYXIiCisgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICBzdHlsZT0iP2FuZHJvaWQ6YXR0ci93aW5kb3dBY3Rpb25CYXJTdHlsZSIgLz4KKyAgICA8RnJhbWVMYXlvdXQgYW5kcm9pZDppZD0iQGFuZHJvaWQ6aWQvY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIgCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIgorICAgICAgICBhbmRyb2lkOmZvcmVncm91bmRHcmF2aXR5PSJmaWxsX2hvcml6b250YWx8dG9wIgorICAgICAgICBhbmRyb2lkOmZvcmVncm91bmQ9Ij9hbmRyb2lkOmF0dHIvd2luZG93Q29udGVudE92ZXJsYXkiIC8+CisgICAgPExpbmVhckxheW91dCBhbmRyb2lkOmlkPSJAK2lkL2NvbnRleHRfYWN0aW9uX2JhciIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgIHN0eWxlPSI/YW5kcm9pZDphdHRyL3dpbmRvd0FjdGlvbkJhclN0eWxlIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIiAvPgorPC9MaW5lYXJMYXlvdXQ+CisKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvd2ViX3J1bnRpbWUueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC93ZWJfcnVudGltZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGVjMDk2NAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvd2ViX3J1bnRpbWUueG1sCkBAIC0wLDAgKzEsMzYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxGcmFtZUxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iZmlsbF9wYXJlbnQiCisgICAgPgorICAgIDxXZWJWaWV3CisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvd2VidmlldyIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9ImZpbGxfcGFyZW50IgorICAgIC8+CisKKyAgICA8SW1hZ2VWaWV3CisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvc3BsYXNoc2NyZWVuIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iZmlsbF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6c2NhbGVUeXBlPSJmaXRTdGFydCIKKyAgICAvPgorCis8L0ZyYW1lTGF5b3V0PgorCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzL2F0dHJzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMvYXR0cnMueG1sCmluZGV4IDhkNGZhNGUuLjNkMzFjMjcgMTAwNzU1Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMvYXR0cnMueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMvYXR0cnMueG1sCkBAIC0xNCw4ICsxNCw4IEBACiAgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+CiAKLTwhLS0gRm9ybWF0dGluZyBub3RlOiB0ZXJtaW5hdGUgYWxsIGNvbW1lbnRzIHdpdGggYSBwZXJpb2QsIHRvIGF2b2lkIGJyZWFraW5nIAotICAgICB0aGUgZG9jdW1lbnRhdGlvbiBvdXRwdXQuIFRvIHN1cHByZXNzIGNvbW1lbnQgbGluZXMgZnJvbSB0aGUgZG9jdW1lbnRhdGlvbiAKKzwhLS0gRm9ybWF0dGluZyBub3RlOiB0ZXJtaW5hdGUgYWxsIGNvbW1lbnRzIHdpdGggYSBwZXJpb2QsIHRvIGF2b2lkIGJyZWFraW5nCisgICAgIHRoZSBkb2N1bWVudGF0aW9uIG91dHB1dC4gVG8gc3VwcHJlc3MgY29tbWVudCBsaW5lcyBmcm9tIHRoZSBkb2N1bWVudGF0aW9uCiAgICAgIG91dHB1dCwgaW5zZXJ0IGFuIGVhdC1jb21tZW50IGVsZW1lbnQgYWZ0ZXIgdGhlIGNvbW1lbnQgbGluZXMuCiAtLT4KIApAQCAtMjQ0LDYgKzI0NCwxMyBAQAogICAgICAgICAgICAgIHtAbGluayBhbmRyb2lkLlIuc3R5bGVhYmxlI1dpbmRvd0FuaW1hdGlvbn0uIC0tPgogICAgICAgICA8YXR0ciBuYW1lPSJ3aW5kb3dBbmltYXRpb25TdHlsZSIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+CiAKKyAgICAgICAgPCEtLSBGbGFnIGluZGljYXRpbmcgd2hldGhlciB0aGlzIHdpbmRvdyBzaG91bGQgaGF2ZSBhbiBBY3Rpb24gQmFyCisgICAgICAgICAgICAgaW4gcGxhY2Ugb2YgdGhlIHVzdWFsIHRpdGxlIGJhci4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9IndpbmRvd0FjdGlvbkJhciIgZm9ybWF0PSJib29sZWFuIiAvPgorCisgICAgICAgIDwhLS0gUmVmZXJlbmNlIHRvIGEgc3R5bGUgZm9yIHRoZSBBY3Rpb24gQmFyIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJ3aW5kb3dBY3Rpb25CYXJTdHlsZSIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+CisKICAgICAgICAgPCEtLSBEZWZpbmVzIHRoZSBkZWZhdWx0IHNvZnQgaW5wdXQgc3RhdGUgdGhhdCB0aGlzIHdpbmRvdyB3b3VsZAogICAgICAgICAgICAgIGxpa2Ugd2hlbiBpdCBpcyBkaXNwbGF5ZWQuIC0tPgogICAgICAgICA8YXR0ciBuYW1lPSJ3aW5kb3dTb2Z0SW5wdXRNb2RlIj4KQEAgLTM5MCw2ICszOTcsMTIgQEAKICAgICAgICAgPGF0dHIgbmFtZT0iaG9yaXpvbnRhbFNjcm9sbFZpZXdTdHlsZSIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+CiAgICAgICAgIDwhLS0gRGVmYXVsdCBTcGlubmVyIHN0eWxlLiAtLT4KICAgICAgICAgPGF0dHIgbmFtZT0ic3Bpbm5lclN0eWxlIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KKyAgICAgICAgPCEtLSBEZWZhdWx0IGRyb3Bkb3duIFNwaW5uZXIgc3R5bGUuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJkcm9wRG93blNwaW5uZXJTdHlsZSIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+CisgICAgICAgIDwhLS0gRGVmYXVsdCBBY3Rpb25CYXIgZHJvcGRvd24gc3R5bGUuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJhY3Rpb25Ecm9wRG93blN0eWxlIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KKyAgICAgICAgPCEtLSBEZWZhdWx0IGFjdGlvbiBidXR0b24gc3R5bGUuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJhY3Rpb25CdXR0b25TdHlsZSIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+CiAgICAgICAgIDwhLS0gRGVmYXVsdCBTdGFyIHN0eWxlLiAtLT4KICAgICAgICAgPGF0dHIgbmFtZT0ic3RhclN0eWxlIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KICAgICAgICAgPCEtLSBEZWZhdWx0IFRhYldpZGdldCBzdHlsZS4gLS0+CkBAIC00MjYsNiArNDM5LDEzIEBACiAgICAgICAgIDxhdHRyIG5hbWU9InF1aWNrQ29udGFjdEJhZGdlU3R5bGVTbWFsbFdpbmRvd0xhcmdlIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KIAogICAgICAgICA8IS0tID09PT09PT09PT09PT09PT09PT0gLS0+CisgICAgICAgIDwhLS0gQWN0aW9uIGJhciBzdHlsZXMgICAtLT4KKyAgICAgICAgPCEtLSA9PT09PT09PT09PT09PT09PT09IC0tPgorICAgICAgICA8ZWF0LWNvbW1lbnQgLz4KKyAgICAgICAgPCEtLSBEZWZhdWx0IGFtb3VudCBvZiBwYWRkaW5nIHRvIHVzZSBiZXR3ZWVuIGFjdGlvbiBidXR0b25zLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0iYWN0aW9uQnV0dG9uUGFkZGluZyIgZm9ybWF0PSJkaW1lbnNpb24iIC8+CisKKyAgICAgICAgPCEtLSA9PT09PT09PT09PT09PT09PT09IC0tPgogICAgICAgICA8IS0tIFByZWZlcmVuY2Ugc3R5bGVzICAgLS0+CiAgICAgICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PSAtLT4KICAgICAgICAgPGVhdC1jb21tZW50IC8+CkBAIC05NDgsNiArOTY4LDggQEAKICAgICAgICAgPGF0dHIgbmFtZT0idGV4dENvbG9yIiAvPgogICAgICAgICA8YXR0ciBuYW1lPSJiYWNrZ3JvdW5kRGltRW5hYmxlZCIgLz4KICAgICAgICAgPGF0dHIgbmFtZT0iYmFja2dyb3VuZERpbUFtb3VudCIgLz4KKyAgICAgICAgPGF0dHIgbmFtZT0id2luZG93QWN0aW9uQmFyIiAvPgorICAgICAgICA8YXR0ciBuYW1lPSJ3aW5kb3dBY3Rpb25CYXJTdHlsZSIgLz4KICAgICA8L2RlY2xhcmUtc3R5bGVhYmxlPgogCiAgICAgPCEtLSBUaGUgc2V0IG9mIGF0dHJpYnV0ZXMgdGhhdCBkZXNjcmliZSBhIEFsZXJ0RGlhbG9nJ3MgdGhlbWUuIC0tPgpAQCAtOTc0LDcgKzk5Niw3IEBACiAgICAgICAgIDxhdHRyIG5hbWU9IndpbmRvd1Nob3dBbmltYXRpb24iIGZvcm1hdD0icmVmZXJlbmNlIiAvPgogICAgICAgICA8IS0tIFRoZSBhbmltYXRpb24gdXNlZCB3aGVuIGEgd2luZG93IGlzIGdvaW5nIGZyb20gVklTSUJMRSB0byBJTlZJU0lCTEUuIC0tPgogICAgICAgICA8YXR0ciBuYW1lPSJ3aW5kb3dIaWRlQW5pbWF0aW9uIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KLSAgICAgICAgCisKICAgICAgICAgPCEtLSAgV2hlbiBvcGVuaW5nIGEgbmV3IGFjdGl2aXR5LCB0aGlzIGlzIHRoZSBhbmltYXRpb24gdGhhdCBpcwogICAgICAgICAgICAgICBydW4gb24gdGhlIG5leHQgYWN0aXZpdHkgKHdoaWNoIGlzIGVudGVyaW5nIHRoZSBzY3JlZW4pLiAtLT4KICAgICAgICAgPGF0dHIgbmFtZT0iYWN0aXZpdHlPcGVuRW50ZXJBbmltYXRpb24iIGZvcm1hdD0icmVmZXJlbmNlIiAvPgpAQCAtMTAxNSw3ICsxMDM3LDcgQEAKICAgICAgICAgICAgICAgYW5pbWF0aW9uIHRoYXQgaXMgcnVuIG9uIHRoZSB0b3AgYWN0aXZpdHkgb2YgdGhlIGN1cnJlbnQgdGFzawogICAgICAgICAgICAgICAod2hpY2ggaXMgZXhpdGluZyB0aGUgc2NyZWVuKS4gLS0+CiAgICAgICAgIDxhdHRyIG5hbWU9InRhc2tUb0JhY2tFeGl0QW5pbWF0aW9uIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KLSAgICAgICAgCisKICAgICAgICAgPCEtLSAgV2hlbiBvcGVuaW5nIGEgbmV3IGFjdGl2aXR5IHRoYXQgc2hvd3MgdGhlIHdhbGxwYXBlciwgd2hpbGUKICAgICAgICAgICAgICAgY3VycmVudGx5IG5vdCBzaG93aW5nIHRoZSB3YWxscGFwZXIsIHRoaXMgaXMgdGhlIGFuaW1hdGlvbiB0aGF0CiAgICAgICAgICAgICAgIGlzIHJ1biBvbiB0aGUgbmV3IHdhbGxwYXBlciBhY3Rpdml0eSAod2hpY2ggaXMgZW50ZXJpbmcgdGhlIHNjcmVlbikuIC0tPgpAQCAtMTAzMiw3ICsxMDU0LDcgQEAKICAgICAgICAgICAgICAgY3VycmVudGx5IHNob3dpbmcgdGhlIHdhbGxwYXBlciwgdGhpcyBpcyB0aGUgYW5pbWF0aW9uIHRoYXQKICAgICAgICAgICAgICAgaXMgcnVuIG9uIHRoZSBvbGQgd2FsbHBhcGVyIGFjdGl2aXR5ICh3aGljaCBpcyBleGl0aW5nIHRoZSBzY3JlZW4pLiAtLT4KICAgICAgICAgPGF0dHIgbmFtZT0id2FsbHBhcGVyQ2xvc2VFeGl0QW5pbWF0aW9uIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KLSAgICAgICAgCisKICAgICAgICAgPCEtLSAgV2hlbiBvcGVuaW5nIGEgbmV3IGFjdGl2aXR5IHRoYXQgaXMgb24gdG9wIG9mIHRoZSB3YWxscGFwZXIKICAgICAgICAgICAgICAgd2hlbiB0aGUgY3VycmVudCBhY3Rpdml0eSBpcyBhbHNvIG9uIHRvcCBvZiB0aGUgd2FsbHBhcGVyLAogICAgICAgICAgICAgICB0aGlzIGlzIHRoZSBhbmltYXRpb24gdGhhdCBpcyBydW4gb24gdGhlIG5ldyBhY3Rpdml0eQpAQCAtMTUyMCw2ICsxNTQyLDggQEAKICAgICAgICAgICAgICB3aWxsIHVzZSBvbmx5IHRoZSBudW1iZXIgb2YgaXRlbXMgaW4gdGhlIGFkYXB0ZXIgYW5kIHRoZSBudW1iZXIgb2YgaXRlbXMgdmlzaWJsZQogICAgICAgICAgICAgIG9uIHNjcmVlbiB0byBkZXRlcm1pbmUgdGhlIHNjcm9sbGJhcidzIHByb3BlcnRpZXMuIC0tPgogICAgICAgICA8YXR0ciBuYW1lPSJzbW9vdGhTY3JvbGxiYXIiIGZvcm1hdD0iYm9vbGVhbiIgLz4KKyAgICAgICAgPCEtLSBBIHJlZmVyZW5jZSB0byBhbiBYTUwgZGVzY3JpcHRpb24gb2YgdGhlIGFkYXB0ZXIgdG8gYXR0YWNoIHRvIHRoZSBsaXN0LiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0iYWRhcHRlciIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+CiAgICAgPC9kZWNsYXJlLXN0eWxlYWJsZT4KICAgICA8ZGVjbGFyZS1zdHlsZWFibGUgbmFtZT0iQWJzU3Bpbm5lciI+CiAgICAgICAgIDwhLS0gUmVmZXJlbmNlIHRvIGFuIGFycmF5IHJlc291cmNlIHRoYXQgd2lsbCBwb3B1bGF0ZSB0aGUgU3Bpbm5lci4gIEZvciBzdGF0aWMgY29udGVudCwKQEAgLTE3MTUsNyArMTczOSw3IEBACiAgICAgICAgIDwhLS0gV2hlbiBzZXQgdG8gdHJ1ZSwgYWxsIGNoaWxkcmVuIHdpdGggYSB3ZWlnaHQgd2lsbCBiZSBjb25zaWRlcmVkIGhhdmluZwogICAgICAgICAgICAgIHRoZSBtaW5pbXVtIHNpemUgb2YgdGhlIGxhcmdlc3QgY2hpbGQuIElmIGZhbHNlLCBhbGwgY2hpbGRyZW4gYXJlCiAgICAgICAgICAgICAgbWVhc3VyZWQgbm9ybWFsbHkuIC0tPgotICAgICAgICA8YXR0ciBuYW1lPSJ1c2VMYXJnZXN0Q2hpbGQiIGZvcm1hdD0iYm9vbGVhbiIgLz4KKyAgICAgICAgPGF0dHIgbmFtZT0ibWVhc3VyZVdpdGhMYXJnZXN0Q2hpbGQiIGZvcm1hdD0iYm9vbGVhbiIgLz4KICAgICA8L2RlY2xhcmUtc3R5bGVhYmxlPgogICAgIDxkZWNsYXJlLXN0eWxlYWJsZSBuYW1lPSJMaXN0VmlldyI+CiAgICAgICAgIDwhLS0gUmVmZXJlbmNlIHRvIGFuIGFycmF5IHJlc291cmNlIHRoYXQgd2lsbCBwb3B1bGF0ZSB0aGUgTGlzdFZpZXcuICBGb3Igc3RhdGljIGNvbnRlbnQsCkBAIC0yMTM5LDcgKzIxNjMsNyBAQAogICAgICAgICA8YXR0ciBuYW1lPSJkcm9wRG93bkFuY2hvciIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+CiAgICAgICAgIDwhLS0gU3BlY2lmaWVzIHRoZSBiYXNpYyB3aWR0aCBvZiB0aGUgZHJvcGRvd24uIEl0cyB2YWx1ZSBtYXkKICAgICAgICAgICAgICBiZSBhIGRpbWVuc2lvbiAoc3VjaCBhcyAiMTJkaXAiKSBmb3IgYSBjb25zdGFudCB3aWR0aCwKLSAgICAgICAgICAgICBmaWxsX3BhcmVudCBvciBtYXRjaF9wYXJlbnQgdG8gbWF0Y2ggdGhlIHdpZHRoIG9mIHRoZSAKKyAgICAgICAgICAgICBmaWxsX3BhcmVudCBvciBtYXRjaF9wYXJlbnQgdG8gbWF0Y2ggdGhlIHdpZHRoIG9mIHRoZQogICAgICAgICAgICAgIHNjcmVlbiwgb3Igd3JhcF9jb250ZW50IHRvIG1hdGNoIHRoZSB3aWR0aCBvZgogICAgICAgICAgICAgIHRoZSBhbmNob3JlZCB2aWV3LiAtLT4KICAgICAgICAgPGF0dHIgbmFtZT0iZHJvcERvd25XaWR0aCIgZm9ybWF0PSJkaW1lbnNpb24iPgpAQCAtMjE3NSw4ICsyMTk5LDEzIEBACiAgICAgICAgIDxhdHRyIG5hbWU9InBvcHVwQmFja2dyb3VuZCIgZm9ybWF0PSJyZWZlcmVuY2V8Y29sb3IiIC8+CiAgICAgPC9kZWNsYXJlLXN0eWxlYWJsZT4KICAgICA8ZGVjbGFyZS1zdHlsZWFibGUgbmFtZT0iVmlld0FuaW1hdG9yIj4KKyAgICAgICAgPCEtLSBJZGVudGlmaWVyIGZvciB0aGUgYW5pbWF0aW9uIHRvIHVzZSB3aGVuIGEgdmlldyBpcyBzaG93bi4gLS0+CiAgICAgICAgIDxhdHRyIG5hbWU9ImluQW5pbWF0aW9uIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KKyAgICAgICAgPCEtLSBJZGVudGlmaWVyIGZvciB0aGUgYW5pbWF0aW9uIHRvIHVzZSB3aGVuIGEgdmlldyBpcyBoaWRkZW4uIC0tPgogICAgICAgICA8YXR0ciBuYW1lPSJvdXRBbmltYXRpb24iIGZvcm1hdD0icmVmZXJlbmNlIiAvPgorICAgICAgICA8IS0tIERlZmluZXMgd2hldGhlciB0byBhbmltYXRlIHRoZSBjdXJyZW50IFZpZXcgd2hlbiB0aGUgVmlld0FuaW1hdGlvbgorICAgICAgICAgICAgIGlzIGZpcnN0IGRpc3BsYXllZC4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImFuaW1hdGVGaXJzdFZpZXciIGZvcm1hdD0iYm9vbGVhbiIgLz4KICAgICA8L2RlY2xhcmUtc3R5bGVhYmxlPgogICAgIDxkZWNsYXJlLXN0eWxlYWJsZSBuYW1lPSJWaWV3RmxpcHBlciI+CiAgICAgICAgIDxhdHRyIG5hbWU9ImZsaXBJbnRlcnZhbCIgZm9ybWF0PSJpbnRlZ2VyIiBtaW49IjAiIC8+CkBAIC0yMTk2LDYgKzIyMjUsMzAgQEAKICAgICA8ZGVjbGFyZS1zdHlsZWFibGUgbmFtZT0iU3Bpbm5lciI+CiAgICAgICAgIDwhLS0gVGhlIHByb21wdCB0byBkaXNwbGF5IHdoZW4gdGhlIHNwaW5uZXIncyBkaWFsb2cgaXMgc2hvd24uIC0tPgogICAgICAgICA8YXR0ciBuYW1lPSJwcm9tcHQiIGZvcm1hdD0icmVmZXJlbmNlIiAvPgorICAgICAgICA8IS0tIERpc3BsYXkgbW9kZSBmb3Igc3Bpbm5lciBvcHRpb25zLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0ic3Bpbm5lck1vZGUiIGZvcm1hdD0iZW51bSI+CisgICAgICAgICAgICA8IS0tIFNwaW5uZXIgb3B0aW9ucyB3aWxsIGJlIHByZXNlbnRlZCB0byB0aGUgdXNlciBhcyBhIGRpYWxvZyB3aW5kb3cuIC0tPgorICAgICAgICAgICAgPGVudW0gbmFtZT0iZGlhbG9nIiB2YWx1ZT0iMCIgLz4KKyAgICAgICAgICAgIDwhLS0gU3Bpbm5lciBvcHRpb25zIHdpbGwgYmUgcHJlc2VudGVkIHRvIHRoZSB1c2VyIGFzIGFuIGlubGluZSBkcm9wZG93bgorICAgICAgICAgICAgICAgICBhbmNob3JlZCB0byB0aGUgc3Bpbm5lciB3aWRnZXQgaXRzZWxmLiAtLT4KKyAgICAgICAgICAgIDxlbnVtIG5hbWU9ImRyb3Bkb3duIiB2YWx1ZT0iMSIgLz4KKyAgICAgICAgPC9hdHRyPgorICAgICAgICA8IS0tIExpc3Qgc2VsZWN0b3IgdG8gdXNlIGZvciBzcGlubmVyTW9kZT0iZHJvcGRvd24iIGRpc3BsYXkuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJkcm9wRG93blNlbGVjdG9yIiAvPgorICAgICAgICA8IS0tIEJhY2tncm91bmQgZHJhd2FibGUgdG8gdXNlIGZvciB0aGUgZHJvcGRvd24gaW4gc3Bpbm5lck1vZGU9ImRyb3Bkb3duIi4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9InBvcHVwQmFja2dyb3VuZCIgLz4KKyAgICAgICAgPCEtLSBWZXJ0aWNhbCBvZmZzZXQgZnJvbSB0aGUgc3Bpbm5lciB3aWRnZXQgZm9yIHBvc2l0aW9uaW5nIHRoZSBkcm9wZG93biBpbgorICAgICAgICAgICAgIHNwaW5uZXJNb2RlPSJkcm9wZG93biIuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJkcm9wRG93blZlcnRpY2FsT2Zmc2V0IiAvPgorICAgICAgICA8IS0tIEhvcml6b250YWwgb2Zmc2V0IGZyb20gdGhlIHNwaW5uZXIgd2lkZ2V0IGZvciBwb3NpdGlvbmluZyB0aGUgZHJvcGRvd24KKyAgICAgICAgICAgICBpbiBzcGlubmVyTW9kZT0iZHJvcGRvd24iLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0iZHJvcERvd25Ib3Jpem9udGFsT2Zmc2V0IiAvPgorICAgICAgICA8IS0tIFdpZHRoIG9mIHRoZSBkcm9wZG93biBpbiBzcGlubmVyTW9kZT0iZHJvcGRvd24iLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0iZHJvcERvd25XaWR0aCIgLz4KKyAgICAgICAgPCEtLSBSZWZlcmVuY2UgdG8gYSBsYXlvdXQgdG8gdXNlIGZvciBkaXNwbGF5aW5nIGEgcHJvbXB0IGluIHRoZSBkcm9wZG93biBmb3IKKyAgICAgICAgICAgICBzcGlubmVyTW9kZT0iZHJvcGRvd24iLiBUaGlzIGxheW91dCBtdXN0IGNvbnRhaW4gYSBUZXh0VmlldyB3aXRoIHRoZSBpZAorICAgICAgICAgICAgIEBhbmRyb2lkOmlkL3RleHQxIHRvIGJlIHBvcHVsYXRlZCB3aXRoIHRoZSBwcm9tcHQgdGV4dC4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9InBvcHVwUHJvbXB0VmlldyIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+CiAgICAgPC9kZWNsYXJlLXN0eWxlYWJsZT4KICAgICA8ZGVjbGFyZS1zdHlsZWFibGUgbmFtZT0iRGF0ZVBpY2tlciI+CiAgICAgICAgIDwhLS0gVGhlIGZpcnN0IHllYXIgKGluY2x1c2l2ZSksIGZvciBleGFtcGxlICIxOTQwIi4gLS0+CkBAIC0yNTA2LDYgKzI1NTksMTAgQEAKICAgICAgICAgPGF0dHIgbmFtZT0iZHJhd2FibGUiIC8+CiAgICAgPC9kZWNsYXJlLXN0eWxlYWJsZT4KIAorICAgIDxkZWNsYXJlLXN0eWxlYWJsZSBuYW1lPSJNaXBtYXBEcmF3YWJsZUl0ZW0iPgorICAgICAgICA8YXR0ciBuYW1lPSJkcmF3YWJsZSIgLz4KKyAgICA8L2RlY2xhcmUtc3R5bGVhYmxlPgorCiAgICAgPGRlY2xhcmUtc3R5bGVhYmxlIG5hbWU9IlJvdGF0ZURyYXdhYmxlIj4KICAgICAgICAgPGF0dHIgbmFtZT0idmlzaWJsZSIgLz4KICAgICAgICAgPGF0dHIgbmFtZT0iZnJvbURlZ3JlZXMiIGZvcm1hdD0iZmxvYXQiIC8+CkBAIC0zMjM3LDYgKzMyOTQsMTcgQEAKICAgICAgICAgPCEtLSBXaGV0aGVyIHRoZSBpdGVtIGlzIGVuYWJsZWQuIC0tPgogICAgICAgICA8YXR0ciBuYW1lPSJlbmFibGVkIiAvPgogCisgICAgICAgIDwhLS0gTmFtZSBvZiBhIG1ldGhvZCBvbiB0aGUgQ29udGV4dCB1c2VkIHRvIGluZmxhdGUgdGhlIG1lbnUgdGhhdCB3aWxsIGJlCisgICAgICAgICAgICAgY2FsbGVkIHdoZW4gdGhlIGl0ZW0gaXMgY2xpY2tlZC4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9Im9uQ2xpY2siIC8+CisKKyAgICAgICAgPCEtLSBIb3cgdGhpcyBpdGVtIHNob3VsZCBkaXNwbGF5IGluIHRoZSBBY3Rpb24gQmFyLCBpZiBwcmVzZW50LiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0ic2hvd0FzQWN0aW9uIiBmb3JtYXQ9ImVudW0iPgorICAgICAgICAgICAgPGVudW0gbmFtZT0ibmV2ZXIiIHZhbHVlPSIwIiAvPgorICAgICAgICAgICAgPGVudW0gbmFtZT0iaWZSb29tIiB2YWx1ZT0iMSIgLz4KKyAgICAgICAgICAgIDxlbnVtIG5hbWU9ImFsd2F5cyIgdmFsdWU9IjIiIC8+CisgICAgICAgIDwvYXR0cj4KKwogICAgIDwvZGVjbGFyZS1zdHlsZWFibGU+CiAKICAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CkBAIC0zMzM5LDYgKzM0MDcsMTYgQEAKICAgICAgICAgPGF0dHIgbmFtZT0iZW50cnlWYWx1ZXMiIGZvcm1hdD0icmVmZXJlbmNlIiAvPgogICAgIDwvZGVjbGFyZS1zdHlsZWFibGU+CiAKKyAgICA8ZGVjbGFyZS1zdHlsZWFibGUgbmFtZT0iTXVsdGlTZWxlY3RMaXN0UHJlZmVyZW5jZSI+CisgICAgICAgIDwhLS0gVGhlIGh1bWFuLXJlYWRhYmxlIGFycmF5IHRvIHByZXNlbnQgYXMgYSBsaXN0LiBFYWNoIGVudHJ5IG11c3QgaGF2ZSBhIGNvcnJlc3BvbmRpbmcKKyAgICAgICAgICAgICBpbmRleCBpbiBlbnRyeVZhbHVlcy4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImVudHJpZXMiIC8+CisgICAgICAgIDwhLS0gVGhlIGFycmF5IHRvIGZpbmQgdGhlIHZhbHVlIHRvIHNhdmUgZm9yIGEgcHJlZmVyZW5jZSB3aGVuIGFuIGVudHJ5IGZyb20KKyAgICAgICAgICAgICBlbnRyaWVzIGlzIHNlbGVjdGVkLiBJZiBhIHVzZXIgY2xpY2tzIHRoZSBzZWNvbmQgaXRlbSBpbiBlbnRyaWVzLCB0aGUKKyAgICAgICAgICAgICBzZWNvbmQgaXRlbSBpbiB0aGlzIGFycmF5IHdpbGwgYmUgc2F2ZWQgdG8gdGhlIHByZWZlcmVuY2UuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJlbnRyeVZhbHVlcyIgLz4KKyAgICA8L2RlY2xhcmUtc3R5bGVhYmxlPgorCiAgICAgPCEtLSBCYXNlIGF0dHJpYnV0ZXMgYXZhaWxhYmxlIHRvIFJpbmd0b25lUHJlZmVyZW5jZS4gLS0+CiAgICAgPGRlY2xhcmUtc3R5bGVhYmxlIG5hbWU9IlJpbmd0b25lUHJlZmVyZW5jZSI+CiAgICAgICAgIDwhLS0gV2hpY2ggcmluZ3RvbmUgdHlwZShzKSB0byBzaG93IGluIHRoZSBwaWNrZXIuIC0tPgpAQCAtMzQ5MCw3ICszNTY4LDcgQEAKICAgICA8IS0tIEFwcFdpZGdldCBwYWNrYWdlIGNsYXNzIGF0dHJpYnV0ZXMgLS0+CiAgICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgogICAgIDxlYXQtY29tbWVudCAvPgotICAgIAorCiAgICAgPCEtLSBVc2UgPGNvZGU+YXBwd2lkZ2V0LXByb3ZpZGVyPC9jb2RlPiBhcyB0aGUgcm9vdCB0YWcgb2YgdGhlIFhNTCByZXNvdXJjZSB0aGF0CiAgICAgICAgICBkZXNjcmliZXMgYW4gQXBwV2lkZ2V0IHByb3ZpZGVyLiAgU2VlIHtAbGluayBhbmRyb2lkLmFwcHdpZGdldCBhbmRyb2lkLmFwcHdpZGdldH0KICAgICAgICAgIHBhY2thZ2UgZm9yIG1vcmUgaW5mby4KQEAgLTM1MTMsNyArMzU5MSw0MCBAQAogICAgIDwhLS0gQXBwIHBhY2thZ2UgY2xhc3MgYXR0cmlidXRlcyAtLT4KICAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CiAgICAgPGVhdC1jb21tZW50IC8+Ci0gICAgCisKKyAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorICAgIDwhLS0gVmlldyBwYWNrYWdlIGNsYXNzIGF0dHJpYnV0ZXMgLS0+CisgICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgICA8ZWF0LWNvbW1lbnQgLz4KKworICAgIDwhLS0gQXR0cmlidXRlcyB0aGF0IGNhbiBiZSB1c2VkIHdpdGggPGNvZGU+Jmx0O2ZyYWdtZW50Jmd0OzwvY29kZT4KKyAgICAgICAgIHRhZ3MgaW5zaWRlIG9mIHRoZSBsYXlvdXQgb2YgYW4gQWN0aXZpdHkuICBUaGlzIGluc3RhbnRpYXRlcworICAgICAgICAgdGhlIGdpdmVuIHtAbGluayBhbmRyb2lkLmFwcC5GcmFnbWVudH0gYW5kIGluc2VydHMgaXRzIGNvbnRlbnQKKyAgICAgICAgIHZpZXcgaW50byB0aGUgY3VycmVudCBsb2NhdGlvbiBpbiB0aGUgbGF5b3V0LiAtLT4KKyAgICA8ZGVjbGFyZS1zdHlsZWFibGUgbmFtZT0iRnJhZ21lbnQiPgorICAgICAgICA8IS0tIFN1cHBseSB0aGUgbmFtZSBvZiB0aGUgZnJhZ21lbnQgY2xhc3MgdG8gaW5zdGFudGlhdGUuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJuYW1lIiAvPgorCisgICAgICAgIDwhLS0gU3VwcGx5IGFuIGlkZW50aWZpZXIgbmFtZSBmb3IgdGhlIHRvcC1sZXZlbCB2aWV3LCB0byBsYXRlciByZXRyaWV2ZSBpdAorICAgICAgICAgICAgIHdpdGgge0BsaW5rIGFuZHJvaWQudmlldy5WaWV3I2ZpbmRWaWV3QnlJZCBWaWV3LmZpbmRWaWV3QnlJZCgpfSBvcgorICAgICAgICAgICAgIHtAbGluayBhbmRyb2lkLmFwcC5BY3Rpdml0eSNmaW5kVmlld0J5SWQgQWN0aXZpdHkuZmluZFZpZXdCeUlkKCl9LgorICAgICAgICAgICAgIFRoaXMgbXVzdCBiZSBhCisgICAgICAgICAgICAgcmVzb3VyY2UgcmVmZXJlbmNlOyB0eXBpY2FsbHkgeW91IHNldCB0aGlzIHVzaW5nIHRoZQorICAgICAgICAgICAgIDxjb2RlPkArPC9jb2RlPiBzeW50YXggdG8gY3JlYXRlIGEgbmV3IElEIHJlc291cmNlcy4KKyAgICAgICAgICAgICBGb3IgZXhhbXBsZTogPGNvZGU+YW5kcm9pZDppZD0iQCtpZC9teV9pZCI8L2NvZGU+IHdoaWNoCisgICAgICAgICAgICAgYWxsb3dzIHlvdSB0byBsYXRlciByZXRyaWV2ZSB0aGUgdmlldworICAgICAgICAgICAgIHdpdGggPGNvZGU+ZmluZFZpZXdCeUlkKFIuaWQubXlfaWQpPC9jb2RlPi4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImlkIiAvPgorCisgICAgICAgIDwhLS0gU3VwcGx5IGEgdGFnIGZvciB0aGUgdG9wLWxldmVsIHZpZXcgY29udGFpbmluZyBhIFN0cmluZywgdG8gYmUgcmV0cmlldmVkCisgICAgICAgICAgICAgbGF0ZXIgd2l0aCB7QGxpbmsgYW5kcm9pZC52aWV3LlZpZXcjZ2V0VGFnIFZpZXcuZ2V0VGFnKCl9IG9yCisgICAgICAgICAgICAgc2VhcmNoZWQgZm9yIHdpdGgge0BsaW5rIGFuZHJvaWQudmlldy5WaWV3I2ZpbmRWaWV3V2l0aFRhZworICAgICAgICAgICAgIFZpZXcuZmluZFZpZXdXaXRoVGFnKCl9LiAgSXQgaXMgZ2VuZXJhbGx5IHByZWZlcmFibGUgdG8gdXNlCisgICAgICAgICAgICAgSURzICh0aHJvdWdoIHRoZSBhbmRyb2lkOmlkIGF0dHJpYnV0ZSkgaW5zdGVhZCBvZiB0YWdzIGJlY2F1c2UKKyAgICAgICAgICAgICB0aGV5IGFyZSBmYXN0ZXIgYW5kIGFsbG93IGZvciBjb21waWxlLXRpbWUgdHlwZSBjaGVja2luZy4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9InRhZyIgLz4KKyAgICA8L2RlY2xhcmUtc3R5bGVhYmxlPgorCiAgICAgPCEtLSBVc2UgPGNvZGU+ZGV2aWNlLWFkbWluPC9jb2RlPiBhcyB0aGUgcm9vdCB0YWcgb2YgdGhlIFhNTCByZXNvdXJjZSB0aGF0CiAgICAgICAgICBkZXNjcmliZXMgYQogICAgICAgICAge0BsaW5rIGFuZHJvaWQuYXBwLmFkbWluLkRldmljZUFkbWluUmVjZWl2ZXJ9LCB3aGljaCBpcwpAQCAtMzU1Myw3ICszNjY0LDcgQEAKICAgICA8IS0tIEFjY291bnRzIHBhY2thZ2UgY2xhc3MgYXR0cmlidXRlcyAtLT4KICAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CiAgICAgPGVhdC1jb21tZW50IC8+Ci0gICAgCisKICAgICA8IS0tIFVzZSA8Y29kZT5hY2NvdW50LWF1dGhlbnRpY2F0b3I8L2NvZGU+IGFzIHRoZSByb290IHRhZyBvZiB0aGUgWE1MIHJlc291cmNlIHRoYXQKICAgICAgICAgIGRlc2NyaWJlcyBhbiBhY2NvdW50IGF1dGhlbnRpY2F0b3IuCiAgICAgIC0tPgpAQCAtMzU3NCw3ICszNjg1LDcgQEAKICAgICA8IS0tIEFjY291bnRzIHBhY2thZ2UgY2xhc3MgYXR0cmlidXRlcyAtLT4KICAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CiAgICAgPGVhdC1jb21tZW50IC8+Ci0gICAgCisKICAgICA8IS0tIFVzZSA8Y29kZT5hY2NvdW50LWF1dGhlbnRpY2F0b3I8L2NvZGU+IGFzIHRoZSByb290IHRhZyBvZiB0aGUgWE1MIHJlc291cmNlIHRoYXQKICAgICAgICAgIGRlc2NyaWJlcyBhbiBhY2NvdW50IGF1dGhlbnRpY2F0b3IuCiAgICAgIC0tPgpAQCAtMzU5MCw3ICszNzAxLDcgQEAKICAgICA8IS0tIENvbnRhY3RzIG1ldGEtZGF0YSBhdHRyaWJ1dGVzIC0tPgogICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KICAgICA8ZWF0LWNvbW1lbnQgLz4KLSAgICAKKwogICAgIDwhLS0gVE9ETzogcmVtb3ZlIHRoaXMgZGVwcmVjYXRlZCBzdHlsZWFibGUuIC0tPgogICAgIDxlYXQtY29tbWVudCAvPgogICAgIDxkZWNsYXJlLXN0eWxlYWJsZSBuYW1lPSJJY29uIj4KQEAgLTM2MTYsNiArMzcyNyw5IEBACiAgICAgICAgIDxhdHRyIG5hbWU9ImRldGFpbENvbHVtbiIgZm9ybWF0PSJzdHJpbmciIC8+CiAgICAgICAgIDwhLS0gRmxhZyBpbmRpY2F0aW5nIHRoYXQgZGV0YWlsIHNob3VsZCBiZSBidWlsdCBmcm9tIFNvY2lhbFByb3ZpZGVyLiAtLT4KICAgICAgICAgPGF0dHIgbmFtZT0iZGV0YWlsU29jaWFsU3VtbWFyeSIgZm9ybWF0PSJib29sZWFuIiAvPgorICAgICAgICA8IS0tIFJlc291cmNlIHJlcHJlc2VudGluZyB0aGUgdGVybSAiQWxsIENvbnRhY3RzIiAoZS5nLiAiQWxsIEZyaWVuZHMiIG9yCisgICAgICAgICJBbGwgY29ubmVjdGlvbnMiKS4gT3B0aW9uYWwgKERlZmF1bHQgaXMgIkFsbCBDb250YWN0cyIpLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0iYWxsQ29udGFjdHNOYW1lIiBmb3JtYXQ9InN0cmluZyIgLz4KICAgICA8L2RlY2xhcmUtc3R5bGVhYmxlPgogCiAgICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgpAQCAtMzY0Nyw0ICszNzYxLDEwNSBAQAogICAgICAgICA8YXR0ciBuYW1lPSJzZXR0aW5nc0FjdGl2aXR5IiAvPgogICAgIDwvZGVjbGFyZS1zdHlsZWFibGU+CiAKKyAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisgICAgPCEtLSBBZGFwdGVycyBhdHRyaWJ1dGVzICAgICAgICAgICAgIC0tPgorICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgICA8ZWF0LWNvbW1lbnQgLz4KKworICAgIDwhLS0gQWRhcHRlciB1c2VkIHRvIGJpbmQgY3Vyc29ycy4gLS0+CisgICAgPGRlY2xhcmUtc3R5bGVhYmxlIG5hbWU9IkN1cnNvckFkYXB0ZXIiPgorICAgICAgICA8IS0tIFVSSSB0byBnZXQgdGhlIGN1cnNvciBmcm9tLiBPcHRpb25hbC4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9InVyaSIgZm9ybWF0PSJzdHJpbmciIC8+CisgICAgICAgIDwhLS0gU2VsZWN0aW9uIHN0YXRlbWVudCBmb3IgdGhlIHF1ZXJ5LiBPcHRpb25hbC4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9InNlbGVjdGlvbiIgZm9ybWF0PSJzdHJpbmciIC8+CisgICAgICAgIDwhLS0gU29ydCBvcmRlciBzdGF0ZW1lbnQgZm9yIHRoZSBxdWVyeS4gT3B0aW9uYWwuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJzb3J0T3JkZXIiIGZvcm1hdD0ic3RyaW5nIiAvPgorICAgICAgICA8IS0tIExheW91dCByZXNvdXJjZSB1c2VkIHRvIGRpc3BsYXkgZWFjaCByb3cgZnJvbSB0aGUgY3Vyc29yLiBNYW5kYXRvcnkuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJsYXlvdXQiIC8+CisgICAgPC9kZWNsYXJlLXN0eWxlYWJsZT4KKworICAgIDwhLS0gQXR0cmlidXRlcyB1c2VkIGluIGJpbmQgaXRlbXMgZm9yIFhNTCBjdXJzb3IgYWRhcHRlcnMuIC0tPgorICAgIDxkZWNsYXJlLXN0eWxlYWJsZSBuYW1lPSJDdXJzb3JBZGFwdGVyX0JpbmRJdGVtIj4KKyAgICAgICAgPCEtLSBUaGUgbmFtZSBvZiB0aGUgY29sdW1uIHRvIGJpbmQgZnJvbS4gTWFuZGF0b3J5LiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0iZnJvbSIgZm9ybWF0PSJzdHJpbmciIC8+CisgICAgICAgIDwhLS0gVGhlIHJlc291cmNlIGlkIG9mIHRoZSB2aWV3IHRvIGJpbmQgdG8uIE1hbmRhdG9yeS4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9InRvIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KKyAgICAgICAgPCEtLSBUaGUgdHlwZSBvZiBiaW5kaW5nLiBJZiB0aGlzIHZhbHVlIGlzIG5vdCBzcGVjaWZpZWQsIHRoZSB0eXBlIHdpbGwgYmUKKyAgICAgICAgICAgICBpbmZlcnJlZCBmcm9tIHRoZSB0eXBlIG9mIHRoZSAidG8iIHRhcmdldCB2aWV3LiBNYW5kYXRvcnkuCisKKyAgICAgICAgICAgICBUaGUgdHlwZSBjYW4gYmUgb25lIG9mOgorICAgICAgICAgICAgIDx1bD4KKyAgICAgICAgICAgICA8bGk+c3RyaW5nLCBUaGUgY29udGVudCBvZiB0aGUgY29sdW1uIGlzIGludGVycHJldGVkIGFzIGEgc3RyaW5nLjwvbGk+CisgICAgICAgICAgICAgPGxpPmltYWdlLCBUaGUgY29udGVudCBvZiB0aGUgY29sdW1uIGlzIGludGVycHJldGVkIGFzIGEgYmxvYiBkZXNjcmliaW5nIGFuIGltYWdlLjwvbGk+CisgICAgICAgICAgICAgPGxpPmltYWdlLXVyaSwgVGhlIGNvbnRlbnQgb2YgdGhlIGNvbHVtbiBpcyBpbnRlcnByZXRlZCBhcyBhIFVSSSB0byBhbiBpbWFnZS48L2xpPgorICAgICAgICAgICAgIDxsaT5kcmF3YWJsZSwgVGhlIGNvbnRlbnQgb2YgdGhlIGNvbHVtbiBpcyBpbnRlcnByZXRlZCBhcyBhIHJlc291cmNlIGlkIHRvIGEgZHJhd2FibGUuPC9saT4KKyAgICAgICAgICAgICA8bGk+QSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSwgY29ycmVzcG9uZGluZyB0byBhbiBpbXBsZW1lbnRhdGlvbiBvZgorICAgICAgICAgICAgICAgICBhbmRyb2lkLndpZGdldC5BZGFwdGVycy5DdXJzb3JCaW5kZXIuPC9saT4KKyAgICAgICAgICAgICA8L3VsPgorICAgICAgICAgLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImFzIiBmb3JtYXQ9InN0cmluZyIgLz4KKyAgICA8L2RlY2xhcmUtc3R5bGVhYmxlPgorCisgICAgPCEtLSBBdHRyaWJ1dGVzIHVzZWQgaW4gc2VsZWN0IGl0ZW1zIGZvciBYTUwgY3Vyc29yIGFkYXB0ZXJzLiAtLT4KKyAgICA8ZGVjbGFyZS1zdHlsZWFibGUgbmFtZT0iQ3Vyc29yQWRhcHRlcl9TZWxlY3RJdGVtIj4KKyAgICAgICAgPCEtLSBUaGUgbmFtZSBvZiB0aGUgY29sdW1uIHRvIHNlbGVjdC4gTWFuZGF0b3J5LiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0iY29sdW1uIiBmb3JtYXQ9InN0cmluZyIgLz4KKyAgICA8L2RlY2xhcmUtc3R5bGVhYmxlPgorCisgICAgPCEtLSBBdHRyaWJ1dGVzIHVzZWQgdG8gbWFwIHZhbHVlcyB0byBuZXcgdmFsdWVzIGluIFhNTCBjdXJzb3IgYWRhcHRlcnMnIGJpbmQgaXRlbXMuIC0tPgorICAgIDxkZWNsYXJlLXN0eWxlYWJsZSBuYW1lPSJDdXJzb3JBZGFwdGVyX01hcEl0ZW0iPgorICAgICAgICA8IS0tIFRoZSBvcmlnaW5hbCB2YWx1ZSBmcm9tIHRoZSBjb2x1bW4uIE1hbmRhdG9yeS4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImZyb21WYWx1ZSIgZm9ybWF0PSJzdHJpbmciIC8+CisgICAgICAgIDwhLS0gVGhlIG5ldyB2YWx1ZSBmcm9tIHRoZSBjb2x1bW4uIE1hbmRhdG9yeS4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9InRvVmFsdWUiIGZvcm1hdD0ic3RyaW5nIiAvPgorICAgIDwvZGVjbGFyZS1zdHlsZWFibGU+CisKKyAgICA8IS0tIEF0dHJpYnV0ZXMgdXNlZCB0byBtYXAgdmFsdWVzIHRvIG5ldyB2YWx1ZXMgaW4gWE1MIGN1cnNvciBhZGFwdGVycycgYmluZCBpdGVtcy4gLS0+CisgICAgPGRlY2xhcmUtc3R5bGVhYmxlIG5hbWU9IkN1cnNvckFkYXB0ZXJfVHJhbnNmb3JtSXRlbSI+CisgICAgICAgIDwhLS0gVGhlIHRyYW5zZm9ybWF0aW9uIGV4cHJlc3Npb24uIE1hbmRhdG9yeSBpZiAid2l0aENsYXNzIiBpcyBub3Qgc3BlY2lmaWVkLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0id2l0aEV4cHJlc3Npb24iIGZvcm1hdD0ic3RyaW5nIiAvPgorICAgICAgICA8IS0tIFRoZSB0cmFuc2Zvcm1hdGlvbiBjbGFzcywgYW4gaW1wbGVtZW50YXRpb24gb2YKKyAgICAgICAgICAgICBhbmRyb2lkLndpZGdldC5BZGFwdGVycy5DdXJzb3JUcmFuc2Zvcm1hdGlvbi4gTWFuZGF0b3J5IGlmICJ3aXRoRXhwcmVzc2lvbiIKKyAgICAgICAgICAgICBpcyBub3Qgc3BlY2lmaWVkLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0id2l0aENsYXNzIiBmb3JtYXQ9InN0cmluZyIgLz4KKyAgICA8L2RlY2xhcmUtc3R5bGVhYmxlPgorCisgICAgPCEtLSBBdHRyaWJ1dGVzIHVzZWQgdG8gc3R5bGUgdGhlIEFjdGlvbiBCYXIuIC0tPgorICAgIDxkZWNsYXJlLXN0eWxlYWJsZSBuYW1lPSJBY3Rpb25CYXIiPgorICAgICAgICA8IS0tIFRoZSB0eXBlIG9mIG5hdmlnYXRpb24gdG8gdXNlLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0ibmF2aWdhdGlvbk1vZGUiPgorICAgICAgICAgICAgPCEtLSBOb3JtYWwgc3RhdGljIHRpdGxlIHRleHQgLS0+CisgICAgICAgICAgICA8ZW51bSBuYW1lPSJub3JtYWwiIHZhbHVlPSIwIiAvPgorICAgICAgICAgICAgPCEtLSBUaGUgYWN0aW9uIGJhciB3aWxsIHVzZSBhIGRyb3AtZG93biBzZWxlY3Rpb24gaW4gcGxhY2Ugb2YgdGl0bGUgdGV4dC4gLS0+CisgICAgICAgICAgICA8ZW51bSBuYW1lPSJkcm9wZG93bkxpc3QiIHZhbHVlPSIxIiAvPgorICAgICAgICAgICAgPCEtLSBUaGUgYWN0aW9uIGJhciB3aWxsIHVzZSBhIHNlcmllcyBvZiBob3Jpem9udGFsIHRhYnMgaW4gcGxhY2Ugb2YgdGl0bGUgdGV4dC4gLS0+CisgICAgICAgICAgICA8ZW51bSBuYW1lPSJ0YWJCYXIiIHZhbHVlPSIyIiAvPgorICAgICAgICA8L2F0dHI+CisgICAgICAgIDwhLS0gT3B0aW9ucyBhZmZlY3RpbmcgaG93IHRoZSBhY3Rpb24gYmFyIGlzIGRpc3BsYXllZC4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImRpc3BsYXlPcHRpb25zIj4KKyAgICAgICAgICAgIDxmbGFnIG5hbWU9InVzZUxvZ28iIHZhbHVlPSIxIiAvPgorICAgICAgICAgICAgPGZsYWcgbmFtZT0iaGlkZUhvbWUiIHZhbHVlPSIyIiAvPgorICAgICAgICA8L2F0dHI+CisgICAgICAgIDwhLS0gU3BlY2lmaWVzIHRoZSBjb2xvciB1c2VkIHRvIHN0eWxlIHRoZSBhY3Rpb24gYmFyLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0iY29sb3JGaWx0ZXIiIGZvcm1hdD0iY29sb3IiIC8+CisgICAgICAgIDwhLS0gU3BlY2lmaWVzIHRpdGxlIHRleHQgdXNlZCBmb3IgbmF2aWdhdGlvbk1vZGU9Im5vcm1hbCIgLS0+CisgICAgICAgIDxhdHRyIG5hbWU9InRpdGxlIiAvPgorICAgICAgICA8IS0tIFNwZWNpZmllcyBzdWJ0aXRsZSB0ZXh0IHVzZWQgZm9yIG5hdmlnYXRpb25Nb2RlPSJub3JtYWwiIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJzdWJ0aXRsZSIgZm9ybWF0PSJzdHJpbmciIC8+CisgICAgICAgIDwhLS0gU3BlY2lmaWVzIGEgc3R5bGUgdG8gdXNlIGZvciB0aXRsZSB0ZXh0LiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0idGl0bGVUZXh0U3R5bGUiIGZvcm1hdD0icmVmZXJlbmNlIiAvPgorICAgICAgICA8IS0tIFNwZWNpZmllcyBhIHN0eWxlIHRvIHVzZSBmb3Igc3VidGl0bGUgdGV4dC4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9InN1YnRpdGxlVGV4dFN0eWxlIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KKyAgICAgICAgPCEtLSBTcGVjaWZpZXMgdGhlIGRyYXdhYmxlIHVzZWQgZm9yIHRoZSBhcHBsaWNhdGlvbiBpY29uLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0iaWNvbiIgLz4KKyAgICAgICAgPCEtLSBTcGVjaWZpZXMgdGhlIGRyYXdhYmxlIHVzZWQgZm9yIHRoZSBhcHBsaWNhdGlvbiBsb2dvLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0ibG9nbyIgLz4KKyAgICAgICAgPCEtLSBTcGVjaWZpZXMgdGhlIGRyYXdhYmxlIHVzZWQgZm9yIGl0ZW0gZGl2aWRlcnMuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJkaXZpZGVyIiAvPgorICAgICAgICA8IS0tIFNwZWNpZmllcyBhIGJhY2tncm91bmQgZHJhd2FibGUgZm9yIHRoZSBhY3Rpb24gYmFyLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0iYmFja2dyb3VuZCIgLz4KKyAgICAgICAgPCEtLSBTcGVjaWZpZXMgYSBsYXlvdXQgZm9yIGN1c3RvbSBuYXZpZ2F0aW9uLiBPdmVycmlkZXMgbmF2aWdhdGlvbk1vZGUuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJjdXN0b21OYXZpZ2F0aW9uTGF5b3V0IiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KKyAgICA8L2RlY2xhcmUtc3R5bGVhYmxlPgorCiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMvYXR0cnNfbWFuaWZlc3QueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy9hdHRyc19tYW5pZmVzdC54bWwKaW5kZXggZjE4ZDE0ZS4uNWU4YzYxOCAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy9hdHRyc19tYW5pZmVzdC54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy9hdHRyc19tYW5pZmVzdC54bWwKQEAgLTIzNSw2ICsyMzUsMTAgQEAKICAgICAgICAgIHRoZSBzYWZlIG1vZGUuICAtLT4KICAgICA8YXR0ciBuYW1lPSJ2bVNhZmVNb2RlIiBmb3JtYXQ9ImJvb2xlYW4iIC8+CiAKKyAgICA8IS0tIEZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBhcHBsaWNhdGlvbidzIHJlbmRlcmluZyBzaG91bGQgYmUgaGFyZHdhcmUKKyAgICAgICAgIGFjY2VsZXJhdGVkIGlmIHBvc3NpYmxlLiAgLS0+CisgICAgPGF0dHIgbmFtZT0iaGFyZHdhcmVBY2NlbGVyYXRlZCIgZm9ybWF0PSJib29sZWFuIiAvPgorCiAgICAgPCEtLSBGbGFnIGluZGljYXRpbmcgd2hldGhlciB0aGUgZ2l2ZW4gYXBwbGljYXRpb24gY29tcG9uZW50IGlzIGF2YWlsYWJsZQogICAgICAgICAgdG8gb3RoZXIgYXBwbGljYXRpb25zLiAgSWYgZmFsc2UsIGl0IGNhbiBvbmx5IGJlIGFjY2Vzc2VkIGJ5CiAgICAgICAgICBhcHBsaWNhdGlvbnMgd2l0aCBpdHMgc2FtZSB1c2VyIGlkICh3aGljaCB1c3VhbGx5IG1lYW5zIG9ubHkgYnkKQEAgLTczNCw2ICs3MzgsNyBAQAogICAgICAgICA8YXR0ciBuYW1lPSJlbmFibGVkIiAvPgogICAgICAgICA8YXR0ciBuYW1lPSJkZWJ1Z2dhYmxlIiAvPgogICAgICAgICA8YXR0ciBuYW1lPSJ2bVNhZmVNb2RlIiAvPgorICAgICAgICA8YXR0ciBuYW1lPSJoYXJkd2FyZUFjY2VsZXJhdGVkIiAvPgogICAgICAgICA8IS0tIE5hbWUgb2YgYWN0aXZpdHkgdG8gYmUgbGF1bmNoZWQgZm9yIG1hbmFnaW5nIHRoZSBhcHBsaWNhdGlvbidzIHNwYWNlIG9uIHRoZSBkZXZpY2UuIC0tPgogICAgICAgICA8YXR0ciBuYW1lPSJtYW5hZ2VTcGFjZUFjdGl2aXR5IiAvPgogICAgICAgICA8YXR0ciBuYW1lPSJhbGxvd0NsZWFyVXNlckRhdGEiIC8+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzL2NvbmZpZy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzL2NvbmZpZy54bWwKaW5kZXggY2ZmY2QxZC4uZWMwZDgzYyAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy9jb25maWcueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMvY29uZmlnLnhtbApAQCAtOTgsNiArOTgsOSBAQAogICAgICAgICA8aXRlbT4iMCwxIjwvaXRlbT4KICAgICA8L3N0cmluZy1hcnJheT4KIAorICAgIDwhLS0gVGhlIG1heGltdW0gZHVyYXRpb24gKGluIG1pbGxpc2Vjb25kcykgd2UgZXhwZWN0IGEgbmV0d29yayB0cmFuc2l0aW9uIHRvIHRha2UgLS0+CisgICAgPGludGVnZXIgbmFtZT0iY29uZmlnX25ldHdvcmtUcmFuc2l0aW9uVGltZW91dCI+NjAwMDA8L2ludGVnZXI+CisKICAgICA8IS0tIExpc3Qgb2YgcmVnZXhwcmVzc2lvbnMgZGVzY3JpYmluZyB0aGUgaW50ZXJmYWNlIChpZiBhbnkpIHRoYXQgcmVwcmVzZW50IHRldGhlcmFibGUKICAgICAgICAgIFVTQiBpbnRlcmZhY2VzLiAgSWYgdGhlIGRldmljZSBkb2Vzbid0IHdhbnQgdG8gc3VwcG9ydCB0ZXRoaW5nIG92ZXIgVVNCIHRoaXMgc2hvdWxkCiAgICAgICAgICBiZSBlbXB0eS4gIEFuIGV4YW1wbGUgd291bGQgYmUgInVzYi4qIiAtLT4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMvZGltZW5zLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMvZGltZW5zLnhtbAppbmRleCA4YTkyNzU3Li42NTY0NzFjIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzL2RpbWVucy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy9kaW1lbnMueG1sCkBAIC0yNSw2ICsyNSw5IEBACiAgICAgPCEtLSBUaGUgc3RhbmRhcmQgc2l6ZSAoYm90aCB3aWR0aCBhbmQgaGVpZ2h0KSBvZiBhbiBhcHBsaWNhdGlvbiBpY29uIHRoYXQKICAgICAgICAgIHdpbGwgYmUgZGlzcGxheWVkIGluIHRoZSBhcHAgbGF1bmNoZXIgYW5kIGVsc2V3aGVyZS4gLS0+CiAgICAgPGRpbWVuIG5hbWU9ImFwcF9pY29uX3NpemUiPjQ4ZGlwPC9kaW1lbj4KKyAgICA8IS0tIFRoZSBzdGFuZGFyZCBzaXplIChib3RoIHdpZHRoIGFuZCBoZWlnaHQpIG9mIGFuIGFjdGlvbiBpY29uIHRoYXQgd2lsbAorICAgICAgICAgYmUgZGlzcGxheWVkIGluIGFwcGxpY2F0aW9uIGFjdGlvbiBiYXJzLiAtLT4KKyAgICA8ZGltZW4gbmFtZT0iYWN0aW9uX2ljb25fc2l6ZSI+NDhkaXA8L2RpbWVuPgogICAgIDxkaW1lbiBuYW1lPSJ0b2FzdF95X29mZnNldCI+NjRkaXA8L2RpbWVuPgogICAgIDwhLS0gSGVpZ2h0IG9mIHRoZSBzdGF0dXMgYmFyIC0tPgogICAgIDxkaW1lbiBuYW1lPSJzdGF0dXNfYmFyX2hlaWdodCI+MjVkaXA8L2RpbWVuPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy9pZHMueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy9pZHMueG1sCmluZGV4IDhiNmFmNzEuLmU2MDdmYWQ1IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzL2lkcy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy9pZHMueG1sCkBAIC02OCw0ICs2OCw1IEBACiAgIDxpdGVtIHR5cGU9ImlkIiBuYW1lPSJhY2NvdW50UHJlZmVyZW5jZXMiIC8+CiAgIDxpdGVtIHR5cGU9ImlkIiBuYW1lPSJzbWFsbEljb24iIC8+CiAgIDxpdGVtIHR5cGU9ImlkIiBuYW1lPSJjdXN0b20iIC8+CisgIDxpdGVtIHR5cGU9ImlkIiBuYW1lPSJob21lIiAvPgogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzL3B1YmxpYy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzL3B1YmxpYy54bWwKaW5kZXggMjdjYjc2My4uM2QyZGIzOSAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy9wdWJsaWMueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMvcHVibGljLnhtbApAQCAtMTE3OCw3ICsxMTc4LDcgQEAKICAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJjb2xvckJhY2tncm91bmRDYWNoZUhpbnQiIGlkPSIweDAxMDEwMmFiIiAvPgogICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9ImRyb3BEb3duSG9yaXpvbnRhbE9mZnNldCIgaWQ9IjB4MDEwMTAyYWMiIC8+CiAgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0iZHJvcERvd25WZXJ0aWNhbE9mZnNldCIgaWQ9IjB4MDEwMTAyYWQiIC8+Ci0gIAorCiAgIDxwdWJsaWMgdHlwZT0ic3R5bGUiIG5hbWU9IlRoZW1lLldhbGxwYXBlciIgaWQ9IjB4MDEwMzAwNWUiIC8+CiAgIDxwdWJsaWMgdHlwZT0ic3R5bGUiIG5hbWU9IlRoZW1lLldhbGxwYXBlci5Ob1RpdGxlQmFyIiBpZD0iMHgwMTAzMDA1ZiIgLz4KICAgPHB1YmxpYyB0eXBlPSJzdHlsZSIgbmFtZT0iVGhlbWUuV2FsbHBhcGVyLk5vVGl0bGVCYXIuRnVsbHNjcmVlbiIgaWQ9IjB4MDEwMzAwNjAiIC8+CkBAIC0xMTg2LDcgKzExODYsNyBAQAogICA8cHVibGljIHR5cGU9InN0eWxlIiBuYW1lPSJUaGVtZS5MaWdodC5XYWxscGFwZXJTZXR0aW5ncyIgaWQ9IjB4MDEwMzAwNjIiIC8+CiAgIDxwdWJsaWMgdHlwZT0ic3R5bGUiIG5hbWU9IlRleHRBcHBlYXJhbmNlLlNlYXJjaFJlc3VsdC5UaXRsZSIgaWQ9IjB4MDEwMzAwNjMiIC8+CiAgIDxwdWJsaWMgdHlwZT0ic3R5bGUiIG5hbWU9IlRleHRBcHBlYXJhbmNlLlNlYXJjaFJlc3VsdC5TdWJ0aXRsZSIgaWQ9IjB4MDEwMzAwNjQiIC8+Ci0gIAorCiAgIDwhLS0gU2VtaS10cmFuc3BhcmVudCBiYWNrZ3JvdW5kIHRoYXQgY2FuIGJlIHVzZWQgd2hlbiBwbGFjaW5nIGEgZGFyawogICAgICAgIHRoZW1lZCBVSSBvbiB0b3Agb2Ygc29tZSBhcmJpdHJhcnkgYmFja2dyb3VuZCAoc3VjaCBhcyB0aGUKICAgICAgICB3YWxscGFwZXIpLiAgVGhpcyBkYXJrZW5zIHRoZSBiYWNrZ3JvdW5kIHN1ZmZpY2llbnRseSB0aGF0IHRoZSBVSQpAQCAtMTE5NCw3ICsxMTk0LDcgQEAKICAgPHB1YmxpYyB0eXBlPSJkcmF3YWJsZSIgbmFtZT0ic2NyZWVuX2JhY2tncm91bmRfZGFya190cmFuc3BhcmVudCIgaWQ9IjB4MDEwODAwYTkiIC8+CiAgIDxwdWJsaWMgdHlwZT0iZHJhd2FibGUiIG5hbWU9InNjcmVlbl9iYWNrZ3JvdW5kX2xpZ2h0X3RyYW5zcGFyZW50IiBpZD0iMHgwMTA4MDBhYSIgLz4KICAgPHB1YmxpYyB0eXBlPSJkcmF3YWJsZSIgbmFtZT0ic3RhdF9ub3RpZnlfc2RjYXJkX3ByZXBhcmUiIGlkPSIweDAxMDgwMGFiIiAvPgotICAKKwogPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICAgUmVzb3VyY2VzIGFkZGVkIGluIHZlcnNpb24gNiBvZiB0aGUgcGxhdGZvcm0gKEVjbGFpciAyLjAuMSkuCiAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KQEAgLTEyMDYsNyArMTIwNiw3IEBACiAgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0icXVpY2tDb250YWN0QmFkZ2VTdHlsZVNtYWxsV2luZG93U21hbGwiIGlkPSIweDAxMDEwMmIxIiAvPgogICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9InF1aWNrQ29udGFjdEJhZGdlU3R5bGVTbWFsbFdpbmRvd01lZGl1bSIgaWQ9IjB4MDEwMTAyYjIiIC8+CiAgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0icXVpY2tDb250YWN0QmFkZ2VTdHlsZVNtYWxsV2luZG93TGFyZ2UiIGlkPSIweDAxMDEwMmIzIiAvPgotICAKKwogPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICAgUmVzb3VyY2VzIGFkZGVkIGluIHZlcnNpb24gNyBvZiB0aGUgcGxhdGZvcm0gKEVjbGFpciBNUjEpLgogICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CkBAIC0xMjE1LDcgKzEyMTUsNyBAQAogICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9ImF1dGhvciIgaWQ9IjB4MDEwMTAyYjQiIC8+CiAgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0iYXV0b1N0YXJ0IiBpZD0iMHgwMTAxMDJiNSIgLz4KIAotICAgIAorCiA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgICBSZXNvdXJjZXMgYWRkZWQgaW4gdmVyc2lvbiA4IG9mIHRoZSBwbGF0Zm9ybSAoRWNsYWlyIE1SMikuCiAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KQEAgLTEyMzYsMTggKzEyMzYsMTggQEAKICAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJ0YWJTdHJpcEVuYWJsZWQiIGlkPSIweDAxMDEwMmJkIiAvPgogCiAgIDxwdWJsaWMgdHlwZT0iaWQiIG5hbWU9ImN1c3RvbSIgaWQ9IjB4MDEwMjAwMmIiIC8+Ci0gICAgCisKICAgPHB1YmxpYyB0eXBlPSJhbmltIiBuYW1lPSJjeWNsZV9pbnRlcnBvbGF0b3IiIGlkPSIweDAxMGEwMDBjIiAvPgogCiA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgICBSZXNvdXJjZXMgaW50cm9kdWNlZCBpbiBrcmFrZW4uCisgICAgIFJlc291cmNlcyBpbnRyb2R1Y2VkIGluIEdpbmdlcmJyZWFkLgogICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgIAorICA8ZWF0LWNvbW1lbnQgLz4KICAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJsb2dvIiBpZD0iMHgwMTAxMDJiZSIgLz4KICAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJ4bGFyZ2VTY3JlZW5zIiBpZD0iMHgwMTAxMDJiZiIgLz4KICAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJoZWF2eVdlaWdodCIgaWQ9IjB4MDEwMTAyYzAiIC8+CiAgIDxwdWJsaWMtcGFkZGluZyB0eXBlPSJhdHRyIiBuYW1lPSJrcmFrZW5fcmVzb3VyY2VfcGFkIiBlbmQ9IjB4MDEwMTAzMDAiIC8+Ci0gIAorCiAgIDxwdWJsaWMtcGFkZGluZyB0eXBlPSJpZCIgbmFtZT0ia3Jha2VuX3Jlc291cmNlX3BhZCIgZW5kPSIweDAxMDIwMDQwIiAvPgogICA8cHVibGljLXBhZGRpbmcgdHlwZT0iYW5pbSIgbmFtZT0ia3Jha2VuX3Jlc291cmNlX3BhZCIgZW5kPSIweDAxMGEwMDIwIiAvPgogCkBAIC0xMjU3LDkgKzEyNTcsOSBAQAogICA8cHVibGljIHR5cGU9ImRyYXdhYmxlIiBuYW1lPSJwcmVzZW5jZV92aWRlb19vbmxpbmUiIGlkPSIweDAxMDgwMGFlIiAvPgogICA8cHVibGljIHR5cGU9ImRyYXdhYmxlIiBuYW1lPSJwcmVzZW5jZV9hdWRpb19hd2F5IiBpZD0iMHgwMTA4MDBhZiIgLz4KICAgPHB1YmxpYyB0eXBlPSJkcmF3YWJsZSIgbmFtZT0icHJlc2VuY2VfYXVkaW9fYnVzeSIgaWQ9IjB4MDEwODAwYjAiIC8+Ci0gIDxwdWJsaWMgdHlwZT0iZHJhd2FibGUiIG5hbWU9InByZXNlbmNlX2F1ZGlvX29ubGluZSIgaWQ9IjB4MDEwODAwYjEiIC8+ICAKKyAgPHB1YmxpYyB0eXBlPSJkcmF3YWJsZSIgbmFtZT0icHJlc2VuY2VfYXVkaW9fb25saW5lIiBpZD0iMHgwMTA4MDBiMSIgLz4KICAgPHB1YmxpYy1wYWRkaW5nIHR5cGU9ImRyYXdhYmxlIiBuYW1lPSJrcmFrZW5fcmVzb3VyY2VfcGFkIiBlbmQ9IjB4MDEwODAxMDAiIC8+Ci0gIAorCiAgIDxwdWJsaWMtcGFkZGluZyB0eXBlPSJzdHlsZSIgbmFtZT0ia3Jha2VuX3Jlc291cmNlX3BhZCIgZW5kPSIweDAxMDMwMDkwIiAvPgogICA8cHVibGljLXBhZGRpbmcgdHlwZT0ic3RyaW5nIiBuYW1lPSJrcmFrZW5fcmVzb3VyY2VfcGFkIiBlbmQ9IjB4MDEwNDAwMjAiIC8+CiAgIDxwdWJsaWMtcGFkZGluZyB0eXBlPSJpbnRlZ2VyIiBuYW1lPSJrcmFrZW5fcmVzb3VyY2VfcGFkIiBlbmQ9IjB4MDEwZTAwMTAiIC8+CkBAIC0xMjY4LDQgKzEyNjgsNDIgQEAKICAgPHB1YmxpYy1wYWRkaW5nIHR5cGU9ImNvbG9yIiBuYW1lPSJrcmFrZW5fcmVzb3VyY2VfcGFkIiBlbmQ9IjB4MDEwNjAwMjAiIC8+CiAgIDxwdWJsaWMtcGFkZGluZyB0eXBlPSJhcnJheSIgbmFtZT0ia3Jha2VuX3Jlc291cmNlX3BhZCIgZW5kPSIweDAxMDcwMDEwIiAvPgogCis8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICBSZXNvdXJjZXMgcHJvcG9zZWQgZm9yIEhvbmV5Y29tYi4KKyAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorICA8ZWF0LWNvbW1lbnQgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJhZGFwdGVyIiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9InNlbGVjdGlvbiIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJzb3J0T3JkZXIiIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0idXJpIiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9ImZyb20iIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0idG8iIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0iYXMiIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0iZnJvbVZhbHVlIiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9InRvVmFsdWUiIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0iY29sdW1uIiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9IndpdGhFeHByZXNzaW9uIiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9IndpdGhDbGFzcyIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJhbGxDb250YWN0c05hbWUiIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0id2luZG93QWN0aW9uQmFyIiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9IndpbmRvd0FjdGlvbkJhclN0eWxlIiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9Im5hdmlnYXRpb25Nb2RlIiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9ImRpc3BsYXlPcHRpb25zIiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9InN1YnRpdGxlIiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9ImN1c3RvbU5hdmlnYXRpb25MYXlvdXQiIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0iaGFyZHdhcmVBY2NlbGVyYXRlZCIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJtZWFzdXJlV2l0aExhcmdlc3RDaGlsZCIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJhbmltYXRlRmlyc3RWaWV3IiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9ImRyb3BEb3duU3Bpbm5lclN0eWxlIiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9ImFjdGlvbkRyb3BEb3duU3R5bGUiIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0iYWN0aW9uQnV0dG9uU3R5bGUiIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0ic2hvd0FzQWN0aW9uIiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9ImFjdGlvbkJ1dHRvblBhZGRpbmciIC8+CisKKyAgPHB1YmxpYyB0eXBlPSJpZCIgbmFtZT0iaG9tZSIgLz4KKworICA8cHVibGljIHR5cGU9InN0eWxlIiBuYW1lPSJUaGVtZS5XaXRoQWN0aW9uQmFyIiAvPgorICA8cHVibGljIHR5cGU9InN0eWxlIiBuYW1lPSJXaWRnZXQuU3Bpbm5lci5Ecm9wRG93biIgLz4KKyAgPHB1YmxpYyB0eXBlPSJzdHlsZSIgbmFtZT0iV2lkZ2V0LkFjdGlvbkJ1dHRvbiIgLz4KKwogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzL3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbAppbmRleCA2MmZkMTY5Li42YjM3MWRmIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKQEAgLTE0MjEsMjAgKzE0MjEsMTggQEAKICAgICA8IS0tIEN1c3RvbSBvcmdhbml6YXRpb24gdHlwZSAtLT4KICAgICA8c3RyaW5nIG5hbWU9Im9yZ1R5cGVDdXN0b20iPkN1c3RvbTwvc3RyaW5nPgogCi0gICAgPCEtLSBBdHRidXRpb24gb2YgYSBjb250YWN0IHN0YXR1cyB1cGRhdGUsIHdoZW4gdGhlIHRpbWUgb2YgdXBkYXRlIGlzIHVua25vd24gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJjb250YWN0X3N0YXR1c191cGRhdGVfYXR0cmlidXRpb24iPnZpYSA8eGxpZmY6ZyBpZD0ic291cmNlIiBleGFtcGxlPSJHb29nbGUgVGFsayI+JTEkczwveGxpZmY6Zz48L3N0cmluZz4KLQotICAgIDwhLS0gQXR0YnV0aW9uIG9mIGEgY29udGFjdCBzdGF0dXMgdXBkYXRlLCB3aGVuIHRoZSB0aW1lIG9mIHVwZGF0ZSBpcyBrbm93biAtLT4KLSAgICA8c3RyaW5nIG5hbWU9ImNvbnRhY3Rfc3RhdHVzX3VwZGF0ZV9hdHRyaWJ1dGlvbl93aXRoX2RhdGUiPjx4bGlmZjpnIGlkPSJkYXRlIiBleGFtcGxlPSIzIGhvdXJzIGFnbyI+JTEkczwveGxpZmY6Zz4gdmlhIDx4bGlmZjpnIGlkPSJzb3VyY2UiIGV4YW1wbGU9Ikdvb2dsZSBUYWxrIj4lMiRzPC94bGlmZjpnPjwvc3RyaW5nPgotCiAgICAgPCEtLSBJbnN0cnVjdGlvbnMgdGVsbGluZyB0aGUgdXNlciB0byBlbnRlciB0aGVpciBTSU0gUElOIHRvIHVubG9jayB0aGUga2V5Z3VhcmQuCiAgICAgICAgICBEaXNwbGF5ZWQgaW4gb25lIGxpbmUgaW4gYSBsYXJnZSBmb250LiAgLS0+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9waW5fY29kZSI+RW50ZXIgUElOIGNvZGU8L3N0cmluZz4KIAotICAgIDwhLS0gSW5zdHJ1Y3Rpb25zIHRlbGxpbmcgdGhlIHVzZXIgdG8gZW50ZXIgdGhlaXIgUElOIHBhc3N3b3JkIHRvIHVubG9jayB0aGUga2V5Z3VhcmQuCisgICAgPCEtLSBJbnN0cnVjdGlvbnMgdGVsbGluZyB0aGUgdXNlciB0byBlbnRlciB0aGVpciB0ZXh0IHBhc3N3b3JkIHRvIHVubG9jayB0aGUga2V5Z3VhcmQuCiAgICAgICAgICBEaXNwbGF5ZWQgaW4gb25lIGxpbmUgaW4gYSBsYXJnZSBmb250LiAgLS0+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9wYXNzd29yZF9jb2RlIj5FbnRlciBwYXNzd29yZCB0byB1bmxvY2s8L3N0cmluZz4KIAorICAgIDwhLS0gSW5zdHJ1Y3Rpb25zIHRlbGxpbmcgdGhlIHVzZXIgdG8gZW50ZXIgdGhlaXIgUElOIHBhc3N3b3JkIHRvIHVubG9jayB0aGUga2V5Z3VhcmQuCisgICAgICAgICBEaXNwbGF5ZWQgaW4gb25lIGxpbmUgaW4gYSBsYXJnZSBmb250LiAgLS0+CisgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9waW5fcGFzc3dvcmRfY29kZSI+RW50ZXIgUElOIHRvIHVubG9jazwvc3RyaW5nPgorCiAgICAgPCEtLSBJbnN0cnVjdGlvbnMgdGVsbGluZyB0aGUgdXNlciB0aGF0IHRoZXkgZW50ZXJlZCB0aGUgd3JvbmcgcGluIHdoaWxlIHRyeWluZwogICAgICAgICAgdG8gdW5sb2NrIHRoZSBrZXlndWFyZC4gIERpc3BsYXllZCBpbiBvbmUgbGluZSBpbiBhIGxhcmdlIGZvbnQuICAtLT4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX3dyb25nX3Bpbl9jb2RlIj5JbmNvcnJlY3QgUElOIGNvZGUhPC9zdHJpbmc+CkBAIC0xNDcxLDYgKzE0NjksOCBAQAogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXR0ZXJuX2NvcnJlY3QiPkNvcnJlY3QhPC9zdHJpbmc+CiAgICAgPCEtLSBPbiB0aGUgdW5sb2NrIHBhdHRlcm4gc2NyZWVuLCBzaG93biB3aGVuIHRoZSB1c2VyIGVudGVycyB0aGUgd3JvbmcgbG9jayBwYXR0ZXJuIGFuZCBtdXN0IHRyeSBhZ2Fpbi4gLS0+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BhdHRlcm5fd3JvbmciPlNvcnJ5LCB0cnkgYWdhaW48L3N0cmluZz4KKyAgICA8IS0tIE9uIHRoZSB1bmxvY2sgcGFzc3dvcmQgc2NyZWVuLCBzaG93biB3aGVuIHRoZSB1c2VyIGVudGVycyB0aGUgd3JvbmcgbG9jayBwYXNzd29yZCBhbmQgbXVzdCB0cnkgYWdhaW4uIC0tPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXNzd29yZF93cm9uZyI+U29ycnksIHRyeSBhZ2Fpbjwvc3RyaW5nPgogCiAgICAgPCEtLSBXaGVuIHRoZSBsb2NrIHNjcmVlbiBpcyBzaG93aW5nIGFuZCB0aGUgcGhvbmUgcGx1Z2dlZCBpbiwgYW5kIHRoZSBiYXR0ZXJ5CiAgICAgICAgICBpcyBub3QgZnVsbHkgY2hhcmdlZCwgc2hvdyB0aGUgY3VycmVudCBjaGFyZ2UgJS4gIC0tPgpAQCAtMTUxNCwxMiArMTUxNCwyNyBAQAogICAgICAgICAgcHJvZ3Jlc3MgZGlhbG9nIGluIHRoZSBtZWFudGltZS4gIHRoaXMgaXMgdGhlIGVtc3NhZ2UuIC0tPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9zaW1fdW5sb2NrX3Byb2dyZXNzX2RpYWxvZ19tZXNzYWdlIj5VbmxvY2tpbmcgU0lNIGNhcmRcdTIwMjY8L3N0cmluZz4KIAotICAgIDwhLS0gRm9yIHRoZSB1bmxvY2sgc2NyZWVuLCBJbmZvcm1hdGlvbiBtZXNzYWdlIHNob3duIGluIGRpYWxvZyB3aGVuIHVzZXIgaGFzIHRvbyBtYW55IGZhaWxlZCBhdHRlbXB0cyAtLT4KKyAgICA8IS0tIEZvciB0aGUgdW5sb2NrIHNjcmVlbiwgSW5mb3JtYXRpb24gbWVzc2FnZSBzaG93biBpbiBkaWFsb2cgd2hlbiB1c2VyIGhhcyB0b28gbWFueSBmYWlsZWQgYXR0ZW1wdHMgYXQKKyAgICAgICAgIGRyYXdpbmcgdGhlIHVubG9jayBwYXR0ZXJuIC0tPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiPgogICAgICAgICBZb3UgaGF2ZSBpbmNvcnJlY3RseSBkcmF3biB5b3VyIHVubG9jayBwYXR0ZXJuIDx4bGlmZjpnIGlkPSJudW1iZXIiPiVkPC94bGlmZjpnPiB0aW1lcy4KICAgICAgICAgXG5cblBsZWFzZSB0cnkgYWdhaW4gaW4gPHhsaWZmOmcgaWQ9Im51bWJlciI+JWQ8L3hsaWZmOmc+IHNlY29uZHMuCiAgICAgPC9zdHJpbmc+CiAKKyAgICA8IS0tIEZvciB0aGUgdW5sb2NrIHNjcmVlbiwgSW5mb3JtYXRpb24gbWVzc2FnZSBzaG93biBpbiBkaWFsb2cgd2hlbiB1c2VyIGhhcyB0b28gbWFueSBmYWlsZWQgYXR0ZW1wdHMgYXQKKyAgICAgICAgIGVudGVyaW5nIHRoZSBwYXNzd29yZCAtLT4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX3Bhc3N3b3JkX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIj4KKyAgICAgICAgWW91IGhhdmUgaW5jb3JyZWN0bHkgZW50ZXJlZCB5b3VyIHBhc3N3b3JkIDx4bGlmZjpnIGlkPSJudW1iZXIiPiVkPC94bGlmZjpnPiB0aW1lcy4KKyAgICAgICAgXG5cblBsZWFzZSB0cnkgYWdhaW4gaW4gPHhsaWZmOmcgaWQ9Im51bWJlciI+JWQ8L3hsaWZmOmc+IHNlY29uZHMuCisgICAgPC9zdHJpbmc+CisKKyAgICA8IS0tIEZvciB0aGUgdW5sb2NrIHNjcmVlbiwgSW5mb3JtYXRpb24gbWVzc2FnZSBzaG93biBpbiBkaWFsb2cgd2hlbiB1c2VyIGhhcyB0b28gbWFueSBmYWlsZWQgYXR0ZW1wdHMgYXQKKyAgICAgICAgIGVudGVyaW5nIHRoZSBQSU4gLS0+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9waW5fYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiPgorICAgICAgICBZb3UgaGF2ZSBpbmNvcnJlY3RseSBlbnRlcmVkIHlvdXIgUElOIDx4bGlmZjpnIGlkPSJudW1iZXIiPiVkPC94bGlmZjpnPiB0aW1lcy4KKyAgICAgICAgXG5cblBsZWFzZSB0cnkgYWdhaW4gaW4gPHhsaWZmOmcgaWQ9Im51bWJlciI+JWQ8L3hsaWZmOmc+IHNlY29uZHMuCisgICAgPC9zdHJpbmc+CisKICAgICA8IS0tIEZvciB0aGUgdW5sb2NrIHNjcmVlbiwgSW5mb3JtYXRpb24gbWVzc2FnZSBzaG93biBpbiBkaWFsb2cgd2hlbiB1c2VyIGlzIGFsbW9zdCBhdCB0aGUgbGltaXQKICAgICAgICAgIHdoZXJlIHRoZXkgd2lsbCBiZSBsb2NrZWQgb3V0IGFuZCBtYXkgaGF2ZSB0byBlbnRlciBhbiBhbHRlcm5hdGUgdXNlcm5hbWUvcGFzc3dvcmQgdG8gdW5sb2NrIHRoZSBwaG9uZSAtLT4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fZmFpbGVkX2F0dGVtcHRzX2FsbW9zdF9nbG9naW4iPgpAQCAtMTU5MCw3ICsxNjA1LDcgQEAKIAogICAgIDwhLS0gRG8gbm90IHRyYW5zbGF0ZS4gIFdlYlZpZXcgVXNlciBBZ2VudCBzdHJpbmcgLS0+CiAgICAgPHN0cmluZyBuYW1lPSJ3ZWJfdXNlcl9hZ2VudCIgdHJhbnNsYXRhYmxlPSJmYWxzZSI+PHhsaWZmOmcgaWQ9IngiPk1vemlsbGEvNS4wIChMaW51eDsgVTsgQW5kcm9pZCAlcykKLSAgICAgICAgQXBwbGVXZWJLaXQvNTMzLjEgKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzQuMCBNb2JpbGUgU2FmYXJpLzUzMy4xPC94bGlmZjpnPjwvc3RyaW5nPgorICAgICAgICBBcHBsZVdlYktpdC81MzQuMSAoS0hUTUwsIGxpa2UgR2Vja28pIFZlcnNpb24vNC4wIE1vYmlsZSBTYWZhcmkvNTM0LjE8L3hsaWZmOmc+PC9zdHJpbmc+CiAKICAgICA8IS0tIFRpdGxlIGZvciBhIEphdmFTY3JpcHQgZGlhbG9nLiAiVGhlIHBhZ2UgYXQgPHVybCBvZiBjdXJyZW50IHBhZ2U+IHNheXM6IiAtLT4KICAgICA8c3RyaW5nIG5hbWU9ImpzX2RpYWxvZ190aXRsZSI+VGhlIHBhZ2UgYXQgXCc8eGxpZmY6ZyBpZD0idGl0bGUiPiVzPC94bGlmZjpnPlwnIHNheXM6PC9zdHJpbmc+CkBAIC0yMjQyLDE3ICsyMjU3LDEzIEBACiAgICAgPCEtLSBMb2NhbGl6ZWQgc3RyaW5ncyBmb3IgV2ViVmlldyAtLT4KICAgICA8IS0tIExhYmVsIGZvciBidXR0b24gaW4gYSBXZWJWaWV3IHRoYXQgd2lsbCBvcGVuIGEgY2hvb3NlciB0byBjaG9vc2UgYSBmaWxlIHRvIHVwbG9hZCAtLT4KICAgICA8c3RyaW5nIG5hbWU9InVwbG9hZF9maWxlIj5DaG9vc2UgZmlsZTwvc3RyaW5nPgorICAgIDwhLS0gTGFiZWwgZm9yIHRoZSBmaWxlIHVwbG9hZCBjb250cm9sIHdoZW4gbm8gZmlsZSBoYXMgYmVlbiBjaG9zZW4geWV0IC0tPgorICAgIDxzdHJpbmcgbmFtZT0ibm9fZmlsZV9jaG9zZW4iPk5vIGZpbGUgY2hvc2VuPC9zdHJpbmc+CiAgICAgPCEtLSBMYWJlbCBmb3IgPGlucHV0IHR5cGU9InJlc2V0Ij4gYnV0dG9uIGluIGh0bWwgLS0+CiAgICAgPHN0cmluZyBuYW1lPSJyZXNldCI+UmVzZXQ8L3N0cmluZz4KICAgICA8IS0tIExhYmVsIGZvciA8aW5wdXQgdHlwZT0ic3VibWl0Ij4gYnV0dG9uIGluIGh0bWwgLS0+CiAgICAgPHN0cmluZyBuYW1lPSJzdWJtaXQiPlN1Ym1pdDwvc3RyaW5nPgogCi0gICAgPCEtLSBTdHJpbmcgZGVzY3JpYmluZyB0aGUgU3Rhci9GYXZvcml0ZSBjaGVja2JveAotCi0gICAgICAgICBVc2VkIGJ5IEFjY2Vzc2liaWxpdHlTZXJ2aWNlIHRvIGFubm91bmNlIHRoZSBwdXJwb3NlIG9mIHRoZSB2aWV3LgotICAgIC0tPgotICAgIDxzdHJpbmcgbmFtZT0iZGVzY3JpcHRpb25fc3RhciI+ZmF2b3JpdGU8L3N0cmluZz4KLQogICAgIDwhLS0gU3RyaW5ncyBmb3IgY2FyIG1vZGUgbm90aWZpY2F0aW9uIC0tPgogICAgIDwhLS0gU2hvd24gd2hlbiBjYXIgbW9kZSBpcyBlbmFibGVkIC0tPgogICAgIDxzdHJpbmcgbmFtZT0iY2FyX21vZGVfZGlzYWJsZV9ub3RpZmljYXRpb25fdGl0bGUiPkNhciBtb2RlIGVuYWJsZWQ8L3N0cmluZz4KQEAgLTIyNjMsNiArMjI3NCwxMCBAQAogICAgIDxzdHJpbmcgbmFtZT0idGV0aGVyZWRfbm90aWZpY2F0aW9uX3RpdGxlIj5UZXRoZXJpbmcgb3IgaG90c3BvdCBhY3RpdmU8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRldGhlcmVkX25vdGlmaWNhdGlvbl9tZXNzYWdlIj5Ub3VjaCB0byBjb25maWd1cmU8L3N0cmluZz4KIAorICAgIDwhLS0gIFN0cmluZ3MgZm9yIHBvc3NpYmxlIFByZWZlcmVuY2VBY3Rpdml0eSBCYWNrL05leHQgYnV0dG9ucyAtLT4KKyAgICA8c3RyaW5nIG5hbWU9ImJhY2tfYnV0dG9uX2xhYmVsIj5CYWNrPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJuZXh0X2J1dHRvbl9sYWJlbCI+TmV4dDwvc3RyaW5nPgorCiAgICAgPCEtLSBTdHJpbmdzIGZvciB0aHJvdHRsaW5nIG5vdGlmaWNhdGlvbiAtLT4KICAgICA8IS0tIFNob3duIHdoZW4gdGhlIHVzZXIgaXMgaW4gZGFuZ2VyIG9mIGJlaW5nIHRocm90dGxlZCAtLT4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlX3dhcm5pbmdfbm90aWZpY2F0aW9uX3RpdGxlIj5IaWdoIG1vYmlsZSBkYXRhIHVzZTwvc3RyaW5nPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy9zdHlsZXMueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy9zdHlsZXMueG1sCmluZGV4IGFmMDQxMTcuLjVlZDI2ZDMgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMvc3R5bGVzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzL3N0eWxlcy54bWwKQEAgLTQ1MSw2ICs0NTEsMTggQEAKICAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LlNwaW5uZXIiPgogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmJhY2tncm91bmQiPkBhbmRyb2lkOmRyYXdhYmxlL2J0bl9kcm9wZG93bjwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpjbGlja2FibGUiPnRydWU8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6c3Bpbm5lck1vZGUiPmRpYWxvZzwvaXRlbT4KKworICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmRyb3BEb3duU2VsZWN0b3IiPkBhbmRyb2lkOmRyYXdhYmxlL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpwb3B1cEJhY2tncm91bmQiPkBhbmRyb2lkOmRyYXdhYmxlL3NwaW5uZXJfZHJvcGRvd25fYmFja2dyb3VuZDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpkcm9wRG93blZlcnRpY2FsT2Zmc2V0Ij4tMTBkaXA8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6ZHJvcERvd25Ib3Jpem9udGFsT2Zmc2V0Ij4wZGlwPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmRyb3BEb3duV2lkdGgiPndyYXBfY29udGVudDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpwb3B1cFByb21wdFZpZXciPkBhbmRyb2lkOmxheW91dC9zaW1wbGVfZHJvcGRvd25faGludDwvaXRlbT4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IldpZGdldC5TcGlubmVyLkRyb3BEb3duIj4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpzcGlubmVyTW9kZSI+ZHJvcGRvd248L2l0ZW0+CiAgICAgPC9zdHlsZT4KIAogICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuVGV4dFZpZXcuUG9wdXBNZW51Ij4KQEAgLTU2Nyw2ICs1NzksNyBAQAogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmJhY2tncm91bmQiPkBhbmRyb2lkOmRyYXdhYmxlL3F1aWNrY29udGFjdF9iYWRnZTwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpjbGlja2FibGUiPnRydWU8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6c2NhbGVUeXBlIj5maXRDZW50ZXI8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6c3JjIj5AYW5kcm9pZDpkcmF3YWJsZS9pY19jb250YWN0X3BpY3R1cmU8L2l0ZW0+CiAgICAgPC9zdHlsZT4KICAgICAKICAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LlF1aWNrQ29udGFjdEJhZGdlU21hbGwiPgpAQCAtODU0LDQgKzg2NywxMyBAQAogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnBhZGRpbmdCb3R0b20iPjFkaXA8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6YmFja2dyb3VuZCI+QGFuZHJvaWQ6ZHJhd2FibGUvYm90dG9tX2JhcjwvaXRlbT4KICAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IkFjdGlvbkJhciI+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6YmFja2dyb3VuZCI+QGFuZHJvaWQ6ZHJhd2FibGUvYWN0aW9uX2Jhcl9iYWNrZ3JvdW5kPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmRpc3BsYXlPcHRpb25zIj51c2VMb2dvPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmRpdmlkZXIiPkBhbmRyb2lkOmRyYXdhYmxlL2FjdGlvbl9iYXJfZGl2aWRlcjwvaXRlbT4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IldpZGdldC5BY3Rpb25CdXR0b24iPgorICAgIDwvc3R5bGU+CiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMvdGhlbWVzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMvdGhlbWVzLnhtbAppbmRleCBkNTg1ZDllLi43NmJiYTRiIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzL3RoZW1lcy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy90aGVtZXMueG1sCkBAIC0xMTUsNiArMTE1LDggQEAKICAgICAgICAgPGl0ZW0gbmFtZT0id2luZG93VGl0bGVCYWNrZ3JvdW5kU3R5bGUiPkBhbmRyb2lkOnN0eWxlL1dpbmRvd1RpdGxlQmFja2dyb3VuZDwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp3aW5kb3dBbmltYXRpb25TdHlsZSI+QGFuZHJvaWQ6c3R5bGUvQW5pbWF0aW9uLkFjdGl2aXR5PC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOndpbmRvd1NvZnRJbnB1dE1vZGUiPnN0YXRlVW5zcGVjaWZpZWR8YWRqdXN0VW5zcGVjaWZpZWQ8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9IndpbmRvd0FjdGlvbkJhciI+ZmFsc2U8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9IndpbmRvd0FjdGlvbkJhclN0eWxlIj5AYW5kcm9pZDpzdHlsZS9BY3Rpb25CYXI8L2l0ZW0+CiAKICAgICAgICAgPCEtLSBEaWFsb2cgYXR0cmlidXRlcyAtLT4KICAgICAgICAgPGl0ZW0gbmFtZT0iYWxlcnREaWFsb2dTdHlsZSI+QGFuZHJvaWQ6c3R5bGUvQWxlcnREaWFsb2c8L2l0ZW0+CkBAIC0xNjcsNiArMTY5LDkgQEAKICAgICAgICAgPGl0ZW0gbmFtZT0ic2Nyb2xsVmlld1N0eWxlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuU2Nyb2xsVmlldzwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0iaG9yaXpvbnRhbFNjcm9sbFZpZXdTdHlsZSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0Lkhvcml6b250YWxTY3JvbGxWaWV3PC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJzcGlubmVyU3R5bGUiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5TcGlubmVyPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJkcm9wRG93blNwaW5uZXJTdHlsZSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LlNwaW5uZXIuRHJvcERvd248L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFjdGlvbkRyb3BEb3duU3R5bGUiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5TcGlubmVyLkRyb3BEb3duPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhY3Rpb25CdXR0b25TdHlsZSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LkFjdGlvbkJ1dHRvbjwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0ic3RhclN0eWxlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuQ29tcG91bmRCdXR0b24uU3RhcjwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0idGFiV2lkZ2V0U3R5bGUiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5UYWJXaWRnZXQ8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9InRleHRWaWV3U3R5bGUiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5UZXh0VmlldzwvaXRlbT4KQEAgLTE5OCw2ICsyMDMsOSBAQAogCiAgICAgICAgIDwhLS0gU2VhcmNoIHdpZGdldCBzdHlsZXMgLS0+CiAgICAgICAgIDxpdGVtIG5hbWU9InNlYXJjaFdpZGdldENvcnB1c0l0ZW1CYWNrZ3JvdW5kIj5AYW5kcm9pZDpjb2xvci9zZWFyY2hfd2lkZ2V0X2NvcnB1c19pdGVtX2JhY2tncm91bmQ8L2l0ZW0+CisKKyAgICAgICAgPCEtLSBBY3Rpb24gYmFyIHN0eWxlcyAtLT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYWN0aW9uQnV0dG9uUGFkZGluZyI+MTJkaXA8L2l0ZW0+CiAgICAgPC9zdHlsZT4KICAgICAKICAgICA8IS0tIFZhcmlhbnQgb2YgdGhlIGRlZmF1bHQgKGRhcmspIHRoZW1lIHdpdGggbm8gdGl0bGUgYmFyIC0tPgpAQCAtNTIxLDUgKzUyOSw5IEBACiAgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6d2luZG93QW5pbWF0aW9uU3R5bGUiPkBhbmRyb2lkOnN0eWxlL0FuaW1hdGlvbi5SZWNlbnRBcHBsaWNhdGlvbnM8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dENvbG9yIj5AYW5kcm9pZDpjb2xvci9zZWNvbmRhcnlfdGV4dF9ub2ZvY3VzPC9pdGVtPgogICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iVGhlbWUuV2l0aEFjdGlvbkJhciI+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6d2luZG93QWN0aW9uQmFyIj50cnVlPC9pdGVtPgorICAgIDwvc3R5bGU+CiAgICAgCiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy94bWwvcG93ZXJfcHJvZmlsZS54bWwgYi9jb3JlL3Jlcy9yZXMveG1sL3Bvd2VyX3Byb2ZpbGUueG1sCmluZGV4IGNlNjIzZTguLjMwMzEyYjMgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy94bWwvcG93ZXJfcHJvZmlsZS54bWwKKysrIGIvY29yZS9yZXMvcmVzL3htbC9wb3dlcl9wcm9maWxlLnhtbApAQCAtMTgsNiArMTgsNyBAQAogLS0+CiAKIDxkZXZpY2UgbmFtZT0iQW5kcm9pZCI+CisgIDwhLS0gQWxsIHZhbHVlcyBhcmUgaW4gbUFoIGV4Y2VwdCBhcyBub3RlZCAtLT4KICAgPGl0ZW0gbmFtZT0ibm9uZSI+MDwvaXRlbT4KICAgPGl0ZW0gbmFtZT0ic2NyZWVuLm9uIj4wLjE8L2l0ZW0+CiAgIDxpdGVtIG5hbWU9ImJsdWV0b290aC5hY3RpdmUiPjAuMTwvaXRlbT4KQEAgLTQ4LDQgKzQ5LDYgQEAKICAgPGFycmF5IG5hbWU9ImNwdS5hY3RpdmUiPgogICAgICAgPHZhbHVlPjAuMjwvdmFsdWU+CiAgIDwvYXJyYXk+CisgIDwhLS0gVGhpcyBpcyB0aGUgYmF0dGVyeSBjYXBhY2l0eSBpbiBtQWggLS0+CisgIDxpdGVtIG5hbWU9ImJhdHRlcnkuY2FwYWNpdHkiPjEwMDA8L2l0ZW0+CiA8L2RldmljZT4KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjIxX2JhY2tzbGFzaC52Y2YgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YyMV9iYWNrc2xhc2gudmNmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDMwMDJiLi4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjIxX2JhY2tzbGFzaC52Y2YKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLUJFR0lOOlZDQVJEDQotVkVSU0lPTjoyLjENCi1OOjtBXDtCXFw7Q1xcXDs7RDtcOkU7XFxcXDsNCi1GTjpBO0JcQ1w7RDpFXFwNCi1FTkQ6VkNBUkQNCmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YyMV9jb21wbGljYXRlZC52Y2YgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YyMV9jb21wbGljYXRlZC52Y2YKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlMzRlMTYuLjAwMDAwMDAKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MjFfY29tcGxpY2F0ZWQudmNmCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLUJFR0lOOlZDQVJEDQotVkVSU0lPTjoyLjENCi1OOkd1bXA7Rm9ycmVzdDtIb2dlO1BvcztUYW8NCi1GTjpKb2UgRHVlDQotT1JHOkd1bXAgU2hyaW1wIENvLjtTYWxlcyBEZXB0Llw7TWFuYWdlcjtGaXNoIGtlZXBlcg0KLVJPTEU6RmlzaCBDYWtlIEtlZXBlciENCi1YLUNMQVNTOlBVQkxJQw0KLVRJVExFOlNocmltcCBNYW4NCi1URUw7V09SSztWT0lDRTooMTExKSA1NTUtMTIxMg0KLVRFTDtIT01FO1ZPSUNFOig0MDQpIDU1NS0xMjEyDQotVEVMO0NFTEw6MDMxMTExMTExMQ0KLVRFTDtWSURFTzowMzIyMjIyMjIyDQotVEVMO1ZPSUNFOjAzMzMzMzMzMzMNCi1BRFI7V09SSzo7OzEwMCBXYXRlcnMgRWRnZTtCYXl0b3duO0xBOzMwMzE0O1VuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYQ0KLUxBQkVMO1dPUks7RU5DT0RJTkc9UVVPVEVELVBSSU5UQUJMRToxMDAgV2F0ZXJzIEVkZ2U9MEQ9MEFCYXl0b3duLCBMQSAzMDMxND0wRD0wQVVuaXRlZCAgU3RhdGVzIG9mIEFtZXJpY2ENCi1BRFI7SE9NRTo7OzQyIFBsYW50YXRpb24gU3QuO0JheXRvd247TEE7MzAzMTQ7VW5pdGVkIFN0YXRlcyBvZiBBbWVyaWNhDQotTEFCRUw7SE9NRTtFTkNPRElORz1RVU9URUQtUFJJTlRBQkxFOjQyIFBsYW50YXRpb24gU3QuPTBEPTBBPQ0KLUJheXRvd24sIExBIDMwMzE0PTBEPTBBPQ0KLVVuaXRlZCAgU3RhdGVzIG9mIEFtZXJpY2ENCi1FTUFJTDtQUkVGO0lOVEVSTkVUOmZvcnJlc3RndW1wQHdhbGxhZGFsbGEuY29tDQotRU1BSUw7Q0VMTDpjZWxsQGV4YW1wbGUuY29tDQotTk9URTpUaGUgZm9sbG93aW5nIG5vdGUgaXMgdGhlIGV4YW1wbGUgZnJvbSBSRkMgMjA0NS4NCi1OT1RFO0VOQ09ESU5HPVFVT1RFRC1QUklOVEFCTEU6Tm93J3MgdGhlIHRpbWUgPQ0KLWZvciBhbGwgZm9sayB0byBjb21lPQ0KLSB0byB0aGUgYWlkIG9mIHRoZWlyIGNvdW50cnkuDQotDQotUEhPVE87RU5DT0RJTkc9QkFTRTY0O1RZUEU9SlBFRzoNCi0gLzlqLzRRb1BSWGhwWmdBQVRVMEFLZ0FBQUFnQURRRU9BQUlBQUFBUEFBQUFxZ0VQQUFJQUFBQUhBQUFBdWdFUUFBSUFBQUFHDQotIEFBQUF3Z0VTQUFNQUFBQUJBQUVBQUFFYUFBVUFBQUFCQUFBQXlBRWJBQVVBQUFBQkFBQUEwQUVvQUFNQUFBQUJBQUlBQUFFeA0KLSBBQUlBQUFBT0FBQUEyQUV5QUFJQUFBQVVBQUFBNWdJVEFBTUFBQUFCQUFFQUFJS1lBQUlBQUFBT0FBQUErb2RwQUFRQUFBQUINCi0gQUFBQmhNU2xBQWNBQUFCOEFBQUJDQUFBQkI0eU1EQTRNVEF5T1RFek5UVXpNUUFBUkc5RGIwMXZBQUJFT1RBMWFRQUFBQUJJDQotIEFBQUFBUUFBQUVnQUFBQUJSRGt3TldrZ1ZtVnlNUzR3TUFBeU1EQTRPakV3T2pJNUlERXpPalUxT2pRM0FDQWdJQ0FnSUNBZw0KLSBJQ0FnSUNBQVVISnBiblJKVFFBd016QXdBQUFBQmdBQkFCUUFGQUFDQVFBQUFBQURBQUFBTkFFQUJRQUFBQUVCQVFBQUFBRVENCi0gZ0FBQUFBQUFFUWtBQUNjUUFBQVBDd0FBSnhBQUFBV1hBQUFuRUFBQUNMQUFBQ2NRQUFBY0FRQUFKeEFBQUFKZUFBQW5FQUFBDQotIEFJc0FBQ2NRQUFBRHl3QUFKeEFBQUJ2bEFBQW5FQUFvZ3BvQUJRQUFBQUVBQUFOcWdwMEFCUUFBQUFFQUFBTnlpQ0lBQXdBQQ0KLSBBQUVBQWdBQWtBQUFCd0FBQUFRd01qSXdrQU1BQWdBQUFCUUFBQU42a0FRQUFnQUFBQlFBQUFPT2tRRUFCd0FBQUFRQkFnTUENCi0ga1FJQUJRQUFBQUVBQUFPaWtnRUFDZ0FBQUFFQUFBT3FrZ0lBQlFBQUFBRUFBQU95a2dRQUNnQUFBQUVBQUFPNmtnVUFCUUFBDQotIEFBRUFBQVBDa2djQUF3QUFBQUVBQWdBQWtnZ0FBd0FBQUFFQUFBQUFrZ2tBQXdBQUFBRUFBQUFBa2dvQUJRQUFBQUVBQUFQSw0KLSBrbndBQndBQUFBRUFBQUFBa29ZQUJ3QUFBQllBQUFQU29BQUFCd0FBQUFRd01UQXdvQUVBQXdBQUFBRUFBUUFBb0FJQUF3QUENCi0gQUFFQVlBQUFvQU1BQXdBQUFBRUFTQUFBb0FVQUJBQUFBQUVBQUFRQW9nNEFCUUFBQUFFQUFBUG9vZzhBQlFBQUFBRUFBQVB3DQotIG9oQUFBd0FBQUFFQUFnQUFvaGNBQXdBQUFBRUFBZ0FBb3dBQUJ3QUFBQUVEQUFBQW93RUFCd0FBQUFFQkFBQUFwQUVBQXdBQQ0KLSBBQUVBQUFBQXBBSUFBd0FBQUFFQUFBQUFwQU1BQXdBQUFBRUFBQUFBcEFRQUJRQUFBQUVBQUFQNHBBVUFBd0FBQUFFQUhRQUENCi0gcEFZQUF3QUFBQUVBQUFBQXBBY0FBd0FBQUFFQUFBQUFwQWdBQXdBQUFBRUFBQUFBcEFrQUF3QUFBQUVBQUFBQXBBb0FBd0FBDQotIEFBRUFBQUFBcEF3QUF3QUFBQUVBQWdBQUFBQUFBQUFBQUZNQUFDY1FBQUFCWGdBQUFHUXlNREE0T2pFd09qSTVJREV6T2pVMQ0KLSBPak14QURJd01EZzZNVEE2TWprZ01UTTZOVFU2TkRjQUFBQXBpQUFBR3dBQUFBS3lBQUFBWkFBQUFWNEFBQUJrQUFBQUFBQUENCi0gQUdRQUFBQWxBQUFBQ2dBQURwSUFBQVBvQUFBQUFBQUFBQUF5TURBNE1UQXlPVEV6TlRVek1RQUFJQ29BQUFBS0FBQXE0Z0FBDQotIEFBb0FBQUFBQUFBQUFRQUNBQUVBQWdBQUFBUlNPVGdBQUFJQUJ3QUFBQVF3TVRBd0FBQUFBQUFHQVFNQUF3QUFBQUVBQmdBQQ0KLSBBUm9BQlFBQUFBRUFBQVJzQVJzQUJRQUFBQUVBQUFSMEFTZ0FBd0FBQUFFQUFnQUFBZ0VBQkFBQUFBRUFBQVI4QWdJQUJBQUENCi0gQUFFQUFBV0xBQUFBQUFBQUFFZ0FBQUFCQUFBQVNBQUFBQUgvMlAvYkFJUUFJQllZSEJnVUlCd2FIQ1FpSUNZd1VEUXdMQ3d3DQotIFlrWktPbEIwWm5wNGNtWndib0NRdUp5QWlLNktibkNnMnFLdXZzVE8wTTU4bXVMeTRNand1TXJPeGdFaUpDUXdLakJlTkRSZQ0KLSB4b1J3aE1iR3hzYkd4c2JHeHNiR3hzYkd4c2JHeHNiR3hzYkd4c2JHeHNiR3hzYkd4c2JHeHNiR3hzYkd4c2JHeHNiR3hzYkcNCi0gLzhBQUVRZ0FlQUNnQXdFaEFBSVJBUU1SQWYvRUFhSUFBQUVGQVFFQkFRRUJBQUFBQUFBQUFBQUJBZ01FQlFZSENBa0tDeEFBDQotIEFnRURBd0lFQXdVRkJBUUFBQUY5QVFJREFBUVJCUkloTVVFR0UxRmhCeUp4RkRLQmthRUlJMEt4d1JWUzBmQWtNMkp5Z2drSw0KLSBGaGNZR1JvbEppY29LU28wTlRZM09EazZRMFJGUmtkSVNVcFRWRlZXVjFoWldtTmtaV1puYUdscWMzUjFkbmQ0ZVhxRGhJV0cNCi0gaDRpSmlwS1RsSldXbDVpWm1xS2pwS1dtcDZpcHFyS3p0TFcydDdpNXVzTER4TVhHeDhqSnl0TFQxTlhXMTlqWjJ1SGk0K1RsDQotIDV1Zm82ZXJ4OHZQMDlmYjMrUG42QVFBREFRRUJBUUVCQVFFQkFBQUFBQUFBQVFJREJBVUdCd2dKQ2dzUkFBSUJBZ1FFQXdRSA0KLSBCUVFFQUFFQ2R3QUJBZ01SQkFVaE1RWVNRVkVIWVhFVElqS0JDQlJDa2FHeHdRa2pNMUx3RldKeTBRb1dKRFRoSmZFWEdCa2ENCi0gSmljb0tTbzFOamM0T1RwRFJFVkdSMGhKU2xOVVZWWlhXRmxhWTJSbFptZG9hV3B6ZEhWMmQzaDVlb0tEaElXR2g0aUppcEtUDQotIGxKV1dsNWlabXFLanBLV21wNmlwcXJLenRMVzJ0N2k1dXNMRHhNWEd4OGpKeXRMVDFOWFcxOWpaMnVMajVPWG01K2pwNnZMeg0KLSA5UFgyOS9qNSt2L2FBQXdEQVFBQ0VRTVJBRDhBRkZTcUtrWklvcVJWcGdTS0tlQlRFT0Fwd0ZBRHNVWXBnSVJTRVVBTklwcEYNCi0gSUNOaFVUQ2dDTWlvMkZJQ0poVUxDZ0Mwb3FWYUFKRkZTcUtCa2dGT0FwaUhDbkNnQjJLTVVDRU5KUUEwaW1FVURHTUtpWVVBDQotIFJ0VWJVZ0lXcUpoUUJaU3BGb0FsV3BWb0dQRlBGTVE3dFNLMk9EUUE0eUtPOUhtS2U5RnhBekRIRklPbEFBYVlhQUdOVVRVRA0KLSBJbXFOcVFFVFZFMUFFNlZLS0FKRk5TcWFBSGcwOEdtQU5JRkZRTTVZNXFKTUJ1VDYwWk5RSWNya1ZZU1FNS3VMR0thYWFzUXgNCi0gcWlhZ1pFMVJ0U0FqYW9tb0FrUTFLcG9BbFUxSXBvQWtVMDdPQlRBck8rNXFrVjEyWTcxbGZVQm1hS2tDUlN1em5yVEZiYTJhDQotIG9Dd0d5TTBFMXFJalkxR3hvR1JOVVpOSUNOcWlhZ0J5R3BsTkFFaW1wRk5NQjRZRHZTdWNweFNZRUlVMDRLYXpzQXUxcUFyVQ0KLSBXRUx0UHBUU3Bvc0JORVR0NXB4TmFvQ05qVWJHZ0NOalVab0dSdFVUVWdGVTFLcG9Ba0JxUUhpZ0NGbk83clVxT2RsWnA2Z0ENCi0gYyt0T0RuMXBYQVh6RDYwZVlmV25jUXZtTlNHUTA3Z09NaENWRUpHejFwdGdTNXlLWXhxd0dFMUd4b0FpYW1Ha01hcHFWVFFCDQotIEtwcCtlS0FJQ2ZtcVdNL0thejZnQU5PQnFRRnpSbW1BdWFUTkFDc2ZrcU1IbW05d0pzOFUwbXRSREdOUnNhQUkycGhwREkxTg0KLSBTcWFBSkZOU0E4VUNJU2ZtcVNNL0thejZqQUhtbkExSUNnMHVhQUZ6U1pwZ0t4K1NtRHJUZTRFMmVLYVRXb2lNbW1NYUFJelQNCi0gRFNHUktha1UwQVNLYWVEVEVSc2Vha2pQeW1zK294QWFjRFVnT0JwYzBnRnpTWnBnT1kvS0tZdjNxcnFJbHBwclFCakdveWFBDQotIEdHbW1rTWdVMUlwcGdQQnFRR2dRdTBHbjR3dkZLd0VRcHdOWkRIWnBjMEFMbWlnUktCbGVhUUtCV3RnQTAwMVFER3FNMGdHbQ0KLSBtR2tNcnFha0JvQWVwcDROTVJJRFR3YUFFMkEwMDhHb2tnSHhqZDFwektGcFcwdUFnNU5TQkJUaXJnT3BEV2dEVFRUUUF3MHcNCi0gMGdHR21tZ1pXQnA0cEFTS2FlRFRFT0JwNE5BRHdhamJyVXlCRWtYV25TVWRBR3IxcWVpQU1Ta05XQWhwaG9BYWFZYVFERFRUDQotIFNHVlJUd2FZRHhUd2FCRHdhZURRQTRHbEs1b2F1SWVvMjBwR2FMYUFLcWdVNmhLd0JTR21BaHBob0FhYVlhUXhocHBwREtnTg0KLSBQRk1CNHA0b0VQRk9CcGdQQnA0TkFod3B3b0FXbG9BS1NnQkRUVFFNWWFZYVFEVFRUU0dBLzluLzJ3Q0VBQW9IQndnSEJnb0kNCi0gQ0FnTENnb0xEaGdRRGcwTkRoMFZGaEVZSXg4bEpDSWZJaUVtS3pjdkppazBLU0VpTUVFeE5EazdQajQrSlM1RVNVTThTRGM5DQotIFBqc0JDZ3NMRGcwT0hCQVFIRHNvSWlnN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzNw0KLSBPenM3T3pzN096czdPenM3Ty8vQUFCRUlBRWdBWUFNQklRQUNFUUVERVFIL3hBR2lBQUFCQlFFQkFRRUJBUUFBQUFBQUFBQUENCi0gQVFJREJBVUdCd2dKQ2dzUUFBSUJBd01DQkFNRkJRUUVBQUFCZlFFQ0F3QUVFUVVTSVRGQkJoTlJZUWNpY1JReWdaR2hDQ05DDQotIHNjRVZVdEh3SkROaWNvSUpDaFlYR0JrYUpTWW5LQ2txTkRVMk56ZzVPa05FUlVaSFNFbEtVMVJWVmxkWVdWcGpaR1ZtWjJocA0KLSBhbk4wZFhaM2VIbDZnNFNGaG9lSWlZcVNrNVNWbHBlWW1acWlvNlNscHFlb3FhcXlzN1MxdHJlNHVickN3OFRGeHNmSXljclMNCi0gMDlUVjF0ZlkyZHJoNHVQazVlYm42T25xOGZMejlQWDI5L2o1K2dFQUF3RUJBUUVCQVFFQkFRQUFBQUFBQUFFQ0F3UUZCZ2NJDQotIENRb0xFUUFDQVFJRUJBTUVCd1VFQkFBQkFuY0FBUUlERVFRRklURUdFa0ZSQjJGeEV5SXlnUWdVUXBHaHNjRUpJek5TOEJWaQ0KLSBjdEVLRmlRMDRTWHhGeGdaR2lZbktDa3FOVFkzT0RrNlEwUkZSa2RJU1VwVFZGVldWMWhaV21Oa1pXWm5hR2xxYzNSMWRuZDQNCi0gZVhxQ2c0U0Zob2VJaVlxU2s1U1ZscGVZbVpxaW82U2xwcWVvcWFxeXM3UzF0cmU0dWJyQ3c4VEZ4c2ZJeWNyUzA5VFYxdGZZDQotIDJkcmk0K1RsNXVmbzZlcnk4L1QxOXZmNCtmci8yZ0FNQXdFQUFoRURFUUEvQUo3U0xnY1ZyMjBJNHJORkd2YlFBQUhGYUVVWA0KLSBTclFpNUhDTWRLazhvWTZWU0pZeDRoanBWYVdNZWxBRkM0aUdEeFdQZFI4bWt4bVJkeGpCckV2SSt0WmpOMjB4dEhOYk5xQWMNCi0gVUlEWGc2Q3IwV0t0Q1k4WEtRT3l6T0IzRktOV3N5Y2VaK2xTNnNZNk5ranZQU2R3SW1CSFVtbXk0cTA3Nm9Dak9PRFdQZGdjDQotIDBNcEdQZEFZTllsNG81ck5qTkt6a3lvclp0WHhpaEFhMXZJRGlwN205RnJiNy80andLY255eGJFek4zaWVKcHBac3laNFUxSA0KLSB1cnpaYXU0bVdWbE5yR2swVXVXUFZhMVlyb1hFSWtIZnJYWmg1VzkwUlduY0FIbXNpNmJKTmRRMFpOdzNCckd1aU1HczJNa3MNCi0gcHVCeld6YnpkT2FFQmVPcFIyb1V0a2s5aFRydTdpdW80bTh3Z2VtS3lxVGkwNHNCc2ZrRWY2OGo4S2xVUVp6OW8vU3VaUmozDQotIEpZcmlBamk0L1NwN1c2aHRiVjJhWGN1NzByYW1veGxlNGdON0hjSVhqYmlzKzRrNU5kYWFhdWhtVmN2MXJIdVc2MURHaUcxbQ0KLSA2YzFzMjAvVG1nQXY1dm1qNTdWS2szK2l4blBjMXhWVjcwaDlDVkp1T3RTckw3MWhGZ3h6U2NVa2tuK2lZLzJxMWk5eERyR1QNCi0gOXkzMXBKNU90ZDFMK0doTXk3bVRyV1hPMlNhcGpSbjI4dlRtdGEzbnhqbWdHT3ZKZDJ3MUtrditpcHovQUJHdU9vdmVZZENlDQotIE9ianJVNnk1cmxzQTh5Y1Vrc24raWovZU5hdzZpSkxOc1c1OXpUSm42ODE2RlA0RUptYk8rU2F6NW02MDJVaklnazRITmFkdg0KLSBMd0thQmwrTXBJTU9NaXBwNDkwU0NKZUY3Q29xUXZGMkp1UnFXUTRZRUdyU2lRSnVLbkhyWEJ5TXBraTczR0ZCTlhJb2g5bjINCi0gU3Jubk9LNk1QVGJkM3NTd0lWRjJxTUNxa3pIbXV5MWxZUm5USHJWR1dwWmFNS0IrQldsYnljWW9RTTBJWkR4elYrR1U4YzFhDQotIElZeTVZK2RuSGF0QXNmc0FIZkFybVMxbVBvaDFnVDh4OXF0azFyUVg3dENlNURJYXB6R3RHQlFtNzFTbHFHV2puSUg2Vm93dA0KLSB6bWhBeS9FM3ZWNkY2dEVNdXhsV0l5QWZyVnhDQ0FPMVZaRUV5WUE0QUFweE5Hd3lKK2xWSlJVc2FLTXc2MVNsRlF6UkFQL1oNCi0NCi1YLUFUVFJJQlVURTpTb21lIFN0cmluZw0KLUJEQVk6MTk4MDAxMDENCi1HRU86MzUuNjU2Mzg1NCwxMzkuNjk5NDIzMw0KLVVSTDpodHRwOi8vd3d3LmV4YW1wbGUuY29tLw0KLVJFVjoyMDA4MDQyNFQxOTUyNDNaDQotRU5EOlZDQVJEClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MjFfaW52YWxpZF9jb21tZW50X2xpbmUudmNmIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MjFfaW52YWxpZF9jb21tZW50X2xpbmUudmNmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTEwNzEwLi4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjIxX2ludmFsaWRfY29tbWVudF9saW5lLnZjZgorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLUJFR0lOOnZDYXJkDQotVkVSU0lPTjoyLjENCi1VSUQ6MzU3DQotTjo7Q29uZmVyZW5jZSBDYWxsDQotRk46Q29uZmVyZW5jZSBDYWxsDQotIyBUaGlzIGxpbmUgbXVzdCBiZSBpZ25vcmVkLg0KLU5PVEU7RU5DT0RJTkc9UVVPVEVELVBSSU5UQUJMRTpUaGlzIGlzIGFuIChzaGFycCAtPj0NCi0jPC0gc2hhcnApIGV4YW1wbGUuIFRoaXMgbWVzc2FnZSBtdXN0IE5PVCBiZSBpZ25vcmVkLg0KLSMgVGhpcyBsaW5lIG11c3QgYmUgaWdub3JlZCB0b28uDQotRU5EOnZDYXJkDQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MjFfamFwYW5lc2VfMS52Y2YgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YyMV9qYXBhbmVzZV8xLnZjZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDA1ZTJmZi4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YyMV9qYXBhbmVzZV8xLnZjZgorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotQkVHSU46VkNBUkQNCi1WRVJTSU9OOjIuMQ0KLU47Q0hBUlNFVD1TSElGVF9KSVM6iMCToYONg0ODaDs7OzsNCi1TT1VORDtYLUlSTUMtTjtDSEFSU0VUPVNISUZUX0pJUzqx3cTes9uyxN47Ozs7DQotVEVMO1BSRUY7Vk9JQ0U6MDMwMDAwMDAwMA0KLUVORDpWQ0FSRA0KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjIxX2phcGFuZXNlXzIudmNmIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MjFfamFwYW5lc2VfMi52Y2YKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhNTRhY2IuLjAwMDAwMDAKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MjFfamFwYW5lc2VfMi52Y2YKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi1CRUdJTjpWQ0FSRA0KLVZFUlNJT046Mi4xDQotRk47Q0hBUlNFVD1TSElGVF9KSVM6iMCToSCDjYNDg2ggMQ0KLU47Q0hBUlNFVD1TSElGVF9KSVM6iMCToTuDjYNDg2gxOzs7DQotU09VTkQ7WC1JUk1DLU47Q0hBUlNFVD1TSElGVF9KSVM6sd3E3rM727LE3jE7OzsNCi1BRFI7SE9NRTtDSEFSU0VUPVNISUZUX0pJUztFTkNPRElORz1RVU9URUQtUFJJTlRBQkxFOjs9OTM9OEM9OEI9OUU9OTM9NzM9DQotPThGPTYxPTkyPTRBPThCPUU2PThEPUY3PThCPTc1PTkyPUFDMjYtMT04Mz01QT04Mz04Qj04Mz04QT04Mz00MT04Mz05Mz0NCi09ODM9NUU9ODM9OEY9ODE9NUI2PThBPTRCOzs7OzE1MC04NTEyOw0KLU5PVEU7Q0hBUlNFVD1TSElGVF9KSVM7RU5DT0RJTkc9UVVPVEVELVBSSU5UQUJMRTo9ODM9ODE9ODM9ODINCi1FTkQ6VkNBUkQNCmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YyMV9tdWx0aXBsZV9lbnRyeS52Y2YgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YyMV9tdWx0aXBsZV9lbnRyeS52Y2YKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViYmIxOWEuLjAwMDAwMDAKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MjFfbXVsdGlwbGVfZW50cnkudmNmCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotQkVHSU46VkNBUkQNCi1WRVJTSU9OOjIuMQ0KLU47Q0hBUlNFVD1TSElGVF9KSVM6iMCToYONg0ODaDM7Ozs7DQotU09VTkQ7WC1JUk1DLU47Q0hBUlNFVD1TSElGVF9KSVM6sd3E3rPbssTeMzs7OzsNCi1URUw7WC1ORUMtU0VDUkVUOjkNCi1URUw7WC1ORUMtSE9URUw6MTANCi1URUw7WC1ORUMtU0NIT09MOjExDQotVEVMO0hPTUU7RkFYOjEyDQotRU5EOlZDQVJEDQotDQotDQotQkVHSU46VkNBUkQNCi1WRVJTSU9OOjIuMQ0KLU47Q0hBUlNFVD1TSElGVF9KSVM6iMCToYONg0ODaDQ7Ozs7DQotU09VTkQ7WC1JUk1DLU47Q0hBUlNFVD1TSElGVF9KSVM6sd3E3rPbssTeNDs7OzsNCi1URUw7TU9ERU06MTMNCi1URUw7UEFHRVI6MTQNCi1URUw7WC1ORUMtRkFNSUxZOjE1DQotVEVMO1gtTkVDLUdJUkw6MTYNCi1FTkQ6VkNBUkQNCi0NCi0NCi1CRUdJTjpWQ0FSRA0KLVZFUlNJT046Mi4xDQotTjtDSEFSU0VUPVNISUZUX0pJUzqIwJOhg42DQ4NoNTs7OzsNCi1TT1VORDtYLUlSTUMtTjtDSEFSU0VUPVNISUZUX0pJUzqx3cTes9uyxN41Ozs7Ow0KLVRFTDtYLU5FQy1CT1k6MTcNCi1URUw7WC1ORUMtRlJJRU5EOjE4DQotVEVMO1gtTkVDLVBIUzoxOQ0KLVRFTDtYLU5FQy1SRVNUQVVSQU5UOjIwDQotRU5EOlZDQVJEDQotDQotDQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MjFfb3JnX2JlZm9yZV90aXRsZS52Y2YgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YyMV9vcmdfYmVmb3JlX3RpdGxlLnZjZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGZmMTE5MC4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YyMV9vcmdfYmVmb3JlX3RpdGxlLnZjZgorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotQkVHSU46VkNBUkQNCi1WRVJTSU9OOjIuMQ0KLUZOOk5vcm1hbCBHdXkNCi1PUkc6Q29tcGFueTtPcmdhbml6YXRpb247RGV2aXNpb247Um9vbTtTaGVldCBOby4NCi1USVRMRTpFeGNlbGxlbnQgSmFuaXRvcg0KLUVORDpWQ0FSRA0KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjIxX3ByZWZfaGFuZGxpbmcudmNmIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MjFfcHJlZl9oYW5kbGluZy52Y2YKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxMDUzMTAuLjAwMDAwMDAKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MjFfcHJlZl9oYW5kbGluZy52Y2YKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi1CRUdJTjpWQ0FSRAotVkVSU0lPTjoyLjEKLUZOOlNtaXRoCi1URUw7SE9NRToxCi1URUw7V09SSztQUkVGOjIKLVRFTDtJU0ROOjMKLUVNQUlMO1BSRUY7SE9NRTp0ZXN0QGV4YW1wbGUuY29tCi1FTUFJTDtDRUxMO1BSRUY6dGVzdDJAZXhhbWluYXRpb24uY29tCi1PUkc6Q29tcGFueQotVElUTEU6RW5naW5lZXIKLU9SRzpNeXN0ZXJ5Ci1USVRMRTpCbG9nZ2VyCi1PUkc6UG9ldHJ5Ci1USVRMRTpQb2V0Ci1FTkQ6VkNBUkQKZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjIxX3NpbXBsZV8xLnZjZiBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjIxX3NpbXBsZV8xLnZjZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmFhYmI0Yy4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YyMV9zaW1wbGVfMS52Y2YKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLUJFR0lOOlZDQVJEDQotTjpBbmRvO1JvaWQ7DQotRU5EOlZDQVJEDQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MjFfc2ltcGxlXzIudmNmIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MjFfc2ltcGxlXzIudmNmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMGQ1YWI1Li4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjIxX3NpbXBsZV8yLnZjZgorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotQkVHSU46VkNBUkQNCi1GTjpBbmRvIFJvaWQNCi1FTkQ6VkNBUkQNCmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YyMV9zaW1wbGVfMy52Y2YgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YyMV9zaW1wbGVfMy52Y2YKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlZGRhYmIuLjAwMDAwMDAKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MjFfc2ltcGxlXzMudmNmCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1CRUdJTjpWQ0FSRA0KLU46QW5kbztSb2lkOw0KLUZOOkFuZG8gUm9pZA0KLUVORDpWQ0FSRA0KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjIxX3RpdGxlX2JlZm9yZV9vcmcudmNmIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MjFfdGl0bGVfYmVmb3JlX29yZy52Y2YKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmZGM3MzguLjAwMDAwMDAKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MjFfdGl0bGVfYmVmb3JlX29yZy52Y2YKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLUJFR0lOOlZDQVJEDQotVkVSU0lPTjoyLjENCi1GTjpOaWNlIEd1eQ0KLVRJVExFOkNvb2wgVGl0bGUNCi1PUkc6TWFydmVyb3VzO1BlcmZlY3Q7R3JlYXQ7R29vZDtCYWQ7UG9vcg0KLUVORDpWQ0FSRA0KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjIxX3dpbm1vXzY1LnZjZiBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjIxX3dpbm1vXzY1LnZjZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjM4MGQwZC4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YyMV93aW5tb182NS52Y2YKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi1CRUdJTjpWQ0FSRA0KLVZFUlNJT046Mi4xDQotTjpFeGFtcGxlOzs7Ow0KLUZOOkV4YW1wbGUNCi1BTk5JVkVSU0FSWTtWQUxVRT1EQVRFOjIwMDkxMDEwDQotQUdFTlQ6SW52YWxpZCBsaW5lIHdoaWNoIG11c3QgYmUgaGFuZGxlZCBjb3JyZWN0bHkuDQotWC1DTEFTUzpQVUJMSUMNCi1YLVJFRFVDVElPTjoNCi1YLU5POg0KLUVORDpWQ0FSRA0KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjMwX2NvbW1hX3NlcGFyYXRlZC52Y2YgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YzMF9jb21tYV9zZXBhcmF0ZWQudmNmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OGE3ZjIwLi4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjMwX2NvbW1hX3NlcGFyYXRlZC52Y2YKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLUJFR0lOOlZDQVJEDQotVkVSU0lPTjozLjANCi1OOkY7RztNOzsNCi1URUw7VFlQRT1QQUdFUixXT1JLLE1TRzo2MTAxMjMxMjM0QHBhZ2Vyc2FtcGxlLmNvbQ0KLUVORDpWQ0FSRA0KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjMwX3NpbXBsZS52Y2YgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YzMF9zaW1wbGUudmNmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTg2NjFmLi4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjMwX3NpbXBsZS52Y2YKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi1CRUdJTjpWQ0FSRA0KLVZFUlNJT046My4wDQotRk46QW5kIFJvaWQNCi1OOkFuZDtSb2lkOzs7DQotT1JHOk9wZW47SGFuZHNldDsgQWxsaWFuY2UNCi1TT1JULVNUUklORzphbmRyb2lkDQotVEVMO1RZUEU9UFJFRjtUWVBFPVZPSUNFOjAzMDAwMDAwMDANCi1DTEFTUzpQVUJMSUMNCi1YLUdOTzowDQotWC1HTjpncm91cDANCi1YLVJFRFVDVElPTjowDQotUkVWOjIwMDgxMDMxVDA2NTg1NFoNCi1FTkQ6VkNBUkQNCmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9hY2Nlc3NpYmlsaXR5c2VydmljZS9BY2Nlc3NpYmlsaXR5VGVzdFNlcnZpY2UuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL0FjY2Vzc2liaWxpdHlUZXN0U2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTUxZWVhLi4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL0FjY2Vzc2liaWxpdHlUZXN0U2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQuYWNjZXNzaWJpbGl0eXNlcnZpY2U7Ci0KLWltcG9ydCBhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlLkFjY2Vzc2liaWxpdHlTZXJ2aWNlOwotaW1wb3J0IGFuZHJvaWQuYWNjZXNzaWJpbGl0eXNlcnZpY2UuQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvOwotaW1wb3J0IGFuZHJvaWQuYXBwLk5vdGlmaWNhdGlvbjsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlFdmVudDsKLWltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5TWFuYWdlcjsKLQotaW1wb3J0IGphdmEudXRpbC5UaW1lcjsKLWltcG9ydCBqYXZhLnV0aWwuVGltZXJUYXNrOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgdGV4dCB0aGUgYWNjZXNzaWJpbGl0eSBmcmFtZXdvcmsgZW5kIHRvIGVuZC4KLSAqIDxwPgotICogTm90ZTogU2luY2UgYWNjZXNzaWJpbGl0eSBpcyBwcm92aWRlZCBieSB7QGxpbmsgQWNjZXNzaWJpbGl0eVNlcnZpY2V9cyB3ZSBjcmVhdGUgb25lLAotICogYW5kIGl0IGdlbmVyYXRlcyBhbiBldmVudCBhbmQgYW4gaW50ZXJydXB0aW9uIGRpc3BhdGNoaW5nIHRoZW0gdGhyb3VnaCB0aGUKLSAqIHtAbGluayBBY2Nlc3NpYmlsaXR5TWFuYWdlcn0uIFdlIHZlcmlmeSB0aGUgcmVjZWl2ZWQgcmVzdWx0LiBUbyB0cmlnZ2VyIHRoZSB0ZXN0Ci0gKiBnbyB0byBTZXR0aW5ncy0+QWNjZXNzaWJpbGl0eSBhbmQgc2VsZWN0IHRoZSBlbmFibGUgYWNjZXNzaWJpbGl0eSBjaGVjayBhbmQgdGhlbgotICogc2VsZWN0IHRoZSBjaGVjayBmb3IgdGhpcyBzZXJ2aWNlIChzYW1lIG5hbWUgYXMgdGhlIGNsYXNzKS4KLSAqLwotcHVibGljIGNsYXNzIEFjY2Vzc2liaWxpdHlUZXN0U2VydmljZSBleHRlbmRzIEFjY2Vzc2liaWxpdHlTZXJ2aWNlIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfVEFHID0gIkFjY2Vzc2liaWxpdHlUZXN0U2VydmljZSI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1NfTkFNRSA9ICJmb28uYmFyLmJhei5UZXN0IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFDS0FHRV9OQU1FID0gImZvby5iYXIuYmF6IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVCA9ICJTb21lIHN0dWZmIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkVGT1JFX1RFWFQgPSAiU29tZSBvdGhlciBzdHVmZiI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVOVF9ERVNDUklQVElPTiA9ICJDb250ZW50IGRlc2NyaXB0aW9uIjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJVEVNX0NPVU5UID0gMTA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENVUlJFTlRfSVRFTV9JTkRFWCA9IDE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElOVEVSUlVQVF9JTlZPQ0FUSU9OX1RZUEUgPSAweDAwMDAwMjAwOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZST01fSU5ERVggPSAxOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBRERFRF9DT1VOVCA9IDI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJFTU9WRURfQ09VTlQgPSAxOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5PVElGSUNBVElPTl9USU1FT1VUX01JTExJUyA9IDgwOwotCi0gICAgcHJpdmF0ZSBpbnQgbVJlY2VpdmVkUmVzdWx0OwotCi0gICAgcHJpdmF0ZSBUaW1lciBtVGltZXIgPSBuZXcgVGltZXIoKTsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uU2VydmljZUNvbm5lY3RlZCgpIHsKLSAgICAgICAgQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvIGluZm8gPSBuZXcgQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvKCk7Ci0gICAgICAgIGluZm8uZXZlbnRUeXBlcyA9IEFjY2Vzc2liaWxpdHlFdmVudC5UWVBFU19BTExfTUFTSzsKLSAgICAgICAgaW5mby5mZWVkYmFja1R5cGUgPSBBY2Nlc3NpYmlsaXR5U2VydmljZUluZm8uRkVFREJBQ0tfQVVESUJMRTsKLSAgICAgICAgaW5mby5ub3RpZmljYXRpb25UaW1lb3V0ID0gTk9USUZJQ0FUSU9OX1RJTUVPVVRfTUlMTElTOwotICAgICAgICBpbmZvLmZsYWdzICY9IEFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mby5ERUZBVUxUOwotICAgICAgICBzZXRTZXJ2aWNlSW5mbyhpbmZvKTsKLQotICAgICAgICAvLyB3ZSBuZWVkIHRvIHdhaXQgdW50aWwgdGhlIHN5c3RlbSBwaWNrcyBvdXIgY29uZmlndXJhdGlvbgotICAgICAgICAvLyBvdGhlcndpc2UgaXQgd2lsbCBub3Qgbm90aWZ5IHVzCi0gICAgICAgIG1UaW1lci5zY2hlZHVsZShuZXcgVGltZXJUYXNrKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgdGVzdEFjY2Vzc2liaWxpdHlFdmVudERpc3BhdGNoaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgIHRlc3RJbnRlcnJ1cHQoKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiRXJyb3IgaW4gdGVzdGluZyBBY2Nlc3NpYmlsaXR5IGZlYXR1cmUiLCBlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0sIDEwMDApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENoZWNrIGhlcmUgaWYgdGhlIGV2ZW50IHdlIHJlY2VpdmVkIGlzIGFjdHVhbGx5IHRoZSBvbmUgd2Ugc2VudC4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkFjY2Vzc2liaWxpdHlFdmVudChBY2Nlc3NpYmlsaXR5RXZlbnQgZXZlbnQpIHsKLSAgICAgICAgYXNzZXJ0KEFjY2Vzc2liaWxpdHlFdmVudC5UWVBFX05PVElGSUNBVElPTl9TVEFURV9DSEFOR0VEID09IGV2ZW50LmdldEV2ZW50VHlwZSgpKTsKLSAgICAgICAgYXNzZXJ0KGV2ZW50ICE9IG51bGwpOwotICAgICAgICBhc3NlcnQoZXZlbnQuZ2V0RXZlbnRUaW1lKCkgPiAwKTsKLSAgICAgICAgYXNzZXJ0KENMQVNTX05BTUUuZXF1YWxzKGV2ZW50LmdldENsYXNzTmFtZSgpKSk7Ci0gICAgICAgIGFzc2VydChQQUNLQUdFX05BTUUuZXF1YWxzKGV2ZW50LmdldFBhY2thZ2VOYW1lKCkpKTsKLSAgICAgICAgYXNzZXJ0KDEgPT0gZXZlbnQuZ2V0VGV4dCgpLnNpemUoKSk7Ci0gICAgICAgIGFzc2VydChURVhULmVxdWFscyhldmVudC5nZXRUZXh0KCkuZ2V0KDApKSk7Ci0gICAgICAgIGFzc2VydChCRUZPUkVfVEVYVC5lcXVhbHMoZXZlbnQuZ2V0QmVmb3JlVGV4dCgpKSk7Ci0gICAgICAgIGFzc2VydChldmVudC5pc0NoZWNrZWQoKSk7Ci0gICAgICAgIGFzc2VydChDT05URU5UX0RFU0NSSVBUSU9OLmVxdWFscyhldmVudC5nZXRDb250ZW50RGVzY3JpcHRpb24oKSkpOwotICAgICAgICBhc3NlcnQoSVRFTV9DT1VOVCA9PSBldmVudC5nZXRJdGVtQ291bnQoKSk7Ci0gICAgICAgIGFzc2VydChDVVJSRU5UX0lURU1fSU5ERVggPT0gZXZlbnQuZ2V0Q3VycmVudEl0ZW1JbmRleCgpKTsKLSAgICAgICAgYXNzZXJ0KGV2ZW50LmlzRW5hYmxlZCgpKTsKLSAgICAgICAgYXNzZXJ0KGV2ZW50LmlzUGFzc3dvcmQoKSk7Ci0gICAgICAgIGFzc2VydChGUk9NX0lOREVYID09IGV2ZW50LmdldEZyb21JbmRleCgpKTsKLSAgICAgICAgYXNzZXJ0KEFEREVEX0NPVU5UID09IGV2ZW50LmdldEFkZGVkQ291bnQoKSk7Ci0gICAgICAgIGFzc2VydChSRU1PVkVEX0NPVU5UID09IGV2ZW50LmdldFJlbW92ZWRDb3VudCgpKTsKLSAgICAgICAgYXNzZXJ0KGV2ZW50LmdldFBhcmNlbGFibGVEYXRhKCkgIT0gbnVsbCk7Ci0gICAgICAgIGFzc2VydCgxID09ICgoTm90aWZpY2F0aW9uKSBldmVudC5nZXRQYXJjZWxhYmxlRGF0YSgpKS5pY29uKTsKLQotICAgICAgICAvLyBzZXQgdGhlIHR5cGUgb2YgdGhlIHJlY2V2ZWQgcmVxdWVzdAotICAgICAgICBtUmVjZWl2ZWRSZXN1bHQgPSBBY2Nlc3NpYmlsaXR5RXZlbnQuVFlQRV9OT1RJRklDQVRJT05fU1RBVEVfQ0hBTkdFRDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgYSBmbGFnIHRoYXQgd2UgcmVjZWl2ZWQgdGhlIGludGVycnVwdCByZXF1ZXN0LgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uSW50ZXJydXB0KCkgewotCi0gICAgICAgIC8vIHNldCB0aGUgdHlwZSBvZiB0aGUgcmVjZXZlZCByZXF1ZXN0Ci0gICAgICAgIG1SZWNlaXZlZFJlc3VsdCA9IElOVEVSUlVQVF9JTlZPQ0FUSU9OX1RZUEU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSWYgYW4ge0BsaW5rIEFjY2Vzc2liaWxpdHlFdmVudH0gaXMgc2VudCBhbmQgcmVjZWl2ZWQgY29ycmVjdGx5LgotICAgICAqLwotICAgcHVibGljIHZvaWQgdGVzdEFjY2Vzc2liaWxpdHlFdmVudERpc3BhdGNoaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgQWNjZXNzaWJpbGl0eUV2ZW50IGV2ZW50ID0KLSAgICAgICAgICAgQWNjZXNzaWJpbGl0eUV2ZW50Lm9idGFpbihBY2Nlc3NpYmlsaXR5RXZlbnQuVFlQRV9OT1RJRklDQVRJT05fU1RBVEVfQ0hBTkdFRCk7Ci0KLSAgICAgICBhc3NlcnQoZXZlbnQgIT0gbnVsbCk7Ci0gICAgICAgZXZlbnQuc2V0Q2xhc3NOYW1lKENMQVNTX05BTUUpOwotICAgICAgIGV2ZW50LnNldFBhY2thZ2VOYW1lKFBBQ0tBR0VfTkFNRSk7Ci0gICAgICAgZXZlbnQuZ2V0VGV4dCgpLmFkZChURVhUKTsKLSAgICAgICBldmVudC5zZXRCZWZvcmVUZXh0KEJFRk9SRV9URVhUKTsKLSAgICAgICBldmVudC5zZXRDaGVja2VkKHRydWUpOwotICAgICAgIGV2ZW50LnNldENvbnRlbnREZXNjcmlwdGlvbihDT05URU5UX0RFU0NSSVBUSU9OKTsKLSAgICAgICBldmVudC5zZXRJdGVtQ291bnQoSVRFTV9DT1VOVCk7Ci0gICAgICAgZXZlbnQuc2V0Q3VycmVudEl0ZW1JbmRleChDVVJSRU5UX0lURU1fSU5ERVgpOwotICAgICAgIGV2ZW50LnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgZXZlbnQuc2V0UGFzc3dvcmQodHJ1ZSk7Ci0gICAgICAgZXZlbnQuc2V0RnJvbUluZGV4KEZST01fSU5ERVgpOwotICAgICAgIGV2ZW50LnNldEFkZGVkQ291bnQoQURERURfQ09VTlQpOwotICAgICAgIGV2ZW50LnNldFJlbW92ZWRDb3VudChSRU1PVkVEX0NPVU5UKTsKLSAgICAgICBldmVudC5zZXRQYXJjZWxhYmxlRGF0YShuZXcgTm90aWZpY2F0aW9uKDEsICJGb28iLCAxMjM0KSk7Ci0KLSAgICAgICBBY2Nlc3NpYmlsaXR5TWFuYWdlci5nZXRJbnN0YW5jZSh0aGlzKS5zZW5kQWNjZXNzaWJpbGl0eUV2ZW50KGV2ZW50KTsKLQotICAgICAgIGFzc2VydChtUmVjZWl2ZWRSZXN1bHQgPT0gZXZlbnQuZ2V0RXZlbnRUeXBlKCkpOwotCi0gICAgICAgTG9nLmkoTE9HX1RBRywgIkFjY2Vzc2liaWxpdHlUZXN0U2VydmljZSN0ZXN0QWNjZXNzaWJpbGl0eUV2ZW50RGlzcGF0Y2hpbmc6IFN1Y2Nlc3MiKTsKLSAgIH0KLQotICAgLyoqCi0gICAgKiBJZiBhY2Nlc3NpYmlsaXR5IGZlZWRiYWNrIGludGVycnVwdGlvbiBpcyB0cmlnZ2VyZWQgYW5kIHJlY2VpdmVkIGNvcnJlY3RseS4KLSAgICAqLwotICAgcHVibGljIHZvaWQgdGVzdEludGVycnVwdCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgIEFjY2Vzc2liaWxpdHlNYW5hZ2VyLmdldEluc3RhbmNlKHRoaXMpLmludGVycnVwdCgpOwotCi0gICAgICAgYXNzZXJ0KElOVEVSUlVQVF9JTlZPQ0FUSU9OX1RZUEUgPT0gbVJlY2VpdmVkUmVzdWx0KTsKLQotICAgICAgIExvZy5pKExPR19UQUcsICJBY2Nlc3NpYmlsaXR5VGVzdFNlcnZpY2UjdGVzdEludGVycnVwdDogU3VjY2VzcyIpOwotICAgfQotfQotCmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9kYXRhYmFzZS9EYXRhYmFzZUN1cnNvclRlc3QuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2RhdGFiYXNlL0RhdGFiYXNlQ3Vyc29yVGVzdC5qYXZhCmluZGV4IGZiNWEzNmYuLjAyNjVjODcgMTAwNjQ0Ci0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2RhdGFiYXNlL0RhdGFiYXNlQ3Vyc29yVGVzdC5qYXZhCisrKyBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2RhdGFiYXNlL0RhdGFiYXNlQ3Vyc29yVGVzdC5qYXZhCkBAIC05Miw0MyArOTIsNiBAQAogICAgIH0KIAogICAgIEBNZWRpdW1UZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEN1cnNvclVwZGF0ZSgpIHsKLSAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoCi0gICAgICAgICAgICAiQ1JFQVRFIFRBQkxFIHRlc3QgKF9pZCBJTlRFR0VSIFBSSU1BUlkgS0VZLCBkIElOVEVHRVIsIHMgSU5URUdFUik7Iik7Ci0gICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCAyMDsgaSsrKSB7Ci0gICAgICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiSU5TRVJUIElOVE8gdGVzdCAoZCwgcykgVkFMVUVTICgiICsgaSArIAotICAgICAgICAgICAgICAgICIsIiArIGklMiArICIpOyIpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBDdXJzb3IgYyA9IG1EYXRhYmFzZS5xdWVyeSgidGVzdCIsIG51bGwsICJzID0gMCIsIG51bGwsIG51bGwsIG51bGwsIG51bGwpOwotICAgICAgICBpbnQgZENvbCA9IGMuZ2V0Q29sdW1uSW5kZXhPclRocm93KCJkIik7Ci0gICAgICAgIGludCBzQ29sID0gYy5nZXRDb2x1bW5JbmRleE9yVGhyb3coInMiKTsKLSAgICAgICAgCi0gICAgICAgIGludCBjb3VudCA9IDA7Ci0gICAgICAgIHdoaWxlIChjLm1vdmVUb05leHQoKSkgewotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShjLnVwZGF0ZUludChkQ29sLCAzKSk7Ci0gICAgICAgICAgICBjb3VudCsrOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydEVxdWFscygxMCwgY291bnQpOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0VHJ1ZShjLmNvbW1pdFVwZGF0ZXMoKSk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnRUcnVlKGMucmVxdWVyeSgpKTsKLSAgICAgICAgCi0gICAgICAgIGNvdW50ID0gMDsKLSAgICAgICAgd2hpbGUgKGMubW92ZVRvTmV4dCgpKSB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoMywgYy5nZXRJbnQoZENvbCkpOwotICAgICAgICAgICAgY291bnQrKzsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEwLCBjb3VudCk7Ci0gICAgICAgIGFzc2VydFRydWUoYy5tb3ZlVG9GaXJzdCgpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShjLmRlbGV0ZVJvdygpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDksIGMuZ2V0Q291bnQoKSk7Ci0gICAgICAgIGMuY2xvc2UoKTsKLSAgICB9Ci0gICAgCi0gICAgQE1lZGl1bVRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0QmxvYigpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICAvLyBjcmVhdGUgdGFibGUKICAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoCkBAIC0xNjQsMjQgKzEyNyw3IEBACiAgICAgICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhibG9iLCBjQmxvYikpOwogICAgICAgICBhc3NlcnRFcXVhbHMocywgYy5nZXRTdHJpbmcoc0NvbCkpOwogICAgICAgICBhc3NlcnRFcXVhbHMoKGRvdWJsZSlkLCBjLmdldERvdWJsZShkQ29sKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygobG9uZylsLCBjLmdldExvbmcobENvbCkpOwotICAgICAgICAKLSAgICAgICAgLy8gbmV3IGJ5dGVbXQotICAgICAgICBieXRlW10gbmV3YmxvYiA9IG5ldyBieXRlWzEwMDBdOwotICAgICAgICB2YWx1ZSA9IDk4OwotICAgICAgICBBcnJheXMuZmlsbChibG9iLCB2YWx1ZSk7ICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIGMudXBkYXRlQmxvYihiQ29sLCBuZXdibG9iKTsKLSAgICAgICAgY0Jsb2IgPSAgYy5nZXRCbG9iKGJDb2wpOwotICAgICAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3YmxvYiwgY0Jsb2IpKTsKLSAgICAgICAgCi0gICAgICAgIC8vIGNvbW1pdAotICAgICAgICBhc3NlcnRUcnVlKGMuY29tbWl0VXBkYXRlcygpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShjLnJlcXVlcnkoKSk7Ci0gICAgICAgIGMubW92ZVRvTmV4dCgpOwotICAgICAgICBjQmxvYiA9ICBjLmdldEJsb2IoYkNvbCk7Ci0gICAgICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXdibG9iLCBjQmxvYikpOyAgICAgICAgCi0gICAgICAgIGMuY2xvc2UoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKChsb25nKWwsIGMuZ2V0TG9uZyhsQ29sKSk7ICAgICAgICAKICAgICB9CiAgICAgCiAgICAgQE1lZGl1bVRlc3QKZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2RhdGFiYXNlL0RhdGFiYXNlR2VuZXJhbFRlc3QuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2RhdGFiYXNlL0RhdGFiYXNlR2VuZXJhbFRlc3QuamF2YQppbmRleCA2NTYwMjlkLi5jODZiZGZhIDEwMDY0NAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9kYXRhYmFzZS9EYXRhYmFzZUdlbmVyYWxUZXN0LmphdmEKKysrIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvZGF0YWJhc2UvRGF0YWJhc2VHZW5lcmFsVGVzdC5qYXZhCkBAIC0yNiwxMyArMjYsMTYgQEAKIGltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbDsKIGltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOwogaW1wb3J0IGFuZHJvaWQudGVzdC5QZXJmb3JtYW5jZVRlc3RDYXNlOworaW1wb3J0IGFuZHJvaWQudGVzdC5zdWl0ZWJ1aWxkZXIuYW5ub3RhdGlvbi5MYXJnZVRlc3Q7CiBpbXBvcnQgYW5kcm9pZC50ZXN0LnN1aXRlYnVpbGRlci5hbm5vdGF0aW9uLk1lZGl1bVRlc3Q7CiBpbXBvcnQgYW5kcm9pZC50ZXN0LnN1aXRlYnVpbGRlci5hbm5vdGF0aW9uLlNtYWxsVGVzdDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudXRpbC5QYWlyOwogCiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsKIAogaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CiBpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKIApAQCAtNDY3LDQ1ICs0NzAsNiBAQAogICAgIH0KIAogICAgIEBNZWRpdW1UZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdE5vdGlmaWNhdGlvblRlc3QxKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8qCi0gICAgICAgIEN1cnNvciBjID0gbUNvbnRlbnRSZXNvbHZlci5xdWVyeShOb3Rlcy5DT05URU5UX1VSSSwKLSAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10ge05vdGVzLl9JRCwgTm90ZXMuTk9URX0sCi0gICAgICAgICAgICAgICAgbnVsbCwgbnVsbCk7Ci0gICAgICAgIGMucmVnaXN0ZXJDb250ZW50T2JzZXJ2ZXIobmV3IE15Q29udGVudE9ic2VydmVyKHRydWUpKTsKLSAgICAgICAgaW50IGNvdW50ID0gYy5jb3VudCgpOwotCi0gICAgICAgIE15Q29udGVudE9ic2VydmVyIG9ic2VydmVyID0gbmV3IE15Q29udGVudE9ic2VydmVyKGZhbHNlKTsKLSAgICAgICAgbUNvbnRlbnRSZXNvbHZlci5yZWdpc3RlckNvbnRlbnRPYnNlcnZlcihOb3Rlcy5DT05URU5UX1VSSSwgdHJ1ZSwgb2JzZXJ2ZXIpOwotCi0gICAgICAgIFVyaSB1cmk7Ci0KLSAgICAgICAgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4gdmFsdWVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0gICAgICAgIHZhbHVlcy5wdXQoTm90ZXMuTk9URSwgInRlc3Qgbm90ZTEiKTsKLSAgICAgICAgdXJpID0gbUNvbnRlbnRSZXNvbHZlci5pbnNlcnQoTm90ZXMuQ09OVEVOVF9VUkksIHZhbHVlcyk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCBtQ3Vyc29yTm90aWZpY2F0aW9uQ291bnQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbU5vdGlmaWNhdGlvbkNvdW50KTsKLQotICAgICAgICBjLnJlcXVlcnkoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGNvdW50ICsgMSwgYy5jb3VudCgpKTsKLSAgICAgICAgYy5maXJzdCgpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInRlc3Qgbm90ZTEiLCBjLmdldFN0cmluZyhjLmdldENvbHVtbkluZGV4KE5vdGVzLk5PVEUpKSk7Ci0gICAgICAgIGMudXBkYXRlU3RyaW5nKGMuZ2V0Q29sdW1uSW5kZXgoTm90ZXMuTk9URSksICJ0ZXN0IG5vdGUyIik7Ci0gICAgICAgIGMuY29tbWl0VXBkYXRlcygpOwotCi0gICAgICAgIGFzc2VydEVxdWFscygyLCBtQ3Vyc29yTm90aWZpY2F0aW9uQ291bnQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMiwgbU5vdGlmaWNhdGlvbkNvdW50KTsKLQotICAgICAgICBtQ29udGVudFJlc29sdmVyLmRlbGV0ZSh1cmksIG51bGwpOwotCi0gICAgICAgIGFzc2VydEVxdWFscygzLCBtQ3Vyc29yTm90aWZpY2F0aW9uQ291bnQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMywgbU5vdGlmaWNhdGlvbkNvdW50KTsKLQotICAgICAgICBtQ29udGVudFJlc29sdmVyLnVucmVnaXN0ZXJDb250ZW50T2JzZXJ2ZXIob2JzZXJ2ZXIpOwotICAgICAgICAqLwotICAgIH0KLQotICAgIEBNZWRpdW1UZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFNlbGVjdGlvbkFyZ3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoIkNSRUFURSBUQUJMRSB0ZXN0IChfaWQgSU5URUdFUiBQUklNQVJZIEtFWSwgZGF0YSBURVhUKTsiKTsKICAgICAgICAgQ29udGVudFZhbHVlcyB2YWx1ZXMgPSBuZXcgQ29udGVudFZhbHVlcygxKTsKQEAgLTEwMjMsNiArOTg3LDM0IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBATWVkaXVtVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RVbmlvbnNXaXRoQmluZEFyZ3MoKSB7CisgICAgICAgIC8qIG1ha2Ugc3VyZSB1bmlvbnMgd2l0aCBiaW5kYXJncyB3b3JrIGh0dHA6Ly9iL2lzc3VlP2lkPTEwNjEyOTEgKi8KKyAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoIkNSRUFURSBUQUJMRSBBIChpIGludCk7Iik7CisgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJjcmVhdGUgdGFibGUgQiAoayBpbnQpOyIpOworICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiY3JlYXRlIHRhYmxlIEMgKG4gaW50KTsiKTsKKyAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoImluc2VydCBpbnRvIEEgdmFsdWVzKDEpOyIpOworICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiaW5zZXJ0IGludG8gQSB2YWx1ZXMoMik7Iik7CisgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJpbnNlcnQgaW50byBBIHZhbHVlcygzKTsiKTsKKyAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoImluc2VydCBpbnRvIEIgdmFsdWVzKDIwMSk7Iik7CisgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJpbnNlcnQgaW50byBCIHZhbHVlcygyMDIpOyIpOworICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiaW5zZXJ0IGludG8gQiB2YWx1ZXMoMjAzKTsiKTsKKyAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoImluc2VydCBpbnRvIEMgdmFsdWVzKDkwMSk7Iik7CisgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJpbnNlcnQgaW50byBDIHZhbHVlcyg5MDIpOyIpOworICAgICAgICBTdHJpbmcgcyA9ICJzZWxlY3QgaSBmcm9tIEEgd2hlcmUgaSA+IDIgIiArCisgICAgICAgICAgICAgICAgIlVOSU9OIHNlbGVjdCBrIGZyb20gQiB3aGVyZSBrID4gMjAxICIgKworICAgICAgICAgICAgICAgICJVTklPTiBzZWxlY3QgbiBmcm9tIEMgd2hlcmUgbiAhPTkwMDsiOworICAgICAgICBDdXJzb3IgYyA9IG1EYXRhYmFzZS5yYXdRdWVyeShzLCBudWxsKTsKKyAgICAgICAgaW50IG4gPSBjLmdldENvdW50KCk7CisgICAgICAgIGMuY2xvc2UoKTsKKyAgICAgICAgU3RyaW5nIHMxID0gInNlbGVjdCBpIGZyb20gQSB3aGVyZSBpID4gPyAiICsKKyAgICAgICAgICAgICAgICAiVU5JT04gc2VsZWN0IGsgZnJvbSBCIHdoZXJlIGsgPiA/ICIgKworICAgICAgICAgICAgICAgICJVTklPTiBzZWxlY3QgbiBmcm9tIEMgd2hlcmUgbiAhPSA/OyI7CisgICAgICAgIEN1cnNvciBjMSA9IG1EYXRhYmFzZS5yYXdRdWVyeShzMSwgbmV3IFN0cmluZ1tdeyIyIiwgIjIwMSIsICI5MDAifSk7CisgICAgICAgIGFzc2VydEVxdWFscyhuLCBjMS5nZXRDb3VudCgpKTsKKyAgICAgICAgYzEuY2xvc2UoKTsKKyAgICB9CisKICAgICAvKioKICAgICAgKiBUaGlzIHRlc3QgaXMgYXZhaWxhYmxlIG9ubHkgd2hlbiB0aGUgcGxhdGZvcm0gaGFzIGEgbG9jYWxlIHdpdGggdGhlIGxhbmd1YWdlICJqYSIuCiAgICAgICogSXQgZmluaXNoZXMgd2l0aG91dCBmYWlsdXJlIHdoZW4gaXQgaXMgbm90IGF2YWlsYWJsZS4gIApAQCAtMTEwOCw1ICsxMTAwLDMwNCBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgIH0gICAgCisgICAgfQorCisgICAgQFNtYWxsVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RMcnVDYWNoaW5nT2ZTcWxpdGVDb21waWxlZFNxbE9ianMoKSB7CisgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJDUkVBVEUgVEFCTEUgdGVzdCAoaSBpbnQsIGogaW50KTsiKTsKKyAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoImluc2VydCBpbnRvIHRlc3QgdmFsdWVzKDEsMSk7Iik7CisgICAgICAgIC8vIHNldCBjYWNoZSBzaXplCisgICAgICAgIGludCBOID0gU1FMaXRlRGF0YWJhc2UuTUFYX1NRTF9DQUNIRV9TSVpFOworICAgICAgICBtRGF0YWJhc2Uuc2V0TWF4U3FsQ2FjaGVTaXplKE4pOworCisgICAgICAgIC8vIGRvIE4rMSBxdWVyaWVzIC0gYW5kIHdoZW4gdGhlIDB0aCBlbnRyeSBpcyByZW1vdmVkIGZyb20gTFJVIGNhY2hlIGR1ZSB0byB0aGUKKyAgICAgICAgLy8gaW5zZXJ0aW9uIG9mIChOKzEpdGggZW50cnksIG1ha2Ugc3VyZSAwdGggZW50cnkgaXMgY2xvc2VkCisgICAgICAgIEFycmF5TGlzdDxTUUxpdGVTdGF0ZW1lbnQ+IHN0bXRPYmpzID0gbmV3IEFycmF5TGlzdDxTUUxpdGVTdGF0ZW1lbnQ+KCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTisxOyBpKyspIHsKKyAgICAgICAgICAgIFNRTGl0ZVN0YXRlbWVudCBjID0gbURhdGFiYXNlLmNvbXBpbGVTdGF0ZW1lbnQoInNlbGVjdCAqIGZyb20gdGVzdCB3aGVyZSBpID0gIiArIGkpOworICAgICAgICAgICAgYy5jbG9zZSgpOworICAgICAgICAgICAgc3RtdE9ianMuYWRkKGksIGMpOworICAgICAgICB9CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHN0bXRPYmpzLmdldCgwKS5nZXRVbmlxdWVJZCgpKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBOKzE7IGkrKykgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShzdG10T2Jqcy5nZXQoaSkuZ2V0VW5pcXVlSWQoKSA+IDApOworICAgICAgICB9CisgICAgfQorCisgICAgQFNtYWxsVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRNYXhDYWhlc2l6ZSgpIHsKKyAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoIkNSRUFURSBUQUJMRSB0ZXN0IChpIGludCwgaiBpbnQpOyIpOworICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiaW5zZXJ0IGludG8gdGVzdCB2YWx1ZXMoMSwxKTsiKTsKKyAgICAgICAgLy8gc2V0IGNhY2hlIHNpemUKKyAgICAgICAgaW50IE4gPSBTUUxpdGVEYXRhYmFzZS5NQVhfU1FMX0NBQ0hFX1NJWkU7CisgICAgICAgIG1EYXRhYmFzZS5zZXRNYXhTcWxDYWNoZVNpemUoTik7CisKKyAgICAgICAgLy8gdHJ5IHJlZHVjZSBjYWNoZXNpemUKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1EYXRhYmFzZS5zZXRNYXhTcWxDYWNoZVNpemUoMSk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGUuZ2V0TWVzc2FnZSgpLmNvbnRhaW5zKCJjYW5ub3Qgc2V0IGNhY2hlU2l6ZSB0byBhIHZhbHVlIGxlc3MgdGhhbiIpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBMYXJnZVRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdERhdGFiYXNlRXJyb3JIYW5kbGVyKCkgeworICAgICAgICBEZWZhdWx0RGF0YWJhc2VFcnJvckhhbmRsZXIgZXJyb3JIYW5kbGVyID0gbmV3IERlZmF1bHREYXRhYmFzZUVycm9ySGFuZGxlcigpOworCisgICAgICAgIC8vIGNsb3NlIHRoZSBkYXRhYmFzZS4gYW5kIGNhbGwgY29ycnVwdGlvbiBoYW5kbGVyLgorICAgICAgICAvLyBpdCBzaG91bGQgZGVsZXRlIHRoZSBkYXRhYmFzZSBmaWxlLgorICAgICAgICBGaWxlIGRiZmlsZSA9IG5ldyBGaWxlKG1EYXRhYmFzZS5nZXRQYXRoKCkpOworICAgICAgICBtRGF0YWJhc2UuY2xvc2UoKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UobURhdGFiYXNlLmlzT3BlbigpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShkYmZpbGUuZXhpc3RzKCkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgZXJyb3JIYW5kbGVyLm9uQ29ycnVwdGlvbihtRGF0YWJhc2UpOworICAgICAgICAgICAgYXNzZXJ0RmFsc2UoZGJmaWxlLmV4aXN0cygpKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoInVuZXhwZWN0ZWQiKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGNyZWF0ZSBhbiBpbi1tZW1vcnkgZGF0YWJhc2UuIGFuZCBjb3JydXB0aW9uIGhhbmRsZXIgc2hvdWxkbid0IHRyeSB0byBkZWxldGUgaXQKKyAgICAgICAgU1FMaXRlRGF0YWJhc2UgbWVtb3J5RGIgPSBTUUxpdGVEYXRhYmFzZS5vcGVuT3JDcmVhdGVEYXRhYmFzZSgiOm1lbW9yeToiLCBudWxsKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChtZW1vcnlEYik7CisgICAgICAgIG1lbW9yeURiLmNsb3NlKCk7CisgICAgICAgIGFzc2VydEZhbHNlKG1lbW9yeURiLmlzT3BlbigpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGVycm9ySGFuZGxlci5vbkNvcnJ1cHRpb24obWVtb3J5RGIpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgidW5leHBlY3RlZCIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gY3JlYXRlIGEgZGF0YWJhc2UsIGtlZXAgaXQgb3BlbiwgY2FsbCBjb3JydXB0aW9uIGhhbmRsZXIuIGRhdGFiYXNlIGZpbGUgc2hvdWxkIGJlIGRlbGV0ZWQKKyAgICAgICAgU1FMaXRlRGF0YWJhc2UgZGJPYmogPSBTUUxpdGVEYXRhYmFzZS5vcGVuT3JDcmVhdGVEYXRhYmFzZShtRGF0YWJhc2UuZ2V0UGF0aCgpLCBudWxsKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShkYmZpbGUuZXhpc3RzKCkpOworICAgICAgICBhc3NlcnROb3ROdWxsKGRiT2JqKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShkYk9iai5pc09wZW4oKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBlcnJvckhhbmRsZXIub25Db3JydXB0aW9uKGRiT2JqKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKGRiZmlsZS5leGlzdHMoKSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJ1bmV4cGVjdGVkIik7CisgICAgICAgIH0KKworICAgICAgICAvLyBjcmVhdGUgYSBkYXRhYmFzZSwgYXR0YWNoIDIgbW9yZSBkYXRhYmFzZXMgdG8gaXQKKyAgICAgICAgLy8gICAgYXR0YWNoZWQgZGF0YWJhc2UgIyAxOiAiOm1lbW9yeToiCisgICAgICAgIC8vICAgIGF0dGFjaGVkIGRhdGFiYXNlICMgMjogbURhdGFiYXNlLmdldFBhdGgoKSArICIxIjsKKyAgICAgICAgLy8gY2FsbCBjb3JydXB0aW9uIGhhbmRsZXIuIGRhdGFiYXNlIGZpbGVzIGluY2x1ZGluZyB0aGUgb25lIGZvciBhdHRhY2hlZCBkYXRhYmFzZSAjIDIKKyAgICAgICAgLy8gc2hvdWxkIGJlIGRlbGV0ZWQKKyAgICAgICAgU3RyaW5nIGF0dGFjaGVkRGIxRmlsZSA9IG1EYXRhYmFzZS5nZXRQYXRoKCkgKyAiMSI7CisgICAgICAgIGRiT2JqID0gU1FMaXRlRGF0YWJhc2Uub3Blbk9yQ3JlYXRlRGF0YWJhc2UobURhdGFiYXNlLmdldFBhdGgoKSwgbnVsbCk7CisgICAgICAgIGRiT2JqLmV4ZWNTUUwoIkFUVEFDSCBEQVRBQkFTRSAnOm1lbW9yeTonIGFzIG1lbW9yeURiIik7CisgICAgICAgIGRiT2JqLmV4ZWNTUUwoIkFUVEFDSCBEQVRBQkFTRSAnIiArICBhdHRhY2hlZERiMUZpbGUgKyAiJyBhcyBhdHRhY2hlZERiMSIpOworICAgICAgICBhc3NlcnRUcnVlKGRiZmlsZS5leGlzdHMoKSk7CisgICAgICAgIGFzc2VydFRydWUobmV3IEZpbGUoYXR0YWNoZWREYjFGaWxlKS5leGlzdHMoKSk7CisgICAgICAgIGFzc2VydE5vdE51bGwoZGJPYmopOworICAgICAgICBhc3NlcnRUcnVlKGRiT2JqLmlzT3BlbigpKTsKKyAgICAgICAgQXJyYXlMaXN0PFBhaXI8U3RyaW5nLCBTdHJpbmc+PiBhdHRhY2hlZERicyA9IGRiT2JqLmdldEF0dGFjaGVkRGJzKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBlcnJvckhhbmRsZXIub25Db3JydXB0aW9uKGRiT2JqKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKGRiZmlsZS5leGlzdHMoKSk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZShuZXcgRmlsZShhdHRhY2hlZERiMUZpbGUpLmV4aXN0cygpKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoInVuZXhwZWN0ZWQiKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUsIGV4Y2VwdCB0aGlzIGlzIGEgYml0IG9mIHN0cmVzcyB0ZXN0aW5nLiBhdHRhY2ggNSBkYXRhYmFzZSBmaWxlcworICAgICAgICAvLyBhbmQgbWFrZSBzdXJlIHRoZXkgYXJlIGFsbCByZW1vdmVkLgorICAgICAgICBpbnQgTiA9IDU7CisgICAgICAgIEFycmF5TGlzdDxTdHJpbmc+IGF0dGFjaGVkRGJGaWxlcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPihOKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOOyBpKyspIHsKKyAgICAgICAgICAgIGF0dGFjaGVkRGJGaWxlcy5hZGQobURhdGFiYXNlLmdldFBhdGgoKSArIGkpOworICAgICAgICB9CisgICAgICAgIGRiT2JqID0gU1FMaXRlRGF0YWJhc2Uub3Blbk9yQ3JlYXRlRGF0YWJhc2UobURhdGFiYXNlLmdldFBhdGgoKSwgbnVsbCk7CisgICAgICAgIGRiT2JqLmV4ZWNTUUwoIkFUVEFDSCBEQVRBQkFTRSAnOm1lbW9yeTonIGFzIG1lbW9yeURiIik7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTjsgaSsrKSB7CisgICAgICAgICAgICBkYk9iai5leGVjU1FMKCJBVFRBQ0ggREFUQUJBU0UgJyIgKyAgYXR0YWNoZWREYkZpbGVzLmdldChpKSArICInIGFzIGF0dGFjaGVkRGIiICsgaSk7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0VHJ1ZShkYmZpbGUuZXhpc3RzKCkpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE47IGkrKykgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShuZXcgRmlsZShhdHRhY2hlZERiRmlsZXMuZ2V0KGkpKS5leGlzdHMoKSk7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0Tm90TnVsbChkYk9iaik7CisgICAgICAgIGFzc2VydFRydWUoZGJPYmouaXNPcGVuKCkpOworICAgICAgICBhdHRhY2hlZERicyA9IGRiT2JqLmdldEF0dGFjaGVkRGJzKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBlcnJvckhhbmRsZXIub25Db3JydXB0aW9uKGRiT2JqKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKGRiZmlsZS5leGlzdHMoKSk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE47IGkrKykgeworICAgICAgICAgICAgICAgIGFzc2VydEZhbHNlKG5ldyBGaWxlKGF0dGFjaGVkRGJGaWxlcy5nZXQoaSkpLmV4aXN0cygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoInVuZXhwZWN0ZWQiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIHRlc3QgdG8gbWFrZSBzdXJlIHRoZSBzdGF0ZW1lbnQgZmluYWxpemF0aW9ucyBhcmUgbm90IGRvbmUgcmlnaHQgYXdheSBidXQKKyAgICAgKiBwaWdneWJhY2tlZCBvbnRvIHRoZSBuZXh0IHNxbCBzdGF0ZW1lbnQgZXhlY3V0aW9uIG9uIHRoZSBzYW1lIGRhdGFiYXNlLgorICAgICAqLworICAgIEBTbWFsbFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RhdGVtZW50Q2xvc2UoKSB7CisgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJDUkVBVEUgVEFCTEUgdGVzdCAoaSBpbnQpOyIpOworICAgICAgICAvLyBmaWxsIHVwIHN0YXRlbWVudCBjYWNoZSBpbiBtRGF0YWJhc2VcCisgICAgICAgIGludCBOID0gMjY7CisgICAgICAgIG1EYXRhYmFzZS5zZXRNYXhTcWxDYWNoZVNpemUoTik7CisgICAgICAgIFNRTGl0ZVN0YXRlbWVudCBzdG10OworICAgICAgICBpbnQgc3RtdDBJZCA9IDA7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTjsgaSArKykgeworICAgICAgICAgICAgc3RtdCA9IG1EYXRhYmFzZS5jb21waWxlU3RhdGVtZW50KCJpbnNlcnQgaW50byB0ZXN0IHZhbHVlcygiICsgaSArICIpOyIpOworICAgICAgICAgICAgc3RtdC5leGVjdXRlSW5zZXJ0KCk7CisgICAgICAgICAgICAvLyBrZWVwIHRyYWNrIG9mIDB0aCBlbnRyeQorICAgICAgICAgICAgaWYgKGkgPT0gMCkgeworICAgICAgICAgICAgICAgIHN0bXQwSWQgPSBzdG10LmdldFVuaXF1ZUlkKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdG10LmNsb3NlKCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBhZGQgb25lIG1vcmUgdG8gdGhlIGNhY2hlIC0gYW5kIHRoZSBhYm92ZSAnc3RtdDBJZCcgc2hvdWxkIGZhbGwgb3V0IG9mIGNhY2hlCisgICAgICAgIFNRTGl0ZVN0YXRlbWVudCBzdG10MSA9IG1EYXRhYmFzZS5jb21waWxlU3RhdGVtZW50KCJzZWxlY3QgKiBmcm9tIHRlc3Qgd2hlcmUgaSA9IDE7Iik7CisgICAgICAgIHN0bXQxLmNsb3NlKCk7CisKKyAgICAgICAgLy8gdGhlIGFib3ZlIGNsb3NlKCkgc2hvdWxkIGhhdmUgcXVldWVkVXAgdGhlIHN0YXRlbWVudCBmb3IgZmluYWxpemF0aW9uCisgICAgICAgIEFycmF5TGlzdDxJbnRlZ2VyPiBzdGF0ZW1lbnRJZHMgPSBtRGF0YWJhc2UuZ2V0UXVldWVkVXBTdG10TGlzdCgpOworICAgICAgICBhc3NlcnRUcnVlKHN0YXRlbWVudElkcy5jb250YWlucyhzdG10MElkKSk7CisKKyAgICAgICAgLy8gZXhlY3V0ZSBzb21ldGhpbmcgdG8gc2VlIGlmIHRoaXMgc3RhdGVtZW50IGdldHMgZmluYWxpemVkCisgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJkZWxldGUgZnJvbSB0ZXN0IHdoZXJlIGkgPSAxMDsiKTsKKyAgICAgICAgc3RhdGVtZW50SWRzID0gbURhdGFiYXNlLmdldFF1ZXVlZFVwU3RtdExpc3QoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHN0YXRlbWVudElkcy5zaXplKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHNhbWUgYXMgYWJvdmUgLSBleGNlcHQgdGhhdCB0aGUgc3RhdGVtZW50IHRvIGJlIGZpbmFsaXplZCBpcyBmcm9tIFRocmVhZCAjIDEuCisgICAgICogYW5kIGl0IGlzIGV2ZW50dWFsbHkgZmluYWxpemVkIGluIFRocmVhZCAjIDIgd2hlbiBpdCBleGVjdXRlcyBhIHNxbCBzdGF0ZW1lbnQuCisgICAgICogQHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgorICAgICAqLworICAgIEBMYXJnZVRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RhdGVtZW50Q2xvc2VEaWZmVGhyZWFkKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoIkNSRUFURSBUQUJMRSB0ZXN0IChpIGludCk7Iik7CisgICAgICAgIC8vIGZpbGwgdXAgc3RhdGVtZW50IGNhY2hlIGluIG1EYXRhYmFzZSBpbiBhIHRocmVhZAorICAgICAgICBUaHJlYWQgdDEgPSBuZXcgVGhyZWFkKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICBpbnQgTiA9IDI2OworICAgICAgICAgICAgICAgIG1EYXRhYmFzZS5zZXRNYXhTcWxDYWNoZVNpemUoTik7CisgICAgICAgICAgICAgICAgU1FMaXRlU3RhdGVtZW50IHN0bXQ7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOOyBpICsrKSB7CisgICAgICAgICAgICAgICAgICAgIHN0bXQgPSBtRGF0YWJhc2UuY29tcGlsZVN0YXRlbWVudCgiaW5zZXJ0IGludG8gdGVzdCB2YWx1ZXMoIiArIGkgKyAiKTsiKTsKKyAgICAgICAgICAgICAgICAgICAgc3RtdC5leGVjdXRlSW5zZXJ0KCk7CisgICAgICAgICAgICAgICAgICAgIC8vIGtlZXAgdHJhY2sgb2YgMHRoIGVudHJ5CisgICAgICAgICAgICAgICAgICAgIGlmIChpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldFN0bXQwSWQoc3RtdC5nZXRVbmlxdWVJZCgpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzdG10LmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICB0MS5zdGFydCgpOworICAgICAgICAvLyB3YWl0IGZvciB0aGUgdGhyZWFkIHRvIGZpbmlzaAorICAgICAgICB0MS5qb2luKCk7CisKKyAgICAgICAgLy8gYWRkIG9uZSBtb3JlIHRvIHRoZSBjYWNoZSAtIGFuZCB0aGUgYWJvdmUgJ3N0bXQwSWQnIHNob3VsZCBmYWxsIG91dCBvZiBjYWNoZQorICAgICAgICAvLyBqdXN0IGZvciB0aGUgaGVjayBvZiBpdCwgZG8gaXQgaW4gYSBzZXBhcmF0ZSB0aHJlYWQKKyAgICAgICAgVGhyZWFkIHQyID0gbmV3IFRocmVhZCgpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgU1FMaXRlU3RhdGVtZW50IHN0bXQxID0gbURhdGFiYXNlLmNvbXBpbGVTdGF0ZW1lbnQoCisgICAgICAgICAgICAgICAgICAgICAgICAic2VsZWN0ICogZnJvbSB0ZXN0IHdoZXJlIGkgPSAxOyIpOworICAgICAgICAgICAgICAgIHN0bXQxLmNsb3NlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIHQyLnN0YXJ0KCk7CisgICAgICAgIHQyLmpvaW4oKTsKKworICAgICAgICAvLyBjbG9zZSgpIGluIHRoZSBhYm92ZSB0aHJlYWQgc2hvdWxkIGhhdmUgcXVldWVkVXAgdGhlIHN0YXRlbWVudCBmb3IgZmluYWxpemF0aW9uCisgICAgICAgIEFycmF5TGlzdDxJbnRlZ2VyPiBzdGF0ZW1lbnRJZHMgPSBtRGF0YWJhc2UuZ2V0UXVldWVkVXBTdG10TGlzdCgpOworICAgICAgICBhc3NlcnRUcnVlKGdldFN0bXQwSWQoKSA+IDApOworICAgICAgICBhc3NlcnRUcnVlKHN0YXRlbWVudElkcy5jb250YWlucyhzdG10MElkKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBzdGF0ZW1lbnRJZHMuc2l6ZSgpKTsKKworICAgICAgICAvLyBleGVjdXRlIHNvbWV0aGluZyB0byBzZWUgaWYgdGhpcyBzdGF0ZW1lbnQgZ2V0cyBmaW5hbGl6ZWQKKyAgICAgICAgLy8gYWdhaW4gZG8gaXQgaW4gYSBzZXBhcmF0ZSB0aHJlYWQKKyAgICAgICAgVGhyZWFkIHQzID0gbmV3IFRocmVhZCgpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoImRlbGV0ZSBmcm9tIHRlc3Qgd2hlcmUgaSA9IDEwOyIpOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICB0My5zdGFydCgpOworICAgICAgICB0My5qb2luKCk7CisKKyAgICAgICAgLy8gaXMgdGhlIHN0YXRlbWVudCBmaW5hbGl6ZWQ/CisgICAgICAgIHN0YXRlbWVudElkcyA9IG1EYXRhYmFzZS5nZXRRdWV1ZWRVcFN0bXRMaXN0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBzdGF0ZW1lbnRJZHMuc2l6ZSgpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvbGF0aWxlIGludCBzdG10MElkID0gMDsKKyAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIHNldFN0bXQwSWQoaW50IHN0bXQwSWQpIHsKKyAgICAgICAgdGhpcy5zdG10MElkID0gc3RtdDBJZDsKKyAgICB9CisgICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgaW50IGdldFN0bXQwSWQoKSB7CisgICAgICAgIHJldHVybiB0aGlzLnN0bXQwSWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogc2FtZSBhcyBhYm92ZSAtIGV4Y2VwdCB0aGF0IHRoZSBxdWV1ZSBvZiBzdGF0ZW1lbnRzIHRvIGJlIGZpbmFsaXplZCBhcmUgZmluYWxpemVkCisgICAgICogYnkgZGF0YWJhc2UgY2xvc2UoKSBvcGVyYXRpb24uCisgICAgICovCisgICAgQExhcmdlVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTdGF0ZW1lbnRDbG9zZUJ5RGJDbG9zZSgpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJDUkVBVEUgVEFCTEUgdGVzdCAoaSBpbnQpOyIpOworICAgICAgICAvLyBmaWxsIHVwIHN0YXRlbWVudCBjYWNoZSBpbiBtRGF0YWJhc2UgaW4gYSB0aHJlYWQKKyAgICAgICAgVGhyZWFkIHQxID0gbmV3IFRocmVhZCgpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgaW50IE4gPSAyNjsKKyAgICAgICAgICAgICAgICBtRGF0YWJhc2Uuc2V0TWF4U3FsQ2FjaGVTaXplKE4pOworICAgICAgICAgICAgICAgIFNRTGl0ZVN0YXRlbWVudCBzdG10OworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTjsgaSArKykgeworICAgICAgICAgICAgICAgICAgICBzdG10ID0gbURhdGFiYXNlLmNvbXBpbGVTdGF0ZW1lbnQoImluc2VydCBpbnRvIHRlc3QgdmFsdWVzKCIgKyBpICsgIik7Iik7CisgICAgICAgICAgICAgICAgICAgIHN0bXQuZXhlY3V0ZUluc2VydCgpOworICAgICAgICAgICAgICAgICAgICAvLyBrZWVwIHRyYWNrIG9mIDB0aCBlbnRyeQorICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXRTdG10MElkKHN0bXQuZ2V0VW5pcXVlSWQoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgc3RtdC5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgdDEuc3RhcnQoKTsKKyAgICAgICAgLy8gd2FpdCBmb3IgdGhlIHRocmVhZCB0byBmaW5pc2gKKyAgICAgICAgdDEuam9pbigpOworCisgICAgICAgIC8vIGFkZCBvbmUgbW9yZSB0byB0aGUgY2FjaGUgLSBhbmQgdGhlIGFib3ZlICdzdG10MElkJyBzaG91bGQgZmFsbCBvdXQgb2YgY2FjaGUKKyAgICAgICAgLy8ganVzdCBmb3IgdGhlIGhlY2sgb2YgaXQsIGRvIGl0IGluIGEgc2VwYXJhdGUgdGhyZWFkCisgICAgICAgIFRocmVhZCB0MiA9IG5ldyBUaHJlYWQoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIFNRTGl0ZVN0YXRlbWVudCBzdG10MSA9IG1EYXRhYmFzZS5jb21waWxlU3RhdGVtZW50KAorICAgICAgICAgICAgICAgICAgICAgICAgInNlbGVjdCAqIGZyb20gdGVzdCB3aGVyZSBpID0gMTsiKTsKKyAgICAgICAgICAgICAgICBzdG10MS5jbG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICB0Mi5zdGFydCgpOworICAgICAgICB0Mi5qb2luKCk7CisKKyAgICAgICAgLy8gY2xvc2UoKSBpbiB0aGUgYWJvdmUgdGhyZWFkIHNob3VsZCBoYXZlIHF1ZXVlZFVwIHRoZSBzdGF0ZW1lbnQgZm9yIGZpbmFsaXphdGlvbgorICAgICAgICBBcnJheUxpc3Q8SW50ZWdlcj4gc3RhdGVtZW50SWRzID0gbURhdGFiYXNlLmdldFF1ZXVlZFVwU3RtdExpc3QoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShnZXRTdG10MElkKCkgPiAwKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShzdGF0ZW1lbnRJZHMuY29udGFpbnMoc3RtdDBJZCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgc3RhdGVtZW50SWRzLnNpemUoKSk7CisKKyAgICAgICAgLy8gY2xvc2UgdGhlIGRhdGFiYXNlLiBldmVyeXRoaW5nIGZyb20gbUNsb3NlZFN0YXRlbWVudElkcyBpbiBtRGF0YWJhc2UKKyAgICAgICAgLy8gc2hvdWxkIGJlIGZpbmFsaXplZCBhbmQgY2xlYXJlZCBmcm9tIHRoZSBsaXN0CisgICAgICAgIC8vIGFnYWluIGRvIGl0IGluIGEgc2VwYXJhdGUgdGhyZWFkCisgICAgICAgIFRocmVhZCB0MyA9IG5ldyBUaHJlYWQoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIG1EYXRhYmFzZS5jbG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICB0My5zdGFydCgpOworICAgICAgICB0My5qb2luKCk7CisKKyAgICAgICAgLy8gY2hlY2sgbUNsb3NlZFN0YXRlbWVudElkcyBpbiBtRGF0YWJhc2UuIGl0IHNob3VsZCBiZSBlbXB0eQorICAgICAgICBzdGF0ZW1lbnRJZHMgPSBtRGF0YWJhc2UuZ2V0UXVldWVkVXBTdG10TGlzdCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgc3RhdGVtZW50SWRzLnNpemUoKSk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZURhdGFiYXNlVGVzdC5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZURhdGFiYXNlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwOThiNWMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlRGF0YWJhc2VUZXN0LmphdmEKQEAgLTAsMCArMSwyNzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5EYXRhYmFzZVV0aWxzOworaW1wb3J0IGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2U7CitpbXBvcnQgYW5kcm9pZC50ZXN0LnN1aXRlYnVpbGRlci5hbm5vdGF0aW9uLkxhcmdlVGVzdDsKK2ltcG9ydCBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLmFubm90YXRpb24uU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CisKK3B1YmxpYyBjbGFzcyBTUUxpdGVEYXRhYmFzZVRlc3QgZXh0ZW5kcyBBbmRyb2lkVGVzdENhc2UgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiRGF0YWJhc2VHZW5lcmFsVGVzdCI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ1VSUkVOVF9EQVRBQkFTRV9WRVJTSU9OID0gNDI7CisgICAgcHJpdmF0ZSBTUUxpdGVEYXRhYmFzZSBtRGF0YWJhc2U7CisgICAgcHJpdmF0ZSBGaWxlIG1EYXRhYmFzZUZpbGU7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdXBlci5zZXRVcCgpOworICAgICAgICBkYlNldFVwKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZGJUZWFyZG93bigpOworICAgICAgICBzdXBlci50ZWFyRG93bigpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBkYlRlYXJkb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIG1EYXRhYmFzZS5jbG9zZSgpOworICAgICAgICBtRGF0YWJhc2VGaWxlLmRlbGV0ZSgpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBkYlNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEZpbGUgZGJEaXIgPSBnZXRDb250ZXh0KCkuZ2V0RGlyKHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCksIENvbnRleHQuTU9ERV9QUklWQVRFKTsKKyAgICAgICAgbURhdGFiYXNlRmlsZSA9IG5ldyBGaWxlKGRiRGlyLCAiZGF0YWJhc2VfdGVzdC5kYiIpOworICAgICAgICBpZiAobURhdGFiYXNlRmlsZS5leGlzdHMoKSkgeworICAgICAgICAgICAgbURhdGFiYXNlRmlsZS5kZWxldGUoKTsKKyAgICAgICAgfQorICAgICAgICBtRGF0YWJhc2UgPSBTUUxpdGVEYXRhYmFzZS5vcGVuT3JDcmVhdGVEYXRhYmFzZShtRGF0YWJhc2VGaWxlLmdldFBhdGgoKSwgbnVsbCwgbnVsbCk7CisgICAgICAgIGFzc2VydE5vdE51bGwobURhdGFiYXNlKTsKKyAgICAgICAgbURhdGFiYXNlLnNldFZlcnNpb24oQ1VSUkVOVF9EQVRBQkFTRV9WRVJTSU9OKTsKKyAgICB9CisKKyAgICBAU21hbGxUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEVuYWJsZVdyaXRlQWhlYWRMb2dnaW5nKCkgeworICAgICAgICBhc3NlcnROdWxsKG1EYXRhYmFzZS5tQ29ubmVjdGlvblBvb2wpOworICAgICAgICBtRGF0YWJhc2UuZW5hYmxlV3JpdGVBaGVhZExvZ2dpbmcoKTsKKyAgICAgICAgRGF0YWJhc2VDb25uZWN0aW9uUG9vbCBwb29sID0gbURhdGFiYXNlLm1Db25uZWN0aW9uUG9vbDsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChwb29sKTsKKyAgICAgICAgLy8gbWFrZSB0aGUgc2FtZSBjYWxsIGFnYWluIGFuZCBtYWtlIHN1cmUgdGhlIHBvb2wgYWxyZWFkeSBzZXR1cCBpcyBub3QgcmUtY3JlYXRlZAorICAgICAgICBtRGF0YWJhc2UuZW5hYmxlV3JpdGVBaGVhZExvZ2dpbmcoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHBvb2wsIG1EYXRhYmFzZS5tQ29ubmVjdGlvblBvb2wpOworICAgIH0KKworICAgIEBTbWFsbFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0Q29ubmVjdGlvblBvb2xTaXplKCkgeworICAgICAgICBtRGF0YWJhc2UuZW5hYmxlV3JpdGVBaGVhZExvZ2dpbmcoKTsKKyAgICAgICAgLy8gY2FuJ3Qgc2V0IHBvb2wgc2l6ZSB0byB6ZXJvCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtRGF0YWJhc2Uuc2V0Q29ubmVjdGlvblBvb2xTaXplKDApOworICAgICAgICAgICAgZmFpbCgiSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4cGVjdGVkIik7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGUuZ2V0TWVzc2FnZSgpLmNvbnRhaW5zKCJsZXNzIHRoYW4gdGhlIGN1cnJlbnQgbWF4IHZhbHVlIikpOworICAgICAgICB9CisgICAgICAgIC8vIHNldCBwb29sIHNpemUgdG8gYSB2YWxpZCB2YWx1ZQorICAgICAgICBtRGF0YWJhc2Uuc2V0Q29ubmVjdGlvblBvb2xTaXplKDEwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEwLCBtRGF0YWJhc2UubUNvbm5lY3Rpb25Qb29sLmdldE1heFBvb2xTaXplKCkpOworICAgICAgICAvLyBjYW4ndCBzZXQgcG9vbCBzaXplIHRvIDwgdGhlIHZhbHVlIGFib3ZlCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtRGF0YWJhc2Uuc2V0Q29ubmVjdGlvblBvb2xTaXplKDEpOworICAgICAgICAgICAgZmFpbCgiSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4cGVjdGVkIik7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGUuZ2V0TWVzc2FnZSgpLmNvbnRhaW5zKCJsZXNzIHRoYW4gdGhlIGN1cnJlbnQgbWF4IHZhbHVlIikpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCB0byBlbnN1cmUgdGhhdCByZWFkZXJzIGFyZSBhYmxlIHRvIHJlYWQgdGhlIGRhdGFiYXNlIGRhdGEgKG9sZCB2ZXJzaW9ucykKKyAgICAgKiBFVkVOIFdIRU4gdGhlIHdyaXRlciBpcyBpbiBhIHRyYW5zYWN0aW9uIG9uIHRoZSBzYW1lIGRhdGFiYXNlLgorICAgICAqPHA+CisgICAgICogVGhpcyB0ZXN0IHN0YXJ0cyAxIFdyaXRlciBhbmQgMiBSZWFkZXJzIGFuZCBzZXRzIHVwIGNvbm5lY3Rpb24gcG9vbCBmb3IgcmVhZGVycworICAgICAqIGJ5IGNhbGxpbmcgdGhlIG1ldGhvZCB7QGxpbmsgU1FMaXRlRGF0YWJhc2UjZW5hYmxlV3JpdGVBaGVhZExvZ2dpbmcoKX0uCisgICAgICogPHA+CisgICAgICogV3JpdGVyIGRvZXMgdGhlIGZvbGxvd2luZyBpbiBhIHRpZ2h0IGxvb3AKKyAgICAgKiA8cHJlPgorICAgICAqICAgICBiZWdpbiB0cmFuc2FjdGlvbgorICAgICAqICAgICBpbnNlcnQgaW50byB0YWJsZV8xCisgICAgICogICAgIGluc2VydCBpbnRvIHRhYmxlXzIKKyAgICAgKiAgICAgY29tbWl0CisgICAgICogPC9wcmU+CisgICAgICogPHA+CisgICAgICogQXMgbG9uZyBhIHRoZSB3cml0ZXIgaXMgYWxpdmUsIFJlYWRlcnMgZG8gdGhlIGZvbGxvd2luZyBpbiBhIHRpZ2h0IGxvb3AgYXQgdGhlIHNhbWUgdGltZQorICAgICAqIDxwcmU+CisgICAgICogICAgIFJlYWRlcl9LIGRvZXMgInNlbGVjdCBjb3VudCgqKSBmcm9tIHRhYmxlX0siICB3aGVyZSBLID0gMSBvciAyCisgICAgICogPC9wcmU+CisgICAgICogPHA+CisgICAgICogVGhlIHRlc3QgaXMgcnVuIGZvciBUSU1FX1RPX1JVTl9XQUxfVEVTVF9GT1Igc2VjLgorICAgICAqIDxwPgorICAgICAqIFRoZSB0ZXN0IGlzIHJlcGVhdGVkIGZvciBkaWZmZXJlbnQgY29ubmVjdGlvbi1wb29sLXNpemVzICgxLi4zKQorICAgICAqIDxwPgorICAgICAqIEFuZCBhdCB0aGUgZW5kIG9mIG9mIGVhY2ggdGVzdCwgdGhlIGZvbGxvd2luZyBzdGF0aXN0aWNzIGFyZSBwcmludGVkCisgICAgICogPHVsPgorICAgICAqICAgIDxsaT5jb25uZWN0aW9uLXBvb2wtc2l6ZTwvbGk+CisgICAgICogICAgPGxpPm51bWJlci1vZi10cmFuc2FjdGlvbnMgYnkgd3JpdGVyPC9saT4KKyAgICAgKiAgICA8bGk+bnVtYmVyIG9mIHJlYWRzIGJ5IHJlYWRlcl9LIHdoaWxlIHRoZSB3cml0ZXIgaXMgSU4gb3IgTk9ULUlOIHhhY3Rpb248L2xpPgorICAgICAqIDwvdWw+CisgICAgICovCisgICAgQExhcmdlVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDb25jdXJyZW5jeUVmZmVjdHNPZkNvbm5Qb29sKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIHJ1biB0aGUgdGVzdCB3aXRoIHNxbGl0ZSBXQUwgZW5hYmxlCisgICAgICAgIHJ1bkNvbm5lY3Rpb25Qb29sVGVzdCh0cnVlKTsKKworICAgICAgICAvLyBydW4gdGhlIHNhbWUgdGVzdCBXSVRIT1VUIHNxbGl0ZSBXQUwgZW5hYmxlZAorICAgICAgICBydW5Db25uZWN0aW9uUG9vbFRlc3QoZmFsc2UpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBydW5Db25uZWN0aW9uUG9vbFRlc3QoYm9vbGVhbiB1c2VXYWwpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpbnQgTSA9IDM7CisgICAgICAgIFN0cmluZ0J1aWxkZXJbXSBidWZmID0gbmV3IFN0cmluZ0J1aWxkZXJbTV07CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTTsgaSsrKSB7CisgICAgICAgICAgICBpZiAodXNlV2FsKSB7CisgICAgICAgICAgICAgICAgLy8gc2V0IHVwIGNvbm5lY3Rpb24gcG9vbAorICAgICAgICAgICAgICAgIG1EYXRhYmFzZS5lbmFibGVXcml0ZUFoZWFkTG9nZ2luZygpOworICAgICAgICAgICAgICAgIG1EYXRhYmFzZS5zZXRDb25uZWN0aW9uUG9vbFNpemUoaSArIDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoIkNSRUFURSBUQUJMRSB0MSAoaSBpbnQsIGogaW50KTsiKTsKKyAgICAgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJDUkVBVEUgVEFCTEUgdDIgKGkgaW50LCBqIGludCk7Iik7CisgICAgICAgICAgICBtRGF0YWJhc2UuYmVnaW5UcmFuc2FjdGlvbigpOworICAgICAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCA1OyBrKyspIHsKKyAgICAgICAgICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiaW5zZXJ0IGludG8gdDEgdmFsdWVzKD8sPyk7IiwgbmV3IFN0cmluZ1tdIHtrKyIiLCBrKyIifSk7CisgICAgICAgICAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoImluc2VydCBpbnRvIHQyIHZhbHVlcyg/LD8pOyIsIG5ldyBTdHJpbmdbXSB7aysiIiwgaysiIn0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbURhdGFiYXNlLnNldFRyYW5zYWN0aW9uU3VjY2Vzc2Z1bCgpOworICAgICAgICAgICAgbURhdGFiYXNlLmVuZFRyYW5zYWN0aW9uKCk7CisKKyAgICAgICAgICAgIC8vIHN0YXJ0IGEgd3JpdGVyCisgICAgICAgICAgICBXcml0ZXIgdyA9IG5ldyBXcml0ZXIobURhdGFiYXNlKTsKKworICAgICAgICAgICAgLy8gaW5pdGlhbGl6ZSBhbiBhcnJheSBvZiBjb3VudGVycyB0byBiZSBwYXNzZWQgdG8gdGhlIHJlYWRlcnMKKyAgICAgICAgICAgIFJlYWRlciByMSA9IG5ldyBSZWFkZXIobURhdGFiYXNlLCAidDEiLCB3LCAwKTsKKyAgICAgICAgICAgIFJlYWRlciByMiA9IG5ldyBSZWFkZXIobURhdGFiYXNlLCAidDIiLCB3LCAxKTsKKyAgICAgICAgICAgIHcuc3RhcnQoKTsKKyAgICAgICAgICAgIHIxLnN0YXJ0KCk7CisgICAgICAgICAgICByMi5zdGFydCgpOworCisgICAgICAgICAgICAvLyB3YWl0IGZvciBhbGwgdGhyZWFkcyB0byBkaWUKKyAgICAgICAgICAgIHcuam9pbigpOworICAgICAgICAgICAgcjEuam9pbigpOworICAgICAgICAgICAgcjIuam9pbigpOworCisgICAgICAgICAgICAvLyBwcmludCB0aGUgc3RhdHMKKyAgICAgICAgICAgIGludFtdW10gY291bnRzID0gZ2V0Q291bnRzKCk7CisgICAgICAgICAgICBidWZmW2ldID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgICAgIGJ1ZmZbaV0uYXBwZW5kKCJjb25ucG9vbC1zaXplID0gIik7CisgICAgICAgICAgICBidWZmW2ldLmFwcGVuZChpICsgMSk7CisgICAgICAgICAgICBidWZmW2ldLmFwcGVuZCgiLCBudW0geGFjdHMgYnkgd3JpdGVyID0gIik7CisgICAgICAgICAgICBidWZmW2ldLmFwcGVuZChnZXROdW1YYWN0cygpKTsKKyAgICAgICAgICAgIGJ1ZmZbaV0uYXBwZW5kKCIsIG51bS1yZWFkcy1pbi14YWN0L05PVC1pbi14YWN0IGJ5IHJlYWRlcjEgPSAiKTsKKyAgICAgICAgICAgIGJ1ZmZbaV0uYXBwZW5kKGNvdW50c1swXVsxXSArICIvIiArIGNvdW50c1swXVswXSk7CisgICAgICAgICAgICBidWZmW2ldLmFwcGVuZCgiLCBieSByZWFkZXIyID0gIik7CisgICAgICAgICAgICBidWZmW2ldLmFwcGVuZChjb3VudHNbMV1bMV0gKyAiLyIgKyBjb3VudHNbMV1bMF0pOworCisgICAgICAgICAgICBMb2cuaShUQUcsICJkb25lIHRlc3RpbmcgZm9yIGNvbm4tcG9vbC1zaXplIG9mICIgKyAoaSsxKSk7CisKKyAgICAgICAgICAgIGRiVGVhcmRvd24oKTsKKyAgICAgICAgICAgIGRiU2V0VXAoKTsKKyAgICAgICAgfQorICAgICAgICBMb2cuaShUQUcsICJkdXJhdGlvbiBvZiB0ZXN0ICIgKyBUSU1FX1RPX1JVTl9XQUxfVEVTVF9GT1IgKyAiIHNlYyIpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE07IGkrKykgeworICAgICAgICAgICAgTG9nLmkoVEFHLCBidWZmW2ldLnRvU3RyaW5nKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGluWGFjdCA9IGZhbHNlOworICAgIHByaXZhdGUgaW50IG51bVhhY3RzOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUSU1FX1RPX1JVTl9XQUxfVEVTVF9GT1IgPSAxNTsgLy8gbnVtIHNlYyB0aGlzIHRlc3Qgc2hvdWRsIHJ1bgorICAgIHByaXZhdGUgaW50W11bXSBjb3VudHMgPSBuZXcgaW50WzJdWzJdOworCisgICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgYm9vbGVhbiBpblhhY3QoKSB7CisgICAgICAgIHJldHVybiBpblhhY3Q7CisgICAgfQorCisgICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBzZXRJblhhY3RGbGFnKGJvb2xlYW4gZmxhZykgeworICAgICAgICBpblhhY3QgPSBmbGFnOworICAgIH0KKworICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgc2V0Q291bnRzKGludCByZWFkZXJOdW0sIGludFtdIG51bVJlYWRzKSB7CisgICAgICAgIGNvdW50c1tyZWFkZXJOdW1dWzBdID0gbnVtUmVhZHNbMF07CisgICAgICAgIGNvdW50c1tyZWFkZXJOdW1dWzFdID0gbnVtUmVhZHNbMV07CisgICAgfQorCisgICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgaW50W11bXSBnZXRDb3VudHMoKSB7CisgICAgICAgIHJldHVybiBjb3VudHM7CisgICAgfQorCisgICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBzZXROdW1YYWN0cyhpbnQgbnVtKSB7CisgICAgICAgIG51bVhhY3RzID0gbnVtOworICAgIH0KKworICAgIHByaXZhdGUgc3luY2hyb25pemVkIGludCBnZXROdW1YYWN0cygpIHsKKyAgICAgICAgcmV0dXJuIG51bVhhY3RzOworICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgV3JpdGVyIGV4dGVuZHMgVGhyZWFkIHsKKyAgICAgICAgcHJpdmF0ZSBTUUxpdGVEYXRhYmFzZSBkYiA9IG51bGw7CisgICAgICAgIHB1YmxpYyBXcml0ZXIoU1FMaXRlRGF0YWJhc2UgZGIpIHsKKyAgICAgICAgICAgIHRoaXMuZGIgPSBkYjsKKyAgICAgICAgfQorICAgICAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgLy8gaW4gYSBsb29wLCBmb3IgTiBzZWMsIGRvIHRoZSBmb2xsb3dpbmcKKyAgICAgICAgICAgIC8vICAgIEJFR0lOIHRyYW5zYWN0aW9uCisgICAgICAgICAgICAvLyAgICBpbnNlcnQgaW50byB0YWJsZSB0MSwgdDIKKyAgICAgICAgICAgIC8vICAgIENvbW1pdAorICAgICAgICAgICAgbG9uZyBub3cgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgICAgIGludCBrOworICAgICAgICAgICAgZm9yIChrID0gMDsoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBub3cpIC8gMTAwMCA8IFRJTUVfVE9fUlVOX1dBTF9URVNUX0ZPUjsgaysrKSB7CisgICAgICAgICAgICAgICAgZGIuYmVnaW5UcmFuc2FjdGlvbk5vbkV4Y2x1c2l2ZSgpOworICAgICAgICAgICAgICAgIHNldEluWGFjdEZsYWcodHJ1ZSk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGRiLmV4ZWNTUUwoImluc2VydCBpbnRvIHQxIHZhbHVlcyg/LD8pOyIsIG5ldyBTdHJpbmdbXSB7aSsiIiwgaSsiIn0pOworICAgICAgICAgICAgICAgICAgICBkYi5leGVjU1FMKCJpbnNlcnQgaW50byB0MiB2YWx1ZXMoPyw/KTsiLCBuZXcgU3RyaW5nW10ge2krIiIsIGkrIiJ9KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZGIuc2V0VHJhbnNhY3Rpb25TdWNjZXNzZnVsKCk7CisgICAgICAgICAgICAgICAgc2V0SW5YYWN0RmxhZyhmYWxzZSk7CisgICAgICAgICAgICAgICAgZGIuZW5kVHJhbnNhY3Rpb24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldE51bVhhY3RzKGspOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBSZWFkZXIgZXh0ZW5kcyBUaHJlYWQgeworICAgICAgICBwcml2YXRlIFNRTGl0ZURhdGFiYXNlIGRiID0gbnVsbDsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgdGFibGUgPSBudWxsOworICAgICAgICBwcml2YXRlIFdyaXRlciB3ID0gbnVsbDsKKyAgICAgICAgcHJpdmF0ZSBpbnQgcmVhZGVyTnVtOworICAgICAgICBwcml2YXRlIGludFtdIG51bVJlYWRzID0gbmV3IGludFsyXTsKKyAgICAgICAgcHVibGljIFJlYWRlcihTUUxpdGVEYXRhYmFzZSBkYiwgU3RyaW5nIHRhYmxlLCBXcml0ZXIgdywgaW50IHJlYWRlck51bSkgeworICAgICAgICAgICAgdGhpcy5kYiA9IGRiOworICAgICAgICAgICAgdGhpcy50YWJsZSA9IHRhYmxlOworICAgICAgICAgICAgdGhpcy53ID0gdzsKKyAgICAgICAgICAgIHRoaXMucmVhZGVyTnVtID0gcmVhZGVyTnVtOworICAgICAgICB9CisgICAgICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAvLyB3aGlsZSB0aGUgd3JpdGUgaXMgYWxpdmUsIGluIGEgbG9vcCBkbyB0aGUgcXVlcnkgb24gYSB0YWJsZQorICAgICAgICAgICAgd2hpbGUgKHcuaXNBbGl2ZSgpKSB7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMubG9uZ0ZvclF1ZXJ5KGRiLCAic2VsZWN0IGNvdW50KCopIGZyb20gIiArIHRoaXMudGFibGUsIG51bGwpOworICAgICAgICAgICAgICAgICAgICAvLyB1cGRhdGUgY291bnQgb2YgcmVhZHMKKyAgICAgICAgICAgICAgICAgICAgbnVtUmVhZHNbaW5YYWN0KCkgPyAxIDogMF0gKz0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXRDb3VudHMocmVhZGVyTnVtLCBudW1SZWFkcyk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvQ29udGVudFZhbHVlc0J1aWxkZXIuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC9Db250ZW50VmFsdWVzQnVpbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiM2MwNzczLi4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC9Db250ZW50VmFsdWVzQnVpbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5waW0udmNhcmQ7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFZhbHVlczsKLQotLyoqCi0gKiBDb250ZW50VmFsdWVzLWxpa2UgY2xhc3Mgd2hpY2ggZW5hYmxlcyB1c2VycyB0byBjaGFpbiBwdXQoKSBtZXRob2RzIGFuZCByZXN0cmljdHMKLSAqIHRoZSBvdGhlciBtZXRob2RzLgotICovCi0vKiBwYWNrYWdlICovIGNsYXNzIENvbnRlbnRWYWx1ZXNCdWlsZGVyIHsKLSAgICBwcml2YXRlIGZpbmFsIENvbnRlbnRWYWx1ZXMgbUNvbnRlbnRWYWx1ZXM7Ci0KLSAgICBwdWJsaWMgQ29udGVudFZhbHVlc0J1aWxkZXIoZmluYWwgQ29udGVudFZhbHVlcyBjb250ZW50VmFsdWVzKSB7Ci0gICAgICAgIG1Db250ZW50VmFsdWVzID0gY29udGVudFZhbHVlczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ29udGVudFZhbHVlc0J1aWxkZXIgcHV0KFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSkgewotICAgICAgICBtQ29udGVudFZhbHVlcy5wdXQoa2V5LCB2YWx1ZSk7Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIHB1YmxpYyBDb250ZW50VmFsdWVzQnVpbGRlciBwdXQoU3RyaW5nIGtleSwgQnl0ZSB2YWx1ZSkgewotICAgICAgICBtQ29udGVudFZhbHVlcy5wdXQoa2V5LCB2YWx1ZSk7Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIHB1YmxpYyBDb250ZW50VmFsdWVzQnVpbGRlciBwdXQoU3RyaW5nIGtleSwgU2hvcnQgdmFsdWUpIHsKLSAgICAgICAgbUNvbnRlbnRWYWx1ZXMucHV0KGtleSwgdmFsdWUpOwotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ29udGVudFZhbHVlc0J1aWxkZXIgcHV0KFN0cmluZyBrZXksIEludGVnZXIgdmFsdWUpIHsKLSAgICAgICAgbUNvbnRlbnRWYWx1ZXMucHV0KGtleSwgdmFsdWUpOwotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ29udGVudFZhbHVlc0J1aWxkZXIgcHV0KFN0cmluZyBrZXksIExvbmcgdmFsdWUpIHsKLSAgICAgICAgbUNvbnRlbnRWYWx1ZXMucHV0KGtleSwgdmFsdWUpOwotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ29udGVudFZhbHVlc0J1aWxkZXIgcHV0KFN0cmluZyBrZXksIEZsb2F0IHZhbHVlKSB7Ci0gICAgICAgIG1Db250ZW50VmFsdWVzLnB1dChrZXksIHZhbHVlKTsKLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgcHVibGljIENvbnRlbnRWYWx1ZXNCdWlsZGVyIHB1dChTdHJpbmcga2V5LCBEb3VibGUgdmFsdWUpIHsKLSAgICAgICAgbUNvbnRlbnRWYWx1ZXMucHV0KGtleSwgdmFsdWUpOwotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ29udGVudFZhbHVlc0J1aWxkZXIgcHV0KFN0cmluZyBrZXksIEJvb2xlYW4gdmFsdWUpIHsKLSAgICAgICAgbUNvbnRlbnRWYWx1ZXMucHV0KGtleSwgdmFsdWUpOwotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ29udGVudFZhbHVlc0J1aWxkZXIgcHV0KFN0cmluZyBrZXksIGJ5dGVbXSB2YWx1ZSkgewotICAgICAgICBtQ29udGVudFZhbHVlcy5wdXQoa2V5LCB2YWx1ZSk7Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIHB1YmxpYyBDb250ZW50VmFsdWVzQnVpbGRlciBwdXROdWxsKFN0cmluZyBrZXkpIHsKLSAgICAgICAgbUNvbnRlbnRWYWx1ZXMucHV0TnVsbChrZXkpOwotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvQ29udGVudFZhbHVlc1ZlcmlmaWVyLmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvQ29udGVudFZhbHVlc1ZlcmlmaWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5ZTk4NzUuLjAwMDAwMDAKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL0NvbnRlbnRWYWx1ZXNWZXJpZmllci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLnBpbS52Y2FyZDsKLQotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLlZDYXJkQ29uZmlnOwotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLlZDYXJkRW50cnk7Ci1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuVkNhcmRFbnRyeUNvbnN0cnVjdG9yOwotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLlZDYXJkRW50cnlIYW5kbGVyOwotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLlZDYXJkUGFyc2VyOwotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLlZDYXJkUGFyc2VyX1YyMTsKLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5WQ2FyZFBhcnNlcl9WMzA7Ci1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuZXhjZXB0aW9uLlZDYXJkRXhjZXB0aW9uOwotaW1wb3J0IGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2U7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyogcGFja2FnZSAqLyBjbGFzcyBDb250ZW50VmFsdWVzVmVyaWZpZXIgaW1wbGVtZW50cyBWQ2FyZEVudHJ5SGFuZGxlciB7Ci0gICAgcHJpdmF0ZSBBbmRyb2lkVGVzdENhc2UgbVRlc3RDYXNlOwotICAgIHByaXZhdGUgTGlzdDxDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtPiBtQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbUxpc3QgPQotICAgICAgICBuZXcgQXJyYXlMaXN0PENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0+KCk7Ci0gICAgcHJpdmF0ZSBpbnQgbUluZGV4OwotCi0gICAgcHVibGljIENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0gYWRkRWxlbShBbmRyb2lkVGVzdENhc2UgYW5kcm9pZFRlc3RDYXNlKSB7Ci0gICAgICAgIG1UZXN0Q2FzZSA9IGFuZHJvaWRUZXN0Q2FzZTsKLSAgICAgICAgQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbSBpbXBvcnRWZXJpZmllciA9IG5ldyBDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtKGFuZHJvaWRUZXN0Q2FzZSk7Ci0gICAgICAgIG1Db250ZW50VmFsdWVzVmVyaWZpZXJFbGVtTGlzdC5hZGQoaW1wb3J0VmVyaWZpZXIpOwotICAgICAgICByZXR1cm4gaW1wb3J0VmVyaWZpZXI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdmVyaWZ5KGludCByZXNJZCwgaW50IHZDYXJkVHlwZSkgdGhyb3dzIElPRXhjZXB0aW9uLCBWQ2FyZEV4Y2VwdGlvbiB7Ci0gICAgICAgIHZlcmlmeShtVGVzdENhc2UuZ2V0Q29udGV4dCgpLmdldFJlc291cmNlcygpLm9wZW5SYXdSZXNvdXJjZShyZXNJZCksIHZDYXJkVHlwZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdmVyaWZ5KGludCByZXNJZCwgaW50IHZDYXJkVHlwZSwgZmluYWwgVkNhcmRQYXJzZXIgdkNhcmRQYXJzZXIpCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFZDYXJkRXhjZXB0aW9uIHsKLSAgICAgICAgdmVyaWZ5KG1UZXN0Q2FzZS5nZXRDb250ZXh0KCkuZ2V0UmVzb3VyY2VzKCkub3BlblJhd1Jlc291cmNlKHJlc0lkKSwKLSAgICAgICAgICAgICAgICB2Q2FyZFR5cGUsIHZDYXJkUGFyc2VyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB2ZXJpZnkoSW5wdXRTdHJlYW0gaXMsIGludCB2Q2FyZFR5cGUpIHRocm93cyBJT0V4Y2VwdGlvbiwgVkNhcmRFeGNlcHRpb24gewotICAgICAgICBmaW5hbCBWQ2FyZFBhcnNlciB2Q2FyZFBhcnNlcjsKLSAgICAgICAgaWYgKFZDYXJkQ29uZmlnLmlzVjMwKHZDYXJkVHlwZSkpIHsKLSAgICAgICAgICAgIHZDYXJkUGFyc2VyID0gbmV3IFZDYXJkUGFyc2VyX1YzMCh0cnVlKTsgIC8vIHVzZSBTdHJpY3RQYXJzaW5nCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB2Q2FyZFBhcnNlciA9IG5ldyBWQ2FyZFBhcnNlcl9WMjEoKTsKLSAgICAgICAgfQotICAgICAgICB2ZXJpZnkoaXMsIHZDYXJkVHlwZSwgdkNhcmRQYXJzZXIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHZlcmlmeShJbnB1dFN0cmVhbSBpcywgaW50IHZDYXJkVHlwZSwgZmluYWwgVkNhcmRQYXJzZXIgdkNhcmRQYXJzZXIpCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFZDYXJkRXhjZXB0aW9uIHsKLSAgICAgICAgVkNhcmRFbnRyeUNvbnN0cnVjdG9yIGJ1aWxkZXIgPQotICAgICAgICAgICAgbmV3IFZDYXJkRW50cnlDb25zdHJ1Y3RvcihudWxsLCBudWxsLCBmYWxzZSwgdkNhcmRUeXBlLCBudWxsKTsKLSAgICAgICAgYnVpbGRlci5hZGRFbnRyeUhhbmRsZXIodGhpcyk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB2Q2FyZFBhcnNlci5wYXJzZShpcywgYnVpbGRlcik7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAoaXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGlzLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG9uU3RhcnQoKSB7Ci0gICAgICAgIGZvciAoQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbSBlbGVtIDogbUNvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW1MaXN0KSB7Ci0gICAgICAgICAgICBlbGVtLm9uUGFyc2luZ1N0YXJ0KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBvbkVudHJ5Q3JlYXRlZChWQ2FyZEVudHJ5IGVudHJ5KSB7Ci0gICAgICAgIG1UZXN0Q2FzZS5hc3NlcnRUcnVlKG1JbmRleCA8IG1Db250ZW50VmFsdWVzVmVyaWZpZXJFbGVtTGlzdC5zaXplKCkpOwotICAgICAgICBtQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbUxpc3QuZ2V0KG1JbmRleCkub25FbnRyeUNyZWF0ZWQoZW50cnkpOwotICAgICAgICBtSW5kZXgrKzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBvbkVuZCgpIHsKLSAgICAgICAgZm9yIChDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtIGVsZW0gOiBtQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbUxpc3QpIHsKLSAgICAgICAgICAgIGVsZW0ub25QYXJzaW5nRW5kKCk7Ci0gICAgICAgICAgICBlbGVtLnZlcmlmeVJlc29sdmVyKCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbS5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL0NvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmVkYmIzNi4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGFuZHJvaWQucGltLnZjYXJkOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXM7Ci1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuVkNhcmRDb25maWc7Ci1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuVkNhcmRFbnRyeTsKLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5WQ2FyZEVudHJ5Q29tbWl0dGVyOwotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLlZDYXJkRW50cnlDb25zdHJ1Y3RvcjsKLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5WQ2FyZEVudHJ5SGFuZGxlcjsKLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5WQ2FyZFBhcnNlcjsKLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5WQ2FyZFBhcnNlcl9WMjE7Ci1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuVkNhcmRQYXJzZXJfVjMwOwotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLmV4Y2VwdGlvbi5WQ2FyZEV4Y2VwdGlvbjsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuRGF0YTsKLWltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotCi0vKiBwYWNrYWdlICovIGNsYXNzIENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0gewotICAgIHByaXZhdGUgZmluYWwgQW5kcm9pZFRlc3RDYXNlIG1UZXN0Q2FzZTsKLSAgICBwcml2YXRlIGZpbmFsIEltcG9ydFRlc3RSZXNvbHZlciBtUmVzb2x2ZXI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBWQ2FyZEVudHJ5SGFuZGxlciBtSGFuZGxlcjsKLQotICAgIHB1YmxpYyBDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtKEFuZHJvaWRUZXN0Q2FzZSBhbmRyb2lkVGVzdENhc2UpIHsKLSAgICAgICAgbVRlc3RDYXNlID0gYW5kcm9pZFRlc3RDYXNlOwotICAgICAgICBtUmVzb2x2ZXIgPSBuZXcgSW1wb3J0VGVzdFJlc29sdmVyKGFuZHJvaWRUZXN0Q2FzZSk7Ci0gICAgICAgIG1IYW5kbGVyID0gbmV3IFZDYXJkRW50cnlDb21taXR0ZXIobVJlc29sdmVyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ29udGVudFZhbHVlc0J1aWxkZXIgYWRkRXhwZWN0ZWQoU3RyaW5nIG1pbWVUeXBlKSB7Ci0gICAgICAgIENvbnRlbnRWYWx1ZXMgY29udGVudFZhbHVlcyA9IG5ldyBDb250ZW50VmFsdWVzKCk7Ci0gICAgICAgIGNvbnRlbnRWYWx1ZXMucHV0KERhdGEuTUlNRVRZUEUsIG1pbWVUeXBlKTsKLSAgICAgICAgbVJlc29sdmVyLmFkZEV4cGVjdGVkQ29udGVudFZhbHVlcyhjb250ZW50VmFsdWVzKTsKLSAgICAgICAgcmV0dXJuIG5ldyBDb250ZW50VmFsdWVzQnVpbGRlcihjb250ZW50VmFsdWVzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB2ZXJpZnkoaW50IHJlc0lkLCBpbnQgdkNhcmRUeXBlKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBWQ2FyZEV4Y2VwdGlvbiB7Ci0gICAgICAgIHZlcmlmeShtVGVzdENhc2UuZ2V0Q29udGV4dCgpLmdldFJlc291cmNlcygpLm9wZW5SYXdSZXNvdXJjZShyZXNJZCksIHZDYXJkVHlwZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdmVyaWZ5KElucHV0U3RyZWFtIGlzLCBpbnQgdkNhcmRUeXBlKSB0aHJvd3MgSU9FeGNlcHRpb24sIFZDYXJkRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgVkNhcmRQYXJzZXIgdkNhcmRQYXJzZXI7Ci0gICAgICAgIGlmIChWQ2FyZENvbmZpZy5pc1YzMCh2Q2FyZFR5cGUpKSB7Ci0gICAgICAgICAgICB2Q2FyZFBhcnNlciA9IG5ldyBWQ2FyZFBhcnNlcl9WMzAodHJ1ZSk7ICAvLyB1c2UgU3RyaWN0UGFyc2luZwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdkNhcmRQYXJzZXIgPSBuZXcgVkNhcmRQYXJzZXJfVjIxKCk7Ci0gICAgICAgIH0KLSAgICAgICAgVkNhcmRFbnRyeUNvbnN0cnVjdG9yIGJ1aWxkZXIgPQotICAgICAgICAgICAgICAgIG5ldyBWQ2FyZEVudHJ5Q29uc3RydWN0b3IobnVsbCwgbnVsbCwgZmFsc2UsIHZDYXJkVHlwZSwgbnVsbCk7Ci0gICAgICAgIGJ1aWxkZXIuYWRkRW50cnlIYW5kbGVyKG1IYW5kbGVyKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHZDYXJkUGFyc2VyLnBhcnNlKGlzLCBidWlsZGVyKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChpcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgaXMuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHZlcmlmeVJlc29sdmVyKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdmVyaWZ5UmVzb2x2ZXIoKSB7Ci0gICAgICAgIG1SZXNvbHZlci52ZXJpZnkoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBvblBhcnNpbmdTdGFydCgpIHsKLSAgICAgICAgbUhhbmRsZXIub25TdGFydCgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG9uRW50cnlDcmVhdGVkKFZDYXJkRW50cnkgZW50cnkpIHsKLSAgICAgICAgbUhhbmRsZXIub25FbnRyeUNyZWF0ZWQoZW50cnkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG9uUGFyc2luZ0VuZCgpIHsKLSAgICAgICAgbUhhbmRsZXIub25FbmQoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvRXhwb3J0VGVzdFJlc29sdmVyLmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvRXhwb3J0VGVzdFJlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5NjhlODMuLjAwMDAwMDAKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL0V4cG9ydFRlc3RSZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAotICogdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSAqIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAotICogV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlCi0gKiBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgotICogdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC5waW0udmNhcmQ7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50VmFsdWVzOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5FbnRpdHk7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkVudGl0eUl0ZXJhdG9yOwotaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yOwotaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29udGFjdHM7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkRhdGE7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LlJhd0NvbnRhY3RzOwotaW1wb3J0IGFuZHJvaWQudGVzdC5tb2NrLk1vY2tDb250ZW50UmVzb2x2ZXI7Ci1pbXBvcnQgYW5kcm9pZC50ZXN0Lm1vY2suTW9ja0N1cnNvcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKiBwYWNrYWdlICovIHB1YmxpYyBjbGFzcyBFeHBvcnRUZXN0UmVzb2x2ZXIgZXh0ZW5kcyBNb2NrQ29udGVudFJlc29sdmVyIHsKLSAgICBFeHBvcnRUZXN0UHJvdmlkZXIgbVByb3ZpZGVyOwotICAgIHB1YmxpYyBFeHBvcnRUZXN0UmVzb2x2ZXIoVGVzdENhc2UgdGVzdENhc2UpIHsKLSAgICAgICAgbVByb3ZpZGVyID0gbmV3IEV4cG9ydFRlc3RQcm92aWRlcih0ZXN0Q2FzZSk7Ci0gICAgICAgIGFkZFByb3ZpZGVyKFZDYXJkQ29tcG9zZXIuVkNBUkRfVEVTVF9BVVRIT1JJVFksIG1Qcm92aWRlcik7Ci0gICAgICAgIGFkZFByb3ZpZGVyKFJhd0NvbnRhY3RzLkNPTlRFTlRfVVJJLmdldEF1dGhvcml0eSgpLCBtUHJvdmlkZXIpOwotICAgIH0KLQotICAgIHB1YmxpYyBDb250YWN0RW50cnkgYWRkSW5wdXRDb250YWN0RW50cnkoKSB7Ci0gICAgICAgIHJldHVybiBtUHJvdmlkZXIuYnVpbGRJbnB1dEVudHJ5KCk7Ci0gICAgfQotfQotCi0vKiBwYWNrYWdlICovIGNsYXNzIE1vY2tFbnRpdHlJdGVyYXRvciBpbXBsZW1lbnRzIEVudGl0eUl0ZXJhdG9yIHsKLSAgICBMaXN0PEVudGl0eT4gbUVudGl0eUxpc3Q7Ci0gICAgSXRlcmF0b3I8RW50aXR5PiBtSXRlcmF0b3I7Ci0KLSAgICBwdWJsaWMgTW9ja0VudGl0eUl0ZXJhdG9yKExpc3Q8Q29udGVudFZhbHVlcz4gY29udGVudFZhbHVlc0xpc3QpIHsKLSAgICAgICAgbUVudGl0eUxpc3QgPSBuZXcgQXJyYXlMaXN0PEVudGl0eT4oKTsKLSAgICAgICAgRW50aXR5IGVudGl0eSA9IG5ldyBFbnRpdHkobmV3IENvbnRlbnRWYWx1ZXMoKSk7Ci0gICAgICAgIGZvciAoQ29udGVudFZhbHVlcyBjb250ZW50VmFsdWVzIDogY29udGVudFZhbHVlc0xpc3QpIHsKLSAgICAgICAgICAgICAgICBlbnRpdHkuYWRkU3ViVmFsdWUoRGF0YS5DT05URU5UX1VSSSwgY29udGVudFZhbHVlcyk7Ci0gICAgICAgIH0KLSAgICAgICAgbUVudGl0eUxpc3QuYWRkKGVudGl0eSk7Ci0gICAgICAgIG1JdGVyYXRvciA9IG1FbnRpdHlMaXN0Lml0ZXJhdG9yKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLSAgICAgICAgcmV0dXJuIG1JdGVyYXRvci5oYXNOZXh0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIEVudGl0eSBuZXh0KCkgewotICAgICAgICByZXR1cm4gbUl0ZXJhdG9yLm5leHQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigicmVtb3ZlIG5vdCBzdXBwb3J0ZWQiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZXNldCgpIHsKLSAgICAgICAgbUl0ZXJhdG9yID0gbUVudGl0eUxpc3QuaXRlcmF0b3IoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKLSAgICB9Ci19Ci0KLS8qKgotICogUmVwcmVzZW50cyBvbmUgY29udGFjdCwgd2hpY2ggc2hvdWxkIGNvbnRhaW4gbXVsdGlwbGUgQ29udGVudFZhbHVlcyBsaWtlCi0gKiBTdHJ1Y3R1cmVkTmFtZSwgRW1haWwsIGV0Yy4KLSAqLwotLyogcGFja2FnZSAqLyBjbGFzcyBDb250YWN0RW50cnkgewotICAgIHByaXZhdGUgZmluYWwgTGlzdDxDb250ZW50VmFsdWVzPiBtQ29udGVudFZhbHVlc0xpc3QgPSBuZXcgQXJyYXlMaXN0PENvbnRlbnRWYWx1ZXM+KCk7Ci0KLSAgICBwdWJsaWMgQ29udGVudFZhbHVlc0J1aWxkZXIgYWRkQ29udGVudFZhbHVlcyhTdHJpbmcgbWltZVR5cGUpIHsKLSAgICAgICAgQ29udGVudFZhbHVlcyBjb250ZW50VmFsdWVzID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKLSAgICAgICAgY29udGVudFZhbHVlcy5wdXQoRGF0YS5NSU1FVFlQRSwgbWltZVR5cGUpOwotICAgICAgICBtQ29udGVudFZhbHVlc0xpc3QuYWRkKGNvbnRlbnRWYWx1ZXMpOwotICAgICAgICByZXR1cm4gbmV3IENvbnRlbnRWYWx1ZXNCdWlsZGVyKGNvbnRlbnRWYWx1ZXMpOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PENvbnRlbnRWYWx1ZXM+IGdldExpc3QoKSB7Ci0gICAgICAgIHJldHVybiBtQ29udGVudFZhbHVlc0xpc3Q7Ci0gICAgfQotfQotCi0vKiBwYWNrYWdlICovIGNsYXNzIEV4cG9ydFRlc3RQcm92aWRlciBleHRlbmRzIE1vY2tDb250ZW50UHJvdmlkZXIgewotICAgIGZpbmFsIHByaXZhdGUgVGVzdENhc2UgbVRlc3RDYXNlOwotICAgIGZpbmFsIHByaXZhdGUgQXJyYXlMaXN0PENvbnRhY3RFbnRyeT4gbUNvbnRhY3RFbnRyeUxpc3QgPSBuZXcgQXJyYXlMaXN0PENvbnRhY3RFbnRyeT4oKTsKLQotICAgIHB1YmxpYyBFeHBvcnRUZXN0UHJvdmlkZXIoVGVzdENhc2UgdGVzdENhc2UpIHsKLSAgICAgICAgbVRlc3RDYXNlID0gdGVzdENhc2U7Ci0gICAgfQotCi0gICAgcHVibGljIENvbnRhY3RFbnRyeSBidWlsZElucHV0RW50cnkoKSB7Ci0gICAgICAgIENvbnRhY3RFbnRyeSBjb250YWN0RW50cnkgPSBuZXcgQ29udGFjdEVudHJ5KCk7Ci0gICAgICAgIG1Db250YWN0RW50cnlMaXN0LmFkZChjb250YWN0RW50cnkpOwotICAgICAgICByZXR1cm4gY29udGFjdEVudHJ5OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIEFuIG9sZCBtZXRob2Qgd2hpY2ggaGFkIGV4aXN0ZWQgYnV0IHdhcyByZW1vdmVkIGZyb20gQ29udGVudFJlc29sdmVyLgotICAgICAqIDwvcD4KLSAgICAgKiA8cD4KLSAgICAgKiBXZSBzdGlsbCBrZWVwIHVzaW5nIHRoaXMgbWV0aG9kIHNpbmNlIHdlIGRvbid0IGhhdmUgYSBwcm9wZWVyIHdheSB0byBrbm93Ci0gICAgICogd2hpY2ggdmFsdWUgaW4gdGhlIENvbnRlbnRWYWx1ZSBjb3JyZXNwb25kcyB0byB0aGUgZW50cnkgaW4gQ29udGFjdHMgZGF0YWJhc2UuCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIERldGFpbDoKLSAgICAgKiBUaGVyZSdzIGFuIGVhc3kgd2F5IHRvIGtub3cgd2hpY2ggaW5kZXggImZhbWlseSBuYW1lIiBjb3JyZXNwb25kcyB0bywgdmlhCi0gICAgICoge0BsaW5rIGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdH0uCi0gICAgICogRkFNSUxZX05BTUUgZXF1YWxzIERBVEEzLCBzbyB0aGUgY29ycmVzcG9uZGluZyBpbmRleAotICAgICAqIGZvciAiZmFtaWx5IG5hbWUiIHNob3VsZCBiZSAyIChub3RlIHRoYXQgaW5kZXggaXMgMC1vcmlnaW4pLgotICAgICAqIEhvd2V2ZXIsIHdlIGNhbm5vdCBrbm93IHdoYXQgdGhlIGluZGV4IDIgY29ycmVzcG9uZHMgdG87IGl0IG1heSBiZSAiZmFtaWx5IG5hbWUiLAotICAgICAqICJsYWJlbCIgZm9yIG5vdywgYnV0IG1heSBiZSB0aGUgb3RoZXIgc29tZSBjb2x1bW4gaW4gdGhlIGZ1dHVyZS4gV2UgZG9uJ3QgaGF2ZQotICAgICAqIGNvbnZlbmllbnQgd2F5IHRvIGtub3cgdGhlIG9yaWdpbmFsIGRhdGEgc3RydWN0dXJlLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgRW50aXR5SXRlcmF0b3IgcXVlcnlFbnRpdGllcyhVcmkgdXJpLAotICAgICAgICAgICAgU3RyaW5nIHNlbGVjdGlvbiwgU3RyaW5nW10gc2VsZWN0aW9uQXJncywgU3RyaW5nIHNvcnRPcmRlcikgewotICAgICAgICBtVGVzdENhc2UuYXNzZXJ0VHJ1ZSh1cmkgIT0gbnVsbCk7Ci0gICAgICAgIG1UZXN0Q2FzZS5hc3NlcnRUcnVlKENvbnRlbnRSZXNvbHZlci5TQ0hFTUVfQ09OVEVOVC5lcXVhbHModXJpLmdldFNjaGVtZSgpKSk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBhdXRob3JpdHkgPSB1cmkuZ2V0QXV0aG9yaXR5KCk7Ci0gICAgICAgIG1UZXN0Q2FzZS5hc3NlcnRUcnVlKFJhd0NvbnRhY3RzLkNPTlRFTlRfVVJJLmdldEF1dGhvcml0eSgpLmVxdWFscyhhdXRob3JpdHkpKTsKLSAgICAgICAgbVRlc3RDYXNlLmFzc2VydFRydWUoKERhdGEuQ09OVEFDVF9JRCArICI9PyIpLmVxdWFscyhzZWxlY3Rpb24pKTsKLSAgICAgICAgbVRlc3RDYXNlLmFzc2VydEVxdWFscygxLCBzZWxlY3Rpb25BcmdzLmxlbmd0aCk7Ci0gICAgICAgIGZpbmFsIGludCBpZCA9IEludGVnZXIucGFyc2VJbnQoc2VsZWN0aW9uQXJnc1swXSk7Ci0gICAgICAgIG1UZXN0Q2FzZS5hc3NlcnRUcnVlKGlkID49IDAgJiYgaWQgPCBtQ29udGFjdEVudHJ5TGlzdC5zaXplKCkpOwotCi0gICAgICAgIHJldHVybiBuZXcgTW9ja0VudGl0eUl0ZXJhdG9yKG1Db250YWN0RW50cnlMaXN0LmdldChpZCkuZ2V0TGlzdCgpKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQ3Vyc29yIHF1ZXJ5KFVyaSB1cmksU3RyaW5nW10gcHJvamVjdGlvbiwKLSAgICAgICAgICAgIFN0cmluZyBzZWxlY3Rpb24sIFN0cmluZ1tdIHNlbGVjdGlvbkFyZ3MsIFN0cmluZyBzb3J0T3JkZXIpIHsKLSAgICAgICAgbVRlc3RDYXNlLmFzc2VydFRydWUoVkNhcmRDb21wb3Nlci5DT05UQUNUU19URVNUX0NPTlRFTlRfVVJJLmVxdWFscyh1cmkpKTsKLSAgICAgICAgLy8gSW4gdGhpcyB0ZXN0LCBmb2xsb3dpbmcgYXJndW1lbnRzIGFyZSBub3Qgc3VwcG9ydGVkLgotICAgICAgICBtVGVzdENhc2UuYXNzZXJ0TnVsbChzZWxlY3Rpb24pOwotICAgICAgICBtVGVzdENhc2UuYXNzZXJ0TnVsbChzZWxlY3Rpb25BcmdzKTsKLSAgICAgICAgbVRlc3RDYXNlLmFzc2VydE51bGwoc29ydE9yZGVyKTsKLQotICAgICAgICByZXR1cm4gbmV3IE1vY2tDdXJzb3IoKSB7Ci0gICAgICAgICAgICBpbnQgbUN1cnJlbnRQb3NpdGlvbiA9IC0xOwotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBpbnQgZ2V0Q291bnQoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1Db250YWN0RW50cnlMaXN0LnNpemUoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBtb3ZlVG9GaXJzdCgpIHsKLSAgICAgICAgICAgICAgICBtQ3VycmVudFBvc2l0aW9uID0gMDsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBtb3ZlVG9OZXh0KCkgewotICAgICAgICAgICAgICAgIGlmIChtQ3VycmVudFBvc2l0aW9uIDwgbUNvbnRhY3RFbnRyeUxpc3Quc2l6ZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1DdXJyZW50UG9zaXRpb24rKzsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0JlZm9yZUZpcnN0KCkgewotICAgICAgICAgICAgICAgIHJldHVybiBtQ3VycmVudFBvc2l0aW9uIDwgMDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0FmdGVyTGFzdCgpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbUN1cnJlbnRQb3NpdGlvbiA+PSBtQ29udGFjdEVudHJ5TGlzdC5zaXplKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIGludCBnZXRDb2x1bW5JbmRleChTdHJpbmcgY29sdW1uTmFtZSkgewotICAgICAgICAgICAgICAgIG1UZXN0Q2FzZS5hc3NlcnRFcXVhbHMoQ29udGFjdHMuX0lELCBjb2x1bW5OYW1lKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgaW50IGdldEludChpbnQgY29sdW1uSW5kZXgpIHsKLSAgICAgICAgICAgICAgICBtVGVzdENhc2UuYXNzZXJ0RXF1YWxzKDAsIGNvbHVtbkluZGV4KTsKLSAgICAgICAgICAgICAgICBtVGVzdENhc2UuYXNzZXJ0VHJ1ZShtQ3VycmVudFBvc2l0aW9uID49IDAKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIG1DdXJyZW50UG9zaXRpb24gPCBtQ29udGFjdEVudHJ5TGlzdC5zaXplKCkpOwotICAgICAgICAgICAgICAgIHJldHVybiBtQ3VycmVudFBvc2l0aW9uOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKGludCBjb2x1bW5JbmRleCkgewotICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcudmFsdWVPZihnZXRJbnQoY29sdW1uSW5kZXgpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvSW1wb3J0VGVzdFJlc29sdmVyLmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvSW1wb3J0VGVzdFJlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzZjZmNzkuLjAwMDAwMDAKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL0ltcG9ydFRlc3RSZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLnBpbS52Y2FyZDsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UHJvdmlkZXJPcGVyYXRpb247Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRQcm92aWRlclJlc3VsdDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFZhbHVlczsKLWltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkRhdGE7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LlJhd0NvbnRhY3RzOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuRW1haWw7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5FdmVudDsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLkdyb3VwTWVtYmVyc2hpcDsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLkltOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuTmlja25hbWU7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5Ob3RlOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuT3JnYW5pemF0aW9uOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuUGhvbmU7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5QaG90bzsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLlJlbGF0aW9uOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuU3RydWN0dXJlZE5hbWU7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5TdHJ1Y3R1cmVkUG9zdGFsOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuV2Vic2l0ZTsKLWltcG9ydCBhbmRyb2lkLnRlc3QubW9jay5Nb2NrQ29udGVudFJlc29sdmVyOwotaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5Tb3J0ZWRNYXA7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTsKLQotLyogcGFja2FnZSAqLyBjbGFzcyBJbXBvcnRUZXN0UmVzb2x2ZXIgZXh0ZW5kcyBNb2NrQ29udGVudFJlc29sdmVyIHsKLSAgICBmaW5hbCBJbXBvcnRUZXN0UHJvdmlkZXIgbVByb3ZpZGVyOwotCi0gICAgcHVibGljIEltcG9ydFRlc3RSZXNvbHZlcihUZXN0Q2FzZSB0ZXN0Q2FzZSkgewotICAgICAgICBtUHJvdmlkZXIgPSBuZXcgSW1wb3J0VGVzdFByb3ZpZGVyKHRlc3RDYXNlKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQ29udGVudFByb3ZpZGVyUmVzdWx0W10gYXBwbHlCYXRjaChTdHJpbmcgYXV0aG9yaXR5LAotICAgICAgICAgICAgQXJyYXlMaXN0PENvbnRlbnRQcm92aWRlck9wZXJhdGlvbj4gb3BlcmF0aW9ucykgewotICAgICAgICBlcXVhbHNTdHJpbmcoYXV0aG9yaXR5LCBSYXdDb250YWN0cy5DT05URU5UX1VSSS50b1N0cmluZygpKTsKLSAgICAgICAgcmV0dXJuIG1Qcm92aWRlci5hcHBseUJhdGNoKG9wZXJhdGlvbnMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZEV4cGVjdGVkQ29udGVudFZhbHVlcyhDb250ZW50VmFsdWVzIGV4cGVjdGVkQ29udGVudFZhbHVlcykgewotICAgICAgICBtUHJvdmlkZXIuYWRkRXhwZWN0ZWRDb250ZW50VmFsdWVzKGV4cGVjdGVkQ29udGVudFZhbHVlcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdmVyaWZ5KCkgewotICAgICAgICBtUHJvdmlkZXIudmVyaWZ5KCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBlcXVhbHNTdHJpbmcoU3RyaW5nIGEsIFN0cmluZyBiKSB7Ci0gICAgICAgIGlmIChhID09IG51bGwgfHwgYS5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gYiA9PSBudWxsIHx8IGIubGVuZ3RoKCkgPT0gMDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBhLmVxdWFscyhiKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotLyogcGFja2FnZSAqLyBjbGFzcyBJbXBvcnRUZXN0UHJvdmlkZXIgZXh0ZW5kcyBNb2NrQ29udGVudFByb3ZpZGVyIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTZXQ8U3RyaW5nPiBzS25vd25NaW1lVHlwZVNldCA9Ci0gICAgICAgIG5ldyBIYXNoU2V0PFN0cmluZz4oQXJyYXlzLmFzTGlzdChTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSwKLSAgICAgICAgICAgICAgICBOaWNrbmFtZS5DT05URU5UX0lURU1fVFlQRSwgUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUsCi0gICAgICAgICAgICAgICAgRW1haWwuQ09OVEVOVF9JVEVNX1RZUEUsIFN0cnVjdHVyZWRQb3N0YWwuQ09OVEVOVF9JVEVNX1RZUEUsCi0gICAgICAgICAgICAgICAgSW0uQ09OVEVOVF9JVEVNX1RZUEUsIE9yZ2FuaXphdGlvbi5DT05URU5UX0lURU1fVFlQRSwKLSAgICAgICAgICAgICAgICBFdmVudC5DT05URU5UX0lURU1fVFlQRSwgUGhvdG8uQ09OVEVOVF9JVEVNX1RZUEUsCi0gICAgICAgICAgICAgICAgTm90ZS5DT05URU5UX0lURU1fVFlQRSwgV2Vic2l0ZS5DT05URU5UX0lURU1fVFlQRSwKLSAgICAgICAgICAgICAgICBSZWxhdGlvbi5DT05URU5UX0lURU1fVFlQRSwgRXZlbnQuQ09OVEVOVF9JVEVNX1RZUEUsCi0gICAgICAgICAgICAgICAgR3JvdXBNZW1iZXJzaGlwLkNPTlRFTlRfSVRFTV9UWVBFKSk7Ci0KLSAgICBmaW5hbCBNYXA8U3RyaW5nLCBDb2xsZWN0aW9uPENvbnRlbnRWYWx1ZXM+PiBtTWltZVR5cGVUb0V4cGVjdGVkQ29udGVudFZhbHVlczsKLQotICAgIHByaXZhdGUgZmluYWwgVGVzdENhc2UgbVRlc3RDYXNlOwotCi0gICAgcHVibGljIEltcG9ydFRlc3RQcm92aWRlcihUZXN0Q2FzZSB0ZXN0Q2FzZSkgewotICAgICAgICBtVGVzdENhc2UgPSB0ZXN0Q2FzZTsKLSAgICAgICAgbU1pbWVUeXBlVG9FeHBlY3RlZENvbnRlbnRWYWx1ZXMgPQotICAgICAgICAgICAgbmV3IEhhc2hNYXA8U3RyaW5nLCBDb2xsZWN0aW9uPENvbnRlbnRWYWx1ZXM+PigpOwotICAgICAgICBmb3IgKFN0cmluZyBhY2NlcHRhbmJsZU1pbWVUeXBlIDogc0tub3duTWltZVR5cGVTZXQpIHsKLSAgICAgICAgICAgIC8vIERvIG5vdCB1c2UgSGFzaFNldCBzaW5jZSB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBjaGFuZ2VzIHRoZSBjb250ZW50IG9mCi0gICAgICAgICAgICAvLyBDb250ZW50VmFsdWVzIGFmdGVyIHRoZSBpbnNlcnRpb24sIHdoaWNoIG1ha2UgdGhlIHJlc3VsdCBvZiBoYXNoQ29kZSgpCi0gICAgICAgICAgICAvLyBjaGFuZ2VzLi4uCi0gICAgICAgICAgICBtTWltZVR5cGVUb0V4cGVjdGVkQ29udGVudFZhbHVlcy5wdXQoCi0gICAgICAgICAgICAgICAgICAgIGFjY2VwdGFuYmxlTWltZVR5cGUsIG5ldyBBcnJheUxpc3Q8Q29udGVudFZhbHVlcz4oKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRFeHBlY3RlZENvbnRlbnRWYWx1ZXMoQ29udGVudFZhbHVlcyBleHBlY3RlZENvbnRlbnRWYWx1ZXMpIHsKLSAgICAgICAgZmluYWwgU3RyaW5nIG1pbWVUeXBlID0gZXhwZWN0ZWRDb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKERhdGEuTUlNRVRZUEUpOwotICAgICAgICBpZiAoIXNLbm93bk1pbWVUeXBlU2V0LmNvbnRhaW5zKG1pbWVUeXBlKSkgewotICAgICAgICAgICAgbVRlc3RDYXNlLmZhaWwoU3RyaW5nLmZvcm1hdCgKLSAgICAgICAgICAgICAgICAgICAgIlVua25vdyBNaW1lVHlwZSAlcyBpbiB0aGUgdGVzdCBjb2RlLiBUZXN0IGNvZGUgc2hvdWxkIGJlIGJyb2tlbi4iLAotICAgICAgICAgICAgICAgICAgICBtaW1lVHlwZSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgQ29sbGVjdGlvbjxDb250ZW50VmFsdWVzPiBjb250ZW50VmFsdWVzQ29sbGVjdGlvbiA9Ci0gICAgICAgICAgICAgICAgbU1pbWVUeXBlVG9FeHBlY3RlZENvbnRlbnRWYWx1ZXMuZ2V0KG1pbWVUeXBlKTsKLSAgICAgICAgY29udGVudFZhbHVlc0NvbGxlY3Rpb24uYWRkKGV4cGVjdGVkQ29udGVudFZhbHVlcyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIENvbnRlbnRQcm92aWRlclJlc3VsdFtdIGFwcGx5QmF0Y2goCi0gICAgICAgICAgICBBcnJheUxpc3Q8Q29udGVudFByb3ZpZGVyT3BlcmF0aW9uPiBvcGVyYXRpb25zKSB7Ci0gICAgICAgIGlmIChvcGVyYXRpb25zID09IG51bGwpIHsKLSAgICAgICAgICAgIG1UZXN0Q2FzZS5mYWlsKCJUaGVyZSBpcyBubyBvcGVyYXRpb24uIik7Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBpbnQgc2l6ZSA9IG9wZXJhdGlvbnMuc2l6ZSgpOwotICAgICAgICBDb250ZW50UHJvdmlkZXJSZXN1bHRbXSBmYWtlUmVzdWx0QXJyYXkgPSBuZXcgQ29udGVudFByb3ZpZGVyUmVzdWx0W3NpemVdOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgICAgICAgVXJpIHVyaSA9IFVyaS53aXRoQXBwZW5kZWRQYXRoKFJhd0NvbnRhY3RzLkNPTlRFTlRfVVJJLCBTdHJpbmcudmFsdWVPZihpKSk7Ci0gICAgICAgICAgICBmYWtlUmVzdWx0QXJyYXlbaV0gPSBuZXcgQ29udGVudFByb3ZpZGVyUmVzdWx0KHVyaSk7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgICAgICAgQ29udGVudFByb3ZpZGVyT3BlcmF0aW9uIG9wZXJhdGlvbiA9IG9wZXJhdGlvbnMuZ2V0KGkpOwotICAgICAgICAgICAgQ29udGVudFZhbHVlcyBjb250ZW50VmFsdWVzID0gb3BlcmF0aW9uLnJlc29sdmVWYWx1ZUJhY2tSZWZlcmVuY2VzKAotICAgICAgICAgICAgICAgICAgICBmYWtlUmVzdWx0QXJyYXksIGkpOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICBDb250ZW50UHJvdmlkZXJPcGVyYXRpb24gb3BlcmF0aW9uID0gb3BlcmF0aW9ucy5nZXQoaSk7Ci0gICAgICAgICAgICBDb250ZW50VmFsdWVzIGFjdHVhbENvbnRlbnRWYWx1ZXMgPSBvcGVyYXRpb24ucmVzb2x2ZVZhbHVlQmFja1JlZmVyZW5jZXMoCi0gICAgICAgICAgICAgICAgICAgIGZha2VSZXN1bHRBcnJheSwgaSk7Ci0gICAgICAgICAgICBmaW5hbCBVcmkgdXJpID0gb3BlcmF0aW9uLmdldFVyaSgpOwotICAgICAgICAgICAgaWYgKHVyaS5lcXVhbHMoUmF3Q29udGFjdHMuQ09OVEVOVF9VUkkpKSB7Ci0gICAgICAgICAgICAgICAgbVRlc3RDYXNlLmFzc2VydE51bGwoYWN0dWFsQ29udGVudFZhbHVlcy5nZXQoUmF3Q29udGFjdHMuQUNDT1VOVF9OQU1FKSk7Ci0gICAgICAgICAgICAgICAgbVRlc3RDYXNlLmFzc2VydE51bGwoYWN0dWFsQ29udGVudFZhbHVlcy5nZXQoUmF3Q29udGFjdHMuQUNDT1VOVF9UWVBFKSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHVyaS5lcXVhbHMoRGF0YS5DT05URU5UX1VSSSkpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbWltZVR5cGUgPSBhY3R1YWxDb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKERhdGEuTUlNRVRZUEUpOwotICAgICAgICAgICAgICAgIGlmICghc0tub3duTWltZVR5cGVTZXQuY29udGFpbnMobWltZVR5cGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1UZXN0Q2FzZS5mYWlsKFN0cmluZy5mb3JtYXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVua25vd24gTWltZVR5cGUgJXMuIFByb2JhYmx5IGFkZGVkIGFmdGVyIGRldmVsb3BpbmcgdGhpcyB0ZXN0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW1lVHlwZSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBSZW1vdmUgZGF0YSBtZWFuaW5nbGVzcyBpbiB0aGlzIHVuaXQgdGVzdHMuCi0gICAgICAgICAgICAgICAgLy8gU3BlY2lmaWNhbGx5LCBEYXRhLkRBVEExIC0gREFUQTcgYXJlIHNldCB0byBudWxsIG9yIGVtcHR5IFN0cmluZwotICAgICAgICAgICAgICAgIC8vIHJlZ2FyZGxlc3Mgb2YgdGhlIGlucHV0LCBidXQgaXQgbWF5IGNoYW5nZSBkZXBlbmRpbmcgb24gaG93Ci0gICAgICAgICAgICAgICAgLy8gcmVzb2x2ZXItcmVsYXRlZCBjb2RlIGhhbmRsZXMgaXQuCi0gICAgICAgICAgICAgICAgLy8gSGVyZSwgd2UgaWdub3JlIHRoZXNlIGltcGxlbWVudGF0aW9uLWRlcGVuZGVudCBzcGVjcyBhbmQKLSAgICAgICAgICAgICAgICAvLyBqdXN0IGNoZWNrIHdoZXRoZXIgdkNhcmQgaW1wb3J0ZXIgY29ycmVjdGx5IGluc2VydHMgcmVsbGV2ZW50IGRhdGEuCi0gICAgICAgICAgICAgICAgU2V0PFN0cmluZz4ga2V5VG9CZVJlbW92ZWQgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0gICAgICAgICAgICAgICAgZm9yIChFbnRyeTxTdHJpbmcsIE9iamVjdD4gZW50cnkgOiBhY3R1YWxDb250ZW50VmFsdWVzLnZhbHVlU2V0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gZW50cnkuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlID09IG51bGwgfHwgVGV4dFV0aWxzLmlzRW1wdHkodmFsdWUudG9TdHJpbmcoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGtleVRvQmVSZW1vdmVkLmFkZChlbnRyeS5nZXRLZXkoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZm9yIChTdHJpbmcga2V5OiBrZXlUb0JlUmVtb3ZlZCkgewotICAgICAgICAgICAgICAgICAgICBhY3R1YWxDb250ZW50VmFsdWVzLnJlbW92ZShrZXkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvKiBmb3IgdGVzdGluZwotICAgICAgICAgICAgICAgIExvZy5kKCJAQEAiLAotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nLmZvcm1hdCgiTWltZVR5cGU6ICVzLCBkYXRhOiAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbWVUeXBlLCBhY3R1YWxDb250ZW50VmFsdWVzLnRvU3RyaW5nKCkpKTsgKi8KLSAgICAgICAgICAgICAgICAvLyBSZW1vdmUgUkFXX0NPTlRBQ1RfSUQgZW50cnkganVzdCBmb3Igc2FmZXR5LCBzaW5jZSB3ZSBkbyBub3QgY2FyZQotICAgICAgICAgICAgICAgIC8vIGhvdyByZXNvbHZlci1yZWxhdGVkIGNvZGUgaGFuZGxlcyB0aGUgZW50cnkgaW4gdGhpcyB1bml0IHRlc3QsCi0gICAgICAgICAgICAgICAgaWYgKGFjdHVhbENvbnRlbnRWYWx1ZXMuY29udGFpbnNLZXkoRGF0YS5SQVdfQ09OVEFDVF9JRCkpIHsKLSAgICAgICAgICAgICAgICAgICAgYWN0dWFsQ29udGVudFZhbHVlcy5yZW1vdmUoRGF0YS5SQVdfQ09OVEFDVF9JRCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGZpbmFsIENvbGxlY3Rpb248Q29udGVudFZhbHVlcz4gY29udGVudFZhbHVlc0NvbGxlY3Rpb24gPQotICAgICAgICAgICAgICAgICAgICBtTWltZVR5cGVUb0V4cGVjdGVkQ29udGVudFZhbHVlcy5nZXQobWltZVR5cGUpOwotICAgICAgICAgICAgICAgIGlmIChjb250ZW50VmFsdWVzQ29sbGVjdGlvbi5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbVRlc3RDYXNlLmZhaWwoIkNvbnRlbnRWYWx1ZXMgZm9yIE1pbWVUeXBlICIgKyBtaW1lVHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBpcyBub3QgZXhwZWN0ZWQgYXQgYWxsICgiICsgYWN0dWFsQ29udGVudFZhbHVlcyArICIpIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJvb2xlYW4gY2hlY2tlZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIGZvciAoQ29udGVudFZhbHVlcyBleHBlY3RlZENvbnRlbnRWYWx1ZXMgOiBjb250ZW50VmFsdWVzQ29sbGVjdGlvbikgewotICAgICAgICAgICAgICAgICAgICAvKmZvciB0ZXN0aW5nCi0gICAgICAgICAgICAgICAgICAgIExvZy5kKCJAQEAiLCAiZXhwZWN0ZWQ6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGNvbnZlcnRUb0Vhc2lseVJlYWRhYmxlU3RyaW5nKGV4cGVjdGVkQ29udGVudFZhbHVlcykpOwotICAgICAgICAgICAgICAgICAgICBMb2cuZCgiQEBAIiwgImFjdHVhbCAgOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBjb252ZXJ0VG9FYXNpbHlSZWFkYWJsZVN0cmluZyhhY3R1YWxDb250ZW50VmFsdWVzKSk7Ki8KLSAgICAgICAgICAgICAgICAgICAgaWYgKGVxdWFsc0ZvckNvbnRlbnRWYWx1ZXMoZXhwZWN0ZWRDb250ZW50VmFsdWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbENvbnRlbnRWYWx1ZXMpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtVGVzdENhc2UuYXNzZXJ0VHJ1ZShjb250ZW50VmFsdWVzQ29sbGVjdGlvbi5yZW1vdmUoZXhwZWN0ZWRDb250ZW50VmFsdWVzKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjaGVja2VkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICghY2hlY2tlZCkgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiVW5leHBlY3RlZDogIik7Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGNvbnZlcnRUb0Vhc2lseVJlYWRhYmxlU3RyaW5nKGFjdHVhbENvbnRlbnRWYWx1ZXMpKTsKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIlxuRXhwZWN0ZWQ6ICIpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKENvbnRlbnRWYWx1ZXMgZXhwZWN0ZWRDb250ZW50VmFsdWVzIDogY29udGVudFZhbHVlc0NvbGxlY3Rpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGNvbnZlcnRUb0Vhc2lseVJlYWRhYmxlU3RyaW5nKGV4cGVjdGVkQ29udGVudFZhbHVlcykpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1UZXN0Q2FzZS5mYWlsKGJ1aWxkZXIudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtVGVzdENhc2UuZmFpbCgiVW5leHBlY3RlZCBVcmkgaGFzIGNvbWU6ICIgKyB1cmkpOwotICAgICAgICAgICAgfQotICAgICAgICB9ICAvLyBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgICByZXR1cm4gZmFrZVJlc3VsdEFycmF5OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHZlcmlmeSgpIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgZm9yIChDb2xsZWN0aW9uPENvbnRlbnRWYWx1ZXM+IGNvbnRlbnRWYWx1ZXNDb2xsZWN0aW9uIDoKLSAgICAgICAgICAgICAgICBtTWltZVR5cGVUb0V4cGVjdGVkQ29udGVudFZhbHVlcy52YWx1ZXMoKSkgewotICAgICAgICAgICAgZm9yIChDb250ZW50VmFsdWVzIGV4cGVjdGVkQ29udGVudFZhbHVlczogY29udGVudFZhbHVlc0NvbGxlY3Rpb24pIHsKLSAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChjb252ZXJ0VG9FYXNpbHlSZWFkYWJsZVN0cmluZyhleHBlY3RlZENvbnRlbnRWYWx1ZXMpKTsKLSAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiXG4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoYnVpbGRlci5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBmYWlsTXNnID0KLSAgICAgICAgICAgICAgICAiVGhlcmUgaXMoYXJlKSByZW1haW5pbmcgZXhwZWN0ZWQgQ29udGVudFZhbHVlcyBpbnN0YW5jZShzKTogXG4iCi0gICAgICAgICAgICAgICAgICAgICsgYnVpbGRlci50b1N0cmluZygpOwotICAgICAgICAgICAgbVRlc3RDYXNlLmZhaWwoZmFpbE1zZyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVdGlsaXR5IG1ldGhvZCB0byBwcmludCBDb250ZW50VmFsdWVzIHdob3NlIGNvbnRlbnQgaXMgcHJpbnRlZCB3aXRoIHNvcnRlZCBrZXlzLgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIGNvbnZlcnRUb0Vhc2lseVJlYWRhYmxlU3RyaW5nKENvbnRlbnRWYWx1ZXMgY29udGVudFZhbHVlcykgewotICAgICAgICBpZiAoY29udGVudFZhbHVlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gIm51bGwiOwotICAgICAgICB9Ci0gICAgICAgIFN0cmluZyBtaW1lVHlwZVZhbHVlID0gIiI7Ci0gICAgICAgIFNvcnRlZE1hcDxTdHJpbmcsIFN0cmluZz4gc29ydGVkTWFwID0gbmV3IFRyZWVNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0gICAgICAgIGZvciAoRW50cnk8U3RyaW5nLCBPYmplY3Q+IGVudHJ5IDogY29udGVudFZhbHVlcy52YWx1ZVNldCgpKSB7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcga2V5ID0gZW50cnkuZ2V0S2V5KCk7Ci0gICAgICAgICAgICBmaW5hbCBPYmplY3QgdmFsdWUgPSBlbnRyeS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgZmluYWwgU3RyaW5nIHZhbHVlU3RyaW5nID0gKHZhbHVlICE9IG51bGwgPyB2YWx1ZS50b1N0cmluZygpIDogbnVsbCk7Ci0gICAgICAgICAgICBpZiAoRGF0YS5NSU1FVFlQRS5lcXVhbHMoa2V5KSkgewotICAgICAgICAgICAgICAgIG1pbWVUeXBlVmFsdWUgPSB2YWx1ZVN0cmluZzsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbVRlc3RDYXNlLmFzc2VydE5vdE51bGwoa2V5KTsKLSAgICAgICAgICAgICAgICBzb3J0ZWRNYXAucHV0KGtleSwgdmFsdWVTdHJpbmcpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIGJ1aWxkZXIuYXBwZW5kKERhdGEuTUlNRVRZUEUpOwotICAgICAgICBidWlsZGVyLmFwcGVuZCgnPScpOwotICAgICAgICBidWlsZGVyLmFwcGVuZChtaW1lVHlwZVZhbHVlKTsKLSAgICAgICAgZm9yIChFbnRyeTxTdHJpbmcsIFN0cmluZz4gZW50cnkgOiBzb3J0ZWRNYXAuZW50cnlTZXQoKSkgewotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGtleSA9IGVudHJ5LmdldEtleSgpOwotICAgICAgICAgICAgZmluYWwgU3RyaW5nIHZhbHVlID0gZW50cnkuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCcgJyk7Ci0gICAgICAgICAgICBidWlsZGVyLmFwcGVuZChrZXkpOwotICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIj1cIiIpOwotICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQodmFsdWUpOwotICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoJyInKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYnVpbGRlci50b1N0cmluZygpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gZXF1YWxzRm9yQ29udGVudFZhbHVlcygKLSAgICAgICAgICAgIENvbnRlbnRWYWx1ZXMgZXhwZWN0ZWQsIENvbnRlbnRWYWx1ZXMgYWN0dWFsKSB7Ci0gICAgICAgIGlmIChleHBlY3RlZCA9PSBhY3R1YWwpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9IGVsc2UgaWYgKGV4cGVjdGVkID09IG51bGwgfHwgYWN0dWFsID09IG51bGwgfHwgZXhwZWN0ZWQuc2l6ZSgpICE9IGFjdHVhbC5zaXplKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoRW50cnk8U3RyaW5nLCBPYmplY3Q+IGVudHJ5IDogZXhwZWN0ZWQudmFsdWVTZXQoKSkgewotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGtleSA9IGVudHJ5LmdldEtleSgpOwotICAgICAgICAgICAgZmluYWwgT2JqZWN0IHZhbHVlID0gZW50cnkuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgIGlmICghYWN0dWFsLmNvbnRhaW5zS2V5KGtleSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBieXRlW10pIHsKLSAgICAgICAgICAgICAgICBPYmplY3QgYWN0dWFsVmFsdWUgPSBhY3R1YWwuZ2V0KGtleSk7Ci0gICAgICAgICAgICAgICAgaWYgKCFBcnJheXMuZXF1YWxzKChieXRlW10pdmFsdWUsIChieXRlW10pYWN0dWFsVmFsdWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCF2YWx1ZS5lcXVhbHMoYWN0dWFsLmdldChrZXkpKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL0xpbmVWZXJpZmllci5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL0xpbmVWZXJpZmllci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZWYxNWZkNy4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvTGluZVZlcmlmaWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC5waW0udmNhcmQ7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5WQ2FyZENvbXBvc2VyOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotY2xhc3MgTGluZVZlcmlmaWVyIGltcGxlbWVudHMgVkNhcmRDb21wb3Nlci5PbmVFbnRyeUhhbmRsZXIgewotICAgIHByaXZhdGUgZmluYWwgVGVzdENhc2UgbVRlc3RDYXNlOwotICAgIHByaXZhdGUgZmluYWwgQXJyYXlMaXN0PExpbmVWZXJpZmllckVsZW0+IG1MaW5lVmVyaWZpZXJFbGVtTGlzdDsKLSAgICBwcml2YXRlIGludCBtVkNhcmRUeXBlOwotICAgIHByaXZhdGUgaW50IGluZGV4OwotCi0gICAgcHVibGljIExpbmVWZXJpZmllcihUZXN0Q2FzZSB0ZXN0Q2FzZSwgaW50IHZjYXJkVHlwZSkgewotICAgICAgICBtVGVzdENhc2UgPSB0ZXN0Q2FzZTsKLSAgICAgICAgbUxpbmVWZXJpZmllckVsZW1MaXN0ID0gbmV3IEFycmF5TGlzdDxMaW5lVmVyaWZpZXJFbGVtPigpOwotICAgICAgICBtVkNhcmRUeXBlID0gdmNhcmRUeXBlOwotICAgIH0KLQotICAgIHB1YmxpYyBMaW5lVmVyaWZpZXJFbGVtIGFkZExpbmVWZXJpZmllckVsZW0oKSB7Ci0gICAgICAgIExpbmVWZXJpZmllckVsZW0gbGluZVZlcmlmaWVyID0gbmV3IExpbmVWZXJpZmllckVsZW0obVRlc3RDYXNlLCBtVkNhcmRUeXBlKTsKLSAgICAgICAgbUxpbmVWZXJpZmllckVsZW1MaXN0LmFkZChsaW5lVmVyaWZpZXIpOwotICAgICAgICByZXR1cm4gbGluZVZlcmlmaWVyOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHZlcmlmeShTdHJpbmcgdmNhcmQpIHsKLSAgICAgICAgaWYgKGluZGV4ID49IG1MaW5lVmVyaWZpZXJFbGVtTGlzdC5zaXplKCkpIHsKLSAgICAgICAgICAgIG1UZXN0Q2FzZS5mYWlsKCJJbnN1ZmZpY2llbnQgbnVtYmVyIG9mIExpbmVWZXJpZmllciAoIiArIGluZGV4ICsgIikiKTsKLSAgICAgICAgfQotCi0gICAgICAgIExpbmVWZXJpZmllckVsZW0gbGluZVZlcmlmaWVyID0gbUxpbmVWZXJpZmllckVsZW1MaXN0LmdldChpbmRleCk7Ci0gICAgICAgIGxpbmVWZXJpZmllci52ZXJpZnkodmNhcmQpOwotCi0gICAgICAgIGluZGV4Kys7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gb25FbnRyeUNyZWF0ZWQoU3RyaW5nIHZjYXJkKSB7Ci0gICAgICAgIHZlcmlmeSh2Y2FyZCk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIG9uSW5pdChDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgb25UZXJtaW5hdGUoKSB7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL0xpbmVWZXJpZmllckVsZW0uamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC9MaW5lVmVyaWZpZXJFbGVtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyM2IyOWIuLjAwMDAwMDAKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL0xpbmVWZXJpZmllckVsZW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKLSAqIHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0gKiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKLSAqIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZQotICogTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKLSAqIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGFuZHJvaWQucGltLnZjYXJkOwotCi1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuVkNhcmRDb25maWc7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWNsYXNzIExpbmVWZXJpZmllckVsZW0gewotICAgIHByaXZhdGUgZmluYWwgVGVzdENhc2UgbVRlc3RDYXNlOwotICAgIHByaXZhdGUgZmluYWwgTGlzdDxTdHJpbmc+IG1FeHBlY3RlZExpbmVMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1Jc1YzMDsKLQotICAgIHB1YmxpYyBMaW5lVmVyaWZpZXJFbGVtKFRlc3RDYXNlIHRlc3RDYXNlLCBpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIG1UZXN0Q2FzZSA9IHRlc3RDYXNlOwotICAgICAgICBtSXNWMzAgPSBWQ2FyZENvbmZpZy5pc1YzMCh2Y2FyZFR5cGUpOwotICAgIH0KLQotICAgIHB1YmxpYyBMaW5lVmVyaWZpZXJFbGVtIGFkZEV4cGVjdGVkKGZpbmFsIFN0cmluZyBsaW5lKSB7Ci0gICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkobGluZSkpIHsKLSAgICAgICAgICAgIG1FeHBlY3RlZExpbmVMaXN0LmFkZChsaW5lKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB2ZXJpZnkoZmluYWwgU3RyaW5nIHZjYXJkKSB7Ci0gICAgICAgIGZpbmFsIFN0cmluZ1tdIGxpbmVBcnJheSA9IHZjYXJkLnNwbGl0KCJcXHI/XFxuIik7Ci0gICAgICAgIGZpbmFsIGludCBsZW5ndGggPSBsaW5lQXJyYXkubGVuZ3RoOwotICAgICAgICBib29sZWFuIGJlZ2luRXhpc3RzID0gZmFsc2U7Ci0gICAgICAgIGJvb2xlYW4gZW5kRXhpc3RzID0gZmFsc2U7Ci0gICAgICAgIGJvb2xlYW4gdmVyc2lvbkV4aXN0cyA9IGZhbHNlOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBsaW5lID0gbGluZUFycmF5W2ldOwotICAgICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KGxpbmUpKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICgiQkVHSU46VkNBUkQiLmVxdWFsc0lnbm9yZUNhc2UobGluZSkpIHsKLSAgICAgICAgICAgICAgICBpZiAoYmVnaW5FeGlzdHMpIHsKLSAgICAgICAgICAgICAgICAgICAgbVRlc3RDYXNlLmZhaWwoIk11bHRpcGxlIFwiQkVHSU46VkNBUkRcIiBsaW5lIGZvdW5kIik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYmVnaW5FeGlzdHMgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCJFTkQ6VkNBUkQiLmVxdWFsc0lnbm9yZUNhc2UobGluZSkpIHsKLSAgICAgICAgICAgICAgICBpZiAoZW5kRXhpc3RzKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1UZXN0Q2FzZS5mYWlsKCJNdWx0aXBsZSBcIkVORDpWQ0FSRFwiIGxpbmUgZm91bmQiKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBlbmRFeGlzdHMgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKChtSXNWMzAgPyAiVkVSU0lPTjozLjAiIDogIlZFUlNJT046Mi4xIikuZXF1YWxzSWdub3JlQ2FzZShsaW5lKSkgewotICAgICAgICAgICAgICAgIGlmICh2ZXJzaW9uRXhpc3RzKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1UZXN0Q2FzZS5mYWlsKCJNdWx0aXBsZSBWRVJTSU9OIGxpbmUgKyBmb3VuZCIpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHZlcnNpb25FeGlzdHMgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghYmVnaW5FeGlzdHMpIHsKLSAgICAgICAgICAgICAgICBtVGVzdENhc2UuZmFpbCgiUHJvcGVydHkgb3RoZXIgdGhhbiBCRUdJTiBjYW1lIGJlZm9yZSBCRUdJTiBwcm9wZXJ0eTogIgotICAgICAgICAgICAgICAgICAgICAgICAgKyBsaW5lKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZW5kRXhpc3RzKSB7Ci0gICAgICAgICAgICAgICAgbVRlc3RDYXNlLmZhaWwoIlByb3BlcnR5IG90aGVyIHRoYW4gRU5EIGNhbWUgYWZ0ZXIgRU5EIHByb3BlcnR5OiAiCi0gICAgICAgICAgICAgICAgICAgICAgICArIGxpbmUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmaW5hbCBpbnQgaW5kZXggPSBtRXhwZWN0ZWRMaW5lTGlzdC5pbmRleE9mKGxpbmUpOwotICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKLSAgICAgICAgICAgICAgICBtRXhwZWN0ZWRMaW5lTGlzdC5yZW1vdmUoaW5kZXgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtVGVzdENhc2UuZmFpbCgiVW5leHBlY3RlZCBsaW5lOiAiICsgbGluZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIW1FeHBlY3RlZExpbmVMaXN0LmlzRW1wdHkoKSkgewotICAgICAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgIGZvciAoU3RyaW5nIGV4cGVjdGVkTGluZSA6IG1FeHBlY3RlZExpbmVMaXN0KSB7Ci0gICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZChleHBlY3RlZExpbmUpOwotICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoIlxuIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1UZXN0Q2FzZS5mYWlsKCJFeHBlY3RlZCBsaW5lKHMpIG5vdCBmb3VuZDoiICsgYnVmZmVyLnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL1Byb3BlcnR5Tm9kZS5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL1Byb3BlcnR5Tm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzFmNmQyLi4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC9Qcm9wZXJ0eU5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC5waW0udmNhcmQ7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFZhbHVlczsKLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5WQ2FyZEVudHJ5OwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotLyoqCi0gKiBQcmV2aW91c2x5IHVzZWQgaW4gbWFpbiB2Q2FyZCBoYW5kbGluZyBjb2RlIGJ1dCBub3cgZXhpc3RzIG9ubHkgZm9yIHRlc3RpbmcuCi0gKgotICogRXNwZWNpYWxseSB1c2VmdWwgZm9yIHRlc3RpbmcgcGFyc2VyIGNvZGUgKFZDYXJkUGFyc2VyKSwgc2luY2UgYWxsIHByb3BlcnRpZXMgY2FuIGJlCi0gKiBjaGVja2VkIHZpYSB0aGlzIGNsYXNzIHVubGlrZSB7QGxpbmsgVkNhcmRFbnRyeX0sIHdoaWNoIG9ubHkgZW1pdHMgdGhlIHJlc3VsdCBvZgotICogaW50ZXJwcmV0YXRpb24gb2YgdGhlIGNvbnRlbnQgb2YgZWFjaCB2Q2FyZC4gV2UgY2Fubm90IGtub3cgd2hldGhlciB2Q2FyZCBwYXJzZXIgb3IKLSAqIENvbnRhY3RTdHJ1Y3QgaXMgd3Jvbmcgd2l0aG91dGggdGhpcyBjbGFzcy4KLSAqLwotcHVibGljIGNsYXNzIFByb3BlcnR5Tm9kZSB7Ci0gICAgcHVibGljIFN0cmluZyBwcm9wTmFtZTsKLSAgICBwdWJsaWMgU3RyaW5nIHByb3BWYWx1ZTsKLSAgICBwdWJsaWMgTGlzdDxTdHJpbmc+IHByb3BWYWx1ZV92ZWN0b3I7Ci0KLSAgICAvKiogU3RvcmUgdmFsdWUgYXMgYnl0ZVtdLGFmdGVyIGRlY29kZS4KLSAgICAgKiBVc2VkIHdoZW4gcHJvcFZhbHVlIGlzIGVuY29kZWQgYnkgc29tZXRoaW5nIGxpa2UgQkFTRTY0LCBRVU9URUQtUFJJTlRBQkxFLCBldGMuCi0gICAgICovCi0gICAgcHVibGljIGJ5dGVbXSBwcm9wVmFsdWVfYnl0ZXM7Ci0KLSAgICAvKiogcGFyYW0gc3RvcmU6IGtleT1wYXJhbVR5cGUsIHZhbHVlPXBhcmFtVmFsdWUKLSAgICAgKiBOb3RlIHRoYXQgY3VycmVudGx5IFByb3BlcnR5Tm9kZSBjbGFzcyBkb2VzIG5vdCBzdXBwb3J0IG11bHRpcGxlIHBhcmFtLXZhbHVlcwotICAgICAqIGRlZmluZWQgaW4gdkNhcmQgMy4wIChTZWUgYWxzbyBSRkMgMjQyNikuIG11bHRpcGxlLXZhbHVlcyBhcmUgc3RvcmVkIGFzCi0gICAgICogb25lIFN0cmluZyB2YWx1ZSBsaWtlICJBLEIiLCBub3QgWyJBIiwgIkIiXS4uLgotICAgICAqIFRPRE86IGZpeCB0aGlzLiAKLSAgICAgKi8KLSAgICBwdWJsaWMgQ29udGVudFZhbHVlcyBwYXJhbU1hcDsKLQotICAgIC8qKiBPbmx5IGZvciBUWVBFPT8/PyBwYXJhbSBzdG9yZS4gKi8KLSAgICBwdWJsaWMgU2V0PFN0cmluZz4gcGFyYW1NYXBfVFlQRTsKLQotICAgIC8qKiBTdG9yZSBncm91cCB2YWx1ZXMuIFVzZWQgb25seSBpbiBWQ2FyZC4gKi8KLSAgICBwdWJsaWMgU2V0PFN0cmluZz4gcHJvcEdyb3VwU2V0OwotICAgIAotICAgIHB1YmxpYyBQcm9wZXJ0eU5vZGUoKSB7Ci0gICAgICAgIHByb3BOYW1lID0gIiI7Ci0gICAgICAgIHByb3BWYWx1ZSA9ICIiOwotICAgICAgICBwcm9wVmFsdWVfdmVjdG9yID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgIHBhcmFtTWFwID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKLSAgICAgICAgcGFyYW1NYXBfVFlQRSA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLSAgICAgICAgcHJvcEdyb3VwU2V0ID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgUHJvcGVydHlOb2RlKAotICAgICAgICAgICAgU3RyaW5nIHByb3BOYW1lLCBTdHJpbmcgcHJvcFZhbHVlLCBMaXN0PFN0cmluZz4gcHJvcFZhbHVlX3ZlY3RvciwKLSAgICAgICAgICAgIGJ5dGVbXSBwcm9wVmFsdWVfYnl0ZXMsIENvbnRlbnRWYWx1ZXMgcGFyYW1NYXAsIFNldDxTdHJpbmc+IHBhcmFtTWFwX1RZUEUsCi0gICAgICAgICAgICBTZXQ8U3RyaW5nPiBwcm9wR3JvdXBTZXQpIHsKLSAgICAgICAgaWYgKHByb3BOYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRoaXMucHJvcE5hbWUgPSBwcm9wTmFtZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRoaXMucHJvcE5hbWUgPSAiIjsKLSAgICAgICAgfQotICAgICAgICBpZiAocHJvcFZhbHVlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRoaXMucHJvcFZhbHVlID0gcHJvcFZhbHVlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhpcy5wcm9wVmFsdWUgPSAiIjsKLSAgICAgICAgfQotICAgICAgICBpZiAocHJvcFZhbHVlX3ZlY3RvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0aGlzLnByb3BWYWx1ZV92ZWN0b3IgPSBwcm9wVmFsdWVfdmVjdG9yOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhpcy5wcm9wVmFsdWVfdmVjdG9yID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgIH0KLSAgICAgICAgdGhpcy5wcm9wVmFsdWVfYnl0ZXMgPSBwcm9wVmFsdWVfYnl0ZXM7Ci0gICAgICAgIGlmIChwYXJhbU1hcCAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0aGlzLnBhcmFtTWFwID0gcGFyYW1NYXA7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aGlzLnBhcmFtTWFwID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocGFyYW1NYXBfVFlQRSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0aGlzLnBhcmFtTWFwX1RZUEUgPSBwYXJhbU1hcF9UWVBFOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhpcy5wYXJhbU1hcF9UWVBFID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwcm9wR3JvdXBTZXQgIT0gbnVsbCkgewotICAgICAgICAgICAgdGhpcy5wcm9wR3JvdXBTZXQgPSBwcm9wR3JvdXBTZXQ7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aGlzLnByb3BHcm91cFNldCA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotICAgICAgICAvLyB2Q2FyZCBtYXkgY29udGFpbiBtb3JlIHRoYW4gb25lIHNhbWUgbGluZSBpbiBvbmUgZW50cnksIHdoaWxlIEhhc2hTZXQgb3IgYW55IG90aGVyCi0gICAgICAgIC8vIGxpYnJhcnkgd2hpY2ggdXRpbGl6ZSBoYXNoQ29kZSgpIGRvZXMgbm90IGhvbm9yIHRoYXQsIHNvIGludGVudGlvbmFsbHkgdGhyb3cgYW4KLSAgICAgICAgLy8gRXhjZXB0aW9uLgotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgIlByb3BlcnR5Tm9kZSBkb2VzIG5vdCBwcm92aWRlIGhhc2hDb2RlKCkgaW1wbGVtZW50YXRpb24gaW50ZW50aW9uYWxseS4iKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotICAgICAgICBpZiAoIShvYmogaW5zdGFuY2VvZiBQcm9wZXJ0eU5vZGUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIFByb3BlcnR5Tm9kZSBub2RlID0gKFByb3BlcnR5Tm9kZSlvYmo7Ci0gICAgICAgIAotICAgICAgICBpZiAocHJvcE5hbWUgPT0gbnVsbCB8fCAhcHJvcE5hbWUuZXF1YWxzKG5vZGUucHJvcE5hbWUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0gZWxzZSBpZiAoIXBhcmFtTWFwX1RZUEUuZXF1YWxzKG5vZGUucGFyYW1NYXBfVFlQRSkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfSBlbHNlIGlmICghcGFyYW1NYXBfVFlQRS5lcXVhbHMobm9kZS5wYXJhbU1hcF9UWVBFKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9IGVsc2UgaWYgKCFwcm9wR3JvdXBTZXQuZXF1YWxzKG5vZGUucHJvcEdyb3VwU2V0KSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHByb3BWYWx1ZV9ieXRlcyAhPSBudWxsICYmIEFycmF5cy5lcXVhbHMocHJvcFZhbHVlX2J5dGVzLCBub2RlLnByb3BWYWx1ZV9ieXRlcykpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKCFwcm9wVmFsdWUuZXF1YWxzKG5vZGUucHJvcFZhbHVlKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gVGhlIHZhbHVlIGluIHByb3BWYWx1ZV92ZWN0b3IgaXMgbm90IGRlY29kZWQgZXZlbiBpZiBpdCBzaG91bGQgYmUKLSAgICAgICAgICAgIC8vIGRlY29kZWQgYnkgQkFTRTY0IG9yIFFVT1RFRC1QUklOVEFCTEUuIFdoZW4gdGhlIHNpemUgb2YgcHJvcFZhbHVlX3ZlY3RvcgotICAgICAgICAgICAgLy8gaXMgMSwgdGhlIGVuY29kZWQgdmFsdWUgaXMgc3RvcmVkIGluIHByb3BWYWx1ZSwgc28gd2UgZG8gbm90IGhhdmUgdG8KLSAgICAgICAgICAgIC8vIGNoZWNrIGl0LgotICAgICAgICAgICAgcmV0dXJuIChwcm9wVmFsdWVfdmVjdG9yLmVxdWFscyhub2RlLnByb3BWYWx1ZV92ZWN0b3IpIHx8Ci0gICAgICAgICAgICAgICAgICAgIHByb3BWYWx1ZV92ZWN0b3Iuc2l6ZSgpID09IDEgfHwKLSAgICAgICAgICAgICAgICAgICAgbm9kZS5wcm9wVmFsdWVfdmVjdG9yLnNpemUoKSA9PSAxKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICBidWlsZGVyLmFwcGVuZCgicHJvcE5hbWU6ICIpOwotICAgICAgICBidWlsZGVyLmFwcGVuZChwcm9wTmFtZSk7Ci0gICAgICAgIGJ1aWxkZXIuYXBwZW5kKCIsIHBhcmFtTWFwOiAiKTsKLSAgICAgICAgYnVpbGRlci5hcHBlbmQocGFyYW1NYXAudG9TdHJpbmcoKSk7Ci0gICAgICAgIGJ1aWxkZXIuYXBwZW5kKCIsIHBhcmFtTWFwX1RZUEU6IFsiKTsKLSAgICAgICAgYm9vbGVhbiBmaXJzdCA9IHRydWU7Ci0gICAgICAgIGZvciAoU3RyaW5nIGVsZW0gOiBwYXJhbU1hcF9UWVBFKSB7Ci0gICAgICAgICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiLCAiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCciJyk7Ci0gICAgICAgICAgICBidWlsZGVyLmFwcGVuZChlbGVtKTsKLSAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCciJyk7Ci0gICAgICAgIH0KLSAgICAgICAgYnVpbGRlci5hcHBlbmQoIl0iKTsKLSAgICAgICAgaWYgKCFwcm9wR3JvdXBTZXQuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiLCBwcm9wR3JvdXBTZXQ6IFsiKTsKLSAgICAgICAgICAgIGZpcnN0ID0gdHJ1ZTsKLSAgICAgICAgICAgIGZvciAoU3RyaW5nIGVsZW0gOiBwcm9wR3JvdXBTZXQpIHsKLSAgICAgICAgICAgICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiLCAiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoJyInKTsKLSAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChlbGVtKTsKLSAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgnIicpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIl0iKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocHJvcFZhbHVlX3ZlY3RvciAhPSBudWxsICYmIHByb3BWYWx1ZV92ZWN0b3Iuc2l6ZSgpID4gMSkgewotICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIiwgcHJvcFZhbHVlX3ZlY3RvciBzaXplOiAiKTsKLSAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKHByb3BWYWx1ZV92ZWN0b3Iuc2l6ZSgpKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocHJvcFZhbHVlX2J5dGVzICE9IG51bGwpIHsKLSAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCIsIHByb3BWYWx1ZV9ieXRlcyBzaXplOiAiKTsKLSAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKHByb3BWYWx1ZV9ieXRlcy5sZW5ndGgpOwotICAgICAgICB9Ci0gICAgICAgIGJ1aWxkZXIuYXBwZW5kKCIsIHByb3BWYWx1ZTogXCIiKTsKLSAgICAgICAgYnVpbGRlci5hcHBlbmQocHJvcFZhbHVlKTsKLSAgICAgICAgYnVpbGRlci5hcHBlbmQoIlwiIik7Ci0gICAgICAgIHJldHVybiBidWlsZGVyLnRvU3RyaW5nKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL1Byb3BlcnR5Tm9kZXNWZXJpZmllci5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL1Byb3BlcnR5Tm9kZXNWZXJpZmllci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZmRkMDc0Li4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC9Qcm9wZXJ0eU5vZGVzVmVyaWZpZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC5waW0udmNhcmQ7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFZhbHVlczsKLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5WQ2FyZENvbmZpZzsKLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5WQ2FyZFBhcnNlcjsKLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5WQ2FyZFBhcnNlcl9WMjE7Ci1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuVkNhcmRQYXJzZXJfVjMwOwotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLmV4Y2VwdGlvbi5WQ2FyZEV4Y2VwdGlvbjsKLWltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyogcGFja2FnZSAqLyBjbGFzcyBQcm9wZXJ0eU5vZGVzVmVyaWZpZXIgZXh0ZW5kcyBWTm9kZUJ1aWxkZXIgewotICAgIHByaXZhdGUgZmluYWwgTGlzdDxQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtPiBtUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbUxpc3Q7Ci0gICAgcHJpdmF0ZSBmaW5hbCBBbmRyb2lkVGVzdENhc2UgbUFuZHJvaWRUZXN0Q2FzZTsKLSAgICBwcml2YXRlIGludCBtSW5kZXg7Ci0KLSAgICBwdWJsaWMgUHJvcGVydHlOb2Rlc1ZlcmlmaWVyKEFuZHJvaWRUZXN0Q2FzZSB0ZXN0Q2FzZSkgewotICAgICAgICBtUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbUxpc3QgPSBuZXcgQXJyYXlMaXN0PFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0+KCk7Ci0gICAgICAgIG1BbmRyb2lkVGVzdENhc2UgPSB0ZXN0Q2FzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSBhZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtKCkgewotICAgICAgICBQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtIGVsZW0gPSBuZXcgUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbShtQW5kcm9pZFRlc3RDYXNlKTsKLSAgICAgICAgbVByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW1MaXN0LmFkZChlbGVtKTsKLSAgICAgICAgcmV0dXJuIGVsZW07Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdmVyaWZ5KGludCByZXNJZCwgaW50IHZDYXJkVHlwZSkKLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgVkNhcmRFeGNlcHRpb24gewotICAgICAgICB2ZXJpZnkobUFuZHJvaWRUZXN0Q2FzZS5nZXRDb250ZXh0KCkuZ2V0UmVzb3VyY2VzKCkub3BlblJhd1Jlc291cmNlKHJlc0lkKSwgdkNhcmRUeXBlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB2ZXJpZnkoaW50IHJlc0lkLCBpbnQgdkNhcmRUeXBlLCBmaW5hbCBWQ2FyZFBhcnNlciB2Q2FyZFBhcnNlcikKLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgVkNhcmRFeGNlcHRpb24gewotICAgICAgICB2ZXJpZnkobUFuZHJvaWRUZXN0Q2FzZS5nZXRDb250ZXh0KCkuZ2V0UmVzb3VyY2VzKCkub3BlblJhd1Jlc291cmNlKHJlc0lkKSwKLSAgICAgICAgICAgICAgICB2Q2FyZFR5cGUsIHZDYXJkUGFyc2VyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB2ZXJpZnkoSW5wdXRTdHJlYW0gaXMsIGludCB2Q2FyZFR5cGUpIHRocm93cyBJT0V4Y2VwdGlvbiwgVkNhcmRFeGNlcHRpb24gewotICAgICAgICBmaW5hbCBWQ2FyZFBhcnNlciB2Q2FyZFBhcnNlcjsKLSAgICAgICAgaWYgKFZDYXJkQ29uZmlnLmlzVjMwKHZDYXJkVHlwZSkpIHsKLSAgICAgICAgICAgIHZDYXJkUGFyc2VyID0gbmV3IFZDYXJkUGFyc2VyX1YzMCh0cnVlKTsgIC8vIFVzZSBTdHJpY3RQYXJzaW5nLgotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdkNhcmRQYXJzZXIgPSBuZXcgVkNhcmRQYXJzZXJfVjIxKCk7Ci0gICAgICAgIH0KLSAgICAgICAgdmVyaWZ5KGlzLCB2Q2FyZFR5cGUsIHZDYXJkUGFyc2VyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB2ZXJpZnkoSW5wdXRTdHJlYW0gaXMsIGludCB2Q2FyZFR5cGUsIGZpbmFsIFZDYXJkUGFyc2VyIHZDYXJkUGFyc2VyKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBWQ2FyZEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB2Q2FyZFBhcnNlci5wYXJzZShpcywgdGhpcyk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAoaXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGlzLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGVuZEVudHJ5KCkgewotICAgICAgICBzdXBlci5lbmRFbnRyeSgpOwotICAgICAgICBtQW5kcm9pZFRlc3RDYXNlLmFzc2VydFRydWUobUluZGV4IDwgbVByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW1MaXN0LnNpemUoKSk7Ci0gICAgICAgIG1BbmRyb2lkVGVzdENhc2UuYXNzZXJ0VHJ1ZShtSW5kZXggPCB2Tm9kZUxpc3Quc2l6ZSgpKTsKLSAgICAgICAgbVByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW1MaXN0LmdldChtSW5kZXgpLnZlcmlmeSh2Tm9kZUxpc3QuZ2V0KG1JbmRleCkpOwotICAgICAgICBtSW5kZXgrKzsKLSAgICB9Ci19Ci0KLS8qKgotICogVXRpbGl0eSBjbGFzcyB3aGljaCB2ZXJpZmllcyBpbnB1dCBWTm9kZS4KLSAqCi0gKiBUaGlzIGNsYXNzIGZpcnN0IGNoZWNrcyB3aGV0aGVyIGVhY2ggcHJvcGVydHlOb2RlIGluIHRoZSBWTm9kZSBpcyBpbiB0aGUKLSAqICJvcmRlcmVkIGV4cGVjdGVkIHByb3BlcnR5IGxpc3QiLgotICogSWYgdGhlIG5vZGUgZG9lcyBub3QgZXhpc3QgaW4gdGhlICJvcmRlcmVkIGxpc3QiLCB0aGUgY2xhc3MgcmVmZXJzIHRvCi0gKiAidW5vcmRlcmQgZXhwZWN0ZWQgcHJvcGVydHkgc2V0IiBhbmQgY2hlY2tzIHRoZSBub2RlIGlzIGV4cGVjdGVkIHNvbWV3aGVyZS4KLSAqLwotLyogcGFja2FnZSAqLyBjbGFzcyBQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtIHsKLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFR5cGVTZXQgZXh0ZW5kcyBIYXNoU2V0PFN0cmluZz4gewotICAgICAgICBwdWJsaWMgVHlwZVNldChTdHJpbmcgLi4uIGFycmF5KSB7Ci0gICAgICAgICAgICBzdXBlcihBcnJheXMuYXNMaXN0KGFycmF5KSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEdyb3VwU2V0IGV4dGVuZHMgSGFzaFNldDxTdHJpbmc+IHsKLSAgICAgICAgcHVibGljIEdyb3VwU2V0KFN0cmluZyAuLi4gYXJyYXkpIHsKLSAgICAgICAgICAgIHN1cGVyKEFycmF5cy5hc0xpc3QoYXJyYXkpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgSGFzaE1hcDxTdHJpbmcsIExpc3Q8UHJvcGVydHlOb2RlPj4gbU9yZGVyZWROb2RlTWFwOwotICAgIC8vIEludGVudGlvbmFsbHkgdXNlIEFycmF5TGlzdCBpbnN0ZWFkIG9mIFNldCwgYXNzdW1pbmcgdGhlcmUgbWF5IGJlIG1vcmUgdGhhbiBvbmUKLSAgICAvLyBleGFjdGx5IHNhbWUgb2JqZWN0cy4KLSAgICBwcml2YXRlIGZpbmFsIEFycmF5TGlzdDxQcm9wZXJ0eU5vZGU+IG1Vbm9yZGVyZWROb2RlTGlzdDsKLSAgICBwcml2YXRlIGZpbmFsIFRlc3RDYXNlIG1UZXN0Q2FzZTsKLQotICAgIHB1YmxpYyBQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtKFRlc3RDYXNlIHRlc3RDYXNlKSB7Ci0gICAgICAgIG1PcmRlcmVkTm9kZU1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgTGlzdDxQcm9wZXJ0eU5vZGU+PigpOwotICAgICAgICBtVW5vcmRlcmVkTm9kZUxpc3QgPSBuZXcgQXJyYXlMaXN0PFByb3BlcnR5Tm9kZT4oKTsKLSAgICAgICAgbVRlc3RDYXNlID0gdGVzdENhc2U7Ci0gICAgfQotCi0gICAgLy8gV2l0aE9yZGVyCi0KLSAgICBwdWJsaWMgUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSBhZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoU3RyaW5nIHByb3BOYW1lLCBTdHJpbmcgcHJvcFZhbHVlKSB7Ci0gICAgICAgIHJldHVybiBhZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIocHJvcE5hbWUsIHByb3BWYWx1ZSwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0gYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKAotICAgICAgICAgICAgU3RyaW5nIHByb3BOYW1lLCBTdHJpbmcgcHJvcFZhbHVlLCBDb250ZW50VmFsdWVzIGNvbnRlbnRWYWx1ZXMpIHsKLSAgICAgICAgcmV0dXJuIGFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcihwcm9wTmFtZSwgcHJvcFZhbHVlLCBudWxsLAotICAgICAgICAgICAgICAgIG51bGwsIGNvbnRlbnRWYWx1ZXMsIG51bGwsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtIGFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigKLSAgICAgICAgICAgIFN0cmluZyBwcm9wTmFtZSwgTGlzdDxTdHJpbmc+IHByb3BWYWx1ZUxpc3QsIENvbnRlbnRWYWx1ZXMgY29udGVudFZhbHVlcykgewotICAgICAgICByZXR1cm4gYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKHByb3BOYW1lLCBudWxsLCBwcm9wVmFsdWVMaXN0LAotICAgICAgICAgICAgICAgIG51bGwsIGNvbnRlbnRWYWx1ZXMsIG51bGwsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtIGFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigKLSAgICAgICAgICAgIFN0cmluZyBwcm9wTmFtZSwgU3RyaW5nIHByb3BWYWx1ZSwgTGlzdDxTdHJpbmc+IHByb3BWYWx1ZUxpc3QpIHsKLSAgICAgICAgcmV0dXJuIGFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcihwcm9wTmFtZSwgcHJvcFZhbHVlLCBwcm9wVmFsdWVMaXN0LCBudWxsLAotICAgICAgICAgICAgICAgIG51bGwsIG51bGwsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtIGFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigKLSAgICAgICAgICAgIFN0cmluZyBwcm9wTmFtZSwgTGlzdDxTdHJpbmc+IHByb3BWYWx1ZUxpc3QpIHsKLSAgICAgICAgZmluYWwgU3RyaW5nIHByb3BWYWx1ZSA9IGNvbmNhdGluYXRlTGlzdFdpdGhTZW1pQ29sb24ocHJvcFZhbHVlTGlzdCk7Ci0gICAgICAgIHJldHVybiBhZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIocHJvcE5hbWUsIHByb3BWYWx1ZS50b1N0cmluZygpLCBwcm9wVmFsdWVMaXN0LAotICAgICAgICAgICAgICAgIG51bGwsIG51bGwsIG51bGwsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtIGFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcihTdHJpbmcgcHJvcE5hbWUsIFN0cmluZyBwcm9wVmFsdWUsCi0gICAgICAgICAgICBUeXBlU2V0IHBhcmFtTWFwX1RZUEUpIHsKLSAgICAgICAgcmV0dXJuIGFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcihwcm9wTmFtZSwgcHJvcFZhbHVlLCBudWxsLAotICAgICAgICAgICAgICAgIG51bGwsIG51bGwsIHBhcmFtTWFwX1RZUEUsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtIGFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcihTdHJpbmcgcHJvcE5hbWUsCi0gICAgICAgICAgICBMaXN0PFN0cmluZz4gcHJvcFZhbHVlTGlzdCwgVHlwZVNldCBwYXJhbU1hcF9UWVBFKSB7Ci0gICAgICAgIHJldHVybiBhZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIocHJvcE5hbWUsIG51bGwsIHByb3BWYWx1ZUxpc3QsIG51bGwsIG51bGwsCi0gICAgICAgICAgICAgICAgcGFyYW1NYXBfVFlQRSwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0gYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKFN0cmluZyBwcm9wTmFtZSwgU3RyaW5nIHByb3BWYWx1ZSwKLSAgICAgICAgICAgIENvbnRlbnRWYWx1ZXMgcGFyYW1NYXAsIFR5cGVTZXQgcGFyYW1NYXBfVFlQRSkgewotICAgICAgICByZXR1cm4gYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKHByb3BOYW1lLCBwcm9wVmFsdWUsIG51bGwsIG51bGwsCi0gICAgICAgICAgICAgICAgcGFyYW1NYXAsIHBhcmFtTWFwX1RZUEUsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtIGFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcihTdHJpbmcgcHJvcE5hbWUsIFN0cmluZyBwcm9wVmFsdWUsCi0gICAgICAgICAgICBMaXN0PFN0cmluZz4gcHJvcFZhbHVlTGlzdCwgVHlwZVNldCBwYXJhbU1hcF9UWVBFKSB7Ci0gICAgICAgIHJldHVybiBhZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIocHJvcE5hbWUsIHByb3BWYWx1ZSwgcHJvcFZhbHVlTGlzdCwgbnVsbCwgbnVsbCwKLSAgICAgICAgICAgICAgICBwYXJhbU1hcF9UWVBFLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSBhZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoU3RyaW5nIHByb3BOYW1lLCBTdHJpbmcgcHJvcFZhbHVlLAotICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHByb3BWYWx1ZUxpc3QsIGJ5dGVbXSBwcm9wVmFsdWVfYnl0ZXMsCi0gICAgICAgICAgICBDb250ZW50VmFsdWVzIHBhcmFtTWFwLCBUeXBlU2V0IHBhcmFtTWFwX1RZUEUsIEdyb3VwU2V0IHByb3BHcm91cFNldCkgewotICAgICAgICBpZiAocHJvcFZhbHVlID09IG51bGwgJiYgcHJvcFZhbHVlTGlzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBwcm9wVmFsdWUgPSBjb25jYXRpbmF0ZUxpc3RXaXRoU2VtaUNvbG9uKHByb3BWYWx1ZUxpc3QpOwotICAgICAgICB9Ci0gICAgICAgIFByb3BlcnR5Tm9kZSBwcm9wZXJ0eU5vZGUgPSBuZXcgUHJvcGVydHlOb2RlKHByb3BOYW1lLAotICAgICAgICAgICAgICAgIHByb3BWYWx1ZSwgcHJvcFZhbHVlTGlzdCwgcHJvcFZhbHVlX2J5dGVzLAotICAgICAgICAgICAgICAgIHBhcmFtTWFwLCBwYXJhbU1hcF9UWVBFLCBwcm9wR3JvdXBTZXQpOwotICAgICAgICBMaXN0PFByb3BlcnR5Tm9kZT4gZXhwZWN0ZWROb2RlTGlzdCA9IG1PcmRlcmVkTm9kZU1hcC5nZXQocHJvcE5hbWUpOwotICAgICAgICBpZiAoZXhwZWN0ZWROb2RlTGlzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBleHBlY3RlZE5vZGVMaXN0ID0gbmV3IEFycmF5TGlzdDxQcm9wZXJ0eU5vZGU+KCk7Ci0gICAgICAgICAgICBtT3JkZXJlZE5vZGVNYXAucHV0KHByb3BOYW1lLCBleHBlY3RlZE5vZGVMaXN0KTsKLSAgICAgICAgfQotICAgICAgICBleHBlY3RlZE5vZGVMaXN0LmFkZChwcm9wZXJ0eU5vZGUpOwotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICAvLyBXaXRob3V0T3JkZXIKLQotICAgIHB1YmxpYyBQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtIGFkZEV4cGVjdGVkTm9kZShTdHJpbmcgcHJvcE5hbWUsIFN0cmluZyBwcm9wVmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIGFkZEV4cGVjdGVkTm9kZShwcm9wTmFtZSwgcHJvcFZhbHVlLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSBhZGRFeHBlY3RlZE5vZGUoU3RyaW5nIHByb3BOYW1lLCBTdHJpbmcgcHJvcFZhbHVlLAotICAgICAgICAgICAgQ29udGVudFZhbHVlcyBjb250ZW50VmFsdWVzKSB7Ci0gICAgICAgIHJldHVybiBhZGRFeHBlY3RlZE5vZGUocHJvcE5hbWUsIHByb3BWYWx1ZSwgbnVsbCwgbnVsbCwgY29udGVudFZhbHVlcywgbnVsbCwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0gYWRkRXhwZWN0ZWROb2RlKFN0cmluZyBwcm9wTmFtZSwKLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBwcm9wVmFsdWVMaXN0LCBDb250ZW50VmFsdWVzIGNvbnRlbnRWYWx1ZXMpIHsKLSAgICAgICAgcmV0dXJuIGFkZEV4cGVjdGVkTm9kZShwcm9wTmFtZSwgbnVsbCwKLSAgICAgICAgICAgICAgICBwcm9wVmFsdWVMaXN0LCBudWxsLCBjb250ZW50VmFsdWVzLCBudWxsLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSBhZGRFeHBlY3RlZE5vZGUoU3RyaW5nIHByb3BOYW1lLCBTdHJpbmcgcHJvcFZhbHVlLAotICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHByb3BWYWx1ZUxpc3QpIHsKLSAgICAgICAgcmV0dXJuIGFkZEV4cGVjdGVkTm9kZShwcm9wTmFtZSwgcHJvcFZhbHVlLCBwcm9wVmFsdWVMaXN0LCBudWxsLCBudWxsLCBudWxsLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSBhZGRFeHBlY3RlZE5vZGUoU3RyaW5nIHByb3BOYW1lLAotICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHByb3BWYWx1ZUxpc3QpIHsKLSAgICAgICAgcmV0dXJuIGFkZEV4cGVjdGVkTm9kZShwcm9wTmFtZSwgbnVsbCwgcHJvcFZhbHVlTGlzdCwKLSAgICAgICAgICAgICAgICBudWxsLCBudWxsLCBudWxsLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSBhZGRFeHBlY3RlZE5vZGUoU3RyaW5nIHByb3BOYW1lLCBTdHJpbmcgcHJvcFZhbHVlLAotICAgICAgICAgICAgVHlwZVNldCBwYXJhbU1hcF9UWVBFKSB7Ci0gICAgICAgIHJldHVybiBhZGRFeHBlY3RlZE5vZGUocHJvcE5hbWUsIHByb3BWYWx1ZSwgbnVsbCwgbnVsbCwgbnVsbCwgcGFyYW1NYXBfVFlQRSwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0gYWRkRXhwZWN0ZWROb2RlKFN0cmluZyBwcm9wTmFtZSwKLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBwcm9wVmFsdWVMaXN0LCBUeXBlU2V0IHBhcmFtTWFwX1RZUEUpIHsKLSAgICAgICAgZmluYWwgU3RyaW5nIHByb3BWYWx1ZSA9IGNvbmNhdGluYXRlTGlzdFdpdGhTZW1pQ29sb24ocHJvcFZhbHVlTGlzdCk7Ci0gICAgICAgIHJldHVybiBhZGRFeHBlY3RlZE5vZGUocHJvcE5hbWUsIHByb3BWYWx1ZSwgcHJvcFZhbHVlTGlzdCwgbnVsbCwgbnVsbCwKLSAgICAgICAgICAgICAgICBwYXJhbU1hcF9UWVBFLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSBhZGRFeHBlY3RlZE5vZGUoU3RyaW5nIHByb3BOYW1lLCBTdHJpbmcgcHJvcFZhbHVlLAotICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHByb3BWYWx1ZUxpc3QsIFR5cGVTZXQgcGFyYW1NYXBfVFlQRSkgewotICAgICAgICByZXR1cm4gYWRkRXhwZWN0ZWROb2RlKHByb3BOYW1lLCBwcm9wVmFsdWUsIHByb3BWYWx1ZUxpc3QsIG51bGwsIG51bGwsCi0gICAgICAgICAgICAgICAgcGFyYW1NYXBfVFlQRSwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0gYWRkRXhwZWN0ZWROb2RlKFN0cmluZyBwcm9wTmFtZSwgU3RyaW5nIHByb3BWYWx1ZSwKLSAgICAgICAgICAgIENvbnRlbnRWYWx1ZXMgcGFyYW1NYXAsIFR5cGVTZXQgcGFyYW1NYXBfVFlQRSkgewotICAgICAgICByZXR1cm4gYWRkRXhwZWN0ZWROb2RlKHByb3BOYW1lLCBwcm9wVmFsdWUsIG51bGwsIG51bGwsCi0gICAgICAgICAgICAgICAgcGFyYW1NYXAsIHBhcmFtTWFwX1RZUEUsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtIGFkZEV4cGVjdGVkTm9kZShTdHJpbmcgcHJvcE5hbWUsIFN0cmluZyBwcm9wVmFsdWUsCi0gICAgICAgICAgICBMaXN0PFN0cmluZz4gcHJvcFZhbHVlTGlzdCwgYnl0ZVtdIHByb3BWYWx1ZV9ieXRlcywKLSAgICAgICAgICAgIENvbnRlbnRWYWx1ZXMgcGFyYW1NYXAsIFR5cGVTZXQgcGFyYW1NYXBfVFlQRSwgR3JvdXBTZXQgcHJvcEdyb3VwU2V0KSB7Ci0gICAgICAgIGlmIChwcm9wVmFsdWUgPT0gbnVsbCAmJiBwcm9wVmFsdWVMaXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHByb3BWYWx1ZSA9IGNvbmNhdGluYXRlTGlzdFdpdGhTZW1pQ29sb24ocHJvcFZhbHVlTGlzdCk7Ci0gICAgICAgIH0KLSAgICAgICAgbVVub3JkZXJlZE5vZGVMaXN0LmFkZChuZXcgUHJvcGVydHlOb2RlKHByb3BOYW1lLCBwcm9wVmFsdWUsCi0gICAgICAgICAgICAgICAgcHJvcFZhbHVlTGlzdCwgcHJvcFZhbHVlX2J5dGVzLCBwYXJhbU1hcCwgcGFyYW1NYXBfVFlQRSwgcHJvcEdyb3VwU2V0KSk7Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHZlcmlmeShWTm9kZSB2bm9kZSkgewotICAgICAgICBmb3IgKFByb3BlcnR5Tm9kZSBhY3R1YWxOb2RlIDogdm5vZGUucHJvcExpc3QpIHsKLSAgICAgICAgICAgIHZlcmlmeU5vZGUoYWN0dWFsTm9kZS5wcm9wTmFtZSwgYWN0dWFsTm9kZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFtT3JkZXJlZE5vZGVNYXAuaXNFbXB0eSgpIHx8ICFtVW5vcmRlcmVkTm9kZUxpc3QuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBMaXN0PFN0cmluZz4gZXhwZWN0ZWRQcm9wcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICAgICAgZm9yIChMaXN0PFByb3BlcnR5Tm9kZT4gbm9kZXMgOiBtT3JkZXJlZE5vZGVNYXAudmFsdWVzKCkpIHsKLSAgICAgICAgICAgICAgICBmb3IgKFByb3BlcnR5Tm9kZSBub2RlIDogbm9kZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFleHBlY3RlZFByb3BzLmNvbnRhaW5zKG5vZGUucHJvcE5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZFByb3BzLmFkZChub2RlLnByb3BOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZvciAoUHJvcGVydHlOb2RlIG5vZGUgOiBtVW5vcmRlcmVkTm9kZUxpc3QpIHsKLSAgICAgICAgICAgICAgICBpZiAoIWV4cGVjdGVkUHJvcHMuY29udGFpbnMobm9kZS5wcm9wTmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRQcm9wcy5hZGQobm9kZS5wcm9wTmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgbVRlc3RDYXNlLmZhaWwoIkV4cGVjdGVkIHByb3BlcnR5ICIgKyBBcnJheXMudG9TdHJpbmcoZXhwZWN0ZWRQcm9wcy50b0FycmF5KCkpCi0gICAgICAgICAgICAgICAgICAgICsgIiB3YXMgbm90IGZvdW5kLiIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHZlcmlmeU5vZGUoZmluYWwgU3RyaW5nIHByb3BOYW1lLCBmaW5hbCBQcm9wZXJ0eU5vZGUgYWN0dWFsTm9kZSkgewotICAgICAgICBMaXN0PFByb3BlcnR5Tm9kZT4gZXhwZWN0ZWROb2RlTGlzdCA9IG1PcmRlcmVkTm9kZU1hcC5nZXQocHJvcE5hbWUpOwotICAgICAgICBmaW5hbCBpbnQgc2l6ZSA9IChleHBlY3RlZE5vZGVMaXN0ICE9IG51bGwgPyBleHBlY3RlZE5vZGVMaXN0LnNpemUoKSA6IDApOwotICAgICAgICBpZiAoc2l6ZSA+IDApIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgUHJvcGVydHlOb2RlIGV4cGVjdGVkTm9kZSA9IGV4cGVjdGVkTm9kZUxpc3QuZ2V0KGkpOwotICAgICAgICAgICAgICAgIExpc3Q8UHJvcGVydHlOb2RlPiBleHBlY3RlZEJ1dERpZmZlcmVudFZhbHVlTGlzdCA9IG5ldyBBcnJheUxpc3Q8UHJvcGVydHlOb2RlPigpOwotICAgICAgICAgICAgICAgIGlmIChleHBlY3RlZE5vZGUucHJvcE5hbWUuZXF1YWxzKHByb3BOYW1lKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoZXhwZWN0ZWROb2RlLmVxdWFscyhhY3R1YWxOb2RlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWROb2RlTGlzdC5yZW1vdmUoaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXhwZWN0ZWROb2RlTGlzdC5zaXplKCkgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1PcmRlcmVkTm9kZU1hcC5yZW1vdmUocHJvcE5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRCdXREaWZmZXJlbnRWYWx1ZUxpc3QuYWRkKGV4cGVjdGVkTm9kZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyAiYWN0dWFsTm9kZSIgaXMgbm90IGluIG9yZGVyZWQgZXhwZWN0ZWQgbGlzdC4KLSAgICAgICAgICAgICAgICAvLyBUcnkgbG9va2luZyBvdmVyIHVub3JkZXJlZCBleHBlY3RlZCBsaXN0LgotICAgICAgICAgICAgICAgIGlmICh0cnlGb3VuZEV4cGVjdGVkTm9kZUZyb21Vbm9yZGVyZWRMaXN0KGFjdHVhbE5vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZEJ1dERpZmZlcmVudFZhbHVlTGlzdCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmICghZXhwZWN0ZWRCdXREaWZmZXJlbnRWYWx1ZUxpc3QuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFNhbWUgcHJvcE5hbWUgZXhpc3RzIGJ1dCB3aXRoIGRpZmZlcmVudCB2YWx1ZShzKS4KLSAgICAgICAgICAgICAgICAgICAgZmFpbFdpdGhFeHBlY3RlZE5vZGVMaXN0KHByb3BOYW1lLCBhY3R1YWxOb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkQnV0RGlmZmVyZW50VmFsdWVMaXN0KTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBUaGVyZSdzIG5vIGV4cGVjdGVkIG5vZGUgd2l0aCBzYW1lIHByb3BOYW1lLgotICAgICAgICAgICAgICAgICAgICBtVGVzdENhc2UuZmFpbCgiVW5leHBlY3RlZCBwcm9wZXJ0eSBcIiIgKyBwcm9wTmFtZSArICJcIiBleGlzdHMuIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTGlzdDxQcm9wZXJ0eU5vZGU+IGV4cGVjdGVkQnV0RGlmZmVyZW50VmFsdWVMaXN0ID0KLSAgICAgICAgICAgICAgICBuZXcgQXJyYXlMaXN0PFByb3BlcnR5Tm9kZT4oKTsKLSAgICAgICAgICAgIGlmICh0cnlGb3VuZEV4cGVjdGVkTm9kZUZyb21Vbm9yZGVyZWRMaXN0KGFjdHVhbE5vZGUsIGV4cGVjdGVkQnV0RGlmZmVyZW50VmFsdWVMaXN0KSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFleHBlY3RlZEJ1dERpZmZlcmVudFZhbHVlTGlzdC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gU2FtZSBwcm9wTmFtZSBleGlzdHMgYnV0IHdpdGggZGlmZmVyZW50IHZhbHVlKHMpLgotICAgICAgICAgICAgICAgICAgICBmYWlsV2l0aEV4cGVjdGVkTm9kZUxpc3QocHJvcE5hbWUsIGFjdHVhbE5vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRCdXREaWZmZXJlbnRWYWx1ZUxpc3QpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFRoZXJlJ3Mgbm8gZXhwZWN0ZWQgbm9kZSB3aXRoIHNhbWUgcHJvcE5hbWUuCi0gICAgICAgICAgICAgICAgICAgIG1UZXN0Q2FzZS5mYWlsKCJVbmV4cGVjdGVkIHByb3BlcnR5IFwiIiArIHByb3BOYW1lICsgIlwiIGV4aXN0cy4iKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBjb25jYXRpbmF0ZUxpc3RXaXRoU2VtaUNvbG9uKExpc3Q8U3RyaW5nPiBhcnJheSkgewotICAgICAgICBTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICBib29sZWFuIGZpcnN0ID0gdHJ1ZTsKLSAgICAgICAgZm9yIChTdHJpbmcgcHJvcFZhbHVlRWxlbSA6IGFycmF5KSB7Ci0gICAgICAgICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKCc7Jyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBidWZmZXIuYXBwZW5kKHByb3BWYWx1ZUVsZW0pOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiB0cnlGb3VuZEV4cGVjdGVkTm9kZUZyb21Vbm9yZGVyZWRMaXN0KFByb3BlcnR5Tm9kZSBhY3R1YWxOb2RlLAotICAgICAgICAgICAgTGlzdDxQcm9wZXJ0eU5vZGU+IGV4cGVjdGVkQnV0RGlmZmVyZW50VmFsdWVMaXN0KSB7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBwcm9wTmFtZSA9IGFjdHVhbE5vZGUucHJvcE5hbWU7Ci0gICAgICAgIGludCB1bm9yZGVyZWRMaXN0U2l6ZSA9IG1Vbm9yZGVyZWROb2RlTGlzdC5zaXplKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdW5vcmRlcmVkTGlzdFNpemU7IGkrKykgewotICAgICAgICAgICAgUHJvcGVydHlOb2RlIHVub3JkZXJlZEV4cGVjdGVkTm9kZSA9IG1Vbm9yZGVyZWROb2RlTGlzdC5nZXQoaSk7Ci0gICAgICAgICAgICBpZiAodW5vcmRlcmVkRXhwZWN0ZWROb2RlLnByb3BOYW1lLmVxdWFscyhwcm9wTmFtZSkpIHsKLSAgICAgICAgICAgICAgICBpZiAodW5vcmRlcmVkRXhwZWN0ZWROb2RlLmVxdWFscyhhY3R1YWxOb2RlKSkgewotICAgICAgICAgICAgICAgICAgICBtVW5vcmRlcmVkTm9kZUxpc3QucmVtb3ZlKGkpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZXhwZWN0ZWRCdXREaWZmZXJlbnRWYWx1ZUxpc3QuYWRkKHVub3JkZXJlZEV4cGVjdGVkTm9kZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBmYWlsV2l0aEV4cGVjdGVkTm9kZUxpc3QoU3RyaW5nIHByb3BOYW1lLCBQcm9wZXJ0eU5vZGUgYWN0dWFsTm9kZSwKLSAgICAgICAgICAgIExpc3Q8UHJvcGVydHlOb2RlPiBleHBlY3RlZE5vZGVMaXN0KSB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIGZvciAoUHJvcGVydHlOb2RlIGV4cGVjdGVkTm9kZSA6IGV4cGVjdGVkTm9kZUxpc3QpIHsKLSAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCJleHBlY3RlZDogIik7Ci0gICAgICAgICAgICBidWlsZGVyLmFwcGVuZChleHBlY3RlZE5vZGUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiXG4iKTsKLSAgICAgICAgfQotICAgICAgICBtVGVzdENhc2UuZmFpbCgiUHJvcGVydHkgXCIiICsgcHJvcE5hbWUgKyAiXCIgaGFzIHdyb25nIHZhbHVlLlxuIgotICAgICAgICAgICAgICAgICsgYnVpbGRlci50b1N0cmluZygpCi0gICAgICAgICAgICAgICAgKyAiICBhY3R1YWw6ICIgKyBhY3R1YWxOb2RlLnRvU3RyaW5nKCkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZEV4cG9ydGVyVGVzdHMuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZEV4cG9ydGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRlMDQ2NC4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRFeHBvcnRlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NjkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5waW0udmNhcmQ7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFZhbHVlczsKLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5WQ2FyZENvbmZpZzsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLkVtYWlsOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuRXZlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5JbTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLk5pY2tuYW1lOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuTm90ZTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLk9yZ2FuaXphdGlvbjsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLlBob25lOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuUGhvdG87Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5SZWxhdGlvbjsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLlN0cnVjdHVyZWROYW1lOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuU3RydWN0dXJlZFBvc3RhbDsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLldlYnNpdGU7Ci0KLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5Qcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtLlR5cGVTZXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi0vKioKLSAqIFRlc3RzIGZvciB0aGUgY29kZSByZWxhdGVkIHRvIHZDYXJkIGV4cG9ydGVyLCBpbmN1bGRpbmcgdkNhcmQgY29tcG9zZXIuCi0gKiBUaGlzIHRlc3QgY2xhc3MgZGVwZW5kcyBvbiB2Q2FyZCBpbXBvcnRlciBjb2RlLCBzbyBpZiB0ZXN0cyBmb3IgdkNhcmQgaW1wb3J0ZXIgZmFpbCwKLSAqIHRoZSByZXN1bHQgb2YgdGhpcyBjbGFzcyB3aWxsIG5vdCBiZSByZWxpYWJsZS4KLSAqLwotcHVibGljIGNsYXNzIFZDYXJkRXhwb3J0ZXJUZXN0cyBleHRlbmRzIFZDYXJkVGVzdHNCYXNlIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gc1Bob3RvQnl0ZUFycmF5ID0KLSAgICAgICAgVkNhcmRJbXBvcnRlclRlc3RzLnNQaG90b0J5dGVBcnJheUZvckNvbXBsaWNhdGVkQ2FzZTsKLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTaW1wbGVWMjEoKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdChWMjEpOwotICAgICAgICBtVmVyaWZpZXIuYWRkSW5wdXRFbnRyeSgpLmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5GQU1JTFlfTkFNRSwgIkFuZG8iKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuR0lWRU5fTkFNRSwgIlJvaWQiKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0oKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIkZOIiwgIlJvaWQgQW5kbyIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiTiIsICJBbmRvO1JvaWQ7OzsiLAotICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdCgiQW5kbyIsICJSb2lkIiwgIiIsICIiLCAiIikpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB0ZXN0U3RydWN0dXJlZE5hbWVCYXNpYyhpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIGZpbmFsIGJvb2xlYW4gaXNWMzAgPSBWQ2FyZENvbmZpZy5pc1YzMCh2Y2FyZFR5cGUpOwotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckV4cG9ydFRlc3QodmNhcmRUeXBlKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKS5hZGRDb250ZW50VmFsdWVzKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRkFNSUxZX05BTUUsICJBcHByb3ByaWF0ZUZhbWlseU5hbWUiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuR0lWRU5fTkFNRSwgIkFwcHJvcHJpYXRlR2l2ZW5OYW1lIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLk1JRERMRV9OQU1FLCAiQXBwcm9wcmlhdGVNaWRkbGVOYW1lIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBSRUZJWCwgIkFwcHJvcHJpYXRlUHJlZml4IikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlNVRkZJWCwgIkFwcHJvcHJpYXRlU3VmZml4IikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBIT05FVElDX0ZBTUlMWV9OQU1FLCAiQXBwcm9wcmlhdGVQaG9uZXRpY0ZhbWlseSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19HSVZFTl9OQU1FLCAiQXBwcm9wcmlhdGVQaG9uZXRpY0dpdmVuIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBIT05FVElDX01JRERMRV9OQU1FLCAiQXBwcm9wcmlhdGVQaG9uZXRpY01pZGRsZSIpOwotCi0gICAgICAgIFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0gZWxlbSA9IG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJOIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJBcHByb3ByaWF0ZUZhbWlseU5hbWU7QXBwcm9wcmlhdGVHaXZlbk5hbWU7QXBwcm9wcmlhdGVNaWRkbGVOYW1lOyIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIkFwcHJvcHJpYXRlUHJlZml4O0FwcHJvcHJpYXRlU3VmZml4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoIkFwcHJvcHJpYXRlRmFtaWx5TmFtZSIsICJBcHByb3ByaWF0ZUdpdmVuTmFtZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBcHByb3ByaWF0ZU1pZGRsZU5hbWUiLCAiQXBwcm9wcmlhdGVQcmVmaXgiLCAiQXBwcm9wcmlhdGVTdWZmaXgiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJGTiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiQXBwcm9wcmlhdGVQcmVmaXggQXBwcm9wcmlhdGVHaXZlbk5hbWUgIgotICAgICAgICAgICAgICAgICAgICAgICAgKyAiQXBwcm9wcmlhdGVNaWRkbGVOYW1lIEFwcHJvcHJpYXRlRmFtaWx5TmFtZSBBcHByb3ByaWF0ZVN1ZmZpeCIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1QSE9ORVRJQy1GSVJTVC1OQU1FIiwgIkFwcHJvcHJpYXRlUGhvbmV0aWNHaXZlbiIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1QSE9ORVRJQy1NSURETEUtTkFNRSIsICJBcHByb3ByaWF0ZVBob25ldGljTWlkZGxlIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLVBIT05FVElDLUxBU1QtTkFNRSIsICJBcHByb3ByaWF0ZVBob25ldGljRmFtaWx5Iik7Ci0KLSAgICAgICAgaWYgKGlzVjMwKSB7Ci0gICAgICAgICAgICBlbGVtLmFkZEV4cGVjdGVkTm9kZSgiU09SVC1TVFJJTkciLAotICAgICAgICAgICAgICAgICAgICAiQXBwcm9wcmlhdGVQaG9uZXRpY0dpdmVuIEFwcHJvcHJpYXRlUGhvbmV0aWNNaWRkbGUgIgotICAgICAgICAgICAgICAgICAgICArICJBcHByb3ByaWF0ZVBob25ldGljRmFtaWx5Iik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3RydWN0dXJlZE5hbWVCYXNpY1YyMSgpIHsKLSAgICAgICAgdGVzdFN0cnVjdHVyZWROYW1lQmFzaWMoVjIxKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3RydWN0dXJlZE5hbWVCYXNpY1YzMCgpIHsKLSAgICAgICAgdGVzdFN0cnVjdHVyZWROYW1lQmFzaWMoVjMwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IHRoYXQgb25seSAicHJpbWFyeSIgU3RydWN0dXJlZE5hbWUgaXMgZW1pdHRlZCwgc28gdGhhdCBvdXIgdkNhcmQgZmlsZQotICAgICAqIHdpbGwgbm90IGNvbmZ1c2UgdGhlIGV4dGVybmFsIGltcG9ydGVyLCBhc3N1bWluZyB0aGVyZSBtYXkgYmUgc29tZSBpbXBvcnRlcgotICAgICAqIHdoaWNoIHByZXN1bWUgdGhhdCB0aGVyZSdzIG9ubHkgb25lIHByb3BlcnR5IHRvd2FyZCBlYWNoIG9mICAiTiIsICJGTiIsIGV0Yy4KLSAgICAgKiBOb3RlIHRoYXQgbW9yZSB0aGFuIG9uZSAiTiIsICJGTiIsIGV0Yy4gcHJvcGVydGllcyBhcmUgYWNjZXB0YWJsZSBpbiB2Q2FyZCBzcGVjLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCB0ZXN0U3RydWN0dXJlZE5hbWVVc2VQcmltYXJ5Q29tbW9uKGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgZmluYWwgYm9vbGVhbiBpc1YzMCA9ICh2Y2FyZFR5cGUgPT0gVjMwKTsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KHZjYXJkVHlwZSk7Ci0gICAgICAgIENvbnRhY3RFbnRyeSBlbnRyeSA9IG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5GQU1JTFlfTkFNRSwgIkRvTm90RW1pdEZhbWlseU5hbWUxIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkdJVkVOX05BTUUsICJEb05vdEVtaXRHaXZlbk5hbWUxIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLk1JRERMRV9OQU1FLCAiRG9Ob3RFbWl0TWlkZGxlTmFtZTEiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUFJFRklYLCAiRG9Ob3RFbWl0UHJlZml4MSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5TVUZGSVgsICJEb05vdEVtaXRTdWZmaXgxIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBIT05FVElDX0ZBTUlMWV9OQU1FLCAiRG9Ob3RFbWl0UGhvbmV0aWNGYW1pbHkxIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBIT05FVElDX0dJVkVOX05BTUUsICJEb05vdEVtaXRQaG9uZXRpY0dpdmVuMSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19NSURETEVfTkFNRSwgIkRvTm90RW1pdFBob25ldGljTWlkZGxlMSIpOwotCi0gICAgICAgIC8vIFdpdGggIklTX1BSSU1BUlk9MSIuIFRoaXMgaXMgd2hhdCB3ZSBzaG91bGQgdXNlLgotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRkFNSUxZX05BTUUsICJBcHByb3ByaWF0ZUZhbWlseU5hbWUiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuR0lWRU5fTkFNRSwgIkFwcHJvcHJpYXRlR2l2ZW5OYW1lIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLk1JRERMRV9OQU1FLCAiQXBwcm9wcmlhdGVNaWRkbGVOYW1lIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBSRUZJWCwgIkFwcHJvcHJpYXRlUHJlZml4IikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlNVRkZJWCwgIkFwcHJvcHJpYXRlU3VmZml4IikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBIT05FVElDX0ZBTUlMWV9OQU1FLCAiQXBwcm9wcmlhdGVQaG9uZXRpY0ZhbWlseSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19HSVZFTl9OQU1FLCAiQXBwcm9wcmlhdGVQaG9uZXRpY0dpdmVuIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBIT05FVElDX01JRERMRV9OQU1FLCAiQXBwcm9wcmlhdGVQaG9uZXRpY01pZGRsZSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5JU19QUklNQVJZLCAxKTsKLQotICAgICAgICAvLyBXaXRoICJJU19QUklNQVJZPTEiLCBidXQgd2Ugc2hvdWxkIGlnbm9yZSB0aGlzIHRpbWUsIHNpbmNlIHRoaXMgaXMgc2Vjb25kLCBub3QgZmlyc3QuCi0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5GQU1JTFlfTkFNRSwgIkRvTm90RW1pdEZhbWlseU5hbWUyIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkdJVkVOX05BTUUsICJEb05vdEVtaXRHaXZlbk5hbWUyIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLk1JRERMRV9OQU1FLCAiRG9Ob3RFbWl0TWlkZGxlTmFtZTIiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUFJFRklYLCAiRG9Ob3RFbWl0UHJlZml4MiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5TVUZGSVgsICJEb05vdEVtaXRTdWZmaXgyIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBIT05FVElDX0ZBTUlMWV9OQU1FLCAiRG9Ob3RFbWl0UGhvbmV0aWNGYW1pbHkyIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBIT05FVElDX0dJVkVOX05BTUUsICJEb05vdEVtaXRQaG9uZXRpY0dpdmVuMiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19NSURETEVfTkFNRSwgIkRvTm90RW1pdFBob25ldGljTWlkZGxlMiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5JU19QUklNQVJZLCAxKTsKLQotICAgICAgICBQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtIGVsZW0gPSBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiTiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiQXBwcm9wcmlhdGVGYW1pbHlOYW1lO0FwcHJvcHJpYXRlR2l2ZW5OYW1lO0FwcHJvcHJpYXRlTWlkZGxlTmFtZTsiCi0gICAgICAgICAgICAgICAgICAgICAgICArICJBcHByb3ByaWF0ZVByZWZpeDtBcHByb3ByaWF0ZVN1ZmZpeCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KCJBcHByb3ByaWF0ZUZhbWlseU5hbWUiLCAiQXBwcm9wcmlhdGVHaXZlbk5hbWUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQXBwcm9wcmlhdGVNaWRkbGVOYW1lIiwgIkFwcHJvcHJpYXRlUHJlZml4IiwgIkFwcHJvcHJpYXRlU3VmZml4IikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiRk4iLAotICAgICAgICAgICAgICAgICAgICAgICAgIkFwcHJvcHJpYXRlUHJlZml4IEFwcHJvcHJpYXRlR2l2ZW5OYW1lICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIkFwcHJvcHJpYXRlTWlkZGxlTmFtZSBBcHByb3ByaWF0ZUZhbWlseU5hbWUgQXBwcm9wcmlhdGVTdWZmaXgiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtUEhPTkVUSUMtRklSU1QtTkFNRSIsICJBcHByb3ByaWF0ZVBob25ldGljR2l2ZW4iKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtUEhPTkVUSUMtTUlERExFLU5BTUUiLCAiQXBwcm9wcmlhdGVQaG9uZXRpY01pZGRsZSIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1QSE9ORVRJQy1MQVNULU5BTUUiLCAiQXBwcm9wcmlhdGVQaG9uZXRpY0ZhbWlseSIpOwotCi0gICAgICAgIGlmIChpc1YzMCkgewotICAgICAgICAgICAgZWxlbS5hZGRFeHBlY3RlZE5vZGUoIlNPUlQtU1RSSU5HIiwKLSAgICAgICAgICAgICAgICAgICAgIkFwcHJvcHJpYXRlUGhvbmV0aWNHaXZlbiBBcHByb3ByaWF0ZVBob25ldGljTWlkZGxlICIKLSAgICAgICAgICAgICAgICAgICAgKyAiQXBwcm9wcmlhdGVQaG9uZXRpY0ZhbWlseSIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFN0cnVjdHVyZWROYW1lVXNlUHJpbWFyeVYyMSgpIHsKLSAgICAgICAgdGVzdFN0cnVjdHVyZWROYW1lVXNlUHJpbWFyeUNvbW1vbihWMjEpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJ1Y3R1cmVkTmFtZVVzZVByaW1hcnlWMzAoKSB7Ci0gICAgICAgIHRlc3RTdHJ1Y3R1cmVkTmFtZVVzZVByaW1hcnlDb21tb24oVjMwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0cyB0aGF0IG9ubHkgInN1cGVyIHByaW1hcnkiIFN0cnVjdHVyZWROYW1lIGlzIGVtaXR0ZWQuCi0gICAgICogU2VlIGFsc28gdGhlIGNvbW1lbnQgaW4ge0BsaW5rICN0ZXN0U3RydWN0dXJlZE5hbWVVc2VQcmltYXJ5Q29tbW9uKGludCl9LgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCB0ZXN0U3RydWN0dXJlZE5hbWVVc2VTdXBlclByaW1hcnlDb21tb24oaW50IHZjYXJkVHlwZSkgewotICAgICAgICBmaW5hbCBib29sZWFuIGlzVjMwID0gKHZjYXJkVHlwZSA9PSBWMzApOwotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckV4cG9ydFRlc3QodmNhcmRUeXBlKTsKLSAgICAgICAgQ29udGFjdEVudHJ5IGVudHJ5ID0gbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkZBTUlMWV9OQU1FLCAiRG9Ob3RFbWl0RmFtaWx5TmFtZTEiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuR0lWRU5fTkFNRSwgIkRvTm90RW1pdEdpdmVuTmFtZTEiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuTUlERExFX05BTUUsICJEb05vdEVtaXRNaWRkbGVOYW1lMSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QUkVGSVgsICJEb05vdEVtaXRQcmVmaXgxIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlNVRkZJWCwgIkRvTm90RW1pdFN1ZmZpeDEiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfRkFNSUxZX05BTUUsICJEb05vdEVtaXRQaG9uZXRpY0ZhbWlseTEiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfR0lWRU5fTkFNRSwgIkRvTm90RW1pdFBob25ldGljR2l2ZW4xIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBIT05FVElDX01JRERMRV9OQU1FLCAiRG9Ob3RFbWl0UGhvbmV0aWNNaWRkbGUxIik7Ci0KLSAgICAgICAgLy8gV2l0aCAiSVNfUFJJTUFSWT0xIiwgYnV0IHdlIHNob3VsZCBpZ25vcmUgdGhpcyB0aW1lLgotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRkFNSUxZX05BTUUsICJEb05vdEVtaXRGYW1pbHlOYW1lMiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5HSVZFTl9OQU1FLCAiRG9Ob3RFbWl0R2l2ZW5OYW1lMiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5NSURETEVfTkFNRSwgIkRvTm90RW1pdE1pZGRsZU5hbWUyIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBSRUZJWCwgIkRvTm90RW1pdFByZWZpeDIiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuU1VGRklYLCAiRG9Ob3RFbWl0U3VmZml4MiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19GQU1JTFlfTkFNRSwgIkRvTm90RW1pdFBob25ldGljRmFtaWx5MiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19HSVZFTl9OQU1FLCAiRG9Ob3RFbWl0UGhvbmV0aWNHaXZlbjIiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfTUlERExFX05BTUUsICJEb05vdEVtaXRQaG9uZXRpY01pZGRsZTIiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuSVNfUFJJTUFSWSwgMSk7Ci0KLSAgICAgICAgLy8gV2l0aCAiSVNfU1VQRVJfUFJJTUFSWT0xIi4gVGhpcyBpcyB3aGF0IHdlIHNob3VsZCB1c2UuCi0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5GQU1JTFlfTkFNRSwgIkFwcHJvcHJpYXRlRmFtaWx5TmFtZSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5HSVZFTl9OQU1FLCAiQXBwcm9wcmlhdGVHaXZlbk5hbWUiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuTUlERExFX05BTUUsICJBcHByb3ByaWF0ZU1pZGRsZU5hbWUiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUFJFRklYLCAiQXBwcm9wcmlhdGVQcmVmaXgiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuU1VGRklYLCAiQXBwcm9wcmlhdGVTdWZmaXgiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfRkFNSUxZX05BTUUsICJBcHByb3ByaWF0ZVBob25ldGljRmFtaWx5IikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBIT05FVElDX0dJVkVOX05BTUUsICJBcHByb3ByaWF0ZVBob25ldGljR2l2ZW4iKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfTUlERExFX05BTUUsICJBcHByb3ByaWF0ZVBob25ldGljTWlkZGxlIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLklTX1NVUEVSX1BSSU1BUlksIDEpOwotCi0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5GQU1JTFlfTkFNRSwgIkRvTm90RW1pdEZhbWlseU5hbWUzIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkdJVkVOX05BTUUsICJEb05vdEVtaXRHaXZlbk5hbWUzIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLk1JRERMRV9OQU1FLCAiRG9Ob3RFbWl0TWlkZGxlTmFtZTMiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUFJFRklYLCAiRG9Ob3RFbWl0UHJlZml4MyIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5TVUZGSVgsICJEb05vdEVtaXRTdWZmaXgzIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBIT05FVElDX0ZBTUlMWV9OQU1FLCAiRG9Ob3RFbWl0UGhvbmV0aWNGYW1pbHkzIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBIT05FVElDX0dJVkVOX05BTUUsICJEb05vdEVtaXRQaG9uZXRpY0dpdmVuMyIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19NSURETEVfTkFNRSwgIkRvTm90RW1pdFBob25ldGljTWlkZGxlMyIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5JU19QUklNQVJZLCAxKTsKLQotICAgICAgICBQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtIGVsZW0gPSBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiTiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiQXBwcm9wcmlhdGVGYW1pbHlOYW1lO0FwcHJvcHJpYXRlR2l2ZW5OYW1lO0FwcHJvcHJpYXRlTWlkZGxlTmFtZTsiCi0gICAgICAgICAgICAgICAgICAgICAgICArICJBcHByb3ByaWF0ZVByZWZpeDtBcHByb3ByaWF0ZVN1ZmZpeCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KCJBcHByb3ByaWF0ZUZhbWlseU5hbWUiLCAiQXBwcm9wcmlhdGVHaXZlbk5hbWUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQXBwcm9wcmlhdGVNaWRkbGVOYW1lIiwgIkFwcHJvcHJpYXRlUHJlZml4IiwgIkFwcHJvcHJpYXRlU3VmZml4IikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiRk4iLAotICAgICAgICAgICAgICAgICAgICAgICAgIkFwcHJvcHJpYXRlUHJlZml4IEFwcHJvcHJpYXRlR2l2ZW5OYW1lICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIkFwcHJvcHJpYXRlTWlkZGxlTmFtZSBBcHByb3ByaWF0ZUZhbWlseU5hbWUgQXBwcm9wcmlhdGVTdWZmaXgiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtUEhPTkVUSUMtRklSU1QtTkFNRSIsICJBcHByb3ByaWF0ZVBob25ldGljR2l2ZW4iKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtUEhPTkVUSUMtTUlERExFLU5BTUUiLCAiQXBwcm9wcmlhdGVQaG9uZXRpY01pZGRsZSIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1QSE9ORVRJQy1MQVNULU5BTUUiLCAiQXBwcm9wcmlhdGVQaG9uZXRpY0ZhbWlseSIpOwotCi0gICAgICAgIGlmIChpc1YzMCkgewotICAgICAgICAgICAgZWxlbS5hZGRFeHBlY3RlZE5vZGUoIlNPUlQtU1RSSU5HIiwKLSAgICAgICAgICAgICAgICAgICAgIkFwcHJvcHJpYXRlUGhvbmV0aWNHaXZlbiBBcHByb3ByaWF0ZVBob25ldGljTWlkZGxlIgotICAgICAgICAgICAgICAgICAgICArICIgQXBwcm9wcmlhdGVQaG9uZXRpY0ZhbWlseSIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFN0cnVjdHVyZWROYW1lVXNlU3VwZXJQcmltYXJ5VjIxKCkgewotICAgICAgICB0ZXN0U3RydWN0dXJlZE5hbWVVc2VTdXBlclByaW1hcnlDb21tb24oVjIxKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3RydWN0dXJlZE5hbWVVc2VTdXBlclByaW1hcnlWMzAoKSB7Ci0gICAgICAgIHRlc3RTdHJ1Y3R1cmVkTmFtZVVzZVN1cGVyUHJpbWFyeUNvbW1vbihWMzApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3ROaWNrTmFtZVYzMCgpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KFYzMCk7Ci0gICAgICAgIG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCkuYWRkQ29udGVudFZhbHVlcyhOaWNrbmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KE5pY2tuYW1lLk5BTUUsICJOaWNreSIpOwotCi0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtV2l0aEVtcHR5TmFtZSgpCi0gICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJOSUNLTkFNRSIsICJOaWNreSIpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB0ZXN0UGhvbmVCYXNpY0NvbW1vbihpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdCh2Y2FyZFR5cGUpOwotICAgICAgICBtVmVyaWZpZXIuYWRkSW5wdXRFbnRyeSgpLmFkZENvbnRlbnRWYWx1ZXMoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICIxIikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfSE9NRSk7Ci0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtV2l0aEVtcHR5TmFtZSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiVEVMIiwgIjEiLCBuZXcgVHlwZVNldCgiSE9NRSIpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGhvbmVCYXNpY1YyMSgpIHsKLSAgICAgICAgdGVzdFBob25lQmFzaWNDb21tb24oVjIxKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGhvbmVCYXNpY1YzMCgpIHsKLSAgICAgICAgdGVzdFBob25lQmFzaWNDb21tb24oVjMwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGhvbmVSZWZyYWluRm9ybWF0dGluZygpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KFYyMSB8IFZDYXJkQ29uZmlnLkZMQUdfUkVGUkFJTl9QSE9ORV9OVU1CRVJfRk9STUFUVElORyk7Ci0gICAgICAgIG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCkuYWRkQ29udGVudFZhbHVlcyhQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjEyMzQ1Njc4OTAoYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXopIikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfSE9NRSk7Ci0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtV2l0aEVtcHR5TmFtZSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiVEVMIiwgIjEyMzQ1Njc4OTAoYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXopIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBUeXBlU2V0KCJIT01FIikpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3RzIHRoYXQgdkNhcmQgY29tcG9zZXIgZW1pdHMgY29ycmVzcG9uZGluZyB0eXBlIHBhcmFtIHdoaWNoIHdlIGV4cGVjdC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgdGVzdFBob25lVmFyaW91c1R5cGVTdXBwb3J0KGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KHZjYXJkVHlwZSk7Ci0gICAgICAgIENvbnRhY3RFbnRyeSBlbnRyeSA9IG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICIxMCIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX0hPTUUpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiMjAiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9XT1JLKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjMwIikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfRkFYX0hPTUUpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiNDAiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9GQVhfV09SSyk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICI1MCIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX01PQklMRSk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICI2MCIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX1BBR0VSKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjcwIikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfT1RIRVIpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiODAiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9DQVIpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiOTAiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9DT01QQU5ZX01BSU4pOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiMTAwIikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfSVNETik7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICIxMTAiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9NQUlOKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjEyMCIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX09USEVSX0ZBWCk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICIxMzAiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9URUxFWCk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICIxNDAiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9XT1JLX01PQklMRSk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICIxNTAiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9XT1JLX1BBR0VSKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjE2MCIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX01NUyk7Ci0KLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW1XaXRoRW1wdHlOYW1lKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiMTAiLCBuZXcgVHlwZVNldCgiSE9NRSIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICIyMCIsIG5ldyBUeXBlU2V0KCJXT1JLIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiVEVMIiwgIjMwIiwgbmV3IFR5cGVTZXQoIkhPTUUiLCAiRkFYIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiVEVMIiwgIjQwIiwgbmV3IFR5cGVTZXQoIldPUksiLCAiRkFYIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiVEVMIiwgIjUwIiwgbmV3IFR5cGVTZXQoIkNFTEwiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiNjAiLCBuZXcgVHlwZVNldCgiUEFHRVIiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiNzAiLCBuZXcgVHlwZVNldCgiVk9JQ0UiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiODAiLCBuZXcgVHlwZVNldCgiQ0FSIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiVEVMIiwgIjkwIiwgbmV3IFR5cGVTZXQoIldPUksiLCAiUFJFRiIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICIxMDAiLCBuZXcgVHlwZVNldCgiSVNETiIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICIxMTAiLCBuZXcgVHlwZVNldCgiUFJFRiIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICIxMjAiLCBuZXcgVHlwZVNldCgiRkFYIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiVEVMIiwgIjEzMCIsIG5ldyBUeXBlU2V0KCJUTFgiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiMTQwIiwgbmV3IFR5cGVTZXQoIldPUksiLCAiQ0VMTCIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICIxNTAiLCBuZXcgVHlwZVNldCgiV09SSyIsICJQQUdFUiIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICIxNjAiLCBuZXcgVHlwZVNldCgiTVNHIikpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQaG9uZVZhcmlvdXNUeXBlU3VwcG9ydFYyMSgpIHsKLSAgICAgICAgdGVzdFBob25lVmFyaW91c1R5cGVTdXBwb3J0KFYyMSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBob25lVmFyaW91c1R5cGVTdXBwb3J0VjMwKCkgewotICAgICAgICB0ZXN0UGhvbmVWYXJpb3VzVHlwZVN1cHBvcnQoVjMwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0cyB0aGF0ICJQUkVGInMgYXJlIGVtaXR0ZWQgYXBwcm9wcmlhdGVseS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgdGVzdFBob25lUHJlZkhhbmRsaW5nQ29tbW9uKGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KHZjYXJkVHlwZSk7Ci0gICAgICAgIENvbnRhY3RFbnRyeSBlbnRyeSA9IG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICIxIikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfSE9NRSk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICIyIikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfV09SSykKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLklTX1BSSU1BUlksIDEpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiMyIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX0ZBWF9IT01FKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuSVNfUFJJTUFSWSwgMSk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICI0IikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfRkFYX1dPUkspOwotCi0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtV2l0aEVtcHR5TmFtZSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiVEVMIiwgIjQiLCBuZXcgVHlwZVNldCgiV09SSyIsICJGQVgiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiMyIsIG5ldyBUeXBlU2V0KCJIT01FIiwgIkZBWCIsICJQUkVGIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiVEVMIiwgIjIiLCBuZXcgVHlwZVNldCgiV09SSyIsICJQUkVGIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiVEVMIiwgIjEiLCBuZXcgVHlwZVNldCgiSE9NRSIpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGhvbmVQcmVmSGFuZGxpbmdWMjEoKSB7Ci0gICAgICAgIHRlc3RQaG9uZVByZWZIYW5kbGluZ0NvbW1vbihWMjEpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQaG9uZVByZWZIYW5kbGluZ1YzMCgpIHsKLSAgICAgICAgdGVzdFBob25lUHJlZkhhbmRsaW5nQ29tbW9uKFYzMCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRlc3RNaXNjUGhvbmVUeXBlSGFuZGxpbmcoaW50IHZjYXJkVHlwZSkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckV4cG9ydFRlc3QodmNhcmRUeXBlKTsKLSAgICAgICAgQ29udGFjdEVudHJ5IGVudHJ5ID0gbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjEiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9DVVNUT00pCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5MQUJFTCwgIk1vZGVtIik7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICIyIikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfQ1VTVE9NKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTEFCRUwsICJNU0ciKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjMiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9DVVNUT00pCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5MQUJFTCwgIkJCUyIpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiNCIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX0NVU1RPTSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLkxBQkVMLCAiVklERU8iKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjUiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9DVVNUT00pOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiNiIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX0NVU1RPTSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLkxBQkVMLCAiX0FVVE9fQ0VMTCIpOyAgLy8gVGhlIG9sZCBpbmRpY2F0b3IgZm9yIHRoZSB0eXBlIG1vYmlsZS4KLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjciKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9DVVNUT00pCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5MQUJFTCwgIlx1NjQzQVx1NUUyRiIpOyAgLy8gTW9iaWxlIHBob25lIGluIEphcGFuZXNlIEthbmppCi0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICI4IikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfQ1VTVE9NKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTEFCRUwsICJpbnZhbGlkIik7Ci0gICAgICAgIFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0gZWxlbSA9IG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtV2l0aEVtcHR5TmFtZSgpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkTm9kZSgiVEVMIiwgIjEiLCBuZXcgVHlwZVNldCgiTU9ERU0iKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiMiIsIG5ldyBUeXBlU2V0KCJNU0ciKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiMyIsIG5ldyBUeXBlU2V0KCJCQlMiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiNCIsIG5ldyBUeXBlU2V0KCJWSURFTyIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICI1IiwgbmV3IFR5cGVTZXQoIlZPSUNFIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiVEVMIiwgIjYiLCBuZXcgVHlwZVNldCgiQ0VMTCIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICI3IiwgbmV3IFR5cGVTZXQoIkNFTEwiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiOCIsIG5ldyBUeXBlU2V0KCJYLWludmFsaWQiKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBob25lVHlwZUhhbmRsaW5nVjIxKCkgewotICAgICAgICB0ZXN0TWlzY1Bob25lVHlwZUhhbmRsaW5nKFYyMSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBob25lVHlwZUhhbmRsaW5nVjMwKCkgewotICAgICAgICB0ZXN0TWlzY1Bob25lVHlwZUhhbmRsaW5nKFYzMCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRlc3RFbWFpbEJhc2ljQ29tbW9uKGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KHZjYXJkVHlwZSk7Ci0gICAgICAgIG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCkuYWRkQ29udGVudFZhbHVlcyhFbWFpbC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KEVtYWlsLkRBVEEsICJzYW1wbGVAZXhhbXBsZS5jb20iKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW1XaXRoRW1wdHlOYW1lKCkKLSAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIkVNQUlMIiwgInNhbXBsZUBleGFtcGxlLmNvbSIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RFbWFpbEJhc2ljVjIxKCkgewotICAgICAgICB0ZXN0RW1haWxCYXNpY0NvbW1vbihWMjEpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RFbWFpbEJhc2ljVjMwKCkgewotICAgICAgICB0ZXN0RW1haWxCYXNpY0NvbW1vbihWMzApOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB0ZXN0RW1haWxWYXJpb3VzVHlwZVN1cHBvcnRDb21tb24oaW50IHZjYXJkVHlwZSkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckV4cG9ydFRlc3QodmNhcmRUeXBlKTsKLSAgICAgICAgQ29udGFjdEVudHJ5IGVudHJ5ID0gbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhFbWFpbC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KEVtYWlsLkRBVEEsICJ0eXBlX2hvbWVAZXhhbXBsZS5jb20iKQotICAgICAgICAgICAgICAgIC5wdXQoRW1haWwuVFlQRSwgRW1haWwuVFlQRV9IT01FKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhFbWFpbC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KEVtYWlsLkRBVEEsICJ0eXBlX3dvcmtAZXhhbXBsZS5jb20iKQotICAgICAgICAgICAgICAgIC5wdXQoRW1haWwuVFlQRSwgRW1haWwuVFlQRV9XT1JLKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhFbWFpbC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KEVtYWlsLkRBVEEsICJ0eXBlX21vYmlsZUBleGFtcGxlLmNvbSIpCi0gICAgICAgICAgICAgICAgLnB1dChFbWFpbC5UWVBFLCBFbWFpbC5UWVBFX01PQklMRSk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoRW1haWwuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChFbWFpbC5EQVRBLCAidHlwZV9vdGhlckBleGFtcGxlLmNvbSIpCi0gICAgICAgICAgICAgICAgLnB1dChFbWFpbC5UWVBFLCBFbWFpbC5UWVBFX09USEVSKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW1XaXRoRW1wdHlOYW1lKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJFTUFJTCIsICJ0eXBlX2hvbWVAZXhhbXBsZS5jb20iLCBuZXcgVHlwZVNldCgiSE9NRSIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIkVNQUlMIiwgInR5cGVfd29ya0BleGFtcGxlLmNvbSIsIG5ldyBUeXBlU2V0KCJXT1JLIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiRU1BSUwiLCAidHlwZV9tb2JpbGVAZXhhbXBsZS5jb20iLCBuZXcgVHlwZVNldCgiQ0VMTCIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIkVNQUlMIiwgInR5cGVfb3RoZXJAZXhhbXBsZS5jb20iKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RW1haWxWYXJpb3VzVHlwZVN1cHBvcnRWMjEoKSB7Ci0gICAgICAgIHRlc3RFbWFpbFZhcmlvdXNUeXBlU3VwcG9ydENvbW1vbihWMjEpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RFbWFpbFZhcmlvdXNUeXBlU3VwcG9ydFYzMCgpIHsKLSAgICAgICAgdGVzdEVtYWlsVmFyaW91c1R5cGVTdXBwb3J0Q29tbW9uKFYzMCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRlc3RFbWFpbFByZWZIYW5kbGluZ0NvbW1vbihpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdCh2Y2FyZFR5cGUpOwotICAgICAgICBDb250YWN0RW50cnkgZW50cnkgPSBtVmVyaWZpZXIuYWRkSW5wdXRFbnRyeSgpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKEVtYWlsLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoRW1haWwuREFUQSwgInR5cGVfaG9tZUBleGFtcGxlLmNvbSIpCi0gICAgICAgICAgICAgICAgLnB1dChFbWFpbC5UWVBFLCBFbWFpbC5UWVBFX0hPTUUpCi0gICAgICAgICAgICAgICAgLnB1dChFbWFpbC5JU19QUklNQVJZLCAxKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhFbWFpbC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KEVtYWlsLkRBVEEsICJ0eXBlX25vdHlwZUBleGFtcGxlLmNvbSIpCi0gICAgICAgICAgICAgICAgLnB1dChFbWFpbC5JU19QUklNQVJZLCAxKTsKLQotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbVdpdGhFbXB0eU5hbWUoKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIkVNQUlMIiwgInR5cGVfbm90eXBlQGV4YW1wbGUuY29tIiwgbmV3IFR5cGVTZXQoIlBSRUYiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJFTUFJTCIsICJ0eXBlX2hvbWVAZXhhbXBsZS5jb20iLCBuZXcgVHlwZVNldCgiSE9NRSIsICJQUkVGIikpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RFbWFpbFByZWZIYW5kbGluZ1YyMSgpIHsKLSAgICAgICAgdGVzdEVtYWlsUHJlZkhhbmRsaW5nQ29tbW9uKFYyMSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEVtYWlsUHJlZkhhbmRsaW5nVjMwKCkgewotICAgICAgICB0ZXN0RW1haWxQcmVmSGFuZGxpbmdDb21tb24oVjMwKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdGVzdFBvc3RhbEFkZHJlc3NDb21tb24oaW50IHZjYXJkVHlwZSkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckV4cG9ydFRlc3QodmNhcmRUeXBlKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKS5hZGRDb250ZW50VmFsdWVzKFN0cnVjdHVyZWRQb3N0YWwuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlBPQk9YLCAiUG9ib3giKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5ORUlHSEJPUkhPT0QsICJOZWlnaGJvcmhvb2QiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5TVFJFRVQsICJTdHJlZXQiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5DSVRZLCAiQ2l0eSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlJFR0lPTiwgIlJlZ2lvbiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlBPU1RDT0RFLCAiMTAwIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuQ09VTlRSWSwgIkNvdW50cnkiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5GT1JNQVRURURfQUREUkVTUywgIkZvcm1hdHRlZCBBZGRyZXNzIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuVFlQRSwgU3RydWN0dXJlZFBvc3RhbC5UWVBFX1dPUkspOwotICAgICAgICAvLyBhZHItdmFsdWUgICAgPSAwKjYodGV4dC12YWx1ZSAiOyIpIHRleHQtdmFsdWUKLSAgICAgICAgLy8gICAgICAgICAgICAgIDsgUE8gQm94LCBFeHRlbmRlZCBBZGRyZXNzLCBTdHJlZXQsIExvY2FsaXR5LCBSZWdpb24sIFBvc3RhbCBDb2RlLAotICAgICAgICAvLyAgICAgICAgICAgICAgOyBDb3VudHJ5IE5hbWUKLSAgICAgICAgLy8KLSAgICAgICAgLy8gVGhlIE5FSUdIQk9SSE9PRCBmaWVsZCBpcyBhcHBlbmRlZCBhZnRlciB0aGUgQ0lUWSBmaWVsZC4KLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW1XaXRoRW1wdHlOYW1lKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJBRFIiLAotICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdCgiUG9ib3giLCAiIiwgIlN0cmVldCIsICJDaXR5IE5laWdoYm9yaG9vZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZWdpb24iLCAiMTAwIiwgIkNvdW50cnkiKSwgbmV3IFR5cGVTZXQoIldPUksiKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBvc3RhbEFkZHJlc3NWMjEoKSB7Ci0gICAgICAgIHRlc3RQb3N0YWxBZGRyZXNzQ29tbW9uKFYyMSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBvc3RhbEFkZHJlc3NWMzAoKSB7Ci0gICAgICAgIHRlc3RQb3N0YWxBZGRyZXNzQ29tbW9uKFYzMCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRlc3RQb3N0YWxBZGRyZXNzTm9uTmVpZ2hib3Job29kKGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KHZjYXJkVHlwZSk7Ci0gICAgICAgIG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCkuYWRkQ29udGVudFZhbHVlcyhTdHJ1Y3R1cmVkUG9zdGFsLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5DSVRZLCAiQ2l0eSIpOwotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbVdpdGhFbXB0eU5hbWUoKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIkFEUiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KCIiLCAiIiwgIiIsICJDaXR5IiwgIiIsICIiLCAiIiksIG5ldyBUeXBlU2V0KCJIT01FIikpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQb3N0YWxBZGRyZXNzTm9uTmVpZ2hib3Job29kVjIxKCkgewotICAgICAgICB0ZXN0UG9zdGFsQWRkcmVzc05vbk5laWdoYm9yaG9vZChWMjEpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQb3N0YWxBZGRyZXNzTm9uTmVpZ2hib3Job29kVjMwKCkgewotICAgICAgICB0ZXN0UG9zdGFsQWRkcmVzc05vbk5laWdoYm9yaG9vZChWMzApOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB0ZXN0UG9zdGFsQWRkcmVzc05vbkNpdHkoaW50IHZjYXJkVHlwZSkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckV4cG9ydFRlc3QodmNhcmRUeXBlKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKS5hZGRDb250ZW50VmFsdWVzKFN0cnVjdHVyZWRQb3N0YWwuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLk5FSUdIQk9SSE9PRCwgIk5laWdoYm9yaG9vZCIpOwotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbVdpdGhFbXB0eU5hbWUoKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIkFEUiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KCIiLCAiIiwgIiIsICJOZWlnaGJvcmhvb2QiLCAiIiwgIiIsICIiKSwgbmV3IFR5cGVTZXQoIkhPTUUiKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBvc3RhbEFkZHJlc3NOb25DaXR5VjIxKCkgewotICAgICAgICB0ZXN0UG9zdGFsQWRkcmVzc05vbkNpdHkoVjIxKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UG9zdGFsQWRkcmVzc05vbkNpdHlWMzAoKSB7Ci0gICAgICAgIHRlc3RQb3N0YWxBZGRyZXNzTm9uQ2l0eShWMzApOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB0ZXN0UG9zdGFsT25seVdpdGhGb3JtYXR0ZWRBZGRyZXNzQ29tbW9uKGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KHZjYXJkVHlwZSk7Ci0gICAgICAgIG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCkuYWRkQ29udGVudFZhbHVlcyhTdHJ1Y3R1cmVkUG9zdGFsLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5SRUdJT04sICIiKSAgLy8gTXVzdCBiZSBpZ25vcmVkLgotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5GT1JNQVRURURfQUREUkVTUywKLSAgICAgICAgICAgICAgICAiRm9ybWF0dGVkIGFkZHJlc3MgQ0EgMTIzLTMzNCBVbml0ZWQgU3RhdHVlIik7Ci0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtV2l0aEVtcHR5TmFtZSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiQURSIiwgIjtGb3JtYXR0ZWQgYWRkcmVzcyBDQSAxMjMtMzM0IFVuaXRlZCBTdGF0dWU7Ozs7OyIsCi0gICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KCIiLCAiRm9ybWF0dGVkIGFkZHJlc3MgQ0EgMTIzLTMzNCBVbml0ZWQgU3RhdHVlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiIsICIiLCAiIiwgIiIsICIiKSwgbmV3IFR5cGVTZXQoIkhPTUUiKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBvc3RhbE9ubHlXaXRoRm9ybWF0dGVkQWRkcmVzc1YyMSgpIHsKLSAgICAgICAgdGVzdFBvc3RhbE9ubHlXaXRoRm9ybWF0dGVkQWRkcmVzc0NvbW1vbihWMjEpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQb3N0YWxPbmx5V2l0aEZvcm1hdHRlZEFkZHJlc3NWMzAoKSB7Ci0gICAgICAgIHRlc3RQb3N0YWxPbmx5V2l0aEZvcm1hdHRlZEFkZHJlc3NDb21tb24oVjMwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0cyB0aGF0IHRoZSB2Q2FyZCBjb21wb3NlciBob25vcnMgZm9ybWF0dGVkIGRhdGEgd2hlbiBpdCBpcyBhdmFpbGFibGUKLSAgICAgKiBldmVuIHdoZW4gaXQgaXMgcGFydGlhbC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgdGVzdFBvc3RhbFdpdGhCb3RoU3RydWN0dXJlZEFuZEZvcm1hdHRlZENvbW1vbihpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdCh2Y2FyZFR5cGUpOwotICAgICAgICBtVmVyaWZpZXIuYWRkSW5wdXRFbnRyeSgpLmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZFBvc3RhbC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuUE9CT1gsICJQb2JveCIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLkNPVU5UUlksICJDb3VudHJ5IikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuRk9STUFUVEVEX0FERFJFU1MsCi0gICAgICAgICAgICAgICAgICAgICAgICAiRm9ybWF0dGVkIGFkZHJlc3MgQ0EgMTIzLTMzNCBVbml0ZWQgU3RhdHVlIik7ICAvLyBTaG91bGQgYmUgaWdub3JlZAotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbVdpdGhFbXB0eU5hbWUoKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIkFEUiIsICJQb2JveDs7Ozs7O0NvdW50cnkiLAotICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdCgiUG9ib3giLCAiIiwgIiIsICIiLCAiIiwgIiIsICJDb3VudHJ5IiksCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgVHlwZVNldCgiSE9NRSIpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UG9zdGFsV2l0aEJvdGhTdHJ1Y3R1cmVkQW5kRm9ybWF0dGVkVjIxKCkgewotICAgICAgICB0ZXN0UG9zdGFsV2l0aEJvdGhTdHJ1Y3R1cmVkQW5kRm9ybWF0dGVkQ29tbW9uKFYyMSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBvc3RhbFdpdGhCb3RoU3RydWN0dXJlZEFuZEZvcm1hdHRlZFYzMCgpIHsKLSAgICAgICAgdGVzdFBvc3RhbFdpdGhCb3RoU3RydWN0dXJlZEFuZEZvcm1hdHRlZENvbW1vbihWMzApOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB0ZXN0T3JnYW5pemF0aW9uQ29tbW9uKGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KHZjYXJkVHlwZSk7Ci0gICAgICAgIENvbnRhY3RFbnRyeSBlbnRyeSA9IG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoT3JnYW5pemF0aW9uLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoT3JnYW5pemF0aW9uLkNPTVBBTlksICJDb21wYW55WCIpCi0gICAgICAgICAgICAgICAgLnB1dChPcmdhbml6YXRpb24uREVQQVJUTUVOVCwgIkRlcGFydG1lbnRZIikKLSAgICAgICAgICAgICAgICAucHV0KE9yZ2FuaXphdGlvbi5USVRMRSwgIlRpdGxlWiIpCi0gICAgICAgICAgICAgICAgLnB1dChPcmdhbml6YXRpb24uSk9CX0RFU0NSSVBUSU9OLCAiRGVzY3JpcHRpb24gUmFtYmRhIikgIC8vIElnbm9yZWQuCi0gICAgICAgICAgICAgICAgLnB1dChPcmdhbml6YXRpb24uT0ZGSUNFX0xPQ0FUSU9OLCAiTW91bnRhaW4gVmlldyIpICAvLyBJZ25vcmVkLgotICAgICAgICAgICAgICAgIC5wdXQoT3JnYW5pemF0aW9uLlBIT05FVElDX05BTUUsICJQaG9uZXRpY05hbWUhIikgIC8vIElnbm9yZWQKLSAgICAgICAgICAgICAgICAucHV0KE9yZ2FuaXphdGlvbi5TWU1CT0wsICIoXm9eKS9+fiIpOyAgLy8gSWdub3JlIGhpbSAoaGVyKS4KLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhPcmdhbml6YXRpb24uQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dE51bGwoT3JnYW5pemF0aW9uLkNPTVBBTlkpCi0gICAgICAgICAgICAgICAgLnB1dChPcmdhbml6YXRpb24uREVQQVJUTUVOVCwgIkRlcGFydG1lbnRYWCIpCi0gICAgICAgICAgICAgICAgLnB1dE51bGwoT3JnYW5pemF0aW9uLlRJVExFKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhPcmdhbml6YXRpb24uQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChPcmdhbml6YXRpb24uQ09NUEFOWSwgIkNvbXBhbnlYWVoiKQotICAgICAgICAgICAgICAgIC5wdXROdWxsKE9yZ2FuaXphdGlvbi5ERVBBUlRNRU5UKQotICAgICAgICAgICAgICAgIC5wdXQoT3JnYW5pemF0aW9uLlRJVExFLCAiVGl0bGVYWVpZWCIpOwotICAgICAgICAvLyBDdXJyZW50bHkgd2UgZG8gbm90IHVzZSBncm91cCBidXQgZGVwZW5kIG9uIHRoZSBvcmRlci4KLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW1XaXRoRW1wdHlOYW1lKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJPUkciLCAiQ29tcGFueVg7RGVwYXJ0bWVudFkiLAotICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdCgiQ29tcGFueVgiLCAiRGVwYXJ0bWVudFkiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJUSVRMRSIsICJUaXRsZVoiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIk9SRyIsICJEZXBhcnRtZW50WFgiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIk9SRyIsICJDb21wYW55WFlaIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJUSVRMRSIsICJUaXRsZVhZWllYIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE9yZ2FuaXphdGlvblYyMSgpIHsKLSAgICAgICAgdGVzdE9yZ2FuaXphdGlvbkNvbW1vbihWMjEpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RPcmdhbml6YXRpb25WMzAoKSB7Ci0gICAgICAgIHRlc3RPcmdhbml6YXRpb25Db21tb24oVjMwKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdGVzdEltVmFyaW91c1R5cGVTdXBwb3J0Q29tbW9uKGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KHZjYXJkVHlwZSk7Ci0gICAgICAgIENvbnRhY3RFbnRyeSBlbnRyeSA9IG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoSW0uQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChJbS5QUk9UT0NPTCwgSW0uUFJPVE9DT0xfQUlNKQotICAgICAgICAgICAgICAgIC5wdXQoSW0uREFUQSwgImFpbSIpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKEltLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoSW0uUFJPVE9DT0wsIEltLlBST1RPQ09MX01TTikKLSAgICAgICAgICAgICAgICAucHV0KEltLkRBVEEsICJtc24iKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhJbS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KEltLlBST1RPQ09MLCBJbS5QUk9UT0NPTF9ZQUhPTykKLSAgICAgICAgICAgICAgICAucHV0KEltLkRBVEEsICJ5YWhvbyIpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKEltLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoSW0uUFJPVE9DT0wsIEltLlBST1RPQ09MX1NLWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoSW0uREFUQSwgInNreXBlIik7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoSW0uQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChJbS5QUk9UT0NPTCwgSW0uUFJPVE9DT0xfUVEpCi0gICAgICAgICAgICAgICAgLnB1dChJbS5EQVRBLCAicXEiKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhJbS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KEltLlBST1RPQ09MLCBJbS5QUk9UT0NPTF9HT09HTEVfVEFMSykKLSAgICAgICAgICAgICAgICAucHV0KEltLkRBVEEsICJnb29nbGUgdGFsayIpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKEltLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoSW0uUFJPVE9DT0wsIEltLlBST1RPQ09MX0lDUSkKLSAgICAgICAgICAgICAgICAucHV0KEltLkRBVEEsICJpY3EiKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhJbS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KEltLlBST1RPQ09MLCBJbS5QUk9UT0NPTF9KQUJCRVIpCi0gICAgICAgICAgICAgICAgLnB1dChJbS5EQVRBLCAiamFiYmVyIik7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoSW0uQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChJbS5QUk9UT0NPTCwgSW0uUFJPVE9DT0xfTkVUTUVFVElORykKLSAgICAgICAgICAgICAgICAucHV0KEltLkRBVEEsICJuZXRtZWV0aW5nIik7Ci0KLSAgICAgICAgLy8gTm8gZGV0ZXJtaW5lZCB3YXkgdG8gZXhwcmVzcyB1bmtub3duIHR5cGUuLi4KLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW1XaXRoRW1wdHlOYW1lKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLUpBQkJFUiIsICJqYWJiZXIiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtSUNRIiwgImljcSIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1HT09HTEUtVEFMSyIsICJnb29nbGUgdGFsayIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1RUSIsICJxcSIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1TS1lQRS1VU0VSTkFNRSIsICJza3lwZSIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1ZQUhPTyIsICJ5YWhvbyIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1NU04iLCAibXNuIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLU5FVE1FRVRJTkciLCAibmV0bWVldGluZyIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1BSU0iLCAiYWltIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEltQmFzaVYyMSgpIHsKLSAgICAgICAgdGVzdEltVmFyaW91c1R5cGVTdXBwb3J0Q29tbW9uKFYyMSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEltQmFzaWNWMzAoKSB7Ci0gICAgICAgIHRlc3RJbVZhcmlvdXNUeXBlU3VwcG9ydENvbW1vbihWMzApOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB0ZXN0SW1QcmVmSGFuZGxpbmdDb21tb24oaW50IHZjYXJkVHlwZSkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckV4cG9ydFRlc3QodmNhcmRUeXBlKTsKLSAgICAgICAgQ29udGFjdEVudHJ5IGVudHJ5ID0gbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhJbS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KEltLlBST1RPQ09MLCBJbS5QUk9UT0NPTF9BSU0pCi0gICAgICAgICAgICAgICAgLnB1dChJbS5EQVRBLCAiYWltMSIpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKEltLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoSW0uUFJPVE9DT0wsIEltLlBST1RPQ09MX0FJTSkKLSAgICAgICAgICAgICAgICAucHV0KEltLkRBVEEsICJhaW0yIikKLSAgICAgICAgICAgICAgICAucHV0KEltLlRZUEUsIEltLlRZUEVfSE9NRSkKLSAgICAgICAgICAgICAgICAucHV0KEltLklTX1BSSU1BUlksIDEpOwotCi0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtV2l0aEVtcHR5TmFtZSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1BSU0iLCAiYWltMSIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1BSU0iLCAiYWltMiIsIG5ldyBUeXBlU2V0KCJIT01FIiwgIlBSRUYiKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEltUHJlZkhhbmRsaW5nVjIxKCkgewotICAgICAgICB0ZXN0SW1QcmVmSGFuZGxpbmdDb21tb24oVjIxKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW1QcmVmSGFuZGxpbmdWMzAoKSB7Ci0gICAgICAgIHRlc3RJbVByZWZIYW5kbGluZ0NvbW1vbihWMzApOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB0ZXN0V2Vic2l0ZUNvbW1vbihpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdCh2Y2FyZFR5cGUpOwotICAgICAgICBDb250YWN0RW50cnkgZW50cnkgPSBtVmVyaWZpZXIuYWRkSW5wdXRFbnRyeSgpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFdlYnNpdGUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChXZWJzaXRlLlVSTCwgImh0dHA6Ly93ZWJzaXRlLmV4YW1wbGUuYW5kcm9pZC5jb20vaW5kZXguaHRtbCIpCi0gICAgICAgICAgICAgICAgLnB1dChXZWJzaXRlLlRZUEUsIFdlYnNpdGUuVFlQRV9CTE9HKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhXZWJzaXRlLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoV2Vic2l0ZS5VUkwsICJmdHA6Ly9mdHAuZXhhbXBsZS5hbmRyb2lkLmNvbS9pbmRleC5odG1sIikKLSAgICAgICAgICAgICAgICAucHV0KFdlYnNpdGUuVFlQRSwgV2Vic2l0ZS5UWVBFX0ZUUCk7Ci0KLSAgICAgICAgLy8gV2UgZHJvcCBUWVBFIGluZm9ybWF0aW9uIHNpbmNlIHZDYXJkIChlc3BlY2lhbGx5IDMuMCkgZG9lcyBub3QgYWxsb3cgdXMgdG8gZW1pdCBpdC4KLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW1XaXRoRW1wdHlOYW1lKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJVUkwiLCAiZnRwOi8vZnRwLmV4YW1wbGUuYW5kcm9pZC5jb20vaW5kZXguaHRtbCIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiVVJMIiwgImh0dHA6Ly93ZWJzaXRlLmV4YW1wbGUuYW5kcm9pZC5jb20vaW5kZXguaHRtbCIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RXZWJzaXRlVjIxKCkgewotICAgICAgICB0ZXN0V2Vic2l0ZUNvbW1vbihWMjEpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RXZWJzaXRlVjMwKCkgewotICAgICAgICB0ZXN0V2Vic2l0ZUNvbW1vbihWMzApOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGdldEFuZHJvaWRQcm9wVmFsdWUoZmluYWwgU3RyaW5nIG1pbWVUeXBlLCBTdHJpbmcgdmFsdWUsIEludGVnZXIgdHlwZSkgewotICAgICAgICByZXR1cm4gZ2V0QW5kcm9pZFByb3BWYWx1ZShtaW1lVHlwZSwgdmFsdWUsIHR5cGUsIG51bGwpOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGdldEFuZHJvaWRQcm9wVmFsdWUoZmluYWwgU3RyaW5nIG1pbWVUeXBlLCBTdHJpbmcgdmFsdWUsCi0gICAgICAgICAgICBJbnRlZ2VyIHR5cGUsIFN0cmluZyBsYWJlbCkgewotICAgICAgICByZXR1cm4gKG1pbWVUeXBlICsgIjsiICsgdmFsdWUgKyAiOyIKLSAgICAgICAgICAgICAgICArICh0eXBlICE9IG51bGwgPyB0eXBlIDogIiIpICsgIjsiCi0gICAgICAgICAgICAgICAgKyAobGFiZWwgIT0gbnVsbCA/IGxhYmVsIDogIiIpICsgIjs7Ozs7Ozs7Ozs7OyIpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB0ZXN0RXZlbnRDb21tb24oaW50IHZjYXJkVHlwZSkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckV4cG9ydFRlc3QodmNhcmRUeXBlKTsKLSAgICAgICAgQ29udGFjdEVudHJ5IGVudHJ5ID0gbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhFdmVudC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KEV2ZW50LlRZUEUsIEV2ZW50LlRZUEVfQU5OSVZFUlNBUlkpCi0gICAgICAgICAgICAgICAgLnB1dChFdmVudC5TVEFSVF9EQVRFLCAiMTk4Mi0wNi0xNiIpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKEV2ZW50LkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoRXZlbnQuVFlQRSwgRXZlbnQuVFlQRV9CSVJUSERBWSkKLSAgICAgICAgICAgICAgICAucHV0KEV2ZW50LlNUQVJUX0RBVEUsICIyMDA4LTEwLTIyIik7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoRXZlbnQuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChFdmVudC5UWVBFLCBFdmVudC5UWVBFX09USEVSKQotICAgICAgICAgICAgICAgIC5wdXQoRXZlbnQuU1RBUlRfREFURSwgIjIwMTgtMDMtMTIiKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhFdmVudC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KEV2ZW50LlRZUEUsIEV2ZW50LlRZUEVfQ1VTVE9NKQotICAgICAgICAgICAgICAgIC5wdXQoRXZlbnQuTEFCRUwsICJUaGUgbGFzdCBkYXkiKQotICAgICAgICAgICAgICAgIC5wdXQoRXZlbnQuU1RBUlRfREFURSwgIldoZW4gdGhlIFRvd2VyIG9mIEhhbm9pIHdpdGggNjQgcmluZ3MgaXMgY29tcGxldGVkLiIpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKEV2ZW50LkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoRXZlbnQuVFlQRSwgRXZlbnQuVFlQRV9CSVJUSERBWSkKLSAgICAgICAgICAgICAgICAucHV0KEV2ZW50LlNUQVJUX0RBVEUsICIyMDA5LTA1LTE5Iik7ICAvLyBTaG91bGQgYmUgaWdub3JlZC4KLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW1XaXRoRW1wdHlOYW1lKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJCREFZIiwgIjIwMDgtMTAtMjIiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtQU5EUk9JRC1DVVNUT00iLAotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0QW5kcm9pZFByb3BWYWx1ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnQuQ09OVEVOVF9JVEVNX1RZUEUsICIxOTgyLTA2LTE2IiwgRXZlbnQuVFlQRV9BTk5JVkVSU0FSWSkpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1BTkRST0lELUNVU1RPTSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBnZXRBbmRyb2lkUHJvcFZhbHVlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFdmVudC5DT05URU5UX0lURU1fVFlQRSwgIjIwMTgtMDMtMTIiLCBFdmVudC5UWVBFX09USEVSKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLUFORFJPSUQtQ1VTVE9NIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGdldEFuZHJvaWRQcm9wVmFsdWUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50LkNPTlRFTlRfSVRFTV9UWVBFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiV2hlbiB0aGUgVG93ZXIgb2YgSGFub2kgd2l0aCA2NCByaW5ncyBpcyBjb21wbGV0ZWQuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnQuVFlQRV9DVVNUT00sICJUaGUgbGFzdCBkYXkiKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEV2ZW50VjIxKCkgewotICAgICAgICB0ZXN0RXZlbnRDb21tb24oVjIxKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RXZlbnRWMzAoKSB7Ci0gICAgICAgIHRlc3RFdmVudENvbW1vbihWMzApOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB0ZXN0Tm90ZUNvbW1vbihpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdCh2Y2FyZFR5cGUpOwotICAgICAgICBDb250YWN0RW50cnkgZW50cnkgPSBtVmVyaWZpZXIuYWRkSW5wdXRFbnRyeSgpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKE5vdGUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChOb3RlLk5PVEUsICJub3RlMSIpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKE5vdGUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChOb3RlLk5PVEUsICJub3RlMiIpCi0gICAgICAgICAgICAgICAgLnB1dChOb3RlLklTX1BSSU1BUlksIDEpOyAgLy8gSnVzdCBpZ25vcmVkLgotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbVdpdGhFbXB0eU5hbWUoKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIk5PVEUiLCAibm90ZTEiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIk5PVEUiLCAibm90ZTIiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Tm90ZVYyMSgpIHsKLSAgICAgICAgdGVzdE5vdGVDb21tb24oVjIxKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Tm90ZVYzMCgpIHsKLSAgICAgICAgdGVzdE5vdGVDb21tb24oVjMwKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdGVzdFBob3RvQ29tbW9uKGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgZmluYWwgYm9vbGVhbiBpc1YzMCA9IHZjYXJkVHlwZSA9PSBWMzA7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdCh2Y2FyZFR5cGUpOwotICAgICAgICBDb250YWN0RW50cnkgZW50cnkgPSBtVmVyaWZpZXIuYWRkSW5wdXRFbnRyeSgpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRkFNSUxZX05BTUUsICJQaG90b1Rlc3QiKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhQaG90by5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob3RvLlBIT1RPLCBzUGhvdG9CeXRlQXJyYXkpOwotCi0gICAgICAgIENvbnRlbnRWYWx1ZXMgY29udGVudFZhbHVlc0ZvclBob3RvID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKLSAgICAgICAgY29udGVudFZhbHVlc0ZvclBob3RvLnB1dCgiRU5DT0RJTkciLCAoaXNWMzAgPyAiYiIgOiAiQkFTRTY0IikpOwotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiRk4iLCAiUGhvdG9UZXN0IikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJOIiwgIlBob3RvVGVzdDs7OzsiLAotICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdCgiUGhvdG9UZXN0IiwgIiIsICIiLCAiIiwgIiIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIlBIT1RPIiwgbnVsbCwgbnVsbCwgc1Bob3RvQnl0ZUFycmF5LAotICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudFZhbHVlc0ZvclBob3RvLCBuZXcgVHlwZVNldCgiSlBFRyIpLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGhvdG9WMjEoKSB7Ci0gICAgICAgIHRlc3RQaG90b0NvbW1vbihWMjEpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQaG90b1YzMCgpIHsKLSAgICAgICAgdGVzdFBob3RvQ29tbW9uKFYzMCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRlc3RSZWxhdGlvbkNvbW1vbihpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdCh2Y2FyZFR5cGUpOwotICAgICAgICBtVmVyaWZpZXIuYWRkSW5wdXRFbnRyeSgpLmFkZENvbnRlbnRWYWx1ZXMoUmVsYXRpb24uQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChSZWxhdGlvbi5UWVBFLCBSZWxhdGlvbi5UWVBFX01PVEhFUikKLSAgICAgICAgICAgICAgICAucHV0KFJlbGF0aW9uLk5BTUUsICJNcy4gTW90aGVyIik7Ci0gICAgICAgIG1WZXJpZmllci5hZGRDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtKCkuYWRkRXhwZWN0ZWQoUmVsYXRpb24uQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChSZWxhdGlvbi5UWVBFLCBSZWxhdGlvbi5UWVBFX01PVEhFUikKLSAgICAgICAgICAgICAgICAucHV0KFJlbGF0aW9uLk5BTUUsICJNcy4gTW90aGVyIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFJlbGF0aW9uVjIxKCkgewotICAgICAgICB0ZXN0UmVsYXRpb25Db21tb24oVjIxKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVsYXRpb25WMzAoKSB7Ci0gICAgICAgIHRlc3RSZWxhdGlvbkNvbW1vbihWMzApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RWMzBIYW5kbGVFc2NhcGUoKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdChWMzApOwotICAgICAgICBtVmVyaWZpZXIuYWRkSW5wdXRFbnRyeSgpLmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5GQU1JTFlfTkFNRSwgIlxcIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkdJVkVOX05BTUUsICI7IikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLk1JRERMRV9OQU1FLCAiLCIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QUkVGSVgsICJcbiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5ESVNQTEFZX05BTUUsICJbPHtVbmVzY2FwZWQ6QXNjaWlzfT5dIik7Ci0gICAgICAgIC8vIFZlcmlmaWVzIHRoZSB2Q2FyZCBTdHJpbmcgY29ycmVjdGx5IGVzY2FwZXMgZWFjaCBjaGFyYWN0ZXIgd2hpY2ggbXVzdCBiZSBlc2NhcGVkLgotICAgICAgICBtVmVyaWZpZXIuYWRkTGluZVZlcmlmaWVyRWxlbSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkKCJOOlxcXFw7XFw7O1xcLDtcXG47IikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWQoIkZOOls8e1VuZXNjYXBlZDpBc2NpaXN9Pl0iKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0oKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIkZOIiwgIls8e1VuZXNjYXBlZDpBc2NpaXN9Pl0iKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIk4iLCBBcnJheXMuYXNMaXN0KCJcXCIsICI7IiwgIiwiLCAiXG4iLCAiIikpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZXJlJ3Mgbm8gIk5JQ0tOQU1FIiBwcm9wZXJ0eSBpbiB2Q2FyZCAyLjEsIHdoaWxlIHRoZXJlIGlzIGluIHZDYXJkIDMuMC4KLSAgICAgKiBXZSB1c2UgQW5kcm9pZC1zcGVjaWZpYyAiWC1BTkRST0lELUNVU1RPTSIgcHJvcGVydHkuCi0gICAgICogVGhpcyB0ZXN0IHZlcmlmaWVzIHRoZSBmdW5jdGlvbmFsaXR5LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3ROaWNrTmFtZVYyMSgpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KFYyMSk7Ci0gICAgICAgIG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCkuYWRkQ29udGVudFZhbHVlcyhOaWNrbmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KE5pY2tuYW1lLk5BTUUsICJOaWNreSIpOwotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbVdpdGhFbXB0eU5hbWUoKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtQU5EUk9JRC1DVVNUT00iLAotICAgICAgICAgICAgICAgICAgICAgICAgTmlja25hbWUuQ09OVEVOVF9JVEVNX1RZUEUgKyAiO05pY2t5Ozs7Ozs7Ozs7Ozs7OzsiKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0oKS5hZGRFeHBlY3RlZChOaWNrbmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KE5pY2tuYW1lLk5BTUUsICJOaWNreSIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RUb2xlcmF0ZUJyb2tlblBob25lTnVtYmVyRW50cnlWMjEoKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdChWMjEpOwotICAgICAgICBDb250YWN0RW50cnkgZW50cnkgPSBtVmVyaWZpZXIuYWRkSW5wdXRFbnRyeSgpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9IT01FKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiMTExLTIyMi0zMzMzIChNaWFtaSlcbjQ0NC01NTU1LTY2NiAoVG9reW8pOyIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIjc3Ny04ODgtOTk5OSAoQ2hpY2Fnbyk7MTExLTIyMi0zMzMzIChNaWFtaSkiKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW1XaXRoRW1wdHlOYW1lKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiMTExLTIyMi0zMzMzIiwgbmV3IFR5cGVTZXQoIkhPTUUiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiNDQ0LTU1NS01NjY2IiwgbmV3IFR5cGVTZXQoIkhPTUUiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiNzc3LTg4OC05OTk5IiwgbmV3IFR5cGVTZXQoIkhPTUUiKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRlc3RQaWNrVXBOb25FbXB0eUNvbnRlbnRWYWx1ZXNDb21tb24oaW50IHZjYXJkVHlwZSkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckV4cG9ydFRlc3QodmNhcmRUeXBlKTsKLSAgICAgICAgQ29udGFjdEVudHJ5IGVudHJ5ID0gbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLklTX1BSSU1BUlksIDEpOyAgLy8gRW1wdHkgbmFtZS4gU2hvdWxkIGJlIGlnbm9yZWQuCi0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5GQU1JTFlfTkFNRSwgImZhbWlseTEiKTsgIC8vIE5vdCBwcmltYXJ5LiBTaG91bGQgYmUgaWdub3JlZC4KLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLklTX1BSSU1BUlksIDEpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5GQU1JTFlfTkFNRSwgImZhbWlseTIiKTsgIC8vIFRoaXMgZW50cnkgaXMgd2hhdCB3ZSB3YW50LgotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuSVNfUFJJTUFSWSwgMSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkZBTUlMWV9OQU1FLCAiZmFtaWx5MyIpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRkFNSUxZX05BTUUsICJmYW1pbHk0Iik7Ci0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJOIiwgQXJyYXlzLmFzTGlzdCgiZmFtaWx5MiIsICIiLCAiIiwgIiIsICIiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJGTiIsICJmYW1pbHkyIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBpY2tVcE5vbkVtcHR5Q29udGVudFZhbHVlc1YyMSgpIHsKLSAgICAgICAgdGVzdFBpY2tVcE5vbkVtcHR5Q29udGVudFZhbHVlc0NvbW1vbihWMjEpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQaWNrVXBOb25FbXB0eUNvbnRlbnRWYWx1ZXNWMzAoKSB7Ci0gICAgICAgIHRlc3RQaWNrVXBOb25FbXB0eUNvbnRlbnRWYWx1ZXNDb21tb24oVjMwKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRJbXBvcnRlclRlc3RzLmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRJbXBvcnRlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxZjIyNTQuLjAwMDAwMDAKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkSW1wb3J0ZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC5waW0udmNhcmQ7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFZhbHVlczsKLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5WQ2FyZENvbmZpZzsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuRGF0YTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLkVtYWlsOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuRXZlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5Ob3RlOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuT3JnYW5pemF0aW9uOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuUGhvbmU7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5QaG90bzsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLlN0cnVjdHVyZWROYW1lOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuU3RydWN0dXJlZFBvc3RhbDsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLldlYnNpdGU7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5mcmFtZXdvcmtzLmNvcmV0ZXN0cy5SOwotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLlByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0uVHlwZVNldDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLXB1YmxpYyBjbGFzcyBWQ2FyZEltcG9ydGVyVGVzdHMgZXh0ZW5kcyBWQ2FyZFRlc3RzQmFzZSB7Ci0gICAgLy8gUHVzaCBkYXRhIGludG8gaW50IGFycmF5IGF0IGZpcnN0IHNpbmNlIHZhbHVlcyBsaWtlIDB4ODAgYXJlCi0gICAgLy8gaW50ZXJwcmV0ZWQgYXMgaW50IGJ5IHRoZSBjb21waWxlciBhbmQgY2FzdGluZyBhbGwgb2YgdGhlbSBpcwotICAgIC8vIGN1bWJlcnNvbWUuLi4KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnRbXSBzUGhvdG9JbnRBcnJheUZvckNvbXBsaWNhdGVkQ2FzZSA9IHsKLSAgICAgICAgMHhmZiwgMHhkOCwgMHhmZiwgMHhlMSwgMHgwYSwgMHgwZiwgMHg0NSwgMHg3OCwgMHg2OSwgMHg2NiwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHg0ZCwgMHg0ZCwgMHgwMCwgMHgyYSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwMCwgMHgwZCwKLSAgICAgICAgMHgwMSwgMHgwZSwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwZiwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHhhYSwgMHgwMSwgMHgwZiwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNywgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHhiYSwgMHgwMSwgMHgxMCwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNiwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHhjMiwgMHgwMSwgMHgxMiwgMHgwMCwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwKLSAgICAgICAgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMSwgMHgxYSwgMHgwMCwgMHgwNSwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHhjOCwgMHgwMSwgMHgxYiwgMHgwMCwgMHgwNSwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHhkMCwgMHgwMSwgMHgyOCwgMHgwMCwgMHgwMywgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMCwgMHgwMSwgMHgzMSwgMHgwMCwgMHgwMiwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwZSwgMHgwMCwgMHgwMCwgMHgwMCwgMHhkOCwgMHgwMSwgMHgzMiwgMHgwMCwKLSAgICAgICAgMHgwMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhlNiwgMHgwMiwgMHgxMywKLSAgICAgICAgMHgwMCwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHg4MiwKLSAgICAgICAgMHg5OCwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwZSwgMHgwMCwgMHgwMCwgMHgwMCwgMHhmYSwKLSAgICAgICAgMHg4NywgMHg2OSwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMSwKLSAgICAgICAgMHg4NCwgMHhjNCwgMHhhNSwgMHgwMCwgMHgwNywgMHgwMCwgMHgwMCwgMHgwMCwgMHg3YywgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMSwgMHgwOCwgMHgwMCwgMHgwMCwgMHgwNCwgMHgxZSwgMHgzMiwgMHgzMCwgMHgzMCwgMHgzOCwgMHgzMSwKLSAgICAgICAgMHgzMCwgMHgzMiwgMHgzOSwgMHgzMSwgMHgzMywgMHgzNSwgMHgzNSwgMHgzMywgMHgzMSwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHg0NCwgMHg2ZiwgMHg0MywgMHg2ZiwgMHg0ZCwgMHg2ZiwgMHgwMCwgMHgwMCwgMHg0NCwgMHgzOSwgMHgzMCwKLSAgICAgICAgMHgzNSwgMHg2OSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg0OCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHg0OCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHg0NCwgMHgzOSwgMHgzMCwKLSAgICAgICAgMHgzNSwgMHg2OSwgMHgyMCwgMHg1NiwgMHg2NSwgMHg3MiwgMHgzMSwgMHgyZSwgMHgzMCwgMHgzMCwgMHgwMCwKLSAgICAgICAgMHgzMiwgMHgzMCwgMHgzMCwgMHgzOCwgMHgzYSwgMHgzMSwgMHgzMCwgMHgzYSwgMHgzMiwgMHgzOSwgMHgyMCwKLSAgICAgICAgMHgzMSwgMHgzMywgMHgzYSwgMHgzNSwgMHgzNSwgMHgzYSwgMHgzNCwgMHgzNywgMHgwMCwgMHgyMCwgMHgyMCwKLSAgICAgICAgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwKLSAgICAgICAgMHgwMCwgMHg1MCwgMHg3MiwgMHg2OSwgMHg2ZSwgMHg3NCwgMHg0OSwgMHg0ZCwgMHgwMCwgMHgzMCwgMHgzMywKLSAgICAgICAgMHgzMCwgMHgzMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNiwgMHgwMCwgMHgwMSwgMHgwMCwgMHgxNCwgMHgwMCwKLSAgICAgICAgMHgxNCwgMHgwMCwgMHgwMiwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMywgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgzNCwgMHgwMSwgMHgwMCwgMHgwNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMSwgMHgwMSwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgxMCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgxMSwgMHgwOSwgMHgwMCwgMHgwMCwgMHgyNywgMHgxMCwgMHgwMCwgMHgwMCwgMHgwZiwgMHgwYiwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgyNywgMHgxMCwgMHgwMCwgMHgwMCwgMHgwNSwgMHg5NywgMHgwMCwgMHgwMCwgMHgyNywgMHgxMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwOCwgMHhiMCwgMHgwMCwgMHgwMCwgMHgyNywgMHgxMCwgMHgwMCwgMHgwMCwgMHgxYywKLSAgICAgICAgMHgwMSwgMHgwMCwgMHgwMCwgMHgyNywgMHgxMCwgMHgwMCwgMHgwMCwgMHgwMiwgMHg1ZSwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgyNywgMHgxMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4YiwgMHgwMCwgMHgwMCwgMHgyNywgMHgxMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMywgMHhjYiwgMHgwMCwgMHgwMCwgMHgyNywgMHgxMCwgMHgwMCwgMHgwMCwgMHgxYiwgMHhlNSwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgyNywgMHgxMCwgMHgwMCwgMHgyOCwgMHg4MiwgMHg5YSwgMHgwMCwgMHgwNSwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMywgMHg2YSwgMHg4MiwgMHg5ZCwgMHgwMCwgMHgwNSwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMywgMHg3MiwgMHg4OCwgMHgyMiwgMHgwMCwKLSAgICAgICAgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMCwgMHg5MCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNCwgMHgzMCwgMHgzMiwgMHgzMiwgMHgzMCwgMHg5MCwKLSAgICAgICAgMHgwMywgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxNCwgMHgwMCwgMHgwMCwgMHgwMywgMHg3YSwKLSAgICAgICAgMHg5MCwgMHgwNCwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxNCwgMHgwMCwgMHgwMCwgMHgwMywKLSAgICAgICAgMHg4ZSwgMHg5MSwgMHgwMSwgMHgwMCwgMHgwNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMSwgMHgwMiwKLSAgICAgICAgMHgwMywgMHgwMCwgMHg5MSwgMHgwMiwgMHgwMCwgMHgwNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMywgMHhhMiwgMHg5MiwgMHgwMSwgMHgwMCwgMHgwYSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMywgMHhhYSwgMHg5MiwgMHgwMiwgMHgwMCwgMHgwNSwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMywgMHhiMiwgMHg5MiwgMHgwNCwgMHgwMCwgMHgwYSwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMywgMHhiYSwgMHg5MiwgMHgwNSwgMHgwMCwgMHgwNSwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMywgMHhjMiwgMHg5MiwgMHgwNywgMHgwMCwgMHgwMywKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMCwgMHg5MiwgMHgwOCwgMHgwMCwKLSAgICAgICAgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5MiwgMHgwOSwKLSAgICAgICAgMHgwMCwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5MiwKLSAgICAgICAgMHgwYSwgMHgwMCwgMHgwNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMywgMHhjYSwKLSAgICAgICAgMHg5MiwgMHg3YywgMHgwMCwgMHgwNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHg5MiwgMHg4NiwgMHgwMCwgMHgwNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgxNiwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMywgMHhkMiwgMHhhMCwgMHgwMCwgMHgwMCwgMHgwNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNCwgMHgzMCwKLSAgICAgICAgMHgzMSwgMHgzMCwgMHgzMCwgMHhhMCwgMHgwMSwgMHgwMCwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwKLSAgICAgICAgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHhhMCwgMHgwMiwgMHgwMCwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMSwgMHgwMCwgMHg2MCwgMHgwMCwgMHgwMCwgMHhhMCwgMHgwMywgMHgwMCwgMHgwMywgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMSwgMHgwMCwgMHg0OCwgMHgwMCwgMHgwMCwgMHhhMCwgMHgwNSwgMHgwMCwgMHgwNCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHhhMiwgMHgwZSwgMHgwMCwgMHgwNSwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMywgMHhlOCwgMHhhMiwgMHgwZiwgMHgwMCwKLSAgICAgICAgMHgwNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMywgMHhmMCwgMHhhMiwgMHgxMCwKLSAgICAgICAgMHgwMCwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMCwgMHhhMiwKLSAgICAgICAgMHgxNywgMHgwMCwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHhhMywgMHgwMCwgMHgwMCwgMHgwNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMywgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHhhMywgMHgwMSwgMHgwMCwgMHgwNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMSwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHhhNCwgMHgwMSwgMHgwMCwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHhhNCwgMHgwMiwgMHgwMCwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhhNCwgMHgwMywgMHgwMCwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhhNCwgMHgwNCwgMHgwMCwgMHgwNSwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMywgMHhmOCwgMHhhNCwgMHgwNSwgMHgwMCwgMHgwMywgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgxZCwgMHgwMCwgMHgwMCwgMHhhNCwgMHgwNiwgMHgwMCwgMHgwMywKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhhNCwgMHgwNywgMHgwMCwKLSAgICAgICAgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhhNCwgMHgwOCwKLSAgICAgICAgMHgwMCwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhhNCwKLSAgICAgICAgMHgwOSwgMHgwMCwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHhhNCwgMHgwYSwgMHgwMCwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHhhNCwgMHgwYywgMHgwMCwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMiwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg1MywgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgyNywgMHgxMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHg1ZSwgMHgwMCwgMHgwMCwgMHgwMCwgMHg2NCwKLSAgICAgICAgMHgzMiwgMHgzMCwgMHgzMCwgMHgzOCwgMHgzYSwgMHgzMSwgMHgzMCwgMHgzYSwgMHgzMiwgMHgzOSwgMHgyMCwKLSAgICAgICAgMHgzMSwgMHgzMywgMHgzYSwgMHgzNSwgMHgzNSwgMHgzYSwgMHgzMywgMHgzMSwgMHgwMCwgMHgzMiwgMHgzMCwKLSAgICAgICAgMHgzMCwgMHgzOCwgMHgzYSwgMHgzMSwgMHgzMCwgMHgzYSwgMHgzMiwgMHgzOSwgMHgyMCwgMHgzMSwgMHgzMywKLSAgICAgICAgMHgzYSwgMHgzNSwgMHgzNSwgMHgzYSwgMHgzNCwgMHgzNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgyOSwgMHg4OCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgxYiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMiwgMHhiMiwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHg2NCwgMHgwMCwgMHgwMCwgMHgwMSwgMHg1ZSwgMHgwMCwgMHgwMCwgMHgwMCwgMHg2NCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg2NCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgyNSwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwYSwgMHgwMCwgMHgwMCwgMHgwZSwgMHg5MiwgMHgwMCwgMHgwMCwgMHgwMywgMHhlOCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgzMiwgMHgzMCwgMHgzMCwKLSAgICAgICAgMHgzOCwgMHgzMSwgMHgzMCwgMHgzMiwgMHgzOSwgMHgzMSwgMHgzMywgMHgzNSwgMHgzNSwgMHgzMywgMHgzMSwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgyMCwgMHgyYSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwYSwgMHgwMCwgMHgwMCwgMHgyYSwKLSAgICAgICAgMHhlMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwYSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwNCwgMHg1MiwgMHgzOSwgMHgzOCwgMHgwMCwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwNywgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwNCwgMHgzMCwgMHgzMSwgMHgzMCwgMHgzMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwNiwgMHgwMSwgMHgwMywgMHgwMCwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwNiwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMSwgMHgxYSwgMHgwMCwgMHgwNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwNCwgMHg2YywgMHgwMSwgMHgxYiwgMHgwMCwgMHgwNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwNCwgMHg3NCwgMHgwMSwgMHgyOCwgMHgwMCwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMSwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMCwgMHgwMiwgMHgwMSwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwNCwgMHg3YywgMHgwMiwgMHgwMiwgMHgwMCwgMHgwNCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwNSwgMHg4YiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHg0OCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHg0OCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHhmZiwgMHhkOCwgMHhmZiwgMHhkYiwgMHgwMCwgMHg4NCwKLSAgICAgICAgMHgwMCwgMHgyMCwgMHgxNiwgMHgxOCwgMHgxYywgMHgxOCwgMHgxNCwgMHgyMCwgMHgxYywgMHgxYSwgMHgxYywKLSAgICAgICAgMHgyNCwgMHgyMiwgMHgyMCwgMHgyNiwgMHgzMCwgMHg1MCwgMHgzNCwgMHgzMCwgMHgyYywgMHgyYywgMHgzMCwKLSAgICAgICAgMHg2MiwgMHg0NiwgMHg0YSwgMHgzYSwgMHg1MCwgMHg3NCwgMHg2NiwgMHg3YSwgMHg3OCwgMHg3MiwgMHg2NiwKLSAgICAgICAgMHg3MCwgMHg2ZSwgMHg4MCwgMHg5MCwgMHhiOCwgMHg5YywgMHg4MCwgMHg4OCwgMHhhZSwgMHg4YSwgMHg2ZSwKLSAgICAgICAgMHg3MCwgMHhhMCwgMHhkYSwgMHhhMiwgMHhhZSwgMHhiZSwgMHhjNCwgMHhjZSwgMHhkMCwgMHhjZSwgMHg3YywKLSAgICAgICAgMHg5YSwgMHhlMiwgMHhmMiwgMHhlMCwgMHhjOCwgMHhmMCwgMHhiOCwgMHhjYSwgMHhjZSwgMHhjNiwgMHgwMSwKLSAgICAgICAgMHgyMiwgMHgyNCwgMHgyNCwgMHgzMCwgMHgyYSwgMHgzMCwgMHg1ZSwgMHgzNCwgMHgzNCwgMHg1ZSwgMHhjNiwKLSAgICAgICAgMHg4NCwgMHg3MCwgMHg4NCwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwKLSAgICAgICAgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwKLSAgICAgICAgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwKLSAgICAgICAgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwKLSAgICAgICAgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhjNiwgMHhmZiwgMHhjMCwKLSAgICAgICAgMHgwMCwgMHgxMSwgMHgwOCwgMHgwMCwgMHg3OCwgMHgwMCwgMHhhMCwgMHgwMywgMHgwMSwgMHgyMSwgMHgwMCwKLSAgICAgICAgMHgwMiwgMHgxMSwgMHgwMSwgMHgwMywgMHgxMSwgMHgwMSwgMHhmZiwgMHhjNCwgMHgwMSwgMHhhMiwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMSwgMHgwNSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwKLSAgICAgICAgMHgwNiwgMHgwNywgMHgwOCwgMHgwOSwgMHgwYSwgMHgwYiwgMHgxMCwgMHgwMCwgMHgwMiwgMHgwMSwgMHgwMywKLSAgICAgICAgMHgwMywgMHgwMiwgMHgwNCwgMHgwMywgMHgwNSwgMHgwNSwgMHgwNCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMSwKLSAgICAgICAgMHg3ZCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwMCwgMHgwNCwgMHgxMSwgMHgwNSwgMHgxMiwgMHgyMSwgMHgzMSwKLSAgICAgICAgMHg0MSwgMHgwNiwgMHgxMywgMHg1MSwgMHg2MSwgMHgwNywgMHgyMiwgMHg3MSwgMHgxNCwgMHgzMiwgMHg4MSwKLSAgICAgICAgMHg5MSwgMHhhMSwgMHgwOCwgMHgyMywgMHg0MiwgMHhiMSwgMHhjMSwgMHgxNSwgMHg1MiwgMHhkMSwgMHhmMCwKLSAgICAgICAgMHgyNCwgMHgzMywgMHg2MiwgMHg3MiwgMHg4MiwgMHgwOSwgMHgwYSwgMHgxNiwgMHgxNywgMHgxOCwgMHgxOSwKLSAgICAgICAgMHgxYSwgMHgyNSwgMHgyNiwgMHgyNywgMHgyOCwgMHgyOSwgMHgyYSwgMHgzNCwgMHgzNSwgMHgzNiwgMHgzNywKLSAgICAgICAgMHgzOCwgMHgzOSwgMHgzYSwgMHg0MywgMHg0NCwgMHg0NSwgMHg0NiwgMHg0NywgMHg0OCwgMHg0OSwgMHg0YSwKLSAgICAgICAgMHg1MywgMHg1NCwgMHg1NSwgMHg1NiwgMHg1NywgMHg1OCwgMHg1OSwgMHg1YSwgMHg2MywgMHg2NCwgMHg2NSwKLSAgICAgICAgMHg2NiwgMHg2NywgMHg2OCwgMHg2OSwgMHg2YSwgMHg3MywgMHg3NCwgMHg3NSwgMHg3NiwgMHg3NywgMHg3OCwKLSAgICAgICAgMHg3OSwgMHg3YSwgMHg4MywgMHg4NCwgMHg4NSwgMHg4NiwgMHg4NywgMHg4OCwgMHg4OSwgMHg4YSwgMHg5MiwKLSAgICAgICAgMHg5MywgMHg5NCwgMHg5NSwgMHg5NiwgMHg5NywgMHg5OCwgMHg5OSwgMHg5YSwgMHhhMiwgMHhhMywgMHhhNCwKLSAgICAgICAgMHhhNSwgMHhhNiwgMHhhNywgMHhhOCwgMHhhOSwgMHhhYSwgMHhiMiwgMHhiMywgMHhiNCwgMHhiNSwgMHhiNiwKLSAgICAgICAgMHhiNywgMHhiOCwgMHhiOSwgMHhiYSwgMHhjMiwgMHhjMywgMHhjNCwgMHhjNSwgMHhjNiwgMHhjNywgMHhjOCwKLSAgICAgICAgMHhjOSwgMHhjYSwgMHhkMiwgMHhkMywgMHhkNCwgMHhkNSwgMHhkNiwgMHhkNywgMHhkOCwgMHhkOSwgMHhkYSwKLSAgICAgICAgMHhlMSwgMHhlMiwgMHhlMywgMHhlNCwgMHhlNSwgMHhlNiwgMHhlNywgMHhlOCwgMHhlOSwgMHhlYSwgMHhmMSwKLSAgICAgICAgMHhmMiwgMHhmMywgMHhmNCwgMHhmNSwgMHhmNiwgMHhmNywgMHhmOCwgMHhmOSwgMHhmYSwgMHgwMSwgMHgwMCwKLSAgICAgICAgMHgwMywgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwKLSAgICAgICAgMHgwNywgMHgwOCwgMHgwOSwgMHgwYSwgMHgwYiwgMHgxMSwgMHgwMCwgMHgwMiwgMHgwMSwgMHgwMiwgMHgwNCwKLSAgICAgICAgMHgwNCwgMHgwMywgMHgwNCwgMHgwNywgMHgwNSwgMHgwNCwgMHgwNCwgMHgwMCwgMHgwMSwgMHgwMiwgMHg3NywKLSAgICAgICAgMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgxMSwgMHgwNCwgMHgwNSwgMHgyMSwgMHgzMSwgMHgwNiwgMHgxMiwKLSAgICAgICAgMHg0MSwgMHg1MSwgMHgwNywgMHg2MSwgMHg3MSwgMHgxMywgMHgyMiwgMHgzMiwgMHg4MSwgMHgwOCwgMHgxNCwKLSAgICAgICAgMHg0MiwgMHg5MSwgMHhhMSwgMHhiMSwgMHhjMSwgMHgwOSwgMHgyMywgMHgzMywgMHg1MiwgMHhmMCwgMHgxNSwKLSAgICAgICAgMHg2MiwgMHg3MiwgMHhkMSwgMHgwYSwgMHgxNiwgMHgyNCwgMHgzNCwgMHhlMSwgMHgyNSwgMHhmMSwgMHgxNywKLSAgICAgICAgMHgxOCwgMHgxOSwgMHgxYSwgMHgyNiwgMHgyNywgMHgyOCwgMHgyOSwgMHgyYSwgMHgzNSwgMHgzNiwgMHgzNywKLSAgICAgICAgMHgzOCwgMHgzOSwgMHgzYSwgMHg0MywgMHg0NCwgMHg0NSwgMHg0NiwgMHg0NywgMHg0OCwgMHg0OSwgMHg0YSwKLSAgICAgICAgMHg1MywgMHg1NCwgMHg1NSwgMHg1NiwgMHg1NywgMHg1OCwgMHg1OSwgMHg1YSwgMHg2MywgMHg2NCwgMHg2NSwKLSAgICAgICAgMHg2NiwgMHg2NywgMHg2OCwgMHg2OSwgMHg2YSwgMHg3MywgMHg3NCwgMHg3NSwgMHg3NiwgMHg3NywgMHg3OCwKLSAgICAgICAgMHg3OSwgMHg3YSwgMHg4MiwgMHg4MywgMHg4NCwgMHg4NSwgMHg4NiwgMHg4NywgMHg4OCwgMHg4OSwgMHg4YSwKLSAgICAgICAgMHg5MiwgMHg5MywgMHg5NCwgMHg5NSwgMHg5NiwgMHg5NywgMHg5OCwgMHg5OSwgMHg5YSwgMHhhMiwgMHhhMywKLSAgICAgICAgMHhhNCwgMHhhNSwgMHhhNiwgMHhhNywgMHhhOCwgMHhhOSwgMHhhYSwgMHhiMiwgMHhiMywgMHhiNCwgMHhiNSwKLSAgICAgICAgMHhiNiwgMHhiNywgMHhiOCwgMHhiOSwgMHhiYSwgMHhjMiwgMHhjMywgMHhjNCwgMHhjNSwgMHhjNiwgMHhjNywKLSAgICAgICAgMHhjOCwgMHhjOSwgMHhjYSwgMHhkMiwgMHhkMywgMHhkNCwgMHhkNSwgMHhkNiwgMHhkNywgMHhkOCwgMHhkOSwKLSAgICAgICAgMHhkYSwgMHhlMiwgMHhlMywgMHhlNCwgMHhlNSwgMHhlNiwgMHhlNywgMHhlOCwgMHhlOSwgMHhlYSwgMHhmMiwKLSAgICAgICAgMHhmMywgMHhmNCwgMHhmNSwgMHhmNiwgMHhmNywgMHhmOCwgMHhmOSwgMHhmYSwgMHhmZiwgMHhkYSwgMHgwMCwKLSAgICAgICAgMHgwYywgMHgwMywgMHgwMSwgMHgwMCwgMHgwMiwgMHgxMSwgMHgwMywgMHgxMSwgMHgwMCwgMHgzZiwgMHgwMCwKLSAgICAgICAgMHgxNCwgMHg1NCwgMHhhYSwgMHgyYSwgMHg0NiwgMHg0OCwgMHhhMiwgMHhhNCwgMHg1NSwgMHhhNiwgMHgwNCwKLSAgICAgICAgMHg4YSwgMHgyOSwgMHhlMCwgMHg1MywgMHgxMCwgMHhlMCwgMHgyOSwgMHhjMCwgMHg1MCwgMHgwMywgMHhiMSwKLSAgICAgICAgMHg0NiwgMHgyOSwgMHg4MCwgMHg4NCwgMHg1MiwgMHgxMSwgMHg0MCwgMHgwZCwgMHgyMiwgMHg5YSwgMHg0NSwKLSAgICAgICAgMHgyMCwgMHgyMywgMHg2MSwgMHg1MSwgMHgzMCwgMHhhMCwgMHgwOCwgMHhjOCwgMHhhOCwgMHhkOCwgMHg1MiwKLSAgICAgICAgMHgwMiwgMHgyNiwgMHgxNSwgMHgwYiwgMHgwYSwgMHgwMCwgMHhiNCwgMHhhMiwgMHhhNSwgMHg1YSwgMHgwMCwKLSAgICAgICAgMHg5MSwgMHg0NSwgMHg0YSwgMHhhMiwgMHg4MSwgMHg5MiwgMHgwMSwgMHg0ZSwgMHgwMiwgMHg5OCwgMHg4NywKLSAgICAgICAgMHgwYSwgMHg3MCwgMHhhMCwgMHgwNywgMHg2MiwgMHg4YywgMHg1MCwgMHgyMSwgMHgwZCwgMHgyNSwgMHgwMCwKLSAgICAgICAgMHgzNCwgMHg4YSwgMHg2MSwgMHgxNCwgMHgwYywgMHg2MywgMHgwYSwgMHg4OSwgMHg4NSwgMHgwMCwgMHg0NiwKLSAgICAgICAgMHhkNSwgMHgxYiwgMHg1MiwgMHgwMiwgMHgxNiwgMHhhOCwgMHg5OCwgMHg1MCwgMHgwNSwgMHg5NCwgMHhhOSwKLSAgICAgICAgMHgxNiwgMHg4MCwgMHgyNSwgMHg1YSwgMHg5NSwgMHg2OCwgMHgxOCwgMHhmMSwgMHg0ZiwgMHgxNCwgMHhjNCwKLSAgICAgICAgMHgzYiwgMHhiNSwgMHgyMiwgMHhiNiwgMHgzOCwgMHgzNCwgMHgwMCwgMHhlMywgMHgyMiwgMHg4ZSwgMHhmNCwKLSAgICAgICAgMHg3OSwgMHg4YSwgMHg3YiwgMHhkMSwgMHg3MSwgMHgwMywgMHgzMCwgMHhjNywgMHgxNCwgMHg4MywgMHhhNSwKLSAgICAgICAgMHgwMCwgMHgwNiwgMHg5OCwgMHg2OCwgMHgwMSwgMHg4ZCwgMHg1MSwgMHgzNSwgMHgwMywgMHgyMiwgMHg2YSwKLSAgICAgICAgMHg4ZCwgMHhhOSwgMHgwMSwgMHgxMywgMHg1NCwgMHg0ZCwgMHg0MCwgMHgxMywgMHhhNSwgMHg0YSwgMHgyOCwKLSAgICAgICAgMHgwMiwgMHg0NSwgMHgzNSwgMHgyYSwgMHg5YSwgMHgwMCwgMHg3OCwgMHgzNCwgMHhmMCwgMHg2OSwgMHg4MCwKLSAgICAgICAgMHgzNCwgMHg4MSwgMHg0NSwgMHg0MCwgMHhjZSwgMHg1OCwgMHhlNiwgMHhhMiwgMHg0YywgMHgwNiwgMHhlNCwKLSAgICAgICAgMHhmYSwgMHhkMSwgMHg5MywgMHg1MCwgMHgyMSwgMHhjYSwgMHhlNCwgMHg1NSwgMHg4NCwgMHg5MCwgMHgzMCwKLSAgICAgICAgMHhhYiwgMHg4YiwgMHgxOCwgMHhhNiwgMHg5YSwgMHg2YSwgMHhjNCwgMHgzMSwgMHhhYSwgMHgyNiwgMHhhMCwKLSAgICAgICAgMHg2NCwgMHg0ZCwgMHg1MSwgMHhiNSwgMHgyMCwgMHgyMywgMHg2YSwgMHg4OSwgMHhhOCwgMHgwMiwgMHg0NCwKLSAgICAgICAgMHgzNSwgMHgyYSwgMHg5YSwgMHgwMCwgMHg5NSwgMHg0ZCwgMHg0OCwgMHhhNiwgMHg4MCwgMHgyNCwgMHg1MywKLSAgICAgICAgMHg0ZSwgMHhjZSwgMHgwNSwgMHgzMCwgMHgyYiwgMHgzYiwgMHhlZSwgMHg2YSwgMHg5MSwgMHg1ZCwgMHg3NiwKLSAgICAgICAgMHg2MywgMHhiZCwgMHg2NSwgMHg3ZCwgMHg0MCwgMHg2NiwgMHg2OCwgMHhhOSwgMHgwMiwgMHg0NSwgMHgyYiwKLSAgICAgICAgMHhiMywgMHg5ZSwgMHhiNCwgMHhjNSwgMHg2ZCwgMHhhZCwgMHg5YSwgMHhhMCwgMHgyYywgMHgwNiwgMHhjOCwKLSAgICAgICAgMHhjZCwgMHgwNCwgMHhkNiwgMHhhMiwgMHgyMywgMHg2MywgMHg1MSwgMHhiMSwgMHhhMCwgMHg2NCwgMHg0ZCwKLSAgICAgICAgMHg1MSwgMHg5MywgMHg0OCwgMHgwOCwgMHhkYSwgMHhhMiwgMHg2YSwgMHgwMCwgMHg3MiwgMHgxYSwgMHg5OSwKLSAgICAgICAgMHg0ZCwgMHgwMCwgMHg0OCwgMHhhNiwgMHhhNCwgMHg1MywgMHg0YywgMHgwNywgMHg4NiwgMHgwMywgMHhiZCwKLSAgICAgICAgMHgyYiwgMHg5YywgMHhhNywgMHgxNCwgMHg5OCwgMHgxMCwgMHg4NSwgMHgzNCwgMHhlMCwgMHhhNiwgMHhiMywKLSAgICAgICAgMHhiMCwgMHgwYiwgMHhiNSwgMHhhOCwgMHgwYSwgMHhkNCwgMHg1OCwgMHg0MiwgMHhlZCwgMHgzZSwgMHg5NCwKLSAgICAgICAgMHhkMiwgMHhhNiwgMHg4YiwgMHgwMSwgMHgzNCwgMHg0NCwgMHhlZCwgMHhlNiwgMHg5YywgMHg0ZCwgMHg2YSwKLSAgICAgICAgMHg4MCwgMHg4ZCwgMHg4ZCwgMHg0NiwgMHhjNiwgMHg4MCwgMHgyMywgMHg2MywgMHg1MSwgMHg5YSwgMHgwNiwKLSAgICAgICAgMHg0NiwgMHhkNSwgMHgxMywgMHg1MiwgMHgwMSwgMHg1NCwgMHhkNCwgMHhhYSwgMHg2OCwgMHgwMiwgMHg0MCwKLSAgICAgICAgMHg2YSwgMHg0MCwgMHg3OCwgMHhhMCwgMHgwOCwgMHg1OSwgMHhjZSwgMHhlZSwgMHhiNSwgMHgyYSwgMHgzOSwKLSAgICAgICAgMHhkOSwgMHg1OSwgMHhhNywgMHhhOCwgMHgwMCwgMHg3MywgMHhlYiwgMHg0ZSwgMHgwZSwgMHg3ZCwgMHg2OSwKLSAgICAgICAgMHg1YywgMHgwNSwgMHhmMywgMHgwZiwgMHhhZCwgMHgxZSwgMHg2MSwgMHhmNSwgMHhhNywgMHg3MSwgMHgwYiwKLSAgICAgICAgMHhlNiwgMHgzNSwgMHgyMSwgMHg5MCwgMHhkMywgMHhiOCwgMHgwZSwgMHgzMiwgMHgxMCwgMHg5NSwgMHgxMCwKLSAgICAgICAgMHg5MSwgMHhiMywgMHhkNiwgMHg5YiwgMHg2MCwgMHg0YiwgMHg5YywgMHg4YSwgMHg2MywgMHgxYSwgMHhiMCwKLSAgICAgICAgMHgxOCwgMHg0ZCwgMHg0NiwgMHhjNiwgMHg4MCwgMHgyMiwgMHg2YSwgMHg2MSwgMHhhNCwgMHgzMSwgMHhhYSwKLSAgICAgICAgMHg2YSwgMHg1NSwgMHgzNCwgMHgwMSwgMHgyYSwgMHg5YSwgMHg3ZSwgMHg3OCwgMHhhMCwgMHgwOCwgMHgwOSwKLSAgICAgICAgMHhmOSwgMHhhYSwgMHg1OCwgMHhjZiwgMHhjYSwgMHg2YiwgMHgzZSwgMHhhMCwgMHgwMCwgMHhkMywgMHg4MSwKLSAgICAgICAgMHhhOSwgMHgwMSwgMHg3MywgMHg0NiwgMHg2OSwgMHg4MCwgMHhiOSwgMHhhNCwgMHhjZCwgMHgwMCwgMHgyYiwKLSAgICAgICAgMHgxZiwgMHg5MiwgMHhhMywgMHgwNywgMHg5YSwgMHg2ZiwgMHg3MCwgMHgyNiwgMHhjZiwgMHgxNCwgMHhkMiwKLSAgICAgICAgMHg2YiwgMHg1MSwgMHgwYywgMHg2MywgMHg1MSwgMHhiMSwgMHhhMCwgMHgwOCwgMHhkYSwgMHg5OCwgMHg2OSwKLSAgICAgICAgMHgwYywgMHg4ZCwgMHg0ZCwgMHg0YSwgMHhhNiwgMHg4MCwgMHgyNCwgMHg1MywgMHg1MiwgMHgwMywgMHhjNSwKLSAgICAgICAgMHgwMiwgMHgyMSwgMHgyNywgMHhlNiwgMHhhOSwgMHgyMywgMHgzZiwgMHgyOSwgMHhhYywgMHhmYSwgMHg4YywKLSAgICAgICAgMHgwMSwgMHhlNiwgMHg5YywgMHgwZCwgMHg0OCwgMHgwYSwgMHgwZCwgMHgyZSwgMHg2OCwgMHgwMSwgMHg3MywKLSAgICAgICAgMHg0OSwgMHg5YSwgMHg2MCwgMHgyYiwgMHgxZiwgMHg5MiwgMHg5OCwgMHgzYSwgMHhkMywgMHg3YiwgMHg4MSwKLSAgICAgICAgMHgzNiwgMHg3OCwgMHhhNiwgMHg5MywgMHg1YSwgMHg4OCwgMHg4YywgMHg5YSwgMHg2MywgMHgxYSwgMHgwMCwKLSAgICAgICAgMHg4YywgMHhkMywgMHgwZCwgMHgyMSwgMHg5MSwgMHgyOSwgMHhhOSwgMHgxNCwgMHhkMCwgMHgwNCwgMHg4YSwKLSAgICAgICAgMHg2OSwgMHhlMCwgMHhkMywgMHgxMSwgMHgxYiwgMHgxZSwgMHg2YSwgMHg0OCwgMHhjZiwgMHhjYSwgMHg2YiwKLSAgICAgICAgMHgzZSwgMHhhMywgMHgxMCwgMHgxYSwgMHg3MCwgMHgzNSwgMHgyMCwgMHgzOCwgMHgxYSwgMHg1YywgMHhkMiwKLSAgICAgICAgMHgwMSwgMHg3MywgMHg0OSwgMHg5YSwgMHg2MCwgMHgzOSwgMHg4ZiwgMHhjYSwgMHgyOSwgMHg4YiwgMHhmNywKLSAgICAgICAgMHhhYSwgMHhiYSwgMHg4OCwgMHg5NiwgMHg5YSwgMHg2YiwgMHg0MCwgMHgxOCwgMHhjNiwgMHhhMywgMHgyNiwKLSAgICAgICAgMHg4MCwgMHgxOCwgMHg2OSwgMHhhNiwgMHg5MCwgMHhjOCwgMHgxNCwgMHhkNCwgMHg4YSwgMHg2OSwgMHg4MCwKLSAgICAgICAgMHhmMCwgMHg2YSwgMHg0MCwgMHg2OCwgMHgxMCwgMHhiYiwgMHg0MSwgMHhhNywgMHhlMywgMHgwYiwgMHhjNSwKLSAgICAgICAgMHgyYiwgMHgwMSwgMHgxMCwgMHhhNywgMHgwMywgMHg1OSwgMHgwYywgMHg3NiwgMHg2OSwgMHg3MywgMHg0MCwKLSAgICAgICAgMHgwYiwgMHg5YSwgMHgyOCwgMHgxMSwgMHgyOCwgMHgxOSwgMHg1ZSwgMHg2OSwgMHgwMiwgMHg4MSwgMHg1YSwKLSAgICAgICAgMHhkOCwgMHgwMCwgMHhkMywgMHg0ZCwgMHg1MCwgMHgwYywgMHg2YSwgMHg4YywgMHhkMiwgMHgwMSwgMHhhNiwKLSAgICAgICAgMHg5OCwgMHg2OSwgMHgwYywgMHhhZSwgMHhhNiwgMHhhNCwgMHgwNiwgMHg4MCwgMHgxZSwgMHhhNiwgMHg5ZSwKLSAgICAgICAgMHgwZCwgMHgzMSwgMHgxMiwgMHgwMywgMHg0ZiwgMHgwNiwgMHg4MCwgMHgxMywgMHg2MCwgMHgzNCwgMHhkMywKLSAgICAgICAgMHhjMSwgMHhhOCwgMHg5MiwgMHgwMSwgMHhmMSwgMHg4ZCwgMHhkZCwgMHg2OSwgMHhjYywgMHhhMSwgMHg2OSwKLSAgICAgICAgMHg1YiwgMHg0YiwgMHg4MCwgMHg4MywgMHg5MywgMHg1MiwgMHgwNCwgMHgxNCwgMHhlMiwgMHhhZSwgMHgwMywKLSAgICAgICAgMHhhOSwgMHgwZCwgMHg2OCwgMHgwMywgMHg0ZCwgMHgzNCwgMHhkMCwgMHgwMywgMHgwZCwgMHgzMCwgMHhkMiwKLSAgICAgICAgMHgwMSwgMHg4NiwgMHg5YSwgMHg2OCwgMHgxOSwgMHg1OCwgMHgxYSwgMHg3OCwgMHhhNCwgMHgwNCwgMHg4YSwKLSAgICAgICAgMHg2OSwgMHhlMCwgMHhkMywgMHgxMCwgMHhlMCwgMHg2OSwgMHhlMCwgMHhkMCwgMHgwMywgMHhjMSwgMHhhOCwKLSAgICAgICAgMHhkYiwgMHhhZCwgMHg0YywgMHg4MSwgMHgxMiwgMHg0NSwgMHhkNiwgMHg5ZCwgMHgyNSwgMHgxZCwgMHgwMCwKLSAgICAgICAgMHg2YSwgMHhmNSwgMHhhOSwgMHhlOCwgMHg4MCwgMHgzMSwgMHgyOSwgMHgwZCwgMHg1OCwgMHgwOCwgMHg2OSwKLSAgICAgICAgMHg4NiwgMHg4MCwgMHgxYSwgMHg2OSwgMHg4NiwgMHg5MCwgMHgwYywgMHgzNCwgMHhkMywgMHg0OCwgMHg2NSwKLSAgICAgICAgMHg1MSwgMHg0ZiwgMHgwNiwgMHg5OCwgMHgwZiwgMHgxNCwgMHhmMCwgMHg2OCwgMHgxMCwgMHhmMCwgMHg2OSwKLSAgICAgICAgMHhlMCwgMHhkMCwgMHgwMywgMHg4MSwgMHhhNSwgMHgyYiwgMHg5YSwgMHgxYSwgMHhiOCwgMHg4NywgMHhhOCwKLSAgICAgICAgMHhkYiwgMHg0YSwgMHg0NiwgMHg2OCwgMHhiNiwgMHg4MCwgMHgyYSwgMHhhOCwgMHgxNCwgMHhlYSwgMHgxMiwKLSAgICAgICAgMHhiMCwgMHgwNSwgMHgyMSwgMHhhNiwgMHgwMiwgMHgxYSwgMHg2MSwgMHhhMCwgMHgwNiwgMHg5YSwgMHg2MSwKLSAgICAgICAgMHhhNCwgMHgzMSwgMHg4NiwgMHg5YSwgMHg2OSwgMHgwYywgMHhhOCwgMHgwZCwgMHgzYywgMHg1MywgMHgwMSwKLSAgICAgICAgMHhlMiwgMHg5ZSwgMHgyOCwgMHgxMCwgMHhmMSwgMHg0ZSwgMHgwNiwgMHg5OCwgMHgwZiwgMHgwNiwgMHg5ZSwKLSAgICAgICAgMHgwZCwgMHgwMiwgMHgxYywgMHgyOSwgMHhjMiwgMHg4MCwgMHgxNiwgMHg5NiwgMHg4MCwgMHgwYSwgMHg0YSwKLSAgICAgICAgMHgwMCwgMHg0MywgMHg0ZCwgMHgzNCwgMHgwYywgMHg2MSwgMHhhNiwgMHgxYSwgMHg0MCwgMHgzNCwgMHhkMywKLSAgICAgICAgMHg0ZCwgMHgyMSwgMHg4MCwgMHhmZiwgMHhkOSwgMHhmZiwgMHhkYiwgMHgwMCwgMHg4NCwgMHgwMCwgMHgwYSwKLSAgICAgICAgMHgwNywgMHgwNywgMHgwOCwgMHgwNywgMHgwNiwgMHgwYSwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwYiwgMHgwYSwKLSAgICAgICAgMHgwYSwgMHgwYiwgMHgwZSwgMHgxOCwgMHgxMCwgMHgwZSwgMHgwZCwgMHgwZCwgMHgwZSwgMHgxZCwgMHgxNSwKLSAgICAgICAgMHgxNiwgMHgxMSwgMHgxOCwgMHgyMywgMHgxZiwgMHgyNSwgMHgyNCwgMHgyMiwgMHgxZiwgMHgyMiwgMHgyMSwKLSAgICAgICAgMHgyNiwgMHgyYiwgMHgzNywgMHgyZiwgMHgyNiwgMHgyOSwgMHgzNCwgMHgyOSwgMHgyMSwgMHgyMiwgMHgzMCwKLSAgICAgICAgMHg0MSwgMHgzMSwgMHgzNCwgMHgzOSwgMHgzYiwgMHgzZSwgMHgzZSwgMHgzZSwgMHgyNSwgMHgyZSwgMHg0NCwKLSAgICAgICAgMHg0OSwgMHg0MywgMHgzYywgMHg0OCwgMHgzNywgMHgzZCwgMHgzZSwgMHgzYiwgMHgwMSwgMHgwYSwgMHgwYiwKLSAgICAgICAgMHgwYiwgMHgwZSwgMHgwZCwgMHgwZSwgMHgxYywgMHgxMCwgMHgxMCwgMHgxYywgMHgzYiwgMHgyOCwgMHgyMiwKLSAgICAgICAgMHgyOCwgMHgzYiwgMHgzYiwgMHgzYiwgMHgzYiwgMHgzYiwgMHgzYiwgMHgzYiwgMHgzYiwgMHgzYiwgMHgzYiwKLSAgICAgICAgMHgzYiwgMHgzYiwgMHgzYiwgMHgzYiwgMHgzYiwgMHgzYiwgMHgzYiwgMHgzYiwgMHgzYiwgMHgzYiwgMHgzYiwKLSAgICAgICAgMHgzYiwgMHgzYiwgMHgzYiwgMHgzYiwgMHgzYiwgMHgzYiwgMHgzYiwgMHgzYiwgMHgzYiwgMHgzYiwgMHgzYiwKLSAgICAgICAgMHgzYiwgMHgzYiwgMHgzYiwgMHgzYiwgMHgzYiwgMHgzYiwgMHgzYiwgMHgzYiwgMHgzYiwgMHgzYiwgMHgzYiwKLSAgICAgICAgMHgzYiwgMHgzYiwgMHgzYiwgMHgzYiwgMHgzYiwgMHgzYiwgMHgzYiwgMHhmZiwgMHhjMCwgMHgwMCwgMHgxMSwKLSAgICAgICAgMHgwOCwgMHgwMCwgMHg0OCwgMHgwMCwgMHg2MCwgMHgwMywgMHgwMSwgMHgyMSwgMHgwMCwgMHgwMiwgMHgxMSwKLSAgICAgICAgMHgwMSwgMHgwMywgMHgxMSwgMHgwMSwgMHhmZiwgMHhjNCwgMHgwMSwgMHhhMiwgMHgwMCwgMHgwMCwgMHgwMSwKLSAgICAgICAgMHgwNSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywKLSAgICAgICAgMHgwOCwgMHgwOSwgMHgwYSwgMHgwYiwgMHgxMCwgMHgwMCwgMHgwMiwgMHgwMSwgMHgwMywgMHgwMywgMHgwMiwKLSAgICAgICAgMHgwNCwgMHgwMywgMHgwNSwgMHgwNSwgMHgwNCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMSwgMHg3ZCwgMHgwMSwKLSAgICAgICAgMHgwMiwgMHgwMywgMHgwMCwgMHgwNCwgMHgxMSwgMHgwNSwgMHgxMiwgMHgyMSwgMHgzMSwgMHg0MSwgMHgwNiwKLSAgICAgICAgMHgxMywgMHg1MSwgMHg2MSwgMHgwNywgMHgyMiwgMHg3MSwgMHgxNCwgMHgzMiwgMHg4MSwgMHg5MSwgMHhhMSwKLSAgICAgICAgMHgwOCwgMHgyMywgMHg0MiwgMHhiMSwgMHhjMSwgMHgxNSwgMHg1MiwgMHhkMSwgMHhmMCwgMHgyNCwgMHgzMywKLSAgICAgICAgMHg2MiwgMHg3MiwgMHg4MiwgMHgwOSwgMHgwYSwgMHgxNiwgMHgxNywgMHgxOCwgMHgxOSwgMHgxYSwgMHgyNSwKLSAgICAgICAgMHgyNiwgMHgyNywgMHgyOCwgMHgyOSwgMHgyYSwgMHgzNCwgMHgzNSwgMHgzNiwgMHgzNywgMHgzOCwgMHgzOSwKLSAgICAgICAgMHgzYSwgMHg0MywgMHg0NCwgMHg0NSwgMHg0NiwgMHg0NywgMHg0OCwgMHg0OSwgMHg0YSwgMHg1MywgMHg1NCwKLSAgICAgICAgMHg1NSwgMHg1NiwgMHg1NywgMHg1OCwgMHg1OSwgMHg1YSwgMHg2MywgMHg2NCwgMHg2NSwgMHg2NiwgMHg2NywKLSAgICAgICAgMHg2OCwgMHg2OSwgMHg2YSwgMHg3MywgMHg3NCwgMHg3NSwgMHg3NiwgMHg3NywgMHg3OCwgMHg3OSwgMHg3YSwKLSAgICAgICAgMHg4MywgMHg4NCwgMHg4NSwgMHg4NiwgMHg4NywgMHg4OCwgMHg4OSwgMHg4YSwgMHg5MiwgMHg5MywgMHg5NCwKLSAgICAgICAgMHg5NSwgMHg5NiwgMHg5NywgMHg5OCwgMHg5OSwgMHg5YSwgMHhhMiwgMHhhMywgMHhhNCwgMHhhNSwgMHhhNiwKLSAgICAgICAgMHhhNywgMHhhOCwgMHhhOSwgMHhhYSwgMHhiMiwgMHhiMywgMHhiNCwgMHhiNSwgMHhiNiwgMHhiNywgMHhiOCwKLSAgICAgICAgMHhiOSwgMHhiYSwgMHhjMiwgMHhjMywgMHhjNCwgMHhjNSwgMHhjNiwgMHhjNywgMHhjOCwgMHhjOSwgMHhjYSwKLSAgICAgICAgMHhkMiwgMHhkMywgMHhkNCwgMHhkNSwgMHhkNiwgMHhkNywgMHhkOCwgMHhkOSwgMHhkYSwgMHhlMSwgMHhlMiwKLSAgICAgICAgMHhlMywgMHhlNCwgMHhlNSwgMHhlNiwgMHhlNywgMHhlOCwgMHhlOSwgMHhlYSwgMHhmMSwgMHhmMiwgMHhmMywKLSAgICAgICAgMHhmNCwgMHhmNSwgMHhmNiwgMHhmNywgMHhmOCwgMHhmOSwgMHhmYSwgMHgwMSwgMHgwMCwgMHgwMywgMHgwMSwKLSAgICAgICAgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywgMHgwOCwKLSAgICAgICAgMHgwOSwgMHgwYSwgMHgwYiwgMHgxMSwgMHgwMCwgMHgwMiwgMHgwMSwgMHgwMiwgMHgwNCwgMHgwNCwgMHgwMywKLSAgICAgICAgMHgwNCwgMHgwNywgMHgwNSwgMHgwNCwgMHgwNCwgMHgwMCwgMHgwMSwgMHgwMiwgMHg3NywgMHgwMCwgMHgwMSwKLSAgICAgICAgMHgwMiwgMHgwMywgMHgxMSwgMHgwNCwgMHgwNSwgMHgyMSwgMHgzMSwgMHgwNiwgMHgxMiwgMHg0MSwgMHg1MSwKLSAgICAgICAgMHgwNywgMHg2MSwgMHg3MSwgMHgxMywgMHgyMiwgMHgzMiwgMHg4MSwgMHgwOCwgMHgxNCwgMHg0MiwgMHg5MSwKLSAgICAgICAgMHhhMSwgMHhiMSwgMHhjMSwgMHgwOSwgMHgyMywgMHgzMywgMHg1MiwgMHhmMCwgMHgxNSwgMHg2MiwgMHg3MiwKLSAgICAgICAgMHhkMSwgMHgwYSwgMHgxNiwgMHgyNCwgMHgzNCwgMHhlMSwgMHgyNSwgMHhmMSwgMHgxNywgMHgxOCwgMHgxOSwKLSAgICAgICAgMHgxYSwgMHgyNiwgMHgyNywgMHgyOCwgMHgyOSwgMHgyYSwgMHgzNSwgMHgzNiwgMHgzNywgMHgzOCwgMHgzOSwKLSAgICAgICAgMHgzYSwgMHg0MywgMHg0NCwgMHg0NSwgMHg0NiwgMHg0NywgMHg0OCwgMHg0OSwgMHg0YSwgMHg1MywgMHg1NCwKLSAgICAgICAgMHg1NSwgMHg1NiwgMHg1NywgMHg1OCwgMHg1OSwgMHg1YSwgMHg2MywgMHg2NCwgMHg2NSwgMHg2NiwgMHg2NywKLSAgICAgICAgMHg2OCwgMHg2OSwgMHg2YSwgMHg3MywgMHg3NCwgMHg3NSwgMHg3NiwgMHg3NywgMHg3OCwgMHg3OSwgMHg3YSwKLSAgICAgICAgMHg4MiwgMHg4MywgMHg4NCwgMHg4NSwgMHg4NiwgMHg4NywgMHg4OCwgMHg4OSwgMHg4YSwgMHg5MiwgMHg5MywKLSAgICAgICAgMHg5NCwgMHg5NSwgMHg5NiwgMHg5NywgMHg5OCwgMHg5OSwgMHg5YSwgMHhhMiwgMHhhMywgMHhhNCwgMHhhNSwKLSAgICAgICAgMHhhNiwgMHhhNywgMHhhOCwgMHhhOSwgMHhhYSwgMHhiMiwgMHhiMywgMHhiNCwgMHhiNSwgMHhiNiwgMHhiNywKLSAgICAgICAgMHhiOCwgMHhiOSwgMHhiYSwgMHhjMiwgMHhjMywgMHhjNCwgMHhjNSwgMHhjNiwgMHhjNywgMHhjOCwgMHhjOSwKLSAgICAgICAgMHhjYSwgMHhkMiwgMHhkMywgMHhkNCwgMHhkNSwgMHhkNiwgMHhkNywgMHhkOCwgMHhkOSwgMHhkYSwgMHhlMiwKLSAgICAgICAgMHhlMywgMHhlNCwgMHhlNSwgMHhlNiwgMHhlNywgMHhlOCwgMHhlOSwgMHhlYSwgMHhmMiwgMHhmMywgMHhmNCwKLSAgICAgICAgMHhmNSwgMHhmNiwgMHhmNywgMHhmOCwgMHhmOSwgMHhmYSwgMHhmZiwgMHhkYSwgMHgwMCwgMHgwYywgMHgwMywKLSAgICAgICAgMHgwMSwgMHgwMCwgMHgwMiwgMHgxMSwgMHgwMywgMHgxMSwgMHgwMCwgMHgzZiwgMHgwMCwgMHg5ZSwgMHhkMiwKLSAgICAgICAgMHgyZSwgMHgwNywgMHgxNSwgMHhhZiwgMHg2ZCwgMHgwOCwgMHhlMiwgMHhiMywgMHg0NSwgMHgxYSwgMHhmNiwKLSAgICAgICAgMHhkMCwgMHgwMCwgMHgwMSwgMHhjNSwgMHg2OCwgMHg0NSwgMHgxNywgMHg0YSwgMHhiNCwgMHgyMiwgMHhlNCwKLSAgICAgICAgMHg3MCwgMHg4YywgMHg3NCwgMHhhOSwgMHgzYywgMHhhMSwgMHg4ZSwgMHg5NSwgMHg0OCwgMHg5NiwgMHgzMSwKLSAgICAgICAgMHhlMiwgMHgxOCwgMHhlOSwgMHg1NSwgMHhhNSwgMHg4YywgMHg3YSwgMHg1MCwgMHgwNSwgMHgwYiwgMHg4OCwKLSAgICAgICAgMHg4NiwgMHgwZiwgMHgxNSwgMHg4ZiwgMHg3NSwgMHgxZiwgMHgyNiwgMHg5MywgMHgxOSwgMHg5MSwgMHg3NywKLSAgICAgICAgMHgxOCwgMHhjMSwgMHhhYywgMHg0YiwgMHhjOCwgMHhmYSwgMHhkNiwgMHg2MywgMHgzNywgMHg2ZCwgMHgzMSwKLSAgICAgICAgMHhiNCwgMHg3MywgMHg1YiwgMHgzNiwgMHhhMCwgMHgxYywgMHg1MCwgMHg4MCwgMHhkNywgMHg4MywgMHhhMCwKLSAgICAgICAgMHhhYiwgMHhkMSwgMHg2MiwgMHhhZCwgMHgwOSwgMHg4ZiwgMHgxNywgMHgyOSwgMHgwMywgMHhiMiwgMHhjYywKLSAgICAgICAgMHhlMCwgMHg3NywgMHgxNCwgMHhhMywgMHg1NiwgMHhiMywgMHgyNywgMHgxZSwgMHg2NywgMHhlOSwgMHg1MiwKLSAgICAgICAgMHhlYSwgMHhjNiwgMHgzYSwgMHgzNiwgMHg0OCwgMHhlZiwgMHgzZCwgMHgyNywgMHg3MCwgMHgyMiwgMHg2MCwKLSAgICAgICAgMHg0NywgMHg1MiwgMHg2OSwgMHhiMiwgMHhlMiwgMHhhZCwgMHgzYiwgMHhlYSwgMHg4MCwgMHhhMywgMHgzOCwKLSAgICAgICAgMHhlMCwgMHhkNiwgMHgzZCwgMHhkOCwgMHgxYywgMHhkMCwgMHhjYSwgMHg0NiwgMHgzZCwgMHhkMCwgMHgxOCwKLSAgICAgICAgMHgzNSwgMHg4OSwgMHg3OCwgMHhhMywgMHg5YSwgMHhjZCwgMHg4YywgMHhkMiwgMHhiMywgMHg5MywgMHgyYSwKLSAgICAgICAgMHgyYiwgMHg2NiwgMHhkNSwgMHhmMSwgMHg4YSwgMHgxMCwgMHgxYSwgMHhkNiwgMHhmMiwgMHgwMywgMHg4YSwKLSAgICAgICAgMHg5ZSwgMHhlNiwgMHhmNCwgMHg1YSwgMHhkYiwgMHhlZiwgMHhmZSwgMHgyMywgMHhjMCwgMHhhNywgMHgyNywKLSAgICAgICAgMHhjYiwgMHgxNiwgMHhjNCwgMHhjYywgMHhkZCwgMHhlMiwgMHg3OCwgMHg5YSwgMHg2OSwgMHg2NiwgMHhjYywKLSAgICAgICAgMHg5OSwgMHhlMSwgMHg0ZCwgMHg0NywgMHhiYSwgMHhiYywgMHhkOSwgMHg2YSwgMHhlZSwgMHgyNiwgMHg1OSwKLSAgICAgICAgMHg1OSwgMHg0ZCwgMHhhYywgMHg2OSwgMHgzNCwgMHg1MiwgMHhlNSwgMHg4ZiwgMHg1NSwgMHhhZCwgMHg1OCwKLSAgICAgICAgMHhhZSwgMHg4NSwgMHhjNCwgMHgyMiwgMHg0MSwgMHhkZiwgMHhhZCwgMHg3NiwgMHg2MSwgMHhlNSwgMHg2ZiwKLSAgICAgICAgMHg3NCwgMHg0NSwgMHg2OSwgMHhkYywgMHgwMCwgMHg3OSwgMHhhYywgMHg4YiwgMHhhNiwgMHhjOSwgMHgzNSwKLSAgICAgICAgMHhkNCwgMHgzNCwgMHg2NCwgMHhkYywgMHgzNywgMHgwNiwgMHhiMSwgMHhhZSwgMHg4OCwgMHhjMSwgMHhhYywKLSAgICAgICAgMHhkOCwgMHhjOSwgMHgyYywgMHhhNiwgMHhlMCwgMHg3MywgMHg1YiwgMHgzNiwgMHhmMywgMHg3NCwgMHhlNiwKLSAgICAgICAgMHg4NCwgMHgwNSwgMHhlMywgMHhhOSwgMHg0NywgMHg2YSwgMHgxNCwgMHhiNiwgMHg0OSwgMHgzZCwgMHg4NSwKLSAgICAgICAgMHgzYSwgMHhlZSwgMHhlZSwgMHgyYiwgMHhhOCwgMHhlMiwgMHg2ZiwgMHgzMCwgMHg4MSwgMHhlOSwgMHg4YSwKLSAgICAgICAgMHhjYSwgMHhhNCwgMHhlMiwgMHhkMywgMHg4YiwgMHgwMSwgMHhiMSwgMHhmOSwgMHgwNCwgMHg3ZiwgMHhhZiwKLSAgICAgICAgMHgyMywgMHhmMCwgMHhhOSwgMHg1NCwgMHg0MSwgMHg5YywgMHhmZCwgMHhhMywgMHhmNCwgMHhhZSwgMHg2NSwKLSAgICAgICAgMHgxOCwgMHhmNywgMHgyNSwgMHg4YSwgMHhlMiwgMHgwMiwgMHgzOCwgMHhiOCwgMHhmZCwgMHgyYSwgMHg3YiwKLSAgICAgICAgMHg1YiwgMHhhOCwgMHg2ZCwgMHg2ZCwgMHg1ZCwgMHg5YSwgMHg1ZCwgMHhjYiwgMHhiYiwgMHhkMiwgMHhiNiwKLSAgICAgICAgMHhhNiwgMHhhMywgMHgxOSwgMHg1ZSwgMHhlMiwgMHgwMywgMHg3YiwgMHgxZCwgMHhjMiwgMHgxNywgMHg4ZCwKLSAgICAgICAgMHhiOCwgMHhhYywgMHhmYiwgMHg4OSwgMHgzOSwgMHgzNSwgMHhkNiwgMHg5YSwgMHg2YSwgMHhlOCwgMHg2NiwKLSAgICAgICAgMHg1NSwgMHhjYiwgMHhmNSwgMHhhYywgMHg3YiwgMHg5NiwgMHhlYiwgMHg1MCwgMHhjNiwgMHg4OCwgMHg2ZCwKLSAgICAgICAgMHg2NiwgMHhlOSwgMHhjZCwgMHg2YywgMHhkYiwgMHg0ZiwgMHhkMywgMHg5YSwgMHgwMCwgMHgyZiwgMHhlNiwKLSAgICAgICAgMHhmOSwgMHhhMywgMHhlNywgMHhiNSwgMHg0YSwgMHg5MywgMHg3ZiwgMHhhMiwgMHhjNiwgMHg3MywgMHhkYywKLSAgICAgICAgMHhkNywgMHgxNSwgMHg1NSwgMHhlZiwgMHg0OCwgMHg3ZCwgMHgwOSwgMHg1MiwgMHg2ZSwgMHgzYSwgMHhkNCwKLSAgICAgICAgMHhhYiwgMHgyZiwgMHhiZCwgMHg2MSwgMHgxNiwgMHgwYywgMHg3MywgMHg0OSwgMHhjNSwgMHgyNCwgMHg5MiwKLSAgICAgICAgMHg3ZiwgMHhhMiwgMHg2MywgMHhmZCwgMHhhYSwgMHhkNiwgMHgyZiwgMHg3MSwgMHgwZSwgMHhiMSwgMHg5MywKLSAgICAgICAgMHhmNywgMHgyZCwgMHhmNSwgMHhhNCwgMHg5ZSwgMHg0ZSwgMHhiNSwgMHhkZCwgMHg0YiwgMHhmOCwgMHg2OCwKLSAgICAgICAgMHg0YywgMHhjYiwgMHhiOSwgMHg5MywgMHhhZCwgMHg2NSwgMHhjZSwgMHhkOSwgMHgyNiwgMHhhOSwgMHg4ZCwKLSAgICAgICAgMHgxOSwgMHhmNiwgMHhmMiwgMHhmNCwgMHhlNiwgMHhiNSwgMHhhZCwgMHhlNywgMHhjNiwgMHgzOSwgMHhhMCwKLSAgICAgICAgMHgxOCwgMHhlYiwgMHhjOSwgMHg3NywgMHg2YywgMHgzNSwgMHgyYSwgMHg0YiwgMHhmZSwgMHg4YSwgMHg5YywKLSAgICAgICAgMHhmZiwgMHgwMCwgMHgxMSwgMHhhZSwgMHgzYSwgMHg4YiwgMHhkZSwgMHg2MSwgMHhkMCwgMHg5ZSwgMHgzOSwKLSAgICAgICAgMHhiOCwgMHhlYiwgMHg1MywgMHhhYywgMHhiOSwgMHhhZSwgMHg1YiwgMHgwMCwgMHhmMywgMHgyNywgMHgxNCwKLSAgICAgICAgMHg5MiwgMHhjOSwgMHhmZSwgMHg4YSwgMHgzZiwgMHhkZSwgMHgzNSwgMHhhYywgMHgzYSwgMHg4OCwgMHg5MiwKLSAgICAgICAgMHhjZCwgMHhiMSwgMHg2ZSwgMHg3ZCwgMHhjZCwgMHgzMiwgMHg2NywgMHhlYiwgMHhjZCwgMHg3YSwgMHgxNCwKLSAgICAgICAgMHhmZSwgMHgwNCwgMHgyNiwgMHg2NiwgMHhjZSwgMHhmOSwgMHgyNiwgMHhiMywgMHhlNiwgMHg2ZSwgMHhiNCwKLSAgICAgICAgMHhkOSwgMHg0OCwgMHhjOCwgMHg4MiwgMHg0ZSwgMHgwNywgMHgzNSwgMHhhNywgMHg2ZiwgMHgyZiwgMHgwMiwKLSAgICAgICAgMHg5YSwgMHgwNiwgMHg1ZiwgMHg4YywgMHhhNCwgMHg4MywgMHgwZSwgMHgzMiwgMHgyYSwgMHg2OSwgMHhlMywKLSAgICAgICAgMHhkZCwgMHgxMiwgMHgwOCwgMHg5NywgMHg4NSwgMHhlYywgMHgyYSwgMHgyYSwgMHg0MiwgMHhmMSwgMHg3NiwKLSAgICAgICAgMHgyNiwgMHhlNCwgMHg2YSwgMHg1OSwgMHgwZSwgMHgxOCwgMHgxMCwgMHg2YSwgMHhkMiwgMHg4OSwgMHgwMiwKLSAgICAgICAgMHg2ZSwgMHgyYSwgMHg3MSwgMHhlYiwgMHg1YywgMHgxYywgMHg4YywgMHhhNiwgMHg0OCwgMHhiYiwgMHhkYywKLSAgICAgICAgMHg2MSwgMHg0MSwgMHgzNSwgMHg3MiwgMHgyOCwgMHg4NywgMHhkOSwgMHhmNiwgMHg0YSwgMHhiOSwgMHhlNywKLSAgICAgICAgMHgzOCwgMHhhZSwgMHg4YywgMHgzZCwgMHgzNiwgMHhkZCwgMHhkZSwgMHhjNCwgMHhiMCwgMHgyMSwgMHg1MSwKLSAgICAgICAgMHg3NiwgMHhhOCwgMHhjMCwgMHhhYSwgMHg5MywgMHgzMSwgMHhlNiwgMHhiYiwgMHgyZCwgMHg2NSwgMHg2MSwKLSAgICAgICAgMHgxOSwgMHhkMywgMHgxZSwgMHhiNSwgMHg0NiwgMHg1YSwgMHg5NiwgMHg1YSwgMHgzMCwgMHhhMCwgMHg3ZSwKLSAgICAgICAgMHgwNSwgMHg2OSwgMHg1YiwgMHhjOSwgMHhjNiwgMHgyOCwgMHg0MCwgMHhjZCwgMHgwOCwgMHg2NCwgMHgzYywKLSAgICAgICAgMHg3MywgMHg1NywgMHhlMSwgMHg5NCwgMHhmMSwgMHhjZCwgMHg1YSwgMHgyMSwgMHg4YywgMHhiOSwgMHg2MywKLSAgICAgICAgMHhlNywgMHg2NywgMHgxZCwgMHhhYiwgMHg0MCwgMHhiMSwgMHhmYiwgMHgwMCwgMHgxZCwgMHhmMCwgMHgyYiwKLSAgICAgICAgMHg5OSwgMHgyZCwgMHg2NiwgMHgzZSwgMHg4OCwgMHg3NSwgMHg4MSwgMHgzZiwgMHgzMSwgMHhmNiwgMHhhYiwKLSAgICAgICAgMHg2NCwgMHhkNiwgMHhiNCwgMHgxNywgMHhlZSwgMHhkMCwgMHg5ZSwgMHhlNCwgMHgzMiwgMHgxYSwgMHhhNywKLSAgICAgICAgMHgzMSwgMHhhZCwgMHgxOCwgMHgxNCwgMHgyNiwgMHhlZiwgMHg1NCwgMHhhNSwgMHhhOCwgMHg2NSwgMHhhMywKLSAgICAgICAgMHg5YywgMHg4MSwgMHhmYSwgMHg1NiwgMHg4YywgMHgyZCwgMHhjZSwgMHg2OCwgMHg0MCwgMHhjYiwgMHhmMSwKLSAgICAgICAgMHgzNywgMHhiZCwgMHg1ZSwgMHg4NSwgMHhlYSwgMHhkMSwgMHgwYywgMHhiYiwgMHgxOSwgMHg1NiwgMHgyMywKLSAgICAgICAgMHgyMCwgMHgxZiwgMHhhZCwgMHg1YywgMHg0MiwgMHgwOCwgMHgwMywgMHhiNSwgMHg1NSwgMHg5MSwgMHgwNCwKLSAgICAgICAgMHhjOSwgMHg4MCwgMHgzOCwgMHgwMCwgMHgwYSwgMHg3MSwgMHgzNCwgMHg2YywgMHgzMiwgMHgyNywgMHhlOSwKLSAgICAgICAgMHg1NSwgMHgyNSwgMHgxNSwgMHgyYywgMHg2OCwgMHhhMywgMHgzMCwgMHhlYiwgMHg1NCwgMHhhNSwgMHgxNSwKLSAgICAgICAgMHgwYywgMHhkMSwgMHgwMCwgMHhmZiwgMHhkOX07Ci0KLSAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBmaW5hbCBieXRlW10gc1Bob3RvQnl0ZUFycmF5Rm9yQ29tcGxpY2F0ZWRDYXNlOwotCi0gICAgc3RhdGljIHsKLSAgICAgICAgZmluYWwgaW50IGxlbmd0aCA9IHNQaG90b0ludEFycmF5Rm9yQ29tcGxpY2F0ZWRDYXNlLmxlbmd0aDsKLSAgICAgICAgc1Bob3RvQnl0ZUFycmF5Rm9yQ29tcGxpY2F0ZWRDYXNlID0gbmV3IGJ5dGVbbGVuZ3RoXTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotICAgICAgICAgICAgc1Bob3RvQnl0ZUFycmF5Rm9yQ29tcGxpY2F0ZWRDYXNlW2ldID0gKGJ5dGUpc1Bob3RvSW50QXJyYXlGb3JDb21wbGljYXRlZENhc2VbaV07Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VjIxU2ltcGxlQ2FzZTFfUGFyc2luZygpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JJbXBvcnRUZXN0KFYyMSwgUi5yYXcudjIxX3NpbXBsZV8xKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0oKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIk4iLCAiQW5kbztSb2lkOyIsIEFycmF5cy5hc0xpc3QoIkFuZG8iLCAiUm9pZCIsICIiKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFYyMVNpbXBsZUNhc2UxX1R5cGVfR2VuZXJpYygpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JJbXBvcnRUZXN0KFZDYXJkQ29uZmlnLlZDQVJEX1RZUEVfVjIxX0dFTkVSSUNfVVRGOCwgUi5yYXcudjIxX3NpbXBsZV8xKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0oKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZChTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRkFNSUxZX05BTUUsICJBbmRvIikKLSAgICAgICAgICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuR0lWRU5fTkFNRSwgIlJvaWQiKQotICAgICAgICAgICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5ESVNQTEFZX05BTUUsICJSb2lkIEFuZG8iKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VjIxU2ltcGxlQ2FzZTFfVHlwZV9KYXBhbmVzZSgpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JJbXBvcnRUZXN0KFZDYXJkQ29uZmlnLlZDQVJEX1RZUEVfVjIxX0pBUEFORVNFX1NKSVMsIFIucmF3LnYyMV9zaW1wbGVfMSk7Ci0gICAgICAgIG1WZXJpZmllci5hZGRDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWQoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkZBTUlMWV9OQU1FLCAiQW5kbyIpCi0gICAgICAgICAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkdJVkVOX05BTUUsICJSb2lkIikKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIG5hbWUtcmVsYXRlZCBzdHJpbmdzIG9ubHkgY29udGFpbnMgcHJpbnRhYmxlIEFzY2lpLAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIG9yZGVyIGlzIHJlbWFpbmVkIHRvIGJlIFVTJ3M6Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyAiUHJlZml4IEdpdmVuIE1pZGRsZSBGYW1pbHkgU3VmZml4IgotICAgICAgICAgICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5ESVNQTEFZX05BTUUsICJSb2lkIEFuZG8iKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VjIxU2ltcGxlQ2FzZTIoKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9ySW1wb3J0VGVzdChWQ2FyZENvbmZpZy5WQ0FSRF9UWVBFX1YyMV9KQVBBTkVTRV9TSklTLCBSLnJhdy52MjFfc2ltcGxlXzIpOwotICAgICAgICBtVmVyaWZpZXIuYWRkQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5ESVNQTEFZX05BTUUsICJBbmRvIFJvaWQiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VjIxU2ltcGxlQ2FzZTMoKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9ySW1wb3J0VGVzdChWMjEsIFIucmF3LnYyMV9zaW1wbGVfMyk7Ci0gICAgICAgIG1WZXJpZmllci5hZGRDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWQoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkZBTUlMWV9OQU1FLCAiQW5kbyIpCi0gICAgICAgICAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkdJVkVOX05BTUUsICJSb2lkIikKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vICJGTiIgZmllbGQgc2hvdWxkIGJlIHByZWZlcmVkIHNpbmNlIGl0IHNob3VsZCBjb250YWluIHRoZSBvcmlnaW5hbAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3JkZXIgaW50ZW5kZWQgYnkgdGhlIGF1dGhvciBvZiB0aGUgZmlsZS4KLSAgICAgICAgICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRElTUExBWV9OQU1FLCAiQW5kbyBSb2lkIik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdHMgJzsnIGlzIHByb3Blcmx5IGhhbmRsZWQgYnkgVkNhcmRQYXJzZXIgaW1wbGVtZW50YXRpb24uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFYyMUJhY2tzbGFzaENhc2VfUGFyc2luZygpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JJbXBvcnRUZXN0KFYyMSwgUi5yYXcudjIxX2JhY2tzbGFzaCk7Ci0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJWRVJTSU9OIiwgIjIuMSIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiTiIsICI7QTtCXFw7Q1xcOztEOzpFO1xcXFw7IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoIiIsICJBO0JcXCIsICJDXFw7IiwgIkQiLCAiOkUiLCAiXFxcXCIsICIiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJGTiIsICJBO0JcXENcXDtEOkVcXFxcIik7Ci0gICAgICAgIAotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3RzIENvbnRhY3RTdHJ1Y3QgY29ycmVjdGx5IGlnbm9yZXMgcmVkdW5kYW50IGZpZWxkcyBpbiAiTiIgcHJvcGVydHkgdmFsdWVzIGFuZAotICAgICAqIGluc2VydHMgbmFtZSByZWxhdGVkIGRhdGEuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFYyMUJhY2tzbGFzaENhc2UoKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9ySW1wb3J0VGVzdChWMjEsIFIucmF3LnYyMV9iYWNrc2xhc2gpOwotICAgICAgICBtVmVyaWZpZXIuYWRkQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gRkFNSUxZX05BTUUgaXMgZW1wdHkgYW5kIHJlbW92ZWQgaW4gdGhpcyB0ZXN0Li4uCi0gICAgICAgICAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkdJVkVOX05BTUUsICJBO0JcXCIpCi0gICAgICAgICAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLk1JRERMRV9OQU1FLCAiQ1xcOyIpCi0gICAgICAgICAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBSRUZJWCwgIkQiKQotICAgICAgICAgICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5TVUZGSVgsICI6RSIpCi0gICAgICAgICAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkRJU1BMQVlfTkFNRSwgIkE7QlxcQ1xcO0Q6RVxcXFwiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0T3JnQmVmb3JUaXRsZSgpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JJbXBvcnRUZXN0KFYyMSwgUi5yYXcudjIxX29yZ19iZWZvcmVfdGl0bGUpOwotICAgICAgICBDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtIGVsZW0gPSBtVmVyaWZpZXIuYWRkQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbSgpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRElTUExBWV9OQU1FLCAiTm9ybWFsIEd1eSIpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKE9yZ2FuaXphdGlvbi5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KE9yZ2FuaXphdGlvbi5DT01QQU5ZLCAiQ29tcGFueSIpCi0gICAgICAgICAgICAgICAgLnB1dChPcmdhbml6YXRpb24uREVQQVJUTUVOVCwgIk9yZ2FuaXphdGlvbiBEZXZpc2lvbiBSb29tIFNoZWV0IE5vLiIpCi0gICAgICAgICAgICAgICAgLnB1dChPcmdhbml6YXRpb24uVElUTEUsICJFeGNlbGxlbnQgSmFuaXRvciIpCi0gICAgICAgICAgICAgICAgLnB1dChPcmdhbml6YXRpb24uVFlQRSwgT3JnYW5pemF0aW9uLlRZUEVfV09SSyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFRpdGxlQmVmb3JPcmcoKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9ySW1wb3J0VGVzdChWMjEsIFIucmF3LnYyMV90aXRsZV9iZWZvcmVfb3JnKTsKLSAgICAgICAgQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbSBlbGVtID0gbVZlcmlmaWVyLmFkZENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0oKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkRJU1BMQVlfTkFNRSwgIk5pY2UgR3V5Iik7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoT3JnYW5pemF0aW9uLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoT3JnYW5pemF0aW9uLkNPTVBBTlksICJNYXJ2ZXJvdXMiKQotICAgICAgICAgICAgICAgIC5wdXQoT3JnYW5pemF0aW9uLkRFUEFSVE1FTlQsICJQZXJmZWN0IEdyZWF0IEdvb2QgQmFkIFBvb3IiKQotICAgICAgICAgICAgICAgIC5wdXQoT3JnYW5pemF0aW9uLlRJVExFLCAiQ29vbCBUaXRsZSIpCi0gICAgICAgICAgICAgICAgLnB1dChPcmdhbml6YXRpb24uVFlQRSwgT3JnYW5pemF0aW9uLlRZUEVfV09SSyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVmVyaWZpZXMgdGhhdCB2Q2FyZCBpbXBvcnRlciBjb3JyZWN0bHkgaW50ZXJwcmV0ICJQUkVGIiBhdHRyaWJ1dGUgdG8gSVNfUFJJTUFSWS4KLSAgICAgKiBUaGUgZGF0YSBjb250YWluIHRocmVlIGNhc2VzOiBvbmUgIlBSRUYiLCBubyAiUFJFRiIgYW5kIG11bHRpcGxlICJQUkVGIiwgaW4gZWFjaCB0eXBlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RWMjFQcmVmVG9Jc1ByaW1hcnkoKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9ySW1wb3J0VGVzdChWMjEsIFIucmF3LnYyMV9wcmVmX2hhbmRsaW5nKTsKLSAgICAgICAgQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbSBlbGVtID0gbVZlcmlmaWVyLmFkZENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0oKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KERhdGEuTUlNRVRZUEUsIFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRElTUExBWV9OQU1FLCAiU21pdGgiKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjEiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9IT01FKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjIiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9XT1JLKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuSVNfUFJJTUFSWSwgMSk7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICIzIikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfSVNETik7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoRW1haWwuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChFbWFpbC5EQVRBLCAidGVzdEBleGFtcGxlLmNvbSIpCi0gICAgICAgICAgICAgICAgLnB1dChFbWFpbC5UWVBFLCBFbWFpbC5UWVBFX0hPTUUpCi0gICAgICAgICAgICAgICAgLnB1dChFbWFpbC5JU19QUklNQVJZLCAxKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChFbWFpbC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KEVtYWlsLkRBVEEsICJ0ZXN0MkBleGFtaW5hdGlvbi5jb20iKQotICAgICAgICAgICAgICAgIC5wdXQoRW1haWwuVFlQRSwgRW1haWwuVFlQRV9NT0JJTEUpCi0gICAgICAgICAgICAgICAgLnB1dChFbWFpbC5JU19QUklNQVJZLCAxKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChPcmdhbml6YXRpb24uQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChPcmdhbml6YXRpb24uQ09NUEFOWSwgIkNvbXBhbnkiKQotICAgICAgICAgICAgICAgIC5wdXQoT3JnYW5pemF0aW9uLlRJVExFLCAiRW5naW5lZXIiKQotICAgICAgICAgICAgICAgIC5wdXQoT3JnYW5pemF0aW9uLlRZUEUsIE9yZ2FuaXphdGlvbi5UWVBFX1dPUkspOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKE9yZ2FuaXphdGlvbi5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KE9yZ2FuaXphdGlvbi5DT01QQU5ZLCAiTXlzdGVyeSIpCi0gICAgICAgICAgICAgICAgLnB1dChPcmdhbml6YXRpb24uVElUTEUsICJCbG9nZ2VyIikKLSAgICAgICAgICAgICAgICAucHV0KE9yZ2FuaXphdGlvbi5UWVBFLCBPcmdhbml6YXRpb24uVFlQRV9XT1JLKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChPcmdhbml6YXRpb24uQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChPcmdhbml6YXRpb24uQ09NUEFOWSwgIlBvZXRyeSIpCi0gICAgICAgICAgICAgICAgLnB1dChPcmdhbml6YXRpb24uVElUTEUsICJQb2V0IikKLSAgICAgICAgICAgICAgICAucHV0KE9yZ2FuaXphdGlvbi5UWVBFLCBPcmdhbml6YXRpb24uVFlQRV9XT1JLKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0cyBhbGwgdGhlIHByb3BlcnRpZXMgaW4gYSBjb21wbGljYXRlZCB2Q2FyZCBhcmUgY29ycmVjdGx5IHBhcnNlZCBieSB0aGUgVkNhcmRQYXJzZXIuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFYyMUNvbXBsaWNhdGVkQ2FzZV9QYXJzaW5nKCkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckltcG9ydFRlc3QoVjIxLCBSLnJhdy52MjFfY29tcGxpY2F0ZWQpOwotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiVkVSU0lPTiIsICIyLjEiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIk4iLCAiR3VtcDtGb3JyZXN0O0hvZ2U7UG9zO1RhbyIsCi0gICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KCJHdW1wIiwgIkZvcnJlc3QiLCAiSG9nZSIsICJQb3MiLCAiVGFvIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiRk4iLCAiSm9lIER1ZSIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiT1JHIiwgIkd1bXAgU2hyaW1wIENvLjtTYWxlcyBEZXB0LjtNYW5hZ2VyO0Zpc2gga2VlcGVyIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoIkd1bXAgU2hyaW1wIENvLiIsICJTYWxlcyBEZXB0LjtNYW5hZ2VyIiwgIkZpc2gga2VlcGVyIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiUk9MRSIsICJGaXNoIENha2UgS2VlcGVyISIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiVElUTEUiLCAiU2hyaW1wIE1hbiIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiWC1DTEFTUyIsICJQVUJMSUMiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIlRFTCIsICIoMTExKSA1NTUtMTIxMiIsIG5ldyBUeXBlU2V0KCJXT1JLIiwgIlZPSUNFIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiVEVMIiwgIig0MDQpIDU1NS0xMjEyIiwgbmV3IFR5cGVTZXQoIkhPTUUiLCAiVk9JQ0UiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJURUwiLCAiMDMxMTExMTExMSIsIG5ldyBUeXBlU2V0KCJDRUxMIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiVEVMIiwgIjAzMjIyMjIyMjIiLCBuZXcgVHlwZVNldCgiVklERU8iKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJURUwiLCAiMDMzMzMzMzMzMyIsIG5ldyBUeXBlU2V0KCJWT0lDRSIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIkFEUiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiOzsxMDAgV2F0ZXJzIEVkZ2U7QmF5dG93bjtMQTszMDMxNDtVbml0ZWQgU3RhdGVzIG9mIEFtZXJpY2EiLAotICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdCgiIiwgIiIsICIxMDAgV2F0ZXJzIEVkZ2UiLCAiQmF5dG93biIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJMQSIsICIzMDMxNCIsICJVbml0ZWQgU3RhdGVzIG9mIEFtZXJpY2EiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgbnVsbCwgbmV3IFR5cGVTZXQoIldPUksiKSwgbnVsbCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJMQUJFTCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiMTAwIFdhdGVycyBFZGdlXHJcbkJheXRvd24sIExBIDMwMzE0XHJcblVuaXRlZCAgU3RhdGVzIG9mIEFtZXJpY2EiLAotICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgbnVsbCwgbUNvbnRlbnRWYWx1ZXNGb3JRUCwgbmV3IFR5cGVTZXQoIldPUksiKSwgbnVsbCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJBRFIiLAotICAgICAgICAgICAgICAgICAgICAgICAgIjs7NDIgUGxhbnRhdGlvbiBTdC47QmF5dG93bjtMQTszMDMxNDtVbml0ZWQgU3RhdGVzIG9mIEFtZXJpY2EiLAotICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdCgiIiwgIiIsICI0MiBQbGFudGF0aW9uIFN0LiIsICJCYXl0b3duIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxBIiwgIjMwMzE0IiwgIlVuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYSIpLCBudWxsLCBudWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgVHlwZVNldCgiSE9NRSIpLCBudWxsKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIkxBQkVMIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICI0MiBQbGFudGF0aW9uIFN0LlxyXG5CYXl0b3duLCBMQSAzMDMxNFxyXG5Vbml0ZWQgIFN0YXRlcyBvZiBBbWVyaWNhIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIG51bGwsIG1Db250ZW50VmFsdWVzRm9yUVAsCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgVHlwZVNldCgiSE9NRSIpLCBudWxsKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIkVNQUlMIiwgImZvcnJlc3RndW1wQHdhbGxhZGFsbGEuY29tIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBUeXBlU2V0KCJQUkVGIiwgIklOVEVSTkVUIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiRU1BSUwiLCAiY2VsbEBleGFtcGxlLmNvbSIsIG5ldyBUeXBlU2V0KCJDRUxMIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiTk9URSIsICJUaGUgZm9sbG93aW5nIG5vdGUgaXMgdGhlIGV4YW1wbGUgZnJvbSBSRkMgMjA0NS4iKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIk5PVEUiLAotICAgICAgICAgICAgICAgICAgICAgICAgIk5vdydzIHRoZSB0aW1lIGZvciBhbGwgZm9sayB0byBjb21lIHRvIHRoZSBhaWQgb2YgdGhlaXIgY291bnRyeS4iLAotICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgbnVsbCwgbUNvbnRlbnRWYWx1ZXNGb3JRUCwgbnVsbCwgbnVsbCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJQSE9UTyIsIG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBzUGhvdG9CeXRlQXJyYXlGb3JDb21wbGljYXRlZENhc2UsIG1Db250ZW50VmFsdWVzRm9yQmFzZTY0VjIxLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFR5cGVTZXQoIkpQRUciKSwgbnVsbCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJYLUFUVFJJQlVURSIsICJTb21lIFN0cmluZyIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiQkRBWSIsICIxOTgwMDEwMSIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiR0VPIiwgIjM1LjY1NjM4NTQsMTM5LjY5OTQyMzMiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIlVSTCIsICJodHRwOi8vd3d3LmV4YW1wbGUuY29tLyIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiUkVWIiwgIjIwMDgwNDI0VDE5NTI0M1oiKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGVja3MgQ29udGFjdFN0cnVjdCBjb3JyZWN0bHkgaW5zZXJ0cyB2YWx1ZXMgaW4gYSBjb21wbGljYXRlZCB2Q2FyZAotICAgICAqIGludG8gQ29udGVudFJlc29sdmVyLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RWMjFDb21wbGljYXRlZENhc2UoKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9ySW1wb3J0VGVzdChWMjEsIFIucmF3LnYyMV9jb21wbGljYXRlZCk7Ci0gICAgICAgIENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0gZWxlbSA9IG1WZXJpZmllci5hZGRDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtKCk7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5GQU1JTFlfTkFNRSwgIkd1bXAiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuR0lWRU5fTkFNRSwgIkZvcnJlc3QiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuTUlERExFX05BTUUsICJIb2dlIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBSRUZJWCwgIlBvcyIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5TVUZGSVgsICJUYW8iKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRElTUExBWV9OQU1FLCAiSm9lIER1ZSIpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKE9yZ2FuaXphdGlvbi5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KE9yZ2FuaXphdGlvbi5UWVBFLCBPcmdhbml6YXRpb24uVFlQRV9XT1JLKQotICAgICAgICAgICAgICAgIC5wdXQoT3JnYW5pemF0aW9uLkNPTVBBTlksICJHdW1wIFNocmltcCBDby4iKQotICAgICAgICAgICAgICAgIC5wdXQoT3JnYW5pemF0aW9uLkRFUEFSVE1FTlQsICJTYWxlcyBEZXB0LjtNYW5hZ2VyIEZpc2gga2VlcGVyIikKLSAgICAgICAgICAgICAgICAucHV0KE9yZ2FuaXphdGlvbi5USVRMRSwgIlNocmltcCBNYW4iKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfV09SSykKLSAgICAgICAgICAgICAgICAvLyBQaG9uZSBudW1iZXIgaXMgZXhwZWN0ZWQgdG8gYmUgZm9ybWF0ZWQgd2l0aCBOQU1QIGZvcm1hdCBpbiBkZWZhdWx0LgotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiMTExLTU1NS0xMjEyIik7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX0hPTUUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICI0MDQtNTU1LTEyMTIiKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfTU9CSUxFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiMDMxLTExMS0xMTExIik7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX0NVU1RPTSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLkxBQkVMLCAiVklERU8iKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiMDMyLTIyMi0yMjIyIik7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX0NVU1RPTSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLkxBQkVMLCAiVk9JQ0UiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiMDMzLTMzMy0zMzMzIik7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoU3RydWN0dXJlZFBvc3RhbC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuVFlQRSwgU3RydWN0dXJlZFBvc3RhbC5UWVBFX1dPUkspCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLkNPVU5UUlksICJVbml0ZWQgU3RhdGVzIG9mIEFtZXJpY2EiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5QT1NUQ09ERSwgIjMwMzE0IikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuUkVHSU9OLCAiTEEiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5DSVRZLCAiQmF5dG93biIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlNUUkVFVCwgIjEwMCBXYXRlcnMgRWRnZSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLkZPUk1BVFRFRF9BRERSRVNTLAotICAgICAgICAgICAgICAgICAgICAgICAgIjEwMCBXYXRlcnMgRWRnZSBCYXl0b3duIExBIDMwMzE0IFVuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYSIpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKFN0cnVjdHVyZWRQb3N0YWwuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlRZUEUsIFN0cnVjdHVyZWRQb3N0YWwuVFlQRV9IT01FKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5DT1VOVFJZLCAiVW5pdGVkIFN0YXRlcyBvZiBBbWVyaWNhIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuUE9TVENPREUsICIzMDMxNCIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlJFR0lPTiwgIkxBIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuQ0lUWSwgIkJheXRvd24iKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5TVFJFRVQsICI0MiBQbGFudGF0aW9uIFN0LiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLkZPUk1BVFRFRF9BRERSRVNTLAotICAgICAgICAgICAgICAgICAgICAgICAgIjQyIFBsYW50YXRpb24gU3QuIEJheXRvd24gTEEgMzAzMTQgVW5pdGVkIFN0YXRlcyBvZiBBbWVyaWNhIik7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoRW1haWwuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLy8gIlRZUEU9SU5URVJORVQiIC0+IFRZUEVfQ1VTVE9NICsgdGhlIGxhYmVsICJJTlRFUk5FVCIKLSAgICAgICAgICAgICAgICAucHV0KEVtYWlsLlRZUEUsIEVtYWlsLlRZUEVfQ1VTVE9NKQotICAgICAgICAgICAgICAgIC5wdXQoRW1haWwuTEFCRUwsICJJTlRFUk5FVCIpCi0gICAgICAgICAgICAgICAgLnB1dChFbWFpbC5EQVRBLCAiZm9ycmVzdGd1bXBAd2FsbGFkYWxsYS5jb20iKQotICAgICAgICAgICAgICAgIC5wdXQoRW1haWwuSVNfUFJJTUFSWSwgMSk7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoRW1haWwuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChFbWFpbC5UWVBFLCBFbWFpbC5UWVBFX01PQklMRSkKLSAgICAgICAgICAgICAgICAucHV0KEVtYWlsLkRBVEEsICJjZWxsQGV4YW1wbGUuY29tIik7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoTm90ZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KE5vdGUuTk9URSwgIlRoZSBmb2xsb3dpbmcgbm90ZSBpcyB0aGUgZXhhbXBsZSBmcm9tIFJGQyAyMDQ1LiIpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKE5vdGUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChOb3RlLk5PVEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAiTm93J3MgdGhlIHRpbWUgZm9yIGFsbCBmb2xrIHRvIGNvbWUgdG8gdGhlIGFpZCBvZiB0aGVpciBjb3VudHJ5LiIpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKFBob3RvLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC8vIE5vIGluZm9ybWF0aW9uIGFib3V0IGl0cyBpbWFnZSBmb3JtYXQgY2FuIGJlIGluc2VydGVkLgotICAgICAgICAgICAgICAgIC5wdXQoUGhvdG8uUEhPVE8sIHNQaG90b0J5dGVBcnJheUZvckNvbXBsaWNhdGVkQ2FzZSk7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoRXZlbnQuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChFdmVudC5TVEFSVF9EQVRFLCAiMTk4MDAxMDEiKQotICAgICAgICAgICAgICAgIC5wdXQoRXZlbnQuVFlQRSwgRXZlbnQuVFlQRV9CSVJUSERBWSk7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoV2Vic2l0ZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFdlYnNpdGUuVVJMLCAiaHR0cDovL3d3dy5leGFtcGxlLmNvbS8iKQotICAgICAgICAgICAgICAgIC5wdXQoV2Vic2l0ZS5UWVBFLCBXZWJzaXRlLlRZUEVfSE9NRVBBR0UpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RWMzBTaW1wbGVfUGFyc2luZygpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JJbXBvcnRUZXN0KFYzMCwgUi5yYXcudjMwX3NpbXBsZSk7Ci0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJWRVJTSU9OIiwgIjMuMCIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiRk4iLCAiQW5kIFJvaWQiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIk4iLCAiQW5kO1JvaWQ7OzsiLCBBcnJheXMuYXNMaXN0KCJBbmQiLCAiUm9pZCIsICIiLCAiIiwgIiIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIk9SRyIsICJPcGVuO0hhbmRzZXQ7IEFsbGlhbmNlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoIk9wZW4iLCAiSGFuZHNldCIsICIgQWxsaWFuY2UiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJTT1JULVNUUklORyIsICJhbmRyb2lkIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJURUwiLCAiMDMwMDAwMDAwMCIsIG5ldyBUeXBlU2V0KCJQUkVGIiwgIlZPSUNFIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiQ0xBU1MiLCAiUFVCTElDIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJYLUdOTyIsICIwIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJYLUdOIiwgImdyb3VwMCIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiWC1SRURVQ1RJT04iLCAiMCIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiUkVWIiwgIjIwMDgxMDMxVDA2NTg1NFoiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VjMwU2ltcGxlKCkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckltcG9ydFRlc3QoVjMwLCBSLnJhdy52MzBfc2ltcGxlKTsKLSAgICAgICAgQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbSBlbGVtID0gbVZlcmlmaWVyLmFkZENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0oKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkZBTUlMWV9OQU1FLCAiQW5kIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkdJVkVOX05BTUUsICJSb2lkIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkRJU1BMQVlfTkFNRSwgIkFuZCBSb2lkIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBIT05FVElDX0dJVkVOX05BTUUsICJhbmRyb2lkIik7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoT3JnYW5pemF0aW9uLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoT3JnYW5pemF0aW9uLkNPTVBBTlksICJPcGVuIikKLSAgICAgICAgICAgICAgICAucHV0KE9yZ2FuaXphdGlvbi5ERVBBUlRNRU5ULCAiSGFuZHNldCAgQWxsaWFuY2UiKQotICAgICAgICAgICAgICAgIC5wdXQoT3JnYW5pemF0aW9uLlRZUEUsIE9yZ2FuaXphdGlvbi5UWVBFX1dPUkspOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9DVVNUT00pCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5MQUJFTCwgIlZPSUNFIikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjAzMC0wMDAtMDAwMCIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5JU19QUklNQVJZLCAxKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VjIxSmFwYW5lc2UxX1BhcnNpbmcoKSB7Ci0gICAgICAgIC8vIFRob3VnaCBKYXBhbmVzZSBjYXJlZXJzIGFwcGVuZCAiOzs7OyIgYXQgdGhlIGVuZCBvZiB0aGUgdmFsdWUgb2YgIlNPVU5EIiwKLSAgICAgICAgLy8gdkNhcmQgMi4xLzMuMCBzcGVjaWZpY2F0aW9uIGRvZXMgbm90IGFsbG93IG11bHRpcGxlIHZhbHVlcy4KLSAgICAgICAgLy8gRG8gbm90IG5lZWQgdG8gaGFuZGxlIGl0IGFzIG11bHRpcGxlIHZhbHVlcy4KLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JJbXBvcnRUZXN0KFZDYXJkQ29uZmlnLlZDQVJEX1RZUEVfVjIxX0pBUEFORVNFX1NKSVMsCi0gICAgICAgICAgICAgICAgUi5yYXcudjIxX2phcGFuZXNlXzEpOwotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiVkVSU0lPTiIsICIyLjEiLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIk4iLCAiXHU1Qjg5XHU4NUU0XHUzMEVEXHUzMEE0XHUzMEM5Ozs7OyIsCi0gICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KCJcdTVCODlcdTg1RTRcdTMwRURcdTMwQTRcdTMwQzkiLCAiIiwgIiIsICIiLCAiIiksCi0gICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBtQ29udGVudFZhbHVlc0ZvclNKaXMsIG51bGwsIG51bGwpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiU09VTkQiLAotICAgICAgICAgICAgICAgICAgICAgICAgIlx1RkY3MVx1RkY5RFx1RkY4NFx1RkY5RVx1RkY3M1x1RkY5Qlx1RkY3Mlx1RkY4NFx1RkY5RTs7OzsiLAotICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgbnVsbCwgbUNvbnRlbnRWYWx1ZXNGb3JTSmlzLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFR5cGVTZXQoIlgtSVJNQy1OIiksIG51bGwpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiVEVMIiwgIjAzMDAwMDAwMDAiLCBudWxsLCBudWxsLCBudWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFR5cGVTZXQoIlZPSUNFIiwgIlBSRUYiKSwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRlc3RWMjFKYXBhbmVzZTFDb21tb24oaW50IHJlc0lkLCBpbnQgdmNhcmRUeXBlLCBib29sZWFuIGphcGFuZXNlKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9ySW1wb3J0VGVzdCh2Y2FyZFR5cGUsIHJlc0lkKTsKLSAgICAgICAgQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbSBlbGVtID0gbVZlcmlmaWVyLmFkZENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0oKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkZBTUlMWV9OQU1FLCAiXHU1Qjg5XHU4NUU0XHUzMEVEXHUzMEE0XHUzMEM5IikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkRJU1BMQVlfTkFNRSwgIlx1NUI4OVx1ODVFNFx1MzBFRFx1MzBBNFx1MzBDOSIpCi0gICAgICAgICAgICAgICAgLy8gV2hpbGUgdkNhcmQgcGFyc2VyIGRvZXMgbm90IHNwbGl0ICJTT1VORCIgcHJvcGVydHkgdmFsdWVzLAotICAgICAgICAgICAgICAgIC8vIENvbnRhY3RTdHJ1Y3QgY2FyZSBpdC4KLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBIT05FVElDX0dJVkVOX05BTUUsCi0gICAgICAgICAgICAgICAgICAgICAgICAiXHVGRjcxXHVGRjlEXHVGRjg0XHVGRjlFXHVGRjczXHVGRjlCXHVGRjcyXHVGRjg0XHVGRjlFIik7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLy8gUGhvbmUgbnVtYmVyIGZvcm1hdHRpbmcgaXMgZGlmZmVyZW50LgotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAoamFwYW5lc2UgPyAiMDMtMDAwMC0wMDAwIiA6ICIwMzAtMDAwLTAwMDAiKSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfQ1VTVE9NKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTEFCRUwsICJWT0lDRSIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5JU19QUklNQVJZLCAxKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBWZXJpZmllcyB2Q2FyZCB3aXRoIEphcGFuZXNlIGNhbiBiZSBwYXJzZWQgY29ycmVjdGx5IHdpdGgKLSAgICAgKiB7QGxpbmsgYW5kcm9pZC5waW0udmNhcmQuVkNhcmRDb25maWcjVkNBUkRfVFlQRV9WMjFfR0VORVJJQ19VVEY4fS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VjIxSmFwYW5lc2UxX1R5cGVfR2VuZXJpY19VdGY4KCkgewotICAgICAgICB0ZXN0VjIxSmFwYW5lc2UxQ29tbW9uKAotICAgICAgICAgICAgICAgIFIucmF3LnYyMV9qYXBhbmVzZV8xLCBWQ2FyZENvbmZpZy5WQ0FSRF9UWVBFX1YyMV9HRU5FUklDX1VURjgsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBWZXJpZmllcyB2Q2FyZCB3aXRoIEphcGFuZXNlIGNhbiBiZSBwYXJzZWQgY29ycmVjdGx5IHdpdGgKLSAgICAgKiB7QGxpbmsgYW5kcm9pZC5waW0udmNhcmQuVkNhcmRDb25maWcjVkNBUkRfVFlQRV9WMjFfSkFQQU5FU0VfU0pJU30uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFYyMUphcGFuZXNlMV9UeXBlX0phcGFuZXNlX1NqaXMoKSB7Ci0gICAgICAgIHRlc3RWMjFKYXBhbmVzZTFDb21tb24oCi0gICAgICAgICAgICAgICAgUi5yYXcudjIxX2phcGFuZXNlXzEsIFZDYXJkQ29uZmlnLlZDQVJEX1RZUEVfVjIxX0pBUEFORVNFX1NKSVMsIHRydWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFZlcmlmaWVzIHZDYXJkIHdpdGggSmFwYW5lc2UgY2FuIGJlIHBhcnNlZCBjb3JyZWN0bHkgd2l0aAotICAgICAqIHtAbGluayBhbmRyb2lkLnBpbS52Y2FyZC5WQ2FyZENvbmZpZyNWQ0FSRF9UWVBFX1YyMV9KQVBBTkVTRV9VVEY4fS4KLSAgICAgKiBzaW5jZSB2Q2FyZCAyLjEgc3BlY2lmaWVzIHRoZSBjaGFyc2V0IG9mIGVhY2ggbGluZSBpZiBpdCBjb250YWlucyBub24tQXNjaWkuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFYyMUphcGFuZXNlMV9UeXBlX0phcGFuZXNlX1V0ZjgoKSB7Ci0gICAgICAgIHRlc3RWMjFKYXBhbmVzZTFDb21tb24oCi0gICAgICAgICAgICAgICAgUi5yYXcudjIxX2phcGFuZXNlXzEsIFZDYXJkQ29uZmlnLlZDQVJEX1RZUEVfVjIxX0pBUEFORVNFX1VURjgsIHRydWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RWMjFKYXBhbmVzZTJfUGFyc2luZygpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JJbXBvcnRUZXN0KFZDYXJkQ29uZmlnLlZDQVJEX1RZUEVfVjIxX0pBUEFORVNFX1NKSVMsCi0gICAgICAgICAgICAgICAgUi5yYXcudjIxX2phcGFuZXNlXzIpOwotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiVkVSU0lPTiIsICIyLjEiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIk4iLCAiXHU1Qjg5XHU4NUU0O1x1MzBFRFx1MzBBNFx1MzBDOVx1MDAzMTs7OyIsCi0gICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KCJcdTVCODlcdTg1RTQiLCAiXHUzMEVEXHUzMEE0XHUzMEM5XHUwMDMxIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiIsICIiLCAiIiksCi0gICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBtQ29udGVudFZhbHVlc0ZvclNKaXMsIG51bGwsIG51bGwpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiRk4iLCAiXHU1Qjg5XHU4NUU0XHUwMDIwXHUzMEVEXHUzMEE0XHUzMEM5XHUwMDIwXHUwMDMxIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIG51bGwsIG1Db250ZW50VmFsdWVzRm9yU0ppcywgbnVsbCwgbnVsbCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJTT1VORCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiXHVGRjcxXHVGRjlEXHVGRjg0XHVGRjlFXHVGRjczO1x1RkY5Qlx1RkY3Mlx1RkY4NFx1RkY5RVx1MDAzMTs7OyIsCi0gICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBudWxsLCBtQ29udGVudFZhbHVlc0ZvclNKaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgVHlwZVNldCgiWC1JUk1DLU4iKSwgbnVsbCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJBRFIiLAotICAgICAgICAgICAgICAgICAgICAgICAgIjtcdTY3NzFcdTRFQUNcdTkwRkRcdTZFMEJcdThDMzdcdTUzM0FcdTY4NUMiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJcdTRFMThcdTc1M0FcdTAwMzJcdTAwMzZcdTAwMkRcdTAwMzFcdTMwQkIiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJcdTMwRUJcdTMwRUFcdTMwQTJcdTMwRjNcdTMwQkZcdTMwRUZcdTMwRkNcdTAwMzYiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJcdTk2OEU7Ozs7MTUwLTg1MTI7IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoIiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTY3NzFcdTRFQUNcdTkwRkRcdTZFMEJcdThDMzdcdTUzM0FcdTY4NUMiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1NEUxOFx1NzUzQVx1MDAzMlx1MDAzNlx1MDAyRFx1MDAzMVx1MzBCQiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHUzMEVCXHUzMEVBXHUzMEEyXHUzMEYzXHUzMEJGXHUzMEVGXHUzMEZDIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTAwMzZcdTk2OEUiLCAiIiwgIiIsICIiLCAiMTUwLTg1MTIiLCAiIiksCi0gICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBtQ29udGVudFZhbHVlc0ZvclFQQW5kU0ppcywgbmV3IFR5cGVTZXQoIkhPTUUiKSwgbnVsbCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJOT1RFIiwgIlx1MzBFMVx1MzBFMiIsIG51bGwsIG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICBtQ29udGVudFZhbHVlc0ZvclFQQW5kU0ppcywgbnVsbCwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFYyMUphcGFuZXNlMl9UeXBlX0dlbmVyaWNfVXRmOCgpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JJbXBvcnRUZXN0KFYyMSwgUi5yYXcudjIxX2phcGFuZXNlXzIpOwotICAgICAgICBDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtIGVsZW0gPSBtVmVyaWZpZXIuYWRkQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbSgpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRkFNSUxZX05BTUUsICJcdTVCODlcdTg1RTQiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuR0lWRU5fTkFNRSwgIlx1MzBFRFx1MzBBNFx1MzBDOVx1MDAzMSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5ESVNQTEFZX05BTUUsCi0gICAgICAgICAgICAgICAgICAgICAgICAiXHU1Qjg5XHU4NUU0XHUwMDIwXHUzMEVEXHUzMEE0XHUzMEM5XHUwMDIwXHUwMDMxIikKLSAgICAgICAgICAgICAgICAvLyBDb250YWN0U3RydWN0IHNob3VsZCBjb3JyZWN0bHkgc3BsaXQgIlNPVU5EIiBwcm9wZXJ0eSBpbnRvIHNldmVyYWwgZWxlbWVudHMsCi0gICAgICAgICAgICAgICAgLy8gZXZlbiB0aG91Z2ggVkNhcmRQYXJzZXIgc2lkZSBkb2VzIG5vdCBjYXJlIGl0LgotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfRkFNSUxZX05BTUUsICJcdUZGNzFcdUZGOURcdUZGODRcdUZGOUVcdUZGNzMiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfR0lWRU5fTkFNRSwgIlx1RkY5Qlx1RkY3Mlx1RkY4NFx1RkY5RVx1MDAzMSIpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKFN0cnVjdHVyZWRQb3N0YWwuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlBPU1RDT0RFLCAiMTUwLTg1MTIiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5TVFJFRVQsCi0gICAgICAgICAgICAgICAgICAgICAgICAiXHU2NzcxXHU0RUFDXHU5MEZEXHU2RTBCXHU4QzM3XHU1MzNBXHU2ODVDIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAiXHU0RTE4XHU3NTNBXHUwMDMyXHUwMDM2XHUwMDJEXHUwMDMxXHUzMEJCIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAiXHUzMEVCXHUzMEVBXHUzMEEyXHUzMEYzXHUzMEJGXHUzMEVGXHUzMEZDIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAiXHUwMDM2XHU5NjhFIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuRk9STUFUVEVEX0FERFJFU1MsCi0gICAgICAgICAgICAgICAgICAgICAgICAiXHU2NzcxXHU0RUFDXHU5MEZEXHU2RTBCXHU4QzM3XHU1MzNBXHU2ODVDIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAiXHU0RTE4XHU3NTNBXHUwMDMyXHUwMDM2XHUwMDJEXHUwMDMxXHUzMEJCIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAiXHUzMEVCXHUzMEVBXHUzMEEyXHUzMEYzXHUzMEJGXHUzMEVGXHUzMEZDIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAiXHUwMDM2XHU5NjhFIDE1MC04NTEyIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuVFlQRSwgU3RydWN0dXJlZFBvc3RhbC5UWVBFX0hPTUUpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKE5vdGUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChOb3RlLk5PVEUsICJcdTMwRTFcdTMwRTIiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VjIxTXVsdGlwbGVFbnRyeUNhc2VfUGFyc2UoKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9ySW1wb3J0VGVzdChWQ2FyZENvbmZpZy5WQ0FSRF9UWVBFX1YyMV9KQVBBTkVTRV9TSklTLAotICAgICAgICAgICAgICAgIFIucmF3LnYyMV9tdWx0aXBsZV9lbnRyeSk7Ci0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJWRVJTSU9OIiwgIjIuMSIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiTiIsICJcdTVCODlcdTg1RTRcdTMwRURcdTMwQTRcdTMwQzlcdTAwMzM7Ozs7IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoIlx1NUI4OVx1ODVFNFx1MzBFRFx1MzBBNFx1MzBDOVx1MDAzMyIsICIiLCAiIiwgIiIsICIiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIG1Db250ZW50VmFsdWVzRm9yU0ppcywgbnVsbCwgbnVsbCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJTT1VORCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiXHVGRjcxXHVGRjlEXHVGRjg0XHVGRjlFXHVGRjczXHVGRjlCXHVGRjcyXHVGRjg0XHVGRjlFXHUwMDMzOzs7OyIsCi0gICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBudWxsLCBtQ29udGVudFZhbHVlc0ZvclNKaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgVHlwZVNldCgiWC1JUk1DLU4iKSwgbnVsbCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJURUwiLCAiOSIsIG5ldyBUeXBlU2V0KCJYLU5FQy1TRUNSRVQiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJURUwiLCAiMTAiLCBuZXcgVHlwZVNldCgiWC1ORUMtSE9URUwiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJURUwiLCAiMTEiLCBuZXcgVHlwZVNldCgiWC1ORUMtU0NIT09MIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiVEVMIiwgIjEyIiwgbmV3IFR5cGVTZXQoIkZBWCIsICJIT01FIikpOwotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiVkVSU0lPTiIsICIyLjEiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIk4iLCAiXHU1Qjg5XHU4NUU0XHUzMEVEXHUzMEE0XHUzMEM5XHUwMDM0Ozs7OyIsCi0gICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KCJcdTVCODlcdTg1RTRcdTMwRURcdTMwQTRcdTMwQzlcdTAwMzQiLCAiIiwgIiIsICIiLCAiIiksCi0gICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBtQ29udGVudFZhbHVlc0ZvclNKaXMsIG51bGwsIG51bGwpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiU09VTkQiLAotICAgICAgICAgICAgICAgICAgICAgICAgIlx1RkY3MVx1RkY5RFx1RkY4NFx1RkY5RVx1RkY3M1x1RkY5Qlx1RkY3Mlx1RkY4NFx1RkY5RVx1MDAzNDs7OzsiLAotICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgbnVsbCwgbUNvbnRlbnRWYWx1ZXNGb3JTSmlzLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFR5cGVTZXQoIlgtSVJNQy1OIiksIG51bGwpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiVEVMIiwgIjEzIiwgbmV3IFR5cGVTZXQoIk1PREVNIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiVEVMIiwgIjE0IiwgbmV3IFR5cGVTZXQoIlBBR0VSIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiVEVMIiwgIjE1IiwgbmV3IFR5cGVTZXQoIlgtTkVDLUZBTUlMWSIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIlRFTCIsICIxNiIsIG5ldyBUeXBlU2V0KCJYLU5FQy1HSVJMIikpOwotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiVkVSU0lPTiIsICIyLjEiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIk4iLCAiXHU1Qjg5XHU4NUU0XHUzMEVEXHUzMEE0XHUzMEM5XHUwMDM1Ozs7OyIsCi0gICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KCJcdTVCODlcdTg1RTRcdTMwRURcdTMwQTRcdTMwQzlcdTAwMzUiLCAiIiwgIiIsICIiLCAiIiksCi0gICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBtQ29udGVudFZhbHVlc0ZvclNKaXMsIG51bGwsIG51bGwpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiU09VTkQiLAotICAgICAgICAgICAgICAgICAgICAgICAgIlx1RkY3MVx1RkY5RFx1RkY4NFx1RkY5RVx1RkY3M1x1RkY5Qlx1RkY3Mlx1RkY4NFx1RkY5RVx1MDAzNTs7OzsiLAotICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgbnVsbCwgbUNvbnRlbnRWYWx1ZXNGb3JTSmlzLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFR5cGVTZXQoIlgtSVJNQy1OIiksIG51bGwpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiVEVMIiwgIjE3IiwgbmV3IFR5cGVTZXQoIlgtTkVDLUJPWSIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIlRFTCIsICIxOCIsIG5ldyBUeXBlU2V0KCJYLU5FQy1GUklFTkQiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJURUwiLCAiMTkiLCBuZXcgVHlwZVNldCgiWC1ORUMtUEhTIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiVEVMIiwgIjIwIiwgbmV3IFR5cGVTZXQoIlgtTkVDLVJFU1RBVVJBTlQiKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFYyMU11bHRpcGxlRW50cnlDYXNlKCkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckltcG9ydFRlc3QoVkNhcmRDb25maWcuVkNBUkRfVFlQRV9WMjFfSkFQQU5FU0VfU0pJUywKLSAgICAgICAgICAgICAgICBSLnJhdy52MjFfbXVsdGlwbGVfZW50cnkpOwotICAgICAgICBDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtIGVsZW0gPSBtVmVyaWZpZXIuYWRkQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbSgpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRkFNSUxZX05BTUUsICJcdTVCODlcdTg1RTRcdTMwRURcdTMwQTRcdTMwQzlcdTAwMzMiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRElTUExBWV9OQU1FLCAiXHU1Qjg5XHU4NUU0XHUzMEVEXHUzMEE0XHUzMEM5XHUwMDMzIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBIT05FVElDX0dJVkVOX05BTUUsCi0gICAgICAgICAgICAgICAgICAgICAgICAiXHVGRjcxXHVGRjlEXHVGRjg0XHVGRjlFXHVGRjczXHVGRjlCXHVGRjcyXHVGRjg0XHVGRjlFXHUwMDMzIik7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX0NVU1RPTSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLkxBQkVMLCAiTkVDLVNFQ1JFVCIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICI5Iik7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX0NVU1RPTSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLkxBQkVMLCAiTkVDLUhPVEVMIikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjEwIik7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX0NVU1RPTSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLkxBQkVMLCAiTkVDLVNDSE9PTCIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICIxMSIpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9GQVhfSE9NRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjEyIik7Ci0KLSAgICAgICAgZWxlbSA9IG1WZXJpZmllci5hZGRDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtKCk7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5GQU1JTFlfTkFNRSwgIlx1NUI4OVx1ODVFNFx1MzBFRFx1MzBBNFx1MzBDOVx1MDAzNCIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5ESVNQTEFZX05BTUUsICJcdTVCODlcdTg1RTRcdTMwRURcdTMwQTRcdTMwQzlcdTAwMzQiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfR0lWRU5fTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICJcdUZGNzFcdUZGOURcdUZGODRcdUZGOUVcdUZGNzNcdUZGOUJcdUZGNzJcdUZGODRcdUZGOUVcdTAwMzQiKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfQ1VTVE9NKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTEFCRUwsICJNT0RFTSIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICIxMyIpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9QQUdFUikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjE0Iik7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX0NVU1RPTSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLkxBQkVMLCAiTkVDLUZBTUlMWSIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICIxNSIpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9DVVNUT00pCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5MQUJFTCwgIk5FQy1HSVJMIikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjE2Iik7Ci0KLSAgICAgICAgZWxlbSA9IG1WZXJpZmllci5hZGRDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtKCk7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5GQU1JTFlfTkFNRSwgIlx1NUI4OVx1ODVFNFx1MzBFRFx1MzBBNFx1MzBDOVx1MDAzNSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5ESVNQTEFZX05BTUUsICJcdTVCODlcdTg1RTRcdTMwRURcdTMwQTRcdTMwQzlcdTAwMzUiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfR0lWRU5fTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICJcdUZGNzFcdUZGOURcdUZGODRcdUZGOUVcdUZGNzNcdUZGOUJcdUZGNzJcdUZGODRcdUZGOUVcdTAwMzUiKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfQ1VTVE9NKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTEFCRUwsICJORUMtQk9ZIikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjE3Iik7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX0NVU1RPTSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLkxBQkVMLCAiTkVDLUZSSUVORCIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICIxOCIpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9DVVNUT00pCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5MQUJFTCwgIk5FQy1QSFMiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiMTkiKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfQ1VTVE9NKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTEFCRUwsICJORUMtUkVTVEFVUkFOVCIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICIyMCIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RJZ25vcmVBZ2VudFYyMV9QYXJzZSgpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JJbXBvcnRUZXN0KFYyMSwgUi5yYXcudjIxX3dpbm1vXzY1KTsKLSAgICAgICAgQ29udGVudFZhbHVlcyBjb250ZW50VmFsdWVzRm9yVmFsdWUgPSBuZXcgQ29udGVudFZhbHVlcygpOwotICAgICAgICBjb250ZW50VmFsdWVzRm9yVmFsdWUucHV0KCJWQUxVRSIsICJEQVRFIik7Ci0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJWRVJTSU9OIiwgIjIuMSIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiTiIsIEFycmF5cy5hc0xpc3QoIkV4YW1wbGUiLCAiIiwgIiIsICIiLCAiIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiRk4iLCAiRXhhbXBsZSIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiQU5OSVZFUlNBUlkiLCAiMjAwOTEwMTAiLCBjb250ZW50VmFsdWVzRm9yVmFsdWUpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiQUdFTlQiLCAiIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJYLUNMQVNTIiwgIlBVQkxJQyIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiWC1SRURVQ1RJT04iLCAiIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJYLU5PIiwgIiIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RJZ25vcmVBZ2VudFYyMSgpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JJbXBvcnRUZXN0KFYyMSwgUi5yYXcudjIxX3dpbm1vXzY1KTsKLSAgICAgICAgQ29udGVudFZhbHVlc1ZlcmlmaWVyIHZlcmlmaWVyID0gbmV3IENvbnRlbnRWYWx1ZXNWZXJpZmllcigpOwotICAgICAgICBDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtIGVsZW0gPSBtVmVyaWZpZXIuYWRkQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbSgpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRkFNSUxZX05BTUUsICJFeGFtcGxlIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkRJU1BMQVlfTkFNRSwgIkV4YW1wbGUiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VG9sZXJhdGVJbnZhbGlkQ29tbWVudExpa2VMaW5lVjIxKCkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckltcG9ydFRlc3QoVjIxLCBSLnJhdy52MjFfaW52YWxpZF9jb21tZW50X2xpbmUpOwotICAgICAgICBDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtIGVsZW0gPSBtVmVyaWZpZXIuYWRkQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbSgpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuR0lWRU5fTkFNRSwgIkNvbmZlcmVuY2UgQ2FsbCIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5ESVNQTEFZX05BTUUsICJDb25mZXJlbmNlIENhbGwiKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChOb3RlLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoTm90ZS5OT1RFLCAiVGhpcyBpcyBhbiAoc2hhcnAgLT4jPC0gc2hhcnApIGV4YW1wbGUuICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIlRoaXMgbWVzc2FnZSBtdXN0IE5PVCBiZSBpZ25vcmVkLiIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQYWdlclYzMF9QYXJzZSgpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JJbXBvcnRUZXN0KFYzMCwgUi5yYXcudjMwX2NvbW1hX3NlcGFyYXRlZCk7Ci0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJWRVJTSU9OIiwgIjMuMCIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiTiIsIEFycmF5cy5hc0xpc3QoIkYiLCAiRyIsICJNIiwgIiIsICIiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJURUwiLCAiNjEwMTIzMTIzNEBwYWdlcnNhbXBsZS5jb20iLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFR5cGVTZXQoIldPUksiLCAiTVNHIiwgIlBBR0VSIikpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQYWdlclYzMCgpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JJbXBvcnRUZXN0KFYzMCwgUi5yYXcudjMwX2NvbW1hX3NlcGFyYXRlZCk7Ci0gICAgICAgIENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0gZWxlbSA9IG1WZXJpZmllci5hZGRDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtKCk7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5GQU1JTFlfTkFNRSwgIkYiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuTUlERExFX05BTUUsICJNIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkdJVkVOX05BTUUsICJHIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkRJU1BMQVlfTkFNRSwgIkcgTSBGIik7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX1BBR0VSKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiNjEwMTIzMTIzNEBwYWdlcnNhbXBsZS5jb20iKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRKYXBhbml6YXRpb25UZXN0cy5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkSmFwYW5pemF0aW9uVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWI2MDM0Mi4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRKYXBhbml6YXRpb25UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDM0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQucGltLnZjYXJkOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXM7Ci1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuVkNhcmRDb25maWc7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5OaWNrbmFtZTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLk5vdGU7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5QaG9uZTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLlN0cnVjdHVyZWROYW1lOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuU3RydWN0dXJlZFBvc3RhbDsKLQotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLlByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0uVHlwZVNldDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLXB1YmxpYyBjbGFzcyBWQ2FyZEphcGFuaXphdGlvblRlc3RzIGV4dGVuZHMgVkNhcmRUZXN0c0Jhc2UgewotICAgIHByaXZhdGUgdm9pZCB0ZXN0TmFtZVV0ZjhDb21tb24oaW50IHZjYXJkVHlwZSkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckV4cG9ydFRlc3QodmNhcmRUeXBlKTsKLSAgICAgICAgQ29udGFjdEVudHJ5IGVudHJ5ID0gbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkZBTUlMWV9OQU1FLCAiXHUzMDc1XHUzMDhCXHUzMDY5IikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkdJVkVOX05BTUUsICJcdTMwOTFcdTMwOEFcdTMwNEIiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuTUlERExFX05BTUUsICJCIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBSRUZJWCwgIkRyLiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5TVUZGSVgsICJQaC5EIik7Ci0gICAgICAgIENvbnRlbnRWYWx1ZXMgY29udGVudFZhbHVlcyA9Ci0gICAgICAgICAgICAoVkNhcmRDb25maWcuaXNWMzAodmNhcmRUeXBlKSA/IG51bGwgOiBtQ29udGVudFZhbHVlc0ZvclFQQW5kVXRmOCk7Ci0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJGTiIsICJEci4gXHUzMDc1XHUzMDhCXHUzMDY5IEIgXHUzMDkxXHUzMDhBXHUzMDRCIFBoLkQiLAotICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudFZhbHVlcykKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJOIiwgIlx1MzA3NVx1MzA4Qlx1MzA2OTtcdTMwOTFcdTMwOEFcdTMwNEI7QjtEci47UGguRCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHUzMDc1XHUzMDhCXHUzMDY5IiwgIlx1MzA5MVx1MzA4QVx1MzA0QiIsICJCIiwgIkRyLiIsICJQaC5EIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIGNvbnRlbnRWYWx1ZXMsIG51bGwsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3ROYW1lVXRmOFYyMSgpIHsKLSAgICAgICAgdGVzdE5hbWVVdGY4Q29tbW9uKFZDYXJkQ29uZmlnLlZDQVJEX1RZUEVfVjIxX0pBUEFORVNFX1VURjgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3ROYW1lVXRmOFYzMCgpIHsKLSAgICAgICAgdGVzdE5hbWVVdGY4Q29tbW9uKFZDYXJkQ29uZmlnLlZDQVJEX1RZUEVfVjMwX0pBUEFORVNFX1VURjgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3ROYW1lU2hpZnRKaXMoKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdChWQ2FyZENvbmZpZy5WQ0FSRF9UWVBFX1YzMF9KQVBBTkVTRV9TSklTKTsKLSAgICAgICAgQ29udGFjdEVudHJ5IGVudHJ5ID0gbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkZBTUlMWV9OQU1FLCAiXHUzMDc1XHUzMDhCXHUzMDY5IikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkdJVkVOX05BTUUsICJcdTMwOTFcdTMwOEFcdTMwNEIiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuTUlERExFX05BTUUsICJCIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBSRUZJWCwgIkRyLiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5TVUZGSVgsICJQaC5EIik7Ci0KLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0oKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIkZOIiwgIkRyLiBcdTMwNzVcdTMwOEJcdTMwNjkgQiBcdTMwOTFcdTMwOEFcdTMwNEIgUGguRCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBtQ29udGVudFZhbHVlc0ZvclNKaXMpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiTiIsICJcdTMwNzVcdTMwOEJcdTMwNjk7XHUzMDkxXHUzMDhBXHUzMDRCO0I7RHIuO1BoLkQiLAotICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1MzA3NVx1MzA4Qlx1MzA2OSIsICJcdTMwOTFcdTMwOEFcdTMwNEIiLCAiQiIsICJEci4iLCAiUGguRCIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBtQ29udGVudFZhbHVlc0ZvclNKaXMsIG51bGwsIG51bGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERvQ29NbyBwaG9uZXMgcmVxdWlyZSBhbGwgbmFtZSBlbGVtZW50cyBzaG91bGQgYmUgaW4gImZhbWlseSBuYW1lIiBmaWVsZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TmFtZURvQ29NbygpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KFZDYXJkQ29uZmlnLlZDQVJEX1RZUEVfRE9DT01PKTsKLSAgICAgICAgQ29udGFjdEVudHJ5IGVudHJ5ID0gbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkZBTUlMWV9OQU1FLCAiXHUzMDc1XHUzMDhCXHUzMDY5IikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkdJVkVOX05BTUUsICJcdTMwOTFcdTMwOEFcdTMwNEIiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuTUlERExFX05BTUUsICJCIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBSRUZJWCwgIkRyLiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5TVUZGSVgsICJQaC5EIik7Ci0KLSAgICAgICAgZmluYWwgU3RyaW5nIGZ1bGxOYW1lID0gIkRyLiBcdTMwNzVcdTMwOEJcdTMwNjkgQiBcdTMwOTFcdTMwOEFcdTMwNEIgUGguRCI7Ci0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJOIiwgZnVsbE5hbWUgKyAiOzs7OyIsCi0gICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KGZ1bGxOYW1lLCAiIiwgIiIsICIiLCAiIiksCi0gICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBtQ29udGVudFZhbHVlc0ZvclNKaXMsIG51bGwsIG51bGwpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiRk4iLCBmdWxsTmFtZSwgbUNvbnRlbnRWYWx1ZXNGb3JTSmlzKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlNPVU5EIiwgIjs7OzsiLCBuZXcgVHlwZVNldCgiWC1JUk1DLU4iKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiIiwgbmV3IFR5cGVTZXQoIkhPTUUiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJFTUFJTCIsICIiLCBuZXcgVHlwZVNldCgiSE9NRSIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIkFEUiIsICIiLCBuZXcgVHlwZVNldCgiSE9NRSIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtQ0xBU1MiLCAiUFVCTElDIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLVJFRFVDVElPTiIsICIiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtTk8iLCAiIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLURDTS1ITU4tTU9ERSIsICIiKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdGVzdFBob25ldGljTmFtZUNvbW1vbihpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdCh2Y2FyZFR5cGUpOwotICAgICAgICBDb250YWN0RW50cnkgZW50cnkgPSBtVmVyaWZpZXIuYWRkSW5wdXRFbnRyeSgpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfRkFNSUxZX05BTUUsICJcdTMwODRcdTMwN0VcdTMwNjAiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfTUlERExFX05BTUUsICJcdTMwREZcdTMwQzlcdTMwRUJcdTMwQ0RcdTMwRkNcdTMwRTAiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfR0lWRU5fTkFNRSwgIlx1MzA1Rlx1MzA4RFx1MzA0NiIpOwotCi0gICAgICAgIGZpbmFsIENvbnRlbnRWYWx1ZXMgY29udGVudFZhbHVlcyA9Ci0gICAgICAgICAgICAoVkNhcmRDb25maWcudXNlc1NoaWZ0SmlzKHZjYXJkVHlwZSkgPwotICAgICAgICAgICAgICAgICAgICAoVkNhcmRDb25maWcuaXNWMzAodmNhcmRUeXBlKSA/IG1Db250ZW50VmFsdWVzRm9yU0ppcyA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvbnRlbnRWYWx1ZXNGb3JRUEFuZFNKaXMpIDoKLSAgICAgICAgICAgICAgICAgICAgKFZDYXJkQ29uZmlnLmlzVjMwKHZjYXJkVHlwZSkgPyBudWxsIDogbUNvbnRlbnRWYWx1ZXNGb3JRUEFuZFV0ZjgpKTsKLSAgICAgICAgUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSBlbGVtID0gbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW1XaXRoRW1wdHlOYW1lKCk7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWROb2RlKCJYLVBIT05FVElDLUxBU1QtTkFNRSIsICJcdTMwODRcdTMwN0VcdTMwNjAiLAotICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudFZhbHVlcykKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLVBIT05FVElDLU1JRERMRS1OQU1FIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJcdTMwREZcdTMwQzlcdTMwRUJcdTMwQ0RcdTMwRkNcdTMwRTAiLAotICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudFZhbHVlcykKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLVBIT05FVElDLUZJUlNULU5BTUUiLCAiXHUzMDVGXHUzMDhEXHUzMDQ2IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRWYWx1ZXMpOwotICAgICAgICBpZiAoVkNhcmRDb25maWcuaXNWMzAodmNhcmRUeXBlKSkgewotICAgICAgICAgICAgZWxlbS5hZGRFeHBlY3RlZE5vZGUoIlNPUlQtU1RSSU5HIiwKLSAgICAgICAgICAgICAgICAgICAgIlx1MzA4NFx1MzA3RVx1MzA2MCBcdTMwREZcdTMwQzlcdTMwRUJcdTMwQ0RcdTMwRkNcdTMwRTAgXHUzMDVGXHUzMDhEXHUzMDQ2IiwKLSAgICAgICAgICAgICAgICAgICAgY29udGVudFZhbHVlcyk7Ci0gICAgICAgIH0KLSAgICAgICAgQ29udGVudFZhbHVlc0J1aWxkZXIgYnVpbGRlciA9IG1WZXJpZmllci5hZGRDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWQoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpOwotICAgICAgICBidWlsZGVyLnB1dChTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19GQU1JTFlfTkFNRSwgIlx1MzA4NFx1MzA3RVx1MzA2MCIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19NSURETEVfTkFNRSwgIlx1MzBERlx1MzBDOVx1MzBFQlx1MzBDRFx1MzBGQ1x1MzBFMCIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19HSVZFTl9OQU1FLCAiXHUzMDVGXHUzMDhEXHUzMDQ2IikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkRJU1BMQVlfTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICJcdTMwODRcdTMwN0VcdTMwNjAgXHUzMERGXHUzMEM5XHUzMEVCXHUzMENEXHUzMEZDXHUzMEUwICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIlx1MzA1Rlx1MzA4RFx1MzA0NiIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQaG9uZXRpY05hbWVGb3JKYXBhbmVzZVYyMVV0ZjgoKSB7Ci0gICAgICAgIHRlc3RQaG9uZXRpY05hbWVDb21tb24oVkNhcmRDb25maWcuVkNBUkRfVFlQRV9WMjFfSkFQQU5FU0VfVVRGOCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBob25ldGljTmFtZUZvckphcGFuZXNlVjIxU2ppcygpIHsKLSAgICAgICAgdGVzdFBob25ldGljTmFtZUNvbW1vbihWQ2FyZENvbmZpZy5WQ0FSRF9UWVBFX1YyMV9KQVBBTkVTRV9TSklTKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGhvbmV0aWNOYW1lRm9ySmFwYW5lc2VWMzBVdGY4KCkgewotICAgICAgICB0ZXN0UGhvbmV0aWNOYW1lQ29tbW9uKFZDYXJkQ29uZmlnLlZDQVJEX1RZUEVfVjMwX0pBUEFORVNFX1VURjgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQaG9uZXRpY05hbWVGb3JKYXBhbmVzZVYzMFNKaXMoKSB7Ci0gICAgICAgIHRlc3RQaG9uZXRpY05hbWVDb21tb24oVkNhcmRDb25maWcuVkNBUkRfVFlQRV9WMzBfSkFQQU5FU0VfU0pJUyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBob25ldGljTmFtZUZvck1vYmlsZVYyMV8xKCkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckV4cG9ydFRlc3QoVkNhcmRDb25maWcuVkNBUkRfVFlQRV9WMjFfSkFQQU5FU0VfTU9CSUxFKTsKLSAgICAgICAgQ29udGFjdEVudHJ5IGVudHJ5ID0gbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBIT05FVElDX0ZBTUlMWV9OQU1FLCAiXHUzMDg0XHUzMDdFXHUzMDYwIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBIT05FVElDX01JRERMRV9OQU1FLCAiXHUzMERGXHUzMEM5XHUzMEVCXHUzMENEXHUzMEZDXHUzMEUwIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBIT05FVElDX0dJVkVOX05BTUUsICJcdTMwNUZcdTMwOERcdTMwNDYiKTsKLQotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiU09VTkQiLAotICAgICAgICAgICAgICAgICAgICAgICAgIlx1RkY5NFx1RkY4Rlx1RkY4MFx1RkY5RSBcdUZGOTBcdUZGODRcdUZGOUVcdUZGOTlcdUZGODhcdUZGNzBcdUZGOTEgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAiXHVGRjgwXHVGRjlCXHVGRjczOzs7OyIsCi0gICAgICAgICAgICAgICAgICAgICAgICBtQ29udGVudFZhbHVlc0ZvclNKaXMsIG5ldyBUeXBlU2V0KCJYLUlSTUMtTiIpKTsKLSAgICAgICAgQ29udGVudFZhbHVlc0J1aWxkZXIgYnVpbGRlciA9IG1WZXJpZmllci5hZGRDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWQoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpOwotICAgICAgICBidWlsZGVyLnB1dChTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19GQU1JTFlfTkFNRSwgIlx1RkY5NFx1RkY4Rlx1RkY4MFx1RkY5RSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19NSURETEVfTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICJcdUZGOTBcdUZGODRcdUZGOUVcdUZGOTlcdUZGODhcdUZGNzBcdUZGOTEiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfR0lWRU5fTkFNRSwgIlx1RkY4MFx1RkY5Qlx1RkY3MyIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5ESVNQTEFZX05BTUUsCi0gICAgICAgICAgICAgICAgICAgICAgICAiXHVGRjk0XHVGRjhGXHVGRjgwXHVGRjlFIFx1RkY5MFx1RkY4NFx1RkY5RVx1RkY5OVx1RkY4OFx1RkY3MFx1RkY5MSAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJcdUZGODBcdUZGOUJcdUZGNzMiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGhvbmV0aWNOYW1lRm9yTW9iaWxlVjIxXzIoKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdChWQ2FyZENvbmZpZy5WQ0FSRF9UWVBFX1YyMV9KQVBBTkVTRV9NT0JJTEUpOwotICAgICAgICBDb250YWN0RW50cnkgZW50cnkgPSBtVmVyaWZpZXIuYWRkSW5wdXRFbnRyeSgpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfRkFNSUxZX05BTUUsICJcdTMwODRcdTMwN0VcdTMwNjAiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfR0lWRU5fTkFNRSwgIlx1MzA1Rlx1MzA4RFx1MzA0NiIpOwotCi0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJTT1VORCIsICJcdUZGOTRcdUZGOEZcdUZGODBcdUZGOUUgXHVGRjgwXHVGRjlCXHVGRjczOzs7OyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db250ZW50VmFsdWVzRm9yU0ppcywgbmV3IFR5cGVTZXQoIlgtSVJNQy1OIikpOwotICAgICAgICBDb250ZW50VmFsdWVzQnVpbGRlciBidWlsZGVyID0gbVZlcmlmaWVyLmFkZENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0oKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZChTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSk7Ci0gICAgICAgIGJ1aWxkZXIucHV0KFN0cnVjdHVyZWROYW1lLlBIT05FVElDX0ZBTUlMWV9OQU1FLCAiXHVGRjk0XHVGRjhGXHVGRjgwXHVGRjlFIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBIT05FVElDX0dJVkVOX05BTUUsICJcdUZGODBcdUZGOUJcdUZGNzMiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRElTUExBWV9OQU1FLCAiXHVGRjk0XHVGRjhGXHVGRjgwXHVGRjlFIFx1RkY4MFx1RkY5Qlx1RkY3MyIpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB0ZXN0UG9zdGFsQWRkcmVzc1dpdGhKYXBhbmVzZUNvbW1vbihpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdCh2Y2FyZFR5cGUpOwotICAgICAgICBDb250YWN0RW50cnkgZW50cnkgPSBtVmVyaWZpZXIuYWRkSW5wdXRFbnRyeSgpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFN0cnVjdHVyZWRQb3N0YWwuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlBPQk9YLCAiXHU3OUMxXHU2NkY4XHU3QkIxMDciKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5TVFJFRVQsICJcdTk2REJcdTg5OEJcdTZDQTJcdTY3NTEiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5DSVRZLCAiXHU5RTdGXHU5QUE4XHU1RTAyIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuUkVHSU9OLCAiXHUwMEQ3XHUwMEQ3XHU3NzBDIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuUE9TVENPREUsICI0OTQtMTMxMyIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLkNPVU5UUlksICJcdTY1RTVcdTY3MkMiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5GT1JNQVRURURfQUREUkVTUywKLSAgICAgICAgICAgICAgICAgICAgICAgICJcdTMwNTNcdTMwOTNcdTMwNkFcdTMwNjhcdTMwNTNcdTMwOERcdTMwOTJcdTg5OEIiCi0gICAgICAgICAgICAgICAgICAgICAgICArICJcdTMwOEJcdTMwNkFcdTMwOTNcdTMwNjZcdTY2ODdcdTRFQkFcdTMwNjdcdTMwNTlcdTMwNEJcdUZGMUYiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5UWVBFLCBTdHJ1Y3R1cmVkUG9zdGFsLlRZUEVfQ1VTVE9NKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5MQUJFTCwgIlx1MzA0QVx1MzA4Mlx1MzA2MVx1MzA0Qlx1MzA0OFx1MzA4QSIpOwotCi0gICAgICAgIENvbnRlbnRWYWx1ZXMgY29udGVudFZhbHVlcyA9IChWQ2FyZENvbmZpZy51c2VzU2hpZnRKaXModmNhcmRUeXBlKSA/Ci0gICAgICAgICAgICAgICAgKFZDYXJkQ29uZmlnLmlzVjMwKHZjYXJkVHlwZSkgPyBtQ29udGVudFZhbHVlc0ZvclNKaXMgOgotICAgICAgICAgICAgICAgICAgICBtQ29udGVudFZhbHVlc0ZvclFQQW5kU0ppcykgOgotICAgICAgICAgICAgICAgIChWQ2FyZENvbmZpZy5pc1YzMCh2Y2FyZFR5cGUpID8gbUNvbnRlbnRWYWx1ZXNGb3JVdGY4IDoKLSAgICAgICAgICAgICAgICAgICAgbUNvbnRlbnRWYWx1ZXNGb3JRUEFuZFV0ZjgpKTsKLQotICAgICAgICBQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtIGVsZW0gPSBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbVdpdGhFbXB0eU5hbWUoKTsKLSAgICAgICAgLy8gTEFCRUwgbXVzdCBiZSBpZ25vcmVkIGluIHZDYXJkIDIuMS4gQXMgZm9yIHZDYXJkIDMuMCwgdGhlIGN1cnJlbnQgYmVoYXZpb3IgaXMKLSAgICAgICAgLy8gc2FtZSBhcyB0aGF0IGluIHZDYXJkIDMuMCwgd2hpY2ggY2FuIGJlIGNoYW5nZWQgaW4gdGhlIGZ1dHVyZS4KLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZE5vZGUoIkFEUiIsIEFycmF5cy5hc0xpc3QoIlx1NzlDMVx1NjZGOFx1N0JCMTA3IiwKLSAgICAgICAgICAgICAgICAiIiwgIlx1OTZEQlx1ODk4Qlx1NkNBMlx1Njc1MSIsICJcdTlFN0ZcdTlBQThcdTVFMDIiLCAiXHUwMEQ3XHUwMEQ3XHU3NzBDIiwKLSAgICAgICAgICAgICAgICAiNDk0LTEzMTMiLCAiXHU2NUU1XHU2NzJDIiksCi0gICAgICAgICAgICAgICAgY29udGVudFZhbHVlcyk7Ci0gICAgICAgIG1WZXJpZmllci5hZGRDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtKCkuYWRkRXhwZWN0ZWQoU3RydWN0dXJlZFBvc3RhbC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuUE9CT1gsICJcdTc5QzFcdTY2RjhcdTdCQjEwNyIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlNUUkVFVCwgIlx1OTZEQlx1ODk4Qlx1NkNBMlx1Njc1MSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLkNJVFksICJcdTlFN0ZcdTlBQThcdTVFMDIiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5SRUdJT04sICJcdTAwRDdcdTAwRDdcdTc3MEMiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5QT1NUQ09ERSwgIjQ5NC0xMzEzIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuQ09VTlRSWSwgIlx1NjVFNVx1NjcyQyIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLkZPUk1BVFRFRF9BRERSRVNTLAotICAgICAgICAgICAgICAgICAgICAgICAgIlx1NjVFNVx1NjcyQyA0OTQtMTMxMyBcdTAwRDdcdTAwRDdcdTc3MEMgXHU5RTdGXHU5QUE4XHU1RTAyICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIlx1OTZEQlx1ODk4Qlx1NkNBMlx1Njc1MSAiICsgIlx1NzlDMVx1NjZGOFx1N0JCMTA3IikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuVFlQRSwgU3RydWN0dXJlZFBvc3RhbC5UWVBFX0hPTUUpOwotICAgIH0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UG9zdGFsQWRkcmVzc3dpdGhKYXBhbmVzZVYyMSgpIHsKLSAgICAgICAgdGVzdFBvc3RhbEFkZHJlc3NXaXRoSmFwYW5lc2VDb21tb24oVkNhcmRDb25maWcuVkNBUkRfVFlQRV9WMjFfSkFQQU5FU0VfU0pJUyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVmVyaWZpZXMgdGhhdCBvbmx5IG9uZSBhZGRyZXNzIGZpZWxkIGlzIGVtaXR0ZWQgdG93YXJkIERvQ29NbyBwaG9uZXMuCi0gICAgICogUHJlZmVyZWQgdHlwZSBtdXN0IChzaG91bGQ/KSBiZTogSE9NRSA+IFdPUksgPiBPVEhFUiA+IENVU1RPTQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RQb3N0YWxBZHJyZXNzRm9yRG9Db01vXzEoKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdChWQ2FyZENvbmZpZy5WQ0FSRF9UWVBFX0RPQ09NTyk7Ci0gICAgICAgIENvbnRhY3RFbnRyeSBlbnRyeSA9IG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZFBvc3RhbC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuVFlQRSwgU3RydWN0dXJlZFBvc3RhbC5UWVBFX1dPUkspCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlBPQk9YLCAiMSIpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFN0cnVjdHVyZWRQb3N0YWwuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlRZUEUsIFN0cnVjdHVyZWRQb3N0YWwuVFlQRV9PVEhFUikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuUE9CT1gsICIyIik7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZFBvc3RhbC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuVFlQRSwgU3RydWN0dXJlZFBvc3RhbC5UWVBFX0hPTUUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlBPQk9YLCAiMyIpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFN0cnVjdHVyZWRQb3N0YWwuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlRZUEUsIFN0cnVjdHVyZWRQb3N0YWwuVFlQRV9DVVNUT00pCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLkxBQkVMLCAiY3VzdG9tIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuUE9CT1gsICI0Iik7Ci0KLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW1XaXRoRW1wdHlOYW1lKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiIiwgbmV3IFR5cGVTZXQoIkhPTUUiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJFTUFJTCIsICIiLCBuZXcgVHlwZVNldCgiSE9NRSIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtQ0xBU1MiLCAiUFVCTElDIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLVJFRFVDVElPTiIsICIiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtTk8iLCAiIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLURDTS1ITU4tTU9ERSIsICIiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIkFEUiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KCIzIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiksIG5ldyBUeXBlU2V0KCJIT01FIikpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQb3N0YWxBZHJyZXNzRm9yRG9Db01vXzIoKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdChWQ2FyZENvbmZpZy5WQ0FSRF9UWVBFX0RPQ09NTyk7Ci0gICAgICAgIENvbnRhY3RFbnRyeSBlbnRyeSA9IG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZFBvc3RhbC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuVFlQRSwgU3RydWN0dXJlZFBvc3RhbC5UWVBFX09USEVSKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5QT0JPWCwgIjEiKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhTdHJ1Y3R1cmVkUG9zdGFsLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5UWVBFLCBTdHJ1Y3R1cmVkUG9zdGFsLlRZUEVfV09SSykKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuUE9CT1gsICIyIik7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZFBvc3RhbC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuVFlQRSwgU3RydWN0dXJlZFBvc3RhbC5UWVBFX0NVU1RPTSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuTEFCRUwsICJjdXN0b20iKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5QT0JPWCwgIjMiKTsKLQotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbVdpdGhFbXB0eU5hbWUoKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICIiLCBuZXcgVHlwZVNldCgiSE9NRSIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIkVNQUlMIiwgIiIsIG5ldyBUeXBlU2V0KCJIT01FIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1DTEFTUyIsICJQVUJMSUMiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtUkVEVUNUSU9OIiwgIiIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1OTyIsICIiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtRENNLUhNTi1NT0RFIiwgIiIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiQURSIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoIjIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiKSwgbmV3IFR5cGVTZXQoIldPUksiKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBvc3RhbEFkcnJlc3NGb3JEb0NvTW9fMygpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KFZDYXJkQ29uZmlnLlZDQVJEX1RZUEVfRE9DT01PKTsKLSAgICAgICAgQ29udGFjdEVudHJ5IGVudHJ5ID0gbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhTdHJ1Y3R1cmVkUG9zdGFsLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5UWVBFLCBTdHJ1Y3R1cmVkUG9zdGFsLlRZUEVfQ1VTVE9NKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5MQUJFTCwgImN1c3RvbTEiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5QT0JPWCwgIjEiKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhTdHJ1Y3R1cmVkUG9zdGFsLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5UWVBFLCBTdHJ1Y3R1cmVkUG9zdGFsLlRZUEVfT1RIRVIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlBPQk9YLCAiMiIpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFN0cnVjdHVyZWRQb3N0YWwuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlRZUEUsIFN0cnVjdHVyZWRQb3N0YWwuVFlQRV9DVVNUT00pCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLkxBQkVMLCAiY3VzdG9tMiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlBPQk9YLCAiMyIpOwotCi0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtV2l0aEVtcHR5TmFtZSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiVEVMIiwgIiIsIG5ldyBUeXBlU2V0KCJIT01FIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiRU1BSUwiLCAiIiwgbmV3IFR5cGVTZXQoIkhPTUUiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLUNMQVNTIiwgIlBVQkxJQyIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1SRURVQ1RJT04iLCAiIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLU5PIiwgIiIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1EQ00tSE1OLU1PREUiLCAiIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJBRFIiLCBBcnJheXMuYXNMaXN0KCIyIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIikpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFZlcmlmaWVzIHRoZSB2Q2FyZCBleHBvcnRlciB0b2xlcmF0ZXMgbnVsbCBUWVBFLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RQb3N0YWxBZHJyZXNzRm9yRG9Db01vXzQoKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdChWQ2FyZENvbmZpZy5WQ0FSRF9UWVBFX0RPQ09NTyk7Ci0gICAgICAgIENvbnRhY3RFbnRyeSBlbnRyeSA9IG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZFBvc3RhbC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuUE9CT1gsICIxIik7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZFBvc3RhbC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuVFlQRSwgU3RydWN0dXJlZFBvc3RhbC5UWVBFX09USEVSKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5QT0JPWCwgIjIiKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhTdHJ1Y3R1cmVkUG9zdGFsLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5UWVBFLCBTdHJ1Y3R1cmVkUG9zdGFsLlRZUEVfSE9NRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuUE9CT1gsICIzIik7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZFBvc3RhbC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuVFlQRSwgU3RydWN0dXJlZFBvc3RhbC5UWVBFX1dPUkspCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlBPQk9YLCAiNCIpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFN0cnVjdHVyZWRQb3N0YWwuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlBPQk9YLCAiNSIpOwotCi0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtV2l0aEVtcHR5TmFtZSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiVEVMIiwgIiIsIG5ldyBUeXBlU2V0KCJIT01FIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiRU1BSUwiLCAiIiwgbmV3IFR5cGVTZXQoIkhPTUUiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLUNMQVNTIiwgIlBVQkxJQyIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1SRURVQ1RJT04iLCAiIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLU5PIiwgIiIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1EQ00tSE1OLU1PREUiLCAiIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJBRFIiLAotICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdCgiMyIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIpLCBuZXcgVHlwZVNldCgiSE9NRSIpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdGVzdEphcGFuZXNlUGhvbmVOdW1iZXJDb21tb24oaW50IHZjYXJkVHlwZSkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckV4cG9ydFRlc3QodmNhcmRUeXBlKTsKLSAgICAgICAgQ29udGFjdEVudHJ5IGVudHJ5ID0gbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjAzMTIzNDEyMzQiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9IT01FKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjA5MDEyMzQxMjM0IikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfTU9CSUxFKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW1XaXRoRW1wdHlOYW1lKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiMDMtMTIzNC0xMjM0IiwgbmV3IFR5cGVTZXQoIkhPTUUiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiMDkwLTEyMzQtMTIzNCIsIG5ldyBUeXBlU2V0KCJDRUxMIikpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RKYXBhbmVzZVBob25lTnVtYmVyVjIxXzEoKSB7Ci0gICAgICAgIHRlc3RKYXBhbmVzZVBob25lTnVtYmVyQ29tbW9uKFZDYXJkQ29uZmlnLlZDQVJEX1RZUEVfVjIxX0pBUEFORVNFX1VURjgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RKYXBhbmVzZVBob25lTnVtYmVyVjMwKCkgewotICAgICAgICB0ZXN0SmFwYW5lc2VQaG9uZU51bWJlckNvbW1vbihWQ2FyZENvbmZpZy5WQ0FSRF9UWVBFX1YzMF9KQVBBTkVTRV9VVEY4KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SmFwYW5lc2VQaG9uZU51bWJlckRvQ29NbygpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KFZDYXJkQ29uZmlnLlZDQVJEX1RZUEVfRE9DT01PKTsKLSAgICAgICAgQ29udGFjdEVudHJ5IGVudHJ5ID0gbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjAzMTIzNDEyMzQiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9IT01FKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjA5MDEyMzQxMjM0IikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfTU9CSUxFKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW1XaXRoRW1wdHlOYW1lKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJFTUFJTCIsICIiLCBuZXcgVHlwZVNldCgiSE9NRSIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtQ0xBU1MiLCAiUFVCTElDIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLVJFRFVDVElPTiIsICIiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtTk8iLCAiIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLURDTS1ITU4tTU9ERSIsICIiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIkFEUiIsICIiLCBuZXcgVHlwZVNldCgiSE9NRSIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICIwMy0xMjM0LTEyMzQiLCBuZXcgVHlwZVNldCgiSE9NRSIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICIwOTAtMTIzNC0xMjM0IiwgbmV3IFR5cGVTZXQoIkNFTEwiKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE5vdGVEb0NvTW8oKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdChWQ2FyZENvbmZpZy5WQ0FSRF9UWVBFX0RPQ09NTyk7Ci0gICAgICAgIENvbnRhY3RFbnRyeSBlbnRyeSA9IG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoTm90ZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KE5vdGUuTk9URSwgIm5vdGUxIik7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoTm90ZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KE5vdGUuTk9URSwgIm5vdGUyIik7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoTm90ZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KE5vdGUuTk9URSwgIm5vdGUzIik7Ci0KLSAgICAgICAgLy8gTW9yZSB0aGFuIG9uZSBub3RlIGZpZWxkcyBtdXN0IGJlIGFnZ3JlZ2F0ZWQgaW50byBvbmUgbm90ZS4KLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW1XaXRoRW1wdHlOYW1lKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiIiwgbmV3IFR5cGVTZXQoIkhPTUUiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJFTUFJTCIsICIiLCBuZXcgVHlwZVNldCgiSE9NRSIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtQ0xBU1MiLCAiUFVCTElDIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLVJFRFVDVElPTiIsICIiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtTk8iLCAiIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLURDTS1ITU4tTU9ERSIsICIiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIkFEUiIsICIiLCBuZXcgVHlwZVNldCgiSE9NRSIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIk5PVEUiLCAibm90ZTFcbm5vdGUyXG5ub3RlMyIsIG1Db250ZW50VmFsdWVzRm9yUVApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RBbmRyb2lkQ3VzdG9tVjIxKCkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckV4cG9ydFRlc3QoVkNhcmRDb25maWcuVkNBUkRfVFlQRV9WMjFfR0VORVJJQ19VVEY4KTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKS5hZGRDb250ZW50VmFsdWVzKE5pY2tuYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoTmlja25hbWUuTkFNRSwgIlx1MzA0RFx1MzA4M1x1MzBGQ1x1MzBBOFx1MzBDM1x1MzBDMVx1MzBGQyIpOwotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbVdpdGhFbXB0eU5hbWUoKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtQU5EUk9JRC1DVVNUT00iLAotICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdChOaWNrbmFtZS5DT05URU5UX0lURU1fVFlQRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1MzA0RFx1MzA4M1x1MzBGQ1x1MzBBOFx1MzBDM1x1MzBDMVx1MzBGQyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiksCi0gICAgICAgICAgICAgICAgICAgICAgICBtQ29udGVudFZhbHVlc0ZvclFQQW5kVXRmOCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkVGVzdHNCYXNlLmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRUZXN0c0Jhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDg1N2UwYy4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRUZXN0c0Jhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLnBpbS52Y2FyZDsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRQcm92aWRlck9wZXJhdGlvbjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFByb3ZpZGVyUmVzdWx0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50VmFsdWVzOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5FbnRpdHlJdGVyYXRvcjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkFzc2V0RmlsZURlc2NyaXB0b3I7Ci1pbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3I7Ci1pbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3JXaW5kb3c7Ci1pbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5JQnVsa0N1cnNvcjsKLWltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLklDb250ZW50T2JzZXJ2ZXI7Ci1pbXBvcnQgYW5kcm9pZC5uZXQuVXJpOwotaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKLWltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yOwotaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOwotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLlZDYXJkQ29uZmlnOwotaW1wb3J0IGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2U7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLS8qKgotICogQWxtb3N0IGEgZGVhZCBjb3B5IG9mIGFuZHJvaWQudGVzdC5tb2NrLk1vY2tDb250ZW50UHJvdmlkZXIsIGJ1dCBkaWZmZXJlbnQgaW4gdGhhdCB0aGlzCi0gKiBjbGFzcyBleHRlbmRzIENvbnRlbnRQcm92aWRlciwgbm90IGltcGxlbWVudGluZyBJQ29udGVudFByb3ZpZGVyLAotICogc28gdGhhdCBNb2NrQ29udGVudFJlc29sdmVyIGlzIGFibGUgdG8gYWNjZXB0IHRoaXMgY2xhc3MgOigKLSAqLwotY2xhc3MgTW9ja0NvbnRlbnRQcm92aWRlciBleHRlbmRzIENvbnRlbnRQcm92aWRlciB7Ci0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gb25DcmVhdGUoKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgYnVsa0luc2VydChVcmkgdXJsLCBDb250ZW50VmFsdWVzW10gaW5pdGlhbFZhbHVlcykgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oInVuaW1wbGVtZW50ZWQgbW9jayBtZXRob2QiKTsKLSAgICB9Ci0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKLSAgICBwdWJsaWMgSUJ1bGtDdXJzb3IgYnVsa1F1ZXJ5KFVyaSB1cmwsIFN0cmluZ1tdIHByb2plY3Rpb24sIFN0cmluZyBzZWxlY3Rpb24sCi0gICAgICAgICAgICBTdHJpbmdbXSBzZWxlY3Rpb25BcmdzLCBTdHJpbmcgc29ydE9yZGVyLCBJQ29udGVudE9ic2VydmVyIG9ic2VydmVyLAotICAgICAgICAgICAgQ3Vyc29yV2luZG93IHdpbmRvdykgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigidW5pbXBsZW1lbnRlZCBtb2NrIG1ldGhvZCIpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQotICAgIHB1YmxpYyBpbnQgZGVsZXRlKFVyaSB1cmwsIFN0cmluZyBzZWxlY3Rpb24sIFN0cmluZ1tdIHNlbGVjdGlvbkFyZ3MpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJ1bmltcGxlbWVudGVkIG1vY2sgbWV0aG9kIik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRUeXBlKFVyaSB1cmwpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJ1bmltcGxlbWVudGVkIG1vY2sgbWV0aG9kIik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFVyaSBpbnNlcnQoVXJpIHVybCwgQ29udGVudFZhbHVlcyBpbml0aWFsVmFsdWVzKSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigidW5pbXBsZW1lbnRlZCBtb2NrIG1ldGhvZCIpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBQYXJjZWxGaWxlRGVzY3JpcHRvciBvcGVuRmlsZShVcmkgdXJsLCBTdHJpbmcgbW9kZSkgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oInVuaW1wbGVtZW50ZWQgbW9jayBtZXRob2QiKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQXNzZXRGaWxlRGVzY3JpcHRvciBvcGVuQXNzZXRGaWxlKFVyaSB1cmksIFN0cmluZyBtb2RlKSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigidW5pbXBsZW1lbnRlZCBtb2NrIG1ldGhvZCIpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBDb250ZW50UHJvdmlkZXJSZXN1bHRbXSBhcHBseUJhdGNoKEFycmF5TGlzdDxDb250ZW50UHJvdmlkZXJPcGVyYXRpb24+IG9wZXJhdGlvbnMpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJ1bmltcGxlbWVudGVkIG1vY2sgbWV0aG9kIik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEN1cnNvciBxdWVyeShVcmkgdXJsLCBTdHJpbmdbXSBwcm9qZWN0aW9uLCBTdHJpbmcgc2VsZWN0aW9uLCBTdHJpbmdbXSBzZWxlY3Rpb25BcmdzLAotICAgICAgICAgICAgU3RyaW5nIHNvcnRPcmRlcikgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oInVuaW1wbGVtZW50ZWQgbW9jayBtZXRob2QiKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IHVwZGF0ZShVcmkgdXJsLCBDb250ZW50VmFsdWVzIHZhbHVlcywgU3RyaW5nIHNlbGVjdGlvbiwgU3RyaW5nW10gc2VsZWN0aW9uQXJncykgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oInVuaW1wbGVtZW50ZWQgbW9jayBtZXRob2QiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSUJpbmRlciBhc0JpbmRlcigpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJ1bmltcGxlbWVudGVkIG1vY2sgbWV0aG9kIik7Ci0gICAgfQotfQotCi0vKioKLSAqIEJhc2VDbGFzcyBmb3IgdkNhcmQgdW5pdCB0ZXN0cyB3aXRoIHV0aWxpdHkgY2xhc3Nlcy4KLSAqIFBsZWFzZSBkbyBub3QgYWRkIGVhY2ggdW5pdCB0ZXN0IGhlcmUuCi0gKi8KLS8qIHBhY2thZ2UgKi8gY2xhc3MgVkNhcmRUZXN0c0Jhc2UgZXh0ZW5kcyBBbmRyb2lkVGVzdENhc2UgewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFYyMSA9IFZDYXJkQ29uZmlnLlZDQVJEX1RZUEVfVjIxX0dFTkVSSUNfVVRGODsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWMzAgPSBWQ2FyZENvbmZpZy5WQ0FSRF9UWVBFX1YzMF9HRU5FUklDX1VURjg7Ci0KLSAgICAvLyBEbyBub3QgbW9kaWZ5IHRoZXNlIGR1cmluZyB0ZXN0cy4KLSAgICBwcm90ZWN0ZWQgZmluYWwgQ29udGVudFZhbHVlcyBtQ29udGVudFZhbHVlc0ZvclFQOwotICAgIHByb3RlY3RlZCBmaW5hbCBDb250ZW50VmFsdWVzIG1Db250ZW50VmFsdWVzRm9yU0ppczsKLSAgICBwcm90ZWN0ZWQgZmluYWwgQ29udGVudFZhbHVlcyBtQ29udGVudFZhbHVlc0ZvclV0Zjg7Ci0gICAgcHJvdGVjdGVkIGZpbmFsIENvbnRlbnRWYWx1ZXMgbUNvbnRlbnRWYWx1ZXNGb3JRUEFuZFNKaXM7Ci0gICAgcHJvdGVjdGVkIGZpbmFsIENvbnRlbnRWYWx1ZXMgbUNvbnRlbnRWYWx1ZXNGb3JRUEFuZFV0Zjg7Ci0gICAgcHJvdGVjdGVkIGZpbmFsIENvbnRlbnRWYWx1ZXMgbUNvbnRlbnRWYWx1ZXNGb3JCYXNlNjRWMjE7Ci0gICAgcHJvdGVjdGVkIGZpbmFsIENvbnRlbnRWYWx1ZXMgbUNvbnRlbnRWYWx1ZXNGb3JCYXNlNjRWMzA7Ci0KLSAgICBwcm90ZWN0ZWQgVkNhcmRWZXJpZmllciBtVmVyaWZpZXI7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1Ta2lwVmVyaWZpY2F0aW9uOwotCi0gICAgcHVibGljIFZDYXJkVGVzdHNCYXNlKCkgewotICAgICAgICBzdXBlcigpOwotICAgICAgICBtQ29udGVudFZhbHVlc0ZvclFQID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKLSAgICAgICAgbUNvbnRlbnRWYWx1ZXNGb3JRUC5wdXQoIkVOQ09ESU5HIiwgIlFVT1RFRC1QUklOVEFCTEUiKTsKLSAgICAgICAgbUNvbnRlbnRWYWx1ZXNGb3JTSmlzID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKLSAgICAgICAgbUNvbnRlbnRWYWx1ZXNGb3JTSmlzLnB1dCgiQ0hBUlNFVCIsICJTSElGVF9KSVMiKTsKLSAgICAgICAgbUNvbnRlbnRWYWx1ZXNGb3JVdGY4ID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKLSAgICAgICAgbUNvbnRlbnRWYWx1ZXNGb3JVdGY4LnB1dCgiQ0hBUlNFVCIsICJVVEYtOCIpOwotICAgICAgICBtQ29udGVudFZhbHVlc0ZvclFQQW5kU0ppcyA9IG5ldyBDb250ZW50VmFsdWVzKCk7Ci0gICAgICAgIG1Db250ZW50VmFsdWVzRm9yUVBBbmRTSmlzLnB1dCgiRU5DT0RJTkciLCAiUVVPVEVELVBSSU5UQUJMRSIpOwotICAgICAgICBtQ29udGVudFZhbHVlc0ZvclFQQW5kU0ppcy5wdXQoIkNIQVJTRVQiLCAiU0hJRlRfSklTIik7Ci0gICAgICAgIG1Db250ZW50VmFsdWVzRm9yUVBBbmRVdGY4ID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKLSAgICAgICAgbUNvbnRlbnRWYWx1ZXNGb3JRUEFuZFV0ZjgucHV0KCJFTkNPRElORyIsICJRVU9URUQtUFJJTlRBQkxFIik7Ci0gICAgICAgIG1Db250ZW50VmFsdWVzRm9yUVBBbmRVdGY4LnB1dCgiQ0hBUlNFVCIsICJVVEYtOCIpOwotICAgICAgICBtQ29udGVudFZhbHVlc0ZvckJhc2U2NFYyMSA9IG5ldyBDb250ZW50VmFsdWVzKCk7Ci0gICAgICAgIG1Db250ZW50VmFsdWVzRm9yQmFzZTY0VjIxLnB1dCgiRU5DT0RJTkciLCAiQkFTRTY0Iik7Ci0gICAgICAgIG1Db250ZW50VmFsdWVzRm9yQmFzZTY0VjMwID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKLSAgICAgICAgbUNvbnRlbnRWYWx1ZXNGb3JCYXNlNjRWMzAucHV0KCJFTkNPRElORyIsICJiIik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgdGVzdEFuZHJvaWRUZXN0Q2FzZVNldHVwUHJvcGVybHkoKSB7Ci0gICAgICAgIHN1cGVyLnRlc3RBbmRyb2lkVGVzdENhc2VTZXR1cFByb3Blcmx5KCk7Ci0gICAgICAgIG1Ta2lwVmVyaWZpY2F0aW9uID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb257Ci0gICAgICAgIHN1cGVyLnNldFVwKCk7Ci0gICAgICAgIG1WZXJpZmllciA9IG5ldyBWQ2FyZFZlcmlmaWVyKHRoaXMpOwotICAgICAgICBtU2tpcFZlcmlmaWNhdGlvbiA9IGZhbHNlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnRlYXJEb3duKCk7Ci0gICAgICAgIGlmICghbVNraXBWZXJpZmljYXRpb24pIHsKLSAgICAgICAgICAgIG1WZXJpZmllci52ZXJpZnkoKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZFV0aWxzVGVzdHMuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZFV0aWxzVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTkyOTlmOS4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRVdGlsc1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLnBpbS52Y2FyZDsKLQotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLlZDYXJkVXRpbHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotcHVibGljIGNsYXNzIFZDYXJkVXRpbHNUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNPbmx5UHJpbnRhYmxlQXNjaWkoKSB7Ci0gICAgICAgIGFzc2VydFRydWUoVkNhcmRVdGlscy5jb250YWluc09ubHlQcmludGFibGVBc2NpaSgoU3RyaW5nKW51bGwpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShWQ2FyZFV0aWxzLmNvbnRhaW5zT25seVByaW50YWJsZUFzY2lpKChTdHJpbmdbXSludWxsKSk7Ci0gICAgICAgIGFzc2VydFRydWUoVkNhcmRVdGlscy5jb250YWluc09ubHlQcmludGFibGVBc2NpaSgoTGlzdDxTdHJpbmc+KW51bGwpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShWQ2FyZFV0aWxzLmNvbnRhaW5zT25seVByaW50YWJsZUFzY2lpKCIiKSk7Ci0gICAgICAgIGFzc2VydFRydWUoVkNhcmRVdGlscy5jb250YWluc09ubHlQcmludGFibGVBc2NpaSgiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiKSk7Ci0gICAgICAgIGFzc2VydFRydWUoVkNhcmRVdGlscy5jb250YWluc09ubHlQcmludGFibGVBc2NpaSgiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVoiKSk7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAweDIwOyBpIDwgMHg3RjsgaSsrKSB7Ci0gICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgoY2hhcilpKTsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRUcnVlKFZDYXJkVXRpbHMuY29udGFpbnNPbmx5UHJpbnRhYmxlQXNjaWkoYnVpbGRlci50b1N0cmluZygpKSk7Ci0gICAgICAgIGFzc2VydFRydWUoVkNhcmRVdGlscy5jb250YWluc09ubHlQcmludGFibGVBc2NpaSgiXHJcbiIpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoVkNhcmRVdGlscy5jb250YWluc09ubHlQcmludGFibGVBc2NpaSgiXHUwMDE5IikpOwotICAgICAgICBhc3NlcnRGYWxzZShWQ2FyZFV0aWxzLmNvbnRhaW5zT25seVByaW50YWJsZUFzY2lpKCJcdTAwN0YiKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdENvbnRhaW5zT25seU5vbkNyTGZQcmludGFibGVBc2NpaSgpIHsKLSAgICAgICAgYXNzZXJ0VHJ1ZShWQ2FyZFV0aWxzLmNvbnRhaW5zT25seU5vbkNyTGZQcmludGFibGVBc2NpaSgoU3RyaW5nKW51bGwpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShWQ2FyZFV0aWxzLmNvbnRhaW5zT25seU5vbkNyTGZQcmludGFibGVBc2NpaSgoU3RyaW5nW10pbnVsbCkpOwotICAgICAgICBhc3NlcnRUcnVlKFZDYXJkVXRpbHMuY29udGFpbnNPbmx5Tm9uQ3JMZlByaW50YWJsZUFzY2lpKChMaXN0PFN0cmluZz4pbnVsbCkpOwotICAgICAgICBhc3NlcnRUcnVlKFZDYXJkVXRpbHMuY29udGFpbnNPbmx5Tm9uQ3JMZlByaW50YWJsZUFzY2lpKCIiKSk7Ci0gICAgICAgIGFzc2VydFRydWUoVkNhcmRVdGlscy5jb250YWluc09ubHlOb25DckxmUHJpbnRhYmxlQXNjaWkoImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6IikpOwotICAgICAgICBhc3NlcnRUcnVlKFZDYXJkVXRpbHMuY29udGFpbnNPbmx5Tm9uQ3JMZlByaW50YWJsZUFzY2lpKCJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWiIpKTsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDB4MjA7IGkgPCAweDdGOyBpKyspIHsKLSAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKChjaGFyKWkpOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFRydWUoVkNhcmRVdGlscy5jb250YWluc09ubHlOb25DckxmUHJpbnRhYmxlQXNjaWkoYnVpbGRlci50b1N0cmluZygpKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKFZDYXJkVXRpbHMuY29udGFpbnNPbmx5Tm9uQ3JMZlByaW50YWJsZUFzY2lpKCJcdTAwMTkiKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKFZDYXJkVXRpbHMuY29udGFpbnNPbmx5Tm9uQ3JMZlByaW50YWJsZUFzY2lpKCJcdTAwN0YiKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKFZDYXJkVXRpbHMuY29udGFpbnNPbmx5Tm9uQ3JMZlByaW50YWJsZUFzY2lpKCJcciIpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoVkNhcmRVdGlscy5jb250YWluc09ubHlOb25DckxmUHJpbnRhYmxlQXNjaWkoIlxuIikpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RDb250YWluc09ubHlBbHBoYURpZ2l0SHlwaGVuKCkgewotICAgICAgICBhc3NlcnRUcnVlKFZDYXJkVXRpbHMuY29udGFpbnNPbmx5QWxwaGFEaWdpdEh5cGhlbigoU3RyaW5nKW51bGwpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShWQ2FyZFV0aWxzLmNvbnRhaW5zT25seUFscGhhRGlnaXRIeXBoZW4oKFN0cmluZ1tdKW51bGwpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShWQ2FyZFV0aWxzLmNvbnRhaW5zT25seUFscGhhRGlnaXRIeXBoZW4oKExpc3Q8U3RyaW5nPiludWxsKSk7Ci0gICAgICAgIGFzc2VydFRydWUoVkNhcmRVdGlscy5jb250YWluc09ubHlBbHBoYURpZ2l0SHlwaGVuKCIiKSk7Ci0gICAgICAgIGFzc2VydFRydWUoVkNhcmRVdGlscy5jb250YWluc09ubHlOb25DckxmUHJpbnRhYmxlQXNjaWkoImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6IikpOwotICAgICAgICBhc3NlcnRUcnVlKFZDYXJkVXRpbHMuY29udGFpbnNPbmx5Tm9uQ3JMZlByaW50YWJsZUFzY2lpKCJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWiIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShWQ2FyZFV0aWxzLmNvbnRhaW5zT25seU5vbkNyTGZQcmludGFibGVBc2NpaSgiMDEyMzQ1Njc4OS0iKSk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMHgzMDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoaSA9PSAweDJEKSB7ICAvLyAtCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhc3NlcnRGYWxzZShWQ2FyZFV0aWxzLmNvbnRhaW5zT25seUFscGhhRGlnaXRIeXBoZW4oU3RyaW5nLnZhbHVlT2YoKGNoYXIpaSkpKTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGludCBpID0gMHgzQTsgaSA8IDB4NDE7IGkrKykgewotICAgICAgICAgICAgYXNzZXJ0RmFsc2UoVkNhcmRVdGlscy5jb250YWluc09ubHlBbHBoYURpZ2l0SHlwaGVuKFN0cmluZy52YWx1ZU9mKChjaGFyKWkpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChpbnQgaSA9IDB4NUI7IGkgPCAweDYxOyBpKyspIHsKLSAgICAgICAgICAgIGFzc2VydEZhbHNlKFZDYXJkVXRpbHMuY29udGFpbnNPbmx5QWxwaGFEaWdpdEh5cGhlbihTdHJpbmcudmFsdWVPZigoY2hhcilpKSkpOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoaW50IGkgPSAweDdCOyBpIDwgMHgxMDA7IGkrKykgewotICAgICAgICAgICAgYXNzZXJ0RmFsc2UoVkNhcmRVdGlscy5jb250YWluc09ubHlBbHBoYURpZ2l0SHlwaGVuKFN0cmluZy52YWx1ZU9mKChjaGFyKWkpKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRWZXJpZmllci5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkVmVyaWZpZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZjMzE1OC4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRWZXJpZmllci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAotICogdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSAqIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAotICogV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlCi0gKiBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgotICogdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC5waW0udmNhcmQ7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXI7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkVudGl0eUl0ZXJhdG9yOwotaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5WQ2FyZENvbXBvc2VyOwotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLlZDYXJkQ29uZmlnOwotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLlZDYXJkRW50cnlDb25zdHJ1Y3RvcjsKLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5WQ2FyZEludGVycHJldGVyOwotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLlZDYXJkSW50ZXJwcmV0ZXJDb2xsZWN0aW9uOwotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLlZDYXJkUGFyc2VyOwotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLlZDYXJkUGFyc2VyX1YyMTsKLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5WQ2FyZFBhcnNlcl9WMzA7Ci1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuZXhjZXB0aW9uLlZDYXJkRXhjZXB0aW9uOwotaW1wb3J0IGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2U7Ci1pbXBvcnQgYW5kcm9pZC50ZXN0Lm1vY2suTW9ja0NvbnRleHQ7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotLyogcGFja2FnZSAqLyBjbGFzcyBDdXN0b21Nb2NrQ29udGV4dCBleHRlbmRzIE1vY2tDb250ZXh0IHsKLSAgICBmaW5hbCBDb250ZW50UmVzb2x2ZXIgbVJlc29sdmVyOwotICAgIHB1YmxpYyBDdXN0b21Nb2NrQ29udGV4dChDb250ZW50UmVzb2x2ZXIgcmVzb2x2ZXIpIHsKLSAgICAgICAgbVJlc29sdmVyID0gcmVzb2x2ZXI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIENvbnRlbnRSZXNvbHZlciBnZXRDb250ZW50UmVzb2x2ZXIoKSB7Ci0gICAgICAgIHJldHVybiBtUmVzb2x2ZXI7Ci0gICAgfQotfQotCi0vKiBwYWNrYWdlICovIGNsYXNzIFZDYXJkVmVyaWZpZXIgewotICAgIHByaXZhdGUgY2xhc3MgVkNhcmRWZXJpZmllckludGVybmFsIGltcGxlbWVudHMgVkNhcmRDb21wb3Nlci5PbmVFbnRyeUhhbmRsZXIgewotICAgICAgICBwdWJsaWMgYm9vbGVhbiBvbkluaXQoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBvbkVudHJ5Q3JlYXRlZChTdHJpbmcgdmNhcmQpIHsKLSAgICAgICAgICAgIHZlcmlmeU9uZVZDYXJkKHZjYXJkKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHB1YmxpYyB2b2lkIG9uVGVybWluYXRlKCkgewotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBBbmRyb2lkVGVzdENhc2UgbVRlc3RDYXNlOwotICAgIHByaXZhdGUgZmluYWwgVkNhcmRWZXJpZmllckludGVybmFsIG1WQ2FyZFZlcmlmaWVySW50ZXJuYWw7Ci0gICAgcHJpdmF0ZSBpbnQgbVZDYXJkVHlwZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gbUlzVjMwOwotICAgIHByaXZhdGUgYm9vbGVhbiBtSXNEb0NvTW87Ci0KLSAgICAvLyBPbmx5IG9uZSBvZiB0aGVtIG11c3QgYmUgbm9uLWVtcHR5LgotICAgIHByaXZhdGUgRXhwb3J0VGVzdFJlc29sdmVyIG1FeHBvcnRUZXN0UmVzb2x2ZXI7Ci0gICAgcHJpdmF0ZSBJbnB1dFN0cmVhbSBtSW5wdXRTdHJlYW07Ci0KLSAgICAvLyBUbyBhbGxvdyBkdXBsaWNhdGlvbiwgdXNlIGxpc3QgaW5zdGVhZCBvZiBzZXQuCi0gICAgLy8gV2hlbiBudWxsLCB3ZSBkb24ndCBuZWVkIHRvIGRvIHRoZSB2ZXJpZmljYXRpb24uCi0gICAgcHJpdmF0ZSBQcm9wZXJ0eU5vZGVzVmVyaWZpZXIgbVByb3BlcnR5Tm9kZXNWZXJpZmllcjsKLSAgICBwcml2YXRlIExpbmVWZXJpZmllciBtTGluZVZlcmlmaWVyOwotICAgIHByaXZhdGUgQ29udGVudFZhbHVlc1ZlcmlmaWVyIG1Db250ZW50VmFsdWVzVmVyaWZpZXI7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1Jbml0aWFsaXplZDsKLSAgICBwcml2YXRlIGJvb2xlYW4gbVZlcmlmaWVkID0gZmFsc2U7Ci0KLSAgICBwdWJsaWMgVkNhcmRWZXJpZmllcihBbmRyb2lkVGVzdENhc2UgYW5kcm9pZFRlc3RDYXNlKSB7Ci0gICAgICAgIG1UZXN0Q2FzZSA9IGFuZHJvaWRUZXN0Q2FzZTsKLSAgICAgICAgbVZDYXJkVmVyaWZpZXJJbnRlcm5hbCA9IG5ldyBWQ2FyZFZlcmlmaWVySW50ZXJuYWwoKTsKLSAgICAgICAgbUV4cG9ydFRlc3RSZXNvbHZlciA9IG51bGw7Ci0gICAgICAgIG1JbnB1dFN0cmVhbSA9IG51bGw7Ci0gICAgICAgIG1Jbml0aWFsaXplZCA9IGZhbHNlOwotICAgICAgICBtVmVyaWZpZWQgPSBmYWxzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBpbml0Rm9yRXhwb3J0VGVzdChpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIGlmIChtSW5pdGlhbGl6ZWQpIHsKLSAgICAgICAgICAgIG1UZXN0Q2FzZS5mYWlsKCJBbHJlYWR5IGluaXRpYWxpemVkIik7Ci0gICAgICAgIH0KLSAgICAgICAgbUV4cG9ydFRlc3RSZXNvbHZlciA9IG5ldyBFeHBvcnRUZXN0UmVzb2x2ZXIobVRlc3RDYXNlKTsKLSAgICAgICAgbVZDYXJkVHlwZSA9IHZjYXJkVHlwZTsKLSAgICAgICAgbUlzVjMwID0gVkNhcmRDb25maWcuaXNWMzAodmNhcmRUeXBlKTsKLSAgICAgICAgbUlzRG9Db01vID0gVkNhcmRDb25maWcuaXNEb0NvTW8odmNhcmRUeXBlKTsKLSAgICAgICAgbUluaXRpYWxpemVkID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBpbml0Rm9ySW1wb3J0VGVzdChpbnQgdmNhcmRUeXBlLCBpbnQgcmVzSWQpIHsKLSAgICAgICAgaWYgKG1Jbml0aWFsaXplZCkgewotICAgICAgICAgICAgbVRlc3RDYXNlLmZhaWwoIkFscmVhZHkgaW5pdGlhbGl6ZWQiKTsKLSAgICAgICAgfQotICAgICAgICBtVkNhcmRUeXBlID0gdmNhcmRUeXBlOwotICAgICAgICBtSXNWMzAgPSBWQ2FyZENvbmZpZy5pc1YzMCh2Y2FyZFR5cGUpOwotICAgICAgICBtSXNEb0NvTW8gPSBWQ2FyZENvbmZpZy5pc0RvQ29Nbyh2Y2FyZFR5cGUpOwotICAgICAgICBzZXRJbnB1dFJlc291cmNlSWQocmVzSWQpOwotICAgICAgICBtSW5pdGlhbGl6ZWQgPSB0cnVlOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzZXRJbnB1dFJlc291cmNlSWQoaW50IHJlc0lkKSB7Ci0gICAgICAgIElucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gbVRlc3RDYXNlLmdldENvbnRleHQoKS5nZXRSZXNvdXJjZXMoKS5vcGVuUmF3UmVzb3VyY2UocmVzSWQpOwotICAgICAgICBpZiAoaW5wdXRTdHJlYW0gPT0gbnVsbCkgewotICAgICAgICAgICAgbVRlc3RDYXNlLmZhaWwoIldyb25nIHJlc0lkOiAiICsgcmVzSWQpOwotICAgICAgICB9Ci0gICAgICAgIHNldElucHV0U3RyZWFtKGlucHV0U3RyZWFtKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2V0SW5wdXRTdHJlYW0oSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pIHsKLSAgICAgICAgaWYgKG1FeHBvcnRUZXN0UmVzb2x2ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgbVRlc3RDYXNlLmZhaWwoImFkZElucHV0RW50cnkoKSBpcyBjYWxsZWQuIik7Ci0gICAgICAgIH0gZWxzZSBpZiAobUlucHV0U3RyZWFtICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1UZXN0Q2FzZS5mYWlsKCJJbnB1dFN0cmVhbSBpcyBhbHJlYWR5IHNldCIpOwotICAgICAgICB9Ci0gICAgICAgIG1JbnB1dFN0cmVhbSA9IGlucHV0U3RyZWFtOwotICAgIH0KLQotICAgIHB1YmxpYyBDb250YWN0RW50cnkgYWRkSW5wdXRFbnRyeSgpIHsKLSAgICAgICAgaWYgKCFtSW5pdGlhbGl6ZWQpIHsKLSAgICAgICAgICAgIG1UZXN0Q2FzZS5mYWlsKCJOb3QgaW5pdGlhbGl6ZWQiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobUlucHV0U3RyZWFtICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1UZXN0Q2FzZS5mYWlsKCJzZXRJbnB1dFN0cmVhbSBpcyBjYWxsZWQiKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbUV4cG9ydFRlc3RSZXNvbHZlci5hZGRJbnB1dENvbnRhY3RFbnRyeSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtIGFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0oKSB7Ci0gICAgICAgIGlmICghbUluaXRpYWxpemVkKSB7Ci0gICAgICAgICAgICBtVGVzdENhc2UuZmFpbCgiTm90IGluaXRpYWxpemVkIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1Qcm9wZXJ0eU5vZGVzVmVyaWZpZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgbVByb3BlcnR5Tm9kZXNWZXJpZmllciA9IG5ldyBQcm9wZXJ0eU5vZGVzVmVyaWZpZXIobVRlc3RDYXNlKTsKLSAgICAgICAgfQotICAgICAgICBQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtIGVsZW0gPQotICAgICAgICAgICAgICAgIG1Qcm9wZXJ0eU5vZGVzVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSgpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiVkVSU0lPTiIsIChtSXNWMzAgPyAiMy4wIiA6ICIyLjEiKSk7Ci0KLSAgICAgICAgcmV0dXJuIGVsZW07Ci0gICAgfQotCi0gICAgcHVibGljIFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0gYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbVdpdGhFbXB0eU5hbWUoKSB7Ci0gICAgICAgIGlmICghbUluaXRpYWxpemVkKSB7Ci0gICAgICAgICAgICBtVGVzdENhc2UuZmFpbCgiTm90IGluaXRpYWxpemVkIik7Ci0gICAgICAgIH0KLSAgICAgICAgUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSBlbGVtID0gYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSgpOwotICAgICAgICBpZiAobUlzVjMwKSB7Ci0gICAgICAgICAgICBlbGVtLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiTiIsICIiKS5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIkZOIiwgIiIpOwotICAgICAgICB9IGVsc2UgaWYgKG1Jc0RvQ29NbykgewotICAgICAgICAgICAgZWxlbS5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIk4iLCAiIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGVsZW07Ci0gICAgfQotCi0gICAgcHVibGljIExpbmVWZXJpZmllckVsZW0gYWRkTGluZVZlcmlmaWVyRWxlbSgpIHsKLSAgICAgICAgaWYgKCFtSW5pdGlhbGl6ZWQpIHsKLSAgICAgICAgICAgIG1UZXN0Q2FzZS5mYWlsKCJOb3QgaW5pdGlhbGl6ZWQiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobUxpbmVWZXJpZmllciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtTGluZVZlcmlmaWVyID0gbmV3IExpbmVWZXJpZmllcihtVGVzdENhc2UsIG1WQ2FyZFR5cGUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtTGluZVZlcmlmaWVyLmFkZExpbmVWZXJpZmllckVsZW0oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbSBhZGRDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtKCkgewotICAgICAgICBpZiAoIW1Jbml0aWFsaXplZCkgewotICAgICAgICAgICAgbVRlc3RDYXNlLmZhaWwoIk5vdCBpbml0aWFsaXplZCIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtQ29udGVudFZhbHVlc1ZlcmlmaWVyID09IG51bGwpIHsKLSAgICAgICAgICAgIG1Db250ZW50VmFsdWVzVmVyaWZpZXIgPSBuZXcgQ29udGVudFZhbHVlc1ZlcmlmaWVyKCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbUNvbnRlbnRWYWx1ZXNWZXJpZmllci5hZGRFbGVtKG1UZXN0Q2FzZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHZlcmlmeU9uZVZDYXJkKGZpbmFsIFN0cmluZyB2Y2FyZCkgewotICAgICAgICAvLyBMb2cuZCgiQEBAIiwgdmNhcmQpOwotICAgICAgICBmaW5hbCBWQ2FyZEludGVycHJldGVyIGJ1aWxkZXI7Ci0gICAgICAgIGlmIChtQ29udGVudFZhbHVlc1ZlcmlmaWVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZpbmFsIFZOb2RlQnVpbGRlciB2bm9kZUJ1aWxkZXIgPSBtUHJvcGVydHlOb2Rlc1ZlcmlmaWVyOwotICAgICAgICAgICAgZmluYWwgVkNhcmRFbnRyeUNvbnN0cnVjdG9yIHZjYXJkRGF0YUJ1aWxkZXIgPQotICAgICAgICAgICAgICAgICAgICBuZXcgVkNhcmRFbnRyeUNvbnN0cnVjdG9yKG1WQ2FyZFR5cGUpOwotICAgICAgICAgICAgdmNhcmREYXRhQnVpbGRlci5hZGRFbnRyeUhhbmRsZXIobUNvbnRlbnRWYWx1ZXNWZXJpZmllcik7Ci0gICAgICAgICAgICBpZiAobVByb3BlcnR5Tm9kZXNWZXJpZmllciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYnVpbGRlciA9IG5ldyBWQ2FyZEludGVycHJldGVyQ29sbGVjdGlvbihBcnJheXMuYXNMaXN0KAotICAgICAgICAgICAgICAgICAgICAgICAgbVByb3BlcnR5Tm9kZXNWZXJpZmllciwgdmNhcmREYXRhQnVpbGRlcikpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBidWlsZGVyID0gdm5vZGVCdWlsZGVyOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKG1Qcm9wZXJ0eU5vZGVzVmVyaWZpZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGJ1aWxkZXIgPSBtUHJvcGVydHlOb2Rlc1ZlcmlmaWVyOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBWQ2FyZFBhcnNlciBwYXJzZXIgPQotICAgICAgICAgICAgICAgIChtSXNWMzAgPyBuZXcgVkNhcmRQYXJzZXJfVjMwKHRydWUpIDogbmV3IFZDYXJkUGFyc2VyX1YyMSgpKTsKLSAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgU3RyaW5nIGNoYXJzZXQgPQotICAgICAgICAgICAgICAgIChWQ2FyZENvbmZpZy51c2VzU2hpZnRKaXMobVZDYXJkVHlwZSkgPyAiU0hJRlRfSklTIiA6ICJVVEYtOCIpOwotICAgICAgICAgICAgaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0odmNhcmQuZ2V0Qnl0ZXMoY2hhcnNldCkpOwotICAgICAgICAgICAgbVRlc3RDYXNlLmFzc2VydEVxdWFscyh0cnVlLCBwYXJzZXIucGFyc2UoaXMsIG51bGwsIGJ1aWxkZXIpKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgbVRlc3RDYXNlLmZhaWwoIlVuZXhwZWN0ZWQgSU9FeGNlcHRpb246ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKFZDYXJkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIG1UZXN0Q2FzZS5mYWlsKCJVbmV4cGVjdGVkIFZDYXJkRXhjZXB0aW9uOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKGlzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBpcy5jbG9zZSgpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB2ZXJpZnkoKSB7Ci0gICAgICAgIGlmICghbUluaXRpYWxpemVkKSB7Ci0gICAgICAgICAgICBtVGVzdENhc2UuZmFpbCgiTm90IGluaXRpYWxpemVkLiIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtVmVyaWZpZWQpIHsKLSAgICAgICAgICAgIG1UZXN0Q2FzZS5mYWlsKCJ2ZXJpZnkoKSB3YXMgY2FsbGVkIHR3aWNlLiIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtSW5wdXRTdHJlYW0gIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICB2ZXJpZnlGb3JJbXBvcnRUZXN0KCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgbVRlc3RDYXNlLmZhaWwoIklPRXhjZXB0aW9uIHdhcyB0aHJvd246ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChWQ2FyZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgbVRlc3RDYXNlLmZhaWwoIlZDYXJkRXhjZXB0aW9uIHdhcyB0aHJvd246ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAobUV4cG9ydFRlc3RSZXNvbHZlciAhPSBudWxsKXsKLSAgICAgICAgICAgIHZlcmlmeUZvckV4cG9ydFRlc3QoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1UZXN0Q2FzZS5mYWlsKCJObyBpbnB1dCBpcyBkZXRlcm1pbmVkIik7Ci0gICAgICAgIH0KLSAgICAgICAgbVZlcmlmaWVkID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdmVyaWZ5Rm9ySW1wb3J0VGVzdCgpIHRocm93cyBJT0V4Y2VwdGlvbiwgVkNhcmRFeGNlcHRpb24gewotICAgICAgICBpZiAobUxpbmVWZXJpZmllciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtVGVzdENhc2UuZmFpbCgiTm90IHN1cHBvcnRlZCBub3cuIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1Db250ZW50VmFsdWVzVmVyaWZpZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgbUNvbnRlbnRWYWx1ZXNWZXJpZmllci52ZXJpZnkobUlucHV0U3RyZWFtLCBtVkNhcmRUeXBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgRW50aXR5SXRlcmF0b3IgbW9ja0dldEVudGl0eUl0ZXJhdG9yTWV0aG9kKAotICAgICAgICAgICAgZmluYWwgQ29udGVudFJlc29sdmVyIHJlc29sdmVyLAotICAgICAgICAgICAgZmluYWwgVXJpIHVyaSwgZmluYWwgU3RyaW5nIHNlbGVjdGlvbiwKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZ1tdIHNlbGVjdGlvbkFyZ3MsIGZpbmFsIFN0cmluZyBzb3J0T3JkZXIpIHsKLSAgICAgICAgZmluYWwgQ29udGVudFByb3ZpZGVyIHByb3ZpZGVyID0KLSAgICAgICAgICAgIHJlc29sdmVyLmFjcXVpcmVDb250ZW50UHJvdmlkZXJDbGllbnQodXJpKS5nZXRMb2NhbENvbnRlbnRQcm92aWRlcigpOwotICAgICAgICByZXR1cm4gKChFeHBvcnRUZXN0UHJvdmlkZXIpcHJvdmlkZXIpLnF1ZXJ5RW50aXRpZXMoCi0gICAgICAgICAgICAgICAgdXJpLCBzZWxlY3Rpb24sIHNlbGVjdGlvbkFyZ3MsIHNvcnRPcmRlcik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBNZXRob2QgZ2V0TW9ja0dldEVudGl0eUl0ZXJhdG9yTWV0aG9kKCkKLSAgICAgICAgICAgIHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbiwgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Q2xhc3MoKS5nZXRNZXRob2QoIm1vY2tHZXRFbnRpdHlJdGVyYXRvck1ldGhvZCIsCi0gICAgICAgICAgICAgICAgQ29udGVudFJlc29sdmVyLmNsYXNzLCBVcmkuY2xhc3MsIFN0cmluZy5jbGFzcywgU3RyaW5nW10uY2xhc3MsIFN0cmluZy5jbGFzcyk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHZlcmlmeUZvckV4cG9ydFRlc3QoKSB7Ci0gICAgICAgZmluYWwgVkNhcmRDb21wb3NlciBjb21wb3NlciA9Ci0gICAgICAgICAgICBuZXcgVkNhcmRDb21wb3NlcihuZXcgQ3VzdG9tTW9ja0NvbnRleHQobUV4cG9ydFRlc3RSZXNvbHZlciksIG1WQ2FyZFR5cGUpOwotICAgICAgICBjb21wb3Nlci5hZGRIYW5kbGVyKG1MaW5lVmVyaWZpZXIpOwotICAgICAgICBjb21wb3Nlci5hZGRIYW5kbGVyKG1WQ2FyZFZlcmlmaWVySW50ZXJuYWwpOwotICAgICAgICBpZiAoIWNvbXBvc2VyLmluaXQoVkNhcmRDb21wb3Nlci5DT05UQUNUU19URVNUX0NPTlRFTlRfVVJJLCBudWxsLCBudWxsLCBudWxsKSkgewotICAgICAgICAgICAgbVRlc3RDYXNlLmZhaWwoImluaXQoKSBmYWlsZWQuIFJlYXNvbjogIiArIGNvbXBvc2VyLmdldEVycm9yUmVhc29uKCkpOwotICAgICAgICB9Ci0gICAgICAgIG1UZXN0Q2FzZS5hc3NlcnRGYWxzZShjb21wb3Nlci5pc0FmdGVyTGFzdCgpKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHdoaWxlICghY29tcG9zZXIuaXNBZnRlckxhc3QoKSkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIE1ldGhvZCBtb2NrR2V0RW50aXR5SXRlcmF0b3JNZXRob2QgPSBnZXRNb2NrR2V0RW50aXR5SXRlcmF0b3JNZXRob2QoKTsKLSAgICAgICAgICAgICAgICAgICAgbVRlc3RDYXNlLmFzc2VydFRydWUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9zZXIuY3JlYXRlT25lRW50cnkoZ2V0TW9ja0dldEVudGl0eUl0ZXJhdG9yTWV0aG9kKCkpKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgICAgICAgICBtVGVzdENhc2UuZmFpbCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGNvbXBvc2VyLnRlcm1pbmF0ZSgpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL1ZOb2RlLmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvVk5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzlmMTBkYy4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvVk5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLnBpbS52Y2FyZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLS8qKgotICogUHJldmlvdXNseSB1c2VkIGluIG1haW4gdkNhcmQgaGFuZGxpbmcgY29kZSBidXQgbm93IGV4aXN0cyBvbmx5IGZvciB0ZXN0aW5nLgotICovCi1wdWJsaWMgY2xhc3MgVk5vZGUgewotICAgIHB1YmxpYyBTdHJpbmcgVk5hbWU7Ci0KLSAgICBwdWJsaWMgQXJyYXlMaXN0PFByb3BlcnR5Tm9kZT4gcHJvcExpc3QgPSBuZXcgQXJyYXlMaXN0PFByb3BlcnR5Tm9kZT4oKTsKLQotICAgIC8qKiAwOnBhcnNlIG92ZXIuIDE6cGFyc2luZy4gKi8KLSAgICBwdWJsaWMgaW50IHBhcnNlU3RhdHVzID0gMTsKLX0KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC9WTm9kZUJ1aWxkZXIuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC9WTm9kZUJ1aWxkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGU2YzMyNS4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvVk5vZGVCdWlsZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGFuZHJvaWQucGltLnZjYXJkOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXM7Ci1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuVkNhcmRJbnRlcnByZXRlcjsKLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5WQ2FyZENvbmZpZzsKLWltcG9ydCBhbmRyb2lkLnV0aWwuQ2hhcnNldFV0aWxzOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29kZWMuRGVjb2RlckV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29kZWMuYmluYXJ5LkJhc2U2NDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29kZWMubmV0LlF1b3RlZFByaW50YWJsZUNvZGVjOwotCi1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7Ci1pbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogU3RvcmUgdGhlIHBhcnNlIHJlc3VsdCB0byBjdXN0b20gZGF0YXN0cnVjdDogVk5vZGUsIFByb3BlcnR5Tm9kZQotICogTWF5YmUgc2V2ZXJhbCB2Y2FyZCBpbnN0YW5jZSwgc28gdXNlIHZOb2RlTGlzdCB0byBzdG9yZS4KLSAqIFZOb2RlOiBzdGFuZHkgYnkgYSB2Y2FyZCBpbnN0YW5jZS4KLSAqIFByb3BlcnR5Tm9kZTogc3RhbmR5IGJ5IGEgcHJvcGVydHkgbGluZSBvZiBhIGNhcmQuCi0gKgotICogUHJldmlvdXNseSB1c2VkIGluIG1haW4gdkNhcmQgaGFuZGxpbmcgY29kZSBidXQgbm93IGV4aXN0cyBvbmx5IGZvciB0ZXN0aW5nLgotICovCi1wdWJsaWMgY2xhc3MgVk5vZGVCdWlsZGVyIGltcGxlbWVudHMgVkNhcmRJbnRlcnByZXRlciB7Ci0gICAgc3RhdGljIHByaXZhdGUgU3RyaW5nIExPR19UQUcgPSAiVk5vZGVCdWlsZGVyIjsgCi0gICAgCi0gICAgLyoqCi0gICAgICogSWYgdGhlcmUncyBubyBvdGhlciBpbmZvcm1hdGlvbiBhdmFpbGFibGUsIHRoaXMgY2xhc3MgdXNlcyB0aGlzIGNoYXJzZXQgZm9yIGVuY29kaW5nCi0gICAgICogYnl0ZSBhcnJheXMuCi0gICAgICovCi0gICAgc3RhdGljIHB1YmxpYyBTdHJpbmcgVEFSR0VUX0NIQVJTRVQgPSAiVVRGLTgiOyAKLSAgICAKLSAgICAvKiogdHlwZT1WTm9kZSAqLwotICAgIHB1YmxpYyBMaXN0PFZOb2RlPiB2Tm9kZUxpc3QgPSBuZXcgQXJyYXlMaXN0PFZOb2RlPigpOwotICAgIHByaXZhdGUgaW50IG1Ob2RlTGlzdFBvcyA9IDA7Ci0gICAgcHJpdmF0ZSBWTm9kZSBtQ3VycmVudFZOb2RlOwotICAgIHByaXZhdGUgUHJvcGVydHlOb2RlIG1DdXJyZW50UHJvcE5vZGU7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbUN1cnJlbnRQYXJhbVR5cGU7Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGhlIGNoYXJzZXQgdXNpbmcgd2hpY2ggVlBhcnNlciBwYXJzZXMgdGhlIHRleHQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgbVNvdXJjZUNoYXJzZXQ7Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGhlIGNoYXJzZXQgd2l0aCB3aGljaCBieXRlIGFycmF5IGlzIGVuY29kZWQgdG8gU3RyaW5nLgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIG1UYXJnZXRDaGFyc2V0OwotICAgIAotICAgIHByaXZhdGUgYm9vbGVhbiBtU3RyaWN0TGluZUJyZWFrUGFyc2luZzsKLSAgICAKLSAgICBwdWJsaWMgVk5vZGVCdWlsZGVyKCkgewotICAgICAgICB0aGlzKFZDYXJkQ29uZmlnLkRFRkFVTFRfQ0hBUlNFVCwgVEFSR0VUX0NIQVJTRVQsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVk5vZGVCdWlsZGVyKFN0cmluZyBjaGFyc2V0LCBib29sZWFuIHN0cmljdExpbmVCcmVha1BhcnNpbmcpIHsKLSAgICAgICAgdGhpcyhudWxsLCBjaGFyc2V0LCBzdHJpY3RMaW5lQnJlYWtQYXJzaW5nKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQGhpZGUgc291cmNlQ2hhcnNldCBpcyB0ZW1wb3JhbC4gCi0gICAgICovCi0gICAgcHVibGljIFZOb2RlQnVpbGRlcihTdHJpbmcgc291cmNlQ2hhcnNldCwgU3RyaW5nIHRhcmdldENoYXJzZXQsCi0gICAgICAgICAgICBib29sZWFuIHN0cmljdExpbmVCcmVha1BhcnNpbmcpIHsKLSAgICAgICAgaWYgKHNvdXJjZUNoYXJzZXQgIT0gbnVsbCkgewotICAgICAgICAgICAgbVNvdXJjZUNoYXJzZXQgPSBzb3VyY2VDaGFyc2V0OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbVNvdXJjZUNoYXJzZXQgPSBWQ2FyZENvbmZpZy5ERUZBVUxUX0NIQVJTRVQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHRhcmdldENoYXJzZXQgIT0gbnVsbCkgewotICAgICAgICAgICAgbVRhcmdldENoYXJzZXQgPSB0YXJnZXRDaGFyc2V0OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbVRhcmdldENoYXJzZXQgPSBUQVJHRVRfQ0hBUlNFVDsKLSAgICAgICAgfQotICAgICAgICBtU3RyaWN0TGluZUJyZWFrUGFyc2luZyA9IHN0cmljdExpbmVCcmVha1BhcnNpbmc7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc3RhcnQoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZW5kKCkgewotICAgIH0KLQotICAgIC8vIE5vdGU6IEkgZ3Vlc3MgdGhhdCB0aGlzIGNvZGUgYXNzdW1lcyB0aGUgUmVjb3JkIG1heSBuZXN0IGxpa2UgdGhpczoKLSAgICAvLyBTVEFSVDpWUE9TCi0gICAgLy8gLi4uCi0gICAgLy8gU1RBUlQ6VlBPUzIKLSAgICAvLyAuLi4KLSAgICAvLyBFTkQ6VlBPUzIKLSAgICAvLyAuLi4KLSAgICAvLyBFTkQ6VlBPUwotICAgIC8vCi0gICAgLy8gSG93ZXZlciB0aGUgZm9sbG93aW5nIGNvZGUgaGFzIGEgYnVnLgotICAgIC8vIFdoZW4gZXJyb3Igb2NjdXJzIGFmdGVyIGNhbGxpbmcgc3RhcnRSZWNvcmQoKSwgdGhlIGVudHJ5IHdoaWNoIGlzIHByb2JhYmx5Ci0gICAgLy8gdGhlIGNhdXNlIG9mIHRoZSBlcnJvciByZW1haW5zIHRvIGJlIGluIHZOb2RlTGlzdCwgd2hpbGUgZW5kUmVjb3JkKCkgaXMgbm90IGNhbGxlZC4KLSAgICAvLwotICAgIC8vIEkgbGVhdmUgdGhpcyBjb2RlIGFzIGlzIHNpbmNlIEknbSBub3QgZmFtaWxpYXIgd2l0aCB2Y2FsZW5kYXIgc3BlY2lmaWNhdGlvbi4KLSAgICAvLyBCdXQgSSBiZWxpZXZlIHdlIHNob3VsZCByZWZhY3RvciB0aGlzIGNvZGUgaW4gdGhlIGZ1dHVyZS4KLSAgICAvLyBVbnRpbCB0aGlzLCB0aGUgbGFzdCBlbnRyeSBoYXMgdG8gYmUgcmVtb3ZlZCB3aGVuIHNvbWUgZXJyb3Igb2NjdXJzLgotICAgIHB1YmxpYyB2b2lkIHN0YXJ0RW50cnkoKSB7Ci0gICAgICAgIFZOb2RlIHZub2RlID0gbmV3IFZOb2RlKCk7Ci0gICAgICAgIHZub2RlLnBhcnNlU3RhdHVzID0gMTsKLSAgICAgICAgdm5vZGUuVk5hbWUgPSAiVkNBUkQiOwotICAgICAgICAvLyBJIGZlZWwgdGhpcyBzaG91bGQgYmUgZG9uZSBpbiBlbmRSZWNvcmQoKSwgYnV0IGl0IGNhbm5vdCBiZSBkb25lIGJlY2F1c2Ugb2YKLSAgICAgICAgLy8gdGhlIHJlYXNvbiBhYm92ZS4KLSAgICAgICAgdk5vZGVMaXN0LmFkZCh2bm9kZSk7Ci0gICAgICAgIG1Ob2RlTGlzdFBvcyA9IHZOb2RlTGlzdC5zaXplKCkgLSAxOwotICAgICAgICBtQ3VycmVudFZOb2RlID0gdk5vZGVMaXN0LmdldChtTm9kZUxpc3RQb3MpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGVuZEVudHJ5KCkgewotICAgICAgICBWTm9kZSBlbmROb2RlID0gdk5vZGVMaXN0LmdldChtTm9kZUxpc3RQb3MpOwotICAgICAgICBlbmROb2RlLnBhcnNlU3RhdHVzID0gMDsKLSAgICAgICAgd2hpbGUobU5vZGVMaXN0UG9zID4gMCl7Ci0gICAgICAgICAgICBtTm9kZUxpc3RQb3MtLTsKLSAgICAgICAgICAgIGlmKCh2Tm9kZUxpc3QuZ2V0KG1Ob2RlTGlzdFBvcykpLnBhcnNlU3RhdHVzID09IDEpCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgbUN1cnJlbnRWTm9kZSA9IHZOb2RlTGlzdC5nZXQobU5vZGVMaXN0UG9zKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzdGFydFByb3BlcnR5KCkgewotICAgICAgICBtQ3VycmVudFByb3BOb2RlID0gbmV3IFByb3BlcnR5Tm9kZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGVuZFByb3BlcnR5KCkgewotICAgICAgICBtQ3VycmVudFZOb2RlLnByb3BMaXN0LmFkZChtQ3VycmVudFByb3BOb2RlKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgcHJvcGVydHlOYW1lKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIG1DdXJyZW50UHJvcE5vZGUucHJvcE5hbWUgPSBuYW1lOwotICAgIH0KLQotICAgIC8vIFVzZWQgb25seSBpbiBWQ2FyZC4KLSAgICBwdWJsaWMgdm9pZCBwcm9wZXJ0eUdyb3VwKFN0cmluZyBncm91cCkgewotICAgICAgICBtQ3VycmVudFByb3BOb2RlLnByb3BHcm91cFNldC5hZGQoZ3JvdXApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBwcm9wZXJ0eVBhcmFtVHlwZShTdHJpbmcgdHlwZSkgewotICAgICAgICBtQ3VycmVudFBhcmFtVHlwZSA9IHR5cGU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHJvcGVydHlQYXJhbVZhbHVlKFN0cmluZyB2YWx1ZSkgewotICAgICAgICBpZiAobUN1cnJlbnRQYXJhbVR5cGUgPT0gbnVsbCB8fAotICAgICAgICAgICAgICAgIG1DdXJyZW50UGFyYW1UeXBlLmVxdWFsc0lnbm9yZUNhc2UoIlRZUEUiKSkgewotICAgICAgICAgICAgbUN1cnJlbnRQcm9wTm9kZS5wYXJhbU1hcF9UWVBFLmFkZCh2YWx1ZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtQ3VycmVudFByb3BOb2RlLnBhcmFtTWFwLnB1dChtQ3VycmVudFBhcmFtVHlwZSwgdmFsdWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgbUN1cnJlbnRQYXJhbVR5cGUgPSBudWxsOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGVuY29kZVN0cmluZyhTdHJpbmcgb3JpZ2luYWxTdHJpbmcsIFN0cmluZyB0YXJnZXRDaGFyc2V0KSB7Ci0gICAgICAgIGlmIChtU291cmNlQ2hhcnNldC5lcXVhbHNJZ25vcmVDYXNlKHRhcmdldENoYXJzZXQpKSB7Ci0gICAgICAgICAgICByZXR1cm4gb3JpZ2luYWxTdHJpbmc7Ci0gICAgICAgIH0KLSAgICAgICAgQ2hhcnNldCBjaGFyc2V0ID0gQ2hhcnNldC5mb3JOYW1lKG1Tb3VyY2VDaGFyc2V0KTsKLSAgICAgICAgQnl0ZUJ1ZmZlciBieXRlQnVmZmVyID0gY2hhcnNldC5lbmNvZGUob3JpZ2luYWxTdHJpbmcpOwotICAgICAgICAvLyBieXRlQnVmZmVyLmFycmF5KCkgIm1heSIgcmV0dXJuIGJ5dGUgYXJyYXkgd2hpY2ggaXMgbGFyZ2VyIHRoYW4KLSAgICAgICAgLy8gYnl0ZUJ1ZmZlci5yZW1haW5pbmcoKS4gSGVyZSwgd2Uga2VlcCBvbiB0aGUgc2FmZSBzaWRlLgotICAgICAgICBieXRlW10gYnl0ZXMgPSBuZXcgYnl0ZVtieXRlQnVmZmVyLnJlbWFpbmluZygpXTsKLSAgICAgICAgYnl0ZUJ1ZmZlci5nZXQoYnl0ZXMpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoYnl0ZXMsIHRhcmdldENoYXJzZXQpOwotICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJGYWlsZWQgdG8gZW5jb2RlOiBjaGFyc2V0PSIgKyB0YXJnZXRDaGFyc2V0KTsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgU3RyaW5nIGhhbmRsZU9uZVZhbHVlKFN0cmluZyB2YWx1ZSwgU3RyaW5nIHRhcmdldENoYXJzZXQsIFN0cmluZyBlbmNvZGluZykgewotICAgICAgICBpZiAoZW5jb2RpbmcgIT0gbnVsbCkgewotICAgICAgICAgICAgZW5jb2RpbmcgPSBlbmNvZGluZy50b1VwcGVyQ2FzZSgpOwotICAgICAgICAgICAgaWYgKGVuY29kaW5nLmVxdWFscygiQkFTRTY0IikgfHwgZW5jb2RpbmcuZXF1YWxzKCJCIikpIHsKLSAgICAgICAgICAgICAgICAvLyBBc3N1bWUgQkFTRTY0IGlzIHVzZWQgb25seSB3aGVuIHRoZSBudW1iZXIgb2YgdmFsdWVzIGlzIDEuCi0gICAgICAgICAgICAgICAgbUN1cnJlbnRQcm9wTm9kZS5wcm9wVmFsdWVfYnl0ZXMgPQotICAgICAgICAgICAgICAgICAgICBCYXNlNjQuZGVjb2RlQmFzZTY0KHZhbHVlLmdldEJ5dGVzKCkpOwotICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZW5jb2RpbmcuZXF1YWxzKCJRVU9URUQtUFJJTlRBQkxFIikpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcXVvdGVkUHJpbnRhYmxlID0gdmFsdWUKLSAgICAgICAgICAgICAgICAucmVwbGFjZUFsbCgiPSAiLCAiICIpLnJlcGxhY2VBbGwoIj1cdCIsICJcdCIpOwotICAgICAgICAgICAgICAgIFN0cmluZ1tdIGxpbmVzOwotICAgICAgICAgICAgICAgIGlmIChtU3RyaWN0TGluZUJyZWFrUGFyc2luZykgewotICAgICAgICAgICAgICAgICAgICBsaW5lcyA9IHF1b3RlZFByaW50YWJsZS5zcGxpdCgiXHJcbiIpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgICAgICAgICAgICAgIGludCBsZW5ndGggPSBxdW90ZWRQcmludGFibGUubGVuZ3RoKCk7Ci0gICAgICAgICAgICAgICAgICAgIEFycmF5TGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBjaCA9IHF1b3RlZFByaW50YWJsZS5jaGFyQXQoaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT0gJ1xuJykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QuYWRkKGJ1aWxkZXIudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoID09ICdccicpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0LmFkZChidWlsZGVyLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpIDwgbGVuZ3RoIC0gMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIG5leHRDaCA9IHF1b3RlZFByaW50YWJsZS5jaGFyQXQoaSArIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV4dENoID09ICdcbicpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoY2gpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBmaW5hbExpbmUgPSBidWlsZGVyLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmaW5hbExpbmUubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsaXN0LmFkZChmaW5hbExpbmUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGxpbmVzID0gbGlzdC50b0FycmF5KG5ldyBTdHJpbmdbMF0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIGxpbmUgOiBsaW5lcykgewotICAgICAgICAgICAgICAgICAgICBpZiAobGluZS5lbmRzV2l0aCgiPSIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsaW5lID0gbGluZS5zdWJzdHJpbmcoMCwgbGluZS5sZW5ndGgoKSAtIDEpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGxpbmUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBieXRlW10gYnl0ZXM7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgYnl0ZXMgPSBidWlsZGVyLnRvU3RyaW5nKCkuZ2V0Qnl0ZXMobVNvdXJjZUNoYXJzZXQpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZTEpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIkZhaWxlZCB0byBlbmNvZGU6IGNoYXJzZXQ9IiArIG1Tb3VyY2VDaGFyc2V0KTsKLSAgICAgICAgICAgICAgICAgICAgYnl0ZXMgPSBidWlsZGVyLnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgYnl0ZXMgPSBRdW90ZWRQcmludGFibGVDb2RlYy5kZWNvZGVRdW90ZWRQcmludGFibGUoYnl0ZXMpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKERlY29kZXJFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiRmFpbGVkIHRvIGRlY29kZSBxdW90ZWQtcHJpbnRhYmxlOiAiICsgZSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAiIjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhieXRlcywgdGFyZ2V0Q2hhcnNldCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJGYWlsZWQgdG8gZW5jb2RlOiBjaGFyc2V0PSIgKyB0YXJnZXRDaGFyc2V0KTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoYnl0ZXMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIFVua25vd24gZW5jb2RpbmcuIEZhbGwgYmFjayB0byBkZWZhdWx0LgotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBlbmNvZGVTdHJpbmcodmFsdWUsIHRhcmdldENoYXJzZXQpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBwcm9wZXJ0eVZhbHVlcyhMaXN0PFN0cmluZz4gdmFsdWVzKSB7Ci0gICAgICAgIGlmICh2YWx1ZXMgPT0gbnVsbCB8fCB2YWx1ZXMuc2l6ZSgpID09IDApIHsKLSAgICAgICAgICAgIG1DdXJyZW50UHJvcE5vZGUucHJvcFZhbHVlX2J5dGVzID0gbnVsbDsKLSAgICAgICAgICAgIG1DdXJyZW50UHJvcE5vZGUucHJvcFZhbHVlX3ZlY3Rvci5jbGVhcigpOwotICAgICAgICAgICAgbUN1cnJlbnRQcm9wTm9kZS5wcm9wVmFsdWVfdmVjdG9yLmFkZCgiIik7Ci0gICAgICAgICAgICBtQ3VycmVudFByb3BOb2RlLnByb3BWYWx1ZSA9ICIiOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBDb250ZW50VmFsdWVzIHBhcmFtTWFwID0gbUN1cnJlbnRQcm9wTm9kZS5wYXJhbU1hcDsKLSAgICAgICAgCi0gICAgICAgIFN0cmluZyB0YXJnZXRDaGFyc2V0ID0gQ2hhcnNldFV0aWxzLm5hbWVGb3JEZWZhdWx0VmVuZG9yKHBhcmFtTWFwLmdldEFzU3RyaW5nKCJDSEFSU0VUIikpOyAKLSAgICAgICAgU3RyaW5nIGVuY29kaW5nID0gcGFyYW1NYXAuZ2V0QXNTdHJpbmcoIkVOQ09ESU5HIik7IAotICAgICAgICAKLSAgICAgICAgaWYgKHRhcmdldENoYXJzZXQgPT0gbnVsbCB8fCB0YXJnZXRDaGFyc2V0Lmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgIHRhcmdldENoYXJzZXQgPSBtVGFyZ2V0Q2hhcnNldDsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgZm9yIChTdHJpbmcgdmFsdWUgOiB2YWx1ZXMpIHsKLSAgICAgICAgICAgIG1DdXJyZW50UHJvcE5vZGUucHJvcFZhbHVlX3ZlY3Rvci5hZGQoCi0gICAgICAgICAgICAgICAgICAgIGhhbmRsZU9uZVZhbHVlKHZhbHVlLCB0YXJnZXRDaGFyc2V0LCBlbmNvZGluZykpOwotICAgICAgICB9Ci0KLSAgICAgICAgbUN1cnJlbnRQcm9wTm9kZS5wcm9wVmFsdWUgPSBsaXN0VG9TdHJpbmcobUN1cnJlbnRQcm9wTm9kZS5wcm9wVmFsdWVfdmVjdG9yKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBsaXN0VG9TdHJpbmcoTGlzdDxTdHJpbmc+IGxpc3QpewotICAgICAgICBpbnQgc2l6ZSA9IGxpc3Quc2l6ZSgpOwotICAgICAgICBpZiAoc2l6ZSA+IDEpIHsKLSAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgdHlwZUxpc3RCID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgICAgIGZvciAoU3RyaW5nIHR5cGUgOiBsaXN0KSB7Ci0gICAgICAgICAgICAgICAgdHlwZUxpc3RCLmFwcGVuZCh0eXBlKS5hcHBlbmQoIjsiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGludCBsZW4gPSB0eXBlTGlzdEIubGVuZ3RoKCk7Ci0gICAgICAgICAgICBpZiAobGVuID4gMCAmJiB0eXBlTGlzdEIuY2hhckF0KGxlbiAtIDEpID09ICc7JykgewotICAgICAgICAgICAgICAgIHJldHVybiB0eXBlTGlzdEIuc3Vic3RyaW5nKDAsIGxlbiAtIDEpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHR5cGVMaXN0Qi50b1N0cmluZygpOwotICAgICAgICB9IGVsc2UgaWYgKHNpemUgPT0gMSkgewotICAgICAgICAgICAgcmV0dXJuIGxpc3QuZ2V0KDApOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuICIiOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVzdWx0KCl7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3Byb3ZpZGVyL1NldHRpbmdzUHJvdmlkZXJUZXN0LmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9wcm92aWRlci9TZXR0aW5nc1Byb3ZpZGVyVGVzdC5qYXZhCmluZGV4IDM3MGFlNzguLmI4MmU2OTggMTAwNjQ0Ci0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3Byb3ZpZGVyL1NldHRpbmdzUHJvdmlkZXJUZXN0LmphdmEKKysrIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcHJvdmlkZXIvU2V0dGluZ3NQcm92aWRlclRlc3QuamF2YQpAQCAtMTQ0LDQgKzE0NCw1MSBAQAogCiAgICAgICAgIGFzc2VydEVxdWFscyhudWxsLCBTZXR0aW5ncy5Cb29rbWFya3MuZ2V0SW50ZW50Rm9yU2hvcnRjdXQociwgJyonKSk7CiAgICAgfQorCisgICAgQE1lZGl1bVRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGFyc2VQcm92aWRlckxpc3QoKSB7CisgICAgICAgIENvbnRlbnRSZXNvbHZlciByID0gZ2V0Q29udGV4dCgpLmdldENvbnRlbnRSZXNvbHZlcigpOworCisgICAgICAgIC8vIE1ha2Ugc3VyZSB3ZSBnZXQgb3V0IHdoYXQgd2UgcHV0IGluLgorICAgICAgICBTZXR0aW5ncy5TZWN1cmUucHV0U3RyaW5nKHIsIFNldHRpbmdzLlNlY3VyZS5MT0NBVElPTl9QUk9WSURFUlNfQUxMT1dFRCwKKyAgICAgICAgICAgICAgICAidGVzdDEsdGVzdDIsdGVzdDMiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFNldHRpbmdzLlNlY3VyZS5nZXRTdHJpbmcociwgU2V0dGluZ3MuU2VjdXJlLkxPQ0FUSU9OX1BST1ZJREVSU19BTExPV0VEKSwKKyAgICAgICAgICAgICAgICAidGVzdDEsdGVzdDIsdGVzdDMiKTsKKworICAgICAgICAvLyBUZXN0IGFkZGluZyBhIHZhbHVlCisgICAgICAgIFNldHRpbmdzLlNlY3VyZS5wdXRTdHJpbmcociwgU2V0dGluZ3MuU2VjdXJlLkxPQ0FUSU9OX1BST1ZJREVSU19BTExPV0VELAorICAgICAgICAgICAgICAgICIiKTsKKyAgICAgICAgU2V0dGluZ3MuU2VjdXJlLnB1dFN0cmluZyhyLCBTZXR0aW5ncy5TZWN1cmUuTE9DQVRJT05fUFJPVklERVJTX0FMTE9XRUQsICIrdGVzdDEiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXN0MSIsCisgICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLmdldFN0cmluZyhyLCBTZXR0aW5ncy5TZWN1cmUuTE9DQVRJT05fUFJPVklERVJTX0FMTE9XRUQpKTsKKworICAgICAgICAvLyBUZXN0IGFkZGluZyBhIHNlY29uZCB2YWx1ZQorICAgICAgICBTZXR0aW5ncy5TZWN1cmUucHV0U3RyaW5nKHIsIFNldHRpbmdzLlNlY3VyZS5MT0NBVElPTl9QUk9WSURFUlNfQUxMT1dFRCwgIit0ZXN0MiIpOworICAgICAgICBhc3NlcnRFcXVhbHMoInRlc3QxLHRlc3QyIiwKKyAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuZ2V0U3RyaW5nKHIsIFNldHRpbmdzLlNlY3VyZS5MT0NBVElPTl9QUk9WSURFUlNfQUxMT1dFRCkpOworCisgICAgICAgIC8vIFRlc3QgYWRkaW5nIGEgdGhpcmQgdmFsdWUKKyAgICAgICAgU2V0dGluZ3MuU2VjdXJlLnB1dFN0cmluZyhyLCBTZXR0aW5ncy5TZWN1cmUuTE9DQVRJT05fUFJPVklERVJTX0FMTE9XRUQsICIrdGVzdDMiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXN0MSx0ZXN0Mix0ZXN0MyIsCisgICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLmdldFN0cmluZyhyLCBTZXR0aW5ncy5TZWN1cmUuTE9DQVRJT05fUFJPVklERVJTX0FMTE9XRUQpKTsKKworICAgICAgICAvLyBUZXN0IGRlbGV0aW5nIHRoZSBmaXJzdCB2YWx1ZSBpbiBhIDMgaXRlbSBsaXN0CisgICAgICAgIFNldHRpbmdzLlNlY3VyZS5wdXRTdHJpbmcociwgU2V0dGluZ3MuU2VjdXJlLkxPQ0FUSU9OX1BST1ZJREVSU19BTExPV0VELCAiLXRlc3QxIik7CisgICAgICAgIGFzc2VydEVxdWFscygidGVzdDIsdGVzdDMiLAorICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5nZXRTdHJpbmcociwgU2V0dGluZ3MuU2VjdXJlLkxPQ0FUSU9OX1BST1ZJREVSU19BTExPV0VEKSk7CisKKyAgICAgICAgLy8gVGVzdCBkZWxldGluZyB0aGUgbWlkZGxlIHZhbHVlIGluIGEgMyBpdGVtIGxpc3QKKyAgICAgICAgU2V0dGluZ3MuU2VjdXJlLnB1dFN0cmluZyhyLCBTZXR0aW5ncy5TZWN1cmUuTE9DQVRJT05fUFJPVklERVJTX0FMTE9XRUQsCisgICAgICAgICAgICAgICAgInRlc3QxLHRlc3QyLHRlc3QzIik7CisgICAgICAgIFNldHRpbmdzLlNlY3VyZS5wdXRTdHJpbmcociwgU2V0dGluZ3MuU2VjdXJlLkxPQ0FUSU9OX1BST1ZJREVSU19BTExPV0VELCAiLXRlc3QyIik7CisgICAgICAgIGFzc2VydEVxdWFscygidGVzdDEsdGVzdDMiLAorICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5nZXRTdHJpbmcociwgU2V0dGluZ3MuU2VjdXJlLkxPQ0FUSU9OX1BST1ZJREVSU19BTExPV0VEKSk7CisKKyAgICAgICAgLy8gVGVzdCBkZWxldGluZyB0aGUgbGFzdCB2YWx1ZSBpbiBhIDMgaXRlbSBsaXN0CisgICAgICAgIFNldHRpbmdzLlNlY3VyZS5wdXRTdHJpbmcociwgU2V0dGluZ3MuU2VjdXJlLkxPQ0FUSU9OX1BST1ZJREVSU19BTExPV0VELAorICAgICAgICAgICAgICAgICJ0ZXN0MSx0ZXN0Mix0ZXN0MyIpOworICAgICAgICBTZXR0aW5ncy5TZWN1cmUucHV0U3RyaW5nKHIsIFNldHRpbmdzLlNlY3VyZS5MT0NBVElPTl9QUk9WSURFUlNfQUxMT1dFRCwgIi10ZXN0MyIpOworICAgICAgICBhc3NlcnRFcXVhbHMoInRlc3QxLHRlc3QyIiwKKyAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuZ2V0U3RyaW5nKHIsIFNldHRpbmdzLlNlY3VyZS5MT0NBVElPTl9QUk9WSURFUlNfQUxMT1dFRCkpOworICAgICB9CiB9CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC90ZXh0L1N0YXRpY0xheW91dEJpZGlUZXN0LmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC90ZXh0L1N0YXRpY0xheW91dEJpZGlUZXN0LmphdmEKaW5kZXggOGU3ZTYzZS4uZmIwZjBjMSAxMDA2NDQKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvdGV4dC9TdGF0aWNMYXlvdXRCaWRpVGVzdC5qYXZhCisrKyBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3RleHQvU3RhdGljTGF5b3V0QmlkaVRlc3QuamF2YQpAQCAtMjIsNyArMjIsNyBAQAogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKIAogLyoqCi0gKiBUZXN0cyBTdGF0aWNMYXlvdXQgYmlkaSBpbXBsZW1lbnRhdGlvbi4KKyAqIFF1aWNrIGNoZWNrIG9mIG5hdGl2ZSBiaWRpIGltcGxlbWVudGF0aW9uLgogICovCiBwdWJsaWMgY2xhc3MgU3RhdGljTGF5b3V0QmlkaVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAgICAgCkBAIC00MSw3MyArNDEsNDcgQEAKICAgICAKICAgICAvL0BTbWFsbFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0QWxsTHRyKCkgewotICAgICAgICBleHBlY3RCaWRpKFJFUV9ETCwgImEgdGVzdCIsICIwMDAwMDAiLCBMKTsKKyAgICAgICAgZXhwZWN0TmF0aXZlQmlkaShSRVFfREwsICJhIHRlc3QiLCAiMDAwMDAwIiwgTCk7CiAgICAgfQogICAgIAogICAgIC8vQFNtYWxsVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RMdHJSdGwoKSB7Ci0gICAgICAgIGV4cGVjdEJpZGkoUkVRX0RMLCAiYWJjICIgKyBBTEVGICsgQkVUICsgR0lNRUwsICIwMDAwMTExIiwgTCk7CisgICAgICAgIGV4cGVjdE5hdGl2ZUJpZGkoUkVRX0RMLCAiYWJjICIgKyBBTEVGICsgQkVUICsgR0lNRUwsICIwMDAwMTExIiwgTCk7CiAgICAgfQogICAgIAogICAgIC8vQFNtYWxsVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RBbGxSdGwoKSB7Ci0gICAgICAgIGV4cGVjdEJpZGkoUkVRX0RMLCBBTEVGICsgU1AgKyBBTEVGICsgQkVUICsgR0lNRUwgKyBEQUxFVCwgIjExMTExMSIsIFIpOworICAgICAgICBleHBlY3ROYXRpdmVCaWRpKFJFUV9ETCwgQUxFRiArIFNQICsgQUxFRiArIEJFVCArIEdJTUVMICsgREFMRVQsICIxMTExMTEiLCBSKTsKICAgICB9CiAgICAgCiAgICAgLy9AU21hbGxUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFJ0bEx0cigpIHsKLSAgICAgICAgZXhwZWN0QmlkaShSRVFfREwsICBBTEVGICsgQkVUICsgR0lNRUwgKyAiIGFiYyIsICIxMTExMDAwIiwgUik7CisgICAgICAgIGV4cGVjdE5hdGl2ZUJpZGkoUkVRX0RMLCAgQUxFRiArIEJFVCArIEdJTUVMICsgIiBhYmMiLCAiMTExMTIyMiIsIFIpOwogICAgIH0KICAgICAKICAgICAvL0BTbWFsbFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0UkFsbEx0cigpIHsKLSAgICAgICAgZXhwZWN0QmlkaShSRVFfUiwgImEgdGVzdCIsICIwMDAwMDAiLCBSKTsKKyAgICAgICAgZXhwZWN0TmF0aXZlQmlkaShSRVFfUiwgImEgdGVzdCIsICIyMjIyMjIiLCBSKTsKICAgICB9CiAgICAgCiAgICAgLy9AU21hbGxUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFJMdHJSdGwoKSB7Ci0gICAgICAgIGV4cGVjdEJpZGkoUkVRX1IsICJhYmMgIiArIEFMRUYgKyBCRVQgKyBHSU1FTCwgIjAwMDExMTEiLCBSKTsKKyAgICAgICAgZXhwZWN0TmF0aXZlQmlkaShSRVFfUiwgImFiYyAiICsgQUxFRiArIEJFVCArIEdJTUVMLCAiMjIyMTExMSIsIFIpOwogICAgIH0KICAgICAKICAgICAvL0BTbWFsbFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0TEFsbFJ0bCgpIHsKLSAgICAgICAgZXhwZWN0QmlkaShSRVFfTCwgQUxFRiArIFNQICsgQUxFRiArIEJFVCArIEdJTUVMICsgREFMRVQsICIxMTExMTEiLCBMKTsKKyAgICAgICAgZXhwZWN0TmF0aXZlQmlkaShSRVFfTCwgQUxFRiArIFNQICsgQUxFRiArIEJFVCArIEdJTUVMICsgREFMRVQsICIxMTExMTEiLCBMKTsKICAgICB9CiAgICAgCiAgICAgLy9AU21hbGxUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdExSdGxMdHIoKSB7Ci0gICAgICAgIGV4cGVjdEJpZGkoUkVRX0wsICBBTEVGICsgQkVUICsgR0lNRUwgKyAiIGFiYyIsICIxMTEwMDAwIiwgTCk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCBleHBlY3RCaWRpKGludCBkaXIsIFN0cmluZyB0ZXh0LCAKLSAgICAgICAgICAgIFN0cmluZyBleHBlY3RlZExldmVscywgaW50IGV4cGVjdGVkRGlyKSB7Ci0gICAgICAgIGNoYXJbXSBjaHMgPSB0ZXh0LnRvQ2hhckFycmF5KCk7Ci0gICAgICAgIGludCBuID0gY2hzLmxlbmd0aDsKLSAgICAgICAgYnl0ZVtdIGNoSW5mbyA9IG5ldyBieXRlW25dOwotICAgICAgICAKLSAgICAgICAgaW50IHJlc3VsdERpciA9IFN0YXRpY0xheW91dC5iaWRpKGRpciwgY2hzLCBjaEluZm8sIG4sIGZhbHNlKTsKLSAgICAgICAgCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigiaW5mbzoiKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgKytpKSB7Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIgIikuYXBwZW5kKFN0cmluZy52YWx1ZU9mKGNoSW5mb1tpXSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgTG9nLmkoIkJJREkiLCBzYi50b1N0cmluZygpKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgY2hhcltdIHJlc3VsdExldmVsQ2hhcnMgPSBuZXcgY2hhcltuXTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyArK2kpIHsKLSAgICAgICAgICAgIHJlc3VsdExldmVsQ2hhcnNbaV0gPSAoY2hhcikoJzAnICsgY2hJbmZvW2ldKTsKLSAgICAgICAgfQotICAgICAgICBTdHJpbmcgcmVzdWx0TGV2ZWxzID0gbmV3IFN0cmluZyhyZXN1bHRMZXZlbENoYXJzKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJkaXJlY3Rpb24iLCBleHBlY3RlZERpciwgcmVzdWx0RGlyKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJsZXZlbHMiLCBleHBlY3RlZExldmVscywgcmVzdWx0TGV2ZWxzKTsKKyAgICAgICAgZXhwZWN0TmF0aXZlQmlkaShSRVFfREwsICBBTEVGICsgQkVUICsgR0lNRUwgKyAiIGFiYyIsICIxMTExMjIyIiwgUik7CiAgICAgfQogICAgIAogICAgIC8vQFNtYWxsVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3ROYXRpdmVCaWRpKCkgewotICAgICAgICAvLyBuYXRpdmUgYmlkaSByZXR1cm5zIGxldmVscywgbm90IHNpbXBseSBkaXJlY3Rpb25zCi0gICAgICAgIGV4cGVjdE5hdGl2ZUJpZGkoUkVRX0RMLCAgQUxFRiArIEJFVCArIEdJTUVMICsgIiBhYmMiLCAiMTExMTIyMiIsIFIpOworICAgICAgICBleHBlY3ROYXRpdmVCaWRpKFJFUV9MLCAgQUxFRiArIEJFVCArIEdJTUVMICsgIiBhYmMiLCAiMTExMDAwMCIsIEwpOwogICAgIH0KICAgICAKICAgICBwcml2YXRlIHZvaWQgZXhwZWN0TmF0aXZlQmlkaShpbnQgZGlyLCBTdHJpbmcgdGV4dCwgCmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC90ZXh0L1N0YXRpY0xheW91dERpcmVjdGlvbnNUZXN0LmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC90ZXh0L1N0YXRpY0xheW91dERpcmVjdGlvbnNUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGZkZTg0OQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3RleHQvU3RhdGljTGF5b3V0RGlyZWN0aW9uc1Rlc3QuamF2YQpAQCAtMCwwICsxLDI0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90CisgKiB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgorICogdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCisgKiBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUKKyAqIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCisgKiB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQudGV4dDsKKworaW1wb3J0IGFuZHJvaWQudGV4dC5MYXlvdXQuRGlyZWN0aW9uczsKK2ltcG9ydCBhbmRyb2lkLnRleHQuU3RhdGljTGF5b3V0VGVzdC5MYXlvdXRCdWlsZGVyOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuRm9ybWF0dGVyOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitwdWJsaWMgY2xhc3MgU3RhdGljTGF5b3V0RGlyZWN0aW9uc1Rlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBBTEVGID0gJ1x1MDVkMCc7CisKKyAgICBwcml2YXRlIHN0YXRpYyBEaXJlY3Rpb25zIGRpcnMoaW50IC4uLiBkaXJzKSB7CisgICAgICAgIHJldHVybiBuZXcgRGlyZWN0aW9ucyhkaXJzKTsKKyAgICB9CisKKyAgICAvLyBjb25zdGFudHMgZnJvbSBMYXlvdXQgdGhhdCBhcmUgcGFja2FnZS1wcm90ZWN0ZWQKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUlVOX0xFTkdUSF9NQVNLID0gMHgwM2ZmZmZmZjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUlVOX0xFVkVMX1NISUZUID0gMjY7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJVTl9MRVZFTF9NQVNLID0gMHgzZjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUlVOX1JUTF9GTEFHID0gMSA8PCBSVU5fTEVWRUxfU0hJRlQ7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBEaXJlY3Rpb25zIERJUlNfQUxMX0xFRlRfVE9fUklHSFQgPQorICAgICAgICBuZXcgRGlyZWN0aW9ucyhuZXcgaW50W10geyAwLCBSVU5fTEVOR1RIX01BU0sgfSk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGlyZWN0aW9ucyBESVJTX0FMTF9SSUdIVF9UT19MRUZUID0KKyAgICAgICAgbmV3IERpcmVjdGlvbnMobmV3IGludFtdIHsgMCwgUlVOX0xFTkdUSF9NQVNLIHwgUlVOX1JUTF9GTEFHIH0pOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IExWTDFfMSA9IDEgfCAoMSA8PCBSVU5fTEVWRUxfU0hJRlQpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBMVkwyXzEgPSAxIHwgKDIgPDwgUlVOX0xFVkVMX1NISUZUKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTFZMMl8yID0gMiB8ICgyIDw8IFJVTl9MRVZFTF9TSElGVCk7CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSB0ZXh0cyA9IHsKKyAgICAgICAgIiIsCisgICAgICAgICIgIiwKKyAgICAgICAgImEiLAorICAgICAgICAiYTEiLAorICAgICAgICAiYUEiLAorICAgICAgICAiYTFiIiwKKyAgICAgICAgImExQSIsCisgICAgICAgICJhQTEiLAorICAgICAgICAiYUFiIiwKKyAgICAgICAgImFBMUIiLAorICAgICAgICAiYUExQjIiLAorCisgICAgICAgIC8vIHJ0bAorICAgICAgICAiQSIsCisgICAgICAgICJBMSIsCisgICAgICAgICJBYSIsCisgICAgICAgICJBMUIiLAorICAgICAgICAiQTFhIiwKKyAgICAgICAgIkFhMSIsCisgICAgICAgICJBYUIiCisgICAgfTsKKworICAgIC8vIEV4cGVjdGVkIGRpcmVjdGlvbnMgYXJlIGFuIGFycmF5IG9mIHN0YXJ0L2xlbmd0aCtsZXZlbCBwYWlycywKKyAgICAvLyBpbiB2aXN1YWwgb3JkZXIgZnJvbSB0aGUgbGVhZGluZyBtYXJnaW4uCisgICAgcHJpdmF0ZSBzdGF0aWMgRGlyZWN0aW9uc1tdIGV4cGVjdGVkID0geworICAgICAgICBESVJTX0FMTF9MRUZUX1RPX1JJR0hULAorICAgICAgICBESVJTX0FMTF9MRUZUX1RPX1JJR0hULAorICAgICAgICBESVJTX0FMTF9MRUZUX1RPX1JJR0hULAorICAgICAgICBESVJTX0FMTF9MRUZUX1RPX1JJR0hULAorICAgICAgICBkaXJzKDAsIDEsIDEsIExWTDFfMSksCisgICAgICAgIERJUlNfQUxMX0xFRlRfVE9fUklHSFQsCisgICAgICAgIGRpcnMoMCwgMiwgMiwgTFZMMV8xKSwKKyAgICAgICAgZGlycygwLCAxLCAyLCBMVkwyXzEsIDEsIExWTDFfMSksCisgICAgICAgIGRpcnMoMCwgMSwgMSwgTFZMMV8xLCAyLCAxKSwKKyAgICAgICAgZGlycygwLCAxLCAzLCBMVkwxXzEsIDIsIExWTDJfMSwgMSwgTFZMMV8xKSwKKyAgICAgICAgZGlycygwLCAxLCA0LCBMVkwyXzEsIDMsIExWTDFfMSwgMiwgTFZMMl8xLCAxLCBMVkwxXzEpLAorCisgICAgICAgIC8vIHJ0bAorICAgICAgICBESVJTX0FMTF9SSUdIVF9UT19MRUZULAorICAgICAgICBkaXJzKDAsIExWTDFfMSwgMSwgTFZMMl8xKSwKKyAgICAgICAgZGlycygwLCBMVkwxXzEsIDEsIExWTDJfMSksCisgICAgICAgIGRpcnMoMCwgTFZMMV8xLCAxLCBMVkwyXzEsIDIsIExWTDFfMSksCisgICAgICAgIGRpcnMoMCwgTFZMMV8xLCAxLCBMVkwyXzIpLAorICAgICAgICBkaXJzKDAsIExWTDFfMSwgMSwgTFZMMl8yKSwKKyAgICAgICAgZGlycygwLCBMVkwxXzEsIDEsIExWTDJfMSwgMiwgTFZMMV8xKSwKKyAgICB9OworCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHBzZXVkb0JpZGlUb1JlYWwoU3RyaW5nIHNyYykgeworICAgICAgICBjaGFyW10gY2hhcnMgPSBzcmMudG9DaGFyQXJyYXkoKTsKKyAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBjaGFycy5sZW5ndGg7ICsraikgeworICAgICAgICAgICAgY2hhciBjID0gY2hhcnNbal07CisgICAgICAgICAgICBpZiAoYyA+PSAnQScgJiYgYyA8PSAnRCcpIHsKKyAgICAgICAgICAgICAgICBjaGFyc1tqXSA9IChjaGFyKShBTEVGICsgYyAtICdBJyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhjaGFycywgMCwgY2hhcnMubGVuZ3RoKTsKKyAgICB9CisKKyAgICAvLyBAU21hbGxUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdERpcmVjdGlvbnMoKSB7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgYnVmID0gbmV3IFN0cmluZ0J1aWxkZXIoIlxuIik7CisgICAgICAgIEZvcm1hdHRlciBmID0gbmV3IEZvcm1hdHRlcihidWYpOworCisgICAgICAgIExheW91dEJ1aWxkZXIgYiA9IFN0YXRpY0xheW91dFRlc3QuYnVpbGRlcigpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRleHRzLmxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICBiLnNldFRleHQocHNldWRvQmlkaVRvUmVhbCh0ZXh0c1tpXSkpOworICAgICAgICAgICAgY2hlY2tEaXJlY3Rpb25zKGIuYnVpbGQoKSwgaSwgYi50ZXh0LCBleHBlY3RlZCwgZik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGJ1Zi5sZW5ndGgoKSA+IDEpIHsKKyAgICAgICAgICAgIGZhaWwoYnVmLnRvU3RyaW5nKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gQFNtYWxsVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RUcmFpbGluZ1doaXRlc3BhY2UoKSB7CisgICAgICAgIExheW91dEJ1aWxkZXIgYiA9IFN0YXRpY0xheW91dFRlc3QuYnVpbGRlcigpOworICAgICAgICBiLnNldFRleHQocHNldWRvQmlkaVRvUmVhbCgiQWIgICBjIikpOworICAgICAgICBmbG9hdCB3aWR0aCA9IGIucGFpbnQubWVhc3VyZVRleHQoYi50ZXh0LCAwLCA1KTsgIC8vIGV4Y2x1ZGUgJ2MnCisgICAgICAgIGIuc2V0V2lkdGgoTWF0aC5yb3VuZCh3aWR0aCkpOworICAgICAgICBMYXlvdXQgbCA9IGIuYnVpbGQoKTsKKyAgICAgICAgaWYgKGwuZ2V0TGluZUNvdW50KCkgIT0gMikgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oImV4cGVjdGVkIDIgbGluZXMsIGdvdDogIiArIGwuZ2V0TGluZUNvdW50KCkpOworICAgICAgICB9CisgICAgICAgIERpcmVjdGlvbnMgcmVzdWx0ID0gbC5nZXRMaW5lRGlyZWN0aW9ucygwKTsKKyAgICAgICAgRGlyZWN0aW9ucyBleHBlY3RlZCA9IGRpcnMoMCwgTFZMMV8xLCAxLCBMVkwyXzEsIDIsIDMgfCAoMSA8PCBMYXlvdXQuUlVOX0xFVkVMX1NISUZUKSk7CisgICAgICAgIGV4cGVjdERpcmVjdGlvbnMoInNwbGl0IGxpbmUiLCBleHBlY3RlZCwgcmVzdWx0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TmV4dFRvUmlnaHRPZigpIHsKKyAgICAgICAgTGF5b3V0QnVpbGRlciBiID0gU3RhdGljTGF5b3V0VGVzdC5idWlsZGVyKCk7CisgICAgICAgIGIuc2V0VGV4dChwc2V1ZG9CaWRpVG9SZWFsKCJhQTFCMiIpKTsKKyAgICAgICAgLy8gdmlzdWFsIGEyQjFBIHBvc2l0aW9ucyAwNDMyMQorICAgICAgICAvLyAwOiB8YTJCMUEsIHN0cm9uZyBpcyBzb2wsIGFmdGVyIC0+IDAKKyAgICAgICAgLy8gMTogYXwyQjFBLCBzdHJvbmcgaXMgYSwgYWZ0ZXIgLT4sIDEKKyAgICAgICAgLy8gMjogYTJ8QjFBLCBzdHJvbmcgaXMgQiwgYWZ0ZXIgLT4gNAorICAgICAgICAvLyAzOiBhMkJ8MUEsIHN0cm9uZyBpcyBCLCBiZWZvcmUgLT4gMworICAgICAgICAvLyA0OiBhMkIxfEEsIHN0cm9uZyBpcyBBLCBhZnRlciAtPiAyCisgICAgICAgIC8vIDU6IGEyQjFBfCwgc3Ryb25nIGlzIGVvbCwgYmVmb3JlIC0+IDUKKyAgICAgICAgaW50W10gZXhwZWN0ZWQgPSB7IDAsIDEsIDQsIDMsIDIsIDUgfTsKKyAgICAgICAgTGF5b3V0IGwgPSBiLmJ1aWxkKCk7CisgICAgICAgIGludCBuID0gMDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBleHBlY3RlZC5sZW5ndGg7ICsraSkgeworICAgICAgICAgICAgaW50IHQgPSBsLmdldE9mZnNldFRvUmlnaHRPZihuKTsKKyAgICAgICAgICAgIGlmICh0ICE9IGV4cGVjdGVkW2ldKSB7CisgICAgICAgICAgICAgICAgZmFpbCgib2Zmc2V0WyIgKyBpICsgIl0gdG8gcmlnaHQgb2Y6ICIgKyBuICsgIiBleHBlY3RlZDogIiArCisgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZFtpXSArICIgZ290OiAiICsgdCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBuID0gdDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3ROZXh0VG9MZWZ0T2YoKSB7CisgICAgICAgIExheW91dEJ1aWxkZXIgYiA9IFN0YXRpY0xheW91dFRlc3QuYnVpbGRlcigpOworICAgICAgICBiLnNldFRleHQocHNldWRvQmlkaVRvUmVhbCgiYUExQjIiKSk7CisgICAgICAgIGludFtdIGV4cGVjdGVkID0geyAwLCAxLCA0LCAzLCAyLCA1IH07CisgICAgICAgIExheW91dCBsID0gYi5idWlsZCgpOworICAgICAgICBpbnQgbiA9IDU7CisgICAgICAgIGZvciAoaW50IGkgPSBleHBlY3RlZC5sZW5ndGggLSAxOyAtLWkgPj0gMDspIHsKKyAgICAgICAgICAgIGludCB0ID0gbC5nZXRPZmZzZXRUb0xlZnRPZihuKTsKKyAgICAgICAgICAgIGlmICh0ICE9IGV4cGVjdGVkW2ldKSB7CisgICAgICAgICAgICAgICAgZmFpbCgib2Zmc2V0WyIgKyBpICsgIl0gdG8gbGVmdCBvZjogIiArIG4gKyAiIGV4cGVjdGVkOiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkW2ldICsgIiBnb3Q6ICIgKyB0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG4gPSB0OworICAgICAgICB9CisgICAgfQorCisgICAgLy8gdXRpbGl0eSwgbm90IHJlYWxseSBhIHRlc3QKKyAgICAvKgorICAgIHB1YmxpYyB2b2lkIHRlc3RNZWFzdXJlVGV4dDEoKSB7CisgICAgICAgIExheW91dEJ1aWxkZXIgYiA9IFN0YXRpY0xheW91dFRlc3QuYnVpbGRlcigpOworICAgICAgICBTdHJpbmcgdGV4dCA9ICJBQkMiOyAvLyAiYWJBQiIKKyAgICAgICAgYi5zZXRUZXh0KHBzZXVkb0JpZGlUb1JlYWwodGV4dCkpOworICAgICAgICBMYXlvdXQgbCA9IGIuYnVpbGQoKTsKKyAgICAgICAgRGlyZWN0aW9ucyBkaXJlY3Rpb25zID0gbC5nZXRMaW5lRGlyZWN0aW9ucygwKTsKKworICAgICAgICBUZXh0UGFpbnQgd29ya1BhaW50ID0gbmV3IFRleHRQYWludCgpOworCisgICAgICAgIGludCBkaXIgPSAtMTsgLy8gTEVGVF9UT19SSUdIVAorICAgICAgICBib29sZWFuIHRyYWlsaW5nID0gdHJ1ZTsKKyAgICAgICAgYm9vbGVhbiBhbHQgPSB0cnVlOworICAgICAgICBkbyB7CisgICAgICAgICAgICBkaXIgPSAtZGlyOworICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIHRyYWlsaW5nID0gIXRyYWlsaW5nOworICAgICAgICAgICAgICAgIGZvciAoaW50IG9mZnNldCA9IDAsIGVuZCA9IGIudGV4dC5sZW5ndGgoKTsgb2Zmc2V0IDw9IGVuZDsgKytvZmZzZXQpIHsKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQgd2lkdGggPSBMYXlvdXQubWVhc3VyZVRleHQoYi5wYWludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrUGFpbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYi50ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIG9mZnNldCwgZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpciwgZGlyZWN0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFpbGluZywgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCk7CisgICAgICAgICAgICAgICAgICAgIExvZy5pKCJCSURJIiwgImRpcjogIiArIGRpciArICIgdHJhaWw6ICIgKyB0cmFpbGluZyArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBvZmZzZXQ6ICIgKyBvZmZzZXQgKyAiIHdpZHRoOiAiICsgd2lkdGgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gd2hpbGUgKCF0cmFpbGluZyk7CisgICAgICAgIH0gd2hpbGUgKGRpciA+IDApOworICAgIH0KKyAgICAqLworCisgICAgLy8gdXRpbGl0eSBmb3IgZGlzcGxheWluZyBhcnJheXMgaW4gaGV4CisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGhleEFycmF5KGludFtdIGFycmF5KSB7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICBzYi5hcHBlbmQoJ3snKTsKKyAgICAgICAgZm9yIChpbnQgaSA6IGFycmF5KSB7CisgICAgICAgICAgICBpZiAoc2IubGVuZ3RoKCkgPiAxKSB7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIsICIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2IuYXBwZW5kKEludGVnZXIudG9IZXhTdHJpbmcoaSkpOworICAgICAgICB9CisgICAgICAgIHNiLmFwcGVuZCgnfScpOworICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY2hlY2tEaXJlY3Rpb25zKExheW91dCBsLCBpbnQgaSwgU3RyaW5nIHRleHQsCisgICAgICAgICAgICBEaXJlY3Rpb25zW10gZXhwZWN0ZWREaXJzLCBGb3JtYXR0ZXIgZikgeworICAgICAgICBEaXJlY3Rpb25zIGV4cGVjdGVkID0gZXhwZWN0ZWREaXJzW2ldOworICAgICAgICBEaXJlY3Rpb25zIHJlc3VsdCA9IGwuZ2V0TGluZURpcmVjdGlvbnMoMCk7CisgICAgICAgIGlmICghQXJyYXlzLmVxdWFscyhleHBlY3RlZC5tRGlyZWN0aW9ucywgcmVzdWx0Lm1EaXJlY3Rpb25zKSkgeworICAgICAgICAgICAgZi5mb3JtYXQoIiVuWyUyZF0gJyVzJywgJXMgIT0gJXMiLCBpLCB0ZXh0LAorICAgICAgICAgICAgICAgICAgICBoZXhBcnJheShleHBlY3RlZC5tRGlyZWN0aW9ucyksCisgICAgICAgICAgICAgICAgICAgIGhleEFycmF5KHJlc3VsdC5tRGlyZWN0aW9ucykpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGV4cGVjdERpcmVjdGlvbnMoU3RyaW5nIG1zZywgRGlyZWN0aW9ucyBleHBlY3RlZCwgRGlyZWN0aW9ucyByZXN1bHQpIHsKKyAgICAgICAgaWYgKCFBcnJheXMuZXF1YWxzKGV4cGVjdGVkLm1EaXJlY3Rpb25zLCByZXN1bHQubURpcmVjdGlvbnMpKSB7CisgICAgICAgICAgICBmYWlsKCJleHBlY3RlZDogIiArIGhleEFycmF5KGV4cGVjdGVkLm1EaXJlY3Rpb25zKSArCisgICAgICAgICAgICAgICAgICAgICIgZ290OiAiICsgaGV4QXJyYXkocmVzdWx0Lm1EaXJlY3Rpb25zKSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC90ZXh0L1N0YXRpY0xheW91dFRlc3QuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3RleHQvU3RhdGljTGF5b3V0VGVzdC5qYXZhCmluZGV4IDFmNThhMmMuLmQ1NTRhNTAgMTAwNjQ0Ci0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3RleHQvU3RhdGljTGF5b3V0VGVzdC5qYXZhCisrKyBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3RleHQvU3RhdGljTGF5b3V0VGVzdC5qYXZhCkBAIC0yMjgsMTEgKzIyOCwxMSBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHJpdmF0ZSBzdGF0aWMgTGF5b3V0QnVpbGRlciBidWlsZGVyKCkgeworICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIExheW91dEJ1aWxkZXIgYnVpbGRlcigpIHsKICAgICAgICAgcmV0dXJuIG5ldyBMYXlvdXRCdWlsZGVyKCk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTGF5b3V0QnVpbGRlciB7CisgICAgLyogcGFja2FnZSAqLyBzdGF0aWMgY2xhc3MgTGF5b3V0QnVpbGRlciB7CiAgICAgICAgIFN0cmluZyB0ZXh0ID0gIlRoaXMgaXMgYSB0ZXN0IjsKICAgICAgICAgVGV4dFBhaW50IHBhaW50ID0gbmV3IFRleHRQYWludCgpOyAvLyBkZWZhdWx0CiAgICAgICAgIGludCB3aWR0aCA9IDEwMDsKZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3V0aWwvRXhwYW5kYWJsZUxpc3RTY2VuYXJpby5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvdXRpbC9FeHBhbmRhYmxlTGlzdFNjZW5hcmlvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhMTJiMGQuLjAwMDAwMDAKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvdXRpbC9FeHBhbmRhYmxlTGlzdFNjZW5hcmlvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGFuZHJvaWQudmlldy5HcmF2aXR5OwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuQWJzTGlzdFZpZXc7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuQmFzZUV4cGFuZGFibGVMaXN0QWRhcHRlcjsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5FeHBhbmRhYmxlTGlzdEFkYXB0ZXI7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuRXhwYW5kYWJsZUxpc3RWaWV3OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0Lkxpc3RWaWV3OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OwotCi0vKioKLSAqIFV0aWxpdHkgYmFzZSBjbGFzcyBmb3IgY3JlYXRpbmcgdmFyaW91cyBFeHBhbmRhYmxlIExpc3Qgc2NlbmFyaW9zLgotICogPHA+Ci0gKiBXQVJOSU5HOiBBIGxvdCBvZiB0aGUgZmVhdHVyZXMgYXJlIG1peGVkIGJldHdlZW4gTGlzdFZpZXcncyBleHBlY3RlZCBwb3NpdGlvbgotICogKGZsYXQgbGlzdCBwb3NpdGlvbikgYW5kIGFuIEV4cGFuZGFibGVMaXN0VmlldydzIGV4cGVjdGVkIHBvc2l0aW9uLiAgWW91IG11c3QgYWRkL2NoYW5nZQotICogZmVhdHVyZXMgYXMgeW91IG5lZWQgdGhlbS4KLSAqIAotICogQHNlZSBMaXN0U2NlbmFyaW8KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEV4cGFuZGFibGVMaXN0U2NlbmFyaW8gZXh0ZW5kcyBMaXN0U2NlbmFyaW8gewotICAgIHByb3RlY3RlZCBFeHBhbmRhYmxlTGlzdEFkYXB0ZXIgbUFkYXB0ZXI7IAotICAgIHByb3RlY3RlZCBMaXN0PE15R3JvdXA+IG1Hcm91cHM7Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIExpc3RWaWV3IGNyZWF0ZUxpc3RWaWV3KCkgewotICAgICAgICByZXR1cm4gbmV3IEV4cGFuZGFibGVMaXN0Vmlldyh0aGlzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgUGFyYW1zIGNyZWF0ZVBhcmFtcygpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBFeHBhbmRhYmxlUGFyYW1zKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0QWRhcHRlcihMaXN0VmlldyBsaXN0VmlldykgewotICAgICAgICAoKEV4cGFuZGFibGVMaXN0VmlldykgbGlzdFZpZXcpLnNldEFkYXB0ZXIobUFkYXB0ZXIgPSBjcmVhdGVBZGFwdGVyKCkpOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgRXhwYW5kYWJsZUxpc3RBZGFwdGVyIGNyZWF0ZUFkYXB0ZXIoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgTXlBZGFwdGVyKCk7Ci0gICAgfQotICAgIAotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHJlYWRBbmRWYWxpZGF0ZVBhcmFtcyhQYXJhbXMgcGFyYW1zKSB7Ci0gICAgICAgIEV4cGFuZGFibGVQYXJhbXMgZXhwYW5kYWJsZVBhcmFtcyA9IChFeHBhbmRhYmxlUGFyYW1zKSBwYXJhbXM7Ci0gICAgICAgIAotICAgICAgICBpbnRbXSBudW1DaGlsZHJlbiA9IGV4cGFuZGFibGVQYXJhbXMubU51bUNoaWxkcmVuOwotICAgICAgICAKLSAgICAgICAgbUdyb3VwcyA9IG5ldyBBcnJheUxpc3Q8TXlHcm91cD4obnVtQ2hpbGRyZW4ubGVuZ3RoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1DaGlsZHJlbi5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgbUdyb3Vwcy5hZGQobmV3IE15R3JvdXAobnVtQ2hpbGRyZW5baV0pKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgZXhwYW5kYWJsZVBhcmFtcy5zdXBlclNldE51bUl0ZW1zKCk7Ci0gICAgICAgIAotICAgICAgICBzdXBlci5yZWFkQW5kVmFsaWRhdGVQYXJhbXMocGFyYW1zKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIEV4cGFuZGFibGVMaXN0VmlldyB3aWRnZXQuCi0gICAgICogQHJldHVybiBUaGUgbWFpbiB3aWRnZXQuCi0gICAgICovCi0gICAgcHVibGljIEV4cGFuZGFibGVMaXN0VmlldyBnZXRFeHBhbmRhYmxlTGlzdFZpZXcoKSB7Ci0gICAgICAgIHJldHVybiAoRXhwYW5kYWJsZUxpc3RWaWV3KSBzdXBlci5nZXRMaXN0VmlldygpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRXhwYW5kYWJsZVBhcmFtcyBleHRlbmRzIFBhcmFtcyB7Ci0gICAgICAgIHByaXZhdGUgaW50W10gbU51bUNoaWxkcmVuOwotICAgICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNldHMgdGhlIG51bWJlciBvZiBjaGlsZHJlbiBwZXIgZ3JvdXAuCi0gICAgICAgICAqICAKLSAgICAgICAgICogQHBhcmFtIG51bUNoaWxkcmVuUGVyR3JvdXAgVGhlIG51bWJlciBvZiBjaGlsZHJlbiBwZXIgZ3JvdXAuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgRXhwYW5kYWJsZVBhcmFtcyBzZXROdW1DaGlsZHJlbihpbnRbXSBudW1DaGlsZHJlbikgewotICAgICAgICAgICAgbU51bUNoaWxkcmVuID0gbnVtQ2hpbGRyZW47Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIHRoZSBudW1iZXIgb2YgaXRlbXMgb24gdGhlIHN1cGVyY2xhc3MgYmFzZWQgb24gdGhlIG51bWJlciBvZgotICAgICAgICAgKiBncm91cHMgYW5kIGNoaWxkcmVuIHBlciBncm91cC4KLSAgICAgICAgICovCi0gICAgICAgIHByaXZhdGUgRXhwYW5kYWJsZVBhcmFtcyBzdXBlclNldE51bUl0ZW1zKCkgewotICAgICAgICAgICAgaW50IG51bUl0ZW1zID0gMDsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKG1OdW1DaGlsZHJlbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IG1OdW1DaGlsZHJlbi5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgewotICAgICAgICAgICAgICAgICAgICBudW1JdGVtcyArPSBtTnVtQ2hpbGRyZW5baV07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBzdXBlci5zZXROdW1JdGVtcyhudW1JdGVtcyk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIFBhcmFtcyBzZXROdW1JdGVtcyhpbnQgbnVtSXRlbXMpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlVzZSBzZXROdW1Hcm91cHMgYW5kIHNldE51bUNoaWxkcmVuIGluc3RlYWQuIik7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEV4cGFuZGFibGVQYXJhbXMgc2V0RmFkaW5nRWRnZVNjcmVlblNpemVGYWN0b3IoZG91YmxlIGZhZGluZ0VkZ2VTY3JlZW5TaXplRmFjdG9yKSB7Ci0gICAgICAgICAgICByZXR1cm4gKEV4cGFuZGFibGVQYXJhbXMpIHN1cGVyLnNldEZhZGluZ0VkZ2VTY3JlZW5TaXplRmFjdG9yKGZhZGluZ0VkZ2VTY3JlZW5TaXplRmFjdG9yKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgRXhwYW5kYWJsZVBhcmFtcyBzZXRJdGVtU2NyZWVuU2l6ZUZhY3Rvcihkb3VibGUgaXRlbVNjcmVlblNpemVGYWN0b3IpIHsKLSAgICAgICAgICAgIHJldHVybiAoRXhwYW5kYWJsZVBhcmFtcykgc3VwZXIuc2V0SXRlbVNjcmVlblNpemVGYWN0b3IoaXRlbVNjcmVlblNpemVGYWN0b3IpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBFeHBhbmRhYmxlUGFyYW1zIHNldEl0ZW1zRm9jdXNhYmxlKGJvb2xlYW4gaXRlbXNGb2N1c2FibGUpIHsKLSAgICAgICAgICAgIHJldHVybiAoRXhwYW5kYWJsZVBhcmFtcykgc3VwZXIuc2V0SXRlbXNGb2N1c2FibGUoaXRlbXNGb2N1c2FibGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBFeHBhbmRhYmxlUGFyYW1zIHNldE11c3RGaWxsU2NyZWVuKGJvb2xlYW4gZmlsbFNjcmVlbikgewotICAgICAgICAgICAgcmV0dXJuIChFeHBhbmRhYmxlUGFyYW1zKSBzdXBlci5zZXRNdXN0RmlsbFNjcmVlbihmaWxsU2NyZWVuKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgRXhwYW5kYWJsZVBhcmFtcyBzZXRQb3NpdGlvblNjcmVlblNpemVGYWN0b3JPdmVycmlkZShpbnQgcG9zaXRpb24sIGRvdWJsZSBpdGVtU2NyZWVuU2l6ZUZhY3RvcikgewotICAgICAgICAgICAgcmV0dXJuIChFeHBhbmRhYmxlUGFyYW1zKSBzdXBlci5zZXRQb3NpdGlvblNjcmVlblNpemVGYWN0b3JPdmVycmlkZShwb3NpdGlvbiwgaXRlbVNjcmVlblNpemVGYWN0b3IpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBFeHBhbmRhYmxlUGFyYW1zIHNldFBvc2l0aW9uVW5zZWxlY3RhYmxlKGludCBwb3NpdGlvbikgewotICAgICAgICAgICAgcmV0dXJuIChFeHBhbmRhYmxlUGFyYW1zKSBzdXBlci5zZXRQb3NpdGlvblVuc2VsZWN0YWJsZShwb3NpdGlvbik7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEV4cGFuZGFibGVQYXJhbXMgc2V0U3RhY2tGcm9tQm90dG9tKGJvb2xlYW4gc3RhY2tGcm9tQm90dG9tKSB7Ci0gICAgICAgICAgICByZXR1cm4gKEV4cGFuZGFibGVQYXJhbXMpIHN1cGVyLnNldFN0YWNrRnJvbUJvdHRvbShzdGFja0Zyb21Cb3R0b20pOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBFeHBhbmRhYmxlUGFyYW1zIHNldFN0YXJ0aW5nU2VsZWN0aW9uUG9zaXRpb24oaW50IHN0YXJ0aW5nU2VsZWN0aW9uUG9zaXRpb24pIHsKLSAgICAgICAgICAgIHJldHVybiAoRXhwYW5kYWJsZVBhcmFtcykgc3VwZXIuc2V0U3RhcnRpbmdTZWxlY3Rpb25Qb3NpdGlvbihzdGFydGluZ1NlbGVjdGlvblBvc2l0aW9uKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgRXhwYW5kYWJsZVBhcmFtcyBzZXRDb25uZWN0QWRhcHRlcihib29sZWFuIGNvbm5lY3RBZGFwdGVyKSB7Ci0gICAgICAgICAgICByZXR1cm4gKEV4cGFuZGFibGVQYXJhbXMpIHN1cGVyLnNldENvbm5lY3RBZGFwdGVyKGNvbm5lY3RBZGFwdGVyKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgYSBzdHJpbmcgZm9yIHRoZSB2YWx1ZSBvZiBzb21lIGl0ZW0uCi0gICAgICogQHBhcmFtIHBhY2tlZFBvc2l0aW9uIFRoZSBwb3NpdGlvbiBvZiB0aGUgaXRlbS4KLSAgICAgKiBAcmV0dXJuIFRoZSBzdHJpbmcuCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRWYWx1ZUF0UG9zaXRpb24obG9uZyBwYWNrZWRQb3NpdGlvbikgewotICAgICAgICBmaW5hbCBpbnQgdHlwZSA9IEV4cGFuZGFibGVMaXN0Vmlldy5nZXRQYWNrZWRQb3NpdGlvblR5cGUocGFja2VkUG9zaXRpb24pOwotICAgICAgICAKLSAgICAgICAgaWYgKHR5cGUgPT0gRXhwYW5kYWJsZUxpc3RWaWV3LlBBQ0tFRF9QT1NJVElPTl9UWVBFX0NISUxEKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUdyb3Vwcy5nZXQoRXhwYW5kYWJsZUxpc3RWaWV3LmdldFBhY2tlZFBvc2l0aW9uR3JvdXAocGFja2VkUG9zaXRpb24pKQotICAgICAgICAgICAgICAgICAgICAuY2hpbGRyZW4uZ2V0KEV4cGFuZGFibGVMaXN0Vmlldy5nZXRQYWNrZWRQb3NpdGlvbkNoaWxkKHBhY2tlZFBvc2l0aW9uKSkKLSAgICAgICAgICAgICAgICAgICAgLm5hbWU7Ci0gICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBFeHBhbmRhYmxlTGlzdFZpZXcuUEFDS0VEX1BPU0lUSU9OX1RZUEVfR1JPVVApIHsKLSAgICAgICAgICAgIHJldHVybiBtR3JvdXBzLmdldChFeHBhbmRhYmxlTGlzdFZpZXcuZ2V0UGFja2VkUG9zaXRpb25Hcm91cChwYWNrZWRQb3NpdGlvbikpCi0gICAgICAgICAgICAgICAgICAgIC5uYW1lOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigicGFja2VkUG9zaXRpb24gaXMgbm90IGEgdmFsaWQgcG9zaXRpb24uIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXaGV0aGVyIGEgcGFydGljdWxhciBwb3NpdGlvbiBpcyBvdXQgb2YgYm91bmRzLgotICAgICAqIAotICAgICAqIEBwYXJhbSBwYWNrZWRQb3NpdGlvbiBUaGUgcGFja2VkIHBvc2l0aW9uLgotICAgICAqIEByZXR1cm4gV2hldGhlciBpdCdzIG91dCBvZiBib3VuZHMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzT3V0T2ZCb3VuZHMobG9uZyBwYWNrZWRQb3NpdGlvbikgewotICAgICAgICBmaW5hbCBpbnQgdHlwZSA9IEV4cGFuZGFibGVMaXN0Vmlldy5nZXRQYWNrZWRQb3NpdGlvblR5cGUocGFja2VkUG9zaXRpb24pOwotICAgICAgICAKLSAgICAgICAgaWYgKHR5cGUgPT0gRXhwYW5kYWJsZUxpc3RWaWV3LlBBQ0tFRF9QT1NJVElPTl9UWVBFX05VTEwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInBhY2tlZFBvc2l0aW9uIGlzIG5vdCBhIHZhbGlkIHBvc2l0aW9uLiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgaW50IGdyb3VwID0gRXhwYW5kYWJsZUxpc3RWaWV3LmdldFBhY2tlZFBvc2l0aW9uR3JvdXAocGFja2VkUG9zaXRpb24pOyAKLSAgICAgICAgaWYgKGdyb3VwID49IG1Hcm91cHMuc2l6ZSgpIHx8IGdyb3VwIDwgMCkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmICh0eXBlID09IEV4cGFuZGFibGVMaXN0Vmlldy5QQUNLRURfUE9TSVRJT05fVFlQRV9DSElMRCkgewotICAgICAgICAgICAgZmluYWwgaW50IGNoaWxkID0gRXhwYW5kYWJsZUxpc3RWaWV3LmdldFBhY2tlZFBvc2l0aW9uQ2hpbGQocGFja2VkUG9zaXRpb24pOyAKLSAgICAgICAgICAgIGlmIChjaGlsZCA+PSBtR3JvdXBzLmdldChncm91cCkuY2hpbGRyZW4uc2l6ZSgpIHx8IGNoaWxkIDwgMCkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEdldHMgYSB2aWV3IGZvciB0aGUgcGFja2VkIHBvc2l0aW9uLCBwb3NzaWJseSByZXVzaW5nIHRoZSBjb252ZXJ0Vmlldy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcGFja2VkUG9zaXRpb24gVGhlIHBvc2l0aW9uIHRvIGdldCBhIHZpZXcgZm9yLgotICAgICAqIEBwYXJhbSBjb252ZXJ0VmlldyBPcHRpb25hbCB2aWV3IHRvIGNvbnZlcnQuCi0gICAgICogQHBhcmFtIHBhcmVudCBUaGUgZnV0dXJlIHBhcmVudC4KLSAgICAgKiBAcmV0dXJuIEEgdmlldy4KLSAgICAgKi8KLSAgICBwcml2YXRlIFZpZXcgZ2V0Vmlldyhsb25nIHBhY2tlZFBvc2l0aW9uLCBWaWV3IGNvbnZlcnRWaWV3LCBWaWV3R3JvdXAgcGFyZW50KSB7Ci0gICAgICAgIGlmIChpc091dE9mQm91bmRzKHBhY2tlZFBvc2l0aW9uKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigicG9zaXRpb24gb3V0IG9mIHJhbmdlIGZvciBhZGFwdGVyISIpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBFeHBhbmRhYmxlTGlzdFZpZXcgZWx2ID0gZ2V0RXhwYW5kYWJsZUxpc3RWaWV3KCk7Ci0gICAgICAgIGZpbmFsIGludCBmbFBvcyA9IGVsdi5nZXRGbGF0TGlzdFBvc2l0aW9uKHBhY2tlZFBvc2l0aW9uKTsgCi0gICAgICAgIAotICAgICAgICBpZiAoY29udmVydFZpZXcgIT0gbnVsbCkgewotICAgICAgICAgICAgKChUZXh0VmlldykgY29udmVydFZpZXcpLnNldFRleHQoZ2V0VmFsdWVBdFBvc2l0aW9uKHBhY2tlZFBvc2l0aW9uKSk7Ci0gICAgICAgICAgICBjb252ZXJ0Vmlldy5zZXRJZChmbFBvcyk7Ci0gICAgICAgICAgICByZXR1cm4gY29udmVydFZpZXc7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgZGVzaXJlZEhlaWdodCA9IGdldEhlaWdodEZvclBvc2l0aW9uKGZsUG9zKTsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZVZpZXcocGFja2VkUG9zaXRpb24sIGZsUG9zLCBwYXJlbnQsIGRlc2lyZWRIZWlnaHQpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSB2aWV3IGZvciBhIGdyb3VwIG9yIGNoaWxkIHBvc2l0aW9uLgotICAgICAqIAotICAgICAqIEBwYXJhbSBwYWNrZWRQb3NpdGlvbiBUaGUgcGFja2VkIHBvc2l0aW9uIChoYXMgdHlwZSwgZ3JvdXAgcG9zLCBhbmQgb3B0aW9uYWxseSBjaGlsZCBwb3MpLgotICAgICAqIEBwYXJhbSBmbFBvcyBUaGUgZmxhdCBsaXN0IHBvc2l0aW9uICh0aGUgcG9zaXRpb24gdGhhdCB0aGUgTGlzdFZpZXcgZ29lcyBieSkuCi0gICAgICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IHZpZXcuCi0gICAgICogQHBhcmFtIGRlc2lyZWRIZWlnaHQgVGhlIGRlc2lyZWQgaGVpZ2h0LgotICAgICAqIEByZXR1cm4gQSB2aWV3LgotICAgICAqLwotICAgIHByb3RlY3RlZCBWaWV3IGNyZWF0ZVZpZXcobG9uZyBwYWNrZWRQb3NpdGlvbiwgaW50IGZsUG9zLCBWaWV3R3JvdXAgcGFyZW50LCBpbnQgZGVzaXJlZEhlaWdodCkgewotICAgICAgICBUZXh0VmlldyByZXN1bHQgPSBuZXcgVGV4dFZpZXcocGFyZW50LmdldENvbnRleHQoKSk7Ci0gICAgICAgIHJlc3VsdC5zZXRIZWlnaHQoZGVzaXJlZEhlaWdodCk7Ci0gICAgICAgIHJlc3VsdC5zZXRUZXh0KGdldFZhbHVlQXRQb3NpdGlvbihwYWNrZWRQb3NpdGlvbikpOwotICAgICAgICBmaW5hbCBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zIGxwID0gbmV3IEFic0xpc3RWaWV3LkxheW91dFBhcmFtcygKLSAgICAgICAgICAgICAgICBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCwKLSAgICAgICAgICAgICAgICBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCk7Ci0gICAgICAgIHJlc3VsdC5zZXRMYXlvdXRQYXJhbXMobHApOwotICAgICAgICByZXN1bHQuc2V0R3Jhdml0eShHcmF2aXR5LkNFTlRFUl9WRVJUSUNBTCk7Ci0gICAgICAgIHJlc3VsdC5zZXRQYWRkaW5nKDM2LCAwLCAwLCAwKTsKLSAgICAgICAgcmVzdWx0LnNldElkKGZsUG9zKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIGdyb3VwIGluZGV4IGNvbnRhaW5pbmcgZWl0aGVyIHRoZSBudW1iZXIgb2YgY2hpbGRyZW4gb3IgYXQKLSAgICAgKiBsZWFzdCBvbmUgY2hpbGQuCi0gICAgICogCi0gICAgICogQHBhcmFtIG51bUNoaWxkcmVuIFRoZSBncm91cCBtdXN0IGhhdmUgdGhpcyBhbW91bnQsIG9yIC0xIGlmIHVzaW5nCi0gICAgICogICAgICAgICAgICBhdExlYXN0T25lQ2hpbGQuCi0gICAgICogQHBhcmFtIGF0TGVhc3RPbmVDaGlsZCBUaGUgZ3JvdXAgbXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBjaGlsZCwgb3IgZmFsc2UKLSAgICAgKiAgICAgICAgICAgIGlmIHVzaW5nIG51bUNoaWxkcmVuLgotICAgICAqIEByZXR1cm4gQSBncm91cCBpbmRleCB3aXRoIHRoZSByZXF1aXJlbWVudHMuCi0gICAgICovCi0gICAgcHVibGljIGludCBmaW5kR3JvdXBXaXRoTnVtQ2hpbGRyZW4oaW50IG51bUNoaWxkcmVuLCBib29sZWFuIGF0TGVhc3RPbmVDaGlsZCkgewotICAgICAgICBmaW5hbCBFeHBhbmRhYmxlTGlzdEFkYXB0ZXIgYWRhcHRlciA9IG1BZGFwdGVyOwotICAgICAgICAKLSAgICAgICAgZm9yIChpbnQgaSA9IGFkYXB0ZXIuZ2V0R3JvdXBDb3VudCgpIC0gMTsgaSA+PSAwOyBpLS0pIHsKLSAgICAgICAgICAgIGZpbmFsIGludCBjdXJOdW1DaGlsZHJlbiA9IGFkYXB0ZXIuZ2V0Q2hpbGRyZW5Db3VudChpKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKG51bUNoaWxkcmVuID09IGN1ck51bUNoaWxkcmVuIHx8IGF0TGVhc3RPbmVDaGlsZCAmJiBjdXJOdW1DaGlsZHJlbiA+IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gaTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgTGlzdDxNeUdyb3VwPiBnZXRHcm91cHMoKSB7Ci0gICAgICAgIHJldHVybiBtR3JvdXBzOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgRXhwYW5kYWJsZUxpc3RBZGFwdGVyIGdldEFkYXB0ZXIoKSB7Ci0gICAgICAgIHJldHVybiBtQWRhcHRlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTaW1wbGUgZXhwYW5kYWJsZSBsaXN0IGFkYXB0ZXIuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGNsYXNzIE15QWRhcHRlciBleHRlbmRzIEJhc2VFeHBhbmRhYmxlTGlzdEFkYXB0ZXIgewotICAgICAgICBwdWJsaWMgT2JqZWN0IGdldENoaWxkKGludCBncm91cFBvc2l0aW9uLCBpbnQgY2hpbGRQb3NpdGlvbikgewotICAgICAgICAgICAgcmV0dXJuIGdldFZhbHVlQXRQb3NpdGlvbihFeHBhbmRhYmxlTGlzdFZpZXcuZ2V0UGFja2VkUG9zaXRpb25Gb3JDaGlsZChncm91cFBvc2l0aW9uLAotICAgICAgICAgICAgICAgICAgICBjaGlsZFBvc2l0aW9uKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgbG9uZyBnZXRDaGlsZElkKGludCBncm91cFBvc2l0aW9uLCBpbnQgY2hpbGRQb3NpdGlvbikgewotICAgICAgICAgICAgcmV0dXJuIG1Hcm91cHMuZ2V0KGdyb3VwUG9zaXRpb24pLmNoaWxkcmVuLmdldChjaGlsZFBvc2l0aW9uKS5pZDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0Q2hpbGRyZW5Db3VudChpbnQgZ3JvdXBQb3NpdGlvbikgewotICAgICAgICAgICAgcmV0dXJuIG1Hcm91cHMuZ2V0KGdyb3VwUG9zaXRpb24pLmNoaWxkcmVuLnNpemUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBWaWV3IGdldENoaWxkVmlldyhpbnQgZ3JvdXBQb3NpdGlvbiwgaW50IGNoaWxkUG9zaXRpb24sIGJvb2xlYW4gaXNMYXN0Q2hpbGQsCi0gICAgICAgICAgICAgICAgVmlldyBjb252ZXJ0VmlldywgVmlld0dyb3VwIHBhcmVudCkgewotICAgICAgICAgICAgcmV0dXJuIGdldFZpZXcoRXhwYW5kYWJsZUxpc3RWaWV3LmdldFBhY2tlZFBvc2l0aW9uRm9yQ2hpbGQoZ3JvdXBQb3NpdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgY2hpbGRQb3NpdGlvbiksIGNvbnZlcnRWaWV3LCBwYXJlbnQpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIE9iamVjdCBnZXRHcm91cChpbnQgZ3JvdXBQb3NpdGlvbikgewotICAgICAgICAgICAgcmV0dXJuIGdldFZhbHVlQXRQb3NpdGlvbihFeHBhbmRhYmxlTGlzdFZpZXcuZ2V0UGFja2VkUG9zaXRpb25Gb3JHcm91cChncm91cFBvc2l0aW9uKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgaW50IGdldEdyb3VwQ291bnQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUdyb3Vwcy5zaXplKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgbG9uZyBnZXRHcm91cElkKGludCBncm91cFBvc2l0aW9uKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUdyb3Vwcy5nZXQoZ3JvdXBQb3NpdGlvbikuaWQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgVmlldyBnZXRHcm91cFZpZXcoaW50IGdyb3VwUG9zaXRpb24sIGJvb2xlYW4gaXNFeHBhbmRlZCwgVmlldyBjb252ZXJ0VmlldywKLSAgICAgICAgICAgICAgICBWaWV3R3JvdXAgcGFyZW50KSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0VmlldyhFeHBhbmRhYmxlTGlzdFZpZXcuZ2V0UGFja2VkUG9zaXRpb25Gb3JHcm91cChncm91cFBvc2l0aW9uKSwKLSAgICAgICAgICAgICAgICAgICAgY29udmVydFZpZXcsIHBhcmVudCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0NoaWxkU2VsZWN0YWJsZShpbnQgZ3JvdXBQb3NpdGlvbiwgaW50IGNoaWxkUG9zaXRpb24pIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzU3RhYmxlSWRzKCkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBNeUdyb3VwIHsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgbG9uZyBtTmV4dElkID0gMTAwMDsKLSAgICAgICAgCi0gICAgICAgIFN0cmluZyBuYW1lOwotICAgICAgICBsb25nIGlkID0gbU5leHRJZCsrOwotICAgICAgICBMaXN0PE15Q2hpbGQ+IGNoaWxkcmVuOwotICAgICAgICAKLSAgICAgICAgcHVibGljIE15R3JvdXAoaW50IG51bUNoaWxkcmVuKSB7Ci0gICAgICAgICAgICBuYW1lID0gIkdyb3VwICIgKyBpZDsKLSAgICAgICAgICAgIGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdDxNeUNoaWxkPihudW1DaGlsZHJlbik7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUNoaWxkcmVuOyBpKyspIHsKLSAgICAgICAgICAgICAgICBjaGlsZHJlbi5hZGQobmV3IE15Q2hpbGQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBNeUNoaWxkIHsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgbG9uZyBtTmV4dElkID0gMjAwMDsKLSAgICAgICAgCi0gICAgICAgIFN0cmluZyBuYW1lOwotICAgICAgICBsb25nIGlkID0gbU5leHRJZCsrOwotICAgICAgICAKLSAgICAgICAgcHVibGljIE15Q2hpbGQoKSB7Ci0gICAgICAgICAgICBuYW1lID0gIkNoaWxkICIgKyBpZDsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgZmluYWwgdm9pZCBpbml0KFBhcmFtcyBwYXJhbXMpIHsKLSAgICAgICAgaW5pdCgoRXhwYW5kYWJsZVBhcmFtcykgcGFyYW1zKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIExpc3RTY2VuYXJpbyNpbml0Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgaW5pdChFeHBhbmRhYmxlUGFyYW1zIHBhcmFtcyk7Ci19CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC91dGlsL1BhdHRlcm5zVGVzdC5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvdXRpbC9QYXR0ZXJuc1Rlc3QuamF2YQppbmRleCBiOTBjOTdiLi5hYWQzZmUxIDEwMDY0NAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC91dGlsL1BhdHRlcm5zVGVzdC5qYXZhCisrKyBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3V0aWwvUGF0dGVybnNUZXN0LmphdmEKQEAgLTY4LDYgKzY4LDEzIEBACiAgICAgICAgIHQgPSBQYXR0ZXJucy5XRUJfVVJMLm1hdGNoZXIoInhuLS1mc3F1MDBhLnhuLS0wendtNTZkIikubWF0Y2hlcygpOwogICAgICAgICBhc3NlcnRUcnVlKCJWYWxpZCBVUkwiLCB0KTsKIAorICAgICAgICAvLyBVcmwgZm9yIHRlc3RpbmcgdG9wIGxldmVsIEFyYWJpYyBjb3VudHJ5IGNvZGUgZG9tYWluIGluIFB1bnljb2RlOgorICAgICAgICAvLyAgIGh0dHA6Ly94bi0tNGdicmltLnhuLS0tLXJtY2tiYmFqbGM2ZGo3YnhuZTJjLnhuLS13Z2JoMWMvYXIvZGVmYXVsdC5hc3B4CisgICAgICAgIHQgPSBQYXR0ZXJucy5XRUJfVVJMLm1hdGNoZXIoImh0dHA6Ly94bi0tNGdicmltLnhuLS0tLXJtY2tiYmFqbGM2ZGo3YnhuZTJjLnhuLS13Z2JoMWMvYXIvZGVmYXVsdC5hc3B4IikubWF0Y2hlcygpOworICAgICAgICBhc3NlcnRUcnVlKCJWYWxpZCBVUkwiLCB0KTsKKyAgICAgICAgdCA9IFBhdHRlcm5zLldFQl9VUkwubWF0Y2hlcigieG4tLTRnYnJpbS54bi0tLS1ybWNrYmJhamxjNmRqN2J4bmUyYy54bi0td2diaDFjL2FyL2RlZmF1bHQuYXNweCIpLm1hdGNoZXMoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiVmFsaWQgVVJMIiwgdCk7CisKICAgICAgICAgLy8gSW50ZXJuYXRpb25hbGl6ZWQgVVJMLgogICAgICAgICB0ID0gUGF0dGVybnMuV0VCX1VSTC5tYXRjaGVyKCJodHRwOi8vXHVENjA0XHVBRTA4XHVDNjAxXHVDMjE4XHVDOTlELmtyIikubWF0Y2hlcygpOwogICAgICAgICBhc3NlcnRUcnVlKCJWYWxpZCBVUkwiLCB0KTsKQEAgLTEwOSw3ICsxMTYsNyBAQAogICAgICAgICB0ID0gUGF0dGVybnMuRE9NQUlOX05BTUUubWF0Y2hlcigibWFpbC5leGFtcGxlLmNvbSIpLm1hdGNoZXMoKTsKICAgICAgICAgYXNzZXJ0VHJ1ZSgiVmFsaWQgZG9tYWluIiwgdCk7CiAKLSAgICAgICAgdCA9IFBhdHRlcm5zLldFQl9VUkwubWF0Y2hlcigiZ29vZ2xlLm1lIikubWF0Y2hlcygpOworICAgICAgICB0ID0gUGF0dGVybnMuRE9NQUlOX05BTUUubWF0Y2hlcigiZ29vZ2xlLm1lIikubWF0Y2hlcygpOwogICAgICAgICBhc3NlcnRUcnVlKCJWYWxpZCBkb21haW4iLCB0KTsKIAogICAgICAgICAvLyBJbnRlcm5hdGlvbmFsaXplZCBkb21haW5zLgpAQCAtMTE4LDYgKzEyNSwxNCBAQAogCiAgICAgICAgIHQgPSBQYXR0ZXJucy5ET01BSU5fTkFNRS5tYXRjaGVyKCJfXysmNDIueGVyIikubWF0Y2hlcygpOwogICAgICAgICBhc3NlcnRGYWxzZSgiSW52YWxpZCBkb21haW4iLCB0KTsKKworICAgICAgICAvLyBPYnNvbGV0ZSBkb21haW4gLnl1CisgICAgICAgIHQgPSBQYXR0ZXJucy5ET01BSU5fTkFNRS5tYXRjaGVyKCJ0ZXN0Lnl1IikubWF0Y2hlcygpOworICAgICAgICBhc3NlcnRGYWxzZSgiT2Jzb2xldGUgY291bnRyeSBjb2RlIHRvcCBsZXZlbCBkb21haW4iLCB0KTsKKworICAgICAgICAvLyBUZXN0aW5nIHRvcCBsZXZlbCBBcmFiaWMgY291bnRyeSBjb2RlIGRvbWFpbiBpbiBQdW55Y29kZToKKyAgICAgICAgdCA9IFBhdHRlcm5zLkRPTUFJTl9OQU1FLm1hdGNoZXIoInhuLS00Z2JyaW0ueG4tLS0tcm1ja2JiYWpsYzZkajdieG5lMmMueG4tLXdnYmgxYyIpLm1hdGNoZXMoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiVmFsaWQgZG9tYWluIiwgdCk7CiAgICAgfQogCiAgICAgQFNtYWxsVGVzdApkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvd2Via2l0L1pvb21NYW5hZ2VyVGVzdC5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvd2Via2l0L1pvb21NYW5hZ2VyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjOWRlZmUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC93ZWJraXQvWm9vbU1hbmFnZXJUZXN0LmphdmEKQEAgLTAsMCArMSwxMjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBhbmRyb2lkLndlYmtpdDsKKworaW1wb3J0IGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2U7CisKK3B1YmxpYyBjbGFzcyBab29tTWFuYWdlclRlc3QgZXh0ZW5kcyBBbmRyb2lkVGVzdENhc2UgeworCisgICAgcHJpdmF0ZSBab29tTWFuYWdlciB6b29tTWFuYWdlcjsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworICAgICAgICBXZWJWaWV3IHdlYlZpZXcgPSBuZXcgV2ViVmlldyh0aGlzLmdldENvbnRleHQoKSk7CisgICAgICAgIENhbGxiYWNrUHJveHkgY2FsbGJhY2tQcm94eSA9IG5ldyBDYWxsYmFja1Byb3h5KHRoaXMuZ2V0Q29udGV4dCgpLCB3ZWJWaWV3KTsKKyAgICAgICAgem9vbU1hbmFnZXIgPSBuZXcgWm9vbU1hbmFnZXIod2ViVmlldywgY2FsbGJhY2tQcm94eSk7CisKKyAgICAgICAgem9vbU1hbmFnZXIuaW5pdCgxLjAwZik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEluaXQoKSB7CisgICAgICAgIHRlc3RJbml0KDAuMDFmKTsKKyAgICAgICAgdGVzdEluaXQoMS4wMGYpOworICAgICAgICB0ZXN0SW5pdCgxLjI1Zik7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHRlc3RJbml0KGZsb2F0IGRlbnNpdHkpIHsKKyAgICAgICAgem9vbU1hbmFnZXIuaW5pdChkZW5zaXR5KTsKKyAgICAgICAgYWN0dWFsU2NhbGVUZXN0KGRlbnNpdHkpOworICAgICAgICBkZWZhdWx0U2NhbGVUZXN0KGRlbnNpdHkpOworICAgICAgICBhc3NlcnRFcXVhbHMoem9vbU1hbmFnZXIuZ2V0RGVmYXVsdE1heFpvb21TY2FsZSgpLCB6b29tTWFuYWdlci5nZXRNYXhab29tU2NhbGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyh6b29tTWFuYWdlci5nZXREZWZhdWx0TWluWm9vbVNjYWxlKCksIHpvb21NYW5hZ2VyLmdldE1pblpvb21TY2FsZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGRlbnNpdHksIHpvb21NYW5hZ2VyLmdldFRleHRXcmFwU2NhbGUoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFVwZGF0ZURlZmF1bHRab29tRGVuc2l0eSgpIHsKKyAgICAgICAgLy8gdGVzdCB0aGUgYmFzaWMgY2FzZSB3aGVyZSB0aGUgYWN0dWFsIHZhbHVlcyBhcmUgZXF1YWwgdG8gdGhlIGRlZmF1bHRzCisgICAgICAgIHRlc3RVcGRhdGVEZWZhdWx0Wm9vbURlbnNpdHkoMC4wMWYpOworICAgICAgICB0ZXN0VXBkYXRlRGVmYXVsdFpvb21EZW5zaXR5KDEuMDBmKTsKKyAgICAgICAgdGVzdFVwZGF0ZURlZmF1bHRab29tRGVuc2l0eSgxLjI1Zik7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHRlc3RVcGRhdGVEZWZhdWx0Wm9vbURlbnNpdHkoZmxvYXQgZGVuc2l0eSkgeworICAgICAgICB6b29tTWFuYWdlci51cGRhdGVEZWZhdWx0Wm9vbURlbnNpdHkoZGVuc2l0eSk7CisgICAgICAgIGRlZmF1bHRTY2FsZVRlc3QoZGVuc2l0eSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFVwZGF0ZURlZmF1bHRab29tRGVuc2l0eVdpdGhTbWFsbE1pblpvb20oKSB7CisgICAgICAgIC8vIHRlc3QgdGhlIGNhc2Ugd2hlcmUgdGhlIG1pblpvb21TY2FsZSBoYXMgY2hhbmdlZCB0byBiZSA8IHRoZSBkZWZhdWx0CisgICAgICAgIGZsb2F0IG5ld0RlZmF1bHRTY2FsZSA9IDEuNTBmOworICAgICAgICBmbG9hdCBtaW5ab29tU2NhbGUgPSBab29tTWFuYWdlci5ERUZBVUxUX01JTl9aT09NX1NDQUxFX0ZBQ1RPUiAqIG5ld0RlZmF1bHRTY2FsZTsKKyAgICAgICAgV2ViVmlld0NvcmUuVmlld1N0YXRlIG1pblZpZXdTdGF0ZSA9IG5ldyBXZWJWaWV3Q29yZS5WaWV3U3RhdGUoKTsKKyAgICAgICAgbWluVmlld1N0YXRlLm1NaW5TY2FsZSA9IG1pblpvb21TY2FsZSAtIDAuMWY7CisgICAgICAgIHpvb21NYW5hZ2VyLnVwZGF0ZVpvb21SYW5nZShtaW5WaWV3U3RhdGUsIDAsIDApOworICAgICAgICB6b29tTWFuYWdlci51cGRhdGVEZWZhdWx0Wm9vbURlbnNpdHkobmV3RGVmYXVsdFNjYWxlKTsKKyAgICAgICAgZGVmYXVsdFNjYWxlVGVzdChuZXdEZWZhdWx0U2NhbGUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RVcGRhdGVEZWZhdWx0Wm9vbURlbnNpdHlXaXRoTGFyZ2VNaW5ab29tKCkgeworICAgICAgICAvLyB0ZXN0IHRoZSBjYXNlIHdoZXJlIHRoZSBtaW5ab29tU2NhbGUgaGFzIGNoYW5nZWQgdG8gYmUgPiB0aGUgZGVmYXVsdAorICAgICAgICBmbG9hdCBuZXdEZWZhdWx0U2NhbGUgPSAxLjUwZjsKKyAgICAgICAgZmxvYXQgbWluWm9vbVNjYWxlID0gWm9vbU1hbmFnZXIuREVGQVVMVF9NSU5fWk9PTV9TQ0FMRV9GQUNUT1IgKiBuZXdEZWZhdWx0U2NhbGU7CisgICAgICAgIFdlYlZpZXdDb3JlLlZpZXdTdGF0ZSBtaW5WaWV3U3RhdGUgPSBuZXcgV2ViVmlld0NvcmUuVmlld1N0YXRlKCk7CisgICAgICAgIG1pblZpZXdTdGF0ZS5tTWluU2NhbGUgPSBtaW5ab29tU2NhbGUgKyAwLjFmOworICAgICAgICB6b29tTWFuYWdlci51cGRhdGVab29tUmFuZ2UobWluVmlld1N0YXRlLCAwLCAwKTsKKyAgICAgICAgem9vbU1hbmFnZXIudXBkYXRlRGVmYXVsdFpvb21EZW5zaXR5KG5ld0RlZmF1bHRTY2FsZSk7CisgICAgICAgIGRlZmF1bHRTY2FsZVRlc3QobmV3RGVmYXVsdFNjYWxlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlRGVmYXVsdFpvb21EZW5zaXR5V2l0aFNtYWxsTWF4Wm9vbSgpIHsKKyAgICAgICAgLy8gdGVzdCB0aGUgY2FzZSB3aGVyZSB0aGUgbWF4Wm9vbVNjYWxlIGhhcyBjaGFuZ2VkIHRvIGJlIDwgdGhlIGRlZmF1bHQKKyAgICAgICAgZmxvYXQgbmV3RGVmYXVsdFNjYWxlID0gMS41MGY7CisgICAgICAgIGZsb2F0IG1heFpvb21TY2FsZSA9IFpvb21NYW5hZ2VyLkRFRkFVTFRfTUFYX1pPT01fU0NBTEVfRkFDVE9SICogbmV3RGVmYXVsdFNjYWxlOworICAgICAgICBXZWJWaWV3Q29yZS5WaWV3U3RhdGUgbWF4Vmlld1N0YXRlID0gbmV3IFdlYlZpZXdDb3JlLlZpZXdTdGF0ZSgpOworICAgICAgICBtYXhWaWV3U3RhdGUubU1heFNjYWxlID0gbWF4Wm9vbVNjYWxlIC0gMC4xZjsKKyAgICAgICAgem9vbU1hbmFnZXIudXBkYXRlWm9vbVJhbmdlKG1heFZpZXdTdGF0ZSwgMCwgMCk7CisgICAgICAgIHpvb21NYW5hZ2VyLnVwZGF0ZURlZmF1bHRab29tRGVuc2l0eShuZXdEZWZhdWx0U2NhbGUpOworICAgICAgICBkZWZhdWx0U2NhbGVUZXN0KG5ld0RlZmF1bHRTY2FsZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFVwZGF0ZURlZmF1bHRab29tRGVuc2l0eVdpdGhMYXJnZU1heFpvb20oKSB7CisgICAgICAgIC8vIHRlc3QgdGhlIGNhc2Ugd2hlcmUgdGhlIG1heFpvb21TY2FsZSBoYXMgY2hhbmdlZCB0byBiZSA+IHRoZSBkZWZhdWx0CisgICAgICAgIGZsb2F0IG5ld0RlZmF1bHRTY2FsZSA9IDEuNTBmOworICAgICAgICBmbG9hdCBtYXhab29tU2NhbGUgPSBab29tTWFuYWdlci5ERUZBVUxUX01BWF9aT09NX1NDQUxFX0ZBQ1RPUiAqIG5ld0RlZmF1bHRTY2FsZTsKKyAgICAgICAgV2ViVmlld0NvcmUuVmlld1N0YXRlIG1heFZpZXdTdGF0ZSA9IG5ldyBXZWJWaWV3Q29yZS5WaWV3U3RhdGUoKTsKKyAgICAgICAgbWF4Vmlld1N0YXRlLm1NYXhTY2FsZSA9IG1heFpvb21TY2FsZSArIDAuMWY7CisgICAgICAgIHpvb21NYW5hZ2VyLnVwZGF0ZVpvb21SYW5nZShtYXhWaWV3U3RhdGUsIDAsIDApOworICAgICAgICB6b29tTWFuYWdlci51cGRhdGVEZWZhdWx0Wm9vbURlbnNpdHkobmV3RGVmYXVsdFNjYWxlKTsKKyAgICAgICAgZGVmYXVsdFNjYWxlVGVzdChuZXdEZWZhdWx0U2NhbGUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RDb21wdXRlU2NhbGVXaXRoTGltaXRzKCkgeworICAgICAgICBmaW5hbCBmbG9hdCBtYXhTY2FsZSA9IHpvb21NYW5hZ2VyLmdldE1heFpvb21TY2FsZSgpOworICAgICAgICBmaW5hbCBmbG9hdCBtaW5TY2FsZSA9IHpvb21NYW5hZ2VyLmdldE1pblpvb21TY2FsZSgpOworICAgICAgICBhc3NlcnRUcnVlKG1heFNjYWxlID4gbWluU2NhbGUpOworICAgICAgICBhc3NlcnRFcXVhbHMobWF4U2NhbGUsIHpvb21NYW5hZ2VyLmNvbXB1dGVTY2FsZVdpdGhMaW1pdHMobWF4U2NhbGUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1heFNjYWxlLCB6b29tTWFuYWdlci5jb21wdXRlU2NhbGVXaXRoTGltaXRzKG1heFNjYWxlICsgLjAxZikpOworICAgICAgICBhc3NlcnRFcXVhbHMobWluU2NhbGUsIHpvb21NYW5hZ2VyLmNvbXB1dGVTY2FsZVdpdGhMaW1pdHMobWluU2NhbGUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1pblNjYWxlLCB6b29tTWFuYWdlci5jb21wdXRlU2NhbGVXaXRoTGltaXRzKG1pblNjYWxlIC0gLjAxZikpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhY3R1YWxTY2FsZVRlc3QoZmxvYXQgYWN0dWFsU2NhbGUpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGFjdHVhbFNjYWxlLCB6b29tTWFuYWdlci5nZXRTY2FsZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEgLyBhY3R1YWxTY2FsZSwgem9vbU1hbmFnZXIuZ2V0SW52U2NhbGUoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGRlZmF1bHRTY2FsZVRlc3QoZmxvYXQgZGVmYXVsdFNjYWxlKSB7CisgICAgICAgIGZpbmFsIGZsb2F0IG1heERlZmF1bHQgPSBab29tTWFuYWdlci5ERUZBVUxUX01BWF9aT09NX1NDQUxFX0ZBQ1RPUiAqIGRlZmF1bHRTY2FsZTsKKyAgICAgICAgZmluYWwgZmxvYXQgbWluRGVmYXVsdCA9IFpvb21NYW5hZ2VyLkRFRkFVTFRfTUlOX1pPT01fU0NBTEVfRkFDVE9SICogZGVmYXVsdFNjYWxlOworICAgICAgICBhc3NlcnRFcXVhbHMoZGVmYXVsdFNjYWxlLCB6b29tTWFuYWdlci5nZXREZWZhdWx0U2NhbGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxIC8gZGVmYXVsdFNjYWxlLCB6b29tTWFuYWdlci5nZXRJbnZEZWZhdWx0U2NhbGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhtYXhEZWZhdWx0LCB6b29tTWFuYWdlci5nZXREZWZhdWx0TWF4Wm9vbVNjYWxlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMobWluRGVmYXVsdCwgem9vbU1hbmFnZXIuZ2V0RGVmYXVsdE1pblpvb21TY2FsZSgpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC93aWRnZXQvZXhwYW5kYWJsZWxpc3R2aWV3L0V4cGFuZGFibGVMaXN0QmFzaWNUZXN0LmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC93aWRnZXQvZXhwYW5kYWJsZWxpc3R2aWV3L0V4cGFuZGFibGVMaXN0QmFzaWNUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyM2I1MTYuLjAwMDAwMDAKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvd2lkZ2V0L2V4cGFuZGFibGVsaXN0dmlldy9FeHBhbmRhYmxlTGlzdEJhc2ljVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQud2lkZ2V0LmV4cGFuZGFibGVsaXN0dmlldzsKLQotaW1wb3J0IGFuZHJvaWQudGVzdC5BY3Rpdml0eUluc3RydW1lbnRhdGlvblRlc3RDYXNlMjsKLWltcG9ydCBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLmFubm90YXRpb24uTWVkaXVtVGVzdDsKLWltcG9ydCBhbmRyb2lkLnV0aWwuRXhwYW5kYWJsZUxpc3RTY2VuYXJpbzsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTGlzdFV0aWw7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkV4cGFuZGFibGVMaXN0U2NlbmFyaW8uTXlHcm91cDsKLWltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuQmFzZUV4cGFuZGFibGVMaXN0QWRhcHRlcjsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5FeHBhbmRhYmxlTGlzdEFkYXB0ZXI7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuRXhwYW5kYWJsZUxpc3RWaWV3OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLXB1YmxpYyBjbGFzcyBFeHBhbmRhYmxlTGlzdEJhc2ljVGVzdCBleHRlbmRzIEFjdGl2aXR5SW5zdHJ1bWVudGF0aW9uVGVzdENhc2UyPEV4cGFuZGFibGVMaXN0U2ltcGxlPiB7Ci0gICAgcHJpdmF0ZSBFeHBhbmRhYmxlTGlzdFNjZW5hcmlvIG1BY3Rpdml0eTsKLSAgICBwcml2YXRlIEV4cGFuZGFibGVMaXN0VmlldyBtRXhwYW5kYWJsZUxpc3RWaWV3OwotICAgIHByaXZhdGUgRXhwYW5kYWJsZUxpc3RBZGFwdGVyIG1BZGFwdGVyOwotICAgIHByaXZhdGUgTGlzdFV0aWwgbUxpc3RVdGlsOwotICAgIAotICAgIHB1YmxpYyBFeHBhbmRhYmxlTGlzdEJhc2ljVGVzdCgpIHsKLSAgICAgICAgc3VwZXIoRXhwYW5kYWJsZUxpc3RTaW1wbGUuY2xhc3MpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnNldFVwKCk7Ci0gICAgICAgIAotICAgICAgICBtQWN0aXZpdHkgPSBnZXRBY3Rpdml0eSgpOwotICAgICAgICBtRXhwYW5kYWJsZUxpc3RWaWV3ID0gbUFjdGl2aXR5LmdldEV4cGFuZGFibGVMaXN0VmlldygpOwotICAgICAgICBtQWRhcHRlciA9IG1FeHBhbmRhYmxlTGlzdFZpZXcuZ2V0RXhwYW5kYWJsZUxpc3RBZGFwdGVyKCk7Ci0gICAgICAgIG1MaXN0VXRpbCA9IG5ldyBMaXN0VXRpbChtRXhwYW5kYWJsZUxpc3RWaWV3LCBnZXRJbnN0cnVtZW50YXRpb24oKSk7Ci0gICAgfQotICAgIAotICAgIEBNZWRpdW1UZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFByZWNvbmRpdGlvbnMoKSB7Ci0gICAgICAgIGFzc2VydE5vdE51bGwobUFjdGl2aXR5KTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChtRXhwYW5kYWJsZUxpc3RWaWV3KTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBpbnQgZXhwYW5kR3JvdXAoaW50IG51bUNoaWxkcmVuLCBib29sZWFuIGF0TGVhc3RPbmVDaGlsZCkgewotICAgICAgICBmaW5hbCBpbnQgZ3JvdXBQb3MgPSBtQWN0aXZpdHkuZmluZEdyb3VwV2l0aE51bUNoaWxkcmVuKG51bUNoaWxkcmVuLCBhdExlYXN0T25lQ2hpbGQpOwotICAgICAgICBhc3NlcnRUcnVlKCJDb3VsZCBub3QgZmluZCBncm91cCB0byBleHBhbmQiLCBncm91cFBvcyA+PSAwKTsKLQotICAgICAgICBhc3NlcnRGYWxzZSgiR3JvdXAgaXMgYWxyZWFkeSBleHBhbmRlZCIsIG1FeHBhbmRhYmxlTGlzdFZpZXcuaXNHcm91cEV4cGFuZGVkKGdyb3VwUG9zKSk7Ci0gICAgICAgIG1MaXN0VXRpbC5hcnJvd1Njcm9sbFRvU2VsZWN0ZWRQb3NpdGlvbihncm91cFBvcyk7Ci0gICAgICAgIGdldEluc3RydW1lbnRhdGlvbigpLndhaXRGb3JJZGxlU3luYygpOwotICAgICAgICBzZW5kS2V5cyhLZXlFdmVudC5LRVlDT0RFX0RQQURfQ0VOVEVSKTsKLSAgICAgICAgZ2V0SW5zdHJ1bWVudGF0aW9uKCkud2FpdEZvcklkbGVTeW5jKCk7Ci0gICAgICAgIGFzc2VydFRydWUoIkdyb3VwIGRpZCBub3QgZXhwYW5kIiwgbUV4cGFuZGFibGVMaXN0Vmlldy5pc0dyb3VwRXhwYW5kZWQoZ3JvdXBQb3MpKTsKLQotICAgICAgICByZXR1cm4gZ3JvdXBQb3M7Ci0gICAgfQotCi0gICAgQE1lZGl1bVRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0RXhwYW5kR3JvdXAoKSB7Ci0gICAgICAgIGV4cGFuZEdyb3VwKC0xLCB0cnVlKTsKLSAgICB9Ci0gICAgCi0gICAgQE1lZGl1bVRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q29sbGFwc2VHcm91cCgpIHsKLSAgICAgICAgZmluYWwgaW50IGdyb3VwUG9zID0gZXhwYW5kR3JvdXAoLTEsIHRydWUpOwotICAgICAgICAKLSAgICAgICAgc2VuZEtleXMoS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0NFTlRFUik7Ci0gICAgICAgIGdldEluc3RydW1lbnRhdGlvbigpLndhaXRGb3JJZGxlU3luYygpOwotICAgICAgICBhc3NlcnRGYWxzZSgiR3JvdXAgZGlkIG5vdCBjb2xsYXBzZSIsIG1FeHBhbmRhYmxlTGlzdFZpZXcuaXNHcm91cEV4cGFuZGVkKGdyb3VwUG9zKSk7Ci0gICAgfQotICAgIAotICAgIEBNZWRpdW1UZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEV4cGFuZGVkR3JvdXBNb3ZlbWVudCgpIHsKLSAgICAgICAgLy8gRXhwYW5kIHRoZSBmaXJzdCBncm91cAotICAgICAgICBtTGlzdFV0aWwuYXJyb3dTY3JvbGxUb1NlbGVjdGVkUG9zaXRpb24oMCk7Ci0gICAgICAgIHNlbmRLZXlzKEtleUV2ZW50LktFWUNPREVfRFBBRF9DRU5URVIpOwotICAgICAgICBnZXRJbnN0cnVtZW50YXRpb24oKS53YWl0Rm9ySWRsZVN5bmMoKTsKLQotICAgICAgICAvLyBFbnN1cmUgaXQgZXhwYW5kZWQKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiR3JvdXAgZGlkIG5vdCBleHBhbmQiLCBtRXhwYW5kYWJsZUxpc3RWaWV3LmlzR3JvdXBFeHBhbmRlZCgwKSk7Ci0gICAgICAgIAotICAgICAgICAvLyBXYWl0IHVudGlsIHRoYXQncyBhbGwgZ29vZAotICAgICAgICBnZXRJbnN0cnVtZW50YXRpb24oKS53YWl0Rm9ySWRsZVN5bmMoKTsKLSAgICAgICAgCi0gICAgICAgIC8vIE1ha2Ugc3VyZSBpdCBleHBhbmRlZAotICAgICAgICBhc3NlcnRUcnVlKCJHcm91cCBkaWQgbm90IGV4cGFuZCIsIG1FeHBhbmRhYmxlTGlzdFZpZXcuaXNHcm91cEV4cGFuZGVkKDApKTsKLSAgICAgICAgCi0gICAgICAgIC8vIEluc2VydCBhIGNvbGxhcHNlZCBncm91cCBpbiBmcm9udCBvZiB0aGUgb25lIGp1c3QgZXhwYW5kZWQKLSAgICAgICAgTGlzdDxNeUdyb3VwPiBncm91cHMgPSBtQWN0aXZpdHkuZ2V0R3JvdXBzKCk7Ci0gICAgICAgIE15R3JvdXAgaW5zZXJ0ZWRHcm91cCA9IG5ldyBNeUdyb3VwKDEpOwotICAgICAgICBncm91cHMuYWRkKDAsIGluc2VydGVkR3JvdXApOwotICAgICAgICAKLSAgICAgICAgLy8gTm90aWZ5IGRhdGEgY2hhbmdlCi0gICAgICAgIGFzc2VydFRydWUoIkFkYXB0ZXIgaXMgbm90IGFuIGluc3RhbmNlIG9mIHRoZSBiYXNlIGFkYXB0ZXIiLAotICAgICAgICAgICAgICAgIG1BZGFwdGVyIGluc3RhbmNlb2YgQmFzZUV4cGFuZGFibGVMaXN0QWRhcHRlcik7Ci0gICAgICAgIGZpbmFsIEJhc2VFeHBhbmRhYmxlTGlzdEFkYXB0ZXIgYWRhcHRlciA9IChCYXNlRXhwYW5kYWJsZUxpc3RBZGFwdGVyKSBtQWRhcHRlcjsKLSAgICAgCi0gICAgICAgIG1BY3Rpdml0eS5ydW5PblVpVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICBhZGFwdGVyLm5vdGlmeURhdGFTZXRDaGFuZ2VkKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICBnZXRJbnN0cnVtZW50YXRpb24oKS53YWl0Rm9ySWRsZVN5bmMoKTsKLSAgICAgICAgCi0gICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgcmlnaHQgZ3JvdXAgaXMgZXhwYW5kZWQKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIGV4cGFuZGVkIHN0YXRlIGRpZG4ndCBzdGF5IHdpdGggdGhlIHByb3BlciBncm91cCIsCi0gICAgICAgICAgICAgICAgbUV4cGFuZGFibGVMaXN0Vmlldy5pc0dyb3VwRXhwYW5kZWQoMSkpOwotICAgICAgICBhc3NlcnRGYWxzZSgiVGhlIGV4cGFuZGVkIHN0YXRlIHdhcyBnaXZlbiB0byB0aGUgaW5zZXJ0ZWQgZ3JvdXAiLAotICAgICAgICAgICAgICAgIG1FeHBhbmRhYmxlTGlzdFZpZXcuaXNHcm91cEV4cGFuZGVkKDApKTsKLSAgICB9Ci0KLSAgICBATWVkaXVtVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RDb250ZXh0TWVudXMoKSB7Ci0gICAgICAgIEV4cGFuZGFibGVMaXN0VGVzdGVyIHRlc3RlciA9IG5ldyBFeHBhbmRhYmxlTGlzdFRlc3RlcihtRXhwYW5kYWJsZUxpc3RWaWV3LCB0aGlzKTsKLSAgICAgICAgdGVzdGVyLnRlc3RDb250ZXh0TWVudXMoKTsKLSAgICB9Ci0KLSAgICBATWVkaXVtVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RDb252ZXJ0aW9uQmV0d2VlbkZsYXRBbmRQYWNrZWQoKSB7Ci0gICAgICAgIEV4cGFuZGFibGVMaXN0VGVzdGVyIHRlc3RlciA9IG5ldyBFeHBhbmRhYmxlTGlzdFRlc3RlcihtRXhwYW5kYWJsZUxpc3RWaWV3LCB0aGlzKTsKLSAgICAgICAgdGVzdGVyLnRlc3RDb252ZXJ0aW9uQmV0d2VlbkZsYXRBbmRQYWNrZWRPbkdyb3VwcygpOwotICAgICAgICB0ZXN0ZXIudGVzdENvbnZlcnRpb25CZXR3ZWVuRmxhdEFuZFBhY2tlZE9uQ2hpbGRyZW4oKTsKLSAgICB9Ci0KLSAgICBATWVkaXVtVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RTZWxlY3RlZFBvc2l0aW9uKCkgewotICAgICAgICBFeHBhbmRhYmxlTGlzdFRlc3RlciB0ZXN0ZXIgPSBuZXcgRXhwYW5kYWJsZUxpc3RUZXN0ZXIobUV4cGFuZGFibGVMaXN0VmlldywgdGhpcyk7Ci0gICAgICAgIHRlc3Rlci50ZXN0U2VsZWN0ZWRQb3NpdGlvbk9uR3JvdXBzKCk7Ci0gICAgICAgIHRlc3Rlci50ZXN0U2VsZWN0ZWRQb3NpdGlvbk9uQ2hpbGRyZW4oKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC93aWRnZXQvZXhwYW5kYWJsZWxpc3R2aWV3L0V4cGFuZGFibGVMaXN0U2ltcGxlLmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC93aWRnZXQvZXhwYW5kYWJsZWxpc3R2aWV3L0V4cGFuZGFibGVMaXN0U2ltcGxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4ZGIyOGMuLjAwMDAwMDAKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvd2lkZ2V0L2V4cGFuZGFibGVsaXN0dmlldy9FeHBhbmRhYmxlTGlzdFNpbXBsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC53aWRnZXQuZXhwYW5kYWJsZWxpc3R2aWV3OwotCi1pbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnU7Ci1pbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnVJdGVtOwotaW1wb3J0IGFuZHJvaWQudmlldy5NZW51SXRlbS5Pbk1lbnVJdGVtQ2xpY2tMaXN0ZW5lcjsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5CYXNlRXhwYW5kYWJsZUxpc3RBZGFwdGVyOwotCi1pbXBvcnQgYW5kcm9pZC51dGlsLkV4cGFuZGFibGVMaXN0U2NlbmFyaW87Ci0KLXB1YmxpYyBjbGFzcyBFeHBhbmRhYmxlTGlzdFNpbXBsZSBleHRlbmRzIEV4cGFuZGFibGVMaXN0U2NlbmFyaW8gewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludFtdIE5VTV9DSElMRFJFTiA9IHs0LCAzLCAyLCAxLCAwfTsKLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIGluaXQoRXhwYW5kYWJsZVBhcmFtcyBwYXJhbXMpIHsKLSAgICAgICAgcGFyYW1zLnNldE51bUNoaWxkcmVuKE5VTV9DSElMRFJFTikKLSAgICAgICAgICAgICAgICAuc2V0SXRlbVNjcmVlblNpemVGYWN0b3IoMC4xNCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gb25DcmVhdGVPcHRpb25zTWVudShNZW51IG1lbnUpIHsKLQotICAgICAgICBtZW51LmFkZCgiQWRkIGl0ZW0iKS5zZXRPbk1lbnVJdGVtQ2xpY2tMaXN0ZW5lcihuZXcgT25NZW51SXRlbUNsaWNrTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBvbk1lbnVJdGVtQ2xpY2soTWVudUl0ZW0gaXRlbSkgewotICAgICAgICAgICAgICAgIG1Hcm91cHMuYWRkKDAsIG5ldyBNeUdyb3VwKDIpKTsKLSAgICAgICAgICAgICAgICAoKEJhc2VFeHBhbmRhYmxlTGlzdEFkYXB0ZXIpIG1BZGFwdGVyKS5ub3RpZnlEYXRhU2V0Q2hhbmdlZCgpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3dpZGdldC9leHBhbmRhYmxlbGlzdHZpZXcvRXhwYW5kYWJsZUxpc3RUZXN0ZXIuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3dpZGdldC9leHBhbmRhYmxlbGlzdHZpZXcvRXhwYW5kYWJsZUxpc3RUZXN0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGZiMTBmYi4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC93aWRnZXQvZXhwYW5kYWJsZWxpc3R2aWV3L0V4cGFuZGFibGVMaXN0VGVzdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC53aWRnZXQuZXhwYW5kYWJsZWxpc3R2aWV3OwotCi1pbXBvcnQgYW5kcm9pZC5hcHAuSW5zdHJ1bWVudGF0aW9uOwotaW1wb3J0IGFuZHJvaWQudGVzdC5BY3Rpdml0eUluc3RydW1lbnRhdGlvblRlc3RDYXNlMjsKLWltcG9ydCBhbmRyb2lkLnV0aWwuRXhwYW5kYWJsZUxpc3RTY2VuYXJpbzsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTGlzdFV0aWw7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkV4cGFuZGFibGVMaXN0QWRhcHRlcjsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5FeHBhbmRhYmxlTGlzdFZpZXc7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0OwotCi1wdWJsaWMgY2xhc3MgRXhwYW5kYWJsZUxpc3RUZXN0ZXIgewotICAgIHByaXZhdGUgZmluYWwgRXhwYW5kYWJsZUxpc3RWaWV3IG1FeHBhbmRhYmxlTGlzdFZpZXc7Ci0gICAgcHJpdmF0ZSBmaW5hbCBFeHBhbmRhYmxlTGlzdEFkYXB0ZXIgbUFkYXB0ZXI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBMaXN0VXRpbCBtTGlzdFV0aWw7Ci0KLSAgICBwcml2YXRlIGZpbmFsIEFjdGl2aXR5SW5zdHJ1bWVudGF0aW9uVGVzdENhc2UyPD8gZXh0ZW5kcyBFeHBhbmRhYmxlTGlzdFNjZW5hcmlvPgotICAgICAgICBtQWN0aXZpdHlJbnN0cnVtZW50YXRpb247Ci0KLSAgICBJbnN0cnVtZW50YXRpb24gbUluc3RydW1lbnRhdGlvbjsKLQotICAgIHB1YmxpYyBFeHBhbmRhYmxlTGlzdFRlc3RlcigKLSAgICAgICAgICAgIEV4cGFuZGFibGVMaXN0VmlldyBleHBhbmRhYmxlTGlzdFZpZXcsCi0gICAgICAgICAgICBBY3Rpdml0eUluc3RydW1lbnRhdGlvblRlc3RDYXNlMjw/IGV4dGVuZHMgRXhwYW5kYWJsZUxpc3RTY2VuYXJpbz4KLSAgICAgICAgICAgIGFjdGl2aXR5SW5zdHJ1bWVudGF0aW9uKSB7Ci0gICAgICAgIG1FeHBhbmRhYmxlTGlzdFZpZXcgPSBleHBhbmRhYmxlTGlzdFZpZXc7Ci0gICAgICAgIEluc3RydW1lbnRhdGlvbiBpbnN0cnVtZW50YXRpb24gPSBhY3Rpdml0eUluc3RydW1lbnRhdGlvbi5nZXRJbnN0cnVtZW50YXRpb24oKTsKLSAgICAgICAgbUxpc3RVdGlsID0gbmV3IExpc3RVdGlsKG1FeHBhbmRhYmxlTGlzdFZpZXcsIGluc3RydW1lbnRhdGlvbik7Ci0gICAgICAgIG1BZGFwdGVyID0gbUV4cGFuZGFibGVMaXN0Vmlldy5nZXRFeHBhbmRhYmxlTGlzdEFkYXB0ZXIoKTsKLSAgICAgICAgbUFjdGl2aXR5SW5zdHJ1bWVudGF0aW9uID0gYWN0aXZpdHlJbnN0cnVtZW50YXRpb247Ci0gICAgICAgIG1JbnN0cnVtZW50YXRpb24gPSBtQWN0aXZpdHlJbnN0cnVtZW50YXRpb24uZ2V0SW5zdHJ1bWVudGF0aW9uKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGV4cGFuZEdyb3VwKGZpbmFsIGludCBncm91cEluZGV4LCBpbnQgZmxhdFBvc2l0aW9uKSB7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRGYWxzZSgiR3JvdXAgaXMgYWxyZWFkeSBleHBhbmRlZCIsIG1FeHBhbmRhYmxlTGlzdFZpZXcKLSAgICAgICAgICAgICAgICAuaXNHcm91cEV4cGFuZGVkKGdyb3VwSW5kZXgpKTsKLSAgICAgICAgbUxpc3RVdGlsLmFycm93U2Nyb2xsVG9TZWxlY3RlZFBvc2l0aW9uKGZsYXRQb3NpdGlvbik7Ci0gICAgICAgIG1JbnN0cnVtZW50YXRpb24ud2FpdEZvcklkbGVTeW5jKCk7Ci0gICAgICAgIG1BY3Rpdml0eUluc3RydW1lbnRhdGlvbi5zZW5kS2V5cyhLZXlFdmVudC5LRVlDT0RFX0RQQURfQ0VOVEVSKTsKLSAgICAgICAgbUFjdGl2aXR5SW5zdHJ1bWVudGF0aW9uLmdldEluc3RydW1lbnRhdGlvbigpLndhaXRGb3JJZGxlU3luYygpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiR3JvdXAgZGlkIG5vdCBleHBhbmQgIiArIGdyb3VwSW5kZXgsIAotICAgICAgICAgICAgICAgIG1FeHBhbmRhYmxlTGlzdFZpZXcuaXNHcm91cEV4cGFuZGVkKGdyb3VwSW5kZXgpKTsKLSAgICB9Ci0KLSAgICB2b2lkIHRlc3RDb250ZXh0TWVudXMoKSB7Ci0gICAgICAgIC8vIEFkZCBhIHBvc2l0aW9uIHRlc3RlciBDb250ZXh0TWVudSBsaXN0ZW5lciB0byB0aGUgRXhwYW5kYWJsZUxpc3RWaWV3Ci0gICAgICAgIFBvc2l0aW9uVGVzdGVyQ29udGV4dE1lbnVMaXN0ZW5lciBtZW51TGlzdGVuZXIgPSBuZXcgUG9zaXRpb25UZXN0ZXJDb250ZXh0TWVudUxpc3RlbmVyKCk7Ci0gICAgICAgIG1FeHBhbmRhYmxlTGlzdFZpZXcuc2V0T25DcmVhdGVDb250ZXh0TWVudUxpc3RlbmVyKG1lbnVMaXN0ZW5lcik7Ci0KLSAgICAgICAgaW50IGluZGV4ID0gMDsKLQotICAgICAgICAvLyBTY3JvbGxpbmcgb24gaGVhZGVyIGVsZW1lbnRzIHNob3VsZCB0cmlnZ2VyIGFuIEFkYXB0ZXJDb250ZXh0TWVudQotICAgICAgICBmb3IgKGludCBpPTA7IGk8bUV4cGFuZGFibGVMaXN0Vmlldy5nZXRIZWFkZXJWaWV3c0NvdW50KCk7IGkrKykgewotICAgICAgICAgICAgLy8gQ2hlY2sgZ3JvdXAgaW5kZXggaW4gY29udGV4dCBtZW51Ci0gICAgICAgICAgICBtZW51TGlzdGVuZXIuZXhwZWN0QWRhcHRlckNvbnRleHRNZW51KGkpOwotICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSBncm91cCBpcyB2aXNpYmxlIHNvIHRoYXQgZ2V0Q2hpbGQgZmluZHMgaXQKLSAgICAgICAgICAgIG1MaXN0VXRpbC5hcnJvd1Njcm9sbFRvU2VsZWN0ZWRQb3NpdGlvbihpbmRleCk7Ci0gICAgICAgICAgICBWaWV3IGhlYWRlckNoaWxkID0gbUV4cGFuZGFibGVMaXN0Vmlldy5nZXRDaGlsZEF0KGluZGV4Ci0gICAgICAgICAgICAgICAgICAgIC0gbUV4cGFuZGFibGVMaXN0Vmlldy5nZXRGaXJzdFZpc2libGVQb3NpdGlvbigpKTsKLSAgICAgICAgICAgIG1FeHBhbmRhYmxlTGlzdFZpZXcuc2hvd0NvbnRleHRNZW51Rm9yQ2hpbGQoaGVhZGVyQ2hpbGQpOwotICAgICAgICAgICAgbUluc3RydW1lbnRhdGlvbi53YWl0Rm9ySWRsZVN5bmMoKTsKLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnROdWxsKG1lbnVMaXN0ZW5lci5nZXRFcnJvck1lc3NhZ2UoKSwgbWVudUxpc3RlbmVyLmdldEVycm9yTWVzc2FnZSgpKTsKLSAgICAgICAgICAgIGluZGV4Kys7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgZ3JvdXBDb3VudCA9IG1BZGFwdGVyLmdldEdyb3VwQ291bnQoKTsKLSAgICAgICAgZm9yIChpbnQgZ3JvdXBJbmRleCA9IDA7IGdyb3VwSW5kZXggPCBncm91cENvdW50OyBncm91cEluZGV4KyspIHsKLQotICAgICAgICAgICAgLy8gRXhwYW5kIGdyb3VwCi0gICAgICAgICAgICBleHBhbmRHcm91cChncm91cEluZGV4LCBpbmRleCk7Ci0KLSAgICAgICAgICAgIC8vIENoZWNrIGdyb3VwIGluZGV4IGluIGNvbnRleHQgbWVudQotICAgICAgICAgICAgbWVudUxpc3RlbmVyLmV4cGVjdEdyb3VwQ29udGV4dE1lbnUoZ3JvdXBJbmRleCk7Ci0gICAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIGdyb3VwIGlzIHZpc2libGUgc28gdGhhdCBnZXRDaGlsZCBmaW5kcyBpdAotICAgICAgICAgICAgbUxpc3RVdGlsLmFycm93U2Nyb2xsVG9TZWxlY3RlZFBvc2l0aW9uKGluZGV4KTsKLSAgICAgICAgICAgIFZpZXcgZ3JvdXBDaGlsZCA9IG1FeHBhbmRhYmxlTGlzdFZpZXcuZ2V0Q2hpbGRBdChpbmRleAotICAgICAgICAgICAgICAgICAgICAtIG1FeHBhbmRhYmxlTGlzdFZpZXcuZ2V0Rmlyc3RWaXNpYmxlUG9zaXRpb24oKSk7Ci0gICAgICAgICAgICBtRXhwYW5kYWJsZUxpc3RWaWV3LnNob3dDb250ZXh0TWVudUZvckNoaWxkKGdyb3VwQ2hpbGQpOwotICAgICAgICAgICAgbUluc3RydW1lbnRhdGlvbi53YWl0Rm9ySWRsZVN5bmMoKTsKLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnROdWxsKG1lbnVMaXN0ZW5lci5nZXRFcnJvck1lc3NhZ2UoKSwgbWVudUxpc3RlbmVyLmdldEVycm9yTWVzc2FnZSgpKTsKLSAgICAgICAgICAgIGluZGV4Kys7Ci0KLSAgICAgICAgICAgIGZpbmFsIGludCBjaGlsZHJlbkNvdW50ID0gbUFkYXB0ZXIuZ2V0Q2hpbGRyZW5Db3VudChncm91cEluZGV4KTsKLSAgICAgICAgICAgIGZvciAoaW50IGNoaWxkSW5kZXggPSAwOyBjaGlsZEluZGV4IDwgY2hpbGRyZW5Db3VudDsgY2hpbGRJbmRleCsrKSB7Ci0gICAgICAgICAgICAgICAgLy8gQ2hlY2sgY2hpbGQgaW5kZXggaW4gY29udGV4dCBtZW51Ci0gICAgICAgICAgICAgICAgbUxpc3RVdGlsLmFycm93U2Nyb2xsVG9TZWxlY3RlZFBvc2l0aW9uKGluZGV4KTsKLSAgICAgICAgICAgICAgICBtZW51TGlzdGVuZXIuZXhwZWN0Q2hpbGRDb250ZXh0TWVudShncm91cEluZGV4LCBjaGlsZEluZGV4KTsKLSAgICAgICAgICAgICAgICBWaWV3IGNoaWxkID0gbUV4cGFuZGFibGVMaXN0Vmlldy5nZXRDaGlsZEF0KGluZGV4Ci0gICAgICAgICAgICAgICAgICAgICAgICAtIG1FeHBhbmRhYmxlTGlzdFZpZXcuZ2V0Rmlyc3RWaXNpYmxlUG9zaXRpb24oKSk7Ci0gICAgICAgICAgICAgICAgbUV4cGFuZGFibGVMaXN0Vmlldy5zaG93Q29udGV4dE1lbnVGb3JDaGlsZChjaGlsZCk7Ci0gICAgICAgICAgICAgICAgbUluc3RydW1lbnRhdGlvbi53YWl0Rm9ySWRsZVN5bmMoKTsKLSAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0TnVsbChtZW51TGlzdGVuZXIuZ2V0RXJyb3JNZXNzYWdlKCksIG1lbnVMaXN0ZW5lci5nZXRFcnJvck1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICAgICAgaW5kZXgrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIFNjcm9sbGluZyBvbiBmb290ZXIgZWxlbWVudHMgc2hvdWxkIHRyaWdnZXIgYW4gQWRhcHRlckNvbnRleHRNZW51Ci0gICAgICAgIGZvciAoaW50IGk9MDsgaTxtRXhwYW5kYWJsZUxpc3RWaWV3LmdldEZvb3RlclZpZXdzQ291bnQoKTsgaSsrKSB7Ci0gICAgICAgICAgICAvLyBDaGVjayBncm91cCBpbmRleCBpbiBjb250ZXh0IG1lbnUKLSAgICAgICAgICAgIG1lbnVMaXN0ZW5lci5leHBlY3RBZGFwdGVyQ29udGV4dE1lbnUoaW5kZXgpOwotICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSBncm91cCBpcyB2aXNpYmxlIHNvIHRoYXQgZ2V0Q2hpbGQgZmluZHMgaXQKLSAgICAgICAgICAgIG1MaXN0VXRpbC5hcnJvd1Njcm9sbFRvU2VsZWN0ZWRQb3NpdGlvbihpbmRleCk7Ci0gICAgICAgICAgICBWaWV3IGZvb3RlckNoaWxkID0gbUV4cGFuZGFibGVMaXN0Vmlldy5nZXRDaGlsZEF0KGluZGV4Ci0gICAgICAgICAgICAgICAgICAgIC0gbUV4cGFuZGFibGVMaXN0Vmlldy5nZXRGaXJzdFZpc2libGVQb3NpdGlvbigpKTsKLSAgICAgICAgICAgIG1FeHBhbmRhYmxlTGlzdFZpZXcuc2hvd0NvbnRleHRNZW51Rm9yQ2hpbGQoZm9vdGVyQ2hpbGQpOwotICAgICAgICAgICAgbUluc3RydW1lbnRhdGlvbi53YWl0Rm9ySWRsZVN5bmMoKTsKLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnROdWxsKG1lbnVMaXN0ZW5lci5nZXRFcnJvck1lc3NhZ2UoKSwgbWVudUxpc3RlbmVyLmdldEVycm9yTWVzc2FnZSgpKTsKLSAgICAgICAgICAgIGluZGV4Kys7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBDbGVhbnVwOiByZW1vdmUgdGhlIGxpc3RlbmVyIHdlIGFkZGVkLgotICAgICAgICBtRXhwYW5kYWJsZUxpc3RWaWV3LnNldE9uQ3JlYXRlQ29udGV4dE1lbnVMaXN0ZW5lcihudWxsKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGludCBleHBhbmRBR3JvdXAoKSB7Ci0gICAgICAgIGZpbmFsIGludCBncm91cEluZGV4ID0gMjsKLSAgICAgICAgZmluYWwgaW50IGhlYWRlckNvdW50ID0gbUV4cGFuZGFibGVMaXN0Vmlldy5nZXRIZWFkZXJWaWV3c0NvdW50KCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJOb3QgZW5vdWdoIGdyb3VwcyIsIGdyb3VwSW5kZXggPCBtQWRhcHRlci5nZXRHcm91cENvdW50KCkpOwotICAgICAgICBleHBhbmRHcm91cChncm91cEluZGV4LCBncm91cEluZGV4ICsgaGVhZGVyQ291bnQpOwotICAgICAgICByZXR1cm4gZ3JvdXBJbmRleDsKLSAgICB9Ci0KLSAgICAvLyBUaGlzIG1ldGhvZCBhc3N1bWVzIHRoYXQgTk8gZ3JvdXAgaXMgZXhwYW5kZWQgd2hlbiBjYWxsZWQKLSAgICB2b2lkIHRlc3RDb252ZXJ0aW9uQmV0d2VlbkZsYXRBbmRQYWNrZWRPbkdyb3VwcygpIHsKLSAgICAgICAgZmluYWwgaW50IGhlYWRlckNvdW50ID0gbUV4cGFuZGFibGVMaXN0Vmlldy5nZXRIZWFkZXJWaWV3c0NvdW50KCk7Ci0KLSAgICAgICAgZm9yIChpbnQgaT0wOyBpPGhlYWRlckNvdW50OyBpKyspIHsKLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIk5vbiBOVUxMIHBvc2l0aW9uIGZvciBoZWFkZXIgaXRlbSIsCi0gICAgICAgICAgICAgICAgICAgIEV4cGFuZGFibGVMaXN0Vmlldy5QQUNLRURfUE9TSVRJT05fVkFMVUVfTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgbUV4cGFuZGFibGVMaXN0Vmlldy5nZXRFeHBhbmRhYmxlTGlzdFBvc2l0aW9uKGkpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFRlc3QgYWxsIChub24gZXhwYW5kZWQpIGdyb3VwcwotICAgICAgICBmaW5hbCBpbnQgZ3JvdXBDb3VudCA9IG1BZGFwdGVyLmdldEdyb3VwQ291bnQoKTsKLSAgICAgICAgZm9yIChpbnQgZ3JvdXBJbmRleCA9IDA7IGdyb3VwSW5kZXggPCBncm91cENvdW50OyBncm91cEluZGV4KyspIHsKLSAgICAgICAgICAgIGludCBleHBlY3RlZEZsYXRQb3NpdGlvbiA9IGhlYWRlckNvdW50ICsgZ3JvdXBJbmRleDsKLSAgICAgICAgICAgIGxvbmcgcGFja2VkUG9zaXRpb25Gb3JHcm91cCA9IEV4cGFuZGFibGVMaXN0Vmlldy5nZXRQYWNrZWRQb3NpdGlvbkZvckdyb3VwKGdyb3VwSW5kZXgpOwotICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiR3JvdXAgbm90IGZvdW5kIGF0IGZsYXQgcG9zaXRpb24gIiArIGV4cGVjdGVkRmxhdFBvc2l0aW9uLAotICAgICAgICAgICAgICAgICAgICBwYWNrZWRQb3NpdGlvbkZvckdyb3VwLAotICAgICAgICAgICAgICAgICAgICBtRXhwYW5kYWJsZUxpc3RWaWV3LmdldEV4cGFuZGFibGVMaXN0UG9zaXRpb24oZXhwZWN0ZWRGbGF0UG9zaXRpb24pKTsKLQotICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiV3JvbmcgZmxhdCBwb3NpdGlvbiBmb3IgZ3JvdXAgIiArIGdyb3VwSW5kZXgsCi0gICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkRmxhdFBvc2l0aW9uLAotICAgICAgICAgICAgICAgICAgICBtRXhwYW5kYWJsZUxpc3RWaWV3LmdldEZsYXRMaXN0UG9zaXRpb24ocGFja2VkUG9zaXRpb25Gb3JHcm91cCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChpbnQgaT0wOyBpPG1FeHBhbmRhYmxlTGlzdFZpZXcuZ2V0Rm9vdGVyVmlld3NDb3VudCgpOyBpKyspIHsKLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIk5vbiBOVUxMIHBvc2l0aW9uIGZvciBoZWFkZXIgaXRlbSIsCi0gICAgICAgICAgICAgICAgICAgIEV4cGFuZGFibGVMaXN0Vmlldy5QQUNLRURfUE9TSVRJT05fVkFMVUVfTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgbUV4cGFuZGFibGVMaXN0Vmlldy5nZXRFeHBhbmRhYmxlTGlzdFBvc2l0aW9uKGhlYWRlckNvdW50ICsgZ3JvdXBDb3VudCArIGkpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIFRoaXMgbWV0aG9kIGFzc3VtZXMgdGhhdCBOTyBncm91cCBpcyBleHBhbmRlZCB3aGVuIGNhbGxlZAotICAgIHZvaWQgdGVzdENvbnZlcnRpb25CZXR3ZWVuRmxhdEFuZFBhY2tlZE9uQ2hpbGRyZW4oKSB7Ci0gICAgICAgIC8vIFRlc3Qgd2l0aCBhbiBleHBhbmRlZCBncm91cAotICAgICAgICBmaW5hbCBpbnQgaGVhZGVyQ291bnQgPSBtRXhwYW5kYWJsZUxpc3RWaWV3LmdldEhlYWRlclZpZXdzQ291bnQoKTsKLSAgICAgICAgZmluYWwgaW50IGdyb3VwSW5kZXggPSBleHBhbmRBR3JvdXAoKTsKLQotICAgICAgICBmaW5hbCBpbnQgY2hpbGRyZW5Db3VudCA9IG1BZGFwdGVyLmdldENoaWxkcmVuQ291bnQoZ3JvdXBJbmRleCk7Ci0gICAgICAgIGZvciAoaW50IGNoaWxkSW5kZXggPSAwOyBjaGlsZEluZGV4IDwgY2hpbGRyZW5Db3VudDsgY2hpbGRJbmRleCsrKSB7Ci0gICAgICAgICAgICBpbnQgZXhwZWN0ZWRGbGF0UG9zaXRpb24gPSBoZWFkZXJDb3VudCArIGdyb3VwSW5kZXggKyAxICsgY2hpbGRJbmRleDsKLSAgICAgICAgICAgIGxvbmcgY2hpbGRQb3MgPSBFeHBhbmRhYmxlTGlzdFZpZXcuZ2V0UGFja2VkUG9zaXRpb25Gb3JDaGlsZChncm91cEluZGV4LCBjaGlsZEluZGV4KTsKLQotICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiV3JvbmcgZmxhdCBwb3NpdGlvbiBmb3IgY2hpbGQgIiwKLSAgICAgICAgICAgICAgICAgICAgY2hpbGRQb3MsCi0gICAgICAgICAgICAgICAgICAgIG1FeHBhbmRhYmxlTGlzdFZpZXcuZ2V0RXhwYW5kYWJsZUxpc3RQb3NpdGlvbihleHBlY3RlZEZsYXRQb3NpdGlvbikpOwotCi0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJXcm9uZyBmbGF0IHBvc2l0aW9uIGZvciBjaGlsZCAiLAotICAgICAgICAgICAgICAgICAgICBleHBlY3RlZEZsYXRQb3NpdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgbUV4cGFuZGFibGVMaXN0Vmlldy5nZXRGbGF0TGlzdFBvc2l0aW9uKGNoaWxkUG9zKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBUaGlzIG1ldGhvZCBhc3N1bWVzIHRoYXQgTk8gZ3JvdXAgaXMgZXhwYW5kZWQgd2hlbiBjYWxsZWQKLSAgICB2b2lkIHRlc3RTZWxlY3RlZFBvc2l0aW9uT25Hcm91cHMoKSB7Ci0gICAgICAgIGludCBpbmRleCA9IDA7Ci0KLSAgICAgICAgLy8gU2Nyb2xsaW5nIG9uIGhlYWRlciBlbGVtZW50cyBzaG91bGQgbm90IGdpdmUgYSB2YWxpZCBzZWxlY3RlZCBwb3NpdGlvbi4KLSAgICAgICAgZm9yIChpbnQgaT0wOyBpPG1FeHBhbmRhYmxlTGlzdFZpZXcuZ2V0SGVhZGVyVmlld3NDb3VudCgpOyBpKyspIHsKLSAgICAgICAgICAgIG1MaXN0VXRpbC5hcnJvd1Njcm9sbFRvU2VsZWN0ZWRQb3NpdGlvbihpbmRleCk7Ci0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJIZWFkZXIgaXRlbSBpcyBzZWxlY3RlZCIsCi0gICAgICAgICAgICAgICAgICAgIEV4cGFuZGFibGVMaXN0Vmlldy5QQUNLRURfUE9TSVRJT05fVkFMVUVfTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgbUV4cGFuZGFibGVMaXN0Vmlldy5nZXRTZWxlY3RlZFBvc2l0aW9uKCkpOwotICAgICAgICAgICAgaW5kZXgrKzsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIENoZWNrIHNlbGVjdGlvbiBvbiBncm91cCBpdGVtcwotICAgICAgICBmaW5hbCBpbnQgZ3JvdXBDb3VudCA9IG1BZGFwdGVyLmdldEdyb3VwQ291bnQoKTsKLSAgICAgICAgZm9yIChpbnQgZ3JvdXBJbmRleCA9IDA7IGdyb3VwSW5kZXggPCBncm91cENvdW50OyBncm91cEluZGV4KyspIHsKLSAgICAgICAgICAgIG1MaXN0VXRpbC5hcnJvd1Njcm9sbFRvU2VsZWN0ZWRQb3NpdGlvbihpbmRleCk7Ci0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJHcm91cCBpdGVtIGlzIG5vdCBzZWxlY3RlZCIsCi0gICAgICAgICAgICAgICAgICAgIEV4cGFuZGFibGVMaXN0Vmlldy5nZXRQYWNrZWRQb3NpdGlvbkZvckdyb3VwKGdyb3VwSW5kZXgpLAotICAgICAgICAgICAgICAgICAgICBtRXhwYW5kYWJsZUxpc3RWaWV3LmdldFNlbGVjdGVkUG9zaXRpb24oKSk7Ci0gICAgICAgICAgICBpbmRleCsrOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gU2Nyb2xsaW5nIG9uIGZvb3RlciBlbGVtZW50cyBzaG91bGQgbm90IGdpdmUgYSB2YWxpZCBzZWxlY3RlZCBwb3NpdGlvbi4KLSAgICAgICAgZm9yIChpbnQgaT0wOyBpPG1FeHBhbmRhYmxlTGlzdFZpZXcuZ2V0Rm9vdGVyVmlld3NDb3VudCgpOyBpKyspIHsKLSAgICAgICAgICAgIG1MaXN0VXRpbC5hcnJvd1Njcm9sbFRvU2VsZWN0ZWRQb3NpdGlvbihpbmRleCk7Ci0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJGb290ZXIgaXRlbSBpcyBzZWxlY3RlZCIsCi0gICAgICAgICAgICAgICAgICAgIEV4cGFuZGFibGVMaXN0Vmlldy5QQUNLRURfUE9TSVRJT05fVkFMVUVfTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgbUV4cGFuZGFibGVMaXN0Vmlldy5nZXRTZWxlY3RlZFBvc2l0aW9uKCkpOwotICAgICAgICAgICAgaW5kZXgrKzsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIFRoaXMgbWV0aG9kIGFzc3VtZXMgdGhhdCBOTyBncm91cCBpcyBleHBhbmRlZCB3aGVuIGNhbGxlZAotICAgIHZvaWQgdGVzdFNlbGVjdGVkUG9zaXRpb25PbkNoaWxkcmVuKCkgewotICAgICAgICAvLyBUZXN0IHdpdGggYW4gZXhwYW5kZWQgZ3JvdXAKLSAgICAgICAgZmluYWwgaW50IGhlYWRlckNvdW50ID0gbUV4cGFuZGFibGVMaXN0Vmlldy5nZXRIZWFkZXJWaWV3c0NvdW50KCk7Ci0gICAgICAgIGZpbmFsIGludCBncm91cEluZGV4ID0gZXhwYW5kQUdyb3VwKCk7Ci0KLSAgICAgICAgZmluYWwgaW50IGNoaWxkcmVuQ291bnQgPSBtQWRhcHRlci5nZXRDaGlsZHJlbkNvdW50KGdyb3VwSW5kZXgpOwotICAgICAgICBmb3IgKGludCBjaGlsZEluZGV4ID0gMDsgY2hpbGRJbmRleCA8IGNoaWxkcmVuQ291bnQ7IGNoaWxkSW5kZXgrKykgewotICAgICAgICAgICAgaW50IGNoaWxkRmxhdFBvc2l0aW9uID0gaGVhZGVyQ291bnQgKyBncm91cEluZGV4ICsgMSArIGNoaWxkSW5kZXg7Ci0gICAgICAgICAgICBtTGlzdFV0aWwuYXJyb3dTY3JvbGxUb1NlbGVjdGVkUG9zaXRpb24oY2hpbGRGbGF0UG9zaXRpb24pOwotICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiR3JvdXAgaXRlbSBpcyBub3Qgc2VsZWN0ZWQiLAotICAgICAgICAgICAgICAgICAgICBFeHBhbmRhYmxlTGlzdFZpZXcuZ2V0UGFja2VkUG9zaXRpb25Gb3JDaGlsZChncm91cEluZGV4LCBjaGlsZEluZGV4KSwKLSAgICAgICAgICAgICAgICAgICAgbUV4cGFuZGFibGVMaXN0Vmlldy5nZXRTZWxlY3RlZFBvc2l0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvd2lkZ2V0L2V4cGFuZGFibGVsaXN0dmlldy9FeHBhbmRhYmxlTGlzdFdpdGhIZWFkZXJzLmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC93aWRnZXQvZXhwYW5kYWJsZWxpc3R2aWV3L0V4cGFuZGFibGVMaXN0V2l0aEhlYWRlcnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjI1MWMxZC4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC93aWRnZXQvZXhwYW5kYWJsZWxpc3R2aWV3L0V4cGFuZGFibGVMaXN0V2l0aEhlYWRlcnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQud2lkZ2V0LmV4cGFuZGFibGVsaXN0dmlldzsKLQotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQudXRpbC5FeHBhbmRhYmxlTGlzdFNjZW5hcmlvOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkJ1dHRvbjsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5FeHBhbmRhYmxlTGlzdFZpZXc7Ci0KLXB1YmxpYyBjbGFzcyBFeHBhbmRhYmxlTGlzdFdpdGhIZWFkZXJzIGV4dGVuZHMgRXhwYW5kYWJsZUxpc3RTY2VuYXJpbyB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50W10gc051bUNoaWxkcmVuID0gezEsIDQsIDMsIDIsIDZ9OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBzTnVtT2ZIZWFkZXJzQW5kRm9vdGVycyA9IDEyOwotICAgIAotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIGluaXQoRXhwYW5kYWJsZVBhcmFtcyBwYXJhbXMpIHsKLSAgICAgICAgcGFyYW1zLnNldFN0YWNrRnJvbUJvdHRvbShmYWxzZSkKLSAgICAgICAgICAgICAgICAuc2V0U3RhcnRpbmdTZWxlY3Rpb25Qb3NpdGlvbigtMSkKLSAgICAgICAgICAgICAgICAuc2V0TnVtQ2hpbGRyZW4oc051bUNoaWxkcmVuKQotICAgICAgICAgICAgICAgIC5zZXRJdGVtU2NyZWVuU2l6ZUZhY3RvcigwLjE0KQotICAgICAgICAgICAgICAgIC5zZXRDb25uZWN0QWRhcHRlcihmYWxzZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIGljaWNsZSkgewotICAgICAgICBzdXBlci5vbkNyZWF0ZShpY2ljbGUpOwotCi0gICAgICAgIGZpbmFsIEV4cGFuZGFibGVMaXN0VmlldyBleHBhbmRhYmxlTGlzdFZpZXcgPSBnZXRFeHBhbmRhYmxlTGlzdFZpZXcoKTsKLSAgICAgICAgZXhwYW5kYWJsZUxpc3RWaWV3LnNldEl0ZW1zQ2FuRm9jdXModHJ1ZSk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzTnVtT2ZIZWFkZXJzQW5kRm9vdGVyczsgaSsrKSB7Ci0gICAgICAgICAgICBCdXR0b24gaGVhZGVyID0gbmV3IEJ1dHRvbih0aGlzKTsKLSAgICAgICAgICAgIGhlYWRlci5zZXRUZXh0KCJIZWFkZXIgVmlldyAiICsgaSk7Ci0gICAgICAgICAgICBleHBhbmRhYmxlTGlzdFZpZXcuYWRkSGVhZGVyVmlldyhoZWFkZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzTnVtT2ZIZWFkZXJzQW5kRm9vdGVyczsgaSsrKSB7Ci0gICAgICAgICAgICBCdXR0b24gZm9vdGVyID0gbmV3IEJ1dHRvbih0aGlzKTsKLSAgICAgICAgICAgIGZvb3Rlci5zZXRUZXh0KCJGb290ZXIgVmlldyAiICsgaSk7Ci0gICAgICAgICAgICBleHBhbmRhYmxlTGlzdFZpZXcuYWRkRm9vdGVyVmlldyhmb290ZXIpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBTZXQgYWRhcHRlciBoZXJlIEFGVEVSIHdlIHNldCBoZWFkZXIgYW5kIGZvb3RlciB2aWV3cwotICAgICAgICBzZXRBZGFwdGVyKGV4cGFuZGFibGVMaXN0Vmlldyk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEByZXR1cm4gVGhlIG51bWJlciBvZiBoZWFkZXJzIChhbmQgdGhlIHNhbWUgbnVtYmVyIG9mIGZvb3RlcnMpCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXROdW1PZkhlYWRlcnNBbmRGb290ZXJzKCkgewotICAgICAgICByZXR1cm4gc051bU9mSGVhZGVyc0FuZEZvb3RlcnM7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC93aWRnZXQvZXhwYW5kYWJsZWxpc3R2aWV3L0V4cGFuZGFibGVMaXN0V2l0aEhlYWRlcnNUZXN0LmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC93aWRnZXQvZXhwYW5kYWJsZWxpc3R2aWV3L0V4cGFuZGFibGVMaXN0V2l0aEhlYWRlcnNUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0YTBmZmYuLjAwMDAwMDAKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvd2lkZ2V0L2V4cGFuZGFibGVsaXN0dmlldy9FeHBhbmRhYmxlTGlzdFdpdGhIZWFkZXJzVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC53aWRnZXQuZXhwYW5kYWJsZWxpc3R2aWV3OwotCi1pbXBvcnQgYW5kcm9pZC50ZXN0LkFjdGl2aXR5SW5zdHJ1bWVudGF0aW9uVGVzdENhc2UyOwotaW1wb3J0IGFuZHJvaWQudGVzdC5zdWl0ZWJ1aWxkZXIuYW5ub3RhdGlvbi5MYXJnZVRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC50ZXN0LnN1aXRlYnVpbGRlci5hbm5vdGF0aW9uLk1lZGl1bVRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxpc3RVdGlsOwotaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5FeHBhbmRhYmxlTGlzdFZpZXc7Ci0KLXB1YmxpYyBjbGFzcyBFeHBhbmRhYmxlTGlzdFdpdGhIZWFkZXJzVGVzdCBleHRlbmRzCi0gICAgICAgIEFjdGl2aXR5SW5zdHJ1bWVudGF0aW9uVGVzdENhc2UyPEV4cGFuZGFibGVMaXN0V2l0aEhlYWRlcnM+IHsKLSAgICBwcml2YXRlIEV4cGFuZGFibGVMaXN0VmlldyBtRXhwYW5kYWJsZUxpc3RWaWV3OwotICAgIHByaXZhdGUgTGlzdFV0aWwgbUxpc3RVdGlsOwotICAgIAotICAgIHB1YmxpYyBFeHBhbmRhYmxlTGlzdFdpdGhIZWFkZXJzVGVzdCgpIHsKLSAgICAgICAgc3VwZXIoRXhwYW5kYWJsZUxpc3RXaXRoSGVhZGVycy5jbGFzcyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuc2V0VXAoKTsKLSAgICAgICAgCi0gICAgICAgIG1FeHBhbmRhYmxlTGlzdFZpZXcgPSBnZXRBY3Rpdml0eSgpLmdldEV4cGFuZGFibGVMaXN0VmlldygpOwotICAgICAgICBtTGlzdFV0aWwgPSBuZXcgTGlzdFV0aWwobUV4cGFuZGFibGVMaXN0VmlldywgZ2V0SW5zdHJ1bWVudGF0aW9uKCkpOwotICAgIH0KLSAgICAKLSAgICBATWVkaXVtVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RQcmVjb25kaXRpb25zKCkgewotICAgICAgICBhc3NlcnROb3ROdWxsKG1FeHBhbmRhYmxlTGlzdFZpZXcpOwotICAgIH0KLSAgICAKLSAgICBATWVkaXVtVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RFeHBhbmRPbkZpcnN0UG9zaXRpb24oKSB7Ci0gICAgICAgIC8vIFNob3VsZCBiZSBhIGhlYWRlciwgYW5kIGhlbmNlIHRoZSBmaXJzdCBncm91cCBzaG91bGQgTk9UIGhhdmUgZXhwYW5kZWQKLSAgICAgICAgbUxpc3RVdGlsLmFycm93U2Nyb2xsVG9TZWxlY3RlZFBvc2l0aW9uKDApOwotICAgICAgICBzZW5kS2V5cyhLZXlFdmVudC5LRVlDT0RFX0RQQURfQ0VOVEVSKTsKLSAgICAgICAgZ2V0SW5zdHJ1bWVudGF0aW9uKCkud2FpdEZvcklkbGVTeW5jKCk7Ci0gICAgICAgIGFzc2VydEZhbHNlKG1FeHBhbmRhYmxlTGlzdFZpZXcuaXNHcm91cEV4cGFuZGVkKDApKTsKLSAgICB9Ci0KLSAgICBATGFyZ2VUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEV4cGFuZE9uRmlyc3RHcm91cCgpIHsKLSAgICAgICAgbUxpc3RVdGlsLmFycm93U2Nyb2xsVG9TZWxlY3RlZFBvc2l0aW9uKGdldEFjdGl2aXR5KCkuZ2V0TnVtT2ZIZWFkZXJzQW5kRm9vdGVycygpKTsKLSAgICAgICAgc2VuZEtleXMoS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0NFTlRFUik7Ci0gICAgICAgIGdldEluc3RydW1lbnRhdGlvbigpLndhaXRGb3JJZGxlU3luYygpOwotICAgICAgICBhc3NlcnRUcnVlKG1FeHBhbmRhYmxlTGlzdFZpZXcuaXNHcm91cEV4cGFuZGVkKDApKTsKLSAgICB9Ci0KLSAgICBATWVkaXVtVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RDb250ZXh0TWVudXMoKSB7Ci0gICAgICAgIEV4cGFuZGFibGVMaXN0VGVzdGVyIHRlc3RlciA9IG5ldyBFeHBhbmRhYmxlTGlzdFRlc3RlcihtRXhwYW5kYWJsZUxpc3RWaWV3LCB0aGlzKTsKLSAgICAgICAgdGVzdGVyLnRlc3RDb250ZXh0TWVudXMoKTsKLSAgICB9Ci0KLSAgICBATWVkaXVtVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RDb252ZXJ0aW9uQmV0d2VlbkZsYXRBbmRQYWNrZWQoKSB7Ci0gICAgICAgIEV4cGFuZGFibGVMaXN0VGVzdGVyIHRlc3RlciA9IG5ldyBFeHBhbmRhYmxlTGlzdFRlc3RlcihtRXhwYW5kYWJsZUxpc3RWaWV3LCB0aGlzKTsKLSAgICAgICAgdGVzdGVyLnRlc3RDb252ZXJ0aW9uQmV0d2VlbkZsYXRBbmRQYWNrZWRPbkdyb3VwcygpOwotICAgICAgICB0ZXN0ZXIudGVzdENvbnZlcnRpb25CZXR3ZWVuRmxhdEFuZFBhY2tlZE9uQ2hpbGRyZW4oKTsKLSAgICB9Ci0KLSAgICBATWVkaXVtVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RTZWxlY3RlZFBvc2l0aW9uKCkgewotICAgICAgICBFeHBhbmRhYmxlTGlzdFRlc3RlciB0ZXN0ZXIgPSBuZXcgRXhwYW5kYWJsZUxpc3RUZXN0ZXIobUV4cGFuZGFibGVMaXN0VmlldywgdGhpcyk7Ci0gICAgICAgIHRlc3Rlci50ZXN0U2VsZWN0ZWRQb3NpdGlvbk9uR3JvdXBzKCk7Ci0gICAgICAgIHRlc3Rlci50ZXN0U2VsZWN0ZWRQb3NpdGlvbk9uQ2hpbGRyZW4oKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC93aWRnZXQvZXhwYW5kYWJsZWxpc3R2aWV3L0luZmxhdGVkRXhwYW5kYWJsZUxpc3RWaWV3LmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC93aWRnZXQvZXhwYW5kYWJsZWxpc3R2aWV3L0luZmxhdGVkRXhwYW5kYWJsZUxpc3RWaWV3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0YzlkNTYuLjAwMDAwMDAKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvd2lkZ2V0L2V4cGFuZGFibGVsaXN0dmlldy9JbmZsYXRlZEV4cGFuZGFibGVMaXN0Vmlldy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQud2lkZ2V0LmV4cGFuZGFibGVsaXN0dmlldzsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmZyYW1ld29ya3MuY29yZXRlc3RzLlI7Ci0KLWltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLnZpZXcuR3Jhdml0eTsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkFic0xpc3RWaWV3OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkJhc2VFeHBhbmRhYmxlTGlzdEFkYXB0ZXI7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuRXhwYW5kYWJsZUxpc3RWaWV3OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OwotCi1wdWJsaWMgY2xhc3MgSW5mbGF0ZWRFeHBhbmRhYmxlTGlzdFZpZXcgZXh0ZW5kcyBBY3Rpdml0eSB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7Ci0gICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7Ci0gICAgICAgIAotICAgICAgICBzZXRDb250ZW50VmlldyhSLmxheW91dC5pbmZsYXRlZF9leHBhbmRhYmxlbGlzdHZpZXcpOwotICAgICAgICAKLSAgICAgICAgRXhwYW5kYWJsZUxpc3RWaWV3IGVsdiA9IChFeHBhbmRhYmxlTGlzdFZpZXcpIGZpbmRWaWV3QnlJZChSLmlkLmVsdik7Ci0gICAgICAgIGVsdi5zZXRBZGFwdGVyKG5ldyBNeUV4cGFuZGFibGVMaXN0QWRhcHRlcigpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgY2xhc3MgTXlFeHBhbmRhYmxlTGlzdEFkYXB0ZXIgZXh0ZW5kcyBCYXNlRXhwYW5kYWJsZUxpc3RBZGFwdGVyIHsKLSAgICAgICAgLy8gU2FtcGxlIGRhdGEgc2V0LiAgY2hpbGRyZW5baV0gY29udGFpbnMgdGhlIGNoaWxkcmVuIChTdHJpbmdbXSkgZm9yIGdyb3Vwc1tpXS4KLSAgICAgICAgcHJpdmF0ZSBTdHJpbmdbXSBncm91cHMgPSB7ICJQZW9wbGUgTmFtZXMiLCAiRG9nIE5hbWVzIiwgIkNhdCBOYW1lcyIsICJGaXNoIE5hbWVzIiB9OwotICAgICAgICBwcml2YXRlIFN0cmluZ1tdW10gY2hpbGRyZW4gPSB7Ci0gICAgICAgICAgICAgICAgeyAiQXJub2xkIiwgIkJhcnJ5IiwgIkNodWNrIiwgIkRhdmlkIiB9LAotICAgICAgICAgICAgICAgIHsgIkFjZSIsICJCYW5kaXQiLCAiQ2hhLUNoYSIsICJEZXVjZSIgfSwKLSAgICAgICAgICAgICAgICB7ICJGbHVmZnkiLCAiU251Z2dsZXMiIH0sCi0gICAgICAgICAgICAgICAgeyAiR29sZHkiLCAiQnViYmxlcyIgfQotICAgICAgICB9OwotICAgICAgICAKLSAgICAgICAgcHVibGljIE9iamVjdCBnZXRDaGlsZChpbnQgZ3JvdXBQb3NpdGlvbiwgaW50IGNoaWxkUG9zaXRpb24pIHsKLSAgICAgICAgICAgIHJldHVybiBjaGlsZHJlbltncm91cFBvc2l0aW9uXVtjaGlsZFBvc2l0aW9uXTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBsb25nIGdldENoaWxkSWQoaW50IGdyb3VwUG9zaXRpb24sIGludCBjaGlsZFBvc2l0aW9uKSB7Ci0gICAgICAgICAgICByZXR1cm4gY2hpbGRQb3NpdGlvbjsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0Q2hpbGRyZW5Db3VudChpbnQgZ3JvdXBQb3NpdGlvbikgewotICAgICAgICAgICAgcmV0dXJuIGNoaWxkcmVuW2dyb3VwUG9zaXRpb25dLmxlbmd0aDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBUZXh0VmlldyBnZXRHZW5lcmljVmlldygpIHsKLSAgICAgICAgICAgIC8vIExheW91dCBwYXJhbWV0ZXJzIGZvciB0aGUgRXhwYW5kYWJsZUxpc3RWaWV3Ci0gICAgICAgICAgICBBYnNMaXN0Vmlldy5MYXlvdXRQYXJhbXMgbHAgPSBuZXcgQWJzTGlzdFZpZXcuTGF5b3V0UGFyYW1zKAotICAgICAgICAgICAgICAgICAgICBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCwgNjQpOwotCi0gICAgICAgICAgICBUZXh0VmlldyB0ZXh0VmlldyA9IG5ldyBUZXh0VmlldyhJbmZsYXRlZEV4cGFuZGFibGVMaXN0Vmlldy50aGlzKTsKLSAgICAgICAgICAgIHRleHRWaWV3LnNldExheW91dFBhcmFtcyhscCk7Ci0gICAgICAgICAgICAvLyBDZW50ZXIgdGhlIHRleHQgdmVydGljYWxseQotICAgICAgICAgICAgdGV4dFZpZXcuc2V0R3Jhdml0eShHcmF2aXR5LkNFTlRFUl9WRVJUSUNBTCB8IEdyYXZpdHkuTEVGVCk7Ci0gICAgICAgICAgICAvLyBTZXQgdGhlIHRleHQgc3RhcnRpbmcgcG9zaXRpb24KLSAgICAgICAgICAgIHRleHRWaWV3LnNldFBhZGRpbmcoMzYsIDAsIDAsIDApOwotICAgICAgICAgICAgcmV0dXJuIHRleHRWaWV3OwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgVmlldyBnZXRDaGlsZFZpZXcoaW50IGdyb3VwUG9zaXRpb24sIGludCBjaGlsZFBvc2l0aW9uLCBib29sZWFuIGlzTGFzdENoaWxkLAotICAgICAgICAgICAgICAgIFZpZXcgY29udmVydFZpZXcsIFZpZXdHcm91cCBwYXJlbnQpIHsKLSAgICAgICAgICAgIFRleHRWaWV3IHRleHRWaWV3ID0gZ2V0R2VuZXJpY1ZpZXcoKTsKLSAgICAgICAgICAgIHRleHRWaWV3LnNldFRleHQoZ2V0Q2hpbGQoZ3JvdXBQb3NpdGlvbiwgY2hpbGRQb3NpdGlvbikudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICByZXR1cm4gdGV4dFZpZXc7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgT2JqZWN0IGdldEdyb3VwKGludCBncm91cFBvc2l0aW9uKSB7Ci0gICAgICAgICAgICByZXR1cm4gZ3JvdXBzW2dyb3VwUG9zaXRpb25dOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGludCBnZXRHcm91cENvdW50KCkgewotICAgICAgICAgICAgcmV0dXJuIGdyb3Vwcy5sZW5ndGg7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgbG9uZyBnZXRHcm91cElkKGludCBncm91cFBvc2l0aW9uKSB7Ci0gICAgICAgICAgICByZXR1cm4gZ3JvdXBQb3NpdGlvbjsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBWaWV3IGdldEdyb3VwVmlldyhpbnQgZ3JvdXBQb3NpdGlvbiwgYm9vbGVhbiBpc0V4cGFuZGVkLCBWaWV3IGNvbnZlcnRWaWV3LAotICAgICAgICAgICAgICAgIFZpZXdHcm91cCBwYXJlbnQpIHsKLSAgICAgICAgICAgIFRleHRWaWV3IHRleHRWaWV3ID0gZ2V0R2VuZXJpY1ZpZXcoKTsKLSAgICAgICAgICAgIHRleHRWaWV3LnNldFRleHQoZ2V0R3JvdXAoZ3JvdXBQb3NpdGlvbikudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICByZXR1cm4gdGV4dFZpZXc7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0NoaWxkU2VsZWN0YWJsZShpbnQgZ3JvdXBQb3NpdGlvbiwgaW50IGNoaWxkUG9zaXRpb24pIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzU3RhYmxlSWRzKCkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3dpZGdldC9leHBhbmRhYmxlbGlzdHZpZXcvUG9zaXRpb25UZXN0ZXJDb250ZXh0TWVudUxpc3RlbmVyLmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC93aWRnZXQvZXhwYW5kYWJsZWxpc3R2aWV3L1Bvc2l0aW9uVGVzdGVyQ29udGV4dE1lbnVMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGJkZmY4Li4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3dpZGdldC9leHBhbmRhYmxlbGlzdHZpZXcvUG9zaXRpb25UZXN0ZXJDb250ZXh0TWVudUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC53aWRnZXQuZXhwYW5kYWJsZWxpc3R2aWV3OwotCi1pbXBvcnQgYW5kcm9pZC52aWV3LkNvbnRleHRNZW51OwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwotaW1wb3J0IGFuZHJvaWQudmlldy5Db250ZXh0TWVudS5Db250ZXh0TWVudUluZm87Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXcuT25DcmVhdGVDb250ZXh0TWVudUxpc3RlbmVyOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkV4cGFuZGFibGVMaXN0VmlldzsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5BZGFwdGVyVmlldy5BZGFwdGVyQ29udGV4dE1lbnVJbmZvOwotCi1wdWJsaWMgY2xhc3MgUG9zaXRpb25UZXN0ZXJDb250ZXh0TWVudUxpc3RlbmVyIGltcGxlbWVudHMgT25DcmVhdGVDb250ZXh0TWVudUxpc3RlbmVyIHsKLQotICAgIHByaXZhdGUgaW50IGdyb3VwUG9zaXRpb24sIGNoaWxkUG9zaXRpb247Ci0KLSAgICAvLyBGYWtlIGNvbnN0YW50IHRvIHN0b3JlIGluIHRlc3RUeXBlIGEgdGVzdCB0eXBlIHNwZWNpZmljIHRvIGhlYWRlcnMgYW5kIGZvb3RlcnMKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQURBUFRFUl9UWVBFID0gLTE7Ci0gICAgcHJpdmF0ZSBpbnQgdGVzdFR5cGU7IC8vIGFzIHJldHVybmVkIGJ5IGdldFBhY2tlZFBvc2l0aW9uVHlwZQotCi0gICAgLy8gV2lsbCBiZSBzZXQgdG8gbnVsbCBieSBlYWNoIGNhbGwgdG8gb25DcmVhdGVDb250ZXh0TWVudSwgdW5sZXNzIGFuIGVycm9yIG9jY3VycmVkLiAKLSAgICBwcml2YXRlIFN0cmluZyBlcnJvck1lc3NhZ2U7Ci0KLSAgICBwdWJsaWMgdm9pZCBleHBlY3RHcm91cENvbnRleHRNZW51KGludCBncm91cFBvc2l0aW9uKSB7Ci0gICAgICAgIHRoaXMuZ3JvdXBQb3NpdGlvbiA9IGdyb3VwUG9zaXRpb247Ci0gICAgICAgIHRlc3RUeXBlID0gRXhwYW5kYWJsZUxpc3RWaWV3LlBBQ0tFRF9QT1NJVElPTl9UWVBFX0dST1VQOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGV4cGVjdENoaWxkQ29udGV4dE1lbnUoaW50IGdyb3VwUG9zaXRpb24sIGludCBjaGlsZFBvc2l0aW9uKSB7Ci0gICAgICAgIHRoaXMuZ3JvdXBQb3NpdGlvbiA9IGdyb3VwUG9zaXRpb247Ci0gICAgICAgIHRoaXMuY2hpbGRQb3NpdGlvbiA9IGNoaWxkUG9zaXRpb247Ci0gICAgICAgIHRlc3RUeXBlID0gRXhwYW5kYWJsZUxpc3RWaWV3LlBBQ0tFRF9QT1NJVElPTl9UWVBFX0NISUxEOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGV4cGVjdEFkYXB0ZXJDb250ZXh0TWVudShpbnQgZmxhdFBvc2l0aW9uKSB7Ci0gICAgICAgIHRoaXMuZ3JvdXBQb3NpdGlvbiA9IGZsYXRQb3NpdGlvbjsKLSAgICAgICAgdGVzdFR5cGUgPSBBREFQVEVSX1RZUEU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgb25DcmVhdGVDb250ZXh0TWVudShDb250ZXh0TWVudSBtZW51LCBWaWV3IHYsIENvbnRleHRNZW51SW5mbyBtZW51SW5mbykgewotICAgICAgICBlcnJvck1lc3NhZ2UgPSBudWxsOwotICAgICAgICBpZiAodGVzdFR5cGUgPT0gQURBUFRFUl9UWVBFKSB7Ci0gICAgICAgICAgICBpZiAoIWlzVHJ1ZSgiTWVudUluZm8gaXMgbm90IGFuIEFkYXB0ZXJDb250ZXh0TWVudUluZm8iLAotICAgICAgICAgICAgICAgICAgICBtZW51SW5mbyBpbnN0YW5jZW9mIEFkYXB0ZXJDb250ZXh0TWVudUluZm8pKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQWRhcHRlckNvbnRleHRNZW51SW5mbyBhZGFwdGVyQ29udGV4dE1lbnVJbmZvID0gKEFkYXB0ZXJDb250ZXh0TWVudUluZm8pIG1lbnVJbmZvOwotICAgICAgICAgICAgaWYgKCFhcmVFcXVhbCgiV3JvbmcgZmxhdCBwb3NpdGlvbiIsIGdyb3VwUG9zaXRpb24sIGFkYXB0ZXJDb250ZXh0TWVudUluZm8ucG9zaXRpb24pKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKCFpc1RydWUoIk1lbnVJbmZvIGlzIG5vdCBhbiBFeHBhbmRhYmxlTGlzdENvbnRleHRNZW51SW5mbyIsCi0gICAgICAgICAgICAgICAgICAgIG1lbnVJbmZvIGluc3RhbmNlb2YgRXhwYW5kYWJsZUxpc3RWaWV3LkV4cGFuZGFibGVMaXN0Q29udGV4dE1lbnVJbmZvKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEV4cGFuZGFibGVMaXN0Vmlldy5FeHBhbmRhYmxlTGlzdENvbnRleHRNZW51SW5mbyBlbHZNZW51SW5mbyA9Ci0gICAgICAgICAgICAgICAgKEV4cGFuZGFibGVMaXN0Vmlldy5FeHBhbmRhYmxlTGlzdENvbnRleHRNZW51SW5mbykgbWVudUluZm87Ci0gICAgICAgICAgICBsb25nIHBhY2tlZFBvc2l0aW9uID0gZWx2TWVudUluZm8ucGFja2VkUG9zaXRpb247Ci0KLSAgICAgICAgICAgIGludCBwYWNrZWRQb3NpdGlvblR5cGUgPSBFeHBhbmRhYmxlTGlzdFZpZXcuZ2V0UGFja2VkUG9zaXRpb25UeXBlKHBhY2tlZFBvc2l0aW9uKTsKLSAgICAgICAgICAgIGlmICghYXJlRXF1YWwoIldyb25nIHBhY2tlZCBwb3NpdGlvbiB0eXBlIiwgdGVzdFR5cGUsIHBhY2tlZFBvc2l0aW9uVHlwZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGludCBwYWNrZWRQb3NpdGlvbkdyb3VwID0gRXhwYW5kYWJsZUxpc3RWaWV3LmdldFBhY2tlZFBvc2l0aW9uR3JvdXAocGFja2VkUG9zaXRpb24pOwotICAgICAgICAgICAgaWYgKCFhcmVFcXVhbCgiV3JvbmcgZ3JvdXAgcG9zaXRpb24iLCBncm91cFBvc2l0aW9uLCBwYWNrZWRQb3NpdGlvbkdyb3VwKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHRlc3RUeXBlID09IEV4cGFuZGFibGVMaXN0Vmlldy5QQUNLRURfUE9TSVRJT05fVFlQRV9DSElMRCkgewotICAgICAgICAgICAgICAgIGludCBwYWNrZWRQb3NpdGlvbkNoaWxkID0gRXhwYW5kYWJsZUxpc3RWaWV3LmdldFBhY2tlZFBvc2l0aW9uQ2hpbGQocGFja2VkUG9zaXRpb24pOwotICAgICAgICAgICAgICAgIGlmICghYXJlRXF1YWwoIldyb25nIGNoaWxkIHBvc2l0aW9uIiwgY2hpbGRQb3NpdGlvbiwgcGFja2VkUG9zaXRpb25DaGlsZCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBhcmVFcXVhbChTdHJpbmcgbWVzc2FnZSwgaW50IGV4cGVjdGVkLCBpbnQgYWN0dWFsKSB7Ci0gICAgICAgIGlmIChleHBlY3RlZCAhPSBhY3R1YWwpIHsKLSAgICAgICAgICAgIGVycm9yTWVzc2FnZSA9IFN0cmluZy5mb3JtYXQobWVzc2FnZSArICIgKCVkIHZzICVkIiwgZXhwZWN0ZWQsIGFjdHVhbCk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzVHJ1ZShTdHJpbmcgbWVzc2FnZSwgYm9vbGVhbiB2YWx1ZSkgewotICAgICAgICBpZiAoIXZhbHVlKSB7Ci0gICAgICAgICAgICBlcnJvck1lc3NhZ2UgPSBtZXNzYWdlOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RXJyb3JNZXNzYWdlKCkgewotICAgICAgICByZXR1cm4gZXJyb3JNZXNzYWdlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvaG9zdHRlc3RzL3NyYy9hbmRyb2lkL2NvbnRlbnQvcG0vUGFja2FnZU1hbmFnZXJIb3N0VGVzdFV0aWxzLmphdmEgYi9jb3JlL3Rlc3RzL2hvc3R0ZXN0cy9zcmMvYW5kcm9pZC9jb250ZW50L3BtL1BhY2thZ2VNYW5hZ2VySG9zdFRlc3RVdGlscy5qYXZhCmluZGV4IDkxY2JlMmYuLjE5YzlkMjYgMTAwNjQ0Ci0tLSBhL2NvcmUvdGVzdHMvaG9zdHRlc3RzL3NyYy9hbmRyb2lkL2NvbnRlbnQvcG0vUGFja2FnZU1hbmFnZXJIb3N0VGVzdFV0aWxzLmphdmEKKysrIGIvY29yZS90ZXN0cy9ob3N0dGVzdHMvc3JjL2FuZHJvaWQvY29udGVudC9wbS9QYWNrYWdlTWFuYWdlckhvc3RUZXN0VXRpbHMuamF2YQpAQCAtMTI0LDcgKzEyNCwxMSBAQAogICAgICAgICBSZW1vdGVBbmRyb2lkVGVzdFJ1bm5lciB0ZXN0UnVubmVyID0gbmV3IFJlbW90ZUFuZHJvaWRUZXN0UnVubmVyKAogICAgICAgICAgICAgICAgIHBrZ05hbWUsIG1EZXZpY2UpOwogICAgICAgICBDb2xsZWN0aW5nVGVzdFJ1bkxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IENvbGxlY3RpbmdUZXN0UnVuTGlzdGVuZXIoKTsKLSAgICAgICAgdGVzdFJ1bm5lci5ydW4obGlzdGVuZXIpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgdGVzdFJ1bm5lci5ydW4obGlzdGVuZXIpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKKyAgICAgICAgICAgIExvZy53KExPR19UQUcsICJlbmNvdW50ZXJlZCBJT0V4Y2VwdGlvbiAiICsgaW9lKTsKKyAgICAgICAgfQogICAgICAgICByZXR1cm4gbGlzdGVuZXI7CiAgICAgfQogCmRpZmYgLS1naXQgYS9kYXRhL2V0Yy9wbGF0Zm9ybS54bWwgYi9kYXRhL2V0Yy9wbGF0Zm9ybS54bWwKaW5kZXggNzMyMmU2Yy4uMGU1ZGY4YyAxMDA2NDQKLS0tIGEvZGF0YS9ldGMvcGxhdGZvcm0ueG1sCisrKyBiL2RhdGEvZXRjL3BsYXRmb3JtLnhtbApAQCAtNTgsNiArNTgsMTAgQEAKICAgICAgICAgPGdyb3VwIGdpZD0ic2RjYXJkX3J3IiAvPgogICAgIDwvcGVybWlzc2lvbj4KIAorICAgIDxwZXJtaXNzaW9uIG5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5BQ0NFU1NfVVNCIiA+CisgICAgICAgIDxncm91cCBnaWQ9InVzYiIgLz4KKyAgICA8L3Blcm1pc3Npb24+CisKICAgICA8IS0tIFRoZSBncm91cCB0aGF0IC9jYWNoZSBiZWxvbmdzIHRvLCBsaW5rZWQgdG8gdGhlIHBlcm1pc3Npb24KICAgICAgICAgIHNldCBvbiB0aGUgYXBwbGljYXRpb25zIHRoYXQgY2FuIGFjY2VzcyAvY2FjaGUgLS0+CiAgICAgPHBlcm1pc3Npb24gbmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLkFDQ0VTU19DQUNIRV9GSUxFU1lTVEVNIiA+CmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL3Rlc3RpbmcvdGVzdGluZ19hbmRyb2lkLmpkIGIvZG9jcy9odG1sL2d1aWRlL3RvcGljcy90ZXN0aW5nL3Rlc3RpbmdfYW5kcm9pZC5qZAppbmRleCA0NmJhNzY5Li45YWNlMWNiIDEwMDc1NQotLS0gYS9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL3Rlc3RpbmcvdGVzdGluZ19hbmRyb2lkLmpkCisrKyBiL2RvY3MvaHRtbC9ndWlkZS90b3BpY3MvdGVzdGluZy90ZXN0aW5nX2FuZHJvaWQuamQKQEAgLTIzLDkgKzIzLDkgQEAKICAgICAgICAgPGxpPgogICAgICAgICAgIDxhIGhyZWY9IiNNb2NrT2JqZWN0cyI+TW9jayBvYmplY3QgY2xhc3NlczwvYT4KICAgICAgICAgPC9saT4KLSAgICAgICAgICAgIDxsaT4KLSAgICAgICAgICAgICAgICA8YSBocmVmPSIjSW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lciI+SW5zdHJ1bWVudGF0aW9uIFRlc3QgUnVubmVyPC9hPgotICAgICAgICAgICAgPC9saT4KKyAgICAgICAgPGxpPgorICAgICAgICAgIDxhIGhyZWY9IiNJbnN0cnVtZW50YXRpb25UZXN0UnVubmVyIj5JbnN0cnVtZW50YXRpb24gVGVzdCBSdW5uZXI8L2E+CisgICAgICAgIDwvbGk+CiAgICAgICA8L29sPgogICAgIDwvbGk+CiAgICAgPGxpPgpAQCAtNjQsNyArNjQsOCBAQAogICA8aDI+UmVsYXRlZCBUdXRvcmlhbHM8L2gyPgogICAgIDxvbD4KICAgICAgICAgPGxpPgotICAgICAgICAgICAgPGEgaHJlZj0ie0Bkb2NSb290fXJlc291cmNlcy90dXRvcmlhbHMvdGVzdGluZy9oZWxsb2FuZHJvaWRfdGVzdC5odG1sIj5IZWxsbywgVGVzdGluZzwvYT4KKyAgICAgICAgICAgIDxhIGhyZWY9IntAZG9jUm9vdH1yZXNvdXJjZXMvdHV0b3JpYWxzL3Rlc3RpbmcvaGVsbG9hbmRyb2lkX3Rlc3QuaHRtbCI+CisgICAgICAgICAgICBIZWxsbywgVGVzdGluZzwvYT4KICAgICAgICAgPC9saT4KICAgICAgICAgPGxpPgogICAgICAgICAgICAgPGEgaHJlZj0ie0Bkb2NSb290fXJlc291cmNlcy90dXRvcmlhbHMvdGVzdGluZy9hY3Rpdml0eV90ZXN0Lmh0bWwiPkFjdGl2aXR5IFRlc3Rpbmc8L2E+CkBAIC03MywxMCArNzQsMTIgQEAKICAgPGgyPlNlZSBBbHNvPC9oMj4KICAgICAgIDxvbD4KICAgICAgICAgPGxpPgotICAgICAgICAgIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9kZXZlbG9waW5nL3Rlc3RpbmcvdGVzdGluZ19lY2xpcHNlLmh0bWwiPlRlc3RpbmcgaW4gRWNsaXBzZSwgd2l0aCBBRFQ8L2E+CisgICAgICAgICAgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL2RldmVsb3BpbmcvdGVzdGluZy90ZXN0aW5nX2VjbGlwc2UuaHRtbCI+CisgICAgICAgICAgVGVzdGluZyBpbiBFY2xpcHNlLCB3aXRoIEFEVDwvYT4KICAgICAgICAgPC9saT4KICAgICAgICAgPGxpPgotICAgICAgICAgIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9kZXZlbG9waW5nL3Rlc3RpbmcvdGVzdGluZ19vdGhlcmlkZS5odG1sIj5UZXN0aW5nIGluIE90aGVyIElERXM8L2E+CisgICAgICAgICAgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL2RldmVsb3BpbmcvdGVzdGluZy90ZXN0aW5nX290aGVyaWRlLmh0bWwiPgorICAgICAgICAgIFRlc3RpbmcgaW4gT3RoZXIgSURFczwvYT4KICAgICAgICAgPC9saT4KICAgICAgIDwvb2w+CiAgIDwvZGl2PgpAQCAtMTE4LDQ1ICsxMjEsNTUgQEAKIGluIHRoZSBzYW1lIHByb2Nlc3MuIDwvcD4KIAogPHA+WW91ciB0ZXN0IGFwcGxpY2F0aW9uIGlzIGxpbmtlZCB0byB0aGUgYXBwbGljYXRpb24gdW5kZXIgdGVzdCBieSBtZWFucyBvZiBhbgotPGEKLWhyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvbWFuaWZlc3QvaW5zdHJ1bWVudGF0aW9uLWVsZW1lbnQuaHRtbCI+PGNvZGU+Jmx0O2luc3RydW1lbnRhdGlvbiZndDs8L2NvZGU+PC9hPgotZWxlbWVudCBpbiB0aGUgdGVzdCBhcHBsaWNhdGlvbidzIG1hbmlmZXN0IGZpbGUuIFRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBlbGVtZW50Ci1zcGVjaWZ5IHRoZSBwYWNrYWdlIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QgYW5kIGFsc28gdGVsbCBBbmRyb2lkIGhvdwotdG8gcnVuIHRoZSB0ZXN0IGFwcGxpY2F0aW9uLiBJbnN0cnVtZW50YXRpb24gaXMgZGVzY3JpYmVkIGluIG1vcmUgZGV0YWlsIGluIHRoZQotc2VjdGlvbiA8YSBocmVmPSIjSW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lciI+SW5zdHJ1bWVudGF0aW9uIFRlc3QKLVJ1bm5lcjwvYT4uPC9wPgorICAgIDxhCisgICAgICBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL21hbmlmZXN0L2luc3RydW1lbnRhdGlvbi1lbGVtZW50Lmh0bWwiPgorICAgICAgPGNvZGU+Jmx0O2luc3RydW1lbnRhdGlvbiZndDs8L2NvZGU+PC9hPiBlbGVtZW50IGluIHRoZSB0ZXN0IGFwcGxpY2F0aW9uJ3MgbWFuaWZlc3QgZmlsZS4gCisgICAgICBUaGUgYXR0cmlidXRlcyBvZiB0aGUgZWxlbWVudCBzcGVjaWZ5IHRoZSBwYWNrYWdlIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QgYW5kIGFsc28gCisgICAgICB0ZWxsIEFuZHJvaWQgaG93IHRvIHJ1biB0aGUgdGVzdCBhcHBsaWNhdGlvbi4gSW5zdHJ1bWVudGF0aW9uIGlzIGRlc2NyaWJlZCBpbiBtb3JlIGRldGFpbCAKKyAgICAgIGluIHRoZSBzZWN0aW9uIDxhIGhyZWY9IiNJbnN0cnVtZW50YXRpb25UZXN0UnVubmVyIj5JbnN0cnVtZW50YXRpb24gVGVzdCBSdW5uZXI8L2E+LgorPC9wPgogCiA8cD5UaGUgZm9sbG93aW5nIGRpYWdyYW0gc3VtbWFyaXplcyB0aGUgQW5kcm9pZCB0ZXN0aW5nIGVudmlyb25tZW50OjwvcD4KIAogPGltZyBzcmM9IntAZG9jUm9vdH1pbWFnZXMvdGVzdGluZy9hbmRyb2lkX3Rlc3RfZnJhbWV3b3JrLnBuZyIvPgogCi08cD5JbiBBbmRyb2lkLCB0ZXN0IGFwcGxpY2F0aW9ucyBhcmUgdGhlbXNlbHZlcyBBbmRyb2lkIGFwcGxpY2F0aW9ucywgc28geW91Ci13cml0ZSB0aGVtIGluIG11Y2ggdGhlIHNhbWUgd2F5IGFzIHRoZSBhcHBsaWNhdGlvbiB5b3UgYXJlIHRlc3RpbmcuIFRoZSBTREsKLXRvb2xzIGhlbHAgeW91IGNyZWF0ZSBhIG1haW4gYXBwbGljYXRpb24gcHJvamVjdCBhbmQgaXRzIHRlc3QgcHJvamVjdCBhdCB0aGUgc2FtZQotdGltZS4gWW91IGNhbiBydW4gQW5kcm9pZCB0ZXN0cyB3aXRoaW4gRWNsaXBzZSB3aXRoIEFEVCBvciBmcm9tIHRoZSBjb21tYW5kCi1saW5lLiBFY2xpcHNlIHdpdGggQURUIHByb3ZpZGVzIGFuIGV4dGVuc2l2ZSBzZXQgb2YgdG9vbHMgZm9yIGNyZWF0aW5nIHRlc3RzLAotcnVubmluZyB0aGVtLCBhbmQgdmlld2luZyB0aGVpciByZXN1bHRzLiBZb3UgY2FuIGFsc28gdXNlIHRoZSA8Y29kZT5hZGI8L2NvZGU+Ci10b29sIHRvIHJ1biB0ZXN0cywgb3IgdXNlIGEgYnVpbHQtaW4gQW50IHRhcmdldC48L3A+Cis8cD4KKyAgICBJbiBBbmRyb2lkLCB0ZXN0IGFwcGxpY2F0aW9ucyBhcmUgdGhlbXNlbHZlcyBBbmRyb2lkIGFwcGxpY2F0aW9ucywgc28geW91CisgICAgd3JpdGUgdGhlbSBpbiBtdWNoIHRoZSBzYW1lIHdheSBhcyB0aGUgYXBwbGljYXRpb24geW91IGFyZSB0ZXN0aW5nLiBUaGUgU0RLCisgICAgdG9vbHMgaGVscCB5b3UgY3JlYXRlIGEgbWFpbiBhcHBsaWNhdGlvbiBwcm9qZWN0IGFuZCBpdHMgdGVzdCBwcm9qZWN0IGF0IHRoZSBzYW1lCisgICAgdGltZS4gWW91IGNhbiBydW4gQW5kcm9pZCB0ZXN0cyB3aXRoaW4gRWNsaXBzZSB3aXRoIEFEVCBvciBmcm9tIHRoZSBjb21tYW5kCisgICAgbGluZS4gRWNsaXBzZSB3aXRoIEFEVCBwcm92aWRlcyBhbiBleHRlbnNpdmUgc2V0IG9mIHRvb2xzIGZvciBjcmVhdGluZyB0ZXN0cywKKyAgICBydW5uaW5nIHRoZW0sIGFuZCB2aWV3aW5nIHRoZWlyIHJlc3VsdHMuIFlvdSBjYW4gYWxzbyB1c2UgdGhlIDxjb2RlPmFkYjwvY29kZT4KKyAgICB0b29sIHRvIHJ1biB0ZXN0cywgb3IgdXNlIGEgYnVpbHQtaW4gQW50IHRhcmdldC4KKzwvcD4KIAotPHA+VG8gbGVhcm4gaG93IHRvIHNldCB1cCBhbmQgcnVuIHRlc3RzIGluIEVjbGlwc2UsIHBsZWFzZSByZWZlciB0byA8YQotaHJlZj0ie0Bkb2NSb290fWd1aWRlL2RldmVsb3BpbmcvdGVzdGluZy90ZXN0aW5nX2VjbGlwc2UuaHRtbCI+VGVzdGluZyBpbgotRWNsaXBzZSwgd2l0aCBBRFQ8L2E+LiBJZiB5b3UncmUgbm90IHdvcmtpbmcgaW4gRWNsaXBzZSwgcmVmZXIgdG8gPGEKLWhyZWY9IntAZG9jUm9vdH1ndWlkZS9kZXZlbG9waW5nL3Rlc3RpbmcvdGVzdGluZ19vdGhlcmlkZS5odG1sIj5UZXN0aW5nIGluIE90aGVyCi1JREVzPC9hPi48L3A+Cis8cD4KKyAgICBUbyBsZWFybiBob3cgdG8gc2V0IHVwIGFuZCBydW4gdGVzdHMgaW4gRWNsaXBzZSwgcGxlYXNlIHJlZmVyIHRvIDxhCisgICAgaHJlZj0ie0Bkb2NSb290fWd1aWRlL2RldmVsb3BpbmcvdGVzdGluZy90ZXN0aW5nX2VjbGlwc2UuaHRtbCI+VGVzdGluZyBpbgorICAgIEVjbGlwc2UsIHdpdGggQURUPC9hPi4gSWYgeW91J3JlIG5vdCB3b3JraW5nIGluIEVjbGlwc2UsIHJlZmVyIHRvIDxhCisgICAgaHJlZj0ie0Bkb2NSb290fWd1aWRlL2RldmVsb3BpbmcvdGVzdGluZy90ZXN0aW5nX290aGVyaWRlLmh0bWwiPlRlc3RpbmcgaW4gT3RoZXIKKyAgICBJREVzPC9hPi4KKzwvcD4KIAotPHA+SWYgeW91IHdhbnQgYSBzdGVwLWJ5LXN0ZXAgaW50cm9kdWN0aW9uIHRvIEFuZHJvaWQgdGVzdGluZywgdHJ5IG9uZSBvZiB0aGUKLXRlc3RpbmcgdHV0b3JpYWxzOjwvcD4KKzxwPgorICAgIElmIHlvdSB3YW50IGEgc3RlcC1ieS1zdGVwIGludHJvZHVjdGlvbiB0byBBbmRyb2lkIHRlc3RpbmcsIHRyeSBvbmUgb2YgdGhlCisgICAgdGVzdGluZyB0dXRvcmlhbHM6Cis8L3A+CiAKIDx1bD4KLSAgPGxpPlRoZSA8YQotaHJlZj0ie0Bkb2NSb290fXJlc291cmNlcy90dXRvcmlhbHMvdGVzdGluZy9oZWxsb2FuZHJvaWRfdGVzdC5odG1sIj5IZWxsbywKLVRlc3Rpbmc8L2E+IHR1dG9yaWFsIGludHJvZHVjZXMgYmFzaWMgdGVzdGluZyBjb25jZXB0cyBhbmQgcHJvY2VkdXJlcyBpbiB0aGUKLWNvbnRleHQgb2YgdGhlIEhlbGxvLCBXb3JsZCBhcHBsaWNhdGlvbi48L2xpPgotICA8bGk+VGhlIDxhCi1ocmVmPSJ7QGRvY1Jvb3R9cmVzb3VyY2VzL3R1dG9yaWFscy90ZXN0aW5nL2FjdGl2aXR5X3Rlc3QuaHRtbCI+QWN0aXZpdHkKLVRlc3Rpbmc8L2E+IHR1dG9yaWFsIGlzIGFuIGV4Y2VsbGVudCBmb2xsb3ctdXAgdG8gdGhlIEhlbGxvLCBUZXN0aW5nIHR1dG9yaWFsLgotSXQgZ3VpZGVzIHlvdSB0aHJvdWdoIGEgbW9yZSBjb21wbGV4IHRlc3Rpbmcgc2NlbmFyaW8gdGhhdCB5b3UgZGV2ZWxvcCBhZ2FpbnN0IGEKLW1vcmUgcmVhbGlzdGljIGFwcGxpY2F0aW9uLjwvbGk+CisgICAgPGxpPgorICAgICAgICBUaGUgPGEKKyAgICAgICAgaHJlZj0ie0Bkb2NSb290fXJlc291cmNlcy90dXRvcmlhbHMvdGVzdGluZy9oZWxsb2FuZHJvaWRfdGVzdC5odG1sIj5IZWxsbywKKyAgICAgICAgVGVzdGluZzwvYT4gdHV0b3JpYWwgaW50cm9kdWNlcyBiYXNpYyB0ZXN0aW5nIGNvbmNlcHRzIGFuZCBwcm9jZWR1cmVzIGluIHRoZQorICAgICAgICBjb250ZXh0IG9mIHRoZSBIZWxsbywgV29ybGQgYXBwbGljYXRpb24uCisgICAgPC9saT4KKyAgICA8bGk+CisgICAgICAgIFRoZSA8YQorICAgICAgICBocmVmPSJ7QGRvY1Jvb3R9cmVzb3VyY2VzL3R1dG9yaWFscy90ZXN0aW5nL2FjdGl2aXR5X3Rlc3QuaHRtbCI+QWN0aXZpdHkKKyAgICAgICAgVGVzdGluZzwvYT4gdHV0b3JpYWwgaXMgYW4gZXhjZWxsZW50IGZvbGxvdy11cCB0byB0aGUgSGVsbG8sIFRlc3RpbmcgdHV0b3JpYWwuCisgICAgICAgIEl0IGd1aWRlcyB5b3UgdGhyb3VnaCBhIG1vcmUgY29tcGxleCB0ZXN0aW5nIHNjZW5hcmlvIHRoYXQgeW91IGRldmVsb3AgYWdhaW5zdCBhCisgICAgICAgIG1vcmUgcmVhbGlzdGljIGFwcGxpY2F0aW9uLgorICAgIDwvbGk+CiA8L3VsPgogCiA8aDIgaWQ9IlRlc3RBUEkiPlRoZSBUZXN0aW5nIEFQSTwvaDI+CkBAIC0xNjYsMTIwICsxNzksMTU2IEBACiAgICAgYSBwb3dlcmZ1bCBpbnN0cnVtZW50YXRpb24gZnJhbWV3b3JrIHRoYXQgbGV0cyB5b3VyIHRlc3RzIGFjY2VzcyB0aGUgc3RhdGUgYW5kIHJ1bnRpbWUgb2JqZWN0cwogICAgIG9mIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0cy4KIDwvcD4KLTxwPlRoZSBzZWN0aW9ucyBiZWxvdyBkZXNjcmliZSB0aGUgbWFqb3IgY29tcG9uZW50cyBvZiB0aGUgdGVzdGluZyBBUEkgYXZhaWxhYmxlIGluIEFuZHJvaWQuPC9wPgorPHA+CisgICAgVGhlIHNlY3Rpb25zIGJlbG93IGRlc2NyaWJlIHRoZSBtYWpvciBjb21wb25lbnRzIG9mIHRoZSB0ZXN0aW5nIEFQSSBhdmFpbGFibGUgaW4gQW5kcm9pZC4KKzwvcD4KIDxoMyBpZD0iRXh0ZW5zaW9ucyI+SlVuaXQgdGVzdCBjYXNlIGNsYXNzZXM8L2gzPgogPHA+Ci0gIFNvbWUgb2YgdGhlIGNsYXNzZXMgaW4gdGhlIHRlc3RpbmcgQVBJIGV4dGVuZCB0aGUgSlVuaXQge0BsaW5rIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSBUZXN0Q2FzZX0gYnV0IGRvIG5vdCB1c2UgdGhlIGluc3RydW1lbnRhdGlvbiBmcmFtZXdvcmsuIFRoZXNlIGNsYXNzZXMKLSAgY29udGFpbiBtZXRob2RzIGZvciBhY2Nlc3Npbmcgc3lzdGVtIG9iamVjdHMgc3VjaCBhcyB0aGUgQ29udGV4dCBvZiB0aGUgYXBwbGljYXRpb24gdW5kZXIgdGVzdC4gV2l0aCB0aGlzIENvbnRleHQsIHlvdSBjYW4gbG9vayBhdCBpdHMgcmVzb3VyY2VzLCBmaWxlcywgZGF0YWJhc2VzLAotICBhbmQgc28gZm9ydGguIFRoZSBiYXNlIGNsYXNzIGlzIHtAbGluayBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlfSwgYnV0IHlvdSB1c3VhbGx5IHVzZSBhIHN1YmNsYXNzIGFzc29jaWF0ZWQgd2l0aCBhIHBhcnRpY3VsYXIgY29tcG9uZW50LgorICBTb21lIG9mIHRoZSBjbGFzc2VzIGluIHRoZSB0ZXN0aW5nIEFQSSBleHRlbmQgdGhlIEpVbml0IHtAbGluayBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UgVGVzdENhc2V9IAorICBidXQgZG8gbm90IHVzZSB0aGUgaW5zdHJ1bWVudGF0aW9uIGZyYW1ld29yay4gVGhlc2UgY2xhc3NlcyBjb250YWluIG1ldGhvZHMgZm9yIGFjY2Vzc2luZyBzeXN0ZW0gCisgIG9iamVjdHMgc3VjaCBhcyB0aGUgQ29udGV4dCBvZiB0aGUgYXBwbGljYXRpb24gdW5kZXIgdGVzdC4gV2l0aCB0aGlzIENvbnRleHQsIHlvdSBjYW4gbG9vayBhdCBpdHMgCisgIHJlc291cmNlcywgZmlsZXMsIGRhdGFiYXNlcywgYW5kIHNvIGZvcnRoLiBUaGUgYmFzZSBjbGFzcyBpcyB7QGxpbmsgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZX0sCisgIGJ1dCB5b3UgdXN1YWxseSB1c2UgYSBzdWJjbGFzcyBhc3NvY2lhdGVkIHdpdGggYSBwYXJ0aWN1bGFyIGNvbXBvbmVudC4KIDxwPgogICBUaGUgc3ViY2xhc3NlcyBhcmU6CiA8L3A+CiAgIDx1bD4KICAgICA8bGk+Ci0gICAgICB7QGxpbmsgYW5kcm9pZC50ZXN0LkFwcGxpY2F0aW9uVGVzdENhc2V9IC0gQSBjbGFzcyBmb3IgdGVzdGluZyBhbiBlbnRpcmUgYXBwbGljYXRpb24uIEl0IGFsbG93cyB5b3UgdG8gaW5qZWN0IGEgbW9jayBDb250ZXh0IGludG8gdGhlIGFwcGxpY2F0aW9uLAotICAgICAgc2V0IHVwIGluaXRpYWwgdGVzdCBwYXJhbWV0ZXJzIGJlZm9yZSB0aGUgYXBwbGljYXRpb24gc3RhcnRzLCBhbmQgZXhhbWluZSB0aGUgYXBwbGljYXRpb24gYWZ0ZXIgaXQgZmluaXNoZXMgYnV0IGJlZm9yZSBpdCBpcyBkZXN0cm95ZWQuCisgICAgICB7QGxpbmsgYW5kcm9pZC50ZXN0LkFwcGxpY2F0aW9uVGVzdENhc2V9IC0gQSBjbGFzcyBmb3IgdGVzdGluZyBhbiBlbnRpcmUgYXBwbGljYXRpb24uIAorICAgICAgSXQgYWxsb3dzIHlvdSB0byBpbmplY3QgYSBtb2NrIENvbnRleHQgaW50byB0aGUgYXBwbGljYXRpb24sIHNldCB1cCBpbml0aWFsIHRlc3QgcGFyYW1ldGVycyAKKyAgICAgIGJlZm9yZSB0aGUgYXBwbGljYXRpb24gc3RhcnRzLCBhbmQgZXhhbWluZSB0aGUgYXBwbGljYXRpb24gYWZ0ZXIgaXQgZmluaXNoZXMgYnV0IGJlZm9yZSBpdCAKKyAgICAgIGlzIGRlc3Ryb3llZC4KICAgICA8L2xpPgogICAgIDxsaT4KLSAgICAgIHtAbGluayBhbmRyb2lkLnRlc3QuUHJvdmlkZXJUZXN0Q2FzZTJ9IC0gQSBjbGFzcyBmb3IgaXNvbGF0ZWQgdGVzdGluZyBvZiBhIHNpbmdsZSB7QGxpbmsgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRQcm92aWRlcn0uIFNpbmNlIGl0IGlzIHJlc3RyaWN0ZWQgdG8gdXNpbmcgYQotICAgICAge0BsaW5rIGFuZHJvaWQudGVzdC5tb2NrLk1vY2tDb250ZW50UmVzb2x2ZXJ9IGZvciB0aGUgcHJvdmlkZXIsIGFuZCBpdCBpbmplY3RzIGFuIHtAbGluayBhbmRyb2lkLnRlc3QuSXNvbGF0ZWRDb250ZXh0fSwgeW91ciBwcm92aWRlciB0ZXN0aW5nIGlzIGlzb2xhdGVkCisgICAgICB7QGxpbmsgYW5kcm9pZC50ZXN0LlByb3ZpZGVyVGVzdENhc2UyfSAtIEEgY2xhc3MgZm9yIGlzb2xhdGVkIHRlc3Rpbmcgb2YgYSBzaW5nbGUgCisgICAgICB7QGxpbmsgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRQcm92aWRlcn0uIFNpbmNlIGl0IGlzIHJlc3RyaWN0ZWQgdG8gdXNpbmcgYQorICAgICAgIHtAbGluayBhbmRyb2lkLnRlc3QubW9jay5Nb2NrQ29udGVudFJlc29sdmVyfSBmb3IgdGhlIHByb3ZpZGVyLCBhbmQgaXQgaW5qZWN0cyBhbiAKKyAgICAgICB7QGxpbmsgYW5kcm9pZC50ZXN0Lklzb2xhdGVkQ29udGV4dH0sIHlvdXIgcHJvdmlkZXIgdGVzdGluZyBpcyBpc29sYXRlZAogICAgICAgZnJvbSB0aGUgcmVzdCBvZiB0aGUgT1MuCiAgICAgPC9saT4KICAgICA8bGk+Ci0gICAgICB7QGxpbmsgYW5kcm9pZC50ZXN0LlNlcnZpY2VUZXN0Q2FzZX0gLSBhIGNsYXNzIGZvciBpc29sYXRlZCB0ZXN0aW5nIG9mIGEgc2luZ2xlIHtAbGluayBhbmRyb2lkLmFwcC5TZXJ2aWNlfS4gWW91IGNhbiBpbmplY3QgYSBtb2NrIENvbnRleHQgb3IKLSAgICAgIG1vY2sgQXBwbGljYXRpb24gKG9yIGJvdGgpLCBvciBsZXQgQW5kcm9pZCBwcm92aWRlIHlvdSBhIGZ1bGwgQ29udGV4dCBhbmQgYSB7QGxpbmsgYW5kcm9pZC50ZXN0Lm1vY2suTW9ja0FwcGxpY2F0aW9ufS4KKyAgICAgIHtAbGluayBhbmRyb2lkLnRlc3QuU2VydmljZVRlc3RDYXNlfSAtIGEgY2xhc3MgZm9yIGlzb2xhdGVkIHRlc3Rpbmcgb2YgYSBzaW5nbGUgCisgICAgICB7QGxpbmsgYW5kcm9pZC5hcHAuU2VydmljZX0uIFlvdSBjYW4gaW5qZWN0IGEgbW9jayBDb250ZXh0IG9yIG1vY2sgQXBwbGljYXRpb24gKG9yIGJvdGgpLCBvciAKKyAgICAgIGxldCBBbmRyb2lkIHByb3ZpZGUgeW91IGEgZnVsbCBDb250ZXh0IGFuZCBhIHtAbGluayBhbmRyb2lkLnRlc3QubW9jay5Nb2NrQXBwbGljYXRpb259LgogICAgIDwvbGk+CiAgIDwvdWw+CiA8aDMgaWQ9Ikluc3RydW1lbnRhdGlvbiI+SW5zdHJ1bWVudGF0aW9uIHRlc3QgY2FzZSBjbGFzc2VzPC9oMz4KIDxwPgotICBUaGUgQVBJIGZvciB0ZXN0aW5nIGFjdGl2aXRpZXMgZXh0ZW5kcyB0aGUgSlVuaXQge0BsaW5rIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSBUZXN0Q2FzZX0gY2xhc3MgYW5kIGFsc28gdXNlcyB0aGUgaW5zdHJ1bWVudGF0aW9uIGZyYW1ld29yay4gV2l0aCBpbnN0cnVtZW50YXRpb24sCi0gIEFuZHJvaWQgY2FuIGF1dG9tYXRlIFVJIHRlc3RpbmcgYnkgc2VuZGluZyBldmVudHMgdG8gdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QsIHByZWNpc2VseSBjb250cm9sIHRoZSBzdGFydCBvZiBhbiBhY3Rpdml0eSwgYW5kIG1vbml0b3IgdGhlIHN0YXRlIG9mIHRoZQotICBhY3Rpdml0eSBkdXJpbmcgaXRzIGxpZmUgY3ljbGUuCisgIFRoZSBBUEkgZm9yIHRlc3RpbmcgYWN0aXZpdGllcyBleHRlbmRzIHRoZSBKVW5pdCB7QGxpbmsganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlIFRlc3RDYXNlfSBjbGFzcyAKKyAgYW5kIGFsc28gdXNlcyB0aGUgaW5zdHJ1bWVudGF0aW9uIGZyYW1ld29yay4gV2l0aCBpbnN0cnVtZW50YXRpb24sIEFuZHJvaWQgY2FuIGF1dG9tYXRlIFVJIAorICB0ZXN0aW5nIGJ5IHNlbmRpbmcgZXZlbnRzIHRvIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0LCBwcmVjaXNlbHkgY29udHJvbCB0aGUgc3RhcnQgb2YgYW4gCisgIGFjdGl2aXR5LCBhbmQgbW9uaXRvciB0aGUgc3RhdGUgb2YgdGhlIGFjdGl2aXR5IGR1cmluZyBpdHMgbGlmZSBjeWNsZS4KIDwvcD4KIDxwPgotICBUaGUgYmFzZSBjbGFzcyBpcyB7QGxpbmsgYW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RDYXNlfS4gQWxsIG9mIGl0cyBzdWJjbGFzc2VzIGhhdmUgdGhlIGFiaWxpdHkgdG8gc2VuZCBhIGtleXN0cm9rZSBvciB0b3VjaCBldmVudCB0byB0aGUgVUkgb2YgdGhlIGFwcGxpY2F0aW9uCi0gIHVuZGVyIHRlc3QuIFRoZSBzdWJjbGFzc2VzIGNhbiBhbHNvIGluamVjdCBhIG1vY2sgSW50ZW50LgotICBUaGUgc3ViY2xhc3NlcyBhcmU6CisgIFRoZSBiYXNlIGNsYXNzIGlzIHtAbGluayBhbmRyb2lkLnRlc3QuSW5zdHJ1bWVudGF0aW9uVGVzdENhc2V9LiBBbGwgb2YgaXRzIHN1YmNsYXNzZXMgaGF2ZSAKKyAgdGhlIGFiaWxpdHkgdG8gc2VuZCBhIGtleXN0cm9rZSBvciB0b3VjaCBldmVudCB0byB0aGUgVUkgb2YgdGhlIGFwcGxpY2F0aW9uCisgIHVuZGVyIHRlc3QuIFRoZSBzdWJjbGFzc2VzIGNhbiBhbHNvIGluamVjdCBhIG1vY2sgSW50ZW50LiBUaGUgc3ViY2xhc3NlcyBhcmU6CiA8L3A+CiAgIDx1bD4KICAgICA8bGk+CiAgICAgICB7QGxpbmsgYW5kcm9pZC50ZXN0LkFjdGl2aXR5VGVzdENhc2V9IC0gQSBiYXNlIGNsYXNzIGZvciBhY3Rpdml0eSB0ZXN0IGNsYXNzZXMuCiAgICAgPC9saT4KICAgICA8bGk+Ci0gICAgICB7QGxpbmsgYW5kcm9pZC50ZXN0LlNpbmdsZUxhdW5jaEFjdGl2aXR5VGVzdENhc2V9IC0gQSBjb252ZW5pZW5jZSBjbGFzcyBmb3IgdGVzdGluZyBhIHNpbmdsZSBhY3Rpdml0eS4KLSAgICAgIEl0IGludm9rZXMge0BsaW5rIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSNzZXRVcCgpIHNldFVwKCl9IGFuZCB7QGxpbmsganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3RlYXJEb3duKCkgdGVhckRvd24oKX0gb25seQotICAgICAgb25jZSwgaW5zdGVhZCBvZiBvbmNlIHBlciBtZXRob2QgY2FsbC4gVXNlIGl0IHdoZW4gYWxsIG9mIHlvdXIgdGVzdCBtZXRob2RzIHJ1biBhZ2FpbnN0IHRoZSBzYW1lIGFjdGl2aXR5LgorICAgICAge0BsaW5rIGFuZHJvaWQudGVzdC5TaW5nbGVMYXVuY2hBY3Rpdml0eVRlc3RDYXNlfSAtIEEgY29udmVuaWVuY2UgY2xhc3MgZm9yIAorICAgICAgdGVzdGluZyBhIHNpbmdsZSBhY3Rpdml0eS4gSXQgaW52b2tlcyB7QGxpbmsganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3NldFVwKCkgc2V0VXAoKX0gYW5kIAorICAgICAge0BsaW5rIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSN0ZWFyRG93bigpIHRlYXJEb3duKCl9IG9ubHkgb25jZSwgaW5zdGVhZCBvZiBvbmNlIHBlciAKKyAgICAgIG1ldGhvZCBjYWxsLiBVc2UgaXQgd2hlbiBhbGwgb2YgeW91ciB0ZXN0IG1ldGhvZHMgcnVuIGFnYWluc3QgdGhlIHNhbWUgYWN0aXZpdHkuCiAgICAgPC9saT4KICAgICA8bGk+Ci0gICAgICB7QGxpbmsgYW5kcm9pZC50ZXN0LlN5bmNCYXNlSW5zdHJ1bWVudGF0aW9ufSAtIEEgY2xhc3MgdGhhdCB0ZXN0cyBzeW5jaHJvbml6YXRpb24gb2YgYSBjb250ZW50IHByb3ZpZGVyLiBJdCB1c2VzIGluc3RydW1lbnRhdGlvbiB0byBjYW5jZWwgYW5kIGRpc2FibGUKLSAgICAgIGV4aXN0aW5nIHN5bmNocm9uaXphdGlvbnMgYmVmb3JlIHN0YXJ0aW5nIHRoZSB0ZXN0IHN5bmNocm9uaXphdGlvbi4KKyAgICAgIHtAbGluayBhbmRyb2lkLnRlc3QuU3luY0Jhc2VJbnN0cnVtZW50YXRpb259IC0gQSBjbGFzcyB0aGF0IHRlc3RzIHN5bmNocm9uaXphdGlvbiBvZiBhIAorICAgICAgY29udGVudCBwcm92aWRlci4gSXQgdXNlcyBpbnN0cnVtZW50YXRpb24gdG8gY2FuY2VsIGFuZCBkaXNhYmxlIGV4aXN0aW5nIHN5bmNocm9uaXphdGlvbnMgCisgICAgICBiZWZvcmUgc3RhcnRpbmcgdGhlIHRlc3Qgc3luY2hyb25pemF0aW9uLgogICAgIDwvbGk+CiAgICAgPGxpPgotICAgICAge0BsaW5rIGFuZHJvaWQudGVzdC5BY3Rpdml0eVVuaXRUZXN0Q2FzZX0gLSBUaGlzIGNsYXNzIGRvZXMgYW4gaXNvbGF0ZWQgdGVzdCBvZiBhIHNpbmdsZSBhY3Rpdml0eS4gV2l0aCBpdCwgeW91IGNhbiBpbmplY3QgYSBtb2NrIGNvbnRleHQgb3IgYXBwbGljYXRpb24sIG9yIGJvdGguCi0gICAgICBJdCBpcyBpbnRlbmRlZCBmb3IgZG9pbmcgdW5pdCB0ZXN0cyBvZiBhbiBhY3Rpdml0eSwgYW5kIGlzIHRoZSBhY3Rpdml0eSBlcXVpdmFsZW50IG9mIHRoZSB0ZXN0IGNsYXNzZXMgZGVzY3JpYmVkIGluIDxhIGhyZWY9IiNFeHRlbnNpb25zIj5KVW5pdCB0ZXN0IGNhc2UgY2xhc3NlczwvYT4uCi0gICAgICA8cD4gVW5saWtlIHRoZSBvdGhlciBpbnN0cnVtZW50YXRpb24gY2xhc3NlcywgdGhpcyB0ZXN0IGNsYXNzIGNhbm5vdCBpbmplY3QgYSBtb2NrIEludGVudC48L3A+CisgICAgICB7QGxpbmsgYW5kcm9pZC50ZXN0LkFjdGl2aXR5VW5pdFRlc3RDYXNlfSAtIFRoaXMgY2xhc3MgZG9lcyBhbiBpc29sYXRlZCB0ZXN0IG9mIGEgc2luZ2xlIAorICAgICAgYWN0aXZpdHkuIFdpdGggaXQsIHlvdSBjYW4gaW5qZWN0IGEgbW9jayBjb250ZXh0IG9yIGFwcGxpY2F0aW9uLCBvciBib3RoLgorICAgICAgSXQgaXMgaW50ZW5kZWQgZm9yIGRvaW5nIHVuaXQgdGVzdHMgb2YgYW4gYWN0aXZpdHksIGFuZCBpcyB0aGUgYWN0aXZpdHkgZXF1aXZhbGVudCBvZiB0aGUgCisgICAgICB0ZXN0IGNsYXNzZXMgZGVzY3JpYmVkIGluIDxhIGhyZWY9IiNFeHRlbnNpb25zIj5KVW5pdCB0ZXN0IGNhc2UgY2xhc3NlczwvYT4uCisgICAgICA8cD4KKyAgICAgICAgVW5saWtlIHRoZSBvdGhlciBpbnN0cnVtZW50YXRpb24gY2xhc3NlcywgdGhpcyB0ZXN0IGNsYXNzIGNhbm5vdCBpbmplY3QgYSBtb2NrIEludGVudC4KKyAgICAgIDwvcD4KICAgICA8L2xpPgogICAgIDxsaT4KLSAgICAgIHtAbGluayBhbmRyb2lkLnRlc3QuQWN0aXZpdHlJbnN0cnVtZW50YXRpb25UZXN0Q2FzZTJ9IC0gVGhpcyBjbGFzcyB0ZXN0cyBhIHNpbmdsZSBhY3Rpdml0eSB3aXRoaW4gdGhlIG5vcm1hbCBzeXN0ZW0gZW52aXJvbm1lbnQuCi0gICAgICBZb3UgY2Fubm90IGluamVjdCBhIG1vY2sgQ29udGV4dCwgYnV0IHlvdSBjYW4gaW5qZWN0IG1vY2sgSW50ZW50cy4gQWxzbywgeW91IGNhbiBydW4gYSB0ZXN0IG1ldGhvZCBvbiB0aGUgVUkgdGhyZWFkICh0aGUgbWFpbiB0aHJlYWQgb2YgdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QpLAotICAgICAgd2hpY2ggYWxsb3dzIHlvdSB0byBzZW5kIGtleSBhbmQgdG91Y2ggZXZlbnRzIHRvIHRoZSBhcHBsaWNhdGlvbiBVSS4KKyAgICAgICAge0BsaW5rIGFuZHJvaWQudGVzdC5BY3Rpdml0eUluc3RydW1lbnRhdGlvblRlc3RDYXNlMn0gLSBUaGlzIGNsYXNzIHRlc3RzIGEgc2luZ2xlIGFjdGl2aXR5IAorICAgICAgICB3aXRoaW4gdGhlIG5vcm1hbCBzeXN0ZW0gZW52aXJvbm1lbnQuIFlvdSBjYW5ub3QgaW5qZWN0IGEgbW9jayBDb250ZXh0LCBidXQgeW91IGNhbiBpbmplY3QgCisgICAgICAgIG1vY2sgSW50ZW50cy4gQWxzbywgeW91IGNhbiBydW4gYSB0ZXN0IG1ldGhvZCBvbiB0aGUgVUkgdGhyZWFkICh0aGUgbWFpbiB0aHJlYWQgb2YgdGhlIAorICAgICAgICBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0KSwgd2hpY2ggYWxsb3dzIHlvdSB0byBzZW5kIGtleSBhbmQgdG91Y2ggZXZlbnRzIHRvIHRoZSAKKyAgICAgICAgYXBwbGljYXRpb24gVUkuCiAgICAgPC9saT4KICAgPC91bD4KIDxoMyBpZD0iQXNzZXJ0Ij5Bc3NlcnQgY2xhc3NlczwvaDM+CiA8cD4KLSAgQW5kcm9pZCBhbHNvIGV4dGVuZHMgdGhlIEpVbml0IHtAbGluayBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0fSBjbGFzcyB0aGF0IGlzIHRoZSBiYXNpcyBvZiA8Y29kZT5hc3NlcnQoKTwvY29kZT4gY2FsbHMgaW4gdGVzdHMuCi0gIFRoZXJlIGFyZSB0d28gZXh0ZW5zaW9ucyB0byB0aGlzIGNsYXNzLCB7QGxpbmsgYW5kcm9pZC50ZXN0Lk1vcmVBc3NlcnRzfSBhbmQge0BsaW5rIGFuZHJvaWQudGVzdC5WaWV3QXNzZXJ0c306CisgIEFuZHJvaWQgYWxzbyBleHRlbmRzIHRoZSBKVW5pdCB7QGxpbmsganVuaXQuZnJhbWV3b3JrLkFzc2VydH0gY2xhc3MgdGhhdCBpcyB0aGUgYmFzaXMgb2YgCisgIDxjb2RlPmFzc2VydCgpPC9jb2RlPiBjYWxscyBpbiB0ZXN0cy4gVGhlcmUgYXJlIHR3byBleHRlbnNpb25zIHRvIHRoaXMgY2xhc3MsIAorICB7QGxpbmsgYW5kcm9pZC50ZXN0Lk1vcmVBc3NlcnRzfSBhbmQge0BsaW5rIGFuZHJvaWQudGVzdC5WaWV3QXNzZXJ0c306CiA8L3A+CiA8dWw+CiAgIDxsaT4KLSAgICBUaGUgPGNvZGU+TW9yZUFzc2VydHM8L2NvZGU+IGNsYXNzIGNvbnRhaW5zIG1vcmUgcG93ZXJmdWwgYXNzZXJ0aW9ucyBzdWNoIGFzIHtAbGluayBhbmRyb2lkLnRlc3QuTW9yZUFzc2VydHMjYXNzZXJ0Q29udGFpbnNSZWdleH0gdGhhdCBkb2VzIHJlZ3VsYXIgZXhwcmVzc2lvbiBtYXRjaGluZy4KKyAgICBUaGUgPGNvZGU+TW9yZUFzc2VydHM8L2NvZGU+IGNsYXNzIGNvbnRhaW5zIG1vcmUgcG93ZXJmdWwgYXNzZXJ0aW9ucyBzdWNoIGFzIAorICAgIHtAbGluayBhbmRyb2lkLnRlc3QuTW9yZUFzc2VydHMjYXNzZXJ0Q29udGFpbnNSZWdleH0gdGhhdCBkb2VzIHJlZ3VsYXIgZXhwcmVzc2lvbiBtYXRjaGluZy4KICAgPC9saT4KICAgPGxpPgotICAgIFRoZSB7QGxpbmsgYW5kcm9pZC50ZXN0LlZpZXdBc3NlcnRzfSBjbGFzcyBjb250YWlucyB1c2VmdWwgYXNzZXJ0aW9ucyBhYm91dCBBbmRyb2lkIFZpZXdzLCBzdWNoIGFzIHtAbGluayBhbmRyb2lkLnRlc3QuVmlld0Fzc2VydHMjYXNzZXJ0SGFzU2NyZWVuQ29vcmRpbmF0ZXN9IHRoYXQgdGVzdHMgaWYgYSBWaWV3IGhhcyBhIHBhcnRpY3VsYXIgWCBhbmQgWQotICAgIHBvc2l0aW9uIG9uIHRoZSB2aXNpYmxlIHNjcmVlbi4gVGhlc2UgYXNzZXJ0cyBzaW1wbGlmeSB0ZXN0aW5nIG9mIGdlb21ldHJ5IGFuZCBhbGlnbm1lbnQgaW4gdGhlIFVJLgorICAgIFRoZSB7QGxpbmsgYW5kcm9pZC50ZXN0LlZpZXdBc3NlcnRzfSBjbGFzcyBjb250YWlucyB1c2VmdWwgYXNzZXJ0aW9ucyBhYm91dCBBbmRyb2lkIFZpZXdzLCAKKyAgICBzdWNoIGFzIHtAbGluayBhbmRyb2lkLnRlc3QuVmlld0Fzc2VydHMjYXNzZXJ0SGFzU2NyZWVuQ29vcmRpbmF0ZXN9IHRoYXQgdGVzdHMgaWYgYSBWaWV3IGhhcyBhIAorICAgIHBhcnRpY3VsYXIgWCBhbmQgWSBwb3NpdGlvbiBvbiB0aGUgdmlzaWJsZSBzY3JlZW4uIFRoZXNlIGFzc2VydHMgc2ltcGxpZnkgdGVzdGluZyBvZiBnZW9tZXRyeSAKKyAgICBhbmQgYWxpZ25tZW50IGluIHRoZSBVSS4KICAgPC9saT4KIDwvdWw+CiA8aDMgaWQ9Ik1vY2tPYmplY3RzIj5Nb2NrIG9iamVjdCBjbGFzc2VzPC9oMz4KICAgPHA+Ci0gICAgQW5kcm9pZCBoYXMgY29udmVuaWVuY2UgY2xhc3NlcyBmb3IgY3JlYXRpbmcgbW9jayBzeXN0ZW0gb2JqZWN0cyBzdWNoIGFzIGFwcGxpY2F0aW9ucywgY29udGV4dHMsIGNvbnRlbnQgcmVzb2x2ZXJzLCBhbmQgcmVzb3VyY2VzLiBBbmRyb2lkIGFsc28gcHJvdmlkZXMKLSAgICBtZXRob2RzIGluIHNvbWUgdGVzdCBjbGFzc2VzIGZvciBjcmVhdGluZyBtb2NrIEludGVudHMuIFVzZSB0aGVzZSBtb2NrcyB0byBmYWNpbGl0YXRlIGRlcGVuZGVuY3kgaW5qZWN0aW9uLCBzaW5jZSB0aGV5IGFyZSBlYXNpZXIgdG8gdXNlIHRoYW4gY3JlYXRpbmcgdGhlaXIKLSAgICByZWFsIGNvdW50ZXJwYXJ0cy4gVGhlc2UgY29udmVuaWVuY2UgY2xhc3NlcyBhcmUgZm91bmQgaW4ge0BsaW5rIGFuZHJvaWQudGVzdH0gYW5kIHtAbGluayBhbmRyb2lkLnRlc3QubW9ja30uIFRoZXkgYXJlOgorICAgIEFuZHJvaWQgaGFzIGNvbnZlbmllbmNlIGNsYXNzZXMgZm9yIGNyZWF0aW5nIG1vY2sgc3lzdGVtIG9iamVjdHMgc3VjaCBhcyBhcHBsaWNhdGlvbnMsIGNvbnRleHRzLAorICAgIGNvbnRlbnQgcmVzb2x2ZXJzLCBhbmQgcmVzb3VyY2VzLiBBbmRyb2lkIGFsc28gcHJvdmlkZXMgbWV0aG9kcyBpbiBzb21lIHRlc3QgY2xhc3NlcyBmb3IgCisgICAgY3JlYXRpbmcgbW9jayBJbnRlbnRzLiBVc2UgdGhlc2UgbW9ja3MgdG8gZmFjaWxpdGF0ZSBkZXBlbmRlbmN5IGluamVjdGlvbiwgc2luY2UgdGhleSBhcmUgCisgICAgZWFzaWVyIHRvIHVzZSB0aGFuIGNyZWF0aW5nIHRoZWlyIHJlYWwgY291bnRlcnBhcnRzLiBUaGVzZSBjb252ZW5pZW5jZSBjbGFzc2VzIGFyZSBmb3VuZCBpbiAKKyAgICB7QGxpbmsgYW5kcm9pZC50ZXN0fSBhbmQge0BsaW5rIGFuZHJvaWQudGVzdC5tb2NrfS4gVGhleSBhcmU6CiAgIDwvcD4KICAgICA8dWw+CiAgICAgICA8bGk+Ci0gICAgICAgIHtAbGluayBhbmRyb2lkLnRlc3QuSXNvbGF0ZWRDb250ZXh0fSAtIE1vY2tzIGEgQ29udGV4dCBzbyB0aGF0IHRoZSBhcHBsaWNhdGlvbiB1c2luZyBpdCBydW5zIGluIGlzb2xhdGlvbi4KLSAgICAgICAgQXQgdGhlIHNhbWUgdGltZSwgaXQgaGFzIGVub3VnaCBzdHViIGNvZGUgdG8gc2F0aXNmeSBPUyBjb2RlIHRoYXQgdHJpZXMgdG8gY29tbXVuaWNhdGUgd2l0aCBjb250ZXh0cy4gVGhpcyBjbGFzcyBpcyB1c2VmdWwgaW4gdW5pdCB0ZXN0aW5nLgorICAgICAgICB7QGxpbmsgYW5kcm9pZC50ZXN0Lklzb2xhdGVkQ29udGV4dH0gLSBNb2NrcyBhIENvbnRleHQgc28gdGhhdCB0aGUgYXBwbGljYXRpb24gdXNpbmcgaXQgCisgICAgICAgIHJ1bnMgaW4gaXNvbGF0aW9uLiBBdCB0aGUgc2FtZSB0aW1lLCBpdCBoYXMgZW5vdWdoIHN0dWIgY29kZSB0byBzYXRpc2Z5IE9TIGNvZGUgdGhhdCB0cmllcyAKKyAgICAgICAgdG8gY29tbXVuaWNhdGUgd2l0aCBjb250ZXh0cy4gVGhpcyBjbGFzcyBpcyB1c2VmdWwgaW4gdW5pdCB0ZXN0aW5nLgogICAgICAgPC9saT4KICAgICAgIDxsaT4KLSAgICAgICAge0BsaW5rIGFuZHJvaWQudGVzdC5SZW5hbWluZ0RlbGVnYXRpbmdDb250ZXh0fSAtIERlbGVnYXRlcyBtb3N0IGNvbnRleHQgZnVuY3Rpb25zIHRvIGFuIGV4aXN0aW5nLCBub3JtYWwgY29udGV4dCB3aGlsZSBjaGFuZ2luZyB0aGUgZGVmYXVsdCBmaWxlIGFuZCBkYXRhYmFzZQotICAgICAgICBuYW1lcyBpbiB0aGUgY29udGV4dC4gVXNlIHRoaXMgdG8gdGVzdCBmaWxlIGFuZCBkYXRhYmFzZSBvcGVyYXRpb25zIHdpdGggYSBub3JtYWwgc3lzdGVtIGNvbnRleHQsIHVzaW5nIHRlc3QgbmFtZXMuCisgICAgICAgIHtAbGluayBhbmRyb2lkLnRlc3QuUmVuYW1pbmdEZWxlZ2F0aW5nQ29udGV4dH0gLSBEZWxlZ2F0ZXMgbW9zdCBjb250ZXh0IGZ1bmN0aW9ucyB0byBhbiAKKyAgICAgICAgZXhpc3RpbmcsIG5vcm1hbCBjb250ZXh0IHdoaWxlIGNoYW5naW5nIHRoZSBkZWZhdWx0IGZpbGUgYW5kIGRhdGFiYXNlCisgICAgICAgIG5hbWVzIGluIHRoZSBjb250ZXh0LiBVc2UgdGhpcyB0byB0ZXN0IGZpbGUgYW5kIGRhdGFiYXNlIG9wZXJhdGlvbnMgd2l0aCBhIG5vcm1hbCBzeXN0ZW0gCisgICAgICAgIGNvbnRleHQsIHVzaW5nIHRlc3QgbmFtZXMuCiAgICAgICA8L2xpPgogICAgICAgPGxpPgotICAgICAgICB7QGxpbmsgYW5kcm9pZC50ZXN0Lm1vY2suTW9ja0FwcGxpY2F0aW9ufSwge0BsaW5rIGFuZHJvaWQudGVzdC5tb2NrLk1vY2tDb250ZW50UmVzb2x2ZXJ9LCB7QGxpbmsgYW5kcm9pZC50ZXN0Lm1vY2suTW9ja0NvbnRleHR9LAotICAgICAgICB7QGxpbmsgYW5kcm9pZC50ZXN0Lm1vY2suTW9ja0RpYWxvZ0ludGVyZmFjZX0sIHtAbGluayBhbmRyb2lkLnRlc3QubW9jay5Nb2NrUGFja2FnZU1hbmFnZXJ9LAotICAgICAgICB7QGxpbmsgYW5kcm9pZC50ZXN0Lm1vY2suTW9ja1Jlc291cmNlc30gLSBDbGFzc2VzIHRoYXQgY3JlYXRlIG1vY2sgQW5kcm9pZCBzeXN0ZW0gb2JqZWN0cyBmb3IgdXNlIGluIHRlc3RpbmcuIFRoZXkgZXhwb3NlIG9ubHkgdGhvc2UgbWV0aG9kcyB0aGF0IGFyZQotICAgICAgICB1c2VmdWwgaW4gbWFuYWdpbmcgdGhlIG9iamVjdC4gVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb25zIG9mIHRoZXNlIG1ldGhvZHMgc2ltcGx5IHRocm93IGFuIEV4Y2VwdGlvbi4gWW91IGFyZSBleHBlY3RlZCB0byBleHRlbmQgdGhlIGNsYXNzZXMgYW5kCi0gICAgICAgIG92ZXJyaWRlIGFueSBtZXRob2RzIHRoYXQgYXJlIGNhbGxlZCBieSB0aGUgYXBwbGljYXRpb24gdW5kZXIgdGVzdC4KKyAgICAgICAge0BsaW5rIGFuZHJvaWQudGVzdC5tb2NrLk1vY2tBcHBsaWNhdGlvbn0sIHtAbGluayBhbmRyb2lkLnRlc3QubW9jay5Nb2NrQ29udGVudFJlc29sdmVyfSwgCisgICAgICAgIHtAbGluayBhbmRyb2lkLnRlc3QubW9jay5Nb2NrQ29udGV4dH0sIHtAbGluayBhbmRyb2lkLnRlc3QubW9jay5Nb2NrRGlhbG9nSW50ZXJmYWNlfSwgCisgICAgICAgIHtAbGluayBhbmRyb2lkLnRlc3QubW9jay5Nb2NrUGFja2FnZU1hbmFnZXJ9LCB7QGxpbmsgYW5kcm9pZC50ZXN0Lm1vY2suTW9ja1Jlc291cmNlc30gLSAKKyAgICAgICAgQ2xhc3NlcyB0aGF0IGNyZWF0ZSBtb2NrIEFuZHJvaWQgc3lzdGVtIG9iamVjdHMgZm9yIHVzZSBpbiB0ZXN0aW5nLiBUaGV5IGV4cG9zZSBvbmx5IHRob3NlIAorICAgICAgICBtZXRob2RzIHRoYXQgYXJlIHVzZWZ1bCBpbiBtYW5hZ2luZyB0aGUgb2JqZWN0LiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlc2UgbWV0aG9kcworICAgICAgICBzaW1wbHkgdGhyb3cgYW4gRXhjZXB0aW9uLiBZb3UgYXJlIGV4cGVjdGVkIHRvIGV4dGVuZCB0aGUgY2xhc3NlcyBhbmQgb3ZlcnJpZGUgYW55IG1ldGhvZHMgJworICAgICAgICB0aGF0IGFyZSBjYWxsZWQgYnkgdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QuCiAgICAgICA8L2xpPgogICAgIDwvdWw+CiA8aDMgaWQ9Ikluc3RydW1lbnRhdGlvblRlc3RSdW5uZXIiPkluc3RydW1lbnRhdGlvbiBUZXN0IFJ1bm5lcjwvaDM+CiA8cD4KICAgQW5kcm9pZCBwcm92aWRlcyBhIGN1c3RvbSBjbGFzcyBmb3IgcnVubmluZyB0ZXN0cyB3aXRoIGluc3RydW1lbnRhdGlvbiBjYWxsZWQgY2FsbGVkCiAgIHtAbGluayBhbmRyb2lkLnRlc3QuSW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lcn0uIFRoaXMgY2xhc3MKLSAgY29udHJvbHMgb2YgdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QsIHJ1bnMgdGhlIHRlc3QgYXBwbGljYXRpb24gYW5kIHRoZSBtYWluIGFwcGxpY2F0aW9uIGluIHRoZSBzYW1lIHByb2Nlc3MsIGFuZCByb3V0ZXMKLSAgdGVzdCBvdXRwdXQgdG8gdGhlIGFwcHJvcHJpYXRlIHBsYWNlLiBVc2luZyBpbnN0cnVtZW50YXRpb24gaXMga2V5IHRvIHRoZSBhYmlsaXR5IG9mIDxjb2RlPkluc3RydW1lbnRhdGlvblRlc3RSdW5uZXI8L2NvZGU+IHRvIGNvbnRyb2wgdGhlIGVudGlyZSB0ZXN0Ci0gIGVudmlyb25tZW50IGF0IHJ1bnRpbWUuIE5vdGljZSB0aGF0IHlvdSB1c2UgdGhpcyB0ZXN0IHJ1bm5lciBldmVuIGlmIHlvdXIgdGVzdCBjbGFzcyBkb2VzIG5vdCBpdHNlbGYgdXNlIGluc3RydW1lbnRhdGlvbi4KKyAgY29udHJvbHMgb2YgdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QsIHJ1bnMgdGhlIHRlc3QgYXBwbGljYXRpb24gYW5kIHRoZSBtYWluIGFwcGxpY2F0aW9uIGluIHRoZSAKKyAgc2FtZSBwcm9jZXNzLCBhbmQgcm91dGVzIHRlc3Qgb3V0cHV0IHRvIHRoZSBhcHByb3ByaWF0ZSBwbGFjZS4gVXNpbmcgaW5zdHJ1bWVudGF0aW9uIGlzIGtleSB0byB0aGUKKyAgYWJpbGl0eSBvZiA8Y29kZT5JbnN0cnVtZW50YXRpb25UZXN0UnVubmVyPC9jb2RlPiB0byBjb250cm9sIHRoZSBlbnRpcmUgdGVzdAorICBlbnZpcm9ubWVudCBhdCBydW50aW1lLiBOb3RpY2UgdGhhdCB5b3UgdXNlIHRoaXMgdGVzdCBydW5uZXIgZXZlbiBpZiB5b3VyIHRlc3QgY2xhc3MgZG9lcyBub3QgCisgIGl0c2VsZiB1c2UgaW5zdHJ1bWVudGF0aW9uLgogPC9wPgogPHA+Ci0gIFdoZW4geW91IHJ1biBhIHRlc3QgYXBwbGljYXRpb24sIHlvdSBmaXJzdCBydW4gYSBzeXN0ZW0gdXRpbGl0eSBjYWxsZWQgQWN0aXZpdHkgTWFuYWdlci4gQWN0aXZpdHkgTWFuYWdlciB1c2VzIHRoZSBpbnN0cnVtZW50YXRpb24gZnJhbWV3b3JrIHRvIHN0YXJ0IGFuZCBjb250cm9sIHRoZSB0ZXN0IHJ1bm5lciwgd2hpY2ggaW4gdHVybiB1c2VzIGluc3RydW1lbnRhdGlvbiB0byBzaHV0IGRvd24gYW55IHJ1bm5pbmcgaW5zdGFuY2VzCi0gIG9mIHRoZSBtYWluIGFwcGxpY2F0aW9uLCBzdGFydHMgdGhlIHRlc3QgYXBwbGljYXRpb24sIGFuZCB0aGVuIHN0YXJ0cyB0aGUgbWFpbiBhcHBsaWNhdGlvbiBpbiB0aGUgc2FtZSBwcm9jZXNzLiBUaGlzIGFsbG93cyB2YXJpb3VzIGFzcGVjdHMgb2YgdGhlIHRlc3QgYXBwbGljYXRpb24gdG8gd29yayBkaXJlY3RseSB3aXRoIHRoZSBtYWluIGFwcGxpY2F0aW9uLgorICBXaGVuIHlvdSBydW4gYSB0ZXN0IGFwcGxpY2F0aW9uLCB5b3UgZmlyc3QgcnVuIGEgc3lzdGVtIHV0aWxpdHkgY2FsbGVkIEFjdGl2aXR5IE1hbmFnZXIuIEFjdGl2aXR5IAorICBNYW5hZ2VyIHVzZXMgdGhlIGluc3RydW1lbnRhdGlvbiBmcmFtZXdvcmsgdG8gc3RhcnQgYW5kIGNvbnRyb2wgdGhlIHRlc3QgcnVubmVyLCB3aGljaCBpbiB0dXJuIAorICB1c2VzIGluc3RydW1lbnRhdGlvbiB0byBzaHV0IGRvd24gYW55IHJ1bm5pbmcgaW5zdGFuY2VzIG9mIHRoZSBtYWluIGFwcGxpY2F0aW9uLCBzdGFydHMgdGhlIHRlc3QgCisgIGFwcGxpY2F0aW9uLCBhbmQgdGhlbiBzdGFydHMgdGhlIG1haW4gYXBwbGljYXRpb24gaW4gdGhlIHNhbWUgcHJvY2Vzcy4gVGhpcyBhbGxvd3MgdmFyaW91cyAKKyAgYXNwZWN0cyBvZiB0aGUgdGVzdCBhcHBsaWNhdGlvbiB0byB3b3JrIGRpcmVjdGx5IHdpdGggdGhlIG1haW4gYXBwbGljYXRpb24uCiA8L3A+CiA8cD4KLSAgSWYgeW91IGFyZSBkZXZlbG9waW5nIGluIEVjbGlwc2UsIHRoZSBBRFQgcGx1Z2luIGFzc2lzdHMgeW91IGluIHRoZSBzZXR1cCBvZiA8Y29kZT5JbnN0cnVtZW50YXRpb25UZXN0UnVubmVyPC9jb2RlPiBvciBvdGhlciB0ZXN0IHJ1bm5lcnMuCi0gIFRoZSBwbHVnaW4gVUkgcHJvbXB0cyB5b3UgdG8gc3BlY2lmeSB0aGUgdGVzdCBydW5uZXIgY2xhc3MgdG8gdXNlLCBhcyB3ZWxsIGFzIHRoZSBwYWNrYWdlIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QuCi0gIFRoZSBwbHVnaW4gdGhlbiBhZGRzIGFuIDxjb2RlPiZsdDtpbnN0cnVtZW50YXRpb24mZ3Q7PC9jb2RlPiBlbGVtZW50IHdpdGggYXBwcm9wcmlhdGUgYXR0cmlidXRlcyB0byB0aGUgbWFuaWZlc3QgZmlsZSBvZiB0aGUgdGVzdCBhcHBsaWNhdGlvbi4KLSAgRWNsaXBzZSB3aXRoIEFEVCBhdXRvbWF0aWNhbGx5IHN0YXJ0cyBhIHRlc3QgYXBwbGljYXRpb24gdW5kZXIgdGhlIGNvbnRyb2wgb2YgQWN0aXZpdHkgTWFuYWdlciB1c2luZyBpbnN0cnVtZW50YXRpb24sCi0gIGFuZCByZWRpcmVjdHMgdGhlIHRlc3Qgb3V0cHV0IHRvIHRoZSBFY2xpcHNlIHdpbmRvdydzIEpVbml0IHZpZXcuCisgIElmIHlvdSBhcmUgZGV2ZWxvcGluZyBpbiBFY2xpcHNlLCB0aGUgQURUIHBsdWdpbiBhc3Npc3RzIHlvdSBpbiB0aGUgc2V0dXAgb2YgCisgIDxjb2RlPkluc3RydW1lbnRhdGlvblRlc3RSdW5uZXI8L2NvZGU+IG9yIG90aGVyIHRlc3QgcnVubmVycy4gVGhlIHBsdWdpbiBVSSBwcm9tcHRzIHlvdSB0byBzcGVjaWZ5IAorICB0aGUgdGVzdCBydW5uZXIgY2xhc3MgdG8gdXNlLCBhcyB3ZWxsIGFzIHRoZSBwYWNrYWdlIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QuCisgIFRoZSBwbHVnaW4gdGhlbiBhZGRzIGFuIDxjb2RlPiZsdDtpbnN0cnVtZW50YXRpb24mZ3Q7PC9jb2RlPiBlbGVtZW50IHdpdGggYXBwcm9wcmlhdGUgYXR0cmlidXRlcyAKKyAgdG8gdGhlIG1hbmlmZXN0IGZpbGUgb2YgdGhlIHRlc3QgYXBwbGljYXRpb24uIEVjbGlwc2Ugd2l0aCBBRFQgYXV0b21hdGljYWxseSBzdGFydHMgYSB0ZXN0IAorICBhcHBsaWNhdGlvbiB1bmRlciB0aGUgY29udHJvbCBvZiBBY3Rpdml0eSBNYW5hZ2VyIHVzaW5nIGluc3RydW1lbnRhdGlvbiwgYW5kIHJlZGlyZWN0cyB0aGUgdGVzdCAKKyAgb3V0cHV0IHRvIHRoZSBFY2xpcHNlIHdpbmRvdydzIEpVbml0IHZpZXcuCiA8L3A+CiA8cD4KICAgSWYgeW91IHByZWZlciB3b3JraW5nIGZyb20gdGhlIGNvbW1hbmQgbGluZSwgeW91IGNhbiB1c2UgQW50IGFuZCB0aGUgPGNvZGU+YW5kcm9pZDwvY29kZT4KQEAgLTI4OSw2OCArMzM4LDEwNSBAQAogPC9wPgogPGgyIGlkPSJUZXN0RW52aXJvbWVudCI+V29ya2luZyBpbiB0aGUgVGVzdCBFbnZpcm9ubWVudDwvaDI+CiA8cD4KLSAgICBUaGUgdGVzdHMgZm9yIGFuIEFuZHJvaWQgYXBwbGljYXRpb24gYXJlIGNvbnRhaW5lZCBpbiBhIHRlc3QgYXBwbGljYXRpb24sIHdoaWNoIGl0c2VsZiBpcyBhbiBBbmRyb2lkIGFwcGxpY2F0aW9uLiBBIHRlc3QgYXBwbGljYXRpb24gcmVzaWRlcyBpbiBhIHNlcGFyYXRlIEFuZHJvaWQgcHJvamVjdCB0aGF0IGhhcyB0aGUKLSAgICBzYW1lIGZpbGVzIGFuZCBkaXJlY3RvcmllcyBhcyBhIHJlZ3VsYXIgQW5kcm9pZCBhcHBsaWNhdGlvbi4gVGhlIHRlc3QgcHJvamVjdCBpcyBsaW5rZWQgdG8gdGhlIHByb2plY3Qgb2YgdGhlIGFwcGxpY2F0aW9uIGl0IHRlc3RzCi0gICAgKGtub3duIGFzIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0KSBieSBpdHMgbWFuaWZlc3QgZmlsZS4KKyAgICBUaGUgdGVzdHMgZm9yIGFuIEFuZHJvaWQgYXBwbGljYXRpb24gYXJlIGNvbnRhaW5lZCBpbiBhIHRlc3QgYXBwbGljYXRpb24sIHdoaWNoIGl0c2VsZiBpcyBhbiAKKyAgICBBbmRyb2lkIGFwcGxpY2F0aW9uLiBBIHRlc3QgYXBwbGljYXRpb24gcmVzaWRlcyBpbiBhIHNlcGFyYXRlIEFuZHJvaWQgcHJvamVjdCB0aGF0IGhhcyB0aGUKKyAgICBzYW1lIGZpbGVzIGFuZCBkaXJlY3RvcmllcyBhcyBhIHJlZ3VsYXIgQW5kcm9pZCBhcHBsaWNhdGlvbi4gVGhlIHRlc3QgcHJvamVjdCBpcyBsaW5rZWQgdG8gdGhlIAorICAgIHByb2plY3Qgb2YgdGhlIGFwcGxpY2F0aW9uIGl0IHRlc3RzIChrbm93biBhcyB0aGUgYXBwbGljYXRpb24gdW5kZXIgdGVzdCkgYnkgaXRzIG1hbmlmZXN0IGZpbGUuCiA8L3A+CiA8cD4KICAgICBFYWNoIHRlc3QgYXBwbGljYXRpb24gY29udGFpbnMgb25lIG9yIG1vcmUgdGVzdCBjYXNlIGNsYXNzZXMgYmFzZWQgb24gYW4gQW5kcm9pZCBjbGFzcyBmb3IgYQotICAgIHBhcnRpY3VsYXIgdHlwZSBvZiBjb21wb25lbnQuIFRoZSB0ZXN0IGNhc2UgY2xhc3MgY29udGFpbnMgbWV0aG9kcyB0aGF0IGRlZmluZSB0ZXN0cyBvbiBzb21lIHBhcnQgb2YgdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QuIFdoZW4geW91IHJ1biB0aGUgdGVzdCBhcHBsaWNhdGlvbiwgQW5kcm9pZAotICAgIHN0YXJ0cyBpdCwgbG9hZHMgdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QgaW50byB0aGUgc2FtZSBwcm9jZXNzLCBhbmQgdGhlbiBpbnZva2VzIGVhY2ggbWV0aG9kIGluIHRoZSB0ZXN0IGNhc2UgY2xhc3MuCisgICAgcGFydGljdWxhciB0eXBlIG9mIGNvbXBvbmVudC4gVGhlIHRlc3QgY2FzZSBjbGFzcyBjb250YWlucyBtZXRob2RzIHRoYXQgZGVmaW5lIHRlc3RzIG9uIHNvbWUgCisgICAgcGFydCBvZiB0aGUgYXBwbGljYXRpb24gdW5kZXIgdGVzdC4gV2hlbiB5b3UgcnVuIHRoZSB0ZXN0IGFwcGxpY2F0aW9uLCBBbmRyb2lkCisgICAgc3RhcnRzIGl0LCBsb2FkcyB0aGUgYXBwbGljYXRpb24gdW5kZXIgdGVzdCBpbnRvIHRoZSBzYW1lIHByb2Nlc3MsIGFuZCB0aGVuIGludm9rZXMgZWFjaCBtZXRob2QgCisgICAgaW4gdGhlIHRlc3QgY2FzZSBjbGFzcy4KIDwvcD4KIDxwPgotICAgIFRoZSB0b29scyBhbmQgcHJvY2VkdXJlcyB5b3UgdXNlIHdpdGggdGVzdGluZyBkZXBlbmQgb24gdGhlIGRldmVsb3BtZW50IGVudmlyb25tZW50IHlvdSBhcmUgdXNpbmcuIElmIHlvdSB1c2UgRWNsaXBzZSwgdGhlbiB0aGUgQURUIHBsdWcgaW4gZm9yIEVjbGlwc2UgcHJvdmlkZXMgdG9vbHMgdGhhdAotICAgIGFsbG93IHlvdSB0byBkZXZlbG9wIGFuZCBydW4gdGVzdHMgZW50aXJlbHkgd2l0aGluIEVjbGlwc2UuIFRoaXMgaXMgZG9jdW1lbnRlZCBpbiB0aGUgdG9waWMgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL2RldmVsb3BpbmcvdGVzdGluZy90ZXN0aW5nX2VjbGlwc2UuaHRtbCI+VGVzdGluZyBpbiBFY2xpcHNlLCB3aXRoIEFEVDwvYT4uCi0gICAgSWYgeW91IHVzZSBhbm90aGVyIGRldmVsb3BtZW50IGVudmlyb25tZW50LCB0aGVuIHlvdSB1c2UgQW5kcm9pZCdzIGNvbW1hbmQtbGluZSB0b29scywgYXMgZG9jdW1lbnRlZCBpbiB0aGUgdG9waWMgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL2RldmVsb3BpbmcvdGVzdGluZy90ZXN0aW5nX290aGVyaWRlLmh0bWwiPlRlc3RpbmcgaW4gT3RoZXIgSURFczwvYT4uCisgICAgVGhlIHRvb2xzIGFuZCBwcm9jZWR1cmVzIHlvdSB1c2Ugd2l0aCB0ZXN0aW5nIGRlcGVuZCBvbiB0aGUgZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQgeW91IGFyZSAKKyAgICB1c2luZy4gSWYgeW91IHVzZSBFY2xpcHNlLCB0aGVuIHRoZSBBRFQgcGx1ZyBpbiBmb3IgRWNsaXBzZSBwcm92aWRlcyB0b29scyB0aGF0IGFsbG93IHlvdSB0byAKKyAgICBkZXZlbG9wIGFuZCBydW4gdGVzdHMgZW50aXJlbHkgd2l0aGluIEVjbGlwc2UuIFRoaXMgaXMgZG9jdW1lbnRlZCBpbiB0aGUgdG9waWMgCisgICAgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL2RldmVsb3BpbmcvdGVzdGluZy90ZXN0aW5nX2VjbGlwc2UuaHRtbCI+CisgICAgVGVzdGluZyBpbiBFY2xpcHNlLCB3aXRoIEFEVDwvYT4uIElmIHlvdSB1c2UgYW5vdGhlciBkZXZlbG9wbWVudCBlbnZpcm9ubWVudCwgdGhlbiB5b3UgdXNlIAorICAgIEFuZHJvaWQncyBjb21tYW5kLWxpbmUgdG9vbHMsIGFzIGRvY3VtZW50ZWQgaW4gdGhlIHRvcGljIAorICAgIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9kZXZlbG9waW5nL3Rlc3RpbmcvdGVzdGluZ19vdGhlcmlkZS5odG1sIj5UZXN0aW5nIGluIE90aGVyIElERXM8L2E+LgogPC9wPgogPGgzIGlkPSJUZXN0UHJvamVjdHMiPldvcmtpbmcgd2l0aCB0ZXN0IHByb2plY3RzPC9oMz4KIDxwPgotICAgIFRvIHN0YXJ0IHRlc3RpbmcgYW4gQW5kcm9pZCBhcHBsaWNhdGlvbiwgeW91IGNyZWF0ZSBhIHRlc3QgcHJvamVjdCBmb3IgaXQgdXNpbmcgQW5kcm9pZCB0b29scy4gVGhlIHRvb2xzIGNyZWF0ZSB0aGUgcHJvamVjdCBkaXJlY3RvcnkgYW5kIHRoZSBmaWxlcyBhbmQgc3ViZGlyZWN0b3JpZXMgbmVlZGVkLgotICAgIFRoZSB0b29scyBhbHNvIGNyZWF0ZSBhIG1hbmlmZXN0IGZpbGUgdGhhdCBsaW5rcyB0aGUgYXBwbGljYXRpb24gaW4gdGhlIHRlc3QgcHJvamVjdCB0byB0aGUgYXBwbGljYXRpb24gdW5kZXIgdGVzdC4gVGhlIHByb2NlZHVyZSBmb3IgY3JlYXRpbmcgYSB0ZXN0IHByb2plY3QgaW4gRWNsaXBzZSB3aXRoCi0gICAgQURUIGlzIGRvY3VtZW50ZWQgaW4gPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL2RldmVsb3BpbmcvdGVzdGluZy90ZXN0aW5nX2VjbGlwc2UuaHRtbCI+VGVzdGluZyBpbiBFY2xpcHNlLCB3aXRoIEFEVDwvYT4uIFRoZSBwcm9jZWR1cmUgZm9yIGNyZWF0aW5nIGEgdGVzdCBwcm9qZWN0IGZvciB1c2Ugd2l0aCBkZXZlbG9wbWVudAotICAgIHRvb2xzIG90aGVyIHRoYW4gRWNsaXBzZSBpcyBkb2N1bWVudGVkIGluIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9kZXZlbG9waW5nL3Rlc3RpbmcvdGVzdGluZ19vdGhlcmlkZS5odG1sIj5UZXN0aW5nIGluIE90aGVyIElERXM8L2E+LgorICAgIFRvIHN0YXJ0IHRlc3RpbmcgYW4gQW5kcm9pZCBhcHBsaWNhdGlvbiwgeW91IGNyZWF0ZSBhIHRlc3QgcHJvamVjdCBmb3IgaXQgdXNpbmcgQW5kcm9pZCB0b29scy4gCisgICAgVGhlIHRvb2xzIGNyZWF0ZSB0aGUgcHJvamVjdCBkaXJlY3RvcnkgYW5kIHRoZSBmaWxlcyBhbmQgc3ViZGlyZWN0b3JpZXMgbmVlZGVkLgorICAgIFRoZSB0b29scyBhbHNvIGNyZWF0ZSBhIG1hbmlmZXN0IGZpbGUgdGhhdCBsaW5rcyB0aGUgYXBwbGljYXRpb24gaW4gdGhlIHRlc3QgcHJvamVjdCB0byB0aGUgCisgICAgYXBwbGljYXRpb24gdW5kZXIgdGVzdC4gVGhlIHByb2NlZHVyZSBmb3IgY3JlYXRpbmcgYSB0ZXN0IHByb2plY3QgaW4gRWNsaXBzZSB3aXRoIEFEVCBpcyAKKyAgICBkb2N1bWVudGVkIGluIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9kZXZlbG9waW5nL3Rlc3RpbmcvdGVzdGluZ19lY2xpcHNlLmh0bWwiPgorICAgIFRlc3RpbmcgaW4gRWNsaXBzZSwgd2l0aCBBRFQ8L2E+LiBUaGUgcHJvY2VkdXJlIGZvciBjcmVhdGluZyBhIHRlc3QgcHJvamVjdCBmb3IgdXNlIHdpdGggCisgICAgZGV2ZWxvcG1lbnQgdG9vbHMgb3RoZXIgdGhhbiBFY2xpcHNlIGlzIGRvY3VtZW50ZWQgaW4gCisgICAgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL2RldmVsb3BpbmcvdGVzdGluZy90ZXN0aW5nX290aGVyaWRlLmh0bWwiPlRlc3RpbmcgaW4gT3RoZXIgSURFczwvYT4uCiA8L3A+CiA8aDMgaWQ9IlRlc3RDbGFzc2VzIj5Xb3JraW5nIHdpdGggdGVzdCBjYXNlIGNsYXNzZXM8L2gzPgogPHA+Ci0gICAgQSB0ZXN0IGFwcGxpY2F0aW9uIGNvbnRhaW5zIG9uZSBvciBtb3JlIHRlc3QgY2FzZSBjbGFzc2VzIHRoYXQgZXh0ZW5kIGFuIEFuZHJvaWQgdGVzdCBjYXNlIGNsYXNzLiBZb3UgY2hvb3NlIGEgdGVzdCBjYXNlIGNsYXNzIGJhc2VkIG9uIHRoZSB0eXBlIG9mIEFuZHJvaWQgY29tcG9uZW50IHlvdSBhcmUgdGVzdGluZyBhbmQgdGhlCi0gICAgdGVzdHMgeW91IGFyZSBkb2luZy4gQSB0ZXN0IGFwcGxpY2F0aW9uIGNhbiB0ZXN0IGRpZmZlcmVudCBjb21wb25lbnRzLCBidXQgZWFjaCB0ZXN0IGNhc2UgY2xhc3MgaXMgZGVzaWduZWQgdG8gdGVzdCBhIHNpbmdsZSB0eXBlIG9mIGNvbXBvbmVudC4KLSAgICBUaGUgQW5kcm9pZCB0ZXN0IGNhc2UgY2xhc3NlcyBhcmUgZGVzY3JpYmVkIGluIHRoZSBzZWN0aW9uIDxhIGhyZWY9IiNUZXN0QVBJIj5UaGUgVGVzdGluZyBBUEk8L2E+LgorICAgIEEgdGVzdCBhcHBsaWNhdGlvbiBjb250YWlucyBvbmUgb3IgbW9yZSB0ZXN0IGNhc2UgY2xhc3NlcyB0aGF0IGV4dGVuZCBhbiBBbmRyb2lkIHRlc3QgY2FzZSAKKyAgICBjbGFzcy4gWW91IGNob29zZSBhIHRlc3QgY2FzZSBjbGFzcyBiYXNlZCBvbiB0aGUgdHlwZSBvZiBBbmRyb2lkIGNvbXBvbmVudCB5b3UgYXJlIHRlc3RpbmcgYW5kIAorICAgIHRoZSB0ZXN0cyB5b3UgYXJlIGRvaW5nLiBBIHRlc3QgYXBwbGljYXRpb24gY2FuIHRlc3QgZGlmZmVyZW50IGNvbXBvbmVudHMsIGJ1dCBlYWNoIHRlc3QgY2FzZSAKKyAgICBjbGFzcyBpcyBkZXNpZ25lZCB0byB0ZXN0IGEgc2luZ2xlIHR5cGUgb2YgY29tcG9uZW50LiBUaGUgQW5kcm9pZCB0ZXN0IGNhc2UgY2xhc3NlcyBhcmUgCisgICAgZGVzY3JpYmVkIGluIHRoZSBzZWN0aW9uIDxhIGhyZWY9IiNUZXN0QVBJIj5UaGUgVGVzdGluZyBBUEk8L2E+LgogPC9wPgogPHA+Ci0gICAgU29tZSBBbmRyb2lkIGNvbXBvbmVudHMgaGF2ZSBtb3JlIHRoYW4gb25lIGFzc29jaWF0ZWQgdGVzdCBjYXNlIGNsYXNzLiBJbiB0aGlzIGNhc2UsIHlvdSBjaG9vc2UgYW1vbmcgdGhlIGF2YWlsYWJsZSBjbGFzc2VzIGJhc2VkIG9uIHRoZSB0eXBlIG9mIHRlc3RzIHlvdSB3YW50IHRvIGRvLiBGb3IgYWN0aXZpdGllcywKLSAgICBmb3IgZXhhbXBsZSwgeW91IGhhdmUgdGhlIGNob2ljZSBvZiBlaXRoZXIge0BsaW5rIGFuZHJvaWQudGVzdC5BY3Rpdml0eUluc3RydW1lbnRhdGlvblRlc3RDYXNlMn0gb3Ige0BsaW5rIGFuZHJvaWQudGVzdC5BY3Rpdml0eVVuaXRUZXN0Q2FzZX0uCisgICAgU29tZSBBbmRyb2lkIGNvbXBvbmVudHMgaGF2ZSBtb3JlIHRoYW4gb25lIGFzc29jaWF0ZWQgdGVzdCBjYXNlIGNsYXNzLiBJbiB0aGlzIGNhc2UsIHlvdSBjaG9vc2UgCisgICAgYW1vbmcgdGhlIGF2YWlsYWJsZSBjbGFzc2VzIGJhc2VkIG9uIHRoZSB0eXBlIG9mIHRlc3RzIHlvdSB3YW50IHRvIGRvLiBGb3IgYWN0aXZpdGllcywgZm9yIAorICAgIGV4YW1wbGUsIHlvdSBoYXZlIHRoZSBjaG9pY2Ugb2YgZWl0aGVyIHtAbGluayBhbmRyb2lkLnRlc3QuQWN0aXZpdHlJbnN0cnVtZW50YXRpb25UZXN0Q2FzZTJ9IG9yIAorICAgIHtAbGluayBhbmRyb2lkLnRlc3QuQWN0aXZpdHlVbml0VGVzdENhc2V9LgogPHA+Ci0gICAgPGNvZGU+QWN0aXZpdHlJbnN0cnVtZW50YXRpb25UZXN0Q2FzZTI8L2NvZGU+IGlzIGRlc2lnbmVkIHRvIGRvIGZ1bmN0aW9uYWwgdGVzdGluZywgc28gaXQgdGVzdHMgYWN0aXZpdGllcyBpbiBhIG5vcm1hbCBzeXN0ZW0gaW5mcmFzdHJ1Y3R1cmUuIFlvdSBjYW4gaW5qZWN0IG1vY2tlZCBJbnRlbnRzLCBidXQgbm90CisgICAgPGNvZGU+QWN0aXZpdHlJbnN0cnVtZW50YXRpb25UZXN0Q2FzZTI8L2NvZGU+IGlzIGRlc2lnbmVkIHRvIGRvIGZ1bmN0aW9uYWwgdGVzdGluZywgc28gaXQgdGVzdHMgCisgICAgYWN0aXZpdGllcyBpbiBhIG5vcm1hbCBzeXN0ZW0gaW5mcmFzdHJ1Y3R1cmUuIFlvdSBjYW4gaW5qZWN0IG1vY2tlZCBJbnRlbnRzLCBidXQgbm90CiAgICAgbW9ja2VkIENvbnRleHRzLiBJbiBnZW5lcmFsLCB5b3UgY2FuJ3QgbW9jayBkZXBlbmRlbmNpZXMgZm9yIHRoZSBhY3Rpdml0eSB1bmRlciB0ZXN0LgogPC9wPgogPHA+Ci0gICAgSW4gY29tcGFyaXNvbiwgPGNvZGU+QWN0aXZpdHlVbml0VGVzdENhc2U8L2NvZGU+IGlzIGRlc2lnbmVkIGZvciB1bml0IHRlc3RpbmcsIHNvIGl0IHRlc3RzIGFjdGl2aXRpZXMgaW4gYW4gaXNvbGF0ZWQgc3lzdGVtIGluZnJhc3RydWN0dXJlLiBZb3UgY2FuIGluamVjdCBtb2NrZWQgb3Igd3JhcHBlcmVkIGRlcGVuZGVuY2llcyBmb3IKLSAgICB0aGUgYWN0aXZpdHkgdW5kZXIgdGVzdCwgcGFydGljdWxhcmx5IG1vY2tlZCBDb250ZXh0cy4gT24gdGhlIG90aGVyIGhhbmQsIHdoZW4geW91IHVzZSB0aGlzIHRlc3QgY2FzZSBjbGFzcyB0aGUgYWN0aXZpdHkgdW5kZXIgdGVzdCBydW5zIGluIGlzb2xhdGlvbiBhbmQgY2FuJ3QgaW50ZXJhY3Qgd2l0aCBvdGhlciBhY3Rpdml0aWVzLgorICAgIEluIGNvbXBhcmlzb24sIDxjb2RlPkFjdGl2aXR5VW5pdFRlc3RDYXNlPC9jb2RlPiBpcyBkZXNpZ25lZCBmb3IgdW5pdCB0ZXN0aW5nLCBzbyBpdCB0ZXN0cyAKKyAgICBhY3Rpdml0aWVzIGluIGFuIGlzb2xhdGVkIHN5c3RlbSBpbmZyYXN0cnVjdHVyZS4gWW91IGNhbiBpbmplY3QgbW9ja2VkIG9yIHdyYXBwZXJlZCAKKyAgICBkZXBlbmRlbmNpZXMgZm9yIHRoZSBhY3Rpdml0eSB1bmRlciB0ZXN0LCBwYXJ0aWN1bGFybHkgbW9ja2VkIENvbnRleHRzLiBPbiB0aGUgb3RoZXIgaGFuZCwgCisgICAgd2hlbiB5b3UgdXNlIHRoaXMgdGVzdCBjYXNlIGNsYXNzIHRoZSBhY3Rpdml0eSB1bmRlciB0ZXN0IHJ1bnMgaW4gaXNvbGF0aW9uIGFuZCBjYW4ndCBpbnRlcmFjdCAKKyAgICB3aXRoIG90aGVyIGFjdGl2aXRpZXMuCiA8L3A+CiA8cD4KLSAgICBBcyBhIHJ1bGUgb2YgdGh1bWIsIGlmIHlvdSB3YW50ZWQgdG8gdGVzdCBhbiBhY3Rpdml0eSdzIGludGVyYWN0aW9uIHdpdGggdGhlIHJlc3Qgb2YgQW5kcm9pZCwgeW91IHdvdWxkIHVzZSA8Y29kZT5BY3Rpdml0eUluc3RydW1lbnRhdGlvblRlc3RDYXNlMjwvY29kZT4uIElmIHlvdSB3YW50ZWQgdG8gZG8gcmVncmVzc2lvbiB0ZXN0aW5nCi0gICAgb24gYW4gYWN0aXZpdHksIHlvdSB3b3VsZCB1c2UgPGNvZGU+QWN0aXZpdHlVbml0VGVzdENhc2U8L2NvZGU+LgorICAgIEFzIGEgcnVsZSBvZiB0aHVtYiwgaWYgeW91IHdhbnRlZCB0byB0ZXN0IGFuIGFjdGl2aXR5J3MgaW50ZXJhY3Rpb24gd2l0aCB0aGUgcmVzdCBvZiBBbmRyb2lkLCAKKyAgICB5b3Ugd291bGQgdXNlIDxjb2RlPkFjdGl2aXR5SW5zdHJ1bWVudGF0aW9uVGVzdENhc2UyPC9jb2RlPi4gSWYgeW91IHdhbnRlZCB0byBkbyByZWdyZXNzaW9uIAorICAgIHRlc3Rpbmcgb24gYW4gYWN0aXZpdHksIHlvdSB3b3VsZCB1c2UgPGNvZGU+QWN0aXZpdHlVbml0VGVzdENhc2U8L2NvZGU+LgogPC9wPgogPGgzIGlkPSJUZXN0cyI+V29ya2luZyB3aXRoIHRlc3QgbWV0aG9kczwvaDM+CiA8cD4KLSAgICBFYWNoIHRlc3QgY2FzZSBjbGFzcyBwcm92aWRlcyBtZXRob2RzIHRoYXQgeW91IHVzZSB0byBzZXQgdXAgdGhlIHRlc3QgZW52aXJvbm1lbnQgYW5kIGNvbnRyb2wgdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QuIEZvciBleGFtcGxlLCBhbGwgdGVzdCBjYXNlIGNsYXNzZXMgcHJvdmlkZSB0aGUgSlVuaXQge0BsaW5rIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSNzZXRVcCgpIHNldFVwKCl9Ci0gICAgbWV0aG9kIHRoYXQgeW91IGNhbiBvdmVycmlkZSB0byBzZXQgdXAgZml4dHVyZXMuIEluIGFkZGl0aW9uLCB5b3UgYWRkIG1ldGhvZHMgdG8gdGhlIGNsYXNzIHRvIGRlZmluZSBpbmRpdmlkdWFsIHRlc3RzLiBFYWNoIG1ldGhvZCB5b3UgYWRkIGlzIHJ1biBvbmNlIGVhY2ggdGltZSB5b3UgcnVuIHRoZSB0ZXN0IGFwcGxpY2F0aW9uLiBJZiB5b3Ugb3ZlcnJpZGUgdGhlIDxjb2RlPnNldFVwKCk8L2NvZGU+Ci0gICAgbWV0aG9kLCBpdCBydW5zIGJlZm9yZSBlYWNoIG9mIHlvdXIgbWV0aG9kcy4gU2ltaWxhcmx5LCB0aGUgSlVuaXQge0BsaW5rIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSN0ZWFyRG93bigpIHRlYXJEb3duKCl9IG1ldGhvZCBpcyBydW4gb25jZSBhZnRlciBlYWNoIG9mIHlvdXIgbWV0aG9kcy4KKyAgICBFYWNoIHRlc3QgY2FzZSBjbGFzcyBwcm92aWRlcyBtZXRob2RzIHRoYXQgeW91IHVzZSB0byBzZXQgdXAgdGhlIHRlc3QgZW52aXJvbm1lbnQgYW5kIGNvbnRyb2wgCisgICAgdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QuIEZvciBleGFtcGxlLCBhbGwgdGVzdCBjYXNlIGNsYXNzZXMgcHJvdmlkZSB0aGUgSlVuaXQgCisgICAge0BsaW5rIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSNzZXRVcCgpIHNldFVwKCl9IG1ldGhvZCB0aGF0IHlvdSBjYW4gb3ZlcnJpZGUgdG8gc2V0IHVwIAorICAgIGZpeHR1cmVzLiBJbiBhZGRpdGlvbiwgeW91IGFkZCBtZXRob2RzIHRvIHRoZSBjbGFzcyB0byBkZWZpbmUgaW5kaXZpZHVhbCB0ZXN0cy4gRWFjaCBtZXRob2QgeW91CisgICAgYWRkIGlzIHJ1biBvbmNlIGVhY2ggdGltZSB5b3UgcnVuIHRoZSB0ZXN0IGFwcGxpY2F0aW9uLiBJZiB5b3Ugb3ZlcnJpZGUgdGhlIDxjb2RlPnNldFVwKCk8L2NvZGU+CisgICAgbWV0aG9kLCBpdCBydW5zIGJlZm9yZSBlYWNoIG9mIHlvdXIgbWV0aG9kcy4gU2ltaWxhcmx5LCB0aGUgSlVuaXQgCisgICAge0BsaW5rIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSN0ZWFyRG93bigpIHRlYXJEb3duKCl9IG1ldGhvZCBpcyBydW4gb25jZSBhZnRlciBlYWNoIG9mIAorICAgIHlvdXIgbWV0aG9kcy4KIDwvcD4KIDxwPgotICAgIFRoZSB0ZXN0IGNhc2UgY2xhc3NlcyBnaXZlIHlvdSBzdWJzdGFudGlhbCBjb250cm9sIG92ZXIgc3RhcnRpbmcgYW5kIHN0b3BwaW5nIGNvbXBvbmVudHMuIEZvciB0aGlzIHJlYXNvbiwgeW91IGhhdmUgdG8gc3BlY2lmaWNhbGx5IHRlbGwgQW5kcm9pZCB0byBzdGFydCBhIGNvbXBvbmVudCBiZWZvcmUgeW91IHJ1biB0ZXN0cyBhZ2FpbnN0IGl0LiBGb3IgZXhhbXBsZSwgeW91IHVzZSB0aGUKLSAgICB7QGxpbmsgYW5kcm9pZC50ZXN0LkFjdGl2aXR5SW5zdHJ1bWVudGF0aW9uVGVzdENhc2UyI2dldEFjdGl2aXR5KCl9IG1ldGhvZCB0byBzdGFydCB0aGUgYWN0aXZpdHkgdW5kZXIgdGVzdC4gWW91IGNhbiBjYWxsIHRoaXMgbWV0aG9kIG9uY2UgZHVyaW5nIHRoZSBlbnRpcmUgdGVzdCBjYXNlLCBvciBvbmNlIGZvciBlYWNoIHRlc3QgbWV0aG9kLiBZb3UgY2FuIGV2ZW4gZGVzdHJveSB0aGUKLSAgICBhY3Rpdml0eSB1bmRlciB0ZXN0IGJ5IGNhbGxpbmcgaXRzIHtAbGluayBhbmRyb2lkLmFwcC5BY3Rpdml0eSNmaW5pc2goKX0gbWV0aG9kIGFuZCB0aGVuIHJlc3RhcnQgaXQgd2l0aCA8Y29kZT5nZXRBY3Rpdml0eSgpPC9jb2RlPiB3aXRoaW4gYSBzaW5nbGUgdGVzdCBtZXRob2QuCisgICAgVGhlIHRlc3QgY2FzZSBjbGFzc2VzIGdpdmUgeW91IHN1YnN0YW50aWFsIGNvbnRyb2wgb3ZlciBzdGFydGluZyBhbmQgc3RvcHBpbmcgY29tcG9uZW50cy4gRm9yIAorICAgIHRoaXMgcmVhc29uLCB5b3UgaGF2ZSB0byBzcGVjaWZpY2FsbHkgdGVsbCBBbmRyb2lkIHRvIHN0YXJ0IGEgY29tcG9uZW50IGJlZm9yZSB5b3UgcnVuIHRlc3RzIAorICAgIGFnYWluc3QgaXQuIEZvciBleGFtcGxlLCB5b3UgdXNlIHRoZQorICAgIHtAbGluayBhbmRyb2lkLnRlc3QuQWN0aXZpdHlJbnN0cnVtZW50YXRpb25UZXN0Q2FzZTIjZ2V0QWN0aXZpdHkoKX0gbWV0aG9kIHRvIHN0YXJ0IHRoZSBhY3Rpdml0eQorICAgIHVuZGVyIHRlc3QuIFlvdSBjYW4gY2FsbCB0aGlzIG1ldGhvZCBvbmNlIGR1cmluZyB0aGUgZW50aXJlIHRlc3QgY2FzZSwgb3Igb25jZSBmb3IgZWFjaCB0ZXN0IAorICAgIG1ldGhvZC4gWW91IGNhbiBldmVuIGRlc3Ryb3kgdGhlIGFjdGl2aXR5IHVuZGVyIHRlc3QgYnkgY2FsbGluZyBpdHMgCisgICAge0BsaW5rIGFuZHJvaWQuYXBwLkFjdGl2aXR5I2ZpbmlzaCgpfSBtZXRob2QgYW5kIHRoZW4gcmVzdGFydCBpdCB3aXRoIAorICAgIDxjb2RlPmdldEFjdGl2aXR5KCk8L2NvZGU+IHdpdGhpbiBhIHNpbmdsZSB0ZXN0IG1ldGhvZC4KIDwvcD4KIDxoMyBpZD0iUnVuVGVzdHMiPlJ1bm5pbmcgdGVzdHMgYW5kIHNlZWluZyB0aGUgcmVzdWx0czwvaDM+CiA8cD4KLSAgICBUbyBydW4geW91ciB0ZXN0cywgeW91IGJ1aWxkIHlvdXIgdGVzdCBwcm9qZWN0IGFuZCB0aGVuIHJ1biB0aGUgdGVzdCBhcHBsaWNhdGlvbiB1c2luZyB0aGUgc3lzdGVtIHV0aWxpdHkgQWN0aXZpdHkgTWFuYWdlciB3aXRoIGluc3RydW1lbnRhdGlvbi4gWW91IHByb3ZpZGUgdG8gQWN0aXZpdHkgTWFuYWdlciB0aGUgbmFtZSBvZiB0aGUgdGVzdCBydW5uZXIgKHVzdWFsbHkKLSAgICB7QGxpbmsgYW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RSdW5uZXJ9KSB5b3Ugc3BlY2lmaWVkIGZvciB5b3VyIGFwcGxpY2F0aW9uOyB0aGUgbmFtZSBpbmNsdWRlcyBib3RoIHlvdXIgdGVzdCBhcHBsaWNhdGlvbidzIHBhY2thZ2UgbmFtZSBhbmQgdGhlIHRlc3QgcnVubmVyIGNsYXNzIG5hbWUuIEFjdGl2aXR5IE1hbmFnZXIgbG9hZHMgYW5kIHN0YXJ0cyB5b3VyCi0gICAgdGVzdCBhcHBsaWNhdGlvbiwga2lsbHMgYW55IGluc3RhbmNlcyBvZiB0aGUgYXBwbGljYXRpb24gdW5kZXIgdGVzdCwgbG9hZHMgYW4gaW5zdGFuY2Ugb2YgdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QgaW50byB0aGUgc2FtZSBwcm9jZXNzIGFzIHRoZSB0ZXN0IGFwcGxpY2F0aW9uLCBhbmQgdGhlbiBwYXNzZXMgY29udHJvbCB0byB0aGUgZmlyc3QgdGVzdCBjYXNlCi0gICAgY2xhc3MgaW4geW91ciB0ZXN0IGFwcGxpY2F0aW9uLiBUaGUgdGVzdCBydW5uZXIgdGhlbiB0YWtlcyBjb250cm9sIG9mIHRoZSB0ZXN0cywgcnVubmluZyBlYWNoIG9mIHlvdXIgdGVzdCBtZXRob2RzIGFnYWluc3QgdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QgdW50aWwgYWxsIHRoZSBtZXRob2RzIGluIGFsbCB0aGUgY2xhc3NlcyBoYXZlIGJlZW4gcnVuLgorICAgIFRvIHJ1biB5b3VyIHRlc3RzLCB5b3UgYnVpbGQgeW91ciB0ZXN0IHByb2plY3QgYW5kIHRoZW4gcnVuIHRoZSB0ZXN0IGFwcGxpY2F0aW9uIHVzaW5nIHRoZSAKKyAgICBzeXN0ZW0gdXRpbGl0eSBBY3Rpdml0eSBNYW5hZ2VyIHdpdGggaW5zdHJ1bWVudGF0aW9uLiBZb3UgcHJvdmlkZSB0byBBY3Rpdml0eSBNYW5hZ2VyIHRoZSBuYW1lIAorICAgIG9mIHRoZSB0ZXN0IHJ1bm5lciAodXN1YWxseSB7QGxpbmsgYW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RSdW5uZXJ9KSB5b3Ugc3BlY2lmaWVkIGZvciAKKyAgICB5b3VyIGFwcGxpY2F0aW9uOyB0aGUgbmFtZSBpbmNsdWRlcyBib3RoIHlvdXIgdGVzdCBhcHBsaWNhdGlvbidzIHBhY2thZ2UgbmFtZSBhbmQgdGhlIHRlc3QgCisgICAgcnVubmVyIGNsYXNzIG5hbWUuIEFjdGl2aXR5IE1hbmFnZXIgbG9hZHMgYW5kIHN0YXJ0cyB5b3VyIHRlc3QgYXBwbGljYXRpb24sIGtpbGxzIGFueSBpbnN0YW5jZXMKKyAgICBvZiB0aGUgYXBwbGljYXRpb24gdW5kZXIgdGVzdCwgbG9hZHMgYW4gaW5zdGFuY2Ugb2YgdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QgaW50byB0aGUgc2FtZSAKKyAgICBwcm9jZXNzIGFzIHRoZSB0ZXN0IGFwcGxpY2F0aW9uLCBhbmQgdGhlbiBwYXNzZXMgY29udHJvbCB0byB0aGUgZmlyc3QgdGVzdCBjYXNlIGNsYXNzIGluIHlvdXIgCisgICAgdGVzdCBhcHBsaWNhdGlvbi4gVGhlIHRlc3QgcnVubmVyIHRoZW4gdGFrZXMgY29udHJvbCBvZiB0aGUgdGVzdHMsIHJ1bm5pbmcgZWFjaCBvZiB5b3VyIHRlc3QgCisgICAgbWV0aG9kcyBhZ2FpbnN0IHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0IHVudGlsIGFsbCB0aGUgbWV0aG9kcyBpbiBhbGwgdGhlIGNsYXNzZXMgaGF2ZSBiZWVuIAorICAgIHJ1bi4KIDwvcD4KIDxwPgotICAgIElmIHlvdSBydW4gYSB0ZXN0IHdpdGhpbiBFY2xpcHNlIHdpdGggQURULCB0aGUgb3V0cHV0IGFwcGVhcnMgaW4gYSBuZXcgSlVuaXQgdmlldyBwYW5lLiBJZiB5b3UgcnVuIGEgdGVzdCBmcm9tIHRoZSBjb21tYW5kIGxpbmUsIHRoZSBvdXRwdXQgZ29lcyB0byBTVERPVVQuCisgICAgSWYgeW91IHJ1biBhIHRlc3Qgd2l0aGluIEVjbGlwc2Ugd2l0aCBBRFQsIHRoZSBvdXRwdXQgYXBwZWFycyBpbiBhIG5ldyBKVW5pdCB2aWV3IHBhbmUuIElmIHlvdSAKKyAgICBydW4gYSB0ZXN0IGZyb20gdGhlIGNvbW1hbmQgbGluZSwgdGhlIG91dHB1dCBnb2VzIHRvIFNURE9VVC4KIDwvcD4KIDxoMiBpZD0iVGVzdEFyZWFzIj5XaGF0IHRvIFRlc3Q8L2gyPgogPHA+CkBAIC0zNTksNTggKzQ0NSw2NCBAQAogPC9wPgogICA8dWw+CiAgICAgPGxpPgotICAgICAgQWN0aXZpdHkgbGlmZWN5Y2xlIGV2ZW50czogWW91IHNob3VsZCB0ZXN0IHRoYXQgeW91ciBhY3Rpdml0aWVzIGhhbmRsZSBsaWZlY3ljbGUgZXZlbnRzIGNvcnJlY3RseS4gRm9yIGV4YW1wbGUKLSAgICAgIGFuIGFjdGl2aXR5IHNob3VsZCByZXNwb25kIHRvIHBhdXNlIG9yIGRlc3Ryb3kgZXZlbnRzIGJ5IHNhdmluZyBpdHMgc3RhdGUuIFJlbWVtYmVyIHRoYXQgZXZlbiBhIGNoYW5nZSBpbiBzY3JlZW4gb3JpZW50YXRpb24KLSAgICAgIGNhdXNlcyB0aGUgY3VycmVudCBhY3Rpdml0eSB0byBiZSBkZXN0cm95ZWQsIHNvIHlvdSBzaG91bGQgdGVzdCB0aGF0IGFjY2lkZW50YWwgZGV2aWNlIG1vdmVtZW50cyBkb24ndCBhY2NpZGVudGFsbHkgbG9zZSB0aGUKKyAgICAgIEFjdGl2aXR5IGxpZmVjeWNsZSBldmVudHM6IFlvdSBzaG91bGQgdGVzdCB0aGF0IHlvdXIgYWN0aXZpdGllcyBoYW5kbGUgbGlmZWN5Y2xlIGV2ZW50cyAKKyAgICAgIGNvcnJlY3RseS4gRm9yIGV4YW1wbGUsIGFuIGFjdGl2aXR5IHNob3VsZCByZXNwb25kIHRvIHBhdXNlIG9yIGRlc3Ryb3kgZXZlbnRzIGJ5IHNhdmluZyBpdHMgCisgICAgICBzdGF0ZS4gUmVtZW1iZXIgdGhhdCBldmVuIGEgY2hhbmdlIGluIHNjcmVlbiBvcmllbnRhdGlvbiBjYXVzZXMgdGhlIGN1cnJlbnQgYWN0aXZpdHkgdG8gYmUgCisgICAgICBkZXN0cm95ZWQsIHNvIHlvdSBzaG91bGQgdGVzdCB0aGF0IGFjY2lkZW50YWwgZGV2aWNlIG1vdmVtZW50cyBkb24ndCBhY2NpZGVudGFsbHkgbG9zZSB0aGUKICAgICAgIGFwcGxpY2F0aW9uIHN0YXRlLgogICAgIDwvbGk+CiAgICAgPGxpPgotICAgICAgRGF0YWJhc2Ugb3BlcmF0aW9uczogWW91IHNob3VsZCBlbnN1cmUgdGhhdCBkYXRhYmFzZSBvcGVyYXRpb25zIGNvcnJlY3RseSBoYW5kbGUgY2hhbmdlcyB0byB0aGUgYXBwbGljYXRpb24ncyBzdGF0ZS4KLSAgICAgIFRvIGRvIHRoaXMsIHVzZSBtb2NrIG9iamVjdHMgZnJvbSB0aGUgcGFja2FnZSB7QGxpbmsgYW5kcm9pZC50ZXN0Lm1vY2sgYW5kcm9pZC50ZXN0Lm1vY2t9LgorICAgICAgRGF0YWJhc2Ugb3BlcmF0aW9uczogWW91IHNob3VsZCBlbnN1cmUgdGhhdCBkYXRhYmFzZSBvcGVyYXRpb25zIGNvcnJlY3RseSBoYW5kbGUgY2hhbmdlcyB0byAKKyAgICAgIHRoZSBhcHBsaWNhdGlvbidzIHN0YXRlLiBUbyBkbyB0aGlzLCB1c2UgbW9jayBvYmplY3RzIGZyb20gdGhlIHBhY2thZ2UgCisgICAgICB7QGxpbmsgYW5kcm9pZC50ZXN0Lm1vY2sgYW5kcm9pZC50ZXN0Lm1vY2t9LgogICAgIDwvbGk+CiAgICAgPGxpPgotICAgICAgICBTY3JlZW4gc2l6ZXMgYW5kIHJlc29sdXRpb25zOiBCZWZvcmUgeW91IHB1Ymxpc2ggeW91ciBhcHBsaWNhdGlvbiwgbWFrZSBzdXJlIHRvIHRlc3QgaXQgb24gYWxsIG9mIHRoZQotICAgICAgICBzY3JlZW4gc2l6ZXMgYW5kIGRlbnNpdGllcyBvbiB3aGljaCB5b3Ugd2FudCBpdCB0byBydW4uIFlvdSBjYW4gdGVzdCB0aGUgYXBwbGljYXRpb24gb24gbXVsdGlwbGUgc2l6ZXMgYW5kIGRlbnNpdGllcyB1c2luZwotICAgICAgICBBVkRzLCBvciB5b3UgY2FuIHRlc3QgeW91ciBhcHBsaWNhdGlvbiBkaXJlY3RseSBvbiB0aGUgZGV2aWNlcyB0aGF0IHlvdSBhcmUgdGFyZ2V0aW5nLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlCi0gICAgICAgIHRoZSB0b3BpYyA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvcHJhY3RpY2VzL3NjcmVlbnNfc3VwcG9ydC5odG1sIj5TdXBwb3J0aW5nIE11bHRpcGxlIFNjcmVlbnM8L2E+LgorICAgICAgICBTY3JlZW4gc2l6ZXMgYW5kIHJlc29sdXRpb25zOiBCZWZvcmUgeW91IHB1Ymxpc2ggeW91ciBhcHBsaWNhdGlvbiwgbWFrZSBzdXJlIHRvIHRlc3QgaXQgb24gCisgICAgICAgIGFsbCBvZiB0aGUgc2NyZWVuIHNpemVzIGFuZCBkZW5zaXRpZXMgb24gd2hpY2ggeW91IHdhbnQgaXQgdG8gcnVuLiBZb3UgY2FuIHRlc3QgdGhlIAorICAgICAgICBhcHBsaWNhdGlvbiBvbiBtdWx0aXBsZSBzaXplcyBhbmQgZGVuc2l0aWVzIHVzaW5nIEFWRHMsIG9yIHlvdSBjYW4gdGVzdCB5b3VyIGFwcGxpY2F0aW9uIAorICAgICAgICBkaXJlY3RseSBvbiB0aGUgZGV2aWNlcyB0aGF0IHlvdSBhcmUgdGFyZ2V0aW5nLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIHRoZSB0b3BpYyAKKyAgICAgICAgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL3ByYWN0aWNlcy9zY3JlZW5zX3N1cHBvcnQuaHRtbCI+U3VwcG9ydGluZyBNdWx0aXBsZSBTY3JlZW5zPC9hPi4KICAgICA8L2xpPgogICA8L3VsPgogPHA+Ci0gIFdoZW4gcG9zc2libGUsIHlvdSBzaG91bGQgcnVuIHRoZXNlIHRlc3RzIG9uIGFuIGFjdHVhbCBkZXZpY2UuIElmIHRoaXMgaXMgbm90IHBvc3NpYmxlLCB5b3UgY2FuCi0gIHVzZSB0aGUgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL2RldmVsb3BpbmcvdG9vbHMvZW11bGF0b3IuaHRtbCI+QW5kcm9pZCBFbXVsYXRvcjwvYT4gd2l0aAotICA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvZGV2ZWxvcGluZy90b29scy9hdmQuaHRtbCI+QW5kcm9pZCBWaXJ0dWFsIERldmljZXM8L2E+IGNvbmZpZ3VyZWQgZm9yCi0gIHRoZSBoYXJkd2FyZSwgc2NyZWVucywgYW5kIHZlcnNpb25zIHlvdSB3YW50IHRvIHRlc3QuCisgICAgV2hlbiBwb3NzaWJsZSwgeW91IHNob3VsZCBydW4gdGhlc2UgdGVzdHMgb24gYW4gYWN0dWFsIGRldmljZS4gSWYgdGhpcyBpcyBub3QgcG9zc2libGUsIHlvdSBjYW4KKyAgICB1c2UgdGhlIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9kZXZlbG9waW5nL3Rvb2xzL2VtdWxhdG9yLmh0bWwiPkFuZHJvaWQgRW11bGF0b3I8L2E+IHdpdGgKKyAgICA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvZGV2ZWxvcGluZy90b29scy9hdmQuaHRtbCI+QW5kcm9pZCBWaXJ0dWFsIERldmljZXM8L2E+IGNvbmZpZ3VyZWQgZm9yCisgICAgdGhlIGhhcmR3YXJlLCBzY3JlZW5zLCBhbmQgdmVyc2lvbnMgeW91IHdhbnQgdG8gdGVzdC4KIDwvcD4KIDxoMiBpZD0iVUlUZXN0aW5nIj5BcHBlbmRpeDogVUkgVGVzdGluZyBOb3RlczwvaDI+CiA8cD4KLSAgVGhlIGZvbGxvd2luZyBzZWN0aW9ucyBoYXZlIHRpcHMgZm9yIHRlc3RpbmcgdGhlIFVJIG9mIHlvdXIgQW5kcm9pZCBhcHBsaWNhdGlvbiwgc3BlY2lmaWNhbGx5Ci0gIHRvIGhlbHAgeW91IGhhbmRsZSBhY3Rpb25zIHRoYXQgcnVuIGluIHRoZSBVSSB0aHJlYWQsIHRvdWNoIHNjcmVlbiBhbmQga2V5Ym9hcmQgZXZlbnRzLCBhbmQgaG9tZQotICBzY3JlZW4gdW5sb2NrIGR1cmluZyB0ZXN0aW5nLgorICAgIFRoZSBmb2xsb3dpbmcgc2VjdGlvbnMgaGF2ZSB0aXBzIGZvciB0ZXN0aW5nIHRoZSBVSSBvZiB5b3VyIEFuZHJvaWQgYXBwbGljYXRpb24sIHNwZWNpZmljYWxseQorICAgIHRvIGhlbHAgeW91IGhhbmRsZSBhY3Rpb25zIHRoYXQgcnVuIGluIHRoZSBVSSB0aHJlYWQsIHRvdWNoIHNjcmVlbiBhbmQga2V5Ym9hcmQgZXZlbnRzLCBhbmQgaG9tZQorICAgIHNjcmVlbiB1bmxvY2sgZHVyaW5nIHRlc3RpbmcuCiA8L3A+CiA8aDMgaWQ9IlJ1bk9uVUlUaHJlYWQiPlRlc3Rpbmcgb24gdGhlIFVJIHRocmVhZDwvaDM+CiA8cD4KLSAgQW4gYXBwbGljYXRpb24ncyBhY3Rpdml0aWVzIHJ1biBvbiB0aGUgYXBwbGljYXRpb24ncyA8c3Ryb25nPlVJIHRocmVhZDwvc3Ryb25nPi4gT25jZSB0aGUKLSAgVUkgaXMgaW5zdGFudGlhdGVkLCBmb3IgZXhhbXBsZSBpbiB0aGUgYWN0aXZpdHkncyA8Y29kZT5vbkNyZWF0ZSgpPC9jb2RlPiBtZXRob2QsIHRoZW4gYWxsCi0gIGludGVyYWN0aW9ucyB3aXRoIHRoZSBVSSBtdXN0IHJ1biBpbiB0aGUgVUkgdGhyZWFkLiBXaGVuIHlvdSBydW4gdGhlIGFwcGxpY2F0aW9uIG5vcm1hbGx5LCBpdAotICBoYXMgYWNjZXNzIHRvIHRoZSB0aHJlYWQgYW5kIGRvZXMgbm90IGhhdmUgdG8gZG8gYW55dGhpbmcgc3BlY2lhbC4KKyAgICBBbiBhcHBsaWNhdGlvbidzIGFjdGl2aXRpZXMgcnVuIG9uIHRoZSBhcHBsaWNhdGlvbidzIDxzdHJvbmc+VUkgdGhyZWFkPC9zdHJvbmc+LiBPbmNlIHRoZQorICAgIFVJIGlzIGluc3RhbnRpYXRlZCwgZm9yIGV4YW1wbGUgaW4gdGhlIGFjdGl2aXR5J3MgPGNvZGU+b25DcmVhdGUoKTwvY29kZT4gbWV0aG9kLCB0aGVuIGFsbAorICAgIGludGVyYWN0aW9ucyB3aXRoIHRoZSBVSSBtdXN0IHJ1biBpbiB0aGUgVUkgdGhyZWFkLiBXaGVuIHlvdSBydW4gdGhlIGFwcGxpY2F0aW9uIG5vcm1hbGx5LCBpdAorICAgIGhhcyBhY2Nlc3MgdG8gdGhlIHRocmVhZCBhbmQgZG9lcyBub3QgaGF2ZSB0byBkbyBhbnl0aGluZyBzcGVjaWFsLgogPC9wPgogPHA+Ci0gIFRoaXMgY2hhbmdlcyB3aGVuIHlvdSBydW4gdGVzdHMgYWdhaW5zdCB0aGUgYXBwbGljYXRpb24uIFdpdGggaW5zdHJ1bWVudGF0aW9uLWJhc2VkIGNsYXNzZXMsCi0gIHlvdSBjYW4gaW52b2tlIG1ldGhvZHMgYWdhaW5zdCB0aGUgVUkgb2YgdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QuIFRoZSBvdGhlciB0ZXN0IGNsYXNzZXMgZG9uJ3QgYWxsb3cgdGhpcy4KLSAgVG8gcnVuIGFuIGVudGlyZSB0ZXN0IG1ldGhvZCBvbiB0aGUgVUkgdGhyZWFkLCB5b3UgY2FuIGFubm90YXRlIHRoZSB0aHJlYWQgd2l0aCA8Y29kZT5AVUlUaHJlYWRUZXN0PC9jb2RlPi4KLSAgTm90aWNlIHRoYXQgdGhpcyB3aWxsIHJ1biA8ZW0+YWxsPC9lbT4gb2YgdGhlIG1ldGhvZCBzdGF0ZW1lbnRzIG9uIHRoZSBVSSB0aHJlYWQuICBNZXRob2RzIHRoYXQgZG8gbm90IGludGVyYWN0IHdpdGggdGhlIFVJCi0gIGFyZSBub3QgYWxsb3dlZDsgZm9yIGV4YW1wbGUsIHlvdSBjYW4ndCBpbnZva2UgPGNvZGU+SW5zdHJ1bWVudGF0aW9uLndhaXRGb3JJZGxlU3luYygpPC9jb2RlPi4KKyAgICBUaGlzIGNoYW5nZXMgd2hlbiB5b3UgcnVuIHRlc3RzIGFnYWluc3QgdGhlIGFwcGxpY2F0aW9uLiBXaXRoIGluc3RydW1lbnRhdGlvbi1iYXNlZCBjbGFzc2VzLAorICAgIHlvdSBjYW4gaW52b2tlIG1ldGhvZHMgYWdhaW5zdCB0aGUgVUkgb2YgdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QuIFRoZSBvdGhlciB0ZXN0IGNsYXNzZXMgCisgICAgZG9uJ3QgYWxsb3cgdGhpcy4gVG8gcnVuIGFuIGVudGlyZSB0ZXN0IG1ldGhvZCBvbiB0aGUgVUkgdGhyZWFkLCB5b3UgY2FuIGFubm90YXRlIHRoZSB0aHJlYWQgCisgICAgd2l0aCA8Y29kZT5AVUlUaHJlYWRUZXN0PC9jb2RlPi4gTm90aWNlIHRoYXQgdGhpcyB3aWxsIHJ1biA8ZW0+YWxsPC9lbT4gb2YgdGhlIG1ldGhvZCBzdGF0ZW1lbnRzIAorICAgIG9uIHRoZSBVSSB0aHJlYWQuICBNZXRob2RzIHRoYXQgZG8gbm90IGludGVyYWN0IHdpdGggdGhlIFVJIGFyZSBub3QgYWxsb3dlZDsgZm9yIGV4YW1wbGUsIHlvdSAKKyAgICBjYW4ndCBpbnZva2UgPGNvZGU+SW5zdHJ1bWVudGF0aW9uLndhaXRGb3JJZGxlU3luYygpPC9jb2RlPi4KIDwvcD4KIDxwPgotICBUbyBydW4gYSBzdWJzZXQgb2YgYSB0ZXN0IG1ldGhvZCBvbiB0aGUgVUkgdGhyZWFkLCBjcmVhdGUgYW4gYW5vbnltb3VzIGNsYXNzIG9mIHR5cGUKLSAgPGNvZGU+UnVubmFibGU8L2NvZGU+LCBwdXQgdGhlIHN0YXRlbWVudHMgeW91IHdhbnQgaW4gdGhlIDxjb2RlPnJ1bigpPC9jb2RlPiBtZXRob2QsIGFuZCBpbnN0YW50aWF0ZSBhIG5ldwotICBpbnN0YW5jZSBvZiB0aGUgY2xhc3MgYXMgYSBwYXJhbWV0ZXIgdG8gdGhlIG1ldGhvZCA8Y29kZT48ZW0+YXBwQWN0aXZpdHk8L2VtPi5ydW5PblVpVGhyZWFkKCk8L2NvZGU+LCB3aGVyZQotICA8Y29kZT48ZW0+YXBwQWN0aXZpdHk8L2VtPjwvY29kZT4gaXMgdGhlIGluc3RhbmNlIG9mIHRoZSBhcHAgeW91IGFyZSB0ZXN0aW5nLgorICAgIFRvIHJ1biBhIHN1YnNldCBvZiBhIHRlc3QgbWV0aG9kIG9uIHRoZSBVSSB0aHJlYWQsIGNyZWF0ZSBhbiBhbm9ueW1vdXMgY2xhc3Mgb2YgdHlwZQorICAgIDxjb2RlPlJ1bm5hYmxlPC9jb2RlPiwgcHV0IHRoZSBzdGF0ZW1lbnRzIHlvdSB3YW50IGluIHRoZSA8Y29kZT5ydW4oKTwvY29kZT4gbWV0aG9kLCBhbmQgCisgICAgaW5zdGFudGlhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIGNsYXNzIGFzIGEgcGFyYW1ldGVyIHRvIHRoZSBtZXRob2QgCisgICAgPGNvZGU+PGVtPmFwcEFjdGl2aXR5PC9lbT4ucnVuT25VaVRocmVhZCgpPC9jb2RlPiwgd2hlcmUgPGNvZGU+PGVtPmFwcEFjdGl2aXR5PC9lbT48L2NvZGU+IGlzIAorICAgIHRoZSBpbnN0YW5jZSBvZiB0aGUgYXBwIHlvdSBhcmUgdGVzdGluZy4KIDwvcD4KIDxwPgotICBGb3IgZXhhbXBsZSwgdGhpcyBjb2RlIGluc3RhbnRpYXRlcyBhbiBhY3Rpdml0eSB0byB0ZXN0LCByZXF1ZXN0cyBmb2N1cyAoYSBVSSBhY3Rpb24pIGZvciB0aGUgU3Bpbm5lciBkaXNwbGF5ZWQKLSAgYnkgdGhlIGFjdGl2aXR5LCBhbmQgdGhlbiBzZW5kcyBhIGtleSB0byBpdC4gTm90aWNlIHRoYXQgdGhlIGNhbGxzIHRvIDxjb2RlPndhaXRGb3JJZGxlU3luYzwvY29kZT4gYW5kIDxjb2RlPnNlbmRLZXlzPC9jb2RlPgotICBhcmVuJ3QgYWxsb3dlZCB0byBydW4gb24gdGhlIFVJIHRocmVhZDo8L3A+CisgICAgRm9yIGV4YW1wbGUsIHRoaXMgY29kZSBpbnN0YW50aWF0ZXMgYW4gYWN0aXZpdHkgdG8gdGVzdCwgcmVxdWVzdHMgZm9jdXMgKGEgVUkgYWN0aW9uKSBmb3IgdGhlIAorICAgIFNwaW5uZXIgZGlzcGxheWVkIGJ5IHRoZSBhY3Rpdml0eSwgYW5kIHRoZW4gc2VuZHMgYSBrZXkgdG8gaXQuIE5vdGljZSB0aGF0IHRoZSBjYWxscyB0byAKKyAgICA8Y29kZT53YWl0Rm9ySWRsZVN5bmM8L2NvZGU+IGFuZCA8Y29kZT5zZW5kS2V5czwvY29kZT4gYXJlbid0IGFsbG93ZWQgdG8gcnVuIG9uIHRoZSBVSSB0aHJlYWQ6Cis8L3A+CiA8cHJlPgogICBwcml2YXRlIE15QWN0aXZpdHkgbUFjdGl2aXR5OyAvLyBNeUFjdGl2aXR5IGlzIHRoZSBjbGFzcyBuYW1lIG9mIHRoZSBhcHAgdW5kZXIgdGVzdAogICBwcml2YXRlIFNwaW5uZXIgbVNwaW5uZXI7CkBAIC00NDksMzEgKzU0MSwzNiBAQAogCiA8aDMgaWQ9Ik5vdG91Y2hNb2RlIj5UdXJuaW5nIG9mZiB0b3VjaCBtb2RlPC9oMz4KIDxwPgotICBUbyBjb250cm9sIHRoZSBlbXVsYXRvciBvciBhIGRldmljZSB3aXRoIGtleSBldmVudHMgeW91IHNlbmQgZnJvbSB5b3VyIHRlc3RzLCB5b3UgbXVzdCB0dXJuIG9mZgotICB0b3VjaCBtb2RlLiBJZiB5b3UgZG8gbm90IGRvIHRoaXMsIHRoZSBrZXkgZXZlbnRzIGFyZSBpZ25vcmVkLgorICAgIFRvIGNvbnRyb2wgdGhlIGVtdWxhdG9yIG9yIGEgZGV2aWNlIHdpdGgga2V5IGV2ZW50cyB5b3Ugc2VuZCBmcm9tIHlvdXIgdGVzdHMsIHlvdSBtdXN0IHR1cm4gb2ZmCisgICAgdG91Y2ggbW9kZS4gSWYgeW91IGRvIG5vdCBkbyB0aGlzLCB0aGUga2V5IGV2ZW50cyBhcmUgaWdub3JlZC4KIDwvcD4KIDxwPgotICBUbyB0dXJuIG9mZiB0b3VjaCBtb2RlLCB5b3UgaW52b2tlIDxjb2RlPkFjdGl2aXR5SW5zdHJ1bWVudGF0aW9uVGVzdENhc2UyLnNldEFjdGl2aXR5VG91Y2hNb2RlKGZhbHNlKTwvY29kZT4KLSAgPGVtPmJlZm9yZTwvZW0+IHlvdSBjYWxsIDxjb2RlPmdldEFjdGl2aXR5KCk8L2NvZGU+IHRvIHN0YXJ0IHRoZSBhY3Rpdml0eS4gWW91IG11c3QgaW52b2tlIHRoZSBtZXRob2QgaW4gYSB0ZXN0IG1ldGhvZAotICB0aGF0IGlzIDxlbT5ub3Q8L2VtPiBydW5uaW5nIG9uIHRoZSBVSSB0aHJlYWQuIEZvciB0aGlzIHJlYXNvbiwgeW91IGNhbid0IGludm9rZSB0aGUgdG91Y2ggbW9kZSBtZXRob2QKLSAgZnJvbSBhIHRlc3QgbWV0aG9kIHRoYXQgaXMgYW5ub3RhdGVkIHdpdGggPGNvZGU+QFVJVGhyZWFkPC9jb2RlPi4gSW5zdGVhZCwgaW52b2tlIHRoZSB0b3VjaCBtb2RlIG1ldGhvZCBmcm9tIDxjb2RlPnNldFVwKCk8L2NvZGU+LgorICAgIFRvIHR1cm4gb2ZmIHRvdWNoIG1vZGUsIHlvdSBpbnZva2UgCisgICAgPGNvZGU+QWN0aXZpdHlJbnN0cnVtZW50YXRpb25UZXN0Q2FzZTIuc2V0QWN0aXZpdHlUb3VjaE1vZGUoZmFsc2UpPC9jb2RlPgorICAgIDxlbT5iZWZvcmU8L2VtPiB5b3UgY2FsbCA8Y29kZT5nZXRBY3Rpdml0eSgpPC9jb2RlPiB0byBzdGFydCB0aGUgYWN0aXZpdHkuIFlvdSBtdXN0IGludm9rZSB0aGUgCisgICAgbWV0aG9kIGluIGEgdGVzdCBtZXRob2QgdGhhdCBpcyA8ZW0+bm90PC9lbT4gcnVubmluZyBvbiB0aGUgVUkgdGhyZWFkLiBGb3IgdGhpcyByZWFzb24sIHlvdSAKKyAgICBjYW4ndCBpbnZva2UgdGhlIHRvdWNoIG1vZGUgbWV0aG9kIGZyb20gYSB0ZXN0IG1ldGhvZCB0aGF0IGlzIGFubm90YXRlZCB3aXRoIAorICAgIDxjb2RlPkBVSVRocmVhZDwvY29kZT4uIEluc3RlYWQsIGludm9rZSB0aGUgdG91Y2ggbW9kZSBtZXRob2QgZnJvbSA8Y29kZT5zZXRVcCgpPC9jb2RlPi4KIDwvcD4KIDxoMyBpZD0iVW5sb2NrRGV2aWNlIj5VbmxvY2tpbmcgdGhlIGVtdWxhdG9yIG9yIGRldmljZTwvaDM+CiA8cD4KLSAgWW91IG1heSBmaW5kIHRoYXQgVUkgdGVzdHMgZG9uJ3Qgd29yayBpZiB0aGUgZW11bGF0b3IncyBvciBkZXZpY2UncyBob21lIHNjcmVlbiBpcyBkaXNhYmxlZCB3aXRoIHRoZSBrZXlndWFyZCBwYXR0ZXJuLgotICBUaGlzIGlzIGJlY2F1c2UgdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QgY2FuJ3QgcmVjZWl2ZSBrZXkgZXZlbnRzIHNlbnQgYnkgPGNvZGU+c2VuZEtleXMoKTwvY29kZT4uIFRoZSBiZXN0Ci0gIHdheSB0byBhdm9pZCB0aGlzIGlzIHRvIHN0YXJ0IHlvdXIgZW11bGF0b3Igb3IgZGV2aWNlIGZpcnN0IGFuZCB0aGVuIGRpc2FibGUgdGhlIGtleWd1YXJkIGZvciB0aGUgaG9tZSBzY3JlZW4uCisgICAgWW91IG1heSBmaW5kIHRoYXQgVUkgdGVzdHMgZG9uJ3Qgd29yayBpZiB0aGUgZW11bGF0b3IncyBvciBkZXZpY2UncyBob21lIHNjcmVlbiBpcyBkaXNhYmxlZCB3aXRoIAorICAgIHRoZSBrZXlndWFyZCBwYXR0ZXJuLiBUaGlzIGlzIGJlY2F1c2UgdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QgY2FuJ3QgcmVjZWl2ZSBrZXkgZXZlbnRzIHNlbnQgJworICAgIGJ5IDxjb2RlPnNlbmRLZXlzKCk8L2NvZGU+LiBUaGUgYmVzdCB3YXkgdG8gYXZvaWQgdGhpcyBpcyB0byBzdGFydCB5b3VyIGVtdWxhdG9yIG9yIGRldmljZSAKKyAgICBmaXJzdCBhbmQgdGhlbiBkaXNhYmxlIHRoZSBrZXlndWFyZCBmb3IgdGhlIGhvbWUgc2NyZWVuLgogPC9wPgogPHA+Ci0gIFlvdSBjYW4gYWxzbyBleHBsaWNpdGx5IGRpc2FibGUgdGhlIGtleWd1YXJkLiBUbyBkbyB0aGlzLAotICB5b3UgbmVlZCB0byBhZGQgYSBwZXJtaXNzaW9uIGluIHRoZSBtYW5pZmVzdCBmaWxlICg8Y29kZT5BbmRyb2lkTWFuaWZlc3QueG1sPC9jb2RlPikgYW5kCi0gIHRoZW4gZGlzYWJsZSB0aGUga2V5Z3VhcmQgaW4geW91ciBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0LiBOb3RlLCB0aG91Z2gsIHRoYXQgeW91IGVpdGhlciBoYXZlIHRvIHJlbW92ZSB0aGlzIGJlZm9yZQotICB5b3UgcHVibGlzaCB5b3VyIGFwcGxpY2F0aW9uLCBvciB5b3UgaGF2ZSB0byBkaXNhYmxlIGl0IHByb2dyYW1tYXRpY2FsbHkgaW4gdGhlIHB1Ymxpc2hlZCBhcHAuCisgICAgWW91IGNhbiBhbHNvIGV4cGxpY2l0bHkgZGlzYWJsZSB0aGUga2V5Z3VhcmQuIFRvIGRvIHRoaXMsCisgICAgeW91IG5lZWQgdG8gYWRkIGEgcGVybWlzc2lvbiBpbiB0aGUgbWFuaWZlc3QgZmlsZSAoPGNvZGU+QW5kcm9pZE1hbmlmZXN0LnhtbDwvY29kZT4pIGFuZAorICAgIHRoZW4gZGlzYWJsZSB0aGUga2V5Z3VhcmQgaW4geW91ciBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0LiBOb3RlLCB0aG91Z2gsIHRoYXQgeW91IGVpdGhlciBoYXZlIHRvIAorICAgIHJlbW92ZSB0aGlzIGJlZm9yZSB5b3UgcHVibGlzaCB5b3VyIGFwcGxpY2F0aW9uLCBvciB5b3UgaGF2ZSB0byBkaXNhYmxlIGl0IHByb2dyYW1tYXRpY2FsbHkgaW4gCisgICAgdGhlIHB1Ymxpc2hlZCBhcHAuCiA8L3A+CiA8cD4KLSAgVG8gYWRkIHRoZSB0aGUgcGVybWlzc2lvbiwgYWRkIHRoZSBlbGVtZW50IDxjb2RlPiZsdDt1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uRElTQUJMRV9LRVlHVUFSRCIvJmd0OzwvY29kZT4KLSAgYXMgYSBjaGlsZCBvZiB0aGUgPGNvZGU+Jmx0O21hbmlmZXN0Jmd0OzwvY29kZT4gZWxlbWVudC4gVG8gZGlzYWJsZSB0aGUgS2V5R3VhcmQsIGFkZCB0aGUgZm9sbG93aW5nIGNvZGUKLSAgdG8gdGhlIDxjb2RlPm9uQ3JlYXRlKCk8L2NvZGU+IG1ldGhvZCBvZiBhY3Rpdml0aWVzIHlvdSBpbnRlbmQgdG8gdGVzdDoKKyAgICBUbyBhZGQgdGhlIHRoZSBwZXJtaXNzaW9uLCBhZGQgdGhlIGVsZW1lbnQgCisgICAgPGNvZGU+Jmx0O3VzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5ESVNBQkxFX0tFWUdVQVJEIi8mZ3Q7PC9jb2RlPgorICAgIGFzIGEgY2hpbGQgb2YgdGhlIDxjb2RlPiZsdDttYW5pZmVzdCZndDs8L2NvZGU+IGVsZW1lbnQuIFRvIGRpc2FibGUgdGhlIEtleUd1YXJkLCBhZGQgdGhlIAorICAgIGZvbGxvd2luZyBjb2RlIHRvIHRoZSA8Y29kZT5vbkNyZWF0ZSgpPC9jb2RlPiBtZXRob2Qgb2YgYWN0aXZpdGllcyB5b3UgaW50ZW5kIHRvIHRlc3Q6CiA8L3A+CiA8cHJlPgogICBtS2V5R3VhcmRNYW5hZ2VyID0gKEtleWd1YXJkTWFuYWdlcikgZ2V0U3lzdGVtU2VydmljZShLRVlHVUFSRF9TRVJWSUNFKTsKQEAgLTQ4Myw3ICs1ODAsOCBAQAogPHA+d2hlcmUgPGNvZGU+PGVtPmFjdGl2aXR5X2NsYXNzbmFtZTwvZW0+PC9jb2RlPiBpcyB0aGUgY2xhc3MgbmFtZSBvZiB0aGUgYWN0aXZpdHkuPC9wPgogPGgzIGlkPSJVSVRlc3RUcm91Ymxlc2hvb3RpbmciPlRyb3VibGVzaG9vdGluZyBVSSB0ZXN0czwvaDM+CiA8cD4KLSAgVGhpcyBzZWN0aW9uIGxpc3RzIHNvbWUgb2YgdGhlIGNvbW1vbiB0ZXN0IGZhaWx1cmVzIHlvdSBtYXkgZW5jb3VudGVyIGluIFVJIHRlc3RpbmcsIGFuZCB0aGVpciBjYXVzZXM6CisgICAgVGhpcyBzZWN0aW9uIGxpc3RzIHNvbWUgb2YgdGhlIGNvbW1vbiB0ZXN0IGZhaWx1cmVzIHlvdSBtYXkgZW5jb3VudGVyIGluIFVJIHRlc3RpbmcsIGFuZCB0aGVpciAKKyAgICBjYXVzZXM6CiA8L3A+CiA8ZGw+CiAgICAgPGR0Pjxjb2RlPldyb25nVGhyZWFkRXhjZXB0aW9uPC9jb2RlPjwvZHQ+CkBAIC00OTEsMjcgKzU4OSwzMyBAQAogICAgICAgPHA+PHN0cm9uZz5Qcm9ibGVtOjwvc3Ryb25nPjwvcD4KICAgICAgIEZvciBhIGZhaWxlZCB0ZXN0LCB0aGUgRmFpbHVyZSBUcmFjZSBjb250YWlucyB0aGUgZm9sbG93aW5nIGVycm9yIG1lc3NhZ2U6CiAgICAgICA8Y29kZT4KLSAgICAgICAgYW5kcm9pZC52aWV3LlZpZXdSb290JENhbGxlZEZyb21Xcm9uZ1RocmVhZEV4Y2VwdGlvbjogT25seSB0aGUgb3JpZ2luYWwgdGhyZWFkIHRoYXQgY3JlYXRlZCBhIHZpZXcgaGllcmFyY2h5IGNhbiB0b3VjaCBpdHMgdmlld3MuCisgICAgICAgIGFuZHJvaWQudmlldy5WaWV3Um9vdCRDYWxsZWRGcm9tV3JvbmdUaHJlYWRFeGNlcHRpb246IE9ubHkgdGhlIG9yaWdpbmFsIHRocmVhZCB0aGF0IGNyZWF0ZWQgCisgICAgICAgIGEgdmlldyBoaWVyYXJjaHkgY2FuIHRvdWNoIGl0cyB2aWV3cy4KICAgICAgIDwvY29kZT4KICAgICAgIDxwPjxzdHJvbmc+UHJvYmFibGUgQ2F1c2U6PC9zdHJvbmc+PC9wPgotICAgICAgICBUaGlzIGVycm9yIGlzIGNvbW1vbiBpZiB5b3UgdHJpZWQgdG8gc2VuZCBVSSBldmVudHMgdG8gdGhlIFVJIHRocmVhZCBmcm9tIG91dHNpZGUgdGhlIFVJIHRocmVhZC4gVGhpcyBjb21tb25seSBoYXBwZW5zIGlmIHlvdSBzZW5kIFVJIGV2ZW50cwotICAgICAgICBmcm9tIHRoZSB0ZXN0IGFwcGxpY2F0aW9uLCBidXQgeW91IGRvbid0IHVzZSB0aGUgPGNvZGU+QFVJVGhyZWFkPC9jb2RlPiBhbm5vdGF0aW9uIG9yIHRoZSA8Y29kZT5ydW5PblVpVGhyZWFkKCk8L2NvZGU+IG1ldGhvZC4gVGhlIHRlc3QgbWV0aG9kIHRyaWVkIHRvIGludGVyYWN0IHdpdGggdGhlIFVJIG91dHNpZGUgdGhlIFVJIHRocmVhZC4KKyAgICAgICAgVGhpcyBlcnJvciBpcyBjb21tb24gaWYgeW91IHRyaWVkIHRvIHNlbmQgVUkgZXZlbnRzIHRvIHRoZSBVSSB0aHJlYWQgZnJvbSBvdXRzaWRlIHRoZSBVSSAKKyAgICAgICAgdGhyZWFkLiBUaGlzIGNvbW1vbmx5IGhhcHBlbnMgaWYgeW91IHNlbmQgVUkgZXZlbnRzIGZyb20gdGhlIHRlc3QgYXBwbGljYXRpb24sIGJ1dCB5b3UgZG9uJ3QKKyAgICAgICAgdXNlIHRoZSA8Y29kZT5AVUlUaHJlYWQ8L2NvZGU+IGFubm90YXRpb24gb3IgdGhlIDxjb2RlPnJ1bk9uVWlUaHJlYWQoKTwvY29kZT4gbWV0aG9kLiBUaGUgCisgICAgICAgIHRlc3QgbWV0aG9kIHRyaWVkIHRvIGludGVyYWN0IHdpdGggdGhlIFVJIG91dHNpZGUgdGhlIFVJIHRocmVhZC4KICAgICAgIDxwPjxzdHJvbmc+U3VnZ2VzdGVkIFJlc29sdXRpb246PC9zdHJvbmc+PC9wPgotICAgICAgICBSdW4gdGhlIGludGVyYWN0aW9uIG9uIHRoZSBVSSB0aHJlYWQuIFVzZSBhIHRlc3QgY2xhc3MgdGhhdCBwcm92aWRlcyBpbnN0cnVtZW50YXRpb24uIFNlZSB0aGUgcHJldmlvdXMgc2VjdGlvbiA8YSBocmVmPSIjUnVuT25VSVRocmVhZCI+VGVzdGluZyBvbiB0aGUgVUkgVGhyZWFkPC9hPgorICAgICAgICBSdW4gdGhlIGludGVyYWN0aW9uIG9uIHRoZSBVSSB0aHJlYWQuIFVzZSBhIHRlc3QgY2xhc3MgdGhhdCBwcm92aWRlcyBpbnN0cnVtZW50YXRpb24uIFNlZSAKKyAgICAgICAgdGhlIHByZXZpb3VzIHNlY3Rpb24gPGEgaHJlZj0iI1J1bk9uVUlUaHJlYWQiPlRlc3Rpbmcgb24gdGhlIFVJIFRocmVhZDwvYT4KICAgICAgICAgZm9yIG1vcmUgZGV0YWlscy4KICAgICA8L2RkPgogICAgIDxkdD48Y29kZT5qYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbjwvY29kZT48L2R0PgogICAgIDxkZD4KICAgICAgIDxwPjxzdHJvbmc+UHJvYmxlbTo8L3N0cm9uZz48L3A+Ci0gICAgICBGb3IgYSBmYWlsZWQgdGVzdCwgdGhlIEZhaWx1cmUgVHJhY2UgY29udGFpbnMgdGhlIGZvbGxvd2luZyBlcnJvciBtZXNzYWdlOgorICAgICAgICBGb3IgYSBmYWlsZWQgdGVzdCwgdGhlIEZhaWx1cmUgVHJhY2UgY29udGFpbnMgdGhlIGZvbGxvd2luZyBlcnJvciBtZXNzYWdlOgogICAgICAgPGNvZGU+CiAgICAgICAgIGphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uOiBUaGlzIG1ldGhvZCBjYW4gbm90IGJlIGNhbGxlZCBmcm9tIHRoZSBtYWluIGFwcGxpY2F0aW9uIHRocmVhZAogICAgICAgPC9jb2RlPgogICAgICAgPHA+PHN0cm9uZz5Qcm9iYWJsZSBDYXVzZTo8L3N0cm9uZz48L3A+Ci0gICAgICAgIFRoaXMgZXJyb3IgaXMgY29tbW9uIGlmIHlvdXIgdGVzdCBtZXRob2QgaXMgYW5ub3RhdGVkIHdpdGggPGNvZGU+QFVpVGhyZWFkVGVzdDwvY29kZT4gYnV0IHRoZW4gdHJpZXMgdG8KLSAgICAgICAgZG8gc29tZXRoaW5nIG91dHNpZGUgdGhlIFVJIHRocmVhZCBvciB0cmllcyB0byBpbnZva2UgPGNvZGU+cnVuT25VaVRocmVhZCgpPC9jb2RlPi4KKyAgICAgICAgVGhpcyBlcnJvciBpcyBjb21tb24gaWYgeW91ciB0ZXN0IG1ldGhvZCBpcyBhbm5vdGF0ZWQgd2l0aCA8Y29kZT5AVWlUaHJlYWRUZXN0PC9jb2RlPiBidXQgCisgICAgICAgIHRoZW4gdHJpZXMgdG8gZG8gc29tZXRoaW5nIG91dHNpZGUgdGhlIFVJIHRocmVhZCBvciB0cmllcyB0byBpbnZva2UgCisgICAgICAgIDxjb2RlPnJ1bk9uVWlUaHJlYWQoKTwvY29kZT4uCiAgICAgICA8cD48c3Ryb25nPlN1Z2dlc3RlZCBSZXNvbHV0aW9uOjwvc3Ryb25nPjwvcD4KLSAgICAgICAgUmVtb3ZlIHRoZSA8Y29kZT5AVWlUaHJlYWRUZXN0PC9jb2RlPiBhbm5vdGF0aW9uLCByZW1vdmUgdGhlIDxjb2RlPnJ1bk9uVWlUaHJlYWQoKTwvY29kZT4gY2FsbCwgb3IgcmUtZmFjdG9yIHlvdXIgdGVzdHMuCisgICAgICAgIFJlbW92ZSB0aGUgPGNvZGU+QFVpVGhyZWFkVGVzdDwvY29kZT4gYW5ub3RhdGlvbiwgcmVtb3ZlIHRoZSA8Y29kZT5ydW5PblVpVGhyZWFkKCk8L2NvZGU+IAorICAgICAgICBjYWxsLCBvciByZS1mYWN0b3IgeW91ciB0ZXN0cy4KICAgICA8L2RkPgogPC9kbD4KIApkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL3Jlc291cmNlcy9icm93c2VyLmpkIGIvZG9jcy9odG1sL3Jlc291cmNlcy9icm93c2VyLmpkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhMDg3NjkKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL2h0bWwvcmVzb3VyY2VzL2Jyb3dzZXIuamQKQEAgLTAsMCArMSw0OSBAQAorcGFnZS50aXRsZT1UZWNobmljYWwgUmVzb3VyY2VzCitAamQ6Ym9keQorCis8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgorICB7QGxpdGVyYWwgQGltcG9ydH0gIntAZG9jUm9vdH1hc3NldHMvYW5kcm9pZC1kZXZlbG9wZXItcmVzb3VyY2UtYnJvd3Nlci5jc3MiOworPC9zdHlsZT4KKworPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0ie0Bkb2NSb290fWFzc2V0cy9hbmRyb2lkLWRldmVsb3Blci1yZXNvdXJjZS1icm93c2VyLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9IntAZG9jUm9vdH1hc3NldHMvbWljcm90ZW1wbGF0ZS5qcyI+PC9zY3JpcHQ+CisKKzxkaXY+CisgIDxwIHN0eWxlPSJkaXNwbGF5OiBub25lOyBmbG9hdDogcmlnaHQiPkZpbHRlcjogPGlucHV0IGlkPSJyZXNvdXJjZS1icm93c2VyLWtleXdvcmQtZmlsdGVyIi8+PC9wPgorICA8cCBpZD0icmVzb3VyY2UtYnJvd3Nlci1zZWFyY2gtcGFyYW1zIj5TaG93aW5nIGFsbCB0ZWNobmljYWwgcmVzb3VyY2VzOjwvcD4KKzwvZGl2PgorCis8bm9zY3JpcHQ+CisgIDxwIGNsYXNzPSJub3RlIj48c3Ryb25nPkVycm9yOjwvc3Ryb25nPgorICAgIFlvdSBtdXN0IGhhdmUgSmF2YVNjcmlwdCBlbmFibGVkIHRvIHZpZXcgdGhpcyBwYWdlLiBSZXNvdXJjZXMgYXJlIGFsc28KKyAgICBhdmFpbGFibGUgb2ZmbGluZSBpbiB0aGUgU0RLLgorICA8L3A+Cis8L25vc2NyaXB0PgorCis8ZGl2IGlkPSJyZXNvdXJjZS1icm93c2VyLXJlc3VsdHMiPgorICA8ZGl2IGNsYXNzPSJuby1yZXN1bHRzIj5ObyByZXN1bHRzLjwvZGl2PgorPC9kaXY+CisKKzxzY3JpcHQgdHlwZT0idGV4dC9odG1sIiBpZD0idG1wbF9yZXNvdXJjZV9icm93c2VyX3Jlc3VsdCI+Cis8ZGl2IGNsYXNzPSJyZXN1bHQiPgorICA8aDM+CisgICAgPCUgaWYgKCdleHRlcm5hbCcgaW4gdGFnc0hhc2gpIHsgJT48c3Ryb25nPkV4dGVybmFsOiA8L3N0cm9uZz4gPCUgfSAlPgorICAgIDxhIGhyZWY9IjwlPSBwYXRoICU+Ij48JT0gdGl0bGUuZW4gJT48L2E+CisgICAgPCUgaWYgKCduZXcnIGluIHRhZ3NIYXNoKSB7ICU+PHNwYW4gY2xhc3M9Im5ldyI+bmV3ITwvc3Bhbj4gPCUgfSAlPgorICA8L2gzPgorICA8cCBjbGFzcz0icmVzb3VyY2UtbWV0YSI+PCUKKyAgICB2YXIgX19nID0gWycnLCAnJ107CisgICAgaWYgKCdhcnRpY2xlJyBpbiB0YWdzSGFzaCkgeworICAgICAgX19nID0gWydBcnRpY2xlJywgJ2Fib3V0J107CisgICAgfSBlbHNlIGlmICgndHV0b3JpYWwnIGluIHRhZ3NIYXNoKSB7CisgICAgICBfX2cgPSBbJ1R1dG9yaWFsJywgJ29uJ107CisgICAgfSBlbHNlIGlmICgnc2FtcGxlJyBpbiB0YWdzSGFzaCkgeworICAgICAgX19nID0gWydTYW1wbGUnLCAnZm9yJ107CisgICAgfSBlbHNlIGlmICgndmlkZW8nIGluIHRhZ3NIYXNoKSB7CisgICAgICBfX2cgPSBbJ1ZpZGVvJywgJ2Fib3V0J107CisgICAgfQorICAlPgorICA8JT0gX19nWzBdICU+PCUgaWYgKHRvcGljc0h0bWwpIHsgJT4gPCU9IF9fZ1sxXSAlPjwlIH0gJT4gPCU9IHRvcGljc0h0bWwgJT48L3A+CisgIDxwPjwlPSBkZXNjcmlwdGlvbi5lbiAlPjwvcD4KKzwvZGl2PgorPC9zY3JpcHQ+CmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvcmVzb3VyY2VzL2luZGV4LmpkIGIvZG9jcy9odG1sL3Jlc291cmNlcy9pbmRleC5qZAppbmRleCAxNjY4NzIxLi45MDU1ODY4IDEwMDY0NAotLS0gYS9kb2NzL2h0bWwvcmVzb3VyY2VzL2luZGV4LmpkCisrKyBiL2RvY3MvaHRtbC9yZXNvdXJjZXMvaW5kZXguamQKQEAgLTEsMzggKzEsOTAgQEAKIHBhZ2UudGl0bGU9RGV2ZWxvcGVyIFJlc291cmNlcwogQGpkOmJvZHkKIAorPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KKyAgI3Jlc291cmNlLWxpc3QtdGFibGUgdGQgeworICAgIGJvcmRlcjogMDsKKyAgICBwYWRkaW5nOiAwIDI0cHg7CisgICAgd2lkdGg6IDMzJTsKKyAgICBtYXgtd2lkdGg6IDI1MHB4OworICAgIGJvcmRlci1yaWdodDogMXB4IHNvbGlkICNkZGQ7CisgIH0KKworICAjcmVzb3VyY2UtbGlzdC10YWJsZSB0ZC5sYXN0IHsKKyAgICBib3JkZXItcmlnaHQ6IDA7CisgICAgcGFkZGluZy1yaWdodDogMDsKKyAgfQorPC9zdHlsZT4KKwogPHA+Ci1UaGlzIHNlY3Rpb24gcHJvdmlkZXMgdGVjaG5pY2FsIGFydGljbGVzLCB0dXRvcmlhbHMsIHNhbXBsZSBjb2RlLCBhbmQgb3RoZXIKK1RoaXMgc2VjdGlvbiBwcm92aWRlcyBhcnRpY2xlcywgdHV0b3JpYWxzLCBzYW1wbGUgY29kZSwgYW5kIG90aGVyCiBpbmZvcm1hdGlvbiB0byBoZWxwIHlvdSBxdWlja2x5IGltcGxlbWVudCB0aGUgZmVhdHVyZXMgeW91IHdhbnQgaW4geW91cgotYXBwbGljYXRpb24uCithcHBsaWNhdGlvbi4gVG8gcmV0dXJuIHRvIHRoaXMgcGFnZSBsYXRlciwganVzdCBjbGljayB0aGUgIlJlc291cmNlcyIKK3RhYiB3aGlsZSBhbnkgUmVzb3VyY2VzIHBhZ2UgaXMgbG9hZGVkLgogPC9wPgogCis8aDI+VGVjaG5pY2FsIFJlc291cmNlczwvaDI+CisKKzx0YWJsZSBpZD0icmVzb3VyY2UtbGlzdC10YWJsZSI+Cis8dHI+CisgIDx0ZD4KKyAgICA8YSBocmVmPSJ7QGRvY1Jvb3R9cmVzb3VyY2VzL2Jyb3dzZXIuaHRtbD90YWc9c2FtcGxlIj4KKyAgICAgIDxpbWcgc3JjPSJ7QGRvY1Jvb3R9YXNzZXRzL2ltYWdlcy9yZXNvdXJjZS1iaWctc2FtcGxlLnBuZyIvPgorICAgIDwvYT4KKyAgICA8aDM+PGEgaHJlZj0ie0Bkb2NSb290fXJlc291cmNlcy9icm93c2VyLmh0bWw/dGFnPXNhbXBsZSI+CisgICAgICBTYW1wbGUgQ29kZQorICAgIDwvYT48L2gzPgorICAgIDxwPkZ1bGx5LWZ1bmN0aW9uaW5nIHNhbXBsZSBhcHBsaWNhdGlvbnMgdGhhdCB5b3UgY2FuIGJ1aWxkIGFuZCBydW4KKyAgICB0byBsZWFybiBhYm91dCBob3cgQW5kcm9pZCB3b3Jrcy4gRmVlbCBmcmVlIHRvIHJldXNlIGFueSBvZiB0aGUgY29kZSBvcgorICAgIHRlY2huaXF1ZXMgaW4gdGhlIHNhbXBsZXMuPC9wPgorICA8L3RkPgorICA8dGQ+CisgICAgPGEgaHJlZj0ie0Bkb2NSb290fXJlc291cmNlcy9icm93c2VyLmh0bWw/dGFnPWFydGljbGUiPgorICAgICAgPGltZyBzcmM9IntAZG9jUm9vdH1hc3NldHMvaW1hZ2VzL3Jlc291cmNlLWJpZy1hcnRpY2xlLnBuZyIvPgorICAgIDwvYT4KKyAgICA8aDM+PGEgaHJlZj0ie0Bkb2NSb290fXJlc291cmNlcy9icm93c2VyLmh0bWw/dGFnPWFydGljbGUiPgorICAgICAgQXJ0aWNsZXMKKyAgICA8L2E+PC9oMz4KKyAgICA8cD5Gb2N1c2VkIGRpc2N1c3Npb25zIGFib3V0IEFuZHJvaWQgZGV2ZWxvcG1lbnQgc3ViamVjdHMsIGluY2x1ZGluZworICAgIG9wdGltaXphdGlvbnMsIHRpcHMsIGludGVyZXN0aW5nIGltcGxlbWVudGF0aW9ucywgImhvdy10b3MiLAorICAgIGFuZCBzbyBvbi48L3A+CisgIDwvdGQ+CisgIDx0ZD4KKyAgICA8YSBocmVmPSJ7QGRvY1Jvb3R9cmVzb3VyY2VzL2Jyb3dzZXIuaHRtbD90YWc9dHV0b3JpYWwiPgorICAgICAgPGltZyBzcmM9IntAZG9jUm9vdH1hc3NldHMvaW1hZ2VzL3Jlc291cmNlLWJpZy10dXRvcmlhbC5wbmciLz4KKyAgICA8L2E+CisgICAgPGgzPjxhIGhyZWY9IntAZG9jUm9vdH1yZXNvdXJjZXMvYnJvd3Nlci5odG1sP3RhZz10dXRvcmlhbCI+CisgICAgICBUdXRvcmlhbHMKKyAgICA8L2E+PC9oMz4KKyAgICA8cD5TdGVwLWJ5LXN0ZXAgaW5zdHJ1Y3Rpb25zIGRlbW9uc3RyYXRpbmcgaG93IHRvIGJ1aWxkIGFuIEFuZHJvaWQgYXBwbGljYXRpb24KKyAgICB0aGF0IGhhcyB0aGUgc3BlY2lmaWMgZmVhdHVyZXMgeW91IHdhbnQuPC9wPgorICA8L3RkPgorICA8IS0tIDx0ZCBjbGFzcz0ibGFzdCI+CisgICAgPGEgaHJlZj0ie0Bkb2NSb290fXJlc291cmNlcy9icm93c2VyLmh0bWw/dGFnPXZpZGVvIj4KKyAgICAgIDxpbWcgc3JjPSJ7QGRvY1Jvb3R9YXNzZXRzL2ltYWdlcy9yZXNvdXJjZS1iaWctdmlkZW8ucG5nIi8+CisgICAgPC9hPgorICAgIDxoMz48YSBocmVmPSJ7QGRvY1Jvb3R9cmVzb3VyY2VzL2Jyb3dzZXIuaHRtbD90YWc9dmlkZW8iPgorICAgICAgVmlkZW9zICZhbXA7IFNjcmVlbmNhc3RzCisgICAgPC9hPjwvaDM+CisgICAgPHA+VmlkZW9zIGFuZCBwcmVzZW50YXRpb24gc2xpZGVzIGZyb20gZGV2ZWxvcGVyIGV2ZW50cywgYWxvbmcgd2l0aAorICAgIHNjcmVlbmNhc3RzIHRvIHdhbGsgeW91IHRocm91Z2ggY29tbW9uIEFuZHJvaWQgZGV2ZWxvcG1lbnQKKyAgICB3b3JrZmxvd3MuPC9wPgorICA8L3RkPiAtLT4KKzwvdHI+Cis8L3RhYmxlPgorCis8aDI+T3RoZXIgUmVzb3VyY2VzPC9oMj4KKwogPGRsPgotPGR0PjxiPlRlY2huaWNhbCBBcnRpY2xlczwvYj48L2R0PgotPGRkPkZvY3VzZWQgZGlzY3Vzc2lvbnMgYWJvdXQgQW5kcm9pZCBkZXZlbG9wbWVudCBzdWJqZWN0cywgaW5jbHVkaW5nCi1vcHRpbWl6YXRpb25zLCB0aXBzLCBpbnRlcmVzdGluZyBpbXBsZW1lbnRhdGlvbnMsCi1hbmQgc28gb24uIE1vc3Qgb2YgdGhlIGFydGljbGVzIHByb3ZpZGUgImhvdy10byIgaW5zdHJ1Y3Rpb25zIGZvciBhZGRpbmcKLWZlYXR1cmVzIG9yIGZ1bmN0aW9uYWxpdHkgdG8geW91ciBhcHAuIFRoZSBhcnRpY2xlcyBhcmUgZHJhd24gZnJvbSBwb3N0cyB0byB0aGUKLUFuZHJvaWQgRGV2ZWxvcGVycyBCbG9nLgotPC9kZD4KLQotPGR0PjxiPlR1dG9yaWFsczwvYj48L2R0PgotPGRkPlN0ZXAtYnktc3RlcCBpbnN0cnVjdGlvbnMgZGVtb25zdHJhdGluZyBob3cgdG8gYnVpbGQgYW4gQW5kcm9pZCBhcHBsaWNhdGlvbgotdGhhdCBoYXMgdGhlIHNwZWNpZmljIGZlYXR1cmVzIHlvdSB3YW50LiA8L2RkPgotCi08ZHQ+PGI+U2FtcGxlIENvZGU8L2I+PC9kdD4KLTxkZD5GdWxseS1mdW5jdGlvbmluZyBzYW1wbGUgYXBwbGljYXRpb25zIHRoYXQgeW91IGNhbiBsb29rIGF0IG9yIGJ1aWxkIGFuZCBydW4sCi10byBsZWFybiBhYm91dCBob3cgQW5kcm9pZCB3b3Jrcy4gRmVlbCBmcmVlIHRvIHJldXNlIGFueSBvZiB0aGUgY29kZSBvcgotdGVjaG5pcXVlcyB0aGF0IHlvdSBmaW5kIGluIHRoZSBzYW1wbGVzITwvZGQ+Ci0KIDxkdD48Yj5Db21tdW5pdHk8L2I+PC9kdD4KIDxkZD5MaW5rcyB0byB0aGUgQW5kcm9pZCBkaXNjdXNzaW9uIGdyb3VwcyBhbmQgaW5mb3JtYXRpb24gYWJvdXQgb3RoZXIgd2F5cyB0bwogY29sbGFib3JhdGUgd2l0aCBvdGhlciBkZXZlbG9wZXJzLiA8L2RkPgogCis8ZHQ+PGI+RGV2aWNlIERhc2hib2FyZDwvYj48L2R0PgorPGRkPkRldmljZSBkaXN0cmlidXRpb24gZGF0YSwgZ3JvdXBlZCBieSB2YXJpb3VzIGRpbWVuc2lvbnMgc3VjaCBhcyBzY3JlZW4gc2l6ZQorYW5kIEFuZHJvaWQgcGxhdGZvcm0gdmVyc2lvbi4gPC9kZD4KKwogPGR0PjxiPk1vcmU8L2I+PC9kdD4KIDxkZD5RdWljayBkZXZlbG9wbWVudCB0aXBzLCB0cm91Ymxlc2hvb3RpbmcgaW5mb3JtYXRpb24sIGFuZCBmcmVxdWVudGx5IGFza2VkCiBxdWVzdGlvbnMgKEZBUXMpLiA8L2RkPgogPC9kbD4KLQotPHA+VG8gcmV0dXJuIHRvIHRoaXMgcGFnZSBsYXRlciwganVzdCBjbGljayB0aGUgIlJlc291cmNlcyIgdGFiIHdoaWxlIGFueQotUmVzb3VyY2VzIHBhZ2UgaXMgbG9hZGVkLiA8L3A+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL3Jlc291cmNlcy9yZXNvdXJjZXMtZGF0YS5qcyBiL2RvY3MvaHRtbC9yZXNvdXJjZXMvcmVzb3VyY2VzLWRhdGEuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDA2YjY5NQotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvaHRtbC9yZXNvdXJjZXMvcmVzb3VyY2VzLWRhdGEuanMKQEAgLTAsMCArMSw2MzIgQEAKK3ZhciBBTkRST0lEX1RBR1MgPSB7CisgIHR5cGU6IHsKKyAgICAnYXJ0aWNsZSc6ICdBcnRpY2xlJywKKyAgICAndHV0b3JpYWwnOiAnVHV0b3JpYWwnLAorICAgICdzYW1wbGUnOiAnU2FtcGxlJywKKyAgICAndmlkZW8nOiAnVmlkZW8nLAorICAgICdsaWJyYXJ5JzogJ0NvZGUgTGlicmFyeScKKyAgfSwKKyAgdG9waWM6IHsKKyAgICAnYWNjZXNzaWJpbGl0eSc6ICdBY2Nlc3NpYmlsaXR5JywKKyAgICAnYWNjb3VudHN5bmMnOiAnQWNjb3VudHMgJmFtcDsgU3luYycsCisgICAgJ2Jlc3RwcmFjdGljZSc6ICdCZXN0IFByYWN0aWNlcycsCisgICAgJ2NvbW11bmljYXRpb24nOiAnQ29tbXVuaWNhdGlvbicsCisgICAgJ2NvbXBhdGliaWxpdHknOiAnQ29tcGF0aWJpbGl0eScsCisgICAgJ2RhdGEnOiAnRGF0YSBBY2Nlc3MnLAorICAgICdkcmF3aW5nJzogJ0NhbnZhcyBEcmF3aW5nJywKKyAgICAnZ2FtZWRldic6ICdHYW1lIERldmVsb3BtZW50JywKKyAgICAnZ2wnOiAnT3BlbkdMIEVTJywKKyAgICAnaW5wdXQnOiAnSW5wdXQgTWV0aG9kcycsCisgICAgJ2ludGVudCc6ICdJbnRlbnRzJywKKyAgICAnbGF5b3V0JzogJ0xheW91dHMvVmlld3MnLAorICAgICdtZWRpYSc6ICdNdWx0aW1lZGlhJywKKyAgICAnbmV3ZmVhdHVyZSc6ICdOZXcgRmVhdHVyZXMnLAorICAgICdwZXJmb3JtYW5jZSc6ICdQZXJmb3JtYW5jZScsCisgICAgJ3NlYXJjaCc6ICdTZWFyY2gnLAorICAgICd0ZXN0aW5nJzogJ1Rlc3RpbmcnLAorICAgICd1aSc6ICdVc2VyIEludGVyZmFjZScsCisgICAgJ3dlYic6ICdXZWIgQ29udGVudCcKKyAgfSwKKyAgbWlzYzogeworICAgICdleHRlcm5hbCc6ICdFeHRlcm5hbCcsCisgICAgJ25ldyc6ICdOZXcnCisgIH0KK307CisKK3ZhciBBTkRST0lEX1JFU09VUkNFUyA9IFsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLyBURUNITklDQUwgQVJUSUNMRVMgLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisgIHsKKyAgICB0YWdzOiBbJ2FydGljbGUnLCAncGVyZm9ybWFuY2UnLCAnYmVzdHByYWN0aWNlJ10sCisgICAgcGF0aDogJ2FydGljbGVzL2F2b2lkaW5nLW1lbW9yeS1sZWFrcy5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdBdm9pZGluZyBNZW1vcnkgTGVha3MnCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdNb2JpbGUgZGV2aWNlcyBvZnRlbiBoYXZlIGxpbWl0ZWQgbWVtb3J5LCBhbmQgbWVtb3J5IGxlYWtzIGNhbiBjYXVzZSB5b3VyIGFwcGxpY2F0aW9uIHRvIHdhc3RlIHRoaXMgdmFsdWFibGUgcmVzb3VyY2Ugd2l0aG91dCB5b3VyIGtub3dsZWRnZS4gVGhpcyBhcnRpY2xlIHByb3ZpZGVzIHRpcHMgdG8gaGVscCB5b3UgYXZvaWQgY29tbW9uIGNhdXNlcyBvZiBtZW1vcnkgbGVha3Mgb24gdGhlIEFuZHJvaWQgcGxhdGZvcm0uJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsnYXJ0aWNsZScsICdjb21wYXRpYmlsaXR5J10sCisgICAgcGF0aDogJ2FydGljbGVzL2JhY2t3YXJkLWNvbXBhdGliaWxpdHkuaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnQmFja3dhcmQgQ29tcGF0aWJpbGl0eScKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ1RoZSBBbmRyb2lkIHBsYXRmb3JtIHN0cml2ZXMgdG8gZW5zdXJlIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LiBIb3dldmVyLCBzb21ldGltZXMgeW91IHdhbnQgdG8gdXNlIG5ldyBmZWF0dXJlcyB3aGljaCBhcmVuXCd0IHN1cHBvcnRlZCBvbiBvbGRlciBwbGF0Zm9ybXMuIFRoaXMgYXJ0aWNsZSBkaXNjdXNzZXMgc3RyYXRlZ2llcyBmb3Igc2VsZWN0aXZlbHkgdXNpbmcgdGhlc2UgZmVhdHVyZXMgYmFzZWQgb24gYXZhaWxhYmlsaXR5LCBhbGxvd2luZyB5b3UgdG8ga2VlcCB5b3VyIGFwcGxpY2F0aW9ucyBwb3J0YWJsZSBhY3Jvc3MgYSB3aWRlIHJhbmdlIG9mIGRldmljZXMuJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsnYXJ0aWNsZScsICdpbnRlbnQnXSwKKyAgICBwYXRoOiAnYXJ0aWNsZXMvY2FuLWktdXNlLXRoaXMtaW50ZW50Lmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ0NhbiBJIFVzZSB0aGlzIEludGVudD8nCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdBbmRyb2lkIG9mZmVycyBhIHZlcnkgcG93ZXJmdWwgYW5kIHlldCBlYXN5LXRvLXVzZSBtZXNzYWdlIHR5cGUgY2FsbGVkIGFuIGludGVudC4gWW91IGNhbiB1c2UgaW50ZW50cyB0byB0dXJuIGFwcGxpY2F0aW9ucyBpbnRvIGhpZ2gtbGV2ZWwgbGlicmFyaWVzIGFuZCBtYWtlIGNvZGUgbW9kdWxhciBhbmQgcmV1c2FibGUuIFdoaWxlIGl0IGlzIG5pY2UgdG8gYmUgYWJsZSB0byBtYWtlIHVzZSBvZiBhIGxvb3NlbHkgY291cGxlZCBBUEksIHRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0IHRoZSBpbnRlbnQgeW91IHNlbmQgd2lsbCBiZSByZWNlaXZlZCBieSBhbm90aGVyIGFwcGxpY2F0aW9uLiBUaGlzIGFydGljbGUgZGVzY3JpYmVzIGEgdGVjaG5pcXVlIHlvdSBjYW4gdXNlIHRvIGZpbmQgb3V0IHdoZXRoZXIgdGhlIHN5c3RlbSBjb250YWlucyBhbnkgYXBwbGljYXRpb24gY2FwYWJsZSBvZiByZXNwb25kaW5nIHRvIHRoZSBpbnRlbnQgeW91IHdhbnQgdG8gdXNlLicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ2FydGljbGUnLCAnaW5wdXQnXSwKKyAgICBwYXRoOiAnYXJ0aWNsZXMvY3JlYXRpbmctaW5wdXQtbWV0aG9kLmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ0NyZWF0aW5nIGFuIElucHV0IE1ldGhvZCcKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ0lucHV0IE1ldGhvZCBFZGl0b3JzIChJTUVzKSBwcm92aWRlIHRoZSBtZWNoYW5pc20gZm9yIGVudGVyaW5nIHRleHQgaW50byB0ZXh0IGZpZWxkcyBhbmQgb3RoZXIgVmlld3MuIEFuZHJvaWQgZGV2aWNlcyBjb21lIGJ1bmRsZWQgd2l0aCBhdCBsZWFzdCBvbmUgSU1FLCBidXQgdXNlcnMgY2FuIGluc3RhbGwgYWRkaXRpb25hbCBJTUVzLiBUaGlzIGFydGljbGUgY292ZXJzIHRoZSBiYXNpY3Mgb2YgZGV2ZWxvcGluZyBhbiBJTUUgZm9yIHRoZSBBbmRyb2lkIHBsYXRmb3JtLicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ2FydGljbGUnLCAnZHJhd2luZycsICd1aSddLAorICAgIHBhdGg6ICdhcnRpY2xlcy9kcmF3YWJsZS1tdXRhdGlvbnMuaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnRHJhd2FibGUgTXV0YXRpb25zJworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnRHJhd2FibGVzIGFyZSBwbHVnZ2FibGUgZHJhd2luZyBjb250YWluZXJzIHRoYXQgYWxsb3cgYXBwbGljYXRpb25zIHRvIGRpc3BsYXkgZ3JhcGhpY3MuIFRoaXMgYXJ0aWNsZSBleHBsYWlucyBzb21lIGNvbW1vbiBwaXRmYWxscyB3aGVuIHRyeWluZyB0byBtb2RpZnkgdGhlIHByb3BlcnRpZXMgb2YgbXVsdGlwbGUgRHJhd2FibGVzLicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ2FydGljbGUnLCAnYmVzdHByYWN0aWNlJywgJ3VpJ10sCisgICAgcGF0aDogJ2FydGljbGVzL2Zhc3Rlci1zY3JlZW4tb3JpZW50YXRpb24tY2hhbmdlLmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ0Zhc3RlciBTY3JlZW4gT3JpZW50YXRpb24gQ2hhbmdlJworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnV2hlbiBhbiBBbmRyb2lkIGRldmljZSBjaGFuZ2VzIGl0cyBvcmllbnRhdGlvbiwgdGhlIGRlZmF1bHQgYmVoYXZpb3IgaXMgdG8gYXV0b21hdGljYWxseSByZXN0YXJ0IHRoZSBjdXJyZW50IGFjdGl2aXR5IHdpdGggYSBuZXcgY29uZmlndXJhdGlvbi4gSG93ZXZlciwgdGhpcyBjYW4gYmVjb21lIGEgYm90dGxlbmVjayBpbiBhcHBsaWNhdGlvbnMgdGhhdCBhY2Nlc3MgYSBsYXJnZSBhbW91bnQgb2YgZXh0ZXJuYWwgZGF0YS4gVGhpcyBhcnRpY2xlIGRpc2N1c3NlcyBob3cgdG8gZ3JhY2VmdWxseSBoYW5kbGUgdGhpcyBzaXR1YXRpb24gd2l0aG91dCByZXNvcnRpbmcgdG8gbWFudWFsbHkgcHJvY2Vzc2luZyBjb25maWd1cmF0aW9uIGNoYW5nZXMuJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsnYXJ0aWNsZScsICdjb21wYXRpYmlsaXR5J10sCisgICAgcGF0aDogJ2FydGljbGVzL2Z1dHVyZS1wcm9vZmluZy5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdGdXR1cmUtUHJvb2ZpbmcgWW91ciBBcHBzJworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnQSBjb2xsZWN0aW9uIG9mIGNvbW1vbiBzZW5zZSBhZHZpY2UgdG8gaGVscCB5b3UgZW5zdXJlIHRoYXQgeW91ciBhcHBsaWNhdGlvbnMgZG9uXCd0IGJyZWFrIHdoZW4gbmV3IHZlcnNpb25zIG9mIHRoZSBBbmRyb2lkIHBsYXRmb3JtIGFyZSByZWxlYXNlZC4nCisgICAgfQorICB9LAorICB7CisgICAgdGFnczogWydhcnRpY2xlJywgJ2lucHV0J10sCisgICAgcGF0aDogJ2FydGljbGVzL2dlc3R1cmVzLmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ0dlc3R1cmVzJworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnVG91Y2ggc2NyZWVucyBhbGxvdyB1c2VycyB0byBwZXJmb3JtIGdlc3R1cmVzLCBzdWNoIGFzIHRhcHBpbmcsIGRyYWdnaW5nLCBmbGluZ2luZywgb3Igc2xpZGluZywgdG8gcGVyZm9ybSB2YXJpb3VzIGFjdGlvbnMuIFRoZSBnZXN0dXJlcyBBUEkgZW5hYmxlcyB5b3VyIGFwcGxpY2F0aW9uIHRvIHJlY29nbml6ZSBldmVuIGNvbXBsaWNhdGVkIGdlc3R1cmVzIHdpdGggZWFzZS4gVGhpcyBhcnRpY2xlIGV4cGxhaW5zIGhvdyB0byBpbnRlZ3JhdGUgdGhpcyBBUEkgaW50byBhbiBhcHBsaWNhdGlvbi4nCisgICAgfQorICB9LAorICB7CisgICAgdGFnczogWydhcnRpY2xlJywgJ2dhbWVkZXYnLCAnZ2wnXSwKKyAgICBwYXRoOiAnYXJ0aWNsZXMvZ2xzdXJmYWNldmlldy5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdJbnRyb2R1Y2luZyBHTFN1cmZhY2VWaWV3JworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnVGhpcyBhcnRpY2xlIHByb3ZpZGVzIGFuIG92ZXJ2aWV3IG9mIEdMU3VyZmFjZVZpZXcsIGEgY2xhc3MgdGhhdCBtYWtlcyBpdCBlYXN5IHRvIGltcGxlbWVudCAyRCBvciAzRCBPcGVuR0wgcmVuZGVyaW5nIGluc2lkZSBvZiBhbiBBbmRyb2lkIGFwcGxpY2F0aW9uLicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ2FydGljbGUnLCAndWknLCAnbGF5b3V0J10sCisgICAgcGF0aDogJ2FydGljbGVzL2xheW91dC10cmlja3MtcmV1c2UuaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnTGF5b3V0IFRyaWNrczogQ3JlYXRpbmcgUmV1c2FibGUgVUkgQ29tcG9uZW50cycKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ0xlYXJuIGhvdyB0byBjb21iaW5lIG11bHRpcGxlIHN0YW5kYXJkIFVJIHdpZGdldHMgaW50byBhIHNpbmdsZSBoaWdoLWxldmVsIGNvbXBvbmVudCwgd2hpY2ggY2FuIGJlIHJldXNlZCB0aHJvdWdob3V0IHlvdXIgYXBwbGljYXRpb24uJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsnYXJ0aWNsZScsICdsYXlvdXQnLCAndWknLCAncGVyZm9ybWFuY2UnLCAnYmVzdHByYWN0aWNlJ10sCisgICAgcGF0aDogJ2FydGljbGVzL2xheW91dC10cmlja3MtZWZmaWNpZW5jeS5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdMYXlvdXQgVHJpY2tzOiBDcmVhdGluZyBFZmZpY2llbnQgTGF5b3V0cycKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ0xlYXJuIGhvdyB0byBvcHRpbWl6ZSBhcHBsaWNhdGlvbiBsYXlvdXRzIGFzIHRoaXMgYXJ0aWNsZSB3YWxrcyB5b3UgdGhyb3VnaCBjb252ZXJ0aW5nIGEgTGluZWFyTGF5b3V0IGludG8gYSBSZWxhdGl2ZUxheW91dCwgYW5kIGFuYWx5emVzIHRoZSByZXN1bHRpbmcgaW1wbGljYXRpb25zIG9uIHBlcmZvcm1hbmNlLicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ2FydGljbGUnLCAnbGF5b3V0JywgJ3VpJywgJ3BlcmZvcm1hbmNlJywgJ2Jlc3RwcmFjdGljZSddLAorICAgIHBhdGg6ICdhcnRpY2xlcy9sYXlvdXQtdHJpY2tzLXN0dWJzLmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ0xheW91dCBUcmlja3M6IFVzaW5nIFZpZXdTdHVicycKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ0xlYXJuIGFib3V0IHVzaW5nIFZpZXdTdHVicyBpbnNpZGUgYW4gYXBwbGljYXRpb25cJ3MgbGF5b3V0IGluIG9yZGVyIHRvIGluZmxhdGUgcmFyZWx5IHVzZWQgVUkgZWxlbWVudHMsIHdpdGhvdXQgdGhlIHBlcmZvcm1hbmNlIGltcGxpY2F0aW9ucyB3aGljaCB3b3VsZCBvdGhlcndpc2UgYmUgY2F1c2VkIGJ5IHVzaW5nIHRoZSA8Y29kZT4mbHQ7aW5jbHVkZSZndDs8L2NvZGU+IHRhZy4nCisgICAgfQorICB9LAorICB7CisgICAgdGFnczogWydhcnRpY2xlJywgJ2xheW91dCcsICd1aScsICdwZXJmb3JtYW5jZScsICdiZXN0cHJhY3RpY2UnXSwKKyAgICBwYXRoOiAnYXJ0aWNsZXMvbGF5b3V0LXRyaWNrcy1tZXJnZS5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdMYXlvdXQgVHJpY2tzOiBNZXJnaW5nIExheW91dHMnCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdMZWFybiBob3cgdG8gdXNlIHRoZSA8Y29kZT4mbHQ7bWVyZ2UmZ3Q7PC9jb2RlPiB0YWcgaW4geW91ciBYTUwgbGF5b3V0cyBpbiBvcmRlciB0byBhdm9pZCB1bm5lY2Vzc2FyeSBsZXZlbHMgb2YgaGllcmFyY2h5IHdpdGhpbiBhbiBhcHBsaWNhdGlvblwncyB2aWV3IHRyZWUuJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsnYXJ0aWNsZScsICd1aScsICdwZXJmb3JtYW5jZSddLAorICAgIHBhdGg6ICdhcnRpY2xlcy9saXN0dmlldy1iYWNrZ3JvdW5kcy5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdMaXN0VmlldyBCYWNrZ3JvdW5kczogQW4gT3B0aW1pemF0aW9uJworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnTGlzdFZpZXdzIGFyZSB2ZXJ5IHBvcHVsYXIgd2lkZ2V0cyB3aXRoaW4gdGhlIEFuZHJvaWQgZnJhbWV3b3JrLiBUaGlzIGFydGljbGUgZGVzY3JpYmVzIHNvbWUgb2YgdGhlIG9wdGltaXphdGlvbnMgdXNlZCBieSB0aGUgTGlzdFZpZXcgd2lkZ2V0LCBhbmQgaG93IHRvIGF2b2lkIHNvbWUgY29tbW9uIGlzc3VlcyB0aGF0IHRoaXMgY2F1c2VzIHdoZW4gdHJ5aW5nIHRvIHVzZSBhIGN1c3RvbSBiYWNrZ3JvdW5kLicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ2FydGljbGUnLCAndWknLCAnbmV3ZmVhdHVyZSddLAorICAgIHBhdGg6ICdhcnRpY2xlcy9saXZlLWZvbGRlcnMuaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnTGl2ZSBGb2xkZXJzJworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnTGl2ZSBGb2xkZXJzIGFsbG93IHVzZXJzIHRvIGRpc3BsYXkgYW55IHNvdXJjZSBvZiBkYXRhIG9uIHRoZWlyIGhvbWUgc2NyZWVuIHdpdGhvdXQgbGF1bmNoaW5nIGFuIGFwcGxpY2F0aW9uLiBUaGlzIGFydGljbGUgZGlzY3Vzc2VzIGhvdyB0byBleHBvcnQgYW4gYXBwbGljYXRpb25cJ3MgZGF0YSBpbiBhIGZvcm1hdCBzdWl0YWJsZSBmb3IgZGlzcGxheSBpbnNpZGUgb2YgYSBsaXZlIGZvbGRlci4nCisgICAgfQorICB9LAorICB7CisgICAgdGFnczogWydhcnRpY2xlJywgJ3VpJywgJ25ld2ZlYXR1cmUnXSwKKyAgICBwYXRoOiAnYXJ0aWNsZXMvbGl2ZS13YWxscGFwZXJzLmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ0xpdmUgV2FsbHBhcGVycycKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ0xpdmUgd2FsbHBhcGVycyBhcmUgcmljaGVyLCBhbmltYXRlZCwgaW50ZXJhY3RpdmUgYmFja2dyb3VuZHMgdGhhdCB1c2VycyBjYW4gZGlzcGxheSBpbiB0aGVpciBob21lIHNjcmVlbnMuIExlYXJuIGhvdyB0byBjcmVhdGUgYSBsaXZlIHdhbGxwYXBlciBhbmQgYnVuZGxlIGl0IGluIGFuIGFwcGxpY2F0aW9uIHRoYXQgdXNlcnMgY2FuIGluc3RhbGwgb24gdGhlaXIgZGV2aWNlcy4nCisgICAgfQorICB9LAorICB7CisgICAgdGFnczogWydhcnRpY2xlJywgJ2lucHV0J10sCisgICAgcGF0aDogJ2FydGljbGVzL29uLXNjcmVlbi1pbnB1dHMuaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnT25zY3JlZW4gSW5wdXQgTWV0aG9kcycKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ1RoZSBJbnB1dCBNZXRob2QgRnJhbWV3b3JrIChJTUYpIGFsbG93cyB1c2VycyB0byB0YWtlIGFkdmFudGFnZSBvZiBvbi1zY3JlZW4gaW5wdXQgbWV0aG9kcywgc3VjaCBhcyBzb2Z0d2FyZSBrZXlib2FyZHMuIFRoaXMgYXJ0aWNsZSBwcm92aWRlcyBhbiBvdmVydmlldyBvZiBJbnB1dCBNZXRob2QgRWRpdG9ycyAoSU1FcykgYW5kIGhvdyBhcHBsaWNhdGlvbnMgaW50ZXJhY3Qgd2l0aCB0aGVtLicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ2FydGljbGUnLCAncGVyZm9ybWFuY2UnLCAnYmVzdHByYWN0aWNlJ10sCisgICAgcGF0aDogJ2FydGljbGVzL3BhaW5sZXNzLXRocmVhZGluZy5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdQYWlubGVzcyBUaHJlYWRpbmcnCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdUaGlzIGFydGljbGUgZGlzY3Vzc2VzIHRoZSB0aHJlYWRpbmcgbW9kZWwgdXNlZCBieSBBbmRyb2lkIGFwcGxpY2F0aW9ucyBhbmQgaG93IGFwcGxpY2F0aW9ucyBjYW4gZW5zdXJlIGJlc3QgVUkgcGVyZm9ybWFuY2UgYnkgc3Bhd25pbmcgd29ya2VyIHRocmVhZHMgdG8gaGFuZGxlIGxvbmctcnVubmluZyBvcGVyYXRpb25zLCByYXRoZXIgdGhhbiBoYW5kbGluZyB0aGVtIGluIHRoZSBtYWluIHRocmVhZC4gVGhlIGFydGljbGUgYWxzbyBleHBsYWlucyB0aGUgQVBJIHRoYXQgeW91ciBhcHBsaWNhdGlvbiBjYW4gdXNlIHRvIGludGVyYWN0IHdpdGggQW5kcm9pZCBVSSB0b29sa2l0IGNvbXBvbmVudHMgcnVubmluZyBvbiB0aGUgbWFpbiB0aHJlYWQgYW5kIHNwYXduIG1hbmFnZWQgd29ya2VyIHRocmVhZHMuJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsnYXJ0aWNsZScsICd1aScsICdzZWFyY2gnXSwKKyAgICBwYXRoOiAnYXJ0aWNsZXMvcXNiLmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ1F1aWNrIFNlYXJjaCBCb3gnCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdRdWljayBTZWFyY2ggQm94IChRU0IpIGlzIGEgcG93ZXJmdWwsIHN5c3RlbS13aWRlIHNlYXJjaCBmcmFtZXdvcmsuIFFTQiBtYWtlcyBpdCBwb3NzaWJsZSBmb3IgdXNlcnMgdG8gcXVpY2tseSBhbmQgZWFzaWx5IGZpbmQgd2hhdCB0aGV5XCdyZSBsb29raW5nIGZvciwgYm90aCBvbiB0aGVpciBkZXZpY2VzIGFuZCBvbiB0aGUgd2ViLiBUaGlzIGFydGljbGUgZGlzY3Vzc2VzIGhvdyB0byB3b3JrIHdpdGggdGhlIFFTQiBmcmFtZXdvcmsgdG8gYWRkIG5ldyBzZWFyY2ggcmVzdWx0cyBmb3IgYW4gaW5zdGFsbGVkIGFwcGxpY2F0aW9uLicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ2FydGljbGUnLCAndWknXSwKKyAgICBwYXRoOiAnYXJ0aWNsZXMvdG91Y2gtbW9kZS5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdUb3VjaCBNb2RlJworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnVGhpcyBhcnRpY2xlIGV4cGxhaW5zIHRoZSB0b3VjaCBtb2RlLCBvbmUgb2YgdGhlIG1vc3QgaW1wb3J0YW50IHByaW5jaXBsZXMgb2YgQW5kcm9pZFwncyBVSSB0b29sa2l0LiBXaGVuZXZlciBhIHVzZXIgaW50ZXJhY3RzIHdpdGggYSBkZXZpY2VcJ3MgdG91Y2ggc2NyZWVuLCB0aGUgc3lzdGVtIGVudGVycyB0b3VjaCBtb2RlLiBXaGlsZSBzaW1wbGUgaW4gY29uY2VwdCwgdGhlcmUgYXJlIGltcG9ydGFudCBpbXBsaWNhdGlvbnMgdG91Y2ggbW9kZSB0aGF0IGFyZSBvZnRlbiBvdmVybG9va2VkLicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ2FydGljbGUnLCAncGVyZm9ybWFuY2UnLCAnYmVzdHByYWN0aWNlJ10sCisgICAgcGF0aDogJ2FydGljbGVzL3RyYWNrLW1lbS5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdUcmFja2luZyBNZW1vcnkgQWxsb2NhdGlvbnMnCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdUaGlzIGFydGljbGUgZGlzY3Vzc2VzIGhvdyB0byB1c2UgdGhlIEFsbG9jYXRpb24gVHJhY2tlciB0b29sIHRvIG9ic2VydmUgbWVtb3J5IGFsbG9jYXRpb25zIGFuZCBhdm9pZCBwZXJmb3JtYW5jZSBwcm9ibGVtcyB0aGF0IHdvdWxkIG90aGVyd2lzZSBiZSBjYXVzZWQgYnkgaWdub3JpbmcgdGhlIGVmZmVjdCBvZiBEYWx2aWtcJ3MgZ2FyYmFnZSBjb2xsZWN0b3IuJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsnYXJ0aWNsZScsICduZXdmZWF0dXJlJ10sCisgICAgcGF0aDogJ2FydGljbGVzL3VpLTEuNS5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdVSSBGcmFtZXdvcmsgQ2hhbmdlcyBpbiBBbmRyb2lkIDEuNScKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ0V4cGxvcmUgdGhlIFVJIGNoYW5nZXMgdGhhdCB3ZXJlIGludHJvZHVjZWQgaW4gQW5kcm9pZCAxLjUsIGNvbXBhcmVkIHdpdGggdGhlIFVJIHByb3ZpZGVkIGluIEFuZHJvaWQgMS4wIGFuZCAxLjEuJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsnYXJ0aWNsZScsICduZXdmZWF0dXJlJ10sCisgICAgcGF0aDogJ2FydGljbGVzL3VpLTEuNi5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdVSSBGcmFtZXdvcmsgQ2hhbmdlcyBpbiBBbmRyb2lkIDEuNicKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ0V4cGxvcmUgdGhlIFVJIGNoYW5nZXMgdGhhdCB3ZXJlIGludHJvZHVjZWQgaW4gQW5kcm9pZCAxLjYsIGNvbXBhcmVkIHdpdGggdGhlIFVJIHByb3ZpZGVkIGluIEFuZHJvaWQgMS41LiBJbiBwYXJ0aWN1bGFyLCB0aGlzIGFydGljbGUgZGlzY3Vzc2VzIGNoYW5nZXMgdG8gUmVsYXRpdmVMYXlvdXRzIGFuZCBjbGljayBsaXN0ZW5lcnMuJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsnYXJ0aWNsZScsICd1aScsICdiZXN0cHJhY3RpY2UnXSwKKyAgICBwYXRoOiAnYXJ0aWNsZXMvdGltZWQtdWktdXBkYXRlcy5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdVcGRhdGluZyB0aGUgVUkgZnJvbSBhIFRpbWVyJworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnTGVhcm4gYWJvdXQgaG93IHRvIHVzZSBIYW5kbGVycyBhcyBhIG1vcmUgZWZmaWNpZW50IHJlcGxhY2VtZW50IGZvciBqYXZhLnV0aWwuVGltZXIgb24gdGhlIEFuZHJvaWQgcGxhdGZvcm0uJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsnYXJ0aWNsZScsICd1aScsICdhY2Nlc3NpYmlsaXR5J10sCisgICAgcGF0aDogJ2FydGljbGVzL3R0cy5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdVc2luZyBUZXh0LXRvLVNwZWVjaCcKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ1RoZSB0ZXh0LXRvLXNwZWVjaCBBUEkgbGV0cyB5b3VyIGFwcGxpY2F0aW9uICJzcGVhayIgdG8gdXNlcnMsIGluIGFueSBvZiBzZXZlcmFsIGxhbmd1YWdlcy4gVGhpcyBhcnRpY2xlIHByb3ZpZGVzIGFuIG92ZXJ2aWV3IG9mIHRoZSBUVFMgQVBJIGFuZCBob3cgeW91IHVzZSB0byBhZGQgc3BlZWNoIGNhcGFiaWxpdGllcyB0byB5b3VyIGFwcGxpY2F0aW9uLicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ2FydGljbGUnLCAndWknLCAnd2ViJ10sCisgICAgcGF0aDogJ2FydGljbGVzL3VzaW5nLXdlYnZpZXdzLmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ1VzaW5nIFdlYlZpZXdzJworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnV2ViVmlld3MgYWxsb3cgYW4gYXBwbGljYXRpb24gdG8gZHluYW1pY2FsbHkgZGlzcGxheSBIVE1MIGFuZCBleGVjdXRlIEphdmFTY3JpcHQsIHdpdGhvdXQgcmVsaW5xdWlzaGluZyBjb250cm9sIHRvIGEgc2VwYXJhdGUgYnJvd3NlciBhcHBsaWNhdGlvbi4gVGhpcyBhcnRpY2xlIGludHJvZHVjZXMgdGhlIFdlYlZpZXcgY2xhc3NlcyBhbmQgcHJvdmlkZXMgYSBzYW1wbGUgYXBwbGljYXRpb24gdGhhdCBkZW1vbnN0cmF0ZXMgaXRzIHVzZS4nCisgICAgfQorICB9LAorICB7CisgICAgdGFnczogWydhcnRpY2xlJywgJ3VpJ10sCisgICAgcGF0aDogJ2FydGljbGVzL3dpa2lub3Rlcy1saW5raWZ5Lmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ1dpa2lOb3RlczogTGlua2lmeSB5b3VyIFRleHQhJworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnVGhpcyBhcnRpY2xlIGludHJvZHVjZXMgV2lraU5vdGVzIGZvciBBbmRyb2lkLCBwYXJ0IG9mIHRoZSBBcHBzIGZvciBBbmRyb2lkIHByb2plY3QuIEl0IGNvdmVycyB0aGUgdXNlIG9mIExpbmtpZnkgdG8gdHVybiBvcmRpbmFyeSB0ZXh0IHZpZXdzIGludG8gcmljaGVyLCBsaW5rLW9yaWVudGVkIGNvbnRlbnQgdGhhdCBjYXVzZXMgQW5kcm9pZCBpbnRlbnRzIHRvIGZpcmUgd2hlbiBhIGxpbmsgaXMgc2VsZWN0ZWQuJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsnYXJ0aWNsZScsICdpbnRlbnQnXSwKKyAgICBwYXRoOiAnYXJ0aWNsZXMvd2lraW5vdGVzLWludGVudHMuaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnV2lraU5vdGVzOiBSb3V0aW5nIEludGVudHMnCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdUaGlzIGFydGljbGUgaWxsdXN0cmF0ZXMgaG93IGFuIGFwcGxpY2F0aW9uLCBpbiB0aGlzIGNhc2UgdGhlIFdpa2lOb3RlcyBzYW1wbGUgYXBwLCBjYW4gdXNlIGludGVudHMgdG8gcm91dGUgdmFyaW91cyB0eXBlcyBvZiBsaW5rZWQgdGV4dCB0byB0aGUgYXBwbGljYXRpb24gdGhhdCBoYW5kbGVzIHRoYXQgdHlwZSBvZiBkYXRhLiBGb3IgZXhhbXBsZSwgYW4gYXBwIGNhbiB1c2UgaW50ZW50cyB0byByb3V0ZSBhIGxpbmtlZCB0ZWxlcGhvbmUgbnVtYmVyIHRvIGEgZGlhbGVyIGFwcCBhbmQgYSB3ZWIgVVJMIHRvIGEgYnJvd3Nlci4nCisgICAgfQorICB9LAorICB7CisgICAgdGFnczogWydhcnRpY2xlJywgJ3VpJywgJ3BlcmZvcm1hbmNlJ10sCisgICAgcGF0aDogJ2FydGljbGVzL3dpbmRvdy1iZy1zcGVlZC5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdXaW5kb3cgQmFja2dyb3VuZHMgJiBVSSBTcGVlZCcKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ1NvbWUgQW5kcm9pZCBhcHBsaWNhdGlvbnMgbmVlZCB0byBzcXVlZXplIGV2ZXJ5IGJpdCBvZiBwZXJmb3JtYW5jZSBvdXQgb2YgdGhlIFVJIHRvb2xraXQgYW5kIHRoZXJlIGFyZSBtYW55IHdheXMgdG8gZG8gc28uIEluIHRoaXMgYXJ0aWNsZSwgeW91IHdpbGwgZGlzY292ZXIgaG93IHRvIHNwZWVkIHVwIHRoZSBkcmF3aW5nIGFuZCB0aGUgcGVyY2VpdmVkIHN0YXJ0dXAgdGltZSBvZiB5b3VyIGFjdGl2aXRpZXMuIEJvdGggb2YgdGhlc2UgdGVjaG5pcXVlcyByZWx5IG9uIGEgc2luZ2xlIGZlYXR1cmUsIHRoZSB3aW5kb3dcJ3MgYmFja2dyb3VuZCBkcmF3YWJsZS4nCisgICAgfQorICB9LAorICB7CisgICAgdGFnczogWydhcnRpY2xlJywgJ3BlcmZvcm1hbmNlJywgJ2Jlc3RwcmFjdGljZSddLAorICAgIHBhdGg6ICdhcnRpY2xlcy96aXBhbGlnbi5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdaaXBhbGlnbjogYW4gRWFzeSBPcHRpbWl6YXRpb24nCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdUaGUgQW5kcm9pZCBTREsgaW5jbHVkZXMgYSB0b29sIGNhbGxlZCB6aXBhbGlnbiB0aGF0IG9wdGltaXplcyB0aGUgd2F5IGFuIGFwcGxpY2F0aW9uIGlzIHBhY2thZ2VkLiBSdW5uaW5nIHppcGFsaWduIGFnYWluc3QgeW91ciBhcHBsaWNhdGlvbiBlbmFibGVzIEFuZHJvaWQgdG8gaW50ZXJhY3Qgd2l0aCBpdCBtb3JlIGVmZmljaWVudGx5IGF0IHJ1biB0aW1lIGFuZCB0aHVzIGhhcyB0aGUgcG90ZW50aWFsIHRvIG1ha2UgaXQgYW5kIHRoZSBvdmVyYWxsIHN5c3RlbSBydW4gZmFzdGVyLiBUaGlzIGFydGljbGUgcHJvdmlkZXMgYSBoaWdoLWxldmVsIG92ZXJ2aWV3IG9mIHRoZSB6aXBhbGlnbiB0b29sIGFuZCBpdHMgdXNlLicKKyAgICB9CisgIH0sCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLyBTQU1QTEUgQ09ERSAvLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICB7CisgICAgdGFnczogWydzYW1wbGUnLCAnbGF5b3V0JywgJ3VpJ10sCisgICAgcGF0aDogJ3NhbXBsZXMvQXBpRGVtb3MvaW5kZXguaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnQVBJIERlbW9zJworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnQSB2YXJpZXR5IG9mIHNtYWxsIGFwcGxpY2F0aW9ucyB0aGF0IGRlbW9uc3RyYXRlIGFuIGV4dGVuc2l2ZSBjb2xsZWN0aW9uIG9mIGZyYW1ld29yayB0b3BpY3MuJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsnc2FtcGxlJywgJ2RhdGEnLCAnbmV3ZmVhdHVyZScsICdhY2NvdW50c3luYycsICduZXcnXSwKKyAgICBwYXRoOiAnc2FtcGxlcy9CYWNrdXBSZXN0b3JlL2luZGV4Lmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ0JhY2t1cCBhbmQgUmVzdG9yZScKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ0lsbHVzdHJhdGVzIGEgZmV3IGRpZmZlcmVudCBhcHByb2FjaGVzIHRoYXQgYW4gYXBwbGljYXRpb24gZGV2ZWxvcGVyIGNhbiB0YWtlIHdoZW4gaW50ZWdyYXRpbmcgd2l0aCB0aGUgQW5kcm9pZCBCYWNrdXAgTWFuYWdlciB1c2luZyB0aGUgQmFja3VwQWdlbnQgQVBJIGludHJvZHVjZWQgaW4gQW5kcm9pZCAyLjIuJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsnc2FtcGxlJywgJ2NvbW11bmljYXRpb24nXSwKKyAgICBwYXRoOiAnc2FtcGxlcy9CbHVldG9vdGhDaGF0L2luZGV4Lmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ0JsdWV0b290aCBDaGF0JworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnQW4gYXBwbGljYXRpb24gZm9yIHR3by13YXkgdGV4dCBtZXNzYWdpbmcgb3ZlciBCbHVldG9vdGguJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsnc2FtcGxlJywgJ2FjY291bnRzeW5jJ10sCisgICAgcGF0aDogJ3NhbXBsZXMvQnVzaW5lc3NDYXJkL2luZGV4Lmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ0J1c2luZXNzQ2FyZCcKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ0FuIGFwcGxpY2F0aW9uIHRoYXQgZGVtb25zdHJhdGVzIGhvdyB0byBsYXVuY2ggdGhlIGJ1aWx0LWluIGNvbnRhY3QgcGlja2VyIGZyb20gd2l0aGluIGFuIGFjdGl2aXR5LiBUaGlzIHNhbXBsZSBhbHNvIHVzZXMgcmVmbGVjdGlvbiB0byBlbnN1cmUgdGhhdCB0aGUgY29ycmVjdCB2ZXJzaW9uIG9mIHRoZSBjb250YWN0cyBBUEkgaXMgdXNlZCwgZGVwZW5kaW5nIG9uIHdoaWNoIEFQSSBsZXZlbCB0aGUgYXBwbGljYXRpb24gaXMgcnVubmluZyB1bmRlci4nCisgICAgfQorICB9LAorICB7CisgICAgdGFnczogWydzYW1wbGUnLCAnYWNjb3VudHN5bmMnXSwKKyAgICBwYXRoOiAnc2FtcGxlcy9Db250YWN0TWFuYWdlci9pbmRleC5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdDb250YWN0IE1hbmFnZXInCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdBbiBhcHBsaWNhdGlvbiB0aGF0IGRlbW9uc3RyYXRlcyBob3cgdG8gcXVlcnkgdGhlIHN5c3RlbSBjb250YWN0cyBwcm92aWRlciAgdXNpbmcgdGhlIDxjb2RlPkNvbnRhY3RzQ29udHJhY3Q8L2NvZGU+IEFQSSwgYXMgd2VsbCBhcyBpbnNlcnQgY29udGFjdHMgaW50byBhIHNwZWNpZmljIGFjY291bnQuJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsnc2FtcGxlJ10sCisgICAgcGF0aDogJ3NhbXBsZXMvSG9tZS9pbmRleC5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdIb21lJworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnQSBob21lIHNjcmVlbiByZXBsYWNlbWVudCBhcHBsaWNhdGlvbi4nCisgICAgfQorICB9LAorICB7CisgICAgdGFnczogWydzYW1wbGUnLCAnZ2FtZWRldicsICdtZWRpYSddLAorICAgIHBhdGg6ICdzYW1wbGVzL0pldEJveS9pbmRleC5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdKZXRCb3knCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdBIGdhbWUgdGhhdCBkZW1vbnN0cmF0ZXMgdGhlIFNPTmlWT1ggSkVUIGludGVyYWN0aXZlIG11c2ljIHRlY2hub2xvZ3ksIHdpdGggPGNvZGU+PGEgaHJlZj0iL3JlZmVyZW5jZS9hbmRyb2lkL21lZGlhL0pldFBsYXllci5odG1sIj5KZXRQbGF5ZXI8L2E+PC9jb2RlPi4nCisgICAgfQorICB9LAorICB7CisgICAgdGFnczogWydzYW1wbGUnLCAndWknLCAnbmV3ZmVhdHVyZSddLAorICAgIHBhdGg6ICdzYW1wbGVzL0N1YmVMaXZlV2FsbHBhcGVyL2luZGV4Lmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ0xpdmUgV2FsbHBhcGVyJworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnQW4gYXBwbGljYXRpb24gdGhhdCBkZW1vbnN0cmF0ZXMgaG93IHRvIGNyZWF0ZSBhIGxpdmUgd2FsbHBhcGVyIGFuZCAgYnVuZGxlIGl0IGluIGFuIGFwcGxpY2F0aW9uIHRoYXQgdXNlcnMgY2FuIGluc3RhbGwgb24gdGhlaXIgZGV2aWNlcy4nCisgICAgfQorICB9LAorICB7CisgICAgdGFnczogWydzYW1wbGUnLCAnZ2FtZWRldicsICdtZWRpYSddLAorICAgIHBhdGg6ICdzYW1wbGVzL0x1bmFyTGFuZGVyL2luZGV4Lmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ0x1bmFyIExhbmRlcicKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ0EgY2xhc3NpYyBMdW5hciBMYW5kZXIgZ2FtZS4nCisgICAgfQorICB9LAorICB7CisgICAgdGFnczogWydzYW1wbGUnLCAndWknLCAnYmVzdHByYWN0aWNlJywgJ2xheW91dCddLAorICAgIHBhdGg6ICdzYW1wbGVzL011bHRpUmVzb2x1dGlvbi9pbmRleC5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdNdWx0aXBsZSBSZXNvbHV0aW9ucycKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ0Egc2FtcGxlIGFwcGxpY2F0aW9uIHRoYXQgc2hvd3MgaG93IHRvIHVzZSByZXNvdXJjZSBkaXJlY3RvcnkgcXVhbGlmaWVycyB0byBwcm92aWRlIGRpZmZlcmVudCByZXNvdXJjZXMgZm9yIGRpZmZlcmVudCBzY3JlZW4gY29uZmlndXJhdGlvbnMuJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsnc2FtcGxlJywgJ2RhdGEnXSwKKyAgICBwYXRoOiAnc2FtcGxlcy9Ob3RlUGFkL2luZGV4Lmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ05vdGUgUGFkJworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnQW4gYXBwbGljYXRpb24gZm9yIHNhdmluZyBub3Rlcy4gU2ltaWxhciAoYnV0IG5vdCBpZGVudGljYWwpIHRvIHRoZSA8YSBocmVmPSIvcmVzb3VyY2VzL3R1dG9yaWFscy9ub3RlcGFkL2luZGV4Lmh0bWwiPk5vdGVwYWQgdHV0b3JpYWw8L2E+LicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ3NhbXBsZScsICdhY2NvdW50c3luYyddLAorICAgIHBhdGg6ICdzYW1wbGVzL1NhbXBsZVN5bmNBZGFwdGVyL2luZGV4Lmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ1NhbXBsZVN5bmNBZGFwdGVyJworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnRGVtb25zdHJhdGVzIGhvdyBhbiBhcHBsaWNhdGlvbiBjYW4gY29tbXVuaWNhdGUgd2l0aCBhIGNsb3VkLWJhc2VkIHNlcnZpY2UgYW5kIHN5bmNocm9uaXplIGl0cyBkYXRhIHdpdGggZGF0YSBzdG9yZWQgbG9jYWxseSBpbiBhIGNvbnRlbnQgcHJvdmlkZXIuIFRoZSBzYW1wbGUgdXNlcyB0d28gcmVsYXRlZCBwYXJ0cyBvZiB0aGUgQW5kcm9pZCBmcmFtZXdvcmsgJm1kYXNoOyB0aGUgYWNjb3VudCBtYW5hZ2VyIGFuZCB0aGUgc3luY2hyb25pemF0aW9uIG1hbmFnZXIgKHRocm91Z2ggYSBzeW5jIGFkYXB0ZXIpLicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ3NhbXBsZScsICd1aScsICdzZWFyY2gnLCAnbmV3J10sCisgICAgcGF0aDogJ3NhbXBsZXMvU2VhcmNoYWJsZURpY3Rpb25hcnkvaW5kZXguaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnU2VhcmNoYWJsZSBEaWN0aW9uYXJ5IHYyJworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnQSBzYW1wbGUgYXBwbGljYXRpb24gdGhhdCBkZW1vbnN0cmF0ZXMgQW5kcm9pZFwncyBzZWFyY2ggZnJhbWV3b3JrLCBpbmNsdWRpbmcgaG93IHRvIHByb3ZpZGUgc2VhcmNoIHN1Z2dlc3Rpb25zIGZvciBRdWljayBTZWFyY2ggQm94LicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ3NhbXBsZScsICdsYXlvdXQnLCAndWknXSwKKyAgICBwYXRoOiAnc2FtcGxlcy9TbmFrZS9pbmRleC5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdTbmFrZScKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ0FuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBjbGFzc2ljIGdhbWUgIlNuYWtlLiInCisgICAgfQorICB9LAorICB7CisgICAgdGFnczogWydzYW1wbGUnLCAndGVzdGluZycsICduZXcnXSwKKyAgICBwYXRoOiAnc2FtcGxlcy9TcGlubmVyL2luZGV4Lmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ1NwaW5uZXInCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdBIHNpbXBsZSBhcHBsaWNhdGlvbiB0aGF0IHNlcnZlcyBhcyBhbiBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0IGZvciB0aGUgU3Bpbm5lclRlc3QgZXhhbXBsZS4nCisgICAgfQorICB9LAorICB7CisgICAgdGFnczogWydzYW1wbGUnLCAndGVzdGluZycsICduZXcnXSwKKyAgICBwYXRoOiAnc2FtcGxlcy9TcGlubmVyVGVzdC9pbmRleC5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdTcGlubmVyVGVzdCcKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ1RoZSB0ZXN0IGFwcGxpY2F0aW9uIGZvciB0aGUgQWN0aXZpdHkgVGVzdGluZyB0dXRvcmlhbC4gSXQgdGVzdHMgdGhlIFNwaW5uZXIgZXhhbXBsZSBhcHBsaWNhdGlvbi4nCisgICAgfQorICB9LAorICB7CisgICAgdGFnczogWydzYW1wbGUnLCAnbmV3ZmVhdHVyZScsICduZXcnXSwKKyAgICBwYXRoOiAnc2FtcGxlcy9UaWNUYWNUb2VMaWIvaW5kZXguaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnVGljVGFjVG9lTGliJworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnQW4gZXhhbXBsZSBvZiBhbiBBbmRyb2lkIGxpYnJhcnkgcHJvamVjdCwgYSB0eXBlIG9mIHByb2plY3QgdGhhdCBsZXRzIHlvdSBzdG9yZSBhbmQgbWFuYWdlIHNoYXJlZCBjb2RlIGFuZCByZXNvdXJjZXMgaW4gb25lIHBsYWNlLCB0aGVuIG1ha2UgdGhlbSBhdmFpbGFibGUgdG8geW91ciBvdGhlciBBbmRyb2lkIGFwcGxpY2F0aW9ucy4nCisgICAgfQorICB9LAorICB7CisgICAgdGFnczogWydzYW1wbGUnLCAnbmV3ZmVhdHVyZScsICduZXcnXSwKKyAgICBwYXRoOiAnc2FtcGxlcy9UaWNUYWNUb2VNYWluL2luZGV4Lmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ1RpY1RhY1RvZU1haW4nCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdEZW1vbnN0cmF0ZXMgaG93IGFuIGFwcGxpY2F0aW9uIGNhbiBtYWtlIHVzZSBvZiBzaGFyZWQgY29kZSBhbmQgcmVzb3VyY2VzIHN0b3JlZCBpbiBhbiBBbmRyb2lkIGxpYnJhcnkgcHJvamVjdC4nCisgICAgfQorICB9LAorICB7CisgICAgdGFnczogWydzYW1wbGUnLCAnaW5wdXQnXSwKKyAgICBwYXRoOiAnc2FtcGxlcy9Tb2Z0S2V5Ym9hcmQvaW5kZXguaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnU29mdCBLZXlib2FyZCcKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ0FuIGV4YW1wbGUgb2Ygd3JpdGluZyBhbiBpbnB1dCBtZXRob2QgZm9yIGEgc29mdHdhcmUga2V5Ym9hcmQuJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsnc2FtcGxlJywgJ3VpJ10sCisgICAgcGF0aDogJ3NhbXBsZXMvV2lrdGlvbmFyeS9pbmRleC5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdXaWt0aW9uYXJ5JworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnQW4gZXhhbXBsZSBvZiBjcmVhdGluZyBpbnRlcmFjdGl2ZSB3aWRnZXRzIGZvciBkaXNwbGF5IG9uIHRoZSBBbmRyb2lkIGhvbWUgc2NyZWVuLicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ3NhbXBsZScsICd1aSddLAorICAgIHBhdGg6ICdzYW1wbGVzL1dpa3Rpb25hcnlTaW1wbGUvaW5kZXguaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnV2lrdGlvbmFyeSAoU2ltcGxpZmllZCknCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdBIHNpbXBsZSBBbmRyb2lkIGhvbWUgc2NyZWVuIHdpZGdldHMgZXhhbXBsZS4nCisgICAgfQorICB9LAorICB7CisgICAgdGFnczogWydzYW1wbGUnLCAnbGF5b3V0JywgJ25ldyddLAorICAgIHBhdGg6ICdzYW1wbGVzL1htbEFkYXB0ZXJzL2luZGV4Lmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ1hNTCBBZGFwdGVycycKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ0JpbmRpbmcgZGF0YSB0byB2aWV3cyB1c2luZyBYTUwgQWRhcHRlcnMgZXhhbXBsZXMuJworICAgIH0KKyAgfSwKKworLy8vLy8vLy8vLy8vLy8vLy8KKy8vLyBUVVRPUklBTFMgLy8vCisvLy8vLy8vLy8vLy8vLy8vLworCisgIHsKKyAgICB0YWdzOiBbJ3R1dG9yaWFsJ10sCisgICAgcGF0aDogJ3R1dG9yaWFscy9oZWxsby13b3JsZC5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdIZWxsbyBXb3JsZCcKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ0JlZ2lubmluZyBiYXNpYyBhcHBsaWNhdGlvbiBkZXZlbG9wbWVudCB3aXRoIHRoZSBBbmRyb2lkIFNESy4nCisgICAgfQorICB9LAorICB7CisgICAgdGFnczogWyd0dXRvcmlhbCcsICd1aScsICdsYXlvdXQnXSwKKyAgICBwYXRoOiAndHV0b3JpYWxzL3ZpZXdzL2luZGV4Lmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ0hlbGxvIFZpZXdzJworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnQSB3YWxrLXRocm91Z2ggb2YgdGhlIHZhcmlvdXMgdHlwZXMgb2YgbGF5b3V0cyBhbmQgdmlld3MgYXZhaWxhYmxlIGluIHRoZSBBbmRyb2lkIFNESy4nCisgICAgfQorICB9LAorICB7CisgICAgdGFnczogWyd0dXRvcmlhbCcsICd1aScsICdiZXN0cHJhY3RpY2UnXSwKKyAgICBwYXRoOiAndHV0b3JpYWxzL2xvY2FsaXphdGlvbi9pbmRleC5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdIZWxsbyBMb2NhbGl6YXRpb24nCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdUaGUgYmFzaWNzIG9mIGxvY2FsaXppbmcgeW91ciBhcHBsaWNhdGlvbnMgZm9yIG11bHRpcGxlIGxhbmd1YWdlcyBhbmQgbG9jYWxlcy4nCisgICAgfQorICB9LAorICB7CisgICAgdGFnczogWyd0dXRvcmlhbCcsICdkYXRhJ10sCisgICAgcGF0aDogJ3R1dG9yaWFscy9ub3RlcGFkL2luZGV4Lmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ05vdGVwYWQgVHV0b3JpYWwnCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdBIG11bHRpLXBhcnQgdHV0b3JpYWwgZGlzY3Vzc2luZyBpbnRlcm1lZGlhdGUtbGV2ZWwgY29uY2VwdHMgc3VjaCBhcyBkYXRhIGFjY2Vzcy4nCisgICAgfQorICB9LAorICB7CisgICAgdGFnczogWyd0dXRvcmlhbCcsICd0ZXN0aW5nJywgJ25ldyddLAorICAgIHBhdGg6ICd0dXRvcmlhbHMvdGVzdGluZy9oZWxsb2FuZHJvaWRfdGVzdC5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdIZWxsbyBUZXN0aW5nJworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnQSBiYXNpYyBpbnRyb2R1Y3Rpb24gdG8gdGhlIEFuZHJvaWQgdGVzdGluZyBmcmFtZXdvcmsuJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsndHV0b3JpYWwnLCAndGVzdGluZycsICduZXcnXSwKKyAgICBwYXRoOiAndHV0b3JpYWxzL3Rlc3RpbmcvYWN0aXZpdHlfdGVzdC5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdBY3Rpdml0eSBUZXN0aW5nJworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnQSBtb3JlIGFkdmFuY2VkIGRlbW9uc3RyYXRpb24gb2YgdGhlIEFuZHJvaWQgdGVzdGluZyBmcmFtZXdvcmsgYW5kIHRvb2xzLicKKyAgICB9CisgIH0KK107CmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvcmVzb3VyY2VzL3Jlc291cmNlc190b2MuY3MgYi9kb2NzL2h0bWwvcmVzb3VyY2VzL3Jlc291cmNlc190b2MuY3MKaW5kZXggNTI2ODliNi4uYTE3MTFiNSAxMDA2NDQKLS0tIGEvZG9jcy9odG1sL3Jlc291cmNlcy9yZXNvdXJjZXNfdG9jLmNzCisrKyBiL2RvY3MvaHRtbC9yZXNvdXJjZXMvcmVzb3VyY2VzX3RvYy5jcwpAQCAtMSw1ICsxLDU2IEBACiA8dWw+CiAgIDxsaT4KKyAgICA8aDI+PHNwYW4gY2xhc3M9ImVuIj5UZWNobmljYWwgUmVzb3VyY2VzPC9zcGFuPgorICAgIDwvaDI+CisgICAgPHVsPgorICAgICAgPGxpIGNsYXNzPSJ0b2dnbGUtbGlzdCI+CisgICAgICAgIDxkaXY+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL2Jyb3dzZXIuaHRtbD90YWc9c2FtcGxlIj4KKyAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+U2FtcGxlIENvZGU8L3NwYW4+CisgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZGUiIHN0eWxlPSJkaXNwbGF5Om5vbmUiPkJlaXNwaWVsY29kZTwvc3Bhbj4KKyAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlcyIgc3R5bGU9ImRpc3BsYXk6bm9uZSI+Q8OzZGlnbyBkZSBlamVtcGxvPC9zcGFuPgorICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImZyIiBzdHlsZT0iZGlzcGxheTpub25lIj5FeGVtcGxlIGRlIGNvZGU8L3NwYW4+CisgICAgICAgICAgICA8c3BhbiBjbGFzcz0iaXQiIHN0eWxlPSJkaXNwbGF5Om5vbmUiPkNvZGljZSBkaSBlc2VtcGlvPC9zcGFuPgorICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImphIiBzdHlsZT0iZGlzcGxheTpub25lIj7jgrXjg7Pjg5fjg6sg44Kz44O844OJPC9zcGFuPgorICAgICAgICAgICAgPHNwYW4gY2xhc3M9InpoLUNOIiBzdHlsZT0iZGlzcGxheTpub25lIj48L3NwYW4+CisgICAgICAgICAgICA8c3BhbiBjbGFzcz0iemgtVFciIHN0eWxlPSJkaXNwbGF5Om5vbmUiPjwvc3Bhbj4KKyAgICAgICAgICA8L2E+PC9kaXY+CisgICAgICAgIDx1bCBpZD0iZGV2ZG9jLW5hdi1zYW1wbGUtbGlzdCI+CisgICAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9zYW1wbGVzL2dldC5odG1sIj4KKyAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPkdldHRpbmcgdGhlIFNhbXBsZXM8L3NwYW4+CisgICAgICAgICAgICAgIDwvYT48L2xpPgorICAgICAgICA8L3VsPgorICAgICAgPC9saT4KKyAgICAgIDxsaSBjbGFzcz0idG9nZ2xlLWxpc3QiPgorICAgICAgICA8ZGl2PjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9icm93c2VyLmh0bWw/dGFnPWFydGljbGUiPgorICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5BcnRpY2xlczwvc3Bhbj4KKyAgICAgICAgICAgICA8L2E+PC9kaXY+CisgICAgICAgIDx1bCBpZD0iZGV2ZG9jLW5hdi1hcnRpY2xlLWxpc3QiPgorICAgICAgICA8L3VsPgorICAgICAgPC9saT4KKyAgICAgIDxsaSBjbGFzcz0idG9nZ2xlLWxpc3QiPgorICAgICAgICA8ZGl2PjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9icm93c2VyLmh0bWw/dGFnPXR1dG9yaWFsIj4KKyAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+VHV0b3JpYWxzPC9zcGFuPgorICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImRlIiBzdHlsZT0iZGlzcGxheTpub25lIj5MZXJucHJvZ3JhbW1lPC9zcGFuPgorICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVzIiBzdHlsZT0iZGlzcGxheTpub25lIj5UdXRvcmlhbGVzPC9zcGFuPgorICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImZyIiBzdHlsZT0iZGlzcGxheTpub25lIj5EaWRhY3RpY2llbHM8L3NwYW4+CisgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iaXQiIHN0eWxlPSJkaXNwbGF5Om5vbmUiPkVzZXJjaXRhemlvbmk8L3NwYW4+CisgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iamEiIHN0eWxlPSJkaXNwbGF5Om5vbmUiPuODgeODpeODvOODiOODquOCouODqzwvc3Bhbj4KKyAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJ6aC1DTiIgc3R5bGU9ImRpc3BsYXk6bm9uZSI+PC9zcGFuPgorICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InpoLVRXIiBzdHlsZT0iZGlzcGxheTpub25lIj48L3NwYW4+CisgICAgICAgICAgICAgPC9hPjwvZGl2PgorICAgICAgICA8dWwgaWQ9ImRldmRvYy1uYXYtdHV0b3JpYWwtbGlzdCI+CisgICAgICAgIDwvdWw+CisgICAgICA8L2xpPgorICAgICAgPGxpIGNsYXNzPSJ0b2dnbGUtbGlzdCI+CisgICAgICAgIDxkaXY+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL3RvcGljcy5odG1sIj4KKyAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+VG9waWNzPC9zcGFuPgorICAgICAgICAgICAgIDwvYT48L2Rpdj4KKyAgICAgICAgPHVsIGlkPSJkZXZkb2MtbmF2LXRvcGljLWxpc3QiPgorICAgICAgICA8L3VsPgorICAgICAgPC9saT4KKyAgICA8L3VsPgorICA8L2xpPgorICA8bGk+CiAgICAgPGgyPjxzcGFuIGNsYXNzPSJlbiI+Q29tbXVuaXR5PC9zcGFuPgogICAgICAgICAgICAgICAgPHNwYW4gc3R5bGU9ImRpc3BsYXk6bm9uZSIgY2xhc3M9ImRlIj48L3NwYW4+CiAgICAgICAgICAgICAgICA8c3BhbiBzdHlsZT0iZGlzcGxheTpub25lIiBjbGFzcz0iZXMiPkNvbXVuaWRhZDwvc3Bhbj4KQEAgLTM0LDI0MSArODUsNiBAQAogICA8L2xpPjw/Y3MKICAgL2lmCiA/PgotCi0gIDxsaT4KLSAgICA8aDI+PHNwYW4gY2xhc3M9ImVuIj5UZWNobmljYWwgQXJ0aWNsZXM8L3NwYW4+Ci0gICAgPC9oMj4KLSAgICA8dWw+Ci0gICAgICA8bGkgY2xhc3M9InRvZ2dsZS1saXN0Ij4KLSAgICAgICAgPGRpdj48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvYXJ0aWNsZXMvaW5kZXguaHRtbCI+Ci0gICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPkxpc3Qgb2YgQXJ0aWNsZXM8L3NwYW4+Ci0gICAgICAgICAgICAgPC9hPjwvZGl2PgotICAgICAgICA8dWw+Ci0gICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvYXJ0aWNsZXMvYXZvaWRpbmctbWVtb3J5LWxlYWtzLmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+QXZvaWRpbmcgTWVtb3J5IExlYWtzPC9zcGFuPgotICAgICAgICAgICAgICAgIDwvYT48L2xpPgotICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL2FydGljbGVzL2JhY2t3YXJkLWNvbXBhdGliaWxpdHkuaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5CYWNrd2FyZCBDb21wYXRpYmlsaXR5PC9zcGFuPgotICAgICAgICAgICAgICAgIDwvYT48L2xpPgotICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL2FydGljbGVzL2Nhbi1pLXVzZS10aGlzLWludGVudC5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPkNhbiBJIFVzZSB0aGlzIEludGVudD88L3NwYW4+Ci0gICAgICAgICAgICAgICAgPC9hPjwvbGk+Ci0gICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvYXJ0aWNsZXMvY3JlYXRpbmctaW5wdXQtbWV0aG9kLmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+Q3JlYXRpbmcgYW4gSW5wdXQgTWV0aG9kPC9zcGFuPgotICAgICAgICAgICAgICAgIDwvYT48L2xpPgotICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL2FydGljbGVzL2RyYXdhYmxlLW11dGF0aW9ucy5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPkRyYXdhYmxlIE11dGF0aW9uczwvc3Bhbj4KLSAgICAgICAgICAgICAgICA8L2E+PC9saT4KLSAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9hcnRpY2xlcy9mYXN0ZXItc2NyZWVuLW9yaWVudGF0aW9uLWNoYW5nZS5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPkZhc3RlciBTY3JlZW4gT3JpZW50YXRpb24gQ2hhbmdlPC9zcGFuPgotICAgICAgICAgICAgICAgIDwvYT48L2xpPgotICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL2FydGljbGVzL2Z1dHVyZS1wcm9vZmluZy5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPkZ1dHVyZS1Qcm9vZmluZyBZb3VyIEFwcHM8L3NwYW4+Ci0gICAgICAgICAgICAgICAgPC9hPjwvbGk+Ci0gICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvYXJ0aWNsZXMvZ2VzdHVyZXMuaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5HZXN0dXJlczwvc3Bhbj4KLSAgICAgICAgICAgICAgICA8L2E+PC9saT4KLSAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9hcnRpY2xlcy9nbHN1cmZhY2V2aWV3Lmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+SW50cm9kdWNpbmcgR0xTdXJmYWNlVmlldzwvc3Bhbj4KLSAgICAgICAgICAgICAgICA8L2E+PC9saT4KLSAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9hcnRpY2xlcy9sYXlvdXQtdHJpY2tzLXJldXNlLmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+TGF5b3V0IFRyaWNrczogUmV1c2luZyA8L3NwYW4+Ci0gICAgICAgICAgICAgICAgPC9hPjwvbGk+Ci0gICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvYXJ0aWNsZXMvbGF5b3V0LXRyaWNrcy1lZmZpY2llbmN5Lmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+TGF5b3V0IFRyaWNrczogRWZmaWNpZW5jeTwvc3Bhbj4KLSAgICAgICAgICAgICAgICA8L2E+PC9saT4KLSAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9hcnRpY2xlcy9sYXlvdXQtdHJpY2tzLXN0dWJzLmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+TGF5b3V0IFRyaWNrczogVmlld1N0dWJzIDwvc3Bhbj4KLSAgICAgICAgICAgICAgICA8L2E+PC9saT4KLSAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9hcnRpY2xlcy9sYXlvdXQtdHJpY2tzLW1lcmdlLmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+TGF5b3V0IFRyaWNrczogTWVyZ2luZyA8L3NwYW4+Ci0gICAgICAgICAgICAgICAgPC9hPjwvbGk+Ci0gICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvYXJ0aWNsZXMvbGlzdHZpZXctYmFja2dyb3VuZHMuaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5MaXN0VmlldyBCYWNrZ3JvdW5kczwvc3Bhbj4KLSAgICAgICAgICAgICAgICA8L2E+PC9saT4KLSAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9hcnRpY2xlcy9saXZlLWZvbGRlcnMuaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5MaXZlIEZvbGRlcnM8L3NwYW4+Ci0gICAgICAgICAgICAgICAgPC9hPjwvbGk+Ci0gICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvYXJ0aWNsZXMvbGl2ZS13YWxscGFwZXJzLmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+TGl2ZSBXYWxscGFwZXJzPC9zcGFuPgotICAgICAgICAgICAgICAgIDwvYT48L2xpPgotICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL2FydGljbGVzL29uLXNjcmVlbi1pbnB1dHMuaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5PbnNjcmVlbiBJbnB1dCBNZXRob2RzPC9zcGFuPgotICAgICAgICAgICAgICAgIDwvYT48L2xpPgotICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL2FydGljbGVzL3BhaW5sZXNzLXRocmVhZGluZy5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPlBhaW5sZXNzIFRocmVhZGluZzwvc3Bhbj4KLSAgICAgICAgICAgICAgICA8L2E+PC9saT4KLSAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9hcnRpY2xlcy9xc2IuaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5RdWljayBTZWFyY2ggQm94PC9zcGFuPgotICAgICAgICAgICAgICAgIDwvYT48L2xpPgotICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL2FydGljbGVzL3NwZWVjaC1pbnB1dC5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPlNwZWVjaCBJbnB1dDwvc3Bhbj4KLSAgICAgICAgICAgICAgICA8L2E+PC9saT4KLSAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9hcnRpY2xlcy90b3VjaC1tb2RlLmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+VG91Y2ggTW9kZTwvc3Bhbj4KLSAgICAgICAgICAgICAgICA8L2E+PC9saT4KLSAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9hcnRpY2xlcy90cmFjay1tZW0uaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5UcmFja2luZyBNZW1vcnkgQWxsb2NhdGlvbnM8L3NwYW4+Ci0gICAgICAgICAgICAgICAgPC9hPjwvbGk+Ci0gICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvYXJ0aWNsZXMvdWktMS41Lmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+VUkgRnJhbWV3b3JrIENoYW5nZXMgaW4gQW5kcm9pZCAxLjU8L3NwYW4+Ci0gICAgICAgICAgICAgICAgPC9hPjwvbGk+Ci0gICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvYXJ0aWNsZXMvdWktMS42Lmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+VUkgRnJhbWV3b3JrIENoYW5nZXMgaW4gQW5kcm9pZCAxLjY8L3NwYW4+Ci0gICAgICAgICAgICAgICAgPC9hPjwvbGk+Ci0gICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvYXJ0aWNsZXMvdGltZWQtdWktdXBkYXRlcy5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPlVwZGF0aW5nIHRoZSBVSSBmcm9tIGEgVGltZXI8L3NwYW4+Ci0gICAgICAgICAgICAgICAgPC9hPjwvbGk+Ci0gICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvYXJ0aWNsZXMvdHRzLmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+VXNpbmcgVGV4dC10by1TcGVlY2g8L3NwYW4+Ci0gICAgICAgICAgICAgICAgPC9hPjwvbGk+Ci0gICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvYXJ0aWNsZXMvY29udGFjdHMuaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5Vc2luZyB0aGUgQ29udGFjdHMgQVBJPC9zcGFuPgotICAgICAgICAgICAgICAgIDwvYT48L2xpPgotICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL2FydGljbGVzL3VzaW5nLXdlYnZpZXdzLmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+VXNpbmcgV2ViVmlld3M8L3NwYW4+Ci0gICAgICAgICAgICAgICAgPC9hPjwvbGk+Ci0gICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvYXJ0aWNsZXMvd2lraW5vdGVzLWxpbmtpZnkuaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5XaWtpTm90ZXM6IExpbmtpZnkgeW91ciBUZXh0ITwvc3Bhbj4KLSAgICAgICAgICAgICAgICA8L2E+PC9saT4KLSAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9hcnRpY2xlcy93aWtpbm90ZXMtaW50ZW50cy5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPldpa2lOb3RlczogUm91dGluZyBJbnRlbnRzPC9zcGFuPgotICAgICAgICAgICAgICAgIDwvYT48L2xpPgotICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL2FydGljbGVzL3dpbmRvdy1iZy1zcGVlZC5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPldpbmRvdyBCYWNrZ3JvdW5kcyAmYW1wOyBVSSBTcGVlZDwvc3Bhbj4KLSAgICAgICAgICAgICAgICA8L2E+PC9saT4KLSAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9hcnRpY2xlcy96aXBhbGlnbi5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPlppcGFsaWduOiBBbiBFYXN5IE9wdGltaXphdGlvbjwvc3Bhbj4KLSAgICAgICAgICAgICAgICA8L2E+PC9saT4KLSAgICAgICAgPC91bD4KLSAgICAgIDwvbGk+Ci0gICAgPC91bD4KLSAgIDwvbGk+Ci0KLSAgPGxpPgotICAgIDxoMj48c3BhbiBjbGFzcz0iZW4iPlR1dG9yaWFsczwvc3Bhbj4KLSAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJkZSIgc3R5bGU9ImRpc3BsYXk6bm9uZSI+TGVybnByb2dyYW1tZTwvc3Bhbj4KLSAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlcyIgc3R5bGU9ImRpc3BsYXk6bm9uZSI+VHV0b3JpYWxlczwvc3Bhbj4KLSAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJmciIgc3R5bGU9ImRpc3BsYXk6bm9uZSI+RGlkYWN0aWNpZWxzPC9zcGFuPgotICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9Iml0IiBzdHlsZT0iZGlzcGxheTpub25lIj5Fc2VyY2l0YXppb25pPC9zcGFuPgotICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImphIiBzdHlsZT0iZGlzcGxheTpub25lIj7jg4Hjg6Xjg7zjg4jjg6rjgqLjg6s8L3NwYW4+Ci0gICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iemgtQ04iIHN0eWxlPSJkaXNwbGF5Om5vbmUiPjwvc3Bhbj4KLSAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJ6aC1UVyIgc3R5bGU9ImRpc3BsYXk6bm9uZSI+PC9zcGFuPgotICAgIDwvaDI+Ci0gICAgPHVsPgotICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy90dXRvcmlhbHMvaGVsbG8td29ybGQuaHRtbCI+Ci0gICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPkhlbGxvIFdvcmxkPC9zcGFuPgotICAgICAgICAgIDwvYT48L2xpPgotICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy90dXRvcmlhbHMvdmlld3MvaW5kZXguaHRtbCI+Ci0gICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPkhlbGxvIFZpZXdzPC9zcGFuPgotICAgICAgICAgIDwvYT48L2xpPgotICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy90dXRvcmlhbHMvbG9jYWxpemF0aW9uL2luZGV4Lmh0bWwiPgotICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5IZWxsbyBMb2NhbGl6YXRpb248L3NwYW4+Ci0gICAgICAgICAgPC9hPjwvbGk+Ci0gICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL3R1dG9yaWFscy90ZXN0aW5nL2hlbGxvYW5kcm9pZF90ZXN0Lmh0bWwiPgotICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5IZWxsbyBUZXN0aW5nPC9zcGFuPjwvYT4KLSAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJuZXciPm5ldyE8L3NwYW4+Ci0gICAgICA8L2xpPgotICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy90dXRvcmlhbHMvbm90ZXBhZC9pbmRleC5odG1sIj4KLSAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+Tm90ZXBhZCBUdXRvcmlhbDwvc3Bhbj4KLSAgICAgICAgICA8L2E+PC9saT4KLSAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvdHV0b3JpYWxzL3Rlc3RpbmcvYWN0aXZpdHlfdGVzdC5odG1sIj4KLSAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+QWN0aXZpdHkgVGVzdGluZzwvc3Bhbj48L2E+Ci0gICAgICAgICAgICA8c3BhbiBjbGFzcz0ibmV3Ij5uZXchPC9zcGFuPgotICAgICAgPC9saT4KLSAgICA8L3VsPgotICA8L2xpPgotCi0KLSAgPGxpPgotICAgIDxoMj48c3BhbiBjbGFzcz0iZW4iPlNhbXBsZSBDb2RlPC9zcGFuPgotICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImRlIiBzdHlsZT0iZGlzcGxheTpub25lIj5CZWlzcGllbGNvZGU8L3NwYW4+Ci0gICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZXMiIHN0eWxlPSJkaXNwbGF5Om5vbmUiPkPDs2RpZ28gZGUgZWplbXBsbzwvc3Bhbj4KLSAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJmciIgc3R5bGU9ImRpc3BsYXk6bm9uZSI+RXhlbXBsZSBkZSBjb2RlPC9zcGFuPgotICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9Iml0IiBzdHlsZT0iZGlzcGxheTpub25lIj5Db2RpY2UgZGkgZXNlbXBpbzwvc3Bhbj4KLSAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJqYSIgc3R5bGU9ImRpc3BsYXk6bm9uZSI+44K144Oz44OX44OrIOOCs+ODvOODiTwvc3Bhbj4KLSAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJ6aC1DTiIgc3R5bGU9ImRpc3BsYXk6bm9uZSI+PC9zcGFuPgotICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InpoLVRXIiBzdHlsZT0iZGlzcGxheTpub25lIj48L3NwYW4+Ci0gICAgPC9oMj4KLSAgICA8dWw+Ci0gICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL3NhbXBsZXMvZ2V0Lmh0bWwiPgotICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5HZXR0aW5nIHRoZSBTYW1wbGVzPC9zcGFuPgotICAgICAgICAgIDwvYT48L2xpPgotICAgICAgPGxpIGNsYXNzPSJ0b2dnbGUtbGlzdCI+Ci0gICAgICAgIDxkaXY+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL3NhbXBsZXMvaW5kZXguaHRtbCI+Ci0gICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPkxpc3Qgb2YgU2FtcGxlczwvc3Bhbj4KLSAgICAgICAgICAgICA8L2E+PC9kaXY+Ci0gICAgICAgIDx1bD4KLSAgICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL3NhbXBsZXMvQXBpRGVtb3MvaW5kZXguaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5BUEkgRGVtb3M8L3NwYW4+Ci0gICAgICAgICAgICAgIDwvYT48L2xpPgotICAgICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvc2FtcGxlcy9CYWNrdXBSZXN0b3JlL2luZGV4Lmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+QmFja3VwIGFuZCBSZXN0b3JlPC9zcGFuPgotICAgICAgICAgICAgICA8L2E+IDxzcGFuIGNsYXNzPSJuZXciPm5ldyE8L3NwYW4+PC9saT4KLSAgICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL3NhbXBsZXMvQmx1ZXRvb3RoQ2hhdC9pbmRleC5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPkJsdWV0b290aCBDaGF0PC9zcGFuPgotICAgICAgICAgICAgICA8L2E+PC9saT4KLSAgICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL3NhbXBsZXMvQnVzaW5lc3NDYXJkL2luZGV4Lmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+QnVzaW5lc3MgQ2FyZDwvc3Bhbj4KLSAgICAgICAgICAgICAgPC9hPjwvbGk+Ci0gICAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9zYW1wbGVzL0NvbnRhY3RNYW5hZ2VyL2luZGV4Lmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+Q29udGFjdCBNYW5hZ2VyPC9zcGFuPgotICAgICAgICAgICAgICA8L2E+PC9saT4KLSAgICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL3NhbXBsZXMvSG9tZS9pbmRleC5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPkhvbWU8L3NwYW4+Ci0gICAgICAgICAgICAgIDwvYT48L2xpPgotICAgICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvc2FtcGxlcy9KZXRCb3kvaW5kZXguaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5KZXRCb3k8L3NwYW4+Ci0gICAgICAgICAgICAgIDwvYT48L2xpPgotICAgICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvc2FtcGxlcy9DdWJlTGl2ZVdhbGxwYXBlci9pbmRleC5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPkxpdmUgV2FsbHBhcGVyPC9zcGFuPgotICAgICAgICAgICAgICAgIDwvYT48L2xpPgotICAgICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvc2FtcGxlcy9MdW5hckxhbmRlci9pbmRleC5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPkx1bmFyIExhbmRlcjwvc3Bhbj4KLSAgICAgICAgICAgICAgPC9hPjwvbGk+Ci0gICAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9zYW1wbGVzL011bHRpUmVzb2x1dGlvbi9pbmRleC5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPk11bHRpcGxlIFJlc29sdXRpb25zPC9zcGFuPgotICAgICAgICAgICAgICA8L2E+PC9saT4KLSAgICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL3NhbXBsZXMvTm90ZVBhZC9pbmRleC5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPk5vdGUgUGFkPC9zcGFuPgotICAgICAgICAgICAgICA8L2E+PC9saT4KLSAgICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL3NhbXBsZXMvU2FtcGxlU3luY0FkYXB0ZXIvaW5kZXguaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5TYW1wbGUgU3luYyBBZGFwdGVyPC9zcGFuPgotICAgICAgICAgICAgICA8L2E+PC9saT4KLSAgICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL3NhbXBsZXMvU2VhcmNoYWJsZURpY3Rpb25hcnkvaW5kZXguaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5TZWFyY2hhYmxlIERpY3Rpb25hcnkgdjI8L3NwYW4+Ci0gICAgICAgICAgICAgIDwvYT4gPHNwYW4gY2xhc3M9Im5ldyI+bmV3ITwvc3Bhbj48L2xpPgotICAgICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvc2FtcGxlcy9TbmFrZS9pbmRleC5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPlNuYWtlPC9zcGFuPgotICAgICAgICAgICAgICA8L2E+PC9saT4KLSAgICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL3NhbXBsZXMvU29mdEtleWJvYXJkL2luZGV4Lmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+U29mdCBLZXlib2FyZDwvc3Bhbj4KLSAgICAgICAgICAgICAgPC9hPjwvbGk+Ci0gICAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9zYW1wbGVzL1NwaW5uZXIvaW5kZXguaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5TcGlubmVyPC9zcGFuPgotICAgICAgICAgICAgICAgIDwvYT4gPHNwYW4gY2xhc3M9Im5ldyI+bmV3ITwvc3Bhbj48L2xpPgotICAgICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvc2FtcGxlcy9TcGlubmVyVGVzdC9pbmRleC5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPlNwaW5uZXJUZXN0PC9zcGFuPgotICAgICAgICAgICAgICAgIDwvYT4gPHNwYW4gY2xhc3M9Im5ldyI+bmV3ITwvc3Bhbj48L2xpPgotICAgICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvc2FtcGxlcy9UaWNUYWNUb2VMaWIvaW5kZXguaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5UaWNUYWNUb2VMaWI8L3NwYW4+Ci0gICAgICAgICAgICAgICAgPC9hPiA8c3BhbiBjbGFzcz0ibmV3Ij5uZXchPC9zcGFuPjwvbGk+Ci0gICAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9zYW1wbGVzL1RpY1RhY1RvZU1haW4vaW5kZXguaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5UaWNUYWNUb2VNYWluPC9zcGFuPgotICAgICAgICAgICAgICAgIDwvYT4gPHNwYW4gY2xhc3M9Im5ldyI+bmV3ITwvc3Bhbj48L2xpPgotICAgICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvc2FtcGxlcy9XaWt0aW9uYXJ5L2luZGV4Lmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+V2lrdGlvbmFyeTwvc3Bhbj4KLSAgICAgICAgICAgICAgPC9hPjwvbGk+Ci0gICAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9zYW1wbGVzL1dpa3Rpb25hcnlTaW1wbGUvaW5kZXguaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5XaWt0aW9uYXJ5IChTaW1wbGlmaWVkKTwvc3Bhbj4KLSAgICAgICAgICAgICAgPC9hPjwvbGk+Ci0gICAgICAgIDwvdWw+Ci0gICAgICA8L2xpPgotICAgIDwvdWw+Ci0gIDwvbGk+Ci0KLQotCiAgIDxsaT4KICAgICA8aDI+PHNwYW4gY2xhc3M9ImVuIj5Nb3JlPC9zcGFuPgogICAgIDwvaDI+CkBAIC0yOTcsOCArMTEzLDYgQEAKICAgICAgPC9saT4KICAgICA8L3VsPgogICA8L2xpPgotCi0KIDwvdWw+CiAKIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9yZXNvdXJjZXMvc2FtcGxlcy9pbWFnZXMvWG1sUGhvdG9zQWRhcHRlci5wbmcgYi9kb2NzL2h0bWwvcmVzb3VyY2VzL3NhbXBsZXMvaW1hZ2VzL1htbFBob3Rvc0FkYXB0ZXIucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwMThkNTQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL2h0bWwvcmVzb3VyY2VzL3NhbXBsZXMvaW1hZ2VzL1htbFBob3Rvc0FkYXB0ZXIucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9yZXNvdXJjZXMvc2FtcGxlcy9pbWFnZXMvWG1sUnNzUmVhZGVyLnBuZyBiL2RvY3MvaHRtbC9yZXNvdXJjZXMvc2FtcGxlcy9pbWFnZXMvWG1sUnNzUmVhZGVyLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMGY4NDFiCi0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9odG1sL3Jlc291cmNlcy9zYW1wbGVzL2ltYWdlcy9YbWxSc3NSZWFkZXIucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9yZXNvdXJjZXMvdG9waWNzLmpkIGIvZG9jcy9odG1sL3Jlc291cmNlcy90b3BpY3MuamQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjU5NjBmZgotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvaHRtbC9yZXNvdXJjZXMvdG9waWNzLmpkCkBAIC0wLDAgKzEsNzIgQEAKK3BhZ2UudGl0bGU9VGVjaG5pY2FsIFJlc291cmNlIFRvcGljcworQGpkOmJvZHkKKworPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KKyAgI3Jlc291cmNlLXRvcGljLXRhYmxlIHRkIHsKKyAgICBib3JkZXI6IDA7CisgICAgcGFkZGluZzogMDsKKyAgICBtYXJnaW46IDA7CisgICAgcGFkZGluZy1sZWZ0OiAxZW07CisgICAgd2lkdGg6IDE4ZW07CisgIH0KKworICAjcmVzb3VyY2UtdG9waWMtdGFibGUgdWwgeworICAgIHBhZGRpbmc6IDA7CisgICAgbWFyZ2luOiAwOworICB9CisKKyAgI3Jlc291cmNlLXRvcGljLXRhYmxlIGxpIHsKKyAgICBsaXN0LXN0eWxlOiBub25lOworICAgIG1hcmdpbjogMDsKKyAgICBwYWRkaW5nOiAwOworICB9Cis8L3N0eWxlPgorCis8cD4KK1lvdSBjYW4gYnJvd3NlIHRoZSBsaXN0IG9mIHRlY2huaWNhbCByZXNvdXJjZXMgYnkgdG9waWMgYnkgY2xpY2tpbmcgb24gdGhlCitsaW5rcyBiZWxvdy4gT3ZlciB0aW1lLCBhcyBtb3JlIHRvcGljcyBhcmUgYWRkZWQsIHRoZXkgd2lsbCBiZSBhZGRlZCB0byB0aGUKK2xpc3QgYmVsb3cuCis8L3A+CisKKzxub3NjcmlwdD4KKyAgPHAgY2xhc3M9Im5vdGUiPjxzdHJvbmc+RXJyb3I6PC9zdHJvbmc+CisgICAgWW91IG11c3QgaGF2ZSBKYXZhU2NyaXB0IGVuYWJsZWQgdG8gdmlldyB0aGlzIHBhZ2UuIFJlc291cmNlcyBhcmUgYWxzbworICAgIGF2YWlsYWJsZSBvZmZsaW5lIGluIHRoZSBTREsuCisgIDwvcD4KKzwvbm9zY3JpcHQ+CisKKzx0YWJsZSBpZD0icmVzb3VyY2UtdG9waWMtdGFibGUiPgorICA8dHI+PC90cj4KKzwvdGFibGU+CisKKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KKzwhLS0gCisoZnVuY3Rpb24oKSB7CisgIHZhciB0b3BpY3MgPSBbXTsKKyAgZm9yICh2YXIgdG9waWMgaW4gQU5EUk9JRF9UQUdTWyd0b3BpYyddKSB7CisgICAgdG9waWNzLnB1c2goe25hbWU6dG9waWMsdGl0bGU6QU5EUk9JRF9UQUdTWyd0b3BpYyddW3RvcGljXX0pOworICB9CisgIHRvcGljcy5zb3J0KGZ1bmN0aW9uKHgseSl7IHJldHVybiAoeC50aXRsZSA8IHkudGl0bGUpID8gLTEgOiAxOyB9KTsKKyAgdmFyIHRvcGljUGFyZW50ID0gbnVsbDsKKyAgZm9yICh2YXIgaSA9IDA7IGkgPCB0b3BpY3MubGVuZ3RoOyBpKyspIHsKKyAgICBpZiAodG9waWNQYXJlbnQgPT0gbnVsbCB8fCBpICUgMTAgPT0gMCkgeworICAgICAgLy8gY3JlYXRlIGEgbmV3IGNvbHVtbgorICAgICAgdG9waWNQYXJlbnQgPSAkKCd1bCcsICQoJzx0ZD48dWw+JykuYXBwZW5kVG8oJyNyZXNvdXJjZS10b3BpYy10YWJsZSB0cicpKTsKKyAgICB9CisKKyAgICB0b3BpY1BhcmVudC5hcHBlbmQoCisgICAgICAgICQoJzxsaT4nKS5hcHBlbmQoCisgICAgICAgICAgJCgnPGgzPicpLmFwcGVuZCgKKyAgICAgICAgICAgICQoJzxhPicpCisgICAgICAgICAgICAgIC5hdHRyKCdocmVmJywgdG9Sb290ICsgInJlc291cmNlcy9icm93c2VyLmh0bWw/dGFnPSIgKyB0b3BpY3NbaV0ubmFtZSkKKyAgICAgICAgICAgICAgLmFwcGVuZCgkKCc8c3Bhbj4nKQorICAgICAgICAgICAgICAgIC5hZGRDbGFzcygnZW4nKQorICAgICAgICAgICAgICAgIC5odG1sKHRvcGljc1tpXS50aXRsZSkKKyAgICAgICAgICAgICAgKQorICAgICAgICAgICAgKQorICAgICAgICAgICkKKyAgICAgICAgKTsKKyAgfQorfSkoKTsKKy8vLS0+Cis8L3NjcmlwdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvQml0bWFwLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvQml0bWFwLmphdmEKaW5kZXggN2NhMzc0MS4uZTI2MWNmYSAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL0JpdG1hcC5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9CaXRtYXAuamF2YQpAQCAtMTcyLDYgKzE3MiwxOSBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGdlbmVyYXRpb24gSUQgb2YgdGhpcyBiaXRtYXAuIFRoZSBnZW5lcmF0aW9uIElEIGNoYW5nZXMKKyAgICAgKiB3aGVuZXZlciB0aGUgYml0bWFwIGlzIG1vZGlmaWVkLiBUaGlzIGNhbiBiZSB1c2VkIGFzIGFuIGVmZmljaWVudCB3YXkgdG8KKyAgICAgKiBjaGVjayBpZiBhIGJpdG1hcCBoYXMgY2hhbmdlZC4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIFRoZSBjdXJyZW50IGdlbmVyYXRpb24gSUQgZm9yIHRoaXMgYml0bWFwLgorICAgICAqIAorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIGludCBnZXRHZW5lcmF0aW9uSWQoKSB7CisgICAgICAgIHJldHVybiBuYXRpdmVHZW5lcmF0aW9uSWQobU5hdGl2ZUJpdG1hcCk7CisgICAgfQorICAgIAorICAgIC8qKgogICAgICAqIFRoaXMgaXMgY2FsbGVkIGJ5IG1ldGhvZHMgdGhhdCB3YW50IHRvIHRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGUgYml0bWFwCiAgICAgICogaGFzIGFscmVhZHkgYmVlbiByZWN5Y2xlZC4KICAgICAgKi8KQEAgLTEwNDEsNiArMTA1NCw3IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgbmF0aXZlQ29weVBpeGVsc1RvQnVmZmVyKGludCBuYXRpdmVCaXRtYXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1ZmZlciBkc3QpOwogICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIG5hdGl2ZUNvcHlQaXhlbHNGcm9tQnVmZmVyKGludCBuYiwgQnVmZmVyIHNyYyk7CisgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGludCBuYXRpdmVHZW5lcmF0aW9uSWQoaW50IG5hdGl2ZUJpdG1hcCk7CiAKICAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgQml0bWFwIG5hdGl2ZUNyZWF0ZUZyb21QYXJjZWwoUGFyY2VsIHApOwogICAgIC8vIHJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzCmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvQml0bWFwRmFjdG9yeS5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL0JpdG1hcEZhY3RvcnkuamF2YQppbmRleCAyMzEzZjRjLi41Mzk0NTMwIDEwMDY0NAotLS0gYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvQml0bWFwRmFjdG9yeS5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9CaXRtYXBGYWN0b3J5LmphdmEKQEAgLTgxLDcgKzgxLDcgQEAKICAgICAgICAgLyoqCiAgICAgICAgICAqIFRoZSBwaXhlbCBkZW5zaXR5IHRvIHVzZSBmb3IgdGhlIGJpdG1hcC4gIFRoaXMgd2lsbCBhbHdheXMgcmVzdWx0CiAgICAgICAgICAqIGluIHRoZSByZXR1cm5lZCBiaXRtYXAgaGF2aW5nIGEgZGVuc2l0eSBzZXQgZm9yIGl0IChzZWUKLSAgICAgICAgICoge0BsaW5rIEJpdG1hcCNzZXREZW5zaXR5KGludCkgQml0bWFwLnNldERlbnNpdHkoaW50KSkuICBJbiBhZGRpdGlvbiwKKyAgICAgICAgICoge0BsaW5rIEJpdG1hcCNzZXREZW5zaXR5KGludCkgQml0bWFwLnNldERlbnNpdHkoaW50KSl9LiAgSW4gYWRkaXRpb24sCiAgICAgICAgICAqIGlmIHtAbGluayAjaW5TY2FsZWR9IGlzIHNldCAod2hpY2ggaXQgaXMgYnkgZGVmYXVsdH0gYW5kIHRoaXMKICAgICAgICAgICogZGVuc2l0eSBkb2VzIG5vdCBtYXRjaCB7QGxpbmsgI2luVGFyZ2V0RGVuc2l0eX0sIHRoZW4gdGhlIGJpdG1hcAogICAgICAgICAgKiB3aWxsIGJlIHNjYWxlZCB0byB0aGUgdGFyZ2V0IGRlbnNpdHkgYmVmb3JlIGJlaW5nIHJldHVybmVkLgpAQCAtNTA3LDkgKzUwNyw3IEBACiAgICAgICoKICAgICAgKiBAcGFyYW0gaXMgVGhlIGlucHV0IHN0cmVhbSB0aGF0IGhvbGRzIHRoZSByYXcgZGF0YSB0byBiZSBkZWNvZGVkIGludG8gYQogICAgICAqICAgICAgICAgICBiaXRtYXAuCi0gICAgICogQHJldHVybiBUaGUgZGVjb2RlZCBiaXRtYXAsIG9yIG51bGwgaWYgdGhlIGltYWdlIGRhdGEgY291bGQgbm90IGJlCi0gICAgICogICAgICAgICBkZWNvZGVkLCBvciwgaWYgb3B0cyBpcyBub24tbnVsbCwgaWYgb3B0cyByZXF1ZXN0ZWQgb25seSB0aGUKLSAgICAgKiAgICAgICAgIHNpemUgYmUgcmV0dXJuZWQgKGluIG9wdHMub3V0V2lkdGggYW5kIG9wdHMub3V0SGVpZ2h0KQorICAgICAqIEByZXR1cm4gVGhlIGRlY29kZWQgYml0bWFwLCBvciBudWxsIGlmIHRoZSBpbWFnZSBkYXRhIGNvdWxkIG5vdCBiZSBkZWNvZGVkLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgQml0bWFwIGRlY29kZVN0cmVhbShJbnB1dFN0cmVhbSBpcykgewogICAgICAgICByZXR1cm4gZGVjb2RlU3RyZWFtKGlzLCBudWxsLCBudWxsKTsKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9DYW52YXMuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9DYW52YXMuamF2YQppbmRleCA3NmNkZTczLi4zYTBjMThjIDEwMDY0NAotLS0gYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvQ2FudmFzLmphdmEKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL0NhbnZhcy5qYXZhCkBAIC0xNiwxMSArMTYsMTAgQEAKIAogcGFja2FnZSBhbmRyb2lkLmdyYXBoaWNzOwogCi1pbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKLWltcG9ydCBhbmRyb2lkLnRleHQuU3Bhbm5lZFN0cmluZzsKLWltcG9ydCBhbmRyb2lkLnRleHQuU3Bhbm5hYmxlU3RyaW5nOwogaW1wb3J0IGFuZHJvaWQudGV4dC5HcmFwaGljc09wZXJhdGlvbnM7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkRpc3BsYXlNZXRyaWNzOworaW1wb3J0IGFuZHJvaWQudGV4dC5TcGFubmFibGVTdHJpbmc7CitpbXBvcnQgYW5kcm9pZC50ZXh0LlNwYW5uZWRTdHJpbmc7CitpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKIAogaW1wb3J0IGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLm9wZW5nbGVzLkdMOwogCkBAIC01OSw2ICs1OCwxOCBAQAogICAgIHByaXZhdGUgaW50ICAgICAgICAgbVN1cmZhY2VGb3JtYXQ7CiAKICAgICAvKioKKyAgICAgKiBGbGFnIGZvciBkcmF3VGV4dFJ1biBpbmRpY2F0aW5nIGxlZnQtdG8tcmlnaHQgcnVuIGRpcmVjdGlvbi4KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERJUkVDVElPTl9MVFIgPSAwOworICAgIAorICAgIC8qKgorICAgICAqIEZsYWcgZm9yIGRyYXdUZXh0UnVuIGluZGljYXRpbmcgcmlnaHQtdG8tbGVmdCBydW4gZGlyZWN0aW9uLgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElSRUNUSU9OX1JUTCA9IDE7CisgICAgCisgICAgLyoqCiAgICAgICogQ29uc3RydWN0IGFuIGVtcHR5IHJhc3RlciBjYW52YXMuIFVzZSBzZXRCaXRtYXAoKSB0byBzcGVjaWZ5IGEgYml0bWFwIHRvCiAgICAgICogZHJhdyBpbnRvLiAgVGhlIGluaXRpYWwgdGFyZ2V0IGRlbnNpdHkgaXMge0BsaW5rIEJpdG1hcCNERU5TSVRZX05PTkV9OwogICAgICAqIHRoaXMgd2lsbCB0eXBpY2FsbHkgYmUgcmVwbGFjZWQgd2hlbiBhIHRhcmdldCBiaXRtYXAgaXMgc2V0IGZvciB0aGUKQEAgLTEwNiwxNiArMTE3LDMzIEBACiAgICAgICogCiAgICAgICogPHA+VGhlIGluaXRpYWwgdGFyZ2V0IGRlbnNpdHkgb2YgdGhlIGNhbnZhcyBpcyB0aGUgc2FtZSBhcyB0aGUgaW5pdGlhbAogICAgICAqIGRlbnNpdHkgb2YgYml0bWFwcyBhcyBwZXIge0BsaW5rIEJpdG1hcCNnZXREZW5zaXR5KCkgQml0bWFwLmdldERlbnNpdHkoKX0uCisgICAgICogCisgICAgICogQGRlcHJlY2F0ZWQgVGhpcyBjb25zdHJ1Y3RvciBpcyBub3Qgc3VwcG9ydGVkIGFuZCBzaG91bGQgbm90IGJlIGludm9rZWQuCiAgICAgICovCiAgICAgcHVibGljIENhbnZhcyhHTCBnbCkgewogICAgICAgICBtTmF0aXZlQ2FudmFzID0gaW5pdEdMKCk7CiAgICAgICAgIG1HTCA9IGdsOwogICAgICAgICBtRGVuc2l0eSA9IEJpdG1hcC5nZXREZWZhdWx0RGVuc2l0eSgpOwogICAgIH0KKworICAgIC8qKgorICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoaXMgQ2FudmFzIHVzZXMgaGFyZHdhcmUgYWNjZWxlcmF0aW9uLgorICAgICAqIAorICAgICAqIE5vdGUgdGhhdCB0aGlzIG1ldGhvZCBkb2VzIG5vdCBkZWZpbmUgd2hhdCB0eXBlIG9mIGhhcmR3YXJlIGFjY2VsZXJhdGlvbgorICAgICAqIG1heSBvciBtYXkgbm90IGJlIHVzZWQuCisgICAgICogCisgICAgICogQHJldHVybiBUcnVlIGlmIGRyYXdpbmcgb3BlcmF0aW9ucyBhcmUgaGFyZHdhcmUgYWNjZWxlcmF0ZWQsCisgICAgICogICAgICAgICBmYWxzZSBvdGhlcndpc2UuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNIYXJkd2FyZUFjY2VsZXJhdGVkKCkgeworICAgICAgICByZXR1cm4gbUdMICE9IG51bGw7CisgICAgfQogICAgIAogICAgIC8qKgogICAgICAqIFJldHVybiB0aGUgR0wgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNhbnZhcywgb3IgbnVsbCBpZiBpdCBpcyBub3QKICAgICAgKiBiYWNrZWQgYnkgR0wuCisgICAgICogCisgICAgICogQGRlcHJlY2F0ZWQgVGhpcyBtZXRob2QgaXMgbm90IHN1cHBvcnRlZCBhbmQgc2hvdWxkIG5vdCBiZSBpbnZva2VkLgogICAgICAqLwogICAgIHB1YmxpYyBHTCBnZXRHTCgpIHsKICAgICAgICAgcmV0dXJuIG1HTDsKQEAgLTEyNSw2ICsxNTMsOCBAQAogICAgICAqIENhbGwgdGhpcyB0byBmcmVlIHVwIE9wZW5HTCByZXNvdXJjZXMgdGhhdCBtYXkgYmUgY2FjaGVkIG9yIGFsbG9jYXRlZAogICAgICAqIG9uIGJlaGFsZiBvZiB0aGUgQ2FudmFzLiBBbnkgc3Vic2VxdWVudCBkcmF3aW5nIHdpdGggYSBHTC1iYWNrZWQgQ2FudmFzCiAgICAgICogd2lsbCBoYXZlIHRvIHJlY3JlYXRlIHRob3NlIHJlc291cmNlcy4KKyAgICAgKiAKKyAgICAgKiBAZGVwcmVjYXRlZCBUaGlzIG1ldGhvZCBpcyBub3Qgc3VwcG9ydGVkIGFuZCBzaG91bGQgbm90IGJlIGludm9rZWQuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIGZyZWVHbENhY2hlcygpIHsKICAgICAgICAgZnJlZUNhY2hlcygpOwpAQCAtMTU3LDggKzE4NywxMCBAQAogICAgICAqIFNldCB0aGUgdmlld3BvcnQgZGltZW5zaW9ucyBpZiB0aGlzIGNhbnZhcyBpcyBHTCBiYXNlZC4gSWYgaXQgaXMgbm90LAogICAgICAqIHRoaXMgbWV0aG9kIGlzIGlnbm9yZWQgYW5kIG5vIGV4Y2VwdGlvbiBpcyB0aHJvd24uCiAgICAgICoKLSAgICAgKiAgQHBhcmFtIHdpZHRoICAgIFRoZSB3aWR0aCBvZiB0aGUgdmlld3BvcnQKLSAgICAgKiAgQHBhcmFtIGhlaWdodCAgIFRoZSBoZWlnaHQgb2YgdGhlIHZpZXdwb3J0CisgICAgICogIEBwYXJhbSB3aWR0aCBUaGUgd2lkdGggb2YgdGhlIHZpZXdwb3J0CisgICAgICogIEBwYXJhbSBoZWlnaHQgVGhlIGhlaWdodCBvZiB0aGUgdmlld3BvcnQKKyAgICAgKiAKKyAgICAgKiBAZGVwcmVjYXRlZCBUaGlzIG1ldGhvZCBpcyBub3Qgc3VwcG9ydGVkIGFuZCBzaG91bGQgbm90IGJlIGludm9rZWQuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0Vmlld3BvcnQoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7CiAgICAgICAgIGlmIChtR0wgIT0gbnVsbCkgewpAQCAtNjIxLDcgKzY1MywxMSBAQAogICAgICAgICBFZGdlVHlwZShpbnQgbmF0aXZlSW50KSB7CiAgICAgICAgICAgICB0aGlzLm5hdGl2ZUludCA9IG5hdGl2ZUludDsKICAgICAgICAgfQotICAgICAgICBmaW5hbCBpbnQgbmF0aXZlSW50OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAaGlkZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGZpbmFsIGludCBuYXRpdmVJbnQ7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xMjQ2LDggKzEyODIsOCBAQAogICAgICAgICAgICAgKHRleHQubGVuZ3RoIC0gaW5kZXggLSBjb3VudCkpIDwgMCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKICAgICAgICAgfQotICAgICAgICBuYXRpdmVfZHJhd1RleHQobU5hdGl2ZUNhbnZhcywgdGV4dCwgaW5kZXgsIGNvdW50LCB4LCB5LAotICAgICAgICAgICAgICAgICAgICAgICAgcGFpbnQubU5hdGl2ZVBhaW50KTsKKyAgICAgICAgbmF0aXZlX2RyYXdUZXh0KG1OYXRpdmVDYW52YXMsIHRleHQsIGluZGV4LCBjb3VudCwgeCwgeSwgcGFpbnQubUJpZGlGbGFncywKKyAgICAgICAgICAgICAgICBwYWludC5tTmF0aXZlUGFpbnQpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTI1OSw3ICsxMjk1LDEwIEBACiAgICAgICogQHBhcmFtIHkgICAgIFRoZSB5LWNvb3JkaW5hdGUgb2YgdGhlIG9yaWdpbiBvZiB0aGUgdGV4dCBiZWluZyBkcmF3bgogICAgICAqIEBwYXJhbSBwYWludCBUaGUgcGFpbnQgdXNlZCBmb3IgdGhlIHRleHQgKGUuZy4gY29sb3IsIHNpemUsIHN0eWxlKQogICAgICAqLwotICAgIHB1YmxpYyBuYXRpdmUgdm9pZCBkcmF3VGV4dChTdHJpbmcgdGV4dCwgZmxvYXQgeCwgZmxvYXQgeSwgUGFpbnQgcGFpbnQpOworICAgIHB1YmxpYyB2b2lkIGRyYXdUZXh0KFN0cmluZyB0ZXh0LCBmbG9hdCB4LCBmbG9hdCB5LCBQYWludCBwYWludCkgeworICAgICAgICBuYXRpdmVfZHJhd1RleHQobU5hdGl2ZUNhbnZhcywgdGV4dCwgMCwgdGV4dC5sZW5ndGgoKSwgeCwgeSwgcGFpbnQubUJpZGlGbGFncywKKyAgICAgICAgICAgICAgICBwYWludC5tTmF0aXZlUGFpbnQpOworICAgIH0KIAogICAgIC8qKgogICAgICAqIERyYXcgdGhlIHRleHQsIHdpdGggb3JpZ2luIGF0ICh4LHkpLCB1c2luZyB0aGUgc3BlY2lmaWVkIHBhaW50LgpAQCAtMTI3Nyw4ICsxMzE2LDggQEAKICAgICAgICAgaWYgKChzdGFydCB8IGVuZCB8IChlbmQgLSBzdGFydCkgfCAodGV4dC5sZW5ndGgoKSAtIGVuZCkpIDwgMCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKICAgICAgICAgfQotICAgICAgICBuYXRpdmVfZHJhd1RleHQobU5hdGl2ZUNhbnZhcywgdGV4dCwgc3RhcnQsIGVuZCwgeCwgeSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhaW50Lm1OYXRpdmVQYWludCk7CisgICAgICAgIG5hdGl2ZV9kcmF3VGV4dChtTmF0aXZlQ2FudmFzLCB0ZXh0LCBzdGFydCwgZW5kLCB4LCB5LCBwYWludC5tQmlkaUZsYWdzLAorICAgICAgICAgICAgICAgIHBhaW50Lm1OYXRpdmVQYWludCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xMjk5LDE2ICsxMzM4LDEwOCBAQAogICAgICAgICBpZiAodGV4dCBpbnN0YW5jZW9mIFN0cmluZyB8fCB0ZXh0IGluc3RhbmNlb2YgU3Bhbm5lZFN0cmluZyB8fAogICAgICAgICAgICAgdGV4dCBpbnN0YW5jZW9mIFNwYW5uYWJsZVN0cmluZykgewogICAgICAgICAgICAgbmF0aXZlX2RyYXdUZXh0KG1OYXRpdmVDYW52YXMsIHRleHQudG9TdHJpbmcoKSwgc3RhcnQsIGVuZCwgeCwgeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWludC5tTmF0aXZlUGFpbnQpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHRleHQgaW5zdGFuY2VvZiBHcmFwaGljc09wZXJhdGlvbnMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWludC5tQmlkaUZsYWdzLCBwYWludC5tTmF0aXZlUGFpbnQpOworICAgICAgICB9IGVsc2UgaWYgKHRleHQgaW5zdGFuY2VvZiBHcmFwaGljc09wZXJhdGlvbnMpIHsKICAgICAgICAgICAgICgoR3JhcGhpY3NPcGVyYXRpb25zKSB0ZXh0KS5kcmF3VGV4dCh0aGlzLCBzdGFydCwgZW5kLCB4LCB5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWludCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7CisgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBjaGFyW10gYnVmID0gVGVtcG9yYXJ5QnVmZmVyLm9idGFpbihlbmQgLSBzdGFydCk7CiAgICAgICAgICAgICBUZXh0VXRpbHMuZ2V0Q2hhcnModGV4dCwgc3RhcnQsIGVuZCwgYnVmLCAwKTsKLSAgICAgICAgICAgIGRyYXdUZXh0KGJ1ZiwgMCwgZW5kIC0gc3RhcnQsIHgsIHksIHBhaW50KTsKKyAgICAgICAgICAgIG5hdGl2ZV9kcmF3VGV4dChtTmF0aXZlQ2FudmFzLCBidWYsIDAsIGVuZCAtIHN0YXJ0LCB4LCB5LCAKKyAgICAgICAgICAgICAgICAgICAgcGFpbnQubUJpZGlGbGFncywgcGFpbnQubU5hdGl2ZVBhaW50KTsKKyAgICAgICAgICAgIFRlbXBvcmFyeUJ1ZmZlci5yZWN5Y2xlKGJ1Zik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZW5kZXIgYSBydW4gb2YgYWxsIExUUiBvciBhbGwgUlRMIHRleHQsIHdpdGggc2hhcGluZy4gVGhpcyBkb2VzIG5vdCBydW4KKyAgICAgKiBiaWRpIG9uIHRoZSBwcm92aWRlZCB0ZXh0LCBidXQgcmVuZGVycyBpdCBhcyBhIHVuaWZvcm0gcmlnaHQtdG8tbGVmdCBvcgorICAgICAqIGxlZnQtdG8tcmlnaHQgcnVuLCBhcyBpbmRpY2F0ZWQgYnkgZGlyLiBBbGlnbm1lbnQgb2YgdGhlIHRleHQgaXMgYXMKKyAgICAgKiBkZXRlcm1pbmVkIGJ5IHRoZSBQYWludCdzIFRleHRBbGlnbiB2YWx1ZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gdGV4dCB0aGUgdGV4dCB0byByZW5kZXIKKyAgICAgKiBAcGFyYW0gaW5kZXggdGhlIHN0YXJ0IG9mIHRoZSB0ZXh0IHRvIHJlbmRlcgorICAgICAqIEBwYXJhbSBjb3VudCB0aGUgY291bnQgb2YgY2hhcnMgdG8gcmVuZGVyCisgICAgICogQHBhcmFtIGNvbnRleHRJbmRleCB0aGUgc3RhcnQgb2YgdGhlIGNvbnRleHQgZm9yIHNoYXBpbmcuICBNdXN0IGJlCisgICAgICogICAgICAgICBubyBncmVhdGVyIHRoYW4gaW5kZXguCisgICAgICogQHBhcmFtIGNvbnRleHRDb3VudCB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gdGhlIGNvbnRleHQgZm9yIHNoYXBpbmcuCisgICAgICogICAgICAgICBDb250ZXhJbmRleCArIGNvbnRleHRDb3VudCBtdXN0IGJlIG5vIGxlc3MgdGhhbiBpbmRleAorICAgICAqICAgICAgICAgKyBjb3VudC4KKyAgICAgKiBAcGFyYW0geCB0aGUgeCBwb3NpdGlvbiBhdCB3aGljaCB0byBkcmF3IHRoZSB0ZXh0CisgICAgICogQHBhcmFtIHkgdGhlIHkgcG9zaXRpb24gYXQgd2hpY2ggdG8gZHJhdyB0aGUgdGV4dAorICAgICAqIEBwYXJhbSBkaXIgdGhlIHJ1biBkaXJlY3Rpb24sIGVpdGhlciB7QGxpbmsgI0RJUkVDVElPTl9MVFJ9IG9yCisgICAgICogICAgICAgICB7QGxpbmsgI0RJUkVDVElPTl9SVEx9LgorICAgICAqIEBwYXJhbSBwYWludCB0aGUgcGFpbnQKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGRyYXdUZXh0UnVuKGNoYXJbXSB0ZXh0LCBpbnQgaW5kZXgsIGludCBjb3VudCwKKyAgICAgICAgICAgIGludCBjb250ZXh0SW5kZXgsIGludCBjb250ZXh0Q291bnQsIGZsb2F0IHgsIGZsb2F0IHksIGludCBkaXIsCisgICAgICAgICAgICBQYWludCBwYWludCkgeworCisgICAgICAgIGlmICh0ZXh0ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigidGV4dCBpcyBudWxsIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBhaW50ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigicGFpbnQgaXMgbnVsbCIpOworICAgICAgICB9CisgICAgICAgIGlmICgoaW5kZXggfCBjb3VudCB8IHRleHQubGVuZ3RoIC0gaW5kZXggLSBjb3VudCkgPCAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgICAgIGlmIChkaXIgIT0gRElSRUNUSU9OX0xUUiAmJiBkaXIgIT0gRElSRUNUSU9OX1JUTCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidW5rbm93biBkaXI6ICIgKyBkaXIpOworICAgICAgICB9CisKKyAgICAgICAgbmF0aXZlX2RyYXdUZXh0UnVuKG1OYXRpdmVDYW52YXMsIHRleHQsIGluZGV4LCBjb3VudCwKKyAgICAgICAgICAgICAgICBjb250ZXh0SW5kZXgsIGNvbnRleHRDb3VudCwgeCwgeSwgZGlyLCBwYWludC5tTmF0aXZlUGFpbnQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlbmRlciBhIHJ1biBvZiBhbGwgTFRSIG9yIGFsbCBSVEwgdGV4dCwgd2l0aCBzaGFwaW5nLiBUaGlzIGRvZXMgbm90IHJ1bgorICAgICAqIGJpZGkgb24gdGhlIHByb3ZpZGVkIHRleHQsIGJ1dCByZW5kZXJzIGl0IGFzIGEgdW5pZm9ybSByaWdodC10by1sZWZ0IG9yCisgICAgICogbGVmdC10by1yaWdodCBydW4sIGFzIGluZGljYXRlZCBieSBkaXIuIEFsaWdubWVudCBvZiB0aGUgdGV4dCBpcyBhcworICAgICAqIGRldGVybWluZWQgYnkgdGhlIFBhaW50J3MgVGV4dEFsaWduIHZhbHVlLgorICAgICAqCisgICAgICogQHBhcmFtIHRleHQgdGhlIHRleHQgdG8gcmVuZGVyCisgICAgICogQHBhcmFtIHN0YXJ0IHRoZSBzdGFydCBvZiB0aGUgdGV4dCB0byByZW5kZXIuIERhdGEgYmVmb3JlIHRoaXMgcG9zaXRpb24KKyAgICAgKiAgICAgICAgICAgIGNhbiBiZSB1c2VkIGZvciBzaGFwaW5nIGNvbnRleHQuCisgICAgICogQHBhcmFtIGVuZCB0aGUgZW5kIG9mIHRoZSB0ZXh0IHRvIHJlbmRlci4gRGF0YSBhdCBvciBhZnRlciB0aGlzCisgICAgICogICAgICAgICAgICBwb3NpdGlvbiBjYW4gYmUgdXNlZCBmb3Igc2hhcGluZyBjb250ZXh0LgorICAgICAqIEBwYXJhbSB4IHRoZSB4IHBvc2l0aW9uIGF0IHdoaWNoIHRvIGRyYXcgdGhlIHRleHQKKyAgICAgKiBAcGFyYW0geSB0aGUgeSBwb3NpdGlvbiBhdCB3aGljaCB0byBkcmF3IHRoZSB0ZXh0CisgICAgICogQHBhcmFtIGRpciB0aGUgcnVuIGRpcmVjdGlvbiwgZWl0aGVyIDAgZm9yIExUUiBvciAxIGZvciBSVEwuCisgICAgICogQHBhcmFtIHBhaW50IHRoZSBwYWludAorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHZvaWQgZHJhd1RleHRSdW4oQ2hhclNlcXVlbmNlIHRleHQsIGludCBzdGFydCwgaW50IGVuZCwKKyAgICAgICAgICAgIGludCBjb250ZXh0U3RhcnQsIGludCBjb250ZXh0RW5kLCBmbG9hdCB4LCBmbG9hdCB5LCBpbnQgZGlyLAorICAgICAgICAgICAgUGFpbnQgcGFpbnQpIHsKKworICAgICAgICBpZiAodGV4dCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oInRleHQgaXMgbnVsbCIpOworICAgICAgICB9CisgICAgICAgIGlmIChwYWludCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oInBhaW50IGlzIG51bGwiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKHN0YXJ0IHwgZW5kIHwgZW5kIC0gc3RhcnQgfCB0ZXh0Lmxlbmd0aCgpIC0gZW5kKSA8IDApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBpbnQgZmxhZ3MgPSBkaXIgPT0gMCA/IDAgOiAxOworCisgICAgICAgIGlmICh0ZXh0IGluc3RhbmNlb2YgU3RyaW5nIHx8IHRleHQgaW5zdGFuY2VvZiBTcGFubmVkU3RyaW5nIHx8CisgICAgICAgICAgICAgICAgdGV4dCBpbnN0YW5jZW9mIFNwYW5uYWJsZVN0cmluZykgeworICAgICAgICAgICAgbmF0aXZlX2RyYXdUZXh0UnVuKG1OYXRpdmVDYW52YXMsIHRleHQudG9TdHJpbmcoKSwgc3RhcnQsIGVuZCwKKyAgICAgICAgICAgICAgICAgICAgY29udGV4dFN0YXJ0LCBjb250ZXh0RW5kLCB4LCB5LCBmbGFncywgcGFpbnQubU5hdGl2ZVBhaW50KTsKKyAgICAgICAgfSBlbHNlIGlmICh0ZXh0IGluc3RhbmNlb2YgR3JhcGhpY3NPcGVyYXRpb25zKSB7CisgICAgICAgICAgICAoKEdyYXBoaWNzT3BlcmF0aW9ucykgdGV4dCkuZHJhd1RleHRSdW4odGhpcywgc3RhcnQsIGVuZCwKKyAgICAgICAgICAgICAgICAgICAgY29udGV4dFN0YXJ0LCBjb250ZXh0RW5kLCB4LCB5LCBmbGFncywgcGFpbnQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW50IGNvbnRleHRMZW4gPSBjb250ZXh0RW5kIC0gY29udGV4dFN0YXJ0OworICAgICAgICAgICAgaW50IGxlbiA9IGVuZCAtIHN0YXJ0OworICAgICAgICAgICAgY2hhcltdIGJ1ZiA9IFRlbXBvcmFyeUJ1ZmZlci5vYnRhaW4oY29udGV4dExlbik7CisgICAgICAgICAgICBUZXh0VXRpbHMuZ2V0Q2hhcnModGV4dCwgY29udGV4dFN0YXJ0LCBjb250ZXh0RW5kLCBidWYsIDApOworICAgICAgICAgICAgbmF0aXZlX2RyYXdUZXh0UnVuKG1OYXRpdmVDYW52YXMsIGJ1Ziwgc3RhcnQgLSBjb250ZXh0U3RhcnQsIGxlbiwKKyAgICAgICAgICAgICAgICAgICAgMCwgY29udGV4dExlbiwgeCwgeSwgZmxhZ3MsIHBhaW50Lm1OYXRpdmVQYWludCk7CiAgICAgICAgICAgICBUZW1wb3JhcnlCdWZmZXIucmVjeWNsZShidWYpOwogICAgICAgICB9CiAgICAgfQpAQCAtMTU1NSwxMCArMTY4NiwxOSBAQAogICAgIAogICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIG5hdGl2ZV9kcmF3VGV4dChpbnQgbmF0aXZlQ2FudmFzLCBjaGFyW10gdGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4LCBpbnQgY291bnQsIGZsb2F0IHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHksIGludCBwYWludCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHksIGludCBmbGFncywgaW50IHBhaW50KTsKICAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBuYXRpdmVfZHJhd1RleHQoaW50IG5hdGl2ZUNhbnZhcywgU3RyaW5nIHRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydCwgaW50IGVuZCwgZmxvYXQgeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeSwgaW50IHBhaW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeSwgaW50IGZsYWdzLCBpbnQgcGFpbnQpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgbmF0aXZlX2RyYXdUZXh0UnVuKGludCBuYXRpdmVDYW52YXMsIFN0cmluZyB0ZXh0LAorICAgICAgICAgICAgaW50IHN0YXJ0LCBpbnQgZW5kLCBpbnQgY29udGV4dFN0YXJ0LCBpbnQgY29udGV4dEVuZCwKKyAgICAgICAgICAgIGZsb2F0IHgsIGZsb2F0IHksIGludCBmbGFncywgaW50IHBhaW50KTsKKworICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIG5hdGl2ZV9kcmF3VGV4dFJ1bihpbnQgbmF0aXZlQ2FudmFzLCBjaGFyW10gdGV4dCwKKyAgICAgICAgICAgIGludCBzdGFydCwgaW50IGNvdW50LCBpbnQgY29udGV4dFN0YXJ0LCBpbnQgY29udGV4dENvdW50LAorICAgICAgICAgICAgZmxvYXQgeCwgZmxvYXQgeSwgaW50IGZsYWdzLCBpbnQgcGFpbnQpOworCiAgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgbmF0aXZlX2RyYXdQb3NUZXh0KGludCBuYXRpdmVDYW52YXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJbXSB0ZXh0LCBpbnQgaW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb3VudCwgZmxvYXRbXSBwb3MsCmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvTWF0cml4LmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvTWF0cml4LmphdmEKaW5kZXggZjU0OTkwMC4uYjMzNjk5NSAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL01hdHJpeC5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9NYXRyaXguamF2YQpAQCAtMzcsNyArMzcsMTAgQEAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNUEVSU1BfMSA9IDc7ICAgLy8hPCB1c2Ugd2l0aCBnZXRWYWx1ZXMvc2V0VmFsdWVzCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTVBFUlNQXzIgPSA4OyAgIC8vITwgdXNlIHdpdGggZ2V0VmFsdWVzL3NldFZhbHVlcwogCi0gICAgLyogcGFja2FnZSAqLyBpbnQgbmF0aXZlX2luc3RhbmNlOworICAgIC8qKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIGludCBuYXRpdmVfaW5zdGFuY2U7CiAKICAgICAvKioKICAgICAgKiBDcmVhdGUgYW4gaWRlbnRpdHkgbWF0cml4CmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvUGFpbnQuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9QYWludC5qYXZhCmluZGV4IDNlM2Y4N2IuLjg4ZmYwZTYgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9QYWludC5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9QYWludC5qYXZhCkBAIC0xNiwxMCArMTYsMTAgQEAKIAogcGFja2FnZSBhbmRyb2lkLmdyYXBoaWNzOwogCi1pbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKK2ltcG9ydCBhbmRyb2lkLnRleHQuR3JhcGhpY3NPcGVyYXRpb25zOwogaW1wb3J0IGFuZHJvaWQudGV4dC5TcGFubmFibGVTdHJpbmc7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LlNwYW5uZWRTdHJpbmc7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LkdyYXBoaWNzT3BlcmF0aW9uczsKK2ltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwogCiAvKioKICAqIFRoZSBQYWludCBjbGFzcyBob2xkcyB0aGUgc3R5bGUgYW5kIGNvbG9yIGluZm9ybWF0aW9uIGFib3V0IGhvdyB0byBkcmF3CkBAIC0yNyw3ICsyNywxMSBAQAogICovCiBwdWJsaWMgY2xhc3MgUGFpbnQgewogCi0gICAgLypwYWNrYWdlKi8gaW50ICAgICBtTmF0aXZlUGFpbnQ7CisgICAgLyoqCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IG1OYXRpdmVQYWludDsKKwogICAgIHByaXZhdGUgQ29sb3JGaWx0ZXIgbUNvbG9yRmlsdGVyOwogICAgIHByaXZhdGUgTWFza0ZpbHRlciAgbU1hc2tGaWx0ZXI7CiAgICAgcHJpdmF0ZSBQYXRoRWZmZWN0ICBtUGF0aEVmZmVjdDsKQEAgLTM5LDYgKzQzLDcgQEAKICAgICBwcml2YXRlIGJvb2xlYW4gICAgIG1IYXNDb21wYXRTY2FsaW5nOwogICAgIHByaXZhdGUgZmxvYXQgICAgICAgbUNvbXBhdFNjYWxpbmc7CiAgICAgcHJpdmF0ZSBmbG9hdCAgICAgICBtSW52Q29tcGF0U2NhbGluZzsKKyAgICAvKiBwYWNrYWdlICovIGludCAgIG1CaWRpRmxhZ3MgPSBCSURJX0RFRkFVTFRfTFRSOwogICAgIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0eWxlW10gc1N0eWxlQXJyYXkgPSB7CiAgICAgICAgIFN0eWxlLkZJTEwsIFN0eWxlLlNUUk9LRSwgU3R5bGUuRklMTF9BTkRfU1RST0tFCkBAIC03Niw4ICs4MSwxMTYgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9QQUlOVF9GTEFHUyA9IERFVl9LRVJOX1RFWFRfRkxBRzsKIAogICAgIC8qKgotICAgICAqIFRoZSBTdHlsZSBzcGVjaWZpZXMgaWYgdGhlIHByaW1pdGl2ZSBiZWluZyBkcmF3biBpcyBmaWxsZWQsCi0gICAgICogc3Ryb2tlZCwgb3IgYm90aCAoaW4gdGhlIHNhbWUgY29sb3IpLiBUaGUgZGVmYXVsdCBpcyBGSUxMLgorICAgICAqIEJpZGkgZmxhZyB0byBzZXQgTFRSIHBhcmFncmFwaCBkaXJlY3Rpb24uCisgICAgICogCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCSURJX0xUUiA9IDB4MDsKKworICAgIC8qKgorICAgICAqIEJpZGkgZmxhZyB0byBzZXQgUlRMIHBhcmFncmFwaCBkaXJlY3Rpb24uCisgICAgICogCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCSURJX1JUTCA9IDB4MTsKKworICAgIC8qKgorICAgICAqIEJpZGkgZmxhZyB0byBkZXRlY3QgcGFyYWdyYXBoIGRpcmVjdGlvbiB2aWEgaGV1cmlzdGljcywgZGVmYXVsdGluZyB0bworICAgICAqIExUUi4KKyAgICAgKiAKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJJRElfREVGQVVMVF9MVFIgPSAweDI7CisKKyAgICAvKioKKyAgICAgKiBCaWRpIGZsYWcgdG8gZGV0ZWN0IHBhcmFncmFwaCBkaXJlY3Rpb24gdmlhIGhldXJpc3RpY3MsIGRlZmF1bHRpbmcgdG8KKyAgICAgKiBSVEwuCisgICAgICogCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCSURJX0RFRkFVTFRfUlRMID0gMHgzOworCisgICAgLyoqCisgICAgICogQmlkaSBmbGFnIHRvIG92ZXJyaWRlIGRpcmVjdGlvbiB0byBhbGwgTFRSIChpZ25vcmUgYmlkaSkuCisgICAgICogCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCSURJX0ZPUkNFX0xUUiA9IDB4NDsKKworICAgIC8qKgorICAgICAqIEJpZGkgZmxhZyB0byBvdmVycmlkZSBkaXJlY3Rpb24gdG8gYWxsIFJUTCAoaWdub3JlIGJpZGkpLgorICAgICAqIAorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQklESV9GT1JDRV9SVEwgPSAweDU7CisKKyAgICAvKioKKyAgICAgKiBNYXhpbXVtIEJpZGkgZmxhZyB2YWx1ZS4KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCSURJX01BWF9GTEFHX1ZBTFVFID0gQklESV9GT1JDRV9SVEw7CisKKyAgICAvKioKKyAgICAgKiBNYXNrIGZvciBiaWRpIGZsYWdzLgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJJRElfRkxBR19NQVNLID0gMHg3OworCisgICAgLyoqCisgICAgICogRmxhZyBmb3IgZ2V0VGV4dFJ1bkFkdmFuY2VzIGluZGljYXRpbmcgbGVmdC10by1yaWdodCBydW4gZGlyZWN0aW9uLgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElSRUNUSU9OX0xUUiA9IDA7CisKKyAgICAvKioKKyAgICAgKiBGbGFnIGZvciBnZXRUZXh0UnVuQWR2YW5jZXMgaW5kaWNhdGluZyByaWdodC10by1sZWZ0IHJ1biBkaXJlY3Rpb24uCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBESVJFQ1RJT05fUlRMID0gMTsKKworICAgIC8qKgorICAgICAqIE9wdGlvbiBmb3IgZ2V0VGV4dFJ1bkN1cnNvciB0byBjb21wdXRlIHRoZSB2YWxpZCBjdXJzb3IgYWZ0ZXIKKyAgICAgKiBvZmZzZXQgb3IgdGhlIGxpbWl0IG9mIHRoZSBjb250ZXh0LCB3aGljaGV2ZXIgaXMgbGVzcy4KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENVUlNPUl9BRlRFUiA9IDA7CisKKyAgICAvKioKKyAgICAgKiBPcHRpb24gZm9yIGdldFRleHRSdW5DdXJzb3IgdG8gY29tcHV0ZSB0aGUgdmFsaWQgY3Vyc29yIGF0IG9yIGFmdGVyCisgICAgICogdGhlIG9mZnNldCBvciB0aGUgbGltaXQgb2YgdGhlIGNvbnRleHQsIHdoaWNoZXZlciBpcyBsZXNzLgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ1VSU09SX0FUX09SX0FGVEVSID0gMTsKKworICAgICAvKioKKyAgICAgKiBPcHRpb24gZm9yIGdldFRleHRSdW5DdXJzb3IgdG8gY29tcHV0ZSB0aGUgdmFsaWQgY3Vyc29yIGJlZm9yZQorICAgICAqIG9mZnNldCBvciB0aGUgc3RhcnQgb2YgdGhlIGNvbnRleHQsIHdoaWNoZXZlciBpcyBncmVhdGVyLgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ1VSU09SX0JFRk9SRSA9IDI7CisKKyAgIC8qKgorICAgICAqIE9wdGlvbiBmb3IgZ2V0VGV4dFJ1bkN1cnNvciB0byBjb21wdXRlIHRoZSB2YWxpZCBjdXJzb3IgYXQgb3IgYmVmb3JlCisgICAgICogb2Zmc2V0IG9yIHRoZSBzdGFydCBvZiB0aGUgY29udGV4dCwgd2hpY2hldmVyIGlzIGdyZWF0ZXIuCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDVVJTT1JfQVRfT1JfQkVGT1JFID0gMzsKKworICAgIC8qKgorICAgICAqIE9wdGlvbiBmb3IgZ2V0VGV4dFJ1bkN1cnNvciB0byByZXR1cm4gb2Zmc2V0IGlmIHRoZSBjdXJzb3IgYXQgb2Zmc2V0CisgICAgICogaXMgdmFsaWQsIG9yIC0xIGlmIGl0IGlzbid0LgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ1VSU09SX0FUID0gNDsKKworICAgIC8qKgorICAgICAqIE1heGltdW0gY3Vyc29yIG9wdGlvbiB2YWx1ZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ1VSU09SX09QVF9NQVhfVkFMVUUgPSBDVVJTT1JfQVQ7CisKKyAgICAvKioKKyAgICAgKiBUaGUgU3R5bGUgc3BlY2lmaWVzIGlmIHRoZSBwcmltaXRpdmUgYmVpbmcgZHJhd24gaXMgZmlsbGVkLCBzdHJva2VkLCBvcgorICAgICAqIGJvdGggKGluIHRoZSBzYW1lIGNvbG9yKS4gVGhlIGRlZmF1bHQgaXMgRklMTC4KICAgICAgKi8KICAgICBwdWJsaWMgZW51bSBTdHlsZSB7CiAgICAgICAgIC8qKgpAQCAtOTMsNyArMjA2LDkgQEAKICAgICAgICAgLyoqCiAgICAgICAgICAqIEdlb21ldHJ5IGFuZCB0ZXh0IGRyYXduIHdpdGggdGhpcyBzdHlsZSB3aWxsIGJlIGJvdGggZmlsbGVkIGFuZAogICAgICAgICAgKiBzdHJva2VkIGF0IHRoZSBzYW1lIHRpbWUsIHJlc3BlY3RpbmcgdGhlIHN0cm9rZS1yZWxhdGVkIGZpZWxkcyBvbgotICAgICAgICAgKiB0aGUgcGFpbnQuCisgICAgICAgICAqIHRoZSBwYWludC4gVGhpcyBtb2RlIGNhbiBnaXZlIHVuZXhwZWN0ZWQgcmVzdWx0cyBpZiB0aGUgZ2VvbWV0cnkKKyAgICAgICAgICogaXMgb3JpZW50ZWQgY291bnRlci1jbG9ja3dpc2UuIFRoaXMgcmVzdHJpY3Rpb24gZG9lcyBub3QgYXBwbHkgdG8KKyAgICAgICAgICogZWl0aGVyIEZJTEwgb3IgU1RST0tFLgogICAgICAgICAgKi8KICAgICAgICAgRklMTF9BTkRfU1RST0tFICgyKTsKICAgICAgICAgCkBAIC0yMDgsNiArMzIzLDcgQEAKICAgICAgICAgbUhhc0NvbXBhdFNjYWxpbmcgPSBwYWludC5tSGFzQ29tcGF0U2NhbGluZzsKICAgICAgICAgbUNvbXBhdFNjYWxpbmcgPSBwYWludC5tQ29tcGF0U2NhbGluZzsKICAgICAgICAgbUludkNvbXBhdFNjYWxpbmcgPSBwYWludC5tSW52Q29tcGF0U2NhbGluZzsKKyAgICAgICAgbUJpZGlGbGFncyA9IHBhaW50Lm1CaWRpRmxhZ3M7CiAgICAgfQogCiAgICAgLyoqIFJlc3RvcmVzIHRoZSBwYWludCB0byBpdHMgZGVmYXVsdCBzZXR0aW5ncy4gKi8KQEAgLTIxNiw2ICszMzIsNyBAQAogICAgICAgICBzZXRGbGFncyhERUZBVUxUX1BBSU5UX0ZMQUdTKTsKICAgICAgICAgbUhhc0NvbXBhdFNjYWxpbmcgPSBmYWxzZTsKICAgICAgICAgbUNvbXBhdFNjYWxpbmcgPSBtSW52Q29tcGF0U2NhbGluZyA9IDE7CisgICAgICAgIG1CaWRpRmxhZ3MgPSBCSURJX0RFRkFVTFRfTFRSOwogICAgIH0KICAgICAKICAgICAvKioKQEAgLTIzOCw2ICszNTUsNyBAQAogICAgICAgICAgICAgbUhhc0NvbXBhdFNjYWxpbmcgPSBzcmMubUhhc0NvbXBhdFNjYWxpbmc7CiAgICAgICAgICAgICBtQ29tcGF0U2NhbGluZyAgICA9IHNyYy5tQ29tcGF0U2NhbGluZzsKICAgICAgICAgICAgIG1JbnZDb21wYXRTY2FsaW5nID0gc3JjLm1JbnZDb21wYXRTY2FsaW5nOworICAgICAgICAgICAgbUJpZGlGbGFncyAgICAgID0gc3JjLm1CaWRpRmxhZ3M7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTI1MiwxMCArMzcwLDMzIEBACiAgICAgICAgICAgICBtSW52Q29tcGF0U2NhbGluZyA9IDEuMGYvZmFjdG9yOwogICAgICAgICB9CiAgICAgfQotICAgIAorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBiaWRpIGZsYWdzIG9uIHRoZSBwYWludC4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBiaWRpIGZsYWdzIG9uIHRoZSBwYWludAorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIGludCBnZXRCaWRpRmxhZ3MoKSB7CisgICAgICAgIHJldHVybiBtQmlkaUZsYWdzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgYmlkaSBmbGFncyBvbiB0aGUgcGFpbnQuCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRCaWRpRmxhZ3MoaW50IGZsYWdzKSB7CisgICAgICAgIC8vIG9ubHkgZmxhZyB2YWx1ZSBpcyB0aGUgMy1iaXQgQklESSBjb250cm9sIHNldHRpbmcKKyAgICAgICAgZmxhZ3MgJj0gQklESV9GTEFHX01BU0s7CisgICAgICAgIGlmIChmbGFncyA+IEJJRElfTUFYX0ZMQUdfVkFMVUUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInVua25vd24gYmlkaSBmbGFnOiAiICsgZmxhZ3MpOworICAgICAgICB9CisgICAgICAgIG1CaWRpRmxhZ3MgPSBmbGFnczsKKyAgICB9CisKICAgICAvKioKICAgICAgKiBSZXR1cm4gdGhlIHBhaW50J3MgZmxhZ3MuIFVzZSB0aGUgRmxhZyBlbnVtIHRvIHRlc3QgZmxhZyB2YWx1ZXMuCi0gICAgICoKKyAgICAgKiAKICAgICAgKiBAcmV0dXJuIHRoZSBwYWludCdzIGZsYWdzIChzZWUgZW51bXMgZW5kaW5nIGluIF9GbGFnIGZvciBiaXQgbWFza3MpCiAgICAgICovCiAgICAgcHVibGljIG5hdGl2ZSBpbnQgZ2V0RmxhZ3MoKTsKQEAgLTEyMzIsMTAgKzEzNzMsMTAgQEAKICAgICAgICAgfQogCiAgICAgICAgIGNoYXJbXSBidWYgPSBUZW1wb3JhcnlCdWZmZXIub2J0YWluKGVuZCAtIHN0YXJ0KTsKLSAgICAJVGV4dFV0aWxzLmdldENoYXJzKHRleHQsIHN0YXJ0LCBlbmQsIGJ1ZiwgMCk7Ci0gICAgCWludCByZXN1bHQgPSBnZXRUZXh0V2lkdGhzKGJ1ZiwgMCwgZW5kIC0gc3RhcnQsIHdpZHRocyk7CisgICAgICAgIFRleHRVdGlscy5nZXRDaGFycyh0ZXh0LCBzdGFydCwgZW5kLCBidWYsIDApOworICAgICAgICBpbnQgcmVzdWx0ID0gZ2V0VGV4dFdpZHRocyhidWYsIDAsIGVuZCAtIHN0YXJ0LCB3aWR0aHMpOwogICAgICAgICBUZW1wb3JhcnlCdWZmZXIucmVjeWNsZShidWYpOwotICAgIAlyZXR1cm4gcmVzdWx0OworICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KIAogICAgIC8qKgpAQCAtMTI4Miw2ICsxNDIzLDI4NCBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIENvbnZlbmllbmNlIG92ZXJsb2FkIHRoYXQgdGFrZXMgYSBjaGFyIGFycmF5IGluc3RlYWQgb2YgYQorICAgICAqIFN0cmluZy4KKyAgICAgKgorICAgICAqIEBzZWUgI2dldFRleHRSdW5BZHZhbmNlcyhTdHJpbmcsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBmbG9hdFtdLCBpbnQpCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgZmxvYXQgZ2V0VGV4dFJ1bkFkdmFuY2VzKGNoYXJbXSBjaGFycywgaW50IGluZGV4LCBpbnQgY291bnQsCisgICAgICAgICAgICBpbnQgY29udGV4dEluZGV4LCBpbnQgY29udGV4dENvdW50LCBpbnQgZmxhZ3MsIGZsb2F0W10gYWR2YW5jZXMsCisgICAgICAgICAgICBpbnQgYWR2YW5jZXNJbmRleCkgeworCisgICAgICAgIGlmICgoaW5kZXggfCBjb3VudCB8IGNvbnRleHRJbmRleCB8IGNvbnRleHRDb3VudCB8IGFkdmFuY2VzSW5kZXgKKyAgICAgICAgICAgICAgICB8IChpbmRleCAtIGNvbnRleHRJbmRleCkKKyAgICAgICAgICAgICAgICB8ICgoY29udGV4dEluZGV4ICsgY29udGV4dENvdW50KSAtIChpbmRleCArIGNvdW50KSkKKyAgICAgICAgICAgICAgICB8IChjaGFycy5sZW5ndGggLSAoY29udGV4dEluZGV4ICsgY29udGV4dENvdW50KSkKKyAgICAgICAgICAgICAgICB8IChhZHZhbmNlcyA9PSBudWxsID8gMCA6CisgICAgICAgICAgICAgICAgICAgIChhZHZhbmNlcy5sZW5ndGggLSAoYWR2YW5jZXNJbmRleCArIGNvdW50KSkpKSA8IDApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZsYWdzICE9IERJUkVDVElPTl9MVFIgJiYgZmxhZ3MgIT0gRElSRUNUSU9OX1JUTCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidW5rbm93biBmbGFncyB2YWx1ZTogIiArIGZsYWdzKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghbUhhc0NvbXBhdFNjYWxpbmcpIHsKKyAgICAgICAgICAgIHJldHVybiBuYXRpdmVfZ2V0VGV4dFJ1bkFkdmFuY2VzKG1OYXRpdmVQYWludCwgY2hhcnMsIGluZGV4LCBjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgY29udGV4dEluZGV4LCBjb250ZXh0Q291bnQsIGZsYWdzLCBhZHZhbmNlcywgYWR2YW5jZXNJbmRleCk7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBmbG9hdCBvbGRTaXplID0gZ2V0VGV4dFNpemUoKTsKKyAgICAgICAgc2V0VGV4dFNpemUob2xkU2l6ZSAqIG1Db21wYXRTY2FsaW5nKTsKKyAgICAgICAgZmxvYXQgcmVzID0gbmF0aXZlX2dldFRleHRSdW5BZHZhbmNlcyhtTmF0aXZlUGFpbnQsIGNoYXJzLCBpbmRleCwgY291bnQsCisgICAgICAgICAgICAgICAgY29udGV4dEluZGV4LCBjb250ZXh0Q291bnQsIGZsYWdzLCBhZHZhbmNlcywgYWR2YW5jZXNJbmRleCk7CisgICAgICAgIHNldFRleHRTaXplKG9sZFNpemUpOworCisgICAgICAgIGlmIChhZHZhbmNlcyAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gYWR2YW5jZXNJbmRleCwgZSA9IGkgKyBjb3VudDsgaSA8IGU7IGkrKykgeworICAgICAgICAgICAgICAgIGFkdmFuY2VzW2ldICo9IG1JbnZDb21wYXRTY2FsaW5nOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiByZXMgKiBtSW52Q29tcGF0U2NhbGluZzsgLy8gYXNzdW1lIGVycm9ycyBhcmUgbm90IHNpZ25pZmljYW50CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udmVuaWVuY2Ugb3ZlcmxvYWQgdGhhdCB0YWtlcyBhIENoYXJTZXF1ZW5jZSBpbnN0ZWFkIG9mIGEKKyAgICAgKiBTdHJpbmcuCisgICAgICoKKyAgICAgKiBAc2VlICNnZXRUZXh0UnVuQWR2YW5jZXMoU3RyaW5nLCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgZmxvYXRbXSwgaW50KQorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIGZsb2F0IGdldFRleHRSdW5BZHZhbmNlcyhDaGFyU2VxdWVuY2UgdGV4dCwgaW50IHN0YXJ0LCBpbnQgZW5kLAorICAgICAgICAgICAgaW50IGNvbnRleHRTdGFydCwgaW50IGNvbnRleHRFbmQsIGludCBmbGFncywgZmxvYXRbXSBhZHZhbmNlcywKKyAgICAgICAgICAgIGludCBhZHZhbmNlc0luZGV4KSB7CisKKyAgICAgICAgaWYgKHRleHQgaW5zdGFuY2VvZiBTdHJpbmcpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRUZXh0UnVuQWR2YW5jZXMoKFN0cmluZykgdGV4dCwgc3RhcnQsIGVuZCwKKyAgICAgICAgICAgICAgICAgICAgY29udGV4dFN0YXJ0LCBjb250ZXh0RW5kLCBmbGFncywgYWR2YW5jZXMsIGFkdmFuY2VzSW5kZXgpOworICAgICAgICB9CisgICAgICAgIGlmICh0ZXh0IGluc3RhbmNlb2YgU3Bhbm5lZFN0cmluZyB8fAorICAgICAgICAgICAgdGV4dCBpbnN0YW5jZW9mIFNwYW5uYWJsZVN0cmluZykgeworICAgICAgICAgICAgcmV0dXJuIGdldFRleHRSdW5BZHZhbmNlcyh0ZXh0LnRvU3RyaW5nKCksIHN0YXJ0LCBlbmQsCisgICAgICAgICAgICAgICAgICAgIGNvbnRleHRTdGFydCwgY29udGV4dEVuZCwgZmxhZ3MsIGFkdmFuY2VzLCBhZHZhbmNlc0luZGV4KTsKKyAgICAgICAgfQorICAgICAgICBpZiAodGV4dCBpbnN0YW5jZW9mIEdyYXBoaWNzT3BlcmF0aW9ucykgeworICAgICAgICAgICAgcmV0dXJuICgoR3JhcGhpY3NPcGVyYXRpb25zKSB0ZXh0KS5nZXRUZXh0UnVuQWR2YW5jZXMoc3RhcnQsIGVuZCwKKyAgICAgICAgICAgICAgICAgICAgY29udGV4dFN0YXJ0LCBjb250ZXh0RW5kLCBmbGFncywgYWR2YW5jZXMsIGFkdmFuY2VzSW5kZXgsIHRoaXMpOworICAgICAgICB9CisKKyAgICAgICAgaW50IGNvbnRleHRMZW4gPSBjb250ZXh0RW5kIC0gY29udGV4dFN0YXJ0OworICAgICAgICBpbnQgbGVuID0gZW5kIC0gc3RhcnQ7CisgICAgICAgIGNoYXJbXSBidWYgPSBUZW1wb3JhcnlCdWZmZXIub2J0YWluKGNvbnRleHRMZW4pOworICAgICAgICBUZXh0VXRpbHMuZ2V0Q2hhcnModGV4dCwgc3RhcnQsIGVuZCwgYnVmLCAwKTsKKyAgICAgICAgZmxvYXQgcmVzdWx0ID0gZ2V0VGV4dFJ1bkFkdmFuY2VzKGJ1Ziwgc3RhcnQgLSBjb250ZXh0U3RhcnQsIGxlbiwKKyAgICAgICAgICAgICAgICAwLCBjb250ZXh0TGVuLCBmbGFncywgYWR2YW5jZXMsIGFkdmFuY2VzSW5kZXgpOworICAgICAgICBUZW1wb3JhcnlCdWZmZXIucmVjeWNsZShidWYpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHRvdGFsIGFkdmFuY2Ugd2lkdGggZm9yIHRoZSBjaGFyYWN0ZXJzIGluIHRoZSBydW4KKyAgICAgKiBiZXR3ZWVuIHN0YXJ0IGFuZCBlbmQsIGFuZCBpZiBhZHZhbmNlcyBpcyBub3QgbnVsbCwgdGhlIGFkdmFuY2UKKyAgICAgKiBhc3NpZ25lZCB0byBlYWNoIG9mIHRoZXNlIGNoYXJhY3RlcnMgKGphdmEgY2hhcnMpLgorICAgICAqCisgICAgICogPHA+VGhlIHRyYWlsaW5nIHN1cnJvZ2F0ZSBpbiBhIHZhbGlkIHN1cnJvZ2F0ZSBwYWlyIGlzIGFzc2lnbmVkCisgICAgICogYW4gYWR2YW5jZSBvZiAwLiAgVGh1cyB0aGUgbnVtYmVyIG9mIHJldHVybmVkIGFkdmFuY2VzIGlzCisgICAgICogYWx3YXlzIGVxdWFsIHRvIGNvdW50LCBub3QgdG8gdGhlIG51bWJlciBvZiB1bmljb2RlIGNvZGVwb2ludHMKKyAgICAgKiByZXByZXNlbnRlZCBieSB0aGUgcnVuLgorICAgICAqCisgICAgICogPHA+SW4gdGhlIGNhc2Ugb2YgY29uanVuY3RzIG9yIGNvbWJpbmluZyBtYXJrcywgdGhlIHRvdGFsCisgICAgICogYWR2YW5jZSBpcyBhc3NpZ25lZCB0byB0aGUgZmlyc3QgbG9naWNhbCBjaGFyYWN0ZXIsIGFuZCB0aGUKKyAgICAgKiBmb2xsb3dpbmcgY2hhcmFjdGVycyBhcmUgYXNzaWduZWQgYW4gYWR2YW5jZSBvZiAwLgorICAgICAqCisgICAgICogPHA+VGhpcyBnZW5lcmF0ZXMgdGhlIHN1bSBvZiB0aGUgYWR2YW5jZXMgb2YgZ2x5cGhzIGZvcgorICAgICAqIGNoYXJhY3RlcnMgaW4gYSByZW9yZGVyZWQgY2x1c3RlciBhcyB0aGUgd2lkdGggb2YgdGhlIGZpcnN0CisgICAgICogbG9naWNhbCBjaGFyYWN0ZXIgaW4gdGhlIGNsdXN0ZXIsIGFuZCAwIGZvciB0aGUgd2lkdGhzIG9mIGFsbAorICAgICAqIG90aGVyIGNoYXJhY3RlcnMgaW4gdGhlIGNsdXN0ZXIuICBJbiBlZmZlY3QsIHN1Y2ggY2x1c3RlcnMgYXJlCisgICAgICogdHJlYXRlZCBsaWtlIGNvbmp1bmN0cy4KKyAgICAgKgorICAgICAqIDxwPlRoZSBzaGFwaW5nIGJvdW5kcyBsaW1pdCB0aGUgYW1vdW50IG9mIGNvbnRleHQgYXZhaWxhYmxlCisgICAgICogb3V0c2lkZSBzdGFydCBhbmQgZW5kIHRoYXQgY2FuIGJlIHVzZWQgZm9yIHNoYXBpbmcgYW5hbHlzaXMuCisgICAgICogVGhlc2UgYm91bmRzIHR5cGljYWxseSByZWZsZWN0IGNoYW5nZXMgaW4gYmlkaSBsZXZlbCBvciBmb250CisgICAgICogbWV0cmljcyBhY3Jvc3Mgd2hpY2ggc2hhcGluZyBkb2VzIG5vdCBvY2N1ci4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0ZXh0IHRoZSB0ZXh0IHRvIG1lYXN1cmUKKyAgICAgKiBAcGFyYW0gc3RhcnQgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIgdG8gbWVhc3VyZQorICAgICAqIEBwYXJhbSBlbmQgdGhlIGluZGV4IHBhc3QgdGhlIGxhc3QgY2hhcmFjdGVyIHRvIG1lYXN1cmUKKyAgICAgKiBAcGFyYW0gY29udGV4dFN0YXJ0IHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyIHRvIHVzZSBmb3Igc2hhcGluZyBjb250ZXh0LAorICAgICAqIG11c3QgYmUgPD0gc3RhcnQKKyAgICAgKiBAcGFyYW0gY29udGV4dEVuZCB0aGUgaW5kZXggcGFzdCB0aGUgbGFzdCBjaGFyYWN0ZXIgdG8gdXNlIGZvciBzaGFwaW5nIGNvbnRleHQsCisgICAgICogbXVzdCBiZSA+PSBlbmQKKyAgICAgKiBAcGFyYW0gZmxhZ3MgdGhlIGZsYWdzIHRvIGNvbnRyb2wgdGhlIGFkdmFuY2VzLCBlaXRoZXIge0BsaW5rICNESVJFQ1RJT05fTFRSfQorICAgICAqIG9yIHtAbGluayAjRElSRUNUSU9OX1JUTH0KKyAgICAgKiBAcGFyYW0gYWR2YW5jZXMgYXJyYXkgdG8gcmVjZWl2ZSB0aGUgYWR2YW5jZXMsIG11c3QgaGF2ZSByb29tIGZvciBhbGwgYWR2YW5jZXMsCisgICAgICogY2FuIGJlIG51bGwgaWYgb25seSB0b3RhbCBhZHZhbmNlIGlzIG5lZWRlZAorICAgICAqIEBwYXJhbSBhZHZhbmNlc0luZGV4IHRoZSBwb3NpdGlvbiBpbiBhZHZhbmNlcyBhdCB3aGljaCB0byBwdXQgdGhlCisgICAgICogYWR2YW5jZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBjaGFyYWN0ZXIgYXQgc3RhcnQKKyAgICAgKiBAcmV0dXJuIHRoZSB0b3RhbCBhZHZhbmNlCisgICAgICoKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBmbG9hdCBnZXRUZXh0UnVuQWR2YW5jZXMoU3RyaW5nIHRleHQsIGludCBzdGFydCwgaW50IGVuZCwgaW50IGNvbnRleHRTdGFydCwKKyAgICAgICAgICAgIGludCBjb250ZXh0RW5kLCBpbnQgZmxhZ3MsIGZsb2F0W10gYWR2YW5jZXMsIGludCBhZHZhbmNlc0luZGV4KSB7CisKKyAgICAgICAgaWYgKChzdGFydCB8IGVuZCB8IGNvbnRleHRTdGFydCB8IGNvbnRleHRFbmQgfCBhZHZhbmNlc0luZGV4IHwgKGVuZCAtIHN0YXJ0KQorICAgICAgICAgICAgICAgIHwgKHN0YXJ0IC0gY29udGV4dFN0YXJ0KSB8IChjb250ZXh0RW5kIC0gZW5kKQorICAgICAgICAgICAgICAgIHwgKHRleHQubGVuZ3RoKCkgLSBjb250ZXh0RW5kKQorICAgICAgICAgICAgICAgIHwgKGFkdmFuY2VzID09IG51bGwgPyAwIDoKKyAgICAgICAgICAgICAgICAgICAgKGFkdmFuY2VzLmxlbmd0aCAtIGFkdmFuY2VzSW5kZXggLSAoZW5kIC0gc3RhcnQpKSkpIDwgMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZmxhZ3MgIT0gRElSRUNUSU9OX0xUUiAmJiBmbGFncyAhPSBESVJFQ1RJT05fUlRMKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ1bmtub3duIGZsYWdzIHZhbHVlOiAiICsgZmxhZ3MpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFtSGFzQ29tcGF0U2NhbGluZykgeworICAgICAgICAgICAgcmV0dXJuIG5hdGl2ZV9nZXRUZXh0UnVuQWR2YW5jZXMobU5hdGl2ZVBhaW50LCB0ZXh0LCBzdGFydCwgZW5kLAorICAgICAgICAgICAgICAgICAgICBjb250ZXh0U3RhcnQsIGNvbnRleHRFbmQsIGZsYWdzLCBhZHZhbmNlcywgYWR2YW5jZXNJbmRleCk7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBmbG9hdCBvbGRTaXplID0gZ2V0VGV4dFNpemUoKTsKKyAgICAgICAgc2V0VGV4dFNpemUob2xkU2l6ZSAqIG1Db21wYXRTY2FsaW5nKTsKKyAgICAgICAgZmxvYXQgdG90YWxBZHZhbmNlID0gbmF0aXZlX2dldFRleHRSdW5BZHZhbmNlcyhtTmF0aXZlUGFpbnQsIHRleHQsIHN0YXJ0LCBlbmQsCisgICAgICAgICAgICAgICAgY29udGV4dFN0YXJ0LCBjb250ZXh0RW5kLCBmbGFncywgYWR2YW5jZXMsIGFkdmFuY2VzSW5kZXgpOworICAgICAgICBzZXRUZXh0U2l6ZShvbGRTaXplKTsKKworICAgICAgICBpZiAoYWR2YW5jZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IGFkdmFuY2VzSW5kZXgsIGUgPSBpICsgKGVuZCAtIHN0YXJ0KTsgaSA8IGU7IGkrKykgeworICAgICAgICAgICAgICAgIGFkdmFuY2VzW2ldICo9IG1JbnZDb21wYXRTY2FsaW5nOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0b3RhbEFkdmFuY2UgKiBtSW52Q29tcGF0U2NhbGluZzsgLy8gYXNzdW1lIGVycm9ycyBhcmUgaW5zaWduaWZpY2FudAorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG5leHQgY3Vyc29yIHBvc2l0aW9uIGluIHRoZSBydW4uICBUaGlzIGF2b2lkcyBwbGFjaW5nIHRoZQorICAgICAqIGN1cnNvciBiZXR3ZWVuIHN1cnJvZ2F0ZXMsIGJldHdlZW4gY2hhcmFjdGVycyB0aGF0IGZvcm0gY29uanVuY3RzLAorICAgICAqIGJldHdlZW4gYmFzZSBjaGFyYWN0ZXJzIGFuZCBjb21iaW5pbmcgbWFya3MsIG9yIHdpdGhpbiBhIHJlb3JkZXJpbmcKKyAgICAgKiBjbHVzdGVyLgorICAgICAqCisgICAgICogPHA+Q29udGV4dFN0YXJ0IGFuZCBvZmZzZXQgYXJlIHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZiB0ZXh0LgorICAgICAqIFRoZSBjb250ZXh0IGlzIHRoZSBzaGFwaW5nIGNvbnRleHQgZm9yIGN1cnNvciBtb3ZlbWVudCwgZ2VuZXJhbGx5CisgICAgICogdGhlIGJvdW5kcyBvZiB0aGUgbWV0cmljIHNwYW4gZW5jbG9zaW5nIHRoZSBjdXJzb3IgaW4gdGhlIGRpcmVjdGlvbiBvZgorICAgICAqIG1vdmVtZW50LgorICAgICAqCisgICAgICogPHA+SWYgY3Vyc29yT3B0IGlzIHtAbGluayAjQ1VSU09SX0FUfSBhbmQgdGhlIG9mZnNldCBpcyBub3QgYSB2YWxpZAorICAgICAqIGN1cnNvciBwb3NpdGlvbiwgdGhpcyByZXR1cm5zIC0xLiAgT3RoZXJ3aXNlIHRoaXMgd2lsbCBuZXZlciByZXR1cm4gYQorICAgICAqIHZhbHVlIGJlZm9yZSBjb250ZXh0U3RhcnQgb3IgYWZ0ZXIgY29udGV4dFN0YXJ0ICsgY29udGV4dExlbmd0aC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0ZXh0IHRoZSB0ZXh0CisgICAgICogQHBhcmFtIGNvbnRleHRTdGFydCB0aGUgc3RhcnQgb2YgdGhlIGNvbnRleHQKKyAgICAgKiBAcGFyYW0gY29udGV4dExlbmd0aCB0aGUgbGVuZ3RoIG9mIHRoZSBjb250ZXh0CisgICAgICogQHBhcmFtIGZsYWdzIGVpdGhlciB7QGxpbmsgI0RJUkVDVElPTl9SVEx9IG9yIHtAbGluayAjRElSRUNUSU9OX0xUUn0KKyAgICAgKiBAcGFyYW0gb2Zmc2V0IHRoZSBjdXJzb3IgcG9zaXRpb24gdG8gbW92ZSBmcm9tCisgICAgICogQHBhcmFtIGN1cnNvck9wdCBob3cgdG8gbW92ZSB0aGUgY3Vyc29yLCBvbmUgb2Yge0BsaW5rICNDVVJTT1JfQUZURVJ9LAorICAgICAqIHtAbGluayAjQ1VSU09SX0FUX09SX0FGVEVSfSwge0BsaW5rICNDVVJTT1JfQkVGT1JFfSwKKyAgICAgKiB7QGxpbmsgI0NVUlNPUl9BVF9PUl9CRUZPUkV9LCBvciB7QGxpbmsgI0NVUlNPUl9BVH0KKyAgICAgKiBAcmV0dXJuIHRoZSBvZmZzZXQgb2YgdGhlIG5leHQgcG9zaXRpb24sIG9yIC0xCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFRleHRSdW5DdXJzb3IoY2hhcltdIHRleHQsIGludCBjb250ZXh0U3RhcnQsIGludCBjb250ZXh0TGVuZ3RoLAorICAgICAgICAgICAgaW50IGZsYWdzLCBpbnQgb2Zmc2V0LCBpbnQgY3Vyc29yT3B0KSB7CisgICAgICAgIGludCBjb250ZXh0RW5kID0gY29udGV4dFN0YXJ0ICsgY29udGV4dExlbmd0aDsKKyAgICAgICAgaWYgKCgoY29udGV4dFN0YXJ0IHwgY29udGV4dEVuZCB8IG9mZnNldCB8IChjb250ZXh0RW5kIC0gY29udGV4dFN0YXJ0KQorICAgICAgICAgICAgICAgIHwgKG9mZnNldCAtIGNvbnRleHRTdGFydCkgfCAoY29udGV4dEVuZCAtIG9mZnNldCkKKyAgICAgICAgICAgICAgICB8ICh0ZXh0Lmxlbmd0aCAtIGNvbnRleHRFbmQpIHwgY3Vyc29yT3B0KSA8IDApCisgICAgICAgICAgICAgICAgfHwgY3Vyc29yT3B0ID4gQ1VSU09SX09QVF9NQVhfVkFMVUUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbmF0aXZlX2dldFRleHRSdW5DdXJzb3IobU5hdGl2ZVBhaW50LCB0ZXh0LAorICAgICAgICAgICAgICAgIGNvbnRleHRTdGFydCwgY29udGV4dExlbmd0aCwgZmxhZ3MsIG9mZnNldCwgY3Vyc29yT3B0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBuZXh0IGN1cnNvciBwb3NpdGlvbiBpbiB0aGUgcnVuLiAgVGhpcyBhdm9pZHMgcGxhY2luZyB0aGUKKyAgICAgKiBjdXJzb3IgYmV0d2VlbiBzdXJyb2dhdGVzLCBiZXR3ZWVuIGNoYXJhY3RlcnMgdGhhdCBmb3JtIGNvbmp1bmN0cywKKyAgICAgKiBiZXR3ZWVuIGJhc2UgY2hhcmFjdGVycyBhbmQgY29tYmluaW5nIG1hcmtzLCBvciB3aXRoaW4gYSByZW9yZGVyaW5nCisgICAgICogY2x1c3Rlci4KKyAgICAgKgorICAgICAqIDxwPkNvbnRleHRTdGFydCwgY29udGV4dEVuZCwgYW5kIG9mZnNldCBhcmUgcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mCisgICAgICogdGV4dC4gIFRoZSBjb250ZXh0IGlzIHRoZSBzaGFwaW5nIGNvbnRleHQgZm9yIGN1cnNvciBtb3ZlbWVudCwgZ2VuZXJhbGx5CisgICAgICogdGhlIGJvdW5kcyBvZiB0aGUgbWV0cmljIHNwYW4gZW5jbG9zaW5nIHRoZSBjdXJzb3IgaW4gdGhlIGRpcmVjdGlvbiBvZgorICAgICAqIG1vdmVtZW50LgorICAgICAqCisgICAgICogPHA+SWYgY3Vyc29yT3B0IGlzIHtAbGluayAjQ1VSU09SX0FUfSBhbmQgdGhlIG9mZnNldCBpcyBub3QgYSB2YWxpZAorICAgICAqIGN1cnNvciBwb3NpdGlvbiwgdGhpcyByZXR1cm5zIC0xLiAgT3RoZXJ3aXNlIHRoaXMgd2lsbCBuZXZlciByZXR1cm4gYQorICAgICAqIHZhbHVlIGJlZm9yZSBjb250ZXh0U3RhcnQgb3IgYWZ0ZXIgY29udGV4dEVuZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0ZXh0IHRoZSB0ZXh0CisgICAgICogQHBhcmFtIGNvbnRleHRTdGFydCB0aGUgc3RhcnQgb2YgdGhlIGNvbnRleHQKKyAgICAgKiBAcGFyYW0gY29udGV4dEVuZCB0aGUgZW5kIG9mIHRoZSBjb250ZXh0CisgICAgICogQHBhcmFtIGZsYWdzIGVpdGhlciB7QGxpbmsgI0RJUkVDVElPTl9SVEx9IG9yIHtAbGluayAjRElSRUNUSU9OX0xUUn0KKyAgICAgKiBAcGFyYW0gb2Zmc2V0IHRoZSBjdXJzb3IgcG9zaXRpb24gdG8gbW92ZSBmcm9tCisgICAgICogQHBhcmFtIGN1cnNvck9wdCBob3cgdG8gbW92ZSB0aGUgY3Vyc29yLCBvbmUgb2Yge0BsaW5rICNDVVJTT1JfQUZURVJ9LAorICAgICAqIHtAbGluayAjQ1VSU09SX0FUX09SX0FGVEVSfSwge0BsaW5rICNDVVJTT1JfQkVGT1JFfSwKKyAgICAgKiB7QGxpbmsgI0NVUlNPUl9BVF9PUl9CRUZPUkV9LCBvciB7QGxpbmsgI0NVUlNPUl9BVH0KKyAgICAgKiBAcmV0dXJuIHRoZSBvZmZzZXQgb2YgdGhlIG5leHQgcG9zaXRpb24sIG9yIC0xCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFRleHRSdW5DdXJzb3IoQ2hhclNlcXVlbmNlIHRleHQsIGludCBjb250ZXh0U3RhcnQsCisgICAgICAgICAgIGludCBjb250ZXh0RW5kLCBpbnQgZmxhZ3MsIGludCBvZmZzZXQsIGludCBjdXJzb3JPcHQpIHsKKworICAgICAgICBpZiAodGV4dCBpbnN0YW5jZW9mIFN0cmluZyB8fCB0ZXh0IGluc3RhbmNlb2YgU3Bhbm5lZFN0cmluZyB8fAorICAgICAgICAgICAgICAgIHRleHQgaW5zdGFuY2VvZiBTcGFubmFibGVTdHJpbmcpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRUZXh0UnVuQ3Vyc29yKHRleHQudG9TdHJpbmcoKSwgY29udGV4dFN0YXJ0LCBjb250ZXh0RW5kLAorICAgICAgICAgICAgICAgICAgICBmbGFncywgb2Zmc2V0LCBjdXJzb3JPcHQpOworICAgICAgICB9CisgICAgICAgIGlmICh0ZXh0IGluc3RhbmNlb2YgR3JhcGhpY3NPcGVyYXRpb25zKSB7CisgICAgICAgICAgICByZXR1cm4gKChHcmFwaGljc09wZXJhdGlvbnMpIHRleHQpLmdldFRleHRSdW5DdXJzb3IoCisgICAgICAgICAgICAgICAgICAgIGNvbnRleHRTdGFydCwgY29udGV4dEVuZCwgZmxhZ3MsIG9mZnNldCwgY3Vyc29yT3B0LCB0aGlzKTsKKyAgICAgICAgfQorCisgICAgICAgIGludCBjb250ZXh0TGVuID0gY29udGV4dEVuZCAtIGNvbnRleHRTdGFydDsKKyAgICAgICAgY2hhcltdIGJ1ZiA9IFRlbXBvcmFyeUJ1ZmZlci5vYnRhaW4oY29udGV4dExlbik7CisgICAgICAgIFRleHRVdGlscy5nZXRDaGFycyh0ZXh0LCBjb250ZXh0U3RhcnQsIGNvbnRleHRFbmQsIGJ1ZiwgMCk7CisgICAgICAgIGludCByZXN1bHQgPSBnZXRUZXh0UnVuQ3Vyc29yKGJ1ZiwgMCwgY29udGV4dExlbiwgZmxhZ3MsIG9mZnNldCwgY3Vyc29yT3B0KTsKKyAgICAgICAgVGVtcG9yYXJ5QnVmZmVyLnJlY3ljbGUoYnVmKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBuZXh0IGN1cnNvciBwb3NpdGlvbiBpbiB0aGUgcnVuLiAgVGhpcyBhdm9pZHMgcGxhY2luZyB0aGUKKyAgICAgKiBjdXJzb3IgYmV0d2VlbiBzdXJyb2dhdGVzLCBiZXR3ZWVuIGNoYXJhY3RlcnMgdGhhdCBmb3JtIGNvbmp1bmN0cywKKyAgICAgKiBiZXR3ZWVuIGJhc2UgY2hhcmFjdGVycyBhbmQgY29tYmluaW5nIG1hcmtzLCBvciB3aXRoaW4gYSByZW9yZGVyaW5nCisgICAgICogY2x1c3Rlci4KKyAgICAgKgorICAgICAqIDxwPkNvbnRleHRTdGFydCwgY29udGV4dEVuZCwgYW5kIG9mZnNldCBhcmUgcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mCisgICAgICogdGV4dC4gIFRoZSBjb250ZXh0IGlzIHRoZSBzaGFwaW5nIGNvbnRleHQgZm9yIGN1cnNvciBtb3ZlbWVudCwgZ2VuZXJhbGx5CisgICAgICogdGhlIGJvdW5kcyBvZiB0aGUgbWV0cmljIHNwYW4gZW5jbG9zaW5nIHRoZSBjdXJzb3IgaW4gdGhlIGRpcmVjdGlvbiBvZgorICAgICAqIG1vdmVtZW50LgorICAgICAqCisgICAgICogPHA+SWYgY3Vyc29yT3B0IGlzIHtAbGluayAjQ1VSU09SX0FUfSBhbmQgdGhlIG9mZnNldCBpcyBub3QgYSB2YWxpZAorICAgICAqIGN1cnNvciBwb3NpdGlvbiwgdGhpcyByZXR1cm5zIC0xLiAgT3RoZXJ3aXNlIHRoaXMgd2lsbCBuZXZlciByZXR1cm4gYQorICAgICAqIHZhbHVlIGJlZm9yZSBjb250ZXh0U3RhcnQgb3IgYWZ0ZXIgY29udGV4dEVuZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0ZXh0IHRoZSB0ZXh0CisgICAgICogQHBhcmFtIGNvbnRleHRTdGFydCB0aGUgc3RhcnQgb2YgdGhlIGNvbnRleHQKKyAgICAgKiBAcGFyYW0gY29udGV4dEVuZCB0aGUgZW5kIG9mIHRoZSBjb250ZXh0CisgICAgICogQHBhcmFtIGZsYWdzIGVpdGhlciB7QGxpbmsgI0RJUkVDVElPTl9SVEx9IG9yIHtAbGluayAjRElSRUNUSU9OX0xUUn0KKyAgICAgKiBAcGFyYW0gb2Zmc2V0IHRoZSBjdXJzb3IgcG9zaXRpb24gdG8gbW92ZSBmcm9tCisgICAgICogQHBhcmFtIGN1cnNvck9wdCBob3cgdG8gbW92ZSB0aGUgY3Vyc29yLCBvbmUgb2Yge0BsaW5rICNDVVJTT1JfQUZURVJ9LAorICAgICAqIHtAbGluayAjQ1VSU09SX0FUX09SX0FGVEVSfSwge0BsaW5rICNDVVJTT1JfQkVGT1JFfSwKKyAgICAgKiB7QGxpbmsgI0NVUlNPUl9BVF9PUl9CRUZPUkV9LCBvciB7QGxpbmsgI0NVUlNPUl9BVH0KKyAgICAgKiBAcmV0dXJuIHRoZSBvZmZzZXQgb2YgdGhlIG5leHQgcG9zaXRpb24sIG9yIC0xCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFRleHRSdW5DdXJzb3IoU3RyaW5nIHRleHQsIGludCBjb250ZXh0U3RhcnQsIGludCBjb250ZXh0RW5kLAorICAgICAgICAgICAgaW50IGZsYWdzLCBpbnQgb2Zmc2V0LCBpbnQgY3Vyc29yT3B0KSB7CisgICAgICAgIGlmICgoKGNvbnRleHRTdGFydCB8IGNvbnRleHRFbmQgfCBvZmZzZXQgfCAoY29udGV4dEVuZCAtIGNvbnRleHRTdGFydCkKKyAgICAgICAgICAgICAgICB8IChvZmZzZXQgLSBjb250ZXh0U3RhcnQpIHwgKGNvbnRleHRFbmQgLSBvZmZzZXQpCisgICAgICAgICAgICAgICAgfCAodGV4dC5sZW5ndGgoKSAtIGNvbnRleHRFbmQpIHwgY3Vyc29yT3B0KSA8IDApCisgICAgICAgICAgICAgICAgfHwgY3Vyc29yT3B0ID4gQ1VSU09SX09QVF9NQVhfVkFMVUUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbmF0aXZlX2dldFRleHRSdW5DdXJzb3IobU5hdGl2ZVBhaW50LCB0ZXh0LAorICAgICAgICAgICAgICAgIGNvbnRleHRTdGFydCwgY29udGV4dEVuZCwgZmxhZ3MsIG9mZnNldCwgY3Vyc29yT3B0KTsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBSZXR1cm4gdGhlIHBhdGggKG91dGxpbmUpIGZvciB0aGUgc3BlY2lmaWVkIHRleHQuCiAgICAgICogTm90ZToganVzdCBsaWtlIENhbnZhcy5kcmF3VGV4dCwgdGhpcyB3aWxsIHJlc3BlY3QgdGhlIEFsaWduIHNldHRpbmcgaW4KICAgICAgKiB0aGUgcGFpbnQuCkBAIC0xNDA0LDYgKzE4MjMsMTkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyW10gdGV4dCwgaW50IGluZGV4LCBpbnQgY291bnQsIGZsb2F0W10gd2lkdGhzKTsKICAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgaW50IG5hdGl2ZV9nZXRUZXh0V2lkdGhzKGludCBuYXRpdmVfb2JqZWN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB0ZXh0LCBpbnQgc3RhcnQsIGludCBlbmQsIGZsb2F0W10gd2lkdGhzKTsKKworICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBmbG9hdCBuYXRpdmVfZ2V0VGV4dFJ1bkFkdmFuY2VzKGludCBuYXRpdmVfb2JqZWN0LAorICAgICAgICAgICAgY2hhcltdIHRleHQsIGludCBpbmRleCwgaW50IGNvdW50LCBpbnQgY29udGV4dEluZGV4LCBpbnQgY29udGV4dENvdW50LAorICAgICAgICAgICAgaW50IGZsYWdzLCBmbG9hdFtdIGFkdmFuY2VzLCBpbnQgYWR2YW5jZXNJbmRleCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGZsb2F0IG5hdGl2ZV9nZXRUZXh0UnVuQWR2YW5jZXMoaW50IG5hdGl2ZV9vYmplY3QsCisgICAgICAgICAgICBTdHJpbmcgdGV4dCwgaW50IHN0YXJ0LCBpbnQgZW5kLCBpbnQgY29udGV4dFN0YXJ0LCBpbnQgY29udGV4dEVuZCwKKyAgICAgICAgICAgIGludCBmbGFncywgZmxvYXRbXSBhZHZhbmNlcywgaW50IGFkdmFuY2VzSW5kZXgpOworCisgICAgcHJpdmF0ZSBuYXRpdmUgaW50IG5hdGl2ZV9nZXRUZXh0UnVuQ3Vyc29yKGludCBuYXRpdmVfb2JqZWN0LCBjaGFyW10gdGV4dCwKKyAgICAgICAgICAgIGludCBjb250ZXh0U3RhcnQsIGludCBjb250ZXh0TGVuZ3RoLCBpbnQgZmxhZ3MsIGludCBvZmZzZXQsIGludCBjdXJzb3JPcHQpOworICAgIHByaXZhdGUgbmF0aXZlIGludCBuYXRpdmVfZ2V0VGV4dFJ1bkN1cnNvcihpbnQgbmF0aXZlX29iamVjdCwgU3RyaW5nIHRleHQsCisgICAgICAgICAgICBpbnQgY29udGV4dFN0YXJ0LCBpbnQgY29udGV4dEVuZCwgaW50IGZsYWdzLCBpbnQgb2Zmc2V0LCBpbnQgY3Vyc29yT3B0KTsKKwogICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIG5hdGl2ZV9nZXRUZXh0UGF0aChpbnQgbmF0aXZlX29iamVjdCwKICAgICAgICAgICAgICAgICBjaGFyW10gdGV4dCwgaW50IGluZGV4LCBpbnQgY291bnQsIGZsb2F0IHgsIGZsb2F0IHksIGludCBwYXRoKTsKICAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBuYXRpdmVfZ2V0VGV4dFBhdGgoaW50IG5hdGl2ZV9vYmplY3QsCkBAIC0xNDE0LDQgKzE4NDYsMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyW10gdGV4dCwgaW50IGluZGV4LCBpbnQgY291bnQsIFJlY3QgYm91bmRzKTsKICAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBmaW5hbGl6ZXIoaW50IG5hdGl2ZVBhaW50KTsKIH0KLQpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL1BvcnRlckR1ZmYuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9Qb3J0ZXJEdWZmLmphdmEKaW5kZXggMzkwNDIzNC4uMmVmMTY2MiAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL1BvcnRlckR1ZmYuamF2YQorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvUG9ydGVyRHVmZi5qYXZhCkBAIC01MywxMSArNTMsMTggQEAKICAgICAgICAgLyoqIFtTYSAqIERhLCBTYyAqIERjXSAqLwogICAgICAgICBNVUxUSVBMWSAgICAoMTQpLAogICAgICAgICAvKiogW1NhICsgRGEgLSBTYSAqIERhLCBTYyArIERjIC0gU2MgKiBEY10gKi8KLSAgICAgICAgU0NSRUVOICAgICAgKDE1KTsKKyAgICAgICAgU0NSRUVOICAgICAgKDE1KSwKKyAgICAgICAgLyoqIFNhdHVyYXRlKFMgKyBEKSAqLworICAgICAgICBBREQgICAgICAgICAoMTYpLAorICAgICAgICBPVkVSTEFZICAgICAoMTcpOwogCiAgICAgICAgIE1vZGUoaW50IG5hdGl2ZUludCkgewogICAgICAgICAgICAgdGhpcy5uYXRpdmVJbnQgPSBuYXRpdmVJbnQ7CiAgICAgICAgIH0KLSAgICAgICAgZmluYWwgaW50IG5hdGl2ZUludDsKKworICAgICAgICAvKioKKyAgICAgICAgICogQGhpZGUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBmaW5hbCBpbnQgbmF0aXZlSW50OwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9EcmF3YWJsZS5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL0RyYXdhYmxlLmphdmEKaW5kZXggNmE3YjJkMS4uNGMxZDI0MyAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL0RyYXdhYmxlLmphdmEKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL0RyYXdhYmxlLmphdmEKQEAgLTE2LDIxICsxNiwzMCBAQAogCiBwYWNrYWdlIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGU7CiAKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQogaW1wb3J0IG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXI7CiBpbXBvcnQgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjsKIAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuVHlwZWRBcnJheTsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLio7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXBGYWN0b3J5OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ29sb3JGaWx0ZXI7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5OaW5lUGF0Y2g7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QaXhlbEZvcm1hdDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBvcnRlckR1ZmY7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Qb3J0ZXJEdWZmQ29sb3JGaWx0ZXI7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVnaW9uOwogaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkRpc3BsYXlNZXRyaWNzOwogaW1wb3J0IGFuZHJvaWQudXRpbC5TdGF0ZVNldDsKLWltcG9ydCBhbmRyb2lkLnV0aWwuWG1sOwogaW1wb3J0IGFuZHJvaWQudXRpbC5UeXBlZFZhbHVlOworaW1wb3J0IGFuZHJvaWQudXRpbC5YbWw7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKIAogLyoqCiAgKiBBIERyYXdhYmxlIGlzIGEgZ2VuZXJhbCBhYnN0cmFjdGlvbiBmb3IgInNvbWV0aGluZyB0aGF0IGNhbiBiZSBkcmF3bi4iICBNb3N0CkBAIC02NDUsNiArNjU0LDggQEAKICAgICAgKiBDYWxsaW5nIHRoaXMgbWV0aG9kIG9uIGEgbXV0YWJsZSBEcmF3YWJsZSB3aWxsIGhhdmUgbm8gZWZmZWN0LgogICAgICAqCiAgICAgICogQHJldHVybiBUaGlzIGRyYXdhYmxlLgorICAgICAqIEBzZWUgQ29uc3RhbnRTdGF0ZQorICAgICAqIEBzZWUgI2dldENvbnN0YW50U3RhdGUoKQogICAgICAqLwogICAgIHB1YmxpYyBEcmF3YWJsZSBtdXRhdGUoKSB7CiAgICAgICAgIHJldHVybiB0aGlzOwpAQCAtNzUwLDYgKzc2MSw4IEBACiAgICAgICAgICAgICBkcmF3YWJsZSA9IG5ldyBTdGF0ZUxpc3REcmF3YWJsZSgpOwogICAgICAgICB9IGVsc2UgaWYgKG5hbWUuZXF1YWxzKCJsZXZlbC1saXN0IikpIHsKICAgICAgICAgICAgIGRyYXdhYmxlID0gbmV3IExldmVsTGlzdERyYXdhYmxlKCk7CisgICAgICAgIH0gZWxzZSBpZiAobmFtZS5lcXVhbHMoIm1pcG1hcCIpKSB7CisgICAgICAgICAgICBkcmF3YWJsZSA9IG5ldyBNaXBtYXBEcmF3YWJsZSgpOwogICAgICAgICB9IGVsc2UgaWYgKG5hbWUuZXF1YWxzKCJsYXllci1saXN0IikpIHsKICAgICAgICAgICAgIGRyYXdhYmxlID0gbmV3IExheWVyRHJhd2FibGUoKTsKICAgICAgICAgfSBlbHNlIGlmIChuYW1lLmVxdWFscygidHJhbnNpdGlvbiIpKSB7CkBAIC03NzEsNyArNzg0LDcgQEAKICAgICAgICAgfSBlbHNlIGlmIChuYW1lLmVxdWFscygiaW5zZXQiKSkgewogICAgICAgICAgICAgZHJhd2FibGUgPSBuZXcgSW5zZXREcmF3YWJsZSgpOwogICAgICAgICB9IGVsc2UgaWYgKG5hbWUuZXF1YWxzKCJiaXRtYXAiKSkgewotICAgICAgICAgICAgZHJhd2FibGUgPSBuZXcgQml0bWFwRHJhd2FibGUoKTsKKyAgICAgICAgICAgIGRyYXdhYmxlID0gbmV3IEJpdG1hcERyYXdhYmxlKHIpOwogICAgICAgICAgICAgaWYgKHIgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgKChCaXRtYXBEcmF3YWJsZSkgZHJhd2FibGUpLnNldFRhcmdldERlbnNpdHkoci5nZXREaXNwbGF5TWV0cmljcygpKTsKICAgICAgICAgICAgIH0KQEAgLTgwNiw2ICs4MTksOSBAQAogICAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBJbmZsYXRlIHRoaXMgRHJhd2FibGUgZnJvbSBhbiBYTUwgcmVzb3VyY2UuCisgICAgICovCiAgICAgcHVibGljIHZvaWQgaW5mbGF0ZShSZXNvdXJjZXMgciwgWG1sUHVsbFBhcnNlciBwYXJzZXIsIEF0dHJpYnV0ZVNldCBhdHRycykKICAgICAgICAgICAgIHRocm93cyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CiAKQEAgLTgxNCw2ICs4MzAsMTIgQEAKICAgICAgICAgYS5yZWN5Y2xlKCk7CiAgICAgfQogCisgICAgLyoqCisgICAgICogSW5mbGF0ZSBhIERyYXdhYmxlIGZyb20gYW4gWE1MIHJlc291cmNlLgorICAgICAqCisgICAgICogQHRocm93cyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqLwogICAgIHZvaWQgaW5mbGF0ZVdpdGhBdHRyaWJ1dGVzKFJlc291cmNlcyByLCBYbWxQdWxsUGFyc2VyIHBhcnNlciwKICAgICAgICAgICAgIFR5cGVkQXJyYXkgYXR0cnMsIGludCB2aXNpYmxlQXR0cikKICAgICAgICAgICAgIHRocm93cyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CkBAIC04MjEsMTIgKzg0MywyNyBAQAogICAgICAgICBtVmlzaWJsZSA9IGF0dHJzLmdldEJvb2xlYW4odmlzaWJsZUF0dHIsIG1WaXNpYmxlKTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBUaGlzIGFic3RyYWN0IGNsYXNzIGlzIHVzZWQgYnkge0BsaW5rIERyYXdhYmxlfXMgdG8gc3RvcmUgc2hhcmVkIGNvbnN0YW50IHN0YXRlIGFuZCBkYXRhCisgICAgICogYmV0d2VlbiBEcmF3YWJsZXMuIHtAbGluayBCaXRtYXBEcmF3YWJsZX1zIGNyZWF0ZWQgZnJvbSB0aGUgc2FtZSByZXNvdXJjZSB3aWxsIGZvciBpbnN0YW5jZQorICAgICAqIHNoYXJlIGEgdW5pcXVlIGJpdG1hcCBzdG9yZWQgaW4gdGhlaXIgQ29uc3RhbnRTdGF0ZS4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIHtAbGluayAjbmV3RHJhd2FibGUoUmVzb3VyY2VzKX0gY2FuIGJlIHVzZWQgYXMgYSBmYWN0b3J5IHRvIGNyZWF0ZSBuZXcgRHJhd2FibGUgaW5zdGFuY2VzCisgICAgICogZnJvbSB0aGlzIENvbnN0YW50U3RhdGUuCisgICAgICogPC9wPgorICAgICAqCisgICAgICogVXNlIHtAbGluayBEcmF3YWJsZSNnZXRDb25zdGFudFN0YXRlKCl9IHRvIHJldHJpZXZlIHRoZSBDb25zdGFudFN0YXRlIG9mIGEgRHJhd2FibGUuIENhbGxpbmcKKyAgICAgKiB7QGxpbmsgRHJhd2FibGUjbXV0YXRlKCl9IG9uIGEgRHJhd2FibGUgc2hvdWxkIHR5cGljYWxseSBjcmVhdGUgYSBuZXcgQ29uc3RhbnRTdGF0ZSBmb3IgdGhhdAorICAgICAqIERyYXdhYmxlLgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgQ29uc3RhbnRTdGF0ZSB7CiAgICAgICAgIC8qKgogICAgICAgICAgKiBDcmVhdGUgYSBuZXcgZHJhd2FibGUgd2l0aG91dCBzdXBwbHlpbmcgcmVzb3VyY2VzIHRoZSBjYWxsZXIKICAgICAgICAgICogaXMgcnVubmluZyBpbi4gIE5vdGUgdGhhdCB1c2luZyB0aGlzIG1lYW5zIHRoZSBkZW5zaXR5LWRlcGVuZGVudAogICAgICAgICAgKiBkcmF3YWJsZXMgKGxpa2UgYml0bWFwcykgd2lsbCBub3QgYmUgYWJsZSB0byB1cGRhdGUgdGhlaXIgdGFyZ2V0Ci0gICAgICAgICAqIGRlbnNpdHkgY29ycmVjdGx5LgorICAgICAgICAgKiBkZW5zaXR5IGNvcnJlY3RseS4gT25lIHNob3VsZCB1c2Uge0BsaW5rICNuZXdEcmF3YWJsZShSZXNvdXJjZXMpfQorICAgICAgICAgKiBpbnN0ZWFkIHRvIHByb3ZpZGUgYSByZXNvdXJjZS4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBEcmF3YWJsZSBuZXdEcmF3YWJsZSgpOwogICAgICAgICAvKioKQEAgLTg0NSw2ICs4ODIsMTMgQEAKICAgICAgICAgcHVibGljIGFic3RyYWN0IGludCBnZXRDaGFuZ2luZ0NvbmZpZ3VyYXRpb25zKCk7CiAgICAgfQogCisgICAgLyoqCisgICAgICogUmV0dXJuIGEge0BsaW5rIENvbnN0YW50U3RhdGV9IGluc3RhbmNlIHRoYXQgaG9sZHMgdGhlIHNoYXJlZCBzdGF0ZSBvZiB0aGlzIERyYXdhYmxlLgorICAgICAqcQorICAgICAqIEByZXR1cm4gVGhlIENvbnN0YW50U3RhdGUgYXNzb2NpYXRlZCB0byB0aGF0IERyYXdhYmxlLgorICAgICAqIEBzZWUgQ29uc3RhbnRTdGF0ZQorICAgICAqIEBzZWUgRHJhd2FibGUjbXV0YXRlKCkKKyAgICAgKi8KICAgICBwdWJsaWMgQ29uc3RhbnRTdGF0ZSBnZXRDb25zdGFudFN0YXRlKCkgewogICAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvRHJhd2FibGVDb250YWluZXIuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9EcmF3YWJsZUNvbnRhaW5lci5qYXZhCmluZGV4IGM2ZjU3ZDQuLjEyNGQ5MDcgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9EcmF3YWJsZUNvbnRhaW5lci5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9EcmF3YWJsZUNvbnRhaW5lci5qYXZhCkBAIC0xNyw4ICsxNywxNiBAQAogcGFja2FnZSBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlOwogCiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy4qOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ29sb3JGaWx0ZXI7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QaXhlbEZvcm1hdDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7CiAKKy8qKgorICogQSBoZWxwZXIgY2xhc3MgdGhhdCBjb250YWlucyBzZXZlcmFsIHtAbGluayBEcmF3YWJsZX1zIGFuZCBzZWxlY3RzIHdoaWNoIG9uZSB0byB1c2UuCisgKgorICogWW91IGNhbiBzdWJjbGFzcyBpdCB0byBjcmVhdGUgeW91ciBvd24gRHJhd2FibGVDb250YWluZXJzIG9yIGRpcmVjdGx5IHVzZSBvbmUgaXRzIGNoaWxkIGNsYXNzZXMuCisgKi8KIHB1YmxpYyBjbGFzcyBEcmF3YWJsZUNvbnRhaW5lciBleHRlbmRzIERyYXdhYmxlIGltcGxlbWVudHMgRHJhd2FibGUuQ2FsbGJhY2sgewogCiAgICAgLyoqCkBAIC0xOTYsOCArMjA0LDcgQEAKICAgICAgICAgICAgICAgICBtRHJhd2FibGVDb250YWluZXJTdGF0ZS5nZXRPcGFjaXR5KCk7CiAgICAgfQogCi0gICAgcHVibGljIGJvb2xlYW4gc2VsZWN0RHJhd2FibGUoaW50IGlkeCkKLSAgICB7CisgICAgcHVibGljIGJvb2xlYW4gc2VsZWN0RHJhd2FibGUoaW50IGlkeCkgewogICAgICAgICBpZiAoaWR4ID09IG1DdXJJbmRleCkgewogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CkBAIC0yNTUsNiArMjYyLDEyIEBACiAgICAgICAgIHJldHVybiB0aGlzOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIEEgQ29uc3RhbnRTdGF0ZSB0aGF0IGNhbiBjb250YWluIHNldmVyYWwge0BsaW5rIERyYXdhYmxlfXMuCisgICAgICoKKyAgICAgKiBUaGlzIGNsYXNzIHdhcyBtYWRlIHB1YmxpYyB0byBlbmFibGUgdGVzdGluZywgYW5kIGl0cyB2aXNpYmlsaXR5IG1heSBjaGFuZ2UgaW4gYSBmdXR1cmUKKyAgICAgKiByZWxlYXNlLgorICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBzdGF0aWMgY2xhc3MgRHJhd2FibGVDb250YWluZXJTdGF0ZSBleHRlbmRzIENvbnN0YW50U3RhdGUgewogICAgICAgICBmaW5hbCBEcmF3YWJsZUNvbnRhaW5lciBtT3duZXI7CiAKQEAgLTQ0MywxMiArNDU2LDEyIEBACiAgICAgICAgICAgICByZXR1cm4gbUNvbnN0YW50TWluaW11bUhlaWdodDsKICAgICAgICAgfQogCi0gICAgICAgIHByaXZhdGUgdm9pZCBjb21wdXRlQ29uc3RhbnRTaXplKCkgeworICAgICAgICBwcm90ZWN0ZWQgdm9pZCBjb21wdXRlQ29uc3RhbnRTaXplKCkgewogICAgICAgICAgICAgbUNvbXB1dGVkQ29uc3RhbnRTaXplID0gdHJ1ZTsKIAogICAgICAgICAgICAgZmluYWwgaW50IE4gPSBnZXRDaGlsZENvdW50KCk7CiAgICAgICAgICAgICBmaW5hbCBEcmF3YWJsZVtdIGRyYXdhYmxlcyA9IG1EcmF3YWJsZXM7Ci0gICAgICAgICAgICBtQ29uc3RhbnRXaWR0aCA9IG1Db25zdGFudEhlaWdodCA9IDA7CisgICAgICAgICAgICBtQ29uc3RhbnRXaWR0aCA9IG1Db25zdGFudEhlaWdodCA9IC0xOwogICAgICAgICAgICAgbUNvbnN0YW50TWluaW11bVdpZHRoID0gbUNvbnN0YW50TWluaW11bUhlaWdodCA9IDA7CiAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE47IGkrKykgewogICAgICAgICAgICAgICAgIERyYXdhYmxlIGRyID0gZHJhd2FibGVzW2ldOwpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL0xheWVyRHJhd2FibGUuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9MYXllckRyYXdhYmxlLmphdmEKaW5kZXggMzg5ZmQ0MC4uYjcyN2Q0NyAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL0xheWVyRHJhd2FibGUuamF2YQorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvTGF5ZXJEcmF3YWJsZS5qYXZhCkBAIC0yNjUsNiArMjY1LDcgQEAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBzZXREcmF3YWJsZUJ5TGF5ZXJJZChpbnQgaWQsIERyYXdhYmxlIGRyYXdhYmxlKSB7CiAgICAgICAgIGZpbmFsIENoaWxkRHJhd2FibGVbXSBsYXllcnMgPSBtTGF5ZXJTdGF0ZS5tQ2hpbGRyZW47CisgICAgICAgIGRyYXdhYmxlLnNldENhbGxiYWNrKHRoaXMpOwogICAgICAgICAKICAgICAgICAgZm9yIChpbnQgaSA9IG1MYXllclN0YXRlLm1OdW0gLSAxOyBpID49IDA7IGktLSkgewogICAgICAgICAgICAgaWYgKGxheWVyc1tpXS5tSWQgPT0gaWQpIHsKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9NaXBtYXBEcmF3YWJsZS5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL01pcG1hcERyYXdhYmxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzVmZGVlZAotLS0gL2Rldi9udWxsCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9NaXBtYXBEcmF3YWJsZS5qYXZhCkBAIC0wLDAgKzEsMzA5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlOworCitpbXBvcnQgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlcjsKK2ltcG9ydCBvcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyRXhjZXB0aW9uOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5UeXBlZEFycmF5OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworLyoqCisgKiBBIHJlc291cmNlIHRoYXQgbWFuYWdlcyBhIG51bWJlciBvZiBhbHRlcm5hdGUgRHJhd2FibGVzLCBhbmQgd2hpY2ggYWN0dWFsbHkgZHJhd3MgdGhlIG9uZSB3aGljaAorICogc2l6ZSBtYXRjaGVzIHRoZSBtb3N0IGNsb3NlbHkgdGhlIGRyYXdpbmcgYm91bmRzLiBQcm92aWRpbmcgc2V2ZXJhbCBwcmUtc2NhbGVkIHZlcnNpb24gb2YgdGhlCisgKiBkcmF3YWJsZSBoZWxwcyBtaW5pbWl6aW5nIHRoZSBhbGlhc2luZyBhcnRpZmFjdHMgdGhhdCBjYW4gYmUgaW50cm9kdWNlZCBieSB0aGUgc2NhbGluZy4KKyAqCisgKiA8cD4KKyAqIFVzZSB7QGxpbmsgI2FkZERyYXdhYmxlKERyYXdhYmxlKX0gdG8gZGVmaW5lIHRoZSBkaWZmZXJlbnQgRHJhd2FibGVzIHRoYXQgd2lsbCByZXByZXNlbnQgdGhlCisgKiBtaXBtYXAgbGV2ZWxzIG9mIHRoaXMgTWlwbWFwRHJhd2FibGUuIFRoZSBtaXBtYXAgRHJhd2FibGUgdGhhdCB3aWxsIGFjdHVhbGx5IGJlIHVzZWQgd2hlbiB0aGlzCisgKiBNaXBtYXBEcmF3YWJsZSBpcyBkcmF3biBpcyB0aGUgb25lIHdoaWNoIGhhcyB0aGUgc21hbGxlc3QgaW50cmluc2ljIGhlaWdodCBncmVhdGVyIG9yIGVxdWFsIHRoYW4KKyAqIHRoZSBib3VuZHMnIGhlaWdodC4gVGhpcyBzZWxlY3Rpb24gZW5zdXJlcyB0aGF0IHRoZSBiZXN0IGF2YWlsYWJsZSBtaXBtYXAgbGV2ZWwgaXMgc2NhbGVkIGRvd24gdG8KKyAqIGRyYXcgdGhpcyBNaXBtYXBEcmF3YWJsZS4KKyAqIDwvcD4KKyAqCisgKiBJZiB0aGUgYm91bmRzJyBoZWlnaHQgaXMgbGFyZ2VyIHRoYW4gdGhlIGxhcmdlc3QgbWlwbWFwLCB0aGUgbGFyZ2VzdCBtaXBtYXAgd2lsbCBiZSBzY2FsZWQgdXAuCisgKiBOb3RlIHRoYXQgRHJhd2FibGVzIHdpdGhvdXQgaW50cmluc2ljIGhlaWdodCAoaS5lLiB3aXRoIGEgbmVnYXRpdmUgdmFsdWUsIHN1Y2ggYXMgQ29sb3IpIHdpbGwKKyAqIG9ubHkgYmUgdXNlZCBpZiBubyBvdGhlciBtaXBtYXAgRHJhd2FibGUgYXJlIHByb3ZpZGVkLiBUaGUgRHJhd2FibGVzJyBpbnRyaW5zaWMgaGVpZ2h0cyBzaG91bGQKKyAqIG5vdCBiZSBjaGFuZ2VkIGFmdGVyIHRoZSBEcmF3YWJsZSBoYXMgYmVlbiBhZGRlZCB0byB0aGlzIE1pcG1hcERyYXdhYmxlLgorICoKKyAqIDxwPgorICogVGhlIGRpZmZlcmVudCBtaXBtYXBzJyBwYXJhbWV0ZXJzIChvcGFjaXR5LCBwYWRkaW5nLCBjb2xvciBmaWx0ZXIsIGdyYXZpdHkuLi4pIHNob3VsZCB0eXBpY2FsbHkKKyAqIGJlIHNpbWlsYXIgdG8gZW5zdXJlIGEgY29udGludW91cyB2aXN1YWwgYXBwZWFyYW5jZSB3aGVuIHRoZSBNaXBtYXBEcmF3YWJsZSBpcyBzY2FsZWQuIFRoZSBhc3BlY3QKKyAqIHJhdGlvIG9mIHRoZSBkaWZmZXJlbnQgbWlwbWFwcyBzaG91bGQgZXNwZWNpYWxseSBiZSBlcXVhbC4KKyAqIDwvcD4KKyAqCisgKiBBIHR5cGljYWwgZXhhbXBsZSB1c2Ugb2YgYSBNaXBtYXBEcmF3YWJsZSB3b3VsZCBiZSBmb3IgYW4gaW1hZ2Ugd2hpY2ggaXMgaW50ZW5kZWQgdG8gYmUgc2NhbGVkIGF0CisgKiB2YXJpb3VzIHNpemVzLCBhbmQgZm9yIHdoaWNoIG9uZSB3YW50cyB0byBwcm92aWRlIHByZS1zY2FsZWQgdmVyc2lvbnMgdG8gcHJlY2lzZWx5IGNvbnRyb2wgaXRzCisgKiBhcHBlYXJhbmNlLgorICoKKyAqIDxwPgorICogVGhlIGludHJpbnNpYyBzaXplIG9mIGEgTWlwbWFwRHJhd2FibGUgYXJlIGluZmVycmVkIGZyb20gdGhvc2Ugb2YgdGhlIGxhcmdlc3QgbWlwbWFwIChpbiB0ZXJtcyBvZgorICoge0BsaW5rIERyYXdhYmxlI2dldEludHJpbnNpY0hlaWdodCgpfSkuIE9uIHRoZSBvcHBvc2l0ZSwgaXRzIG1pbmltdW0KKyAqIHNpemUgaXMgZGVmaW5lZCBieSB0aGUgc21hbGxlc3QgcHJvdmlkZWQgbWlwbWFwLgorICogPC9wPgorCisgKiBJdCBjYW4gYmUgZGVmaW5lZCBpbiBhbiBYTUwgZmlsZSB3aXRoIHRoZSA8Y29kZT4mbHQ7bWlwbWFwPjwvY29kZT4gZWxlbWVudC4KKyAqIEVhY2ggbWlwbWFwIERyYXdhYmxlIGlzIGRlZmluZWQgaW4gYSBuZXN0ZWQgPGNvZGU+Jmx0O2l0ZW0+PC9jb2RlPi4gRm9yIGV4YW1wbGU6CisgKiA8cHJlPgorICogJmx0O21pcG1hcCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorICogICZsdDtpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9teV9pbWFnZV84IiAvPgorICogICZsdDtpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9teV9pbWFnZV8zMiIgLz4KKyAqICAmbHQ7aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvbXlfaW1hZ2VfMTI4IiAvPgorICogJmx0Oy9taXBtYXA+CisgKjwvcHJlPgorICogPHA+CisgKiBXaXRoIHRoaXMgWE1MIHNhdmVkIGludG8gdGhlIHJlcy9kcmF3YWJsZS8gZm9sZGVyIG9mIHRoZSBwcm9qZWN0LCBpdCBjYW4gYmUgcmVmZXJlbmNlZCBhcworICogdGhlIGRyYXdhYmxlIGZvciBhbiB7QGxpbmsgYW5kcm9pZC53aWRnZXQuSW1hZ2VWaWV3fS4gQXNzdW1pbmcgdGhhdCB0aGUgaGVpZ2h0cyBvZiB0aGUgcHJvdmlkZWQKKyAqIGRyYXdhYmxlcyBhcmUgcmVzcGVjdGl2ZWx5IDgsIDMyIGFuZCAxMjggcGl4ZWxzLCB0aGUgZmlyc3Qgb25lIHdpbGwgYmUgc2NhbGVkIGRvd24gd2hlbiB0aGUKKyAqIGJvdW5kcycgaGVpZ2h0IGlzIGxvd2VyIG9yIGVxdWFsIHRoYW4gOCBwaXhlbHMuIFRoZSBzZWNvbmQgZHJhd2FibGUgd2lsbCB0aGVuIGJlIHVzZWQgdXAgdG8gYQorICogaGVpZ2h0IG9mIDMyIHBpeGVscyBhbmQgdGhlIGxhcmdlc3QgZHJhd2FibGUgd2lsbCBiZSB1c2VkIGZvciBncmVhdGVyIGhlaWdodHMuCisgKiA8L3A+CisgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNNaXBtYXBEcmF3YWJsZUl0ZW1fZHJhd2FibGUKKyAqLworcHVibGljIGNsYXNzIE1pcG1hcERyYXdhYmxlIGV4dGVuZHMgRHJhd2FibGVDb250YWluZXIgeworICAgIHByaXZhdGUgZmluYWwgTWlwbWFwQ29udGFpbmVyU3RhdGUgbU1pcG1hcENvbnRhaW5lclN0YXRlOworICAgIHByaXZhdGUgYm9vbGVhbiBtTXV0YXRlZDsKKworICAgIHB1YmxpYyBNaXBtYXBEcmF3YWJsZSgpIHsKKyAgICAgICAgdGhpcyhudWxsLCBudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGEgRHJhd2FibGUgdG8gdGhlIGxpc3Qgb2YgYXZhaWxhYmxlIG1pcG1hcCBEcmF3YWJsZXMuIFRoZSBEcmF3YWJsZSBhY3R1YWxseSB1c2VkIHdoZW4KKyAgICAgKiB0aGlzIE1pcG1hcERyYXdhYmxlIGlzIGRyYXduIGlzIGRldGVybWluZWQgZnJvbSBpdHMgYm91bmRzLgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgaGFzIG5vIGVmZmVjdCBpZiBkcmF3YWJsZSBpcyBudWxsLgorICAgICAqCisgICAgICogQHBhcmFtIGRyYXdhYmxlIFRoZSBEcmF3YWJsZSB0aGF0IHdpbGwgYmUgYWRkZWQgdG8gbGlzdCBvZiBhdmFpbGFibGUgbWlwbWFwIERyYXdhYmxlcy4KKyAgICAgKi8KKworICAgIHB1YmxpYyB2b2lkIGFkZERyYXdhYmxlKERyYXdhYmxlIGRyYXdhYmxlKSB7CisgICAgICAgIGlmIChkcmF3YWJsZSAhPSBudWxsKSB7CisgICAgICAgICAgICBtTWlwbWFwQ29udGFpbmVyU3RhdGUuYWRkRHJhd2FibGUoZHJhd2FibGUpOworICAgICAgICAgICAgb25EcmF3YWJsZUFkZGVkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgb25EcmF3YWJsZUFkZGVkKCkgeworICAgICAgICAvLyBzZWxlY3REcmF3YWJsZSBhc3N1bWVzIHRoYXQgdGhlIGNvbnRhaW5lciBjb250ZW50IGRvZXMgbm90IGNoYW5nZS4KKyAgICAgICAgLy8gV2hlbiBhIERyYXdhYmxlIGlzIGFkZGVkLCB0aGUgc2FtZSBpbmRleCBjYW4gY29ycmVzcG9uZCB0byBhIG5ldyBEcmF3YWJsZSwgYW5kIHNpbmNlCisgICAgICAgIC8vIHNlbGVjdERyYXdhYmxlIGhhcyBhIGZhc3QgZXhpdCBjYXNlIHdoZW4gb2xkSW5kZXg9PW5ld0luZGV4LCB0aGUgbmV3IGRyYXdhYmxlIGNvdWxkIGVuZAorICAgICAgICAvLyB1cCBub3QgYmVpbmcgdXNlZCBpbiBwbGFjZSBvZiB0aGUgcHJldmlvdXMgb25lIGlmIHRoZXkgaGFwcGVuIHRvIHNoYXJlIHRoZSBzYW1lIGluZGV4LgorICAgICAgICAvLyBUaGlzIG1ha2Ugc3VyZSB0aGUgbmV3IGNvbXB1dGVkIGluZGV4IGNhbiBhY3R1YWxseSByZXBsYWNlIHRoZSBwcmV2aW91cyBvbmUuCisgICAgICAgIHNlbGVjdERyYXdhYmxlKC0xKTsKKyAgICAgICAgb25Cb3VuZHNDaGFuZ2UoZ2V0Qm91bmRzKCkpOworICAgIH0KKworICAgIC8vIG92ZXJyaWRlcyBmcm9tIERyYXdhYmxlCisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkJvdW5kc0NoYW5nZShSZWN0IGJvdW5kcykgeworICAgICAgICBmaW5hbCBpbnQgaW5kZXggPSBtTWlwbWFwQ29udGFpbmVyU3RhdGUuaW5kZXhGb3JCb3VuZHMoYm91bmRzKTsKKworICAgICAgICAvLyBXaWxsIGNhbGwgaW52YWxpZGF0ZVNlbGYoKSBpZiBuZWVkZWQKKyAgICAgICAgc2VsZWN0RHJhd2FibGUoaW5kZXgpOworCisgICAgICAgIHN1cGVyLm9uQm91bmRzQ2hhbmdlKGJvdW5kcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgaW5mbGF0ZShSZXNvdXJjZXMgciwgWG1sUHVsbFBhcnNlciBwYXJzZXIsIEF0dHJpYnV0ZVNldCBhdHRycykKKyAgICB0aHJvd3MgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworCisgICAgICAgIHN1cGVyLmluZmxhdGUociwgcGFyc2VyLCBhdHRycyk7CisKKyAgICAgICAgaW50IHR5cGU7CisKKyAgICAgICAgZmluYWwgaW50IGlubmVyRGVwdGggPSBwYXJzZXIuZ2V0RGVwdGgoKSArIDE7CisgICAgICAgIGludCBkZXB0aDsKKyAgICAgICAgd2hpbGUgKCh0eXBlID0gcGFyc2VyLm5leHQoKSkgIT0gWG1sUHVsbFBhcnNlci5FTkRfRE9DVU1FTlQKKyAgICAgICAgICAgICAgICAmJiAoKGRlcHRoID0gcGFyc2VyLmdldERlcHRoKCkpID49IGlubmVyRGVwdGgKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IHR5cGUgIT0gWG1sUHVsbFBhcnNlci5FTkRfVEFHKSkgeworICAgICAgICAgICAgaWYgKHR5cGUgIT0gWG1sUHVsbFBhcnNlci5TVEFSVF9UQUcpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGRlcHRoID4gaW5uZXJEZXB0aCB8fCAhcGFyc2VyLmdldE5hbWUoKS5lcXVhbHMoIml0ZW0iKSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBUeXBlZEFycmF5IGEgPSByLm9idGFpbkF0dHJpYnV0ZXMoYXR0cnMsCisgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLk1pcG1hcERyYXdhYmxlSXRlbSk7CisKKyAgICAgICAgICAgIGludCBkcmF3YWJsZVJlcyA9IGEuZ2V0UmVzb3VyY2VJZCgKKyAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuTWlwbWFwRHJhd2FibGVJdGVtX2RyYXdhYmxlLCAwKTsKKworICAgICAgICAgICAgYS5yZWN5Y2xlKCk7CisKKyAgICAgICAgICAgIERyYXdhYmxlIGRyOworICAgICAgICAgICAgaWYgKGRyYXdhYmxlUmVzICE9IDApIHsKKyAgICAgICAgICAgICAgICBkciA9IHIuZ2V0RHJhd2FibGUoZHJhd2FibGVSZXMpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB3aGlsZSAoKHR5cGUgPSBwYXJzZXIubmV4dCgpKSA9PSBYbWxQdWxsUGFyc2VyLlRFWFQpIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHR5cGUgIT0gWG1sUHVsbFBhcnNlci5TVEFSVF9UQUcpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFhtbFB1bGxQYXJzZXJFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VyLmdldFBvc2l0aW9uRGVzY3JpcHRpb24oKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIjogPGl0ZW0+IHRhZyByZXF1aXJlcyBhICdkcmF3YWJsZScgYXR0cmlidXRlIG9yICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJjaGlsZCB0YWcgZGVmaW5pbmcgYSBkcmF3YWJsZSIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkciA9IERyYXdhYmxlLmNyZWF0ZUZyb21YbWxJbm5lcihyLCBwYXJzZXIsIGF0dHJzKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbU1pcG1hcENvbnRhaW5lclN0YXRlLmFkZERyYXdhYmxlKGRyKTsKKyAgICAgICAgfQorCisgICAgICAgIG9uRHJhd2FibGVBZGRlZCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBEcmF3YWJsZSBtdXRhdGUoKSB7CisgICAgICAgIGlmICghbU11dGF0ZWQgJiYgc3VwZXIubXV0YXRlKCkgPT0gdGhpcykgeworICAgICAgICAgICAgbU1pcG1hcENvbnRhaW5lclN0YXRlLm1NaXBtYXBIZWlnaHRzID0gbU1pcG1hcENvbnRhaW5lclN0YXRlLm1NaXBtYXBIZWlnaHRzLmNsb25lKCk7CisgICAgICAgICAgICBtTXV0YXRlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgY2xhc3MgTWlwbWFwQ29udGFpbmVyU3RhdGUgZXh0ZW5kcyBEcmF3YWJsZUNvbnRhaW5lclN0YXRlIHsKKyAgICAgICAgcHJpdmF0ZSBpbnRbXSBtTWlwbWFwSGVpZ2h0czsKKworICAgICAgICBNaXBtYXBDb250YWluZXJTdGF0ZShNaXBtYXBDb250YWluZXJTdGF0ZSBvcmlnLCBNaXBtYXBEcmF3YWJsZSBvd25lciwgUmVzb3VyY2VzIHJlcykgeworICAgICAgICAgICAgc3VwZXIob3JpZywgb3duZXIsIHJlcyk7CisKKyAgICAgICAgICAgIGlmIChvcmlnICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtTWlwbWFwSGVpZ2h0cyA9IG9yaWcubU1pcG1hcEhlaWdodHM7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1NaXBtYXBIZWlnaHRzID0gbmV3IGludFtnZXRDaGlsZHJlbigpLmxlbmd0aF07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIENoYW5nZSB0aGUgZGVmYXVsdCB2YWx1ZQorICAgICAgICAgICAgc2V0Q29uc3RhbnRTaXplKHRydWUpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBjaGlsZCBtaXBtYXAgZHJhd2FibGUgdGhhdCB3aWxsIGJlc3QgZml0IHRoZSBwcm92aWRlZCBib3VuZHMuCisgICAgICAgICAqIFRoaXMgaW5kZXggaXMgZGV0ZXJtaW5lZCBieSBjb21wYXJpbmcgYm91bmRzJyBoZWlnaHQgYW5kIGNoaWxkcmVuIGludHJpbnNpYyBoZWlnaHRzLgorICAgICAgICAgKiBUaGUgcmV0dXJuZWQgbWlwbWFwIGluZGV4IGlzIHRoZSBzbWFsbGVzdCBtaXBtYXAgd2hpY2ggaGVpZ2h0IGlzIGdyZWF0ZXIgb3IgZXF1YWwgdGhhbgorICAgICAgICAgKiB0aGUgYm91bmRzJyBoZWlnaHQuIElmIHRoZSBib3VuZHMnIGhlaWdodCBpcyBsYXJnZXIgdGhhbiB0aGUgbGFyZ2VzdCBtaXBtYXAsIHRoZSBsYXJnZXN0CisgICAgICAgICAqIG1pcG1hcCBpbmRleCBpcyByZXR1cm5lZC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGJvdW5kcyBUaGUgYm91bmRzIG9mIHRoZSBNaXBNYXBEcmF3YWJsZS4KKyAgICAgICAgICogQHJldHVybiBUaGUgaW5kZXggb2YgdGhlIGNoaWxkIERyYXdhYmxlIHRoYXQgd2lsbCBiZXN0IGZpdCB0aGVzZSBib3VuZHMsIG9yIC0xIGlmIHRoZXJlCisgICAgICAgICAqIGFyZSBubyBjaGlsZHJlbiBtaXBtYXBzLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGludCBpbmRleEZvckJvdW5kcyhSZWN0IGJvdW5kcykgeworICAgICAgICAgICAgZmluYWwgaW50IGJvdW5kc0hlaWdodCA9IGJvdW5kcy5oZWlnaHQoKTsKKyAgICAgICAgICAgIGZpbmFsIGludCBOID0gZ2V0Q2hpbGRDb3VudCgpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoYm91bmRzSGVpZ2h0IDw9IG1NaXBtYXBIZWlnaHRzW2ldKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gTm8gbWlwbWFwIGxhcmdlciB0aGFuIGJvdW5kcyBmb3VuZC4gVXNlIGxhcmdlc3Qgb25lIHdoaWNoIHdpbGwgYmUgc2NhbGVkIHVwLgorICAgICAgICAgICAgaWYgKE4gPiAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE4gLSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gTm8gRHJhd2FibGUgbWlwbWFwIGF0IGFsbAorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFkZHMgYSBEcmF3YWJsZSB0byB0aGUgbGlzdCBvZiBhdmFpbGFibGUgbWlwbWFwIERyYXdhYmxlcy4gVGhpcyBsaXN0IGNhbiBiZSByZXRyaWV2ZWQKKyAgICAgICAgICogdXNpbmcge0BsaW5rIERyYXdhYmxlQ29udGFpbmVyLkRyYXdhYmxlQ29udGFpbmVyU3RhdGUjZ2V0Q2hpbGRyZW4oKX0gYW5kIHRoaXMgbWV0aG9kCisgICAgICAgICAqIGVuc3VyZXMgdGhhdCBpdCBpcyBhbHdheXMgc29ydGVkIGJ5IGluY3JlYXNpbmcge0BsaW5rIERyYXdhYmxlI2dldEludHJpbnNpY0hlaWdodCgpfS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGRyYXdhYmxlIFRoZSBEcmF3YWJsZSB0aGF0IHdpbGwgYmUgYWRkZWQgdG8gY2hpbGRyZW4gbGlzdAorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgYWRkRHJhd2FibGUoRHJhd2FibGUgZHJhd2FibGUpIHsKKyAgICAgICAgICAgIC8vIEluc2VydCBkcmF3YWJsZSBpbiBsYXN0IHBvc2l0aW9uLCBjb3JyZWN0bHkgcmVzZXR0aW5nIGNhY2hlZCB2YWx1ZXMgYW5kCisgICAgICAgICAgICAvLyBlc3BlY2lhbGx5IG1Db21wdXRlZENvbnN0YW50U2l6ZQorICAgICAgICAgICAgaW50IHBvcyA9IGFkZENoaWxkKGRyYXdhYmxlKTsKKworICAgICAgICAgICAgLy8gQnViYmxlIHNvcnQgdGhlIGxhc3QgZHJhd2FibGUgdG8gcmVzdG9yZSB0aGUgc29ydCBieSBpbnRyaW5zaWMgaGVpZ2h0CisgICAgICAgICAgICBmaW5hbCBpbnQgZHJhd2FibGVIZWlnaHQgPSBkcmF3YWJsZS5nZXRJbnRyaW5zaWNIZWlnaHQoKTsKKworICAgICAgICAgICAgd2hpbGUgKHBvcyA+IDApIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBEcmF3YWJsZSBwcmV2aW91c0RyYXdhYmxlID0gbURyYXdhYmxlc1twb3MtMV07CisgICAgICAgICAgICAgICAgZmluYWwgaW50IHByZXZpb3VzSW50cmluc2ljSGVpZ2h0ID0gcHJldmlvdXNEcmF3YWJsZS5nZXRJbnRyaW5zaWNIZWlnaHQoKTsKKworICAgICAgICAgICAgICAgIGlmIChkcmF3YWJsZUhlaWdodCA8IHByZXZpb3VzSW50cmluc2ljSGVpZ2h0KSB7CisgICAgICAgICAgICAgICAgICAgIG1EcmF3YWJsZXNbcG9zXSA9IHByZXZpb3VzRHJhd2FibGU7CisgICAgICAgICAgICAgICAgICAgIG1NaXBtYXBIZWlnaHRzW3Bvc10gPSBwcmV2aW91c0ludHJpbnNpY0hlaWdodDsKKworICAgICAgICAgICAgICAgICAgICBtRHJhd2FibGVzW3Bvcy0xXSA9IGRyYXdhYmxlOworICAgICAgICAgICAgICAgICAgICBtTWlwbWFwSGVpZ2h0c1twb3MtMV0gPSBkcmF3YWJsZUhlaWdodDsKKyAgICAgICAgICAgICAgICAgICAgcG9zLS07CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEludHJpbnNpYyBzaXplcyBhcmUgdGhvc2Ugb2YgdGhlIGxhcmdlc3QgYXZhaWxhYmxlIG1pcG1hcC4KKyAgICAgICAgICogTWluaW11bSBzaXplcyBhcmUgdGhvc2Ugb2YgdGhlIHNtYWxsZXN0IGF2YWlsYWJsZSBtaXBtYXAuCisgICAgICAgICAqLworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgY29tcHV0ZUNvbnN0YW50U2l6ZSgpIHsKKyAgICAgICAgICAgIGZpbmFsIGludCBOID0gZ2V0Q2hpbGRDb3VudCgpOworICAgICAgICAgICAgaWYgKE4gPiAwKSB7CisgICAgICAgICAgICAgICAgZmluYWwgRHJhd2FibGUgc21hbGxlc3REcmF3YWJsZSA9IG1EcmF3YWJsZXNbMF07CisgICAgICAgICAgICAgICAgbUNvbnN0YW50TWluaW11bVdpZHRoID0gc21hbGxlc3REcmF3YWJsZS5nZXRNaW5pbXVtV2lkdGgoKTsKKyAgICAgICAgICAgICAgICBtQ29uc3RhbnRNaW5pbXVtSGVpZ2h0ID0gc21hbGxlc3REcmF3YWJsZS5nZXRNaW5pbXVtSGVpZ2h0KCk7CisKKyAgICAgICAgICAgICAgICBmaW5hbCBEcmF3YWJsZSBsYXJnZXN0RHJhd2FibGUgPSBtRHJhd2FibGVzW04tMV07CisgICAgICAgICAgICAgICAgbUNvbnN0YW50V2lkdGggPSBsYXJnZXN0RHJhd2FibGUuZ2V0SW50cmluc2ljV2lkdGgoKTsKKyAgICAgICAgICAgICAgICBtQ29uc3RhbnRIZWlnaHQgPSBsYXJnZXN0RHJhd2FibGUuZ2V0SW50cmluc2ljSGVpZ2h0KCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1Db25zdGFudFdpZHRoID0gbUNvbnN0YW50SGVpZ2h0ID0gLTE7CisgICAgICAgICAgICAgICAgbUNvbnN0YW50TWluaW11bVdpZHRoID0gbUNvbnN0YW50TWluaW11bUhlaWdodCA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQ29tcHV0ZWRDb25zdGFudFNpemUgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBEcmF3YWJsZSBuZXdEcmF3YWJsZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgTWlwbWFwRHJhd2FibGUodGhpcywgbnVsbCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIERyYXdhYmxlIG5ld0RyYXdhYmxlKFJlc291cmNlcyByZXMpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgTWlwbWFwRHJhd2FibGUodGhpcywgcmVzKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBncm93QXJyYXkoaW50IG9sZFNpemUsIGludCBuZXdTaXplKSB7CisgICAgICAgICAgICBzdXBlci5ncm93QXJyYXkob2xkU2l6ZSwgbmV3U2l6ZSk7CisgICAgICAgICAgICBpbnRbXSBuZXdJbnRzID0gbmV3IGludFtuZXdTaXplXTsKKyAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkobU1pcG1hcEhlaWdodHMsIDAsIG5ld0ludHMsIDAsIG9sZFNpemUpOworICAgICAgICAgICAgbU1pcG1hcEhlaWdodHMgPSBuZXdJbnRzOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBNaXBtYXBEcmF3YWJsZShNaXBtYXBDb250YWluZXJTdGF0ZSBzdGF0ZSwgUmVzb3VyY2VzIHJlcykgeworICAgICAgICBNaXBtYXBDb250YWluZXJTdGF0ZSBhcyA9IG5ldyBNaXBtYXBDb250YWluZXJTdGF0ZShzdGF0ZSwgdGhpcywgcmVzKTsKKyAgICAgICAgbU1pcG1hcENvbnRhaW5lclN0YXRlID0gYXM7CisgICAgICAgIHNldENvbnN0YW50U3RhdGUoYXMpOworICAgICAgICBvbkRyYXdhYmxlQWRkZWQoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0FsbG9jYXRpb24uamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvQWxsb2NhdGlvbi5qYXZhCmluZGV4IDE3YzA3NzguLmRkYjJhYmYgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvQWxsb2NhdGlvbi5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvQWxsb2NhdGlvbi5qYXZhCkBAIC03NiwxMCArNzYsMzAgQEAKICAgICAgICAgc3ViRGF0YTFEKDAsIG1UeXBlLmdldEVsZW1lbnRDb3VudCgpLCBkKTsKICAgICB9CiAKKyAgICBwdWJsaWMgdm9pZCBzdWJEYXRhKGludCBvZmYsIEZpZWxkUGFja2VyIGZwKSB7CisgICAgICAgIGludCBlU2l6ZSA9IG1UeXBlLm1FbGVtZW50LmdldFNpemVCeXRlcygpOworICAgICAgICBmaW5hbCBieXRlW10gZGF0YSA9IGZwLmdldERhdGEoKTsKKworICAgICAgICBpbnQgY291bnQgPSBkYXRhLmxlbmd0aCAvIGVTaXplOworICAgICAgICBpZiAoKGVTaXplICogY291bnQpICE9IGRhdGEubGVuZ3RoKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJGaWVsZCBwYWNrZXIgbGVuZ3RoICIgKyBkYXRhLmxlbmd0aCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgbm90IGRpdmlzaWJsZSBieSBlbGVtZW50IHNpemUgIiArIGVTaXplICsgIi4iKTsKKyAgICAgICAgfQorICAgICAgICBkYXRhMURDaGVja3Mob2ZmLCBjb3VudCwgZGF0YS5sZW5ndGgsIGRhdGEubGVuZ3RoKTsKKyAgICAgICAgbVJTLm5BbGxvY2F0aW9uU3ViRGF0YTFEKG1JRCwgb2ZmLCBjb3VudCwgZGF0YSwgZGF0YS5sZW5ndGgpOworICAgIH0KKwogICAgIHByaXZhdGUgdm9pZCBkYXRhMURDaGVja3MoaW50IG9mZiwgaW50IGNvdW50LCBpbnQgbGVuLCBpbnQgZGF0YVNpemUpIHsKICAgICAgICAgbVJTLnZhbGlkYXRlKCk7Ci0gICAgICAgIGlmKChvZmYgPCAwKSB8fCAoY291bnQgPCAxKSB8fCAoKG9mZiArIGNvdW50KSA+IG1UeXBlLmdldEVsZW1lbnRDb3VudCgpKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiT2Zmc2V0IG9yIENvdW50IG91dCBvZiBib3VuZHMuIik7CisgICAgICAgIGlmKG9mZiA8IDApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk9mZnNldCBtdXN0IGJlID49IDAuIik7CisgICAgICAgIH0KKyAgICAgICAgaWYoY291bnQgPCAxKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDb3VudCBtdXN0IGJlID49IDEuIik7CisgICAgICAgIH0KKyAgICAgICAgaWYoKG9mZiArIGNvdW50KSA+IG1UeXBlLmdldEVsZW1lbnRDb3VudCgpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJPdmVyZmxvdywgQXZhaWxhYmxlIGNvdW50ICIgKyBtVHlwZS5nZXRFbGVtZW50Q291bnQoKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIsIGdvdCAiICsgY291bnQgKyAiIGF0IG9mZnNldCAiICsgb2ZmICsgIi4iKTsKICAgICAgICAgfQogICAgICAgICBpZigobGVuKSA8IGRhdGFTaXplKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJBcnJheSB0b28gc21hbGwgZm9yIGFsbG9jYXRpb24gdHlwZS4iKTsKQEAgLTM2Niw2ICszODYsMjEgQEAKICAgICAgICAgQml0bWFwIGIgPSBCaXRtYXBGYWN0b3J5LmRlY29kZVJlc291cmNlKHJlcywgaWQsIG1CaXRtYXBPcHRpb25zKTsKICAgICAgICAgcmV0dXJuIGNyZWF0ZUZyb21CaXRtYXBCb3hlZChycywgYiwgZHN0Rm10LCBnZW5NaXBzKTsKICAgICB9CisKKyAgICBzdGF0aWMgcHVibGljIEFsbG9jYXRpb24gY3JlYXRlRnJvbVN0cmluZyhSZW5kZXJTY3JpcHQgcnMsIFN0cmluZyBzdHIpCisgICAgICAgIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24geworICAgICAgICBieXRlW10gYWxsb2NBcnJheSA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBhbGxvY0FycmF5ID0gc3RyLmdldEJ5dGVzKCJVVEYtOCIpOworICAgICAgICAgICAgQWxsb2NhdGlvbiBhbGxvYyA9IEFsbG9jYXRpb24uY3JlYXRlU2l6ZWQocnMsIEVsZW1lbnQuVTgocnMpLCBhbGxvY0FycmF5Lmxlbmd0aCk7CisgICAgICAgICAgICBhbGxvYy5kYXRhKGFsbG9jQXJyYXkpOworICAgICAgICAgICAgcmV0dXJuIGFsbG9jOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoInJzIiwgImNvdWxkIG5vdCBjb252ZXJ0IHN0cmluZyB0byB1dGYtOCIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KIH0KIAogCmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1ZlY3RvcjJmLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0J5dGUyLmphdmEKc2ltaWxhcml0eSBpbmRleCA4OSUKY29weSBmcm9tIGdyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvVmVjdG9yMmYuamF2YQpjb3B5IHRvIGdyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvQnl0ZTIuamF2YQppbmRleCA1NjdkNTdmYS4uOTVjZjg4YyAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9WZWN0b3IyZi5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvQnl0ZTIuamF2YQpAQCAtMjQsMTIgKzI0LDEyIEBACiAgKiBAaGlkZQogICoKICAqKi8KLXB1YmxpYyBjbGFzcyBWZWN0b3IyZiB7Ci0gICAgcHVibGljIFZlY3RvcjJmKCkgeworcHVibGljIGNsYXNzIEJ5dGUyIHsKKyAgICBwdWJsaWMgQnl0ZTIoKSB7CiAgICAgfQogCi0gICAgcHVibGljIGZsb2F0IHg7Ci0gICAgcHVibGljIGZsb2F0IHk7CisgICAgcHVibGljIGJ5dGUgeDsKKyAgICBwdWJsaWMgYnl0ZSB5OwogfQogCiAKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvVmVjdG9yMmYuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvQnl0ZTMuamF2YQpzaW1pbGFyaXR5IGluZGV4IDg3JQpjb3B5IGZyb20gZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9WZWN0b3IyZi5qYXZhCmNvcHkgdG8gZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9CeXRlMy5qYXZhCmluZGV4IDU2N2Q1N2ZhLi5hNmMwY2E5IDEwMDY0NAotLS0gYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1ZlY3RvcjJmLmphdmEKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9CeXRlMy5qYXZhCkBAIC0yNCwxMiArMjQsMTMgQEAKICAqIEBoaWRlCiAgKgogICoqLwotcHVibGljIGNsYXNzIFZlY3RvcjJmIHsKLSAgICBwdWJsaWMgVmVjdG9yMmYoKSB7CitwdWJsaWMgY2xhc3MgQnl0ZTMgeworICAgIHB1YmxpYyBCeXRlMygpIHsKICAgICB9CiAKLSAgICBwdWJsaWMgZmxvYXQgeDsKLSAgICBwdWJsaWMgZmxvYXQgeTsKKyAgICBwdWJsaWMgYnl0ZSB4OworICAgIHB1YmxpYyBieXRlIHk7CisgICAgcHVibGljIGJ5dGUgejsKIH0KIAogCmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1ZlY3RvcjJmLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0J5dGU0LmphdmEKc2ltaWxhcml0eSBpbmRleCA4NSUKY29weSBmcm9tIGdyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvVmVjdG9yMmYuamF2YQpjb3B5IHRvIGdyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvQnl0ZTQuamF2YQppbmRleCA1NjdkNTdmYS4uYTViZmM2MSAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9WZWN0b3IyZi5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvQnl0ZTQuamF2YQpAQCAtMjQsMTQgKzI0LDE1IEBACiAgKiBAaGlkZQogICoKICAqKi8KLXB1YmxpYyBjbGFzcyBWZWN0b3IyZiB7Ci0gICAgcHVibGljIFZlY3RvcjJmKCkgeworcHVibGljIGNsYXNzIEJ5dGU0IHsKKyAgICBwdWJsaWMgQnl0ZTQoKSB7CiAgICAgfQogCi0gICAgcHVibGljIGZsb2F0IHg7Ci0gICAgcHVibGljIGZsb2F0IHk7CisgICAgcHVibGljIGJ5dGUgeDsKKyAgICBwdWJsaWMgYnl0ZSB5OworICAgIHB1YmxpYyBieXRlIHo7CisgICAgcHVibGljIGJ5dGUgdzsKIH0KIAogCiAKLQpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9FbGVtZW50LmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0VsZW1lbnQuamF2YQppbmRleCAxMGVmMDVhLi4zMDhkNjYzIDEwMDY0NAotLS0gYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0VsZW1lbnQuamF2YQorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0VsZW1lbnQuamF2YQpAQCAtNDcsMjAgKzQ3LDIyIEBACiAgICAgICAgIFVOU0lHTkVEXzMyICgxMCwgNCksCiAgICAgICAgIC8vVU5TSUdORURfNjQgKDExLCA4KSwKIAotICAgICAgICBVTlNJR05FRF81XzZfNSAoMTIsIDIpLAotICAgICAgICBVTlNJR05FRF81XzVfNV8xICgxMywgMiksCi0gICAgICAgIFVOU0lHTkVEXzRfNF80XzQgKDE0LCAyKSwKKyAgICAgICAgQk9PTEVBTigxMiwgMSksCiAKLSAgICAgICAgUlNfRUxFTUVOVCAoMTUsIDQpLAotICAgICAgICBSU19UWVBFICgxNiwgNCksCi0gICAgICAgIFJTX0FMTE9DQVRJT04gKDE3LCA0KSwKLSAgICAgICAgUlNfU0FNUExFUiAoMTgsIDQpLAotICAgICAgICBSU19TQ1JJUFQgKDE5LCA0KSwKLSAgICAgICAgUlNfTUVTSCAoMjAsIDQpLAotICAgICAgICBSU19QUk9HUkFNX0ZSQUdNRU5UICgyMSwgNCksCi0gICAgICAgIFJTX1BST0dSQU1fVkVSVEVYICgyMiwgNCksCi0gICAgICAgIFJTX1BST0dSQU1fUkFTVEVSICgyMywgNCksCi0gICAgICAgIFJTX1BST0dSQU1fU1RPUkUgKDI0LCA0KTsKKyAgICAgICAgVU5TSUdORURfNV82XzUgKDEzLCAyKSwKKyAgICAgICAgVU5TSUdORURfNV81XzVfMSAoMTQsIDIpLAorICAgICAgICBVTlNJR05FRF80XzRfNF80ICgxNSwgMiksCisKKyAgICAgICAgUlNfRUxFTUVOVCAoMTYsIDQpLAorICAgICAgICBSU19UWVBFICgxNywgNCksCisgICAgICAgIFJTX0FMTE9DQVRJT04gKDE4LCA0KSwKKyAgICAgICAgUlNfU0FNUExFUiAoMTksIDQpLAorICAgICAgICBSU19TQ1JJUFQgKDIwLCA0KSwKKyAgICAgICAgUlNfTUVTSCAoMjEsIDQpLAorICAgICAgICBSU19QUk9HUkFNX0ZSQUdNRU5UICgyMiwgNCksCisgICAgICAgIFJTX1BST0dSQU1fVkVSVEVYICgyMywgNCksCisgICAgICAgIFJTX1BST0dSQU1fUkFTVEVSICgyNCwgNCksCisgICAgICAgIFJTX1BST0dSQU1fU1RPUkUgKDI1LCA0KTsKIAogICAgICAgICBpbnQgbUlEOwogICAgICAgICBpbnQgbVNpemU7CkBAIC03MiwxMiArNzQsNiBAQAogCiAgICAgcHVibGljIGVudW0gRGF0YUtpbmQgewogICAgICAgICBVU0VSICgwKSwKLSAgICAgICAgQ09MT1IgKDEpLAotICAgICAgICBQT1NJVElPTiAoMiksCi0gICAgICAgIFRFWFRVUkUgKDMpLAotICAgICAgICBOT1JNQUwgKDQpLAotICAgICAgICBJTkRFWCAoNSksCi0gICAgICAgIFBPSU5UX1NJWkUoNiksCiAKICAgICAgICAgUElYRUxfTCAoNyksCiAgICAgICAgIFBJWEVMX0EgKDgpLApAQCAtOTEsNDEgKzg3LDEzMyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyBFbGVtZW50IFVTRVJfVTgoUmVuZGVyU2NyaXB0IHJzKSB7Ci0gICAgICAgIGlmKHJzLm1FbGVtZW50X1VTRVJfVTggPT0gbnVsbCkgewotICAgICAgICAgICAgcnMubUVsZW1lbnRfVVNFUl9VOCA9IGNyZWF0ZVVzZXIocnMsIERhdGFUeXBlLlVOU0lHTkVEXzgpOworICAgIHB1YmxpYyBzdGF0aWMgRWxlbWVudCBCT09MRUFOKFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBpZihycy5tRWxlbWVudF9CT09MRUFOID09IG51bGwpIHsKKyAgICAgICAgICAgIHJzLm1FbGVtZW50X0JPT0xFQU4gPSBjcmVhdGVVc2VyKHJzLCBEYXRhVHlwZS5CT09MRUFOKTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gcnMubUVsZW1lbnRfVVNFUl9VODsKKyAgICAgICAgcmV0dXJuIHJzLm1FbGVtZW50X0JPT0xFQU47CiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyBFbGVtZW50IFVTRVJfSTgoUmVuZGVyU2NyaXB0IHJzKSB7Ci0gICAgICAgIGlmKHJzLm1FbGVtZW50X1VTRVJfSTggPT0gbnVsbCkgewotICAgICAgICAgICAgcnMubUVsZW1lbnRfVVNFUl9JOCA9IGNyZWF0ZVVzZXIocnMsIERhdGFUeXBlLlNJR05FRF84KTsKKyAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgVTgoUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgIGlmKHJzLm1FbGVtZW50X1U4ID09IG51bGwpIHsKKyAgICAgICAgICAgIHJzLm1FbGVtZW50X1U4ID0gY3JlYXRlVXNlcihycywgRGF0YVR5cGUuVU5TSUdORURfOCk7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJzLm1FbGVtZW50X1VTRVJfSTg7CisgICAgICAgIHJldHVybiBycy5tRWxlbWVudF9VODsKICAgICB9CiAKLSAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgVVNFUl9VMzIoUmVuZGVyU2NyaXB0IHJzKSB7Ci0gICAgICAgIGlmKHJzLm1FbGVtZW50X1VTRVJfVTMyID09IG51bGwpIHsKLSAgICAgICAgICAgIHJzLm1FbGVtZW50X1VTRVJfVTMyID0gY3JlYXRlVXNlcihycywgRGF0YVR5cGUuVU5TSUdORURfMzIpOworICAgIHB1YmxpYyBzdGF0aWMgRWxlbWVudCBJOChSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgaWYocnMubUVsZW1lbnRfSTggPT0gbnVsbCkgeworICAgICAgICAgICAgcnMubUVsZW1lbnRfSTggPSBjcmVhdGVVc2VyKHJzLCBEYXRhVHlwZS5TSUdORURfOCk7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJzLm1FbGVtZW50X1VTRVJfVTMyOworICAgICAgICByZXR1cm4gcnMubUVsZW1lbnRfSTg7CiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyBFbGVtZW50IFVTRVJfSTMyKFJlbmRlclNjcmlwdCBycykgewotICAgICAgICBpZihycy5tRWxlbWVudF9VU0VSX0kzMiA9PSBudWxsKSB7Ci0gICAgICAgICAgICBycy5tRWxlbWVudF9VU0VSX0kzMiA9IGNyZWF0ZVVzZXIocnMsIERhdGFUeXBlLlNJR05FRF8zMik7CisgICAgcHVibGljIHN0YXRpYyBFbGVtZW50IFUxNihSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgaWYocnMubUVsZW1lbnRfVTE2ID09IG51bGwpIHsKKyAgICAgICAgICAgIHJzLm1FbGVtZW50X1UxNiA9IGNyZWF0ZVVzZXIocnMsIERhdGFUeXBlLlVOU0lHTkVEXzE2KTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gcnMubUVsZW1lbnRfVVNFUl9JMzI7CisgICAgICAgIHJldHVybiBycy5tRWxlbWVudF9VMTY7CiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyBFbGVtZW50IFVTRVJfRjMyKFJlbmRlclNjcmlwdCBycykgewotICAgICAgICBpZihycy5tRWxlbWVudF9VU0VSX0YzMiA9PSBudWxsKSB7Ci0gICAgICAgICAgICBycy5tRWxlbWVudF9VU0VSX0YzMiA9IGNyZWF0ZVVzZXIocnMsIERhdGFUeXBlLkZMT0FUXzMyKTsKKyAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgSTE2KFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBpZihycy5tRWxlbWVudF9JMTYgPT0gbnVsbCkgeworICAgICAgICAgICAgcnMubUVsZW1lbnRfSTE2ID0gY3JlYXRlVXNlcihycywgRGF0YVR5cGUuU0lHTkVEXzE2KTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gcnMubUVsZW1lbnRfVVNFUl9GMzI7CisgICAgICAgIHJldHVybiBycy5tRWxlbWVudF9JMTY7CiAgICAgfQogCisgICAgcHVibGljIHN0YXRpYyBFbGVtZW50IFUzMihSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgaWYocnMubUVsZW1lbnRfVTMyID09IG51bGwpIHsKKyAgICAgICAgICAgIHJzLm1FbGVtZW50X1UzMiA9IGNyZWF0ZVVzZXIocnMsIERhdGFUeXBlLlVOU0lHTkVEXzMyKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcnMubUVsZW1lbnRfVTMyOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgRWxlbWVudCBJMzIoUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgIGlmKHJzLm1FbGVtZW50X0kzMiA9PSBudWxsKSB7CisgICAgICAgICAgICBycy5tRWxlbWVudF9JMzIgPSBjcmVhdGVVc2VyKHJzLCBEYXRhVHlwZS5TSUdORURfMzIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBycy5tRWxlbWVudF9JMzI7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBFbGVtZW50IEYzMihSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgaWYocnMubUVsZW1lbnRfRjMyID09IG51bGwpIHsKKyAgICAgICAgICAgIHJzLm1FbGVtZW50X0YzMiA9IGNyZWF0ZVVzZXIocnMsIERhdGFUeXBlLkZMT0FUXzMyKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcnMubUVsZW1lbnRfRjMyOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgRWxlbWVudCBFTEVNRU5UKFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBpZihycy5tRWxlbWVudF9FTEVNRU5UID09IG51bGwpIHsKKyAgICAgICAgICAgIHJzLm1FbGVtZW50X0VMRU1FTlQgPSBjcmVhdGVVc2VyKHJzLCBEYXRhVHlwZS5SU19FTEVNRU5UKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcnMubUVsZW1lbnRfRUxFTUVOVDsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgVFlQRShSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgaWYocnMubUVsZW1lbnRfVFlQRSA9PSBudWxsKSB7CisgICAgICAgICAgICBycy5tRWxlbWVudF9UWVBFID0gY3JlYXRlVXNlcihycywgRGF0YVR5cGUuUlNfVFlQRSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJzLm1FbGVtZW50X1RZUEU7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBFbGVtZW50IEFMTE9DQVRJT04oUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgIGlmKHJzLm1FbGVtZW50X0FMTE9DQVRJT04gPT0gbnVsbCkgeworICAgICAgICAgICAgcnMubUVsZW1lbnRfQUxMT0NBVElPTiA9IGNyZWF0ZVVzZXIocnMsIERhdGFUeXBlLlJTX0FMTE9DQVRJT04pOworICAgICAgICB9CisgICAgICAgIHJldHVybiBycy5tRWxlbWVudF9BTExPQ0FUSU9OOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgRWxlbWVudCBTQU1QTEVSKFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBpZihycy5tRWxlbWVudF9TQU1QTEVSID09IG51bGwpIHsKKyAgICAgICAgICAgIHJzLm1FbGVtZW50X1NBTVBMRVIgPSBjcmVhdGVVc2VyKHJzLCBEYXRhVHlwZS5SU19TQU1QTEVSKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcnMubUVsZW1lbnRfU0FNUExFUjsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgU0NSSVBUKFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBpZihycy5tRWxlbWVudF9TQ1JJUFQgPT0gbnVsbCkgeworICAgICAgICAgICAgcnMubUVsZW1lbnRfU0NSSVBUID0gY3JlYXRlVXNlcihycywgRGF0YVR5cGUuUlNfU0NSSVBUKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcnMubUVsZW1lbnRfU0NSSVBUOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgRWxlbWVudCBNRVNIKFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBpZihycy5tRWxlbWVudF9NRVNIID09IG51bGwpIHsKKyAgICAgICAgICAgIHJzLm1FbGVtZW50X01FU0ggPSBjcmVhdGVVc2VyKHJzLCBEYXRhVHlwZS5SU19NRVNIKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcnMubUVsZW1lbnRfTUVTSDsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgUFJPR1JBTV9GUkFHTUVOVChSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgaWYocnMubUVsZW1lbnRfUFJPR1JBTV9GUkFHTUVOVCA9PSBudWxsKSB7CisgICAgICAgICAgICBycy5tRWxlbWVudF9QUk9HUkFNX0ZSQUdNRU5UID0gY3JlYXRlVXNlcihycywgRGF0YVR5cGUuUlNfUFJPR1JBTV9GUkFHTUVOVCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJzLm1FbGVtZW50X1BST0dSQU1fRlJBR01FTlQ7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBFbGVtZW50IFBST0dSQU1fVkVSVEVYKFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBpZihycy5tRWxlbWVudF9QUk9HUkFNX1ZFUlRFWCA9PSBudWxsKSB7CisgICAgICAgICAgICBycy5tRWxlbWVudF9QUk9HUkFNX1ZFUlRFWCA9IGNyZWF0ZVVzZXIocnMsIERhdGFUeXBlLlJTX1BST0dSQU1fVkVSVEVYKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcnMubUVsZW1lbnRfUFJPR1JBTV9WRVJURVg7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBFbGVtZW50IFBST0dSQU1fUkFTVEVSKFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBpZihycy5tRWxlbWVudF9QUk9HUkFNX1JBU1RFUiA9PSBudWxsKSB7CisgICAgICAgICAgICBycy5tRWxlbWVudF9QUk9HUkFNX1JBU1RFUiA9IGNyZWF0ZVVzZXIocnMsIERhdGFUeXBlLlJTX1BST0dSQU1fUkFTVEVSKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcnMubUVsZW1lbnRfUFJPR1JBTV9SQVNURVI7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBFbGVtZW50IFBST0dSQU1fU1RPUkUoUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgIGlmKHJzLm1FbGVtZW50X1BST0dSQU1fU1RPUkUgPT0gbnVsbCkgeworICAgICAgICAgICAgcnMubUVsZW1lbnRfUFJPR1JBTV9TVE9SRSA9IGNyZWF0ZVVzZXIocnMsIERhdGFUeXBlLlJTX1BST0dSQU1fU1RPUkUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBycy5tRWxlbWVudF9QUk9HUkFNX1NUT1JFOworICAgIH0KKworCiAgICAgcHVibGljIHN0YXRpYyBFbGVtZW50IEFfOChSZW5kZXJTY3JpcHQgcnMpIHsKICAgICAgICAgaWYocnMubUVsZW1lbnRfQV84ID09IG51bGwpIHsKICAgICAgICAgICAgIHJzLm1FbGVtZW50X0FfOCA9IGNyZWF0ZVBpeGVsKHJzLCBEYXRhVHlwZS5VTlNJR05FRF84LCBEYXRhS2luZC5QSVhFTF9BKTsKQEAgLTE2OCw1NCArMjU2LDM0IEBACiAgICAgICAgIHJldHVybiBycy5tRWxlbWVudF9SR0JBXzg4ODg7CiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyBFbGVtZW50IElOREVYXzE2KFJlbmRlclNjcmlwdCBycykgewotICAgICAgICBpZihycy5tRWxlbWVudF9JTkRFWF8xNiA9PSBudWxsKSB7Ci0gICAgICAgICAgICBycy5tRWxlbWVudF9JTkRFWF8xNiA9IGNyZWF0ZUluZGV4KHJzKTsKKyAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgRjMyXzIoUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgIGlmKHJzLm1FbGVtZW50X0ZMT0FUXzIgPT0gbnVsbCkgeworICAgICAgICAgICAgcnMubUVsZW1lbnRfRkxPQVRfMiA9IGNyZWF0ZVZlY3RvcihycywgRGF0YVR5cGUuRkxPQVRfMzIsIDIpOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBycy5tRWxlbWVudF9JTkRFWF8xNjsKKyAgICAgICAgcmV0dXJuIHJzLm1FbGVtZW50X0ZMT0FUXzI7CiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyBFbGVtZW50IEFUVFJJQl9QT1NJVElPTl8yKFJlbmRlclNjcmlwdCBycykgewotICAgICAgICBpZihycy5tRWxlbWVudF9QT1NJVElPTl8yID09IG51bGwpIHsKLSAgICAgICAgICAgIHJzLm1FbGVtZW50X1BPU0lUSU9OXzIgPSBjcmVhdGVBdHRyaWIocnMsIERhdGFUeXBlLkZMT0FUXzMyLCBEYXRhS2luZC5QT1NJVElPTiwgMik7CisgICAgcHVibGljIHN0YXRpYyBFbGVtZW50IEYzMl8zKFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBpZihycy5tRWxlbWVudF9GTE9BVF8zID09IG51bGwpIHsKKyAgICAgICAgICAgIHJzLm1FbGVtZW50X0ZMT0FUXzMgPSBjcmVhdGVWZWN0b3IocnMsIERhdGFUeXBlLkZMT0FUXzMyLCAzKTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gcnMubUVsZW1lbnRfUE9TSVRJT05fMjsKKyAgICAgICAgcmV0dXJuIHJzLm1FbGVtZW50X0ZMT0FUXzM7CiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyBFbGVtZW50IEFUVFJJQl9QT1NJVElPTl8zKFJlbmRlclNjcmlwdCBycykgewotICAgICAgICBpZihycy5tRWxlbWVudF9QT1NJVElPTl8zID09IG51bGwpIHsKLSAgICAgICAgICAgIHJzLm1FbGVtZW50X1BPU0lUSU9OXzMgPSBjcmVhdGVBdHRyaWIocnMsIERhdGFUeXBlLkZMT0FUXzMyLCBEYXRhS2luZC5QT1NJVElPTiwgMyk7CisgICAgcHVibGljIHN0YXRpYyBFbGVtZW50IEYzMl80KFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBpZihycy5tRWxlbWVudF9GTE9BVF80ID09IG51bGwpIHsKKyAgICAgICAgICAgIHJzLm1FbGVtZW50X0ZMT0FUXzQgPSBjcmVhdGVWZWN0b3IocnMsIERhdGFUeXBlLkZMT0FUXzMyLCA0KTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gcnMubUVsZW1lbnRfUE9TSVRJT05fMzsKKyAgICAgICAgcmV0dXJuIHJzLm1FbGVtZW50X0ZMT0FUXzQ7CiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyBFbGVtZW50IEFUVFJJQl9URVhUVVJFXzIoUmVuZGVyU2NyaXB0IHJzKSB7Ci0gICAgICAgIGlmKHJzLm1FbGVtZW50X1RFWFRVUkVfMiA9PSBudWxsKSB7Ci0gICAgICAgICAgICBycy5tRWxlbWVudF9URVhUVVJFXzIgPSBjcmVhdGVBdHRyaWIocnMsIERhdGFUeXBlLkZMT0FUXzMyLCBEYXRhS2luZC5URVhUVVJFLCAyKTsKKyAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgVThfNChSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgaWYocnMubUVsZW1lbnRfVUNIQVJfNCA9PSBudWxsKSB7CisgICAgICAgICAgICBycy5tRWxlbWVudF9VQ0hBUl80ID0gY3JlYXRlVmVjdG9yKHJzLCBEYXRhVHlwZS5VTlNJR05FRF84LCA0KTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gcnMubUVsZW1lbnRfVEVYVFVSRV8yOworICAgICAgICByZXR1cm4gcnMubUVsZW1lbnRfVUNIQVJfNDsKICAgICB9CiAKLSAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgQVRUUklCX05PUk1BTF8zKFJlbmRlclNjcmlwdCBycykgewotICAgICAgICBpZihycy5tRWxlbWVudF9OT1JNQUxfMyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBycy5tRWxlbWVudF9OT1JNQUxfMyA9IGNyZWF0ZUF0dHJpYihycywgRGF0YVR5cGUuRkxPQVRfMzIsIERhdGFLaW5kLk5PUk1BTCwgMyk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJzLm1FbGVtZW50X05PUk1BTF8zOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgRWxlbWVudCBBVFRSSUJfQ09MT1JfVThfNChSZW5kZXJTY3JpcHQgcnMpIHsKLSAgICAgICAgaWYocnMubUVsZW1lbnRfQ09MT1JfVThfNCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBycy5tRWxlbWVudF9DT0xPUl9VOF80ID0gY3JlYXRlQXR0cmliKHJzLCBEYXRhVHlwZS5VTlNJR05FRF84LCBEYXRhS2luZC5DT0xPUiwgNCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJzLm1FbGVtZW50X0NPTE9SX1U4XzQ7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBFbGVtZW50IEFUVFJJQl9DT0xPUl9GMzJfNChSZW5kZXJTY3JpcHQgcnMpIHsKLSAgICAgICAgaWYocnMubUVsZW1lbnRfQ09MT1JfRjMyXzQgPT0gbnVsbCkgewotICAgICAgICAgICAgcnMubUVsZW1lbnRfQ09MT1JfRjMyXzQgPSBjcmVhdGVBdHRyaWIocnMsIERhdGFUeXBlLkZMT0FUXzMyLCBEYXRhS2luZC5DT0xPUiwgNCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJzLm1FbGVtZW50X0NPTE9SX0YzMl80OwotICAgIH0KIAogICAgIEVsZW1lbnQoUmVuZGVyU2NyaXB0IHJzLCBFbGVtZW50W10gZSwgU3RyaW5nW10gbikgewogICAgICAgICBzdXBlcihycyk7CkBAIC0yNDQsMjkgKzMxMiw2IEBACiAgICAgICAgIHN1cGVyLmRlc3Ryb3koKTsKICAgICB9CiAKLSAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgY3JlYXRlRnJvbUNsYXNzKFJlbmRlclNjcmlwdCBycywgQ2xhc3MgYykgewotICAgICAgICBycy52YWxpZGF0ZSgpOwotICAgICAgICBGaWVsZFtdIGZpZWxkcyA9IGMuZ2V0RmllbGRzKCk7Ci0gICAgICAgIEJ1aWxkZXIgYiA9IG5ldyBCdWlsZGVyKHJzKTsKLQotICAgICAgICBmb3IoRmllbGQgZjogZmllbGRzKSB7Ci0gICAgICAgICAgICBDbGFzcyBmYyA9IGYuZ2V0VHlwZSgpOwotICAgICAgICAgICAgaWYoZmMgPT0gaW50LmNsYXNzKSB7Ci0gICAgICAgICAgICAgICAgYi5hZGQoY3JlYXRlVXNlcihycywgRGF0YVR5cGUuU0lHTkVEXzMyKSwgZi5nZXROYW1lKCkpOwotICAgICAgICAgICAgfSBlbHNlIGlmKGZjID09IHNob3J0LmNsYXNzKSB7Ci0gICAgICAgICAgICAgICAgYi5hZGQoY3JlYXRlVXNlcihycywgRGF0YVR5cGUuU0lHTkVEXzE2KSwgZi5nZXROYW1lKCkpOwotICAgICAgICAgICAgfSBlbHNlIGlmKGZjID09IGJ5dGUuY2xhc3MpIHsKLSAgICAgICAgICAgICAgICBiLmFkZChjcmVhdGVVc2VyKHJzLCBEYXRhVHlwZS5TSUdORURfOCksIGYuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZihmYyA9PSBmbG9hdC5jbGFzcykgewotICAgICAgICAgICAgICAgIGIuYWRkKGNyZWF0ZVVzZXIocnMsIERhdGFUeXBlLkZMT0FUXzMyKSwgZi5nZXROYW1lKCkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbmtvd24gZmllbGQgdHlwZSIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBiLmNyZWF0ZSgpOwotICAgIH0KLQotCiAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgY3JlYXRlVXNlcihSZW5kZXJTY3JpcHQgcnMsIERhdGFUeXBlIGR0KSB7CiAgICAgICAgIHJldHVybiBuZXcgRWxlbWVudChycywgZHQsIERhdGFLaW5kLlVTRVIsIGZhbHNlLCAxKTsKQEAgLTI3OSw1OSArMzI0LDYgQEAKICAgICAgICAgcmV0dXJuIG5ldyBFbGVtZW50KHJzLCBkdCwgRGF0YUtpbmQuVVNFUiwgZmFsc2UsIHNpemUpOwogICAgIH0KIAotICAgIHB1YmxpYyBzdGF0aWMgRWxlbWVudCBjcmVhdGVJbmRleChSZW5kZXJTY3JpcHQgcnMpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBFbGVtZW50KHJzLCBEYXRhVHlwZS5VTlNJR05FRF8xNiwgRGF0YUtpbmQuSU5ERVgsIGZhbHNlLCAxKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgY3JlYXRlQXR0cmliKFJlbmRlclNjcmlwdCBycywgRGF0YVR5cGUgZHQsIERhdGFLaW5kIGRrLCBpbnQgc2l6ZSkgewotICAgICAgICBpZiAoIShkdCA9PSBEYXRhVHlwZS5GTE9BVF8zMiB8fAotICAgICAgICAgICAgICBkdCA9PSBEYXRhVHlwZS5VTlNJR05FRF84IHx8Ci0gICAgICAgICAgICAgIGR0ID09IERhdGFUeXBlLlVOU0lHTkVEXzE2IHx8Ci0gICAgICAgICAgICAgIGR0ID09IERhdGFUeXBlLlVOU0lHTkVEXzMyIHx8Ci0gICAgICAgICAgICAgIGR0ID09IERhdGFUeXBlLlNJR05FRF84IHx8Ci0gICAgICAgICAgICAgIGR0ID09IERhdGFUeXBlLlNJR05FRF8xNiB8fAotICAgICAgICAgICAgICBkdCA9PSBEYXRhVHlwZS5TSUdORURfMzIpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbnN1cHBvcnRlZCBEYXRhVHlwZSIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCEoZGsgPT0gRGF0YUtpbmQuQ09MT1IgfHwKLSAgICAgICAgICAgICAgZGsgPT0gRGF0YUtpbmQuUE9TSVRJT04gfHwKLSAgICAgICAgICAgICAgZGsgPT0gRGF0YUtpbmQuVEVYVFVSRSB8fAotICAgICAgICAgICAgICBkayA9PSBEYXRhS2luZC5OT1JNQUwgfHwKLSAgICAgICAgICAgICAgZGsgPT0gRGF0YUtpbmQuUE9JTlRfU0laRSB8fAotICAgICAgICAgICAgICBkayA9PSBEYXRhS2luZC5VU0VSKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5zdXBwb3J0ZWQgRGF0YUtpbmQiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChkayA9PSBEYXRhS2luZC5DT0xPUiAmJgotICAgICAgICAgICAgKChkdCAhPSBEYXRhVHlwZS5GTE9BVF8zMiAmJiBkdCAhPSBEYXRhVHlwZS5VTlNJR05FRF84KSB8fAotICAgICAgICAgICAgIHNpemUgPCAzIHx8IHNpemUgPiA0KSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQmFkIGNvbWJvIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGRrID09IERhdGFLaW5kLlBPU0lUSU9OICYmIChzaXplIDwgMSB8fCBzaXplID4gNCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkJhZCBjb21ibyIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChkayA9PSBEYXRhS2luZC5URVhUVVJFICYmCi0gICAgICAgICAgICAoZHQgIT0gRGF0YVR5cGUuRkxPQVRfMzIgfHwgc2l6ZSA8IDEgfHwgc2l6ZSA+IDQpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJCYWQgY29tYm8iKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZGsgPT0gRGF0YUtpbmQuTk9STUFMICYmCi0gICAgICAgICAgICAoZHQgIT0gRGF0YVR5cGUuRkxPQVRfMzIgfHwgc2l6ZSAhPSAzKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQmFkIGNvbWJvIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGRrID09IERhdGFLaW5kLlBPSU5UX1NJWkUgJiYKLSAgICAgICAgICAgIChkdCAhPSBEYXRhVHlwZS5GTE9BVF8zMiB8fCBzaXplICE9IDEpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJCYWQgY29tYm8iKTsKLSAgICAgICAgfQotCi0gICAgICAgIGJvb2xlYW4gbm9ybSA9IGZhbHNlOwotICAgICAgICBpZiAoZGsgPT0gRGF0YUtpbmQuQ09MT1IgJiYgZHQgPT0gRGF0YVR5cGUuVU5TSUdORURfOCkgewotICAgICAgICAgICAgbm9ybSA9IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbmV3IEVsZW1lbnQocnMsIGR0LCBkaywgbm9ybSwgc2l6ZSk7Ci0gICAgfQotCiAgICAgcHVibGljIHN0YXRpYyBFbGVtZW50IGNyZWF0ZVBpeGVsKFJlbmRlclNjcmlwdCBycywgRGF0YVR5cGUgZHQsIERhdGFLaW5kIGRrKSB7CiAgICAgICAgIGlmICghKGRrID09IERhdGFLaW5kLlBJWEVMX0wgfHwKICAgICAgICAgICAgICAgZGsgPT0gRGF0YUtpbmQuUElYRUxfQSB8fApkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9GaWVsZFBhY2tlci5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9GaWVsZFBhY2tlci5qYXZhCmluZGV4IGIyNmU0N2QuLmYwM2I1MWMgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvRmllbGRQYWNrZXIuamF2YQorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0ZpZWxkUGFja2VyLmphdmEKQEAgLTMzLDIxICszMywyOCBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgdm9pZCByZXNldCgpIHsKKyAgICBwdWJsaWMgdm9pZCByZXNldCgpIHsKICAgICAgICAgbVBvcyA9IDA7CiAgICAgfQorICAgIHB1YmxpYyB2b2lkIHJlc2V0KGludCBpKSB7CisgICAgICAgIG1Qb3MgPSBpOworICAgIH0KIAotICAgIHZvaWQgYWRkSTgoYnl0ZSB2KSB7CisgICAgcHVibGljIHZvaWQgc2tpcChpbnQgaSkgeworICAgICAgICBtUG9zICs9IGk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkSTgoYnl0ZSB2KSB7CiAgICAgICAgIG1EYXRhW21Qb3MrK10gPSB2OwogICAgIH0KIAotICAgIHZvaWQgYWRkSTE2KHNob3J0IHYpIHsKKyAgICBwdWJsaWMgdm9pZCBhZGRJMTYoc2hvcnQgdikgewogICAgICAgICBhbGlnbigyKTsKICAgICAgICAgbURhdGFbbVBvcysrXSA9IChieXRlKSh2ICYgMHhmZik7CiAgICAgICAgIG1EYXRhW21Qb3MrK10gPSAoYnl0ZSkodiA+PiA4KTsKICAgICB9CiAKLSAgICB2b2lkIGFkZEkzMihpbnQgdikgeworICAgIHB1YmxpYyB2b2lkIGFkZEkzMihpbnQgdikgewogICAgICAgICBhbGlnbig0KTsKICAgICAgICAgbURhdGFbbVBvcysrXSA9IChieXRlKSh2ICYgMHhmZik7CiAgICAgICAgIG1EYXRhW21Qb3MrK10gPSAoYnl0ZSkoKHYgPj4gOCkgJiAweGZmKTsKQEAgLTU1LDcgKzYyLDcgQEAKICAgICAgICAgbURhdGFbbVBvcysrXSA9IChieXRlKSgodiA+PiAyNCkgJiAweGZmKTsKICAgICB9CiAKLSAgICB2b2lkIGFkZEk2NChsb25nIHYpIHsKKyAgICBwdWJsaWMgdm9pZCBhZGRJNjQobG9uZyB2KSB7CiAgICAgICAgIGFsaWduKDgpOwogICAgICAgICBtRGF0YVttUG9zKytdID0gKGJ5dGUpKHYgJiAweGZmKTsKICAgICAgICAgbURhdGFbbVBvcysrXSA9IChieXRlKSgodiA+PiA4KSAmIDB4ZmYpOwpAQCAtNjcsMTQgKzc0LDE0IEBACiAgICAgICAgIG1EYXRhW21Qb3MrK10gPSAoYnl0ZSkoKHYgPj4gNTYpICYgMHhmZik7CiAgICAgfQogCi0gICAgdm9pZCBhZGRVOChzaG9ydCB2KSB7CisgICAgcHVibGljIHZvaWQgYWRkVTgoc2hvcnQgdikgewogICAgICAgICBpZiAoKHYgPCAwKSB8fCAodiA+IDB4ZmYpKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJTYXZpbmcgdmFsdWUgb3V0IG9mIHJhbmdlIGZvciB0eXBlIik7CiAgICAgICAgIH0KICAgICAgICAgbURhdGFbbVBvcysrXSA9IChieXRlKXY7CiAgICAgfQogCi0gICAgdm9pZCBhZGRVMTYoaW50IHYpIHsKKyAgICBwdWJsaWMgdm9pZCBhZGRVMTYoaW50IHYpIHsKICAgICAgICAgaWYgKCh2IDwgMCkgfHwgKHYgPiAweGZmZmYpKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJTYXZpbmcgdmFsdWUgb3V0IG9mIHJhbmdlIGZvciB0eXBlIik7CiAgICAgICAgIH0KQEAgLTgzLDcgKzkwLDcgQEAKICAgICAgICAgbURhdGFbbVBvcysrXSA9IChieXRlKSh2ID4+IDgpOwogICAgIH0KIAotICAgIHZvaWQgYWRkVTMyKGxvbmcgdikgeworICAgIHB1YmxpYyB2b2lkIGFkZFUzMihsb25nIHYpIHsKICAgICAgICAgaWYgKCh2IDwgMCkgfHwgKHYgPiAweGZmZmZmZmZmKSkgewogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiU2F2aW5nIHZhbHVlIG91dCBvZiByYW5nZSBmb3IgdHlwZSIpOwogICAgICAgICB9CkBAIC05NCw3ICsxMDEsNyBAQAogICAgICAgICBtRGF0YVttUG9zKytdID0gKGJ5dGUpKCh2ID4+IDI0KSAmIDB4ZmYpOwogICAgIH0KIAotICAgIHZvaWQgYWRkVTY0KGxvbmcgdikgeworICAgIHB1YmxpYyB2b2lkIGFkZFU2NChsb25nIHYpIHsKICAgICAgICAgaWYgKHYgPCAwKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJTYXZpbmcgdmFsdWUgb3V0IG9mIHJhbmdlIGZvciB0eXBlIik7CiAgICAgICAgIH0KQEAgLTEwOSwxNSArMTE2LDEzOSBAQAogICAgICAgICBtRGF0YVttUG9zKytdID0gKGJ5dGUpKCh2ID4+IDU2KSAmIDB4ZmYpOwogICAgIH0KIAotICAgIHZvaWQgYWRkRjMyKGZsb2F0IHYpIHsKKyAgICBwdWJsaWMgdm9pZCBhZGRGMzIoZmxvYXQgdikgewogICAgICAgICBhZGRJMzIoRmxvYXQuZmxvYXRUb1Jhd0ludEJpdHModikpOwogICAgIH0KIAotICAgIHZvaWQgYWRkRjY0KGZsb2F0IHYpIHsKKyAgICBwdWJsaWMgdm9pZCBhZGRGNjQoZmxvYXQgdikgewogICAgICAgICBhZGRJNjQoRG91YmxlLmRvdWJsZVRvUmF3TG9uZ0JpdHModikpOwogICAgIH0KIAotICAgIGZpbmFsIGJ5dGVbXSBnZXREYXRhKCkgeworICAgIHB1YmxpYyB2b2lkIGFkZE9iaihCYXNlT2JqIG9iaikgeworICAgICAgICBpZiAob2JqICE9IG51bGwpIHsKKyAgICAgICAgICAgIGFkZEkzMihvYmouZ2V0SUQoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhZGRJMzIoMCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRGMzIoRmxvYXQyIHYpIHsKKyAgICAgICAgYWRkRjMyKHYueCk7CisgICAgICAgIGFkZEYzMih2LnkpOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCBhZGRGMzIoRmxvYXQzIHYpIHsKKyAgICAgICAgYWRkRjMyKHYueCk7CisgICAgICAgIGFkZEYzMih2LnkpOworICAgICAgICBhZGRGMzIodi56KTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgYWRkRjMyKEZsb2F0NCB2KSB7CisgICAgICAgIGFkZEYzMih2LngpOworICAgICAgICBhZGRGMzIodi55KTsKKyAgICAgICAgYWRkRjMyKHYueik7CisgICAgICAgIGFkZEYzMih2LncpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZEk4KEJ5dGUyIHYpIHsKKyAgICAgICAgYWRkSTgodi54KTsKKyAgICAgICAgYWRkSTgodi55KTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgYWRkSTgoQnl0ZTMgdikgeworICAgICAgICBhZGRJOCh2LngpOworICAgICAgICBhZGRJOCh2LnkpOworICAgICAgICBhZGRJOCh2LnopOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCBhZGRJOChCeXRlNCB2KSB7CisgICAgICAgIGFkZEk4KHYueCk7CisgICAgICAgIGFkZEk4KHYueSk7CisgICAgICAgIGFkZEk4KHYueik7CisgICAgICAgIGFkZEk4KHYudyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkVTgoU2hvcnQyIHYpIHsKKyAgICAgICAgYWRkVTgodi54KTsKKyAgICAgICAgYWRkVTgodi55KTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgYWRkVTgoU2hvcnQzIHYpIHsKKyAgICAgICAgYWRkVTgodi54KTsKKyAgICAgICAgYWRkVTgodi55KTsKKyAgICAgICAgYWRkVTgodi56KTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgYWRkVTgoU2hvcnQ0IHYpIHsKKyAgICAgICAgYWRkVTgodi54KTsKKyAgICAgICAgYWRkVTgodi55KTsKKyAgICAgICAgYWRkVTgodi56KTsKKyAgICAgICAgYWRkVTgodi53KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRJMTYoU2hvcnQyIHYpIHsKKyAgICAgICAgYWRkSTE2KHYueCk7CisgICAgICAgIGFkZEkxNih2LnkpOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCBhZGRJMTYoU2hvcnQzIHYpIHsKKyAgICAgICAgYWRkSTE2KHYueCk7CisgICAgICAgIGFkZEkxNih2LnkpOworICAgICAgICBhZGRJMTYodi56KTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgYWRkSTE2KFNob3J0NCB2KSB7CisgICAgICAgIGFkZEkxNih2LngpOworICAgICAgICBhZGRJMTYodi55KTsKKyAgICAgICAgYWRkSTE2KHYueik7CisgICAgICAgIGFkZEkxNih2LncpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZFUxNihJbnQyIHYpIHsKKyAgICAgICAgYWRkVTE2KHYueCk7CisgICAgICAgIGFkZFUxNih2LnkpOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCBhZGRVMTYoSW50MyB2KSB7CisgICAgICAgIGFkZFUxNih2LngpOworICAgICAgICBhZGRVMTYodi55KTsKKyAgICAgICAgYWRkVTE2KHYueik7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIGFkZFUxNihJbnQ0IHYpIHsKKyAgICAgICAgYWRkVTE2KHYueCk7CisgICAgICAgIGFkZFUxNih2LnkpOworICAgICAgICBhZGRVMTYodi56KTsKKyAgICAgICAgYWRkVTE2KHYudyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkSTMyKEludDIgdikgeworICAgICAgICBhZGRJMzIodi54KTsKKyAgICAgICAgYWRkSTMyKHYueSk7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIGFkZEkzMihJbnQzIHYpIHsKKyAgICAgICAgYWRkSTMyKHYueCk7CisgICAgICAgIGFkZEkzMih2LnkpOworICAgICAgICBhZGRJMzIodi56KTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgYWRkSTMyKEludDQgdikgeworICAgICAgICBhZGRJMzIodi54KTsKKyAgICAgICAgYWRkSTMyKHYueSk7CisgICAgICAgIGFkZEkzMih2LnopOworICAgICAgICBhZGRJMzIodi53KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRVMzIoSW50MiB2KSB7CisgICAgICAgIGFkZFUzMih2LngpOworICAgICAgICBhZGRVMzIodi55KTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgYWRkVTMyKEludDMgdikgeworICAgICAgICBhZGRVMzIodi54KTsKKyAgICAgICAgYWRkVTMyKHYueSk7CisgICAgICAgIGFkZFUzMih2LnopOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCBhZGRVMzIoSW50NCB2KSB7CisgICAgICAgIGFkZFUzMih2LngpOworICAgICAgICBhZGRVMzIodi55KTsKKyAgICAgICAgYWRkVTMyKHYueik7CisgICAgICAgIGFkZFUzMih2LncpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZEJvb2xlYW4oYm9vbGVhbiB2KSB7CisgICAgICAgIGFkZEk4KChieXRlKSh2ID8gMSA6IDApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZmluYWwgYnl0ZVtdIGdldERhdGEoKSB7CiAgICAgICAgIHJldHVybiBtRGF0YTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvRmlsZUEzRC5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9GaWxlQTNELmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmIzNmYxZgotLS0gL2Rldi9udWxsCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvRmlsZUEzRC5qYXZhCkBAIC0wLDAgKzEsMjE0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnJlbmRlcnNjcmlwdDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQXNzZXRNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwRmFjdG9yeTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudXRpbC5UeXBlZFZhbHVlOworCisvKioKKyAqIEBoaWRlCisgKgorICoqLworcHVibGljIGNsYXNzIEZpbGVBM0QgZXh0ZW5kcyBCYXNlT2JqIHsKKworICAgIHB1YmxpYyBlbnVtIENsYXNzSUQgeworCisgICAgICAgIFVOS05PV04sCisgICAgICAgIE1FU0gsCisgICAgICAgIFNJTVBMRV9NRVNILAorICAgICAgICBUWVBFLAorICAgICAgICBFTEVNRU5ULAorICAgICAgICBBTExPQ0FUSU9OLAorICAgICAgICBQUk9HUkFNX1ZFUlRFWCwKKyAgICAgICAgUFJPR1JBTV9SQVNURVIsCisgICAgICAgIFBST0dSQU1fRlJBR01FTlQsCisgICAgICAgIFBST0dSQU1fU1RPUkUsCisgICAgICAgIFNBTVBMRVIsCisgICAgICAgIEFOSU1BVElPTiwKKyAgICAgICAgTElHSFQsCisgICAgICAgIEFEQVBURVJfMUQsCisgICAgICAgIEFEQVBURVJfMkQsCisgICAgICAgIFNDUklQVF9DOworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgQ2xhc3NJRCB0b0NsYXNzSUQoaW50IGludElEKSB7CisgICAgICAgICAgICByZXR1cm4gQ2xhc3NJRC52YWx1ZXMoKVtpbnRJRF07CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBSZWFkIG9ubHkgY2xhc3Mgd2l0aCBpbmRleCBlbnRyaWVzCisgICAgcHVibGljIGNsYXNzIEluZGV4RW50cnkgeworICAgICAgICBSZW5kZXJTY3JpcHQgbVJTOworICAgICAgICBpbnQgbUluZGV4OworICAgICAgICBpbnQgbUlEOworICAgICAgICBTdHJpbmcgbU5hbWU7CisgICAgICAgIENsYXNzSUQgbUNsYXNzSUQ7CisgICAgICAgIEJhc2VPYmogbUxvYWRlZE9iajsKKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgICAgICByZXR1cm4gbU5hbWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQ2xhc3NJRCBnZXRDbGFzc0lEKCkgeworICAgICAgICAgICAgcmV0dXJuIG1DbGFzc0lEOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEJhc2VPYmogZ2V0T2JqZWN0KCkgeworICAgICAgICAgICAgaWYobUxvYWRlZE9iaiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1Mb2FkZWRPYmo7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmKG1DbGFzc0lEID09IENsYXNzSUQuVU5LTk9XTikgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnQgb2JqZWN0SUQgPSBtUlMubkZpbGVBM0RHZXRFbnRyeUJ5SW5kZXgobUlELCBtSW5kZXgpOworICAgICAgICAgICAgaWYob2JqZWN0SUQgPT0gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKG1DbGFzc0lEKSB7CisgICAgICAgICAgICBjYXNlIE1FU0g6CisgICAgICAgICAgICAgICAgbUxvYWRlZE9iaiA9IG51bGw7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFNJTVBMRV9NRVNIOgorICAgICAgICAgICAgICAgIG1Mb2FkZWRPYmogPSBuZXcgU2ltcGxlTWVzaChvYmplY3RJRCwgbVJTKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgVFlQRToKKyAgICAgICAgICAgICAgICBtTG9hZGVkT2JqID0gbmV3IFR5cGUob2JqZWN0SUQsIG1SUyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEVMRU1FTlQ6CisgICAgICAgICAgICAgICAgbUxvYWRlZE9iaiA9IG51bGw7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFMTE9DQVRJT046CisgICAgICAgICAgICAgICAgbUxvYWRlZE9iaiA9IG51bGw7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFBST0dSQU1fVkVSVEVYOgorICAgICAgICAgICAgICAgIG1Mb2FkZWRPYmogPSBuZXcgUHJvZ3JhbVZlcnRleChvYmplY3RJRCwgbVJTKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUFJPR1JBTV9SQVNURVI6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFBST0dSQU1fRlJBR01FTlQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFBST0dSQU1fU1RPUkU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFNBTVBMRVI6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFOSU1BVElPTjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTElHSFQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFEQVBURVJfMUQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFEQVBURVJfMkQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFNDUklQVF9DOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gbUxvYWRlZE9iajsKKyAgICAgICAgfQorCisgICAgICAgIEluZGV4RW50cnkoUmVuZGVyU2NyaXB0IHJzLCBpbnQgaW5kZXgsIGludCBpZCwgU3RyaW5nIG5hbWUsIENsYXNzSUQgY2xhc3NJRCkgeworICAgICAgICAgICAgbVJTID0gcnM7CisgICAgICAgICAgICBtSW5kZXggPSBpbmRleDsKKyAgICAgICAgICAgIG1JRCA9IGlkOworICAgICAgICAgICAgbU5hbWUgPSBuYW1lOworICAgICAgICAgICAgbUNsYXNzSUQgPSBjbGFzc0lEOworICAgICAgICAgICAgbUxvYWRlZE9iaiA9IG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBJbmRleEVudHJ5W10gbUZpbGVFbnRyaWVzOworCisgICAgRmlsZUEzRChpbnQgaWQsIFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBzdXBlcihycyk7CisgICAgICAgIG1JRCA9IGlkOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBpbml0RW50cmllcygpIHsKKyAgICAgICAgaW50IG51bUZpbGVFbnRyaWVzID0gbVJTLm5GaWxlQTNER2V0TnVtSW5kZXhFbnRyaWVzKG1JRCk7CisgICAgICAgIGlmKG51bUZpbGVFbnRyaWVzIDw9IDApIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIG1GaWxlRW50cmllcyA9IG5ldyBJbmRleEVudHJ5W251bUZpbGVFbnRyaWVzXTsKKyAgICAgICAgaW50W10gaWRzID0gbmV3IGludFtudW1GaWxlRW50cmllc107CisgICAgICAgIFN0cmluZ1tdIG5hbWVzID0gbmV3IFN0cmluZ1tudW1GaWxlRW50cmllc107CisKKyAgICAgICAgbVJTLm5GaWxlQTNER2V0SW5kZXhFbnRyaWVzKG1JRCwgbnVtRmlsZUVudHJpZXMsIGlkcywgbmFtZXMpOworCisgICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCBudW1GaWxlRW50cmllczsgaSArKykgeworICAgICAgICAgICAgbUZpbGVFbnRyaWVzW2ldID0gbmV3IEluZGV4RW50cnkobVJTLCBpLCBtSUQsIG5hbWVzW2ldLCBDbGFzc0lELnRvQ2xhc3NJRChpZHNbaV0pKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0TnVtSW5kZXhFbnRyaWVzKCkgeworICAgICAgICBpZihtRmlsZUVudHJpZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1GaWxlRW50cmllcy5sZW5ndGg7CisgICAgfQorCisgICAgcHVibGljIEluZGV4RW50cnkgZ2V0SW5kZXhFbnRyeShpbnQgaW5kZXgpIHsKKyAgICAgICAgaWYoZ2V0TnVtSW5kZXhFbnRyaWVzKCkgPT0gMCB8fCBpbmRleCA8IDAgfHwgaW5kZXggPj0gbUZpbGVFbnRyaWVzLmxlbmd0aCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1GaWxlRW50cmllc1tpbmRleF07CisgICAgfQorCisgICAgc3RhdGljIHB1YmxpYyBGaWxlQTNEIGNyZWF0ZUZyb21SZXNvdXJjZShSZW5kZXJTY3JpcHQgcnMsIFJlc291cmNlcyByZXMsIGludCBpZCkKKyAgICAgICAgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CisKKyAgICAgICAgcnMudmFsaWRhdGUoKTsKKyAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgZmluYWwgVHlwZWRWYWx1ZSB2YWx1ZSA9IG5ldyBUeXBlZFZhbHVlKCk7CisgICAgICAgICAgICBpcyA9IHJlcy5vcGVuUmF3UmVzb3VyY2UoaWQsIHZhbHVlKTsKKworICAgICAgICAgICAgaW50IGFzc2V0ID0gKChBc3NldE1hbmFnZXIuQXNzZXRJbnB1dFN0cmVhbSkgaXMpLmdldEFzc2V0SW50KCk7CisKKyAgICAgICAgICAgIGludCBmaWxlSWQgPSBycy5uRmlsZUEzRENyZWF0ZUZyb21Bc3NldFN0cmVhbShhc3NldCk7CisKKyAgICAgICAgICAgIGlmKGZpbGVJZCA9PSAwKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiTG9hZCBmYWlsZWQuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGaWxlQTNEIGZhM2QgPSBuZXcgRmlsZUEzRChmaWxlSWQsIHJzKTsKKyAgICAgICAgICAgIGZhM2QuaW5pdEVudHJpZXMoKTsKKyAgICAgICAgICAgIHJldHVybiBmYTNkOworCisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBJZ25vcmUKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChpcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgaXMuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIElnbm9yZQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvVmVjdG9yMmYuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvRmxvYXQyLmphdmEKc2ltaWxhcml0eSBpbmRleCA5MyUKcmVuYW1lIGZyb20gZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9WZWN0b3IyZi5qYXZhCnJlbmFtZSB0byBncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0Zsb2F0Mi5qYXZhCmluZGV4IDU2N2Q1N2ZhLi44ZmVhOTFmIDEwMDY0NAotLS0gYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1ZlY3RvcjJmLmphdmEKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9GbG9hdDIuamF2YQpAQCAtMjQsOCArMjQsOCBAQAogICogQGhpZGUKICAqCiAgKiovCi1wdWJsaWMgY2xhc3MgVmVjdG9yMmYgewotICAgIHB1YmxpYyBWZWN0b3IyZigpIHsKK3B1YmxpYyBjbGFzcyBGbG9hdDIgeworICAgIHB1YmxpYyBGbG9hdDIoKSB7CiAgICAgfQogCiAgICAgcHVibGljIGZsb2F0IHg7CmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1ZlY3RvcjNmLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0Zsb2F0My5qYXZhCnNpbWlsYXJpdHkgaW5kZXggOTQlCnJlbmFtZSBmcm9tIGdyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvVmVjdG9yM2YuamF2YQpyZW5hbWUgdG8gZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9GbG9hdDMuamF2YQppbmRleCBmMjg0MmYzLi45ZDllNDA2IDEwMDY0NAotLS0gYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1ZlY3RvcjNmLmphdmEKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9GbG9hdDMuamF2YQpAQCAtMjQsOCArMjQsOCBAQAogICogQGhpZGUKICAqCiAgKiovCi1wdWJsaWMgY2xhc3MgVmVjdG9yM2YgewotICAgIHB1YmxpYyBWZWN0b3IzZigpIHsKK3B1YmxpYyBjbGFzcyBGbG9hdDMgeworICAgIHB1YmxpYyBGbG9hdDMoKSB7CiAgICAgfQogCiAgICAgcHVibGljIGZsb2F0IHg7CmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1ZlY3RvcjRmLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0Zsb2F0NC5qYXZhCnNpbWlsYXJpdHkgaW5kZXggOTQlCnJlbmFtZSBmcm9tIGdyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvVmVjdG9yNGYuamF2YQpyZW5hbWUgdG8gZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9GbG9hdDQuamF2YQppbmRleCBmYWJkOTU5Li5hNzAzZTgwIDEwMDY0NAotLS0gYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1ZlY3RvcjRmLmphdmEKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9GbG9hdDQuamF2YQpAQCAtMjQsOCArMjQsOCBAQAogICogQGhpZGUKICAqCiAgKiovCi1wdWJsaWMgY2xhc3MgVmVjdG9yNGYgewotICAgIHB1YmxpYyBWZWN0b3I0ZigpIHsKK3B1YmxpYyBjbGFzcyBGbG9hdDQgeworICAgIHB1YmxpYyBGbG9hdDQoKSB7CiAgICAgfQogCiAgICAgcHVibGljIGZsb2F0IHg7CmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0ZvbnQuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvRm9udC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxZjg4MjcKLS0tIC9kZXYvbnVsbAorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0ZvbnQuamF2YQpAQCAtMCwwICsxLDU5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnJlbmRlcnNjcmlwdDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQXNzZXRNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC51dGlsLlR5cGVkVmFsdWU7CisKKy8qKgorICogQGhpZGUKKyAqCisgKiovCitwdWJsaWMgY2xhc3MgRm9udCBleHRlbmRzIEJhc2VPYmogeworCisgICAgRm9udChpbnQgaWQsIFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBzdXBlcihycyk7CisgICAgICAgIG1JRCA9IGlkOworICAgIH0KKworICAgIHN0YXRpYyBwdWJsaWMgRm9udCBjcmVhdGUoUmVuZGVyU2NyaXB0IHJzLCBSZXNvdXJjZXMgcmVzLCBTdHJpbmcgZmlsZU5hbWUsIGludCBzaXplKQorICAgICAgICB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKKworICAgICAgICBycy52YWxpZGF0ZSgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IGRwaSA9IHJlcy5nZXREaXNwbGF5TWV0cmljcygpLmRlbnNpdHlEcGk7CisgICAgICAgICAgICBpbnQgZm9udElkID0gcnMubkZvbnRDcmVhdGVGcm9tRmlsZShmaWxlTmFtZSwgc2l6ZSwgZHBpKTsKKworICAgICAgICAgICAgaWYoZm9udElkID09IDApIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJMb2FkIGxvYWRpbmcgYSBmb250Iik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGb250IHJzRm9udCA9IG5ldyBGb250KGZvbnRJZCwgcnMpOworCisgICAgICAgICAgICByZXR1cm4gcnNGb250OworCisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBJZ25vcmUKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvVmVjdG9yMmYuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvSW50Mi5qYXZhCnNpbWlsYXJpdHkgaW5kZXggODklCmNvcHkgZnJvbSBncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1ZlY3RvcjJmLmphdmEKY29weSB0byBncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0ludDIuamF2YQppbmRleCA1NjdkNTdmYS4uNTZlMmZlOSAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9WZWN0b3IyZi5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvSW50Mi5qYXZhCkBAIC0yNCwxMiArMjQsMTIgQEAKICAqIEBoaWRlCiAgKgogICoqLwotcHVibGljIGNsYXNzIFZlY3RvcjJmIHsKLSAgICBwdWJsaWMgVmVjdG9yMmYoKSB7CitwdWJsaWMgY2xhc3MgSW50MiB7CisgICAgcHVibGljIEludDIoKSB7CiAgICAgfQogCi0gICAgcHVibGljIGZsb2F0IHg7Ci0gICAgcHVibGljIGZsb2F0IHk7CisgICAgcHVibGljIGludCB4OworICAgIHB1YmxpYyBpbnQgeTsKIH0KIAogCmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1ZlY3RvcjJmLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0ludDMuamF2YQpzaW1pbGFyaXR5IGluZGV4IDg4JQpjb3B5IGZyb20gZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9WZWN0b3IyZi5qYXZhCmNvcHkgdG8gZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9JbnQzLmphdmEKaW5kZXggNTY3ZDU3ZmEuLjFiMjc1MDkgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvVmVjdG9yMmYuamF2YQorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0ludDMuamF2YQpAQCAtMjQsMTIgKzI0LDEzIEBACiAgKiBAaGlkZQogICoKICAqKi8KLXB1YmxpYyBjbGFzcyBWZWN0b3IyZiB7Ci0gICAgcHVibGljIFZlY3RvcjJmKCkgeworcHVibGljIGNsYXNzIEludDMgeworICAgIHB1YmxpYyBJbnQzKCkgewogICAgIH0KIAotICAgIHB1YmxpYyBmbG9hdCB4OwotICAgIHB1YmxpYyBmbG9hdCB5OworICAgIHB1YmxpYyBpbnQgeDsKKyAgICBwdWJsaWMgaW50IHk7CisgICAgcHVibGljIGludCB6OwogfQogCiAKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvVmVjdG9yMmYuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvSW50NC5qYXZhCnNpbWlsYXJpdHkgaW5kZXggODYlCmNvcHkgZnJvbSBncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1ZlY3RvcjJmLmphdmEKY29weSB0byBncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0ludDQuamF2YQppbmRleCA1NjdkNTdmYS4uM2Q2ZjNmNSAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9WZWN0b3IyZi5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvSW50NC5qYXZhCkBAIC0yNCwxNCArMjQsMTUgQEAKICAqIEBoaWRlCiAgKgogICoqLwotcHVibGljIGNsYXNzIFZlY3RvcjJmIHsKLSAgICBwdWJsaWMgVmVjdG9yMmYoKSB7CitwdWJsaWMgY2xhc3MgSW50NCB7CisgICAgcHVibGljIEludDQoKSB7CiAgICAgfQogCi0gICAgcHVibGljIGZsb2F0IHg7Ci0gICAgcHVibGljIGZsb2F0IHk7CisgICAgcHVibGljIGludCB4OworICAgIHB1YmxpYyBpbnQgeTsKKyAgICBwdWJsaWMgaW50IHo7CisgICAgcHVibGljIGludCB3OwogfQogCiAKIAotCmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1ZlY3RvcjJmLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0xvbmcyLmphdmEKc2ltaWxhcml0eSBpbmRleCA4OSUKY29weSBmcm9tIGdyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvVmVjdG9yMmYuamF2YQpjb3B5IHRvIGdyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvTG9uZzIuamF2YQppbmRleCA1NjdkNTdmYS4uMTFlYWQyZiAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9WZWN0b3IyZi5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvTG9uZzIuamF2YQpAQCAtMjQsMTIgKzI0LDEyIEBACiAgKiBAaGlkZQogICoKICAqKi8KLXB1YmxpYyBjbGFzcyBWZWN0b3IyZiB7Ci0gICAgcHVibGljIFZlY3RvcjJmKCkgeworcHVibGljIGNsYXNzIExvbmcyIHsKKyAgICBwdWJsaWMgTG9uZzIoKSB7CiAgICAgfQogCi0gICAgcHVibGljIGZsb2F0IHg7Ci0gICAgcHVibGljIGZsb2F0IHk7CisgICAgcHVibGljIGxvbmcgeDsKKyAgICBwdWJsaWMgbG9uZyB5OwogfQogCiAKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvVmVjdG9yMmYuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvTG9uZzMuamF2YQpzaW1pbGFyaXR5IGluZGV4IDg3JQpjb3B5IGZyb20gZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9WZWN0b3IyZi5qYXZhCmNvcHkgdG8gZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9Mb25nMy5qYXZhCmluZGV4IDU2N2Q1N2ZhLi4xNjA0NTMyIDEwMDY0NAotLS0gYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1ZlY3RvcjJmLmphdmEKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9Mb25nMy5qYXZhCkBAIC0yNCwxMiArMjQsMTMgQEAKICAqIEBoaWRlCiAgKgogICoqLwotcHVibGljIGNsYXNzIFZlY3RvcjJmIHsKLSAgICBwdWJsaWMgVmVjdG9yMmYoKSB7CitwdWJsaWMgY2xhc3MgTG9uZzMgeworICAgIHB1YmxpYyBMb25nMygpIHsKICAgICB9CiAKLSAgICBwdWJsaWMgZmxvYXQgeDsKLSAgICBwdWJsaWMgZmxvYXQgeTsKKyAgICBwdWJsaWMgbG9uZyB4OworICAgIHB1YmxpYyBsb25nIHk7CisgICAgcHVibGljIGxvbmcgejsKIH0KIAogCmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1ZlY3RvcjJmLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0xvbmc0LmphdmEKc2ltaWxhcml0eSBpbmRleCA4NSUKY29weSBmcm9tIGdyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvVmVjdG9yMmYuamF2YQpjb3B5IHRvIGdyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvTG9uZzQuamF2YQppbmRleCA1NjdkNTdmYS4uMmZkMjc0NyAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9WZWN0b3IyZi5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvTG9uZzQuamF2YQpAQCAtMjQsMTQgKzI0LDE1IEBACiAgKiBAaGlkZQogICoKICAqKi8KLXB1YmxpYyBjbGFzcyBWZWN0b3IyZiB7Ci0gICAgcHVibGljIFZlY3RvcjJmKCkgeworcHVibGljIGNsYXNzIExvbmc0IHsKKyAgICBwdWJsaWMgTG9uZzQoKSB7CiAgICAgfQogCi0gICAgcHVibGljIGZsb2F0IHg7Ci0gICAgcHVibGljIGZsb2F0IHk7CisgICAgcHVibGljIGxvbmcgeDsKKyAgICBwdWJsaWMgbG9uZyB5OworICAgIHB1YmxpYyBsb25nIHo7CisgICAgcHVibGljIGxvbmcgdzsKIH0KIAogCiAKLQpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9Qcm9ncmFtU3RvcmUuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvUHJvZ3JhbVN0b3JlLmphdmEKaW5kZXggNjliZTI0NS4uZjU1ODExNyAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9Qcm9ncmFtU3RvcmUuamF2YQorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1Byb2dyYW1TdG9yZS5qYXZhCkBAIC0xNDcsMTcgKzE0NywxNyBAQAogICAgICAgICAgICAgaWYgKGIubU91dCAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgb3V0SUQgPSBiLm1PdXQubUlEOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgcnMublByb2dyYW1GcmFnbWVudFN0b3JlQmVnaW4oaW5JRCwgb3V0SUQpOwotICAgICAgICAgICAgcnMublByb2dyYW1GcmFnbWVudFN0b3JlRGVwdGhGdW5jKGIubURlcHRoRnVuYy5tSUQpOwotICAgICAgICAgICAgcnMublByb2dyYW1GcmFnbWVudFN0b3JlRGVwdGhNYXNrKGIubURlcHRoTWFzayk7Ci0gICAgICAgICAgICBycy5uUHJvZ3JhbUZyYWdtZW50U3RvcmVDb2xvck1hc2soYi5tQ29sb3JNYXNrUiwKKyAgICAgICAgICAgIHJzLm5Qcm9ncmFtU3RvcmVCZWdpbihpbklELCBvdXRJRCk7CisgICAgICAgICAgICBycy5uUHJvZ3JhbVN0b3JlRGVwdGhGdW5jKGIubURlcHRoRnVuYy5tSUQpOworICAgICAgICAgICAgcnMublByb2dyYW1TdG9yZURlcHRoTWFzayhiLm1EZXB0aE1hc2spOworICAgICAgICAgICAgcnMublByb2dyYW1TdG9yZUNvbG9yTWFzayhiLm1Db2xvck1hc2tSLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIubUNvbG9yTWFza0csCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYi5tQ29sb3JNYXNrQiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiLm1Db2xvck1hc2tBKTsKLSAgICAgICAgICAgIHJzLm5Qcm9ncmFtRnJhZ21lbnRTdG9yZUJsZW5kRnVuYyhiLm1CbGVuZFNyYy5tSUQsIGIubUJsZW5kRHN0Lm1JRCk7Ci0gICAgICAgICAgICBycy5uUHJvZ3JhbUZyYWdtZW50U3RvcmVEaXRoZXIoYi5tRGl0aGVyKTsKKyAgICAgICAgICAgIHJzLm5Qcm9ncmFtU3RvcmVCbGVuZEZ1bmMoYi5tQmxlbmRTcmMubUlELCBiLm1CbGVuZERzdC5tSUQpOworICAgICAgICAgICAgcnMublByb2dyYW1TdG9yZURpdGhlcihiLm1EaXRoZXIpOwogCi0gICAgICAgICAgICBpbnQgaWQgPSBycy5uUHJvZ3JhbUZyYWdtZW50U3RvcmVDcmVhdGUoKTsKKyAgICAgICAgICAgIGludCBpZCA9IHJzLm5Qcm9ncmFtU3RvcmVDcmVhdGUoKTsKICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvZ3JhbVN0b3JlKGlkLCBycyk7CiAgICAgICAgIH0KIApkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9SZW5kZXJTY3JpcHQuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvUmVuZGVyU2NyaXB0LmphdmEKaW5kZXggYTkzNTI0My4uYjJlNWIwMiAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9SZW5kZXJTY3JpcHQuamF2YQorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1JlbmRlclNjcmlwdC5qYXZhCkBAIC02OCwxMCArNjgsMTEgQEAKICAgICBuYXRpdmUgdm9pZCBuQ29udGV4dFNldFN1cmZhY2UoaW50IHcsIGludCBoLCBTdXJmYWNlIHN1cik7CiAgICAgbmF0aXZlIHZvaWQgbkNvbnRleHRTZXRQcmlvcml0eShpbnQgcCk7CiAgICAgbmF0aXZlIHZvaWQgbkNvbnRleHREdW1wKGludCBiaXRzKTsKKyAgICBuYXRpdmUgdm9pZCBuQ29udGV4dEZpbmlzaCgpOwogCiAgICAgbmF0aXZlIHZvaWQgbkNvbnRleHRCaW5kUm9vdFNjcmlwdChpbnQgc2NyaXB0KTsKICAgICBuYXRpdmUgdm9pZCBuQ29udGV4dEJpbmRTYW1wbGVyKGludCBzYW1wbGVyLCBpbnQgc2xvdCk7Ci0gICAgbmF0aXZlIHZvaWQgbkNvbnRleHRCaW5kUHJvZ3JhbUZyYWdtZW50U3RvcmUoaW50IHBmcyk7CisgICAgbmF0aXZlIHZvaWQgbkNvbnRleHRCaW5kUHJvZ3JhbVN0b3JlKGludCBwZnMpOwogICAgIG5hdGl2ZSB2b2lkIG5Db250ZXh0QmluZFByb2dyYW1GcmFnbWVudChpbnQgcGYpOwogICAgIG5hdGl2ZSB2b2lkIG5Db250ZXh0QmluZFByb2dyYW1WZXJ0ZXgoaW50IHBmKTsKICAgICBuYXRpdmUgdm9pZCBuQ29udGV4dEJpbmRQcm9ncmFtUmFzdGVyKGludCBwcik7CkBAIC0xMTcsNiArMTE4LDEzIEBACiAgICAgbmF0aXZlIHZvaWQgbkFsbG9jYXRpb25TdWJEYXRhRnJvbU9iamVjdChpbnQgaWQsIFR5cGUgdCwgaW50IG9mZnNldCwgT2JqZWN0IG8pOwogICAgIG5hdGl2ZSB2b2lkIG5BbGxvY2F0aW9uU3ViUmVhZEZyb21PYmplY3QoaW50IGlkLCBUeXBlIHQsIGludCBvZmZzZXQsIE9iamVjdCBvKTsKIAorICAgIG5hdGl2ZSBpbnQgIG5GaWxlQTNEQ3JlYXRlRnJvbUFzc2V0U3RyZWFtKGludCBhc3NldFN0cmVhbSk7CisgICAgbmF0aXZlIGludCAgbkZpbGVBM0RHZXROdW1JbmRleEVudHJpZXMoaW50IGZpbGVBM0QpOworICAgIG5hdGl2ZSB2b2lkIG5GaWxlQTNER2V0SW5kZXhFbnRyaWVzKGludCBmaWxlQTNELCBpbnQgbnVtRW50cmllcywgaW50W10gSURzLCBTdHJpbmdbXSBuYW1lcyk7CisgICAgbmF0aXZlIGludCAgbkZpbGVBM0RHZXRFbnRyeUJ5SW5kZXgoaW50IGZpbGVBM0QsIGludCBpbmRleCk7CisKKyAgICBuYXRpdmUgaW50ICBuRm9udENyZWF0ZUZyb21GaWxlKFN0cmluZyBmaWxlTmFtZSwgaW50IHNpemUsIGludCBkcGkpOworCiAgICAgbmF0aXZlIHZvaWQgbkFkYXB0ZXIxREJpbmRBbGxvY2F0aW9uKGludCBhZCwgaW50IGFsbG9jKTsKICAgICBuYXRpdmUgdm9pZCBuQWRhcHRlcjFEU2V0Q29uc3RyYWludChpbnQgYWQsIGludCBkaW0sIGludCB2YWx1ZSk7CiAgICAgbmF0aXZlIHZvaWQgbkFkYXB0ZXIxRERhdGEoaW50IGFkLCBpbnRbXSBkKTsKQEAgLTEzNCwzMiArMTQyLDI4IEBACiAgICAgbmF0aXZlIGludCAgbkFkYXB0ZXIyRENyZWF0ZSgpOwogCiAgICAgbmF0aXZlIHZvaWQgblNjcmlwdEJpbmRBbGxvY2F0aW9uKGludCBzY3JpcHQsIGludCBhbGxvYywgaW50IHNsb3QpOwotICAgIG5hdGl2ZSB2b2lkIG5TY3JpcHRTZXRDbGVhckNvbG9yKGludCBzY3JpcHQsIGZsb2F0IHIsIGZsb2F0IGcsIGZsb2F0IGIsIGZsb2F0IGEpOwotICAgIG5hdGl2ZSB2b2lkIG5TY3JpcHRTZXRDbGVhckRlcHRoKGludCBzY3JpcHQsIGZsb2F0IGRlcHRoKTsKLSAgICBuYXRpdmUgdm9pZCBuU2NyaXB0U2V0Q2xlYXJTdGVuY2lsKGludCBzY3JpcHQsIGludCBzdGVuY2lsKTsKICAgICBuYXRpdmUgdm9pZCBuU2NyaXB0U2V0VGltZVpvbmUoaW50IHNjcmlwdCwgYnl0ZVtdIHRpbWVab25lKTsKLSAgICBuYXRpdmUgdm9pZCBuU2NyaXB0U2V0VHlwZShpbnQgdHlwZSwgYm9vbGVhbiB3cml0YWJsZSwgU3RyaW5nIG5hbWUsIGludCBzbG90KTsKLSAgICBuYXRpdmUgdm9pZCBuU2NyaXB0U2V0Um9vdChib29sZWFuIGlzUm9vdCk7Ci0gICAgbmF0aXZlIHZvaWQgblNjcmlwdFNldEludm9rYWJsZShTdHJpbmcgbmFtZSwgaW50IHNsb3QpOwogICAgIG5hdGl2ZSB2b2lkIG5TY3JpcHRJbnZva2UoaW50IGlkLCBpbnQgc2xvdCk7CisgICAgbmF0aXZlIHZvaWQgblNjcmlwdEludm9rZVYoaW50IGlkLCBpbnQgc2xvdCwgYnl0ZVtdIHBhcmFtcyk7CisgICAgbmF0aXZlIHZvaWQgblNjcmlwdFNldFZhckkoaW50IGlkLCBpbnQgc2xvdCwgaW50IHZhbCk7CisgICAgbmF0aXZlIHZvaWQgblNjcmlwdFNldFZhckYoaW50IGlkLCBpbnQgc2xvdCwgZmxvYXQgdmFsKTsKKyAgICBuYXRpdmUgdm9pZCBuU2NyaXB0U2V0VmFyVihpbnQgaWQsIGludCBzbG90LCBieXRlW10gdmFsKTsKIAogICAgIG5hdGl2ZSB2b2lkIG5TY3JpcHRDQmVnaW4oKTsKICAgICBuYXRpdmUgdm9pZCBuU2NyaXB0Q1NldFNjcmlwdChieXRlW10gc2NyaXB0LCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKTsKICAgICBuYXRpdmUgaW50ICBuU2NyaXB0Q0NyZWF0ZSgpOwotICAgIG5hdGl2ZSB2b2lkIG5TY3JpcHRDQWRkRGVmaW5lSTMyKFN0cmluZyBuYW1lLCBpbnQgdmFsdWUpOwotICAgIG5hdGl2ZSB2b2lkIG5TY3JpcHRDQWRkRGVmaW5lRihTdHJpbmcgbmFtZSwgZmxvYXQgdmFsdWUpOwogCiAgICAgbmF0aXZlIHZvaWQgblNhbXBsZXJCZWdpbigpOwogICAgIG5hdGl2ZSB2b2lkIG5TYW1wbGVyU2V0KGludCBwYXJhbSwgaW50IHZhbHVlKTsKICAgICBuYXRpdmUgaW50ICBuU2FtcGxlckNyZWF0ZSgpOwogCi0gICAgbmF0aXZlIHZvaWQgblByb2dyYW1GcmFnbWVudFN0b3JlQmVnaW4oaW50IGluLCBpbnQgb3V0KTsKLSAgICBuYXRpdmUgdm9pZCBuUHJvZ3JhbUZyYWdtZW50U3RvcmVEZXB0aEZ1bmMoaW50IGZ1bmMpOwotICAgIG5hdGl2ZSB2b2lkIG5Qcm9ncmFtRnJhZ21lbnRTdG9yZURlcHRoTWFzayhib29sZWFuIGVuYWJsZSk7Ci0gICAgbmF0aXZlIHZvaWQgblByb2dyYW1GcmFnbWVudFN0b3JlQ29sb3JNYXNrKGJvb2xlYW4gciwgYm9vbGVhbiBnLCBib29sZWFuIGIsIGJvb2xlYW4gYSk7Ci0gICAgbmF0aXZlIHZvaWQgblByb2dyYW1GcmFnbWVudFN0b3JlQmxlbmRGdW5jKGludCBzcmMsIGludCBkc3QpOwotICAgIG5hdGl2ZSB2b2lkIG5Qcm9ncmFtRnJhZ21lbnRTdG9yZURpdGhlcihib29sZWFuIGVuYWJsZSk7Ci0gICAgbmF0aXZlIGludCAgblByb2dyYW1GcmFnbWVudFN0b3JlQ3JlYXRlKCk7CisgICAgbmF0aXZlIHZvaWQgblByb2dyYW1TdG9yZUJlZ2luKGludCBpbiwgaW50IG91dCk7CisgICAgbmF0aXZlIHZvaWQgblByb2dyYW1TdG9yZURlcHRoRnVuYyhpbnQgZnVuYyk7CisgICAgbmF0aXZlIHZvaWQgblByb2dyYW1TdG9yZURlcHRoTWFzayhib29sZWFuIGVuYWJsZSk7CisgICAgbmF0aXZlIHZvaWQgblByb2dyYW1TdG9yZUNvbG9yTWFzayhib29sZWFuIHIsIGJvb2xlYW4gZywgYm9vbGVhbiBiLCBib29sZWFuIGEpOworICAgIG5hdGl2ZSB2b2lkIG5Qcm9ncmFtU3RvcmVCbGVuZEZ1bmMoaW50IHNyYywgaW50IGRzdCk7CisgICAgbmF0aXZlIHZvaWQgblByb2dyYW1TdG9yZURpdGhlcihib29sZWFuIGVuYWJsZSk7CisgICAgbmF0aXZlIGludCAgblByb2dyYW1TdG9yZUNyZWF0ZSgpOwogCiAgICAgbmF0aXZlIGludCAgblByb2dyYW1SYXN0ZXJDcmVhdGUoaW50IGluLCBpbnQgb3V0LCBib29sZWFuIHBvaW50U21vb3RoLCBib29sZWFuIGxpbmVTbW9vdGgsIGJvb2xlYW4gcG9pbnRTcHJpdGUpOwogICAgIG5hdGl2ZSB2b2lkIG5Qcm9ncmFtUmFzdGVyU2V0TGluZVdpZHRoKGludCBwciwgZmxvYXQgdik7CkBAIC0xOTUsMTMgKzE5OSwyNSBAQAogICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsiRmllbGRDYW5CZUxvY2FsIn0pCiAgICAgcHJvdGVjdGVkIE1lc3NhZ2VUaHJlYWQgbU1lc3NhZ2VUaHJlYWQ7CiAKLSAgICBFbGVtZW50IG1FbGVtZW50X1VTRVJfVTg7Ci0gICAgRWxlbWVudCBtRWxlbWVudF9VU0VSX0k4OwotICAgIEVsZW1lbnQgbUVsZW1lbnRfVVNFUl9VMTY7Ci0gICAgRWxlbWVudCBtRWxlbWVudF9VU0VSX0kxNjsKLSAgICBFbGVtZW50IG1FbGVtZW50X1VTRVJfVTMyOwotICAgIEVsZW1lbnQgbUVsZW1lbnRfVVNFUl9JMzI7Ci0gICAgRWxlbWVudCBtRWxlbWVudF9VU0VSX0YzMjsKKyAgICBFbGVtZW50IG1FbGVtZW50X1U4OworICAgIEVsZW1lbnQgbUVsZW1lbnRfSTg7CisgICAgRWxlbWVudCBtRWxlbWVudF9VMTY7CisgICAgRWxlbWVudCBtRWxlbWVudF9JMTY7CisgICAgRWxlbWVudCBtRWxlbWVudF9VMzI7CisgICAgRWxlbWVudCBtRWxlbWVudF9JMzI7CisgICAgRWxlbWVudCBtRWxlbWVudF9GMzI7CisgICAgRWxlbWVudCBtRWxlbWVudF9CT09MRUFOOworCisgICAgRWxlbWVudCBtRWxlbWVudF9FTEVNRU5UOworICAgIEVsZW1lbnQgbUVsZW1lbnRfVFlQRTsKKyAgICBFbGVtZW50IG1FbGVtZW50X0FMTE9DQVRJT047CisgICAgRWxlbWVudCBtRWxlbWVudF9TQU1QTEVSOworICAgIEVsZW1lbnQgbUVsZW1lbnRfU0NSSVBUOworICAgIEVsZW1lbnQgbUVsZW1lbnRfTUVTSDsKKyAgICBFbGVtZW50IG1FbGVtZW50X1BST0dSQU1fRlJBR01FTlQ7CisgICAgRWxlbWVudCBtRWxlbWVudF9QUk9HUkFNX1ZFUlRFWDsKKyAgICBFbGVtZW50IG1FbGVtZW50X1BST0dSQU1fUkFTVEVSOworICAgIEVsZW1lbnQgbUVsZW1lbnRfUFJPR1JBTV9TVE9SRTsKIAogICAgIEVsZW1lbnQgbUVsZW1lbnRfQV84OwogICAgIEVsZW1lbnQgbUVsZW1lbnRfUkdCXzU2NTsKQEAgLTIxMCwxMyArMjI2LDE3IEBACiAgICAgRWxlbWVudCBtRWxlbWVudF9SR0JBXzQ0NDQ7CiAgICAgRWxlbWVudCBtRWxlbWVudF9SR0JBXzg4ODg7CiAKLSAgICBFbGVtZW50IG1FbGVtZW50X0lOREVYXzE2OwotICAgIEVsZW1lbnQgbUVsZW1lbnRfUE9TSVRJT05fMjsKLSAgICBFbGVtZW50IG1FbGVtZW50X1BPU0lUSU9OXzM7Ci0gICAgRWxlbWVudCBtRWxlbWVudF9URVhUVVJFXzI7Ci0gICAgRWxlbWVudCBtRWxlbWVudF9OT1JNQUxfMzsKLSAgICBFbGVtZW50IG1FbGVtZW50X0NPTE9SX1U4XzQ7Ci0gICAgRWxlbWVudCBtRWxlbWVudF9DT0xPUl9GMzJfNDsKKyAgICBFbGVtZW50IG1FbGVtZW50X0ZMT0FUXzI7CisgICAgRWxlbWVudCBtRWxlbWVudF9GTE9BVF8zOworICAgIEVsZW1lbnQgbUVsZW1lbnRfRkxPQVRfNDsKKyAgICBFbGVtZW50IG1FbGVtZW50X1VDSEFSXzQ7CisKKyAgICBTYW1wbGVyIG1TYW1wbGVyX0NMQU1QX05FQVJFU1Q7CisgICAgU2FtcGxlciBtU2FtcGxlcl9DTEFNUF9MSU5FQVI7CisgICAgU2FtcGxlciBtU2FtcGxlcl9DTEFNUF9MSU5FQVJfTUlQX0xJTkVBUjsKKyAgICBTYW1wbGVyIG1TYW1wbGVyX1dSQVBfTkVBUkVTVDsKKyAgICBTYW1wbGVyIG1TYW1wbGVyX1dSQVBfTElORUFSOworICAgIFNhbXBsZXIgbVNhbXBsZXJfV1JBUF9MSU5FQVJfTUlQX0xJTkVBUjsKIAogICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAgLy8KQEAgLTI4Miw3ICszMDIsNiBAQAogICAgICAgICAgICAgICAgICAgICBtUlMubU1lc3NhZ2VDYWxsYmFjay5tSUQgPSBtc2c7CiAgICAgICAgICAgICAgICAgICAgIG1SUy5tTWVzc2FnZUNhbGxiYWNrLnJ1bigpOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvL0xvZy5kKExPR19UQUcsICJNZXNzYWdlVGhyZWFkIG1zZyAiICsgbXNnICsgIiB2MSAiICsgcmJ1ZlswXSArICIgdjIgIiArIHJidWZbMV0gKyAiIHYzICIgK3JidWZbMl0pOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIk1lc3NhZ2VUaHJlYWQgZXhpdGluZy4iKTsKICAgICAgICAgfQpAQCAtMzA3LDYgKzMyNiwxMCBAQAogICAgICAgICBuQ29udGV4dER1bXAoYml0cyk7CiAgICAgfQogCisgICAgcHVibGljIHZvaWQgZmluaXNoKCkgeworICAgICAgICBuQ29udGV4dEZpbmlzaCgpOworICAgIH0KKwogICAgIHB1YmxpYyB2b2lkIGRlc3Ryb3koKSB7CiAgICAgICAgIHZhbGlkYXRlKCk7CiAgICAgICAgIG5Db250ZXh0RGVpbml0VG9DbGllbnQoKTsKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvUmVuZGVyU2NyaXB0R0wuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvUmVuZGVyU2NyaXB0R0wuamF2YQppbmRleCBkMWRmMjNkLi5lOTBiNGZjIDEwMDY0NAotLS0gYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1JlbmRlclNjcmlwdEdMLmphdmEKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9SZW5kZXJTY3JpcHRHTC5qYXZhCkBAIC03NCw5ICs3NCw5IEBACiAgICAgICAgIG5Db250ZXh0QmluZFJvb3RTY3JpcHQoc2FmZUlEKHMpKTsKICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCBjb250ZXh0QmluZFByb2dyYW1GcmFnbWVudFN0b3JlKFByb2dyYW1TdG9yZSBwKSB7CisgICAgcHVibGljIHZvaWQgY29udGV4dEJpbmRQcm9ncmFtU3RvcmUoUHJvZ3JhbVN0b3JlIHApIHsKICAgICAgICAgdmFsaWRhdGUoKTsKLSAgICAgICAgbkNvbnRleHRCaW5kUHJvZ3JhbUZyYWdtZW50U3RvcmUoc2FmZUlEKHApKTsKKyAgICAgICAgbkNvbnRleHRCaW5kUHJvZ3JhbVN0b3JlKHNhZmVJRChwKSk7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgY29udGV4dEJpbmRQcm9ncmFtRnJhZ21lbnQoUHJvZ3JhbUZyYWdtZW50IHApIHsKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvU2FtcGxlci5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9TYW1wbGVyLmphdmEKaW5kZXggNDBiYTcyMi4uZGE4M2QwNCAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9TYW1wbGVyLmphdmEKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9TYW1wbGVyLmphdmEKQEAgLTUxLDYgKzUxLDg2IEBACiAgICAgICAgIG1JRCA9IGlkOwogICAgIH0KIAorICAgIFNhbXBsZXIgbVNhbXBsZXJfQ0xBTVBfTkVBUkVTVDsKKyAgICBTYW1wbGVyIG1TYW1wbGVyX0NMQU1QX0xJTkVBUjsKKyAgICBTYW1wbGVyIG1TYW1wbGVyX0NMQU1QX0xJTkVBUl9NSVA7CisgICAgU2FtcGxlciBtU2FtcGxlcl9XUkFQX05FQVJFU1Q7CisgICAgU2FtcGxlciBtU2FtcGxlcl9XUkFQX0xJTkVBUjsKKyAgICBTYW1wbGVyIG1TYW1wbGVyX1dSQVBfTElORUFSX01JUDsKKworICAgIHB1YmxpYyBzdGF0aWMgU2FtcGxlciBDTEFNUF9ORUFSRVNUKFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBpZihycy5tU2FtcGxlcl9DTEFNUF9ORUFSRVNUID09IG51bGwpIHsKKyAgICAgICAgICAgIEJ1aWxkZXIgYiA9IG5ldyBCdWlsZGVyKHJzKTsKKyAgICAgICAgICAgIGIuc2V0TWluKFZhbHVlLk5FQVJFU1QpOworICAgICAgICAgICAgYi5zZXRNYWcoVmFsdWUuTkVBUkVTVCk7CisgICAgICAgICAgICBiLnNldFdyYXBTKFZhbHVlLkNMQU1QKTsKKyAgICAgICAgICAgIGIuc2V0V3JhcFQoVmFsdWUuQ0xBTVApOworICAgICAgICAgICAgcnMubVNhbXBsZXJfQ0xBTVBfTkVBUkVTVCA9IGIuY3JlYXRlKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJzLm1TYW1wbGVyX0NMQU1QX05FQVJFU1Q7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBTYW1wbGVyIENMQU1QX0xJTkVBUihSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgaWYocnMubVNhbXBsZXJfQ0xBTVBfTElORUFSID09IG51bGwpIHsKKyAgICAgICAgICAgIEJ1aWxkZXIgYiA9IG5ldyBCdWlsZGVyKHJzKTsKKyAgICAgICAgICAgIGIuc2V0TWluKFZhbHVlLkxJTkVBUik7CisgICAgICAgICAgICBiLnNldE1hZyhWYWx1ZS5MSU5FQVIpOworICAgICAgICAgICAgYi5zZXRXcmFwUyhWYWx1ZS5DTEFNUCk7CisgICAgICAgICAgICBiLnNldFdyYXBUKFZhbHVlLkNMQU1QKTsKKyAgICAgICAgICAgIHJzLm1TYW1wbGVyX0NMQU1QX0xJTkVBUiA9IGIuY3JlYXRlKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJzLm1TYW1wbGVyX0NMQU1QX0xJTkVBUjsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFNhbXBsZXIgQ0xBTVBfTElORUFSX01JUF9MSU5FQVIoUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgIGlmKHJzLm1TYW1wbGVyX0NMQU1QX0xJTkVBUl9NSVBfTElORUFSID09IG51bGwpIHsKKyAgICAgICAgICAgIEJ1aWxkZXIgYiA9IG5ldyBCdWlsZGVyKHJzKTsKKyAgICAgICAgICAgIGIuc2V0TWluKFZhbHVlLkxJTkVBUl9NSVBfTElORUFSKTsKKyAgICAgICAgICAgIGIuc2V0TWFnKFZhbHVlLkxJTkVBUl9NSVBfTElORUFSKTsKKyAgICAgICAgICAgIGIuc2V0V3JhcFMoVmFsdWUuQ0xBTVApOworICAgICAgICAgICAgYi5zZXRXcmFwVChWYWx1ZS5DTEFNUCk7CisgICAgICAgICAgICBycy5tU2FtcGxlcl9DTEFNUF9MSU5FQVJfTUlQX0xJTkVBUiA9IGIuY3JlYXRlKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJzLm1TYW1wbGVyX0NMQU1QX0xJTkVBUl9NSVBfTElORUFSOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgU2FtcGxlciBXUkFQX05FQVJFU1QoUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgIGlmKHJzLm1TYW1wbGVyX1dSQVBfTkVBUkVTVCA9PSBudWxsKSB7CisgICAgICAgICAgICBCdWlsZGVyIGIgPSBuZXcgQnVpbGRlcihycyk7CisgICAgICAgICAgICBiLnNldE1pbihWYWx1ZS5ORUFSRVNUKTsKKyAgICAgICAgICAgIGIuc2V0TWFnKFZhbHVlLk5FQVJFU1QpOworICAgICAgICAgICAgYi5zZXRXcmFwUyhWYWx1ZS5XUkFQKTsKKyAgICAgICAgICAgIGIuc2V0V3JhcFQoVmFsdWUuV1JBUCk7CisgICAgICAgICAgICBycy5tU2FtcGxlcl9XUkFQX05FQVJFU1QgPSBiLmNyZWF0ZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBycy5tU2FtcGxlcl9XUkFQX05FQVJFU1Q7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBTYW1wbGVyIFdSQVBfTElORUFSKFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBpZihycy5tU2FtcGxlcl9XUkFQX0xJTkVBUiA9PSBudWxsKSB7CisgICAgICAgICAgICBCdWlsZGVyIGIgPSBuZXcgQnVpbGRlcihycyk7CisgICAgICAgICAgICBiLnNldE1pbihWYWx1ZS5MSU5FQVIpOworICAgICAgICAgICAgYi5zZXRNYWcoVmFsdWUuTElORUFSKTsKKyAgICAgICAgICAgIGIuc2V0V3JhcFMoVmFsdWUuV1JBUCk7CisgICAgICAgICAgICBiLnNldFdyYXBUKFZhbHVlLldSQVApOworICAgICAgICAgICAgcnMubVNhbXBsZXJfV1JBUF9MSU5FQVIgPSBiLmNyZWF0ZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBycy5tU2FtcGxlcl9XUkFQX0xJTkVBUjsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFNhbXBsZXIgV1JBUF9MSU5FQVJfTUlQX0xJTkVBUihSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgaWYocnMubVNhbXBsZXJfV1JBUF9MSU5FQVJfTUlQX0xJTkVBUiA9PSBudWxsKSB7CisgICAgICAgICAgICBCdWlsZGVyIGIgPSBuZXcgQnVpbGRlcihycyk7CisgICAgICAgICAgICBiLnNldE1pbihWYWx1ZS5MSU5FQVJfTUlQX0xJTkVBUik7CisgICAgICAgICAgICBiLnNldE1hZyhWYWx1ZS5MSU5FQVJfTUlQX0xJTkVBUik7CisgICAgICAgICAgICBiLnNldFdyYXBTKFZhbHVlLldSQVApOworICAgICAgICAgICAgYi5zZXRXcmFwVChWYWx1ZS5XUkFQKTsKKyAgICAgICAgICAgIHJzLm1TYW1wbGVyX1dSQVBfTElORUFSX01JUF9MSU5FQVIgPSBiLmNyZWF0ZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBycy5tU2FtcGxlcl9XUkFQX0xJTkVBUl9NSVBfTElORUFSOworICAgIH0KKworCiAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBCdWlsZGVyIHsKICAgICAgICAgUmVuZGVyU2NyaXB0IG1SUzsKICAgICAgICAgVmFsdWUgbU1pbjsKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvU2NyaXB0LmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1NjcmlwdC5qYXZhCmluZGV4IDU3Y2NmYTMuLmJlYWM5OTcgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvU2NyaXB0LmphdmEKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9TY3JpcHQuamF2YQpAQCAtNDIsNiArNDIsMTkgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIHByb3RlY3RlZCB2b2lkIGludm9rZShpbnQgc2xvdCkgeworICAgICAgICBtUlMublNjcmlwdEludm9rZShtSUQsIHNsb3QpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGludm9rZShpbnQgc2xvdCwgRmllbGRQYWNrZXIgdikgeworICAgICAgICBpZiAodiAhPSBudWxsKSB7CisgICAgICAgICAgICBtUlMublNjcmlwdEludm9rZVYobUlELCBzbG90LCB2LmdldERhdGEoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtUlMublNjcmlwdEludm9rZShtSUQsIHNsb3QpOworICAgICAgICB9CisgICAgfQorCisKICAgICBTY3JpcHQoaW50IGlkLCBSZW5kZXJTY3JpcHQgcnMpIHsKICAgICAgICAgc3VwZXIocnMpOwogICAgICAgICBtSUQgPSBpZDsKQEAgLTQ5LDIyICs2MiwyMyBAQAogCiAgICAgcHVibGljIHZvaWQgYmluZEFsbG9jYXRpb24oQWxsb2NhdGlvbiB2YSwgaW50IHNsb3QpIHsKICAgICAgICAgbVJTLnZhbGlkYXRlKCk7Ci0gICAgICAgIG1SUy5uU2NyaXB0QmluZEFsbG9jYXRpb24obUlELCB2YS5tSUQsIHNsb3QpOworICAgICAgICBpZiAodmEgIT0gbnVsbCkgeworICAgICAgICAgICAgbVJTLm5TY3JpcHRCaW5kQWxsb2NhdGlvbihtSUQsIHZhLm1JRCwgc2xvdCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtUlMublNjcmlwdEJpbmRBbGxvY2F0aW9uKG1JRCwgMCwgc2xvdCk7CisgICAgICAgIH0KICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCBzZXRDbGVhckNvbG9yKGZsb2F0IHIsIGZsb2F0IGcsIGZsb2F0IGIsIGZsb2F0IGEpIHsKLSAgICAgICAgbVJTLnZhbGlkYXRlKCk7Ci0gICAgICAgIG1SUy5uU2NyaXB0U2V0Q2xlYXJDb2xvcihtSUQsIHIsIGcsIGIsIGEpOworICAgIHB1YmxpYyB2b2lkIHNldFZhcihpbnQgaW5kZXgsIGZsb2F0IHYpIHsKKyAgICAgICAgbVJTLm5TY3JpcHRTZXRWYXJGKG1JRCwgaW5kZXgsIHYpOwogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIHNldENsZWFyRGVwdGgoZmxvYXQgZCkgewotICAgICAgICBtUlMudmFsaWRhdGUoKTsKLSAgICAgICAgbVJTLm5TY3JpcHRTZXRDbGVhckRlcHRoKG1JRCwgZCk7CisgICAgcHVibGljIHZvaWQgc2V0VmFyKGludCBpbmRleCwgaW50IHYpIHsKKyAgICAgICAgbVJTLm5TY3JpcHRTZXRWYXJJKG1JRCwgaW5kZXgsIHYpOwogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIHNldENsZWFyU3RlbmNpbChpbnQgc3RlbmNpbCkgewotICAgICAgICBtUlMudmFsaWRhdGUoKTsKLSAgICAgICAgbVJTLm5TY3JpcHRTZXRDbGVhclN0ZW5jaWwobUlELCBzdGVuY2lsKTsKKyAgICBwdWJsaWMgdm9pZCBzZXRWYXIoaW50IGluZGV4LCBGaWVsZFBhY2tlciB2KSB7CisgICAgICAgIG1SUy5uU2NyaXB0U2V0VmFyVihtSUQsIGluZGV4LCB2LmdldERhdGEoKSk7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgc2V0VGltZVpvbmUoU3RyaW5nIHRpbWVab25lKSB7CkBAIC03OCw3MiArOTIsNTQgQEAKIAogICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQnVpbGRlciB7CiAgICAgICAgIFJlbmRlclNjcmlwdCBtUlM7Ci0gICAgICAgIGJvb2xlYW4gbUlzUm9vdCA9IGZhbHNlOwotICAgICAgICBUeXBlW10gbVR5cGVzOwotICAgICAgICBTdHJpbmdbXSBtTmFtZXM7Ci0gICAgICAgIGJvb2xlYW5bXSBtV3JpdGFibGU7Ci0gICAgICAgIGludCBtSW52b2thYmxlQ291bnQgPSAwOwotICAgICAgICBJbnZva2FibGVbXSBtSW52b2thYmxlczsKIAogICAgICAgICBCdWlsZGVyKFJlbmRlclNjcmlwdCBycykgewogICAgICAgICAgICAgbVJTID0gcnM7Ci0gICAgICAgICAgICBtVHlwZXMgPSBuZXcgVHlwZVtNQVhfU0xPVF07Ci0gICAgICAgICAgICBtTmFtZXMgPSBuZXcgU3RyaW5nW01BWF9TTE9UXTsKLSAgICAgICAgICAgIG1Xcml0YWJsZSA9IG5ldyBib29sZWFuW01BWF9TTE9UXTsKLSAgICAgICAgICAgIG1JbnZva2FibGVzID0gbmV3IEludm9rYWJsZVtNQVhfU0xPVF07CiAgICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRUeXBlKFR5cGUgdCwgaW50IHNsb3QpIHsKLSAgICAgICAgICAgIG1UeXBlc1tzbG90XSA9IHQ7Ci0gICAgICAgICAgICBtTmFtZXNbc2xvdF0gPSBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0VHlwZShUeXBlIHQsIFN0cmluZyBuYW1lLCBpbnQgc2xvdCkgewotICAgICAgICAgICAgbVR5cGVzW3Nsb3RdID0gdDsKLSAgICAgICAgICAgIG1OYW1lc1tzbG90XSA9IG5hbWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgSW52b2thYmxlIGFkZEludm9rYWJsZShTdHJpbmcgZnVuYykgewotICAgICAgICAgICAgSW52b2thYmxlIGkgPSBuZXcgSW52b2thYmxlKCk7Ci0gICAgICAgICAgICBpLm1OYW1lID0gZnVuYzsKLSAgICAgICAgICAgIGkubVJTID0gbVJTOwotICAgICAgICAgICAgaS5tU2xvdCA9IG1JbnZva2FibGVDb3VudDsKLSAgICAgICAgICAgIG1JbnZva2FibGVzW21JbnZva2FibGVDb3VudCsrXSA9IGk7Ci0gICAgICAgICAgICByZXR1cm4gaTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFR5cGUoYm9vbGVhbiB3cml0YWJsZSwgaW50IHNsb3QpIHsKLSAgICAgICAgICAgIG1Xcml0YWJsZVtzbG90XSA9IHdyaXRhYmxlOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCB0cmFuc2ZlckNyZWF0ZSgpIHsKLSAgICAgICAgICAgIG1SUy5uU2NyaXB0U2V0Um9vdChtSXNSb290KTsKLSAgICAgICAgICAgIGZvcihpbnQgY3Q9MDsgY3QgPCBtVHlwZXMubGVuZ3RoOyBjdCsrKSB7Ci0gICAgICAgICAgICAgICAgaWYobVR5cGVzW2N0XSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1SUy5uU2NyaXB0U2V0VHlwZShtVHlwZXNbY3RdLm1JRCwgbVdyaXRhYmxlW2N0XSwgbU5hbWVzW2N0XSwgY3QpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZvcihpbnQgY3Q9MDsgY3QgPCBtSW52b2thYmxlQ291bnQ7IGN0KyspIHsKLSAgICAgICAgICAgICAgICBtUlMublNjcmlwdFNldEludm9rYWJsZShtSW52b2thYmxlc1tjdF0ubU5hbWUsIGN0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgdHJhbnNmZXJPYmplY3QoU2NyaXB0IHMpIHsKLSAgICAgICAgICAgIHMubUlzUm9vdCA9IG1Jc1Jvb3Q7Ci0gICAgICAgICAgICBzLm1UeXBlcyA9IG1UeXBlczsKLSAgICAgICAgICAgIHMubUludm9rYWJsZXMgPSBuZXcgSW52b2thYmxlW21JbnZva2FibGVDb3VudF07Ci0gICAgICAgICAgICBmb3IoaW50IGN0PTA7IGN0IDwgbUludm9rYWJsZUNvdW50OyBjdCsrKSB7Ci0gICAgICAgICAgICAgICAgcy5tSW52b2thYmxlc1tjdF0gPSBtSW52b2thYmxlc1tjdF07Ci0gICAgICAgICAgICAgICAgcy5tSW52b2thYmxlc1tjdF0ubVNjcmlwdCA9IHM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzLm1JbnZva2FibGVzID0gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFJvb3QoYm9vbGVhbiByKSB7Ci0gICAgICAgICAgICBtSXNSb290ID0gcjsKLSAgICAgICAgfQotCiAgICAgfQogCisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZpZWxkQmFzZSB7CisgICAgICAgIHByb3RlY3RlZCBFbGVtZW50IG1FbGVtZW50OworICAgICAgICBwcm90ZWN0ZWQgVHlwZSBtVHlwZTsKKyAgICAgICAgcHJvdGVjdGVkIEFsbG9jYXRpb24gbUFsbG9jYXRpb247CisKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgaW5pdChSZW5kZXJTY3JpcHQgcnMsIGludCBkaW14KSB7CisgICAgICAgICAgICBtQWxsb2NhdGlvbiA9IEFsbG9jYXRpb24uY3JlYXRlU2l6ZWQocnMsIG1FbGVtZW50LCBkaW14KTsKKyAgICAgICAgICAgIG1UeXBlID0gbUFsbG9jYXRpb24uZ2V0VHlwZSgpOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIEZpZWxkQmFzZSgpIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBFbGVtZW50IGdldEVsZW1lbnQoKSB7CisgICAgICAgICAgICByZXR1cm4gbUVsZW1lbnQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVHlwZSBnZXRUeXBlKCkgeworICAgICAgICAgICAgcmV0dXJuIG1UeXBlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEFsbG9jYXRpb24gZ2V0QWxsb2NhdGlvbigpIHsKKyAgICAgICAgICAgIHJldHVybiBtQWxsb2NhdGlvbjsKKyAgICAgICAgfQorCisgICAgICAgIC8vQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHVwZGF0ZUFsbG9jYXRpb24oKSB7CisgICAgICAgIH0KKworCisgICAgICAgIC8vCisgICAgICAgIC8qCisgICAgICAgIHB1YmxpYyBjbGFzcyBTY3JpcHRGaWVsZF9Vc2VyRmllbGQKKyAgICAgICAgICAgIGV4dGVuZHMgYW5kcm9pZC5yZW5kZXJzY3JpcHQuU2NyaXB0LkZpZWxkQmFzZSB7CisKKyAgICAgICAgICAgIHByb3RlY3RlZAorCisgICAgICAgIH0KKworICAgICAgICAqLworCisgICAgfQogfQogCmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1NjcmlwdEMuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvU2NyaXB0Qy5qYXZhCmluZGV4IGJiOTllMjMuLjU5NTliZTQgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvU2NyaXB0Qy5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvU2NyaXB0Qy5qYXZhCkBAIC0zNywxMSArMzcsNDkgQEAKICAgICAgICAgc3VwZXIoaWQsIHJzKTsKICAgICB9CiAKKyAgICBwcm90ZWN0ZWQgU2NyaXB0QyhSZW5kZXJTY3JpcHQgcnMsIFJlc291cmNlcyByZXNvdXJjZXMsIGludCByZXNvdXJjZUlELCBib29sZWFuIGlzUm9vdCkgeworICAgICAgICBzdXBlcigwLCBycyk7CisgICAgICAgIG1JRCA9IGludGVybmFsQ3JlYXRlKHJzLCByZXNvdXJjZXMsIHJlc291cmNlSUQpOworICAgIH0KKworCisgICAgcHJpdmF0ZSBzdGF0aWMgc3luY2hyb25pemVkIGludCBpbnRlcm5hbENyZWF0ZShSZW5kZXJTY3JpcHQgcnMsIFJlc291cmNlcyByZXNvdXJjZXMsIGludCByZXNvdXJjZUlEKSB7CisgICAgICAgIGJ5dGVbXSBwZ207CisgICAgICAgIGludCBwZ21MZW5ndGg7CisgICAgICAgIElucHV0U3RyZWFtIGlzID0gcmVzb3VyY2VzLm9wZW5SYXdSZXNvdXJjZShyZXNvdXJjZUlEKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcGdtID0gbmV3IGJ5dGVbMTAyNF07CisgICAgICAgICAgICAgICAgcGdtTGVuZ3RoID0gMDsKKyAgICAgICAgICAgICAgICB3aGlsZSh0cnVlKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBieXRlc0xlZnQgPSBwZ20ubGVuZ3RoIC0gcGdtTGVuZ3RoOworICAgICAgICAgICAgICAgICAgICBpZiAoYnl0ZXNMZWZ0ID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVbXSBidWYyID0gbmV3IGJ5dGVbcGdtLmxlbmd0aCAqIDJdOworICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShwZ20sIDAsIGJ1ZjIsIDAsIHBnbS5sZW5ndGgpOworICAgICAgICAgICAgICAgICAgICAgICAgcGdtID0gYnVmMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzTGVmdCA9IHBnbS5sZW5ndGggLSBwZ21MZW5ndGg7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaW50IGJ5dGVzUmVhZCA9IGlzLnJlYWQocGdtLCBwZ21MZW5ndGgsIGJ5dGVzTGVmdCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChieXRlc1JlYWQgPD0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcGdtTGVuZ3RoICs9IGJ5dGVzUmVhZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIGlzLmNsb3NlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2goSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJlc291cmNlcy5Ob3RGb3VuZEV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgcnMublNjcmlwdENCZWdpbigpOworICAgICAgICBycy5uU2NyaXB0Q1NldFNjcmlwdChwZ20sIDAsIHBnbUxlbmd0aCk7CisgICAgICAgIHJldHVybiBycy5uU2NyaXB0Q0NyZWF0ZSgpOworICAgIH0KKwogICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQnVpbGRlciBleHRlbmRzIFNjcmlwdC5CdWlsZGVyIHsKICAgICAgICAgYnl0ZVtdIG1Qcm9ncmFtOwogICAgICAgICBpbnQgbVByb2dyYW1MZW5ndGg7Ci0gICAgICAgIEhhc2hNYXA8U3RyaW5nLEludGVnZXI+IG1JbnREZWZpbmVzID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgSGFzaE1hcDxTdHJpbmcsRmxvYXQ+IG1GbG9hdERlZmluZXMgPSBuZXcgSGFzaE1hcCgpOwogCiAgICAgICAgIHB1YmxpYyBCdWlsZGVyKFJlbmRlclNjcmlwdCBycykgewogICAgICAgICAgICAgc3VwZXIocnMpOwpAQCAtOTIsNjYgKzEzMCwyMCBAQAogCiAgICAgICAgIHN0YXRpYyBzeW5jaHJvbml6ZWQgU2NyaXB0QyBpbnRlcm5hbENyZWF0ZShCdWlsZGVyIGIpIHsKICAgICAgICAgICAgIGIubVJTLm5TY3JpcHRDQmVnaW4oKTsKLSAgICAgICAgICAgIGIudHJhbnNmZXJDcmVhdGUoKTsKIAotICAgICAgICAgICAgZm9yIChFbnRyeTxTdHJpbmcsSW50ZWdlcj4gZTogYi5tSW50RGVmaW5lcy5lbnRyeVNldCgpKSB7Ci0gICAgICAgICAgICAgICAgYi5tUlMublNjcmlwdENBZGREZWZpbmVJMzIoZS5nZXRLZXkoKSwgZS5nZXRWYWx1ZSgpLmludFZhbHVlKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yIChFbnRyeTxTdHJpbmcsRmxvYXQ+IGU6IGIubUZsb2F0RGVmaW5lcy5lbnRyeVNldCgpKSB7Ci0gICAgICAgICAgICAgICAgYi5tUlMublNjcmlwdENBZGREZWZpbmVGKGUuZ2V0S2V5KCksIGUuZ2V0VmFsdWUoKS5mbG9hdFZhbHVlKCkpOwotICAgICAgICAgICAgfQotCisgICAgICAgICAgICBhbmRyb2lkLnV0aWwuTG9nLmUoInJzIiwgImxlbiA9ICIgKyBiLm1Qcm9ncmFtTGVuZ3RoKTsKICAgICAgICAgICAgIGIubVJTLm5TY3JpcHRDU2V0U2NyaXB0KGIubVByb2dyYW0sIDAsIGIubVByb2dyYW1MZW5ndGgpOwogCiAgICAgICAgICAgICBpbnQgaWQgPSBiLm1SUy5uU2NyaXB0Q0NyZWF0ZSgpOwogICAgICAgICAgICAgU2NyaXB0QyBvYmogPSBuZXcgU2NyaXB0QyhpZCwgYi5tUlMpOwotICAgICAgICAgICAgYi50cmFuc2Zlck9iamVjdChvYmopOwotCiAgICAgICAgICAgICByZXR1cm4gb2JqOwogICAgICAgICB9CiAKLSAgICAgICAgcHVibGljIHZvaWQgYWRkRGVmaW5lKFN0cmluZyBuYW1lLCBpbnQgdmFsdWUpIHsKLSAgICAgICAgICAgIG1JbnREZWZpbmVzLnB1dChuYW1lLCB2YWx1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBhZGREZWZpbmUoU3RyaW5nIG5hbWUsIGZsb2F0IHZhbHVlKSB7Ci0gICAgICAgICAgICBtRmxvYXREZWZpbmVzLnB1dChuYW1lLCB2YWx1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogVGFrZXMgdGhlIGFsbCBwdWJsaWMgc3RhdGljIGZpbmFsIGZpZWxkcyBmb3IgYSBjbGFzcywgYW5kIGFkZHMgZGVmaW5lcwotICAgICAgICAgKiBmb3IgdGhlbSwgdXNpbmcgdGhlIG5hbWUgb2YgdGhlIGZpZWxkIGFzIHRoZSBuYW1lIG9mIHRoZSBkZWZpbmUuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBhZGREZWZpbmVzKENsYXNzIGNsKSB7Ci0gICAgICAgICAgICBhZGREZWZpbmVzKGNsLmdldEZpZWxkcygpLCAoTW9kaWZpZXIuU1RBVElDIHwgTW9kaWZpZXIuRklOQUwgfCBNb2RpZmllci5QVUJMSUMpLCBudWxsKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUYWtlcyB0aGUgYWxsIHB1YmxpYyBmaWVsZHMgZm9yIGFuIG9iamVjdCwgYW5kIGFkZHMgZGVmaW5lcwotICAgICAgICAgKiBmb3IgdGhlbSwgdXNpbmcgdGhlIG5hbWUgb2YgdGhlIGZpZWxkIGFzIHRoZSBuYW1lIG9mIHRoZSBkZWZpbmUuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBhZGREZWZpbmVzKE9iamVjdCBvKSB7Ci0gICAgICAgICAgICBhZGREZWZpbmVzKG8uZ2V0Q2xhc3MoKS5nZXRGaWVsZHMoKSwgTW9kaWZpZXIuUFVCTElDLCBvKTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgYWRkRGVmaW5lcyhGaWVsZFtdIGZpZWxkcywgaW50IG1hc2ssIE9iamVjdCBvKSB7Ci0gICAgICAgICAgICBmb3IgKEZpZWxkIGY6IGZpZWxkcykgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgoZi5nZXRNb2RpZmllcnMoKSAmIG1hc2spID09IG1hc2spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzIHQgPSBmLmdldFR5cGUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ID09IGludC5jbGFzcykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1JbnREZWZpbmVzLnB1dChmLmdldE5hbWUoKSwgZi5nZXRJbnQobykpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodCA9PSBmbG9hdC5jbGFzcykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1GbG9hdERlZmluZXMucHV0KGYuZ2V0TmFtZSgpLCBmLmdldEZsb2F0KG8pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogRG8gd2Ugd2FudCB0aGlzIGxvZz8KLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiYWRkRGVmaW5lcyBza2lwcGluZyBmaWVsZCAiICsgZi5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICAgICAgICBwdWJsaWMgdm9pZCBhZGREZWZpbmUoU3RyaW5nIG5hbWUsIGludCB2YWx1ZSkge30KKyAgICAgICAgcHVibGljIHZvaWQgYWRkRGVmaW5lKFN0cmluZyBuYW1lLCBmbG9hdCB2YWx1ZSkge30KKyAgICAgICAgcHVibGljIHZvaWQgYWRkRGVmaW5lcyhDbGFzcyBjbCkge30KKyAgICAgICAgcHVibGljIHZvaWQgYWRkRGVmaW5lcyhPYmplY3Qgbykge30KKyAgICAgICAgdm9pZCBhZGREZWZpbmVzKEZpZWxkW10gZmllbGRzLCBpbnQgbWFzaywgT2JqZWN0IG8pIHt9CiAKICAgICAgICAgcHVibGljIFNjcmlwdEMgY3JlYXRlKCkgewogICAgICAgICAgICAgcmV0dXJuIGludGVybmFsQ3JlYXRlKHRoaXMpOwpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9WZWN0b3IyZi5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9TaG9ydDIuamF2YQpzaW1pbGFyaXR5IGluZGV4IDg5JQpjb3B5IGZyb20gZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9WZWN0b3IyZi5qYXZhCmNvcHkgdG8gZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9TaG9ydDIuamF2YQppbmRleCA1NjdkNTdmYS4uNDI2ODAxZiAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9WZWN0b3IyZi5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvU2hvcnQyLmphdmEKQEAgLTI0LDEyICsyNCwxMiBAQAogICogQGhpZGUKICAqCiAgKiovCi1wdWJsaWMgY2xhc3MgVmVjdG9yMmYgewotICAgIHB1YmxpYyBWZWN0b3IyZigpIHsKK3B1YmxpYyBjbGFzcyBTaG9ydDIgeworICAgIHB1YmxpYyBTaG9ydDIoKSB7CiAgICAgfQogCi0gICAgcHVibGljIGZsb2F0IHg7Ci0gICAgcHVibGljIGZsb2F0IHk7CisgICAgcHVibGljIHNob3J0IHg7CisgICAgcHVibGljIHNob3J0IHk7CiB9CiAKIApkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9WZWN0b3IyZi5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9TaG9ydDMuamF2YQpzaW1pbGFyaXR5IGluZGV4IDg3JQpjb3B5IGZyb20gZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9WZWN0b3IyZi5qYXZhCmNvcHkgdG8gZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9TaG9ydDMuamF2YQppbmRleCA1NjdkNTdmYS4uN2I5YzMwNSAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9WZWN0b3IyZi5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvU2hvcnQzLmphdmEKQEAgLTI0LDEyICsyNCwxMyBAQAogICogQGhpZGUKICAqCiAgKiovCi1wdWJsaWMgY2xhc3MgVmVjdG9yMmYgewotICAgIHB1YmxpYyBWZWN0b3IyZigpIHsKK3B1YmxpYyBjbGFzcyBTaG9ydDMgeworICAgIHB1YmxpYyBTaG9ydDMoKSB7CiAgICAgfQogCi0gICAgcHVibGljIGZsb2F0IHg7Ci0gICAgcHVibGljIGZsb2F0IHk7CisgICAgcHVibGljIHNob3J0IHg7CisgICAgcHVibGljIHNob3J0IHk7CisgICAgcHVibGljIHNob3J0IHo7CiB9CiAKIApkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9WZWN0b3IyZi5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9TaG9ydDQuamF2YQpzaW1pbGFyaXR5IGluZGV4IDg1JQpjb3B5IGZyb20gZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9WZWN0b3IyZi5qYXZhCmNvcHkgdG8gZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9TaG9ydDQuamF2YQppbmRleCA1NjdkNTdmYS4uOWE0NzRlMiAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9WZWN0b3IyZi5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvU2hvcnQ0LmphdmEKQEAgLTI0LDE0ICsyNCwxNSBAQAogICogQGhpZGUKICAqCiAgKiovCi1wdWJsaWMgY2xhc3MgVmVjdG9yMmYgewotICAgIHB1YmxpYyBWZWN0b3IyZigpIHsKK3B1YmxpYyBjbGFzcyBTaG9ydDQgeworICAgIHB1YmxpYyBTaG9ydDQoKSB7CiAgICAgfQogCi0gICAgcHVibGljIGZsb2F0IHg7Ci0gICAgcHVibGljIGZsb2F0IHk7CisgICAgcHVibGljIHNob3J0IHg7CisgICAgcHVibGljIHNob3J0IHk7CisgICAgcHVibGljIHNob3J0IHo7CisgICAgcHVibGljIHNob3J0IHc7CiB9CiAKIAogCi0KZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvU2ltcGxlTWVzaC5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9TaW1wbGVNZXNoLmphdmEKaW5kZXggNGEyMTdhOS4uMzhkMDczNiAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9TaW1wbGVNZXNoLmphdmEKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9TaW1wbGVNZXNoLmphdmEKQEAgLTMxMywzNiArMzEzLDI2IEBACiAgICAgICAgIHB1YmxpYyBTaW1wbGVNZXNoIGNyZWF0ZSgpIHsKICAgICAgICAgICAgIEVsZW1lbnQuQnVpbGRlciBiID0gbmV3IEVsZW1lbnQuQnVpbGRlcihtUlMpOwogICAgICAgICAgICAgaW50IGZsb2F0Q291bnQgPSBtVnR4U2l6ZTsKLSAgICAgICAgICAgIGIuYWRkKEVsZW1lbnQuY3JlYXRlQXR0cmliKG1SUywKKyAgICAgICAgICAgIGIuYWRkKEVsZW1lbnQuY3JlYXRlVmVjdG9yKG1SUywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVsZW1lbnQuRGF0YVR5cGUuRkxPQVRfMzIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbGVtZW50LkRhdGFLaW5kLlBPU0lUSU9OLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVZ0eFNpemUpLCAicG9zaXRpb24iKTsKICAgICAgICAgICAgIGlmICgobUZsYWdzICYgQ09MT1IpICE9IDApIHsKICAgICAgICAgICAgICAgICBmbG9hdENvdW50ICs9IDQ7Ci0gICAgICAgICAgICAgICAgYi5hZGQoRWxlbWVudC5jcmVhdGVBdHRyaWIobVJTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVsZW1lbnQuRGF0YVR5cGUuRkxPQVRfMzIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWxlbWVudC5EYXRhS2luZC5DT0xPUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0KSwgImNvbG9yIik7CisgICAgICAgICAgICAgICAgYi5hZGQoRWxlbWVudC5GMzJfNChtUlMpLCAiY29sb3IiKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmICgobUZsYWdzICYgVEVYVFVSRV8wKSAhPSAwKSB7CiAgICAgICAgICAgICAgICAgZmxvYXRDb3VudCArPSAyOwotICAgICAgICAgICAgICAgIGIuYWRkKEVsZW1lbnQuY3JlYXRlQXR0cmliKG1SUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbGVtZW50LkRhdGFUeXBlLkZMT0FUXzMyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVsZW1lbnQuRGF0YUtpbmQuVEVYVFVSRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyKSwgInRleHR1cmUiKTsKKyAgICAgICAgICAgICAgICBiLmFkZChFbGVtZW50LkYzMl8yKG1SUyksICJ0ZXh0dXJlMCIpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKChtRmxhZ3MgJiBOT1JNQUwpICE9IDApIHsKICAgICAgICAgICAgICAgICBmbG9hdENvdW50ICs9IDM7Ci0gICAgICAgICAgICAgICAgYi5hZGQoRWxlbWVudC5jcmVhdGVBdHRyaWIobVJTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVsZW1lbnQuRGF0YVR5cGUuRkxPQVRfMzIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWxlbWVudC5EYXRhS2luZC5OT1JNQUwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMyksICJub3JtYWwiKTsKKyAgICAgICAgICAgICAgICBiLmFkZChFbGVtZW50LkYzMl8zKG1SUyksICJub3JtYWwiKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1FbGVtZW50ID0gYi5jcmVhdGUoKTsKIAogICAgICAgICAgICAgQnVpbGRlciBzbWIgPSBuZXcgQnVpbGRlcihtUlMpOwogICAgICAgICAgICAgc21iLmFkZFZlcnRleFR5cGUobUVsZW1lbnQsIG1WdHhDb3VudCAvIGZsb2F0Q291bnQpOwotICAgICAgICAgICAgc21iLnNldEluZGV4VHlwZShFbGVtZW50LmNyZWF0ZUluZGV4KG1SUyksIG1JbmRleENvdW50KTsKKyAgICAgICAgICAgIHNtYi5zZXRJbmRleFR5cGUoRWxlbWVudC5VMTYobVJTKSwgbUluZGV4Q291bnQpOwogICAgICAgICAgICAgc21iLnNldFByaW1pdGl2ZShQcmltaXRpdmUuVFJJQU5HTEUpOwogICAgICAgICAgICAgU2ltcGxlTWVzaCBzbSA9IHNtYi5jcmVhdGUoKTsKIApkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9UeXBlLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1R5cGUuamF2YQppbmRleCA2MmQzODY3Li4xNDQyMmIyIDEwMDY0NAotLS0gYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1R5cGUuamF2YQorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1R5cGUuamF2YQpAQCAtMTA4LDQ4ICsxMDgsOSBAQAogICAgICAgICBzdXBlci5maW5hbGl6ZSgpOwogICAgIH0KIAotICAgIHB1YmxpYyBzdGF0aWMgVHlwZSBjcmVhdGVGcm9tQ2xhc3MoUmVuZGVyU2NyaXB0IHJzLCBDbGFzcyBjLCBpbnQgc2l6ZSkgewotICAgICAgICBFbGVtZW50IGUgPSBFbGVtZW50LmNyZWF0ZUZyb21DbGFzcyhycywgYyk7Ci0gICAgICAgIEJ1aWxkZXIgYiA9IG5ldyBCdWlsZGVyKHJzLCBlKTsKLSAgICAgICAgYi5hZGQoRGltZW5zaW9uLlgsIHNpemUpOwotICAgICAgICBUeXBlIHQgPSBiLmNyZWF0ZSgpOwotICAgICAgICBlLmRlc3Ryb3koKTsKLQotICAgICAgICAvLyBuYXRpdmUgZmllbGRzCi0gICAgICAgIHsKLSAgICAgICAgICAgIEZpZWxkW10gZmllbGRzID0gYy5nZXRGaWVsZHMoKTsKLSAgICAgICAgICAgIGludFtdIGFyVHlwZXMgPSBuZXcgaW50W2ZpZWxkcy5sZW5ndGhdOwotICAgICAgICAgICAgaW50W10gYXJCaXRzID0gbmV3IGludFtmaWVsZHMubGVuZ3RoXTsKLQotICAgICAgICAgICAgZm9yKGludCBjdD0wOyBjdCA8IGZpZWxkcy5sZW5ndGg7IGN0KyspIHsKLSAgICAgICAgICAgICAgICBGaWVsZCBmID0gZmllbGRzW2N0XTsKLSAgICAgICAgICAgICAgICBDbGFzcyBmYyA9IGYuZ2V0VHlwZSgpOwotICAgICAgICAgICAgICAgIGlmKGZjID09IGludC5jbGFzcykgewotICAgICAgICAgICAgICAgICAgICBhclR5cGVzW2N0XSA9IEVsZW1lbnQuRGF0YVR5cGUuU0lHTkVEXzMyLm1JRDsKLSAgICAgICAgICAgICAgICAgICAgYXJCaXRzW2N0XSA9IDMyOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZihmYyA9PSBzaG9ydC5jbGFzcykgewotICAgICAgICAgICAgICAgICAgICBhclR5cGVzW2N0XSA9IEVsZW1lbnQuRGF0YVR5cGUuU0lHTkVEXzE2Lm1JRDsKLSAgICAgICAgICAgICAgICAgICAgYXJCaXRzW2N0XSA9IDE2OwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZihmYyA9PSBieXRlLmNsYXNzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFyVHlwZXNbY3RdID0gRWxlbWVudC5EYXRhVHlwZS5TSUdORURfOC5tSUQ7Ci0gICAgICAgICAgICAgICAgICAgIGFyQml0c1tjdF0gPSA4OwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZihmYyA9PSBmbG9hdC5jbGFzcykgewotICAgICAgICAgICAgICAgICAgICBhclR5cGVzW2N0XSA9IEVsZW1lbnQuRGF0YVR5cGUuRkxPQVRfMzIubUlEOwotICAgICAgICAgICAgICAgICAgICBhckJpdHNbY3RdID0gMzI7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5rb3duIGZpZWxkIHR5cGUiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBycy5uVHlwZVNldHVwRmllbGRzKHQsIGFyVHlwZXMsIGFyQml0cywgZmllbGRzKTsKLSAgICAgICAgfQotICAgICAgICB0Lm1KYXZhQ2xhc3MgPSBjOwotICAgICAgICByZXR1cm4gdDsKLSAgICB9Ci0KICAgICBwdWJsaWMgc3RhdGljIFR5cGUgY3JlYXRlRnJvbUNsYXNzKFJlbmRlclNjcmlwdCBycywgQ2xhc3MgYywgaW50IHNpemUsIFN0cmluZyBzY3JpcHROYW1lKSB7Ci0gICAgICAgIFR5cGUgdCA9IGNyZWF0ZUZyb21DbGFzcyhycywgYywgc2l6ZSk7Ci0gICAgICAgIHQuc2V0TmFtZShzY3JpcHROYW1lKTsKLSAgICAgICAgcmV0dXJuIHQ7CisgICAgICAgIGFuZHJvaWQudXRpbC5Mb2cuZSgiUmVuZGVyU2NyaXB0IiwgIkNhbGxpbmcgZGVwcmljYXRlZCBjcmVhdGVGcm9tQ2xhc3MiKTsKKyAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQogCiAKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2puaS9hbmRyb2lkX3JlbmRlcnNjcmlwdF9SZW5kZXJTY3JpcHQuY3BwIGIvZ3JhcGhpY3Mvam5pL2FuZHJvaWRfcmVuZGVyc2NyaXB0X1JlbmRlclNjcmlwdC5jcHAKaW5kZXggNDVjYzcyZS4uYzYxYTIxNSAxMDA2NDQKLS0tIGEvZ3JhcGhpY3Mvam5pL2FuZHJvaWRfcmVuZGVyc2NyaXB0X1JlbmRlclNjcmlwdC5jcHAKKysrIGIvZ3JhcGhpY3Mvam5pL2FuZHJvaWRfcmVuZGVyc2NyaXB0X1JlbmRlclNjcmlwdC5jcHAKQEAgLTg1LDYgKzg1LDE0IEBACiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogc3RhdGljIHZvaWQKK25Db250ZXh0RmluaXNoKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcykKK3sKKyAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKKyAgICBMT0dfQVBJKCJuQ29udGV4dEZpbmlzaCwgY29uKCVwKSIsIGNvbik7CisgICAgcnNDb250ZXh0RmluaXNoKGNvbik7Cit9CisKK3N0YXRpYyB2b2lkCiBuQXNzaWduTmFtZShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgb2JqLCBqYnl0ZUFycmF5IHN0cikKIHsKICAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKQEAgLTcwMCw2ICs3MDgsNzIgQEAKICAgICBmcmVlKGJ1ZkFsbG9jKTsKIH0KIAorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIGludAorbkZpbGVBM0RDcmVhdGVGcm9tQXNzZXRTdHJlYW0oSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IG5hdGl2ZV9hc3NldCkKK3sKKyAgICBMT0dWKCJfX19fX19uRmlsZUEzRCAldSIsICh1aW50MzJfdCkgbmF0aXZlX2Fzc2V0KTsKKyAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKKworICAgIEFzc2V0KiBhc3NldCA9IHJlaW50ZXJwcmV0X2Nhc3Q8QXNzZXQqPihuYXRpdmVfYXNzZXQpOworCisgICAgamludCBpZCA9IChqaW50KXJzRmlsZUEzRENyZWF0ZUZyb21Bc3NldFN0cmVhbShjb24sIGFzc2V0LT5nZXRCdWZmZXIoZmFsc2UpLCBhc3NldC0+Z2V0TGVuZ3RoKCkpOworICAgIHJldHVybiBpZDsKK30KKworc3RhdGljIGludAorbkZpbGVBM0RHZXROdW1JbmRleEVudHJpZXMoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IGZpbGVBM0QpCit7CisgICAgTE9HVigiX19fX19fbkZpbGVBM0QgJXUiLCAodWludDMyX3QpIGZpbGVBM0QpOworICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOworCisgICAgaW50MzJfdCBudW1FbnRyaWVzID0gMDsKKyAgICByc0ZpbGVBM0RHZXROdW1JbmRleEVudHJpZXMoY29uLCAmbnVtRW50cmllcywgKFJzRmlsZSlmaWxlQTNEKTsKKyAgICBMT0dWKCJfX19fX19uRmlsZUEzRCBOdW1FbnRyaWVzICV1IiwgKHVpbnQzMl90KSBudW1FbnRyaWVzKTsKKyAgICByZXR1cm4gbnVtRW50cmllczsKK30KKworc3RhdGljIHZvaWQKK25GaWxlQTNER2V0SW5kZXhFbnRyaWVzKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBmaWxlQTNELCBqaW50IG51bUVudHJpZXMsIGppbnRBcnJheSBfaWRzLCBqb2JqZWN0QXJyYXkgX2VudHJpZXMpCit7CisgICAgTE9HVigiX19fX19fbkZpbGVBM0QgJXUiLCAodWludDMyX3QpIGZpbGVBM0QpOworICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOworCisgICAgUnNGaWxlSW5kZXhFbnRyeSAqZmlsZUVudHJpZXMgPSAoUnNGaWxlSW5kZXhFbnRyeSopbWFsbG9jKCh1aW50MzJfdCludW1FbnRyaWVzICogc2l6ZW9mKFJzRmlsZUluZGV4RW50cnkpKTsKKworICAgIHJzRmlsZUEzREdldEluZGV4RW50cmllcyhjb24sIGZpbGVFbnRyaWVzLCAodWludDMyX3QpbnVtRW50cmllcywgKFJzRmlsZSlmaWxlQTNEKTsKKworICAgIGZvcihqaW50IGkgPSAwOyBpIDwgbnVtRW50cmllczsgaSArKykgeworICAgICAgICBfZW52LT5TZXRPYmplY3RBcnJheUVsZW1lbnQoX2VudHJpZXMsIGksIF9lbnYtPk5ld1N0cmluZ1VURihmaWxlRW50cmllc1tpXS5vYmplY3ROYW1lKSk7CisgICAgICAgIF9lbnYtPlNldEludEFycmF5UmVnaW9uKF9pZHMsIGksIDEsIChjb25zdCBqaW50KikmZmlsZUVudHJpZXNbaV0uY2xhc3NJRCk7CisgICAgfQorCisgICAgZnJlZShmaWxlRW50cmllcyk7Cit9CisKK3N0YXRpYyBpbnQKK25GaWxlQTNER2V0RW50cnlCeUluZGV4KEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBmaWxlQTNELCBqaW50IGluZGV4KQoreworICAgIExPR1YoIl9fX19fX25GaWxlQTNEICV1IiwgKHVpbnQzMl90KSBmaWxlQTNEKTsKKyAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKKworICAgIGppbnQgaWQgPSAoamludClyc0ZpbGVBM0RHZXRFbnRyeUJ5SW5kZXgoY29uLCAodWludDMyX3QpaW5kZXgsIChSc0ZpbGUpZmlsZUEzRCk7CisgICAgcmV0dXJuIGlkOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgaW50CituRm9udENyZWF0ZUZyb21GaWxlKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywganN0cmluZyBmaWxlTmFtZSwgamludCBmb250U2l6ZSwgamludCBkcGkpCit7CisgICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CisgICAgY29uc3QgY2hhciogZmlsZU5hbWVVVEYgPSBfZW52LT5HZXRTdHJpbmdVVEZDaGFycyhmaWxlTmFtZSwgTlVMTCk7CisKKyAgICBqaW50IGlkID0gKGppbnQpcnNGb250Q3JlYXRlRnJvbUZpbGUoY29uLCBmaWxlTmFtZVVURiwgZm9udFNpemUsIGRwaSk7CisgICAgcmV0dXJuIGlkOworfQorCiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKQEAgLTg1NCwyOSArOTI4LDMzIEBACiB9CiAKIHN0YXRpYyB2b2lkCi1uU2NyaXB0U2V0Q2xlYXJDb2xvcihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgc2NyaXB0LCBqZmxvYXQgciwgamZsb2F0IGcsIGpmbG9hdCBiLCBqZmxvYXQgYSkKK25TY3JpcHRTZXRWYXJJKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBzY3JpcHQsIGppbnQgc2xvdCwgamludCB2YWwpCiB7CiAgICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7Ci0gICAgTE9HX0FQSSgiblNjcmlwdFNldENsZWFyQ29sb3IsIGNvbiglcCksIHMoJXApLCByKCVmKSwgZyglZiksIGIoJWYpLCBhKCVmKSIsIGNvbiwgKHZvaWQgKilzY3JpcHQsIHIsIGcsIGIsIGEpOwotICAgIHJzU2NyaXB0U2V0Q2xlYXJDb2xvcihjb24sIChSc1NjcmlwdClzY3JpcHQsIHIsIGcsIGIsIGEpOworICAgIExPR19BUEkoIm5TY3JpcHRTZXRWYXJJLCBjb24oJXApLCBzKCVwKSwgc2xvdCglaSksIHZhbCglaSksIGIoJWYpLCBhKCVmKSIsIGNvbiwgKHZvaWQgKilzY3JpcHQsIHNsb3QsIHZhbCk7CisgICAgcnNTY3JpcHRTZXRWYXJJKGNvbiwgKFJzU2NyaXB0KXNjcmlwdCwgc2xvdCwgdmFsKTsKIH0KIAogc3RhdGljIHZvaWQKLW5TY3JpcHRTZXRDbGVhckRlcHRoKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBzY3JpcHQsIGpmbG9hdCBkKQorblNjcmlwdFNldFZhckYoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IHNjcmlwdCwgamludCBzbG90LCBmbG9hdCB2YWwpCiB7CiAgICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7Ci0gICAgTE9HX0FQSSgiblNjcmlwdENTZXRDbGVhckRlcHRoLCBjb24oJXApLCBzKCVwKSwgZGVwdGgoJWYpIiwgY29uLCAodm9pZCAqKXNjcmlwdCwgZCk7Ci0gICAgcnNTY3JpcHRTZXRDbGVhckRlcHRoKGNvbiwgKFJzU2NyaXB0KXNjcmlwdCwgZCk7CisgICAgTE9HX0FQSSgiblNjcmlwdFNldFZhckksIGNvbiglcCksIHMoJXApLCBzbG90KCVpKSwgdmFsKCVpKSwgYiglZiksIGEoJWYpIiwgY29uLCAodm9pZCAqKXNjcmlwdCwgc2xvdCwgdmFsKTsKKyAgICByc1NjcmlwdFNldFZhckYoY29uLCAoUnNTY3JpcHQpc2NyaXB0LCBzbG90LCB2YWwpOwogfQogCiBzdGF0aWMgdm9pZAotblNjcmlwdFNldENsZWFyU3RlbmNpbChKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgc2NyaXB0LCBqaW50IHN0ZW5jaWwpCituU2NyaXB0U2V0VmFyVihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgc2NyaXB0LCBqaW50IHNsb3QsIGpieXRlQXJyYXkgZGF0YSkKIHsKICAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKLSAgICBMT0dfQVBJKCJuU2NyaXB0Q1NldENsZWFyU3RlbmNpbCwgY29uKCVwKSwgcyglcCksIHN0ZW5jaWwoJWkpIiwgY29uLCAodm9pZCAqKXNjcmlwdCwgc3RlbmNpbCk7Ci0gICAgcnNTY3JpcHRTZXRDbGVhclN0ZW5jaWwoY29uLCAoUnNTY3JpcHQpc2NyaXB0LCBzdGVuY2lsKTsKKyAgICBMT0dfQVBJKCJuU2NyaXB0U2V0VmFyViwgY29uKCVwKSwgcyglcCksIHNsb3QoJWkpIiwgY29uLCAodm9pZCAqKXNjcmlwdCwgc2xvdCk7CisgICAgamludCBsZW4gPSBfZW52LT5HZXRBcnJheUxlbmd0aChkYXRhKTsKKyAgICBqYnl0ZSAqcHRyID0gX2Vudi0+R2V0Qnl0ZUFycmF5RWxlbWVudHMoZGF0YSwgTlVMTCk7CisgICAgcnNTY3JpcHRTZXRWYXJWKGNvbiwgKFJzU2NyaXB0KXNjcmlwdCwgc2xvdCwgcHRyLCBsZW4pOworICAgIF9lbnYtPlJlbGVhc2VCeXRlQXJyYXlFbGVtZW50cyhkYXRhLCBwdHIsIEpOSV9BQk9SVCk7CiB9CiAKKwogc3RhdGljIHZvaWQKIG5TY3JpcHRTZXRUaW1lWm9uZShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgc2NyaXB0LCBqYnl0ZUFycmF5IHRpbWVab25lKQogewpAQCAtODk1LDM2ICs5NzMsNiBAQAogfQogCiBzdGF0aWMgdm9pZAotblNjcmlwdFNldFR5cGUoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IHR5cGUsIGpib29sZWFuIHdyaXRhYmxlLCBqc3RyaW5nIF9zdHIsIGppbnQgc2xvdCkKLXsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKLSAgICBMT0dfQVBJKCJuU2NyaXB0Q0FkZFR5cGUsIGNvbiglcCksIHR5cGUoJXApLCB3cml0YWJsZSglaSksIHNsb3QoJWkpIiwgY29uLCAoUnNUeXBlKXR5cGUsIHdyaXRhYmxlLCBzbG90KTsKLSAgICBjb25zdCBjaGFyKiBuID0gTlVMTDsKLSAgICBpZiAoX3N0cikgewotICAgICAgICBuID0gX2Vudi0+R2V0U3RyaW5nVVRGQ2hhcnMoX3N0ciwgTlVMTCk7Ci0gICAgfQotICAgIHJzU2NyaXB0U2V0VHlwZShjb24sIChSc1R5cGUpdHlwZSwgc2xvdCwgd3JpdGFibGUsIG4pOwotICAgIGlmIChuKSB7Ci0gICAgICAgIF9lbnYtPlJlbGVhc2VTdHJpbmdVVEZDaGFycyhfc3RyLCBuKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1uU2NyaXB0U2V0SW52b2tlKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywganN0cmluZyBfc3RyLCBqaW50IHNsb3QpCi17Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7Ci0gICAgTE9HX0FQSSgiblNjcmlwdFNldEludm9rZSwgY29uKCVwKSIsIGNvbik7Ci0gICAgY29uc3QgY2hhciogbiA9IE5VTEw7Ci0gICAgaWYgKF9zdHIpIHsKLSAgICAgICAgbiA9IF9lbnYtPkdldFN0cmluZ1VURkNoYXJzKF9zdHIsIE5VTEwpOwotICAgIH0KLSAgICByc1NjcmlwdFNldEludm9rZShjb24sIG4sIHNsb3QpOwotICAgIGlmIChuKSB7Ci0gICAgICAgIF9lbnYtPlJlbGVhc2VTdHJpbmdVVEZDaGFycyhfc3RyLCBuKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCiBuU2NyaXB0SW52b2tlKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBvYmosIGppbnQgc2xvdCkKIHsKICAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKQEAgLTkzMywxMyArOTgxLDE3IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1uU2NyaXB0U2V0Um9vdChKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGpib29sZWFuIGlzUm9vdCkKK25TY3JpcHRJbnZva2VWKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBzY3JpcHQsIGppbnQgc2xvdCwgamJ5dGVBcnJheSBkYXRhKQogewogICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwotICAgIExPR19BUEkoIm5TY3JpcHRDU2V0Um9vdCwgY29uKCVwKSwgaXNSb290KCVpKSIsIGNvbiwgaXNSb290KTsKLSAgICByc1NjcmlwdFNldFJvb3QoY29uLCBpc1Jvb3QpOworICAgIExPR19BUEkoIm5TY3JpcHRJbnZva2VWLCBjb24oJXApLCBzKCVwKSwgc2xvdCglaSkiLCBjb24sICh2b2lkICopc2NyaXB0LCBzbG90KTsKKyAgICBqaW50IGxlbiA9IF9lbnYtPkdldEFycmF5TGVuZ3RoKGRhdGEpOworICAgIGpieXRlICpwdHIgPSBfZW52LT5HZXRCeXRlQXJyYXlFbGVtZW50cyhkYXRhLCBOVUxMKTsKKyAgICByc1NjcmlwdEludm9rZVYoY29uLCAoUnNTY3JpcHQpc2NyaXB0LCBzbG90LCBwdHIsIGxlbik7CisgICAgX2Vudi0+UmVsZWFzZUJ5dGVBcnJheUVsZW1lbnRzKGRhdGEsIHB0ciwgSk5JX0FCT1JUKTsKIH0KIAorCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBzdGF0aWMgdm9pZApAQCAtMTAwMiw4MyArMTA1NCw2MyBAQAogICAgIHJldHVybiAoamludClyc1NjcmlwdENDcmVhdGUoY29uKTsKIH0KIAotc3RhdGljIHZvaWQKLW5TY3JpcHRDQWRkRGVmaW5lSTMyKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywganN0cmluZyBuYW1lLCBqaW50IHZhbHVlKQotewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwotICAgIGNvbnN0IGNoYXIqIG4gPSBfZW52LT5HZXRTdHJpbmdVVEZDaGFycyhuYW1lLCBOVUxMKTsKLSAgICBMT0dfQVBJKCJuU2NyaXB0Q0FkZERlZmluZUkzMiwgY29uKCVwKSBuYW1lKCVzKSB2YWx1ZSglZCkiLCBjb24sIG4sIHZhbHVlKTsKLSAgICByc1NjcmlwdENTZXREZWZpbmVJMzIoY29uLCBuLCB2YWx1ZSk7Ci0gICAgX2Vudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKG5hbWUsIG4pOwotfQotCi1zdGF0aWMgdm9pZAotblNjcmlwdENBZGREZWZpbmVGKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywganN0cmluZyBuYW1lLCBqZmxvYXQgdmFsdWUpCi17Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7Ci0gICAgY29uc3QgY2hhciogbiA9IF9lbnYtPkdldFN0cmluZ1VURkNoYXJzKG5hbWUsIE5VTEwpOwotICAgIExPR19BUEkoIm5TY3JpcHRDQWRkRGVmaW5lRiwgY29uKCVwKSBuYW1lKCVzKSB2YWx1ZSglZikiLCBjb24sIG4sIHZhbHVlKTsKLSAgICByc1NjcmlwdENTZXREZWZpbmVGKGNvbiwgbiwgdmFsdWUpOwotICAgIF9lbnYtPlJlbGVhc2VTdHJpbmdVVEZDaGFycyhuYW1lLCBuKTsKLX0KLQogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIHN0YXRpYyB2b2lkCi1uUHJvZ3JhbUZyYWdtZW50U3RvcmVCZWdpbihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgaW4sIGppbnQgb3V0KQorblByb2dyYW1TdG9yZUJlZ2luKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBpbiwgamludCBvdXQpCiB7CiAgICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7Ci0gICAgTE9HX0FQSSgiblByb2dyYW1GcmFnbWVudFN0b3JlQmVnaW4sIGNvbiglcCksIGluKCVwKSwgb3V0KCVwKSIsIGNvbiwgKFJzRWxlbWVudClpbiwgKFJzRWxlbWVudClvdXQpOwotICAgIHJzUHJvZ3JhbUZyYWdtZW50U3RvcmVCZWdpbihjb24sIChSc0VsZW1lbnQpaW4sIChSc0VsZW1lbnQpb3V0KTsKKyAgICBMT0dfQVBJKCJuUHJvZ3JhbVN0b3JlQmVnaW4sIGNvbiglcCksIGluKCVwKSwgb3V0KCVwKSIsIGNvbiwgKFJzRWxlbWVudClpbiwgKFJzRWxlbWVudClvdXQpOworICAgIHJzUHJvZ3JhbVN0b3JlQmVnaW4oY29uLCAoUnNFbGVtZW50KWluLCAoUnNFbGVtZW50KW91dCk7CiB9CiAKIHN0YXRpYyB2b2lkCi1uUHJvZ3JhbUZyYWdtZW50U3RvcmVEZXB0aEZ1bmMoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IGZ1bmMpCituUHJvZ3JhbVN0b3JlRGVwdGhGdW5jKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBmdW5jKQogewogICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwotICAgIExPR19BUEkoIm5Qcm9ncmFtRnJhZ21lbnRTdG9yZURlcHRoRnVuYywgY29uKCVwKSwgZnVuYyglaSkiLCBjb24sIGZ1bmMpOwotICAgIHJzUHJvZ3JhbUZyYWdtZW50U3RvcmVEZXB0aEZ1bmMoY29uLCAoUnNEZXB0aEZ1bmMpZnVuYyk7CisgICAgTE9HX0FQSSgiblByb2dyYW1TdG9yZURlcHRoRnVuYywgY29uKCVwKSwgZnVuYyglaSkiLCBjb24sIGZ1bmMpOworICAgIHJzUHJvZ3JhbVN0b3JlRGVwdGhGdW5jKGNvbiwgKFJzRGVwdGhGdW5jKWZ1bmMpOwogfQogCiBzdGF0aWMgdm9pZAotblByb2dyYW1GcmFnbWVudFN0b3JlRGVwdGhNYXNrKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamJvb2xlYW4gZW5hYmxlKQorblByb2dyYW1TdG9yZURlcHRoTWFzayhKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGpib29sZWFuIGVuYWJsZSkKIHsKICAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKLSAgICBMT0dfQVBJKCJuUHJvZ3JhbUZyYWdtZW50U3RvcmVEZXB0aE1hc2ssIGNvbiglcCksIGVuYWJsZSglaSkiLCBjb24sIGVuYWJsZSk7Ci0gICAgcnNQcm9ncmFtRnJhZ21lbnRTdG9yZURlcHRoTWFzayhjb24sIGVuYWJsZSk7CisgICAgTE9HX0FQSSgiblByb2dyYW1TdG9yZURlcHRoTWFzaywgY29uKCVwKSwgZW5hYmxlKCVpKSIsIGNvbiwgZW5hYmxlKTsKKyAgICByc1Byb2dyYW1TdG9yZURlcHRoTWFzayhjb24sIGVuYWJsZSk7CiB9CiAKIHN0YXRpYyB2b2lkCi1uUHJvZ3JhbUZyYWdtZW50U3RvcmVDb2xvck1hc2soSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqYm9vbGVhbiByLCBqYm9vbGVhbiBnLCBqYm9vbGVhbiBiLCBqYm9vbGVhbiBhKQorblByb2dyYW1TdG9yZUNvbG9yTWFzayhKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGpib29sZWFuIHIsIGpib29sZWFuIGcsIGpib29sZWFuIGIsIGpib29sZWFuIGEpCiB7CiAgICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7Ci0gICAgTE9HX0FQSSgiblByb2dyYW1GcmFnbWVudFN0b3JlQ29sb3JNYXNrLCBjb24oJXApLCByKCVpKSwgZyglaSksIGIoJWkpLCBhKCVpKSIsIGNvbiwgciwgZywgYiwgYSk7Ci0gICAgcnNQcm9ncmFtRnJhZ21lbnRTdG9yZUNvbG9yTWFzayhjb24sIHIsIGcsIGIsIGEpOworICAgIExPR19BUEkoIm5Qcm9ncmFtU3RvcmVDb2xvck1hc2ssIGNvbiglcCksIHIoJWkpLCBnKCVpKSwgYiglaSksIGEoJWkpIiwgY29uLCByLCBnLCBiLCBhKTsKKyAgICByc1Byb2dyYW1TdG9yZUNvbG9yTWFzayhjb24sIHIsIGcsIGIsIGEpOwogfQogCiBzdGF0aWMgdm9pZAotblByb2dyYW1GcmFnbWVudFN0b3JlQmxlbmRGdW5jKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgaW50IHNyYywgaW50IGRzdCkKK25Qcm9ncmFtU3RvcmVCbGVuZEZ1bmMoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBpbnQgc3JjLCBpbnQgZHN0KQogewogICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwotICAgIExPR19BUEkoIm5Qcm9ncmFtRnJhZ21lbnRTdG9yZUJsZW5kRnVuYywgY29uKCVwKSwgc3JjKCVpKSwgZHN0KCVpKSIsIGNvbiwgc3JjLCBkc3QpOwotICAgIHJzUHJvZ3JhbUZyYWdtZW50U3RvcmVCbGVuZEZ1bmMoY29uLCAoUnNCbGVuZFNyY0Z1bmMpc3JjLCAoUnNCbGVuZERzdEZ1bmMpZHN0KTsKKyAgICBMT0dfQVBJKCJuUHJvZ3JhbVN0b3JlQmxlbmRGdW5jLCBjb24oJXApLCBzcmMoJWkpLCBkc3QoJWkpIiwgY29uLCBzcmMsIGRzdCk7CisgICAgcnNQcm9ncmFtU3RvcmVCbGVuZEZ1bmMoY29uLCAoUnNCbGVuZFNyY0Z1bmMpc3JjLCAoUnNCbGVuZERzdEZ1bmMpZHN0KTsKIH0KIAogc3RhdGljIHZvaWQKLW5Qcm9ncmFtRnJhZ21lbnRTdG9yZURpdGhlcihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGpib29sZWFuIGVuYWJsZSkKK25Qcm9ncmFtU3RvcmVEaXRoZXIoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqYm9vbGVhbiBlbmFibGUpCiB7CiAgICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7Ci0gICAgTE9HX0FQSSgiblByb2dyYW1GcmFnbWVudFN0b3JlRGl0aGVyLCBjb24oJXApLCBlbmFibGUoJWkpIiwgY29uLCBlbmFibGUpOwotICAgIHJzUHJvZ3JhbUZyYWdtZW50U3RvcmVEaXRoZXIoY29uLCBlbmFibGUpOworICAgIExPR19BUEkoIm5Qcm9ncmFtU3RvcmVEaXRoZXIsIGNvbiglcCksIGVuYWJsZSglaSkiLCBjb24sIGVuYWJsZSk7CisgICAgcnNQcm9ncmFtU3RvcmVEaXRoZXIoY29uLCBlbmFibGUpOwogfQogCiBzdGF0aWMgamludAotblByb2dyYW1GcmFnbWVudFN0b3JlQ3JlYXRlKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcykKK25Qcm9ncmFtU3RvcmVDcmVhdGUoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzKQogewogICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwotICAgIExPR19BUEkoIm5Qcm9ncmFtRnJhZ21lbnRTdG9yZUNyZWF0ZSwgY29uKCVwKSIsIGNvbik7CisgICAgTE9HX0FQSSgiblByb2dyYW1TdG9yZUNyZWF0ZSwgY29uKCVwKSIsIGNvbik7CiAKLSAgICByZXR1cm4gKGppbnQpcnNQcm9ncmFtRnJhZ21lbnRTdG9yZUNyZWF0ZShjb24pOworICAgIHJldHVybiAoamludClyc1Byb2dyYW1TdG9yZUNyZWF0ZShjb24pOwogfQogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTEyMDgsMTEgKzEyNDAsMTEgQEAKIH0KIAogc3RhdGljIHZvaWQKLW5Db250ZXh0QmluZFByb2dyYW1GcmFnbWVudFN0b3JlKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBwZnMpCituQ29udGV4dEJpbmRQcm9ncmFtU3RvcmUoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IHBmcykKIHsKICAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKLSAgICBMT0dfQVBJKCJuQ29udGV4dEJpbmRQcm9ncmFtRnJhZ21lbnRTdG9yZSwgY29uKCVwKSwgcGZzKCVwKSIsIGNvbiwgKFJzUHJvZ3JhbUZyYWdtZW50U3RvcmUpcGZzKTsKLSAgICByc0NvbnRleHRCaW5kUHJvZ3JhbUZyYWdtZW50U3RvcmUoY29uLCAoUnNQcm9ncmFtRnJhZ21lbnRTdG9yZSlwZnMpOworICAgIExPR19BUEkoIm5Db250ZXh0QmluZFByb2dyYW1TdG9yZSwgY29uKCVwKSwgcGZzKCVwKSIsIGNvbiwgKFJzUHJvZ3JhbVN0b3JlKXBmcyk7CisgICAgcnNDb250ZXh0QmluZFByb2dyYW1TdG9yZShjb24sIChSc1Byb2dyYW1TdG9yZSlwZnMpOwogfQogCiBzdGF0aWMgdm9pZApAQCAtMTM2MSw2ICsxMzkzLDcgQEAKIHsibkRldmljZVNldENvbmZpZyIsICAgICAgICAgICAgICAgIihJSUkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluRGV2aWNlU2V0Q29uZmlnIH0sCiB7Im5Db250ZXh0Q3JlYXRlIiwgICAgICAgICAgICAgICAgICIoSUkpSSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkNvbnRleHRDcmVhdGUgfSwKIHsibkNvbnRleHRDcmVhdGVHTCIsICAgICAgICAgICAgICAgIihJSVopSSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQ29udGV4dENyZWF0ZUdMIH0sCit7Im5Db250ZXh0RmluaXNoIiwgICAgICAgICAgICAgICAgICIoKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkNvbnRleHRGaW5pc2ggfSwKIHsibkNvbnRleHRTZXRQcmlvcml0eSIsICAgICAgICAgICAgIihJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQ29udGV4dFNldFByaW9yaXR5IH0sCiB7Im5Db250ZXh0U2V0U3VyZmFjZSIsICAgICAgICAgICAgICIoSUlMYW5kcm9pZC92aWV3L1N1cmZhY2U7KVYiLCAgICAgICAgICAodm9pZCopbkNvbnRleHRTZXRTdXJmYWNlIH0sCiB7Im5Db250ZXh0RGVzdHJveSIsICAgICAgICAgICAgICAgICIoSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkNvbnRleHREZXN0cm95IH0sCkBAIC0xMzc1LDYgKzE0MDgsMTIgQEAKIHsibkNvbnRleHREZWluaXRUb0NsaWVudCIsICAgICAgICAgIigpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQ29udGV4dERlaW5pdFRvQ2xpZW50IH0sCiAKIHsibkZpbGVPcGVuIiwgICAgICAgICAgICAgICAgICAgICAgIihbQilJIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluRmlsZU9wZW4gfSwKK3sibkZpbGVBM0RDcmVhdGVGcm9tQXNzZXRTdHJlYW0iLCAiKEkpSSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5GaWxlQTNEQ3JlYXRlRnJvbUFzc2V0U3RyZWFtIH0sCit7Im5GaWxlQTNER2V0TnVtSW5kZXhFbnRyaWVzIiwgICAgICIoSSlJIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkZpbGVBM0RHZXROdW1JbmRleEVudHJpZXMgfSwKK3sibkZpbGVBM0RHZXRJbmRleEVudHJpZXMiLCAgICAgICAgIihJSVtJW0xqYXZhL2xhbmcvU3RyaW5nOylWIiwgICAgICAgICAgKHZvaWQqKW5GaWxlQTNER2V0SW5kZXhFbnRyaWVzIH0sCit7Im5GaWxlQTNER2V0RW50cnlCeUluZGV4IiwgICAgICAgICIoSUkpSSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkZpbGVBM0RHZXRFbnRyeUJ5SW5kZXggfSwKKworeyJuRm9udENyZWF0ZUZyb21GaWxlIiwgICAgICAgICAgICIoTGphdmEvbGFuZy9TdHJpbmc7SUkpSSIsICAgICAgICAgICAgICh2b2lkKiluRm9udENyZWF0ZUZyb21GaWxlIH0sCiAKIHsibkVsZW1lbnRDcmVhdGUiLCAgICAgICAgICAgICAgICAgIihJSVpJKUkiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluRWxlbWVudENyZWF0ZSB9LAogeyJuRWxlbWVudENyZWF0ZTIiLCAgICAgICAgICAgICAgICAiKFtJW0xqYXZhL2xhbmcvU3RyaW5nOylJIiwgICAgICAgICAgICAgKHZvaWQqKW5FbGVtZW50Q3JlYXRlMiB9LApAQCAtMTQyMCwyOCArMTQ1OSwyNCBAQAogeyJuQWRhcHRlcjJEQ3JlYXRlIiwgICAgICAgICAgICAgICAiKClJIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5BZGFwdGVyMkRDcmVhdGUgfSwKIAogeyJuU2NyaXB0QmluZEFsbG9jYXRpb24iLCAgICAgICAgICAiKElJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5TY3JpcHRCaW5kQWxsb2NhdGlvbiB9LAoteyJuU2NyaXB0U2V0Q2xlYXJDb2xvciIsICAgICAgICAgICAiKElGRkZGKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5TY3JpcHRTZXRDbGVhckNvbG9yIH0sCi17Im5TY3JpcHRTZXRDbGVhckRlcHRoIiwgICAgICAgICAgICIoSUYpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblNjcmlwdFNldENsZWFyRGVwdGggfSwKLXsiblNjcmlwdFNldENsZWFyU3RlbmNpbCIsICAgICAgICAgIihJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluU2NyaXB0U2V0Q2xlYXJTdGVuY2lsIH0sCiB7Im5TY3JpcHRTZXRUaW1lWm9uZSIsICAgICAgICAgICAgICIoSVtCKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblNjcmlwdFNldFRpbWVab25lIH0sCi17Im5TY3JpcHRTZXRUeXBlIiwgICAgICAgICAgICAgICAgICIoSVpMamF2YS9sYW5nL1N0cmluZztJKVYiLCAgICAgICAgICAgICAodm9pZCopblNjcmlwdFNldFR5cGUgfSwKLXsiblNjcmlwdFNldFJvb3QiLCAgICAgICAgICAgICAgICAgIihaKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluU2NyaXB0U2V0Um9vdCB9LAoteyJuU2NyaXB0U2V0SW52b2thYmxlIiwgICAgICAgICAgICAiKExqYXZhL2xhbmcvU3RyaW5nO0kpViIsICAgICAgICAgICAgICAgKHZvaWQqKW5TY3JpcHRTZXRJbnZva2UgfSwKIHsiblNjcmlwdEludm9rZSIsICAgICAgICAgICAgICAgICAgIihJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluU2NyaXB0SW52b2tlIH0sCit7Im5TY3JpcHRJbnZva2VWIiwgICAgICAgICAgICAgICAgICIoSUlbQilWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblNjcmlwdEludm9rZVYgfSwKK3siblNjcmlwdFNldFZhckkiLCAgICAgICAgICAgICAgICAgIihJSUkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluU2NyaXB0U2V0VmFySSB9LAoreyJuU2NyaXB0U2V0VmFyRiIsICAgICAgICAgICAgICAgICAiKElJRilWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5TY3JpcHRTZXRWYXJGIH0sCit7Im5TY3JpcHRTZXRWYXJWIiwgICAgICAgICAgICAgICAgICIoSUlbQilWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblNjcmlwdFNldFZhclYgfSwKIAogeyJuU2NyaXB0Q0JlZ2luIiwgICAgICAgICAgICAgICAgICAiKClWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5TY3JpcHRDQmVnaW4gfSwKIHsiblNjcmlwdENTZXRTY3JpcHQiLCAgICAgICAgICAgICAgIihbQklJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluU2NyaXB0Q1NldFNjcmlwdCB9LAogeyJuU2NyaXB0Q0NyZWF0ZSIsICAgICAgICAgICAgICAgICAiKClJIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5TY3JpcHRDQ3JlYXRlIH0sCi17Im5TY3JpcHRDQWRkRGVmaW5lSTMyIiwgICAgICAgICAgICIoTGphdmEvbGFuZy9TdHJpbmc7SSlWIiwgICAgICAgICAgICAgICAodm9pZCopblNjcmlwdENBZGREZWZpbmVJMzIgfSwKLXsiblNjcmlwdENBZGREZWZpbmVGIiwgICAgICAgICAgICAgIihMamF2YS9sYW5nL1N0cmluZztGKVYiLCAgICAgICAgICAgICAgICh2b2lkKiluU2NyaXB0Q0FkZERlZmluZUYgfSwKIAoteyJuUHJvZ3JhbUZyYWdtZW50U3RvcmVCZWdpbiIsICAgICAiKElJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Qcm9ncmFtRnJhZ21lbnRTdG9yZUJlZ2luIH0sCi17Im5Qcm9ncmFtRnJhZ21lbnRTdG9yZURlcHRoRnVuYyIsICIoSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblByb2dyYW1GcmFnbWVudFN0b3JlRGVwdGhGdW5jIH0sCi17Im5Qcm9ncmFtRnJhZ21lbnRTdG9yZURlcHRoTWFzayIsICIoWilWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblByb2dyYW1GcmFnbWVudFN0b3JlRGVwdGhNYXNrIH0sCi17Im5Qcm9ncmFtRnJhZ21lbnRTdG9yZUNvbG9yTWFzayIsICIoWlpaWilWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblByb2dyYW1GcmFnbWVudFN0b3JlQ29sb3JNYXNrIH0sCi17Im5Qcm9ncmFtRnJhZ21lbnRTdG9yZUJsZW5kRnVuYyIsICIoSUkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblByb2dyYW1GcmFnbWVudFN0b3JlQmxlbmRGdW5jIH0sCi17Im5Qcm9ncmFtRnJhZ21lbnRTdG9yZURpdGhlciIsICAgICIoWilWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblByb2dyYW1GcmFnbWVudFN0b3JlRGl0aGVyIH0sCi17Im5Qcm9ncmFtRnJhZ21lbnRTdG9yZUNyZWF0ZSIsICAgICIoKUkiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblByb2dyYW1GcmFnbWVudFN0b3JlQ3JlYXRlIH0sCit7Im5Qcm9ncmFtU3RvcmVCZWdpbiIsICAgICAgICAgICAgICIoSUkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblByb2dyYW1TdG9yZUJlZ2luIH0sCit7Im5Qcm9ncmFtU3RvcmVEZXB0aEZ1bmMiLCAgICAgICAgICIoSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblByb2dyYW1TdG9yZURlcHRoRnVuYyB9LAoreyJuUHJvZ3JhbVN0b3JlRGVwdGhNYXNrIiwgICAgICAgICAiKFopViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Qcm9ncmFtU3RvcmVEZXB0aE1hc2sgfSwKK3siblByb2dyYW1TdG9yZUNvbG9yTWFzayIsICAgICAgICAgIihaWlpaKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluUHJvZ3JhbVN0b3JlQ29sb3JNYXNrIH0sCit7Im5Qcm9ncmFtU3RvcmVCbGVuZEZ1bmMiLCAgICAgICAgICIoSUkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblByb2dyYW1TdG9yZUJsZW5kRnVuYyB9LAoreyJuUHJvZ3JhbVN0b3JlRGl0aGVyIiwgICAgICAgICAgICAiKFopViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Qcm9ncmFtU3RvcmVEaXRoZXIgfSwKK3siblByb2dyYW1TdG9yZUNyZWF0ZSIsICAgICAgICAgICAgIigpSSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluUHJvZ3JhbVN0b3JlQ3JlYXRlIH0sCiAKIHsiblByb2dyYW1CaW5kQ29uc3RhbnRzIiwgICAgICAgICAgIihJSUkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluUHJvZ3JhbUJpbmRDb25zdGFudHMgfSwKIHsiblByb2dyYW1CaW5kVGV4dHVyZSIsICAgICAgICAgICAgIihJSUkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluUHJvZ3JhbUJpbmRUZXh0dXJlIH0sCkBAIC0xNDY1LDcgKzE1MDAsNyBAQAogeyJuTGlnaHRTZXRQb3NpdGlvbiIsICAgICAgICAgICAgICAiKElGRkYpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5MaWdodFNldFBvc2l0aW9uIH0sCiAKIHsibkNvbnRleHRCaW5kUm9vdFNjcmlwdCIsICAgICAgICAgIihJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQ29udGV4dEJpbmRSb290U2NyaXB0IH0sCi17Im5Db250ZXh0QmluZFByb2dyYW1GcmFnbWVudFN0b3JlIiwiKEkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkNvbnRleHRCaW5kUHJvZ3JhbUZyYWdtZW50U3RvcmUgfSwKK3sibkNvbnRleHRCaW5kUHJvZ3JhbVN0b3JlIiwgICAgICAgIihJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Db250ZXh0QmluZFByb2dyYW1TdG9yZSB9LAogeyJuQ29udGV4dEJpbmRQcm9ncmFtRnJhZ21lbnQiLCAgICAiKEkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Db250ZXh0QmluZFByb2dyYW1GcmFnbWVudCB9LAogeyJuQ29udGV4dEJpbmRQcm9ncmFtVmVydGV4IiwgICAgICAiKEkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Db250ZXh0QmluZFByb2dyYW1WZXJ0ZXggfSwKIHsibkNvbnRleHRCaW5kUHJvZ3JhbVJhc3RlciIsICAgICAgIihJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQ29udGV4dEJpbmRQcm9ncmFtUmFzdGVyIH0sCmRpZmYgLS1naXQgYS9pY3U0ai9qYXZhL2FuZHJvaWQvaWN1L3RleHQvQXJhYmljU2hhcGluZy5qYXZhIGIvaWN1NGovamF2YS9hbmRyb2lkL2ljdS90ZXh0L0FyYWJpY1NoYXBpbmcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xM2UyMTc1Ci0tLSAvZGV2L251bGwKKysrIGIvaWN1NGovamF2YS9hbmRyb2lkL2ljdS90ZXh0L0FyYWJpY1NoYXBpbmcuamF2YQpAQCAtMCwwICsxLDE5NDcgQEAKKy8qCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICAgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDksIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMKKyogICBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCisKKy8qCisgKiBQb3J0ZWQgd2l0aCBtaW5vciBtb2RpZmljYXRpb25zIGZyb20gSUNVNEogNC4yJ3MKKyAqIGNvbS5pYm0uaWN1LnRleHQuQXJhYmljU2hhcGluZyBjbGFzcy4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuaWN1LnRleHQ7CisKKworLyoqCisgKiBTaGFwZSBBcmFiaWMgdGV4dCBvbiBhIGNoYXJhY3RlciBiYXNpcy4KKyAqCisgKiA8cD5BcmFiaWNTaGFwaW5nIHBlcmZvcm1zIGJhc2ljIG9wZXJhdGlvbnMgZm9yICJzaGFwaW5nIiBBcmFiaWMgdGV4dC4gSXQgaXMgbW9zdAorICogdXNlZnVsIGZvciB1c2Ugd2l0aCBsZWdhY3kgZGF0YSBmb3JtYXRzIGFuZCBsZWdhY3kgZGlzcGxheSB0ZWNobm9sb2d5CisgKiAoc2ltcGxlIHRlcm1pbmFscykuIEFsbCBvcGVyYXRpb25zIGFyZSBwZXJmb3JtZWQgb24gVW5pY29kZSBjaGFyYWN0ZXJzLjwvcD4KKyAqCisgKiA8cD5UZXh0LWJhc2VkIHNoYXBpbmcgbWVhbnMgdGhhdCBzb21lIGNoYXJhY3RlciBjb2RlIHBvaW50cyBpbiB0aGUgdGV4dCBhcmUKKyAqIHJlcGxhY2VkIGJ5IG90aGVycyBkZXBlbmRpbmcgb24gdGhlIGNvbnRleHQuIEl0IHRyYW5zZm9ybXMgb25lIGtpbmQgb2YgdGV4dAorICogaW50byBhbm90aGVyLiBJbiBjb21wYXJpc29uLCBtb2Rlcm4gZGlzcGxheXMgZm9yIEFyYWJpYyB0ZXh0IHNlbGVjdAorICogYXBwcm9wcmlhdGUsIGNvbnRleHQtZGVwZW5kZW50IGZvbnQgZ2x5cGhzIGZvciBlYWNoIHRleHQgZWxlbWVudCwgd2hpY2ggbWVhbnMKKyAqIHRoYXQgdGhleSB0cmFuc2Zvcm0gdGV4dCBpbnRvIGEgZ2x5cGggdmVjdG9yLjwvcD4KKyAqCisgKiA8cD5UZXh0IHRyYW5zZm9ybWF0aW9ucyBhcmUgbmVjZXNzYXJ5IHdoZW4gbW9kZXJuIGRpc3BsYXkgdGVjaG5vbG9neSBpcyBub3QKKyAqIGF2YWlsYWJsZSBvciB3aGVuIHRleHQgbmVlZHMgdG8gYmUgdHJhbnNmb3JtZWQgdG8gb3IgZnJvbSBsZWdhY3kgZm9ybWF0cyB0aGF0CisgKiB1c2UgInNoYXBlZCIgY2hhcmFjdGVycy4gU2luY2UgdGhlIEFyYWJpYyBzY3JpcHQgaXMgY3Vyc2l2ZSwgY29ubmVjdGluZworICogYWRqYWNlbnQgbGV0dGVycyB0byBlYWNoIG90aGVyLCBjb21wdXRlcnMgc2VsZWN0IGltYWdlcyBmb3IgZWFjaCBsZXR0ZXIgYmFzZWQKKyAqIG9uIHRoZSBzdXJyb3VuZGluZyBsZXR0ZXJzLiBUaGlzIHVzdWFsbHkgcmVzdWx0cyBpbiBmb3VyIGltYWdlcyBwZXIgQXJhYmljCisgKiBsZXR0ZXI6IGluaXRpYWwsIG1pZGRsZSwgZmluYWwsIGFuZCBpc29sYXRlZCBmb3Jtcy4gSW4gVW5pY29kZSwgb24gdGhlIG90aGVyCisgKiBoYW5kLCBsZXR0ZXJzIGFyZSBub3JtYWxseSBzdG9yZWQgYWJzdHJhY3QsIGFuZCBhIGRpc3BsYXkgc3lzdGVtIGlzIGV4cGVjdGVkCisgKiB0byBzZWxlY3QgdGhlIG5lY2Vzc2FyeSBnbHlwaHMuIChUaGlzIG1ha2VzIHNlYXJjaGluZyBhbmQgb3RoZXIgdGV4dAorICogcHJvY2Vzc2luZyBlYXNpZXIgYmVjYXVzZSB0aGUgc2FtZSBsZXR0ZXIgaGFzIG9ubHkgb25lIGNvZGUuKSBJdCBpcyBwb3NzaWJsZQorICogdG8gbWltaWMgdGhpcyB3aXRoIHRleHQgdHJhbnNmb3JtYXRpb25zIGJlY2F1c2UgdGhlcmUgYXJlIGNoYXJhY3RlcnMgaW4KKyAqIFVuaWNvZGUgdGhhdCBhcmUgcmVuZGVyZWQgYXMgbGV0dGVycyB3aXRoIGEgc3BlY2lmaWMgc2hhcGUKKyAqIChvciBjdXJzaXZlIGNvbm5lY3Rpdml0eSkuIFRoZXkgd2VyZSBpbmNsdWRlZCBmb3IgaW50ZXJvcGVyYWJpbGl0eSB3aXRoCisgKiBsZWdhY3kgc3lzdGVtcyBhbmQgY29kZXBhZ2VzLCBhbmQgZm9yIHVuc29waGlzdGljYXRlZCBkaXNwbGF5IHN5c3RlbXMuPC9wPgorICoKKyAqIDxwPkEgc2Vjb25kIGtpbmQgb2YgdGV4dCB0cmFuc2Zvcm1hdGlvbnMgaXMgc3VwcG9ydGVkIGZvciBBcmFiaWMgZGlnaXRzOgorICogRm9yIGNvbXBhdGliaWxpdHkgd2l0aCBsZWdhY3kgY29kZXBhZ2VzIHRoYXQgb25seSBpbmNsdWRlIEV1cm9wZWFuIGRpZ2l0cywKKyAqIGl0IGlzIHBvc3NpYmxlIHRvIHJlcGxhY2Ugb25lIHNldCBvZiBkaWdpdHMgYnkgYW5vdGhlciwgY2hhbmdpbmcgdGhlCisgKiBjaGFyYWN0ZXIgY29kZSBwb2ludHMuIFRoZXNlIG9wZXJhdGlvbnMgY2FuIGJlIHBlcmZvcm1lZCBmb3IgZWl0aGVyCisgKiBBcmFiaWMtSW5kaWMgRGlnaXRzIChVKzA2NjAuLi5VKzA2NjkpIG9yIEVhc3Rlcm4gKEV4dGVuZGVkKSBBcmFiaWMtSW5kaWMKKyAqIGRpZ2l0cyAoVSswNmYwLi4uVSswNmY5KS48L3A+CisgKgorICogPHA+U29tZSByZXBsYWNlbWVudHMgbWF5IHJlc3VsdCBpbiBtb3JlIG9yIGZld2VyIGNoYXJhY3RlcnMgKGNvZGUgcG9pbnRzKS4KKyAqIEJ5IGRlZmF1bHQsIHRoaXMgbWVhbnMgdGhhdCB0aGUgZGVzdGluYXRpb24gYnVmZmVyIG1heSByZWNlaXZlIHRleHQgd2l0aCBhCisgKiBsZW5ndGggZGlmZmVyZW50IGZyb20gdGhlIHNvdXJjZSBsZW5ndGguIFNvbWUgbGVnYWN5IHN5c3RlbXMgcmVseSBvbiB0aGUKKyAqIGxlbmd0aCBvZiB0aGUgdGV4dCB0byBiZSBjb25zdGFudC4gVGhleSBleHBlY3QgZXh0cmEgc3BhY2VzIHRvIGJlIGFkZGVkCisgKiBvciBjb25zdW1lZCBlaXRoZXIgbmV4dCB0byB0aGUgYWZmZWN0ZWQgY2hhcmFjdGVyIG9yIGF0IHRoZSBlbmQgb2YgdGhlCisgKiB0ZXh0LjwvcD4KKyAqIEBzdGFibGUgSUNVIDIuMAorICoKKyAqIEBoaWRlCisgKi8KK3B1YmxpYyBjbGFzcyBBcmFiaWNTaGFwaW5nIHsKKyAgICBwcml2YXRlIGZpbmFsIGludCBvcHRpb25zOworICAgIHByaXZhdGUgYm9vbGVhbiBpc0xvZ2ljYWw7IC8vIGNvbnZlbmllbmNlCisgICAgcHJpdmF0ZSBib29sZWFuIHNwYWNlc1JlbGF0aXZlVG9UZXh0QmVnaW5FbmQ7CisgICAgcHJpdmF0ZSBjaGFyIHRhaWxDaGFyOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBBcmFiaWNTaGFwaW5nIFNIQVBFUiA9IG5ldyBBcmFiaWNTaGFwaW5nKAorICAgICAgICAgICAgQXJhYmljU2hhcGluZy5URVhUX0RJUkVDVElPTl9MT0dJQ0FMIHwKKyAgICAgICAgICAgIEFyYWJpY1NoYXBpbmcuTEVOR1RIX0ZJWEVEX1NQQUNFU19ORUFSIHwKKyAgICAgICAgICAgIEFyYWJpY1NoYXBpbmcuTEVUVEVSU19TSEFQRSB8CisgICAgICAgICAgICBBcmFiaWNTaGFwaW5nLkRJR0lUU19OT09QKTsKKworICAgIC8qKgorICAgICAqIENvbnZlcnQgYSByYW5nZSBvZiB0ZXh0IGluIHRoZSBzb3VyY2UgYXJyYXksIHB1dHRpbmcgdGhlIHJlc3VsdAorICAgICAqIGludG8gYSByYW5nZSBvZiB0ZXh0IGluIHRoZSBkZXN0aW5hdGlvbiBhcnJheSwgYW5kIHJldHVybiB0aGUgbnVtYmVyCisgICAgICogb2YgY2hhcmFjdGVycyB3cml0dGVuLgorICAgICAqCisgICAgICogQHBhcmFtIHNvdXJjZSBBbiBhcnJheSBjb250YWluaW5nIHRoZSBpbnB1dCB0ZXh0CisgICAgICogQHBhcmFtIHNvdXJjZVN0YXJ0IFRoZSBzdGFydCBvZiB0aGUgcmFuZ2Ugb2YgdGV4dCB0byBjb252ZXJ0CisgICAgICogQHBhcmFtIHNvdXJjZUxlbmd0aCBUaGUgbGVuZ3RoIG9mIHRoZSByYW5nZSBvZiB0ZXh0IHRvIGNvbnZlcnQKKyAgICAgKiBAcGFyYW0gZGVzdCBUaGUgZGVzdGluYXRpb24gYXJyYXkgdGhhdCB3aWxsIHJlY2VpdmUgdGhlIHJlc3VsdC4KKyAgICAgKiAgIEl0IG1heSBiZSA8Y29kZT5OVUxMPC9jb2RlPiBvbmx5IGlmICA8Y29kZT5kZXN0U2l6ZTwvY29kZT4gaXMgMC4KKyAgICAgKiBAcGFyYW0gZGVzdFN0YXJ0IFRoZSBzdGFydCBvZiB0aGUgcmFuZ2Ugb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlciB0byB1c2UuCisgICAgICogQHBhcmFtIGRlc3RTaXplIFRoZSBzaXplIChjYXBhY2l0eSkgb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlci4KKyAgICAgKiAgIElmIDxjb2RlPmRlc3RTaXplPC9jb2RlPiBpcyAwLCB0aGVuIG5vIG91dHB1dCBpcyBwcm9kdWNlZCwKKyAgICAgKiAgIGJ1dCB0aGUgbmVjZXNzYXJ5IGJ1ZmZlciBzaXplIGlzIHJldHVybmVkICgicHJlZmxpZ2h0aW5nIikuICBUaGlzCisgICAgICogICBkb2VzIG5vdCB2YWxpZGF0ZSB0aGUgdGV4dCBhZ2FpbnN0IHRoZSBvcHRpb25zLCBmb3IgZXhhbXBsZSwKKyAgICAgKiAgIGlmIGxldHRlcnMgYXJlIGJlaW5nIHVuc2hhcGVkLCBhbmQgc3BhY2VzIGFyZSBiZWluZyBjb25zdW1lZAorICAgICAqICAgZm9sbG93aW5nIGxhbWFsZWYsIHRoaXMgd2lsbCBub3QgZGV0ZWN0IGEgbGFtYWxlZiB3aXRob3V0IGEKKyAgICAgKiAgIGNvcnJlc3BvbmRpbmcgc3BhY2UuICBBbiBlcnJvciB3aWxsIGJlIHRocm93biB3aGVuIHRoZSBhY3R1YWwKKyAgICAgKiAgIGNvbnZlcnNpb24gaXMgYXR0ZW1wdGVkLgorICAgICAqIEByZXR1cm4gVGhlIG51bWJlciBvZiBjaGFycyB3cml0dGVuIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIuCisgICAgICogICBJZiBhbiBlcnJvciBvY2N1cnMsIHRoZW4gbm8gb3V0cHV0IHdhcyB3cml0dGVuLCBvciBpdCBtYXkgYmUKKyAgICAgKiAgIGluY29tcGxldGUuCisgICAgICogQHRocm93cyBBcmFiaWNTaGFwaW5nRXhjZXB0aW9uIGlmIHRoZSB0ZXh0IGNhbm5vdCBiZSBjb252ZXJ0ZWQgYWNjb3JkaW5nIHRvIHRoZSBvcHRpb25zLgorICAgICAqIEBzdGFibGUgSUNVIDIuMAorICAgICAqLworICAgIHB1YmxpYyBpbnQgc2hhcGUoY2hhcltdIHNvdXJjZSwgaW50IHNvdXJjZVN0YXJ0LCBpbnQgc291cmNlTGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgY2hhcltdIGRlc3QsIGludCBkZXN0U3RhcnQsIGludCBkZXN0U2l6ZSkgdGhyb3dzIEFyYWJpY1NoYXBpbmdFeGNlcHRpb24geworICAgICAgICBpZiAoc291cmNlID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInNvdXJjZSBjYW4gbm90IGJlIG51bGwiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc291cmNlU3RhcnQgPCAwIHx8IHNvdXJjZUxlbmd0aCA8IDAgfHwgc291cmNlU3RhcnQgKyBzb3VyY2VMZW5ndGggPiBzb3VyY2UubGVuZ3RoKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJiYWQgc291cmNlIHN0YXJ0ICgiICsgc291cmNlU3RhcnQgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKSBvciBsZW5ndGggKCIgKyBzb3VyY2VMZW5ndGggKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKSBmb3IgYnVmZmVyIG9mIGxlbmd0aCAiICsgc291cmNlLmxlbmd0aCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRlc3QgPT0gbnVsbCAmJiBkZXN0U2l6ZSAhPSAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJudWxsIGRlc3QgcmVxdWlyZXMgZGVzdFNpemUgPT0gMCIpOworICAgICAgICB9CisgICAgICAgIGlmICgoZGVzdFNpemUgIT0gMCkgJiYKKyAgICAgICAgICAgIChkZXN0U3RhcnQgPCAwIHx8IGRlc3RTaXplIDwgMCB8fCBkZXN0U3RhcnQgKyBkZXN0U2l6ZSA+IGRlc3QubGVuZ3RoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiYmFkIGRlc3Qgc3RhcnQgKCIgKyBkZXN0U3RhcnQgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKSBvciBzaXplICgiICsgZGVzdFNpemUgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKSBmb3IgYnVmZmVyIG9mIGxlbmd0aCAiICsgZGVzdC5sZW5ndGgpOworICAgICAgICB9CisgICAgICAgIC8qIFZhbGlkYXRlIGlucHV0IG9wdGlvbnMgKi8KKyAgICAgICAgaWYgKCAoKG9wdGlvbnMmVEFTSEtFRUxfTUFTSykgPiAwKSAmJgorICAgICAgICAgICAgICEoKChvcHRpb25zICYgVEFTSEtFRUxfTUFTSyk9PVRBU0hLRUVMX0JFR0lOKSAgfHwKKyAgICAgICAgICAgICAgICgob3B0aW9ucyAmIFRBU0hLRUVMX01BU0spPT1UQVNIS0VFTF9FTkQgKSAgIHx8CisgICAgICAgICAgICAgICAoKG9wdGlvbnMgJiBUQVNIS0VFTF9NQVNLKT09VEFTSEtFRUxfUkVTSVpFICl8fAorICAgICAgICAgICAgICAgKChvcHRpb25zICYgVEFTSEtFRUxfTUFTSyk9PVRBU0hLRUVMX1JFUExBQ0VfQllfVEFUV0VFTCkpICl7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJXcm9uZyBUYXNoa2VlbCBhcmd1bWVudCIpOworICAgICAgICB9CisKKyAgICAgICAvLy9DTE9WRVI6T0ZGCisgICAgICAgLy9BY2NvcmRpbmcgdG8gU3RldmVuIExvb21pcywgdGhlIGNvZGUgaXMgdW5yZWFjaGFibGUgd2hlbiB5b3UgT1IgYWxsIHRoZSBjb25zdGFudHMgd2l0aGluIHRoZSBpZiBzdGF0ZW1lbnRzCisgICAgICAgaWYoKChvcHRpb25zJkxBTUFMRUZfTUFTSykgPiAwKSYmCisgICAgICAgICAgICAgICEoKChvcHRpb25zICYgTEFNQUxFRl9NQVNLKT09TEFNQUxFRl9CRUdJTikgIHx8CisgICAgICAgICAgICAgICAgKChvcHRpb25zICYgTEFNQUxFRl9NQVNLKT09TEFNQUxFRl9FTkQgKSAgIHx8CisgICAgICAgICAgICAgICAgKChvcHRpb25zICYgTEFNQUxFRl9NQVNLKT09TEFNQUxFRl9SRVNJWkUgKXx8CisgICAgICAgICAgICAgICAgICgob3B0aW9ucyAmIExBTUFMRUZfTUFTSyk9PUxBTUFMRUZfQVVUTykgIHx8CisgICAgICAgICAgICAgICAgICgob3B0aW9ucyAmIExBTUFMRUZfTUFTSyk9PUxBTUFMRUZfTkVBUikpKXsKKyAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiV3JvbmcgTGFtIEFsZWYgYXJndW1lbnQiKTsKKyAgICAgICB9CisgICAgICAgLy8vQ0xPVkVSOk9OCisKKyAgICAgICAvKiBWYWxpZGF0ZSBUYXNoa2VlbCAoVGFzaGtlZWwgcmVwbGFjZW1lbnQgb3B0aW9ucyBzaG91bGQgYmUgZW5hYmxlZCBpbiBzaGFwaW5nIG1vZGUgb25seSkqLworICAgICAgIGlmKCgob3B0aW9ucyZUQVNIS0VFTF9NQVNLKSA+IDApICYmIChvcHRpb25zJkxFVFRFUlNfTUFTSykgPT0gTEVUVEVSU19VTlNIQVBFKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUYXNoa2VlbCByZXBsYWNlbWVudCBzaG91bGQgbm90IGJlIGVuYWJsZWQgaW4gZGVzaGFwaW5nIG1vZGUgIik7CisgICAgICAgfQorICAgICAgIHJldHVybiBpbnRlcm5hbFNoYXBlKHNvdXJjZSwgc291cmNlU3RhcnQsIHNvdXJjZUxlbmd0aCwgZGVzdCwgZGVzdFN0YXJ0LCBkZXN0U2l6ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udmVydCBhIHJhbmdlIG9mIHRleHQgaW4gcGxhY2UuICBUaGlzIG1heSBvbmx5IGJlIHVzZWQgaWYgdGhlIExlbmd0aCBvcHRpb24KKyAgICAgKiBkb2VzIG5vdCBncm93IG9yIHNocmluayB0aGUgdGV4dC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzb3VyY2UgQW4gYXJyYXkgY29udGFpbmluZyB0aGUgaW5wdXQgdGV4dAorICAgICAqIEBwYXJhbSBzdGFydCBUaGUgc3RhcnQgb2YgdGhlIHJhbmdlIG9mIHRleHQgdG8gY29udmVydAorICAgICAqIEBwYXJhbSBsZW5ndGggVGhlIGxlbmd0aCBvZiB0aGUgcmFuZ2Ugb2YgdGV4dCB0byBjb252ZXJ0CisgICAgICogQHRocm93cyBBcmFiaWNTaGFwaW5nRXhjZXB0aW9uIGlmIHRoZSB0ZXh0IGNhbm5vdCBiZSBjb252ZXJ0ZWQgYWNjb3JkaW5nIHRvIHRoZSBvcHRpb25zLgorICAgICAqIEBzdGFibGUgSUNVIDIuMAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNoYXBlKGNoYXJbXSBzb3VyY2UsIGludCBzdGFydCwgaW50IGxlbmd0aCkgdGhyb3dzIEFyYWJpY1NoYXBpbmdFeGNlcHRpb24geworICAgICAgICBpZiAoKG9wdGlvbnMgJiBMQU1BTEVGX01BU0spID09IExBTUFMRUZfUkVTSVpFKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQXJhYmljU2hhcGluZ0V4Y2VwdGlvbigiQ2Fubm90IHNoYXBlIGluIHBsYWNlIHdpdGggbGVuZ3RoIG9wdGlvbiByZXNpemUuIik7CisgICAgICAgIH0KKyAgICAgICAgc2hhcGUoc291cmNlLCBzdGFydCwgbGVuZ3RoLCBzb3VyY2UsIHN0YXJ0LCBsZW5ndGgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnZlcnQgYSBzdHJpbmcsIHJldHVybmluZyB0aGUgbmV3IHN0cmluZy4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0ZXh0IHRoZSBzdHJpbmcgdG8gY29udmVydAorICAgICAqIEByZXR1cm4gdGhlIGNvbnZlcnRlZCBzdHJpbmcKKyAgICAgKiBAdGhyb3dzIEFyYWJpY1NoYXBpbmdFeGNlcHRpb24gaWYgdGhlIHN0cmluZyBjYW5ub3QgYmUgY29udmVydGVkIGFjY29yZGluZyB0byB0aGUgb3B0aW9ucy4KKyAgICAgKiBAc3RhYmxlIElDVSAyLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHNoYXBlKFN0cmluZyB0ZXh0KSB0aHJvd3MgQXJhYmljU2hhcGluZ0V4Y2VwdGlvbiB7CisgICAgICAgIGNoYXJbXSBzcmMgPSB0ZXh0LnRvQ2hhckFycmF5KCk7CisgICAgICAgIGNoYXJbXSBkZXN0ID0gc3JjOworICAgICAgICBpZiAoKChvcHRpb25zICYgTEFNQUxFRl9NQVNLKSA9PSBMQU1BTEVGX1JFU0laRSkgJiYKKyAgICAgICAgICAgICgob3B0aW9ucyAmIExFVFRFUlNfTUFTSykgPT0gTEVUVEVSU19VTlNIQVBFKSkgeworCisgICAgICAgICAgICBkZXN0ID0gbmV3IGNoYXJbc3JjLmxlbmd0aCAqIDJdOyAvLyBtYXgKKyAgICAgICAgfQorICAgICAgICBpbnQgbGVuID0gc2hhcGUoc3JjLCAwLCBzcmMubGVuZ3RoLCBkZXN0LCAwLCBkZXN0Lmxlbmd0aCk7CisKKyAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoZGVzdCwgMCwgbGVuKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgQXJhYmljU2hhcGluZyB1c2luZyB0aGUgb3B0aW9ucyBmbGFncy4KKyAgICAgKiBUaGUgZmxhZ3MgYXJlIGFzIGZvbGxvd3M6PGJyPgorICAgICAqICdMRU5HVEgnIGZsYWdzIGNvbnRyb2wgd2hldGhlciB0aGUgdGV4dCBjYW4gY2hhbmdlIHNpemUsIGFuZCBpZiBub3QsCisgICAgICogaG93IHRvIG1haW50YWluIHRoZSBzaXplIG9mIHRoZSB0ZXh0IHdoZW4gTGFtQWxlZiBsaWdhdHVyZXMgYXJlCisgICAgICogZm9ybWVkIG9yIGJyb2tlbi48YnI+CisgICAgICogJ1RFWFRfRElSRUNUSU9OJyBmbGFncyBjb250cm9sIHdoZXRoZXIgdGhlIHRleHQgaXMgcmVhZCBhbmQgd3JpdHRlbgorICAgICAqIGluIHZpc3VhbCBvcmRlciBvciBpbiBsb2dpY2FsIG9yZGVyLjxicj4KKyAgICAgKiAnTEVUVEVSU19TSEFQRScgZmxhZ3MgY29udHJvbCB3aGV0aGVyIGNvbnZlcnNpb24gaXMgdG8gb3IgZnJvbQorICAgICAqIHByZXNlbnRhdGlvbiBmb3Jtcy48YnI+CisgICAgICogJ0RJR0lUUycgZmxhZ3MgY29udHJvbCB3aGV0aGVyIGRpZ2l0cyBhcmUgc2hhcGVkLCBhbmQgd2hldGhlciBmcm9tCisgICAgICogRXVyb3BlYW4gdG8gQXJhYmljLUluZGljIG9yIHZpY2UtdmVyc2EuPGJyPgorICAgICAqICdESUdJVF9UWVBFJyBmbGFncyBjb250cm9sIHdoZXRoZXIgc3RhbmRhcmQgb3IgZXh0ZW5kZWQgQXJhYmljLUluZGljCisgICAgICogZGlnaXRzIGFyZSB1c2VkIHdoZW4gcGVyZm9ybWluZyBkaWdpdCBjb252ZXJzaW9uLgorICAgICAqIEBzdGFibGUgSUNVIDIuMAorICAgICAqLworICAgIHB1YmxpYyBBcmFiaWNTaGFwaW5nKGludCBvcHRpb25zKSB7CisgICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7CisgICAgICAgIGlmICgob3B0aW9ucyAmIERJR0lUU19NQVNLKSA+IDB4ODApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImJhZCBESUdJVFMgb3B0aW9ucyIpOworICAgICAgICB9CisKKyAgICAgICAgaXNMb2dpY2FsID0gKCAob3B0aW9ucyAmIFRFWFRfRElSRUNUSU9OX01BU0spID09IFRFWFRfRElSRUNUSU9OX0xPR0lDQUwgKTsKKyAgICAgICAgLyogVmFsaWRhdGUgb3B0aW9ucyAqLworICAgICAgICBzcGFjZXNSZWxhdGl2ZVRvVGV4dEJlZ2luRW5kID0gKCAob3B0aW9ucyAmIFNQQUNFU19SRUxBVElWRV9UT19URVhUX01BU0spID09IFNQQUNFU19SRUxBVElWRV9UT19URVhUX0JFR0lOX0VORCApOworICAgICAgICBpZiAoIChvcHRpb25zJlNIQVBFX1RBSUxfVFlQRV9NQVNLKSA9PSBTSEFQRV9UQUlMX05FV19VTklDT0RFKXsKKyAgICAgICAgICAgIHRhaWxDaGFyID0gTkVXX1RBSUxfQ0hBUjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRhaWxDaGFyID0gT0xEX1RBSUxfQ0hBUjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIFNlZW4gVGFpbCBvcHRpb25zICovCisgICAgLyoqCisgICAgICogTWVtb3J5IG9wdGlvbjogdGhlIHJlc3VsdCBtdXN0IGhhdmUgdGhlIHNhbWUgbGVuZ3RoIGFzIHRoZSBzb3VyY2UuCisgICAgICogU2hhcGluZyBtb2RlOiBUaGUgU0VFTiBmYW1pbHkgY2hhcmFjdGVyIHdpbGwgZXhwYW5kIGludG8gdHdvIGNoYXJhY3RlcnMgdXNpbmcgc3BhY2UgbmVhcgorICAgICAqICAgICAgICAgICAgICAgdGhlIFNFRU4gZmFtaWx5IGNoYXJhY3RlcihpLmUuIHRoZSBzcGFjZSBhZnRlciB0aGUgY2hhcmFjdGVyKS4KKyAgICAgKiAgICAgICAgICAgICAgIGlmIHRoZXJlIGFyZSBubyBzcGFjZXMgZm91bmQsIEFyYWJpY1NoYXBpbmdFeGNlcHRpb24gd2lsbCBiZSB0aHJvd24KKyAgICAgKgorICAgICAqIERlLXNoYXBpbmcgbW9kZTogQW55IFNlZW4gY2hhcmFjdGVyIGZvbGxvd2VkIGJ5IFRhaWwgY2hhcmFjdGVyIHdpbGwgYmUKKyAgICAgKiAgICAgICAgICAgICAgICAgIHJlcGxhY2VkIGJ5IG9uZSBjZWxsIFNlZW4gYW5kIGEgc3BhY2Ugd2lsbCByZXBsYWNlIHRoZSBUYWlsLgorICAgICAqIEFmZmVjdHM6IFNlZW4gb3B0aW9ucworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFRU5fVFdPQ0VMTF9ORUFSID0gMHgyMDAwMDA7CisKKyAgICAvKiogQml0IG1hc2sgZm9yIFNlZW4gbWVtb3J5IG9wdGlvbnMuICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VFTl9NQVNLID0gMHg3MDAwMDA7CisKKyAgICAvKiBZZWhIYW16YSBvcHRpb25zICovCisgICAgLyoqCisgICAgICogTWVtb3J5IG9wdGlvbjogdGhlIHJlc3VsdCBtdXN0IGhhdmUgdGhlIHNhbWUgbGVuZ3RoIGFzIHRoZSBzb3VyY2UuCisgICAgICogU2hhcGluZyBtb2RlOiBUaGUgWUVISEFNWkEgY2hhcmFjdGVyIHdpbGwgZXhwYW5kIGludG8gdHdvIGNoYXJhY3RlcnMgdXNpbmcgc3BhY2UgbmVhciBpdAorICAgICAqICAgICAgICAgICAgICAoaS5lLiB0aGUgc3BhY2UgYWZ0ZXIgdGhlIGNoYXJhY3RlcikKKyAgICAgKiAgICAgICAgICAgICAgIGlmIHRoZXJlIGFyZSBubyBzcGFjZXMgZm91bmQsIEFyYWJpY1NoYXBpbmdFeGNlcHRpb24gd2lsbCBiZSB0aHJvd24KKyAgICAgKgorICAgICAqIERlLXNoYXBpbmcgbW9kZTogQW55IFllaCAoZmluYWwgb3IgaXNvbGF0ZWQpIGNoYXJhY3RlciBmb2xsb3dlZCBieSBIYW16YSBjaGFyYWN0ZXIgd2lsbCBiZQorICAgICAqICAgICAgICAgICAgICAgICAgcmVwbGFjZWQgYnkgb25lIGNlbGwgWWVoSGFtemEgYW5kIHNwYWNlIHdpbGwgcmVwbGFjZSB0aGUgSGFtemEuCisgICAgICogQWZmZWN0czogWWVoSGFtemEgb3B0aW9ucworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFlFSEhBTVpBX1RXT0NFTExfTkVBUiAgPSAweDEwMDAwMDA7CisKKworICAgIC8qKiBCaXQgbWFzayBmb3IgWWVoSGFtemEgbWVtb3J5IG9wdGlvbnMuICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWUVISEFNWkFfTUFTSyA9IDB4MzgwMDAwMDsKKworICAgIC8qIE5ldyBUYXNoa2VlbCBvcHRpb25zICovCisgICAgLyoqCisgICAgICogTWVtb3J5IG9wdGlvbjogdGhlIHJlc3VsdCBtdXN0IGhhdmUgdGhlIHNhbWUgbGVuZ3RoIGFzIHRoZSBzb3VyY2UuCisgICAgICogU2hhcGluZyBtb2RlOiBUYXNoa2VlbCBjaGFyYWN0ZXJzIHdpbGwgYmUgcmVwbGFjZWQgYnkgc3BhY2VzLgorICAgICAqICAgICAgICAgICAgICAgU3BhY2VzIHdpbGwgYmUgcGxhY2VkIGF0IGJlZ2lubmluZyBvZiB0aGUgYnVmZmVyCisgICAgICoKKyAgICAgKiBEZS1zaGFwaW5nIG1vZGU6IE4vQQorICAgICAqIEFmZmVjdHM6IFRhc2hrZWVsIG9wdGlvbnMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUQVNIS0VFTF9CRUdJTiA9IDB4NDAwMDA7CisKKyAgICAvKioKKyAgICAgKiBNZW1vcnkgb3B0aW9uOiB0aGUgcmVzdWx0IG11c3QgaGF2ZSB0aGUgc2FtZSBsZW5ndGggYXMgdGhlIHNvdXJjZS4KKyAgICAgKiBTaGFwaW5nIG1vZGU6IFRhc2hrZWVsIGNoYXJhY3RlcnMgd2lsbCBiZSByZXBsYWNlZCBieSBzcGFjZXMuCisgICAgICogICAgICAgICAgICAgICBTcGFjZXMgd2lsbCBiZSBwbGFjZWQgYXQgZW5kIG9mIHRoZSBidWZmZXIKKyAgICAgKgorICAgICAqIERlLXNoYXBpbmcgbW9kZTogTi9BCisgICAgICogQWZmZWN0czogVGFzaGtlZWwgb3B0aW9ucworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRBU0hLRUVMX0VORCA9IDB4NjAwMDA7CisKKyAgICAvKioKKyAgICAgKiBNZW1vcnkgb3B0aW9uOiBhbGxvdyB0aGUgcmVzdWx0IHRvIGhhdmUgYSBkaWZmZXJlbnQgbGVuZ3RoIHRoYW4gdGhlIHNvdXJjZS4KKyAgICAgKiBTaGFwaW5nIG1vZGU6IFRhc2hrZWVsIGNoYXJhY3RlcnMgd2lsbCBiZSByZW1vdmVkLCBidWZmZXIgbGVuZ3RoIHdpbGwgc2hyaW5rLgorICAgICAqIERlLXNoYXBpbmcgbW9kZTogTi9BCisgICAgICoKKyAgICAgKiBBZmZlY3RzOiBUYXNoa2VlbCBvcHRpb25zCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEFTSEtFRUxfUkVTSVpFID0gMHg4MDAwMDsKKworICAgIC8qKgorICAgICAqIE1lbW9yeSBvcHRpb246IHRoZSByZXN1bHQgbXVzdCBoYXZlIHRoZSBzYW1lIGxlbmd0aCBhcyB0aGUgc291cmNlLgorICAgICAqIFNoYXBpbmcgbW9kZTogVGFzaGtlZWwgY2hhcmFjdGVycyB3aWxsIGJlIHJlcGxhY2VkIGJ5IFRhdHdlZWwgaWYgaXQgaXMgY29ubmVjdGVkIHRvIGFkamFjZW50CisgICAgICogICAgICAgICAgICAgICBjaGFyYWN0ZXJzIChpLmUuIHNoYXBlZCBvbiBUYXR3ZWVsKSBvciByZXBsYWNlZCBieSBzcGFjZSBpZiBpdCBpcyBub3QgY29ubmVjdGVkLgorICAgICAqCisgICAgICogRGUtc2hhcGluZyBtb2RlOiBOL0EKKyAgICAgKiBBZmZlY3RzOiBZZWhIYW16YSBvcHRpb25zCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEFTSEtFRUxfUkVQTEFDRV9CWV9UQVRXRUVMID0gMHhDMDAwMDsKKworICAgIC8qKiBCaXQgbWFzayBmb3IgVGFzaGtlZWwgcmVwbGFjZW1lbnQgd2l0aCBTcGFjZSBvciBUYXR3ZWVsIG1lbW9yeSBvcHRpb25zLiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRBU0hLRUVMX01BU0sgID0gMHhFMDAwMDsKKworICAgIC8qIFNwYWNlIGxvY2F0aW9uIENvbnRyb2wgb3B0aW9ucyAqLworICAgIC8qKgorICAgICAqIFRoaXMgb3B0aW9uIGVmZmVjdHMgdGhlIG1lYW5pbmcgb2YgQkVHSU4gYW5kIEVORCBvcHRpb25zLiBpZiB0aGlzIG9wdGlvbiBpcyBub3QgdXNlZCB0aGUgZGVmYXVsdAorICAgICAqIGZvciBCRUdJTiBhbmQgRU5EIHdpbGwgYmUgYXMgZm9sbG93aW5nOgorICAgICAqIFRoZSBEZWZhdWx0IChmb3IgYm90aCBWaXN1YWwgTFRSLCBWaXN1YWwgUlRMIGFuZCBMb2dpY2FsIFRleHQpCisgICAgICogICAgICAgICAgIDEuIEJFR0lOIGFsd2F5cyByZWZlcnMgdG8gdGhlIHN0YXJ0IGFkZHJlc3Mgb2YgcGh5c2ljYWwgbWVtb3J5LgorICAgICAqICAgICAgICAgICAyLiBFTkQgYWx3YXlzIHJlZmVycyB0byB0aGUgZW5kIGFkZHJlc3Mgb2YgcGh5c2ljYWwgbWVtb3J5LgorICAgICAqCisgICAgICogSWYgdGhpcyBvcHRpb24gaXMgdXNlZCBpdCB3aWxsIHN3YXAgdGhlIG1lYW5pbmcgb2YgQkVHSU4gYW5kIEVORCBvbmx5IGZvciBWaXN1YWwgTFRSIHRleHQuCisgICAgICoKKyAgICAgKiBUaGUgYWZmZWN0IG9uIEJFR0lOIGFuZCBFTkQgTWVtb3J5IE9wdGlvbnMgd2lsbCBiZSBhcyBmb2xsb3dpbmc6CisgICAgICogICAgQS4gQkVHSU4gRm9yIFZpc3VhbCBMVFIgdGV4dDogVGhpcyB3aWxsIGJlIHRoZSBiZWdpbm5pbmcgKHJpZ2h0IHNpZGUpIG9mIHRoZSB2aXN1YWwgdGV4dAorICAgICAqICAgICAgIChjb3JyZXNwb25kaW5nIHRvIHRoZSBwaHlzaWNhbCBtZW1vcnkgYWRkcmVzcyBlbmQsIHNhbWUgYXMgRU5EIGluIGRlZmF1bHQgYmVoYXZpb3IpCisgICAgICogICAgQi4gQkVHSU4gRm9yIExvZ2ljYWwgdGV4dDogU2FtZSBhcyBCRUdJTiBpbiBkZWZhdWx0IGJlaGF2aW9yLgorICAgICAqICAgIEMuIEVORCBGb3IgVmlzdWFsIExUUiB0ZXh0OiBUaGlzIHdpbGwgYmUgdGhlIGVuZCAobGVmdCBzaWRlKSBvZiB0aGUgdmlzdWFsIHRleHQuIChjb3JyZXNwb25kaW5nIHRvCisgICAgICogICAgICB0aGUgcGh5c2ljYWwgbWVtb3J5IGFkZHJlc3MgYmVnaW5uaW5nLCBzYW1lIGFzIEJFR0lOIGluIGRlZmF1bHQgYmVoYXZpb3IpCisgICAgICogICAgRC4gRU5EIEZvciBMb2dpY2FsIHRleHQ6IFNhbWUgYXMgRU5EIGluIGRlZmF1bHQgYmVoYXZpb3IuCisgICAgICogQWZmZWN0czogQWxsIExhbUFsZWYgQkVHSU4sIEVORCBhbmQgQVVUTyBvcHRpb25zLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNQQUNFU19SRUxBVElWRV9UT19URVhUX0JFR0lOX0VORCA9IDB4NDAwMDAwMDsKKworICAgIC8qKiBCaXQgbWFzayBmb3Igc3dhcHBpbmcgQkVHSU4gYW5kIEVORCBmb3IgVmlzdWFsIExUUiB0ZXh0ICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1BBQ0VTX1JFTEFUSVZFX1RPX1RFWFRfTUFTSyA9IDB4NDAwMDAwMDsKKworICAgIC8qKgorICAgICAqIElmIHRoaXMgb3B0aW9uIGlzIHVzZWQsIHNoYXBpbmcgd2lsbCB1c2UgdGhlIG5ldyBVbmljb2RlIGNvZGUgcG9pbnQgZm9yIFRBSUwgKGkuZS4gMHhGRTczKS4KKyAgICAgKiBJZiB0aGlzIG9wdGlvbiBpcyBub3Qgc3BlY2lmaWVkIChEZWZhdWx0KSwgb2xkIHVub2ZmaWNpYWwgVW5pY29kZSBUQUlMIGNvZGUgcG9pbnQgaXMgdXNlZCAoaS5lLiAweDIwMEIpCisgICAgICogRGUtc2hhcGluZyB3aWxsIG5vdCB1c2UgdGhpcyBvcHRpb24gYXMgaXQgd2lsbCBhbHdheXMgc2VhcmNoIGZvciBib3RoIHRoZSBuZXcgVW5pY29kZSBjb2RlIHBvaW50IGZvciB0aGUKKyAgICAgKiBUQUlMIChpLmUuIDB4RkU3Mykgb3IgdGhlIG9sZCB1bm9mZmljaWFsIFVuaWNvZGUgVEFJTCBjb2RlIHBvaW50IChpLmUuIDB4MjAwQikgYW5kIGRlLXNoYXBlIHRoZQorICAgICAqIFNlZW4tRmFtaWx5IGxldHRlciBhY2NvcmRpbmdseS4KKyAgICAgKgorICAgICAqIFNoYXBpbmcgTW9kZTogT25seSBzaGFwaW5nLgorICAgICAqIERlLXNoYXBpbmcgTW9kZTogTi9BLgorICAgICAqIEFmZmVjdHM6IEFsbCBTZWVuIG9wdGlvbnMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSEFQRV9UQUlMX05FV19VTklDT0RFID0gMHg4MDAwMDAwOworCisgICAgLyoqIEJpdCBtYXNrIGZvciBuZXcgVW5pY29kZSBUYWlsIG9wdGlvbiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNIQVBFX1RBSUxfVFlQRV9NQVNLID0gMHg4MDAwMDAwOworCisgICAgLyoqCisgICAgICogTWVtb3J5IG9wdGlvbjogYWxsb3cgdGhlIHJlc3VsdCB0byBoYXZlIGEgZGlmZmVyZW50IGxlbmd0aCB0aGFuIHRoZSBzb3VyY2UuCisgICAgICogQHN0YWJsZSBJQ1UgMi4wCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTEVOR1RIX0dST1dfU0hSSU5LID0gMDsKKworICAgIC8qKgorICAgICAqIE1lbW9yeSBvcHRpb246IGFsbG93IHRoZSByZXN1bHQgdG8gaGF2ZSBhIGRpZmZlcmVudCBsZW5ndGggdGhhbiB0aGUgc291cmNlLgorICAgICAqIEFmZmVjdHM6IExhbUFsZWYgb3B0aW9ucworICAgICAqIFRoaXMgb3B0aW9uIGlzIGFuIGFsaWFzIHRvIExFTkdUSF9HUk9XX1NIUklOSworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExBTUFMRUZfUkVTSVpFICAgPSAwOworCisgICAgLyoqCisgICAgICogTWVtb3J5IG9wdGlvbjogdGhlIHJlc3VsdCBtdXN0IGhhdmUgdGhlIHNhbWUgbGVuZ3RoIGFzIHRoZSBzb3VyY2UuCisgICAgICogSWYgbW9yZSByb29tIGlzIG5lY2Vzc2FyeSwgdGhlbiB0cnkgdG8gY29uc3VtZSBzcGFjZXMgbmV4dCB0byBtb2RpZmllZCBjaGFyYWN0ZXJzLgorICAgICAqIEBzdGFibGUgSUNVIDIuMAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExFTkdUSF9GSVhFRF9TUEFDRVNfTkVBUiA9IDE7CisKKyAgICAvKioKKyAgICAgKiBNZW1vcnkgb3B0aW9uOiB0aGUgcmVzdWx0IG11c3QgaGF2ZSB0aGUgc2FtZSBsZW5ndGggYXMgdGhlIHNvdXJjZS4KKyAgICAgKiBJZiBtb3JlIHJvb20gaXMgbmVjZXNzYXJ5LCB0aGVuIHRyeSB0byBjb25zdW1lIHNwYWNlcyBuZXh0IHRvIG1vZGlmaWVkIGNoYXJhY3RlcnMuCisgICAgICogQWZmZWN0czogTGFtQWxlZiBvcHRpb25zCisgICAgICogVGhpcyBvcHRpb24gaXMgYW4gYWxpYXMgdG8gTEVOR1RIX0ZJWEVEX1NQQUNFU19ORUFSCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTEFNQUxFRl9ORUFSID0gMSA7CisKKyAgICAvKioKKyAgICAgKiBNZW1vcnkgb3B0aW9uOiB0aGUgcmVzdWx0IG11c3QgaGF2ZSB0aGUgc2FtZSBsZW5ndGggYXMgdGhlIHNvdXJjZS4KKyAgICAgKiBJZiBtb3JlIHJvb20gaXMgbmVjZXNzYXJ5LCB0aGVuIHRyeSB0byBjb25zdW1lIHNwYWNlcyBhdCB0aGUgZW5kIG9mIHRoZSB0ZXh0LgorICAgICAqIEBzdGFibGUgSUNVIDIuMAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExFTkdUSF9GSVhFRF9TUEFDRVNfQVRfRU5EID0gMjsKKworCisgICAgLyoqCisgICAgICogTWVtb3J5IG9wdGlvbjogdGhlIHJlc3VsdCBtdXN0IGhhdmUgdGhlIHNhbWUgbGVuZ3RoIGFzIHRoZSBzb3VyY2UuCisgICAgICogSWYgbW9yZSByb29tIGlzIG5lY2Vzc2FyeSwgdGhlbiB0cnkgdG8gY29uc3VtZSBzcGFjZXMgYXQgdGhlIGVuZCBvZiB0aGUgdGV4dC4KKyAgICAgKiBBZmZlY3RzOiBMYW1BbGVmIG9wdGlvbnMKKyAgICAgKiBUaGlzIG9wdGlvbiBpcyBhbiBhbGlhcyB0byBMRU5HVEhfRklYRURfU1BBQ0VTX0FUX0VORAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExBTUFMRUZfRU5EID0gMjsKKworICAgIC8qKgorICAgICAqIE1lbW9yeSBvcHRpb246IHRoZSByZXN1bHQgbXVzdCBoYXZlIHRoZSBzYW1lIGxlbmd0aCBhcyB0aGUgc291cmNlLgorICAgICAqIElmIG1vcmUgcm9vbSBpcyBuZWNlc3NhcnksIHRoZW4gdHJ5IHRvIGNvbnN1bWUgc3BhY2VzIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHRleHQuCisgICAgICogQHN0YWJsZSBJQ1UgMi4wCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTEVOR1RIX0ZJWEVEX1NQQUNFU19BVF9CRUdJTk5JTkcgPSAzOworCisgICAgLyoqCisgICAgICogTWVtb3J5IG9wdGlvbjogdGhlIHJlc3VsdCBtdXN0IGhhdmUgdGhlIHNhbWUgbGVuZ3RoIGFzIHRoZSBzb3VyY2UuCisgICAgICogSWYgbW9yZSByb29tIGlzIG5lY2Vzc2FyeSwgdGhlbiB0cnkgdG8gY29uc3VtZSBzcGFjZXMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgdGV4dC4KKyAgICAgKiBBZmZlY3RzOiBMYW1BbGVmIG9wdGlvbnMKKyAgICAgKiBUaGlzIG9wdGlvbiBpcyBhbiBhbGlhcyB0byBMRU5HVEhfRklYRURfU1BBQ0VTX0FUX0JFR0lOTklORworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExBTUFMRUZfQkVHSU4gPSAzOworCisgICAgLyoqCisgICAgICogTWVtb3J5IG9wdGlvbjogdGhlIHJlc3VsdCBtdXN0IGhhdmUgdGhlIHNhbWUgbGVuZ3RoIGFzIHRoZSBzb3VyY2UuCisgICAgICogU2hhcGluZyBNb2RlOiBGb3IgZWFjaCBMQU1BTEVGIGNoYXJhY3RlciBmb3VuZCwgZXhwYW5kIExBTUFMRUYgdXNpbmcgc3BhY2UgYXQgZW5kLgorICAgICAqICAgICAgICAgICAgICAgSWYgdGhlcmUgaXMgbm8gc3BhY2UgYXQgZW5kLCB1c2Ugc3BhY2VzIGF0IGJlZ2lubmluZyBvZiB0aGUgYnVmZmVyLiBJZiB0aGVyZQorICAgICAqICAgICAgICAgICAgICAgaXMgbm8gc3BhY2UgYXQgYmVnaW5uaW5nIG9mIHRoZSBidWZmZXIsIHVzZSBzcGFjZXMgYXQgdGhlIG5lYXIgKGkuZS4gdGhlIHNwYWNlCisgICAgICogICAgICAgICAgICAgICBhZnRlciB0aGUgTEFNQUxFRiBjaGFyYWN0ZXIpLgorICAgICAqCisgICAgICogRGVzaGFwaW5nIE1vZGU6IFBlcmZvcm0gdGhlIHNhbWUgZnVuY3Rpb24gYXMgdGhlIGZsYWcgZXF1YWxzIExBTUFMRUZfRU5ELgorICAgICAqIEFmZmVjdHM6IExhbUFsZWYgb3B0aW9ucworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExBTUFMRUZfQVVUTyAgPSAweDEwMDAwOworCisgICAgLyoqCisgICAgICogQml0IG1hc2sgZm9yIG1lbW9yeSBvcHRpb25zLgorICAgICAqIEBzdGFibGUgSUNVIDIuMAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExFTkdUSF9NQVNLID0gMHgxMDAwMzsKKworICAgIC8qKiBCaXQgbWFzayBmb3IgTGFtQWxlZiBtZW1vcnkgb3B0aW9ucy4gKi8KKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExBTUFMRUZfTUFTSyAgPSAweDEwMDAzOworCisgICAgLyoqCisgICAgICogRGlyZWN0aW9uIGluZGljYXRvcjogdGhlIHNvdXJjZSBpcyBpbiBsb2dpY2FsIChrZXlib2FyZCkgb3JkZXIuCisgICAgICogQHN0YWJsZSBJQ1UgMi4wCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEVYVF9ESVJFQ1RJT05fTE9HSUNBTCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBEaXJlY3Rpb24gaW5kaWNhdG9yOnRoZSBzb3VyY2UgaXMgaW4gdmlzdWFsIFJUTCBvcmRlciwKKyAgICAgKiB0aGUgcmlnaHRtb3N0IGRpc3BsYXllZCBjaGFyYWN0ZXIgc3RvcmVkIGZpcnN0LgorICAgICAqIFRoaXMgb3B0aW9uIGlzIGFuIGFsaWFzIHRvIFVfU0hBUEVfVEVYVF9ESVJFQ1RJT05fTE9HSUNBTAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRFWFRfRElSRUNUSU9OX1ZJU1VBTF9SVEwgPSAwOworCisgICAgLyoqCisgICAgICogRGlyZWN0aW9uIGluZGljYXRvcjogdGhlIHNvdXJjZSBpcyBpbiB2aXN1YWwgKGRpc3BsYXkpIG9yZGVyLCB0aGF0IGlzLAorICAgICAqIHRoZSBsZWZ0bW9zdCBkaXNwbGF5ZWQgY2hhcmFjdGVyIGlzIHN0b3JlZCBmaXJzdC4KKyAgICAgKiBAc3RhYmxlIElDVSAyLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBURVhUX0RJUkVDVElPTl9WSVNVQUxfTFRSID0gNDsKKworICAgIC8qKgorICAgICAqIEJpdCBtYXNrIGZvciBkaXJlY3Rpb24gaW5kaWNhdG9ycy4KKyAgICAgKiBAc3RhYmxlIElDVSAyLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBURVhUX0RJUkVDVElPTl9NQVNLID0gNDsKKworCisgICAgLyoqCisgICAgICogTGV0dGVyIHNoYXBpbmcgb3B0aW9uOiBkbyBub3QgcGVyZm9ybSBsZXR0ZXIgc2hhcGluZy4KKyAgICAgKiBAc3RhYmxlIElDVSAyLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMRVRURVJTX05PT1AgPSAwOworCisgICAgLyoqCisgICAgICogTGV0dGVyIHNoYXBpbmcgb3B0aW9uOiByZXBsYWNlIG5vcm1hdGl2ZSBsZXR0ZXIgY2hhcmFjdGVycyBpbiB0aGUgVSswNjAwIChBcmFiaWMpIGJsb2NrLAorICAgICAqIGJ5IHNoYXBlZCBvbmVzIGluIHRoZSBVK0ZFNzAgKFByZXNlbnRhdGlvbiBGb3JtcyBCKSBibG9jay4gUGVyZm9ybXMgTGFtLUFsZWYgbGlnYXR1cmUKKyAgICAgKiBzdWJzdGl0dXRpb24uCisgICAgICogQHN0YWJsZSBJQ1UgMi4wCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTEVUVEVSU19TSEFQRSA9IDg7CisKKyAgICAvKioKKyAgICAgKiBMZXR0ZXIgc2hhcGluZyBvcHRpb246IHJlcGxhY2Ugc2hhcGVkIGxldHRlciBjaGFyYWN0ZXJzIGluIHRoZSBVK0ZFNzAgKFByZXNlbnRhdGlvbiBGb3JtcyBCKSBibG9jaworICAgICAqIGJ5IG5vcm1hdGl2ZSBvbmVzIGluIHRoZSBVKzA2MDAgKEFyYWJpYykgYmxvY2suICBDb252ZXJ0cyBMYW0tQWxlZiBsaWdhdHVyZXMgdG8gcGFpcnMgb2YgTGFtIGFuZAorICAgICAqIEFsZWYgY2hhcmFjdGVycywgY29uc3VtaW5nIHNwYWNlcyBpZiByZXF1aXJlZC4KKyAgICAgKiBAc3RhYmxlIElDVSAyLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMRVRURVJTX1VOU0hBUEUgPSAweDEwOworCisgICAgLyoqCisgICAgICogTGV0dGVyIHNoYXBpbmcgb3B0aW9uOiByZXBsYWNlIG5vcm1hdGl2ZSBsZXR0ZXIgY2hhcmFjdGVycyBpbiB0aGUgVSswNjAwIChBcmFiaWMpIGJsb2NrLAorICAgICAqIGV4Y2VwdCBmb3IgdGhlIFRBU0hLRUVMIGNoYXJhY3RlcnMgYXQgVSswNjRCLi4uVSswNjUyLCBieSBzaGFwZWQgb25lcyBpbiB0aGUgVStGZTcwCisgICAgICogKFByZXNlbnRhdGlvbiBGb3JtcyBCKSBibG9jay4gIFRoZSBUQVNIS0VFTCBjaGFyYWN0ZXJzIHdpbGwgYWx3YXlzIGJlIGNvbnZlcnRlZCB0bworICAgICAqIHRoZSBpc29sYXRlZCBmb3JtcyByYXRoZXIgdGhhbiB0byB0aGVpciBjb3JyZWN0IHNoYXBlLgorICAgICAqIEBzdGFibGUgSUNVIDIuMAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExFVFRFUlNfU0hBUEVfVEFTSEtFRUxfSVNPTEFURUQgPSAweDE4OworCisgICAgLyoqCisgICAgICogQml0IG1hc2sgZm9yIGxldHRlciBzaGFwaW5nIG9wdGlvbnMuCisgICAgICogQHN0YWJsZSBJQ1UgMi4wCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTEVUVEVSU19NQVNLID0gMHgxODsKKworCisgICAgLyoqCisgICAgICogRGlnaXQgc2hhcGluZyBvcHRpb246IGRvIG5vdCBwZXJmb3JtIGRpZ2l0IHNoYXBpbmcuCisgICAgICogQHN0YWJsZSBJQ1UgMi4wCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElHSVRTX05PT1AgPSAwOworCisgICAgLyoqCisgICAgICogRGlnaXQgc2hhcGluZyBvcHRpb246IFJlcGxhY2UgRXVyb3BlYW4gZGlnaXRzIChVKzAwMzAuLi5VKzAwMzkpIGJ5IEFyYWJpYy1JbmRpYyBkaWdpdHMuCisgICAgICogQHN0YWJsZSBJQ1UgMi4wCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElHSVRTX0VOMkFOID0gMHgyMDsKKworICAgIC8qKgorICAgICAqIERpZ2l0IHNoYXBpbmcgb3B0aW9uOiBSZXBsYWNlIEFyYWJpYy1JbmRpYyBkaWdpdHMgYnkgRXVyb3BlYW4gZGlnaXRzIChVKzAwMzAuLi5VKzAwMzkpLgorICAgICAqIEBzdGFibGUgSUNVIDIuMAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERJR0lUU19BTjJFTiA9IDB4NDA7CisKKyAgICAvKioKKyAgICAgKiBEaWdpdCBzaGFwaW5nIG9wdGlvbjoKKyAgICAgKiBSZXBsYWNlIEV1cm9wZWFuIGRpZ2l0cyAoVSswMDMwLi4uVSswMDM5KSBieSBBcmFiaWMtSW5kaWMgZGlnaXRzCisgICAgICogaWYgdGhlIG1vc3QgcmVjZW50IHN0cm9uZ2x5IGRpcmVjdGlvbmFsIGNoYXJhY3RlcgorICAgICAqIGlzIGFuIEFyYWJpYyBsZXR0ZXIgKGl0cyBCaWRpIGRpcmVjdGlvbiB2YWx1ZSBpcyBSSUdIVF9UT19MRUZUX0FSQUJJQykuCisgICAgICogVGhlIGluaXRpYWwgc3RhdGUgYXQgdGhlIHN0YXJ0IG9mIHRoZSB0ZXh0IGlzIGFzc3VtZWQgdG8gYmUgbm90IGFuIEFyYWJpYywKKyAgICAgKiBsZXR0ZXIsIHNvIEV1cm9wZWFuIGRpZ2l0cyBhdCB0aGUgc3RhcnQgb2YgdGhlIHRleHQgd2lsbCBub3QgY2hhbmdlLgorICAgICAqIENvbXBhcmUgdG8gRElHSVRTX0FMRU4yQU5fSU5JVF9BTC4KKyAgICAgKiBAc3RhYmxlIElDVSAyLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBESUdJVFNfRU4yQU5fSU5JVF9MUiA9IDB4NjA7CisKKyAgICAvKioKKyAgICAgKiBEaWdpdCBzaGFwaW5nIG9wdGlvbjoKKyAgICAgKiBSZXBsYWNlIEV1cm9wZWFuIGRpZ2l0cyAoVSswMDMwLi4uVSswMDM5KSBieSBBcmFiaWMtSW5kaWMgZGlnaXRzCisgICAgICogaWYgdGhlIG1vc3QgcmVjZW50IHN0cm9uZ2x5IGRpcmVjdGlvbmFsIGNoYXJhY3RlcgorICAgICAqIGlzIGFuIEFyYWJpYyBsZXR0ZXIgKGl0cyBCaWRpIGRpcmVjdGlvbiB2YWx1ZSBpcyBSSUdIVF9UT19MRUZUX0FSQUJJQykuCisgICAgICogVGhlIGluaXRpYWwgc3RhdGUgYXQgdGhlIHN0YXJ0IG9mIHRoZSB0ZXh0IGlzIGFzc3VtZWQgdG8gYmUgYW4gQXJhYmljLAorICAgICAqIGxldHRlciwgc28gRXVyb3BlYW4gZGlnaXRzIGF0IHRoZSBzdGFydCBvZiB0aGUgdGV4dCB3aWxsIGNoYW5nZS4KKyAgICAgKiBDb21wYXJlIHRvIERJR0lUU19BTEVOMkFOX0lOVF9MUi4KKyAgICAgKiBAc3RhYmxlIElDVSAyLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBESUdJVFNfRU4yQU5fSU5JVF9BTCA9IDB4ODA7CisKKyAgICAvKiogTm90IGEgdmFsaWQgb3B0aW9uIHZhbHVlLiAqLworICAgIC8vcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERJR0lUU19SRVNFUlZFRCA9IDB4YTA7CisKKyAgICAvKioKKyAgICAgKiBCaXQgbWFzayBmb3IgZGlnaXQgc2hhcGluZyBvcHRpb25zLgorICAgICAqIEBzdGFibGUgSUNVIDIuMAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERJR0lUU19NQVNLID0gMHhlMDsKKworICAgIC8qKgorICAgICAqIERpZ2l0IHR5cGUgb3B0aW9uOiBVc2UgQXJhYmljLUluZGljIGRpZ2l0cyAoVSswNjYwLi4uVSswNjY5KS4KKyAgICAgKiBAc3RhYmxlIElDVSAyLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBESUdJVF9UWVBFX0FOID0gMDsKKworICAgIC8qKgorICAgICAqIERpZ2l0IHR5cGUgb3B0aW9uOiBVc2UgRWFzdGVybiAoRXh0ZW5kZWQpIEFyYWJpYy1JbmRpYyBkaWdpdHMgKFUrMDZmMC4uLlUrMDZmOSkuCisgICAgICogQHN0YWJsZSBJQ1UgMi4wCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElHSVRfVFlQRV9BTl9FWFRFTkRFRCA9IDB4MTAwOworCisgICAgLyoqCisgICAgICogQml0IG1hc2sgZm9yIGRpZ2l0IHR5cGUgb3B0aW9ucy4KKyAgICAgKiBAc3RhYmxlIElDVSAyLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBESUdJVF9UWVBFX01BU0sgPSAweDAxMDA7IC8vIDB4M2YwMD8KKworICAgIC8qKgorICAgICAqIHNvbWUgY29uc3RhbnRzCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBIQU1aQUZFX0NIQVIgICAgICAgPSAnXHVmZTgwJzsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIEhBTVpBMDZfQ0hBUiAgICAgICA9ICdcdTA2MjEnOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgWUVIX0hBTVpBX0NIQVIgICAgID0gJ1x1MDYyNic7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBZRUhfSEFNWkFGRV9DSEFSICAgPSAnXHVGRTg5JzsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIExBTUFMRUZfU1BBQ0VfU1VCICA9ICdcdWZmZmYnOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgVEFTSEtFRUxfU1BBQ0VfU1VCID0gJ1x1ZmZmZSc7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBMQU1fQ0hBUiAgICAgID0gJ1x1MDY0NCc7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBTUEFDRV9DSEFSICAgID0gJ1x1MDAyMCc7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBTUEFDRV9DSEFSX0ZPUl9MQU1BTEVGID0gJ1x1ZmVmZic7IC8vIFhYWDogdHdlYWsgZm9yIFRleHRMaW5lIHVzZQorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgU0hBRERBX0NIQVIgICA9ICdcdUZFN0MnOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgVEFUV0VFTF9DSEFSICA9ICdcdTA2NDAnOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgU0hBRERBX1RBVFdFRUxfQ0hBUiA9ICdcdUZFN0QnOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgTkVXX1RBSUxfQ0hBUiA9ICdcdUZFNzMnOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgT0xEX1RBSUxfQ0hBUiA9ICdcdTIwMEInOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTSEFQRV9NT0RFICAgICAgPSAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERVNIQVBFX01PREUgICAgPSAxOworCisgICAgLyoqCisgICAgICogQHN0YWJsZSBJQ1UgMi4wCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCByaHMpIHsKKyAgICAgICAgcmV0dXJuIHJocyAhPSBudWxsICYmCisgICAgICAgICAgICByaHMuZ2V0Q2xhc3MoKSA9PSBBcmFiaWNTaGFwaW5nLmNsYXNzICYmCisgICAgICAgICAgICBvcHRpb25zID09ICgoQXJhYmljU2hhcGluZylyaHMpLm9wdGlvbnM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHN0YWJsZSBJQ1UgMi4wCisgICAgICovCisgICAgIC8vL0NMT1ZFUjpPRkYKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICByZXR1cm4gb3B0aW9uczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAc3RhYmxlIElDVSAyLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKKyAgICAgICAgYnVmLmFwcGVuZCgnWycpOworCisgICAgICAgIHN3aXRjaCAob3B0aW9ucyAmIExBTUFMRUZfTUFTSykgeworICAgICAgICBjYXNlIExBTUFMRUZfUkVTSVpFOiBidWYuYXBwZW5kKCJMYW1BbGVmIHJlc2l6ZSIpOyBicmVhazsKKyAgICAgICAgY2FzZSBMQU1BTEVGX05FQVI6IGJ1Zi5hcHBlbmQoIkxhbUFsZWYgc3BhY2VzIGF0IG5lYXIiKTsgYnJlYWs7CisgICAgICAgIGNhc2UgTEFNQUxFRl9CRUdJTjogYnVmLmFwcGVuZCgiTGFtQWxlZiBzcGFjZXMgYXQgYmVnaW4iKTsgYnJlYWs7CisgICAgICAgIGNhc2UgTEFNQUxFRl9FTkQ6IGJ1Zi5hcHBlbmQoIkxhbUFsZWYgc3BhY2VzIGF0IGVuZCIpOyBicmVhazsKKyAgICAgICAgY2FzZSBMQU1BTEVGX0FVVE86IGJ1Zi5hcHBlbmQoImxhbUFsZWYgYXV0byIpOyBicmVhazsKKyAgICAgICAgfQorICAgICAgICBzd2l0Y2ggKG9wdGlvbnMgJiBURVhUX0RJUkVDVElPTl9NQVNLKSB7CisgICAgICAgIGNhc2UgVEVYVF9ESVJFQ1RJT05fTE9HSUNBTDogYnVmLmFwcGVuZCgiLCBsb2dpY2FsIik7IGJyZWFrOworICAgICAgICBjYXNlIFRFWFRfRElSRUNUSU9OX1ZJU1VBTF9MVFI6IGJ1Zi5hcHBlbmQoIiwgdmlzdWFsIik7IGJyZWFrOworICAgICAgICB9CisgICAgICAgIHN3aXRjaCAob3B0aW9ucyAmIExFVFRFUlNfTUFTSykgeworICAgICAgICBjYXNlIExFVFRFUlNfTk9PUDogYnVmLmFwcGVuZCgiLCBubyBsZXR0ZXIgc2hhcGluZyIpOyBicmVhazsKKyAgICAgICAgY2FzZSBMRVRURVJTX1NIQVBFOiBidWYuYXBwZW5kKCIsIHNoYXBlIGxldHRlcnMiKTsgYnJlYWs7CisgICAgICAgIGNhc2UgTEVUVEVSU19TSEFQRV9UQVNIS0VFTF9JU09MQVRFRDogYnVmLmFwcGVuZCgiLCBzaGFwZSBsZXR0ZXJzIHRhc2hrZWVsIGlzb2xhdGVkIik7IGJyZWFrOworICAgICAgICBjYXNlIExFVFRFUlNfVU5TSEFQRTogYnVmLmFwcGVuZCgiLCB1bnNoYXBlIGxldHRlcnMiKTsgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgc3dpdGNoIChvcHRpb25zICYgU0VFTl9NQVNLKSB7CisgICAgICAgIGNhc2UgU0VFTl9UV09DRUxMX05FQVI6IGJ1Zi5hcHBlbmQoIiwgU2VlbiBhdCBuZWFyIik7IGJyZWFrOworICAgICAgICB9CisgICAgICAgIHN3aXRjaCAob3B0aW9ucyAmIFlFSEhBTVpBX01BU0spIHsKKyAgICAgICAgY2FzZSBZRUhIQU1aQV9UV09DRUxMX05FQVI6IGJ1Zi5hcHBlbmQoIiwgWWVoIEhhbXphIGF0IG5lYXIiKTsgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgc3dpdGNoIChvcHRpb25zICYgVEFTSEtFRUxfTUFTSykgeworICAgICAgICBjYXNlIFRBU0hLRUVMX0JFR0lOOiBidWYuYXBwZW5kKCIsIFRhc2hrZWVsIGF0IGJlZ2luIik7IGJyZWFrOworICAgICAgICBjYXNlIFRBU0hLRUVMX0VORDogYnVmLmFwcGVuZCgiLCBUYXNoa2VlbCBhdCBlbmQiKTsgYnJlYWs7CisgICAgICAgIGNhc2UgVEFTSEtFRUxfUkVQTEFDRV9CWV9UQVRXRUVMOiBidWYuYXBwZW5kKCIsIFRhc2hrZWVsIHJlcGxhY2Ugd2l0aCB0YXR3ZWVsIik7IGJyZWFrOworICAgICAgICBjYXNlIFRBU0hLRUVMX1JFU0laRTogYnVmLmFwcGVuZCgiLCBUYXNoa2VlbCByZXNpemUiKTsgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBzd2l0Y2ggKG9wdGlvbnMgJiBESUdJVFNfTUFTSykgeworICAgICAgICBjYXNlIERJR0lUU19OT09QOiBidWYuYXBwZW5kKCIsIG5vIGRpZ2l0IHNoYXBpbmciKTsgYnJlYWs7CisgICAgICAgIGNhc2UgRElHSVRTX0VOMkFOOiBidWYuYXBwZW5kKCIsIHNoYXBlIGRpZ2l0cyB0byBBTiIpOyBicmVhazsKKyAgICAgICAgY2FzZSBESUdJVFNfQU4yRU46IGJ1Zi5hcHBlbmQoIiwgc2hhcGUgZGlnaXRzIHRvIEVOIik7IGJyZWFrOworICAgICAgICBjYXNlIERJR0lUU19FTjJBTl9JTklUX0xSOiBidWYuYXBwZW5kKCIsIHNoYXBlIGRpZ2l0cyB0byBBTiBjb250ZXh0dWFsbHk6IGRlZmF1bHQgRU4iKTsgYnJlYWs7CisgICAgICAgIGNhc2UgRElHSVRTX0VOMkFOX0lOSVRfQUw6IGJ1Zi5hcHBlbmQoIiwgc2hhcGUgZGlnaXRzIHRvIEFOIGNvbnRleHR1YWxseTogZGVmYXVsdCBBTCIpOyBicmVhazsKKyAgICAgICAgfQorICAgICAgICBzd2l0Y2ggKG9wdGlvbnMgJiBESUdJVF9UWVBFX01BU0spIHsKKyAgICAgICAgY2FzZSBESUdJVF9UWVBFX0FOOiBidWYuYXBwZW5kKCIsIHN0YW5kYXJkIEFyYWJpYy1JbmRpYyBkaWdpdHMiKTsgYnJlYWs7CisgICAgICAgIGNhc2UgRElHSVRfVFlQRV9BTl9FWFRFTkRFRDogYnVmLmFwcGVuZCgiLCBleHRlbmRlZCBBcmFiaWMtSW5kaWMgZGlnaXRzIik7IGJyZWFrOworICAgICAgICB9CisgICAgICAgIGJ1Zi5hcHBlbmQoIl0iKTsKKworICAgICAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7CisgICAgfQorICAgIC8vL0NMT1ZFUjpPTgorCisgICAgLy8KKyAgICAvLyBwb3J0ZWQgYXBpCisgICAgLy8KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJUlJFTEVWQU5UID0gNDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTEFNVFlQRSA9IDE2OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBTEVGVFlQRSA9IDMyOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IExJTktSID0gMTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTElOS0wgPSAyOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBMSU5LX01BU0sgPSAzOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IGlycmVsZXZhbnRQb3NbXSA9IHsKKyAgICAgICAgMHgwLCAweDIsIDB4NCwgMHg2LCAweDgsIDB4QSwgMHhDLCAweEUKKyAgICB9OworCisvKgorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgY29udmVydExhbUFsZWZbXSA9ICB7CisgICAgICAgICdcdTA2MjInLCAvLyBGRUY1CisgICAgICAgICdcdTA2MjInLCAvLyBGRUY2CisgICAgICAgICdcdTA2MjMnLCAvLyBGRUY3CisgICAgICAgICdcdTA2MjMnLCAvLyBGRUY4CisgICAgICAgICdcdTA2MjUnLCAvLyBGRUY5CisgICAgICAgICdcdTA2MjUnLCAvLyBGRUZBCisgICAgICAgICdcdTA2MjcnLCAvLyBGRUZCCisgICAgICAgICdcdTA2MjcnICAvLyBGRUZDCisgICAgfTsKKyovCisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgdGFpbEZhbWlseUlzb2xhdGVkRmluYWxbXSA9IHsKKyAgICAgICAgLyogRkVCMSAqLyAxLAorICAgICAgICAvKiBGRUIyICovIDEsCisgICAgICAgIC8qIEZFQjMgKi8gMCwKKyAgICAgICAgLyogRkVCNCAqLyAwLAorICAgICAgICAvKiBGRUI1ICovIDEsCisgICAgICAgIC8qIEZFQjYgKi8gMSwKKyAgICAgICAgLyogRkVCNyAqLyAwLAorICAgICAgICAvKiBGRUI4ICovIDAsCisgICAgICAgIC8qIEZFQjkgKi8gMSwKKyAgICAgICAgLyogRkVCQSAqLyAxLAorICAgICAgICAvKiBGRUJCICovIDAsCisgICAgICAgIC8qIEZFQkMgKi8gMCwKKyAgICAgICAgLyogRkVCRCAqLyAxLAorICAgICAgICAvKiBGRUJFICovIDEKKyAgICB9OworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IHRhc2hrZWVsTWVkaWFsW10gPSB7CisgICAgICAgIC8qIEZFNzAgKi8gMCwKKyAgICAgICAgLyogRkU3MSAqLyAxLAorICAgICAgICAvKiBGRTcyICovIDAsCisgICAgICAgIC8qIEZFNzMgKi8gMCwKKyAgICAgICAgLyogRkU3NCAqLyAwLAorICAgICAgICAvKiBGRTc1ICovIDAsCisgICAgICAgIC8qIEZFNzYgKi8gMCwKKyAgICAgICAgLyogRkU3NyAqLyAxLAorICAgICAgICAvKiBGRTc4ICovIDAsCisgICAgICAgIC8qIEZFNzkgKi8gMSwKKyAgICAgICAgLyogRkU3QSAqLyAwLAorICAgICAgICAvKiBGRTdCICovIDEsCisgICAgICAgIC8qIEZFN0MgKi8gMCwKKyAgICAgICAgLyogRkU3RCAqLyAxLAorICAgICAgICAvKiBGRTdFICovIDAsCisgICAgICAgIC8qIEZFN0YgKi8gMQorICAgIH07CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIHllaEhhbXphVG9ZZWhbXSA9CisgICAgeworICAgIC8qIGlzb2xhdGVkKi8gMHhGRUVGLAorICAgIC8qIGZpbmFsICAgKi8gMHhGRUYwCisgICAgfTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgY29udmVydE5vcm1hbGl6ZWRMYW1BbGVmW10gPSB7CisgICAgICAgICdcdTA2MjInLCAvLyAwNjVDCisgICAgICAgICdcdTA2MjMnLCAvLyAwNjVECisgICAgICAgICdcdTA2MjUnLCAvLyAwNjVFCisgICAgICAgICdcdTA2MjcnLCAvLyAwNjVGCisgICAgfTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludFtdIGFyYUxpbmsgPSB7CisgICAgICAgIDEgICAgICAgICAgICsgMzIgKyAyNTYgKiAweDExLCAgLyoweDA2MjIqLworICAgICAgICAxICAgICAgICAgICArIDMyICsgMjU2ICogMHgxMywgIC8qMHgwNjIzKi8KKyAgICAgICAgMSAgICAgICAgICAgICAgICArIDI1NiAqIDB4MTUsICAvKjB4MDYyNCovCisgICAgICAgIDEgICAgICAgICAgICsgMzIgKyAyNTYgKiAweDE3LCAgLyoweDA2MjUqLworICAgICAgICAxICsgMiAgICAgICAgICAgICsgMjU2ICogMHgxOSwgIC8qMHgwNjI2Ki8KKyAgICAgICAgMSAgICAgICAgICAgKyAzMiArIDI1NiAqIDB4MUQsICAvKjB4MDYyNyovCisgICAgICAgIDEgKyAyICAgICAgICAgICAgKyAyNTYgKiAweDFGLCAgLyoweDA2MjgqLworICAgICAgICAxICAgICAgICAgICAgICAgICsgMjU2ICogMHgyMywgIC8qMHgwNjI5Ki8KKyAgICAgICAgMSArIDIgICAgICAgICAgICArIDI1NiAqIDB4MjUsICAvKjB4MDYyQSovCisgICAgICAgIDEgKyAyICAgICAgICAgICAgKyAyNTYgKiAweDI5LCAgLyoweDA2MkIqLworICAgICAgICAxICsgMiAgICAgICAgICAgICsgMjU2ICogMHgyRCwgIC8qMHgwNjJDKi8KKyAgICAgICAgMSArIDIgICAgICAgICAgICArIDI1NiAqIDB4MzEsICAvKjB4MDYyRCovCisgICAgICAgIDEgKyAyICAgICAgICAgICAgKyAyNTYgKiAweDM1LCAgLyoweDA2MkUqLworICAgICAgICAxICAgICAgICAgICAgICAgICsgMjU2ICogMHgzOSwgIC8qMHgwNjJGKi8KKyAgICAgICAgMSAgICAgICAgICAgICAgICArIDI1NiAqIDB4M0IsICAvKjB4MDYzMCovCisgICAgICAgIDEgICAgICAgICAgICAgICAgKyAyNTYgKiAweDNELCAgLyoweDA2MzEqLworICAgICAgICAxICAgICAgICAgICAgICAgICsgMjU2ICogMHgzRiwgIC8qMHgwNjMyKi8KKyAgICAgICAgMSArIDIgICAgICAgICAgICArIDI1NiAqIDB4NDEsICAvKjB4MDYzMyovCisgICAgICAgIDEgKyAyICAgICAgICAgICAgKyAyNTYgKiAweDQ1LCAgLyoweDA2MzQqLworICAgICAgICAxICsgMiAgICAgICAgICAgICsgMjU2ICogMHg0OSwgIC8qMHgwNjM1Ki8KKyAgICAgICAgMSArIDIgICAgICAgICAgICArIDI1NiAqIDB4NEQsICAvKjB4MDYzNiovCisgICAgICAgIDEgKyAyICAgICAgICAgICAgKyAyNTYgKiAweDUxLCAgLyoweDA2MzcqLworICAgICAgICAxICsgMiAgICAgICAgICAgICsgMjU2ICogMHg1NSwgIC8qMHgwNjM4Ki8KKyAgICAgICAgMSArIDIgICAgICAgICAgICArIDI1NiAqIDB4NTksICAvKjB4MDYzOSovCisgICAgICAgIDEgKyAyICAgICAgICAgICAgKyAyNTYgKiAweDVELCAgLyoweDA2M0EqLworICAgICAgICAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgIC8qMHgwNjNCLTB4MDYzRiovCisgICAgICAgIDEgKyAyLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyoweDA2NDAqLworICAgICAgICAxICsgMiAgICAgICAgICAgICsgMjU2ICogMHg2MSwgIC8qMHgwNjQxKi8KKyAgICAgICAgMSArIDIgICAgICAgICAgICArIDI1NiAqIDB4NjUsICAvKjB4MDY0MiovCisgICAgICAgIDEgKyAyICAgICAgICAgICAgKyAyNTYgKiAweDY5LCAgLyoweDA2NDMqLworICAgICAgICAxICsgMiAgICAgICArIDE2ICsgMjU2ICogMHg2RCwgIC8qMHgwNjQ0Ki8KKyAgICAgICAgMSArIDIgICAgICAgICAgICArIDI1NiAqIDB4NzEsICAvKjB4MDY0NSovCisgICAgICAgIDEgKyAyICAgICAgICAgICAgKyAyNTYgKiAweDc1LCAgLyoweDA2NDYqLworICAgICAgICAxICsgMiAgICAgICAgICAgICsgMjU2ICogMHg3OSwgIC8qMHgwNjQ3Ki8KKyAgICAgICAgMSAgICAgICAgICAgICAgICArIDI1NiAqIDB4N0QsICAvKjB4MDY0OCovCisgICAgICAgIDEgICAgICAgICAgICAgICAgKyAyNTYgKiAweDdGLCAgLyoweDA2NDkqLworICAgICAgICAxICsgMiAgICAgICAgICAgICsgMjU2ICogMHg4MSwgIC8qMHgwNjRBKi8KKyAgICAgICAgNCwgNCwgNCwgNCwgICAgICAgICAgICAgICAgICAgICAvKjB4MDY0Qi0weDA2NEUqLworICAgICAgICA0LCA0LCA0LCA0LCAgICAgICAgICAgICAgICAgICAgIC8qMHgwNjRGLTB4MDY1MiovCisgICAgICAgIDQsIDQsIDQsIDAsIDAsICAgICAgICAgICAgICAgICAgLyoweDA2NTMtMHgwNjU3Ki8KKyAgICAgICAgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAvKjB4MDY1OC0weDA2NUIqLworICAgICAgICAxICAgICAgICAgICAgICAgICsgMjU2ICogMHg4NSwgIC8qMHgwNjVDKi8KKyAgICAgICAgMSAgICAgICAgICAgICAgICArIDI1NiAqIDB4ODcsICAvKjB4MDY1RCovCisgICAgICAgIDEgICAgICAgICAgICAgICAgKyAyNTYgKiAweDg5LCAgLyoweDA2NUUqLworICAgICAgICAxICAgICAgICAgICAgICAgICsgMjU2ICogMHg4QiwgIC8qMHgwNjVGKi8KKyAgICAgICAgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAvKjB4MDY2MC0weDA2NjQqLworICAgICAgICAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgIC8qMHgwNjY1LTB4MDY2OSovCisgICAgICAgIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgLyoweDA2NkEtMHgwNjZGKi8KKyAgICAgICAgNCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKjB4MDY3MCovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoweDA2NzEqLworICAgICAgICAxICAgICAgICAgICArIDMyLCAgICAgICAgICAgICAgIC8qMHgwNjcyKi8KKyAgICAgICAgMSAgICAgICAgICAgKyAzMiwgICAgICAgICAgICAgICAvKjB4MDY3MyovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoweDA2NzQqLworICAgICAgICAxICAgICAgICAgICArIDMyLCAgICAgICAgICAgICAgIC8qMHgwNjc1Ki8KKyAgICAgICAgMSwgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKjB4MDY3Ni0weDA2NzcqLworICAgICAgICAxKzIsIDErMiwgMSsyLCAxKzIsIDErMiwgMSsyLCAgIC8qMHgwNjc4LTB4MDY3RCovCisgICAgICAgIDErMiwgMSsyLCAxKzIsIDErMiwgMSsyLCAxKzIsICAgLyoweDA2N0UtMHgwNjgzKi8KKyAgICAgICAgMSsyLCAxKzIsIDErMiwgMSsyLCAgICAgICAgICAgICAvKjB4MDY4NC0weDA2ODcqLworICAgICAgICAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAgIC8qMHgwNjg4LTB4MDY5MSovCisgICAgICAgIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsICAgICAgICAgLyoweDA2OTItMHgwNjk5Ki8KKyAgICAgICAgMSsyLCAxKzIsIDErMiwgMSsyLCAxKzIsIDErMiwgICAvKjB4MDY5QS0weDA2QTMqLworICAgICAgICAxKzIsIDErMiwgMSsyLCAxKzIsICAgICAgICAgICAgIC8qMHgwNjlBLTB4MDZBMyovCisgICAgICAgIDErMiwgMSsyLCAxKzIsIDErMiwgMSsyLCAxKzIsICAgLyoweDA2QTQtMHgwNkFEKi8KKyAgICAgICAgMSsyLCAxKzIsIDErMiwgMSsyLCAgICAgICAgICAgICAvKjB4MDZBNC0weDA2QUQqLworICAgICAgICAxKzIsIDErMiwgMSsyLCAxKzIsIDErMiwgMSsyLCAgIC8qMHgwNkFFLTB4MDZCNyovCisgICAgICAgIDErMiwgMSsyLCAxKzIsIDErMiwgICAgICAgICAgICAgLyoweDA2QUUtMHgwNkI3Ki8KKyAgICAgICAgMSsyLCAxKzIsIDErMiwgMSsyLCAxKzIsIDErMiwgICAvKjB4MDZCOC0weDA2QkYqLworICAgICAgICAxKzIsIDErMiwgICAgICAgICAgICAgICAgICAgICAgIC8qMHgwNkI4LTB4MDZCRiovCisgICAgICAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoweDA2QzAqLworICAgICAgICAxKzIsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qMHgwNkMxKi8KKyAgICAgICAgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgICAvKjB4MDZDMi0weDA2Q0IqLworICAgICAgICAxKzIsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qMHgwNkNDKi8KKyAgICAgICAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKjB4MDZDRCovCisgICAgICAgIDErMiwgMSsyLCAxKzIsIDErMiwgICAgICAgICAgICAgLyoweDA2Q0UtMHgwNkQxKi8KKyAgICAgICAgMSwgMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKjB4MDZEMi0weDA2RDMqLworICAgIH07CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnRbXSBwcmVzTGluayA9IHsKKyAgICAgICAgMSArIDIsICAgICAgICAgICAgICAgICAgICAgICAgLyoweEZFNzAqLworICAgICAgICAxICsgMiwgICAgICAgICAgICAgICAgICAgICAgICAvKjB4RkU3MSovCisgICAgICAgIDEgKyAyLCAwLCAxKyAyLCAwLCAxKyAyLCAgICAgIC8qMHhGRTcyLTB4RkU3NiovCisgICAgICAgIDEgKyAyLCAgICAgICAgICAgICAgICAgICAgICAgIC8qMHhGRTc3Ki8KKyAgICAgICAgMSsgMiwgMSArIDIsIDErMiwgMSArIDIsICAgICAgLyoweEZFNzgtMHhGRTgxKi8KKyAgICAgICAgMSsgMiwgMSArIDIsIDErMiwgMSArIDIsICAgICAgLyoweEZFODItMHhGRTg1Ki8KKyAgICAgICAgMCwgMCArIDMyLCAxICsgMzIsIDAgKyAzMiwgICAgLyoweEZFODYtMHhGRTg5Ki8KKyAgICAgICAgMSArIDMyLCAwLCAxLCAgMCArIDMyLCAgICAgICAgLyoweEZFOEEtMHhGRThEKi8KKyAgICAgICAgMSArIDMyLCAwLCAyLCAgMSArIDIsICAgICAgICAgLyoweEZFOEUtMHhGRTkxKi8KKyAgICAgICAgMSwgMCArIDMyLCAxICsgMzIsIDAsICAgICAgICAgLyoweEZFOTItMHhGRTk1Ki8KKyAgICAgICAgMiwgMSArIDIsIDEsIDAsICAgICAgICAgICAgICAgLyoweEZFOTYtMHhGRTk5Ki8KKyAgICAgICAgMSwgMCwgMiwgMSArIDIsICAgICAgICAgICAgICAgLyoweEZFOUEtMHhGRTlEKi8KKyAgICAgICAgMSwgMCwgMiwgMSArIDIsICAgICAgICAgICAgICAgLyoweEZFOUUtMHhGRUExKi8KKyAgICAgICAgMSwgMCwgMiwgMSArIDIsICAgICAgICAgICAgICAgLyoweEZFQTItMHhGRUE1Ki8KKyAgICAgICAgMSwgMCwgMiwgMSArIDIsICAgICAgICAgICAgICAgLyoweEZFQTYtMHhGRUE5Ki8KKyAgICAgICAgMSwgMCwgMiwgMSArIDIsICAgICAgICAgICAgICAgLyoweEZFQUEtMHhGRUFEKi8KKyAgICAgICAgMSwgMCwgMSwgMCwgICAgICAgICAgICAgICAgICAgLyoweEZFQUUtMHhGRUIxKi8KKyAgICAgICAgMSwgMCwgMSwgMCwgICAgICAgICAgICAgICAgICAgLyoweEZFQjItMHhGRUI1Ki8KKyAgICAgICAgMSwgMCwgMiwgMSsyLCAgICAgICAgICAgICAgICAgLyoweEZFQjYtMHhGRUI5Ki8KKyAgICAgICAgMSwgMCwgMiwgMSsyLCAgICAgICAgICAgICAgICAgLyoweEZFQkEtMHhGRUJEKi8KKyAgICAgICAgMSwgMCwgMiwgMSsyLCAgICAgICAgICAgICAgICAgLyoweEZFQkUtMHhGRUMxKi8KKyAgICAgICAgMSwgMCwgMiwgMSsyLCAgICAgICAgICAgICAgICAgLyoweEZFQzItMHhGRUM1Ki8KKyAgICAgICAgMSwgMCwgMiwgMSsyLCAgICAgICAgICAgICAgICAgLyoweEZFQzYtMHhGRUM5Ki8KKyAgICAgICAgMSwgMCwgMiwgMSsyLCAgICAgICAgICAgICAgICAgLyoweEZFQ0EtMHhGRUNEKi8KKyAgICAgICAgMSwgMCwgMiwgMSsyLCAgICAgICAgICAgICAgICAgLyoweEZFQ0UtMHhGRUQxKi8KKyAgICAgICAgMSwgMCwgMiwgMSsyLCAgICAgICAgICAgICAgICAgLyoweEZFRDItMHhGRUQ1Ki8KKyAgICAgICAgMSwgMCwgMiwgMSsyLCAgICAgICAgICAgICAgICAgLyoweEZFRDYtMHhGRUQ5Ki8KKyAgICAgICAgMSwgMCwgMiwgMSsyLCAgICAgICAgICAgICAgICAgLyoweEZFREEtMHhGRUREKi8KKyAgICAgICAgMSwgMCwgMiwgMSsyLCAgICAgICAgICAgICAgICAgLyoweEZFREUtMHhGRUUxKi8KKyAgICAgICAgMSwgMCArIDE2LCAyICsgMTYsIDEgKyAyICsxNiwgLyoweEZFRTItMHhGRUU1Ki8KKyAgICAgICAgMSArIDE2LCAwLCAyLCAxKzIsICAgICAgICAgICAgLyoweEZFRTYtMHhGRUU5Ki8KKyAgICAgICAgMSwgMCwgMiwgMSsyLCAgICAgICAgICAgICAgICAgLyoweEZFRUEtMHhGRUVEKi8KKyAgICAgICAgMSwgMCwgMiwgMSsyLCAgICAgICAgICAgICAgICAgLyoweEZFRUUtMHhGRUYxKi8KKyAgICAgICAgMSwgMCwgMSwgMCwgICAgICAgICAgICAgICAgICAgLyoweEZFRjItMHhGRUY1Ki8KKyAgICAgICAgMSwgMCwgMiwgMSsyLCAgICAgICAgICAgICAgICAgLyoweEZFRjYtMHhGRUY5Ki8KKyAgICAgICAgMSwgMCwgMSwgMCwgICAgICAgICAgICAgICAgICAgLyoweEZFRkEtMHhGRUZEKi8KKyAgICAgICAgMSwgMCwgMSwgMCwKKyAgICAgICAgMQorICAgIH07CisKKyAgICBwcml2YXRlIHN0YXRpYyBpbnRbXSBjb252ZXJ0RkV0bzA2ID0geworICAgICAgICAvKioqKioqKioqKiowKioqKioqMSoqKioqKjIqKioqKiozKioqKioqNCoqKioqKjUqKioqKio2KioqKioqNyoqKioqKjgqKioqKio5KioqKioqQSoqKioqKkIqKioqKipDKioqKioqRCoqKioqKkUqKioqKipGKioqLworICAgICAgICAvKkZFNyovICAgMHg2NEIsIDB4NjRCLCAweDY0QywgMHg2NEMsIDB4NjRELCAweDY0RCwgMHg2NEUsIDB4NjRFLCAweDY0RiwgMHg2NEYsIDB4NjUwLCAweDY1MCwgMHg2NTEsIDB4NjUxLCAweDY1MiwgMHg2NTIsCisgICAgICAgIC8qRkU4Ki8gICAweDYyMSwgMHg2MjIsIDB4NjIyLCAweDYyMywgMHg2MjMsIDB4NjI0LCAweDYyNCwgMHg2MjUsIDB4NjI1LCAweDYyNiwgMHg2MjYsIDB4NjI2LCAweDYyNiwgMHg2MjcsIDB4NjI3LCAweDYyOCwKKyAgICAgICAgLypGRTkqLyAgIDB4NjI4LCAweDYyOCwgMHg2MjgsIDB4NjI5LCAweDYyOSwgMHg2MkEsIDB4NjJBLCAweDYyQSwgMHg2MkEsIDB4NjJCLCAweDYyQiwgMHg2MkIsIDB4NjJCLCAweDYyQywgMHg2MkMsIDB4NjJDLAorICAgICAgICAvKkZFQSovICAgMHg2MkMsIDB4NjJELCAweDYyRCwgMHg2MkQsIDB4NjJELCAweDYyRSwgMHg2MkUsIDB4NjJFLCAweDYyRSwgMHg2MkYsIDB4NjJGLCAweDYzMCwgMHg2MzAsIDB4NjMxLCAweDYzMSwgMHg2MzIsCisgICAgICAgIC8qRkVCKi8gICAweDYzMiwgMHg2MzMsIDB4NjMzLCAweDYzMywgMHg2MzMsIDB4NjM0LCAweDYzNCwgMHg2MzQsIDB4NjM0LCAweDYzNSwgMHg2MzUsIDB4NjM1LCAweDYzNSwgMHg2MzYsIDB4NjM2LCAweDYzNiwKKyAgICAgICAgLypGRUMqLyAgIDB4NjM2LCAweDYzNywgMHg2MzcsIDB4NjM3LCAweDYzNywgMHg2MzgsIDB4NjM4LCAweDYzOCwgMHg2MzgsIDB4NjM5LCAweDYzOSwgMHg2MzksIDB4NjM5LCAweDYzQSwgMHg2M0EsIDB4NjNBLAorICAgICAgICAvKkZFRCovICAgMHg2M0EsIDB4NjQxLCAweDY0MSwgMHg2NDEsIDB4NjQxLCAweDY0MiwgMHg2NDIsIDB4NjQyLCAweDY0MiwgMHg2NDMsIDB4NjQzLCAweDY0MywgMHg2NDMsIDB4NjQ0LCAweDY0NCwgMHg2NDQsCisgICAgICAgIC8qRkVFKi8gICAweDY0NCwgMHg2NDUsIDB4NjQ1LCAweDY0NSwgMHg2NDUsIDB4NjQ2LCAweDY0NiwgMHg2NDYsIDB4NjQ2LCAweDY0NywgMHg2NDcsIDB4NjQ3LCAweDY0NywgMHg2NDgsIDB4NjQ4LCAweDY0OSwKKyAgICAgICAgLypGRUYqLyAgIDB4NjQ5LCAweDY0QSwgMHg2NEEsIDB4NjRBLCAweDY0QSwgMHg2NUMsIDB4NjVDLCAweDY1RCwgMHg2NUQsIDB4NjVFLCAweDY1RSwgMHg2NUYsIDB4NjVGCisgICAgfTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBzaGFwZVRhYmxlW11bXVtdID0geworICAgICAgICB7IHswLDAsMCwwfSwgezAsMCwwLDB9LCB7MCwxLDAsM30sIHswLDEsMCwxfSB9LAorICAgICAgICB7IHswLDAsMiwyfSwgezAsMCwxLDJ9LCB7MCwxLDEsMn0sIHswLDEsMSwzfSB9LAorICAgICAgICB7IHswLDAsMCwwfSwgezAsMCwwLDB9LCB7MCwxLDAsM30sIHswLDEsMCwzfSB9LAorICAgICAgICB7IHswLDAsMSwyfSwgezAsMCwxLDJ9LCB7MCwxLDEsMn0sIHswLDEsMSwzfSB9CisgICAgfTsKKworICAgIC8qCisgICAgICogVGhpcyBmdW5jdGlvbiBzaGFwZXMgRXVyb3BlYW4gZGlnaXRzIHRvIEFyYWJpYy1JbmRpYyBkaWdpdHMKKyAgICAgKiBpbi1wbGFjZSwgd3JpdGluZyBvdmVyIHRoZSBpbnB1dCBjaGFyYWN0ZXJzLiAgRGF0YSBpcyBpbiB2aXN1YWwKKyAgICAgKiBvcmRlci4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgc2hhcGVUb0FyYWJpY0RpZ2l0c1dpdGhDb250ZXh0KGNoYXJbXSBkZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgZGlnaXRCYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBsYXN0U3Ryb25nV2FzQUwpIHsKKyAgICAgICAgZGlnaXRCYXNlIC09ICcwJzsgLy8gbW92ZSBjb21tb24gYWRqdXN0bWVudCBvdXQgb2YgbG9vcAorCisgICAgICAgIGZvcihpbnQgaSA9IHN0YXJ0ICsgbGVuZ3RoOyAtLWkgPj0gc3RhcnQ7KSB7CisgICAgICAgICAgICBjaGFyIGNoID0gZGVzdFtpXTsKKyAgICAgICAgICAgIHN3aXRjaCAoQ2hhcmFjdGVyLmdldERpcmVjdGlvbmFsaXR5KGNoKSkgeworICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfTEVGVF9UT19SSUdIVDoKKyAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX1JJR0hUX1RPX0xFRlQ6CisgICAgICAgICAgICAgICAgbGFzdFN0cm9uZ1dhc0FMID0gZmFsc2U7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIENoYXJhY3Rlci5ESVJFQ1RJT05BTElUWV9SSUdIVF9UT19MRUZUX0FSQUJJQzoKKyAgICAgICAgICAgICAgICBsYXN0U3Ryb25nV2FzQUwgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfRVVST1BFQU5fTlVNQkVSOgorICAgICAgICAgICAgICAgIGlmIChsYXN0U3Ryb25nV2FzQUwgJiYgY2ggPD0gJ1x1MDAzOScpIHsKKyAgICAgICAgICAgICAgICAgICAgZGVzdFtpXSA9IChjaGFyKShjaCArIGRpZ2l0QmFzZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICogTmFtZSAgICA6IGludmVydEJ1ZmZlcgorICAgICAqIEZ1bmN0aW9uOiBUaGlzIGZ1bmN0aW9uIGludmVydHMgdGhlIGJ1ZmZlciwgaXQncyB1c2VkCisgICAgICogICAgICAgICAgIGluIGNhc2UgdGhlIHVzZXIgc3BlY2lmaWVzIHRoZSBidWZmZXIgdG8gYmUKKyAgICAgKiAgICAgICAgICAgVEVYVF9ESVJFQ1RJT05fTE9HSUNBTAorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgaW52ZXJ0QnVmZmVyKGNoYXJbXSBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW5ndGgpIHsKKworICAgICAgICBmb3IoaW50IGkgPSBzdGFydCwgaiA9IHN0YXJ0ICsgbGVuZ3RoIC0gMTsgaSA8IGo7IGkrKywgLS1qKSB7CisgICAgICAgICAgICBjaGFyIHRlbXAgPSBidWZmZXJbaV07CisgICAgICAgICAgICBidWZmZXJbaV0gPSBidWZmZXJbal07CisgICAgICAgICAgICBidWZmZXJbal0gPSB0ZW1wOworICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBOYW1lICAgIDogY2hhbmdlTGFtQWxlZgorICAgICAqIEZ1bmN0aW9uOiBDb252ZXJ0cyB0aGUgQWxlZiBjaGFyYWN0ZXJzIGludG8gYW4gZXF1aXZhbGVudAorICAgICAqICAgICAgICAgICBMYW1BbGVmIGxvY2F0aW9uIGluIHRoZSAweDA2eHggUmFuZ2UsIHRoaXMgaXMgYW4KKyAgICAgKiAgICAgICAgICAgaW50ZXJtZWRpYXRlIHN0YWdlIGluIHRoZSBvcGVyYXRpb24gb2YgdGhlIHByb2dyYW0KKyAgICAgKiAgICAgICAgICAgbGF0ZXIgaXQnbGwgYmUgY29udmVydGVkIGludG8gdGhlIDB4RkV4eCBMYW1BbGVmcworICAgICAqICAgICAgICAgICBpbiB0aGUgc2hhcGluZyBmdW5jdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjaGFyIGNoYW5nZUxhbUFsZWYoY2hhciBjaCkgeworICAgICAgICBzd2l0Y2goY2gpIHsKKyAgICAgICAgY2FzZSAnXHUwNjIyJzogcmV0dXJuICdcdTA2NUMnOworICAgICAgICBjYXNlICdcdTA2MjMnOiByZXR1cm4gJ1x1MDY1RCc7CisgICAgICAgIGNhc2UgJ1x1MDYyNSc6IHJldHVybiAnXHUwNjVFJzsKKyAgICAgICAgY2FzZSAnXHUwNjI3JzogcmV0dXJuICdcdTA2NUYnOworICAgICAgICBkZWZhdWx0OiAgcmV0dXJuICdcdTAwMDAnOyAvLyBub3QgYSBsYW1hbGVmCisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIE5hbWUgICAgOiBzcGVjaWFsQ2hhcgorICAgICAqIEZ1bmN0aW9uOiBTcGVjaWFsIEFyYWJpYyBjaGFyYWN0ZXJzIG5lZWQgc3BlY2lhbCBoYW5kbGluZyBpbiB0aGUgc2hhcGVVbmljb2RlCisgICAgICogICAgICAgICAgIGZ1bmN0aW9uLCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgMSBvciAyIGZvciB0aGVzZSBzcGVjaWFsIGNoYXJhY3RlcnMKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgc3BlY2lhbENoYXIoY2hhciBjaCkgeworICAgICAgICBpZiAoKGNoID4gJ1x1MDYyMScgJiYgY2ggPCAnXHUwNjI2JykgfHwKKyAgICAgICAgICAgIChjaCA9PSAnXHUwNjI3JykgfHwKKyAgICAgICAgICAgIChjaCA+ICdcdTA2MkUnICYmIGNoIDwgJ1x1MDYzMycpIHx8CisgICAgICAgICAgICAoY2ggPiAnXHUwNjQ3JyAmJiBjaCA8ICdcdTA2NEEnKSB8fAorICAgICAgICAgICAgKGNoID09ICdcdTA2MjknKSkgeworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0gZWxzZSBpZiAoY2ggPj0gJ1x1MDY0QicgJiYgY2g8PSAnXHUwNjUyJykgeworICAgICAgICAgICAgcmV0dXJuIDI7CisgICAgICAgIH0gZWxzZSBpZiAoY2ggPj0gMHgwNjUzICYmIGNoIDw9IDB4MDY1NSB8fAorICAgICAgICAgICAgICAgICAgIGNoID09IDB4MDY3MCB8fAorICAgICAgICAgICAgICAgICAgIGNoID49IDB4RkU3MCAmJiBjaCA8PSAweEZFN0YpIHsKKyAgICAgICAgICAgIHJldHVybiAzOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIE5hbWUgICAgOiBnZXRMaW5rCisgICAgICogRnVuY3Rpb246IFJlc29sdmVzIHRoZSBsaW5rIGJldHdlZW4gdGhlIGNoYXJhY3RlcnMgYXMKKyAgICAgKiAgICAgICAgICAgQXJhYmljIGNoYXJhY3RlcnMgaGF2ZSBmb3VyIGZvcm1zIDoKKyAgICAgKiAgICAgICAgICAgSXNvbGF0ZWQsIEluaXRpYWwsIE1pZGRsZSBhbmQgRmluYWwgRm9ybQorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGludCBnZXRMaW5rKGNoYXIgY2gpIHsKKyAgICAgICAgaWYgKGNoID49ICdcdTA2MjInICYmIGNoIDw9ICdcdTA2RDMnKSB7CisgICAgICAgICAgICByZXR1cm4gYXJhTGlua1tjaCAtICdcdTA2MjInXTsKKyAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnXHUyMDBEJykgeworICAgICAgICAgICAgcmV0dXJuIDM7CisgICAgICAgIH0gZWxzZSBpZiAoY2ggPj0gJ1x1MjA2RCcgJiYgY2ggPD0gJ1x1MjA2RicpIHsKKyAgICAgICAgICAgIHJldHVybiA0OworICAgICAgICB9IGVsc2UgaWYgKGNoID49ICdcdUZFNzAnICYmIGNoIDw9ICdcdUZFRkMnKSB7CisgICAgICAgICAgICByZXR1cm4gcHJlc0xpbmtbY2ggLSAnXHVGRTcwJ107CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICogTmFtZSAgICA6IGNvdW50U3BhY2VzCisgICAgICogRnVuY3Rpb246IENvdW50cyB0aGUgbnVtYmVyIG9mIHNwYWNlcworICAgICAqICAgICAgICAgICBhdCBlYWNoIGVuZCBvZiB0aGUgbG9naWNhbCBidWZmZXIKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgY291bnRTcGFjZXNMZWZ0KGNoYXJbXSBkZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50KSB7CisgICAgICAgIGZvciAoaW50IGkgPSBzdGFydCwgZSA9IHN0YXJ0ICsgY291bnQ7IGkgPCBlOyArK2kpIHsKKyAgICAgICAgICAgIGlmIChkZXN0W2ldICE9IFNQQUNFX0NIQVIpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gaSAtIHN0YXJ0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBjb3VudDsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgY291bnRTcGFjZXNSaWdodChjaGFyW10gZGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50KSB7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IHN0YXJ0ICsgY291bnQ7IC0taSA+PSBzdGFydDspIHsKKyAgICAgICAgICAgIGlmIChkZXN0W2ldICE9IFNQQUNFX0NIQVIpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RhcnQgKyBjb3VudCAtIDEgLSBpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBjb3VudDsKKyAgICB9CisKKyAgICAvKgorICAgICAqIE5hbWUgICAgOiBpc1Rhc2hrZWVsQ2hhcgorICAgICAqIEZ1bmN0aW9uOiBSZXR1cm5zIHRydWUgZm9yIFRhc2hrZWVsIGNoYXJhY3RlcnMgZWxzZSByZXR1cm4gZmFsc2UKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzVGFzaGtlZWxDaGFyKGNoYXIgY2gpIHsKKyAgICAgICAgcmV0dXJuICggY2ggPj0nXHUwNjRCJyAmJiBjaCA8PSAnXHUwNjUyJyApOworICAgIH0KKworICAgIC8qCisgICAgICpOYW1lICAgICA6IGlzU2VlblRhaWxGYW1pbHlDaGFyCisgICAgICpGdW5jdGlvbiA6IHJldHVybnMgMSBpZiB0aGUgY2hhcmFjdGVyIGlzIGEgc2VlbiBmYW1pbHkgaXNvbGF0ZWQgY2hhcmFjdGVyCisgICAgICogICAgICAgICAgIGluIHRoZSBGRSByYW5nZSBvdGhlcndpc2UgcmV0dXJucyAwCisgICAgICovCisKKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgaXNTZWVuVGFpbEZhbWlseUNoYXIoY2hhciBjaCkgeworICAgICAgICBpZiAoY2ggPj0gMHhmZWIxICYmIGNoIDwgMHhmZWJmKXsKKyAgICAgICAgICAgICByZXR1cm4gdGFpbEZhbWlseUlzb2xhdGVkRmluYWwgW2NoIC0gMHhGRUIxXTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgICAvKiBOYW1lICAgICA6IGlzU2VlbkZhbWlseUNoYXIKKyAgICAgICogRnVuY3Rpb24gOiByZXR1cm5zIDEgaWYgdGhlIGNoYXJhY3RlciBpcyBhIHNlZW4gZmFtaWx5IGNoYXJhY3RlciBpbiB0aGUgVW5pY29kZQorICAgICAgKiAgICAgICAgICAgIDA2IHJhbmdlIG90aGVyd2lzZSByZXR1cm5zIDAKKyAgICAgKi8KKworICAgIHByaXZhdGUgc3RhdGljIGludCBpc1NlZW5GYW1pbHlDaGFyKGNoYXIgIGNoKXsKKyAgICAgICAgaWYgKGNoID49IDB4NjMzICYmIGNoIDw9IDB4NjM2KXsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9ZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICpOYW1lICAgICA6IGlzVGFpbENoYXIKKyAgICAgKkZ1bmN0aW9uIDogcmV0dXJucyB0cnVlIGlmIHRoZSBjaGFyYWN0ZXIgbWF0Y2hlcyBvbmUgb2YgdGhlIHRhaWwgY2hhcmFjdGVycworICAgICAqICAgICAgICAgICAoMHhmZTczIG9yIDB4MjAwYikgb3RoZXJ3aXNlIHJldHVybnMgZmFsc2UKKyAgICAgKi8KKworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNUYWlsQ2hhcihjaGFyIGNoKSB7CisgICAgICAgIGlmKGNoID09IE9MRF9UQUlMX0NIQVIgfHwgY2ggPT0gTkVXX1RBSUxfQ0hBUil7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH1lbHNleworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICpOYW1lICAgICA6IGlzQWxlZk1ha3NvdXJhQ2hhcgorICAgICAqRnVuY3Rpb24gOiByZXR1cm5zIHRydWUgaWYgdGhlIGNoYXJhY3RlciBpcyBhIEFsZWYgTWFrc291cmEgRmluYWwgb3IgaXNvbGF0ZWQKKyAgICAgKiAgICAgICAgICAgb3RoZXJ3aXNlIHJldHVybnMgZmFsc2UKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzQWxlZk1ha3NvdXJhQ2hhcihjaGFyIGNoKSB7CisgICAgICAgIHJldHVybiAoIChjaCA9PSAweEZFRUYpIHx8ICggY2ggPT0gMHhGRUYwKSB8fCAoY2ggPT0gMHgwNjQ5KSk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBOYW1lICAgICA6IGlzWWVoSGFtemFDaGFyCisgICAgICogRnVuY3Rpb24gOiByZXR1cm5zIHRydWUgaWYgdGhlIGNoYXJhY3RlciBpcyBhIHllaEhhbXphIGlzb2xhdGVkIG9yIHllaGhhbXphCisgICAgICogICAgICAgICAgICBmaW5hbCBpcyBmb3VuZCBvdGhlcndpc2UgcmV0dXJucyBmYWxzZQorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNZZWhIYW16YUNoYXIoY2hhciBjaCkgeworICAgICAgICBpZigoY2g9PTB4RkU4OSl8fChjaD09MHhGRThBKSl7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfWVsc2V7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqTmFtZSAgICAgOiBpc1Rhc2hrZWVsQ2hhckZFCisgICAgICpGdW5jdGlvbiA6IFJldHVybnMgdHJ1ZSBmb3IgVGFzaGtlZWwgY2hhcmFjdGVycyBpbiBGRSByYW5nZSBlbHNlIHJldHVybiBmYWxzZQorICAgICAqLworCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1Rhc2hrZWVsQ2hhckZFKGNoYXIgY2gpIHsKKyAgICAgICAgcmV0dXJuICggY2ghPTB4RkU3NSAmJihjaD49MHhGRTcwICYmIGNoPD0gMHhGRTdGKSApOworICAgIH0KKworICAgIC8qCisgICAgICogTmFtZTogaXNUYXNoa2VlbE9uVGF0d2VlbENoYXIKKyAgICAgKiBGdW5jdGlvbjogQ2hlY2tzIGlmIHRoZSBUYXNoa2VlbCBDaGFyYWN0ZXIgaXMgb24gVGF0d2VlbCBvciBub3QsaWYgdGhlCisgICAgICogICAgICAgICAgIFRhc2hrZWVsIG9uIHRhdHdlZWwgKEZFIHJhbmdlKSwgaXQgcmV0dXJucyAxIGVsc2UgaWYgdGhlCisgICAgICogICAgICAgICAgIFRhc2hrZWVsIHdpdGggc2hhZGRhIG9uIHRhdHdlZWwgKEZDIHJhbmdlKXJldHVybiAyIG90aGVyd2lzZQorICAgICAqICAgICAgICAgICByZXR1cm5zIDAKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgaXNUYXNoa2VlbE9uVGF0d2VlbENoYXIoY2hhciBjaCl7CisgICAgICAgIGlmIChjaCA+PSAweGZlNzAgJiYgY2ggPD0gMHhmZTdmICYmIGNoICE9IE5FV19UQUlMX0NIQVIgJiYgY2ggIT0gMHhGRTc1ICYmIGNoICE9IFNIQUREQV9UQVRXRUVMX0NIQVIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiB0YXNoa2VlbE1lZGlhbCBbY2ggLSAweEZFNzBdOworICAgICAgICB9IGVsc2UgaWYoIChjaCA+PSAweGZjZjIgJiYgY2ggPD0gMHhmY2Y0KSB8fCAoY2ggPT0gU0hBRERBX1RBVFdFRUxfQ0hBUikpIHsKKyAgICAgICAgICAgIHJldHVybiAyOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIE5hbWU6IGlzSXNvbGF0ZWRUYXNoa2VlbENoYXIKKyAgICAgKiBGdW5jdGlvbjogQ2hlY2tzIGlmIHRoZSBUYXNoa2VlbCBDaGFyYWN0ZXIgaXMgaW4gdGhlIGlzb2xhdGVkIGZvcm0KKyAgICAgKiAgICAgICAgICAgKGkuZS4gVW5pY29kZSBGRSByYW5nZSkgcmV0dXJucyAxIGVsc2UgaWYgdGhlIFRhc2hrZWVsCisgICAgICogICAgICAgICAgIHdpdGggc2hhZGRhIGlzIGluIHRoZSBpc29sYXRlZCBmb3JtIChpLmUuIFVuaWNvZGUgRkMgcmFuZ2UpCisgICAgICogICAgICAgICAgIHJldHVybnMgMSBvdGhlcndpc2UgcmV0dXJucyAwCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IGlzSXNvbGF0ZWRUYXNoa2VlbENoYXIoY2hhciBjaCl7CisgICAgICAgIGlmIChjaCA+PSAweGZlNzAgJiYgY2ggPD0gMHhmZTdmICYmIGNoICE9IE5FV19UQUlMX0NIQVIgJiYgY2ggIT0gMHhGRTc1KXsKKyAgICAgICAgICAgIHJldHVybiAoMSAtIHRhc2hrZWVsTWVkaWFsIFtjaCAtIDB4RkU3MF0pOworICAgICAgICB9IGVsc2UgaWYoY2ggPj0gMHhmYzVlICYmIGNoIDw9IDB4ZmM2Myl7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfSBlbHNleworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIE5hbWUgICAgOiBpc0FsZWZDaGFyCisgICAgICogRnVuY3Rpb246IFJldHVybnMgMSBmb3IgQWxlZiBjaGFyYWN0ZXJzIGVsc2UgcmV0dXJuIDAKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzQWxlZkNoYXIoY2hhciBjaCkgeworICAgICAgICByZXR1cm4gY2ggPT0gJ1x1MDYyMicgfHwgY2ggPT0gJ1x1MDYyMycgfHwgY2ggPT0gJ1x1MDYyNScgfHwgY2ggPT0gJ1x1MDYyNyc7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBOYW1lICAgIDogaXNMYW1BbGVmQ2hhcgorICAgICAqIEZ1bmN0aW9uOiBSZXR1cm5zIHRydWUgZm9yIExhbUFsZWYgY2hhcmFjdGVycyBlbHNlIHJldHVybiBmYWxzZQorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNMYW1BbGVmQ2hhcihjaGFyIGNoKSB7CisgICAgICAgIHJldHVybiBjaCA+PSAnXHVGRUY1JyAmJiBjaCA8PSAnXHVGRUZDJzsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzTm9ybWFsaXplZExhbUFsZWZDaGFyKGNoYXIgY2gpIHsKKyAgICAgICAgcmV0dXJuIGNoID49ICdcdTA2NUMnICYmIGNoIDw9ICdcdTA2NUYnOworICAgIH0KKworICAgIC8qCisgICAgICogTmFtZSAgICA6IGNhbGN1bGF0ZVNpemUKKyAgICAgKiBGdW5jdGlvbjogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBkZXN0U2l6ZSB0byBiZSB1c2VkIGluIHByZWZsaWdodGluZworICAgICAqICAgICAgICAgICB3aGVuIHRoZSBkZXN0U2l6ZSBpcyBlcXVhbCB0byAwCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgY2FsY3VsYXRlU2l6ZShjaGFyW10gc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNvdXJjZVN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNvdXJjZUxlbmd0aCkgeworCisgICAgICAgIGludCBkZXN0U2l6ZSA9IHNvdXJjZUxlbmd0aDsKKworICAgICAgICBzd2l0Y2ggKG9wdGlvbnMgJiBMRVRURVJTX01BU0spIHsKKyAgICAgICAgY2FzZSBMRVRURVJTX1NIQVBFOgorICAgICAgICBjYXNlIExFVFRFUlNfU0hBUEVfVEFTSEtFRUxfSVNPTEFURUQ6CisgICAgICAgICAgICBpZiAoaXNMb2dpY2FsKSB7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IHNvdXJjZVN0YXJ0LCBlID0gc291cmNlU3RhcnQgKyBzb3VyY2VMZW5ndGggLSAxOyBpIDwgZTsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICgoc291cmNlW2ldID09IExBTV9DSEFSICYmIGlzQWxlZkNoYXIoc291cmNlW2krMV0pKSB8fCBpc1Rhc2hrZWVsQ2hhckZFKHNvdXJjZVtpXSkpeworICAgICAgICAgICAgICAgICAgICAgICAgLS1kZXN0U2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7IC8vIHZpc3VhbAorICAgICAgICAgICAgICAgIGZvcihpbnQgaSA9IHNvdXJjZVN0YXJ0ICsgMSwgZSA9IHNvdXJjZVN0YXJ0ICsgc291cmNlTGVuZ3RoOyBpIDwgZTsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICgoc291cmNlW2ldID09IExBTV9DSEFSICYmIGlzQWxlZkNoYXIoc291cmNlW2ktMV0pKSB8fCBpc1Rhc2hrZWVsQ2hhckZFKHNvdXJjZVtpXSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC0tZGVzdFNpemU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIExFVFRFUlNfVU5TSEFQRToKKyAgICAgICAgICAgIGZvcihpbnQgaSA9IHNvdXJjZVN0YXJ0LCBlID0gc291cmNlU3RhcnQgKyBzb3VyY2VMZW5ndGg7IGkgPCBlOyArK2kpIHsKKyAgICAgICAgICAgICAgICBpZiAoaXNMYW1BbGVmQ2hhcihzb3VyY2VbaV0pKSB7CisgICAgICAgICAgICAgICAgICAgIGRlc3RTaXplKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGRlc3RTaXplOworICAgIH0KKworCisgICAgLyoKKyAgICAgKiBOYW1lICAgIDogY291bnRTcGFjZVN1YgorICAgICAqIEZ1bmN0aW9uOiBDb3VudHMgbnVtYmVyIG9mIHRpbWVzIHRoZSBzdWJDaGFyIGFwcGVhcnMgaW4gdGhlIGFycmF5CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBpbnQgY291bnRTcGFjZVN1YihjaGFyIFtdIGRlc3QsaW50IGxlbmd0aCwgY2hhciBzdWJDaGFyKXsKKyAgICAgICAgaW50IGkgPSAwOworICAgICAgICBpbnQgY291bnQgPSAwOworICAgICAgICB3aGlsZSAoaSA8IGxlbmd0aCkgeworICAgICAgICAgIGlmIChkZXN0W2ldID09IHN1YkNoYXIpIHsKKyAgICAgICAgICAgICAgY291bnQrKzsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgIGkrKzsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY291bnQ7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBOYW1lICAgIDogc2hpZnRBcnJheQorICAgICAqIEZ1bmN0aW9uOiBTaGlmdHMgY2hhcmFjdGVycyB0byByZXBsYWNlIHNwYWNlIHN1YiBjaGFyYWN0ZXJzCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHNoaWZ0QXJyYXkoY2hhciBbXSBkZXN0LGludCBzdGFydCwgaW50IGUsIGNoYXIgc3ViQ2hhcil7CisgICAgICAgIGludCB3ID0gZTsKKyAgICAgICAgaW50IHIgPSBlOworICAgICAgICB3aGlsZSAoLS1yID49IHN0YXJ0KSB7CisgICAgICAgICAgY2hhciBjaCA9IGRlc3Rbcl07CisgICAgICAgICAgaWYgKGNoICE9IHN1YkNoYXIpIHsKKyAgICAgICAgICAgIC0tdzsKKyAgICAgICAgICAgIGlmICh3ICE9IHIpIHsKKyAgICAgICAgICAgICAgZGVzdFt3XSA9IGNoOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgfQorCisgICAgLyoKKyAgICAgKiBOYW1lICAgIDogZmxpcEFycmF5CisgICAgICogRnVuY3Rpb246IGludmVydHMgYXJyYXksIHNvIHRoYXQgc3RhcnQgYmVjb21lcyBlbmQgYW5kIHZpY2UgdmVyc2EKKyAgICAgKi8KKyAgICAgIHB1YmxpYyBzdGF0aWMgaW50IGZsaXBBcnJheShjaGFyIFtdIGRlc3QsIGludCBzdGFydCwgaW50IGUsIGludCB3KXsKKyAgICAgICAgaW50IHI7CisgICAgICAgIGlmICh3ID4gc3RhcnQpIHsKKyAgICAgICAgLy8gc2hpZnQsIGFzc3VtZSBzbWFsbCBidWZmZXIgc2l6ZSBzbyBkb24ndCB1c2UgYXJyYXljb3B5CisgICAgICAgICAgciA9IHc7CisgICAgICAgICAgdyA9IHN0YXJ0OworICAgICAgICAgIHdoaWxlIChyIDwgZSkgeworICAgICAgICAgICAgZGVzdFt3KytdID0gZGVzdFtyKytdOworICAgICAgICAgICB9CisgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgIHcgPSBlOworICAgICAgICAgfQorICAgICAgICByZXR1cm4gdzsKKyAgICAgIH0KKworICAgIC8qCisgICAgICogTmFtZSAgICAgOiBoYW5kbGVUYXNoa2VlbFdpdGhUYXR3ZWVsCisgICAgICogRnVuY3Rpb24gOiBSZXBsYWNlcyBUYXNoa2VlbCBhcyBmb2xsb3dpbmc6CisgICAgICogICAgICAgICAgICBDYXNlIDEgOmlmIHRoZSBUYXNoa2VlbCBvbiB0YXR3ZWVsLCByZXBsYWNlIGl0IHdpdGggVGF0d2VlbC4KKyAgICAgKiAgICAgICAgICAgIENhc2UgMiA6aWYgdGhlIFRhc2hrZWVsIGFnZ3JlZ2F0ZWQgd2l0aCBTaGFkZGEgb24gVGF0d2VlbCwgcmVwbGFjZQorICAgICAqICAgICAgICAgICAgICAgICAgIGl0IHdpdGggU2hhZGRhIG9uIFRhdHdlZWwuCisgICAgICogICAgICAgICAgICBDYXNlIDM6IGlmIHRoZSBUYXNoa2VlbCBpcyBpc29sYXRlZCByZXBsYWNlIGl0IHdpdGggU3BhY2UuCisgICAgICoKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgaGFuZGxlVGFzaGtlZWxXaXRoVGF0d2VlbChjaGFyW10gZGVzdCwgaW50IHNvdXJjZUxlbmd0aCkgeworICAgICAgICAgICAgICAgICAgICAgaW50IGk7CisgICAgICAgICAgICAgICAgICAgICBmb3IoaSA9IDA7IGkgPCBzb3VyY2VMZW5ndGg7IGkrKyl7CisgICAgICAgICAgICAgICAgICAgICAgICAgaWYoKGlzVGFzaGtlZWxPblRhdHdlZWxDaGFyKGRlc3RbaV0pID09IDEpKXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdFtpXSA9IFRBVFdFRUxfQ0hBUjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlIGlmKChpc1Rhc2hrZWVsT25UYXR3ZWVsQ2hhcihkZXN0W2ldKSA9PSAyKSl7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RbaV0gPSBTSEFEREFfVEFUV0VFTF9DSEFSOworICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2UgaWYoKGlzSXNvbGF0ZWRUYXNoa2VlbENoYXIoZGVzdFtpXSk9PTEpICYmIGRlc3RbaV0gIT0gU0hBRERBX0NIQVIpeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0W2ldID0gU1BBQ0VfQ0hBUjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzb3VyY2VMZW5ndGg7CisgICAgfQorCisgICAgLyoKKyAgICAgKk5hbWUgICAgIDogaGFuZGxlR2VuZXJhdGVkU3BhY2VzCisgICAgICpGdW5jdGlvbiA6IFRoZSBzaGFwZVVuaWNvZGUgZnVuY3Rpb24gY29udmVydHMgTGFtICsgQWxlZiBpbnRvIExhbUFsZWYgKyBzcGFjZSwKKyAgICAgKiAgICAgICAgICAgYW5kIFRhc2hrZWVsIHRvIHNwYWNlLgorICAgICAqICAgICAgICAgICBoYW5kbGVHZW5lcmF0ZWRTcGFjZXMgZnVuY3Rpb24gcHV0cyB0aGVzZSBnZW5lcmF0ZWQgc3BhY2VzCisgICAgICogICAgICAgICAgIGFjY29yZGluZyB0byB0aGUgb3B0aW9ucyB0aGUgdXNlciBzcGVjaWZpZXMuIExhbUFsZWYgYW5kIFRhc2hrZWVsCisgICAgICogICAgICAgICAgIHNwYWNlcyBjYW4gYmUgcmVwbGFjZWQgYXQgYmVnaW4sIGF0IGVuZCwgYXQgbmVhciBvciBkZWNyZWFzZSB0aGUKKyAgICAgKiAgICAgICAgICAgYnVmZmVyIHNpemUuCisgICAgICoKKyAgICAgKiAgICAgICAgICAgVGhlcmUgaXMgYWxzbyBBdXRvIG9wdGlvbiBmb3IgTGFtQWxlZiBhbmQgdGFzaGtlZWwsIHdoaWNoIHdpbGwgcHV0CisgICAgICogICAgICAgICAgIHRoZSBzcGFjZXMgYXQgZW5kIG9mIHRoZSBidWZmZXIgKG9yIGVuZCBvZiB0ZXh0IGlmIHRoZSB1c2VyIHVzZWQKKyAgICAgKiAgICAgICAgICAgdGhlIG9wdGlvbiBTUEFDRVNfUkVMQVRJVkVfVE9fVEVYVF9CRUdJTl9FTkQpLgorICAgICAqCisgICAgICogICAgICAgICAgIElmIHRoZSB0ZXh0IHR5cGUgd2FzIHZpc3VhbF9MVFIgYW5kIHRoZSBvcHRpb24KKyAgICAgKiAgICAgICAgICAgU1BBQ0VTX1JFTEFUSVZFX1RPX1RFWFRfQkVHSU5fRU5EIHdhcyBzZWxlY3RlZCB0aGUgRU5ECisgICAgICogICAgICAgICAgIG9wdGlvbiB3aWxsIHBsYWNlIHRoZSBzcGFjZSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBidWZmZXIgYW5kCisgICAgICogICAgICAgICAgIEJFR0lOIHdpbGwgcGxhY2UgdGhlIHNwYWNlIGF0IHRoZSBlbmQgb2YgdGhlIGJ1ZmZlci4KKyAgICAgKi8KKyAgcHJpdmF0ZSBpbnQgaGFuZGxlR2VuZXJhdGVkU3BhY2VzKGNoYXJbXSBkZXN0LAorICAgICAgICAgICAgaW50IHN0YXJ0LAorICAgICAgICAgICAgaW50IGxlbmd0aCkgeworCisgICAgICBpbnQgbGVuT3B0aW9uc0xhbUFsZWYgPSBvcHRpb25zICYgTEFNQUxFRl9NQVNLOworICAgICAgaW50IGxlbk9wdGlvbnNUYXNoa2VlbCA9IG9wdGlvbnMgJiBUQVNIS0VFTF9NQVNLOworICAgICAgYm9vbGVhbiBsYW1BbGVmT24gPSBmYWxzZTsKKyAgICAgIGJvb2xlYW4gdGFzaGtlZWxPbiA9IGZhbHNlOworCisgICAgICBpZiAoIWlzTG9naWNhbCAmICFzcGFjZXNSZWxhdGl2ZVRvVGV4dEJlZ2luRW5kKSB7CisgICAgICAgICAgc3dpdGNoIChsZW5PcHRpb25zTGFtQWxlZikgeworICAgICAgICAgIGNhc2UgTEFNQUxFRl9CRUdJTjogbGVuT3B0aW9uc0xhbUFsZWYgPSBMQU1BTEVGX0VORDsgYnJlYWs7CisgICAgICAgICAgY2FzZSBMQU1BTEVGX0VORDogbGVuT3B0aW9uc0xhbUFsZWYgPSBMQU1BTEVGX0JFR0lOOyBicmVhazsKKyAgICAgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICAgICAgIH0KKyAgICAgICAgICBzd2l0Y2ggKGxlbk9wdGlvbnNUYXNoa2VlbCl7CisgICAgICAgICAgY2FzZSBUQVNIS0VFTF9CRUdJTjogbGVuT3B0aW9uc1Rhc2hrZWVsID0gVEFTSEtFRUxfRU5EOyBicmVhazsKKyAgICAgICAgICBjYXNlIFRBU0hLRUVMX0VORDogbGVuT3B0aW9uc1Rhc2hrZWVsID0gVEFTSEtFRUxfQkVHSU47IGJyZWFrOworICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisKKyAgICAgIGlmIChsZW5PcHRpb25zTGFtQWxlZiA9PSBMQU1BTEVGX05FQVIpIHsKKyAgICAgICAgICBmb3IgKGludCBpID0gc3RhcnQsIGUgPSBpICsgbGVuZ3RoOyBpIDwgZTsgKytpKSB7CisgICAgICAgICAgICAgIGlmIChkZXN0W2ldID09IExBTUFMRUZfU1BBQ0VfU1VCKSB7CisgICAgICAgICAgICAgICAgICBkZXN0W2ldID0gU1BBQ0VfQ0hBUl9GT1JfTEFNQUxFRjsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgIH0KKworICAgICAgfSBlbHNlIHsKKworICAgICAgICAgIGZpbmFsIGludCBlID0gc3RhcnQgKyBsZW5ndGg7CisgICAgICAgICAgaW50IHdMID0gY291bnRTcGFjZVN1YihkZXN0LCBsZW5ndGgsIExBTUFMRUZfU1BBQ0VfU1VCKTsKKyAgICAgICAgICBpbnQgd1QgPSBjb3VudFNwYWNlU3ViKGRlc3QsIGxlbmd0aCwgVEFTSEtFRUxfU1BBQ0VfU1VCKTsKKworICAgICAgICAgIGlmIChsZW5PcHRpb25zTGFtQWxlZiA9PSBMQU1BTEVGX0VORCl7CisgICAgICAgICAgICBsYW1BbGVmT24gPSB0cnVlOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAobGVuT3B0aW9uc1Rhc2hrZWVsID09IFRBU0hLRUVMX0VORCl7CisgICAgICAgICAgICB0YXNoa2VlbE9uID0gdHJ1ZTsKKyAgICAgICAgICB9CisKKworICAgICAgICAgIGlmIChsYW1BbGVmT24gJiYgKGxlbk9wdGlvbnNMYW1BbGVmID09IExBTUFMRUZfRU5EKSkgeworICAgICAgICAgICAgc2hpZnRBcnJheShkZXN0LCBzdGFydCwgZSwgTEFNQUxFRl9TUEFDRV9TVUIpOworICAgICAgICAgICAgd2hpbGUgKHdMID4gc3RhcnQpIHsKKyAgICAgICAgICAgICAgICBkZXN0Wy0td0xdID0gU1BBQ0VfQ0hBUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAodGFzaGtlZWxPbiAmJiAobGVuT3B0aW9uc1Rhc2hrZWVsID09IFRBU0hLRUVMX0VORCkpeworICAgICAgICAgICAgc2hpZnRBcnJheShkZXN0LCBzdGFydCwgZSwgVEFTSEtFRUxfU1BBQ0VfU1VCKTsKKyAgICAgICAgICAgIHdoaWxlICh3VCA+IHN0YXJ0KSB7CisgICAgICAgICAgICAgICAgIGRlc3RbLS13VF0gPSBTUEFDRV9DSEFSOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKworICAgICAgICAgIGxhbUFsZWZPbiA9IGZhbHNlOworICAgICAgICAgIHRhc2hrZWVsT24gPSBmYWxzZTsKKworICAgICAgICAgIGlmIChsZW5PcHRpb25zTGFtQWxlZiA9PSBMQU1BTEVGX1JFU0laRSl7CisgICAgICAgICAgICBsYW1BbGVmT24gPSB0cnVlOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAobGVuT3B0aW9uc1Rhc2hrZWVsID09IFRBU0hLRUVMX1JFU0laRSl7CisgICAgICAgICAgICB0YXNoa2VlbE9uID0gdHJ1ZTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAobGFtQWxlZk9uICYmIChsZW5PcHRpb25zTGFtQWxlZiA9PSBMQU1BTEVGX1JFU0laRSkpeworICAgICAgICAgICAgICBzaGlmdEFycmF5KGRlc3QsIHN0YXJ0LCBlLCBMQU1BTEVGX1NQQUNFX1NVQik7CisgICAgICAgICAgICAgIHdMID0gZmxpcEFycmF5KGRlc3Qsc3RhcnQsZSwgd0wpOworICAgICAgICAgICAgICBsZW5ndGggPSB3TCAtIHN0YXJ0OworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAodGFzaGtlZWxPbiAmJiAobGVuT3B0aW9uc1Rhc2hrZWVsID09IFRBU0hLRUVMX1JFU0laRSkpIHsKKyAgICAgICAgICAgICAgc2hpZnRBcnJheShkZXN0LCBzdGFydCwgZSwgVEFTSEtFRUxfU1BBQ0VfU1VCKTsKKyAgICAgICAgICAgICAgd1QgPSBmbGlwQXJyYXkoZGVzdCxzdGFydCxlLCB3VCk7CisgICAgICAgICAgICAgIGxlbmd0aCA9IHdUIC0gc3RhcnQ7CisgICAgICAgICAgfQorCisgICAgICAgICAgbGFtQWxlZk9uID0gZmFsc2U7CisgICAgICAgICAgdGFzaGtlZWxPbiA9IGZhbHNlOworCisgICAgICAgICAgaWYgKChsZW5PcHRpb25zTGFtQWxlZiA9PSBMQU1BTEVGX0JFR0lOKSB8fAorICAgICAgICAgICAgICAobGVuT3B0aW9uc0xhbUFsZWYgPT0gTEFNQUxFRl9BVVRPKSl7CisgICAgICAgICAgICAgICAgbGFtQWxlZk9uID0gdHJ1ZTsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKGxlbk9wdGlvbnNUYXNoa2VlbCA9PSBUQVNIS0VFTF9CRUdJTil7CisgICAgICAgICAgICAgICAgdGFzaGtlZWxPbiA9IHRydWU7CisgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKGxhbUFsZWZPbiAmJiAoKGxlbk9wdGlvbnNMYW1BbGVmID09IExBTUFMRUZfQkVHSU4pfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAobGVuT3B0aW9uc0xhbUFsZWYgPT0gTEFNQUxFRl9BVVRPKSkpIHsgLy8gc3BhY2VzIGF0IGJlZ2lubmluZworICAgICAgICAgICAgICBzaGlmdEFycmF5KGRlc3QsIHN0YXJ0LCBlLCBMQU1BTEVGX1NQQUNFX1NVQik7CisgICAgICAgICAgICAgICB3TCA9IGZsaXBBcnJheShkZXN0LHN0YXJ0LGUsIHdMKTsKKyAgICAgICAgICAgICAgICAgIHdoaWxlICh3TCA8IGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICBkZXN0W3dMKytdID0gU1BBQ0VfQ0hBUjsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBpZih0YXNoa2VlbE9uICYmIChsZW5PcHRpb25zVGFzaGtlZWwgPT0gVEFTSEtFRUxfQkVHSU4pKXsKKyAgICAgICAgICAgICAgIHNoaWZ0QXJyYXkoZGVzdCwgc3RhcnQsIGUsIFRBU0hLRUVMX1NQQUNFX1NVQik7CisgICAgICAgICAgICAgICB3VCA9IGZsaXBBcnJheShkZXN0LHN0YXJ0LGUsIHdUKTsKKyAgICAgICAgICAgICAgICAgIHdoaWxlICh3VCA8IGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICBkZXN0W3dUKytdID0gU1BBQ0VfQ0hBUjsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorICAgICAgICAgICB9CisKKyAgICAgIHJldHVybiBsZW5ndGg7CisgIH0KKworCisgIC8qCisgICAqTmFtZSAgICAgOmV4cGFuZENvbXBvc2l0Q2hhckF0QmVnaW4KKyAgICpGdW5jdGlvbiA6RXhwYW5kcyB0aGUgTGFtQWxlZiBjaGFyYWN0ZXIgdG8gTGFtIGFuZCBBbGVmIGNvbnN1bWluZyB0aGUgcmVxdWlyZWQKKyAgICogICAgICAgICBzcGFjZSBmcm9tIGJlZ2lubmluZyBvZiB0aGUgYnVmZmVyLiBJZiB0aGUgdGV4dCB0eXBlIHdhcyB2aXN1YWxfTFRSCisgICAqICAgICAgICAgYW5kIHRoZSBvcHRpb24gU1BBQ0VTX1JFTEFUSVZFX1RPX1RFWFRfQkVHSU5fRU5EIHdhcyBzZWxlY3RlZAorICAgKiAgICAgICAgIHRoZSBzcGFjZXMgd2lsbCBiZSBsb2NhdGVkIGF0IGVuZCBvZiBidWZmZXIuCisgICAqICAgICAgICAgSWYgdGhlcmUgYXJlIG5vIHNwYWNlcyB0byBleHBhbmQgdGhlIExhbUFsZWYsIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24uCisqLworIHByaXZhdGUgYm9vbGVhbiBleHBhbmRDb21wb3NpdENoYXJBdEJlZ2luKGNoYXJbXSBkZXN0LGludCBzdGFydCwgaW50IGxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGFjb3VudCkgeworICAgICBib29sZWFuIHNwYWNlTm90Rm91bmQgPSBmYWxzZTsKKworICAgICBpZiAobGFjb3VudCA+IGNvdW50U3BhY2VzUmlnaHQoZGVzdCwgc3RhcnQsIGxlbmd0aCkpIHsKKyAgICAgICAgIHNwYWNlTm90Rm91bmQgPSB0cnVlOworICAgICAgICAgcmV0dXJuIHNwYWNlTm90Rm91bmQ7CisgICAgIH0KKyAgICAgZm9yIChpbnQgciA9IHN0YXJ0ICsgbGVuZ3RoIC0gbGFjb3VudCwgdyA9IHN0YXJ0ICsgbGVuZ3RoOyAtLXIgPj0gc3RhcnQ7KSB7CisgICAgICAgICBjaGFyIGNoID0gZGVzdFtyXTsKKyAgICAgICAgIGlmIChpc05vcm1hbGl6ZWRMYW1BbGVmQ2hhcihjaCkpIHsKKyAgICAgICAgICAgICBkZXN0Wy0td10gPSBMQU1fQ0hBUjsKKyAgICAgICAgICAgICBkZXN0Wy0td10gPSBjb252ZXJ0Tm9ybWFsaXplZExhbUFsZWZbY2ggLSAnXHUwNjVDJ107CisgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgIGRlc3RbLS13XSA9IGNoOworICAgICAgICAgfQorICAgICB9CisgICAgIHJldHVybiBzcGFjZU5vdEZvdW5kOworCisgIH0KKworICAvKgorICAgKk5hbWUgICAgIDogZXhwYW5kQ29tcG9zaXRDaGFyQXRFbmQKKyAgICpGdW5jdGlvbiA6IEV4cGFuZHMgdGhlIExhbUFsZWYgY2hhcmFjdGVyIHRvIExhbSBhbmQgQWxlZiBjb25zdW1pbmcgdGhlCisgICAqICAgICAgICAgICByZXF1aXJlZCBzcGFjZSBmcm9tIGVuZCBvZiB0aGUgYnVmZmVyLiBJZiB0aGUgdGV4dCB0eXBlIHdhcworICAgKiAgICAgICAgICAgVmlzdWFsIExUUiBhbmQgdGhlIG9wdGlvbiBTUEFDRVNfUkVMQVRJVkVfVE9fVEVYVF9CRUdJTl9FTkQKKyAgICogICAgICAgICAgIHdhcyB1c2VkLCB0aGUgc3BhY2VzIHdpbGwgYmUgY29uc3VtZWQgZnJvbSBiZWdpbiBvZiBidWZmZXIuIElmCisgICAqICAgICAgICAgICB0aGVyZSBhcmUgbm8gc3BhY2VzIHRvIGV4cGFuZCB0aGUgTGFtQWxlZiwgYW4gZXhjZXB0aW9uIGlzIHRocm93bi4KKyAgICovCisKKyAgcHJpdmF0ZSBib29sZWFuICBleHBhbmRDb21wb3NpdENoYXJBdEVuZChjaGFyW10gZGVzdCxpbnQgc3RhcnQsIGludCBsZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsYWNvdW50KXsKKyAgICAgIGJvb2xlYW4gc3BhY2VOb3RGb3VuZCA9IGZhbHNlOworCisgICAgICBpZiAobGFjb3VudCA+IGNvdW50U3BhY2VzTGVmdChkZXN0LCBzdGFydCwgbGVuZ3RoKSkgeworICAgICAgICAgIHNwYWNlTm90Rm91bmQgPSB0cnVlOworICAgICAgICAgIHJldHVybiBzcGFjZU5vdEZvdW5kOworICAgICAgfQorICAgICAgZm9yIChpbnQgciA9IHN0YXJ0ICsgbGFjb3VudCwgdyA9IHN0YXJ0LCBlID0gc3RhcnQgKyBsZW5ndGg7IHIgPCBlOyArK3IpIHsKKyAgICAgICAgICBjaGFyIGNoID0gZGVzdFtyXTsKKyAgICAgICAgICBpZiAoaXNOb3JtYWxpemVkTGFtQWxlZkNoYXIoY2gpKSB7CisgICAgICAgICAgICAgIGRlc3RbdysrXSA9IGNvbnZlcnROb3JtYWxpemVkTGFtQWxlZltjaCAtICdcdTA2NUMnXTsKKyAgICAgICAgICAgICAgZGVzdFt3KytdID0gTEFNX0NIQVI7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgZGVzdFt3KytdID0gY2g7CisgICAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0dXJuIHNwYWNlTm90Rm91bmQ7CisgIH0KKworICAvKgorICAgKk5hbWUgICAgIDogZXhwYW5kQ29tcG9zaXRDaGFyQXROZWFyCisgICAqRnVuY3Rpb24gOiBFeHBhbmRzIHRoZSBMYW1BbGVmIGNoYXJhY3RlciBpbnRvIExhbSArIEFsZWYsIFllaEhhbXphIGNoYXJhY3RlcgorICAgKiAgICAgICAgICAgaW50byBZZWggKyBIYW16YSwgU2VlbkZhbWlseSBjaGFyYWN0ZXIgaW50byBTZWVuRmFtaWx5IGNoYXJhY3RlcgorICAgKiAgICAgICAgICAgKyBUYWlsLCB3aGlsZSBjb25zdW1pbmcgdGhlIHNwYWNlIG5leHQgdG8gdGhlIGNoYXJhY3Rlci4KKyAgICovCisKKyAgcHJpdmF0ZSBib29sZWFuIGV4cGFuZENvbXBvc2l0Q2hhckF0TmVhcihjaGFyW10gZGVzdCxpbnQgc3RhcnQsIGludCBsZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeWVoSGFtemFPcHRpb24sIGludCBzZWVuVGFpbE9wdGlvbiwgaW50IGxhbUFsZWZPcHRpb24peworCisgICAgICBib29sZWFuIHNwYWNlTm90Rm91bmQgPSBmYWxzZTsKKworCisKKyAgICAgIGlmIChpc05vcm1hbGl6ZWRMYW1BbGVmQ2hhcihkZXN0W3N0YXJ0XSkpIHsKKyAgICAgICAgICBzcGFjZU5vdEZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICByZXR1cm4gc3BhY2VOb3RGb3VuZDsKKyAgICAgIH0KKyAgICAgIGZvciAoaW50IGkgPSBzdGFydCArIGxlbmd0aDsgLS1pID49c3RhcnQ7KSB7CisgICAgICAgICAgY2hhciBjaCA9IGRlc3RbaV07CisgICAgICAgICAgaWYgKGxhbUFsZWZPcHRpb24gPT0gMSAmJiBpc05vcm1hbGl6ZWRMYW1BbGVmQ2hhcihjaCkpIHsKKyAgICAgICAgICAgICAgaWYgKGk+c3RhcnQgJiZkZXN0W2ktMV0gPT0gU1BBQ0VfQ0hBUikgeworICAgICAgICAgICAgICAgICAgZGVzdFtpXSA9IExBTV9DSEFSOworICAgICAgICAgICAgICAgICAgZGVzdFstLWldID0gY29udmVydE5vcm1hbGl6ZWRMYW1BbGVmW2NoIC0gJ1x1MDY1QyddOworICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgc3BhY2VOb3RGb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICByZXR1cm4gc3BhY2VOb3RGb3VuZDsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgIH1lbHNlIGlmKHNlZW5UYWlsT3B0aW9uID09IDEgJiYgaXNTZWVuVGFpbEZhbWlseUNoYXIoY2gpID09IDEpeworICAgICAgICAgICAgICBpZihpPnN0YXJ0ICYmZGVzdFtpLTFdID09IFNQQUNFX0NIQVIpeworICAgICAgICAgICAgICAgICAgZGVzdFtpLTFdID0gdGFpbENoYXI7CisgICAgICAgICAgICAgIH0gZWxzZXsKKyAgICAgICAgICAgICAgICAgIHNwYWNlTm90Rm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgcmV0dXJuIHNwYWNlTm90Rm91bmQ7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICB9ZWxzZSBpZih5ZWhIYW16YU9wdGlvbiA9PSAxICYmIGlzWWVoSGFtemFDaGFyKGNoKSl7CisKKyAgICAgICAgICAgICAgIGlmKGk+c3RhcnQgJiZkZXN0W2ktMV0gPT0gU1BBQ0VfQ0hBUil7CisgICAgICAgICAgICAgICAgICBkZXN0W2ldID0geWVoSGFtemFUb1llaFtjaCAtIFlFSF9IQU1aQUZFX0NIQVJdOworICAgICAgICAgICAgICAgICAgZGVzdFtpLTFdID0gSEFNWkFGRV9DSEFSOworICAgICAgICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgICAgICAgIHNwYWNlTm90Rm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgcmV0dXJuIHNwYWNlTm90Rm91bmQ7CisgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgfQorCisgICAgLyoKKyAgICAgKiBOYW1lICAgIDogZXhwYW5kQ29tcG9zaXRDaGFyCisgICAgICogRnVuY3Rpb246IExhbUFsZWYgbmVlZHMgc3BlY2lhbCBoYW5kbGluZyBhcyB0aGUgTGFtQWxlZiBpcworICAgICAqICAgICAgICAgICBvbmUgY2hhcmFjdGVyIHdoaWxlIGV4cGFuZGluZyBpdCB3aWxsIGdpdmUgdHdvCisgICAgICogICAgICAgICAgIGNoYXJhY3RlcnMgTGFtICsgQWxlZiwgc28gd2UgbmVlZCB0byBleHBhbmQgdGhlIExhbUFsZWYKKyAgICAgKiAgICAgICAgICAgaW4gbmVhciBvciBmYXIgc3BhY2VzIGFjY29yZGluZyB0byB0aGUgb3B0aW9ucyB0aGUgdXNlcgorICAgICAqICAgICAgICAgICBzcGVjaWZpZXMgb3IgaW5jcmVhc2UgdGhlIGJ1ZmZlciBzaXplLgorICAgICAqICAgICAgICAgICBEZXN0IGhhcyBlbm91Z2ggcm9vbSBmb3IgdGhlIGV4cGFuc2lvbiBpZiB3ZSBhcmUgZ3Jvd2luZy4KKyAgICAgKiAgICAgICAgICAgbGFtYWxlZiBhcmUgbm9ybWFsaXplZCB0byB0aGUgJ3NwZWNpYWwgY2hhcmFjdGVycycKKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBleHBhbmRDb21wb3NpdENoYXIoY2hhcltdIGRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxhY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2hhcGluZ01vZGUpIHRocm93cyBBcmFiaWNTaGFwaW5nRXhjZXB0aW9uIHsKKworICAgICAgICBpbnQgbGVuT3B0aW9uc0xhbUFsZWYgPSBvcHRpb25zICYgTEFNQUxFRl9NQVNLOworICAgICAgICBpbnQgbGVuT3B0aW9uc1NlZW4gPSBvcHRpb25zICYgU0VFTl9NQVNLOworICAgICAgICBpbnQgbGVuT3B0aW9uc1llaEhhbXphID0gb3B0aW9ucyAmIFlFSEhBTVpBX01BU0s7CisgICAgICAgIGJvb2xlYW4gc3BhY2VOb3RGb3VuZCA9IGZhbHNlOworCisgICAgICAgIGlmICghaXNMb2dpY2FsICYmICFzcGFjZXNSZWxhdGl2ZVRvVGV4dEJlZ2luRW5kKSB7CisgICAgICAgICAgICBzd2l0Y2ggKGxlbk9wdGlvbnNMYW1BbGVmKSB7CisgICAgICAgICAgICBjYXNlIExBTUFMRUZfQkVHSU46IGxlbk9wdGlvbnNMYW1BbGVmID0gTEFNQUxFRl9FTkQ7IGJyZWFrOworICAgICAgICAgICAgY2FzZSBMQU1BTEVGX0VORDogbGVuT3B0aW9uc0xhbUFsZWYgPSBMQU1BTEVGX0JFR0lOOyBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYoc2hhcGluZ01vZGUgPT0gMSl7CisgICAgICAgICAgICBpZihsZW5PcHRpb25zTGFtQWxlZiA9PSBMQU1BTEVGX0FVVE8peworICAgICAgICAgICAgICAgIGlmKGlzTG9naWNhbCl7CisgICAgICAgICAgICAgICAgICAgIHNwYWNlTm90Rm91bmQgPSBleHBhbmRDb21wb3NpdENoYXJBdEVuZChkZXN0LCBzdGFydCwgbGVuZ3RoLCBsYWNvdW50KTsKKyAgICAgICAgICAgICAgICAgICAgaWYoc3BhY2VOb3RGb3VuZCl7CisgICAgICAgICAgICAgICAgICAgICAgICBzcGFjZU5vdEZvdW5kID0gZXhwYW5kQ29tcG9zaXRDaGFyQXRCZWdpbihkZXN0LCBzdGFydCwgbGVuZ3RoLCBsYWNvdW50KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZihzcGFjZU5vdEZvdW5kKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwYWNlTm90Rm91bmQgPSBleHBhbmRDb21wb3NpdENoYXJBdE5lYXIoZGVzdCwgc3RhcnQsIGxlbmd0aCwwLDAsMSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYoc3BhY2VOb3RGb3VuZCl7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJhYmljU2hhcGluZ0V4Y2VwdGlvbigiTm8gc3BhY2Vmb3IgbGFtYWxlZiIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgICAgIHNwYWNlTm90Rm91bmQgPSBleHBhbmRDb21wb3NpdENoYXJBdEJlZ2luKGRlc3QsIHN0YXJ0LCBsZW5ndGgsIGxhY291bnQpOworICAgICAgICAgICAgICAgICAgICBpZihzcGFjZU5vdEZvdW5kKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwYWNlTm90Rm91bmQgPSBleHBhbmRDb21wb3NpdENoYXJBdEVuZChkZXN0LCBzdGFydCwgbGVuZ3RoLCBsYWNvdW50KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZihzcGFjZU5vdEZvdW5kKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwYWNlTm90Rm91bmQgPSBleHBhbmRDb21wb3NpdENoYXJBdE5lYXIoZGVzdCwgc3RhcnQsIGxlbmd0aCwwLDAsMSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYoc3BhY2VOb3RGb3VuZCl7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJhYmljU2hhcGluZ0V4Y2VwdGlvbigiTm8gc3BhY2Vmb3IgbGFtYWxlZiIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfWVsc2UgaWYobGVuT3B0aW9uc0xhbUFsZWYgPT0gTEFNQUxFRl9FTkQpeworICAgICAgICAgICAgICAgIHNwYWNlTm90Rm91bmQgPSBleHBhbmRDb21wb3NpdENoYXJBdEVuZChkZXN0LCBzdGFydCwgbGVuZ3RoLCBsYWNvdW50KTsKKyAgICAgICAgICAgICAgICBpZihzcGFjZU5vdEZvdW5kKXsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyYWJpY1NoYXBpbmdFeGNlcHRpb24oIk5vIHNwYWNlZm9yIGxhbWFsZWYiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9ZWxzZSBpZihsZW5PcHRpb25zTGFtQWxlZiA9PSBMQU1BTEVGX0JFR0lOKXsKKyAgICAgICAgICAgICAgICBzcGFjZU5vdEZvdW5kID0gZXhwYW5kQ29tcG9zaXRDaGFyQXRCZWdpbihkZXN0LCBzdGFydCwgbGVuZ3RoLCBsYWNvdW50KTsKKyAgICAgICAgICAgICAgICBpZihzcGFjZU5vdEZvdW5kKXsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyYWJpY1NoYXBpbmdFeGNlcHRpb24oIk5vIHNwYWNlZm9yIGxhbWFsZWYiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9ZWxzZSBpZihsZW5PcHRpb25zTGFtQWxlZiA9PSBMQU1BTEVGX05FQVIpeworICAgICAgICAgICAgICAgIHNwYWNlTm90Rm91bmQgPSBleHBhbmRDb21wb3NpdENoYXJBdE5lYXIoZGVzdCwgc3RhcnQsIGxlbmd0aCwwLDAsMSk7CisgICAgICAgICAgICAgICAgaWYoc3BhY2VOb3RGb3VuZCl7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmFiaWNTaGFwaW5nRXhjZXB0aW9uKCJObyBzcGFjZWZvciBsYW1hbGVmIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB9ZWxzZSBpZihsZW5PcHRpb25zTGFtQWxlZiA9PSBMQU1BTEVGX1JFU0laRSl7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgciA9IHN0YXJ0ICsgbGVuZ3RoLCB3ID0gciArIGxhY291bnQ7IC0tciA+PSBzdGFydDspIHsKKyAgICAgICAgICAgICAgICAgICAgY2hhciBjaCA9IGRlc3Rbcl07CisgICAgICAgICAgICAgICAgICAgIGlmIChpc05vcm1hbGl6ZWRMYW1BbGVmQ2hhcihjaCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RbLS13XSA9ICdcdTA2NDQnOworICAgICAgICAgICAgICAgICAgICAgICAgZGVzdFstLXddID0gY29udmVydE5vcm1hbGl6ZWRMYW1BbGVmW2NoIC0gJ1x1MDY1QyddOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgZGVzdFstLXddID0gY2g7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbGVuZ3RoICs9IGxhY291bnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgICAgICBpZihsZW5PcHRpb25zU2VlbiA9PSBTRUVOX1RXT0NFTExfTkVBUil7CisgICAgICAgICAgICAgICAgc3BhY2VOb3RGb3VuZCA9IGV4cGFuZENvbXBvc2l0Q2hhckF0TmVhcihkZXN0LCBzdGFydCwgbGVuZ3RoLDAsMSwwKTsKKyAgICAgICAgICAgICAgICBpZihzcGFjZU5vdEZvdW5kKXsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyYWJpY1NoYXBpbmdFeGNlcHRpb24oIk5vIHNwYWNlIGZvciBTZWVuIHRhaWwgZXhwYW5zaW9uIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYobGVuT3B0aW9uc1llaEhhbXphID09IFlFSEhBTVpBX1RXT0NFTExfTkVBUil7CisgICAgICAgICAgICAgICAgc3BhY2VOb3RGb3VuZCA9IGV4cGFuZENvbXBvc2l0Q2hhckF0TmVhcihkZXN0LCBzdGFydCwgbGVuZ3RoLDEsMCwwKTsKKyAgICAgICAgICAgICAgICBpZihzcGFjZU5vdEZvdW5kKXsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyYWJpY1NoYXBpbmdFeGNlcHRpb24oIk5vIHNwYWNlIGZvciBZZWhIYW16YSBleHBhbnNpb24iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIHJldHVybiBsZW5ndGg7CisgICAgfQorCisKKyAgICAvKiBDb252ZXJ0IHRoZSBpbnB1dCBidWZmZXIgZnJvbSBGRXh4IFJhbmdlIGludG8gMDZ4eCBSYW5nZQorICAgICAqIHRvIHB1dCBhbGwgY2hhcmFjdGVycyBpbnRvIHRoZSAwNnh4IHJhbmdlCisgICAgICogZXZlbiB0aGUgbGFtYWxlZiBpcyBjb252ZXJ0ZWQgdG8gdGhlIHNwZWNpYWwgcmVnaW9uIGluCisgICAgICogdGhlIDA2eHggcmFuZ2UuICBSZXR1cm4gdGhlIG51bWJlciBvZiBsYW1hbGVmIGNoYXJzIGZvdW5kLgorICAgICAqLworICAgIHByaXZhdGUgaW50IG5vcm1hbGl6ZShjaGFyW10gZGVzdCwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB7CisgICAgICAgIGludCBsYWNvdW50ID0gMDsKKyAgICAgICAgZm9yIChpbnQgaSA9IHN0YXJ0LCBlID0gaSArIGxlbmd0aDsgaSA8IGU7ICsraSkgeworICAgICAgICAgICAgY2hhciBjaCA9IGRlc3RbaV07CisgICAgICAgICAgICBpZiAoY2ggPj0gJ1x1RkU3MCcgJiYgY2ggPD0gJ1x1RkVGQycpIHsKKyAgICAgICAgICAgICAgICBpZiAoaXNMYW1BbGVmQ2hhcihjaCkpIHsKKyAgICAgICAgICAgICAgICAgICAgKytsYWNvdW50OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkZXN0W2ldID0gKGNoYXIpY29udmVydEZFdG8wNltjaCAtICdcdUZFNzAnXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbGFjb3VudDsKKyAgICB9CisKKyAgICAvKgorICAgICAqIE5hbWUgICAgOiBkZXNoYXBlTm9ybWFsaXplCisgICAgICogRnVuY3Rpb246IENvbnZlcnQgdGhlIGlucHV0IGJ1ZmZlciBmcm9tIEZFeHggUmFuZ2UgaW50byAwNnh4IFJhbmdlCisgICAgICogICAgICAgICAgIGV2ZW4gdGhlIGxhbWFsZWYgaXMgY29udmVydGVkIHRvIHRoZSBzcGVjaWFsIHJlZ2lvbiBpbiB0aGUgMDZ4eCByYW5nZS4KKyAgICAgKiAgICAgICAgICAgQWNjb3JkaW5nIHRvIHRoZSBvcHRpb25zIHRoZSB1c2VyIGVudGVycywgYWxsIHNlZW4gZmFtaWx5IGNoYXJhY3RlcnMKKyAgICAgKiAgICAgICAgICAgZm9sbG93ZWQgYnkgYSB0YWlsIGNoYXJhY3RlciBhcmUgbWVyZ2VkIHRvIHNlZW4gdGFpbCBmYW1pbHkgY2hhcmFjdGVyIGFuZAorICAgICAqICAgICAgICAgICBhbnkgeWVoIGZvbGxvd2VkIGJ5IGEgaGFtemEgY2hhcmFjdGVyIGFyZSBtZXJnZWQgdG8geWVoaGFtemEgY2hhcmFjdGVyLgorICAgICAqICAgICAgICAgICBNZXRob2QgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGxhbWFsZWYgY2hhcnMgZm91bmQuCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgZGVzaGFwZU5vcm1hbGl6ZShjaGFyW10gZGVzdCwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB7CisgICAgICAgIGludCBsYWNvdW50ID0gMDsKKyAgICAgICAgaW50IHllaEhhbXphQ29tcG9zZUVuYWJsZWQgPSAwOworICAgICAgICBpbnQgc2VlbkNvbXBvc2VFbmFibGVkID0gMDsKKworICAgICAgICB5ZWhIYW16YUNvbXBvc2VFbmFibGVkID0gKChvcHRpb25zJllFSEhBTVpBX01BU0spID09IFlFSEhBTVpBX1RXT0NFTExfTkVBUikgPyAxIDogMDsKKyAgICAgICAgc2VlbkNvbXBvc2VFbmFibGVkID0gKChvcHRpb25zJlNFRU5fTUFTSykgPT0gU0VFTl9UV09DRUxMX05FQVIpPyAxIDogMDsKKworICAgICAgICBmb3IgKGludCBpID0gc3RhcnQsIGUgPSBpICsgbGVuZ3RoOyBpIDwgZTsgKytpKSB7CisgICAgICAgICAgICBjaGFyIGNoID0gZGVzdFtpXTsKKworICAgICAgICBpZiggKHllaEhhbXphQ29tcG9zZUVuYWJsZWQgPT0gMSkgJiYgKChjaCA9PSBIQU1aQTA2X0NIQVIpIHx8IChjaCA9PSBIQU1aQUZFX0NIQVIpKQorICAgICAgICAgICAgICAgJiYgKGkgPCAobGVuZ3RoIC0gMSkpICYmIGlzQWxlZk1ha3NvdXJhQ2hhcihkZXN0W2krMV0gKSkgeworICAgICAgICAgICAgICAgIGRlc3RbaV0gPSBTUEFDRV9DSEFSOworICAgICAgICAgICAgICAgIGRlc3RbaSsxXSA9IFlFSF9IQU1aQV9DSEFSOworICAgICAgIH0gZWxzZSBpZiAoIChzZWVuQ29tcG9zZUVuYWJsZWQgPT0gMSkgJiYgKGlzVGFpbENoYXIoY2gpKSAmJiAoaTwgKGxlbmd0aCAtIDEpKQorICAgICAgICAgICAgICAgICAgICAgICAmJiAoaXNTZWVuVGFpbEZhbWlseUNoYXIoZGVzdFtpKzFdKT09MSkgKSB7CisgICAgICAgICAgICAgICBkZXN0W2ldID0gU1BBQ0VfQ0hBUjsKKyAgICAgICB9CisgICAgICAgZWxzZSBpZiAoY2ggPj0gJ1x1RkU3MCcgJiYgY2ggPD0gJ1x1RkVGQycpIHsKKyAgICAgICAgICAgICAgICBpZiAoaXNMYW1BbGVmQ2hhcihjaCkpIHsKKyAgICAgICAgICAgICAgICAgICAgKytsYWNvdW50OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkZXN0W2ldID0gKGNoYXIpY29udmVydEZFdG8wNltjaCAtICdcdUZFNzAnXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbGFjb3VudDsKKyAgICB9CisKKyAgICAvKgorICAgICAqIE5hbWUgICAgOiBzaGFwZVVuaWNvZGUKKyAgICAgKiBGdW5jdGlvbjogQ29udmVydHMgYW4gQXJhYmljIFVuaWNvZGUgYnVmZmVyIGluIDA2eHggUmFuZ2UgaW50byBhIHNoYXBlZAorICAgICAqICAgICAgICAgICBhcmFiaWMgVW5pY29kZSBidWZmZXIgaW4gRkV4eCBSYW5nZQorICAgICAqLworICAgIHByaXZhdGUgaW50IHNoYXBlVW5pY29kZShjaGFyW10gZGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0YXNoa2VlbEZsYWcpdGhyb3dzIEFyYWJpY1NoYXBpbmdFeGNlcHRpb24geworCisgICAgICAgIGludCBsYW1hbGVmX2NvdW50ID0gbm9ybWFsaXplKGRlc3QsIHN0YXJ0LCBsZW5ndGgpOworCisgICAgICAgIC8vIHJlc29sdmUgdGhlIGxpbmsgYmV0d2VlbiB0aGUgY2hhcmFjdGVycy4KKyAgICAgICAgLy8gQXJhYmljIGNoYXJhY3RlcnMgaGF2ZSBmb3VyIGZvcm1zOiBJc29sYXRlZCwgSW5pdGlhbCwgTWVkaWFsIGFuZCBGaW5hbC4KKyAgICAgICAgLy8gVGFzaGtlZWwgY2hhcmFjdGVycyBoYXZlIHR3bywgaXNvbGF0ZWQgb3IgbWVkaWFsLCBhbmQgc29tZXRpbWVzIG9ubHkgaXNvbGF0ZWQuCisgICAgICAgIC8vIHRhc2hrZWVsRmxhZyA9PSAwOiBzaGFwZSBub3JtYWxseSwgMTogc2hhcGUgaXNvbGF0ZWQsIDI6IGRvbid0IHNoYXBlCisKKyAgICAgICAgYm9vbGVhbiBsYW1hbGVmX2ZvdW5kID0gZmFsc2UsIHNlZW5mYW1fZm91bmQgPSBmYWxzZTsKKyAgICAgICAgYm9vbGVhbiB5ZWhoYW16YV9mb3VuZCA9IGZhbHNlLCB0YXNoa2VlbF9mb3VuZCA9IGZhbHNlOworICAgICAgICBpbnQgaSA9IHN0YXJ0ICsgbGVuZ3RoIC0gMTsKKyAgICAgICAgaW50IGN1cnJMaW5rID0gZ2V0TGluayhkZXN0W2ldKTsKKyAgICAgICAgaW50IG5leHRMaW5rID0gMDsKKyAgICAgICAgaW50IHByZXZMaW5rID0gMDsKKyAgICAgICAgaW50IGxhc3RMaW5rID0gMDsKKyAgICAgICAgLy9pbnQgcHJldlBvcyA9IGk7CisgICAgICAgIGludCBsYXN0UG9zID0gaTsKKyAgICAgICAgaW50IG54ID0gLTI7CisgICAgICAgIGludCBudyA9IDA7CisKKyAgICAgICAgd2hpbGUgKGkgPj0gMCkgeworICAgICAgICAgICAgLy8gSWYgaGlnaCBieXRlIG9mIGN1cnJMaW5rID4gMCB0aGVuIHRoZXJlIG1pZ2h0IGJlIG1vcmUgdGhhbiBvbmUgc2hhcGUKKyAgICAgICAgICAgIGlmICgoY3VyckxpbmsgJiAnXHVGRjAwJykgPiAwIHx8IGlzVGFzaGtlZWxDaGFyKGRlc3RbaV0pKSB7CisgICAgICAgICAgICAgICAgbncgPSBpIC0gMTsKKyAgICAgICAgICAgICAgICBueCA9IC0yOworICAgICAgICAgICAgICAgIHdoaWxlIChueCA8IDApIHsgLy8gd2UgbmVlZCB0byBrbm93IGFib3V0IG5leHQgY2hhcgorICAgICAgICAgICAgICAgICAgICBpZiAobncgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5leHRMaW5rID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIG54ID0gSW50ZWdlci5NQVhfVkFMVUU7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXh0TGluayA9IGdldExpbmsoZGVzdFtud10pOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChuZXh0TGluayAmIElSUkVMRVZBTlQpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBueCA9IG53OworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLW53OworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCgoY3VyckxpbmsgJiBBTEVGVFlQRSkgPiAwKSAmJiAoKGxhc3RMaW5rICYgTEFNVFlQRSkgPiAwKSkgeworICAgICAgICAgICAgICAgICAgICBsYW1hbGVmX2ZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgY2hhciB3TGFtYWxlZiA9IGNoYW5nZUxhbUFsZWYoZGVzdFtpXSk7IC8vIGdldCBmcm9tIDB4MDY1Qy0weDA2NWYKKyAgICAgICAgICAgICAgICAgICAgaWYgKHdMYW1hbGVmICE9ICdcdTAwMDAnKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXBsYWNlIGFsZWYgYnkgbWFya2VyLCBpdCB3aWxsIGJlIHJlbW92ZWQgbGF0ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RbaV0gPSAnXHVmZmZmJzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RbbGFzdFBvc10gPSB3TGFtYWxlZjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGkgPSBsYXN0UG9zOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgbGFzdExpbmsgPSBwcmV2TGluazsKKyAgICAgICAgICAgICAgICAgICAgY3VyckxpbmsgPSBnZXRMaW5rKHdMYW1hbGVmKTsgLy8gcmVxdWlyZXMgJ1x1MDAwMCcsIHVuZm9ydHVuYXRlbHkKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKChpID4gMCkgJiYgKGRlc3RbaS0xXSA9PSBTUEFDRV9DSEFSKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICggaXNTZWVuRmFtaWx5Q2hhcihkZXN0W2ldKSA9PSAxKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlZW5mYW1fZm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRlc3RbaV0gPT0gWUVIX0hBTVpBX0NIQVIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHllaGhhbXphX2ZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmKGk9PTApeworICAgICAgICAgICAgICAgICAgICBpZiAoIGlzU2VlbkZhbWlseUNoYXIoZGVzdFtpXSkgPT0gMSl7CisgICAgICAgICAgICAgICAgICAgICAgICBzZWVuZmFtX2ZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkZXN0W2ldID09IFlFSF9IQU1aQV9DSEFSKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB5ZWhoYW16YV9mb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgcHJvcGVyIHNoYXBlIGFjY29yZGluZyB0byBsaW5rIGFiaWxpdHkgb2YgbmVpZ2hib3JzCisgICAgICAgICAgICAgICAgLy8gYW5kIG9mIGNoYXJhY3RlcjsgZGVwZW5kcyBvbiB0aGUgb3JkZXIgb2YgdGhlIHNoYXBlcworICAgICAgICAgICAgICAgIC8vIChpc29sYXRlZCwgaW5pdGlhbCwgbWlkZGxlLCBmaW5hbCkgaW4gdGhlIGNvbXBhdGliaWxpdHkgYXJlYQorCisgICAgICAgICAgICAgICAgaW50IGZsYWcgPSBzcGVjaWFsQ2hhcihkZXN0W2ldKTsKKworICAgICAgICAgICAgICAgIGludCBzaGFwZSA9IHNoYXBlVGFibGVbbmV4dExpbmsgJiBMSU5LX01BU0tdCisgICAgICAgICAgICAgICAgICAgIFtsYXN0TGluayAmIExJTktfTUFTS10KKyAgICAgICAgICAgICAgICAgICAgW2N1cnJMaW5rICYgTElOS19NQVNLXTsKKworICAgICAgICAgICAgICAgIGlmIChmbGFnID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgc2hhcGUgJj0gMHgxOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZmxhZyA9PSAyKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICh0YXNoa2VlbEZsYWcgPT0gMCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgKChsYXN0TGluayAmIExJTktMKSAhPSAwKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgKChuZXh0TGluayAmIExJTktSKSAhPSAwKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgZGVzdFtpXSAhPSAnXHUwNjRDJyAmJgorICAgICAgICAgICAgICAgICAgICAgICAgZGVzdFtpXSAhPSAnXHUwNjREJyAmJgorICAgICAgICAgICAgICAgICAgICAgICAgISgobmV4dExpbmsgJiBBTEVGVFlQRSkgPT0gQUxFRlRZUEUgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKGxhc3RMaW5rICYgTEFNVFlQRSkgPT0gTEFNVFlQRSkpIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgc2hhcGUgPSAxOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgc2hhcGUgPSAwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChmbGFnID09IDIpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRhc2hrZWVsRmxhZyA9PSAyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkZXN0W2ldID0gVEFTSEtFRUxfU1BBQ0VfU1VCOworICAgICAgICAgICAgICAgICAgICAgICAgdGFzaGtlZWxfZm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2V7CisgICAgICAgICAgICAgICAgICAgICAgICBkZXN0W2ldID0gKGNoYXIpKCdcdUZFNzAnICsgaXJyZWxldmFudFBvc1tkZXN0W2ldIC0gJ1x1MDY0QiddICsgc2hhcGUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIGVsc2UgbGVhdmUgdGFzaGtlZWwgYWxvbmUKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBkZXN0W2ldID0gKGNoYXIpKCdcdUZFNzAnICsgKGN1cnJMaW5rID4+IDgpICsgc2hhcGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gbW92ZSBvbmUgbm90Y2ggZm9yd2FyZAorICAgICAgICAgICAgaWYgKChjdXJyTGluayAmIElSUkVMRVZBTlQpID09IDApIHsKKyAgICAgICAgICAgICAgICBwcmV2TGluayA9IGxhc3RMaW5rOworICAgICAgICAgICAgICAgIGxhc3RMaW5rID0gY3Vyckxpbms7CisgICAgICAgICAgICAgICAgLy9wcmV2UG9zID0gbGFzdFBvczsKKyAgICAgICAgICAgICAgICBsYXN0UG9zID0gaTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLS1pOworICAgICAgICAgICAgaWYgKGkgPT0gbngpIHsKKyAgICAgICAgICAgICAgICBjdXJyTGluayA9IG5leHRMaW5rOworICAgICAgICAgICAgICAgIG54ID0gLTI7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGkgIT0gLTEpIHsKKyAgICAgICAgICAgICAgICBjdXJyTGluayA9IGdldExpbmsoZGVzdFtpXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBJZiB3ZSBmb3VuZCBhIGxhbS9hbGVmIHBhaXIgaW4gdGhlIGJ1ZmZlcgorICAgICAgICAvLyBjYWxsIGhhbmRsZUdlbmVyYXRlZFNwYWNlcyB0byByZW1vdmUgdGhlIHNwYWNlcyB0aGF0IHdlcmUgYWRkZWQKKworICAgICAgICBkZXN0U2l6ZSA9IGxlbmd0aDsKKyAgICAgICAgaWYgKGxhbWFsZWZfZm91bmQgfHwgdGFzaGtlZWxfZm91bmQpIHsKKyAgICAgICAgICAgIGRlc3RTaXplID0gaGFuZGxlR2VuZXJhdGVkU3BhY2VzKGRlc3QsIHN0YXJ0LCBsZW5ndGgpOworICAgICAgICB9CisgICAgICAgIGlmIChzZWVuZmFtX2ZvdW5kIHx8IHllaGhhbXphX2ZvdW5kKXsKKyAgICAgICAgICAgIGRlc3RTaXplID0gZXhwYW5kQ29tcG9zaXRDaGFyKGRlc3QsIHN0YXJ0LCBkZXN0U2l6ZSwgbGFtYWxlZl9jb3VudCwgU0hBUEVfTU9ERSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGRlc3RTaXplOworICAgIH0KKworICAgIC8qCisgICAgICogTmFtZSAgICA6IGRlU2hhcGVVbmljb2RlCisgICAgICogRnVuY3Rpb246IENvbnZlcnRzIGFuIEFyYWJpYyBVbmljb2RlIGJ1ZmZlciBpbiBGRXh4IFJhbmdlIGludG8gdW5zaGFwZWQKKyAgICAgKiAgICAgICAgICAgYXJhYmljIFVuaWNvZGUgYnVmZmVyIGluIDA2eHggUmFuZ2UKKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBkZVNoYXBlVW5pY29kZShjaGFyW10gZGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdFNpemUpIHRocm93cyBBcmFiaWNTaGFwaW5nRXhjZXB0aW9uIHsKKworICAgICAgICBpbnQgbGFtYWxlZl9jb3VudCA9IGRlc2hhcGVOb3JtYWxpemUoZGVzdCwgc3RhcnQsIGxlbmd0aCk7CisKKyAgICAgICAgLy8gSWYgdGhlcmUgd2FzIGEgbGFtYWxlZiBpbiB0aGUgYnVmZmVyIGNhbGwgZXhwYW5kTGFtQWxlZgorICAgICAgICBpZiAobGFtYWxlZl9jb3VudCAhPSAwKSB7CisgICAgICAgICAgICAvLyBuZWVkIHRvIGFkanVzdCBkZXN0IHRvIGZpdCBleHBhbmRlZCBidWZmZXIuLi4gISEhCisgICAgICAgICAgICBkZXN0U2l6ZSA9IGV4cGFuZENvbXBvc2l0Q2hhcihkZXN0LCBzdGFydCwgbGVuZ3RoLCBsYW1hbGVmX2NvdW50LERFU0hBUEVfTU9ERSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkZXN0U2l6ZSA9IGxlbmd0aDsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBkZXN0U2l6ZTsKKyAgICB9CisKKyAgICBwcml2YXRlIGludCBpbnRlcm5hbFNoYXBlKGNoYXJbXSBzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc291cmNlU3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc291cmNlTGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcltdIGRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdFN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RTaXplKSB0aHJvd3MgQXJhYmljU2hhcGluZ0V4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKHNvdXJjZUxlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChkZXN0U2l6ZSA9PSAwKSB7CisgICAgICAgICAgICBpZiAoKChvcHRpb25zICYgTEVUVEVSU19NQVNLKSAhPSBMRVRURVJTX05PT1ApICYmCisgICAgICAgICAgICAgICAgKChvcHRpb25zICYgTEFNQUxFRl9NQVNLKSA9PSBMQU1BTEVGX1JFU0laRSkpIHsKKworICAgICAgICAgICAgICAgIHJldHVybiBjYWxjdWxhdGVTaXplKHNvdXJjZSwgc291cmNlU3RhcnQsIHNvdXJjZUxlbmd0aCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBzb3VyY2VMZW5ndGg7IC8vIGJ5IGRlZmluaXRpb24KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIGFsd2F5cyB1c2UgdGVtcCBidWZmZXIKKyAgICAgICAgY2hhcltdIHRlbXAgPSBuZXcgY2hhcltzb3VyY2VMZW5ndGggKiAyXTsgLy8gYWxsIGxhbWFsZWZzIHJlcXVpcmluZyBleHBhbnNpb24KKyAgICAgICAgU3lzdGVtLmFycmF5Y29weShzb3VyY2UsIHNvdXJjZVN0YXJ0LCB0ZW1wLCAwLCBzb3VyY2VMZW5ndGgpOworCisgICAgICAgIGlmIChpc0xvZ2ljYWwpIHsKKyAgICAgICAgICAgIGludmVydEJ1ZmZlcih0ZW1wLCAwLCBzb3VyY2VMZW5ndGgpOworICAgICAgICB9CisKKyAgICAgICAgaW50IG91dHB1dFNpemUgPSBzb3VyY2VMZW5ndGg7CisKKyAgICAgICAgc3dpdGNoIChvcHRpb25zICYgTEVUVEVSU19NQVNLKSB7CisgICAgICAgIGNhc2UgTEVUVEVSU19TSEFQRV9UQVNIS0VFTF9JU09MQVRFRDoKKyAgICAgICAgICAgIG91dHB1dFNpemUgPSBzaGFwZVVuaWNvZGUodGVtcCwgMCwgc291cmNlTGVuZ3RoLCBkZXN0U2l6ZSwgMSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIExFVFRFUlNfU0hBUEU6CisgICAgICAgICAgICBpZiggKChvcHRpb25zJlRBU0hLRUVMX01BU0spPiAwKSAmJgorICAgICAgICAgICAgICAgICgob3B0aW9ucyZUQVNIS0VFTF9NQVNLKSAhPVRBU0hLRUVMX1JFUExBQ0VfQllfVEFUV0VFTCkpIHsKKyAgICAgICAgICAgICAgICAgICAvKiBDYWxsIHRoZSBzaGFwaW5nIGZ1bmN0aW9uIHdpdGggdGFzaGtlZWwgZmxhZyA9PSAyIGZvciByZW1vdmFsIG9mIHRhc2hrZWVsICovCisgICAgICAgICAgICAgICAgb3V0cHV0U2l6ZSA9IHNoYXBlVW5pY29kZSh0ZW1wLCAwLCBzb3VyY2VMZW5ndGgsIGRlc3RTaXplLCAyKTsKKyAgICAgICAgICAgICAgICB9ZWxzZSB7CisgICAgICAgICAgICAgICAgICAgLy9kZWZhdWx0IENhbGwgdGhlIHNoYXBpbmcgZnVuY3Rpb24gd2l0aCB0YXNoa2VlbCBmbGFnID09IDEgKi8KKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0U2l6ZSA9IHNoYXBlVW5pY29kZSh0ZW1wLCAwLCBzb3VyY2VMZW5ndGgsIGRlc3RTaXplLCAwKTsKKworICAgICAgICAgICAgICAgICAgIC8qQWZ0ZXIgc2hhcGluZyB0ZXh0IGNoZWNrIGlmIHVzZXIgd2FudHMgdG8gcmVtb3ZlIHRhc2hrZWVsIGFuZCByZXBsYWNlIGl0IHdpdGggdGF0d2VlbCovCisgICAgICAgICAgICAgICAgICAgaWYoIChvcHRpb25zJlRBU0hLRUVMX01BU0spID09IFRBU0hLRUVMX1JFUExBQ0VfQllfVEFUV0VFTCl7CisgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFNpemUgPSBoYW5kbGVUYXNoa2VlbFdpdGhUYXR3ZWVsKHRlbXAsc291cmNlTGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIExFVFRFUlNfVU5TSEFQRToKKyAgICAgICAgICAgIG91dHB1dFNpemUgPSBkZVNoYXBlVW5pY29kZSh0ZW1wLCAwLCBzb3VyY2VMZW5ndGgsIGRlc3RTaXplKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChvdXRwdXRTaXplID4gZGVzdFNpemUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBBcmFiaWNTaGFwaW5nRXhjZXB0aW9uKCJub3QgZW5vdWdoIHJvb20gZm9yIHJlc3VsdCBkYXRhIik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKG9wdGlvbnMgJiBESUdJVFNfTUFTSykgIT0gRElHSVRTX05PT1ApIHsKKyAgICAgICAgICAgIGNoYXIgZGlnaXRCYXNlID0gJ1x1MDAzMCc7IC8vIEV1cm9wZWFuIGRpZ2l0cworICAgICAgICAgICAgc3dpdGNoIChvcHRpb25zICYgRElHSVRfVFlQRV9NQVNLKSB7CisgICAgICAgICAgICBjYXNlIERJR0lUX1RZUEVfQU46CisgICAgICAgICAgICAgICAgZGlnaXRCYXNlID0gJ1x1MDY2MCc7ICAvLyBBcmFiaWMtSW5kaWMgZGlnaXRzCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgRElHSVRfVFlQRV9BTl9FWFRFTkRFRDoKKyAgICAgICAgICAgICAgICBkaWdpdEJhc2UgPSAnXHUwNmYwJzsgIC8vIEVhc3Rlcm4gQXJhYmljLUluZGljIGRpZ2l0cyAoUGVyc2lhbiBhbmQgVXJkdSkKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3dpdGNoIChvcHRpb25zICYgRElHSVRTX01BU0spIHsKKyAgICAgICAgICAgIGNhc2UgRElHSVRTX0VOMkFOOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGRpZ2l0RGVsdGEgPSBkaWdpdEJhc2UgLSAnXHUwMDMwJzsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBvdXRwdXRTaXplOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgY2ggPSB0ZW1wW2ldOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoIDw9ICdcdTAwMzknICYmIGNoID49ICdcdTAwMzAnKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcFtpXSArPSBkaWdpdERlbHRhOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIERJR0lUU19BTjJFTjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNoYXIgZGlnaXRUb3AgPSAoY2hhcikoZGlnaXRCYXNlICsgOSk7CisgICAgICAgICAgICAgICAgICAgIGludCBkaWdpdERlbHRhID0gJ1x1MDAzMCcgLSBkaWdpdEJhc2U7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgb3V0cHV0U2l6ZTsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGNoID0gdGVtcFtpXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaCA8PSBkaWdpdFRvcCAmJiBjaCA+PSBkaWdpdEJhc2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wW2ldICs9IGRpZ2l0RGVsdGE7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgRElHSVRTX0VOMkFOX0lOSVRfTFI6CisgICAgICAgICAgICAgICAgc2hhcGVUb0FyYWJpY0RpZ2l0c1dpdGhDb250ZXh0KHRlbXAsIDAsIG91dHB1dFNpemUsIGRpZ2l0QmFzZSwgZmFsc2UpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIERJR0lUU19FTjJBTl9JTklUX0FMOgorICAgICAgICAgICAgICAgIHNoYXBlVG9BcmFiaWNEaWdpdHNXaXRoQ29udGV4dCh0ZW1wLCAwLCBvdXRwdXRTaXplLCBkaWdpdEJhc2UsIHRydWUpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGlzTG9naWNhbCkgeworICAgICAgICAgICAgaW52ZXJ0QnVmZmVyKHRlbXAsIDAsIG91dHB1dFNpemUpOworICAgICAgICB9CisKKyAgICAgICAgU3lzdGVtLmFycmF5Y29weSh0ZW1wLCAwLCBkZXN0LCBkZXN0U3RhcnQsIG91dHB1dFNpemUpOworCisgICAgICAgIHJldHVybiBvdXRwdXRTaXplOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEFyYWJpY1NoYXBpbmdFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHsKKyAgICAgICAgQXJhYmljU2hhcGluZ0V4Y2VwdGlvbihTdHJpbmcgbXNnKSB7CisgICAgICAgICAgICBzdXBlcihtc2cpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvaWN1NGovbGljZW5zZS5odG1sIGIvaWN1NGovbGljZW5zZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5MDVkZGYKLS0tIC9kZXYvbnVsbAorKysgYi9pY3U0ai9saWNlbnNlLmh0bWwKQEAgLTAsMCArMSw1MSBAQAorPGh0bWw+CisKKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiPjwvbWV0YT4KKzx0aXRsZT5JQ1UgTGljZW5zZSAtIElDVSAxLjguMSBhbmQgbGF0ZXI8L3RpdGxlPgorPC9oZWFkPgorCis8Ym9keSBCR0NPTE9SPSIjZmZmZmZmIj4KKzxoMj5JQ1UgTGljZW5zZSAtIElDVSAxLjguMSBhbmQgbGF0ZXI8L2gyPgorCis8cD5DT1BZUklHSFQgQU5EIFBFUk1JU1NJT04gTk9USUNFPC9wPgorCis8cD4KK0NvcHlyaWdodCAoYykgMTk5NS0yMDA2IEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycG9yYXRpb24gYW5kIG90aGVycworPC9wPgorPHA+CitBbGwgcmlnaHRzIHJlc2VydmVkLgorPC9wPgorPHA+CitQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CitvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKK3RvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KK3RoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBhbmQvb3Igc2VsbAorY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zCit0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCitjb3B5cmlnaHQgbm90aWNlKHMpIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzCitvZiB0aGUgU29mdHdhcmUgYW5kIHRoYXQgYm90aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZShzKSBhbmQgdGhpcworcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4KKzwvcD4KKzxwPgorVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IgSU1QTElFRCwgCitJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQQorUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQgT0YgVEhJUkQgUEFSVFkgUklHSFRTLiBJTiBOTyBFVkVOVCBTSEFMTAorVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgSE9MREVSUyBJTkNMVURFRCBJTiBUSElTIE5PVElDRSBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwKK09SIEFOWSBTUEVDSUFMIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUywgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUgorUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsCitORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQorVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCis8L3A+Cis8cD4KK0V4Y2VwdCBhcyBjb250YWluZWQgaW4gdGhpcyBub3RpY2UsIHRoZSBuYW1lIG9mIGEgY29weXJpZ2h0IGhvbGRlciBzaGFsbCBub3QgYmUKK3VzZWQgaW4gYWR2ZXJ0aXNpbmcgb3Igb3RoZXJ3aXNlIHRvIHByb21vdGUgdGhlIHNhbGUsIHVzZSBvciBvdGhlciBkZWFsaW5ncyBpbgordGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlci4KKzwvcD4KKworPGhyPgorPHA+PHNtYWxsPgorQWxsIHRyYWRlbWFya3MgYW5kIHJlZ2lzdGVyZWQgdHJhZGVtYXJrcyBtZW50aW9uZWQgaGVyZWluIGFyZSB0aGUgcHJvcGVydHkgb2YgdGhlaXIgcmVzcGVjdGl2ZSBvd25lcnMuCis8L3NtYWxsPjwvcD4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL2NvcmUvam5pL0N1cnNvcldpbmRvdy5oIGIvaW5jbHVkZS9iaW5kZXIvQ3Vyc29yV2luZG93LmgKc2ltaWxhcml0eSBpbmRleCA5NiUKcmVuYW1lIGZyb20gY29yZS9qbmkvQ3Vyc29yV2luZG93LmgKcmVuYW1lIHRvIGluY2x1ZGUvYmluZGVyL0N1cnNvcldpbmRvdy5oCmluZGV4IDNmY2I1NjAuLjRmYmZmMmEgMTAwNjQ0Ci0tLSBhL2NvcmUvam5pL0N1cnNvcldpbmRvdy5oCisrKyBiL2luY2x1ZGUvYmluZGVyL0N1cnNvcldpbmRvdy5oCkBAIC0xLDE2ICsxLDE2IEBACiAvKgogICogQ29weXJpZ2h0IChDKSAyMDA2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKICAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCi0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKQEAgLTI0LDggKzI0LDYgQEAKICNpbmNsdWRlIDxiaW5kZXIvSU1lbW9yeS5oPgogI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KIAotI2luY2x1ZGUgPGpuaS5oPgotCiAjZGVmaW5lIERFRkFVTFRfV0lORE9XX1NJWkUgNDA5NgogI2RlZmluZSBNQVhfV0lORE9XX1NJWkUgKDEwMjQgKiAxMDI0KQogI2RlZmluZSBXSU5ET1dfQUxMT0NBVElPTl9TSVpFIDQwOTYKQEAgLTgyLDExICs4MCwxMSBAQAogICAgIH0gZGF0YTsKIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgZmllbGRfc2xvdF90OwogCisjZGVmaW5lIEZJRUxEX1RZUEVfTlVMTCAwCiAjZGVmaW5lIEZJRUxEX1RZUEVfSU5URUdFUiAxCiAjZGVmaW5lIEZJRUxEX1RZUEVfRkxPQVQgMgogI2RlZmluZSBGSUVMRF9UWVBFX1NUUklORyAzCiAjZGVmaW5lIEZJRUxEX1RZUEVfQkxPQiA0Ci0jZGVmaW5lIEZJRUxEX1RZUEVfTlVMTCA1CiAKIC8qKgogICogVGhpcyBjbGFzcyBzdG9yZXMgYSBzZXQgb2Ygcm93cyBmcm9tIGEgZGF0YWJhc2UgaW4gYSBidWZmZXIuIFRoZSBiZWdpbmluZyBvZiB0aGUKQEAgLTE3Miw3ICsxNzAsNyBAQAogICAgIHJvd19zbG90X3QgKiAgICAgICAgYWxsb2NSb3dTbG90KCk7CiAKICAgICByb3dfc2xvdF90ICogICAgICAgIGdldFJvd1Nsb3QoaW50IHJvdyk7Ci0gICAgCisKICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgICAgICAgICAgICAgICogcmV0dXJuIE5VTEwgaWYgRmFpbGVkIHRvIGZpbmQgcm93U2xvdCBvcgogICAgICAgICAgICAgICAgICAgICAgICAgICogSW52YWxpZCByb3dTbG90CmRpZmYgLS1naXQgYS9saWJzL2F1ZGlvZmxpbmdlci9BdWRpb1BvbGljeU1hbmFnZXJCYXNlLmNwcCBiL2xpYnMvYXVkaW9mbGluZ2VyL0F1ZGlvUG9saWN5TWFuYWdlckJhc2UuY3BwCmluZGV4IDM4MWE5NTguLjU0OWQ2NjEgMTAwNjQ0Ci0tLSBhL2xpYnMvYXVkaW9mbGluZ2VyL0F1ZGlvUG9saWN5TWFuYWdlckJhc2UuY3BwCisrKyBiL2xpYnMvYXVkaW9mbGluZ2VyL0F1ZGlvUG9saWN5TWFuYWdlckJhc2UuY3BwCkBAIC05MDIsNyArOTAyLDggQEAKICNpZmRlZiBBVURJT19QT0xJQ1lfVEVTVAogICAgIFRocmVhZChmYWxzZSksCiAjZW5kaWYgLy9BVURJT19QT0xJQ1lfVEVTVAotICAgIG1QaG9uZVN0YXRlKEF1ZGlvU3lzdGVtOjpNT0RFX05PUk1BTCksIG1SaW5nZXJNb2RlKDApLCBtTXVzaWNTdG9wVGltZSgwKSwgbUxpbWl0UmluZ3RvbmVWb2x1bWUoZmFsc2UpCisgICAgbVBob25lU3RhdGUoQXVkaW9TeXN0ZW06Ok1PREVfTk9STUFMKSwgbVJpbmdlck1vZGUoMCksIG1NdXNpY1N0b3BUaW1lKDApLCBtTGltaXRSaW5ndG9uZVZvbHVtZShmYWxzZSksCisgICAgbUxhc3RWb2ljZVZvbHVtZSgtMS4wZikKIHsKICAgICBtcENsaWVudEludGVyZmFjZSA9IGNsaWVudEludGVyZmFjZTsKIApAQCAtMTcxMywyOSArMTcxNCwzOCBAQAogICAgIH0KIAogICAgIGZsb2F0IHZvbHVtZSA9IGNvbXB1dGVWb2x1bWUoc3RyZWFtLCBpbmRleCwgb3V0cHV0LCBkZXZpY2UpOwotICAgIC8vIGRvIG5vdCBzZXQgdm9sdW1lIGlmIHRoZSBmbG9hdCB2YWx1ZSBkaWQgbm90IGNoYW5nZQotICAgIGlmICh2b2x1bWUgIT0gbU91dHB1dHMudmFsdWVGb3Iob3V0cHV0KS0+bUN1clZvbHVtZVtzdHJlYW1dIHx8IGZvcmNlKSB7CisgICAgLy8gV2UgYWN0dWFsbHkgY2hhbmdlIHRoZSB2b2x1bWUgaWY6CisgICAgLy8gLSB0aGUgZmxvYXQgdmFsdWUgcmV0dXJuZWQgYnkgY29tcHV0ZVZvbHVtZSgpIGNoYW5nZWQKKyAgICAvLyAtIHRoZSBmb3JjZSBmbGFnIGlzIHNldAorICAgIGlmICh2b2x1bWUgIT0gbU91dHB1dHMudmFsdWVGb3Iob3V0cHV0KS0+bUN1clZvbHVtZVtzdHJlYW1dIHx8CisgICAgICAgICAgICBmb3JjZSkgewogICAgICAgICBtT3V0cHV0cy52YWx1ZUZvcihvdXRwdXQpLT5tQ3VyVm9sdW1lW3N0cmVhbV0gPSB2b2x1bWU7CiAgICAgICAgIExPR1YoInNldFN0cmVhbVZvbHVtZSgpIGZvciBvdXRwdXQgJWQgc3RyZWFtICVkLCB2b2x1bWUgJWYsIGRlbGF5ICVkIiwgb3V0cHV0LCBzdHJlYW0sIHZvbHVtZSwgZGVsYXlNcyk7CiAgICAgICAgIGlmIChzdHJlYW0gPT0gQXVkaW9TeXN0ZW06OlZPSUNFX0NBTEwgfHwKICAgICAgICAgICAgIHN0cmVhbSA9PSBBdWRpb1N5c3RlbTo6RFRNRiB8fAogICAgICAgICAgICAgc3RyZWFtID09IEF1ZGlvU3lzdGVtOjpCTFVFVE9PVEhfU0NPKSB7Ci0gICAgICAgICAgICBmbG9hdCB2b2ljZVZvbHVtZSA9IC0xLjA7CiAgICAgICAgICAgICAvLyBvZmZzZXQgdmFsdWUgdG8gcmVmbGVjdCBhY3R1YWwgaGFyZHdhcmUgdm9sdW1lIHRoYXQgbmV2ZXIgcmVhY2hlcyAwCiAgICAgICAgICAgICAvLyAxJSBjb3JyZXNwb25kcyByb3VnaGx5IHRvIGZpcnN0IHN0ZXAgaW4gVk9JQ0VfQ0FMTCBzdHJlYW0gdm9sdW1lIHNldHRpbmcgKHNlZSBBdWRpb1NlcnZpY2UuamF2YSkKICAgICAgICAgICAgIHZvbHVtZSA9IDAuMDEgKyAwLjk5ICogdm9sdW1lOwotICAgICAgICAgICAgaWYgKHN0cmVhbSA9PSBBdWRpb1N5c3RlbTo6Vk9JQ0VfQ0FMTCkgewotICAgICAgICAgICAgICAgIHZvaWNlVm9sdW1lID0gKGZsb2F0KWluZGV4LyhmbG9hdCltU3RyZWFtc1tzdHJlYW1dLm1JbmRleE1heDsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyZWFtID09IEF1ZGlvU3lzdGVtOjpCTFVFVE9PVEhfU0NPKSB7Ci0gICAgICAgICAgICAgICAgdm9pY2VWb2x1bWUgPSAxLjA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAodm9pY2VWb2x1bWUgPj0gMCAmJiBvdXRwdXQgPT0gbUhhcmR3YXJlT3V0cHV0KSB7Ci0gICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFZvaWNlVm9sdW1lKHZvaWNlVm9sdW1lLCBkZWxheU1zKTsKLSAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBtcENsaWVudEludGVyZmFjZS0+c2V0U3RyZWFtVm9sdW1lKChBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGUpc3RyZWFtLCB2b2x1bWUsIG91dHB1dCwgZGVsYXlNcyk7CiAgICAgfQogCisgICAgaWYgKHN0cmVhbSA9PSBBdWRpb1N5c3RlbTo6Vk9JQ0VfQ0FMTCB8fAorICAgICAgICBzdHJlYW0gPT0gQXVkaW9TeXN0ZW06OkJMVUVUT09USF9TQ08pIHsKKyAgICAgICAgZmxvYXQgdm9pY2VWb2x1bWU7CisgICAgICAgIC8vIEZvcmNlIHZvaWNlIHZvbHVtZSB0byBtYXggZm9yIGJsdWV0b290aCBTQ08gYXMgdm9sdW1lIGlzIG1hbmFnZWQgYnkgdGhlIGhlYWRzZXQKKyAgICAgICAgaWYgKHN0cmVhbSA9PSBBdWRpb1N5c3RlbTo6Vk9JQ0VfQ0FMTCkgeworICAgICAgICAgICAgdm9pY2VWb2x1bWUgPSAoZmxvYXQpaW5kZXgvKGZsb2F0KW1TdHJlYW1zW3N0cmVhbV0ubUluZGV4TWF4OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdm9pY2VWb2x1bWUgPSAxLjA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHZvaWNlVm9sdW1lICE9IG1MYXN0Vm9pY2VWb2x1bWUgJiYgb3V0cHV0ID09IG1IYXJkd2FyZU91dHB1dCkgeworICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFZvaWNlVm9sdW1lKHZvaWNlVm9sdW1lLCBkZWxheU1zKTsKKyAgICAgICAgICAgIG1MYXN0Vm9pY2VWb2x1bWUgPSB2b2ljZVZvbHVtZTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIApkaWZmIC0tZ2l0IGEvbGlicy9iaW5kZXIvQW5kcm9pZC5tayBiL2xpYnMvYmluZGVyL0FuZHJvaWQubWsKaW5kZXggMTNkYzUwMC4uZjlkOWYyNSAxMDA2NDQKLS0tIGEvbGlicy9iaW5kZXIvQW5kcm9pZC5taworKysgYi9saWJzL2JpbmRlci9BbmRyb2lkLm1rCkBAIC0xNiw2ICsxNiw3IEBACiBzb3VyY2VzIDo9IFwKICAgICBCaW5kZXIuY3BwIFwKICAgICBCcEJpbmRlci5jcHAgXAorICAgIEN1cnNvcldpbmRvdy5jcHAgXAogICAgIElJbnRlcmZhY2UuY3BwIFwKICAgICBJTWVtb3J5LmNwcCBcCiAgICAgSVBDVGhyZWFkU3RhdGUuY3BwIFwKZGlmZiAtLWdpdCBhL2NvcmUvam5pL0N1cnNvcldpbmRvdy5jcHAgYi9saWJzL2JpbmRlci9DdXJzb3JXaW5kb3cuY3BwCnNpbWlsYXJpdHkgaW5kZXggOTklCnJlbmFtZSBmcm9tIGNvcmUvam5pL0N1cnNvcldpbmRvdy5jcHAKcmVuYW1lIHRvIGxpYnMvYmluZGVyL0N1cnNvcldpbmRvdy5jcHAKaW5kZXggNzg3NzkyMS4uMjBiMjdjOSAxMDA2NDQKLS0tIGEvY29yZS9qbmkvQ3Vyc29yV2luZG93LmNwcAorKysgYi9saWJzL2JpbmRlci9DdXJzb3JXaW5kb3cuY3BwCkBAIC0xOCw2ICsxOCw3IEBACiAjZGVmaW5lIExPR19UQUcgIkN1cnNvcldpbmRvdyIKIAogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPGJpbmRlci9DdXJzb3JXaW5kb3cuaD4KICNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5SGVhcEJhc2UuaD4KICNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5QmFzZS5oPgogCkBAIC0yNSwxMiArMjYsNiBAQAogI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgogCi0jaW5jbHVkZSA8am5pLmg+Ci0jaW5jbHVkZSA8Sk5JSGVscC5oPgotCi0jaW5jbHVkZSAiQ3Vyc29yV2luZG93LmgiCi0KLQogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBDdXJzb3JXaW5kb3c6OkN1cnNvcldpbmRvdyhzaXplX3QgbWF4U2l6ZSkgOgpkaWZmIC0tZ2l0IGEvbGlicy9od3VpL0FuZHJvaWQubWsgYi9saWJzL2h3dWkvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDc2ODExCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9od3VpL0FuZHJvaWQubWsKQEAgLTAsMCArMSwyMyBAQAorTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfU1JDX0ZJTEVTOj0gXAorCU1hdHJpeC5jcHAgXAorCU9wZW5HTFJlbmRlcmVyLmNwcCBcCisJUHJvZ3JhbS5jcHAKKworTE9DQUxfQ19JTkNMVURFUyArPSBcCisJJChKTklfSF9JTkNMVURFKSBcCisJJChMT0NBTF9QQVRIKS8uLi8uLi9pbmNsdWRlL3V0aWxzIFwKKwlleHRlcm5hbC9za2lhL2luY2x1ZGUvY29yZSBcCisJZXh0ZXJuYWwvc2tpYS9pbmNsdWRlL2VmZmVjdHMgXAorCWV4dGVybmFsL3NraWEvaW5jbHVkZS9pbWFnZXMgXAorCWV4dGVybmFsL3NraWEvc3JjL3BvcnRzIFwKKwlleHRlcm5hbC9za2lhL2luY2x1ZGUvdXRpbHMKKworTE9DQUxfTU9EVUxFX0NMQVNTIDo9IFNIQVJFRF9MSUJSQVJJRVMKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGliY3V0aWxzIGxpYnV0aWxzIGxpYkdMRVN2MiBsaWJza2lhCitMT0NBTF9NT0RVTEU6PSBsaWJod3VpCitMT0NBTF9QUkVMSU5LX01PRFVMRSA6PSBmYWxzZQorCitpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9saWJzL2h3dWkvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMiBiL2xpYnMvaHd1aS9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2h3dWkvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpkaWZmIC0tZ2l0IGEvbGlicy9od3VpL01hdHJpeC5jcHAgYi9saWJzL2h3dWkvTWF0cml4LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzdkM2JiCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9od3VpL01hdHJpeC5jcHAKQEAgLTAsMCArMSwyMTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIk9wZW5HTFJlbmRlcmVyIgorCisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxTa01hdHJpeC5oPgorCisjaW5jbHVkZSAiTWF0cml4LmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSB1aXJlbmRlcmVyIHsKKwordm9pZCBNYXRyaXg0Ojpsb2FkSWRlbnRpdHkoKSB7CisgICAgZGF0YVswXSAgPSAxLjBmOworICAgIGRhdGFbMV0gID0gMC4wZjsKKyAgICBkYXRhWzJdICA9IDAuMGY7CisgICAgZGF0YVszXSAgPSAwLjBmOworCisgICAgZGF0YVs0XSAgPSAwLjBmOworICAgIGRhdGFbNV0gID0gMS4wZjsKKyAgICBkYXRhWzZdICA9IDAuMGY7CisgICAgZGF0YVs3XSAgPSAwLjBmOworCisgICAgZGF0YVs4XSAgPSAwLjBmOworICAgIGRhdGFbOV0gID0gMC4wZjsKKyAgICBkYXRhWzEwXSA9IDEuMGY7CisgICAgZGF0YVsxMV0gPSAwLjBmOworCisgICAgZGF0YVsxMl0gPSAwLjBmOworICAgIGRhdGFbMTNdID0gMC4wZjsKKyAgICBkYXRhWzE0XSA9IDAuMGY7CisgICAgZGF0YVsxNV0gPSAxLjBmOworfQorCit2b2lkIE1hdHJpeDQ6OmxvYWQoY29uc3QgZmxvYXQqIHYpIHsKKyAgICBtZW1jcHkoZGF0YSwgdiwgc2l6ZW9mKGRhdGEpKTsKK30KKwordm9pZCBNYXRyaXg0Ojpsb2FkKGNvbnN0IE1hdHJpeDQmIHYpIHsKKyAgICBtZW1jcHkoZGF0YSwgdi5kYXRhLCBzaXplb2YoZGF0YSkpOworfQorCit2b2lkIE1hdHJpeDQ6OmxvYWQoY29uc3QgU2tNYXRyaXgmIHYpIHsKKyAgICBtZW1zZXQoZGF0YSwgMCwgc2l6ZW9mKGRhdGEpKTsKKworICAgIGRhdGFbMF0gID0gdltTa01hdHJpeDo6a01TY2FsZVhdOworICAgIGRhdGFbNF0gID0gdltTa01hdHJpeDo6a01Ta2V3WF07CisgICAgZGF0YVsxMl0gPSB2W1NrTWF0cml4OjprTVRyYW5zWF07CisKKyAgICBkYXRhWzFdICA9IHZbU2tNYXRyaXg6OmtNU2tld1ldOworICAgIGRhdGFbNV0gID0gdltTa01hdHJpeDo6a01TY2FsZVldOworICAgIGRhdGFbMTNdID0gdltTa01hdHJpeDo6a01UcmFuc1ldOworCisgICAgZGF0YVszXSAgPSB2W1NrTWF0cml4OjprTVBlcnNwMF07CisgICAgZGF0YVs3XSAgPSB2W1NrTWF0cml4OjprTVBlcnNwMV07CisgICAgZGF0YVsxNV0gPSB2W1NrTWF0cml4OjprTVBlcnNwMl07CisKKyAgICBkYXRhWzEwXSA9IDEuMGY7Cit9CisKK3ZvaWQgTWF0cml4NDo6Y29weVRvKFNrTWF0cml4JiB2KSBjb25zdCB7CisgICAgdi5yZXNldCgpOworCisgICAgdi5zZXQoU2tNYXRyaXg6OmtNU2NhbGVYLCBkYXRhWzBdKTsKKyAgICB2LnNldChTa01hdHJpeDo6a01Ta2V3WCwgIGRhdGFbNF0pOworICAgIHYuc2V0KFNrTWF0cml4OjprTVRyYW5zWCwgZGF0YVsxMl0pOworCisgICAgdi5zZXQoU2tNYXRyaXg6OmtNU2tld1ksICBkYXRhWzFdKTsKKyAgICB2LnNldChTa01hdHJpeDo6a01TY2FsZVksIGRhdGFbNV0pOworICAgIHYuc2V0KFNrTWF0cml4OjprTVRyYW5zWSwgZGF0YVsxM10pOworCisgICAgdi5zZXQoU2tNYXRyaXg6OmtNUGVyc3AwLCBkYXRhWzNdKTsKKyAgICB2LnNldChTa01hdHJpeDo6a01QZXJzcDEsIGRhdGFbN10pOworICAgIHYuc2V0KFNrTWF0cml4OjprTVBlcnNwMiwgZGF0YVsxNV0pOworfQorCit2b2lkIE1hdHJpeDQ6OmNvcHlUbyhmbG9hdCogdikgY29uc3QgeworICAgIG1lbWNweSh2LCBkYXRhLCBzaXplb2YoZGF0YSkpOworfQorCitmbG9hdCBNYXRyaXg0OjpnZXRUcmFuc2xhdGVYKCkgeworICAgIHJldHVybiBkYXRhWzEyXTsKK30KKworZmxvYXQgTWF0cml4NDo6Z2V0VHJhbnNsYXRlWSgpIHsKKyAgICByZXR1cm4gZGF0YVsxM107Cit9CisKK3ZvaWQgTWF0cml4NDo6bG9hZFRyYW5zbGF0ZShmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KSB7CisgICAgbG9hZElkZW50aXR5KCk7CisgICAgZGF0YVsxMl0gPSB4OworICAgIGRhdGFbMTNdID0geTsKKyAgICBkYXRhWzE0XSA9IHo7Cit9CisKK3ZvaWQgTWF0cml4NDo6bG9hZFNjYWxlKGZsb2F0IHN4LCBmbG9hdCBzeSwgZmxvYXQgc3opIHsKKyAgICBsb2FkSWRlbnRpdHkoKTsKKyAgICBkYXRhWzBdICA9IHN4OworICAgIGRhdGFbNV0gID0gc3k7CisgICAgZGF0YVsxMF0gPSBzejsKK30KKwordm9pZCBNYXRyaXg0Ojpsb2FkUm90YXRlKGZsb2F0IGFuZ2xlLCBmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KSB7CisgICAgZGF0YVszXSAgPSAwLjBmOworICAgIGRhdGFbN10gID0gMC4wZjsKKyAgICBkYXRhWzExXSA9IDAuMGY7CisgICAgZGF0YVsxMl0gPSAwLjBmOworICAgIGRhdGFbMTNdID0gMC4wZjsKKyAgICBkYXRhWzE0XSA9IDAuMGY7CisgICAgZGF0YVsxNV0gPSAxLjBmOworCisgICAgYW5nbGUgKj0gZmxvYXQoTV9QSSAvIDE4MC4wZik7CisgICAgZmxvYXQgYyA9IGNvc2YoYW5nbGUpOworICAgIGZsb2F0IHMgPSBzaW5mKGFuZ2xlKTsKKworICAgIGNvbnN0IGZsb2F0IGxlbmd0aCA9IHNxcnRmKHggKiB4ICsgeSAqIHkgKyB6ICogeik7CisgICAgY29uc3QgZmxvYXQgbmMgPSAxLjBmIC0gYzsKKyAgICBjb25zdCBmbG9hdCB4eSA9IHggKiB5OworICAgIGNvbnN0IGZsb2F0IHl6ID0geSAqIHo7CisgICAgY29uc3QgZmxvYXQgenggPSB6ICogeDsKKyAgICBjb25zdCBmbG9hdCB4cyA9IHggKiBzOworICAgIGNvbnN0IGZsb2F0IHlzID0geSAqIHM7CisgICAgY29uc3QgZmxvYXQgenMgPSB6ICogczsKKworICAgIGRhdGFbMF0gID0geCAqIHggKiBuYyArICBjOworICAgIGRhdGFbNF0gID0gICAgeHkgKiBuYyAtIHpzOworICAgIGRhdGFbOF0gID0gICAgenggKiBuYyArIHlzOworICAgIGRhdGFbMV0gID0gICAgeHkgKiBuYyArIHpzOworICAgIGRhdGFbNV0gID0geSAqIHkgKiBuYyArICBjOworICAgIGRhdGFbOV0gID0gICAgeXogKiBuYyAtIHhzOworICAgIGRhdGFbMl0gID0gICAgenggKiBuYyAtIHlzOworICAgIGRhdGFbNl0gID0gICAgeXogKiBuYyArIHhzOworICAgIGRhdGFbMTBdID0geiAqIHogKiBuYyArICBjOworfQorCit2b2lkIE1hdHJpeDQ6OmxvYWRNdWx0aXBseShjb25zdCBNYXRyaXg0JiB1LCBjb25zdCBNYXRyaXg0JiB2KSB7CisgICAgZm9yIChpbnQgaSA9IDAgOyBpIDwgNCA7IGkrKykgeworICAgICAgICBmbG9hdCB4ID0gMDsKKyAgICAgICAgZmxvYXQgeSA9IDA7CisgICAgICAgIGZsb2F0IHogPSAwOworICAgICAgICBmbG9hdCB3ID0gMDsKKworICAgICAgICBmb3IgKGludCBqID0gMCA7IGogPCA0IDsgaisrKSB7CisgICAgICAgICAgICBjb25zdCBmbG9hdCBlID0gdi5nZXQoaSwgaik7CisgICAgICAgICAgICB4ICs9IHUuZ2V0KGosIDApICogZTsKKyAgICAgICAgICAgIHkgKz0gdS5nZXQoaiwgMSkgKiBlOworICAgICAgICAgICAgeiArPSB1LmdldChqLCAyKSAqIGU7CisgICAgICAgICAgICB3ICs9IHUuZ2V0KGosIDMpICogZTsKKyAgICAgICAgfQorCisgICAgICAgIHNldChpLCAwLCB4KTsKKyAgICAgICAgc2V0KGksIDEsIHkpOworICAgICAgICBzZXQoaSwgMiwgeik7CisgICAgICAgIHNldChpLCAzLCB3KTsKKyAgICB9Cit9CisKK3ZvaWQgTWF0cml4NDo6bG9hZE9ydGhvKGZsb2F0IGxlZnQsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20sIGZsb2F0IHRvcCwgZmxvYXQgbmVhciwgZmxvYXQgZmFyKSB7CisgICAgbG9hZElkZW50aXR5KCk7CisgICAgZGF0YVswXSAgPSAyLjBmIC8gKHJpZ2h0IC0gbGVmdCk7CisgICAgZGF0YVs1XSAgPSAyLjBmIC8gKHRvcCAtIGJvdHRvbSk7CisgICAgZGF0YVsxMF0gPSAtMi4wZiAvIChmYXIgLSBuZWFyKTsKKyAgICBkYXRhWzEyXSA9IC0ocmlnaHQgKyBsZWZ0KSAvIChyaWdodCAtIGxlZnQpOworICAgIGRhdGFbMTNdID0gLSh0b3AgKyBib3R0b20pIC8gKHRvcCAtIGJvdHRvbSk7CisgICAgZGF0YVsxNF0gPSAtKGZhciArIG5lYXIpIC8gKGZhciAtIG5lYXIpOworfQorCisjZGVmaW5lIE1VTF9BRERfU1RPUkUoYSwgYiwgYykgYSA9IChhKSAqIChiKSArIChjKQorCit2b2lkIE1hdHJpeDQ6Om1hcFJlY3QoUmVjdCYgcikgY29uc3QgeworICAgIGNvbnN0IGZsb2F0IHN4ID0gZGF0YVswXTsKKyAgICBjb25zdCBmbG9hdCBzeSA9IGRhdGFbNV07CisKKyAgICBjb25zdCBmbG9hdCB0eCA9IGRhdGFbMTJdOworICAgIGNvbnN0IGZsb2F0IHR5ID0gZGF0YVsxM107CisKKyAgICBNVUxfQUREX1NUT1JFKHIubGVmdCwgc3gsIHR4KTsKKyAgICBNVUxfQUREX1NUT1JFKHIucmlnaHQsIHN4LCB0eCk7CisgICAgTVVMX0FERF9TVE9SRShyLnRvcCwgc3ksIHR5KTsKKyAgICBNVUxfQUREX1NUT1JFKHIuYm90dG9tLCBzeSwgdHkpOworfQorCit2b2lkIE1hdHJpeDQ6OmR1bXAoKSBjb25zdCB7CisgICAgTE9HRCgiTWF0cml4NFsiKTsKKyAgICBMT0dEKCIgICVmICVmICVmICVmIiwgZGF0YVswXSwgZGF0YVs0XSwgZGF0YVsgOF0sIGRhdGFbMTJdKTsKKyAgICBMT0dEKCIgICVmICVmICVmICVmIiwgZGF0YVsxXSwgZGF0YVs1XSwgZGF0YVsgOV0sIGRhdGFbMTNdKTsKKyAgICBMT0dEKCIgICVmICVmICVmICVmIiwgZGF0YVsyXSwgZGF0YVs2XSwgZGF0YVsxMF0sIGRhdGFbMTRdKTsKKyAgICBMT0dEKCIgICVmICVmICVmICVmIiwgZGF0YVszXSwgZGF0YVs3XSwgZGF0YVsxMV0sIGRhdGFbMTVdKTsKKyAgICBMT0dEKCJdIik7Cit9CisKK307IC8vIG5hbWVzcGFjZSB1aXJlbmRlcmVyCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbGlicy9od3VpL01hdHJpeC5oIGIvbGlicy9od3VpL01hdHJpeC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwYzgwZmEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2h3dWkvTWF0cml4LmgKQEAgLTAsMCArMSwxMTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfVUlfTUFUUklYX0gKKyNkZWZpbmUgQU5EUk9JRF9VSV9NQVRSSVhfSAorCisjaW5jbHVkZSA8U2tNYXRyaXguaD4KKworI2luY2x1ZGUgIlJlY3QuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHVpcmVuZGVyZXIgeworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDbGFzc2VzCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2NsYXNzIE1hdHJpeDQgeworcHVibGljOgorICAgIGZsb2F0IGRhdGFbMTZdOworCisgICAgTWF0cml4NCgpIHsKKyAgICAgICAgbG9hZElkZW50aXR5KCk7CisgICAgfQorCisgICAgTWF0cml4NChjb25zdCBmbG9hdCogdikgeworICAgICAgICBsb2FkKHYpOworICAgIH0KKworICAgIE1hdHJpeDQoY29uc3QgTWF0cml4NCYgdikgeworICAgICAgICBsb2FkKHYpOworICAgIH0KKworICAgIE1hdHJpeDQoY29uc3QgU2tNYXRyaXgmIHYpIHsKKyAgICAgICAgbG9hZCh2KTsKKyAgICB9CisKKyAgICB2b2lkIGxvYWRJZGVudGl0eSgpOworCisgICAgdm9pZCBsb2FkKGNvbnN0IGZsb2F0KiB2KTsKKyAgICB2b2lkIGxvYWQoY29uc3QgTWF0cml4NCYgdik7CisgICAgdm9pZCBsb2FkKGNvbnN0IFNrTWF0cml4JiB2KTsKKworICAgIHZvaWQgbG9hZFRyYW5zbGF0ZShmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KTsKKyAgICB2b2lkIGxvYWRTY2FsZShmbG9hdCBzeCwgZmxvYXQgc3ksIGZsb2F0IHN6KTsKKyAgICB2b2lkIGxvYWRSb3RhdGUoZmxvYXQgYW5nbGUsIGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHopOworICAgIHZvaWQgbG9hZE11bHRpcGx5KGNvbnN0IE1hdHJpeDQmIHUsIGNvbnN0IE1hdHJpeDQmIHYpOworCisgICAgdm9pZCBsb2FkT3J0aG8oZmxvYXQgbGVmdCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSwgZmxvYXQgdG9wLCBmbG9hdCBuZWFyLCBmbG9hdCBmYXIpOworCisgICAgdm9pZCBtdWx0aXBseShjb25zdCBNYXRyaXg0JiB2KSB7CisgICAgICAgIE1hdHJpeDQgdTsKKyAgICAgICAgdS5sb2FkTXVsdGlwbHkoKnRoaXMsIHYpOworICAgICAgICBsb2FkKHUpOworICAgIH0KKworICAgIHZvaWQgdHJhbnNsYXRlKGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHopIHsKKyAgICAgICAgTWF0cml4NCB1OworICAgICAgICB1LmxvYWRUcmFuc2xhdGUoeCwgeSwgeik7CisgICAgICAgIG11bHRpcGx5KHUpOworICAgIH0KKworICAgIHZvaWQgc2NhbGUoZmxvYXQgc3gsIGZsb2F0IHN5LCBmbG9hdCBzeikgeworICAgICAgICBNYXRyaXg0IHU7CisgICAgICAgIHUubG9hZFNjYWxlKHN4LCBzeSwgc3opOworICAgICAgICBtdWx0aXBseSh1KTsKKyAgICB9CisKKyAgICB2b2lkIHJvdGF0ZShmbG9hdCBhbmdsZSwgZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeikgeworICAgICAgICBNYXRyaXg0IHU7CisgICAgICAgIHUubG9hZFJvdGF0ZShhbmdsZSwgeCwgeSwgeik7CisgICAgICAgIG11bHRpcGx5KHUpOworICAgIH0KKworICAgIHZvaWQgY29weVRvKGZsb2F0KiB2KSBjb25zdDsKKyAgICB2b2lkIGNvcHlUbyhTa01hdHJpeCYgdikgY29uc3Q7CisKKyAgICB2b2lkIG1hcFJlY3QoUmVjdCYgcikgY29uc3Q7CisKKyAgICBmbG9hdCBnZXRUcmFuc2xhdGVYKCk7CisgICAgZmxvYXQgZ2V0VHJhbnNsYXRlWSgpOworCisgICAgdm9pZCBkdW1wKCkgY29uc3Q7CisKK3ByaXZhdGU6CisgICAgaW5saW5lIGZsb2F0IGdldChpbnQgaSwgaW50IGopIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIGRhdGFbaSAqIDQgKyBqXTsKKyAgICB9CisKKyAgICBpbmxpbmUgdm9pZCBzZXQoaW50IGksIGludCBqLCBmbG9hdCB2KSB7CisgICAgICAgIGRhdGFbaSAqIDQgKyBqXSA9IHY7CisgICAgfQorfTsgLy8gY2xhc3MgTWF0cml4NAorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBUeXBlcworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCit0eXBlZGVmIE1hdHJpeDQgbWF0NDsKKworfTsgLy8gbmFtZXNwYWNlIHVpcmVuZGVyZXIKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX1VJX01BVFJJWF9ICmRpZmYgLS1naXQgYS9saWJzL2h3dWkvTk9USUNFIGIvbGlicy9od3VpL05PVElDRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWIxZWZhCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9od3VpL05PVElDRQpAQCAtMCwwICsxLDE5MCBAQAorCisgICBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKKyAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KKworICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCisKKyAgIDEuIERlZmluaXRpb25zLgorCisgICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAorICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCisKKyAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5CisgICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuCisKKyAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKKyAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24KKyAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCisgICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKKyAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCisgICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKKyAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCisKKyAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKKyAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCisKKyAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAorICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgorICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KKworICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKKyAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQKKyAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKKyAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KKworICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKKyAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKKyAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaworICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KKworICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAorICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQorICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucworICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKKyAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgorICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAorICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KKworICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKKyAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMKKyAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQorICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgorICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mCisgICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKKyAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKKyAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCisgICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAorICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKKyAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dAorICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKKyAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgorCisgICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQorICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCisgICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4KKworICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCisgICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQorICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCisgICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKKyAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCisKKyAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAorICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKKyAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLAorICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCisgICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQorICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXIKKyAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKKyAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91CisgICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQorICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaworICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKKyAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKKyAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQorICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgorCisgICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQorICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0CisgICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQorICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKKyAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yCisgICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKKworICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcworICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAorCisgICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MKKyAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCisgICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKKyAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mCisgICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAorCisgICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMKKyAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0CisgICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCisgICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90CisgICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCisgICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKKyAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCisgICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCisgICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAorICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cworICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKKyAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgorICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlCisgICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCisgICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCisgICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLgorCisgICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKKyAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKKyAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAorICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoCisgICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgorCisgICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsCisgICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKKyAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KKyAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKKyAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCisgICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuCisKKyAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKKyAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwKKyAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQorICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCisKKyAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgorICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAorICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKKyAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCisgICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCisgICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKKyAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQorICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgorCisgICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKKyAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAorICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKKyAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCisgICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCisgICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKKyAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKKyAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKKyAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCisgICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCisgICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCisKKyAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKKyAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCisgICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAorICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKKyAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5CisgICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgorICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAorICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5CisgICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCisgICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KKworICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCisKZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9PcGVuR0xSZW5kZXJlci5jcHAgYi9saWJzL2h3dWkvT3BlbkdMUmVuZGVyZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3NjQ3NzgKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2h3dWkvT3BlbkdMUmVuZGVyZXIuY3BwCkBAIC0wLDAgKzEsNDEyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJPcGVuR0xSZW5kZXJlciIKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8U2tDYW52YXMuaD4KKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiT3BlbkdMUmVuZGVyZXIuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHVpcmVuZGVyZXIgeworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBEZWZpbmVzCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyNkZWZpbmUgU1YoeCwgeSkgeyB7IHgsIHkgfSB9CisjZGVmaW5lIEZWKHgsIHksIHUsIHYpIHsgeyB4LCB5IH0sIHsgdSwgdiB9IH0KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gR2xvYmFscworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitjb25zdCBTaW1wbGVWZXJ0ZXggZ0RyYXdDb2xvclZlcnRpY2VzW10gPSB7CisgICAgICAgIFNWKDAuMGYsIDAuMGYpLAorICAgICAgICBTVigxLjBmLCAwLjBmKSwKKyAgICAgICAgU1YoMC4wZiwgMS4wZiksCisgICAgICAgIFNWKDEuMGYsIDEuMGYpCit9OworY29uc3QgR0xzaXplaSBnRHJhd0NvbG9yVmVydGV4U3RyaWRlID0gc2l6ZW9mKFNpbXBsZVZlcnRleCk7Citjb25zdCBHTHNpemVpIGdEcmF3Q29sb3JWZXJ0ZXhDb3VudCA9IDQ7CisKK1RleHR1cmVWZXJ0ZXggZ0RyYXdUZXh0dXJlVmVydGljZXNbXSA9IHsKKyAgICAgICAgRlYoMC4wZiwgMC4wZiwgMC4wZiwgMS4wZiksCisgICAgICAgIEZWKDEuMGYsIDAuMGYsIDEuMGYsIDEuMGYpLAorICAgICAgICBGVigwLjBmLCAxLjBmLCAwLjBmLCAwLjBmKSwKKyAgICAgICAgRlYoMS4wZiwgMS4wZiwgMS4wZiwgMC4wZikKK307Citjb25zdCBHTHNpemVpIGdEcmF3VGV4dHVyZVZlcnRleFN0cmlkZSA9IHNpemVvZihUZXh0dXJlVmVydGV4KTsKK2NvbnN0IEdMc2l6ZWkgZ0RyYXdUZXh0dXJlVmVydGV4Q291bnQgPSA0OworCitzdGF0aWMgaW5saW5lIHZvaWQgcmVzZXREcmF3VGV4dHVyZVRleENvb3JkcyhmbG9hdCB1MSwgZmxvYXQgdjEsIGZsb2F0IHUyLCBmbG9hdCB2MikgeworICAgIGdEcmF3VGV4dHVyZVZlcnRpY2VzWzBdLnRleHR1cmVbMF0gPSB1MTsKKyAgICBnRHJhd1RleHR1cmVWZXJ0aWNlc1swXS50ZXh0dXJlWzFdID0gdjI7CisgICAgZ0RyYXdUZXh0dXJlVmVydGljZXNbMV0udGV4dHVyZVswXSA9IHUyOworICAgIGdEcmF3VGV4dHVyZVZlcnRpY2VzWzFdLnRleHR1cmVbMV0gPSB2MjsKKyAgICBnRHJhd1RleHR1cmVWZXJ0aWNlc1syXS50ZXh0dXJlWzBdID0gdTE7CisgICAgZ0RyYXdUZXh0dXJlVmVydGljZXNbMl0udGV4dHVyZVsxXSA9IHYxOworICAgIGdEcmF3VGV4dHVyZVZlcnRpY2VzWzNdLnRleHR1cmVbMF0gPSB1MjsKKyAgICBnRHJhd1RleHR1cmVWZXJ0aWNlc1szXS50ZXh0dXJlWzFdID0gdjE7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENvbnN0cnVjdG9ycy9kZXN0cnVjdG9yCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK09wZW5HTFJlbmRlcmVyOjpPcGVuR0xSZW5kZXJlcigpIHsKKyAgICBMT0dEKCJDcmVhdGUgT3BlbkdMUmVuZGVyZXIiKTsKKworICAgIG1EcmF3Q29sb3JTaGFkZXIgPSBuZXcgRHJhd0NvbG9yUHJvZ3JhbTsKKyAgICBtRHJhd1RleHR1cmVTaGFkZXIgPSBuZXcgRHJhd1RleHR1cmVQcm9ncmFtOworfQorCitPcGVuR0xSZW5kZXJlcjo6fk9wZW5HTFJlbmRlcmVyKCkgeworICAgIExPR0QoIkRlc3Ryb3kgT3BlbkdMUmVuZGVyZXIiKTsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gU2V0dXAKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwordm9pZCBPcGVuR0xSZW5kZXJlcjo6c2V0Vmlld3BvcnQoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7CisgICAgZ2xWaWV3cG9ydCgwLCAwLCB3aWR0aCwgaGVpZ2h0KTsKKworICAgIG1hdDQgb3J0aG87CisgICAgb3J0aG8ubG9hZE9ydGhvKDAsIHdpZHRoLCBoZWlnaHQsIDAsIC0xLCAxKTsKKyAgICBvcnRoby5jb3B5VG8obU9ydGhvTWF0cml4KTsKKworICAgIG1XaWR0aCA9IHdpZHRoOworICAgIG1IZWlnaHQgPSBoZWlnaHQ7Cit9CisKK3ZvaWQgT3BlbkdMUmVuZGVyZXI6OnByZXBhcmUoKSB7CisgICAgbVNuYXBzaG90ID0gJm1GaXJzdFNuYXBzaG90OworICAgIG1TYXZlQ291bnQgPSAwOworCisgICAgZ2xEaXNhYmxlKEdMX1NDSVNTT1JfVEVTVCk7CisKKyAgICBnbENsZWFyQ29sb3IoMC4wZiwgMC4wZiwgMC4wZiwgMC4wZik7CisgICAgZ2xDbGVhcihHTF9DT0xPUl9CVUZGRVJfQklUKTsKKworICAgIGdsRW5hYmxlKEdMX1NDSVNTT1JfVEVTVCk7CisgICAgZ2xTY2lzc29yKDAsIDAsIG1XaWR0aCwgbUhlaWdodCk7CisKKyAgICBtU25hcHNob3QtPmNsaXBSZWN0LnNldCgwLjBmLCAwLjBmLCBtV2lkdGgsIG1IZWlnaHQpOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBTdGF0ZSBtYW5hZ2VtZW50CisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2ludCBPcGVuR0xSZW5kZXJlcjo6Z2V0U2F2ZUNvdW50KCkgY29uc3QgeworICAgIHJldHVybiBtU2F2ZUNvdW50OworfQorCitpbnQgT3BlbkdMUmVuZGVyZXI6OnNhdmUoaW50IGZsYWdzKSB7CisgICAgcmV0dXJuIHNhdmVTbmFwc2hvdCgpOworfQorCit2b2lkIE9wZW5HTFJlbmRlcmVyOjpyZXN0b3JlKCkgeworICAgIGlmIChtU2F2ZUNvdW50ID09IDApIHJldHVybjsKKworICAgIGlmIChyZXN0b3JlU25hcHNob3QoKSkgeworICAgICAgICBzZXRTY2lzc29yRnJvbUNsaXAoKTsKKyAgICB9Cit9CisKK3ZvaWQgT3BlbkdMUmVuZGVyZXI6OnJlc3RvcmVUb0NvdW50KGludCBzYXZlQ291bnQpIHsKKyAgICBpZiAoc2F2ZUNvdW50IDw9IDAgfHwgc2F2ZUNvdW50ID4gbVNhdmVDb3VudCkgcmV0dXJuOworCisgICAgYm9vbCByZXN0b3JlQ2xpcCA9IGZhbHNlOworCisgICAgd2hpbGUgKG1TYXZlQ291bnQgIT0gc2F2ZUNvdW50IC0gMSkgeworICAgICAgICByZXN0b3JlQ2xpcCB8PSByZXN0b3JlU25hcHNob3QoKTsKKyAgICB9CisKKyAgICBpZiAocmVzdG9yZUNsaXApIHsKKyAgICAgICAgc2V0U2Npc3NvckZyb21DbGlwKCk7CisgICAgfQorfQorCitpbnQgT3BlbkdMUmVuZGVyZXI6OnNhdmVTbmFwc2hvdCgpIHsKKyAgICBtU25hcHNob3QgPSBuZXcgU25hcHNob3QobVNuYXBzaG90KTsKKyAgICByZXR1cm4gKyttU2F2ZUNvdW50OworfQorCitib29sIE9wZW5HTFJlbmRlcmVyOjpyZXN0b3JlU25hcHNob3QoKSB7CisgICAgYm9vbCByZXN0b3JlQ2xpcCA9IG1TbmFwc2hvdC0+ZmxhZ3MgJiBTbmFwc2hvdDo6a0ZsYWdDbGlwU2V0OworICAgIGJvb2wgcmVzdG9yZUxheWVyID0gbVNuYXBzaG90LT5mbGFncyAmIFNuYXBzaG90OjprRmxhZ0lzTGF5ZXI7CisKKyAgICBzcDxTbmFwc2hvdD4gY3VycmVudCA9IG1TbmFwc2hvdDsKKyAgICBzcDxTbmFwc2hvdD4gcHJldmlvdXMgPSBtU25hcHNob3QtPnByZXZpb3VzOworCisgICAgaWYgKHJlc3RvcmVMYXllcikgeworICAgICAgICAvLyBVbmJpbmQgY3VycmVudCBGQk8gYW5kIHJlc3RvcmUgcHJldmlvdXMgb25lCisgICAgICAgIC8vIE1vc3Qgb2YgdGhlIHRpbWUsIHByZXZpb3VzLT5mYm8gd2lsbCBiZSAwIHRvIGJpbmQgdGhlIGRlZmF1bHQgYnVmZmVyCisgICAgICAgIGdsQmluZEZyYW1lYnVmZmVyKEdMX0ZSQU1FQlVGRkVSLCBwcmV2aW91cy0+ZmJvKTsKKworICAgICAgICAvLyBSZXN0b3JlIHRoZSBjbGlwIGZyb20gdGhlIHByZXZpb3VzIHNuYXBzaG90CisgICAgICAgIGNvbnN0IFJlY3QmIGNsaXAgPSBwcmV2aW91cy0+Z2V0TWFwcGVkQ2xpcCgpOworICAgICAgICBnbFNjaXNzb3IoY2xpcC5sZWZ0LCBtSGVpZ2h0IC0gY2xpcC5ib3R0b20sIGNsaXAuZ2V0V2lkdGgoKSwgY2xpcC5nZXRIZWlnaHQoKSk7CisKKyAgICAgICAgLy8gQ29tcHV0ZSB0aGUgY29ycmVjdCB0ZXh0dXJlIGNvb3JkaW5hdGVzIGZvciB0aGUgRkJPIHRleHR1cmUKKyAgICAgICAgLy8gVGhlIHRleHR1cmUgaXMgY3VycmVudGx5IGFzIGJpZyBhcyB0aGUgd2luZG93IGJ1dCBkcmF3biB3aXRoCisgICAgICAgIC8vIGEgcXVhZCBvZiB0aGUgYXBwcm9wcmlhdGUgc2l6ZQorICAgICAgICBjb25zdCBSZWN0JiBsYXllciA9IGN1cnJlbnQtPmxheWVyOworICAgICAgICBSZWN0IHRleENvb3JkcyhjdXJyZW50LT5sYXllcik7CisgICAgICAgIG1TbmFwc2hvdC0+dHJhbnNmb3JtLm1hcFJlY3QodGV4Q29vcmRzKTsKKworICAgICAgICBjb25zdCBmbG9hdCB1MSA9IHRleENvb3Jkcy5sZWZ0IC8gZmxvYXQobVdpZHRoKTsKKyAgICAgICAgY29uc3QgZmxvYXQgdjEgPSAobUhlaWdodCAtIHRleENvb3Jkcy50b3ApIC8gZmxvYXQobUhlaWdodCk7CisgICAgICAgIGNvbnN0IGZsb2F0IHUyID0gdGV4Q29vcmRzLnJpZ2h0IC8gZmxvYXQobVdpZHRoKTsKKyAgICAgICAgY29uc3QgZmxvYXQgdjIgPSAobUhlaWdodCAtIHRleENvb3Jkcy5ib3R0b20pIC8gZmxvYXQobUhlaWdodCk7CisKKyAgICAgICAgcmVzZXREcmF3VGV4dHVyZVRleENvb3Jkcyh1MSwgdjEsIHUyLCB2MSk7CisKKyAgICAgICAgZHJhd1RleHR1cmVSZWN0KGxheWVyLmxlZnQsIGxheWVyLnRvcCwgbGF5ZXIucmlnaHQsIGxheWVyLmJvdHRvbSwKKyAgICAgICAgICAgICAgICBjdXJyZW50LT50ZXh0dXJlLCBjdXJyZW50LT5hbHBoYSk7CisKKyAgICAgICAgcmVzZXREcmF3VGV4dHVyZVRleENvb3JkcygwLjBmLCAxLjBmLCAxLjBmLCAwLjBmKTsKKworICAgICAgICBnbERlbGV0ZUZyYW1lYnVmZmVycygxLCAmY3VycmVudC0+ZmJvKTsKKyAgICAgICAgZ2xEZWxldGVUZXh0dXJlcygxLCAmY3VycmVudC0+dGV4dHVyZSk7CisgICAgfQorCisgICAgbVNuYXBzaG90ID0gcHJldmlvdXM7CisgICAgbVNhdmVDb3VudC0tOworCisgICAgcmV0dXJuIHJlc3RvcmVDbGlwOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBMYXllcnMKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworaW50IE9wZW5HTFJlbmRlcmVyOjpzYXZlTGF5ZXIoZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tLAorICAgICAgICBjb25zdCBTa1BhaW50KiBwLCBpbnQgZmxhZ3MpIHsKKyAgICAvLyBUT0RPIEltcGxlbWVudAorICAgIHJldHVybiBzYXZlU25hcHNob3QoKTsKK30KKworaW50IE9wZW5HTFJlbmRlcmVyOjpzYXZlTGF5ZXJBbHBoYShmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20sCisgICAgICAgIGludCBhbHBoYSwgaW50IGZsYWdzKSB7CisgICAgaW50IGNvdW50ID0gc2F2ZVNuYXBzaG90KCk7CisKKyAgICBtU25hcHNob3QtPmZsYWdzIHw9IFNuYXBzaG90OjprRmxhZ0lzTGF5ZXI7CisgICAgbVNuYXBzaG90LT5hbHBoYSA9IGFscGhhIC8gMjU1LjBmOworICAgIG1TbmFwc2hvdC0+bGF5ZXIuc2V0KGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSk7CisKKyAgICAvLyBHZW5lcmF0ZSB0aGUgRkJPIGFuZCBhdHRhY2ggdGhlIHRleHR1cmUKKyAgICBnbEdlbkZyYW1lYnVmZmVycygxLCAmbVNuYXBzaG90LT5mYm8pOworICAgIGdsQmluZEZyYW1lYnVmZmVyKEdMX0ZSQU1FQlVGRkVSLCBtU25hcHNob3QtPmZibyk7CisKKyAgICAvLyBHZW5lcmF0ZSB0aGUgdGV4dHVyZSBpbiB3aGljaCB0aGUgRkJPIHdpbGwgZHJhdworICAgIGdsR2VuVGV4dHVyZXMoMSwgJm1TbmFwc2hvdC0+dGV4dHVyZSk7CisgICAgZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCBtU25hcHNob3QtPnRleHR1cmUpOworCisgICAgLy8gVGhlIEZCTyB3aWxsIG5vdCBiZSBzY2FsZWQsIHNvIHdlIGNhbiB1c2UgbG93ZXIgcXVhbGl0eSBmaWx0ZXJpbmcKKyAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9NSU5fRklMVEVSLCBHTF9ORUFSRVNUKTsKKyAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9NQUdfRklMVEVSLCBHTF9ORUFSRVNUKTsKKyAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9XUkFQX1MsIEdMX0NMQU1QX1RPX0VER0UpOworICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX1dSQVBfVCwgR0xfQ0xBTVBfVE9fRURHRSk7CisKKyAgICAvLyBUT0RPICoqKioqIElNUE9SVEFOVCAqKioqKgorICAgIC8vIENyZWF0aW5nIGEgdGV4dHVyZS1iYWNrZWQgRkJPIHdvcmtzIG9ubHkgaWYgdGhlIHRleHR1cmUgaXMgdGhlIHNhbWUgc2l6ZQorICAgIC8vIGFzIHRoZSBvcmlnaW5hbCByZW5kZXJpbmcgYnVmZmVyIChpbiB0aGlzIGNhc2UsIG1XaWR0aCBhbmQgbUhlaWdodC4pCisgICAgLy8gVGhpcyBpcyBleHBlbnNpdmUgYW5kIHdhc3RlZnVsIGFuZCBtdXN0IGJlIGZpeGVkLgorICAgIC8vIFRPRE8gQWRkaXRpb25hbGx5IHdlIHNob3VsZCB1c2UgYW4gRkJPIGNhY2hlCisKKyAgICBjb25zdCBHTHNpemVpIHdpZHRoID0gbVdpZHRoOyAvL3JpZ2h0IC0gbGVmdDsKKyAgICBjb25zdCBHTHNpemVpIGhlaWdodCA9IG1IZWlnaHQ7IC8vYm90dG9tIC0gcmlnaHQ7CisKKyAgICBjb25zdCBHTGludCBmb3JtYXQgPSAoZmxhZ3MgJiBTa0NhbnZhczo6a0hhc0FscGhhTGF5ZXJfU2F2ZUZsYWcpID8gR0xfUkdCQSA6IEdMX1JHQjsKKyAgICBnbFRleEltYWdlMkQoR0xfVEVYVFVSRV8yRCwgMCwgZm9ybWF0LCB3aWR0aCwgaGVpZ2h0LCAwLCBmb3JtYXQsIEdMX1VOU0lHTkVEX0JZVEUsIE5VTEwpOworICAgIGdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgMCk7CisKKyAgICAvLyBCaW5kIHRleHR1cmUgdG8gRkJPCisgICAgZ2xGcmFtZWJ1ZmZlclRleHR1cmUyRChHTF9GUkFNRUJVRkZFUiwgR0xfQ09MT1JfQVRUQUNITUVOVDAsIEdMX1RFWFRVUkVfMkQsCisgICAgICAgICAgICBtU25hcHNob3QtPnRleHR1cmUsIDApOworCisgICAgR0xlbnVtIHN0YXR1cyA9IGdsQ2hlY2tGcmFtZWJ1ZmZlclN0YXR1cyhHTF9GUkFNRUJVRkZFUik7CisgICAgaWYgKHN0YXR1cyAhPSBHTF9GUkFNRUJVRkZFUl9DT01QTEVURSkgeworICAgICAgICBMT0dEKCJGcmFtZWJ1ZmZlciBpbmNvbXBsZXRlICVkIiwgc3RhdHVzKTsKKworICAgICAgICBnbERlbGV0ZUZyYW1lYnVmZmVycygxLCAmbVNuYXBzaG90LT5mYm8pOworICAgICAgICBnbERlbGV0ZVRleHR1cmVzKDEsICZtU25hcHNob3QtPnRleHR1cmUpOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gVHJhbnNmb3JtcworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCit2b2lkIE9wZW5HTFJlbmRlcmVyOjp0cmFuc2xhdGUoZmxvYXQgZHgsIGZsb2F0IGR5KSB7CisgICAgbVNuYXBzaG90LT50cmFuc2Zvcm0udHJhbnNsYXRlKGR4LCBkeSwgMC4wZik7CisgICAgbVNuYXBzaG90LT5mbGFncyB8PSBTbmFwc2hvdDo6a0ZsYWdEaXJ0eVRyYW5zZm9ybTsKK30KKwordm9pZCBPcGVuR0xSZW5kZXJlcjo6cm90YXRlKGZsb2F0IGRlZ3JlZXMpIHsKKyAgICBtU25hcHNob3QtPnRyYW5zZm9ybS5yb3RhdGUoZGVncmVlcywgMC4wZiwgMC4wZiwgMS4wZik7CisgICAgbVNuYXBzaG90LT5mbGFncyB8PSBTbmFwc2hvdDo6a0ZsYWdEaXJ0eVRyYW5zZm9ybTsKK30KKwordm9pZCBPcGVuR0xSZW5kZXJlcjo6c2NhbGUoZmxvYXQgc3gsIGZsb2F0IHN5KSB7CisgICAgbVNuYXBzaG90LT50cmFuc2Zvcm0uc2NhbGUoc3gsIHN5LCAxLjBmKTsKKyAgICBtU25hcHNob3QtPmZsYWdzIHw9IFNuYXBzaG90OjprRmxhZ0RpcnR5VHJhbnNmb3JtOworfQorCit2b2lkIE9wZW5HTFJlbmRlcmVyOjpzZXRNYXRyaXgoU2tNYXRyaXgqIG1hdHJpeCkgeworICAgIG1TbmFwc2hvdC0+dHJhbnNmb3JtLmxvYWQoKm1hdHJpeCk7CisgICAgbVNuYXBzaG90LT5mbGFncyB8PSBTbmFwc2hvdDo6a0ZsYWdEaXJ0eVRyYW5zZm9ybTsKK30KKwordm9pZCBPcGVuR0xSZW5kZXJlcjo6Z2V0TWF0cml4KFNrTWF0cml4KiBtYXRyaXgpIHsKKyAgICBtU25hcHNob3QtPnRyYW5zZm9ybS5jb3B5VG8oKm1hdHJpeCk7Cit9CisKK3ZvaWQgT3BlbkdMUmVuZGVyZXI6OmNvbmNhdE1hdHJpeChTa01hdHJpeCogbWF0cml4KSB7CisgICAgbWF0NCBtKCptYXRyaXgpOworICAgIG1TbmFwc2hvdC0+dHJhbnNmb3JtLm11bHRpcGx5KG0pOworICAgIG1TbmFwc2hvdC0+ZmxhZ3MgfD0gU25hcHNob3Q6OmtGbGFnRGlydHlUcmFuc2Zvcm07Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENsaXBwaW5nCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3ZvaWQgT3BlbkdMUmVuZGVyZXI6OnNldFNjaXNzb3JGcm9tQ2xpcCgpIHsKKyAgICBjb25zdCBSZWN0JiBjbGlwID0gbVNuYXBzaG90LT5nZXRNYXBwZWRDbGlwKCk7CisgICAgZ2xTY2lzc29yKGNsaXAubGVmdCwgbUhlaWdodCAtIGNsaXAuYm90dG9tLCBjbGlwLmdldFdpZHRoKCksIGNsaXAuZ2V0SGVpZ2h0KCkpOworfQorCitjb25zdCBSZWN0JiBPcGVuR0xSZW5kZXJlcjo6Z2V0Q2xpcEJvdW5kcygpIHsKKyAgICByZXR1cm4gbVNuYXBzaG90LT5jbGlwUmVjdDsKK30KKworYm9vbCBPcGVuR0xSZW5kZXJlcjo6cXVpY2tSZWplY3QoZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tKSB7CisgICAgLyoKKyAgICAgKiBUaGUgZG9jdW1lbnRhdGlvbiBvZiBxdWlja1JlamVjdCgpIGluZGljYXRlcyB0aGF0IHRoZSBzcGVjaWZpZWQgcmVjdAorICAgICAqIGlzIHRyYW5zZm9ybWVkIGJlZm9yZSBiZWluZyBjb21wYXJlZCB0byB0aGUgY2xpcCByZWN0LiBIb3dldmVyLCB0aGUKKyAgICAgKiBjbGlwIHJlY3QgaXMgbm90IHN0b3JlZCB0cmFuc2Zvcm1lZCBpbiB0aGUgc25hcHNob3QgYW5kIGNhbiB0aHVzIGJlCisgICAgICogY29tcGFyZWQgZGlyZWN0bHkKKyAgICAgKgorICAgICAqIFRoZSBmb2xsb3dpbmcgY29kZSBjYW4gYmUgdXNlZCBpbnN0ZWFkIHRvIHBlcmZvcm1lZCBhIG1hcHBlZCBjb21wYXJpc29uOgorICAgICAqCisgICAgICogICAgIG1TbmFwc2hvdC0+dHJhbnNmb3JtLm1hcFJlY3Qocik7CisgICAgICogICAgIGNvbnN0IFJlY3QmIGNsaXAgPSBtU25hcHNob3QtPmdldE1hcHBlZENsaXAoKTsKKyAgICAgKiAgICAgcmV0dXJuICFjbGlwLmludGVyc2VjdHMocik7CisgICAgICovCisgICAgUmVjdCByKGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSk7CisgICAgcmV0dXJuICFtU25hcHNob3QtPmNsaXBSZWN0LmludGVyc2VjdHMocik7Cit9CisKK2Jvb2wgT3BlbkdMUmVuZGVyZXI6OmNsaXBSZWN0KGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSkgeworICAgIGJvb2wgY2xpcHBlZCA9IG1TbmFwc2hvdC0+Y2xpcFJlY3QuaW50ZXJzZWN0KGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSk7CisgICAgaWYgKGNsaXBwZWQpIHsKKyAgICAgICAgbVNuYXBzaG90LT5mbGFncyB8PSBTbmFwc2hvdDo6a0ZsYWdDbGlwU2V0OworICAgICAgICBzZXRTY2lzc29yRnJvbUNsaXAoKTsKKyAgICB9CisgICAgcmV0dXJuIGNsaXBwZWQ7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIERyYXdpbmcKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwordm9pZCBPcGVuR0xSZW5kZXJlcjo6ZHJhd0NvbG9yKGludCBjb2xvciwgU2tYZmVybW9kZTo6TW9kZSBtb2RlKSB7CisgICAgLy8gVE9ETzogU2V0IHRoZSB0cmFuc2ZlciBtb2RlCisgICAgY29uc3QgUmVjdCYgY2xpcCA9IG1TbmFwc2hvdC0+Y2xpcFJlY3Q7CisgICAgZHJhd0NvbG9yUmVjdChjbGlwLmxlZnQsIGNsaXAudG9wLCBjbGlwLnJpZ2h0LCBjbGlwLmJvdHRvbSwgY29sb3IpOworfQorCit2b2lkIE9wZW5HTFJlbmRlcmVyOjpkcmF3UmVjdChmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20sIGNvbnN0IFNrUGFpbnQqIHApIHsKKyAgICAvLyBUT0RPIFN1cHBvcnQgbW9yZSB0aGFuICBqdXN0IGNvbG9yCisgICAgLy8gVE9ETzogU2V0IHRoZSB0cmFuc2ZlciBtb2RlCisgICAgZHJhd0NvbG9yUmVjdChsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20sIHAtPmdldENvbG9yKCkpOworfQorCit2b2lkIE9wZW5HTFJlbmRlcmVyOjpkcmF3Q29sb3JSZWN0KGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSwgaW50IGNvbG9yKSB7CisgICAgR0xmbG9hdCBhID0gKChjb2xvciA+PiAyNCkgJiAweEZGKSAvIDI1NS4wZjsKKyAgICBHTGZsb2F0IHIgPSAoKGNvbG9yID4+IDE2KSAmIDB4RkYpIC8gMjU1LjBmOworICAgIEdMZmxvYXQgZyA9ICgoY29sb3IgPj4gIDgpICYgMHhGRikgLyAyNTUuMGY7CisgICAgR0xmbG9hdCBiID0gKChjb2xvciAgICAgICkgJiAweEZGKSAvIDI1NS4wZjsKKworICAgIG1Nb2RlbFZpZXcubG9hZFRyYW5zbGF0ZShsZWZ0LCB0b3AsIDAuMGYpOworICAgIG1Nb2RlbFZpZXcuc2NhbGUocmlnaHQgLSBsZWZ0LCBib3R0b20gLSB0b3AsIDEuMGYpOworCisgICAgbURyYXdDb2xvclNoYWRlci0+dXNlKCZtT3J0aG9NYXRyaXhbMF0sICZtTW9kZWxWaWV3LmRhdGFbMF0sICZtU25hcHNob3QtPnRyYW5zZm9ybS5kYXRhWzBdKTsKKworICAgIGNvbnN0IEdMdm9pZCogcCA9ICZnRHJhd0NvbG9yVmVydGljZXNbMF0ucG9zaXRpb25bMF07CisKKyAgICBnbEVuYWJsZVZlcnRleEF0dHJpYkFycmF5KG1EcmF3Q29sb3JTaGFkZXItPnBvc2l0aW9uKTsKKyAgICBnbFZlcnRleEF0dHJpYlBvaW50ZXIobURyYXdDb2xvclNoYWRlci0+cG9zaXRpb24sIDIsIEdMX0ZMT0FULCBHTF9GQUxTRSwKKyAgICAgICAgICAgIGdEcmF3Q29sb3JWZXJ0ZXhTdHJpZGUsIHApOworICAgIGdsVmVydGV4QXR0cmliNGYobURyYXdDb2xvclNoYWRlci0+Y29sb3IsIHIsIGcsIGIsIGEpOworCisgICAgZ2xEcmF3QXJyYXlzKEdMX1RSSUFOR0xFX1NUUklQLCAwLCBnRHJhd0NvbG9yVmVydGV4Q291bnQpOworCisgICAgZ2xEaXNhYmxlVmVydGV4QXR0cmliQXJyYXkobURyYXdDb2xvclNoYWRlci0+cG9zaXRpb24pOworfQorCit2b2lkIE9wZW5HTFJlbmRlcmVyOjpkcmF3VGV4dHVyZVJlY3QoZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tLAorICAgICAgICBHTHVpbnQgdGV4dHVyZSwgZmxvYXQgYWxwaGEpIHsKKyAgICBtTW9kZWxWaWV3LmxvYWRUcmFuc2xhdGUobGVmdCwgdG9wLCAwLjBmKTsKKyAgICBtTW9kZWxWaWV3LnNjYWxlKHJpZ2h0IC0gbGVmdCwgYm90dG9tIC0gdG9wLCAxLjBmKTsKKworICAgIG1EcmF3VGV4dHVyZVNoYWRlci0+dXNlKCZtT3J0aG9NYXRyaXhbMF0sICZtTW9kZWxWaWV3LmRhdGFbMF0sICZtU25hcHNob3QtPnRyYW5zZm9ybS5kYXRhWzBdKTsKKworICAgIC8vIFRPRE8gQ29ycmVjdGx5IHNldCB0aGUgYmxlbmQgZnVuY3Rpb24sIGJhc2VkIG9uIHRleHR1cmUgZm9ybWF0IGFuZCB4ZmVybW9kZQorICAgIGdsRW5hYmxlKEdMX0JMRU5EKTsKKyAgICBnbEJsZW5kRnVuYyhHTF9TUkNfQUxQSEEsR0xfT05FX01JTlVTX1NSQ19BTFBIQSk7CisKKyAgICBnbEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQsIHRleHR1cmUpOworCisgICAgZ2xBY3RpdmVUZXh0dXJlKEdMX1RFWFRVUkUwKTsKKyAgICBnbFVuaWZvcm0xaShtRHJhd1RleHR1cmVTaGFkZXItPnNhbXBsZXIsIDApOworCisgICAgY29uc3QgR0x2b2lkKiBwID0gJmdEcmF3VGV4dHVyZVZlcnRpY2VzWzBdLnBvc2l0aW9uWzBdOworICAgIGNvbnN0IEdMdm9pZCogdCA9ICZnRHJhd1RleHR1cmVWZXJ0aWNlc1swXS50ZXh0dXJlWzBdOworCisgICAgZ2xFbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShtRHJhd1RleHR1cmVTaGFkZXItPnBvc2l0aW9uKTsKKyAgICBnbFZlcnRleEF0dHJpYlBvaW50ZXIobURyYXdUZXh0dXJlU2hhZGVyLT5wb3NpdGlvbiwgMiwgR0xfRkxPQVQsIEdMX0ZBTFNFLAorICAgICAgICAgICAgZ0RyYXdUZXh0dXJlVmVydGV4U3RyaWRlLCBwKTsKKworICAgIGdsRW5hYmxlVmVydGV4QXR0cmliQXJyYXkobURyYXdUZXh0dXJlU2hhZGVyLT50ZXhDb29yZHMpOworICAgIGdsVmVydGV4QXR0cmliUG9pbnRlcihtRHJhd1RleHR1cmVTaGFkZXItPnRleENvb3JkcywgMiwgR0xfRkxPQVQsIEdMX0ZBTFNFLAorICAgICAgICAgICAgZ0RyYXdUZXh0dXJlVmVydGV4U3RyaWRlLCB0KTsKKworICAgIGdsVmVydGV4QXR0cmliNGYobURyYXdUZXh0dXJlU2hhZGVyLT5jb2xvciwgMS4wZiwgMS4wZiwgMS4wZiwgYWxwaGEpOworCisgICAgZ2xEcmF3QXJyYXlzKEdMX1RSSUFOR0xFX1NUUklQLCAwLCBnRHJhd1RleHR1cmVWZXJ0ZXhDb3VudCk7CisKKyAgICBnbERpc2FibGVWZXJ0ZXhBdHRyaWJBcnJheShtRHJhd1RleHR1cmVTaGFkZXItPnBvc2l0aW9uKTsKKyAgICBnbERpc2FibGVWZXJ0ZXhBdHRyaWJBcnJheShtRHJhd1RleHR1cmVTaGFkZXItPnRleENvb3Jkcyk7CisKKyAgICBnbEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQsIDApOworICAgIGdsRGlzYWJsZShHTF9CTEVORCk7Cit9CisKK307IC8vIG5hbWVzcGFjZSB1aXJlbmRlcmVyCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbGlicy9od3VpL09wZW5HTFJlbmRlcmVyLmggYi9saWJzL2h3dWkvT3BlbkdMUmVuZGVyZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTAzMWI4Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicy9od3VpL09wZW5HTFJlbmRlcmVyLmgKQEAgLTAsMCArMSwxNjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfVUlfT1BFTkdMX1JFTkRFUkVSX0gKKyNkZWZpbmUgQU5EUk9JRF9VSV9PUEVOR0xfUkVOREVSRVJfSAorCisjaW5jbHVkZSA8R0xFUzIvZ2wyLmg+CisjaW5jbHVkZSA8R0xFUzIvZ2wyZXh0Lmg+CisKKyNpbmNsdWRlIDxTa01hdHJpeC5oPgorI2luY2x1ZGUgPFNrWGZlcm1vZGUuaD4KKworI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKworI2luY2x1ZGUgIk1hdHJpeC5oIgorI2luY2x1ZGUgIlByb2dyYW0uaCIKKyNpbmNsdWRlICJSZWN0LmgiCisjaW5jbHVkZSAiU25hcHNob3QuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHVpcmVuZGVyZXIgeworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBTdXBwb3J0CisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8qKgorICogU2ltcGxlIHN0cnVjdHVyZSB0byBkZXNjcmliZSBhIHZlcnRleCB3aXRoIGEgcG9zaXRpb24uCisgKiBUaGlzIGlzIHVzZWQgdG8gZHJhdyBmaWxsZWQgcmVjdGFuZ2xlcyB3aXRob3V0IGEgdGV4dHVyZS4KKyAqLworc3RydWN0IFNpbXBsZVZlcnRleCB7CisgICAgZmxvYXQgcG9zaXRpb25bMl07Cit9OyAvLyBzdHJ1Y3QgU2ltcGxlVmVydGV4CisKKy8qKgorICogU2ltcGxlIHN0cnVjdHVyZSB0byBkZXNjcmliZSBhIHZlcnRleCB3aXRoIGEgcG9zaXRpb24gYW5kIGEgdGV4dHVyZS4KKyAqLworc3RydWN0IFRleHR1cmVWZXJ0ZXggeworICAgIGZsb2F0IHBvc2l0aW9uWzJdOworICAgIGZsb2F0IHRleHR1cmVbMl07Cit9OyAvLyBzdHJ1Y3QgVGV4dHVyZVZlcnRleAorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBSZW5kZXJlcgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvKioKKyAqIE9wZW5HTCByZW5kZXJlciB1c2VkIHRvIGRyYXcgYWNjZWxlcmF0ZWQgMkQgZ3JhcGhpY3MuIFRoZSBBUEkgaXMgYQorICogc2ltcGxpZmllZCB2ZXJzaW9uIG9mIFNraWEncyBDYW52YXMgQVBJLgorICovCitjbGFzcyBPcGVuR0xSZW5kZXJlciB7CitwdWJsaWM6CisgICAgT3BlbkdMUmVuZGVyZXIoKTsKKyAgICB+T3BlbkdMUmVuZGVyZXIoKTsKKworICAgIHZvaWQgc2V0Vmlld3BvcnQoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKKyAgICB2b2lkIHByZXBhcmUoKTsKKworICAgIGludCBnZXRTYXZlQ291bnQoKSBjb25zdDsKKyAgICBpbnQgc2F2ZShpbnQgZmxhZ3MpOworICAgIHZvaWQgcmVzdG9yZSgpOworICAgIHZvaWQgcmVzdG9yZVRvQ291bnQoaW50IHNhdmVDb3VudCk7CisKKyAgICBpbnQgc2F2ZUxheWVyKGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSwgY29uc3QgU2tQYWludCogcCwgaW50IGZsYWdzKTsKKyAgICBpbnQgc2F2ZUxheWVyQWxwaGEoZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tLCBpbnQgYWxwaGEsIGludCBmbGFncyk7CisKKyAgICB2b2lkIHRyYW5zbGF0ZShmbG9hdCBkeCwgZmxvYXQgZHkpOworICAgIHZvaWQgcm90YXRlKGZsb2F0IGRlZ3JlZXMpOworICAgIHZvaWQgc2NhbGUoZmxvYXQgc3gsIGZsb2F0IHN5KTsKKworICAgIHZvaWQgc2V0TWF0cml4KFNrTWF0cml4KiBtYXRyaXgpOworICAgIHZvaWQgZ2V0TWF0cml4KFNrTWF0cml4KiBtYXRyaXgpOworICAgIHZvaWQgY29uY2F0TWF0cml4KFNrTWF0cml4KiBtYXRyaXgpOworCisgICAgY29uc3QgUmVjdCYgZ2V0Q2xpcEJvdW5kcygpOworICAgIGJvb2wgcXVpY2tSZWplY3QoZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tKTsKKyAgICBib29sIGNsaXBSZWN0KGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSk7CisKKyAgICB2b2lkIGRyYXdDb2xvcihpbnQgY29sb3IsIFNrWGZlcm1vZGU6Ok1vZGUgbW9kZSk7CisgICAgdm9pZCBkcmF3UmVjdChmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20sIGNvbnN0IFNrUGFpbnQqIHBhaW50KTsKKworcHJpdmF0ZToKKyAgICAvKioKKyAgICAgKiBTYXZlcyB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgcmVuZGVyZXIgYXMgYSBuZXcgc25hcHNob3QuCisgICAgICogVGhlIG5ldyBzbmFwc2hvdCBpcyBzYXZlZCBpbiBtU25hcHNob3QgYW5kIHRoZSBwcmV2aW91cyBzbmFwc2hvdAorICAgICAqIGlzIGxpbmtlZCBmcm9tIG1TbmFwc2hvdC0+cHJldmlvdXMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBuZXcgc2F2ZSBjb3VudC4gVGhpcyB2YWx1ZSBjYW4gYmUgcGFzc2VkIHRvICNyZXN0b3JlVG9Db3VudCgpCisgICAgICovCisgICAgaW50IHNhdmVTbmFwc2hvdCgpOworCisgICAgLyoqCisgICAgICogUmVzdG9yZXMgdGhlIGN1cnJlbnQgc25hcHNob3Q7IG1TbmFwc2hvdCBiZWNvbWVzIG1TbmFwc2hvdC0+cHJldmlvdXMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGNsaXAgc2hvdWxkIGJlIGFsc28gcmVhcHBsaWVkIGJ5IGNhbGxpbmcKKyAgICAgKiAgICAgICAgICNzZXRTY2lzc29yRnJvbUNsaXAoKS4KKyAgICAgKi8KKyAgICBib29sIHJlc3RvcmVTbmFwc2hvdCgpOworCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgY2xpcHBpbmcgcmVjdGFuZ2xlIHVzaW5nIGdsU2Npc3Nvci4gVGhlIGNsaXAgaXMgZGVmaW5lZCBieQorICAgICAqIHRoZSBjdXJyZW50IHNuYXBzaG90J3MgY2xpcFJlY3QgbWVtYmVyLgorICAgICAqLworICAgIHZvaWQgc2V0U2Npc3NvckZyb21DbGlwKCk7CisKKyAgICAvKioKKyAgICAgKiBEcmF3cyBhIGNvbG9yZWQgcmVjdGFuZ2xlIHdpdGggdGhlIHNwZWNpZmllZCBjb2xvci4gVGhlIHNwZWNpZmllZCBjb29yZGluYXRlcworICAgICAqIGFyZSB0cmFuc2Zvcm1lZCBieSB0aGUgY3VycmVudCBzbmFwc2hvdCdzIHRyYW5zZm9ybSBtYXRyaXguCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGVmdCBUaGUgbGVmdCBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUKKyAgICAgKiBAcGFyYW0gdG9wIFRoZSB0b3AgY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlCisgICAgICogQHBhcmFtIHJpZ2h0IFRoZSByaWdodCBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUKKyAgICAgKiBAcGFyYW0gYm90dG9tIFRoZSBib3R0b20gY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlCisgICAgICogQHBhcmFtIGNvbG9yIFRoZSByZWN0YW5nbGUncyBBUkdCIGNvbG9yLCBkZWZpbmVkIGFzIGEgcGFja2VkIDMyIGJpdHMgd29yZAorICAgICAqLworICAgIHZvaWQgZHJhd0NvbG9yUmVjdChmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20sIGludCBjb2xvcik7CisKKyAgICAvKioKKyAgICAgKiBEcmF3cyBhIHRleHR1cmVkIHJlY3RhbmdsZSB3aXRoIHRoZSBzcGVjaWZpZWQgdGV4dHVyZS4gVGhlIHNwZWNpZmllZCBjb29yZGluYXRlcworICAgICAqIGFyZSB0cmFuc2Zvcm1lZCBieSB0aGUgY3VycmVudCBzbmFwc2hvdCdzIHRyYW5zZm9ybSBtYXRyaXguCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGVmdCBUaGUgbGVmdCBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUKKyAgICAgKiBAcGFyYW0gdG9wIFRoZSB0b3AgY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlCisgICAgICogQHBhcmFtIHJpZ2h0IFRoZSByaWdodCBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUKKyAgICAgKiBAcGFyYW0gYm90dG9tIFRoZSBib3R0b20gY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlCisgICAgICogQHBhcmFtIHRleHR1cmUgVGhlIHRleHR1cmUgbmFtZSB0byBtYXAgb250byB0aGUgcmVjdGFuZ2xlCisgICAgICogQHBhcmFtIGFscGhhIEFuIGFkZGl0aW9uYWwgdHJhbnNsdWNlbmN5IHBhcmFtZXRlciwgYmV0d2VlbiAwLjBmIGFuZCAxLjBmCisgICAgICovCisgICAgdm9pZCBkcmF3VGV4dHVyZVJlY3QoZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tLCBHTHVpbnQgdGV4dHVyZSwKKyAgICAgICAgICAgIGZsb2F0IGFscGhhKTsKKworICAgIC8vIERpbWVuc2lvbnMgb2YgdGhlIGRyYXdpbmcgc3VyZmFjZQorICAgIGludCBtV2lkdGgsIG1IZWlnaHQ7CisKKyAgICAvLyBNYXRyaXggdXNlZCBmb3Igb3J0aG8gcHJvamVjdGlvbiBpbiBzaGFkZXJzCisgICAgZmxvYXQgbU9ydGhvTWF0cml4WzE2XTsKKworICAgIC8vIE1vZGVsLXZpZXcgbWF0cml4IHVzZWQgdG8gcG9zaXRpb24vc2l6ZSBvYmplY3RzCisgICAgbWF0NCBtTW9kZWxWaWV3OworCisgICAgLy8gTnVtYmVyIG9mIHNhdmVkIHN0YXRlcworICAgIGludCBtU2F2ZUNvdW50OworICAgIC8vIEJhc2Ugc3RhdGUKKyAgICBTbmFwc2hvdCBtRmlyc3RTbmFwc2hvdDsKKyAgICAvLyBDdXJyZW50IHN0YXRlCisgICAgc3A8U25hcHNob3Q+IG1TbmFwc2hvdDsKKworICAgIC8vIFNoYWRlcnMKKyAgICBzcDxEcmF3Q29sb3JQcm9ncmFtPiBtRHJhd0NvbG9yU2hhZGVyOworICAgIHNwPERyYXdUZXh0dXJlUHJvZ3JhbT4gbURyYXdUZXh0dXJlU2hhZGVyOworfTsgLy8gY2xhc3MgT3BlbkdMUmVuZGVyZXIKKworfTsgLy8gbmFtZXNwYWNlIHVpcmVuZGVyZXIKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX1VJX09QRU5HTF9SRU5ERVJFUl9ICmRpZmYgLS1naXQgYS9saWJzL2h3dWkvUHJvZ3JhbS5jcHAgYi9saWJzL2h3dWkvUHJvZ3JhbS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmFjZGRmYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvaHd1aS9Qcm9ncmFtLmNwcApAQCAtMCwwICsxLDE1NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiT3BlbkdMUmVuZGVyZXIiCisKKyNpbmNsdWRlICJQcm9ncmFtLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSB1aXJlbmRlcmVyIHsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gU2hhZGVycworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisjZGVmaW5lIFNIQURFUl9TT1VSQ0UobmFtZSwgc291cmNlKSBjb25zdCBjaGFyKiBuYW1lID0gI3NvdXJjZQorCisjaW5jbHVkZSAic2hhZGVycy9kcmF3Q29sb3IudmVydCIKKyNpbmNsdWRlICJzaGFkZXJzL2RyYXdDb2xvci5mcmFnIgorCisjaW5jbHVkZSAic2hhZGVycy9kcmF3VGV4dHVyZS52ZXJ0IgorI2luY2x1ZGUgInNoYWRlcnMvZHJhd1RleHR1cmUuZnJhZyIKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQmFzZSBwcm9ncmFtCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK1Byb2dyYW06OlByb2dyYW0oY29uc3QgY2hhciogdmVydGV4LCBjb25zdCBjaGFyKiBmcmFnbWVudCkgeworICAgIHZlcnRleFNoYWRlciA9IGJ1aWxkU2hhZGVyKHZlcnRleCwgR0xfVkVSVEVYX1NIQURFUik7CisgICAgZnJhZ21lbnRTaGFkZXIgPSBidWlsZFNoYWRlcihmcmFnbWVudCwgR0xfRlJBR01FTlRfU0hBREVSKTsKKworICAgIGlkID0gZ2xDcmVhdGVQcm9ncmFtKCk7CisgICAgZ2xBdHRhY2hTaGFkZXIoaWQsIHZlcnRleFNoYWRlcik7CisgICAgZ2xBdHRhY2hTaGFkZXIoaWQsIGZyYWdtZW50U2hhZGVyKTsKKyAgICBnbExpbmtQcm9ncmFtKGlkKTsKKworICAgIEdMaW50IHN0YXR1czsKKyAgICBnbEdldFByb2dyYW1pdihpZCwgR0xfTElOS19TVEFUVVMsICZzdGF0dXMpOworICAgIGlmIChzdGF0dXMgIT0gR0xfVFJVRSkgeworICAgICAgICBHTGludCBpbmZvTGVuID0gMDsKKyAgICAgICAgZ2xHZXRQcm9ncmFtaXYoaWQsIEdMX0lORk9fTE9HX0xFTkdUSCwgJmluZm9MZW4pOworICAgICAgICBpZiAoaW5mb0xlbiA+IDEpIHsKKyAgICAgICAgICAgIGNoYXIqIGxvZyA9IChjaGFyKikgbWFsbG9jKHNpemVvZihjaGFyKSAqIGluZm9MZW4pOworICAgICAgICAgICAgZ2xHZXRQcm9ncmFtSW5mb0xvZyhpZCwgaW5mb0xlbiwgMCwgbG9nKTsKKyAgICAgICAgICAgIExPR0UoIkVycm9yIHdoaWxlIGxpbmtpbmcgc2hhZGVyczogJXMiLCBsb2cpOworICAgICAgICAgICAgZGVsZXRlIGxvZzsKKyAgICAgICAgfQorICAgICAgICBnbERlbGV0ZVByb2dyYW0oaWQpOworICAgIH0KK30KKworUHJvZ3JhbTo6flByb2dyYW0oKSB7CisgICAgZ2xEZWxldGVTaGFkZXIodmVydGV4U2hhZGVyKTsKKyAgICBnbERlbGV0ZVNoYWRlcihmcmFnbWVudFNoYWRlcik7CisgICAgZ2xEZWxldGVQcm9ncmFtKGlkKTsKK30KKwordm9pZCBQcm9ncmFtOjp1c2UoKSB7CisgICAgZ2xVc2VQcm9ncmFtKGlkKTsKK30KKworaW50IFByb2dyYW06OmFkZEF0dHJpYihjb25zdCBjaGFyKiBuYW1lKSB7CisgICAgaW50IHNsb3QgPSBnbEdldEF0dHJpYkxvY2F0aW9uKGlkLCBuYW1lKTsKKyAgICBhdHRyaWJ1dGVzLmFkZChuYW1lLCBzbG90KTsKKyAgICByZXR1cm4gc2xvdDsKK30KKworaW50IFByb2dyYW06OmdldEF0dHJpYihjb25zdCBjaGFyKiBuYW1lKSB7CisgICAgcmV0dXJuIGF0dHJpYnV0ZXMudmFsdWVGb3IobmFtZSk7Cit9CisKK2ludCBQcm9ncmFtOjphZGRVbmlmb3JtKGNvbnN0IGNoYXIqIG5hbWUpIHsKKyAgICBpbnQgc2xvdCA9IGdsR2V0VW5pZm9ybUxvY2F0aW9uKGlkLCBuYW1lKTsKKyAgICB1bmlmb3Jtcy5hZGQobmFtZSwgc2xvdCk7CisgICAgcmV0dXJuIHNsb3Q7Cit9CisKK2ludCBQcm9ncmFtOjpnZXRVbmlmb3JtKGNvbnN0IGNoYXIqIG5hbWUpIHsKKyAgICByZXR1cm4gdW5pZm9ybXMudmFsdWVGb3IobmFtZSk7Cit9CisKK0dMdWludCBQcm9ncmFtOjpidWlsZFNoYWRlcihjb25zdCBjaGFyKiBzb3VyY2UsIEdMZW51bSB0eXBlKSB7CisgICAgR0x1aW50IHNoYWRlciA9IGdsQ3JlYXRlU2hhZGVyKHR5cGUpOworICAgIGdsU2hhZGVyU291cmNlKHNoYWRlciwgMSwgJnNvdXJjZSwgMCk7CisgICAgZ2xDb21waWxlU2hhZGVyKHNoYWRlcik7CisKKyAgICBHTGludCBzdGF0dXM7CisgICAgZ2xHZXRTaGFkZXJpdihzaGFkZXIsIEdMX0NPTVBJTEVfU1RBVFVTLCAmc3RhdHVzKTsKKyAgICBpZiAoc3RhdHVzICE9IEdMX1RSVUUpIHsKKyAgICAgICAgLy8gU29tZSBkcml2ZXJzIHJldHVybiB3cm9uZyB2YWx1ZXMgZm9yIEdMX0lORk9fTE9HX0xFTkdUSAorICAgICAgICAvLyB1c2UgYSBmaXhlZCBzaXplIGluc3RlYWQKKyAgICAgICAgR0xjaGFyIGxvZ1s1MTJdOworICAgICAgICBnbEdldFNoYWRlckluZm9Mb2coc2hhZGVyLCBzaXplb2YobG9nKSwgMCwgJmxvZ1swXSk7CisgICAgICAgIExPR0UoIkVycm9yIHdoaWxlIGNvbXBpbGluZyBzaGFkZXI6ICVzIiwgbG9nKTsKKyAgICAgICAgZ2xEZWxldGVTaGFkZXIoc2hhZGVyKTsKKyAgICB9CisKKyAgICByZXR1cm4gc2hhZGVyOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBEcmF3IGNvbG9yCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK0RyYXdDb2xvclByb2dyYW06OkRyYXdDb2xvclByb2dyYW0oKToKKyAgICAgICAgUHJvZ3JhbShnRHJhd0NvbG9yVmVydGV4U2hhZGVyLCBnRHJhd0NvbG9yRnJhZ21lbnRTaGFkZXIpIHsKKyAgICBnZXRBdHRyaWJzQW5kVW5pZm9ybXMoKTsKK30KKworRHJhd0NvbG9yUHJvZ3JhbTo6RHJhd0NvbG9yUHJvZ3JhbShjb25zdCBjaGFyKiB2ZXJ0ZXgsIGNvbnN0IGNoYXIqIGZyYWdtZW50KToKKyAgICAgICAgUHJvZ3JhbSh2ZXJ0ZXgsIGZyYWdtZW50KSB7CisgICAgZ2V0QXR0cmlic0FuZFVuaWZvcm1zKCk7Cit9CisKK3ZvaWQgRHJhd0NvbG9yUHJvZ3JhbTo6Z2V0QXR0cmlic0FuZFVuaWZvcm1zKCkgeworICAgIHBvc2l0aW9uID0gYWRkQXR0cmliKCJwb3NpdGlvbiIpOworICAgIGNvbG9yID0gYWRkQXR0cmliKCJjb2xvciIpOworICAgIHByb2plY3Rpb24gPSBhZGRVbmlmb3JtKCJwcm9qZWN0aW9uIik7CisgICAgbW9kZWxWaWV3ID0gYWRkVW5pZm9ybSgibW9kZWxWaWV3Iik7CisgICAgdHJhbnNmb3JtID0gYWRkVW5pZm9ybSgidHJhbnNmb3JtIik7Cit9CisKK3ZvaWQgRHJhd0NvbG9yUHJvZ3JhbTo6dXNlKGNvbnN0IEdMZmxvYXQqIHByb2plY3Rpb25NYXRyaXgsIGNvbnN0IEdMZmxvYXQqIG1vZGVsVmlld01hdHJpeCwKKyAgICAgICAgY29uc3QgR0xmbG9hdCogdHJhbnNmb3JtTWF0cml4KSB7CisgICAgUHJvZ3JhbTo6dXNlKCk7CisgICAgZ2xVbmlmb3JtTWF0cml4NGZ2KHByb2plY3Rpb24sIDEsIEdMX0ZBTFNFLCBwcm9qZWN0aW9uTWF0cml4KTsKKyAgICBnbFVuaWZvcm1NYXRyaXg0ZnYobW9kZWxWaWV3LCAxLCBHTF9GQUxTRSwgbW9kZWxWaWV3TWF0cml4KTsKKyAgICBnbFVuaWZvcm1NYXRyaXg0ZnYodHJhbnNmb3JtLCAxLCBHTF9GQUxTRSwgdHJhbnNmb3JtTWF0cml4KTsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gRHJhdyB0ZXh0dXJlCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK0RyYXdUZXh0dXJlUHJvZ3JhbTo6RHJhd1RleHR1cmVQcm9ncmFtKCk6CisgICAgICAgIERyYXdDb2xvclByb2dyYW0oZ0RyYXdUZXh0dXJlVmVydGV4U2hhZGVyLCBnRHJhd1RleHR1cmVGcmFnbWVudFNoYWRlcikgeworICAgIHRleENvb3JkcyA9IGFkZEF0dHJpYigidGV4Q29vcmRzIik7CisgICAgc2FtcGxlciA9IGFkZFVuaWZvcm0oInNhbXBsZXIiKTsKK30KKworfTsgLy8gbmFtZXNwYWNlIHVpcmVuZGVyZXIKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJzL2h3dWkvUHJvZ3JhbS5oIGIvbGlicy9od3VpL1Byb2dyYW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTE2YTkyCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9od3VpL1Byb2dyYW0uaApAQCAtMCwwICsxLDE1NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9VSV9QUk9HUkFNX0gKKyNkZWZpbmUgQU5EUk9JRF9VSV9QUk9HUkFNX0gKKworI2luY2x1ZGUgPEdMRVMyL2dsMi5oPgorI2luY2x1ZGUgPEdMRVMyL2dsMmV4dC5oPgorCisjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSB1aXJlbmRlcmVyIHsKKworLyoqCisgKiBBIHByb2dyYW0gaG9sZHMgYSB2ZXJ0ZXggYW5kIGEgZnJhZ21lbnQgc2hhZGVyLiBJdCBvZmZlcnMgc2V2ZXJhbCB1dGlsaXR5CisgKiBtZXRob2RzIHRvIHF1ZXJ5IGF0dHJpYnV0ZXMgYW5kIHVuaWZvcm1zLgorICovCitjbGFzcyBQcm9ncmFtOiBwdWJsaWMgTGlnaHRSZWZCYXNlPFByb2dyYW0+IHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IHByb2dyYW0gd2l0aCB0aGUgc3BlY2lmaWVkIHZlcnRleCBhbmQgZnJhZ21lbnQKKyAgICAgKiBzaGFkZXJzIHNvdXJjZXMuCisgICAgICovCisgICAgUHJvZ3JhbShjb25zdCBjaGFyKiB2ZXJ0ZXgsIGNvbnN0IGNoYXIqIGZyYWdtZW50KTsKKyAgICB+UHJvZ3JhbSgpOworCisgICAgLyoqCisgICAgICogQmluZHMgdGhpcyBwcm9ncmFtIHRvIHRoZSBHTCBjb250ZXh0LgorICAgICAqLworICAgIHZvaWQgdXNlKCk7CisKK3Byb3RlY3RlZDoKKyAgICAvKioKKyAgICAgKiBBZGRzIGFuIGF0dHJpYnV0ZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIE9wZW5HTCBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUuCisgICAgICovCisgICAgaW50IGFkZEF0dHJpYihjb25zdCBjaGFyKiBuYW1lKTsKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBPcGVuR0wgbmFtZSBvZiB0aGUgc3BlY2lmaWVkIGF0dHJpYnV0ZS4KKyAgICAgKi8KKyAgICBpbnQgZ2V0QXR0cmliKGNvbnN0IGNoYXIqIG5hbWUpOworCisgICAgLyoqCisgICAgICogQWRkcyBhIHVuaWZvcm0gd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBPcGVuR0wgbmFtZSBvZiB0aGUgdW5pZm9ybS4KKyAgICAgKi8KKyAgICBpbnQgYWRkVW5pZm9ybShjb25zdCBjaGFyKiBuYW1lKTsKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBPcGVuR0wgbmFtZSBvZiB0aGUgc3BlY2lmaWVkIHVuaWZvcm0uCisgICAgICovCisgICAgaW50IGdldFVuaWZvcm0oY29uc3QgY2hhciogbmFtZSk7CisKK3ByaXZhdGU6CisgICAgLyoqCisgICAgICogQ29tcGlsZXMgdGhlIHNwZWNpZmllZCBzaGFkZXIgb2YgdGhlIHNwZWNpZmllZCB0eXBlLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgbmFtZSBvZiB0aGUgY29tcGlsZWQgc2hhZGVyLgorICAgICAqLworICAgIEdMdWludCBidWlsZFNoYWRlcihjb25zdCBjaGFyKiBzb3VyY2UsIEdMZW51bSB0eXBlKTsKKworICAgIC8vIE5hbWUgb2YgdGhlIE9wZW5HTCBwcm9ncmFtCisgICAgR0x1aW50IGlkOworCisgICAgLy8gTmFtZSBvZiB0aGUgc2hhZGVycworICAgIEdMdWludCB2ZXJ0ZXhTaGFkZXI7CisgICAgR0x1aW50IGZyYWdtZW50U2hhZGVyOworCisgICAgLy8gS2VlcHMgdHJhY2sgb2YgYXR0cmlidXRlcyBhbmQgdW5pZm9ybXMgc2xvdHMKKyAgICBLZXllZFZlY3Rvcjxjb25zdCBjaGFyKiwgaW50PiBhdHRyaWJ1dGVzOworICAgIEtleWVkVmVjdG9yPGNvbnN0IGNoYXIqLCBpbnQ+IHVuaWZvcm1zOworfTsgLy8gY2xhc3MgUHJvZ3JhbQorCisvKioKKyAqIFByb2dyYW0gdXNlZCB0byBkcmF3IHZlcnRpY2VzIHdpdGggYSBzaW1wbGUgY29sb3IuIFRoZSBzaGFkZXJzIG11c3QKKyAqIHNwZWNpZnkgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOgorICogICAgICB2ZWM0IHBvc2l0aW9uLCBwb3NpdGlvbiBvZiB0aGUgdmVydGV4CisgKiAgICAgIHZlYzQgY29sb3IsIFJHQkEgY29sb3Igb2YgdGhlIHZlcnRleAorICoKKyAqIEFuZCB0aGUgZm9sbG93aW5nIHVuaWZvcm1zOgorICogICAgICBtYXQ0IHByb2plY3Rpb24sIHRoZSBwcm9qZWN0aW9uIG1hdHJpeAorICogICAgICBtYXQ0IG1vZGVsVmlldywgdGhlIG1vZGVsVmlldyBtYXRyaXgKKyAqICAgICAgbWF0NCB0cmFuc2Zvcm0sIGFuIGV4dHJhIHRyYW5zZm9ybWF0aW9uIG1hdHJpeAorICovCitjbGFzcyBEcmF3Q29sb3JQcm9ncmFtOiBwdWJsaWMgUHJvZ3JhbSB7CitwdWJsaWM6CisgICAgRHJhd0NvbG9yUHJvZ3JhbSgpOworICAgIERyYXdDb2xvclByb2dyYW0oY29uc3QgY2hhciogdmVydGV4LCBjb25zdCBjaGFyKiBmcmFnbWVudCk7CisKKyAgICAvKioKKyAgICAgKiBCaW5kcyB0aGUgcHJvZ3JhbSB3aXRoIHRoZSBzcGVjaWZpZWQgcHJvamVjdGlvbiwgbW9kZWxWaWV3IGFuZAorICAgICAqIHRyYW5zZm9ybSBtYXRyaWNlcy4KKyAgICAgKi8KKyAgICB2b2lkIHVzZShjb25zdCBHTGZsb2F0KiBwcm9qZWN0aW9uTWF0cml4LCBjb25zdCBHTGZsb2F0KiBtb2RlbFZpZXdNYXRyaXgsCisgICAgICAgICAgICAgY29uc3QgR0xmbG9hdCogdHJhbnNmb3JtTWF0cml4KTsKKworICAgIC8qKgorICAgICAqIE5hbWUgb2YgdGhlIHBvc2l0aW9uIGF0dHJpYnV0ZS4KKyAgICAgKi8KKyAgICBpbnQgcG9zaXRpb247CisgICAgLyoqCisgICAgICogTmFtZSBvZiB0aGUgY29sb3IgYXR0cmlidXRlLgorICAgICAqLworICAgIGludCBjb2xvcjsKKworICAgIC8qKgorICAgICAqIE5hbWUgb2YgdGhlIHByb2plY3Rpb24gdW5pZm9ybS4KKyAgICAgKi8KKyAgICBpbnQgcHJvamVjdGlvbjsKKyAgICAvKioKKyAgICAgKiBOYW1lIG9mIHRoZSBtb2RlbFZpZXcgdW5pZm9ybS4KKyAgICAgKi8KKyAgICBpbnQgbW9kZWxWaWV3OworICAgIC8qKgorICAgICAqIE5hbWUgb2YgdGhlIHRyYW5zZm9ybSB1bmlmb3JtLgorICAgICAqLworICAgIGludCB0cmFuc2Zvcm07CisKK3Byb3RlY3RlZDoKKyAgICB2b2lkIGdldEF0dHJpYnNBbmRVbmlmb3JtcygpOworfTsKKworLyoqCisgKiBQcm9ncmFtIHVzZWQgdG8gZHJhdyB0ZXh0dXJlZCB2ZXJ0aWNlcy4gSW4gYWRkaXRpb24gdG8gZXZlcnl0aGluZyB0aGF0IHRoZQorICogRHJhd0NvbG9yUHJvZ3JhbSBzdXBwb3J0cywgdGhlIGZvbGxvd2luZyB0d28gYXR0cmlidXRlcyBtdXN0IGJlIHNwZWNpZmllZDoKKyAqICAgICAgc2FtcGxlcjJEIHNhbXBsZXIsIHRoZSB0ZXh0dXJlIHNhbXBsZXIKKyAqICAgICAgdmVjMiB0ZXhDb29yZHMsIHRoZSB0ZXh0dXJlIGNvb3JkaW5hdGVzIG9mIHRoZSB2ZXJ0ZXgKKyAqLworY2xhc3MgRHJhd1RleHR1cmVQcm9ncmFtOiBwdWJsaWMgRHJhd0NvbG9yUHJvZ3JhbSB7CitwdWJsaWM6CisgICAgRHJhd1RleHR1cmVQcm9ncmFtKCk7CisKKyAgICBpbnQgc2FtcGxlcjsKKyAgICBpbnQgdGV4Q29vcmRzOworfTsKKworfTsgLy8gbmFtZXNwYWNlIHVpcmVuZGVyZXIKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX1VJX1BST0dSQU1fSApkaWZmIC0tZ2l0IGEvbGlicy9od3VpL1JlY3QuaCBiL2xpYnMvaHd1aS9SZWN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQ1NzU1MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvaHd1aS9SZWN0LmgKQEAgLTAsMCArMSwxNDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfVUlfUkVDVF9ICisjZGVmaW5lIEFORFJPSURfVUlfUkVDVF9ICisKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHVpcmVuZGVyZXIgeworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBTdHJ1Y3RzCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3N0cnVjdCBSZWN0IHsKKyAgICBmbG9hdCBsZWZ0OworICAgIGZsb2F0IHRvcDsKKyAgICBmbG9hdCByaWdodDsKKyAgICBmbG9hdCBib3R0b207CisKKyAgICBSZWN0KCk6CisgICAgICAgICAgICBsZWZ0KDApLAorICAgICAgICAgICAgdG9wKDApLAorICAgICAgICAgICAgcmlnaHQoMCksCisgICAgICAgICAgICBib3R0b20oMCkgeworICAgIH0KKworICAgIFJlY3QoZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tKToKKyAgICAgICAgICAgIGxlZnQobGVmdCksCisgICAgICAgICAgICB0b3AodG9wKSwKKyAgICAgICAgICAgIHJpZ2h0KHJpZ2h0KSwKKyAgICAgICAgICAgIGJvdHRvbShib3R0b20pIHsKKyAgICB9CisKKyAgICBSZWN0KGNvbnN0IFJlY3QmIHIpIHsKKyAgICAgICAgc2V0KHIpOworICAgIH0KKworICAgIFJlY3QoUmVjdCYgcikgeworICAgICAgICBzZXQocik7CisgICAgfQorCisgICAgUmVjdCYgb3BlcmF0b3I9KGNvbnN0IFJlY3QmIHIpIHsKKyAgICAgICAgc2V0KHIpOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUmVjdCYgb3BlcmF0b3I9KFJlY3QmIHIpIHsKKyAgICAgICAgc2V0KHIpOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgZnJpZW5kIGludCBvcGVyYXRvcj09KGNvbnN0IFJlY3QmIGEsIGNvbnN0IFJlY3QmIGIpIHsKKyAgICAgICAgcmV0dXJuICFtZW1jbXAoJmEsICZiLCBzaXplb2YoYSkpOworICAgIH0KKworICAgIGZyaWVuZCBpbnQgb3BlcmF0b3IhPShjb25zdCBSZWN0JiBhLCBjb25zdCBSZWN0JiBiKSB7CisgICAgICAgIHJldHVybiBtZW1jbXAoJmEsICZiLCBzaXplb2YoYSkpOworICAgIH0KKworICAgIGJvb2wgaXNFbXB0eSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIGxlZnQgPj0gcmlnaHQgfHwgdG9wID49IGJvdHRvbTsKKyAgICB9CisKKyAgICB2b2lkIHNldEVtcHR5KCkgeworICAgICAgICBtZW1zZXQodGhpcywgMCwgc2l6ZW9mKCp0aGlzKSk7CisgICAgfQorCisgICAgdm9pZCBzZXQoZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tKSB7CisgICAgICAgIHRoaXMtPmxlZnQgPSBsZWZ0OworICAgICAgICB0aGlzLT5yaWdodCA9IHJpZ2h0OworICAgICAgICB0aGlzLT50b3AgPSB0b3A7CisgICAgICAgIHRoaXMtPmJvdHRvbSA9IGJvdHRvbTsKKyAgICB9CisKKyAgICB2b2lkIHNldChjb25zdCBSZWN0JiByKSB7CisgICAgICAgIHNldChyLmxlZnQsIHIudG9wLCByLnJpZ2h0LCByLmJvdHRvbSk7CisgICAgfQorCisgICAgZmxvYXQgZ2V0V2lkdGgoKSBjb25zdCB7CisgICAgICAgIHJldHVybiByaWdodCAtIGxlZnQ7CisgICAgfQorCisgICAgZmxvYXQgZ2V0SGVpZ2h0KCkgY29uc3QgeworICAgICAgICByZXR1cm4gYm90dG9tIC0gdG9wOworICAgIH0KKworICAgIGJvb2wgaW50ZXJzZWN0cyhmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20pIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIGxlZnQgPCByaWdodCAmJiB0b3AgPCBib3R0b20gJiYKKyAgICAgICAgICAgICAgICB0aGlzLT5sZWZ0IDwgdGhpcy0+cmlnaHQgJiYgdGhpcy0+dG9wIDwgdGhpcy0+Ym90dG9tICYmCisgICAgICAgICAgICAgICAgdGhpcy0+bGVmdCA8IHJpZ2h0ICYmIGxlZnQgPCB0aGlzLT5yaWdodCAmJgorICAgICAgICAgICAgICAgIHRoaXMtPnRvcCA8IGJvdHRvbSAmJiB0b3AgPCB0aGlzLT5ib3R0b207CisgICAgfQorCisgICAgYm9vbCBpbnRlcnNlY3RzKGNvbnN0IFJlY3QmIHIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIGludGVyc2VjdHMoci5sZWZ0LCByLnRvcCwgci5yaWdodCwgci5ib3R0b20pOworICAgIH0KKworICAgIGJvb2wgaW50ZXJzZWN0KGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSkgeworICAgICAgICBpZiAobGVmdCA8IHJpZ2h0ICYmIHRvcCA8IGJvdHRvbSAmJiAhdGhpcy0+aXNFbXB0eSgpICYmCisgICAgICAgICAgICAgICAgdGhpcy0+bGVmdCA8IHJpZ2h0ICYmIGxlZnQgPCB0aGlzLT5yaWdodCAmJgorICAgICAgICAgICAgICAgIHRoaXMtPnRvcCA8IGJvdHRvbSAmJiB0b3AgPCB0aGlzLT5ib3R0b20pIHsKKworICAgICAgICAgICAgaWYgKHRoaXMtPmxlZnQgPCBsZWZ0KSB0aGlzLT5sZWZ0ID0gbGVmdDsKKyAgICAgICAgICAgIGlmICh0aGlzLT50b3AgPCB0b3ApIHRoaXMtPnRvcCA9IHRvcDsKKyAgICAgICAgICAgIGlmICh0aGlzLT5yaWdodCA+IHJpZ2h0KSB0aGlzLT5yaWdodCA9IHJpZ2h0OworICAgICAgICAgICAgaWYgKHRoaXMtPmJvdHRvbSA+IGJvdHRvbSkgdGhpcy0+Ym90dG9tID0gYm90dG9tOworCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgYm9vbCBpbnRlcnNlY3QoY29uc3QgUmVjdCYgcikgeworICAgICAgICByZXR1cm4gaW50ZXJzZWN0KHIubGVmdCwgci50b3AsIHIucmlnaHQsIHIuYm90dG9tKTsKKyAgICB9CisKKyAgICB2b2lkIGR1bXAoKSBjb25zdCB7CisgICAgICAgIExPR0QoIlJlY3RbbD0lZiB0PSVmIHI9JWYgYj0lZl0iLCBsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20pOworICAgIH0KKworfTsgLy8gc3RydWN0IFJlY3QKKworfTsgLy8gbmFtZXNwYWNlIHVpcmVuZGVyZXIKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX1JFQ1RfSApkaWZmIC0tZ2l0IGEvbGlicy9od3VpL1NuYXBzaG90LmggYi9saWJzL2h3dWkvU25hcHNob3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTliZTJkCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9od3VpL1NuYXBzaG90LmgKQEAgLTAsMCArMSwxNDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfVUlfU05BUFNIT1RfSAorI2RlZmluZSBBTkRST0lEX1VJX1NOQVBTSE9UX0gKKworI2luY2x1ZGUgPEdMRVMyL2dsMi5oPgorI2luY2x1ZGUgPEdMRVMyL2dsMmV4dC5oPgorCisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorCisjaW5jbHVkZSAiTWF0cml4LmgiCisjaW5jbHVkZSAiUmVjdC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgdWlyZW5kZXJlciB7CisKKy8qKgorICogQSBzbmFwc2hvdCBob2xkcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgcmVuZGVyaW5nCisgKiBzdXJmYWNlLiBBIHNuYXBzaG90IGlzIHVzdWFsbHkgY3JlYXRlZCB3aGVuZXZlciB0aGUgdXNlciBjYWxscyBzYXZlKCkKKyAqIGFuZCBkaXNjYXJkZWQgd2hlbiB0aGUgdXNlciBjYWxscyByZXN0b3JlKCkuIE9uY2UgYSBzbmFwc2hvdCBpcyBjcmVhdGVkLAorICogaXQgY2FuIGhvbGQgaW5mb3JtYXRpb24gZm9yIGRlZmVycmVkIHJlbmRlcmluZy4KKyAqCisgKiBFYWNoIHNuYXBzaG90IGhhcyBhIGxpbmsgdG8gYSBwcmV2aW91cyBzbmFwc2hvdCwgaW5kaWNhdGluZyB0aGUgcHJldmlvdXMKKyAqIHN0YXRlIG9mIHRoZSByZW5kZXJlci4KKyAqLworY2xhc3MgU25hcHNob3Q6IHB1YmxpYyBMaWdodFJlZkJhc2U8U25hcHNob3Q+IHsKK3B1YmxpYzoKKyAgICBTbmFwc2hvdCgpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb3BpZXMgdGhlIHNwZWNpZmllZCBzbmFwc2hvdC4gT25seSB0aGUgdHJhbnNmb3JtIGFuZCBjbGlwIHJlY3RhbmdsZQorICAgICAqIGFyZSBjb3BpZWQuIFRoZSBsYXllciBpbmZvcm1hdGlvbiBpcyBzZXQgdG8gMCBhbmQgdGhlIHRyYW5zZm9ybSBpcworICAgICAqIGFzc3VtZWQgdG8gYmUgZGlydHkuIFRoZSBzcGVjaWZpZWQgc25hcHNob3QgaXMgc3RvcmVkIGFzIHRoZSBwcmV2aW91cworICAgICAqIHNuYXBzaG90LgorICAgICAqLworICAgIFNuYXBzaG90KGNvbnN0IHNwPFNuYXBzaG90PiBzKToKKyAgICAgICAgICAgIHRyYW5zZm9ybShzLT50cmFuc2Zvcm0pLAorICAgICAgICAgICAgY2xpcFJlY3Qocy0+Y2xpcFJlY3QpLAorICAgICAgICAgICAgZmxhZ3Moa0ZsYWdEaXJ0eVRyYW5zZm9ybSksCisgICAgICAgICAgICBwcmV2aW91cyhzKSwKKyAgICAgICAgICAgIGxheWVyKDAuMGYsIDAuMGYsIDAuMGYsIDAuMGYpLAorICAgICAgICAgICAgdGV4dHVyZSgwKSwKKyAgICAgICAgICAgIGZibygwKSwKKyAgICAgICAgICAgIGFscGhhKDI1NSkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIFZhcmlvdXMgZmxhZ3Mgc2V0IG9uICNmbGFncy4KKyAgICAgKi8KKyAgICBlbnVtIEZsYWdzIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEluZGljYXRlcyB0aGF0IHRoZSBjbGlwIHJlZ2lvbiB3YXMgbW9kaWZpZWQuIFdoZW4gdGhpcworICAgICAgICAgKiBzbmFwc2hvdCBpcyByZXN0b3JlZCBzbyBtdXN0IHRoZSBjbGlwLgorICAgICAgICAgKi8KKyAgICAgICAga0ZsYWdDbGlwU2V0ID0gMHgxLAorICAgICAgICAvKioKKyAgICAgICAgICogSW5kaWNhdGVzIHRoYXQgdGhlIHNuYXBzaG90IGhvbGRzIG5ldyB0cmFuc2Zvcm0KKyAgICAgICAgICogaW5mb3JtYXRpb24uCisgICAgICAgICAqLworICAgICAgICBrRmxhZ0RpcnR5VHJhbnNmb3JtID0gMHgyLAorICAgICAgICAvKioKKyAgICAgICAgICogSW5kaWNhdGVzIHRoYXQgdGhpcyBzbmFwc2hvdCB3YXMgY3JlYXRlZCB3aGVuIHNhdmluZworICAgICAgICAgKiBhIG5ldyBsYXllci4KKyAgICAgICAgICovCisgICAgICAgIGtGbGFnSXNMYXllciA9IDB4NCwKKyAgICB9OworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgY3VycmVudCBjbGlwIHJlZ2lvbiBtYXBwZWQgYnkgdGhlIGN1cnJlbnQgdHJhbnNmb3JtLgorICAgICAqLworICAgIGNvbnN0IFJlY3QmIGdldE1hcHBlZENsaXAoKSB7CisgICAgICAgIGlmIChmbGFncyAmIGtGbGFnRGlydHlUcmFuc2Zvcm0pIHsKKyAgICAgICAgICAgIGZsYWdzICY9IH5rRmxhZ0RpcnR5VHJhbnNmb3JtOworICAgICAgICAgICAgbWFwcGVkQ2xpcC5zZXQoY2xpcFJlY3QpOworICAgICAgICAgICAgdHJhbnNmb3JtLm1hcFJlY3QobWFwcGVkQ2xpcCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1hcHBlZENsaXA7CisgICAgfQorCisgICAgLyoqCisgICAgICogTG9jYWwgdHJhbnNmb3JtYXRpb24uIEhvbGRzIHRoZSBjdXJyZW50IHRyYW5zbGF0aW9uLCBzY2FsZSBhbmQKKyAgICAgKiByb3RhdGlvbiB2YWx1ZXMuCisgICAgICovCisgICAgbWF0NCB0cmFuc2Zvcm07CisKKyAgICAvKioKKyAgICAgKiBDdXJyZW50IGNsaXAgcmVnaW9uLgorICAgICAqLworICAgIFJlY3QgY2xpcFJlY3Q7CisKKyAgICAvKioKKyAgICAgKiBEaXJ0eSBmbGFncy4KKyAgICAgKi8KKyAgICBpbnQgZmxhZ3M7CisKKyAgICAvKioKKyAgICAgKiBQcmV2aW91cyBzbmFwc2hvdC4KKyAgICAgKi8KKyAgICBzcDxTbmFwc2hvdD4gcHJldmlvdXM7CisKKyAgICAvKioKKyAgICAgKiBDb29yZGluYXRlcyBvZiB0aGUgbGF5ZXIgY29ycmVzcG9uZGluZyB0byB0aGlzIHNuYXBzaG90LgorICAgICAqIE9ubHkgc2V0IHdoZW4gdGhlIGZsYWcga0ZsYWdJc0xheWVyIGlzIHNldC4KKyAgICAgKi8KKyAgICBSZWN0IGxheWVyOworICAgIC8qKgorICAgICAqIE5hbWUgb2YgdGhlIHRleHR1cmUgdXNlZCB0byByZW5kZXIgdGhlIGxheWVyLgorICAgICAqIE9ubHkgc2V0IHdoZW4gdGhlIGZsYWcga0ZsYWdJc0xheWVyIGlzIHNldC4KKyAgICAgKi8KKyAgICBHTHVpbnQgdGV4dHVyZTsKKyAgICAvKioKKyAgICAgKiBOYW1lIG9mIHRoZSBGQk8gdXNlZCB0byByZW5kZXIgdGhlIGxheWVyLgorICAgICAqIE9ubHkgc2V0IHdoZW4gdGhlIGZsYWcga0ZsYWdJc0xheWVyIGlzIHNldC4KKyAgICAgKi8KKyAgICBHTHVpbnQgZmJvOworICAgIC8qKgorICAgICAqIE9wYWNpdHkgb2YgdGhlIGxheWVyLgorICAgICAqIE9ubHkgc2V0IHdoZW4gdGhlIGZsYWcga0ZsYWdJc0xheWVyIGlzIHNldC4KKyAgICAgKi8KKyAgICBmbG9hdCBhbHBoYTsKKworcHJpdmF0ZToKKyAgICAvLyBDbGlwcGluZyByZWN0YW5nbGUgbWFwcGVkIHdpdGggdGhlIHRyYW5zZm9ybQorICAgIFJlY3QgbWFwcGVkQ2xpcDsKK307IC8vIGNsYXNzIFNuYXBzaG90CisKK307IC8vIG5hbWVzcGFjZSB1aXJlbmRlcmVyCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9VSV9TTkFQU0hPVF9ICmRpZmYgLS1naXQgYS9saWJzL2h3dWkvc2hhZGVycy9kcmF3Q29sb3IuZnJhZyBiL2xpYnMvaHd1aS9zaGFkZXJzL2RyYXdDb2xvci5mcmFnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4NGM0N2IKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2h3dWkvc2hhZGVycy9kcmF3Q29sb3IuZnJhZwpAQCAtMCwwICsxLDkgQEAKK1NIQURFUl9TT1VSQ0UoZ0RyYXdDb2xvckZyYWdtZW50U2hhZGVyLAorCit2YXJ5aW5nIGxvd3AgdmVjNCBvdXRDb2xvcjsKKwordm9pZCBtYWluKHZvaWQpIHsKKyAgICBnbF9GcmFnQ29sb3IgPSBvdXRDb2xvcjsKK30KKworKTsKZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9zaGFkZXJzL2RyYXdDb2xvci52ZXJ0IGIvbGlicy9od3VpL3NoYWRlcnMvZHJhd0NvbG9yLnZlcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2VmNmU0OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvaHd1aS9zaGFkZXJzL2RyYXdDb2xvci52ZXJ0CkBAIC0wLDAgKzEsMTcgQEAKK1NIQURFUl9TT1VSQ0UoZ0RyYXdDb2xvclZlcnRleFNoYWRlciwKKworYXR0cmlidXRlIHZlYzQgcG9zaXRpb247CithdHRyaWJ1dGUgdmVjNCBjb2xvcjsKKwordW5pZm9ybSBtYXQ0IHByb2plY3Rpb247Cit1bmlmb3JtIG1hdDQgbW9kZWxWaWV3OwordW5pZm9ybSBtYXQ0IHRyYW5zZm9ybTsKKwordmFyeWluZyB2ZWM0IG91dENvbG9yOworCit2b2lkIG1haW4odm9pZCkgeworICAgIG91dENvbG9yID0gY29sb3I7CisgICAgZ2xfUG9zaXRpb24gPSBwcm9qZWN0aW9uICogdHJhbnNmb3JtICogbW9kZWxWaWV3ICogcG9zaXRpb247Cit9CisKKyk7CmRpZmYgLS1naXQgYS9saWJzL2h3dWkvc2hhZGVycy9kcmF3VGV4dHVyZS5mcmFnIGIvbGlicy9od3VpL3NoYWRlcnMvZHJhd1RleHR1cmUuZnJhZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YmQ0MjBlCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9od3VpL3NoYWRlcnMvZHJhd1RleHR1cmUuZnJhZwpAQCAtMCwwICsxLDEyIEBACitTSEFERVJfU09VUkNFKGdEcmF3VGV4dHVyZUZyYWdtZW50U2hhZGVyLAorCit2YXJ5aW5nIGxvd3AgdmVjNCBvdXRDb2xvcjsKK3ZhcnlpbmcgbWVkaXVtcCB2ZWMyIG91dFRleENvb3JkczsKKwordW5pZm9ybSBzYW1wbGVyMkQgc2FtcGxlcjsKKwordm9pZCBtYWluKHZvaWQpIHsKKyAgICBnbF9GcmFnQ29sb3IgPSB0ZXh0dXJlMkQoc2FtcGxlciwgb3V0VGV4Q29vcmRzKSAqIG91dENvbG9yOworfQorCispOwpkaWZmIC0tZ2l0IGEvbGlicy9od3VpL3NoYWRlcnMvZHJhd1RleHR1cmUudmVydCBiL2xpYnMvaHd1aS9zaGFkZXJzL2RyYXdUZXh0dXJlLnZlcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzEwYTgxMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvaHd1aS9zaGFkZXJzL2RyYXdUZXh0dXJlLnZlcnQKQEAgLTAsMCArMSwyMCBAQAorU0hBREVSX1NPVVJDRShnRHJhd1RleHR1cmVWZXJ0ZXhTaGFkZXIsCisKK2F0dHJpYnV0ZSB2ZWM0IHBvc2l0aW9uOworYXR0cmlidXRlIHZlYzIgdGV4Q29vcmRzOworYXR0cmlidXRlIHZlYzQgY29sb3I7CisKK3VuaWZvcm0gbWF0NCBwcm9qZWN0aW9uOwordW5pZm9ybSBtYXQ0IG1vZGVsVmlldzsKK3VuaWZvcm0gbWF0NCB0cmFuc2Zvcm07CisKK3ZhcnlpbmcgdmVjNCBvdXRDb2xvcjsKK3ZhcnlpbmcgdmVjMiBvdXRUZXhDb29yZHM7CisKK3ZvaWQgbWFpbih2b2lkKSB7CisgICAgb3V0Q29sb3IgPSBjb2xvcjsKKyAgICBvdXRUZXhDb29yZHMgPSB0ZXhDb29yZHM7CisgICAgZ2xfUG9zaXRpb24gPSBwcm9qZWN0aW9uICogdHJhbnNmb3JtICogbW9kZWxWaWV3ICogcG9zaXRpb247Cit9CisKKyk7CmRpZmYgLS1naXQgYS9saWJzL3JzL0FuZHJvaWQubWsgYi9saWJzL3JzL0FuZHJvaWQubWsKaW5kZXggOTg0NjRhMC4uN2FmYzRmMiAxMDA2NDQKLS0tIGEvbGlicy9ycy9BbmRyb2lkLm1rCisrKyBiL2xpYnMvcnMvQW5kcm9pZC5tawpAQCAtNzYsMzQgKzc2LDQ1IEBACiBMT0NBTF9TUkNfRklMRVM6PSBcCiAJcnNBZGFwdGVyLmNwcCBcCiAJcnNBbGxvY2F0aW9uLmNwcCBcCisJcnNBbmltYXRpb24uY3BwIFwKIAlyc0NvbXBvbmVudC5jcHAgXAogCXJzQ29udGV4dC5jcHAgXAogCXJzRGV2aWNlLmNwcCBcCiAJcnNFbGVtZW50LmNwcCBcCi0gICAgICAgIHJzRmlsZUEzRC5jcHAgXAorCXJzRmlsZUEzRC5jcHAgXAorCXJzRm9udC5jcHAgXAogCXJzTGlnaHQuY3BwIFwKIAlyc0xvY2tsZXNzRmlmby5jcHAgXAogCXJzT2JqZWN0QmFzZS5jcHAgXAogCXJzTWF0cml4LmNwcCBcCi0gICAgICAgIHJzTWVzaC5jcHAgXAotCXJzTm9pc2UuY3BwIFwKKwlyc01lc2guY3BwIFwKKwlyc011dGV4LmNwcCBcCiAJcnNQcm9ncmFtLmNwcCBcCiAJcnNQcm9ncmFtRnJhZ21lbnQuY3BwIFwKLQlyc1Byb2dyYW1GcmFnbWVudFN0b3JlLmNwcCBcCisJcnNQcm9ncmFtU3RvcmUuY3BwIFwKIAlyc1Byb2dyYW1SYXN0ZXIuY3BwIFwKIAlyc1Byb2dyYW1WZXJ0ZXguY3BwIFwKIAlyc1NhbXBsZXIuY3BwIFwKIAlyc1NjcmlwdC5jcHAgXAogCXJzU2NyaXB0Qy5jcHAgXAogCXJzU2NyaXB0Q19MaWIuY3BwIFwKLSAgICAgICAgcnNTaGFkZXJDYWNoZS5jcHAgXAorCXJzU2NyaXB0Q19MaWJDTC5jcHAgXAorCXJzU2NyaXB0Q19MaWJHTC5jcHAgXAorCXJzU2hhZGVyQ2FjaGUuY3BwIFwKKwlyc1NpZ25hbC5jcHAgXAogCXJzU2ltcGxlTWVzaC5jcHAgXAorCXJzU3RyZWFtLmNwcCBcCiAJcnNUaHJlYWRJTy5jcHAgXAogCXJzVHlwZS5jcHAgXAogCXJzVmVydGV4QXJyYXkuY3BwCiAKIAotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyArPSBsaWJjdXRpbHMgbGlidXRpbHMgbGliRUdMIGxpYkdMRVN2MV9DTSBsaWJHTEVTdjIgbGlidWkgbGliYWNjCitMT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IGxpYmN1dGlscyBsaWJ1dGlscyBsaWJFR0wgbGliR0xFU3YxX0NNIGxpYkdMRVN2MiBsaWJ1aSBsaWJiY2MKKworTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBsaWJmdDIKKworTE9DQUxfQ19JTkNMVURFUyArPSBleHRlcm5hbC9mcmVldHlwZS9pbmNsdWRlCisKIExPQ0FMX0xETElCUyA6PSAtbHB0aHJlYWQgLWxkbAogTE9DQUxfTU9EVUxFOj0gbGliUlMKIExPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCmRpZmYgLS1naXQgYS9saWJzL3JzL1JlbmRlclNjcmlwdC5oIGIvbGlicy9ycy9SZW5kZXJTY3JpcHQuaAppbmRleCBkMjgwZjUwLi4xNDI4MzE4IDEwMDY0NAotLS0gYS9saWJzL3JzL1JlbmRlclNjcmlwdC5oCisrKyBiL2xpYnMvcnMvUmVuZGVyU2NyaXB0LmgKQEAgLTMwLDIwICszMCwyMyBAQAogdHlwZWRlZiB2b2lkICogUnNBZGFwdGVyMUQ7CiB0eXBlZGVmIHZvaWQgKiBSc0FkYXB0ZXIyRDsKIHR5cGVkZWYgdm9pZCAqIFJzQWxsb2NhdGlvbjsKK3R5cGVkZWYgdm9pZCAqIFJzQW5pbWF0aW9uOwogdHlwZWRlZiB2b2lkICogUnNDb250ZXh0OwogdHlwZWRlZiB2b2lkICogUnNEZXZpY2U7CiB0eXBlZGVmIHZvaWQgKiBSc0VsZW1lbnQ7CiB0eXBlZGVmIHZvaWQgKiBSc0ZpbGU7Cit0eXBlZGVmIHZvaWQgKiBSc0ZvbnQ7CiB0eXBlZGVmIHZvaWQgKiBSc1NhbXBsZXI7CiB0eXBlZGVmIHZvaWQgKiBSc1NjcmlwdDsKIHR5cGVkZWYgdm9pZCAqIFJzU2ltcGxlTWVzaDsKIHR5cGVkZWYgdm9pZCAqIFJzVHlwZTsKIHR5cGVkZWYgdm9pZCAqIFJzTGlnaHQ7Cit0eXBlZGVmIHZvaWQgKiBSc09iamVjdEJhc2U7CiAKIHR5cGVkZWYgdm9pZCAqIFJzUHJvZ3JhbTsKIHR5cGVkZWYgdm9pZCAqIFJzUHJvZ3JhbVZlcnRleDsKIHR5cGVkZWYgdm9pZCAqIFJzUHJvZ3JhbUZyYWdtZW50OwotdHlwZWRlZiB2b2lkICogUnNQcm9ncmFtRnJhZ21lbnRTdG9yZTsKK3R5cGVkZWYgdm9pZCAqIFJzUHJvZ3JhbVN0b3JlOwogdHlwZWRlZiB2b2lkICogUnNQcm9ncmFtUmFzdGVyOwogCiB0eXBlZGVmIHZvaWQgKCogUnNCaXRtYXBDYWxsYmFja190KSh2b2lkICopOwpAQCAtODMsNiArODYsOCBAQAogICAgIFJTX1RZUEVfVU5TSUdORURfMzIsCiAgICAgUlNfVFlQRV9VTlNJR05FRF82NCwKIAorICAgIFJTX1RZUEVfQk9PTEVBTiwKKwogICAgIFJTX1RZUEVfVU5TSUdORURfNV82XzUsCiAgICAgUlNfVFlQRV9VTlNJR05FRF81XzVfNV8xLAogICAgIFJTX1RZUEVfVU5TSUdORURfNF80XzRfNCwKQEAgLTEwMSwxOSArMTA2LDEyIEBACiAKIGVudW0gUnNEYXRhS2luZCB7CiAgICAgUlNfS0lORF9VU0VSLAotICAgIFJTX0tJTkRfQ09MT1IsCi0gICAgUlNfS0lORF9QT1NJVElPTiwKLSAgICBSU19LSU5EX1RFWFRVUkUsCi0gICAgUlNfS0lORF9OT1JNQUwsCi0gICAgUlNfS0lORF9JTkRFWCwKLSAgICBSU19LSU5EX1BPSU5UX1NJWkUsCiAKLSAgICBSU19LSU5EX1BJWEVMX0wsCisgICAgUlNfS0lORF9QSVhFTF9MID0gNywKICAgICBSU19LSU5EX1BJWEVMX0EsCiAgICAgUlNfS0lORF9QSVhFTF9MQSwKICAgICBSU19LSU5EX1BJWEVMX1JHQiwKICAgICBSU19LSU5EX1BJWEVMX1JHQkEsCi0KIH07CiAKIGVudW0gUnNTYW1wbGVyUGFyYW0gewpAQCAtMjA1LDkgKzIwMyw1MyBAQAogZW51bSBSc0Vycm9yIHsKICAgICBSU19FUlJPUl9OT05FLAogICAgIFJTX0VSUk9SX0JBRF9TSEFERVIsCi0gICAgUlNfRVJST1JfQkFEX1NDUklQVAorICAgIFJTX0VSUk9SX0JBRF9TQ1JJUFQsCisgICAgUlNfRVJST1JfQkFEX1ZBTFVFLAorICAgIFJTX0VSUk9SX09VVF9PRl9NRU1PUlkKIH07CiAKK2VudW0gUnNBbmltYXRpb25JbnRlcnBvbGF0aW9uIHsKKyAgICBSU19BTklNQVRJT05fSU5URVJQT0xBVElPTl9TVEVQLAorICAgIFJTX0FOSU1BVElPTl9JTlRFUlBPTEFUSU9OX0xJTkVBUiwKKyAgICBSU19BTklNQVRJT05fSU5URVJQT0xBVElPTl9CRVpJRVIsCisgICAgUlNfQU5JTUFUSU9OX0lOVEVSUE9MQVRJT05fQ0FSRElOQUwsCisgICAgUlNfQU5JTUFUSU9OX0lOVEVSUE9MQVRJT05fSEVSTUlURSwKKyAgICBSU19BTklNQVRJT05fSU5URVJQT0xBVElPTl9CU1BMSU5FCit9OworCitlbnVtIFJzQW5pbWF0aW9uRWRnZSB7CisgICAgUlNfQU5JTUFUSU9OX0VER0VfVU5ERUZJTkVELAorICAgIFJTX0FOSU1BVElPTl9FREdFX0NPTlNUQU5ULAorICAgIFJTX0FOSU1BVElPTl9FREdFX0dSQURJRU5ULAorICAgIFJTX0FOSU1BVElPTl9FREdFX0NZQ0xFLAorICAgIFJTX0FOSU1BVElPTl9FREdFX09TQ0lMTEFURSwKKyAgICBSU19BTklNQVRJT05fRURHRV9DWUxFX1JFTEFUSVZFCit9OworCitlbnVtIFJzQTNEQ2xhc3NJRCB7CisgICAgUlNfQTNEX0NMQVNTX0lEX1VOS05PV04sCisgICAgUlNfQTNEX0NMQVNTX0lEX01FU0gsCisgICAgUlNfQTNEX0NMQVNTX0lEX1NJTVBMRV9NRVNILAorICAgIFJTX0EzRF9DTEFTU19JRF9UWVBFLAorICAgIFJTX0EzRF9DTEFTU19JRF9FTEVNRU5ULAorICAgIFJTX0EzRF9DTEFTU19JRF9BTExPQ0FUSU9OLAorICAgIFJTX0EzRF9DTEFTU19JRF9QUk9HUkFNX1ZFUlRFWCwKKyAgICBSU19BM0RfQ0xBU1NfSURfUFJPR1JBTV9SQVNURVIsCisgICAgUlNfQTNEX0NMQVNTX0lEX1BST0dSQU1fRlJBR01FTlQsCisgICAgUlNfQTNEX0NMQVNTX0lEX1BST0dSQU1fU1RPUkUsCisgICAgUlNfQTNEX0NMQVNTX0lEX1NBTVBMRVIsCisgICAgUlNfQTNEX0NMQVNTX0lEX0FOSU1BVElPTiwKKyAgICBSU19BM0RfQ0xBU1NfSURfTElHSFQsCisgICAgUlNfQTNEX0NMQVNTX0lEX0FEQVBURVJfMUQsCisgICAgUlNfQTNEX0NMQVNTX0lEX0FEQVBURVJfMkQsCisgICAgUlNfQTNEX0NMQVNTX0lEX1NDUklQVF9DCit9OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgUnNBM0RDbGFzc0lEIGNsYXNzSUQ7CisgICAgY29uc3QgY2hhciogb2JqZWN0TmFtZTsKK30gUnNGaWxlSW5kZXhFbnRyeTsKKwogI2lmbmRlZiBOT19SU19GVU5DUwogI2luY2x1ZGUgInJzZ0FwaUZ1bmNEZWNsLmgiCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYnMvcnMvUmVuZGVyU2NyaXB0RW52LmggYi9saWJzL3JzL1JlbmRlclNjcmlwdEVudi5oCmluZGV4IDk5YjhjMDQuLjE0NGU1MzkgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvUmVuZGVyU2NyaXB0RW52LmgKKysrIGIvbGlicy9ycy9SZW5kZXJTY3JpcHRFbnYuaApAQCAtMTIsNyArMTIsNyBAQAogdHlwZWRlZiB2b2lkICogUnNTaW1wbGVNZXNoOwogdHlwZWRlZiB2b2lkICogUnNUeXBlOwogdHlwZWRlZiB2b2lkICogUnNQcm9ncmFtRnJhZ21lbnQ7Ci10eXBlZGVmIHZvaWQgKiBSc1Byb2dyYW1GcmFnbWVudFN0b3JlOwordHlwZWRlZiB2b2lkICogUnNQcm9ncmFtU3RvcmU7CiB0eXBlZGVmIHZvaWQgKiBSc0xpZ2h0OwogCiAKZGlmZiAtLWdpdCBhL2xpYnMvcnMvU2NyaXB0Q19Nb2RlbHZpZXdlci5qYXZhIGIvbGlicy9ycy9TY3JpcHRDX01vZGVsdmlld2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDgzZmI2MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvU2NyaXB0Q19Nb2RlbHZpZXdlci5qYXZhCkBAIC0wLDAgKzEsMTE4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5tb2RlbHZpZXdlcjsKKworaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0Lio7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworcHVibGljIGNsYXNzIFNjcmlwdENfTW9kZWx2aWV3ZXIgZXh0ZW5kcyBTY3JpcHRDIHsKKyAgICAvLyBDb25zdHJ1Y3RvcgorICAgIHB1YmxpYyAgU2NyaXB0Q19Nb2RlbHZpZXdlcihSZW5kZXJTY3JpcHQgcnMsIFJlc291cmNlcyByZXNvdXJjZXMsIGludCBpZCwgYm9vbGVhbiBpc1Jvb3QpIHsKKyAgICAgICAgc3VwZXIocnMsIHJlc291cmNlcywgaWQsIGlzUm9vdCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IG1FeHBvcnRWYXJJZHhfZ1BWQmFja2dyb3VuZCA9IDA7CisgICAgcHJpdmF0ZSBQcm9ncmFtVmVydGV4IG1FeHBvcnRWYXJfZ1BWQmFja2dyb3VuZDsKKyAgICBwdWJsaWMgdm9pZCBzZXRfZ1BWQmFja2dyb3VuZChQcm9ncmFtVmVydGV4IHYpIHsKKyAgICAgICAgbUV4cG9ydFZhcl9nUFZCYWNrZ3JvdW5kID0gdjsKKyAgICAgICAgc2V0VmFyKG1FeHBvcnRWYXJJZHhfZ1BWQmFja2dyb3VuZCwgKHYgPT0gbnVsbCkgPyAwIDogdi5nZXRJRCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgUHJvZ3JhbVZlcnRleCBnZXRfZ1BWQmFja2dyb3VuZCgpIHsKKyAgICAgICAgcmV0dXJuIG1FeHBvcnRWYXJfZ1BWQmFja2dyb3VuZDsKKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgbUV4cG9ydFZhcklkeF9nUEZCYWNrZ3JvdW5kID0gMTsKKyAgICBwcml2YXRlIFByb2dyYW1GcmFnbWVudCBtRXhwb3J0VmFyX2dQRkJhY2tncm91bmQ7CisgICAgcHVibGljIHZvaWQgc2V0X2dQRkJhY2tncm91bmQoUHJvZ3JhbUZyYWdtZW50IHYpIHsKKyAgICAgICAgbUV4cG9ydFZhcl9nUEZCYWNrZ3JvdW5kID0gdjsKKyAgICAgICAgc2V0VmFyKG1FeHBvcnRWYXJJZHhfZ1BGQmFja2dyb3VuZCwgKHYgPT0gbnVsbCkgPyAwIDogdi5nZXRJRCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgUHJvZ3JhbUZyYWdtZW50IGdldF9nUEZCYWNrZ3JvdW5kKCkgeworICAgICAgICByZXR1cm4gbUV4cG9ydFZhcl9nUEZCYWNrZ3JvdW5kOworICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBtRXhwb3J0VmFySWR4X2dUR3JpZCA9IDI7CisgICAgcHJpdmF0ZSBBbGxvY2F0aW9uIG1FeHBvcnRWYXJfZ1RHcmlkOworICAgIHB1YmxpYyB2b2lkIHNldF9nVEdyaWQoQWxsb2NhdGlvbiB2KSB7CisgICAgICAgIG1FeHBvcnRWYXJfZ1RHcmlkID0gdjsKKyAgICAgICAgc2V0VmFyKG1FeHBvcnRWYXJJZHhfZ1RHcmlkLCAodiA9PSBudWxsKSA/IDAgOiB2LmdldElEKCkpOworICAgIH0KKworICAgIHB1YmxpYyBBbGxvY2F0aW9uIGdldF9nVEdyaWQoKSB7CisgICAgICAgIHJldHVybiBtRXhwb3J0VmFyX2dUR3JpZDsKKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgbUV4cG9ydFZhcklkeF9nVGVzdE1lc2ggPSAzOworICAgIHByaXZhdGUgU2ltcGxlTWVzaCBtRXhwb3J0VmFyX2dUZXN0TWVzaDsKKyAgICBwdWJsaWMgdm9pZCBzZXRfZ1Rlc3RNZXNoKFNpbXBsZU1lc2ggdikgeworICAgICAgICBtRXhwb3J0VmFyX2dUZXN0TWVzaCA9IHY7CisgICAgICAgIHNldFZhcihtRXhwb3J0VmFySWR4X2dUZXN0TWVzaCwgKHYgPT0gbnVsbCkgPyAwIDogdi5nZXRJRCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU2ltcGxlTWVzaCBnZXRfZ1Rlc3RNZXNoKCkgeworICAgICAgICByZXR1cm4gbUV4cG9ydFZhcl9nVGVzdE1lc2g7CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IG1FeHBvcnRWYXJJZHhfZ1BGU0JhY2tncm91bmQgPSA0OworICAgIHByaXZhdGUgUHJvZ3JhbVN0b3JlIG1FeHBvcnRWYXJfZ1BGU0JhY2tncm91bmQ7CisgICAgcHVibGljIHZvaWQgc2V0X2dQRlNCYWNrZ3JvdW5kKFByb2dyYW1TdG9yZSB2KSB7CisgICAgICAgIG1FeHBvcnRWYXJfZ1BGU0JhY2tncm91bmQgPSB2OworICAgICAgICBzZXRWYXIobUV4cG9ydFZhcklkeF9nUEZTQmFja2dyb3VuZCwgKHYgPT0gbnVsbCkgPyAwIDogdi5nZXRJRCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgUHJvZ3JhbVN0b3JlIGdldF9nUEZTQmFja2dyb3VuZCgpIHsKKyAgICAgICAgcmV0dXJuIG1FeHBvcnRWYXJfZ1BGU0JhY2tncm91bmQ7CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IG1FeHBvcnRWYXJJZHhfZ1JvdGF0ZSA9IDU7CisgICAgcHJpdmF0ZSBmbG9hdCBtRXhwb3J0VmFyX2dSb3RhdGU7CisgICAgcHVibGljIHZvaWQgc2V0X2dSb3RhdGUoZmxvYXQgdikgeworICAgICAgICBtRXhwb3J0VmFyX2dSb3RhdGUgPSB2OworICAgICAgICBzZXRWYXIobUV4cG9ydFZhcklkeF9nUm90YXRlLCB2KTsKKyAgICB9CisKKyAgICBwdWJsaWMgZmxvYXQgZ2V0X2dSb3RhdGUoKSB7CisgICAgICAgIHJldHVybiBtRXhwb3J0VmFyX2dSb3RhdGU7CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IG1FeHBvcnRWYXJJZHhfZ0l0YWxpYyA9IDY7CisgICAgcHJpdmF0ZSBGb250IG1FeHBvcnRWYXJfZ0l0YWxpYzsKKyAgICBwdWJsaWMgdm9pZCBzZXRfZ0l0YWxpYyhGb250IHYpIHsKKyAgICAgICAgbUV4cG9ydFZhcl9nSXRhbGljID0gdjsKKyAgICAgICAgc2V0VmFyKG1FeHBvcnRWYXJJZHhfZ0l0YWxpYywgdik7CisgICAgfQorCisgICAgcHVibGljIEZvbnQgZ2V0X2dJdGFsaWMoKSB7CisgICAgICAgIHJldHVybiBtRXhwb3J0VmFyX2dJdGFsaWM7CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IG1FeHBvcnRWYXJJZHhfZ1RleHRBbGxvYyA9IDc7CisgICAgcHJpdmF0ZSBBbGxvY2F0aW9uIG1FeHBvcnRWYXJfZ1RleHRBbGxvYzsKKyAgICBwdWJsaWMgdm9pZCBzZXRfZ1RleHRBbGxvYyhBbGxvY2F0aW9uIHYpIHsKKyAgICAgICAgbUV4cG9ydFZhcl9nVGV4dEFsbG9jID0gdjsKKyAgICAgICAgc2V0VmFyKG1FeHBvcnRWYXJJZHhfZ1RleHRBbGxvYywgKHYgPT0gbnVsbCkgPyAwIDogdi5nZXRJRCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQWxsb2NhdGlvbiBnZXRfZ1RleHRBbGxvYygpIHsKKyAgICAgICAgcmV0dXJuIG1FeHBvcnRWYXJfZ1RleHRBbGxvYzsKKyAgICB9CisKK30KKwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL0ZpbG0vcmVzL2RyYXdhYmxlL3AwMS5wbmcgYi9saWJzL3JzL2phdmEvRmlsbS9yZXMvZHJhd2FibGUvcDAxLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTliOWJkYi4uMDAwMDAwMAotLS0gYS9saWJzL3JzL2phdmEvRmlsbS9yZXMvZHJhd2FibGUvcDAxLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9GaWxtL3Jlcy9kcmF3YWJsZS9wMDIucG5nIGIvbGlicy9ycy9qYXZhL0ZpbG0vcmVzL2RyYXdhYmxlL3AwMi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxNjJjODIuLjAwMDAwMDAKLS0tIGEvbGlicy9ycy9qYXZhL0ZpbG0vcmVzL2RyYXdhYmxlL3AwMi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvRmlsbS9yZXMvZHJhd2FibGUvcDAzLnBuZyBiL2xpYnMvcnMvamF2YS9GaWxtL3Jlcy9kcmF3YWJsZS9wMDMucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlM2UyNmMwLi4wMDAwMDAwCi0tLSBhL2xpYnMvcnMvamF2YS9GaWxtL3Jlcy9kcmF3YWJsZS9wMDMucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL0ZpbG0vcmVzL2RyYXdhYmxlL3AwNC5wbmcgYi9saWJzL3JzL2phdmEvRmlsbS9yZXMvZHJhd2FibGUvcDA0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGFlZTYwMy4uMDAwMDAwMAotLS0gYS9saWJzL3JzL2phdmEvRmlsbS9yZXMvZHJhd2FibGUvcDA0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9GaWxtL3Jlcy9kcmF3YWJsZS9wMDUucG5nIGIvbGlicy9ycy9qYXZhL0ZpbG0vcmVzL2RyYXdhYmxlL3AwNS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhYzUyNDguLjAwMDAwMDAKLS0tIGEvbGlicy9ycy9qYXZhL0ZpbG0vcmVzL2RyYXdhYmxlL3AwNS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvRmlsbS9yZXMvZHJhd2FibGUvcDA2LnBuZyBiL2xpYnMvcnMvamF2YS9GaWxtL3Jlcy9kcmF3YWJsZS9wMDYucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjUxMjYxLi4wMDAwMDAwCi0tLSBhL2xpYnMvcnMvamF2YS9GaWxtL3Jlcy9kcmF3YWJsZS9wMDYucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL0ZpbG0vcmVzL2RyYXdhYmxlL3AwNy5wbmcgYi9saWJzL3JzL2phdmEvRmlsbS9yZXMvZHJhd2FibGUvcDA3LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDhiZDkzOC4uMDAwMDAwMAotLS0gYS9saWJzL3JzL2phdmEvRmlsbS9yZXMvZHJhd2FibGUvcDA3LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9GaWxtL3Jlcy9kcmF3YWJsZS9wMDgucG5nIGIvbGlicy9ycy9qYXZhL0ZpbG0vcmVzL2RyYXdhYmxlL3AwOC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmMTc1ZTguLjAwMDAwMDAKLS0tIGEvbGlicy9ycy9qYXZhL0ZpbG0vcmVzL2RyYXdhYmxlL3AwOC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvRmlsbS9yZXMvZHJhd2FibGUvcDA5LnBuZyBiL2xpYnMvcnMvamF2YS9GaWxtL3Jlcy9kcmF3YWJsZS9wMDkucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YmYzODc0Li4wMDAwMDAwCi0tLSBhL2xpYnMvcnMvamF2YS9GaWxtL3Jlcy9kcmF3YWJsZS9wMDkucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL0ZpbG0vcmVzL2RyYXdhYmxlL3AxMC5wbmcgYi9saWJzL3JzL2phdmEvRmlsbS9yZXMvZHJhd2FibGUvcDEwLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTA4ODI3ZC4uMDAwMDAwMAotLS0gYS9saWJzL3JzL2phdmEvRmlsbS9yZXMvZHJhd2FibGUvcDEwLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9GaWxtL3Jlcy9kcmF3YWJsZS9wMTEucG5nIGIvbGlicy9ycy9qYXZhL0ZpbG0vcmVzL2RyYXdhYmxlL3AxMS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyODlmNzEuLjAwMDAwMDAKLS0tIGEvbGlicy9ycy9qYXZhL0ZpbG0vcmVzL2RyYXdhYmxlL3AxMS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvRmlsbS9yZXMvZHJhd2FibGUvcDEyLnBuZyBiL2xpYnMvcnMvamF2YS9GaWxtL3Jlcy9kcmF3YWJsZS9wMTIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMWFmMTZhNC4uMDAwMDAwMAotLS0gYS9saWJzL3JzL2phdmEvRmlsbS9yZXMvZHJhd2FibGUvcDEyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9GaWxtL3Jlcy9kcmF3YWJsZS9wMTMucG5nIGIvbGlicy9ycy9qYXZhL0ZpbG0vcmVzL2RyYXdhYmxlL3AxMy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwOGJjYmUuLjAwMDAwMDAKLS0tIGEvbGlicy9ycy9qYXZhL0ZpbG0vcmVzL2RyYXdhYmxlL3AxMy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvRmlsbS9yZXMvcmF3L2ZpbG1pbWFnZS5jIGIvbGlicy9ycy9qYXZhL0ZpbG0vcmVzL3Jhdy9maWxtaW1hZ2UuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDE1NGM2OC4uMDAwMDAwMAotLS0gYS9saWJzL3JzL2phdmEvRmlsbS9yZXMvcmF3L2ZpbG1pbWFnZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8vIEZvdW50YWluIHRlc3Qgc2NyaXB0Ci0KLSNwcmFnbWEgdmVyc2lvbigxKQotI3ByYWdtYSBzdGF0ZVZlcnRleChvcnRob1dpbmRvdykKLSNwcmFnbWEgc3RhdGVSYXN0ZXIoZmxhdCkKLSNwcmFnbWEgc3RhdGVGcmFnbWVudChQZ21GcmFnQmFja2dyb3VuZCkKLSNwcmFnbWEgc3RhdGVTdG9yZShNeUJsZW5kKQotCi0KLWludCBtYWluKHZvaWQqIGNvbiwgaW50IGZ0LCBpbnQgbGF1bmNoSUQpIHsKLSAgICBpbnQgY291bnQsIHRvdWNoLCB4LCB5LCByYXRlLCBtYXhMaWZlLCBsaWZlU2hpZnQ7Ci0gICAgaW50IGxpZmU7Ci0gICAgaW50IGN0LCBjdDI7Ci0gICAgaW50IG5ld1BhcnQ7Ci0gICAgaW50IGRyYXdDb3VudDsKLSAgICBpbnQgZHgsIGR5LCBpZHg7Ci0gICAgaW50IHBvc3gscG9zeTsKLSAgICBpbnQgYzsKLSAgICBpbnQgc3JjSWR4OwotICAgIGludCBkc3RJZHg7Ci0KLSAgICBjb3VudCA9IGxvYWRJMzIoY29uLCAwLCAxKTsKLSAgICB0b3VjaCA9IGxvYWRJMzIoY29uLCAwLCAyKTsKLSAgICB4ID0gbG9hZEkzMihjb24sIDAsIDMpOwotICAgIHkgPSBsb2FkSTMyKGNvbiwgMCwgNCk7Ci0KLSAgICByYXRlID0gNDsKLSAgICBtYXhMaWZlID0gKGNvdW50IC8gcmF0ZSkgLSAxOwotICAgIGxpZmVTaGlmdCA9IDA7Ci0gICAgewotICAgICAgICBsaWZlID0gbWF4TGlmZTsKLSAgICAgICAgd2hpbGUgKGxpZmUgPiAyNTUpIHsKLSAgICAgICAgICAgIGxpZmUgPSBsaWZlID4+IDE7Ci0gICAgICAgICAgICBsaWZlU2hpZnQgKys7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBkcmF3UmVjdChjb24sIDAsIDI1NiwgMCwgNTEyKTsKLSAgICBjb250ZXh0QmluZFByb2dyYW1GcmFnbWVudChjb24sIE5BTUVEX1BnbUZyYWdQYXJ0cyk7Ci0KLSAgICBpZiAodG91Y2gpIHsKLSAgICAgICAgbmV3UGFydCA9IGxvYWRJMzIoY29uLCAyLCAwKTsKLSAgICAgICAgZm9yIChjdDI9MDsgY3QyPHJhdGU7IGN0MisrKSB7Ci0gICAgICAgICAgICBkeCA9IHNjcmlwdFJhbmQoY29uLCAweDEwMDAwKSAtIDB4ODAwMDsKLSAgICAgICAgICAgIGR5ID0gc2NyaXB0UmFuZChjb24sIDB4MTAwMDApIC0gMHg4MDAwOwotCi0gICAgICAgICAgICBpZHggPSBuZXdQYXJ0ICogNSArIDE7Ci0gICAgICAgICAgICBzdG9yZUkzMihjb24sIDIsIGlkeCwgZHgpOwotICAgICAgICAgICAgc3RvcmVJMzIoY29uLCAyLCBpZHggKyAxLCBkeSk7Ci0gICAgICAgICAgICBzdG9yZUkzMihjb24sIDIsIGlkeCArIDIsIG1heExpZmUpOwotICAgICAgICAgICAgc3RvcmVJMzIoY29uLCAyLCBpZHggKyAzLCB4IDw8IDE2KTsKLSAgICAgICAgICAgIHN0b3JlSTMyKGNvbiwgMiwgaWR4ICsgNCwgeSA8PCAxNik7Ci0KLSAgICAgICAgICAgIG5ld1BhcnQrKzsKLSAgICAgICAgICAgIGlmIChuZXdQYXJ0ID49IGNvdW50KSB7Ci0gICAgICAgICAgICAgICAgbmV3UGFydCA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgc3RvcmVJMzIoY29uLCAyLCAwLCBuZXdQYXJ0KTsKLSAgICB9Ci0KLSAgICBkcmF3Q291bnQgPSAwOwotICAgIGZvciAoY3Q9MDsgY3QgPCBjb3VudDsgY3QrKykgewotICAgICAgICBzcmNJZHggPSBjdCAqIDUgKyAxOwotCi0gICAgICAgIGR4ID0gbG9hZEkzMihjb24sIDIsIHNyY0lkeCk7Ci0gICAgICAgIGR5ID0gbG9hZEkzMihjb24sIDIsIHNyY0lkeCArIDEpOwotICAgICAgICBsaWZlID0gbG9hZEkzMihjb24sIDIsIHNyY0lkeCArIDIpOwotICAgICAgICBwb3N4ID0gbG9hZEkzMihjb24sIDIsIHNyY0lkeCArIDMpOwotICAgICAgICBwb3N5ID0gbG9hZEkzMihjb24sIDIsIHNyY0lkeCArIDQpOwotCi0gICAgICAgIGlmIChsaWZlKSB7Ci0gICAgICAgICAgICBpZiAocG9zeSA8ICg0ODAgPDwgMTYpKSB7Ci0gICAgICAgICAgICAgICAgZHN0SWR4ID0gZHJhd0NvdW50ICogOTsKLSAgICAgICAgICAgICAgICBjID0gMHhmZmFmY2YgfCAoKGxpZmUgPj4gbGlmZVNoaWZ0KSA8PCAyNCk7Ci0KLSAgICAgICAgICAgICAgICBzdG9yZVUzMihjb24sIDEsIGRzdElkeCwgYyk7Ci0gICAgICAgICAgICAgICAgc3RvcmVJMzIoY29uLCAxLCBkc3RJZHggKyAxLCBwb3N4KTsKLSAgICAgICAgICAgICAgICBzdG9yZUkzMihjb24sIDEsIGRzdElkeCArIDIsIHBvc3kpOwotCi0gICAgICAgICAgICAgICAgc3RvcmVVMzIoY29uLCAxLCBkc3RJZHggKyAzLCBjKTsKLSAgICAgICAgICAgICAgICBzdG9yZUkzMihjb24sIDEsIGRzdElkeCArIDQsIHBvc3ggKyAweDEwMDAwKTsKLSAgICAgICAgICAgICAgICBzdG9yZUkzMihjb24sIDEsIGRzdElkeCArIDUsIHBvc3kgKyBkeSAqIDQpOwotCi0gICAgICAgICAgICAgICAgc3RvcmVVMzIoY29uLCAxLCBkc3RJZHggKyA2LCBjKTsKLSAgICAgICAgICAgICAgICBzdG9yZUkzMihjb24sIDEsIGRzdElkeCArIDcsIHBvc3ggLSAweDEwMDAwKTsKLSAgICAgICAgICAgICAgICBzdG9yZUkzMihjb24sIDEsIGRzdElkeCArIDgsIHBvc3kgKyBkeSAqIDQpOwotICAgICAgICAgICAgICAgIGRyYXdDb3VudCArKzsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKGR5ID4gMCkgewotICAgICAgICAgICAgICAgICAgICBkeSA9ICgtZHkpID4+IDE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwb3N4ID0gcG9zeCArIGR4OwotICAgICAgICAgICAgcG9zeSA9IHBvc3kgKyBkeTsKLSAgICAgICAgICAgIGR5ID0gZHkgKyAweDQwMDsKLSAgICAgICAgICAgIGxpZmUgLS07Ci0KLSAgICAgICAgICAgIC8vc3RvcmVJMzIoY29uLCAyLCBzcmNJZHgsIGR4KTsKLSAgICAgICAgICAgIHN0b3JlSTMyKGNvbiwgMiwgc3JjSWR4ICsgMSwgZHkpOwotICAgICAgICAgICAgc3RvcmVJMzIoY29uLCAyLCBzcmNJZHggKyAyLCBsaWZlKTsKLSAgICAgICAgICAgIHN0b3JlSTMyKGNvbiwgMiwgc3JjSWR4ICsgMywgcG9zeCk7Ci0gICAgICAgICAgICBzdG9yZUkzMihjb24sIDIsIHNyY0lkeCArIDQsIHBvc3kpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgZHJhd1RyaWFuZ2xlQXJyYXkoY29uLCBOQU1FRF9QYXJ0QnVmZmVyLCBkcmF3Q291bnQpOwotICAgIHJldHVybiAxOwotfQpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL0ZpbG0vcmVzL3Jhdy9maWxtc3RyaXAuYyBiL2xpYnMvcnMvamF2YS9GaWxtL3Jlcy9yYXcvZmlsbXN0cmlwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmNzU2NzUuLjAwMDAwMDAKLS0tIGEvbGlicy9ycy9qYXZhL0ZpbG0vcmVzL3Jhdy9maWxtc3RyaXAuYworKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8vIEZvdW50YWluIHRlc3Qgc2NyaXB0Ci0KLSNwcmFnbWEgdmVyc2lvbigxKQotI3ByYWdtYSBzdGF0ZVZlcnRleChQVkJhY2tncm91bmQpCi0jcHJhZ21hIHN0YXRlRnJhZ21lbnQoUEZCYWNrZ3JvdW5kKQotI3ByYWdtYSBzdGF0ZVN0b3JlKFBTQmFja2dyb3VuZCkKLQotI2RlZmluZSBTVEFURV9UUklBTkdMRV9PRkZTRVRfQ09VTlQgMAotI2RlZmluZSBTVEFURV9MQVNUX0ZPQ1VTIDEKLQotCi0vLyBUaGUgc2NyaXB0IGVudmlyb21lbnQgaGFzIDMgZW52IGFsbG9jYXRpb25zLgotLy8gYmFuazA6IChyKSBUaGUgZW52aXJvbWVudCBzdHJ1Y3R1cmUKLS8vIGJhbmsxOiAocikgVGhlIHBvc2l0aW9uIGluZm9ybWF0aW9uCi0vLyBiYW5rMjogKHJ3KSBUaGUgdGVtcG9yYXJ5IHRleHR1cmUgc3RhdGUKLQotaW50IGxhc3RGb2N1czsKLQotaW50IG1haW4oaW50IGluZGV4KQotewotICAgIGZsb2F0IG1hdDFbMTZdOwotCi0gICAgZmxvYXQgdHJhbnMgPSBQb3MtPnRyYW5zbGF0ZTsKLSAgICBmbG9hdCByb3QgPSBQb3MtPnJvdGF0ZTsKLQotICAgIG1hdHJpeExvYWRTY2FsZShtYXQxLCAyLmYsIDIuZiwgMi5mKTsKLSAgICBtYXRyaXhUcmFuc2xhdGUobWF0MSwgMC5mLCAwLmYsIHRyYW5zKTsKLSAgICBtYXRyaXhSb3RhdGUobWF0MSwgOTAuZiwgMC5mLCAwLmYsIDEuZik7Ci0gICAgbWF0cml4Um90YXRlKG1hdDEsIHJvdCwgMS5mLCAwLmYsIDAuZik7Ci0gICAgdnBMb2FkTW9kZWxNYXRyaXgobWF0MSk7Ci0KLSAgICAvLyBEcmF3IHRoZSBsaWdodGluZyBlZmZlY3QgaW4gdGhlIHN0cmlwIGFuZCBmaWxsIHRoZSBaIGJ1ZmZlci4KLSAgICBkcmF3U2ltcGxlTWVzaChOQU1FRF9tZXNoKTsKLQotICAgIC8vIFN0YXJ0IG9mIGltYWdlcy4KLSAgICBiaW5kUHJvZ3JhbVN0b3JlKE5BTUVEX1BTSW1hZ2VzKTsKLSAgICBiaW5kUHJvZ3JhbUZyYWdtZW50KE5BTUVEX1BGSW1hZ2VzKTsKLSAgICBiaW5kUHJvZ3JhbVZlcnRleChOQU1FRF9QVkltYWdlcyk7Ci0KLSAgICBmbG9hdCBmb2N1c1BvcyA9IFBvcy0+Zm9jdXM7Ci0gICAgaW50IGZvY3VzSUQgPSAwOwotICAgIGludCBsYXN0Rm9jdXNJRCA9IGxvYWRJMzIoMiwgU1RBVEVfTEFTVF9GT0NVUyk7Ci0gICAgaW50IGltZ0NvdW50ID0gMTM7Ci0KLSAgICBpZiAodHJhbnMgPiAoLS4zZikpIHsKLSAgICAgICAgZm9jdXNJRCA9IC0xLjBmIC0gZm9jdXNQb3M7Ci0gICAgICAgIGlmIChmb2N1c0lEID49IGltZ0NvdW50KSB7Ci0gICAgICAgICAgICBmb2N1c0lEID0gLTE7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBmb2N1c0lEID0gLTE7Ci0gICAgfQotCi0gICAgLyoKLSAgICBpZiAoZm9jdXNJRCAhPSBsYXN0Rm9jdXNJRCkgewotICAgICAgICBpZiAobGFzdEZvY3VzSUQgPj0gMCkgewotICAgICAgICAgICAgdXBsb2FkVG9UZXh0dXJlKGNvbiwgZW52LT50ZXhbbGFzdEZvY3VzSURdLCAxKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZm9jdXNJRCA+PSAwKSB7Ci0gICAgICAgICAgICB1cGxvYWRUb1RleHR1cmUoY29uLCBlbnYtPnRleFtmb2N1c0lEXSwgMCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgKi8KLSAgICBsYXN0Rm9jdXMgPSBmb2N1c0lEOwotCi0gICAgaW50IHRyaWFuZ2xlT2Zmc2V0c0NvdW50ID0gUG9zLT50cmlhbmdsZU9mZnNldENvdW50OwotCi0gICAgaW50IGltZ0lkID0gMDsKLSAgICBmb3IgKGltZ0lkPTE7IGltZ0lkIDw9IGltZ0NvdW50OyBpbWdJZCsrKSB7Ci0gICAgICAgIGZsb2F0IHBvcyA9IGZvY3VzUG9zICsgaW1nSWQgKyAwLjRmOwotICAgICAgICBpbnQgb2Zmc2V0ID0gKGludClmbG9vcmYocG9zICogMi5mKTsKLSAgICAgICAgcG9zID0gcG9zIC0gMC43NWY7Ci0KLSAgICAgICAgb2Zmc2V0ID0gb2Zmc2V0ICsgdHJpYW5nbGVPZmZzZXRzQ291bnQgLyAyOwotICAgICAgICBpZiAoISgob2Zmc2V0IDwgMCkgfHwgKG9mZnNldCA+PSB0cmlhbmdsZU9mZnNldHNDb3VudCkpKSB7Ci0gICAgICAgICAgICBpbnQgc3RhcnQgPSBvZmZzZXQgLTI7Ci0gICAgICAgICAgICBpbnQgZW5kID0gb2Zmc2V0ICsgMjsKLQotICAgICAgICAgICAgaWYgKHN0YXJ0IDwgMCkgewotICAgICAgICAgICAgICAgIHN0YXJ0ID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChlbmQgPj0gdHJpYW5nbGVPZmZzZXRzQ291bnQpIHsKLSAgICAgICAgICAgICAgICBlbmQgPSB0cmlhbmdsZU9mZnNldHNDb3VudC0xOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBiaW5kVGV4dHVyZShOQU1FRF9QRkltYWdlcywgMCwgbG9hZEkzMigwLCBpbWdJZCAtIDEpKTsKLSAgICAgICAgICAgIG1hdHJpeExvYWRUcmFuc2xhdGUobWF0MSwgLXBvcyAtIGxvYWRGKDUsIHRyaWFuZ2xlT2Zmc2V0c0NvdW50IC8gMiksIDAsIDApOwotICAgICAgICAgICAgdnBMb2FkVGV4dHVyZU1hdHJpeChtYXQxKTsKLSAgICAgICAgICAgIGRyYXdTaW1wbGVNZXNoUmFuZ2UoTkFNRURfbWVzaCwgbG9hZEkzMig0LCBzdGFydCksIChsb2FkSTMyKDQsIGVuZCkgLSBsb2FkSTMyKDQsIHN0YXJ0KSkpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvRmlsbS9zcmMvY29tL2FuZHJvaWQvZmlsbS9GaWxtUlMuamF2YSBiL2xpYnMvcnMvamF2YS9GaWxtL3NyYy9jb20vYW5kcm9pZC9maWxtL0ZpbG1SUy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDA0NTAyLi4wMDAwMDAwCi0tLSBhL2xpYnMvcnMvamF2YS9GaWxtL3NyYy9jb20vYW5kcm9pZC9maWxtL0ZpbG1SUy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmZpbG07Ci0KLWltcG9ydCBqYXZhLmlvLldyaXRlcjsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci0KLWltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC4qOwotCi1wdWJsaWMgY2xhc3MgRmlsbVJTIHsKLSAgICBjbGFzcyBTdHJpcFBvc2l0aW9uIHsKLSAgICAgICAgcHVibGljIGZsb2F0IHRyYW5zbGF0ZTsKLSAgICAgICAgcHVibGljIGZsb2F0IHJvdGF0ZTsKLSAgICAgICAgcHVibGljIGZsb2F0IGZvY3VzOwotICAgICAgICBwdWJsaWMgaW50IHRyaWFuZ2xlT2Zmc2V0Q291bnQ7Ci0gICAgfQotICAgIFN0cmlwUG9zaXRpb24gbVBvcyA9IG5ldyBTdHJpcFBvc2l0aW9uKCk7Ci0KLQotICAgIHByaXZhdGUgZmluYWwgaW50IFNUQVRFX0xBU1RfRk9DVVMgPSAxOwotCi0gICAgcHVibGljIEZpbG1SUygpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBpbml0KFJlbmRlclNjcmlwdEdMIHJzLCBSZXNvdXJjZXMgcmVzLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLSAgICAgICAgbVJTID0gcnM7Ci0gICAgICAgIG1SZXMgPSByZXM7Ci0gICAgICAgIGluaXRSUygpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEZpbG1TdHJpcFBvc2l0aW9uKGludCB4LCBpbnQgeSkKLSAgICB7Ci0gICAgICAgIGlmICh4IDwgNTApIHsKLSAgICAgICAgICAgIHggPSA1MDsKLSAgICAgICAgfQotICAgICAgICBpZiAoeCA+IDI3MCkgewotICAgICAgICAgICAgeCA9IDI3MDsKLSAgICAgICAgfQotCi0gICAgICAgIGZsb2F0IGFuaW0gPSAoKGZsb2F0KXgtNTApIC8gMjcwLmY7Ci0gICAgICAgIG1Qb3MudHJhbnNsYXRlID0gMmYgKiBhbmltICsgMC41ZjsgICAvLyB0cmFuc2xhdGlvbgotICAgICAgICBtUG9zLnJvdGF0ZSA9IChhbmltICogNDApOyAgLy8gcm90YXRpb24KLSAgICAgICAgbVBvcy5mb2N1cyA9ICgoZmxvYXQpeSkgLyAxNi5mIC0gMTAuZjsgIC8vIGZvY3VzUG9zCi0gICAgICAgIG1Qb3MudHJpYW5nbGVPZmZzZXRDb3VudCA9IG1GU00ubVRyaWFuZ2xlT2Zmc2V0c0NvdW50OwotICAgICAgICBtQWxsb2NQb3MuZGF0YShtUG9zKTsKLSAgICB9Ci0KLQotICAgIHByaXZhdGUgUmVzb3VyY2VzIG1SZXM7Ci0gICAgcHJpdmF0ZSBSZW5kZXJTY3JpcHRHTCBtUlM7Ci0gICAgcHJpdmF0ZSBTY3JpcHQgbVNjcmlwdFN0cmlwOwotICAgIHByaXZhdGUgU2NyaXB0IG1TY3JpcHRJbWFnZTsKLSAgICBwcml2YXRlIFNhbXBsZXIgbVNhbXBsZXI7Ci0gICAgcHJpdmF0ZSBQcm9ncmFtU3RvcmUgbVBTQmFja2dyb3VuZDsKLSAgICBwcml2YXRlIFByb2dyYW1TdG9yZSBtUFNJbWFnZXM7Ci0gICAgcHJpdmF0ZSBQcm9ncmFtRnJhZ21lbnQgbVBGQmFja2dyb3VuZDsKLSAgICBwcml2YXRlIFByb2dyYW1GcmFnbWVudCBtUEZJbWFnZXM7Ci0gICAgcHJpdmF0ZSBQcm9ncmFtVmVydGV4IG1QVkJhY2tncm91bmQ7Ci0gICAgcHJpdmF0ZSBQcm9ncmFtVmVydGV4IG1QVkltYWdlczsKLSAgICBwcml2YXRlIFByb2dyYW1WZXJ0ZXguTWF0cml4QWxsb2NhdGlvbiBtUFZBOwotICAgIHByaXZhdGUgVHlwZSBtU3RyaXBQb3NpdGlvblR5cGU7Ci0KLSAgICBwcml2YXRlIEFsbG9jYXRpb24gbUltYWdlc1tdOwotICAgIHByaXZhdGUgQWxsb2NhdGlvbiBtQWxsb2NJRHM7Ci0gICAgcHJpdmF0ZSBBbGxvY2F0aW9uIG1BbGxvY1BvczsKLSAgICBwcml2YXRlIEFsbG9jYXRpb24gbUFsbG9jU3RhdGU7Ci0gICAgcHJpdmF0ZSBBbGxvY2F0aW9uIG1BbGxvY1BWOwotICAgIHByaXZhdGUgQWxsb2NhdGlvbiBtQWxsb2NPZmZzZXRzVGV4OwotICAgIHByaXZhdGUgQWxsb2NhdGlvbiBtQWxsb2NPZmZzZXRzOwotCi0gICAgcHJpdmF0ZSBTaW1wbGVNZXNoIG1NZXNoOwotICAgIHByaXZhdGUgTGlnaHQgbUxpZ2h0OwotCi0gICAgcHJpdmF0ZSBGaWxtU3RyaXBNZXNoIG1GU007Ci0KLSAgICBwcml2YXRlIGludFtdIG1CdWZmZXJJRHM7Ci0gICAgcHJpdmF0ZSBmbG9hdFtdIG1CdWZmZXJQb3MgPSBuZXcgZmxvYXRbM107Ci0gICAgcHJpdmF0ZSBpbnRbXSBtQnVmZmVyU3RhdGU7Ci0KLSAgICBwcml2YXRlIHZvaWQgaW5pdFBGUygpIHsKLSAgICAgICAgUHJvZ3JhbVN0b3JlLkJ1aWxkZXIgYiA9IG5ldyBQcm9ncmFtU3RvcmUuQnVpbGRlcihtUlMsIG51bGwsIG51bGwpOwotCi0gICAgICAgIGIuc2V0RGVwdGhGdW5jKFByb2dyYW1TdG9yZS5EZXB0aEZ1bmMuTEVTUyk7Ci0gICAgICAgIGIuc2V0RGl0aGVyRW5hYmxlKHRydWUpOwotICAgICAgICBiLnNldERlcHRoTWFzayh0cnVlKTsKLSAgICAgICAgbVBTQmFja2dyb3VuZCA9IGIuY3JlYXRlKCk7Ci0gICAgICAgIG1QU0JhY2tncm91bmQuc2V0TmFtZSgiUFNCYWNrZ3JvdW5kIik7Ci0KLSAgICAgICAgYi5zZXREZXB0aEZ1bmMoUHJvZ3JhbVN0b3JlLkRlcHRoRnVuYy5FUVVBTCk7Ci0gICAgICAgIGIuc2V0RGl0aGVyRW5hYmxlKGZhbHNlKTsKLSAgICAgICAgYi5zZXREZXB0aE1hc2soZmFsc2UpOwotICAgICAgICBiLnNldEJsZW5kRnVuYyhQcm9ncmFtU3RvcmUuQmxlbmRTcmNGdW5jLk9ORSwKLSAgICAgICAgICAgICAgICAgICAgICAgUHJvZ3JhbVN0b3JlLkJsZW5kRHN0RnVuYy5PTkUpOwotICAgICAgICBtUFNJbWFnZXMgPSBiLmNyZWF0ZSgpOwotICAgICAgICBtUFNJbWFnZXMuc2V0TmFtZSgiUFNJbWFnZXMiKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaW5pdFBGKCkgewotICAgICAgICBTYW1wbGVyLkJ1aWxkZXIgYnMgPSBuZXcgU2FtcGxlci5CdWlsZGVyKG1SUyk7Ci0gICAgICAgIGJzLnNldE1pbihTYW1wbGVyLlZhbHVlLkxJTkVBUik7Ly9fTUlQX0xJTkVBUik7Ci0gICAgICAgIGJzLnNldE1hZyhTYW1wbGVyLlZhbHVlLkxJTkVBUik7Ci0gICAgICAgIGJzLnNldFdyYXBTKFNhbXBsZXIuVmFsdWUuQ0xBTVApOwotICAgICAgICBicy5zZXRXcmFwVChTYW1wbGVyLlZhbHVlLldSQVApOwotICAgICAgICBtU2FtcGxlciA9IGJzLmNyZWF0ZSgpOwotCi0gICAgICAgIFByb2dyYW1GcmFnbWVudC5CdWlsZGVyIGIgPSBuZXcgUHJvZ3JhbUZyYWdtZW50LkJ1aWxkZXIobVJTKTsKLSAgICAgICAgbVBGQmFja2dyb3VuZCA9IGIuY3JlYXRlKCk7Ci0gICAgICAgIG1QRkJhY2tncm91bmQuc2V0TmFtZSgiUEZCYWNrZ3JvdW5kIik7Ci0KLSAgICAgICAgYiA9IG5ldyBQcm9ncmFtRnJhZ21lbnQuQnVpbGRlcihtUlMpOwotICAgICAgICBiLnNldFRleHR1cmUoUHJvZ3JhbUZyYWdtZW50LkJ1aWxkZXIuRW52TW9kZS5SRVBMQUNFLAotICAgICAgICAgICAgICAgICAgICAgUHJvZ3JhbUZyYWdtZW50LkJ1aWxkZXIuRm9ybWF0LlJHQkEsIDApOwotICAgICAgICBtUEZJbWFnZXMgPSBiLmNyZWF0ZSgpOwotICAgICAgICBtUEZJbWFnZXMuYmluZFNhbXBsZXIobVNhbXBsZXIsIDApOwotICAgICAgICBtUEZJbWFnZXMuc2V0TmFtZSgiUEZJbWFnZXMiKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaW5pdFBWKCkgewotICAgICAgICBtTGlnaHQgPSAobmV3IExpZ2h0LkJ1aWxkZXIobVJTKSkuY3JlYXRlKCk7Ci0gICAgICAgIG1MaWdodC5zZXRQb3NpdGlvbigwLCAtMC41ZiwgLTEuMGYpOwotCi0gICAgICAgIFByb2dyYW1WZXJ0ZXguQnVpbGRlciBwdmIgPSBuZXcgUHJvZ3JhbVZlcnRleC5CdWlsZGVyKG1SUywgbnVsbCwgbnVsbCk7Ci0gICAgICAgIC8vcHZiLmFkZExpZ2h0KG1MaWdodCk7Ci0gICAgICAgIG1QVkJhY2tncm91bmQgPSBwdmIuY3JlYXRlKCk7Ci0gICAgICAgIG1QVkJhY2tncm91bmQuc2V0TmFtZSgiUFZCYWNrZ3JvdW5kIik7Ci0KLSAgICAgICAgcHZiID0gbmV3IFByb2dyYW1WZXJ0ZXguQnVpbGRlcihtUlMsIG51bGwsIG51bGwpOwotICAgICAgICBwdmIuc2V0VGV4dHVyZU1hdHJpeEVuYWJsZSh0cnVlKTsKLSAgICAgICAgbVBWSW1hZ2VzID0gcHZiLmNyZWF0ZSgpOwotICAgICAgICBtUFZJbWFnZXMuc2V0TmFtZSgiUFZJbWFnZXMiKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgbG9hZEltYWdlcygpIHsKLSAgICAgICAgbUJ1ZmZlcklEcyA9IG5ldyBpbnRbMTNdOwotICAgICAgICBtSW1hZ2VzID0gbmV3IEFsbG9jYXRpb25bMTNdOwotICAgICAgICBtQWxsb2NJRHMgPSBBbGxvY2F0aW9uLmNyZWF0ZVNpemVkKG1SUywKLSAgICAgICAgICAgIEVsZW1lbnQuY3JlYXRlVXNlcihtUlMsIEVsZW1lbnQuRGF0YVR5cGUuRkxPQVRfMzIpLAotICAgICAgICAgICAgbUJ1ZmZlcklEcy5sZW5ndGgpOwotCi0gICAgICAgIEVsZW1lbnQgaWUgPSBFbGVtZW50LmNyZWF0ZVBpeGVsKG1SUywgRWxlbWVudC5EYXRhVHlwZS5VTlNJR05FRF81XzZfNSwgRWxlbWVudC5EYXRhS2luZC5QSVhFTF9SR0IpOwotICAgICAgICBtSW1hZ2VzWzBdID0gQWxsb2NhdGlvbi5jcmVhdGVGcm9tQml0bWFwUmVzb3VyY2VCb3hlZChtUlMsIG1SZXMsIFIuZHJhd2FibGUucDAxLCBpZSwgdHJ1ZSk7Ci0gICAgICAgIG1JbWFnZXNbMV0gPSBBbGxvY2F0aW9uLmNyZWF0ZUZyb21CaXRtYXBSZXNvdXJjZUJveGVkKG1SUywgbVJlcywgUi5kcmF3YWJsZS5wMDIsIGllLCB0cnVlKTsKLSAgICAgICAgbUltYWdlc1syXSA9IEFsbG9jYXRpb24uY3JlYXRlRnJvbUJpdG1hcFJlc291cmNlQm94ZWQobVJTLCBtUmVzLCBSLmRyYXdhYmxlLnAwMywgaWUsIHRydWUpOwotICAgICAgICBtSW1hZ2VzWzNdID0gQWxsb2NhdGlvbi5jcmVhdGVGcm9tQml0bWFwUmVzb3VyY2VCb3hlZChtUlMsIG1SZXMsIFIuZHJhd2FibGUucDA0LCBpZSwgdHJ1ZSk7Ci0gICAgICAgIG1JbWFnZXNbNF0gPSBBbGxvY2F0aW9uLmNyZWF0ZUZyb21CaXRtYXBSZXNvdXJjZUJveGVkKG1SUywgbVJlcywgUi5kcmF3YWJsZS5wMDUsIGllLCB0cnVlKTsKLSAgICAgICAgbUltYWdlc1s1XSA9IEFsbG9jYXRpb24uY3JlYXRlRnJvbUJpdG1hcFJlc291cmNlQm94ZWQobVJTLCBtUmVzLCBSLmRyYXdhYmxlLnAwNiwgaWUsIHRydWUpOwotICAgICAgICBtSW1hZ2VzWzZdID0gQWxsb2NhdGlvbi5jcmVhdGVGcm9tQml0bWFwUmVzb3VyY2VCb3hlZChtUlMsIG1SZXMsIFIuZHJhd2FibGUucDA3LCBpZSwgdHJ1ZSk7Ci0gICAgICAgIG1JbWFnZXNbN10gPSBBbGxvY2F0aW9uLmNyZWF0ZUZyb21CaXRtYXBSZXNvdXJjZUJveGVkKG1SUywgbVJlcywgUi5kcmF3YWJsZS5wMDgsIGllLCB0cnVlKTsKLSAgICAgICAgbUltYWdlc1s4XSA9IEFsbG9jYXRpb24uY3JlYXRlRnJvbUJpdG1hcFJlc291cmNlQm94ZWQobVJTLCBtUmVzLCBSLmRyYXdhYmxlLnAwOSwgaWUsIHRydWUpOwotICAgICAgICBtSW1hZ2VzWzldID0gQWxsb2NhdGlvbi5jcmVhdGVGcm9tQml0bWFwUmVzb3VyY2VCb3hlZChtUlMsIG1SZXMsIFIuZHJhd2FibGUucDEwLCBpZSwgdHJ1ZSk7Ci0gICAgICAgIG1JbWFnZXNbMTBdID0gQWxsb2NhdGlvbi5jcmVhdGVGcm9tQml0bWFwUmVzb3VyY2VCb3hlZChtUlMsIG1SZXMsIFIuZHJhd2FibGUucDExLCBpZSwgdHJ1ZSk7Ci0gICAgICAgIG1JbWFnZXNbMTFdID0gQWxsb2NhdGlvbi5jcmVhdGVGcm9tQml0bWFwUmVzb3VyY2VCb3hlZChtUlMsIG1SZXMsIFIuZHJhd2FibGUucDEyLCBpZSwgdHJ1ZSk7Ci0gICAgICAgIG1JbWFnZXNbMTJdID0gQWxsb2NhdGlvbi5jcmVhdGVGcm9tQml0bWFwUmVzb3VyY2VCb3hlZChtUlMsIG1SZXMsIFIuZHJhd2FibGUucDEzLCBpZSwgdHJ1ZSk7Ci0KLSAgICAgICAgaW50IGJsYWNrW10gPSBuZXcgaW50WzEwMjRdOwotICAgICAgICBmb3IoaW50IGN0PTA7IGN0IDwgbUltYWdlcy5sZW5ndGg7IGN0KyspIHsKLSAgICAgICAgICAgIEFsbG9jYXRpb24uQWRhcHRlcjJEIGEgPSBtSW1hZ2VzW2N0XS5jcmVhdGVBZGFwdGVyMkQoKTsKLQotICAgICAgICAgICAgaW50IHNpemUgPSA1MTI7Ci0gICAgICAgICAgICBpbnQgbWlwID0gMDsKLSAgICAgICAgICAgIHdoaWxlKHNpemUgPj0gMikgewotICAgICAgICAgICAgICAgIGEuc3ViRGF0YSgwLCAwLCAyLCBzaXplLCBibGFjayk7Ci0gICAgICAgICAgICAgICAgYS5zdWJEYXRhKHNpemUtMiwgMCwgMiwgc2l6ZSwgYmxhY2spOwotICAgICAgICAgICAgICAgIGEuc3ViRGF0YSgwLCAwLCBzaXplLCAyLCBibGFjayk7Ci0gICAgICAgICAgICAgICAgYS5zdWJEYXRhKDAsIHNpemUtMiwgc2l6ZSwgMiwgYmxhY2spOwotICAgICAgICAgICAgICAgIHNpemUgPj49IDE7Ci0gICAgICAgICAgICAgICAgbWlwKys7Ci0gICAgICAgICAgICAgICAgYS5zZXRDb25zdHJhaW50KERpbWVuc2lvbi5MT0QsIG1pcCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1JbWFnZXNbY3RdLnVwbG9hZFRvVGV4dHVyZSgxKTsKLSAgICAgICAgICAgIG1CdWZmZXJJRHNbY3RdID0gbUltYWdlc1tjdF0uZ2V0SUQoKTsKLSAgICAgICAgfQotICAgICAgICBtQWxsb2NJRHMuZGF0YShtQnVmZmVySURzKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaW5pdFN0YXRlKCkKLSAgICB7Ci0gICAgICAgIG1CdWZmZXJTdGF0ZSA9IG5ldyBpbnRbMTBdOwotICAgICAgICBtQWxsb2NTdGF0ZSA9IEFsbG9jYXRpb24uY3JlYXRlU2l6ZWQobVJTLAotICAgICAgICAgICAgRWxlbWVudC5jcmVhdGVVc2VyKG1SUywgRWxlbWVudC5EYXRhVHlwZS5GTE9BVF8zMiksCi0gICAgICAgICAgICBtQnVmZmVyU3RhdGUubGVuZ3RoKTsKLSAgICAgICAgbUJ1ZmZlclN0YXRlW1NUQVRFX0xBU1RfRk9DVVNdID0gLTE7Ci0gICAgICAgIG1BbGxvY1N0YXRlLmRhdGEobUJ1ZmZlclN0YXRlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaW5pdFJTKCkgewotICAgICAgICBtRlNNID0gbmV3IEZpbG1TdHJpcE1lc2goKTsKLSAgICAgICAgbU1lc2ggPSBtRlNNLmluaXQobVJTKTsKLSAgICAgICAgbU1lc2guc2V0TmFtZSgibWVzaCIpOwotCi0gICAgICAgIGluaXRQRlMoKTsKLSAgICAgICAgaW5pdFBGKCk7Ci0gICAgICAgIGluaXRQVigpOwotCi0gICAgICAgIExvZy5lKCJycyIsICJEb25lIGxvYWRpbmcgbmFtZWQiKTsKLQotICAgICAgICBtU3RyaXBQb3NpdGlvblR5cGUgPSBUeXBlLmNyZWF0ZUZyb21DbGFzcyhtUlMsIFN0cmlwUG9zaXRpb24uY2xhc3MsIDEpOwotCi0gICAgICAgIFNjcmlwdEMuQnVpbGRlciBzYiA9IG5ldyBTY3JpcHRDLkJ1aWxkZXIobVJTKTsKLSAgICAgICAgc2Iuc2V0U2NyaXB0KG1SZXMsIFIucmF3LmZpbG1zdHJpcCk7Ci0gICAgICAgIHNiLnNldFJvb3QodHJ1ZSk7Ci0gICAgICAgIHNiLnNldFR5cGUobVN0cmlwUG9zaXRpb25UeXBlLCAiUG9zIiwgMSk7Ci0gICAgICAgIG1TY3JpcHRTdHJpcCA9IHNiLmNyZWF0ZSgpOwotICAgICAgICBtU2NyaXB0U3RyaXAuc2V0Q2xlYXJDb2xvcigwLjBmLCAwLjBmLCAwLjBmLCAxLjBmKTsKLQotICAgICAgICBtQWxsb2NQb3MgPSBBbGxvY2F0aW9uLmNyZWF0ZVR5cGVkKG1SUywgbVN0cmlwUG9zaXRpb25UeXBlKTsKLQotICAgICAgICBsb2FkSW1hZ2VzKCk7Ci0gICAgICAgIGluaXRTdGF0ZSgpOwotCi0gICAgICAgIG1QVkEgPSBuZXcgUHJvZ3JhbVZlcnRleC5NYXRyaXhBbGxvY2F0aW9uKG1SUyk7Ci0gICAgICAgIG1QVkJhY2tncm91bmQuYmluZEFsbG9jYXRpb24obVBWQSk7Ci0gICAgICAgIG1QVkltYWdlcy5iaW5kQWxsb2NhdGlvbihtUFZBKTsKLSAgICAgICAgbVBWQS5zZXR1cFByb2plY3Rpb25Ob3JtYWxpemVkKDMyMCwgNDgwKTsKLQotCi0gICAgICAgIG1TY3JpcHRTdHJpcC5iaW5kQWxsb2NhdGlvbihtQWxsb2NJRHMsIDApOwotICAgICAgICBtU2NyaXB0U3RyaXAuYmluZEFsbG9jYXRpb24obUFsbG9jUG9zLCAxKTsKLSAgICAgICAgbVNjcmlwdFN0cmlwLmJpbmRBbGxvY2F0aW9uKG1BbGxvY1N0YXRlLCAyKTsKLSAgICAgICAgbVNjcmlwdFN0cmlwLmJpbmRBbGxvY2F0aW9uKG1QVkEubUFsbG9jLCAzKTsKLQotCi0gICAgICAgIG1BbGxvY09mZnNldHMgPSBBbGxvY2F0aW9uLmNyZWF0ZVNpemVkKG1SUywKLSAgICAgICAgICAgIEVsZW1lbnQuY3JlYXRlVXNlcihtUlMsIEVsZW1lbnQuRGF0YVR5cGUuU0lHTkVEXzMyKSwgbUZTTS5tVHJpYW5nbGVPZmZzZXRzLmxlbmd0aCk7Ci0gICAgICAgIG1BbGxvY09mZnNldHMuZGF0YShtRlNNLm1UcmlhbmdsZU9mZnNldHMpOwotICAgICAgICBtU2NyaXB0U3RyaXAuYmluZEFsbG9jYXRpb24obUFsbG9jT2Zmc2V0cywgNCk7Ci0KLSAgICAgICAgbUFsbG9jT2Zmc2V0c1RleCA9IEFsbG9jYXRpb24uY3JlYXRlU2l6ZWQobVJTLAotICAgICAgICAgICAgRWxlbWVudC5jcmVhdGVVc2VyKG1SUywgRWxlbWVudC5EYXRhVHlwZS5GTE9BVF8zMiksIG1GU00ubVRyaWFuZ2xlT2Zmc2V0c1RleC5sZW5ndGgpOwotICAgICAgICBtQWxsb2NPZmZzZXRzVGV4LmRhdGEobUZTTS5tVHJpYW5nbGVPZmZzZXRzVGV4KTsKLSAgICAgICAgbVNjcmlwdFN0cmlwLmJpbmRBbGxvY2F0aW9uKG1BbGxvY09mZnNldHNUZXgsIDUpOwotCi0gICAgICAgIHNldEZpbG1TdHJpcFBvc2l0aW9uKDAsIDApOwotICAgICAgICBtUlMuY29udGV4dEJpbmRSb290U2NyaXB0KG1TY3JpcHRTdHJpcCk7Ci0gICAgfQotfQotCi0KLQpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL0ZpbG0vc3JjL2NvbS9hbmRyb2lkL2ZpbG0vRmlsbVN0cmlwTWVzaC5qYXZhIGIvbGlicy9ycy9qYXZhL0ZpbG0vc3JjL2NvbS9hbmRyb2lkL2ZpbG0vRmlsbVN0cmlwTWVzaC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDhjY2UwLi4wMDAwMDAwCi0tLSBhL2xpYnMvcnMvamF2YS9GaWxtL3NyYy9jb20vYW5kcm9pZC9maWxtL0ZpbG1TdHJpcE1lc2guamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmZpbG07Ci0KLWltcG9ydCBqYXZhLmlvLldyaXRlcjsKLWltcG9ydCBqYXZhLmxhbmcuTWF0aDsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotCi1pbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUmVuZGVyU2NyaXB0OwotaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0LlNpbXBsZU1lc2g7Ci0KLQotY2xhc3MgRmlsbVN0cmlwTWVzaCB7Ci0KLSAgICBjbGFzcyBWZXJ0ZXggewotICAgICAgICBmbG9hdCBueDsKLSAgICAgICAgZmxvYXQgbnk7Ci0gICAgICAgIGZsb2F0IG56OwotICAgICAgICBmbG9hdCBzOwotICAgICAgICBmbG9hdCB0OwotICAgICAgICBmbG9hdCB4OwotICAgICAgICBmbG9hdCB5OwotICAgICAgICBmbG9hdCB6OwotCi0gICAgICAgIFZlcnRleCgpIHsKLSAgICAgICAgICAgIG54ID0gMDsKLSAgICAgICAgICAgIG55ID0gMDsKLSAgICAgICAgICAgIG56ID0gMDsKLSAgICAgICAgICAgIHMgPSAwOwotICAgICAgICAgICAgdCA9IDA7Ci0gICAgICAgICAgICB4ID0gMDsKLSAgICAgICAgICAgIHkgPSAwOwotICAgICAgICAgICAgeiA9IDA7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHh5eihmbG9hdCBfeCwgZmxvYXQgX3ksIGZsb2F0IF96KSB7Ci0gICAgICAgICAgICB4ID0gX3g7Ci0gICAgICAgICAgICB5ID0gX3k7Ci0gICAgICAgICAgICB6ID0gX3o7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIG54eXooZmxvYXQgX3gsIGZsb2F0IF95LCBmbG9hdCBfeikgewotICAgICAgICAgICAgbnggPSBfeDsKLSAgICAgICAgICAgIG55ID0gX3k7Ci0gICAgICAgICAgICBueiA9IF96OwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBzdChmbG9hdCBfcywgZmxvYXQgX3QpIHsKLSAgICAgICAgICAgIHMgPSBfczsKLSAgICAgICAgICAgIHQgPSBfdDsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgY29tcHV0ZU5vcm0oVmVydGV4IHYxLCBWZXJ0ZXggdjIpIHsKLSAgICAgICAgICAgIGZsb2F0IGR4ID0gdjEueCAtIHYyLng7Ci0gICAgICAgICAgICBmbG9hdCBkeSA9IHYxLnkgLSB2Mi55OwotICAgICAgICAgICAgZmxvYXQgZHogPSB2MS56IC0gdjIuejsKLSAgICAgICAgICAgIGZsb2F0IGxlbiA9IChmbG9hdClqYXZhLmxhbmcuTWF0aC5zcXJ0KGR4KmR4ICsgZHkqZHkgKyBkeipkeik7Ci0gICAgICAgICAgICBkeCAvPSBsZW47Ci0gICAgICAgICAgICBkeSAvPSBsZW47Ci0gICAgICAgICAgICBkeiAvPSBsZW47Ci0KLSAgICAgICAgICAgIG54ID0gZHggKiBkejsKLSAgICAgICAgICAgIG55ID0gZHkgKiBkejsKLSAgICAgICAgICAgIG56ID0gKGZsb2F0KWphdmEubGFuZy5NYXRoLnNxcnQoZHgqZHggKyBkeSpkeSk7Ci0KLSAgICAgICAgICAgIGxlbiA9IChmbG9hdClqYXZhLmxhbmcuTWF0aC5zcXJ0KG54Km54ICsgbnkqbnkgKyBueipueik7Ci0gICAgICAgICAgICBueCAvPSBsZW47Ci0gICAgICAgICAgICBueSAvPSBsZW47Ci0gICAgICAgICAgICBueiAvPSBsZW47Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpbnRbXSBtVHJpYW5nbGVPZmZzZXRzOwotICAgIGZsb2F0W10gbVRyaWFuZ2xlT2Zmc2V0c1RleDsKLSAgICBpbnQgbVRyaWFuZ2xlT2Zmc2V0c0NvdW50OwotCi0gICAgU2ltcGxlTWVzaCBpbml0KFJlbmRlclNjcmlwdCBycykKLSAgICB7Ci0gICAgICAgIGZsb2F0IHZ0eFtdID0gbmV3IGZsb2F0W10gewotICAgICAgICAgICAgNjAuNDMxMDAzZiwgMTI0LjQ4MjA1MGYsCi0gICAgICAgICAgICA2MC44NjIwNzRmLCAxMjAuODcyNjA0ZiwKLSAgICAgICAgICAgIDYxLjcwNTMwM2YsIDExNy4zMzY2NjJmLAotICAgICAgICAgICAgNjIuOTQ5NTA1ZiwgMTEzLjkyMTEyN2YsCi0gICAgICAgICAgICA2NC41NzgxNzdmLCAxMTAuNjcxMzA0ZiwKLSAgICAgICAgICAgIDY2LjU2OTcxNmYsIDEwNy42MzAzMDJmLAotICAgICAgICAgICAgNjguODk3NzAzZiwgMTA0LjgzODQ1N2YsCi0gICAgICAgICAgICA3MS41MzEyNTlmLCAxMDIuMzMyODAzZiwKLSAgICAgICAgICAgIDc0LjQzNTQ1MmYsIDEwMC4xNDY1NzdmLAotICAgICAgICAgICAgNzcuNTcxNzU3ZiwgOTguMzA4Nzc3ZiwKLSAgICAgICAgICAgIDgwLjg5ODU3NGYsIDk2Ljg0Mzc4MWYsCi0gICAgICAgICAgICA4NC4zNzE3NzNmLCA5NS43NzEwMjNmLAotICAgICAgICAgICAgODcuOTQ1MjgzZiwgOTUuMTA0NzMxZiwKLSAgICAgICAgICAgIDk4Ljk1ODk5NGYsIDk1LjI2NzA5OGYsCi0gICAgICAgICAgICAxMDkuNDg5NTIzZiwgOTguNDk3NTk2ZiwKLSAgICAgICAgICAgIDExOC42OTk1ODJmLCAxMDQuNTM5MzY2ZiwKLSAgICAgICAgICAgIDEyNS44NTY4NzJmLCAxMTIuOTEyMDIyZiwKLSAgICAgICAgICAgIDEzMC4zOTIzMTFmLCAxMjIuOTQ5ODQ5ZiwKLSAgICAgICAgICAgIDEzMS45NDUyODNmLCAxMzMuODU0NzMxZiwKLSAgICAgICAgICAgIDEzMC4zOTIzMTFmLCAxNDQuNzU5NjEzZiwKLSAgICAgICAgICAgIDEyNS44NTY4NzJmLCAxNTQuNzk3NDM5ZiwKLSAgICAgICAgICAgIDExOC42OTk1ODJmLCAxNjMuMTcwMDk2ZiwKLSAgICAgICAgICAgIDEwOS40ODk1MjNmLCAxNjkuMjExODY2ZiwKLSAgICAgICAgICAgIDk4Ljk1ODk5NGYsIDE3Mi40NDIzNjRmLAotICAgICAgICAgICAgODcuOTQ1MjgzZiwgMTcyLjYwNDczMWYsCi0gICAgICAgICAgICA3Mi41MDczMTNmLCAxNzIuNjcyOTI3ZiwKLSAgICAgICAgICAgIDU3LjY3ODkyMGYsIDE2OC4zNzcwNzFmLAotICAgICAgICAgICAgNDQuNjY4MTM1ZiwgMTYwLjA2NzEzNGYsCi0gICAgICAgICAgICAzNC41MzQ5MDhmLCAxNDguNDIwMTA0ZiwKLSAgICAgICAgICAgIDI4LjEwNDc2N2YsIDEzNC4zODQ4MzFmLAotICAgICAgICAgICAgMjUuOTAxNTU3ZiwgMTE5LjEwNDczMWYsCi0gICAgICAgICAgICAyOC4xMDQ3NjdmLCAxMDMuODI0NjMxZiwKLSAgICAgICAgICAgIDM0LjUzNDkwOGYsIDg5Ljc4OTM1OGYsCi0gICAgICAgICAgICA0NC42NjgxMzVmLCA3OC4xNDIzMjdmLAotICAgICAgICAgICAgNTcuNjc4OTIwZiwgNjkuODMyMzkwZiwKLSAgICAgICAgICAgIDcyLjUwNzMxM2YsIDY1LjUzNjUzNGYsCi0gICAgICAgICAgICA4Ny45NDUyODNmLCA2NS42MDQ3MzFmLAotICAgICAgICAgICAgMTA2LjkxODExN2YsIDY1LjY4ODU0MmYsCi0gICAgICAgICAgICAxMjUuMTQxNzk1ZiwgNjAuNDA5MDU2ZiwKLSAgICAgICAgICAgIDE0MS4xMzE2ODZmLCA1MC4xOTYzNzZmLAotICAgICAgICAgICAgMTUzLjU4NTEzN2YsIDM1Ljg4MjUwMmYsCi0gICAgICAgICAgICAxNjEuNDg3NjAwZiwgMTguNjMzNTQ1ZiwKLSAgICAgICAgICAgIDE2NC4xOTUyODNmLCAtMC4xNDUyNjlmLAotICAgICAgICAgICAgMTYxLjQ4NzYwMGYsIC0xOC45MjQwODRmLAotICAgICAgICAgICAgMTUzLjU4NTEzN2YsIC0zNi4xNzMwNDBmLAotICAgICAgICAgICAgMTQxLjEzMTY4NmYsIC01MC40ODY5MTRmLAotICAgICAgICAgICAgMTI1LjE0MTc5NWYsIC02MC42OTk1OTRmLAotICAgICAgICAgICAgMTA2LjkxODExN2YsIC02NS45NzkwODFmLAotICAgICAgICAgICAgODcuOTQ1MjgzZiwgLTY1Ljg5NTI2OWYsCi0gICAgICAgICAgICA4MGYsIC02NS44OTUyNjlmLAotICAgICAgICAgICAgNjBmLCAtNjUuODk1MjY5ZiwKLSAgICAgICAgICAgIDQwZiwgLTY1Ljg5NTI2OWYsCi0gICAgICAgICAgICAyMGYsIC02NS44OTUyNjlmLAotICAgICAgICAgICAgMGYsIC02NS44OTUyNjlmLAotICAgICAgICAgICAgLTIwZiwgLTY1Ljg5NTI2OWYsCi0gICAgICAgICAgICAtNDBmLCAtNjUuODk1MjY5ZiwKLSAgICAgICAgICAgIC02MGYsIC02NS44OTUyNjlmLAotICAgICAgICAgICAgLTgwZiwgLTY1Ljg5NTI2OWYsCi0gICAgICAgICAgICAtODcuOTQ1MjgzZiwgLTY1Ljg5NTI2OWYsCi0gICAgICAgICAgICAtMTA2LjkxODExN2YsIC02NS45NzkwODFmLAotICAgICAgICAgICAgLTEyNS4xNDE3OTVmLCAtNjAuNjk5NTk0ZiwKLSAgICAgICAgICAgIC0xNDEuMTMxNjg2ZiwgLTUwLjQ4NjkxNGYsCi0gICAgICAgICAgICAtMTUzLjU4NTEzN2YsIC0zNi4xNzMwNDBmLAotICAgICAgICAgICAgLTE2MS40ODc2MDBmLCAtMTguOTI0MDg0ZiwKLSAgICAgICAgICAgIC0xNjQuMTk1MjgzZiwgLTAuMTQ1MjY5ZiwKLSAgICAgICAgICAgIC0xNjEuNDg3NjAwZiwgMTguNjMzNTQ1ZiwKLSAgICAgICAgICAgICAtMTUzLjU4NTEzN2YsIDM1Ljg4MjUwMmYsCi0gICAgICAgICAgICAgLTE0MS4xMzE2ODZmLCA1MC4xOTYzNzZmLAotICAgICAgICAgICAgIC0xMjUuMTQxNzk1ZiwgNjAuNDA5MDU2ZiwKLSAgICAgICAgICAgICAtMTA2LjkxODExN2YsIDY1LjY4ODU0MmYsCi0gICAgICAgICAgICAgLTg3Ljk0NTI4M2YsIDY1LjYwNDczMWYsCi0gICAgICAgICAgICAgLTcyLjUwNzMxM2YsIDY1LjUzNjUzNGYsCi0gICAgICAgICAgICAgLTU3LjY3ODkyMGYsIDY5LjgzMjM5MGYsCi0gICAgICAgICAgICAgLTQ0LjY2ODEzNWYsIDc4LjE0MjMyN2YsCi0gICAgICAgICAgICAgLTM0LjUzNDkwOGYsIDg5Ljc4OTM1OGYsCi0gICAgICAgICAgICAgLTI4LjEwNDc2N2YsIDEwMy44MjQ2MzFmLAotICAgICAgICAgICAgIC0yNS45MDE1NTdmLCAxMTkuMTA0NzMxZiwKLSAgICAgICAgICAgICAtMjguMTA0NzY3ZiwgMTM0LjM4NDgzMWYsCi0gICAgICAgICAgICAgLTM0LjUzNDkwOGYsIDE0OC40MjAxMDRmLAotICAgICAgICAgICAgIC00NC42NjgxMzVmLCAxNjAuMDY3MTM0ZiwKLSAgICAgICAgICAgICAtNTcuNjc4OTIwZiwgMTY4LjM3NzA3MWYsCi0gICAgICAgICAgICAgLTcyLjUwNzMxM2YsIDE3Mi42NzI5MjdmLAotICAgICAgICAgICAgIC04Ny45NDUyODNmLCAxNzIuNjA0NzMxZiwKLSAgICAgICAgICAgICAtOTguOTU4OTk0ZiwgMTcyLjQ0MjM2NGYsCi0gICAgICAgICAgICAgLTEwOS40ODk1MjNmLCAxNjkuMjExODY2ZiwKLSAgICAgICAgICAgICAtMTE4LjY5OTU4MmYsIDE2My4xNzAwOTZmLAotICAgICAgICAgICAgIC0xMjUuODU2ODcyZiwgMTU0Ljc5NzQzOWYsCi0gICAgICAgICAgICAgLTEzMC4zOTIzMTFmLCAxNDQuNzU5NjEzZiwKLSAgICAgICAgICAgICAtMTMxLjk0NTI4M2YsIDEzMy44NTQ3MzFmLAotICAgICAgICAgICAgIC0xMzAuMzkyMzExZiwgMTIyLjk0OTg0OWYsCi0gICAgICAgICAgICAgLTEyNS44NTY4NzJmLCAxMTIuOTEyMDIyZiwKLSAgICAgICAgICAgICAtMTE4LjY5OTU4MmYsIDEwNC41MzkzNjZmLAotICAgICAgICAgICAgIC0xMDkuNDg5NTIzZiwgOTguNDk3NTk2ZiwKLSAgICAgICAgICAgICAtOTguOTU4OTk0ZiwgOTUuMjY3MDk4ZiwKLSAgICAgICAgICAgICAtODcuOTQ1MjgzZiwgOTUuMTA0NzMxZiwKLSAgICAgICAgICAgICAtODQuMzcxNzczZiwgOTUuNzcxMDIzZiwKLSAgICAgICAgICAgICAtODAuODk4NTc0ZiwgOTYuODQzNzgxZiwKLSAgICAgICAgICAgICAtNzcuNTcxNzU3ZiwgOTguMzA4Nzc3ZiwKLSAgICAgICAgICAgICAtNzQuNDM1NDUyZiwgMTAwLjE0NjU3N2YsCi0gICAgICAgICAgICAgLTcxLjUzMTI1OWYsIDEwMi4zMzI4MDNmLAotICAgICAgICAgICAgIC02OC44OTc3MDNmLCAxMDQuODM4NDU3ZiwKLSAgICAgICAgICAgICAtNjYuNTY5NzE2ZiwgMTA3LjYzMDMwMmYsCi0gICAgICAgICAgICAgLTY0LjU3ODE3N2YsIDExMC42NzEzMDRmLAotICAgICAgICAgICAgIC02Mi45NDk1MDVmLCAxMTMuOTIxMTI3ZiwKLSAgICAgICAgICAgICAtNjEuNzA1MzAzZiwgMTE3LjMzNjY2MmYsCi0gICAgICAgICAgICAgLTYwLjg2MjA3NGYsIDEyMC44NzI2MDRmLAotICAgICAgICAgICAgIC02MC40MzEwMDNmLCAxMjQuNDgyMDUwZgotICAgICAgICB9OwotCi0KLSAgICAgICAgbVRyaWFuZ2xlT2Zmc2V0cyA9IG5ldyBpbnRbNjRdOwotICAgICAgICBtVHJpYW5nbGVPZmZzZXRzVGV4ID0gbmV3IGZsb2F0WzY0XTsKLQotICAgICAgICBtVHJpYW5nbGVPZmZzZXRzWzBdID0gMDsKLSAgICAgICAgbVRyaWFuZ2xlT2Zmc2V0c0NvdW50ID0gMTsKLQotICAgICAgICBWZXJ0ZXggdCA9IG5ldyBWZXJ0ZXgoKTsKLSAgICAgICAgdC5ueHl6KDEsIDAsIDApOwotICAgICAgICBpbnQgY291bnQgPSB2dHgubGVuZ3RoIC8gMjsKLQotICAgICAgICBTaW1wbGVNZXNoLlRyaWFuZ2xlTWVzaEJ1aWxkZXIgdG0gPSBuZXcgU2ltcGxlTWVzaC5UcmlhbmdsZU1lc2hCdWlsZGVyKAotICAgICAgICAgICAgcnMsIDMsCi0gICAgICAgICAgICBTaW1wbGVNZXNoLlRyaWFuZ2xlTWVzaEJ1aWxkZXIuTk9STUFMIHwgU2ltcGxlTWVzaC5UcmlhbmdsZU1lc2hCdWlsZGVyLlRFWFRVUkVfMCk7Ci0KLSAgICAgICAgZmxvYXQgcnVubmluZ1MgPSAwOwotICAgICAgICBmb3IgKGludCBjdD0wOyBjdCA8IChjb3VudC0xKTsgY3QrKykgewotICAgICAgICAgICAgdC54ID0gLXZ0eFtjdCoyXSAvIDEwMC5mOwotICAgICAgICAgICAgdC56ID0gdnR4W2N0KjIrMV0gLyAxMDAuZjsKLSAgICAgICAgICAgIHQucyA9IHJ1bm5pbmdTOwotICAgICAgICAgICAgdC5ueCA9ICAodnR4W2N0KjIrM10gLSB2dHhbY3QqMiArMV0pOwotICAgICAgICAgICAgdC5ueSA9ICAodnR4W2N0KjIrMl0gLSB2dHhbY3QqMiAgIF0pOwotICAgICAgICAgICAgZmxvYXQgbGVuID0gKGZsb2F0KWphdmEubGFuZy5NYXRoLnNxcnQodC5ueCAqIHQubnggKyB0Lm55ICogdC5ueSk7Ci0gICAgICAgICAgICBydW5uaW5nUyArPSBsZW4gLyAxMDA7Ci0gICAgICAgICAgICB0Lm54IC89IGxlbjsKLSAgICAgICAgICAgIHQubnkgLz0gbGVuOwotICAgICAgICAgICAgdC55ID0gLTAuNWY7Ci0gICAgICAgICAgICB0LnQgPSAwOwotICAgICAgICAgICAgdG0uc2V0Tm9ybWFsKHQubngsIHQubnksIHQubnopOwotICAgICAgICAgICAgdG0uc2V0VGV4dHVyZSh0LnMsIHQudCk7Ci0gICAgICAgICAgICB0bS5hZGRWZXJ0ZXgodC54LCB0LnksIHQueik7Ci0gICAgICAgICAgICAvL2FuZHJvaWQudXRpbC5Mb2cuZSgicnMiLCAidnR4IHg9Iit0LngrIiB5PSIrdC55KyIgej0iK3QueisiIHM9Iit0LnMrIiB0PSIrdC50KTsKLSAgICAgICAgICAgIHQueSA9IC41ZjsKLSAgICAgICAgICAgIHQudCA9IDE7Ci0gICAgICAgICAgICB0bS5zZXRUZXh0dXJlKHQucywgdC50KTsKLSAgICAgICAgICAgIHRtLmFkZFZlcnRleCh0LngsIHQueSwgdC56KTsKLSAgICAgICAgICAgIC8vYW5kcm9pZC51dGlsLkxvZy5lKCJycyIsICJ2dHggeD0iK3QueCsiIHk9Iit0LnkrIiB6PSIrdC56KyIgcz0iK3QucysiIHQ9Iit0LnQpOwotCi0gICAgICAgICAgICBpZigocnVubmluZ1MqMikgPiBtVHJpYW5nbGVPZmZzZXRzQ291bnQpIHsKLSAgICAgICAgICAgICAgICBtVHJpYW5nbGVPZmZzZXRzW21UcmlhbmdsZU9mZnNldHNDb3VudF0gPSBjdCoyICogMzsKLSAgICAgICAgICAgICAgICBtVHJpYW5nbGVPZmZzZXRzVGV4W21UcmlhbmdsZU9mZnNldHNDb3VudF0gPSB0LnM7Ci0gICAgICAgICAgICAgICAgbVRyaWFuZ2xlT2Zmc2V0c0NvdW50ICsrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgY291bnQgPSAoY291bnQgKiAyIC0gMik7Ci0gICAgICAgIGZvciAoaW50IGN0PTA7IGN0IDwgKGNvdW50LTIpOyBjdCs9IDIpIHsKLSAgICAgICAgICAgIHRtLmFkZFRyaWFuZ2xlKGN0LCBjdCsxLCBjdCsyKTsKLSAgICAgICAgICAgIHRtLmFkZFRyaWFuZ2xlKGN0KzEsIGN0KzMsIGN0KzIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0bS5jcmVhdGUoKTsKLSAgICB9Ci0KLQotfQotCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvRm91bnRhaW4vcmVzL3Jhdy9mb3VudGFpbi5jIGIvbGlicy9ycy9qYXZhL0ZvdW50YWluL3Jlcy9yYXcvZm91bnRhaW4uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzNiODE5Yi4uMDAwMDAwMAotLS0gYS9saWJzL3JzL2phdmEvRm91bnRhaW4vcmVzL3Jhdy9mb3VudGFpbi5jCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLy8gRm91bnRhaW4gdGVzdCBzY3JpcHQKLSNwcmFnbWEgdmVyc2lvbigxKQotCi1pbnQgbmV3UGFydCA9IDA7Ci0KLWludCBtYWluKGludCBsYXVuY2hJRCkgewotICAgIGludCBjdDsKLSAgICBpbnQgY291bnQgPSBDb250cm9sLT5jb3VudDsKLSAgICBpbnQgcmF0ZSA9IENvbnRyb2wtPnJhdGU7Ci0gICAgZmxvYXQgaGVpZ2h0ID0gZ2V0SGVpZ2h0KCk7Ci0gICAgc3RydWN0IHBvaW50X3MgKiBwID0gKHN0cnVjdCBwb2ludF9zICopcG9pbnQ7Ci0KLSAgICBpZiAocmF0ZSkgewotICAgICAgICBmbG9hdCByTWF4ID0gKChmbG9hdClyYXRlKSAqIDAuMDA1ZjsKLSAgICAgICAgaW50IHggPSBDb250cm9sLT54OwotICAgICAgICBpbnQgeSA9IENvbnRyb2wtPnk7Ci0gICAgICAgIGludCBjb2xvciA9ICgoaW50KShDb250cm9sLT5yICogMjU1LmYpKSB8Ci0gICAgICAgICAgICAgICAgICAgICgoaW50KShDb250cm9sLT5nICogMjU1LmYpKSA8PCA4IHwKLSAgICAgICAgICAgICAgICAgICAgKChpbnQpKENvbnRyb2wtPmIgKiAyNTUuZikpIDw8IDE2IHwKLSAgICAgICAgICAgICAgICAgICAgKDB4ZjAgPDwgMjQpOwotICAgICAgICBzdHJ1Y3QgcG9pbnRfcyAqIG5wID0gJnBbbmV3UGFydF07Ci0KLSAgICAgICAgd2hpbGUgKHJhdGUtLSkgewotICAgICAgICAgICAgdmVjMlJhbmQoKGZsb2F0ICopJm5wLT5kZWx0YS54LCByTWF4KTsKLSAgICAgICAgICAgIG5wLT5wb3NpdGlvbi54ID0geDsKLSAgICAgICAgICAgIG5wLT5wb3NpdGlvbi55ID0geTsKLSAgICAgICAgICAgIG5wLT5jb2xvciA9IGNvbG9yOwotICAgICAgICAgICAgbmV3UGFydCsrOwotICAgICAgICAgICAgbnArKzsKLSAgICAgICAgICAgIGlmIChuZXdQYXJ0ID49IGNvdW50KSB7Ci0gICAgICAgICAgICAgICAgbmV3UGFydCA9IDA7Ci0gICAgICAgICAgICAgICAgbnAgPSAmcFtuZXdQYXJ0XTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIGZvciAoY3Q9MDsgY3QgPCBjb3VudDsgY3QrKykgewotICAgICAgICBmbG9hdCBkeSA9IHAtPmRlbHRhLnkgKyAwLjE1ZjsKLSAgICAgICAgZmxvYXQgcG9zeSA9IHAtPnBvc2l0aW9uLnkgKyBkeTsKLSAgICAgICAgaWYgKChwb3N5ID4gaGVpZ2h0KSAmJiAoZHkgPiAwKSkgewotICAgICAgICAgICAgZHkgKj0gLTAuM2Y7Ci0gICAgICAgIH0KLSAgICAgICAgcC0+ZGVsdGEueSA9IGR5OwotICAgICAgICBwLT5wb3NpdGlvbi54ICs9IHAtPmRlbHRhLng7Ci0gICAgICAgIHAtPnBvc2l0aW9uLnkgPSBwb3N5OwotICAgICAgICBwKys7Ci0gICAgfQotCi0gICAgdXBsb2FkVG9CdWZmZXJPYmplY3QoTkFNRURfUGFydEJ1ZmZlcik7Ci0gICAgZHJhd1NpbXBsZU1lc2goTkFNRURfUGFydE1lc2gpOwotICAgIHJldHVybiAxOwotfQpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL0ZvdW50YWluL3Jlcy9yYXcvZm91bnRhaW4ucnMgYi9saWJzL3JzL2phdmEvRm91bnRhaW4vcmVzL3Jhdy9mb3VudGFpbi5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjEyZDlhCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9qYXZhL0ZvdW50YWluL3Jlcy9yYXcvZm91bnRhaW4ucnMKQEAgLTAsMCArMSw3MSBAQAorLy8gRm91bnRhaW4gdGVzdCBzY3JpcHQKKyNwcmFnbWEgdmVyc2lvbigxKQorCisjcHJhZ21hIHJzIGphdmFfcGFja2FnZV9uYW1lKGNvbS5hbmRyb2lkLmZvdW50YWluKQorCisjaW5jbHVkZSAiLi4vLi4vLi4vLi4vc2NyaXB0Yy9yc190eXBlcy5yc2giCisjaW5jbHVkZSAiLi4vLi4vLi4vLi4vc2NyaXB0Yy9yc19tYXRoLnJzaCIKKyNpbmNsdWRlICIuLi8uLi8uLi8uLi9zY3JpcHRjL3JzX2dyYXBoaWNzLnJzaCIKKworc3RhdGljIGludCBuZXdQYXJ0ID0gMDsKK3N0YXRpYyBmbG9hdDQgcGFydENvbG9yOworcnNfbWVzaCBwYXJ0TWVzaDsKKwordHlwZWRlZiBzdHJ1Y3QgX19hdHRyaWJ1dGVfXygocGFja2VkLCBhbGlnbmVkKDQpKSkgUG9pbnQgeworICAgIGZsb2F0MiBkZWx0YTsKKyAgICBmbG9hdDIgcG9zaXRpb247CisgICAgdWNoYXI0IGNvbG9yOworfSBQb2ludF90OworUG9pbnRfdCAqcG9pbnQ7CisKKyNwcmFnbWEgcnMgZXhwb3J0X3Zhcihwb2ludCwgcGFydE1lc2gpCisjcHJhZ21hIHJzIGV4cG9ydF9mdW5jKGFkZFBhcnRpY2xlcykKKworaW50IHJvb3QoKSB7CisgICAgcnNnQ2xlYXJDb2xvcigwLmYsIDAuZiwgMC5mLCAxLmYpOworICAgIGNvbnN0IGZsb2F0IGhlaWdodCA9IHJzZ0dldEhlaWdodCgpOworICAgIGNvbnN0IGludCBzaXplID0gcnNBbGxvY2F0aW9uR2V0RGltWChyc0dldEFsbG9jYXRpb24ocG9pbnQpKTsKKworICAgIFBvaW50X3QgKiBwID0gcG9pbnQ7CisgICAgZm9yIChpbnQgY3Q9MDsgY3QgPCBzaXplOyBjdCsrKSB7CisgICAgICAgIHAtPmRlbHRhLnkgKz0gMC4xNWY7CisgICAgICAgIHAtPnBvc2l0aW9uICs9IHAtPmRlbHRhOworICAgICAgICBpZiAoKHAtPnBvc2l0aW9uLnkgPiBoZWlnaHQpICYmIChwLT5kZWx0YS55ID4gMCkpIHsKKyAgICAgICAgICAgIHAtPmRlbHRhLnkgKj0gLTAuM2Y7CisgICAgICAgIH0KKyAgICAgICAgcCsrOworICAgIH0KKworICAgIHJzZ0RyYXdTaW1wbGVNZXNoKHBhcnRNZXNoKTsKKyAgICByZXR1cm4gMTsKK30KKwordm9pZCBhZGRQYXJ0aWNsZXMoaW50IHJhdGUsIGZsb2F0IHgsIGZsb2F0IHksIGJvb2wgbmV3Q29sb3IpCit7CisgICAgaWYgKG5ld0NvbG9yKSB7CisgICAgICAgIHBhcnRDb2xvci54ID0gcnNSYW5kKDAuNWYsIDEuMGYpOworICAgICAgICBwYXJ0Q29sb3IueSA9IHJzUmFuZCgxLjBmKTsKKyAgICAgICAgcGFydENvbG9yLnogPSByc1JhbmQoMS4wZik7CisgICAgfQorICAgIGZsb2F0IHJNYXggPSAoKGZsb2F0KXJhdGUpICogMC4wMDVmOworICAgIGludCBzaXplID0gcnNBbGxvY2F0aW9uR2V0RGltWChyc0dldEFsbG9jYXRpb24ocG9pbnQpKTsKKyAgICB1Y2hhcjQgYyA9IHJzUGFja0NvbG9yVG84ODg4KHBhcnRDb2xvcik7CisKKyAgICBQb2ludF90ICogbnAgPSAmcG9pbnRbbmV3UGFydF07CisgICAgZmxvYXQyIHAgPSB7eCwgeX07CisgICAgd2hpbGUgKHJhdGUtLSkgeworICAgICAgICBmbG9hdCBhbmdsZSA9IHJzUmFuZCgzLjE0ZiAqIDIuZik7CisgICAgICAgIGZsb2F0IGxlbiA9IHJzUmFuZChyTWF4KTsKKyAgICAgICAgbnAtPmRlbHRhLnggPSBsZW4gKiBzaW4oYW5nbGUpOworICAgICAgICBucC0+ZGVsdGEueSA9IGxlbiAqIGNvcyhhbmdsZSk7CisgICAgICAgIG5wLT5wb3NpdGlvbiA9IHA7CisgICAgICAgIG5wLT5jb2xvciA9IGM7CisgICAgICAgIG5ld1BhcnQrKzsKKyAgICAgICAgbnArKzsKKyAgICAgICAgaWYgKG5ld1BhcnQgPj0gc2l6ZSkgeworICAgICAgICAgICAgbmV3UGFydCA9IDA7CisgICAgICAgICAgICBucCA9ICZwb2ludFtuZXdQYXJ0XTsKKyAgICAgICAgfQorICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL0ZvdW50YWluL3Jlcy9yYXcvZm91bnRhaW4yLnJzIGIvbGlicy9ycy9qYXZhL0ZvdW50YWluL3Jlcy9yYXcvZm91bnRhaW4yLnJzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzAxMTQwLi4wMDAwMDAwCi0tLSBhL2xpYnMvcnMvamF2YS9Gb3VudGFpbi9yZXMvcmF3L2ZvdW50YWluMi5ycworKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8vIEZvdW50YWluIHRlc3Qgc2NyaXB0Ci0jcHJhZ21hIHZlcnNpb24oMSkKLQotI2luY2x1ZGUgInJzX3R5cGVzLnJzaCIKLSNpbmNsdWRlICJyc19tYXRoLnJzaCIKLSNpbmNsdWRlICJyc19ncmFwaGljcy5yc2giCi0KLXN0YXRpYyBpbnQgbmV3UGFydCA9IDA7Ci0KLXR5cGVkZWYgc3RydWN0IENvbnRyb2xfcyB7Ci0gICAgaW50IHgsIHk7Ci0gICAgaW50IHJhdGU7Ci0gICAgaW50IGNvdW50OwotICAgIGZsb2F0IHIsIGcsIGI7Ci0gICAgcnNfYWxsb2NhdGlvbiBwYXJ0QnVmZmVyOwotICAgIHJzX21lc2ggcGFydE1lc2g7Ci19IENvbnRyb2xfdDsKLUNvbnRyb2xfdCAqQ29udHJvbDsKLQotdHlwZWRlZiBzdHJ1Y3QgUG9pbnRfc3sKLSAgICBmbG9hdDIgZGVsdGE7Ci0gICAgZmxvYXQyIHBvc2l0aW9uOwotICAgIHVuc2lnbmVkIGludCBjb2xvcjsKLX0gUG9pbnRfdDsKLVBvaW50X3QgKnBvaW50OwotCi1pbnQgbWFpbihpbnQgbGF1bmNoSUQpIHsKLSAgICBpbnQgY3Q7Ci0gICAgaW50IGNvdW50ID0gQ29udHJvbC0+Y291bnQ7Ci0gICAgaW50IHJhdGUgPSBDb250cm9sLT5yYXRlOwotICAgIGZsb2F0IGhlaWdodCA9IGdldEhlaWdodCgpOwotICAgIFBvaW50X3QgKiBwID0gcG9pbnQ7Ci0KLSAgICBpZiAocmF0ZSkgewotICAgICAgICBmbG9hdCByTWF4ID0gKChmbG9hdClyYXRlKSAqIDAuMDA1ZjsKLSAgICAgICAgaW50IHggPSBDb250cm9sLT54OwotICAgICAgICBpbnQgeSA9IENvbnRyb2wtPnk7Ci0gICAgICAgIGludCBjb2xvciA9ICgoaW50KShDb250cm9sLT5yICogMjU1LmYpKSB8Ci0gICAgICAgICAgICAgICAgICAgICgoaW50KShDb250cm9sLT5nICogMjU1LmYpKSA8PCA4IHwKLSAgICAgICAgICAgICAgICAgICAgKChpbnQpKENvbnRyb2wtPmIgKiAyNTUuZikpIDw8IDE2IHwKLSAgICAgICAgICAgICAgICAgICAgKDB4ZjAgPDwgMjQpOwotICAgICAgICBQb2ludF90ICogbnAgPSAmcFtuZXdQYXJ0XTsKLQotICAgICAgICB3aGlsZSAocmF0ZS0tKSB7Ci0gICAgICAgICAgICBucC0+ZGVsdGEgPSB2ZWMyUmFuZChyTWF4KTsKLSAgICAgICAgICAgIG5wLT5wb3NpdGlvbi54ID0geDsKLSAgICAgICAgICAgIG5wLT5wb3NpdGlvbi55ID0geTsKLSAgICAgICAgICAgIG5wLT5jb2xvciA9IGNvbG9yOwotICAgICAgICAgICAgbmV3UGFydCsrOwotICAgICAgICAgICAgbnArKzsKLSAgICAgICAgICAgIGlmIChuZXdQYXJ0ID49IGNvdW50KSB7Ci0gICAgICAgICAgICAgICAgbmV3UGFydCA9IDA7Ci0gICAgICAgICAgICAgICAgbnAgPSAmcFtuZXdQYXJ0XTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIGZvciAoY3Q9MDsgY3QgPCBjb3VudDsgY3QrKykgewotICAgICAgICBmbG9hdCBkeSA9IHAtPmRlbHRhLnkgKyAwLjE1ZjsKLSAgICAgICAgZmxvYXQgcG9zeSA9IHAtPnBvc2l0aW9uLnkgKyBkeTsKLSAgICAgICAgaWYgKChwb3N5ID4gaGVpZ2h0KSAmJiAoZHkgPiAwKSkgewotICAgICAgICAgICAgZHkgKj0gLTAuM2Y7Ci0gICAgICAgIH0KLSAgICAgICAgcC0+ZGVsdGEueSA9IGR5OwotICAgICAgICBwLT5wb3NpdGlvbi54ICs9IHAtPmRlbHRhLng7Ci0gICAgICAgIHAtPnBvc2l0aW9uLnkgPSBwb3N5OwotICAgICAgICBwKys7Ci0gICAgfQotCi0gICAgdXBsb2FkVG9CdWZmZXJPYmplY3QoQ29udHJvbC0+cGFydEJ1ZmZlcik7Ci0gICAgZHJhd1NpbXBsZU1lc2goQ29udHJvbC0+cGFydE1lc2gpOwotICAgIHJldHVybiAxOwotfQpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL0ZvdW50YWluL3Jlcy9yYXcvZm91bnRhaW5fYmMuYmMgYi9saWJzL3JzL2phdmEvRm91bnRhaW4vcmVzL3Jhdy9mb3VudGFpbl9iYy5iYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzZiN2Q0Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9qYXZhL0ZvdW50YWluL3Jlcy9yYXcvZm91bnRhaW5fYmMuYmMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL0ZvdW50YWluL3NyYy9jb20vYW5kcm9pZC9mb3VudGFpbi9Gb3VudGFpblJTLmphdmEgYi9saWJzL3JzL2phdmEvRm91bnRhaW4vc3JjL2NvbS9hbmRyb2lkL2ZvdW50YWluL0ZvdW50YWluUlMuamF2YQppbmRleCA5MzU2NTc5Li5mZmUyZmFkIDEwMDY0NAotLS0gYS9saWJzL3JzL2phdmEvRm91bnRhaW4vc3JjL2NvbS9hbmRyb2lkL2ZvdW50YWluL0ZvdW50YWluUlMuamF2YQorKysgYi9saWJzL3JzL2phdmEvRm91bnRhaW4vc3JjL2NvbS9hbmRyb2lkL2ZvdW50YWluL0ZvdW50YWluUlMuamF2YQpAQCAtMjQsOTIgKzI0LDQwIEBACiBwdWJsaWMgY2xhc3MgRm91bnRhaW5SUyB7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEFSVF9DT1VOVCA9IDIwMDAwOwogCi0gICAgc3RhdGljIGNsYXNzIFNvbWVEYXRhIHsKLSAgICAgICAgcHVibGljIGludCB4OwotICAgICAgICBwdWJsaWMgaW50IHk7Ci0gICAgICAgIHB1YmxpYyBpbnQgcmF0ZTsKLSAgICAgICAgcHVibGljIGludCBjb3VudDsKLSAgICAgICAgcHVibGljIGZsb2F0IHI7Ci0gICAgICAgIHB1YmxpYyBmbG9hdCBnOwotICAgICAgICBwdWJsaWMgZmxvYXQgYjsKLSAgICB9Ci0KICAgICBwdWJsaWMgRm91bnRhaW5SUygpIHsKICAgICB9CiAKKyAgICBwcml2YXRlIFJlc291cmNlcyBtUmVzOworICAgIHByaXZhdGUgUmVuZGVyU2NyaXB0R0wgbVJTOworICAgIHByaXZhdGUgU2NyaXB0Q19Gb3VudGFpbiBtU2NyaXB0OwogICAgIHB1YmxpYyB2b2lkIGluaXQoUmVuZGVyU2NyaXB0R0wgcnMsIFJlc291cmNlcyByZXMsIGludCB3aWR0aCwgaW50IGhlaWdodCkgewogICAgICAgICBtUlMgPSByczsKICAgICAgICAgbVJlcyA9IHJlczsKLSAgICAgICAgaW5pdFJTKCk7Ci0gICAgfQogCi0gICAgcHVibGljIHZvaWQgbmV3VG91Y2hQb3NpdGlvbihpbnQgeCwgaW50IHksIGludCByYXRlKSB7Ci0gICAgICAgIGlmIChtU0QucmF0ZSA9PSAwKSB7Ci0gICAgICAgICAgICBtU0QuciA9ICgoeCAmIDB4MSkgIT0gMCkgPyAwLmYgOiAxLmY7Ci0gICAgICAgICAgICBtU0QuZyA9ICgoeCAmIDB4MikgIT0gMCkgPyAwLmYgOiAxLmY7Ci0gICAgICAgICAgICBtU0QuYiA9ICgoeCAmIDB4NCkgIT0gMCkgPyAwLmYgOiAxLmY7Ci0gICAgICAgICAgICBpZiAoKG1TRC5yICsgbVNELmcgKyBtU0QuYikgPCAwLjlmKSB7Ci0gICAgICAgICAgICAgICAgbVNELnIgPSAwLjhmOwotICAgICAgICAgICAgICAgIG1TRC5nID0gMC41ZjsKLSAgICAgICAgICAgICAgICBtU0QuYiA9IDEuZjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBtU0QucmF0ZSA9IHJhdGU7Ci0gICAgICAgIG1TRC54ID0geDsKLSAgICAgICAgbVNELnkgPSB5OwotICAgICAgICBtSW50QWxsb2MuZGF0YShtU0QpOwotICAgIH0KLQotCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotICAgIHByaXZhdGUgUmVzb3VyY2VzIG1SZXM7Ci0KLSAgICBwcml2YXRlIFJlbmRlclNjcmlwdEdMIG1SUzsKLSAgICBwcml2YXRlIEFsbG9jYXRpb24gbUludEFsbG9jOwotICAgIHByaXZhdGUgU2ltcGxlTWVzaCBtU007Ci0gICAgcHJpdmF0ZSBTb21lRGF0YSBtU0Q7Ci0gICAgcHJpdmF0ZSBUeXBlIG1TRFR5cGU7Ci0KLSAgICBwcml2YXRlIHZvaWQgaW5pdFJTKCkgewotICAgICAgICBtU0QgPSBuZXcgU29tZURhdGEoKTsKLSAgICAgICAgbVNEVHlwZSA9IFR5cGUuY3JlYXRlRnJvbUNsYXNzKG1SUywgU29tZURhdGEuY2xhc3MsIDEsICJTb21lRGF0YSIpOwotICAgICAgICBtSW50QWxsb2MgPSBBbGxvY2F0aW9uLmNyZWF0ZVR5cGVkKG1SUywgbVNEVHlwZSk7Ci0gICAgICAgIG1TRC5jb3VudCA9IFBBUlRfQ09VTlQ7Ci0gICAgICAgIG1JbnRBbGxvYy5kYXRhKG1TRCk7Ci0KLSAgICAgICAgRWxlbWVudC5CdWlsZGVyIGViID0gbmV3IEVsZW1lbnQuQnVpbGRlcihtUlMpOwotICAgICAgICBlYi5hZGQoRWxlbWVudC5jcmVhdGVWZWN0b3IobVJTLCBFbGVtZW50LkRhdGFUeXBlLkZMT0FUXzMyLCAyKSwgImRlbHRhIik7Ci0gICAgICAgIGViLmFkZChFbGVtZW50LmNyZWF0ZUF0dHJpYihtUlMsIEVsZW1lbnQuRGF0YVR5cGUuRkxPQVRfMzIsIEVsZW1lbnQuRGF0YUtpbmQuUE9TSVRJT04sIDIpLCAicG9zaXRpb24iKTsKLSAgICAgICAgZWIuYWRkKEVsZW1lbnQuY3JlYXRlQXR0cmliKG1SUywgRWxlbWVudC5EYXRhVHlwZS5VTlNJR05FRF84LCBFbGVtZW50LkRhdGFLaW5kLkNPTE9SLCA0KSwgImNvbG9yIik7Ci0gICAgICAgIEVsZW1lbnQgcHJpbUVsZW1lbnQgPSBlYi5jcmVhdGUoKTsKLQorICAgICAgICBTY3JpcHRGaWVsZF9Qb2ludCBwb2ludHMgPSBuZXcgU2NyaXB0RmllbGRfUG9pbnQobVJTLCBQQVJUX0NPVU5UKTsKIAogICAgICAgICBTaW1wbGVNZXNoLkJ1aWxkZXIgc21iID0gbmV3IFNpbXBsZU1lc2guQnVpbGRlcihtUlMpOwotICAgICAgICBpbnQgdnR4U2xvdCA9IHNtYi5hZGRWZXJ0ZXhUeXBlKHByaW1FbGVtZW50LCBQQVJUX0NPVU5UKTsKKyAgICAgICAgaW50IHZ0eFNsb3QgPSBzbWIuYWRkVmVydGV4VHlwZShwb2ludHMuZ2V0VHlwZSgpKTsKICAgICAgICAgc21iLnNldFByaW1pdGl2ZShQcmltaXRpdmUuUE9JTlQpOwotICAgICAgICBtU00gPSBzbWIuY3JlYXRlKCk7Ci0gICAgICAgIG1TTS5zZXROYW1lKCJQYXJ0TWVzaCIpOworICAgICAgICBTaW1wbGVNZXNoIHNtID0gc21iLmNyZWF0ZSgpOworICAgICAgICBzbS5iaW5kVmVydGV4QWxsb2NhdGlvbihwb2ludHMuZ2V0QWxsb2NhdGlvbigpLCB2dHhTbG90KTsKIAotICAgICAgICBBbGxvY2F0aW9uIHBhcnRBbGxvYyA9IG1TTS5jcmVhdGVWZXJ0ZXhBbGxvY2F0aW9uKHZ0eFNsb3QpOwotICAgICAgICBwYXJ0QWxsb2Muc2V0TmFtZSgiUGFydEJ1ZmZlciIpOwotICAgICAgICBtU00uYmluZFZlcnRleEFsbG9jYXRpb24ocGFydEFsbG9jLCAwKTsKLQotICAgICAgICAvLyBBbGwgc2V0dXAgb2YgbmFtZWQgb2JqZWN0cyBzaG91bGQgYmUgZG9uZSBieSB0aGlzIHBvaW50Ci0gICAgICAgIC8vIGJlY2F1c2Ugd2UgYXJlIGFib3V0IHRvIGNvbXBpbGUgdGhlIHNjcmlwdC4KLSAgICAgICAgU2NyaXB0Qy5CdWlsZGVyIHNiID0gbmV3IFNjcmlwdEMuQnVpbGRlcihtUlMpOwotICAgICAgICBzYi5zZXRTY3JpcHQobVJlcywgUi5yYXcuZm91bnRhaW4pOwotICAgICAgICBzYi5zZXRSb290KHRydWUpOwotICAgICAgICBzYi5zZXRUeXBlKG1TRFR5cGUsICJDb250cm9sIiwgMCk7Ci0gICAgICAgIHNiLnNldFR5cGUobVNNLmdldFZlcnRleFR5cGUoMCksICJwb2ludCIsIDEpOwotICAgICAgICBTY3JpcHQgc2NyaXB0ID0gc2IuY3JlYXRlKCk7Ci0gICAgICAgIHNjcmlwdC5zZXRDbGVhckNvbG9yKDAuMGYsIDAuMGYsIDAuMGYsIDEuMGYpOwotCi0gICAgICAgIHNjcmlwdC5iaW5kQWxsb2NhdGlvbihtSW50QWxsb2MsIDApOwotICAgICAgICBzY3JpcHQuYmluZEFsbG9jYXRpb24ocGFydEFsbG9jLCAxKTsKLSAgICAgICAgbVJTLmNvbnRleHRCaW5kUm9vdFNjcmlwdChzY3JpcHQpOworICAgICAgICBtU2NyaXB0ID0gbmV3IFNjcmlwdENfRm91bnRhaW4obVJTLCBtUmVzLCBSLnJhdy5mb3VudGFpbl9iYywgdHJ1ZSk7CisgICAgICAgIG1TY3JpcHQuc2V0X3BhcnRNZXNoKHNtKTsKKyAgICAgICAgbVNjcmlwdC5iaW5kX3BvaW50KHBvaW50cyk7CisgICAgICAgIG1SUy5jb250ZXh0QmluZFJvb3RTY3JpcHQobVNjcmlwdCk7CiAgICAgfQogCisgICAgYm9vbGVhbiBob2xkaW5nQ29sb3IgPSBmYWxzZTsKKyAgICBwdWJsaWMgdm9pZCBuZXdUb3VjaFBvc2l0aW9uKGludCB4LCBpbnQgeSwgaW50IHJhdGUpIHsKKyAgICAgICAgaWYgKHJhdGUgPiAwKSB7CisgICAgICAgICAgICBtU2NyaXB0Lmludm9rZV9hZGRQYXJ0aWNsZXMocmF0ZSwgeCwgeSwgIWhvbGRpbmdDb2xvcik7CisgICAgICAgICAgICBob2xkaW5nQ29sb3IgPSB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaG9sZGluZ0NvbG9yID0gZmFsc2U7CisgICAgICAgIH0KKworICAgIH0KIH0KIAogCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvRm91bnRhaW4vc3JjL2NvbS9hbmRyb2lkL2ZvdW50YWluL1NjcmlwdENfRm91bnRhaW4uamF2YSBiL2xpYnMvcnMvamF2YS9Gb3VudGFpbi9zcmMvY29tL2FuZHJvaWQvZm91bnRhaW4vU2NyaXB0Q19Gb3VudGFpbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0YzU5OGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL2phdmEvRm91bnRhaW4vc3JjL2NvbS9hbmRyb2lkL2ZvdW50YWluL1NjcmlwdENfRm91bnRhaW4uamF2YQpAQCAtMCwwICsxLDY0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5mb3VudGFpbjsKKworaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0Lio7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworcHVibGljIGNsYXNzIFNjcmlwdENfRm91bnRhaW4gZXh0ZW5kcyBTY3JpcHRDIHsKKyAgICAvLyBDb25zdHJ1Y3RvcgorICAgIHB1YmxpYyAgU2NyaXB0Q19Gb3VudGFpbihSZW5kZXJTY3JpcHQgcnMsIFJlc291cmNlcyByZXNvdXJjZXMsIGludCBpZCwgYm9vbGVhbiBpc1Jvb3QpIHsKKyAgICAgICAgc3VwZXIocnMsIHJlc291cmNlcywgaWQsIGlzUm9vdCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IG1FeHBvcnRWYXJJZHhfcGFydE1lc2ggPSAwOworICAgIHByaXZhdGUgU2ltcGxlTWVzaCBtRXhwb3J0VmFyX3BhcnRNZXNoOworICAgIHB1YmxpYyB2b2lkIHNldF9wYXJ0TWVzaChTaW1wbGVNZXNoIHYpIHsKKyAgICAgICAgbUV4cG9ydFZhcl9wYXJ0TWVzaCA9IHY7CisgICAgICAgIHNldFZhcihtRXhwb3J0VmFySWR4X3BhcnRNZXNoLCAodiA9PSBudWxsKSA/IDAgOiB2LmdldElEKCkpOworICAgIH0KKworICAgIHB1YmxpYyBTaW1wbGVNZXNoIGdldF9wYXJ0TWVzaCgpIHsKKyAgICAgICAgcmV0dXJuIG1FeHBvcnRWYXJfcGFydE1lc2g7CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IG1FeHBvcnRWYXJJZHhfcG9pbnQgPSAxOworICAgIHByaXZhdGUgU2NyaXB0RmllbGRfUG9pbnQgbUV4cG9ydFZhcl9wb2ludDsKKyAgICBwdWJsaWMgdm9pZCBiaW5kX3BvaW50KFNjcmlwdEZpZWxkX1BvaW50IHYpIHsKKyAgICAgICAgbUV4cG9ydFZhcl9wb2ludCA9IHY7CisgICAgICAgIGlmKHYgPT0gbnVsbCkgYmluZEFsbG9jYXRpb24obnVsbCwgbUV4cG9ydFZhcklkeF9wb2ludCk7CisgICAgICAgIGVsc2UgYmluZEFsbG9jYXRpb24odi5nZXRBbGxvY2F0aW9uKCksIG1FeHBvcnRWYXJJZHhfcG9pbnQpOworICAgIH0KKworICAgIHB1YmxpYyBTY3JpcHRGaWVsZF9Qb2ludCBnZXRfcG9pbnQoKSB7CisgICAgICAgIHJldHVybiBtRXhwb3J0VmFyX3BvaW50OworICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBtRXhwb3J0RnVuY0lkeF9hZGRQYXJ0aWNsZXMgPSAwOworICAgIHB1YmxpYyB2b2lkIGludm9rZV9hZGRQYXJ0aWNsZXMoaW50IHJhdGUsIGZsb2F0IHgsIGZsb2F0IHksIGJvb2xlYW4gbmV3Q29sb3IpIHsKKyAgICAgICAgRmllbGRQYWNrZXIgYWRkUGFydGljbGVzX2ZwID0gbmV3IEZpZWxkUGFja2VyKDE2KTsKKyAgICAgICAgYWRkUGFydGljbGVzX2ZwLmFkZEkzMihyYXRlKTsKKyAgICAgICAgYWRkUGFydGljbGVzX2ZwLmFkZEYzMih4KTsKKyAgICAgICAgYWRkUGFydGljbGVzX2ZwLmFkZEYzMih5KTsKKyAgICAgICAgYWRkUGFydGljbGVzX2ZwLmFkZEJvb2xlYW4obmV3Q29sb3IpOworICAgICAgICBhZGRQYXJ0aWNsZXNfZnAuc2tpcCgzKTsKKyAgICAgICAgaW52b2tlKG1FeHBvcnRGdW5jSWR4X2FkZFBhcnRpY2xlcywgYWRkUGFydGljbGVzX2ZwKTsKKyAgICB9CisKK30KKwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL0ZvdW50YWluL3NyYy9jb20vYW5kcm9pZC9mb3VudGFpbi9TY3JpcHRGaWVsZF9Qb2ludC5qYXZhIGIvbGlicy9ycy9qYXZhL0ZvdW50YWluL3NyYy9jb20vYW5kcm9pZC9mb3VudGFpbi9TY3JpcHRGaWVsZF9Qb2ludC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4OGY0N2IKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL2phdmEvRm91bnRhaW4vc3JjL2NvbS9hbmRyb2lkL2ZvdW50YWluL1NjcmlwdEZpZWxkX1BvaW50LmphdmEKQEAgLTAsMCArMSw4MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuZm91bnRhaW47CisKK2ltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC4qOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK3B1YmxpYyBjbGFzcyBTY3JpcHRGaWVsZF9Qb2ludCBleHRlbmRzIGFuZHJvaWQucmVuZGVyc2NyaXB0LlNjcmlwdC5GaWVsZEJhc2UgeworICAgIHN0YXRpYyBwdWJsaWMgY2xhc3MgSXRlbSB7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHNpemVvZiA9IDIwOworCisgICAgICAgIEZsb2F0MiBkZWx0YTsKKyAgICAgICAgRmxvYXQyIHBvc2l0aW9uOworICAgICAgICBTaG9ydDQgY29sb3I7CisKKyAgICAgICAgSXRlbSgpIHsKKyAgICAgICAgICAgIGRlbHRhID0gbmV3IEZsb2F0MigpOworICAgICAgICAgICAgcG9zaXRpb24gPSBuZXcgRmxvYXQyKCk7CisgICAgICAgICAgICBjb2xvciA9IG5ldyBTaG9ydDQoKTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgcHJpdmF0ZSBJdGVtIG1JdGVtQXJyYXlbXTsKKyAgICBwcml2YXRlIEZpZWxkUGFja2VyIG1JT0J1ZmZlcjsKKyAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgY3JlYXRlRWxlbWVudChSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgRWxlbWVudC5CdWlsZGVyIGViID0gbmV3IEVsZW1lbnQuQnVpbGRlcihycyk7CisgICAgICAgIGViLmFkZChFbGVtZW50LmNyZWF0ZVZlY3RvcihycywgRWxlbWVudC5EYXRhVHlwZS5GTE9BVF8zMiwgMiksICJkZWx0YSIpOworICAgICAgICBlYi5hZGQoRWxlbWVudC5jcmVhdGVWZWN0b3IocnMsIEVsZW1lbnQuRGF0YVR5cGUuRkxPQVRfMzIsIDIpLCAicG9zaXRpb24iKTsKKyAgICAgICAgZWIuYWRkKEVsZW1lbnQuY3JlYXRlVmVjdG9yKHJzLCBFbGVtZW50LkRhdGFUeXBlLlVOU0lHTkVEXzgsIDQpLCAiY29sb3IiKTsKKyAgICAgICAgcmV0dXJuIGViLmNyZWF0ZSgpOworICAgIH0KKworICAgIHB1YmxpYyAgU2NyaXB0RmllbGRfUG9pbnQoUmVuZGVyU2NyaXB0IHJzLCBpbnQgY291bnQpIHsKKyAgICAgICAgbUl0ZW1BcnJheSA9IG51bGw7CisgICAgICAgIG1JT0J1ZmZlciA9IG51bGw7CisgICAgICAgIG1FbGVtZW50ID0gY3JlYXRlRWxlbWVudChycyk7CisgICAgICAgIGluaXQocnMsIGNvdW50KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY29weVRvQXJyYXkoSXRlbSBpLCBpbnQgaW5kZXgpIHsKKyAgICAgICAgaWYgKG1JT0J1ZmZlciA9PSBudWxsKSBtSU9CdWZmZXIgPSBuZXcgRmllbGRQYWNrZXIoSXRlbS5zaXplb2YgKiBtVHlwZS5nZXRYKCkgLyogY291bnQgKi8pOworICAgICAgICBtSU9CdWZmZXIucmVzZXQoaW5kZXggKiBJdGVtLnNpemVvZik7CisgICAgICAgIG1JT0J1ZmZlci5hZGRGMzIoaS5kZWx0YSk7CisgICAgICAgIG1JT0J1ZmZlci5hZGRGMzIoaS5wb3NpdGlvbik7CisgICAgICAgIG1JT0J1ZmZlci5hZGRVOChpLmNvbG9yKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXQoSXRlbSBpLCBpbnQgaW5kZXgsIGJvb2xlYW4gY29weU5vdykgeworICAgICAgICBpZiAobUl0ZW1BcnJheSA9PSBudWxsKSBtSXRlbUFycmF5ID0gbmV3IEl0ZW1bbVR5cGUuZ2V0WCgpIC8qIGNvdW50ICovXTsKKyAgICAgICAgbUl0ZW1BcnJheVtpbmRleF0gPSBpOworICAgICAgICBpZiAoY29weU5vdykgIHsKKyAgICAgICAgICAgIGNvcHlUb0FycmF5KGksIGluZGV4KTsKKyAgICAgICAgICAgIG1BbGxvY2F0aW9uLnN1YkRhdGExRChpbmRleCwgMSwgbUlPQnVmZmVyLmdldERhdGEoKSk7CisgICAgICAgIH0KKworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNvcHlBbGwoKSB7CisgICAgICAgIGZvciAoaW50IGN0PTA7IGN0IDwgbUl0ZW1BcnJheS5sZW5ndGg7IGN0KyspIGNvcHlUb0FycmF5KG1JdGVtQXJyYXlbY3RdLCBjdCk7CisgICAgICAgIG1BbGxvY2F0aW9uLmRhdGEobUlPQnVmZmVyLmdldERhdGEoKSk7CisgICAgfQorCit9CisKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9JbWFnZVByb2Nlc3NpbmcvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2xpYnMvcnMvamF2YS9JbWFnZVByb2Nlc3NpbmcvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCBiNDhkMjA4Li5kNmEyZGI0IDEwMDY0NAotLS0gYS9saWJzL3JzL2phdmEvSW1hZ2VQcm9jZXNzaW5nL0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvbGlicy9ycy9qYXZhL0ltYWdlUHJvY2Vzc2luZy9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC02LDcgKzYsOCBAQAogICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uV1JJVEVfRVhURVJOQUxfU1RPUkFHRSIgLz4KIAogICAgIDxhcHBsaWNhdGlvbiBhbmRyb2lkOmxhYmVsPSJJbWFnZSBQcm9jZXNzaW5nIj4KLSAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iSW1hZ2VQcm9jZXNzaW5nQWN0aXZpdHkiPgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJJbWFnZVByb2Nlc3NpbmdBY3Rpdml0eSIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6c2NyZWVuT3JpZW50YXRpb249InBvcnRyYWl0Ij4KICAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgogICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KICAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIgLz4KZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9JbWFnZVByb2Nlc3NpbmcvcmVzL2xheW91dC9tYWluLnhtbCBiL2xpYnMvcnMvamF2YS9JbWFnZVByb2Nlc3NpbmcvcmVzL2xheW91dC9tYWluLnhtbAppbmRleCA2NzcwYzE4Li5jNmVjNzI5IDEwMDY0NAotLS0gYS9saWJzL3JzL2phdmEvSW1hZ2VQcm9jZXNzaW5nL3Jlcy9sYXlvdXQvbWFpbi54bWwKKysrIGIvbGlicy9ycy9qYXZhL0ltYWdlUHJvY2Vzc2luZy9yZXMvbGF5b3V0L21haW4ueG1sCkBAIC0yNSw5ICsyNSwxNDcgQEAKICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9kaXNwbGF5IgogICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMzIwZGlwIgogICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjI2NmRpcCIgLz4KLSAgICAKKworICAgIDxCdXR0b24KKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luQm90dG9tPSIxNzBkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iNDBkaXAiCisgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9iZW5jaG1hcmsiCisgICAgICAgIGFuZHJvaWQ6b25DbGljaz0iYmVuY2htYXJrIgorICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJib3R0b20iLz4KKworICAgIDxUZXh0VmlldworICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2JlbmNobWFya1RleHQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIxOHNwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSIxMDBkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkJvdHRvbT0iMTc1ZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJib3R0b20iCisgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9zYXR1cmF0aW9uIi8+CisKKyAgICAgPFNlZWtCYXIKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9pblNhdHVyYXRpb24iCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkJvdHRvbT0iMTQwZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSIxMGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IjEwZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iYm90dG9tIiAvPgorCisgICAgPFRleHRWaWV3CisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvaW5TYXR1cmF0aW9uVGV4dCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjE4c3AiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjUwZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Cb3R0b209IjE0MmRpcCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0Q29sb3I9IiMwMDAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImJvdHRvbSIKKyAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL3NhdHVyYXRpb24iLz4KKwogICAgIDxTZWVrQmFyCi0gICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvdGhyZXNob2xkIgorICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2luR2FtbWEiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkJvdHRvbT0iMTEwZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSIxMGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IjEwZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iYm90dG9tIiAvPgorCisgICAgPFRleHRWaWV3CisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvaW5HYW1tYVRleHQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIxOHNwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSI1MGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luQm90dG9tPSIxMTJkaXAiCisgICAgICAgIGFuZHJvaWQ6dGV4dENvbG9yPSIjMDAwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJib3R0b20iCisgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9nYW1tYSIvPgorCisgICAgPFNlZWtCYXIKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9vdXRXaGl0ZSIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luQm90dG9tPSI4MGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iMTcwZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5SaWdodD0iMTBkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJib3R0b20iIC8+CisKKyAgICA8VGV4dFZpZXcKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9vdXRXaGl0ZVRleHQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIxOHNwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSIyMjBkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkJvdHRvbT0iODJkaXAiCisgICAgICAgIGFuZHJvaWQ6dGV4dENvbG9yPSIjMDAwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJib3R0b20iCisgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9vdXRfd2hpdGUiLz4KKworICAgIDxTZWVrQmFyCisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvaW5XaGl0ZSIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luQm90dG9tPSI4MGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iMTBkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSIxNzBkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJib3R0b20iIC8+CisKKyAgICA8VGV4dFZpZXcKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9pbldoaXRlVGV4dCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjE4c3AiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjUwZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Cb3R0b209IjgyZGlwIgorICAgICAgICBhbmRyb2lkOnRleHRDb2xvcj0iIzAwMCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iYm90dG9tIgorICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvaW5fd2hpdGUiLz4KKworICAgIDxTZWVrQmFyCisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvb3V0QmxhY2siCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkJvdHRvbT0iNTBkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjE3MGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IjEwZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iYm90dG9tIiAvPgorCisgICAgPFRleHRWaWV3CisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvb3V0QmxhY2tUZXh0IgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMThzcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iMjIwZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Cb3R0b209IjUyZGlwIgorICAgICAgICBhbmRyb2lkOnRleHRDb2xvcj0iIzAwMCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iYm90dG9tIgorICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvb3V0X2JsYWNrIi8+CisKKyAgICA8U2Vla0JhcgorICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2luQmxhY2siCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkJvdHRvbT0iNTBkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjEwZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5SaWdodD0iMTcwZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iYm90dG9tIiAvPgorCisgICAgPFRleHRWaWV3CisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvaW5CbGFja1RleHQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIxOHNwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSI1MGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luQm90dG9tPSI1MmRpcCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0Q29sb3I9IiMwMDAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImJvdHRvbSIKKyAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2luX2JsYWNrIi8+CisKKyAgICA8U2Vla0JhcgorICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3JhZGl1cyIKICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luQm90dG9tPSIxMGRpcCIKICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iMTBkaXAiCiAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSIxMGRpcCIKQEAgLTM1LDQgKzE3MywxNSBAQAogICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKICAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iYm90dG9tIiAvPgogCisgICAgIDxUZXh0VmlldworICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2JsdXJUZXh0IgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMThzcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iNTBkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkJvdHRvbT0iMTJkaXAiCisgICAgICAgIGFuZHJvaWQ6dGV4dENvbG9yPSIjMDAwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJib3R0b20iCisgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9ibHVyX2Rlc2NyaXB0aW9uIi8+CisKIDwvbWVyZ2U+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL0ltYWdlUHJvY2Vzc2luZy9yZXMvcmF3L3RocmVzaG9sZC5ycyBiL2xpYnMvcnMvamF2YS9JbWFnZVByb2Nlc3NpbmcvcmVzL3Jhdy90aHJlc2hvbGQucnMKaW5kZXggODg4ZjBjZC4uOTU4NWU5MiAxMDA2NDQKLS0tIGEvbGlicy9ycy9qYXZhL0ltYWdlUHJvY2Vzc2luZy9yZXMvcmF3L3RocmVzaG9sZC5ycworKysgYi9saWJzL3JzL2phdmEvSW1hZ2VQcm9jZXNzaW5nL3Jlcy9yYXcvdGhyZXNob2xkLnJzCkBAIC0xLDYyICsxLDMxNCBAQAotLyoKLS8vIGJsb2NrIG9mIGRlZmluZXMgbWF0Y2hpbmcgd2hhdCBSUyB3aWxsIGluc2VydCBhdCBydW50aW1lLgotc3RydWN0IFBhcmFtc19zewotICAgIGludCBpbkhlaWdodDsKLSAgICBpbnQgaW5XaWR0aDsKLSAgICBpbnQgb3V0SGVpZ2h0OwotICAgIGludCBvdXRXaWR0aDsKLSAgICBmbG9hdCB0aHJlc2hvbGQ7Ci19Owotc3RydWN0IFBhcmFtc19zICogUGFyYW1zOwotc3RydWN0IEluUGl4ZWxfc3sKLSAgICBjaGFyIGE7Ci0gICAgY2hhciBiOwotICAgIGNoYXIgZzsKLSAgICBjaGFyIHI7Ci19Owotc3RydWN0IEluUGl4ZWxfcyAqIEluUGl4ZWw7Ci1zdHJ1Y3QgT3V0UGl4ZWxfc3sKLSAgICBjaGFyIGE7Ci0gICAgY2hhciBiOwotICAgIGNoYXIgZzsKLSAgICBjaGFyIHI7Ci19Owotc3RydWN0IE91dFBpeGVsX3MgKiBPdXRQaXhlbDsKLSovCisjcHJhZ21hIHZlcnNpb24oMSkKIAotc3RydWN0IGNvbG9yX3MgewotICAgIGNoYXIgYjsKLSAgICBjaGFyIGc7Ci0gICAgY2hhciByOwotICAgIGNoYXIgYTsKLX07CisjaW5jbHVkZSAiLi4vLi4vLi4vLi4vc2NyaXB0Yy9yc190eXBlcy5yc2giCisjaW5jbHVkZSAiLi4vLi4vLi4vLi4vc2NyaXB0Yy9yc19tYXRoLnJzaCIKKyNpbmNsdWRlICIuLi8uLi8uLi8uLi9zY3JpcHRjL3JzX2dyYXBoaWNzLnJzaCIKIAotdm9pZCBtYWluKCkgewotICAgIGludCB0ID0gdXB0aW1lTWlsbGlzKCk7CisjcHJhZ21hIHJzIGphdmFfcGFja2FnZV9uYW1lKGNvbS5hbmRyb2lkLnJzLmltYWdlKQogCi0gICAgc3RydWN0IGNvbG9yX3MgKmluID0gKHN0cnVjdCBjb2xvcl9zICopIEluUGl4ZWw7Ci0gICAgc3RydWN0IGNvbG9yX3MgKm91dCA9IChzdHJ1Y3QgY29sb3JfcyAqKSBPdXRQaXhlbDsKIAotICAgIGludCBjb3VudCA9IFBhcmFtcy0+aW5XaWR0aCAqIFBhcmFtcy0+aW5IZWlnaHQ7Ci0gICAgaW50IGk7Ci0gICAgZmxvYXQgdGhyZXNob2xkID0gKFBhcmFtcy0+dGhyZXNob2xkICogMjU1LmYpOworI2RlZmluZSBNQVhfUkFESVVTIDI1CiAKLSAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICBmbG9hdCBsdW1pbmFuY2UgPSAwLjIxMjVmICogaW4tPnIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAwLjcxNTRmICogaW4tPmcgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAwLjA3MjFmICogaW4tPmI7Ci0gICAgICAgIGlmIChsdW1pbmFuY2UgPiB0aHJlc2hvbGQpIHsKLSAgICAgICAgICAgICpvdXQgPSAqaW47Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAqKChpbnQgKilvdXQpID0gKigoaW50ICopaW4pICYgMHhmZjAwMDAwMDsKLSAgICAgICAgfQoraW50IGhlaWdodDsKK2ludCB3aWR0aDsKK2ludCByYWRpdXM7CiAKLSAgICAgICAgaW4rKzsKLSAgICAgICAgb3V0Kys7Cit1Y2hhcjQgKiBJblBpeGVsOwordWNoYXI0ICogT3V0UGl4ZWw7Cit1Y2hhcjQgKiBTY3JhdGNoUGl4ZWw7CisKK2Zsb2F0IGluQmxhY2s7CitmbG9hdCBvdXRCbGFjazsKK2Zsb2F0IGluV2hpdGU7CitmbG9hdCBvdXRXaGl0ZTsKK2Zsb2F0IGdhbW1hOworCitmbG9hdCBzYXR1cmF0aW9uOworCitzdGF0aWMgZmxvYXQgaW5XTWluSW5COworc3RhdGljIGZsb2F0IG91dFdNaW5PdXRCOworc3RhdGljIGZsb2F0IG92ZXJJbldNaW5JbkI7CisvL3N0YXRpYyBmbG9hdDMgZ2FtbWFWOworCisjcHJhZ21hIHJzIGV4cG9ydF92YXIoaGVpZ2h0LCB3aWR0aCwgcmFkaXVzLCBJblBpeGVsLCBPdXRQaXhlbCwgU2NyYXRjaFBpeGVsLCBpbkJsYWNrLCBvdXRCbGFjaywgaW5XaGl0ZSwgb3V0V2hpdGUsIGdhbW1hLCBzYXR1cmF0aW9uLCBJblBpeGVsLCBPdXRQaXhlbCwgU2NyYXRjaFBpeGVsKQorI3ByYWdtYSBycyBleHBvcnRfZnVuYyhmaWx0ZXIsIGZpbHRlckJlbmNobWFyayk7CisKKy8vIFN0b3JlIG91ciBjb2VmZmljaWVudHMgaGVyZQorc3RhdGljIGZsb2F0IGdhdXNzaWFuW01BWF9SQURJVVMgKiAyICsgMV07CitzdGF0aWMgcnNfbWF0cml4M3gzIGNvbG9yTWF0OworCitzdGF0aWMgdm9pZCBjb21wdXRlQ29sb3JNYXRyaXgoKSB7CisgICAgLy8gU2F0dXJhdGlvbgorICAgIC8vIExpbmVhciB3ZWlnaHRzCisgICAgLy9mbG9hdCByV2VpZ2h0ID0gMC4zMDg2ZjsKKyAgICAvL2Zsb2F0IGdXZWlnaHQgPSAwLjYwOTRmOworICAgIC8vZmxvYXQgYldlaWdodCA9IDAuMDgyMGY7CisKKyAgICAvLyBHYW1tYSAyLjIgd2VpZ2h0cyAod2UgaGF2ZW4ndCBjb252ZXJ0ZWQgb3VyIGltYWdlIHRvIGxpbmVhciBzcGFjZSB5ZXQgZm9yIHBlcmYgcmVhc29ucykKKyAgICBmbG9hdCByV2VpZ2h0ID0gMC4yOTlmOworICAgIGZsb2F0IGdXZWlnaHQgPSAwLjU4N2Y7CisgICAgZmxvYXQgYldlaWdodCA9IDAuMTE0ZjsKKworICAgIGZsb2F0IG9uZU1pbnVzUyA9IDEuMGYgLSBzYXR1cmF0aW9uOworCisgICAgcnNNYXRyaXhTZXQoJmNvbG9yTWF0LCAwLCAwLCBvbmVNaW51c1MgKiByV2VpZ2h0ICsgc2F0dXJhdGlvbik7CisgICAgcnNNYXRyaXhTZXQoJmNvbG9yTWF0LCAwLCAxLCBvbmVNaW51c1MgKiByV2VpZ2h0KTsKKyAgICByc01hdHJpeFNldCgmY29sb3JNYXQsIDAsIDIsIG9uZU1pbnVzUyAqIHJXZWlnaHQpOworICAgIHJzTWF0cml4U2V0KCZjb2xvck1hdCwgMSwgMCwgb25lTWludXNTICogZ1dlaWdodCk7CisgICAgcnNNYXRyaXhTZXQoJmNvbG9yTWF0LCAxLCAxLCBvbmVNaW51c1MgKiBnV2VpZ2h0ICsgc2F0dXJhdGlvbik7CisgICAgcnNNYXRyaXhTZXQoJmNvbG9yTWF0LCAxLCAyLCBvbmVNaW51c1MgKiBnV2VpZ2h0KTsKKyAgICByc01hdHJpeFNldCgmY29sb3JNYXQsIDIsIDAsIG9uZU1pbnVzUyAqIGJXZWlnaHQpOworICAgIHJzTWF0cml4U2V0KCZjb2xvck1hdCwgMiwgMSwgb25lTWludXNTICogYldlaWdodCk7CisgICAgcnNNYXRyaXhTZXQoJmNvbG9yTWF0LCAyLCAyLCBvbmVNaW51c1MgKiBiV2VpZ2h0ICsgc2F0dXJhdGlvbik7CisKKyAgICBpbldNaW5JbkIgPSBpbldoaXRlIC0gaW5CbGFjazsKKyAgICBvdXRXTWluT3V0QiA9IG91dFdoaXRlIC0gb3V0QmxhY2s7CisgICAgb3ZlckluV01pbkluQiA9IDEuZiAvIGluV01pbkluQjsKK30KKworc3RhdGljIHZvaWQgY29tcHV0ZUdhdXNzaWFuV2VpZ2h0cygpIHsKKyAgICAvLyBDb21wdXRlIGdhdXNzaWFuIHdlaWdodHMgZm9yIHRoZSBibHVyCisgICAgLy8gZSBpcyB0aGUgZXVsZXIncyBudW1iZXIKKyAgICBmbG9hdCBlID0gMi43MTgyODE4Mjg0NTkwNDVmOworICAgIGZsb2F0IHBpID0gMy4xNDE1OTI2NTM1ODk3OTMyZjsKKyAgICAvLyBnKHgpID0gKCAxIC8gc3FydCggMiAqIHBpICkgKiBzaWdtYSkgKiBlIF4gKCAteF4yIC8gMiAqIHNpZ21hXjIgKQorICAgIC8vIHggaXMgb2YgdGhlIGZvcm0gWy1yYWRpdXMgLi4gMCAuLiByYWRpdXNdCisgICAgLy8gYW5kIHNpZ21hIHZhcmllcyB3aXRoIHJhZGl1cy4KKyAgICAvLyBCYXNlZCBvbiBzb21lIGV4cGVyaW1lbnRhbCByYWRpdXMgdmFsdWVzIGFuZCBzaWdtYSdzCisgICAgLy8gd2UgYXBwcm94aW1hdGVseSBmaXQgc2lnbWEgPSBmKHJhZGl1cykgYXMKKyAgICAvLyBzaWdtYSA9IHJhZGl1cyAqIDAuNCAgKyAwLjYKKyAgICAvLyBUaGUgbGFyZ2VyIHRoZSByYWRpdXMgZ2V0cywgdGhlIG1vcmUgb3VyIGdhdXNzaWFuIGJsdXIKKyAgICAvLyB3aWxsIHJlc2VtYmxlIGEgYm94IGJsdXIgc2luY2Ugd2l0aCBsYXJnZSBzaWdtYQorICAgIC8vIHRoZSBnYXVzc2lhbiBjdXJ2ZSBiZWdpbnMgdG8gbG9zZSBpdHMgc2hhcGUKKyAgICBmbG9hdCBzaWdtYSA9IDAuNGYgKiAoZmxvYXQpcmFkaXVzICsgMC42ZjsKKworICAgIC8vIE5vdyBjb21wdXRlIHRoZSBjb2VmZmljaW50cworICAgIC8vIFdlIHdpbGwgc3RvcmUgc29tZSByZWR1bmRhbnQgdmFsdWVzIHRvIHNhdmUgc29tZSBtYXRoIGR1cmluZworICAgIC8vIHRoZSBibHVyIGNhbGN1bGF0aW9ucworICAgIC8vIHByZWNvbXB1dGUgc29tZSB2YWx1ZXMKKyAgICBmbG9hdCBjb2VmZjEgPSAxLjBmIC8gKHNxcnQoIDIuMGYgKiBwaSApICogc2lnbWEpOworICAgIGZsb2F0IGNvZWZmMiA9IC0gMS4wZiAvICgyLjBmICogc2lnbWEgKiBzaWdtYSk7CisKKyAgICBmbG9hdCBub3JtYWxpemVGYWN0b3IgPSAwLjBmOworICAgIGZsb2F0IGZsb2F0UiA9IDAuMGY7CisgICAgaW50IHI7CisgICAgZm9yKHIgPSAtcmFkaXVzOyByIDw9IHJhZGl1czsgciArKykgeworICAgICAgICBmbG9hdFIgPSAoZmxvYXQpcjsKKyAgICAgICAgZ2F1c3NpYW5bciArIHJhZGl1c10gPSBjb2VmZjEgKiBwb3coZSwgZmxvYXRSICogZmxvYXRSICogY29lZmYyKTsKKyAgICAgICAgbm9ybWFsaXplRmFjdG9yICs9IGdhdXNzaWFuW3IgKyByYWRpdXNdOwogICAgIH0KIAotICAgIHQ9IHVwdGltZU1pbGxpcygpIC0gdDsKLSAgICBkZWJ1Z0kzMigiRmlsdGVyIHRpbWUiLCB0KTsKLQotICAgIHNlbmRUb0NsaWVudCgmY291bnQsIDEsIDQsIDApOworICAgIC8vTm93IHdlIG5lZWQgdG8gbm9ybWFsaXplIHRoZSB3ZWlnaHRzIGJlY2F1c2UgYWxsIG91ciBjb2VmZmljaWVudHMgbmVlZCB0byBhZGQgdXAgdG8gb25lCisgICAgbm9ybWFsaXplRmFjdG9yID0gMS4wZiAvIG5vcm1hbGl6ZUZhY3RvcjsKKyAgICBmb3IociA9IC1yYWRpdXM7IHIgPD0gcmFkaXVzOyByICsrKSB7CisgICAgICAgIGZsb2F0UiA9IChmbG9hdClyOworICAgICAgICBnYXVzc2lhbltyICsgcmFkaXVzXSAqPSBub3JtYWxpemVGYWN0b3I7CisgICAgfQogfQorCisvLyBUaGlzIG5lZWRzIHRvIGJlIGlubGluZQorc3RhdGljIGZsb2F0NCBsZXZlbHNTYXR1cmF0aW9uKGZsb2F0NCBjdXJyZW50UGl4ZWwpIHsKKyAgICBmbG9hdDMgdGVtcCA9IHJzTWF0cml4TXVsdGlwbHkoJmNvbG9yTWF0LCBjdXJyZW50UGl4ZWwueHl6KTsKKyAgICB0ZW1wID0gKGNsYW1wKHRlbXAsIDAuMWYsIDI1NS5mKSAtIGluQmxhY2spICogb3ZlckluV01pbkluQjsKKyAgICB0ZW1wID0gcG93KHRlbXAsIChmbG9hdDMpZ2FtbWEpOworICAgIGN1cnJlbnRQaXhlbC54eXogPSBjbGFtcCh0ZW1wICogb3V0V01pbk91dEIgKyBvdXRCbGFjaywgMC4xZiwgMjU1LmYpOworICAgIHJldHVybiBjdXJyZW50UGl4ZWw7Cit9CisKK3N0YXRpYyB2b2lkIHByb2Nlc3NOb0JsdXIoKSB7CisgICAgaW50IHcsIGgsIHI7CisgICAgaW50IGNvdW50ID0gMDsKKworICAgIGZsb2F0IGluV01pbkluQiA9IGluV2hpdGUgLSBpbkJsYWNrOworICAgIGZsb2F0IG91dFdNaW5PdXRCID0gb3V0V2hpdGUgLSBvdXRCbGFjazsKKyAgICBmbG9hdDQgY3VycmVudFBpeGVsID0gMDsKKworICAgIGZvcihoID0gMDsgaCA8IGhlaWdodDsgaCArKykgeworICAgICAgICBmb3IodyA9IDA7IHcgPCB3aWR0aDsgdyArKykgeworICAgICAgICAgICAgdWNoYXI0ICppbnB1dCA9IEluUGl4ZWwgKyBoKndpZHRoICsgdzsKKworICAgICAgICAgICAgLy9jdXJyZW50UGl4ZWwueHl6ID0gY29udmVydF9mbG9hdDMoaW5wdXQueHl6KTsKKyAgICAgICAgICAgIGN1cnJlbnRQaXhlbC54ID0gKGZsb2F0KShpbnB1dC0+eCk7CisgICAgICAgICAgICBjdXJyZW50UGl4ZWwueSA9IChmbG9hdCkoaW5wdXQtPnkpOworICAgICAgICAgICAgY3VycmVudFBpeGVsLnogPSAoZmxvYXQpKGlucHV0LT56KTsKKworICAgICAgICAgICAgY3VycmVudFBpeGVsID0gbGV2ZWxzU2F0dXJhdGlvbihjdXJyZW50UGl4ZWwpOworCisgICAgICAgICAgICB1Y2hhcjQgKm91dHB1dCA9IE91dFBpeGVsICsgaCp3aWR0aCArIHc7CisgICAgICAgICAgICAvL291dHB1dC54eXogPSBjb252ZXJ0X3VjaGFyMyhjdXJyZW50UGl4ZWwueHl6KTsKKyAgICAgICAgICAgIG91dHB1dC0+eCA9ICh1aW50OF90KWN1cnJlbnRQaXhlbC54OworICAgICAgICAgICAgb3V0cHV0LT55ID0gKHVpbnQ4X3QpY3VycmVudFBpeGVsLnk7CisgICAgICAgICAgICBvdXRwdXQtPnogPSAodWludDhfdCljdXJyZW50UGl4ZWwuejsKKyAgICAgICAgICAgIG91dHB1dC0+dyA9IGlucHV0LT53OworICAgICAgICB9CisgICAgfQorICAgIHJzU2VuZFRvQ2xpZW50KCZjb3VudCwgMSwgNCwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIGhvcml6b250YWxCbHVyKCkgeworICAgIGZsb2F0NCBibHVycmVkUGl4ZWwgPSAwOworICAgIGZsb2F0NCBjdXJyZW50UGl4ZWwgPSAwOworICAgIC8vIEhvcml6b250YWwgYmx1cgorICAgIGludCB3LCBoLCByOworICAgIGZvcihoID0gMDsgaCA8IGhlaWdodDsgaCArKykgeworICAgICAgICB1Y2hhcjQgKmlucHV0ID0gSW5QaXhlbCArIGgqd2lkdGg7CisgICAgICAgIHVjaGFyNCAqb3V0cHV0ID0gU2NyYXRjaFBpeGVsICsgaCp3aWR0aDsKKworICAgICAgICBmb3IodyA9IDA7IHcgPCB3aWR0aDsgdyArKykgeworICAgICAgICAgICAgYmx1cnJlZFBpeGVsID0gMDsKKworICAgICAgICAgICAgZm9yKHIgPSAtcmFkaXVzOyByIDw9IHJhZGl1czsgciArKykgeworICAgICAgICAgICAgICAgIC8vIFN0ZXBwaW5nIGxlZnQgYW5kIHJpZ2h0IGF3YXkgZnJvbSB0aGUgcGl4ZWwKKyAgICAgICAgICAgICAgICBpbnQgdmFsaWRXID0gdyArIHI7CisgICAgICAgICAgICAgICAgLy8gQ2xhbXAgdG8gemVybyBhbmQgd2lkdGggbWF4KCkgaXNuJ3QgZXhwb3NlZCBmb3IgaW50cyB5ZXQKKyAgICAgICAgICAgICAgICBpZih2YWxpZFcgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIHZhbGlkVyA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmKHZhbGlkVyA+IHdpZHRoIC0gMSkgeworICAgICAgICAgICAgICAgICAgICB2YWxpZFcgPSB3aWR0aCAtIDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vaW50IHZhbGlkVyA9IHJzQ2xhbXAodyArIHIsIDAsIHdpZHRoIC0gMSk7CisKKyAgICAgICAgICAgICAgICBmbG9hdCB3ZWlnaHQgPSBnYXVzc2lhbltyICsgcmFkaXVzXTsKKyAgICAgICAgICAgICAgICBjdXJyZW50UGl4ZWwueCA9IChmbG9hdCkoaW5wdXRbdmFsaWRXXS54KTsKKyAgICAgICAgICAgICAgICBjdXJyZW50UGl4ZWwueSA9IChmbG9hdCkoaW5wdXRbdmFsaWRXXS55KTsKKyAgICAgICAgICAgICAgICBjdXJyZW50UGl4ZWwueiA9IChmbG9hdCkoaW5wdXRbdmFsaWRXXS56KTsKKyAgICAgICAgICAgICAgICAvL2N1cnJlbnRQaXhlbC53ID0gKGZsb2F0KShpbnB1dC0+YSk7CisKKyAgICAgICAgICAgICAgICBibHVycmVkUGl4ZWwgKz0gY3VycmVudFBpeGVsKndlaWdodDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgb3V0cHV0LT54ID0gKHVpbnQ4X3QpYmx1cnJlZFBpeGVsLng7CisgICAgICAgICAgICBvdXRwdXQtPnkgPSAodWludDhfdClibHVycmVkUGl4ZWwueTsKKyAgICAgICAgICAgIG91dHB1dC0+eiA9ICh1aW50OF90KWJsdXJyZWRQaXhlbC56OworICAgICAgICAgICAgLy9vdXRwdXQtPmEgPSAodWludDhfdClibHVycmVkUGl4ZWwudzsKKyAgICAgICAgICAgIG91dHB1dCsrOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBob3Jpem9udGFsQmx1ckxldmVscygpIHsKKyAgICBmbG9hdDQgYmx1cnJlZFBpeGVsID0gMDsKKyAgICBmbG9hdDQgY3VycmVudFBpeGVsID0gMDsKKyAgICAvLyBIb3Jpem9udGFsIGJsdXIKKyAgICBpbnQgdywgaCwgcjsKKyAgICBmb3IoaCA9IDA7IGggPCBoZWlnaHQ7IGggKyspIHsKKyAgICAgICAgdWNoYXI0ICpvdXRwdXQgPSBPdXRQaXhlbCArIGgqd2lkdGg7CisKKyAgICAgICAgZm9yKHcgPSAwOyB3IDwgd2lkdGg7IHcgKyspIHsKKyAgICAgICAgICAgIGJsdXJyZWRQaXhlbCA9IDA7CisKKyAgICAgICAgICAgIGZvcihyID0gLXJhZGl1czsgciA8PSByYWRpdXM7IHIgKyspIHsKKyAgICAgICAgICAgICAgICAvLyBTdGVwcGluZyBsZWZ0IGFuZCByaWdodCBhd2F5IGZyb20gdGhlIHBpeGVsCisgICAgICAgICAgICAgICAgaW50IHZhbGlkVyA9IHcgKyByOworICAgICAgICAgICAgICAgIC8vIENsYW1wIHRvIHplcm8gYW5kIHdpZHRoIG1heCgpIGlzbid0IGV4cG9zZWQgZm9yIGludHMgeWV0CisgICAgICAgICAgICAgICAgaWYodmFsaWRXIDwgMCkgeworICAgICAgICAgICAgICAgICAgICB2YWxpZFcgPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZih2YWxpZFcgPiB3aWR0aCAtIDEpIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsaWRXID0gd2lkdGggLSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvL2ludCB2YWxpZFcgPSByc0NsYW1wKHcgKyByLCAwLCB3aWR0aCAtIDEpOworCisgICAgICAgICAgICAgICAgdWNoYXI0ICppbnB1dCA9IEluUGl4ZWwgKyBoKndpZHRoICsgdmFsaWRXOworCisgICAgICAgICAgICAgICAgZmxvYXQgd2VpZ2h0ID0gZ2F1c3NpYW5bciArIHJhZGl1c107CisgICAgICAgICAgICAgICAgY3VycmVudFBpeGVsLnggPSAoZmxvYXQpKGlucHV0LT54KTsKKyAgICAgICAgICAgICAgICBjdXJyZW50UGl4ZWwueSA9IChmbG9hdCkoaW5wdXQtPnkpOworICAgICAgICAgICAgICAgIGN1cnJlbnRQaXhlbC56ID0gKGZsb2F0KShpbnB1dC0+eik7CisgICAgICAgICAgICAgICAgLy9jdXJyZW50UGl4ZWwudyA9IChmbG9hdCkoaW5wdXQtPmEpOworCisgICAgICAgICAgICAgICAgYmx1cnJlZFBpeGVsLnh5eiArPSBjdXJyZW50UGl4ZWwueHl6ICogd2VpZ2h0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBibHVycmVkUGl4ZWwgPSBsZXZlbHNTYXR1cmF0aW9uKGJsdXJyZWRQaXhlbCk7CisKKyAgICAgICAgICAgIG91dHB1dC0+eCA9ICh1aW50OF90KWJsdXJyZWRQaXhlbC54OworICAgICAgICAgICAgb3V0cHV0LT55ID0gKHVpbnQ4X3QpYmx1cnJlZFBpeGVsLnk7CisgICAgICAgICAgICBvdXRwdXQtPnogPSAodWludDhfdClibHVycmVkUGl4ZWwuejsKKyAgICAgICAgICAgIC8vb3V0cHV0LT5hID0gKHVpbnQ4X3QpYmx1cnJlZFBpeGVsLnc7CisgICAgICAgICAgICBvdXRwdXQrKzsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHZvaWQgdmVydGljYWxCbHVyKCkgeworICAgIGZsb2F0NCBibHVycmVkUGl4ZWwgPSAwOworICAgIGZsb2F0NCBjdXJyZW50UGl4ZWwgPSAwOworICAgIC8vIFZlcnRpY2FsIGJsdXIKKyAgICBpbnQgdywgaCwgcjsKKyAgICBmb3IoaCA9IDA7IGggPCBoZWlnaHQ7IGggKyspIHsKKyAgICAgICAgdWNoYXI0ICpvdXRwdXQgPSBPdXRQaXhlbCArIGgqd2lkdGg7CisKKyAgICAgICAgZm9yKHcgPSAwOyB3IDwgd2lkdGg7IHcgKyspIHsKKworICAgICAgICAgICAgYmx1cnJlZFBpeGVsID0gMDsKKyAgICAgICAgICAgIGZvcihyID0gLXJhZGl1czsgciA8PSByYWRpdXM7IHIgKyspIHsKKyNpZiAxCisgICAgICAgICAgICAgICAgaW50IHZhbGlkSCA9IGggKyByOworICAgICAgICAgICAgICAgIC8vIENsYW1wIHRvIHplcm8gYW5kIHdpZHRoCisgICAgICAgICAgICAgICAgaWYodmFsaWRIIDwgMCkgeworICAgICAgICAgICAgICAgICAgICB2YWxpZEggPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZih2YWxpZEggPiBoZWlnaHQgLSAxKSB7CisgICAgICAgICAgICAgICAgICAgIHZhbGlkSCA9IGhlaWdodCAtIDE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdWNoYXI0ICppbnB1dCA9IFNjcmF0Y2hQaXhlbCArIHZhbGlkSCp3aWR0aCArIHc7CisKKyAgICAgICAgICAgICAgICBmbG9hdCB3ZWlnaHQgPSBnYXVzc2lhbltyICsgcmFkaXVzXTsKKworICAgICAgICAgICAgICAgIGN1cnJlbnRQaXhlbC54ID0gKGZsb2F0KShpbnB1dC0+eCk7CisgICAgICAgICAgICAgICAgY3VycmVudFBpeGVsLnkgPSAoZmxvYXQpKGlucHV0LT55KTsKKyAgICAgICAgICAgICAgICBjdXJyZW50UGl4ZWwueiA9IChmbG9hdCkoaW5wdXQtPnopOworCisgICAgICAgICAgICAgICAgYmx1cnJlZFBpeGVsLnh5eiArPSBjdXJyZW50UGl4ZWwueHl6ICogd2VpZ2h0OworI2Vsc2UKKyAgICAgICAgICAgICAgICBpbnQgdmFsaWRIID0gcnNDbGFtcChoICsgciwgMCwgaGVpZ2h0IC0gMSk7CisgICAgICAgICAgICAgICAgdWNoYXI0ICppbnB1dCA9IFNjcmF0Y2hQaXhlbCArIHZhbGlkSCp3aWR0aCArIHc7CisgICAgICAgICAgICAgICAgYmx1cnJlZFBpeGVsLnh5eiArPSBjb252ZXJ0X2Zsb2F0MyhpbnB1dC0+eHl6KSAqIGdhdXNzaWFuW3IgKyByYWRpdXNdOworI2VuZGlmCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vb3V0cHV0LT54eXogPSBjb252ZXJ0X3VjaGFyMyhibHVycmVkUGl4ZWwueHl6KTsKKyAgICAgICAgICAgIG91dHB1dC0+eCA9ICh1aW50OF90KWJsdXJyZWRQaXhlbC54OworICAgICAgICAgICAgb3V0cHV0LT55ID0gKHVpbnQ4X3QpYmx1cnJlZFBpeGVsLnk7CisgICAgICAgICAgICBvdXRwdXQtPnogPSAodWludDhfdClibHVycmVkUGl4ZWwuejsKKyAgICAgICAgICAgIC8vb3V0cHV0LT5hID0gKHVpbnQ4X3QpYmx1cnJlZFBpeGVsLnc7CisgICAgICAgICAgICBvdXRwdXQrKzsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBmaWx0ZXIoKSB7CisgICAgUlNfREVCVUcoaGVpZ2h0KTsKKyAgICBSU19ERUJVRyh3aWR0aCk7CisgICAgUlNfREVCVUcocmFkaXVzKTsKKworICAgIGNvbXB1dGVDb2xvck1hdHJpeCgpOworCisgICAgaWYocmFkaXVzID09IDApIHsKKyAgICAgICAgcHJvY2Vzc05vQmx1cigpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgY29tcHV0ZUdhdXNzaWFuV2VpZ2h0cygpOworCisgICAgaG9yaXpvbnRhbEJsdXJMZXZlbHMoKTsKKyAgICB2ZXJ0aWNhbEJsdXIoKTsKKworICAgIGludCBjb3VudCA9IDA7CisgICAgcnNTZW5kVG9DbGllbnQoJmNvdW50LCAxLCA0LCAwKTsKK30KKwordm9pZCBmaWx0ZXJCZW5jaG1hcmsoKSB7CisKKyAgICBjb21wdXRlR2F1c3NpYW5XZWlnaHRzKCk7CisKKyAgICBob3Jpem9udGFsQmx1cigpOworICAgIHZlcnRpY2FsQmx1cigpOworCisgICAgaW50IGNvdW50ID0gMDsKKyAgICByc1NlbmRUb0NsaWVudCgmY291bnQsIDEsIDQsIDApOworfQorCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvSW1hZ2VQcm9jZXNzaW5nL3Jlcy9yYXcvdGhyZXNob2xkX2JjLmJjIGIvbGlicy9ycy9qYXZhL0ltYWdlUHJvY2Vzc2luZy9yZXMvcmF3L3RocmVzaG9sZF9iYy5iYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NWRjZDhkCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9qYXZhL0ltYWdlUHJvY2Vzc2luZy9yZXMvcmF3L3RocmVzaG9sZF9iYy5iYwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvSW1hZ2VQcm9jZXNzaW5nL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwgYi9saWJzL3JzL2phdmEvSW1hZ2VQcm9jZXNzaW5nL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2M1Y2M0ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvamF2YS9JbWFnZVByb2Nlc3NpbmcvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbApAQCAtMCwwICsxLDMzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorLyoKKyogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworLS0+CisKKzxyZXNvdXJjZXMgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgorICAgIDwhLS0gR2VuZXJhbCAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS1zbGlkZXIgbGFiZWwgLS0+CisgICAgPHN0cmluZyBuYW1lPSJibHVyX2Rlc2NyaXB0aW9uIj5CbHVyIFJhZGl1czwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iaW5fd2hpdGUiPkluIFdoaXRlPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJvdXRfd2hpdGUiPk91dCBXaGl0ZTwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iaW5fYmxhY2siPkluIEJsYWNrPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJvdXRfYmxhY2siPk91dCBCbGFjazwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZ2FtbWEiPkdhbW1hPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJzYXR1cmF0aW9uIj5TYXR1cmF0aW9uPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJiZW5jaG1hcmsiPkJlbmNobWFyazwvc3RyaW5nPgorCis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9JbWFnZVByb2Nlc3Npbmcvc3JjL2NvbS9hbmRyb2lkL3JzL2ltYWdlL0ltYWdlUHJvY2Vzc2luZ0FjdGl2aXR5LmphdmEgYi9saWJzL3JzL2phdmEvSW1hZ2VQcm9jZXNzaW5nL3NyYy9jb20vYW5kcm9pZC9ycy9pbWFnZS9JbWFnZVByb2Nlc3NpbmdBY3Rpdml0eS5qYXZhCmluZGV4IDljZTUzZDguLjdiZjY1OTYgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvamF2YS9JbWFnZVByb2Nlc3Npbmcvc3JjL2NvbS9hbmRyb2lkL3JzL2ltYWdlL0ltYWdlUHJvY2Vzc2luZ0FjdGl2aXR5LmphdmEKKysrIGIvbGlicy9ycy9qYXZhL0ltYWdlUHJvY2Vzc2luZy9zcmMvY29tL2FuZHJvaWQvcnMvaW1hZ2UvSW1hZ2VQcm9jZXNzaW5nQWN0aXZpdHkuamF2YQpAQCAtMzEsNTMgKzMxLDUzIEBACiBpbXBvcnQgYW5kcm9pZC52aWV3LlN1cmZhY2VIb2xkZXI7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuSW1hZ2VWaWV3OwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlNlZWtCYXI7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CiBpbXBvcnQgamF2YS5sYW5nLk1hdGg7CiAKLXB1YmxpYyBjbGFzcyBJbWFnZVByb2Nlc3NpbmdBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IGltcGxlbWVudHMgU3VyZmFjZUhvbGRlci5DYWxsYmFjayB7Ci0gICAgcHJpdmF0ZSBCaXRtYXAgbUJpdG1hcDsKLSAgICBwcml2YXRlIFBhcmFtcyBtUGFyYW1zOwotICAgIHByaXZhdGUgU2NyaXB0Lkludm9rYWJsZSBtSW52b2thYmxlOwotICAgIHByaXZhdGUgaW50W10gbUluRGF0YTsKLSAgICBwcml2YXRlIGludFtdIG1PdXREYXRhOworcHVibGljIGNsYXNzIEltYWdlUHJvY2Vzc2luZ0FjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudHMgU3VyZmFjZUhvbGRlci5DYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlZWtCYXIuT25TZWVrQmFyQ2hhbmdlTGlzdGVuZXIgeworICAgIHByaXZhdGUgQml0bWFwIG1CaXRtYXBJbjsKKyAgICBwcml2YXRlIEJpdG1hcCBtQml0bWFwT3V0OworICAgIHByaXZhdGUgQml0bWFwIG1CaXRtYXBTY3JhdGNoOworICAgIHByaXZhdGUgU2NyaXB0Q19UaHJlc2hvbGQgbVNjcmlwdDsKKyAgICBwcml2YXRlIGludCBtUmFkaXVzID0gMDsKKyAgICBwcml2YXRlIFNlZWtCYXIgbVJhZGl1c1NlZWtCYXI7CisKKyAgICBwcml2YXRlIGZsb2F0IG1JbkJsYWNrID0gMC4wZjsKKyAgICBwcml2YXRlIFNlZWtCYXIgbUluQmxhY2tTZWVrQmFyOworICAgIHByaXZhdGUgZmxvYXQgbU91dEJsYWNrID0gMC4wZjsKKyAgICBwcml2YXRlIFNlZWtCYXIgbU91dEJsYWNrU2Vla0JhcjsKKyAgICBwcml2YXRlIGZsb2F0IG1JbldoaXRlID0gMjU1LjBmOworICAgIHByaXZhdGUgU2Vla0JhciBtSW5XaGl0ZVNlZWtCYXI7CisgICAgcHJpdmF0ZSBmbG9hdCBtT3V0V2hpdGUgPSAyNTUuMGY7CisgICAgcHJpdmF0ZSBTZWVrQmFyIG1PdXRXaGl0ZVNlZWtCYXI7CisgICAgcHJpdmF0ZSBmbG9hdCBtR2FtbWEgPSAxLjBmOworICAgIHByaXZhdGUgU2Vla0JhciBtR2FtbWFTZWVrQmFyOworCisgICAgcHJpdmF0ZSBmbG9hdCBtU2F0dXJhdGlvbiA9IDEuMGY7CisgICAgcHJpdmF0ZSBTZWVrQmFyIG1TYXR1cmF0aW9uU2Vla0JhcjsKKworICAgIHByaXZhdGUgVGV4dFZpZXcgbUJlbmNobWFya1Jlc3VsdDsKIAogICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsiRmllbGRDYW5CZUxvY2FsIn0pCiAgICAgcHJpdmF0ZSBSZW5kZXJTY3JpcHQgbVJTOwogICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsiRmllbGRDYW5CZUxvY2FsIn0pCi0gICAgcHJpdmF0ZSBUeXBlIG1QYXJhbXNUeXBlOwotICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsiRmllbGRDYW5CZUxvY2FsIn0pCi0gICAgcHJpdmF0ZSBBbGxvY2F0aW9uIG1QYXJhbXNBbGxvY2F0aW9uOwotICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsiRmllbGRDYW5CZUxvY2FsIn0pCiAgICAgcHJpdmF0ZSBUeXBlIG1QaXhlbFR5cGU7CiAgICAgQFN1cHByZXNzV2FybmluZ3MoeyJGaWVsZENhbkJlTG9jYWwifSkKICAgICBwcml2YXRlIEFsbG9jYXRpb24gbUluUGl4ZWxzQWxsb2NhdGlvbjsKICAgICBAU3VwcHJlc3NXYXJuaW5ncyh7IkZpZWxkQ2FuQmVMb2NhbCJ9KQogICAgIHByaXZhdGUgQWxsb2NhdGlvbiBtT3V0UGl4ZWxzQWxsb2NhdGlvbjsKKyAgICBAU3VwcHJlc3NXYXJuaW5ncyh7IkZpZWxkQ2FuQmVMb2NhbCJ9KQorICAgIHByaXZhdGUgQWxsb2NhdGlvbiBtU2NyYXRjaFBpeGVsc0FsbG9jYXRpb247CiAKICAgICBwcml2YXRlIFN1cmZhY2VWaWV3IG1TdXJmYWNlVmlldzsKICAgICBwcml2YXRlIEltYWdlVmlldyBtRGlzcGxheVZpZXc7CiAKLSAgICBzdGF0aWMgY2xhc3MgUGFyYW1zIHsKLSAgICAgICAgcHVibGljIGludCBpbldpZHRoOwotICAgICAgICBwdWJsaWMgaW50IG91dFdpZHRoOwotICAgICAgICBwdWJsaWMgaW50IGluSGVpZ2h0OwotICAgICAgICBwdWJsaWMgaW50IG91dEhlaWdodDsKLQotICAgICAgICBwdWJsaWMgZmxvYXQgdGhyZXNob2xkOwotICAgIH0KLQotICAgIHN0YXRpYyBjbGFzcyBQaXhlbCB7Ci0gICAgICAgIHB1YmxpYyBieXRlIGE7Ci0gICAgICAgIHB1YmxpYyBieXRlIHI7Ci0gICAgICAgIHB1YmxpYyBieXRlIGc7Ci0gICAgICAgIHB1YmxpYyBieXRlIGI7Ci0gICAgfQotCiAgICAgY2xhc3MgRmlsdGVyQ2FsbGJhY2sgZXh0ZW5kcyBSZW5kZXJTY3JpcHQuUlNNZXNzYWdlIHsKICAgICAgICAgcHJpdmF0ZSBSdW5uYWJsZSBtQWN0aW9uID0gbmV3IFJ1bm5hYmxlKCkgewogICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgIG1PdXRQaXhlbHNBbGxvY2F0aW9uLnJlYWREYXRhKG1PdXREYXRhKTsKLSAgICAgICAgICAgICAgICBtQml0bWFwLnNldFBpeGVscyhtT3V0RGF0YSwgMCwgbVBhcmFtcy5vdXRXaWR0aCwgMCwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1QYXJhbXMub3V0V2lkdGgsIG1QYXJhbXMub3V0SGVpZ2h0KTsKICAgICAgICAgICAgICAgICBtRGlzcGxheVZpZXcuaW52YWxpZGF0ZSgpOwogICAgICAgICAgICAgfQogICAgICAgICB9OwpAQCAtODksMjkgKzg5LDIxOSBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHJpdmF0ZSB2b2lkIGphdmFGaWx0ZXIoKSB7CisgICAgaW50IGluW107CisgICAgaW50IGludGVybVtdOworICAgIGludCBvdXRbXTsKKyAgICBpbnQgTUFYX1JBRElVUyA9IDI1OworICAgIC8vIFN0b3JlIG91ciBjb2VmZmljaWVudHMgaGVyZQorICAgIGZsb2F0IGdhdXNzaWFuW107CisKKyAgICBwcml2YXRlIGxvbmcgamF2YUZpbHRlcigpIHsKKyAgICAgICAgZmluYWwgaW50IHdpZHRoID0gbUJpdG1hcEluLmdldFdpZHRoKCk7CisgICAgICAgIGZpbmFsIGludCBoZWlnaHQgPSBtQml0bWFwSW4uZ2V0SGVpZ2h0KCk7CisgICAgICAgIGZpbmFsIGludCBjb3VudCA9IHdpZHRoICogaGVpZ2h0OworCisgICAgICAgIGlmIChpbiA9PSBudWxsKSB7CisgICAgICAgICAgICBpbiA9IG5ldyBpbnRbY291bnRdOworICAgICAgICAgICAgaW50ZXJtID0gbmV3IGludFtjb3VudF07CisgICAgICAgICAgICBvdXQgPSBuZXcgaW50W2NvdW50XTsKKyAgICAgICAgICAgIGdhdXNzaWFuID0gbmV3IGZsb2F0W01BWF9SQURJVVMgKiAyICsgMV07CisgICAgICAgICAgICBtQml0bWFwSW4uZ2V0UGl4ZWxzKGluLCAwLCB3aWR0aCwgMCwgMCwgd2lkdGgsIGhlaWdodCk7CisgICAgICAgIH0KKwogICAgICAgICBsb25nIHQgPSBqYXZhLmxhbmcuU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgIGludCBjb3VudCA9IG1QYXJhbXMuaW5XaWR0aCAqIG1QYXJhbXMuaW5IZWlnaHQ7Ci0gICAgICAgIGZsb2F0IHRocmVzaG9sZCA9IG1QYXJhbXMudGhyZXNob2xkICogMjU1LmY7CiAKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICBmaW5hbCBmbG9hdCByID0gKGZsb2F0KSgobUluRGF0YVtpXSA+PiAwKSAmIDB4ZmYpOwotICAgICAgICAgICAgZmluYWwgZmxvYXQgZyA9IChmbG9hdCkoKG1JbkRhdGFbaV0gPj4gOCkgJiAweGZmKTsKLSAgICAgICAgICAgIGZpbmFsIGZsb2F0IGIgPSAoZmxvYXQpKChtSW5EYXRhW2ldID4+IDE2KSAmIDB4ZmYpOworICAgICAgICBpbnQgdywgaCwgcjsKIAotICAgICAgICAgICAgZmluYWwgZmxvYXQgbHVtaW5hbmNlID0gMC4yMTI1ZiAqIHIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC43MTU0ZiAqIGcgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wNzIxZiAqIGI7Ci0gICAgICAgICAgICBpZiAobHVtaW5hbmNlID4gdGhyZXNob2xkKSB7Ci0gICAgICAgICAgICAgICAgbU91dERhdGFbaV0gPSBtSW5EYXRhW2ldOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtT3V0RGF0YVtpXSA9IG1JbkRhdGFbaV0gJiAweGZmMDAwMDAwOworICAgICAgICBmbG9hdCBmUmFkaXVzID0gKGZsb2F0KW1SYWRpdXM7CisgICAgICAgIGludCByYWRpdXMgPSAoaW50KW1SYWRpdXM7CisKKyAgICAgICAgLy8gQ29tcHV0ZSBnYXVzc2lhbiB3ZWlnaHRzIGZvciB0aGUgYmx1cgorICAgICAgICAvLyBlIGlzIHRoZSBldWxlcidzIG51bWJlcgorICAgICAgICBmbG9hdCBlID0gMi43MTgyODE4Mjg0NTkwNDVmOworICAgICAgICBmbG9hdCBwaSA9IDMuMTQxNTkyNjUzNTg5NzkzMmY7CisgICAgICAgIC8vIGcoeCkgPSAoIDEgLyBzcXJ0KCAyICogcGkgKSAqIHNpZ21hKSAqIGUgXiAoIC14XjIgLyAyICogc2lnbWFeMiApCisgICAgICAgIC8vIHggaXMgb2YgdGhlIGZvcm0gWy1yYWRpdXMgLi4gMCAuLiByYWRpdXNdCisgICAgICAgIC8vIGFuZCBzaWdtYSB2YXJpZXMgd2l0aCByYWRpdXMuCisgICAgICAgIC8vIEJhc2VkIG9uIHNvbWUgZXhwZXJpbWVudGFsIHJhZGl1cyB2YWx1ZXMgYW5kIHNpZ21hJ3MKKyAgICAgICAgLy8gd2UgYXBwcm94aW1hdGVseSBmaXQgc2lnbWEgPSBmKHJhZGl1cykgYXMKKyAgICAgICAgLy8gc2lnbWEgPSByYWRpdXMgKiAwLjQgICsgMC42CisgICAgICAgIC8vIFRoZSBsYXJnZXIgdGhlIHJhZGl1cyBnZXRzLCB0aGUgbW9yZSBvdXIgZ2F1c3NpYW4gYmx1cgorICAgICAgICAvLyB3aWxsIHJlc2VtYmxlIGEgYm94IGJsdXIgc2luY2Ugd2l0aCBsYXJnZSBzaWdtYQorICAgICAgICAvLyB0aGUgZ2F1c3NpYW4gY3VydmUgYmVnaW5zIHRvIGxvc2UgaXRzIHNoYXBlCisgICAgICAgIGZsb2F0IHNpZ21hID0gMC40ZiAqIGZSYWRpdXMgKyAwLjZmOworICAgICAgICAvLyBOb3cgY29tcHV0ZSB0aGUgY29lZmZpY2ludHMKKyAgICAgICAgLy8gV2Ugd2lsbCBzdG9yZSBzb21lIHJlZHVuZGFudCB2YWx1ZXMgdG8gc2F2ZSBzb21lIG1hdGggZHVyaW5nCisgICAgICAgIC8vIHRoZSBibHVyIGNhbGN1bGF0aW9ucworICAgICAgICAvLyBwcmVjb21wdXRlIHNvbWUgdmFsdWVzCisgICAgICAgIGZsb2F0IGNvZWZmMSA9IDEuMGYgLyAoZmxvYXQpKE1hdGguc3FydCggMi4wZiAqIHBpICkgKiBzaWdtYSk7CisgICAgICAgIGZsb2F0IGNvZWZmMiA9IC0gMS4wZiAvICgyLjBmICogc2lnbWEgKiBzaWdtYSk7CisgICAgICAgIGZsb2F0IG5vcm1hbGl6ZUZhY3RvciA9IDAuMGY7CisgICAgICAgIGZsb2F0IGZsb2F0UiA9IDAuMGY7CisgICAgICAgIGZvcihyID0gLXJhZGl1czsgciA8PSByYWRpdXM7IHIgKyspIHsKKyAgICAgICAgICAgIGZsb2F0UiA9IChmbG9hdClyOworICAgICAgICAgICAgZ2F1c3NpYW5bciArIHJhZGl1c10gPSBjb2VmZjEgKiAoZmxvYXQpTWF0aC5wb3coZSwgZmxvYXRSICogZmxvYXRSICogY29lZmYyKTsKKyAgICAgICAgICAgIG5vcm1hbGl6ZUZhY3RvciArPSBnYXVzc2lhbltyICsgcmFkaXVzXTsKKyAgICAgICAgfQorCisgICAgICAgIC8vTm93IHdlIG5lZWQgdG8gbm9ybWFsaXplIHRoZSB3ZWlnaHRzIGJlY2F1c2UgYWxsIG91ciBjb2VmZmljaWVudHMgbmVlZCB0byBhZGQgdXAgdG8gb25lCisgICAgICAgIG5vcm1hbGl6ZUZhY3RvciA9IDEuMGYgLyBub3JtYWxpemVGYWN0b3I7CisgICAgICAgIGZvcihyID0gLXJhZGl1czsgciA8PSByYWRpdXM7IHIgKyspIHsKKyAgICAgICAgICAgIGZsb2F0UiA9IChmbG9hdClyOworICAgICAgICAgICAgZ2F1c3NpYW5bciArIHJhZGl1c10gKj0gbm9ybWFsaXplRmFjdG9yOworICAgICAgICB9CisKKyAgICAgICAgZmxvYXQgYmx1cnJlZFBpeGVsUiA9IDAuMGY7CisgICAgICAgIGZsb2F0IGJsdXJyZWRQaXhlbEcgPSAwLjBmOworICAgICAgICBmbG9hdCBibHVycmVkUGl4ZWxCID0gMC4wZjsKKyAgICAgICAgZmxvYXQgYmx1cnJlZFBpeGVsQSA9IDAuMGY7CisKKyAgICAgICAgZm9yKGggPSAwOyBoIDwgaGVpZ2h0OyBoICsrKSB7CisgICAgICAgICAgICBmb3IodyA9IDA7IHcgPCB3aWR0aDsgdyArKykgeworCisgICAgICAgICAgICAgICAgYmx1cnJlZFBpeGVsUiA9IDAuMGY7CisgICAgICAgICAgICAgICAgYmx1cnJlZFBpeGVsRyA9IDAuMGY7CisgICAgICAgICAgICAgICAgYmx1cnJlZFBpeGVsQiA9IDAuMGY7CisgICAgICAgICAgICAgICAgYmx1cnJlZFBpeGVsQSA9IDAuMGY7CisKKyAgICAgICAgICAgICAgICBmb3IociA9IC1yYWRpdXM7IHIgPD0gcmFkaXVzOyByICsrKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFN0ZXBwaW5nIGxlZnQgYW5kIHJpZ2h0IGF3YXkgZnJvbSB0aGUgcGl4ZWwKKyAgICAgICAgICAgICAgICAgICAgaW50IHZhbGlkVyA9IHcgKyByOworICAgICAgICAgICAgICAgICAgICAvLyBDbGFtcCB0byB6ZXJvIGFuZCB3aWR0aCBtYXgoKSBpc24ndCBleHBvc2VkIGZvciBpbnRzIHlldAorICAgICAgICAgICAgICAgICAgICBpZih2YWxpZFcgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZFcgPSAwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmKHZhbGlkVyA+IHdpZHRoIC0gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRXID0gd2lkdGggLSAxOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaW50IGlucHV0ID0gaW5baCp3aWR0aCArIHZhbGlkV107CisKKyAgICAgICAgICAgICAgICAgICAgaW50IFIgPSAoKGlucHV0ID4+IDI0KSAmIDB4ZmYpOworICAgICAgICAgICAgICAgICAgICBpbnQgRyA9ICgoaW5wdXQgPj4gMTYpICYgMHhmZik7CisgICAgICAgICAgICAgICAgICAgIGludCBCID0gKChpbnB1dCA+PiA4KSAmIDB4ZmYpOworICAgICAgICAgICAgICAgICAgICBpbnQgQSA9IChpbnB1dCAmIDB4ZmYpOworCisgICAgICAgICAgICAgICAgICAgIGZsb2F0IHdlaWdodCA9IGdhdXNzaWFuW3IgKyByYWRpdXNdOworCisgICAgICAgICAgICAgICAgICAgIGJsdXJyZWRQaXhlbFIgKz0gKGZsb2F0KShSKSp3ZWlnaHQ7CisgICAgICAgICAgICAgICAgICAgIGJsdXJyZWRQaXhlbEcgKz0gKGZsb2F0KShHKSp3ZWlnaHQ7CisgICAgICAgICAgICAgICAgICAgIGJsdXJyZWRQaXhlbEIgKz0gKGZsb2F0KShCKSp3ZWlnaHQ7CisgICAgICAgICAgICAgICAgICAgIGJsdXJyZWRQaXhlbEEgKz0gKGZsb2F0KShBKSp3ZWlnaHQ7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaW50IFIgPSAoaW50KWJsdXJyZWRQaXhlbFI7CisgICAgICAgICAgICAgICAgaW50IEcgPSAoaW50KWJsdXJyZWRQaXhlbEc7CisgICAgICAgICAgICAgICAgaW50IEIgPSAoaW50KWJsdXJyZWRQaXhlbEI7CisgICAgICAgICAgICAgICAgaW50IEEgPSAoaW50KWJsdXJyZWRQaXhlbEE7CisKKyAgICAgICAgICAgICAgICBpbnRlcm1baCp3aWR0aCArIHddID0gKFIgPDwgMjQpIHwgKEcgPDwgMTYpIHwgKEIgPDwgOCkgfCAoQSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmb3IoaCA9IDA7IGggPCBoZWlnaHQ7IGggKyspIHsKKyAgICAgICAgICAgIGZvcih3ID0gMDsgdyA8IHdpZHRoOyB3ICsrKSB7CisKKyAgICAgICAgICAgICAgICBibHVycmVkUGl4ZWxSID0gMC4wZjsKKyAgICAgICAgICAgICAgICBibHVycmVkUGl4ZWxHID0gMC4wZjsKKyAgICAgICAgICAgICAgICBibHVycmVkUGl4ZWxCID0gMC4wZjsKKyAgICAgICAgICAgICAgICBibHVycmVkUGl4ZWxBID0gMC4wZjsKKyAgICAgICAgICAgICAgICBmb3IociA9IC1yYWRpdXM7IHIgPD0gcmFkaXVzOyByICsrKSB7CisgICAgICAgICAgICAgICAgICAgIGludCB2YWxpZEggPSBoICsgcjsKKyAgICAgICAgICAgICAgICAgICAgLy8gQ2xhbXAgdG8gemVybyBhbmQgd2lkdGgKKyAgICAgICAgICAgICAgICAgICAgaWYodmFsaWRIIDwgMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRIID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZih2YWxpZEggPiBoZWlnaHQgLSAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZEggPSBoZWlnaHQgLSAxOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaW50IGlucHV0ID0gaW50ZXJtW3ZhbGlkSCp3aWR0aCArIHddOworCisgICAgICAgICAgICAgICAgICAgIGludCBSID0gKChpbnB1dCA+PiAyNCkgJiAweGZmKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IEcgPSAoKGlucHV0ID4+IDE2KSAmIDB4ZmYpOworICAgICAgICAgICAgICAgICAgICBpbnQgQiA9ICgoaW5wdXQgPj4gOCkgJiAweGZmKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IEEgPSAoaW5wdXQgJiAweGZmKTsKKworICAgICAgICAgICAgICAgICAgICBmbG9hdCB3ZWlnaHQgPSBnYXVzc2lhbltyICsgcmFkaXVzXTsKKworICAgICAgICAgICAgICAgICAgICBibHVycmVkUGl4ZWxSICs9IChmbG9hdCkoUikqd2VpZ2h0OworICAgICAgICAgICAgICAgICAgICBibHVycmVkUGl4ZWxHICs9IChmbG9hdCkoRykqd2VpZ2h0OworICAgICAgICAgICAgICAgICAgICBibHVycmVkUGl4ZWxCICs9IChmbG9hdCkoQikqd2VpZ2h0OworICAgICAgICAgICAgICAgICAgICBibHVycmVkUGl4ZWxBICs9IChmbG9hdCkoQSkqd2VpZ2h0OworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGludCBSID0gKGludClibHVycmVkUGl4ZWxSOworICAgICAgICAgICAgICAgIGludCBHID0gKGludClibHVycmVkUGl4ZWxHOworICAgICAgICAgICAgICAgIGludCBCID0gKGludClibHVycmVkUGl4ZWxCOworICAgICAgICAgICAgICAgIGludCBBID0gKGludClibHVycmVkUGl4ZWxBOworCisgICAgICAgICAgICAgICAgb3V0W2gqd2lkdGggKyB3XSA9IChSIDw8IDI0KSB8IChHIDw8IDE2KSB8IChCIDw8IDgpIHwgKEEpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgdCA9IGphdmEubGFuZy5TeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHQ7CisgICAgICAgIGFuZHJvaWQudXRpbC5Mb2cudigiSW1nIiwgIkphdmEgZnJhbWUgdGltZSBtcyAiICsgdCk7CisgICAgICAgIG1CaXRtYXBPdXQuc2V0UGl4ZWxzKG91dCwgMCwgd2lkdGgsIDAsIDAsIHdpZHRoLCBoZWlnaHQpOworICAgICAgICByZXR1cm4gdDsKKyAgICB9CiAKLSAgICAgICAgYW5kcm9pZC51dGlsLkxvZy52KCJJbWciLCAiZnJhbWUgdGltZSBtcyAiICsgdCk7CisgICAgcHVibGljIHZvaWQgb25Qcm9ncmVzc0NoYW5nZWQoU2Vla0JhciBzZWVrQmFyLCBpbnQgcHJvZ3Jlc3MsIGJvb2xlYW4gZnJvbVVzZXIpIHsKKyAgICAgICAgaWYgKGZyb21Vc2VyKSB7CisKKyAgICAgICAgICAgIGlmKHNlZWtCYXIgPT0gbVJhZGl1c1NlZWtCYXIpIHsKKyAgICAgICAgICAgICAgICBmbG9hdCBmUmFkaXVzID0gcHJvZ3Jlc3MgLyAxMDAuMGY7CisgICAgICAgICAgICAgICAgZlJhZGl1cyAqPSAoZmxvYXQpKE1BWF9SQURJVVMpOworICAgICAgICAgICAgICAgIG1SYWRpdXMgPSAoaW50KWZSYWRpdXM7CisKKyAgICAgICAgICAgICAgICBtU2NyaXB0LnNldF9yYWRpdXMobVJhZGl1cyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmKHNlZWtCYXIgPT0gbUluQmxhY2tTZWVrQmFyKSB7CisgICAgICAgICAgICAgICAgbUluQmxhY2sgPSAoZmxvYXQpcHJvZ3Jlc3M7CisgICAgICAgICAgICAgICAgbVNjcmlwdC5zZXRfaW5CbGFjayhtSW5CbGFjayk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmKHNlZWtCYXIgPT0gbU91dEJsYWNrU2Vla0JhcikgeworICAgICAgICAgICAgICAgIG1PdXRCbGFjayA9IChmbG9hdClwcm9ncmVzczsKKyAgICAgICAgICAgICAgICBtU2NyaXB0LnNldF9vdXRCbGFjayhtT3V0QmxhY2spOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZihzZWVrQmFyID09IG1JbldoaXRlU2Vla0JhcikgeworICAgICAgICAgICAgICAgIG1JbldoaXRlID0gKGZsb2F0KXByb2dyZXNzICsgMTI3LjBmOworICAgICAgICAgICAgICAgIG1TY3JpcHQuc2V0X2luV2hpdGUobUluV2hpdGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZihzZWVrQmFyID09IG1PdXRXaGl0ZVNlZWtCYXIpIHsKKyAgICAgICAgICAgICAgICBtT3V0V2hpdGUgPSAoZmxvYXQpcHJvZ3Jlc3MgKyAxMjcuMGY7CisgICAgICAgICAgICAgICAgbVNjcmlwdC5zZXRfb3V0V2hpdGUobU91dFdoaXRlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYoc2Vla0JhciA9PSBtR2FtbWFTZWVrQmFyKSB7CisgICAgICAgICAgICAgICAgbUdhbW1hID0gKGZsb2F0KXByb2dyZXNzLzEwMC4wZjsKKyAgICAgICAgICAgICAgICBtR2FtbWEgPSBNYXRoLm1heChtR2FtbWEsIDAuMWYpOworICAgICAgICAgICAgICAgIG1HYW1tYSA9IDEuMGYgLyBtR2FtbWE7CisgICAgICAgICAgICAgICAgbVNjcmlwdC5zZXRfZ2FtbWEobUdhbW1hKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYoc2Vla0JhciA9PSBtU2F0dXJhdGlvblNlZWtCYXIpIHsKKyAgICAgICAgICAgICAgICBtU2F0dXJhdGlvbiA9IChmbG9hdClwcm9ncmVzcyAvIDUwLjBmOworICAgICAgICAgICAgICAgIG1TY3JpcHQuc2V0X3NhdHVyYXRpb24obVNhdHVyYXRpb24pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBsb25nIHQgPSBqYXZhLmxhbmcuU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgICAgICBpZiAodHJ1ZSkgeworICAgICAgICAgICAgICAgIG1TY3JpcHQuaW52b2tlX2ZpbHRlcigpOworICAgICAgICAgICAgICAgIG1SUy5maW5pc2goKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgamF2YUZpbHRlcigpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0ID0gamF2YS5sYW5nLlN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gdDsKKyAgICAgICAgICAgIGFuZHJvaWQudXRpbC5Mb2cudigiSW1nIiwgIlJlbmRlcnNjcmlwdCBmcmFtZSB0aW1lIGNvcmUgbXMgIiArIHQpOworCisgICAgICAgICAgICBtRGlzcGxheVZpZXcuaW52YWxpZGF0ZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgb25TdGFydFRyYWNraW5nVG91Y2goU2Vla0JhciBzZWVrQmFyKSB7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgb25TdG9wVHJhY2tpbmdUb3VjaChTZWVrQmFyIHNlZWtCYXIpIHsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTExOSw0NSArMzA5LDU0IEBACiAgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CiAgICAgICAgIHNldENvbnRlbnRWaWV3KFIubGF5b3V0Lm1haW4pOwogCi0gICAgICAgIG1CaXRtYXAgPSBsb2FkQml0bWFwKFIuZHJhd2FibGUuZGF0YSk7CisgICAgICAgIG1CaXRtYXBJbiA9IGxvYWRCaXRtYXAoUi5kcmF3YWJsZS5kYXRhKTsKKyAgICAgICAgbUJpdG1hcE91dCA9IGxvYWRCaXRtYXAoUi5kcmF3YWJsZS5kYXRhKTsKKyAgICAgICAgbUJpdG1hcFNjcmF0Y2ggPSBsb2FkQml0bWFwKFIuZHJhd2FibGUuZGF0YSk7CiAKICAgICAgICAgbVN1cmZhY2VWaWV3ID0gKFN1cmZhY2VWaWV3KSBmaW5kVmlld0J5SWQoUi5pZC5zdXJmYWNlKTsKICAgICAgICAgbVN1cmZhY2VWaWV3LmdldEhvbGRlcigpLmFkZENhbGxiYWNrKHRoaXMpOwogCiAgICAgICAgIG1EaXNwbGF5VmlldyA9IChJbWFnZVZpZXcpIGZpbmRWaWV3QnlJZChSLmlkLmRpc3BsYXkpOwotICAgICAgICBtRGlzcGxheVZpZXcuc2V0SW1hZ2VCaXRtYXAobUJpdG1hcCk7CisgICAgICAgIG1EaXNwbGF5Vmlldy5zZXRJbWFnZUJpdG1hcChtQml0bWFwT3V0KTsKIAotICAgICAgICAoKFNlZWtCYXIpIGZpbmRWaWV3QnlJZChSLmlkLnRocmVzaG9sZCkpLnNldE9uU2Vla0JhckNoYW5nZUxpc3RlbmVyKAotICAgICAgICAgICAgICAgIG5ldyBTZWVrQmFyLk9uU2Vla0JhckNoYW5nZUxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgb25Qcm9ncmVzc0NoYW5nZWQoU2Vla0JhciBzZWVrQmFyLCBpbnQgcHJvZ3Jlc3MsIGJvb2xlYW4gZnJvbVVzZXIpIHsKLSAgICAgICAgICAgICAgICBpZiAoZnJvbVVzZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgbVBhcmFtcy50aHJlc2hvbGQgPSBwcm9ncmVzcyAvIDEwMC4wZjsKLSAgICAgICAgICAgICAgICAgICAgbVBhcmFtc0FsbG9jYXRpb24uZGF0YShtUGFyYW1zKTsKKyAgICAgICAgbVJhZGl1c1NlZWtCYXIgPSAoU2Vla0JhcikgZmluZFZpZXdCeUlkKFIuaWQucmFkaXVzKTsKKyAgICAgICAgbVJhZGl1c1NlZWtCYXIuc2V0T25TZWVrQmFyQ2hhbmdlTGlzdGVuZXIodGhpcyk7CiAKLSAgICAgICAgICAgICAgICAgICAgaWYgKHRydWUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1JbnZva2FibGUuZXhlY3V0ZSgpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgamF2YUZpbHRlcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgbUJpdG1hcC5zZXRQaXhlbHMobU91dERhdGEsIDAsIG1QYXJhbXMub3V0V2lkdGgsIDAsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QYXJhbXMub3V0V2lkdGgsIG1QYXJhbXMub3V0SGVpZ2h0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1EaXNwbGF5Vmlldy5pbnZhbGlkYXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9CisgICAgICAgIG1JbkJsYWNrU2Vla0JhciA9IChTZWVrQmFyKWZpbmRWaWV3QnlJZChSLmlkLmluQmxhY2spOworICAgICAgICBtSW5CbGFja1NlZWtCYXIuc2V0T25TZWVrQmFyQ2hhbmdlTGlzdGVuZXIodGhpcyk7CisgICAgICAgIG1JbkJsYWNrU2Vla0Jhci5zZXRNYXgoMTI4KTsKKyAgICAgICAgbUluQmxhY2tTZWVrQmFyLnNldFByb2dyZXNzKDApOworICAgICAgICBtT3V0QmxhY2tTZWVrQmFyID0gKFNlZWtCYXIpZmluZFZpZXdCeUlkKFIuaWQub3V0QmxhY2spOworICAgICAgICBtT3V0QmxhY2tTZWVrQmFyLnNldE9uU2Vla0JhckNoYW5nZUxpc3RlbmVyKHRoaXMpOworICAgICAgICBtT3V0QmxhY2tTZWVrQmFyLnNldE1heCgxMjgpOworICAgICAgICBtT3V0QmxhY2tTZWVrQmFyLnNldFByb2dyZXNzKDApOwogCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvblN0YXJ0VHJhY2tpbmdUb3VjaChTZWVrQmFyIHNlZWtCYXIpIHsKLSAgICAgICAgICAgIH0KKyAgICAgICAgbUluV2hpdGVTZWVrQmFyID0gKFNlZWtCYXIpZmluZFZpZXdCeUlkKFIuaWQuaW5XaGl0ZSk7CisgICAgICAgIG1JbldoaXRlU2Vla0Jhci5zZXRPblNlZWtCYXJDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgbUluV2hpdGVTZWVrQmFyLnNldE1heCgxMjgpOworICAgICAgICBtSW5XaGl0ZVNlZWtCYXIuc2V0UHJvZ3Jlc3MoMTI4KTsKKyAgICAgICAgbU91dFdoaXRlU2Vla0JhciA9IChTZWVrQmFyKWZpbmRWaWV3QnlJZChSLmlkLm91dFdoaXRlKTsKKyAgICAgICAgbU91dFdoaXRlU2Vla0Jhci5zZXRPblNlZWtCYXJDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgbU91dFdoaXRlU2Vla0Jhci5zZXRNYXgoMTI4KTsKKyAgICAgICAgbU91dFdoaXRlU2Vla0Jhci5zZXRQcm9ncmVzcygxMjgpOwogCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvblN0b3BUcmFja2luZ1RvdWNoKFNlZWtCYXIgc2Vla0JhcikgewotICAgICAgICAgICAgfQotICAgICAgICB9KTsKKyAgICAgICAgbUdhbW1hU2Vla0JhciA9IChTZWVrQmFyKWZpbmRWaWV3QnlJZChSLmlkLmluR2FtbWEpOworICAgICAgICBtR2FtbWFTZWVrQmFyLnNldE9uU2Vla0JhckNoYW5nZUxpc3RlbmVyKHRoaXMpOworICAgICAgICBtR2FtbWFTZWVrQmFyLnNldE1heCgxNTApOworICAgICAgICBtR2FtbWFTZWVrQmFyLnNldFByb2dyZXNzKDEwMCk7CisKKyAgICAgICAgbVNhdHVyYXRpb25TZWVrQmFyID0gKFNlZWtCYXIpZmluZFZpZXdCeUlkKFIuaWQuaW5TYXR1cmF0aW9uKTsKKyAgICAgICAgbVNhdHVyYXRpb25TZWVrQmFyLnNldE9uU2Vla0JhckNoYW5nZUxpc3RlbmVyKHRoaXMpOworICAgICAgICBtU2F0dXJhdGlvblNlZWtCYXIuc2V0UHJvZ3Jlc3MoNTApOworCisgICAgICAgIG1CZW5jaG1hcmtSZXN1bHQgPSAoVGV4dFZpZXcpIGZpbmRWaWV3QnlJZChSLmlkLmJlbmNobWFya1RleHQpOworICAgICAgICBtQmVuY2htYXJrUmVzdWx0LnNldFRleHQoIkJlbmNobWFyayBubyB5ZXQgcnVuIik7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgc3VyZmFjZUNyZWF0ZWQoU3VyZmFjZUhvbGRlciBob2xkZXIpIHsKLSAgICAgICAgbVBhcmFtcyA9IGNyZWF0ZVBhcmFtcygpOwotICAgICAgICBtSW52b2thYmxlID0gY3JlYXRlU2NyaXB0KCk7Ci0KLSAgICAgICAgbUludm9rYWJsZS5leGVjdXRlKCk7CisgICAgICAgIGNyZWF0ZVNjcmlwdCgpOworICAgICAgICBtU2NyaXB0Lmludm9rZV9maWx0ZXIoKTsKKyAgICAgICAgbVJTLmZpbmlzaCgpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHN1cmZhY2VDaGFuZ2VkKFN1cmZhY2VIb2xkZXIgaG9sZGVyLCBpbnQgZm9ybWF0LCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKQEAgLTE2Niw1NCArMzY1LDI5IEBACiAgICAgcHVibGljIHZvaWQgc3VyZmFjZURlc3Ryb3llZChTdXJmYWNlSG9sZGVyIGhvbGRlcikgewogICAgIH0KIAotICAgIHByaXZhdGUgU2NyaXB0Lkludm9rYWJsZSBjcmVhdGVTY3JpcHQoKSB7CisgICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZVNjcmlwdCgpIHsKICAgICAgICAgbVJTID0gUmVuZGVyU2NyaXB0LmNyZWF0ZSgpOwogICAgICAgICBtUlMubU1lc3NhZ2VDYWxsYmFjayA9IG5ldyBGaWx0ZXJDYWxsYmFjaygpOwogCi0gICAgICAgIG1QYXJhbXNUeXBlID0gVHlwZS5jcmVhdGVGcm9tQ2xhc3MobVJTLCBQYXJhbXMuY2xhc3MsIDEsICJQYXJhbWV0ZXJzIik7Ci0gICAgICAgIG1QYXJhbXNBbGxvY2F0aW9uID0gQWxsb2NhdGlvbi5jcmVhdGVUeXBlZChtUlMsIG1QYXJhbXNUeXBlKTsKLSAgICAgICAgbVBhcmFtc0FsbG9jYXRpb24uZGF0YShtUGFyYW1zKTsKKyAgICAgICAgbUluUGl4ZWxzQWxsb2NhdGlvbiA9IEFsbG9jYXRpb24uY3JlYXRlQml0bWFwUmVmKG1SUywgbUJpdG1hcEluKTsKKyAgICAgICAgbU91dFBpeGVsc0FsbG9jYXRpb24gPSBBbGxvY2F0aW9uLmNyZWF0ZUJpdG1hcFJlZihtUlMsIG1CaXRtYXBPdXQpOworICAgICAgICBtU2NyYXRjaFBpeGVsc0FsbG9jYXRpb24gPSBBbGxvY2F0aW9uLmNyZWF0ZUJpdG1hcFJlZihtUlMsIG1CaXRtYXBTY3JhdGNoKTsKIAotICAgICAgICBmaW5hbCBpbnQgcGl4ZWxDb3VudCA9IG1QYXJhbXMuaW5XaWR0aCAqIG1QYXJhbXMuaW5IZWlnaHQ7CisgICAgICAgIG1TY3JpcHQgPSBuZXcgU2NyaXB0Q19UaHJlc2hvbGQobVJTLCBnZXRSZXNvdXJjZXMoKSwgUi5yYXcudGhyZXNob2xkX2JjLCBmYWxzZSk7CisgICAgICAgIG1TY3JpcHQuc2V0X3dpZHRoKG1CaXRtYXBJbi5nZXRXaWR0aCgpKTsKKyAgICAgICAgbVNjcmlwdC5zZXRfaGVpZ2h0KG1CaXRtYXBJbi5nZXRIZWlnaHQoKSk7CisgICAgICAgIG1TY3JpcHQuc2V0X3JhZGl1cyhtUmFkaXVzKTsKIAotICAgICAgICBtUGl4ZWxUeXBlID0gVHlwZS5jcmVhdGVGcm9tQ2xhc3MobVJTLCBQaXhlbC5jbGFzcywgMSwgIlBpeGVsIik7Ci0gICAgICAgIG1JblBpeGVsc0FsbG9jYXRpb24gPSBBbGxvY2F0aW9uLmNyZWF0ZVNpemVkKG1SUywKLSAgICAgICAgICAgICAgICBFbGVtZW50LmNyZWF0ZVVzZXIobVJTLCBFbGVtZW50LkRhdGFUeXBlLlNJR05FRF8zMiksCi0gICAgICAgICAgICAgICAgcGl4ZWxDb3VudCk7Ci0gICAgICAgIG1PdXRQaXhlbHNBbGxvY2F0aW9uID0gQWxsb2NhdGlvbi5jcmVhdGVTaXplZChtUlMsCi0gICAgICAgICAgICAgICAgRWxlbWVudC5jcmVhdGVVc2VyKG1SUywgRWxlbWVudC5EYXRhVHlwZS5TSUdORURfMzIpLAotICAgICAgICAgICAgICAgIHBpeGVsQ291bnQpOworICAgICAgICBtU2NyaXB0LnNldF9pbkJsYWNrKG1JbkJsYWNrKTsKKyAgICAgICAgbVNjcmlwdC5zZXRfb3V0QmxhY2sobU91dEJsYWNrKTsKKyAgICAgICAgbVNjcmlwdC5zZXRfaW5XaGl0ZShtSW5XaGl0ZSk7CisgICAgICAgIG1TY3JpcHQuc2V0X291dFdoaXRlKG1PdXRXaGl0ZSk7CisgICAgICAgIG1TY3JpcHQuc2V0X2dhbW1hKG1HYW1tYSk7CisgICAgICAgIG1TY3JpcHQuc2V0X3NhdHVyYXRpb24obVNhdHVyYXRpb24pOwogCi0gICAgICAgIG1JbkRhdGEgPSBuZXcgaW50W3BpeGVsQ291bnRdOwotICAgICAgICBtQml0bWFwLmdldFBpeGVscyhtSW5EYXRhLCAwLCBtUGFyYW1zLmluV2lkdGgsIDAsIDAsIG1QYXJhbXMuaW5XaWR0aCwgbVBhcmFtcy5pbkhlaWdodCk7Ci0gICAgICAgIG1JblBpeGVsc0FsbG9jYXRpb24uZGF0YShtSW5EYXRhKTsKLQotICAgICAgICBtT3V0RGF0YSA9IG5ldyBpbnRbcGl4ZWxDb3VudF07Ci0gICAgICAgIG1PdXRQaXhlbHNBbGxvY2F0aW9uLmRhdGEobU91dERhdGEpOwotCi0gICAgICAgIFNjcmlwdEMuQnVpbGRlciBzYiA9IG5ldyBTY3JpcHRDLkJ1aWxkZXIobVJTKTsKLSAgICAgICAgc2Iuc2V0VHlwZShtUGFyYW1zVHlwZSwgIlBhcmFtcyIsIDApOwotICAgICAgICBzYi5zZXRUeXBlKG1QaXhlbFR5cGUsICJJblBpeGVsIiwgMSk7Ci0gICAgICAgIHNiLnNldFR5cGUobVBpeGVsVHlwZSwgIk91dFBpeGVsIiwgMik7Ci0gICAgICAgIHNiLnNldFR5cGUodHJ1ZSwgMik7Ci0gICAgICAgIFNjcmlwdC5JbnZva2FibGUgaW52b2thYmxlID0gc2IuYWRkSW52b2thYmxlKCJtYWluIik7Ci0gICAgICAgIHNiLnNldFNjcmlwdChnZXRSZXNvdXJjZXMoKSwgUi5yYXcudGhyZXNob2xkKTsKLSAgICAgICAgLy9zYi5zZXRSb290KHRydWUpOwotCi0gICAgICAgIFNjcmlwdEMgc2NyaXB0ID0gc2IuY3JlYXRlKCk7Ci0gICAgICAgIHNjcmlwdC5iaW5kQWxsb2NhdGlvbihtUGFyYW1zQWxsb2NhdGlvbiwgMCk7Ci0gICAgICAgIHNjcmlwdC5iaW5kQWxsb2NhdGlvbihtSW5QaXhlbHNBbGxvY2F0aW9uLCAxKTsKLSAgICAgICAgc2NyaXB0LmJpbmRBbGxvY2F0aW9uKG1PdXRQaXhlbHNBbGxvY2F0aW9uLCAyKTsKLQotICAgICAgICByZXR1cm4gaW52b2thYmxlOwotICAgIH0KLQotICAgIHByaXZhdGUgUGFyYW1zIGNyZWF0ZVBhcmFtcygpIHsKLSAgICAgICAgZmluYWwgUGFyYW1zIHBhcmFtcyA9IG5ldyBQYXJhbXMoKTsKLSAgICAgICAgcGFyYW1zLmluV2lkdGggPSBwYXJhbXMub3V0V2lkdGggPSBtQml0bWFwLmdldFdpZHRoKCk7Ci0gICAgICAgIHBhcmFtcy5pbkhlaWdodCA9IHBhcmFtcy5vdXRIZWlnaHQgPSBtQml0bWFwLmdldEhlaWdodCgpOwotICAgICAgICBwYXJhbXMudGhyZXNob2xkID0gMC41ZjsKLSAgICAgICAgcmV0dXJuIHBhcmFtczsKKyAgICAgICAgbVNjcmlwdC5iaW5kX0luUGl4ZWwobUluUGl4ZWxzQWxsb2NhdGlvbik7CisgICAgICAgIG1TY3JpcHQuYmluZF9PdXRQaXhlbChtT3V0UGl4ZWxzQWxsb2NhdGlvbik7CisgICAgICAgIG1TY3JpcHQuYmluZF9TY3JhdGNoUGl4ZWwobVNjcmF0Y2hQaXhlbHNBbGxvY2F0aW9uKTsKICAgICB9CiAKICAgICBwcml2YXRlIEJpdG1hcCBsb2FkQml0bWFwKGludCByZXNvdXJjZSkgewpAQCAtMjI5LDQgKzQwMywzMCBAQAogICAgICAgICBzb3VyY2UucmVjeWNsZSgpOwogICAgICAgICByZXR1cm4gYjsKICAgICB9CisKKyAgICAvLyBidXR0b24gaG9vaworICAgIHB1YmxpYyB2b2lkIGJlbmNobWFyayhWaWV3IHYpIHsKKyAgICAgICAgYW5kcm9pZC51dGlsLkxvZy52KCJJbWciLCAiQmVuY2htYXJraW5nIik7CisgICAgICAgIGludCBvbGRSYWRpdXMgPSBtUmFkaXVzOworICAgICAgICBtUmFkaXVzID0gTUFYX1JBRElVUzsKKyAgICAgICAgbVNjcmlwdC5zZXRfcmFkaXVzKG1SYWRpdXMpOworCisgICAgICAgIGxvbmcgdCA9IGphdmEubGFuZy5TeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKworICAgICAgICBtU2NyaXB0Lmludm9rZV9maWx0ZXJCZW5jaG1hcmsoKTsKKyAgICAgICAgbVJTLmZpbmlzaCgpOworCisgICAgICAgIHQgPSBqYXZhLmxhbmcuU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSB0OworICAgICAgICBhbmRyb2lkLnV0aWwuTG9nLnYoIkltZyIsICJSZW5kZXJzY3JpcHQgZnJhbWUgdGltZSBjb3JlIG1zICIgKyB0KTsKKworICAgICAgICBsb25nIGphdmFUaW1lID0gamF2YUZpbHRlcigpOworCisgICAgICAgIG1CZW5jaG1hcmtSZXN1bHQuc2V0VGV4dCgiUlM6ICIgKyB0ICsgIiBtcyAgSmF2YTogIiArIGphdmFUaW1lICsgIiBtcyIpOworCisgICAgICAgIG1SYWRpdXMgPSBvbGRSYWRpdXM7CisgICAgICAgIG1TY3JpcHQuc2V0X3JhZGl1cyhtUmFkaXVzKTsKKworICAgICAgICBtU2NyaXB0Lmludm9rZV9maWx0ZXIoKTsKKyAgICAgICAgbVJTLmZpbmlzaCgpOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9JbWFnZVByb2Nlc3Npbmcvc3JjL2NvbS9hbmRyb2lkL3JzL2ltYWdlL1NjcmlwdENfVGhyZXNob2xkLmphdmEgYi9saWJzL3JzL2phdmEvSW1hZ2VQcm9jZXNzaW5nL3NyYy9jb20vYW5kcm9pZC9ycy9pbWFnZS9TY3JpcHRDX1RocmVzaG9sZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhMzYzZDMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL2phdmEvSW1hZ2VQcm9jZXNzaW5nL3NyYy9jb20vYW5kcm9pZC9ycy9pbWFnZS9TY3JpcHRDX1RocmVzaG9sZC5qYXZhCkBAIC0wLDAgKzEsMTc1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5ycy5pbWFnZTsKKworaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0Lio7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworcHVibGljIGNsYXNzIFNjcmlwdENfVGhyZXNob2xkIGV4dGVuZHMgU2NyaXB0QyB7CisgICAgLy8gQ29uc3RydWN0b3IKKyAgICBwdWJsaWMgIFNjcmlwdENfVGhyZXNob2xkKFJlbmRlclNjcmlwdCBycywgUmVzb3VyY2VzIHJlc291cmNlcywgaW50IGlkLCBib29sZWFuIGlzUm9vdCkgeworICAgICAgICBzdXBlcihycywgcmVzb3VyY2VzLCBpZCwgaXNSb290KTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgbUV4cG9ydFZhcklkeF9oZWlnaHQgPSAwOworICAgIHByaXZhdGUgaW50IG1FeHBvcnRWYXJfaGVpZ2h0OworICAgIHB1YmxpYyB2b2lkIHNldF9oZWlnaHQoaW50IHYpIHsKKyAgICAgICAgbUV4cG9ydFZhcl9oZWlnaHQgPSB2OworICAgICAgICBzZXRWYXIobUV4cG9ydFZhcklkeF9oZWlnaHQsIHYpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0X2hlaWdodCgpIHsKKyAgICAgICAgcmV0dXJuIG1FeHBvcnRWYXJfaGVpZ2h0OworICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBtRXhwb3J0VmFySWR4X3dpZHRoID0gMTsKKyAgICBwcml2YXRlIGludCBtRXhwb3J0VmFyX3dpZHRoOworICAgIHB1YmxpYyB2b2lkIHNldF93aWR0aChpbnQgdikgeworICAgICAgICBtRXhwb3J0VmFyX3dpZHRoID0gdjsKKyAgICAgICAgc2V0VmFyKG1FeHBvcnRWYXJJZHhfd2lkdGgsIHYpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0X3dpZHRoKCkgeworICAgICAgICByZXR1cm4gbUV4cG9ydFZhcl93aWR0aDsKKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgbUV4cG9ydFZhcklkeF9yYWRpdXMgPSAyOworICAgIHByaXZhdGUgaW50IG1FeHBvcnRWYXJfcmFkaXVzOworICAgIHB1YmxpYyB2b2lkIHNldF9yYWRpdXMoaW50IHYpIHsKKyAgICAgICAgbUV4cG9ydFZhcl9yYWRpdXMgPSB2OworICAgICAgICBzZXRWYXIobUV4cG9ydFZhcklkeF9yYWRpdXMsIHYpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0X3JhZGl1cygpIHsKKyAgICAgICAgcmV0dXJuIG1FeHBvcnRWYXJfcmFkaXVzOworICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBtRXhwb3J0VmFySWR4X0luUGl4ZWwgPSAzOworICAgIHByaXZhdGUgQWxsb2NhdGlvbiBtRXhwb3J0VmFyX0luUGl4ZWw7CisgICAgcHVibGljIHZvaWQgYmluZF9JblBpeGVsKEFsbG9jYXRpb24gdikgeworICAgICAgICBtRXhwb3J0VmFyX0luUGl4ZWwgPSB2OworICAgICAgICBpZih2ID09IG51bGwpIGJpbmRBbGxvY2F0aW9uKG51bGwsIG1FeHBvcnRWYXJJZHhfSW5QaXhlbCk7CisgICAgICAgIGVsc2UgYmluZEFsbG9jYXRpb24odiwgbUV4cG9ydFZhcklkeF9JblBpeGVsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQWxsb2NhdGlvbiBnZXRfSW5QaXhlbCgpIHsKKyAgICAgICAgcmV0dXJuIG1FeHBvcnRWYXJfSW5QaXhlbDsKKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgbUV4cG9ydFZhcklkeF9PdXRQaXhlbCA9IDQ7CisgICAgcHJpdmF0ZSBBbGxvY2F0aW9uIG1FeHBvcnRWYXJfT3V0UGl4ZWw7CisgICAgcHVibGljIHZvaWQgYmluZF9PdXRQaXhlbChBbGxvY2F0aW9uIHYpIHsKKyAgICAgICAgbUV4cG9ydFZhcl9PdXRQaXhlbCA9IHY7CisgICAgICAgIGlmKHYgPT0gbnVsbCkgYmluZEFsbG9jYXRpb24obnVsbCwgbUV4cG9ydFZhcklkeF9PdXRQaXhlbCk7CisgICAgICAgIGVsc2UgYmluZEFsbG9jYXRpb24odiwgbUV4cG9ydFZhcklkeF9PdXRQaXhlbCk7CisgICAgfQorCisgICAgcHVibGljIEFsbG9jYXRpb24gZ2V0X091dFBpeGVsKCkgeworICAgICAgICByZXR1cm4gbUV4cG9ydFZhcl9PdXRQaXhlbDsKKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgbUV4cG9ydFZhcklkeF9TY3JhdGNoUGl4ZWwgPSA1OworICAgIHByaXZhdGUgQWxsb2NhdGlvbiBtRXhwb3J0VmFyX1NjcmF0Y2hQaXhlbDsKKyAgICBwdWJsaWMgdm9pZCBiaW5kX1NjcmF0Y2hQaXhlbChBbGxvY2F0aW9uIHYpIHsKKyAgICAgICAgbUV4cG9ydFZhcl9TY3JhdGNoUGl4ZWwgPSB2OworICAgICAgICBpZih2ID09IG51bGwpIGJpbmRBbGxvY2F0aW9uKG51bGwsIG1FeHBvcnRWYXJJZHhfU2NyYXRjaFBpeGVsKTsKKyAgICAgICAgZWxzZSBiaW5kQWxsb2NhdGlvbih2LCBtRXhwb3J0VmFySWR4X1NjcmF0Y2hQaXhlbCk7CisgICAgfQorCisgICAgcHVibGljIEFsbG9jYXRpb24gZ2V0X1NjcmF0Y2hQaXhlbCgpIHsKKyAgICAgICAgcmV0dXJuIG1FeHBvcnRWYXJfU2NyYXRjaFBpeGVsOworICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBtRXhwb3J0VmFySWR4X2luQmxhY2sgPSA2OworICAgIHByaXZhdGUgZmxvYXQgbUV4cG9ydFZhcl9pbkJsYWNrOworICAgIHB1YmxpYyB2b2lkIHNldF9pbkJsYWNrKGZsb2F0IHYpIHsKKyAgICAgICAgbUV4cG9ydFZhcl9pbkJsYWNrID0gdjsKKyAgICAgICAgc2V0VmFyKG1FeHBvcnRWYXJJZHhfaW5CbGFjaywgdik7CisgICAgfQorCisgICAgcHVibGljIGZsb2F0IGdldF9pbkJsYWNrKCkgeworICAgICAgICByZXR1cm4gbUV4cG9ydFZhcl9pbkJsYWNrOworICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBtRXhwb3J0VmFySWR4X291dEJsYWNrID0gNzsKKyAgICBwcml2YXRlIGZsb2F0IG1FeHBvcnRWYXJfb3V0QmxhY2s7CisgICAgcHVibGljIHZvaWQgc2V0X291dEJsYWNrKGZsb2F0IHYpIHsKKyAgICAgICAgbUV4cG9ydFZhcl9vdXRCbGFjayA9IHY7CisgICAgICAgIHNldFZhcihtRXhwb3J0VmFySWR4X291dEJsYWNrLCB2KTsKKyAgICB9CisKKyAgICBwdWJsaWMgZmxvYXQgZ2V0X291dEJsYWNrKCkgeworICAgICAgICByZXR1cm4gbUV4cG9ydFZhcl9vdXRCbGFjazsKKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgbUV4cG9ydFZhcklkeF9pbldoaXRlID0gODsKKyAgICBwcml2YXRlIGZsb2F0IG1FeHBvcnRWYXJfaW5XaGl0ZTsKKyAgICBwdWJsaWMgdm9pZCBzZXRfaW5XaGl0ZShmbG9hdCB2KSB7CisgICAgICAgIG1FeHBvcnRWYXJfaW5XaGl0ZSA9IHY7CisgICAgICAgIHNldFZhcihtRXhwb3J0VmFySWR4X2luV2hpdGUsIHYpOworICAgIH0KKworICAgIHB1YmxpYyBmbG9hdCBnZXRfaW5XaGl0ZSgpIHsKKyAgICAgICAgcmV0dXJuIG1FeHBvcnRWYXJfaW5XaGl0ZTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgbUV4cG9ydFZhcklkeF9vdXRXaGl0ZSA9IDk7CisgICAgcHJpdmF0ZSBmbG9hdCBtRXhwb3J0VmFyX291dFdoaXRlOworICAgIHB1YmxpYyB2b2lkIHNldF9vdXRXaGl0ZShmbG9hdCB2KSB7CisgICAgICAgIG1FeHBvcnRWYXJfb3V0V2hpdGUgPSB2OworICAgICAgICBzZXRWYXIobUV4cG9ydFZhcklkeF9vdXRXaGl0ZSwgdik7CisgICAgfQorCisgICAgcHVibGljIGZsb2F0IGdldF9vdXRXaGl0ZSgpIHsKKyAgICAgICAgcmV0dXJuIG1FeHBvcnRWYXJfb3V0V2hpdGU7CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IG1FeHBvcnRWYXJJZHhfZ2FtbWEgPSAxMDsKKyAgICBwcml2YXRlIGZsb2F0IG1FeHBvcnRWYXJfZ2FtbWE7CisgICAgcHVibGljIHZvaWQgc2V0X2dhbW1hKGZsb2F0IHYpIHsKKyAgICAgICAgbUV4cG9ydFZhcl9nYW1tYSA9IHY7CisgICAgICAgIHNldFZhcihtRXhwb3J0VmFySWR4X2dhbW1hLCB2KTsKKyAgICB9CisKKyAgICBwdWJsaWMgZmxvYXQgZ2V0X2dhbW1hKCkgeworICAgICAgICByZXR1cm4gbUV4cG9ydFZhcl9nYW1tYTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgbUV4cG9ydFZhcklkeF9zYXR1cmF0aW9uID0gMTE7CisgICAgcHJpdmF0ZSBmbG9hdCBtRXhwb3J0VmFyX3NhdHVyYXRpb247CisgICAgcHVibGljIHZvaWQgc2V0X3NhdHVyYXRpb24oZmxvYXQgdikgeworICAgICAgICBtRXhwb3J0VmFyX3NhdHVyYXRpb24gPSB2OworICAgICAgICBzZXRWYXIobUV4cG9ydFZhcklkeF9zYXR1cmF0aW9uLCB2KTsKKyAgICB9CisKKyAgICBwdWJsaWMgZmxvYXQgZ2V0X3NhdHVyYXRpb24oKSB7CisgICAgICAgIHJldHVybiBtRXhwb3J0VmFyX3NhdHVyYXRpb247CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IG1FeHBvcnRGdW5jSWR4X2ZpbHRlciA9IDA7CisgICAgcHVibGljIHZvaWQgaW52b2tlX2ZpbHRlcigpIHsKKyAgICAgICAgaW52b2tlKG1FeHBvcnRGdW5jSWR4X2ZpbHRlcik7CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IG1FeHBvcnRGdW5jSWR4X2ZpbHRlckJlbmNobWFyayA9IDE7CisgICAgcHVibGljIHZvaWQgaW52b2tlX2ZpbHRlckJlbmNobWFyaygpIHsKKyAgICAgICAgaW52b2tlKG1FeHBvcnRGdW5jSWR4X2ZpbHRlckJlbmNobWFyayk7CisgICAgfQorCit9CisKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9GaWxtL0FuZHJvaWQubWsgYi9saWJzL3JzL2phdmEvTW9kZWxWaWV3ZXIvQW5kcm9pZC5tawpzaW1pbGFyaXR5IGluZGV4IDk1JQpyZW5hbWUgZnJvbSBsaWJzL3JzL2phdmEvRmlsbS9BbmRyb2lkLm1rCnJlbmFtZSB0byBsaWJzL3JzL2phdmEvTW9kZWxWaWV3ZXIvQW5kcm9pZC5tawppbmRleCA5ZTZlZDdlLi44YmVjNmQ2IDEwMDY0NAotLS0gYS9saWJzL3JzL2phdmEvRmlsbS9BbmRyb2lkLm1rCisrKyBiL2xpYnMvcnMvamF2YS9Nb2RlbFZpZXdlci9BbmRyb2lkLm1rCkBAIC0yMiw2ICsyMiw2IEBACiBMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpCiAjTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWQucmVuZGVyc2NyaXB0CiAKLUxPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBGaWxtCitMT0NBTF9QQUNLQUdFX05BTUUgOj0gTW9kZWxWaWV3ZXIKIAogaW5jbHVkZSAkKEJVSUxEX1BBQ0tBR0UpCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvRmlsbS9BbmRyb2lkTWFuaWZlc3QueG1sIGIvbGlicy9ycy9qYXZhL01vZGVsVmlld2VyL0FuZHJvaWRNYW5pZmVzdC54bWwKc2ltaWxhcml0eSBpbmRleCA3OCUKcmVuYW1lIGZyb20gbGlicy9ycy9qYXZhL0ZpbG0vQW5kcm9pZE1hbmlmZXN0LnhtbApyZW5hbWUgdG8gbGlicy9ycy9qYXZhL01vZGVsVmlld2VyL0FuZHJvaWRNYW5pZmVzdC54bWwKaW5kZXggYTVjZThhMS4uZWJiZTc0MyAxMDA2NDQKLS0tIGEvbGlicy9ycy9qYXZhL0ZpbG0vQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgYi9saWJzL3JzL2phdmEvTW9kZWxWaWV3ZXIvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMSw4ICsxLDggQEAKIDw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+CiA8bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHBhY2thZ2U9ImNvbS5hbmRyb2lkLmZpbG0iPgotICAgIDxhcHBsaWNhdGlvbiBhbmRyb2lkOmxhYmVsPSJGaWxtIj4KLSAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iRmlsbSIKKyAgICBwYWNrYWdlPSJjb20uYW5kcm9pZC5tb2RlbHZpZXdlciI+CisgICAgPGFwcGxpY2F0aW9uIGFuZHJvaWQ6bGFiZWw9Ik1vZGVsVmlld2VyIj4KKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iTW9kZWxWaWV3ZXIiCiAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnNjcmVlbk9yaWVudGF0aW9uPSJwb3J0cmFpdCIKICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGhlbWU9IkBhbmRyb2lkOnN0eWxlL1RoZW1lLkJsYWNrLk5vVGl0bGVCYXIiPgogICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvTW9kZWxWaWV3ZXIvcmVzL2RyYXdhYmxlL3JvYm90LnBuZyBiL2xpYnMvcnMvamF2YS9Nb2RlbFZpZXdlci9yZXMvZHJhd2FibGUvcm9ib3QucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjODVlNTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL2phdmEvTW9kZWxWaWV3ZXIvcmVzL2RyYXdhYmxlL3JvYm90LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvTW9kZWxWaWV3ZXIvcmVzL3Jhdy9tb2RlbHZpZXdlci5ycyBiL2xpYnMvcnMvamF2YS9Nb2RlbFZpZXdlci9yZXMvcmF3L21vZGVsdmlld2VyLnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxMTk0ZTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL2phdmEvTW9kZWxWaWV3ZXIvcmVzL3Jhdy9tb2RlbHZpZXdlci5ycwpAQCAtMCwwICsxLDc0IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI3ByYWdtYSB2ZXJzaW9uKDEpCisKKyNwcmFnbWEgcnMgamF2YV9wYWNrYWdlX25hbWUoY29tLmFuZHJvaWQubW9kZWx2aWV3ZXIpCisKKyNpbmNsdWRlICIuLi8uLi8uLi8uLi9zY3JpcHRjL3JzX3R5cGVzLnJzaCIKKyNpbmNsdWRlICIuLi8uLi8uLi8uLi9zY3JpcHRjL3JzX21hdGgucnNoIgorI2luY2x1ZGUgIi4uLy4uLy4uLy4uL3NjcmlwdGMvcnNfZ3JhcGhpY3MucnNoIgorCityc19wcm9ncmFtX3ZlcnRleCBnUFZCYWNrZ3JvdW5kOworcnNfcHJvZ3JhbV9mcmFnbWVudCBnUEZCYWNrZ3JvdW5kOworCityc19hbGxvY2F0aW9uIGdUR3JpZDsKK3JzX21lc2ggZ1Rlc3RNZXNoOworCityc19wcm9ncmFtX3N0b3JlIGdQRlNCYWNrZ3JvdW5kOworCitmbG9hdCBnUm90YXRlOworCityc19mb250IGdJdGFsaWM7Cityc19hbGxvY2F0aW9uIGdUZXh0QWxsb2M7CisKKyNwcmFnbWEgcnMgZXhwb3J0X3ZhcihnUFZCYWNrZ3JvdW5kLCBnUEZCYWNrZ3JvdW5kLCBnVEdyaWQsIGdUZXN0TWVzaCwgZ1BGU0JhY2tncm91bmQsIGdSb3RhdGUsIGdJdGFsaWMsIGdUZXh0QWxsb2MpCisKK2Zsb2F0IGdEVDsKK2ludDY0X3QgZ0xhc3RUaW1lOworCit2b2lkIGluaXQoKSB7CisgICAgZ1JvdGF0ZSA9IDAuMGY7Cit9CisKK2ludCByb290KGludCBsYXVuY2hJRCkgeworCisgICAgcnNnQ2xlYXJDb2xvcigxLjBmLCAxLjBmLCAxLjBmLCAxLjBmKTsKKyAgICByc2dDbGVhckRlcHRoKDEuMGYpOworCisgICAgcnNnQmluZFByb2dyYW1WZXJ0ZXgoZ1BWQmFja2dyb3VuZCk7CisKKyAgICByc2dCaW5kUHJvZ3JhbUZyYWdtZW50KGdQRkJhY2tncm91bmQpOworICAgIHJzZ0JpbmRQcm9ncmFtU3RvcmUoZ1BGU0JhY2tncm91bmQpOworICAgIHJzZ0JpbmRUZXh0dXJlKGdQRkJhY2tncm91bmQsIDAsIGdUR3JpZCk7CisKKyAgICByc19tYXRyaXg0eDQgbWF0cml4OworICAgIHJzTWF0cml4TG9hZElkZW50aXR5KCZtYXRyaXgpOworICAgIC8vIFBvc2l0aW9uIG91ciBtb2RlbCBvbiB0aGUgc2NyZWVuCisgICAgcnNNYXRyaXhUcmFuc2xhdGUoJm1hdHJpeCwgMC4wZiwgLTAuM2YsIDEuMmYpOworICAgIHJzTWF0cml4U2NhbGUoJm1hdHJpeCwgMC4yZiwgMC4yZiwgMC4yZik7CisgICAgcnNNYXRyaXhSb3RhdGUoJm1hdHJpeCwgLTI1LjBmLCAxLjBmLCAwLjBmLCAwLjBmKTsKKyAgICByc01hdHJpeFJvdGF0ZSgmbWF0cml4LCBnUm90YXRlLCAwLjBmLCAxLjBmLCAwLjBmKTsKKyAgICByc2dQcm9ncmFtVmVydGV4TG9hZE1vZGVsTWF0cml4KCZtYXRyaXgpOworCisgICAgcnNnRHJhd1NpbXBsZU1lc2goZ1Rlc3RNZXNoKTsKKworICAgIGNvbG9yKDAuM2YsIDAuM2YsIDAuM2YsIDEuMGYpOworICAgIHJzZ0RyYXdUZXh0KCJSZW5kZXJzY3JpcHQgbW9kZWwgdGVzdCIsIDMwLCA2OTUpOworCisgICAgcnNnQmluZEZvbnQoZ0l0YWxpYyk7CisgICAgcnNnRHJhd1RleHQoZ1RleHRBbGxvYywgMzAsIDczMCk7CisKKyAgICByZXR1cm4gMTA7Cit9CmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvTW9kZWxWaWV3ZXIvcmVzL3Jhdy9tb2RlbHZpZXdlcl9iYy5iYyBiL2xpYnMvcnMvamF2YS9Nb2RlbFZpZXdlci9yZXMvcmF3L21vZGVsdmlld2VyX2JjLmJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2NGU3MjUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL2phdmEvTW9kZWxWaWV3ZXIvcmVzL3Jhdy9tb2RlbHZpZXdlcl9iYy5iYwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvTW9kZWxWaWV3ZXIvcmVzL3Jhdy9yb2JvdC5hM2QgYi9saWJzL3JzL2phdmEvTW9kZWxWaWV3ZXIvcmVzL3Jhdy9yb2JvdC5hM2QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzBjNjZhZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvamF2YS9Nb2RlbFZpZXdlci9yZXMvcmF3L3JvYm90LmEzZApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvRmlsbS9zcmMvY29tL2FuZHJvaWQvZmlsbS9GaWxtLmphdmEgYi9saWJzL3JzL2phdmEvTW9kZWxWaWV3ZXIvc3JjL2NvbS9hbmRyb2lkL21vZGVsdmlld2VyL01vZGVsVmlld2VyLmphdmEKc2ltaWxhcml0eSBpbmRleCA3NSUKcmVuYW1lIGZyb20gbGlicy9ycy9qYXZhL0ZpbG0vc3JjL2NvbS9hbmRyb2lkL2ZpbG0vRmlsbS5qYXZhCnJlbmFtZSB0byBsaWJzL3JzL2phdmEvTW9kZWxWaWV3ZXIvc3JjL2NvbS9hbmRyb2lkL21vZGVsdmlld2VyL01vZGVsVmlld2VyLmphdmEKaW5kZXggNmU5OTgxNi4uNzQ5MTc0NCAxMDA2NDQKLS0tIGEvbGlicy9ycy9qYXZhL0ZpbG0vc3JjL2NvbS9hbmRyb2lkL2ZpbG0vRmlsbS5qYXZhCisrKyBiL2xpYnMvcnMvamF2YS9Nb2RlbFZpZXdlci9zcmMvY29tL2FuZHJvaWQvbW9kZWx2aWV3ZXIvTW9kZWxWaWV3ZXIuamF2YQpAQCAtMTQsNyArMTQsNyBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotcGFja2FnZSBjb20uYW5kcm9pZC5maWxtOworcGFja2FnZSBjb20uYW5kcm9pZC5tb2RlbHZpZXdlcjsKIAogaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0LlJTU3VyZmFjZVZpZXc7CiBpbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUmVuZGVyU2NyaXB0OwpAQCAtMzcsMTggKzM3LDkgQEAKIAogaW1wb3J0IGphdmEubGFuZy5SdW50aW1lOwogCi1wdWJsaWMgY2xhc3MgRmlsbSBleHRlbmRzIEFjdGl2aXR5IHsKLSAgICAvL0V2ZW50TGlzdGVuZXIgbUxpc3RlbmVyID0gbmV3IEV2ZW50TGlzdGVuZXIoKTsKK3B1YmxpYyBjbGFzcyBNb2RlbFZpZXdlciBleHRlbmRzIEFjdGl2aXR5IHsKIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfVEFHID0gImxpYlJTX2puaSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyAgPSBmYWxzZTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIExPR19FTkFCTEVEID0gREVCVUcgPyBDb25maWcuTE9HRCA6IENvbmZpZy5MT0dWOwotCi0gICAgcHJpdmF0ZSBGaWxtVmlldyBtVmlldzsKLQotICAgIC8vIGdldCB0aGUgY3VycmVudCBsb29wZXIgKGZyb20geW91ciBBY3Rpdml0eSBVSSB0aHJlYWQgZm9yIGluc3RhbmNlCi0KLQorICAgIHByaXZhdGUgTW9kZWxWaWV3ZXJWaWV3IG1WaWV3OwogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgb25DcmVhdGUoQnVuZGxlIGljaWNsZSkgewpAQCAtNTYsNyArNDcsNyBAQAogCiAgICAgICAgIC8vIENyZWF0ZSBvdXIgUHJldmlldyB2aWV3IGFuZCBzZXQgaXQgYXMgdGhlIGNvbnRlbnQgb2Ygb3VyCiAgICAgICAgIC8vIEFjdGl2aXR5Ci0gICAgICAgIG1WaWV3ID0gbmV3IEZpbG1WaWV3KHRoaXMpOworICAgICAgICBtVmlldyA9IG5ldyBNb2RlbFZpZXdlclZpZXcodGhpcyk7CiAgICAgICAgIHNldENvbnRlbnRWaWV3KG1WaWV3KTsKICAgICB9CiAKQEAgLTc0LDE3ICs2NSw3IEBACiAgICAgICAgIC8vIHRvIHRha2UgYXBwcm9wcmlhdGUgYWN0aW9uIHdoZW4gdGhlIGFjdGl2aXR5IGxvb3NlcyBmb2N1cwogICAgICAgICBzdXBlci5vblBhdXNlKCk7CiAgICAgICAgIG1WaWV3Lm9uUGF1c2UoKTsKLQotICAgICAgICBSdW50aW1lLmdldFJ1bnRpbWUoKS5leGl0KDApOwogICAgIH0KIAotCi0gICAgc3RhdGljIHZvaWQgbG9nKFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgIGlmIChMT0dfRU5BQkxFRCkgewotICAgICAgICAgICAgTG9nLnYoTE9HX1RBRywgbWVzc2FnZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQogfQogCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvTW9kZWxWaWV3ZXIvc3JjL2NvbS9hbmRyb2lkL21vZGVsdmlld2VyL01vZGVsVmlld2VyUlMuamF2YSBiL2xpYnMvcnMvamF2YS9Nb2RlbFZpZXdlci9zcmMvY29tL2FuZHJvaWQvbW9kZWx2aWV3ZXIvTW9kZWxWaWV3ZXJSUy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2NDg1ZGMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL2phdmEvTW9kZWxWaWV3ZXIvc3JjL2NvbS9hbmRyb2lkL21vZGVsdmlld2VyL01vZGVsVmlld2VyUlMuamF2YQpAQCAtMCwwICsxLDE3MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQubW9kZWx2aWV3ZXI7CisKK2ltcG9ydCBqYXZhLmlvLldyaXRlcjsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0Lio7CitpbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUHJvZ3JhbVN0b3JlLkRlcHRoRnVuYzsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCisKK3B1YmxpYyBjbGFzcyBNb2RlbFZpZXdlclJTIHsKKworICAgIHByaXZhdGUgZmluYWwgaW50IFNUQVRFX0xBU1RfRk9DVVMgPSAxOworCisgICAgaW50IG1XaWR0aDsKKyAgICBpbnQgbUhlaWdodDsKKyAgICBpbnQgbVJvdGF0aW9uOworCisgICAgcHVibGljIE1vZGVsVmlld2VyUlMoKSB7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgaW5pdChSZW5kZXJTY3JpcHRHTCBycywgUmVzb3VyY2VzIHJlcywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7CisgICAgICAgIG1SUyA9IHJzOworICAgICAgICBtUmVzID0gcmVzOworICAgICAgICBtV2lkdGggPSB3aWR0aDsKKyAgICAgICAgbUhlaWdodCA9IGhlaWdodDsKKyAgICAgICAgbVJvdGF0aW9uID0gMDsKKyAgICAgICAgaW5pdFJTKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBSZXNvdXJjZXMgbVJlczsKKyAgICBwcml2YXRlIFJlbmRlclNjcmlwdEdMIG1SUzsKKyAgICBwcml2YXRlIFNhbXBsZXIgbVNhbXBsZXI7CisgICAgcHJpdmF0ZSBQcm9ncmFtU3RvcmUgbVBTQmFja2dyb3VuZDsKKyAgICBwcml2YXRlIFByb2dyYW1GcmFnbWVudCBtUEZCYWNrZ3JvdW5kOworICAgIHByaXZhdGUgUHJvZ3JhbVZlcnRleCBtUFZCYWNrZ3JvdW5kOworICAgIHByaXZhdGUgUHJvZ3JhbVZlcnRleC5NYXRyaXhBbGxvY2F0aW9uIG1QVkE7CisKKyAgICBwcml2YXRlIEFsbG9jYXRpb24gbUdyaWRJbWFnZTsKKyAgICBwcml2YXRlIEFsbG9jYXRpb24gbUFsbG9jUFY7CisKKyAgICBwcml2YXRlIFNpbXBsZU1lc2ggbU1lc2g7CisKKyAgICBwcml2YXRlIEZvbnQgbUl0YWxpYzsKKyAgICBwcml2YXRlIEFsbG9jYXRpb24gbVRleHRBbGxvYzsKKworICAgIHByaXZhdGUgU2NyaXB0Q19Nb2RlbHZpZXdlciBtU2NyaXB0OworCisgICAgaW50IG1MYXN0WDsKKyAgICBpbnQgbUxhc3RZOworCisgICAgcHVibGljIHZvaWQgdG91Y2hFdmVudChpbnQgeCwgaW50IHkpIHsKKyAgICAgICAgaW50IGR4ID0gbUxhc3RYIC0geDsKKyAgICAgICAgaWYoTWF0aC5hYnMoZHgpID4gNTAgfHwgTWF0aC5hYnMoZHgpIDwgMykgeworICAgICAgICAgICAgZHggPSAwOworICAgICAgICB9CisKKyAgICAgICAgbVJvdGF0aW9uIC09IGR4OworICAgICAgICBpZihtUm90YXRpb24gPiAzNjApIHsKKyAgICAgICAgICAgIG1Sb3RhdGlvbiAtPSAzNjA7CisgICAgICAgIH0KKyAgICAgICAgaWYobVJvdGF0aW9uIDwgMCkgeworICAgICAgICAgICAgbVJvdGF0aW9uICs9IDM2MDsKKyAgICAgICAgfQorCisgICAgICAgIG1TY3JpcHQuc2V0X2dSb3RhdGUoLShmbG9hdCltUm90YXRpb24pOworCisgICAgICAgIG1MYXN0WCA9IHg7CisgICAgICAgIG1MYXN0WSA9IHk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGluaXRQRlMoKSB7CisgICAgICAgIFByb2dyYW1TdG9yZS5CdWlsZGVyIGIgPSBuZXcgUHJvZ3JhbVN0b3JlLkJ1aWxkZXIobVJTLCBudWxsLCBudWxsKTsKKworICAgICAgICBiLnNldERlcHRoRnVuYyhQcm9ncmFtU3RvcmUuRGVwdGhGdW5jLkxFU1MpOworICAgICAgICBiLnNldERpdGhlckVuYWJsZShmYWxzZSk7CisgICAgICAgIGIuc2V0RGVwdGhNYXNrKHRydWUpOworICAgICAgICBtUFNCYWNrZ3JvdW5kID0gYi5jcmVhdGUoKTsKKworICAgICAgICBtU2NyaXB0LnNldF9nUEZTQmFja2dyb3VuZChtUFNCYWNrZ3JvdW5kKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaW5pdFBGKCkgeworICAgICAgICBTYW1wbGVyLkJ1aWxkZXIgYnMgPSBuZXcgU2FtcGxlci5CdWlsZGVyKG1SUyk7CisgICAgICAgIGJzLnNldE1pbihTYW1wbGVyLlZhbHVlLkxJTkVBUik7CisgICAgICAgIGJzLnNldE1hZyhTYW1wbGVyLlZhbHVlLkxJTkVBUik7CisgICAgICAgIGJzLnNldFdyYXBTKFNhbXBsZXIuVmFsdWUuQ0xBTVApOworICAgICAgICBicy5zZXRXcmFwVChTYW1wbGVyLlZhbHVlLldSQVApOworICAgICAgICBtU2FtcGxlciA9IGJzLmNyZWF0ZSgpOworCisgICAgICAgIFByb2dyYW1GcmFnbWVudC5CdWlsZGVyIGIgPSBuZXcgUHJvZ3JhbUZyYWdtZW50LkJ1aWxkZXIobVJTKTsKKyAgICAgICAgYi5zZXRUZXh0dXJlKFByb2dyYW1GcmFnbWVudC5CdWlsZGVyLkVudk1vZGUuUkVQTEFDRSwKKyAgICAgICAgICAgICAgICAgICAgIFByb2dyYW1GcmFnbWVudC5CdWlsZGVyLkZvcm1hdC5SR0JBLCAwKTsKKyAgICAgICAgbVBGQmFja2dyb3VuZCA9IGIuY3JlYXRlKCk7CisgICAgICAgIG1QRkJhY2tncm91bmQuYmluZFNhbXBsZXIobVNhbXBsZXIsIDApOworCisgICAgICAgIG1TY3JpcHQuc2V0X2dQRkJhY2tncm91bmQobVBGQmFja2dyb3VuZCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGluaXRQVigpIHsKKyAgICAgICAgUHJvZ3JhbVZlcnRleC5CdWlsZGVyIHB2YiA9IG5ldyBQcm9ncmFtVmVydGV4LkJ1aWxkZXIobVJTLCBudWxsLCBudWxsKTsKKyAgICAgICAgbVBWQmFja2dyb3VuZCA9IHB2Yi5jcmVhdGUoKTsKKworICAgICAgICBtUFZBID0gbmV3IFByb2dyYW1WZXJ0ZXguTWF0cml4QWxsb2NhdGlvbihtUlMpOworICAgICAgICBtUFZCYWNrZ3JvdW5kLmJpbmRBbGxvY2F0aW9uKG1QVkEpOworICAgICAgICBtUFZBLnNldHVwUHJvamVjdGlvbk5vcm1hbGl6ZWQobVdpZHRoLCBtSGVpZ2h0KTsKKworICAgICAgICBtU2NyaXB0LnNldF9nUFZCYWNrZ3JvdW5kKG1QVkJhY2tncm91bmQpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBsb2FkSW1hZ2UoKSB7CisgICAgICAgIG1HcmlkSW1hZ2UgPSBBbGxvY2F0aW9uLmNyZWF0ZUZyb21CaXRtYXBSZXNvdXJjZUJveGVkKG1SUywgbVJlcywgUi5kcmF3YWJsZS5yb2JvdCwgRWxlbWVudC5SR0JfNTY1KG1SUyksIHRydWUpOworICAgICAgICBtR3JpZEltYWdlLnVwbG9hZFRvVGV4dHVyZSgwKTsKKworICAgICAgICBtU2NyaXB0LnNldF9nVEdyaWQobUdyaWRJbWFnZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGluaXRUZXh0QWxsb2NhdGlvbigpIHsKKyAgICAgICAgU3RyaW5nIGFsbG9jU3RyaW5nID0gIkRpc3BsYXlpbmcgZmlsZTogUi5yYXcucm9ib3QiOworICAgICAgICBtVGV4dEFsbG9jID0gQWxsb2NhdGlvbi5jcmVhdGVGcm9tU3RyaW5nKG1SUywgYWxsb2NTdHJpbmcpOworICAgICAgICBtU2NyaXB0LnNldF9nVGV4dEFsbG9jKG1UZXh0QWxsb2MpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBpbml0UlMoKSB7CisKKyAgICAgICAgbVNjcmlwdCA9IG5ldyBTY3JpcHRDX01vZGVsdmlld2VyKG1SUywgbVJlcywgUi5yYXcubW9kZWx2aWV3ZXJfYmMsIHRydWUpOworCisgICAgICAgIGluaXRQRlMoKTsKKyAgICAgICAgaW5pdFBGKCk7CisgICAgICAgIGluaXRQVigpOworCisgICAgICAgIGxvYWRJbWFnZSgpOworCisgICAgICAgIEZpbGVBM0QgbW9kZWwgPSBGaWxlQTNELmNyZWF0ZUZyb21SZXNvdXJjZShtUlMsIG1SZXMsIFIucmF3LnJvYm90KTsKKyAgICAgICAgRmlsZUEzRC5JbmRleEVudHJ5IGVudHJ5ID0gbW9kZWwuZ2V0SW5kZXhFbnRyeSgwKTsKKyAgICAgICAgaWYoZW50cnkgPT0gbnVsbCB8fCBlbnRyeS5nZXRDbGFzc0lEKCkgIT0gRmlsZUEzRC5DbGFzc0lELlNJTVBMRV9NRVNIKSB7CisgICAgICAgICAgICBMb2cuZSgicnMiLCAiY291bGQgbm90IGxvYWQgbW9kZWwiKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIG1NZXNoID0gKFNpbXBsZU1lc2gpZW50cnkuZ2V0T2JqZWN0KCk7CisgICAgICAgICAgICBtU2NyaXB0LnNldF9nVGVzdE1lc2gobU1lc2gpOworICAgICAgICB9CisKKyAgICAgICAgbUl0YWxpYyA9IEZvbnQuY3JlYXRlKG1SUywgbVJlcywgIkRyb2lkU2VyaWYtSXRhbGljLnR0ZiIsIDEwKTsKKyAgICAgICAgbVNjcmlwdC5zZXRfZ0l0YWxpYyhtSXRhbGljKTsKKworICAgICAgICBpbml0VGV4dEFsbG9jYXRpb24oKTsKKworICAgICAgICBtUlMuY29udGV4dEJpbmRSb290U2NyaXB0KG1TY3JpcHQpOworICAgIH0KK30KKworCisKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9GaWxtL3NyYy9jb20vYW5kcm9pZC9maWxtL0ZpbG1WaWV3LmphdmEgYi9saWJzL3JzL2phdmEvTW9kZWxWaWV3ZXIvc3JjL2NvbS9hbmRyb2lkL21vZGVsdmlld2VyL01vZGVsVmlld2VyVmlldy5qYXZhCnNpbWlsYXJpdHkgaW5kZXggODklCnJlbmFtZSBmcm9tIGxpYnMvcnMvamF2YS9GaWxtL3NyYy9jb20vYW5kcm9pZC9maWxtL0ZpbG1WaWV3LmphdmEKcmVuYW1lIHRvIGxpYnMvcnMvamF2YS9Nb2RlbFZpZXdlci9zcmMvY29tL2FuZHJvaWQvbW9kZWx2aWV3ZXIvTW9kZWxWaWV3ZXJWaWV3LmphdmEKaW5kZXggNWJjMjgxMS4uMDYxY2Y4ZSAxMDA2NDQKLS0tIGEvbGlicy9ycy9qYXZhL0ZpbG0vc3JjL2NvbS9hbmRyb2lkL2ZpbG0vRmlsbVZpZXcuamF2YQorKysgYi9saWJzL3JzL2phdmEvTW9kZWxWaWV3ZXIvc3JjL2NvbS9hbmRyb2lkL21vZGVsdmlld2VyL01vZGVsVmlld2VyVmlldy5qYXZhCkBAIC0xNCw3ICsxNCw3IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmZpbG07CitwYWNrYWdlIGNvbS5hbmRyb2lkLm1vZGVsdmlld2VyOwogCiBpbXBvcnQgamF2YS5pby5Xcml0ZXI7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKQEAgLTM5LDE1ICszOSwxNSBAQAogaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQ7CiAKLXB1YmxpYyBjbGFzcyBGaWxtVmlldyBleHRlbmRzIFJTU3VyZmFjZVZpZXcgeworcHVibGljIGNsYXNzIE1vZGVsVmlld2VyVmlldyBleHRlbmRzIFJTU3VyZmFjZVZpZXcgewogCi0gICAgcHVibGljIEZpbG1WaWV3KENvbnRleHQgY29udGV4dCkgeworICAgIHB1YmxpYyBNb2RlbFZpZXdlclZpZXcoQ29udGV4dCBjb250ZXh0KSB7CiAgICAgICAgIHN1cGVyKGNvbnRleHQpOwogICAgICAgICAvL3NldEZvY3VzYWJsZSh0cnVlKTsKICAgICB9CiAKICAgICBwcml2YXRlIFJlbmRlclNjcmlwdEdMIG1SUzsKLSAgICBwcml2YXRlIEZpbG1SUyBtUmVuZGVyOworICAgIHByaXZhdGUgTW9kZWxWaWV3ZXJSUyBtUmVuZGVyOwogCiAKICAgICBwdWJsaWMgdm9pZCBzdXJmYWNlQ2hhbmdlZChTdXJmYWNlSG9sZGVyIGhvbGRlciwgaW50IGZvcm1hdCwgaW50IHcsIGludCBoKSB7CkBAIC01NSw3ICs1NSw3IEBACiAgICAgICAgIGlmIChtUlMgPT0gbnVsbCkgewogICAgICAgICAgICAgbVJTID0gY3JlYXRlUmVuZGVyU2NyaXB0KHRydWUpOwogICAgICAgICAgICAgbVJTLmNvbnRleHRTZXRTdXJmYWNlKHcsIGgsIGhvbGRlci5nZXRTdXJmYWNlKCkpOwotICAgICAgICAgICAgbVJlbmRlciA9IG5ldyBGaWxtUlMoKTsKKyAgICAgICAgICAgIG1SZW5kZXIgPSBuZXcgTW9kZWxWaWV3ZXJSUygpOwogICAgICAgICAgICAgbVJlbmRlci5pbml0KG1SUywgZ2V0UmVzb3VyY2VzKCksIHcsIGgpOwogICAgICAgICB9CiAgICAgfQpAQCAtODUsNyArODUsOCBAQAogICAgICAgICBpZiAoYWN0ID09IGV2LkFDVElPTl9VUCkgewogICAgICAgICAgICAgcmV0ID0gZmFsc2U7CiAgICAgICAgIH0KLSAgICAgICAgbVJlbmRlci5zZXRGaWxtU3RyaXBQb3NpdGlvbigoaW50KWV2LmdldFgoKSwgKGludClldi5nZXRZKCkgLyA1KTsKKworICAgICAgICBtUmVuZGVyLnRvdWNoRXZlbnQoKGludClldi5nZXRYKCksIChpbnQpZXYuZ2V0WSgpKTsKICAgICAgICAgcmV0dXJuIHJldDsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvTW9kZWxWaWV3ZXIvc3JjL2NvbS9hbmRyb2lkL21vZGVsdmlld2VyL1NjcmlwdENfTW9kZWx2aWV3ZXIuamF2YSBiL2xpYnMvcnMvamF2YS9Nb2RlbFZpZXdlci9zcmMvY29tL2FuZHJvaWQvbW9kZWx2aWV3ZXIvU2NyaXB0Q19Nb2RlbHZpZXdlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzYTJhMjkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL2phdmEvTW9kZWxWaWV3ZXIvc3JjL2NvbS9hbmRyb2lkL21vZGVsdmlld2VyL1NjcmlwdENfTW9kZWx2aWV3ZXIuamF2YQpAQCAtMCwwICsxLDExOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQubW9kZWx2aWV3ZXI7CisKK2ltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC4qOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK3B1YmxpYyBjbGFzcyBTY3JpcHRDX01vZGVsdmlld2VyIGV4dGVuZHMgU2NyaXB0QyB7CisgICAgLy8gQ29uc3RydWN0b3IKKyAgICBwdWJsaWMgIFNjcmlwdENfTW9kZWx2aWV3ZXIoUmVuZGVyU2NyaXB0IHJzLCBSZXNvdXJjZXMgcmVzb3VyY2VzLCBpbnQgaWQsIGJvb2xlYW4gaXNSb290KSB7CisgICAgICAgIHN1cGVyKHJzLCByZXNvdXJjZXMsIGlkLCBpc1Jvb3QpOworICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBtRXhwb3J0VmFySWR4X2dQVkJhY2tncm91bmQgPSAwOworICAgIHByaXZhdGUgUHJvZ3JhbVZlcnRleCBtRXhwb3J0VmFyX2dQVkJhY2tncm91bmQ7CisgICAgcHVibGljIHZvaWQgc2V0X2dQVkJhY2tncm91bmQoUHJvZ3JhbVZlcnRleCB2KSB7CisgICAgICAgIG1FeHBvcnRWYXJfZ1BWQmFja2dyb3VuZCA9IHY7CisgICAgICAgIHNldFZhcihtRXhwb3J0VmFySWR4X2dQVkJhY2tncm91bmQsICh2ID09IG51bGwpID8gMCA6IHYuZ2V0SUQoKSk7CisgICAgfQorCisgICAgcHVibGljIFByb2dyYW1WZXJ0ZXggZ2V0X2dQVkJhY2tncm91bmQoKSB7CisgICAgICAgIHJldHVybiBtRXhwb3J0VmFyX2dQVkJhY2tncm91bmQ7CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IG1FeHBvcnRWYXJJZHhfZ1BGQmFja2dyb3VuZCA9IDE7CisgICAgcHJpdmF0ZSBQcm9ncmFtRnJhZ21lbnQgbUV4cG9ydFZhcl9nUEZCYWNrZ3JvdW5kOworICAgIHB1YmxpYyB2b2lkIHNldF9nUEZCYWNrZ3JvdW5kKFByb2dyYW1GcmFnbWVudCB2KSB7CisgICAgICAgIG1FeHBvcnRWYXJfZ1BGQmFja2dyb3VuZCA9IHY7CisgICAgICAgIHNldFZhcihtRXhwb3J0VmFySWR4X2dQRkJhY2tncm91bmQsICh2ID09IG51bGwpID8gMCA6IHYuZ2V0SUQoKSk7CisgICAgfQorCisgICAgcHVibGljIFByb2dyYW1GcmFnbWVudCBnZXRfZ1BGQmFja2dyb3VuZCgpIHsKKyAgICAgICAgcmV0dXJuIG1FeHBvcnRWYXJfZ1BGQmFja2dyb3VuZDsKKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgbUV4cG9ydFZhcklkeF9nVEdyaWQgPSAyOworICAgIHByaXZhdGUgQWxsb2NhdGlvbiBtRXhwb3J0VmFyX2dUR3JpZDsKKyAgICBwdWJsaWMgdm9pZCBzZXRfZ1RHcmlkKEFsbG9jYXRpb24gdikgeworICAgICAgICBtRXhwb3J0VmFyX2dUR3JpZCA9IHY7CisgICAgICAgIHNldFZhcihtRXhwb3J0VmFySWR4X2dUR3JpZCwgKHYgPT0gbnVsbCkgPyAwIDogdi5nZXRJRCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQWxsb2NhdGlvbiBnZXRfZ1RHcmlkKCkgeworICAgICAgICByZXR1cm4gbUV4cG9ydFZhcl9nVEdyaWQ7CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IG1FeHBvcnRWYXJJZHhfZ1Rlc3RNZXNoID0gMzsKKyAgICBwcml2YXRlIFNpbXBsZU1lc2ggbUV4cG9ydFZhcl9nVGVzdE1lc2g7CisgICAgcHVibGljIHZvaWQgc2V0X2dUZXN0TWVzaChTaW1wbGVNZXNoIHYpIHsKKyAgICAgICAgbUV4cG9ydFZhcl9nVGVzdE1lc2ggPSB2OworICAgICAgICBzZXRWYXIobUV4cG9ydFZhcklkeF9nVGVzdE1lc2gsICh2ID09IG51bGwpID8gMCA6IHYuZ2V0SUQoKSk7CisgICAgfQorCisgICAgcHVibGljIFNpbXBsZU1lc2ggZ2V0X2dUZXN0TWVzaCgpIHsKKyAgICAgICAgcmV0dXJuIG1FeHBvcnRWYXJfZ1Rlc3RNZXNoOworICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBtRXhwb3J0VmFySWR4X2dQRlNCYWNrZ3JvdW5kID0gNDsKKyAgICBwcml2YXRlIFByb2dyYW1TdG9yZSBtRXhwb3J0VmFyX2dQRlNCYWNrZ3JvdW5kOworICAgIHB1YmxpYyB2b2lkIHNldF9nUEZTQmFja2dyb3VuZChQcm9ncmFtU3RvcmUgdikgeworICAgICAgICBtRXhwb3J0VmFyX2dQRlNCYWNrZ3JvdW5kID0gdjsKKyAgICAgICAgc2V0VmFyKG1FeHBvcnRWYXJJZHhfZ1BGU0JhY2tncm91bmQsICh2ID09IG51bGwpID8gMCA6IHYuZ2V0SUQoKSk7CisgICAgfQorCisgICAgcHVibGljIFByb2dyYW1TdG9yZSBnZXRfZ1BGU0JhY2tncm91bmQoKSB7CisgICAgICAgIHJldHVybiBtRXhwb3J0VmFyX2dQRlNCYWNrZ3JvdW5kOworICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBtRXhwb3J0VmFySWR4X2dSb3RhdGUgPSA1OworICAgIHByaXZhdGUgZmxvYXQgbUV4cG9ydFZhcl9nUm90YXRlOworICAgIHB1YmxpYyB2b2lkIHNldF9nUm90YXRlKGZsb2F0IHYpIHsKKyAgICAgICAgbUV4cG9ydFZhcl9nUm90YXRlID0gdjsKKyAgICAgICAgc2V0VmFyKG1FeHBvcnRWYXJJZHhfZ1JvdGF0ZSwgdik7CisgICAgfQorCisgICAgcHVibGljIGZsb2F0IGdldF9nUm90YXRlKCkgeworICAgICAgICByZXR1cm4gbUV4cG9ydFZhcl9nUm90YXRlOworICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBtRXhwb3J0VmFySWR4X2dJdGFsaWMgPSA2OworICAgIHByaXZhdGUgRm9udCBtRXhwb3J0VmFyX2dJdGFsaWM7CisgICAgcHVibGljIHZvaWQgc2V0X2dJdGFsaWMoRm9udCB2KSB7CisgICAgICAgIG1FeHBvcnRWYXJfZ0l0YWxpYyA9IHY7CisgICAgICAgIHNldFZhcihtRXhwb3J0VmFySWR4X2dJdGFsaWMsICh2ID09IG51bGwpID8gMCA6IHYuZ2V0SUQoKSk7CisgICAgfQorCisgICAgcHVibGljIEZvbnQgZ2V0X2dJdGFsaWMoKSB7CisgICAgICAgIHJldHVybiBtRXhwb3J0VmFyX2dJdGFsaWM7CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IG1FeHBvcnRWYXJJZHhfZ1RleHRBbGxvYyA9IDc7CisgICAgcHJpdmF0ZSBBbGxvY2F0aW9uIG1FeHBvcnRWYXJfZ1RleHRBbGxvYzsKKyAgICBwdWJsaWMgdm9pZCBzZXRfZ1RleHRBbGxvYyhBbGxvY2F0aW9uIHYpIHsKKyAgICAgICAgbUV4cG9ydFZhcl9nVGV4dEFsbG9jID0gdjsKKyAgICAgICAgc2V0VmFyKG1FeHBvcnRWYXJJZHhfZ1RleHRBbGxvYywgKHYgPT0gbnVsbCkgPyAwIDogdi5nZXRJRCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQWxsb2NhdGlvbiBnZXRfZ1RleHRBbGxvYygpIHsKKyAgICAgICAgcmV0dXJuIG1FeHBvcnRWYXJfZ1RleHRBbGxvYzsKKyAgICB9CisKK30KKwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9ycy5zcGVjIGIvbGlicy9ycy9ycy5zcGVjCmluZGV4IGNiOTkzN2MuLjBhMTY4ZjQgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnMuc3BlYworKysgYi9saWJzL3JzL3JzLnNwZWMKQEAgLTEsMTEgKzEsMTQgQEAKIAorQ29udGV4dEZpbmlzaCB7CisJaGFuZGNvZGVBcGkKKwl9CiAKIENvbnRleHRCaW5kUm9vdFNjcmlwdCB7CiAJcGFyYW0gUnNTY3JpcHQgc2FtcGxlcgogCX0KIAotQ29udGV4dEJpbmRQcm9ncmFtRnJhZ21lbnRTdG9yZSB7Ci0JcGFyYW0gUnNQcm9ncmFtRnJhZ21lbnRTdG9yZSBwZ20KK0NvbnRleHRCaW5kUHJvZ3JhbVN0b3JlIHsKKwlwYXJhbSBSc1Byb2dyYW1TdG9yZSBwZ20KIAl9CiAKIENvbnRleHRCaW5kUHJvZ3JhbUZyYWdtZW50IHsKQEAgLTIwLDYgKzIzLDEwIEBACiAJcGFyYW0gUnNQcm9ncmFtUmFzdGVyIHBnbQogCX0KIAorQ29udGV4dEJpbmRGb250IHsKKwlwYXJhbSBSc0ZvbnQgcGdtCisJfQorCiBDb250ZXh0UGF1c2UgewogCX0KIApAQCAtMjQ4LDEzICsyNTUsNiBAQAogU2NyaXB0Q0JlZ2luIHsKIAl9CiAKLVNjcmlwdFNldENsZWFyQ29sb3IgewotCXBhcmFtIFJzU2NyaXB0IHMKLQlwYXJhbSBmbG9hdCByCi0JcGFyYW0gZmxvYXQgZwotCXBhcmFtIGZsb2F0IGIKLQlwYXJhbSBmbG9hdCBhCi0JfQogCiBTY3JpcHRTZXRUaW1lWm9uZSB7CiAJcGFyYW0gUnNTY3JpcHQgcwpAQCAtMjYyLDM3ICsyNjIsNDEgQEAKIAlwYXJhbSB1aW50MzJfdCBsZW5ndGgKIAl9CiAKLVNjcmlwdFNldENsZWFyRGVwdGggewotCXBhcmFtIFJzU2NyaXB0IHMKLQlwYXJhbSBmbG9hdCBkZXB0aAotCX0KLQotU2NyaXB0U2V0Q2xlYXJTdGVuY2lsIHsKLQlwYXJhbSBSc1NjcmlwdCBzCi0JcGFyYW0gdWludDMyX3Qgc3RlbmNpbAotCX0KLQotU2NyaXB0U2V0VHlwZSB7Ci0JcGFyYW0gUnNUeXBlIHR5cGUKLQlwYXJhbSB1aW50MzJfdCBzbG90Ci0JcGFyYW0gYm9vbCBpc1dyaXRhYmxlCi0JcGFyYW0gY29uc3QgY2hhciAqIG5hbWUKLQl9Ci0KLVNjcmlwdFNldEludm9rZSB7Ci0JcGFyYW0gY29uc3QgY2hhciAqIG5hbWUKLQlwYXJhbSB1aW50MzJfdCBzbG90Ci0JfQogCiBTY3JpcHRJbnZva2UgewogCXBhcmFtIFJzU2NyaXB0IHMKIAlwYXJhbSB1aW50MzJfdCBzbG90CiAJfQogCi1TY3JpcHRTZXRSb290IHsKLQlwYXJhbSBib29sIGlzUm9vdAorU2NyaXB0SW52b2tlViB7CisJcGFyYW0gUnNTY3JpcHQgcworCXBhcmFtIHVpbnQzMl90IHNsb3QKKwlwYXJhbSBjb25zdCB2b2lkICogZGF0YQorCXBhcmFtIHVpbnQzMl90IGRhdGFMZW4KKwloYW5kY29kZUFwaQorCXRvZ2dsZVBsYXkKIAl9CiAKK1NjcmlwdFNldFZhckkgeworCXBhcmFtIFJzU2NyaXB0IHMKKwlwYXJhbSB1aW50MzJfdCBzbG90CisJcGFyYW0gaW50IHZhbHVlCisJfQorCitTY3JpcHRTZXRWYXJGIHsKKwlwYXJhbSBSc1NjcmlwdCBzCisJcGFyYW0gdWludDMyX3Qgc2xvdAorCXBhcmFtIGZsb2F0IHZhbHVlCisJfQorCitTY3JpcHRTZXRWYXJWIHsKKwlwYXJhbSBSc1NjcmlwdCBzCisJcGFyYW0gdWludDMyX3Qgc2xvdAorCXBhcmFtIGNvbnN0IHZvaWQgKiBkYXRhCisJcGFyYW0gdWludDMyX3QgZGF0YUxlbgorCWhhbmRjb2RlQXBpCisJdG9nZ2xlUGxheQorCX0KIAogCiBTY3JpcHRDU2V0U2NyaXB0IHsKQEAgLTMwOCw0NyArMzEyLDM4IEBACiAJcmV0IFJzU2NyaXB0CiAJfQogCi1TY3JpcHRDU2V0RGVmaW5lRiB7Ci0gICAgcGFyYW0gY29uc3QgY2hhciogbmFtZQotICAgIHBhcmFtIGZsb2F0IHZhbHVlCi0gICAgfQogCi1TY3JpcHRDU2V0RGVmaW5lSTMyIHsKLSAgICBwYXJhbSBjb25zdCBjaGFyKiBuYW1lCi0gICAgcGFyYW0gaW50MzJfdCB2YWx1ZQotICAgIH0KLQotUHJvZ3JhbUZyYWdtZW50U3RvcmVCZWdpbiB7CitQcm9ncmFtU3RvcmVCZWdpbiB7CiAJcGFyYW0gUnNFbGVtZW50IGluCiAJcGFyYW0gUnNFbGVtZW50IG91dAogCX0KIAotUHJvZ3JhbUZyYWdtZW50U3RvcmVDb2xvck1hc2sgeworUHJvZ3JhbVN0b3JlQ29sb3JNYXNrIHsKIAlwYXJhbSBib29sIHIKIAlwYXJhbSBib29sIGcKIAlwYXJhbSBib29sIGIKIAlwYXJhbSBib29sIGEKIAl9CiAKLVByb2dyYW1GcmFnbWVudFN0b3JlQmxlbmRGdW5jIHsKK1Byb2dyYW1TdG9yZUJsZW5kRnVuYyB7CiAJcGFyYW0gUnNCbGVuZFNyY0Z1bmMgc3JjRnVuYwogCXBhcmFtIFJzQmxlbmREc3RGdW5jIGRlc3RGdW5jCiAJfQogCi1Qcm9ncmFtRnJhZ21lbnRTdG9yZURlcHRoTWFzayB7CitQcm9ncmFtU3RvcmVEZXB0aE1hc2sgewogCXBhcmFtIGJvb2wgZW5hYmxlCiB9CiAKLVByb2dyYW1GcmFnbWVudFN0b3JlRGl0aGVyIHsKK1Byb2dyYW1TdG9yZURpdGhlciB7CiAJcGFyYW0gYm9vbCBlbmFibGUKIH0KIAotUHJvZ3JhbUZyYWdtZW50U3RvcmVEZXB0aEZ1bmMgeworUHJvZ3JhbVN0b3JlRGVwdGhGdW5jIHsKIAlwYXJhbSBSc0RlcHRoRnVuYyBmdW5jCiB9CiAKLVByb2dyYW1GcmFnbWVudFN0b3JlQ3JlYXRlIHsKLQlyZXQgUnNQcm9ncmFtRnJhZ21lbnRTdG9yZQorUHJvZ3JhbVN0b3JlQ3JlYXRlIHsKKwlyZXQgUnNQcm9ncmFtU3RvcmUKIAl9CiAKIFByb2dyYW1SYXN0ZXJDcmVhdGUgewpAQCAtNDQ3LDEyICs0NDIsNDEgQEAKIAlwYXJhbSBmbG9hdCBiCiAJfQogCitGaWxlQTNEQ3JlYXRlRnJvbUFzc2V0U3RyZWFtIHsKKwlwYXJhbSBjb25zdCB2b2lkICogZGF0YQorCXBhcmFtIHNpemVfdCBsZW4KKwlyZXQgUnNGaWxlCisJfQorCiBGaWxlT3BlbiB7CiAJcmV0IFJzRmlsZQogCXBhcmFtIGNvbnN0IGNoYXIgKm5hbWUKIAlwYXJhbSBzaXplX3QgbGVuCiAJfQogCitGaWxlQTNER2V0TnVtSW5kZXhFbnRyaWVzIHsKKwlwYXJhbSBpbnQzMl90ICogbnVtRW50cmllcworCXBhcmFtIFJzRmlsZSBmaWxlCisJfQorCitGaWxlQTNER2V0SW5kZXhFbnRyaWVzIHsKKwlwYXJhbSBSc0ZpbGVJbmRleEVudHJ5ICogZmlsZUVudHJpZXMKKwlwYXJhbSB1aW50MzJfdCBudW1FbnRyaWVzCisJcGFyYW0gUnNGaWxlIGZpbGVBM0QKKwl9CisKK0ZpbGVBM0RHZXRFbnRyeUJ5SW5kZXggeworCXBhcmFtIHVpbnQzMl90IGluZGV4CisJcGFyYW0gUnNGaWxlIGZpbGUKKwlyZXQgUnNPYmplY3RCYXNlCisJfQorCitGb250Q3JlYXRlRnJvbUZpbGUgeworCXBhcmFtIGNvbnN0IGNoYXIgKm5hbWUKKwlwYXJhbSB1aW50MzJfdCBmb250U2l6ZQorCXBhcmFtIHVpbnQzMl90IGRwaQorCXJldCBSc0ZvbnQKKwl9CiAKIFNpbXBsZU1lc2hDcmVhdGUgewogCXJldCBSc1NpbXBsZU1lc2gKQEAgLTQ4MCwzICs1MDQsMTMgQEAKIAlwYXJhbSB1aW50MzJfdCBzbG90CiAJfQogCitBbmltYXRpb25DcmVhdGUgeworCXBhcmFtIGNvbnN0IGZsb2F0ICppblZhbHVlcworCXBhcmFtIGNvbnN0IGZsb2F0ICpvdXRWYWx1ZXMKKwlwYXJhbSB1aW50MzJfdCB2YWx1ZUNvdW50CisJcGFyYW0gUnNBbmltYXRpb25JbnRlcnBvbGF0aW9uIGludGVycAorCXBhcmFtIFJzQW5pbWF0aW9uRWRnZSBwcmUKKwlwYXJhbSBSc0FuaW1hdGlvbkVkZ2UgcG9zdAorCXJldCBSc0FuaW1hdGlvbgorCX0KKwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc0FkYXB0ZXIuY3BwIGIvbGlicy9ycy9yc0FkYXB0ZXIuY3BwCmluZGV4IDBkMzFmYWMuLmI0ZWMyNTAgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNBZGFwdGVyLmNwcAorKysgYi9saWJzL3JzL3JzQWRhcHRlci5jcHAKQEAgLTE1LDcgKzE1LDExIEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCisjaWZuZGVmIEFORFJPSURfUlNfQlVJTERfRk9SX0hPU1QKICNpbmNsdWRlICJyc0NvbnRleHQuaCIKKyNlbHNlCisjaW5jbHVkZSAicnNDb250ZXh0SG9zdFN0dWIuaCIKKyNlbmRpZgogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpyZW5kZXJzY3JpcHQ7CkBAIC03MCw2ICs3NCwxNiBAQAogICAgICAgICAgICBtQWxsb2NhdGlvbi5nZXQoKS0+Z2V0VHlwZSgpLT5nZXRTaXplQnl0ZXMoKSk7CiB9CiAKK3ZvaWQgQWRhcHRlcjFEOjpzZXJpYWxpemUoT1N0cmVhbSAqc3RyZWFtKSBjb25zdAoreworICAgIAorfQorCitBZGFwdGVyMUQgKkFkYXB0ZXIxRDo6Y3JlYXRlRnJvbVN0cmVhbShDb250ZXh0ICpyc2MsIElTdHJlYW0gKnN0cmVhbSkKK3sKKyAgICByZXR1cm4gTlVMTDsKK30KKwogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIHJlbmRlcnNjcmlwdCB7CiAKQEAgLTE4NSw2ICsxOTksMTUgQEAKICAgICAgICAgICAgbUFsbG9jYXRpb24uZ2V0KCktPmdldFR5cGUoKS0+Z2V0U2l6ZUJ5dGVzKCkpOwogfQogCit2b2lkIEFkYXB0ZXIyRDo6c2VyaWFsaXplKE9TdHJlYW0gKnN0cmVhbSkgY29uc3QKK3sKKyAgICAKK30KKworQWRhcHRlcjJEICpBZGFwdGVyMkQ6OmNyZWF0ZUZyb21TdHJlYW0oQ29udGV4dCAqcnNjLCBJU3RyZWFtICpzdHJlYW0pCit7CisgICAgcmV0dXJuIE5VTEw7Cit9CiAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc0FkYXB0ZXIuaCBiL2xpYnMvcnMvcnNBZGFwdGVyLmgKaW5kZXggY2IyODcyZS4uNDQ5ZTdhZCAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc0FkYXB0ZXIuaAorKysgYi9saWJzL3JzL3JzQWRhcHRlci5oCkBAIC01MCw2ICs1MCwxMCBAQAogICAgIHZvaWQgc3ViRGF0YSh1aW50MzJfdCB4b2ZmLCB1aW50MzJfdCBjb3VudCwgY29uc3Qgdm9pZCAqZGF0YSk7CiAgICAgdm9pZCBkYXRhKGNvbnN0IHZvaWQgKmRhdGEpOwogCisgICAgdmlydHVhbCB2b2lkIHNlcmlhbGl6ZShPU3RyZWFtICpzdHJlYW0pIGNvbnN0OworICAgIHZpcnR1YWwgUnNBM0RDbGFzc0lEIGdldENsYXNzSWQoKSBjb25zdCB7IHJldHVybiBSU19BM0RfQ0xBU1NfSURfQURBUFRFUl8xRDsgfQorICAgIHN0YXRpYyBBZGFwdGVyMUQgKmNyZWF0ZUZyb21TdHJlYW0oQ29udGV4dCAqcnNjLCBJU3RyZWFtICpzdHJlYW0pOworCiBwcm90ZWN0ZWQ6CiAgICAgT2JqZWN0QmFzZVJlZjxBbGxvY2F0aW9uPiBtQWxsb2NhdGlvbjsKICAgICB1aW50MzJfdCBtWTsKQEAgLTgyLDYgKzg2LDEwIEBACiAgICAgdm9pZCBkYXRhKGNvbnN0IHZvaWQgKmRhdGEpOwogICAgIHZvaWQgc3ViRGF0YSh1aW50MzJfdCB4b2ZmLCB1aW50MzJfdCB5b2ZmLCB1aW50MzJfdCB3LCB1aW50MzJfdCBoLCBjb25zdCB2b2lkICpkYXRhKTsKIAorICAgIHZpcnR1YWwgdm9pZCBzZXJpYWxpemUoT1N0cmVhbSAqc3RyZWFtKSBjb25zdDsKKyAgICB2aXJ0dWFsIFJzQTNEQ2xhc3NJRCBnZXRDbGFzc0lkKCkgY29uc3QgeyByZXR1cm4gUlNfQTNEX0NMQVNTX0lEX0FEQVBURVJfMkQ7IH0KKyAgICBzdGF0aWMgQWRhcHRlcjJEICpjcmVhdGVGcm9tU3RyZWFtKENvbnRleHQgKnJzYywgSVN0cmVhbSAqc3RyZWFtKTsKKwogcHJvdGVjdGVkOgogICAgIE9iamVjdEJhc2VSZWY8QWxsb2NhdGlvbj4gbUFsbG9jYXRpb247CiAgICAgdWludDMyX3QgbVo7CmRpZmYgLS1naXQgYS9saWJzL3JzL3JzQWxsb2NhdGlvbi5jcHAgYi9saWJzL3JzL3JzQWxsb2NhdGlvbi5jcHAKaW5kZXggNGU4Mjc4ZC4uZDlkMGJjNSAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc0FsbG9jYXRpb24uY3BwCisrKyBiL2xpYnMvcnMvcnNBbGxvY2F0aW9uLmNwcApAQCAtMTMsMTIgKzEzLDE4IEBACiAgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwotCisjaWZuZGVmIEFORFJPSURfUlNfQlVJTERfRk9SX0hPU1QKICNpbmNsdWRlICJyc0NvbnRleHQuaCIKIAogI2luY2x1ZGUgPEdMRVMvZ2wuaD4KICNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KICNpbmNsdWRlIDxHTEVTL2dsZXh0Lmg+CisjZWxzZQorI2luY2x1ZGUgInJzQ29udGV4dEhvc3RTdHViLmgiCisKKyNpbmNsdWRlIDxPcGVuR0wvZ2wuaD4KKyNpbmNsdWRlIDxPcGVuR2wvZ2xleHQuaD4KKyNlbmRpZgogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpyZW5kZXJzY3JpcHQ7CkBAIC0xNjcsOSArMTczLDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAwLCBmb3JtYXQsIHR5cGUsIHB0cik7CiAgICAgfQogICAgIGlmIChtVGV4dHVyZUdlbk1pcG1hcCkgeworI2lmbmRlZiBBTkRST0lEX1JTX0JVSUxEX0ZPUl9IT1NUCiAgICAgICAgIGdsR2VuZXJhdGVNaXBtYXAoR0xfVEVYVFVSRV8yRCk7CisjZW5kaWYgLy9BTkRST0lEX1JTX0JVSUxEX0ZPUl9IT1NUCiAgICAgfQogCisgICAgcnNjLT5jaGVja0Vycm9yKCJBbGxvY2F0aW9uOjp1cGxvYWRUb1RleHR1cmUiKTsKIH0KIAogdm9pZCBBbGxvY2F0aW9uOjpkZWZlcmVkVXBsb2FkVG9CdWZmZXJPYmplY3QoY29uc3QgQ29udGV4dCAqcnNjKQpAQCAtMjAxLDYgKzIxMCw3IEBACiAgICAgZ2xCaW5kQnVmZmVyKEdMX0FSUkFZX0JVRkZFUiwgbUJ1ZmZlcklEKTsKICAgICBnbEJ1ZmZlckRhdGEoR0xfQVJSQVlfQlVGRkVSLCBtVHlwZS0+Z2V0U2l6ZUJ5dGVzKCksIGdldFB0cigpLCBHTF9EWU5BTUlDX0RSQVcpOwogICAgIGdsQmluZEJ1ZmZlcihHTF9BUlJBWV9CVUZGRVIsIDApOworICAgIHJzYy0+Y2hlY2tFcnJvcigiQWxsb2NhdGlvbjo6dXBsb2FkVG9CdWZmZXJPYmplY3QiKTsKIH0KIAogdm9pZCBBbGxvY2F0aW9uOjp1cGxvYWRDaGVjayhjb25zdCBDb250ZXh0ICpyc2MpCkBAIC0yODQsNyArMjk0LDcgQEAKIAogdm9pZCBBbGxvY2F0aW9uOjphZGRQcm9ncmFtVG9EaXJ0eShjb25zdCBQcm9ncmFtICpwKQogewotICAgIG1Ub0RpcnR5TGlzdC5hZGQocCk7CisgICAgbVRvRGlydHlMaXN0LnB1c2gocCk7CiB9CiAKIHZvaWQgQWxsb2NhdGlvbjo6cmVtb3ZlUHJvZ3JhbVRvRGlydHkoY29uc3QgUHJvZ3JhbSAqcCkKQEAgLTMxNiw2ICszMjYsNjAgQEAKIAogfQogCit2b2lkIEFsbG9jYXRpb246OnNlcmlhbGl6ZShPU3RyZWFtICpzdHJlYW0pIGNvbnN0Cit7CisgICAgLy8gTmVlZCB0byBpZGVudGlmeSBvdXJzZWx2ZXMKKyAgICBzdHJlYW0tPmFkZFUzMigodWludDMyX3QpZ2V0Q2xhc3NJZCgpKTsKKworICAgIFN0cmluZzggbmFtZShnZXROYW1lKCkpOworICAgIHN0cmVhbS0+YWRkU3RyaW5nKCZuYW1lKTsKKworICAgIC8vIEZpcnN0IHRoaW5nIHdlIG5lZWQgdG8gc2VyaWFsaXplIGlzIHRoZSB0eXBlIG9iamVjdCBzaW5jZSBpdCB3aWxsIGJlIG5lZWRlZAorICAgIC8vIHRvIGluaXRpYWxpemUgdGhlIGNsYXNzCisgICAgbVR5cGUtPnNlcmlhbGl6ZShzdHJlYW0pOworCisgICAgdWludDMyX3QgZGF0YVNpemUgPSBtVHlwZS0+Z2V0U2l6ZUJ5dGVzKCk7CisgICAgLy8gV3JpdGUgaG93IG11Y2ggZGF0YSB3ZSBhcmUgc3RvcmluZworICAgIHN0cmVhbS0+YWRkVTMyKGRhdGFTaXplKTsKKyAgICAvLyBOb3cgd3JpdGUgdGhlIGRhdGEKKyAgICBzdHJlYW0tPmFkZEJ5dGVBcnJheShtUHRyLCBkYXRhU2l6ZSk7Cit9CisKK0FsbG9jYXRpb24gKkFsbG9jYXRpb246OmNyZWF0ZUZyb21TdHJlYW0oQ29udGV4dCAqcnNjLCBJU3RyZWFtICpzdHJlYW0pCit7CisgICAgLy8gRmlyc3QgbWFrZSBzdXJlIHdlIGFyZSByZWFkaW5nIHRoZSBjb3JyZWN0IG9iamVjdAorICAgIFJzQTNEQ2xhc3NJRCBjbGFzc0lEID0gKFJzQTNEQ2xhc3NJRClzdHJlYW0tPmxvYWRVMzIoKTsKKyAgICBpZihjbGFzc0lEICE9IFJTX0EzRF9DTEFTU19JRF9BTExPQ0FUSU9OKSB7CisgICAgICAgIExPR0UoImFsbG9jYXRpb24gbG9hZGluZyBza2lwcGVkIGR1ZSB0byBpbnZhbGlkIGNsYXNzIGlkXG4iKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgU3RyaW5nOCBuYW1lOworICAgIHN0cmVhbS0+bG9hZFN0cmluZygmbmFtZSk7CisKKyAgICBUeXBlICp0eXBlID0gVHlwZTo6Y3JlYXRlRnJvbVN0cmVhbShyc2MsIHN0cmVhbSk7CisgICAgaWYoIXR5cGUpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHR5cGUtPmNvbXB1dGUoKTsKKworICAgIC8vIE51bWJlciBvZiBieXRlcyB3ZSB3cm90ZSBvdXQgZm9yIHRoaXMgYWxsb2NhdGlvbgorICAgIHVpbnQzMl90IGRhdGFTaXplID0gc3RyZWFtLT5sb2FkVTMyKCk7CisgICAgaWYoZGF0YVNpemUgIT0gdHlwZS0+Z2V0U2l6ZUJ5dGVzKCkpIHsKKyAgICAgICAgTE9HRSgiZmFpbGVkIHRvIHJlYWQgYWxsb2NhdGlvbiBiZWNhdXNlIG51bWJ5dGVzIHdyaXR0ZW4gaXMgbm90IHRoZSBzYW1lIGxvYWRlZCB0eXBlIHdhbnRzXG4iKTsKKyAgICAgICAgZGVsZXRlIHR5cGU7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIEFsbG9jYXRpb24gKmFsbG9jID0gbmV3IEFsbG9jYXRpb24ocnNjLCB0eXBlKTsKKyAgICBhbGxvYy0+c2V0TmFtZShuYW1lLnN0cmluZygpLCBuYW1lLnNpemUoKSk7CisKKyAgICAvLyBSZWFkIGluIGFsbCBvZiBvdXIgYWxsb2NhdGlvbiBkYXRhCisgICAgc3RyZWFtLT5sb2FkQnl0ZUFycmF5KGFsbG9jLT5nZXRQdHIoKSwgZGF0YVNpemUpOworCisgICAgcmV0dXJuIGFsbG9jOworfQorCiB2b2lkIEFsbG9jYXRpb246OnNlbmREaXJ0eSgpIGNvbnN0CiB7CiAgICAgZm9yIChzaXplX3QgY3Q9MDsgY3QgPCBtVG9EaXJ0eUxpc3Quc2l6ZSgpOyBjdCsrKSB7CkBAIC00OTUsNyArNTU5LDcgQEAKICAgICBpZiAoc3JjR0xUeXBlID09IEdMX1VOU0lHTkVEX0JZVEUgJiYKICAgICAgICAgc3JjR0xGbXQgPT0gR0xfUkdCICYmCiAgICAgICAgIGRzdEdMVHlwZSA9PSBHTF9VTlNJR05FRF9TSE9SVF81XzZfNSAmJgotICAgICAgICBkc3RHTFR5cGUgPT0gR0xfUkdCKSB7CisgICAgICAgIGRzdEdMRm10ID09IEdMX1JHQikgewogCiAgICAgICAgIHJldHVybiBlbGVtZW50Q29udmVydGVyXzg4OF90b181NjU7CiAgICAgfQpAQCAtNTAzLDE1ICs1NjcsMjEgQEAKICAgICBpZiAoc3JjR0xUeXBlID09IEdMX1VOU0lHTkVEX0JZVEUgJiYKICAgICAgICAgc3JjR0xGbXQgPT0gR0xfUkdCQSAmJgogICAgICAgICBkc3RHTFR5cGUgPT0gR0xfVU5TSUdORURfU0hPUlRfNV82XzUgJiYKLSAgICAgICAgZHN0R0xUeXBlID09IEdMX1JHQikgeworICAgICAgICBkc3RHTEZtdCA9PSBHTF9SR0IpIHsKIAogICAgICAgICByZXR1cm4gZWxlbWVudENvbnZlcnRlcl84ODg4X3RvXzU2NTsKICAgICB9CiAKICAgICBMT0dFKCJwaWNrQ29udmVydGVyLCB1bnN1cG9ydGVkIGNvbWJvLCBzcmMgJXAsICBkc3QgJXAiLCBzcmMsIGRzdCk7CisgICAgTE9HRSgicGlja0NvbnZlcnRlciwgc3JjR0xUeXBlID0gJXgsICBzcmNHTEZtdCA9ICV4Iiwgc3JjR0xUeXBlLCBzcmNHTEZtdCk7CisgICAgTE9HRSgicGlja0NvbnZlcnRlciwgZHN0R0xUeXBlID0gJXgsICBkc3RHTEZtdCA9ICV4IiwgZHN0R0xUeXBlLCBkc3RHTEZtdCk7CisgICAgc3JjLT5kdW1wTE9HVigiU1JDICIpOworICAgIGRzdC0+ZHVtcExPR1YoIkRTVCAiKTsKICAgICByZXR1cm4gMDsKIH0KIAorI2lmbmRlZiBBTkRST0lEX1JTX0JVSUxEX0ZPUl9IT1NUCisKIFJzQWxsb2NhdGlvbiByc2lfQWxsb2NhdGlvbkNyZWF0ZUJpdG1hcFJlZihDb250ZXh0ICpyc2MsIFJzVHlwZSB2dHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpibXAsIHZvaWQgKmNhbGxiYWNrRGF0YSwgUnNCaXRtYXBDYWxsYmFja190IGNhbGxiYWNrKQogewpAQCAtNjEzLDYgKzY4Myw3IEBACiAgICAgYS0+cmVhZChkYXRhKTsKIH0KIAorI2VuZGlmIC8vQU5EUk9JRF9SU19CVUlMRF9GT1JfSE9TVAogCiB9CiB9CmRpZmYgLS1naXQgYS9saWJzL3JzL3JzQWxsb2NhdGlvbi5oIGIvbGlicy9ycy9yc0FsbG9jYXRpb24uaAppbmRleCA1MTZmOGI3Li44MjczMTY1IDEwMDY0NAotLS0gYS9saWJzL3JzL3JzQWxsb2NhdGlvbi5oCisrKyBiL2xpYnMvcnMvcnNBbGxvY2F0aW9uLmgKQEAgLTcyLDkgKzcyLDE1IEBACiAgICAgdm9pZCByZW1vdmVQcm9ncmFtVG9EaXJ0eShjb25zdCBQcm9ncmFtICopOwogCiAgICAgdmlydHVhbCB2b2lkIGR1bXBMT0dWKGNvbnN0IGNoYXIgKnByZWZpeCkgY29uc3Q7CisgICAgdmlydHVhbCB2b2lkIHNlcmlhbGl6ZShPU3RyZWFtICpzdHJlYW0pIGNvbnN0OworICAgIHZpcnR1YWwgUnNBM0RDbGFzc0lEIGdldENsYXNzSWQoKSBjb25zdCB7IHJldHVybiBSU19BM0RfQ0xBU1NfSURfQUxMT0NBVElPTjsgfQorICAgIHN0YXRpYyBBbGxvY2F0aW9uICpjcmVhdGVGcm9tU3RyZWFtKENvbnRleHQgKnJzYywgSVN0cmVhbSAqc3RyZWFtKTsKIAogICAgIHZpcnR1YWwgdm9pZCB1cGxvYWRDaGVjayhjb25zdCBDb250ZXh0ICpyc2MpOwogCisgICAgYm9vbCBnZXRJc1RleHR1cmUoKSBjb25zdCB7cmV0dXJuIG1Jc1RleHR1cmU7fQorICAgIGJvb2wgZ2V0SXNCdWZmZXJPYmplY3QoKSBjb25zdCB7cmV0dXJuIG1Jc1ZlcnRleEJ1ZmZlcjt9CisKIHByb3RlY3RlZDoKICAgICB2b2lkIHNlbmREaXJ0eSgpIGNvbnN0OwogCmRpZmYgLS1naXQgYS9saWJzL3JzL3JzQW5pbWF0aW9uLmNwcCBiL2xpYnMvcnMvcnNBbmltYXRpb24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyMDA3MTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL3JzQW5pbWF0aW9uLmNwcApAQCAtMCwwICsxLDE0OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9SU19CVUlMRF9GT1JfSE9TVAorI2luY2x1ZGUgInJzQ29udGV4dC5oIgorI2Vsc2UKKyNpbmNsdWRlICJyc0NvbnRleHRIb3N0U3R1Yi5oIgorI2VuZGlmIC8vQU5EUk9JRF9SU19CVUlMRF9GT1JfSE9TVAorCisjaW5jbHVkZSAicnNBbmltYXRpb24uaCIKKworCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpyZW5kZXJzY3JpcHQ7CisKK3ZvaWQgQW5pbWF0aW9uOjpzZXJpYWxpemUoT1N0cmVhbSAqc3RyZWFtKSBjb25zdAoreworICAgIAorfQorCitBbmltYXRpb24gKkFuaW1hdGlvbjo6Y3JlYXRlRnJvbVN0cmVhbShDb250ZXh0ICpyc2MsIElTdHJlYW0gKnN0cmVhbSkKK3sKKyAgICByZXR1cm4gTlVMTDsKK30KKworLyoKK0FuaW1hdGlvbjo6QW5pbWF0aW9uKENvbnRleHQgKnJzYykgOiBPYmplY3RCYXNlKHJzYykKK3sKKyAgICBtQWxsb2NGaWxlID0gX19GSUxFX187CisgICAgbUFsbG9jTGluZSA9IF9fTElORV9fOworCisgICAgbVZhbHVlc0lucHV0ID0gTlVMTDsKKyAgICBtVmFsdWVzT3V0cHV0ID0gTlVMTDsKKyAgICBtVmFsdWVDb3VudCA9IDA7CisgICAgbUludGVycG9sYXRpb24gPSBSU19BTklNQVRJT05fSU5URVJQT0xBVElPTl9TVEVQOworICAgIG1FZGdlUHJlID0gUlNfQU5JTUFUSU9OX0VER0VfVU5ERUZJTkVEOworICAgIG1FZGdlUG9zdCA9IFJTX0FOSU1BVElPTl9FREdFX1VOREVGSU5FRDsKKyAgICBtSW5wdXRNaW4gPSAwOworICAgIG1JbnB1dE1heCA9IDA7Cit9CisKK0FuaW1hdGlvbiAqIEFuaW1hdGlvbjo6Y3JlYXRlKENvbnRleHQgKnJzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0ICppblZhbHVlcywgY29uc3QgZmxvYXQgKm91dFZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHZhbHVlQ291bnQsIFJzQW5pbWF0aW9uSW50ZXJwb2xhdGlvbiBpbnRlcnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSc0FuaW1hdGlvbkVkZ2UgcHJlLCBSc0FuaW1hdGlvbkVkZ2UgcG9zdCkKK3sKKyAgICBpZiAodmFsdWVDb3VudCA8IDIpIHsKKyAgICAgICAgcnNjLT5zZXRFcnJvcihSU19FUlJPUl9CQURfVkFMVUUsICJBbmltYXRpb25zIHJlcXVpcmUgbW9yZSB0aGFuIDIgdmFsdWVzLiIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgQW5pbWF0aW9uICphID0gbmV3IEFuaW1hdGlvbihyc2MpOworICAgIGlmICghYSkgeworICAgICAgICByc2MtPnNldEVycm9yKFJTX0VSUk9SX09VVF9PRl9NRU1PUlkpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBmbG9hdCAqdmluID0gKGZsb2F0ICopbWFsbG9jKHZhbHVlQ291bnQgKiBzaXplb2YoZmxvYXQpKTsKKyAgICBmbG9hdCAqdm91dCA9IChmbG9hdCAqKW1hbGxvYyh2YWx1ZUNvdW50ICogc2l6ZW9mKGZsb2F0KSk7CisgICAgYS0+bVZhbHVlc0lucHV0ID0gdmluOworICAgIGEtPm1WYWx1ZXNPdXRwdXQgPSB2b3V0OworICAgIGlmIChhLT5tVmFsdWVzSW5wdXQgPT0gTlVMTCB8fCBhLT5tVmFsdWVzT3V0cHV0ID09IE5VTEwpIHsKKyAgICAgICAgZGVsZXRlIGE7CisgICAgICAgIHJzYy0+c2V0RXJyb3IoUlNfRVJST1JfT1VUX09GX01FTU9SWSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGEtPm1FZGdlUHJlID0gcHJlOworICAgIGEtPm1FZGdlUG9zdCA9IHBvc3Q7CisgICAgYS0+bUludGVycG9sYXRpb24gPSBpbnRlcnA7CisgICAgYS0+bVZhbHVlQ291bnQgPSB2YWx1ZUNvdW50OworCisgICAgbWVtY3B5KHZpbiwgaW5WYWx1ZXMsIHZhbHVlQ291bnQgKiBzaXplb2YoZmxvYXQpKTsKKyAgICBtZW1jcHkodm91dCwgb3V0VmFsdWVzLCB2YWx1ZUNvdW50ICogc2l6ZW9mKGZsb2F0KSk7CisgICAgYS0+bUlucHV0TWluID0gaW5WYWx1ZXNbMF07CisgICAgYS0+bUlucHV0TWF4ID0gaW5WYWx1ZXNbMF07CisKKyAgICBib29sIG5lZWRTb3J0ID0gZmFsc2U7CisgICAgZm9yICh1aW50MzJfdCBjdD0xOyBjdCA8IHZhbHVlQ291bnQ7IGN0KyspIHsKKyAgICAgICAgaWYgKGEtPm1JbnB1dE1pbiA+IHZpbltjdF0pIHsKKyAgICAgICAgICAgIG5lZWRTb3J0ID0gdHJ1ZTsKKyAgICAgICAgICAgIGEtPm1JbnB1dE1pbiA9IHZpbltjdF07CisgICAgICAgIH0KKyAgICAgICAgaWYgKGEtPm1JbnB1dE1heCA8IHZpbltjdF0pIHsKKyAgICAgICAgICAgIGEtPm1JbnB1dE1heCA9IHZpbltjdF07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBuZWVkU29ydCA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB3aGlsZSAoMSkgeworICAgICAgICBib29sIGNoYW5nZWQgPSBmYWxzZTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBjdD0xOyBjdCA8IHZhbHVlQ291bnQ7IGN0KyspIHsKKyAgICAgICAgICAgIGlmICh2aW5bY3QtMV0gPiB2aW5bY3RdKSB7CisgICAgICAgICAgICAgICAgZmxvYXQgdCA9IHZpbltjdC0xXTsKKyAgICAgICAgICAgICAgICB2aW5bY3QtMV0gPSB2aW5bY3RdOworICAgICAgICAgICAgICAgIHZpbltjdF0gPSB0OworICAgICAgICAgICAgICAgIHQgPSB2b3V0W2N0LTFdOworICAgICAgICAgICAgICAgIHZvdXRbY3QtMV0gPSB2b3V0W2N0XTsKKyAgICAgICAgICAgICAgICB2b3V0W2N0XSA9IHQ7CisgICAgICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFjaGFuZ2VkKSBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gYTsKK30KKyovCisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSByZW5kZXJzY3JpcHQgeworCitSc0FuaW1hdGlvbiByc2lfQW5pbWF0aW9uQ3JlYXRlKENvbnRleHQgKnJzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKmluVmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCAqb3V0VmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB2YWx1ZUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSc0FuaW1hdGlvbkludGVycG9sYXRpb24gaW50ZXJwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSc0FuaW1hdGlvbkVkZ2UgcHJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSc0FuaW1hdGlvbkVkZ2UgcG9zdCkKK3sKKyAgICAvL0xPR0UoInJzaV9FbGVtZW50Q3JlYXRlICVpICVpICVpICVpIiwgZHQsIGRrLCBub3JtLCB2ZWNTaXplKTsKKyAgICBBbmltYXRpb24gKmEgPSBOVUxMOy8vQW5pbWF0aW9uOjpjcmVhdGUocnNjLCBpblZhbHVlcywgb3V0VmFsdWVzLCB2YWx1ZUNvdW50LCBpbnRlcnAsIHByZSwgcG9zdCk7CisgICAgaWYgKGEgIT0gTlVMTCkgeworICAgICAgICBhLT5pbmNVc2VyUmVmKCk7CisgICAgfQorICAgIHJldHVybiAoUnNBbmltYXRpb24pYTsKK30KKworCit9Cit9CisKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNBbmltYXRpb24uaCBiL2xpYnMvcnMvcnNBbmltYXRpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDAzMTRlCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9yc0FuaW1hdGlvbi5oCkBAIC0wLDAgKzEsNzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfUlNfQU5JTUFUSU9OX0gKKyNkZWZpbmUgQU5EUk9JRF9SU19BTklNQVRJT05fSAorCisjaW5jbHVkZSAicnNVdGlscy5oIgorI2luY2x1ZGUgInJzT2JqZWN0QmFzZS5oIgorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSByZW5kZXJzY3JpcHQgeworCisKK2NsYXNzIEFuaW1hdGlvbiA6IHB1YmxpYyBPYmplY3RCYXNlCit7CitwdWJsaWM6CisgICAgfkFuaW1hdGlvbigpOworCisgICAgc3RhdGljIEFuaW1hdGlvbiAqIGNyZWF0ZShDb250ZXh0ICpyc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCAqaW5WYWx1ZXMsIGNvbnN0IGZsb2F0ICpvdXRWYWx1ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB2YWx1ZUNvdW50LCBSc0FuaW1hdGlvbkludGVycG9sYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSc0FuaW1hdGlvbkVkZ2UgcHJlLCBSc0FuaW1hdGlvbkVkZ2UgcG9zdCk7CisKKyAgICBmbG9hdCBldmFsKGZsb2F0KSBjb25zdDsKKworICAgIHZpcnR1YWwgdm9pZCBzZXJpYWxpemUoT1N0cmVhbSAqc3RyZWFtKSBjb25zdDsKKyAgICB2aXJ0dWFsIFJzQTNEQ2xhc3NJRCBnZXRDbGFzc0lkKCkgY29uc3QgeyByZXR1cm4gUlNfQTNEX0NMQVNTX0lEX0FOSU1BVElPTjsgfQorICAgIHN0YXRpYyBBbmltYXRpb24gKmNyZWF0ZUZyb21TdHJlYW0oQ29udGV4dCAqcnNjLCBJU3RyZWFtICpzdHJlYW0pOworCitwcm90ZWN0ZWQ6CisgICAgQW5pbWF0aW9uKENvbnRleHQgKnJzYyk7CisKKworCisgICAgZmxvYXQgZXZhbEluUmFuZ2UoZmxvYXQpIGNvbnN0OworCisKKworICAgIGNvbnN0IGZsb2F0ICptVmFsdWVzSW5wdXQ7CisgICAgY29uc3QgZmxvYXQgKm1WYWx1ZXNPdXRwdXQ7CisgICAgdWludDMyX3QgbVZhbHVlQ291bnQ7CisgICAgUnNBbmltYXRpb25JbnRlcnBvbGF0aW9uIG1JbnRlcnBvbGF0aW9uOworICAgIFJzQW5pbWF0aW9uRWRnZSBtRWRnZVByZTsKKyAgICBSc0FuaW1hdGlvbkVkZ2UgbUVkZ2VQb3N0OworCisgICAgLy8gZGVyaXZlZAorICAgIGZsb2F0IG1JbnB1dE1pbjsKKyAgICBmbG9hdCBtSW5wdXRNYXg7Cit9OworCisKKworCit9Cit9CisjZW5kaWYgLy9BTkRST0lEX1NUUlVDVFVSRURfRUxFTUVOVF9ICisKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNDb21wb25lbnQuY3BwIGIvbGlicy9ycy9yc0NvbXBvbmVudC5jcHAKaW5kZXggMTVhNTZmNy4uOGU1MDlhZCAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc0NvbXBvbmVudC5jcHAKKysrIGIvbGlicy9ycy9yc0NvbXBvbmVudC5jcHAKQEAgLTE2LDcgKzE2LDExIEBACiAKICNpbmNsdWRlICJyc0NvbXBvbmVudC5oIgogCisjaWZuZGVmIEFORFJPSURfUlNfQlVJTERfRk9SX0hPU1QKICNpbmNsdWRlIDxHTEVTL2dsLmg+CisjZWxzZQorI2luY2x1ZGUgPE9wZW5HTC9nbC5oPgorI2VuZGlmCiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OnJlbmRlcnNjcmlwdDsKQEAgLTE0OCw2ICsxNTIsMTAgQEAKICAgICBjYXNlIFJTX1RZUEVfVU5TSUdORURfNjQ6CiAgICAgICAgIG1UeXBlQml0cyA9IDY0OwogICAgICAgICBicmVhazsKKworICAgIGNhc2UgUlNfVFlQRV9CT09MRUFOOgorICAgICAgICBtVHlwZUJpdHMgPSA4OworICAgICAgICBicmVhazsKICAgICB9CiAKICAgICBtQml0cyA9IG1UeXBlQml0cyAqIG1WZWN0b3JTaXplOwpAQCAtMTg4LDgyICsxOTYsNiBAQAogICAgIHJldHVybiAwOwogfQogCi1zdGF0aWMgY29uc3QgY2hhciAqIGdDVHlwZVN0cmluZ3NbXSA9IHsKLSAgICAwLAotICAgIDAsLy8iRjE2IiwKLSAgICAiZmxvYXQiLAotICAgICJkb3VibGUiLAotICAgICJjaGFyIiwKLSAgICAic2hvcnQiLAotICAgICJpbnQiLAotICAgIDAsLy8iUzY0IiwKLSAgICAiY2hhciIsLy9VOCIsCi0gICAgInNob3J0IiwvL1UxNiIsCi0gICAgImludCIsLy9VMzIiLAotICAgIDAsLy8iVTY0IiwKLSAgICAwLC8vIlVQXzU2NSIsCi0gICAgMCwvLyJVUF81NTUxIiwKLSAgICAwLC8vIlVQXzQ0NDQiLAotICAgIDAsLy8iRUxFTUVOVCIsCi0gICAgMCwvLyJUWVBFIiwKLSAgICAwLC8vIkFMTE9DQVRJT04iLAotICAgIDAsLy8iU0FNUExFUiIsCi0gICAgMCwvLyJTQ1JJUFQiLAotICAgIDAsLy8iTUVTSCIsCi0gICAgMCwvLyJQUk9HUkFNX0ZSQUdNRU5UIiwKLSAgICAwLC8vIlBST0dSQU1fVkVSVEVYIiwKLSAgICAwLC8vIlBST0dSQU1fUkFTVEVSIiwKLSAgICAwLC8vIlBST0dSQU1fU1RPUkUiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBnQ1ZlY1R5cGVTdHJpbmdzW10gPSB7Ci0gICAgMCwKLSAgICAwLC8vIkYxNiIsCi0gICAgInZlY0YzMiIsCi0gICAgInZlY0Y2NCIsCi0gICAgInZlY0k4IiwKLSAgICAidmVjSTE2IiwKLSAgICAidmVjSTMyIiwKLSAgICAwLC8vIlM2NCIsCi0gICAgInZlY1U4IiwvL1U4IiwKLSAgICAidmVjVTE2IiwvL1UxNiIsCi0gICAgInZlY1UzMiIsLy9VMzIiLAotICAgIDAsLy8iVTY0IiwKLSAgICAwLC8vIlVQXzU2NSIsCi0gICAgMCwvLyJVUF81NTUxIiwKLSAgICAwLC8vIlVQXzQ0NDQiLAotICAgIDAsLy8iRUxFTUVOVCIsCi0gICAgMCwvLyJUWVBFIiwKLSAgICAwLC8vIkFMTE9DQVRJT04iLAotICAgIDAsLy8iU0FNUExFUiIsCi0gICAgMCwvLyJTQ1JJUFQiLAotICAgIDAsLy8iTUVTSCIsCi0gICAgMCwvLyJQUk9HUkFNX0ZSQUdNRU5UIiwKLSAgICAwLC8vIlBST0dSQU1fVkVSVEVYIiwKLSAgICAwLC8vIlBST0dSQU1fUkFTVEVSIiwKLSAgICAwLC8vIlBST0dSQU1fU1RPUkUiLAotfTsKLQotU3RyaW5nOCBDb21wb25lbnQ6OmdldENUeXBlKCkgY29uc3QKLXsKLSAgICBjaGFyIGJ1Zls2NF07Ci0gICAgaWYgKG1WZWN0b3JTaXplID09IDEpIHsKLSAgICAgICAgcmV0dXJuIFN0cmluZzgoZ0NUeXBlU3RyaW5nc1ttVHlwZV0pOwotICAgIH0KLQotICAgIC8vIFl1Y2ssIGFjYyBXQVIKLSAgICAvLyBBcHBlYXJzIHRvIGhhdmUgcHJvYmxlbXMgcGFja2luZyBjaGFycwotICAgIGlmIChtVmVjdG9yU2l6ZSA9PSA0ICYmIG1UeXBlID09IFJTX1RZUEVfVU5TSUdORURfOCkgewotICAgICAgICByZXR1cm4gU3RyaW5nOCgiaW50Iik7Ci0gICAgfQotCi0KLSAgICBTdHJpbmc4IHMoZ0NWZWNUeXBlU3RyaW5nc1ttVHlwZV0pOwotICAgIHNwcmludGYoYnVmLCAiXyVpX3QiLCBtVmVjdG9yU2l6ZSk7Ci0gICAgcy5hcHBlbmQoYnVmKTsKLSAgICByZXR1cm4gczsKLX0KLQogU3RyaW5nOCBDb21wb25lbnQ6OmdldEdMU0xUeXBlKCkgY29uc3QKIHsKICAgICBpZiAobVR5cGUgPT0gUlNfVFlQRV9TSUdORURfMzIpIHsKQEAgLTI5OCw2ICsyMzAsNyBAQAogICAgICJVMTYiLAogICAgICJVMzIiLAogICAgICJVNjQiLAorICAgICJCT09MRUFOIiwKICAgICAiVVBfNTY1IiwKICAgICAiVVBfNTU1MSIsCiAgICAgIlVQXzQ0NDQiLApAQCAtMzM0LDQgKzI2NywyNSBAQAogICAgICAgICAgcHJlZml4LCBnVHlwZVN0cmluZ3NbbVR5cGVdLCBnS2luZFN0cmluZ3NbbUtpbmRdLCBtVmVjdG9yU2l6ZSwgbUJpdHMpOwogfQogCit2b2lkIENvbXBvbmVudDo6c2VyaWFsaXplKE9TdHJlYW0gKnN0cmVhbSkgY29uc3QKK3sKKyAgICBzdHJlYW0tPmFkZFU4KCh1aW50OF90KW1UeXBlKTsKKyAgICBzdHJlYW0tPmFkZFU4KCh1aW50OF90KW1LaW5kKTsKKyAgICBzdHJlYW0tPmFkZFU4KCh1aW50OF90KShtTm9ybWFsaXplZCA/IDEgOiAwKSk7CisgICAgc3RyZWFtLT5hZGRVMzIobVZlY3RvclNpemUpOworfQorCit2b2lkIENvbXBvbmVudDo6bG9hZEZyb21TdHJlYW0oSVN0cmVhbSAqc3RyZWFtKQoreworICAgIG1UeXBlID0gKFJzRGF0YVR5cGUpc3RyZWFtLT5sb2FkVTgoKTsKKyAgICBtS2luZCA9IChSc0RhdGFLaW5kKXN0cmVhbS0+bG9hZFU4KCk7CisgICAgdWludDhfdCB0ZW1wID0gc3RyZWFtLT5sb2FkVTgoKTsKKyAgICBtTm9ybWFsaXplZCA9IHRlbXAgIT0gMDsKKyAgICBtVmVjdG9yU2l6ZSA9IHN0cmVhbS0+bG9hZFUzMigpOworCisgICAgc2V0KG1UeXBlLCBtS2luZCwgbU5vcm1hbGl6ZWQsIG1WZWN0b3JTaXplKTsKK30KKworCisKIApkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc0NvbXBvbmVudC5oIGIvbGlicy9ycy9yc0NvbXBvbmVudC5oCmluZGV4IDcxZGUzMjQuLjE1ZmQ1ZGQgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNDb21wb25lbnQuaAorKysgYi9saWJzL3JzL3JzQ29tcG9uZW50LmgKQEAgLTM1LDcgKzM1LDYgQEAKIAogICAgIHVpbnQzMl90IGdldEdMVHlwZSgpIGNvbnN0OwogICAgIHVpbnQzMl90IGdldEdMRm9ybWF0KCkgY29uc3Q7Ci0gICAgU3RyaW5nOCBnZXRDVHlwZSgpIGNvbnN0OwogICAgIFN0cmluZzggZ2V0R0xTTFR5cGUoKSBjb25zdDsKICAgICB2b2lkIGR1bXBMT0dWKGNvbnN0IGNoYXIgKnByZWZpeCkgY29uc3Q7CiAKQEAgLTQ4LDYgKzQ3LDEwIEBACiAgICAgYm9vbCBnZXRJc1NpZ25lZCgpIGNvbnN0IHtyZXR1cm4gbUlzU2lnbmVkO30KICAgICB1aW50MzJfdCBnZXRCaXRzKCkgY29uc3Qge3JldHVybiBtQml0czt9CiAKKyAgICAvLyBIZWxwZXJzIGZvciByZWFkaW5nIC8gd3JpdGluZyB0aGlzIGNsYXNzIG91dAorICAgIHZvaWQgc2VyaWFsaXplKE9TdHJlYW0gKnN0cmVhbSkgY29uc3Q7CisgICAgdm9pZCBsb2FkRnJvbVN0cmVhbShJU3RyZWFtICpzdHJlYW0pOworCiBwcm90ZWN0ZWQ6CiAgICAgUnNEYXRhVHlwZSBtVHlwZTsKICAgICBSc0RhdGFLaW5kIG1LaW5kOwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc0NvbnRleHQuY3BwIGIvbGlicy9ycy9yc0NvbnRleHQuY3BwCmluZGV4IGQ4YTlhOTkuLmQ4YzM4NjEgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNDb250ZXh0LmNwcAorKysgYi9saWJzL3JzL3JzQ29udGV4dC5jcHAKQEAgLTEyNywxOSArMTI3LDIxIEBACiB9CiAKIAotdWludDMyX3QgQ29udGV4dDo6cnVuU2NyaXB0KFNjcmlwdCAqcywgdWludDMyX3QgbGF1bmNoSUQpCit1aW50MzJfdCBDb250ZXh0OjpydW5TY3JpcHQoU2NyaXB0ICpzKQogewogICAgIE9iamVjdEJhc2VSZWY8UHJvZ3JhbUZyYWdtZW50PiBmcmFnKG1GcmFnbWVudCk7CiAgICAgT2JqZWN0QmFzZVJlZjxQcm9ncmFtVmVydGV4PiB2dHgobVZlcnRleCk7Ci0gICAgT2JqZWN0QmFzZVJlZjxQcm9ncmFtRnJhZ21lbnRTdG9yZT4gc3RvcmUobUZyYWdtZW50U3RvcmUpOworICAgIE9iamVjdEJhc2VSZWY8UHJvZ3JhbVN0b3JlPiBzdG9yZShtRnJhZ21lbnRTdG9yZSk7CiAgICAgT2JqZWN0QmFzZVJlZjxQcm9ncmFtUmFzdGVyPiByYXN0ZXIobVJhc3Rlcik7CisgICAgT2JqZWN0QmFzZVJlZjxGb250PiBmb250KG1Gb250KTsKIAotICAgIHVpbnQzMl90IHJldCA9IHMtPnJ1bih0aGlzLCBsYXVuY2hJRCk7CisgICAgdWludDMyX3QgcmV0ID0gcy0+cnVuKHRoaXMpOwogCiAgICAgbUZyYWdtZW50LnNldChmcmFnKTsKICAgICBtVmVydGV4LnNldCh2dHgpOwogICAgIG1GcmFnbWVudFN0b3JlLnNldChzdG9yZSk7CiAgICAgbVJhc3Rlci5zZXQocmFzdGVyKTsKKyAgICBtRm9udC5zZXQoZm9udCk7CiAgICAgcmV0dXJuIHJldDsKIH0KIApAQCAtMTUzLDI5ICsxNTUsMTEgQEAKIAogdWludDMyX3QgQ29udGV4dDo6cnVuUm9vdFNjcmlwdCgpCiB7Ci0gICAgdGltZXJTZXQoUlNfVElNRVJfQ0xFQVJfU1dBUCk7Ci0gICAgcnNBc3NlcnQobVJvb3RTY3JpcHQtPm1FbnZpcm9tZW50Lm1Jc1Jvb3QpOwotCi0gICAgZWdsUXVlcnlTdXJmYWNlKG1FR0wubURpc3BsYXksIG1FR0wubVN1cmZhY2UsIEVHTF9XSURUSCwgJm1FR0wubVdpZHRoKTsKLSAgICBlZ2xRdWVyeVN1cmZhY2UobUVHTC5tRGlzcGxheSwgbUVHTC5tU3VyZmFjZSwgRUdMX0hFSUdIVCwgJm1FR0wubUhlaWdodCk7Ci0gICAgZ2xWaWV3cG9ydCgwLCAwLCBtRUdMLm1XaWR0aCwgbUVHTC5tSGVpZ2h0KTsKLSAgICBnbENvbG9yTWFzayhHTF9UUlVFLCBHTF9UUlVFLCBHTF9UUlVFLCBHTF9UUlVFKTsKLQotICAgIGdsQ2xlYXJDb2xvcihtUm9vdFNjcmlwdC0+bUVudmlyb21lbnQubUNsZWFyQ29sb3JbMF0sCi0gICAgICAgICAgICAgICAgIG1Sb290U2NyaXB0LT5tRW52aXJvbWVudC5tQ2xlYXJDb2xvclsxXSwKLSAgICAgICAgICAgICAgICAgbVJvb3RTY3JpcHQtPm1FbnZpcm9tZW50Lm1DbGVhckNvbG9yWzJdLAotICAgICAgICAgICAgICAgICBtUm9vdFNjcmlwdC0+bUVudmlyb21lbnQubUNsZWFyQ29sb3JbM10pOwotICAgIGlmIChtVXNlRGVwdGgpIHsKLSAgICAgICAgZ2xEZXB0aE1hc2soR0xfVFJVRSk7Ci0gICAgICAgIGdsQ2xlYXJEZXB0aGYobVJvb3RTY3JpcHQtPm1FbnZpcm9tZW50Lm1DbGVhckRlcHRoKTsKLSAgICAgICAgZ2xDbGVhcihHTF9DT0xPUl9CVUZGRVJfQklUIHwgR0xfREVQVEhfQlVGRkVSX0JJVCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZ2xDbGVhcihHTF9DT0xPUl9CVUZGRVJfQklUKTsKLSAgICB9CisgICAgZ2xWaWV3cG9ydCgwLCAwLCBtV2lkdGgsIG1IZWlnaHQpOwogCiAgICAgdGltZXJTZXQoUlNfVElNRVJfU0NSSVBUKTsKICAgICBtU3RhdGVGcmFnbWVudFN0b3JlLm1MYXN0LmNsZWFyKCk7Ci0gICAgdWludDMyX3QgcmV0ID0gcnVuU2NyaXB0KG1Sb290U2NyaXB0LmdldCgpLCAwKTsKKyAgICB1aW50MzJfdCByZXQgPSBydW5TY3JpcHQobVJvb3RTY3JpcHQuZ2V0KCkpOwogCiAgICAgY2hlY2tFcnJvcigicnVuUm9vdFNjcmlwdCIpOwogICAgIGlmIChtRXJyb3IgIT0gUlNfRVJST1JfTk9ORSkgewpAQCAtMzAwLDE0ICsyODQsMTYgQEAKICAgICAgfQogCiAgICAgIGlmIChyc2MtPm1Jc0dyYXBoaWNzQ29udGV4dCkgewotICAgICAgICAgcnNjLT5tU3RhdGVSYXN0ZXIuaW5pdChyc2MsIHJzYy0+bUVHTC5tV2lkdGgsIHJzYy0+bUVHTC5tSGVpZ2h0KTsKKyAgICAgICAgIHJzYy0+bVN0YXRlUmFzdGVyLmluaXQocnNjKTsKICAgICAgICAgIHJzYy0+c2V0UmFzdGVyKE5VTEwpOwotICAgICAgICAgcnNjLT5tU3RhdGVWZXJ0ZXguaW5pdChyc2MsIHJzYy0+bUVHTC5tV2lkdGgsIHJzYy0+bUVHTC5tSGVpZ2h0KTsKKyAgICAgICAgIHJzYy0+bVN0YXRlVmVydGV4LmluaXQocnNjKTsKICAgICAgICAgIHJzYy0+c2V0VmVydGV4KE5VTEwpOwotICAgICAgICAgcnNjLT5tU3RhdGVGcmFnbWVudC5pbml0KHJzYywgcnNjLT5tRUdMLm1XaWR0aCwgcnNjLT5tRUdMLm1IZWlnaHQpOworICAgICAgICAgcnNjLT5tU3RhdGVGcmFnbWVudC5pbml0KHJzYyk7CiAgICAgICAgICByc2MtPnNldEZyYWdtZW50KE5VTEwpOwotICAgICAgICAgcnNjLT5tU3RhdGVGcmFnbWVudFN0b3JlLmluaXQocnNjLCByc2MtPm1FR0wubVdpZHRoLCByc2MtPm1FR0wubUhlaWdodCk7CisgICAgICAgICByc2MtPm1TdGF0ZUZyYWdtZW50U3RvcmUuaW5pdChyc2MpOwogICAgICAgICAgcnNjLT5zZXRGcmFnbWVudFN0b3JlKE5VTEwpOworICAgICAgICAgcnNjLT5tU3RhdGVGb250LmluaXQocnNjKTsKKyAgICAgICAgIHJzYy0+c2V0Rm9udChOVUxMKTsKICAgICAgICAgIHJzYy0+bVN0YXRlVmVydGV4QXJyYXkuaW5pdChyc2MpOwogICAgICB9CiAKQEAgLTM0NiwxMSArMzMyLDEzIEBACiAgICAgICAgICByc2MtPm1GcmFnbWVudC5jbGVhcigpOwogICAgICAgICAgcnNjLT5tVmVydGV4LmNsZWFyKCk7CiAgICAgICAgICByc2MtPm1GcmFnbWVudFN0b3JlLmNsZWFyKCk7CisgICAgICAgICByc2MtPm1Gb250LmNsZWFyKCk7CiAgICAgICAgICByc2MtPm1Sb290U2NyaXB0LmNsZWFyKCk7CiAgICAgICAgICByc2MtPm1TdGF0ZVJhc3Rlci5kZWluaXQocnNjKTsKICAgICAgICAgIHJzYy0+bVN0YXRlVmVydGV4LmRlaW5pdChyc2MpOwogICAgICAgICAgcnNjLT5tU3RhdGVGcmFnbWVudC5kZWluaXQocnNjKTsKICAgICAgICAgIHJzYy0+bVN0YXRlRnJhZ21lbnRTdG9yZS5kZWluaXQocnNjKTsKKyAgICAgICAgIHJzYy0+bVN0YXRlRm9udC5kZWluaXQocnNjKTsKICAgICAgfQogICAgICBPYmplY3RCYXNlOjp6ZXJvQWxsVXNlclJlZihyc2MpOwogCkBAIC00ODYsMTQgKzQ3NCwxNCBAQAogICAgICAgICBjaGVja0VnbEVycm9yKCJlZ2xEZXN0cm95U3VyZmFjZSIsIHJldCk7CiAKICAgICAgICAgbUVHTC5tU3VyZmFjZSA9IE5VTEw7Ci0gICAgICAgIG1FR0wubVdpZHRoID0gMDsKLSAgICAgICAgbUVHTC5tSGVpZ2h0ID0gMDsKICAgICAgICAgbVdpZHRoID0gMDsKICAgICAgICAgbUhlaWdodCA9IDA7CiAgICAgfQogCiAgICAgbVduZFN1cmZhY2UgPSBzdXI7CiAgICAgaWYgKG1XbmRTdXJmYWNlICE9IE5VTEwpIHsKKyAgICAgICAgbVdpZHRoID0gdzsKKyAgICAgICAgbUhlaWdodCA9IGg7CiAgICAgICAgIGJvb2wgZmlyc3QgPSBmYWxzZTsKICAgICAgICAgaWYgKCFtRUdMLm1Db250ZXh0KSB7CiAgICAgICAgICAgICBmaXJzdCA9IHRydWU7CkBAIC01MTEsMTUgKzQ5OSw3IEBACiAgICAgICAgIHJldCA9IGVnbE1ha2VDdXJyZW50KG1FR0wubURpc3BsYXksIG1FR0wubVN1cmZhY2UsIG1FR0wubVN1cmZhY2UsIG1FR0wubUNvbnRleHQpOwogICAgICAgICBjaGVja0VnbEVycm9yKCJlZ2xNYWtlQ3VycmVudCIsIHJldCk7CiAKLSAgICAgICAgZWdsUXVlcnlTdXJmYWNlKG1FR0wubURpc3BsYXksIG1FR0wubVN1cmZhY2UsIEVHTF9XSURUSCwgJm1FR0wubVdpZHRoKTsKLSAgICAgICAgZWdsUXVlcnlTdXJmYWNlKG1FR0wubURpc3BsYXksIG1FR0wubVN1cmZhY2UsIEVHTF9IRUlHSFQsICZtRUdMLm1IZWlnaHQpOwotICAgICAgICBtV2lkdGggPSB3OwotICAgICAgICBtSGVpZ2h0ID0gaDsKLSAgICAgICAgbVN0YXRlVmVydGV4LnVwZGF0ZVNpemUodGhpcywgdywgaCk7Ci0KLSAgICAgICAgaWYgKChpbnQpbVdpZHRoICE9IG1FR0wubVdpZHRoIHx8IChpbnQpbUhlaWdodCAhPSBtRUdMLm1IZWlnaHQpIHsKLSAgICAgICAgICAgIExPR0UoIkVHTC9TdXJmYWNlIG1pc21hdGNoICBFR0wgKCVpIHggJWkpICBTRiAoJWkgeCAlaSkiLCBtRUdMLm1XaWR0aCwgbUVHTC5tSGVpZ2h0LCBtV2lkdGgsIG1IZWlnaHQpOwotICAgICAgICB9CisgICAgICAgIG1TdGF0ZVZlcnRleC51cGRhdGVTaXplKHRoaXMpOwogCiAgICAgICAgIGlmIChmaXJzdCkgewogICAgICAgICAgICAgbUdMLm1WZXJzaW9uID0gZ2xHZXRTdHJpbmcoR0xfVkVSU0lPTik7CkBAIC01ODMsNyArNTYzLDcgQEAKICAgICBtUm9vdFNjcmlwdC5zZXQocyk7CiB9CiAKLXZvaWQgQ29udGV4dDo6c2V0RnJhZ21lbnRTdG9yZShQcm9ncmFtRnJhZ21lbnRTdG9yZSAqcGZzKQordm9pZCBDb250ZXh0OjpzZXRGcmFnbWVudFN0b3JlKFByb2dyYW1TdG9yZSAqcGZzKQogewogICAgIHJzQXNzZXJ0KG1Jc0dyYXBoaWNzQ29udGV4dCk7CiAgICAgaWYgKHBmcyA9PSBOVUxMKSB7CkBAIC02MjMsNiArNjAzLDE2IEBACiAgICAgfQogfQogCit2b2lkIENvbnRleHQ6OnNldEZvbnQoRm9udCAqZikKK3sKKyAgICByc0Fzc2VydChtSXNHcmFwaGljc0NvbnRleHQpOworICAgIGlmIChmID09IE5VTEwpIHsKKyAgICAgICAgbUZvbnQuc2V0KG1TdGF0ZUZvbnQubURlZmF1bHQpOworICAgIH0gZWxzZSB7CisgICAgICAgIG1Gb250LnNldChmKTsKKyAgICB9Cit9CisKIHZvaWQgQ29udGV4dDo6YXNzaWduTmFtZShPYmplY3RCYXNlICpvYmosIGNvbnN0IGNoYXIgKm5hbWUsIHVpbnQzMl90IGxlbikKIHsKICAgICByc0Fzc2VydCghb2JqLT5nZXROYW1lKCkpOwpAQCAtNjQwLDMyICs2MzAsOSBAQAogICAgIH0KIH0KIAotT2JqZWN0QmFzZSAqIENvbnRleHQ6Omxvb2t1cE5hbWUoY29uc3QgY2hhciAqbmFtZSkgY29uc3QKLXsKLSAgICBmb3Ioc2l6ZV90IGN0PTA7IGN0IDwgbU5hbWVzLnNpemUoKTsgY3QrKykgewotICAgICAgICBpZiAoIXN0cmNtcChuYW1lLCBtTmFtZXNbY3RdLT5nZXROYW1lKCkpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbU5hbWVzW2N0XTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotdm9pZCBDb250ZXh0OjphcHBlbmROYW1lRGVmaW5lcyhTdHJpbmc4ICpzdHIpIGNvbnN0Ci17Ci0gICAgY2hhciBidWZbMjU2XTsKLSAgICBmb3IgKHNpemVfdCBjdD0wOyBjdCA8IG1OYW1lcy5zaXplKCk7IGN0KyspIHsKLSAgICAgICAgc3RyLT5hcHBlbmQoIiNkZWZpbmUgTkFNRURfIik7Ci0gICAgICAgIHN0ci0+YXBwZW5kKG1OYW1lc1tjdF0tPmdldE5hbWUoKSk7Ci0gICAgICAgIHN0ci0+YXBwZW5kKCIgIik7Ci0gICAgICAgIHNwcmludGYoYnVmLCAiJWlcbiIsIChpbnQpbU5hbWVzW2N0XSk7Ci0gICAgICAgIHN0ci0+YXBwZW5kKGJ1Zik7Ci0gICAgfQotfQotCiBib29sIENvbnRleHQ6Om9iakRlc3Ryb3lPT0JJbml0KCkKIHsKLSAgICBpbnQgc3RhdHVzID0gcHRocmVhZF9tdXRleF9pbml0KCZtT2JqRGVzdHJveS5tTXV0ZXgsIE5VTEwpOwotICAgIGlmIChzdGF0dXMpIHsKKyAgICBpZiAoIW1PYmpEZXN0cm95Lm1NdXRleC5pbml0KCkpIHsKICAgICAgICAgTE9HRSgiQ29udGV4dDo6T2JqRGVzdHJveU9PQkluaXQgbXV0ZXggaW5pdCBmYWlsdXJlIik7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CkBAIC02NzUsOSArNjQyLDggQEAKIHZvaWQgQ29udGV4dDo6b2JqRGVzdHJveU9PQlJ1bigpCiB7CiAgICAgaWYgKG1PYmpEZXN0cm95Lm1OZWVkVG9FbXB0eSkgewotICAgICAgICBpbnQgc3RhdHVzID0gcHRocmVhZF9tdXRleF9sb2NrKCZtT2JqRGVzdHJveS5tTXV0ZXgpOwotICAgICAgICBpZiAoc3RhdHVzKSB7Ci0gICAgICAgICAgICBMT0dFKCJDb250ZXh0OjpPYmpEZXN0cm95T09CUnVuOiBlcnJvciAlaSBsb2NraW5nIGZvciBPT0JSdW4uIiwgc3RhdHVzKTsKKyAgICAgICAgaWYgKCFtT2JqRGVzdHJveS5tTXV0ZXgubG9jaygpKSB7CisgICAgICAgICAgICBMT0dFKCJDb250ZXh0OjpPYmpEZXN0cm95T09CUnVuOiBlcnJvciBsb2NraW5nIGZvciBPT0JSdW4uIik7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIApAQCAtNjg2LDM1ICs2NTIsMjUgQEAKICAgICAgICAgfQogICAgICAgICBtT2JqRGVzdHJveS5tRGVzdHJveUxpc3QuY2xlYXIoKTsKICAgICAgICAgbU9iakRlc3Ryb3kubU5lZWRUb0VtcHR5ID0gZmFsc2U7Ci0KLSAgICAgICAgc3RhdHVzID0gcHRocmVhZF9tdXRleF91bmxvY2soJm1PYmpEZXN0cm95Lm1NdXRleCk7Ci0gICAgICAgIGlmIChzdGF0dXMpIHsKLSAgICAgICAgICAgIExPR0UoIkNvbnRleHQ6Ok9iakRlc3Ryb3lPT0JSdW46IGVycm9yICVpIHVubG9ja2luZyBmb3Igc2V0IGNvbmRpdGlvbi4iLCBzdGF0dXMpOwotICAgICAgICB9CisgICAgICAgIG1PYmpEZXN0cm95Lm1NdXRleC51bmxvY2soKTsKICAgICB9CiB9CiAKIHZvaWQgQ29udGV4dDo6b2JqRGVzdHJveU9PQkRlc3Ryb3koKQogewogICAgIHJzQXNzZXJ0KCFtT2JqRGVzdHJveS5tTmVlZFRvRW1wdHkpOwotICAgIHB0aHJlYWRfbXV0ZXhfZGVzdHJveSgmbU9iakRlc3Ryb3kubU11dGV4KTsKIH0KIAogdm9pZCBDb250ZXh0OjpvYmpEZXN0cm95QWRkKE9iamVjdEJhc2UgKm9iaikKIHsKLSAgICBpbnQgc3RhdHVzID0gcHRocmVhZF9tdXRleF9sb2NrKCZtT2JqRGVzdHJveS5tTXV0ZXgpOwotICAgIGlmIChzdGF0dXMpIHsKLSAgICAgICAgTE9HRSgiQ29udGV4dDo6T2JqRGVzdHJveU9PQlJ1bjogZXJyb3IgJWkgbG9ja2luZyBmb3IgT09CUnVuLiIsIHN0YXR1cyk7CisgICAgaWYgKCFtT2JqRGVzdHJveS5tTXV0ZXgubG9jaygpKSB7CisgICAgICAgIExPR0UoIkNvbnRleHQ6Ok9iakRlc3Ryb3lPT0JSdW46IGVycm9yIGxvY2tpbmcgZm9yIE9PQlJ1bi4iKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAogICAgIG1PYmpEZXN0cm95Lm1OZWVkVG9FbXB0eSA9IHRydWU7CiAgICAgbU9iakRlc3Ryb3kubURlc3Ryb3lMaXN0LmFkZChvYmopOwotCi0gICAgc3RhdHVzID0gcHRocmVhZF9tdXRleF91bmxvY2soJm1PYmpEZXN0cm95Lm1NdXRleCk7Ci0gICAgaWYgKHN0YXR1cykgewotICAgICAgICBMT0dFKCJDb250ZXh0OjpPYmpEZXN0cm95T09CUnVuOiBlcnJvciAlaSB1bmxvY2tpbmcgZm9yIHNldCBjb25kaXRpb24uIiwgc3RhdHVzKTsKLSAgICB9CisgICAgbU9iakRlc3Ryb3kubU11dGV4LnVubG9jaygpOwogfQogCiB1aW50MzJfdCBDb250ZXh0OjpnZXRNZXNzYWdlVG9DbGllbnQodm9pZCAqZGF0YSwgc2l6ZV90ICpyZWNlaXZlTGVuLCBzaXplX3QgYnVmZmVyTGVuLCBib29sIHdhaXQpCkBAIC03OTksOCArNzU1LDcgQEAKICAgICBMT0dFKCJSUyBDb250ZXh0IGRlYnVnIik7CiAKICAgICBMT0dFKCIgRUdMIHZlciAlaSAlaSIsIG1FR0wubU1ham9yVmVyc2lvbiwgbUVHTC5tTWlub3JWZXJzaW9uKTsKLSAgICBMT0dFKCIgRUdMIGNvbnRleHQgJXAgIHN1cmZhY2UgJXAsICB3PSVpIGg9JWkgIERpc3BsYXk9JXAiLCBtRUdMLm1Db250ZXh0LAotICAgICAgICAgbUVHTC5tU3VyZmFjZSwgbUVHTC5tV2lkdGgsIG1FR0wubUhlaWdodCwgbUVHTC5tRGlzcGxheSk7CisgICAgTE9HRSgiIEVHTCBjb250ZXh0ICVwICBzdXJmYWNlICVwLCAgRGlzcGxheT0lcCIsIG1FR0wubUNvbnRleHQsIG1FR0wubVN1cmZhY2UsIG1FR0wubURpc3BsYXkpOwogICAgIExPR0UoIiBHTCB2ZW5kb3I6ICVzIiwgbUdMLm1WZW5kb3IpOwogICAgIExPR0UoIiBHTCByZW5kZXJlcjogJXMiLCBtR0wubVJlbmRlcmVyKTsKICAgICBMT0dFKCIgR0wgVmVyc2lvbjogJXMiLCBtR0wubVZlcnNpb24pOwpAQCAtODIyLDYgKzc3Nyw5IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgcmVuZGVyc2NyaXB0IHsKIAordm9pZCByc2lfQ29udGV4dEZpbmlzaChDb250ZXh0ICpyc2MpCit7Cit9CiAKIHZvaWQgcnNpX0NvbnRleHRCaW5kUm9vdFNjcmlwdChDb250ZXh0ICpyc2MsIFJzU2NyaXB0IHZzKQogewpAQCAtODQxLDkgKzc5OSw5IEBACiAgICAgcy0+YmluZFRvQ29udGV4dCgmcnNjLT5tU3RhdGVTYW1wbGVyLCBzbG90KTsKIH0KIAotdm9pZCByc2lfQ29udGV4dEJpbmRQcm9ncmFtRnJhZ21lbnRTdG9yZShDb250ZXh0ICpyc2MsIFJzUHJvZ3JhbUZyYWdtZW50U3RvcmUgdnBmcykKK3ZvaWQgcnNpX0NvbnRleHRCaW5kUHJvZ3JhbVN0b3JlKENvbnRleHQgKnJzYywgUnNQcm9ncmFtU3RvcmUgdnBmcykKIHsKLSAgICBQcm9ncmFtRnJhZ21lbnRTdG9yZSAqcGZzID0gc3RhdGljX2Nhc3Q8UHJvZ3JhbUZyYWdtZW50U3RvcmUgKj4odnBmcyk7CisgICAgUHJvZ3JhbVN0b3JlICpwZnMgPSBzdGF0aWNfY2FzdDxQcm9ncmFtU3RvcmUgKj4odnBmcyk7CiAgICAgcnNjLT5zZXRGcmFnbWVudFN0b3JlKHBmcyk7CiB9CiAKQEAgLTg2NSw2ICs4MjMsMTMgQEAKICAgICByc2MtPnNldFZlcnRleChwdik7CiB9CiAKK3ZvaWQgcnNpX0NvbnRleHRCaW5kRm9udChDb250ZXh0ICpyc2MsIFJzRm9udCB2Zm9udCkKK3sKKyAgICBGb250ICpmb250ID0gc3RhdGljX2Nhc3Q8Rm9udCAqPih2Zm9udCk7CisgICAgcnNjLT5zZXRGb250KGZvbnQpOworfQorCisKIHZvaWQgcnNpX0Fzc2lnbk5hbWUoQ29udGV4dCAqcnNjLCB2b2lkICogb2JqLCBjb25zdCBjaGFyICpuYW1lLCB1aW50MzJfdCBsZW4pCiB7CiAgICAgT2JqZWN0QmFzZSAqb2IgPSBzdGF0aWNfY2FzdDxPYmplY3RCYXNlICo+KG9iaik7CmRpZmYgLS1naXQgYS9saWJzL3JzL3JzQ29udGV4dC5oIGIvbGlicy9ycy9yc0NvbnRleHQuaAppbmRleCA4MmMzNjg3Li4xNDg1ZDhhIDEwMDY0NAotLS0gYS9saWJzL3JzL3JzQ29udGV4dC5oCisrKyBiL2xpYnMvcnMvcnNDb250ZXh0LmgKQEAgLTE4LDYgKzE4LDcgQEAKICNkZWZpbmUgQU5EUk9JRF9SU19DT05URVhUX0gKIAogI2luY2x1ZGUgInJzVXRpbHMuaCIKKyNpbmNsdWRlICJyc011dGV4LmgiCiAKICNpbmNsdWRlICJyc1RocmVhZElPLmgiCiAjaW5jbHVkZSAicnNUeXBlLmgiCkBAIC0zMSw4ICszMiw5IEBACiAjaW5jbHVkZSAicnNBZGFwdGVyLmgiCiAjaW5jbHVkZSAicnNTYW1wbGVyLmgiCiAjaW5jbHVkZSAicnNMaWdodC5oIgorI2luY2x1ZGUgInJzRm9udC5oIgogI2luY2x1ZGUgInJzUHJvZ3JhbUZyYWdtZW50LmgiCi0jaW5jbHVkZSAicnNQcm9ncmFtRnJhZ21lbnRTdG9yZS5oIgorI2luY2x1ZGUgInJzUHJvZ3JhbVN0b3JlLmgiCiAjaW5jbHVkZSAicnNQcm9ncmFtUmFzdGVyLmgiCiAjaW5jbHVkZSAicnNQcm9ncmFtVmVydGV4LmgiCiAjaW5jbHVkZSAicnNTaGFkZXJDYWNoZS5oIgpAQCAtNzAsMTEgKzcyLDEyIEBACiAgICAgVHlwZVN0YXRlIG1TdGF0ZVR5cGU7CiAgICAgU2FtcGxlclN0YXRlIG1TdGF0ZVNhbXBsZXI7CiAgICAgUHJvZ3JhbUZyYWdtZW50U3RhdGUgbVN0YXRlRnJhZ21lbnQ7Ci0gICAgUHJvZ3JhbUZyYWdtZW50U3RvcmVTdGF0ZSBtU3RhdGVGcmFnbWVudFN0b3JlOworICAgIFByb2dyYW1TdG9yZVN0YXRlIG1TdGF0ZUZyYWdtZW50U3RvcmU7CiAgICAgUHJvZ3JhbVJhc3RlclN0YXRlIG1TdGF0ZVJhc3RlcjsKICAgICBQcm9ncmFtVmVydGV4U3RhdGUgbVN0YXRlVmVydGV4OwogICAgIExpZ2h0U3RhdGUgbVN0YXRlTGlnaHQ7CiAgICAgVmVydGV4QXJyYXlTdGF0ZSBtU3RhdGVWZXJ0ZXhBcnJheTsKKyAgICBGb250U3RhdGUgbVN0YXRlRm9udDsKIAogICAgIFNjcmlwdENTdGF0ZSBtU2NyaXB0QzsKICAgICBTaGFkZXJDYWNoZSBtU2hhZGVyQ2FjaGU7CkBAIC04NCwxNCArODcsMTYgQEAKICAgICB2b2lkIHNldFJhc3RlcihQcm9ncmFtUmFzdGVyICopOwogICAgIHZvaWQgc2V0VmVydGV4KFByb2dyYW1WZXJ0ZXggKik7CiAgICAgdm9pZCBzZXRGcmFnbWVudChQcm9ncmFtRnJhZ21lbnQgKik7Ci0gICAgdm9pZCBzZXRGcmFnbWVudFN0b3JlKFByb2dyYW1GcmFnbWVudFN0b3JlICopOworICAgIHZvaWQgc2V0RnJhZ21lbnRTdG9yZShQcm9ncmFtU3RvcmUgKik7CisgICAgdm9pZCBzZXRGb250KEZvbnQgKik7CiAKICAgICB2b2lkIHVwZGF0ZVN1cmZhY2Uodm9pZCAqc3VyKTsKIAogICAgIGNvbnN0IFByb2dyYW1GcmFnbWVudCAqIGdldEZyYWdtZW50KCkge3JldHVybiBtRnJhZ21lbnQuZ2V0KCk7fQotICAgIGNvbnN0IFByb2dyYW1GcmFnbWVudFN0b3JlICogZ2V0RnJhZ21lbnRTdG9yZSgpIHtyZXR1cm4gbUZyYWdtZW50U3RvcmUuZ2V0KCk7fQorICAgIGNvbnN0IFByb2dyYW1TdG9yZSAqIGdldEZyYWdtZW50U3RvcmUoKSB7cmV0dXJuIG1GcmFnbWVudFN0b3JlLmdldCgpO30KICAgICBjb25zdCBQcm9ncmFtUmFzdGVyICogZ2V0UmFzdGVyKCkge3JldHVybiBtUmFzdGVyLmdldCgpO30KICAgICBjb25zdCBQcm9ncmFtVmVydGV4ICogZ2V0VmVydGV4KCkge3JldHVybiBtVmVydGV4LmdldCgpO30KKyAgICBGb250ICogZ2V0Rm9udCgpIHtyZXR1cm4gbUZvbnQuZ2V0KCk7fQogCiAgICAgYm9vbCBzZXR1cENoZWNrKCk7CiAgICAgYm9vbCBjaGVja0RyaXZlcigpIGNvbnN0IHtyZXR1cm4gbUVHTC5tU3VyZmFjZSAhPSAwO30KQEAgLTEwMywxMiArMTA4LDEwIEBACiAKICAgICB2b2lkIGFzc2lnbk5hbWUoT2JqZWN0QmFzZSAqb2JqLCBjb25zdCBjaGFyICpuYW1lLCB1aW50MzJfdCBsZW4pOwogICAgIHZvaWQgcmVtb3ZlTmFtZShPYmplY3RCYXNlICpvYmopOwotICAgIE9iamVjdEJhc2UgKiBsb29rdXBOYW1lKGNvbnN0IGNoYXIgKm5hbWUpIGNvbnN0OwotICAgIHZvaWQgYXBwZW5kTmFtZURlZmluZXMoU3RyaW5nOCAqc3RyKSBjb25zdDsKIAogICAgIHVpbnQzMl90IGdldE1lc3NhZ2VUb0NsaWVudCh2b2lkICpkYXRhLCBzaXplX3QgKnJlY2VpdmVMZW4sIHNpemVfdCBidWZmZXJMZW4sIGJvb2wgd2FpdCk7CiAgICAgYm9vbCBzZW5kTWVzc2FnZVRvQ2xpZW50KHZvaWQgKmRhdGEsIHVpbnQzMl90IGNtZElELCBzaXplX3QgbGVuLCBib29sIHdhaXRGb3JTcGFjZSk7Ci0gICAgdWludDMyX3QgcnVuU2NyaXB0KFNjcmlwdCAqcywgdWludDMyX3QgbGF1bmNoSUQpOworICAgIHVpbnQzMl90IHJ1blNjcmlwdChTY3JpcHQgKnMpOwogCiAgICAgdm9pZCBpbml0VG9DbGllbnQoKTsKICAgICB2b2lkIGRlaW5pdFRvQ2xpZW50KCk7CkBAIC0xMTksMTUgKzEyMiwxOCBAQAogICAgIFByb2dyYW1WZXJ0ZXggKiBnZXREZWZhdWx0UHJvZ3JhbVZlcnRleCgpIGNvbnN0IHsKICAgICAgICAgcmV0dXJuIG1TdGF0ZVZlcnRleC5tRGVmYXVsdC5nZXQoKTsKICAgICB9Ci0gICAgUHJvZ3JhbUZyYWdtZW50U3RvcmUgKiBnZXREZWZhdWx0UHJvZ3JhbUZyYWdtZW50U3RvcmUoKSBjb25zdCB7CisgICAgUHJvZ3JhbVN0b3JlICogZ2V0RGVmYXVsdFByb2dyYW1TdG9yZSgpIGNvbnN0IHsKICAgICAgICAgcmV0dXJuIG1TdGF0ZUZyYWdtZW50U3RvcmUubURlZmF1bHQuZ2V0KCk7CiAgICAgfQogICAgIFByb2dyYW1SYXN0ZXIgKiBnZXREZWZhdWx0UHJvZ3JhbVJhc3RlcigpIGNvbnN0IHsKICAgICAgICAgcmV0dXJuIG1TdGF0ZVJhc3Rlci5tRGVmYXVsdC5nZXQoKTsKICAgICB9CisgICAgRm9udCogZ2V0RGVmYXVsdEZvbnQoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtU3RhdGVGb250Lm1EZWZhdWx0LmdldCgpOworICAgIH0KIAotICAgIHVpbnQzMl90IGdldFdpZHRoKCkgY29uc3Qge3JldHVybiBtRUdMLm1XaWR0aDt9Ci0gICAgdWludDMyX3QgZ2V0SGVpZ2h0KCkgY29uc3Qge3JldHVybiBtRUdMLm1IZWlnaHQ7fQorICAgIHVpbnQzMl90IGdldFdpZHRoKCkgY29uc3Qge3JldHVybiBtV2lkdGg7fQorICAgIHVpbnQzMl90IGdldEhlaWdodCgpIGNvbnN0IHtyZXR1cm4gbUhlaWdodDt9CiAKIAogICAgIFRocmVhZElPIG1JTzsKQEAgLTE2MSw3ICsxNjcsNyBAQAogICAgIHZvaWQgZHVtcERlYnVnKCkgY29uc3Q7CiAgICAgdm9pZCBjaGVja0Vycm9yKGNvbnN0IGNoYXIgKikgY29uc3Q7CiAgICAgY29uc3QgY2hhciAqIGdldEVycm9yKFJzRXJyb3IgKik7Ci0gICAgdm9pZCBzZXRFcnJvcihSc0Vycm9yIGUsIGNvbnN0IGNoYXIgKm1zZyk7CisgICAgdm9pZCBzZXRFcnJvcihSc0Vycm9yIGUsIGNvbnN0IGNoYXIgKm1zZyA9IE5VTEwpOwogCiAgICAgbXV0YWJsZSBjb25zdCBPYmplY3RCYXNlICogbU9iakhlYWQ7CiAKQEAgLTE3Nyw4ICsxODMsNiBAQAogICAgICAgICBFR0xDb25maWcgbUNvbmZpZzsKICAgICAgICAgRUdMQ29udGV4dCBtQ29udGV4dDsKICAgICAgICAgRUdMU3VyZmFjZSBtU3VyZmFjZTsKLSAgICAgICAgRUdMaW50IG1XaWR0aDsKLSAgICAgICAgRUdMaW50IG1IZWlnaHQ7CiAgICAgICAgIEVHTERpc3BsYXkgbURpc3BsYXk7CiAgICAgfSBtRUdMOwogCkBAIC0yMjIsMTIgKzIyNiwxMiBAQAogICAgIE9iamVjdEJhc2VSZWY8U2NyaXB0PiBtUm9vdFNjcmlwdDsKICAgICBPYmplY3RCYXNlUmVmPFByb2dyYW1GcmFnbWVudD4gbUZyYWdtZW50OwogICAgIE9iamVjdEJhc2VSZWY8UHJvZ3JhbVZlcnRleD4gbVZlcnRleDsKLSAgICBPYmplY3RCYXNlUmVmPFByb2dyYW1GcmFnbWVudFN0b3JlPiBtRnJhZ21lbnRTdG9yZTsKKyAgICBPYmplY3RCYXNlUmVmPFByb2dyYW1TdG9yZT4gbUZyYWdtZW50U3RvcmU7CiAgICAgT2JqZWN0QmFzZVJlZjxQcm9ncmFtUmFzdGVyPiBtUmFzdGVyOwotCisgICAgT2JqZWN0QmFzZVJlZjxGb250PiBtRm9udDsKIAogICAgIHN0cnVjdCBPYmpEZXN0cm95T09CIHsKLSAgICAgICAgcHRocmVhZF9tdXRleF90IG1NdXRleDsKKyAgICAgICAgTXV0ZXggbU11dGV4OwogICAgICAgICBWZWN0b3I8T2JqZWN0QmFzZSAqPiBtRGVzdHJveUxpc3Q7CiAgICAgICAgIGJvb2wgbU5lZWRUb0VtcHR5OwogICAgIH07CmRpZmYgLS1naXQgYS9saWJzL3JzL3JzQ29udGV4dEhvc3RTdHViLmggYi9saWJzL3JzL3JzQ29udGV4dEhvc3RTdHViLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmUxZmZmNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvcnNDb250ZXh0SG9zdFN0dWIuaApAQCAtMCwwICsxLDE1MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9SU19DT05URVhUX0hPU1RfU1RVQl9ICisjZGVmaW5lIEFORFJPSURfUlNfQ09OVEVYVF9IT1NUX1NUVUJfSAorCisjaW5jbHVkZSAicnNVdGlscy5oIgorLy8jaW5jbHVkZSAicnNNdXRleC5oIgorCisvLyNpbmNsdWRlICJyc1RocmVhZElPLmgiCisjaW5jbHVkZSAicnNUeXBlLmgiCisjaW5jbHVkZSAicnNNYXRyaXguaCIKKyNpbmNsdWRlICJyc0FsbG9jYXRpb24uaCIKKyNpbmNsdWRlICJyc1NpbXBsZU1lc2guaCIKKyNpbmNsdWRlICJyc01lc2guaCIKKy8vI2luY2x1ZGUgInJzRGV2aWNlLmgiCisjaW5jbHVkZSAicnNTY3JpcHRDLmgiCisjaW5jbHVkZSAicnNBbGxvY2F0aW9uLmgiCisjaW5jbHVkZSAicnNBZGFwdGVyLmgiCisjaW5jbHVkZSAicnNTYW1wbGVyLmgiCisjaW5jbHVkZSAicnNMaWdodC5oIgorI2luY2x1ZGUgInJzUHJvZ3JhbUZyYWdtZW50LmgiCisjaW5jbHVkZSAicnNQcm9ncmFtU3RvcmUuaCIKKyNpbmNsdWRlICJyc1Byb2dyYW1SYXN0ZXIuaCIKKyNpbmNsdWRlICJyc1Byb2dyYW1WZXJ0ZXguaCIKKyNpbmNsdWRlICJyc1NoYWRlckNhY2hlLmgiCisjaW5jbHVkZSAicnNWZXJ0ZXhBcnJheS5oIgorCisvLyNpbmNsdWRlICJyc2dBcGlTdHJ1Y3RzLmgiCisvLyNpbmNsdWRlICJyc0xvY2tsZXNzRmlmby5oIgorCisvLyNpbmNsdWRlIDx1aS9lZ2wvYW5kcm9pZF9uYXRpdmVzLmg+CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbmFtZXNwYWNlIGFuZHJvaWQgeworCituYW1lc3BhY2UgcmVuZGVyc2NyaXB0IHsKKworY2xhc3MgRGV2aWNlOworCitjbGFzcyBDb250ZXh0Cit7CitwdWJsaWM6CisgICAgQ29udGV4dChEZXZpY2UgKiwgYm9vbCBpc0dyYXBoaWNzLCBib29sIHVzZURlcHRoKSB7CisgICAgICAgIG1PYmpIZWFkID0gTlVMTDsKKyAgICB9CisgICAgfkNvbnRleHQoKSB7CisgICAgfQorCisKKyAgICAvL1N0cnVjdHVyZWRBbGxvY2F0aW9uQ29udGV4dCBtU3RhdGVBbGxvY2F0aW9uOworICAgIEVsZW1lbnRTdGF0ZSBtU3RhdGVFbGVtZW50OworICAgIFR5cGVTdGF0ZSBtU3RhdGVUeXBlOworICAgIFNhbXBsZXJTdGF0ZSBtU3RhdGVTYW1wbGVyOworICAgIC8vUHJvZ3JhbUZyYWdtZW50U3RhdGUgbVN0YXRlRnJhZ21lbnQ7CisgICAgUHJvZ3JhbVN0b3JlU3RhdGUgbVN0YXRlRnJhZ21lbnRTdG9yZTsKKyAgICAvL1Byb2dyYW1SYXN0ZXJTdGF0ZSBtU3RhdGVSYXN0ZXI7CisgICAgLy9Qcm9ncmFtVmVydGV4U3RhdGUgbVN0YXRlVmVydGV4OworICAgIExpZ2h0U3RhdGUgbVN0YXRlTGlnaHQ7CisgICAgVmVydGV4QXJyYXlTdGF0ZSBtU3RhdGVWZXJ0ZXhBcnJheTsKKworICAgIC8vU2NyaXB0Q1N0YXRlIG1TY3JpcHRDOworICAgIFNoYWRlckNhY2hlIG1TaGFkZXJDYWNoZTsKKworCisgICAgLy9ib29sIHNldHVwQ2hlY2soKTsKKyAgICBib29sIGNoZWNrRHJpdmVyKCkgY29uc3Qge3JldHVybiBmYWxzZTt9CisKKyAgICBQcm9ncmFtRnJhZ21lbnQgKiBnZXREZWZhdWx0UHJvZ3JhbUZyYWdtZW50KCkgY29uc3QgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgUHJvZ3JhbVZlcnRleCAqIGdldERlZmF1bHRQcm9ncmFtVmVydGV4KCkgY29uc3QgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgUHJvZ3JhbVN0b3JlICogZ2V0RGVmYXVsdFByb2dyYW1TdG9yZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIFByb2dyYW1SYXN0ZXIgKiBnZXREZWZhdWx0UHJvZ3JhbVJhc3RlcigpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgdWludDMyX3QgZ2V0V2lkdGgoKSBjb25zdCB7cmV0dXJuIDA7fQorICAgIHVpbnQzMl90IGdldEhlaWdodCgpIGNvbnN0IHtyZXR1cm4gMDt9CisKKyAgICAvLyBUaW1lcnMKKyAgICBlbnVtIFRpbWVycyB7CisgICAgICAgIFJTX1RJTUVSX0lETEUsCisgICAgICAgIFJTX1RJTUVSX0lOVEVSTkFMLAorICAgICAgICBSU19USU1FUl9TQ1JJUFQsCisgICAgICAgIFJTX1RJTUVSX0NMRUFSX1NXQVAsCisgICAgICAgIF9SU19USU1FUl9UT1RBTAorICAgIH07CisKKyAgICBib29sIGNoZWNrVmVyc2lvbjFfMSgpIGNvbnN0IHtyZXR1cm4gZmFsc2U7IH0KKyAgICBib29sIGNoZWNrVmVyc2lvbjJfMCgpIGNvbnN0IHtyZXR1cm4gZmFsc2U7IH0KKworICAgIHN0cnVjdCB7CisgICAgICAgIGJvb2wgbUxvZ1RpbWVzOworICAgICAgICBib29sIG1Mb2dTY3JpcHRzOworICAgICAgICBib29sIG1Mb2dPYmplY3RzOworICAgICAgICBib29sIG1Mb2dTaGFkZXJzOworICAgIH0gcHJvcHM7CisKKyAgICB2b2lkIGR1bXBEZWJ1ZygpIGNvbnN0IHsgICAgfQorICAgIHZvaWQgY2hlY2tFcnJvcihjb25zdCBjaGFyICopIGNvbnN0IHsgIH07CisgICAgdm9pZCBzZXRFcnJvcihSc0Vycm9yIGUsIGNvbnN0IGNoYXIgKm1zZyA9IE5VTEwpIHsgIH0KKworICAgIG11dGFibGUgY29uc3QgT2JqZWN0QmFzZSAqIG1PYmpIZWFkOworCisgICAgYm9vbCBleHRfT0VTX3RleHR1cmVfbnBvdCgpIGNvbnN0IHtyZXR1cm4gbUdMLk9FU190ZXh0dXJlX25wb3Q7fQorCitwcm90ZWN0ZWQ6CisKKyAgICBzdHJ1Y3QgeworICAgICAgICBjb25zdCB1aW50OF90ICogbVZlbmRvcjsKKyAgICAgICAgY29uc3QgdWludDhfdCAqIG1SZW5kZXJlcjsKKyAgICAgICAgY29uc3QgdWludDhfdCAqIG1WZXJzaW9uOworICAgICAgICBjb25zdCB1aW50OF90ICogbUV4dGVuc2lvbnM7CisKKyAgICAgICAgdWludDMyX3QgbU1ham9yVmVyc2lvbjsKKyAgICAgICAgdWludDMyX3QgbU1pbm9yVmVyc2lvbjsKKworICAgICAgICBpbnQzMl90IG1NYXhWYXJ5aW5nVmVjdG9yczsKKyAgICAgICAgaW50MzJfdCBtTWF4VGV4dHVyZUltYWdlVW5pdHM7CisKKyAgICAgICAgaW50MzJfdCBtTWF4RnJhZ21lbnRUZXh0dXJlSW1hZ2VVbml0czsKKyAgICAgICAgaW50MzJfdCBtTWF4RnJhZ21lbnRVbmlmb3JtVmVjdG9yczsKKworICAgICAgICBpbnQzMl90IG1NYXhWZXJ0ZXhBdHRyaWJzOworICAgICAgICBpbnQzMl90IG1NYXhWZXJ0ZXhVbmlmb3JtVmVjdG9yczsKKyAgICAgICAgaW50MzJfdCBtTWF4VmVydGV4VGV4dHVyZVVuaXRzOworCisgICAgICAgIGJvb2wgT0VTX3RleHR1cmVfbnBvdDsKKyAgICB9IG1HTDsKKworfTsKKworfQorfQorI2VuZGlmCmRpZmYgLS1naXQgYS9saWJzL3JzL3JzRGV2aWNlLmNwcCBiL2xpYnMvcnMvcnNEZXZpY2UuY3BwCmluZGV4IGI2NzBhZDQuLmE5NmIxMTQgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNEZXZpY2UuY3BwCisrKyBiL2xpYnMvcnMvcnNEZXZpY2UuY3BwCkBAIC0xNSw3ICsxNSwxMSBAQAogICovCiAKICNpbmNsdWRlICJyc0RldmljZS5oIgorI2lmbmRlZiBBTkRST0lEX1JTX0JVSUxEX0ZPUl9IT1NUCiAjaW5jbHVkZSAicnNDb250ZXh0LmgiCisjZWxzZQorI2luY2x1ZGUgInJzQ29udGV4dEhvc3RTdHViLmgiCisjZW5kaWYKIAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6cmVuZGVyc2NyaXB0OwpAQCAtMzMsNyArMzcsNyBAQAogCiB2b2lkIERldmljZTo6YWRkQ29udGV4dChDb250ZXh0ICpyc2MpCiB7Ci0gICAgbUNvbnRleHRzLmFkZChyc2MpOworICAgIG1Db250ZXh0cy5wdXNoKHJzYyk7CiB9CiAKIHZvaWQgRGV2aWNlOjpyZW1vdmVDb250ZXh0KENvbnRleHQgKnJzYykKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNFbGVtZW50LmNwcCBiL2xpYnMvcnMvcnNFbGVtZW50LmNwcAppbmRleCA2Mjg4YmM0Li5hYTIwMjc1IDEwMDY0NAotLS0gYS9saWJzL3JzL3JzRWxlbWVudC5jcHAKKysrIGIvbGlicy9ycy9yc0VsZW1lbnQuY3BwCkBAIC0xNCw5ICsxNCwxNCBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2luY2x1ZGUgInJzQ29udGV4dC5oIgogCisjaWZuZGVmIEFORFJPSURfUlNfQlVJTERfRk9SX0hPU1QKKyNpbmNsdWRlICJyc0NvbnRleHQuaCIKICNpbmNsdWRlIDxHTEVTL2dsLmg+CisjZWxzZQorI2luY2x1ZGUgInJzQ29udGV4dEhvc3RTdHViLmgiCisjaW5jbHVkZSA8T3BlbkdML2dsLmg+CisjZW5kaWYKIAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6cmVuZGVyc2NyaXB0OwpAQCAtODMsNiArODgsOTAgQEAKICAgICB9CiB9CiAKK3ZvaWQgRWxlbWVudDo6c2VyaWFsaXplKE9TdHJlYW0gKnN0cmVhbSkgY29uc3QKK3sKKyAgICAvLyBOZWVkIHRvIGlkZW50aWZ5IG91cnNlbHZlcworICAgIHN0cmVhbS0+YWRkVTMyKCh1aW50MzJfdClnZXRDbGFzc0lkKCkpOworCisgICAgU3RyaW5nOCBuYW1lKGdldE5hbWUoKSk7CisgICAgc3RyZWFtLT5hZGRTdHJpbmcoJm5hbWUpOworCisgICAgbUNvbXBvbmVudC5zZXJpYWxpemUoc3RyZWFtKTsKKworICAgIC8vIE5vdyBzZXJpYWxpemUgYWxsIHRoZSBmaWVsZHMKKyAgICBzdHJlYW0tPmFkZFUzMihtRmllbGRDb3VudCk7CisgICAgZm9yKHVpbnQzMl90IGN0ID0gMDsgY3QgPCBtRmllbGRDb3VudDsgY3QrKykgeworICAgICAgICBzdHJlYW0tPmFkZFN0cmluZygmbUZpZWxkc1tjdF0ubmFtZSk7CisgICAgICAgIG1GaWVsZHNbY3RdLmUtPnNlcmlhbGl6ZShzdHJlYW0pOworICAgIH0KK30KKworRWxlbWVudCAqRWxlbWVudDo6Y3JlYXRlRnJvbVN0cmVhbShDb250ZXh0ICpyc2MsIElTdHJlYW0gKnN0cmVhbSkKK3sKKyAgICAvLyBGaXJzdCBtYWtlIHN1cmUgd2UgYXJlIHJlYWRpbmcgdGhlIGNvcnJlY3Qgb2JqZWN0CisgICAgUnNBM0RDbGFzc0lEIGNsYXNzSUQgPSAoUnNBM0RDbGFzc0lEKXN0cmVhbS0+bG9hZFUzMigpOworICAgIGlmKGNsYXNzSUQgIT0gUlNfQTNEX0NMQVNTX0lEX0VMRU1FTlQpIHsKKyAgICAgICAgTE9HRSgiZWxlbWVudCBsb2FkaW5nIHNraXBwZWQgZHVlIHRvIGludmFsaWQgY2xhc3MgaWRcbiIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBTdHJpbmc4IG5hbWU7CisgICAgc3RyZWFtLT5sb2FkU3RyaW5nKCZuYW1lKTsKKworICAgIEVsZW1lbnQgKmVsZW0gPSBuZXcgRWxlbWVudChyc2MpOworICAgIGVsZW0tPm1Db21wb25lbnQubG9hZEZyb21TdHJlYW0oc3RyZWFtKTsKKyAgICBlbGVtLT5tQml0cyA9IGVsZW0tPm1Db21wb25lbnQuZ2V0Qml0cygpOworCisgICAgZWxlbS0+bUZpZWxkQ291bnQgPSBzdHJlYW0tPmxvYWRVMzIoKTsKKyAgICBpZihlbGVtLT5tRmllbGRDb3VudCkgeworICAgICAgICBlbGVtLT5tRmllbGRzID0gbmV3IEVsZW1lbnRGaWVsZF90IFtlbGVtLT5tRmllbGRDb3VudF07CisgICAgICAgIGZvcih1aW50MzJfdCBjdCA9IDA7IGN0IDwgZWxlbS0+bUZpZWxkQ291bnQ7IGN0ICsrKSB7CisgICAgICAgICAgICBzdHJlYW0tPmxvYWRTdHJpbmcoJmVsZW0tPm1GaWVsZHNbY3RdLm5hbWUpOworICAgICAgICAgICAgRWxlbWVudCAqZmllbGRFbGVtID0gRWxlbWVudDo6Y3JlYXRlRnJvbVN0cmVhbShyc2MsIHN0cmVhbSk7CisgICAgICAgICAgICBlbGVtLT5tRmllbGRzW2N0XS5lLnNldChmaWVsZEVsZW0pOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gV2UgbmVlZCB0byBjaGVjayBpZiB0aGlzIGFscmVhZHkgZXhpc3RzCisgICAgZm9yICh1aW50MzJfdCBjdD0wOyBjdCA8IHJzYy0+bVN0YXRlRWxlbWVudC5tRWxlbWVudHMuc2l6ZSgpOyBjdCsrKSB7CisgICAgICAgIEVsZW1lbnQgKmVlID0gcnNjLT5tU3RhdGVFbGVtZW50Lm1FbGVtZW50c1tjdF07CisKKyAgICAgICAgaWYgKCFlZS0+Z2V0RmllbGRDb3VudCgpICkgeworCisgICAgICAgICAgICBpZigoZWUtPmdldENvbXBvbmVudCgpLmdldFR5cGUoKSA9PSBlbGVtLT5nZXRDb21wb25lbnQoKS5nZXRUeXBlKCkpICYmCisgICAgICAgICAgICAgICAoZWUtPmdldENvbXBvbmVudCgpLmdldEtpbmQoKSA9PSBlbGVtLT5nZXRDb21wb25lbnQoKS5nZXRLaW5kKCkpICYmCisgICAgICAgICAgICAgICAoZWUtPmdldENvbXBvbmVudCgpLmdldElzTm9ybWFsaXplZCgpID09IGVsZW0tPmdldENvbXBvbmVudCgpLmdldElzTm9ybWFsaXplZCgpKSAmJgorICAgICAgICAgICAgICAgKGVlLT5nZXRDb21wb25lbnQoKS5nZXRWZWN0b3JTaXplKCkgPT0gZWxlbS0+Z2V0Q29tcG9uZW50KCkuZ2V0VmVjdG9yU2l6ZSgpKSkgeworICAgICAgICAgICAgICAgIC8vIE1hdGNoCisgICAgICAgICAgICAgICAgZGVsZXRlIGVsZW07CisgICAgICAgICAgICAgICAgZWUtPmluY1VzZXJSZWYoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfSBlbHNlIGlmIChlZS0+Z2V0RmllbGRDb3VudCgpID09IGVsZW0tPm1GaWVsZENvdW50KSB7CisKKyAgICAgICAgICAgIGJvb2wgbWF0Y2ggPSB0cnVlOworICAgICAgICAgICAgZm9yICh1aW50MzJfdCBpPTA7IGkgPCBlbGVtLT5tRmllbGRDb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKChlZS0+bUZpZWxkc1tpXS5lLmdldCgpICE9IGVsZW0tPm1GaWVsZHNbaV0uZS5nZXQoKSkgfHwKKyAgICAgICAgICAgICAgICAgICAgKGVlLT5tRmllbGRzW2ldLm5hbWUubGVuZ3RoKCkgIT0gZWxlbS0+bUZpZWxkc1tpXS5uYW1lLmxlbmd0aCgpKSB8fAorICAgICAgICAgICAgICAgICAgICAoZWUtPm1GaWVsZHNbaV0ubmFtZSAhPSBlbGVtLT5tRmllbGRzW2ldLm5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgIG1hdGNoID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtYXRjaCkgeworICAgICAgICAgICAgICAgIGRlbGV0ZSBlbGVtOworICAgICAgICAgICAgICAgIGVlLT5pbmNVc2VyUmVmKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVlOworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICB9CisKKyAgICByc2MtPm1TdGF0ZUVsZW1lbnQubUVsZW1lbnRzLnB1c2goZWxlbSk7CisgICAgcmV0dXJuIGVsZW07Cit9CisKIAogY29uc3QgRWxlbWVudCAqIEVsZW1lbnQ6OmNyZWF0ZShDb250ZXh0ICpyc2MsIFJzRGF0YVR5cGUgZHQsIFJzRGF0YUtpbmQgZGssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc05vcm0sIHVpbnQzMl90IHZlY1NpemUpCkBAIC0xNDMsNDUgKzIzMiw2IEBACiAgICAgcmV0dXJuIGU7CiB9CiAKLVN0cmluZzggRWxlbWVudDo6Z2V0Q1N0cnVjdEJvZHkodWludDMyX3QgaW5kZW50KSBjb25zdAotewotICAgIFN0cmluZzggc2k7Ci0gICAgZm9yICh1aW50MzJfdCBjdD0wOyBjdCA8IGluZGVudDsgY3QrKykgewotICAgICAgICBzaS5hcHBlbmQoIiAiKTsKLSAgICB9Ci0KLSAgICBTdHJpbmc4IHMoc2kpOwotICAgIHMuYXBwZW5kKCJ7XG4iKTsKLSAgICBmb3IgKHVpbnQzMl90IGN0ID0gMDsgY3QgPCBtRmllbGRDb3VudDsgY3QrKykgewotICAgICAgICBzLmFwcGVuZChzaSk7Ci0gICAgICAgIHMuYXBwZW5kKG1GaWVsZHNbY3RdLmUtPmdldENUeXBlKGluZGVudCs0KSk7Ci0gICAgICAgIHMuYXBwZW5kKCIgIik7Ci0gICAgICAgIHMuYXBwZW5kKG1GaWVsZHNbY3RdLm5hbWUpOwotICAgICAgICBzLmFwcGVuZCgiO1xuIik7Ci0gICAgfQotICAgIHMuYXBwZW5kKHNpKTsKLSAgICBzLmFwcGVuZCgifSIpOwotICAgIHJldHVybiBzOwotfQotCi1TdHJpbmc4IEVsZW1lbnQ6OmdldENUeXBlKHVpbnQzMl90IGluZGVudCkgY29uc3QKLXsKLSAgICBTdHJpbmc4IHM7Ci0gICAgZm9yICh1aW50MzJfdCBjdD0wOyBjdCA8IGluZGVudDsgY3QrKykgewotICAgICAgICBzLmFwcGVuZCgiICIpOwotICAgIH0KLQotICAgIGlmICghbUZpZWxkQ291bnQpIHsKLSAgICAgICAgLy8gQmFzaWMgY29tcG9uZW50LgotICAgICAgICBzLmFwcGVuZChtQ29tcG9uZW50LmdldENUeXBlKCkpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHMuYXBwZW5kKCJzdHJ1Y3QgIik7Ci0gICAgICAgIHMuYXBwZW5kKGdldENTdHJ1Y3RCb2R5KGluZGVudCkpOwotICAgIH0KLQotICAgIHJldHVybiBzOwotfQotCiBTdHJpbmc4IEVsZW1lbnQ6OmdldEdMU0xUeXBlKHVpbnQzMl90IGluZGVudCkgY29uc3QKIHsKICAgICBTdHJpbmc4IHM7CmRpZmYgLS1naXQgYS9saWJzL3JzL3JzRWxlbWVudC5oIGIvbGlicy9ycy9yc0VsZW1lbnQuaAppbmRleCAwMmExY2EyLi45MGU3Y2M4IDEwMDY0NAotLS0gYS9saWJzL3JzL3JzRWxlbWVudC5oCisrKyBiL2xpYnMvcnMvcnNFbGVtZW50LmgKQEAgLTU0LDExICs1NCwxMiBAQAogICAgIFJzRGF0YUtpbmQgZ2V0S2luZCgpIGNvbnN0IHtyZXR1cm4gbUNvbXBvbmVudC5nZXRLaW5kKCk7fQogICAgIHVpbnQzMl90IGdldEJpdHMoKSBjb25zdCB7cmV0dXJuIG1CaXRzO30KIAotICAgIFN0cmluZzggZ2V0Q1R5cGUodWludDMyX3QgaW5kZW50PTApIGNvbnN0OwotICAgIFN0cmluZzggZ2V0Q1N0cnVjdEJvZHkodWludDMyX3QgaW5kZW50PTApIGNvbnN0OwogICAgIFN0cmluZzggZ2V0R0xTTFR5cGUodWludDMyX3QgaW5kZW50PTApIGNvbnN0OwogCiAgICAgdm9pZCBkdW1wTE9HVihjb25zdCBjaGFyICpwcmVmaXgpIGNvbnN0OworICAgIHZpcnR1YWwgdm9pZCBzZXJpYWxpemUoT1N0cmVhbSAqc3RyZWFtKSBjb25zdDsKKyAgICB2aXJ0dWFsIFJzQTNEQ2xhc3NJRCBnZXRDbGFzc0lkKCkgY29uc3QgeyByZXR1cm4gUlNfQTNEX0NMQVNTX0lEX0VMRU1FTlQ7IH0KKyAgICBzdGF0aWMgRWxlbWVudCAqY3JlYXRlRnJvbVN0cmVhbShDb250ZXh0ICpyc2MsIElTdHJlYW0gKnN0cmVhbSk7CiAKICAgICBzdGF0aWMgY29uc3QgRWxlbWVudCAqIGNyZWF0ZShDb250ZXh0ICpyc2MsIFJzRGF0YVR5cGUgZHQsIFJzRGF0YUtpbmQgZGssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc05vcm0sIHVpbnQzMl90IHZlY1NpemUpOwpAQCAtOTAsNyArOTEsNyBAQAogICAgIH5FbGVtZW50U3RhdGUoKTsKIAogICAgIC8vIENhY2hlIG9mIGFsbCBleGlzdGluZyBlbGVtZW50cy4KLSAgICBWZWN0b3I8Y29uc3QgRWxlbWVudCAqPiBtRWxlbWVudHM7CisgICAgVmVjdG9yPEVsZW1lbnQgKj4gbUVsZW1lbnRzOwogfTsKIAogCmRpZmYgLS1naXQgYS9saWJzL3JzL3JzRmlsZUEzRC5jcHAgYi9saWJzL3JzL3JzRmlsZUEzRC5jcHAKaW5kZXggZTMyNzJjNS4uNGZhYzQyMSAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc0ZpbGVBM0QuY3BwCisrKyBiL2xpYnMvcnMvcnNGaWxlQTNELmNwcApAQCAtMTUsMjkgKzE1LDE1NiBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorI2lmbmRlZiBBTkRST0lEX1JTX0JVSUxEX0ZPUl9IT1NUCiAjaW5jbHVkZSAicnNDb250ZXh0LmgiCisjZWxzZQorI2luY2x1ZGUgInJzQ29udGV4dEhvc3RTdHViLmgiCisjZW5kaWYKIAotCi0jaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgogI2luY2x1ZGUgInJzRmlsZUEzRC5oIgogCiAjaW5jbHVkZSAicnNNZXNoLmgiCisjaW5jbHVkZSAicnNBbmltYXRpb24uaCIKKwogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpyZW5kZXJzY3JpcHQ7CiAKLQotCi1GaWxlQTNEOjpGaWxlQTNEKCkKK0ZpbGVBM0Q6OkZpbGVBM0QoQ29udGV4dCAqcnNjKSA6IE9iamVjdEJhc2UocnNjKQogewotICAgIG1Sc2MgPSBOVUxMOworICAgIG1BbGxvYyA9IE5VTEw7CisgICAgbURhdGEgPSBOVUxMOworICAgIG1Xcml0ZVN0cmVhbSA9IE5VTEw7CisgICAgbVJlYWRTdHJlYW0gPSBOVUxMOworCisgICAgbU1ham9yVmVyc2lvbiA9IDA7CisgICAgbU1pbm9yVmVyc2lvbiA9IDE7CisgICAgbURhdGFTaXplID0gMDsKIH0KIAogRmlsZUEzRDo6fkZpbGVBM0QoKQogeworICAgIGZvcihzaXplX3QgaSA9IDA7IGkgPCBtSW5kZXguc2l6ZSgpOyBpICsrKSB7CisgICAgICAgIGRlbGV0ZSBtSW5kZXhbaV07CisgICAgfQorICAgIGZvcihzaXplX3QgaSA9IDA7IGkgPCBtV3JpdGVJbmRleC5zaXplKCk7IGkgKyspIHsKKyAgICAgICAgZGVsZXRlIG1Xcml0ZUluZGV4W2ldOworICAgIH0KKyAgICBpZihtV3JpdGVTdHJlYW0pIHsKKyAgICAgICAgZGVsZXRlIG1Xcml0ZVN0cmVhbTsKKyAgICB9CisgICAgaWYobVJlYWRTdHJlYW0pIHsKKyAgICAgICAgZGVsZXRlIG1Xcml0ZVN0cmVhbTsKKyAgICB9CisgICAgaWYobUFsbG9jKSB7CisgICAgICAgIGZyZWUobUFsbG9jKTsKKyAgICB9CiB9CiAKLWJvb2wgRmlsZUEzRDo6bG9hZChDb250ZXh0ICpyc2MsIEZJTEUgKmYpCit2b2lkIEZpbGVBM0Q6OnBhcnNlSGVhZGVyKElTdHJlYW0gKmhlYWRlclN0cmVhbSkKK3sKKyAgICBtTWFqb3JWZXJzaW9uID0gaGVhZGVyU3RyZWFtLT5sb2FkVTMyKCk7CisgICAgbU1pbm9yVmVyc2lvbiA9IGhlYWRlclN0cmVhbS0+bG9hZFUzMigpOworICAgIHVpbnQzMl90IGZsYWdzID0gaGVhZGVyU3RyZWFtLT5sb2FkVTMyKCk7CisgICAgbVVzZTY0Qml0T2Zmc2V0cyA9IChmbGFncyAmIDEpICE9IDA7CisKKyAgICBMT0dFKCJmaWxlIG9wZW4gNjRiaXQgPSAlaSIsIG1Vc2U2NEJpdE9mZnNldHMpOworCisgICAgdWludDMyX3QgbnVtSW5kZXhFbnRyaWVzID0gaGVhZGVyU3RyZWFtLT5sb2FkVTMyKCk7CisgICAgZm9yKHVpbnQzMl90IGkgPSAwOyBpIDwgbnVtSW5kZXhFbnRyaWVzOyBpICsrKSB7CisgICAgICAgIEEzREluZGV4RW50cnkgKmVudHJ5ID0gbmV3IEEzREluZGV4RW50cnkoKTsKKyAgICAgICAgaGVhZGVyU3RyZWFtLT5sb2FkU3RyaW5nKCZlbnRyeS0+bU9iamVjdE5hbWUpOworICAgICAgICBMT0dFKCJIZWFkZXIgZGF0YSwgZW50cnkgbmFtZSA9ICVzIiwgZW50cnktPm1PYmplY3ROYW1lLnN0cmluZygpKTsKKyAgICAgICAgZW50cnktPm1UeXBlID0gKFJzQTNEQ2xhc3NJRCloZWFkZXJTdHJlYW0tPmxvYWRVMzIoKTsKKyAgICAgICAgaWYobVVzZTY0Qml0T2Zmc2V0cyl7CisgICAgICAgICAgICBlbnRyeS0+bU9mZnNldCA9IGhlYWRlclN0cmVhbS0+bG9hZE9mZnNldCgpOworICAgICAgICAgICAgZW50cnktPm1MZW5ndGggPSBoZWFkZXJTdHJlYW0tPmxvYWRPZmZzZXQoKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGVudHJ5LT5tT2Zmc2V0ID0gaGVhZGVyU3RyZWFtLT5sb2FkVTMyKCk7CisgICAgICAgICAgICBlbnRyeS0+bUxlbmd0aCA9IGhlYWRlclN0cmVhbS0+bG9hZFUzMigpOworICAgICAgICB9CisgICAgICAgIGVudHJ5LT5tUnNPYmogPSBOVUxMOworICAgICAgICBtSW5kZXgucHVzaChlbnRyeSk7CisgICAgfQorfQorCitib29sIEZpbGVBM0Q6OmxvYWQoY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGxlbmd0aCkKK3sKKyAgICBMT0dFKCJMb2FkaW5nIGRhdGEuIFNpemU6ICV1IiwgbGVuZ3RoKTsKKyAgICBjb25zdCB1aW50OF90ICpsb2NhbERhdGEgPSAoY29uc3QgdWludDhfdCAqKWRhdGE7CisKKyAgICBzaXplX3QgbGVuZ3RoUmVtYWluaW5nID0gbGVuZ3RoOworICAgIHNpemVfdCBtYWdpY1N0ckxlbiA9IDEyOworICAgIGlmICgobGVuZ3RoIDwgbWFnaWNTdHJMZW4pIHx8CisgICAgICAgIG1lbWNtcChkYXRhLCAiQW5kcm9pZDNEX2ZmIiwgbWFnaWNTdHJMZW4pKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBsb2NhbERhdGEgKz0gbWFnaWNTdHJMZW47CisgICAgbGVuZ3RoUmVtYWluaW5nIC09IG1hZ2ljU3RyTGVuOworCisgICAgLy8gTmV4dCB3ZSBnZXQgb3VyIGhlYWRlciBzaXplCisgICAgdWludDY0X3QgaGVhZGVyU2l6ZSA9IDA7CisgICAgaWYobGVuZ3RoUmVtYWluaW5nIDwgc2l6ZW9mKGhlYWRlclNpemUpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBtZW1jcHkoJmhlYWRlclNpemUsIGxvY2FsRGF0YSwgc2l6ZW9mKGhlYWRlclNpemUpKTsKKyAgICBsb2NhbERhdGEgKz0gc2l6ZW9mKGhlYWRlclNpemUpOworICAgIGxlbmd0aFJlbWFpbmluZyAtPSBzaXplb2YoaGVhZGVyU2l6ZSk7CisKKyAgICBMT0dFKCJMb2FkaW5nIGRhdGEsIGhlYWRlclNpemUgPSAlbGxpIiwgaGVhZGVyU2l6ZSk7CisKKyAgICBpZihsZW5ndGhSZW1haW5pbmcgPCBoZWFkZXJTaXplKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICB1aW50OF90ICpoZWFkZXJEYXRhID0gKHVpbnQ4X3QgKiltYWxsb2MoaGVhZGVyU2l6ZSk7CisgICAgaWYoIWhlYWRlckRhdGEpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIG1lbWNweShoZWFkZXJEYXRhLCBsb2NhbERhdGEsIGhlYWRlclNpemUpOworCisgICAgLy8gTm93IG9wZW4gdGhlIHN0cmVhbSB0byBwYXJzZSB0aGUgaGVhZGVyCisgICAgSVN0cmVhbSBoZWFkZXJTdHJlYW0oaGVhZGVyRGF0YSwgZmFsc2UpOworICAgIHBhcnNlSGVhZGVyKCZoZWFkZXJTdHJlYW0pOworCisgICAgZnJlZShoZWFkZXJEYXRhKTsKKworICAgIGxvY2FsRGF0YSArPSBoZWFkZXJTaXplOworICAgIGxlbmd0aFJlbWFpbmluZyAtPSBoZWFkZXJTaXplOworCisgICAgaWYobGVuZ3RoUmVtYWluaW5nIDwgc2l6ZW9mKG1EYXRhU2l6ZSkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIFJlYWQgdGhlIHNpemUgb2YgdGhlIGRhdGEKKyAgICBtZW1jcHkoJm1EYXRhU2l6ZSwgbG9jYWxEYXRhLCBzaXplb2YobURhdGFTaXplKSk7CisgICAgbG9jYWxEYXRhICs9IHNpemVvZihtRGF0YVNpemUpOworICAgIGxlbmd0aFJlbWFpbmluZyAtPSBzaXplb2YobURhdGFTaXplKTsKKworICAgIExPR0UoIkxvYWRpbmcgZGF0YSwgbURhdGFTaXplID0gJWxsaSIsIG1EYXRhU2l6ZSk7CisKKyAgICBpZihsZW5ndGhSZW1haW5pbmcgPCBtRGF0YVNpemUpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIFdlIHNob3VsZCBrbm93IGVub3VnaCB0byByZWFkIHRoZSBmaWxlIGluIGF0IHRoaXMgcG9pbnQuCisgICAgbUFsbG9jID0gbWFsbG9jKG1EYXRhU2l6ZSk7CisgICAgaWYgKCFtQWxsb2MpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBtRGF0YSA9ICh1aW50OF90ICopbUFsbG9jOworICAgIG1lbWNweShtQWxsb2MsIGxvY2FsRGF0YSwgbURhdGFTaXplKTsKKworICAgIG1SZWFkU3RyZWFtID0gbmV3IElTdHJlYW0obURhdGEsIG1Vc2U2NEJpdE9mZnNldHMpOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgRmlsZUEzRDo6bG9hZChGSUxFICpmKQogewogICAgIGNoYXIgbWFnaWNTdHJpbmdbMTJdOwogICAgIHNpemVfdCBsZW47CkBAIC00OSw0NyArMTc2LDM5IEBACiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICBMT0dFKCJmaWxlIG9wZW4gMiIpOwotICAgIGxlbiA9IGZyZWFkKCZtTWFqb3JWZXJzaW9uLCAxLCBzaXplb2YobU1ham9yVmVyc2lvbiksIGYpOwotICAgIGlmIChsZW4gIT0gc2l6ZW9mKG1NYWpvclZlcnNpb24pKSB7CisgICAgLy8gTmV4dCB0aGluZyBpcyB0aGUgc2l6ZSBvZiB0aGUgaGVhZGVyCisgICAgdWludDY0X3QgaGVhZGVyU2l6ZSA9IDA7CisgICAgbGVuID0gZnJlYWQoJmhlYWRlclNpemUsIDEsIHNpemVvZihoZWFkZXJTaXplKSwgZik7CisgICAgaWYgKGxlbiAhPSBzaXplb2YoaGVhZGVyU2l6ZSkgfHwgaGVhZGVyU2l6ZSA9PSAwKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICBMT0dFKCJmaWxlIG9wZW4gMyIpOwotICAgIGxlbiA9IGZyZWFkKCZtTWlub3JWZXJzaW9uLCAxLCBzaXplb2YobU1pbm9yVmVyc2lvbiksIGYpOwotICAgIGlmIChsZW4gIT0gc2l6ZW9mKG1NaW5vclZlcnNpb24pKSB7CisgICAgdWludDhfdCAqaGVhZGVyRGF0YSA9ICh1aW50OF90ICopbWFsbG9jKGhlYWRlclNpemUpOworICAgIGlmKCFoZWFkZXJEYXRhKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICBMT0dFKCJmaWxlIG9wZW4gNCIpOwotICAgIHVpbnQzMl90IGZsYWdzOwotICAgIGxlbiA9IGZyZWFkKCZmbGFncywgMSwgc2l6ZW9mKGZsYWdzKSwgZik7Ci0gICAgaWYgKGxlbiAhPSBzaXplb2YoZmxhZ3MpKSB7CisgICAgbGVuID0gZnJlYWQoaGVhZGVyRGF0YSwgMSwgaGVhZGVyU2l6ZSwgZik7CisgICAgaWYgKGxlbiAhPSBoZWFkZXJTaXplKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9Ci0gICAgbVVzZTY0Qml0T2Zmc2V0cyA9IChmbGFncyAmIDEpICE9IDA7CiAKLSAgICBMT0dFKCJmaWxlIG9wZW4gNjRiaXQgPSAlaSIsIG1Vc2U2NEJpdE9mZnNldHMpOworICAgIC8vIE5vdyBvcGVuIHRoZSBzdHJlYW0gdG8gcGFyc2UgdGhlIGhlYWRlcgorICAgIElTdHJlYW0gaGVhZGVyU3RyZWFtKGhlYWRlckRhdGEsIGZhbHNlKTsKKyAgICBwYXJzZUhlYWRlcigmaGVhZGVyU3RyZWFtKTsKIAotICAgIGlmIChtVXNlNjRCaXRPZmZzZXRzKSB7Ci0gICAgICAgIGxlbiA9IGZyZWFkKCZtRGF0YVNpemUsIDEsIHNpemVvZihtRGF0YVNpemUpLCBmKTsKLSAgICAgICAgaWYgKGxlbiAhPSBzaXplb2YobURhdGFTaXplKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgdWludDMyX3QgdG1wOwotICAgICAgICBsZW4gPSBmcmVhZCgmdG1wLCAxLCBzaXplb2YodG1wKSwgZik7Ci0gICAgICAgIGlmIChsZW4gIT0gc2l6ZW9mKHRtcCkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBtRGF0YVNpemUgPSB0bXA7CisgICAgZnJlZShoZWFkZXJEYXRhKTsKKworICAgIC8vIE5leHQgdGhpbmcgaXMgdGhlIHNpemUgb2YgdGhlIGhlYWRlcgorICAgIGxlbiA9IGZyZWFkKCZtRGF0YVNpemUsIDEsIHNpemVvZihtRGF0YVNpemUpLCBmKTsKKyAgICBpZiAobGVuICE9IHNpemVvZihtRGF0YVNpemUpIHx8IG1EYXRhU2l6ZSA9PSAwKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKICAgICBMT0dFKCJmaWxlIG9wZW4gc2l6ZSA9ICVsbGkiLCBtRGF0YVNpemUpOwogCiAgICAgLy8gV2Ugc2hvdWxkIGtub3cgZW5vdWdoIHRvIHJlYWQgdGhlIGZpbGUgaW4gYXQgdGhpcyBwb2ludC4KLSAgICBmc2VlayhmLCBTRUVLX1NFVCwgMCk7Ci0gICAgbUFsbG9jPSBtYWxsb2MobURhdGFTaXplKTsKKyAgICBtQWxsb2MgPSBtYWxsb2MobURhdGFTaXplKTsKICAgICBpZiAoIW1BbGxvYykgewogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQpAQCAtOTksMjgyICsyMTgsMjU4IEBACiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICBMT0dFKCJmaWxlIHN0YXJ0IHByb2Nlc3NpbmciKTsKLSAgICByZXR1cm4gcHJvY2Vzcyhyc2MpOworICAgIG1SZWFkU3RyZWFtID0gbmV3IElTdHJlYW0obURhdGEsIG1Vc2U2NEJpdE9mZnNldHMpOworCisgICAgTE9HRSgiSGVhZGVyIGlzIHJlYWQgYW4gc3RyZWFtIGluaXRpYWxpemVkIik7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKLWJvb2wgRmlsZUEzRDo6cHJvY2Vzc0luZGV4KENvbnRleHQgKnJzYywgQTNESW5kZXhFbnRyeSAqaWUpCi17Ci0gICAgYm9vbCByZXQgPSBmYWxzZTsKLSAgICBJTyBpbyhtRGF0YSArIGllLT5tT2Zmc2V0LCBtVXNlNjRCaXRPZmZzZXRzKTsKK3NpemVfdCBGaWxlQTNEOjpnZXROdW1JbmRleEVudHJpZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIG1JbmRleC5zaXplKCk7Cit9CiAKLSAgICBMT0dFKCJwcm9jZXNzIGluZGV4LCB0eXBlICVpIiwgaWUtPm1UeXBlKTsKLQotICAgIHN3aXRjaChpZS0+bVR5cGUpIHsKLSAgICBjYXNlIENIVU5LX0VMRU1FTlQ6Ci0gICAgICAgIHByb2Nlc3NDaHVua19FbGVtZW50KHJzYywgJmlvLCBpZSk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgQ0hVTktfRUxFTUVOVF9TT1VSQ0U6Ci0gICAgICAgIHByb2Nlc3NDaHVua19FbGVtZW50U291cmNlKHJzYywgJmlvLCBpZSk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgQ0hVTktfVkVSVElDSUVTOgotICAgICAgICBwcm9jZXNzQ2h1bmtfVmVydGljaWVzKHJzYywgJmlvLCBpZSk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgQ0hVTktfTUVTSDoKLSAgICAgICAgcHJvY2Vzc0NodW5rX01lc2gocnNjLCAmaW8sIGllKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBDSFVOS19QUklNSVRJVkU6Ci0gICAgICAgIHByb2Nlc3NDaHVua19QcmltaXRpdmUocnNjLCAmaW8sIGllKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgTE9HRSgiRmlsZUEzRCBVbmtub3duIGNodW5rIHR5cGUiKTsKLSAgICAgICAgYnJlYWs7Citjb25zdCBGaWxlQTNEOjpBM0RJbmRleEVudHJ5ICpGaWxlQTNEOjpnZXRJbmRleEVudHJ5KHNpemVfdCBpbmRleCkgY29uc3QgeworICAgIGlmKGluZGV4IDwgbUluZGV4LnNpemUoKSkgeworICAgICAgICByZXR1cm4gbUluZGV4W2luZGV4XTsKICAgICB9Ci0gICAgcmV0dXJuIChpZS0+bVJzT2JqICE9IE5VTEwpOworICAgIHJldHVybiBOVUxMOwogfQogCi1ib29sIEZpbGVBM0Q6OnByb2Nlc3MoQ29udGV4dCAqcnNjKQotewotICAgIExPR0UoInByb2Nlc3MiKTsKLSAgICBJTyBpbyhtRGF0YSArIDEyLCBtVXNlNjRCaXRPZmZzZXRzKTsKLSAgICBib29sIHJldCA9IHRydWU7Ci0KLSAgICAvLyBCdWlsZCB0aGUgaW5kZXggZmlyc3QKLSAgICBMT0dFKCJwcm9jZXNzIDEiKTsKLSAgICBpby5sb2FkVTMyKCk7IC8vIG1ham9yIHZlcnNpb24sIGFscmVhZHkgbG9hZGVkCi0gICAgaW8ubG9hZFUzMigpOyAvLyBtaW5vciB2ZXJzaW9uLCBhbHJlYWR5IGxvYWRlZAotICAgIExPR0UoInByb2Nlc3MgMiIpOwotCi0gICAgaW8ubG9hZFUzMigpOyAgLy8gZmxhZ3MKLSAgICBpby5sb2FkT2Zmc2V0KCk7IC8vIGZpbGVzaXplLCBhbHJlYWR5IGxvYWRlZC4KLSAgICBMT0dFKCJwcm9jZXNzIDQiKTsKLSAgICB1aW50NjRfdCBtSW5kZXhPZmZzZXQgPSBpby5sb2FkT2Zmc2V0KCk7Ci0gICAgdWludDY0X3QgbVN0cmluZ09mZnNldCA9IGlvLmxvYWRPZmZzZXQoKTsKLQotICAgIExPR0UoInByb2Nlc3MgbUluZGV4T2Zmc2V0PSAweCUwMTZsbHgiLCBtSW5kZXhPZmZzZXQpOwotICAgIExPR0UoInByb2Nlc3MgbVN0cmluZ09mZnNldD0gMHglMDE2bGx4IiwgbVN0cmluZ09mZnNldCk7Ci0KLSAgICBJTyBpbmRleChtRGF0YSArIG1JbmRleE9mZnNldCwgbVVzZTY0Qml0T2Zmc2V0cyk7Ci0gICAgSU8gc3RyaW5nVGFibGUobURhdGEgKyBtU3RyaW5nT2Zmc2V0LCBtVXNlNjRCaXRPZmZzZXRzKTsKLQotICAgIHVpbnQzMl90IHN0cmluZ0VudHJ5Q291bnQgPSBzdHJpbmdUYWJsZS5sb2FkVTMyKCk7Ci0gICAgTE9HRSgic3RyaW5nRW50cnlDb3VudCAlaSIsIHN0cmluZ0VudHJ5Q291bnQpOwotICAgIG1TdHJpbmdzLnNldENhcGFjaXR5KHN0cmluZ0VudHJ5Q291bnQpOwotICAgIG1TdHJpbmdJbmRleFZhbHVlcy5zZXRDYXBhY2l0eShzdHJpbmdFbnRyeUNvdW50KTsKLSAgICBpZiAoc3RyaW5nRW50cnlDb3VudCkgewotICAgICAgICB1aW50MzJfdCBzdHJpbmdUeXBlID0gc3RyaW5nVGFibGUubG9hZFUzMigpOwotICAgICAgICBMT0dFKCJzdHJpbmdUeXBlICVpIiwgc3RyaW5nVHlwZSk7Ci0gICAgICAgIHJzQXNzZXJ0KHN0cmluZ1R5cGU9PTApOwotICAgICAgICBmb3IgKHVpbnQzMl90IGN0ID0gMDsgY3QgPCBzdHJpbmdFbnRyeUNvdW50OyBjdCsrKSB7Ci0gICAgICAgICAgICB1aW50NjRfdCBvZmZzZXQgPSBzdHJpbmdUYWJsZS5sb2FkT2Zmc2V0KCk7Ci0gICAgICAgICAgICBMT0dFKCJzdHJpbmcgb2Zmc2V0IDB4JTAxNmxseCIsIG9mZnNldCk7Ci0gICAgICAgICAgICBJTyB0bXAobURhdGEgKyBvZmZzZXQsIG1Vc2U2NEJpdE9mZnNldHMpOwotICAgICAgICAgICAgU3RyaW5nOCBzOwotICAgICAgICAgICAgdG1wLmxvYWRTdHJpbmcoJnMpOwotICAgICAgICAgICAgTE9HRSgic3RyaW5nICVzIiwgcy5zdHJpbmcoKSk7Ci0gICAgICAgICAgICBtU3RyaW5ncy5wdXNoKHMpOwotICAgICAgICB9CitPYmplY3RCYXNlICpGaWxlQTNEOjppbml0aWFsaXplRnJvbUVudHJ5KHNpemVfdCBpbmRleCkgeworICAgIGlmKGluZGV4ID49IG1JbmRleC5zaXplKCkpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCi0gICAgTE9HRSgic3RyaW5ncyBkb25lIik7Ci0gICAgdWludDMyX3QgaW5kZXhFbnRyeUNvdW50ID0gaW5kZXgubG9hZFUzMigpOwotICAgIExPR0UoImluZGV4IGNvdW50ICVpIiwgaW5kZXhFbnRyeUNvdW50KTsKLSAgICBtSW5kZXguc2V0Q2FwYWNpdHkoaW5kZXhFbnRyeUNvdW50KTsKLSAgICBmb3IgKHVpbnQzMl90IGN0ID0gMDsgY3QgPCBpbmRleEVudHJ5Q291bnQ7IGN0KyspIHsKLSAgICAgICAgQTNESW5kZXhFbnRyeSBlOwotICAgICAgICB1aW50MzJfdCBzdHJpbmdJbmRleCA9IGluZGV4LmxvYWRVMzIoKTsKLSAgICAgICAgTE9HRSgiaW5kZXggJWkiLCBjdCk7Ci0gICAgICAgIExPR0UoIiAgc3RyaW5nIGluZGV4ICVpIiwgc3RyaW5nSW5kZXgpOwotICAgICAgICBlLm1UeXBlID0gKEEzRENodW5rVHlwZSlpbmRleC5sb2FkVTMyKCk7Ci0gICAgICAgIExPR0UoIiAgdHlwZSAlaSIsIGUubVR5cGUpOwotICAgICAgICBlLm1PZmZzZXQgPSBpbmRleC5sb2FkT2Zmc2V0KCk7Ci0gICAgICAgIExPR0UoIiAgb2Zmc2V0IDB4JTAxNmxseCIsIGUubU9mZnNldCk7Ci0KLSAgICAgICAgaWYgKHN0cmluZ0luZGV4ICYmIChzdHJpbmdJbmRleCA8IG1TdHJpbmdzLnNpemUoKSkpIHsKLSAgICAgICAgICAgIGUubUlEID0gbVN0cmluZ3Nbc3RyaW5nSW5kZXhdOwotICAgICAgICAgICAgbVN0cmluZ0luZGV4VmFsdWVzLmVkaXRJdGVtQXQoc3RyaW5nSW5kZXgpID0gY3Q7Ci0gICAgICAgICAgICBMT0dFKCIgIGlkICVzIiwgZS5tSUQuc3RyaW5nKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgbUluZGV4LnB1c2goZSk7Ci0gICAgfQotICAgIExPR0UoImluZGV4IGRvbmUiKTsKLQotICAgIC8vIEF0IHRoaXMgcG9pbnQgdGhlIGluZGV4IHNob3VsZCBiZSBmdWxseSBwb3B1bGF0ZWQuCi0gICAgLy8gV2UgY2FuIG5vdyB3YWxrIHRob3VnaCBpdCBhbmQgbG9hZCBhbGwgdGhlIG9iamVjdHMuCi0gICAgZm9yICh1aW50MzJfdCBjdCA9IDA7IGN0IDwgaW5kZXhFbnRyeUNvdW50OyBjdCsrKSB7Ci0gICAgICAgIExPR0UoInByb2Nlc3NpbmcgaW5kZXggZW50cnkgJWkiLCBjdCk7Ci0gICAgICAgIHByb2Nlc3NJbmRleChyc2MsICZtSW5kZXguZWRpdEl0ZW1BdChjdCkpOworICAgIEZpbGVBM0Q6OkEzREluZGV4RW50cnkgKmVudHJ5ID0gbUluZGV4W2luZGV4XTsKKyAgICBpZighZW50cnkpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCi0gICAgcmV0dXJuIHJldDsKLX0KLQotCi1GaWxlQTNEOjpJTzo6SU8oY29uc3QgdWludDhfdCAqYnVmLCBib29sIHVzZTY0KQotewotICAgIG1EYXRhID0gYnVmOwotICAgIG1Qb3MgPSAwOwotICAgIG1Vc2U2NCA9IHVzZTY0OwotfQotCi11aW50NjRfdCBGaWxlQTNEOjpJTzo6bG9hZE9mZnNldCgpCi17Ci0gICAgdWludDY0X3QgdG1wOwotICAgIGlmIChtVXNlNjQpIHsKLSAgICAgICAgbVBvcyA9IChtUG9zICsgNykgJiAofjcpOwotICAgICAgICB0bXAgPSByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ2NF90ICo+KCZtRGF0YVttUG9zXSlbMF07Ci0gICAgICAgIG1Qb3MgKz0gc2l6ZW9mKHVpbnQ2NF90KTsKLSAgICAgICAgcmV0dXJuIHRtcDsKKyAgICBpZihlbnRyeS0+bVJzT2JqKSB7CisgICAgICAgIGVudHJ5LT5tUnNPYmotPmluY1VzZXJSZWYoKTsKKyAgICAgICAgcmV0dXJuIGVudHJ5LT5tUnNPYmo7CiAgICAgfQotICAgIHJldHVybiBsb2FkVTMyKCk7Ci19CiAKLXZvaWQgRmlsZUEzRDo6SU86OmxvYWRTdHJpbmcoU3RyaW5nOCAqcykKLXsKLSAgICBMT0dFKCJsb2FkU3RyaW5nIik7Ci0gICAgdWludDMyX3QgbGVuID0gbG9hZFUzMigpOwotICAgIExPR0UoImxvYWRTdHJpbmcgbGVuICVpIiwgbGVuKTsKLSAgICBzLT5zZXRUbygoY29uc3QgY2hhciAqKSZtRGF0YVttUG9zXSwgbGVuKTsKLSAgICBtUG9zICs9IGxlbjsKLX0KLQotCi12b2lkIEZpbGVBM0Q6OnByb2Nlc3NDaHVua19NZXNoKENvbnRleHQgKnJzYywgSU8gKmlvLCBBM0RJbmRleEVudHJ5ICppZSkKLXsKLSAgICBNZXNoICogbSA9IG5ldyBNZXNoKHJzYyk7Ci0KLSAgICBtLT5tUHJpbWl0aXZlc0NvdW50ID0gaW8tPmxvYWRVMzIoKTsKLSAgICBtLT5tUHJpbWl0aXZlcyA9IG5ldyBNZXNoOjpQcmltaXRpdmVfdCAqW20tPm1QcmltaXRpdmVzQ291bnRdOwotCi0gICAgZm9yICh1aW50MzJfdCBjdCA9IDA7IGN0IDwgbS0+bVByaW1pdGl2ZXNDb3VudDsgY3QrKykgewotICAgICAgICB1aW50MzJfdCBpbmRleCA9IGlvLT5sb2FkVTMyKCk7Ci0KLSAgICAgICAgbS0+bVByaW1pdGl2ZXNbY3RdID0gKE1lc2g6OlByaW1pdGl2ZV90ICopbUluZGV4W2luZGV4XS5tUnNPYmo7Ci0gICAgfQotICAgIGllLT5tUnNPYmogPSBtOwotfQotCi12b2lkIEZpbGVBM0Q6OnByb2Nlc3NDaHVua19QcmltaXRpdmUoQ29udGV4dCAqcnNjLCBJTyAqaW8sIEEzREluZGV4RW50cnkgKmllKQotewotICAgIE1lc2g6OlByaW1pdGl2ZV90ICogcCA9IG5ldyBNZXNoOjpQcmltaXRpdmVfdDsKLQotICAgIHAtPm1JbmRleENvdW50ID0gaW8tPmxvYWRVMzIoKTsKLSAgICB1aW50MzJfdCB2ZXJ0SWR4ID0gaW8tPmxvYWRVMzIoKTsKLSAgICBwLT5tUmVzdGFydENvdW50cyA9IGlvLT5sb2FkVTE2KCk7Ci0gICAgdWludDMyX3QgYml0cyA9IGlvLT5sb2FkVTgoKTsKLSAgICBwLT5tVHlwZSA9IChSc1ByaW1pdGl2ZSlpby0+bG9hZFU4KCk7Ci0KLSAgICBMT0dFKCJwcm9jZXNzQ2h1bmtfUHJpbWl0aXZlIGNvdW50ICVpLCBiaXRzICVpIiwgcC0+bUluZGV4Q291bnQsIGJpdHMpOwotCi0gICAgcC0+bVZlcnRpY2llcyA9IChNZXNoOjpWZXJ0aWNpZXNfdCAqKW1JbmRleFt2ZXJ0SWR4XS5tUnNPYmo7Ci0KLSAgICBwLT5tSW5kaWNpZXMgPSBuZXcgdWludDE2X3RbcC0+bUluZGV4Q291bnRdOwotICAgIGZvciAodWludDMyX3QgY3QgPSAwOyBjdCA8IHAtPm1JbmRleENvdW50OyBjdCsrKSB7Ci0gICAgICAgIHN3aXRjaChiaXRzKSB7Ci0gICAgICAgIGNhc2UgODoKLSAgICAgICAgICAgIHAtPm1JbmRpY2llc1tjdF0gPSBpby0+bG9hZFU4KCk7CisgICAgLy8gU2VlayB0byB0aGUgYmVnaW5uaW5nIG9mIG9iamVjdAorICAgIG1SZWFkU3RyZWFtLT5yZXNldChlbnRyeS0+bU9mZnNldCk7CisgICAgc3dpdGNoIChlbnRyeS0+bVR5cGUpIHsKKyAgICAgICAgY2FzZSBSU19BM0RfQ0xBU1NfSURfVU5LTk9XTjoKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBjYXNlIFJTX0EzRF9DTEFTU19JRF9NRVNIOgorICAgICAgICAgICAgZW50cnktPm1Sc09iaiA9IE1lc2g6OmNyZWF0ZUZyb21TdHJlYW0obVJTQywgbVJlYWRTdHJlYW0pOwogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTY6Ci0gICAgICAgICAgICBwLT5tSW5kaWNpZXNbY3RdID0gaW8tPmxvYWRVMTYoKTsKKyAgICAgICAgY2FzZSBSU19BM0RfQ0xBU1NfSURfU0lNUExFX01FU0g6CisgICAgICAgICAgICBlbnRyeS0+bVJzT2JqID0gU2ltcGxlTWVzaDo6Y3JlYXRlRnJvbVN0cmVhbShtUlNDLCBtUmVhZFN0cmVhbSk7CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAzMjoKLSAgICAgICAgICAgIHAtPm1JbmRpY2llc1tjdF0gPSBpby0+bG9hZFUzMigpOworICAgICAgICBjYXNlIFJTX0EzRF9DTEFTU19JRF9UWVBFOgorICAgICAgICAgICAgZW50cnktPm1Sc09iaiA9IFR5cGU6OmNyZWF0ZUZyb21TdHJlYW0obVJTQywgbVJlYWRTdHJlYW0pOwogICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlNfQTNEX0NMQVNTX0lEX0VMRU1FTlQ6CisgICAgICAgICAgICBlbnRyeS0+bVJzT2JqID0gRWxlbWVudDo6Y3JlYXRlRnJvbVN0cmVhbShtUlNDLCBtUmVhZFN0cmVhbSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSU19BM0RfQ0xBU1NfSURfQUxMT0NBVElPTjoKKyAgICAgICAgICAgIGVudHJ5LT5tUnNPYmogPSBBbGxvY2F0aW9uOjpjcmVhdGVGcm9tU3RyZWFtKG1SU0MsIG1SZWFkU3RyZWFtKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJTX0EzRF9DTEFTU19JRF9QUk9HUkFNX1ZFUlRFWDoKKyAgICAgICAgICAgIGVudHJ5LT5tUnNPYmogPSBQcm9ncmFtVmVydGV4OjpjcmVhdGVGcm9tU3RyZWFtKG1SU0MsIG1SZWFkU3RyZWFtKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJTX0EzRF9DTEFTU19JRF9QUk9HUkFNX1JBU1RFUjoKKyAgICAgICAgICAgIGVudHJ5LT5tUnNPYmogPSBQcm9ncmFtUmFzdGVyOjpjcmVhdGVGcm9tU3RyZWFtKG1SU0MsIG1SZWFkU3RyZWFtKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJTX0EzRF9DTEFTU19JRF9QUk9HUkFNX0ZSQUdNRU5UOgorICAgICAgICAgICAgZW50cnktPm1Sc09iaiA9IFByb2dyYW1GcmFnbWVudDo6Y3JlYXRlRnJvbVN0cmVhbShtUlNDLCBtUmVhZFN0cmVhbSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSU19BM0RfQ0xBU1NfSURfUFJPR1JBTV9TVE9SRToKKyAgICAgICAgICAgIGVudHJ5LT5tUnNPYmogPSBQcm9ncmFtU3RvcmU6OmNyZWF0ZUZyb21TdHJlYW0obVJTQywgbVJlYWRTdHJlYW0pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlNfQTNEX0NMQVNTX0lEX1NBTVBMRVI6CisgICAgICAgICAgICBlbnRyeS0+bVJzT2JqID0gU2FtcGxlcjo6Y3JlYXRlRnJvbVN0cmVhbShtUlNDLCBtUmVhZFN0cmVhbSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSU19BM0RfQ0xBU1NfSURfQU5JTUFUSU9OOgorICAgICAgICAgICAgZW50cnktPm1Sc09iaiA9IEFuaW1hdGlvbjo6Y3JlYXRlRnJvbVN0cmVhbShtUlNDLCBtUmVhZFN0cmVhbSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSU19BM0RfQ0xBU1NfSURfTElHSFQ6CisgICAgICAgICAgICBlbnRyeS0+bVJzT2JqID0gTGlnaHQ6OmNyZWF0ZUZyb21TdHJlYW0obVJTQywgbVJlYWRTdHJlYW0pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlNfQTNEX0NMQVNTX0lEX0FEQVBURVJfMUQ6CisgICAgICAgICAgICBlbnRyeS0+bVJzT2JqID0gQWRhcHRlcjFEOjpjcmVhdGVGcm9tU3RyZWFtKG1SU0MsIG1SZWFkU3RyZWFtKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJTX0EzRF9DTEFTU19JRF9BREFQVEVSXzJEOgorICAgICAgICAgICAgZW50cnktPm1Sc09iaiA9IEFkYXB0ZXIyRDo6Y3JlYXRlRnJvbVN0cmVhbShtUlNDLCBtUmVhZFN0cmVhbSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSU19BM0RfQ0xBU1NfSURfU0NSSVBUX0M6CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYoZW50cnktPm1Sc09iaikgeworICAgICAgICBlbnRyeS0+bVJzT2JqLT5pbmNVc2VyUmVmKCk7CisgICAgfQorICAgIHJldHVybiBlbnRyeS0+bVJzT2JqOworfQorCitib29sIEZpbGVBM0Q6OndyaXRlRmlsZShjb25zdCBjaGFyICpmaWxlbmFtZSkKK3sKKyAgICBpZighbVdyaXRlU3RyZWFtKSB7CisgICAgICAgIExPR0UoIk5vIG9iamVjdHMgdG8gd3JpdGVcbiIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmKG1Xcml0ZVN0cmVhbS0+Z2V0UG9zKCkgPT0gMCkgeworICAgICAgICBMT0dFKCJObyBvYmplY3RzIHRvIHdyaXRlXG4iKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEZJTEUgKndyaXRlSGFuZGxlID0gZm9wZW4oZmlsZW5hbWUsICJ3YiIpOworICAgIGlmKCF3cml0ZUhhbmRsZSkgeworICAgICAgICBMT0dFKCJDb3VsZG4ndCBvcGVuIHRoZSBmaWxlIGZvciB3cml0aW5nXG4iKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIE9wZW4gYSBuZXcgc3RyZWFtIHRvIG1ha2Ugd3JpdGluZyB0aGUgaGVhZGVyIGVhc2llcgorICAgIE9TdHJlYW0gaGVhZGVyU3RyZWFtKDUqMTAyNCwgZmFsc2UpOworICAgIGhlYWRlclN0cmVhbS5hZGRVMzIobU1ham9yVmVyc2lvbik7CisgICAgaGVhZGVyU3RyZWFtLmFkZFUzMihtTWlub3JWZXJzaW9uKTsKKyAgICB1aW50MzJfdCBpczY0Qml0ID0gMDsKKyAgICBoZWFkZXJTdHJlYW0uYWRkVTMyKGlzNjRCaXQpOworCisgICAgdWludDMyX3Qgd3JpdGVJbmRleFNpemUgPSBtV3JpdGVJbmRleC5zaXplKCk7CisgICAgaGVhZGVyU3RyZWFtLmFkZFUzMih3cml0ZUluZGV4U2l6ZSk7CisgICAgZm9yKHVpbnQzMl90IGkgPSAwOyBpIDwgd3JpdGVJbmRleFNpemU7IGkgKyspIHsKKyAgICAgICAgaGVhZGVyU3RyZWFtLmFkZFN0cmluZygmbVdyaXRlSW5kZXhbaV0tPm1PYmplY3ROYW1lKTsKKyAgICAgICAgaGVhZGVyU3RyZWFtLmFkZFUzMigodWludDMyX3QpbVdyaXRlSW5kZXhbaV0tPm1UeXBlKTsKKyAgICAgICAgaWYobVVzZTY0Qml0T2Zmc2V0cyl7CisgICAgICAgICAgICBoZWFkZXJTdHJlYW0uYWRkT2Zmc2V0KG1Xcml0ZUluZGV4W2ldLT5tT2Zmc2V0KTsKKyAgICAgICAgICAgIGhlYWRlclN0cmVhbS5hZGRPZmZzZXQobVdyaXRlSW5kZXhbaV0tPm1MZW5ndGgpOwogICAgICAgICB9Ci0gICAgICAgIExPR0UoIiAgaWR4ICVpIiwgcC0+bUluZGljaWVzW2N0XSk7Ci0gICAgfQotCi0gICAgaWYgKHAtPm1SZXN0YXJ0Q291bnRzKSB7Ci0gICAgICAgIHAtPm1SZXN0YXJ0cyA9IG5ldyB1aW50MTZfdFtwLT5tUmVzdGFydENvdW50c107Ci0gICAgICAgIGZvciAodWludDMyX3QgY3QgPSAwOyBjdCA8IHAtPm1SZXN0YXJ0Q291bnRzOyBjdCsrKSB7Ci0gICAgICAgICAgICBzd2l0Y2goYml0cykgewotICAgICAgICAgICAgY2FzZSA4OgotICAgICAgICAgICAgICAgIHAtPm1SZXN0YXJ0c1tjdF0gPSBpby0+bG9hZFU4KCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDE2OgotICAgICAgICAgICAgICAgIHAtPm1SZXN0YXJ0c1tjdF0gPSBpby0+bG9hZFUxNigpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAzMjoKLSAgICAgICAgICAgICAgICBwLT5tUmVzdGFydHNbY3RdID0gaW8tPmxvYWRVMzIoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIExPR0UoIiAgaWR4ICVpIiwgcC0+bVJlc3RhcnRzW2N0XSk7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgdWludDMyX3Qgb2Zmc2V0ID0gKHVpbnQzMl90KW1Xcml0ZUluZGV4W2ldLT5tT2Zmc2V0OworICAgICAgICAgICAgaGVhZGVyU3RyZWFtLmFkZFUzMihvZmZzZXQpOworICAgICAgICAgICAgb2Zmc2V0ID0gKHVpbnQzMl90KW1Xcml0ZUluZGV4W2ldLT5tTGVuZ3RoOworICAgICAgICAgICAgaGVhZGVyU3RyZWFtLmFkZFUzMihvZmZzZXQpOwogICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcC0+bVJlc3RhcnRzID0gTlVMTDsKICAgICB9CiAKLSAgICBpZS0+bVJzT2JqID0gcDsKKyAgICAvLyBXcml0ZSBvdXIgbWFnaWMgc3RyaW5nIHNvIHdlIGtub3cgd2UgYXJlIHJlYWRpbmcgdGhlIHJpZ2h0IGZpbGUKKyAgICBTdHJpbmc4IG1hZ2ljU3RyaW5nKEEzRF9NQUdJQ19LRVkpOworICAgIGZ3cml0ZShtYWdpY1N0cmluZy5zdHJpbmcoKSwgc2l6ZW9mKGNoYXIpLCBtYWdpY1N0cmluZy5zaXplKCksIHdyaXRlSGFuZGxlKTsKKworICAgIC8vIFN0b3JlIHRoZSBzaXplIG9mIHRoZSBoZWFkZXIgdG8gbWFrZSBpdCBlYXNpZXIgdG8gcGFyc2Ugd2hlbiB3ZSByZWFkIGl0CisgICAgdWludDY0X3QgaGVhZGVyU2l6ZSA9IGhlYWRlclN0cmVhbS5nZXRQb3MoKTsKKyAgICBmd3JpdGUoJmhlYWRlclNpemUsIHNpemVvZihoZWFkZXJTaXplKSwgMSwgd3JpdGVIYW5kbGUpOworCisgICAgLy8gTm93IHdyaXRlIG91ciBoZWFkZXIKKyAgICBmd3JpdGUoaGVhZGVyU3RyZWFtLmdldFB0cigpLCBzaXplb2YodWludDhfdCksIGhlYWRlclN0cmVhbS5nZXRQb3MoKSwgd3JpdGVIYW5kbGUpOworCisgICAgLy8gTm93IHdyaXRlIHRoZSBzaXplIG9mIHRoZSBkYXRhIHBhcnQgb2YgdGhlIGZpbGUgZm9yIGVhc2llciBwYXJzaW5nIGxhdGVyCisgICAgdWludDY0X3QgZmlsZURhdGFTaXplID0gbVdyaXRlU3RyZWFtLT5nZXRQb3MoKTsKKyAgICBmd3JpdGUoJmZpbGVEYXRhU2l6ZSwgc2l6ZW9mKGZpbGVEYXRhU2l6ZSksIDEsIHdyaXRlSGFuZGxlKTsKKworICAgIGZ3cml0ZShtV3JpdGVTdHJlYW0tPmdldFB0cigpLCBzaXplb2YodWludDhfdCksIG1Xcml0ZVN0cmVhbS0+Z2V0UG9zKCksIHdyaXRlSGFuZGxlKTsKKworICAgIGludCBzdGF0dXMgPSBmY2xvc2Uod3JpdGVIYW5kbGUpOworCisgICAgaWYoc3RhdHVzICE9IDApIHsKKyAgICAgICAgTE9HRSgiQ291bGRuJ3QgY2xvc2UgZmlsZVxuIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAotdm9pZCBGaWxlQTNEOjpwcm9jZXNzQ2h1bmtfVmVydGljaWVzKENvbnRleHQgKnJzYywgSU8gKmlvLCBBM0RJbmRleEVudHJ5ICppZSkKLXsKLSAgICBNZXNoOjpWZXJ0aWNpZXNfdCAqY3YgPSBuZXcgTWVzaDo6VmVydGljaWVzX3Q7Ci0gICAgY3YtPm1BbGxvY2F0aW9uQ291bnQgPSBpby0+bG9hZFUzMigpOwotICAgIGN2LT5tQWxsb2NhdGlvbnMgPSBuZXcgQWxsb2NhdGlvbiAqW2N2LT5tQWxsb2NhdGlvbkNvdW50XTsKLSAgICBMT0dFKCJwcm9jZXNzQ2h1bmtfVmVydGljaWVzIGNvdW50ICVpIiwgY3YtPm1BbGxvY2F0aW9uQ291bnQpOwotICAgIGZvciAodWludDMyX3QgY3QgPSAwOyBjdCA8IGN2LT5tQWxsb2NhdGlvbkNvdW50OyBjdCsrKSB7Ci0gICAgICAgIHVpbnQzMl90IGkgPSBpby0+bG9hZFUzMigpOwotICAgICAgICBjdi0+bUFsbG9jYXRpb25zW2N0XSA9IChBbGxvY2F0aW9uICopbUluZGV4W2ldLm1Sc09iajsKLSAgICAgICAgTE9HRSgiICBpZHggJWkiLCBpKTsKK3ZvaWQgRmlsZUEzRDo6YXBwZW5kVG9GaWxlKE9iamVjdEJhc2UgKm9iaikgeworICAgIGlmKCFvYmopIHsKKyAgICAgICAgcmV0dXJuOwogICAgIH0KLSAgICBpZS0+bVJzT2JqID0gY3Y7Ci19Ci0KLXZvaWQgRmlsZUEzRDo6cHJvY2Vzc0NodW5rX0VsZW1lbnQoQ29udGV4dCAqcnNjLCBJTyAqaW8sIEEzREluZGV4RW50cnkgKmllKQotewotICAgIC8qCi0gICAgcnNpX0VsZW1lbnRCZWdpbihyc2MpOwotCi0gICAgdWludDMyX3QgY291bnQgPSBpby0+bG9hZFUzMigpOwotICAgIExPR0UoInByb2Nlc3NDaHVua19FbGVtZW50IGNvdW50ICVpIiwgY291bnQpOwotICAgIHdoaWxlIChjb3VudC0tKSB7Ci0gICAgICAgIFJzRGF0YUtpbmQgZGsgPSAoUnNEYXRhS2luZClpby0+bG9hZFU4KCk7Ci0gICAgICAgIFJzRGF0YVR5cGUgZHQgPSAoUnNEYXRhVHlwZSlpby0+bG9hZFU4KCk7Ci0gICAgICAgIHVpbnQzMl90IGJpdHMgPSBpby0+bG9hZFU4KCk7Ci0gICAgICAgIGJvb2wgaXNOb3JtID0gaW8tPmxvYWRVOCgpICE9IDA7Ci0gICAgICAgIExPR0UoIiAgJWkgJWkgJWkgJWkiLCBkaywgZHQsIGJpdHMsIGlzTm9ybSk7Ci0gICAgICAgIHJzaV9FbGVtZW50QWRkKHJzYywgZGssIGR0LCBpc05vcm0sIGJpdHMsIDApOworICAgIGlmKCFtV3JpdGVTdHJlYW0pIHsKKyAgICAgICAgY29uc3QgdWludDY0X3QgaW5pdGlhbFN0cmVhbVNpemUgPSAyNTYqMTAyNDsKKyAgICAgICAgbVdyaXRlU3RyZWFtID0gbmV3IE9TdHJlYW0oaW5pdGlhbFN0cmVhbVNpemUsIGZhbHNlKTsKICAgICB9Ci0gICAgTE9HRSgicHJvY2Vzc0NodW5rX0VsZW1lbnQgY3JlYXRlIik7Ci0gICAgaWUtPm1Sc09iaiA9IHJzaV9FbGVtZW50Q3JlYXRlKHJzYyk7Ci0gICAgKi8KLX0KLQotdm9pZCBGaWxlQTNEOjpwcm9jZXNzQ2h1bmtfRWxlbWVudFNvdXJjZShDb250ZXh0ICpyc2MsIElPICppbywgQTNESW5kZXhFbnRyeSAqaWUpCi17Ci0gICAgdWludDMyX3QgaW5kZXggPSBpby0+bG9hZFUzMigpOwotICAgIHVpbnQzMl90IGNvdW50ID0gaW8tPmxvYWRVMzIoKTsKLQotICAgIExPR0UoInByb2Nlc3NDaHVua19FbGVtZW50U291cmNlIGNvdW50ICVpLCBpbmRleCAlaSIsIGNvdW50LCBpbmRleCk7Ci0KLSAgICBSc0VsZW1lbnQgZSA9IChSc0VsZW1lbnQpbUluZGV4W2luZGV4XS5tUnNPYmo7Ci0KLSAgICBSc0FsbG9jYXRpb24gYSA9IHJzaV9BbGxvY2F0aW9uQ3JlYXRlU2l6ZWQocnNjLCBlLCBjb3VudCk7Ci0gICAgQWxsb2NhdGlvbiAqIGFsbG9jID0gc3RhdGljX2Nhc3Q8QWxsb2NhdGlvbiAqPihhKTsKLQotICAgIGZsb2F0ICogZGF0YSA9IChmbG9hdCAqKWFsbG9jLT5nZXRQdHIoKTsKLSAgICB3aGlsZShjb3VudC0tKSB7Ci0gICAgICAgICpkYXRhID0gaW8tPmxvYWRGKCk7Ci0gICAgICAgIExPR0UoIiAgJWYiLCAqZGF0YSk7Ci0gICAgICAgIGRhdGErKzsKLSAgICB9Ci0gICAgaWUtPm1Sc09iaiA9IGFsbG9jOworICAgIEEzREluZGV4RW50cnkgKmluZGV4RW50cnkgPSBuZXcgQTNESW5kZXhFbnRyeSgpOworICAgIGluZGV4RW50cnktPm1PYmplY3ROYW1lLnNldFRvKG9iai0+Z2V0TmFtZSgpKTsKKyAgICBpbmRleEVudHJ5LT5tVHlwZSA9IG9iai0+Z2V0Q2xhc3NJZCgpOworICAgIGluZGV4RW50cnktPm1PZmZzZXQgPSBtV3JpdGVTdHJlYW0tPmdldFBvcygpOworICAgIGluZGV4RW50cnktPm1Sc09iaiA9IG9iajsKKyAgICBtV3JpdGVJbmRleC5wdXNoKGluZGV4RW50cnkpOworICAgIG9iai0+c2VyaWFsaXplKG1Xcml0ZVN0cmVhbSk7CisgICAgaW5kZXhFbnRyeS0+bUxlbmd0aCA9IG1Xcml0ZVN0cmVhbS0+Z2V0UG9zKCkgLSBpbmRleEVudHJ5LT5tT2Zmc2V0OworICAgIG1Xcml0ZVN0cmVhbS0+YWxpZ24oNCk7CiB9CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSByZW5kZXJzY3JpcHQgewogCit2b2lkIHJzaV9GaWxlQTNER2V0TnVtSW5kZXhFbnRyaWVzKENvbnRleHQgKnJzYywgaW50MzJfdCAqbnVtRW50cmllcywgUnNGaWxlIGZpbGUpCit7CisgICAgRmlsZUEzRCAqZmEzZCA9IHN0YXRpY19jYXN0PEZpbGVBM0QgKj4oZmlsZSk7CisKKyAgICBpZihmYTNkKSB7CisgICAgICAgICpudW1FbnRyaWVzID0gZmEzZC0+Z2V0TnVtSW5kZXhFbnRyaWVzKCk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAqbnVtRW50cmllcyA9IDA7CisgICAgfQorfQorCit2b2lkIHJzaV9GaWxlQTNER2V0SW5kZXhFbnRyaWVzKENvbnRleHQgKnJzYywgUnNGaWxlSW5kZXhFbnRyeSAqZmlsZUVudHJpZXMsIHVpbnQzMl90IG51bUVudHJpZXMsIFJzRmlsZSBmaWxlKQoreworICAgIEZpbGVBM0QgKmZhM2QgPSBzdGF0aWNfY2FzdDxGaWxlQTNEICo+KGZpbGUpOworCisgICAgaWYoIWZhM2QpIHsKKyAgICAgICAgTE9HRSgiQ2FuJ3QgbG9hZCBpbmRleCBlbnRyaWVzLiBObyB2YWxpZCBmaWxlIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB1aW50MzJfdCBudW1GaWxlRW50cmllcyA9IGZhM2QtPmdldE51bUluZGV4RW50cmllcygpOworICAgIGlmKG51bUZpbGVFbnRyaWVzICE9IG51bUVudHJpZXMgfHwgbnVtRW50cmllcyA9PSAwIHx8IGZpbGVFbnRyaWVzID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiQ2FuJ3QgbG9hZCBpbmRleCBlbnRyaWVzLiBJbnZhbGlkIG51bWJlciByZXF1ZXN0ZWQiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGZvcih1aW50MzJfdCBpID0gMDsgaSA8IG51bUZpbGVFbnRyaWVzOyBpICsrKSB7CisgICAgICAgIGNvbnN0IEZpbGVBM0Q6OkEzREluZGV4RW50cnkgKmVudHJ5ID0gZmEzZC0+Z2V0SW5kZXhFbnRyeShpKTsKKyAgICAgICAgZmlsZUVudHJpZXNbaV0uY2xhc3NJRCA9IGVudHJ5LT5nZXRUeXBlKCk7CisgICAgICAgIGZpbGVFbnRyaWVzW2ldLm9iamVjdE5hbWUgPSBlbnRyeS0+Z2V0T2JqZWN0TmFtZSgpLnN0cmluZygpOworICAgIH0KKworfQorCitSc09iamVjdEJhc2UgcnNpX0ZpbGVBM0RHZXRFbnRyeUJ5SW5kZXgoQ29udGV4dCAqcnNjLCB1aW50MzJfdCBpbmRleCwgUnNGaWxlIGZpbGUpCit7CisgICAgRmlsZUEzRCAqZmEzZCA9IHN0YXRpY19jYXN0PEZpbGVBM0QgKj4oZmlsZSk7CisgICAgaWYoIWZhM2QpIHsKKyAgICAgICAgTE9HRSgiQ2FuJ3QgbG9hZCBlbnRyeS4gTm8gdmFsaWQgZmlsZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBPYmplY3RCYXNlICpvYmogPSBmYTNkLT5pbml0aWFsaXplRnJvbUVudHJ5KGluZGV4KTsKKyAgICBMT0dFKCJSZXR1cm5pbmcgb2JqZWN0IHdpdGggbmFtZSAlcyIsIG9iai0+Z2V0TmFtZSgpKTsKKworICAgIHJldHVybiBvYmo7Cit9CisKK1JzRmlsZSByc2lfRmlsZUEzRENyZWF0ZUZyb21Bc3NldFN0cmVhbShDb250ZXh0ICpyc2MsIGNvbnN0IHZvaWQgKmRhdGEsIHVpbnQzMl90IGxlbikKK3sKKyAgICBpZiAoZGF0YSA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIkZpbGUgbG9hZCBmYWlsZWQuIEFzc2V0IHN0cmVhbSBpcyBOVUxMIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIEZpbGVBM0QgKmZhM2QgPSBuZXcgRmlsZUEzRChyc2MpOworCisgICAgZmEzZC0+bG9hZChkYXRhLCBsZW4pOworICAgIGZhM2QtPmluY1VzZXJSZWYoKTsKKworICAgIHJldHVybiBmYTNkOworfQorCiAKIFJzRmlsZSByc2lfRmlsZU9wZW4oQ29udGV4dCAqcnNjLCBjaGFyIGNvbnN0ICpwYXRoLCB1bnNpZ25lZCBpbnQgbGVuKQogewotICAgIEZpbGVBM0QgKmZhM2QgPSBuZXcgRmlsZUEzRDsKKyAgICBGaWxlQTNEICpmYTNkID0gbmV3IEZpbGVBM0QocnNjKTsKIAogICAgIEZJTEUgKmYgPSBmb3BlbigiL3NkY2FyZC90ZXN0LmEzZCIsICJyYiIpOwogICAgIGlmIChmKSB7Ci0gICAgICAgIGZhM2QtPmxvYWQocnNjLCBmKTsKKyAgICAgICAgZmEzZC0+bG9hZChmKTsKICAgICAgICAgZmNsb3NlKGYpOworICAgICAgICBmYTNkLT5pbmNVc2VyUmVmKCk7CiAgICAgICAgIHJldHVybiBmYTNkOwogICAgIH0KICAgICBkZWxldGUgZmEzZDsKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNGaWxlQTNELmggYi9saWJzL3JzL3JzRmlsZUEzRC5oCmluZGV4IDllZTA4ZWMuLmI5ODU5MDcgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNGaWxlQTNELmgKKysrIGIvbGlicy9ycy9yc0ZpbGVBM0QuaApAQCAtMTgsMjAgKzE4LDIzIEBACiAjZGVmaW5lIEFORFJPSURfUlNfRklMRV9BM0RfSAogCiAjaW5jbHVkZSAiUmVuZGVyU2NyaXB0LmgiCi0jaW5jbHVkZSAicnNGaWxlQTNERGVjbHMuaCIKICNpbmNsdWRlICJyc01lc2guaCIKIAogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKyNpbmNsdWRlICJyc1N0cmVhbS5oIgogI2luY2x1ZGUgPHN0ZGlvLmg+CiAKKyNkZWZpbmUgQTNEX01BR0lDX0tFWSAiQW5kcm9pZDNEX2ZmIgorCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIG5hbWVzcGFjZSBhbmRyb2lkIHsKKwogbmFtZXNwYWNlIHJlbmRlcnNjcmlwdCB7CiAKLWNsYXNzIEZpbGVBM0QKK2NsYXNzIEZpbGVBM0QgOiBwdWJsaWMgT2JqZWN0QmFzZQogewogcHVibGljOgotICAgIEZpbGVBM0QoKTsKKyAgICBGaWxlQTNEKENvbnRleHQgKnJzYyk7CiAgICAgfkZpbGVBM0QoKTsKIAogICAgIHVpbnQzMl90IG1NYWpvclZlcnNpb247CkBAIC00MCw3OCArNDMsNTMgQEAKICAgICB1aW50NjRfdCBtU3RyaW5nVGFibGVPZmZzZXQ7CiAgICAgYm9vbCBtVXNlNjRCaXRPZmZzZXRzOwogCi0gICAgc3RydWN0IEEzREluZGV4RW50cnkgewotICAgICAgICBTdHJpbmc4IG1JRDsKLSAgICAgICAgQTNEQ2h1bmtUeXBlIG1UeXBlOworICAgIGNsYXNzIEEzREluZGV4RW50cnkgeworICAgICAgICBTdHJpbmc4IG1PYmplY3ROYW1lOworICAgICAgICBSc0EzRENsYXNzSUQgbVR5cGU7CiAgICAgICAgIHVpbnQ2NF90IG1PZmZzZXQ7Ci0gICAgICAgIHZvaWQgKiBtUnNPYmo7CisgICAgICAgIHVpbnQ2NF90IG1MZW5ndGg7CisgICAgICAgIE9iamVjdEJhc2UgKm1Sc09iajsKKyAgICBwdWJsaWM6CisgICAgICAgIGZyaWVuZCBjbGFzcyBGaWxlQTNEOworICAgICAgICBjb25zdCBTdHJpbmc4ICZnZXRPYmplY3ROYW1lKCkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIG1PYmplY3ROYW1lOworICAgICAgICB9CisgICAgICAgIFJzQTNEQ2xhc3NJRCBnZXRUeXBlKCkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIG1UeXBlOworICAgICAgICB9CiAgICAgfTsKIAotICAgIGJvb2wgbG9hZChDb250ZXh0ICpyc2MsIEZJTEUgKmYpOworICAgIGJvb2wgbG9hZChGSUxFICpmKTsKKyAgICBib29sIGxvYWQoY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGxlbmd0aCk7CisKKyAgICBzaXplX3QgZ2V0TnVtSW5kZXhFbnRyaWVzKCkgY29uc3Q7CisgICAgY29uc3QgQTNESW5kZXhFbnRyeSogZ2V0SW5kZXhFbnRyeShzaXplX3QgaW5kZXgpIGNvbnN0OworICAgIE9iamVjdEJhc2UgKmluaXRpYWxpemVGcm9tRW50cnkoc2l6ZV90IGluZGV4KTsKKworICAgIHZvaWQgYXBwZW5kVG9GaWxlKE9iamVjdEJhc2UgKm9iaik7CisgICAgYm9vbCB3cml0ZUZpbGUoY29uc3QgY2hhciAqZmlsZW5hbWUpOworCisgICAgLy8gQ3VycmVudGx5IGZpbGVzIGRvIG5vdCBnZXQgc2VyaWFsaXplZCwKKyAgICAvLyBidXQgd2UgbmVlZCB0byBpbmhlcml0IGZyb20gT2JqZWN0QmFzZSBmb3IgcmVmIHRyYWNraW5nCisgICAgdmlydHVhbCB2b2lkIHNlcmlhbGl6ZShPU3RyZWFtICpzdHJlYW0pIGNvbnN0IHsKKyAgICB9CisgICAgdmlydHVhbCBSc0EzRENsYXNzSUQgZ2V0Q2xhc3NJZCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIFJTX0EzRF9DTEFTU19JRF9VTktOT1dOOworICAgIH0KIAogcHJvdGVjdGVkOgotICAgIGNsYXNzIElPCi0gICAgewotICAgIHB1YmxpYzoKLSAgICAgICAgSU8oY29uc3QgdWludDhfdCAqLCBib29sIHVzZTY0KTsKLSAgICAKLSAgICAgICAgZmxvYXQgbG9hZEYoKSB7Ci0gICAgICAgICAgICBtUG9zID0gKG1Qb3MgKyAzKSAmICh+Myk7Ci0gICAgICAgICAgICBmbG9hdCB0bXAgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGZsb2F0ICo+KCZtRGF0YVttUG9zXSlbMF07Ci0gICAgICAgICAgICBtUG9zICs9IHNpemVvZihmbG9hdCk7Ci0gICAgICAgICAgICByZXR1cm4gdG1wOwotICAgICAgICB9Ci0gICAgICAgIGludDMyX3QgbG9hZEkzMigpIHsKLSAgICAgICAgICAgIG1Qb3MgPSAobVBvcyArIDMpICYgKH4zKTsKLSAgICAgICAgICAgIGludDMyX3QgdG1wID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBpbnQzMl90ICo+KCZtRGF0YVttUG9zXSlbMF07Ci0gICAgICAgICAgICBtUG9zICs9IHNpemVvZihpbnQzMl90KTsKLSAgICAgICAgICAgIHJldHVybiB0bXA7Ci0gICAgICAgIH0KLSAgICAgICAgdWludDMyX3QgbG9hZFUzMigpIHsKLSAgICAgICAgICAgIG1Qb3MgPSAobVBvcyArIDMpICYgKH4zKTsKLSAgICAgICAgICAgIHVpbnQzMl90IHRtcCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDMyX3QgKj4oJm1EYXRhW21Qb3NdKVswXTsKLSAgICAgICAgICAgIG1Qb3MgKz0gc2l6ZW9mKHVpbnQzMl90KTsKLSAgICAgICAgICAgIHJldHVybiB0bXA7Ci0gICAgICAgIH0KLSAgICAgICAgdWludDE2X3QgbG9hZFUxNigpIHsKLSAgICAgICAgICAgIG1Qb3MgPSAobVBvcyArIDEpICYgKH4xKTsKLSAgICAgICAgICAgIHVpbnQxNl90IHRtcCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDE2X3QgKj4oJm1EYXRhW21Qb3NdKVswXTsKLSAgICAgICAgICAgIG1Qb3MgKz0gc2l6ZW9mKHVpbnQxNl90KTsKLSAgICAgICAgICAgIHJldHVybiB0bXA7Ci0gICAgICAgIH0KLSAgICAgICAgdWludDhfdCBsb2FkVTgoKSB7Ci0gICAgICAgICAgICB1aW50OF90IHRtcCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCAqPigmbURhdGFbbVBvc10pWzBdOwotICAgICAgICAgICAgbVBvcyArPSBzaXplb2YodWludDhfdCk7Ci0gICAgICAgICAgICByZXR1cm4gdG1wOwotICAgICAgICB9Ci0gICAgICAgIHVpbnQ2NF90IGxvYWRPZmZzZXQoKTsKLSAgICAgICAgdm9pZCBsb2FkU3RyaW5nKFN0cmluZzggKnMpOwotICAgICAgICB1aW50NjRfdCBnZXRQb3MoKSBjb25zdCB7cmV0dXJuIG1Qb3M7fQotICAgICAgICBjb25zdCB1aW50OF90ICogZ2V0UHRyKCkgY29uc3Q7Ci0gICAgcHJvdGVjdGVkOgotICAgICAgICBjb25zdCB1aW50OF90ICogbURhdGE7Ci0gICAgICAgIHVpbnQ2NF90IG1Qb3M7Ci0gICAgICAgIGJvb2wgbVVzZTY0OwotICAgIH07CiAKLQotICAgIGJvb2wgcHJvY2VzcyhDb250ZXh0ICpyc2MpOwotICAgIGJvb2wgcHJvY2Vzc0luZGV4KENvbnRleHQgKnJzYywgQTNESW5kZXhFbnRyeSAqKTsKLSAgICB2b2lkIHByb2Nlc3NDaHVua19NZXNoKENvbnRleHQgKnJzYywgSU8gKmlvLCBBM0RJbmRleEVudHJ5ICppZSk7Ci0gICAgdm9pZCBwcm9jZXNzQ2h1bmtfUHJpbWl0aXZlKENvbnRleHQgKnJzYywgSU8gKmlvLCBBM0RJbmRleEVudHJ5ICppZSk7Ci0gICAgdm9pZCBwcm9jZXNzQ2h1bmtfVmVydGljaWVzKENvbnRleHQgKnJzYywgSU8gKmlvLCBBM0RJbmRleEVudHJ5ICppZSk7Ci0gICAgdm9pZCBwcm9jZXNzQ2h1bmtfRWxlbWVudChDb250ZXh0ICpyc2MsIElPICppbywgQTNESW5kZXhFbnRyeSAqaWUpOwotICAgIHZvaWQgcHJvY2Vzc0NodW5rX0VsZW1lbnRTb3VyY2UoQ29udGV4dCAqcnNjLCBJTyAqaW8sIEEzREluZGV4RW50cnkgKmllKTsKKyAgICB2b2lkIHBhcnNlSGVhZGVyKElTdHJlYW0gKmhlYWRlclN0cmVhbSk7CiAKICAgICBjb25zdCB1aW50OF90ICogbURhdGE7CiAgICAgdm9pZCAqIG1BbGxvYzsKICAgICB1aW50NjRfdCBtRGF0YVNpemU7Ci0gICAgQ29udGV4dCAqIG1Sc2M7CiAKLSAgICBWZWN0b3I8QTNESW5kZXhFbnRyeT4gbUluZGV4OwotICAgIFZlY3RvcjxTdHJpbmc4PiBtU3RyaW5nczsKLSAgICBWZWN0b3I8dWludDMyX3Q+IG1TdHJpbmdJbmRleFZhbHVlczsKKyAgICBPU3RyZWFtICptV3JpdGVTdHJlYW07CisgICAgVmVjdG9yPEEzREluZGV4RW50cnkqPiBtV3JpdGVJbmRleDsKIAorICAgIElTdHJlYW0gKm1SZWFkU3RyZWFtOworICAgIFZlY3RvcjxBM0RJbmRleEVudHJ5Kj4gbUluZGV4OwogfTsKIAogCmRpZmYgLS1naXQgYS9saWJzL3JzL3JzRm9udC5jcHAgYi9saWJzL3JzL3JzRm9udC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTc0MGU2NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvcnNGb250LmNwcApAQCAtMCwwICsxLDY4OSBAQAorCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1JTX0JVSUxEX0ZPUl9IT1NUCisjaW5jbHVkZSAicnNDb250ZXh0LmgiCisjZWxzZQorI2luY2x1ZGUgInJzQ29udGV4dEhvc3RTdHViLmgiCisjZW5kaWYKKworI2luY2x1ZGUgInJzRm9udC5oIgorI2luY2x1ZGUgInJzUHJvZ3JhbUZyYWdtZW50LmgiCisjaW5jbHVkZSBGVF9CSVRNQVBfSAorCisjaW5jbHVkZSA8R0xFUy9nbC5oPgorI2luY2x1ZGUgPEdMRVMvZ2xleHQuaD4KKyNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KKyNpbmNsdWRlIDxHTEVTMi9nbDJleHQuaD4KKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7Cit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6cmVuZGVyc2NyaXB0OworCitGb250OjpGb250KENvbnRleHQgKnJzYykgOiBPYmplY3RCYXNlKHJzYyksIG1DYWNoZWRHbHlwaHMoTlVMTCkKK3sKKyAgICBtSW5pdGlhbGl6ZWQgPSBmYWxzZTsKKyAgICBtSGFzS2VybmluZyA9IGZhbHNlOworfQorCitib29sIEZvbnQ6OmluaXQoY29uc3QgY2hhciAqbmFtZSwgdWludDMyX3QgZm9udFNpemUsIHVpbnQzMl90IGRwaSkKK3sKKyAgICBpZihtSW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgTE9HRSgiUmVpbml0aWFsaXphdGlvbiBvZiBmb250cyBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBTdHJpbmc4IGZvbnRzRGlyKCIvZm9udHMvIik7CisgICAgU3RyaW5nOCBmdWxsUGF0aChnZXRlbnYoIkFORFJPSURfUk9PVCIpKTsKKyAgICBmdWxsUGF0aCArPSBmb250c0RpcjsKKyAgICBmdWxsUGF0aCArPSBuYW1lOworCisgICAgRlRfRXJyb3IgZXJyb3IgPSBGVF9OZXdfRmFjZShtUlNDLT5tU3RhdGVGb250Lm1MaWJyYXJ5LCBmdWxsUGF0aC5zdHJpbmcoKSwgMCwgJm1GYWNlKTsKKyAgICBpZihlcnJvcikgeworICAgICAgICBMT0dFKCJVbmFibGUgdG8gaW5pdGlhbGl6ZSBmb250ICVzIiwgZnVsbFBhdGguc3RyaW5nKCkpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgbUZvbnROYW1lID0gbmFtZTsKKyAgICBtRm9udFNpemUgPSBmb250U2l6ZTsKKyAgICBtRHBpID0gZHBpOworCisgICAgLy9MT0dFKCJGb250IGluaXRpYWxpemVkOiAlcyIsIGZ1bGxQYXRoLnN0cmluZygpKTsKKworICAgIGVycm9yID0gRlRfU2V0X0NoYXJfU2l6ZShtRmFjZSwgZm9udFNpemUgKiA2NCwgMCwgZHBpLCAwKTsKKyAgICBpZihlcnJvcikgeworICAgICAgICBMT0dFKCJVbmFibGUgdG8gc2V0IGZvbnQgc2l6ZSBvbiAlcyIsIGZ1bGxQYXRoLnN0cmluZygpKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIG1IYXNLZXJuaW5nID0gRlRfSEFTX0tFUk5JTkcobUZhY2UpOworICAgIExPR0UoIktlcm5pbmc6ICVpIiwgbUhhc0tlcm5pbmcpOworCisgICAgbUluaXRpYWxpemVkID0gdHJ1ZTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBGb250OjppbnZhbGlkYXRlVGV4dHVyZUNhY2hlKCkKK3sKKyAgICBmb3IodWludDMyX3QgaSA9IDA7IGkgPCBtQ2FjaGVkR2x5cGhzLnNpemUoKTsgaSArKykgeworICAgICAgICBtQ2FjaGVkR2x5cGhzLnZhbHVlQXQoaSktPm1Jc1ZhbGlkID0gZmFsc2U7CisgICAgfQorfQorCit2b2lkIEZvbnQ6OmRyYXdDYWNoZWRHbHlwaChDYWNoZWRHbHlwaEluZm8gKmdseXBoLCBpbnQgeCwgaW50IHkpCit7CisgICAgRm9udFN0YXRlICpzdGF0ZSA9ICZtUlNDLT5tU3RhdGVGb250OworCisgICAgaW50IG5QZW5YID0geCArIGdseXBoLT5tQml0bWFwTGVmdDsKKyAgICBpbnQgblBlblkgPSB5IC0gZ2x5cGgtPm1CaXRtYXBUb3AgKyBnbHlwaC0+bUJpdG1hcEhlaWdodDsKKworICAgIHN0YXRlLT5hcHBlbmRNZXNoUXVhZChuUGVuWCwgblBlblksIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGgtPm1CaXRtYXBNaW5VLCBnbHlwaC0+bUJpdG1hcE1heFYsCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuUGVuWCArIChpbnQpZ2x5cGgtPm1CaXRtYXBXaWR0aCwgblBlblksIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGgtPm1CaXRtYXBNYXhVLCBnbHlwaC0+bUJpdG1hcE1heFYsCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuUGVuWCArIChpbnQpZ2x5cGgtPm1CaXRtYXBXaWR0aCwgblBlblkgLSAoaW50KWdseXBoLT5tQml0bWFwSGVpZ2h0LCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBoLT5tQml0bWFwTWF4VSwgZ2x5cGgtPm1CaXRtYXBNaW5WLAorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgblBlblgsIG5QZW5ZIC0gKGludClnbHlwaC0+bUJpdG1hcEhlaWdodCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbHlwaC0+bUJpdG1hcE1pblUsIGdseXBoLT5tQml0bWFwTWluVik7Cit9CisKK3ZvaWQgRm9udDo6cmVuZGVyVVRGKGNvbnN0IGNoYXIgKnRleHQsIHVpbnQzMl90IGxlbiwgdWludDMyX3Qgc3RhcnQsIGludCBudW1HbHlwaHMsIGludCB4LCBpbnQgeSkKK3sKKyAgICBpZighbUluaXRpYWxpemVkIHx8IG51bUdseXBocyA9PSAwIHx8IHRleHQgPT0gTlVMTCB8fCBsZW4gPT0gMCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaW50IHBlblggPSB4LCBwZW5ZID0geTsKKyAgICBpbnQgZ2x5cGhzTGVmdCA9IDE7CisgICAgaWYobnVtR2x5cGhzID4gMCkgeworICAgICAgICBnbHlwaHNMZWZ0ID0gbnVtR2x5cGhzOworICAgIH0KKworICAgIHNpemVfdCBpbmRleCA9IHN0YXJ0OworICAgIHNpemVfdCBuZXh0SW5kZXggPSAwOworCisgICAgd2hpbGUgKGdseXBoc0xlZnQgPiAwKSB7CisKKyAgICAgICAgaW50MzJfdCB1dGZDaGFyID0gdXRmMzJfYXQodGV4dCwgbGVuLCBpbmRleCwgJm5leHRJbmRleCk7CisKKyAgICAgICAgLy8gUmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBzdHJpbmcgb3IgZW5jb3VudGVyZWQKKyAgICAgICAgaWYodXRmQ2hhciA8IDApIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgLy8gTW92ZSB0byB0aGUgbmV4dCBjaGFyYWN0ZXIgaW4gdGhlIGFycmF5CisgICAgICAgIGluZGV4ID0gbmV4dEluZGV4OworCisgICAgICAgIENhY2hlZEdseXBoSW5mbyAqY2FjaGVkR2x5cGggPSBtQ2FjaGVkR2x5cGhzLnZhbHVlRm9yKCh1aW50MzJfdCl1dGZDaGFyKTsKKworICAgICAgICBpZihjYWNoZWRHbHlwaCA9PSBOVUxMKSB7CisgICAgICAgICAgICBjYWNoZWRHbHlwaCA9IGNhY2hlR2x5cGgoKHVpbnQzMl90KXV0ZkNoYXIpOworICAgICAgICB9CisgICAgICAgIC8vIElzIHRoZSBnbHlwaCBzdGlsbCBpbiB0ZXh0dXJlIGNhY2hlPworICAgICAgICBpZighY2FjaGVkR2x5cGgtPm1Jc1ZhbGlkKSB7CisgICAgICAgICAgICB1cGRhdGVHbHlwaENhY2hlKGNhY2hlZEdseXBoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIElmIGl0J3Mgc3RpbGwgbm90IHZhbGlkLCB3ZSBjb3VsZG4ndCBjYWNoZSBpdCwgc28gd2Ugc2hvdWxkbid0IGRyYXcgZ2FyYmFnZQorICAgICAgICBpZihjYWNoZWRHbHlwaC0+bUlzVmFsaWQpIHsKKyAgICAgICAgICAgIGRyYXdDYWNoZWRHbHlwaChjYWNoZWRHbHlwaCwgcGVuWCwgcGVuWSk7CisgICAgICAgIH0KKworICAgICAgICBwZW5YICs9IChjYWNoZWRHbHlwaC0+bUFkdmFuY2UueCA+PiA2KTsKKworICAgICAgICAvLyBJZiB3ZSB3ZXJlIGdpdmVuIGEgc3BlY2lmaWMgbnVtYmVyIG9mIGdseXBocywgZGVjcmVtZW50CisgICAgICAgIGlmKG51bUdseXBocyA+IDApIHsKKyAgICAgICAgICAgIGdseXBoc0xlZnQgLS07CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgRm9udDo6dXBkYXRlR2x5cGhDYWNoZShDYWNoZWRHbHlwaEluZm8gKmdseXBoKQoreworICAgIGlmKCFnbHlwaC0+bUJpdG1hcFZhbGlkKSB7CisKKyAgICAgICAgRlRfRXJyb3IgZXJyb3IgPSBGVF9Mb2FkX0dseXBoKCBtRmFjZSwgZ2x5cGgtPm1HbHlwaEluZGV4LCBGVF9MT0FEX1JFTkRFUiApOworICAgICAgICBpZihlcnJvcikgeworICAgICAgICAgICAgTE9HRSgiQ291bGRuJ3QgbG9hZCBnbHlwaC4iKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGdseXBoLT5tQWR2YW5jZSA9IG1GYWNlLT5nbHlwaC0+YWR2YW5jZTsKKyAgICAgICAgZ2x5cGgtPm1CaXRtYXBMZWZ0ID0gbUZhY2UtPmdseXBoLT5iaXRtYXBfbGVmdDsKKyAgICAgICAgZ2x5cGgtPm1CaXRtYXBUb3AgPSBtRmFjZS0+Z2x5cGgtPmJpdG1hcF90b3A7CisKKyAgICAgICAgRlRfQml0bWFwICpiaXRtYXAgPSAmbUZhY2UtPmdseXBoLT5iaXRtYXA7CisKKyAgICAgICAgRlRfQml0bWFwX05ldygmZ2x5cGgtPm1CaXRtYXApOworICAgICAgICBGVF9CaXRtYXBfQ29weShtUlNDLT5tU3RhdGVGb250Lm1MaWJyYXJ5LCBiaXRtYXAsICZnbHlwaC0+bUJpdG1hcCk7CisKKyAgICAgICAgZ2x5cGgtPm1CaXRtYXBWYWxpZCA9IHRydWU7CisgICAgfQorCisgICAgLy8gTm93IGNvcHkgdGhlIGJpdG1hcCBpbnRvIHRoZSBjYWNoZSB0ZXh0dXJlCisgICAgdWludDMyX3Qgc3RhcnRYID0gMDsKKyAgICB1aW50MzJfdCBzdGFydFkgPSAwOworCisgICAgLy8gTGV0IHRoZSBmb250IHN0YXRlIGZpZ3VyZSBvdXQgd2hlcmUgdG8gcHV0IHRoZSBiaXRtYXAKKyAgICBGb250U3RhdGUgKnN0YXRlID0gJm1SU0MtPm1TdGF0ZUZvbnQ7CisgICAgZ2x5cGgtPm1Jc1ZhbGlkID0gc3RhdGUtPmNhY2hlQml0bWFwKCZnbHlwaC0+bUJpdG1hcCwgJnN0YXJ0WCwgJnN0YXJ0WSk7CisKKyAgICBpZighZ2x5cGgtPm1Jc1ZhbGlkKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB1aW50MzJfdCBlbmRYID0gc3RhcnRYICsgZ2x5cGgtPm1CaXRtYXAud2lkdGg7CisgICAgdWludDMyX3QgZW5kWSA9IHN0YXJ0WSArIGdseXBoLT5tQml0bWFwLnJvd3M7CisKKyAgICBnbHlwaC0+bUJpdG1hcE1pblggPSBzdGFydFg7CisgICAgZ2x5cGgtPm1CaXRtYXBNaW5ZID0gc3RhcnRZOworICAgIGdseXBoLT5tQml0bWFwV2lkdGggPSBnbHlwaC0+bUJpdG1hcC53aWR0aDsKKyAgICBnbHlwaC0+bUJpdG1hcEhlaWdodCA9IGdseXBoLT5tQml0bWFwLnJvd3M7CisKKyAgICB1aW50MzJfdCBjYWNoZVdpZHRoID0gc3RhdGUtPmdldENhY2hlVGV4dHVyZVR5cGUoKS0+Z2V0RGltWCgpOworICAgIHVpbnQzMl90IGNhY2hlSGVpZ2h0ID0gc3RhdGUtPmdldENhY2hlVGV4dHVyZVR5cGUoKS0+Z2V0RGltWSgpOworCisgICAgZ2x5cGgtPm1CaXRtYXBNaW5VID0gKGZsb2F0KXN0YXJ0WCAvIChmbG9hdCljYWNoZVdpZHRoOworICAgIGdseXBoLT5tQml0bWFwTWluViA9IChmbG9hdClzdGFydFkgLyAoZmxvYXQpY2FjaGVIZWlnaHQ7CisgICAgZ2x5cGgtPm1CaXRtYXBNYXhVID0gKGZsb2F0KWVuZFggLyAoZmxvYXQpY2FjaGVXaWR0aDsKKyAgICBnbHlwaC0+bUJpdG1hcE1heFYgPSAoZmxvYXQpZW5kWSAvIChmbG9hdCljYWNoZUhlaWdodDsKK30KKworRm9udDo6Q2FjaGVkR2x5cGhJbmZvICpGb250OjpjYWNoZUdseXBoKHVpbnQzMl90IGdseXBoKQoreworICAgIENhY2hlZEdseXBoSW5mbyAqbmV3R2x5cGggPSBuZXcgQ2FjaGVkR2x5cGhJbmZvKCk7CisgICAgbUNhY2hlZEdseXBocy5hZGQoZ2x5cGgsIG5ld0dseXBoKTsKKworICAgIG5ld0dseXBoLT5tR2x5cGhJbmRleCA9IEZUX0dldF9DaGFyX0luZGV4KG1GYWNlLCBnbHlwaCk7CisgICAgbmV3R2x5cGgtPm1Jc1ZhbGlkID0gZmFsc2U7CisgICAgbmV3R2x5cGgtPm1CaXRtYXBWYWxpZCA9IGZhbHNlOworCisgICAgLy9MT0dFKCJHbHlwaCA9ICVjLCBmYWNlIGluZGV4OiAldSIsICh1bnNpZ25lZCBjaGFyKWdseXBoLCBuZXdHbHlwaC0+bUdseXBoSW5kZXgpOworCisgICAgdXBkYXRlR2x5cGhDYWNoZShuZXdHbHlwaCk7CisKKyAgICByZXR1cm4gbmV3R2x5cGg7Cit9CisKK0ZvbnQgKiBGb250OjpjcmVhdGUoQ29udGV4dCAqcnNjLCBjb25zdCBjaGFyICpuYW1lLCB1aW50MzJfdCBmb250U2l6ZSwgdWludDMyX3QgZHBpKQoreworICAgIFZlY3RvcjxGb250Kj4gJmFjdGl2ZUZvbnRzID0gcnNjLT5tU3RhdGVGb250Lm1BY3RpdmVGb250czsKKworICAgIGZvcih1aW50MzJfdCBpID0gMDsgaSA8IGFjdGl2ZUZvbnRzLnNpemUoKTsgaSArKykgeworICAgICAgICBGb250ICppdGhGb250ID0gYWN0aXZlRm9udHNbaV07CisgICAgICAgIGlmKGl0aEZvbnQtPm1Gb250TmFtZSA9PSBuYW1lICYmIGl0aEZvbnQtPm1Gb250U2l6ZSA9PSBmb250U2l6ZSAmJiBpdGhGb250LT5tRHBpID09IGRwaSkgeworICAgICAgICAgICAgaXRoRm9udC0+aW5jVXNlclJlZigpOworICAgICAgICAgICAgcmV0dXJuIGl0aEZvbnQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBGb250ICpuZXdGb250ID0gbmV3IEZvbnQocnNjKTsKKyAgICBib29sIGlzSW5pdGlhbGl6ZWQgPSBuZXdGb250LT5pbml0KG5hbWUsIGZvbnRTaXplLCBkcGkpOworICAgIGlmKGlzSW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgbmV3Rm9udC0+aW5jVXNlclJlZigpOworICAgICAgICBhY3RpdmVGb250cy5wdXNoKG5ld0ZvbnQpOworICAgICAgICByZXR1cm4gbmV3Rm9udDsKKyAgICB9CisKKyAgICBkZWxldGUgbmV3Rm9udDsKKyAgICByZXR1cm4gTlVMTDsKKworfQorCitGb250Ojp+Rm9udCgpCit7CisgICAgaWYobUZhY2UpIHsKKyAgICAgICAgRlRfRG9uZV9GYWNlKG1GYWNlKTsKKyAgICB9CisKKyAgICBmb3IgKHVpbnQzMl90IGN0ID0gMDsgY3QgPCBtUlNDLT5tU3RhdGVGb250Lm1BY3RpdmVGb250cy5zaXplKCk7IGN0KyspIHsKKyAgICAgICAgaWYgKG1SU0MtPm1TdGF0ZUZvbnQubUFjdGl2ZUZvbnRzW2N0XSA9PSB0aGlzKSB7CisgICAgICAgICAgICBtUlNDLT5tU3RhdGVGb250Lm1BY3RpdmVGb250cy5yZW1vdmVBdChjdCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvcih1aW50MzJfdCBpID0gMDsgaSA8IG1DYWNoZWRHbHlwaHMuc2l6ZSgpOyBpICsrKSB7CisgICAgICAgIENhY2hlZEdseXBoSW5mbyAqZ2x5cGggPSBtQ2FjaGVkR2x5cGhzLnZhbHVlQXQoaSk7CisgICAgICAgIGlmKGdseXBoLT5tQml0bWFwVmFsaWQpIHsKKyAgICAgICAgICAgIEZUX0JpdG1hcF9Eb25lKG1SU0MtPm1TdGF0ZUZvbnQubUxpYnJhcnksICZnbHlwaC0+bUJpdG1hcCk7CisgICAgICAgIH0KKyAgICAgICAgZGVsZXRlIGdseXBoOworICAgIH0KK30KKworRm9udFN0YXRlOjpGb250U3RhdGUoKQoreworICAgIG1Jbml0aWFsaXplZCA9IGZhbHNlOworICAgIG1NYXhOdW1iZXJPZlF1YWRzID0gMTAyNDsKKyAgICBtQ3VycmVudFF1YWRJbmRleCA9IDA7CisgICAgbVJTQyA9IE5VTEw7Cit9CisKK0ZvbnRTdGF0ZTo6fkZvbnRTdGF0ZSgpCit7CisgICAgZm9yKHVpbnQzMl90IGkgPSAwOyBpIDwgbUNhY2hlTGluZXMuc2l6ZSgpOyBpICsrKSB7CisgICAgICAgIGRlbGV0ZSBtQ2FjaGVMaW5lc1tpXTsKKyAgICB9CisKKyAgICByc0Fzc2VydCghbUFjdGl2ZUZvbnRzLnNpemUoKSk7Cit9CisKK3ZvaWQgRm9udFN0YXRlOjppbml0KENvbnRleHQgKnJzYykKK3sKKyAgICBGVF9FcnJvciBlcnJvcjsKKworICAgIGlmKCFtTGlicmFyeSkgeworICAgICAgICBlcnJvciA9IEZUX0luaXRfRnJlZVR5cGUoJm1MaWJyYXJ5KTsKKyAgICAgICAgaWYoZXJyb3IpIHsKKyAgICAgICAgICAgIExPR0UoIlVuYWJsZSB0byBpbml0aWFsaXplIGZyZWV0eXBlIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAgICBtUlNDID0gcnNjOworCisgICAgbURlZmF1bHQuc2V0KEZvbnQ6OmNyZWF0ZShyc2MsICJEcm9pZFNhbnMudHRmIiwgMTYsIDk2KSk7Cit9CisKK3ZvaWQgRm9udFN0YXRlOjpmbHVzaEFsbEFuZEludmFsaWRhdGUoKQoreworICAgIGlmKG1DdXJyZW50UXVhZEluZGV4ICE9IDApIHsKKyAgICAgICAgaXNzdWVEcmF3Q29tbWFuZCgpOworICAgICAgICBtQ3VycmVudFF1YWRJbmRleCA9IDA7CisgICAgfQorICAgIGZvcih1aW50MzJfdCBpID0gMDsgaSA8IG1BY3RpdmVGb250cy5zaXplKCk7IGkgKyspIHsKKyAgICAgICAgbUFjdGl2ZUZvbnRzW2ldLT5pbnZhbGlkYXRlVGV4dHVyZUNhY2hlKCk7CisgICAgfQorICAgIGZvcih1aW50MzJfdCBpID0gMDsgaSA8IG1DYWNoZUxpbmVzLnNpemUoKTsgaSArKykgeworICAgICAgICBtQ2FjaGVMaW5lc1tpXS0+bUN1cnJlbnRDb2wgPSAwOworICAgIH0KK30KKworYm9vbCBGb250U3RhdGU6OmNhY2hlQml0bWFwKEZUX0JpdG1hcCAqYml0bWFwLCB1aW50MzJfdCAqcmV0T3JpZ2luWCwgdWludDMyX3QgKnJldE9yaWdpblkpCit7CisgICAgLy8gSWYgdGhlIGdseXBoIGlzIHRvbyB0YWxsLCBkb24ndCBjYWNoZSBpdAorICAgIGlmKCh1aW50MzJfdCliaXRtYXAtPnJvd3MgPiBtQ2FjaGVMaW5lc1ttQ2FjaGVMaW5lcy5zaXplKCktMV0tPm1NYXhIZWlnaHQpIHsKKyAgICAgICAgTE9HRSgiRm9udCBzaXplIHRvIGxhcmdlIHRvIGZpdCBpbiBjYWNoZS4gd2lkdGgsIGhlaWdodCA9ICVpLCAlaSIsIChpbnQpYml0bWFwLT53aWR0aCwgKGludCliaXRtYXAtPnJvd3MpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gTm93IGNvcHkgdGhlIGJpdG1hcCBpbnRvIHRoZSBjYWNoZSB0ZXh0dXJlCisgICAgdWludDMyX3Qgc3RhcnRYID0gMDsKKyAgICB1aW50MzJfdCBzdGFydFkgPSAwOworCisgICAgYm9vbCBiaXRtYXBGaXQgPSBmYWxzZTsKKyAgICBmb3IodWludDMyX3QgaSA9IDA7IGkgPCBtQ2FjaGVMaW5lcy5zaXplKCk7IGkgKyspIHsKKyAgICAgICAgYml0bWFwRml0ID0gbUNhY2hlTGluZXNbaV0tPmZpdEJpdG1hcChiaXRtYXAsICZzdGFydFgsICZzdGFydFkpOworICAgICAgICBpZihiaXRtYXBGaXQpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gSWYgdGhlIG5ldyBnbHlwaCBkaWRuJ3QgZml0LCBmbHVzaCB0aGUgc3RhdGUgc28gZmFyIGFuZCBpbnZhbGlkYXRlIGV2ZXJ5dGhpbmcKKyAgICBpZighYml0bWFwRml0KSB7CisgICAgICAgIGZsdXNoQWxsQW5kSW52YWxpZGF0ZSgpOworCisgICAgICAgIC8vIFRyeSB0byBmaXQgaXQgYWdhaW4KKyAgICAgICAgZm9yKHVpbnQzMl90IGkgPSAwOyBpIDwgbUNhY2hlTGluZXMuc2l6ZSgpOyBpICsrKSB7CisgICAgICAgICAgICBiaXRtYXBGaXQgPSBtQ2FjaGVMaW5lc1tpXS0+Zml0Qml0bWFwKGJpdG1hcCwgJnN0YXJ0WCwgJnN0YXJ0WSk7CisgICAgICAgICAgICBpZihiaXRtYXBGaXQpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIGlmIHdlIHN0aWxsIGRvbid0IGZpdCwgc29tZXRoaW5nIGlzIHdyb25nIGFuZCB3ZSBzaG91bGRuJ3QgZHJhdworICAgICAgICBpZighYml0bWFwRml0KSB7CisgICAgICAgICAgICBMT0dFKCJCaXRtYXAgZG9lc24ndCBmaXQgaW4gY2FjaGUuIHdpZHRoLCBoZWlnaHQgPSAlaSwgJWkiLCAoaW50KWJpdG1hcC0+d2lkdGgsIChpbnQpYml0bWFwLT5yb3dzKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgICpyZXRPcmlnaW5YID0gc3RhcnRYOworICAgICpyZXRPcmlnaW5ZID0gc3RhcnRZOworCisgICAgdWludDMyX3QgZW5kWCA9IHN0YXJ0WCArIGJpdG1hcC0+d2lkdGg7CisgICAgdWludDMyX3QgZW5kWSA9IHN0YXJ0WSArIGJpdG1hcC0+cm93czsKKworICAgIC8vTE9HRSgiQml0bWFwIHdpZHRoLCBoZWlnaHQgPSAlaSwgJWkiLCAoaW50KWJpdG1hcC0+d2lkdGgsIChpbnQpYml0bWFwLT5yb3dzKTsKKworICAgIHVpbnQzMl90IGNhY2hlV2lkdGggPSBnZXRDYWNoZVRleHR1cmVUeXBlKCktPmdldERpbVgoKTsKKworICAgIHVuc2lnbmVkIGNoYXIgKmNhY2hlQnVmZmVyID0gKHVuc2lnbmVkIGNoYXIqKW1UZXh0VGV4dHVyZS0+Z2V0UHRyKCk7CisgICAgdW5zaWduZWQgY2hhciAqYml0bWFwQnVmZmVyID0gYml0bWFwLT5idWZmZXI7CisKKyAgICB1aW50MzJfdCBjYWNoZVggPSAwLCBiWCA9IDAsIGNhY2hlWSA9IDAsIGJZID0gMDsKKyAgICBmb3IoY2FjaGVYID0gc3RhcnRYLCBiWCA9IDA7IGNhY2hlWCA8IGVuZFg7IGNhY2hlWCArKywgYlggKyspIHsKKyAgICAgICAgZm9yKGNhY2hlWSA9IHN0YXJ0WSwgYlkgPSAwOyBjYWNoZVkgPCBlbmRZOyBjYWNoZVkgKyssIGJZICsrKSB7CisgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIHRlbXBDb2wgPSBiaXRtYXBCdWZmZXJbYlkgKiBiaXRtYXAtPndpZHRoICsgYlhdOworICAgICAgICAgICAgY2FjaGVCdWZmZXJbY2FjaGVZKmNhY2hlV2lkdGggKyBjYWNoZVhdID0gdGVtcENvbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFRoaXMgd2lsbCBkaXJ0eSB0aGUgdGV4dHVyZSBhbmQgdGhlIHNoYWRlciBzbyBuZXh0IHRpbWUKKyAgICAvLyB3ZSBkcmF3IGl0IHdpbGwgdXBsb2FkIHRoZSBkYXRhCisgICAgbVRleHRUZXh0dXJlLT5kZWZlcmVkVXBsb2FkVG9UZXh0dXJlKG1SU0MsIGZhbHNlLCAwKTsKKyAgICBtRm9udFNoYWRlckYtPmJpbmRUZXh0dXJlKDAsIG1UZXh0VGV4dHVyZS5nZXQoKSk7CisKKyAgICAvLyBTb21lIGRlYnVnIGNvZGUKKyAgICAvKmZvcih1aW50MzJfdCBpID0gMDsgaSA8IG1DYWNoZUxpbmVzLnNpemUoKTsgaSArKykgeworICAgICAgICBMT0dFKCJDYWNoZSBMaW5lOiBIOiAldSBFbXB0eSBTcGFjZTogJWYiLAorICAgICAgICAgICAgIG1DYWNoZUxpbmVzW2ldLT5tTWF4SGVpZ2h0LAorICAgICAgICAgICAgICAoMS4wZiAtIChmbG9hdCltQ2FjaGVMaW5lc1tpXS0+bUN1cnJlbnRDb2wvKGZsb2F0KW1DYWNoZUxpbmVzW2ldLT5tTWF4V2lkdGgpKjEwMC4wZik7CisKKyAgICB9Ki8KKworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIEZvbnRTdGF0ZTo6aW5pdFJlbmRlclN0YXRlKCkKK3sKKyAgICB1aW50MzJfdCB0bXBbNV0gPSB7CisgICAgICAgIFJTX1RFWF9FTlZfTU9ERV9SRVBMQUNFLCAxLAorICAgICAgICBSU19URVhfRU5WX01PREVfTk9ORSwgMCwKKyAgICAgICAgMAorICAgIH07CisgICAgUHJvZ3JhbUZyYWdtZW50ICpwZiA9IG5ldyBQcm9ncmFtRnJhZ21lbnQobVJTQywgdG1wLCA1KTsKKyAgICBtRm9udFNoYWRlckYuc2V0KHBmKTsKKyAgICBtRm9udFNoYWRlckYtPmluaXQobVJTQyk7CisKKyAgICBTYW1wbGVyICpzYW1wbGVyID0gbmV3IFNhbXBsZXIobVJTQywgUlNfU0FNUExFUl9ORUFSRVNULCBSU19TQU1QTEVSX05FQVJFU1QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJTX1NBTVBMRVJfQ0xBTVAsIFJTX1NBTVBMRVJfQ0xBTVAsIFJTX1NBTVBMRVJfQ0xBTVApOworICAgIG1Gb250U2FtcGxlci5zZXQoc2FtcGxlcik7CisgICAgbUZvbnRTaGFkZXJGLT5iaW5kU2FtcGxlcigwLCBzYW1wbGVyKTsKKworICAgIFByb2dyYW1TdG9yZSAqZm9udFN0b3JlID0gbmV3IFByb2dyYW1TdG9yZShtUlNDKTsKKyAgICBtRm9udFByb2dyYW1TdG9yZS5zZXQoZm9udFN0b3JlKTsKKyAgICBtRm9udFByb2dyYW1TdG9yZS0+c2V0RGVwdGhGdW5jKFJTX0RFUFRIX0ZVTkNfQUxXQVlTKTsKKyAgICBtRm9udFByb2dyYW1TdG9yZS0+c2V0QmxlbmRGdW5jKFJTX0JMRU5EX1NSQ19TUkNfQUxQSEEsIFJTX0JMRU5EX0RTVF9PTkVfTUlOVVNfU1JDX0FMUEhBKTsKKyAgICBtRm9udFByb2dyYW1TdG9yZS0+c2V0RGl0aGVyRW5hYmxlKGZhbHNlKTsKKyAgICBtRm9udFByb2dyYW1TdG9yZS0+c2V0RGVwdGhNYXNrKGZhbHNlKTsKK30KKwordm9pZCBGb250U3RhdGU6OmluaXRUZXh0VGV4dHVyZSgpCit7CisgICAgY29uc3QgRWxlbWVudCAqYWxwaGFFbGVtID0gRWxlbWVudDo6Y3JlYXRlKG1SU0MsIFJTX1RZUEVfVU5TSUdORURfOCwgUlNfS0lORF9QSVhFTF9BLCB0cnVlLCAxKTsKKworICAgIC8vIFdlIHdpbGwgYWxsb2NhdGUgYSB0ZXh0dXJlIHRvIGluaXRpYWxseSBob2xkIDMyIGNoYXJhY3RlciBiaXRtYXBzCisgICAgVHlwZSAqdGV4VHlwZSA9IG5ldyBUeXBlKG1SU0MpOworICAgIHRleFR5cGUtPnNldEVsZW1lbnQoYWxwaGFFbGVtKTsKKyAgICB0ZXhUeXBlLT5zZXREaW1YKDEwMjQpOworICAgIHRleFR5cGUtPnNldERpbVkoMjU2KTsKKyAgICB0ZXhUeXBlLT5jb21wdXRlKCk7CisKKyAgICBBbGxvY2F0aW9uICpjYWNoZUFsbG9jID0gbmV3IEFsbG9jYXRpb24obVJTQywgdGV4VHlwZSk7CisgICAgbVRleHRUZXh0dXJlLnNldChjYWNoZUFsbG9jKTsKKyAgICBtVGV4dFRleHR1cmUtPmRlZmVyZWRVcGxvYWRUb1RleHR1cmUobVJTQywgZmFsc2UsIDApOworCisgICAgLy8gU3BsaXQgdXAgb3VyIGNhY2hlIHRleHR1cmUgaW50byBsaW5lcyBvZiBjZXJ0YWluIHdpZHRocworICAgIGludCBuZXh0TGluZSA9IDA7CisgICAgbUNhY2hlTGluZXMucHVzaChuZXcgQ2FjaGVUZXh0dXJlTGluZSgxNiwgdGV4VHlwZS0+Z2V0RGltWCgpLCBuZXh0TGluZSwgMCkpOworICAgIG5leHRMaW5lICs9IG1DYWNoZUxpbmVzLnRvcCgpLT5tTWF4SGVpZ2h0OworICAgIG1DYWNoZUxpbmVzLnB1c2gobmV3IENhY2hlVGV4dHVyZUxpbmUoMjQsIHRleFR5cGUtPmdldERpbVgoKSwgbmV4dExpbmUsIDApKTsKKyAgICBuZXh0TGluZSArPSBtQ2FjaGVMaW5lcy50b3AoKS0+bU1heEhlaWdodDsKKyAgICBtQ2FjaGVMaW5lcy5wdXNoKG5ldyBDYWNoZVRleHR1cmVMaW5lKDMyLCB0ZXhUeXBlLT5nZXREaW1YKCksIG5leHRMaW5lLCAwKSk7CisgICAgbmV4dExpbmUgKz0gbUNhY2hlTGluZXMudG9wKCktPm1NYXhIZWlnaHQ7CisgICAgbUNhY2hlTGluZXMucHVzaChuZXcgQ2FjaGVUZXh0dXJlTGluZSgzMiwgdGV4VHlwZS0+Z2V0RGltWCgpLCBuZXh0TGluZSwgMCkpOworICAgIG5leHRMaW5lICs9IG1DYWNoZUxpbmVzLnRvcCgpLT5tTWF4SGVpZ2h0OworICAgIG1DYWNoZUxpbmVzLnB1c2gobmV3IENhY2hlVGV4dHVyZUxpbmUoNDAsIHRleFR5cGUtPmdldERpbVgoKSwgbmV4dExpbmUsIDApKTsKKyAgICBuZXh0TGluZSArPSBtQ2FjaGVMaW5lcy50b3AoKS0+bU1heEhlaWdodDsKKyAgICBtQ2FjaGVMaW5lcy5wdXNoKG5ldyBDYWNoZVRleHR1cmVMaW5lKHRleFR5cGUtPmdldERpbVkoKSAtIG5leHRMaW5lLCB0ZXhUeXBlLT5nZXREaW1YKCksIG5leHRMaW5lLCAwKSk7Cit9CisKKy8vIEF2b2lkIGhhdmluZyB0byByZWFsbG9jYXRlIG1lbW9yeSBhbmQgcmVuZGVyIHF1YWQgYnkgcXVhZAordm9pZCBGb250U3RhdGU6OmluaXRWZXJ0ZXhBcnJheUJ1ZmZlcnMoKQoreworICAgIC8vIE5vdyBsZXRzIHdyaXRlIGluZGV4IGRhdGEKKyAgICBjb25zdCBFbGVtZW50ICppbmRleEVsZW0gPSBFbGVtZW50OjpjcmVhdGUobVJTQywgUlNfVFlQRV9VTlNJR05FRF8xNiwgUlNfS0lORF9VU0VSLCBmYWxzZSwgMSk7CisgICAgVHlwZSAqaW5kZXhUeXBlID0gbmV3IFR5cGUobVJTQyk7CisgICAgdWludDMyX3QgbnVtSW5kaWNpZXMgPSBtTWF4TnVtYmVyT2ZRdWFkcyAqIDY7CisgICAgaW5kZXhUeXBlLT5zZXREaW1YKG51bUluZGljaWVzKTsKKyAgICBpbmRleFR5cGUtPnNldEVsZW1lbnQoaW5kZXhFbGVtKTsKKyAgICBpbmRleFR5cGUtPmNvbXB1dGUoKTsKKworICAgIEFsbG9jYXRpb24gKmluZGV4QWxsb2MgPSBuZXcgQWxsb2NhdGlvbihtUlNDLCBpbmRleFR5cGUpOworICAgIHVpbnQxNl90ICppbmRleFB0ciA9ICh1aW50MTZfdCopaW5kZXhBbGxvYy0+Z2V0UHRyKCk7CisKKyAgICAvLyBGb3VyIHZlcnRzLCB0d28gdHJpYW5nbGVzICwgc2l4IGluZGljZXMgcGVyIHF1YWQKKyAgICBmb3IodWludDMyX3QgaSA9IDA7IGkgPCBtTWF4TnVtYmVyT2ZRdWFkczsgaSArKykgeworICAgICAgICBpbnQgaTYgPSBpICogNjsKKyAgICAgICAgaW50IGk0ID0gaSAqIDQ7CisKKyAgICAgICAgaW5kZXhQdHJbaTYgKyAwXSA9IGk0ICsgMDsKKyAgICAgICAgaW5kZXhQdHJbaTYgKyAxXSA9IGk0ICsgMTsKKyAgICAgICAgaW5kZXhQdHJbaTYgKyAyXSA9IGk0ICsgMjsKKworICAgICAgICBpbmRleFB0cltpNiArIDNdID0gaTQgKyAwOworICAgICAgICBpbmRleFB0cltpNiArIDRdID0gaTQgKyAyOworICAgICAgICBpbmRleFB0cltpNiArIDVdID0gaTQgKyAzOworICAgIH0KKworICAgIGluZGV4QWxsb2MtPmRlZmVyZWRVcGxvYWRUb0J1ZmZlck9iamVjdChtUlNDKTsKKyAgICBtSW5kZXhCdWZmZXIuc2V0KGluZGV4QWxsb2MpOworCisgICAgY29uc3QgRWxlbWVudCAqcG9zRWxlbSA9IEVsZW1lbnQ6OmNyZWF0ZShtUlNDLCBSU19UWVBFX0ZMT0FUXzMyLCBSU19LSU5EX1VTRVIsIGZhbHNlLCAzKTsKKyAgICBjb25zdCBFbGVtZW50ICp0ZXhFbGVtID0gRWxlbWVudDo6Y3JlYXRlKG1SU0MsIFJTX1RZUEVfRkxPQVRfMzIsIFJTX0tJTkRfVVNFUiwgZmFsc2UsIDIpOworCisgICAgY29uc3QgRWxlbWVudCAqZWxlbUFycmF5WzJdOworICAgIGVsZW1BcnJheVswXSA9IHBvc0VsZW07CisgICAgZWxlbUFycmF5WzFdID0gdGV4RWxlbTsKKworICAgIFN0cmluZzggcG9zTmFtZSgicG9zaXRpb24iKTsKKyAgICBTdHJpbmc4IHRleE5hbWUoInRleHR1cmUwIik7CisKKyAgICBjb25zdCBjaGFyICpuYW1lQXJyYXlbMl07CisgICAgbmFtZUFycmF5WzBdID0gcG9zTmFtZS5zdHJpbmcoKTsKKyAgICBuYW1lQXJyYXlbMV0gPSB0ZXhOYW1lLnN0cmluZygpOworICAgIHNpemVfdCBsZW5ndGhzWzJdOworICAgIGxlbmd0aHNbMF0gPSBwb3NOYW1lLnNpemUoKTsKKyAgICBsZW5ndGhzWzFdID0gdGV4TmFtZS5zaXplKCk7CisKKyAgICBjb25zdCBFbGVtZW50ICp2ZXJ0ZXhEYXRhRWxlbSA9IEVsZW1lbnQ6OmNyZWF0ZShtUlNDLCAyLCBlbGVtQXJyYXksIG5hbWVBcnJheSwgbGVuZ3Rocyk7CisKKyAgICBUeXBlICp2ZXJ0ZXhEYXRhVHlwZSA9IG5ldyBUeXBlKG1SU0MpOworICAgIHZlcnRleERhdGFUeXBlLT5zZXREaW1YKG1NYXhOdW1iZXJPZlF1YWRzICogNCk7CisgICAgdmVydGV4RGF0YVR5cGUtPnNldEVsZW1lbnQodmVydGV4RGF0YUVsZW0pOworICAgIHZlcnRleERhdGFUeXBlLT5jb21wdXRlKCk7CisKKyAgICBBbGxvY2F0aW9uICp2ZXJ0ZXhBbGxvYyA9IG5ldyBBbGxvY2F0aW9uKG1SU0MsIHZlcnRleERhdGFUeXBlKTsKKyAgICBtVGV4dE1lc2hQdHIgPSAoZmxvYXQqKXZlcnRleEFsbG9jLT5nZXRQdHIoKTsKKworICAgIG1WZXJ0ZXhBcnJheS5zZXQodmVydGV4QWxsb2MpOworfQorCisvLyBXZSBkb24ndCB3YW50IHRvIGFsbG9jYXRlIGFueXRoaW5nIHVubGVzcyB3ZSBhY3R1YWxseSBkcmF3IHRleHQKK3ZvaWQgRm9udFN0YXRlOjpjaGVja0luaXQoKQoreworICAgIGlmKG1Jbml0aWFsaXplZCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaW5pdFRleHRUZXh0dXJlKCk7CisgICAgaW5pdFJlbmRlclN0YXRlKCk7CisKKyAgICBpbml0VmVydGV4QXJyYXlCdWZmZXJzKCk7CisKKyAgICAvKm1UZXh0TWVzaFJlZnMgPSBuZXcgT2JqZWN0QmFzZVJlZjxTaW1wbGVNZXNoPlttTnVtTWVzaGVzXTsKKworICAgIGZvcih1aW50MzJfdCBpID0gMDsgaSA8IG1OdW1NZXNoZXM7IGkgKyspeworICAgICAgICBTaW1wbGVNZXNoICp0ZXh0TWVzaCA9IGNyZWF0ZVRleHRNZXNoKCk7CisgICAgICAgIG1UZXh0TWVzaFJlZnNbaV0uc2V0KHRleHRNZXNoKTsKKyAgICB9Ki8KKworICAgIG1Jbml0aWFsaXplZCA9IHRydWU7Cit9CisKK3ZvaWQgRm9udFN0YXRlOjppc3N1ZURyYXdDb21tYW5kKCkgeworCisgICAgT2JqZWN0QmFzZVJlZjxjb25zdCBQcm9ncmFtVmVydGV4PiB0bXBWKG1SU0MtPmdldFZlcnRleCgpKTsKKyAgICBtUlNDLT5zZXRWZXJ0ZXgobVJTQy0+Z2V0RGVmYXVsdFByb2dyYW1WZXJ0ZXgoKSk7CisKKyAgICBPYmplY3RCYXNlUmVmPGNvbnN0IFByb2dyYW1GcmFnbWVudD4gdG1wRihtUlNDLT5nZXRGcmFnbWVudCgpKTsKKyAgICBtUlNDLT5zZXRGcmFnbWVudChtRm9udFNoYWRlckYuZ2V0KCkpOworCisgICAgT2JqZWN0QmFzZVJlZjxjb25zdCBQcm9ncmFtU3RvcmU+IHRtcFBTKG1SU0MtPmdldEZyYWdtZW50U3RvcmUoKSk7CisgICAgbVJTQy0+c2V0RnJhZ21lbnRTdG9yZShtRm9udFByb2dyYW1TdG9yZS5nZXQoKSk7CisKKyAgICBpZiAoIW1SU0MtPnNldHVwQ2hlY2soKSkgeworICAgICAgICBtUlNDLT5zZXRWZXJ0ZXgoKFByb2dyYW1WZXJ0ZXggKil0bXBWLmdldCgpKTsKKyAgICAgICAgbVJTQy0+c2V0RnJhZ21lbnQoKFByb2dyYW1GcmFnbWVudCAqKXRtcEYuZ2V0KCkpOworICAgICAgICBtUlNDLT5zZXRGcmFnbWVudFN0b3JlKChQcm9ncmFtU3RvcmUgKil0bXBQUy5nZXQoKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBmbG9hdCAqdnR4ID0gKGZsb2F0KiltVmVydGV4QXJyYXktPmdldFB0cigpOworICAgIGZsb2F0ICp0ZXggPSB2dHggKyAzOworCisgICAgVmVydGV4QXJyYXkgdmE7CisgICAgdmEuYWRkKEdMX0ZMT0FULCAzLCAyMCwgZmFsc2UsICh1aW50MzJfdCl2dHgsICJwb3NpdGlvbiIpOworICAgIHZhLmFkZChHTF9GTE9BVCwgMiwgMjAsIGZhbHNlLCAodWludDMyX3QpdGV4LCAidGV4dHVyZTAiKTsKKyAgICB2YS5zZXR1cEdMMihtUlNDLCAmbVJTQy0+bVN0YXRlVmVydGV4QXJyYXksICZtUlNDLT5tU2hhZGVyQ2FjaGUpOworCisgICAgbUluZGV4QnVmZmVyLT51cGxvYWRDaGVjayhtUlNDKTsKKyAgICBnbEJpbmRCdWZmZXIoR0xfRUxFTUVOVF9BUlJBWV9CVUZGRVIsIG1JbmRleEJ1ZmZlci0+Z2V0QnVmZmVyT2JqZWN0SUQoKSk7CisgICAgZ2xEcmF3RWxlbWVudHMoR0xfVFJJQU5HTEVTLCBtQ3VycmVudFF1YWRJbmRleCAqIDYsIEdMX1VOU0lHTkVEX1NIT1JULCAodWludDE2X3QgKikoMCkpOworCisgICAgLy8gUmVzZXQgdGhlIHN0YXRlCisgICAgbVJTQy0+c2V0VmVydGV4KChQcm9ncmFtVmVydGV4ICopdG1wVi5nZXQoKSk7CisgICAgbVJTQy0+c2V0RnJhZ21lbnQoKFByb2dyYW1GcmFnbWVudCAqKXRtcEYuZ2V0KCkpOworICAgIG1SU0MtPnNldEZyYWdtZW50U3RvcmUoKFByb2dyYW1TdG9yZSAqKXRtcFBTLmdldCgpKTsKK30KKwordm9pZCBGb250U3RhdGU6OmFwcGVuZE1lc2hRdWFkKGZsb2F0IHgxLCBmbG9hdCB5MSwgZmxvYXQgejEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdTEsIGZsb2F0IHYxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHgyLCBmbG9hdCB5MiwgZmxvYXQgejIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdTIsIGZsb2F0IHYyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHgzLCBmbG9hdCB5MywgZmxvYXQgejMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdTMsIGZsb2F0IHYzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHg0LCBmbG9hdCB5NCwgZmxvYXQgejQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdTQsIGZsb2F0IHY0KQoreworICAgIGNvbnN0IHVpbnQzMl90IHZlcnRzUGVyUXVhZCA9IDQ7CisgICAgY29uc3QgdWludDMyX3QgZmxvYXRzUGVyVmVydCA9IDU7CisgICAgZmxvYXQgKmN1cnJlbnRQb3MgPSBtVGV4dE1lc2hQdHIgKyBtQ3VycmVudFF1YWRJbmRleCAqIHZlcnRzUGVyUXVhZCAqIGZsb2F0c1BlclZlcnQ7CisKKyAgICAvLyBDdWxsIHRoaW5ncyB0aGF0IGFyZSBvZmYgdGhlIHNjcmVlbgorICAgIGZsb2F0IHdpZHRoID0gKGZsb2F0KW1SU0MtPmdldFdpZHRoKCk7CisgICAgZmxvYXQgaGVpZ2h0ID0gKGZsb2F0KW1SU0MtPmdldEhlaWdodCgpOworCisgICAgaWYoeDEgPiB3aWR0aCB8fCB5MSA8IDAuMGYgfHwgeDIgPCAwIHx8IHk0ID4gaGVpZ2h0KSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvKkxPR0UoIlYwIHg6ICVmIHk6ICVmIHo6ICVmIiwgeDEsIHkxLCB6MSk7CisgICAgTE9HRSgiVjEgeDogJWYgeTogJWYgejogJWYiLCB4MiwgeTIsIHoyKTsKKyAgICBMT0dFKCJWMiB4OiAlZiB5OiAlZiB6OiAlZiIsIHgzLCB5MywgejMpOworICAgIExPR0UoIlYzIHg6ICVmIHk6ICVmIHo6ICVmIiwgeDQsIHk0LCB6NCk7Ki8KKworICAgICgqY3VycmVudFBvcysrKSA9IHgxOworICAgICgqY3VycmVudFBvcysrKSA9IHkxOworICAgICgqY3VycmVudFBvcysrKSA9IHoxOworICAgICgqY3VycmVudFBvcysrKSA9IHUxOworICAgICgqY3VycmVudFBvcysrKSA9IHYxOworCisgICAgKCpjdXJyZW50UG9zKyspID0geDI7CisgICAgKCpjdXJyZW50UG9zKyspID0geTI7CisgICAgKCpjdXJyZW50UG9zKyspID0gejI7CisgICAgKCpjdXJyZW50UG9zKyspID0gdTI7CisgICAgKCpjdXJyZW50UG9zKyspID0gdjI7CisKKyAgICAoKmN1cnJlbnRQb3MrKykgPSB4MzsKKyAgICAoKmN1cnJlbnRQb3MrKykgPSB5MzsKKyAgICAoKmN1cnJlbnRQb3MrKykgPSB6MzsKKyAgICAoKmN1cnJlbnRQb3MrKykgPSB1MzsKKyAgICAoKmN1cnJlbnRQb3MrKykgPSB2MzsKKworICAgICgqY3VycmVudFBvcysrKSA9IHg0OworICAgICgqY3VycmVudFBvcysrKSA9IHk0OworICAgICgqY3VycmVudFBvcysrKSA9IHo0OworICAgICgqY3VycmVudFBvcysrKSA9IHU0OworICAgICgqY3VycmVudFBvcysrKSA9IHY0OworCisgICAgbUN1cnJlbnRRdWFkSW5kZXggKys7CisKKyAgICBpZihtQ3VycmVudFF1YWRJbmRleCA9PSBtTWF4TnVtYmVyT2ZRdWFkcykgeworICAgICAgICBpc3N1ZURyYXdDb21tYW5kKCk7CisgICAgICAgIG1DdXJyZW50UXVhZEluZGV4ID0gMDsKKyAgICB9Cit9CisKK3ZvaWQgRm9udFN0YXRlOjpyZW5kZXJUZXh0KGNvbnN0IGNoYXIgKnRleHQsIHVpbnQzMl90IGxlbiwgdWludDMyX3Qgc3RhcnRJbmRleCwgaW50IG51bUdseXBocywgaW50IHgsIGludCB5KQoreworICAgIGNoZWNrSW5pdCgpOworCisgICAgU3RyaW5nOCB0ZXh0OCh0ZXh0KTsKKworICAgIC8vIFJlbmRlciBjb2RlIGhlcmUKKyAgICBGb250ICpjdXJyZW50Rm9udCA9IG1SU0MtPmdldEZvbnQoKTsKKyAgICBjdXJyZW50Rm9udC0+cmVuZGVyVVRGKHRleHQsIGxlbiwgc3RhcnRJbmRleCwgbnVtR2x5cGhzLCB4LCB5KTsKKworICAgIGlmKG1DdXJyZW50UXVhZEluZGV4ICE9IDApIHsKKyAgICAgICAgaXNzdWVEcmF3Q29tbWFuZCgpOworICAgICAgICBtQ3VycmVudFF1YWRJbmRleCA9IDA7CisgICAgfQorfQorCit2b2lkIEZvbnRTdGF0ZTo6cmVuZGVyVGV4dChjb25zdCBjaGFyICp0ZXh0LCBpbnQgeCwgaW50IHkpCit7CisgICAgc2l6ZV90IHRleHRMZW4gPSBzdHJsZW4odGV4dCk7CisgICAgcmVuZGVyVGV4dCh0ZXh0LCB0ZXh0TGVuLCAwLCAtMSwgeCwgeSk7Cit9CisKK3ZvaWQgRm9udFN0YXRlOjpyZW5kZXJUZXh0KEFsbG9jYXRpb24gKmFsbG9jLCBpbnQgeCwgaW50IHkpCit7CisgICAgaWYoIWFsbG9jKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjb25zdCBjaGFyICp0ZXh0ID0gKGNvbnN0IGNoYXIgKilhbGxvYy0+Z2V0UHRyKCk7CisgICAgc2l6ZV90IGFsbG9jU2l6ZSA9IGFsbG9jLT5nZXRUeXBlKCktPmdldFNpemVCeXRlcygpOworICAgIHJlbmRlclRleHQodGV4dCwgYWxsb2NTaXplLCAwLCAtMSwgeCwgeSk7Cit9CisKK3ZvaWQgRm9udFN0YXRlOjpyZW5kZXJUZXh0KEFsbG9jYXRpb24gKmFsbG9jLCB1aW50MzJfdCBzdGFydCwgaW50IGxlbiwgaW50IHgsIGludCB5KQoreworICAgIGlmKCFhbGxvYykgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgY29uc3QgY2hhciAqdGV4dCA9IChjb25zdCBjaGFyICopYWxsb2MtPmdldFB0cigpOworICAgIHNpemVfdCBhbGxvY1NpemUgPSBhbGxvYy0+Z2V0VHlwZSgpLT5nZXRTaXplQnl0ZXMoKTsKKyAgICByZW5kZXJUZXh0KHRleHQsIGFsbG9jU2l6ZSwgc3RhcnQsIGxlbiwgeCwgeSk7Cit9CisKK3ZvaWQgRm9udFN0YXRlOjpkZWluaXQoQ29udGV4dCAqcnNjKQoreworICAgIGlmKG1MaWJyYXJ5KSB7CisgICAgICAgIEZUX0RvbmVfRnJlZVR5cGUoIG1MaWJyYXJ5ICk7CisgICAgfQorCisgICAgZGVsZXRlIG1EZWZhdWx0LmdldCgpOworICAgIG1EZWZhdWx0LmNsZWFyKCk7Cit9CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSByZW5kZXJzY3JpcHQgeworCitSc0ZvbnQgcnNpX0ZvbnRDcmVhdGVGcm9tRmlsZShDb250ZXh0ICpyc2MsIGNoYXIgY29uc3QgKm5hbWUsIHVpbnQzMl90IGZvbnRTaXplLCB1aW50MzJfdCBkcGkpCit7CisgICAgcmV0dXJuIEZvbnQ6OmNyZWF0ZShyc2MsIG5hbWUsIGZvbnRTaXplLCBkcGkpOworfQorCit9IC8vIHJlbmRlcnNjcmlwdAorfSAvLyBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJzL3JzL3JzRm9udC5oIGIvbGlicy9ycy9yc0ZvbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDE1NTZkCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9yc0ZvbnQuaApAQCAtMCwwICsxLDIwOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9SU19GT05UX0gKKyNkZWZpbmUgQU5EUk9JRF9SU19GT05UX0gKKworI2luY2x1ZGUgIlJlbmRlclNjcmlwdC5oIgorI2luY2x1ZGUgInJzU3RyZWFtLmgiCisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgorI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CisKKyNpbmNsdWRlIDxmdDJidWlsZC5oPgorI2luY2x1ZGUgRlRfRlJFRVRZUEVfSAorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK25hbWVzcGFjZSBhbmRyb2lkIHsKKworbmFtZXNwYWNlIHJlbmRlcnNjcmlwdCB7CisKK2NsYXNzIEZvbnRTdGF0ZTsKKworY2xhc3MgRm9udCA6IHB1YmxpYyBPYmplY3RCYXNlCit7CitwdWJsaWM6CisgICAgfkZvbnQoKTsKKworICAgIC8vIFBvaW50ZXIgdG8gdGhlIHV0ZiBkYXRhLCBsZW5ndGggb2YgZGF0YSwgd2hlcmUgdG8gc3RhcnQsIG51bWJlciBvZiBnbHlwaHMgb3QgcmVhZAorICAgIC8vIChlYWNoIGdseXBoIG1heSBiZSBsb25nZXIgdGhhbiBhIGNoYXIgYmVjYXVzZSB3ZSBhcmUgZGVhbGluZyB3aXRoIHV0ZiBkYXRhKQorICAgIC8vIExhc3QgdHdvIHZhcmlhYmxlcyBhcmUgdGhlIGluaXRpYWwgcGVuIHBvc2l0aW9uCisgICAgdm9pZCByZW5kZXJVVEYoY29uc3QgY2hhciAqdGV4dCwgdWludDMyX3QgbGVuLCB1aW50MzJfdCBzdGFydCwgaW50IG51bUdseXBocywgaW50IHgsIGludCB5KTsKKworICAgIC8vIEN1cnJlbnRseSBmaWxlcyBkbyBub3QgZ2V0IHNlcmlhbGl6ZWQsCisgICAgLy8gYnV0IHdlIG5lZWQgdG8gaW5oZXJpdCBmcm9tIE9iamVjdEJhc2UgZm9yIHJlZiB0cmFja2luZworICAgIHZpcnR1YWwgdm9pZCBzZXJpYWxpemUoT1N0cmVhbSAqc3RyZWFtKSBjb25zdCB7CisgICAgfQorICAgIHZpcnR1YWwgUnNBM0RDbGFzc0lEIGdldENsYXNzSWQoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBSU19BM0RfQ0xBU1NfSURfVU5LTk9XTjsKKyAgICB9CisKKyAgICBzdGF0aWMgRm9udCAqIGNyZWF0ZShDb250ZXh0ICpyc2MsIGNvbnN0IGNoYXIgKm5hbWUsIHVpbnQzMl90IGZvbnRTaXplLCB1aW50MzJfdCBkcGkpOworCitwcm90ZWN0ZWQ6CisKKyAgICBmcmllbmQgY2xhc3MgRm9udFN0YXRlOworCisgICAgdm9pZCBpbnZhbGlkYXRlVGV4dHVyZUNhY2hlKCk7CisgICAgc3RydWN0IENhY2hlZEdseXBoSW5mbworICAgIHsKKyAgICAgICAgLy8gSGFzIHRoZSBjYWNoZSBiZWVuIGludmFsaWRhdGVkPworICAgICAgICBib29sIG1Jc1ZhbGlkOworICAgICAgICAvLyBMb2NhdGlvbiBvZiB0aGUgY2FjaGVkIGdseXBoIGluIHRoZSBiaXRtYXAKKyAgICAgICAgLy8gaW4gY2FzZSB3ZSBuZWVkIHRvIHJlc2l6ZSB0aGUgdGV4dHVyZQorICAgICAgICB1aW50MzJfdCBtQml0bWFwTWluWDsKKyAgICAgICAgdWludDMyX3QgbUJpdG1hcE1pblk7CisgICAgICAgIHVpbnQzMl90IG1CaXRtYXBXaWR0aDsKKyAgICAgICAgdWludDMyX3QgbUJpdG1hcEhlaWdodDsKKyAgICAgICAgLy8gQWxzbyBjYWNoZSB0ZXh0dXJlIGNvb3JkcyBmb3IgdGhlIHF1YWQKKyAgICAgICAgZmxvYXQgbUJpdG1hcE1pblU7CisgICAgICAgIGZsb2F0IG1CaXRtYXBNaW5WOworICAgICAgICBmbG9hdCBtQml0bWFwTWF4VTsKKyAgICAgICAgZmxvYXQgbUJpdG1hcE1heFY7CisgICAgICAgIC8vIE1pbmltaXplIGhvdyBtdWNoIHdlIGNhbGwgZnJlZXR5cGUKKyAgICAgICAgRlRfVUludCBtR2x5cGhJbmRleDsKKyAgICAgICAgRlRfVmVjdG9yIG1BZHZhbmNlOworICAgICAgICAvLyBWYWx1ZXMgYmVsb3cgY29udGFpbiBhIGdseXBoJ3Mgb3JpZ2luIGluIHRoZSBiaXRtYXAKKyAgICAgICAgRlRfSW50IG1CaXRtYXBMZWZ0OworICAgICAgICBGVF9JbnQgbUJpdG1hcFRvcDsKKyAgICAgICAgLy8gSG9sZCBvbiB0byB0aGUgYml0bWFwIGluIGNhc2UgY2FjaGUgaXMgaW52YWxpZGF0ZWQKKyAgICAgICAgRlRfQml0bWFwIG1CaXRtYXA7CisgICAgICAgIGJvb2wgbUJpdG1hcFZhbGlkOworICAgIH07CisKKyAgICBTdHJpbmc4IG1Gb250TmFtZTsKKyAgICB1aW50MzJfdCBtRm9udFNpemU7CisgICAgdWludDMyX3QgbURwaTsKKworICAgIEZvbnQoQ29udGV4dCAqcnNjKTsKKyAgICBib29sIGluaXQoY29uc3QgY2hhciAqbmFtZSwgdWludDMyX3QgZm9udFNpemUsIHVpbnQzMl90IGRwaSk7CisKKyAgICBGVF9GYWNlIG1GYWNlOworICAgIGJvb2wgbUluaXRpYWxpemVkOworICAgIGJvb2wgbUhhc0tlcm5pbmc7CisKKyAgICBEZWZhdWx0S2V5ZWRWZWN0b3I8dWludDMyX3QsIENhY2hlZEdseXBoSW5mbyogPiBtQ2FjaGVkR2x5cGhzOworCisgICAgQ2FjaGVkR2x5cGhJbmZvICpjYWNoZUdseXBoKHVpbnQzMl90IGdseXBoKTsKKyAgICB2b2lkIHVwZGF0ZUdseXBoQ2FjaGUoQ2FjaGVkR2x5cGhJbmZvICpnbHlwaCk7CisgICAgdm9pZCBkcmF3Q2FjaGVkR2x5cGgoQ2FjaGVkR2x5cGhJbmZvICpnbHlwaCwgaW50IHgsIGludCB5KTsKK307CisKK2NsYXNzIEZvbnRTdGF0ZQoreworcHVibGljOgorICAgIEZvbnRTdGF0ZSgpOworICAgIH5Gb250U3RhdGUoKTsKKworICAgIHZvaWQgaW5pdChDb250ZXh0ICpyc2MpOworICAgIHZvaWQgZGVpbml0KENvbnRleHQgKnJzYyk7CisKKyAgICBPYmplY3RCYXNlUmVmPEZvbnQ+IG1EZWZhdWx0OworICAgIE9iamVjdEJhc2VSZWY8Rm9udD4gbUxhc3Q7CisKKyAgICB2b2lkIHJlbmRlclRleHQoY29uc3QgY2hhciAqdGV4dCwgdWludDMyX3QgbGVuLCB1aW50MzJfdCBzdGFydEluZGV4LCBpbnQgbnVtR2x5cGhzLCBpbnQgeCwgaW50IHkpOworICAgIHZvaWQgcmVuZGVyVGV4dChjb25zdCBjaGFyICp0ZXh0LCBpbnQgeCwgaW50IHkpOworICAgIHZvaWQgcmVuZGVyVGV4dChBbGxvY2F0aW9uICphbGxvYywgaW50IHgsIGludCB5KTsKKyAgICB2b2lkIHJlbmRlclRleHQoQWxsb2NhdGlvbiAqYWxsb2MsIHVpbnQzMl90IHN0YXJ0LCBpbnQgbGVuLCBpbnQgeCwgaW50IHkpOworCitwcm90ZWN0ZWQ6CisKKyAgICBmcmllbmQgY2xhc3MgRm9udDsKKworICAgIHN0cnVjdCBDYWNoZVRleHR1cmVMaW5lCisgICAgeworICAgICAgICB1aW50MzJfdCBtTWF4SGVpZ2h0OworICAgICAgICB1aW50MzJfdCBtTWF4V2lkdGg7CisgICAgICAgIHVpbnQzMl90IG1DdXJyZW50Um93OworICAgICAgICB1aW50MzJfdCBtQ3VycmVudENvbDsKKworICAgICAgICBDYWNoZVRleHR1cmVMaW5lKHVpbnQzMl90IG1heEhlaWdodCwgdWludDMyX3QgbWF4V2lkdGgsIHVpbnQzMl90IGN1cnJlbnRSb3csIHVpbnQzMl90IGN1cnJlbnRDb2wpIDoKKyAgICAgICAgICAgIG1NYXhIZWlnaHQobWF4SGVpZ2h0KSwgbU1heFdpZHRoKG1heFdpZHRoKSwgbUN1cnJlbnRSb3coY3VycmVudFJvdyksIG1DdXJyZW50Q29sKGN1cnJlbnRDb2wpIHsKKyAgICAgICAgfQorCisgICAgICAgIGJvb2wgZml0Qml0bWFwKEZUX0JpdG1hcCAqYml0bWFwLCB1aW50MzJfdCAqcmV0T3JpZ2luWCwgdWludDMyX3QgKnJldE9yaWdpblkpIHsKKyAgICAgICAgICAgIGlmKCh1aW50MzJfdCliaXRtYXAtPnJvd3MgPiBtTWF4SGVpZ2h0KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZihtQ3VycmVudENvbCArICh1aW50MzJfdCliaXRtYXAtPndpZHRoIDwgbU1heFdpZHRoKSB7CisgICAgICAgICAgICAgICAqcmV0T3JpZ2luWCA9IG1DdXJyZW50Q29sOworICAgICAgICAgICAgICAgKnJldE9yaWdpblkgPSBtQ3VycmVudFJvdzsKKyAgICAgICAgICAgICAgIG1DdXJyZW50Q29sICs9IGJpdG1hcC0+d2lkdGg7CisgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfTsKKworICAgIFZlY3RvcjxDYWNoZVRleHR1cmVMaW5lKj4gbUNhY2hlTGluZXM7CisKKyAgICBDb250ZXh0ICptUlNDOworCisgICAgLy8gRnJlZSB0eXBlIGxpYnJhcnksIHdlIG9ubHkgbmVlZCBvbmUgY29weQorICAgIEZUX0xpYnJhcnkgbUxpYnJhcnk7CisgICAgVmVjdG9yPEZvbnQqPiBtQWN0aXZlRm9udHM7CisKKyAgICAvLyBSZW5kZXIgc3RhdGUgZm9yIHRoZSBmb250CisgICAgT2JqZWN0QmFzZVJlZjxQcm9ncmFtRnJhZ21lbnQ+IG1Gb250U2hhZGVyRjsKKyAgICBPYmplY3RCYXNlUmVmPFNhbXBsZXI+IG1Gb250U2FtcGxlcjsKKyAgICBPYmplY3RCYXNlUmVmPFByb2dyYW1TdG9yZT4gbUZvbnRQcm9ncmFtU3RvcmU7CisgICAgdm9pZCBpbml0UmVuZGVyU3RhdGUoKTsKKworICAgIC8vIFRleHR1cmUgdG8gY2FjaGUgZ2x5cGggYml0bWFwcworICAgIE9iamVjdEJhc2VSZWY8QWxsb2NhdGlvbj4gbVRleHRUZXh0dXJlOworICAgIHZvaWQgaW5pdFRleHRUZXh0dXJlKCk7CisKKyAgICBib29sIGNhY2hlQml0bWFwKEZUX0JpdG1hcCAqYml0bWFwLCB1aW50MzJfdCAqcmV0T3JpZ2luWCwgdWludDMyX3QgKnJldE9yaWdpblkpOworICAgIGNvbnN0IFR5cGUqIGdldENhY2hlVGV4dHVyZVR5cGUoKSB7CisgICAgICAgIHJldHVybiBtVGV4dFRleHR1cmUtPmdldFR5cGUoKTsKKyAgICB9CisKKyAgICB2b2lkIGZsdXNoQWxsQW5kSW52YWxpZGF0ZSgpOworCisgICAgLy8gUG9pbnRlciB0byB2ZXJ0ZXggZGF0YSB0byBzcGVlZCB1cCBmcmFtZSB0byBmcmFtZSB3b3JrCisgICAgZmxvYXQgKm1UZXh0TWVzaFB0cjsKKyAgICB1aW50MzJfdCBtQ3VycmVudFF1YWRJbmRleDsKKyAgICB1aW50MzJfdCBtTWF4TnVtYmVyT2ZRdWFkczsKKworICAgIHZvaWQgaW5pdFZlcnRleEFycmF5QnVmZmVycygpOworICAgIE9iamVjdEJhc2VSZWY8QWxsb2NhdGlvbj4gbUluZGV4QnVmZmVyOworICAgIE9iamVjdEJhc2VSZWY8QWxsb2NhdGlvbj4gbVZlcnRleEFycmF5OworCisKKyAgICBib29sIG1Jbml0aWFsaXplZDsKKworICAgIHZvaWQgY2hlY2tJbml0KCk7CisKKyAgICB2b2lkIGlzc3VlRHJhd0NvbW1hbmQoKTsKKworICAgIHZvaWQgYXBwZW5kTWVzaFF1YWQoZmxvYXQgeDEsIGZsb2F0IHkxLCBmbG9hdCB6MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdTEsIGZsb2F0IHYxLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB4MiwgZmxvYXQgeTIsIGZsb2F0IHoyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB1MiwgZmxvYXQgdjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHgzLCBmbG9hdCB5MywgZmxvYXQgejMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHUzLCBmbG9hdCB2MywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeDQsIGZsb2F0IHk0LCBmbG9hdCB6NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdTQsIGZsb2F0IHY0KTsKKworfTsKKworCit9Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc0hhbmRjb2RlLmggYi9saWJzL3JzL3JzSGFuZGNvZGUuaAppbmRleCA4MDBlZGRkLi4zNTNiNzNhIDEwMDY0NAotLS0gYS9saWJzL3JzL3JzSGFuZGNvZGUuaAorKysgYi9saWJzL3JzL3JzSGFuZGNvZGUuaApAQCAtMSw2ICsxLDU3IEBACiAKICNkZWZpbmUgREFUQV9TWU5DX1NJWkUgMTAyNAogCitzdGF0aWMgaW5saW5lIHZvaWQgcnNIQ0FQSV9Db250ZXh0RmluaXNoIChSc0NvbnRleHQgcnNjKQoreworICAgIFRocmVhZElPICppbyA9ICYoKENvbnRleHQgKilyc2MpLT5tSU87CisgICAgdWludDMyX3Qgc2l6ZSA9IHNpemVvZihSU19DTURfQ29udGV4dEZpbmlzaCk7CisgICAgUlNfQ01EX0NvbnRleHRGaW5pc2ggKmNtZCA9IHN0YXRpY19jYXN0PFJTX0NNRF9Db250ZXh0RmluaXNoICo+KGlvLT5tVG9Db3JlLnJlc2VydmUoc2l6ZSkpOworICAgIGlvLT5tVG9Db3JlLmNvbW1pdFN5bmMoUlNfQ01EX0lEX0NvbnRleHRGaW5pc2gsIHNpemUpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcnNIQ0FQSV9TY3JpcHRJbnZva2VWIChSc0NvbnRleHQgcnNjLCBSc1NjcmlwdCB2YSwgdWludDMyX3Qgc2xvdCwgY29uc3Qgdm9pZCAqIGRhdGEsIHVpbnQzMl90IHNpemVCeXRlcykKK3sKKyAgICBUaHJlYWRJTyAqaW8gPSAmKChDb250ZXh0ICopcnNjKS0+bUlPOworICAgIHVpbnQzMl90IHNpemUgPSBzaXplb2YoUlNfQ01EX1NjcmlwdEludm9rZVYpOworICAgIGlmIChzaXplQnl0ZXMgPCBEQVRBX1NZTkNfU0laRSkgeworICAgICAgICBzaXplICs9IChzaXplQnl0ZXMgKyAzKSAmIH4zOworICAgIH0KKyAgICBSU19DTURfU2NyaXB0SW52b2tlViAqY21kID0gc3RhdGljX2Nhc3Q8UlNfQ01EX1NjcmlwdEludm9rZVYgKj4oaW8tPm1Ub0NvcmUucmVzZXJ2ZShzaXplKSk7CisgICAgY21kLT5zID0gdmE7CisgICAgY21kLT5zbG90ID0gc2xvdDsKKyAgICBjbWQtPmRhdGFMZW4gPSBzaXplQnl0ZXM7CisgICAgY21kLT5kYXRhID0gZGF0YTsKKyAgICBpZiAoc2l6ZUJ5dGVzIDwgREFUQV9TWU5DX1NJWkUpIHsKKyAgICAgICAgY21kLT5kYXRhID0gKHZvaWQgKikoY21kKzEpOworICAgICAgICBtZW1jcHkoY21kKzEsIGRhdGEsIHNpemVCeXRlcyk7CisgICAgICAgIGlvLT5tVG9Db3JlLmNvbW1pdChSU19DTURfSURfU2NyaXB0SW52b2tlViwgc2l6ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW8tPm1Ub0NvcmUuY29tbWl0U3luYyhSU19DTURfSURfU2NyaXB0SW52b2tlViwgc2l6ZSk7CisgICAgfQorfQorCisKK3N0YXRpYyBpbmxpbmUgdm9pZCByc0hDQVBJX1NjcmlwdFNldFZhclYgKFJzQ29udGV4dCByc2MsIFJzU2NyaXB0IHZhLCB1aW50MzJfdCBzbG90LCBjb25zdCB2b2lkICogZGF0YSwgdWludDMyX3Qgc2l6ZUJ5dGVzKQoreworICAgIFRocmVhZElPICppbyA9ICYoKENvbnRleHQgKilyc2MpLT5tSU87CisgICAgdWludDMyX3Qgc2l6ZSA9IHNpemVvZihSU19DTURfU2NyaXB0U2V0VmFyVik7CisgICAgaWYgKHNpemVCeXRlcyA8IERBVEFfU1lOQ19TSVpFKSB7CisgICAgICAgIHNpemUgKz0gKHNpemVCeXRlcyArIDMpICYgfjM7CisgICAgfQorICAgIFJTX0NNRF9TY3JpcHRTZXRWYXJWICpjbWQgPSBzdGF0aWNfY2FzdDxSU19DTURfU2NyaXB0U2V0VmFyViAqPihpby0+bVRvQ29yZS5yZXNlcnZlKHNpemUpKTsKKyAgICBjbWQtPnMgPSB2YTsKKyAgICBjbWQtPnNsb3QgPSBzbG90OworICAgIGNtZC0+ZGF0YUxlbiA9IHNpemVCeXRlczsKKyAgICBjbWQtPmRhdGEgPSBkYXRhOworICAgIGlmIChzaXplQnl0ZXMgPCBEQVRBX1NZTkNfU0laRSkgeworICAgICAgICBjbWQtPmRhdGEgPSAodm9pZCAqKShjbWQrMSk7CisgICAgICAgIG1lbWNweShjbWQrMSwgZGF0YSwgc2l6ZUJ5dGVzKTsKKyAgICAgICAgaW8tPm1Ub0NvcmUuY29tbWl0KFJTX0NNRF9JRF9TY3JpcHRTZXRWYXJWLCBzaXplKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpby0+bVRvQ29yZS5jb21taXRTeW5jKFJTX0NNRF9JRF9TY3JpcHRTZXRWYXJWLCBzaXplKTsKKyAgICB9Cit9CisKIHN0YXRpYyBpbmxpbmUgdm9pZCByc0hDQVBJX0FsbG9jYXRpb25EYXRhIChSc0NvbnRleHQgcnNjLCBSc0FsbG9jYXRpb24gdmEsIGNvbnN0IHZvaWQgKiBkYXRhLCB1aW50MzJfdCBzaXplQnl0ZXMpCiB7CiAgICAgVGhyZWFkSU8gKmlvID0gJigoQ29udGV4dCAqKXJzYyktPm1JTzsKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNMaWdodC5jcHAgYi9saWJzL3JzL3JzTGlnaHQuY3BwCmluZGV4IDZmMmNmM2UuLmVhYjlhMDcgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNMaWdodC5jcHAKKysrIGIvbGlicy9ycy9yc0xpZ2h0LmNwcApAQCAtMTQsOSArMTQsMTMgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKyNpZm5kZWYgQU5EUk9JRF9SU19CVUlMRF9GT1JfSE9TVAogI2luY2x1ZGUgInJzQ29udGV4dC5oIgotCiAjaW5jbHVkZSA8R0xFUy9nbC5oPgorI2Vsc2UKKyNpbmNsdWRlICJyc0NvbnRleHRIb3N0U3R1Yi5oIgorI2luY2x1ZGUgPE9wZW5HTC9nbC5oPgorI2VuZGlmIC8vQU5EUk9JRF9SU19CVUlMRF9GT1JfSE9TVAogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpyZW5kZXJzY3JpcHQ7CkBAIC02NSw2ICs2OSwxNiBAQAogICAgIGdsTGlnaHRmdihHTF9MSUdIVDAgKyBudW0sIEdMX1BPU0lUSU9OLCBtUG9zaXRpb24pOwogfQogCit2b2lkIExpZ2h0OjpzZXJpYWxpemUoT1N0cmVhbSAqc3RyZWFtKSBjb25zdAoreworICAgIAorfQorCitMaWdodCAqTGlnaHQ6OmNyZWF0ZUZyb21TdHJlYW0oQ29udGV4dCAqcnNjLCBJU3RyZWFtICpzdHJlYW0pCit7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKIExpZ2h0U3RhdGU6OkxpZ2h0U3RhdGUoKQpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc0xpZ2h0LmggYi9saWJzL3JzL3JzTGlnaHQuaAppbmRleCBkODc5NmU2Li5iZDU4OTc5IDEwMDY0NAotLS0gYS9saWJzL3JzL3JzTGlnaHQuaAorKysgYi9saWJzL3JzL3JzTGlnaHQuaApAQCAtMzcsNiArMzcsOSBAQAogICAgIHZvaWQgc2V0Q29sb3IoZmxvYXQgciwgZmxvYXQgZywgZmxvYXQgYik7CiAKICAgICB2b2lkIHNldHVwR0wodWludDMyX3QgbnVtKSBjb25zdDsKKyAgICB2aXJ0dWFsIHZvaWQgc2VyaWFsaXplKE9TdHJlYW0gKnN0cmVhbSkgY29uc3Q7CisgICAgdmlydHVhbCBSc0EzRENsYXNzSUQgZ2V0Q2xhc3NJZCgpIGNvbnN0IHsgcmV0dXJuIFJTX0EzRF9DTEFTU19JRF9MSUdIVDsgfQorICAgIHN0YXRpYyBMaWdodCAqY3JlYXRlRnJvbVN0cmVhbShDb250ZXh0ICpyc2MsIElTdHJlYW0gKnN0cmVhbSk7CiAKIHByb3RlY3RlZDoKICAgICBmbG9hdCBtQ29sb3JbNF07CmRpZmYgLS1naXQgYS9saWJzL3JzL3JzTG9ja2xlc3NGaWZvLmNwcCBiL2xpYnMvcnMvcnNMb2NrbGVzc0ZpZm8uY3BwCmluZGV4IGM3OTY1MjAuLjc2Y2EzMmUgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNMb2NrbGVzc0ZpZm8uY3BwCisrKyBiL2xpYnMvcnMvcnNMb2NrbGVzc0ZpZm8uY3BwCkBAIC0xNyw3ICsxNyw3IEBACiAjaW5jbHVkZSAicnNMb2NrbGVzc0ZpZm8uaCIKIAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7Ci0KK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpyZW5kZXJzY3JpcHQ7CiAKIExvY2tsZXNzQ29tbWFuZEZpZm86OkxvY2tsZXNzQ29tbWFuZEZpZm8oKQogewpAQCAtMTI4LDE1ICsxMjgsMTkgQEAKICAgICAvL2R1bXBTdGF0ZSgiZmx1c2ggMiIpOwogfQogCit2b2lkIExvY2tsZXNzQ29tbWFuZEZpZm86OndhaXQoKQoreworICAgIHdoaWxlKGlzRW1wdHkoKSAmJiAhbUluU2h1dGRvd24pIHsKKyAgICAgICAgbVNpZ25hbFRvQ29udHJvbC5zZXQoKTsKKyAgICAgICAgbVNpZ25hbFRvV29ya2VyLndhaXQoKTsKKyAgICB9Cit9CisKIGNvbnN0IHZvaWQgKiBMb2NrbGVzc0NvbW1hbmRGaWZvOjpnZXQodWludDMyX3QgKmNvbW1hbmQsIHVpbnQzMl90ICpieXRlc0RhdGEpCiB7CiAgICAgd2hpbGUoMSkgewogICAgICAgICAvL2R1bXBTdGF0ZSgiZ2V0Iik7Ci0gICAgICAgIHdoaWxlKGlzRW1wdHkoKSAmJiAhbUluU2h1dGRvd24pIHsKLSAgICAgICAgICAgIG1TaWduYWxUb0NvbnRyb2wuc2V0KCk7Ci0gICAgICAgICAgICBtU2lnbmFsVG9Xb3JrZXIud2FpdCgpOwotICAgICAgICB9Ci0KKyAgICAgICAgd2FpdCgpOwogICAgICAgICBpZiAobUluU2h1dGRvd24pIHsKICAgICAgICAgICAgICpjb21tYW5kID0gMDsKICAgICAgICAgICAgICpieXRlc0RhdGEgPSAwOwpAQCAtMTkyLDc5ICsxOTYsMyBAQAogICAgIExPR1YoIiVzICBwdXQgJXAsIGdldCAlcCwgIGJ1ZiAlcCwgIGVuZCAlcCIsIHMsIG1QdXQsIG1HZXQsIG1CdWZmZXIsIG1FbmQpOwogfQogCi1Mb2NrbGVzc0NvbW1hbmRGaWZvOjpTaWduYWw6OlNpZ25hbCgpCi17Ci0gICAgbVNldCA9IHRydWU7Ci19Ci0KLUxvY2tsZXNzQ29tbWFuZEZpZm86OlNpZ25hbDo6flNpZ25hbCgpCi17Ci0gICAgcHRocmVhZF9tdXRleF9kZXN0cm95KCZtTXV0ZXgpOwotICAgIHB0aHJlYWRfY29uZF9kZXN0cm95KCZtQ29uZGl0aW9uKTsKLX0KLQotYm9vbCBMb2NrbGVzc0NvbW1hbmRGaWZvOjpTaWduYWw6OmluaXQoKQotewotICAgIGludCBzdGF0dXMgPSBwdGhyZWFkX211dGV4X2luaXQoJm1NdXRleCwgTlVMTCk7Ci0gICAgaWYgKHN0YXR1cykgewotICAgICAgICBMT0dFKCJMb2NrbGVzc0ZpZm8gbXV0ZXggaW5pdCBmYWlsdXJlIik7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBzdGF0dXMgPSBwdGhyZWFkX2NvbmRfaW5pdCgmbUNvbmRpdGlvbiwgTlVMTCk7Ci0gICAgaWYgKHN0YXR1cykgewotICAgICAgICBMT0dFKCJMb2NrbGVzc0ZpZm8gY29uZGl0aW9uIGluaXQgZmFpbHVyZSIpOwotICAgICAgICBwdGhyZWFkX211dGV4X2Rlc3Ryb3koJm1NdXRleCk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBMb2NrbGVzc0NvbW1hbmRGaWZvOjpTaWduYWw6OnNldCgpCi17Ci0gICAgaW50IHN0YXR1czsKLQotICAgIHN0YXR1cyA9IHB0aHJlYWRfbXV0ZXhfbG9jaygmbU11dGV4KTsKLSAgICBpZiAoc3RhdHVzKSB7Ci0gICAgICAgIExPR0UoIkxvY2tsZXNzQ29tbWFuZEZpZm86IGVycm9yICVpIGxvY2tpbmcgZm9yIHNldCBjb25kaXRpb24uIiwgc3RhdHVzKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIG1TZXQgPSB0cnVlOwotCi0gICAgc3RhdHVzID0gcHRocmVhZF9jb25kX3NpZ25hbCgmbUNvbmRpdGlvbik7Ci0gICAgaWYgKHN0YXR1cykgewotICAgICAgICBMT0dFKCJMb2NrbGVzc0NvbW1hbmRGaWZvOiBlcnJvciAlaSBvbiBzZXQgY29uZGl0aW9uLiIsIHN0YXR1cyk7Ci0gICAgfQotCi0gICAgc3RhdHVzID0gcHRocmVhZF9tdXRleF91bmxvY2soJm1NdXRleCk7Ci0gICAgaWYgKHN0YXR1cykgewotICAgICAgICBMT0dFKCJMb2NrbGVzc0NvbW1hbmRGaWZvOiBlcnJvciAlaSB1bmxvY2tpbmcgZm9yIHNldCBjb25kaXRpb24uIiwgc3RhdHVzKTsKLSAgICB9Ci19Ci0KLXZvaWQgTG9ja2xlc3NDb21tYW5kRmlmbzo6U2lnbmFsOjp3YWl0KCkKLXsKLSAgICBpbnQgc3RhdHVzOwotCi0gICAgc3RhdHVzID0gcHRocmVhZF9tdXRleF9sb2NrKCZtTXV0ZXgpOwotICAgIGlmIChzdGF0dXMpIHsKLSAgICAgICAgTE9HRSgiTG9ja2xlc3NDb21tYW5kRmlmbzogZXJyb3IgJWkgbG9ja2luZyBmb3IgY29uZGl0aW9uLiIsIHN0YXR1cyk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoIW1TZXQpIHsKLSAgICAgICAgc3RhdHVzID0gcHRocmVhZF9jb25kX3dhaXQoJm1Db25kaXRpb24sICZtTXV0ZXgpOwotICAgICAgICBpZiAoc3RhdHVzKSB7Ci0gICAgICAgICAgICBMT0dFKCJMb2NrbGVzc0NvbW1hbmRGaWZvOiBlcnJvciAlaSB3YWl0aW5nIG9uIGNvbmRpdGlvbi4iLCBzdGF0dXMpOwotICAgICAgICB9Ci0gICAgfQotICAgIG1TZXQgPSBmYWxzZTsKLQotICAgIHN0YXR1cyA9IHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtTXV0ZXgpOwotICAgIGlmIChzdGF0dXMpIHsKLSAgICAgICAgTE9HRSgiTG9ja2xlc3NDb21tYW5kRmlmbzogZXJyb3IgJWkgdW5sb2NraW5nIGZvciBjb25kaXRpb24uIiwgc3RhdHVzKTsKLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNMb2NrbGVzc0ZpZm8uaCBiL2xpYnMvcnMvcnNMb2NrbGVzc0ZpZm8uaAppbmRleCBkMGE0MzU2Li5hZTkwNmNhIDEwMDY0NAotLS0gYS9saWJzL3JzL3JzTG9ja2xlc3NGaWZvLmgKKysrIGIvbGlicy9ycy9yc0xvY2tsZXNzRmlmby5oCkBAIC0xOSw4ICsxOSwxMCBAQAogCiAKICNpbmNsdWRlICJyc1V0aWxzLmgiCisjaW5jbHVkZSAicnNTaWduYWwuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHJlbmRlcnNjcmlwdCB7CiAKIAogLy8gQSBzaW1wbGUgRklGTyB0byBiZSB1c2VkIGFzIGEgcHJvZHVjZXIgLyBjb25zdW1lciBiZXR3ZWVuIHR3bwpAQCAtMzcsMjQgKzM5LDcgQEAKICAgICBMb2NrbGVzc0NvbW1hbmRGaWZvKCk7CiAgICAgfkxvY2tsZXNzQ29tbWFuZEZpZm8oKTsKIAotCiBwcm90ZWN0ZWQ6Ci0gICAgY2xhc3MgU2lnbmFsIHsKLSAgICBwdWJsaWM6Ci0gICAgICAgIFNpZ25hbCgpOwotICAgICAgICB+U2lnbmFsKCk7Ci0KLSAgICAgICAgYm9vbCBpbml0KCk7Ci0KLSAgICAgICAgdm9pZCBzZXQoKTsKLSAgICAgICAgdm9pZCB3YWl0KCk7Ci0KLSAgICBwcm90ZWN0ZWQ6Ci0gICAgICAgIGJvb2wgbVNldDsKLSAgICAgICAgcHRocmVhZF9tdXRleF90IG1NdXRleDsKLSAgICAgICAgcHRocmVhZF9jb25kX3QgbUNvbmRpdGlvbjsKLSAgICB9OwotCiAgICAgdWludDhfdCAqIHZvbGF0aWxlIG1QdXQ7CiAgICAgdWludDhfdCAqIHZvbGF0aWxlIG1HZXQ7CiAgICAgdWludDhfdCAqIG1CdWZmZXI7CkBAIC02NSwxNCArNTAsMTQgQEAKICAgICBTaWduYWwgbVNpZ25hbFRvV29ya2VyOwogICAgIFNpZ25hbCBtU2lnbmFsVG9Db250cm9sOwogCi0KLQogcHVibGljOgogICAgIHZvaWQgKiByZXNlcnZlKHVpbnQzMl90IGJ5dGVzKTsKICAgICB2b2lkIGNvbW1pdCh1aW50MzJfdCBjb21tYW5kLCB1aW50MzJfdCBieXRlcyk7CiAgICAgdm9pZCBjb21taXRTeW5jKHVpbnQzMl90IGNvbW1hbmQsIHVpbnQzMl90IGJ5dGVzKTsKIAogICAgIHZvaWQgZmx1c2goKTsKKyAgICB2b2lkIHdhaXQoKTsKKwogICAgIGNvbnN0IHZvaWQgKiBnZXQodWludDMyX3QgKmNvbW1hbmQsIHVpbnQzMl90ICpieXRlc0RhdGEpOwogICAgIHZvaWQgbmV4dCgpOwogCkBAIC04OCw0ICs3Myw1IEBACiAKIAogfQorfQogI2VuZGlmCmRpZmYgLS1naXQgYS9saWJzL3JzL3JzTWVzaC5jcHAgYi9saWJzL3JzL3JzTWVzaC5jcHAKaW5kZXggZDU5NWI0ZS4uYmQ5Y2QyNyAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc01lc2guY3BwCisrKyBiL2xpYnMvcnMvcnNNZXNoLmNwcApAQCAtMTQsMTQgKzE0LDIzIEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCisjaWZuZGVmIEFORFJPSURfUlNfQlVJTERfRk9SX0hPU1QKICNpbmNsdWRlICJyc0NvbnRleHQuaCIKIAorI2luY2x1ZGUgPEdMRVMvZ2wuaD4KKyNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KKyNpbmNsdWRlIDxHTEVTL2dsZXh0Lmg+CisjZWxzZQorI2luY2x1ZGUgInJzQ29udGV4dEhvc3RTdHViLmgiCisKKyNpbmNsdWRlIDxPcGVuR0wvZ2wuaD4KKyNpbmNsdWRlIDxPcGVuR2wvZ2xleHQuaD4KKyNlbmRpZgorCisKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OnJlbmRlcnNjcmlwdDsKIAotI2luY2x1ZGUgPEdMRVMvZ2wuaD4KLSNpbmNsdWRlIDxHTEVTL2dsZXh0Lmg+Ci0KIE1lc2g6Ok1lc2goQ29udGV4dCAqcnNjKSA6IE9iamVjdEJhc2UocnNjKQogewogICAgIG1BbGxvY0ZpbGUgPSBfX0ZJTEVfXzsKQEAgLTM2LDYgKzQ1LDE2MiBAQAogewogfQogCit2b2lkIE1lc2g6OnNlcmlhbGl6ZShPU3RyZWFtICpzdHJlYW0pIGNvbnN0Cit7CisgICAgLy8gTmVlZCB0byBpZGVudGlmeSBvdXJzZWx2ZXMKKyAgICBzdHJlYW0tPmFkZFUzMigodWludDMyX3QpZ2V0Q2xhc3NJZCgpKTsKKworICAgIFN0cmluZzggbmFtZShnZXROYW1lKCkpOworICAgIHN0cmVhbS0+YWRkU3RyaW5nKCZuYW1lKTsKKworICAgIHN0cmVhbS0+YWRkVTMyKG1WZXJ0aWNpZXNDb3VudCk7CisKKyAgICBmb3IodWludDMyX3QgdkNvdW50ID0gMDsgdkNvdW50IDwgbVZlcnRpY2llc0NvdW50OyB2Q291bnQgKyspIHsKKyAgICAgICAgVmVydGljaWVzX3QgKnZlcnRzID0gbVZlcnRpY2llc1t2Q291bnRdOworCisgICAgICAgIHN0cmVhbS0+YWRkVTMyKHZlcnRzLT5tQWxsb2NhdGlvbkNvdW50KTsKKworICAgICAgICBmb3IgKHVpbnQzMl90IGFDb3VudCA9IDA7IGFDb3VudCA8IHZlcnRzLT5tQWxsb2NhdGlvbkNvdW50OyBhQ291bnQrKykgeworICAgICAgICAgICAgdmVydHMtPm1BbGxvY2F0aW9uc1thQ291bnRdLT5zZXJpYWxpemUoc3RyZWFtKTsKKyAgICAgICAgfQorICAgICAgICBzdHJlYW0tPmFkZFUzMih2ZXJ0cy0+bVZlcnRleERhdGFTaXplKTsKKworICAgICAgICBzdHJlYW0tPmFkZFUzMih2ZXJ0cy0+bU9mZnNldENvb3JkKTsKKyAgICAgICAgc3RyZWFtLT5hZGRVMzIodmVydHMtPm1PZmZzZXRUZXgpOworICAgICAgICBzdHJlYW0tPmFkZFUzMih2ZXJ0cy0+bU9mZnNldE5vcm0pOworCisgICAgICAgIHN0cmVhbS0+YWRkVTMyKHZlcnRzLT5tU2l6ZUNvb3JkKTsKKyAgICAgICAgc3RyZWFtLT5hZGRVMzIodmVydHMtPm1TaXplVGV4KTsKKyAgICAgICAgc3RyZWFtLT5hZGRVMzIodmVydHMtPm1TaXplTm9ybSApOworICAgIH0KKworICAgIHN0cmVhbS0+YWRkVTMyKG1QcmltaXRpdmVzQ291bnQpOworICAgIC8vIFN0b3JlIHRoZSBwcmltaXRpdmVzCisgICAgZm9yICh1aW50MzJfdCBwQ291bnQgPSAwOyBwQ291bnQgPCBtUHJpbWl0aXZlc0NvdW50OyBwQ291bnQgKyspIHsKKyAgICAgICAgUHJpbWl0aXZlX3QgKiBwcmltID0gbVByaW1pdGl2ZXNbcENvdW50XTsKKworICAgICAgICBzdHJlYW0tPmFkZFU4KCh1aW50OF90KXByaW0tPm1UeXBlKTsKKworICAgICAgICAvLyBXZSBzdG9yZSB0aGUgaW5kZXggdG8gdGhlIHZlcnRpY2VzCisgICAgICAgIC8vIFNvIGl0ZXJhdGUgb3ZlciBvdXIgdmVydGljZXMgdG8gZmluZCB3aGljaCBvbmUgd2UgcG9pbnQgdG8KKyAgICAgICAgdWludDMyX3QgdmVydGV4SW5kZXggPSAwOworICAgICAgICBmb3IodWludDMyX3QgdkNvdW50ID0gMDsgdkNvdW50IDwgbVZlcnRpY2llc0NvdW50OyB2Q291bnQgKyspIHsKKyAgICAgICAgICAgIGlmKHByaW0tPm1WZXJ0aWNpZXMgPT0gbVZlcnRpY2llc1t2Q291bnRdKSB7CisgICAgICAgICAgICAgICAgdmVydGV4SW5kZXggPSB2Q291bnQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc3RyZWFtLT5hZGRVMzIodmVydGV4SW5kZXgpOworCisgICAgICAgIHN0cmVhbS0+YWRkVTMyKHByaW0tPm1JbmRleENvdW50KTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBjdCA9IDA7IGN0IDwgcHJpbS0+bUluZGV4Q291bnQ7IGN0KyspIHsKKyAgICAgICAgICAgIHN0cmVhbS0+YWRkVTE2KHByaW0tPm1JbmRpY2llc1tjdF0pOworICAgICAgICB9CisKKyAgICAgICAgc3RyZWFtLT5hZGRVMzIocHJpbS0+bVJlc3RhcnRDb3VudHMpOworICAgICAgICBmb3IgKHVpbnQzMl90IGN0ID0gMDsgY3QgPCBwcmltLT5tUmVzdGFydENvdW50czsgY3QrKykgeworICAgICAgICAgICAgc3RyZWFtLT5hZGRVMTYocHJpbS0+bVJlc3RhcnRzW2N0XSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK01lc2ggKk1lc2g6OmNyZWF0ZUZyb21TdHJlYW0oQ29udGV4dCAqcnNjLCBJU3RyZWFtICpzdHJlYW0pCit7CisgICAgLy8gRmlyc3QgbWFrZSBzdXJlIHdlIGFyZSByZWFkaW5nIHRoZSBjb3JyZWN0IG9iamVjdAorICAgIFJzQTNEQ2xhc3NJRCBjbGFzc0lEID0gKFJzQTNEQ2xhc3NJRClzdHJlYW0tPmxvYWRVMzIoKTsKKyAgICBpZihjbGFzc0lEICE9IFJTX0EzRF9DTEFTU19JRF9NRVNIKSB7CisgICAgICAgIExPR0UoIm1lc2ggbG9hZGluZyBza2lwcGVkIGR1ZSB0byBpbnZhbGlkIGNsYXNzIGlkIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIE1lc2ggKiBtZXNoID0gbmV3IE1lc2gocnNjKTsKKworICAgIFN0cmluZzggbmFtZTsKKyAgICBzdHJlYW0tPmxvYWRTdHJpbmcoJm5hbWUpOworICAgIG1lc2gtPnNldE5hbWUobmFtZS5zdHJpbmcoKSwgbmFtZS5zaXplKCkpOworCisgICAgbWVzaC0+bVZlcnRpY2llc0NvdW50ID0gc3RyZWFtLT5sb2FkVTMyKCk7CisgICAgaWYobWVzaC0+bVZlcnRpY2llc0NvdW50KSB7CisgICAgICAgIG1lc2gtPm1WZXJ0aWNpZXMgPSBuZXcgVmVydGljaWVzX3QgKlttZXNoLT5tVmVydGljaWVzQ291bnRdOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgbWVzaC0+bVZlcnRpY2llcyA9IE5VTEw7CisgICAgfQorCisgICAgZm9yKHVpbnQzMl90IHZDb3VudCA9IDA7IHZDb3VudCA8IG1lc2gtPm1WZXJ0aWNpZXNDb3VudDsgdkNvdW50ICsrKSB7CisgICAgICAgIFZlcnRpY2llc190ICp2ZXJ0cyA9IG5ldyBWZXJ0aWNpZXNfdCgpOworICAgICAgICAvLyBTdG9yZSBvdXIgdmVydGljZXMgb25lIHRoZSBtZXNoCisgICAgICAgIG1lc2gtPm1WZXJ0aWNpZXNbdkNvdW50XSA9IHZlcnRzOworCisgICAgICAgIHZlcnRzLT5tQWxsb2NhdGlvbkNvdW50ID0gc3RyZWFtLT5sb2FkVTMyKCk7CisgICAgICAgIHZlcnRzLT5tQWxsb2NhdGlvbnMgPSBuZXcgQWxsb2NhdGlvbiAqW3ZlcnRzLT5tQWxsb2NhdGlvbkNvdW50XTsKKworICAgICAgICBMT0dFKCJwcm9jZXNzQ2h1bmtfVmVydGljaWVzIGNvdW50ICVpIiwgdmVydHMtPm1BbGxvY2F0aW9uQ291bnQpOworICAgICAgICBmb3IgKHVpbnQzMl90IGFDb3VudCA9IDA7IGFDb3VudCA8IHZlcnRzLT5tQWxsb2NhdGlvbkNvdW50OyBhQ291bnQrKykgeworICAgICAgICAgICAgdmVydHMtPm1BbGxvY2F0aW9uc1thQ291bnRdID0gQWxsb2NhdGlvbjo6Y3JlYXRlRnJvbVN0cmVhbShyc2MsIHN0cmVhbSk7CisgICAgICAgIH0KKyAgICAgICAgdmVydHMtPm1WZXJ0ZXhEYXRhU2l6ZSA9IHN0cmVhbS0+bG9hZFUzMigpOworCisgICAgICAgIHZlcnRzLT5tT2Zmc2V0Q29vcmQgPSBzdHJlYW0tPmxvYWRVMzIoKTsKKyAgICAgICAgdmVydHMtPm1PZmZzZXRUZXggPSBzdHJlYW0tPmxvYWRVMzIoKTsKKyAgICAgICAgdmVydHMtPm1PZmZzZXROb3JtID0gc3RyZWFtLT5sb2FkVTMyKCk7CisKKyAgICAgICAgdmVydHMtPm1TaXplQ29vcmQgPSBzdHJlYW0tPmxvYWRVMzIoKTsKKyAgICAgICAgdmVydHMtPm1TaXplVGV4ID0gc3RyZWFtLT5sb2FkVTMyKCk7CisgICAgICAgIHZlcnRzLT5tU2l6ZU5vcm0gPSBzdHJlYW0tPmxvYWRVMzIoKTsKKyAgICB9CisKKyAgICBtZXNoLT5tUHJpbWl0aXZlc0NvdW50ID0gc3RyZWFtLT5sb2FkVTMyKCk7CisgICAgaWYobWVzaC0+bVByaW1pdGl2ZXNDb3VudCkgeworICAgICAgICBtZXNoLT5tUHJpbWl0aXZlcyA9IG5ldyBQcmltaXRpdmVfdCAqW21lc2gtPm1QcmltaXRpdmVzQ291bnRdOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgbWVzaC0+bVByaW1pdGl2ZXMgPSBOVUxMOworICAgIH0KKworICAgIC8vIGxvYWQgYWxsIHByaW1pdGl2ZXMKKyAgICBmb3IgKHVpbnQzMl90IHBDb3VudCA9IDA7IHBDb3VudCA8IG1lc2gtPm1QcmltaXRpdmVzQ291bnQ7IHBDb3VudCArKykgeworICAgICAgICBQcmltaXRpdmVfdCAqIHByaW0gPSBuZXcgUHJpbWl0aXZlX3Q7CisgICAgICAgIG1lc2gtPm1QcmltaXRpdmVzW3BDb3VudF0gPSBwcmltOworCisgICAgICAgIHByaW0tPm1UeXBlID0gKFJzUHJpbWl0aXZlKXN0cmVhbS0+bG9hZFU4KCk7CisKKyAgICAgICAgLy8gV2Ugc3RvcmUgdGhlIGluZGV4IHRvIHRoZSB2ZXJ0aWNlcworICAgICAgICB1aW50MzJfdCB2ZXJ0ZXhJbmRleCA9IHN0cmVhbS0+bG9hZFUzMigpOworICAgICAgICBpZih2ZXJ0ZXhJbmRleCA8IG1lc2gtPm1WZXJ0aWNpZXNDb3VudCkgeworICAgICAgICAgICAgcHJpbS0+bVZlcnRpY2llcyA9IG1lc2gtPm1WZXJ0aWNpZXNbdmVydGV4SW5kZXhdOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgcHJpbS0+bVZlcnRpY2llcyA9IE5VTEw7CisgICAgICAgIH0KKworICAgICAgICBwcmltLT5tSW5kZXhDb3VudCA9IHN0cmVhbS0+bG9hZFUzMigpOworICAgICAgICBpZihwcmltLT5tSW5kZXhDb3VudCl7CisgICAgICAgICAgICBwcmltLT5tSW5kaWNpZXMgPSBuZXcgdWludDE2X3RbcHJpbS0+bUluZGV4Q291bnRdOworICAgICAgICAgICAgZm9yICh1aW50MzJfdCBjdCA9IDA7IGN0IDwgcHJpbS0+bUluZGV4Q291bnQ7IGN0KyspIHsKKyAgICAgICAgICAgICAgICBwcmltLT5tSW5kaWNpZXNbY3RdID0gc3RyZWFtLT5sb2FkVTE2KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBwcmltLT5tSW5kaWNpZXMgPSBOVUxMOworICAgICAgICB9CisKKyAgICAgICAgcHJpbS0+bVJlc3RhcnRDb3VudHMgPSBzdHJlYW0tPmxvYWRVMzIoKTsKKyAgICAgICAgaWYgKHByaW0tPm1SZXN0YXJ0Q291bnRzKSB7CisgICAgICAgICAgICBwcmltLT5tUmVzdGFydHMgPSBuZXcgdWludDE2X3RbcHJpbS0+bVJlc3RhcnRDb3VudHNdOworICAgICAgICAgICAgZm9yICh1aW50MzJfdCBjdCA9IDA7IGN0IDwgcHJpbS0+bVJlc3RhcnRDb3VudHM7IGN0KyspIHsKKyAgICAgICAgICAgICAgICBwcmltLT5tUmVzdGFydHNbY3RdID0gc3RyZWFtLT5sb2FkVTE2KCk7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHByaW0tPm1SZXN0YXJ0cyA9IE5VTEw7CisgICAgICAgIH0KKworICAgIH0KKworICAgIHJldHVybiBtZXNoOworfQogCiAKIE1lc2hDb250ZXh0OjpNZXNoQ29udGV4dCgpCmRpZmYgLS1naXQgYS9saWJzL3JzL3JzTWVzaC5oIGIvbGlicy9ycy9yc01lc2guaAppbmRleCA1MjAxYWJkLi44YzdlOGE0IDEwMDY0NAotLS0gYS9saWJzL3JzL3JzTWVzaC5oCisrKyBiL2xpYnMvcnMvcnNNZXNoLmgKQEAgLTYyLDE1ICs2MiwxNyBAQAogICAgICAgICB1aW50MTZfdCAqbVJlc3RhcnRzOwogICAgIH07CiAKLSAgICBWZXJ0aWNpZXNfdCAqIG1WZXJ0aWNpZXM7CisgICAgVmVydGljaWVzX3QgKiogbVZlcnRpY2llczsKICAgICB1aW50MzJfdCBtVmVydGljaWVzQ291bnQ7CiAKICAgICBQcmltaXRpdmVfdCAqKiBtUHJpbWl0aXZlczsKICAgICB1aW50MzJfdCBtUHJpbWl0aXZlc0NvdW50OwogCi0KLQogICAgIHZvaWQgYW5hbHl6ZUVsZW1lbnQoKTsKKyAgICB2aXJ0dWFsIHZvaWQgc2VyaWFsaXplKE9TdHJlYW0gKnN0cmVhbSkgY29uc3Q7CisgICAgdmlydHVhbCBSc0EzRENsYXNzSUQgZ2V0Q2xhc3NJZCgpIGNvbnN0IHsgcmV0dXJuIFJTX0EzRF9DTEFTU19JRF9NRVNIOyB9CisgICAgc3RhdGljIE1lc2ggKmNyZWF0ZUZyb21TdHJlYW0oQ29udGV4dCAqcnNjLCBJU3RyZWFtICpzdHJlYW0pOworCiBwcm90ZWN0ZWQ6CiB9OwogCmRpZmYgLS1naXQgYS9saWJzL3JzL3JzTXV0ZXguY3BwIGIvbGlicy9ycy9yc011dGV4LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzc1MmYyCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9yc011dGV4LmNwcApAQCAtMCwwICsxLDY0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgInJzTXV0ZXguaCIKKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7Cit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6cmVuZGVyc2NyaXB0OworCisKK011dGV4OjpNdXRleCgpCit7Cit9CisKK011dGV4Ojp+TXV0ZXgoKQoreworICAgIHB0aHJlYWRfbXV0ZXhfZGVzdHJveSgmbU11dGV4KTsKK30KKworYm9vbCBNdXRleDo6aW5pdCgpCit7CisgICAgaW50IHN0YXR1cyA9IHB0aHJlYWRfbXV0ZXhfaW5pdCgmbU11dGV4LCBOVUxMKTsKKyAgICBpZiAoc3RhdHVzKSB7CisgICAgICAgIExPR0UoIk11dGV4OjpNdXRleCBpbml0IGZhaWx1cmUiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBNdXRleDo6bG9jaygpCit7CisgICAgaW50IHN0YXR1czsKKyAgICBzdGF0dXMgPSBwdGhyZWFkX211dGV4X2xvY2soJm1NdXRleCk7CisgICAgaWYgKHN0YXR1cykgeworICAgICAgICBMT0dFKCJNdXRleDogZXJyb3IgJWkgbG9ja2luZy4iLCBzdGF0dXMpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitib29sIE11dGV4Ojp1bmxvY2soKQoreworICAgIGludCBzdGF0dXM7CisgICAgc3RhdHVzID0gcHRocmVhZF9tdXRleF91bmxvY2soJm1NdXRleCk7CisgICAgaWYgKHN0YXR1cykgeworICAgICAgICBMT0dFKCJNdXRleCBlcnJvciAlaSB1bmxvY2tpbmcuIiwgc3RhdHVzKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworCmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1ZlY3RvcjJmLmphdmEgYi9saWJzL3JzL3JzTXV0ZXguaApzaW1pbGFyaXR5IGluZGV4IDY5JQpjb3B5IGZyb20gZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9WZWN0b3IyZi5qYXZhCmNvcHkgdG8gbGlicy9ycy9yc011dGV4LmgKaW5kZXggNTY3ZDU3ZmEuLjQ3NzI1ZDcgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvVmVjdG9yMmYuamF2YQorKysgYi9saWJzL3JzL3JzTXV0ZXguaApAQCAtMTQsMjQgKzE0LDMwIEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi1wYWNrYWdlIGFuZHJvaWQucmVuZGVyc2NyaXB0OwotCi1pbXBvcnQgamF2YS5sYW5nLk1hdGg7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKyNpZm5kZWYgQU5EUk9JRF9SU19NVVRFWF9ICisjZGVmaW5lIEFORFJPSURfUlNfTVVURVhfSAogCiAKLS8qKgotICogQGhpZGUKLSAqCi0gKiovCi1wdWJsaWMgY2xhc3MgVmVjdG9yMmYgewotICAgIHB1YmxpYyBWZWN0b3IyZigpIHsKLSAgICB9CisjaW5jbHVkZSAicnNVdGlscy5oIgogCi0gICAgcHVibGljIGZsb2F0IHg7Ci0gICAgcHVibGljIGZsb2F0IHk7CituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgcmVuZGVyc2NyaXB0IHsKKworY2xhc3MgTXV0ZXggeworcHVibGljOgorICAgIE11dGV4KCk7CisgICAgfk11dGV4KCk7CisKKyAgICBib29sIGluaXQoKTsKKyAgICBib29sIGxvY2soKTsKKyAgICBib29sIHVubG9jaygpOworCitwcm90ZWN0ZWQ6CisgICAgcHRocmVhZF9tdXRleF90IG1NdXRleDsKK307CisKK30KIH0KIAotCi0KKyNlbmRpZgogCmRpZmYgLS1naXQgYS9saWJzL3JzL3JzTm9pc2UuY3BwIGIvbGlicy9ycy9yc05vaXNlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY0ZGMxYS4uMDAwMDAwMAotLS0gYS9saWJzL3JzL3JzTm9pc2UuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjU2ICswLDAgQEAKLS8qCi0gKiBUaGlzIGltcGxlbWVudGF0aW9uIG9mIHRoZSBub2lzZSBmdW5jdGlvbnMgd2FzIHBvcnRlZCBmcm9tIHRoZSBKYXZhCi0gKiBpbXBsZW1lbnRhdGlvbiBieSBKZXJyeSBIdXh0YWJsZSAoaHR0cDovL3d3dy5qaGxhYnMuY29tKSB1bmRlcgotICogQXBhY2hlIExpY2Vuc2UgMi4wIChzZWUgaHR0cDovL2pobGFicy5jb20vaXAvZmlsdGVycy9kb3dubG9hZC5odG1sKQotICoKLSAqIE9yaWdpbmFsIGhlYWRlcjoKLSAqCi0gKiBDb3B5cmlnaHQgMjAwNiBKZXJyeSBIdXh0YWJsZQotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAicnNOb2lzZS5oIgotCi0jaW5jbHVkZSA8bWF0aC5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHRpbWUuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIHJlbmRlcnNjcmlwdCB7Ci0KLSNkZWZpbmUgQiAweDEwMAotI2RlZmluZSBCTSAweGZmCi0jZGVmaW5lIE4gMHgxMDAwCi0KLXN0YXRpYyBpbnQgcFtCICsgQiArIDJdOwotc3RhdGljIGZsb2F0IGczW0IgKyBCICsgMl1bM107Ci1zdGF0aWMgZmxvYXQgZzJbQiArIEIgKyAyXVsyXTsKLXN0YXRpYyBmbG9hdCBnMVtCICsgQiArIDJdOwotc3RhdGljIGJvb2wgbm9pc2Vfc3RhcnQgPSB0cnVlOwotCi0jZGVmaW5lIGxlcnBmKHN0YXJ0LCBzdG9wLCBhbW91bnQpIHN0YXJ0ICsgKHN0b3AgLSBzdGFydCkgKiBhbW91bnQKLQotc3RhdGljIGlubGluZSBmbG9hdCBub2lzZV9zQ3VydmUoZmxvYXQgdCkKLXsKLSAgICByZXR1cm4gdCAqIHQgKiAoMy4wZiAtIDIuMGYgKiB0KTsKLX0KLQotaW5saW5lIHZvaWQgU0Nfbm9ybWFsaXplZjIoZmxvYXQgdltdKQotewotICAgIGZsb2F0IHMgPSAoZmxvYXQpc3FydGYodlswXSAqIHZbMF0gKyB2WzFdICogdlsxXSk7Ci0gICAgdlswXSA9IHZbMF0gLyBzOwotICAgIHZbMV0gPSB2WzFdIC8gczsKLX0KLQotaW5saW5lIHZvaWQgU0Nfbm9ybWFsaXplZjMoZmxvYXQgdltdKQotewotICAgIGZsb2F0IHMgPSAoZmxvYXQpc3FydGYodlswXSAqIHZbMF0gKyB2WzFdICogdlsxXSArIHZbMl0gKiB2WzJdKTsKLSAgICB2WzBdID0gdlswXSAvIHM7Ci0gICAgdlsxXSA9IHZbMV0gLyBzOwotICAgIHZbMl0gPSB2WzJdIC8gczsKLX0KLQotc3RhdGljIHZvaWQgbm9pc2VfaW5pdCgpCi17Ci0gICAgaW50IGksIGosIGs7Ci0gICAgCi0gICAgZm9yIChpID0gMDsgaSA8IEI7IGkrKykgewotICAgICAgICBwW2ldID0gaTsKLSAgICAgICAgCi0gICAgICAgIGcxW2ldID0gKGZsb2F0KSgocmFuZCgpICUgKEIgKyBCKSkgLSBCKSAvIEI7Ci0gICAgICAgIAotICAgICAgICBmb3IgKGogPSAwOyBqIDwgMjsgaisrKQotICAgICAgICAgICAgZzJbaV1bal0gPSAoZmxvYXQpKChyYW5kKCkgJSAoQiArIEIpKSAtIEIpIC8gQjsKLSAgICAgICAgU0Nfbm9ybWFsaXplZjIoZzJbaV0pOwotICAgICAgICAKLSAgICAgICAgZm9yIChqID0gMDsgaiA8IDM7IGorKykKLSAgICAgICAgICAgIGczW2ldW2pdID0gKGZsb2F0KSgocmFuZCgpICUgKEIgKyBCKSkgLSBCKSAvIEI7Ci0gICAgICAgIFNDX25vcm1hbGl6ZWYzKGczW2ldKTsKLSAgICB9Ci0gICAgCi0gICAgZm9yIChpID0gQi0xOyBpID49IDA7IGktLSkgewotICAgICAgICBrID0gcFtpXTsKLSAgICAgICAgcFtpXSA9IHBbaiA9IHJhbmQoKSAlIEJdOwotICAgICAgICBwW2pdID0gazsKLSAgICB9Ci0gICAgCi0gICAgZm9yIChpID0gMDsgaSA8IEIgKyAyOyBpKyspIHsKLSAgICAgICAgcFtCICsgaV0gPSBwW2ldOwotICAgICAgICBnMVtCICsgaV0gPSBnMVtpXTsKLSAgICAgICAgZm9yIChqID0gMDsgaiA8IDI7IGorKykKLSAgICAgICAgICAgIGcyW0IgKyBpXVtqXSA9IGcyW2ldW2pdOwotICAgICAgICBmb3IgKGogPSAwOyBqIDwgMzsgaisrKQotICAgICAgICAgICAgZzNbQiArIGldW2pdID0gZzNbaV1bal07Ci0gICAgfQotfQotCi1mbG9hdCBTQ19ub2lzZWYoZmxvYXQgeCkKLXsKLSAgICBzcmFuZCh0aW1lKE5VTEwpKTsKLSAgICBpbnQgYngwLCBieDE7Ci0gICAgZmxvYXQgcngwLCByeDEsIHN4LCB0LCB1LCB2OwotICAgIAotICAgIGlmIChub2lzZV9zdGFydCkgewotICAgICAgICBub2lzZV9zdGFydCA9IGZhbHNlOwotICAgICAgICBub2lzZV9pbml0KCk7Ci0gICAgfQotICAgIAotICAgIHQgPSB4ICsgTjsKLSAgICBieDAgPSAoKGludCl0KSAmIEJNOwotICAgIGJ4MSA9IChieDArMSkgJiBCTTsKLSAgICByeDAgPSB0IC0gKGludCl0OwotICAgIHJ4MSA9IHJ4MCAtIDEuMGY7Ci0gICAgCi0gICAgc3ggPSBub2lzZV9zQ3VydmUocngwKTsKLSAgICAKLSAgICB1ID0gcngwICogZzFbcFtieDBdXTsKLSAgICB2ID0gcngxICogZzFbcFtieDFdXTsKLSAgICByZXR1cm4gMi4zZiAqIGxlcnBmKHUsIHYsIHN4KTsKLX0KLQotZmxvYXQgU0Nfbm9pc2VmMihmbG9hdCB4LCBmbG9hdCB5KQotewotICAgIHNyYW5kKHRpbWUoTlVMTCkpOwotICAgIGludCBieDAsIGJ4MSwgYnkwLCBieTEsIGIwMCwgYjEwLCBiMDEsIGIxMTsKLSAgICBmbG9hdCByeDAsIHJ4MSwgcnkwLCByeTEsIHN4LCBzeSwgYSwgYiwgdCwgdSwgdjsKLSAgICBmbG9hdCAqcTsKLSAgICBpbnQgaSwgajsKLSAgICAKLSAgICBpZiAobm9pc2Vfc3RhcnQpIHsKLSAgICAgICAgbm9pc2Vfc3RhcnQgPSBmYWxzZTsKLSAgICAgICAgbm9pc2VfaW5pdCgpOwotICAgIH0KLSAgICAKLSAgICB0ID0geCArIE47Ci0gICAgYngwID0gKChpbnQpdCkgJiBCTTsKLSAgICBieDEgPSAoYngwKzEpICYgQk07Ci0gICAgcngwID0gdCAtIChpbnQpdDsKLSAgICByeDEgPSByeDAgLSAxLjBmOwotCQotICAgIHQgPSB5ICsgTjsKLSAgICBieTAgPSAoKGludCl0KSAmIEJNOwotICAgIGJ5MSA9IChieTArMSkgJiBCTTsKLSAgICByeTAgPSB0IC0gKGludCl0OwotICAgIHJ5MSA9IHJ5MCAtIDEuMGY7Ci0JCi0gICAgaSA9IHBbYngwXTsKLSAgICBqID0gcFtieDFdOwotICAgIAotICAgIGIwMCA9IHBbaSArIGJ5MF07Ci0gICAgYjEwID0gcFtqICsgYnkwXTsKLSAgICBiMDEgPSBwW2kgKyBieTFdOwotICAgIGIxMSA9IHBbaiArIGJ5MV07Ci0gICAgCi0gICAgc3ggPSBub2lzZV9zQ3VydmUocngwKTsKLSAgICBzeSA9IG5vaXNlX3NDdXJ2ZShyeTApOwotICAgIAotICAgIHEgPSBnMltiMDBdOyB1ID0gcngwICogcVswXSArIHJ5MCAqIHFbMV07Ci0gICAgcSA9IGcyW2IxMF07IHYgPSByeDEgKiBxWzBdICsgcnkwICogcVsxXTsKLSAgICBhID0gbGVycGYodSwgdiwgc3gpOwotICAgIAotICAgIHEgPSBnMltiMDFdOyB1ID0gcngwICogcVswXSArIHJ5MSAqIHFbMV07Ci0gICAgcSA9IGcyW2IxMV07IHYgPSByeDEgKiBxWzBdICsgcnkxICogcVsxXTsKLSAgICBiID0gbGVycGYodSwgdiwgc3gpOwotICAgIAotICAgIHJldHVybiAxLjVmKmxlcnBmKGEsIGIsIHN5KTsKLX0KLQotZmxvYXQgU0Nfbm9pc2VmMyhmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KQotewotICAgIHNyYW5kKHRpbWUoTlVMTCkpOwotICAgIGludCBieDAsIGJ4MSwgYnkwLCBieTEsIGJ6MCwgYnoxLCBiMDAsIGIxMCwgYjAxLCBiMTE7Ci0gICAgZmxvYXQgcngwLCByeDEsIHJ5MCwgcnkxLCByejAsIHJ6MSwgc3ksIHN6LCBhLCBiLCBjLCBkLCB0LCB1LCB2OwotICAgIGZsb2F0ICpxOwotICAgIGludCBpLCBqOwotICAgIAotICAgIGlmIChub2lzZV9zdGFydCkgewotICAgICAgICBub2lzZV9zdGFydCA9IGZhbHNlOwotICAgICAgICBub2lzZV9pbml0KCk7Ci0gICAgfQotICAgIAotICAgIHQgPSB4ICsgTjsKLSAgICBieDAgPSAoKGludCl0KSAmIEJNOwotICAgIGJ4MSA9IChieDArMSkgJiBCTTsKLSAgICByeDAgPSB0IC0gKGludCl0OwotICAgIHJ4MSA9IHJ4MCAtIDEuMGY7Ci0gICAgCi0gICAgdCA9IHkgKyBOOwotICAgIGJ5MCA9ICgoaW50KXQpICYgQk07Ci0gICAgYnkxID0gKGJ5MCsxKSAmIEJNOwotICAgIHJ5MCA9IHQgLSAoaW50KXQ7Ci0gICAgcnkxID0gcnkwIC0gMS4wZjsKLQkKLSAgICB0ID0geiArIE47Ci0gICAgYnowID0gKChpbnQpdCkgJiBCTTsKLSAgICBiejEgPSAoYnowKzEpICYgQk07Ci0gICAgcnowID0gdCAtIChpbnQpdDsKLSAgICByejEgPSByejAgLSAxLjBmOwotCQotICAgIGkgPSBwW2J4MF07Ci0gICAgaiA9IHBbYngxXTsKLSAgICAKLSAgICBiMDAgPSBwW2kgKyBieTBdOwotICAgIGIxMCA9IHBbaiArIGJ5MF07Ci0gICAgYjAxID0gcFtpICsgYnkxXTsKLSAgICBiMTEgPSBwW2ogKyBieTFdOwotICAgIAotICAgIHQgID0gbm9pc2Vfc0N1cnZlKHJ4MCk7Ci0gICAgc3kgPSBub2lzZV9zQ3VydmUocnkwKTsKLSAgICBzeiA9IG5vaXNlX3NDdXJ2ZShyejApOwotICAgIAotICAgIHEgPSBnM1tiMDAgKyBiejBdOyB1ID0gcngwICogcVswXSArIHJ5MCAqIHFbMV0gKyByejAgKiBxWzJdOwotICAgIHEgPSBnM1tiMTAgKyBiejBdOyB2ID0gcngxICogcVswXSArIHJ5MCAqIHFbMV0gKyByejAgKiBxWzJdOwotICAgIGEgPSBsZXJwZih1LCB2LCB0KTsKLSAgICAKLSAgICBxID0gZzNbYjAxICsgYnowXTsgdSA9IHJ4MCAqIHFbMF0gKyByeTEgKiBxWzFdICsgcnowICogcVsyXTsKLSAgICBxID0gZzNbYjExICsgYnowXTsgdiA9IHJ4MSAqIHFbMF0gKyByeTEgKiBxWzFdICsgcnowICogcVsyXTsKLSAgICBiID0gbGVycGYodSwgdiwgdCk7Ci0gICAgCi0gICAgYyA9IGxlcnBmKGEsIGIsIHN5KTsKLSAgICAKLSAgICBxID0gZzNbYjAwICsgYnoxXTsgdSA9IHJ4MCAqIHFbMF0gKyByeTAgKiBxWzFdICsgcnoxICogcVsyXTsKLSAgICBxID0gZzNbYjEwICsgYnoxXTsgdiA9IHJ4MSAqIHFbMF0gKyByeTAgKiBxWzFdICsgcnoxICogcVsyXTsKLSAgICBhID0gbGVycGYodSwgdiwgdCk7Ci0gICAgCi0gICAgcSA9IGczW2IwMSArIGJ6MV07IHUgPSByeDAgKiBxWzBdICsgcnkxICogcVsxXSArIHJ6MSAqIHFbMl07Ci0gICAgcSA9IGczW2IxMSArIGJ6MV07IHYgPSByeDEgKiBxWzBdICsgcnkxICogcVsxXSArIHJ6MSAqIHFbMl07Ci0gICAgYiA9IGxlcnBmKHUsIHYsIHQpOwotICAgIAotICAgIGQgPSBsZXJwZihhLCBiLCBzeSk7Ci0gICAgCi0gICAgcmV0dXJuIDEuNWYqbGVycGYoYywgZCwgc3opOwotfQotCi1mbG9hdCBTQ190dXJidWxlbmNlZjIoZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgb2N0YXZlcykKLXsKLSAgICBzcmFuZCh0aW1lKE5VTEwpKTsKLSAgICBmbG9hdCB0ID0gMC4wZjsKLSAgICAKLSAgICBmb3IgKGZsb2F0IGYgPSAxLjBmOyBmIDw9IG9jdGF2ZXM7IGYgKj0gMikKLSAgICAgICAgdCArPSBmYWJzKFNDX25vaXNlZjIoZiAqIHgsIGYgKiB5KSkgLyBmOwotICAgIHJldHVybiB0OwotfQotCi1mbG9hdCBTQ190dXJidWxlbmNlZjMoZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeiwgZmxvYXQgb2N0YXZlcykKLXsKLSAgICBzcmFuZCh0aW1lKE5VTEwpKTsKLSAgICBmbG9hdCB0ID0gMC4wZjsKLSAgICAKLSAgICBmb3IgKGZsb2F0IGYgPSAxLjBmOyBmIDw9IG9jdGF2ZXM7IGYgKj0gMikKLSAgICAgICAgdCArPSBmYWJzKFNDX25vaXNlZjMoZiAqIHgsIGYgKiB5LCBmICogeikpIC8gZjsKLSAgICByZXR1cm4gdDsKLX0KLQotfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNOb2lzZS5oIGIvbGlicy9ycy9yc05vaXNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwNDA3NTEuLjAwMDAwMDAKLS0tIGEvbGlicy9ycy9yc05vaXNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX1JTX05PSVNFX0gKLSNkZWZpbmUgQU5EUk9JRF9SU19OT0lTRV9ICi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIHJlbmRlcnNjcmlwdCB7Ci0KLXZvaWQgU0Nfbm9ybWFsaXplZjIoZmxvYXQgdltdKTsKLXZvaWQgU0Nfbm9ybWFsaXplZjMoZmxvYXQgdltdKTsKLWZsb2F0IFNDX25vaXNlZihmbG9hdCB4KTsKLWZsb2F0IFNDX25vaXNlZjIoZmxvYXQgeCwgZmxvYXQgeSk7Ci1mbG9hdCBTQ19ub2lzZWYzKGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHopOwotZmxvYXQgU0NfdHVyYnVsZW5jZWYyKGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IG9jdGF2ZXMpOwotZmxvYXQgU0NfdHVyYnVsZW5jZWYzKGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHosIGZsb2F0IG9jdGF2ZXMpOwotCi19Ci19Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc09iamVjdEJhc2UuY3BwIGIvbGlicy9ycy9yc09iamVjdEJhc2UuY3BwCmluZGV4IDY3NzQxM2UuLjQ4ZjFmZWUgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNPYmplY3RCYXNlLmNwcAorKysgYi9saWJzL3JzL3JzT2JqZWN0QmFzZS5jcHAKQEAgLTE1LDcgKzE1LDEyIEBACiAgKi8KIAogI2luY2x1ZGUgInJzT2JqZWN0QmFzZS5oIgorCisjaWZuZGVmIEFORFJPSURfUlNfQlVJTERfRk9SX0hPU1QKICNpbmNsdWRlICJyc0NvbnRleHQuaCIKKyNlbHNlCisjaW5jbHVkZSAicnNDb250ZXh0SG9zdFN0dWIuaCIKKyNlbmRpZgogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpyZW5kZXJzY3JpcHQ7CkBAIC0yNCw3ICsyOSw2IEBACiB7CiAgICAgbVVzZXJSZWZDb3VudCA9IDA7CiAgICAgbVN5c1JlZkNvdW50ID0gMDsKLSAgICBtTmFtZSA9IE5VTEw7CiAgICAgbVJTQyA9IE5VTEw7CiAgICAgbU5leHQgPSBOVUxMOwogICAgIG1QcmV2ID0gTlVMTDsKQEAgLTM5LDE0ICs0MywxMyBAQAogICAgIHJzQXNzZXJ0KCFtVXNlclJlZkNvdW50KTsKICAgICByc0Fzc2VydCghbVN5c1JlZkNvdW50KTsKICAgICByZW1vdmUoKTsKLSAgICBkZWxldGVbXSBtTmFtZTsKIH0KIAogdm9pZCBPYmplY3RCYXNlOjpkdW1wTE9HVihjb25zdCBjaGFyICpvcCkgY29uc3QKIHsKLSAgICBpZiAobU5hbWUpIHsKKyAgICBpZiAobU5hbWUuc2l6ZSgpKSB7CiAgICAgICAgIExPR1YoIiVzIFJTb2JqICVwLCBuYW1lICVzLCByZWZzICVpLCVpICBmcm9tICVzLCVpIGxpbmtzICVwLCVwLCVwIiwKLSAgICAgICAgICAgICBvcCwgdGhpcywgbU5hbWUsIG1Vc2VyUmVmQ291bnQsIG1TeXNSZWZDb3VudCwgbUFsbG9jRmlsZSwgbUFsbG9jTGluZSwgbU5leHQsIG1QcmV2LCBtUlNDKTsKKyAgICAgICAgICAgICBvcCwgdGhpcywgbU5hbWUuc3RyaW5nKCksIG1Vc2VyUmVmQ291bnQsIG1TeXNSZWZDb3VudCwgbUFsbG9jRmlsZSwgbUFsbG9jTGluZSwgbU5leHQsIG1QcmV2LCBtUlNDKTsKICAgICB9IGVsc2UgewogICAgICAgICBMT0dWKCIlcyBSU29iaiAlcCwgbm8tbmFtZSwgcmVmcyAlaSwlaSAgZnJvbSAlcywlaSBsaW5rcyAlcCwlcCwlcCIsCiAgICAgICAgICAgICAgb3AsIHRoaXMsIG1Vc2VyUmVmQ291bnQsIG1TeXNSZWZDb3VudCwgbUFsbG9jRmlsZSwgbUFsbG9jTGluZSwgbU5leHQsIG1QcmV2LCBtUlNDKTsKQEAgLTExMywxOCArMTE2LDEyIEBACiAKIHZvaWQgT2JqZWN0QmFzZTo6c2V0TmFtZShjb25zdCBjaGFyICpuYW1lKQogewotICAgIHNldE5hbWUobmFtZSwgc3RybGVuKG5hbWUpKTsKKyAgICBtTmFtZS5zZXRUbyhuYW1lKTsKIH0KIAogdm9pZCBPYmplY3RCYXNlOjpzZXROYW1lKGNvbnN0IGNoYXIgKm5hbWUsIHVpbnQzMl90IGxlbikKIHsKLSAgICBkZWxldGUgbU5hbWU7Ci0gICAgbU5hbWUgPSBOVUxMOwotICAgIGlmIChuYW1lKSB7Ci0gICAgICAgIG1OYW1lID0gbmV3IGNoYXJbbGVuICsgMV07Ci0gICAgICAgIG1lbWNweShtTmFtZSwgbmFtZSwgbGVuKTsKLSAgICAgICAgbU5hbWVbbGVuXSA9IDA7Ci0gICAgfQorICAgIG1OYW1lLnNldFRvKG5hbWUsIGxlbik7CiB9CiAKIHZvaWQgT2JqZWN0QmFzZTo6YWRkKCkgY29uc3QKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNPYmplY3RCYXNlLmggYi9saWJzL3JzL3JzT2JqZWN0QmFzZS5oCmluZGV4IGJiMDNiODcuLmFkOTViODEgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNPYmplY3RCYXNlLmgKKysrIGIvbGlicy9ycy9yc09iamVjdEJhc2UuaApAQCAtMjQsNiArMjQsNyBAQAogbmFtZXNwYWNlIHJlbmRlcnNjcmlwdCB7CiAKIGNsYXNzIENvbnRleHQ7CitjbGFzcyBPU3RyZWFtOwogCiAvLyBBbiBlbGVtZW50IGlzIGEgZ3JvdXAgb2YgQ29tcG9uZW50cyB0aGF0IG9jY3VwaWVzIG9uZSBjZWxsIGluIGEgc3RydWN0dXJlLgogY2xhc3MgT2JqZWN0QmFzZQpAQCAtNDAsNyArNDEsNyBAQAogICAgIGJvb2wgemVyb1VzZXJSZWYoKSBjb25zdDsKIAogICAgIGNvbnN0IGNoYXIgKiBnZXROYW1lKCkgY29uc3QgewotICAgICAgICByZXR1cm4gbU5hbWU7CisgICAgICAgIHJldHVybiBtTmFtZS5zdHJpbmcoKTsKICAgICB9CiAgICAgdm9pZCBzZXROYW1lKGNvbnN0IGNoYXIgKik7CiAgICAgdm9pZCBzZXROYW1lKGNvbnN0IGNoYXIgKiwgdWludDMyX3QgbGVuKTsKQEAgLTUyLDYgKzUzLDggQEAKICAgICBzdGF0aWMgdm9pZCBkdW1wQWxsKENvbnRleHQgKnJzYyk7CiAKICAgICB2aXJ0dWFsIHZvaWQgZHVtcExPR1YoY29uc3QgY2hhciAqcHJlZml4KSBjb25zdDsKKyAgICB2aXJ0dWFsIHZvaWQgc2VyaWFsaXplKE9TdHJlYW0gKnN0cmVhbSkgY29uc3QgPSAwOworICAgIHZpcnR1YWwgUnNBM0RDbGFzc0lEIGdldENsYXNzSWQoKSBjb25zdCA9IDA7CiAKIHByb3RlY3RlZDoKICAgICBjb25zdCBjaGFyICptQWxsb2NGaWxlOwpAQCAtNjQsNyArNjcsNyBAQAogCiAgICAgYm9vbCBjaGVja0RlbGV0ZSgpIGNvbnN0OwogCi0gICAgY2hhciAqIG1OYW1lOworICAgIFN0cmluZzggbU5hbWU7CiAgICAgbXV0YWJsZSBpbnQzMl90IG1TeXNSZWZDb3VudDsKICAgICBtdXRhYmxlIGludDMyX3QgbVVzZXJSZWZDb3VudDsKIApkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc1Byb2dyYW0uY3BwIGIvbGlicy9ycy9yc1Byb2dyYW0uY3BwCmluZGV4IDcwZTI4NjguLmM0ZjhiMmUgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNQcm9ncmFtLmNwcAorKysgYi9saWJzL3JzL3JzUHJvZ3JhbS5jcHAKQEAgLTE0LDExICsxNCwxNyBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorI2lmbmRlZiBBTkRST0lEX1JTX0JVSUxEX0ZPUl9IT1NUCiAjaW5jbHVkZSAicnNDb250ZXh0LmgiCi0jaW5jbHVkZSAicnNQcm9ncmFtLmgiCi0KICNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KICNpbmNsdWRlIDxHTEVTMi9nbDJleHQuaD4KKyNlbHNlCisjaW5jbHVkZSAicnNDb250ZXh0SG9zdFN0dWIuaCIKKyNpbmNsdWRlIDxPcGVuR0wvZ2wuaD4KKyNpbmNsdWRlIDxPcGVuR0wvZ2xleHQuaD4KKyNlbmRpZiAvL0FORFJPSURfUlNfQlVJTERfRk9SX0hPU1QKKworI2luY2x1ZGUgInJzUHJvZ3JhbS5oIgogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpyZW5kZXJzY3JpcHQ7CmRpZmYgLS1naXQgYS9saWJzL3JzL3JzUHJvZ3JhbUZyYWdtZW50LmNwcCBiL2xpYnMvcnMvcnNQcm9ncmFtRnJhZ21lbnQuY3BwCmluZGV4IGMxN2I5NGMuLmNiZTMzYzcgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNQcm9ncmFtRnJhZ21lbnQuY3BwCisrKyBiL2xpYnMvcnMvcnNQcm9ncmFtRnJhZ21lbnQuY3BwCkBAIC0xNCwxMyArMTQsMTkgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKyNpZm5kZWYgQU5EUk9JRF9SU19CVUlMRF9GT1JfSE9TVAogI2luY2x1ZGUgInJzQ29udGV4dC5oIgotI2luY2x1ZGUgInJzUHJvZ3JhbUZyYWdtZW50LmgiCi0KICNpbmNsdWRlIDxHTEVTL2dsLmg+CiAjaW5jbHVkZSA8R0xFUy9nbGV4dC5oPgogI2luY2x1ZGUgPEdMRVMyL2dsMi5oPgogI2luY2x1ZGUgPEdMRVMyL2dsMmV4dC5oPgorI2Vsc2UKKyNpbmNsdWRlICJyc0NvbnRleHRIb3N0U3R1Yi5oIgorI2luY2x1ZGUgPE9wZW5HTC9nbC5oPgorI2luY2x1ZGUgPE9wZW5HTC9nbGV4dC5oPgorI2VuZGlmIC8vQU5EUk9JRF9SU19CVUlMRF9GT1JfSE9TVAorCisjaW5jbHVkZSAicnNQcm9ncmFtRnJhZ21lbnQuaCIKIAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6cmVuZGVyc2NyaXB0OwpAQCAtODMsMTIgKzg5LDE1IEBACiAKICAgICAgICAgZ2xFbmFibGUoR0xfVEVYVFVSRV8yRCk7CiAgICAgICAgIGlmIChyc2MtPmNoZWNrVmVyc2lvbjFfMSgpKSB7CisjaWZuZGVmIEFORFJPSURfUlNfQlVJTERfRk9SX0hPU1QgLy8gVGhlc2UgYXJlIEdMRVMgb25seQogICAgICAgICAgICAgaWYgKG1Qb2ludFNwcml0ZUVuYWJsZSkgewogICAgICAgICAgICAgICAgIGdsRW5hYmxlKEdMX1BPSU5UX1NQUklURV9PRVMpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBnbERpc2FibGUoR0xfUE9JTlRfU1BSSVRFX09FUyk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBnbFRleEVudmkoR0xfUE9JTlRfU1BSSVRFX09FUywgR0xfQ09PUkRfUkVQTEFDRV9PRVMsIG1Qb2ludFNwcml0ZUVuYWJsZSk7CisjZW5kaWYgLy9BTkRST0lEX1JTX0JVSUxEX0ZPUl9IT1NUCisKICAgICAgICAgfQogICAgICAgICBtVGV4dHVyZXNbY3RdLT51cGxvYWRDaGVjayhyc2MpOwogICAgICAgICBnbEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQsIG1UZXh0dXJlc1tjdF0tPmdldFRleHR1cmVJRCgpKTsKQEAgLTE0NCw3ICsxNTMsNyBAQAogCiAgICAgLy9MT0dFKCJzZ2wyIGZyYWcxICV4IiwgZ2xHZXRFcnJvcigpKTsKICAgICBpZiAoKHN0YXRlLT5tTGFzdC5nZXQoKSA9PSB0aGlzKSAmJiAhbURpcnR5KSB7Ci0gICAgICAgIC8vcmV0dXJuOworICAgICAgICByZXR1cm47CiAgICAgfQogICAgIHN0YXRlLT5tTGFzdC5zZXQodGhpcyk7CiAKQEAgLTI4OSw2ICsyOTgsMTYgQEAKICAgICBjcmVhdGVTaGFkZXIoKTsKIH0KIAordm9pZCBQcm9ncmFtRnJhZ21lbnQ6OnNlcmlhbGl6ZShPU3RyZWFtICpzdHJlYW0pIGNvbnN0Cit7CisKK30KKworUHJvZ3JhbUZyYWdtZW50ICpQcm9ncmFtRnJhZ21lbnQ6OmNyZWF0ZUZyb21TdHJlYW0oQ29udGV4dCAqcnNjLCBJU3RyZWFtICpzdHJlYW0pCit7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKIFByb2dyYW1GcmFnbWVudFN0YXRlOjpQcm9ncmFtRnJhZ21lbnRTdGF0ZSgpCiB7CiAgICAgbVBGID0gTlVMTDsKQEAgLTMwMCw3ICszMTksNyBAQAogCiB9CiAKLXZvaWQgUHJvZ3JhbUZyYWdtZW50U3RhdGU6OmluaXQoQ29udGV4dCAqcnNjLCBpbnQzMl90IHcsIGludDMyX3QgaCkKK3ZvaWQgUHJvZ3JhbUZyYWdtZW50U3RhdGU6OmluaXQoQ29udGV4dCAqcnNjKQogewogICAgIHVpbnQzMl90IHRtcFs1XSA9IHsKICAgICAgICAgUlNfVEVYX0VOVl9NT0RFX05PTkUsIDAsCkBAIC0zMjgsNiArMzQ3LDcgQEAKIHsKICAgICBQcm9ncmFtRnJhZ21lbnQgKnBmID0gbmV3IFByb2dyYW1GcmFnbWVudChyc2MsIHBhcmFtcywgcGFyYW1MZW5ndGgpOwogICAgIHBmLT5pbmNVc2VyUmVmKCk7CisgICAgLy9MT0dFKCJyc2lfUHJvZ3JhbUZyYWdtZW50Q3JlYXRlICVwIiwgcGYpOwogICAgIHJldHVybiBwZjsKIH0KIApAQCAtMzM3LDYgKzM1Nyw3IEBACiB7CiAgICAgUHJvZ3JhbUZyYWdtZW50ICpwZiA9IG5ldyBQcm9ncmFtRnJhZ21lbnQocnNjLCBzaGFkZXJUZXh0LCBzaGFkZXJMZW5ndGgsIHBhcmFtcywgcGFyYW1MZW5ndGgpOwogICAgIHBmLT5pbmNVc2VyUmVmKCk7CisgICAgLy9MT0dFKCJyc2lfUHJvZ3JhbUZyYWdtZW50Q3JlYXRlMiAlcCIsIHBmKTsKICAgICByZXR1cm4gcGY7CiB9CiAKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNQcm9ncmFtRnJhZ21lbnQuaCBiL2xpYnMvcnMvcnNQcm9ncmFtRnJhZ21lbnQuaAppbmRleCA5ZmE1NjVkLi5lNWJiZTFiIDEwMDY0NAotLS0gYS9saWJzL3JzL3JzUHJvZ3JhbUZyYWdtZW50LmgKKysrIGIvbGlicy9ycy9yc1Byb2dyYW1GcmFnbWVudC5oCkBAIC00MCw2ICs0MCw5IEBACiAgICAgdmlydHVhbCB2b2lkIGNyZWF0ZVNoYWRlcigpOwogICAgIHZpcnR1YWwgdm9pZCBsb2FkU2hhZGVyKENvbnRleHQgKnJzYyk7CiAgICAgdmlydHVhbCB2b2lkIGluaXQoQ29udGV4dCAqcnNjKTsKKyAgICB2aXJ0dWFsIHZvaWQgc2VyaWFsaXplKE9TdHJlYW0gKnN0cmVhbSkgY29uc3Q7CisgICAgdmlydHVhbCBSc0EzRENsYXNzSUQgZ2V0Q2xhc3NJZCgpIGNvbnN0IHsgcmV0dXJuIFJTX0EzRF9DTEFTU19JRF9QUk9HUkFNX0ZSQUdNRU5UOyB9CisgICAgc3RhdGljIFByb2dyYW1GcmFnbWVudCAqY3JlYXRlRnJvbVN0cmVhbShDb250ZXh0ICpyc2MsIElTdHJlYW0gKnN0cmVhbSk7CiAKIHByb3RlY3RlZDoKICAgICAvLyBIYWNrcyB0byBjcmVhdGUgYSBwcm9ncmFtIGZvciBub3cKQEAgLTU3LDcgKzYwLDcgQEAKICAgICB+UHJvZ3JhbUZyYWdtZW50U3RhdGUoKTsKIAogICAgIFByb2dyYW1GcmFnbWVudCAqbVBGOwotICAgIHZvaWQgaW5pdChDb250ZXh0ICpyc2MsIGludDMyX3QgdywgaW50MzJfdCBoKTsKKyAgICB2b2lkIGluaXQoQ29udGV4dCAqcnNjKTsKICAgICB2b2lkIGRlaW5pdChDb250ZXh0ICpyc2MpOwogCiAgICAgT2JqZWN0QmFzZVJlZjxUeXBlPiBtVGV4dHVyZVR5cGVzW1Byb2dyYW1GcmFnbWVudDo6TUFYX1RFWFRVUkVdOwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc1Byb2dyYW1SYXN0ZXIuY3BwIGIvbGlicy9ycy9yc1Byb2dyYW1SYXN0ZXIuY3BwCmluZGV4IDEzODg3ZDEuLjY2ZjZlZjggMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNQcm9ncmFtUmFzdGVyLmNwcAorKysgYi9saWJzL3JzL3JzUHJvZ3JhbVJhc3Rlci5jcHAKQEAgLTE0LDExICsxNCwxNyBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorI2lmbmRlZiBBTkRST0lEX1JTX0JVSUxEX0ZPUl9IT1NUCiAjaW5jbHVkZSAicnNDb250ZXh0LmgiCi0jaW5jbHVkZSAicnNQcm9ncmFtUmFzdGVyLmgiCi0KICNpbmNsdWRlIDxHTEVTL2dsLmg+CiAjaW5jbHVkZSA8R0xFUy9nbGV4dC5oPgorI2Vsc2UKKyNpbmNsdWRlICJyc0NvbnRleHRIb3N0U3R1Yi5oIgorI2luY2x1ZGUgPE9wZW5HTC9nbC5oPgorI2luY2x1ZGUgPE9wZW5HbC9nbGV4dC5oPgorI2VuZGlmIC8vQU5EUk9JRF9SU19CVUlMRF9GT1JfSE9TVAorCisjaW5jbHVkZSAicnNQcm9ncmFtUmFzdGVyLmgiCiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OnJlbmRlcnNjcmlwdDsKQEAgLTc2LDExICs4MiwxMyBAQAogICAgIH0KIAogICAgIGlmIChyc2MtPmNoZWNrVmVyc2lvbjFfMSgpKSB7CisjaWZuZGVmIEFORFJPSURfUlNfQlVJTERfRk9SX0hPU1QKICAgICAgICAgaWYgKG1Qb2ludFNwcml0ZSkgewogICAgICAgICAgICAgZ2xFbmFibGUoR0xfUE9JTlRfU1BSSVRFX09FUyk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBnbERpc2FibGUoR0xfUE9JTlRfU1BSSVRFX09FUyk7CiAgICAgICAgIH0KKyNlbmRpZiAvL0FORFJPSURfUlNfQlVJTERfRk9SX0hPU1QKICAgICB9CiB9CiAKQEAgLTkyLDcgKzEwMCwxNSBAQAogICAgIHN0YXRlLT5tTGFzdC5zZXQodGhpcyk7CiB9CiAKK3ZvaWQgUHJvZ3JhbVJhc3Rlcjo6c2VyaWFsaXplKE9TdHJlYW0gKnN0cmVhbSkgY29uc3QKK3sKKyAgICAKK30KIAorUHJvZ3JhbVJhc3RlciAqUHJvZ3JhbVJhc3Rlcjo6Y3JlYXRlRnJvbVN0cmVhbShDb250ZXh0ICpyc2MsIElTdHJlYW0gKnN0cmVhbSkKK3sKKyAgICByZXR1cm4gTlVMTDsKK30KIAogUHJvZ3JhbVJhc3RlclN0YXRlOjpQcm9ncmFtUmFzdGVyU3RhdGUoKQogewpAQCAtMTAyLDcgKzExOCw3IEBACiB7CiB9CiAKLXZvaWQgUHJvZ3JhbVJhc3RlclN0YXRlOjppbml0KENvbnRleHQgKnJzYywgaW50MzJfdCB3LCBpbnQzMl90IGgpCit2b2lkIFByb2dyYW1SYXN0ZXJTdGF0ZTo6aW5pdChDb250ZXh0ICpyc2MpCiB7CiAgICAgUHJvZ3JhbVJhc3RlciAqcHIgPSBuZXcgUHJvZ3JhbVJhc3Rlcihyc2MsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOwogICAgIG1EZWZhdWx0LnNldChwcik7CmRpZmYgLS1naXQgYS9saWJzL3JzL3JzUHJvZ3JhbVJhc3Rlci5oIGIvbGlicy9ycy9yc1Byb2dyYW1SYXN0ZXIuaAppbmRleCBjM2E5YzkwLi43OWIxNDc1MyAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc1Byb2dyYW1SYXN0ZXIuaAorKysgYi9saWJzL3JzL3JzUHJvZ3JhbVJhc3Rlci5oCkBAIC0zNiw2ICszNiw5IEBACiAKICAgICB2aXJ0dWFsIHZvaWQgc2V0dXBHTChjb25zdCBDb250ZXh0ICosIFByb2dyYW1SYXN0ZXJTdGF0ZSAqKTsKICAgICB2aXJ0dWFsIHZvaWQgc2V0dXBHTDIoY29uc3QgQ29udGV4dCAqLCBQcm9ncmFtUmFzdGVyU3RhdGUgKik7CisgICAgdmlydHVhbCB2b2lkIHNlcmlhbGl6ZShPU3RyZWFtICpzdHJlYW0pIGNvbnN0OworICAgIHZpcnR1YWwgUnNBM0RDbGFzc0lEIGdldENsYXNzSWQoKSBjb25zdCB7IHJldHVybiBSU19BM0RfQ0xBU1NfSURfUFJPR1JBTV9SQVNURVI7IH0KKyAgICBzdGF0aWMgUHJvZ3JhbVJhc3RlciAqY3JlYXRlRnJvbVN0cmVhbShDb250ZXh0ICpyc2MsIElTdHJlYW0gKnN0cmVhbSk7CiAKICAgICB2b2lkIHNldExpbmVXaWR0aChmbG9hdCB3KTsKICAgICB2b2lkIHNldFBvaW50U2l6ZShmbG9hdCBzKTsKQEAgLTU2LDcgKzU5LDcgQEAKIHB1YmxpYzoKICAgICBQcm9ncmFtUmFzdGVyU3RhdGUoKTsKICAgICB+UHJvZ3JhbVJhc3RlclN0YXRlKCk7Ci0gICAgdm9pZCBpbml0KENvbnRleHQgKnJzYywgaW50MzJfdCB3LCBpbnQzMl90IGgpOworICAgIHZvaWQgaW5pdChDb250ZXh0ICpyc2MpOwogICAgIHZvaWQgZGVpbml0KENvbnRleHQgKnJzYyk7CiAKICAgICBPYmplY3RCYXNlUmVmPFByb2dyYW1SYXN0ZXI+IG1EZWZhdWx0OwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc1Byb2dyYW1GcmFnbWVudFN0b3JlLmNwcCBiL2xpYnMvcnMvcnNQcm9ncmFtU3RvcmUuY3BwCnNpbWlsYXJpdHkgaW5kZXggNzglCnJlbmFtZSBmcm9tIGxpYnMvcnMvcnNQcm9ncmFtRnJhZ21lbnRTdG9yZS5jcHAKcmVuYW1lIHRvIGxpYnMvcnMvcnNQcm9ncmFtU3RvcmUuY3BwCmluZGV4IDhhMjE1N2YuLmU3NDFjMGEgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNQcm9ncmFtRnJhZ21lbnRTdG9yZS5jcHAKKysrIGIvbGlicy9ycy9yc1Byb2dyYW1TdG9yZS5jcHAKQEAgLTE0LDE3ICsxNCwyMyBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorI2lmbmRlZiBBTkRST0lEX1JTX0JVSUxEX0ZPUl9IT1NUCiAjaW5jbHVkZSAicnNDb250ZXh0LmgiCi0jaW5jbHVkZSAicnNQcm9ncmFtRnJhZ21lbnRTdG9yZS5oIgotCiAjaW5jbHVkZSA8R0xFUy9nbC5oPgogI2luY2x1ZGUgPEdMRVMvZ2xleHQuaD4KKyNlbHNlCisjaW5jbHVkZSAicnNDb250ZXh0SG9zdFN0dWIuaCIKKyNpbmNsdWRlIDxPcGVuR0wvZ2wuaD4KKyNpbmNsdWRlIDxPcGVuR2wvZ2xleHQuaD4KKyNlbmRpZiAvL0FORFJPSURfUlNfQlVJTERfRk9SX0hPU1QKKworI2luY2x1ZGUgInJzUHJvZ3JhbVN0b3JlLmgiCiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OnJlbmRlcnNjcmlwdDsKIAogCi1Qcm9ncmFtRnJhZ21lbnRTdG9yZTo6UHJvZ3JhbUZyYWdtZW50U3RvcmUoQ29udGV4dCAqcnNjKSA6CitQcm9ncmFtU3RvcmU6OlByb2dyYW1TdG9yZShDb250ZXh0ICpyc2MpIDoKICAgICBQcm9ncmFtKHJzYykKIHsKICAgICBtQWxsb2NGaWxlID0gX19GSUxFX187CkBAIC00NiwxMSArNTIsMTEgQEAKIAogfQogCi1Qcm9ncmFtRnJhZ21lbnRTdG9yZTo6flByb2dyYW1GcmFnbWVudFN0b3JlKCkKK1Byb2dyYW1TdG9yZTo6flByb2dyYW1TdG9yZSgpCiB7CiB9CiAKLXZvaWQgUHJvZ3JhbUZyYWdtZW50U3RvcmU6OnNldHVwR0woY29uc3QgQ29udGV4dCAqcnNjLCBQcm9ncmFtRnJhZ21lbnRTdG9yZVN0YXRlICpzdGF0ZSkKK3ZvaWQgUHJvZ3JhbVN0b3JlOjpzZXR1cEdMKGNvbnN0IENvbnRleHQgKnJzYywgUHJvZ3JhbVN0b3JlU3RhdGUgKnN0YXRlKQogewogICAgIGlmIChzdGF0ZS0+bUxhc3QuZ2V0KCkgPT0gdGhpcykgewogICAgICAgICByZXR1cm47CkBAIC04NSw3ICs5MSw3IEBACiAgICAgfQogfQogCi12b2lkIFByb2dyYW1GcmFnbWVudFN0b3JlOjpzZXR1cEdMMihjb25zdCBDb250ZXh0ICpyc2MsIFByb2dyYW1GcmFnbWVudFN0b3JlU3RhdGUgKnN0YXRlKQordm9pZCBQcm9ncmFtU3RvcmU6OnNldHVwR0wyKGNvbnN0IENvbnRleHQgKnJzYywgUHJvZ3JhbVN0b3JlU3RhdGUgKnN0YXRlKQogewogICAgIGlmIChzdGF0ZS0+bUxhc3QuZ2V0KCkgPT0gdGhpcykgewogICAgICAgICByZXR1cm47CkBAIC0xMjEsMTIgKzEyNywyMyBAQAogfQogCiAKLXZvaWQgUHJvZ3JhbUZyYWdtZW50U3RvcmU6OnNldERpdGhlckVuYWJsZShib29sIGVuYWJsZSkKK3ZvaWQgUHJvZ3JhbVN0b3JlOjpzZXREaXRoZXJFbmFibGUoYm9vbCBlbmFibGUpCiB7CiAgICAgbURpdGhlckVuYWJsZSA9IGVuYWJsZTsKIH0KIAotdm9pZCBQcm9ncmFtRnJhZ21lbnRTdG9yZTo6c2V0RGVwdGhGdW5jKFJzRGVwdGhGdW5jIGZ1bmMpCit2b2lkIFByb2dyYW1TdG9yZTo6c2VyaWFsaXplKE9TdHJlYW0gKnN0cmVhbSkgY29uc3QKK3sKKworfQorCitQcm9ncmFtU3RvcmUgKlByb2dyYW1TdG9yZTo6Y3JlYXRlRnJvbVN0cmVhbShDb250ZXh0ICpyc2MsIElTdHJlYW0gKnN0cmVhbSkKK3sKKyAgICByZXR1cm4gTlVMTDsKK30KKworCit2b2lkIFByb2dyYW1TdG9yZTo6c2V0RGVwdGhGdW5jKFJzRGVwdGhGdW5jIGZ1bmMpCiB7CiAgICAgbURlcHRoVGVzdEVuYWJsZSA9IHRydWU7CiAKQEAgLTE1NiwxMiArMTczLDEyIEBACiAgICAgfQogfQogCi12b2lkIFByb2dyYW1GcmFnbWVudFN0b3JlOjpzZXREZXB0aE1hc2soYm9vbCBtYXNrKQordm9pZCBQcm9ncmFtU3RvcmU6OnNldERlcHRoTWFzayhib29sIG1hc2spCiB7CiAgICAgbURlcHRoV3JpdGVFbmFibGUgPSBtYXNrOwogfQogCi12b2lkIFByb2dyYW1GcmFnbWVudFN0b3JlOjpzZXRCbGVuZEZ1bmMoUnNCbGVuZFNyY0Z1bmMgc3JjLCBSc0JsZW5kRHN0RnVuYyBkc3QpCit2b2lkIFByb2dyYW1TdG9yZTo6c2V0QmxlbmRGdW5jKFJzQmxlbmRTcmNGdW5jIHNyYywgUnNCbGVuZERzdEZ1bmMgZHN0KQogewogICAgIG1CbGVuZEVuYWJsZSA9IHRydWU7CiAgICAgaWYgKChzcmMgPT0gUlNfQkxFTkRfU1JDX09ORSkgJiYKQEAgLTIyNyw3ICsyNDQsNyBAQAogICAgIH0KIH0KIAotdm9pZCBQcm9ncmFtRnJhZ21lbnRTdG9yZTo6c2V0Q29sb3JNYXNrKGJvb2wgciwgYm9vbCBnLCBib29sIGIsIGJvb2wgYSkKK3ZvaWQgUHJvZ3JhbVN0b3JlOjpzZXRDb2xvck1hc2soYm9vbCByLCBib29sIGcsIGJvb2wgYiwgYm9vbCBhKQogewogICAgIG1Db2xvclJXcml0ZUVuYWJsZSA9IHI7CiAgICAgbUNvbG9yR1dyaXRlRW5hYmxlID0gZzsKQEAgLTIzNiwyNCArMjUzLDI0IEBACiB9CiAKIAotUHJvZ3JhbUZyYWdtZW50U3RvcmVTdGF0ZTo6UHJvZ3JhbUZyYWdtZW50U3RvcmVTdGF0ZSgpCitQcm9ncmFtU3RvcmVTdGF0ZTo6UHJvZ3JhbVN0b3JlU3RhdGUoKQogewogICAgIG1QRlMgPSBOVUxMOwogfQogCi1Qcm9ncmFtRnJhZ21lbnRTdG9yZVN0YXRlOjp+UHJvZ3JhbUZyYWdtZW50U3RvcmVTdGF0ZSgpCitQcm9ncmFtU3RvcmVTdGF0ZTo6flByb2dyYW1TdG9yZVN0YXRlKCkKIHsKICAgICBkZWxldGUgbVBGUzsKIAogfQogCi12b2lkIFByb2dyYW1GcmFnbWVudFN0b3JlU3RhdGU6OmluaXQoQ29udGV4dCAqcnNjLCBpbnQzMl90IHcsIGludDMyX3QgaCkKK3ZvaWQgUHJvZ3JhbVN0b3JlU3RhdGU6OmluaXQoQ29udGV4dCAqcnNjKQogewotICAgIFByb2dyYW1GcmFnbWVudFN0b3JlICpwZnMgPSBuZXcgUHJvZ3JhbUZyYWdtZW50U3RvcmUocnNjKTsKKyAgICBQcm9ncmFtU3RvcmUgKnBmcyA9IG5ldyBQcm9ncmFtU3RvcmUocnNjKTsKICAgICBtRGVmYXVsdC5zZXQocGZzKTsKIH0KIAotdm9pZCBQcm9ncmFtRnJhZ21lbnRTdG9yZVN0YXRlOjpkZWluaXQoQ29udGV4dCAqcnNjKQordm9pZCBQcm9ncmFtU3RvcmVTdGF0ZTo6ZGVpbml0KENvbnRleHQgKnJzYykKIHsKICAgICBtRGVmYXVsdC5jbGVhcigpOwogICAgIG1MYXN0LmNsZWFyKCk7CkBAIC0yNjMsNDIgKzI4MCw0MiBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIHJlbmRlcnNjcmlwdCB7CiAKLXZvaWQgcnNpX1Byb2dyYW1GcmFnbWVudFN0b3JlQmVnaW4oQ29udGV4dCAqIHJzYywgUnNFbGVtZW50IGluLCBSc0VsZW1lbnQgb3V0KQordm9pZCByc2lfUHJvZ3JhbVN0b3JlQmVnaW4oQ29udGV4dCAqIHJzYywgUnNFbGVtZW50IGluLCBSc0VsZW1lbnQgb3V0KQogewogICAgIGRlbGV0ZSByc2MtPm1TdGF0ZUZyYWdtZW50U3RvcmUubVBGUzsKLSAgICByc2MtPm1TdGF0ZUZyYWdtZW50U3RvcmUubVBGUyA9IG5ldyBQcm9ncmFtRnJhZ21lbnRTdG9yZShyc2MpOworICAgIHJzYy0+bVN0YXRlRnJhZ21lbnRTdG9yZS5tUEZTID0gbmV3IFByb2dyYW1TdG9yZShyc2MpOwogCiB9CiAKLXZvaWQgcnNpX1Byb2dyYW1GcmFnbWVudFN0b3JlRGVwdGhGdW5jKENvbnRleHQgKnJzYywgUnNEZXB0aEZ1bmMgZnVuYykKK3ZvaWQgcnNpX1Byb2dyYW1TdG9yZURlcHRoRnVuYyhDb250ZXh0ICpyc2MsIFJzRGVwdGhGdW5jIGZ1bmMpCiB7CiAgICAgcnNjLT5tU3RhdGVGcmFnbWVudFN0b3JlLm1QRlMtPnNldERlcHRoRnVuYyhmdW5jKTsKIH0KIAotdm9pZCByc2lfUHJvZ3JhbUZyYWdtZW50U3RvcmVEZXB0aE1hc2soQ29udGV4dCAqcnNjLCBib29sIG1hc2spCit2b2lkIHJzaV9Qcm9ncmFtU3RvcmVEZXB0aE1hc2soQ29udGV4dCAqcnNjLCBib29sIG1hc2spCiB7CiAgICAgcnNjLT5tU3RhdGVGcmFnbWVudFN0b3JlLm1QRlMtPnNldERlcHRoTWFzayhtYXNrKTsKIH0KIAotdm9pZCByc2lfUHJvZ3JhbUZyYWdtZW50U3RvcmVDb2xvck1hc2soQ29udGV4dCAqcnNjLCBib29sIHIsIGJvb2wgZywgYm9vbCBiLCBib29sIGEpCit2b2lkIHJzaV9Qcm9ncmFtU3RvcmVDb2xvck1hc2soQ29udGV4dCAqcnNjLCBib29sIHIsIGJvb2wgZywgYm9vbCBiLCBib29sIGEpCiB7CiAgICAgcnNjLT5tU3RhdGVGcmFnbWVudFN0b3JlLm1QRlMtPnNldENvbG9yTWFzayhyLCBnLCBiLCBhKTsKIH0KIAotdm9pZCByc2lfUHJvZ3JhbUZyYWdtZW50U3RvcmVCbGVuZEZ1bmMoQ29udGV4dCAqcnNjLCBSc0JsZW5kU3JjRnVuYyBzcmMsIFJzQmxlbmREc3RGdW5jIGRzdCkKK3ZvaWQgcnNpX1Byb2dyYW1TdG9yZUJsZW5kRnVuYyhDb250ZXh0ICpyc2MsIFJzQmxlbmRTcmNGdW5jIHNyYywgUnNCbGVuZERzdEZ1bmMgZHN0KQogewogICAgIHJzYy0+bVN0YXRlRnJhZ21lbnRTdG9yZS5tUEZTLT5zZXRCbGVuZEZ1bmMoc3JjLCBkc3QpOwogfQogCi1Sc1Byb2dyYW1GcmFnbWVudFN0b3JlIHJzaV9Qcm9ncmFtRnJhZ21lbnRTdG9yZUNyZWF0ZShDb250ZXh0ICpyc2MpCitSc1Byb2dyYW1TdG9yZSByc2lfUHJvZ3JhbVN0b3JlQ3JlYXRlKENvbnRleHQgKnJzYykKIHsKLSAgICBQcm9ncmFtRnJhZ21lbnRTdG9yZSAqcGZzID0gcnNjLT5tU3RhdGVGcmFnbWVudFN0b3JlLm1QRlM7CisgICAgUHJvZ3JhbVN0b3JlICpwZnMgPSByc2MtPm1TdGF0ZUZyYWdtZW50U3RvcmUubVBGUzsKICAgICBwZnMtPmluY1VzZXJSZWYoKTsKICAgICByc2MtPm1TdGF0ZUZyYWdtZW50U3RvcmUubVBGUyA9IDA7CiAgICAgcmV0dXJuIHBmczsKIH0KIAotdm9pZCByc2lfUHJvZ3JhbUZyYWdtZW50U3RvcmVEaXRoZXIoQ29udGV4dCAqcnNjLCBib29sIGVuYWJsZSkKK3ZvaWQgcnNpX1Byb2dyYW1TdG9yZURpdGhlcihDb250ZXh0ICpyc2MsIGJvb2wgZW5hYmxlKQogewogICAgIHJzYy0+bVN0YXRlRnJhZ21lbnRTdG9yZS5tUEZTLT5zZXREaXRoZXJFbmFibGUoZW5hYmxlKTsKIH0KZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNQcm9ncmFtRnJhZ21lbnRTdG9yZS5oIGIvbGlicy9ycy9yc1Byb2dyYW1TdG9yZS5oCnNpbWlsYXJpdHkgaW5kZXggNjglCnJlbmFtZSBmcm9tIGxpYnMvcnMvcnNQcm9ncmFtRnJhZ21lbnRTdG9yZS5oCnJlbmFtZSB0byBsaWJzL3JzL3JzUHJvZ3JhbVN0b3JlLmgKaW5kZXggMzQxMmM5OS4uZmU4ZDc4ZSAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc1Byb2dyYW1GcmFnbWVudFN0b3JlLmgKKysrIGIvbGlicy9ycy9yc1Byb2dyYW1TdG9yZS5oCkBAIC0xOCwyMSArMTgsMjIgQEAKICNkZWZpbmUgQU5EUk9JRF9SU19QUk9HUkFNX0ZSQUdNRU5UX1NUT1JFX0gKIAogI2luY2x1ZGUgInJzUHJvZ3JhbS5oIgorI2luY2x1ZGUgInJzU3RyZWFtLmgiCiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIHJlbmRlcnNjcmlwdCB7CiAKLWNsYXNzIFByb2dyYW1GcmFnbWVudFN0b3JlU3RhdGU7CitjbGFzcyBQcm9ncmFtU3RvcmVTdGF0ZTsKIAotY2xhc3MgUHJvZ3JhbUZyYWdtZW50U3RvcmUgOiBwdWJsaWMgUHJvZ3JhbQorY2xhc3MgUHJvZ3JhbVN0b3JlIDogcHVibGljIFByb2dyYW0KIHsKIHB1YmxpYzoKLSAgICBQcm9ncmFtRnJhZ21lbnRTdG9yZShDb250ZXh0ICopOwotICAgIHZpcnR1YWwgflByb2dyYW1GcmFnbWVudFN0b3JlKCk7CisgICAgUHJvZ3JhbVN0b3JlKENvbnRleHQgKik7CisgICAgdmlydHVhbCB+UHJvZ3JhbVN0b3JlKCk7CiAKLSAgICB2aXJ0dWFsIHZvaWQgc2V0dXBHTChjb25zdCBDb250ZXh0ICosIFByb2dyYW1GcmFnbWVudFN0b3JlU3RhdGUgKik7Ci0gICAgdmlydHVhbCB2b2lkIHNldHVwR0wyKGNvbnN0IENvbnRleHQgKiwgUHJvZ3JhbUZyYWdtZW50U3RvcmVTdGF0ZSAqKTsKKyAgICB2aXJ0dWFsIHZvaWQgc2V0dXBHTChjb25zdCBDb250ZXh0ICosIFByb2dyYW1TdG9yZVN0YXRlICopOworICAgIHZpcnR1YWwgdm9pZCBzZXR1cEdMMihjb25zdCBDb250ZXh0ICosIFByb2dyYW1TdG9yZVN0YXRlICopOwogCiAgICAgdm9pZCBzZXREZXB0aEZ1bmMoUnNEZXB0aEZ1bmMpOwogICAgIHZvaWQgc2V0RGVwdGhNYXNrKGJvb2wpOwpAQCAtNDIsNiArNDMsMTAgQEAKIAogICAgIHZvaWQgc2V0RGl0aGVyRW5hYmxlKGJvb2wpOwogCisgICAgdmlydHVhbCB2b2lkIHNlcmlhbGl6ZShPU3RyZWFtICpzdHJlYW0pIGNvbnN0OworICAgIHZpcnR1YWwgUnNBM0RDbGFzc0lEIGdldENsYXNzSWQoKSBjb25zdCB7IHJldHVybiBSU19BM0RfQ0xBU1NfSURfUFJPR1JBTV9TVE9SRTsgfQorICAgIHN0YXRpYyBQcm9ncmFtU3RvcmUgKmNyZWF0ZUZyb21TdHJlYW0oQ29udGV4dCAqcnNjLCBJU3RyZWFtICpzdHJlYW0pOworCiBwcm90ZWN0ZWQ6CiAgICAgYm9vbCBtRGl0aGVyRW5hYmxlOwogCkBAIC02MCwxOSArNjUsMTkgQEAKICAgICBib29sIG1TdGVuY2lsVGVzdEVuYWJsZTsKIH07CiAKLWNsYXNzIFByb2dyYW1GcmFnbWVudFN0b3JlU3RhdGUKK2NsYXNzIFByb2dyYW1TdG9yZVN0YXRlCiB7CiBwdWJsaWM6Ci0gICAgUHJvZ3JhbUZyYWdtZW50U3RvcmVTdGF0ZSgpOwotICAgIH5Qcm9ncmFtRnJhZ21lbnRTdG9yZVN0YXRlKCk7Ci0gICAgdm9pZCBpbml0KENvbnRleHQgKnJzYywgaW50MzJfdCB3LCBpbnQzMl90IGgpOworICAgIFByb2dyYW1TdG9yZVN0YXRlKCk7CisgICAgflByb2dyYW1TdG9yZVN0YXRlKCk7CisgICAgdm9pZCBpbml0KENvbnRleHQgKnJzYyk7CiAgICAgdm9pZCBkZWluaXQoQ29udGV4dCAqcnNjKTsKIAotICAgIE9iamVjdEJhc2VSZWY8UHJvZ3JhbUZyYWdtZW50U3RvcmU+IG1EZWZhdWx0OwotICAgIE9iamVjdEJhc2VSZWY8UHJvZ3JhbUZyYWdtZW50U3RvcmU+IG1MYXN0OworICAgIE9iamVjdEJhc2VSZWY8UHJvZ3JhbVN0b3JlPiBtRGVmYXVsdDsKKyAgICBPYmplY3RCYXNlUmVmPFByb2dyYW1TdG9yZT4gbUxhc3Q7CiAKIAotICAgIFByb2dyYW1GcmFnbWVudFN0b3JlICptUEZTOworICAgIFByb2dyYW1TdG9yZSAqbVBGUzsKIH07CiAKIApkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc1Byb2dyYW1WZXJ0ZXguY3BwIGIvbGlicy9ycy9yc1Byb2dyYW1WZXJ0ZXguY3BwCmluZGV4IGEyYjJkZjQuLjg1ZDkwYzcgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNQcm9ncmFtVmVydGV4LmNwcAorKysgYi9saWJzL3JzL3JzUHJvZ3JhbVZlcnRleC5jcHAKQEAgLTE0LDEzICsxNCwxOSBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorI2lmbmRlZiBBTkRST0lEX1JTX0JVSUxEX0ZPUl9IT1NUCiAjaW5jbHVkZSAicnNDb250ZXh0LmgiCi0jaW5jbHVkZSAicnNQcm9ncmFtVmVydGV4LmgiCi0KICNpbmNsdWRlIDxHTEVTL2dsLmg+CiAjaW5jbHVkZSA8R0xFUy9nbGV4dC5oPgogI2luY2x1ZGUgPEdMRVMyL2dsMi5oPgogI2luY2x1ZGUgPEdMRVMyL2dsMmV4dC5oPgorI2Vsc2UKKyNpbmNsdWRlICJyc0NvbnRleHRIb3N0U3R1Yi5oIgorI2luY2x1ZGUgPE9wZW5HTC9nbC5oPgorI2luY2x1ZGUgPE9wZW5HTC9nbGV4dC5oPgorI2VuZGlmIC8vQU5EUk9JRF9SU19CVUlMRF9GT1JfSE9TVAorCisjaW5jbHVkZSAicnNQcm9ncmFtVmVydGV4LmgiCiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OnJlbmRlcnNjcmlwdDsKQEAgLTgxLDkgKzg3LDEyIEBACiAgICAgZ2xNYXRyaXhNb2RlKEdMX01PREVMVklFVyk7CiAgICAgZ2xMb2FkSWRlbnRpdHkoKTsKICAgICBpZiAobUxpZ2h0Q291bnQpIHsKKyNpZm5kZWYgQU5EUk9JRF9SU19CVUlMRF9GT1JfSE9TVCAvLyBHTEVTIE9ubHkKICAgICAgICAgaW50IHYgPSAwOwogICAgICAgICBnbEVuYWJsZShHTF9MSUdIVElORyk7CisKICAgICAgICAgZ2xMaWdodE1vZGVseHYoR0xfTElHSFRfTU9ERUxfVFdPX1NJREUsICZ2KTsKKwogICAgICAgICBmb3IgKHVpbnQzMl90IGN0ID0gMDsgY3QgPCBtTGlnaHRDb3VudDsgY3QrKykgewogICAgICAgICAgICAgY29uc3QgTGlnaHQgKmwgPSBtTGlnaHRzW2N0XS5nZXQoKTsKICAgICAgICAgICAgIGdsRW5hYmxlKEdMX0xJR0hUMCArIGN0KTsKQEAgLTkyLDYgKzEwMSw3IEBACiAgICAgICAgIGZvciAodWludDMyX3QgY3QgPSBtTGlnaHRDb3VudDsgY3QgPCBNQVhfTElHSFRTOyBjdCsrKSB7CiAgICAgICAgICAgICBnbERpc2FibGUoR0xfTElHSFQwICsgY3QpOwogICAgICAgICB9CisjZW5kaWYgLy9BTkRST0lEX1JTX0JVSUxEX0ZPUl9IT1NUCiAgICAgfSBlbHNlIHsKICAgICAgICAgZ2xEaXNhYmxlKEdMX0xJR0hUSU5HKTsKICAgICB9CkBAIC0xMjgsNiArMTM4LDExIEBACiAgICAgICAgICAgICBjb25zdCBFbGVtZW50ICplID0gbUNvbnN0YW50VHlwZXNbY3RdLT5nZXRFbGVtZW50KCk7CiAgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGZpZWxkPTA7IGZpZWxkIDwgZS0+Z2V0RmllbGRDb3VudCgpOyBmaWVsZCsrKSB7CiAgICAgICAgICAgICAgICAgY29uc3QgRWxlbWVudCAqZiA9IGUtPmdldEZpZWxkKGZpZWxkKTsKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmbiA9IGUtPmdldEZpZWxkTmFtZShmaWVsZCk7CisKKyAgICAgICAgICAgICAgICBpZiAoZm5bMF0gPT0gJyMnKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIC8vIENhbm5vdCBiZSBjb21wbGV4CiAgICAgICAgICAgICAgICAgcnNBc3NlcnQoIWYtPmdldEZpZWxkQ291bnQoKSk7CkBAIC0xNDAsNyArMTU1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgcnNBc3NlcnQoMCk7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgbVNoYWRlci5hcHBlbmQoZS0+Z2V0RmllbGROYW1lKGZpZWxkKSk7CisgICAgICAgICAgICAgICAgbVNoYWRlci5hcHBlbmQoZm4pOwogICAgICAgICAgICAgICAgIG1TaGFkZXIuYXBwZW5kKCI7XG4iKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtMTUwLDYgKzE2NSwxMSBAQAogICAgICAgICAgICAgY29uc3QgRWxlbWVudCAqZSA9IG1JbnB1dEVsZW1lbnRzW2N0XS5nZXQoKTsKICAgICAgICAgICAgIGZvciAodWludDMyX3QgZmllbGQ9MDsgZmllbGQgPCBlLT5nZXRGaWVsZENvdW50KCk7IGZpZWxkKyspIHsKICAgICAgICAgICAgICAgICBjb25zdCBFbGVtZW50ICpmID0gZS0+Z2V0RmllbGQoZmllbGQpOworICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZuID0gZS0+Z2V0RmllbGROYW1lKGZpZWxkKTsKKworICAgICAgICAgICAgICAgIGlmIChmblswXSA9PSAnIycpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgLy8gQ2Fubm90IGJlIGNvbXBsZXgKICAgICAgICAgICAgICAgICByc0Fzc2VydCghZi0+Z2V0RmllbGRDb3VudCgpKTsKQEAgLTE2MiwxNyArMTgyLDE3IEBACiAgICAgICAgICAgICAgICAgICAgIHJzQXNzZXJ0KDApOwogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIG1TaGFkZXIuYXBwZW5kKGUtPmdldEZpZWxkTmFtZShmaWVsZCkpOworICAgICAgICAgICAgICAgIG1TaGFkZXIuYXBwZW5kKGZuKTsKICAgICAgICAgICAgICAgICBtU2hhZGVyLmFwcGVuZCgiO1xuIik7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgbVNoYWRlci5hcHBlbmQobVVzZXJTaGFkZXIpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIG1TaGFkZXIuYXBwZW5kKCJhdHRyaWJ1dGUgdmVjNCBBVFRSSUJfTGVnYWN5UG9zaXRpb247XG4iKTsKLSAgICAgICAgbVNoYWRlci5hcHBlbmQoImF0dHJpYnV0ZSB2ZWM0IEFUVFJJQl9MZWdhY3lDb2xvcjtcbiIpOwotICAgICAgICBtU2hhZGVyLmFwcGVuZCgiYXR0cmlidXRlIHZlYzMgQVRUUklCX0xlZ2FjeU5vcm1hbDtcbiIpOwotICAgICAgICBtU2hhZGVyLmFwcGVuZCgiYXR0cmlidXRlIGZsb2F0IEFUVFJJQl9MZWdhY3lQb2ludFNpemU7XG4iKTsKLSAgICAgICAgbVNoYWRlci5hcHBlbmQoImF0dHJpYnV0ZSB2ZWM0IEFUVFJJQl9MZWdhY3lUZXh0dXJlO1xuIik7CisgICAgICAgIG1TaGFkZXIuYXBwZW5kKCJhdHRyaWJ1dGUgdmVjNCBBVFRSSUJfcG9zaXRpb247XG4iKTsKKyAgICAgICAgbVNoYWRlci5hcHBlbmQoImF0dHJpYnV0ZSB2ZWM0IEFUVFJJQl9jb2xvcjtcbiIpOworICAgICAgICBtU2hhZGVyLmFwcGVuZCgiYXR0cmlidXRlIHZlYzMgQVRUUklCX25vcm1hbDtcbiIpOworICAgICAgICBtU2hhZGVyLmFwcGVuZCgiYXR0cmlidXRlIGZsb2F0IEFUVFJJQl9wb2ludFNpemU7XG4iKTsKKyAgICAgICAgbVNoYWRlci5hcHBlbmQoImF0dHJpYnV0ZSB2ZWM0IEFUVFJJQl90ZXh0dXJlMDtcbiIpOwogCiAgICAgICAgIGZvciAodWludDMyX3QgY3Q9MDsgY3QgPCBtVW5pZm9ybUNvdW50OyBjdCsrKSB7CiAgICAgICAgICAgICBtU2hhZGVyLmFwcGVuZCgidW5pZm9ybSBtYXQ0ICIpOwpAQCAtMTgxLDE0ICsyMDEsMTQgQEAKICAgICAgICAgfQogCiAgICAgICAgIG1TaGFkZXIuYXBwZW5kKCJ2b2lkIG1haW4oKSB7XG4iKTsKLSAgICAgICAgbVNoYWRlci5hcHBlbmQoIiAgZ2xfUG9zaXRpb24gPSBVTklfTVZQICogQVRUUklCX0xlZ2FjeVBvc2l0aW9uO1xuIik7Ci0gICAgICAgIG1TaGFkZXIuYXBwZW5kKCIgIGdsX1BvaW50U2l6ZSA9IEFUVFJJQl9MZWdhY3lQb2ludFNpemU7XG4iKTsKKyAgICAgICAgbVNoYWRlci5hcHBlbmQoIiAgZ2xfUG9zaXRpb24gPSBVTklfTVZQICogQVRUUklCX3Bvc2l0aW9uO1xuIik7CisgICAgICAgIG1TaGFkZXIuYXBwZW5kKCIgIGdsX1BvaW50U2l6ZSA9IEFUVFJJQl9wb2ludFNpemU7XG4iKTsKIAotICAgICAgICBtU2hhZGVyLmFwcGVuZCgiICB2YXJDb2xvciA9IEFUVFJJQl9MZWdhY3lDb2xvcjtcbiIpOworICAgICAgICBtU2hhZGVyLmFwcGVuZCgiICB2YXJDb2xvciA9IEFUVFJJQl9jb2xvcjtcbiIpOwogICAgICAgICBpZiAobVRleHR1cmVNYXRyaXhFbmFibGUpIHsKLSAgICAgICAgICAgIG1TaGFkZXIuYXBwZW5kKCIgIHZhclRleDAgPSBVTklfVGV4TWF0cml4ICogQVRUUklCX0xlZ2FjeVRleHR1cmU7XG4iKTsKKyAgICAgICAgICAgIG1TaGFkZXIuYXBwZW5kKCIgIHZhclRleDAgPSBVTklfVGV4TWF0cml4ICogQVRUUklCX3RleHR1cmUwO1xuIik7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtU2hhZGVyLmFwcGVuZCgiICB2YXJUZXgwID0gQVRUUklCX0xlZ2FjeVRleHR1cmU7XG4iKTsKKyAgICAgICAgICAgIG1TaGFkZXIuYXBwZW5kKCIgIHZhclRleDAgPSBBVFRSSUJfdGV4dHVyZTA7XG4iKTsKICAgICAgICAgfQogICAgICAgICAvL21TaGFkZXIuYXBwZW5kKCIgIHBvcy54ID0gcG9zLnggLyA0ODAuMDtcbiIpOwogICAgICAgICAvL21TaGFkZXIuYXBwZW5kKCIgIHBvcy55ID0gcG9zLnkgLyA4MDAuMDtcbiIpOwpAQCAtMjAxLDcgKzIyMSw3IEBACiB7CiAgICAgLy9MT0dFKCJzZ2wyIHZ0eDEgJXgiLCBnbEdldEVycm9yKCkpOwogICAgIGlmICgoc3RhdGUtPm1MYXN0LmdldCgpID09IHRoaXMpICYmICFtRGlydHkpIHsKLSAgICAgICAgLy9yZXR1cm47CisgICAgICAgIHJldHVybjsKICAgICB9CiAKICAgICByc2MtPmNoZWNrRXJyb3IoIlByb2dyYW1WZXJ0ZXg6OnNldHVwR0wyIHN0YXJ0Iik7CkBAIC0zNTEsNiArMzcxLDE2IEBACiAgICAgY3JlYXRlU2hhZGVyKCk7CiB9CiAKK3ZvaWQgUHJvZ3JhbVZlcnRleDo6c2VyaWFsaXplKE9TdHJlYW0gKnN0cmVhbSkgY29uc3QKK3sKKworfQorCitQcm9ncmFtVmVydGV4ICpQcm9ncmFtVmVydGV4OjpjcmVhdGVGcm9tU3RyZWFtKENvbnRleHQgKnJzYywgSVN0cmVhbSAqc3RyZWFtKQoreworICAgIHJldHVybiBOVUxMOworfQorCiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKQEAgLTM2Miw4ICszOTIsOSBAQAogewogfQogCi12b2lkIFByb2dyYW1WZXJ0ZXhTdGF0ZTo6aW5pdChDb250ZXh0ICpyc2MsIGludDMyX3QgdywgaW50MzJfdCBoKQordm9pZCBQcm9ncmFtVmVydGV4U3RhdGU6OmluaXQoQ29udGV4dCAqcnNjKQogeworI2lmbmRlZiBBTkRST0lEX1JTX0JVSUxEX0ZPUl9IT1NUCiAgICAgUnNFbGVtZW50IGUgPSAoUnNFbGVtZW50KSBFbGVtZW50OjpjcmVhdGUocnNjLCBSU19UWVBFX0ZMT0FUXzMyLCBSU19LSU5EX1VTRVIsIGZhbHNlLCAxKTsKIAogICAgIHJzaV9UeXBlQmVnaW4ocnNjLCBlKTsKQEAgLTM3Miw2ICs0MDMsNyBAQAogCiAgICAgUHJvZ3JhbVZlcnRleCAqcHYgPSBuZXcgUHJvZ3JhbVZlcnRleChyc2MsIGZhbHNlKTsKICAgICBBbGxvY2F0aW9uICphbGxvYyA9IChBbGxvY2F0aW9uICopcnNpX0FsbG9jYXRpb25DcmVhdGVUeXBlZChyc2MsIG1BbGxvY1R5cGUuZ2V0KCkpOworCiAgICAgbURlZmF1bHRBbGxvYy5zZXQoYWxsb2MpOwogICAgIG1EZWZhdWx0LnNldChwdik7CiAgICAgcHYtPmluaXQocnNjKTsKQEAgLTM4MiwxMyArNDE0LDE1IEBACiAgICAgY29sb3JbMl0gPSAxLmY7CiAgICAgY29sb3JbM10gPSAxLmY7CiAKLSAgICB1cGRhdGVTaXplKHJzYywgdywgaCk7CisgICAgdXBkYXRlU2l6ZShyc2MpOworI2VuZGlmIC8vQU5EUk9JRF9SU19CVUlMRF9GT1JfSE9TVAorCiB9CiAKLXZvaWQgUHJvZ3JhbVZlcnRleFN0YXRlOjp1cGRhdGVTaXplKENvbnRleHQgKnJzYywgaW50MzJfdCB3LCBpbnQzMl90IGgpCit2b2lkIFByb2dyYW1WZXJ0ZXhTdGF0ZTo6dXBkYXRlU2l6ZShDb250ZXh0ICpyc2MpCiB7CiAgICAgTWF0cml4IG07Ci0gICAgbS5sb2FkT3J0aG8oMCx3LCBoLDAsIC0xLDEpOworICAgIG0ubG9hZE9ydGhvKDAscnNjLT5nZXRXaWR0aCgpLCByc2MtPmdldEhlaWdodCgpLDAsIC0xLDEpOwogICAgIG1EZWZhdWx0QWxsb2MtPnN1YkRhdGEoUlNfUFJPR1JBTV9WRVJURVhfUFJPSkVDVElPTl9PRkZTRVQsIDE2LCAmbS5tWzBdLCAxNio0KTsKIAogICAgIG0ubG9hZElkZW50aXR5KCk7CmRpZmYgLS1naXQgYS9saWJzL3JzL3JzUHJvZ3JhbVZlcnRleC5oIGIvbGlicy9ycy9yc1Byb2dyYW1WZXJ0ZXguaAppbmRleCAyODU1NGNjLi5jYjkzZWFmIDEwMDY0NAotLS0gYS9saWJzL3JzL3JzUHJvZ3JhbVZlcnRleC5oCisrKyBiL2xpYnMvcnMvcnNQcm9ncmFtVmVydGV4LmgKQEAgLTUyLDYgKzUyLDkgQEAKICAgICB2aXJ0dWFsIHZvaWQgbG9hZFNoYWRlcihDb250ZXh0ICopOwogICAgIHZpcnR1YWwgdm9pZCBpbml0KENvbnRleHQgKik7CiAKKyAgICB2aXJ0dWFsIHZvaWQgc2VyaWFsaXplKE9TdHJlYW0gKnN0cmVhbSkgY29uc3Q7CisgICAgdmlydHVhbCBSc0EzRENsYXNzSUQgZ2V0Q2xhc3NJZCgpIGNvbnN0IHsgcmV0dXJuIFJTX0EzRF9DTEFTU19JRF9QUk9HUkFNX1ZFUlRFWDsgfQorICAgIHN0YXRpYyBQcm9ncmFtVmVydGV4ICpjcmVhdGVGcm9tU3RyZWFtKENvbnRleHQgKnJzYywgSVN0cmVhbSAqc3RyZWFtKTsKIAogcHJvdGVjdGVkOgogICAgIHVpbnQzMl90IG1MaWdodENvdW50OwpAQCAtNzEsOSArNzQsOSBAQAogICAgIFByb2dyYW1WZXJ0ZXhTdGF0ZSgpOwogICAgIH5Qcm9ncmFtVmVydGV4U3RhdGUoKTsKIAotICAgIHZvaWQgaW5pdChDb250ZXh0ICpyc2MsIGludDMyX3QgdywgaW50MzJfdCBoKTsKKyAgICB2b2lkIGluaXQoQ29udGV4dCAqcnNjKTsKICAgICB2b2lkIGRlaW5pdChDb250ZXh0ICpyc2MpOwotICAgIHZvaWQgdXBkYXRlU2l6ZShDb250ZXh0ICpyc2MsIGludDMyX3QgdywgaW50MzJfdCBoKTsKKyAgICB2b2lkIHVwZGF0ZVNpemUoQ29udGV4dCAqcnNjKTsKIAogICAgIE9iamVjdEJhc2VSZWY8UHJvZ3JhbVZlcnRleD4gbURlZmF1bHQ7CiAgICAgT2JqZWN0QmFzZVJlZjxQcm9ncmFtVmVydGV4PiBtTGFzdDsKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNTYW1wbGVyLmNwcCBiL2xpYnMvcnMvcnNTYW1wbGVyLmNwcAppbmRleCA3MWY1MDhmLi5mNDFmMjk1IDEwMDY0NAotLS0gYS9saWJzL3JzL3JzU2FtcGxlci5jcHAKKysrIGIvbGlicy9ycy9yc1NhbXBsZXIuY3BwCkBAIC0xNCwxMCArMTQsMTYgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKyNpZm5kZWYgQU5EUk9JRF9SU19CVUlMRF9GT1JfSE9TVAogI2luY2x1ZGUgPEdMRVMvZ2wuaD4KICNpbmNsdWRlIDxHTEVTL2dsZXh0Lmg+Ci0KICNpbmNsdWRlICJyc0NvbnRleHQuaCIKKyNlbHNlCisjaW5jbHVkZSAicnNDb250ZXh0SG9zdFN0dWIuaCIKKyNpbmNsdWRlIDxPcGVuR0wvZ2wuaD4KKyNpbmNsdWRlIDxPcGVuR0wvZ2xleHQuaD4KKyNlbmRpZiAvL0FORFJPSURfUlNfQlVJTERfRk9SX0hPU1QKKwogI2luY2x1ZGUgInJzU2FtcGxlci5oIgogCiAKQEAgLTk0LDYgKzEwMCwxNyBAQAogICAgIG1Cb3VuZFNsb3QgPSAtMTsKICAgICBzcy0+bVNhbXBsZXJzW3Nsb3RdLmNsZWFyKCk7CiB9CisKK3ZvaWQgU2FtcGxlcjo6c2VyaWFsaXplKE9TdHJlYW0gKnN0cmVhbSkgY29uc3QKK3sKKyAgICAKK30KKworU2FtcGxlciAqU2FtcGxlcjo6Y3JlYXRlRnJvbVN0cmVhbShDb250ZXh0ICpyc2MsIElTdHJlYW0gKnN0cmVhbSkKK3sKKyAgICByZXR1cm4gTlVMTDsKK30KKwogLyoKIHZvaWQgU2FtcGxlclN0YXRlOjpzZXR1cEdMKCkKIHsKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNTYW1wbGVyLmggYi9saWJzL3JzL3JzU2FtcGxlci5oCmluZGV4IDA1MDYwODEuLjM3ODY0MzkgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNTYW1wbGVyLmgKKysrIGIvbGlicy9ycy9yc1NhbXBsZXIuaApAQCAtNDYsNiArNDYsMTAgQEAKICAgICB2b2lkIGJpbmRUb0NvbnRleHQoU2FtcGxlclN0YXRlICosIHVpbnQzMl90IHNsb3QpOwogICAgIHZvaWQgdW5iaW5kRnJvbUNvbnRleHQoU2FtcGxlclN0YXRlICopOwogCisgICAgdmlydHVhbCB2b2lkIHNlcmlhbGl6ZShPU3RyZWFtICpzdHJlYW0pIGNvbnN0OworICAgIHZpcnR1YWwgUnNBM0RDbGFzc0lEIGdldENsYXNzSWQoKSBjb25zdCB7IHJldHVybiBSU19BM0RfQ0xBU1NfSURfU0FNUExFUjsgfQorICAgIHN0YXRpYyBTYW1wbGVyICpjcmVhdGVGcm9tU3RyZWFtKENvbnRleHQgKnJzYywgSVN0cmVhbSAqc3RyZWFtKTsKKwogcHJvdGVjdGVkOgogICAgIFJzU2FtcGxlclZhbHVlIG1NYWdGaWx0ZXI7CiAgICAgUnNTYW1wbGVyVmFsdWUgbU1pbkZpbHRlcjsKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNTY3JpcHQuY3BwIGIvbGlicy9ycy9yc1NjcmlwdC5jcHAKaW5kZXggYTMzOTMzYi4uZmMyMmZjMyAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc1NjcmlwdC5jcHAKKysrIGIvbGlicy9ycy9yc1NjcmlwdC5jcHAKQEAgLTI0LDE5ICsyNCwyNSBAQAogICAgIG1BbGxvY0ZpbGUgPSBfX0ZJTEVfXzsKICAgICBtQWxsb2NMaW5lID0gX19MSU5FX187CiAgICAgbWVtc2V0KCZtRW52aXJvbWVudCwgMCwgc2l6ZW9mKG1FbnZpcm9tZW50KSk7Ci0gICAgbUVudmlyb21lbnQubUNsZWFyQ29sb3JbMF0gPSAwOwotICAgIG1FbnZpcm9tZW50Lm1DbGVhckNvbG9yWzFdID0gMDsKLSAgICBtRW52aXJvbWVudC5tQ2xlYXJDb2xvclsyXSA9IDA7Ci0gICAgbUVudmlyb21lbnQubUNsZWFyQ29sb3JbM10gPSAxOwotICAgIG1FbnZpcm9tZW50Lm1DbGVhckRlcHRoID0gMTsKLSAgICBtRW52aXJvbWVudC5tQ2xlYXJTdGVuY2lsID0gMDsKLSAgICBtRW52aXJvbWVudC5tSXNSb290ID0gZmFsc2U7CiB9CiAKIFNjcmlwdDo6flNjcmlwdCgpCiB7CiB9CiAKK3ZvaWQgU2NyaXB0OjpzZXRWYXIodWludDMyX3Qgc2xvdCwgY29uc3Qgdm9pZCAqdmFsLCB1aW50MzJfdCBsZW4pCit7CisgICAgaW50MzJfdCAqZGVzdFB0ciA9ICgoaW50MzJfdCAqKiltRW52aXJvbWVudC5tRmllbGRBZGRyZXNzKVtzbG90XTsKKyAgICBpZiAoZGVzdFB0cikgeworICAgICAgICAvL0xPR0UoInNldFZhciBmMSAgJWYiLCAoKGNvbnN0IGZsb2F0ICopZGVzdFB0cilbMF0pOworICAgICAgICAvL0xPR0UoInNldFZhciAlcCAlaSIsIGRlc3RQdHIsIGxlbik7CisgICAgICAgIG1lbWNweShkZXN0UHRyLCB2YWwsIGxlbik7CisgICAgICAgIC8vTE9HRSgic2V0VmFyIGYyICAlZiIsICgoY29uc3QgZmxvYXQgKilkZXN0UHRyKVswXSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HRSgiQ2FsbGluZyBzZXRWYXIgb24gc2xvdCA9ICVpIHdoaWNoIGlzIG51bGwiLCBzbG90KTsKKyAgICB9Cit9CisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSByZW5kZXJzY3JpcHQgewogCkBAIC00NCwxNiArNTAsOSBAQAogdm9pZCByc2lfU2NyaXB0QmluZEFsbG9jYXRpb24oQ29udGV4dCAqIHJzYywgUnNTY3JpcHQgdnMsIFJzQWxsb2NhdGlvbiB2YSwgdWludDMyX3Qgc2xvdCkKIHsKICAgICBTY3JpcHQgKnMgPSBzdGF0aWNfY2FzdDxTY3JpcHQgKj4odnMpOwotICAgIHMtPm1TbG90c1tzbG90XS5zZXQoc3RhdGljX2Nhc3Q8QWxsb2NhdGlvbiAqPih2YSkpOwotfQotCi12b2lkIHJzaV9TY3JpcHRTZXRDbGVhckNvbG9yKENvbnRleHQgKiByc2MsIFJzU2NyaXB0IHZzLCBmbG9hdCByLCBmbG9hdCBnLCBmbG9hdCBiLCBmbG9hdCBhKQotewotICAgIFNjcmlwdCAqcyA9IHN0YXRpY19jYXN0PFNjcmlwdCAqPih2cyk7Ci0gICAgcy0+bUVudmlyb21lbnQubUNsZWFyQ29sb3JbMF0gPSByOwotICAgIHMtPm1FbnZpcm9tZW50Lm1DbGVhckNvbG9yWzFdID0gZzsKLSAgICBzLT5tRW52aXJvbWVudC5tQ2xlYXJDb2xvclsyXSA9IGI7Ci0gICAgcy0+bUVudmlyb21lbnQubUNsZWFyQ29sb3JbM10gPSBhOworICAgIEFsbG9jYXRpb24gKmEgPSBzdGF0aWNfY2FzdDxBbGxvY2F0aW9uICo+KHZhKTsKKyAgICBzLT5tU2xvdHNbc2xvdF0uc2V0KGEpOworICAgIC8vTE9HRSgicnNpX1NjcmlwdEJpbmRBbGxvY2F0aW9uICVpICAlcCAgJXAiLCBzbG90LCBhLCBhLT5nZXRQdHIoKSk7CiB9CiAKIHZvaWQgcnNpX1NjcmlwdFNldFRpbWVab25lKENvbnRleHQgKiByc2MsIFJzU2NyaXB0IHZzLCBjb25zdCBjaGFyICogdGltZVpvbmUsIHVpbnQzMl90IGxlbmd0aCkKQEAgLTYyLDUzICs2MSw1MSBAQAogICAgIHMtPm1FbnZpcm9tZW50Lm1UaW1lWm9uZSA9IHRpbWVab25lOwogfQogCi12b2lkIHJzaV9TY3JpcHRTZXRDbGVhckRlcHRoKENvbnRleHQgKiByc2MsIFJzU2NyaXB0IHZzLCBmbG9hdCB2KQotewotICAgIFNjcmlwdCAqcyA9IHN0YXRpY19jYXN0PFNjcmlwdCAqPih2cyk7Ci0gICAgcy0+bUVudmlyb21lbnQubUNsZWFyRGVwdGggPSB2OwotfQotCi12b2lkIHJzaV9TY3JpcHRTZXRDbGVhclN0ZW5jaWwoQ29udGV4dCAqIHJzYywgUnNTY3JpcHQgdnMsIHVpbnQzMl90IHYpCi17Ci0gICAgU2NyaXB0ICpzID0gc3RhdGljX2Nhc3Q8U2NyaXB0ICo+KHZzKTsKLSAgICBzLT5tRW52aXJvbWVudC5tQ2xlYXJTdGVuY2lsID0gdjsKLX0KLQogdm9pZCByc2lfU2NyaXB0U2V0VHlwZShDb250ZXh0ICogcnNjLCBSc1R5cGUgdnQsIHVpbnQzMl90IHNsb3QsIGJvb2wgd3JpdGFibGUsIGNvbnN0IGNoYXIgKm5hbWUpCiB7CiAgICAgU2NyaXB0Q1N0YXRlICpzcyA9ICZyc2MtPm1TY3JpcHRDOwogICAgIGNvbnN0IFR5cGUgKnQgPSBzdGF0aWNfY2FzdDxjb25zdCBUeXBlICo+KHZ0KTsKICAgICBzcy0+bUNvbnN0YW50QnVmZmVyVHlwZXNbc2xvdF0uc2V0KHQpOwogICAgIHNzLT5tU2xvdFdyaXRhYmxlW3Nsb3RdID0gd3JpdGFibGU7Ci0gICAgaWYgKG5hbWUpIHsKLSAgICAgICAgc3MtPm1TbG90TmFtZXNbc2xvdF0uc2V0VG8obmFtZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgc3MtPm1TbG90TmFtZXNbc2xvdF0uc2V0VG8oIiIpOwotICAgIH0KLX0KLQotdm9pZCByc2lfU2NyaXB0U2V0SW52b2tlKENvbnRleHQgKnJzYywgY29uc3QgY2hhciAqbmFtZSwgdWludDMyX3Qgc2xvdCkKLXsKLSAgICBTY3JpcHRDU3RhdGUgKnNzID0gJnJzYy0+bVNjcmlwdEM7Ci0gICAgc3MtPm1JbnZva2FibGVOYW1lc1tzbG90XSA9IG5hbWU7CisgICAgTE9HRSgicnNpX1NjcmlwdFNldFR5cGUiKTsKIH0KIAogdm9pZCByc2lfU2NyaXB0SW52b2tlKENvbnRleHQgKnJzYywgUnNTY3JpcHQgdnMsIHVpbnQzMl90IHNsb3QpCiB7CiAgICAgU2NyaXB0ICpzID0gc3RhdGljX2Nhc3Q8U2NyaXB0ICo+KHZzKTsKLSAgICBpZiAocy0+bUVudmlyb21lbnQubUludm9rYWJsZXNbc2xvdF0gPT0gTlVMTCkgewotICAgICAgICByc2MtPnNldEVycm9yKFJTX0VSUk9SX0JBRF9TQ1JJUFQsICJDYWxsaW5nIGludm9rZSBvbiBiYWQgc2NyaXB0Iik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgcy0+c2V0dXBTY3JpcHQoKTsKLSAgICBzLT5tRW52aXJvbWVudC5tSW52b2thYmxlc1tzbG90XSgpOworICAgIHMtPkludm9rZShyc2MsIHNsb3QsIE5VTEwsIDApOwogfQogCiAKLXZvaWQgcnNpX1NjcmlwdFNldFJvb3QoQ29udGV4dCAqIHJzYywgYm9vbCBpc1Jvb3QpCit2b2lkIHJzaV9TY3JpcHRJbnZva2VEYXRhKENvbnRleHQgKnJzYywgUnNTY3JpcHQgdnMsIHVpbnQzMl90IHNsb3QsIHZvaWQgKmRhdGEpCiB7Ci0gICAgU2NyaXB0Q1N0YXRlICpzcyA9ICZyc2MtPm1TY3JpcHRDOwotICAgIHNzLT5tU2NyaXB0LT5tRW52aXJvbWVudC5tSXNSb290ID0gaXNSb290OworICAgIFNjcmlwdCAqcyA9IHN0YXRpY19jYXN0PFNjcmlwdCAqPih2cyk7CisgICAgcy0+SW52b2tlKHJzYywgc2xvdCwgTlVMTCwgMCk7Cit9CisKK3ZvaWQgcnNpX1NjcmlwdEludm9rZVYoQ29udGV4dCAqcnNjLCBSc1NjcmlwdCB2cywgdWludDMyX3Qgc2xvdCwgY29uc3Qgdm9pZCAqZGF0YSwgdWludDMyX3QgbGVuKQoreworICAgIFNjcmlwdCAqcyA9IHN0YXRpY19jYXN0PFNjcmlwdCAqPih2cyk7CisgICAgcy0+SW52b2tlKHJzYywgc2xvdCwgZGF0YSwgbGVuKTsKK30KKwordm9pZCByc2lfU2NyaXB0U2V0VmFySShDb250ZXh0ICpyc2MsIFJzU2NyaXB0IHZzLCB1aW50MzJfdCBzbG90LCBpbnQgdmFsdWUpCit7CisgICAgU2NyaXB0ICpzID0gc3RhdGljX2Nhc3Q8U2NyaXB0ICo+KHZzKTsKKyAgICBzLT5zZXRWYXIoc2xvdCwgJnZhbHVlLCBzaXplb2YodmFsdWUpKTsKK30KKwordm9pZCByc2lfU2NyaXB0U2V0VmFyRihDb250ZXh0ICpyc2MsIFJzU2NyaXB0IHZzLCB1aW50MzJfdCBzbG90LCBmbG9hdCB2YWx1ZSkKK3sKKyAgICBTY3JpcHQgKnMgPSBzdGF0aWNfY2FzdDxTY3JpcHQgKj4odnMpOworICAgIHMtPnNldFZhcihzbG90LCAmdmFsdWUsIHNpemVvZih2YWx1ZSkpOworfQorCit2b2lkIHJzaV9TY3JpcHRTZXRWYXJWKENvbnRleHQgKnJzYywgUnNTY3JpcHQgdnMsIHVpbnQzMl90IHNsb3QsIGNvbnN0IHZvaWQgKmRhdGEsIHVpbnQzMl90IGxlbikKK3sKKyAgICBjb25zdCBmbG9hdCAqZnAgPSAoY29uc3QgZmxvYXQgKilkYXRhOworICAgIFNjcmlwdCAqcyA9IHN0YXRpY19jYXN0PFNjcmlwdCAqPih2cyk7CisgICAgcy0+c2V0VmFyKHNsb3QsIGRhdGEsIGxlbik7CiB9CiAKIApkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc1NjcmlwdC5oIGIvbGlicy9ycy9yc1NjcmlwdC5oCmluZGV4IDVmNGE1MzYuLmVhNmFlYzUgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNTY3JpcHQuaAorKysgYi9saWJzL3JzL3JzU2NyaXB0LmgKQEAgLTI3LDkgKzI3LDkgQEAKIGNsYXNzIFByb2dyYW1WZXJ0ZXg7CiBjbGFzcyBQcm9ncmFtRnJhZ21lbnQ7CiBjbGFzcyBQcm9ncmFtUmFzdGVyOwotY2xhc3MgUHJvZ3JhbUZyYWdtZW50U3RvcmU7CitjbGFzcyBQcm9ncmFtU3RvcmU7CiAKLSNkZWZpbmUgTUFYX1NDUklQVF9CQU5LUyAxNgorI2RlZmluZSBNQVhfU0NSSVBUX0JBTktTIDMyCiAKIGNsYXNzIFNjcmlwdCA6IHB1YmxpYyBPYmplY3RCYXNlCiB7CkBAIC0zOSwzOCArMzksMzggQEAKICAgICBTY3JpcHQoQ29udGV4dCAqKTsKICAgICB2aXJ0dWFsIH5TY3JpcHQoKTsKIAotCiAgICAgc3RydWN0IEVudmlyb21lbnRfdCB7Ci0gICAgICAgIGJvb2wgbUlzUm9vdDsKLSAgICAgICAgZmxvYXQgbUNsZWFyQ29sb3JbNF07Ci0gICAgICAgIGZsb2F0IG1DbGVhckRlcHRoOwotICAgICAgICB1aW50MzJfdCBtQ2xlYXJTdGVuY2lsOwotCiAgICAgICAgIHVpbnQzMl90IG1TdGFydFRpbWVNaWxsaXM7CiAgICAgICAgIGNvbnN0IGNoYXIqIG1UaW1lWm9uZTsKIAogICAgICAgICBPYmplY3RCYXNlUmVmPFByb2dyYW1WZXJ0ZXg+IG1WZXJ0ZXg7CiAgICAgICAgIE9iamVjdEJhc2VSZWY8UHJvZ3JhbUZyYWdtZW50PiBtRnJhZ21lbnQ7CiAgICAgICAgIE9iamVjdEJhc2VSZWY8UHJvZ3JhbVJhc3Rlcj4gbVJhc3RlcjsKLSAgICAgICAgT2JqZWN0QmFzZVJlZjxQcm9ncmFtRnJhZ21lbnRTdG9yZT4gbUZyYWdtZW50U3RvcmU7Ci0gICAgICAgIEludm9rZUZ1bmNfdCBtSW52b2thYmxlc1tNQVhfU0NSSVBUX0JBTktTXTsKKyAgICAgICAgT2JqZWN0QmFzZVJlZjxQcm9ncmFtU3RvcmU+IG1GcmFnbWVudFN0b3JlOworCisgICAgICAgIHVpbnQzMl90IG1JbnZva2VGdW5jdGlvbkNvdW50OworICAgICAgICBJbnZva2VGdW5jX3QgKm1JbnZva2VGdW5jdGlvbnM7CisgICAgICAgIHVpbnQzMl90IG1GaWVsZENvdW50OworICAgICAgICB2b2lkICoqIG1GaWVsZEFkZHJlc3M7CisKICAgICAgICAgY2hhciAqIG1TY3JpcHRUZXh0OwogICAgICAgICB1aW50MzJfdCBtU2NyaXB0VGV4dExlbmd0aDsKICAgICB9OwogICAgIEVudmlyb21lbnRfdCBtRW52aXJvbWVudDsKIAotICAgIHVpbnQzMl90IG1Db3Vuc3RhbnRCdWZmZXJDb3VudDsKLQotCiAgICAgT2JqZWN0QmFzZVJlZjxBbGxvY2F0aW9uPiBtU2xvdHNbTUFYX1NDUklQVF9CQU5LU107CiAgICAgT2JqZWN0QmFzZVJlZjxjb25zdCBUeXBlPiBtVHlwZXNbTUFYX1NDUklQVF9CQU5LU107Ci0gICAgU3RyaW5nOCBtU2xvdE5hbWVzW01BWF9TQ1JJUFRfQkFOS1NdOwogICAgIGJvb2wgbVNsb3RXcml0YWJsZVtNQVhfU0NSSVBUX0JBTktTXTsKIAorICAgIHZvaWQgc2V0VmFyKHVpbnQzMl90IHNsb3QsIGNvbnN0IHZvaWQgKnZhbCwgdWludDMyX3QgbGVuKTsKIAorICAgIHZpcnR1YWwgdm9pZCBydW5Gb3JFYWNoKENvbnRleHQgKnJzYywgY29uc3QgQWxsb2NhdGlvbiAqYWluLCBBbGxvY2F0aW9uICphb3V0KSA9IDA7CisgICAgdmlydHVhbCB2b2lkIHJ1bkZvckVhY2goQ29udGV4dCAqcnNjLCBjb25zdCBBbGxvY2F0aW9uICphaW4sIEFsbG9jYXRpb24gKmFvdXQsIHVpbnQzMl90IHhTdGFydCwgdWludDMyX3QgeEVuZCkgPSAwOworICAgIHZpcnR1YWwgdm9pZCBydW5Gb3JFYWNoKENvbnRleHQgKnJzYywgY29uc3QgQWxsb2NhdGlvbiAqYWluLCBBbGxvY2F0aW9uICphb3V0LCB1aW50MzJfdCB4U3RhcnQsIHVpbnQzMl90IHlTdGFydCwgdWludDMyX3QgeEVuZCwgdWludDMyX3QgeUVuZCkgPSAwOwogCi0gICAgdmlydHVhbCB2b2lkIHNldHVwU2NyaXB0KCkgPSAwOwotICAgIHZpcnR1YWwgdWludDMyX3QgcnVuKENvbnRleHQgKiwgdWludDMyX3QgbGF1bmNoSUQpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgSW52b2tlKENvbnRleHQgKnJzYywgdWludDMyX3Qgc2xvdCwgY29uc3Qgdm9pZCAqZGF0YSwgdWludDMyX3QgbGVuKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIHNldHVwU2NyaXB0KENvbnRleHQgKnJzYykgPSAwOworICAgIHZpcnR1YWwgdWludDMyX3QgcnVuKENvbnRleHQgKikgPSAwOwogfTsKIAogCmRpZmYgLS1naXQgYS9saWJzL3JzL3JzU2NyaXB0Qy5jcHAgYi9saWJzL3JzL3JzU2NyaXB0Qy5jcHAKaW5kZXggZjRkMjQ1MS4uOTc1YjcwNCAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc1NjcmlwdEMuY3BwCisrKyBiL2xpYnMvcnMvcnNTY3JpcHRDLmNwcApAQCAtMTcsOCArMTcsNyBAQAogI2luY2x1ZGUgInJzQ29udGV4dC5oIgogI2luY2x1ZGUgInJzU2NyaXB0Qy5oIgogI2luY2x1ZGUgInJzTWF0cml4LmgiCi0KLSNpbmNsdWRlICJhY2MvYWNjLmgiCisjaW5jbHVkZSAiLi4vLi4vLi4vZXh0ZXJuYWwvbGx2bS9saWJiY2MvaW5jbHVkZS9iY2MvYmNjLmgiCiAjaW5jbHVkZSAidXRpbHMvVGltZXJzLmgiCiAKICNpbmNsdWRlIDxHTEVTL2dsLmg+CkBAIC0zNyw0MCArMzYsNzQgQEAKIHsKICAgICBtQWxsb2NGaWxlID0gX19GSUxFX187CiAgICAgbUFsbG9jTGluZSA9IF9fTElORV9fOwotICAgIG1BY2NTY3JpcHQgPSBOVUxMOworICAgIG1CY2NTY3JpcHQgPSBOVUxMOwogICAgIG1lbXNldCgmbVByb2dyYW0sIDAsIHNpemVvZihtUHJvZ3JhbSkpOwogfQogCiBTY3JpcHRDOjp+U2NyaXB0QygpCiB7Ci0gICAgaWYgKG1BY2NTY3JpcHQpIHsKLSAgICAgICAgYWNjRGVsZXRlU2NyaXB0KG1BY2NTY3JpcHQpOworICAgIGlmIChtQmNjU2NyaXB0KSB7CisgICAgICAgIGJjY0RlbGV0ZVNjcmlwdChtQmNjU2NyaXB0KTsKICAgICB9CiAgICAgZnJlZShtRW52aXJvbWVudC5tU2NyaXB0VGV4dCk7CiAgICAgbUVudmlyb21lbnQubVNjcmlwdFRleHQgPSBOVUxMOwogfQogCi12b2lkIFNjcmlwdEM6OnNldHVwU2NyaXB0KCkKK3ZvaWQgU2NyaXB0Qzo6c2V0dXBTY3JpcHQoQ29udGV4dCAqcnNjKQogewotICAgIGZvciAoaW50IGN0PTA7IGN0IDwgTUFYX1NDUklQVF9CQU5LUzsgY3QrKykgewotICAgICAgICBpZiAobVByb2dyYW0ubVNsb3RQb2ludGVyc1tjdF0pIHsKLSAgICAgICAgICAgICptUHJvZ3JhbS5tU2xvdFBvaW50ZXJzW2N0XSA9IG1TbG90c1tjdF0tPmdldFB0cigpOworICAgIHNldHVwR0xTdGF0ZShyc2MpOworICAgIG1FbnZpcm9tZW50Lm1TdGFydFRpbWVNaWxsaXMKKyAgICAgICAgICAgICAgICA9IG5hbm9zZWNvbmRzX3RvX21pbGxpc2Vjb25kcyhzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQykpOworCisgICAgZm9yICh1aW50MzJfdCBjdD0wOyBjdCA8IG1FbnZpcm9tZW50Lm1GaWVsZENvdW50OyBjdCsrKSB7CisgICAgICAgIGlmICghbVNsb3RzW2N0XS5nZXQoKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB2b2lkICpwdHIgPSBtU2xvdHNbY3RdLT5nZXRQdHIoKTsKKyAgICAgICAgdm9pZCAqKmRlc3QgPSAoKHZvaWQgKioqKW1FbnZpcm9tZW50Lm1GaWVsZEFkZHJlc3MpW2N0XTsKKyAgICAgICAgLy9MT0dFKCJzZXR1cFNjcmlwdCAlaSAlcCA9ICVwICAgICVwICVpIiwgY3QsIGRlc3QsIHB0ciwgbVNsb3RzW2N0XS0+Z2V0VHlwZSgpLCBtU2xvdHNbY3RdLT5nZXRUeXBlKCktPmdldERpbVgoKSk7CisKKyAgICAgICAgLy9jb25zdCB1aW50MzJfdCAqcDMyID0gKGNvbnN0IHVpbnQzMl90ICopcHRyOworICAgICAgICAvL2ZvciAodWludDMyX3QgY3QyPTA7IGN0MiA8IG1TbG90c1tjdF0tPmdldFR5cGUoKS0+Z2V0RGltWCgpOyBjdDIrKykgeworICAgICAgICAgICAgLy9MT0dFKCIgICVpID0gMHglMDh4ICIsIGN0MiwgcDMyW2N0Ml0pOworICAgICAgICAvL30KKworICAgICAgICBpZiAoZGVzdCkgeworICAgICAgICAgICAgKmRlc3QgPSBwdHI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMT0dFKCJTY3JpcHRDOjpzZXR1cFNjcmlwdCwgTlVMTCB2YXIgYmluZGluZyBhZGRyZXNzLiIpOwogICAgICAgICB9CiAgICAgfQogfQogCi0KLXVpbnQzMl90IFNjcmlwdEM6OnJ1bihDb250ZXh0ICpyc2MsIHVpbnQzMl90IGxhdW5jaEluZGV4KQorY29uc3QgQWxsb2NhdGlvbiAqU2NyaXB0Qzo6cHRyVG9BbGxvY2F0aW9uKGNvbnN0IHZvaWQgKnB0cikgY29uc3QKIHsKLSAgICBpZiAobVByb2dyYW0ubVNjcmlwdCA9PSBOVUxMKSB7Ci0gICAgICAgIHJzYy0+c2V0RXJyb3IoUlNfRVJST1JfQkFEX1NDUklQVCwgIkF0dGVtcHRlZCB0byBydW4gYmFkIHNjcmlwdCIpOwotICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoIXB0cikgeworICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CisgICAgZm9yICh1aW50MzJfdCBjdD0wOyBjdCA8IG1FbnZpcm9tZW50Lm1GaWVsZENvdW50OyBjdCsrKSB7CisgICAgICAgIGlmICghbVNsb3RzW2N0XS5nZXQoKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBpZiAobVNsb3RzW2N0XS0+Z2V0UHRyKCkgPT0gcHRyKSB7CisgICAgICAgICAgICByZXR1cm4gbVNsb3RzW2N0XS5nZXQoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBMT0dFKCJTY3JpcHRDOjpwdHJUb0FsbG9jYXRpb24sIGZhaWxlZCB0byBmaW5kICVwIiwgcHRyKTsKKyAgICByZXR1cm4gTlVMTDsKK30KIAotICAgIENvbnRleHQ6OlNjcmlwdFRMU1N0cnVjdCAqIHRscyA9Ci0gICAgKENvbnRleHQ6OlNjcmlwdFRMU1N0cnVjdCAqKXB0aHJlYWRfZ2V0c3BlY2lmaWMoQ29udGV4dDo6Z1RocmVhZFRMU0tleSk7CitTY3JpcHQgKiBTY3JpcHRDOjpzZXRUTFMoU2NyaXB0ICpzYykKK3sKKyAgICBDb250ZXh0OjpTY3JpcHRUTFNTdHJ1Y3QgKiB0bHMgPSAoQ29udGV4dDo6U2NyaXB0VExTU3RydWN0ICopCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRocmVhZF9nZXRzcGVjaWZpYyhDb250ZXh0OjpnVGhyZWFkVExTS2V5KTsKICAgICByc0Fzc2VydCh0bHMpOworICAgIFNjcmlwdCAqb2xkID0gdGxzLT5tU2NyaXB0OworICAgIHRscy0+bVNjcmlwdCA9IHNjOworICAgIHJldHVybiBvbGQ7Cit9CiAKKwordm9pZCBTY3JpcHRDOjpzZXR1cEdMU3RhdGUoQ29udGV4dCAqcnNjKQorewogICAgIGlmIChtRW52aXJvbWVudC5tRnJhZ21lbnRTdG9yZS5nZXQoKSkgewogICAgICAgICByc2MtPnNldEZyYWdtZW50U3RvcmUobUVudmlyb21lbnQubUZyYWdtZW50U3RvcmUuZ2V0KCkpOwogICAgIH0KQEAgLTgzLDIwICsxMTYsOTIgQEAKICAgICBpZiAobUVudmlyb21lbnQubVJhc3Rlci5nZXQoKSkgewogICAgICAgICByc2MtPnNldFJhc3RlcihtRW52aXJvbWVudC5tUmFzdGVyLmdldCgpKTsKICAgICB9Cit9CiAKLSAgICBpZiAobGF1bmNoSW5kZXggPT0gMCkgewotICAgICAgICBtRW52aXJvbWVudC5tU3RhcnRUaW1lTWlsbGlzCi0gICAgICAgICAgICAgICAgPSBuYW5vc2Vjb25kc190b19taWxsaXNlY29uZHMoc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpKTsKK3VpbnQzMl90IFNjcmlwdEM6OnJ1bihDb250ZXh0ICpyc2MpCit7CisgICAgaWYgKG1Qcm9ncmFtLm1Sb290ID09IE5VTEwpIHsKKyAgICAgICAgcnNjLT5zZXRFcnJvcihSU19FUlJPUl9CQURfU0NSSVBULCAiQXR0ZW1wdGVkIHRvIHJ1biBiYWQgc2NyaXB0Iik7CisgICAgICAgIHJldHVybiAwOwogICAgIH0KLSAgICBzZXR1cFNjcmlwdCgpOworCisgICAgc2V0dXBTY3JpcHQocnNjKTsKIAogICAgIHVpbnQzMl90IHJldCA9IDA7Ci0gICAgdGxzLT5tU2NyaXB0ID0gdGhpczsKLSAgICByZXQgPSBtUHJvZ3JhbS5tU2NyaXB0KGxhdW5jaEluZGV4KTsKLSAgICB0bHMtPm1TY3JpcHQgPSBOVUxMOworICAgIFNjcmlwdCAqIG9sZFRMUyA9IHNldFRMUyh0aGlzKTsKKyAgICAvL0xPR0UoIlNjcmlwdEM6OnJ1biAlcCIsIG1Qcm9ncmFtLm1Sb290KTsKKyAgICByZXQgPSBtUHJvZ3JhbS5tUm9vdCgpOworICAgIHNldFRMUyhvbGRUTFMpOworICAgIC8vTE9HRSgiU2NyaXB0Qzo6cnVuIHJldCAlaSIsIHJldCk7CiAgICAgcmV0dXJuIHJldDsKIH0KIAordm9pZCBTY3JpcHRDOjpydW5Gb3JFYWNoKENvbnRleHQgKnJzYywgY29uc3QgQWxsb2NhdGlvbiAqYWluLCBBbGxvY2F0aW9uICphb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHhTdGFydCwgdWludDMyX3QgeVN0YXJ0LCB1aW50MzJfdCB4RW5kLCB1aW50MzJfdCB5RW5kKQoreworICAgIExPR0UoIlNjcmlwdEM6OnJ1bkZvckVhY2ggbm90IGltcGxlbWVudGVkIik7Cit9CisKK3ZvaWQgU2NyaXB0Qzo6cnVuRm9yRWFjaChDb250ZXh0ICpyc2MsIGNvbnN0IEFsbG9jYXRpb24gKmFpbiwgQWxsb2NhdGlvbiAqYW91dCwgdWludDMyX3QgeFN0YXJ0LCB1aW50MzJfdCB4RW5kKQoreworICAgIHVpbnQzMl90IGRpbVggPSBhaW4tPmdldFR5cGUoKS0+Z2V0RGltWCgpOworICAgIHJzQXNzZXJ0KHhTdGFydCA8IGRpbVgpOworICAgIHJzQXNzZXJ0KHhFbmQgPD0gZGltWCk7CisgICAgcnNBc3NlcnQoYWluLT5nZXRUeXBlKCktPmdldERpbVkoKSA9PSAwKTsKKyAgICByc0Fzc2VydChhaW4tPmdldFR5cGUoKS0+Z2V0RGltWigpID09IDApOworCisgICAgaWYgKHhTdGFydCA+PSBkaW1YKSB4U3RhcnQgPSBkaW1YIC0gMTsKKyAgICBpZiAoeEVuZCA+PSBkaW1YKSB4RW5kID0gZGltWCAtIDE7CisgICAgaWYgKHhTdGFydCA+IHhFbmQpIHJldHVybjsKKworICAgIHNldHVwU2NyaXB0KHJzYyk7CisgICAgU2NyaXB0ICogb2xkVExTID0gc2V0VExTKHRoaXMpOworCisgICAgdHlwZWRlZiBpbnQgKCpyc190KShjb25zdCB2b2lkICosIHZvaWQgKiwgdWludDMyX3QpOworICAgIGNvbnN0IHVpbnQ4X3QgKnB0ckluID0gKGNvbnN0IHVpbnQ4X3QgKilhaW4tPmdldFB0cigpOworICAgIHVpbnQzMl90IHN0cmlkZUluID0gYWluLT5nZXRUeXBlKCktPmdldEVsZW1lbnRTaXplQnl0ZXMoKTsKKworICAgIHVpbnQ4X3QgKnB0ck91dCA9IE5VTEw7CisgICAgdWludDMyX3Qgc3RyaWRlT3V0ID0gMDsKKyAgICBpZiAoYW91dCkgeworICAgICAgICBwdHJPdXQgPSAodWludDhfdCAqKWFvdXQtPmdldFB0cigpOworICAgICAgICBzdHJpZGVPdXQgPSBhb3V0LT5nZXRUeXBlKCktPmdldEVsZW1lbnRTaXplQnl0ZXMoKTsKKyAgICB9CisKKyAgICBmb3IgKHVpbnQzMl90IGN0PXhTdGFydDsgY3QgPCB4RW5kOyBjdCsrKSB7CisgICAgICAgICgocnNfdCltUHJvZ3JhbS5tUm9vdCkgKHB0ckluICsgKHN0cmlkZUluICogY3QpLCBwdHJPdXQgKyAoc3RyaWRlT3V0ICogY3QpLCBjdCk7CisgICAgfQorCisgICAgc2V0VExTKG9sZFRMUyk7Cit9CisKK3ZvaWQgU2NyaXB0Qzo6cnVuRm9yRWFjaChDb250ZXh0ICpyc2MsIGNvbnN0IEFsbG9jYXRpb24gKmFpbiwgQWxsb2NhdGlvbiAqYW91dCkKK3sKKyAgICBpZiAoYWluLT5nZXRUeXBlKCktPmdldERpbVkoKSkgeworICAgICAgICBydW5Gb3JFYWNoKHJzYywgYWluLCBhb3V0LCAwLCAwLCAweGZmZmZmZmZmLCAweGZmZmZmZmZmKTsKKyAgICB9IGVsc2UgeworICAgICAgICBydW5Gb3JFYWNoKHJzYywgYWluLCBhb3V0LCAwLCAweGZmZmZmZmZmKTsKKyAgICB9Cit9CisKKwordm9pZCBTY3JpcHRDOjpJbnZva2UoQ29udGV4dCAqcnNjLCB1aW50MzJfdCBzbG90LCBjb25zdCB2b2lkICpkYXRhLCB1aW50MzJfdCBsZW4pCit7CisgICAgLy9MT0dFKCJyc2lfU2NyaXB0SW52b2tlICVpIiwgc2xvdCk7CisgICAgaWYgKChzbG90ID49IG1FbnZpcm9tZW50Lm1JbnZva2VGdW5jdGlvbkNvdW50KSB8fAorICAgICAgICAobUVudmlyb21lbnQubUludm9rZUZ1bmN0aW9uc1tzbG90XSA9PSBOVUxMKSkgeworICAgICAgICByc2MtPnNldEVycm9yKFJTX0VSUk9SX0JBRF9TQ1JJUFQsICJDYWxsaW5nIGludm9rZSBvbiBiYWQgc2NyaXB0Iik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc2V0dXBTY3JpcHQocnNjKTsKKyAgICBTY3JpcHQgKiBvbGRUTFMgPSBzZXRUTFModGhpcyk7CisKKyAgICAoKHZvaWQgKCopKGNvbnN0IHZvaWQgKiwgdWludDMyX3QpKQorICAgICAgICBtRW52aXJvbWVudC5tSW52b2tlRnVuY3Rpb25zW3Nsb3RdKShkYXRhLCBsZW4pOworCisgICAgc2V0VExTKG9sZFRMUyk7Cit9CisKIFNjcmlwdENTdGF0ZTo6U2NyaXB0Q1N0YXRlKCkKIHsKICAgICBtU2NyaXB0ID0gTlVMTDsKQEAgLTExMywyMSArMjE4LDI1IEBACiB7CiAgICAgZm9yICh1aW50MzJfdCBjdD0wOyBjdCA8IE1BWF9TQ1JJUFRfQkFOS1M7IGN0KyspIHsKICAgICAgICAgbUNvbnN0YW50QnVmZmVyVHlwZXNbY3RdLmNsZWFyKCk7Ci0gICAgICAgIG1TbG90TmFtZXNbY3RdLnNldFRvKCIiKTsKLSAgICAgICAgbUludm9rYWJsZU5hbWVzW2N0XS5zZXRUbygiIik7CiAgICAgICAgIG1TbG90V3JpdGFibGVbY3RdID0gZmFsc2U7CiAgICAgfQogCiAgICAgZGVsZXRlIG1TY3JpcHQ7CiAgICAgbVNjcmlwdCA9IG5ldyBTY3JpcHRDKE5VTEwpOwotCi0gICAgbUludDMyRGVmaW5lcy5jbGVhcigpOwotICAgIG1GbG9hdERlZmluZXMuY2xlYXIoKTsKIH0KIAotc3RhdGljIEFDQ3ZvaWQqIHN5bWJvbExvb2t1cChBQ0N2b2lkKiBwQ29udGV4dCwgY29uc3QgQUNDY2hhciogbmFtZSkKK3N0YXRpYyBCQ0N2b2lkKiBzeW1ib2xMb29rdXAoQkNDdm9pZCogcENvbnRleHQsIGNvbnN0IEJDQ2NoYXIqIG5hbWUpCiB7Ci0gICAgY29uc3QgU2NyaXB0Q1N0YXRlOjpTeW1ib2xUYWJsZV90ICpzeW0gPSBTY3JpcHRDU3RhdGU6Omxvb2t1cFN5bWJvbChuYW1lKTsKKyAgICBjb25zdCBTY3JpcHRDU3RhdGU6OlN5bWJvbFRhYmxlX3QgKnN5bTsKKyAgICBzeW0gPSBTY3JpcHRDU3RhdGU6Omxvb2t1cFN5bWJvbChuYW1lKTsKKyAgICBpZiAoc3ltKSB7CisgICAgICAgIHJldHVybiBzeW0tPm1QdHI7CisgICAgfQorICAgIHN5bSA9IFNjcmlwdENTdGF0ZTo6bG9va3VwU3ltYm9sQ0wobmFtZSk7CisgICAgaWYgKHN5bSkgeworICAgICAgICByZXR1cm4gc3ltLT5tUHRyOworICAgIH0KKyAgICBzeW0gPSBTY3JpcHRDU3RhdGU6Omxvb2t1cFN5bWJvbEdMKG5hbWUpOwogICAgIGlmIChzeW0pIHsKICAgICAgICAgcmV0dXJuIHN5bS0+bVB0cjsKICAgICB9CkBAIC0xMzcsNjUgKzI0Niw2MCBAQAogCiB2b2lkIFNjcmlwdENTdGF0ZTo6cnVuQ29tcGlsZXIoQ29udGV4dCAqcnNjLCBTY3JpcHRDICpzKQogewotICAgIHMtPm1BY2NTY3JpcHQgPSBhY2NDcmVhdGVTY3JpcHQoKTsKLSAgICBTdHJpbmc4IHRtcDsKKyAgICBMT0dFKCJTY3JpcHRDU3RhdGU6OnJ1bkNvbXBpbGVyICIpOwogCi0gICAgcnNjLT5hcHBlbmROYW1lRGVmaW5lcygmdG1wKTsKLSAgICBhcHBlbmREZWNscygmdG1wKTsKLSAgICBhcHBlbmRWYXJEZWZpbmVzKHJzYywgJnRtcCk7Ci0gICAgYXBwZW5kVHlwZXMocnNjLCAmdG1wKTsKLSAgICB0bXAuYXBwZW5kKCIjbGluZSAxXG4iKTsKLQotICAgIGNvbnN0IGNoYXIqIHNjcmlwdFNvdXJjZVtdID0ge3RtcC5zdHJpbmcoKSwgcy0+bUVudmlyb21lbnQubVNjcmlwdFRleHR9OwotICAgIGludCBzY3JpcHRMZW5ndGhbXSA9IHt0bXAubGVuZ3RoKCksIHMtPm1FbnZpcm9tZW50Lm1TY3JpcHRUZXh0TGVuZ3RofSA7Ci0gICAgYWNjU2NyaXB0U291cmNlKHMtPm1BY2NTY3JpcHQsIHNpemVvZihzY3JpcHRMZW5ndGgpIC8gc2l6ZW9mKGludCksIHNjcmlwdFNvdXJjZSwgc2NyaXB0TGVuZ3RoKTsKLSAgICBhY2NSZWdpc3RlclN5bWJvbENhbGxiYWNrKHMtPm1BY2NTY3JpcHQsIHN5bWJvbExvb2t1cCwgTlVMTCk7Ci0gICAgYWNjQ29tcGlsZVNjcmlwdChzLT5tQWNjU2NyaXB0KTsKLSAgICBhY2NHZXRTY3JpcHRMYWJlbChzLT5tQWNjU2NyaXB0LCAibWFpbiIsIChBQ0N2b2lkKiopICZzLT5tUHJvZ3JhbS5tU2NyaXB0KTsKLSAgICBhY2NHZXRTY3JpcHRMYWJlbChzLT5tQWNjU2NyaXB0LCAiaW5pdCIsIChBQ0N2b2lkKiopICZzLT5tUHJvZ3JhbS5tSW5pdCk7Ci0gICAgcnNBc3NlcnQocy0+bVByb2dyYW0ubVNjcmlwdCk7Ci0KLSAgICBpZiAoIXMtPm1Qcm9ncmFtLm1TY3JpcHQpIHsKLSAgICAgICAgQUNDY2hhciBidWZbNDA5Nl07Ci0gICAgICAgIEFDQ3NpemVpIGxlbjsKLSAgICAgICAgYWNjR2V0U2NyaXB0SW5mb0xvZyhzLT5tQWNjU2NyaXB0LCBzaXplb2YoYnVmKSwgJmxlbiwgYnVmKTsKLSAgICAgICAgTE9HRSgiJXMiLCBidWYpOwotICAgICAgICByc2MtPnNldEVycm9yKFJTX0VSUk9SX0JBRF9TQ1JJUFQsICJFcnJvciBjb21waWxpbmcgdXNlciBzY3JpcHQuIik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9CisgICAgcy0+bUJjY1NjcmlwdCA9IGJjY0NyZWF0ZVNjcmlwdCgpOworICAgIGJjY1NjcmlwdEJpdGNvZGUocy0+bUJjY1NjcmlwdCwgcy0+bUVudmlyb21lbnQubVNjcmlwdFRleHQsIHMtPm1FbnZpcm9tZW50Lm1TY3JpcHRUZXh0TGVuZ3RoKTsKKyAgICBiY2NSZWdpc3RlclN5bWJvbENhbGxiYWNrKHMtPm1CY2NTY3JpcHQsIHN5bWJvbExvb2t1cCwgTlVMTCk7CisgICAgYmNjQ29tcGlsZVNjcmlwdChzLT5tQmNjU2NyaXB0KTsKKyAgICBiY2NHZXRTY3JpcHRMYWJlbChzLT5tQmNjU2NyaXB0LCAicm9vdCIsIChCQ0N2b2lkKiopICZzLT5tUHJvZ3JhbS5tUm9vdCk7CisgICAgYmNjR2V0U2NyaXB0TGFiZWwocy0+bUJjY1NjcmlwdCwgImluaXQiLCAoQkNDdm9pZCoqKSAmcy0+bVByb2dyYW0ubUluaXQpOworICAgIExPR0UoInJvb3QgJXAsICBpbml0ICVwIiwgcy0+bVByb2dyYW0ubVJvb3QsIHMtPm1Qcm9ncmFtLm1Jbml0KTsKIAogICAgIGlmIChzLT5tUHJvZ3JhbS5tSW5pdCkgewogICAgICAgICBzLT5tUHJvZ3JhbS5tSW5pdCgpOwogICAgIH0KIAotICAgIGZvciAoaW50IGN0PTA7IGN0IDwgTUFYX1NDUklQVF9CQU5LUzsgY3QrKykgewotICAgICAgICBpZiAobVNsb3ROYW1lc1tjdF0ubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICBhY2NHZXRTY3JpcHRMYWJlbChzLT5tQWNjU2NyaXB0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNsb3ROYW1lc1tjdF0uc3RyaW5nKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQUNDdm9pZCoqKSAmcy0+bVByb2dyYW0ubVNsb3RQb2ludGVyc1tjdF0pOwotICAgICAgICB9CisgICAgYmNjR2V0RXhwb3J0RnVuY3Mocy0+bUJjY1NjcmlwdCwgKEJDQ3NpemVpKikgJnMtPm1FbnZpcm9tZW50Lm1JbnZva2VGdW5jdGlvbkNvdW50LCAwLCBOVUxMKTsKKyAgICBpZihzLT5tRW52aXJvbWVudC5tSW52b2tlRnVuY3Rpb25Db3VudCA8PSAwKQorICAgICAgICBzLT5tRW52aXJvbWVudC5tSW52b2tlRnVuY3Rpb25zID0gTlVMTDsKKyAgICBlbHNlIHsKKyAgICAgICAgcy0+bUVudmlyb21lbnQubUludm9rZUZ1bmN0aW9ucyA9IChTY3JpcHQ6Okludm9rZUZ1bmNfdCopIGNhbGxvYyhzLT5tRW52aXJvbWVudC5tSW52b2tlRnVuY3Rpb25Db3VudCwgc2l6ZW9mKFNjcmlwdDo6SW52b2tlRnVuY190KSk7CisgICAgICAgIGJjY0dldEV4cG9ydEZ1bmNzKHMtPm1CY2NTY3JpcHQsIE5VTEwsIHMtPm1FbnZpcm9tZW50Lm1JbnZva2VGdW5jdGlvbkNvdW50LCAoQkNDdm9pZCAqKikgcy0+bUVudmlyb21lbnQubUludm9rZUZ1bmN0aW9ucyk7CiAgICAgfQogCi0gICAgZm9yIChpbnQgY3Q9MDsgY3QgPCBNQVhfU0NSSVBUX0JBTktTOyBjdCsrKSB7Ci0gICAgICAgIGlmIChtSW52b2thYmxlTmFtZXNbY3RdLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgYWNjR2V0U2NyaXB0TGFiZWwocy0+bUFjY1NjcmlwdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1JbnZva2FibGVOYW1lc1tjdF0uc3RyaW5nKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQUNDdm9pZCoqKSAmcy0+bUVudmlyb21lbnQubUludm9rYWJsZXNbY3RdKTsKLSAgICAgICAgfQorLy8gICAgcy0+bUVudmlyb21lbnQubUludm9rZUZ1bmN0aW9ucyA9IChTY3JpcHQ6Okludm9rZUZ1bmNfdCAqKWNhbGxvYygxMDAsIHNpemVvZih2b2lkICopKTsKKy8vICAgIEJDQ2NoYXIgKipsYWJlbHMgPSBuZXcgY2hhcipbMTAwXTsKKy8vICAgIGJjY0dldEZ1bmN0aW9ucyhzLT5tQmNjU2NyaXB0LCAoQkNDc2l6ZWkgKikmcy0+bUVudmlyb21lbnQubUludm9rZUZ1bmN0aW9uQ291bnQsCisvLyAgICAgICAgICAgICAgICAgICAgMTAwLCAoQkNDY2hhciAqKilsYWJlbHMpOworICAgIC8vTE9HRSgiZnVuYyBjb3VudCAlaSIsIHMtPm1FbnZpcm9tZW50Lm1JbnZva2VGdW5jdGlvbkNvdW50KTsKKy8vICAgIGZvciAodWludDMyX3QgaT0wOyBpIDwgcy0+bUVudmlyb21lbnQubUludm9rZUZ1bmN0aW9uQ291bnQ7IGkrKykgeworLy8gICAgICAgIEJDQ3NpemVpIGxlbmd0aDsKKy8vICAgICAgICBiY2NHZXRGdW5jdGlvbkJpbmFyeShzLT5tQmNjU2NyaXB0LCBsYWJlbHNbaV0sIChCQ0N2b2lkICoqKSYocy0+bUVudmlyb21lbnQubUludm9rZUZ1bmN0aW9uc1tpXSksICZsZW5ndGgpOworICAgICAgICAvL0xPR0UoImZ1bmMgJWkgJXAiLCBpLCBzLT5tRW52aXJvbWVudC5tSW52b2tlRnVuY3Rpb25zW2ldKTsKKyAgLy8gIH0KKworICAgIHMtPm1FbnZpcm9tZW50Lm1GaWVsZEFkZHJlc3MgPSAodm9pZCAqKiljYWxsb2MoMTAwLCBzaXplb2Yodm9pZCAqKSk7CisgICAgYmNjR2V0RXhwb3J0VmFycyhzLT5tQmNjU2NyaXB0LCAoQkNDc2l6ZWkgKikmcy0+bUVudmlyb21lbnQubUZpZWxkQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAxMDAsIHMtPm1FbnZpcm9tZW50Lm1GaWVsZEFkZHJlc3MpOworICAgIC8vTE9HRSgidmFyIGNvdW50ICVpIiwgcy0+bUVudmlyb21lbnQubUZpZWxkQ291bnQpOworICAgIGZvciAodWludDMyX3QgaT0wOyBpIDwgcy0+bUVudmlyb21lbnQubUZpZWxkQ291bnQ7IGkrKykgeworICAgICAgICAvL0xPR0UoInZhciAlaSAlcCIsIGksIHMtPm1FbnZpcm9tZW50Lm1GaWVsZEFkZHJlc3NbaV0pOwogICAgIH0KIAogICAgIHMtPm1FbnZpcm9tZW50Lm1GcmFnbWVudC5zZXQocnNjLT5nZXREZWZhdWx0UHJvZ3JhbUZyYWdtZW50KCkpOwogICAgIHMtPm1FbnZpcm9tZW50Lm1WZXJ0ZXguc2V0KHJzYy0+Z2V0RGVmYXVsdFByb2dyYW1WZXJ0ZXgoKSk7Ci0gICAgcy0+bUVudmlyb21lbnQubUZyYWdtZW50U3RvcmUuc2V0KHJzYy0+Z2V0RGVmYXVsdFByb2dyYW1GcmFnbWVudFN0b3JlKCkpOworICAgIHMtPm1FbnZpcm9tZW50Lm1GcmFnbWVudFN0b3JlLnNldChyc2MtPmdldERlZmF1bHRQcm9ncmFtU3RvcmUoKSk7CiAgICAgcy0+bUVudmlyb21lbnQubVJhc3Rlci5zZXQocnNjLT5nZXREZWZhdWx0UHJvZ3JhbVJhc3RlcigpKTsKIAotICAgIGlmIChzLT5tUHJvZ3JhbS5tU2NyaXB0KSB7CisgICAgaWYgKHMtPm1Qcm9ncmFtLm1Sb290KSB7CiAgICAgICAgIGNvbnN0IHN0YXRpYyBpbnQgcHJhZ21hTWF4ID0gMTY7Ci0gICAgICAgIEFDQ3NpemVpIHByYWdtYUNvdW50OwotICAgICAgICBBQ0NjaGFyICogc3RyW3ByYWdtYU1heF07Ci0gICAgICAgIGFjY0dldFByYWdtYXMocy0+bUFjY1NjcmlwdCwgJnByYWdtYUNvdW50LCBwcmFnbWFNYXgsICZzdHJbMF0pOworICAgICAgICBCQ0NzaXplaSBwcmFnbWFDb3VudDsKKyAgICAgICAgQkNDY2hhciAqIHN0cltwcmFnbWFNYXhdOworICAgICAgICBiY2NHZXRQcmFnbWFzKHMtPm1CY2NTY3JpcHQsICZwcmFnbWFDb3VudCwgcHJhZ21hTWF4LCAmc3RyWzBdKTsKIAogICAgICAgICBmb3IgKGludCBjdD0wOyBjdCA8IHByYWdtYUNvdW50OyBjdCs9MikgeworICAgICAgICAgICAgLy9MT0dFKCJwcmFnbWUgJXMgJXMiLCBzdHJbY3RdLCBzdHJbY3QrMV0pOwogICAgICAgICAgICAgaWYgKCFzdHJjbXAoc3RyW2N0XSwgInZlcnNpb24iKSkgewogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQpAQCAtMjA4LDExICszMTIsNiBAQAogICAgICAgICAgICAgICAgICAgICBzLT5tRW52aXJvbWVudC5tVmVydGV4LmNsZWFyKCk7CiAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBQcm9ncmFtVmVydGV4ICogcHYgPSAoUHJvZ3JhbVZlcnRleCAqKXJzYy0+bG9va3VwTmFtZShzdHJbY3QrMV0pOwotICAgICAgICAgICAgICAgIGlmIChwdiAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIHMtPm1FbnZpcm9tZW50Lm1WZXJ0ZXguc2V0KHB2KTsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIExPR0UoIlVucmVjb25pemVkIHZhbHVlICVzIHBhc3NlZCB0byBzdGF0ZVZlcnRleCIsIHN0cltjdCsxXSk7CiAgICAgICAgICAgICB9CiAKQEAgLTIyNCwxMSArMzIzLDYgQEAKICAgICAgICAgICAgICAgICAgICAgcy0+bUVudmlyb21lbnQubVJhc3Rlci5jbGVhcigpOwogICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgUHJvZ3JhbVJhc3RlciAqIHByID0gKFByb2dyYW1SYXN0ZXIgKilyc2MtPmxvb2t1cE5hbWUoc3RyW2N0KzFdKTsKLSAgICAgICAgICAgICAgICBpZiAocHIgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBzLT5tRW52aXJvbWVudC5tUmFzdGVyLnNldChwcik7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBMT0dFKCJVbnJlY29uaXplZCB2YWx1ZSAlcyBwYXNzZWQgdG8gc3RhdGVSYXN0ZXIiLCBzdHJbY3QrMV0pOwogICAgICAgICAgICAgfQogCkBAIC0yNDAsMTEgKzMzNCw2IEBACiAgICAgICAgICAgICAgICAgICAgIHMtPm1FbnZpcm9tZW50Lm1GcmFnbWVudC5jbGVhcigpOwogICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgUHJvZ3JhbUZyYWdtZW50ICogcGYgPSAoUHJvZ3JhbUZyYWdtZW50ICopcnNjLT5sb29rdXBOYW1lKHN0cltjdCsxXSk7Ci0gICAgICAgICAgICAgICAgaWYgKHBmICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgcy0+bUVudmlyb21lbnQubUZyYWdtZW50LnNldChwZik7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBMT0dFKCJVbnJlY29uaXplZCB2YWx1ZSAlcyBwYXNzZWQgdG8gc3RhdGVGcmFnbWVudCIsIHN0cltjdCsxXSk7CiAgICAgICAgICAgICB9CiAKQEAgLTI1NiwxMiArMzQ1LDYgQEAKICAgICAgICAgICAgICAgICAgICAgcy0+bUVudmlyb21lbnQubUZyYWdtZW50U3RvcmUuY2xlYXIoKTsKICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFByb2dyYW1GcmFnbWVudFN0b3JlICogcGZzID0KLSAgICAgICAgICAgICAgICAgICAgKFByb2dyYW1GcmFnbWVudFN0b3JlICopcnNjLT5sb29rdXBOYW1lKHN0cltjdCsxXSk7Ci0gICAgICAgICAgICAgICAgaWYgKHBmcyAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIHMtPm1FbnZpcm9tZW50Lm1GcmFnbWVudFN0b3JlLnNldChwZnMpOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgTE9HRSgiVW5yZWNvbml6ZWQgdmFsdWUgJXMgcGFzc2VkIHRvIHN0YXRlU3RvcmUiLCBzdHJbY3QrMV0pOwogICAgICAgICAgICAgfQogCkBAIC0yNzMsMTExICszNTYsNiBAQAogICAgIH0KIH0KIAotc3RhdGljIHZvaWQgYXBwZW5kRWxlbWVudEJvZHkoU3RyaW5nOCAqcywgY29uc3QgRWxlbWVudCAqZSkKLXsKLSAgICBzLT5hcHBlbmQoIiB7XG4iKTsKLSAgICBmb3IgKHNpemVfdCBjdDI9MDsgY3QyIDwgZS0+Z2V0RmllbGRDb3VudCgpOyBjdDIrKykgewotICAgICAgICBjb25zdCBFbGVtZW50ICpjID0gZS0+Z2V0RmllbGQoY3QyKTsKLSAgICAgICAgcy0+YXBwZW5kKCIgICAgIik7Ci0gICAgICAgIHMtPmFwcGVuZChjLT5nZXRDVHlwZSgpKTsKLSAgICAgICAgcy0+YXBwZW5kKCIgIik7Ci0gICAgICAgIHMtPmFwcGVuZChlLT5nZXRGaWVsZE5hbWUoY3QyKSk7Ci0gICAgICAgIHMtPmFwcGVuZCgiO1xuIik7Ci0gICAgfQotICAgIHMtPmFwcGVuZCgifSIpOwotfQotCi12b2lkIFNjcmlwdENTdGF0ZTo6YXBwZW5kVmFyRGVmaW5lcyhjb25zdCBDb250ZXh0ICpyc2MsIFN0cmluZzggKnN0cikKLXsKLSAgICBjaGFyIGJ1ZlsyNTZdOwotICAgIGlmIChyc2MtPnByb3BzLm1Mb2dTY3JpcHRzKSB7Ci0gICAgICAgIExPR0QoImFwcGVuZFZhckRlZmluZXMgbUludDMyRGVmaW5lcy5zaXplKCk9JWQgbUZsb2F0RGVmaW5lcy5zaXplKCk9JWRcbiIsCi0gICAgICAgICAgICAgICAgbUludDMyRGVmaW5lcy5zaXplKCksIG1GbG9hdERlZmluZXMuc2l6ZSgpKTsKLSAgICB9Ci0gICAgZm9yIChzaXplX3QgY3Q9MDsgY3QgPCBtSW50MzJEZWZpbmVzLnNpemUoKTsgY3QrKykgewotICAgICAgICBzdHItPmFwcGVuZCgiI2RlZmluZSAiKTsKLSAgICAgICAgc3RyLT5hcHBlbmQobUludDMyRGVmaW5lcy5rZXlBdChjdCkpOwotICAgICAgICBzdHItPmFwcGVuZCgiICIpOwotICAgICAgICBzcHJpbnRmKGJ1ZiwgIiVpXG4iLCAoaW50KW1JbnQzMkRlZmluZXMudmFsdWVBdChjdCkpOwotICAgICAgICBzdHItPmFwcGVuZChidWYpOwotICAgIH0KLSAgICBmb3IgKHNpemVfdCBjdD0wOyBjdCA8IG1GbG9hdERlZmluZXMuc2l6ZSgpOyBjdCsrKSB7Ci0gICAgICAgIHN0ci0+YXBwZW5kKCIjZGVmaW5lICIpOwotICAgICAgICBzdHItPmFwcGVuZChtRmxvYXREZWZpbmVzLmtleUF0KGN0KSk7Ci0gICAgICAgIHN0ci0+YXBwZW5kKCIgIik7Ci0gICAgICAgIHNwcmludGYoYnVmLCAiJWZmXG4iLCBtRmxvYXREZWZpbmVzLnZhbHVlQXQoY3QpKTsKLSAgICAgICAgc3RyLT5hcHBlbmQoYnVmKTsKLSAgICB9Ci19Ci0KLQotCi12b2lkIFNjcmlwdENTdGF0ZTo6YXBwZW5kVHlwZXMoY29uc3QgQ29udGV4dCAqcnNjLCBTdHJpbmc4ICpzdHIpCi17Ci0gICAgY2hhciBidWZbMjU2XTsKLSAgICBTdHJpbmc4IHRtcDsKLQotICAgIHN0ci0+YXBwZW5kKCJzdHJ1Y3QgdmVjRjMyXzJfcyB7ZmxvYXQgeDsgZmxvYXQgeTt9O1xuIik7Ci0gICAgc3RyLT5hcHBlbmQoInN0cnVjdCB2ZWNGMzJfM19zIHtmbG9hdCB4OyBmbG9hdCB5OyBmbG9hdCB6O307XG4iKTsKLSAgICBzdHItPmFwcGVuZCgic3RydWN0IHZlY0YzMl80X3Mge2Zsb2F0IHg7IGZsb2F0IHk7IGZsb2F0IHo7IGZsb2F0IHc7fTtcbiIpOwotICAgIHN0ci0+YXBwZW5kKCJzdHJ1Y3QgdmVjVThfNF9zIHtjaGFyIHI7IGNoYXIgZzsgY2hhciBiOyBjaGFyIGE7fTtcbiIpOwotICAgIHN0ci0+YXBwZW5kKCIjZGVmaW5lIHZlY0YzMl8yX3Qgc3RydWN0IHZlY0YzMl8yX3NcbiIpOwotICAgIHN0ci0+YXBwZW5kKCIjZGVmaW5lIHZlY0YzMl8zX3Qgc3RydWN0IHZlY0YzMl8zX3NcbiIpOwotICAgIHN0ci0+YXBwZW5kKCIjZGVmaW5lIHZlY0YzMl80X3Qgc3RydWN0IHZlY0YzMl80X3NcbiIpOwotICAgIHN0ci0+YXBwZW5kKCIjZGVmaW5lIHZlY1U4XzRfdCBzdHJ1Y3QgdmVjVThfNF9zXG4iKTsKLSAgICBzdHItPmFwcGVuZCgiI2RlZmluZSB2ZWNJOF80X3Qgc3RydWN0IHZlY1U4XzRfc1xuIik7Ci0KLSAgICBmb3IgKHNpemVfdCBjdD0wOyBjdCA8IE1BWF9TQ1JJUFRfQkFOS1M7IGN0KyspIHsKLSAgICAgICAgY29uc3QgVHlwZSAqdCA9IG1Db25zdGFudEJ1ZmZlclR5cGVzW2N0XS5nZXQoKTsKLSAgICAgICAgaWYgKCF0KSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBjb25zdCBFbGVtZW50ICplID0gdC0+Z2V0RWxlbWVudCgpOwotICAgICAgICBpZiAoZS0+Z2V0TmFtZSgpICYmIChlLT5nZXRGaWVsZENvdW50KCkgPiAxKSkgewotICAgICAgICAgICAgU3RyaW5nOCBzKCJzdHJ1Y3Qgc3RydWN0XyIpOwotICAgICAgICAgICAgcy5hcHBlbmQoZS0+Z2V0TmFtZSgpKTsKLSAgICAgICAgICAgIHMuYXBwZW5kKGUtPmdldENTdHJ1Y3RCb2R5KCkpOwotICAgICAgICAgICAgcy5hcHBlbmQoIjtcbiIpOwotCi0gICAgICAgICAgICBzLmFwcGVuZCgiI2RlZmluZSAiKTsKLSAgICAgICAgICAgIHMuYXBwZW5kKGUtPmdldE5hbWUoKSk7Ci0gICAgICAgICAgICBzLmFwcGVuZCgiX3Qgc3RydWN0IHN0cnVjdF8iKTsKLSAgICAgICAgICAgIHMuYXBwZW5kKGUtPmdldE5hbWUoKSk7Ci0gICAgICAgICAgICBzLmFwcGVuZCgiXG5cbiIpOwotICAgICAgICAgICAgaWYgKHJzYy0+cHJvcHMubUxvZ1NjcmlwdHMpIHsKLSAgICAgICAgICAgICAgICBMT0dWKCIlcyIsIHN0YXRpY19jYXN0PGNvbnN0IGNoYXIqPihzKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdHItPmFwcGVuZChzKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtU2xvdE5hbWVzW2N0XS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgIFN0cmluZzggczsKLSAgICAgICAgICAgIGlmIChlLT5nZXROYW1lKCkpIHsKLSAgICAgICAgICAgICAgICAvLyBVc2UgdGhlIG5hbWVkIHN0cnVjdAotICAgICAgICAgICAgICAgIHMuc2V0VG8oZS0+Z2V0TmFtZSgpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gY3JlYXRlIGFuIHN0cnVjdCBuYW1lZCBmcm9tIHRoZSBzbG90LgotICAgICAgICAgICAgICAgIHMuc2V0VG8oInN0cnVjdCAiKTsKLSAgICAgICAgICAgICAgICBzLmFwcGVuZChtU2xvdE5hbWVzW2N0XSk7Ci0gICAgICAgICAgICAgICAgcy5hcHBlbmQoIl9zIik7Ci0gICAgICAgICAgICAgICAgcy5hcHBlbmQoZS0+Z2V0Q1N0cnVjdEJvZHkoKSk7Ci0gICAgICAgICAgICAgICAgLy9hcHBlbmRFbGVtZW50Qm9keSgmcywgZSk7Ci0gICAgICAgICAgICAgICAgcy5hcHBlbmQoIjtcbiIpOwotICAgICAgICAgICAgICAgIHMuYXBwZW5kKCJzdHJ1Y3QgIik7Ci0gICAgICAgICAgICAgICAgcy5hcHBlbmQobVNsb3ROYW1lc1tjdF0pOwotICAgICAgICAgICAgICAgIHMuYXBwZW5kKCJfcyIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzLmFwcGVuZCgiICogIik7Ci0gICAgICAgICAgICBzLmFwcGVuZChtU2xvdE5hbWVzW2N0XSk7Ci0gICAgICAgICAgICBzLmFwcGVuZCgiO1xuIik7Ci0gICAgICAgICAgICBpZiAocnNjLT5wcm9wcy5tTG9nU2NyaXB0cykgewotICAgICAgICAgICAgICAgIExPR1YoIiVzIiwgc3RhdGljX2Nhc3Q8Y29uc3QgY2hhcio+KHMpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN0ci0+YXBwZW5kKHMpOwotICAgICAgICB9Ci0gICAgfQotfQogCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKQEAgLTQyMCw3ICszOTgsNiBAQAogICAgIHMtPnNldENvbnRleHQocnNjKTsKICAgICBmb3IgKGludCBjdD0wOyBjdCA8IE1BWF9TQ1JJUFRfQkFOS1M7IGN0KyspIHsKICAgICAgICAgcy0+bVR5cGVzW2N0XS5zZXQoc3MtPm1Db25zdGFudEJ1ZmZlclR5cGVzW2N0XS5nZXQoKSk7Ci0gICAgICAgIHMtPm1TbG90TmFtZXNbY3RdID0gc3MtPm1TbG90TmFtZXNbY3RdOwogICAgICAgICBzLT5tU2xvdFdyaXRhYmxlW2N0XSA9IHNzLT5tU2xvdFdyaXRhYmxlW2N0XTsKICAgICB9CiAKQEAgLTQyOCwxOCArNDA1LDYgQEAKICAgICByZXR1cm4gczsKIH0KIAotdm9pZCByc2lfU2NyaXB0Q1NldERlZmluZUYoQ29udGV4dCAqcnNjLCBjb25zdCBjaGFyKiBuYW1lLCBmbG9hdCB2YWx1ZSkKLXsKLSAgICBTY3JpcHRDU3RhdGUgKnNzID0gJnJzYy0+bVNjcmlwdEM7Ci0gICAgc3MtPm1GbG9hdERlZmluZXMuYWRkKFN0cmluZzgobmFtZSksIHZhbHVlKTsKLX0KLQotdm9pZCByc2lfU2NyaXB0Q1NldERlZmluZUkzMihDb250ZXh0ICpyc2MsIGNvbnN0IGNoYXIqIG5hbWUsIGludDMyX3QgdmFsdWUpCi17Ci0gICAgU2NyaXB0Q1N0YXRlICpzcyA9ICZyc2MtPm1TY3JpcHRDOwotICAgIHNzLT5tSW50MzJEZWZpbmVzLmFkZChTdHJpbmc4KG5hbWUpLCB2YWx1ZSk7Ci19Ci0KIH0KIH0KIApkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc1NjcmlwdEMuaCBiL2xpYnMvcnMvcnNTY3JpcHRDLmgKaW5kZXggMzVhYmFkZi4uNTBlOGE0YyAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc1NjcmlwdEMuaAorKysgYi9saWJzL3JzL3JzU2NyaXB0Qy5oCkBAIC0yMSw5ICsyMSw3IEBACiAKICNpbmNsdWRlICJSZW5kZXJTY3JpcHRFbnYuaCIKIAotI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+Ci0KLXN0cnVjdCBBQ0NzY3JpcHQ7CitzdHJ1Y3QgQkNDc2NyaXB0OwogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIG5hbWVzcGFjZSBhbmRyb2lkIHsKQEAgLTM0LDcgKzMyLDcgQEAKIGNsYXNzIFNjcmlwdEMgOiBwdWJsaWMgU2NyaXB0CiB7CiBwdWJsaWM6Ci0gICAgdHlwZWRlZiBpbnQgKCpSdW5TY3JpcHRfdCkodWludDMyX3QgbGF1bmNoSW5kZXgpOworICAgIHR5cGVkZWYgaW50ICgqUnVuU2NyaXB0X3QpKCk7CiAgICAgdHlwZWRlZiB2b2lkICgqVm9pZEZ1bmNfdCkoKTsKIAogICAgIFNjcmlwdEMoQ29udGV4dCAqKTsKQEAgLTQ0LDE4ICs0MiwzMyBAQAogICAgICAgICBpbnQgbVZlcnNpb25NYWpvcjsKICAgICAgICAgaW50IG1WZXJzaW9uTWlub3I7CiAKLSAgICAgICAgUnVuU2NyaXB0X3QgbVNjcmlwdDsKKyAgICAgICAgUnVuU2NyaXB0X3QgbVJvb3Q7CiAgICAgICAgIFZvaWRGdW5jX3QgbUluaXQ7Ci0KLSAgICAgICAgdm9pZCAqKiBtU2xvdFBvaW50ZXJzW01BWF9TQ1JJUFRfQkFOS1NdOwogICAgIH07CiAKICAgICBQcm9ncmFtX3QgbVByb2dyYW07CiAKLSAgICBBQ0NzY3JpcHQqICAgIG1BY2NTY3JpcHQ7CisgICAgQkNDc2NyaXB0KiAgICBtQmNjU2NyaXB0OwogCi0gICAgdmlydHVhbCB2b2lkIHNldHVwU2NyaXB0KCk7Ci0gICAgdmlydHVhbCB1aW50MzJfdCBydW4oQ29udGV4dCAqLCB1aW50MzJfdCBsYXVuY2hJRCk7CisgICAgY29uc3QgQWxsb2NhdGlvbiAqcHRyVG9BbGxvY2F0aW9uKGNvbnN0IHZvaWQgKikgY29uc3Q7CisKKworICAgIHZpcnR1YWwgdm9pZCBJbnZva2UoQ29udGV4dCAqcnNjLCB1aW50MzJfdCBzbG90LCBjb25zdCB2b2lkICpkYXRhLCB1aW50MzJfdCBsZW4pOworCisgICAgdmlydHVhbCB1aW50MzJfdCBydW4oQ29udGV4dCAqKTsKKworICAgIHZpcnR1YWwgdm9pZCBydW5Gb3JFYWNoKENvbnRleHQgKnJzYywgY29uc3QgQWxsb2NhdGlvbiAqYWluLCBBbGxvY2F0aW9uICphb3V0KTsKKyAgICB2aXJ0dWFsIHZvaWQgcnVuRm9yRWFjaChDb250ZXh0ICpyc2MsIGNvbnN0IEFsbG9jYXRpb24gKmFpbiwgQWxsb2NhdGlvbiAqYW91dCwgdWludDMyX3QgeFN0YXJ0LCB1aW50MzJfdCB4RW5kKTsKKyAgICB2aXJ0dWFsIHZvaWQgcnVuRm9yRWFjaChDb250ZXh0ICpyc2MsIGNvbnN0IEFsbG9jYXRpb24gKmFpbiwgQWxsb2NhdGlvbiAqYW91dCwgdWludDMyX3QgeFN0YXJ0LCB1aW50MzJfdCB5U3RhcnQsIHVpbnQzMl90IHhFbmQsIHVpbnQzMl90IHlFbmQpOworCisgICAgdmlydHVhbCB2b2lkIHNlcmlhbGl6ZShPU3RyZWFtICpzdHJlYW0pIGNvbnN0IHsgICAgfQorICAgIHZpcnR1YWwgUnNBM0RDbGFzc0lEIGdldENsYXNzSWQoKSBjb25zdCB7IHJldHVybiBSU19BM0RfQ0xBU1NfSURfU0NSSVBUX0M7IH0KKyAgICBzdGF0aWMgVHlwZSAqY3JlYXRlRnJvbVN0cmVhbShDb250ZXh0ICpyc2MsIElTdHJlYW0gKnN0cmVhbSkgeyByZXR1cm4gTlVMTDsgfQorCitwcm90ZWN0ZWQ6CisgICAgdm9pZCBzZXR1cFNjcmlwdChDb250ZXh0ICopOworICAgIHZvaWQgc2V0dXBHTFN0YXRlKENvbnRleHQgKik7CisgICAgU2NyaXB0ICogc2V0VExTKFNjcmlwdCAqKTsKIH07CiAKIGNsYXNzIFNjcmlwdENTdGF0ZQpAQCAtNjcsMjcgKzgwLDIxIEBACiAgICAgU2NyaXB0QyAqbVNjcmlwdDsKIAogICAgIE9iamVjdEJhc2VSZWY8Y29uc3QgVHlwZT4gbUNvbnN0YW50QnVmZmVyVHlwZXNbTUFYX1NDUklQVF9CQU5LU107Ci0gICAgU3RyaW5nOCBtU2xvdE5hbWVzW01BWF9TQ1JJUFRfQkFOS1NdOworICAgIC8vU3RyaW5nOCBtU2xvdE5hbWVzW01BWF9TQ1JJUFRfQkFOS1NdOwogICAgIGJvb2wgbVNsb3RXcml0YWJsZVtNQVhfU0NSSVBUX0JBTktTXTsKLSAgICBTdHJpbmc4IG1JbnZva2FibGVOYW1lc1tNQVhfU0NSSVBUX0JBTktTXTsKKyAgICAvL1N0cmluZzggbUludm9rYWJsZU5hbWVzW01BWF9TQ1JJUFRfQkFOS1NdOwogCiAgICAgdm9pZCBjbGVhcigpOwogICAgIHZvaWQgcnVuQ29tcGlsZXIoQ29udGV4dCAqcnNjLCBTY3JpcHRDICpzKTsKLSAgICB2b2lkIGFwcGVuZFZhckRlZmluZXMoY29uc3QgQ29udGV4dCAqcnNjLCBTdHJpbmc4ICpzdHIpOwotICAgIHZvaWQgYXBwZW5kVHlwZXMoY29uc3QgQ29udGV4dCAqcnNjLCBTdHJpbmc4ICpzdHIpOwogCiAgICAgc3RydWN0IFN5bWJvbFRhYmxlX3QgewogICAgICAgICBjb25zdCBjaGFyICogbU5hbWU7CiAgICAgICAgIHZvaWQgKiBtUHRyOwotICAgICAgICBjb25zdCBjaGFyICogbVJldDsKLSAgICAgICAgY29uc3QgY2hhciAqIG1QYXJhbTsKICAgICB9OwotICAgIHN0YXRpYyBTeW1ib2xUYWJsZV90IGdTeW1zW107CisgICAgLy9zdGF0aWMgU3ltYm9sVGFibGVfdCBnU3ltc1tdOwogICAgIHN0YXRpYyBjb25zdCBTeW1ib2xUYWJsZV90ICogbG9va3VwU3ltYm9sKGNvbnN0IGNoYXIgKik7Ci0gICAgc3RhdGljIHZvaWQgYXBwZW5kRGVjbHMoU3RyaW5nOCAqc3RyKTsKLQotICAgIEtleWVkVmVjdG9yPFN0cmluZzgsaW50PiBtSW50MzJEZWZpbmVzOwotICAgIEtleWVkVmVjdG9yPFN0cmluZzgsZmxvYXQ+IG1GbG9hdERlZmluZXM7CisgICAgc3RhdGljIGNvbnN0IFN5bWJvbFRhYmxlX3QgKiBsb29rdXBTeW1ib2xDTChjb25zdCBjaGFyICopOworICAgIHN0YXRpYyBjb25zdCBTeW1ib2xUYWJsZV90ICogbG9va3VwU3ltYm9sR0woY29uc3QgY2hhciAqKTsKIH07CiAKIApkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc1NjcmlwdENfTGliLmNwcCBiL2xpYnMvcnMvcnNTY3JpcHRDX0xpYi5jcHAKaW5kZXggMjAyY2EzZC4uZWEwMTEzNCAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc1NjcmlwdENfTGliLmNwcAorKysgYi9saWJzL3JzL3JzU2NyaXB0Q19MaWIuY3BwCkBAIC0xNywxOCArMTcsMTAgQEAKICNpbmNsdWRlICJyc0NvbnRleHQuaCIKICNpbmNsdWRlICJyc1NjcmlwdEMuaCIKICNpbmNsdWRlICJyc01hdHJpeC5oIgotI2luY2x1ZGUgInJzTm9pc2UuaCIKIAogI2luY2x1ZGUgImFjYy9hY2MuaCIKICNpbmNsdWRlICJ1dGlscy9UaW1lcnMuaCIKIAotI2RlZmluZSBHTF9HTEVYVF9QUk9UT1RZUEVTCi0KLSNpbmNsdWRlIDxHTEVTL2dsLmg+Ci0jaW5jbHVkZSA8R0xFUy9nbGV4dC5oPgotI2luY2x1ZGUgPEdMRVMyL2dsMi5oPgotI2luY2x1ZGUgPEdMRVMyL2dsMmV4dC5oPgotCiAjaW5jbHVkZSA8dGltZS5oPgogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKQEAgLTM5LDI1MiArMzEsMTEgQEAKICAgICBDb250ZXh0ICogcnNjID0gdGxzLT5tQ29udGV4dDsgXAogICAgIFNjcmlwdEMgKiBzYyA9IChTY3JpcHRDICopIHRscy0+bVNjcmlwdAogCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgZmxvYXQgeDsKLSAgICBmbG9hdCB5OwotICAgIGZsb2F0IHo7Ci19IHZlYzNfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIGZsb2F0IHg7Ci0gICAgZmxvYXQgeTsKLSAgICBmbG9hdCB6OwotICAgIGZsb2F0IHc7Ci19IHZlYzRfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIGZsb2F0IHg7Ci0gICAgZmxvYXQgeTsKLX0gdmVjMl90OwotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIElPIHJvdXRpbmVzCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotc3RhdGljIGZsb2F0IFNDX2xvYWRGKHVpbnQzMl90IGJhbmssIHVpbnQzMl90IG9mZnNldCkKLXsKLSAgICBHRVRfVExTKCk7Ci0gICAgY29uc3Qgdm9pZCAqdnAgPSBzYy0+bVNsb3RzW2JhbmtdLT5nZXRQdHIoKTsKLSAgICBjb25zdCBmbG9hdCAqZiA9IHN0YXRpY19jYXN0PGNvbnN0IGZsb2F0ICo+KHZwKTsKLSAgICAvL0xPR0UoImxvYWRGICVpICVpID0gJWYgJXgiLCBiYW5rLCBvZmZzZXQsIGYsICgoaW50ICopJmYpWzBdKTsKLSAgICByZXR1cm4gZltvZmZzZXRdOwotfQotCi1zdGF0aWMgaW50MzJfdCBTQ19sb2FkSTMyKHVpbnQzMl90IGJhbmssIHVpbnQzMl90IG9mZnNldCkKLXsKLSAgICBHRVRfVExTKCk7Ci0gICAgY29uc3Qgdm9pZCAqdnAgPSBzYy0+bVNsb3RzW2JhbmtdLT5nZXRQdHIoKTsKLSAgICBjb25zdCBpbnQzMl90ICppID0gc3RhdGljX2Nhc3Q8Y29uc3QgaW50MzJfdCAqPih2cCk7Ci0gICAgLy9MT0dFKCJsb2FkSTMyICVpICVpID0gJWkiLCBiYW5rLCBvZmZzZXQsIHQpOwotICAgIHJldHVybiBpW29mZnNldF07Ci19Ci0KLXN0YXRpYyBmbG9hdCogU0NfbG9hZEFycmF5Rih1aW50MzJfdCBiYW5rLCB1aW50MzJfdCBvZmZzZXQpCi17Ci0gICAgR0VUX1RMUygpOwotICAgIHZvaWQgKnZwID0gc2MtPm1TbG90c1tiYW5rXS0+Z2V0UHRyKCk7Ci0gICAgZmxvYXQgKmYgPSBzdGF0aWNfY2FzdDxmbG9hdCAqPih2cCk7Ci0gICAgcmV0dXJuIGYgKyBvZmZzZXQ7Ci19Ci0KLXN0YXRpYyBpbnQzMl90KiBTQ19sb2FkQXJyYXlJMzIodWludDMyX3QgYmFuaywgdWludDMyX3Qgb2Zmc2V0KQotewotICAgIEdFVF9UTFMoKTsKLSAgICB2b2lkICp2cCA9IHNjLT5tU2xvdHNbYmFua10tPmdldFB0cigpOwotICAgIGludDMyX3QgKmkgPSBzdGF0aWNfY2FzdDxpbnQzMl90ICo+KHZwKTsKLSAgICByZXR1cm4gaSArIG9mZnNldDsKLX0KLQotc3RhdGljIGZsb2F0KiBTQ19sb2FkU2ltcGxlTWVzaFZlcnRpY2VzRihSc1NpbXBsZU1lc2ggbWVzaCwgdWludDMyX3QgaWR4KQotewotICAgIFNpbXBsZU1lc2ggKnRtID0gc3RhdGljX2Nhc3Q8U2ltcGxlTWVzaCAqPihtZXNoKTsKLSAgICB2b2lkICp2cCA9IHRtLT5tVmVydGV4QnVmZmVyc1tpZHhdLT5nZXRQdHIoKTs7Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PGZsb2F0ICo+KHZwKTsKLX0KLQotc3RhdGljIHZvaWQgU0NfdXBkYXRlU2ltcGxlTWVzaChSc1NpbXBsZU1lc2ggbWVzaCkKLXsKLSAgICBHRVRfVExTKCk7Ci0gICAgU2ltcGxlTWVzaCAqc20gPSBzdGF0aWNfY2FzdDxTaW1wbGVNZXNoICo+KG1lc2gpOwotICAgIHNtLT51cGxvYWRBbGwocnNjKTsKLX0KLQotc3RhdGljIHVpbnQzMl90IFNDX2xvYWRVMzIodWludDMyX3QgYmFuaywgdWludDMyX3Qgb2Zmc2V0KQotewotICAgIEdFVF9UTFMoKTsKLSAgICBjb25zdCB2b2lkICp2cCA9IHNjLT5tU2xvdHNbYmFua10tPmdldFB0cigpOwotICAgIGNvbnN0IHVpbnQzMl90ICppID0gc3RhdGljX2Nhc3Q8Y29uc3QgdWludDMyX3QgKj4odnApOwotICAgIHJldHVybiBpW29mZnNldF07Ci19Ci0KLXN0YXRpYyB2b2lkIFNDX2xvYWRWZWM0KHVpbnQzMl90IGJhbmssIHVpbnQzMl90IG9mZnNldCwgcnNjX1ZlY3RvcjQgKnYpCi17Ci0gICAgR0VUX1RMUygpOwotICAgIGNvbnN0IHZvaWQgKnZwID0gc2MtPm1TbG90c1tiYW5rXS0+Z2V0UHRyKCk7Ci0gICAgY29uc3QgZmxvYXQgKmYgPSBzdGF0aWNfY2FzdDxjb25zdCBmbG9hdCAqPih2cCk7Ci0gICAgbWVtY3B5KHYsICZmW29mZnNldF0sIHNpemVvZihyc2NfVmVjdG9yNCkpOwotfQotCi1zdGF0aWMgdm9pZCBTQ19sb2FkTWF0cml4KHVpbnQzMl90IGJhbmssIHVpbnQzMl90IG9mZnNldCwgcnNjX01hdHJpeCAqbSkKLXsKLSAgICBHRVRfVExTKCk7Ci0gICAgY29uc3Qgdm9pZCAqdnAgPSBzYy0+bVNsb3RzW2JhbmtdLT5nZXRQdHIoKTsKLSAgICBjb25zdCBmbG9hdCAqZiA9IHN0YXRpY19jYXN0PGNvbnN0IGZsb2F0ICo+KHZwKTsKLSAgICBtZW1jcHkobSwgJmZbb2Zmc2V0XSwgc2l6ZW9mKHJzY19NYXRyaXgpKTsKLX0KLQotCi1zdGF0aWMgdm9pZCBTQ19zdG9yZUYodWludDMyX3QgYmFuaywgdWludDMyX3Qgb2Zmc2V0LCBmbG9hdCB2KQotewotICAgIC8vTE9HRSgic3RvcmVGICVpICVpICVmIiwgYmFuaywgb2Zmc2V0LCB2KTsKLSAgICBHRVRfVExTKCk7Ci0gICAgdm9pZCAqdnAgPSBzYy0+bVNsb3RzW2JhbmtdLT5nZXRQdHIoKTsKLSAgICBmbG9hdCAqZiA9IHN0YXRpY19jYXN0PGZsb2F0ICo+KHZwKTsKLSAgICBmW29mZnNldF0gPSB2OwotfQotCi1zdGF0aWMgdm9pZCBTQ19zdG9yZUkzMih1aW50MzJfdCBiYW5rLCB1aW50MzJfdCBvZmZzZXQsIGludDMyX3QgdikKLXsKLSAgICBHRVRfVExTKCk7Ci0gICAgdm9pZCAqdnAgPSBzYy0+bVNsb3RzW2JhbmtdLT5nZXRQdHIoKTsKLSAgICBpbnQzMl90ICpmID0gc3RhdGljX2Nhc3Q8aW50MzJfdCAqPih2cCk7Ci0gICAgc3RhdGljX2Nhc3Q8aW50MzJfdCAqPihzYy0+bVNsb3RzW2JhbmtdLT5nZXRQdHIoKSlbb2Zmc2V0XSA9IHY7Ci19Ci0KLXN0YXRpYyB2b2lkIFNDX3N0b3JlVTMyKHVpbnQzMl90IGJhbmssIHVpbnQzMl90IG9mZnNldCwgdWludDMyX3QgdikKLXsKLSAgICBHRVRfVExTKCk7Ci0gICAgdm9pZCAqdnAgPSBzYy0+bVNsb3RzW2JhbmtdLT5nZXRQdHIoKTsKLSAgICB1aW50MzJfdCAqZiA9IHN0YXRpY19jYXN0PHVpbnQzMl90ICo+KHZwKTsKLSAgICBzdGF0aWNfY2FzdDx1aW50MzJfdCAqPihzYy0+bVNsb3RzW2JhbmtdLT5nZXRQdHIoKSlbb2Zmc2V0XSA9IHY7Ci19Ci0KLXN0YXRpYyB2b2lkIFNDX3N0b3JlVmVjNCh1aW50MzJfdCBiYW5rLCB1aW50MzJfdCBvZmZzZXQsIGNvbnN0IHJzY19WZWN0b3I0ICp2KQotewotICAgIEdFVF9UTFMoKTsKLSAgICB2b2lkICp2cCA9IHNjLT5tU2xvdHNbYmFua10tPmdldFB0cigpOwotICAgIGZsb2F0ICpmID0gc3RhdGljX2Nhc3Q8ZmxvYXQgKj4odnApOwotICAgIG1lbWNweSgmZltvZmZzZXRdLCB2LCBzaXplb2YocnNjX1ZlY3RvcjQpKTsKLX0KLQotc3RhdGljIHZvaWQgU0Nfc3RvcmVNYXRyaXgodWludDMyX3QgYmFuaywgdWludDMyX3Qgb2Zmc2V0LCBjb25zdCByc2NfTWF0cml4ICptKQotewotICAgIEdFVF9UTFMoKTsKLSAgICB2b2lkICp2cCA9IHNjLT5tU2xvdHNbYmFua10tPmdldFB0cigpOwotICAgIGZsb2F0ICpmID0gc3RhdGljX2Nhc3Q8ZmxvYXQgKj4odnApOwotICAgIG1lbWNweSgmZltvZmZzZXRdLCBtLCBzaXplb2YocnNjX01hdHJpeCkpOwotfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIFZlYzMgcm91dGluZXMKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi1zdGF0aWMgdm9pZCBTQ192ZWMzTm9ybSh2ZWMzX3QgKnYpCi17Ci0gICAgZmxvYXQgbGVuID0gc3FydGYodi0+eCAqIHYtPnggKyB2LT55ICogdi0+eSArIHYtPnogKiB2LT56KTsKLSAgICBsZW4gPSAxIC8gbGVuOwotICAgIHYtPnggKj0gbGVuOwotICAgIHYtPnkgKj0gbGVuOwotICAgIHYtPnogKj0gbGVuOwotfQotCi1zdGF0aWMgZmxvYXQgU0NfdmVjM0xlbmd0aChjb25zdCB2ZWMzX3QgKnYpCi17Ci0gICAgcmV0dXJuIHNxcnRmKHYtPnggKiB2LT54ICsgdi0+eSAqIHYtPnkgKyB2LT56ICogdi0+eik7Ci19Ci0KLXN0YXRpYyB2b2lkIFNDX3ZlYzNBZGQodmVjM190ICpkZXN0LCBjb25zdCB2ZWMzX3QgKmxocywgY29uc3QgdmVjM190ICpyaHMpCi17Ci0gICAgZGVzdC0+eCA9IGxocy0+eCArIHJocy0+eDsKLSAgICBkZXN0LT55ID0gbGhzLT55ICsgcmhzLT55OwotICAgIGRlc3QtPnogPSBsaHMtPnogKyByaHMtPno7Ci19Ci0KLXN0YXRpYyB2b2lkIFNDX3ZlYzNTdWIodmVjM190ICpkZXN0LCBjb25zdCB2ZWMzX3QgKmxocywgY29uc3QgdmVjM190ICpyaHMpCi17Ci0gICAgZGVzdC0+eCA9IGxocy0+eCAtIHJocy0+eDsKLSAgICBkZXN0LT55ID0gbGhzLT55IC0gcmhzLT55OwotICAgIGRlc3QtPnogPSBsaHMtPnogLSByaHMtPno7Ci19Ci0KLXN0YXRpYyB2b2lkIFNDX3ZlYzNDcm9zcyh2ZWMzX3QgKmRlc3QsIGNvbnN0IHZlYzNfdCAqbGhzLCBjb25zdCB2ZWMzX3QgKnJocykKLXsKLSAgICBmbG9hdCB4ID0gbGhzLT55ICogcmhzLT56ICAtIGxocy0+eiAqIHJocy0+eTsKLSAgICBmbG9hdCB5ID0gbGhzLT56ICogcmhzLT54ICAtIGxocy0+eCAqIHJocy0+ejsKLSAgICBmbG9hdCB6ID0gbGhzLT54ICogcmhzLT55ICAtIGxocy0+eSAqIHJocy0+eDsKLSAgICBkZXN0LT54ID0geDsKLSAgICBkZXN0LT55ID0geTsKLSAgICBkZXN0LT56ID0gejsKLX0KLQotc3RhdGljIGZsb2F0IFNDX3ZlYzNEb3QoY29uc3QgdmVjM190ICpsaHMsIGNvbnN0IHZlYzNfdCAqcmhzKQotewotICAgIHJldHVybiBsaHMtPnggKiByaHMtPnggKyBsaHMtPnkgKiByaHMtPnkgKyBsaHMtPnogKiByaHMtPno7Ci19Ci0KLXN0YXRpYyB2b2lkIFNDX3ZlYzNTY2FsZSh2ZWMzX3QgKmxocywgZmxvYXQgc2NhbGUpCi17Ci0gICAgbGhzLT54ICo9IHNjYWxlOwotICAgIGxocy0+eSAqPSBzY2FsZTsKLSAgICBsaHMtPnogKj0gc2NhbGU7Ci19Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gVmVjNCByb3V0aW5lcwotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLXN0YXRpYyB2b2lkIFNDX3ZlYzROb3JtKHZlYzRfdCAqdikKLXsKLSAgICBmbG9hdCBsZW4gPSBzcXJ0Zih2LT54ICogdi0+eCArIHYtPnkgKiB2LT55ICsgdi0+eiAqIHYtPnogKyB2LT53ICogdi0+dyk7Ci0gICAgbGVuID0gMSAvIGxlbjsKLSAgICB2LT54ICo9IGxlbjsKLSAgICB2LT55ICo9IGxlbjsKLSAgICB2LT56ICo9IGxlbjsKLSAgICB2LT53ICo9IGxlbjsKLX0KLQotc3RhdGljIGZsb2F0IFNDX3ZlYzRMZW5ndGgoY29uc3QgdmVjNF90ICp2KQotewotICAgIHJldHVybiBzcXJ0Zih2LT54ICogdi0+eCArIHYtPnkgKiB2LT55ICsgdi0+eiAqIHYtPnogKyB2LT53ICogdi0+dyk7Ci19Ci0KLXN0YXRpYyB2b2lkIFNDX3ZlYzRBZGQodmVjNF90ICpkZXN0LCBjb25zdCB2ZWM0X3QgKmxocywgY29uc3QgdmVjNF90ICpyaHMpCi17Ci0gICAgZGVzdC0+eCA9IGxocy0+eCArIHJocy0+eDsKLSAgICBkZXN0LT55ID0gbGhzLT55ICsgcmhzLT55OwotICAgIGRlc3QtPnogPSBsaHMtPnogKyByaHMtPno7Ci0gICAgZGVzdC0+dyA9IGxocy0+dyArIHJocy0+dzsKLX0KLQotc3RhdGljIHZvaWQgU0NfdmVjNFN1Yih2ZWM0X3QgKmRlc3QsIGNvbnN0IHZlYzRfdCAqbGhzLCBjb25zdCB2ZWM0X3QgKnJocykKLXsKLSAgICBkZXN0LT54ID0gbGhzLT54IC0gcmhzLT54OwotICAgIGRlc3QtPnkgPSBsaHMtPnkgLSByaHMtPnk7Ci0gICAgZGVzdC0+eiA9IGxocy0+eiAtIHJocy0+ejsKLSAgICBkZXN0LT53ID0gbGhzLT53IC0gcmhzLT53OwotfQotCi1zdGF0aWMgZmxvYXQgU0NfdmVjNERvdChjb25zdCB2ZWM0X3QgKmxocywgY29uc3QgdmVjNF90ICpyaHMpCi17Ci0gICAgcmV0dXJuIGxocy0+eCAqIHJocy0+eCArIGxocy0+eSAqIHJocy0+eSArIGxocy0+eiAqIHJocy0+eiArIGxocy0+dyAqIHJocy0+dzsKLX0KLQotc3RhdGljIHZvaWQgU0NfdmVjNFNjYWxlKHZlYzRfdCAqbGhzLCBmbG9hdCBzY2FsZSkKLXsKLSAgICBsaHMtPnggKj0gc2NhbGU7Ci0gICAgbGhzLT55ICo9IHNjYWxlOwotICAgIGxocy0+eiAqPSBzY2FsZTsKLSAgICBsaHMtPncgKj0gc2NhbGU7Ci19CiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogLy8gTWF0aCByb3V0aW5lcwogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKLSNkZWZpbmUgUEkgMy4xNDE1OTI2ZgotI2RlZmluZSBERUdfVE9fUkFEIFBJIC8gMTgwLjBmCi0jZGVmaW5lIFJBRF9UT19ERUcgMTgwLjBmIC8gUEkKLQogc3RhdGljIGZsb2F0IFNDX3NpbmZfZmFzdChmbG9hdCB4KQogewogICAgIGNvbnN0IGZsb2F0IEEgPSAgIDEuMGYgLyAoMi4wZiAqIE1fUEkpOwpAQCAtMzIzLDYgKzc0LDcgQEAKICAgICByZXR1cm4gMC4yMjE1ZiAqICh5ICogZmFic2YoeSkgLSB5KSArIHk7CiB9CiAKKwogc3RhdGljIGZsb2F0IFNDX3JhbmRmKGZsb2F0IG1heCkKIHsKICAgICBmbG9hdCByID0gKGZsb2F0KXJhbmQoKTsKQEAgLTMzNSwxMDQgKzg3LDIwIEBACiAgICAgcmV0dXJuIHIgLyBSQU5EX01BWCAqIChtYXggLSBtaW4pICsgbWluOwogfQogCi1zdGF0aWMgaW50IFNDX3NpZ24oaW50IHZhbHVlKQorc3RhdGljIGludCBTQ19yYW5kaShpbnQgbWF4KQogewotICAgIHJldHVybiAodmFsdWUgPiAwKSAtICh2YWx1ZSA8IDApOworICAgIHJldHVybiAoaW50KVNDX3JhbmRmKG1heCk7CiB9CiAKLXN0YXRpYyBmbG9hdCBTQ19zaWduZihmbG9hdCB2YWx1ZSkKK3N0YXRpYyBpbnQgU0NfcmFuZGkyKGludCBtaW4sIGludCBtYXgpCiB7Ci0gICAgcmV0dXJuICh2YWx1ZSA+IDApIC0gKHZhbHVlIDwgMCk7CisgICAgcmV0dXJuIChpbnQpU0NfcmFuZGYyKG1pbiwgbWF4KTsKIH0KIAotc3RhdGljIGZsb2F0IFNDX2NsYW1wZihmbG9hdCBhbW91bnQsIGZsb2F0IGxvdywgZmxvYXQgaGlnaCkKK3N0YXRpYyBmbG9hdCBTQ19mcmFjKGZsb2F0IHYpCiB7Ci0gICAgcmV0dXJuIGFtb3VudCA8IGxvdyA/IGxvdyA6IChhbW91bnQgPiBoaWdoID8gaGlnaCA6IGFtb3VudCk7Ci19Ci0KLXN0YXRpYyBpbnQgU0NfY2xhbXAoaW50IGFtb3VudCwgaW50IGxvdywgaW50IGhpZ2gpCi17Ci0gICAgcmV0dXJuIGFtb3VudCA8IGxvdyA/IGxvdyA6IChhbW91bnQgPiBoaWdoID8gaGlnaCA6IGFtb3VudCk7Ci19Ci0KLXN0YXRpYyBmbG9hdCBTQ19tYXhmKGZsb2F0IGEsIGZsb2F0IGIpCi17Ci0gICAgcmV0dXJuIGEgPiBiID8gYSA6IGI7Ci19Ci0KLXN0YXRpYyBmbG9hdCBTQ19taW5mKGZsb2F0IGEsIGZsb2F0IGIpCi17Ci0gICAgcmV0dXJuIGEgPCBiID8gYSA6IGI7Ci19Ci0KLXN0YXRpYyBmbG9hdCBTQ19zcXJmKGZsb2F0IHYpCi17Ci0gICAgcmV0dXJuIHYgKiB2OwotfQotCi1zdGF0aWMgaW50IFNDX3NxcihpbnQgdikKLXsKLSAgICByZXR1cm4gdiAqIHY7Ci19Ci0KLXN0YXRpYyBmbG9hdCBTQ19mcmFjZihmbG9hdCB2KQotewotICAgIHJldHVybiB2IC0gZmxvb3JmKHYpOwotfQotCi1zdGF0aWMgZmxvYXQgU0Nfcm91bmRmKGZsb2F0IHYpCi17Ci0gICAgcmV0dXJuIGZsb29yZih2ICsgMC40OTk5OTk5OTk5KTsKLX0KLQotc3RhdGljIGZsb2F0IFNDX2Rpc3RmMihmbG9hdCB4MSwgZmxvYXQgeTEsIGZsb2F0IHgyLCBmbG9hdCB5MikKLXsKLSAgICBmbG9hdCB4ID0geDIgLSB4MTsKLSAgICBmbG9hdCB5ID0geTIgLSB5MTsKLSAgICByZXR1cm4gc3FydGYoeCAqIHggKyB5ICogeSk7Ci19Ci0KLXN0YXRpYyBmbG9hdCBTQ19kaXN0ZjMoZmxvYXQgeDEsIGZsb2F0IHkxLCBmbG9hdCB6MSwgZmxvYXQgeDIsIGZsb2F0IHkyLCBmbG9hdCB6MikKLXsKLSAgICBmbG9hdCB4ID0geDIgLSB4MTsKLSAgICBmbG9hdCB5ID0geTIgLSB5MTsKLSAgICBmbG9hdCB6ID0gejIgLSB6MTsKLSAgICByZXR1cm4gc3FydGYoeCAqIHggKyB5ICogeSArIHogKiB6KTsKLX0KLQotc3RhdGljIGZsb2F0IFNDX21hZ2YyKGZsb2F0IGEsIGZsb2F0IGIpCi17Ci0gICAgcmV0dXJuIHNxcnRmKGEgKiBhICsgYiAqIGIpOwotfQotCi1zdGF0aWMgZmxvYXQgU0NfbWFnZjMoZmxvYXQgYSwgZmxvYXQgYiwgZmxvYXQgYykKLXsKLSAgICByZXR1cm4gc3FydGYoYSAqIGEgKyBiICogYiArIGMgKiBjKTsKLX0KLQotc3RhdGljIGZsb2F0IFNDX3JhZGYoZmxvYXQgZGVncmVlcykKLXsKLSAgICByZXR1cm4gZGVncmVlcyAqIERFR19UT19SQUQ7Ci19Ci0KLXN0YXRpYyBmbG9hdCBTQ19kZWdmKGZsb2F0IHJhZGlhbnMpCi17Ci0gICAgcmV0dXJuIHJhZGlhbnMgKiBSQURfVE9fREVHOwotfQotCi1zdGF0aWMgZmxvYXQgU0NfbGVycGYoZmxvYXQgc3RhcnQsIGZsb2F0IHN0b3AsIGZsb2F0IGFtb3VudCkKLXsKLSAgICByZXR1cm4gc3RhcnQgKyAoc3RvcCAtIHN0YXJ0KSAqIGFtb3VudDsKLX0KLQotc3RhdGljIGZsb2F0IFNDX25vcm1mKGZsb2F0IHN0YXJ0LCBmbG9hdCBzdG9wLCBmbG9hdCB2YWx1ZSkKLXsKLSAgICByZXR1cm4gKHZhbHVlIC0gc3RhcnQpIC8gKHN0b3AgLSBzdGFydCk7Ci19Ci0KLXN0YXRpYyBmbG9hdCBTQ19tYXBmKGZsb2F0IG1pblN0YXJ0LCBmbG9hdCBtaW5TdG9wLCBmbG9hdCBtYXhTdGFydCwgZmxvYXQgbWF4U3RvcCwgZmxvYXQgdmFsdWUpCi17Ci0gICAgcmV0dXJuIG1heFN0YXJ0ICsgKG1heFN0YXJ0IC0gbWF4U3RvcCkgKiAoKHZhbHVlIC0gbWluU3RhcnQpIC8gKG1pblN0b3AgLSBtaW5TdGFydCkpOworICAgIGludCBpID0gKGludClmbG9vcih2KTsKKyAgICByZXR1cm4gZm1pbih2IC0gaSwgMHgxLmZmZmZmZXAtMWYpOwogfQogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KQEAgLTUxMSw2ICsxNzksMjQgQEAKICAgICByZXR1cm4gdGltZWluZm8tPnRtX3llYXI7CiB9CiAKK3N0YXRpYyBpbnQ2NF90IFNDX3VwdGltZU1pbGxpczIoKQoreworICAgIHJldHVybiBuYW5vc2Vjb25kc190b19taWxsaXNlY29uZHMoc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpKTsKK30KKworc3RhdGljIGludDY0X3QgU0Nfc3RhcnRUaW1lTWlsbGlzMigpCit7CisgICAgR0VUX1RMUygpOworICAgIHJldHVybiBzYy0+bUVudmlyb21lbnQubVN0YXJ0VGltZU1pbGxpczsKK30KKworc3RhdGljIGludDY0X3QgU0NfZWxhcHNlZFRpbWVNaWxsaXMyKCkKK3sKKyAgICBHRVRfVExTKCk7CisgICAgcmV0dXJuIG5hbm9zZWNvbmRzX3RvX21pbGxpc2Vjb25kcyhzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQykpCisgICAgICAgICAgICAtIHNjLT5tRW52aXJvbWVudC5tU3RhcnRUaW1lTWlsbGlzOworfQorCiBzdGF0aWMgaW50MzJfdCBTQ191cHRpbWVNaWxsaXMoKQogewogICAgIHJldHVybiBuYW5vc2Vjb25kc190b19taWxsaXNlY29uZHMoc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpKTsKQEAgLTYwMiw0NzcgKzI4OCwxNDMgQEAKIH0KIAogCi1zdGF0aWMgdm9pZCBTQ192ZWMyUmFuZChmbG9hdCAqdmVjLCBmbG9hdCBtYXhMZW4pCi17Ci0gICAgZmxvYXQgYW5nbGUgPSBTQ19yYW5kZihQSSAqIDIpOwotICAgIGZsb2F0IGxlbiA9IFNDX3JhbmRmKG1heExlbik7Ci0gICAgdmVjWzBdID0gbGVuICogc2luZihhbmdsZSk7Ci0gICAgdmVjWzFdID0gbGVuICogY29zZihhbmdsZSk7Ci19Ci0KLQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIENvbnRleHQKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi1zdGF0aWMgdm9pZCBTQ19iaW5kVGV4dHVyZShSc1Byb2dyYW1GcmFnbWVudCB2cGYsIHVpbnQzMl90IHNsb3QsIFJzQWxsb2NhdGlvbiB2YSkKLXsKLSAgICBHRVRfVExTKCk7Ci0gICAgcnNpX1Byb2dyYW1CaW5kVGV4dHVyZShyc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxQcm9ncmFtRnJhZ21lbnQgKj4odnBmKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsb3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxBbGxvY2F0aW9uICo+KHZhKSk7Ci0KLX0KLQotc3RhdGljIHZvaWQgU0NfYmluZFNhbXBsZXIoUnNQcm9ncmFtRnJhZ21lbnQgdnBmLCB1aW50MzJfdCBzbG90LCBSc1NhbXBsZXIgdnMpCi17Ci0gICAgR0VUX1RMUygpOwotICAgIHJzaV9Qcm9ncmFtQmluZFNhbXBsZXIocnNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8UHJvZ3JhbUZyYWdtZW50ICo+KHZwZiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzbG90LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8U2FtcGxlciAqPih2cykpOwotCi19Ci0KLXN0YXRpYyB2b2lkIFNDX2JpbmRQcm9ncmFtRnJhZ21lbnRTdG9yZShSc1Byb2dyYW1GcmFnbWVudFN0b3JlIHBmcykKLXsKLSAgICBHRVRfVExTKCk7Ci0gICAgcnNpX0NvbnRleHRCaW5kUHJvZ3JhbUZyYWdtZW50U3RvcmUocnNjLCBwZnMpOwotCi19Ci0KLXN0YXRpYyB2b2lkIFNDX2JpbmRQcm9ncmFtRnJhZ21lbnQoUnNQcm9ncmFtRnJhZ21lbnQgcGYpCi17Ci0gICAgR0VUX1RMUygpOwotICAgIHJzaV9Db250ZXh0QmluZFByb2dyYW1GcmFnbWVudChyc2MsIHBmKTsKLQotfQotCi1zdGF0aWMgdm9pZCBTQ19iaW5kUHJvZ3JhbVZlcnRleChSc1Byb2dyYW1WZXJ0ZXggcHYpCi17Ci0gICAgR0VUX1RMUygpOwotICAgIHJzaV9Db250ZXh0QmluZFByb2dyYW1WZXJ0ZXgocnNjLCBwdik7Ci0KLX0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBWUAotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLXN0YXRpYyB2b2lkIFNDX3ZwTG9hZE1vZGVsTWF0cml4KGNvbnN0IHJzY19NYXRyaXggKm0pCi17Ci0gICAgR0VUX1RMUygpOwotICAgIHJzYy0+Z2V0VmVydGV4KCktPnNldE1vZGVsdmlld01hdHJpeChtKTsKLX0KLQotc3RhdGljIHZvaWQgU0NfdnBMb2FkVGV4dHVyZU1hdHJpeChjb25zdCByc2NfTWF0cml4ICptKQotewotICAgIEdFVF9UTFMoKTsKLSAgICByc2MtPmdldFZlcnRleCgpLT5zZXRUZXh0dXJlTWF0cml4KG0pOwotfQotCi0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBEcmF3aW5nCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotc3RhdGljIHZvaWQgU0NfZHJhd0xpbmUoZmxvYXQgeDEsIGZsb2F0IHkxLCBmbG9hdCB6MSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHgyLCBmbG9hdCB5MiwgZmxvYXQgejIpCi17Ci0gICAgR0VUX1RMUygpOwotICAgIGlmICghcnNjLT5zZXR1cENoZWNrKCkpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGZsb2F0IHZ0eFtdID0geyB4MSwgeTEsIHoxLCB4MiwgeTIsIHoyIH07Ci0gICAgVmVydGV4QXJyYXkgdmE7Ci0gICAgdmEuYWRkTGVnYWN5KEdMX0ZMT0FULCAzLCAxMiwgUlNfS0lORF9QT1NJVElPTiwgZmFsc2UsICh1aW50MzJfdCl2dHgpOwotICAgIGlmIChyc2MtPmNoZWNrVmVyc2lvbjJfMCgpKSB7Ci0gICAgICAgIHZhLnNldHVwR0wyKHJzYywgJnJzYy0+bVN0YXRlVmVydGV4QXJyYXksICZyc2MtPm1TaGFkZXJDYWNoZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgdmEuc2V0dXBHTChyc2MsICZyc2MtPm1TdGF0ZVZlcnRleEFycmF5KTsKLSAgICB9Ci0KLSAgICBnbERyYXdBcnJheXMoR0xfTElORVMsIDAsIDIpOwotfQotCi1zdGF0aWMgdm9pZCBTQ19kcmF3UG9pbnQoZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeikKLXsKLSAgICBHRVRfVExTKCk7Ci0gICAgaWYgKCFyc2MtPnNldHVwQ2hlY2soKSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgZmxvYXQgdnR4W10gPSB7IHgsIHksIHogfTsKLQotICAgIFZlcnRleEFycmF5IHZhOwotICAgIHZhLmFkZExlZ2FjeShHTF9GTE9BVCwgMywgMTIsIFJTX0tJTkRfUE9TSVRJT04sIGZhbHNlLCAodWludDMyX3QpdnR4KTsKLSAgICBpZiAocnNjLT5jaGVja1ZlcnNpb24yXzAoKSkgewotICAgICAgICB2YS5zZXR1cEdMMihyc2MsICZyc2MtPm1TdGF0ZVZlcnRleEFycmF5LCAmcnNjLT5tU2hhZGVyQ2FjaGUpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHZhLnNldHVwR0wocnNjLCAmcnNjLT5tU3RhdGVWZXJ0ZXhBcnJheSk7Ci0gICAgfQotCi0gICAgZ2xEcmF3QXJyYXlzKEdMX1BPSU5UUywgMCwgMSk7Ci19Ci0KLXN0YXRpYyB2b2lkIFNDX2RyYXdRdWFkVGV4Q29vcmRzKGZsb2F0IHgxLCBmbG9hdCB5MSwgZmxvYXQgejEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB1MSwgZmxvYXQgdjEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB4MiwgZmxvYXQgeTIsIGZsb2F0IHoyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdTIsIGZsb2F0IHYyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeDMsIGZsb2F0IHkzLCBmbG9hdCB6MywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHUzLCBmbG9hdCB2MywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHg0LCBmbG9hdCB5NCwgZmxvYXQgejQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB1NCwgZmxvYXQgdjQpCi17Ci0gICAgR0VUX1RMUygpOwotICAgIGlmICghcnNjLT5zZXR1cENoZWNrKCkpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8vTE9HRSgiUXVhZCIpOwotICAgIC8vTE9HRSgiJTQuMmYsICU0LjJmLCAlNC4yZiIsIHgxLCB5MSwgejEpOwotICAgIC8vTE9HRSgiJTQuMmYsICU0LjJmLCAlNC4yZiIsIHgyLCB5MiwgejIpOwotICAgIC8vTE9HRSgiJTQuMmYsICU0LjJmLCAlNC4yZiIsIHgzLCB5MywgejMpOwotICAgIC8vTE9HRSgiJTQuMmYsICU0LjJmLCAlNC4yZiIsIHg0LCB5NCwgejQpOwotCi0gICAgZmxvYXQgdnR4W10gPSB7eDEseTEsejEsIHgyLHkyLHoyLCB4Myx5Myx6MywgeDQseTQsejR9OwotICAgIGNvbnN0IGZsb2F0IHRleFtdID0ge3UxLHYxLCB1Mix2MiwgdTMsdjMsIHU0LHY0fTsKLQotICAgIFZlcnRleEFycmF5IHZhOwotICAgIHZhLmFkZExlZ2FjeShHTF9GTE9BVCwgMywgMTIsIFJTX0tJTkRfUE9TSVRJT04sIGZhbHNlLCAodWludDMyX3QpdnR4KTsKLSAgICB2YS5hZGRMZWdhY3koR0xfRkxPQVQsIDIsIDgsIFJTX0tJTkRfVEVYVFVSRSwgZmFsc2UsICh1aW50MzJfdCl0ZXgpOwotICAgIGlmIChyc2MtPmNoZWNrVmVyc2lvbjJfMCgpKSB7Ci0gICAgICAgIHZhLnNldHVwR0wyKHJzYywgJnJzYy0+bVN0YXRlVmVydGV4QXJyYXksICZyc2MtPm1TaGFkZXJDYWNoZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgdmEuc2V0dXBHTChyc2MsICZyc2MtPm1TdGF0ZVZlcnRleEFycmF5KTsKLSAgICB9Ci0KLQotICAgIGdsRHJhd0FycmF5cyhHTF9UUklBTkdMRV9GQU4sIDAsIDQpOwotfQotCi1zdGF0aWMgdm9pZCBTQ19kcmF3UXVhZChmbG9hdCB4MSwgZmxvYXQgeTEsIGZsb2F0IHoxLAotICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeDIsIGZsb2F0IHkyLCBmbG9hdCB6MiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHgzLCBmbG9hdCB5MywgZmxvYXQgejMsCi0gICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB4NCwgZmxvYXQgeTQsIGZsb2F0IHo0KQotewotICAgIFNDX2RyYXdRdWFkVGV4Q29vcmRzKHgxLCB5MSwgejEsIDAsIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgeDIsIHkyLCB6MiwgMSwgMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICB4MywgeTMsIHozLCAxLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgIHg0LCB5NCwgejQsIDAsIDApOwotfQotCi1zdGF0aWMgdm9pZCBTQ19kcmF3U3ByaXRlU2NyZWVuc3BhY2UoZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeiwgZmxvYXQgdywgZmxvYXQgaCkKLXsKLSAgICBHRVRfVExTKCk7Ci0gICAgT2JqZWN0QmFzZVJlZjxjb25zdCBQcm9ncmFtVmVydGV4PiB0bXAocnNjLT5nZXRWZXJ0ZXgoKSk7Ci0gICAgcnNjLT5zZXRWZXJ0ZXgocnNjLT5nZXREZWZhdWx0UHJvZ3JhbVZlcnRleCgpKTsKLSAgICAvL3JzYy0+c2V0dXBDaGVjaygpOwotCi0gICAgLy9HTGludCBjcm9wWzRdID0gezAsIGgsIHcsIC1ofTsKLQotICAgIGZsb2F0IHNoID0gcnNjLT5nZXRIZWlnaHQoKTsKLQotICAgIFNDX2RyYXdRdWFkKHgsICAgc2ggLSB5LCAgICAgeiwKLSAgICAgICAgICAgICAgICB4K3csIHNoIC0geSwgICAgIHosCi0gICAgICAgICAgICAgICAgeCt3LCBzaCAtICh5K2gpLCB6LAotICAgICAgICAgICAgICAgIHgsICAgc2ggLSAoeStoKSwgeik7Ci0gICAgcnNjLT5zZXRWZXJ0ZXgoKFByb2dyYW1WZXJ0ZXggKil0bXAuZ2V0KCkpOwotfQotCi1zdGF0aWMgdm9pZCBTQ19kcmF3U3ByaXRlU2NyZWVuc3BhY2VDcm9wcGVkKGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHosIGZsb2F0IHcsIGZsb2F0IGgsCi0gICAgICAgIGZsb2F0IGN4MCwgZmxvYXQgY3kwLCBmbG9hdCBjeDEsIGZsb2F0IGN5MSkKLXsKLSAgICBHRVRfVExTKCk7Ci0gICAgaWYgKCFyc2MtPnNldHVwQ2hlY2soKSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgR0xpbnQgY3JvcFs0XSA9IHtjeDAsIGN5MCwgY3gxLCBjeTF9OwotICAgIGdsVGV4UGFyYW1ldGVyaXYoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9DUk9QX1JFQ1RfT0VTLCBjcm9wKTsKLSAgICBnbERyYXdUZXhmT0VTKHgsIHksIHosIHcsIGgpOwotfQotCi1zdGF0aWMgdm9pZCBTQ19kcmF3U3ByaXRlKGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHosIGZsb2F0IHcsIGZsb2F0IGgpCi17Ci0gICAgR0VUX1RMUygpOwotICAgIGZsb2F0IHZpblszXSA9IHt4LCB5LCB6fTsKLSAgICBmbG9hdCB2b3V0WzRdOwotCi0gICAgLy9MT0dFKCJkcyAgaW4gJWYgJWYgJWYiLCB4LCB5LCB6KTsKLSAgICByc2MtPmdldFZlcnRleCgpLT50cmFuc2Zvcm1Ub1NjcmVlbihyc2MsIHZvdXQsIHZpbik7Ci0gICAgLy9MT0dFKCJkcyAgb3V0ICVmICVmICVmICVmIiwgdm91dFswXSwgdm91dFsxXSwgdm91dFsyXSwgdm91dFszXSk7Ci0gICAgdm91dFswXSAvPSB2b3V0WzNdOwotICAgIHZvdXRbMV0gLz0gdm91dFszXTsKLSAgICB2b3V0WzJdIC89IHZvdXRbM107Ci0KLSAgICB2b3V0WzBdICo9IHJzYy0+Z2V0V2lkdGgoKSAvIDI7Ci0gICAgdm91dFsxXSAqPSByc2MtPmdldEhlaWdodCgpIC8gMjsKLSAgICB2b3V0WzBdICs9IHJzYy0+Z2V0V2lkdGgoKSAvIDI7Ci0gICAgdm91dFsxXSArPSByc2MtPmdldEhlaWdodCgpIC8gMjsKLQotICAgIHZvdXRbMF0gLT0gdy8yOwotICAgIHZvdXRbMV0gLT0gaC8yOwotCi0gICAgLy9MT0dFKCJkcyAgb3V0MiAlZiAlZiAlZiIsIHZvdXRbMF0sIHZvdXRbMV0sIHZvdXRbMl0pOwotCi0gICAgLy8gVSwgViwgVywgSAotICAgIFNDX2RyYXdTcHJpdGVTY3JlZW5zcGFjZSh2b3V0WzBdLCB2b3V0WzFdLCB6LCBoLCB3KTsKLSAgICAvL3JzYy0+c2V0dXBDaGVjaygpOwotfQotCi0KLXN0YXRpYyB2b2lkIFNDX2RyYXdSZWN0KGZsb2F0IHgxLCBmbG9hdCB5MSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHgyLCBmbG9hdCB5MiwgZmxvYXQgeikKLXsKLSAgICBTQ19kcmF3UXVhZCh4MSwgeTIsIHosCi0gICAgICAgICAgICAgICAgeDIsIHkyLCB6LAotICAgICAgICAgICAgICAgIHgyLCB5MSwgeiwKLSAgICAgICAgICAgICAgICB4MSwgeTEsIHopOwotfQotCi1zdGF0aWMgdm9pZCBTQ19kcmF3U2ltcGxlTWVzaChSc1NpbXBsZU1lc2ggdnNtKQotewotICAgIEdFVF9UTFMoKTsKLSAgICBTaW1wbGVNZXNoICpzbSA9IHN0YXRpY19jYXN0PFNpbXBsZU1lc2ggKj4odnNtKTsKLSAgICBpZiAoIXJzYy0+c2V0dXBDaGVjaygpKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgc20tPnJlbmRlcihyc2MpOwotfQotCi1zdGF0aWMgdm9pZCBTQ19kcmF3U2ltcGxlTWVzaFJhbmdlKFJzU2ltcGxlTWVzaCB2c20sIHVpbnQzMl90IHN0YXJ0LCB1aW50MzJfdCBsZW4pCi17Ci0gICAgR0VUX1RMUygpOwotICAgIFNpbXBsZU1lc2ggKnNtID0gc3RhdGljX2Nhc3Q8U2ltcGxlTWVzaCAqPih2c20pOwotICAgIGlmICghcnNjLT5zZXR1cENoZWNrKCkpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBzbS0+cmVuZGVyUmFuZ2UocnNjLCBzdGFydCwgbGVuKTsKLX0KLQotCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIC8vCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAotc3RhdGljIHZvaWQgU0NfY29sb3IoZmxvYXQgciwgZmxvYXQgZywgZmxvYXQgYiwgZmxvYXQgYSkKK3N0YXRpYyB1aW50MzJfdCBTQ19hbGxvY0dldERpbVgoUnNBbGxvY2F0aW9uIHZhKQogewogICAgIEdFVF9UTFMoKTsKLSAgICByc2MtPm1TdGF0ZVZlcnRleC5jb2xvclswXSA9IHI7Ci0gICAgcnNjLT5tU3RhdGVWZXJ0ZXguY29sb3JbMV0gPSBnOwotICAgIHJzYy0+bVN0YXRlVmVydGV4LmNvbG9yWzJdID0gYjsKLSAgICByc2MtPm1TdGF0ZVZlcnRleC5jb2xvclszXSA9IGE7Ci0gICAgaWYgKCFyc2MtPmNoZWNrVmVyc2lvbjJfMCgpKSB7Ci0gICAgICAgIGdsQ29sb3I0ZihyLCBnLCBiLCBhKTsKLSAgICB9CisgICAgY29uc3QgQWxsb2NhdGlvbiAqYSA9IHN0YXRpY19jYXN0PGNvbnN0IEFsbG9jYXRpb24gKj4odmEpOworICAgIC8vTE9HRSgiU0NfYWxsb2NHZXREaW1YIGE9JXAiLCBhKTsKKyAgICAvL0xPR0UoIiB0eXBlPSVwIiwgYS0+Z2V0VHlwZSgpKTsKKyAgICByZXR1cm4gYS0+Z2V0VHlwZSgpLT5nZXREaW1YKCk7CiB9CiAKLXN0YXRpYyB2b2lkIFNDX2FtYmllbnQoZmxvYXQgciwgZmxvYXQgZywgZmxvYXQgYiwgZmxvYXQgYSkKLXsKLSAgICBHTGZsb2F0IHBhcmFtc1tdID0geyByLCBnLCBiLCBhIH07Ci0gICAgZ2xNYXRlcmlhbGZ2KEdMX0ZST05UX0FORF9CQUNLLCBHTF9BTUJJRU5ULCBwYXJhbXMpOwotfQotCi1zdGF0aWMgdm9pZCBTQ19kaWZmdXNlKGZsb2F0IHIsIGZsb2F0IGcsIGZsb2F0IGIsIGZsb2F0IGEpCi17Ci0gICAgR0xmbG9hdCBwYXJhbXNbXSA9IHsgciwgZywgYiwgYSB9OwotICAgIGdsTWF0ZXJpYWxmdihHTF9GUk9OVF9BTkRfQkFDSywgR0xfRElGRlVTRSwgcGFyYW1zKTsKLX0KLQotc3RhdGljIHZvaWQgU0Nfc3BlY3VsYXIoZmxvYXQgciwgZmxvYXQgZywgZmxvYXQgYiwgZmxvYXQgYSkKLXsKLSAgICBHTGZsb2F0IHBhcmFtc1tdID0geyByLCBnLCBiLCBhIH07Ci0gICAgZ2xNYXRlcmlhbGZ2KEdMX0ZST05UX0FORF9CQUNLLCBHTF9TUEVDVUxBUiwgcGFyYW1zKTsKLX0KLQotc3RhdGljIHZvaWQgU0NfZW1pc3Npb24oZmxvYXQgciwgZmxvYXQgZywgZmxvYXQgYiwgZmxvYXQgYSkKLXsKLSAgICBHTGZsb2F0IHBhcmFtc1tdID0geyByLCBnLCBiLCBhIH07Ci0gICAgZ2xNYXRlcmlhbGZ2KEdMX0ZST05UX0FORF9CQUNLLCBHTF9FTUlTU0lPTiwgcGFyYW1zKTsKLX0KLQotc3RhdGljIHZvaWQgU0Nfc2hpbmluZXNzKGZsb2F0IHMpCi17Ci0gICAgZ2xNYXRlcmlhbGYoR0xfRlJPTlRfQU5EX0JBQ0ssIEdMX1NISU5JTkVTUywgcyk7Ci19Ci0KLXN0YXRpYyB2b2lkIFNDX3BvaW50QXR0ZW51YXRpb24oZmxvYXQgYSwgZmxvYXQgYiwgZmxvYXQgYykKLXsKLSAgICBHTGZsb2F0IHBhcmFtc1tdID0geyBhLCBiLCBjIH07Ci0gICAgZ2xQb2ludFBhcmFtZXRlcmZ2KEdMX1BPSU5UX0RJU1RBTkNFX0FUVEVOVUFUSU9OLCBwYXJhbXMpOwotfQotCi1zdGF0aWMgdm9pZCBTQ19oc2JUb1JnYihmbG9hdCBoLCBmbG9hdCBzLCBmbG9hdCBiLCBmbG9hdCogcmdiKQotewotICAgIGZsb2F0IHJlZCA9IDAuMGY7Ci0gICAgZmxvYXQgZ3JlZW4gPSAwLjBmOwotICAgIGZsb2F0IGJsdWUgPSAwLjBmOwotCi0gICAgZmxvYXQgeCA9IGg7Ci0gICAgZmxvYXQgeSA9IHM7Ci0gICAgZmxvYXQgeiA9IGI7Ci0KLSAgICBmbG9hdCBoZiA9ICh4IC0gKGludCkgeCkgKiA2LjBmOwotICAgIGludCBpaGYgPSAoaW50KSBoZjsKLSAgICBmbG9hdCBmID0gaGYgLSBpaGY7Ci0gICAgZmxvYXQgcHYgPSB6ICogKDEuMGYgLSB5KTsKLSAgICBmbG9hdCBxdiA9IHogKiAoMS4wZiAtIHkgKiBmKTsKLSAgICBmbG9hdCB0diA9IHogKiAoMS4wZiAtIHkgKiAoMS4wZiAtIGYpKTsKLQotICAgIHN3aXRjaCAoaWhmKSB7Ci0gICAgICAgIGNhc2UgMDogICAgICAgICAvLyBSZWQgaXMgdGhlIGRvbWluYW50IGNvbG9yCi0gICAgICAgICAgICByZWQgPSB6OwotICAgICAgICAgICAgZ3JlZW4gPSB0djsKLSAgICAgICAgICAgIGJsdWUgPSBwdjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDE6ICAgICAgICAgLy8gR3JlZW4gaXMgdGhlIGRvbWluYW50IGNvbG9yCi0gICAgICAgICAgICByZWQgPSBxdjsKLSAgICAgICAgICAgIGdyZWVuID0gejsKLSAgICAgICAgICAgIGJsdWUgPSBwdjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICByZWQgPSBwdjsKLSAgICAgICAgICAgIGdyZWVuID0gejsKLSAgICAgICAgICAgIGJsdWUgPSB0djsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDM6ICAgICAgICAgLy8gQmx1ZSBpcyB0aGUgZG9taW5hbnQgY29sb3IKLSAgICAgICAgICAgIHJlZCA9IHB2OwotICAgICAgICAgICAgZ3JlZW4gPSBxdjsKLSAgICAgICAgICAgIGJsdWUgPSB6OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNDoKLSAgICAgICAgICAgIHJlZCA9IHR2OwotICAgICAgICAgICAgZ3JlZW4gPSBwdjsKLSAgICAgICAgICAgIGJsdWUgPSB6OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNTogICAgICAgICAvLyBSZWQgaXMgdGhlIGRvbWluYW50IGNvbG9yCi0gICAgICAgICAgICByZWQgPSB6OwotICAgICAgICAgICAgZ3JlZW4gPSBwdjsKLSAgICAgICAgICAgIGJsdWUgPSBxdjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIHJnYlswXSA9IHJlZDsKLSAgICByZ2JbMV0gPSBncmVlbjsKLSAgICByZ2JbMl0gPSBibHVlOwotfQotCi1zdGF0aWMgaW50IFNDX2hzYlRvQWJncihmbG9hdCBoLCBmbG9hdCBzLCBmbG9hdCBiLCBmbG9hdCBhKQotewotICAgIGZsb2F0IHJnYlszXTsKLSAgICBTQ19oc2JUb1JnYihoLCBzLCBiLCByZ2IpOwotICAgIHJldHVybiBpbnQoYSAgICAgICogMjU1LjBmKSA8PCAyNCB8Ci0gICAgICAgICAgIGludChyZ2JbMl0gKiAyNTUuMGYpIDw8IDE2IHwKLSAgICAgICAgICAgaW50KHJnYlsxXSAqIDI1NS4wZikgPDwgIDggfAotICAgICAgICAgICBpbnQocmdiWzBdICogMjU1LjBmKTsKLX0KLQotc3RhdGljIHZvaWQgU0NfaHNiKGZsb2F0IGgsIGZsb2F0IHMsIGZsb2F0IGIsIGZsb2F0IGEpCitzdGF0aWMgdWludDMyX3QgU0NfYWxsb2NHZXREaW1ZKFJzQWxsb2NhdGlvbiB2YSkKIHsKICAgICBHRVRfVExTKCk7Ci0gICAgZmxvYXQgcmdiWzNdOwotICAgIFNDX2hzYlRvUmdiKGgsIHMsIGIsIHJnYik7Ci0gICAgaWYgKHJzYy0+Y2hlY2tWZXJzaW9uMl8wKCkpIHsKLSAgICAgICAgZ2xWZXJ0ZXhBdHRyaWI0ZigxLCByZ2JbMF0sIHJnYlsxXSwgcmdiWzJdLCBhKTsKLSAgICB9IGVsc2UgewotICAgICAgICBnbENvbG9yNGYocmdiWzBdLCByZ2JbMV0sIHJnYlsyXSwgYSk7Ci0gICAgfQorICAgIGNvbnN0IEFsbG9jYXRpb24gKmEgPSBzdGF0aWNfY2FzdDxjb25zdCBBbGxvY2F0aW9uICo+KHZhKTsKKyAgICByZXR1cm4gYS0+Z2V0VHlwZSgpLT5nZXREaW1ZKCk7CiB9CiAKLXN0YXRpYyB2b2lkIFNDX3VwbG9hZFRvVGV4dHVyZShSc0FsbG9jYXRpb24gdmEsIHVpbnQzMl90IGJhc2VNaXBMZXZlbCkKK3N0YXRpYyB1aW50MzJfdCBTQ19hbGxvY0dldERpbVooUnNBbGxvY2F0aW9uIHZhKQogewogICAgIEdFVF9UTFMoKTsKLSAgICByc2lfQWxsb2NhdGlvblVwbG9hZFRvVGV4dHVyZShyc2MsIHZhLCBmYWxzZSwgYmFzZU1pcExldmVsKTsKKyAgICBjb25zdCBBbGxvY2F0aW9uICphID0gc3RhdGljX2Nhc3Q8Y29uc3QgQWxsb2NhdGlvbiAqPih2YSk7CisgICAgcmV0dXJuIGEtPmdldFR5cGUoKS0+Z2V0RGltWigpOwogfQogCi1zdGF0aWMgdm9pZCBTQ191cGxvYWRUb0J1ZmZlck9iamVjdChSc0FsbG9jYXRpb24gdmEpCitzdGF0aWMgdWludDMyX3QgU0NfYWxsb2NHZXREaW1MT0QoUnNBbGxvY2F0aW9uIHZhKQogewogICAgIEdFVF9UTFMoKTsKLSAgICByc2lfQWxsb2NhdGlvblVwbG9hZFRvQnVmZmVyT2JqZWN0KHJzYywgdmEpOworICAgIGNvbnN0IEFsbG9jYXRpb24gKmEgPSBzdGF0aWNfY2FzdDxjb25zdCBBbGxvY2F0aW9uICo+KHZhKTsKKyAgICByZXR1cm4gYS0+Z2V0VHlwZSgpLT5nZXREaW1MT0QoKTsKIH0KIAotc3RhdGljIHZvaWQgU0Nfc3luY1RvR0woUnNBbGxvY2F0aW9uIHZhKQorc3RhdGljIHVpbnQzMl90IFNDX2FsbG9jR2V0RGltRmFjZXMoUnNBbGxvY2F0aW9uIHZhKQogewogICAgIEdFVF9UTFMoKTsKLSAgICBBbGxvY2F0aW9uICphID0gc3RhdGljX2Nhc3Q8QWxsb2NhdGlvbiAqPih2YSk7Ci0KKyAgICBjb25zdCBBbGxvY2F0aW9uICphID0gc3RhdGljX2Nhc3Q8Y29uc3QgQWxsb2NhdGlvbiAqPih2YSk7CisgICAgcmV0dXJuIGEtPmdldFR5cGUoKS0+Z2V0RGltRmFjZXMoKTsKIH0KIAotc3RhdGljIHZvaWQgU0NfQ2xlYXJDb2xvcihmbG9hdCByLCBmbG9hdCBnLCBmbG9hdCBiLCBmbG9hdCBhKQotewotICAgIC8vTE9HRSgiYyAlZiAlZiAlZiAlZiIsIHIsIGcsIGIsIGEpOwotICAgIEdFVF9UTFMoKTsKLSAgICBzYy0+bUVudmlyb21lbnQubUNsZWFyQ29sb3JbMF0gPSByOwotICAgIHNjLT5tRW52aXJvbWVudC5tQ2xlYXJDb2xvclsxXSA9IGc7Ci0gICAgc2MtPm1FbnZpcm9tZW50Lm1DbGVhckNvbG9yWzJdID0gYjsKLSAgICBzYy0+bUVudmlyb21lbnQubUNsZWFyQ29sb3JbM10gPSBhOwotfQogCi1zdGF0aWMgdm9pZCBTQ19kZWJ1Z0YoY29uc3QgY2hhciAqcywgZmxvYXQgZikKLXsKLSAgICBMT0dFKCIlcyAlZiIsIHMsIGYpOwotfQogCi1zdGF0aWMgdm9pZCBTQ19kZWJ1Z0hleEYoY29uc3QgY2hhciAqcywgZmxvYXQgZikKLXsKLSAgICBMT0dFKCIlcyAweCV4IiwgcywgKigoaW50ICopICgmZikpKTsKK3N0YXRpYyB2b2lkIFNDX2RlYnVnRihjb25zdCBjaGFyICpzLCBmbG9hdCBmKSB7CisgICAgTE9HRSgiJXMgJWYsIDB4JTA4eCIsIHMsIGYsICooKGludCAqKSAoJmYpKSk7CiB9Ci0KLXN0YXRpYyB2b2lkIFNDX2RlYnVnSTMyKGNvbnN0IGNoYXIgKnMsIGludDMyX3QgaSkKLXsKLSAgICBMT0dFKCIlcyAlaSIsIHMsIGkpOworc3RhdGljIHZvaWQgU0NfZGVidWdGdjIoY29uc3QgY2hhciAqcywgcnN2Rl8yIGZ2KSB7CisgICAgZmxvYXQgKmYgPSAoZmxvYXQgKikmZnY7CisgICAgTE9HRSgiJXMgeyVmLCAlZn0iLCBzLCBmWzBdLCBmWzFdKTsKIH0KLQotc3RhdGljIHZvaWQgU0NfZGVidWdIZXhJMzIoY29uc3QgY2hhciAqcywgaW50MzJfdCBpKQotewotICAgIExPR0UoIiVzIDB4JXgiLCBzLCBpKTsKK3N0YXRpYyB2b2lkIFNDX2RlYnVnRnYzKGNvbnN0IGNoYXIgKnMsIHJzdkZfNCBmdikgeworICAgIGZsb2F0ICpmID0gKGZsb2F0ICopJmZ2OworICAgIExPR0UoIiVzIHslZiwgJWYsICVmfSIsIHMsIGZbMF0sIGZbMV0sIGZbMl0pOwogfQotCi1zdGF0aWMgdWludDMyX3QgU0NfZ2V0V2lkdGgoKQotewotICAgIEdFVF9UTFMoKTsKLSAgICByZXR1cm4gcnNjLT5nZXRXaWR0aCgpOworc3RhdGljIHZvaWQgU0NfZGVidWdGdjQoY29uc3QgY2hhciAqcywgcnN2Rl80IGZ2KSB7CisgICAgZmxvYXQgKmYgPSAoZmxvYXQgKikmZnY7CisgICAgTE9HRSgiJXMgeyVmLCAlZiwgJWYsICVmfSIsIHMsIGZbMF0sIGZbMV0sIGZbMl0sIGZbM10pOwogfQotCi1zdGF0aWMgdWludDMyX3QgU0NfZ2V0SGVpZ2h0KCkKLXsKLSAgICBHRVRfVExTKCk7Ci0gICAgcmV0dXJuIHJzYy0+Z2V0SGVpZ2h0KCk7Ci19Ci0KLXN0YXRpYyB1aW50MzJfdCBTQ19jb2xvckZsb2F0UkdCQXRvVU5vcm04KGZsb2F0IHIsIGZsb2F0IGcsIGZsb2F0IGIsIGZsb2F0IGEpCi17Ci0gICAgdWludDMyX3QgYyA9IDA7Ci0gICAgYyB8PSAodWludDMyX3QpKHIgKiAyNTUuZiArIDAuNWYpOwotICAgIGMgfD0gKCh1aW50MzJfdCkoZyAqIDI1NS5mICsgMC41ZikpIDw8IDg7Ci0gICAgYyB8PSAoKHVpbnQzMl90KShiICogMjU1LmYgKyAwLjVmKSkgPDwgMTY7Ci0gICAgYyB8PSAoKHVpbnQzMl90KShhICogMjU1LmYgKyAwLjVmKSkgPDwgMjQ7Ci0gICAgcmV0dXJuIGM7Ci19Ci0KLXN0YXRpYyB1aW50MzJfdCBTQ19jb2xvckZsb2F0UkdCQXRvNTY1KGZsb2F0IHIsIGZsb2F0IGcsIGZsb2F0IGIpCi17Ci0gICAgdWludDMyX3QgaXIgPSAodWludDMyX3QpKHIgKiAyNTUuZiArIDAuNWYpOwotICAgIHVpbnQzMl90IGlnID0gKHVpbnQzMl90KShnICogMjU1LmYgKyAwLjVmKTsKLSAgICB1aW50MzJfdCBpYiA9ICh1aW50MzJfdCkoYiAqIDI1NS5mICsgMC41Zik7Ci0gICAgcmV0dXJuIHJzODg4dG81NjUoaXIsIGlnLCBpYik7CitzdGF0aWMgdm9pZCBTQ19kZWJ1Z0kzMihjb25zdCBjaGFyICpzLCBpbnQzMl90IGkpIHsKKyAgICBMT0dFKCIlcyAlaSAgMHgleCIsIHMsIGksIGkpOwogfQogCiBzdGF0aWMgdWludDMyX3QgU0NfdG9DbGllbnQodm9pZCAqZGF0YSwgaW50IGNtZElELCBpbnQgbGVuLCBpbnQgd2FpdEZvclNwYWNlKQogewogICAgIEdFVF9UTFMoKTsKKyAgICAvL0xPR0UoIlNDX3RvQ2xpZW50ICVpICVpICVpIiwgY21kSUQsIGxlbiwgd2FpdEZvclNwYWNlKTsKICAgICByZXR1cm4gcnNjLT5zZW5kTWVzc2FnZVRvQ2xpZW50KGRhdGEsIGNtZElELCBsZW4sIHdhaXRGb3JTcGFjZSAhPSAwKTsKIH0KIAogc3RhdGljIHZvaWQgU0Nfc2NyaXB0Q2FsbChpbnQgc2NyaXB0SUQpCiB7CiAgICAgR0VUX1RMUygpOwotICAgIHJzYy0+cnVuU2NyaXB0KChTY3JpcHQgKilzY3JpcHRJRCwgMCk7CisgICAgcnNjLT5ydW5TY3JpcHQoKFNjcmlwdCAqKXNjcmlwdElEKTsKK30KKworaW50IFNDX2RpdnNpMyhpbnQgYSwgaW50IGIpCit7CisgICAgcmV0dXJuIGEgLyBiOworfQorCitpbnQgU0NfZ2V0QWxsb2NhdGlvbihjb25zdCB2b2lkICpwdHIpCit7CisgICAgR0VUX1RMUygpOworICAgIGNvbnN0IEFsbG9jYXRpb24gKmFsbG9jID0gc2MtPnB0clRvQWxsb2NhdGlvbihwdHIpOworICAgIHJldHVybiAoaW50KWFsbG9jOworfQorCisKK3ZvaWQgU0NfRm9yRWFjaGlpKFJzU2NyaXB0IHZzLCBSc0FsbG9jYXRpb24gdmluKQoreworICAgIEdFVF9UTFMoKTsKKyAgICBTY3JpcHQgKnMgPSBzdGF0aWNfY2FzdDxTY3JpcHQgKj4odnMpOworICAgIEFsbG9jYXRpb24gKmFpbiA9IHN0YXRpY19jYXN0PEFsbG9jYXRpb24gKj4odmluKTsKKyAgICBzLT5ydW5Gb3JFYWNoKHJzYywgYWluLCBOVUxMKTsKK30KKwordm9pZCBTQ19Gb3JFYWNoaWlpKFJzU2NyaXB0IHZzLCBSc0FsbG9jYXRpb24gdmluLCBSc0FsbG9jYXRpb24gdm91dCkKK3sKKyAgICBHRVRfVExTKCk7CisgICAgU2NyaXB0ICpzID0gc3RhdGljX2Nhc3Q8U2NyaXB0ICo+KHZzKTsKKyAgICBBbGxvY2F0aW9uICphaW4gPSBzdGF0aWNfY2FzdDxBbGxvY2F0aW9uICo+KHZpbik7CisgICAgQWxsb2NhdGlvbiAqYW91dCA9IHN0YXRpY19jYXN0PEFsbG9jYXRpb24gKj4odm91dCk7CisgICAgcy0+cnVuRm9yRWFjaChyc2MsIGFpbiwgYW91dCk7Cit9CisKK3ZvaWQgU0NfRm9yRWFjaGlpaWkoUnNTY3JpcHQgdnMsIFJzQWxsb2NhdGlvbiB2aW4sIGludCB4U3RhcnQsIGludCB4RW5kKQoreworICAgIEdFVF9UTFMoKTsKKyAgICBTY3JpcHQgKnMgPSBzdGF0aWNfY2FzdDxTY3JpcHQgKj4odnMpOworICAgIEFsbG9jYXRpb24gKmFpbiA9IHN0YXRpY19jYXN0PEFsbG9jYXRpb24gKj4odmluKTsKKyAgICBzLT5ydW5Gb3JFYWNoKHJzYywgYWluLCBOVUxMLCB4U3RhcnQsIHhFbmQpOworfQorCit2b2lkIFNDX0ZvckVhY2hpaWlpaShSc1NjcmlwdCB2cywgUnNBbGxvY2F0aW9uIHZpbiwgUnNBbGxvY2F0aW9uIHZvdXQsIGludCB4U3RhcnQsIGludCB4RW5kKQoreworICAgIEdFVF9UTFMoKTsKKyAgICBTY3JpcHQgKnMgPSBzdGF0aWNfY2FzdDxTY3JpcHQgKj4odnMpOworICAgIEFsbG9jYXRpb24gKmFpbiA9IHN0YXRpY19jYXN0PEFsbG9jYXRpb24gKj4odmluKTsKKyAgICBBbGxvY2F0aW9uICphb3V0ID0gc3RhdGljX2Nhc3Q8QWxsb2NhdGlvbiAqPih2b3V0KTsKKyAgICBzLT5ydW5Gb3JFYWNoKHJzYywgYWluLCBhb3V0LCB4U3RhcnQsIHhFbmQpOworfQorCit2b2lkIFNDX0ZvckVhY2hpaWlpaWkoUnNTY3JpcHQgdnMsIFJzQWxsb2NhdGlvbiB2aW4sIGludCB4U3RhcnQsIGludCB5U3RhcnQsIGludCB4RW5kLCBpbnQgeUVuZCkKK3sKKyAgICBHRVRfVExTKCk7CisgICAgU2NyaXB0ICpzID0gc3RhdGljX2Nhc3Q8U2NyaXB0ICo+KHZzKTsKKyAgICBBbGxvY2F0aW9uICphaW4gPSBzdGF0aWNfY2FzdDxBbGxvY2F0aW9uICo+KHZpbik7CisgICAgcy0+cnVuRm9yRWFjaChyc2MsIGFpbiwgTlVMTCwgeFN0YXJ0LCB5U3RhcnQsIHhFbmQsIHlFbmQpOworfQorCit2b2lkIFNDX0ZvckVhY2hpaWlpaWlpKFJzU2NyaXB0IHZzLCBSc0FsbG9jYXRpb24gdmluLCBSc0FsbG9jYXRpb24gdm91dCwgaW50IHhTdGFydCwgaW50IHlTdGFydCwgaW50IHhFbmQsIGludCB5RW5kKQoreworICAgIEdFVF9UTFMoKTsKKyAgICBTY3JpcHQgKnMgPSBzdGF0aWNfY2FzdDxTY3JpcHQgKj4odnMpOworICAgIEFsbG9jYXRpb24gKmFpbiA9IHN0YXRpY19jYXN0PEFsbG9jYXRpb24gKj4odmluKTsKKyAgICBBbGxvY2F0aW9uICphb3V0ID0gc3RhdGljX2Nhc3Q8QWxsb2NhdGlvbiAqPih2b3V0KTsKKyAgICBzLT5ydW5Gb3JFYWNoKHJzYywgYWluLCBhb3V0LCB4U3RhcnQsIHlTdGFydCwgeEVuZCwgeUVuZCk7CiB9CiAKIApAQCAtMTA4MCwzMTEgKzQzMiw5MiBAQAogLy8gQ2xhc3MgaW1wbGVtZW50YXRpb24KIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCi1TY3JpcHRDU3RhdGU6OlN5bWJvbFRhYmxlX3QgU2NyaXB0Q1N0YXRlOjpnU3ltc1tdID0gewotICAgIC8vIElPCi0gICAgeyAibG9hZEkzMiIsICh2b2lkICopJlNDX2xvYWRJMzIsCi0gICAgICAgICJpbnQiLCAiKGludCwgaW50KSIgfSwKLSAgICAvL3sgImxvYWRVMzIiLCAodm9pZCAqKSZTQ19sb2FkVTMyLCAidW5zaWduZWQgaW50IiwgIihpbnQsIGludCkiIH0sCi0gICAgeyAibG9hZEYiLCAodm9pZCAqKSZTQ19sb2FkRiwKLSAgICAgICAgImZsb2F0IiwgIihpbnQsIGludCkiIH0sCi0gICAgeyAibG9hZEFycmF5RiIsICh2b2lkICopJlNDX2xvYWRBcnJheUYsCi0gICAgICAgICJmbG9hdCoiLCAiKGludCwgaW50KSIgfSwKLSAgICB7ICJsb2FkQXJyYXlJMzIiLCAodm9pZCAqKSZTQ19sb2FkQXJyYXlJMzIsCi0gICAgICAgICJpbnQqIiwgIihpbnQsIGludCkiIH0sCi0gICAgeyAibG9hZFZlYzQiLCAodm9pZCAqKSZTQ19sb2FkVmVjNCwKLSAgICAgICAgInZvaWQiLCAiKGludCwgaW50LCBmbG9hdCAqKSIgfSwKLSAgICB7ICJsb2FkTWF0cml4IiwgKHZvaWQgKikmU0NfbG9hZE1hdHJpeCwKLSAgICAgICAgInZvaWQiLCAiKGludCwgaW50LCBmbG9hdCAqKSIgfSwKLSAgICB7ICJzdG9yZUkzMiIsICh2b2lkICopJlNDX3N0b3JlSTMyLAotICAgICAgICAidm9pZCIsICIoaW50LCBpbnQsIGludCkiIH0sCi0gICAgLy97ICJzdG9yZVUzMiIsICh2b2lkICopJlNDX3N0b3JlVTMyLCAidm9pZCIsICIoaW50LCBpbnQsIHVuc2lnbmVkIGludCkiIH0sCi0gICAgeyAic3RvcmVGIiwgKHZvaWQgKikmU0Nfc3RvcmVGLAotICAgICAgICAidm9pZCIsICIoaW50LCBpbnQsIGZsb2F0KSIgfSwKLSAgICB7ICJzdG9yZVZlYzQiLCAodm9pZCAqKSZTQ19zdG9yZVZlYzQsCi0gICAgICAgICJ2b2lkIiwgIihpbnQsIGludCwgZmxvYXQgKikiIH0sCi0gICAgeyAic3RvcmVNYXRyaXgiLCAodm9pZCAqKSZTQ19zdG9yZU1hdHJpeCwKLSAgICAgICAgInZvaWQiLCAiKGludCwgaW50LCBmbG9hdCAqKSIgfSwKLSAgICB7ICJsb2FkU2ltcGxlTWVzaFZlcnRpY2VzRiIsICh2b2lkICopJlNDX2xvYWRTaW1wbGVNZXNoVmVydGljZXNGLAotICAgICAgICAiZmxvYXQqIiwgIihpbnQsIGludCkiIH0sCi0gICAgeyAidXBkYXRlU2ltcGxlTWVzaCIsICh2b2lkICopJlNDX3VwZGF0ZVNpbXBsZU1lc2gsCi0gICAgICAgICJ2b2lkIiwgIihpbnQpIiB9LAorLy8gbGx2bSBuYW1lIG1hbmdsaW5nIHJlZgorLy8gIDxidWlsdGluLXR5cGU+IDo6PSB2ICAjIHZvaWQKKy8vICAgICAgICAgICAgICAgICA6Oj0gYiAgIyBib29sCisvLyAgICAgICAgICAgICAgICAgOjo9IGMgICMgY2hhcgorLy8gICAgICAgICAgICAgICAgIDo6PSBhICAjIHNpZ25lZCBjaGFyCisvLyAgICAgICAgICAgICAgICAgOjo9IGggICMgdW5zaWduZWQgY2hhcgorLy8gICAgICAgICAgICAgICAgIDo6PSBzICAjIHNob3J0CisvLyAgICAgICAgICAgICAgICAgOjo9IHQgICMgdW5zaWduZWQgc2hvcnQKKy8vICAgICAgICAgICAgICAgICA6Oj0gaSAgIyBpbnQKKy8vICAgICAgICAgICAgICAgICA6Oj0gaiAgIyB1bnNpZ25lZCBpbnQKKy8vICAgICAgICAgICAgICAgICA6Oj0gbCAgIyBsb25nCisvLyAgICAgICAgICAgICAgICAgOjo9IG0gICMgdW5zaWduZWQgbG9uZworLy8gICAgICAgICAgICAgICAgIDo6PSB4ICAjIGxvbmcgbG9uZywgX19pbnQ2NAorLy8gICAgICAgICAgICAgICAgIDo6PSB5ICAjIHVuc2lnbmVkIGxvbmcgbG9uZywgX19pbnQ2NAorLy8gICAgICAgICAgICAgICAgIDo6PSBmICAjIGZsb2F0CisvLyAgICAgICAgICAgICAgICAgOjo9IGQgICMgZG91YmxlCiAKLSAgICAvLyBtYXRoCi0gICAgeyAibW9kZiIsICh2b2lkICopJmZtb2QsCi0gICAgICAgICJmbG9hdCIsICIoZmxvYXQsIGZsb2F0KSIgfSwKLSAgICB7ICJhYnMiLCAodm9pZCAqKSZhYnMsCi0gICAgICAgICJpbnQiLCAiKGludCkiIH0sCi0gICAgeyAiYWJzZiIsICh2b2lkICopJmZhYnNmLAotICAgICAgICAiZmxvYXQiLCAiKGZsb2F0KSIgfSwKLSAgICB7ICJzaW5mX2Zhc3QiLCAodm9pZCAqKSZTQ19zaW5mX2Zhc3QsCi0gICAgICAgICJmbG9hdCIsICIoZmxvYXQpIiB9LAotICAgIHsgImNvc2ZfZmFzdCIsICh2b2lkICopJlNDX2Nvc2ZfZmFzdCwKLSAgICAgICAgImZsb2F0IiwgIihmbG9hdCkiIH0sCi0gICAgeyAic2luZiIsICh2b2lkICopJnNpbmYsCi0gICAgICAgICJmbG9hdCIsICIoZmxvYXQpIiB9LAotICAgIHsgImNvc2YiLCAodm9pZCAqKSZjb3NmLAotICAgICAgICAiZmxvYXQiLCAiKGZsb2F0KSIgfSwKLSAgICB7ICJhc2luZiIsICh2b2lkICopJmFzaW5mLAotICAgICAgICAiZmxvYXQiLCAiKGZsb2F0KSIgfSwKLSAgICB7ICJhY29zZiIsICh2b2lkICopJmFjb3NmLAotICAgICAgICAiZmxvYXQiLCAiKGZsb2F0KSIgfSwKLSAgICB7ICJhdGFuZiIsICh2b2lkICopJmF0YW5mLAotICAgICAgICAiZmxvYXQiLCAiKGZsb2F0KSIgfSwKLSAgICB7ICJhdGFuMmYiLCAodm9pZCAqKSZhdGFuMmYsCi0gICAgICAgICJmbG9hdCIsICIoZmxvYXQsIGZsb2F0KSIgfSwKLSAgICB7ICJmYWJzZiIsICh2b2lkICopJmZhYnNmLAotICAgICAgICAiZmxvYXQiLCAiKGZsb2F0KSIgfSwKLSAgICB7ICJyYW5kZiIsICh2b2lkICopJlNDX3JhbmRmLAotICAgICAgICAiZmxvYXQiLCAiKGZsb2F0KSIgfSwKLSAgICB7ICJyYW5kZjIiLCAodm9pZCAqKSZTQ19yYW5kZjIsCi0gICAgICAgICJmbG9hdCIsICIoZmxvYXQsIGZsb2F0KSIgfSwKLSAgICB7ICJmbG9vcmYiLCAodm9pZCAqKSZmbG9vcmYsCi0gICAgICAgICJmbG9hdCIsICIoZmxvYXQpIiB9LAotICAgIHsgImZyYWNmIiwgKHZvaWQgKikmU0NfZnJhY2YsCi0gICAgICAgICJmbG9hdCIsICIoZmxvYXQpIiB9LAotICAgIHsgImNlaWxmIiwgKHZvaWQgKikmY2VpbGYsCi0gICAgICAgICJmbG9hdCIsICIoZmxvYXQpIiB9LAotICAgIHsgInJvdW5kZiIsICh2b2lkICopJlNDX3JvdW5kZiwKLSAgICAgICAgImZsb2F0IiwgIihmbG9hdCkiIH0sCi0gICAgeyAiZXhwZiIsICh2b2lkICopJmV4cGYsCi0gICAgICAgICJmbG9hdCIsICIoZmxvYXQpIiB9LAotICAgIHsgImxvZ2YiLCAodm9pZCAqKSZsb2dmLAotICAgICAgICAiZmxvYXQiLCAiKGZsb2F0KSIgfSwKLSAgICB7ICJwb3dmIiwgKHZvaWQgKikmcG93ZiwKLSAgICAgICAgImZsb2F0IiwgIihmbG9hdCwgZmxvYXQpIiB9LAotICAgIHsgIm1heGYiLCAodm9pZCAqKSZTQ19tYXhmLAotICAgICAgICAiZmxvYXQiLCAiKGZsb2F0LCBmbG9hdCkiIH0sCi0gICAgeyAibWluZiIsICh2b2lkICopJlNDX21pbmYsCi0gICAgICAgICJmbG9hdCIsICIoZmxvYXQsIGZsb2F0KSIgfSwKLSAgICB7ICJzcXJ0IiwgKHZvaWQgKikmc3FydCwKLSAgICAgICAgImludCIsICIoaW50KSIgfSwKLSAgICB7ICJzcXJ0ZiIsICh2b2lkICopJnNxcnRmLAotICAgICAgICAiZmxvYXQiLCAiKGZsb2F0KSIgfSwKLSAgICB7ICJzcXIiLCAodm9pZCAqKSZTQ19zcXIsCi0gICAgICAgICJpbnQiLCAiKGludCkiIH0sCi0gICAgeyAic3FyZiIsICh2b2lkICopJlNDX3NxcmYsCi0gICAgICAgICJmbG9hdCIsICIoZmxvYXQpIiB9LAotICAgIHsgInNpZ24iLCAodm9pZCAqKSZTQ19zaWduLAotICAgICAgICAiaW50IiwgIihpbnQpIiB9LAotICAgIHsgInNpZ25mIiwgKHZvaWQgKikmU0Nfc2lnbmYsCi0gICAgICAgICJmbG9hdCIsICIoZmxvYXQpIiB9LAotICAgIHsgImNsYW1wIiwgKHZvaWQgKikmU0NfY2xhbXAsCi0gICAgICAgICJpbnQiLCAiKGludCwgaW50LCBpbnQpIiB9LAotICAgIHsgImNsYW1wZiIsICh2b2lkICopJlNDX2NsYW1wZiwKLSAgICAgICAgImZsb2F0IiwgIihmbG9hdCwgZmxvYXQsIGZsb2F0KSIgfSwKLSAgICB7ICJkaXN0ZjIiLCAodm9pZCAqKSZTQ19kaXN0ZjIsCi0gICAgICAgICJmbG9hdCIsICIoZmxvYXQsIGZsb2F0LCBmbG9hdCwgZmxvYXQpIiB9LAotICAgIHsgImRpc3RmMyIsICh2b2lkICopJlNDX2Rpc3RmMywKLSAgICAgICAgImZsb2F0IiwgIihmbG9hdCwgZmxvYXQsIGZsb2F0LCBmbG9hdCwgZmxvYXQsIGZsb2F0KSIgfSwKLSAgICB7ICJtYWdmMiIsICh2b2lkICopJlNDX21hZ2YyLAotICAgICAgICAiZmxvYXQiLCAiKGZsb2F0LCBmbG9hdCkiIH0sCi0gICAgeyAibWFnZjMiLCAodm9pZCAqKSZTQ19tYWdmMywKLSAgICAgICAgImZsb2F0IiwgIihmbG9hdCwgZmxvYXQsIGZsb2F0KSIgfSwKLSAgICB7ICJyYWRmIiwgKHZvaWQgKikmU0NfcmFkZiwKLSAgICAgICAgImZsb2F0IiwgIihmbG9hdCkiIH0sCi0gICAgeyAiZGVnZiIsICh2b2lkICopJlNDX2RlZ2YsCi0gICAgICAgICJmbG9hdCIsICIoZmxvYXQpIiB9LAotICAgIHsgImxlcnBmIiwgKHZvaWQgKikmU0NfbGVycGYsCi0gICAgICAgICJmbG9hdCIsICIoZmxvYXQsIGZsb2F0LCBmbG9hdCkiIH0sCi0gICAgeyAibm9ybWYiLCAodm9pZCAqKSZTQ19ub3JtZiwKLSAgICAgICAgImZsb2F0IiwgIihmbG9hdCwgZmxvYXQsIGZsb2F0KSIgfSwKLSAgICB7ICJtYXBmIiwgKHZvaWQgKikmU0NfbWFwZiwKLSAgICAgICAgImZsb2F0IiwgIihmbG9hdCwgZmxvYXQsIGZsb2F0LCBmbG9hdCwgZmxvYXQpIiB9LAotICAgIHsgIm5vaXNlZiIsICh2b2lkICopJlNDX25vaXNlZiwKLSAgICAgICAgImZsb2F0IiwgIihmbG9hdCkiIH0sCi0gICAgeyAibm9pc2VmMiIsICh2b2lkICopJlNDX25vaXNlZjIsCi0gICAgICAgICJmbG9hdCIsICIoZmxvYXQsIGZsb2F0KSIgfSwKLSAgICB7ICJub2lzZWYzIiwgKHZvaWQgKikmU0Nfbm9pc2VmMywKLSAgICAgICAgImZsb2F0IiwgIihmbG9hdCwgZmxvYXQsIGZsb2F0KSIgfSwKLSAgICB7ICJ0dXJidWxlbmNlZjIiLCAodm9pZCAqKSZTQ190dXJidWxlbmNlZjIsCi0gICAgICAgICJmbG9hdCIsICIoZmxvYXQsIGZsb2F0LCBmbG9hdCkiIH0sCi0gICAgeyAidHVyYnVsZW5jZWYzIiwgKHZvaWQgKikmU0NfdHVyYnVsZW5jZWYzLAotICAgICAgICAiZmxvYXQiLCAiKGZsb2F0LCBmbG9hdCwgZmxvYXQsIGZsb2F0KSIgfSwKK3N0YXRpYyBTY3JpcHRDU3RhdGU6OlN5bWJvbFRhYmxlX3QgZ1N5bXNbXSA9IHsKKyAgICB7ICJfX2RpdnNpMyIsICh2b2lkICopJlNDX2RpdnNpMyB9LAorCisgICAgLy8gYWxsb2NhdGlvbgorICAgIHsgInJzQWxsb2NhdGlvbkdldERpbVgiLCAodm9pZCAqKSZTQ19hbGxvY0dldERpbVggfSwKKyAgICB7ICJyc0FsbG9jYXRpb25HZXREaW1ZIiwgKHZvaWQgKikmU0NfYWxsb2NHZXREaW1ZIH0sCisgICAgeyAicnNBbGxvY2F0aW9uR2V0RGltWiIsICh2b2lkICopJlNDX2FsbG9jR2V0RGltWiB9LAorICAgIHsgInJzQWxsb2NhdGlvbkdldERpbUxPRCIsICh2b2lkICopJlNDX2FsbG9jR2V0RGltTE9EIH0sCisgICAgeyAicnNBbGxvY2F0aW9uR2V0RGltRmFjZXMiLCAodm9pZCAqKSZTQ19hbGxvY0dldERpbUZhY2VzIH0sCisgICAgeyAicnNHZXRBbGxvY2F0aW9uIiwgKHZvaWQgKikmU0NfZ2V0QWxsb2NhdGlvbiB9LAorCisgICAgLy8gRGVidWcKKyAgICB7ICJfWjdyc0RlYnVnUEtjZiIsICh2b2lkICopJlNDX2RlYnVnRiB9LAorICAgIHsgIl9aN3JzRGVidWdQS2NEdjJfZiIsICh2b2lkICopJlNDX2RlYnVnRnYyIH0sCisgICAgeyAiX1o3cnNEZWJ1Z1BLY0R2M19mIiwgKHZvaWQgKikmU0NfZGVidWdGdjMgfSwKKyAgICB7ICJfWjdyc0RlYnVnUEtjRHY0X2YiLCAodm9pZCAqKSZTQ19kZWJ1Z0Z2NCB9LAorICAgIHsgIl9aN3JzRGVidWdQS2NpIiwgKHZvaWQgKikmU0NfZGVidWdJMzIgfSwKKyAgICAvL2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpcnNEZWJ1Zyhjb25zdCBjaGFyICosIGNvbnN0IHZvaWQgKik7CisKKworICAgIC8vIFJTIE1hdGgKKyAgICB7ICJfWjZyc1JhbmRpIiwgKHZvaWQgKikmU0NfcmFuZGkgfSwKKyAgICB7ICJfWjZyc1JhbmRpaSIsICh2b2lkICopJlNDX3JhbmRpMiB9LAorICAgIHsgIl9aNnJzUmFuZGYiLCAodm9pZCAqKSZTQ19yYW5kZiB9LAorICAgIHsgIl9aNnJzUmFuZGZmIiwgKHZvaWQgKikmU0NfcmFuZGYyIH0sCisgICAgeyAiX1o2cnNGcmFjZiIsICh2b2lkICopJlNDX2ZyYWMgfSwKIAogICAgIC8vIHRpbWUKLSAgICB7ICJzZWNvbmQiLCAodm9pZCAqKSZTQ19zZWNvbmQsCi0gICAgICAgICJpbnQiLCAiKCkiIH0sCi0gICAgeyAibWludXRlIiwgKHZvaWQgKikmU0NfbWludXRlLAotICAgICAgICAiaW50IiwgIigpIiB9LAotICAgIHsgImhvdXIiLCAodm9pZCAqKSZTQ19ob3VyLAotICAgICAgICAiaW50IiwgIigpIiB9LAotICAgIHsgImRheSIsICh2b2lkICopJlNDX2RheSwKLSAgICAgICAgImludCIsICIoKSIgfSwKLSAgICB7ICJtb250aCIsICh2b2lkICopJlNDX21vbnRoLAotICAgICAgICAiaW50IiwgIigpIiB9LAotICAgIHsgInllYXIiLCAodm9pZCAqKSZTQ195ZWFyLAotICAgICAgICAiaW50IiwgIigpIiB9LAotICAgIHsgInVwdGltZU1pbGxpcyIsICh2b2lkKikmU0NfdXB0aW1lTWlsbGlzLAotICAgICAgICAiaW50IiwgIigpIiB9LCAgICAgIC8vIFRPRE86IHVzZSBsb25nIGluc3RlYWQKLSAgICB7ICJzdGFydFRpbWVNaWxsaXMiLCAodm9pZCopJlNDX3N0YXJ0VGltZU1pbGxpcywKLSAgICAgICAgImludCIsICIoKSIgfSwgICAgICAvLyBUT0RPOiB1c2UgbG9uZyBpbnN0ZWFkCi0gICAgeyAiZWxhcHNlZFRpbWVNaWxsaXMiLCAodm9pZCopJlNDX2VsYXBzZWRUaW1lTWlsbGlzLAotICAgICAgICAiaW50IiwgIigpIiB9LCAgICAgIC8vIFRPRE86IHVzZSBsb25nIGluc3RlYWQKKyAgICB7ICJyc1NlY29uZCIsICh2b2lkICopJlNDX3NlY29uZCB9LAorICAgIHsgInJzTWludXRlIiwgKHZvaWQgKikmU0NfbWludXRlIH0sCisgICAgeyAicnNIb3VyIiwgKHZvaWQgKikmU0NfaG91ciB9LAorICAgIHsgInJzRGF5IiwgKHZvaWQgKikmU0NfZGF5IH0sCisgICAgeyAicnNNb250aCIsICh2b2lkICopJlNDX21vbnRoIH0sCisgICAgeyAicnNZZWFyIiwgKHZvaWQgKikmU0NfeWVhciB9LAorICAgIHsgInJzVXB0aW1lTWlsbGlzIiwgKHZvaWQqKSZTQ191cHRpbWVNaWxsaXMyIH0sCisgICAgeyAicnNTdGFydFRpbWVNaWxsaXMiLCAodm9pZCopJlNDX3N0YXJ0VGltZU1pbGxpczIgfSwKKyAgICB7ICJyc0VsYXBzZWRUaW1lTWlsbGlzIiwgKHZvaWQqKSZTQ19lbGFwc2VkVGltZU1pbGxpczIgfSwKKworICAgIHsgInJzU2VuZFRvQ2xpZW50IiwgKHZvaWQgKikmU0NfdG9DbGllbnQgfSwKIAogICAgIC8vIG1hdHJpeAotICAgIHsgIm1hdHJpeExvYWRJZGVudGl0eSIsICh2b2lkICopJlNDX21hdHJpeExvYWRJZGVudGl0eSwKLSAgICAgICAgInZvaWQiLCAiKGZsb2F0ICptYXQpIiB9LAotICAgIHsgIm1hdHJpeExvYWRGbG9hdCIsICh2b2lkICopJlNDX21hdHJpeExvYWRGbG9hdCwKLSAgICAgICAgInZvaWQiLCAiKGZsb2F0ICptYXQsIGZsb2F0ICpmKSIgfSwKLSAgICB7ICJtYXRyaXhMb2FkTWF0IiwgKHZvaWQgKikmU0NfbWF0cml4TG9hZE1hdCwKLSAgICAgICAgInZvaWQiLCAiKGZsb2F0ICptYXQsIGZsb2F0ICpuZXdtYXQpIiB9LAotICAgIHsgIm1hdHJpeExvYWRSb3RhdGUiLCAodm9pZCAqKSZTQ19tYXRyaXhMb2FkUm90YXRlLAotICAgICAgICAidm9pZCIsICIoZmxvYXQgKm1hdCwgZmxvYXQgcm90LCBmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KSIgfSwKLSAgICB7ICJtYXRyaXhMb2FkU2NhbGUiLCAodm9pZCAqKSZTQ19tYXRyaXhMb2FkU2NhbGUsCi0gICAgICAgICJ2b2lkIiwgIihmbG9hdCAqbWF0LCBmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KSIgfSwKLSAgICB7ICJtYXRyaXhMb2FkVHJhbnNsYXRlIiwgKHZvaWQgKikmU0NfbWF0cml4TG9hZFRyYW5zbGF0ZSwKLSAgICAgICAgInZvaWQiLCAiKGZsb2F0ICptYXQsIGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHopIiB9LAotICAgIHsgIm1hdHJpeExvYWRNdWx0aXBseSIsICh2b2lkICopJlNDX21hdHJpeExvYWRNdWx0aXBseSwKLSAgICAgICAgInZvaWQiLCAiKGZsb2F0ICptYXQsIGZsb2F0ICpsaHMsIGZsb2F0ICpyaHMpIiB9LAotICAgIHsgIm1hdHJpeE11bHRpcGx5IiwgKHZvaWQgKikmU0NfbWF0cml4TXVsdGlwbHksCi0gICAgICAgICJ2b2lkIiwgIihmbG9hdCAqbWF0LCBmbG9hdCAqcmhzKSIgfSwKLSAgICB7ICJtYXRyaXhSb3RhdGUiLCAodm9pZCAqKSZTQ19tYXRyaXhSb3RhdGUsCi0gICAgICAgICJ2b2lkIiwgIihmbG9hdCAqbWF0LCBmbG9hdCByb3QsIGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHopIiB9LAotICAgIHsgIm1hdHJpeFNjYWxlIiwgKHZvaWQgKikmU0NfbWF0cml4U2NhbGUsCi0gICAgICAgICJ2b2lkIiwgIihmbG9hdCAqbWF0LCBmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KSIgfSwKLSAgICB7ICJtYXRyaXhUcmFuc2xhdGUiLCAodm9pZCAqKSZTQ19tYXRyaXhUcmFuc2xhdGUsCi0gICAgICAgICJ2b2lkIiwgIihmbG9hdCAqbWF0LCBmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KSIgfSwKKyAgICB7ICJyc01hdHJpeExvYWRJZGVudGl0eSIsICh2b2lkICopJlNDX21hdHJpeExvYWRJZGVudGl0eSB9LAorICAgIHsgInJzTWF0cml4TG9hZEZsb2F0IiwgKHZvaWQgKikmU0NfbWF0cml4TG9hZEZsb2F0IH0sCisgICAgeyAicnNNYXRyaXhMb2FkTWF0IiwgKHZvaWQgKikmU0NfbWF0cml4TG9hZE1hdCB9LAorICAgIHsgInJzTWF0cml4TG9hZFJvdGF0ZSIsICh2b2lkICopJlNDX21hdHJpeExvYWRSb3RhdGUgfSwKKyAgICB7ICJyc01hdHJpeExvYWRTY2FsZSIsICh2b2lkICopJlNDX21hdHJpeExvYWRTY2FsZSB9LAorICAgIHsgInJzTWF0cml4TG9hZFRyYW5zbGF0ZSIsICh2b2lkICopJlNDX21hdHJpeExvYWRUcmFuc2xhdGUgfSwKKyAgICB7ICJyc01hdHJpeExvYWRNdWx0aXBseSIsICh2b2lkICopJlNDX21hdHJpeExvYWRNdWx0aXBseSB9LAorICAgIHsgInJzTWF0cml4TXVsdGlwbHkiLCAodm9pZCAqKSZTQ19tYXRyaXhNdWx0aXBseSB9LAorICAgIHsgInJzTWF0cml4Um90YXRlIiwgKHZvaWQgKikmU0NfbWF0cml4Um90YXRlIH0sCisgICAgeyAicnNNYXRyaXhTY2FsZSIsICh2b2lkICopJlNDX21hdHJpeFNjYWxlIH0sCisgICAgeyAicnNNYXRyaXhUcmFuc2xhdGUiLCAodm9pZCAqKSZTQ19tYXRyaXhUcmFuc2xhdGUgfSwKIAotICAgIC8vIHZlY3RvcgotICAgIHsgInZlYzJSYW5kIiwgKHZvaWQgKikmU0NfdmVjMlJhbmQsCi0gICAgICAgICJ2b2lkIiwgIihmbG9hdCAqdmVjLCBmbG9hdCBtYXhMZW4pIiB9LAorICAgIHsgIl9aOXJzRm9yRWFjaGlpIiwgKHZvaWQgKikmU0NfRm9yRWFjaGlpIH0sCisgICAgeyAiX1o5cnNGb3JFYWNoaWlpIiwgKHZvaWQgKikmU0NfRm9yRWFjaGlpaSB9LAorICAgIHsgIl9aOXJzRm9yRWFjaGlpaWkiLCAodm9pZCAqKSZTQ19Gb3JFYWNoaWlpaSB9LAorICAgIHsgIl9aOXJzRm9yRWFjaGlpaWlpIiwgKHZvaWQgKikmU0NfRm9yRWFjaGlpaWlpIH0sCisgICAgeyAiX1o5cnNGb3JFYWNoaWlpaWlpIiwgKHZvaWQgKikmU0NfRm9yRWFjaGlpaWlpaSB9LAorICAgIHsgIl9aOXJzRm9yRWFjaGlpaWlpaWkiLCAodm9pZCAqKSZTQ19Gb3JFYWNoaWlpaWlpaSB9LAogCi0gICAgLy8gdmVjMwotICAgIHsgInZlYzNOb3JtIiwgKHZvaWQgKikmU0NfdmVjM05vcm0sCi0gICAgICAgICJ2b2lkIiwgIihzdHJ1Y3QgdmVjRjMyXzNfcyAqKSIgfSwKLSAgICB7ICJ2ZWMzTGVuZ3RoIiwgKHZvaWQgKikmU0NfdmVjM0xlbmd0aCwKLSAgICAgICAgImZsb2F0IiwgIihzdHJ1Y3QgdmVjRjMyXzNfcyAqKSIgfSwKLSAgICB7ICJ2ZWMzQWRkIiwgKHZvaWQgKikmU0NfdmVjM0FkZCwKLSAgICAgICAgInZvaWQiLCAiKHN0cnVjdCB2ZWNGMzJfM19zICpkZXN0LCBzdHJ1Y3QgdmVjRjMyXzNfcyAqbGhzLCBzdHJ1Y3QgdmVjRjMyXzNfcyAqcmhzKSIgfSwKLSAgICB7ICJ2ZWMzU3ViIiwgKHZvaWQgKikmU0NfdmVjM1N1YiwKLSAgICAgICAgInZvaWQiLCAiKHN0cnVjdCB2ZWNGMzJfM19zICpkZXN0LCBzdHJ1Y3QgdmVjRjMyXzNfcyAqbGhzLCBzdHJ1Y3QgdmVjRjMyXzNfcyAqcmhzKSIgfSwKLSAgICB7ICJ2ZWMzQ3Jvc3MiLCAodm9pZCAqKSZTQ192ZWMzQ3Jvc3MsCi0gICAgICAgICJ2b2lkIiwgIihzdHJ1Y3QgdmVjRjMyXzNfcyAqZGVzdCwgc3RydWN0IHZlY0YzMl8zX3MgKmxocywgc3RydWN0IHZlY0YzMl8zX3MgKnJocykiIH0sCi0gICAgeyAidmVjM0RvdCIsICh2b2lkICopJlNDX3ZlYzNEb3QsCi0gICAgICAgICJmbG9hdCIsICIoc3RydWN0IHZlY0YzMl8zX3MgKmxocywgc3RydWN0IHZlY0YzMl8zX3MgKnJocykiIH0sCi0gICAgeyAidmVjM1NjYWxlIiwgKHZvaWQgKikmU0NfdmVjM1NjYWxlLAotICAgICAgICAidm9pZCIsICIoc3RydWN0IHZlY0YzMl8zX3MgKmxocywgZmxvYXQgc2NhbGUpIiB9LAorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAotICAgIC8vIHZlYzQKLSAgICB7ICJ2ZWM0Tm9ybSIsICh2b2lkICopJlNDX3ZlYzROb3JtLAotICAgICAgICAidm9pZCIsICIoc3RydWN0IHZlY0YzMl80X3MgKikiIH0sCi0gICAgeyAidmVjNExlbmd0aCIsICh2b2lkICopJlNDX3ZlYzRMZW5ndGgsCi0gICAgICAgICJmbG9hdCIsICIoc3RydWN0IHZlY0YzMl80X3MgKikiIH0sCi0gICAgeyAidmVjNEFkZCIsICh2b2lkICopJlNDX3ZlYzRBZGQsCi0gICAgICAgICJ2b2lkIiwgIihzdHJ1Y3QgdmVjRjMyXzRfcyAqZGVzdCwgc3RydWN0IHZlY0YzMl80X3MgKmxocywgc3RydWN0IHZlY0YzMl80X3MgKnJocykiIH0sCi0gICAgeyAidmVjNFN1YiIsICh2b2lkICopJlNDX3ZlYzRTdWIsCi0gICAgICAgICJ2b2lkIiwgIihzdHJ1Y3QgdmVjRjMyXzRfcyAqZGVzdCwgc3RydWN0IHZlY0YzMl80X3MgKmxocywgc3RydWN0IHZlY0YzMl80X3MgKnJocykiIH0sCi0gICAgeyAidmVjNERvdCIsICh2b2lkICopJlNDX3ZlYzREb3QsCi0gICAgICAgICJmbG9hdCIsICIoc3RydWN0IHZlY0YzMl80X3MgKmxocywgc3RydWN0IHZlY0YzMl80X3MgKnJocykiIH0sCi0gICAgeyAidmVjNFNjYWxlIiwgKHZvaWQgKikmU0NfdmVjNFNjYWxlLAotICAgICAgICAidm9pZCIsICIoc3RydWN0IHZlY0YzMl80X3MgKmxocywgZmxvYXQgc2NhbGUpIiB9LAorICAgIC8veyAic2luZl9mYXN0IiwgKHZvaWQgKikmU0Nfc2luZl9mYXN0IH0sCisgICAgLy97ICJjb3NmX2Zhc3QiLCAodm9pZCAqKSZTQ19jb3NmX2Zhc3QgfSwKIAotICAgIC8vIGNvbnRleHQKLSAgICB7ICJiaW5kUHJvZ3JhbUZyYWdtZW50IiwgKHZvaWQgKikmU0NfYmluZFByb2dyYW1GcmFnbWVudCwKLSAgICAgICAgInZvaWQiLCAiKGludCkiIH0sCi0gICAgeyAiYmluZFByb2dyYW1GcmFnbWVudFN0b3JlIiwgKHZvaWQgKikmU0NfYmluZFByb2dyYW1GcmFnbWVudFN0b3JlLAotICAgICAgICAidm9pZCIsICIoaW50KSIgfSwKLSAgICB7ICJiaW5kUHJvZ3JhbVN0b3JlIiwgKHZvaWQgKikmU0NfYmluZFByb2dyYW1GcmFnbWVudFN0b3JlLAotICAgICAgICAidm9pZCIsICIoaW50KSIgfSwKLSAgICB7ICJiaW5kUHJvZ3JhbVZlcnRleCIsICh2b2lkICopJlNDX2JpbmRQcm9ncmFtVmVydGV4LAotICAgICAgICAidm9pZCIsICIoaW50KSIgfSwKLSAgICB7ICJiaW5kU2FtcGxlciIsICh2b2lkICopJlNDX2JpbmRTYW1wbGVyLAotICAgICAgICAidm9pZCIsICIoaW50LCBpbnQsIGludCkiIH0sCi0gICAgeyAiYmluZFRleHR1cmUiLCAodm9pZCAqKSZTQ19iaW5kVGV4dHVyZSwKLSAgICAgICAgInZvaWQiLCAiKGludCwgaW50LCBpbnQpIiB9LAotCi0gICAgLy8gdnAKLSAgICB7ICJ2cExvYWRNb2RlbE1hdHJpeCIsICh2b2lkICopJlNDX3ZwTG9hZE1vZGVsTWF0cml4LAotICAgICAgICAidm9pZCIsICIodm9pZCAqKSIgfSwKLSAgICB7ICJ2cExvYWRUZXh0dXJlTWF0cml4IiwgKHZvaWQgKikmU0NfdnBMb2FkVGV4dHVyZU1hdHJpeCwKLSAgICAgICAgInZvaWQiLCAiKHZvaWQgKikiIH0sCisgICAgeyAic2NyaXB0Q2FsbCIsICh2b2lkICopJlNDX3NjcmlwdENhbGwgfSwKIAogCi0KLSAgICAvLyBkcmF3aW5nCi0gICAgeyAiZHJhd1JlY3QiLCAodm9pZCAqKSZTQ19kcmF3UmVjdCwKLSAgICAgICAgInZvaWQiLCAiKGZsb2F0IHgxLCBmbG9hdCB5MSwgZmxvYXQgeDIsIGZsb2F0IHkyLCBmbG9hdCB6KSIgfSwKLSAgICB7ICJkcmF3UXVhZCIsICh2b2lkICopJlNDX2RyYXdRdWFkLAotICAgICAgICAidm9pZCIsICIoZmxvYXQgeDEsIGZsb2F0IHkxLCBmbG9hdCB6MSwgZmxvYXQgeDIsIGZsb2F0IHkyLCBmbG9hdCB6MiwgZmxvYXQgeDMsIGZsb2F0IHkzLCBmbG9hdCB6MywgZmxvYXQgeDQsIGZsb2F0IHk0LCBmbG9hdCB6NCkiIH0sCi0gICAgeyAiZHJhd1F1YWRUZXhDb29yZHMiLCAodm9pZCAqKSZTQ19kcmF3UXVhZFRleENvb3JkcywKLSAgICAgICAgInZvaWQiLCAiKGZsb2F0IHgxLCBmbG9hdCB5MSwgZmxvYXQgejEsIGZsb2F0IHUxLCBmbG9hdCB2MSwgZmxvYXQgeDIsIGZsb2F0IHkyLCBmbG9hdCB6MiwgZmxvYXQgdTIsIGZsb2F0IHYyLCBmbG9hdCB4MywgZmxvYXQgeTMsIGZsb2F0IHozLCBmbG9hdCB1MywgZmxvYXQgdjMsIGZsb2F0IHg0LCBmbG9hdCB5NCwgZmxvYXQgejQsIGZsb2F0IHU0LCBmbG9hdCB2NCkiIH0sCi0gICAgeyAiZHJhd1Nwcml0ZSIsICh2b2lkICopJlNDX2RyYXdTcHJpdGUsCi0gICAgICAgICJ2b2lkIiwgIihmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6LCBmbG9hdCB3LCBmbG9hdCBoKSIgfSwKLSAgICB7ICJkcmF3U3ByaXRlU2NyZWVuc3BhY2UiLCAodm9pZCAqKSZTQ19kcmF3U3ByaXRlU2NyZWVuc3BhY2UsCi0gICAgICAgICJ2b2lkIiwgIihmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6LCBmbG9hdCB3LCBmbG9hdCBoKSIgfSwKLSAgICB7ICJkcmF3U3ByaXRlU2NyZWVuc3BhY2VDcm9wcGVkIiwgKHZvaWQgKikmU0NfZHJhd1Nwcml0ZVNjcmVlbnNwYWNlQ3JvcHBlZCwKLSAgICAgICAgInZvaWQiLCAiKGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHosIGZsb2F0IHcsIGZsb2F0IGgsIGZsb2F0IGN4MCwgZmxvYXQgY3kwLCBmbG9hdCBjeDEsIGZsb2F0IGN5MSkiIH0sCi0gICAgeyAiZHJhd0xpbmUiLCAodm9pZCAqKSZTQ19kcmF3TGluZSwKLSAgICAgICAgInZvaWQiLCAiKGZsb2F0IHgxLCBmbG9hdCB5MSwgZmxvYXQgejEsIGZsb2F0IHgyLCBmbG9hdCB5MiwgZmxvYXQgejIpIiB9LAotICAgIHsgImRyYXdQb2ludCIsICh2b2lkICopJlNDX2RyYXdQb2ludCwKLSAgICAgICAgInZvaWQiLCAiKGZsb2F0IHgxLCBmbG9hdCB5MSwgZmxvYXQgejEpIiB9LAotICAgIHsgImRyYXdTaW1wbGVNZXNoIiwgKHZvaWQgKikmU0NfZHJhd1NpbXBsZU1lc2gsCi0gICAgICAgICJ2b2lkIiwgIihpbnQgaXNtKSIgfSwKLSAgICB7ICJkcmF3U2ltcGxlTWVzaFJhbmdlIiwgKHZvaWQgKikmU0NfZHJhd1NpbXBsZU1lc2hSYW5nZSwKLSAgICAgICAgInZvaWQiLCAiKGludCBpc20sIGludCBzdGFydCwgaW50IGxlbikiIH0sCi0KLQotICAgIC8vIG1pc2MKLSAgICB7ICJwZkNsZWFyQ29sb3IiLCAodm9pZCAqKSZTQ19DbGVhckNvbG9yLAotICAgICAgICAidm9pZCIsICIoZmxvYXQsIGZsb2F0LCBmbG9hdCwgZmxvYXQpIiB9LAotICAgIHsgImNvbG9yIiwgKHZvaWQgKikmU0NfY29sb3IsCi0gICAgICAgICJ2b2lkIiwgIihmbG9hdCwgZmxvYXQsIGZsb2F0LCBmbG9hdCkiIH0sCi0gICAgeyAiaHNiIiwgKHZvaWQgKikmU0NfaHNiLAotICAgICAgICAidm9pZCIsICIoZmxvYXQsIGZsb2F0LCBmbG9hdCwgZmxvYXQpIiB9LAotICAgIHsgImhzYlRvUmdiIiwgKHZvaWQgKikmU0NfaHNiVG9SZ2IsCi0gICAgICAgICJ2b2lkIiwgIihmbG9hdCwgZmxvYXQsIGZsb2F0LCBmbG9hdCopIiB9LAotICAgIHsgImhzYlRvQWJnciIsICh2b2lkICopJlNDX2hzYlRvQWJnciwKLSAgICAgICAgImludCIsICIoZmxvYXQsIGZsb2F0LCBmbG9hdCwgZmxvYXQpIiB9LAotICAgIHsgImFtYmllbnQiLCAodm9pZCAqKSZTQ19hbWJpZW50LAotICAgICAgICAidm9pZCIsICIoZmxvYXQsIGZsb2F0LCBmbG9hdCwgZmxvYXQpIiB9LAotICAgIHsgImRpZmZ1c2UiLCAodm9pZCAqKSZTQ19kaWZmdXNlLAotICAgICAgICAidm9pZCIsICIoZmxvYXQsIGZsb2F0LCBmbG9hdCwgZmxvYXQpIiB9LAotICAgIHsgInNwZWN1bGFyIiwgKHZvaWQgKikmU0Nfc3BlY3VsYXIsCi0gICAgICAgICJ2b2lkIiwgIihmbG9hdCwgZmxvYXQsIGZsb2F0LCBmbG9hdCkiIH0sCi0gICAgeyAiZW1pc3Npb24iLCAodm9pZCAqKSZTQ19lbWlzc2lvbiwKLSAgICAgICAgInZvaWQiLCAiKGZsb2F0LCBmbG9hdCwgZmxvYXQsIGZsb2F0KSIgfSwKLSAgICB7ICJzaGluaW5lc3MiLCAodm9pZCAqKSZTQ19zaGluaW5lc3MsCi0gICAgICAgICJ2b2lkIiwgIihmbG9hdCkiIH0sCi0gICAgeyAicG9pbnRBdHRlbnVhdGlvbiIsICh2b2lkICopJlNDX3BvaW50QXR0ZW51YXRpb24sCi0gICAgICAgICJ2b2lkIiwgIihmbG9hdCwgZmxvYXQsIGZsb2F0KSIgfSwKLQotICAgIHsgInVwbG9hZFRvVGV4dHVyZSIsICh2b2lkICopJlNDX3VwbG9hZFRvVGV4dHVyZSwKLSAgICAgICAgInZvaWQiLCAiKGludCwgaW50KSIgfSwKLSAgICB7ICJ1cGxvYWRUb0J1ZmZlck9iamVjdCIsICh2b2lkICopJlNDX3VwbG9hZFRvQnVmZmVyT2JqZWN0LAotICAgICAgICAidm9pZCIsICIoaW50KSIgfSwKLQotICAgIHsgInN5bmNUb0dMIiwgKHZvaWQgKikmU0Nfc3luY1RvR0wsCi0gICAgICAgICJ2b2lkIiwgIihpbnQpIiB9LAotCi0gICAgeyAiY29sb3JGbG9hdFJHQkF0b1VOb3JtOCIsICh2b2lkICopJlNDX2NvbG9yRmxvYXRSR0JBdG9VTm9ybTgsCi0gICAgICAgICJpbnQiLCAiKGZsb2F0LCBmbG9hdCwgZmxvYXQsIGZsb2F0KSIgfSwKLSAgICB7ICJjb2xvckZsb2F0UkdCdG81NjUiLCAodm9pZCAqKSZTQ19jb2xvckZsb2F0UkdCQXRvNTY1LAotICAgICAgICAiaW50IiwgIihmbG9hdCwgZmxvYXQsIGZsb2F0KSIgfSwKLQotCi0gICAgeyAiZ2V0V2lkdGgiLCAodm9pZCAqKSZTQ19nZXRXaWR0aCwKLSAgICAgICAgImludCIsICIoKSIgfSwKLSAgICB7ICJnZXRIZWlnaHQiLCAodm9pZCAqKSZTQ19nZXRIZWlnaHQsCi0gICAgICAgICJpbnQiLCAiKCkiIH0sCi0KLSAgICB7ICJzZW5kVG9DbGllbnQiLCAodm9pZCAqKSZTQ190b0NsaWVudCwKLSAgICAgICAgImludCIsICIodm9pZCAqZGF0YSwgaW50IGNtZElELCBpbnQgbGVuLCBpbnQgd2FpdEZvclNwYWNlKSIgfSwKLQotCi0gICAgeyAiZGVidWdGIiwgKHZvaWQgKikmU0NfZGVidWdGLAotICAgICAgICAidm9pZCIsICIodm9pZCAqLCBmbG9hdCkiIH0sCi0gICAgeyAiZGVidWdJMzIiLCAodm9pZCAqKSZTQ19kZWJ1Z0kzMiwKLSAgICAgICAgInZvaWQiLCAiKHZvaWQgKiwgaW50KSIgfSwKLSAgICB7ICJkZWJ1Z0hleEYiLCAodm9pZCAqKSZTQ19kZWJ1Z0hleEYsCi0gICAgICAgICJ2b2lkIiwgIih2b2lkICosIGZsb2F0KSIgfSwKLSAgICB7ICJkZWJ1Z0hleEkzMiIsICh2b2lkICopJlNDX2RlYnVnSGV4STMyLAotICAgICAgICAidm9pZCIsICIodm9pZCAqLCBpbnQpIiB9LAotCi0gICAgeyAic2NyaXB0Q2FsbCIsICh2b2lkICopJlNDX3NjcmlwdENhbGwsCi0gICAgICAgICJ2b2lkIiwgIihpbnQpIiB9LAotCi0KLSAgICB7IE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwgfQorICAgIHsgTlVMTCwgTlVMTCB9CiB9OwogCiBjb25zdCBTY3JpcHRDU3RhdGU6OlN5bWJvbFRhYmxlX3QgKiBTY3JpcHRDU3RhdGU6Omxvb2t1cFN5bWJvbChjb25zdCBjaGFyICpzeW0pCkBAIC0xNDAwLDE3ICs1MzMsMyBAQAogICAgIHJldHVybiBOVUxMOwogfQogCi12b2lkIFNjcmlwdENTdGF0ZTo6YXBwZW5kRGVjbHMoU3RyaW5nOCAqc3RyKQotewotICAgIFNjcmlwdENTdGF0ZTo6U3ltYm9sVGFibGVfdCAqc3ltcyA9IGdTeW1zOwotICAgIHdoaWxlIChzeW1zLT5tUHRyKSB7Ci0gICAgICAgIHN0ci0+YXBwZW5kKHN5bXMtPm1SZXQpOwotICAgICAgICBzdHItPmFwcGVuZCgiICIpOwotICAgICAgICBzdHItPmFwcGVuZChzeW1zLT5tTmFtZSk7Ci0gICAgICAgIHN0ci0+YXBwZW5kKHN5bXMtPm1QYXJhbSk7Ci0gICAgICAgIHN0ci0+YXBwZW5kKCI7XG4iKTsKLSAgICAgICAgc3ltcysrOwotICAgIH0KLX0KLQotCmRpZmYgLS1naXQgYS9saWJzL3JzL3JzU2NyaXB0Q19MaWJDTC5jcHAgYi9saWJzL3JzL3JzU2NyaXB0Q19MaWJDTC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2U4ZTdiMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvcnNTY3JpcHRDX0xpYkNMLmNwcApAQCAtMCwwICsxLDMxNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJyc0NvbnRleHQuaCIKKyNpbmNsdWRlICJyc1NjcmlwdEMuaCIKKworLy8gSW1wbGVtZW50cyByc19jbC5yc2gKKworCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpyZW5kZXJzY3JpcHQ7CisKKworc3RhdGljIGZsb2F0IFNDX2Fjb3NwaShmbG9hdCB2KSB7CisgICAgcmV0dXJuIGFjb3NmKHYpLyBNX1BJOworfQorCitzdGF0aWMgZmxvYXQgU0NfYXNpbnBpKGZsb2F0IHYpIHsKKyAgICByZXR1cm4gYXNpbmYodikgLyBNX1BJOworfQorCitzdGF0aWMgZmxvYXQgU0NfYXRhbnBpKGZsb2F0IHYpIHsKKyAgICByZXR1cm4gYXRhbmYodikgLyBNX1BJOworfQorCitzdGF0aWMgZmxvYXQgU0NfYXRhbjJwaShmbG9hdCB5LCBmbG9hdCB4KSB7CisgICAgcmV0dXJuIGF0YW4yZih5LCB4KSAvIE1fUEk7Cit9CisKK3N0YXRpYyBmbG9hdCBTQ19jb3NwaShmbG9hdCB2KSB7CisgICAgcmV0dXJuIGNvc2YodiAqIE1fUEkpOworfQorCitzdGF0aWMgZmxvYXQgU0NfZXhwMTAoZmxvYXQgdikgeworICAgIHJldHVybiBwb3coMTAuZiwgdik7CisKK30KKworc3RhdGljIGZsb2F0IFNDX2ZyYWN0KGZsb2F0IHYsIGludCAqaXB0cikgeworICAgIGludCBpID0gKGludClmbG9vcih2KTsKKyAgICBpcHRyWzBdID0gaTsKKyAgICByZXR1cm4gZm1pbih2IC0gaSwgMHgxLmZmZmZmZXAtMWYpOworfQorCitzdGF0aWMgZmxvYXQgU0NfbG9nMihmbG9hdCB2KSB7CisgICAgcmV0dXJuIGxvZzEwKHYpIC8gbG9nMTAoMi5mKTsKK30KKworc3RhdGljIGZsb2F0IFNDX3Bvd24oZmxvYXQgdiwgaW50IHApIHsKKyAgICByZXR1cm4gcG93Zih2LCAoZmxvYXQpcCk7Cit9CisKK3N0YXRpYyBmbG9hdCBTQ19wb3dyKGZsb2F0IHYsIGZsb2F0IHApIHsKKyAgICByZXR1cm4gcG93Zih2LCBwKTsKK30KKworZmxvYXQgU0Nfcm9vdG4oZmxvYXQgdiwgaW50IHIpIHsKKyAgICByZXR1cm4gcG93KHYsIDEuZiAvIHIpOworfQorCitmbG9hdCBTQ19yc3FydChmbG9hdCB2KSB7CisgICAgcmV0dXJuIDEuZiAvIHNxcnRmKHYpOworfQorCitmbG9hdCBTQ19zaW5jb3MoZmxvYXQgdiwgZmxvYXQgKmNvc3B0cikgeworICAgICpjb3NwdHIgPSBjb3NmKHYpOworICAgIHJldHVybiBzaW5mKHYpOworfQorCitzdGF0aWMgZmxvYXQgU0Nfc2lucGkoZmxvYXQgdikgeworICAgIHJldHVybiBzaW5mKHYgKiBNX1BJKTsKK30KKworc3RhdGljIGZsb2F0IFNDX3RhbnBpKGZsb2F0IHYpIHsKKyAgICByZXR1cm4gdGFuZih2ICogTV9QSSk7Cit9CisKKyAgICAvL3sgImxvZ2IiLCAodm9pZCAqKSYgfSwKKyAgICAvL3sgIm1hZCIsICh2b2lkICopJiB9LAorICAgIC8veyAibmFuIiwgKHZvaWQgKikmIH0sCisgICAgLy97ICJ0Z2FtbWEiLCAodm9pZCAqKSYgfSwKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBJbnRlZ2VyCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCitzdGF0aWMgdWludDMyX3QgU0NfYWJzX2kzMihpbnQzMl90IHYpIHtyZXR1cm4gYWJzKHYpO30KK3N0YXRpYyB1aW50MTZfdCBTQ19hYnNfaTE2KGludDE2X3Qgdikge3JldHVybiAodWludDE2X3QpYWJzKHYpO30KK3N0YXRpYyB1aW50OF90IFNDX2Fic19pOChpbnQ4X3Qgdikge3JldHVybiAodWludDhfdClhYnModik7fQorCitzdGF0aWMgdWludDMyX3QgU0NfY2x6X3UzMih1aW50MzJfdCB2KSB7cmV0dXJuIF9fYnVpbHRpbl9jbHoodik7fQorc3RhdGljIHVpbnQxNl90IFNDX2Nsel91MTYodWludDE2X3Qgdikge3JldHVybiAodWludDE2X3QpX19idWlsdGluX2Nseih2KTt9CitzdGF0aWMgdWludDhfdCBTQ19jbHpfdTgodWludDhfdCB2KSB7cmV0dXJuICh1aW50OF90KV9fYnVpbHRpbl9jbHoodik7fQorc3RhdGljIGludDMyX3QgU0NfY2x6X2kzMihpbnQzMl90IHYpIHtyZXR1cm4gKGludDMyX3QpX19idWlsdGluX2NseigodWludDMyX3Qpdik7fQorc3RhdGljIGludDE2X3QgU0NfY2x6X2kxNihpbnQxNl90IHYpIHtyZXR1cm4gKGludDE2X3QpX19idWlsdGluX2Nseih2KTt9CitzdGF0aWMgaW50OF90IFNDX2Nsel9pOChpbnQ4X3Qgdikge3JldHVybiAoaW50OF90KV9fYnVpbHRpbl9jbHoodik7fQorCitzdGF0aWMgdWludDMyX3QgU0NfbWF4X3UzMih1aW50MzJfdCB2LCB1aW50MzJfdCB2Mikge3JldHVybiByc01heCh2LCB2Mik7fQorc3RhdGljIHVpbnQxNl90IFNDX21heF91MTYodWludDE2X3QgdiwgdWludDE2X3QgdjIpIHtyZXR1cm4gcnNNYXgodiwgdjIpO30KK3N0YXRpYyB1aW50OF90IFNDX21heF91OCh1aW50OF90IHYsIHVpbnQ4X3QgdjIpIHtyZXR1cm4gcnNNYXgodiwgdjIpO30KK3N0YXRpYyBpbnQzMl90IFNDX21heF9pMzIoaW50MzJfdCB2LCBpbnQzMl90IHYyKSB7cmV0dXJuIHJzTWF4KHYsIHYyKTt9CitzdGF0aWMgaW50MTZfdCBTQ19tYXhfaTE2KGludDE2X3QgdiwgaW50MTZfdCB2Mikge3JldHVybiByc01heCh2LCB2Mik7fQorc3RhdGljIGludDhfdCBTQ19tYXhfaTgoaW50OF90IHYsIGludDhfdCB2Mikge3JldHVybiByc01heCh2LCB2Mik7fQorCitzdGF0aWMgdWludDMyX3QgU0NfbWluX3UzMih1aW50MzJfdCB2LCB1aW50MzJfdCB2Mikge3JldHVybiByc01pbih2LCB2Mik7fQorc3RhdGljIHVpbnQxNl90IFNDX21pbl91MTYodWludDE2X3QgdiwgdWludDE2X3QgdjIpIHtyZXR1cm4gcnNNaW4odiwgdjIpO30KK3N0YXRpYyB1aW50OF90IFNDX21pbl91OCh1aW50OF90IHYsIHVpbnQ4X3QgdjIpIHtyZXR1cm4gcnNNaW4odiwgdjIpO30KK3N0YXRpYyBpbnQzMl90IFNDX21pbl9pMzIoaW50MzJfdCB2LCBpbnQzMl90IHYyKSB7cmV0dXJuIHJzTWluKHYsIHYyKTt9CitzdGF0aWMgaW50MTZfdCBTQ19taW5faTE2KGludDE2X3QgdiwgaW50MTZfdCB2Mikge3JldHVybiByc01pbih2LCB2Mik7fQorc3RhdGljIGludDhfdCBTQ19taW5faTgoaW50OF90IHYsIGludDhfdCB2Mikge3JldHVybiByc01pbih2LCB2Mik7fQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEZsb2F0IHV0aWwKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitzdGF0aWMgZmxvYXQgU0NfY2xhbXBfZjMyKGZsb2F0IGFtb3VudCwgZmxvYXQgbG93LCBmbG9hdCBoaWdoKQoreworICAgIHJldHVybiBhbW91bnQgPCBsb3cgPyBsb3cgOiAoYW1vdW50ID4gaGlnaCA/IGhpZ2ggOiBhbW91bnQpOworfQorCitzdGF0aWMgZmxvYXQgU0NfZGVncmVlcyhmbG9hdCByYWRpYW5zKQoreworICAgIHJldHVybiByYWRpYW5zICogKDE4MC5mIC8gTV9QSSk7Cit9CisKK3N0YXRpYyBmbG9hdCBTQ19tYXhfZjMyKGZsb2F0IHYsIGZsb2F0IHYyKQoreworICAgIHJldHVybiByc01heCh2LCB2Mik7Cit9CisKK3N0YXRpYyBmbG9hdCBTQ19taW5fZjMyKGZsb2F0IHYsIGZsb2F0IHYyKQoreworICAgIHJldHVybiByc01pbih2LCB2Mik7Cit9CisKK3N0YXRpYyBmbG9hdCBTQ19taXhfZjMyKGZsb2F0IHN0YXJ0LCBmbG9hdCBzdG9wLCBmbG9hdCBhbW91bnQpCit7CisgICAgLy9MT0dFKCJsZXJwZiAlZiAgJWYgICVmIiwgc3RhcnQsIHN0b3AsIGFtb3VudCk7CisgICAgcmV0dXJuIHN0YXJ0ICsgKHN0b3AgLSBzdGFydCkgKiBhbW91bnQ7Cit9CisKK3N0YXRpYyBmbG9hdCBTQ19yYWRpYW5zKGZsb2F0IGRlZ3JlZXMpCit7CisgICAgcmV0dXJuIGRlZ3JlZXMgKiAoTV9QSSAvIDE4MC5mKTsKK30KKworc3RhdGljIGZsb2F0IFNDX3N0ZXBfZjMyKGZsb2F0IGVkZ2UsIGZsb2F0IHYpCit7CisgICAgaWYgKHYgPCBlZGdlKSByZXR1cm4gMC5mOworICAgIHJldHVybiAxLmY7Cit9CisKK3N0YXRpYyBmbG9hdCBTQ19zaWduX2YzMihmbG9hdCB2YWx1ZSkKK3sKKyAgICBpZiAodmFsdWUgPiAwKSByZXR1cm4gMS5mOworICAgIGlmICh2YWx1ZSA8IDApIHJldHVybiAtMS5mOworICAgIHJldHVybiB2YWx1ZTsKK30KKworCisKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENsYXNzIGltcGxlbWVudGF0aW9uCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLy8gbGx2bSBuYW1lIG1hbmdsaW5nIHJlZgorLy8gIDxidWlsdGluLXR5cGU+IDo6PSB2ICAjIHZvaWQKKy8vICAgICAgICAgICAgICAgICA6Oj0gYiAgIyBib29sCisvLyAgICAgICAgICAgICAgICAgOjo9IGMgICMgY2hhcgorLy8gICAgICAgICAgICAgICAgIDo6PSBhICAjIHNpZ25lZCBjaGFyCisvLyAgICAgICAgICAgICAgICAgOjo9IGggICMgdW5zaWduZWQgY2hhcgorLy8gICAgICAgICAgICAgICAgIDo6PSBzICAjIHNob3J0CisvLyAgICAgICAgICAgICAgICAgOjo9IHQgICMgdW5zaWduZWQgc2hvcnQKKy8vICAgICAgICAgICAgICAgICA6Oj0gaSAgIyBpbnQKKy8vICAgICAgICAgICAgICAgICA6Oj0gaiAgIyB1bnNpZ25lZCBpbnQKKy8vICAgICAgICAgICAgICAgICA6Oj0gbCAgIyBsb25nCisvLyAgICAgICAgICAgICAgICAgOjo9IG0gICMgdW5zaWduZWQgbG9uZworLy8gICAgICAgICAgICAgICAgIDo6PSB4ICAjIGxvbmcgbG9uZywgX19pbnQ2NAorLy8gICAgICAgICAgICAgICAgIDo6PSB5ICAjIHVuc2lnbmVkIGxvbmcgbG9uZywgX19pbnQ2NAorLy8gICAgICAgICAgICAgICAgIDo6PSBmICAjIGZsb2F0CisvLyAgICAgICAgICAgICAgICAgOjo9IGQgICMgZG91YmxlCisKK3N0YXRpYyBTY3JpcHRDU3RhdGU6OlN5bWJvbFRhYmxlX3QgZ1N5bXNbXSA9IHsKKyAgICAvLyBPcGVuQ0wgbWF0aAorICAgIHsgIl9aNGFjb3NmIiwgKHZvaWQgKikmYWNvc2YgfSwKKyAgICB7ICJfWjVhY29zaGYiLCAodm9pZCAqKSZhY29zaGYgfSwKKyAgICB7ICJfWjZhY29zcGlmIiwgKHZvaWQgKikmU0NfYWNvc3BpIH0sCisgICAgeyAiX1o0YXNpbmYiLCAodm9pZCAqKSZhc2luZiB9LAorICAgIHsgIl9aNWFzaW5oZiIsICh2b2lkICopJmFzaW5oZiB9LAorICAgIHsgIl9aNmFzaW5waWYiLCAodm9pZCAqKSZTQ19hc2lucGkgfSwKKyAgICB7ICJfWjRhdGFuZiIsICh2b2lkICopJmF0YW5mIH0sCisgICAgeyAiX1o1YXRhbjJmIiwgKHZvaWQgKikmYXRhbjJmIH0sCisgICAgeyAiX1o2YXRhbnBpZiIsICh2b2lkICopJlNDX2F0YW5waSB9LAorICAgIHsgIl9aN2F0YW4ycGlmIiwgKHZvaWQgKikmU0NfYXRhbjJwaSB9LAorICAgIHsgIl9aNGNicnRmIiwgKHZvaWQgKikmY2JydGYgfSwKKyAgICB7ICJfWjRjZWlsZiIsICh2b2lkICopJmNlaWxmIH0sCisgICAgeyAiX1o4Y29weXNpZ25mZiIsICh2b2lkICopJmNvcHlzaWduZiB9LAorICAgIHsgIl9aM2Nvc2YiLCAodm9pZCAqKSZjb3NmIH0sCisgICAgeyAiX1o0Y29zaGYiLCAodm9pZCAqKSZjb3NoZiB9LAorICAgIHsgIl9aNWNvc3BpZiIsICh2b2lkICopJlNDX2Nvc3BpIH0sCisgICAgeyAiX1o0ZXJmY2YiLCAodm9pZCAqKSZlcmZjZiB9LAorICAgIHsgIl9aM2VyZmYiLCAodm9pZCAqKSZlcmZmIH0sCisgICAgeyAiX1ozZXhwZiIsICh2b2lkICopJmV4cGYgfSwKKyAgICB7ICJfWjRleHAyZiIsICh2b2lkICopJmV4cDJmIH0sCisgICAgeyAiX1o1ZXhwMTBmIiwgKHZvaWQgKikmU0NfZXhwMTAgfSwKKyAgICB7ICJfWjVleHBtMWYiLCAodm9pZCAqKSZleHBtMWYgfSwKKyAgICB7ICJfWjRmYWJzZiIsICh2b2lkICopJmZhYnNmIH0sCisgICAgeyAiX1o0ZmRpbWZmIiwgKHZvaWQgKikmZmRpbWYgfSwKKyAgICB7ICJfWjVmbG9vcmYiLCAodm9pZCAqKSZmbG9vcmYgfSwKKyAgICB7ICJfWjNmbWFmZmYiLCAodm9pZCAqKSZmbWFmIH0sCisgICAgeyAiX1o0Zm1heGZmIiwgKHZvaWQgKikmZm1heGYgfSwKKyAgICB7ICJfWjRmbWluZmYiLCAodm9pZCAqKSZmbWluZiB9LCAgLy8gZmxvYXQgZm1pbihmbG9hdCwgZmxvYXQpCisgICAgeyAiX1o0Zm1vZGZmIiwgKHZvaWQgKikmZm1vZGYgfSwKKyAgICB7ICJfWjVmcmFjdGZQZiIsICh2b2lkICopJlNDX2ZyYWN0IH0sCisgICAgeyAiX1o1ZnJleHBmUGkiLCAodm9pZCAqKSZmcmV4cGYgfSwKKyAgICB7ICJfWjVoeXBvdGZmIiwgKHZvaWQgKikmaHlwb3RmIH0sCisgICAgeyAiX1o1aWxvZ2JmIiwgKHZvaWQgKikmaWxvZ2JmIH0sCisgICAgeyAiX1o1bGRleHBmaSIsICh2b2lkICopJmxkZXhwZiB9LAorICAgIHsgIl9aNmxnYW1tYWYiLCAodm9pZCAqKSZsZ2FtbWFmIH0sCisgICAgeyAiX1ozbG9nZiIsICh2b2lkICopJmxvZ2YgfSwKKyAgICB7ICJfWjRsb2cyZiIsICh2b2lkICopJlNDX2xvZzIgfSwKKyAgICB7ICJfWjVsb2cxMGYiLCAodm9pZCAqKSZsb2cxMGYgfSwKKyAgICB7ICJfWjVsb2cxcGYiLCAodm9pZCAqKSZsb2cxcGYgfSwKKyAgICAvL3sgImxvZ2IiLCAodm9pZCAqKSYgfSwKKyAgICAvL3sgIm1hZCIsICh2b2lkICopJiB9LAorICAgIHsgIm1vZGYiLCAodm9pZCAqKSZtb2RmZiB9LAorICAgIC8veyAibmFuIiwgKHZvaWQgKikmIH0sCisgICAgeyAiX1o5bmV4dGFmdGVyZmYiLCAodm9pZCAqKSZuZXh0YWZ0ZXJmIH0sCisgICAgeyAiX1ozcG93ZmYiLCAodm9pZCAqKSZwb3dmIH0sCisgICAgeyAiX1o0cG93bmZpIiwgKHZvaWQgKikmU0NfcG93biB9LAorICAgIHsgIl9aNHBvd3JmZiIsICh2b2lkICopJlNDX3Bvd3IgfSwKKyAgICB7ICJfWjlyZW1haW5kZXJmZiIsICh2b2lkICopJnJlbWFpbmRlcmYgfSwKKyAgICB7ICJyZW1xdW8iLCAodm9pZCAqKSZyZW1xdW9mIH0sCisgICAgeyAiX1o0cmludGYiLCAodm9pZCAqKSZyaW50ZiB9LAorICAgIHsgIl9aNXJvb3RuZmkiLCAodm9pZCAqKSZTQ19yb290biB9LAorICAgIHsgIl9aNXJvdW5kZiIsICh2b2lkICopJnJvdW5kZiB9LAorICAgIHsgIl9aNXJzcXJ0ZiIsICh2b2lkICopJlNDX3JzcXJ0IH0sCisgICAgeyAiX1ozc2luZiIsICh2b2lkICopJnNpbmYgfSwKKyAgICB7ICJzaW5jb3MiLCAodm9pZCAqKSZTQ19zaW5jb3MgfSwKKyAgICB7ICJfWjRzaW5oZiIsICh2b2lkICopJnNpbmhmIH0sCisgICAgeyAiX1o1c2lucGlmIiwgKHZvaWQgKikmU0Nfc2lucGkgfSwKKyAgICB7ICJfWjRzcXJ0ZiIsICh2b2lkICopJnNxcnRmIH0sCisgICAgeyAiX1ozdGFuZiIsICh2b2lkICopJnRhbmYgfSwKKyAgICB7ICJfWjR0YW5oZiIsICh2b2lkICopJnRhbmhmIH0sCisgICAgeyAiX1o1dGFucGlmIiwgKHZvaWQgKikmU0NfdGFucGkgfSwKKyAgICAvL3sgInRnYW1tYSIsICh2b2lkICopJiB9LAorICAgIHsgIl9aNXRydW5jZiIsICh2b2lkICopJnRydW5jZiB9LAorCisgICAgLy8gT3BlbkNMIEludAorICAgIHsgIl9aM2Fic2kiLCAodm9pZCAqKSZTQ19hYnNfaTMyIH0sCisgICAgeyAiX1ozYWJzcyIsICh2b2lkICopJlNDX2Fic19pMTYgfSwKKyAgICB7ICJfWjNhYnNjIiwgKHZvaWQgKikmU0NfYWJzX2k4IH0sCisgICAgeyAiX1ozY2x6aiIsICh2b2lkICopJlNDX2Nsel91MzIgfSwKKyAgICB7ICJfWjNjbHp0IiwgKHZvaWQgKikmU0NfY2x6X3UxNiB9LAorICAgIHsgIl9aM2NsemgiLCAodm9pZCAqKSZTQ19jbHpfdTggfSwKKyAgICB7ICJfWjNjbHppIiwgKHZvaWQgKikmU0NfY2x6X2kzMiB9LAorICAgIHsgIl9aM2NsenMiLCAodm9pZCAqKSZTQ19jbHpfaTE2IH0sCisgICAgeyAiX1ozY2x6YyIsICh2b2lkICopJlNDX2Nsel9pOCB9LAorICAgIHsgIl9aM21heGpqIiwgKHZvaWQgKikmU0NfbWF4X3UzMiB9LAorICAgIHsgIl9aM21heHR0IiwgKHZvaWQgKikmU0NfbWF4X3UxNiB9LAorICAgIHsgIl9aM21heGhoIiwgKHZvaWQgKikmU0NfbWF4X3U4IH0sCisgICAgeyAiX1ozbWF4aWkiLCAodm9pZCAqKSZTQ19tYXhfaTMyIH0sCisgICAgeyAiX1ozbWF4c3MiLCAodm9pZCAqKSZTQ19tYXhfaTE2IH0sCisgICAgeyAiX1ozbWF4Y2MiLCAodm9pZCAqKSZTQ19tYXhfaTggfSwKKyAgICB7ICJfWjNtaW5qaiIsICh2b2lkICopJlNDX21pbl91MzIgfSwKKyAgICB7ICJfWjNtaW50dCIsICh2b2lkICopJlNDX21pbl91MTYgfSwKKyAgICB7ICJfWjNtaW5oaCIsICh2b2lkICopJlNDX21pbl91OCB9LAorICAgIHsgIl9aM21pbmlpIiwgKHZvaWQgKikmU0NfbWluX2kzMiB9LAorICAgIHsgIl9aM21pbnNzIiwgKHZvaWQgKikmU0NfbWluX2kxNiB9LAorICAgIHsgIl9aM21pbmNjIiwgKHZvaWQgKikmU0NfbWluX2k4IH0sCisKKyAgICAvLyBPcGVuQ0wgNi4xMS40CisgICAgeyAiX1o1Y2xhbXBmZmYiLCAodm9pZCAqKSZTQ19jbGFtcF9mMzIgfSwKKyAgICB7ICJfWjdkZWdyZWVzZiIsICh2b2lkICopJlNDX2RlZ3JlZXMgfSwKKyAgICB7ICJfWjNtYXhmZiIsICh2b2lkICopJlNDX21heF9mMzIgfSwKKyAgICB7ICJfWjNtaW5mZiIsICh2b2lkICopJlNDX21pbl9mMzIgfSwKKyAgICB7ICJfWjNtaXhmZmYiLCAodm9pZCAqKSZTQ19taXhfZjMyIH0sCisgICAgeyAiX1o3cmFkaWFuc2YiLCAodm9pZCAqKSZTQ19yYWRpYW5zIH0sCisgICAgeyAiX1o0c3RlcGZmIiwgKHZvaWQgKikmU0Nfc3RlcF9mMzIgfSwKKyAgICAvL3sgInNtb290aHN0ZXAiLCAodm9pZCAqKSYgfSwKKyAgICB7ICJfWjRzaWduZiIsICh2b2lkICopJlNDX3NpZ25fZjMyIH0sCisKKyAgICB7IE5VTEwsIE5VTEwgfQorfTsKKworY29uc3QgU2NyaXB0Q1N0YXRlOjpTeW1ib2xUYWJsZV90ICogU2NyaXB0Q1N0YXRlOjpsb29rdXBTeW1ib2xDTChjb25zdCBjaGFyICpzeW0pCit7CisgICAgU2NyaXB0Q1N0YXRlOjpTeW1ib2xUYWJsZV90ICpzeW1zID0gZ1N5bXM7CisKKyAgICB3aGlsZSAoc3ltcy0+bVB0cikgeworICAgICAgICBpZiAoIXN0cmNtcChzeW1zLT5tTmFtZSwgc3ltKSkgeworICAgICAgICAgICAgcmV0dXJuIHN5bXM7CisgICAgICAgIH0KKyAgICAgICAgc3ltcysrOworICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc1NjcmlwdENfTGliR0wuY3BwIGIvbGlicy9ycy9yc1NjcmlwdENfTGliR0wuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiZDM5OGUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL3JzU2NyaXB0Q19MaWJHTC5jcHAKQEAgLTAsMCArMSw0MDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAicnNDb250ZXh0LmgiCisjaW5jbHVkZSAicnNTY3JpcHRDLmgiCisjaW5jbHVkZSAicnNNYXRyaXguaCIKKworI2luY2x1ZGUgImFjYy9hY2MuaCIKKyNpbmNsdWRlICJ1dGlscy9UaW1lcnMuaCIKKworI2RlZmluZSBHTF9HTEVYVF9QUk9UT1RZUEVTCisKKyNpbmNsdWRlIDxHTEVTL2dsLmg+CisjaW5jbHVkZSA8R0xFUy9nbGV4dC5oPgorI2luY2x1ZGUgPEdMRVMyL2dsMi5oPgorI2luY2x1ZGUgPEdMRVMyL2dsMmV4dC5oPgorCisjaW5jbHVkZSA8dGltZS5oPgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpyZW5kZXJzY3JpcHQ7CisKKyNkZWZpbmUgR0VUX1RMUygpICBDb250ZXh0OjpTY3JpcHRUTFNTdHJ1Y3QgKiB0bHMgPSBcCisgICAgKENvbnRleHQ6OlNjcmlwdFRMU1N0cnVjdCAqKXB0aHJlYWRfZ2V0c3BlY2lmaWMoQ29udGV4dDo6Z1RocmVhZFRMU0tleSk7IFwKKyAgICBDb250ZXh0ICogcnNjID0gdGxzLT5tQ29udGV4dDsgXAorICAgIFNjcmlwdEMgKiBzYyA9IChTY3JpcHRDICopIHRscy0+bVNjcmlwdAorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gSU8gcm91dGluZXMKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitzdGF0aWMgdm9pZCBTQ191cGRhdGVTaW1wbGVNZXNoKFJzU2ltcGxlTWVzaCBtZXNoKQoreworICAgIEdFVF9UTFMoKTsKKyAgICBTaW1wbGVNZXNoICpzbSA9IHN0YXRpY19jYXN0PFNpbXBsZU1lc2ggKj4obWVzaCk7CisgICAgc20tPnVwbG9hZEFsbChyc2MpOworfQorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQ29udGV4dAorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3N0YXRpYyB2b2lkIFNDX2JpbmRUZXh0dXJlKFJzUHJvZ3JhbUZyYWdtZW50IHZwZiwgdWludDMyX3Qgc2xvdCwgUnNBbGxvY2F0aW9uIHZhKQoreworICAgIEdFVF9UTFMoKTsKKyAgICByc2lfUHJvZ3JhbUJpbmRUZXh0dXJlKHJzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PFByb2dyYW1GcmFnbWVudCAqPih2cGYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xvdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEFsbG9jYXRpb24gKj4odmEpKTsKKworfQorCitzdGF0aWMgdm9pZCBTQ19iaW5kU2FtcGxlcihSc1Byb2dyYW1GcmFnbWVudCB2cGYsIHVpbnQzMl90IHNsb3QsIFJzU2FtcGxlciB2cykKK3sKKyAgICBHRVRfVExTKCk7CisgICAgcnNpX1Byb2dyYW1CaW5kU2FtcGxlcihyc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxQcm9ncmFtRnJhZ21lbnQgKj4odnBmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxTYW1wbGVyICo+KHZzKSk7CisKK30KKworc3RhdGljIHZvaWQgU0NfYmluZFByb2dyYW1TdG9yZShSc1Byb2dyYW1TdG9yZSBwZnMpCit7CisgICAgR0VUX1RMUygpOworICAgIHJzaV9Db250ZXh0QmluZFByb2dyYW1TdG9yZShyc2MsIHBmcyk7Cit9CisKK3N0YXRpYyB2b2lkIFNDX2JpbmRQcm9ncmFtRnJhZ21lbnQoUnNQcm9ncmFtRnJhZ21lbnQgcGYpCit7CisgICAgR0VUX1RMUygpOworICAgIHJzaV9Db250ZXh0QmluZFByb2dyYW1GcmFnbWVudChyc2MsIHBmKTsKK30KKworc3RhdGljIHZvaWQgU0NfYmluZFByb2dyYW1WZXJ0ZXgoUnNQcm9ncmFtVmVydGV4IHB2KQoreworICAgIEdFVF9UTFMoKTsKKyAgICByc2lfQ29udGV4dEJpbmRQcm9ncmFtVmVydGV4KHJzYywgcHYpOworfQorCitzdGF0aWMgdm9pZCBTQ19iaW5kUHJvZ3JhbVJhc3RlcihSc1Byb2dyYW1SYXN0ZXIgcHYpCit7CisgICAgR0VUX1RMUygpOworICAgIHJzaV9Db250ZXh0QmluZFByb2dyYW1SYXN0ZXIocnNjLCBwdik7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gVlAKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitzdGF0aWMgdm9pZCBTQ192cExvYWRNb2RlbE1hdHJpeChjb25zdCByc2NfTWF0cml4ICptKQoreworICAgIEdFVF9UTFMoKTsKKyAgICByc2MtPmdldFZlcnRleCgpLT5zZXRNb2RlbHZpZXdNYXRyaXgobSk7Cit9CisKK3N0YXRpYyB2b2lkIFNDX3ZwTG9hZFRleHR1cmVNYXRyaXgoY29uc3QgcnNjX01hdHJpeCAqbSkKK3sKKyAgICBHRVRfVExTKCk7CisgICAgcnNjLT5nZXRWZXJ0ZXgoKS0+c2V0VGV4dHVyZU1hdHJpeChtKTsKK30KKworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gRHJhd2luZworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3N0YXRpYyB2b2lkIFNDX2RyYXdRdWFkVGV4Q29vcmRzKGZsb2F0IHgxLCBmbG9hdCB5MSwgZmxvYXQgejEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB1MSwgZmxvYXQgdjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB4MiwgZmxvYXQgeTIsIGZsb2F0IHoyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdTIsIGZsb2F0IHYyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeDMsIGZsb2F0IHkzLCBmbG9hdCB6MywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHUzLCBmbG9hdCB2MywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHg0LCBmbG9hdCB5NCwgZmxvYXQgejQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB1NCwgZmxvYXQgdjQpCit7CisgICAgR0VUX1RMUygpOworICAgIGlmICghcnNjLT5zZXR1cENoZWNrKCkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vTE9HRSgiUXVhZCIpOworICAgIC8vTE9HRSgiJTQuMmYsICU0LjJmLCAlNC4yZiIsIHgxLCB5MSwgejEpOworICAgIC8vTE9HRSgiJTQuMmYsICU0LjJmLCAlNC4yZiIsIHgyLCB5MiwgejIpOworICAgIC8vTE9HRSgiJTQuMmYsICU0LjJmLCAlNC4yZiIsIHgzLCB5MywgejMpOworICAgIC8vTE9HRSgiJTQuMmYsICU0LjJmLCAlNC4yZiIsIHg0LCB5NCwgejQpOworCisgICAgZmxvYXQgdnR4W10gPSB7eDEseTEsejEsIHgyLHkyLHoyLCB4Myx5Myx6MywgeDQseTQsejR9OworICAgIGNvbnN0IGZsb2F0IHRleFtdID0ge3UxLHYxLCB1Mix2MiwgdTMsdjMsIHU0LHY0fTsKKworICAgIFZlcnRleEFycmF5IHZhOworICAgIHZhLmFkZChHTF9GTE9BVCwgMywgMTIsIGZhbHNlLCAodWludDMyX3QpdnR4LCAicG9zaXRpb24iKTsKKyAgICB2YS5hZGQoR0xfRkxPQVQsIDIsIDgsIGZhbHNlLCAodWludDMyX3QpdGV4LCAidGV4dHVyZTAiKTsKKyAgICB2YS5zZXR1cEdMMihyc2MsICZyc2MtPm1TdGF0ZVZlcnRleEFycmF5LCAmcnNjLT5tU2hhZGVyQ2FjaGUpOworCisgICAgZ2xEcmF3QXJyYXlzKEdMX1RSSUFOR0xFX0ZBTiwgMCwgNCk7Cit9CisKK3N0YXRpYyB2b2lkIFNDX2RyYXdRdWFkKGZsb2F0IHgxLCBmbG9hdCB5MSwgZmxvYXQgejEsCisgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB4MiwgZmxvYXQgeTIsIGZsb2F0IHoyLAorICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeDMsIGZsb2F0IHkzLCBmbG9hdCB6MywKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHg0LCBmbG9hdCB5NCwgZmxvYXQgejQpCit7CisgICAgU0NfZHJhd1F1YWRUZXhDb29yZHMoeDEsIHkxLCB6MSwgMCwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB4MiwgeTIsIHoyLCAxLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgIHgzLCB5MywgejMsIDEsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgeDQsIHk0LCB6NCwgMCwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIFNDX2RyYXdTcHJpdGVTY3JlZW5zcGFjZShmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6LCBmbG9hdCB3LCBmbG9hdCBoKQoreworICAgIEdFVF9UTFMoKTsKKyAgICBPYmplY3RCYXNlUmVmPGNvbnN0IFByb2dyYW1WZXJ0ZXg+IHRtcChyc2MtPmdldFZlcnRleCgpKTsKKyAgICByc2MtPnNldFZlcnRleChyc2MtPmdldERlZmF1bHRQcm9ncmFtVmVydGV4KCkpOworICAgIC8vcnNjLT5zZXR1cENoZWNrKCk7CisKKyAgICAvL0dMaW50IGNyb3BbNF0gPSB7MCwgaCwgdywgLWh9OworCisgICAgZmxvYXQgc2ggPSByc2MtPmdldEhlaWdodCgpOworCisgICAgU0NfZHJhd1F1YWQoeCwgICBzaCAtIHksICAgICB6LAorICAgICAgICAgICAgICAgIHgrdywgc2ggLSB5LCAgICAgeiwKKyAgICAgICAgICAgICAgICB4K3csIHNoIC0gKHkraCksIHosCisgICAgICAgICAgICAgICAgeCwgICBzaCAtICh5K2gpLCB6KTsKKyAgICByc2MtPnNldFZlcnRleCgoUHJvZ3JhbVZlcnRleCAqKXRtcC5nZXQoKSk7Cit9CisvKgorc3RhdGljIHZvaWQgU0NfZHJhd1Nwcml0ZShmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6LCBmbG9hdCB3LCBmbG9hdCBoKQoreworICAgIEdFVF9UTFMoKTsKKyAgICBmbG9hdCB2aW5bM10gPSB7eCwgeSwgen07CisgICAgZmxvYXQgdm91dFs0XTsKKworICAgIC8vTE9HRSgiZHMgIGluICVmICVmICVmIiwgeCwgeSwgeik7CisgICAgcnNjLT5nZXRWZXJ0ZXgoKS0+dHJhbnNmb3JtVG9TY3JlZW4ocnNjLCB2b3V0LCB2aW4pOworICAgIC8vTE9HRSgiZHMgIG91dCAlZiAlZiAlZiAlZiIsIHZvdXRbMF0sIHZvdXRbMV0sIHZvdXRbMl0sIHZvdXRbM10pOworICAgIHZvdXRbMF0gLz0gdm91dFszXTsKKyAgICB2b3V0WzFdIC89IHZvdXRbM107CisgICAgdm91dFsyXSAvPSB2b3V0WzNdOworCisgICAgdm91dFswXSAqPSByc2MtPmdldFdpZHRoKCkgLyAyOworICAgIHZvdXRbMV0gKj0gcnNjLT5nZXRIZWlnaHQoKSAvIDI7CisgICAgdm91dFswXSArPSByc2MtPmdldFdpZHRoKCkgLyAyOworICAgIHZvdXRbMV0gKz0gcnNjLT5nZXRIZWlnaHQoKSAvIDI7CisKKyAgICB2b3V0WzBdIC09IHcvMjsKKyAgICB2b3V0WzFdIC09IGgvMjsKKworICAgIC8vTE9HRSgiZHMgIG91dDIgJWYgJWYgJWYiLCB2b3V0WzBdLCB2b3V0WzFdLCB2b3V0WzJdKTsKKworICAgIC8vIFUsIFYsIFcsIEgKKyAgICBTQ19kcmF3U3ByaXRlU2NyZWVuc3BhY2Uodm91dFswXSwgdm91dFsxXSwgeiwgaCwgdyk7CisgICAgLy9yc2MtPnNldHVwQ2hlY2soKTsKK30KKyovCisKK3N0YXRpYyB2b2lkIFNDX2RyYXdSZWN0KGZsb2F0IHgxLCBmbG9hdCB5MSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHgyLCBmbG9hdCB5MiwgZmxvYXQgeikKK3sKKyAgICAvL0xPR0UoIlNDX2RyYXdSZWN0ICVmLCVmICAlZiwlZiAgJWYiLCB4MSwgeTEsIHgyLCB5Miwgeik7CisgICAgU0NfZHJhd1F1YWQoeDEsIHkyLCB6LAorICAgICAgICAgICAgICAgIHgyLCB5MiwgeiwKKyAgICAgICAgICAgICAgICB4MiwgeTEsIHosCisgICAgICAgICAgICAgICAgeDEsIHkxLCB6KTsKK30KKworc3RhdGljIHZvaWQgU0NfZHJhd1NpbXBsZU1lc2goUnNTaW1wbGVNZXNoIHZzbSkKK3sKKyAgICBHRVRfVExTKCk7CisgICAgU2ltcGxlTWVzaCAqc20gPSBzdGF0aWNfY2FzdDxTaW1wbGVNZXNoICo+KHZzbSk7CisgICAgaWYgKCFyc2MtPnNldHVwQ2hlY2soKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHNtLT5yZW5kZXIocnNjKTsKK30KKworc3RhdGljIHZvaWQgU0NfZHJhd1NpbXBsZU1lc2hSYW5nZShSc1NpbXBsZU1lc2ggdnNtLCB1aW50MzJfdCBzdGFydCwgdWludDMyX3QgbGVuKQoreworICAgIEdFVF9UTFMoKTsKKyAgICBTaW1wbGVNZXNoICpzbSA9IHN0YXRpY19jYXN0PFNpbXBsZU1lc2ggKj4odnNtKTsKKyAgICBpZiAoIXJzYy0+c2V0dXBDaGVjaygpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc20tPnJlbmRlclJhbmdlKHJzYywgc3RhcnQsIGxlbik7Cit9CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKworc3RhdGljIHZvaWQgU0NfY29sb3IoZmxvYXQgciwgZmxvYXQgZywgZmxvYXQgYiwgZmxvYXQgYSkKK3sKKyAgICBHRVRfVExTKCk7CisgICAgcnNjLT5tU3RhdGVWZXJ0ZXguY29sb3JbMF0gPSByOworICAgIHJzYy0+bVN0YXRlVmVydGV4LmNvbG9yWzFdID0gZzsKKyAgICByc2MtPm1TdGF0ZVZlcnRleC5jb2xvclsyXSA9IGI7CisgICAgcnNjLT5tU3RhdGVWZXJ0ZXguY29sb3JbM10gPSBhOworICAgIGlmICghcnNjLT5jaGVja1ZlcnNpb24yXzAoKSkgeworICAgICAgICBnbENvbG9yNGYociwgZywgYiwgYSk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBTQ191cGxvYWRUb1RleHR1cmUyKFJzQWxsb2NhdGlvbiB2YSwgdWludDMyX3QgYmFzZU1pcExldmVsKQoreworICAgIEdFVF9UTFMoKTsKKyAgICByc2lfQWxsb2NhdGlvblVwbG9hZFRvVGV4dHVyZShyc2MsIHZhLCBmYWxzZSwgYmFzZU1pcExldmVsKTsKK30KK3N0YXRpYyB2b2lkIFNDX3VwbG9hZFRvVGV4dHVyZShSc0FsbG9jYXRpb24gdmEpCit7CisgICAgR0VUX1RMUygpOworICAgIHJzaV9BbGxvY2F0aW9uVXBsb2FkVG9UZXh0dXJlKHJzYywgdmEsIGZhbHNlLCAwKTsKK30KKworc3RhdGljIHZvaWQgU0NfdXBsb2FkVG9CdWZmZXJPYmplY3QoUnNBbGxvY2F0aW9uIHZhKQoreworICAgIEdFVF9UTFMoKTsKKyAgICByc2lfQWxsb2NhdGlvblVwbG9hZFRvQnVmZmVyT2JqZWN0KHJzYywgdmEpOworfQorCitzdGF0aWMgdm9pZCBTQ19DbGVhckNvbG9yKGZsb2F0IHIsIGZsb2F0IGcsIGZsb2F0IGIsIGZsb2F0IGEpCit7CisgICAgR0VUX1RMUygpOworICAgIGlmICghcnNjLT5zZXR1cENoZWNrKCkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGdsQ2xlYXJDb2xvcihyLCBnLCBiLCBhKTsKKyAgICBnbENsZWFyKEdMX0NPTE9SX0JVRkZFUl9CSVQpOworfQorCitzdGF0aWMgdm9pZCBTQ19DbGVhckRlcHRoKGZsb2F0IHYpCit7CisgICAgR0VUX1RMUygpOworICAgIGlmICghcnNjLT5zZXR1cENoZWNrKCkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGdsQ2xlYXJEZXB0aGYodik7CisgICAgZ2xDbGVhcihHTF9ERVBUSF9CVUZGRVJfQklUKTsKK30KKworc3RhdGljIHVpbnQzMl90IFNDX2dldFdpZHRoKCkKK3sKKyAgICBHRVRfVExTKCk7CisgICAgcmV0dXJuIHJzYy0+Z2V0V2lkdGgoKTsKK30KKworc3RhdGljIHVpbnQzMl90IFNDX2dldEhlaWdodCgpCit7CisgICAgR0VUX1RMUygpOworICAgIHJldHVybiByc2MtPmdldEhlaWdodCgpOworfQorCitzdGF0aWMgdm9pZCBTQ19EcmF3VGV4dEFsbG9jKFJzQWxsb2NhdGlvbiB2YSwgaW50IHgsIGludCB5KQoreworICAgIEdFVF9UTFMoKTsKKyAgICBBbGxvY2F0aW9uICphbGxvYyA9IHN0YXRpY19jYXN0PEFsbG9jYXRpb24gKj4odmEpOworICAgIHJzYy0+bVN0YXRlRm9udC5yZW5kZXJUZXh0KGFsbG9jLCB4LCB5KTsKK30KKworc3RhdGljIHZvaWQgU0NfRHJhd1RleHQoY29uc3QgY2hhciAqdGV4dCwgaW50IHgsIGludCB5KQoreworICAgIEdFVF9UTFMoKTsKKyAgICByc2MtPm1TdGF0ZUZvbnQucmVuZGVyVGV4dCh0ZXh0LCB4LCB5KTsKK30KKworc3RhdGljIHZvaWQgU0NfQmluZEZvbnQoUnNGb250IGZvbnQpCit7CisgICAgR0VUX1RMUygpOworICAgIHJzaV9Db250ZXh0QmluZEZvbnQocnNjLCBmb250KTsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDbGFzcyBpbXBsZW1lbnRhdGlvbgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8vIGxsdm0gbmFtZSBtYW5nbGluZyByZWYKKy8vICA8YnVpbHRpbi10eXBlPiA6Oj0gdiAgIyB2b2lkCisvLyAgICAgICAgICAgICAgICAgOjo9IGIgICMgYm9vbAorLy8gICAgICAgICAgICAgICAgIDo6PSBjICAjIGNoYXIKKy8vICAgICAgICAgICAgICAgICA6Oj0gYSAgIyBzaWduZWQgY2hhcgorLy8gICAgICAgICAgICAgICAgIDo6PSBoICAjIHVuc2lnbmVkIGNoYXIKKy8vICAgICAgICAgICAgICAgICA6Oj0gcyAgIyBzaG9ydAorLy8gICAgICAgICAgICAgICAgIDo6PSB0ICAjIHVuc2lnbmVkIHNob3J0CisvLyAgICAgICAgICAgICAgICAgOjo9IGkgICMgaW50CisvLyAgICAgICAgICAgICAgICAgOjo9IGogICMgdW5zaWduZWQgaW50CisvLyAgICAgICAgICAgICAgICAgOjo9IGwgICMgbG9uZworLy8gICAgICAgICAgICAgICAgIDo6PSBtICAjIHVuc2lnbmVkIGxvbmcKKy8vICAgICAgICAgICAgICAgICA6Oj0geCAgIyBsb25nIGxvbmcsIF9faW50NjQKKy8vICAgICAgICAgICAgICAgICA6Oj0geSAgIyB1bnNpZ25lZCBsb25nIGxvbmcsIF9faW50NjQKKy8vICAgICAgICAgICAgICAgICA6Oj0gZiAgIyBmbG9hdAorLy8gICAgICAgICAgICAgICAgIDo6PSBkICAjIGRvdWJsZQorCitzdGF0aWMgU2NyaXB0Q1N0YXRlOjpTeW1ib2xUYWJsZV90IGdTeW1zW10gPSB7CisgICAgeyAicnNnQmluZFByb2dyYW1GcmFnbWVudCIsICh2b2lkICopJlNDX2JpbmRQcm9ncmFtRnJhZ21lbnQgfSwKKyAgICB7ICJyc2dCaW5kUHJvZ3JhbVN0b3JlIiwgKHZvaWQgKikmU0NfYmluZFByb2dyYW1TdG9yZSB9LAorICAgIHsgInJzZ0JpbmRQcm9ncmFtVmVydGV4IiwgKHZvaWQgKikmU0NfYmluZFByb2dyYW1WZXJ0ZXggfSwKKyAgICB7ICJyc2dCaW5kUHJvZ3JhbVJhc3RlciIsICh2b2lkICopJlNDX2JpbmRQcm9ncmFtUmFzdGVyIH0sCisgICAgeyAicnNnQmluZFNhbXBsZXIiLCAodm9pZCAqKSZTQ19iaW5kU2FtcGxlciB9LAorICAgIHsgInJzZ0JpbmRUZXh0dXJlIiwgKHZvaWQgKikmU0NfYmluZFRleHR1cmUgfSwKKworICAgIHsgInJzZ1Byb2dyYW1WZXJ0ZXhMb2FkTW9kZWxNYXRyaXgiLCAodm9pZCAqKSZTQ192cExvYWRNb2RlbE1hdHJpeCB9LAorICAgIHsgInJzZ1Byb2dyYW1WZXJ0ZXhMb2FkVGV4dHVyZU1hdHJpeCIsICh2b2lkICopJlNDX3ZwTG9hZFRleHR1cmVNYXRyaXggfSwKKworICAgIHsgInJzZ0dldFdpZHRoIiwgKHZvaWQgKikmU0NfZ2V0V2lkdGggfSwKKyAgICB7ICJyc2dHZXRIZWlnaHQiLCAodm9pZCAqKSZTQ19nZXRIZWlnaHQgfSwKKworICAgIHsgIl9aMThyc2dVcGxvYWRUb1RleHR1cmUxM3JzX2FsbG9jYXRpb25pIiwgKHZvaWQgKikmU0NfdXBsb2FkVG9UZXh0dXJlMiB9LAorICAgIHsgIl9aMThyc2dVcGxvYWRUb1RleHR1cmUxM3JzX2FsbG9jYXRpb24iLCAodm9pZCAqKSZTQ191cGxvYWRUb1RleHR1cmUgfSwKKyAgICB7ICJyc2dVcGxvYWRUb0J1ZmZlck9iamVjdCIsICh2b2lkICopJlNDX3VwbG9hZFRvQnVmZmVyT2JqZWN0IH0sCisKKyAgICB7ICJyc2dEcmF3UmVjdCIsICh2b2lkICopJlNDX2RyYXdSZWN0IH0sCisgICAgeyAicnNnRHJhd1F1YWQiLCAodm9pZCAqKSZTQ19kcmF3UXVhZCB9LAorICAgIHsgInJzZ0RyYXdRdWFkVGV4Q29vcmRzIiwgKHZvaWQgKikmU0NfZHJhd1F1YWRUZXhDb29yZHMgfSwKKyAgICAvL3sgImRyYXdTcHJpdGUiLCAodm9pZCAqKSZTQ19kcmF3U3ByaXRlIH0sCisgICAgeyAicnNnRHJhd1Nwcml0ZVNjcmVlbnNwYWNlIiwgKHZvaWQgKikmU0NfZHJhd1Nwcml0ZVNjcmVlbnNwYWNlIH0sCisgICAgeyAiX1oxN3JzZ0RyYXdTaW1wbGVNZXNoN3JzX21lc2giLCAodm9pZCAqKSZTQ19kcmF3U2ltcGxlTWVzaCB9LAorICAgIHsgIl9aMTdyc2dEcmF3U2ltcGxlTWVzaDdyc19tZXNoaWkiLCAodm9pZCAqKSZTQ19kcmF3U2ltcGxlTWVzaFJhbmdlIH0sCisKKyAgICB7ICJyc2dDbGVhckNvbG9yIiwgKHZvaWQgKikmU0NfQ2xlYXJDb2xvciB9LAorICAgIHsgInJzZ0NsZWFyRGVwdGgiLCAodm9pZCAqKSZTQ19DbGVhckRlcHRoIH0sCisKKyAgICB7ICJfWjExcnNnRHJhd1RleHRQS2NpaSIsICh2b2lkICopJlNDX0RyYXdUZXh0IH0sCisgICAgeyAiX1oxMXJzZ0RyYXdUZXh0MTNyc19hbGxvY2F0aW9uaWkiLCAodm9pZCAqKSZTQ19EcmF3VGV4dEFsbG9jIH0sCisKKyAgICB7ICJyc2dCaW5kRm9udCIsICh2b2lkICopJlNDX0JpbmRGb250IH0sCisKKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgLy8gSU8KKyAgICB7ICJ1cGRhdGVTaW1wbGVNZXNoIiwgKHZvaWQgKikmU0NfdXBkYXRlU2ltcGxlTWVzaCB9LAorCisgICAgLy8gbWlzYworICAgIHsgImNvbG9yIiwgKHZvaWQgKikmU0NfY29sb3IgfSwKKworICAgIHsgTlVMTCwgTlVMTCB9Cit9OworCitjb25zdCBTY3JpcHRDU3RhdGU6OlN5bWJvbFRhYmxlX3QgKiBTY3JpcHRDU3RhdGU6Omxvb2t1cFN5bWJvbEdMKGNvbnN0IGNoYXIgKnN5bSkKK3sKKyAgICBTY3JpcHRDU3RhdGU6OlN5bWJvbFRhYmxlX3QgKnN5bXMgPSBnU3ltczsKKworICAgIHdoaWxlIChzeW1zLT5tUHRyKSB7CisgICAgICAgIGlmICghc3RyY21wKHN5bXMtPm1OYW1lLCBzeW0pKSB7CisgICAgICAgICAgICByZXR1cm4gc3ltczsKKyAgICAgICAgfQorICAgICAgICBzeW1zKys7CisgICAgfQorICAgIHJldHVybiBOVUxMOworfQorCmRpZmYgLS1naXQgYS9saWJzL3JzL3JzU2hhZGVyQ2FjaGUuY3BwIGIvbGlicy9ycy9yc1NoYWRlckNhY2hlLmNwcAppbmRleCA0NzExZDFiLi41MDRmZmJhIDEwMDY0NAotLS0gYS9saWJzL3JzL3JzU2hhZGVyQ2FjaGUuY3BwCisrKyBiL2xpYnMvcnMvcnNTaGFkZXJDYWNoZS5jcHAKQEAgLTE0LDEwICsxNCwxNCBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorI2lmbmRlZiBBTkRST0lEX1JTX0JVSUxEX0ZPUl9IT1NUCiAjaW5jbHVkZSAicnNDb250ZXh0LmgiCi0KICNpbmNsdWRlIDxHTEVTL2dsLmg+CiAjaW5jbHVkZSA8R0xFUzIvZ2wyLmg+CisjZWxzZQorI2luY2x1ZGUgInJzQ29udGV4dEhvc3RTdHViLmgiCisjaW5jbHVkZSA8T3BlbkdML2dsLmg+CisjZW5kaWYgLy9BTkRST0lEX1JTX0JVSUxEX0ZPUl9IT1NUCiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OnJlbmRlcnNjcmlwdDsKQEAgLTk0LDE2ICs5OCwxMSBAQAogICAgICAgICBnbEF0dGFjaFNoYWRlcihwZ20sIGZyYWctPmdldFNoYWRlcklEKCkpOwogCiAgICAgICAgIGlmICghdnR4LT5pc1VzZXJQcm9ncmFtKCkpIHsKLSAgICAgICAgICAgIGdsQmluZEF0dHJpYkxvY2F0aW9uKHBnbSwgMCwgIkFUVFJJQl9MZWdhY3lQb3NpdGlvbiIpOwotICAgICAgICAgICAgZ2xCaW5kQXR0cmliTG9jYXRpb24ocGdtLCAxLCAiQVRUUklCX0xlZ2FjeUNvbG9yIik7Ci0gICAgICAgICAgICBnbEJpbmRBdHRyaWJMb2NhdGlvbihwZ20sIDIsICJBVFRSSUJfTGVnYWN5Tm9ybWFsIik7Ci0gICAgICAgICAgICBnbEJpbmRBdHRyaWJMb2NhdGlvbihwZ20sIDMsICJBVFRSSUJfTGVnYWN5UG9pbnRTaXplIik7Ci0gICAgICAgICAgICBnbEJpbmRBdHRyaWJMb2NhdGlvbihwZ20sIDQsICJBVFRSSUJfTGVnYWN5VGV4dHVyZSIpOwotICAgICAgICAgICAgZS0+bVZ0eEF0dHJpYlNsb3RzW1JTX0tJTkRfUE9TSVRJT05dID0gMDsKLSAgICAgICAgICAgIGUtPm1WdHhBdHRyaWJTbG90c1tSU19LSU5EX0NPTE9SXSA9IDE7Ci0gICAgICAgICAgICBlLT5tVnR4QXR0cmliU2xvdHNbUlNfS0lORF9OT1JNQUxdID0gMjsKLSAgICAgICAgICAgIGUtPm1WdHhBdHRyaWJTbG90c1tSU19LSU5EX1BPSU5UX1NJWkVdID0gMzsKLSAgICAgICAgICAgIGUtPm1WdHhBdHRyaWJTbG90c1tSU19LSU5EX1RFWFRVUkVdID0gNDsKKyAgICAgICAgICAgIGdsQmluZEF0dHJpYkxvY2F0aW9uKHBnbSwgMCwgIkFUVFJJQl9wb3NpdGlvbiIpOworICAgICAgICAgICAgZ2xCaW5kQXR0cmliTG9jYXRpb24ocGdtLCAxLCAiQVRUUklCX2NvbG9yIik7CisgICAgICAgICAgICBnbEJpbmRBdHRyaWJMb2NhdGlvbihwZ20sIDIsICJBVFRSSUJfbm9ybWFsIik7CisgICAgICAgICAgICBnbEJpbmRBdHRyaWJMb2NhdGlvbihwZ20sIDMsICJBVFRSSUJfcG9pbnRTaXplIik7CisgICAgICAgICAgICBnbEJpbmRBdHRyaWJMb2NhdGlvbihwZ20sIDQsICJBVFRSSUJfdGV4dHVyZTAiKTsKICAgICAgICAgfQogCiAgICAgICAgIC8vTE9HRSgiZTIgJXgiLCBnbEdldEVycm9yKCkpOwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc1NpZ25hbC5jcHAgYi9saWJzL3JzL3JzU2lnbmFsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjM5YmZkCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9yc1NpZ25hbC5jcHAKQEAgLTAsMCArMSw5OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJyc1NpZ25hbC5oIgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpyZW5kZXJzY3JpcHQ7CisKKworU2lnbmFsOjpTaWduYWwoKQoreworICAgIG1TZXQgPSB0cnVlOworfQorCitTaWduYWw6On5TaWduYWwoKQoreworICAgIHB0aHJlYWRfbXV0ZXhfZGVzdHJveSgmbU11dGV4KTsKKyAgICBwdGhyZWFkX2NvbmRfZGVzdHJveSgmbUNvbmRpdGlvbik7Cit9CisKK2Jvb2wgU2lnbmFsOjppbml0KCkKK3sKKyAgICBpbnQgc3RhdHVzID0gcHRocmVhZF9tdXRleF9pbml0KCZtTXV0ZXgsIE5VTEwpOworICAgIGlmIChzdGF0dXMpIHsKKyAgICAgICAgTE9HRSgiTG9ja2xlc3NGaWZvIG11dGV4IGluaXQgZmFpbHVyZSIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgc3RhdHVzID0gcHRocmVhZF9jb25kX2luaXQoJm1Db25kaXRpb24sIE5VTEwpOworICAgIGlmIChzdGF0dXMpIHsKKyAgICAgICAgTE9HRSgiTG9ja2xlc3NGaWZvIGNvbmRpdGlvbiBpbml0IGZhaWx1cmUiKTsKKyAgICAgICAgcHRocmVhZF9tdXRleF9kZXN0cm95KCZtTXV0ZXgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgU2lnbmFsOjpzZXQoKQoreworICAgIGludCBzdGF0dXM7CisKKyAgICBzdGF0dXMgPSBwdGhyZWFkX211dGV4X2xvY2soJm1NdXRleCk7CisgICAgaWYgKHN0YXR1cykgeworICAgICAgICBMT0dFKCJMb2NrbGVzc0NvbW1hbmRGaWZvOiBlcnJvciAlaSBsb2NraW5nIGZvciBzZXQgY29uZGl0aW9uLiIsIHN0YXR1cyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBtU2V0ID0gdHJ1ZTsKKworICAgIHN0YXR1cyA9IHB0aHJlYWRfY29uZF9zaWduYWwoJm1Db25kaXRpb24pOworICAgIGlmIChzdGF0dXMpIHsKKyAgICAgICAgTE9HRSgiTG9ja2xlc3NDb21tYW5kRmlmbzogZXJyb3IgJWkgb24gc2V0IGNvbmRpdGlvbi4iLCBzdGF0dXMpOworICAgIH0KKworICAgIHN0YXR1cyA9IHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtTXV0ZXgpOworICAgIGlmIChzdGF0dXMpIHsKKyAgICAgICAgTE9HRSgiTG9ja2xlc3NDb21tYW5kRmlmbzogZXJyb3IgJWkgdW5sb2NraW5nIGZvciBzZXQgY29uZGl0aW9uLiIsIHN0YXR1cyk7CisgICAgfQorfQorCit2b2lkIFNpZ25hbDo6d2FpdCgpCit7CisgICAgaW50IHN0YXR1czsKKworICAgIHN0YXR1cyA9IHB0aHJlYWRfbXV0ZXhfbG9jaygmbU11dGV4KTsKKyAgICBpZiAoc3RhdHVzKSB7CisgICAgICAgIExPR0UoIkxvY2tsZXNzQ29tbWFuZEZpZm86IGVycm9yICVpIGxvY2tpbmcgZm9yIGNvbmRpdGlvbi4iLCBzdGF0dXMpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKCFtU2V0KSB7CisgICAgICAgIHN0YXR1cyA9IHB0aHJlYWRfY29uZF93YWl0KCZtQ29uZGl0aW9uLCAmbU11dGV4KTsKKyAgICAgICAgaWYgKHN0YXR1cykgeworICAgICAgICAgICAgTE9HRSgiTG9ja2xlc3NDb21tYW5kRmlmbzogZXJyb3IgJWkgd2FpdGluZyBvbiBjb25kaXRpb24uIiwgc3RhdHVzKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBtU2V0ID0gZmFsc2U7CisKKyAgICBzdGF0dXMgPSBwdGhyZWFkX211dGV4X3VubG9jaygmbU11dGV4KTsKKyAgICBpZiAoc3RhdHVzKSB7CisgICAgICAgIExPR0UoIkxvY2tsZXNzQ29tbWFuZEZpZm86IGVycm9yICVpIHVubG9ja2luZyBmb3IgY29uZGl0aW9uLiIsIHN0YXR1cyk7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9saWJzL3JzL3JzRmlsZUEzRERlY2xzLmggYi9saWJzL3JzL3JzU2lnbmFsLmgKc2ltaWxhcml0eSBpbmRleCA2NiUKcmVuYW1lIGZyb20gbGlicy9ycy9yc0ZpbGVBM0REZWNscy5oCnJlbmFtZSB0byBsaWJzL3JzL3JzU2lnbmFsLmgKaW5kZXggMmEwOGJkMy4uMmU3NjBmMSAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc0ZpbGVBM0REZWNscy5oCisrKyBiL2xpYnMvcnMvcnNTaWduYWwuaApAQCAtMTQsMzEgKzE0LDMzIEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0jaWZuZGVmIEFORFJPSURfUlNfRklMRV9BM0RfREVDTFNfSAotI2RlZmluZSBBTkRST0lEX1JTX0ZJTEVfQTNEX0RFQ0xTX0gKKyNpZm5kZWYgQU5EUk9JRF9SU19TSUdOQUxfSAorI2RlZmluZSBBTkRST0lEX1JTX1NJR05BTF9ICiAKIAotI2RlZmluZSBBM0RfTUFHSUNfS0VZICJBbmRyb2lkM0RfZmYiCisjaW5jbHVkZSAicnNVdGlscy5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgcmVuZGVyc2NyaXB0IHsKIAotICAgIGVudW0gQTNEQ2h1bmtUeXBlIHsKLSAgICAgICAgQ0hVTktfRU1QVFksCitjbGFzcyBTaWduYWwgeworcHVibGljOgorICAgIFNpZ25hbCgpOworICAgIH5TaWduYWwoKTsKIAotICAgICAgICBDSFVOS19FTEVNRU5ULAotICAgICAgICBDSFVOS19FTEVNRU5UX1NPVVJDRSwKLSAgICAgICAgQ0hVTktfVkVSVElDSUVTLAotICAgICAgICBDSFVOS19NRVNILAotICAgICAgICBDSFVOS19QUklNSVRJVkUsCisgICAgYm9vbCBpbml0KCk7CiAKLSAgICAgICAgQ0hVTktfTEFTVAotICAgIH07CisgICAgdm9pZCBzZXQoKTsKKyAgICB2b2lkIHdhaXQoKTsKIAorcHJvdGVjdGVkOgorICAgIGJvb2wgbVNldDsKKyAgICBwdGhyZWFkX211dGV4X3QgbU11dGV4OworICAgIHB0aHJlYWRfY29uZF90IG1Db25kaXRpb247Cit9OwogCiB9CiB9Ci0jZW5kaWYgLy9BTkRST0lEX1JTX0ZJTEVfQTNEX0gKIAotCisjZW5kaWYKIApkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc1NpbXBsZU1lc2guY3BwIGIvbGlicy9ycy9yc1NpbXBsZU1lc2guY3BwCmluZGV4IDUzY2U1Y2QuLmU1YzJlYjUgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNTaW1wbGVNZXNoLmNwcAorKysgYi9saWJzL3JzL3JzU2ltcGxlTWVzaC5jcHAKQEAgLTE0LDEzICsxNCwyNCBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorI2lmbmRlZiBBTkRST0lEX1JTX0JVSUxEX0ZPUl9IT1NUCiAjaW5jbHVkZSAicnNDb250ZXh0LmgiCiAKKyNpbmNsdWRlIDxHTEVTL2dsLmg+CisjaW5jbHVkZSA8R0xFUzIvZ2wyLmg+CisjaW5jbHVkZSA8R0xFUy9nbGV4dC5oPgorI2Vsc2UKKyNpbmNsdWRlICJyc0NvbnRleHRIb3N0U3R1Yi5oIgorCisjaW5jbHVkZSA8T3BlbkdML2dsLmg+CisjaW5jbHVkZSA8T3BlbkdsL2dsZXh0Lmg+CisjZW5kaWYKKwogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6cmVuZGVyc2NyaXB0OwogCi0jaW5jbHVkZSA8R0xFUy9nbC5oPgotI2luY2x1ZGUgPEdMRVMvZ2xleHQuaD4KKworCiAKIFNpbXBsZU1lc2g6OlNpbXBsZU1lc2goQ29udGV4dCAqcnNjKSA6IE9iamVjdEJhc2UocnNjKQogewpAQCAtNTcsMjEgKzY4LDE2IEBACiAKICAgICByc2MtPmNoZWNrRXJyb3IoIlNpbXBsZU1lc2g6OnJlbmRlclJhbmdlIDEiKTsKICAgICBWZXJ0ZXhBcnJheSB2YTsKLSAgICBpZiAocnNjLT5jaGVja1ZlcnNpb24yXzAoKSkgewotICAgICAgICBmb3IgKHVpbnQzMl90IGN0PTA7IGN0IDwgbVZlcnRleFR5cGVDb3VudDsgY3QrKykgewotICAgICAgICAgICAgbVZlcnRleEJ1ZmZlcnNbY3RdLT51cGxvYWRDaGVjayhyc2MpOworICAgIGZvciAodWludDMyX3QgY3Q9MDsgY3QgPCBtVmVydGV4VHlwZUNvdW50OyBjdCsrKSB7CisgICAgICAgIG1WZXJ0ZXhCdWZmZXJzW2N0XS0+dXBsb2FkQ2hlY2socnNjKTsKKyAgICAgICAgaWYgKG1WZXJ0ZXhCdWZmZXJzW2N0XS0+Z2V0SXNCdWZmZXJPYmplY3QoKSkgewogICAgICAgICAgICAgdmEuc2V0QWN0aXZlQnVmZmVyKG1WZXJ0ZXhCdWZmZXJzW2N0XS0+Z2V0QnVmZmVyT2JqZWN0SUQoKSk7Ci0gICAgICAgICAgICBtVmVydGV4VHlwZXNbY3RdLT5lbmFibGVHTFZlcnRleEJ1ZmZlcjIoJnZhKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHZhLnNldEFjdGl2ZUJ1ZmZlcihtVmVydGV4QnVmZmVyc1tjdF0tPmdldFB0cigpKTsKICAgICAgICAgfQotICAgICAgICB2YS5zZXR1cEdMMihyc2MsICZyc2MtPm1TdGF0ZVZlcnRleEFycmF5LCAmcnNjLT5tU2hhZGVyQ2FjaGUpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGZvciAodWludDMyX3QgY3Q9MDsgY3QgPCBtVmVydGV4VHlwZUNvdW50OyBjdCsrKSB7Ci0gICAgICAgICAgICBtVmVydGV4QnVmZmVyc1tjdF0tPnVwbG9hZENoZWNrKHJzYyk7Ci0gICAgICAgICAgICB2YS5zZXRBY3RpdmVCdWZmZXIobVZlcnRleEJ1ZmZlcnNbY3RdLT5nZXRCdWZmZXJPYmplY3RJRCgpKTsKLSAgICAgICAgICAgIG1WZXJ0ZXhUeXBlc1tjdF0tPmVuYWJsZUdMVmVydGV4QnVmZmVyKCZ2YSk7Ci0gICAgICAgIH0KLSAgICAgICAgdmEuc2V0dXBHTChyc2MsIDApOworICAgICAgICBtVmVydGV4VHlwZXNbY3RdLT5lbmFibGVHTFZlcnRleEJ1ZmZlcigmdmEpOwogICAgIH0KKyAgICB2YS5zZXR1cEdMMihyc2MsICZyc2MtPm1TdGF0ZVZlcnRleEFycmF5LCAmcnNjLT5tU2hhZGVyQ2FjaGUpOwogCiAgICAgcnNjLT5jaGVja0Vycm9yKCJTaW1wbGVNZXNoOjpyZW5kZXJSYW5nZSAyIik7CiAgICAgaWYgKG1JbmRleFR5cGUuZ2V0KCkpIHsKQEAgLTEwMSw2ICsxMDcsOTcgQEAKICAgICByc2MtPmNoZWNrRXJyb3IoIlNpbXBsZU1lc2g6OnVwbG9hZEFsbCIpOwogfQogCit2b2lkIFNpbXBsZU1lc2g6OnVwZGF0ZUdMUHJpbWl0aXZlKCkKK3sKKyAgICBzd2l0Y2gobVByaW1pdGl2ZSkgeworICAgICAgICBjYXNlIFJTX1BSSU1JVElWRV9QT0lOVDogICAgICAgICAgbUdMUHJpbWl0aXZlID0gR0xfUE9JTlRTOyBicmVhazsKKyAgICAgICAgY2FzZSBSU19QUklNSVRJVkVfTElORTogICAgICAgICAgIG1HTFByaW1pdGl2ZSA9IEdMX0xJTkVTOyBicmVhazsKKyAgICAgICAgY2FzZSBSU19QUklNSVRJVkVfTElORV9TVFJJUDogICAgIG1HTFByaW1pdGl2ZSA9IEdMX0xJTkVfU1RSSVA7IGJyZWFrOworICAgICAgICBjYXNlIFJTX1BSSU1JVElWRV9UUklBTkdMRTogICAgICAgbUdMUHJpbWl0aXZlID0gR0xfVFJJQU5HTEVTOyBicmVhazsKKyAgICAgICAgY2FzZSBSU19QUklNSVRJVkVfVFJJQU5HTEVfU1RSSVA6IG1HTFByaW1pdGl2ZSA9IEdMX1RSSUFOR0xFX1NUUklQOyBicmVhazsKKyAgICAgICAgY2FzZSBSU19QUklNSVRJVkVfVFJJQU5HTEVfRkFOOiAgIG1HTFByaW1pdGl2ZSA9IEdMX1RSSUFOR0xFX0ZBTjsgYnJlYWs7CisgICAgfQorfQorCit2b2lkIFNpbXBsZU1lc2g6OnNlcmlhbGl6ZShPU3RyZWFtICpzdHJlYW0pIGNvbnN0Cit7CisgICAgLy8gTmVlZCB0byBpZGVudGlmeSBvdXJzZWx2ZXMKKyAgICBzdHJlYW0tPmFkZFUzMigodWludDMyX3QpZ2V0Q2xhc3NJZCgpKTsKKworICAgIFN0cmluZzggbmFtZShnZXROYW1lKCkpOworICAgIHN0cmVhbS0+YWRkU3RyaW5nKCZuYW1lKTsKKworICAgIC8vIEFkZCBwcmltaXRpdmUgdHlwZQorICAgIHN0cmVhbS0+YWRkVTgoKHVpbnQ4X3QpbVByaW1pdGl2ZSk7CisKKyAgICAvLyBBbmQgbm93IHNlcmlhbGl6ZSB0aGUgYWxsb2NhdGlvbnMKKyAgICBtSW5kZXhCdWZmZXItPnNlcmlhbGl6ZShzdHJlYW0pOworCisgICAgLy8gV2UgbmVlZCB0byBpbmRpY2F0ZSBpZiB0aGUgcHJpbWl0aXZlIGJ1ZmZlciBpcyBwcmVzZW50CisgICAgaWYobVByaW1pdGl2ZUJ1ZmZlci5nZXQoKSAhPSBOVUxMKSB7CisgICAgICAgIC8vIFdyaXRlIGlmIHRoZSBwcmltaXRpdmUgYnVmZmVyIGlzIHByZXNlbnQKKyAgICAgICAgc3RyZWFtLT5hZGRVMzIoMSk7CisgICAgICAgIG1QcmltaXRpdmVCdWZmZXItPnNlcmlhbGl6ZShzdHJlYW0pOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgLy8gTm8gYnVmZmVyIHByZXNlbnQsIHdpbGwgbmVlZCB0aGlzIHdoZW4gd2UgcmVhZAorICAgICAgICBzdHJlYW0tPmFkZFUzMigwKTsKKyAgICB9CisKKyAgICAvLyBTdG9yZSBudW1iZXIgb2YgdmVydGV4IHN0cmVhbXMKKyAgICBzdHJlYW0tPmFkZFUzMihtVmVydGV4VHlwZUNvdW50KTsKKyAgICBmb3IodWludDMyX3QgdkNvdW50ID0gMDsgdkNvdW50IDwgbVZlcnRleFR5cGVDb3VudDsgdkNvdW50ICsrKSB7CisgICAgICAgIG1WZXJ0ZXhCdWZmZXJzW3ZDb3VudF0tPnNlcmlhbGl6ZShzdHJlYW0pOworICAgIH0KK30KKworU2ltcGxlTWVzaCAqU2ltcGxlTWVzaDo6Y3JlYXRlRnJvbVN0cmVhbShDb250ZXh0ICpyc2MsIElTdHJlYW0gKnN0cmVhbSkKK3sKKyAgICAvLyBGaXJzdCBtYWtlIHN1cmUgd2UgYXJlIHJlYWRpbmcgdGhlIGNvcnJlY3Qgb2JqZWN0CisgICAgUnNBM0RDbGFzc0lEIGNsYXNzSUQgPSAoUnNBM0RDbGFzc0lEKXN0cmVhbS0+bG9hZFUzMigpOworICAgIGlmKGNsYXNzSUQgIT0gUlNfQTNEX0NMQVNTX0lEX1NJTVBMRV9NRVNIKSB7CisgICAgICAgIExPR0UoInNpbXBsZSBtZXNoIGxvYWRpbmcgc2tpcHBlZCBkdWUgdG8gaW52YWxpZCBjbGFzcyBpZCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBTaW1wbGVNZXNoICogbWVzaCA9IG5ldyBTaW1wbGVNZXNoKHJzYyk7CisKKyAgICBTdHJpbmc4IG5hbWU7CisgICAgc3RyZWFtLT5sb2FkU3RyaW5nKCZuYW1lKTsKKyAgICBtZXNoLT5zZXROYW1lKG5hbWUuc3RyaW5nKCksIG5hbWUuc2l6ZSgpKTsKKworICAgIG1lc2gtPm1QcmltaXRpdmUgPSAoUnNQcmltaXRpdmUpc3RyZWFtLT5sb2FkVTgoKTsKKyAgICBtZXNoLT51cGRhdGVHTFByaW1pdGl2ZSgpOworCisgICAgQWxsb2NhdGlvbiAqaW5kZXhBbGxvYyA9IEFsbG9jYXRpb246OmNyZWF0ZUZyb21TdHJlYW0ocnNjLCBzdHJlYW0pOworICAgIGNvbnN0IFR5cGUgKmluZGV4VHlwZSA9IGluZGV4QWxsb2MtPmdldFR5cGUoKTsKKyAgICBtZXNoLT5tSW5kZXhCdWZmZXIuc2V0KGluZGV4QWxsb2MpOworICAgIG1lc2gtPm1JbmRleFR5cGUuc2V0KGluZGV4VHlwZSk7CisKKyAgICBib29sIGlzUHJpbWl0aXZlUHJlc2VudCA9IHN0cmVhbS0+bG9hZFUzMigpICE9IDA7CisgICAgaWYoaXNQcmltaXRpdmVQcmVzZW50KSB7CisgICAgICAgIG1lc2gtPm1QcmltaXRpdmVCdWZmZXIuc2V0KEFsbG9jYXRpb246OmNyZWF0ZUZyb21TdHJlYW0ocnNjLCBzdHJlYW0pKTsKKyAgICAgICAgbWVzaC0+bVByaW1pdGl2ZVR5cGUuc2V0KG1lc2gtPm1QcmltaXRpdmVCdWZmZXItPmdldFR5cGUoKSk7CisgICAgfQorCisgICAgbWVzaC0+bVZlcnRleFR5cGVDb3VudCA9IHN0cmVhbS0+bG9hZFUzMigpOworICAgIGlmKG1lc2gtPm1WZXJ0ZXhUeXBlQ291bnQpIHsKKyAgICAgICAgbWVzaC0+bVZlcnRleFR5cGVzID0gbmV3IE9iamVjdEJhc2VSZWY8Y29uc3QgVHlwZT5bbWVzaC0+bVZlcnRleFR5cGVDb3VudF07CisgICAgICAgIG1lc2gtPm1WZXJ0ZXhCdWZmZXJzID0gbmV3IE9iamVjdEJhc2VSZWY8QWxsb2NhdGlvbj5bbWVzaC0+bVZlcnRleFR5cGVDb3VudF07CisKKyAgICAgICAgZm9yKHVpbnQzMl90IHZDb3VudCA9IDA7IHZDb3VudCA8IG1lc2gtPm1WZXJ0ZXhUeXBlQ291bnQ7IHZDb3VudCArKykgeworICAgICAgICAgICAgQWxsb2NhdGlvbiAqdmVydGV4QWxsb2MgPSBBbGxvY2F0aW9uOjpjcmVhdGVGcm9tU3RyZWFtKHJzYywgc3RyZWFtKTsKKyAgICAgICAgICAgIGNvbnN0IFR5cGUgKnZlcnRleFR5cGUgPSB2ZXJ0ZXhBbGxvYy0+Z2V0VHlwZSgpOworICAgICAgICAgICAgbWVzaC0+bVZlcnRleEJ1ZmZlcnNbdkNvdW50XS5zZXQodmVydGV4QWxsb2MpOworICAgICAgICAgICAgbWVzaC0+bVZlcnRleFR5cGVzW3ZDb3VudF0uc2V0KHZlcnRleFR5cGUpOworICAgICAgICB9CisgICAgfQorCisgICAgbWVzaC0+dXBsb2FkQWxsKHJzYyk7CisKKyAgICByZXR1cm4gbWVzaDsKK30KKwogCiBTaW1wbGVNZXNoQ29udGV4dDo6U2ltcGxlTWVzaENvbnRleHQoKQogewpAQCAtMTMxLDE0ICsyMjgsNyBAQAogICAgIH0KIAogICAgIHNtLT5tUHJpbWl0aXZlID0gKFJzUHJpbWl0aXZlKXByaW1UeXBlOwotICAgIHN3aXRjaChzbS0+bVByaW1pdGl2ZSkgewotICAgIGNhc2UgUlNfUFJJTUlUSVZFX1BPSU5UOiAgICAgICAgICBzbS0+bUdMUHJpbWl0aXZlID0gR0xfUE9JTlRTOyBicmVhazsKLSAgICBjYXNlIFJTX1BSSU1JVElWRV9MSU5FOiAgICAgICAgICAgc20tPm1HTFByaW1pdGl2ZSA9IEdMX0xJTkVTOyBicmVhazsKLSAgICBjYXNlIFJTX1BSSU1JVElWRV9MSU5FX1NUUklQOiAgICAgc20tPm1HTFByaW1pdGl2ZSA9IEdMX0xJTkVfU1RSSVA7IGJyZWFrOwotICAgIGNhc2UgUlNfUFJJTUlUSVZFX1RSSUFOR0xFOiAgICAgICBzbS0+bUdMUHJpbWl0aXZlID0gR0xfVFJJQU5HTEVTOyBicmVhazsKLSAgICBjYXNlIFJTX1BSSU1JVElWRV9UUklBTkdMRV9TVFJJUDogc20tPm1HTFByaW1pdGl2ZSA9IEdMX1RSSUFOR0xFX1NUUklQOyBicmVhazsKLSAgICBjYXNlIFJTX1BSSU1JVElWRV9UUklBTkdMRV9GQU46ICAgc20tPm1HTFByaW1pdGl2ZSA9IEdMX1RSSUFOR0xFX0ZBTjsgYnJlYWs7Ci0gICAgfQorICAgIHNtLT51cGRhdGVHTFByaW1pdGl2ZSgpOwogICAgIHJldHVybiBzbTsKIH0KIApkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc1NpbXBsZU1lc2guaCBiL2xpYnMvcnMvcnNTaW1wbGVNZXNoLmgKaW5kZXggNmRlZmJkYS4uMzYyYzdmYiAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc1NpbXBsZU1lc2guaAorKysgYi9saWJzL3JzL3JzU2ltcGxlTWVzaC5oCkBAIC00OCw3ICs0OCwxMSBAQAogICAgIHZvaWQgcmVuZGVyKENvbnRleHQgKikgY29uc3Q7CiAgICAgdm9pZCByZW5kZXJSYW5nZShDb250ZXh0ICosIHVpbnQzMl90IHN0YXJ0LCB1aW50MzJfdCBsZW4pIGNvbnN0OwogICAgIHZvaWQgdXBsb2FkQWxsKENvbnRleHQgKik7CisgICAgdm9pZCB1cGRhdGVHTFByaW1pdGl2ZSgpOwogCisgICAgdmlydHVhbCB2b2lkIHNlcmlhbGl6ZShPU3RyZWFtICpzdHJlYW0pIGNvbnN0OworICAgIHZpcnR1YWwgUnNBM0RDbGFzc0lEIGdldENsYXNzSWQoKSBjb25zdCB7IHJldHVybiBSU19BM0RfQ0xBU1NfSURfU0lNUExFX01FU0g7IH0KKyAgICBzdGF0aWMgU2ltcGxlTWVzaCAqY3JlYXRlRnJvbVN0cmVhbShDb250ZXh0ICpyc2MsIElTdHJlYW0gKnN0cmVhbSk7CiAKIHByb3RlY3RlZDoKIH07CmRpZmYgLS1naXQgYS9saWJzL3JzL3JzU3RyZWFtLmNwcCBiL2xpYnMvcnMvcnNTdHJlYW0uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5ODc0YTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL3JzU3RyZWFtLmNwcApAQCAtMCwwICsxLDEzMiBAQAorCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1JTX0JVSUxEX0ZPUl9IT1NUCisjaW5jbHVkZSAicnNDb250ZXh0LmgiCisjZWxzZQorI2luY2x1ZGUgInJzQ29udGV4dEhvc3RTdHViLmgiCisjZW5kaWYKKworI2luY2x1ZGUgInJzU3RyZWFtLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OnJlbmRlcnNjcmlwdDsKKworSVN0cmVhbTo6SVN0cmVhbShjb25zdCB1aW50OF90ICpidWYsIGJvb2wgdXNlNjQpCit7CisgICAgbURhdGEgPSBidWY7CisgICAgbVBvcyA9IDA7CisgICAgbVVzZTY0ID0gdXNlNjQ7Cit9CisKK3ZvaWQgSVN0cmVhbTo6bG9hZEJ5dGVBcnJheSh2b2lkICpkZXN0LCBzaXplX3QgbnVtQnl0ZXMpCit7CisgICAgbWVtY3B5KGRlc3QsIG1EYXRhICsgbVBvcywgbnVtQnl0ZXMpOworICAgIG1Qb3MgKz0gbnVtQnl0ZXM7Cit9CisKK3VpbnQ2NF90IElTdHJlYW06OmxvYWRPZmZzZXQoKQoreworICAgIHVpbnQ2NF90IHRtcDsKKyAgICBpZiAobVVzZTY0KSB7CisgICAgICAgIG1Qb3MgPSAobVBvcyArIDcpICYgKH43KTsKKyAgICAgICAgdG1wID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50NjRfdCAqPigmbURhdGFbbVBvc10pWzBdOworICAgICAgICBtUG9zICs9IHNpemVvZih1aW50NjRfdCk7CisgICAgICAgIHJldHVybiB0bXA7CisgICAgfQorICAgIHJldHVybiBsb2FkVTMyKCk7Cit9CisKK3ZvaWQgSVN0cmVhbTo6bG9hZFN0cmluZyhTdHJpbmc4ICpzKQoreworICAgIHVpbnQzMl90IGxlbiA9IGxvYWRVMzIoKTsKKyAgICBzLT5zZXRUbygoY29uc3QgY2hhciAqKSZtRGF0YVttUG9zXSwgbGVuKTsKKyAgICBMT0dFKCJsb2FkU3RyaW5nICVzIiwgcy0+c3RyaW5nKCkpOworICAgIG1Qb3MgKz0gbGVuOworfQorCisKKy8vIE91dHB1dCBzdHJlYW0gaW1wbGVtZW50YXRpb24KKworT1N0cmVhbTo6T1N0cmVhbSh1aW50NjRfdCBsZW4sIGJvb2wgdXNlNjQpCit7CisgICAgbURhdGEgPSAodWludDhfdCopbWFsbG9jKGxlbik7CisgICAgbUxlbmd0aCA9IGxlbjsKKyAgICBtUG9zID0gMDsKKyAgICBtVXNlNjQgPSB1c2U2NDsKK30KKworT1N0cmVhbTo6fk9TdHJlYW0oKQoreworICAgIGZyZWUobURhdGEpOworfQorCit2b2lkIE9TdHJlYW06OmFkZEJ5dGVBcnJheShjb25zdCB2b2lkICpzcmMsIHNpemVfdCBudW1CeXRlcykKK3sKKyAgICAvLyBXZSBuZWVkIHRvIHBvdGVudGlhbGx5IGdyb3cgbW9yZSB0aGFuIG9uY2UgaWYgdGhlIG51bWJlciBvZiBieWVzIHdlIHdyaXRlIGlzIHN1YnN0YW50aWFsCisgICAgd2hpbGUobVBvcyArIG51bUJ5dGVzID49IG1MZW5ndGgpIHsKKyAgICAgICAgZ3Jvd1NpemUoKTsKKyAgICB9CisgICAgbWVtY3B5KG1EYXRhICsgbVBvcywgc3JjLCBudW1CeXRlcyk7CisgICAgbVBvcyArPSBudW1CeXRlczsKK30KKwordm9pZCBPU3RyZWFtOjphZGRPZmZzZXQodWludDY0X3QgdikKK3sKKyAgICBpZiAobVVzZTY0KSB7CisgICAgICAgIG1Qb3MgPSAobVBvcyArIDcpICYgKH43KTsKKyAgICAgICAgaWYobVBvcyArIHNpemVvZih2KSA+PSBtTGVuZ3RoKSB7CisgICAgICAgICAgICBncm93U2l6ZSgpOworICAgICAgICB9CisgICAgICAgIG1EYXRhW21Qb3MrK10gPSAodWludDhfdCkodiAmIDB4ZmYpOworICAgICAgICBtRGF0YVttUG9zKytdID0gKHVpbnQ4X3QpKCh2ID4+IDgpICYgMHhmZik7CisgICAgICAgIG1EYXRhW21Qb3MrK10gPSAodWludDhfdCkoKHYgPj4gMTYpICYgMHhmZik7CisgICAgICAgIG1EYXRhW21Qb3MrK10gPSAodWludDhfdCkoKHYgPj4gMjQpICYgMHhmZik7CisgICAgICAgIG1EYXRhW21Qb3MrK10gPSAodWludDhfdCkoKHYgPj4gMzIpICYgMHhmZik7CisgICAgICAgIG1EYXRhW21Qb3MrK10gPSAodWludDhfdCkoKHYgPj4gNDApICYgMHhmZik7CisgICAgICAgIG1EYXRhW21Qb3MrK10gPSAodWludDhfdCkoKHYgPj4gNDgpICYgMHhmZik7CisgICAgICAgIG1EYXRhW21Qb3MrK10gPSAodWludDhfdCkoKHYgPj4gNTYpICYgMHhmZik7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBhZGRVMzIodik7CisgICAgfQorfQorCit2b2lkIE9TdHJlYW06OmFkZFN0cmluZyhTdHJpbmc4ICpzKQoreworICAgIHVpbnQzMl90IGxlbiA9IHMtPnNpemUoKTsKKyAgICBhZGRVMzIobGVuKTsKKyAgICBpZihtUG9zICsgbGVuKnNpemVvZihjaGFyKSA+PSBtTGVuZ3RoKSB7CisgICAgICAgIGdyb3dTaXplKCk7CisgICAgfQorICAgIGNoYXIgKnN0cmluZ0RhdGEgPSByZWludGVycHJldF9jYXN0PGNoYXIgKj4oJm1EYXRhW21Qb3NdKTsKKyAgICBmb3IodWludDMyX3QgaSA9IDA7IGkgPCBsZW47IGkgKyspIHsKKyAgICAgICAgc3RyaW5nRGF0YVtpXSA9IHMtPnN0cmluZygpW2ldOworICAgIH0KKyAgICBtUG9zICs9IGxlbipzaXplb2YoY2hhcik7Cit9CisKK3ZvaWQgT1N0cmVhbTo6Z3Jvd1NpemUoKQoreworICAgIHVpbnQ4X3QgKm5ld0RhdGEgPSAodWludDhfdCopbWFsbG9jKG1MZW5ndGgqMik7CisgICAgbWVtY3B5KG5ld0RhdGEsIG1EYXRhLCBtTGVuZ3RoKnNpemVvZih1aW50OF90KSk7CisgICAgbUxlbmd0aCA9IG1MZW5ndGggKiAyOworICAgIGZyZWUobURhdGEpOworICAgIG1EYXRhID0gbmV3RGF0YTsKK30KKworCmRpZmYgLS1naXQgYS9saWJzL3JzL3JzU3RyZWFtLmggYi9saWJzL3JzL3JzU3RyZWFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQwMWNkMTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL3JzU3RyZWFtLmgKQEAgLTAsMCArMSwxNjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfUlNfU1RSRUFNX0gKKyNkZWZpbmUgQU5EUk9JRF9SU19TVFJFQU1fSAorCisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHJlbmRlcnNjcmlwdCB7CisKK2NsYXNzIElTdHJlYW0KK3sKK3B1YmxpYzoKKyAgICBJU3RyZWFtKGNvbnN0IHVpbnQ4X3QgKiwgYm9vbCB1c2U2NCk7CisKKyAgICBmbG9hdCBsb2FkRigpIHsKKyAgICAgICAgbVBvcyA9IChtUG9zICsgMykgJiAofjMpOworICAgICAgICBmbG9hdCB0bXAgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGZsb2F0ICo+KCZtRGF0YVttUG9zXSlbMF07CisgICAgICAgIG1Qb3MgKz0gc2l6ZW9mKGZsb2F0KTsKKyAgICAgICAgcmV0dXJuIHRtcDsKKyAgICB9CisgICAgaW50MzJfdCBsb2FkSTMyKCkgeworICAgICAgICBtUG9zID0gKG1Qb3MgKyAzKSAmICh+Myk7CisgICAgICAgIGludDMyX3QgdG1wID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBpbnQzMl90ICo+KCZtRGF0YVttUG9zXSlbMF07CisgICAgICAgIG1Qb3MgKz0gc2l6ZW9mKGludDMyX3QpOworICAgICAgICByZXR1cm4gdG1wOworICAgIH0KKyAgICB1aW50MzJfdCBsb2FkVTMyKCkgeworICAgICAgICBtUG9zID0gKG1Qb3MgKyAzKSAmICh+Myk7CisgICAgICAgIHVpbnQzMl90IHRtcCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDMyX3QgKj4oJm1EYXRhW21Qb3NdKVswXTsKKyAgICAgICAgbVBvcyArPSBzaXplb2YodWludDMyX3QpOworICAgICAgICByZXR1cm4gdG1wOworICAgIH0KKyAgICB1aW50MTZfdCBsb2FkVTE2KCkgeworICAgICAgICBtUG9zID0gKG1Qb3MgKyAxKSAmICh+MSk7CisgICAgICAgIHVpbnQxNl90IHRtcCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDE2X3QgKj4oJm1EYXRhW21Qb3NdKVswXTsKKyAgICAgICAgbVBvcyArPSBzaXplb2YodWludDE2X3QpOworICAgICAgICByZXR1cm4gdG1wOworICAgIH0KKyAgICBpbmxpbmUgdWludDhfdCBsb2FkVTgoKSB7CisgICAgICAgIHVpbnQ4X3QgdG1wID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90ICo+KCZtRGF0YVttUG9zXSlbMF07CisgICAgICAgIG1Qb3MgKz0gc2l6ZW9mKHVpbnQ4X3QpOworICAgICAgICByZXR1cm4gdG1wOworICAgIH0KKyAgICB2b2lkIGxvYWRCeXRlQXJyYXkodm9pZCAqZGVzdCwgc2l6ZV90IG51bUJ5dGVzKTsKKyAgICB1aW50NjRfdCBsb2FkT2Zmc2V0KCk7CisgICAgdm9pZCBsb2FkU3RyaW5nKFN0cmluZzggKnMpOworICAgIHVpbnQ2NF90IGdldFBvcygpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1Qb3M7CisgICAgfQorICAgIHZvaWQgcmVzZXQodWludDY0X3QgcG9zKSB7CisgICAgICAgIG1Qb3MgPSBwb3M7CisgICAgfQorICAgIHZvaWQgcmVzZXQoKSB7CisgICAgICAgIG1Qb3MgPSAwOworICAgIH0KKyAgICAKKyAgICBjb25zdCB1aW50OF90ICogZ2V0UHRyKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbURhdGE7CisgICAgfQorcHJvdGVjdGVkOgorICAgIGNvbnN0IHVpbnQ4X3QgKiBtRGF0YTsKKyAgICB1aW50NjRfdCBtUG9zOworICAgIGJvb2wgbVVzZTY0OworfTsKKworY2xhc3MgT1N0cmVhbQoreworcHVibGljOgorICAgIE9TdHJlYW0odWludDY0X3QgbGVuZ3RoLCBib29sIHVzZTY0KTsKKyAgICB+T1N0cmVhbSgpOworICAgIAorICAgIHZvaWQgYWxpZ24odWludDMyX3QgYnl0ZXMpIHsKKyAgICAgICAgbVBvcyA9IChtUG9zICsgKGJ5dGVzIC0gMSkpICYgKH4oYnl0ZXMgLSAxKSk7CisgICAgICAgIGlmKG1Qb3MgPj0gbUxlbmd0aCkgeworICAgICAgICAgICAgZ3Jvd1NpemUoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICB2b2lkIGFkZEYoZmxvYXQgdikgeworICAgICAgICB1aW50MzJfdCB1aW50ViA9ICpyZWludGVycHJldF9jYXN0PHVpbnQzMl90Kj4gKCZ2KTsKKyAgICAgICAgYWRkVTMyKHVpbnRWKTsKKyAgICB9CisgICAgdm9pZCBhZGRJMzIoaW50MzJfdCB2KSB7CisgICAgICAgIG1Qb3MgPSAobVBvcyArIDMpICYgKH4zKTsKKyAgICAgICAgaWYobVBvcyArIHNpemVvZih2KSA+PSBtTGVuZ3RoKSB7CisgICAgICAgICAgICBncm93U2l6ZSgpOworICAgICAgICB9CisgICAgICAgIG1EYXRhW21Qb3MrK10gPSAodWludDhfdCkodiAmIDB4ZmYpOworICAgICAgICBtRGF0YVttUG9zKytdID0gKHVpbnQ4X3QpKCh2ID4+IDgpICYgMHhmZik7CisgICAgICAgIG1EYXRhW21Qb3MrK10gPSAodWludDhfdCkoKHYgPj4gMTYpICYgMHhmZik7CisgICAgICAgIG1EYXRhW21Qb3MrK10gPSAodWludDhfdCkoKHYgPj4gMjQpICYgMHhmZik7CisgICAgfQorICAgIHZvaWQgYWRkVTMyKHVpbnQzMl90IHYpIHsKKyAgICAgICAgbVBvcyA9IChtUG9zICsgMykgJiAofjMpOworICAgICAgICBpZihtUG9zICsgc2l6ZW9mKHYpID49IG1MZW5ndGgpIHsKKyAgICAgICAgICAgIGdyb3dTaXplKCk7CisgICAgICAgIH0KKyAgICAgICAgbURhdGFbbVBvcysrXSA9ICh1aW50OF90KSh2ICYgMHhmZik7CisgICAgICAgIG1EYXRhW21Qb3MrK10gPSAodWludDhfdCkoKHYgPj4gOCkgJiAweGZmKTsKKyAgICAgICAgbURhdGFbbVBvcysrXSA9ICh1aW50OF90KSgodiA+PiAxNikgJiAweGZmKTsKKyAgICAgICAgbURhdGFbbVBvcysrXSA9ICh1aW50OF90KSgodiA+PiAyNCkgJiAweGZmKTsKKyAgICB9CisgICAgdm9pZCBhZGRVMTYodWludDE2X3QgdikgeworICAgICAgICBtUG9zID0gKG1Qb3MgKyAxKSAmICh+MSk7CisgICAgICAgIGlmKG1Qb3MgKyBzaXplb2YodikgPj0gbUxlbmd0aCkgeworICAgICAgICAgICAgZ3Jvd1NpemUoKTsKKyAgICAgICAgfQorICAgICAgICBtRGF0YVttUG9zKytdID0gKHVpbnQ4X3QpKHYgJiAweGZmKTsKKyAgICAgICAgbURhdGFbbVBvcysrXSA9ICh1aW50OF90KSh2ID4+IDgpOworICAgIH0KKyAgICBpbmxpbmUgdm9pZCBhZGRVOCh1aW50OF90IHYpIHsKKyAgICAgICAgaWYobVBvcyArIDEgPj0gbUxlbmd0aCkgeworICAgICAgICAgICAgZ3Jvd1NpemUoKTsKKyAgICAgICAgfQorICAgICAgICByZWludGVycHJldF9jYXN0PHVpbnQ4X3QgKj4oJm1EYXRhW21Qb3NdKVswXSA9IHY7CisgICAgICAgIG1Qb3MgKys7CisgICAgfQorICAgIHZvaWQgYWRkQnl0ZUFycmF5KGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IG51bUJ5dGVzKTsKKyAgICB2b2lkIGFkZE9mZnNldCh1aW50NjRfdCB2KTsKKyAgICB2b2lkIGFkZFN0cmluZyhTdHJpbmc4ICpzKTsKKyAgICB1aW50NjRfdCBnZXRQb3MoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtUG9zOworICAgIH0KKyAgICB2b2lkIHJlc2V0KHVpbnQ2NF90IHBvcykgeworICAgICAgICBtUG9zID0gcG9zOworICAgIH0KKyAgICB2b2lkIHJlc2V0KCkgeworICAgICAgICBtUG9zID0gMDsKKyAgICB9CisgICAgY29uc3QgdWludDhfdCAqIGdldFB0cigpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1EYXRhOworICAgIH0KK3Byb3RlY3RlZDoKKyAgICB2b2lkIGdyb3dTaXplKCk7CisgICAgdWludDhfdCAqIG1EYXRhOworICAgIHVpbnQ2NF90IG1MZW5ndGg7CisgICAgdWludDY0X3QgbVBvczsKKyAgICBib29sIG1Vc2U2NDsKK307CisgICAgCisKK30gLy8gcmVuZGVyc2NyaXB0Cit9IC8vIGFuZHJvaWQKKyNlbmRpZiAvL0FORFJPSURfUlNfU1RSRUFNX0gKKworCmRpZmYgLS1naXQgYS9saWJzL3JzL3JzVHlwZS5jcHAgYi9saWJzL3JzL3JzVHlwZS5jcHAKaW5kZXggYzA5ZTk3OS4uOGRjYTBmZSAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc1R5cGUuY3BwCisrKyBiL2xpYnMvcnMvcnNUeXBlLmNwcApAQCAtMTQsOCArMTQsMTMgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKyNpZm5kZWYgQU5EUk9JRF9SU19CVUlMRF9GT1JfSE9TVAogI2luY2x1ZGUgInJzQ29udGV4dC5oIgogI2luY2x1ZGUgPEdMRVMvZ2wuaD4KKyNlbHNlCisjaW5jbHVkZSAicnNDb250ZXh0SG9zdFN0dWIuaCIKKyNpbmNsdWRlIDxPcGVuR0wvZ2wuaD4KKyNlbmRpZgogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpyZW5kZXJzY3JpcHQ7CkBAIC04NCw3ICs4OSw5IEBACiAgICAgICAgIG1MT0RDb3VudCA9IDE7CiAgICAgfQogICAgIGlmIChtTE9EQ291bnQgIT0gb2xkTE9EQ291bnQpIHsKLSAgICAgICAgZGVsZXRlIFtdIG1MT0RzOworICAgICAgICBpZihtTE9Ecyl7CisgICAgICAgICAgICBkZWxldGUgW10gbUxPRHM7CisgICAgICAgIH0gICAgICAgIAogICAgICAgICBtTE9EcyA9IG5ldyBMT0RbbUxPRENvdW50XTsKICAgICB9CiAKQEAgLTE0MywxMzEgKzE1MCwyMiBAQAogICAgIGZvciAodWludDMyX3QgY3Q9MDsgY3QgPCBnZXRFbGVtZW50KCktPmdldEZpZWxkQ291bnQoKTsgY3QrKykgewogICAgICAgICBjb25zdCBDb21wb25lbnQgJmMgPSBnZXRFbGVtZW50KCktPmdldEZpZWxkKGN0KS0+Z2V0Q29tcG9uZW50KCk7CiAKLSAgICAgICAgc3dpdGNoKGMuZ2V0S2luZCgpKSB7Ci0gICAgICAgIGNhc2UgUlNfS0lORF9VU0VSOgotICAgICAgICAgICAgbUdMLm1Vc2VyW3VzZXJOdW1dLnNpemUgPSBjLmdldFZlY3RvclNpemUoKTsKLSAgICAgICAgICAgIG1HTC5tVXNlclt1c2VyTnVtXS5vZmZzZXQgPSBtRWxlbWVudC0+Z2V0RmllbGRPZmZzZXRCeXRlcyhjdCk7Ci0gICAgICAgICAgICBtR0wubVVzZXJbdXNlck51bV0udHlwZSA9IGMuZ2V0R0xUeXBlKCk7Ci0gICAgICAgICAgICBtR0wubVVzZXJbdXNlck51bV0ubm9ybWFsaXplZCA9IGMuZ2V0VHlwZSgpICE9IFJTX1RZUEVfRkxPQVRfMzI7Ly9jLmdldElzTm9ybWFsaXplZCgpOwotICAgICAgICAgICAgbUdMLm1Vc2VyW3VzZXJOdW1dLm5hbWUuc2V0VG8oZ2V0RWxlbWVudCgpLT5nZXRGaWVsZE5hbWUoY3QpKTsKLSAgICAgICAgICAgIHVzZXJOdW0gKys7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIFJTX0tJTkRfUE9TSVRJT046Ci0gICAgICAgICAgICByc0Fzc2VydChtR0wubVZ0eC5zaXplID09IDApOwotICAgICAgICAgICAgbUdMLm1WdHguc2l6ZSA9IGMuZ2V0VmVjdG9yU2l6ZSgpOwotICAgICAgICAgICAgbUdMLm1WdHgub2Zmc2V0ID0gbUVsZW1lbnQtPmdldEZpZWxkT2Zmc2V0Qnl0ZXMoY3QpOwotICAgICAgICAgICAgbUdMLm1WdHgudHlwZSA9IGMuZ2V0R0xUeXBlKCk7Ci0gICAgICAgICAgICBtR0wubVZ0eC5ub3JtYWxpemVkID0gZmFsc2U7Ci0gICAgICAgICAgICBtR0wubVZ0eC5uYW1lLnNldFRvKCJQb3NpdGlvbiIpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBSU19LSU5EX0NPTE9SOgotICAgICAgICAgICAgcnNBc3NlcnQobUdMLm1Db2xvci5zaXplID09IDApOwotICAgICAgICAgICAgbUdMLm1Db2xvci5zaXplID0gYy5nZXRWZWN0b3JTaXplKCk7Ci0gICAgICAgICAgICBtR0wubUNvbG9yLm9mZnNldCA9IG1FbGVtZW50LT5nZXRGaWVsZE9mZnNldEJ5dGVzKGN0KTsKLSAgICAgICAgICAgIG1HTC5tQ29sb3IudHlwZSA9IGMuZ2V0R0xUeXBlKCk7Ci0gICAgICAgICAgICBtR0wubUNvbG9yLm5vcm1hbGl6ZWQgPSBjLmdldFR5cGUoKSAhPSBSU19UWVBFX0ZMT0FUXzMyOwotICAgICAgICAgICAgbUdMLm1Db2xvci5uYW1lLnNldFRvKCJDb2xvciIpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBSU19LSU5EX05PUk1BTDoKLSAgICAgICAgICAgIHJzQXNzZXJ0KG1HTC5tTm9ybS5zaXplID09IDApOwotICAgICAgICAgICAgbUdMLm1Ob3JtLnNpemUgPSBjLmdldFZlY3RvclNpemUoKTsKLSAgICAgICAgICAgIG1HTC5tTm9ybS5vZmZzZXQgPSBtRWxlbWVudC0+Z2V0RmllbGRPZmZzZXRCeXRlcyhjdCk7Ci0gICAgICAgICAgICBtR0wubU5vcm0udHlwZSA9IGMuZ2V0R0xUeXBlKCk7Ci0gICAgICAgICAgICBtR0wubU5vcm0ubm9ybWFsaXplZCA9IGZhbHNlOwotICAgICAgICAgICAgbUdMLm1Ob3JtLm5hbWUuc2V0VG8oIk5vcm1hbCIpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBSU19LSU5EX1RFWFRVUkU6Ci0gICAgICAgICAgICByc0Fzc2VydChtR0wubVRleC5zaXplID09IDApOwotICAgICAgICAgICAgbUdMLm1UZXguc2l6ZSA9IGMuZ2V0VmVjdG9yU2l6ZSgpOwotICAgICAgICAgICAgbUdMLm1UZXgub2Zmc2V0ID0gbUVsZW1lbnQtPmdldEZpZWxkT2Zmc2V0Qnl0ZXMoY3QpOwotICAgICAgICAgICAgbUdMLm1UZXgudHlwZSA9IGMuZ2V0R0xUeXBlKCk7Ci0gICAgICAgICAgICBtR0wubVRleC5ub3JtYWxpemVkID0gZmFsc2U7Ci0gICAgICAgICAgICBtR0wubVRleC5uYW1lLnNldFRvKCJUZXh0dXJlIik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIFJTX0tJTkRfUE9JTlRfU0laRToKLSAgICAgICAgICAgIHJzQXNzZXJ0KCFtR0wubVBvaW50U2l6ZS5zaXplKTsKLSAgICAgICAgICAgIG1HTC5tUG9pbnRTaXplLnNpemUgPSBjLmdldFZlY3RvclNpemUoKTsKLSAgICAgICAgICAgIG1HTC5tUG9pbnRTaXplLm9mZnNldCA9IG1FbGVtZW50LT5nZXRGaWVsZE9mZnNldEJ5dGVzKGN0KTsKLSAgICAgICAgICAgIG1HTC5tUG9pbnRTaXplLnR5cGUgPSBjLmdldEdMVHlwZSgpOwotICAgICAgICAgICAgbUdMLm1Qb2ludFNpemUubm9ybWFsaXplZCA9IGZhbHNlOwotICAgICAgICAgICAgbUdMLm1Qb2ludFNpemUubmFtZS5zZXRUbygiUG9pbnRTaXplIik7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQorICAgICAgICBtQXR0cmlic1t1c2VyTnVtXS5zaXplID0gYy5nZXRWZWN0b3JTaXplKCk7CisgICAgICAgIG1BdHRyaWJzW3VzZXJOdW1dLm9mZnNldCA9IG1FbGVtZW50LT5nZXRGaWVsZE9mZnNldEJ5dGVzKGN0KTsKKyAgICAgICAgbUF0dHJpYnNbdXNlck51bV0udHlwZSA9IGMuZ2V0R0xUeXBlKCk7CisgICAgICAgIG1BdHRyaWJzW3VzZXJOdW1dLm5vcm1hbGl6ZWQgPSBjLmdldFR5cGUoKSAhPSBSU19UWVBFX0ZMT0FUXzMyOy8vYy5nZXRJc05vcm1hbGl6ZWQoKTsKKyAgICAgICAgbUF0dHJpYnNbdXNlck51bV0ubmFtZS5zZXRUbyhnZXRFbGVtZW50KCktPmdldEZpZWxkTmFtZShjdCkpOworICAgICAgICB1c2VyTnVtICsrOwogICAgIH0KIH0KIAorCiB2b2lkIFR5cGU6OmVuYWJsZUdMVmVydGV4QnVmZmVyKFZlcnRleEFycmF5ICp2YSkgY29uc3QKIHsKLSAgICAvLyBOb3RlOiBXZSBhcmUgb25seSBnb2luZyB0byBlbmFibGUgYnVmZmVycyBhbmQgbmV2ZXIgZGlzYWJsZSB0aGVtCi0gICAgLy8gaGVyZS4gIFRoZSByZWFzb24gaXMgbW9yZSB0aGFuIG9uZSBBbGxvY2F0aW9uIG1heSBiZSB1c2VkIGFzIGEgdmVydGV4Ci0gICAgLy8gc291cmNlLiAgU28gd2UgY2Fubm90IGRpc2FibGUgYXJyYXlzIHRoYXQgbWF5IGhhdmUgYmVlbiBpbiB1c2UgYnkKLSAgICAvLyBhbm90aGVyIGFsbG9jYXRpb24uCi0KLSAgICB1aW50MzJfdCBzdHJpZGUgPSBtRWxlbWVudC0+Z2V0U2l6ZUJ5dGVzKCk7Ci0gICAgaWYgKG1HTC5tVnR4LnNpemUpIHsKLSAgICAgICAgdmEtPmFkZExlZ2FjeShtR0wubVZ0eC50eXBlLAotICAgICAgICAgICAgICAgICAgICAgIG1HTC5tVnR4LnNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgIFJTX0tJTkRfUE9TSVRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgbUdMLm1WdHgub2Zmc2V0KTsKLSAgICB9Ci0KLSAgICBpZiAobUdMLm1Ob3JtLnNpemUpIHsKLSAgICAgICAgdmEtPmFkZExlZ2FjeShtR0wubU5vcm0udHlwZSwKLSAgICAgICAgICAgICAgICAgICAgIDMsCi0gICAgICAgICAgICAgICAgICAgICBzdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICBSU19LSU5EX05PUk1BTCwKLSAgICAgICAgICAgICAgICAgICAgIGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgbUdMLm1Ob3JtLm9mZnNldCk7Ci0gICAgfQotCi0gICAgaWYgKG1HTC5tQ29sb3Iuc2l6ZSkgewotICAgICAgICB2YS0+YWRkTGVnYWN5KG1HTC5tQ29sb3IudHlwZSwKLSAgICAgICAgICAgICAgICAgICAgIG1HTC5tQ29sb3Iuc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgIHN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgIFJTX0tJTkRfQ09MT1IsCi0gICAgICAgICAgICAgICAgICAgICB0cnVlLAotICAgICAgICAgICAgICAgICAgICAgbUdMLm1Db2xvci5vZmZzZXQpOwotICAgIH0KLQotICAgIGlmIChtR0wubVRleC5zaXplKSB7Ci0gICAgICAgIHZhLT5hZGRMZWdhY3kobUdMLm1UZXgudHlwZSwKLSAgICAgICAgICAgICAgICAgICAgIG1HTC5tVGV4LnNpemUsCi0gICAgICAgICAgICAgICAgICAgICBzdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICBSU19LSU5EX1RFWFRVUkUsCi0gICAgICAgICAgICAgICAgICAgICBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgIG1HTC5tVGV4Lm9mZnNldCk7Ci0gICAgfQotCi0gICAgaWYgKG1HTC5tUG9pbnRTaXplLnNpemUpIHsKLSAgICAgICAgdmEtPmFkZExlZ2FjeShtR0wubVBvaW50U2l6ZS50eXBlLAotICAgICAgICAgICAgICAgICAgICAgMSwKLSAgICAgICAgICAgICAgICAgICAgIHN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgIFJTX0tJTkRfUE9JTlRfU0laRSwKLSAgICAgICAgICAgICAgICAgICAgIGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgbUdMLm1Qb2ludFNpemUub2Zmc2V0KTsKLSAgICB9Ci0KLX0KLQotdm9pZCBUeXBlOjplbmFibGVHTFZlcnRleEJ1ZmZlcjIoVmVydGV4QXJyYXkgKnZhKSBjb25zdAotewotICAgIC8vIERvIGxlZ2FjeSBidWZmZXJzCi0gICAgZW5hYmxlR0xWZXJ0ZXhCdWZmZXIodmEpOwotCiAgICAgdWludDMyX3Qgc3RyaWRlID0gbUVsZW1lbnQtPmdldFNpemVCeXRlcygpOwogICAgIGZvciAodWludDMyX3QgY3Q9MDsgY3QgPCBSU19NQVhfQVRUUklCUzsgY3QrKykgewotICAgICAgICBpZiAobUdMLm1Vc2VyW2N0XS5zaXplKSB7Ci0gICAgICAgICAgICB2YS0+YWRkVXNlcihtR0wubVVzZXJbY3RdLCBzdHJpZGUpOworICAgICAgICBpZiAobUF0dHJpYnNbY3RdLnNpemUpIHsKKyAgICAgICAgICAgIHZhLT5hZGQobUF0dHJpYnNbY3RdLCBzdHJpZGUpOwogICAgICAgICB9CiAgICAgfQogfQpAQCAtMjgzLDYgKzE4MSw1NyBAQAogICAgIG1FbGVtZW50LT5kdW1wTE9HVihidWYpOwogfQogCit2b2lkIFR5cGU6OnNlcmlhbGl6ZShPU3RyZWFtICpzdHJlYW0pIGNvbnN0Cit7CisgICAgLy8gTmVlZCB0byBpZGVudGlmeSBvdXJzZWx2ZXMKKyAgICBzdHJlYW0tPmFkZFUzMigodWludDMyX3QpZ2V0Q2xhc3NJZCgpKTsKKworICAgIFN0cmluZzggbmFtZShnZXROYW1lKCkpOworICAgIHN0cmVhbS0+YWRkU3RyaW5nKCZuYW1lKTsKKworICAgIG1FbGVtZW50LT5zZXJpYWxpemUoc3RyZWFtKTsKKworICAgIHN0cmVhbS0+YWRkVTMyKG1EaW1YKTsKKyAgICBzdHJlYW0tPmFkZFUzMihtRGltWSk7CisgICAgc3RyZWFtLT5hZGRVMzIobURpbVopOworCisgICAgc3RyZWFtLT5hZGRVOCgodWludDhfdCkobURpbUxPRCA/IDEgOiAwKSk7CisgICAgc3RyZWFtLT5hZGRVOCgodWludDhfdCkobUZhY2VzID8gMSA6IDApKTsKK30KKworVHlwZSAqVHlwZTo6Y3JlYXRlRnJvbVN0cmVhbShDb250ZXh0ICpyc2MsIElTdHJlYW0gKnN0cmVhbSkKK3sKKyAgICAvLyBGaXJzdCBtYWtlIHN1cmUgd2UgYXJlIHJlYWRpbmcgdGhlIGNvcnJlY3Qgb2JqZWN0CisgICAgUnNBM0RDbGFzc0lEIGNsYXNzSUQgPSAoUnNBM0RDbGFzc0lEKXN0cmVhbS0+bG9hZFUzMigpOworICAgIGlmKGNsYXNzSUQgIT0gUlNfQTNEX0NMQVNTX0lEX1RZUEUpIHsKKyAgICAgICAgTE9HRSgidHlwZSBsb2FkaW5nIHNraXBwZWQgZHVlIHRvIGludmFsaWQgY2xhc3MgaWRcbiIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBTdHJpbmc4IG5hbWU7CisgICAgc3RyZWFtLT5sb2FkU3RyaW5nKCZuYW1lKTsKKworICAgIEVsZW1lbnQgKmVsZW0gPSBFbGVtZW50OjpjcmVhdGVGcm9tU3RyZWFtKHJzYywgc3RyZWFtKTsKKyAgICBpZighZWxlbSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBUeXBlICp0eXBlID0gbmV3IFR5cGUocnNjKTsKKyAgICB0eXBlLT5tRGltWCA9IHN0cmVhbS0+bG9hZFUzMigpOworICAgIHR5cGUtPm1EaW1ZID0gc3RyZWFtLT5sb2FkVTMyKCk7CisgICAgdHlwZS0+bURpbVogPSBzdHJlYW0tPmxvYWRVMzIoKTsKKworICAgIHVpbnQ4X3QgdGVtcCA9IHN0cmVhbS0+bG9hZFU4KCk7CisgICAgdHlwZS0+bURpbUxPRCA9IHRlbXAgIT0gMDsKKworICAgIHRlbXAgPSBzdHJlYW0tPmxvYWRVOCgpOworICAgIHR5cGUtPm1GYWNlcyA9IHRlbXAgIT0gMDsKKworICAgIHR5cGUtPnNldEVsZW1lbnQoZWxlbSk7CisKKyAgICByZXR1cm4gdHlwZTsKK30KKwogYm9vbCBUeXBlOjpnZXRJc05wMigpIGNvbnN0CiB7CiAgICAgdWludDMyX3QgeCA9IGdldERpbVgoKTsKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNUeXBlLmggYi9saWJzL3JzL3JzVHlwZS5oCmluZGV4IGMyNTU3N2MuLjViNTFlMjAgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNUeXBlLmgKKysrIGIvbGlicy9ycy9yc1R5cGUuaApAQCAtNzEsOSArNzEsMTEgQEAKICAgICB2b2lkIGNvbXB1dGUoKTsKIAogICAgIHZvaWQgZW5hYmxlR0xWZXJ0ZXhCdWZmZXIoY2xhc3MgVmVydGV4QXJyYXkgKikgY29uc3Q7Ci0gICAgdm9pZCBlbmFibGVHTFZlcnRleEJ1ZmZlcjIoY2xhc3MgVmVydGV4QXJyYXkgKikgY29uc3Q7CiAKICAgICB2b2lkIGR1bXBMT0dWKGNvbnN0IGNoYXIgKnByZWZpeCkgY29uc3Q7CisgICAgdmlydHVhbCB2b2lkIHNlcmlhbGl6ZShPU3RyZWFtICpzdHJlYW0pIGNvbnN0OworICAgIHZpcnR1YWwgUnNBM0RDbGFzc0lEIGdldENsYXNzSWQoKSBjb25zdCB7IHJldHVybiBSU19BM0RfQ0xBU1NfSURfVFlQRTsgfQorICAgIHN0YXRpYyBUeXBlICpjcmVhdGVGcm9tU3RyZWFtKENvbnRleHQgKnJzYywgSVN0cmVhbSAqc3RyZWFtKTsKIAogcHJvdGVjdGVkOgogICAgIHN0cnVjdCBMT0QgewpAQCAtMTEyLDE1ICsxMTQsNyBAQAogICAgIExPRCAqbUxPRHM7CiAgICAgdWludDMyX3QgbUxPRENvdW50OwogCi0gICAgc3RydWN0IEdMU3RhdGVfdCB7Ci0gICAgICAgIFZlcnRleEFycmF5OjpBdHRyaWIgbVVzZXJbUlNfTUFYX0FUVFJJQlNdOwotICAgICAgICBWZXJ0ZXhBcnJheTo6QXR0cmliIG1WdHg7Ci0gICAgICAgIFZlcnRleEFycmF5OjpBdHRyaWIgbU5vcm07Ci0gICAgICAgIFZlcnRleEFycmF5OjpBdHRyaWIgbUNvbG9yOwotICAgICAgICBWZXJ0ZXhBcnJheTo6QXR0cmliIG1UZXg7Ci0gICAgICAgIFZlcnRleEFycmF5OjpBdHRyaWIgbVBvaW50U2l6ZTsKLSAgICB9OwotICAgIEdMU3RhdGVfdCBtR0w7CisgICAgVmVydGV4QXJyYXk6OkF0dHJpYiBtQXR0cmlic1tSU19NQVhfQVRUUklCU107CiAgICAgdm9pZCBtYWtlR0xDb21wb25lbnRzKCk7CiAKIHByaXZhdGU6CmRpZmYgLS1naXQgYS9saWJzL3JzL3JzVXRpbHMuaCBiL2xpYnMvcnMvcnNVdGlscy5oCmluZGV4IDA3Zjg5MzMuLjBhMzdhNWIgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNVdGlscy5oCisrKyBiL2xpYnMvcnMvcnNVdGlscy5oCkBAIC0xOSwxNSArMTksMjIgQEAKIAogI2RlZmluZSBMT0dfTkRFQlVHIDAKICNkZWZpbmUgTE9HX1RBRyAiUmVuZGVyU2NyaXB0IgorCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+Ci0jaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KKworI2luY2x1ZGUgInJzU3RyZWFtLmgiCisKICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisKICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxwdGhyZWFkLmg+CiAjaW5jbHVkZSA8dGltZS5oPgogCisjaWZuZGVmIEFORFJPSURfUlNfQlVJTERfRk9SX0hPU1QKICNpbmNsdWRlIDxFR0wvZWdsLmg+CisjZW5kaWYKKwogI2luY2x1ZGUgPG1hdGguaD4KIAogI2luY2x1ZGUgIlJlbmRlclNjcmlwdC5oIgpAQCAtNDEsNiArNDgsMjYgQEAKICNkZWZpbmUgcnNBc3NlcnQodikgd2hpbGUoMCkKICNlbmRpZgogCit0eXBlZGVmIGZsb2F0IHJzdkZfMiBfX2F0dHJpYnV0ZV9fICgodmVjdG9yX3NpemUgKDgpKSk7Cit0eXBlZGVmIGZsb2F0IHJzdkZfNCBfX2F0dHJpYnV0ZV9fICgodmVjdG9yX3NpemUgKDE2KSkpOwordHlwZWRlZiB1aW50OF90IHJzdlU4XzQgX19hdHRyaWJ1dGVfXyAoKHZlY3Rvcl9zaXplICg0KSkpOworCit1bmlvbiBmbG9hdDIgeworICAgIHJzdkZfMiB2OworICAgIGZsb2F0IGZbMl07Cit9OworCit1bmlvbiBmbG9hdDQgeworICAgIHJzdkZfNCB2OworICAgIGZsb2F0IGZbNF07Cit9OworCit1bmlvbiB1Y2hhcjQgeworICAgIHJzdlU4XzQgdjsKKyAgICB1aW50OF90IGZbNF07CisgICAgdWludDMyX3QgcGFja2VkOworfTsKKwogdGVtcGxhdGU8dHlwZW5hbWUgVD4KIFQgcnNNaW4oVCBpbjEsIFQgaW4yKQogewpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc1ZlcnRleEFycmF5LmNwcCBiL2xpYnMvcnMvcnNWZXJ0ZXhBcnJheS5jcHAKaW5kZXggNmMyMDAyZC4uZWY4OTJhNSAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc1ZlcnRleEFycmF5LmNwcAorKysgYi9saWJzL3JzL3JzVmVydGV4QXJyYXkuY3BwCkBAIC0xNCwxMCArMTQsMTUgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKyNpZm5kZWYgQU5EUk9JRF9SU19CVUlMRF9GT1JfSE9TVAogI2luY2x1ZGUgInJzQ29udGV4dC5oIgotCiAjaW5jbHVkZSA8R0xFUy9nbC5oPgogI2luY2x1ZGUgPEdMRVMyL2dsMi5oPgorI2Vsc2UKKyNpbmNsdWRlICJyc0NvbnRleHRIb3N0U3R1Yi5oIgorI2luY2x1ZGUgPE9wZW5HTC9nbC5oPgorI2VuZGlmCisKIAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6cmVuZGVyc2NyaXB0OwpAQCAtNTUsNyArNjAsNiBAQAogICAgIHNpemUgPSBhLnNpemU7CiAgICAgc3RyaWRlID0gYS5zdHJpZGU7CiAgICAgbm9ybWFsaXplZCA9IGEubm9ybWFsaXplZDsKLSAgICBraW5kID0gUlNfS0lORF9VU0VSOwogICAgIG5hbWUuc2V0VG8oYS5uYW1lKTsKIH0KIApAQCAtNzUsMTM4ICs3OSw4NiBAQAogICAgIG1BdHRyaWJzW25dLmNsZWFyKCk7CiB9CiAKLXZvaWQgVmVydGV4QXJyYXk6OmFkZFVzZXIoY29uc3QgQXR0cmliICZhLCB1aW50MzJfdCBzdHJpZGUpCit2b2lkIFZlcnRleEFycmF5OjphZGQoY29uc3QgQXR0cmliICZhLCB1aW50MzJfdCBzdHJpZGUpCiB7Ci0gICAgYXNzZXJ0KG1Db3VudCA8IFJTX01BWF9BVFRSSUJTKTsKKyAgICByc0Fzc2VydChtQ291bnQgPCBSU19NQVhfQVRUUklCUyk7CiAgICAgbUF0dHJpYnNbbUNvdW50XS5zZXQoYSk7CiAgICAgbUF0dHJpYnNbbUNvdW50XS5idWZmZXIgPSBtQWN0aXZlQnVmZmVyOworICAgIG1BdHRyaWJzW21Db3VudF0ucHRyID0gbUFjdGl2ZVBvaW50ZXI7CiAgICAgbUF0dHJpYnNbbUNvdW50XS5zdHJpZGUgPSBzdHJpZGU7Ci0gICAgbUF0dHJpYnNbbUNvdW50XS5raW5kID0gUlNfS0lORF9VU0VSOwogICAgIG1Db3VudCArKzsKIH0KIAotdm9pZCBWZXJ0ZXhBcnJheTo6YWRkTGVnYWN5KHVpbnQzMl90IHR5cGUsIHVpbnQzMl90IHNpemUsIHVpbnQzMl90IHN0cmlkZSwgUnNEYXRhS2luZCBraW5kLCBib29sIG5vcm1hbGl6ZWQsIHVpbnQzMl90IG9mZnNldCkKK3ZvaWQgVmVydGV4QXJyYXk6OmFkZCh1aW50MzJfdCB0eXBlLCB1aW50MzJfdCBzaXplLCB1aW50MzJfdCBzdHJpZGUsIGJvb2wgbm9ybWFsaXplZCwgdWludDMyX3Qgb2Zmc2V0LCBjb25zdCBjaGFyICpuYW1lKQogewotICAgIGFzc2VydChtQ291bnQgPCBSU19NQVhfQVRUUklCUyk7CisgICAgcnNBc3NlcnQobUNvdW50IDwgUlNfTUFYX0FUVFJJQlMpOwogICAgIG1BdHRyaWJzW21Db3VudF0uY2xlYXIoKTsKICAgICBtQXR0cmlic1ttQ291bnRdLnR5cGUgPSB0eXBlOwogICAgIG1BdHRyaWJzW21Db3VudF0uc2l6ZSA9IHNpemU7CiAgICAgbUF0dHJpYnNbbUNvdW50XS5vZmZzZXQgPSBvZmZzZXQ7CiAgICAgbUF0dHJpYnNbbUNvdW50XS5ub3JtYWxpemVkID0gbm9ybWFsaXplZDsKLSAgICBtQXR0cmlic1ttQ291bnRdLmJ1ZmZlciA9IG1BY3RpdmVCdWZmZXI7CiAgICAgbUF0dHJpYnNbbUNvdW50XS5zdHJpZGUgPSBzdHJpZGU7Ci0gICAgbUF0dHJpYnNbbUNvdW50XS5raW5kID0ga2luZDsKKyAgICBtQXR0cmlic1ttQ291bnRdLm5hbWUuc2V0VG8obmFtZSk7CisKKyAgICBtQXR0cmlic1ttQ291bnRdLmJ1ZmZlciA9IG1BY3RpdmVCdWZmZXI7CisgICAgbUF0dHJpYnNbbUNvdW50XS5wdHIgPSBtQWN0aXZlUG9pbnRlcjsKICAgICBtQ291bnQgKys7CiB9CiAKIHZvaWQgVmVydGV4QXJyYXk6OmxvZ0F0dHJpYih1aW50MzJfdCBpZHgsIHVpbnQzMl90IHNsb3QpIGNvbnN0IHsKLSAgICBMT0dFKCJ2YSAlaTogc2xvdD0laSBuYW1lPSVzIGJ1Zj0laSAgc2l6ZT0laSAgdHlwZT0weCV4ICBraW5kPSVpICBzdHJpZGU9MHgleCAgbm9ybT0laSAgb2Zmc2V0PTB4JXgiLCBpZHgsIHNsb3QsCisgICAgTE9HRSgidmEgJWk6IHNsb3Q9JWkgbmFtZT0lcyBidWY9JWkgcHRyPSVwIHNpemU9JWkgIHR5cGU9MHgleCAgc3RyaWRlPTB4JXggIG5vcm09JWkgIG9mZnNldD0weCV4IiwgaWR4LCBzbG90LAogICAgICAgICAgbUF0dHJpYnNbaWR4XS5uYW1lLnN0cmluZygpLAogICAgICAgICAgbUF0dHJpYnNbaWR4XS5idWZmZXIsCisgICAgICAgICBtQXR0cmlic1tpZHhdLnB0ciwKICAgICAgICAgIG1BdHRyaWJzW2lkeF0uc2l6ZSwKICAgICAgICAgIG1BdHRyaWJzW2lkeF0udHlwZSwKLSAgICAgICAgIG1BdHRyaWJzW2lkeF0ua2luZCwKICAgICAgICAgIG1BdHRyaWJzW2lkeF0uc3RyaWRlLAogICAgICAgICAgbUF0dHJpYnNbaWR4XS5ub3JtYWxpemVkLAogICAgICAgICAgbUF0dHJpYnNbaWR4XS5vZmZzZXQpOwogfQogCi12b2lkIFZlcnRleEFycmF5OjpzZXR1cEdMKGNvbnN0IENvbnRleHQgKnJzYywgY2xhc3MgVmVydGV4QXJyYXlTdGF0ZSAqc3RhdGUpIGNvbnN0Ci17Ci0gICAgZ2xDbGllbnRBY3RpdmVUZXh0dXJlKEdMX1RFWFRVUkUwKTsKLSAgICBnbERpc2FibGVDbGllbnRTdGF0ZShHTF9OT1JNQUxfQVJSQVkpOwotICAgIGdsRGlzYWJsZUNsaWVudFN0YXRlKEdMX0NPTE9SX0FSUkFZKTsKLSAgICBnbERpc2FibGVDbGllbnRTdGF0ZShHTF9URVhUVVJFX0NPT1JEX0FSUkFZKTsKLSAgICBnbERpc2FibGVDbGllbnRTdGF0ZShHTF9QT0lOVF9TSVpFX0FSUkFZX09FUyk7Ci0KLSAgICBmb3IgKHVpbnQzMl90IGN0PTA7IGN0IDwgbUNvdW50OyBjdCsrKSB7Ci0gICAgICAgIHN3aXRjaChtQXR0cmlic1tjdF0ua2luZCkgewotICAgICAgICBjYXNlIFJTX0tJTkRfUE9TSVRJT046Ci0gICAgICAgICAgICAvL2xvZ0F0dHJpYihQT1NJVElPTik7Ci0gICAgICAgICAgICBnbEVuYWJsZUNsaWVudFN0YXRlKEdMX1ZFUlRFWF9BUlJBWSk7Ci0gICAgICAgICAgICBnbEJpbmRCdWZmZXIoR0xfQVJSQVlfQlVGRkVSLCBtQXR0cmlic1tjdF0uYnVmZmVyKTsKLSAgICAgICAgICAgIGdsVmVydGV4UG9pbnRlcihtQXR0cmlic1tjdF0uc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQXR0cmlic1tjdF0udHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQXR0cmlic1tjdF0uc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopbUF0dHJpYnNbY3RdLm9mZnNldCk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIFJTX0tJTkRfTk9STUFMOgotICAgICAgICAgICAgLy9sb2dBdHRyaWIoTk9STUFMKTsKLSAgICAgICAgICAgIGdsRW5hYmxlQ2xpZW50U3RhdGUoR0xfTk9STUFMX0FSUkFZKTsKLSAgICAgICAgICAgIHJzQXNzZXJ0KG1BdHRyaWJzW2N0XS5zaXplID09IDMpOwotICAgICAgICAgICAgZ2xCaW5kQnVmZmVyKEdMX0FSUkFZX0JVRkZFUiwgbUF0dHJpYnNbY3RdLmJ1ZmZlcik7Ci0gICAgICAgICAgICBnbE5vcm1hbFBvaW50ZXIobUF0dHJpYnNbY3RdLnR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUF0dHJpYnNbY3RdLnN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKW1BdHRyaWJzW2N0XS5vZmZzZXQpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBSU19LSU5EX0NPTE9SOgotICAgICAgICAgICAgLy9sb2dBdHRyaWIoQ09MT1IpOwotICAgICAgICAgICAgZ2xFbmFibGVDbGllbnRTdGF0ZShHTF9DT0xPUl9BUlJBWSk7Ci0gICAgICAgICAgICBnbEJpbmRCdWZmZXIoR0xfQVJSQVlfQlVGRkVSLCBtQXR0cmlic1tjdF0uYnVmZmVyKTsKLSAgICAgICAgICAgIGdsQ29sb3JQb2ludGVyKG1BdHRyaWJzW2N0XS5zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbUF0dHJpYnNbY3RdLnR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBtQXR0cmlic1tjdF0uc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKiltQXR0cmlic1tjdF0ub2Zmc2V0KTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgUlNfS0lORF9URVhUVVJFOgotICAgICAgICAgICAgLy9sb2dBdHRyaWIoVEVYVFVSRSk7Ci0gICAgICAgICAgICBnbEVuYWJsZUNsaWVudFN0YXRlKEdMX1RFWFRVUkVfQ09PUkRfQVJSQVkpOwotICAgICAgICAgICAgZ2xCaW5kQnVmZmVyKEdMX0FSUkFZX0JVRkZFUiwgbUF0dHJpYnNbY3RdLmJ1ZmZlcik7Ci0gICAgICAgICAgICBnbFRleENvb3JkUG9pbnRlcihtQXR0cmlic1tjdF0uc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BdHRyaWJzW2N0XS50eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUF0dHJpYnNbY3RdLnN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopbUF0dHJpYnNbY3RdLm9mZnNldCk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIFJTX0tJTkRfUE9JTlRfU0laRToKLSAgICAgICAgICAgIC8vbG9nQXR0cmliKFBPSU5UX1NJWkUpOwotICAgICAgICAgICAgZ2xFbmFibGVDbGllbnRTdGF0ZShHTF9QT0lOVF9TSVpFX0FSUkFZX09FUyk7Ci0gICAgICAgICAgICBnbEJpbmRCdWZmZXIoR0xfQVJSQVlfQlVGRkVSLCBtQXR0cmlic1tjdF0uYnVmZmVyKTsKLSAgICAgICAgICAgIGdsUG9pbnRTaXplUG9pbnRlck9FUyhtQXR0cmlic1tjdF0udHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQXR0cmlic1tjdF0uc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopbUF0dHJpYnNbY3RdLm9mZnNldCk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcnNBc3NlcnQoMCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByc2MtPmNoZWNrRXJyb3IoIlZlcnRleEFycmF5OjpzZXR1cEdMIik7Ci19Ci0KIHZvaWQgVmVydGV4QXJyYXk6OnNldHVwR0wyKGNvbnN0IENvbnRleHQgKnJzYywgY2xhc3MgVmVydGV4QXJyYXlTdGF0ZSAqc3RhdGUsIFNoYWRlckNhY2hlICpzYykgY29uc3QKIHsKICAgICByc2MtPmNoZWNrRXJyb3IoIlZlcnRleEFycmF5OjpzZXR1cEdMMiBzdGFydCIpOwotICAgIGZvciAodWludDMyX3QgY3Q9MTsgY3QgPD0gc3RhdGUtPm1MYXN0RW5hYmxlQ291bnQ7IGN0KyspIHsKKyAgICBmb3IgKHVpbnQzMl90IGN0PTE7IGN0IDw9IDB4Zi8qc3RhdGUtPm1MYXN0RW5hYmxlQ291bnQqLzsgY3QrKykgewogICAgICAgICBnbERpc2FibGVWZXJ0ZXhBdHRyaWJBcnJheShjdCk7CiAgICAgfQogCiAgICAgcnNjLT5jaGVja0Vycm9yKCJWZXJ0ZXhBcnJheTo6c2V0dXBHTDIgZGlzYWJsZWQiKTsKICAgICBmb3IgKHVpbnQzMl90IGN0PTA7IGN0IDwgbUNvdW50OyBjdCsrKSB7CiAgICAgICAgIHVpbnQzMl90IHNsb3QgPSAwOworCisgICAgICAgIGlmIChtQXR0cmlic1tjdF0ubmFtZVswXSA9PSAnIycpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKICAgICAgICAgaWYgKHNjLT5pc1VzZXJWZXJ0ZXhQcm9ncmFtKCkpIHsKICAgICAgICAgICAgIHNsb3QgPSBzYy0+dnR4QXR0cmliU2xvdChjdCk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAobUF0dHJpYnNbY3RdLmtpbmQgPT0gUlNfS0lORF9VU0VSKSB7CisgICAgICAgICAgICBpZiAobUF0dHJpYnNbY3RdLm5hbWUgPT0gInBvc2l0aW9uIikgeworICAgICAgICAgICAgICAgIHNsb3QgPSAwOworICAgICAgICAgICAgfSBlbHNlIGlmIChtQXR0cmlic1tjdF0ubmFtZSA9PSAiY29sb3IiKSB7CisgICAgICAgICAgICAgICAgc2xvdCA9IDE7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1BdHRyaWJzW2N0XS5uYW1lID09ICJub3JtYWwiKSB7CisgICAgICAgICAgICAgICAgc2xvdCA9IDI7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1BdHRyaWJzW2N0XS5uYW1lID09ICJwb2ludFNpemUiKSB7CisgICAgICAgICAgICAgICAgc2xvdCA9IDM7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1BdHRyaWJzW2N0XS5uYW1lID09ICJ0ZXh0dXJlMCIpIHsKKyAgICAgICAgICAgICAgICBzbG90ID0gNDsKKyAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBzbG90ID0gc2MtPnZ0eEF0dHJpYlNsb3QobUF0dHJpYnNbY3RdLmtpbmQpOwogICAgICAgICB9CiAKICAgICAgICAgLy9sb2dBdHRyaWIoY3QsIHNsb3QpOwogICAgICAgICBnbEVuYWJsZVZlcnRleEF0dHJpYkFycmF5KHNsb3QpOwogICAgICAgICBnbEJpbmRCdWZmZXIoR0xfQVJSQVlfQlVGRkVSLCBtQXR0cmlic1tjdF0uYnVmZmVyKTsKLQogICAgICAgICBnbFZlcnRleEF0dHJpYlBvaW50ZXIoc2xvdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BdHRyaWJzW2N0XS5zaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUF0dHJpYnNbY3RdLnR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQXR0cmlic1tjdF0ubm9ybWFsaXplZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BdHRyaWJzW2N0XS5zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKW1BdHRyaWJzW2N0XS5vZmZzZXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUF0dHJpYnNbY3RdLnB0ciArIG1BdHRyaWJzW2N0XS5vZmZzZXQpOwogICAgIH0KICAgICBzdGF0ZS0+bUxhc3RFbmFibGVDb3VudCA9IG1Db3VudDsKICAgICByc2MtPmNoZWNrRXJyb3IoIlZlcnRleEFycmF5OjpzZXR1cEdMMiBkb25lIik7CmRpZmYgLS1naXQgYS9saWJzL3JzL3JzVmVydGV4QXJyYXkuaCBiL2xpYnMvcnMvcnNWZXJ0ZXhBcnJheS5oCmluZGV4IDM5MDRjYjYuLjdjNjA5YjIgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNWZXJ0ZXhBcnJheS5oCisrKyBiL2xpYnMvcnMvcnNWZXJ0ZXhBcnJheS5oCkBAIC0zNywxMyArMzcsMTMgQEAKICAgICBjbGFzcyBBdHRyaWIgewogICAgIHB1YmxpYzoKICAgICAgICAgdWludDMyX3QgYnVmZmVyOworICAgICAgICBjb25zdCB1aW50OF90ICogcHRyOwogICAgICAgICB1aW50MzJfdCBvZmZzZXQ7CiAgICAgICAgIHVpbnQzMl90IHR5cGU7CiAgICAgICAgIHVpbnQzMl90IHNpemU7CiAgICAgICAgIHVpbnQzMl90IHN0cmlkZTsKICAgICAgICAgYm9vbCBub3JtYWxpemVkOwogICAgICAgICBTdHJpbmc4IG5hbWU7Ci0gICAgICAgIFJzRGF0YUtpbmQga2luZDsKIAogICAgICAgICBBdHRyaWIoKTsKICAgICAgICAgdm9pZCBzZXQoY29uc3QgQXR0cmliICYpOwpAQCAtNTIsOSArNTIsMTggQEAKIAogCiAgICAgdm9pZCBjbGVhckFsbCgpOwotICAgIHZvaWQgc2V0QWN0aXZlQnVmZmVyKHVpbnQzMl90IGlkKSB7bUFjdGl2ZUJ1ZmZlciA9IGlkO30KLSAgICB2b2lkIGFkZFVzZXIoY29uc3QgQXR0cmliICYsIHVpbnQzMl90IHN0cmlkZSk7Ci0gICAgdm9pZCBhZGRMZWdhY3kodWludDMyX3QgdHlwZSwgdWludDMyX3Qgc2l6ZSwgdWludDMyX3Qgc3RyaWRlLCBSc0RhdGFLaW5kIGtpbmQsIGJvb2wgbm9ybWFsaXplZCwgdWludDMyX3Qgb2Zmc2V0KTsKKyAgICB2b2lkIHNldEFjdGl2ZUJ1ZmZlcih1aW50MzJfdCBpZCkgeworICAgICAgICBtQWN0aXZlQnVmZmVyID0gaWQ7CisgICAgICAgIG1BY3RpdmVQb2ludGVyID0gTlVMTDsKKyAgICB9CisgICAgdm9pZCBzZXRBY3RpdmVCdWZmZXIoY29uc3Qgdm9pZCAqcHRyKSB7CisgICAgICAgIG1BY3RpdmVCdWZmZXIgPSAwOworICAgICAgICBtQWN0aXZlUG9pbnRlciA9IChjb25zdCB1aW50OF90ICopcHRyOworICAgIH0KKworICAgIHZvaWQgYWRkKGNvbnN0IEF0dHJpYiAmLCB1aW50MzJfdCBzdHJpZGUpOworICAgIC8vdm9pZCBhZGRMZWdhY3kodWludDMyX3QgdHlwZSwgdWludDMyX3Qgc2l6ZSwgdWludDMyX3Qgc3RyaWRlLCBib29sIG5vcm1hbGl6ZWQsIHVpbnQzMl90IG9mZnNldCk7CisgICAgdm9pZCBhZGQodWludDMyX3QgdHlwZSwgdWludDMyX3Qgc2l6ZSwgdWludDMyX3Qgc3RyaWRlLCBib29sIG5vcm1hbGl6ZWQsIHVpbnQzMl90IG9mZnNldCwgY29uc3QgY2hhciAqbmFtZSk7CiAKICAgICB2b2lkIHNldHVwR0woY29uc3QgQ29udGV4dCAqcnNjLCBjbGFzcyBWZXJ0ZXhBcnJheVN0YXRlICopIGNvbnN0OwogICAgIHZvaWQgc2V0dXBHTDIoY29uc3QgQ29udGV4dCAqcnNjLCBjbGFzcyBWZXJ0ZXhBcnJheVN0YXRlICosIFNoYWRlckNhY2hlICopIGNvbnN0OwpAQCAtNjMsNiArNzIsNyBAQAogcHJvdGVjdGVkOgogICAgIHZvaWQgY2xlYXIodWludDMyX3QgaW5kZXgpOwogICAgIHVpbnQzMl90IG1BY3RpdmVCdWZmZXI7CisgICAgY29uc3QgdWludDhfdCAqIG1BY3RpdmVQb2ludGVyOwogICAgIHVpbnQzMl90IG1Db3VudDsKIAogICAgIEF0dHJpYiBtQXR0cmlic1tSU19NQVhfQVRUUklCU107CmRpZmYgLS1naXQgYS9saWJzL3JzL3JzZ19TY3JpcHRKYXZhQ2xhc3MuY3BwIGIvbGlicy9ycy9yc2dfU2NyaXB0SmF2YUNsYXNzLmNwcAppbmRleCBjZWU5ZjUyLi4wMTY5Yjk4IDEwMDY0NAotLS0gYS9saWJzL3JzL3JzZ19TY3JpcHRKYXZhQ2xhc3MuY3BwCisrKyBiL2xpYnMvcnMvcnNnX1NjcmlwdEphdmFDbGFzcy5jcHAKQEAgLTcsOCArNywxMiBAQAogc3RydWN0IEVsZW1lbnQ7CiAKIHN0cnVjdCBFbGVtZW50RmllbGQgeworICAgIC8vIEFuIEVsZW1lbnQgRmllbGQgaXMgYSBjb21iaW5hdGlvbiBvZiBhbiBFbGVtZW50IHdpdGggYSBuYW1lIGFzc2lnbmVkLgorCiAgICAgY29uc3QgY2hhciAqbmFtZTsKICAgICBFbGVtZW50ICplOworCisKICAgICBFbGVtZW50RmllbGQoY29uc3QgY2hhciAqbiwgRWxlbWVudCAqX2UpIHsKICAgICAgICAgbmFtZSA9IG47CiAgICAgICAgIGUgPSBfZTsKQEAgLTIwLDEyICsyNCwyMSBAQAogfTsKIAogc3RydWN0IEVsZW1lbnQgeworICAgIC8vIEFuIEVsZW1lbnQgY2FuIHRha2Ugb25lIG9mIHR3byBmb3Jtcy4KKyAgICAvLyAxOiBCYXNpYy4gIEl0IGNvbnRhaW5zIGEgc2luZ2xlIGJhc2ljIHR5cGUgYW5kIHZlY3RvciBzaXplLgorICAgIC8vIDI6IENvbXBsZXguICBJdCBjb250YWlucyBhIGxpc3Qgb2YgZmllbGRzIHdpdGggbmFtZXMuICBFYWNoIGZpZWxkCisgICAgLy8gd2lsbCBpbiB0dXJuIGJlIGFub3RoZXIgZWxlbWVudC4KKwogICAgIEVsZW1lbnRGaWVsZCAqZmllbGRzOwotICAgIHNpemVfdCBmaWVsZENvdW50OworICAgIHNpemVfdCBmaWVsZENvdW50OyAgLy8gSWYgZmllbGQgY291bnQgaXMgMCwgdGhlIGVsZW1lbnQgaXMgYSBCYXNpYyB0eXBlLgogICAgIGNvbnN0IGNoYXIgKm5hbWU7CiAgICAgYm9vbCBnZW5lcmF0ZWQ7CiAKKyAgICAvLyBUaGUgYmFzaWMgZGF0YSB0eXBlIGZyb20gUmVuZGVyU2NyaXB0LmgKICAgICBSc0RhdGFUeXBlIGNvbXBUeXBlOworCisgICAgLy8gVGhlIHZlY3RvciBzaXplIG9mIHRoZSBkYXRhIHR5cGUgZm9yIGZsb2F0MiwgZmxvYXQzLCAuLi4uCisgICAgLy8gQWxsb3dlZCBzaXplcyBhcmUgMiwzLDQsOCwxNgogICAgIHVpbnQzMl90IGNvbXBWZWN0b3JTaXplOwogCiAgICAgRWxlbWVudCgpIHsKZGlmZiAtLWdpdCBhL2xpYnMvcnMvc2NyaXB0Yy9yc19jbC5yc2ggYi9saWJzL3JzL3NjcmlwdGMvcnNfY2wucnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0ODQ0YTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL3NjcmlwdGMvcnNfY2wucnNoCkBAIC0wLDAgKzEsNzg1IEBACisjaWZuZGVmIF9fUlNfQ0xfUlNIX18KKyNkZWZpbmUgX19SU19DTF9SU0hfXworCisjZGVmaW5lIE1fUEkgICAgICAgIDMuMTQxNTkyNjUzNTg5NzkzMjM4NDYyNjQzMzgzMjc5NTAyODhmICAgLyogcGkgKi8KKworCisvLyBDb252ZXJzaW9ucworI2RlZmluZSBDVlRfRlVOQ18yKHR5cGVvdXQsIHR5cGVpbikgXAorc3RhdGljIHR5cGVvdXQjIzIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY29udmVydF8jI3R5cGVvdXQjIzIodHlwZWluIyMyIHYpIHsgXAorICAgIHR5cGVvdXQjIzIgciA9IHsodHlwZW91dCl2LngsICh0eXBlb3V0KXYueX07IFwKKyAgICByZXR1cm4gcjsgXAorfSBcCitzdGF0aWMgdHlwZW91dCMjMyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjb252ZXJ0XyMjdHlwZW91dCMjMyh0eXBlaW4jIzMgdikgeyBcCisgICAgdHlwZW91dCMjMyByID0geyh0eXBlb3V0KXYueCwgKHR5cGVvdXQpdi55LCAodHlwZW91dCl2Lnp9OyBcCisgICAgcmV0dXJuIHI7IFwKK30gXAorc3RhdGljIHR5cGVvdXQjIzQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY29udmVydF8jI3R5cGVvdXQjIzQodHlwZWluIyM0IHYpIHsgXAorICAgIHR5cGVvdXQjIzQgciA9IHsodHlwZW91dCl2LngsICh0eXBlb3V0KXYueSwgKHR5cGVvdXQpdi56LCAodHlwZW91dCl2Lnd9OyBcCisgICAgcmV0dXJuIHI7IFwKK30KKworI2RlZmluZSBDVlRfRlVOQyh0eXBlKSAgICAgIENWVF9GVU5DXzIodHlwZSwgdWNoYXIpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDVlRfRlVOQ18yKHR5cGUsIGNoYXIpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDVlRfRlVOQ18yKHR5cGUsIHVzaG9ydCkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENWVF9GVU5DXzIodHlwZSwgc2hvcnQpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDVlRfRlVOQ18yKHR5cGUsIGludCkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENWVF9GVU5DXzIodHlwZSwgdWludCkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENWVF9GVU5DXzIodHlwZSwgZmxvYXQpCisKK0NWVF9GVU5DKGNoYXIpCitDVlRfRlVOQyh1Y2hhcikKK0NWVF9GVU5DKHNob3J0KQorQ1ZUX0ZVTkModXNob3J0KQorQ1ZUX0ZVTkMoaW50KQorQ1ZUX0ZVTkModWludCkKK0NWVF9GVU5DKGZsb2F0KQorCisKKworLy8gRmxvYXQgb3BzLCA2LjExLjIKKworI2RlZmluZSBERUZfRlVOQ18xKGZuYykgXAorc3RhdGljIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbmMoZmxvYXQyIHYpIHsgXAorICAgIGZsb2F0MiByOyBcCisgICAgci54ID0gZm5jKHYueCk7IFwKKyAgICByLnkgPSBmbmModi55KTsgXAorICAgIHJldHVybiByOyBcCit9IFwKK3N0YXRpYyBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZm5jKGZsb2F0MyB2KSB7IFwKKyAgICBmbG9hdDMgcjsgXAorICAgIHIueCA9IGZuYyh2LngpOyBcCisgICAgci55ID0gZm5jKHYueSk7IFwKKyAgICByLnogPSBmbmModi56KTsgXAorICAgIHJldHVybiByOyBcCit9IFwKK3N0YXRpYyBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZm5jKGZsb2F0NCB2KSB7IFwKKyAgICBmbG9hdDQgcjsgXAorICAgIHIueCA9IGZuYyh2LngpOyBcCisgICAgci55ID0gZm5jKHYueSk7IFwKKyAgICByLnogPSBmbmModi56KTsgXAorICAgIHIudyA9IGZuYyh2LncpOyBcCisgICAgcmV0dXJuIHI7IFwKK30KKworI2RlZmluZSBERUZfRlVOQ18yKGZuYykgXAorc3RhdGljIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbmMoZmxvYXQyIHYxLCBmbG9hdDIgdjIpIHsgXAorICAgIGZsb2F0MiByOyBcCisgICAgci54ID0gZm5jKHYxLngsIHYyLngpOyBcCisgICAgci55ID0gZm5jKHYxLnksIHYyLnkpOyBcCisgICAgcmV0dXJuIHI7IFwKK30gXAorc3RhdGljIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbmMoZmxvYXQzIHYxLCBmbG9hdDMgdjIpIHsgXAorICAgIGZsb2F0MyByOyBcCisgICAgci54ID0gZm5jKHYxLngsIHYyLngpOyBcCisgICAgci55ID0gZm5jKHYxLnksIHYyLnkpOyBcCisgICAgci56ID0gZm5jKHYxLnosIHYyLnopOyBcCisgICAgcmV0dXJuIHI7IFwKK30gXAorc3RhdGljIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbmMoZmxvYXQ0IHYxLCBmbG9hdDQgdjIpIHsgXAorICAgIGZsb2F0NCByOyBcCisgICAgci54ID0gZm5jKHYxLngsIHYyLngpOyBcCisgICAgci55ID0gZm5jKHYxLnksIHYyLnkpOyBcCisgICAgci56ID0gZm5jKHYxLnosIHYyLnopOyBcCisgICAgci53ID0gZm5jKHYxLncsIHYyLnopOyBcCisgICAgcmV0dXJuIHI7IFwKK30KKworI2RlZmluZSBERUZfRlVOQ18yRihmbmMpIFwKK3N0YXRpYyBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZm5jKGZsb2F0MiB2MSwgZmxvYXQgdjIpIHsgXAorICAgIGZsb2F0MiByOyBcCisgICAgci54ID0gZm5jKHYxLngsIHYyKTsgXAorICAgIHIueSA9IGZuYyh2MS55LCB2Mik7IFwKKyAgICByZXR1cm4gcjsgXAorfSBcCitzdGF0aWMgZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZuYyhmbG9hdDMgdjEsIGZsb2F0IHYyKSB7IFwKKyAgICBmbG9hdDMgcjsgXAorICAgIHIueCA9IGZuYyh2MS54LCB2Mik7IFwKKyAgICByLnkgPSBmbmModjEueSwgdjIpOyBcCisgICAgci56ID0gZm5jKHYxLnosIHYyKTsgXAorICAgIHJldHVybiByOyBcCit9IFwKK3N0YXRpYyBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZm5jKGZsb2F0NCB2MSwgZmxvYXQgdjIpIHsgXAorICAgIGZsb2F0NCByOyBcCisgICAgci54ID0gZm5jKHYxLngsIHYyKTsgXAorICAgIHIueSA9IGZuYyh2MS55LCB2Mik7IFwKKyAgICByLnogPSBmbmModjEueiwgdjIpOyBcCisgICAgci53ID0gZm5jKHYxLncsIHYyKTsgXAorICAgIHJldHVybiByOyBcCit9CisKKworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGFjb3MoZmxvYXQpOworREVGX0ZVTkNfMShhY29zKQorCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgYWNvc2goZmxvYXQpOworREVGX0ZVTkNfMShhY29zaCkKKworc3RhdGljIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGFjb3NwaShmbG9hdCB2KSB7CisgICAgcmV0dXJuIGFjb3ModikgLyBNX1BJOworfQorREVGX0ZVTkNfMShhY29zcGkpCisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhc2luKGZsb2F0KTsKK0RFRl9GVU5DXzEoYXNpbikKKworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGFzaW5oKGZsb2F0KTsKK0RFRl9GVU5DXzEoYXNpbmgpCisKK3N0YXRpYyBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhc2lucGkoZmxvYXQgdikgeworICAgIHJldHVybiBhc2luKHYpIC8gTV9QSTsKK30KK0RFRl9GVU5DXzEoYXNpbnBpKQorCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgYXRhbihmbG9hdCk7CitERUZfRlVOQ18xKGF0YW4pCisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhdGFuMihmbG9hdCwgZmxvYXQpOworREVGX0ZVTkNfMihhdGFuMikKKworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGF0YW5oKGZsb2F0KTsKK0RFRl9GVU5DXzEoYXRhbmgpCisKK3N0YXRpYyBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhdGFucGkoZmxvYXQgdikgeworICAgIHJldHVybiBhdGFuKHYpIC8gTV9QSTsKK30KK0RFRl9GVU5DXzEoYXRhbnBpKQorCitzdGF0aWMgZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgYXRhbjJwaShmbG9hdCB5LCBmbG9hdCB4KSB7CisgICAgcmV0dXJuIGF0YW4yKHksIHgpIC8gTV9QSTsKK30KK0RFRl9GVU5DXzIoYXRhbjJwaSkKKworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNicnQoZmxvYXQpOworREVGX0ZVTkNfMShjYnJ0KQorCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY2VpbChmbG9hdCk7CitERUZfRlVOQ18xKGNlaWwpCisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjb3B5c2lnbihmbG9hdCwgZmxvYXQpOworREVGX0ZVTkNfMihjb3B5c2lnbikKKworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNvcyhmbG9hdCk7CitERUZfRlVOQ18xKGNvcykKKworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNvc2goZmxvYXQpOworREVGX0ZVTkNfMShjb3NoKQorCitzdGF0aWMgZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY29zcGkoZmxvYXQgdikgeworICAgIHJldHVybiBjb3ModiAqIE1fUEkpOworfQorREVGX0ZVTkNfMShjb3NwaSkKKworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGVyZmMoZmxvYXQpOworREVGX0ZVTkNfMShlcmZjKQorCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZXJmKGZsb2F0KTsKK0RFRl9GVU5DXzEoZXJmKQorCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZXhwKGZsb2F0KTsKK0RFRl9GVU5DXzEoZXhwKQorCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZXhwMihmbG9hdCk7CitERUZfRlVOQ18xKGV4cDIpCisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBwb3coZmxvYXQsIGZsb2F0KTsKK3N0YXRpYyBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBleHAxMChmbG9hdCB2KSB7CisgICAgcmV0dXJuIHBvdygxMC5mLCB2KTsKK30KK0RFRl9GVU5DXzEoZXhwMTApCisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBleHBtMShmbG9hdCk7CitERUZfRlVOQ18xKGV4cG0xKQorCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZmFicyhmbG9hdCk7CitERUZfRlVOQ18xKGZhYnMpCisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmZGltKGZsb2F0LCBmbG9hdCk7CitERUZfRlVOQ18yKGZkaW0pCisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbG9vcihmbG9hdCk7CitERUZfRlVOQ18xKGZsb29yKQorCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZm1hKGZsb2F0LCBmbG9hdCwgZmxvYXQpOworZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbWEoZmxvYXQyLCBmbG9hdDIsIGZsb2F0Mik7CitleHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZtYShmbG9hdDMsIGZsb2F0MywgZmxvYXQzKTsKK2V4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZm1hKGZsb2F0NCwgZmxvYXQ0LCBmbG9hdDQpOworCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZm1heChmbG9hdCwgZmxvYXQpOworREVGX0ZVTkNfMihmbWF4KTsKK0RFRl9GVU5DXzJGKGZtYXgpOworCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZm1pbihmbG9hdCwgZmxvYXQpOworREVGX0ZVTkNfMihmbWluKTsKK0RFRl9GVU5DXzJGKGZtaW4pOworCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZm1vZChmbG9hdCwgZmxvYXQpOworREVGX0ZVTkNfMihmbW9kKQorCitzdGF0aWMgZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZnJhY3QoZmxvYXQgdiwgZmxvYXQgKmlwdHIpIHsKKyAgICBpbnQgaSA9IChpbnQpZmxvb3Iodik7CisgICAgaXB0clswXSA9IGk7CisgICAgcmV0dXJuIGZtaW4odiAtIGksIDB4MS5mZmZmZmVwLTFmKTsKK30KK3N0YXRpYyBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZnJhY3QoZmxvYXQyIHYsIGZsb2F0MiAqaXB0cikgeworICAgIGZsb2F0IHRbMl07CisgICAgZmxvYXQyIHI7CisgICAgci54ID0gZnJhY3Qodi54LCAmdFswXSk7CisgICAgci55ID0gZnJhY3Qodi55LCAmdFsxXSk7CisgICAgaXB0clswXSA9IHRbMF07CisgICAgaXB0clsxXSA9IHRbMV07CisgICAgcmV0dXJuIHI7Cit9CitzdGF0aWMgZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZyYWN0KGZsb2F0MyB2LCBmbG9hdDMgKmlwdHIpIHsKKyAgICBmbG9hdCB0WzNdOworICAgIGZsb2F0MyByOworICAgIHIueCA9IGZyYWN0KHYueCwgJnRbMF0pOworICAgIHIueSA9IGZyYWN0KHYueSwgJnRbMV0pOworICAgIHIueiA9IGZyYWN0KHYueiwgJnRbMl0pOworICAgIGlwdHJbMF0gPSB0WzBdOworICAgIGlwdHJbMV0gPSB0WzFdOworICAgIGlwdHJbMl0gPSB0WzJdOworICAgIHJldHVybiByOworfQorc3RhdGljIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmcmFjdChmbG9hdDQgdiwgZmxvYXQ0ICppcHRyKSB7CisgICAgZmxvYXQgdFs0XTsKKyAgICBmbG9hdDQgcjsKKyAgICByLnggPSBmcmFjdCh2LngsICZ0WzBdKTsKKyAgICByLnkgPSBmcmFjdCh2LnksICZ0WzFdKTsKKyAgICByLnogPSBmcmFjdCh2LnosICZ0WzJdKTsKKyAgICByLncgPSBmcmFjdCh2LncsICZ0WzNdKTsKKyAgICBpcHRyWzBdID0gdFswXTsKKyAgICBpcHRyWzFdID0gdFsxXTsKKyAgICBpcHRyWzJdID0gdFsyXTsKKyAgICBpcHRyWzNdID0gdFszXTsKKyAgICByZXR1cm4gcjsKK30KKworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZyZXhwKGZsb2F0LCBmbG9hdCAqKTsKK2V4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZnJleHAoZmxvYXQyLCBmbG9hdDIgKik7CitleHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZyZXhwKGZsb2F0MywgZmxvYXQzICopOworZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmcmV4cChmbG9hdDQsIGZsb2F0NCAqKTsKKworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGh5cG90KGZsb2F0LCBmbG9hdCk7CitERUZfRlVOQ18yKGh5cG90KQorCitleHRlcm4gaW50IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGlsb2diKGZsb2F0KTsKK0RFRl9GVU5DXzEoaWxvZ2IpCisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBsZGV4cChmbG9hdCwgaW50KTsKK2V4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbGRleHAoZmxvYXQyLCBpbnQyKTsKK2V4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbGRleHAoZmxvYXQzLCBpbnQzKTsKK2V4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbGRleHAoZmxvYXQ0LCBpbnQ0KTsKK2V4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbGRleHAoZmxvYXQyLCBpbnQpOworZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBsZGV4cChmbG9hdDMsIGludCk7CitleHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGxkZXhwKGZsb2F0NCwgaW50KTsKKworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGxnYW1tYShmbG9hdCk7CitERUZfRlVOQ18xKGxnYW1tYSkKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBsZ2FtbWEoZmxvYXQsIGZsb2F0ICopOworZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBsZ2FtbWEoZmxvYXQyLCBmbG9hdDIgKik7CitleHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGxnYW1tYShmbG9hdDMsIGZsb2F0MyAqKTsKK2V4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbGdhbW1hKGZsb2F0NCwgZmxvYXQ0ICopOworCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbG9nKGZsb2F0KTsKK0RFRl9GVU5DXzEobG9nKQorCisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBsb2cxMChmbG9hdCk7CitERUZfRlVOQ18xKGxvZzEwKQorCitzdGF0aWMgZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbG9nMihmbG9hdCB2KSB7CisgICAgcmV0dXJuIGxvZzEwKHYpIC8gbG9nMTAoMi5mKTsKK30KK0RFRl9GVU5DXzEobG9nMikKKworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGxvZzFwKGZsb2F0KTsKK0RFRl9GVU5DXzEobG9nMXApCisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBsb2diKGZsb2F0KTsKK0RFRl9GVU5DXzEobG9nYikKKworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1hZChmbG9hdCwgZmxvYXQsIGZsb2F0KTsKK2V4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWFkKGZsb2F0MiwgZmxvYXQyLCBmbG9hdDIpOworZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtYWQoZmxvYXQzLCBmbG9hdDMsIGZsb2F0Myk7CitleHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1hZChmbG9hdDQsIGZsb2F0NCwgZmxvYXQ0KTsKKworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1vZGYoZmxvYXQsIGZsb2F0ICopOworZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtb2RmKGZsb2F0MiwgZmxvYXQyICopOworZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtb2RmKGZsb2F0MywgZmxvYXQzICopOworZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtb2RmKGZsb2F0NCwgZmxvYXQ0ICopOworCisvL2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBuYW4odWludCk7CisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBuZXh0YWZ0ZXIoZmxvYXQsIGZsb2F0KTsKK0RFRl9GVU5DXzIobmV4dGFmdGVyKQorCitERUZfRlVOQ18yKHBvdykKKworc3RhdGljIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHBvd24oZmxvYXQgdiwgaW50IHApIHsKKyAgICByZXR1cm4gcG93KHYsIChmbG9hdClwKTsKK30KK3N0YXRpYyBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcG93bihmbG9hdDIgdiwgaW50MiBwKSB7CisgICAgcmV0dXJuIHBvdyh2LCAoZmxvYXQyKXApOworfQorc3RhdGljIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBwb3duKGZsb2F0MyB2LCBpbnQzIHApIHsKKyAgICByZXR1cm4gcG93KHYsIChmbG9hdDMpcCk7Cit9CitzdGF0aWMgZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHBvd24oZmxvYXQ0IHYsIGludDQgcCkgeworICAgIHJldHVybiBwb3codiwgKGZsb2F0NClwKTsKK30KKworc3RhdGljIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHBvd3IoZmxvYXQgdiwgZmxvYXQgcCkgeworICAgIHJldHVybiBwb3codiwgcCk7Cit9CitzdGF0aWMgZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHBvd3IoZmxvYXQyIHYsIGZsb2F0MiBwKSB7CisgICAgcmV0dXJuIHBvdyh2LCBwKTsKK30KK3N0YXRpYyBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcG93cihmbG9hdDMgdiwgZmxvYXQzIHApIHsKKyAgICByZXR1cm4gcG93KHYsIHApOworfQorc3RhdGljIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBwb3dyKGZsb2F0NCB2LCBmbG9hdDQgcCkgeworICAgIHJldHVybiBwb3codiwgcCk7Cit9CisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSByZW1haW5kZXIoZmxvYXQsIGZsb2F0KTsKK0RFRl9GVU5DXzIocmVtYWluZGVyKQorCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcmVtcXVvKGZsb2F0LCBmbG9hdCwgZmxvYXQgKik7CitleHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHJlbXF1byhmbG9hdDIsIGZsb2F0MiwgZmxvYXQyICopOworZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSByZW1xdW8oZmxvYXQzLCBmbG9hdDMsIGZsb2F0MyAqKTsKK2V4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcmVtcXVvKGZsb2F0NCwgZmxvYXQ0LCBmbG9hdDQgKik7CisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSByaW50KGZsb2F0KTsKK0RFRl9GVU5DXzEocmludCkKKworc3RhdGljIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHJvb3RuKGZsb2F0IHYsIGludCByKSB7CisgICAgcmV0dXJuIHBvdyh2LCAxLmYgLyByKTsKK30KK3N0YXRpYyBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcm9vdG4oZmxvYXQyIHYsIGludDIgcikgeworICAgIGZsb2F0MiB0ID0gezEuZiAvIHIueCwgMS5mIC8gci55fTsKKyAgICByZXR1cm4gcG93KHYsIHQpOworfQorc3RhdGljIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSByb290bihmbG9hdDMgdiwgaW50MyByKSB7CisgICAgZmxvYXQzIHQgPSB7MS5mIC8gci54LCAxLmYgLyByLnksIDEuZiAvIHIuen07CisgICAgcmV0dXJuIHBvdyh2LCB0KTsKK30KK3N0YXRpYyBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcm9vdG4oZmxvYXQ0IHYsIGludDQgcikgeworICAgIGZsb2F0NCB0ID0gezEuZiAvIHIueCwgMS5mIC8gci55LCAxLmYgLyByLnosIDEuZiAvIHIud307CisgICAgcmV0dXJuIHBvdyh2LCB0KTsKK30KKworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHJvdW5kKGZsb2F0KTsKK0RFRl9GVU5DXzEocm91bmQpCisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBzcXJ0KGZsb2F0KTsKKy8qc3RhdGljIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHJzcXJ0KGZsb2F0IHYpIHsKKyAgICByZXR1cm4gMS5mIC8gc3FydCh2KTsKK30KK0RFRl9GVU5DXzEocnNxcnQpKi8KKworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHNpbihmbG9hdCk7CitERUZfRlVOQ18xKHNpbikKKworc3RhdGljIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHNpbmNvcyhmbG9hdCB2LCBmbG9hdCAqY29zcHRyKSB7CisgICAgKmNvc3B0ciA9IGNvcyh2KTsKKyAgICByZXR1cm4gc2luKHYpOworfQorc3RhdGljIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBzaW5jb3MoZmxvYXQyIHYsIGZsb2F0MiAqY29zcHRyKSB7CisgICAgKmNvc3B0ciA9IGNvcyh2KTsKKyAgICByZXR1cm4gc2luKHYpOworfQorc3RhdGljIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBzaW5jb3MoZmxvYXQzIHYsIGZsb2F0MyAqY29zcHRyKSB7CisgICAgKmNvc3B0ciA9IGNvcyh2KTsKKyAgICByZXR1cm4gc2luKHYpOworfQorc3RhdGljIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBzaW5jb3MoZmxvYXQ0IHYsIGZsb2F0NCAqY29zcHRyKSB7CisgICAgKmNvc3B0ciA9IGNvcyh2KTsKKyAgICByZXR1cm4gc2luKHYpOworfQorCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgc2luaChmbG9hdCk7CitERUZfRlVOQ18xKHNpbmgpCisKK3N0YXRpYyBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBzaW5waShmbG9hdCB2KSB7CisgICAgcmV0dXJuIHNpbih2ICogTV9QSSk7Cit9CitERUZfRlVOQ18xKHNpbnBpKQorCitERUZfRlVOQ18xKHNxcnQpCisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSB0YW4oZmxvYXQpOworREVGX0ZVTkNfMSh0YW4pCisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSB0YW5oKGZsb2F0KTsKK0RFRl9GVU5DXzEodGFuaCkKKworc3RhdGljIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHRhbnBpKGZsb2F0IHYpIHsKKyAgICByZXR1cm4gdGFuKHYgKiBNX1BJKTsKK30KK0RFRl9GVU5DXzEodGFucGkpCisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSB0Z2FtbWEoZmxvYXQpOworREVGX0ZVTkNfMSh0Z2FtbWEpCisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSB0cnVuYyhmbG9hdCk7CitERUZfRlVOQ18xKHRydW5jKQorCisvLyBJbnQgb3BzIChwYXJ0aWFsKSwgNi4xMS4zCitleHRlcm4gdWludCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhYnMoaW50KTsKK2V4dGVybiB1c2hvcnQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgYWJzKHNob3J0KTsKK2V4dGVybiB1Y2hhciBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhYnMoY2hhcik7CisKK2V4dGVybiB1aW50IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNseih1aW50KTsKK2V4dGVybiBpbnQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY2x6KGludCk7CitleHRlcm4gdXNob3J0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNseih1c2hvcnQpOworZXh0ZXJuIHNob3J0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNseihzaG9ydCk7CitleHRlcm4gdWNoYXIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY2x6KHVjaGFyKTsKK2V4dGVybiBjaGFyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNseihjaGFyKTsKKworc3RhdGljIHVpbnQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWluKHVpbnQgdjEsIHVpbnQgdjIpIHsKKyAgICByZXR1cm4gdjEgPCB2MiA/IHYxIDogdjI7Cit9CitzdGF0aWMgaW50IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1pbihpbnQgdjEsIGludCB2MikgeworICAgIHJldHVybiB2MSA8IHYyID8gdjEgOiB2MjsKK30KK3N0YXRpYyB1c2hvcnQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWluKHVzaG9ydCB2MSwgdXNob3J0IHYyKSB7CisgICAgcmV0dXJuIHYxIDwgdjIgPyB2MSA6IHYyOworfQorc3RhdGljIHNob3J0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1pbihzaG9ydCB2MSwgc2hvcnQgdjIpIHsKKyAgICByZXR1cm4gdjEgPCB2MiA/IHYxIDogdjI7Cit9CitzdGF0aWMgdWNoYXIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWluKHVjaGFyIHYxLCB1Y2hhciB2MikgeworICAgIHJldHVybiB2MSA8IHYyID8gdjEgOiB2MjsKK30KK3N0YXRpYyBjaGFyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1pbihjaGFyIHYxLCBjaGFyIHYyKSB7CisgICAgcmV0dXJuIHYxIDwgdjIgPyB2MSA6IHYyOworfQorCitzdGF0aWMgdWludCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtYXgodWludCB2MSwgdWludCB2MikgeworICAgIHJldHVybiB2MSA+IHYyID8gdjEgOiB2MjsKK30KK3N0YXRpYyBpbnQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWF4KGludCB2MSwgaW50IHYyKSB7CisgICAgcmV0dXJuIHYxID4gdjIgPyB2MSA6IHYyOworfQorc3RhdGljIHVzaG9ydCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtYXgodXNob3J0IHYxLCB1c2hvcnQgdjIpIHsKKyAgICByZXR1cm4gdjEgPiB2MiA/IHYxIDogdjI7Cit9CitzdGF0aWMgc2hvcnQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWF4KHNob3J0IHYxLCBzaG9ydCB2MikgeworICAgIHJldHVybiB2MSA+IHYyID8gdjEgOiB2MjsKK30KK3N0YXRpYyB1Y2hhciBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtYXgodWNoYXIgdjEsIHVjaGFyIHYyKSB7CisgICAgcmV0dXJuIHYxID4gdjIgPyB2MSA6IHYyOworfQorc3RhdGljIGNoYXIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWF4KGNoYXIgdjEsIGNoYXIgdjIpIHsKKyAgICByZXR1cm4gdjEgPiB2MiA/IHYxIDogdjI7Cit9CisKKworCisKKy8vIDYuMTEuNAorCitzdGF0aWMgZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY2xhbXAoZmxvYXQgYW1vdW50LCBmbG9hdCBsb3csIGZsb2F0IGhpZ2gpIHsKKyAgICByZXR1cm4gYW1vdW50IDwgbG93ID8gbG93IDogKGFtb3VudCA+IGhpZ2ggPyBoaWdoIDogYW1vdW50KTsKK30KK3N0YXRpYyBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY2xhbXAoZmxvYXQyIGFtb3VudCwgZmxvYXQyIGxvdywgZmxvYXQyIGhpZ2gpIHsKKyAgICBmbG9hdDIgcjsKKyAgICByLnggPSBhbW91bnQueCA8IGxvdy54ID8gbG93LnggOiAoYW1vdW50LnggPiBoaWdoLnggPyBoaWdoLnggOiBhbW91bnQueCk7CisgICAgci55ID0gYW1vdW50LnkgPCBsb3cueSA/IGxvdy55IDogKGFtb3VudC55ID4gaGlnaC55ID8gaGlnaC55IDogYW1vdW50LnkpOworICAgIHJldHVybiByOworfQorc3RhdGljIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjbGFtcChmbG9hdDMgYW1vdW50LCBmbG9hdDMgbG93LCBmbG9hdDMgaGlnaCkgeworICAgIGZsb2F0MyByOworICAgIHIueCA9IGFtb3VudC54IDwgbG93LnggPyBsb3cueCA6IChhbW91bnQueCA+IGhpZ2gueCA/IGhpZ2gueCA6IGFtb3VudC54KTsKKyAgICByLnkgPSBhbW91bnQueSA8IGxvdy55ID8gbG93LnkgOiAoYW1vdW50LnkgPiBoaWdoLnkgPyBoaWdoLnkgOiBhbW91bnQueSk7CisgICAgci56ID0gYW1vdW50LnogPCBsb3cueiA/IGxvdy56IDogKGFtb3VudC56ID4gaGlnaC56ID8gaGlnaC56IDogYW1vdW50LnopOworICAgIHJldHVybiByOworfQorc3RhdGljIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjbGFtcChmbG9hdDQgYW1vdW50LCBmbG9hdDQgbG93LCBmbG9hdDQgaGlnaCkgeworICAgIGZsb2F0NCByOworICAgIHIueCA9IGFtb3VudC54IDwgbG93LnggPyBsb3cueCA6IChhbW91bnQueCA+IGhpZ2gueCA/IGhpZ2gueCA6IGFtb3VudC54KTsKKyAgICByLnkgPSBhbW91bnQueSA8IGxvdy55ID8gbG93LnkgOiAoYW1vdW50LnkgPiBoaWdoLnkgPyBoaWdoLnkgOiBhbW91bnQueSk7CisgICAgci56ID0gYW1vdW50LnogPCBsb3cueiA/IGxvdy56IDogKGFtb3VudC56ID4gaGlnaC56ID8gaGlnaC56IDogYW1vdW50LnopOworICAgIHIudyA9IGFtb3VudC53IDwgbG93LncgPyBsb3cudyA6IChhbW91bnQudyA+IGhpZ2gudyA/IGhpZ2gudyA6IGFtb3VudC53KTsKKyAgICByZXR1cm4gcjsKK30KK3N0YXRpYyBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY2xhbXAoZmxvYXQyIGFtb3VudCwgZmxvYXQgbG93LCBmbG9hdCBoaWdoKSB7CisgICAgZmxvYXQyIHI7CisgICAgci54ID0gYW1vdW50LnggPCBsb3cgPyBsb3cgOiAoYW1vdW50LnggPiBoaWdoID8gaGlnaCA6IGFtb3VudC54KTsKKyAgICByLnkgPSBhbW91bnQueSA8IGxvdyA/IGxvdyA6IChhbW91bnQueSA+IGhpZ2ggPyBoaWdoIDogYW1vdW50LnkpOworICAgIHJldHVybiByOworfQorc3RhdGljIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjbGFtcChmbG9hdDMgYW1vdW50LCBmbG9hdCBsb3csIGZsb2F0IGhpZ2gpIHsKKyAgICBmbG9hdDMgcjsKKyAgICByLnggPSBhbW91bnQueCA8IGxvdyA/IGxvdyA6IChhbW91bnQueCA+IGhpZ2ggPyBoaWdoIDogYW1vdW50LngpOworICAgIHIueSA9IGFtb3VudC55IDwgbG93ID8gbG93IDogKGFtb3VudC55ID4gaGlnaCA/IGhpZ2ggOiBhbW91bnQueSk7CisgICAgci56ID0gYW1vdW50LnogPCBsb3cgPyBsb3cgOiAoYW1vdW50LnogPiBoaWdoID8gaGlnaCA6IGFtb3VudC56KTsKKyAgICByZXR1cm4gcjsKK30KK3N0YXRpYyBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY2xhbXAoZmxvYXQ0IGFtb3VudCwgZmxvYXQgbG93LCBmbG9hdCBoaWdoKSB7CisgICAgZmxvYXQ0IHI7CisgICAgci54ID0gYW1vdW50LnggPCBsb3cgPyBsb3cgOiAoYW1vdW50LnggPiBoaWdoID8gaGlnaCA6IGFtb3VudC54KTsKKyAgICByLnkgPSBhbW91bnQueSA8IGxvdyA/IGxvdyA6IChhbW91bnQueSA+IGhpZ2ggPyBoaWdoIDogYW1vdW50LnkpOworICAgIHIueiA9IGFtb3VudC56IDwgbG93ID8gbG93IDogKGFtb3VudC56ID4gaGlnaCA/IGhpZ2ggOiBhbW91bnQueik7CisgICAgci53ID0gYW1vdW50LncgPCBsb3cgPyBsb3cgOiAoYW1vdW50LncgPiBoaWdoID8gaGlnaCA6IGFtb3VudC53KTsKKyAgICByZXR1cm4gcjsKK30KKworc3RhdGljIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGRlZ3JlZXMoZmxvYXQgcmFkaWFucykgeworICAgIHJldHVybiByYWRpYW5zICogKDE4MC5mIC8gTV9QSSk7Cit9CitERUZfRlVOQ18xKGRlZ3JlZXMpCisKK3N0YXRpYyBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtYXgoZmxvYXQgdjEsIGZsb2F0IHYyKSB7CisgICAgcmV0dXJuIHYxID4gdjIgPyB2MSA6IHYyOworfQorc3RhdGljIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtYXgoZmxvYXQyIHYxLCBmbG9hdDIgdjIpIHsKKyAgICBmbG9hdDIgcjsKKyAgICByLnggPSB2MS54ID4gdjIueCA/IHYxLnggOiB2Mi54OworICAgIHIueSA9IHYxLnkgPiB2Mi55ID8gdjEueSA6IHYyLnk7CisgICAgcmV0dXJuIHI7Cit9CitzdGF0aWMgZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1heChmbG9hdDMgdjEsIGZsb2F0MyB2MikgeworICAgIGZsb2F0MyByOworICAgIHIueCA9IHYxLnggPiB2Mi54ID8gdjEueCA6IHYyLng7CisgICAgci55ID0gdjEueSA+IHYyLnkgPyB2MS55IDogdjIueTsKKyAgICByLnogPSB2MS56ID4gdjIueiA/IHYxLnogOiB2Mi56OworICAgIHJldHVybiByOworfQorc3RhdGljIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtYXgoZmxvYXQ0IHYxLCBmbG9hdDQgdjIpIHsKKyAgICBmbG9hdDQgcjsKKyAgICByLnggPSB2MS54ID4gdjIueCA/IHYxLnggOiB2Mi54OworICAgIHIueSA9IHYxLnkgPiB2Mi55ID8gdjEueSA6IHYyLnk7CisgICAgci56ID0gdjEueiA+IHYyLnogPyB2MS56IDogdjIuejsKKyAgICByLncgPSB2MS53ID4gdjIudyA/IHYxLncgOiB2Mi53OworICAgIHJldHVybiByOworfQorc3RhdGljIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtYXgoZmxvYXQyIHYxLCBmbG9hdCB2MikgeworICAgIGZsb2F0MiByOworICAgIHIueCA9IHYxLnggPiB2MiA/IHYxLnggOiB2MjsKKyAgICByLnkgPSB2MS55ID4gdjIgPyB2MS55IDogdjI7CisgICAgcmV0dXJuIHI7Cit9CitzdGF0aWMgZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1heChmbG9hdDMgdjEsIGZsb2F0IHYyKSB7CisgICAgZmxvYXQzIHI7CisgICAgci54ID0gdjEueCA+IHYyID8gdjEueCA6IHYyOworICAgIHIueSA9IHYxLnkgPiB2MiA/IHYxLnkgOiB2MjsKKyAgICByLnogPSB2MS56ID4gdjIgPyB2MS56IDogdjI7CisgICAgcmV0dXJuIHI7Cit9CitzdGF0aWMgZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1heChmbG9hdDQgdjEsIGZsb2F0IHYyKSB7CisgICAgZmxvYXQ0IHI7CisgICAgci54ID0gdjEueCA+IHYyID8gdjEueCA6IHYyOworICAgIHIueSA9IHYxLnkgPiB2MiA/IHYxLnkgOiB2MjsKKyAgICByLnogPSB2MS56ID4gdjIgPyB2MS56IDogdjI7CisgICAgci53ID0gdjEudyA+IHYyID8gdjEudyA6IHYyOworICAgIHJldHVybiByOworfQorCitzdGF0aWMgZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWluKGZsb2F0IHYxLCBmbG9hdCB2MikgeworICAgIHJldHVybiB2MSA8IHYyID8gdjEgOiB2MjsKK30KK3N0YXRpYyBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWluKGZsb2F0MiB2MSwgZmxvYXQyIHYyKSB7CisgICAgZmxvYXQyIHI7CisgICAgci54ID0gdjEueCA8IHYyLnggPyB2MS54IDogdjIueDsKKyAgICByLnkgPSB2MS55IDwgdjIueSA/IHYxLnkgOiB2Mi55OworICAgIHJldHVybiByOworfQorc3RhdGljIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtaW4oZmxvYXQzIHYxLCBmbG9hdDMgdjIpIHsKKyAgICBmbG9hdDMgcjsKKyAgICByLnggPSB2MS54IDwgdjIueCA/IHYxLnggOiB2Mi54OworICAgIHIueSA9IHYxLnkgPCB2Mi55ID8gdjEueSA6IHYyLnk7CisgICAgci56ID0gdjEueiA8IHYyLnogPyB2MS56IDogdjIuejsKKyAgICByZXR1cm4gcjsKK30KK3N0YXRpYyBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWluKGZsb2F0NCB2MSwgZmxvYXQ0IHYyKSB7CisgICAgZmxvYXQ0IHI7CisgICAgci54ID0gdjEueCA8IHYyLnggPyB2MS54IDogdjIueDsKKyAgICByLnkgPSB2MS55IDwgdjIueSA/IHYxLnkgOiB2Mi55OworICAgIHIueiA9IHYxLnogPCB2Mi56ID8gdjEueiA6IHYyLno7CisgICAgci53ID0gdjEudyA8IHYyLncgPyB2MS53IDogdjIudzsKKyAgICByZXR1cm4gcjsKK30KK3N0YXRpYyBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWluKGZsb2F0MiB2MSwgZmxvYXQgdjIpIHsKKyAgICBmbG9hdDIgcjsKKyAgICByLnggPSB2MS54IDwgdjIgPyB2MS54IDogdjI7CisgICAgci55ID0gdjEueSA8IHYyID8gdjEueSA6IHYyOworICAgIHJldHVybiByOworfQorc3RhdGljIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtaW4oZmxvYXQzIHYxLCBmbG9hdCB2MikgeworICAgIGZsb2F0MyByOworICAgIHIueCA9IHYxLnggPCB2MiA/IHYxLnggOiB2MjsKKyAgICByLnkgPSB2MS55IDwgdjIgPyB2MS55IDogdjI7CisgICAgci56ID0gdjEueiA8IHYyID8gdjEueiA6IHYyOworICAgIHJldHVybiByOworfQorc3RhdGljIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtaW4oZmxvYXQ0IHYxLCBmbG9hdCB2MikgeworICAgIGZsb2F0NCByOworICAgIHIueCA9IHYxLnggPCB2MiA/IHYxLnggOiB2MjsKKyAgICByLnkgPSB2MS55IDwgdjIgPyB2MS55IDogdjI7CisgICAgci56ID0gdjEueiA8IHYyID8gdjEueiA6IHYyOworICAgIHIudyA9IHYxLncgPCB2MiA/IHYxLncgOiB2MjsKKyAgICByZXR1cm4gcjsKK30KKworc3RhdGljIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1peChmbG9hdCBzdGFydCwgZmxvYXQgc3RvcCwgZmxvYXQgYW1vdW50KSB7CisgICAgcmV0dXJuIHN0YXJ0ICsgKHN0b3AgLSBzdGFydCkgKiBhbW91bnQ7Cit9CitzdGF0aWMgZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1peChmbG9hdDIgc3RhcnQsIGZsb2F0MiBzdG9wLCBmbG9hdDIgYW1vdW50KSB7CisgICAgcmV0dXJuIHN0YXJ0ICsgKHN0b3AgLSBzdGFydCkgKiBhbW91bnQ7Cit9CitzdGF0aWMgZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1peChmbG9hdDMgc3RhcnQsIGZsb2F0MyBzdG9wLCBmbG9hdDMgYW1vdW50KSB7CisgICAgcmV0dXJuIHN0YXJ0ICsgKHN0b3AgLSBzdGFydCkgKiBhbW91bnQ7Cit9CitzdGF0aWMgZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1peChmbG9hdDQgc3RhcnQsIGZsb2F0NCBzdG9wLCBmbG9hdDQgYW1vdW50KSB7CisgICAgcmV0dXJuIHN0YXJ0ICsgKHN0b3AgLSBzdGFydCkgKiBhbW91bnQ7Cit9CitzdGF0aWMgZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1peChmbG9hdDIgc3RhcnQsIGZsb2F0MiBzdG9wLCBmbG9hdCBhbW91bnQpIHsKKyAgICByZXR1cm4gc3RhcnQgKyAoc3RvcCAtIHN0YXJ0KSAqIGFtb3VudDsKK30KK3N0YXRpYyBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWl4KGZsb2F0MyBzdGFydCwgZmxvYXQzIHN0b3AsIGZsb2F0IGFtb3VudCkgeworICAgIHJldHVybiBzdGFydCArIChzdG9wIC0gc3RhcnQpICogYW1vdW50OworfQorc3RhdGljIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtaXgoZmxvYXQ0IHN0YXJ0LCBmbG9hdDQgc3RvcCwgZmxvYXQgYW1vdW50KSB7CisgICAgcmV0dXJuIHN0YXJ0ICsgKHN0b3AgLSBzdGFydCkgKiBhbW91bnQ7Cit9CisKK3N0YXRpYyBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSByYWRpYW5zKGZsb2F0IGRlZ3JlZXMpIHsKKyAgICByZXR1cm4gZGVncmVlcyAqIChNX1BJIC8gMTgwLmYpOworfQorREVGX0ZVTkNfMShyYWRpYW5zKQorCitzdGF0aWMgZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgc3RlcChmbG9hdCBlZGdlLCBmbG9hdCB2KSB7CisgICAgcmV0dXJuICh2IDwgZWRnZSkgPyAwLmYgOiAxLmY7Cit9CitzdGF0aWMgZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHN0ZXAoZmxvYXQyIGVkZ2UsIGZsb2F0MiB2KSB7CisgICAgZmxvYXQyIHI7CisgICAgci54ID0gKHYueCA8IGVkZ2UueCkgPyAwLmYgOiAxLmY7CisgICAgci55ID0gKHYueSA8IGVkZ2UueSkgPyAwLmYgOiAxLmY7CisgICAgcmV0dXJuIHI7Cit9CitzdGF0aWMgZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHN0ZXAoZmxvYXQzIGVkZ2UsIGZsb2F0MyB2KSB7CisgICAgZmxvYXQzIHI7CisgICAgci54ID0gKHYueCA8IGVkZ2UueCkgPyAwLmYgOiAxLmY7CisgICAgci55ID0gKHYueSA8IGVkZ2UueSkgPyAwLmYgOiAxLmY7CisgICAgci56ID0gKHYueiA8IGVkZ2UueikgPyAwLmYgOiAxLmY7CisgICAgcmV0dXJuIHI7Cit9CitzdGF0aWMgZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHN0ZXAoZmxvYXQ0IGVkZ2UsIGZsb2F0NCB2KSB7CisgICAgZmxvYXQ0IHI7CisgICAgci54ID0gKHYueCA8IGVkZ2UueCkgPyAwLmYgOiAxLmY7CisgICAgci55ID0gKHYueSA8IGVkZ2UueSkgPyAwLmYgOiAxLmY7CisgICAgci56ID0gKHYueiA8IGVkZ2UueikgPyAwLmYgOiAxLmY7CisgICAgci53ID0gKHYudyA8IGVkZ2UudykgPyAwLmYgOiAxLmY7CisgICAgcmV0dXJuIHI7Cit9CitzdGF0aWMgZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHN0ZXAoZmxvYXQyIGVkZ2UsIGZsb2F0IHYpIHsKKyAgICBmbG9hdDIgcjsKKyAgICByLnggPSAodiA8IGVkZ2UueCkgPyAwLmYgOiAxLmY7CisgICAgci55ID0gKHYgPCBlZGdlLnkpID8gMC5mIDogMS5mOworICAgIHJldHVybiByOworfQorc3RhdGljIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBzdGVwKGZsb2F0MyBlZGdlLCBmbG9hdCB2KSB7CisgICAgZmxvYXQzIHI7CisgICAgci54ID0gKHYgPCBlZGdlLngpID8gMC5mIDogMS5mOworICAgIHIueSA9ICh2IDwgZWRnZS55KSA/IDAuZiA6IDEuZjsKKyAgICByLnogPSAodiA8IGVkZ2UueikgPyAwLmYgOiAxLmY7CisgICAgcmV0dXJuIHI7Cit9CitzdGF0aWMgZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHN0ZXAoZmxvYXQ0IGVkZ2UsIGZsb2F0IHYpIHsKKyAgICBmbG9hdDQgcjsKKyAgICByLnggPSAodiA8IGVkZ2UueCkgPyAwLmYgOiAxLmY7CisgICAgci55ID0gKHYgPCBlZGdlLnkpID8gMC5mIDogMS5mOworICAgIHIueiA9ICh2IDwgZWRnZS56KSA/IDAuZiA6IDEuZjsKKyAgICByLncgPSAodiA8IGVkZ2UudykgPyAwLmYgOiAxLmY7CisgICAgcmV0dXJuIHI7Cit9CisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBzbW9vdGhzdGVwKGZsb2F0LCBmbG9hdCwgZmxvYXQpOworZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBzbW9vdGhzdGVwKGZsb2F0MiwgZmxvYXQyLCBmbG9hdDIpOworZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBzbW9vdGhzdGVwKGZsb2F0MywgZmxvYXQzLCBmbG9hdDMpOworZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBzbW9vdGhzdGVwKGZsb2F0NCwgZmxvYXQ0LCBmbG9hdDQpOworZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBzbW9vdGhzdGVwKGZsb2F0LCBmbG9hdCwgZmxvYXQyKTsKK2V4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgc21vb3Roc3RlcChmbG9hdCwgZmxvYXQsIGZsb2F0Myk7CitleHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHNtb290aHN0ZXAoZmxvYXQsIGZsb2F0LCBmbG9hdDQpOworCitzdGF0aWMgZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgc2lnbihmbG9hdCB2KSB7CisgICAgaWYgKHYgPiAwKSByZXR1cm4gMS5mOworICAgIGlmICh2IDwgMCkgcmV0dXJuIC0xLmY7CisgICAgcmV0dXJuIHY7Cit9CitERUZfRlVOQ18xKHNpZ24pCisKKy8vIDYuMTEuNQorc3RhdGljIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjcm9zcyhmbG9hdDMgbGhzLCBmbG9hdDMgcmhzKSB7CisgICAgZmxvYXQzIHI7CisgICAgci54ID0gbGhzLnkgKiByaHMueiAgLSBsaHMueiAqIHJocy55OworICAgIHIueSA9IGxocy56ICogcmhzLnggIC0gbGhzLnggKiByaHMuejsKKyAgICByLnogPSBsaHMueCAqIHJocy55ICAtIGxocy55ICogcmhzLng7CisgICAgcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY3Jvc3MoZmxvYXQ0IGxocywgZmxvYXQ0IHJocykgeworICAgIGZsb2F0NCByOworICAgIHIueCA9IGxocy55ICogcmhzLnogIC0gbGhzLnogKiByaHMueTsKKyAgICByLnkgPSBsaHMueiAqIHJocy54ICAtIGxocy54ICogcmhzLno7CisgICAgci56ID0gbGhzLnggKiByaHMueSAgLSBsaHMueSAqIHJocy54OworICAgIHIudyA9IDAuZjsKKyAgICByZXR1cm4gcjsKK30KKworc3RhdGljIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGRvdChmbG9hdCBsaHMsIGZsb2F0IHJocykgeworICAgIHJldHVybiBsaHMgKiByaHM7Cit9CitzdGF0aWMgZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZG90KGZsb2F0MiBsaHMsIGZsb2F0MiByaHMpIHsKKyAgICByZXR1cm4gbGhzLngqcmhzLnggKyBsaHMueSpyaHMueTsKK30KK3N0YXRpYyBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBkb3QoZmxvYXQzIGxocywgZmxvYXQzIHJocykgeworICAgIHJldHVybiBsaHMueCpyaHMueCArIGxocy55KnJocy55ICsgbGhzLnoqcmhzLno7Cit9CitzdGF0aWMgZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZG90KGZsb2F0NCBsaHMsIGZsb2F0NCByaHMpIHsKKyAgICByZXR1cm4gbGhzLngqcmhzLnggKyBsaHMueSpyaHMueSArIGxocy56KnJocy56ICsgbGhzLncqcmhzLnc7Cit9CisKK3N0YXRpYyBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBsZW5ndGgoZmxvYXQgdikgeworICAgIHJldHVybiB2OworfQorc3RhdGljIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGxlbmd0aChmbG9hdDIgdikgeworICAgIHJldHVybiBzcXJ0KHYueCp2LnggKyB2Lnkqdi55KTsKK30KK3N0YXRpYyBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBsZW5ndGgoZmxvYXQzIHYpIHsKKyAgICByZXR1cm4gc3FydCh2Lngqdi54ICsgdi55KnYueSArIHYueip2LnopOworfQorc3RhdGljIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGxlbmd0aChmbG9hdDQgdikgeworICAgIHJldHVybiBzcXJ0KHYueCp2LnggKyB2Lnkqdi55ICsgdi56KnYueiArIHYudyp2LncpOworfQorCitzdGF0aWMgZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZGlzdGFuY2UoZmxvYXQgbGhzLCBmbG9hdCByaHMpIHsKKyAgICByZXR1cm4gbGVuZ3RoKGxocyAtIHJocyk7Cit9CitzdGF0aWMgZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZGlzdGFuY2UoZmxvYXQyIGxocywgZmxvYXQyIHJocykgeworICAgIHJldHVybiBsZW5ndGgobGhzIC0gcmhzKTsKK30KK3N0YXRpYyBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBkaXN0YW5jZShmbG9hdDMgbGhzLCBmbG9hdDMgcmhzKSB7CisgICAgcmV0dXJuIGxlbmd0aChsaHMgLSByaHMpOworfQorc3RhdGljIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGRpc3RhbmNlKGZsb2F0NCBsaHMsIGZsb2F0NCByaHMpIHsKKyAgICByZXR1cm4gbGVuZ3RoKGxocyAtIHJocyk7Cit9CisKK3N0YXRpYyBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBub3JtYWxpemUoZmxvYXQgdikgeworICAgIHJldHVybiAxLmY7Cit9CitzdGF0aWMgZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG5vcm1hbGl6ZShmbG9hdDIgdikgeworICAgIHJldHVybiB2IC8gbGVuZ3RoKHYpOworfQorc3RhdGljIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBub3JtYWxpemUoZmxvYXQzIHYpIHsKKyAgICByZXR1cm4gdiAvIGxlbmd0aCh2KTsKK30KK3N0YXRpYyBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbm9ybWFsaXplKGZsb2F0NCB2KSB7CisgICAgcmV0dXJuIHYgLyBsZW5ndGgodik7Cit9CisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWJzL3JzL3NjcmlwdGMvcnNfY29yZS5yc2ggYi9saWJzL3JzL3NjcmlwdGMvcnNfY29yZS5yc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDYzNTUwZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvc2NyaXB0Yy9yc19jb3JlLnJzaApAQCAtMCwwICsxLDUwNSBAQAorI2lmbmRlZiBfX1JTX0NPUkVfUlNIX18KKyNkZWZpbmUgX19SU19DT1JFX1JTSF9fCisKKworc3RhdGljIHVjaGFyNCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSByc1BhY2tDb2xvclRvODg4OChmbG9hdCByLCBmbG9hdCBnLCBmbG9hdCBiKQoreworICAgIHVjaGFyNCBjOworICAgIGMueCA9ICh1Y2hhcikociAqIDI1NS5mKTsKKyAgICBjLnkgPSAodWNoYXIpKGcgKiAyNTUuZik7CisgICAgYy56ID0gKHVjaGFyKShiICogMjU1LmYpOworICAgIGMudyA9IDI1NTsKKyAgICByZXR1cm4gYzsKK30KKworc3RhdGljIHVjaGFyNCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSByc1BhY2tDb2xvclRvODg4OChmbG9hdCByLCBmbG9hdCBnLCBmbG9hdCBiLCBmbG9hdCBhKQoreworICAgIHVjaGFyNCBjOworICAgIGMueCA9ICh1Y2hhcikociAqIDI1NS5mKTsKKyAgICBjLnkgPSAodWNoYXIpKGcgKiAyNTUuZik7CisgICAgYy56ID0gKHVjaGFyKShiICogMjU1LmYpOworICAgIGMudyA9ICh1Y2hhcikoYSAqIDI1NS5mKTsKKyAgICByZXR1cm4gYzsKK30KKworc3RhdGljIHVjaGFyNCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSByc1BhY2tDb2xvclRvODg4OChmbG9hdDMgY29sb3IpCit7CisgICAgY29sb3IgKj0gMjU1LmY7CisgICAgdWNoYXI0IGMgPSB7Y29sb3IueCwgY29sb3IueSwgY29sb3IueiwgMjU1fTsKKyAgICByZXR1cm4gYzsKK30KKworc3RhdGljIHVjaGFyNCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSByc1BhY2tDb2xvclRvODg4OChmbG9hdDQgY29sb3IpCit7CisgICAgY29sb3IgKj0gMjU1LmY7CisgICAgdWNoYXI0IGMgPSB7Y29sb3IueCwgY29sb3IueSwgY29sb3IueiwgY29sb3Iud307CisgICAgcmV0dXJuIGM7Cit9CisKK3N0YXRpYyBmbG9hdDQgcnNVbnBhY2tDb2xvcjg4ODgodWNoYXI0IGMpCit7CisgICAgZmxvYXQ0IHJldCA9IChmbG9hdDQpMC4wMDM5MTU2ODYyNzQ1ZjsKKyAgICByZXQgKj0gY29udmVydF9mbG9hdDQoYyk7CisgICAgcmV0dXJuIHJldDsKK30KKworLy9leHRlcm4gdWNoYXI0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHJzUGFja0NvbG9yVG81NjUoZmxvYXQgciwgZmxvYXQgZywgZmxvYXQgYik7CisvL2V4dGVybiB1Y2hhcjQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcnNQYWNrQ29sb3JUbzU2NShmbG9hdDMpOworLy9leHRlcm4gZmxvYXQ0IHJzVW5wYWNrQ29sb3I1NjUodWNoYXI0KTsKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gTWF0cml4IG9wcworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKK3JzTWF0cml4U2V0KHJzX21hdHJpeDR4NCAqbSwgdWludDMyX3Qgcm93LCB1aW50MzJfdCBjb2wsIGZsb2F0IHYpIHsKKyAgICBtLT5tW3JvdyAqIDQgKyBjb2xdID0gdjsKK30KKworc3RhdGljIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCityc01hdHJpeEdldChjb25zdCByc19tYXRyaXg0eDQgKm0sIHVpbnQzMl90IHJvdywgdWludDMyX3QgY29sKSB7CisgICAgcmV0dXJuIG0tPm1bcm93ICogNCArIGNvbF07Cit9CisKK3N0YXRpYyB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCityc01hdHJpeFNldChyc19tYXRyaXgzeDMgKm0sIHVpbnQzMl90IHJvdywgdWludDMyX3QgY29sLCBmbG9hdCB2KSB7CisgICAgbS0+bVtyb3cgKiAzICsgY29sXSA9IHY7Cit9CisKK3N0YXRpYyBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorcnNNYXRyaXhHZXQoY29uc3QgcnNfbWF0cml4M3gzICptLCB1aW50MzJfdCByb3csIHVpbnQzMl90IGNvbCkgeworICAgIHJldHVybiBtLT5tW3JvdyAqIDMgKyBjb2xdOworfQorCitzdGF0aWMgdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorcnNNYXRyaXhTZXQocnNfbWF0cml4MngyICptLCB1aW50MzJfdCByb3csIHVpbnQzMl90IGNvbCwgZmxvYXQgdikgeworICAgIG0tPm1bcm93ICogMiArIGNvbF0gPSB2OworfQorCitzdGF0aWMgZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKK3JzTWF0cml4R2V0KGNvbnN0IHJzX21hdHJpeDJ4MiAqbSwgdWludDMyX3Qgcm93LCB1aW50MzJfdCBjb2wpIHsKKyAgICByZXR1cm4gbS0+bVtyb3cgKiAyICsgY29sXTsKK30KKworc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKK3JzTWF0cml4TG9hZElkZW50aXR5KHJzX21hdHJpeDR4NCAqbSkgeworICAgIG0tPm1bMF0gPSAxLmY7CisgICAgbS0+bVsxXSA9IDAuZjsKKyAgICBtLT5tWzJdID0gMC5mOworICAgIG0tPm1bM10gPSAwLmY7CisgICAgbS0+bVs0XSA9IDAuZjsKKyAgICBtLT5tWzVdID0gMS5mOworICAgIG0tPm1bNl0gPSAwLmY7CisgICAgbS0+bVs3XSA9IDAuZjsKKyAgICBtLT5tWzhdID0gMC5mOworICAgIG0tPm1bOV0gPSAwLmY7CisgICAgbS0+bVsxMF0gPSAxLmY7CisgICAgbS0+bVsxMV0gPSAwLmY7CisgICAgbS0+bVsxMl0gPSAwLmY7CisgICAgbS0+bVsxM10gPSAwLmY7CisgICAgbS0+bVsxNF0gPSAwLmY7CisgICAgbS0+bVsxNV0gPSAxLmY7Cit9CisKK3N0YXRpYyB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCityc01hdHJpeExvYWRJZGVudGl0eShyc19tYXRyaXgzeDMgKm0pIHsKKyAgICBtLT5tWzBdID0gMS5mOworICAgIG0tPm1bMV0gPSAwLmY7CisgICAgbS0+bVsyXSA9IDAuZjsKKyAgICBtLT5tWzNdID0gMC5mOworICAgIG0tPm1bNF0gPSAxLmY7CisgICAgbS0+bVs1XSA9IDAuZjsKKyAgICBtLT5tWzZdID0gMC5mOworICAgIG0tPm1bN10gPSAwLmY7CisgICAgbS0+bVs4XSA9IDEuZjsKK30KKworc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKK3JzTWF0cml4TG9hZElkZW50aXR5KHJzX21hdHJpeDJ4MiAqbSkgeworICAgIG0tPm1bMF0gPSAxLmY7CisgICAgbS0+bVsxXSA9IDAuZjsKKyAgICBtLT5tWzJdID0gMC5mOworICAgIG0tPm1bM10gPSAxLmY7Cit9CisKK3N0YXRpYyB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCityc01hdHJpeExvYWQocnNfbWF0cml4NHg0ICptLCBjb25zdCBmbG9hdCAqdikgeworICAgIG0tPm1bMF0gPSB2WzBdOworICAgIG0tPm1bMV0gPSB2WzFdOworICAgIG0tPm1bMl0gPSB2WzJdOworICAgIG0tPm1bM10gPSB2WzNdOworICAgIG0tPm1bNF0gPSB2WzRdOworICAgIG0tPm1bNV0gPSB2WzVdOworICAgIG0tPm1bNl0gPSB2WzZdOworICAgIG0tPm1bN10gPSB2WzddOworICAgIG0tPm1bOF0gPSB2WzhdOworICAgIG0tPm1bOV0gPSB2WzldOworICAgIG0tPm1bMTBdID0gdlsxMF07CisgICAgbS0+bVsxMV0gPSB2WzExXTsKKyAgICBtLT5tWzEyXSA9IHZbMTJdOworICAgIG0tPm1bMTNdID0gdlsxM107CisgICAgbS0+bVsxNF0gPSB2WzE0XTsKKyAgICBtLT5tWzE1XSA9IHZbMTVdOworfQorCitzdGF0aWMgdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorcnNNYXRyaXhMb2FkKHJzX21hdHJpeDN4MyAqbSwgY29uc3QgZmxvYXQgKnYpIHsKKyAgICBtLT5tWzBdID0gdlswXTsKKyAgICBtLT5tWzFdID0gdlsxXTsKKyAgICBtLT5tWzJdID0gdlsyXTsKKyAgICBtLT5tWzNdID0gdlszXTsKKyAgICBtLT5tWzRdID0gdls0XTsKKyAgICBtLT5tWzVdID0gdls1XTsKKyAgICBtLT5tWzZdID0gdls2XTsKKyAgICBtLT5tWzddID0gdls3XTsKKyAgICBtLT5tWzhdID0gdls4XTsKK30KKworc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKK3JzTWF0cml4TG9hZChyc19tYXRyaXgyeDIgKm0sIGNvbnN0IGZsb2F0ICp2KSB7CisgICAgbS0+bVswXSA9IHZbMF07CisgICAgbS0+bVsxXSA9IHZbMV07CisgICAgbS0+bVsyXSA9IHZbMl07CisgICAgbS0+bVszXSA9IHZbM107Cit9CisKK3N0YXRpYyB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCityc01hdHJpeExvYWQocnNfbWF0cml4NHg0ICptLCBjb25zdCByc19tYXRyaXg0eDQgKnYpIHsKKyAgICBtLT5tWzBdID0gdi0+bVswXTsKKyAgICBtLT5tWzFdID0gdi0+bVsxXTsKKyAgICBtLT5tWzJdID0gdi0+bVsyXTsKKyAgICBtLT5tWzNdID0gdi0+bVszXTsKKyAgICBtLT5tWzRdID0gdi0+bVs0XTsKKyAgICBtLT5tWzVdID0gdi0+bVs1XTsKKyAgICBtLT5tWzZdID0gdi0+bVs2XTsKKyAgICBtLT5tWzddID0gdi0+bVs3XTsKKyAgICBtLT5tWzhdID0gdi0+bVs4XTsKKyAgICBtLT5tWzldID0gdi0+bVs5XTsKKyAgICBtLT5tWzEwXSA9IHYtPm1bMTBdOworICAgIG0tPm1bMTFdID0gdi0+bVsxMV07CisgICAgbS0+bVsxMl0gPSB2LT5tWzEyXTsKKyAgICBtLT5tWzEzXSA9IHYtPm1bMTNdOworICAgIG0tPm1bMTRdID0gdi0+bVsxNF07CisgICAgbS0+bVsxNV0gPSB2LT5tWzE1XTsKK30KKworc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKK3JzTWF0cml4TG9hZChyc19tYXRyaXg0eDQgKm0sIGNvbnN0IHJzX21hdHJpeDN4MyAqdikgeworICAgIG0tPm1bMF0gPSB2LT5tWzBdOworICAgIG0tPm1bMV0gPSB2LT5tWzFdOworICAgIG0tPm1bMl0gPSB2LT5tWzJdOworICAgIG0tPm1bM10gPSAwLmY7CisgICAgbS0+bVs0XSA9IHYtPm1bM107CisgICAgbS0+bVs1XSA9IHYtPm1bNF07CisgICAgbS0+bVs2XSA9IHYtPm1bNV07CisgICAgbS0+bVs3XSA9IDAuZjsKKyAgICBtLT5tWzhdID0gdi0+bVs2XTsKKyAgICBtLT5tWzldID0gdi0+bVs3XTsKKyAgICBtLT5tWzEwXSA9IHYtPm1bOF07CisgICAgbS0+bVsxMV0gPSAwLmY7CisgICAgbS0+bVsxMl0gPSAwLmY7CisgICAgbS0+bVsxM10gPSAwLmY7CisgICAgbS0+bVsxNF0gPSAwLmY7CisgICAgbS0+bVsxNV0gPSAxLmY7Cit9CisKK3N0YXRpYyB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCityc01hdHJpeExvYWQocnNfbWF0cml4NHg0ICptLCBjb25zdCByc19tYXRyaXgyeDIgKnYpIHsKKyAgICBtLT5tWzBdID0gdi0+bVswXTsKKyAgICBtLT5tWzFdID0gdi0+bVsxXTsKKyAgICBtLT5tWzJdID0gMC5mOworICAgIG0tPm1bM10gPSAwLmY7CisgICAgbS0+bVs0XSA9IHYtPm1bM107CisgICAgbS0+bVs1XSA9IHYtPm1bNF07CisgICAgbS0+bVs2XSA9IDAuZjsKKyAgICBtLT5tWzddID0gMC5mOworICAgIG0tPm1bOF0gPSB2LT5tWzZdOworICAgIG0tPm1bOV0gPSB2LT5tWzddOworICAgIG0tPm1bMTBdID0gMS5mOworICAgIG0tPm1bMTFdID0gMC5mOworICAgIG0tPm1bMTJdID0gMC5mOworICAgIG0tPm1bMTNdID0gMC5mOworICAgIG0tPm1bMTRdID0gMC5mOworICAgIG0tPm1bMTVdID0gMS5mOworfQorCitzdGF0aWMgdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorcnNNYXRyaXhMb2FkKHJzX21hdHJpeDN4MyAqbSwgY29uc3QgcnNfbWF0cml4M3gzICp2KSB7CisgICAgbS0+bVswXSA9IHYtPm1bMF07CisgICAgbS0+bVsxXSA9IHYtPm1bMV07CisgICAgbS0+bVsyXSA9IHYtPm1bMl07CisgICAgbS0+bVszXSA9IHYtPm1bM107CisgICAgbS0+bVs0XSA9IHYtPm1bNF07CisgICAgbS0+bVs1XSA9IHYtPm1bNV07CisgICAgbS0+bVs2XSA9IHYtPm1bNl07CisgICAgbS0+bVs3XSA9IHYtPm1bN107CisgICAgbS0+bVs4XSA9IHYtPm1bOF07Cit9CisKK3N0YXRpYyB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCityc01hdHJpeExvYWQocnNfbWF0cml4MngyICptLCBjb25zdCByc19tYXRyaXgyeDIgKnYpIHsKKyAgICBtLT5tWzBdID0gdi0+bVswXTsKKyAgICBtLT5tWzFdID0gdi0+bVsxXTsKKyAgICBtLT5tWzJdID0gdi0+bVsyXTsKKyAgICBtLT5tWzNdID0gdi0+bVszXTsKK30KKworc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKK3JzTWF0cml4TG9hZFJvdGF0ZShyc19tYXRyaXg0eDQgKm0sIGZsb2F0IHJvdCwgZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeikgeworICAgIGZsb2F0IGMsIHM7CisgICAgbS0+bVszXSA9IDA7CisgICAgbS0+bVs3XSA9IDA7CisgICAgbS0+bVsxMV09IDA7CisgICAgbS0+bVsxMl09IDA7CisgICAgbS0+bVsxM109IDA7CisgICAgbS0+bVsxNF09IDA7CisgICAgbS0+bVsxNV09IDE7CisgICAgcm90ICo9IChmbG9hdCkoTV9QSSAvIDE4MC4wZik7CisgICAgYyA9IGNvcyhyb3QpOworICAgIHMgPSBzaW4ocm90KTsKKworICAgIGNvbnN0IGZsb2F0IGxlbiA9IHgqeCArIHkqeSArIHoqejsKKyAgICBpZiAoIShsZW4gIT0gMSkpIHsKKyAgICAgICAgY29uc3QgZmxvYXQgcmVjaXBMZW4gPSAxLmYgLyBzcXJ0KGxlbik7CisgICAgICAgIHggKj0gcmVjaXBMZW47CisgICAgICAgIHkgKj0gcmVjaXBMZW47CisgICAgICAgIHogKj0gcmVjaXBMZW47CisgICAgfQorICAgIGNvbnN0IGZsb2F0IG5jID0gMS4wZiAtIGM7CisgICAgY29uc3QgZmxvYXQgeHkgPSB4ICogeTsKKyAgICBjb25zdCBmbG9hdCB5eiA9IHkgKiB6OworICAgIGNvbnN0IGZsb2F0IHp4ID0geiAqIHg7CisgICAgY29uc3QgZmxvYXQgeHMgPSB4ICogczsKKyAgICBjb25zdCBmbG9hdCB5cyA9IHkgKiBzOworICAgIGNvbnN0IGZsb2F0IHpzID0geiAqIHM7CisgICAgbS0+bVsgMF0gPSB4KngqbmMgKyAgYzsKKyAgICBtLT5tWyA0XSA9ICB4eSpuYyAtIHpzOworICAgIG0tPm1bIDhdID0gIHp4Km5jICsgeXM7CisgICAgbS0+bVsgMV0gPSAgeHkqbmMgKyB6czsKKyAgICBtLT5tWyA1XSA9IHkqeSpuYyArICBjOworICAgIG0tPm1bIDldID0gIHl6Km5jIC0geHM7CisgICAgbS0+bVsgMl0gPSAgengqbmMgLSB5czsKKyAgICBtLT5tWyA2XSA9ICB5eipuYyArIHhzOworICAgIG0tPm1bMTBdID0geip6Km5jICsgIGM7Cit9CisKK3N0YXRpYyB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCityc01hdHJpeExvYWRTY2FsZShyc19tYXRyaXg0eDQgKm0sIGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHopIHsKKyAgICByc01hdHJpeExvYWRJZGVudGl0eShtKTsKKyAgICBtLT5tWzBdID0geDsKKyAgICBtLT5tWzVdID0geTsKKyAgICBtLT5tWzEwXSA9IHo7Cit9CisKK3N0YXRpYyB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCityc01hdHJpeExvYWRUcmFuc2xhdGUocnNfbWF0cml4NHg0ICptLCBmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KSB7CisgICAgcnNNYXRyaXhMb2FkSWRlbnRpdHkobSk7CisgICAgbS0+bVsxMl0gPSB4OworICAgIG0tPm1bMTNdID0geTsKKyAgICBtLT5tWzE0XSA9IHo7Cit9CisKK3N0YXRpYyB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCityc01hdHJpeExvYWRNdWx0aXBseShyc19tYXRyaXg0eDQgKm0sIGNvbnN0IHJzX21hdHJpeDR4NCAqbGhzLCBjb25zdCByc19tYXRyaXg0eDQgKnJocykgeworICAgIGZvciAoaW50IGk9MCA7IGk8NCA7IGkrKykgeworICAgICAgICBmbG9hdCByaTAgPSAwOworICAgICAgICBmbG9hdCByaTEgPSAwOworICAgICAgICBmbG9hdCByaTIgPSAwOworICAgICAgICBmbG9hdCByaTMgPSAwOworICAgICAgICBmb3IgKGludCBqPTAgOyBqPDQgOyBqKyspIHsKKyAgICAgICAgICAgIGNvbnN0IGZsb2F0IHJoc19paiA9IHJzTWF0cml4R2V0KHJocywgaSxqKTsKKyAgICAgICAgICAgIHJpMCArPSByc01hdHJpeEdldChsaHMsIGosIDApICogcmhzX2lqOworICAgICAgICAgICAgcmkxICs9IHJzTWF0cml4R2V0KGxocywgaiwgMSkgKiByaHNfaWo7CisgICAgICAgICAgICByaTIgKz0gcnNNYXRyaXhHZXQobGhzLCBqLCAyKSAqIHJoc19pajsKKyAgICAgICAgICAgIHJpMyArPSByc01hdHJpeEdldChsaHMsIGosIDMpICogcmhzX2lqOworICAgICAgICB9CisgICAgICAgIHJzTWF0cml4U2V0KG0sIGksIDAsIHJpMCk7CisgICAgICAgIHJzTWF0cml4U2V0KG0sIGksIDEsIHJpMSk7CisgICAgICAgIHJzTWF0cml4U2V0KG0sIGksIDIsIHJpMik7CisgICAgICAgIHJzTWF0cml4U2V0KG0sIGksIDMsIHJpMyk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorcnNNYXRyaXhNdWx0aXBseShyc19tYXRyaXg0eDQgKm0sIGNvbnN0IHJzX21hdHJpeDR4NCAqcmhzKSB7CisgICAgcnNfbWF0cml4NHg0IG10OworICAgIHJzTWF0cml4TG9hZE11bHRpcGx5KCZtdCwgbSwgcmhzKTsKKyAgICByc01hdHJpeExvYWQobSwgJm10KTsKK30KKworc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKK3JzTWF0cml4TG9hZE11bHRpcGx5KHJzX21hdHJpeDN4MyAqbSwgY29uc3QgcnNfbWF0cml4M3gzICpsaHMsIGNvbnN0IHJzX21hdHJpeDN4MyAqcmhzKSB7CisgICAgZm9yIChpbnQgaT0wIDsgaTwzIDsgaSsrKSB7CisgICAgICAgIGZsb2F0IHJpMCA9IDA7CisgICAgICAgIGZsb2F0IHJpMSA9IDA7CisgICAgICAgIGZsb2F0IHJpMiA9IDA7CisgICAgICAgIGZvciAoaW50IGo9MCA7IGo8MyA7IGorKykgeworICAgICAgICAgICAgY29uc3QgZmxvYXQgcmhzX2lqID0gcnNNYXRyaXhHZXQocmhzLCBpLGopOworICAgICAgICAgICAgcmkwICs9IHJzTWF0cml4R2V0KGxocywgaiwgMCkgKiByaHNfaWo7CisgICAgICAgICAgICByaTEgKz0gcnNNYXRyaXhHZXQobGhzLCBqLCAxKSAqIHJoc19pajsKKyAgICAgICAgICAgIHJpMiArPSByc01hdHJpeEdldChsaHMsIGosIDIpICogcmhzX2lqOworICAgICAgICB9CisgICAgICAgIHJzTWF0cml4U2V0KG0sIGksIDAsIHJpMCk7CisgICAgICAgIHJzTWF0cml4U2V0KG0sIGksIDEsIHJpMSk7CisgICAgICAgIHJzTWF0cml4U2V0KG0sIGksIDIsIHJpMik7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorcnNNYXRyaXhNdWx0aXBseShyc19tYXRyaXgzeDMgKm0sIGNvbnN0IHJzX21hdHJpeDN4MyAqcmhzKSB7CisgICAgcnNfbWF0cml4M3gzIG10OworICAgIHJzTWF0cml4TG9hZE11bHRpcGx5KCZtdCwgbSwgcmhzKTsKKyAgICByc01hdHJpeExvYWQobSwgJm10KTsKK30KKworc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKK3JzTWF0cml4TG9hZE11bHRpcGx5KHJzX21hdHJpeDJ4MiAqbSwgY29uc3QgcnNfbWF0cml4MngyICpsaHMsIGNvbnN0IHJzX21hdHJpeDJ4MiAqcmhzKSB7CisgICAgZm9yIChpbnQgaT0wIDsgaTwyIDsgaSsrKSB7CisgICAgICAgIGZsb2F0IHJpMCA9IDA7CisgICAgICAgIGZsb2F0IHJpMSA9IDA7CisgICAgICAgIGZvciAoaW50IGo9MCA7IGo8MiA7IGorKykgeworICAgICAgICAgICAgY29uc3QgZmxvYXQgcmhzX2lqID0gcnNNYXRyaXhHZXQocmhzLCBpLGopOworICAgICAgICAgICAgcmkwICs9IHJzTWF0cml4R2V0KGxocywgaiwgMCkgKiByaHNfaWo7CisgICAgICAgICAgICByaTEgKz0gcnNNYXRyaXhHZXQobGhzLCBqLCAxKSAqIHJoc19pajsKKyAgICAgICAgfQorICAgICAgICByc01hdHJpeFNldChtLCBpLCAwLCByaTApOworICAgICAgICByc01hdHJpeFNldChtLCBpLCAxLCByaTEpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKK3JzTWF0cml4TXVsdGlwbHkocnNfbWF0cml4MngyICptLCBjb25zdCByc19tYXRyaXgyeDIgKnJocykgeworICAgIHJzX21hdHJpeDJ4MiBtdDsKKyAgICByc01hdHJpeExvYWRNdWx0aXBseSgmbXQsIG0sIHJocyk7CisgICAgcnNNYXRyaXhMb2FkKG0sICZtdCk7Cit9CisKK3N0YXRpYyB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCityc01hdHJpeFJvdGF0ZShyc19tYXRyaXg0eDQgKm0sIGZsb2F0IHJvdCwgZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeikgeworICAgIHJzX21hdHJpeDR4NCBtMTsKKyAgICByc01hdHJpeExvYWRSb3RhdGUoJm0xLCByb3QsIHgsIHksIHopOworICAgIHJzTWF0cml4TXVsdGlwbHkobSwgJm0xKTsKK30KKworc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKK3JzTWF0cml4U2NhbGUocnNfbWF0cml4NHg0ICptLCBmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KSB7CisgICAgcnNfbWF0cml4NHg0IG0xOworICAgIHJzTWF0cml4TG9hZFNjYWxlKCZtMSwgeCwgeSwgeik7CisgICAgcnNNYXRyaXhNdWx0aXBseShtLCAmbTEpOworfQorCitzdGF0aWMgdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorcnNNYXRyaXhUcmFuc2xhdGUocnNfbWF0cml4NHg0ICptLCBmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KSB7CisgICAgcnNfbWF0cml4NHg0IG0xOworICAgIHJzTWF0cml4TG9hZFRyYW5zbGF0ZSgmbTEsIHgsIHksIHopOworICAgIHJzTWF0cml4TXVsdGlwbHkobSwgJm0xKTsKK30KKworc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKK3JzTWF0cml4TG9hZE9ydGhvKHJzX21hdHJpeDR4NCAqbSwgZmxvYXQgbGVmdCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSwgZmxvYXQgdG9wLCBmbG9hdCBuZWFyLCBmbG9hdCBmYXIpIHsKKyAgICByc01hdHJpeExvYWRJZGVudGl0eShtKTsKKyAgICBtLT5tWzBdID0gMi5mIC8gKHJpZ2h0IC0gbGVmdCk7CisgICAgbS0+bVs1XSA9IDIuZiAvICh0b3AgLSBib3R0b20pOworICAgIG0tPm1bMTBdPSAtMi5mIC8gKGZhciAtIG5lYXIpOworICAgIG0tPm1bMTJdPSAtKHJpZ2h0ICsgbGVmdCkgLyAocmlnaHQgLSBsZWZ0KTsKKyAgICBtLT5tWzEzXT0gLSh0b3AgKyBib3R0b20pIC8gKHRvcCAtIGJvdHRvbSk7CisgICAgbS0+bVsxNF09IC0oZmFyICsgbmVhcikgLyAoZmFyIC0gbmVhcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCityc01hdHJpeExvYWRGcnVzdHVtKHJzX21hdHJpeDR4NCAqbSwgZmxvYXQgbGVmdCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSwgZmxvYXQgdG9wLCBmbG9hdCBuZWFyLCBmbG9hdCBmYXIpIHsKKyAgICByc01hdHJpeExvYWRJZGVudGl0eShtKTsKKyAgICBtLT5tWzBdID0gMi5mICogbmVhciAvIChyaWdodCAtIGxlZnQpOworICAgIG0tPm1bNV0gPSAyLmYgKiBuZWFyIC8gKHRvcCAtIGJvdHRvbSk7CisgICAgbS0+bVs4XSA9IChyaWdodCArIGxlZnQpIC8gKHJpZ2h0IC0gbGVmdCk7CisgICAgbS0+bVs5XSA9ICh0b3AgKyBib3R0b20pIC8gKHRvcCAtIGJvdHRvbSk7CisgICAgbS0+bVsxMF09IC0oZmFyICsgbmVhcikgLyAoZmFyIC0gbmVhcik7CisgICAgbS0+bVsxMV09IC0xLmY7CisgICAgbS0+bVsxNF09IC0yLmYgKiBmYXIgKiBuZWFyIC8gKGZhciAtIG5lYXIpOworICAgIG0tPm1bMTVdPSAwLmY7Cit9CisKK3N0YXRpYyBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKK3JzTWF0cml4TXVsdGlwbHkocnNfbWF0cml4NHg0ICptLCBmbG9hdDQgaW4pIHsKKyAgICBmbG9hdDQgcmV0OworICAgIHJldC54ID0gKG0tPm1bMF0gKiBpbi54KSArIChtLT5tWzRdICogaW4ueSkgKyAobS0+bVs4XSAqIGluLnopICsgKG0tPm1bMTJdICogaW4udyk7CisgICAgcmV0LnkgPSAobS0+bVsxXSAqIGluLngpICsgKG0tPm1bNV0gKiBpbi55KSArIChtLT5tWzldICogaW4ueikgKyAobS0+bVsxM10gKiBpbi53KTsKKyAgICByZXQueiA9IChtLT5tWzJdICogaW4ueCkgKyAobS0+bVs2XSAqIGluLnkpICsgKG0tPm1bMTBdICogaW4ueikgKyAobS0+bVsxNF0gKiBpbi53KTsKKyAgICByZXQudyA9IChtLT5tWzNdICogaW4ueCkgKyAobS0+bVs3XSAqIGluLnkpICsgKG0tPm1bMTFdICogaW4ueikgKyAobS0+bVsxNV0gKiBpbi53KTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCityc01hdHJpeE11bHRpcGx5KHJzX21hdHJpeDR4NCAqbSwgZmxvYXQzIGluKSB7CisgICAgZmxvYXQ0IHJldDsKKyAgICByZXQueCA9IChtLT5tWzBdICogaW4ueCkgKyAobS0+bVs0XSAqIGluLnkpICsgKG0tPm1bOF0gKiBpbi56KSArIG0tPm1bMTJdOworICAgIHJldC55ID0gKG0tPm1bMV0gKiBpbi54KSArIChtLT5tWzVdICogaW4ueSkgKyAobS0+bVs5XSAqIGluLnopICsgbS0+bVsxM107CisgICAgcmV0LnogPSAobS0+bVsyXSAqIGluLngpICsgKG0tPm1bNl0gKiBpbi55KSArIChtLT5tWzEwXSAqIGluLnopICsgbS0+bVsxNF07CisgICAgcmV0LncgPSAobS0+bVszXSAqIGluLngpICsgKG0tPm1bN10gKiBpbi55KSArIChtLT5tWzExXSAqIGluLnopICsgbS0+bVsxNV07CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorcnNNYXRyaXhNdWx0aXBseShyc19tYXRyaXg0eDQgKm0sIGZsb2F0MiBpbikgeworICAgIGZsb2F0NCByZXQ7CisgICAgcmV0LnggPSAobS0+bVswXSAqIGluLngpICsgKG0tPm1bNF0gKiBpbi55KSArIG0tPm1bMTJdOworICAgIHJldC55ID0gKG0tPm1bMV0gKiBpbi54KSArIChtLT5tWzVdICogaW4ueSkgKyBtLT5tWzEzXTsKKyAgICByZXQueiA9IChtLT5tWzJdICogaW4ueCkgKyAobS0+bVs2XSAqIGluLnkpICsgbS0+bVsxNF07CisgICAgcmV0LncgPSAobS0+bVszXSAqIGluLngpICsgKG0tPm1bN10gKiBpbi55KSArIG0tPm1bMTVdOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKK3JzTWF0cml4TXVsdGlwbHkocnNfbWF0cml4M3gzICptLCBmbG9hdDMgaW4pIHsKKyAgICBmbG9hdDMgcmV0OworICAgIHJldC54ID0gKG0tPm1bMF0gKiBpbi54KSArIChtLT5tWzNdICogaW4ueSkgKyAobS0+bVs2XSAqIGluLnopOworICAgIHJldC55ID0gKG0tPm1bMV0gKiBpbi54KSArIChtLT5tWzRdICogaW4ueSkgKyAobS0+bVs3XSAqIGluLnopOworICAgIHJldC56ID0gKG0tPm1bMl0gKiBpbi54KSArIChtLT5tWzVdICogaW4ueSkgKyAobS0+bVs4XSAqIGluLnopOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKK3JzTWF0cml4TXVsdGlwbHkocnNfbWF0cml4M3gzICptLCBmbG9hdDIgaW4pIHsKKyAgICBmbG9hdDMgcmV0OworICAgIHJldC54ID0gKG0tPm1bMF0gKiBpbi54KSArIChtLT5tWzNdICogaW4ueSk7CisgICAgcmV0LnkgPSAobS0+bVsxXSAqIGluLngpICsgKG0tPm1bNF0gKiBpbi55KTsKKyAgICByZXQueiA9IChtLT5tWzJdICogaW4ueCkgKyAobS0+bVs1XSAqIGluLnkpOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKK3JzTWF0cml4TXVsdGlwbHkocnNfbWF0cml4MngyICptLCBmbG9hdDIgaW4pIHsKKyAgICBmbG9hdDIgcmV0OworICAgIHJldC54ID0gKG0tPm1bMF0gKiBpbi54KSArIChtLT5tWzJdICogaW4ueSk7CisgICAgcmV0LnkgPSAobS0+bVsxXSAqIGluLngpICsgKG0tPm1bM10gKiBpbi55KTsKKyAgICByZXR1cm4gcmV0OworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gaW50IG9wcworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworX19pbmxpbmVfXyBzdGF0aWMgdWludCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUsIGFsd2F5c19pbmxpbmUpKSByc0NsYW1wKHVpbnQgYW1vdW50LCB1aW50IGxvdywgdWludCBoaWdoKSB7CisgICAgcmV0dXJuIGFtb3VudCA8IGxvdyA/IGxvdyA6IChhbW91bnQgPiBoaWdoID8gaGlnaCA6IGFtb3VudCk7Cit9CitfX2lubGluZV9fIHN0YXRpYyBpbnQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlLCBhbHdheXNfaW5saW5lKSkgcnNDbGFtcChpbnQgYW1vdW50LCBpbnQgbG93LCBpbnQgaGlnaCkgeworICAgIHJldHVybiBhbW91bnQgPCBsb3cgPyBsb3cgOiAoYW1vdW50ID4gaGlnaCA/IGhpZ2ggOiBhbW91bnQpOworfQorX19pbmxpbmVfXyBzdGF0aWMgdXNob3J0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSwgYWx3YXlzX2lubGluZSkpIHJzQ2xhbXAodXNob3J0IGFtb3VudCwgdXNob3J0IGxvdywgdXNob3J0IGhpZ2gpIHsKKyAgICByZXR1cm4gYW1vdW50IDwgbG93ID8gbG93IDogKGFtb3VudCA+IGhpZ2ggPyBoaWdoIDogYW1vdW50KTsKK30KK19faW5saW5lX18gc3RhdGljIHNob3J0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSwgYWx3YXlzX2lubGluZSkpIHJzQ2xhbXAoc2hvcnQgYW1vdW50LCBzaG9ydCBsb3csIHNob3J0IGhpZ2gpIHsKKyAgICByZXR1cm4gYW1vdW50IDwgbG93ID8gbG93IDogKGFtb3VudCA+IGhpZ2ggPyBoaWdoIDogYW1vdW50KTsKK30KK19faW5saW5lX18gc3RhdGljIHVjaGFyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSwgYWx3YXlzX2lubGluZSkpIHJzQ2xhbXAodWNoYXIgYW1vdW50LCB1Y2hhciBsb3csIHVjaGFyIGhpZ2gpIHsKKyAgICByZXR1cm4gYW1vdW50IDwgbG93ID8gbG93IDogKGFtb3VudCA+IGhpZ2ggPyBoaWdoIDogYW1vdW50KTsKK30KK19faW5saW5lX18gc3RhdGljIGNoYXIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlLCBhbHdheXNfaW5saW5lKSkgcnNDbGFtcChjaGFyIGFtb3VudCwgY2hhciBsb3csIGNoYXIgaGlnaCkgeworICAgIHJldHVybiBhbW91bnQgPCBsb3cgPyBsb3cgOiAoYW1vdW50ID4gaGlnaCA/IGhpZ2ggOiBhbW91bnQpOworfQorCisKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2xpYnMvcnMvc2NyaXB0Yy9yc19ncmFwaGljcy5yc2ggYi9saWJzL3JzL3NjcmlwdGMvcnNfZ3JhcGhpY3MucnNoCmluZGV4IDcwY2Q1NjIuLmZiYTNkNmQgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvc2NyaXB0Yy9yc19ncmFwaGljcy5yc2gKKysrIGIvbGlicy9ycy9zY3JpcHRjL3JzX2dyYXBoaWNzLnJzaApAQCAtMSw2NSArMSw0NyBAQAorI2lmbmRlZiBfX1JTX0dSQVBISUNTX1JTSF9fCisjZGVmaW5lIF9fUlNfR1JBUEhJQ1NfUlNIX18KKworI2luY2x1ZGUgInJzX21hdGgucnNoIgogCiAKLWV4dGVybiBmbG9hdDIgdmVjMlJhbmQoZmxvYXQgbGVuKTsKKy8vIGNvbnRleHQKK2V4dGVybiB2b2lkIHJzZ0JpbmRQcm9ncmFtRnJhZ21lbnQocnNfcHJvZ3JhbV9mcmFnbWVudCk7CitleHRlcm4gdm9pZCByc2dCaW5kUHJvZ3JhbVN0b3JlKHJzX3Byb2dyYW1fc3RvcmUpOworZXh0ZXJuIHZvaWQgcnNnQmluZFByb2dyYW1WZXJ0ZXgocnNfcHJvZ3JhbV92ZXJ0ZXgpOworZXh0ZXJuIHZvaWQgcnNnQmluZFByb2dyYW1SYXN0ZXIocnNfcHJvZ3JhbV9yYXN0ZXIpOwogCi1leHRlcm4gZmxvYXQzIGZsb2F0M05vcm0oZmxvYXQzKTsKLWV4dGVybiBmbG9hdCBmbG9hdDNMZW5ndGgoZmxvYXQzKTsKLWV4dGVybiBmbG9hdDMgZmxvYXQzQWRkKGZsb2F0MyBsaHMsIGZsb2F0MyByaHMpOwotZXh0ZXJuIGZsb2F0MyBmbG9hdDNTdWIoZmxvYXQzIGxocywgZmxvYXQzIHJocyk7Ci1leHRlcm4gZmxvYXQzIGZsb2F0M0Nyb3NzKGZsb2F0MyBsaHMsIGZsb2F0MyByaHMpOwotZXh0ZXJuIGZsb2F0IGZsb2F0M0RvdChmbG9hdDMgbGhzLCBmbG9hdDMgcmhzKTsKLWV4dGVybiBmbG9hdDMgZmxvYXQzU2NhbGUoZmxvYXQzIHYsIGZsb2F0IHNjYWxlKTsKK2V4dGVybiB2b2lkIHJzZ0JpbmRTYW1wbGVyKHJzX3Byb2dyYW1fZnJhZ21lbnQsIGludCBzbG90LCByc19zYW1wbGVyKTsKK2V4dGVybiB2b2lkIHJzZ0JpbmRUZXh0dXJlKHJzX3Byb2dyYW1fZnJhZ21lbnQsIGludCBzbG90LCByc19hbGxvY2F0aW9uKTsKIAotZXh0ZXJuIGZsb2F0NCBmbG9hdDRBZGQoZmxvYXQ0IGxocywgZmxvYXQ0IHJocyk7Ci1leHRlcm4gZmxvYXQ0IGZsb2F0NFN1YihmbG9hdDQgbGhzLCBmbG9hdDQgcmhzKTsKLWV4dGVybiBmbG9hdDQgZmxvYXQ0Q3Jvc3MoZmxvYXQ0IGxocywgZmxvYXQ0IHJocyk7Ci1leHRlcm4gZmxvYXQgZmxvYXQ0RG90KGZsb2F0NCBsaHMsIGZsb2F0NCByaHMpOwotZXh0ZXJuIGZsb2F0NCBmbG9hdDRTY2FsZShmbG9hdDQgdiwgZmxvYXQgc2NhbGUpOworZXh0ZXJuIHZvaWQgcnNnUHJvZ3JhbVZlcnRleExvYWRNb2RlbE1hdHJpeChjb25zdCByc19tYXRyaXg0eDQgKik7CitleHRlcm4gdm9pZCByc2dQcm9ncmFtVmVydGV4TG9hZFRleHR1cmVNYXRyaXgoY29uc3QgcnNfbWF0cml4NHg0ICopOwogCi0gICAgLy8gY29udGV4dAotZXh0ZXJuIHZvaWQgYmluZFByb2dyYW1GcmFnbWVudChyc19wcm9ncmFtX2ZyYWdtZW50KTsKLWV4dGVybiB2b2lkIGJpbmRQcm9ncmFtU3RvcmUocnNfcHJvZ3JhbV9zdG9yZSk7Ci1leHRlcm4gdm9pZCBiaW5kUHJvZ3JhbVZlcnRleChyc19wcm9ncmFtX3ZlcnRleCk7CitleHRlcm4gaW50IHJzZ0dldFdpZHRoKCk7CitleHRlcm4gaW50IHJzZ0dldEhlaWdodCgpOwogCi1leHRlcm4gdm9pZCBiaW5kU2FtcGxlcihyc19wcm9ncmFtX2ZyYWdtZW50LCBpbnQgc2xvdCwgcnNfc2FtcGxlcik7Ci1leHRlcm4gdm9pZCBiaW5kU2FtcGxlcihyc19wcm9ncmFtX2ZyYWdtZW50LCBpbnQgc2xvdCwgcnNfYWxsb2NhdGlvbik7CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSByc2dVcGxvYWRUb1RleHR1cmUocnNfYWxsb2NhdGlvbik7CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSByc2dVcGxvYWRUb1RleHR1cmUocnNfYWxsb2NhdGlvbiwgaW50IG1pcExldmVsKTsKK2V4dGVybiB2b2lkIHJzZ1VwbG9hZFRvQnVmZmVyT2JqZWN0KHJzX2FsbG9jYXRpb24pOworLy9leHRlcm4gdm9pZCByc2dVcGxvYWRNZXNoKHJzX21lc2gpOwogCi1leHRlcm4gdm9pZCB2cExvYWRNb2RlbE1hdHJpeChjb25zdCBmbG9hdCAqKTsKLWV4dGVybiB2b2lkIHZwTG9hZFRleHR1cmVNYXRyaXgoY29uc3QgZmxvYXQgKik7CitleHRlcm4gdm9pZCByc2dEcmF3UmVjdChmbG9hdCB4MSwgZmxvYXQgeTEsIGZsb2F0IHgyLCBmbG9hdCB5MiwgZmxvYXQgeik7CitleHRlcm4gdm9pZCByc2dEcmF3UXVhZChmbG9hdCB4MSwgZmxvYXQgeTEsIGZsb2F0IHoxLCBmbG9hdCB4MiwgZmxvYXQgeTIsIGZsb2F0IHoyLCBmbG9hdCB4MywgZmxvYXQgeTMsIGZsb2F0IHozLCBmbG9hdCB4NCwgZmxvYXQgeTQsIGZsb2F0IHo0KTsKK2V4dGVybiB2b2lkIHJzZ0RyYXdRdWFkVGV4Q29vcmRzKGZsb2F0IHgxLCBmbG9hdCB5MSwgZmxvYXQgejEsIGZsb2F0IHUxLCBmbG9hdCB2MSwgZmxvYXQgeDIsIGZsb2F0IHkyLCBmbG9hdCB6MiwgZmxvYXQgdTIsIGZsb2F0IHYyLCBmbG9hdCB4MywgZmxvYXQgeTMsIGZsb2F0IHozLCBmbG9hdCB1MywgZmxvYXQgdjMsIGZsb2F0IHg0LCBmbG9hdCB5NCwgZmxvYXQgejQsIGZsb2F0IHU0LCBmbG9hdCB2NCk7CisvL2V4dGVybiB2b2lkIHJzZ0RyYXdTcHJpdGUoZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeiwgZmxvYXQgdywgZmxvYXQgaCk7CitleHRlcm4gdm9pZCByc2dEcmF3U3ByaXRlU2NyZWVuc3BhY2UoZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeiwgZmxvYXQgdywgZmxvYXQgaCk7CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSByc2dEcmF3U2ltcGxlTWVzaChyc19tZXNoIGlzbSk7CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSByc2dEcmF3U2ltcGxlTWVzaChyc19tZXNoIGlzbSwgaW50IHN0YXJ0LCBpbnQgbGVuKTsKIAorZXh0ZXJuIHZvaWQgcnNnQ2xlYXJDb2xvcihmbG9hdCwgZmxvYXQsIGZsb2F0LCBmbG9hdCk7CitleHRlcm4gdm9pZCByc2dDbGVhckRlcHRoKGZsb2F0KTsKIAotLy8gZHJhd2luZwotZXh0ZXJuIHZvaWQgZHJhd1JlY3QoZmxvYXQgeDEsIGZsb2F0IHkxLCBmbG9hdCB4MiwgZmxvYXQgeTIsIGZsb2F0IHopOwotZXh0ZXJuIHZvaWQgZHJhd1F1YWQoZmxvYXQgeDEsIGZsb2F0IHkxLCBmbG9hdCB6MSwgZmxvYXQgeDIsIGZsb2F0IHkyLCBmbG9hdCB6MiwgZmxvYXQgeDMsIGZsb2F0IHkzLCBmbG9hdCB6MywgZmxvYXQgeDQsIGZsb2F0IHk0LCBmbG9hdCB6NCk7Ci1leHRlcm4gdm9pZCBkcmF3UXVhZFRleENvb3JkcyhmbG9hdCB4MSwgZmxvYXQgeTEsIGZsb2F0IHoxLCBmbG9hdCB1MSwgZmxvYXQgdjEsIGZsb2F0IHgyLCBmbG9hdCB5MiwgZmxvYXQgejIsIGZsb2F0IHUyLCBmbG9hdCB2MiwgZmxvYXQgeDMsIGZsb2F0IHkzLCBmbG9hdCB6MywgZmxvYXQgdTMsIGZsb2F0IHYzLCBmbG9hdCB4NCwgZmxvYXQgeTQsIGZsb2F0IHo0LCBmbG9hdCB1NCwgZmxvYXQgdjQpOwotZXh0ZXJuIHZvaWQgZHJhd1Nwcml0ZShmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6LCBmbG9hdCB3LCBmbG9hdCBoKTsKLWV4dGVybiB2b2lkIGRyYXdTcHJpdGVTY3JlZW5zcGFjZShmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6LCBmbG9hdCB3LCBmbG9hdCBoKTsKLWV4dGVybiB2b2lkIGRyYXdMaW5lKGZsb2F0IHgxLCBmbG9hdCB5MSwgZmxvYXQgejEsIGZsb2F0IHgyLCBmbG9hdCB5MiwgZmxvYXQgejIpOwotZXh0ZXJuIHZvaWQgZHJhd1BvaW50KGZsb2F0IHgxLCBmbG9hdCB5MSwgZmxvYXQgejEpOwotZXh0ZXJuIHZvaWQgZHJhd1NpbXBsZU1lc2goaW50IGlzbSk7Ci1leHRlcm4gdm9pZCBkcmF3U2ltcGxlTWVzaFJhbmdlKGludCBpc20sIGludCBzdGFydCwgaW50IGxlbik7CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSByc2dEcmF3VGV4dChjb25zdCBjaGFyICosIGludCB4LCBpbnQgeSk7CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSByc2dEcmF3VGV4dChyc19hbGxvY2F0aW9uLCBpbnQgeCwgaW50IHkpOworZXh0ZXJuIHZvaWQgcnNnQmluZEZvbnQocnNfZm9udCk7CiAKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIC8vIG1pc2MKLWV4dGVybiB2b2lkIHBmQ2xlYXJDb2xvcihmbG9hdCwgZmxvYXQsIGZsb2F0LCBmbG9hdCk7CiBleHRlcm4gdm9pZCBjb2xvcihmbG9hdCwgZmxvYXQsIGZsb2F0LCBmbG9hdCk7Ci1leHRlcm4gdm9pZCBoc2IoZmxvYXQsIGZsb2F0LCBmbG9hdCwgZmxvYXQpOwotZXh0ZXJuIHZvaWQgaHNiVG9SZ2IoZmxvYXQsIGZsb2F0LCBmbG9hdCwgZmxvYXQqKTsKLWV4dGVybiBpbnQgaHNiVG9BYmdyKGZsb2F0LCBmbG9hdCwgZmxvYXQsIGZsb2F0KTsKIAotZXh0ZXJuIHZvaWQgdXBsb2FkVG9UZXh0dXJlKGludCwgaW50KTsKLWV4dGVybiB2b2lkIHVwbG9hZFRvQnVmZmVyT2JqZWN0KGludCk7Ci0KLWV4dGVybiBpbnQgY29sb3JGbG9hdFJHQkF0b1VOb3JtOChmbG9hdCwgZmxvYXQsIGZsb2F0LCBmbG9hdCk7Ci1leHRlcm4gaW50IGNvbG9yRmxvYXRSR0J0bzU2NShmbG9hdCwgZmxvYXQsIGZsb2F0KTsKLQotZXh0ZXJuIGludCBnZXRXaWR0aCgpOwotZXh0ZXJuIGludCBnZXRIZWlnaHQoKTsKLQotZXh0ZXJuIGludCBzZW5kVG9DbGllbnQodm9pZCAqZGF0YSwgaW50IGNtZElELCBpbnQgbGVuLCBpbnQgd2FpdEZvclNwYWNlKTsKLQotZXh0ZXJuIHZvaWQgZGVidWdGKGNvbnN0IGNoYXIgKiwgZmxvYXQpOwotZXh0ZXJuIHZvaWQgZGVidWdJMzIoY29uc3QgY2hhciAqLCBpbnQpOwotZXh0ZXJuIHZvaWQgZGVidWdIZXhJMzIoY29uc3QgY2hhciAqLCBpbnQpOwotCi0KKyNlbmRpZgogCmRpZmYgLS1naXQgYS9saWJzL3JzL3NjcmlwdGMvcnNfbWF0aC5yc2ggYi9saWJzL3JzL3NjcmlwdGMvcnNfbWF0aC5yc2gKaW5kZXggNjEzYzdjYS4uOGJmNTNiZiAxMDA2NDQKLS0tIGEvbGlicy9ycy9zY3JpcHRjL3JzX21hdGgucnNoCisrKyBiL2xpYnMvcnMvc2NyaXB0Yy9yc19tYXRoLnJzaApAQCAtMSwyODcgKzEsNTUgQEAKLS8vIEZsb2F0IG9wcwotCi1leHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgYWJzKGZsb2F0KTsKLWV4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgYWJzKGZsb2F0Mik7Ci1leHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGFicyhmbG9hdDMpOwotZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhYnMoZmxvYXQ0KTsKLWV4dGVybiBmbG9hdDggX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgYWJzKGZsb2F0OCk7Ci1leHRlcm4gZmxvYXQxNiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhYnMoZmxvYXQxNik7Ci0KLWV4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhY29zKGZsb2F0KTsKLWV4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgYWNvcyhmbG9hdDIpOwotZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhY29zKGZsb2F0Myk7Ci1leHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGFjb3MoZmxvYXQ0KTsKLWV4dGVybiBmbG9hdDggX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgYWNvcyhmbG9hdDgpOwotZXh0ZXJuIGZsb2F0MTYgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgYWNvcyhmbG9hdDE2KTsKLQotZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGFzaW4oZmxvYXQpOwotZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhc2luKGZsb2F0Mik7Ci1leHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGFzaW4oZmxvYXQzKTsKLWV4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgYXNpbihmbG9hdDQpOwotZXh0ZXJuIGZsb2F0OCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhc2luKGZsb2F0OCk7Ci1leHRlcm4gZmxvYXQxNiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhc2luKGZsb2F0MTYpOwotCi1leHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgYXRhbihmbG9hdCk7Ci1leHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGF0YW4oZmxvYXQyKTsKLWV4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgYXRhbihmbG9hdDMpOwotZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhdGFuKGZsb2F0NCk7Ci1leHRlcm4gZmxvYXQ4IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGF0YW4oZmxvYXQ4KTsKLWV4dGVybiBmbG9hdDE2IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGF0YW4oZmxvYXQxNik7Ci0KLWV4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhdGFuMihmbG9hdCwgZmxvYXQpOwotZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhdGFuMihmbG9hdDIsIGZsb2F0Mik7Ci1leHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGF0YW4yKGZsb2F0MywgZmxvYXQzKTsKLWV4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgYXRhbjIoZmxvYXQ0LCBmbG9hdDQpOwotZXh0ZXJuIGZsb2F0OCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhdGFuMihmbG9hdDgsIGZsb2F0OCk7Ci1leHRlcm4gZmxvYXQxNiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhdGFuMihmbG9hdDE2LCBmbG9hdDE2KTsKLQotZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNlaWwoZmxvYXQpOwotZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjZWlsKGZsb2F0Mik7Ci1leHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNlaWwoZmxvYXQzKTsKLWV4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY2VpbChmbG9hdDQpOwotZXh0ZXJuIGZsb2F0OCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjZWlsKGZsb2F0OCk7Ci1leHRlcm4gZmxvYXQxNiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjZWlsKGZsb2F0MTYpOwotCi1leHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY2xhbXAoZmxvYXQsIGZsb2F0LCBmbG9hdCk7Ci1leHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNsYW1wKGZsb2F0MiwgZmxvYXQyLCBmbG9hdDIpOwotZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjbGFtcChmbG9hdDMsIGZsb2F0MywgZmxvYXQzKTsKLWV4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY2xhbXAoZmxvYXQ0LCBmbG9hdDQsIGZsb2F0NCk7Ci1leHRlcm4gZmxvYXQ4IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNsYW1wKGZsb2F0OCwgZmxvYXQ4LCBmbG9hdDgpOwotZXh0ZXJuIGZsb2F0MTYgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY2xhbXAoZmxvYXQxNiwgZmxvYXQxNiwgZmxvYXQxNik7Ci1leHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY2xhbXAoZmxvYXQsIGZsb2F0LCBmbG9hdCk7Ci1leHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNsYW1wKGZsb2F0MiwgZmxvYXQsIGZsb2F0KTsKLWV4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY2xhbXAoZmxvYXQzLCBmbG9hdCwgZmxvYXQpOwotZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjbGFtcChmbG9hdDQsIGZsb2F0LCBmbG9hdCk7Ci1leHRlcm4gZmxvYXQ4IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNsYW1wKGZsb2F0OCwgZmxvYXQsIGZsb2F0KTsKLWV4dGVybiBmbG9hdDE2IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNsYW1wKGZsb2F0MTYsIGZsb2F0LCBmbG9hdCk7Ci0KLWV4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjb3B5c2lnbihmbG9hdCwgZmxvYXQpOwotZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjb3B5c2lnbihmbG9hdDIsIGZsb2F0Mik7Ci1leHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNvcHlzaWduKGZsb2F0MywgZmxvYXQzKTsKLWV4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY29weXNpZ24oZmxvYXQ0LCBmbG9hdDQpOwotZXh0ZXJuIGZsb2F0OCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjb3B5c2lnbihmbG9hdDgsIGZsb2F0OCk7Ci1leHRlcm4gZmxvYXQxNiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjb3B5c2lnbihmbG9hdDE2LCBmbG9hdDE2KTsKLQotZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNvcyhmbG9hdCk7Ci1leHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNvcyhmbG9hdDIpOwotZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjb3MoZmxvYXQzKTsKLWV4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY29zKGZsb2F0NCk7Ci1leHRlcm4gZmxvYXQ4IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNvcyhmbG9hdDgpOwotZXh0ZXJuIGZsb2F0MTYgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY29zKGZsb2F0MTYpOwotCi1leHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZGVncmVlcyhmbG9hdCk7Ci1leHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGRlZ3JlZXMoZmxvYXQyKTsKLWV4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZGVncmVlcyhmbG9hdDMpOwotZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBkZWdyZWVzKGZsb2F0NCk7Ci1leHRlcm4gZmxvYXQ4IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGRlZ3JlZXMoZmxvYXQ4KTsKLWV4dGVybiBmbG9hdDE2IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGRlZ3JlZXMoZmxvYXQxNik7Ci0KLWV4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBleHAoZmxvYXQpOwotZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBleHAoZmxvYXQyKTsKLWV4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZXhwKGZsb2F0Myk7Ci1leHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGV4cChmbG9hdDQpOwotZXh0ZXJuIGZsb2F0OCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBleHAoZmxvYXQ4KTsKLWV4dGVybiBmbG9hdDE2IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGV4cChmbG9hdDE2KTsKLQotZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGV4cDIoZmxvYXQpOwotZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBleHAyKGZsb2F0Mik7Ci1leHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGV4cDIoZmxvYXQzKTsKLWV4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZXhwMihmbG9hdDQpOwotZXh0ZXJuIGZsb2F0OCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBleHAyKGZsb2F0OCk7Ci1leHRlcm4gZmxvYXQxNiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBleHAyKGZsb2F0MTYpOwotCi1leHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZXhwMTAoZmxvYXQpOwotZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBleHAxMChmbG9hdDIpOwotZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBleHAxMChmbG9hdDMpOwotZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBleHAxMChmbG9hdDQpOwotZXh0ZXJuIGZsb2F0OCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBleHAxMChmbG9hdDgpOwotZXh0ZXJuIGZsb2F0MTYgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZXhwMTAoZmxvYXQxNik7Ci0KLWV4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmYWJzKGZsb2F0KTsKLWV4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZmFicyhmbG9hdDIpOwotZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmYWJzKGZsb2F0Myk7Ci1leHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZhYnMoZmxvYXQ0KTsKLWV4dGVybiBmbG9hdDggX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZmFicyhmbG9hdDgpOwotZXh0ZXJuIGZsb2F0MTYgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZmFicyhmbG9hdDE2KTsKLQotZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZsb29yKGZsb2F0KTsKLWV4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZmxvb3IoZmxvYXQyKTsKLWV4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZmxvb3IoZmxvYXQzKTsKLWV4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZmxvb3IoZmxvYXQ0KTsKLWV4dGVybiBmbG9hdDggX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZmxvb3IoZmxvYXQ4KTsKLWV4dGVybiBmbG9hdDE2IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZsb29yKGZsb2F0MTYpOwotCi1leHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZm1heChmbG9hdCwgZmxvYXQpOwotZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbWF4KGZsb2F0MiwgZmxvYXQyKTsKLWV4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZm1heChmbG9hdDMsIGZsb2F0Myk7Ci1leHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZtYXgoZmxvYXQ0LCBmbG9hdDQpOwotZXh0ZXJuIGZsb2F0OCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbWF4KGZsb2F0OCwgZmxvYXQ4KTsKLWV4dGVybiBmbG9hdDE2IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZtYXgoZmxvYXQxNiwgZmxvYXQxNik7Ci1leHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZtYXgoZmxvYXQyLCBmbG9hdCk7Ci1leHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZtYXgoZmxvYXQzLCBmbG9hdCk7Ci1leHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZtYXgoZmxvYXQ0LCBmbG9hdCk7Ci1leHRlcm4gZmxvYXQ4IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZtYXgoZmxvYXQ4LCBmbG9hdCk7Ci1leHRlcm4gZmxvYXQxNiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbWF4KGZsb2F0MTYsIGZsb2F0KTsKLQotZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZtaW4oZmxvYXQsIGZsb2F0KTsKLWV4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZm1pbihmbG9hdDIsIGZsb2F0Mik7Ci1leHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZtaW4oZmxvYXQzLCBmbG9hdDMpOwotZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbWluKGZsb2F0NCwgZmxvYXQ0KTsKLWV4dGVybiBmbG9hdDggX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZm1pbihmbG9hdDgsIGZsb2F0OCk7Ci1leHRlcm4gZmxvYXQxNiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbWluKGZsb2F0MTYsIGZsb2F0MTYpOwotZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbWluKGZsb2F0MiwgZmxvYXQpOwotZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbWluKGZsb2F0MywgZmxvYXQpOwotZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbWluKGZsb2F0NCwgZmxvYXQpOwotZXh0ZXJuIGZsb2F0OCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbWluKGZsb2F0OCwgZmxvYXQpOwotZXh0ZXJuIGZsb2F0MTYgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZm1pbihmbG9hdDE2LCBmbG9hdCk7Ci0KLWV4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbW9kKGZsb2F0LCBmbG9hdCk7Ci1leHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZtb2QoZmxvYXQyLCBmbG9hdDIpOwotZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbW9kKGZsb2F0MywgZmxvYXQzKTsKLWV4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZm1vZChmbG9hdDQsIGZsb2F0NCk7Ci1leHRlcm4gZmxvYXQ4IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZtb2QoZmxvYXQ4LCBmbG9hdDgpOwotZXh0ZXJuIGZsb2F0MTYgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZm1vZChmbG9hdDE2LCBmbG9hdDE2KTsKLQotZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGxvZyhmbG9hdCk7Ci1leHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGxvZyhmbG9hdDIpOwotZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBsb2coZmxvYXQzKTsKLWV4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbG9nKGZsb2F0NCk7Ci1leHRlcm4gZmxvYXQ4IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGxvZyhmbG9hdDgpOwotZXh0ZXJuIGZsb2F0MTYgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbG9nKGZsb2F0MTYpOwotCi1leHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbG9nMihmbG9hdCk7Ci1leHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGxvZzIoZmxvYXQyKTsKLWV4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbG9nMihmbG9hdDMpOwotZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBsb2cyKGZsb2F0NCk7Ci1leHRlcm4gZmxvYXQ4IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGxvZzIoZmxvYXQ4KTsKLWV4dGVybiBmbG9hdDE2IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGxvZzIoZmxvYXQxNik7Ci0KLWV4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBsb2cxMChmbG9hdCk7Ci1leHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGxvZzEwKGZsb2F0Mik7Ci1leHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGxvZzEwKGZsb2F0Myk7Ci1leHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGxvZzEwKGZsb2F0NCk7Ci1leHRlcm4gZmxvYXQ4IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGxvZzEwKGZsb2F0OCk7Ci1leHRlcm4gZmxvYXQxNiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBsb2cxMChmbG9hdDE2KTsKLQotZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1heChmbG9hdCwgZmxvYXQpOwotZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtYXgoZmxvYXQyLCBmbG9hdDIpOwotZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtYXgoZmxvYXQzLCBmbG9hdDMpOwotZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtYXgoZmxvYXQ0LCBmbG9hdDQpOwotZXh0ZXJuIGZsb2F0OCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtYXgoZmxvYXQ4LCBmbG9hdDgpOwotZXh0ZXJuIGZsb2F0MTYgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWF4KGZsb2F0MTYsIGZsb2F0MTYpOwotCi1leHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWluKGZsb2F0LCBmbG9hdCk7Ci1leHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1pbihmbG9hdDIsIGZsb2F0Mik7Ci1leHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1pbihmbG9hdDMsIGZsb2F0Myk7Ci1leHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1pbihmbG9hdDQsIGZsb2F0NCk7Ci1leHRlcm4gZmxvYXQ4IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1pbihmbG9hdDgsIGZsb2F0OCk7Ci1leHRlcm4gZmxvYXQxNiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtaW4oZmxvYXQxNiwgZmxvYXQxNik7Ci0KLWV4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtaXgoZmxvYXQsIGZsb2F0LCBmbG9hdCk7Ci1leHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1peChmbG9hdDIsIGZsb2F0MiwgZmxvYXQyKTsKLWV4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWl4KGZsb2F0MywgZmxvYXQzLCBmbG9hdDMpOwotZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtaXgoZmxvYXQ0LCBmbG9hdDQsIGZsb2F0NCk7Ci1leHRlcm4gZmxvYXQ4IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1peChmbG9hdDgsIGZsb2F0OCwgZmxvYXQ4KTsKLWV4dGVybiBmbG9hdDE2IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1peChmbG9hdDE2LCBmbG9hdDE2LCBmbG9hdDE2KTsKLWV4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtaXgoZmxvYXQsIGZsb2F0LCBmbG9hdCk7Ci1leHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1peChmbG9hdDIsIGZsb2F0MiwgZmxvYXQpOwotZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtaXgoZmxvYXQzLCBmbG9hdDMsIGZsb2F0KTsKLWV4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWl4KGZsb2F0NCwgZmxvYXQ0LCBmbG9hdCk7Ci1leHRlcm4gZmxvYXQ4IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1peChmbG9hdDgsIGZsb2F0OCwgZmxvYXQpOwotZXh0ZXJuIGZsb2F0MTYgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWl4KGZsb2F0MTYsIGZsb2F0MTYsIGZsb2F0KTsKLQotZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHBvdyhmbG9hdCwgZmxvYXQpOwotZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBwb3coZmxvYXQyLCBmbG9hdDIpOwotZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBwb3coZmxvYXQzLCBmbG9hdDMpOwotZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBwb3coZmxvYXQ0LCBmbG9hdDQpOwotZXh0ZXJuIGZsb2F0OCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBwb3coZmxvYXQ4LCBmbG9hdDgpOwotZXh0ZXJuIGZsb2F0MTYgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcG93KGZsb2F0MTYsIGZsb2F0MTYpOwotCi1leHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcmFkaWFucyhmbG9hdCk7Ci1leHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHJhZGlhbnMoZmxvYXQyKTsKLWV4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcmFkaWFucyhmbG9hdDMpOwotZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSByYWRpYW5zKGZsb2F0NCk7Ci1leHRlcm4gZmxvYXQ4IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHJhZGlhbnMoZmxvYXQ4KTsKLWV4dGVybiBmbG9hdDE2IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHJhZGlhbnMoZmxvYXQxNik7Ci0KLWV4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSByaW50KGZsb2F0KTsKLWV4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcmludChmbG9hdDIpOwotZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSByaW50KGZsb2F0Myk7Ci1leHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHJpbnQoZmxvYXQ0KTsKLWV4dGVybiBmbG9hdDggX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcmludChmbG9hdDgpOwotZXh0ZXJuIGZsb2F0MTYgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcmludChmbG9hdDE2KTsKLQotZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHJvdW5kKGZsb2F0KTsKLWV4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcm91bmQoZmxvYXQyKTsKLWV4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcm91bmQoZmxvYXQzKTsKLWV4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcm91bmQoZmxvYXQ0KTsKLWV4dGVybiBmbG9hdDggX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcm91bmQoZmxvYXQ4KTsKLWV4dGVybiBmbG9hdDE2IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHJvdW5kKGZsb2F0MTYpOwotCi1leHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcnNxcnQoZmxvYXQpOwotZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSByc3FydChmbG9hdDIpOwotZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSByc3FydChmbG9hdDMpOwotZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSByc3FydChmbG9hdDQpOwotZXh0ZXJuIGZsb2F0OCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSByc3FydChmbG9hdDgpOwotZXh0ZXJuIGZsb2F0MTYgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcnNxcnQoZmxvYXQxNik7Ci0KLWV4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBzaWduKGZsb2F0KTsKLWV4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgc2lnbihmbG9hdDIpOwotZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBzaWduKGZsb2F0Myk7Ci1leHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHNpZ24oZmxvYXQ0KTsKLWV4dGVybiBmbG9hdDggX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgc2lnbihmbG9hdDgpOwotZXh0ZXJuIGZsb2F0MTYgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgc2lnbihmbG9hdDE2KTsKLQotZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHNpbihmbG9hdCk7Ci1leHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHNpbihmbG9hdDIpOwotZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBzaW4oZmxvYXQzKTsKLWV4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgc2luKGZsb2F0NCk7Ci1leHRlcm4gZmxvYXQ4IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHNpbihmbG9hdDgpOwotZXh0ZXJuIGZsb2F0MTYgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgc2luKGZsb2F0MTYpOwotCi1leHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgc3FydChmbG9hdCk7Ci1leHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHNxcnQoZmxvYXQyKTsKLWV4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgc3FydChmbG9hdDMpOwotZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBzcXJ0KGZsb2F0NCk7Ci1leHRlcm4gZmxvYXQ4IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHNxcnQoZmxvYXQ4KTsKLWV4dGVybiBmbG9hdDE2IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHNxcnQoZmxvYXQxNik7Ci0KLWV4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSB0YW4oZmxvYXQpOwotZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSB0YW4oZmxvYXQyKTsKLWV4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgdGFuKGZsb2F0Myk7Ci1leHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHRhbihmbG9hdDQpOwotZXh0ZXJuIGZsb2F0OCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSB0YW4oZmxvYXQ4KTsKLWV4dGVybiBmbG9hdDE2IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHRhbihmbG9hdDE2KTsKLQotZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHRydW5jKGZsb2F0KTsKLWV4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgdHJ1bmMoZmxvYXQyKTsKLWV4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgdHJ1bmMoZmxvYXQzKTsKLWV4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgdHJ1bmMoZmxvYXQ0KTsKLWV4dGVybiBmbG9hdDggX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgdHJ1bmMoZmxvYXQ4KTsKLWV4dGVybiBmbG9hdDE2IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHRydW5jKGZsb2F0MTYpOworI2luY2x1ZGUgInJzX2NsLnJzaCIKKyNpbmNsdWRlICJyc19jb3JlLnJzaCIKIAogCiAKKy8vIEFsbG9jYXRpb25zCitleHRlcm4gcnNfYWxsb2NhdGlvbiByc0dldEFsbG9jYXRpb24oY29uc3Qgdm9pZCAqKTsKK2V4dGVybiB1aW50MzJfdCByc0FsbG9jYXRpb25HZXREaW1YKHJzX2FsbG9jYXRpb24pOworZXh0ZXJuIHVpbnQzMl90IHJzQWxsb2NhdGlvbkdldERpbVkocnNfYWxsb2NhdGlvbik7CitleHRlcm4gdWludDMyX3QgcnNBbGxvY2F0aW9uR2V0RGltWihyc19hbGxvY2F0aW9uKTsKK2V4dGVybiB1aW50MzJfdCByc0FsbG9jYXRpb25HZXREaW1MT0QocnNfYWxsb2NhdGlvbik7CitleHRlcm4gdWludDMyX3QgcnNBbGxvY2F0aW9uR2V0RGltRmFjZXMocnNfYWxsb2NhdGlvbik7CiAKIAogCi0vLyBJbnQgb3BzCisvLyBEZWJ1Z2dpbmcKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpcnNEZWJ1Zyhjb25zdCBjaGFyICosIGZsb2F0KTsKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpcnNEZWJ1Zyhjb25zdCBjaGFyICosIGZsb2F0Mik7CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKXJzRGVidWcoY29uc3QgY2hhciAqLCBmbG9hdDMpOworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSlyc0RlYnVnKGNvbnN0IGNoYXIgKiwgZmxvYXQ0KTsKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpcnNEZWJ1Zyhjb25zdCBjaGFyICosIGludCk7CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKXJzRGVidWcoY29uc3QgY2hhciAqLCBjb25zdCB2b2lkICopOworI2RlZmluZSBSU19ERUJVRyhhKSByc0RlYnVnKCNhLCBhKQorI2RlZmluZSBSU19ERUJVR19NQVJLRVIgcnNEZWJ1ZyhfX0ZJTEVfXywgX19MSU5FX18pCiAKLWV4dGVybiBpbnQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgYWJzKGludCk7Ci1leHRlcm4gaW50MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhYnMoaW50Mik7Ci1leHRlcm4gaW50MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhYnMoaW50Myk7Ci1leHRlcm4gaW50NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhYnMoaW50NCk7Ci1leHRlcm4gaW50OCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhYnMoaW50OCk7Ci1leHRlcm4gaW50MTYgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgYWJzKGludDE2KTsKKy8vIFJTIE1hdGgKK2V4dGVybiBpbnQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcnNSYW5kKGludCk7CitleHRlcm4gaW50IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHJzUmFuZChpbnQsIGludCk7CitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcnNSYW5kKGZsb2F0KTsKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSByc1JhbmQoZmxvYXQsIGZsb2F0KTsKIAorZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHJzRnJhYyhmbG9hdCk7CiAKKy8vIHRpbWUKK2V4dGVybiBpbnQzMl90IHJzU2Vjb25kKCk7CitleHRlcm4gaW50MzJfdCByc01pbnV0ZSgpOworZXh0ZXJuIGludDMyX3QgcnNIb3VyKCk7CitleHRlcm4gaW50MzJfdCByc0RheSgpOworZXh0ZXJuIGludDMyX3QgcnNNb250aCgpOworZXh0ZXJuIGludDMyX3QgcnNZZWFyKCk7CitleHRlcm4gaW50NjRfdCByc1VwdGltZU1pbGxpcygpOworZXh0ZXJuIGludDY0X3QgcnNTdGFydFRpbWVNaWxsaXMoKTsKK2V4dGVybiBpbnQ2NF90IHJzRWxhcHNlZFRpbWVNaWxsaXMoKTsKIAotLyoKLWV4dGVybiBmbG9hdCBtb2RmKGZsb2F0LCBmbG9hdCk7Ci1leHRlcm4gZmxvYXQgcmFuZGYoZmxvYXQpOwotZXh0ZXJuIGZsb2F0IHJhbmRmMihmbG9hdCwgZmxvYXQpOwotZXh0ZXJuIGZsb2F0IGZyYWNmKGZsb2F0KTsKLWV4dGVybiBmbG9hdCBsZXJwZihmbG9hdCwgZmxvYXQsIGZsb2F0KTsKLWV4dGVybiBmbG9hdCBtYXBmKGZsb2F0LCBmbG9hdCwgZmxvYXQsIGZsb2F0LCBmbG9hdCk7Ci0qLworZXh0ZXJuIGludCByc1NlbmRUb0NsaWVudCh2b2lkICpkYXRhLCBpbnQgY21kSUQsIGludCBsZW4sIGludCB3YWl0Rm9yU3BhY2UpOworCisvLyBTY3JpcHQgdG8gU2NyaXB0CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKXJzRm9yRWFjaChyc19zY3JpcHQsIHJzX2FsbG9jYXRpb24gaW5wdXQpOworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSlyc0ZvckVhY2gocnNfc2NyaXB0LCByc19hbGxvY2F0aW9uIGlucHV0LCByc19hbGxvY2F0aW9uIG91dHB1dCk7CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKXJzRm9yRWFjaChyc19zY3JpcHQsIHJzX2FsbG9jYXRpb24gaW5wdXQsIGludCB4U3RhcnQsIGludCB4RW5kKTsKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpcnNGb3JFYWNoKHJzX3NjcmlwdCwgcnNfYWxsb2NhdGlvbiBpbnB1dCwgcnNfYWxsb2NhdGlvbiBvdXRwdXQsIGludCB4U3RhcnQsIGludCB4RW5kKTsKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpcnNGb3JFYWNoKHJzX3NjcmlwdCwgcnNfYWxsb2NhdGlvbiBpbnB1dCwgaW50IHhTdGFydCwgaW50IHlTdGFydCwgaW50IHhFbmQsIGludCB5RW5kKTsKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpcnNGb3JFYWNoKHJzX3NjcmlwdCwgcnNfYWxsb2NhdGlvbiBpbnB1dCwgcnNfYWxsb2NhdGlvbiBvdXRwdXQsIGludCB4U3RhcnQsIGludCB5U3RhcnQsIGludCB4RW5kLCBpbnQgeUVuZCk7CisKIApkaWZmIC0tZ2l0IGEvbGlicy9ycy9zY3JpcHRjL3JzX3R5cGVzLnJzaCBiL2xpYnMvcnMvc2NyaXB0Yy9yc190eXBlcy5yc2gKaW5kZXggNDE5OGE3NC4uNjllMWFlZCAxMDA2NDQKLS0tIGEvbGlicy9ycy9zY3JpcHRjL3JzX3R5cGVzLnJzaAorKysgYi9saWJzL3JzL3NjcmlwdGMvcnNfdHlwZXMucnNoCkBAIC0yLDcwICsyLDcxIEBACiB0eXBlZGVmIGNoYXIgaW50OF90OwogdHlwZWRlZiBzaG9ydCBpbnQxNl90OwogdHlwZWRlZiBpbnQgaW50MzJfdDsKLS8vdHlwZWRlZiBsb25nIGludDY0X3Q7Cit0eXBlZGVmIGxvbmcgbG9uZyBpbnQ2NF90OwogCiB0eXBlZGVmIHVuc2lnbmVkIGNoYXIgdWludDhfdDsKIHR5cGVkZWYgdW5zaWduZWQgc2hvcnQgdWludDE2X3Q7CiB0eXBlZGVmIHVuc2lnbmVkIGludCB1aW50MzJfdDsKLS8vdHlwZWRlZiBsb25nIHVpbnQ2NF90OwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgdWludDY0X3Q7CiAKIHR5cGVkZWYgdWludDhfdCB1Y2hhcjsKIHR5cGVkZWYgdWludDE2X3QgdXNob3J0OwogdHlwZWRlZiB1aW50MzJfdCB1aW50OwotLy90eXBlZGVmIHVpbnQ2NF90IHVsb25nOwordHlwZWRlZiB1aW50NjRfdCB1bG9uZzsKIAotdHlwZWRlZiBpbnQgcnNfZWxlbWVudDsKLXR5cGVkZWYgaW50IHJzX3R5cGU7Ci10eXBlZGVmIGludCByc19hbGxvY2F0aW9uOwotdHlwZWRlZiBpbnQgcnNfc2FtcGxlcjsKLXR5cGVkZWYgaW50IHJzX3NjcmlwdDsKLXR5cGVkZWYgaW50IHJzX21lc2g7Ci10eXBlZGVmIGludCByc19wcm9ncmFtX2ZyYWdtZW50OwotdHlwZWRlZiBpbnQgcnNfcHJvZ3JhbV92ZXJ0ZXg7Ci10eXBlZGVmIGludCByc19wcm9ncmFtX3Jhc3RlcjsKLXR5cGVkZWYgaW50IHJzX3Byb2dyYW1fc3RvcmU7Cit0eXBlZGVmIHN0cnVjdCB7IGludCogcDsgfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQsIGFsaWduZWQoNCkpKSByc19lbGVtZW50OwordHlwZWRlZiBzdHJ1Y3QgeyBpbnQqIHA7IH0gX19hdHRyaWJ1dGVfXygocGFja2VkLCBhbGlnbmVkKDQpKSkgcnNfdHlwZTsKK3R5cGVkZWYgc3RydWN0IHsgaW50KiBwOyB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCwgYWxpZ25lZCg0KSkpIHJzX2FsbG9jYXRpb247Cit0eXBlZGVmIHN0cnVjdCB7IGludCogcDsgfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQsIGFsaWduZWQoNCkpKSByc19zYW1wbGVyOwordHlwZWRlZiBzdHJ1Y3QgeyBpbnQqIHA7IH0gX19hdHRyaWJ1dGVfXygocGFja2VkLCBhbGlnbmVkKDQpKSkgcnNfc2NyaXB0OwordHlwZWRlZiBzdHJ1Y3QgeyBpbnQqIHA7IH0gX19hdHRyaWJ1dGVfXygocGFja2VkLCBhbGlnbmVkKDQpKSkgcnNfbWVzaDsKK3R5cGVkZWYgc3RydWN0IHsgaW50KiBwOyB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCwgYWxpZ25lZCg0KSkpIHJzX3Byb2dyYW1fZnJhZ21lbnQ7Cit0eXBlZGVmIHN0cnVjdCB7IGludCogcDsgfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQsIGFsaWduZWQoNCkpKSByc19wcm9ncmFtX3ZlcnRleDsKK3R5cGVkZWYgc3RydWN0IHsgaW50KiBwOyB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCwgYWxpZ25lZCg0KSkpIHJzX3Byb2dyYW1fcmFzdGVyOwordHlwZWRlZiBzdHJ1Y3QgeyBpbnQqIHA7IH0gX19hdHRyaWJ1dGVfXygocGFja2VkLCBhbGlnbmVkKDQpKSkgcnNfcHJvZ3JhbV9zdG9yZTsKK3R5cGVkZWYgc3RydWN0IHsgaW50KiBwOyB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCwgYWxpZ25lZCg0KSkpIHJzX2ZvbnQ7CiAKIHR5cGVkZWYgZmxvYXQgZmxvYXQyIF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSgyKSkpOwogdHlwZWRlZiBmbG9hdCBmbG9hdDMgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDMpKSk7CiB0eXBlZGVmIGZsb2F0IGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoNCkpKTsKLXR5cGVkZWYgZmxvYXQgZmxvYXQ4IF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSg4KSkpOwotdHlwZWRlZiBmbG9hdCBmbG9hdDE2IF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSgxNikpKTsKIAogdHlwZWRlZiB1Y2hhciB1Y2hhcjIgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDIpKSk7CiB0eXBlZGVmIHVjaGFyIHVjaGFyMyBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoMykpKTsKIHR5cGVkZWYgdWNoYXIgdWNoYXI0IF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSg0KSkpOwotdHlwZWRlZiB1Y2hhciB1Y2hhcjggX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDgpKSk7Ci10eXBlZGVmIHVjaGFyIHVjaGFyMTYgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDE2KSkpOwogCiB0eXBlZGVmIHVzaG9ydCB1c2hvcnQyIF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSgyKSkpOwogdHlwZWRlZiB1c2hvcnQgdXNob3J0MyBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoMykpKTsKIHR5cGVkZWYgdXNob3J0IHVzaG9ydDQgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDQpKSk7Ci10eXBlZGVmIHVzaG9ydCB1c2hvcnQ4IF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSg4KSkpOwotdHlwZWRlZiB1c2hvcnQgdXNob3J0MTYgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDE2KSkpOwogCiB0eXBlZGVmIHVpbnQgdWludDIgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDIpKSk7CiB0eXBlZGVmIHVpbnQgdWludDMgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDMpKSk7CiB0eXBlZGVmIHVpbnQgdWludDQgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDQpKSk7Ci10eXBlZGVmIHVpbnQgdWludDggX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDgpKSk7Ci10eXBlZGVmIHVpbnQgdWludDE2IF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSgxNikpKTsKIAogdHlwZWRlZiBjaGFyIGNoYXIyIF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSgyKSkpOwogdHlwZWRlZiBjaGFyIGNoYXIzIF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSgzKSkpOwogdHlwZWRlZiBjaGFyIGNoYXI0IF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSg0KSkpOwotdHlwZWRlZiBjaGFyIGNoYXI4IF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSg4KSkpOwotdHlwZWRlZiBjaGFyIGNoYXIxNiBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoMTYpKSk7CiAKIHR5cGVkZWYgc2hvcnQgc2hvcnQyIF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSgyKSkpOwogdHlwZWRlZiBzaG9ydCBzaG9ydDMgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDMpKSk7CiB0eXBlZGVmIHNob3J0IHNob3J0NCBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoNCkpKTsKLXR5cGVkZWYgc2hvcnQgc2hvcnQ4IF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSg4KSkpOwotdHlwZWRlZiBzaG9ydCBzaG9ydDE2IF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSgxNikpKTsKIAogdHlwZWRlZiBpbnQgaW50MiBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoMikpKTsKIHR5cGVkZWYgaW50IGludDMgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDMpKSk7CiB0eXBlZGVmIGludCBpbnQ0IF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSg0KSkpOwotdHlwZWRlZiBpbnQgaW50OCBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoOCkpKTsKLXR5cGVkZWYgaW50IGludDE2IF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSgxNikpKTsKIAogCit0eXBlZGVmIHN0cnVjdCB7CisgICAgZmxvYXQgbVsxNl07Cit9IHJzX21hdHJpeDR4NDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGZsb2F0IG1bOV07Cit9IHJzX21hdHJpeDN4MzsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGZsb2F0IG1bNF07Cit9IHJzX21hdHJpeDJ4MjsKKworCisjZGVmaW5lIFJTX1BBQ0tFRCBfX2F0dHJpYnV0ZV9fKChwYWNrZWQsIGFsaWduZWQoNCkpKQogCmRpZmYgLS1naXQgYS9saWJzL3V0aWxzL1Jlc291cmNlVHlwZXMuY3BwIGIvbGlicy91dGlscy9SZXNvdXJjZVR5cGVzLmNwcAppbmRleCBhMTQwMWFkLi40MzYyZDE0IDEwMDY0NAotLS0gYS9saWJzL3V0aWxzL1Jlc291cmNlVHlwZXMuY3BwCisrKyBiL2xpYnMvdXRpbHMvUmVzb3VyY2VUeXBlcy5jcHAKQEAgLTMxNyw2ICszMTcsMTIgQEAKICAgICAgICAgICAgIG1TdHJpbmdQb29sU2l6ZSA9CiAgICAgICAgICAgICAgICAgKG1IZWFkZXItPmhlYWRlci5zaXplLW1IZWFkZXItPnN0cmluZ3NTdGFydCkvY2hhclNpemU7CiAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBjaGVjayBpbnZhcmlhbnQ6IHN0eWxlcyBzdGFydHMgYmVmb3JlIGVuZCBvZiBkYXRhCisgICAgICAgICAgICBpZiAobUhlYWRlci0+c3R5bGVzU3RhcnQgPj0gKG1IZWFkZXItPmhlYWRlci5zaXplLXNpemVvZih1aW50MTZfdCkpKSB7CisgICAgICAgICAgICAgICAgTE9HVygiQmFkIHN0eWxlIGJsb2NrOiBzdHlsZSBibG9jayBzdGFydHMgYXQgJWQgcGFzdCBkYXRhIHNpemUgb2YgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgIChpbnQpbUhlYWRlci0+c3R5bGVzU3RhcnQsIChpbnQpbUhlYWRlci0+aGVhZGVyLnNpemUpOworICAgICAgICAgICAgICAgIHJldHVybiAobUVycm9yPUJBRF9UWVBFKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vIGNoZWNrIGludmFyaWFudDogc3R5bGVzIGZvbGxvdyB0aGUgc3RyaW5ncwogICAgICAgICAgICAgaWYgKG1IZWFkZXItPnN0eWxlc1N0YXJ0IDw9IG1IZWFkZXItPnN0cmluZ3NTdGFydCkgewogICAgICAgICAgICAgICAgIExPR1coIkJhZCBzdHlsZSBibG9jazogc3R5bGUgYmxvY2sgc3RhcnRzIGF0ICVkLCBiZWZvcmUgc3RyaW5ncyBhdCAlZFxuIiwKQEAgLTE4NzgsNiArMTg4NCwxMiBAQAogICAgICAgICBvdXROYW1lLT50eXBlID0gZ3JwLT5iYXNlUGFja2FnZS0+dHlwZVN0cmluZ3Muc3RyaW5nQXQodCwgJm91dE5hbWUtPnR5cGVMZW4pOwogICAgICAgICBvdXROYW1lLT5uYW1lID0gZ3JwLT5iYXNlUGFja2FnZS0+a2V5U3RyaW5ncy5zdHJpbmdBdCgKICAgICAgICAgICAgIGR0b2hsKGVudHJ5LT5rZXkuaW5kZXgpLCAmb3V0TmFtZS0+bmFtZUxlbik7CisKKyAgICAgICAgLy8gSWYgd2UgaGF2ZSBhIGJhZCBpbmRleCBmb3Igc29tZSByZWFzb24sIHdlIHNob3VsZCBhYm9ydC4KKyAgICAgICAgaWYgKG91dE5hbWUtPnR5cGUgPT0gTlVMTCB8fCBvdXROYW1lLT5uYW1lID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIApAQCAtMjYwOSw2ICsyNjIxLDI0IEBACiAgICAgICAgICpvdXRUeXBlID0gKmRlZlR5cGU7CiAgICAgfQogICAgICpvdXROYW1lID0gU3RyaW5nMTYocCwgZW5kLXApOworICAgIGlmKCoqb3V0UGFja2FnZSA9PSAwKSB7CisgICAgICAgIGlmKG91dEVycm9yTXNnKSB7CisgICAgICAgICAgICAqb3V0RXJyb3JNc2cgPSAiUmVzb3VyY2UgcGFja2FnZSBjYW5ub3QgYmUgYW4gZW1wdHkgc3RyaW5nIjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmKCoqb3V0VHlwZSA9PSAwKSB7CisgICAgICAgIGlmKG91dEVycm9yTXNnKSB7CisgICAgICAgICAgICAqb3V0RXJyb3JNc2cgPSAiUmVzb3VyY2UgdHlwZSBjYW5ub3QgYmUgYW4gZW1wdHkgc3RyaW5nIjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmKCoqb3V0TmFtZSA9PSAwKSB7CisgICAgICAgIGlmKG91dEVycm9yTXNnKSB7CisgICAgICAgICAgICAqb3V0RXJyb3JNc2cgPSAiUmVzb3VyY2UgaWQgY2Fubm90IGJlIGFuIGVtcHR5IHN0cmluZyI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KICAgICByZXR1cm4gdHJ1ZTsKIH0KIApAQCAtNDEyNywxMyArNDE1NywxNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoMHgwMGZmMDAwMCAmICgodHlwZUluZGV4KzEpPDwxNikpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICgweDAwMDBmZmZmICYgKGVudHJ5SW5kZXgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlX25hbWUgcmVzTmFtZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPmdldFJlc291cmNlTmFtZShyZXNJRCwgJnJlc05hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIgICAgICBzcGVjIHJlc291cmNlIDB4JTA4eCAlczolcy8lczogZmxhZ3M9MHglMDh4XG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc0lELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIQVIxNl9UT19DU1RSKHJlc05hbWUucGFja2FnZSwgcmVzTmFtZS5wYWNrYWdlTGVuKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEFSMTZfVE9fQ1NUUihyZXNOYW1lLnR5cGUsIHJlc05hbWUudHlwZUxlbiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hBUjE2X1RPX0NTVFIocmVzTmFtZS5uYW1lLCByZXNOYW1lLm5hbWVMZW4pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR0b2hsKHR5cGVDb25maWdzLT50eXBlU3BlY0ZsYWdzW2VudHJ5SW5kZXhdKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy0+Z2V0UmVzb3VyY2VOYW1lKHJlc0lELCAmcmVzTmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIiAgICAgIHNwZWMgcmVzb3VyY2UgMHglMDh4ICVzOiVzLyVzOiBmbGFncz0weCUwOHhcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEFSMTZfVE9fQ1NUUihyZXNOYW1lLnBhY2thZ2UsIHJlc05hbWUucGFja2FnZUxlbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIQVIxNl9UT19DU1RSKHJlc05hbWUudHlwZSwgcmVzTmFtZS50eXBlTGVuKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hBUjE2X1RPX0NTVFIocmVzTmFtZS5uYW1lLCByZXNOYW1lLm5hbWVMZW4pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdG9obCh0eXBlQ29uZmlncy0+dHlwZVNwZWNGbGFnc1tlbnRyeUluZGV4XSkpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIiAgICAgIElOVkFMSUQgVFlQRSBDT05GSUcgRk9SIFJFU09VUkNFIDB4JTA4eFxuIiwgcmVzSUQpOworICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGNvbmZpZ0luZGV4PTA7IGNvbmZpZ0luZGV4PE5UQzsgY29uZmlnSW5kZXgrKykgewpAQCAtNDM0MCwxMSArNDM3MywxNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoMHgwMGZmMDAwMCAmICgodHlwZUluZGV4KzEpPDwxNikpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICgweDAwMDBmZmZmICYgKGVudHJ5SW5kZXgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlX25hbWUgcmVzTmFtZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPmdldFJlc291cmNlTmFtZShyZXNJRCwgJnJlc05hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIgICAgICAgIHJlc291cmNlIDB4JTA4eCAlczolcy8lczogIiwgcmVzSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIQVIxNl9UT19DU1RSKHJlc05hbWUucGFja2FnZSwgcmVzTmFtZS5wYWNrYWdlTGVuKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hBUjE2X1RPX0NTVFIocmVzTmFtZS50eXBlLCByZXNOYW1lLnR5cGVMZW4pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEFSMTZfVE9fQ1NUUihyZXNOYW1lLm5hbWUsIHJlc05hbWUubmFtZUxlbikpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMtPmdldFJlc291cmNlTmFtZShyZXNJRCwgJnJlc05hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIgICAgICAgIHJlc291cmNlIDB4JTA4eCAlczolcy8lczogIiwgcmVzSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEFSMTZfVE9fQ1NUUihyZXNOYW1lLnBhY2thZ2UsIHJlc05hbWUucGFja2FnZUxlbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEFSMTZfVE9fQ1NUUihyZXNOYW1lLnR5cGUsIHJlc05hbWUudHlwZUxlbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEFSMTZfVE9fQ1NUUihyZXNOYW1lLm5hbWUsIHJlc05hbWUubmFtZUxlbikpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIiAgICAgICAgSU5WQUxJRCBSRVNPVVJDRSAweCUwOHg6ICIsIHJlc0lEKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodGhpc09mZnNldCYweDMpICE9IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIk5PTi1JTlRFR0VSIE9GRlNFVDogJXBcbiIsICh2b2lkKil0aGlzT2Zmc2V0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKQEAgLTQ0MDIsMTggKzQ0MzgsMTkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRfdmFsdWUocGtnLCB2YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChiYWdQdHIgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgTiA9IGR0b2hsKGJhZ1B0ci0+Y291bnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSZXNUYWJsZV9tYXAqIG1hcFB0ciA9IChjb25zdCBSZXNUYWJsZV9tYXAqKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKGNvbnN0IHVpbnQ4X3QqKWVudCkgKyBlc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGJhc2VNYXBQdHIgPSAoY29uc3QgdWludDhfdCopZW50OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbWFwT2Zmc2V0ID0gZXNpemU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJlc1RhYmxlX21hcCogbWFwUHRyID0gKFJlc1RhYmxlX21hcCopKGJhc2VNYXBQdHIrbWFwT2Zmc2V0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIgICAgICAgICAgUGFyZW50PTB4JTA4eCwgQ291bnQ9JWRcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdG9obChiYWdQdHItPnBhcmVudC5pZGVudCksIE4pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8TjsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxOICYmIG1hcE9mZnNldCA8ICh0eXBlU2l6ZS1zaXplb2YoUmVzVGFibGVfbWFwKSk7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIgICAgICAgICAgIyVpIChLZXk9MHglMDh4KTogIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLCBkdG9obChtYXBQdHItPm5hbWUuaWRlbnQpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLmNvcHlGcm9tX2R0b2gobWFwUHRyLT52YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludF92YWx1ZShwa2csIHZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNpemVfdCBzaXplID0gZHRvaHMobWFwUHRyLT52YWx1ZS5zaXplKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcFB0ciA9IChSZXNUYWJsZV9tYXAqKSgoKGNvbnN0IHVpbnQ4X3QqKW1hcFB0cikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzaXplICsgc2l6ZW9mKCptYXBQdHIpLXNpemVvZihtYXBQdHItPnZhbHVlKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBPZmZzZXQgKz0gc2l6ZSArIHNpemVvZigqbWFwUHRyKS1zaXplb2YobWFwUHRyLT52YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBQdHIgPSAoUmVzVGFibGVfbWFwKikoYmFzZU1hcFB0cittYXBPZmZzZXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL0F1ZGlvTWFuYWdlci5qYXZhIGIvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL0F1ZGlvTWFuYWdlci5qYXZhCmluZGV4IGJiYmJhNzQuLmIyM2RjZGUgMTAwNjQ0Ci0tLSBhL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9BdWRpb01hbmFnZXIuamF2YQorKysgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvQXVkaW9NYW5hZ2VyLmphdmEKQEAgLTE1MjUsNCArMTUyNSwyMiBAQAogICAgICAgKiB7QGhpZGV9CiAgICAgICAqLwogICAgICBwcml2YXRlIElCaW5kZXIgbUlDYWxsQmFjayA9IG5ldyBCaW5kZXIoKTsKKworICAgIC8qKgorICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBwaG9uZSBpcyBpbiBzaWxlbnQgbW9kZSwgd2l0aCBvciB3aXRob3V0IHZpYnJhdGUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgcGhvbmUgaXMgaW4gc2lsZW50IG1vZGUsIHdpdGggb3Igd2l0aG91dCB2aWJyYXRlLgorICAgICAqCisgICAgICogQHNlZSAjZ2V0UmluZ2VyTW9kZSgpCisgICAgICoKKyAgICAgKiBAaGlkZSBwZW5kaW5nIEFQSSBDb3VuY2lsIGFwcHJvdmFsCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNTaWxlbnRNb2RlKCkgeworICAgICAgICBpbnQgcmluZ2VyTW9kZSA9IGdldFJpbmdlck1vZGUoKTsKKyAgICAgICAgYm9vbGVhbiBzaWxlbnRNb2RlID0KKyAgICAgICAgICAgIChyaW5nZXJNb2RlID09IFJJTkdFUl9NT0RFX1NJTEVOVCkgfHwKKyAgICAgICAgICAgIChyaW5nZXJNb2RlID09IFJJTkdFUl9NT0RFX1ZJQlJBVEUpOworICAgICAgICByZXR1cm4gc2lsZW50TW9kZTsKKyAgICB9CisKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9NdHBDbGllbnQuamF2YSBiL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9NdHBDbGllbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTE4MmJkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL010cENsaWVudC5qYXZhCkBAIC0wLDAgKzEsMTEzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm1lZGlhOworCitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworLyoqCisgKiB7QGhpZGV9CisgKi8KK3B1YmxpYyBjbGFzcyBNdHBDbGllbnQgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJNdHBDbGllbnQiOworCisgICAgcHJpdmF0ZSBmaW5hbCBMaXN0ZW5lciBtTGlzdGVuZXI7CisKKyAgICBzdGF0aWMgeworICAgICAgICBTeXN0ZW0ubG9hZExpYnJhcnkoIm1lZGlhX2puaSIpOworICAgIH0KKworICAgIHB1YmxpYyBNdHBDbGllbnQoTGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICAgICAgbmF0aXZlX3NldHVwKCk7CisgICAgICAgIGlmIChsaXN0ZW5lciA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIk10cENsaWVudDogbGlzdGVuZXIgaXMgbnVsbCIpOworICAgICAgICB9CisgICAgICAgIG1MaXN0ZW5lciA9IGxpc3RlbmVyOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkgeworICAgICAgICBuYXRpdmVfZmluYWxpemUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzdGFydCgpIHsKKyAgICAgICAgbUV2ZW50VGhyZWFkID0gbmV3IE10cEV2ZW50VGhyZWFkKCk7CisgICAgICAgIG1FdmVudFRocmVhZC5zdGFydCgpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGRlbGV0ZU9iamVjdChpbnQgZGV2aWNlSUQsIGludCBvYmplY3RJRCkgeworICAgICAgICByZXR1cm4gbmF0aXZlX2RlbGV0ZV9vYmplY3QoZGV2aWNlSUQsIG9iamVjdElEKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFBhcmVudChpbnQgZGV2aWNlSUQsIGludCBvYmplY3RJRCkgeworICAgICAgICByZXR1cm4gbmF0aXZlX2dldF9wYXJlbnQoZGV2aWNlSUQsIG9iamVjdElEKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFN0b3JhZ2VJRChpbnQgZGV2aWNlSUQsIGludCBvYmplY3RJRCkgeworICAgICAgICByZXR1cm4gbmF0aXZlX2dldF9zdG9yYWdlX2lkKGRldmljZUlELCBvYmplY3RJRCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBNdHBFdmVudFRocmVhZCBleHRlbmRzIFRocmVhZCB7CisKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1Eb25lOworCisgICAgICAgIHB1YmxpYyBNdHBFdmVudFRocmVhZCgpIHsKKyAgICAgICAgICAgIHN1cGVyKCJNdHBFdmVudFRocmVhZCIpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgTG9nLmQoVEFHLCAiTXRwRXZlbnRUaHJlYWQgc3RhcnRpbmciKTsKKyAgICAgICAgICAgIHdoaWxlICghbURvbmUpIHsKKyAgICAgICAgICAgICAgICAvLyB0aGlzIHdpbGwgd2FpdCBmb3IgYW4gZXZlbnQgZnJvbSBhbiBNVFAgZGV2aWNlCisgICAgICAgICAgICAgICAgbmF0aXZlX3dhaXRfZm9yX2V2ZW50KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBMb2cuZChUQUcsICJNdHBFdmVudFRocmVhZCBleGl0aW5nIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgaW50ZXJmYWNlIExpc3RlbmVyIHsKKyAgICAgICAgLy8gY2FsbGVkIHdoZW4gYSBuZXcgTVRQIGRldmljZSBoYXMgYmVlbiBkaXNjb3ZlcmVkCisgICAgICAgIHZvaWQgZGV2aWNlQWRkZWQoaW50IGlkKTsKKworICAgICAgICAvLyBjYWxsZWQgd2hlbiBhbiBNVFAgZGV2aWNlIGhhcyBiZWVuIHJlbW92ZWQKKyAgICAgICAgdm9pZCBkZXZpY2VSZW1vdmVkKGludCBpZCk7CisgICAgfQorCisgICAgLy8gY2FsbGVkIGZyb20gbmF0aXZlIGNvZGUKKyAgICBwcml2YXRlIHZvaWQgZGV2aWNlQWRkZWQoaW50IGlkKSB7CisgICAgICAgIExvZy5kKFRBRywgImRldmljZUFkZGVkICIgKyBpZCk7CisgICAgICAgIG1MaXN0ZW5lci5kZXZpY2VBZGRlZChpZCk7CisgICAgfQorCisgICAgLy8gY2FsbGVkIGZyb20gbmF0aXZlIGNvZGUKKyAgICBwcml2YXRlIHZvaWQgZGV2aWNlUmVtb3ZlZChpbnQgaWQpIHsKKyAgICAgICAgTG9nLmQoVEFHLCAiZGV2aWNlUmVtb3ZlZCAiICsgaWQpOworICAgICAgICBtTGlzdGVuZXIuZGV2aWNlUmVtb3ZlZChpZCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBNdHBFdmVudFRocmVhZCBtRXZlbnRUaHJlYWQ7CisKKyAgICAvLyB1c2VkIGJ5IHRoZSBKTkkgY29kZQorICAgIHByaXZhdGUgaW50IG1OYXRpdmVDb250ZXh0OworCisgICAgcHJpdmF0ZSBuYXRpdmUgZmluYWwgdm9pZCBuYXRpdmVfc2V0dXAoKTsKKyAgICBwcml2YXRlIG5hdGl2ZSBmaW5hbCB2b2lkIG5hdGl2ZV9maW5hbGl6ZSgpOworICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgbmF0aXZlX3dhaXRfZm9yX2V2ZW50KCk7CisgICAgcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiBuYXRpdmVfZGVsZXRlX29iamVjdChpbnQgZGV2aWNlSUQsIGludCBvYmplY3RJRCk7CisgICAgcHJpdmF0ZSBuYXRpdmUgaW50IG5hdGl2ZV9nZXRfcGFyZW50KGludCBkZXZpY2VJRCwgaW50IG9iamVjdElEKTsKKyAgICBwcml2YXRlIG5hdGl2ZSBpbnQgbmF0aXZlX2dldF9zdG9yYWdlX2lkKGludCBkZXZpY2VJRCwgaW50IG9iamVjdElEKTsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvTXRwQ3Vyc29yLmphdmEgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvTXRwQ3Vyc29yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmVjZmQwZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9NdHBDdXJzb3IuamF2YQpAQCAtMCwwICsxLDIyMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYTsKKworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQWJzdHJhY3RXaW5kb3dlZEN1cnNvcjsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcldpbmRvdzsKK2ltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLk10cDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CisKKy8qKgorICAqIEN1cnNvciBjbGFzcyBmb3IgTVRQIGNvbnRlbnQgcHJvdmlkZXIKKyAgKiBAaGlkZQorICAqLworcHVibGljIGZpbmFsIGNsYXNzIE10cEN1cnNvciBleHRlbmRzIEFic3RyYWN0V2luZG93ZWRDdXJzb3IgeworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIk10cEN1cnNvciI7CisgICAgc3RhdGljIGZpbmFsIGludCBOT19DT1VOVCA9IC0xOworCisgICAgLyogY29uc3RhbnRzIGZvciBtUXVlcnlUeXBlICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVWSUNFICAgICAgICAgICAgICA9IDE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVWSUNFX0lEICAgICAgICAgICA9IDI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RPUkFHRSAgICAgICAgICAgICA9IDM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RPUkFHRV9JRCAgICAgICAgICA9IDQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT0JKRUNUICAgICAgICAgICAgICA9IDU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT0JKRUNUX0lEICAgICAgICAgICA9IDY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RPUkFHRV9DSElMRFJFTiAgICA9IDc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT0JKRUNUX0NISUxEUkVOICAgICA9IDg7CisKKyAgICBwcml2YXRlIGludCBtUXVlcnlUeXBlOworICAgIHByaXZhdGUgaW50IG1EZXZpY2VJRDsKKyAgICBwcml2YXRlIGludCBtU3RvcmFnZUlEOworICAgIHByaXZhdGUgaW50IG1RYmplY3RJRDsKKworICAgIC8qKiBUaGUgbmFtZXMgb2YgdGhlIGNvbHVtbnMgaW4gdGhlIHByb2plY3Rpb24gKi8KKyAgICBwcml2YXRlIFN0cmluZ1tdIG1Db2x1bW5zOworCisgICAgLyoqIFRoZSBudW1iZXIgb2Ygcm93cyBpbiB0aGUgY3Vyc29yICovCisgICAgcHJpdmF0ZSBpbnQgbUNvdW50ID0gTk9fQ09VTlQ7CisKKyAgICBwcml2YXRlIGZpbmFsIE10cENsaWVudCBtQ2xpZW50OworCisgICAgcHVibGljIE10cEN1cnNvcihNdHBDbGllbnQgY2xpZW50LCBpbnQgcXVlcnlUeXBlLCBpbnQgZGV2aWNlSUQsIGludCBzdG9yYWdlSUQsIGludCBvYmplY3RJRCwKKyAgICAgICAgICAgIFN0cmluZ1tdIHByb2plY3Rpb24pIHsKKworICAgICAgICBtQ2xpZW50ID0gY2xpZW50OworICAgICAgICBtUXVlcnlUeXBlID0gcXVlcnlUeXBlOworICAgICAgICBtRGV2aWNlSUQgPSBkZXZpY2VJRDsKKyAgICAgICAgbVN0b3JhZ2VJRCA9IHN0b3JhZ2VJRDsKKyAgICAgICAgbVFiamVjdElEID0gb2JqZWN0SUQ7CisgICAgICAgIG1Db2x1bW5zID0gcHJvamVjdGlvbjsKKworICAgICAgICBIYXNoTWFwPFN0cmluZywgSW50ZWdlcj4gbWFwOworICAgICAgICBzd2l0Y2ggKHF1ZXJ5VHlwZSkgeworICAgICAgICAgICAgY2FzZSBERVZJQ0U6CisgICAgICAgICAgICBjYXNlIERFVklDRV9JRDoKKyAgICAgICAgICAgICAgICBtYXAgPSBzRGV2aWNlUHJvamVjdGlvbk1hcDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgU1RPUkFHRToKKyAgICAgICAgICAgIGNhc2UgU1RPUkFHRV9JRDoKKyAgICAgICAgICAgICAgICBtYXAgPSBzU3RvcmFnZVByb2plY3Rpb25NYXA7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9CSkVDVDoKKyAgICAgICAgICAgIGNhc2UgT0JKRUNUX0lEOgorICAgICAgICAgICAgY2FzZSBTVE9SQUdFX0NISUxEUkVOOgorICAgICAgICAgICAgY2FzZSBPQkpFQ1RfQ0hJTERSRU46CisgICAgICAgICAgICAgICAgbWFwID0gc09iamVjdFByb2plY3Rpb25NYXA7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInVua25vd24gcXVlcnkgdHlwZSAiICArIHF1ZXJ5VHlwZSk7CisgICAgICAgIH0KKworICAgICAgICBpbnRbXSBjb2x1bW5zID0gbmV3IGludFtwcm9qZWN0aW9uLmxlbmd0aF07CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvamVjdGlvbi5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgSW50ZWdlciBpZCA9IG1hcC5nZXQocHJvamVjdGlvbltpXSk7CisgICAgICAgICAgICBpZiAoaWQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInVua25vd24gY29sdW1uICIgICsgcHJvamVjdGlvbltpXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb2x1bW5zW2ldID0gaWQuaW50VmFsdWUoKTsKKyAgICAgICAgfQorICAgICAgICBuYXRpdmVfc2V0dXAoY2xpZW50LCBxdWVyeVR5cGUsIGRldmljZUlELCBzdG9yYWdlSUQsIG9iamVjdElELCBjb2x1bW5zKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpIHsKKyAgICAgICAgbmF0aXZlX2ZpbmFsaXplKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBnZXRDb3VudCgpIHsKKyAgICAgICAgaWYgKG1Db3VudCA9PSBOT19DT1VOVCkgeworICAgICAgICAgICAgZmlsbFdpbmRvdygwKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbUNvdW50OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIHJlcXVlcnkoKSB7CisgICAgICAgIExvZy5kKFRBRywgInJlcXVlcnkiKTsKKyAgICAgICAgbUNvdW50ID0gTk9fQ09VTlQ7CisgICAgICAgIGlmIChtV2luZG93ICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1XaW5kb3cuY2xlYXIoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3VwZXIucmVxdWVyeSgpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBmaWxsV2luZG93KGludCBzdGFydFBvcykgeworICAgICAgICBpZiAobVdpbmRvdyA9PSBudWxsKSB7CisgICAgICAgICAgICAvLyBJZiB0aGVyZSBpc24ndCBhIHdpbmRvdyBzZXQgYWxyZWFkeSBpdCB3aWxsIG9ubHkgYmUgYWNjZXNzZWQgbG9jYWxseQorICAgICAgICAgICAgbVdpbmRvdyA9IG5ldyBDdXJzb3JXaW5kb3codHJ1ZSAvKiB0aGUgd2luZG93IGlzIGxvY2FsIG9ubHkgKi8pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1XaW5kb3cuY2xlYXIoKTsKKyAgICAgICAgfQorICAgICAgICBtV2luZG93LnNldFN0YXJ0UG9zaXRpb24oc3RhcnRQb3MpOworICAgICAgICBtQ291bnQgPSBuYXRpdmVfZmlsbF93aW5kb3cobVdpbmRvdywgc3RhcnRQb3MpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRDb2x1bW5OYW1lcygpIHsKKyAgICAgICAgTG9nLmQoVEFHLCAiZ2V0Q29sdW1uTmFtZXMgcmV0dXJuaW5nICIgKyBtQ29sdW1ucyk7CisgICAgICAgIHJldHVybiBtQ29sdW1uczsKKyAgICB9CisKKyAgICAvKiBEZXZpY2UgQ29sdW1uIElEcyAqLworICAgICAvKiBUaGVzZSBtdXN0IG1hdGNoIHRoZSB2YWx1ZXMgaW4gTXRwQ3Vyc29yLmNwcCAqLworICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFVklDRV9ST1dfSUQgICAgICAgICAgPSAxOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERVZJQ0VfTUFOVUZBQ1RVUkVSICAgID0gMjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVWSUNFX01PREVMICAgICAgICAgICA9IDM7CisKKyAgICAvKiBTdG9yYWdlIENvbHVtbiBJRHMgKi8KKyAgICAvKiBUaGVzZSBtdXN0IG1hdGNoIHRoZSB2YWx1ZXMgaW4gTXRwQ3Vyc29yLmNwcCAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVE9SQUdFX1JPV19JRCAgICAgICAgID0gMTAxOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVE9SQUdFX0lERU5USUZJRVIgICAgID0gMTAyOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVE9SQUdFX0RFU0NSSVBUSU9OICAgID0gMTAzOworCisgICAgLyogT2JqZWN0IENvbHVtbiBJRHMgKi8KKyAgICAvKiBUaGVzZSBtdXN0IG1hdGNoIHRoZSB2YWx1ZXMgaW4gTXRwQ3Vyc29yLmNwcCAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBPQkpFQ1RfUk9XX0lEICAgICAgICAgICAgICA9IDIwMTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgT0JKRUNUX1NUT1JBR0VfSUQgICAgICAgICAgPSAyMDI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE9CSkVDVF9GT1JNQVQgICAgICAgICAgICAgID0gMjAzOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBPQkpFQ1RfUFJPVEVDVElPTl9TVEFUVVMgICA9IDIwNDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgT0JKRUNUX1NJWkUgICAgICAgICAgICAgICAgPSAyMDU7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE9CSkVDVF9USFVNQl9GT1JNQVQgICAgICAgID0gMjA2OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBPQkpFQ1RfVEhVTUJfU0laRSAgICAgICAgICA9IDIwNzsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgT0JKRUNUX1RIVU1CX1dJRFRIICAgICAgICAgPSAyMDg7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE9CSkVDVF9USFVNQl9IRUlHSFQgICAgICAgID0gMjA5OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBPQkpFQ1RfSU1BR0VfV0lEVEggICAgICAgICA9IDIxMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgT0JKRUNUX0lNQUdFX0hFSUdIVCAgICAgICAgPSAyMTE7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE9CSkVDVF9JTUFHRV9ERVBUSCAgICAgICAgID0gMjEyOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBPQkpFQ1RfUEFSRU5UICAgICAgICAgICAgICA9IDIxMzsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgT0JKRUNUX0FTU09DSUFUSU9OX1RZUEUgICAgPSAyMTQ7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE9CSkVDVF9BU1NPQ0lBVElPTl9ERVNDICAgID0gMjE1OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBPQkpFQ1RfU0VRVUVOQ0VfTlVNQkVSICAgICA9IDIxNjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgT0JKRUNUX05BTUUgICAgICAgICAgICAgICAgPSAyMTc7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE9CSkVDVF9EQVRFX0NSRUFURUQgICAgICAgID0gMjE4OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBPQkpFQ1RfREFURV9NT0RJRklFRCAgICAgICA9IDIxOTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgT0JKRUNUX0tFWVdPUkRTICAgICAgICAgICAgPSAyMjA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE9CSkVDVF9USFVNQiAgICAgICAgICAgICAgID0gMjIxOworCisgICAgcHJpdmF0ZSBzdGF0aWMgSGFzaE1hcDxTdHJpbmcsIEludGVnZXI+IHNEZXZpY2VQcm9qZWN0aW9uTWFwOworICAgIHByaXZhdGUgc3RhdGljIEhhc2hNYXA8U3RyaW5nLCBJbnRlZ2VyPiBzU3RvcmFnZVByb2plY3Rpb25NYXA7CisgICAgcHJpdmF0ZSBzdGF0aWMgSGFzaE1hcDxTdHJpbmcsIEludGVnZXI+IHNPYmplY3RQcm9qZWN0aW9uTWFwOworCisgICAgc3RhdGljIHsKKyAgICAgICAgc0RldmljZVByb2plY3Rpb25NYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEludGVnZXI+KCk7CisgICAgICAgIHNEZXZpY2VQcm9qZWN0aW9uTWFwLnB1dChNdHAuRGV2aWNlLl9JRCwgbmV3IEludGVnZXIoREVWSUNFX1JPV19JRCkpOworICAgICAgICBzRGV2aWNlUHJvamVjdGlvbk1hcC5wdXQoTXRwLkRldmljZS5NQU5VRkFDVFVSRVIsIG5ldyBJbnRlZ2VyKERFVklDRV9NQU5VRkFDVFVSRVIpKTsKKyAgICAgICAgc0RldmljZVByb2plY3Rpb25NYXAucHV0KE10cC5EZXZpY2UuTU9ERUwsIG5ldyBJbnRlZ2VyKERFVklDRV9NT0RFTCkpOworCisgICAgICAgIHNTdG9yYWdlUHJvamVjdGlvbk1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgSW50ZWdlcj4oKTsKKyAgICAgICAgc1N0b3JhZ2VQcm9qZWN0aW9uTWFwLnB1dChNdHAuU3RvcmFnZS5fSUQsIG5ldyBJbnRlZ2VyKFNUT1JBR0VfUk9XX0lEKSk7CisgICAgICAgIHNTdG9yYWdlUHJvamVjdGlvbk1hcC5wdXQoTXRwLlN0b3JhZ2UuSURFTlRJRklFUiwgbmV3IEludGVnZXIoU1RPUkFHRV9JREVOVElGSUVSKSk7CisgICAgICAgIHNTdG9yYWdlUHJvamVjdGlvbk1hcC5wdXQoTXRwLlN0b3JhZ2UuREVTQ1JJUFRJT04sIG5ldyBJbnRlZ2VyKFNUT1JBR0VfREVTQ1JJUFRJT04pKTsKKworICAgICAgICBzT2JqZWN0UHJvamVjdGlvbk1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgSW50ZWdlcj4oKTsKKyAgICAgICAgc09iamVjdFByb2plY3Rpb25NYXAucHV0KE10cC5PYmplY3QuX0lELCBuZXcgSW50ZWdlcihPQkpFQ1RfUk9XX0lEKSk7CisgICAgICAgIHNPYmplY3RQcm9qZWN0aW9uTWFwLnB1dChNdHAuT2JqZWN0LlNUT1JBR0VfSUQsIG5ldyBJbnRlZ2VyKE9CSkVDVF9TVE9SQUdFX0lEKSk7CisgICAgICAgIHNPYmplY3RQcm9qZWN0aW9uTWFwLnB1dChNdHAuT2JqZWN0LkZPUk1BVCwgbmV3IEludGVnZXIoT0JKRUNUX0ZPUk1BVCkpOworICAgICAgICBzT2JqZWN0UHJvamVjdGlvbk1hcC5wdXQoTXRwLk9iamVjdC5QUk9URUNUSU9OX1NUQVRVUywgbmV3IEludGVnZXIoT0JKRUNUX1BST1RFQ1RJT05fU1RBVFVTKSk7CisgICAgICAgIHNPYmplY3RQcm9qZWN0aW9uTWFwLnB1dChNdHAuT2JqZWN0LlNJWkUsIG5ldyBJbnRlZ2VyKE9CSkVDVF9TSVpFKSk7CisgICAgICAgIHNPYmplY3RQcm9qZWN0aW9uTWFwLnB1dChNdHAuT2JqZWN0LlRIVU1CX0ZPUk1BVCwgbmV3IEludGVnZXIoT0JKRUNUX1RIVU1CX0ZPUk1BVCkpOworICAgICAgICBzT2JqZWN0UHJvamVjdGlvbk1hcC5wdXQoTXRwLk9iamVjdC5USFVNQl9TSVpFLCBuZXcgSW50ZWdlcihPQkpFQ1RfVEhVTUJfU0laRSkpOworICAgICAgICBzT2JqZWN0UHJvamVjdGlvbk1hcC5wdXQoTXRwLk9iamVjdC5USFVNQl9XSURUSCwgbmV3IEludGVnZXIoT0JKRUNUX1RIVU1CX1dJRFRIKSk7CisgICAgICAgIHNPYmplY3RQcm9qZWN0aW9uTWFwLnB1dChNdHAuT2JqZWN0LlRIVU1CX0hFSUdIVCwgbmV3IEludGVnZXIoT0JKRUNUX1RIVU1CX0hFSUdIVCkpOworICAgICAgICBzT2JqZWN0UHJvamVjdGlvbk1hcC5wdXQoTXRwLk9iamVjdC5JTUFHRV9XSURUSCwgbmV3IEludGVnZXIoT0JKRUNUX0lNQUdFX1dJRFRIKSk7CisgICAgICAgIHNPYmplY3RQcm9qZWN0aW9uTWFwLnB1dChNdHAuT2JqZWN0LklNQUdFX0hFSUdIVCwgbmV3IEludGVnZXIoT0JKRUNUX0lNQUdFX0hFSUdIVCkpOworICAgICAgICBzT2JqZWN0UHJvamVjdGlvbk1hcC5wdXQoTXRwLk9iamVjdC5JTUFHRV9ERVBUSCwgbmV3IEludGVnZXIoT0JKRUNUX0lNQUdFX0RFUFRIKSk7CisgICAgICAgIHNPYmplY3RQcm9qZWN0aW9uTWFwLnB1dChNdHAuT2JqZWN0LlBBUkVOVCwgbmV3IEludGVnZXIoT0JKRUNUX1BBUkVOVCkpOworICAgICAgICBzT2JqZWN0UHJvamVjdGlvbk1hcC5wdXQoTXRwLk9iamVjdC5BU1NPQ0lBVElPTl9UWVBFLCBuZXcgSW50ZWdlcihPQkpFQ1RfQVNTT0NJQVRJT05fVFlQRSkpOworICAgICAgICBzT2JqZWN0UHJvamVjdGlvbk1hcC5wdXQoTXRwLk9iamVjdC5BU1NPQ0lBVElPTl9ERVNDLCBuZXcgSW50ZWdlcihPQkpFQ1RfQVNTT0NJQVRJT05fREVTQykpOworICAgICAgICBzT2JqZWN0UHJvamVjdGlvbk1hcC5wdXQoTXRwLk9iamVjdC5TRVFVRU5DRV9OVU1CRVIsIG5ldyBJbnRlZ2VyKE9CSkVDVF9TRVFVRU5DRV9OVU1CRVIpKTsKKyAgICAgICAgc09iamVjdFByb2plY3Rpb25NYXAucHV0KE10cC5PYmplY3QuTkFNRSwgbmV3IEludGVnZXIoT0JKRUNUX05BTUUpKTsKKyAgICAgICAgc09iamVjdFByb2plY3Rpb25NYXAucHV0KE10cC5PYmplY3QuREFURV9DUkVBVEVELCBuZXcgSW50ZWdlcihPQkpFQ1RfREFURV9DUkVBVEVEKSk7CisgICAgICAgIHNPYmplY3RQcm9qZWN0aW9uTWFwLnB1dChNdHAuT2JqZWN0LkRBVEVfTU9ESUZJRUQsIG5ldyBJbnRlZ2VyKE9CSkVDVF9EQVRFX01PRElGSUVEKSk7CisgICAgICAgIHNPYmplY3RQcm9qZWN0aW9uTWFwLnB1dChNdHAuT2JqZWN0LktFWVdPUkRTLCBuZXcgSW50ZWdlcihPQkpFQ1RfS0VZV09SRFMpKTsKKyAgICAgICAgc09iamVjdFByb2plY3Rpb25NYXAucHV0KE10cC5PYmplY3QuVEhVTUIsIG5ldyBJbnRlZ2VyKE9CSkVDVF9USFVNQikpOworCisgICAgICAgIHNPYmplY3RQcm9qZWN0aW9uTWFwLnB1dChNdHAuT2JqZWN0Lk5BTUUsIG5ldyBJbnRlZ2VyKE9CSkVDVF9OQU1FKSk7CisgICAgfQorCisgICAgLy8gdXNlZCBieSB0aGUgSk5JIGNvZGUKKyAgICBwcml2YXRlIGludCBtTmF0aXZlQ29udGV4dDsKKworICAgIHByaXZhdGUgbmF0aXZlIGZpbmFsIHZvaWQgbmF0aXZlX3NldHVwKE10cENsaWVudCBjbGllbnQsIGludCBxdWVyeVR5cGUsCisgICAgICAgICAgICBpbnQgZGV2aWNlSUQsIGludCBzdG9yYWdlSUQsIGludCBvYmplY3RJRCwgaW50W10gY29sdW1ucyk7CisgICAgcHJpdmF0ZSBuYXRpdmUgZmluYWwgdm9pZCBuYXRpdmVfZmluYWxpemUoKTsKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5hdGl2ZV93YWl0X2Zvcl9ldmVudCgpOworICAgIHByaXZhdGUgbmF0aXZlIGludCBuYXRpdmVfZmlsbF93aW5kb3coQ3Vyc29yV2luZG93IHdpbmRvdywgaW50IHN0YXJ0UG9zKTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0F1ZGlvU3lzdGVtLmNwcCBiL21lZGlhL2xpYm1lZGlhL0F1ZGlvU3lzdGVtLmNwcAppbmRleCBjNzdmNTUxLi4zNzJhOTI3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9BdWRpb1N5c3RlbS5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvQXVkaW9TeXN0ZW0uY3BwCkBAIC03MjcsNyArNzI3LDggQEAKICAgICBpZiAoKHBvcENvdW50KGRldmljZSkgPT0gMSApICYmCiAgICAgICAgIChkZXZpY2UgJiAoQXVkaW9TeXN0ZW06OkRFVklDRV9PVVRfQkxVRVRPT1RIX1NDTyB8CiAgICAgICAgICAgICAgICAgICAgQXVkaW9TeXN0ZW06OkRFVklDRV9PVVRfQkxVRVRPT1RIX1NDT19IRUFEU0VUIHwKLSAgICAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6REVWSUNFX09VVF9CTFVFVE9PVEhfU0NPX0NBUktJVCkpKSB7CisgICAgICAgICAgICAgICAgICAgQXVkaW9TeXN0ZW06OkRFVklDRV9PVVRfQkxVRVRPT1RIX1NDT19DQVJLSVQgfAorICAgICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpERVZJQ0VfSU5fQkxVRVRPT1RIX1NDT19IRUFEU0VUKSkpIHsKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfSBlbHNlIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvTWVkaWFTY2FubmVyLmNwcCBiL21lZGlhL2xpYm1lZGlhL01lZGlhU2Nhbm5lci5jcHAKaW5kZXggNmY1ODFkMy4uMjQ0MjZmZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvTWVkaWFTY2FubmVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9NZWRpYVNjYW5uZXIuY3BwCkBAIC0xMzMsNiArMTMzLDEzIEBACiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQogCisgICAgICAgIGludCBuYW1lTGVuZ3RoID0gc3RybGVuKG5hbWUpOworICAgICAgICBpZiAobmFtZUxlbmd0aCArIDEgPiBwYXRoUmVtYWluaW5nKSB7CisgICAgICAgICAgICAvLyBwYXRoIHRvbyBsb25nIQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgc3RyY3B5KGZpbGVTcG90LCBuYW1lKTsKKwogICAgICAgICBpbnQgdHlwZSA9IGVudHJ5LT5kX3R5cGU7CiAgICAgICAgIGlmICh0eXBlID09IERUX1VOS05PV04pIHsKICAgICAgICAgICAgIC8vIElmIHRoZSB0eXBlIGlzIHVua25vd24sIHN0YXQoKSB0aGUgZmlsZSBpbnN0ZWFkLgpAQCAtMTUwLDE2ICsxNTcsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGlmICh0eXBlID09IERUX1JFRyB8fCB0eXBlID09IERUX0RJUikgewotICAgICAgICAgICAgaW50IG5hbWVMZW5ndGggPSBzdHJsZW4obmFtZSk7Ci0gICAgICAgICAgICBib29sIGlzRGlyZWN0b3J5ID0gKHR5cGUgPT0gRFRfRElSKTsKLQotICAgICAgICAgICAgaWYgKG5hbWVMZW5ndGggPiBwYXRoUmVtYWluaW5nIHx8IChpc0RpcmVjdG9yeSAmJiBuYW1lTGVuZ3RoICsgMSA+IHBhdGhSZW1haW5pbmcpKSB7Ci0gICAgICAgICAgICAgICAgLy8gcGF0aCB0b28gbG9uZyEKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc3RyY3B5KGZpbGVTcG90LCBuYW1lKTsKLSAgICAgICAgICAgIGlmIChpc0RpcmVjdG9yeSkgeworICAgICAgICAgICAgaWYgKHR5cGUgPT0gRFRfRElSKSB7CiAgICAgICAgICAgICAgICAgLy8gaWdub3JlIGRpcmVjdG9yaWVzIHdpdGggYSBuYW1lIHRoYXQgc3RhcnRzIHdpdGggJy4nCiAgICAgICAgICAgICAgICAgLy8gZm9yIGV4YW1wbGUsIHRoZSBNYWMgIi5UcmFzaGVzIiBkaXJlY3RvcnkKICAgICAgICAgICAgICAgICBpZiAobmFtZVswXSA9PSAnLicpIGNvbnRpbnVlOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL0FuZHJvaWQubWsgYi9tZWRpYS9tdHAvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjY4NGUxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXRwL0FuZHJvaWQubWsKQEAgLTAsMCArMSwxMDIgQEAKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKKworaWZuZXEgKCQoVEFSR0VUX1NJTVVMQVRPUiksdHJ1ZSkKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1NSQ19GSUxFUzo9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgbXRwdGVzdC5jcHAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBNdHBEYXRhYmFzZS5jcHAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIE10cERhdGFQYWNrZXQuY3BwICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgTXRwRGVidWcuY3BwICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBNdHBNZWRpYVNjYW5uZXIuY3BwICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIE10cFBhY2tldC5jcHAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgTXRwUmVxdWVzdFBhY2tldC5jcHAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBNdHBSZXNwb25zZVBhY2tldC5jcHAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIE10cFNlcnZlci5jcHAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgTXRwU3RyaW5nQnVmZmVyLmNwcCAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBNdHBTdG9yYWdlLmNwcCAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIE10cFV0aWxzLmNwcCAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgU3FsaXRlRGF0YWJhc2UuY3BwICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBTcWxpdGVTdGF0ZW1lbnQuY3BwICAgICAgICAgICAgICAgICAgIFwKKworTE9DQUxfTU9EVUxFOj0gbXRwdGVzdAorCitMT0NBTF9DX0lOQ0xVREVTIDo9IGV4dGVybmFsL3NxbGl0ZS9kaXN0CisKK0xPQ0FMX0NGTEFHUyA6PSAtRE1UUF9ERVZJQ0UKKworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJ1dGlscyBsaWJzcWxpdGUgbGlic3RhZ2VmcmlnaHQgbGliY3V0aWxzIFwKKwlsaWJtZWRpYQorCitpbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKKworZW5kaWYKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX01PRFVMRSA6PSBsaWJtdHBob3N0CisKK0xPQ0FMX1NSQ19GSUxFUzo9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgTXRwQ2xpZW50LmNwcCAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBNdHBDdXJzb3IuY3BwICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIE10cERhdGFQYWNrZXQuY3BwICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgTXRwRGVidWcuY3BwICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBNdHBEZXZpY2UuY3BwICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIE10cERldmljZUluZm8uY3BwICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0SW5mby5jcHAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBNdHBQYWNrZXQuY3BwICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIE10cFByb3BlcnR5LmNwcCAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgTXRwUmVxdWVzdFBhY2tldC5jcHAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBNdHBSZXNwb25zZVBhY2tldC5jcHAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIE10cFN0b3JhZ2VJbmZvLmNwcCAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgTXRwU3RyaW5nQnVmZmVyLmNwcCAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBNdHBVdGlscy5jcHAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKworCitMT0NBTF9DRkxBR1MgOj0gLWcgLURNVFBfSE9TVAorTE9DQUxfTERGTEFHUyA6PSAtZworCitpbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9NT0RVTEUgOj0gc2NhbnRlc3QKK0xPQ0FMX1NSQ19GSUxFUzo9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgc2NhbnRlc3QuY3BwICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBNdHBNZWRpYVNjYW5uZXIuY3BwICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIE10cERhdGFiYXNlLmNwcCAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgTXRwRGF0YVBhY2tldC5jcHAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBNdHBQYWNrZXQuY3BwICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIE10cFN0cmluZ0J1ZmZlci5jcHAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgTXRwVXRpbHMuY3BwICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBTcWxpdGVEYXRhYmFzZS5jcHAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIFNxbGl0ZVN0YXRlbWVudC5jcHAgICAgICAgICAgICAgICAgICAgXAorCisKKyNMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IGxpYnVzYmhvc3QKKyNMT0NBTF9MRExJQlMgOj0gLWxwdGhyZWFkCisKK0xPQ0FMX0NfSU5DTFVERVMgOj0gZXh0ZXJuYWwvc3FsaXRlL2Rpc3QKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGlidXRpbHMgbGlic3FsaXRlIGxpYnN0YWdlZnJpZ2h0IGxpYm1lZGlhCisKKworTE9DQUxfQ0ZMQUdTIDo9IC1nCitMT0NBTF9MREZMQUdTIDo9IC1nCisKK2luY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cENsaWVudC5jcHAgYi9tZWRpYS9tdHAvTXRwQ2xpZW50LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTg3NGU5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXRwL010cENsaWVudC5jcHAKQEAgLTAsMCArMSwxNjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIk10cENsaWVudCIKKyNpbmNsdWRlICJ1dGlscy9Mb2cuaCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisKKyNpbmNsdWRlIDx1c2Job3N0L3VzYmhvc3QuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiwgNiwgMjApCisjaW5jbHVkZSA8bGludXgvdXNiL2NoOS5oPgorI2Vsc2UKKyNpbmNsdWRlIDxsaW51eC91c2JfY2g5Lmg+CisjZW5kaWYKKworI2luY2x1ZGUgIk10cENsaWVudC5oIgorI2luY2x1ZGUgIk10cERldmljZS5oIgorI2luY2x1ZGUgIk10cERlYnVnLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworTXRwQ2xpZW50OjpNdHBDbGllbnQoKQorICAgIDogICBtU3RhcnRlZChmYWxzZSkKK3sKK30KKworTXRwQ2xpZW50Ojp+TXRwQ2xpZW50KCkgeworfQorCitib29sIE10cENsaWVudDo6c3RhcnQoKSB7CisgICAgaWYgKG1TdGFydGVkKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIGlmICh1c2JfaG9zdF9pbml0KHVzYl9kZXZpY2VfYWRkZWQsIHVzYl9kZXZpY2VfcmVtb3ZlZCwgdGhpcykpIHsKKyAgICAgICAgTE9HRSgiTXRwQ2xpZW50OjpzdGFydCBmYWlsZWRcbiIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIG1TdGFydGVkID0gdHJ1ZTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBNdHBDbGllbnQ6OnVzYkRldmljZUFkZGVkKGNvbnN0IGNoYXIgKmRldm5hbWUpIHsKKyAgICBzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyKiBkZXNjOworICAgIHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9pdGVyIGl0ZXI7CisKKyAgICBzdHJ1Y3QgdXNiX2RldmljZSAqZGV2aWNlID0gdXNiX2RldmljZV9vcGVuKGRldm5hbWUpOworICAgIGlmICghZGV2aWNlKSB7CisgICAgICAgIExPR0UoInVzYl9kZXZpY2Vfb3BlbiBmYWlsZWRcbiIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgdXNiX2Rlc2NyaXB0b3JfaXRlcl9pbml0KGRldmljZSwgJml0ZXIpOworCisgICAgd2hpbGUgKChkZXNjID0gdXNiX2Rlc2NyaXB0b3JfaXRlcl9uZXh0KCZpdGVyKSkgIT0gTlVMTCkgeworICAgICAgICBpZiAoZGVzYy0+YkRlc2NyaXB0b3JUeXBlID09IFVTQl9EVF9JTlRFUkZBQ0UpIHsKKyAgICAgICAgICAgIHN0cnVjdCB1c2JfaW50ZXJmYWNlX2Rlc2NyaXB0b3IgKmludGVyZmFjZSA9IChzdHJ1Y3QgdXNiX2ludGVyZmFjZV9kZXNjcmlwdG9yICopZGVzYzsKKworICAgICAgICAgICAgaWYgKGludGVyZmFjZS0+YkludGVyZmFjZUNsYXNzID09IFVTQl9DTEFTU19TVElMTF9JTUFHRSAmJgorICAgICAgICAgICAgICAgIGludGVyZmFjZS0+YkludGVyZmFjZVN1YkNsYXNzID09IDEgJiYgLy8gU3RpbGwgSW1hZ2UgQ2FwdHVyZQorICAgICAgICAgICAgICAgIGludGVyZmFjZS0+YkludGVyZmFjZVByb3RvY29sID09IDEpICAgICAvLyBQaWN0dXJlIFRyYW5zZmVyIFByb3RvY29sIChQSU1BIDE1NDcwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIExPR0QoIkZvdW5kIGNhbWVyYTogXCIlc1wiIFwiJXNcIlxuIiwgdXNiX2RldmljZV9nZXRfbWFudWZhY3R1cmVyX25hbWUoZGV2aWNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVzYl9kZXZpY2VfZ2V0X3Byb2R1Y3RfbmFtZShkZXZpY2UpKTsKKworICAgICAgICAgICAgICAgIC8vIGludGVyZmFjZSBzaG91bGQgYmUgZm9sbG93ZWQgYnkgdGhyZWUgZW5kcG9pbnRzCisgICAgICAgICAgICAgICAgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICplcDsKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVwX2luX2Rlc2MgPSBOVUxMOworICAgICAgICAgICAgICAgIHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZXBfb3V0X2Rlc2MgPSBOVUxMOworICAgICAgICAgICAgICAgIHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZXBfaW50cl9kZXNjID0gTlVMTDsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBlcCA9IChzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKil1c2JfZGVzY3JpcHRvcl9pdGVyX25leHQoJml0ZXIpOworICAgICAgICAgICAgICAgICAgICBpZiAoIWVwIHx8IGVwLT5iRGVzY3JpcHRvclR5cGUgIT0gVVNCX0RUX0VORFBPSU5UKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMT0dFKCJlbmRwb2ludHMgbm90IGZvdW5kXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoZXAtPmJtQXR0cmlidXRlcyA9PSBVU0JfRU5EUE9JTlRfWEZFUl9CVUxLKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXAtPmJFbmRwb2ludEFkZHJlc3MgJiBVU0JfRU5EUE9JTlRfRElSX01BU0spCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXBfaW5fZGVzYyA9IGVwOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVwX291dF9kZXNjID0gZXA7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZXAtPmJtQXR0cmlidXRlcyA9PSBVU0JfRU5EUE9JTlRfWEZFUl9JTlQgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIGVwLT5iRW5kcG9pbnRBZGRyZXNzICYgVVNCX0VORFBPSU5UX0RJUl9NQVNLKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBlcF9pbnRyX2Rlc2MgPSBlcDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIWVwX2luX2Rlc2MgfHwgIWVwX291dF9kZXNjIHx8ICFlcF9pbnRyX2Rlc2MpIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HRSgiZW5kcG9pbnRzIG5vdCBmb3VuZFxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgdXNiX2VuZHBvaW50ICplcF9pbiA9IHVzYl9lbmRwb2ludF9vcGVuKGRldmljZSwgZXBfaW5fZGVzYyk7CisgICAgICAgICAgICAgICAgc3RydWN0IHVzYl9lbmRwb2ludCAqZXBfb3V0ID0gdXNiX2VuZHBvaW50X29wZW4oZGV2aWNlLCBlcF9vdXRfZGVzYyk7CisgICAgICAgICAgICAgICAgc3RydWN0IHVzYl9lbmRwb2ludCAqZXBfaW50ciA9IHVzYl9lbmRwb2ludF9vcGVuKGRldmljZSwgZXBfaW50cl9kZXNjKTsKKworICAgICAgICAgICAgICAgIGlmICh1c2JfZGV2aWNlX2NsYWltX2ludGVyZmFjZShkZXZpY2UsIGludGVyZmFjZS0+YkludGVyZmFjZU51bWJlcikpIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HRSgidXNiX2RldmljZV9jbGFpbV9pbnRlcmZhY2UgZmFpbGVkXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgdXNiX2VuZHBvaW50X2Nsb3NlKGVwX2luKTsKKyAgICAgICAgICAgICAgICAgICAgdXNiX2VuZHBvaW50X2Nsb3NlKGVwX291dCk7CisgICAgICAgICAgICAgICAgICAgIHVzYl9lbmRwb2ludF9jbG9zZShlcF9pbnRyKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIE10cERldmljZSogbXRwRGV2aWNlID0gbmV3IE10cERldmljZShkZXZpY2UsIGludGVyZmFjZS0+YkludGVyZmFjZU51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcF9pbiwgZXBfb3V0LCBlcF9pbnRyKTsKKyAgICAgICAgICAgICAgICBtRGV2aWNlTGlzdC5hZGQobXRwRGV2aWNlKTsKKyAgICAgICAgICAgICAgICBtdHBEZXZpY2UtPmluaXRpYWxpemUoKTsKKyAgICAgICAgICAgICAgICBkZXZpY2VBZGRlZChtdHBEZXZpY2UpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHVzYl9kZXZpY2VfY2xvc2UoZGV2aWNlKTsKK30KKworTXRwRGV2aWNlKiBNdHBDbGllbnQ6OmdldERldmljZShpbnQgaWQpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG1EZXZpY2VMaXN0LnNpemUoKTsgaSsrKSB7CisgICAgICAgIE10cERldmljZSogZGV2aWNlID0gbURldmljZUxpc3RbaV07CisgICAgICAgIGlmIChkZXZpY2UtPmdldElEKCkgPT0gaWQpCisgICAgICAgICAgICByZXR1cm4gZGV2aWNlOworICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKwordm9pZCBNdHBDbGllbnQ6OnVzYkRldmljZVJlbW92ZWQoY29uc3QgY2hhciAqZGV2bmFtZSkgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbURldmljZUxpc3Quc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgTXRwRGV2aWNlKiBkZXZpY2UgPSBtRGV2aWNlTGlzdFtpXTsKKyAgICAgICAgaWYgKCFzdHJjbXAoZGV2bmFtZSwgZGV2aWNlLT5nZXREZXZpY2VOYW1lKCkpKSB7CisgICAgICAgICAgICBkZXZpY2VSZW1vdmVkKGRldmljZSk7CisgICAgICAgICAgICBtRGV2aWNlTGlzdC5yZW1vdmVBdChpKTsKKyAgICAgICAgICAgIGRlbGV0ZSBkZXZpY2U7CisgICAgICAgICAgICBMT0dEKCJDYW1lcmEgcmVtb3ZlZCFcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgTXRwQ2xpZW50Ojp1c2JfZGV2aWNlX2FkZGVkKGNvbnN0IGNoYXIgKmRldm5hbWUsIHZvaWQqIGNsaWVudF9kYXRhKSB7CisgICAgTE9HRCgidXNiX2RldmljZV9hZGRlZCAlc1xuIiwgZGV2bmFtZSk7CisgICAgKChNdHBDbGllbnQgKiljbGllbnRfZGF0YSktPnVzYkRldmljZUFkZGVkKGRldm5hbWUpOworfQorCit2b2lkIE10cENsaWVudDo6dXNiX2RldmljZV9yZW1vdmVkKGNvbnN0IGNoYXIgKmRldm5hbWUsIHZvaWQqIGNsaWVudF9kYXRhKSB7CisgICAgTE9HRCgidXNiX2RldmljZV9yZW1vdmVkICVzXG4iLCBkZXZuYW1lKTsKKyAgICAoKE10cENsaWVudCAqKWNsaWVudF9kYXRhKS0+dXNiRGV2aWNlUmVtb3ZlZChkZXZuYW1lKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBDbGllbnQuaCBiL21lZGlhL210cC9NdHBDbGllbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODdjMjI2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXRwL010cENsaWVudC5oCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9NVFBfQ0xJRU5UX0gKKyNkZWZpbmUgX01UUF9DTElFTlRfSAorCisjaW5jbHVkZSAiTXRwVHlwZXMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBNdHBDbGllbnQgeworcHJpdmF0ZToKKyAgICBNdHBEZXZpY2VMaXN0ICAgICAgICAgICBtRGV2aWNlTGlzdDsKKyAgICBib29sICAgICAgICAgICAgICAgICAgICBtU3RhcnRlZDsKKworcHVibGljOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cENsaWVudCgpOworICAgIHZpcnR1YWwgICAgICAgICAgICAgICAgIH5NdHBDbGllbnQoKTsKKworICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIHN0YXJ0KCk7CisKKyAgICBpbmxpbmUgTXRwRGV2aWNlTGlzdCYgICBnZXREZXZpY2VMaXN0KCkgeyByZXR1cm4gbURldmljZUxpc3Q7IH0KKyAgICBNdHBEZXZpY2UqICAgICAgICAgICAgICBnZXREZXZpY2UoaW50IGlkKTsKKworCisgICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgZGV2aWNlQWRkZWQoTXRwRGV2aWNlICpkZXZpY2UpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICBkZXZpY2VSZW1vdmVkKE10cERldmljZSAqZGV2aWNlKSA9IDA7CisKK3ByaXZhdGU6CisgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgdXNiRGV2aWNlQWRkZWQoY29uc3QgY2hhciAqZGV2bmFtZSk7CisgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgdXNiRGV2aWNlUmVtb3ZlZChjb25zdCBjaGFyICpkZXZuYW1lKTsKKyAgICBzdGF0aWMgdm9pZCAgICAgICAgICAgICB1c2JfZGV2aWNlX2FkZGVkKGNvbnN0IGNoYXIgKmRldm5hbWUsIHZvaWQqIGNsaWVudF9kYXRhKTsKKyAgICBzdGF0aWMgdm9pZCAgICAgICAgICAgICB1c2JfZGV2aWNlX3JlbW92ZWQoY29uc3QgY2hhciAqZGV2bmFtZSwgdm9pZCogY2xpZW50X2RhdGEpOworfTsKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIF9NVFBfQ0xJRU5UX0gKZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBDdXJzb3IuY3BwIGIvbWVkaWEvbXRwL010cEN1cnNvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDYzYTViZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL210cC9NdHBDdXJzb3IuY3BwCkBAIC0wLDAgKzEsNDUzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJNdHBDdXJzb3IiCisjaW5jbHVkZSAidXRpbHMvTG9nLmgiCisKKyNpbmNsdWRlICJNdHBDbGllbnQuaCIKKyNpbmNsdWRlICJNdHBDdXJzb3IuaCIKKyNpbmNsdWRlICJNdHBEZXZpY2UuaCIKKyNpbmNsdWRlICJNdHBEZXZpY2VJbmZvLmgiCisjaW5jbHVkZSAiTXRwT2JqZWN0SW5mby5oIgorI2luY2x1ZGUgIk10cFN0b3JhZ2VJbmZvLmgiCisKKyNpbmNsdWRlICJiaW5kZXIvQ3Vyc29yV2luZG93LmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLyogRGV2aWNlIENvbHVtbiBJRHMgKi8KKy8qIFRoZXNlIG11c3QgbWF0Y2ggdGhlIHZhbHVlcyBpbiBNdHBDdXJzb3IuamF2YSAqLworI2RlZmluZSBERVZJQ0VfUk9XX0lEICAgICAgICAgICAxCisjZGVmaW5lIERFVklDRV9NQU5VRkFDVFVSRVIgICAgIDIKKyNkZWZpbmUgREVWSUNFX01PREVMICAgICAgICAgICAgMworCisvKiBTdG9yYWdlIENvbHVtbiBJRHMgKi8KKy8qIFRoZXNlIG11c3QgbWF0Y2ggdGhlIHZhbHVlcyBpbiBNdHBDdXJzb3IuamF2YSAqLworI2RlZmluZSBTVE9SQUdFX1JPV19JRCAgICAgICAgICAxMDEKKyNkZWZpbmUgU1RPUkFHRV9JREVOVElGSUVSICAgICAgMTAyCisjZGVmaW5lIFNUT1JBR0VfREVTQ1JJUFRJT04gICAgIDEwMworCisvKiBPYmplY3QgQ29sdW1uIElEcyAqLworLyogVGhlc2UgbXVzdCBtYXRjaCB0aGUgdmFsdWVzIGluIE10cEN1cnNvci5qYXZhICovCisjZGVmaW5lIE9CSkVDVF9ST1dfSUQgICAgICAgICAgICAgICAyMDEKKyNkZWZpbmUgT0JKRUNUX1NUT1JBR0VfSUQgICAgICAgICAgIDIwMgorI2RlZmluZSBPQkpFQ1RfRk9STUFUICAgICAgICAgICAgICAgMjAzCisjZGVmaW5lIE9CSkVDVF9QUk9URUNUSU9OX1NUQVRVUyAgICAyMDQKKyNkZWZpbmUgT0JKRUNUX1NJWkUgICAgICAgICAgICAgICAgIDIwNQorI2RlZmluZSBPQkpFQ1RfVEhVTUJfRk9STUFUICAgICAgICAgMjA2CisjZGVmaW5lIE9CSkVDVF9USFVNQl9TSVpFICAgICAgICAgICAyMDcKKyNkZWZpbmUgT0JKRUNUX1RIVU1CX1dJRFRIICAgICAgICAgIDIwOAorI2RlZmluZSBPQkpFQ1RfVEhVTUJfSEVJR0hUICAgICAgICAgMjA5CisjZGVmaW5lIE9CSkVDVF9JTUFHRV9XSURUSCAgICAgICAgICAyMTAKKyNkZWZpbmUgT0JKRUNUX0lNQUdFX0hFSUdIVCAgICAgICAgIDIxMQorI2RlZmluZSBPQkpFQ1RfSU1BR0VfREVQVEggICAgICAgICAgMjEyCisjZGVmaW5lIE9CSkVDVF9QQVJFTlQgICAgICAgICAgICAgICAyMTMKKyNkZWZpbmUgT0JKRUNUX0FTU09DSUFUSU9OX1RZUEUgICAgIDIxNAorI2RlZmluZSBPQkpFQ1RfQVNTT0NJQVRJT05fREVTQyAgICAgMjE1CisjZGVmaW5lIE9CSkVDVF9TRVFVRU5DRV9OVU1CRVIgICAgICAyMTYKKyNkZWZpbmUgT0JKRUNUX05BTUUgICAgICAgICAgICAgICAgIDIxNworI2RlZmluZSBPQkpFQ1RfREFURV9DUkVBVEVEICAgICAgICAgMjE4CisjZGVmaW5lIE9CSkVDVF9EQVRFX01PRElGSUVEICAgICAgICAyMTkKKyNkZWZpbmUgT0JKRUNUX0tFWVdPUkRTICAgICAgICAgICAgIDIyMAorI2RlZmluZSBPQkpFQ1RfVEhVTUIgICAgICAgICAgICAgICAgMjIxCisKK010cEN1cnNvcjo6TXRwQ3Vyc29yKE10cENsaWVudCogY2xpZW50LCBpbnQgcXVlcnlUeXBlLCBpbnQgZGV2aWNlSUQsCisgICAgICAgICAgICAgICAgaW50IHN0b3JhZ2VJRCwgaW50IG9iamVjdElELCBpbnQgY29sdW1uQ291bnQsIGludCogY29sdW1ucykKKyAgICAgICAgOiAgIG1DbGllbnQoY2xpZW50KSwKKyAgICAgICAgICAgIG1RdWVyeVR5cGUocXVlcnlUeXBlKSwKKyAgICAgICAgICAgIG1EZXZpY2VJRChkZXZpY2VJRCksCisgICAgICAgICAgICBtU3RvcmFnZUlEKHN0b3JhZ2VJRCksCisgICAgICAgICAgICBtUWJqZWN0SUQob2JqZWN0SUQpLAorICAgICAgICAgICAgbUNvbHVtbkNvdW50KGNvbHVtbkNvdW50KSwKKyAgICAgICAgICAgIG1Db2x1bW5zKE5VTEwpCit7CisgICAgaWYgKGNvbHVtbnMpIHsKKyAgICAgICAgbUNvbHVtbnMgPSBuZXcgaW50W2NvbHVtbkNvdW50XTsKKyAgICAgICAgbWVtY3B5KG1Db2x1bW5zLCBjb2x1bW5zLCBjb2x1bW5Db3VudCAqIHNpemVvZihpbnQpKTsKKyAgICB9Cit9CisKK010cEN1cnNvcjo6fk10cEN1cnNvcigpIHsKKyAgICBkZWxldGVbXSBtQ29sdW1uczsKK30KKworaW50IE10cEN1cnNvcjo6ZmlsbFdpbmRvdyhDdXJzb3JXaW5kb3cqIHdpbmRvdywgaW50IHN0YXJ0UG9zKSB7CisgICAgTE9HRCgiTXRwQ3Vyc29yOjpmaWxsV2luZG93IG1RdWVyeVR5cGU6ICVkXG4iLCBtUXVlcnlUeXBlKTsKKworICAgIHN3aXRjaCAobVF1ZXJ5VHlwZSkgeworICAgICAgICBjYXNlIERFVklDRToKKyAgICAgICAgICAgIHJldHVybiBmaWxsRGV2aWNlcyh3aW5kb3csIHN0YXJ0UG9zKTsKKyAgICAgICAgY2FzZSBERVZJQ0VfSUQ6CisgICAgICAgICAgICByZXR1cm4gZmlsbERldmljZSh3aW5kb3csIHN0YXJ0UG9zKTsKKyAgICAgICAgY2FzZSBTVE9SQUdFOgorICAgICAgICAgICAgcmV0dXJuIGZpbGxTdG9yYWdlcyh3aW5kb3csIHN0YXJ0UG9zKTsKKyAgICAgICAgY2FzZSBTVE9SQUdFX0lEOgorICAgICAgICAgICAgcmV0dXJuIGZpbGxTdG9yYWdlKHdpbmRvdywgc3RhcnRQb3MpOworICAgICAgICBjYXNlIE9CSkVDVDoKKyAgICAgICAgICAgIHJldHVybiBmaWxsT2JqZWN0cyh3aW5kb3csIDAsIHN0YXJ0UG9zKTsKKyAgICAgICAgY2FzZSBPQkpFQ1RfSUQ6CisgICAgICAgICAgICByZXR1cm4gZmlsbE9iamVjdCh3aW5kb3csIHN0YXJ0UG9zKTsKKyAgICAgICAgY2FzZSBTVE9SQUdFX0NISUxEUkVOOgorICAgICAgICAgICAgcmV0dXJuIGZpbGxPYmplY3RzKHdpbmRvdywgLTEsIHN0YXJ0UG9zKTsKKyAgICAgICAgY2FzZSBPQkpFQ1RfQ0hJTERSRU46CisgICAgICAgICAgICByZXR1cm4gZmlsbE9iamVjdHMod2luZG93LCBtUWJqZWN0SUQsIHN0YXJ0UG9zKTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIExPR0UoIk10cEN1cnNvcjo6ZmlsbFdpbmRvdzogdW5rbm93biBxdWVyeSB0eXBlICVkXG4iLCBtUXVlcnlUeXBlKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgIH0KK30KKworaW50IE10cEN1cnNvcjo6ZmlsbERldmljZXMoQ3Vyc29yV2luZG93KiB3aW5kb3csIGludCBzdGFydFBvcykgeworICAgIGludCBjb3VudCA9IDA7CisgICAgTXRwRGV2aWNlTGlzdCYgZGV2aWNlTGlzdCA9IG1DbGllbnQtPmdldERldmljZUxpc3QoKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGRldmljZUxpc3Quc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgTXRwRGV2aWNlKiBkZXZpY2UgPSBkZXZpY2VMaXN0W2ldOworICAgICAgICBpZiAoZmlsbERldmljZSh3aW5kb3csIGRldmljZSwgc3RhcnRQb3MpKSB7CisgICAgICAgICAgICBjb3VudCsrOworICAgICAgICAgICAgc3RhcnRQb3MrKzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBjb3VudDsKK30KKworaW50IE10cEN1cnNvcjo6ZmlsbERldmljZShDdXJzb3JXaW5kb3cqIHdpbmRvdywgaW50IHN0YXJ0UG9zKSB7CisgICAgTXRwRGV2aWNlKiBkZXZpY2UgPSBtQ2xpZW50LT5nZXREZXZpY2UobURldmljZUlEKTsKKyAgICBpZiAoZGV2aWNlICYmIGZpbGxEZXZpY2Uod2luZG93LCBkZXZpY2UsIHN0YXJ0UG9zKSkKKyAgICAgICAgcmV0dXJuIDE7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gMDsKK30KKworaW50IE10cEN1cnNvcjo6ZmlsbFN0b3JhZ2VzKEN1cnNvcldpbmRvdyogd2luZG93LCBpbnQgc3RhcnRQb3MpIHsKKyAgICBpbnQgY291bnQgPSAwOworICAgIE10cERldmljZSogZGV2aWNlID0gbUNsaWVudC0+Z2V0RGV2aWNlKG1EZXZpY2VJRCk7CisgICAgaWYgKCFkZXZpY2UpCisgICAgICAgIHJldHVybiAwOworICAgIE10cFN0b3JhZ2VJRExpc3QqIHN0b3JhZ2VJRHMgPSBkZXZpY2UtPmdldFN0b3JhZ2VJRHMoKTsKKyAgICBpZiAoIXN0b3JhZ2VJRHMpCisgICAgICAgIHJldHVybiAwOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdG9yYWdlSURzLT5zaXplKCk7IGkrKykgeworICAgICAgICBNdHBTdG9yYWdlSUQgc3RvcmFnZUlEID0gKCpzdG9yYWdlSURzKVtpXTsKKyAgICAgICAgaWYgKGZpbGxTdG9yYWdlKHdpbmRvdywgZGV2aWNlLCBzdG9yYWdlSUQsIHN0YXJ0UG9zKSkgeworICAgICAgICAgICAgY291bnQrKzsKKyAgICAgICAgICAgIHN0YXJ0UG9zKys7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBkZWxldGUgc3RvcmFnZUlEczsKKyAgICByZXR1cm4gY291bnQ7Cit9CisKK2ludCBNdHBDdXJzb3I6OmZpbGxTdG9yYWdlKEN1cnNvcldpbmRvdyogd2luZG93LCBpbnQgc3RhcnRQb3MpIHsKKyAgICBNdHBEZXZpY2UqIGRldmljZSA9IG1DbGllbnQtPmdldERldmljZShtRGV2aWNlSUQpOworICAgIGlmIChkZXZpY2UgJiYgZmlsbFN0b3JhZ2Uod2luZG93LCBkZXZpY2UsIG1TdG9yYWdlSUQsIHN0YXJ0UG9zKSkKKyAgICAgICAgcmV0dXJuIDE7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gMDsKK30KKworaW50IE10cEN1cnNvcjo6ZmlsbE9iamVjdHMoQ3Vyc29yV2luZG93KiB3aW5kb3csIGludCBwYXJlbnQsIGludCBzdGFydFBvcykgeworICAgIGludCBjb3VudCA9IDA7CisgICAgTXRwRGV2aWNlKiBkZXZpY2UgPSBtQ2xpZW50LT5nZXREZXZpY2UobURldmljZUlEKTsKKyAgICBpZiAoIWRldmljZSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgTXRwT2JqZWN0SGFuZGxlTGlzdCogaGFuZGxlcyA9IGRldmljZS0+Z2V0T2JqZWN0SGFuZGxlcyhtU3RvcmFnZUlELCAwLCBwYXJlbnQpOworICAgIGlmICghaGFuZGxlcykKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGhhbmRsZXMtPnNpemUoKTsgaSsrKSB7CisgICAgICAgIE10cE9iamVjdEhhbmRsZSBoYW5kbGUgPSAoKmhhbmRsZXMpW2ldOworICAgICAgICBpZiAoZmlsbE9iamVjdCh3aW5kb3csIGRldmljZSwgaGFuZGxlLCBzdGFydFBvcykpIHsKKyAgICAgICAgICAgIGNvdW50Kys7CisgICAgICAgICAgICBzdGFydFBvcysrOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgZGVsZXRlIGhhbmRsZXM7CisgICAgcmV0dXJuIGNvdW50OworfQorCitpbnQgTXRwQ3Vyc29yOjpmaWxsT2JqZWN0KEN1cnNvcldpbmRvdyogd2luZG93LCBpbnQgc3RhcnRQb3MpIHsKKyAgICBNdHBEZXZpY2UqIGRldmljZSA9IG1DbGllbnQtPmdldERldmljZShtRGV2aWNlSUQpOworICAgIGlmIChkZXZpY2UgJiYgZmlsbE9iamVjdCh3aW5kb3csIGRldmljZSwgbVFiamVjdElELCBzdGFydFBvcykpCisgICAgICAgIHJldHVybiAxOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKK2Jvb2wgTXRwQ3Vyc29yOjpmaWxsRGV2aWNlKEN1cnNvcldpbmRvdyogd2luZG93LCBNdHBEZXZpY2UqIGRldmljZSwgaW50IHJvdykgeworICAgIE10cERldmljZUluZm8qIGRldmljZUluZm8gPSBkZXZpY2UtPmdldERldmljZUluZm8oKTsKKyAgICBpZiAoIWRldmljZUluZm8pCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAoIXByZXBhcmVSb3cod2luZG93KSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtQ29sdW1uQ291bnQ7IGkrKykgeworICAgICAgICBzd2l0Y2ggKG1Db2x1bW5zW2ldKSB7CisgICAgICAgICAgICBjYXNlIERFVklDRV9ST1dfSUQ6CisgICAgICAgICAgICAgICAgaWYgKCFwdXRMb25nKHdpbmRvdywgZGV2aWNlLT5nZXRJRCgpLCByb3csIGkpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBERVZJQ0VfTUFOVUZBQ1RVUkVSOgorICAgICAgICAgICAgICAgIGlmICghcHV0U3RyaW5nKHdpbmRvdywgZGV2aWNlSW5mby0+bU1hbnVmYWN0dXJlciwgcm93LCBpKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgREVWSUNFX01PREVMOgorICAgICAgICAgICAgICAgIGlmICghcHV0U3RyaW5nKHdpbmRvdywgZGV2aWNlSW5mby0+bU1vZGVsLCByb3csIGkpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBMT0dFKCJmaWxsRGV2aWNlOiB1bmtub3duIGNvbHVtbiAlZFxuIiwgbUNvbHVtbnNbaV0pOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCitib29sIE10cEN1cnNvcjo6ZmlsbFN0b3JhZ2UoQ3Vyc29yV2luZG93KiB3aW5kb3csIE10cERldmljZSogZGV2aWNlLAorICAgICAgICBNdHBTdG9yYWdlSUQgc3RvcmFnZUlELCBpbnQgcm93KSB7CisKK0xPR0QoImZpbGxTdG9yYWdlICVkXG4iLCBzdG9yYWdlSUQpOworCisgICAgTXRwU3RvcmFnZUluZm8qIHN0b3JhZ2VJbmZvID0gZGV2aWNlLT5nZXRTdG9yYWdlSW5mbyhzdG9yYWdlSUQpOworICAgIGlmICghc3RvcmFnZUluZm8pCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAoIXByZXBhcmVSb3cod2luZG93KSkgeworICAgICAgICBkZWxldGUgc3RvcmFnZUluZm87CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBjb25zdCBjaGFyKiB0ZXh0OworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbUNvbHVtbkNvdW50OyBpKyspIHsKKyAgICAgICAgc3dpdGNoIChtQ29sdW1uc1tpXSkgeworICAgICAgICAgICAgY2FzZSBTVE9SQUdFX1JPV19JRDoKKyAgICAgICAgICAgICAgICBpZiAoIXB1dExvbmcod2luZG93LCBzdG9yYWdlSUQsIHJvdywgaSkpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFNUT1JBR0VfSURFTlRJRklFUjoKKyAgICAgICAgICAgICAgICB0ZXh0ID0gc3RvcmFnZUluZm8tPm1Wb2x1bWVJZGVudGlmaWVyOworICAgICAgICAgICAgICAgIGlmICghdGV4dCB8fCAhdGV4dFswXSkKKyAgICAgICAgICAgICAgICAgICAgdGV4dCA9ICJDYW1lcmEgU3RvcmFnZSI7CisgICAgICAgICAgICAgICAgaWYgKCFwdXRTdHJpbmcod2luZG93LCB0ZXh0LCByb3csIGkpKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBTVE9SQUdFX0RFU0NSSVBUSU9OOgorICAgICAgICAgICAgICAgIHRleHQgPSBzdG9yYWdlSW5mby0+bVN0b3JhZ2VEZXNjcmlwdGlvbjsKKyAgICAgICAgICAgICAgICBpZiAoIXRleHQgfHwgIXRleHRbMF0pCisgICAgICAgICAgICAgICAgICAgIHRleHQgPSAiU3RvcmFnZSBEZXNjcmlwdGlvbiI7CisgICAgICAgICAgICAgICAgaWYgKCFwdXRTdHJpbmcod2luZG93LCB0ZXh0LCByb3csIGkpKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBMT0dFKCJmaWxsU3RvcmFnZTogdW5rbm93biBjb2x1bW4gJWRcbiIsIG1Db2x1bW5zW2ldKTsKKyAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBkZWxldGUgc3RvcmFnZUluZm87CisgICAgcmV0dXJuIHRydWU7CisKK2ZhaWw6CisgICAgZGVsZXRlIHN0b3JhZ2VJbmZvOworICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBNdHBDdXJzb3I6OmZpbGxPYmplY3QoQ3Vyc29yV2luZG93KiB3aW5kb3csIE10cERldmljZSogZGV2aWNlLAorICAgICAgICBNdHBPYmplY3RIYW5kbGUgb2JqZWN0SUQsIGludCByb3cpIHsKKworICAgIE10cE9iamVjdEluZm8qIG9iamVjdEluZm8gPSBkZXZpY2UtPmdldE9iamVjdEluZm8ob2JqZWN0SUQpOworICAgIGlmICghb2JqZWN0SW5mbykKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIC8vIG9iamVjdEluZm8tPnByaW50KCk7CisgICAgaWYgKCFwcmVwYXJlUm93KHdpbmRvdykpIHsKKyAgICAgICAgZGVsZXRlIG9iamVjdEluZm87CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG1Db2x1bW5Db3VudDsgaSsrKSB7CisgICAgICAgIHN3aXRjaCAobUNvbHVtbnNbaV0pIHsKKyAgICAgICAgICAgIGNhc2UgT0JKRUNUX1JPV19JRDoKKyAgICAgICAgICAgICAgICBpZiAoIXB1dExvbmcod2luZG93LCBvYmplY3RJRCwgcm93LCBpKSkKKyAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT0JKRUNUX1NUT1JBR0VfSUQ6CisgICAgICAgICAgICAgICAgaWYgKCFwdXRMb25nKHdpbmRvdywgb2JqZWN0SW5mby0+bVN0b3JhZ2VJRCwgcm93LCBpKSkKKyAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT0JKRUNUX0ZPUk1BVDoKKyAgICAgICAgICAgICAgICBpZiAoIXB1dExvbmcod2luZG93LCBvYmplY3RJbmZvLT5tRm9ybWF0LCByb3csIGkpKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPQkpFQ1RfUFJPVEVDVElPTl9TVEFUVVM6CisgICAgICAgICAgICAgICAgaWYgKCFwdXRMb25nKHdpbmRvdywgb2JqZWN0SW5mby0+bVByb3RlY3Rpb25TdGF0dXMsIHJvdywgaSkpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9CSkVDVF9TSVpFOgorICAgICAgICAgICAgICAgIGlmICghcHV0TG9uZyh3aW5kb3csIG9iamVjdEluZm8tPm1Db21wcmVzc2VkU2l6ZSwgcm93LCBpKSkKKyAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT0JKRUNUX1RIVU1CX0ZPUk1BVDoKKyAgICAgICAgICAgICAgICBpZiAoIXB1dExvbmcod2luZG93LCBvYmplY3RJbmZvLT5tVGh1bWJGb3JtYXQsIHJvdywgaSkpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9CSkVDVF9USFVNQl9TSVpFOgorICAgICAgICAgICAgICAgIGlmICghcHV0TG9uZyh3aW5kb3csIG9iamVjdEluZm8tPm1UaHVtYkNvbXByZXNzZWRTaXplLCByb3csIGkpKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPQkpFQ1RfVEhVTUJfV0lEVEg6CisgICAgICAgICAgICAgICAgaWYgKCFwdXRMb25nKHdpbmRvdywgb2JqZWN0SW5mby0+bVRodW1iUGl4V2lkdGgsIHJvdywgaSkpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9CSkVDVF9USFVNQl9IRUlHSFQ6CisgICAgICAgICAgICAgICAgaWYgKCFwdXRMb25nKHdpbmRvdywgb2JqZWN0SW5mby0+bVRodW1iUGl4SGVpZ2h0LCByb3csIGkpKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPQkpFQ1RfSU1BR0VfV0lEVEg6CisgICAgICAgICAgICAgICAgaWYgKCFwdXRMb25nKHdpbmRvdywgb2JqZWN0SW5mby0+bUltYWdlUGl4V2lkdGgsIHJvdywgaSkpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9CSkVDVF9JTUFHRV9IRUlHSFQ6CisgICAgICAgICAgICAgICAgaWYgKCFwdXRMb25nKHdpbmRvdywgb2JqZWN0SW5mby0+bUltYWdlUGl4SGVpZ2h0LCByb3csIGkpKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPQkpFQ1RfSU1BR0VfREVQVEg6CisgICAgICAgICAgICAgICAgaWYgKCFwdXRMb25nKHdpbmRvdywgb2JqZWN0SW5mby0+bUltYWdlUGl4RGVwdGgsIHJvdywgaSkpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9CSkVDVF9QQVJFTlQ6CisgICAgICAgICAgICAgICAgaWYgKCFwdXRMb25nKHdpbmRvdywgb2JqZWN0SW5mby0+bVBhcmVudCwgcm93LCBpKSkKKyAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT0JKRUNUX0FTU09DSUFUSU9OX1RZUEU6CisgICAgICAgICAgICAgICAgaWYgKCFwdXRMb25nKHdpbmRvdywgb2JqZWN0SW5mby0+bUFzc29jaWF0aW9uVHlwZSwgcm93LCBpKSkKKyAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT0JKRUNUX0FTU09DSUFUSU9OX0RFU0M6CisgICAgICAgICAgICAgICAgaWYgKCFwdXRMb25nKHdpbmRvdywgb2JqZWN0SW5mby0+bUFzc29jaWF0aW9uRGVzYywgcm93LCBpKSkKKyAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT0JKRUNUX1NFUVVFTkNFX05VTUJFUjoKKyAgICAgICAgICAgICAgICBpZiAoIXB1dExvbmcod2luZG93LCBvYmplY3RJbmZvLT5tU2VxdWVuY2VOdW1iZXIsIHJvdywgaSkpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9CSkVDVF9OQU1FOgorICAgICAgICAgICAgICAgIGlmICghcHV0U3RyaW5nKHdpbmRvdywgb2JqZWN0SW5mby0+bU5hbWUsIHJvdywgaSkpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9CSkVDVF9EQVRFX0NSRUFURUQ6CisgICAgICAgICAgICAgICAgaWYgKCFwdXRMb25nKHdpbmRvdywgb2JqZWN0SW5mby0+bURhdGVDcmVhdGVkLCByb3csIGkpKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPQkpFQ1RfREFURV9NT0RJRklFRDoKKyAgICAgICAgICAgICAgICBpZiAoIXB1dExvbmcod2luZG93LCBvYmplY3RJbmZvLT5tRGF0ZU1vZGlmaWVkLCByb3csIGkpKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPQkpFQ1RfS0VZV09SRFM6CisgICAgICAgICAgICAgICAgaWYgKCFwdXRTdHJpbmcod2luZG93LCBvYmplY3RJbmZvLT5tS2V5d29yZHMsIHJvdywgaSkpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9CSkVDVF9USFVNQjoKKyAgICAgICAgICAgICAgICBpZiAoIXB1dFRodW1ibmFpbCh3aW5kb3csIG9iamVjdElELCByb3csIGkpKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIExPR0UoImZpbGxTdG9yYWdlOiB1bmtub3duIGNvbHVtbiAlZFxuIiwgbUNvbHVtbnNbaV0pOworICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGRlbGV0ZSBvYmplY3RJbmZvOworICAgIHJldHVybiB0cnVlOworCitmYWlsOgorICAgIGRlbGV0ZSBvYmplY3RJbmZvOworICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBNdHBDdXJzb3I6OnByZXBhcmVSb3coQ3Vyc29yV2luZG93KiB3aW5kb3cpIHsKKyAgICBpZiAoIXdpbmRvdy0+c2V0TnVtQ29sdW1ucyhtQ29sdW1uQ291bnQpKSB7CisgICAgICAgIExPR0UoIkZhaWxlZCB0byBjaGFuZ2UgY29sdW1uIGNvdW50IGZyb20gJWQgdG8gJWQiLCB3aW5kb3ctPmdldE51bUNvbHVtbnMoKSwgbUNvbHVtbkNvdW50KTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBmaWVsZF9zbG90X3QgKiBmaWVsZERpciA9IHdpbmRvdy0+YWxsb2NSb3coKTsKKyAgICBpZiAoIWZpZWxkRGlyKSB7CisgICAgICAgIExPR0UoIkZhaWxlZCBhbGxvY2F0aW5nIGZpZWxkRGlyIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKKworYm9vbCBNdHBDdXJzb3I6OnB1dExvbmcoQ3Vyc29yV2luZG93KiB3aW5kb3csIGludCB2YWx1ZSwgaW50IHJvdywgaW50IGNvbHVtbikgeworCisgICAgaWYgKCF3aW5kb3ctPnB1dExvbmcocm93LCBjb2x1bW4sIHZhbHVlKSkgeworICAgICAgICB3aW5kb3ctPmZyZWVMYXN0Um93KCk7CisgICAgICAgIExPR0UoIkZhaWxlZCBhbGxvY2F0aW5nIHNwYWNlIGZvciBhIGxvbmcgaW4gY29sdW1uICVkIiwgY29sdW1uKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBNdHBDdXJzb3I6OnB1dFN0cmluZyhDdXJzb3JXaW5kb3cqIHdpbmRvdywgY29uc3QgY2hhciogdGV4dCwgaW50IHJvdywgaW50IGNvbHVtbikgeworICAgIGludCBzaXplID0gc3RybGVuKHRleHQpICsgMTsKKyAgICBpbnQgb2Zmc2V0ID0gd2luZG93LT5hbGxvYyhzaXplKTsKKyAgICBpZiAoIW9mZnNldCkgeworICAgICAgICB3aW5kb3ctPmZyZWVMYXN0Um93KCk7CisgICAgICAgIExPR0UoIkZhaWxlZCBhbGxvY2F0aW5nICV1IGJ5dGVzIGZvciB0ZXh0L2Jsb2IgJXMiLCBzaXplLCB0ZXh0KTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICB3aW5kb3ctPmNvcHlJbihvZmZzZXQsIChjb25zdCB1aW50OF90Kil0ZXh0LCBzaXplKTsKKworICAgIC8vIFRoaXMgbXVzdCBiZSB1cGRhdGVkIGFmdGVyIHRoZSBjYWxsIHRvIGFsbG9jKCksIHNpbmNlIHRoYXQKKyAgICAvLyBtYXkgbW92ZSB0aGUgZmllbGQgYXJvdW5kIGluIHRoZSB3aW5kb3cKKyAgICBmaWVsZF9zbG90X3QgKiBmaWVsZFNsb3QgPSB3aW5kb3ctPmdldEZpZWxkU2xvdChyb3csIGNvbHVtbik7CisgICAgZmllbGRTbG90LT50eXBlID0gRklFTERfVFlQRV9TVFJJTkc7CisgICAgZmllbGRTbG90LT5kYXRhLmJ1ZmZlci5vZmZzZXQgPSBvZmZzZXQ7CisgICAgZmllbGRTbG90LT5kYXRhLmJ1ZmZlci5zaXplID0gc2l6ZTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBNdHBDdXJzb3I6OnB1dFRodW1ibmFpbChDdXJzb3JXaW5kb3cqIHdpbmRvdywgaW50IG9iamVjdElELCBpbnQgcm93LCBpbnQgY29sdW1uKSB7CisgICAgTXRwRGV2aWNlKiBkZXZpY2UgPSBtQ2xpZW50LT5nZXREZXZpY2UobURldmljZUlEKTsKKyAgICBpbnQgc2l6ZTsKKyAgICB2b2lkKiB0aHVtYm5haWwgPSBkZXZpY2UtPmdldFRodW1ibmFpbChvYmplY3RJRCwgc2l6ZSk7CisKKyAgICBMT0dEKCJwdXRUaHVtYm5haWw6ICVwLCBzaXplOiAlZFxuIiwgdGh1bWJuYWlsLCBzaXplKTsKKyAgICBpbnQgb2Zmc2V0ID0gd2luZG93LT5hbGxvYyhzaXplKTsKKyAgICBpZiAoIW9mZnNldCkgeworICAgICAgICB3aW5kb3ctPmZyZWVMYXN0Um93KCk7CisgICAgICAgIExPR0UoIkZhaWxlZCBhbGxvY2F0aW5nICV1IGJ5dGVzIGZvciB0aHVtYm5haWwiLCBzaXplKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAoc2l6ZSA+IDApCisgICAgICAgIHdpbmRvdy0+Y29weUluKG9mZnNldCwgKGNvbnN0IHVpbnQ4X3QqKXRodW1ibmFpbCwgc2l6ZSk7CisKKyAgICAvLyBUaGlzIG11c3QgYmUgdXBkYXRlZCBhZnRlciB0aGUgY2FsbCB0byBhbGxvYygpLCBzaW5jZSB0aGF0CisgICAgLy8gbWF5IG1vdmUgdGhlIGZpZWxkIGFyb3VuZCBpbiB0aGUgd2luZG93CisgICAgZmllbGRfc2xvdF90ICogZmllbGRTbG90ID0gd2luZG93LT5nZXRGaWVsZFNsb3Qocm93LCBjb2x1bW4pOworICAgIGZpZWxkU2xvdC0+dHlwZSA9IEZJRUxEX1RZUEVfQkxPQjsKKyAgICBmaWVsZFNsb3QtPmRhdGEuYnVmZmVyLm9mZnNldCA9IG9mZnNldDsKKyAgICBmaWVsZFNsb3QtPmRhdGEuYnVmZmVyLnNpemUgPSBzaXplOworICAgIHJldHVybiB0cnVlOworfQorCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwQ3Vyc29yLmggYi9tZWRpYS9tdHAvTXRwQ3Vyc29yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDUxYzA1MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL210cC9NdHBDdXJzb3IuaApAQCAtMCwwICsxLDc2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfTVRQX0NVUlNPUl9ICisjZGVmaW5lIF9NVFBfQ1VSU09SX0gKKworI2luY2x1ZGUgIk10cFR5cGVzLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgQ3Vyc29yV2luZG93OworCitjbGFzcyBNdHBDdXJzb3IgeworcHJpdmF0ZToKKyAgICBlbnVtIHsKKyAgICAgICAgREVWSUNFICAgICAgICAgICAgICA9IDEsCisgICAgICAgIERFVklDRV9JRCAgICAgICAgICAgPSAyLAorICAgICAgICBTVE9SQUdFICAgICAgICAgICAgID0gMywKKyAgICAgICAgU1RPUkFHRV9JRCAgICAgICAgICA9IDQsCisgICAgICAgIE9CSkVDVCAgICAgICAgICAgICAgPSA1LAorICAgICAgICBPQkpFQ1RfSUQgICAgICAgICAgID0gNiwKKyAgICAgICAgU1RPUkFHRV9DSElMRFJFTiAgICA9IDcsCisgICAgICAgIE9CSkVDVF9DSElMRFJFTiAgICAgPSA4LAorICAgIH07CisKKyAgICBNdHBDbGllbnQqICBtQ2xpZW50OworICAgIGludCAgICAgICAgIG1RdWVyeVR5cGU7CisgICAgaW50ICAgICAgICAgbURldmljZUlEOworICAgIGludCAgICAgICAgIG1TdG9yYWdlSUQ7CisgICAgaW50ICAgICAgICAgbVFiamVjdElEOworICAgIGludCAgICAgICAgIG1Db2x1bW5Db3VudDsKKyAgICBpbnQqICAgICAgICBtQ29sdW1uczsKKworcHVibGljOgorICAgICAgICAgICAgICAgIE10cEN1cnNvcihNdHBDbGllbnQqIGNsaWVudCwgaW50IHF1ZXJ5VHlwZSwgaW50IGRldmljZUlELAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0b3JhZ2VJRCwgaW50IG9iamVjdElELCBpbnQgY29sdW1uQ291bnQsIGludCogY29sdW1ucyk7CisgICAgdmlydHVhbCAgICAgfk10cEN1cnNvcigpOworCisgICAgaW50ICAgICAgICAgZmlsbFdpbmRvdyhDdXJzb3JXaW5kb3cqIHdpbmRvdywgaW50IHN0YXJ0UG9zKTsKKworcHJpdmF0ZToKKyAgICBpbnQgICAgICAgICBmaWxsRGV2aWNlcyhDdXJzb3JXaW5kb3cqIHdpbmRvdywgaW50IHN0YXJ0UG9zKTsKKyAgICBpbnQgICAgICAgICBmaWxsRGV2aWNlKEN1cnNvcldpbmRvdyogd2luZG93LCBpbnQgc3RhcnRQb3MpOworICAgIGludCAgICAgICAgIGZpbGxTdG9yYWdlcyhDdXJzb3JXaW5kb3cqIHdpbmRvdywgaW50IHN0YXJ0UG9zKTsKKyAgICBpbnQgICAgICAgICBmaWxsU3RvcmFnZShDdXJzb3JXaW5kb3cqIHdpbmRvdywgaW50IHN0YXJ0UG9zKTsKKyAgICBpbnQgICAgICAgICBmaWxsT2JqZWN0cyhDdXJzb3JXaW5kb3cqIHdpbmRvdywgaW50IHBhcmVudCwgaW50IHN0YXJ0UG9zKTsKKyAgICBpbnQgICAgICAgICBmaWxsT2JqZWN0KEN1cnNvcldpbmRvdyogd2luZG93LCBpbnQgc3RhcnRQb3MpOworCisgICAgYm9vbCAgICAgICAgZmlsbERldmljZShDdXJzb3JXaW5kb3cqIHdpbmRvdywgTXRwRGV2aWNlKiBkZXZpY2UsIGludCBzdGFydFBvcyk7CisgICAgYm9vbCAgICAgICAgZmlsbFN0b3JhZ2UoQ3Vyc29yV2luZG93KiB3aW5kb3csIE10cERldmljZSogZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgTXRwU3RvcmFnZUlEIHN0b3JhZ2VJRCwgaW50IHJvdyk7CisgICAgYm9vbCAgICAgICAgZmlsbE9iamVjdChDdXJzb3JXaW5kb3cqIHdpbmRvdywgTXRwRGV2aWNlKiBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RIYW5kbGUgb2JqZWN0SUQsIGludCByb3cpOworCisgICAgYm9vbCAgICAgICAgcHJlcGFyZVJvdyhDdXJzb3JXaW5kb3cqIHdpbmRvdyk7CisgICAgYm9vbCAgICAgICAgcHV0TG9uZyhDdXJzb3JXaW5kb3cqIHdpbmRvdywgaW50IHZhbHVlLCBpbnQgcm93LCBpbnQgY29sdW1uKTsKKyAgICBib29sICAgICAgICBwdXRTdHJpbmcoQ3Vyc29yV2luZG93KiB3aW5kb3csIGNvbnN0IGNoYXIqIHRleHQsIGludCByb3csIGludCBjb2x1bW4pOworICAgIGJvb2wgICAgICAgIHB1dFRodW1ibmFpbChDdXJzb3JXaW5kb3cqIHdpbmRvdywgaW50IG9iamVjdElELCBpbnQgcm93LCBpbnQgY29sdW1uKTsKK307CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBfTVRQX0NVUlNPUl9ICmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwRGF0YVBhY2tldC5jcHAgYi9tZWRpYS9tdHAvTXRwRGF0YVBhY2tldC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDEyNDI1YQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL210cC9NdHBEYXRhUGFja2V0LmNwcApAQCAtMCwwICsxLDQxMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisKKyNpbmNsdWRlICJNdHBEYXRhUGFja2V0LmgiCisjaW5jbHVkZSAiTXRwU3RyaW5nQnVmZmVyLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworTXRwRGF0YVBhY2tldDo6TXRwRGF0YVBhY2tldCgpCisgICAgOiAgIE10cFBhY2tldCg1MTIpLAorICAgICAgICBtT2Zmc2V0KE1UUF9DT05UQUlORVJfSEVBREVSX1NJWkUpCit7Cit9CisKK010cERhdGFQYWNrZXQ6On5NdHBEYXRhUGFja2V0KCkgeworfQorCit2b2lkIE10cERhdGFQYWNrZXQ6OnJlc2V0KCkgeworICAgIE10cFBhY2tldDo6cmVzZXQoKTsKKyAgICBtT2Zmc2V0ID0gTVRQX0NPTlRBSU5FUl9IRUFERVJfU0laRTsKK30KKwordm9pZCBNdHBEYXRhUGFja2V0OjpzZXRPcGVyYXRpb25Db2RlKE10cE9wZXJhdGlvbkNvZGUgY29kZSkgeworICAgIE10cFBhY2tldDo6cHV0VUludDE2KE1UUF9DT05UQUlORVJfQ09ERV9PRkZTRVQsIGNvZGUpOworfQorCit2b2lkIE10cERhdGFQYWNrZXQ6OnNldFRyYW5zYWN0aW9uSUQoTXRwVHJhbnNhY3Rpb25JRCBpZCkgeworICAgIE10cFBhY2tldDo6cHV0VUludDMyKE1UUF9DT05UQUlORVJfVFJBTlNBQ1RJT05fSURfT0ZGU0VULCBpZCk7Cit9CisKK3VpbnQxNl90IE10cERhdGFQYWNrZXQ6OmdldFVJbnQxNigpIHsKKyAgICBpbnQgb2Zmc2V0ID0gbU9mZnNldDsKKyAgICB1aW50MTZfdCByZXN1bHQgPSAodWludDE2X3QpbUJ1ZmZlcltvZmZzZXRdIHwgKCh1aW50MTZfdCltQnVmZmVyW29mZnNldCArIDFdIDw8IDgpOworICAgIG1PZmZzZXQgKz0gMjsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCit1aW50MzJfdCBNdHBEYXRhUGFja2V0OjpnZXRVSW50MzIoKSB7CisgICAgaW50IG9mZnNldCA9IG1PZmZzZXQ7CisgICAgdWludDMyX3QgcmVzdWx0ID0gKHVpbnQzMl90KW1CdWZmZXJbb2Zmc2V0XSB8ICgodWludDMyX3QpbUJ1ZmZlcltvZmZzZXQgKyAxXSA8PCA4KSB8CisgICAgICAgICAgICgodWludDMyX3QpbUJ1ZmZlcltvZmZzZXQgKyAyXSA8PCAxNikgIHwgKCh1aW50MzJfdCltQnVmZmVyW29mZnNldCArIDNdIDw8IDI0KTsKKyAgICBtT2Zmc2V0ICs9IDQ7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKwordWludDY0X3QgTXRwRGF0YVBhY2tldDo6Z2V0VUludDY0KCkgeworICAgIGludCBvZmZzZXQgPSBtT2Zmc2V0OworICAgIHVpbnQ2NF90IHJlc3VsdCA9ICh1aW50NjRfdCltQnVmZmVyW29mZnNldF0gfCAoKHVpbnQ2NF90KW1CdWZmZXJbb2Zmc2V0ICsgMV0gPDwgOCkgfAorICAgICAgICAgICAoKHVpbnQ2NF90KW1CdWZmZXJbb2Zmc2V0ICsgMl0gPDwgMTYpIHwgKCh1aW50NjRfdCltQnVmZmVyW29mZnNldCArIDNdIDw8IDI0KSB8CisgICAgICAgICAgICgodWludDY0X3QpbUJ1ZmZlcltvZmZzZXQgKyA0XSA8PCAzMikgfCAoKHVpbnQ2NF90KW1CdWZmZXJbb2Zmc2V0ICsgNV0gPDwgNDApIHwKKyAgICAgICAgICAgKCh1aW50NjRfdCltQnVmZmVyW29mZnNldCArIDZdIDw8IDQ4KSAgfCAoKHVpbnQ2NF90KW1CdWZmZXJbb2Zmc2V0ICsgN10gPDwgNTYpOworICAgIG1PZmZzZXQgKz0gODsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCit2b2lkIE10cERhdGFQYWNrZXQ6OmdldFVJbnQxMjgodWludDEyOF90JiB2YWx1ZSkgeworICAgIHZhbHVlWzBdID0gZ2V0VUludDMyKCk7CisgICAgdmFsdWVbMV0gPSBnZXRVSW50MzIoKTsKKyAgICB2YWx1ZVsyXSA9IGdldFVJbnQzMigpOworICAgIHZhbHVlWzNdID0gZ2V0VUludDMyKCk7Cit9CisKK3ZvaWQgTXRwRGF0YVBhY2tldDo6Z2V0U3RyaW5nKE10cFN0cmluZ0J1ZmZlciYgc3RyaW5nKQoreworICAgIHN0cmluZy5yZWFkRnJvbVBhY2tldCh0aGlzKTsKK30KKworSW50OExpc3QqIE10cERhdGFQYWNrZXQ6OmdldEFJbnQ4KCkgeworICAgIEludDhMaXN0KiByZXN1bHQgPSBuZXcgSW50OExpc3Q7CisgICAgaW50IGNvdW50ID0gZ2V0VUludDMyKCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorICAgICAgICByZXN1bHQtPnB1c2goZ2V0SW50OCgpKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitVSW50OExpc3QqIE10cERhdGFQYWNrZXQ6OmdldEFVSW50OCgpIHsKKyAgICBVSW50OExpc3QqIHJlc3VsdCA9IG5ldyBVSW50OExpc3Q7CisgICAgaW50IGNvdW50ID0gZ2V0VUludDMyKCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorICAgICAgICByZXN1bHQtPnB1c2goZ2V0VUludDgoKSk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworSW50MTZMaXN0KiBNdHBEYXRhUGFja2V0OjpnZXRBSW50MTYoKSB7CisgICAgSW50MTZMaXN0KiByZXN1bHQgPSBuZXcgSW50MTZMaXN0OworICAgIGludCBjb3VudCA9IGdldFVJbnQzMigpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKyAgICAgICAgcmVzdWx0LT5wdXNoKGdldEludDE2KCkpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1VJbnQxNkxpc3QqIE10cERhdGFQYWNrZXQ6OmdldEFVSW50MTYoKSB7CisgICAgVUludDE2TGlzdCogcmVzdWx0ID0gbmV3IFVJbnQxNkxpc3Q7CisgICAgaW50IGNvdW50ID0gZ2V0VUludDMyKCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorICAgICAgICByZXN1bHQtPnB1c2goZ2V0VUludDE2KCkpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK0ludDMyTGlzdCogTXRwRGF0YVBhY2tldDo6Z2V0QUludDMyKCkgeworICAgIEludDMyTGlzdCogcmVzdWx0ID0gbmV3IEludDMyTGlzdDsKKyAgICBpbnQgY291bnQgPSBnZXRVSW50MzIoKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspCisgICAgICAgIHJlc3VsdC0+cHVzaChnZXRJbnQzMigpKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitVSW50MzJMaXN0KiBNdHBEYXRhUGFja2V0OjpnZXRBVUludDMyKCkgeworICAgIFVJbnQzMkxpc3QqIHJlc3VsdCA9IG5ldyBVSW50MzJMaXN0OworICAgIGludCBjb3VudCA9IGdldFVJbnQzMigpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKyAgICAgICAgcmVzdWx0LT5wdXNoKGdldFVJbnQzMigpKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitJbnQ2NExpc3QqIE10cERhdGFQYWNrZXQ6OmdldEFJbnQ2NCgpIHsKKyAgICBJbnQ2NExpc3QqIHJlc3VsdCA9IG5ldyBJbnQ2NExpc3Q7CisgICAgaW50IGNvdW50ID0gZ2V0VUludDMyKCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorICAgICAgICByZXN1bHQtPnB1c2goZ2V0SW50NjQoKSk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVUludDY0TGlzdCogTXRwRGF0YVBhY2tldDo6Z2V0QVVJbnQ2NCgpIHsKKyAgICBVSW50NjRMaXN0KiByZXN1bHQgPSBuZXcgVUludDY0TGlzdDsKKyAgICBpbnQgY291bnQgPSBnZXRVSW50MzIoKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspCisgICAgICAgIHJlc3VsdC0+cHVzaChnZXRVSW50NjQoKSk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKwordm9pZCBNdHBEYXRhUGFja2V0OjpwdXRJbnQ4KGludDhfdCB2YWx1ZSkgeworICAgIGFsbG9jYXRlKG1PZmZzZXQgKyAxKTsKKyAgICBtQnVmZmVyW21PZmZzZXQrK10gPSAodWludDhfdCl2YWx1ZTsKKyAgICBpZiAobVBhY2tldFNpemUgPCBtT2Zmc2V0KQorICAgICAgICBtUGFja2V0U2l6ZSA9IG1PZmZzZXQ7Cit9CisKK3ZvaWQgTXRwRGF0YVBhY2tldDo6cHV0VUludDgodWludDhfdCB2YWx1ZSkgeworICAgIGFsbG9jYXRlKG1PZmZzZXQgKyAxKTsKKyAgICBtQnVmZmVyW21PZmZzZXQrK10gPSAodWludDhfdCl2YWx1ZTsKKyAgICBpZiAobVBhY2tldFNpemUgPCBtT2Zmc2V0KQorICAgICAgICBtUGFja2V0U2l6ZSA9IG1PZmZzZXQ7Cit9CisKK3ZvaWQgTXRwRGF0YVBhY2tldDo6cHV0SW50MTYoaW50MTZfdCB2YWx1ZSkgeworICAgIGFsbG9jYXRlKG1PZmZzZXQgKyAyKTsKKyAgICBtQnVmZmVyW21PZmZzZXQrK10gPSAodWludDhfdCkodmFsdWUgJiAweEZGKTsKKyAgICBtQnVmZmVyW21PZmZzZXQrK10gPSAodWludDhfdCkoKHZhbHVlID4+IDgpICYgMHhGRik7CisgICAgaWYgKG1QYWNrZXRTaXplIDwgbU9mZnNldCkKKyAgICAgICAgbVBhY2tldFNpemUgPSBtT2Zmc2V0OworfQorCit2b2lkIE10cERhdGFQYWNrZXQ6OnB1dFVJbnQxNih1aW50MTZfdCB2YWx1ZSkgeworICAgIGFsbG9jYXRlKG1PZmZzZXQgKyAyKTsKKyAgICBtQnVmZmVyW21PZmZzZXQrK10gPSAodWludDhfdCkodmFsdWUgJiAweEZGKTsKKyAgICBtQnVmZmVyW21PZmZzZXQrK10gPSAodWludDhfdCkoKHZhbHVlID4+IDgpICYgMHhGRik7CisgICAgaWYgKG1QYWNrZXRTaXplIDwgbU9mZnNldCkKKyAgICAgICAgbVBhY2tldFNpemUgPSBtT2Zmc2V0OworfQorCit2b2lkIE10cERhdGFQYWNrZXQ6OnB1dEludDMyKGludDMyX3QgdmFsdWUpIHsKKyAgICBhbGxvY2F0ZShtT2Zmc2V0ICsgNCk7CisgICAgbUJ1ZmZlclttT2Zmc2V0KytdID0gKHVpbnQ4X3QpKHZhbHVlICYgMHhGRik7CisgICAgbUJ1ZmZlclttT2Zmc2V0KytdID0gKHVpbnQ4X3QpKCh2YWx1ZSA+PiA4KSAmIDB4RkYpOworICAgIG1CdWZmZXJbbU9mZnNldCsrXSA9ICh1aW50OF90KSgodmFsdWUgPj4gMTYpICYgMHhGRik7CisgICAgbUJ1ZmZlclttT2Zmc2V0KytdID0gKHVpbnQ4X3QpKCh2YWx1ZSA+PiAyNCkgJiAweEZGKTsKKyAgICBpZiAobVBhY2tldFNpemUgPCBtT2Zmc2V0KQorICAgICAgICBtUGFja2V0U2l6ZSA9IG1PZmZzZXQ7Cit9CisKK3ZvaWQgTXRwRGF0YVBhY2tldDo6cHV0VUludDMyKHVpbnQzMl90IHZhbHVlKSB7CisgICAgYWxsb2NhdGUobU9mZnNldCArIDQpOworICAgIG1CdWZmZXJbbU9mZnNldCsrXSA9ICh1aW50OF90KSh2YWx1ZSAmIDB4RkYpOworICAgIG1CdWZmZXJbbU9mZnNldCsrXSA9ICh1aW50OF90KSgodmFsdWUgPj4gOCkgJiAweEZGKTsKKyAgICBtQnVmZmVyW21PZmZzZXQrK10gPSAodWludDhfdCkoKHZhbHVlID4+IDE2KSAmIDB4RkYpOworICAgIG1CdWZmZXJbbU9mZnNldCsrXSA9ICh1aW50OF90KSgodmFsdWUgPj4gMjQpICYgMHhGRik7CisgICAgaWYgKG1QYWNrZXRTaXplIDwgbU9mZnNldCkKKyAgICAgICAgbVBhY2tldFNpemUgPSBtT2Zmc2V0OworfQorCit2b2lkIE10cERhdGFQYWNrZXQ6OnB1dEludDY0KGludDY0X3QgdmFsdWUpIHsKKyAgICBhbGxvY2F0ZShtT2Zmc2V0ICsgOCk7CisgICAgbUJ1ZmZlclttT2Zmc2V0KytdID0gKHVpbnQ4X3QpKHZhbHVlICYgMHhGRik7CisgICAgbUJ1ZmZlclttT2Zmc2V0KytdID0gKHVpbnQ4X3QpKCh2YWx1ZSA+PiA4KSAmIDB4RkYpOworICAgIG1CdWZmZXJbbU9mZnNldCsrXSA9ICh1aW50OF90KSgodmFsdWUgPj4gMTYpICYgMHhGRik7CisgICAgbUJ1ZmZlclttT2Zmc2V0KytdID0gKHVpbnQ4X3QpKCh2YWx1ZSA+PiAyNCkgJiAweEZGKTsKKyAgICBtQnVmZmVyW21PZmZzZXQrK10gPSAodWludDhfdCkoKHZhbHVlID4+IDMyKSAmIDB4RkYpOworICAgIG1CdWZmZXJbbU9mZnNldCsrXSA9ICh1aW50OF90KSgodmFsdWUgPj4gNDApICYgMHhGRik7CisgICAgbUJ1ZmZlclttT2Zmc2V0KytdID0gKHVpbnQ4X3QpKCh2YWx1ZSA+PiA0OCkgJiAweEZGKTsKKyAgICBtQnVmZmVyW21PZmZzZXQrK10gPSAodWludDhfdCkoKHZhbHVlID4+IDU2KSAmIDB4RkYpOworICAgIGlmIChtUGFja2V0U2l6ZSA8IG1PZmZzZXQpCisgICAgICAgIG1QYWNrZXRTaXplID0gbU9mZnNldDsKK30KKwordm9pZCBNdHBEYXRhUGFja2V0OjpwdXRVSW50NjQodWludDY0X3QgdmFsdWUpIHsKKyAgICBhbGxvY2F0ZShtT2Zmc2V0ICsgOCk7CisgICAgbUJ1ZmZlclttT2Zmc2V0KytdID0gKHVpbnQ4X3QpKHZhbHVlICYgMHhGRik7CisgICAgbUJ1ZmZlclttT2Zmc2V0KytdID0gKHVpbnQ4X3QpKCh2YWx1ZSA+PiA4KSAmIDB4RkYpOworICAgIG1CdWZmZXJbbU9mZnNldCsrXSA9ICh1aW50OF90KSgodmFsdWUgPj4gMTYpICYgMHhGRik7CisgICAgbUJ1ZmZlclttT2Zmc2V0KytdID0gKHVpbnQ4X3QpKCh2YWx1ZSA+PiAyNCkgJiAweEZGKTsKKyAgICBtQnVmZmVyW21PZmZzZXQrK10gPSAodWludDhfdCkoKHZhbHVlID4+IDMyKSAmIDB4RkYpOworICAgIG1CdWZmZXJbbU9mZnNldCsrXSA9ICh1aW50OF90KSgodmFsdWUgPj4gNDApICYgMHhGRik7CisgICAgbUJ1ZmZlclttT2Zmc2V0KytdID0gKHVpbnQ4X3QpKCh2YWx1ZSA+PiA0OCkgJiAweEZGKTsKKyAgICBtQnVmZmVyW21PZmZzZXQrK10gPSAodWludDhfdCkoKHZhbHVlID4+IDU2KSAmIDB4RkYpOworICAgIGlmIChtUGFja2V0U2l6ZSA8IG1PZmZzZXQpCisgICAgICAgIG1QYWNrZXRTaXplID0gbU9mZnNldDsKK30KKwordm9pZCBNdHBEYXRhUGFja2V0OjpwdXRJbnQxMjgoY29uc3QgaW50MTI4X3QmIHZhbHVlKSB7CisgICAgcHV0SW50MzIodmFsdWVbMF0pOworICAgIHB1dEludDMyKHZhbHVlWzFdKTsKKyAgICBwdXRJbnQzMih2YWx1ZVsyXSk7CisgICAgcHV0SW50MzIodmFsdWVbM10pOworfQorCit2b2lkIE10cERhdGFQYWNrZXQ6OnB1dFVJbnQxMjgoY29uc3QgdWludDEyOF90JiB2YWx1ZSkgeworICAgIHB1dFVJbnQzMih2YWx1ZVswXSk7CisgICAgcHV0VUludDMyKHZhbHVlWzFdKTsKKyAgICBwdXRVSW50MzIodmFsdWVbMl0pOworICAgIHB1dFVJbnQzMih2YWx1ZVszXSk7Cit9CisKK3ZvaWQgTXRwRGF0YVBhY2tldDo6cHV0QUludDgoY29uc3QgaW50OF90KiB2YWx1ZXMsIGludCBjb3VudCkgeworICAgIHB1dFVJbnQzMihjb3VudCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorICAgICAgICBwdXRJbnQ4KCp2YWx1ZXMrKyk7Cit9CisKK3ZvaWQgTXRwRGF0YVBhY2tldDo6cHV0QVVJbnQ4KGNvbnN0IHVpbnQ4X3QqIHZhbHVlcywgaW50IGNvdW50KSB7CisgICAgcHV0VUludDMyKGNvdW50KTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspCisgICAgICAgIHB1dFVJbnQ4KCp2YWx1ZXMrKyk7Cit9CisKK3ZvaWQgTXRwRGF0YVBhY2tldDo6cHV0QUludDE2KGNvbnN0IGludDE2X3QqIHZhbHVlcywgaW50IGNvdW50KSB7CisgICAgcHV0VUludDMyKGNvdW50KTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspCisgICAgICAgIHB1dEludDE2KCp2YWx1ZXMrKyk7Cit9CisKK3ZvaWQgTXRwRGF0YVBhY2tldDo6cHV0QVVJbnQxNihjb25zdCB1aW50MTZfdCogdmFsdWVzLCBpbnQgY291bnQpIHsKKyAgICBwdXRVSW50MzIoY291bnQpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKyAgICAgICAgcHV0VUludDE2KCp2YWx1ZXMrKyk7Cit9CisKK3ZvaWQgTXRwRGF0YVBhY2tldDo6cHV0QUludDMyKGNvbnN0IGludDMyX3QqIHZhbHVlcywgaW50IGNvdW50KSB7CisgICAgcHV0VUludDMyKGNvdW50KTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspCisgICAgICAgIHB1dEludDMyKCp2YWx1ZXMrKyk7Cit9CisKK3ZvaWQgTXRwRGF0YVBhY2tldDo6cHV0QVVJbnQzMihjb25zdCB1aW50MzJfdCogdmFsdWVzLCBpbnQgY291bnQpIHsKKyAgICBwdXRVSW50MzIoY291bnQpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKyAgICAgICAgcHV0VUludDMyKCp2YWx1ZXMrKyk7Cit9CisKK3ZvaWQgTXRwRGF0YVBhY2tldDo6cHV0QVVJbnQzMihjb25zdCBVSW50MzJMaXN0KiBsaXN0KSB7CisgICAgaWYgKCFsaXN0KSB7CisgICAgICAgIHB1dEVtcHR5QXJyYXkoKTsKKyAgICB9IGVsc2UgeworICAgICAgICBzaXplX3Qgc2l6ZSA9IGxpc3QtPnNpemUoKTsKKyAgICAgICAgcHV0VUludDMyKHNpemUpOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7IGkrKykKKyAgICAgICAgICAgIHB1dFVJbnQzMigoKmxpc3QpW2ldKTsKKyAgICB9Cit9CisKK3ZvaWQgTXRwRGF0YVBhY2tldDo6cHV0QUludDY0KGNvbnN0IGludDY0X3QqIHZhbHVlcywgaW50IGNvdW50KSB7CisgICAgcHV0VUludDMyKGNvdW50KTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspCisgICAgICAgIHB1dEludDY0KCp2YWx1ZXMrKyk7Cit9CisKK3ZvaWQgTXRwRGF0YVBhY2tldDo6cHV0QVVJbnQ2NChjb25zdCB1aW50NjRfdCogdmFsdWVzLCBpbnQgY291bnQpIHsKKyAgICBwdXRVSW50MzIoY291bnQpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKyAgICAgICAgcHV0VUludDY0KCp2YWx1ZXMrKyk7Cit9CisKK3ZvaWQgTXRwRGF0YVBhY2tldDo6cHV0U3RyaW5nKGNvbnN0IE10cFN0cmluZ0J1ZmZlciYgc3RyaW5nKQoreworICAgIHN0cmluZy53cml0ZVRvUGFja2V0KHRoaXMpOworfQorCit2b2lkIE10cERhdGFQYWNrZXQ6OnB1dFN0cmluZyhjb25zdCBjaGFyKiBzKQoreworICAgIE10cFN0cmluZ0J1ZmZlciBzdHJpbmcocyk7CisgICAgc3RyaW5nLndyaXRlVG9QYWNrZXQodGhpcyk7Cit9CisKKyNpZmRlZiBNVFBfREVWSUNFIAoraW50IE10cERhdGFQYWNrZXQ6OnJlYWQoaW50IGZkKSB7CisgICAgLy8gZmlyc3QgcmVhZCB0aGUgaGVhZGVyCisgICAgaW50IHJldCA9IDo6cmVhZChmZCwgbUJ1ZmZlciwgTVRQX0NPTlRBSU5FUl9IRUFERVJfU0laRSk7CitwcmludGYoIk10cERhdGFQYWNrZXQ6OnJlYWQgMSByZXR1cm5lZCAlZFxuIiwgcmV0KTsKKyAgICBpZiAocmV0ICE9IE1UUF9DT05UQUlORVJfSEVBREVSX1NJWkUpCisgICAgICAgIHJldHVybiAtMTsKKyAgICAvLyB0aGVuIHRoZSBmb2xsb3dpbmcgZGF0YQorICAgIGludCB0b3RhbCA9IE10cFBhY2tldDo6Z2V0VUludDMyKE1UUF9DT05UQUlORVJfTEVOR1RIX09GRlNFVCk7CisgICAgaW50IHJlbWFpbmluZyA9IHRvdGFsIC0gTVRQX0NPTlRBSU5FUl9IRUFERVJfU0laRTsKK3ByaW50ZigidG90YWw6ICVkLCByZW1haW5pbmc6ICVkXG4iLCB0b3RhbCwgcmVtYWluaW5nKTsKKyAgICByZXQgPSA6OnJlYWQoZmQsICZtQnVmZmVyWzBdICsgTVRQX0NPTlRBSU5FUl9IRUFERVJfU0laRSwgcmVtYWluaW5nKTsKK3ByaW50ZigiTXRwRGF0YVBhY2tldDo6cmVhZCAyIHJldHVybmVkICVkXG4iLCByZXQpOworICAgIGlmIChyZXQgIT0gcmVtYWluaW5nKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBtUGFja2V0U2l6ZSA9IHRvdGFsOworICAgIG1PZmZzZXQgPSBNVFBfQ09OVEFJTkVSX0hFQURFUl9TSVpFOworICAgIHJldHVybiB0b3RhbDsKK30KKworaW50IE10cERhdGFQYWNrZXQ6OnJlYWREYXRhSGVhZGVyKGludCBmZCkgeworICAgIGludCByZXQgPSA6OnJlYWQoZmQsIG1CdWZmZXIsIE1UUF9DT05UQUlORVJfSEVBREVSX1NJWkUpOworICAgIGlmIChyZXQgPiAwKQorICAgICAgICBtUGFja2V0U2l6ZSA9IHJldDsKKyAgICBlbHNlCisgICAgICAgIG1QYWNrZXRTaXplID0gMDsKKyAgICByZXR1cm4gcmV0OworfQorCitpbnQgTXRwRGF0YVBhY2tldDo6d3JpdGUoaW50IGZkKSB7CisgICAgTXRwUGFja2V0OjpwdXRVSW50MzIoTVRQX0NPTlRBSU5FUl9MRU5HVEhfT0ZGU0VULCBtUGFja2V0U2l6ZSk7CisgICAgTXRwUGFja2V0OjpwdXRVSW50MTYoTVRQX0NPTlRBSU5FUl9UWVBFX09GRlNFVCwgTVRQX0NPTlRBSU5FUl9UWVBFX0RBVEEpOworCisgICAgLy8gc2VuZCBoZWFkZXIgc2VwYXJhdGVseSBmcm9tIGRhdGEKKyAgICBpbnQgcmV0ID0gOjp3cml0ZShmZCwgbUJ1ZmZlciwgTVRQX0NPTlRBSU5FUl9IRUFERVJfU0laRSk7CisgICAgaWYgKHJldCA9PSBNVFBfQ09OVEFJTkVSX0hFQURFUl9TSVpFKQorICAgICAgICByZXQgPSA6OndyaXRlKGZkLCBtQnVmZmVyICsgTVRQX0NPTlRBSU5FUl9IRUFERVJfU0laRSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1QYWNrZXRTaXplIC0gTVRQX0NPTlRBSU5FUl9IRUFERVJfU0laRSk7CisgICAgcmV0dXJuIChyZXQgPCAwID8gcmV0IDogMCk7Cit9CisKK2ludCBNdHBEYXRhUGFja2V0Ojp3cml0ZURhdGFIZWFkZXIoaW50IGZkLCB1aW50MzJfdCBsZW5ndGgpIHsKKyAgICBNdHBQYWNrZXQ6OnB1dFVJbnQzMihNVFBfQ09OVEFJTkVSX0xFTkdUSF9PRkZTRVQsIGxlbmd0aCk7CisgICAgTXRwUGFja2V0OjpwdXRVSW50MTYoTVRQX0NPTlRBSU5FUl9UWVBFX09GRlNFVCwgTVRQX0NPTlRBSU5FUl9UWVBFX0RBVEEpOworICAgIGludCByZXQgPSA6OndyaXRlKGZkLCBtQnVmZmVyLCBNVFBfQ09OVEFJTkVSX0hFQURFUl9TSVpFKTsKKyAgICByZXR1cm4gKHJldCA8IDAgPyByZXQgOiAwKTsKK30KKyNlbmRpZiAvLyBNVFBfREVWSUNFCisKKyNpZmRlZiBNVFBfSE9TVAoraW50IE10cERhdGFQYWNrZXQ6OnJlYWQoc3RydWN0IHVzYl9lbmRwb2ludCAqZXApIHsKKyAgICAvLyBmaXJzdCByZWFkIHRoZSBoZWFkZXIKKyAgICBpbnQgbGVuZ3RoID0gdHJhbnNmZXIoZXAsIG1CdWZmZXIsIG1CdWZmZXJTaXplKTsKKyAgICBpZiAobGVuZ3RoID4gTVRQX0NPTlRBSU5FUl9IRUFERVJfU0laRSkgeworICAgICAgICAvLyBsb29rIGF0IHRoZSBsZW5ndGggZmllbGQgdG8gc2VlIGlmIHRoZSBkYXRhIHNwYW5zIG11bHRpcGxlIHBhY2tldHMKKyAgICAgICAgdWludDMyX3QgdG90YWxMZW5ndGggPSBNdHBQYWNrZXQ6OmdldFVJbnQzMihNVFBfQ09OVEFJTkVSX0xFTkdUSF9PRkZTRVQpOworICAgICAgICB3aGlsZSAodG90YWxMZW5ndGggPiBsZW5ndGgpIHsKKyAgICAgICAgICAgIGFsbG9jYXRlKGxlbmd0aCArIG1BbGxvY2F0aW9uSW5jcmVtZW50KTsKKyAgICAgICAgICAgIGludCByZXQgPSB0cmFuc2ZlcihlcCwgbUJ1ZmZlciArIGxlbmd0aCwgbUFsbG9jYXRpb25JbmNyZW1lbnQpOworICAgICAgICAgICAgaWYgKHJldCA+PSAwKQorICAgICAgICAgICAgICAgIGxlbmd0aCArPSByZXQ7CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBsZW5ndGggPSByZXQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGxlbmd0aCA+PSAwKQorICAgICAgICBtUGFja2V0U2l6ZSA9IGxlbmd0aDsKKyAgICByZXR1cm4gbGVuZ3RoOworfQorCitpbnQgTXRwRGF0YVBhY2tldDo6d3JpdGUoc3RydWN0IHVzYl9lbmRwb2ludCAqZXApIHsKKyAgICBNdHBQYWNrZXQ6OnB1dFVJbnQzMihNVFBfQ09OVEFJTkVSX0xFTkdUSF9PRkZTRVQsIG1QYWNrZXRTaXplKTsKKyAgICBNdHBQYWNrZXQ6OnB1dFVJbnQxNihNVFBfQ09OVEFJTkVSX1RZUEVfT0ZGU0VULCBNVFBfQ09OVEFJTkVSX1RZUEVfREFUQSk7CisKKyAgICAvLyBzZW5kIGhlYWRlciBzZXBhcmF0ZWx5IGZyb20gZGF0YQorICAgIGludCByZXQgPSB0cmFuc2ZlcihlcCwgbUJ1ZmZlciwgTVRQX0NPTlRBSU5FUl9IRUFERVJfU0laRSk7CisgICAgaWYgKHJldCA9PSBNVFBfQ09OVEFJTkVSX0hFQURFUl9TSVpFKQorICAgICAgICByZXQgPSB0cmFuc2ZlcihlcCwgbUJ1ZmZlciArIE1UUF9DT05UQUlORVJfSEVBREVSX1NJWkUsCisgICAgICAgICAgICAgICAgICAgICAgICBtUGFja2V0U2l6ZSAtIE1UUF9DT05UQUlORVJfSEVBREVSX1NJWkUpOworICAgIHJldHVybiAocmV0IDwgMCA/IHJldCA6IDApOworfQorCisjZW5kaWYgLy8gTVRQX0hPU1QKKwordm9pZCogTXRwRGF0YVBhY2tldDo6Z2V0RGF0YShpbnQmIG91dExlbmd0aCkgY29uc3QgeworICAgIGludCBsZW5ndGggPSBtUGFja2V0U2l6ZSAtIE1UUF9DT05UQUlORVJfSEVBREVSX1NJWkU7CisgICAgaWYgKGxlbmd0aCA+IDApIHsKKyAgICAgICAgdm9pZCogcmVzdWx0ID0gbWFsbG9jKGxlbmd0aCk7CisgICAgICAgIGlmIChyZXN1bHQpIHsKKyAgICAgICAgICAgIG1lbWNweShyZXN1bHQsIG1CdWZmZXIgKyBNVFBfQ09OVEFJTkVSX0hFQURFUl9TSVpFLCBsZW5ndGgpOworICAgICAgICAgICAgb3V0TGVuZ3RoID0gbGVuZ3RoOworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgIH0KKyAgICBvdXRMZW5ndGggPSAwOworICAgIHJldHVybiBOVUxMOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cERhdGFQYWNrZXQuaCBiL21lZGlhL210cC9NdHBEYXRhUGFja2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQ2ZWY2NAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL210cC9NdHBEYXRhUGFja2V0LmgKQEAgLTAsMCArMSwxMDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9NVFBfREFUQV9QQUNLRVRfSAorI2RlZmluZSBfTVRQX0RBVEFfUEFDS0VUX0gKKworI2luY2x1ZGUgIk10cFBhY2tldC5oIgorI2luY2x1ZGUgIm10cC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIE10cERhdGFQYWNrZXQgOiBwdWJsaWMgTXRwUGFja2V0IHsKK3ByaXZhdGU6CisgICAgLy8gY3VycmVudCBvZmZzZXQgZm9yIGdldC9wdXQgbWV0aG9kcworICAgIGludCAgICAgICAgICAgICAgICAgbU9mZnNldDsKKworcHVibGljOgorICAgICAgICAgICAgICAgICAgICAgICAgTXRwRGF0YVBhY2tldCgpOworICAgIHZpcnR1YWwgICAgICAgICAgICAgfk10cERhdGFQYWNrZXQoKTsKKworICAgIHZpcnR1YWwgdm9pZCAgICAgICAgcmVzZXQoKTsKKworICAgIHZvaWQgICAgICAgICAgICAgICAgc2V0T3BlcmF0aW9uQ29kZShNdHBPcGVyYXRpb25Db2RlIGNvZGUpOworICAgIHZvaWQgICAgICAgICAgICAgICAgc2V0VHJhbnNhY3Rpb25JRChNdHBUcmFuc2FjdGlvbklEIGlkKTsKKworICAgIGlubGluZSB1aW50OF90ICAgICAgZ2V0VUludDgoKSB7IHJldHVybiAodWludDhfdCltQnVmZmVyW21PZmZzZXQrK107IH0KKyAgICBpbmxpbmUgaW50OF90ICAgICAgIGdldEludDgoKSB7IHJldHVybiAoaW50OF90KW1CdWZmZXJbbU9mZnNldCsrXTsgfQorICAgIHVpbnQxNl90ICAgICAgICAgICAgZ2V0VUludDE2KCk7CisgICAgaW5saW5lIGludDE2X3QgICAgICBnZXRJbnQxNigpIHsgcmV0dXJuIChpbnQxNl90KWdldFVJbnQxNigpOyB9CisgICAgdWludDMyX3QgICAgICAgICAgICBnZXRVSW50MzIoKTsKKyAgICBpbmxpbmUgaW50MzJfdCAgICAgIGdldEludDMyKCkgeyByZXR1cm4gKGludDMyX3QpZ2V0VUludDMyKCk7IH0KKyAgICB1aW50NjRfdCAgICAgICAgICAgIGdldFVJbnQ2NCgpOworICAgIGlubGluZSBpbnQ2NF90ICAgICAgZ2V0SW50NjQoKSB7IHJldHVybiAoaW50NjRfdClnZXRVSW50NjQoKTsgfQorICAgIHZvaWQgICAgICAgICAgICAgICAgZ2V0VUludDEyOCh1aW50MTI4X3QmIHZhbHVlKTsKKyAgICBpbmxpbmUgdm9pZCAgICAgICAgIGdldEludDEyOChpbnQxMjhfdCYgdmFsdWUpIHsgZ2V0VUludDEyOCgodWludDEyOF90Jil2YWx1ZSk7IH0KKyAgICB2b2lkICAgICAgICAgICAgICAgIGdldFN0cmluZyhNdHBTdHJpbmdCdWZmZXImIHN0cmluZyk7CisKKyAgICBJbnQ4TGlzdCogICAgICAgICAgIGdldEFJbnQ4KCk7CisgICAgVUludDhMaXN0KiAgICAgICAgICBnZXRBVUludDgoKTsKKyAgICBJbnQxNkxpc3QqICAgICAgICAgIGdldEFJbnQxNigpOworICAgIFVJbnQxNkxpc3QqICAgICAgICAgZ2V0QVVJbnQxNigpOworICAgIEludDMyTGlzdCogICAgICAgICAgZ2V0QUludDMyKCk7CisgICAgVUludDMyTGlzdCogICAgICAgICBnZXRBVUludDMyKCk7CisgICAgSW50NjRMaXN0KiAgICAgICAgICBnZXRBSW50NjQoKTsKKyAgICBVSW50NjRMaXN0KiAgICAgICAgIGdldEFVSW50NjQoKTsKKworICAgIHZvaWQgICAgICAgICAgICAgICAgcHV0SW50OChpbnQ4X3QgdmFsdWUpOworICAgIHZvaWQgICAgICAgICAgICAgICAgcHV0VUludDgodWludDhfdCB2YWx1ZSk7CisgICAgdm9pZCAgICAgICAgICAgICAgICBwdXRJbnQxNihpbnQxNl90IHZhbHVlKTsKKyAgICB2b2lkICAgICAgICAgICAgICAgIHB1dFVJbnQxNih1aW50MTZfdCB2YWx1ZSk7CisgICAgdm9pZCAgICAgICAgICAgICAgICBwdXRJbnQzMihpbnQzMl90IHZhbHVlKTsKKyAgICB2b2lkICAgICAgICAgICAgICAgIHB1dFVJbnQzMih1aW50MzJfdCB2YWx1ZSk7CisgICAgdm9pZCAgICAgICAgICAgICAgICBwdXRJbnQ2NChpbnQ2NF90IHZhbHVlKTsKKyAgICB2b2lkICAgICAgICAgICAgICAgIHB1dFVJbnQ2NCh1aW50NjRfdCB2YWx1ZSk7CisgICAgdm9pZCAgICAgICAgICAgICAgICBwdXRJbnQxMjgoY29uc3QgaW50MTI4X3QmIHZhbHVlKTsKKyAgICB2b2lkICAgICAgICAgICAgICAgIHB1dFVJbnQxMjgoY29uc3QgdWludDEyOF90JiB2YWx1ZSk7CisKKyAgICB2b2lkICAgICAgICAgICAgICAgIHB1dEFJbnQ4KGNvbnN0IGludDhfdCogdmFsdWVzLCBpbnQgY291bnQpOworICAgIHZvaWQgICAgICAgICAgICAgICAgcHV0QVVJbnQ4KGNvbnN0IHVpbnQ4X3QqIHZhbHVlcywgaW50IGNvdW50KTsKKyAgICB2b2lkICAgICAgICAgICAgICAgIHB1dEFJbnQxNihjb25zdCBpbnQxNl90KiB2YWx1ZXMsIGludCBjb3VudCk7CisgICAgdm9pZCAgICAgICAgICAgICAgICBwdXRBVUludDE2KGNvbnN0IHVpbnQxNl90KiB2YWx1ZXMsIGludCBjb3VudCk7CisgICAgdm9pZCAgICAgICAgICAgICAgICBwdXRBSW50MzIoY29uc3QgaW50MzJfdCogdmFsdWVzLCBpbnQgY291bnQpOworICAgIHZvaWQgICAgICAgICAgICAgICAgcHV0QVVJbnQzMihjb25zdCB1aW50MzJfdCogdmFsdWVzLCBpbnQgY291bnQpOworICAgIHZvaWQgICAgICAgICAgICAgICAgcHV0QVVJbnQzMihjb25zdCBVSW50MzJMaXN0KiBsaXN0KTsKKyAgICB2b2lkICAgICAgICAgICAgICAgIHB1dEFJbnQ2NChjb25zdCBpbnQ2NF90KiB2YWx1ZXMsIGludCBjb3VudCk7CisgICAgdm9pZCAgICAgICAgICAgICAgICBwdXRBVUludDY0KGNvbnN0IHVpbnQ2NF90KiB2YWx1ZXMsIGludCBjb3VudCk7CisgICAgdm9pZCAgICAgICAgICAgICAgICBwdXRTdHJpbmcoY29uc3QgTXRwU3RyaW5nQnVmZmVyJiBzdHJpbmcpOworICAgIHZvaWQgICAgICAgICAgICAgICAgcHV0U3RyaW5nKGNvbnN0IGNoYXIqIHN0cmluZyk7CisgICAgaW5saW5lIHZvaWQgICAgICAgICBwdXRFbXB0eVN0cmluZygpIHsgcHV0VUludDE2KDApOyB9CisgICAgaW5saW5lIHZvaWQgICAgICAgICBwdXRFbXB0eUFycmF5KCkgeyBwdXRVSW50MzIoMCk7IH0KKworCisjaWZkZWYgTVRQX0RFVklDRQorICAgIC8vIGZpbGwgb3VyIGJ1ZmZlciB3aXRoIGRhdGEgZnJvbSB0aGUgZ2l2ZW4gZmlsZSBkZXNjcmlwdG9yCisgICAgaW50ICAgICAgICAgICAgICAgICByZWFkKGludCBmZCk7CisgICAgaW50ICAgICAgICAgICAgICAgICByZWFkRGF0YUhlYWRlcihpbnQgZmQpOworCisgICAgLy8gd3JpdGUgb3VyIGRhdGEgdG8gdGhlIGdpdmVuIGZpbGUgZGVzY3JpcHRvcgorICAgIGludCAgICAgICAgICAgICAgICAgd3JpdGUoaW50IGZkKTsKKyAgICBpbnQgICAgICAgICAgICAgICAgIHdyaXRlRGF0YUhlYWRlcihpbnQgZmQsIHVpbnQzMl90IGxlbmd0aCk7CisjZW5kaWYKKworI2lmZGVmIE1UUF9IT1NUCisgICAgaW50ICAgICAgICAgICAgICAgICByZWFkKHN0cnVjdCB1c2JfZW5kcG9pbnQgKmVwKTsKKyAgICBpbnQgICAgICAgICAgICAgICAgIHdyaXRlKHN0cnVjdCB1c2JfZW5kcG9pbnQgKmVwKTsKKyNlbmRpZgorCisgICAgaW5saW5lIGJvb2wgICAgICAgICBoYXNEYXRhKCkgY29uc3QgeyByZXR1cm4gbVBhY2tldFNpemUgPiBNVFBfQ09OVEFJTkVSX0hFQURFUl9TSVpFOyB9CisgICAgdm9pZCogICAgICAgICAgICAgICBnZXREYXRhKGludCYgb3V0TGVuZ3RoKSBjb25zdDsKK307CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBfTVRQX0RBVEFfUEFDS0VUX0gKZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBEYXRhYmFzZS5jcHAgYi9tZWRpYS9tdHAvTXRwRGF0YWJhc2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3YjIxZDAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdHAvTXRwRGF0YWJhc2UuY3BwCkBAIC0wLDAgKzEsNTc4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIk10cERhdGFiYXNlLmgiCisjaW5jbHVkZSAiTXRwRGF0YVBhY2tldC5oIgorI2luY2x1ZGUgIk10cFV0aWxzLmgiCisjaW5jbHVkZSAiU3FsaXRlRGF0YWJhc2UuaCIKKyNpbmNsdWRlICJTcWxpdGVTdGF0ZW1lbnQuaCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3FsaXRlMy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKyNkZWZpbmUgRklMRV9JRF9DT0xVTU4gICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIEZJTEVfUEFUSF9DT0xVTU4gICAgICAgICAgICAgICAgMgorI2RlZmluZSBGSUxFX0ZPUk1BVF9DT0xVTU4gICAgICAgICAgICAgIDMKKyNkZWZpbmUgRklMRV9QQVJFTlRfQ09MVU1OICAgICAgICAgICAgICA0CisjZGVmaW5lIEZJTEVfU1RPUkFHRV9DT0xVTU4gICAgICAgICAgICAgNQorI2RlZmluZSBGSUxFX1NJWkVfQ09MVU1OICAgICAgICAgICAgICAgIDYKKyNkZWZpbmUgRklMRV9NT0RJRklFRF9DT0xVTU4gICAgICAgICAgICA3CisKKyNkZWZpbmUgQVVESU9fSURfQ09MVU1OICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIEFVRElPX1RJVExFX0NPTFVNTiAgICAgICAgICAgICAgMgorI2RlZmluZSBBVURJT19BUlRJU1RfQ09MVU1OICAgICAgICAgICAgIDMKKyNkZWZpbmUgQVVESU9fQUxCVU1fQ09MVU1OICAgICAgICAgICAgICA0CisjZGVmaW5lIEFVRElPX0FMQlVNX0FSVElTVF9DT0xVTU4gICAgICAgNQorI2RlZmluZSBBVURJT19HRU5SRV9DT0xVTU4gICAgICAgICAgICAgIDYKKyNkZWZpbmUgQVVESU9fQ09NUE9TRVJfQ09MVU1OICAgICAgICAgICA3CisjZGVmaW5lIEFVRElPX1RSQUNLX05VTUJFUl9DT0xVTU4gICAgICAgOAorI2RlZmluZSBBVURJT19ZRUFSX0NPTFVNTiAgICAgICAgICAgICAgIDkKKyNkZWZpbmUgQVVESU9fRFVSQVRJT05fQ09MVU1OICAgICAgICAgICAxMAorI2RlZmluZSBBVURJT19VU0VfQ09VTlRfQ09MVU1OICAgICAgICAgIDExCisjZGVmaW5lIEFVRElPX1NBTVBMRV9SQVRFX0NPTFVNTiAgICAgICAgMTIKKyNkZWZpbmUgQVVESU9fTlVNX0NIQU5ORUxTX0NPTFVNTiAgICAgICAxMworI2RlZmluZSBBVURJT19BVURJT19XQVZFX0NPREVDX0NPTFVNTiAgIDE0CisjZGVmaW5lIEFVRElPX0FVRElPX0JJVF9SQVRFX0NPTFVNTiAgICAgMTUKKworI2RlZmluZSBGSUxFX1RBQkxFX0NSRUFURSAgICAiQ1JFQVRFIFRBQkxFIElGIE5PVCBFWElTVFMgZmlsZXMgKCIgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgIl9pZCBJTlRFR0VSIFBSSU1BUlkgS0VZLCIgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICJwYXRoIFRFWFQsIiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAiZm9ybWF0IElOVEVHRVIsIiAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgInBhcmVudCBJTlRFR0VSLCIgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICJzdG9yYWdlIElOVEVHRVIsIiAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAic2l6ZSBJTlRFR0VSLCIgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgImRhdGVfbW9kaWZpZWQgSU5URUdFUiIgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgIik7IgorCisjZGVmaW5lIEFVRElPX1RBQkxFX0NSRUFURSAgICAiQ1JFQVRFIFRBQkxFIElGIE5PVCBFWElTVFMgYXVkaW8gKCIgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgImlkIElOVEVHRVIgUFJJTUFSWSBLRVksIiAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ0aXRsZSBURVhULCIgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAiYXJ0aXN0IFRFWFQsIiAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgImFsYnVtIFRFWFQsIiAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICJhbGJ1bV9hcnRpc3QgVEVYVCwiICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAiZ2VucmUgVEVYVCwiICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgImNvbXBvc2VyIFRFWFQsIiAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ0cmFja19udW1iZXIgSU5URUdFUiwiICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAieWVhciBJTlRFR0VSLCIgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgImR1cmF0aW9uIElOVEVHRVIsIiAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ1c2VfY291bnQgSU5URUdFUiwiICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAic2FtcGxlX3JhdGUgSU5URUdFUiwiICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgIm51bV9jaGFubmVscyBJTlRFR0VSLCIgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICJhdWRpb193YXZlX2NvZGVjIFRFWFQsIiAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAiYXVkaW9fYml0X3JhdGUgSU5URUdFUiIgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgIik7IgorCisjZGVmaW5lIFBBVEhfSU5ERVhfQ1JFQVRFICJDUkVBVEUgSU5ERVggSUYgTk9UIEVYSVNUUyBwYXRoX2luZGV4IG9uIGZpbGVzKHBhdGgpOyIKKworI2RlZmluZSBGSUxFX0lEX1FVRVJZICAgIlNFTEVDVCBfaWQsZm9ybWF0IEZST00gZmlsZXMgV0hFUkUgcGF0aCA9ID87IgorI2RlZmluZSBGSUxFX1BBVEhfUVVFUlkgIlNFTEVDVCBwYXRoLHNpemUgRlJPTSBmaWxlcyBXSEVSRSBfaWQgPSA/IgorCisjZGVmaW5lIEdFVF9PQkpFQ1RfSU5GT19RVUVSWSAgICJTRUxFQ1Qgc3RvcmFnZSxmb3JtYXQscGFyZW50LHBhdGgsc2l6ZSxkYXRlX21vZGlmaWVkIEZST00gZmlsZXMgV0hFUkUgX2lkID0gPzsiCisjZGVmaW5lIEZJTEVfSU5TRVJUICAgICAiSU5TRVJUIElOVE8gZmlsZXMgVkFMVUVTKD8sPyw/LD8sPyw/LD8pOyIKKyNkZWZpbmUgRklMRV9ERUxFVEUgICAgICJERUxFVEUgRlJPTSBmaWxlcyBXSEVSRSBfaWQgPSA/OyIKKworI2RlZmluZSBBVURJT19JTlNFUlQgICAgIklOU0VSVCBJTlRPIGF1ZGlvIFZBTFVFUyg/LD8sPyw/LD8sPyw/LD8sPyw/LD8sPyw/LD8sPyk7IgorI2RlZmluZSBBVURJT19ERUxFVEUgICAgIkRFTEVURSBGUk9NIGF1ZGlvIFdIRVJFIGlkID0gPzsiCisKK3N0cnVjdCBQcm9wZXJ0eVRhYmxlRW50cnkgeworICAgIE10cE9iamVjdFByb3BlcnR5ICAgcHJvcGVydHk7CisgICAgaW50ICAgICAgICAgICAgICAgICB0eXBlOworICAgIGNvbnN0IGNoYXIqICAgICAgICAgY29sdW1uTmFtZTsKK307CisKK3N0YXRpYyBjb25zdCBQcm9wZXJ0eVRhYmxlRW50cnkgICBrUHJvcGVydHlUYWJsZVtdID0geworICAgIHsgICBNVFBfUFJPUEVSVFlfUEFSRU5UX09CSkVDVCwgICAgIE1UUF9UWVBFX1VJTlQzMiwgICAgInBhcmVudCIgICAgICAgIH0sCisgICAgeyAgIE1UUF9QUk9QRVJUWV9TVE9SQUdFX0lELCAgICAgICAgTVRQX1RZUEVfVUlOVDMyLCAgICAic3RvcmFnZSIgICAgICAgfSwKKyAgICB7ICAgTVRQX1BST1BFUlRZX09CSkVDVF9GT1JNQVQsICAgICBNVFBfVFlQRV9VSU5UMzIsICAgICJmb3JtYXQiICAgICAgICB9LAorICAgIHsgICBNVFBfUFJPUEVSVFlfT0JKRUNUX0ZJTEVfTkFNRSwgIE1UUF9UWVBFX1NUUiwgICAgICAgInBhdGgiICAgICAgICAgIH0sCisgICAgeyAgIE1UUF9QUk9QRVJUWV9PQkpFQ1RfU0laRSwgICAgICAgTVRQX1RZUEVfVUlOVDY0LCAgICAic2l6ZSIgICAgICAgICAgfSwKKyAgICB7ICAgTVRQX1BST1BFUlRZX0RBVEVfTU9ESUZJRUQsICAgICBNVFBfVFlQRV9TVFIsICAgICAgICJkYXRlX21vZGlmaWVkIiB9LAorfTsKKworc3RhdGljIGJvb2wgZ2V0UHJvcGVydHlJbmZvKE10cE9iamVjdFByb3BlcnR5IHByb3BlcnR5LCBpbnQmIHR5cGUsIGNvbnN0IGNoYXIqJiBjb2x1bW5OYW1lKSB7CisgICAgaW50IGNvdW50ID0gc2l6ZW9mKGtQcm9wZXJ0eVRhYmxlKSAvIHNpemVvZihrUHJvcGVydHlUYWJsZVswXSk7CisgICAgY29uc3QgUHJvcGVydHlUYWJsZUVudHJ5KiBlbnRyeSA9IGtQcm9wZXJ0eVRhYmxlOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKywgZW50cnkrKykgeworICAgICAgICBpZiAoZW50cnktPnByb3BlcnR5ID09IHByb3BlcnR5KSB7CisgICAgICAgICAgICB0eXBlID0gZW50cnktPnR5cGU7CisgICAgICAgICAgICBjb2x1bW5OYW1lID0gZW50cnktPmNvbHVtbk5hbWU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKKworCitNdHBEYXRhYmFzZTo6TXRwRGF0YWJhc2UoKQorICAgIDogICBtRmlsZUlkUXVlcnkoTlVMTCksCisgICAgICAgIG1GaWxlUGF0aFF1ZXJ5KE5VTEwpLAorICAgICAgICBtT2JqZWN0SW5mb1F1ZXJ5KE5VTEwpLAorICAgICAgICBtRmlsZUluc2VydGVyKE5VTEwpLAorICAgICAgICBtRmlsZURlbGV0ZXIoTlVMTCksCisgICAgICAgIG1BdWRpb0luc2VydGVyKE5VTEwpLAorICAgICAgICBtQXVkaW9EZWxldGVyKE5VTEwpCit7Cit9CisKK010cERhdGFiYXNlOjp+TXRwRGF0YWJhc2UoKSB7Cit9CisKK2Jvb2wgTXRwRGF0YWJhc2U6Om9wZW4oY29uc3QgY2hhciogcGF0aCwgYm9vbCBjcmVhdGUpIHsKKyAgICBpZiAoIVNxbGl0ZURhdGFiYXNlOjpvcGVuKHBhdGgsIGNyZWF0ZSkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIC8vIGNyZWF0ZSB0YWJsZXMgYW5kIGluZGljZXMgaWYgbmVjZXNzYXJ5CisgICAgaWYgKCFleGVjKEZJTEVfVEFCTEVfQ1JFQVRFKSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImNvdWxkIG5vdCBjcmVhdGUgZmlsZSB0YWJsZVxuIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKCFleGVjKFBBVEhfSU5ERVhfQ1JFQVRFKSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImNvdWxkIG5vdCBwYXRoIGluZGV4IG9uIGZpbGUgdGFibGVcbiIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmICghZXhlYyhBVURJT19UQUJMRV9DUkVBVEUpKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiY291bGQgbm90IGNyZWF0ZSBmaWxlIHRhYmxlXG4iKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmICghbUZpbGVJZFF1ZXJ5KSB7CisgICAgICAgIG1GaWxlSWRRdWVyeSA9IG5ldyBTcWxpdGVTdGF0ZW1lbnQodGhpcyk7CisgICAgICAgIGlmICghbUZpbGVJZFF1ZXJ5LT5wcmVwYXJlKEZJTEVfSURfUVVFUlkpKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImNvdWxkIG5vdCBjb21waWxlIEZJTEVfSURfUVVFUllcbiIpOworICAgICAgICAgICAgZXhpdCgtMSk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKCFtRmlsZVBhdGhRdWVyeSkgeworICAgICAgICBtRmlsZVBhdGhRdWVyeSA9IG5ldyBTcWxpdGVTdGF0ZW1lbnQodGhpcyk7CisgICAgICAgIGlmICghbUZpbGVQYXRoUXVlcnktPnByZXBhcmUoRklMRV9QQVRIX1FVRVJZKSkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJjb3VsZCBub3QgY29tcGlsZSBGSUxFX1BBVEhfUVVFUllcbiIpOworICAgICAgICAgICAgZXhpdCgtMSk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKCFtT2JqZWN0SW5mb1F1ZXJ5KSB7CisgICAgICAgIG1PYmplY3RJbmZvUXVlcnkgPSBuZXcgU3FsaXRlU3RhdGVtZW50KHRoaXMpOworICAgICAgICBpZiAoIW1PYmplY3RJbmZvUXVlcnktPnByZXBhcmUoR0VUX09CSkVDVF9JTkZPX1FVRVJZKSkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJjb3VsZCBub3QgY29tcGlsZSBHRVRfT0JKRUNUX0lORk9fUVVFUllcbiIpOworICAgICAgICAgICAgZXhpdCgtMSk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKCFtRmlsZUluc2VydGVyKSB7CisgICAgICAgIG1GaWxlSW5zZXJ0ZXIgPSBuZXcgU3FsaXRlU3RhdGVtZW50KHRoaXMpOworICAgICAgICBpZiAoIW1GaWxlSW5zZXJ0ZXItPnByZXBhcmUoRklMRV9JTlNFUlQpKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImNvdWxkIG5vdCBjb21waWxlIEZJTEVfSU5TRVJUXG4iKTsKKyAgICAgICAgICAgIGV4aXQoLTEpOworICAgICAgICB9CisgICAgfQorICAgIGlmICghbUZpbGVEZWxldGVyKSB7CisgICAgICAgIG1GaWxlRGVsZXRlciA9IG5ldyBTcWxpdGVTdGF0ZW1lbnQodGhpcyk7CisgICAgICAgIGlmICghbUZpbGVEZWxldGVyLT5wcmVwYXJlKEZJTEVfREVMRVRFKSkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJjb3VsZCBub3QgY29tcGlsZSBGSUxFX0RFTEVURVxuIik7CisgICAgICAgICAgICBleGl0KC0xKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoIW1BdWRpb0luc2VydGVyKSB7CisgICAgICAgIG1BdWRpb0luc2VydGVyID0gbmV3IFNxbGl0ZVN0YXRlbWVudCh0aGlzKTsKKyAgICAgICAgaWYgKCFtQXVkaW9JbnNlcnRlci0+cHJlcGFyZShBVURJT19JTlNFUlQpKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImNvdWxkIG5vdCBjb21waWxlIEFVRElPX0lOU0VSVFxuIik7CisgICAgICAgICAgICBleGl0KC0xKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoIW1BdWRpb0RlbGV0ZXIpIHsKKyAgICAgICAgbUF1ZGlvRGVsZXRlciA9IG5ldyBTcWxpdGVTdGF0ZW1lbnQodGhpcyk7CisgICAgICAgIGlmICghbUF1ZGlvRGVsZXRlci0+cHJlcGFyZShBVURJT19ERUxFVEUpKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImNvdWxkIG5vdCBjb21waWxlIEFVRElPX0RFTEVURVxuIik7CisgICAgICAgICAgICBleGl0KC0xKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCit1aW50MzJfdCBNdHBEYXRhYmFzZTo6Z2V0VGFibGVGb3JGaWxlKE10cE9iamVjdEZvcm1hdCBmb3JtYXQpIHsKKyAgICBzd2l0Y2ggKGZvcm1hdCkgeworICAgICAgICBjYXNlIE1UUF9GT1JNQVRfQUlGRjoKKyAgICAgICAgY2FzZSBNVFBfRk9STUFUX1dBVjoKKyAgICAgICAgY2FzZSBNVFBfRk9STUFUX01QMzoKKyAgICAgICAgY2FzZSBNVFBfRk9STUFUX0ZMQUM6CisgICAgICAgIGNhc2UgTVRQX0ZPUk1BVF9VTkRFRklORURfQVVESU86CisgICAgICAgIGNhc2UgTVRQX0ZPUk1BVF9XTUE6CisgICAgICAgIGNhc2UgTVRQX0ZPUk1BVF9PR0c6CisgICAgICAgIGNhc2UgTVRQX0ZPUk1BVF9BQUM6CisgICAgICAgIGNhc2UgTVRQX0ZPUk1BVF9BVURJQkxFOgorICAgICAgICAgICAgcmV0dXJuIGtPYmplY3RIYW5kbGVUYWJsZUF1ZGlvOworICAgICAgICBjYXNlIE1UUF9GT1JNQVRfQVZJOgorICAgICAgICBjYXNlIE1UUF9GT1JNQVRfTVBFRzoKKyAgICAgICAgY2FzZSBNVFBfRk9STUFUX0FTRjoKKyAgICAgICAgY2FzZSBNVFBfRk9STUFUX1VOREVGSU5FRF9WSURFTzoKKyAgICAgICAgY2FzZSBNVFBfRk9STUFUX1dNVjoKKyAgICAgICAgY2FzZSBNVFBfRk9STUFUX01QNF9DT05UQUlORVI6CisgICAgICAgIGNhc2UgTVRQX0ZPUk1BVF9NUDI6CisgICAgICAgIGNhc2UgTVRQX0ZPUk1BVF8zR1BfQ09OVEFJTkVSOgorICAgICAgICAgICAgcmV0dXJuIGtPYmplY3RIYW5kbGVUYWJsZVZpZGVvOworICAgICAgICBjYXNlIE1UUF9GT1JNQVRfREVGSU5FRDoKKyAgICAgICAgY2FzZSBNVFBfRk9STUFUX0VYSUZfSlBFRzoKKyAgICAgICAgY2FzZSBNVFBfRk9STUFUX1RJRkZfRVA6CisgICAgICAgIGNhc2UgTVRQX0ZPUk1BVF9GTEFTSFBJWDoKKyAgICAgICAgY2FzZSBNVFBfRk9STUFUX0JNUDoKKyAgICAgICAgY2FzZSBNVFBfRk9STUFUX0NJRkY6CisgICAgICAgIGNhc2UgTVRQX0ZPUk1BVF9HSUY6CisgICAgICAgIGNhc2UgTVRQX0ZPUk1BVF9KRklGOgorICAgICAgICBjYXNlIE1UUF9GT1JNQVRfQ0Q6CisgICAgICAgIGNhc2UgTVRQX0ZPUk1BVF9QSUNUOgorICAgICAgICBjYXNlIE1UUF9GT1JNQVRfUE5HOgorICAgICAgICBjYXNlIE1UUF9GT1JNQVRfVElGRjoKKyAgICAgICAgY2FzZSBNVFBfRk9STUFUX1RJRkZfSVQ6CisgICAgICAgIGNhc2UgTVRQX0ZPUk1BVF9KUDI6CisgICAgICAgIGNhc2UgTVRQX0ZPUk1BVF9KUFg6CisgICAgICAgIGNhc2UgTVRQX0ZPUk1BVF9XSU5ET1dTX0lNQUdFX0ZPUk1BVDoKKyAgICAgICAgICAgIHJldHVybiBrT2JqZWN0SGFuZGxlVGFibGVJbWFnZTsKKyAgICAgICAgY2FzZSBNVFBfRk9STUFUX0FCU1RSQUNUX0FVRElPX1BMQVlMSVNUOgorICAgICAgICBjYXNlIE1UUF9GT1JNQVRfQUJTVFJBQ1RfQVZfUExBWUxJU1Q6CisgICAgICAgIGNhc2UgTVRQX0ZPUk1BVF9BQlNUUkFDVF9WSURFT19QTEFZTElTVDoKKyAgICAgICAgY2FzZSBNVFBfRk9STUFUX1dQTF9QTEFZTElTVDoKKyAgICAgICAgY2FzZSBNVFBfRk9STUFUX00zVV9QTEFZTElTVDoKKyAgICAgICAgY2FzZSBNVFBfRk9STUFUX01QTF9QTEFZTElTVDoKKyAgICAgICAgY2FzZSBNVFBfRk9STUFUX0FTWF9QTEFZTElTVDoKKyAgICAgICAgY2FzZSBNVFBfRk9STUFUX1BMU19QTEFZTElTVDoKKyAgICAgICAgICAgIHJldHVybiBrT2JqZWN0SGFuZGxlVGFibGVQbGF5bGlzdDsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBrT2JqZWN0SGFuZGxlVGFibGVGaWxlOworICAgIH0KK30KKworTXRwT2JqZWN0SGFuZGxlIE10cERhdGFiYXNlOjpnZXRPYmplY3RIYW5kbGUoY29uc3QgY2hhciogcGF0aCkgeworICAgIG1GaWxlSWRRdWVyeS0+cmVzZXQoKTsKKyAgICBtRmlsZUlkUXVlcnktPmJpbmQoMSwgcGF0aCk7CisgICAgaWYgKG1GaWxlSWRRdWVyeS0+c3RlcCgpKSB7CisgICAgICAgIGludCByb3cgPSBtRmlsZUlkUXVlcnktPmdldENvbHVtbkludCgwKTsKKyAgICAgICAgaWYgKHJvdyA+IDApIHsKKyAgICAgICAgICAgIE10cE9iamVjdEZvcm1hdCBmb3JtYXQgPSBtRmlsZUlkUXVlcnktPmdldENvbHVtbkludCgxKTsKKyAgICAgICAgICAgIHJvdyB8PSBnZXRUYWJsZUZvckZpbGUoZm9ybWF0KTsKKyAgICAgICAgICAgIHJldHVybiByb3c7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworTXRwT2JqZWN0SGFuZGxlIE10cERhdGFiYXNlOjphZGRGaWxlKGNvbnN0IGNoYXIqIHBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RGb3JtYXQgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0SGFuZGxlIHBhcmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cFN0b3JhZ2VJRCBzdG9yYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3Qgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVfdCBtb2RpZmllZCkgeworICAgIG1GaWxlSW5zZXJ0ZXItPmJpbmQoRklMRV9QQVRIX0NPTFVNTiwgcGF0aCk7CisgICAgbUZpbGVJbnNlcnRlci0+YmluZChGSUxFX0ZPUk1BVF9DT0xVTU4sIGZvcm1hdCk7CisgICAgbUZpbGVJbnNlcnRlci0+YmluZChGSUxFX1BBUkVOVF9DT0xVTU4sIHBhcmVudCk7CisgICAgbUZpbGVJbnNlcnRlci0+YmluZChGSUxFX1NUT1JBR0VfQ09MVU1OLCBzdG9yYWdlKTsKKyAgICBtRmlsZUluc2VydGVyLT5iaW5kKEZJTEVfU0laRV9DT0xVTU4sIHNpemUpOworICAgIG1GaWxlSW5zZXJ0ZXItPmJpbmQoRklMRV9NT0RJRklFRF9DT0xVTU4sIG1vZGlmaWVkKTsKKyAgICBtRmlsZUluc2VydGVyLT5zdGVwKCk7CisgICAgbUZpbGVJbnNlcnRlci0+cmVzZXQoKTsKKyAgICBpbnQgcmVzdWx0ID0gbGFzdEluc2VydGVkUm93KCk7CisgICAgcmV0dXJuIChyZXN1bHQgPD0gMCA/IGtJbnZhbGlkT2JqZWN0SGFuZGxlIDogcmVzdWx0KTsKK30KKworTXRwT2JqZWN0SGFuZGxlIE10cERhdGFiYXNlOjphZGRBdWRpb0ZpbGUoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSkgeworICAgIG1BdWRpb0luc2VydGVyLT5iaW5kKEFVRElPX0lEX0NPTFVNTiwgaGFuZGxlKTsKKyAgICBtQXVkaW9JbnNlcnRlci0+c3RlcCgpOworICAgIG1BdWRpb0luc2VydGVyLT5yZXNldCgpOworICAgIGludCByZXN1bHQgPSBsYXN0SW5zZXJ0ZWRSb3coKTsKKyAgICBoYW5kbGUgfD0ga09iamVjdEhhbmRsZVRhYmxlQXVkaW87CisgICAgcmV0dXJuIChyZXN1bHQgPiAwID8gaGFuZGxlIDoga0ludmFsaWRPYmplY3RIYW5kbGUpOworfQorCitNdHBPYmplY3RIYW5kbGUgTXRwRGF0YWJhc2U6OmFkZEF1ZGlvRmlsZShNdHBPYmplY3RIYW5kbGUgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdGl0bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhcnRpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhbGJ1bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGFsYnVtQXJ0aXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZ2VucmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBjb21wb3NlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIG1pbWVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRyYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHllYXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZHVyYXRpb24pIHsKKyAgICBtQXVkaW9JbnNlcnRlci0+YmluZChBVURJT19JRF9DT0xVTU4sIGhhbmRsZSk7CisgICAgaWYgKHRpdGxlKSBtQXVkaW9JbnNlcnRlci0+YmluZChBVURJT19USVRMRV9DT0xVTU4sIHRpdGxlKTsKKyAgICBpZiAoYXJ0aXN0KSBtQXVkaW9JbnNlcnRlci0+YmluZChBVURJT19BUlRJU1RfQ09MVU1OLCBhcnRpc3QpOworICAgIGlmIChhbGJ1bSkgbUF1ZGlvSW5zZXJ0ZXItPmJpbmQoQVVESU9fQUxCVU1fQ09MVU1OLCBhbGJ1bSk7CisgICAgaWYgKGFsYnVtQXJ0aXN0KSBtQXVkaW9JbnNlcnRlci0+YmluZChBVURJT19BTEJVTV9BUlRJU1RfQ09MVU1OLCBhbGJ1bUFydGlzdCk7CisgICAgaWYgKGdlbnJlKSBtQXVkaW9JbnNlcnRlci0+YmluZChBVURJT19HRU5SRV9DT0xVTU4sIGdlbnJlKTsKKyAgICBpZiAoY29tcG9zZXIpIG1BdWRpb0luc2VydGVyLT5iaW5kKEFVRElPX0NPTVBPU0VSX0NPTFVNTiwgY29tcG9zZXIpOworICAgIGlmICh0cmFjaykgbUF1ZGlvSW5zZXJ0ZXItPmJpbmQoQVVESU9fVFJBQ0tfTlVNQkVSX0NPTFVNTiwgdHJhY2spOworICAgIGlmICh5ZWFyKSBtQXVkaW9JbnNlcnRlci0+YmluZChBVURJT19ZRUFSX0NPTFVNTiwgeWVhcik7CisgICAgaWYgKGR1cmF0aW9uKSBtQXVkaW9JbnNlcnRlci0+YmluZChBVURJT19EVVJBVElPTl9DT0xVTU4sIGR1cmF0aW9uKTsKKyAgICBtQXVkaW9JbnNlcnRlci0+c3RlcCgpOworICAgIG1BdWRpb0luc2VydGVyLT5yZXNldCgpOworICAgIGludCByZXN1bHQgPSBsYXN0SW5zZXJ0ZWRSb3coKTsKKyAgICBpZiAocmVzdWx0IDw9IDApCisgICAgICAgIHJldHVybiBrSW52YWxpZE9iamVjdEhhbmRsZTsKKyAgICByZXN1bHQgfD0ga09iamVjdEhhbmRsZVRhYmxlQXVkaW87CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworTXRwT2JqZWN0SGFuZGxlTGlzdCogTXRwRGF0YWJhc2U6OmdldE9iamVjdExpc3QoTXRwU3RvcmFnZUlEIHN0b3JhZ2VJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cE9iamVjdEZvcm1hdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RIYW5kbGUgcGFyZW50KSB7CisgICAgYm9vbCAgICAgICAgICAgICAgICB3aGVyZVN0b3JhZ2UgPSAoc3RvcmFnZUlEICE9IDB4RkZGRkZGRkYpOworICAgIGJvb2wgICAgICAgICAgICAgICAgd2hlcmVGb3JtYXQgPSAoZm9ybWF0ICE9IDApOworICAgIGJvb2wgICAgICAgICAgICAgICAgd2hlcmVQYXJlbnQgPSAocGFyZW50ICE9IDApOworICAgIGNoYXIgICAgICAgICAgICAgICAgaW50QnVmZmVyWzIwXTsKKworICAgIE10cFN0cmluZyAgcXVlcnkoIlNFTEVDVCBfaWQsZm9ybWF0IEZST00gZmlsZXMiKTsKKyAgICBpZiAod2hlcmVTdG9yYWdlIHx8IHdoZXJlRm9ybWF0IHx8IHdoZXJlUGFyZW50KQorICAgICAgICBxdWVyeSArPSAiIFdIRVJFIjsKKyAgICBpZiAod2hlcmVTdG9yYWdlKSB7CisgICAgICAgIHNucHJpbnRmKGludEJ1ZmZlciwgc2l6ZW9mKGludEJ1ZmZlciksICIlZCIsIHN0b3JhZ2VJRCk7CisgICAgICAgIHF1ZXJ5ICs9ICIgc3RvcmFnZSA9ICI7CisgICAgICAgIHF1ZXJ5ICs9IGludEJ1ZmZlcjsKKyAgICB9CisgICAgaWYgKHdoZXJlRm9ybWF0KSB7CisgICAgICAgIHNucHJpbnRmKGludEJ1ZmZlciwgc2l6ZW9mKGludEJ1ZmZlciksICIlZCIsIGZvcm1hdCk7CisgICAgICAgIGlmICh3aGVyZVN0b3JhZ2UpCisgICAgICAgICAgICBxdWVyeSArPSAiIEFORCI7CisgICAgICAgIHF1ZXJ5ICs9ICIgZm9ybWF0ID0gIjsKKyAgICAgICAgcXVlcnkgKz0gaW50QnVmZmVyOworICAgIH0KKyAgICBpZiAod2hlcmVQYXJlbnQpIHsKKyAgICAgICAgaWYgKHBhcmVudCAhPSBNVFBfUEFSRU5UX1JPT1QpCisgICAgICAgICAgICBwYXJlbnQgJj0ga09iamVjdEhhbmRsZUluZGV4TWFzazsKKyAgICAgICAgc25wcmludGYoaW50QnVmZmVyLCBzaXplb2YoaW50QnVmZmVyKSwgIiVkIiwgcGFyZW50KTsKKyAgICAgICAgaWYgKHdoZXJlU3RvcmFnZSB8fCB3aGVyZUZvcm1hdCkKKyAgICAgICAgICAgIHF1ZXJ5ICs9ICIgQU5EIjsKKyAgICAgICAgcXVlcnkgKz0gIiBwYXJlbnQgPSAiOworICAgICAgICBxdWVyeSArPSBpbnRCdWZmZXI7CisgICAgfQorICAgIHF1ZXJ5ICs9ICI7IjsKKworICAgIFNxbGl0ZVN0YXRlbWVudCBzdG10KHRoaXMpOworICAgIHByaW50ZigiJXNcbiIsIChjb25zdCBjaGFyICopcXVlcnkpOworICAgIHN0bXQucHJlcGFyZShxdWVyeSk7CisKKyAgICBNdHBPYmplY3RIYW5kbGVMaXN0KiBsaXN0ID0gbmV3IE10cE9iamVjdEhhbmRsZUxpc3QoKTsKKyAgICB3aGlsZSAoIXN0bXQuaXNEb25lKCkpIHsKKyAgICAgICAgaWYgKHN0bXQuc3RlcCgpKSB7CisgICAgICAgICAgICBpbnQgaW5kZXggPSBzdG10LmdldENvbHVtbkludCgwKTsKKyAgICAgICAgICAgIHByaW50Zigic3RtdC5nZXRDb2x1bW5JbnQgcmV0dXJuZWQgJWRcbiIsIGluZGV4KTsKKyAgICAgICAgICAgIGlmIChpbmRleCA+IDApIHsKKyAgICAgICAgICAgICAgICBNdHBPYmplY3RGb3JtYXQgZm9ybWF0ID0gc3RtdC5nZXRDb2x1bW5JbnQoMSk7CisgICAgICAgICAgICAgICAgaW5kZXggfD0gZ2V0VGFibGVGb3JGaWxlKGZvcm1hdCk7CisgICAgICAgICAgICAgICAgbGlzdC0+cHVzaChpbmRleCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcHJpbnRmKCJsaXN0IHNpemU6ICVkXG4iLCBsaXN0LT5zaXplKCkpOworICAgIHJldHVybiBsaXN0OworfQorCisKK010cFJlc3BvbnNlQ29kZSBNdHBEYXRhYmFzZTo6Z2V0T2JqZWN0UHJvcGVydHkoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cE9iamVjdFByb3BlcnR5IHByb3BlcnR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwRGF0YVBhY2tldCYgcGFja2V0KSB7CisgICAgaW50ICAgICAgICAgdHlwZTsKKyAgICBjb25zdCBjaGFyKiBjb2x1bW5OYW1lOworICAgIGNoYXIgICAgICAgIGludEJ1ZmZlclsyMF07CisKKyAgICBpZiAoaGFuZGxlICE9IE1UUF9QQVJFTlRfUk9PVCkKKyAgICAgICAgaGFuZGxlICY9IGtPYmplY3RIYW5kbGVJbmRleE1hc2s7CisKKyAgICBpZiAoIWdldFByb3BlcnR5SW5mbyhwcm9wZXJ0eSwgdHlwZSwgY29sdW1uTmFtZSkpCisgICAgICAgIHJldHVybiBNVFBfUkVTUE9OU0VfSU5WQUxJRF9PQkpFQ1RfUFJPUF9DT0RFOworICAgIHNucHJpbnRmKGludEJ1ZmZlciwgc2l6ZW9mKGludEJ1ZmZlciksICIlZCIsIGhhbmRsZSk7CisKKyAgICBNdHBTdHJpbmcgIHF1ZXJ5KCJTRUxFQ1QgIik7CisgICAgcXVlcnkgKz0gY29sdW1uTmFtZTsKKyAgICBxdWVyeSArPSAiIEZST00gZmlsZXMgV0hFUkUgX2lkID0gIjsKKyAgICBxdWVyeSArPSBpbnRCdWZmZXI7CisgICAgcXVlcnkgKz0gIjsiOworCisgICAgU3FsaXRlU3RhdGVtZW50IHN0bXQodGhpcyk7CisgICAgcHJpbnRmKCIlc1xuIiwgKGNvbnN0IGNoYXIgKilxdWVyeSk7CisgICAgc3RtdC5wcmVwYXJlKHF1ZXJ5KTsKKworICAgIGlmICghc3RtdC5zdGVwKCkpCisgICAgICAgIHJldHVybiBNVFBfUkVTUE9OU0VfSU5WQUxJRF9PQkpFQ1RfSEFORExFOworCisgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgIGNhc2UgTVRQX1RZUEVfSU5UODoKKyAgICAgICAgICAgIHBhY2tldC5wdXRJbnQ4KHN0bXQuZ2V0Q29sdW1uSW50KDApKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9UWVBFX1VJTlQ4OgorICAgICAgICAgICAgcGFja2V0LnB1dFVJbnQ4KHN0bXQuZ2V0Q29sdW1uSW50KDApKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9UWVBFX0lOVDE2OgorICAgICAgICAgICAgcGFja2V0LnB1dEludDE2KHN0bXQuZ2V0Q29sdW1uSW50KDApKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9UWVBFX1VJTlQxNjoKKyAgICAgICAgICAgIHBhY2tldC5wdXRVSW50MTYoc3RtdC5nZXRDb2x1bW5JbnQoMCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX1RZUEVfSU5UMzI6CisgICAgICAgICAgICBwYWNrZXQucHV0SW50MzIoc3RtdC5nZXRDb2x1bW5JbnQoMCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX1RZUEVfVUlOVDMyOgorICAgICAgICAgICAgcGFja2V0LnB1dFVJbnQzMihzdG10LmdldENvbHVtbkludCgwKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9JTlQ2NDoKKyAgICAgICAgICAgIHBhY2tldC5wdXRJbnQ2NChzdG10LmdldENvbHVtbkludDY0KDApKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9UWVBFX1VJTlQ2NDoKKyAgICAgICAgICAgIHBhY2tldC5wdXRVSW50NjQoc3RtdC5nZXRDb2x1bW5JbnQ2NCgwKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9TVFI6CisgICAgICAgICAgICBwYWNrZXQucHV0U3RyaW5nKHN0bXQuZ2V0Q29sdW1uU3RyaW5nKDApKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJ1bnN1cHBvcnRlZCBvYmplY3QgdHlwZVxuIik7CisgICAgICAgICAgICByZXR1cm4gTVRQX1JFU1BPTlNFX0lOVkFMSURfT0JKRUNUX0hBTkRMRTsKKyAgICB9CisgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9PSzsKK30KKworTXRwUmVzcG9uc2VDb2RlIE10cERhdGFiYXNlOjpnZXRPYmplY3RJbmZvKE10cE9iamVjdEhhbmRsZSBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwRGF0YVBhY2tldCYgcGFja2V0KSB7CisgICAgY2hhciAgICBkYXRlWzIwXTsKKworICAgIGlmIChoYW5kbGUgIT0gTVRQX1BBUkVOVF9ST09UKQorICAgICAgICBoYW5kbGUgJj0ga09iamVjdEhhbmRsZUluZGV4TWFzazsKKworICAgIG1PYmplY3RJbmZvUXVlcnktPnJlc2V0KCk7CisgICAgbU9iamVjdEluZm9RdWVyeS0+YmluZCgxLCBoYW5kbGUpOworICAgIGlmICghbU9iamVjdEluZm9RdWVyeS0+c3RlcCgpKQorICAgICAgICByZXR1cm4gTVRQX1JFU1BPTlNFX0lOVkFMSURfT0JKRUNUX0hBTkRMRTsKKworICAgIE10cFN0b3JhZ2VJRCBzdG9yYWdlSUQgPSBtT2JqZWN0SW5mb1F1ZXJ5LT5nZXRDb2x1bW5JbnQoMCk7CisgICAgTXRwT2JqZWN0Rm9ybWF0IGZvcm1hdCA9IG1PYmplY3RJbmZvUXVlcnktPmdldENvbHVtbkludCgxKTsKKyAgICBNdHBPYmplY3RIYW5kbGUgcGFyZW50ID0gbU9iamVjdEluZm9RdWVyeS0+Z2V0Q29sdW1uSW50KDIpOworICAgIC8vIGV4dHJhY3QgbmFtZSBmcm9tIHBhdGguICBkbyB3ZSB3YW50IGEgc2VwYXJhdGUgZGF0YWJhc2UgZW50cnkgZm9yIHRoaXM/CisgICAgY29uc3QgY2hhciogbmFtZSA9IG1PYmplY3RJbmZvUXVlcnktPmdldENvbHVtblN0cmluZygzKTsKKyAgICBjb25zdCBjaGFyKiBsYXN0U2xhc2ggPSBzdHJyY2hyKG5hbWUsICcvJyk7CisgICAgaWYgKGxhc3RTbGFzaCkKKyAgICAgICAgbmFtZSA9IGxhc3RTbGFzaCArIDE7CisgICAgaW50NjRfdCBzaXplID0gbU9iamVjdEluZm9RdWVyeS0+Z2V0Q29sdW1uSW50NjQoNCk7CisgICAgdGltZV90IG1vZGlmaWVkID0gbU9iamVjdEluZm9RdWVyeS0+Z2V0Q29sdW1uSW50KDUpOworICAgIGludCBhc3NvY2lhdGlvblR5cGUgPSAoZm9ybWF0ID09IE1UUF9GT1JNQVRfQVNTT0NJQVRJT04gPworICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1UUF9BU1NPQ0lBVElPTl9UWVBFX0dFTkVSSUNfRk9MREVSIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNVFBfQVNTT0NJQVRJT05fVFlQRV9VTkRFRklORUQpOworCisgICAgcHJpbnRmKCJzdG9yYWdlSUQ6ICVkLCBmb3JtYXQ6ICVkLCBwYXJlbnQ6ICVkXG4iLCBzdG9yYWdlSUQsIGZvcm1hdCwgcGFyZW50KTsKKworICAgIHBhY2tldC5wdXRVSW50MzIoc3RvcmFnZUlEKTsKKyAgICBwYWNrZXQucHV0VUludDE2KGZvcm1hdCk7CisgICAgcGFja2V0LnB1dFVJbnQxNigwKTsgICAvLyBwcm90ZWN0aW9uIHN0YXR1cworICAgIHBhY2tldC5wdXRVSW50MzIoKHNpemUgPiAweEZGRkZGRkZGTEwgPyAweEZGRkZGRkZGIDogc2l6ZSkpOworICAgIHBhY2tldC5wdXRVSW50MTYoMCk7ICAgLy8gdGh1bWIgZm9ybWF0CisgICAgcGFja2V0LnB1dFVJbnQzMigwKTsgICAvLyB0aHVtYiBjb21wcmVzc2VkIHNpemUKKyAgICBwYWNrZXQucHV0VUludDMyKDApOyAgIC8vIHRodW1iIHBpeCB3aWR0aAorICAgIHBhY2tldC5wdXRVSW50MzIoMCk7ICAgLy8gdGh1bWIgcGl4IGhlaWdodAorICAgIHBhY2tldC5wdXRVSW50MzIoMCk7ICAgLy8gaW1hZ2UgcGl4IHdpZHRoCisgICAgcGFja2V0LnB1dFVJbnQzMigwKTsgICAvLyBpbWFnZSBwaXggaGVpZ2h0CisgICAgcGFja2V0LnB1dFVJbnQzMigwKTsgICAvLyBpbWFnZSBiaXQgZGVwdGgKKyAgICBwYWNrZXQucHV0VUludDMyKHBhcmVudCk7CisgICAgcGFja2V0LnB1dFVJbnQxNihhc3NvY2lhdGlvblR5cGUpOworICAgIHBhY2tldC5wdXRVSW50MzIoMCk7ICAgLy8gYXNzb2NpYXRpb24gZGVzYworICAgIHBhY2tldC5wdXRVSW50MzIoMCk7ICAgLy8gc2VxdWVuY2UgbnVtYmVyCisgICAgcGFja2V0LnB1dFN0cmluZyhuYW1lKTsgICAvLyBmaWxlIG5hbWUKKyAgICBwYWNrZXQucHV0RW1wdHlTdHJpbmcoKTsKKyAgICBmb3JtYXREYXRlVGltZShtb2RpZmllZCwgZGF0ZSwgc2l6ZW9mKGRhdGUpKTsKKyAgICBwYWNrZXQucHV0U3RyaW5nKGRhdGUpOyAgIC8vIGRhdGUgbW9kaWZpZWQKKyAgICBwYWNrZXQucHV0RW1wdHlTdHJpbmcoKTsgICAvLyBrZXl3b3JkcworCisgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9PSzsKK30KKworYm9vbCBNdHBEYXRhYmFzZTo6Z2V0T2JqZWN0RmlsZVBhdGgoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cFN0cmluZyYgZmlsZVBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90JiBmaWxlTGVuZ3RoKSB7CisgICAgaWYgKGhhbmRsZSAhPSBNVFBfUEFSRU5UX1JPT1QpCisgICAgICAgIGhhbmRsZSAmPSBrT2JqZWN0SGFuZGxlSW5kZXhNYXNrOworICAgIG1GaWxlUGF0aFF1ZXJ5LT5yZXNldCgpOworICAgIG1GaWxlUGF0aFF1ZXJ5LT5iaW5kKDEsIGhhbmRsZSk7CisgICAgaWYgKCFtRmlsZVBhdGhRdWVyeS0+c3RlcCgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBjb25zdCBjaGFyKiBwYXRoID0gbUZpbGVQYXRoUXVlcnktPmdldENvbHVtblN0cmluZygwKTsKKyAgICBpZiAoIXBhdGgpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBmaWxlUGF0aCA9IHBhdGg7CisgICAgZmlsZUxlbmd0aCA9IG1GaWxlUGF0aFF1ZXJ5LT5nZXRDb2x1bW5JbnQ2NCgxKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBNdHBEYXRhYmFzZTo6ZGVsZXRlRmlsZShNdHBPYmplY3RIYW5kbGUgaGFuZGxlKSB7CisgICAgdWludDMyX3QgdGFibGUgPSBoYW5kbGUgJiBrT2JqZWN0SGFuZGxlVGFibGVNYXNrOworICAgIGhhbmRsZSAmPSBrT2JqZWN0SGFuZGxlSW5kZXhNYXNrOworICAgIG1GaWxlRGVsZXRlci0+YmluZCgxLCBoYW5kbGUpOworICAgIG1GaWxlRGVsZXRlci0+c3RlcCgpOworICAgIG1GaWxlRGVsZXRlci0+cmVzZXQoKTsKKyAgICBpZiAodGFibGUgPT0ga09iamVjdEhhbmRsZVRhYmxlQXVkaW8pIHsKKyAgICAgICAgbUF1ZGlvRGVsZXRlci0+YmluZCgxLCBoYW5kbGUpOworICAgICAgICBtQXVkaW9EZWxldGVyLT5zdGVwKCk7CisgICAgICAgIG1BdWRpb0RlbGV0ZXItPnJlc2V0KCk7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK010cE9iamVjdEhhbmRsZSogTXRwRGF0YWJhc2U6OmdldEZpbGVMaXN0KGludCYgb3V0Q291bnQpIHsKKyAgICBNdHBPYmplY3RIYW5kbGUqIHJlc3VsdCA9IE5VTEw7CisgICAgaW50IGNvdW50ID0gMDsKKyAgICBTcWxpdGVTdGF0ZW1lbnQgc3RtdCh0aGlzKTsKKyAgICBzdG10LnByZXBhcmUoIlNFTEVDVCBjb3VudCgqKSBGUk9NIGZpbGVzOyIpOworCisgICAgTXRwT2JqZWN0SGFuZGxlTGlzdCogbGlzdCA9IG5ldyBNdHBPYmplY3RIYW5kbGVMaXN0KCk7CisgICAgaWYgKHN0bXQuc3RlcCgpKQorICAgICAgICBjb3VudCA9IHN0bXQuZ2V0Q29sdW1uSW50KDApOworCisgICAgaWYgKGNvdW50ID4gMCkgeworICAgICAgICByZXN1bHQgPSBuZXcgTXRwT2JqZWN0SGFuZGxlW2NvdW50XTsKKyAgICAgICAgbWVtc2V0KHJlc3VsdCwgMCwgY291bnQgKiBzaXplb2YoKnJlc3VsdCkpOworICAgICAgICBTcWxpdGVTdGF0ZW1lbnQgc3RtdDIodGhpcyk7CisgICAgICAgIHN0bXQyLnByZXBhcmUoIlNFTEVDVCBfaWQsZm9ybWF0IEZST00gZmlsZXM7Iik7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoIXN0bXQyLnN0ZXAoKSkgeworICAgICAgICAgICAgICAgIHByaW50ZigiZ2V0RmlsZUxpc3QgZW5kZWQgZWFybHlcbiIpOworICAgICAgICAgICAgICAgIGNvdW50ID0gaTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIE10cE9iamVjdEhhbmRsZSBoYW5kbGUgPSBzdG10Mi5nZXRDb2x1bW5JbnQoMCk7CisgICAgICAgICAgICBNdHBPYmplY3RGb3JtYXQgZm9ybWF0ID0gc3RtdDIuZ2V0Q29sdW1uSW50KDEpOworICAgICAgICAgICAgaGFuZGxlIHw9IGdldFRhYmxlRm9yRmlsZShmb3JtYXQpOworICAgICAgICAgICAgcmVzdWx0W2ldID0gaGFuZGxlOworICAgICAgICB9CisgICAgfQorICAgIG91dENvdW50ID0gY291bnQ7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoKKyAgICBmb3IgZ2V0T2JqZWN0UHJvcERlc2MKKworICAgIHBhY2tldC5wdXRVSW50MTYocHJvcGVydHkpOworICAgIHBhY2tldC5wdXRVSW50MTYoZGF0YVR5cGUpOworICAgIHBhY2tldC5wdXRVSW50OChnZXRTZXQpOworICAgIC8vIGRlZmF1bHQgdmFsdWUgRFRTCisgICAgcGFja2V0LnB1dFVJbnQzMihncm91cENvZGUpOworICAgIHBhY2tldC5wdXRVSW50OChmb3JtRmxhZyk7CisgICAgLy8gZm9ybSwgdmFyaWFibGUKKyovCisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwRGF0YWJhc2UuaCBiL21lZGlhL210cC9NdHBEYXRhYmFzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxZDVmYjEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdHAvTXRwRGF0YWJhc2UuaApAQCAtMCwwICsxLDg5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfTVRQX0RBVEFCQVNFX0gKKyNkZWZpbmUgX01UUF9EQVRBQkFTRV9ICisKKyNpbmNsdWRlICJNdHBUeXBlcy5oIgorI2luY2x1ZGUgIlNxbGl0ZURhdGFiYXNlLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgTXRwRGF0YVBhY2tldDsKK2NsYXNzIFNxbGl0ZVN0YXRlbWVudDsKKworY2xhc3MgTXRwRGF0YWJhc2UgOiBwdWJsaWMgU3FsaXRlRGF0YWJhc2UgeworcHJpdmF0ZToKKyAgICBTcWxpdGVTdGF0ZW1lbnQqICAgICAgICBtRmlsZUlkUXVlcnk7CisgICAgU3FsaXRlU3RhdGVtZW50KiAgICAgICAgbUZpbGVQYXRoUXVlcnk7CisgICAgU3FsaXRlU3RhdGVtZW50KiAgICAgICAgbU9iamVjdEluZm9RdWVyeTsKKyAgICBTcWxpdGVTdGF0ZW1lbnQqICAgICAgICBtRmlsZUluc2VydGVyOworICAgIFNxbGl0ZVN0YXRlbWVudCogICAgICAgIG1GaWxlRGVsZXRlcjsKKyAgICBTcWxpdGVTdGF0ZW1lbnQqICAgICAgICBtQXVkaW9JbnNlcnRlcjsKKyAgICBTcWxpdGVTdGF0ZW1lbnQqICAgICAgICBtQXVkaW9EZWxldGVyOworCitwdWJsaWM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwRGF0YWJhc2UoKTsKKyAgICB2aXJ0dWFsICAgICAgICAgICAgICAgICB+TXRwRGF0YWJhc2UoKTsKKworICAgIHN0YXRpYyB1aW50MzJfdCAgICAgICAgIGdldFRhYmxlRm9yRmlsZShNdHBPYmplY3RGb3JtYXQgZm9ybWF0KTsKKworICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIG9wZW4oY29uc3QgY2hhciogcGF0aCwgYm9vbCBjcmVhdGUpOworICAgIE10cE9iamVjdEhhbmRsZSAgICAgICAgIGdldE9iamVjdEhhbmRsZShjb25zdCBjaGFyKiBwYXRoKTsKKyAgICBNdHBPYmplY3RIYW5kbGUgICAgICAgICBhZGRGaWxlKGNvbnN0IGNoYXIqIHBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RGb3JtYXQgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0SGFuZGxlIHBhcmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cFN0b3JhZ2VJRCBzdG9yYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3Qgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVfdCBtb2RpZmllZCk7CisKKyAgICBNdHBPYmplY3RIYW5kbGUgICAgICAgICBhZGRBdWRpb0ZpbGUoTXRwT2JqZWN0SGFuZGxlIGlkKTsKKworICAgIE10cE9iamVjdEhhbmRsZSAgICAgICAgIGFkZEF1ZGlvRmlsZShNdHBPYmplY3RIYW5kbGUgaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB0aXRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGFydGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGFsYnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogYWxidW1BcnRpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBnZW5yZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGNvbXBvc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogbWltZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdHJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeWVhciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkdXJhdGlvbik7CisKKyAgICBNdHBPYmplY3RIYW5kbGVMaXN0KiAgICBnZXRPYmplY3RMaXN0KE10cFN0b3JhZ2VJRCBzdG9yYWdlSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RGb3JtYXQgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0SGFuZGxlIHBhcmVudCk7CisKKyAgICBNdHBSZXNwb25zZUNvZGUgICAgICAgICBnZXRPYmplY3RQcm9wZXJ0eShNdHBPYmplY3RIYW5kbGUgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0UHJvcGVydHkgcHJvcGVydHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBEYXRhUGFja2V0JiBwYWNrZXQpOworCisgICAgTXRwUmVzcG9uc2VDb2RlICAgICAgICAgZ2V0T2JqZWN0SW5mbyhNdHBPYmplY3RIYW5kbGUgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwRGF0YVBhY2tldCYgcGFja2V0KTsKKworICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIGdldE9iamVjdEZpbGVQYXRoKE10cE9iamVjdEhhbmRsZSBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBTdHJpbmcmIGZpbGVQYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCYgZmlsZUxlbmd0aCk7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgZGVsZXRlRmlsZShNdHBPYmplY3RIYW5kbGUgaGFuZGxlKTsKKworICAgIC8vIGhlbHBlciBmb3IgbWVkaWEgc2Nhbm5lcgorICAgIE10cE9iamVjdEhhbmRsZSogICAgICAgIGdldEZpbGVMaXN0KGludCYgb3V0Q291bnQpOworfTsKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIF9NVFBfREFUQUJBU0VfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cERlYnVnLmNwcCBiL21lZGlhL210cC9NdHBEZWJ1Zy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWRlZDZlMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL210cC9NdHBEZWJ1Zy5jcHAKQEAgLTAsMCArMSw3NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJNdHBEZWJ1Zy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBPcGVyYXRpb25Db2RlRW50cnkgeworICAgIGNvbnN0IGNoYXIqIG5hbWU7CisgICAgTXRwT3BlcmF0aW9uQ29kZSBjb2RlOworfTsKKworc3RhdGljIGNvbnN0IE9wZXJhdGlvbkNvZGVFbnRyeSBzT3BlcmF0aW9uQ29kZXNbXSA9IHsKKyAgICB7ICJNVFBfT1BFUkFUSU9OX0dFVF9ERVZJQ0VfSU5GTyIsICAgICAgICAgICAgICAweDEwMDEgfSwKKyAgICB7ICJNVFBfT1BFUkFUSU9OX09QRU5fU0VTU0lPTiIsICAgICAgICAgICAgICAgICAweDEwMDIgfSwKKyAgICB7ICJNVFBfT1BFUkFUSU9OX0NMT1NFX1NFU1NJT04iLCAgICAgICAgICAgICAgICAweDEwMDMgfSwKKyAgICB7ICJNVFBfT1BFUkFUSU9OX0dFVF9TVE9SQUdFX0lEUyIsICAgICAgICAgICAgICAweDEwMDQgfSwKKyAgICB7ICJNVFBfT1BFUkFUSU9OX0dFVF9TVE9SQUdFX0lORk8iLCAgICAgICAgICAgICAweDEwMDUgfSwKKyAgICB7ICJNVFBfT1BFUkFUSU9OX0dFVF9OVU1fT0JKRUNUUyIsICAgICAgICAgICAgICAweDEwMDYgfSwKKyAgICB7ICJNVFBfT1BFUkFUSU9OX0dFVF9PQkpFQ1RfSEFORExFUyIsICAgICAgICAgICAweDEwMDcgfSwKKyAgICB7ICJNVFBfT1BFUkFUSU9OX0dFVF9PQkpFQ1RfSU5GTyIsICAgICAgICAgICAgICAweDEwMDggfSwKKyAgICB7ICJNVFBfT1BFUkFUSU9OX0dFVF9PQkpFQ1QiLCAgICAgICAgICAgICAgICAgICAweDEwMDkgfSwKKyAgICB7ICJNVFBfT1BFUkFUSU9OX0dFVF9USFVNQiIsICAgICAgICAgICAgICAgICAgICAweDEwMEEgfSwKKyAgICB7ICJNVFBfT1BFUkFUSU9OX0RFTEVURV9PQkpFQ1QiLCAgICAgICAgICAgICAgICAweDEwMEIgfSwKKyAgICB7ICJNVFBfT1BFUkFUSU9OX1NFTkRfT0JKRUNUX0lORk8iLCAgICAgICAgICAgICAweDEwMEMgfSwKKyAgICB7ICJNVFBfT1BFUkFUSU9OX1NFTkRfT0JKRUNUIiwgICAgICAgICAgICAgICAgICAweDEwMEQgfSwKKyAgICB7ICJNVFBfT1BFUkFUSU9OX0lOSVRJQVRFX0NBUFRVUkUiLCAgICAgICAgICAgICAweDEwMEUgfSwKKyAgICB7ICJNVFBfT1BFUkFUSU9OX0ZPUk1BVF9TVE9SRSIsICAgICAgICAgICAgICAgICAweDEwMEYgfSwKKyAgICB7ICJNVFBfT1BFUkFUSU9OX1JFU0VUX0RFVklDRSIsICAgICAgICAgICAgICAgICAweDEwMTAgfSwKKyAgICB7ICJNVFBfT1BFUkFUSU9OX1NFTEZfVEVTVCIsICAgICAgICAgICAgICAgICAgICAweDEwMTEgfSwKKyAgICB7ICJNVFBfT1BFUkFUSU9OX1NFVF9PQkpFQ1RfUFJPVEVDVElPTiIsICAgICAgICAweDEwMTIgfSwKKyAgICB7ICJNVFBfT1BFUkFUSU9OX1BPV0VSX0RPV04iLCAgICAgICAgICAgICAgICAgICAweDEwMTMgfSwKKyAgICB7ICJNVFBfT1BFUkFUSU9OX0dFVF9ERVZJQ0VfUFJPUF9ERVNDIiwgICAgICAgICAweDEwMTQgfSwKKyAgICB7ICJNVFBfT1BFUkFUSU9OX0dFVF9ERVZJQ0VfUFJPUF9WQUxVRSIsICAgICAgICAweDEwMTUgfSwKKyAgICB7ICJNVFBfT1BFUkFUSU9OX1NFVF9ERVZJQ0VfUFJPUF9WQUxVRSIsICAgICAgICAweDEwMTYgfSwKKyAgICB7ICJNVFBfT1BFUkFUSU9OX1JFU0VUX0RFVklDRV9QUk9QX1ZBTFVFIiwgICAgICAweDEwMTcgfSwKKyAgICB7ICJNVFBfT1BFUkFUSU9OX1RFUk1JTkFURV9PUEVOX0NBUFRVUkUiLCAgICAgICAweDEwMTggfSwKKyAgICB7ICJNVFBfT1BFUkFUSU9OX01PVkVfT0JKRUNUIiwgICAgICAgICAgICAgICAgICAweDEwMTkgfSwKKyAgICB7ICJNVFBfT1BFUkFUSU9OX0NPUFlfT0JKRUNUIiwgICAgICAgICAgICAgICAgICAweDEwMUEgfSwKKyAgICB7ICJNVFBfT1BFUkFUSU9OX0dFVF9QQVJUSUFMX09CSkVDVCIsICAgICAgICAgICAweDEwMUIgfSwKKyAgICB7ICJNVFBfT1BFUkFUSU9OX0lOSVRJQVRFX09QRU5fQ0FQVFVSRSIsICAgICAgICAweDEwMUMgfSwKKyAgICB7ICJNVFBfT1BFUkFUSU9OX0dFVF9PQkpFQ1RfUFJPUFNfU1VQUE9SVEVEIiwgICAweDk4MDEgfSwKKyAgICB7ICJNVFBfT1BFUkFUSU9OX0dFVF9PQkpFQ1RfUFJPUF9ERVNDIiwgICAgICAgICAweDk4MDIgfSwKKyAgICB7ICJNVFBfT1BFUkFUSU9OX0dFVF9PQkpFQ1RfUFJPUF9WQUxVRSIsICAgICAgICAweDk4MDMgfSwKKyAgICB7ICJNVFBfT1BFUkFUSU9OX1NFVF9PQkpFQ1RfUFJPUF9WQUxVRSIsICAgICAgICAweDk4MDQgfSwKKyAgICB7ICJNVFBfT1BFUkFUSU9OX0dFVF9PQkpFQ1RfUkVGRVJFTkNFUyIsICAgICAgICAweDk4MTAgfSwKKyAgICB7ICJNVFBfT1BFUkFUSU9OX1NFVF9PQkpFQ1RfUkVGRVJFTkNFUyIsICAgICAgICAweDk4MTEgfSwKKyAgICB7ICJNVFBfT1BFUkFUSU9OX1NLSVAiLCAgICAgICAgICAgICAgICAgICAgICAgICAweDk4MjAgfSwKKyAgICB7IDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgfSwKK307CisKKworY29uc3QgY2hhciogTXRwRGVidWc6OmdldE9wZXJhdGlvbkNvZGVOYW1lKE10cE9wZXJhdGlvbkNvZGUgY29kZSkgeworICAgIGNvbnN0IE9wZXJhdGlvbkNvZGVFbnRyeSogZW50cnkgPSBzT3BlcmF0aW9uQ29kZXM7CisgICAgd2hpbGUgKGVudHJ5LT5uYW1lKSB7CisgICAgICAgIGlmIChlbnRyeS0+Y29kZSA9PSBjb2RlKQorICAgICAgICAgICAgcmV0dXJuIGVudHJ5LT5uYW1lOworICAgICAgICBlbnRyeSsrOworICAgIH0KKyAgICByZXR1cm4gIioqKiBVTktOT1dOIE9QRVJBVElPTiAqKioiOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9WZWN0b3IyZi5qYXZhIGIvbWVkaWEvbXRwL010cERlYnVnLmgKc2ltaWxhcml0eSBpbmRleCA2NiUKY29weSBmcm9tIGdyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvVmVjdG9yMmYuamF2YQpjb3B5IHRvIG1lZGlhL210cC9NdHBEZWJ1Zy5oCmluZGV4IDU2N2Q1N2ZhLi4zY2JjMjA5IDEwMDY0NAotLS0gYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1ZlY3RvcjJmLmphdmEKKysrIGIvbWVkaWEvbXRwL010cERlYnVnLmgKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CiAgKgogICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCkBAIC0xNCwyNCArMTQsMTggQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLXBhY2thZ2UgYW5kcm9pZC5yZW5kZXJzY3JpcHQ7CisjaWZuZGVmIF9NVFBfREVCVUdfSAorI2RlZmluZSBfTVRQX0RFQlVHX0gKIAotaW1wb3J0IGphdmEubGFuZy5NYXRoOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisjaW5jbHVkZSAiTXRwVHlwZXMuaCIKIAorbmFtZXNwYWNlIGFuZHJvaWQgewogCi0vKioKLSAqIEBoaWRlCi0gKgotICoqLwotcHVibGljIGNsYXNzIFZlY3RvcjJmIHsKLSAgICBwdWJsaWMgVmVjdG9yMmYoKSB7Ci0gICAgfQorY2xhc3MgTXRwRGVidWcgeworcHVibGljOgorICAgIHN0YXRpYyBjb25zdCBjaGFyKiBnZXRPcGVyYXRpb25Db2RlTmFtZShNdHBPcGVyYXRpb25Db2RlIGNvZGUpOworfTsKIAotICAgIHB1YmxpYyBmbG9hdCB4OwotICAgIHB1YmxpYyBmbG9hdCB5OwotfQorfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAotCi0KLQorI2VuZGlmIC8vIF9NVFBfREVCVUdfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cERldmljZS5jcHAgYi9tZWRpYS9tdHAvTXRwRGV2aWNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYWE4YTM1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXRwL010cERldmljZS5jcHAKQEAgLTAsMCArMSwzMDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIk10cERldmljZSIKKyNpbmNsdWRlICJ1dGlscy9Mb2cuaCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisKKyNpbmNsdWRlIDx1c2Job3N0L3VzYmhvc3QuaD4KKworI2luY2x1ZGUgIk10cERldmljZS5oIgorI2luY2x1ZGUgIk10cERlYnVnLmgiCisjaW5jbHVkZSAiTXRwRGV2aWNlSW5mby5oIgorI2luY2x1ZGUgIk10cE9iamVjdEluZm8uaCIKKyNpbmNsdWRlICJNdHBQcm9wZXJ0eS5oIgorI2luY2x1ZGUgIk10cFN0b3JhZ2VJbmZvLmgiCisjaW5jbHVkZSAiTXRwU3RyaW5nQnVmZmVyLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworTXRwRGV2aWNlOjpNdHBEZXZpY2Uoc3RydWN0IHVzYl9kZXZpY2UqIGRldmljZSwgaW50IGludGVyZmFjZSwKKyAgICAgICAgICAgIHN0cnVjdCB1c2JfZW5kcG9pbnQgKmVwX2luLCBzdHJ1Y3QgdXNiX2VuZHBvaW50ICplcF9vdXQsCisgICAgICAgICAgICBzdHJ1Y3QgdXNiX2VuZHBvaW50ICplcF9pbnRyKQorICAgIDogICBtRGV2aWNlKGRldmljZSksCisgICAgICAgIG1JbnRlcmZhY2UoaW50ZXJmYWNlKSwKKyAgICAgICAgbUVuZHBvaW50SW4oZXBfaW4pLAorICAgICAgICBtRW5kcG9pbnRPdXQoZXBfb3V0KSwKKyAgICAgICAgbUVuZHBvaW50SW50cihlcF9pbnRyKSwKKyAgICAgICAgbURldmljZUluZm8oTlVMTCksCisgICAgICAgIG1JRCh1c2JfZGV2aWNlX2dldF91bmlxdWVfaWQoZGV2aWNlKSksCisgICAgICAgIG1TZXNzaW9uSUQoMCksCisgICAgICAgIG1UcmFuc2FjdGlvbklEKDApCit7Cit9CisKK010cERldmljZTo6fk10cERldmljZSgpIHsKKyAgICBjbG9zZSgpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbURldmljZVByb3BlcnRpZXMuc2l6ZSgpOyBpKyspCisgICAgICAgIGRlbGV0ZSBtRGV2aWNlUHJvcGVydGllc1tpXTsKK30KKwordm9pZCBNdHBEZXZpY2U6OmluaXRpYWxpemUoKSB7CisgICAgb3BlblNlc3Npb24oKTsKKyAgICBtRGV2aWNlSW5mbyA9IGdldERldmljZUluZm8oKTsKKyAgICBpZiAobURldmljZUluZm8pIHsKKyAgICAgICAgbURldmljZUluZm8tPnByaW50KCk7CisKKyAgICAgICAgaWYgKG1EZXZpY2VJbmZvLT5tRGV2aWNlUHJvcGVydGllcykgeworICAgICAgICAgICAgaW50IGNvdW50ID0gbURldmljZUluZm8tPm1EZXZpY2VQcm9wZXJ0aWVzLT5zaXplKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICBNdHBEZXZpY2VQcm9wZXJ0eSBwcm9wQ29kZSA9ICgqbURldmljZUluZm8tPm1EZXZpY2VQcm9wZXJ0aWVzKVtpXTsKKyAgICAgICAgICAgICAgICBNdHBQcm9wZXJ0eSogcHJvcGVydHkgPSBnZXREZXZpY2VQcm9wRGVzYyhwcm9wQ29kZSk7CisgICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5KSB7CisgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5LT5wcmludCgpOworICAgICAgICAgICAgICAgICAgICBtRGV2aWNlUHJvcGVydGllcy5wdXNoKHByb3BlcnR5KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgTXRwRGV2aWNlOjpjbG9zZSgpIHsKKyAgICBpZiAobURldmljZSkgeworICAgICAgICB1c2JfZGV2aWNlX3JlbGVhc2VfaW50ZXJmYWNlKG1EZXZpY2UsIG1JbnRlcmZhY2UpOworICAgICAgICB1c2JfZGV2aWNlX2Nsb3NlKG1EZXZpY2UpOworICAgICAgICBtRGV2aWNlID0gTlVMTDsKKyAgICB9Cit9CisKK2NvbnN0IGNoYXIqIE10cERldmljZTo6Z2V0RGV2aWNlTmFtZSgpIHsKKyAgICBpZiAobURldmljZSkKKyAgICAgICAgcmV0dXJuIHVzYl9kZXZpY2VfZ2V0X25hbWUobURldmljZSk7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gIj8/PyI7Cit9CisKK2Jvb2wgTXRwRGV2aWNlOjpvcGVuU2Vzc2lvbigpIHsKKyAgICBtU2Vzc2lvbklEID0gMDsKKyAgICBtVHJhbnNhY3Rpb25JRCA9IDA7CisgICAgTXRwU2Vzc2lvbklEIG5ld1Nlc3Npb24gPSAxOworICAgIG1SZXF1ZXN0LnJlc2V0KCk7CisgICAgbVJlcXVlc3Quc2V0UGFyYW1ldGVyKDEsIG5ld1Nlc3Npb24pOworICAgIGlmICghc2VuZFJlcXVlc3QoTVRQX09QRVJBVElPTl9PUEVOX1NFU1NJT04pKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgTXRwUmVzcG9uc2VDb2RlIHJldCA9IHJlYWRSZXNwb25zZSgpOworICAgIGlmIChyZXQgPT0gTVRQX1JFU1BPTlNFX1NFU1NJT05fQUxSRUFEWV9PUEVOKQorICAgICAgICBuZXdTZXNzaW9uID0gbVJlc3BvbnNlLmdldFBhcmFtZXRlcigxKTsKKyAgICBlbHNlIGlmIChyZXQgIT0gTVRQX1JFU1BPTlNFX09LKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBtU2Vzc2lvbklEID0gbmV3U2Vzc2lvbjsKKyAgICBtVHJhbnNhY3Rpb25JRCA9IDE7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgTXRwRGV2aWNlOjpjbG9zZVNlc3Npb24oKSB7CisgICAgLy8gRklYTUUKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworTXRwRGV2aWNlSW5mbyogTXRwRGV2aWNlOjpnZXREZXZpY2VJbmZvKCkgeworICAgIG1SZXF1ZXN0LnJlc2V0KCk7CisgICAgaWYgKCFzZW5kUmVxdWVzdChNVFBfT1BFUkFUSU9OX0dFVF9ERVZJQ0VfSU5GTykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghcmVhZERhdGEoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTXRwUmVzcG9uc2VDb2RlIHJldCA9IHJlYWRSZXNwb25zZSgpOworICAgIGlmIChyZXQgPT0gTVRQX1JFU1BPTlNFX09LKSB7CisgICAgICAgIE10cERldmljZUluZm8qIGluZm8gPSBuZXcgTXRwRGV2aWNlSW5mbzsKKyAgICAgICAgaW5mby0+cmVhZChtRGF0YSk7CisgICAgICAgIHJldHVybiBpbmZvOworICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKworTXRwU3RvcmFnZUlETGlzdCogTXRwRGV2aWNlOjpnZXRTdG9yYWdlSURzKCkgeworICAgIG1SZXF1ZXN0LnJlc2V0KCk7CisgICAgaWYgKCFzZW5kUmVxdWVzdChNVFBfT1BFUkFUSU9OX0dFVF9TVE9SQUdFX0lEUykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghcmVhZERhdGEoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTXRwUmVzcG9uc2VDb2RlIHJldCA9IHJlYWRSZXNwb25zZSgpOworICAgIGlmIChyZXQgPT0gTVRQX1JFU1BPTlNFX09LKSB7CisgICAgICAgIHJldHVybiBtRGF0YS5nZXRBVUludDMyKCk7CisgICAgfQorICAgIHJldHVybiBOVUxMOworfQorCitNdHBTdG9yYWdlSW5mbyogTXRwRGV2aWNlOjpnZXRTdG9yYWdlSW5mbyhNdHBTdG9yYWdlSUQgc3RvcmFnZUlEKSB7CisgICAgbVJlcXVlc3QucmVzZXQoKTsKKyAgICBtUmVxdWVzdC5zZXRQYXJhbWV0ZXIoMSwgc3RvcmFnZUlEKTsKKyAgICBpZiAoIXNlbmRSZXF1ZXN0KE1UUF9PUEVSQVRJT05fR0VUX1NUT1JBR0VfSU5GTykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghcmVhZERhdGEoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTXRwUmVzcG9uc2VDb2RlIHJldCA9IHJlYWRSZXNwb25zZSgpOworICAgIGlmIChyZXQgPT0gTVRQX1JFU1BPTlNFX09LKSB7CisgICAgICAgIE10cFN0b3JhZ2VJbmZvKiBpbmZvID0gbmV3IE10cFN0b3JhZ2VJbmZvKHN0b3JhZ2VJRCk7CisgICAgICAgIGluZm8tPnJlYWQobURhdGEpOworICAgICAgICByZXR1cm4gaW5mbzsKKyAgICB9CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK010cE9iamVjdEhhbmRsZUxpc3QqIE10cERldmljZTo6Z2V0T2JqZWN0SGFuZGxlcyhNdHBTdG9yYWdlSUQgc3RvcmFnZUlELAorICAgICAgICAgICAgTXRwT2JqZWN0Rm9ybWF0IGZvcm1hdCwgTXRwT2JqZWN0SGFuZGxlIHBhcmVudCkgeworICAgIG1SZXF1ZXN0LnJlc2V0KCk7CisgICAgbVJlcXVlc3Quc2V0UGFyYW1ldGVyKDEsIHN0b3JhZ2VJRCk7CisgICAgbVJlcXVlc3Quc2V0UGFyYW1ldGVyKDIsIGZvcm1hdCk7CisgICAgbVJlcXVlc3Quc2V0UGFyYW1ldGVyKDMsIHBhcmVudCk7CisgICAgaWYgKCFzZW5kUmVxdWVzdChNVFBfT1BFUkFUSU9OX0dFVF9PQkpFQ1RfSEFORExFUykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghcmVhZERhdGEoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTXRwUmVzcG9uc2VDb2RlIHJldCA9IHJlYWRSZXNwb25zZSgpOworICAgIGlmIChyZXQgPT0gTVRQX1JFU1BPTlNFX09LKSB7CisgICAgICAgIHJldHVybiBtRGF0YS5nZXRBVUludDMyKCk7CisgICAgfQorICAgIHJldHVybiBOVUxMOworfQorCitNdHBPYmplY3RJbmZvKiBNdHBEZXZpY2U6OmdldE9iamVjdEluZm8oTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSkgeworICAgIC8vIEZJWE1FIC0gd2UgbWlnaHQgd2FudCB0byBhZGQgc29tZSBjYWNoaW5nIGhlcmUKKworICAgIG1SZXF1ZXN0LnJlc2V0KCk7CisgICAgbVJlcXVlc3Quc2V0UGFyYW1ldGVyKDEsIGhhbmRsZSk7CisgICAgaWYgKCFzZW5kUmVxdWVzdChNVFBfT1BFUkFUSU9OX0dFVF9PQkpFQ1RfSU5GTykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghcmVhZERhdGEoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTXRwUmVzcG9uc2VDb2RlIHJldCA9IHJlYWRSZXNwb25zZSgpOworICAgIGlmIChyZXQgPT0gTVRQX1JFU1BPTlNFX09LKSB7CisgICAgICAgIE10cE9iamVjdEluZm8qIGluZm8gPSBuZXcgTXRwT2JqZWN0SW5mbyhoYW5kbGUpOworICAgICAgICBpbmZvLT5yZWFkKG1EYXRhKTsKKyAgICAgICAgcmV0dXJuIGluZm87CisgICAgfQorICAgIHJldHVybiBOVUxMOworfQorCit2b2lkKiBNdHBEZXZpY2U6OmdldFRodW1ibmFpbChNdHBPYmplY3RIYW5kbGUgaGFuZGxlLCBpbnQmIG91dExlbmd0aCkgeworICAgIG1SZXF1ZXN0LnJlc2V0KCk7CisgICAgbVJlcXVlc3Quc2V0UGFyYW1ldGVyKDEsIGhhbmRsZSk7CisgICAgaWYgKHNlbmRSZXF1ZXN0KE1UUF9PUEVSQVRJT05fR0VUX1RIVU1CKSAmJiByZWFkRGF0YSgpKSB7CisgICAgICAgIE10cFJlc3BvbnNlQ29kZSByZXQgPSByZWFkUmVzcG9uc2UoKTsKKyAgICAgICAgaWYgKHJldCA9PSBNVFBfUkVTUE9OU0VfT0spIHsKKyAgICAgICAgICAgIHJldHVybiBtRGF0YS5nZXREYXRhKG91dExlbmd0aCk7CisgICAgICAgIH0KKyAgICB9CisgICAgb3V0TGVuZ3RoID0gMDsKKyAgICByZXR1cm4gTlVMTDsKK30KKworYm9vbCBNdHBEZXZpY2U6OmRlbGV0ZU9iamVjdChNdHBPYmplY3RIYW5kbGUgaGFuZGxlKSB7CisgICAgbVJlcXVlc3QucmVzZXQoKTsKKyAgICBtUmVxdWVzdC5zZXRQYXJhbWV0ZXIoMSwgaGFuZGxlKTsKKyAgICBpZiAoc2VuZFJlcXVlc3QoTVRQX09QRVJBVElPTl9ERUxFVEVfT0JKRUNUKSkgeworICAgICAgICBNdHBSZXNwb25zZUNvZGUgcmV0ID0gcmVhZFJlc3BvbnNlKCk7CisgICAgICAgIGlmIChyZXQgPT0gTVRQX1JFU1BPTlNFX09LKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworTXRwT2JqZWN0SGFuZGxlIE10cERldmljZTo6Z2V0UGFyZW50KE10cE9iamVjdEhhbmRsZSBoYW5kbGUpIHsKKyAgICBNdHBPYmplY3RJbmZvKiBpbmZvID0gZ2V0T2JqZWN0SW5mbyhoYW5kbGUpOworICAgIGlmIChpbmZvKQorICAgICAgICByZXR1cm4gaW5mby0+bVBhcmVudDsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiAtMTsKK30KKworTXRwT2JqZWN0SGFuZGxlIE10cERldmljZTo6Z2V0U3RvcmFnZUlEKE10cE9iamVjdEhhbmRsZSBoYW5kbGUpIHsKKyAgICBNdHBPYmplY3RJbmZvKiBpbmZvID0gZ2V0T2JqZWN0SW5mbyhoYW5kbGUpOworICAgIGlmIChpbmZvKQorICAgICAgICByZXR1cm4gaW5mby0+bVN0b3JhZ2VJRDsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiAtMTsKK30KKworTXRwUHJvcGVydHkqIE10cERldmljZTo6Z2V0RGV2aWNlUHJvcERlc2MoTXRwRGV2aWNlUHJvcGVydHkgY29kZSkgeworICAgIG1SZXF1ZXN0LnJlc2V0KCk7CisgICAgbVJlcXVlc3Quc2V0UGFyYW1ldGVyKDEsIGNvZGUpOworICAgIGlmICghc2VuZFJlcXVlc3QoTVRQX09QRVJBVElPTl9HRVRfREVWSUNFX1BST1BfREVTQykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghcmVhZERhdGEoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTXRwUmVzcG9uc2VDb2RlIHJldCA9IHJlYWRSZXNwb25zZSgpOworICAgIGlmIChyZXQgPT0gTVRQX1JFU1BPTlNFX09LKSB7CisgICAgICAgIE10cFByb3BlcnR5KiBwcm9wZXJ0eSA9IG5ldyBNdHBQcm9wZXJ0eTsKKyAgICAgICAgcHJvcGVydHktPnJlYWQobURhdGEpOworICAgICAgICByZXR1cm4gcHJvcGVydHk7CisgICAgfQorICAgIHJldHVybiBOVUxMOworfQorCisKK2Jvb2wgTXRwRGV2aWNlOjpzZW5kUmVxdWVzdChNdHBPcGVyYXRpb25Db2RlIG9wZXJhdGlvbikgeworICAgIExPR0QoInNlbmRSZXF1ZXN0OiAlc1xuIiwgTXRwRGVidWc6OmdldE9wZXJhdGlvbkNvZGVOYW1lKG9wZXJhdGlvbikpOworICAgIG1SZXF1ZXN0LnNldE9wZXJhdGlvbkNvZGUob3BlcmF0aW9uKTsKKyAgICBpZiAobVRyYW5zYWN0aW9uSUQgPiAwKQorICAgICAgICBtUmVxdWVzdC5zZXRUcmFuc2FjdGlvbklEKG1UcmFuc2FjdGlvbklEKyspOworICAgIGludCByZXQgPSBtUmVxdWVzdC53cml0ZShtRW5kcG9pbnRPdXQpOworICAgIG1SZXF1ZXN0LmR1bXAoKTsKKyAgICByZXR1cm4gKHJldCA+IDApOworfQorCitib29sIE10cERldmljZTo6c2VuZERhdGEoTXRwT3BlcmF0aW9uQ29kZSBvcGVyYXRpb24pIHsKKyAgICBMT0dEKCJzZW5kRGF0YVxuIik7CisgICAgbURhdGEuc2V0T3BlcmF0aW9uQ29kZShtUmVxdWVzdC5nZXRPcGVyYXRpb25Db2RlKCkpOworICAgIG1EYXRhLnNldFRyYW5zYWN0aW9uSUQobVJlcXVlc3QuZ2V0VHJhbnNhY3Rpb25JRCgpKTsKKyAgICBpbnQgcmV0ID0gbURhdGEud3JpdGUobUVuZHBvaW50T3V0KTsKKyAgICBtRGF0YS5kdW1wKCk7CisgICAgcmV0dXJuIChyZXQgPiAwKTsKK30KKworYm9vbCBNdHBEZXZpY2U6OnJlYWREYXRhKCkgeworICAgIG1EYXRhLnJlc2V0KCk7CisgICAgaW50IHJldCA9IG1EYXRhLnJlYWQobUVuZHBvaW50SW4pOworICAgIExPR0QoInJlYWREYXRhIHJldHVybmVkICVkXG4iLCByZXQpOworICAgIGlmIChyZXQgPj0gTVRQX0NPTlRBSU5FUl9IRUFERVJfU0laRSkgeworICAgICAgICBtRGF0YS5kdW1wKCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgTE9HRCgicmVhZFJlc3BvbnNlIGZhaWxlZFxuIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9Cit9CisKK010cFJlc3BvbnNlQ29kZSBNdHBEZXZpY2U6OnJlYWRSZXNwb25zZSgpIHsKKyAgICBMT0dEKCJyZWFkUmVzcG9uc2VcbiIpOworICAgIGludCByZXQgPSBtUmVzcG9uc2UucmVhZChtRW5kcG9pbnRJbik7CisgICAgaWYgKHJldCA+PSBNVFBfQ09OVEFJTkVSX0hFQURFUl9TSVpFKSB7CisgICAgICAgIG1SZXNwb25zZS5kdW1wKCk7CisgICAgICAgIHJldHVybiBtUmVzcG9uc2UuZ2V0UmVzcG9uc2VDb2RlKCk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBMT0dEKCJyZWFkUmVzcG9uc2UgZmFpbGVkXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBEZXZpY2UuaCBiL21lZGlhL210cC9NdHBEZXZpY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjA1MTk3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXRwL010cERldmljZS5oCkBAIC0wLDAgKzEsOTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9NVFBfREVWSUNFX0gKKyNkZWZpbmUgX01UUF9ERVZJQ0VfSAorCisjaW5jbHVkZSAiTXRwUmVxdWVzdFBhY2tldC5oIgorI2luY2x1ZGUgIk10cERhdGFQYWNrZXQuaCIKKyNpbmNsdWRlICJNdHBSZXNwb25zZVBhY2tldC5oIgorI2luY2x1ZGUgIk10cFR5cGVzLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgTXRwRGV2aWNlSW5mbzsKK2NsYXNzIE10cE9iamVjdEluZm87CitjbGFzcyBNdHBTdG9yYWdlSW5mbzsKKworY2xhc3MgTXRwRGV2aWNlIHsKK3ByaXZhdGU6CisgICAgc3RydWN0IHVzYl9kZXZpY2UqICAgICAgbURldmljZTsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICBtSW50ZXJmYWNlOworICAgIHN0cnVjdCB1c2JfZW5kcG9pbnQqICAgIG1FbmRwb2ludEluOworICAgIHN0cnVjdCB1c2JfZW5kcG9pbnQqICAgIG1FbmRwb2ludE91dDsKKyAgICBzdHJ1Y3QgdXNiX2VuZHBvaW50KiAgICBtRW5kcG9pbnRJbnRyOworICAgIE10cERldmljZUluZm8qICAgICAgICAgIG1EZXZpY2VJbmZvOworICAgIE10cFByb3BlcnR5TGlzdCAgICAgICAgIG1EZXZpY2VQcm9wZXJ0aWVzOworCisgICAgLy8gYSB1bmlxdWUgSUQgZm9yIHRoZSBkZXZpY2UKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICBtSUQ7CisKKyAgICAvLyBjdXJyZW50IHNlc3Npb24gSUQKKyAgICBNdHBTZXNzaW9uSUQgICAgICAgICAgICBtU2Vzc2lvbklEOworICAgIC8vIGN1cnJlbnQgdHJhbnNhY3Rpb24gSUQKKyAgICBNdHBUcmFuc2FjdGlvbklEICAgICAgICBtVHJhbnNhY3Rpb25JRDsKKworICAgIE10cFJlcXVlc3RQYWNrZXQgICAgICAgIG1SZXF1ZXN0OworICAgIE10cERhdGFQYWNrZXQgICAgICAgICAgIG1EYXRhOworICAgIE10cFJlc3BvbnNlUGFja2V0ICAgICAgIG1SZXNwb25zZTsKKworcHVibGljOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cERldmljZShzdHJ1Y3QgdXNiX2RldmljZSogZGV2aWNlLCBpbnQgaW50ZXJmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHVzYl9lbmRwb2ludCAqZXBfaW4sIHN0cnVjdCB1c2JfZW5kcG9pbnQgKmVwX291dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB1c2JfZW5kcG9pbnQgKmVwX2ludHIpOworICAgIHZpcnR1YWwgICAgICAgICAgICAgICAgIH5NdHBEZXZpY2UoKTsKKworICAgIGlubGluZSBpbnQgICAgICAgICAgICAgIGdldElEKCkgY29uc3QgeyByZXR1cm4gbUlEOyB9CisKKyAgICB2b2lkICAgICAgICAgICAgICAgICAgICBpbml0aWFsaXplKCk7CisgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgY2xvc2UoKTsKKyAgICBjb25zdCBjaGFyKiAgICAgICAgICAgICBnZXREZXZpY2VOYW1lKCk7CisKKyAgICBib29sICAgICAgICAgICAgICAgICAgICBvcGVuU2Vzc2lvbigpOworICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIGNsb3NlU2Vzc2lvbigpOworCisgICAgTXRwRGV2aWNlSW5mbyogICAgICAgICAgZ2V0RGV2aWNlSW5mbygpOworICAgIE10cFN0b3JhZ2VJRExpc3QqICAgICAgIGdldFN0b3JhZ2VJRHMoKTsKKyAgICBNdHBTdG9yYWdlSW5mbyogICAgICAgICBnZXRTdG9yYWdlSW5mbyhNdHBTdG9yYWdlSUQgc3RvcmFnZUlEKTsKKyAgICBNdHBPYmplY3RIYW5kbGVMaXN0KiAgICBnZXRPYmplY3RIYW5kbGVzKE10cFN0b3JhZ2VJRCBzdG9yYWdlSUQsIE10cE9iamVjdEZvcm1hdCBmb3JtYXQsIE10cE9iamVjdEhhbmRsZSBwYXJlbnQpOworICAgIE10cE9iamVjdEluZm8qICAgICAgICAgIGdldE9iamVjdEluZm8oTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSk7CisgICAgdm9pZCogICAgICAgICAgICAgICAgICAgZ2V0VGh1bWJuYWlsKE10cE9iamVjdEhhbmRsZSBoYW5kbGUsIGludCYgb3V0TGVuZ3RoKTsKKyAgICBib29sICAgICAgICAgICAgICAgICAgICBkZWxldGVPYmplY3QoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSk7CisgICAgTXRwT2JqZWN0SGFuZGxlICAgICAgICAgZ2V0UGFyZW50KE10cE9iamVjdEhhbmRsZSBoYW5kbGUpOworICAgIE10cE9iamVjdEhhbmRsZSAgICAgICAgIGdldFN0b3JhZ2VJRChNdHBPYmplY3RIYW5kbGUgaGFuZGxlKTsKKworICAgIE10cFByb3BlcnR5KiAgICAgICAgICAgIGdldERldmljZVByb3BEZXNjKE10cERldmljZVByb3BlcnR5IGNvZGUpOworCitwcml2YXRlOgorICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIHNlbmRSZXF1ZXN0KE10cE9wZXJhdGlvbkNvZGUgb3BlcmF0aW9uKTsKKyAgICBib29sICAgICAgICAgICAgICAgICAgICBzZW5kRGF0YShNdHBPcGVyYXRpb25Db2RlIG9wZXJhdGlvbik7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgcmVhZERhdGEoKTsKKyAgICBNdHBSZXNwb25zZUNvZGUgICAgICAgICByZWFkUmVzcG9uc2UoKTsKKworfTsKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIF9NVFBfREVWSUNFX0gKZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBEZXZpY2VJbmZvLmNwcCBiL21lZGlhL210cC9NdHBEZXZpY2VJbmZvLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjI1ZmIzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXRwL010cERldmljZUluZm8uY3BwCkBAIC0wLDAgKzEsOTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIk10cERldmljZUluZm8iCisjaW5jbHVkZSAidXRpbHMvTG9nLmgiCisKKyNpbmNsdWRlICJNdHBEYXRhUGFja2V0LmgiCisjaW5jbHVkZSAiTXRwRGV2aWNlSW5mby5oIgorI2luY2x1ZGUgIk10cFN0cmluZ0J1ZmZlci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK010cERldmljZUluZm86Ok10cERldmljZUluZm8oKQorICAgIDogICBtU3RhbmRhcmRWZXJzaW9uKDApLAorICAgICAgICBtVmVuZG9yRXh0ZW5zaW9uSUQoMCksCisgICAgICAgIG1WZW5kb3JFeHRlbnNpb25WZXJzaW9uKDApLAorICAgICAgICBtVmVuZG9yRXh0ZW5zaW9uRGVzYyhOVUxMKSwKKyAgICAgICAgbUZ1bmN0aW9uYWxDb2RlKDApLAorICAgICAgICBtT3BlcmF0aW9ucyhOVUxMKSwKKyAgICAgICAgbUV2ZW50cyhOVUxMKSwKKyAgICAgICAgbURldmljZVByb3BlcnRpZXMoTlVMTCksCisgICAgICAgIG1DYXB0dXJlRm9ybWF0cyhOVUxMKSwKKyAgICAgICAgbVBsYXliYWNrRm9ybWF0cyhOVUxMKSwKKyAgICAgICAgbU1hbnVmYWN0dXJlcihOVUxMKSwKKyAgICAgICAgbU1vZGVsKE5VTEwpLAorICAgICAgICBtVmVyc2lvbihOVUxMKSwKKyAgICAgICAgbVNlcmlhbChOVUxMKQoreworfQorCitNdHBEZXZpY2VJbmZvOjp+TXRwRGV2aWNlSW5mbygpIHsKKyAgICBpZiAobVZlbmRvckV4dGVuc2lvbkRlc2MpCisgICAgICAgIGZyZWUobVZlbmRvckV4dGVuc2lvbkRlc2MpOworICAgIGRlbGV0ZSBtT3BlcmF0aW9uczsKKyAgICBkZWxldGUgbUV2ZW50czsKKyAgICBkZWxldGUgbURldmljZVByb3BlcnRpZXM7CisgICAgZGVsZXRlIG1DYXB0dXJlRm9ybWF0czsKKyAgICBkZWxldGUgbVBsYXliYWNrRm9ybWF0czsKKyAgICBpZiAobU1hbnVmYWN0dXJlcikKKyAgICAgICAgZnJlZShtTWFudWZhY3R1cmVyKTsKKyAgICBpZiAobU1vZGVsKQorICAgICAgICBmcmVlKG1Nb2RlbCk7CisgICAgaWYgKG1WZXJzaW9uKQorICAgICAgICBmcmVlKG1WZXJzaW9uKTsKKyAgICBpZiAobVNlcmlhbCkKKyAgICAgICAgZnJlZShtU2VyaWFsKTsKK30KKwordm9pZCBNdHBEZXZpY2VJbmZvOjpyZWFkKE10cERhdGFQYWNrZXQmIHBhY2tldCkgeworICAgIE10cFN0cmluZ0J1ZmZlciBzdHJpbmc7CisKKyAgICAvLyByZWFkIHRoZSBkZXZpY2UgaW5mbworICAgIG1TdGFuZGFyZFZlcnNpb24gPSBwYWNrZXQuZ2V0VUludDE2KCk7CisgICAgbVZlbmRvckV4dGVuc2lvbklEID0gcGFja2V0LmdldFVJbnQzMigpOworICAgIG1WZW5kb3JFeHRlbnNpb25WZXJzaW9uID0gcGFja2V0LmdldFVJbnQxNigpOworCisgICAgcGFja2V0LmdldFN0cmluZyhzdHJpbmcpOworICAgIG1WZW5kb3JFeHRlbnNpb25EZXNjID0gc3RyZHVwKChjb25zdCBjaGFyICopc3RyaW5nKTsKKworICAgIG1GdW5jdGlvbmFsQ29kZSA9IHBhY2tldC5nZXRVSW50MTYoKTsKKyAgICBtT3BlcmF0aW9ucyA9IHBhY2tldC5nZXRBVUludDE2KCk7CisgICAgbUV2ZW50cyA9IHBhY2tldC5nZXRBVUludDE2KCk7CisgICAgbURldmljZVByb3BlcnRpZXMgPSBwYWNrZXQuZ2V0QVVJbnQxNigpOworICAgIG1DYXB0dXJlRm9ybWF0cyA9IHBhY2tldC5nZXRBVUludDE2KCk7CisgICAgbVBsYXliYWNrRm9ybWF0cyA9IHBhY2tldC5nZXRBVUludDE2KCk7CisKKyAgICBwYWNrZXQuZ2V0U3RyaW5nKHN0cmluZyk7CisgICAgbU1hbnVmYWN0dXJlciA9IHN0cmR1cCgoY29uc3QgY2hhciAqKXN0cmluZyk7CisgICAgcGFja2V0LmdldFN0cmluZyhzdHJpbmcpOworICAgIG1Nb2RlbCA9IHN0cmR1cCgoY29uc3QgY2hhciAqKXN0cmluZyk7CisgICAgcGFja2V0LmdldFN0cmluZyhzdHJpbmcpOworICAgIG1WZXJzaW9uID0gc3RyZHVwKChjb25zdCBjaGFyICopc3RyaW5nKTsKKyAgICBwYWNrZXQuZ2V0U3RyaW5nKHN0cmluZyk7CisgICAgbVNlcmlhbCA9IHN0cmR1cCgoY29uc3QgY2hhciAqKXN0cmluZyk7Cit9CisKK3ZvaWQgTXRwRGV2aWNlSW5mbzo6cHJpbnQoKSB7CisgICAgTE9HRCgiRGV2aWNlIEluZm86XG5cdG1TdGFuZGFyZFZlcnNpb246ICVkXG5cdG1WZW5kb3JFeHRlbnNpb25JRDogJWRcblx0bVZlbmRvckV4dGVuc2lvblZlcnNpb255OiAlZFxuIiwKKyAgICAgICAgICAgIG1TdGFuZGFyZFZlcnNpb24sIG1WZW5kb3JFeHRlbnNpb25JRCwgbVZlbmRvckV4dGVuc2lvblZlcnNpb24pOworICAgIExPR0QoIlx0bVZlbmRvckV4dGVuc2lvbkRlc2M6ICVzXG5cdG1GdW5jdGlvbmFsQ29kZTogJWRcblx0bU1hbnVmYWN0dXJlcjogJXNcblx0bU1vZGVsOiAlc1xuXHRtVmVyc2lvbjogJXNcblx0bVNlcmlhbDogJXNcbiIsCisgICAgICAgICAgICBtVmVuZG9yRXh0ZW5zaW9uRGVzYywgbUZ1bmN0aW9uYWxDb2RlLCBtTWFudWZhY3R1cmVyLCBtTW9kZWwsIG1WZXJzaW9uLCBtU2VyaWFsKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBEZXZpY2VJbmZvLmggYi9tZWRpYS9tdHAvTXRwRGV2aWNlSW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhYmFhMTAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdHAvTXRwRGV2aWNlSW5mby5oCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9NVFBfREVWSUNFX0lORk9fSAorI2RlZmluZSBfTVRQX0RFVklDRV9JTkZPX0gKKworc3RydWN0IHN0YXQ7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgTXRwRGF0YVBhY2tldDsKKworY2xhc3MgTXRwRGV2aWNlSW5mbyB7CitwdWJsaWM6CisgICAgdWludDE2X3QgICAgICAgICAgICAgICAgbVN0YW5kYXJkVmVyc2lvbjsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICBtVmVuZG9yRXh0ZW5zaW9uSUQ7CisgICAgdWludDE2X3QgICAgICAgICAgICAgICAgbVZlbmRvckV4dGVuc2lvblZlcnNpb247CisgICAgY2hhciogICAgICAgICAgICAgICAgICAgbVZlbmRvckV4dGVuc2lvbkRlc2M7CisgICAgdWludDE2X3QgICAgICAgICAgICAgICAgbUZ1bmN0aW9uYWxDb2RlOworICAgIFVJbnQxNkxpc3QqICAgICAgICAgICAgIG1PcGVyYXRpb25zOworICAgIFVJbnQxNkxpc3QqICAgICAgICAgICAgIG1FdmVudHM7CisgICAgTXRwRGV2aWNlUHJvcGVydHlMaXN0KiAgbURldmljZVByb3BlcnRpZXM7CisgICAgTXRwT2JqZWN0Rm9ybWF0TGlzdCogICAgbUNhcHR1cmVGb3JtYXRzOworICAgIE10cE9iamVjdEZvcm1hdExpc3QqICAgIG1QbGF5YmFja0Zvcm1hdHM7CisgICAgY2hhciogICAgICAgICAgICAgICAgICAgbU1hbnVmYWN0dXJlcjsKKyAgICBjaGFyKiAgICAgICAgICAgICAgICAgICBtTW9kZWw7CisgICAgY2hhciogICAgICAgICAgICAgICAgICAgbVZlcnNpb247CisgICAgY2hhciogICAgICAgICAgICAgICAgICAgbVNlcmlhbDsKKworcHVibGljOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cERldmljZUluZm8oKTsKKyAgICB2aXJ0dWFsICAgICAgICAgICAgICAgICB+TXRwRGV2aWNlSW5mbygpOworCisgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgcmVhZChNdHBEYXRhUGFja2V0JiBwYWNrZXQpOworCisgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgcHJpbnQoKTsKK307CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBfTVRQX0RFVklDRV9JTkZPX0gKZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBNZWRpYVNjYW5uZXIuY3BwIGIvbWVkaWEvbXRwL010cE1lZGlhU2Nhbm5lci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWRiMWI5ZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL210cC9NdHBNZWRpYVNjYW5uZXIuY3BwCkBAIC0wLDAgKzEsMzc4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIk10cERhdGFiYXNlLmgiCisjaW5jbHVkZSAiTXRwTWVkaWFTY2FubmVyLmgiCisjaW5jbHVkZSAibXRwLmgiCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy9zdGF0ZnMuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxkaXJlbnQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9tZWRpYXNjYW5uZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9TdGFnZWZyaWdodE1lZGlhU2Nhbm5lci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIE10cE1lZGlhU2Nhbm5lckNsaWVudCA6IHB1YmxpYyBNZWRpYVNjYW5uZXJDbGllbnQKK3sKK3B1YmxpYzoKKyAgICBNdHBNZWRpYVNjYW5uZXJDbGllbnQoKQorICAgIHsKKyAgICAgICAgcmVzZXQoKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5NdHBNZWRpYVNjYW5uZXJDbGllbnQoKQorICAgIHsKKyAgICB9CisKKyAgICAvLyByZXR1cm5zIHRydWUgaWYgaXQgc3VjY2VlZGVkLCBmYWxzZSBpZiBhbiBleGNlcHRpb24gb2NjdXJlZCBpbiB0aGUgSmF2YSBjb2RlCisgICAgdmlydHVhbCBib29sIHNjYW5GaWxlKGNvbnN0IGNoYXIqIHBhdGgsIGxvbmcgbG9uZyBsYXN0TW9kaWZpZWQsIGxvbmcgbG9uZyBmaWxlU2l6ZSkKKyAgICB7CisgICAgICAgIHByaW50Zigic2NhbkZpbGUgJXNcbiIsIHBhdGgpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvLyByZXR1cm5zIHRydWUgaWYgaXQgc3VjY2VlZGVkLCBmYWxzZSBpZiBhbiBleGNlcHRpb24gb2NjdXJlZCBpbiB0aGUgSmF2YSBjb2RlCisgICAgdmlydHVhbCBib29sIGhhbmRsZVN0cmluZ1RhZyhjb25zdCBjaGFyKiBuYW1lLCBjb25zdCBjaGFyKiB2YWx1ZSkKKyAgICB7CisgICAgICAgIGludCB0ZW1wOworCisgICAgICAgIGlmICghc3RyY21wKG5hbWUsICJ0aXRsZSIpKSB7CisgICAgICAgICAgICBtVGl0bGUgPSB2YWx1ZTsKKyAgICAgICAgICAgIG1IYXNUaXRsZSA9IHRydWU7CisgICAgICAgIH0gZWxzZSBpZiAgKCFzdHJjbXAobmFtZSwgImFydGlzdCIpKSB7CisgICAgICAgICAgICBtQXJ0aXN0ID0gdmFsdWU7CisgICAgICAgICAgICBtSGFzQXJ0aXN0ID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIGlmICAoIXN0cmNtcChuYW1lLCAiYWxidW0iKSkgeworICAgICAgICAgICAgbUFsYnVtID0gdmFsdWU7CisgICAgICAgICAgICBtSGFzQWxidW0gPSB0cnVlOworICAgICAgICB9IGVsc2UgaWYgICghc3RyY21wKG5hbWUsICJhbGJ1bWFydGlzdCIpKSB7CisgICAgICAgICAgICBtQWxidW1BcnRpc3QgPSB2YWx1ZTsKKyAgICAgICAgICAgIG1IYXNBbGJ1bUFydGlzdCA9IHRydWU7CisgICAgICAgIH0gZWxzZSBpZiAgKCFzdHJjbXAobmFtZSwgImdlbnJlIikpIHsKKyAgICAgICAgICAgIC8vIEZJWE1FIC0gaGFuZGxlIG51bWVyaWMgdmFsdWVzIGhlcmUKKyAgICAgICAgICAgIG1HZW5yZSA9IHZhbHVlOworICAgICAgICAgICAgbUhhc0dlbnJlID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIGlmICAoIXN0cmNtcChuYW1lLCAiY29tcG9zZXIiKSkgeworICAgICAgICAgICAgbUNvbXBvc2VyID0gdmFsdWU7CisgICAgICAgICAgICBtSGFzQ29tcG9zZXIgPSB0cnVlOworICAgICAgICB9IGVsc2UgaWYgICghc3RyY21wKG5hbWUsICJ0cmFja251bWJlciIpKSB7CisgICAgICAgICAgICBpZiAoc3NjYW5mKHZhbHVlLCAiJWQiLCAmdGVtcCkgPT0gMSkKKyAgICAgICAgICAgICAgICBtVHJhY2sgPSB0ZW1wOworICAgICAgICB9IGVsc2UgaWYgICghc3RyY21wKG5hbWUsICJkaXNjbnVtYmVyIikpIHsKKyAgICAgICAgICAgIC8vIGN1cnJlbnRseSB1bnVzZWQKKyAgICAgICAgfSBlbHNlIGlmICAoIXN0cmNtcChuYW1lLCAieWVhciIpIHx8ICFzdHJjbXAobmFtZSwgImRhdGUiKSkgeworICAgICAgICAgICAgaWYgKHNzY2FuZih2YWx1ZSwgIiVkIiwgJnRlbXApID09IDEpCisgICAgICAgICAgICAgICAgbVllYXIgPSB0ZW1wOworICAgICAgICB9IGVsc2UgaWYgICghc3RyY21wKG5hbWUsICJkdXJhdGlvbiIpKSB7CisgICAgICAgICAgICBpZiAoc3NjYW5mKHZhbHVlLCAiJWQiLCAmdGVtcCkgPT0gMSkKKyAgICAgICAgICAgICAgICBtRHVyYXRpb24gPSB0ZW1wOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcHJpbnRmKCJoYW5kbGVTdHJpbmdUYWcgJXMgOiAlc1xuIiwgbmFtZSwgdmFsdWUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8vIHJldHVybnMgdHJ1ZSBpZiBpdCBzdWNjZWVkZWQsIGZhbHNlIGlmIGFuIGV4Y2VwdGlvbiBvY2N1cmVkIGluIHRoZSBKYXZhIGNvZGUKKyAgICB2aXJ0dWFsIGJvb2wgc2V0TWltZVR5cGUoY29uc3QgY2hhciogbWltZVR5cGUpCisgICAgeworICAgICAgICBtTWltZVR5cGUgPSBtaW1lVHlwZTsKKyAgICAgICAgbUhhc01pbWVUeXBlID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLy8gcmV0dXJucyB0cnVlIGlmIGl0IHN1Y2NlZWRlZCwgZmFsc2UgaWYgYW4gZXhjZXB0aW9uIG9jY3VyZWQgaW4gdGhlIEphdmEgY29kZQorICAgIHZpcnR1YWwgYm9vbCBhZGROb01lZGlhRm9sZGVyKGNvbnN0IGNoYXIqIHBhdGgpCisgICAgeworICAgICAgICBwcmludGYoImFkZE5vTWVkaWFGb2xkZXIgJXNcbiIsIHBhdGgpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICB2b2lkIHJlc2V0KCkKKyAgICB7CisgICAgICAgIG1IYXNUaXRsZSA9IGZhbHNlOworICAgICAgICBtSGFzQXJ0aXN0ID0gZmFsc2U7CisgICAgICAgIG1IYXNBbGJ1bSA9IGZhbHNlOworICAgICAgICBtSGFzQWxidW1BcnRpc3QgPSBmYWxzZTsKKyAgICAgICAgbUhhc0dlbnJlID0gZmFsc2U7CisgICAgICAgIG1IYXNDb21wb3NlciA9IGZhbHNlOworICAgICAgICBtSGFzTWltZVR5cGUgPSBmYWxzZTsKKyAgICAgICAgbVRyYWNrID0gbVllYXIgPSBtRHVyYXRpb24gPSAwOworICAgIH0KKworICAgIGlubGluZSBjb25zdCBjaGFyKiBnZXRUaXRsZSgpIGNvbnN0IHsgcmV0dXJuIG1IYXNUaXRsZSA/IChjb25zdCBjaGFyICopbVRpdGxlIDogTlVMTDsgfQorICAgIGlubGluZSBjb25zdCBjaGFyKiBnZXRBcnRpc3QoKSBjb25zdCB7IHJldHVybiBtSGFzQXJ0aXN0ID8gKGNvbnN0IGNoYXIgKiltQXJ0aXN0IDogTlVMTDsgfQorICAgIGlubGluZSBjb25zdCBjaGFyKiBnZXRBbGJ1bSgpIGNvbnN0IHsgcmV0dXJuIG1IYXNBbGJ1bSA/IChjb25zdCBjaGFyICopbUFsYnVtIDogTlVMTDsgfQorICAgIGlubGluZSBjb25zdCBjaGFyKiBnZXRBbGJ1bUFydGlzdCgpIGNvbnN0IHsgcmV0dXJuIG1IYXNBbGJ1bUFydGlzdCA/IChjb25zdCBjaGFyICopbUFsYnVtQXJ0aXN0IDogTlVMTDsgfQorICAgIGlubGluZSBjb25zdCBjaGFyKiBnZXRHZW5yZSgpIGNvbnN0IHsgcmV0dXJuIG1IYXNHZW5yZSA/IChjb25zdCBjaGFyICopbUdlbnJlIDogTlVMTDsgfQorICAgIGlubGluZSBjb25zdCBjaGFyKiBnZXRDb21wb3NlcigpIGNvbnN0IHsgcmV0dXJuIG1IYXNDb21wb3NlciA/IChjb25zdCBjaGFyICopbUNvbXBvc2VyIDogTlVMTDsgfQorICAgIGlubGluZSBjb25zdCBjaGFyKiBnZXRNaW1lVHlwZSgpIGNvbnN0IHsgcmV0dXJuIG1IYXNNaW1lVHlwZSA/IChjb25zdCBjaGFyICopbU1pbWVUeXBlIDogTlVMTDsgfQorICAgIGlubGluZSBpbnQgZ2V0VHJhY2soKSBjb25zdCB7IHJldHVybiBtVHJhY2s7IH0KKyAgICBpbmxpbmUgaW50IGdldFllYXIoKSBjb25zdCB7IHJldHVybiBtWWVhcjsgfQorICAgIGlubGluZSBpbnQgZ2V0RHVyYXRpb24oKSBjb25zdCB7IHJldHVybiBtRHVyYXRpb247IH0KKworcHJpdmF0ZToKKyAgICBNdHBTdHJpbmcgICBtVGl0bGU7CisgICAgTXRwU3RyaW5nICAgbUFydGlzdDsKKyAgICBNdHBTdHJpbmcgICBtQWxidW07CisgICAgTXRwU3RyaW5nICAgbUFsYnVtQXJ0aXN0OworICAgIE10cFN0cmluZyAgIG1HZW5yZTsKKyAgICBNdHBTdHJpbmcgICBtQ29tcG9zZXI7CisgICAgTXRwU3RyaW5nICAgbU1pbWVUeXBlOworCisgICAgYm9vbCAgICAgICAgbUhhc1RpdGxlOworICAgIGJvb2wgICAgICAgIG1IYXNBcnRpc3Q7CisgICAgYm9vbCAgICAgICAgbUhhc0FsYnVtOworICAgIGJvb2wgICAgICAgIG1IYXNBbGJ1bUFydGlzdDsKKyAgICBib29sICAgICAgICBtSGFzR2VucmU7CisgICAgYm9vbCAgICAgICAgbUhhc0NvbXBvc2VyOworICAgIGJvb2wgICAgICAgIG1IYXNNaW1lVHlwZTsKKworICAgIGludCAgICAgICAgIG1UcmFjazsKKyAgICBpbnQgICAgICAgICBtWWVhcjsKKyAgICBpbnQgICAgICAgICBtRHVyYXRpb247Cit9OworCisKK010cE1lZGlhU2Nhbm5lcjo6TXRwTWVkaWFTY2FubmVyKE10cFN0b3JhZ2VJRCBpZCwgY29uc3QgY2hhciogZmlsZVBhdGgsIE10cERhdGFiYXNlKiBkYikKKyAgICA6ICAgbVN0b3JhZ2VJRChpZCksCisgICAgICAgIG1GaWxlUGF0aChmaWxlUGF0aCksCisgICAgICAgIG1EYXRhYmFzZShkYiksCisgICAgICAgIG1NZWRpYVNjYW5uZXIoTlVMTCksCisgICAgICAgIG1NZWRpYVNjYW5uZXJDbGllbnQoTlVMTCksCisgICAgICAgIG1GaWxlTGlzdChOVUxMKSwKKyAgICAgICAgbUZpbGVDb3VudCgwKQoreworICAgIG1NZWRpYVNjYW5uZXIgPSBuZXcgU3RhZ2VmcmlnaHRNZWRpYVNjYW5uZXI7CisgICAgbU1lZGlhU2Nhbm5lckNsaWVudCA9IG5ldyBNdHBNZWRpYVNjYW5uZXJDbGllbnQ7Cit9CisKK010cE1lZGlhU2Nhbm5lcjo6fk10cE1lZGlhU2Nhbm5lcigpIHsKK30KKworYm9vbCBNdHBNZWRpYVNjYW5uZXI6OnNjYW5GaWxlcygpIHsKKyAgICBtRGF0YWJhc2UtPmJlZ2luVHJhbnNhY3Rpb24oKTsKKyAgICBtRmlsZUNvdW50ID0gMDsKKyAgICBtRmlsZUxpc3QgPSBtRGF0YWJhc2UtPmdldEZpbGVMaXN0KG1GaWxlQ291bnQpOworCisgICAgaW50IHJldCA9IHNjYW5EaXJlY3RvcnkobUZpbGVQYXRoLCBNVFBfUEFSRU5UX1JPT1QpOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtRmlsZUNvdW50OyBpKyspIHsKKyAgICAgICAgTXRwT2JqZWN0SGFuZGxlIHRlc3QgPSBtRmlsZUxpc3RbaV07CisgICAgICAgIGlmICghICh0ZXN0ICYga09iamVjdEhhbmRsZU1hcmtCaXQpKSB7CisgICAgICAgICAgICBwcmludGYoImRlbGV0ZSBtaXNzaW5nIGZpbGUgJTA4WFxuIiwgdGVzdCk7CisgICAgICAgICAgICBtRGF0YWJhc2UtPmRlbGV0ZUZpbGUodGVzdCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBkZWxldGVbXSBtRmlsZUxpc3Q7CisgICAgbUZpbGVDb3VudCA9IDA7CisgICAgbURhdGFiYXNlLT5jb21taXRUcmFuc2FjdGlvbigpOworICAgIHJldHVybiAocmV0ID09IDApOworfQorCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgTWVkaWFGaWxlVHlwZUVudHJ5Cit7CisgICAgY29uc3QgY2hhciogICAgIGV4dGVuc2lvbjsKKyAgICBNdHBPYmplY3RGb3JtYXQgZm9ybWF0OworICAgIHVpbnQzMl90ICAgICAgICB0YWJsZTsKK30gc0ZpbGVUeXBlc1tdID0KK3sKKyAgICB7ICJNUDMiLCAgICBNVFBfRk9STUFUX01QMywgICAgICAgICAgICAga09iamVjdEhhbmRsZVRhYmxlQXVkaW8gICAgIH0sCisgICAgeyAiTTRBIiwgICAgTVRQX0ZPUk1BVF9VTkRFRklORURfQVVESU8sIGtPYmplY3RIYW5kbGVUYWJsZUF1ZGlvICAgICB9LAorICAgIHsgIldBViIsICAgIE1UUF9GT1JNQVRfV0FWLCAgICAgICAgICAgICBrT2JqZWN0SGFuZGxlVGFibGVBdWRpbyAgICAgfSwKKyAgICB7ICJBTVIiLCAgICBNVFBfRk9STUFUX1VOREVGSU5FRF9BVURJTywga09iamVjdEhhbmRsZVRhYmxlQXVkaW8gICAgIH0sCisgICAgeyAiQVdCIiwgICAgTVRQX0ZPUk1BVF9VTkRFRklORURfQVVESU8sIGtPYmplY3RIYW5kbGVUYWJsZUF1ZGlvICAgICB9LAorICAgIHsgIldNQSIsICAgIE1UUF9GT1JNQVRfV01BLCAgICAgICAgICAgICBrT2JqZWN0SGFuZGxlVGFibGVBdWRpbyAgICAgfSwKKyAgICB7ICJPR0ciLCAgICBNVFBfRk9STUFUX09HRywgICAgICAgICAgICAga09iamVjdEhhbmRsZVRhYmxlQXVkaW8gICAgIH0sCisgICAgeyAiT0dBIiwgICAgTVRQX0ZPUk1BVF9VTkRFRklORURfQVVESU8sIGtPYmplY3RIYW5kbGVUYWJsZUF1ZGlvICAgICB9LAorICAgIHsgIkFBQyIsICAgIE1UUF9GT1JNQVRfQUFDLCAgICAgICAgICAgICBrT2JqZWN0SGFuZGxlVGFibGVBdWRpbyAgICAgfSwKKyAgICB7ICJNSUQiLCAgICBNVFBfRk9STUFUX1VOREVGSU5FRF9BVURJTywga09iamVjdEhhbmRsZVRhYmxlQXVkaW8gICAgIH0sCisgICAgeyAiTUlESSIsICAgTVRQX0ZPUk1BVF9VTkRFRklORURfQVVESU8sIGtPYmplY3RIYW5kbGVUYWJsZUF1ZGlvICAgICB9LAorICAgIHsgIlhNRiIsICAgIE1UUF9GT1JNQVRfVU5ERUZJTkVEX0FVRElPLCBrT2JqZWN0SGFuZGxlVGFibGVBdWRpbyAgICAgfSwKKyAgICB7ICJSVFRUTCIsICBNVFBfRk9STUFUX1VOREVGSU5FRF9BVURJTywga09iamVjdEhhbmRsZVRhYmxlQXVkaW8gICAgIH0sCisgICAgeyAiU01GIiwgICAgTVRQX0ZPUk1BVF9VTkRFRklORURfQVVESU8sIGtPYmplY3RIYW5kbGVUYWJsZUF1ZGlvICAgICB9LAorICAgIHsgIklNWSIsICAgIE1UUF9GT1JNQVRfVU5ERUZJTkVEX0FVRElPLCBrT2JqZWN0SGFuZGxlVGFibGVBdWRpbyAgICAgfSwKKyAgICB7ICJSVFgiLCAgICBNVFBfRk9STUFUX1VOREVGSU5FRF9BVURJTywga09iamVjdEhhbmRsZVRhYmxlQXVkaW8gICAgIH0sCisgICAgeyAiT1RBIiwgICAgTVRQX0ZPUk1BVF9VTkRFRklORURfQVVESU8sIGtPYmplY3RIYW5kbGVUYWJsZUF1ZGlvICAgICB9LAorICAgIHsgIk1QRUciLCAgIE1UUF9GT1JNQVRfVU5ERUZJTkVEX1ZJREVPLCBrT2JqZWN0SGFuZGxlVGFibGVWaWRlbyAgICAgfSwKKyAgICB7ICJNUDQiLCAgICBNVFBfRk9STUFUX1VOREVGSU5FRF9WSURFTywga09iamVjdEhhbmRsZVRhYmxlVmlkZW8gICAgIH0sCisgICAgeyAiTTRWIiwgICAgTVRQX0ZPUk1BVF9VTkRFRklORURfVklERU8sIGtPYmplY3RIYW5kbGVUYWJsZVZpZGVvICAgICB9LAorICAgIHsgIjNHUCIsICAgIE1UUF9GT1JNQVRfVU5ERUZJTkVEX1ZJREVPLCBrT2JqZWN0SGFuZGxlVGFibGVWaWRlbyAgICAgfSwKKyAgICB7ICIzR1BQIiwgICBNVFBfRk9STUFUX1VOREVGSU5FRF9WSURFTywga09iamVjdEhhbmRsZVRhYmxlVmlkZW8gICAgIH0sCisgICAgeyAiM0cyIiwgICAgTVRQX0ZPUk1BVF9VTkRFRklORURfVklERU8sIGtPYmplY3RIYW5kbGVUYWJsZVZpZGVvICAgICB9LAorICAgIHsgIjNHUFAyIiwgIE1UUF9GT1JNQVRfVU5ERUZJTkVEX1ZJREVPLCBrT2JqZWN0SGFuZGxlVGFibGVWaWRlbyAgICAgfSwKKyAgICB7ICJXTVYiLCAgICBNVFBfRk9STUFUX1VOREVGSU5FRF9WSURFTywga09iamVjdEhhbmRsZVRhYmxlVmlkZW8gICAgIH0sCisgICAgeyAiQVNGIiwgICAgTVRQX0ZPUk1BVF9VTkRFRklORURfVklERU8sIGtPYmplY3RIYW5kbGVUYWJsZVZpZGVvICAgICB9LAorICAgIHsgIkpQRyIsICAgIE1UUF9GT1JNQVRfRVhJRl9KUEVHLCAgICAgICBrT2JqZWN0SGFuZGxlVGFibGVJbWFnZSAgICAgfSwKKyAgICB7ICJKUEVHIiwgICBNVFBfRk9STUFUX0VYSUZfSlBFRywgICAgICAga09iamVjdEhhbmRsZVRhYmxlSW1hZ2UgICAgIH0sCisgICAgeyAiR0lGIiwgICAgTVRQX0ZPUk1BVF9HSUYsICAgICAgICAgICAgIGtPYmplY3RIYW5kbGVUYWJsZUltYWdlICAgICB9LAorICAgIHsgIlBORyIsICAgIE1UUF9GT1JNQVRfUE5HLCAgICAgICAgICAgICBrT2JqZWN0SGFuZGxlVGFibGVJbWFnZSAgICAgfSwKKyAgICB7ICJCTVAiLCAgICBNVFBfRk9STUFUX0JNUCwgICAgICAgICAgICAga09iamVjdEhhbmRsZVRhYmxlSW1hZ2UgICAgIH0sCisgICAgeyAiV0JNUCIsICAgTVRQX0ZPUk1BVF9CTVAsICAgICAgICAgICAgIGtPYmplY3RIYW5kbGVUYWJsZUltYWdlICAgICB9LAorICAgIHsgIk0zVSIsICAgIE1UUF9GT1JNQVRfTTNVX1BMQVlMSVNULCAgICBrT2JqZWN0SGFuZGxlVGFibGVQbGF5bGlzdCAgfSwKKyAgICB7ICJQTFMiLCAgICBNVFBfRk9STUFUX1BMU19QTEFZTElTVCwgICAga09iamVjdEhhbmRsZVRhYmxlUGxheWxpc3QgIH0sCisgICAgeyAiV1BMIiwgICAgTVRQX0ZPUk1BVF9XUExfUExBWUxJU1QsICAgIGtPYmplY3RIYW5kbGVUYWJsZVBsYXlsaXN0ICB9LAorfTsKKworTXRwT2JqZWN0Rm9ybWF0IE10cE1lZGlhU2Nhbm5lcjo6Z2V0RmlsZUZvcm1hdChjb25zdCBjaGFyKiBwYXRoLCB1aW50MzJfdCYgdGFibGUpCit7CisgICAgY29uc3QgY2hhciogZXh0ZW5zaW9uID0gc3RycmNocihwYXRoLCAnLicpOworICAgIGlmICghZXh0ZW5zaW9uKQorICAgICAgICByZXR1cm4gTVRQX0ZPUk1BVF9VTkRFRklORUQ7CisgICAgZXh0ZW5zaW9uKys7IC8vIHNraXAgdGhlIGRvdAorCisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHNpemVvZihzRmlsZVR5cGVzKSAvIHNpemVvZihzRmlsZVR5cGVzWzBdKTsgaSsrKSB7CisgICAgICAgIGlmICghc3RyY2FzZWNtcChleHRlbnNpb24sIHNGaWxlVHlwZXNbaV0uZXh0ZW5zaW9uKSkgeworICAgICAgICAgICAgdGFibGUgPSBzRmlsZVR5cGVzW2ldLnRhYmxlOworICAgICAgICAgICAgcmV0dXJuIHNGaWxlVHlwZXNbaV0uZm9ybWF0OworICAgICAgICB9CisgICAgfQorICAgIHRhYmxlID0ga09iamVjdEhhbmRsZVRhYmxlRmlsZTsKKyAgICByZXR1cm4gTVRQX0ZPUk1BVF9VTkRFRklORUQ7Cit9CisKK2ludCBNdHBNZWRpYVNjYW5uZXI6OnNjYW5EaXJlY3RvcnkoY29uc3QgY2hhciogcGF0aCwgTXRwT2JqZWN0SGFuZGxlIHBhcmVudCkKK3sKKyAgICBjaGFyIGJ1ZmZlcltQQVRIX01BWF07CisgICAgc3RydWN0IGRpcmVudCogZW50cnk7CisKKyAgICB1bnNpZ25lZCBsZW5ndGggPSBzdHJsZW4ocGF0aCk7CisgICAgaWYgKGxlbmd0aCA+IHNpemVvZihidWZmZXIpICsgMikgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInBhdGggdG9vIGxvbmc6ICVzXG4iLCBwYXRoKTsKKyAgICB9CisKKyAgICBESVIqIGRpciA9IG9wZW5kaXIocGF0aCk7CisgICAgaWYgKCFkaXIpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJvcGVuZGlyICVzIGZhaWxlZCwgZXJybm86ICVkIiwgcGF0aCwgZXJybm8pOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgc3RybmNweShidWZmZXIsIHBhdGgsIHNpemVvZihidWZmZXIpKTsKKyAgICBjaGFyKiBmaWxlU3RhcnQgPSBidWZmZXIgKyBsZW5ndGg7CisgICAgLy8gbWFrZSBzdXJlIHdlIGhhdmUgYSB0cmFpbGluZyBzbGFzaAorICAgIGlmIChmaWxlU3RhcnRbLTFdICE9ICcvJykgeworICAgICAgICAqKGZpbGVTdGFydCsrKSA9ICcvJzsKKyAgICB9CisgICAgaW50IGZpbGVOYW1lTGVuZ3RoID0gc2l6ZW9mKGJ1ZmZlcikgKyBmaWxlU3RhcnQgLSBidWZmZXI7CisKKyAgICB3aGlsZSAoKGVudHJ5ID0gcmVhZGRpcihkaXIpKSkgeworICAgICAgICBjb25zdCBjaGFyKiBuYW1lID0gZW50cnktPmRfbmFtZTsKKworICAgICAgICAvLyBpZ25vcmUgIi4iIGFuZCAiLi4iLCBhcyB3ZWxsIGFzIGFueSBmaWxlcyBvciBkaXJlY3RvcmllcyBzdGFyaW5nIHdpdGggZG90CisgICAgICAgIGlmIChuYW1lWzBdID09ICcuJykgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0cmxlbihuYW1lKSArIDEgPiBmaWxlTmFtZUxlbmd0aCkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJwYXRoIHRvbyBsb25nIGZvciAlc1xuIiwgbmFtZSk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBzdHJjcHkoZmlsZVN0YXJ0LCBuYW1lKTsKKworICAgICAgICBzdHJ1Y3Qgc3RhdCBzdGF0YnVmOworICAgICAgICBtZW1zZXQoJnN0YXRidWYsIDAsIHNpemVvZihzdGF0YnVmKSk7CisgICAgICAgIHN0YXQoYnVmZmVyLCAmc3RhdGJ1Zik7CisKKyAgICAgICAgaWYgKFNfSVNESVIoc3RhdGJ1Zi5zdF9tb2RlKSkgeworICAgICAgICAgICAgTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSA9IG1EYXRhYmFzZS0+Z2V0T2JqZWN0SGFuZGxlKGJ1ZmZlcik7CisgICAgICAgICAgICBpZiAoaGFuZGxlKSB7CisgICAgICAgICAgICAgICAgbWFya0ZpbGUoaGFuZGxlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaGFuZGxlID0gbURhdGFiYXNlLT5hZGRGaWxlKGJ1ZmZlciwgTVRQX0ZPUk1BVF9BU1NPQ0lBVElPTiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudCwgbVN0b3JhZ2VJRCwgMCwgc3RhdGJ1Zi5zdF9tdGltZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzY2FuRGlyZWN0b3J5KGJ1ZmZlciwgaGFuZGxlKTsKKyAgICAgICAgfSBlbHNlIGlmIChTX0lTUkVHKHN0YXRidWYuc3RfbW9kZSkpIHsKKyAgICAgICAgICAgIHNjYW5GaWxlKGJ1ZmZlciwgcGFyZW50LCBzdGF0YnVmKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsb3NlZGlyKGRpcik7CisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgTXRwTWVkaWFTY2FubmVyOjpzY2FuRmlsZShjb25zdCBjaGFyKiBwYXRoLCBNdHBPYmplY3RIYW5kbGUgcGFyZW50LCBzdHJ1Y3Qgc3RhdCYgc3RhdGJ1ZikgeworICAgIHVpbnQzMl90IHRhYmxlOworICAgIE10cE9iamVjdEZvcm1hdCBmb3JtYXQgPSBnZXRGaWxlRm9ybWF0KHBhdGgsIHRhYmxlKTsKKyAgICAvLyBkb24ndCBzY2FuIHVua25vd24gZmlsZSB0eXBlcworICAgIGlmIChmb3JtYXQgPT0gTVRQX0ZPUk1BVF9VTkRFRklORUQpCisgICAgICAgIHJldHVybjsKKyAgICBNdHBPYmplY3RIYW5kbGUgaGFuZGxlID0gbURhdGFiYXNlLT5nZXRPYmplY3RIYW5kbGUocGF0aCk7CisgICAgLy8gZml4bWUgLSByZXNjYW4gaWYgbW9kIGRhdGUgY2hhbmdlZAorICAgIGlmIChoYW5kbGUpIHsKKyAgICAgICAgbWFya0ZpbGUoaGFuZGxlKTsKKyAgICB9IGVsc2UgeworICAgICAgICBtRGF0YWJhc2UtPmJlZ2luVHJhbnNhY3Rpb24oKTsKKyAgICAgICAgaGFuZGxlID0gbURhdGFiYXNlLT5hZGRGaWxlKHBhdGgsIGZvcm1hdCwgcGFyZW50LCBtU3RvcmFnZUlELAorICAgICAgICAgICAgICAgIHN0YXRidWYuc3Rfc2l6ZSwgc3RhdGJ1Zi5zdF9tdGltZSk7CisgICAgICAgIGlmIChoYW5kbGUgPD0gMCkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJhZGRGaWxlIGZhaWxlZCBpbiBNdHBNZWRpYVNjYW5uZXI6OnNjYW5GaWxlKClcbiIpOworICAgICAgICAgICAgbURhdGFiYXNlLT5yb2xsYmFja1RyYW5zYWN0aW9uKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAodGFibGUgPT0ga09iamVjdEhhbmRsZVRhYmxlQXVkaW8pIHsKKyAgICAgICAgICAgIG1NZWRpYVNjYW5uZXJDbGllbnQtPnJlc2V0KCk7CisgICAgICAgICAgICBtTWVkaWFTY2FubmVyLT5wcm9jZXNzRmlsZShwYXRoLCBOVUxMLCAqbU1lZGlhU2Nhbm5lckNsaWVudCk7CisgICAgICAgICAgICBoYW5kbGUgPSBtRGF0YWJhc2UtPmFkZEF1ZGlvRmlsZShoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgIG1NZWRpYVNjYW5uZXJDbGllbnQtPmdldFRpdGxlKCksCisgICAgICAgICAgICAgICAgICAgIG1NZWRpYVNjYW5uZXJDbGllbnQtPmdldEFydGlzdCgpLAorICAgICAgICAgICAgICAgICAgICBtTWVkaWFTY2FubmVyQ2xpZW50LT5nZXRBbGJ1bSgpLAorICAgICAgICAgICAgICAgICAgICBtTWVkaWFTY2FubmVyQ2xpZW50LT5nZXRBbGJ1bUFydGlzdCgpLAorICAgICAgICAgICAgICAgICAgICBtTWVkaWFTY2FubmVyQ2xpZW50LT5nZXRHZW5yZSgpLAorICAgICAgICAgICAgICAgICAgICBtTWVkaWFTY2FubmVyQ2xpZW50LT5nZXRDb21wb3NlcigpLAorICAgICAgICAgICAgICAgICAgICBtTWVkaWFTY2FubmVyQ2xpZW50LT5nZXRNaW1lVHlwZSgpLAorICAgICAgICAgICAgICAgICAgICBtTWVkaWFTY2FubmVyQ2xpZW50LT5nZXRUcmFjaygpLAorICAgICAgICAgICAgICAgICAgICBtTWVkaWFTY2FubmVyQ2xpZW50LT5nZXRZZWFyKCksCisgICAgICAgICAgICAgICAgICAgIG1NZWRpYVNjYW5uZXJDbGllbnQtPmdldER1cmF0aW9uKCkpOworICAgICAgICB9CisgICAgICAgIG1EYXRhYmFzZS0+Y29tbWl0VHJhbnNhY3Rpb24oKTsKKyAgICB9Cit9CisKK3ZvaWQgTXRwTWVkaWFTY2FubmVyOjptYXJrRmlsZShNdHBPYmplY3RIYW5kbGUgaGFuZGxlKSB7CisgICAgaWYgKG1GaWxlTGlzdCkgeworICAgICAgICBoYW5kbGUgJj0ga09iamVjdEhhbmRsZUluZGV4TWFzazsKKyAgICAgICAgLy8gYmluYXJ5IHNlYXJjaCBmb3IgdGhlIGZpbGUgaW4gbUZpbGVMaXN0CisgICAgICAgIGludCBsb3cgPSAwOworICAgICAgICBpbnQgaGlnaCA9IG1GaWxlQ291bnQ7CisgICAgICAgIGludCBpbmRleDsKKworICAgICAgICB3aGlsZSAobG93IDwgaGlnaCkgeworICAgICAgICAgICAgaW5kZXggPSAobG93ICsgaGlnaCkgPj4gMTsKKyAgICAgICAgICAgIE10cE9iamVjdEhhbmRsZSB0ZXN0ID0gKG1GaWxlTGlzdFtpbmRleF0gJiBrT2JqZWN0SGFuZGxlSW5kZXhNYXNrKTsKKyAgICAgICAgICAgIGlmIChoYW5kbGUgPCB0ZXN0KQorICAgICAgICAgICAgICAgIGhpZ2ggPSBpbmRleDsgICAgICAgLy8gaXRlbSBpcyBsZXNzIHRoYW4gaW5kZXgKKyAgICAgICAgICAgIGVsc2UgaWYgKGhhbmRsZSA+IHRlc3QpCisgICAgICAgICAgICAgICAgbG93ID0gaW5kZXggKyAxOyAgICAvLyBpdGVtIGlzIGdyZWF0ZXIgdGhhbiBpbmRleAorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgbUZpbGVMaXN0W2luZGV4XSB8PSBrT2JqZWN0SGFuZGxlTWFya0JpdDsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJmaWxlICVkIG5vdCBmb3VuZCBpbiBtRmlsZUxpc3RcbiIsIGhhbmRsZSk7CisgICAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cE1lZGlhU2Nhbm5lci5oIGIvbWVkaWEvbXRwL010cE1lZGlhU2Nhbm5lci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzZDUwNjMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdHAvTXRwTWVkaWFTY2FubmVyLmgKQEAgLTAsMCArMSw1NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX01UUF9NRURJQV9TQ0FOTkVSX0gKKyNkZWZpbmUgX01UUF9NRURJQV9TQ0FOTkVSX0gKKworc3RydWN0IHN0YXQ7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgTXRwRGF0YWJhc2U7CitjbGFzcyBTcWxpdGVTdGF0ZW1lbnQ7CitjbGFzcyBNZWRpYVNjYW5uZXI7CitjbGFzcyBNdHBNZWRpYVNjYW5uZXJDbGllbnQ7CisKK2NsYXNzIE10cE1lZGlhU2Nhbm5lciB7Citwcml2YXRlOgorICAgIE10cFN0b3JhZ2VJRCAgICAgICAgICAgIG1TdG9yYWdlSUQ7CisgICAgY29uc3QgY2hhciogICAgICAgICAgICAgbUZpbGVQYXRoOworICAgIE10cERhdGFiYXNlKiAgICAgICAgICAgIG1EYXRhYmFzZTsKKyAgICBNZWRpYVNjYW5uZXIqICAgICAgICAgICBtTWVkaWFTY2FubmVyOworICAgIE10cE1lZGlhU2Nhbm5lckNsaWVudCogIG1NZWRpYVNjYW5uZXJDbGllbnQ7CisKKyAgICAvLyBmb3IgZ2FyYmFnZSBjb2xsZWN0aW5nIG1pc3NpbmcgZmlsZXMKKyAgICBNdHBPYmplY3RIYW5kbGUqICAgICAgICBtRmlsZUxpc3Q7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgbUZpbGVDb3VudDsKKworcHVibGljOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cE1lZGlhU2Nhbm5lcihNdHBTdG9yYWdlSUQgaWQsIGNvbnN0IGNoYXIqIGZpbGVQYXRoLCBNdHBEYXRhYmFzZSogZGIpOworICAgIHZpcnR1YWwgICAgICAgICAgICAgICAgIH5NdHBNZWRpYVNjYW5uZXIoKTsKKworICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIHNjYW5GaWxlcygpOworCitwcml2YXRlOgorICAgIE10cE9iamVjdEZvcm1hdCAgICAgICAgIGdldEZpbGVGb3JtYXQoY29uc3QgY2hhciogcGF0aCwgdWludDMyX3QmIHRhYmxlKTsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICBzY2FuRGlyZWN0b3J5KGNvbnN0IGNoYXIqIHBhdGgsIE10cE9iamVjdEhhbmRsZSBwYXJlbnQpOworICAgIHZvaWQgICAgICAgICAgICAgICAgICAgIHNjYW5GaWxlKGNvbnN0IGNoYXIqIHBhdGgsIE10cE9iamVjdEhhbmRsZSBwYXJlbnQsIHN0cnVjdCBzdGF0JiBzdGF0YnVmKTsKKyAgICB2b2lkICAgICAgICAgICAgICAgICAgICBtYXJrRmlsZShNdHBPYmplY3RIYW5kbGUgaGFuZGxlKTsKK307CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBfTVRQX01FRElBX1NDQU5ORVJfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cE9iamVjdEluZm8uY3BwIGIvbWVkaWEvbXRwL010cE9iamVjdEluZm8uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlMGY1NGEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdHAvTXRwT2JqZWN0SW5mby5jcHAKQEAgLTAsMCArMSwxMDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIk10cE9iamVjdEluZm8iCisjaW5jbHVkZSAidXRpbHMvTG9nLmgiCisKKyNpbmNsdWRlICJNdHBEYXRhUGFja2V0LmgiCisjaW5jbHVkZSAiTXRwT2JqZWN0SW5mby5oIgorI2luY2x1ZGUgIk10cFN0cmluZ0J1ZmZlci5oIgorI2luY2x1ZGUgIk10cFV0aWxzLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworTXRwT2JqZWN0SW5mbzo6TXRwT2JqZWN0SW5mbyhNdHBPYmplY3RIYW5kbGUgaGFuZGxlKQorICAgIDogICBtSGFuZGxlKGhhbmRsZSksCisgICAgICAgIG1TdG9yYWdlSUQoMCksCisgICAgICAgIG1Gb3JtYXQoMCksCisgICAgICAgIG1Qcm90ZWN0aW9uU3RhdHVzKDApLAorICAgICAgICBtQ29tcHJlc3NlZFNpemUoMCksCisgICAgICAgIG1UaHVtYkZvcm1hdCgwKSwKKyAgICAgICAgbVRodW1iQ29tcHJlc3NlZFNpemUoMCksCisgICAgICAgIG1UaHVtYlBpeFdpZHRoKDApLAorICAgICAgICBtVGh1bWJQaXhIZWlnaHQoMCksCisgICAgICAgIG1JbWFnZVBpeFdpZHRoKDApLAorICAgICAgICBtSW1hZ2VQaXhIZWlnaHQoMCksCisgICAgICAgIG1JbWFnZVBpeERlcHRoKDApLAorICAgICAgICBtUGFyZW50KDApLAorICAgICAgICBtQXNzb2NpYXRpb25UeXBlKDApLAorICAgICAgICBtQXNzb2NpYXRpb25EZXNjKDApLAorICAgICAgICBtU2VxdWVuY2VOdW1iZXIoMCksCisgICAgICAgIG1OYW1lKE5VTEwpLAorICAgICAgICBtRGF0ZUNyZWF0ZWQoMCksCisgICAgICAgIG1EYXRlTW9kaWZpZWQoMCksCisgICAgICAgIG1LZXl3b3JkcyhOVUxMKQoreworfQorCitNdHBPYmplY3RJbmZvOjp+TXRwT2JqZWN0SW5mbygpIHsKKyAgICBpZiAobU5hbWUpCisgICAgICAgIGZyZWUobU5hbWUpOworICAgIGlmIChtS2V5d29yZHMpCisgICAgICAgIGZyZWUobUtleXdvcmRzKTsKK30KKwordm9pZCBNdHBPYmplY3RJbmZvOjpyZWFkKE10cERhdGFQYWNrZXQmIHBhY2tldCkgeworICAgIE10cFN0cmluZ0J1ZmZlciBzdHJpbmc7CisgICAgdGltZV90IHRpbWU7CisKKyAgICBtU3RvcmFnZUlEID0gcGFja2V0LmdldFVJbnQzMigpOworICAgIG1Gb3JtYXQgPSBwYWNrZXQuZ2V0VUludDE2KCk7CisgICAgbVByb3RlY3Rpb25TdGF0dXMgPSBwYWNrZXQuZ2V0VUludDE2KCk7CisgICAgbUNvbXByZXNzZWRTaXplID0gcGFja2V0LmdldFVJbnQzMigpOworICAgIG1UaHVtYkZvcm1hdCA9IHBhY2tldC5nZXRVSW50MTYoKTsKKyAgICBtVGh1bWJDb21wcmVzc2VkU2l6ZSA9IHBhY2tldC5nZXRVSW50MzIoKTsKKyAgICBtVGh1bWJQaXhXaWR0aCA9IHBhY2tldC5nZXRVSW50MzIoKTsKKyAgICBtVGh1bWJQaXhIZWlnaHQgPSBwYWNrZXQuZ2V0VUludDMyKCk7CisgICAgbUltYWdlUGl4V2lkdGggPSBwYWNrZXQuZ2V0VUludDMyKCk7CisgICAgbUltYWdlUGl4SGVpZ2h0ID0gcGFja2V0LmdldFVJbnQzMigpOworICAgIG1JbWFnZVBpeERlcHRoID0gcGFja2V0LmdldFVJbnQzMigpOworICAgIG1QYXJlbnQgPSBwYWNrZXQuZ2V0VUludDMyKCk7CisgICAgbUFzc29jaWF0aW9uVHlwZSA9IHBhY2tldC5nZXRVSW50MTYoKTsKKyAgICBtQXNzb2NpYXRpb25EZXNjID0gcGFja2V0LmdldFVJbnQzMigpOworICAgIG1TZXF1ZW5jZU51bWJlciA9IHBhY2tldC5nZXRVSW50MzIoKTsKKworICAgIHBhY2tldC5nZXRTdHJpbmcoc3RyaW5nKTsKKyAgICBtTmFtZSA9IHN0cmR1cCgoY29uc3QgY2hhciAqKXN0cmluZyk7CisKKyAgICBwYWNrZXQuZ2V0U3RyaW5nKHN0cmluZyk7CisgICAgaWYgKHBhcnNlRGF0ZVRpbWUoKGNvbnN0IGNoYXIqKXN0cmluZywgdGltZSkpCisgICAgICAgIG1EYXRlQ3JlYXRlZCA9IHRpbWU7CisKKyAgICBwYWNrZXQuZ2V0U3RyaW5nKHN0cmluZyk7CisgICAgaWYgKHBhcnNlRGF0ZVRpbWUoKGNvbnN0IGNoYXIqKXN0cmluZywgdGltZSkpCisgICAgICAgIG1EYXRlTW9kaWZpZWQgPSB0aW1lOworCisgICAgcGFja2V0LmdldFN0cmluZyhzdHJpbmcpOworICAgIG1LZXl3b3JkcyA9IHN0cmR1cCgoY29uc3QgY2hhciAqKXN0cmluZyk7Cit9CisKK3ZvaWQgTXRwT2JqZWN0SW5mbzo6cHJpbnQoKSB7CisgICAgTE9HRCgiTXRwT2JqZWN0IEluZm8gJTA4WDogJXNcbiIsIG1IYW5kbGUsIG1OYW1lKTsKKyAgICBMT0dEKCIgIG1TdG9yYWdlSUQ6ICUwOFggbUZvcm1hdDogJTA0WCBtUHJvdGVjdGlvblN0YXR1czogJWRcbiIsCisgICAgICAgICAgICBtU3RvcmFnZUlELCBtRm9ybWF0LCBtUHJvdGVjdGlvblN0YXR1cyk7CisgICAgTE9HRCgiICBtQ29tcHJlc3NlZFNpemU6ICVkIG1UaHVtYkZvcm1hdDogJTA0WCBtVGh1bWJDb21wcmVzc2VkU2l6ZTogJWRcbiIsCisgICAgICAgICAgICBtQ29tcHJlc3NlZFNpemUsIG1Gb3JtYXQsIG1UaHVtYkNvbXByZXNzZWRTaXplKTsKKyAgICBMT0dEKCIgIG1UaHVtYlBpeFdpZHRoOiAlZCBtVGh1bWJQaXhIZWlnaHQ6ICVkXG4iLCBtVGh1bWJQaXhXaWR0aCwgbVRodW1iUGl4SGVpZ2h0KTsKKyAgICBMT0dEKCIgIG1JbWFnZVBpeFdpZHRoOiAlZCBtSW1hZ2VQaXhIZWlnaHQ6ICVkIG1JbWFnZVBpeERlcHRoOiAlZFxuIiwKKyAgICAgICAgICAgIG1JbWFnZVBpeFdpZHRoLCBtSW1hZ2VQaXhIZWlnaHQsIG1JbWFnZVBpeERlcHRoKTsKKyAgICBMT0dEKCIgIG1QYXJlbnQ6ICUwOFggbUFzc29jaWF0aW9uVHlwZTogJTA0WCBtQXNzb2NpYXRpb25EZXNjOiAlMDRYXG4iLAorICAgICAgICAgICAgbVBhcmVudCwgbUFzc29jaWF0aW9uVHlwZSwgbUFzc29jaWF0aW9uRGVzYyk7CisgICAgTE9HRCgiICBtU2VxdWVuY2VOdW1iZXI6ICVkIG1EYXRlQ3JlYXRlZDogJWQgbURhdGVNb2RpZmllZDogJWQgbUtleXdvcmRzOiAlc1xuIiwKKyAgICAgICAgICAgIG1TZXF1ZW5jZU51bWJlciwgbURhdGVDcmVhdGVkLCBtRGF0ZU1vZGlmaWVkLCBtS2V5d29yZHMpOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cE9iamVjdEluZm8uaCBiL21lZGlhL210cC9NdHBPYmplY3RJbmZvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzdhNDQ5Y2EKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdHAvTXRwT2JqZWN0SW5mby5oCkBAIC0wLDAgKzEsNjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9NVFBfT0JKRUNUX0lORk9fSAorI2RlZmluZSBfTVRQX09CSkVDVF9JTkZPX0gKKworI2luY2x1ZGUgIk10cFR5cGVzLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgTXRwRGF0YVBhY2tldDsKKworY2xhc3MgTXRwT2JqZWN0SW5mbyB7CitwdWJsaWM6CisgICAgTXRwT2JqZWN0SGFuZGxlICAgICBtSGFuZGxlOworICAgIE10cFN0b3JhZ2VJRCAgICAgICAgbVN0b3JhZ2VJRDsKKyAgICBNdHBPYmplY3RGb3JtYXQgICAgIG1Gb3JtYXQ7CisgICAgdWludDE2X3QgICAgICAgICAgICBtUHJvdGVjdGlvblN0YXR1czsKKyAgICB1aW50MzJfdCAgICAgICAgICAgIG1Db21wcmVzc2VkU2l6ZTsKKyAgICBNdHBPYmplY3RGb3JtYXQgICAgIG1UaHVtYkZvcm1hdDsKKyAgICB1aW50MzJfdCAgICAgICAgICAgIG1UaHVtYkNvbXByZXNzZWRTaXplOworICAgIHVpbnQzMl90ICAgICAgICAgICAgbVRodW1iUGl4V2lkdGg7CisgICAgdWludDMyX3QgICAgICAgICAgICBtVGh1bWJQaXhIZWlnaHQ7CisgICAgdWludDMyX3QgICAgICAgICAgICBtSW1hZ2VQaXhXaWR0aDsKKyAgICB1aW50MzJfdCAgICAgICAgICAgIG1JbWFnZVBpeEhlaWdodDsKKyAgICB1aW50MzJfdCAgICAgICAgICAgIG1JbWFnZVBpeERlcHRoOworICAgIE10cE9iamVjdEhhbmRsZSAgICAgbVBhcmVudDsKKyAgICB1aW50MTZfdCAgICAgICAgICAgIG1Bc3NvY2lhdGlvblR5cGU7CisgICAgdWludDMyX3QgICAgICAgICAgICBtQXNzb2NpYXRpb25EZXNjOworICAgIHVpbnQzMl90ICAgICAgICAgICAgbVNlcXVlbmNlTnVtYmVyOworICAgIGNoYXIqICAgICAgICAgICAgICAgbU5hbWU7CisgICAgdGltZV90ICAgICAgICAgICAgICBtRGF0ZUNyZWF0ZWQ7CisgICAgdGltZV90ICAgICAgICAgICAgICBtRGF0ZU1vZGlmaWVkOworICAgIGNoYXIqICAgICAgICAgICAgICAgbUtleXdvcmRzOworCitwdWJsaWM6CisgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RJbmZvKE10cE9iamVjdEhhbmRsZSBoYW5kbGUpOworICAgIHZpcnR1YWwgICAgICAgICAgICAgfk10cE9iamVjdEluZm8oKTsKKworICAgIHZvaWQgICAgICAgICAgICAgICAgcmVhZChNdHBEYXRhUGFja2V0JiBwYWNrZXQpOworCisgICAgdm9pZCAgICAgICAgICAgICAgICBwcmludCgpOworfTsKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIF9NVFBfT0JKRUNUX0lORk9fSApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cFBhY2tldC5jcHAgYi9tZWRpYS9tdHAvTXRwUGFja2V0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZGI2YWJiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXRwL010cFBhY2tldC5jcHAKQEAgLTAsMCArMSwxNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSA8dXNiaG9zdC91c2Job3N0Lmg+CisKKyNpbmNsdWRlICJNdHBQYWNrZXQuaCIKKyNpbmNsdWRlICJtdHAuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitNdHBQYWNrZXQ6Ok10cFBhY2tldChpbnQgYnVmZmVyU2l6ZSkKKyAgICA6ICAgbUJ1ZmZlcihOVUxMKSwKKyAgICAgICAgbUJ1ZmZlclNpemUoYnVmZmVyU2l6ZSksCisgICAgICAgIG1BbGxvY2F0aW9uSW5jcmVtZW50KGJ1ZmZlclNpemUpLAorICAgICAgICBtUGFja2V0U2l6ZSgwKQoreworICAgIG1CdWZmZXIgPSAodWludDhfdCAqKW1hbGxvYyhidWZmZXJTaXplKTsKKyAgICBpZiAoIW1CdWZmZXIpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJvdXQgb2YgbWVtb3J5IVxuIik7CisgICAgICAgIGFib3J0KCk7CisgICAgfQorfQorCitNdHBQYWNrZXQ6On5NdHBQYWNrZXQoKSB7CisgICAgaWYgKG1CdWZmZXIpCisgICAgICAgIGZyZWUobUJ1ZmZlcik7Cit9CisKK3ZvaWQgTXRwUGFja2V0OjpyZXNldCgpIHsKKyAgICBhbGxvY2F0ZShNVFBfQ09OVEFJTkVSX0hFQURFUl9TSVpFKTsKKyAgICBtUGFja2V0U2l6ZSA9IE1UUF9DT05UQUlORVJfSEVBREVSX1NJWkU7CisgICAgbWVtc2V0KG1CdWZmZXIsIDAsIG1CdWZmZXJTaXplKTsKK30KKwordm9pZCBNdHBQYWNrZXQ6OmFsbG9jYXRlKGludCBsZW5ndGgpIHsKKyAgICBpZiAobGVuZ3RoID4gbUJ1ZmZlclNpemUpIHsKKyAgICAgICAgaW50IG5ld0xlbmd0aCA9IGxlbmd0aCArIG1BbGxvY2F0aW9uSW5jcmVtZW50OworICAgICAgICBtQnVmZmVyID0gKHVpbnQ4X3QgKilyZWFsbG9jKG1CdWZmZXIsIG5ld0xlbmd0aCk7CisgICAgICAgIGlmICghbUJ1ZmZlcikgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJvdXQgb2YgbWVtb3J5IVxuIik7CisgICAgICAgICAgICBhYm9ydCgpOworICAgICAgICB9CisgICAgICAgIG1CdWZmZXJTaXplID0gbmV3TGVuZ3RoOworICAgIH0KK30KKwordm9pZCBNdHBQYWNrZXQ6OmR1bXAoKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtUGFja2V0U2l6ZTsgaSsrKSB7CisgICAgICAgIHByaW50ZigiJTAyWCAiLCBtQnVmZmVyW2ldKTsKKyAgICAgICAgaWYgKGkgJSAxNiA9PSAxNSkKKyAgICAgICAgICAgIHByaW50ZigiXG4iKTsKKyAgICB9CisgICAgcHJpbnRmKCJcblxuIik7Cit9CisKK3VpbnQxNl90IE10cFBhY2tldDo6Z2V0VUludDE2KGludCBvZmZzZXQpIGNvbnN0IHsKKyAgICByZXR1cm4gKCh1aW50MTZfdCltQnVmZmVyW29mZnNldCArIDFdIDw8IDgpIHwgKHVpbnQxNl90KW1CdWZmZXJbb2Zmc2V0XTsKK30KKwordWludDMyX3QgTXRwUGFja2V0OjpnZXRVSW50MzIoaW50IG9mZnNldCkgY29uc3QgeworICAgIHJldHVybiAoKHVpbnQzMl90KW1CdWZmZXJbb2Zmc2V0ICsgM10gPDwgMjQpIHwgKCh1aW50MzJfdCltQnVmZmVyW29mZnNldCArIDJdIDw8IDE2KSB8CisgICAgICAgICAgICgodWludDMyX3QpbUJ1ZmZlcltvZmZzZXQgKyAxXSA8PCA4KSAgfCAodWludDMyX3QpbUJ1ZmZlcltvZmZzZXRdOworfQorCit2b2lkIE10cFBhY2tldDo6cHV0VUludDE2KGludCBvZmZzZXQsIHVpbnQxNl90IHZhbHVlKSB7CisgICAgbUJ1ZmZlcltvZmZzZXQrK10gPSAodWludDhfdCkodmFsdWUgJiAweEZGKTsKKyAgICBtQnVmZmVyW29mZnNldCsrXSA9ICh1aW50OF90KSgodmFsdWUgPj4gOCkgJiAweEZGKTsKK30KKwordm9pZCBNdHBQYWNrZXQ6OnB1dFVJbnQzMihpbnQgb2Zmc2V0LCB1aW50MzJfdCB2YWx1ZSkgeworICAgIG1CdWZmZXJbb2Zmc2V0KytdID0gKHVpbnQ4X3QpKHZhbHVlICYgMHhGRik7CisgICAgbUJ1ZmZlcltvZmZzZXQrK10gPSAodWludDhfdCkoKHZhbHVlID4+IDgpICYgMHhGRik7CisgICAgbUJ1ZmZlcltvZmZzZXQrK10gPSAodWludDhfdCkoKHZhbHVlID4+IDE2KSAmIDB4RkYpOworICAgIG1CdWZmZXJbb2Zmc2V0KytdID0gKHVpbnQ4X3QpKCh2YWx1ZSA+PiAyNCkgJiAweEZGKTsKK30KKwordWludDE2X3QgTXRwUGFja2V0OjpnZXRDb250YWluZXJDb2RlKCkgY29uc3QgeworICAgIHJldHVybiBnZXRVSW50MTYoTVRQX0NPTlRBSU5FUl9DT0RFX09GRlNFVCk7Cit9CisKK3ZvaWQgTXRwUGFja2V0OjpzZXRDb250YWluZXJDb2RlKHVpbnQxNl90IGNvZGUpIHsKKyAgICBwdXRVSW50MTYoTVRQX0NPTlRBSU5FUl9DT0RFX09GRlNFVCwgY29kZSk7Cit9CisKK010cFRyYW5zYWN0aW9uSUQgTXRwUGFja2V0OjpnZXRUcmFuc2FjdGlvbklEKCkgY29uc3QgeworICAgIHJldHVybiBnZXRVSW50MzIoTVRQX0NPTlRBSU5FUl9UUkFOU0FDVElPTl9JRF9PRkZTRVQpOworfQorCit2b2lkIE10cFBhY2tldDo6c2V0VHJhbnNhY3Rpb25JRChNdHBUcmFuc2FjdGlvbklEIGlkKSB7CisgICAgcHV0VUludDMyKE1UUF9DT05UQUlORVJfVFJBTlNBQ1RJT05fSURfT0ZGU0VULCBpZCk7Cit9CisKK3VpbnQzMl90IE10cFBhY2tldDo6Z2V0UGFyYW1ldGVyKGludCBpbmRleCkgY29uc3QgeworICAgIGlmIChpbmRleCA8IDEgfHwgaW5kZXggPiA1KSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiaW5kZXggJWQgb3V0IG9mIHJhbmdlIGluIE10cFJlcXVlc3RQYWNrZXQ6OmdldFBhcmFtZXRlclxuIiwgaW5kZXgpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIGdldFVJbnQzMihNVFBfQ09OVEFJTkVSX1BBUkFNRVRFUl9PRkZTRVQgKyAoaW5kZXggLSAxKSAqIHNpemVvZih1aW50MzJfdCkpOworfQorCit2b2lkIE10cFBhY2tldDo6c2V0UGFyYW1ldGVyKGludCBpbmRleCwgdWludDMyX3QgdmFsdWUpIHsKKyAgICBpZiAoaW5kZXggPCAxIHx8IGluZGV4ID4gNSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImluZGV4ICVkIG91dCBvZiByYW5nZSBpbiBNdHBSZXNwb25zZVBhY2tldDo6c2V0UGFyYW1ldGVyXG4iLCBpbmRleCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaW50IG9mZnNldCA9IE1UUF9DT05UQUlORVJfUEFSQU1FVEVSX09GRlNFVCArIChpbmRleCAtIDEpICogc2l6ZW9mKHVpbnQzMl90KTsKKyAgICBpZiAobVBhY2tldFNpemUgPCBvZmZzZXQgKyBzaXplb2YodWludDMyX3QpKQorICAgICAgICBtUGFja2V0U2l6ZSA9IG9mZnNldCArIHNpemVvZih1aW50MzJfdCk7CisgICAgcHV0VUludDMyKG9mZnNldCwgdmFsdWUpOworfQorCisjaWZkZWYgTVRQX0hPU1QKK2ludCBNdHBQYWNrZXQ6OnRyYW5zZmVyKHN0cnVjdCB1c2JfZW5kcG9pbnQgKmVwLCB2b2lkKiBidWZmZXIsIGludCBsZW5ndGgpIHsKKyAgICBpZiAodXNiX2VuZHBvaW50X3F1ZXVlKGVwLCBidWZmZXIsIGxlbmd0aCkpIHsKKyAgICAgICAgcHJpbnRmKCJ1c2JfZW5kcG9pbnRfcXVldWUgZmFpbGVkLCBlcnJubzogJWRcbiIsIGVycm5vKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpbnQgZXBfbnVtOworICAgIHJldHVybiB1c2JfZW5kcG9pbnRfd2FpdCh1c2JfZW5kcG9pbnRfZ2V0X2RldmljZShlcCksICZlcF9udW0pOworfQorI2VuZGlmCisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwUGFja2V0LmggYi9tZWRpYS9tdHAvTXRwUGFja2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTYyNGE3MQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL210cC9NdHBQYWNrZXQuaApAQCAtMCwwICsxLDcxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfTVRQX1BBQ0tFVF9ICisjZGVmaW5lIF9NVFBfUEFDS0VUX0gKKworI2luY2x1ZGUgIk10cFR5cGVzLmgiCisKK3N0cnVjdCB1c2JfZW5kcG9pbnQ7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgTXRwU3RyaW5nQnVmZmVyOworCitjbGFzcyBNdHBQYWNrZXQgeworCitwcm90ZWN0ZWQ6CisgICAgdWludDhfdCogICAgICAgICAgICBtQnVmZmVyOworICAgIC8vIGN1cnJlbnQgc2l6ZSBvZiB0aGUgYnVmZmVyCisgICAgaW50ICAgICAgICAgICAgICAgICBtQnVmZmVyU2l6ZTsKKyAgICAvLyBudW1iZXIgb2YgYnl0ZXMgdG8gYWRkIHdoZW4gcmVzaXppbmcgdGhlIGJ1ZmZlcgorICAgIGludCAgICAgICAgICAgICAgICAgbUFsbG9jYXRpb25JbmNyZW1lbnQ7CisgICAgLy8gc2l6ZSBvZiB0aGUgZGF0YSBpbiB0aGUgcGFja2V0CisgICAgaW50ICAgICAgICAgICAgICAgICBtUGFja2V0U2l6ZTsKKworcHVibGljOgorICAgICAgICAgICAgICAgICAgICAgICAgTXRwUGFja2V0KGludCBidWZmZXJTaXplKTsKKyAgICB2aXJ0dWFsICAgICAgICAgICAgIH5NdHBQYWNrZXQoKTsKKworICAgIC8vIHNldHMgcGFja2V0IHNpemUgdG8gdGhlIGRlZmF1bHQgY29udGFpbmVyIHNpemUgYW5kIHNldHMgYnVmZmVyIHRvIHplcm8KKyAgICB2aXJ0dWFsIHZvaWQgICAgICAgIHJlc2V0KCk7CisKKyAgICB2b2lkICAgICAgICAgICAgICAgIGFsbG9jYXRlKGludCBsZW5ndGgpOworICAgIHZvaWQgICAgICAgICAgICAgICAgZHVtcCgpOworCisgICAgdWludDE2X3QgICAgICAgICAgICBnZXRDb250YWluZXJDb2RlKCkgY29uc3Q7CisgICAgdm9pZCAgICAgICAgICAgICAgICBzZXRDb250YWluZXJDb2RlKHVpbnQxNl90IGNvZGUpOworCisgICAgTXRwVHJhbnNhY3Rpb25JRCAgICBnZXRUcmFuc2FjdGlvbklEKCkgY29uc3Q7CisgICAgdm9pZCAgICAgICAgICAgICAgICBzZXRUcmFuc2FjdGlvbklEKE10cFRyYW5zYWN0aW9uSUQgaWQpOworCisgICAgdWludDMyX3QgICAgICAgICAgICBnZXRQYXJhbWV0ZXIoaW50IGluZGV4KSBjb25zdDsKKyAgICB2b2lkICAgICAgICAgICAgICAgIHNldFBhcmFtZXRlcihpbnQgaW5kZXgsIHVpbnQzMl90IHZhbHVlKTsKKworI2lmZGVmIE1UUF9IT1NUCisgICAgaW50ICAgICAgICAgICAgICAgICB0cmFuc2ZlcihzdHJ1Y3QgdXNiX2VuZHBvaW50ICplcCwgdm9pZCogYnVmZmVyLCBpbnQgbGVuZ3RoKTsKKyNlbmRpZgorCitwcm90ZWN0ZWQ6CisgICAgdWludDE2X3QgICAgICAgICAgICBnZXRVSW50MTYoaW50IG9mZnNldCkgY29uc3Q7CisgICAgdWludDMyX3QgICAgICAgICAgICBnZXRVSW50MzIoaW50IG9mZnNldCkgY29uc3Q7CisgICAgdm9pZCAgICAgICAgICAgICAgICBwdXRVSW50MTYoaW50IG9mZnNldCwgdWludDE2X3QgdmFsdWUpOworICAgIHZvaWQgICAgICAgICAgICAgICAgcHV0VUludDMyKGludCBvZmZzZXQsIHVpbnQzMl90IHZhbHVlKTsKK307CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBfTVRQX1BBQ0tFVF9ICmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwUHJvcGVydHkuY3BwIGIvbWVkaWEvbXRwL010cFByb3BlcnR5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NWNlNGQ0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXRwL010cFByb3BlcnR5LmNwcApAQCAtMCwwICsxLDE2MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiTXRwUHJvcGVydHkiCisjaW5jbHVkZSAidXRpbHMvTG9nLmgiCisKKyNpbmNsdWRlICJNdHBEYXRhUGFja2V0LmgiCisjaW5jbHVkZSAiTXRwUHJvcGVydHkuaCIKKyNpbmNsdWRlICJNdHBTdHJpbmdCdWZmZXIuaCIKKyNpbmNsdWRlICJNdHBVdGlscy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK010cFByb3BlcnR5OjpNdHBQcm9wZXJ0eSgpCisgICAgOiAgIG1Db2RlKDApLAorICAgICAgICBtVHlwZSgwKSwKKyAgICAgICAgbVdyaXRlYWJsZShmYWxzZSksCisgICAgICAgIG1EZWZhdWx0QXJyYXlMZW5ndGgoMCksCisgICAgICAgIG1EZWZhdWx0QXJyYXlWYWx1ZXMoTlVMTCksCisgICAgICAgIG1DdXJyZW50QXJyYXlMZW5ndGgoMCksCisgICAgICAgIG1DdXJyZW50QXJyYXlWYWx1ZXMoTlVMTCksCisgICAgICAgIG1Gb3JtRmxhZyhrRm9ybU5vbmUpLAorICAgICAgICBtRW51bUxlbmd0aCgwKSwKKyAgICAgICAgbUVudW1WYWx1ZXMoTlVMTCkKK3sKKyAgICBtRGVmYXVsdFZhbHVlLnN0ciA9IE5VTEw7CisgICAgbUN1cnJlbnRWYWx1ZS5zdHIgPSBOVUxMOworICAgIG1NaW5pbXVtVmFsdWUuc3RyID0gTlVMTDsKKyAgICBtTWF4aW11bVZhbHVlLnN0ciA9IE5VTEw7Cit9CisKK010cFByb3BlcnR5Ojp+TXRwUHJvcGVydHkoKSB7CisgICAgaWYgKG1UeXBlID09IE1UUF9UWVBFX1NUUikgeworICAgICAgICAvLyBmcmVlIGFsbCBzdHJpbmdzCisgICAgICAgIGZyZWUobURlZmF1bHRWYWx1ZS5zdHIpOworICAgICAgICBmcmVlKG1DdXJyZW50VmFsdWUuc3RyKTsKKyAgICAgICAgZnJlZShtTWluaW11bVZhbHVlLnN0cik7CisgICAgICAgIGZyZWUobU1heGltdW1WYWx1ZS5zdHIpOworICAgICAgICBpZiAobURlZmF1bHRBcnJheVZhbHVlcykgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtRGVmYXVsdEFycmF5TGVuZ3RoOyBpKyspCisgICAgICAgICAgICAgICAgZnJlZShtRGVmYXVsdEFycmF5VmFsdWVzW2ldLnN0cik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1DdXJyZW50QXJyYXlWYWx1ZXMpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbUN1cnJlbnRBcnJheUxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgIGZyZWUobUN1cnJlbnRBcnJheVZhbHVlc1tpXS5zdHIpOworICAgICAgICB9CisgICAgICAgIGlmIChtRW51bVZhbHVlcykgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtRW51bUxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgIGZyZWUobUVudW1WYWx1ZXNbaV0uc3RyKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBkZWxldGVbXSBtRGVmYXVsdEFycmF5VmFsdWVzOworICAgIGRlbGV0ZVtdIG1DdXJyZW50QXJyYXlWYWx1ZXM7CisgICAgZGVsZXRlW10gbUVudW1WYWx1ZXM7Cit9CisKK3ZvaWQgTXRwUHJvcGVydHk6OnJlYWQoTXRwRGF0YVBhY2tldCYgcGFja2V0KSB7CisgICAgTXRwU3RyaW5nQnVmZmVyIHN0cmluZzsKKworICAgIG1Db2RlID0gcGFja2V0LmdldFVJbnQxNigpOworICAgIG1UeXBlID0gcGFja2V0LmdldFVJbnQxNigpOworICAgIG1Xcml0ZWFibGUgPSAocGFja2V0LmdldFVJbnQ4KCkgPT0gMSk7CisgICAgc3dpdGNoIChtVHlwZSkgeworICAgICAgICBjYXNlIE1UUF9UWVBFX0FJTlQ4OgorICAgICAgICBjYXNlIE1UUF9UWVBFX0FVSU5UODoKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9BSU5UMTY6CisgICAgICAgIGNhc2UgTVRQX1RZUEVfQVVJTlQxNjoKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9BSU5UMzI6CisgICAgICAgIGNhc2UgTVRQX1RZUEVfQVVJTlQzMjoKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9BSU5UNjQ6CisgICAgICAgIGNhc2UgTVRQX1RZUEVfQVVJTlQ2NDoKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9BSU5UMTI4OgorICAgICAgICBjYXNlIE1UUF9UWVBFX0FVSU5UMTI4OgorICAgICAgICAgICAgbURlZmF1bHRBcnJheVZhbHVlcyA9IHJlYWRBcnJheVZhbHVlcyhwYWNrZXQsIG1EZWZhdWx0QXJyYXlMZW5ndGgpOworICAgICAgICAgICAgbUN1cnJlbnRBcnJheVZhbHVlcyA9IHJlYWRBcnJheVZhbHVlcyhwYWNrZXQsIG1DdXJyZW50QXJyYXlMZW5ndGgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZWFkVmFsdWUocGFja2V0LCBtRGVmYXVsdFZhbHVlKTsKKyAgICAgICAgICAgIHJlYWRWYWx1ZShwYWNrZXQsIG1DdXJyZW50VmFsdWUpOworICAgIH0KKyAgICBtRm9ybUZsYWcgPSBwYWNrZXQuZ2V0VUludDgoKTsKKworICAgIGlmIChtRm9ybUZsYWcgPT0ga0Zvcm1SYW5nZSkgeworICAgICAgICAgICAgcmVhZFZhbHVlKHBhY2tldCwgbU1pbmltdW1WYWx1ZSk7CisgICAgICAgICAgICByZWFkVmFsdWUocGFja2V0LCBtTWF4aW11bVZhbHVlKTsKKyAgICAgICAgICAgIHJlYWRWYWx1ZShwYWNrZXQsIG1TdGVwU2l6ZSk7CisgICAgfSBlbHNlIGlmIChtRm9ybUZsYWcgPT0ga0Zvcm1FbnVtKSB7CisgICAgICAgIG1FbnVtTGVuZ3RoID0gcGFja2V0LmdldFVJbnQxNigpOworICAgICAgICBtRW51bVZhbHVlcyA9IG5ldyBNdHBQcm9wZXJ0eVZhbHVlW21FbnVtTGVuZ3RoXTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtRW51bUxlbmd0aDsgaSsrKQorICAgICAgICAgICAgcmVhZFZhbHVlKHBhY2tldCwgbUVudW1WYWx1ZXNbaV0pOworICAgIH0KK30KKwordm9pZCBNdHBQcm9wZXJ0eTo6cHJpbnQoKSB7CisgICAgTE9HRCgiTXRwUHJvcGVydHkgJTA0WFxuIiwgbUNvZGUpOworICAgIExPR0QoIiAgICB0eXBlICUwNFhcbiIsIG1UeXBlKTsKKyAgICBMT0dEKCIgICAgd3JpdGVhYmxlICVzXG4iLCAobVdyaXRlYWJsZSA/ICJ0cnVlIiA6ICJmYWxzZSIpKTsKK30KKwordm9pZCBNdHBQcm9wZXJ0eTo6cmVhZFZhbHVlKE10cERhdGFQYWNrZXQmIHBhY2tldCwgTXRwUHJvcGVydHlWYWx1ZSYgdmFsdWUpIHsKKyAgICBzd2l0Y2ggKG1UeXBlKSB7CisgICAgICAgIGNhc2UgTVRQX1RZUEVfSU5UODoKKyAgICAgICAgICAgIHZhbHVlLmk4ID0gcGFja2V0LmdldEludDgoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9UWVBFX1VJTlQ4OgorICAgICAgICAgICAgdmFsdWUudTggPSBwYWNrZXQuZ2V0VUludDgoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9UWVBFX0lOVDE2OgorICAgICAgICAgICAgdmFsdWUuaTE2ID0gcGFja2V0LmdldEludDE2KCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9VSU5UMTY6CisgICAgICAgICAgICB2YWx1ZS51MTYgPSBwYWNrZXQuZ2V0VUludDE2KCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9JTlQzMjoKKyAgICAgICAgICAgIHZhbHVlLmkzMiA9IHBhY2tldC5nZXRJbnQzMigpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX1RZUEVfVUlOVDMyOgorICAgICAgICAgICAgdmFsdWUudTMyID0gcGFja2V0LmdldFVJbnQzMigpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX1RZUEVfSU5UNjQ6CisgICAgICAgICAgICB2YWx1ZS5pNjQgPSBwYWNrZXQuZ2V0SW50NjQoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9UWVBFX1VJTlQ2NDoKKyAgICAgICAgICAgIHZhbHVlLnU2NCA9IHBhY2tldC5nZXRVSW50NjQoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9UWVBFX0lOVDEyODoKKyAgICAgICAgICAgIHBhY2tldC5nZXRJbnQxMjgodmFsdWUuaTEyOCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9VSU5UMTI4OgorICAgICAgICAgICAgcGFja2V0LmdldFVJbnQxMjgodmFsdWUudTEyOCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAidW5rbm93biB0eXBlICVkIGluIE10cFByb3BlcnR5OjpyZWFkVmFsdWVcbiIsIG1UeXBlKTsKKyAgICB9Cit9CisKK010cFByb3BlcnR5VmFsdWUqIE10cFByb3BlcnR5OjpyZWFkQXJyYXlWYWx1ZXMoTXRwRGF0YVBhY2tldCYgcGFja2V0LCBpbnQmIGxlbmd0aCkgeworICAgIGxlbmd0aCA9IHBhY2tldC5nZXRVSW50MzIoKTsKKyAgICBpZiAobGVuZ3RoID09IDApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIE10cFByb3BlcnR5VmFsdWUqIHJlc3VsdCA9IG5ldyBNdHBQcm9wZXJ0eVZhbHVlW2xlbmd0aF07CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykKKyAgICAgICAgcmVhZFZhbHVlKHBhY2tldCwgcmVzdWx0W2ldKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cFByb3BlcnR5LmggYi9tZWRpYS9tdHAvTXRwUHJvcGVydHkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzcyMjkwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXRwL010cFByb3BlcnR5LmgKQEAgLTAsMCArMSw3MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX01UUF9QUk9QRVJUWV9ICisjZGVmaW5lIF9NVFBfUFJPUEVSVFlfSAorCisjaW5jbHVkZSAiTXRwVHlwZXMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBNdHBEYXRhUGFja2V0OworCitjbGFzcyBNdHBQcm9wZXJ0eSB7CitwdWJsaWM6CisgICAgTXRwUHJvcGVydHlDb2RlICAgICBtQ29kZTsKKyAgICBNdHBEYXRhVHlwZSAgICAgICAgIG1UeXBlOworICAgIGJvb2wgICAgICAgICAgICAgICAgbVdyaXRlYWJsZTsKKyAgICBNdHBQcm9wZXJ0eVZhbHVlICAgIG1EZWZhdWx0VmFsdWU7CisgICAgTXRwUHJvcGVydHlWYWx1ZSAgICBtQ3VycmVudFZhbHVlOworCisgICAgLy8gZm9yIGFycmF5IHR5cGVzCisgICAgaW50ICAgICAgICAgICAgICAgICBtRGVmYXVsdEFycmF5TGVuZ3RoOworICAgIE10cFByb3BlcnR5VmFsdWUqICAgbURlZmF1bHRBcnJheVZhbHVlczsKKyAgICBpbnQgICAgICAgICAgICAgICAgIG1DdXJyZW50QXJyYXlMZW5ndGg7CisgICAgTXRwUHJvcGVydHlWYWx1ZSogICBtQ3VycmVudEFycmF5VmFsdWVzOworCisgICAgZW51bSB7CisgICAgICAgIGtGb3JtTm9uZSA9IDAsCisgICAgICAgIGtGb3JtUmFuZ2UgPSAxLAorICAgICAgICBrRm9ybUVudW0gPSAyLAorICAgIH07CisgICAgdWludDhfdCAgICAgICAgICAgICBtRm9ybUZsYWc7CisKKyAgICAvLyBmb3IgcmFuZ2UgZm9ybQorICAgIE10cFByb3BlcnR5VmFsdWUgICAgbU1pbmltdW1WYWx1ZTsKKyAgICBNdHBQcm9wZXJ0eVZhbHVlICAgIG1NYXhpbXVtVmFsdWU7CisgICAgTXRwUHJvcGVydHlWYWx1ZSAgICBtU3RlcFNpemU7CisKKyAgICAvLyBmb3IgZW51bSBmb3JtCisgICAgaW50ICAgICAgICAgICAgICAgICBtRW51bUxlbmd0aDsKKyAgICBNdHBQcm9wZXJ0eVZhbHVlKiAgIG1FbnVtVmFsdWVzOworCitwdWJsaWM6CisgICAgICAgICAgICAgICAgICAgICAgICBNdHBQcm9wZXJ0eSgpOworICAgIHZpcnR1YWwgICAgICAgICAgICAgfk10cFByb3BlcnR5KCk7CisKKyAgICB2b2lkICAgICAgICAgICAgICAgIHJlYWQoTXRwRGF0YVBhY2tldCYgcGFja2V0KTsKKworICAgIHZvaWQgICAgICAgICAgICAgICAgcHJpbnQoKTsKKworcHJpdmF0ZToKKyAgICB2b2lkICAgICAgICAgICAgICAgIHJlYWRWYWx1ZShNdHBEYXRhUGFja2V0JiBwYWNrZXQsIE10cFByb3BlcnR5VmFsdWUmIHZhbHVlKTsKKyAgICBNdHBQcm9wZXJ0eVZhbHVlKiAgIHJlYWRBcnJheVZhbHVlcyhNdHBEYXRhUGFja2V0JiBwYWNrZXQsIGludCYgbGVuZ3RoKTsKK307CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBfTVRQX1BST1BFUlRZX0gKZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBSZXF1ZXN0UGFja2V0LmNwcCBiL21lZGlhL210cC9NdHBSZXF1ZXN0UGFja2V0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lM2E3MjBjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXRwL010cFJlcXVlc3RQYWNrZXQuY3BwCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorCisjaW5jbHVkZSAiTXRwUmVxdWVzdFBhY2tldC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK010cFJlcXVlc3RQYWNrZXQ6Ok10cFJlcXVlc3RQYWNrZXQoKQorICAgIDogICBNdHBQYWNrZXQoNTEyKQoreworfQorCitNdHBSZXF1ZXN0UGFja2V0Ojp+TXRwUmVxdWVzdFBhY2tldCgpIHsKK30KKworI2lmZGVmIE1UUF9ERVZJQ0UKK2ludCBNdHBSZXF1ZXN0UGFja2V0OjpyZWFkKGludCBmZCkgeworICAgIGludCByZXQgPSA6OnJlYWQoZmQsIG1CdWZmZXIsIG1CdWZmZXJTaXplKTsKKyAgICBpZiAocmV0ID49IDApCisgICAgICAgIG1QYWNrZXRTaXplID0gcmV0OworICAgIGVsc2UKKyAgICAgICAgbVBhY2tldFNpemUgPSAwOworICAgIHJldHVybiByZXQ7Cit9CisjZW5kaWYKKworI2lmZGVmIE1UUF9IT1NUCisgICAgLy8gd3JpdGUgb3VyIGJ1ZmZlciB0byB0aGUgZ2l2ZW4gZW5kcG9pbnQgKGhvc3QgbW9kZSkKK2ludCBNdHBSZXF1ZXN0UGFja2V0Ojp3cml0ZShzdHJ1Y3QgdXNiX2VuZHBvaW50ICplcCkKK3sKKyAgICBwdXRVSW50MzIoTVRQX0NPTlRBSU5FUl9MRU5HVEhfT0ZGU0VULCBtUGFja2V0U2l6ZSk7CisgICAgcHV0VUludDE2KE1UUF9DT05UQUlORVJfVFlQRV9PRkZTRVQsIE1UUF9DT05UQUlORVJfVFlQRV9DT01NQU5EKTsKKyAgICByZXR1cm4gdHJhbnNmZXIoZXAsIG1CdWZmZXIsIG1QYWNrZXRTaXplKTsKK30KKyNlbmRpZgorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cFJlcXVlc3RQYWNrZXQuaCBiL21lZGlhL210cC9NdHBSZXF1ZXN0UGFja2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGY1MThmMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL210cC9NdHBSZXF1ZXN0UGFja2V0LmgKQEAgLTAsMCArMSw0OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX01UUF9SRVFVRVNUX1BBQ0tFVF9ICisjZGVmaW5lIF9NVFBfUkVRVUVTVF9QQUNLRVRfSAorCisjaW5jbHVkZSAiTXRwUGFja2V0LmgiCisjaW5jbHVkZSAibXRwLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgTXRwUmVxdWVzdFBhY2tldCA6IHB1YmxpYyBNdHBQYWNrZXQgeworCitwdWJsaWM6CisgICAgICAgICAgICAgICAgICAgICAgICBNdHBSZXF1ZXN0UGFja2V0KCk7CisgICAgdmlydHVhbCAgICAgICAgICAgICB+TXRwUmVxdWVzdFBhY2tldCgpOworCisjaWZkZWYgTVRQX0RFVklDRQorICAgIC8vIGZpbGwgb3VyIGJ1ZmZlciB3aXRoIGRhdGEgZnJvbSB0aGUgZ2l2ZW4gZmlsZSBkZXNjcmlwdG9yCisgICAgaW50ICAgICAgICAgICAgICAgICByZWFkKGludCBmZCk7CisjZW5kaWYKKworI2lmZGVmIE1UUF9IT1NUCisgICAgLy8gd3JpdGUgb3VyIGJ1ZmZlciB0byB0aGUgZ2l2ZW4gZW5kcG9pbnQKKyAgICBpbnQgICAgICAgICAgICAgICAgIHdyaXRlKHN0cnVjdCB1c2JfZW5kcG9pbnQgKmVwKTsKKyNlbmRpZgorCisgICAgaW5saW5lIE10cE9wZXJhdGlvbkNvZGUgICAgZ2V0T3BlcmF0aW9uQ29kZSgpIGNvbnN0IHsgcmV0dXJuIGdldENvbnRhaW5lckNvZGUoKTsgfQorICAgIGlubGluZSB2b2lkICAgICAgICAgICAgICAgIHNldE9wZXJhdGlvbkNvZGUoTXRwT3BlcmF0aW9uQ29kZSBjb2RlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIHNldENvbnRhaW5lckNvZGUoY29kZSk7IH0KK307CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBfTVRQX1JFUVVFU1RfUEFDS0VUX0gKZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBSZXNwb25zZVBhY2tldC5jcHAgYi9tZWRpYS9tdHAvTXRwUmVzcG9uc2VQYWNrZXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExOTc5ZDcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdHAvTXRwUmVzcG9uc2VQYWNrZXQuY3BwCkBAIC0wLDAgKzEsNTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorCisjaW5jbHVkZSAiTXRwUmVzcG9uc2VQYWNrZXQuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitNdHBSZXNwb25zZVBhY2tldDo6TXRwUmVzcG9uc2VQYWNrZXQoKQorICAgIDogICBNdHBQYWNrZXQoNTEyKQoreworfQorCitNdHBSZXNwb25zZVBhY2tldDo6fk10cFJlc3BvbnNlUGFja2V0KCkgeworfQorCisjaWZkZWYgTVRQX0RFVklDRQoraW50IE10cFJlc3BvbnNlUGFja2V0Ojp3cml0ZShpbnQgZmQpIHsKKyAgICBwdXRVSW50MzIoTVRQX0NPTlRBSU5FUl9MRU5HVEhfT0ZGU0VULCBtUGFja2V0U2l6ZSk7CisgICAgcHV0VUludDE2KE1UUF9DT05UQUlORVJfVFlQRV9PRkZTRVQsIE1UUF9DT05UQUlORVJfVFlQRV9SRVNQT05TRSk7CisgICAgaW50IHJldCA9IDo6d3JpdGUoZmQsIG1CdWZmZXIsIG1QYWNrZXRTaXplKTsKKyAgICByZXR1cm4gKHJldCA8IDAgPyByZXQgOiAwKTsKK30KKyNlbmRpZgorCisjaWZkZWYgTVRQX0hPU1QKKyAgICAvLyByZWFkIG91ciBidWZmZXIgZnJvbSB0aGUgZ2l2ZW4gZW5kcG9pbnQKK2ludCBNdHBSZXNwb25zZVBhY2tldDo6cmVhZChzdHJ1Y3QgdXNiX2VuZHBvaW50ICplcCkgeworICAgIGludCByZXQgPSB0cmFuc2ZlcihlcCwgbUJ1ZmZlciwgbUJ1ZmZlclNpemUpOworICAgICBpZiAocmV0ID49IDApCisgICAgICAgIG1QYWNrZXRTaXplID0gcmV0OworICAgIGVsc2UKKyAgICAgICAgbVBhY2tldFNpemUgPSAwOworICAgIHJldHVybiByZXQ7Cit9CisjZW5kaWYKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cFJlc3BvbnNlUGFja2V0LmggYi9tZWRpYS9tdHAvTXRwUmVzcG9uc2VQYWNrZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzNmOGY5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXRwL010cFJlc3BvbnNlUGFja2V0LmgKQEAgLTAsMCArMSw0OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX01UUF9SRVNQT05TRV9QQUNLRVRfSAorI2RlZmluZSBfTVRQX1JFU1BPTlNFX1BBQ0tFVF9ICisKKyNpbmNsdWRlICJNdHBQYWNrZXQuaCIKKyNpbmNsdWRlICJtdHAuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBNdHBSZXNwb25zZVBhY2tldCA6IHB1YmxpYyBNdHBQYWNrZXQgeworCitwdWJsaWM6CisgICAgICAgICAgICAgICAgICAgICAgICBNdHBSZXNwb25zZVBhY2tldCgpOworICAgIHZpcnR1YWwgICAgICAgICAgICAgfk10cFJlc3BvbnNlUGFja2V0KCk7CisKKyNpZmRlZiBNVFBfREVWSUNFCisgICAgLy8gd3JpdGUgb3VyIGRhdGEgdG8gdGhlIGdpdmVuIGZpbGUgZGVzY3JpcHRvcgorICAgIGludCAgICAgICAgICAgICAgICAgd3JpdGUoaW50IGZkKTsKKyNlbmRpZgorCisjaWZkZWYgTVRQX0hPU1QKKyAgICAvLyByZWFkIG91ciBidWZmZXIgZnJvbSB0aGUgZ2l2ZW4gZW5kcG9pbnQKKyAgICBpbnQgICAgICAgICAgICAgICAgIHJlYWQoc3RydWN0IHVzYl9lbmRwb2ludCAqZXApOworI2VuZGlmCisKKyAgICBpbmxpbmUgTXRwUmVzcG9uc2VDb2RlICAgICAgZ2V0UmVzcG9uc2VDb2RlKCkgY29uc3QgeyByZXR1cm4gZ2V0Q29udGFpbmVyQ29kZSgpOyB9CisgICAgaW5saW5lIHZvaWQgICAgICAgICAgICAgICAgIHNldFJlc3BvbnNlQ29kZShNdHBSZXNwb25zZUNvZGUgY29kZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gc2V0Q29udGFpbmVyQ29kZShjb2RlKTsgfQorfTsKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIF9NVFBfUkVTUE9OU0VfUEFDS0VUX0gKZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBTZXJ2ZXIuY3BwIGIvbWVkaWEvbXRwL010cFNlcnZlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTliNGNhNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL210cC9NdHBTZXJ2ZXIuY3BwCkBAIC0wLDAgKzEsNTk0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisKKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgorCisjaW5jbHVkZSAiTXRwRGVidWcuaCIKKyNpbmNsdWRlICJNdHBTZXJ2ZXIuaCIKKyNpbmNsdWRlICJNdHBTdG9yYWdlLmgiCisjaW5jbHVkZSAiTXRwU3RyaW5nQnVmZmVyLmgiCisjaW5jbHVkZSAiTXRwRGF0YWJhc2UuaCIKKworI2luY2x1ZGUgImZfbXRwLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RhdGljIGNvbnN0IE10cE9wZXJhdGlvbkNvZGUga1N1cHBvcnRlZE9wZXJhdGlvbkNvZGVzW10gPSB7CisgICAgTVRQX09QRVJBVElPTl9HRVRfREVWSUNFX0lORk8sCisgICAgTVRQX09QRVJBVElPTl9PUEVOX1NFU1NJT04sCisgICAgTVRQX09QRVJBVElPTl9DTE9TRV9TRVNTSU9OLAorICAgIE1UUF9PUEVSQVRJT05fR0VUX1NUT1JBR0VfSURTLAorICAgIE1UUF9PUEVSQVRJT05fR0VUX1NUT1JBR0VfSU5GTywKKyAgICBNVFBfT1BFUkFUSU9OX0dFVF9OVU1fT0JKRUNUUywKKyAgICBNVFBfT1BFUkFUSU9OX0dFVF9PQkpFQ1RfSEFORExFUywKKyAgICBNVFBfT1BFUkFUSU9OX0dFVF9PQkpFQ1RfSU5GTywKKyAgICBNVFBfT1BFUkFUSU9OX0dFVF9PQkpFQ1QsCisvLyAgICBNVFBfT1BFUkFUSU9OX0dFVF9USFVNQiwKKyAgICBNVFBfT1BFUkFUSU9OX0RFTEVURV9PQkpFQ1QsCisgICAgTVRQX09QRVJBVElPTl9TRU5EX09CSkVDVF9JTkZPLAorICAgIE1UUF9PUEVSQVRJT05fU0VORF9PQkpFQ1QsCisvLyAgICBNVFBfT1BFUkFUSU9OX0lOSVRJQVRFX0NBUFRVUkUsCisvLyAgICBNVFBfT1BFUkFUSU9OX0ZPUk1BVF9TVE9SRSwKKy8vICAgIE1UUF9PUEVSQVRJT05fUkVTRVRfREVWSUNFLAorLy8gICAgTVRQX09QRVJBVElPTl9TRUxGX1RFU1QsCisvLyAgICBNVFBfT1BFUkFUSU9OX1NFVF9PQkpFQ1RfUFJPVEVDVElPTiwKKy8vICAgIE1UUF9PUEVSQVRJT05fUE9XRVJfRE9XTiwKKyAgICBNVFBfT1BFUkFUSU9OX0dFVF9ERVZJQ0VfUFJPUF9ERVNDLAorICAgIE1UUF9PUEVSQVRJT05fR0VUX0RFVklDRV9QUk9QX1ZBTFVFLAorICAgIE1UUF9PUEVSQVRJT05fU0VUX0RFVklDRV9QUk9QX1ZBTFVFLAorICAgIE1UUF9PUEVSQVRJT05fUkVTRVRfREVWSUNFX1BST1BfVkFMVUUsCisvLyAgICBNVFBfT1BFUkFUSU9OX1RFUk1JTkFURV9PUEVOX0NBUFRVUkUsCisvLyAgICBNVFBfT1BFUkFUSU9OX01PVkVfT0JKRUNULAorLy8gICAgTVRQX09QRVJBVElPTl9DT1BZX09CSkVDVCwKKy8vICAgIE1UUF9PUEVSQVRJT05fR0VUX1BBUlRJQUxfT0JKRUNULAorLy8gICAgTVRQX09QRVJBVElPTl9JTklUSUFURV9PUEVOX0NBUFRVUkUsCisgICAgTVRQX09QRVJBVElPTl9HRVRfT0JKRUNUX1BST1BTX1NVUFBPUlRFRCwKKy8vICAgIE1UUF9PUEVSQVRJT05fR0VUX09CSkVDVF9QUk9QX0RFU0MsCisgICAgTVRQX09QRVJBVElPTl9HRVRfT0JKRUNUX1BST1BfVkFMVUUsCisgICAgTVRQX09QRVJBVElPTl9TRVRfT0JKRUNUX1BST1BfVkFMVUUsCisvLyAgICBNVFBfT1BFUkFUSU9OX0dFVF9PQkpFQ1RfUkVGRVJFTkNFUywKKy8vICAgIE1UUF9PUEVSQVRJT05fU0VUX09CSkVDVF9SRUZFUkVOQ0VTLAorLy8gICAgTVRQX09QRVJBVElPTl9TS0lQLAorfTsKKworc3RhdGljIGNvbnN0IE10cE9iamVjdFByb3BlcnR5IGtTdXBwb3J0ZWRPYmplY3RQcm9wZXJ0aWVzW10gPSB7CisgICAgTVRQX1BST1BFUlRZX1NUT1JBR0VfSUQsCisgICAgTVRQX1BST1BFUlRZX09CSkVDVF9GT1JNQVQsCisgICAgTVRQX1BST1BFUlRZX09CSkVDVF9TSVpFLAorICAgIE1UUF9QUk9QRVJUWV9PQkpFQ1RfRklMRV9OQU1FLAorICAgIE1UUF9QUk9QRVJUWV9QQVJFTlRfT0JKRUNULAorfTsKKworc3RhdGljIGNvbnN0IE10cE9iamVjdEZvcm1hdCBrU3VwcG9ydGVkUGxheWJhY2tGb3JtYXRzW10gPSB7CisgICAgLy8gTVRQX0ZPUk1BVF9VTkRFRklORUQsCisgICAgTVRQX0ZPUk1BVF9BU1NPQ0lBVElPTiwKKyAgICAvLyBNVFBfRk9STUFUX1RFWFQsCisgICAgLy8gTVRQX0ZPUk1BVF9IVE1MLAorICAgIE1UUF9GT1JNQVRfTVAzLAorICAgIC8vTVRQX0ZPUk1BVF9BVkksCisgICAgTVRQX0ZPUk1BVF9NUEVHLAorICAgIC8vIE1UUF9GT1JNQVRfQVNGLAorICAgIE1UUF9GT1JNQVRfRVhJRl9KUEVHLAorICAgIE1UUF9GT1JNQVRfVElGRl9FUCwKKyAgICAvLyBNVFBfRk9STUFUX0JNUCwKKyAgICBNVFBfRk9STUFUX0dJRiwKKyAgICBNVFBfRk9STUFUX0pGSUYsCisgICAgTVRQX0ZPUk1BVF9QTkcsCisgICAgTVRQX0ZPUk1BVF9USUZGLAorICAgIE1UUF9GT1JNQVRfV01BLAorICAgIE1UUF9GT1JNQVRfT0dHLAorICAgIE1UUF9GT1JNQVRfQUFDLAorICAgIC8vIE1UUF9GT1JNQVRfRkxBQywKKyAgICAvLyBNVFBfRk9STUFUX1dNViwKKyAgICBNVFBfRk9STUFUX01QNF9DT05UQUlORVIsCisgICAgTVRQX0ZPUk1BVF9NUDIsCisgICAgTVRQX0ZPUk1BVF8zR1BfQ09OVEFJTkVSLAorICAgIC8vIE1UUF9GT1JNQVRfQUJTVFJBQ1RfQVVESU9fQUxCVU0sCisgICAgLy8gTVRQX0ZPUk1BVF9BQlNUUkFDVF9BVl9QTEFZTElTVCwKKyAgICAvLyBNVFBfRk9STUFUX1dQTF9QTEFZTElTVCwKKyAgICAvLyBNVFBfRk9STUFUX00zVV9QTEFZTElTVCwKKyAgICAvLyBNVFBfRk9STUFUX01QTF9QTEFZTElTVCwKKyAgICAvLyBNVFBfRk9STUFUX1BMU19QTEFZTElTVCwKK307CisKK010cFNlcnZlcjo6TXRwU2VydmVyKGludCBmZCwgY29uc3QgY2hhciogZGF0YWJhc2VQYXRoKQorICAgIDogICBtRkQoZmQpLAorICAgICAgICBtRGF0YWJhc2VQYXRoKGRhdGFiYXNlUGF0aCksCisgICAgICAgIG1EYXRhYmFzZShOVUxMKSwKKyAgICAgICAgbVNlc3Npb25JRCgwKSwKKyAgICAgICAgbVNlc3Npb25PcGVuKGZhbHNlKSwKKyAgICAgICAgbVNlbmRPYmplY3RIYW5kbGUoa0ludmFsaWRPYmplY3RIYW5kbGUpLAorICAgICAgICBtU2VuZE9iamVjdEZpbGVTaXplKDApCit7CisgICAgbURhdGFiYXNlID0gbmV3IE10cERhdGFiYXNlKCk7CisgICAgbURhdGFiYXNlLT5vcGVuKGRhdGFiYXNlUGF0aCwgdHJ1ZSk7Cit9CisKK010cFNlcnZlcjo6fk10cFNlcnZlcigpIHsKK30KKwordm9pZCBNdHBTZXJ2ZXI6OmFkZFN0b3JhZ2UoY29uc3QgY2hhciogZmlsZVBhdGgpIHsKKyAgICBpbnQgaW5kZXggPSBtU3RvcmFnZXMuc2l6ZSgpICsgMTsKKyAgICBpbmRleCB8PSBpbmRleCA8PCAxNjsgICAvLyBzZXQgaGlnaCBhbmQgbG93IHBhcnQgdG8gb3VyIGluZGV4CisgICAgTXRwU3RvcmFnZSogc3RvcmFnZSA9IG5ldyBNdHBTdG9yYWdlKGluZGV4LCBmaWxlUGF0aCwgbURhdGFiYXNlKTsKKyAgICBhZGRTdG9yYWdlKHN0b3JhZ2UpOworfQorCitNdHBTdG9yYWdlKiBNdHBTZXJ2ZXI6OmdldFN0b3JhZ2UoTXRwU3RvcmFnZUlEIGlkKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtU3RvcmFnZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgTXRwU3RvcmFnZSogc3RvcmFnZSA9ICBtU3RvcmFnZXNbaV07CisgICAgICAgIGlmIChzdG9yYWdlLT5nZXRTdG9yYWdlSUQoKSA9PSBpZCkKKyAgICAgICAgICAgIHJldHVybiBzdG9yYWdlOworICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKwordm9pZCBNdHBTZXJ2ZXI6OnNjYW5TdG9yYWdlKCkgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbVN0b3JhZ2VzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIE10cFN0b3JhZ2UqIHN0b3JhZ2UgPSAgbVN0b3JhZ2VzW2ldOworICAgICAgICBzdG9yYWdlLT5zY2FuRmlsZXMoKTsKKyAgICB9Cit9CisKK3ZvaWQgTXRwU2VydmVyOjpydW4oKSB7CisgICAgaW50IGZkID0gbUZEOworCisgICAgcHJpbnRmKCJNdHBTZXJ2ZXI6OnJ1biBmZDogJWRcbiIsIGZkKTsKKworICAgIHdoaWxlICgxKSB7CisgICAgICAgIGludCByZXQgPSBtUmVxdWVzdC5yZWFkKGZkKTsKKyAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAicmVxdWVzdCByZWFkIHJldHVybmVkICVkLCBlcnJubzogJWRcbiIsIHJldCwgZXJybm8pOworICAgICAgICAgICAgaWYgKGVycm5vID09IEVDQU5DRUxFRCkgeworICAgICAgICAgICAgICAgIC8vIHJldHVybiB0byB0b3Agb2YgbG9vcCBhbmQgd2FpdCBmb3IgbmV4dCBjb21tYW5kCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBNdHBPcGVyYXRpb25Db2RlIG9wZXJhdGlvbiA9IG1SZXF1ZXN0LmdldE9wZXJhdGlvbkNvZGUoKTsKKyAgICAgICAgTXRwVHJhbnNhY3Rpb25JRCB0cmFuc2FjdGlvbiA9IG1SZXF1ZXN0LmdldFRyYW5zYWN0aW9uSUQoKTsKKworICAgICAgICBwcmludGYoIm9wZXJhdGlvbjogJXNcbiIsIE10cERlYnVnOjpnZXRPcGVyYXRpb25Db2RlTmFtZShvcGVyYXRpb24pKTsKKyAgICAgICAgbVJlcXVlc3QuZHVtcCgpOworCisgICAgICAgIC8vIEZJWE1FIG5lZWQgdG8gZ2VuZXJhbGl6ZSB0aGlzCisgICAgICAgIGJvb2wgZGF0YUluID0gKG9wZXJhdGlvbiA9PSBNVFBfT1BFUkFUSU9OX1NFTkRfT0JKRUNUX0lORk8pOworICAgICAgICBpZiAoZGF0YUluKSB7CisgICAgICAgICAgICBpbnQgcmV0ID0gbURhdGEucmVhZChmZCk7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZGF0YSByZWFkIHJldHVybmVkICVkLCBlcnJubzogJWRcbiIsIHJldCwgZXJybm8pOworICAgICAgICAgICAgICAgIGlmIChlcnJubyA9PSBFQ0FOQ0VMRUQpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gcmV0dXJuIHRvIHRvcCBvZiBsb29wIGFuZCB3YWl0IGZvciBuZXh0IGNvbW1hbmQKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHJpbnRmKCJyZWNlaXZlZCBkYXRhOlxuIik7CisgICAgICAgICAgICBtRGF0YS5kdW1wKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtRGF0YS5yZXNldCgpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGhhbmRsZVJlcXVlc3QoKSkgeworICAgICAgICAgICAgaWYgKCFkYXRhSW4gJiYgbURhdGEuaGFzRGF0YSgpKSB7CisgICAgICAgICAgICAgICAgbURhdGEuc2V0T3BlcmF0aW9uQ29kZShvcGVyYXRpb24pOworICAgICAgICAgICAgICAgIG1EYXRhLnNldFRyYW5zYWN0aW9uSUQodHJhbnNhY3Rpb24pOworICAgICAgICAgICAgICAgIHByaW50Zigic2VuZGluZyBkYXRhOlxuIik7CisgICAgICAgICAgICAgICAgbURhdGEuZHVtcCgpOworICAgICAgICAgICAgICAgIHJldCA9IG1EYXRhLndyaXRlKGZkKTsKKyAgICAgICAgICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInJlcXVlc3Qgd3JpdGUgcmV0dXJuZWQgJWQsIGVycm5vOiAlZFxuIiwgcmV0LCBlcnJubyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChlcnJubyA9PSBFQ0FOQ0VMRUQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJldHVybiB0byB0b3Agb2YgbG9vcCBhbmQgd2FpdCBmb3IgbmV4dCBjb21tYW5kCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1SZXNwb25zZS5zZXRUcmFuc2FjdGlvbklEKHRyYW5zYWN0aW9uKTsKKyAgICAgICAgICAgIHByaW50Zigic2VuZGluZyByZXNwb25zZSAlMDRYXG4iLCBtUmVzcG9uc2UuZ2V0UmVzcG9uc2VDb2RlKCkpOworICAgICAgICAgICAgcmV0ID0gbVJlc3BvbnNlLndyaXRlKGZkKTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJyZXF1ZXN0IHdyaXRlIHJldHVybmVkICVkLCBlcnJubzogJWRcbiIsIHJldCwgZXJybm8pOworICAgICAgICAgICAgICAgIGlmIChlcnJubyA9PSBFQ0FOQ0VMRUQpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gcmV0dXJuIHRvIHRvcCBvZiBsb29wIGFuZCB3YWl0IGZvciBuZXh0IGNvbW1hbmQKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcHJpbnRmKCJza2lwcGluZyByZXNwb25zZVxuIik7CisgICAgICAgIH0KKyAgICB9Cit9CisKK2Jvb2wgTXRwU2VydmVyOjpoYW5kbGVSZXF1ZXN0KCkgeworICAgIE10cE9wZXJhdGlvbkNvZGUgb3BlcmF0aW9uID0gbVJlcXVlc3QuZ2V0T3BlcmF0aW9uQ29kZSgpOworICAgIE10cFJlc3BvbnNlQ29kZSByZXNwb25zZTsKKworICAgIG1SZXNwb25zZS5yZXNldCgpOworCisgICAgaWYgKG1TZW5kT2JqZWN0SGFuZGxlICE9IGtJbnZhbGlkT2JqZWN0SGFuZGxlICYmIG9wZXJhdGlvbiAhPSBNVFBfT1BFUkFUSU9OX1NFTkRfT0JKRUNUKSB7CisgICAgICAgIC8vIEZJWE1FIC0gbmVlZCB0byBkZWxldGUgbVNlbmRPYmplY3RIYW5kbGUgZnJvbSB0aGUgZGF0YWJhc2UKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJleHBlY3RlZCBTZW5kT2JqZWN0IGFmdGVyIFNlbmRPYmplY3RJbmZvXG4iKTsKKyAgICAgICAgbVNlbmRPYmplY3RIYW5kbGUgPSBrSW52YWxpZE9iamVjdEhhbmRsZTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKG9wZXJhdGlvbikgeworICAgICAgICBjYXNlIE1UUF9PUEVSQVRJT05fR0VUX0RFVklDRV9JTkZPOgorICAgICAgICAgICAgcmVzcG9uc2UgPSBkb0dldERldmljZUluZm8oKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9PUEVSQVRJT05fT1BFTl9TRVNTSU9OOgorICAgICAgICAgICAgcmVzcG9uc2UgPSBkb09wZW5TZXNzaW9uKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfT1BFUkFUSU9OX0NMT1NFX1NFU1NJT046CisgICAgICAgICAgICByZXNwb25zZSA9IGRvQ2xvc2VTZXNzaW9uKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfT1BFUkFUSU9OX0dFVF9TVE9SQUdFX0lEUzoKKyAgICAgICAgICAgIHJlc3BvbnNlID0gZG9HZXRTdG9yYWdlSURzKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgIGNhc2UgTVRQX09QRVJBVElPTl9HRVRfU1RPUkFHRV9JTkZPOgorICAgICAgICAgICAgcmVzcG9uc2UgPSBkb0dldFN0b3JhZ2VJbmZvKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfT1BFUkFUSU9OX0dFVF9PQkpFQ1RfUFJPUFNfU1VQUE9SVEVEOgorICAgICAgICAgICAgcmVzcG9uc2UgPSBkb0dldE9iamVjdFByb3BzU3VwcG9ydGVkKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfT1BFUkFUSU9OX0dFVF9PQkpFQ1RfSEFORExFUzoKKyAgICAgICAgICAgIHJlc3BvbnNlID0gZG9HZXRPYmplY3RIYW5kbGVzKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfT1BFUkFUSU9OX0dFVF9PQkpFQ1RfUFJPUF9WQUxVRToKKyAgICAgICAgICAgIHJlc3BvbnNlID0gZG9HZXRPYmplY3RQcm9wVmFsdWUoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9PUEVSQVRJT05fR0VUX09CSkVDVF9JTkZPOgorICAgICAgICAgICAgcmVzcG9uc2UgPSBkb0dldE9iamVjdEluZm8oKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9PUEVSQVRJT05fR0VUX09CSkVDVDoKKyAgICAgICAgICAgIHJlc3BvbnNlID0gZG9HZXRPYmplY3QoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9PUEVSQVRJT05fU0VORF9PQkpFQ1RfSU5GTzoKKyAgICAgICAgICAgIHJlc3BvbnNlID0gZG9TZW5kT2JqZWN0SW5mbygpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX09QRVJBVElPTl9TRU5EX09CSkVDVDoKKyAgICAgICAgICAgIHJlc3BvbnNlID0gZG9TZW5kT2JqZWN0KCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfT1BFUkFUSU9OX0RFTEVURV9PQkpFQ1Q6CisgICAgICAgICAgICByZXNwb25zZSA9IGRvRGVsZXRlT2JqZWN0KCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfT1BFUkFUSU9OX0dFVF9PQkpFQ1RfUFJPUF9ERVNDOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmVzcG9uc2UgPSBNVFBfUkVTUE9OU0VfT1BFUkFUSU9OX05PVF9TVVBQT1JURUQ7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAocmVzcG9uc2UgPT0gTVRQX1JFU1BPTlNFX1RSQU5TQUNUSU9OX0NBTkNFTExFRCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIG1SZXNwb25zZS5zZXRSZXNwb25zZUNvZGUocmVzcG9uc2UpOworICAgIHJldHVybiB0cnVlOworfQorCitNdHBSZXNwb25zZUNvZGUgTXRwU2VydmVyOjpkb0dldERldmljZUluZm8oKSB7CisgICAgTXRwU3RyaW5nQnVmZmVyICAgc3RyaW5nOworICAgIGNoYXIgcHJvcF92YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOworCisgICAgLy8gZmlsbCBpbiBkZXZpY2UgaW5mbworICAgIG1EYXRhLnB1dFVJbnQxNihNVFBfU1RBTkRBUkRfVkVSU0lPTik7CisgICAgbURhdGEucHV0VUludDMyKDYpOyAvLyBNVFAgVmVuZG9yIEV4dGVuc2lvbiBJRAorICAgIG1EYXRhLnB1dFVJbnQxNihNVFBfU1RBTkRBUkRfVkVSU0lPTik7CisgICAgc3RyaW5nLnNldCgibWljcm9zb2Z0LmNvbTogMS4wOyIpOworICAgIG1EYXRhLnB1dFN0cmluZyhzdHJpbmcpOyAvLyBNVFAgRXh0ZW5zaW9ucworICAgIG1EYXRhLnB1dFVJbnQxNigwKTsgLy9GdW5jdGlvbmFsIE1vZGUKKyAgICBtRGF0YS5wdXRBVUludDE2KGtTdXBwb3J0ZWRPcGVyYXRpb25Db2RlcywKKyAgICAgICAgICAgIHNpemVvZihrU3VwcG9ydGVkT3BlcmF0aW9uQ29kZXMpIC8gc2l6ZW9mKHVpbnQxNl90KSk7IC8vIE9wZXJhdGlvbnMgU3VwcG9ydGVkCisgICAgbURhdGEucHV0RW1wdHlBcnJheSgpOyAvLyBFdmVudHMgU3VwcG9ydGVkCisgICAgbURhdGEucHV0RW1wdHlBcnJheSgpOyAvLyBEZXZpY2UgUHJvcGVydGllcyBTdXBwb3J0ZWQKKyAgICBtRGF0YS5wdXRFbXB0eUFycmF5KCk7IC8vIENhcHR1cmUgRm9ybWF0cworICAgIG1EYXRhLnB1dEFVSW50MTYoa1N1cHBvcnRlZFBsYXliYWNrRm9ybWF0cywKKyAgICAgICAgICAgIHNpemVvZihrU3VwcG9ydGVkUGxheWJhY2tGb3JtYXRzKSAvIHNpemVvZih1aW50MTZfdCkpOyAvLyBQbGF5YmFjayBGb3JtYXRzCisgICAgLy8gRklYTUUKKyAgICBzdHJpbmcuc2V0KCJHb29nbGUsIEluYy4iKTsKKyAgICBtRGF0YS5wdXRTdHJpbmcoc3RyaW5nKTsgICAvLyBNYW51ZmFjdHVyZXIKKworICAgIHByb3BlcnR5X2dldCgicm8ucHJvZHVjdC5tb2RlbCIsIHByb3BfdmFsdWUsICJNVFAgRGV2aWNlIik7CisgICAgc3RyaW5nLnNldChwcm9wX3ZhbHVlKTsKKyAgICBtRGF0YS5wdXRTdHJpbmcoc3RyaW5nKTsgICAvLyBNb2RlbAorICAgIHN0cmluZy5zZXQoIjEuMCIpOworICAgIG1EYXRhLnB1dFN0cmluZyhzdHJpbmcpOyAgIC8vIERldmljZSBWZXJzaW9uCisKKyAgICBwcm9wZXJ0eV9nZXQoInJvLnNlcmlhbG5vIiwgcHJvcF92YWx1ZSwgIj8/Pz8/Pz8/Iik7CisgICAgc3RyaW5nLnNldChwcm9wX3ZhbHVlKTsKKyAgICBtRGF0YS5wdXRTdHJpbmcoc3RyaW5nKTsgICAvLyBTZXJpYWwgTnVtYmVyCisKKyAgICByZXR1cm4gTVRQX1JFU1BPTlNFX09LOworfQorCitNdHBSZXNwb25zZUNvZGUgTXRwU2VydmVyOjpkb09wZW5TZXNzaW9uKCkgeworICAgIGlmIChtU2Vzc2lvbk9wZW4pIHsKKyAgICAgICAgbVJlc3BvbnNlLnNldFBhcmFtZXRlcigxLCBtU2Vzc2lvbklEKTsKKyAgICAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9TRVNTSU9OX0FMUkVBRFlfT1BFTjsKKyAgICB9CisgICAgbVNlc3Npb25JRCA9IG1SZXF1ZXN0LmdldFBhcmFtZXRlcigxKTsKKyAgICBtU2Vzc2lvbk9wZW4gPSB0cnVlOworICAgIHJldHVybiBNVFBfUkVTUE9OU0VfT0s7Cit9CisKK010cFJlc3BvbnNlQ29kZSBNdHBTZXJ2ZXI6OmRvQ2xvc2VTZXNzaW9uKCkgeworICAgIGlmICghbVNlc3Npb25PcGVuKQorICAgICAgICByZXR1cm4gTVRQX1JFU1BPTlNFX1NFU1NJT05fTk9UX09QRU47CisgICAgbVNlc3Npb25JRCA9IDA7CisgICAgbVNlc3Npb25PcGVuID0gZmFsc2U7CisgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9PSzsKK30KKworTXRwUmVzcG9uc2VDb2RlIE10cFNlcnZlcjo6ZG9HZXRTdG9yYWdlSURzKCkgeworICAgIGlmICghbVNlc3Npb25PcGVuKQorICAgICAgICByZXR1cm4gTVRQX1JFU1BPTlNFX1NFU1NJT05fTk9UX09QRU47CisKKyAgICBpbnQgY291bnQgPSBtU3RvcmFnZXMuc2l6ZSgpOworICAgIG1EYXRhLnB1dFVJbnQzMihjb3VudCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorICAgICAgICBtRGF0YS5wdXRVSW50MzIobVN0b3JhZ2VzW2ldLT5nZXRTdG9yYWdlSUQoKSk7CisKKyAgICByZXR1cm4gTVRQX1JFU1BPTlNFX09LOworfQorCitNdHBSZXNwb25zZUNvZGUgTXRwU2VydmVyOjpkb0dldFN0b3JhZ2VJbmZvKCkgeworICAgIE10cFN0cmluZ0J1ZmZlciAgIHN0cmluZzsKKworICAgIGlmICghbVNlc3Npb25PcGVuKQorICAgICAgICByZXR1cm4gTVRQX1JFU1BPTlNFX1NFU1NJT05fTk9UX09QRU47CisgICAgTXRwU3RvcmFnZUlEIGlkID0gbVJlcXVlc3QuZ2V0UGFyYW1ldGVyKDEpOworICAgIE10cFN0b3JhZ2UqIHN0b3JhZ2UgPSBnZXRTdG9yYWdlKGlkKTsKKyAgICBpZiAoIXN0b3JhZ2UpCisgICAgICAgIHJldHVybiBNVFBfUkVTUE9OU0VfSU5WQUxJRF9TVE9SQUdFX0lEOworCisgICAgbURhdGEucHV0VUludDE2KHN0b3JhZ2UtPmdldFR5cGUoKSk7CisgICAgbURhdGEucHV0VUludDE2KHN0b3JhZ2UtPmdldEZpbGVTeXN0ZW1UeXBlKCkpOworICAgIG1EYXRhLnB1dFVJbnQxNihzdG9yYWdlLT5nZXRBY2Nlc3NDYXBhYmlsaXR5KCkpOworICAgIG1EYXRhLnB1dFVJbnQ2NChzdG9yYWdlLT5nZXRNYXhDYXBhY2l0eSgpKTsKKyAgICBtRGF0YS5wdXRVSW50NjQoc3RvcmFnZS0+Z2V0RnJlZVNwYWNlKCkpOworICAgIG1EYXRhLnB1dFVJbnQzMigxMDI0KjEwMjQqMTAyNCk7IC8vIEZyZWUgU3BhY2UgaW4gT2JqZWN0cworICAgIHN0cmluZy5zZXQoc3RvcmFnZS0+Z2V0RGVzY3JpcHRpb24oKSk7CisgICAgbURhdGEucHV0U3RyaW5nKHN0cmluZyk7CisgICAgbURhdGEucHV0RW1wdHlTdHJpbmcoKTsgICAvLyBWb2x1bWUgSWRlbnRpZmllcgorCisgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9PSzsKK30KKworTXRwUmVzcG9uc2VDb2RlIE10cFNlcnZlcjo6ZG9HZXRPYmplY3RQcm9wc1N1cHBvcnRlZCgpIHsKKyAgICBpZiAoIW1TZXNzaW9uT3BlbikKKyAgICAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9TRVNTSU9OX05PVF9PUEVOOworICAgIE10cE9iamVjdEZvcm1hdCBmb3JtYXQgPSBtUmVxdWVzdC5nZXRQYXJhbWV0ZXIoMSk7CisgICAgbURhdGEucHV0QVVJbnQxNihrU3VwcG9ydGVkT2JqZWN0UHJvcGVydGllcywKKyAgICAgICAgICAgIHNpemVvZihrU3VwcG9ydGVkT2JqZWN0UHJvcGVydGllcykgLyBzaXplb2YodWludDE2X3QpKTsKKyAgICByZXR1cm4gTVRQX1JFU1BPTlNFX09LOworfQorCitNdHBSZXNwb25zZUNvZGUgTXRwU2VydmVyOjpkb0dldE9iamVjdEhhbmRsZXMoKSB7CisgICAgaWYgKCFtU2Vzc2lvbk9wZW4pCisgICAgICAgIHJldHVybiBNVFBfUkVTUE9OU0VfU0VTU0lPTl9OT1RfT1BFTjsKKyAgICBNdHBTdG9yYWdlSUQgc3RvcmFnZUlEID0gbVJlcXVlc3QuZ2V0UGFyYW1ldGVyKDEpOyAgICAgIC8vIDB4RkZGRkZGRkYgZm9yIGFsbCBzdG9yYWdlCisgICAgTXRwT2JqZWN0Rm9ybWF0IGZvcm1hdCA9IG1SZXF1ZXN0LmdldFBhcmFtZXRlcigyKTsgICAgICAvLyAwIGZvciBhbGwgZm9ybWF0cworICAgIE10cE9iamVjdEhhbmRsZSBwYXJlbnQgPSBtUmVxdWVzdC5nZXRQYXJhbWV0ZXIoMyk7ICAgICAgLy8gMHhGRkZGRkZGRiBmb3Igb2JqZWN0cyB3aXRoIG5vIHBhcmVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMHgwMDAwMDAwMCBmb3IgYWxsIG9iamVjdHM/CisKKyAgICBNdHBPYmplY3RIYW5kbGVMaXN0KiBoYW5kbGVzID0gbURhdGFiYXNlLT5nZXRPYmplY3RMaXN0KHN0b3JhZ2VJRCwgZm9ybWF0LCBwYXJlbnQpOworICAgIG1EYXRhLnB1dEFVSW50MzIoaGFuZGxlcyk7CisgICAgZGVsZXRlIGhhbmRsZXM7CisgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9PSzsKK30KKworTXRwUmVzcG9uc2VDb2RlIE10cFNlcnZlcjo6ZG9HZXRPYmplY3RQcm9wVmFsdWUoKSB7CisgICAgTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSA9IG1SZXF1ZXN0LmdldFBhcmFtZXRlcigxKTsKKyAgICBNdHBPYmplY3RQcm9wZXJ0eSBwcm9wZXJ0eSA9IG1SZXF1ZXN0LmdldFBhcmFtZXRlcigyKTsKKworICAgIHJldHVybiBtRGF0YWJhc2UtPmdldE9iamVjdFByb3BlcnR5KGhhbmRsZSwgcHJvcGVydHksIG1EYXRhKTsKK30KKworTXRwUmVzcG9uc2VDb2RlIE10cFNlcnZlcjo6ZG9HZXRPYmplY3RJbmZvKCkgeworICAgIE10cE9iamVjdEhhbmRsZSBoYW5kbGUgPSBtUmVxdWVzdC5nZXRQYXJhbWV0ZXIoMSk7CisgICAgcmV0dXJuIG1EYXRhYmFzZS0+Z2V0T2JqZWN0SW5mbyhoYW5kbGUsIG1EYXRhKTsKK30KKworTXRwUmVzcG9uc2VDb2RlIE10cFNlcnZlcjo6ZG9HZXRPYmplY3QoKSB7CisgICAgTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSA9IG1SZXF1ZXN0LmdldFBhcmFtZXRlcigxKTsKKyAgICBNdHBTdHJpbmcgcGF0aEJ1ZjsKKyAgICBpbnQ2NF90IGZpbGVMZW5ndGg7CisgICAgaWYgKCFtRGF0YWJhc2UtPmdldE9iamVjdEZpbGVQYXRoKGhhbmRsZSwgcGF0aEJ1ZiwgZmlsZUxlbmd0aCkpCisgICAgICAgIHJldHVybiBNVFBfUkVTUE9OU0VfSU5WQUxJRF9PQkpFQ1RfSEFORExFOworICAgIGNvbnN0IGNoYXIqIGZpbGVQYXRoID0gKGNvbnN0IGNoYXIgKilwYXRoQnVmOworCisgICAgbXRwX2ZpbGVfcmFuZ2UgIG1mcjsKKyAgICBtZnIuZmQgPSBvcGVuKGZpbGVQYXRoLCBPX1JET05MWSk7CisgICAgaWYgKG1mci5mZCA8IDApIHsKKyAgICAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9HRU5FUkFMX0VSUk9SOworICAgIH0KKyAgICBtZnIub2Zmc2V0ID0gMDsKKyAgICBtZnIubGVuZ3RoID0gZmlsZUxlbmd0aDsKKworICAgIC8vIHNlbmQgZGF0YSBoZWFkZXIKKyAgICBtRGF0YS5zZXRPcGVyYXRpb25Db2RlKG1SZXF1ZXN0LmdldE9wZXJhdGlvbkNvZGUoKSk7CisgICAgbURhdGEuc2V0VHJhbnNhY3Rpb25JRChtUmVxdWVzdC5nZXRUcmFuc2FjdGlvbklEKCkpOworICAgIG1EYXRhLndyaXRlRGF0YUhlYWRlcihtRkQsIGZpbGVMZW5ndGgpOworCisgICAgLy8gdGhlbiB0cmFuc2ZlciB0aGUgZmlsZQorICAgIGludCByZXQgPSBpb2N0bChtRkQsIE1UUF9TRU5EX0ZJTEUsICh1bnNpZ25lZCBsb25nKSZtZnIpOworICAgIGNsb3NlKG1mci5mZCk7CisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgaWYgKGVycm5vID09IEVDQU5DRUxFRCkKKyAgICAgICAgICAgIHJldHVybiBNVFBfUkVTUE9OU0VfVFJBTlNBQ1RJT05fQ0FOQ0VMTEVEOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gTVRQX1JFU1BPTlNFX0dFTkVSQUxfRVJST1I7CisgICAgfQorICAgIHJldHVybiBNVFBfUkVTUE9OU0VfT0s7Cit9CisKK010cFJlc3BvbnNlQ29kZSBNdHBTZXJ2ZXI6OmRvU2VuZE9iamVjdEluZm8oKSB7CisgICAgTXRwU3RyaW5nIHBhdGg7CisgICAgTXRwU3RvcmFnZUlEIHN0b3JhZ2VJRCA9IG1SZXF1ZXN0LmdldFBhcmFtZXRlcigxKTsKKyAgICBNdHBTdG9yYWdlKiBzdG9yYWdlID0gZ2V0U3RvcmFnZShzdG9yYWdlSUQpOworICAgIE10cE9iamVjdEhhbmRsZSBwYXJlbnQgPSBtUmVxdWVzdC5nZXRQYXJhbWV0ZXIoMik7CisgICAgaWYgKCFzdG9yYWdlKQorICAgICAgICByZXR1cm4gTVRQX1JFU1BPTlNFX0lOVkFMSURfU1RPUkFHRV9JRDsKKworICAgIC8vIHNwZWNpYWwgY2FzZSB0aGUgcm9vdAorICAgIGlmIChwYXJlbnQgPT0gTVRQX1BBUkVOVF9ST09UKQorICAgICAgICBwYXRoID0gc3RvcmFnZS0+Z2V0UGF0aCgpOworICAgIGVsc2UgeworICAgICAgICBpbnQ2NF90IGR1bW15OworICAgICAgICBpZiAoIW1EYXRhYmFzZS0+Z2V0T2JqZWN0RmlsZVBhdGgocGFyZW50LCBwYXRoLCBkdW1teSkpCisgICAgICAgICAgICByZXR1cm4gTVRQX1JFU1BPTlNFX0lOVkFMSURfT0JKRUNUX0hBTkRMRTsKKyAgICB9CisKKyAgICAvLyByZWFkIG9ubHkgdGhlIGZpZWxkcyB3ZSBuZWVkCisgICAgbURhdGEuZ2V0VUludDMyKCk7ICAvLyBzdG9yYWdlIElECisgICAgTXRwT2JqZWN0Rm9ybWF0IGZvcm1hdCA9IG1EYXRhLmdldFVJbnQxNigpOworICAgIG1EYXRhLmdldFVJbnQxNigpOyAgLy8gcHJvdGVjdGlvbiBzdGF0dXMKKyAgICBtU2VuZE9iamVjdEZpbGVTaXplID0gbURhdGEuZ2V0VUludDMyKCk7CisgICAgbURhdGEuZ2V0VUludDE2KCk7ICAvLyB0aHVtYiBmb3JtYXQKKyAgICBtRGF0YS5nZXRVSW50MzIoKTsgIC8vIHRodW1iIGNvbXByZXNzZWQgc2l6ZQorICAgIG1EYXRhLmdldFVJbnQzMigpOyAgLy8gdGh1bWIgcGl4IHdpZHRoCisgICAgbURhdGEuZ2V0VUludDMyKCk7ICAvLyB0aHVtYiBwaXggaGVpZ2h0CisgICAgbURhdGEuZ2V0VUludDMyKCk7ICAvLyBpbWFnZSBwaXggd2lkdGgKKyAgICBtRGF0YS5nZXRVSW50MzIoKTsgIC8vIGltYWdlIHBpeCBoZWlnaHQKKyAgICBtRGF0YS5nZXRVSW50MzIoKTsgIC8vIGltYWdlIGJpdCBkZXB0aAorICAgIG1EYXRhLmdldFVJbnQzMigpOyAgLy8gcGFyZW50CisgICAgdWludDE2X3QgYXNzb2NpYXRpb25UeXBlID0gbURhdGEuZ2V0VUludDE2KCk7CisgICAgdWludDMyX3QgYXNzb2NpYXRpb25EZXNjID0gbURhdGEuZ2V0VUludDMyKCk7ICAgLy8gYXNzb2NpYXRpb24gZGVzYworICAgIG1EYXRhLmdldFVJbnQzMigpOyAgLy8gc2VxdWVuY2UgbnVtYmVyCisgICAgTXRwU3RyaW5nQnVmZmVyIG5hbWUsIGNyZWF0ZWQsIG1vZGlmaWVkOworICAgIG1EYXRhLmdldFN0cmluZyhuYW1lKTsgICAgLy8gZmlsZSBuYW1lCisgICAgbURhdGEuZ2V0U3RyaW5nKGNyZWF0ZWQpOyAgICAgIC8vIGRhdGUgY3JlYXRlZAorICAgIG1EYXRhLmdldFN0cmluZyhtb2RpZmllZCk7ICAgICAvLyBkYXRlIG1vZGlmaWVkCisgICAgLy8ga2V5d29yZHMgZm9sbG93CisKKyAgICB0aW1lX3QgbW9kaWZpZWRUaW1lOworICAgIGlmICghcGFyc2VEYXRlVGltZShtb2RpZmllZCwgbW9kaWZpZWRUaW1lKSkKKyAgICAgICAgbW9kaWZpZWRUaW1lID0gMDsKK3ByaW50ZigiU2VuZE9iamVjdEluZm8gZm9ybWF0OiAlMDRYIHNpemU6ICVkIG5hbWU6ICVzLCBjcmVhdGVkOiAlcywgbW9kaWZpZWQ6ICVzXG4iLAorZm9ybWF0LCBtU2VuZE9iamVjdEZpbGVTaXplLCAoY29uc3QgY2hhciopbmFtZSwgKGNvbnN0IGNoYXIqKWNyZWF0ZWQsIChjb25zdCBjaGFyKiltb2RpZmllZCk7CisKKyAgICBpZiAocGF0aFtwYXRoLnNpemUoKSAtIDFdICE9ICcvJykKKyAgICAgICAgcGF0aCArPSAiLyI7CisgICAgcGF0aCArPSAoY29uc3QgY2hhciAqKW5hbWU7CisKKyAgICBtRGF0YWJhc2UtPmJlZ2luVHJhbnNhY3Rpb24oKTsKKyAgICBNdHBPYmplY3RIYW5kbGUgaGFuZGxlID0gbURhdGFiYXNlLT5hZGRGaWxlKChjb25zdCBjaGFyKilwYXRoLCBmb3JtYXQsIHBhcmVudCwgc3RvcmFnZUlELCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TZW5kT2JqZWN0RmlsZVNpemUsIG1vZGlmaWVkVGltZSk7CisgICAgaWYgKGhhbmRsZSA9PSBrSW52YWxpZE9iamVjdEhhbmRsZSkgeworICAgICAgICBtRGF0YWJhc2UtPnJvbGxiYWNrVHJhbnNhY3Rpb24oKTsKKyAgICAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9HRU5FUkFMX0VSUk9SOworICAgIH0KKyAgICB1aW50MzJfdCB0YWJsZSA9IE10cERhdGFiYXNlOjpnZXRUYWJsZUZvckZpbGUoZm9ybWF0KTsKKyAgICBpZiAodGFibGUgPT0ga09iamVjdEhhbmRsZVRhYmxlQXVkaW8pCisgICAgICAgIGhhbmRsZSA9IG1EYXRhYmFzZS0+YWRkQXVkaW9GaWxlKGhhbmRsZSk7CisgICAgbURhdGFiYXNlLT5jb21taXRUcmFuc2FjdGlvbigpOworCisgIGlmIChmb3JtYXQgPT0gTVRQX0ZPUk1BVF9BU1NPQ0lBVElPTikgeworICAgICAgICBtb2RlX3QgbWFzayA9IHVtYXNrKDApOworICAgICAgICBpbnQgcmV0ID0gbWtkaXIoKGNvbnN0IGNoYXIgKilwYXRoLCBTX0lSV1hVIHwgU19JUldYRyB8IFNfSVJXWE8pOworICAgICAgICB1bWFzayhtYXNrKTsKKyAgICAgICAgaWYgKHJldCAmJiByZXQgIT0gLUVFWElTVCkKKyAgICAgICAgICAgIHJldHVybiBNVFBfUkVTUE9OU0VfR0VORVJBTF9FUlJPUjsKKyAgICB9IGVsc2UgeworICAgICAgICBtU2VuZE9iamVjdEZpbGVQYXRoID0gcGF0aDsKKyAgICAgICAgLy8gc2F2ZSB0aGUgaGFuZGxlIGZvciB0aGUgU2VuZE9iamVjdCBjYWxsLCB3aGljaCBzaG91bGQgZm9sbG93CisgICAgICAgIG1TZW5kT2JqZWN0SGFuZGxlID0gaGFuZGxlOworICAgIH0KKworICAgIG1SZXNwb25zZS5zZXRQYXJhbWV0ZXIoMSwgc3RvcmFnZUlEKTsKKyAgICBtUmVzcG9uc2Uuc2V0UGFyYW1ldGVyKDIsIHBhcmVudCk7CisgICAgbVJlc3BvbnNlLnNldFBhcmFtZXRlcigzLCBoYW5kbGUpOworCisgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9PSzsKK30KKworTXRwUmVzcG9uc2VDb2RlIE10cFNlcnZlcjo6ZG9TZW5kT2JqZWN0KCkgeworICAgIGlmIChtU2VuZE9iamVjdEhhbmRsZSA9PSBrSW52YWxpZE9iamVjdEhhbmRsZSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkV4cGVjdGVkIFNlbmRPYmplY3RJbmZvIGJlZm9yZSBTZW5kT2JqZWN0XG4iKTsKKyAgICAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9OT19WQUxJRF9PQkpFQ1RfSU5GTzsKKyAgICB9CisKKyAgICAvLyByZWFkIHRoZSBoZWFkZXIKKyAgICBpbnQgcmV0ID0gbURhdGEucmVhZERhdGFIZWFkZXIobUZEKTsKKyAgICAvLyBGSVhNRSAtIGNoZWNrIGZvciBlcnJvcnMgaGVyZS4KKworICAgIC8vIHJlc2V0IHNvIHdlIGRvbid0IGF0dGVtcHQgdG8gc2VuZCB0aGlzIGJhY2sKKyAgICBtRGF0YS5yZXNldCgpOworCisgICAgbXRwX2ZpbGVfcmFuZ2UgIG1mcjsKKyAgICBtZnIuZmQgPSBvcGVuKG1TZW5kT2JqZWN0RmlsZVBhdGgsIE9fUkRXUiB8IE9fQ1JFQVQgfCBPX1RSVU5DKTsKKyAgICBpZiAobWZyLmZkIDwgMCkgeworICAgICAgICByZXR1cm4gTVRQX1JFU1BPTlNFX0dFTkVSQUxfRVJST1I7CisgICAgfQorICAgIG1mci5vZmZzZXQgPSAwOworICAgIG1mci5sZW5ndGggPSBtU2VuZE9iamVjdEZpbGVTaXplOworCisgICAgLy8gdHJhbnNmZXIgdGhlIGZpbGUKKyAgICByZXQgPSBpb2N0bChtRkQsIE1UUF9SRUNFSVZFX0ZJTEUsICh1bnNpZ25lZCBsb25nKSZtZnIpOworICAgIGNsb3NlKG1mci5mZCk7CisgICAgLy8gRklYTUUgLSB3ZSBuZWVkIHRvIGRlbGV0ZSBtU2VuZE9iamVjdEhhbmRsZSBmcm9tIHRoZSBkYXRhYmFzZSBpZiB0aGlzIGZhaWxzLgorICAgIHByaW50ZigiTVRQX1JFQ0VJVkVfRklMRSByZXR1cm5lZCAlZFxuIiwgcmV0KTsKKyAgICBtU2VuZE9iamVjdEhhbmRsZSA9IGtJbnZhbGlkT2JqZWN0SGFuZGxlOworCisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgdW5saW5rKG1TZW5kT2JqZWN0RmlsZVBhdGgpOworICAgICAgICBpZiAoZXJybm8gPT0gRUNBTkNFTEVEKQorICAgICAgICAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9UUkFOU0FDVElPTl9DQU5DRUxMRUQ7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBNVFBfUkVTUE9OU0VfR0VORVJBTF9FUlJPUjsKKyAgICB9CisgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9PSzsKK30KKworTXRwUmVzcG9uc2VDb2RlIE10cFNlcnZlcjo6ZG9EZWxldGVPYmplY3QoKSB7CisgICAgTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSA9IG1SZXF1ZXN0LmdldFBhcmFtZXRlcigxKTsKKyAgICBNdHBPYmplY3RGb3JtYXQgZm9ybWF0ID0gbVJlcXVlc3QuZ2V0UGFyYW1ldGVyKDEpOworICAgIC8vIEZJWE1FIC0gc3VwcG9ydCBkZWxldGluZyBhbGwgb2JqZWN0cyBpZiBoYW5kbGUgaXMgMHhGRkZGRkZGRgorICAgIC8vIEZJWE1FIC0gaW1wbGVtZW50IGRlbGV0aW5nIG9iamVjdHMgYnkgZm9ybWF0CisgICAgLy8gRklYTUUgLSBoYW5kbGUgbm9uLWVtcHR5IGRpcmVjdG9yaWVzCisKKyAgICBNdHBTdHJpbmcgZmlsZVBhdGg7CisgICAgaW50NjRfdCBmaWxlTGVuZ3RoOworICAgIGlmICghbURhdGFiYXNlLT5nZXRPYmplY3RGaWxlUGF0aChoYW5kbGUsIGZpbGVQYXRoLCBmaWxlTGVuZ3RoKSkKKyAgICAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9JTlZBTElEX09CSkVDVF9IQU5ETEU7CisKK3ByaW50ZigiZGVsZXRpbmcgJXNcbiIsIChjb25zdCBjaGFyICopZmlsZVBhdGgpOworICAgIC8vIG9uZSBvZiB0aGVzZSBzaG91bGQgd29yaworICAgIHJtZGlyKChjb25zdCBjaGFyICopZmlsZVBhdGgpOworICAgIHVubGluaygoY29uc3QgY2hhciAqKWZpbGVQYXRoKTsKKworICAgIG1EYXRhYmFzZS0+ZGVsZXRlRmlsZShoYW5kbGUpOworCisgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9PSzsKK30KKworTXRwUmVzcG9uc2VDb2RlIE10cFNlcnZlcjo6ZG9HZXRPYmplY3RQcm9wRGVzYygpIHsKKyAgICBNdHBPYmplY3RQcm9wZXJ0eSBwcm9wZXJ0eSA9IG1SZXF1ZXN0LmdldFBhcmFtZXRlcigxKTsKKyAgICBNdHBPYmplY3RGb3JtYXQgZm9ybWF0ID0gbVJlcXVlc3QuZ2V0UGFyYW1ldGVyKDIpOworCisgICAgcmV0dXJuIC0xOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cFNlcnZlci5oIGIvbWVkaWEvbXRwL010cFNlcnZlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwZjNjNTIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdHAvTXRwU2VydmVyLmgKQEAgLTAsMCArMSw5MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX01UUF9TRVJWRVJfSAorI2RlZmluZSBfTVRQX1NFUlZFUl9ICisKKyNpbmNsdWRlICJNdHBSZXF1ZXN0UGFja2V0LmgiCisjaW5jbHVkZSAiTXRwRGF0YVBhY2tldC5oIgorI2luY2x1ZGUgIk10cFJlc3BvbnNlUGFja2V0LmgiCisjaW5jbHVkZSAibXRwLmgiCisKKyNpbmNsdWRlICJNdHBVdGlscy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIE10cFN0b3JhZ2U7CitjbGFzcyBNdHBEYXRhYmFzZTsKKworY2xhc3MgTXRwU2VydmVyIHsKKworcHJpdmF0ZToKKyAgICAvLyBmaWxlIGRlc2NyaXB0b3IgZm9yIE1UUCBrZXJuZWwgZHJpdmVyCisgICAgaW50ICAgICAgICAgICAgICAgICBtRkQ7CisKKyAgICAvLyBwYXRoIHRvIG91ciBzcWxpdGUzIGRhdGFiYXNlCisgICAgY29uc3QgY2hhciogICAgICAgICBtRGF0YWJhc2VQYXRoOworCisgICAgTXRwRGF0YWJhc2UqICAgICAgICBtRGF0YWJhc2U7CisKKyAgICAvLyBjdXJyZW50IHNlc3Npb24gSUQKKyAgICBNdHBTZXNzaW9uSUQgICAgICAgIG1TZXNzaW9uSUQ7CisgICAgLy8gdHJ1ZSBpZiB3ZSBoYXZlIGFuIG9wZW4gc2Vzc2lvbiBhbmQgbVNlc3Npb25JRCBpcyB2YWxpZAorICAgIGJvb2wgICAgICAgICAgICAgICAgbVNlc3Npb25PcGVuOworCisgICAgTXRwUmVxdWVzdFBhY2tldCAgICBtUmVxdWVzdDsKKyAgICBNdHBEYXRhUGFja2V0ICAgICAgIG1EYXRhOworICAgIE10cFJlc3BvbnNlUGFja2V0ICAgbVJlc3BvbnNlOworCisgICAgTXRwU3RvcmFnZUxpc3QgICAgICBtU3RvcmFnZXM7CisKKyAgICAvLyBoYW5kbGUgZm9yIG5ldyBvYmplY3QsIHNldCBieSBTZW5kT2JqZWN0SW5mbyBhbmQgdXNlZCBieSBTZW5kT2JqZWN0CisgICAgTXRwT2JqZWN0SGFuZGxlICAgICBtU2VuZE9iamVjdEhhbmRsZTsKKyAgICBNdHBTdHJpbmcgICAgICAgICAgIG1TZW5kT2JqZWN0RmlsZVBhdGg7CisgICAgc2l6ZV90ICAgICAgICAgICAgICBtU2VuZE9iamVjdEZpbGVTaXplOworCitwdWJsaWM6CisgICAgICAgICAgICAgICAgICAgICAgICBNdHBTZXJ2ZXIoaW50IGZkLCBjb25zdCBjaGFyKiBkYXRhYmFzZVBhdGgpOworICAgIHZpcnR1YWwgICAgICAgICAgICAgfk10cFNlcnZlcigpOworCisgICAgdm9pZCAgICAgICAgICAgICAgICBhZGRTdG9yYWdlKGNvbnN0IGNoYXIqIGZpbGVQYXRoKTsKKyAgICBpbmxpbmUgdm9pZCAgICAgICAgIGFkZFN0b3JhZ2UoTXRwU3RvcmFnZSogc3RvcmFnZSkgeyBtU3RvcmFnZXMucHVzaChzdG9yYWdlKTsgfQorICAgIE10cFN0b3JhZ2UqICAgICAgICAgZ2V0U3RvcmFnZShNdHBTdG9yYWdlSUQgaWQpOworICAgIHZvaWQgICAgICAgICAgICAgICAgc2NhblN0b3JhZ2UoKTsKKyAgICB2b2lkICAgICAgICAgICAgICAgIHJ1bigpOworCitwcml2YXRlOgorICAgIGJvb2wgICAgICAgICAgICAgICAgaGFuZGxlUmVxdWVzdCgpOworCisgICAgTXRwUmVzcG9uc2VDb2RlICAgICBkb0dldERldmljZUluZm8oKTsKKyAgICBNdHBSZXNwb25zZUNvZGUgICAgIGRvT3BlblNlc3Npb24oKTsKKyAgICBNdHBSZXNwb25zZUNvZGUgICAgIGRvQ2xvc2VTZXNzaW9uKCk7CisgICAgTXRwUmVzcG9uc2VDb2RlICAgICBkb0dldFN0b3JhZ2VJRHMoKTsKKyAgICBNdHBSZXNwb25zZUNvZGUgICAgIGRvR2V0U3RvcmFnZUluZm8oKTsKKyAgICBNdHBSZXNwb25zZUNvZGUgICAgIGRvR2V0T2JqZWN0UHJvcHNTdXBwb3J0ZWQoKTsKKyAgICBNdHBSZXNwb25zZUNvZGUgICAgIGRvR2V0T2JqZWN0SGFuZGxlcygpOworICAgIE10cFJlc3BvbnNlQ29kZSAgICAgZG9HZXRPYmplY3RQcm9wVmFsdWUoKTsKKyAgICBNdHBSZXNwb25zZUNvZGUgICAgIGRvR2V0T2JqZWN0SW5mbygpOworICAgIE10cFJlc3BvbnNlQ29kZSAgICAgZG9HZXRPYmplY3QoKTsKKyAgICBNdHBSZXNwb25zZUNvZGUgICAgIGRvU2VuZE9iamVjdEluZm8oKTsKKyAgICBNdHBSZXNwb25zZUNvZGUgICAgIGRvU2VuZE9iamVjdCgpOworICAgIE10cFJlc3BvbnNlQ29kZSAgICAgZG9EZWxldGVPYmplY3QoKTsKKyAgICBNdHBSZXNwb25zZUNvZGUgICAgIGRvR2V0T2JqZWN0UHJvcERlc2MoKTsKK307CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBfTVRQX1NFUlZFUl9ICmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwU3RvcmFnZS5jcHAgYi9tZWRpYS9tdHAvTXRwU3RvcmFnZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQyMzc2ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL210cC9NdHBTdG9yYWdlLmNwcApAQCAtMCwwICsxLDgzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIk10cERhdGFiYXNlLmgiCisjaW5jbHVkZSAiTXRwU3RvcmFnZS5oIgorI2luY2x1ZGUgIk10cE1lZGlhU2Nhbm5lci5oIgorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdGZzLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZGlyZW50Lmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK010cFN0b3JhZ2U6Ok10cFN0b3JhZ2UoTXRwU3RvcmFnZUlEIGlkLCBjb25zdCBjaGFyKiBmaWxlUGF0aCwgTXRwRGF0YWJhc2UqIGRiKQorICAgIDogICBtU3RvcmFnZUlEKGlkKSwKKyAgICAgICAgbUZpbGVQYXRoKGZpbGVQYXRoKSwKKyAgICAgICAgbURhdGFiYXNlKGRiKSwKKyAgICAgICAgbU1heENhcGFjaXR5KDApCit7CisgICAgcHJpbnRmKCJNdHBTdG9yYWdlIGlkOiAlZCBwYXRoOiAlc1xuIiwgaWQsIGZpbGVQYXRoKTsKK30KKworTXRwU3RvcmFnZTo6fk10cFN0b3JhZ2UoKSB7Cit9CisKK2ludCBNdHBTdG9yYWdlOjpnZXRUeXBlKCkgY29uc3QgeworICAgIHJldHVybiBNVFBfU1RPUkFHRV9GSVhFRF9SQU07Cit9CisKK2ludCBNdHBTdG9yYWdlOjpnZXRGaWxlU3lzdGVtVHlwZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gTVRQX1NUT1JBR0VfRklMRVNZU1RFTV9ISUVSQVJDSElDQUw7Cit9CisKK2ludCBNdHBTdG9yYWdlOjpnZXRBY2Nlc3NDYXBhYmlsaXR5KCkgY29uc3QgeworICAgIHJldHVybiBNVFBfU1RPUkFHRV9SRUFEX1dSSVRFOworfQorCit1aW50NjRfdCBNdHBTdG9yYWdlOjpnZXRNYXhDYXBhY2l0eSgpIHsKKyAgICBpZiAobU1heENhcGFjaXR5ID09IDApIHsKKyAgICAgICAgc3RydWN0IHN0YXRmcyAgIHN0YXQ7CisgICAgICAgIGlmIChzdGF0ZnMobUZpbGVQYXRoLCAmc3RhdCkpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIG1NYXhDYXBhY2l0eSA9ICh1aW50NjRfdClzdGF0LmZfYmxvY2tzICogKHVpbnQ2NF90KXN0YXQuZl9ic2l6ZTsKKyAgICB9CisgICAgcmV0dXJuIG1NYXhDYXBhY2l0eTsKK30KKwordWludDY0X3QgTXRwU3RvcmFnZTo6Z2V0RnJlZVNwYWNlKCkgeworICAgIHN0cnVjdCBzdGF0ZnMgICBzdGF0OworICAgIGlmIChzdGF0ZnMobUZpbGVQYXRoLCAmc3RhdCkpCisgICAgICAgIHJldHVybiAtMTsKKyAgICByZXR1cm4gKHVpbnQ2NF90KXN0YXQuZl9iYXZhaWwgKiAodWludDY0X3Qpc3RhdC5mX2JzaXplOworfQorCitjb25zdCBjaGFyKiBNdHBTdG9yYWdlOjpnZXREZXNjcmlwdGlvbigpIGNvbnN0IHsKKyAgICByZXR1cm4gIkRldmljZSBTdG9yYWdlIjsKK30KKworYm9vbCBNdHBTdG9yYWdlOjpzY2FuRmlsZXMoKSB7CisgICAgTXRwTWVkaWFTY2FubmVyIHNjYW5uZXIobVN0b3JhZ2VJRCwgbUZpbGVQYXRoLCBtRGF0YWJhc2UpOworICAgIHJldHVybiBzY2FubmVyLnNjYW5GaWxlcygpOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cFN0b3JhZ2UuaCBiL21lZGlhL210cC9NdHBTdG9yYWdlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjA5NzI3MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL210cC9NdHBTdG9yYWdlLmgKQEAgLTAsMCArMSw1MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX01UUF9TVE9SQUdFX0gKKyNkZWZpbmUgX01UUF9TVE9SQUdFX0gKKworI2luY2x1ZGUgIm10cC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIE10cERhdGFiYXNlOworY2xhc3MgU3FsaXRlU3RhdGVtZW50OworCitjbGFzcyBNdHBTdG9yYWdlIHsKKworcHJpdmF0ZToKKyAgICBNdHBTdG9yYWdlSUQgICAgICAgICAgICBtU3RvcmFnZUlEOworICAgIGNvbnN0IGNoYXIqICAgICAgICAgICAgIG1GaWxlUGF0aDsKKyAgICBNdHBEYXRhYmFzZSogICAgICAgICAgICBtRGF0YWJhc2U7CisgICAgdWludDY0X3QgICAgICAgICAgICAgICAgbU1heENhcGFjaXR5OworCitwdWJsaWM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwU3RvcmFnZShNdHBTdG9yYWdlSUQgaWQsIGNvbnN0IGNoYXIqIGZpbGVQYXRoLCBNdHBEYXRhYmFzZSogZGIpOworICAgIHZpcnR1YWwgICAgICAgICAgICAgICAgIH5NdHBTdG9yYWdlKCk7CisKKyAgICBpbmxpbmUgTXRwU3RvcmFnZUlEICAgICBnZXRTdG9yYWdlSUQoKSBjb25zdCB7IHJldHVybiBtU3RvcmFnZUlEOyB9CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgZ2V0VHlwZSgpIGNvbnN0OworICAgIGludCAgICAgICAgICAgICAgICAgICAgIGdldEZpbGVTeXN0ZW1UeXBlKCkgY29uc3Q7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgZ2V0QWNjZXNzQ2FwYWJpbGl0eSgpIGNvbnN0OworICAgIHVpbnQ2NF90ICAgICAgICAgICAgICAgIGdldE1heENhcGFjaXR5KCk7CisgICAgdWludDY0X3QgICAgICAgICAgICAgICAgZ2V0RnJlZVNwYWNlKCk7CisgICAgY29uc3QgY2hhciogICAgICAgICAgICAgZ2V0RGVzY3JpcHRpb24oKSBjb25zdDsKKyAgICBpbmxpbmUgY29uc3QgY2hhciogICAgICBnZXRQYXRoKCkgY29uc3QgeyByZXR1cm4gbUZpbGVQYXRoOyB9CisKKyAgICBib29sICAgICAgICAgICAgICAgICAgICBzY2FuRmlsZXMoKTsKK307CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBfTVRQX1NUT1JBR0VfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cFN0b3JhZ2VJbmZvLmNwcCBiL21lZGlhL210cC9NdHBTdG9yYWdlSW5mby5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWE1MzA2YgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL210cC9NdHBTdG9yYWdlSW5mby5jcHAKQEAgLTAsMCArMSw3MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiTXRwU3RvcmFnZUluZm8iCisjaW5jbHVkZSAidXRpbHMvTG9nLmgiCisKKyNpbmNsdWRlICJNdHBEYXRhUGFja2V0LmgiCisjaW5jbHVkZSAiTXRwU3RvcmFnZUluZm8uaCIKKyNpbmNsdWRlICJNdHBTdHJpbmdCdWZmZXIuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitNdHBTdG9yYWdlSW5mbzo6TXRwU3RvcmFnZUluZm8oTXRwU3RvcmFnZUlEIGlkKQorICAgIDogICBtU3RvcmFnZUlEKGlkKSwKKyAgICAgICAgbVN0b3JhZ2VUeXBlKDApLAorICAgICAgICBtRmlsZVN5c3RlbVR5cGUoMCksCisgICAgICAgIG1BY2Nlc3NDYXBhYmlsaXR5KDApLAorICAgICAgICBtTWF4Q2FwYWNpdHkoMCksCisgICAgICAgIG1GcmVlU3BhY2VCeXRlcygwKSwKKyAgICAgICAgbUZyZWVTcGFjZU9iamVjdHMoMCksCisgICAgICAgIG1TdG9yYWdlRGVzY3JpcHRpb24oTlVMTCksCisgICAgICAgIG1Wb2x1bWVJZGVudGlmaWVyKE5VTEwpCit7Cit9CisKK010cFN0b3JhZ2VJbmZvOjp+TXRwU3RvcmFnZUluZm8oKSB7CisgICAgaWYgKG1TdG9yYWdlRGVzY3JpcHRpb24pCisgICAgICAgIGZyZWUobVN0b3JhZ2VEZXNjcmlwdGlvbik7CisgICAgaWYgKG1Wb2x1bWVJZGVudGlmaWVyKQorICAgICAgICBmcmVlKG1Wb2x1bWVJZGVudGlmaWVyKTsKK30KKwordm9pZCBNdHBTdG9yYWdlSW5mbzo6cmVhZChNdHBEYXRhUGFja2V0JiBwYWNrZXQpIHsKKyAgICBNdHBTdHJpbmdCdWZmZXIgc3RyaW5nOworCisgICAgLy8gcmVhZCB0aGUgZGV2aWNlIGluZm8KKyAgICBtU3RvcmFnZVR5cGUgPSBwYWNrZXQuZ2V0VUludDE2KCk7CisgICAgbUZpbGVTeXN0ZW1UeXBlID0gcGFja2V0LmdldFVJbnQxNigpOworICAgIG1BY2Nlc3NDYXBhYmlsaXR5ID0gcGFja2V0LmdldFVJbnQxNigpOworICAgIG1NYXhDYXBhY2l0eSA9IHBhY2tldC5nZXRVSW50NjQoKTsKKyAgICBtRnJlZVNwYWNlQnl0ZXMgPSBwYWNrZXQuZ2V0VUludDY0KCk7CisgICAgbUZyZWVTcGFjZU9iamVjdHMgPSBwYWNrZXQuZ2V0VUludDMyKCk7CisKKyAgICBwYWNrZXQuZ2V0U3RyaW5nKHN0cmluZyk7CisgICAgbVN0b3JhZ2VEZXNjcmlwdGlvbiA9IHN0cmR1cCgoY29uc3QgY2hhciAqKXN0cmluZyk7CisgICAgcGFja2V0LmdldFN0cmluZyhzdHJpbmcpOworICAgIG1Wb2x1bWVJZGVudGlmaWVyID0gc3RyZHVwKChjb25zdCBjaGFyICopc3RyaW5nKTsKK30KKwordm9pZCBNdHBTdG9yYWdlSW5mbzo6cHJpbnQoKSB7CisgICAgTE9HRCgiU3RvcmFnZSBJbmZvICUwOFg6XG5cdG1TdG9yYWdlVHlwZTogJWRcblx0bUZpbGVTeXN0ZW1UeXBlOiAlZFxuXHRtQWNjZXNzQ2FwYWJpbGl0eTogJWRcbiIsCisgICAgICAgICAgICBtU3RvcmFnZUlELCBtU3RvcmFnZVR5cGUsIG1GaWxlU3lzdGVtVHlwZSwgbUFjY2Vzc0NhcGFiaWxpdHkpOworICAgIExPR0QoIlx0bU1heENhcGFjaXR5OiAlbGxkXG5cdG1GcmVlU3BhY2VCeXRlczogJWxsZFxuXHRtRnJlZVNwYWNlT2JqZWN0czogJWRcbiIsCisgICAgICAgICAgICBtTWF4Q2FwYWNpdHksIG1GcmVlU3BhY2VCeXRlcywgbUZyZWVTcGFjZU9iamVjdHMpOworICAgIExPR0QoIlx0bVN0b3JhZ2VEZXNjcmlwdGlvbjogJXNcblx0bVZvbHVtZUlkZW50aWZpZXI6ICVzXG4iLAorICAgICAgICAgICAgbVN0b3JhZ2VEZXNjcmlwdGlvbiwgbVZvbHVtZUlkZW50aWZpZXIpOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cFN0b3JhZ2VJbmZvLmggYi9tZWRpYS9tdHAvTXRwU3RvcmFnZUluZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yY2I2MjZlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXRwL010cFN0b3JhZ2VJbmZvLmgKQEAgLTAsMCArMSw0OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX01UUF9TVE9SQUdFX0lORk9fSAorI2RlZmluZSBfTVRQX1NUT1JBR0VfSU5GT19ICisKKyNpbmNsdWRlICJNdHBUeXBlcy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIE10cERhdGFQYWNrZXQ7CisKK2NsYXNzIE10cFN0b3JhZ2VJbmZvIHsKK3B1YmxpYzoKKyAgICBNdHBTdG9yYWdlSUQgICAgICAgIG1TdG9yYWdlSUQ7CisgICAgdWludDE2X3QgICAgICAgICAgICBtU3RvcmFnZVR5cGU7CisgICAgdWludDE2X3QgICAgICAgICAgICBtRmlsZVN5c3RlbVR5cGU7CisgICAgdWludDE2X3QgICAgICAgICAgICBtQWNjZXNzQ2FwYWJpbGl0eTsKKyAgICB1aW50NjRfdCAgICAgICAgICAgIG1NYXhDYXBhY2l0eTsKKyAgICB1aW50NjRfdCAgICAgICAgICAgIG1GcmVlU3BhY2VCeXRlczsKKyAgICB1aW50MzJfdCAgICAgICAgICAgIG1GcmVlU3BhY2VPYmplY3RzOworICAgIGNoYXIqICAgICAgICAgICAgICAgbVN0b3JhZ2VEZXNjcmlwdGlvbjsKKyAgICBjaGFyKiAgICAgICAgICAgICAgIG1Wb2x1bWVJZGVudGlmaWVyOworCitwdWJsaWM6CisgICAgICAgICAgICAgICAgICAgICAgICBNdHBTdG9yYWdlSW5mbyhNdHBTdG9yYWdlSUQgaWQpOworICAgIHZpcnR1YWwgICAgICAgICAgICAgfk10cFN0b3JhZ2VJbmZvKCk7CisKKyAgICB2b2lkICAgICAgICAgICAgICAgIHJlYWQoTXRwRGF0YVBhY2tldCYgcGFja2V0KTsKKworICAgIHZvaWQgICAgICAgICAgICAgICAgcHJpbnQoKTsKK307CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBfTVRQX1NUT1JBR0VfSU5GT19ICmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwU3RyaW5nQnVmZmVyLmNwcCBiL21lZGlhL210cC9NdHBTdHJpbmdCdWZmZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2OTQ1NzUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdHAvTXRwU3RyaW5nQnVmZmVyLmNwcApAQCAtMCwwICsxLDEzNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgIk10cERhdGFQYWNrZXQuaCIKKyNpbmNsdWRlICJNdHBTdHJpbmdCdWZmZXIuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitNdHBTdHJpbmdCdWZmZXI6Ok10cFN0cmluZ0J1ZmZlcigpCisgICAgOiAgIG1DaGFyQ291bnQoMCksCisgICAgICAgIG1CeXRlQ291bnQoMSkKK3sKKyAgICBtQnVmZmVyWzBdID0gMDsKK30KKworTXRwU3RyaW5nQnVmZmVyOjpNdHBTdHJpbmdCdWZmZXIoY29uc3QgY2hhciogc3JjKQorICAgIDogICBtQ2hhckNvdW50KDApLAorICAgICAgICBtQnl0ZUNvdW50KDEpCit7CisgICAgc2V0KHNyYyk7Cit9CisKK010cFN0cmluZ0J1ZmZlcjo6TXRwU3RyaW5nQnVmZmVyKGNvbnN0IE10cFN0cmluZ0J1ZmZlciYgc3JjKQorICAgIDogICBtQ2hhckNvdW50KHNyYy5tQ2hhckNvdW50KSwKKyAgICAgICAgbUJ5dGVDb3VudChzcmMubUJ5dGVDb3VudCkKK3sKKyAgICBtZW1jcHkobUJ1ZmZlciwgc3JjLm1CdWZmZXIsIG1CeXRlQ291bnQpOworfQorCisKK010cFN0cmluZ0J1ZmZlcjo6fk10cFN0cmluZ0J1ZmZlcigpIHsKK30KKwordm9pZCBNdHBTdHJpbmdCdWZmZXI6OnNldChjb25zdCBjaGFyKiBzcmMpIHsKKyAgICBpbnQgbGVuZ3RoID0gc3RybGVuKHNyYyk7CisgICAgaWYgKGxlbmd0aCA+PSBzaXplb2YobUJ1ZmZlcikpCisgICAgICAgIGxlbmd0aCA9IHNpemVvZihtQnVmZmVyKSAtIDE7CisgICAgbWVtY3B5KG1CdWZmZXIsIHNyYywgbGVuZ3RoKTsKKworICAgIC8vIGNvdW50IHRoZSBjaGFyYWN0ZXJzCisgICAgaW50IGNvdW50ID0gMDsKKyAgICBjaGFyIGNoOworICAgIHdoaWxlICgoY2ggPSAqc3JjKyspICE9IDApIHsKKyAgICAgICAgaWYgKChjaCAmIDB4ODApID09IDApIHsKKyAgICAgICAgICAgIC8vIHNpbmdsZSBieXRlIGNoYXJhY3RlcgorICAgICAgICB9IGVsc2UgaWYgKChjaCAmIDB4RTApID09IDB4QzApIHsKKyAgICAgICAgICAgIC8vIHR3byBieXRlIGNoYXJhY3RlcgorICAgICAgICAgICAgaWYgKCEgKnNyYysrKSB7CisgICAgICAgICAgICAgICAgLy8gbGFzdCBjaGFyYWN0ZXIgd2FzIHRydW5jYXRlZCwgc28gaWdub3JlIGxhc3QgYnl0ZQorICAgICAgICAgICAgICAgIGxlbmd0aC0tOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKChjaCAmIDB4RjApID09IDB4RTApIHsKKyAgICAgICAgICAgIC8vIDMgYnl0ZSBjaGFyCisgICAgICAgICAgICBpZiAoISAqc3JjKyspIHsKKyAgICAgICAgICAgICAgICAvLyBsYXN0IGNoYXJhY3RlciB3YXMgdHJ1bmNhdGVkLCBzbyBpZ25vcmUgbGFzdCBieXRlCisgICAgICAgICAgICAgICAgbGVuZ3RoLS07CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoISAqc3JjKyspIHsKKyAgICAgICAgICAgICAgICAvLyBsYXN0IGNoYXJhY3RlciB3YXMgdHJ1bmNhdGVkLCBzbyBpZ25vcmUgbGFzdCB0d28gYnl0ZXMKKyAgICAgICAgICAgICAgICBsZW5ndGggLT0gMjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjb3VudCsrOworICAgIH0KKworICAgIG1CeXRlQ291bnQgPSBsZW5ndGggKyAxOworICAgIG1CdWZmZXJbbGVuZ3RoXSA9IDA7CisgICAgbUNoYXJDb3VudCA9IGNvdW50OworfQorCit2b2lkIE10cFN0cmluZ0J1ZmZlcjo6cmVhZEZyb21QYWNrZXQoTXRwRGF0YVBhY2tldCogcGFja2V0KSB7CisgICAgaW50IGNvdW50ID0gcGFja2V0LT5nZXRVSW50OCgpOworICAgIHVpbnQ4X3QqIGRlc3QgPSBtQnVmZmVyOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICB1aW50MTZfdCBjaCA9IHBhY2tldC0+Z2V0VUludDE2KCk7CisgICAgICAgIGlmIChjaCA+PSAweDA4MDApIHsKKyAgICAgICAgICAgICpkZXN0KysgPSAodWludDhfdCkoMHhFMCB8IChjaCA+PiAxMikpOworICAgICAgICAgICAgKmRlc3QrKyA9ICh1aW50OF90KSgweDgwIHwgKChjaCA+PiA2KSAmIDB4M0YpKTsKKyAgICAgICAgICAgICpkZXN0KysgPSAodWludDhfdCkoMHg4MCB8IChjaCAmIDB4M0YpKTsKKyAgICAgICAgfSBlbHNlIGlmIChjaCA+PSAweDgwKSB7CisgICAgICAgICAgICAqZGVzdCsrID0gKHVpbnQ4X3QpKDB4QzAgfCAoY2ggPj4gNikpOworICAgICAgICAgICAgKmRlc3QrKyA9ICh1aW50OF90KSgweDgwIHwgKGNoICYgMHgzRikpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgKmRlc3QrKyA9IGNoOworICAgICAgICB9CisgICAgfQorICAgICpkZXN0KysgPSAwOworICAgIG1DaGFyQ291bnQgPSBjb3VudDsKKyAgICBtQnl0ZUNvdW50ID0gZGVzdCAtIG1CdWZmZXI7Cit9CisKK3ZvaWQgTXRwU3RyaW5nQnVmZmVyOjp3cml0ZVRvUGFja2V0KE10cERhdGFQYWNrZXQqIHBhY2tldCkgY29uc3QgeworICAgIGludCBjb3VudCA9IG1DaGFyQ291bnQ7CisgICAgY29uc3QgdWludDhfdCogc3JjID0gbUJ1ZmZlcjsKKyAgICBwYWNrZXQtPnB1dFVJbnQ4KGNvdW50KTsKKworICAgIC8vIGV4cGFuZCB1dGY4IHRvIDE2IGJpdCBjaGFycworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICB1aW50MTZfdCBjaDsKKyAgICAgICAgdWludDE2X3QgY2gxID0gKnNyYysrOworICAgICAgICBpZiAoKGNoMSAmIDB4ODApID09IDApIHsKKyAgICAgICAgICAgIC8vIHNpbmdsZSBieXRlIGNoYXJhY3RlcgorICAgICAgICAgICAgY2ggPSBjaDE7CisgICAgICAgIH0gZWxzZSBpZiAoKGNoMSAmIDB4RTApID09IDB4QzApIHsKKyAgICAgICAgICAgIC8vIHR3byBieXRlIGNoYXJhY3RlcgorICAgICAgICAgICAgdWludDE2X3QgY2gyID0gKnNyYysrOworICAgICAgICAgICAgY2ggPSAoKGNoMSAmIDB4MUYpIDw8IDYpIHwgKGNoMiAmIDB4M0YpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gdGhyZWUgYnl0ZSBjaGFyYWN0ZXIKKyAgICAgICAgICAgIHVpbnQxNl90IGNoMiA9ICpzcmMrKzsKKyAgICAgICAgICAgIHVpbnQxNl90IGNoMyA9ICpzcmMrKzsKKyAgICAgICAgICAgIGNoID0gKChjaDEgJiAweDBGKSA8PCAxMikgfCAoKGNoMiAmIDB4M0YpIDw8IDYpIHwgKGNoMyAmIDB4M0YpOworICAgICAgICB9CisgICAgICAgIHBhY2tldC0+cHV0VUludDE2KGNoKTsKKyAgICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwU3RyaW5nQnVmZmVyLmggYi9tZWRpYS9tdHAvTXRwU3RyaW5nQnVmZmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDY0MWMzZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL210cC9NdHBTdHJpbmdCdWZmZXIuaApAQCAtMCwwICsxLDU0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfTVRQX1NUUklOR19CVUZGRVJfSAorI2RlZmluZSBfTVRQX1NUUklOR19CVUZGRVJfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgTXRwRGF0YVBhY2tldDsKKworLy8gUmVwcmVzZW50cyBhIHV0Zjggc3RyaW5nLCB3aXRoIGEgbWF4aW11bSBvZiAyNTUgY2hhcmFjdGVycworY2xhc3MgTXRwU3RyaW5nQnVmZmVyIHsKKworcHJpdmF0ZToKKyAgICAvLyBtYXhpbXVtIDMgYnl0ZXMvY2hhcmFjdGVyLCB3aXRoIDEgZXh0cmEgZm9yIHplcm8gdGVybWluYXRpb24KKyAgICB1aW50OF90ICAgICAgICAgbUJ1ZmZlclsyNTUgKiAzICsgMV07CisgICAgaW50ICAgICAgICAgICAgIG1DaGFyQ291bnQ7CisgICAgaW50ICAgICAgICAgICAgIG1CeXRlQ291bnQ7CisKK3B1YmxpYzoKKyAgICAgICAgICAgICAgICAgICAgTXRwU3RyaW5nQnVmZmVyKCk7CisgICAgICAgICAgICAgICAgICAgIE10cFN0cmluZ0J1ZmZlcihjb25zdCBjaGFyKiBzcmMpOworICAgICAgICAgICAgICAgICAgICBNdHBTdHJpbmdCdWZmZXIoY29uc3QgTXRwU3RyaW5nQnVmZmVyJiBzcmMpOworICAgIHZpcnR1YWwgICAgICAgICB+TXRwU3RyaW5nQnVmZmVyKCk7CisKKyAgICB2b2lkICAgICAgICAgICAgc2V0KGNvbnN0IGNoYXIqIHNyYyk7CisKKyAgICB2b2lkICAgICAgICAgICAgcmVhZEZyb21QYWNrZXQoTXRwRGF0YVBhY2tldCogcGFja2V0KTsKKyAgICB2b2lkICAgICAgICAgICAgd3JpdGVUb1BhY2tldChNdHBEYXRhUGFja2V0KiBwYWNrZXQpIGNvbnN0OworCisgICAgaW5saW5lIGludCAgICAgIGdldENoYXJDb3VudCgpIGNvbnN0IHsgcmV0dXJuIG1DaGFyQ291bnQ7IH0KKyAgICBpbmxpbmUgaW50ICAgICAgZ2V0Qnl0ZUNvdW50KCkgY29uc3QgeyByZXR1cm4gbUJ5dGVDb3VudDsgfQorCisJaW5saW5lIG9wZXJhdG9yIGNvbnN0IGNoYXIqKCkgY29uc3QgeyByZXR1cm4gKGNvbnN0IGNoYXIgKiltQnVmZmVyOyB9Cit9OworCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gX01UUF9TVFJJTkdfQlVGRkVSX0gKZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBUeXBlcy5oIGIvbWVkaWEvbXRwL010cFR5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmEzM2EyYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL210cC9NdHBUeXBlcy5oCkBAIC0wLDAgKzEsMTAwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfTVRQX1RZUEVTX0gKKyNkZWZpbmUgX01UUF9UWVBFU19ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlICJ1dGlscy9TdHJpbmc4LmgiCisjaW5jbHVkZSAidXRpbHMvVmVjdG9yLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKwordHlwZWRlZiBpbnQzMl90IGludDEyOF90WzRdOwordHlwZWRlZiB1aW50MzJfdCB1aW50MTI4X3RbNF07CisKK3R5cGVkZWYgdWludDE2X3QgTXRwT3BlcmF0aW9uQ29kZTsKK3R5cGVkZWYgdWludDE2X3QgTXRwUmVzcG9uc2VDb2RlOwordHlwZWRlZiB1aW50MzJfdCBNdHBTZXNzaW9uSUQ7Cit0eXBlZGVmIHVpbnQzMl90IE10cFN0b3JhZ2VJRDsKK3R5cGVkZWYgdWludDMyX3QgTXRwVHJhbnNhY3Rpb25JRDsKK3R5cGVkZWYgdWludDE2X3QgTXRwUHJvcGVydHlDb2RlOwordHlwZWRlZiB1aW50MTZfdCBNdHBEYXRhVHlwZTsKK3R5cGVkZWYgdWludDE2X3QgTXRwT2JqZWN0Rm9ybWF0OwordHlwZWRlZiBNdHBQcm9wZXJ0eUNvZGUgTXRwRGV2aWNlUHJvcGVydHk7Cit0eXBlZGVmIE10cFByb3BlcnR5Q29kZSBNdHBPYmplY3RQcm9wZXJ0eTsKKworLy8gb2JqZWN0IGhhbmRsZXMgYXJlIHVuaXF1ZSBhY3Jvc3MgYWxsIHN0b3JhZ2UgYnV0IG9ubHkgd2l0aGluIGEgc2luZ2xlIHNlc3Npb24uCisvLyBvYmplY3QgaGFuZGxlcyBjYW5ub3QgYmUgcmV1c2VkIGFmdGVyIGFuIG9iamVjdCBpcyBkZWxldGVkLgorLy8gdmFsdWVzIDB4MDAwMDAwMDAgYW5kIDB4RkZGRkZGRkYgYXJlIHJlc2VydmVkIGZvciBzcGVjaWFsIHB1cnBvc2VzLgordHlwZWRlZiB1aW50MzJfdCBNdHBPYmplY3RIYW5kbGU7CisKK3R5cGVkZWYgdW5pb24gTXRwUHJvcGVydHlWYWx1ZSB7CisgICAgaW50OF90ICAgICAgICAgIGk4OworICAgIHVpbnQ4X3QgICAgICAgICB1ODsKKyAgICBpbnQxNl90ICAgICAgICAgaTE2OworICAgIHVpbnQxNl90ICAgICAgICB1MTY7CisgICAgaW50MzJfdCAgICAgICAgIGkzMjsKKyAgICB1aW50MzJfdCAgICAgICAgdTMyOworICAgIGludDY0X3QgICAgICAgICBpNjQ7CisgICAgdWludDY0X3QgICAgICAgIHU2NDsKKyAgICBpbnQxMjhfdCAgICAgICAgaTEyODsKKyAgICB1aW50MTI4X3QgICAgICAgdTEyODsKKyAgICBjaGFyKiAgICAgICAgICAgc3RyOworfTsKKworLy8gU3BlY2lhbCB2YWx1ZXMKKyNkZWZpbmUgTVRQX1BBUkVOVF9ST09UICAgICAgICAgMHhGRkZGRkZGRiAgICAgICAvLyBwYXJlbnQgaXMgcm9vdCBvZiB0aGUgc3RvcmFnZQorI2RlZmluZSBrSW52YWxpZE9iamVjdEhhbmRsZSAgICAweEZGRkZGRkZGCisKKy8vIE10cE9iamVjdEhhbmRsZSBiaXRzIGFuZCBtYXNrcworI2RlZmluZSBrT2JqZWN0SGFuZGxlTWFya0JpdCAgICAgICAgMHg4MDAwMDAwMCAgICAgIC8vIHVzZWQgZm9yIG1hcmsgJiBzd2VlcCBieSBNdHBNZWRpYVNjYW5uZXIKKyNkZWZpbmUga09iamVjdEhhbmRsZVRhYmxlTWFzayAgICAgIDB4NzAwMDAwMDAgICAgICAvLyBtYXNrIGZvciBvYmplY3QgdGFibGUKKyNkZWZpbmUga09iamVjdEhhbmRsZVRhYmxlRmlsZSAgICAgIDB4MDAwMDAwMDAgICAgICAvLyBvYmplY3QgaXMgb25seSBpbiB0aGUgZmlsZSB0YWJsZQorI2RlZmluZSBrT2JqZWN0SGFuZGxlVGFibGVBdWRpbyAgICAgMHgxMDAwMDAwMCAgICAgIC8vIG9iamVjdCBpcyBpbiB0aGUgYXVkaW8gdGFibGUKKyNkZWZpbmUga09iamVjdEhhbmRsZVRhYmxlVmlkZW8gICAgIDB4MjAwMDAwMDAgICAgICAvLyBvYmplY3QgaXMgaW4gdGhlIHZpZGVvIHRhYmxlCisjZGVmaW5lIGtPYmplY3RIYW5kbGVUYWJsZUltYWdlICAgICAweDMwMDAwMDAwICAgICAgLy8gb2JqZWN0IGlzIGluIHRoZSBpbWFnZXMgdGFibGUKKyNkZWZpbmUga09iamVjdEhhbmRsZVRhYmxlUGxheWxpc3QgIDB4NDAwMDAwMDAgICAgICAvLyBvYmplY3QgaXMgaW4gdGhlIHBsYXlsaXN0IHRhYmxlCisjZGVmaW5lIGtPYmplY3RIYW5kbGVJbmRleE1hc2sgICAgICAweDBGRkZGRkZGICAgICAgLy8gbWFzayBmb3Igb2JqZWN0IGluZGV4IGluIGZpbGUgdGFibGUKKworY2xhc3MgTXRwU3RvcmFnZTsKK2NsYXNzIE10cERldmljZTsKK2NsYXNzIE10cFByb3BlcnR5OworCit0eXBlZGVmIFZlY3RvcjxNdHBTdG9yYWdlICo+IE10cFN0b3JhZ2VMaXN0OwordHlwZWRlZiBWZWN0b3I8TXRwRGV2aWNlKj4gTXRwRGV2aWNlTGlzdDsKK3R5cGVkZWYgVmVjdG9yPE10cFByb3BlcnR5Kj4gTXRwUHJvcGVydHlMaXN0OworCit0eXBlZGVmIFZlY3Rvcjx1aW50OF90PiBVSW50OExpc3Q7Cit0eXBlZGVmIFZlY3Rvcjx1aW50MTZfdD4gVUludDE2TGlzdDsKK3R5cGVkZWYgVmVjdG9yPHVpbnQzMl90PiBVSW50MzJMaXN0OwordHlwZWRlZiBWZWN0b3I8dWludDY0X3Q+IFVJbnQ2NExpc3Q7Cit0eXBlZGVmIFZlY3RvcjxpbnQ4X3Q+IEludDhMaXN0OwordHlwZWRlZiBWZWN0b3I8aW50MTZfdD4gSW50MTZMaXN0OwordHlwZWRlZiBWZWN0b3I8aW50MzJfdD4gSW50MzJMaXN0OwordHlwZWRlZiBWZWN0b3I8aW50NjRfdD4gSW50NjRMaXN0OworCit0eXBlZGVmIFVJbnQxNkxpc3QgTXRwRGV2aWNlUHJvcGVydHlMaXN0OwordHlwZWRlZiBVSW50MTZMaXN0IE10cE9iamVjdEZvcm1hdExpc3Q7Cit0eXBlZGVmIFVJbnQzMkxpc3QgTXRwT2JqZWN0SGFuZGxlTGlzdDsKK3R5cGVkZWYgVUludDE2TGlzdCBNdHBPYmplY3RQcm9wZXJ0eUxpc3Q7Cit0eXBlZGVmIFVJbnQzMkxpc3QgTXRwU3RvcmFnZUlETGlzdDsKKwordHlwZWRlZiBTdHJpbmc4ICAgIE10cFN0cmluZzsKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIF9NVFBfVFlQRVNfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cFV0aWxzLmNwcCBiL21lZGlhL210cC9NdHBVdGlscy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTBjYTE2NgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL210cC9NdHBVdGlscy5jcHAKQEAgLTAsMCArMSw3NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKworI2luY2x1ZGUgPGN1dGlscy90enRpbWUuaD4KKyNpbmNsdWRlICJNdHBVdGlscy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qCitEYXRlVGltZSBzdHJpbmdzIGZvbGxvdyBhIGNvbXBhdGlibGUgc3Vic2V0IG9mIHRoZSBkZWZpbml0aW9uIGZvdW5kIGluIElTTyA4NjAxLCBhbmQKK3Rha2UgdGhlIGZvcm0gb2YgYSBVbmljb2RlIHN0cmluZyBmb3JtYXR0ZWQgYXM6ICJZWVlZTU1ERFRoaG1tc3MucyIuIEluIHRoaXMKK3JlcHJlc2VudGF0aW9uLCBZWVlZIHNoYWxsIGJlIHJlcGxhY2VkIGJ5IHRoZSB5ZWFyLCBNTSByZXBsYWNlZCBieSB0aGUgbW9udGggKDAxLTEyKSwKK0REIHJlcGxhY2VkIGJ5IHRoZSBkYXkgKDAxLTMxKSwgVCBpcyBhIGNvbnN0YW50IGNoYXJhY3RlciAnVCcgZGVsaW1pdGluZyB0aW1lIGZyb20gZGF0ZSwKK2hoIGlzIHJlcGxhY2VkIGJ5IHRoZSBob3VyICgwMC0yMyksIG1tIGlzIHJlcGxhY2VkIGJ5IHRoZSBtaW51dGUgKDAwLTU5KSwgYW5kIHNzIGJ5IHRoZQorc2Vjb25kICgwMC01OSkuIFRoZSAiLnMiIGlzIG9wdGlvbmFsLCBhbmQgcmVwcmVzZW50cyB0ZW50aHMgb2YgYSBzZWNvbmQuCisqLworCitib29sIHBhcnNlRGF0ZVRpbWUoY29uc3QgY2hhciogZGF0ZVRpbWUsIHRpbWVfdCYgb3V0U2Vjb25kcykgeworICAgIGludCB5ZWFyLCBtb250aCwgZGF5LCBob3VyLCBtaW51dGUsIHNlY29uZDsKKyAgICBzdHJ1Y3QgdG0gdG07CisKKyAgICBpZiAoc3NjYW5mKGRhdGVUaW1lLCAiJTA0ZCUwMmQlMDJkVCUwMmQlMDJkJTAyZCIsCisgICAgICAgICAgICAmeWVhciwgJm1vbnRoLCAmZGF5LCAmaG91ciwgJm1pbnV0ZSwgJnNlY29uZCkgIT0gNikKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIGNvbnN0IGNoYXIqIHRhaWwgPSBkYXRlVGltZSArIDE1OworICAgIC8vIHNraXAgb3B0aW9uYWwgdGVudGggb2Ygc2Vjb25kCisgICAgaWYgKHRhaWxbMF0gPT0gJy4nICYmIHRhaWxbMV0pCisgICAgICAgIHRhaWwgKz0gMjsKKyAgICAvL0ZJWE1FIC0gc3VwcG9ydCArLy1oaG1tCisgICAgYm9vbCB1c2VVVEMgPSAodGFpbFswXSA9PSAnWicpOworCisgICAgLy8gaGFjayB0byBjb21wdXRlIHRpbWV6b25lCisgICAgdGltZV90IGR1bW15OworICAgIGxvY2FsdGltZV9yKCZkdW1teSwgJnRtKTsKKworICAgIHRtLnRtX3NlYyA9IHNlY29uZDsKKyAgICB0bS50bV9taW4gPSBtaW51dGU7CisgICAgdG0udG1faG91ciA9IGhvdXI7CisgICAgdG0udG1fbWRheSA9IGRheTsKKyAgICB0bS50bV9tb24gPSBtb250aDsKKyAgICB0bS50bV95ZWFyID0geWVhciAtIDE5MDA7CisgICAgdG0udG1fd2RheSA9IDA7CisgICAgdG0udG1faXNkc3QgPSAtMTsKKyAgICBpZiAodXNlVVRDKQorICAgICAgICBvdXRTZWNvbmRzID0gbWt0aW1lKCZ0bSk7CisgICAgZWxzZQorICAgICAgICBvdXRTZWNvbmRzID0gbWt0aW1lX3R6KCZ0bSwgdG0udG1fem9uZSk7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBmb3JtYXREYXRlVGltZSh0aW1lX3Qgc2Vjb25kcywgY2hhciogYnVmZmVyLCBpbnQgYnVmZmVyTGVuZ3RoKSB7CisgICAgc3RydWN0IHRtIHRtOworCisgICAgbG9jYWx0aW1lX3IoJnNlY29uZHMsICZ0bSk7CisgICAgc25wcmludGYoYnVmZmVyLCBidWZmZXJMZW5ndGgsICIlMDRkJTAyZCUwMmRUJTAyZCUwMmQlMDJkIiwKKyAgICAgICAgdG0udG1feWVhciArIDE5MDAsIHRtLnRtX21vbiwgdG0udG1fbWRheSwgdG0udG1faG91ciwgdG0udG1fbWluLCB0bS50bV9zZWMpOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9WZWN0b3I0Zi5qYXZhIGIvbWVkaWEvbXRwL010cFV0aWxzLmgKc2ltaWxhcml0eSBpbmRleCA2MyUKY29weSBmcm9tIGdyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvVmVjdG9yNGYuamF2YQpjb3B5IHRvIG1lZGlhL210cC9NdHBVdGlscy5oCmluZGV4IGZhYmQ5NTkuLjYxZjkwNTUgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvVmVjdG9yNGYuamF2YQorKysgYi9tZWRpYS9tdHAvTXRwVXRpbHMuaApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKICAqCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KQEAgLTE0LDI1ICsxNCwxNiBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotcGFja2FnZSBhbmRyb2lkLnJlbmRlcnNjcmlwdDsKKyNpZm5kZWYgX01UUF9VVElMU19ICisjZGVmaW5lIF9NVFBfVVRJTFNfSAogCi1pbXBvcnQgamF2YS5sYW5nLk1hdGg7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKyNpbmNsdWRlIDxzdGRpbnQuaD4KIAorbmFtZXNwYWNlIGFuZHJvaWQgewogCi0vKioKLSAqIEBoaWRlCi0gKgotICoqLwotcHVibGljIGNsYXNzIFZlY3RvcjRmIHsKLSAgICBwdWJsaWMgVmVjdG9yNGYoKSB7Ci0gICAgfQorYm9vbCBwYXJzZURhdGVUaW1lKGNvbnN0IGNoYXIqIGRhdGVUaW1lLCB0aW1lX3QmIG91dFNlY29uZHMpOwordm9pZCBmb3JtYXREYXRlVGltZSh0aW1lX3Qgc2Vjb25kcywgY2hhciogYnVmZmVyLCBpbnQgYnVmZmVyTGVuZ3RoKTsKIAotICAgIHB1YmxpYyBmbG9hdCB4OwotICAgIHB1YmxpYyBmbG9hdCB5OwotICAgIHB1YmxpYyBmbG9hdCB6OwotICAgIHB1YmxpYyBmbG9hdCB3OwotfQorfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAotCi0KKyNlbmRpZiAvLyBfTVRQX1VUSUxTX0gKZGlmZiAtLWdpdCBhL21lZGlhL210cC9TcWxpdGVEYXRhYmFzZS5jcHAgYi9tZWRpYS9tdHAvU3FsaXRlRGF0YWJhc2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxMTU2MzAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdHAvU3FsaXRlRGF0YWJhc2UuY3BwCkBAIC0wLDAgKzEsODUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiU3FsaXRlRGF0YWJhc2UuaCIKKyNpbmNsdWRlICJTcWxpdGVTdGF0ZW1lbnQuaCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3FsaXRlMy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK1NxbGl0ZURhdGFiYXNlOjpTcWxpdGVEYXRhYmFzZSgpCisgICAgOiAgIG1EYXRhYmFzZUhhbmRsZShOVUxMKQoreworfQorCitTcWxpdGVEYXRhYmFzZTo6flNxbGl0ZURhdGFiYXNlKCkgeworICAgIGNsb3NlKCk7Cit9CisKK2Jvb2wgU3FsaXRlRGF0YWJhc2U6Om9wZW4oY29uc3QgY2hhciogcGF0aCwgYm9vbCBjcmVhdGUpIHsKKyAgICBpbnQgZmxhZ3MgPSBTUUxJVEVfT1BFTl9SRUFEV1JJVEU7CisgICAgaWYgKGNyZWF0ZSkgZmxhZ3MgfD0gU1FMSVRFX09QRU5fQ1JFQVRFOworICAgIC8vIFNRTElURV9PUEVOX05PTVVURVg/CisgICAgaW50IHJldCA9IHNxbGl0ZTNfb3Blbl92MihwYXRoLCAmbURhdGFiYXNlSGFuZGxlLCBmbGFncywgTlVMTCk7CisgICAgaWYgKHJldCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImNvdWxkIG5vdCBvcGVuIGRhdGFiYXNlXG4iKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBTcWxpdGVEYXRhYmFzZTo6Y2xvc2UoKSB7CisgICAgaWYgKG1EYXRhYmFzZUhhbmRsZSkgeworICAgICAgICBzcWxpdGUzX2Nsb3NlKG1EYXRhYmFzZUhhbmRsZSk7CisgICAgICAgIG1EYXRhYmFzZUhhbmRsZSA9IE5VTEw7CisgICAgfQorfQorCitib29sIFNxbGl0ZURhdGFiYXNlOjpleGVjKGNvbnN0IGNoYXIqIHNxbCkgeworICAgIHJldHVybiAoc3FsaXRlM19leGVjKG1EYXRhYmFzZUhhbmRsZSwgc3FsLCBOVUxMLCBOVUxMLCBOVUxMKSA9PSAwKTsKK30KKworaW50IFNxbGl0ZURhdGFiYXNlOjpsYXN0SW5zZXJ0ZWRSb3coKSB7CisgICAgcmV0dXJuIHNxbGl0ZTNfbGFzdF9pbnNlcnRfcm93aWQobURhdGFiYXNlSGFuZGxlKTsKK30KKwordm9pZCBTcWxpdGVEYXRhYmFzZTo6YmVnaW5UcmFuc2FjdGlvbigpIHsKKyAgICBleGVjKCJCRUdJTiBUUkFOU0FDVElPTiIpOworfQorCit2b2lkIFNxbGl0ZURhdGFiYXNlOjpjb21taXRUcmFuc2FjdGlvbigpIHsKKyAgICBleGVjKCJDT01NSVQgVFJBTlNBQ1RJT04iKTsKK30KKwordm9pZCBTcWxpdGVEYXRhYmFzZTo6cm9sbGJhY2tUcmFuc2FjdGlvbigpIHsKKyAgICBleGVjKCJST0xMQkFDSyBUUkFOU0FDVElPTiIpOworfQorCitpbnQgU3FsaXRlRGF0YWJhc2U6OmdldFZlcnNpb24oKSB7CisgICAgU3FsaXRlU3RhdGVtZW50IHN0bXQodGhpcyk7CisgICAgc3RtdC5wcmVwYXJlKCJQUkFHTUEgdXNlcl92ZXJzaW9uOyIpOworICAgIHN0bXQuc3RlcCgpOworICAgIHJldHVybiBzdG10LmdldENvbHVtbkludCgwKTsKK30KK3ZvaWQgU3FsaXRlRGF0YWJhc2U6OnNldFZlcnNpb24oaW50IHZlcnNpb24pIHsKKyAgICBjaGFyICAgIGJ1ZmZlcls0MF07CisgICAgc25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgIlBSQUdNQSB1c2VyX3ZlcnNpb24gPSAlZCIsIHZlcnNpb24pOworICAgIGV4ZWMoYnVmZmVyKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL210cC9TcWxpdGVEYXRhYmFzZS5oIGIvbWVkaWEvbXRwL1NxbGl0ZURhdGFiYXNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZkZDlkZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL210cC9TcWxpdGVEYXRhYmFzZS5oCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9TUUxJVEVfREFUQUJBU0VfSAorI2RlZmluZSBfU1FMSVRFX0RBVEFCQVNFX0gKKwordHlwZWRlZiBzdHJ1Y3Qgc3FsaXRlMyBzcWxpdGUzOworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIFNxbGl0ZURhdGFiYXNlIHsKK3ByaXZhdGU6CisgICAgc3FsaXRlMyogICAgICAgIG1EYXRhYmFzZUhhbmRsZTsKKworcHVibGljOgorICAgICAgICAgICAgICAgICAgICBTcWxpdGVEYXRhYmFzZSgpOworICAgIHZpcnR1YWwgICAgICAgICB+U3FsaXRlRGF0YWJhc2UoKTsKKworICAgIHZpcnR1YWwgYm9vbCAgICBvcGVuKGNvbnN0IGNoYXIqIHBhdGgsIGJvb2wgY3JlYXRlKTsKKyAgICB2aXJ0dWFsIHZvaWQgICAgY2xvc2UoKTsKKworICAgIGJvb2wgICAgICAgICAgICBleGVjKGNvbnN0IGNoYXIqIHNxbCk7CisgICAgaW50ICAgICAgICAgICAgIGxhc3RJbnNlcnRlZFJvdygpOworCisgICAgdm9pZCAgICAgICAgICAgIGJlZ2luVHJhbnNhY3Rpb24oKTsKKyAgICB2b2lkICAgICAgICAgICAgY29tbWl0VHJhbnNhY3Rpb24oKTsKKyAgICB2b2lkICAgICAgICAgICAgcm9sbGJhY2tUcmFuc2FjdGlvbigpOworCisgICAgaW50ICAgICAgICAgICAgIGdldFZlcnNpb24oKTsKKyAgICB2b2lkICAgICAgICAgICAgc2V0VmVyc2lvbihpbnQgdmVyc2lvbik7CisKKyAgICBpbmxpbmUgc3FsaXRlMyogZ2V0RGF0YWJhc2VIYW5kbGUoKSBjb25zdCB7IHJldHVybiBtRGF0YWJhc2VIYW5kbGU7IH0KK307CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBfU1FMSVRFX0RBVEFCQVNFX0gKZGlmZiAtLWdpdCBhL21lZGlhL210cC9TcWxpdGVTdGF0ZW1lbnQuY3BwIGIvbWVkaWEvbXRwL1NxbGl0ZVN0YXRlbWVudC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTEzMDBiNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL210cC9TcWxpdGVTdGF0ZW1lbnQuY3BwCkBAIC0wLDAgKzEsODEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiU3FsaXRlU3RhdGVtZW50LmgiCisjaW5jbHVkZSAiU3FsaXRlRGF0YWJhc2UuaCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3FsaXRlMy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK1NxbGl0ZVN0YXRlbWVudDo6U3FsaXRlU3RhdGVtZW50KFNxbGl0ZURhdGFiYXNlKiBkYikKKyAgICA6ICAgbURhdGFiYXNlSGFuZGxlKGRiLT5nZXREYXRhYmFzZUhhbmRsZSgpKSwKKyAgICAgICAgbVN0YXRlbWVudChOVUxMKSwKKyAgICAgICAgbURvbmUoZmFsc2UpCit7Cit9CisKK1NxbGl0ZVN0YXRlbWVudDo6flNxbGl0ZVN0YXRlbWVudCgpIHsKKyAgICBmaW5hbGl6ZSgpOworfQorCitib29sIFNxbGl0ZVN0YXRlbWVudDo6cHJlcGFyZShjb25zdCBjaGFyKiBzcWwpIHsKKyAgICByZXR1cm4gKHNxbGl0ZTNfcHJlcGFyZV92MihtRGF0YWJhc2VIYW5kbGUsIHNxbCwgLTEsICZtU3RhdGVtZW50LCBOVUxMKSA9PSAwKTsKK30KKworYm9vbCBTcWxpdGVTdGF0ZW1lbnQ6OnN0ZXAoKSB7CisgICAgaW50IHJldCA9IHNxbGl0ZTNfc3RlcChtU3RhdGVtZW50KTsKKyAgICBpZiAocmV0ID09IFNRTElURV9ET05FKSB7CisgICAgICAgIG1Eb25lID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiAocmV0ID09IFNRTElURV9PSyB8fCByZXQgPT0gU1FMSVRFX1JPVyk7Cit9CisKK3ZvaWQgU3FsaXRlU3RhdGVtZW50OjpyZXNldCgpIHsKKyAgICBzcWxpdGUzX3Jlc2V0KG1TdGF0ZW1lbnQpOworICAgIG1Eb25lID0gZmFsc2U7Cit9CisKK3ZvaWQgU3FsaXRlU3RhdGVtZW50OjpmaW5hbGl6ZSgpIHsKKyAgICBpZiAobVN0YXRlbWVudCkgeworICAgICAgICBzcWxpdGUzX2ZpbmFsaXplKG1TdGF0ZW1lbnQpOworICAgICAgICBtU3RhdGVtZW50ID0gTlVMTDsKKyAgICB9Cit9CisKK3ZvaWQgU3FsaXRlU3RhdGVtZW50OjpiaW5kKGludCBjb2x1bW4sIGludCB2YWx1ZSkgeworICAgIHNxbGl0ZTNfYmluZF9pbnQobVN0YXRlbWVudCwgY29sdW1uLCB2YWx1ZSk7Cit9CisKK3ZvaWQgU3FsaXRlU3RhdGVtZW50OjpiaW5kKGludCBjb2x1bW4sIGNvbnN0IGNoYXIqIHZhbHVlKSB7CisgICAgc3FsaXRlM19iaW5kX3RleHQobVN0YXRlbWVudCwgY29sdW1uLCB2YWx1ZSwgLTEsIFNRTElURV9UUkFOU0lFTlQpOworfQorCitpbnQgU3FsaXRlU3RhdGVtZW50OjpnZXRDb2x1bW5JbnQoaW50IGNvbHVtbikgeworICAgIHJldHVybiBzcWxpdGUzX2NvbHVtbl9pbnQobVN0YXRlbWVudCwgY29sdW1uKTsKK30KKworaW50NjRfdCBTcWxpdGVTdGF0ZW1lbnQ6OmdldENvbHVtbkludDY0KGludCBjb2x1bW4pIHsKKyAgICByZXR1cm4gc3FsaXRlM19jb2x1bW5faW50NjQobVN0YXRlbWVudCwgY29sdW1uKTsKK30KKworY29uc3QgY2hhciogU3FsaXRlU3RhdGVtZW50OjpnZXRDb2x1bW5TdHJpbmcoaW50IGNvbHVtbikgeworICAgIHJldHVybiAoY29uc3QgY2hhciAqKXNxbGl0ZTNfY29sdW1uX3RleHQobVN0YXRlbWVudCwgY29sdW1uKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL210cC9TcWxpdGVTdGF0ZW1lbnQuaCBiL21lZGlhL210cC9TcWxpdGVTdGF0ZW1lbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMGViZmZmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXRwL1NxbGl0ZVN0YXRlbWVudC5oCkBAIC0wLDAgKzEsNTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9TUUxJVEVfU1RBVEVNRU5UX0gKKyNkZWZpbmUgX1NRTElURV9TVEFURU1FTlRfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK3R5cGVkZWYgc3RydWN0IHNxbGl0ZTMgc3FsaXRlMzsKK3R5cGVkZWYgc3RydWN0IHNxbGl0ZTNfc3RtdCBzcWxpdGUzX3N0bXQ7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgU3FsaXRlRGF0YWJhc2U7CisKK2NsYXNzIFNxbGl0ZVN0YXRlbWVudCB7Citwcml2YXRlOgorICAgIHNxbGl0ZTMqICAgICAgICBtRGF0YWJhc2VIYW5kbGU7CisgICAgc3FsaXRlM19zdG10KiAgIG1TdGF0ZW1lbnQ7CisgICAgYm9vbCAgICAgICAgICAgIG1Eb25lOworCitwdWJsaWM6CisgICAgICAgICAgICAgICAgICAgIFNxbGl0ZVN0YXRlbWVudChTcWxpdGVEYXRhYmFzZSogZGIpOworICAgIHZpcnR1YWwgICAgICAgICB+U3FsaXRlU3RhdGVtZW50KCk7CisKKyAgICBib29sICAgICAgICAgICAgcHJlcGFyZShjb25zdCBjaGFyKiBzcWwpOworICAgIGJvb2wgICAgICAgICAgICBzdGVwKCk7CisgICAgdm9pZCAgICAgICAgICAgIHJlc2V0KCk7CisgICAgdm9pZCAgICAgICAgICAgIGZpbmFsaXplKCk7CisKKyAgICB2b2lkICAgICAgICAgICAgYmluZChpbnQgY29sdW1uLCBpbnQgdmFsdWUpOworICAgIHZvaWQgICAgICAgICAgICBiaW5kKGludCBjb2x1bW4sIGNvbnN0IGNoYXIqIHZhbHVlKTsKKworICAgIGludCAgICAgICAgICAgICBnZXRDb2x1bW5JbnQoaW50IGNvbHVtbik7CisgICAgaW50NjRfdCAgICAgICAgIGdldENvbHVtbkludDY0KGludCBjb2x1bW4pOworICAgIGNvbnN0IGNoYXIqICAgICBnZXRDb2x1bW5TdHJpbmcoaW50IGNvbHVtbik7CisKKyAgICBpbmxpbmUgYm9vbCAgICAgaXNEb25lKCkgY29uc3QgeyByZXR1cm4gbURvbmU7IH0KK307CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBfU1FMSVRFX1NUQVRFTUVOVF9ICmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvZl9tdHAuaCBiL21lZGlhL210cC9mX210cC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxYzlhZWYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdHAvZl9tdHAuaApAQCAtMCwwICsxLDQ0IEBACisvKgorICogR2FkZ2V0IEZ1bmN0aW9uIERyaXZlciBmb3IgTVRQCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSwgSW5jLgorICogQXV0aG9yOiBNaWtlIExvY2t3b29kIDxsb2Nrd29vZEBhbmRyb2lkLmNvbT4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorICogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqLworCisjaWZuZGVmIF9fTElOVVhfVVNCX0ZfTVRQX0gKKyNkZWZpbmUgX19MSU5VWF9VU0JfRl9NVFBfSAorCisvKiBDb25zdGFudHMgZm9yIE1UUF9TRVRfSU5URVJGQUNFX01PREUgKi8KKyNkZWZpbmUgTVRQX0lOVEVSRkFDRV9NT0RFX01UUCAgMAorI2RlZmluZSBNVFBfSU5URVJGQUNFX01PREVfUFRQICAxCisKKworc3RydWN0IG10cF9maWxlX3JhbmdlIHsKKwkvKiBmaWxlIGRlc2NyaXB0b3IgZm9yIGZpbGUgdG8gdHJhbnNmZXIgKi8KKwlpbnQJCQlmZDsKKwkvKiBvZmZzZXQgaW4gZmlsZSBmb3Igc3RhcnQgb2YgdHJhbnNmZXIgKi8KKwlsb2ZmX3QgIAlvZmZzZXQ7CisJLyogbnVtYmVyIG9mIGJ5dGVzIHRvIHRyYW5zZmVyICovCisJc2l6ZV90CQlsZW5ndGg7Cit9OworCisvKiBTZW5kcyB0aGUgc3BlY2lmaWVkIGZpbGUgcmFuZ2UgdG8gdGhlIGhvc3QgKi8KKyNkZWZpbmUgTVRQX1NFTkRfRklMRSAgICAgICAgICAgICAgX0lPVygnTScsIDAsIHN0cnVjdCBtdHBfZmlsZV9yYW5nZSkKKy8qIFJlY2VpdmVzIGRhdGEgZnJvbSB0aGUgaG9zdCBhbmQgd3JpdGVzIGl0IHRvIGEgZmlsZS4KKyAqIFRoZSBmaWxlIGlzIGNyZWF0ZWQgaWYgaXQgZG9lcyBub3QgZXhpc3QuCisgKi8KKyNkZWZpbmUgTVRQX1JFQ0VJVkVfRklMRSAgICAgICAgICAgX0lPVygnTScsIDEsIHN0cnVjdCBtdHBfZmlsZV9yYW5nZSkKKy8qIFNldHMgdGhlIGRyaXZlciBtb2RlIHRvIGVpdGhlciBNVFAgb3IgUFRQICovCisjZGVmaW5lIE1UUF9TRVRfSU5URVJGQUNFX01PREUgICAgIF9JT1coJ00nLCAyLCBpbnQpCisKKyNlbmRpZiAvKiBfX0xJTlVYX1VTQl9GX01UUF9IICovCmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvbXRwLmggYi9tZWRpYS9tdHAvbXRwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjI0Y2ZiOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL210cC9tdHAuaApAQCAtMCwwICsxLDQ3NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX01UUF9ICisjZGVmaW5lIF9NVFBfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNkZWZpbmUgTVRQX1NUQU5EQVJEX1ZFUlNJT04gICAgICAgICAgICAxMDAKKworLy8gQ29udGFpbmVyIFR5cGVzCisjZGVmaW5lIE1UUF9DT05UQUlORVJfVFlQRV9VTkRFRklORUQgICAgMAorI2RlZmluZSBNVFBfQ09OVEFJTkVSX1RZUEVfQ09NTUFORCAgICAgIDEKKyNkZWZpbmUgTVRQX0NPTlRBSU5FUl9UWVBFX0RBVEEgICAgICAgICAyCisjZGVmaW5lIE1UUF9DT05UQUlORVJfVFlQRV9SRVNQT05TRSAgICAgMworI2RlZmluZSBNVFBfQ09OVEFJTkVSX1RZUEVfRVZFTlQgICAgICAgIDQKKworLy8gQ29udGFpbmVyIE9mZnNldHMKKyNkZWZpbmUgTVRQX0NPTlRBSU5FUl9MRU5HVEhfT0ZGU0VUICAgICAgICAgICAgIDAKKyNkZWZpbmUgTVRQX0NPTlRBSU5FUl9UWVBFX09GRlNFVCAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgTVRQX0NPTlRBSU5FUl9DT0RFX09GRlNFVCAgICAgICAgICAgICAgIDYKKyNkZWZpbmUgTVRQX0NPTlRBSU5FUl9UUkFOU0FDVElPTl9JRF9PRkZTRVQgICAgIDgKKyNkZWZpbmUgTVRQX0NPTlRBSU5FUl9QQVJBTUVURVJfT0ZGU0VUICAgICAgICAgIDEyCisjZGVmaW5lIE1UUF9DT05UQUlORVJfSEVBREVSX1NJWkUgICAgICAgICAgICAgICAxMgorCisvLyBNVFAgVHlwZXMKKyNkZWZpbmUgTVRQX1RZUEVfVU5ERUZJTkVEICAgICAgMHgwMDAwICAgICAgICAgIC8vIFVuZGVmaW5lZAorI2RlZmluZSBNVFBfVFlQRV9JTlQ4ICAgICAgICAgICAweDAwMDEgICAgICAgICAgLy8gU2lnbmVkIDgtYml0IGludGVnZXIKKyNkZWZpbmUgTVRQX1RZUEVfVUlOVDggICAgICAgICAgMHgwMDAyICAgICAgICAgIC8vIFVuc2lnbmVkIDgtYml0IGludGVnZXIKKyNkZWZpbmUgTVRQX1RZUEVfSU5UMTYgICAgICAgICAgMHgwMDAzICAgICAgICAgIC8vIFNpZ25lZCAxNi1iaXQgaW50ZWdlcgorI2RlZmluZSBNVFBfVFlQRV9VSU5UMTYgICAgICAgICAweDAwMDQgICAgICAgICAgLy8gVW5zaWduZWQgMTYtYml0IGludGVnZXIKKyNkZWZpbmUgTVRQX1RZUEVfSU5UMzIgICAgICAgICAgMHgwMDA1ICAgICAgICAgIC8vIFNpZ25lZCAzMi1iaXQgaW50ZWdlcgorI2RlZmluZSBNVFBfVFlQRV9VSU5UMzIgICAgICAgICAweDAwMDYgICAgICAgICAgLy8gVW5zaWduZWQgMzItYml0IGludGVnZXIKKyNkZWZpbmUgTVRQX1RZUEVfSU5UNjQgICAgICAgICAgMHgwMDA3ICAgICAgICAgIC8vIFNpZ25lZCA2NC1iaXQgaW50ZWdlcgorI2RlZmluZSBNVFBfVFlQRV9VSU5UNjQgICAgICAgICAweDAwMDggICAgICAgICAgLy8gVW5zaWduZWQgNjQtYml0IGludGVnZXIKKyNkZWZpbmUgTVRQX1RZUEVfSU5UMTI4ICAgICAgICAgMHgwMDA5ICAgICAgICAgIC8vIFNpZ25lZCAxMjgtYml0IGludGVnZXIKKyNkZWZpbmUgTVRQX1RZUEVfVUlOVDEyOCAgICAgICAgMHgwMDBBICAgICAgICAgIC8vIFVuc2lnbmVkIDEyOC1iaXQgaW50ZWdlcgorI2RlZmluZSBNVFBfVFlQRV9BSU5UOCAgICAgICAgICAweDQwMDEgICAgICAgICAgLy8gQXJyYXkgb2Ygc2lnbmVkIDgtYml0IGludGVnZXJzCisjZGVmaW5lIE1UUF9UWVBFX0FVSU5UOCAgICAgICAgIDB4NDAwMiAgICAgICAgICAvLyBBcnJheSBvZiB1bnNpZ25lZCA4LWJpdCBpbnRlZ2VycworI2RlZmluZSBNVFBfVFlQRV9BSU5UMTYgICAgICAgICAweDQwMDMgICAgICAgICAgLy8gQXJyYXkgb2Ygc2lnbmVkIDE2LWJpdCBpbnRlZ2VycworI2RlZmluZSBNVFBfVFlQRV9BVUlOVDE2ICAgICAgICAweDQwMDQgICAgICAgICAgLy8gQXJyYXkgb2YgdW5zaWduZWQgMTYtYml0IGludGVnZXJzCisjZGVmaW5lIE1UUF9UWVBFX0FJTlQzMiAgICAgICAgIDB4NDAwNSAgICAgICAgICAvLyBBcnJheSBvZiBzaWduZWQgMzItYml0IGludGVnZXJzCisjZGVmaW5lIE1UUF9UWVBFX0FVSU5UMzIgICAgICAgIDB4NDAwNiAgICAgICAgICAvLyBBcnJheSBvZiB1bnNpZ25lZCAzMi1iaXQgaW50ZWdlcnMKKyNkZWZpbmUgTVRQX1RZUEVfQUlOVDY0ICAgICAgICAgMHg0MDA3ICAgICAgICAgIC8vIEFycmF5IG9mIHNpZ25lZCA2NC1iaXQgaW50ZWdlcnMKKyNkZWZpbmUgTVRQX1RZUEVfQVVJTlQ2NCAgICAgICAgMHg0MDA4ICAgICAgICAgIC8vIEFycmF5IG9mIHVuc2lnbmVkIDY0LWJpdCBpbnRlZ2VycworI2RlZmluZSBNVFBfVFlQRV9BSU5UMTI4ICAgICAgICAweDQwMDkgICAgICAgICAgLy8gQXJyYXkgb2Ygc2lnbmVkIDEyOC1iaXQgaW50ZWdlcnMKKyNkZWZpbmUgTVRQX1RZUEVfQVVJTlQxMjggICAgICAgMHg0MDBBICAgICAgICAgIC8vIEFycmF5IG9mIHVuc2lnbmVkIDEyOC1iaXQgaW50ZWdlcnMKKyNkZWZpbmUgTVRQX1RZUEVfU1RSICAgICAgICAgICAgMHhGRkZGICAgICAgICAgIC8vIFZhcmlhYmxlLWxlbmd0aCBVbmljb2RlIHN0cmluZworCisvLyBNVFAgRm9ybWF0IENvZGVzCisjZGVmaW5lIE1UUF9GT1JNQVRfVU5ERUZJTkVEICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzAwMCAgIC8vIFVuZGVmaW5lZCBvYmplY3QKKyNkZWZpbmUgTVRQX0ZPUk1BVF9BU1NPQ0lBVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzMDAxICAgLy8gQXNzb2NpYXRpb24gKGZvciBleGFtcGxlLCBhIGZvbGRlcikKKyNkZWZpbmUgTVRQX0ZPUk1BVF9TQ1JJUFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzMDAyICAgLy8gRGV2aWNlIG1vZGVsLXNwZWNpZmljIHNjcmlwdAorI2RlZmluZSBNVFBfRk9STUFUX0VYRUNVVEFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAweDMwMDMgICAvLyBEZXZpY2UgbW9kZWwtc3BlY2lmaWMgYmluYXJ5IGV4ZWN1dGFibGUKKyNkZWZpbmUgTVRQX0ZPUk1BVF9URVhUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzMDA0ICAgLy8gVGV4dCBmaWxlCisjZGVmaW5lIE1UUF9GT1JNQVRfSFRNTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzAwNSAgIC8vIEh5cGVydGV4dCBNYXJrdXAgTGFuZ3VhZ2UgZmlsZSAodGV4dCkKKyNkZWZpbmUgTVRQX0ZPUk1BVF9EUE9GICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzMDA2ICAgLy8gRGlnaXRhbCBQcmludCBPcmRlciBGb3JtYXQgZmlsZSAodGV4dCkKKyNkZWZpbmUgTVRQX0ZPUk1BVF9BSUZGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzMDA3ICAgLy8gQXVkaW8gY2xpcAorI2RlZmluZSBNVFBfRk9STUFUX1dBViAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDMwMDggICAvLyBBdWRpbyBjbGlwCisjZGVmaW5lIE1UUF9GT1JNQVRfTVAzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzAwOSAgIC8vIEF1ZGlvIGNsaXAKKyNkZWZpbmUgTVRQX0ZPUk1BVF9BVkkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzMDBBICAgLy8gVmlkZW8gY2xpcAorI2RlZmluZSBNVFBfRk9STUFUX01QRUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDMwMEIgICAvLyBWaWRlbyBjbGlwCisjZGVmaW5lIE1UUF9GT1JNQVRfQVNGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzAwQyAgIC8vIE1pY3Jvc29mdCBBZHZhbmNlZCBTdHJlYW1pbmcgRm9ybWF0ICh2aWRlbykKKyNkZWZpbmUgTVRQX0ZPUk1BVF9ERUZJTkVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzODAwICAgLy8gVW5rbm93biBpbWFnZSBvYmplY3QKKyNkZWZpbmUgTVRQX0ZPUk1BVF9FWElGX0pQRUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzODAxICAgLy8gRXhjaGFuZ2VhYmxlIEZpbGUgRm9ybWF0LCBKRUlEQSBzdGFuZGFyZAorI2RlZmluZSBNVFBfRk9STUFUX1RJRkZfRVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDM4MDIgICAvLyBUYWcgSW1hZ2UgRmlsZSBGb3JtYXQgZm9yIEVsZWN0cm9uaWMgUGhvdG9ncmFwaHkKKyNkZWZpbmUgTVRQX0ZPUk1BVF9GTEFTSFBJWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzODAzICAgLy8gU3RydWN0dXJlZCBTdG9yYWdlIEltYWdlIEZvcm1hdAorI2RlZmluZSBNVFBfRk9STUFUX0JNUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDM4MDQgICAvLyBNaWNyb3NvZnQgV2luZG93cyBCaXRtYXAgZmlsZQorI2RlZmluZSBNVFBfRk9STUFUX0NJRkYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDM4MDUgICAvLyBDYW5vbiBDYW1lcmEgSW1hZ2UgRmlsZSBGb3JtYXQKKyNkZWZpbmUgTVRQX0ZPUk1BVF9HSUYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzODA3ICAgLy8gR3JhcGhpY3MgSW50ZXJjaGFuZ2UgRm9ybWF0CisjZGVmaW5lIE1UUF9GT1JNQVRfSkZJRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzgwOCAgIC8vIEpQRUcgRmlsZSBJbnRlcmNoYW5nZSBGb3JtYXQKKyNkZWZpbmUgTVRQX0ZPUk1BVF9DRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzODA5ICAgLy8gUGhvdG9DRCBJbWFnZSBQYWMKKyNkZWZpbmUgTVRQX0ZPUk1BVF9QSUNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzODBBICAgLy8gUXVpY2tkcmF3IEltYWdlIEZvcm1hdAorI2RlZmluZSBNVFBfRk9STUFUX1BORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDM4MEIgICAvLyBQb3J0YWJsZSBOZXR3b3JrIEdyYXBoaWNzCisjZGVmaW5lIE1UUF9GT1JNQVRfVElGRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzgwRCAgIC8vIFRhZyBJbWFnZSBGaWxlIEZvcm1hdAorI2RlZmluZSBNVFBfRk9STUFUX1RJRkZfSVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDM4MEUgICAvLyBUYWcgSW1hZ2UgRmlsZSBGb3JtYXQgZm9yIEluZm9ybWF0aW9uIFRlY2hub2xvZ3kgKGdyYXBoaWMgYXJ0cykKKyNkZWZpbmUgTVRQX0ZPUk1BVF9KUDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzODBGICAgLy8gSlBFRzIwMDAgQmFzZWxpbmUgRmlsZSBGb3JtYXQKKyNkZWZpbmUgTVRQX0ZPUk1BVF9KUFggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzODEwICAgLy8gSlBFRzIwMDAgRXh0ZW5kZWQgRmlsZSBGb3JtYXQKKyNkZWZpbmUgTVRQX0ZPUk1BVF9VTkRFRklORURfRklSTVdBUkUgICAgICAgICAgICAgICAgICAgMHhCODAyCisjZGVmaW5lIE1UUF9GT1JNQVRfV0lORE9XU19JTUFHRV9GT1JNQVQgICAgICAgICAgICAgICAgIDB4Qjg4MQorI2RlZmluZSBNVFBfRk9STUFUX1VOREVGSU5FRF9BVURJTyAgICAgICAgICAgICAgICAgICAgICAweEI5MDAKKyNkZWZpbmUgTVRQX0ZPUk1BVF9XTUEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhCOTAxCisjZGVmaW5lIE1UUF9GT1JNQVRfT0dHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4QjkwMgorI2RlZmluZSBNVFBfRk9STUFUX0FBQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEI5MDMKKyNkZWZpbmUgTVRQX0ZPUk1BVF9BVURJQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhCOTA0CisjZGVmaW5lIE1UUF9GT1JNQVRfRkxBQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4QjkwNgorI2RlZmluZSBNVFBfRk9STUFUX1VOREVGSU5FRF9WSURFTyAgICAgICAgICAgICAgICAgICAgICAweEI5ODAKKyNkZWZpbmUgTVRQX0ZPUk1BVF9XTVYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhCOTgxCisjZGVmaW5lIE1UUF9GT1JNQVRfTVA0X0NPTlRBSU5FUiAgICAgICAgICAgICAgICAgICAgICAgIDB4Qjk4MiAgLy8gSVNPIDE0NDk2LTEKKyNkZWZpbmUgTVRQX0ZPUk1BVF9NUDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhCOTgzCisjZGVmaW5lIE1UUF9GT1JNQVRfM0dQX0NPTlRBSU5FUiAgICAgICAgICAgICAgICAgICAgICAgIDB4Qjk4NCAgLy8gM0dQUCBmaWxlIGZvcm1hdC4gRGV0YWlsczogaHR0cDovL3d3dy4zZ3BwLm9yZy9mdHAvU3BlY3MvaHRtbC1pbmZvLzI2MjQ0Lmh0bSAocGFnZSB0aXRsZSAtIFx1MjAxY1RyYW5zcGFyZW50IGVuZC10by1lbmQgcGFja2V0IHN3aXRjaGVkIHN0cmVhbWluZyBzZXJ2aWNlLCAzR1BQIGZpbGUgZm9ybWF0XHUyMDFkKS4KKyNkZWZpbmUgTVRQX0ZPUk1BVF9VTkRFRklORURfQ09MTEVDVElPTiAgICAgICAgICAgICAgICAgMHhCQTAwCisjZGVmaW5lIE1UUF9GT1JNQVRfQUJTVFJBQ1RfTVVMVElNRURJQV9BTEJVTSAgICAgICAgICAgIDB4QkEwMQorI2RlZmluZSBNVFBfRk9STUFUX0FCU1RSQUNUX0lNQUdFX0FMQlVNICAgICAgICAgICAgICAgICAweEJBMDIKKyNkZWZpbmUgTVRQX0ZPUk1BVF9BQlNUUkFDVF9BVURJT19BTEJVTSAgICAgICAgICAgICAgICAgMHhCQTAzCisjZGVmaW5lIE1UUF9GT1JNQVRfQUJTVFJBQ1RfVklERU9fQUxCVU0gICAgICAgICAgICAgICAgIDB4QkEwNAorI2RlZmluZSBNVFBfRk9STUFUX0FCU1RSQUNUX0FWX1BMQVlMSVNUICAgICAgICAgICAgICAgICAweEJBMDUKKyNkZWZpbmUgTVRQX0ZPUk1BVF9BQlNUUkFDVF9DT05UQUNUX0dST1VQICAgICAgICAgICAgICAgMHhCQTA2CisjZGVmaW5lIE1UUF9GT1JNQVRfQUJTVFJBQ1RfTUVTU0FHRV9GT0xERVIgICAgICAgICAgICAgIDB4QkEwNworI2RlZmluZSBNVFBfRk9STUFUX0FCU1RSQUNUX0NIQVBURVJFRF9QUk9EVUNUSU9OICAgICAgICAweEJBMDgKKyNkZWZpbmUgTVRQX0ZPUk1BVF9BQlNUUkFDVF9BVURJT19QTEFZTElTVCAgICAgICAgICAgICAgMHhCQTA5CisjZGVmaW5lIE1UUF9GT1JNQVRfQUJTVFJBQ1RfVklERU9fUExBWUxJU1QgICAgICAgICAgICAgIDB4QkEwQQorI2RlZmluZSBNVFBfRk9STUFUX0FCU1RSQUNUX01FRElBQ0FTVCAgICAgICAgICAgICAgICAgICAweEJBMEIgLy8gRm9yIHVzZSB3aXRoIG1lZGlhY2FzdHM7IHJlZmVyZW5jZXMgbXVsdGltZWRpYSBlbmNsb3N1cmVzIG9mIFJTUyBmZWVkcyBvciBlcGlzb2RpYyBjb250ZW50CisjZGVmaW5lIE1UUF9GT1JNQVRfV1BMX1BMQVlMSVNUICAgICAgICAgICAgICAgICAgICAgICAgIDB4QkExMAorI2RlZmluZSBNVFBfRk9STUFUX00zVV9QTEFZTElTVCAgICAgICAgICAgICAgICAgICAgICAgICAweEJBMTEKKyNkZWZpbmUgTVRQX0ZPUk1BVF9NUExfUExBWUxJU1QgICAgICAgICAgICAgICAgICAgICAgICAgMHhCQTEyCisjZGVmaW5lIE1UUF9GT1JNQVRfQVNYX1BMQVlMSVNUICAgICAgICAgICAgICAgICAgICAgICAgIDB4QkExMworI2RlZmluZSBNVFBfRk9STUFUX1BMU19QTEFZTElTVCAgICAgICAgICAgICAgICAgICAgICAgICAweEJBMTQKKyNkZWZpbmUgTVRQX0ZPUk1BVF9VTkRFRklORURfRE9DVU1FTlQgICAgICAgICAgICAgICAgICAgMHhCQTgwCisjZGVmaW5lIE1UUF9GT1JNQVRfQUJTVFJBQ1RfRE9DVU1FTlQgICAgICAgICAgICAgICAgICAgIDB4QkE4MQorI2RlZmluZSBNVFBfRk9STUFUX1hNTF9ET0NVTUVOVCAgICAgICAgICAgICAgICAgICAgICAgICAweEJBODIKKyNkZWZpbmUgTVRQX0ZPUk1BVF9NU19XT1JEX0RPQ1VNRU5UICAgICAgICAgICAgICAgICAgICAgMHhCQTgzCisjZGVmaW5lIE1UUF9GT1JNQVRfTUhUX0NPTVBJTEVEX0hUTUxfRE9DVU1FTlQgICAgICAgICAgIDB4QkE4NAorI2RlZmluZSBNVFBfRk9STUFUX01TX0VYQ0VMX1NQUkVBRFNIRUVUICAgICAgICAgICAgICAgICAweEJBODUKKyNkZWZpbmUgTVRQX0ZPUk1BVF9NU19QT1dFUlBPSU5UX1BSRVNFTlRBVElPTiAgICAgICAgICAgMHhCQTg2CisjZGVmaW5lIE1UUF9GT1JNQVRfVU5ERUZJTkVEX01FU1NBR0UgICAgICAgICAgICAgICAgICAgIDB4QkIwMAorI2RlZmluZSBNVFBfRk9STUFUX0FCU1RSQUNUX01FU1NTQUdFICAgICAgICAgICAgICAgICAgICAweEJCMDEKKyNkZWZpbmUgTVRQX0ZPUk1BVF9VTkRFRklORURfQ09OVEFDVCAgICAgICAgICAgICAgICAgICAgMHhCQjgwCisjZGVmaW5lIE1UUF9GT1JNQVRfQUJTVFJBQ1RfQ09OVEFDVCAgICAgICAgICAgICAgICAgICAgIDB4QkI4MQorI2RlZmluZSBNVFBfRk9STUFUX1ZDQVJEXzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEJCODIKKworLy8gTVRQIE9iamVjdCBQcm9wZXJ0eSBDb2RlcworI2RlZmluZSBNVFBfUFJPUEVSVFlfU1RPUkFHRV9JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzAxCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9PQkpFQ1RfRk9STUFUICAgICAgICAgICAgICAgICAgICAgICAgICAweERDMDIKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1BST1RFQ1RJT05fU1RBVFVTICAgICAgICAgICAgICAgICAgICAgIDB4REMwMworI2RlZmluZSBNVFBfUFJPUEVSVFlfT0JKRUNUX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzA0CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9BU1NPQ0lBVElPTl9UWVBFICAgICAgICAgICAgICAgICAgICAgICAweERDMDUKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0FTU09DSUFUSU9OX0RFU0MgICAgICAgICAgICAgICAgICAgICAgIDB4REMwNgorI2RlZmluZSBNVFBfUFJPUEVSVFlfT0JKRUNUX0ZJTEVfTkFNRSAgICAgICAgICAgICAgICAgICAgICAgMHhEQzA3CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9EQVRFX0NSRUFURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDMDgKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0RBVEVfTU9ESUZJRUQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REMwOQorI2RlZmluZSBNVFBfUFJPUEVSVFlfS0VZV09SRFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzBBCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9QQVJFTlRfT0JKRUNUICAgICAgICAgICAgICAgICAgICAgICAgICAweERDMEIKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0FMTE9XRURfRk9MREVSX0NPTlRFTlRTICAgICAgICAgICAgICAgIDB4REMwQworI2RlZmluZSBNVFBfUFJPUEVSVFlfSElEREVOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzBECisjZGVmaW5lIE1UUF9QUk9QRVJUWV9TWVNURU1fT0JKRUNUICAgICAgICAgICAgICAgICAgICAgICAgICAweERDMEUKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1BFUlNJU1RFTlRfVUlEICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM0MQorI2RlZmluZSBNVFBfUFJPUEVSVFlfU1lOQ19JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzQyCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9QUk9QRVJUWV9CQUcgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDNDMKKyNkZWZpbmUgTVRQX1BST1BFUlRZX05BTUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM0NAorI2RlZmluZSBNVFBfUFJPUEVSVFlfQ1JFQVRFRF9CWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzQ1CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9BUlRJU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDNDYKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0RBVEVfQVVUSE9SRUQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM0NworI2RlZmluZSBNVFBfUFJPUEVSVFlfREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzQ4CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9VUkxfUkVGRVJFTkNFICAgICAgICAgICAgICAgICAgICAgICAgICAweERDNDkKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0xBTkdVQUdFX0xPQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgIDB4REM0QQorI2RlZmluZSBNVFBfUFJPUEVSVFlfQ09QWVJJR0hUX0lORk9STUFUSU9OICAgICAgICAgICAgICAgICAgMHhEQzRCCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9TT1VSQ0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDNEMKKyNkZWZpbmUgTVRQX1BST1BFUlRZX09SSUdJTl9MT0NBVElPTiAgICAgICAgICAgICAgICAgICAgICAgIDB4REM0RAorI2RlZmluZSBNVFBfUFJPUEVSVFlfREFURV9BRERFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzRFCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9OT05fQ09OU1VNQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAweERDNEYKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0NPUlJVUFRfVU5QTEFZQUJMRSAgICAgICAgICAgICAgICAgICAgIDB4REM1MAorI2RlZmluZSBNVFBfUFJPUEVSVFlfUFJPRFVDRVJfU0VSSUFMX05VTUJFUiAgICAgICAgICAgICAgICAgMHhEQzUxCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9SRVBSRVNFTlRBVElWRV9TQU1QTEVfRk9STUFUICAgICAgICAgICAweERDODEKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1JFUFJFU0VOVEFUSVZFX1NBTVBMRV9TSVpFICAgICAgICAgICAgIDB4REM4MgorI2RlZmluZSBNVFBfUFJPUEVSVFlfUkVQUkVTRU5UQVRJVkVfU0FNUExFX0hFSUdIVCAgICAgICAgICAgMHhEQzgzCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9SRVBSRVNFTlRBVElWRV9TQU1QTEVfV0lEVEggICAgICAgICAgICAweERDODQKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1JFUFJFU0VOVEFUSVZFX1NBTVBMRV9EVVJBVElPTiAgICAgICAgIDB4REM4NQorI2RlZmluZSBNVFBfUFJPUEVSVFlfUkVQUkVTRU5UQVRJVkVfU0FNUExFX0RBVEEgICAgICAgICAgICAgMHhEQzg2CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDODcKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0hFSUdIVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM4OAorI2RlZmluZSBNVFBfUFJPUEVSVFlfRFVSQVRJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzg5CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9SQVRJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDOEEKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1RSQUNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM4QgorI2RlZmluZSBNVFBfUFJPUEVSVFlfR0VOUkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzhDCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9DUkVESVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDOEQKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0xZUklDUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM4RQorI2RlZmluZSBNVFBfUFJPUEVSVFlfU1VCU0NSSVBUSU9OX0NPTlRFTlRfSUQgICAgICAgICAgICAgICAgMHhEQzhGCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9QUk9EVUNFRF9CWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDOTAKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1VTRV9DT1VOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM5MQorI2RlZmluZSBNVFBfUFJPUEVSVFlfU0tJUF9DT1VOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzkyCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9MQVNUX0FDQ0VTU0VEICAgICAgICAgICAgICAgICAgICAgICAgICAweERDOTMKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1BBUkVOVEFMX1JBVElORyAgICAgICAgICAgICAgICAgICAgICAgIDB4REM5NAorI2RlZmluZSBNVFBfUFJPUEVSVFlfTUVUQV9HRU5SRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzk1CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9DT01QT1NFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDOTYKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0VGRkVDVElWRV9SQVRJTkcgICAgICAgICAgICAgICAgICAgICAgIDB4REM5NworI2RlZmluZSBNVFBfUFJPUEVSVFlfU1VCVElUTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzk4CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9PUklHSU5BTF9SRUxFQVNFX0RBVEUgICAgICAgICAgICAgICAgICAweERDOTkKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0FMQlVNX05BTUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM5QQorI2RlZmluZSBNVFBfUFJPUEVSVFlfQUxCVU1fQVJUSVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzlCCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9NT09EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDOUMKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0RSTV9TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM5RAorI2RlZmluZSBNVFBfUFJPUEVSVFlfU1VCX0RFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzlFCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9JU19DUk9QUEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDRDEKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0lTX0NPTE9VUl9DT1JSRUNURUQgICAgICAgICAgICAgICAgICAgIDB4RENEMgorI2RlZmluZSBNVFBfUFJPUEVSVFlfSU1BR0VfQklUX0RFUFRIICAgICAgICAgICAgICAgICAgICAgICAgMHhEQ0QzCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9GX05VTUJFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDRDQKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0VYUE9TVVJFX1RJTUUgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RENENQorI2RlZmluZSBNVFBfUFJPUEVSVFlfRVhQT1NVUkVfSU5ERVggICAgICAgICAgICAgICAgICAgICAgICAgMHhEQ0Q2CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9UT1RBTF9CSVRSQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAweERFOTEKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0JJVFJBVEVfVFlQRSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REU5MgorI2RlZmluZSBNVFBfUFJPUEVSVFlfU0FNUExFX1JBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhERTkzCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9OVU1CRVJfT0ZfQ0hBTk5FTFMgICAgICAgICAgICAgICAgICAgICAweERFOTQKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0FVRElPX0JJVF9ERVBUSCAgICAgICAgICAgICAgICAgICAgICAgIDB4REU5NQorI2RlZmluZSBNVFBfUFJPUEVSVFlfU0NBTl9UWVBFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhERTk3CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9BVURJT19XQVZFX0NPREVDICAgICAgICAgICAgICAgICAgICAgICAweERFOTkKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0FVRElPX0JJVFJBVEUgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REU5QQorI2RlZmluZSBNVFBfUFJPUEVSVFlfVklERU9fRk9VUkNDX0NPREVDICAgICAgICAgICAgICAgICAgICAgMHhERTlCCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9WSURFT19CSVRSQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAweERFOUMKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0ZSQU1FU19QRVJfVEhPVVNBTkRfU0VDT05EUyAgICAgICAgICAgIDB4REU5RAorI2RlZmluZSBNVFBfUFJPUEVSVFlfS0VZRlJBTUVfRElTVEFOQ0UgICAgICAgICAgICAgICAgICAgICAgMHhERTlFCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9CVUZGRVJfU0laRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERFOUYKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0VOQ09ESU5HX1FVQUxJVFkgICAgICAgICAgICAgICAgICAgICAgIDB4REVBMAorI2RlZmluZSBNVFBfUFJPUEVSVFlfRU5DT0RJTkdfUFJPRklMRSAgICAgICAgICAgICAgICAgICAgICAgMHhERUExCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9ESVNQTEFZX05BTUUgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDRTAKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0JPRFlfVEVYVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RENFMQorI2RlZmluZSBNVFBfUFJPUEVSVFlfU1VCSkVDVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQ0UyCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9QUklPUklUWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDRTMKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0dJVkVOX05BTUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REQwMAorI2RlZmluZSBNVFBfUFJPUEVSVFlfTUlERExFX05BTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhERDAxCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9GQU1JTFlfTkFNRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEREMDIKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1BSRUZJWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REQwMworI2RlZmluZSBNVFBfUFJPUEVSVFlfU1VGRklYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhERDA0CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9QSE9ORVRJQ19HSVZFTl9OQU1FICAgICAgICAgICAgICAgICAgICAweEREMDUKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1BIT05FVElDX0ZBTUlMWV9OQU1FICAgICAgICAgICAgICAgICAgIDB4REQwNgorI2RlZmluZSBNVFBfUFJPUEVSVFlfRU1BSUxfUFJJTUFSWSAgICAgICAgICAgICAgICAgICAgICAgICAgMHhERDA3CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9FTUFJTF9QRVJTT05BTF8xICAgICAgICAgICAgICAgICAgICAgICAweEREMDgKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0VNQUlMX1BFUlNPTkFMXzIgICAgICAgICAgICAgICAgICAgICAgIDB4REQwOQorI2RlZmluZSBNVFBfUFJPUEVSVFlfRU1BSUxfQlVTSU5FU1NfMSAgICAgICAgICAgICAgICAgICAgICAgMHhERDBBCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9FTUFJTF9CVVNJTkVTU18yICAgICAgICAgICAgICAgICAgICAgICAweEREMEIKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0VNQUlMX09USEVSUyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REQwQworI2RlZmluZSBNVFBfUFJPUEVSVFlfUEhPTkVfTlVNQkVSX1BSSU1BUlkgICAgICAgICAgICAgICAgICAgMHhERDBECisjZGVmaW5lIE1UUF9QUk9QRVJUWV9QSE9ORV9OVU1CRVJfUEVSU09OQUwgICAgICAgICAgICAgICAgICAweEREMEUKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1BIT05FX05VTUJFUl9QRVJTT05BTF8yICAgICAgICAgICAgICAgIDB4REQwRgorI2RlZmluZSBNVFBfUFJPUEVSVFlfUEhPTkVfTlVNQkVSX0JVU0lORVNTICAgICAgICAgICAgICAgICAgMHhERDEwCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9QSE9ORV9OVU1CRVJfQlVTSU5FU1NfMiAgICAgICAgICAgICAgICAweEREMTEKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1BIT05FX05VTUJFUl9NT0JJTEUgICAgICAgICAgICAgICAgICAgIDB4REQxMgorI2RlZmluZSBNVFBfUFJPUEVSVFlfUEhPTkVfTlVNQkVSX01PQklMRV8yICAgICAgICAgICAgICAgICAgMHhERDEzCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9GQVhfTlVNQkVSX1BSSU1BUlkgICAgICAgICAgICAgICAgICAgICAweEREMTQKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0ZBWF9OVU1CRVJfUEVSU09OQUwgICAgICAgICAgICAgICAgICAgIDB4REQxNQorI2RlZmluZSBNVFBfUFJPUEVSVFlfRkFYX05VTUJFUl9CVVNJTkVTUyAgICAgICAgICAgICAgICAgICAgMHhERDE2CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9QQUdFUl9OVU1CRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAweEREMTcKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1BIT05FX05VTUJFUl9PVEhFUlMgICAgICAgICAgICAgICAgICAgIDB4REQxOAorI2RlZmluZSBNVFBfUFJPUEVSVFlfUFJJTUFSWV9XRUJfQUREUkVTUyAgICAgICAgICAgICAgICAgICAgMHhERDE5CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9QRVJTT05BTF9XRUJfQUREUkVTUyAgICAgICAgICAgICAgICAgICAweEREMUEKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0JVU0lORVNTX1dFQl9BRERSRVNTICAgICAgICAgICAgICAgICAgIDB4REQxQgorI2RlZmluZSBNVFBfUFJPUEVSVFlfSU5TVEFOVF9NRVNTQU5HRVJfQUREUkVTUyAgICAgICAgICAgICAgMHhERDFDCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9JTlNUQU5UX01FU1NBTkdFUl9BRERSRVNTXzIgICAgICAgICAgICAweEREMUQKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0lOU1RBTlRfTUVTU0FOR0VSX0FERFJFU1NfMyAgICAgICAgICAgIDB4REQxRQorI2RlZmluZSBNVFBfUFJPUEVSVFlfUE9TVEFMX0FERFJFU1NfUEVSU09OQUxfRlVMTCAgICAgICAgICAgMHhERDFGCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9QT1NUQUxfQUREUkVTU19QRVJTT05BTF9MSU5FXzEgICAgICAgICAweEREMjAKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1BPU1RBTF9BRERSRVNTX1BFUlNPTkFMX0xJTkVfMiAgICAgICAgIDB4REQyMQorI2RlZmluZSBNVFBfUFJPUEVSVFlfUE9TVEFMX0FERFJFU1NfUEVSU09OQUxfQ0lUWSAgICAgICAgICAgMHhERDIyCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9QT1NUQUxfQUREUkVTU19QRVJTT05BTF9SRUdJT04gICAgICAgICAweEREMjMKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1BPU1RBTF9BRERSRVNTX1BFUlNPTkFMX1BPU1RBTF9DT0RFICAgIDB4REQyNAorI2RlZmluZSBNVFBfUFJPUEVSVFlfUE9TVEFMX0FERFJFU1NfUEVSU09OQUxfQ09VTlRSWSAgICAgICAgMHhERDI1CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9QT1NUQUxfQUREUkVTU19CVVNJTkVTU19GVUxMICAgICAgICAgICAweEREMjYKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1BPU1RBTF9BRERSRVNTX0JVU0lORVNTX0xJTkVfMSAgICAgICAgIDB4REQyNworI2RlZmluZSBNVFBfUFJPUEVSVFlfUE9TVEFMX0FERFJFU1NfQlVTSU5FU1NfTElORV8yICAgICAgICAgMHhERDI4CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9QT1NUQUxfQUREUkVTU19CVVNJTkVTU19DSVRZICAgICAgICAgICAweEREMjkKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1BPU1RBTF9BRERSRVNTX0JVU0lORVNTX1JFR0lPTiAgICAgICAgIDB4REQyQQorI2RlZmluZSBNVFBfUFJPUEVSVFlfUE9TVEFMX0FERFJFU1NfQlVTSU5FU1NfUE9TVEFMX0NPREUgICAgMHhERDJCCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9QT1NUQUxfQUREUkVTU19CVVNJTkVTU19DT1VOVFJZICAgICAgICAweEREMkMKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1BPU1RBTF9BRERSRVNTX09USEVSX0ZVTEwgICAgICAgICAgICAgIDB4REQyRAorI2RlZmluZSBNVFBfUFJPUEVSVFlfUE9TVEFMX0FERFJFU1NfT1RIRVJfTElORV8xICAgICAgICAgICAgMHhERDJFCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9QT1NUQUxfQUREUkVTU19PVEhFUl9MSU5FXzIgICAgICAgICAgICAweEREMkYKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1BPU1RBTF9BRERSRVNTX09USEVSX0NJVFkgICAgICAgICAgICAgIDB4REQzMAorI2RlZmluZSBNVFBfUFJPUEVSVFlfUE9TVEFMX0FERFJFU1NfT1RIRVJfUkVHSU9OICAgICAgICAgICAgMHhERDMxCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9QT1NUQUxfQUREUkVTU19PVEhFUl9QT1NUQUxfQ09ERSAgICAgICAweEREMzIKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1BPU1RBTF9BRERSRVNTX09USEVSX0NPVU5UUlkgICAgICAgICAgIDB4REQzMworI2RlZmluZSBNVFBfUFJPUEVSVFlfT1JHQU5JWkFUSU9OX05BTUUgICAgICAgICAgICAgICAgICAgICAgMHhERDM0CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9QSE9ORVRJQ19PUkdBTklaQVRJT05fTkFNRSAgICAgICAgICAgICAweEREMzUKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1JPTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REQzNgorI2RlZmluZSBNVFBfUFJPUEVSVFlfQklSVEhEQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhERDM3CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9NRVNTQUdFX1RPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERENDAKKyNkZWZpbmUgTVRQX1BST1BFUlRZX01FU1NBR0VfQ0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REQ0MQorI2RlZmluZSBNVFBfUFJPUEVSVFlfTUVTU0FHRV9CQ0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhERDQyCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9NRVNTQUdFX1JFQUQgICAgICAgICAgICAgICAgICAgICAgICAgICAweERENDMKKyNkZWZpbmUgTVRQX1BST1BFUlRZX01FU1NBR0VfUkVDRUlWRURfVElNRSAgICAgICAgICAgICAgICAgIDB4REQ0NAorI2RlZmluZSBNVFBfUFJPUEVSVFlfTUVTU0FHRV9TRU5ERVIgICAgICAgICAgICAgICAgICAgICAgICAgMHhERDQ1CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9BQ1RJVklUWV9CRUdJTl9USU1FICAgICAgICAgICAgICAgICAgICAweERENTAKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0FDVElWSVRZX0VORF9USU1FICAgICAgICAgICAgICAgICAgICAgIDB4REQ1MQorI2RlZmluZSBNVFBfUFJPUEVSVFlfQUNUSVZJVFlfTE9DQVRJT04gICAgICAgICAgICAgICAgICAgICAgMHhERDUyCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9BQ1RJVklUWV9SRVFVSVJFRF9BVFRFTkRFRVMgICAgICAgICAgICAweERENTQKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0FDVElWSVRZX09QVElPTkFMX0FUVEVOREVFUyAgICAgICAgICAgIDB4REQ1NQorI2RlZmluZSBNVFBfUFJPUEVSVFlfQUNUSVZJVFlfUkVTT1VSQ0VTICAgICAgICAgICAgICAgICAgICAgMHhERDU2CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9BQ1RJVklUWV9BQ0NFUFRFRCAgICAgICAgICAgICAgICAgICAgICAweERENTcKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0FDVElWSVRZX1RFTlRBVElWRSAgICAgICAgICAgICAgICAgICAgIDB4REQ1OAorI2RlZmluZSBNVFBfUFJPUEVSVFlfQUNUSVZJVFlfREVDTElORUQgICAgICAgICAgICAgICAgICAgICAgMHhERDU5CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9BQ1RJVklUWV9SRU1BSU5ERVJfVElNRSAgICAgICAgICAgICAgICAweERENUEKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0FDVElWSVRZX09XTkVSICAgICAgICAgICAgICAgICAgICAgICAgIDB4REQ1QgorI2RlZmluZSBNVFBfUFJPUEVSVFlfQUNUSVZJVFlfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgICAgMHhERDVDCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9PV05FUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERENUQKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0VESVRPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REQ1RQorI2RlZmluZSBNVFBfUFJPUEVSVFlfV0VCTUFTVEVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhERDVGCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9VUkxfU09VUkNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERENjAKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1VSTF9ERVNUSU5BVElPTiAgICAgICAgICAgICAgICAgICAgICAgIDB4REQ2MQorI2RlZmluZSBNVFBfUFJPUEVSVFlfVElNRV9CT09LTUFSSyAgICAgICAgICAgICAgICAgICAgICAgICAgMHhERDYyCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9PQkpFQ1RfQk9PS01BUksgICAgICAgICAgICAgICAgICAgICAgICAweERENjMKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0JZVEVfQk9PS01BUksgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REQ2NAorI2RlZmluZSBNVFBfUFJPUEVSVFlfTEFTVF9CVUlMRF9EQVRFICAgICAgICAgICAgICAgICAgICAgICAgMHhERDcwCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9USU1FX1RPX0xJVkUgICAgICAgICAgICAgICAgICAgICAgICAgICAweERENzEKKyNkZWZpbmUgTVRQX1BST1BFUlRZX01FRElBX0dVSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REQ3MgorCisvLyBNVFAgRGV2aWNlIFByb3BlcnR5IENvZGVzCisjZGVmaW5lIE1UUF9ERVZJQ0VfUFJPUEVSVFlfVU5ERUZJTkVEICAgICAgICAgICAgICAgICAgICAgICAweDUwMDAKKyNkZWZpbmUgTVRQX0RFVklDRV9QUk9QRVJUWV9CQVRURVJZX0xFVkVMICAgICAgICAgICAgICAgICAgIDB4NTAwMQorI2RlZmluZSBNVFBfREVWSUNFX1BST1BFUlRZX0ZVTkNUSU9OQUxfTU9ERSAgICAgICAgICAgICAgICAgMHg1MDAyCisjZGVmaW5lIE1UUF9ERVZJQ0VfUFJPUEVSVFlfSU1BR0VfU0laRSAgICAgICAgICAgICAgICAgICAgICAweDUwMDMKKyNkZWZpbmUgTVRQX0RFVklDRV9QUk9QRVJUWV9DT01QUkVTU0lPTl9TRVRUSU5HICAgICAgICAgICAgIDB4NTAwNAorI2RlZmluZSBNVFBfREVWSUNFX1BST1BFUlRZX1dISVRFX0JBTEFOQ0UgICAgICAgICAgICAgICAgICAgMHg1MDA1CisjZGVmaW5lIE1UUF9ERVZJQ0VfUFJPUEVSVFlfUkdCX0dBSU4gICAgICAgICAgICAgICAgICAgICAgICAweDUwMDYKKyNkZWZpbmUgTVRQX0RFVklDRV9QUk9QRVJUWV9GX05VTUJFUiAgICAgICAgICAgICAgICAgICAgICAgIDB4NTAwNworI2RlZmluZSBNVFBfREVWSUNFX1BST1BFUlRZX0ZPQ0FMX0xFTkdUSCAgICAgICAgICAgICAgICAgICAgMHg1MDA4CisjZGVmaW5lIE1UUF9ERVZJQ0VfUFJPUEVSVFlfRk9DVVNfRElTVEFOQ0UgICAgICAgICAgICAgICAgICAweDUwMDkKKyNkZWZpbmUgTVRQX0RFVklDRV9QUk9QRVJUWV9GT0NVU19NT0RFICAgICAgICAgICAgICAgICAgICAgIDB4NTAwQQorI2RlZmluZSBNVFBfREVWSUNFX1BST1BFUlRZX0VYUE9TVVJFX01FVEVSSU5HX01PREUgICAgICAgICAgMHg1MDBCCisjZGVmaW5lIE1UUF9ERVZJQ0VfUFJPUEVSVFlfRkxBU0hfTU9ERSAgICAgICAgICAgICAgICAgICAgICAweDUwMEMKKyNkZWZpbmUgTVRQX0RFVklDRV9QUk9QRVJUWV9FWFBPU1VSRV9USU1FICAgICAgICAgICAgICAgICAgIDB4NTAwRAorI2RlZmluZSBNVFBfREVWSUNFX1BST1BFUlRZX0VYUE9TVVJFX1BST0dSQU1fTU9ERSAgICAgICAgICAgMHg1MDBFCisjZGVmaW5lIE1UUF9ERVZJQ0VfUFJPUEVSVFlfRVhQT1NVUkVfSU5ERVggICAgICAgICAgICAgICAgICAweDUwMEYKKyNkZWZpbmUgTVRQX0RFVklDRV9QUk9QRVJUWV9FWFBPU1VSRV9CSUFTX0NPTVBFTlNBVElPTiAgICAgIDB4NTAxMAorI2RlZmluZSBNVFBfREVWSUNFX1BST1BFUlRZX0RBVEVUSU1FICAgICAgICAgICAgICAgICAgICAgICAgMHg1MDExCisjZGVmaW5lIE1UUF9ERVZJQ0VfUFJPUEVSVFlfQ0FQVFVSRV9ERUxBWSAgICAgICAgICAgICAgICAgICAweDUwMTIKKyNkZWZpbmUgTVRQX0RFVklDRV9QUk9QRVJUWV9TVElMTF9DQVBUVVJFX01PREUgICAgICAgICAgICAgIDB4NTAxMworI2RlZmluZSBNVFBfREVWSUNFX1BST1BFUlRZX0NPTlRSQVNUICAgICAgICAgICAgICAgICAgICAgICAgMHg1MDE0CisjZGVmaW5lIE1UUF9ERVZJQ0VfUFJPUEVSVFlfU0hBUlBORVNTICAgICAgICAgICAgICAgICAgICAgICAweDUwMTUKKyNkZWZpbmUgTVRQX0RFVklDRV9QUk9QRVJUWV9ESUdJVEFMX1pPT00gICAgICAgICAgICAgICAgICAgIDB4NTAxNgorI2RlZmluZSBNVFBfREVWSUNFX1BST1BFUlRZX0VGRkVDVF9NT0RFICAgICAgICAgICAgICAgICAgICAgMHg1MDE3CisjZGVmaW5lIE1UUF9ERVZJQ0VfUFJPUEVSVFlfQlVSU1RfTlVNQkVSICAgICAgICAgICAgICAgICAgICAweDUwMTgKKyNkZWZpbmUgTVRQX0RFVklDRV9QUk9QRVJUWV9CVVJTVF9JTlRFUlZBTCAgICAgICAgICAgICAgICAgIDB4NTAxOQorI2RlZmluZSBNVFBfREVWSUNFX1BST1BFUlRZX1RJTUVMQVBTRV9OVU1CRVIgICAgICAgICAgICAgICAgMHg1MDFBCisjZGVmaW5lIE1UUF9ERVZJQ0VfUFJPUEVSVFlfVElNRUxBUFNFX0lOVEVSVkFMICAgICAgICAgICAgICAweDUwMUIKKyNkZWZpbmUgTVRQX0RFVklDRV9QUk9QRVJUWV9GT0NVU19NRVRFUklOR19NT0RFICAgICAgICAgICAgIDB4NTAxQworI2RlZmluZSBNVFBfREVWSUNFX1BST1BFUlRZX1VQTE9BRF9VUkwgICAgICAgICAgICAgICAgICAgICAgMHg1MDFECisjZGVmaW5lIE1UUF9ERVZJQ0VfUFJPUEVSVFlfQVJUSVNUICAgICAgICAgICAgICAgICAgICAgICAgICAweDUwMUUKKyNkZWZpbmUgTVRQX0RFVklDRV9QUk9QRVJUWV9DT1BZUklHSFRfSU5GTyAgICAgICAgICAgICAgICAgIDB4NTAxRgorI2RlZmluZSBNVFBfREVWSUNFX1BST1BFUlRZX1NZTkNIUk9OSVpBVElPTl9QQVJUTkVSICAgICAgICAgMHhENDAxCisjZGVmaW5lIE1UUF9ERVZJQ0VfUFJPUEVSVFlfREVWSUNFX0ZSSUVORExZX05BTUUgICAgICAgICAgICAweEQ0MDIKKyNkZWZpbmUgTVRQX0RFVklDRV9QUk9QRVJUWV9WT0xVTUUgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RDQwMworI2RlZmluZSBNVFBfREVWSUNFX1BST1BFUlRZX1NVUFBPUlRFRF9GT1JNQVRTX09SREVSRUQgICAgICAgMHhENDA0CisjZGVmaW5lIE1UUF9ERVZJQ0VfUFJPUEVSVFlfREVWSUNFX0lDT04gICAgICAgICAgICAgICAgICAgICAweEQ0MDUKKyNkZWZpbmUgTVRQX0RFVklDRV9QUk9QRVJUWV9QTEFZQkFDS19SQVRFICAgICAgICAgICAgICAgICAgIDB4RDQxMAorI2RlZmluZSBNVFBfREVWSUNFX1BST1BFUlRZX1BMQVlCQUNLX09CSkVDVCAgICAgICAgICAgICAgICAgMHhENDExCisjZGVmaW5lIE1UUF9ERVZJQ0VfUFJPUEVSVFlfUExBWUJBQ0tfQ09OVEFJTkVSX0lOREVYICAgICAgICAweEQ0MTIKKyNkZWZpbmUgTVRQX0RFVklDRV9QUk9QRVJUWV9TRVNTSU9OX0lOSVRJQVRPUl9WRVJTSU9OX0lORk8gIDB4RDQwNgorI2RlZmluZSBNVFBfREVWSUNFX1BST1BFUlRZX1BFUkNFSVZFRF9ERVZJQ0VfVFlQRSAgICAgICAgICAgMHhENDA3CisKKy8vIE1UUCBPcGVyYXRpb24gQ29kZXMKKyNkZWZpbmUgTVRQX09QRVJBVElPTl9HRVRfREVWSUNFX0lORk8gICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMQorI2RlZmluZSBNVFBfT1BFUkFUSU9OX09QRU5fU0VTU0lPTiAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDAyCisjZGVmaW5lIE1UUF9PUEVSQVRJT05fQ0xPU0VfU0VTU0lPTiAgICAgICAgICAgICAgICAgICAgICAgICAweDEwMDMKKyNkZWZpbmUgTVRQX09QRVJBVElPTl9HRVRfU1RPUkFHRV9JRFMgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwNAorI2RlZmluZSBNVFBfT1BFUkFUSU9OX0dFVF9TVE9SQUdFX0lORk8gICAgICAgICAgICAgICAgICAgICAgMHgxMDA1CisjZGVmaW5lIE1UUF9PUEVSQVRJT05fR0VUX05VTV9PQkpFQ1RTICAgICAgICAgICAgICAgICAgICAgICAweDEwMDYKKyNkZWZpbmUgTVRQX09QRVJBVElPTl9HRVRfT0JKRUNUX0hBTkRMRVMgICAgICAgICAgICAgICAgICAgIDB4MTAwNworI2RlZmluZSBNVFBfT1BFUkFUSU9OX0dFVF9PQkpFQ1RfSU5GTyAgICAgICAgICAgICAgICAgICAgICAgMHgxMDA4CisjZGVmaW5lIE1UUF9PUEVSQVRJT05fR0VUX09CSkVDVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwMDkKKyNkZWZpbmUgTVRQX09QRVJBVElPTl9HRVRfVEhVTUIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwQQorI2RlZmluZSBNVFBfT1BFUkFUSU9OX0RFTEVURV9PQkpFQ1QgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDBCCisjZGVmaW5lIE1UUF9PUEVSQVRJT05fU0VORF9PQkpFQ1RfSU5GTyAgICAgICAgICAgICAgICAgICAgICAweDEwMEMKKyNkZWZpbmUgTVRQX09QRVJBVElPTl9TRU5EX09CSkVDVCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwRAorI2RlZmluZSBNVFBfT1BFUkFUSU9OX0lOSVRJQVRFX0NBUFRVUkUgICAgICAgICAgICAgICAgICAgICAgMHgxMDBFCisjZGVmaW5lIE1UUF9PUEVSQVRJT05fRk9STUFUX1NUT1JFICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwMEYKKyNkZWZpbmUgTVRQX09QRVJBVElPTl9SRVNFVF9ERVZJQ0UgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAxMAorI2RlZmluZSBNVFBfT1BFUkFUSU9OX1NFTEZfVEVTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDExCisjZGVmaW5lIE1UUF9PUEVSQVRJT05fU0VUX09CSkVDVF9QUk9URUNUSU9OICAgICAgICAgICAgICAgICAweDEwMTIKKyNkZWZpbmUgTVRQX09QRVJBVElPTl9QT1dFUl9ET1dOICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAxMworI2RlZmluZSBNVFBfT1BFUkFUSU9OX0dFVF9ERVZJQ0VfUFJPUF9ERVNDICAgICAgICAgICAgICAgICAgMHgxMDE0CisjZGVmaW5lIE1UUF9PUEVSQVRJT05fR0VUX0RFVklDRV9QUk9QX1ZBTFVFICAgICAgICAgICAgICAgICAweDEwMTUKKyNkZWZpbmUgTVRQX09QRVJBVElPTl9TRVRfREVWSUNFX1BST1BfVkFMVUUgICAgICAgICAgICAgICAgIDB4MTAxNgorI2RlZmluZSBNVFBfT1BFUkFUSU9OX1JFU0VUX0RFVklDRV9QUk9QX1ZBTFVFICAgICAgICAgICAgICAgMHgxMDE3CisjZGVmaW5lIE1UUF9PUEVSQVRJT05fVEVSTUlOQVRFX09QRU5fQ0FQVFVSRSAgICAgICAgICAgICAgICAweDEwMTgKKyNkZWZpbmUgTVRQX09QRVJBVElPTl9NT1ZFX09CSkVDVCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAxOQorI2RlZmluZSBNVFBfT1BFUkFUSU9OX0NPUFlfT0JKRUNUICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDFBCisjZGVmaW5lIE1UUF9PUEVSQVRJT05fR0VUX1BBUlRJQUxfT0JKRUNUICAgICAgICAgICAgICAgICAgICAweDEwMUIKKyNkZWZpbmUgTVRQX09QRVJBVElPTl9JTklUSUFURV9PUEVOX0NBUFRVUkUgICAgICAgICAgICAgICAgIDB4MTAxQworI2RlZmluZSBNVFBfT1BFUkFUSU9OX0dFVF9PQkpFQ1RfUFJPUFNfU1VQUE9SVEVEICAgICAgICAgICAgMHg5ODAxCisjZGVmaW5lIE1UUF9PUEVSQVRJT05fR0VUX09CSkVDVF9QUk9QX0RFU0MgICAgICAgICAgICAgICAgICAweDk4MDIKKyNkZWZpbmUgTVRQX09QRVJBVElPTl9HRVRfT0JKRUNUX1BST1BfVkFMVUUgICAgICAgICAgICAgICAgIDB4OTgwMworI2RlZmluZSBNVFBfT1BFUkFUSU9OX1NFVF9PQkpFQ1RfUFJPUF9WQUxVRSAgICAgICAgICAgICAgICAgMHg5ODA0CisjZGVmaW5lIE1UUF9PUEVSQVRJT05fR0VUX09CSkVDVF9SRUZFUkVOQ0VTICAgICAgICAgICAgICAgICAweDk4MTAKKyNkZWZpbmUgTVRQX09QRVJBVElPTl9TRVRfT0JKRUNUX1JFRkVSRU5DRVMgICAgICAgICAgICAgICAgIDB4OTgxMQorI2RlZmluZSBNVFBfT1BFUkFUSU9OX1NLSVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg5ODIwCisKKy8vIE1UUCBSZXNwb25zZSBDb2RlcworI2RlZmluZSBNVFBfUkVTUE9OU0VfVU5ERUZJTkVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAwMAorI2RlZmluZSBNVFBfUkVTUE9OU0VfT0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAwMQorI2RlZmluZSBNVFBfUkVTUE9OU0VfR0VORVJBTF9FUlJPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAwMgorI2RlZmluZSBNVFBfUkVTUE9OU0VfU0VTU0lPTl9OT1RfT1BFTiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAwMworI2RlZmluZSBNVFBfUkVTUE9OU0VfSU5WQUxJRF9UUkFOU0FDVElPTl9JRCAgICAgICAgICAgICAgICAgICAgIDB4MjAwNAorI2RlZmluZSBNVFBfUkVTUE9OU0VfT1BFUkFUSU9OX05PVF9TVVBQT1JURUQgICAgICAgICAgICAgICAgICAgIDB4MjAwNQorI2RlZmluZSBNVFBfUkVTUE9OU0VfUEFSQU1FVEVSX05PVF9TVVBQT1JURUQgICAgICAgICAgICAgICAgICAgIDB4MjAwNgorI2RlZmluZSBNVFBfUkVTUE9OU0VfSU5DT01QTEVURV9UUkFOU0ZFUiAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAwNworI2RlZmluZSBNVFBfUkVTUE9OU0VfSU5WQUxJRF9TVE9SQUdFX0lEICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAwOAorI2RlZmluZSBNVFBfUkVTUE9OU0VfSU5WQUxJRF9PQkpFQ1RfSEFORExFICAgICAgICAgICAgICAgICAgICAgIDB4MjAwOQorI2RlZmluZSBNVFBfUkVTUE9OU0VfREVWSUNFX1BST1BfTk9UX1NVUFBPUlRFRCAgICAgICAgICAgICAgICAgIDB4MjAwQQorI2RlZmluZSBNVFBfUkVTUE9OU0VfSU5WQUxJRF9PQkpFQ1RfRk9STUFUX0NPREUgICAgICAgICAgICAgICAgIDB4MjAwQgorI2RlZmluZSBNVFBfUkVTUE9OU0VfU1RPUkFHRV9GVUxMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAwQworI2RlZmluZSBNVFBfUkVTUE9OU0VfT0JKRUNUX1dSSVRFX1BST1RFQ1RFRCAgICAgICAgICAgICAgICAgICAgIDB4MjAwRAorI2RlZmluZSBNVFBfUkVTUE9OU0VfU1RPUkVfUkVBRF9PTkxZICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAwRQorI2RlZmluZSBNVFBfUkVTUE9OU0VfQUNDRVNTX0RFTklFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAwRgorI2RlZmluZSBNVFBfUkVTUE9OU0VfTk9fVEhVTUJOQUlMX1BSRVNFTlQgICAgICAgICAgICAgICAgICAgICAgIDB4MjAxMAorI2RlZmluZSBNVFBfUkVTUE9OU0VfU0VMRl9URVNUX0ZBSUxFRCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAxMQorI2RlZmluZSBNVFBfUkVTUE9OU0VfUEFSVElBTF9ERUxFVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAxMgorI2RlZmluZSBNVFBfUkVTUE9OU0VfU1RPUkVfTk9UX0FWQUlMQUJMRSAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAxMworI2RlZmluZSBNVFBfUkVTUE9OU0VfU1BFQ0lGSUNBVElPTl9CWV9GT1JNQVRfVU5TVVBQT1JURUQgICAgICAgIDB4MjAxNAorI2RlZmluZSBNVFBfUkVTUE9OU0VfTk9fVkFMSURfT0JKRUNUX0lORk8gICAgICAgICAgICAgICAgICAgICAgIDB4MjAxNQorI2RlZmluZSBNVFBfUkVTUE9OU0VfSU5WQUxJRF9DT0RFX0ZPUk1BVCAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAxNgorI2RlZmluZSBNVFBfUkVTUE9OU0VfVU5LTk9XTl9WRU5ET1JfQ09ERSAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAxNworI2RlZmluZSBNVFBfUkVTUE9OU0VfQ0FQVFVSRV9BTFJFQURZX1RFUk1JTkFURUQgICAgICAgICAgICAgICAgIDB4MjAxOAorI2RlZmluZSBNVFBfUkVTUE9OU0VfREVWSUNFX0JVU1kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAxOQorI2RlZmluZSBNVFBfUkVTUE9OU0VfSU5WQUxJRF9QQVJFTlRfT0JKRUNUICAgICAgICAgICAgICAgICAgICAgIDB4MjAxQQorI2RlZmluZSBNVFBfUkVTUE9OU0VfSU5WQUxJRF9ERVZJQ0VfUFJPUF9GT1JNQVQgICAgICAgICAgICAgICAgIDB4MjAxQgorI2RlZmluZSBNVFBfUkVTUE9OU0VfSU5WQUxJRF9ERVZJQ0VfUFJPUF9WQUxVRSAgICAgICAgICAgICAgICAgIDB4MjAxQworI2RlZmluZSBNVFBfUkVTUE9OU0VfSU5WQUxJRF9QQVJBTUVURVIgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAxRAorI2RlZmluZSBNVFBfUkVTUE9OU0VfU0VTU0lPTl9BTFJFQURZX09QRU4gICAgICAgICAgICAgICAgICAgICAgIDB4MjAxRQorI2RlZmluZSBNVFBfUkVTUE9OU0VfVFJBTlNBQ1RJT05fQ0FOQ0VMTEVEICAgICAgICAgICAgICAgICAgICAgIDB4MjAxRgorI2RlZmluZSBNVFBfUkVTUE9OU0VfU1BFQ0lGSUNBVElPTl9PRl9ERVNUSU5BVElPTl9VTlNVUFBPUlRFRCAgIDB4MjAyMAorI2RlZmluZSBNVFBfUkVTUE9OU0VfSU5WQUxJRF9PQkpFQ1RfUFJPUF9DT0RFICAgICAgICAgICAgICAgICAgIDB4QTgwMQorI2RlZmluZSBNVFBfUkVTUE9OU0VfSU5WQUxJRF9PQkpFQ1RfUFJPUF9GT1JNQVQgICAgICAgICAgICAgICAgIDB4QTgwMgorI2RlZmluZSBNVFBfUkVTUE9OU0VfSU5WQUxJRF9PQkpFQ1RfUFJPUF9WQUxVRSAgICAgICAgICAgICAgICAgIDB4QTgwMworI2RlZmluZSBNVFBfUkVTUE9OU0VfSU5WQUxJRF9PQkpFQ1RfUkVGRVJFTkNFICAgICAgICAgICAgICAgICAgIDB4QTgwNAorI2RlZmluZSBNVFBfUkVTUE9OU0VfR1JPVVBfTk9UX1NVUFBPUlRFRCAgICAgICAgICAgICAgICAgICAgICAgIDB4QTgwNQorI2RlZmluZSBNVFBfUkVTUE9OU0VfSU5WQUxJRF9EQVRBU0VUICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4QTgwNgorI2RlZmluZSBNVFBfUkVTUE9OU0VfU1BFQ0lGSUNBVElPTl9CWV9HUk9VUF9VTlNVUFBPUlRFRCAgICAgICAgIDB4QTgwNworI2RlZmluZSBNVFBfUkVTUE9OU0VfU1BFQ0lGSUNBVElPTl9CWV9ERVBUSF9VTlNVUFBPUlRFRCAgICAgICAgIDB4QTgwOAorI2RlZmluZSBNVFBfUkVTUE9OU0VfT0JKRUNUX1RPT19MQVJHRSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4QTgwOQorI2RlZmluZSBNVFBfUkVTUE9OU0VfT0JKRUNUX1BST1BfTk9UX1NVUFBPUlRFRCAgICAgICAgICAgICAgICAgIDB4QTgwQQorCisvLyBNVFAgRXZlbnQgQ29kZXMKKyNkZWZpbmUgTVRQX0VWRU5UX1VOREVGSU5FRCAgICAgICAgICAgICAgICAgICAgICAgICAweDQwMDAKKyNkZWZpbmUgTVRQX0VWRU5UX0NBTkNFTF9UUkFOU0FDVElPTiAgICAgICAgICAgICAgICAweDQwMDEKKyNkZWZpbmUgTVRQX0VWRU5UX09CSkVDVF9BRERFRCAgICAgICAgICAgICAgICAgICAgICAweDQwMDIKKyNkZWZpbmUgTVRQX0VWRU5UX09CSkVDVF9SRU1PVkVEICAgICAgICAgICAgICAgICAgICAweDQwMDMKKyNkZWZpbmUgTVRQX0VWRU5UX1NUT1JFX0FEREVEICAgICAgICAgICAgICAgICAgICAgICAweDQwMDQKKyNkZWZpbmUgTVRQX0VWRU5UX1NUT1JFX1JFTU9WRUQgICAgICAgICAgICAgICAgICAgICAweDQwMDUKKyNkZWZpbmUgTVRQX0VWRU5UX0RFVklDRV9QUk9QX0NIQU5HRUQgICAgICAgICAgICAgICAweDQwMDYKKyNkZWZpbmUgTVRQX0VWRU5UX09CSkVDVF9JTkZPX0NIQU5HRUQgICAgICAgICAgICAgICAweDQwMDcKKyNkZWZpbmUgTVRQX0VWRU5UX0RFVklDRV9JTkZPX0NIQU5HRUQgICAgICAgICAgICAgICAweDQwMDgKKyNkZWZpbmUgTVRQX0VWRU5UX1JFUVVFU1RfT0JKRUNUX1RSQU5TRkVSICAgICAgICAgICAweDQwMDkKKyNkZWZpbmUgTVRQX0VWRU5UX1NUT1JFX0ZVTEwgICAgICAgICAgICAgICAgICAgICAgICAweDQwMEEKKyNkZWZpbmUgTVRQX0VWRU5UX0RFVklDRV9SRVNFVCAgICAgICAgICAgICAgICAgICAgICAweDQwMEIKKyNkZWZpbmUgTVRQX0VWRU5UX1NUT1JBR0VfSU5GT19DSEFOR0VEICAgICAgICAgICAgICAweDQwMEMKKyNkZWZpbmUgTVRQX0VWRU5UX0NBUFRVUkVfQ09NUExFVEUgICAgICAgICAgICAgICAgICAweDQwMEQKKyNkZWZpbmUgTVRQX0VWRU5UX1VOUkVQT1JURURfU1RBVFVTICAgICAgICAgICAgICAgICAweDQwMEUKKyNkZWZpbmUgTVRQX0VWRU5UX09CSkVDVF9QUk9QX0NIQU5HRUQgICAgICAgICAgICAgICAweEM4MDEKKyNkZWZpbmUgTVRQX0VWRU5UX09CSkVDVF9QUk9QX0RFU0NfQ0hBTkdFRCAgICAgICAgICAweEM4MDIKKyNkZWZpbmUgTVRQX0VWRU5UX09CSkVDVF9SRUZFUkVOQ0VTX0NIQU5HRUQgICAgICAgICAweEM4MDMKKworLy8gU3RvcmFnZSBUeXBlCisjZGVmaW5lIE1UUF9TVE9SQUdFX0ZJWEVEX1JPTSAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxCisjZGVmaW5lIE1UUF9TVE9SQUdFX1JFTU9WQUJMRV9ST00gICAgICAgICAgICAgICAgICAgMHgwMDAyCisjZGVmaW5lIE1UUF9TVE9SQUdFX0ZJWEVEX1JBTSAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAzCisjZGVmaW5lIE1UUF9TVE9SQUdFX1JFTU9WQUJMRV9SQU0gICAgICAgICAgICAgICAgICAgMHgwMDA0CisKKy8vIFN0b3JhZ2UgRmlsZSBTeXN0ZW0KKyNkZWZpbmUgTVRQX1NUT1JBR0VfRklMRVNZU1RFTV9GTEFUICAgICAgICAgICAgICAgICAweDAwMDEKKyNkZWZpbmUgTVRQX1NUT1JBR0VfRklMRVNZU1RFTV9ISUVSQVJDSElDQUwgICAgICAgICAweDAwMDIKKyNkZWZpbmUgTVRQX1NUT1JBR0VfRklMRVNZU1RFTV9EQ0YgICAgICAgICAgICAgICAgICAweDAwMDMKKworLy8gU3RvcmFnZSBBY2Nlc3MgQ2FwYWJpbGl0eQorI2RlZmluZSBNVFBfU1RPUkFHRV9SRUFEX1dSSVRFICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMAorI2RlZmluZSBNVFBfU1RPUkFHRV9SRUFEX09OTFlfV0lUSE9VVF9ERUxFVEUgICAgICAgIDB4MDAwMAorI2RlZmluZSBNVFBfU1RPUkFHRV9SRUFEX09OTFlfV0lUSF9ERUxFVEUgICAgICAgICAgIDB4MDAwMAorCisvLyBBc3NvY2lhdGlvbiBUeXBlCisjZGVmaW5lIE1UUF9BU1NPQ0lBVElPTl9UWVBFX1VOREVGSU5FRCAgICAgICAgICAgICAgMHgwMDAwCisjZGVmaW5lIE1UUF9BU1NPQ0lBVElPTl9UWVBFX0dFTkVSSUNfRk9MREVSICAgICAgICAgMHgwMDAxCisKKyNlbmRpZiAvLyBfTVRQX0gKZGlmZiAtLWdpdCBhL21lZGlhL210cC9tdHB0ZXN0LmNwcCBiL21lZGlhL210cC9tdHB0ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjdjZjJlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXRwL210cHRlc3QuY3BwCkBAIC0wLDAgKzEsODYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIm10cF91c2IiCisjaW5jbHVkZSAiY3V0aWxzL2xvZy5oIgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorCisjaW5jbHVkZSAiTXRwU2VydmVyLmgiCisjaW5jbHVkZSAiTXRwU3RvcmFnZS5oIgorI2luY2x1ZGUgImZfbXRwLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCitzdGF0aWMgYm9vbCBlbmFibGVfdXNiX2Z1bmN0aW9uKGNvbnN0IGNoYXIqIG5hbWUsIGJvb2wgZW5hYmxlKSB7CisgICAgY2hhciAgICBwYXRoW1BBVEhfTUFYXTsKKworICAgIHNucHJpbnRmKHBhdGgsIHNpemVvZihwYXRoKSwgIi9zeXMvY2xhc3MvdXNiX2NvbXBvc2l0ZS8lcy9lbmFibGUiLCBuYW1lKTsKKyAgICBpbnQgZmQgPSBvcGVuKHBhdGgsIE9fUkRXUik7CisgICAgaWYgKGZkIDwgMCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImNvdWxkIG5vdCBvcGVuICVzIGluIGVuYWJsZV91c2JfZnVuY3Rpb25cbiIsIHBhdGgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHdyaXRlKGZkLCBlbmFibGUgPyAiMSIgOiAiMCIsIDIpOworICAgIGNsb3NlKGZkKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSkgeworICAgIGJvb2wgdXNlUFRQID0gZmFsc2U7CisgICAgY29uc3QgY2hhciogc3RvcmFnZVBhdGggPSAiL3NkY2FyZCI7CisKKyAgICBmb3IgKGludCBpID0gMTsgaSA8IGFyZ2M7IGkrKykgeworICAgICAgICBjb25zdCBjaGFyKiBhcmcgPSBhcmd2W2ldOworICAgICAgICBpZiAoIXN0cmNtcChhcmcsICItcCIpKQorICAgICAgICAgICAgdXNlUFRQID0gdHJ1ZTsKKyAgICAgICAgZWxzZSBpZiAoYXJnWzBdID09ICcvJykKKyAgICAgICAgICAgIHN0b3JhZ2VQYXRoID0gYXJnOworICAgIH0KKworICAgIGludCBmZCA9IG9wZW4oIi9kZXYvbXRwX3VzYiIsIE9fUkRXUik7CisgICAgcHJpbnRmKCJvcGVuIHJldHVybmVkICVkXG4iLCBmZCk7CisgICAgaWYgKGZkIDwgMCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImNvdWxkIG5vdCBvcGVuIE1UUCBkcml2ZXJcbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgaWYgKHVzZVBUUCkgeworICAgICAgICAvLyBzZXQgZHJpdmVyIG1vZGUgdG8gUFRQCisgICAgICAgIGludCByZXQgPSBpb2N0bChmZCwgTVRQX1NFVF9JTlRFUkZBQ0VfTU9ERSwgTVRQX0lOVEVSRkFDRV9NT0RFX1BUUCk7CisgICAgICAgIGlmIChyZXQpIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiTVRQX1NFVF9JTlRFUkZBQ0VfTU9ERSBmYWlsZWRcbiIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gZGlzYWJsZSBVTVMgYW5kIGVuYWJsZSBNVFAgVVNCIGZ1bmN0aW9ucworICAgIGVuYWJsZV91c2JfZnVuY3Rpb24oInVzYl9tYXNzX3N0b3JhZ2UiLCBmYWxzZSk7CisgICAgZW5hYmxlX3VzYl9mdW5jdGlvbigibXRwIiwgdHJ1ZSk7CisKKyAgICBNdHBTZXJ2ZXIgICBzZXJ2ZXIoZmQsICIvZGF0YS9kYXRhL210cC9tdHAuZGIiKTsKKyAgICBzZXJ2ZXIuYWRkU3RvcmFnZShzdG9yYWdlUGF0aCk7CisgICAgc2VydmVyLnNjYW5TdG9yYWdlKCk7CisgICAgc2VydmVyLnJ1bigpOworCisgICAgY2xvc2UoZmQpOworICAgIHJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvc2NhbnRlc3QuY3BwIGIvbWVkaWEvbXRwL3NjYW50ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTEwYmI2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXRwL3NjYW50ZXN0LmNwcApAQCAtMCwwICsxLDM4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlICJNdHBEYXRhYmFzZS5oIgorI2luY2x1ZGUgIk10cE1lZGlhU2Nhbm5lci5oIgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSkgeworICAgIGlmIChhcmdjICE9IDIpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJ1c2FnZTogJXMgPHN0b3JhZ2UgcGF0aD5cbiIsIGFyZ3ZbMF0pOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgTXRwRGF0YWJhc2UqIGRhdGFiYXNlID0gbmV3IE10cERhdGFiYXNlKCk7CisgICAgZGF0YWJhc2UtPm9wZW4oInNjYW50ZXN0LmRiIiwgdHJ1ZSk7CisKKyAgICBNdHBNZWRpYVNjYW5uZXIgc2Nhbm5lcigxLCBhcmd2WzFdLCBkYXRhYmFzZSk7CisgICAgc2Nhbm5lci5zY2FuRmlsZXMoKTsKKyAgICBkYXRhYmFzZS0+Y2xvc2UoKTsKKworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvdGVzdHMvQ2FtZXJhQnJvd3Nlci9BbmRyb2lkLm1rIGIvbWVkaWEvdGVzdHMvQ2FtZXJhQnJvd3Nlci9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkODExMjkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS90ZXN0cy9DYW1lcmFCcm93c2VyL0FuZHJvaWQubWsKQEAgLTAsMCArMSwxMCBAQAorTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKKworTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtc3ViZGlyLWphdmEtZmlsZXMpCisKK0xPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBDYW1lcmFCcm93c2VyCisKK2luY2x1ZGUgJChCVUlMRF9QQUNLQUdFKQpkaWZmIC0tZ2l0IGEvbWVkaWEvdGVzdHMvQ2FtZXJhQnJvd3Nlci9BbmRyb2lkTWFuaWZlc3QueG1sIGIvbWVkaWEvdGVzdHMvQ2FtZXJhQnJvd3Nlci9BbmRyb2lkTWFuaWZlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiYmQ2MmEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS90ZXN0cy9DYW1lcmFCcm93c2VyL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTAsMCArMSwxOCBAQAorPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBwYWNrYWdlPSJjb20uYW5kcm9pZC5jYW1lcmFicm93c2VyIj4KKworICAgIDxhcHBsaWNhdGlvbiBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL2FwcF9sYWJlbCI+CisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9IkNhbWVyYUJyb3dzZXIiIGFuZHJvaWQ6bGFiZWw9IkNhbWVyYSBCcm93c2VyIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKworICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJTdG9yYWdlQnJvd3NlciIgLz4KKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iT2JqZWN0QnJvd3NlciIgLz4KKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iT2JqZWN0Vmlld2VyIiAvPgorICAgIDwvYXBwbGljYXRpb24+CisKKworPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL21lZGlhL3Rlc3RzL0NhbWVyYUJyb3dzZXIvcmVzL2xheW91dC9vYmplY3RfaW5mby54bWwgYi9tZWRpYS90ZXN0cy9DYW1lcmFCcm93c2VyL3Jlcy9sYXlvdXQvb2JqZWN0X2luZm8ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3ZmQ4MzAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS90ZXN0cy9DYW1lcmFCcm93c2VyL3Jlcy9sYXlvdXQvb2JqZWN0X2luZm8ueG1sCkBAIC0wLDAgKzEsMTQ3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorLyoKKyoqIENvcHlyaWdodCAyMDA4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworLS0+Cis8VGFibGVMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6aWQ9IkAraWQvb2JqZWN0X2luZm8iCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCI+CisgICAgPFRhYmxlUm93PgorICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9uYW1lX2xhYmVsIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL25hbWVfbGFiZWwiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJyaWdodCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSI4ZGlwIgorICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9pbmZvX2xhYmVsIiAvPgorCisgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL25hbWUiCisgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL2luZm9fdmFsdWUiIC8+CisgICAgPC9UYWJsZVJvdz4KKyAgICA8VGFibGVSb3c+CisgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL3NpemVfbGFiZWwiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvc2l6ZV9sYWJlbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9InJpZ2h0IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IjhkaXAiCisgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL2luZm9fbGFiZWwiIC8+CisKKyAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvc2l6ZSIKKyAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvaW5mb192YWx1ZSIgLz4KKyAgICA8L1RhYmxlUm93PgorICAgIDxUYWJsZVJvdz4KKyAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvdGh1bWJfd2lkdGhfbGFiZWwiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvdGh1bWJfd2lkdGhfbGFiZWwiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJyaWdodCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSI4ZGlwIgorICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9pbmZvX2xhYmVsIiAvPgorCisgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL3RodW1iX3dpZHRoIgorICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9pbmZvX3ZhbHVlIiAvPgorICAgIDwvVGFibGVSb3c+CisgICAgPFRhYmxlUm93PgorICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC90aHVtYl9oZWlnaHRfbGFiZWwiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvdGh1bWJfaGVpZ2h0X2xhYmVsIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0icmlnaHQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5SaWdodD0iOGRpcCIKKyAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvaW5mb19sYWJlbCIgLz4KKworICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC90aHVtYl9oZWlnaHQiCisgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL2luZm9fdmFsdWUiIC8+CisgICAgPC9UYWJsZVJvdz4KKyAgICA8VGFibGVSb3c+CisgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL3RodW1iX3NpemVfbGFiZWwiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvdGh1bWJfc2l6ZV9sYWJlbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9InJpZ2h0IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IjhkaXAiCisgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL2luZm9fbGFiZWwiIC8+CisKKyAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvdGh1bWJfc2l6ZSIKKyAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvaW5mb192YWx1ZSIgLz4KKyAgICA8L1RhYmxlUm93PgorICAgIDxUYWJsZVJvdz4KKyAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvd2lkdGhfbGFiZWwiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvd2lkdGhfbGFiZWwiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJyaWdodCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSI4ZGlwIgorICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9pbmZvX2xhYmVsIiAvPgorCisgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL3dpZHRoIgorICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9pbmZvX3ZhbHVlIiAvPgorICAgIDwvVGFibGVSb3c+CisgICAgPFRhYmxlUm93PgorICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9oZWlnaHRfbGFiZWwiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvaGVpZ2h0X2xhYmVsIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0icmlnaHQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5SaWdodD0iOGRpcCIKKyAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvaW5mb19sYWJlbCIgLz4KKworICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9oZWlnaHQiCisgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL2luZm9fdmFsdWUiIC8+CisgICAgPC9UYWJsZVJvdz4KKyAgICA8VGFibGVSb3c+CisgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL2RlcHRoX2xhYmVsIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2RlcHRoX2xhYmVsIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0icmlnaHQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5SaWdodD0iOGRpcCIKKyAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvaW5mb19sYWJlbCIgLz4KKworICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9kZXB0aCIKKyAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvaW5mb192YWx1ZSIgLz4KKyAgICA8L1RhYmxlUm93PgorICAgIDxUYWJsZVJvdz4KKyAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvc2VxdWVuY2VfbGFiZWwiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvc2VxdWVuY2VfbGFiZWwiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJyaWdodCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSI4ZGlwIgorICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9pbmZvX2xhYmVsIiAvPgorCisgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL3NlcXVlbmNlIgorICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9pbmZvX3ZhbHVlIiAvPgorICAgIDwvVGFibGVSb3c+CisgICAgPFRhYmxlUm93PgorICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9jcmVhdGVkX2xhYmVsIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2NyZWF0ZWRfbGFiZWwiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJyaWdodCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSI4ZGlwIgorICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9pbmZvX2xhYmVsIiAvPgorCisgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL2NyZWF0ZWQiCisgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL2luZm9fdmFsdWUiIC8+CisgICAgPC9UYWJsZVJvdz4KKyAgICA8VGFibGVSb3c+CisgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL21vZGlmaWVkX2xhYmVsIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL21vZGlmaWVkX2xhYmVsIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0icmlnaHQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5SaWdodD0iOGRpcCIKKyAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvaW5mb19sYWJlbCIgLz4KKworICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9tb2RpZmllZCIKKyAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvaW5mb192YWx1ZSIgLz4KKyAgICA8L1RhYmxlUm93PgorICAgIDxUYWJsZVJvdz4KKyAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQva2V5d29yZHNfbGFiZWwiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcva2V5d29yZHNfbGFiZWwiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJyaWdodCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSI4ZGlwIgorICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9pbmZvX2xhYmVsIiAvPgorCisgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL2tleXdvcmRzIgorICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9pbmZvX3ZhbHVlIiAvPgorICAgIDwvVGFibGVSb3c+CisgICAgPFRhYmxlUm93PgorICAgICAgICA8SW1hZ2VWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvdGh1bWJuYWlsIiAvPgorICAgIDwvVGFibGVSb3c+Cis8L1RhYmxlTGF5b3V0PgorCmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9DYW1lcmFCcm93c2VyL3Jlcy9sYXlvdXQvb2JqZWN0X2xpc3QueG1sIGIvbWVkaWEvdGVzdHMvQ2FtZXJhQnJvd3Nlci9yZXMvbGF5b3V0L29iamVjdF9saXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMGMxOGJiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvdGVzdHMvQ2FtZXJhQnJvd3Nlci9yZXMvbGF5b3V0L29iamVjdF9saXN0LnhtbApAQCAtMCwwICsxLDMzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICAKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiIAorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iZmlsbF9wYXJlbnQiPgorICAgIAorICAgIDxJbWFnZVZpZXcgYW5kcm9pZDppZD0iQCtpZC90aHVtYm5haWwiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IiAvPgorCisgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvbmFtZSIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VMYXJnZSIKKyAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXJfdmVydGljYWwiCisgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjZkaXAiCisgICAgICAgIGFuZHJvaWQ6bWluSGVpZ2h0PSI/YW5kcm9pZDphdHRyL2xpc3RQcmVmZXJyZWRJdGVtSGVpZ2h0IiAvPgorPC9MaW5lYXJMYXlvdXQ+CmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9DYW1lcmFCcm93c2VyL3Jlcy9tZW51L29iamVjdF9tZW51LnhtbCBiL21lZGlhL3Rlc3RzL0NhbWVyYUJyb3dzZXIvcmVzL21lbnUvb2JqZWN0X21lbnUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhZWE0YWIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS90ZXN0cy9DYW1lcmFCcm93c2VyL3Jlcy9tZW51L29iamVjdF9tZW51LnhtbApAQCAtMCwwICsxLDIxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8bWVudSB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorCisgICAgPGl0ZW0gYW5kcm9pZDppZD0iQCtpZC9kZWxldGUiCisgICAgICAgIGFuZHJvaWQ6dGl0bGU9IkBzdHJpbmcvZGVsZXRlX2l0ZW0iIC8+Cis8L21lbnU+CmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9DYW1lcmFCcm93c2VyL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwgYi9tZWRpYS90ZXN0cy9DYW1lcmFCcm93c2VyL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGY5NGU2YwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3Rlc3RzL0NhbWVyYUJyb3dzZXIvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbApAQCAtMCwwICsxLDQxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8cmVzb3VyY2VzPgorICAgIDxzdHJpbmcgbmFtZT0iYXBwX2xhYmVsIj5DYW1lcmEgQnJvd3Nlcjwvc3RyaW5nPgorCisgICAgPCEtLSBmb3Igb2JqZWN0IGluZm8gLS0+CisgICAgPHN0cmluZyBuYW1lPSJuYW1lX2xhYmVsIj5OYW1lOiA8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InNpemVfbGFiZWwiPlNpemU6IDwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idGh1bWJfd2lkdGhfbGFiZWwiPlRodW1iIFdpZHRoOiA8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InRodW1iX2hlaWdodF9sYWJlbCI+VGh1bWIgSGVpZ2h0OiA8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InRodW1iX3NpemVfbGFiZWwiPlRodW1iIFNpemU6IDwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0id2lkdGhfbGFiZWwiPldpZHRoOiA8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImhlaWdodF9sYWJlbCI+SGVpZ2h0OiA8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRlcHRoX2xhYmVsIj5EZXB0aDogPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJzZXF1ZW5jZV9sYWJlbCI+U2VxdWVuY2U6IDwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iY3JlYXRlZF9sYWJlbCI+Q3JlYXRlZDogPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtb2RpZmllZF9sYWJlbCI+TW9kaWZpZWQ6IDwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ia2V5d29yZHNfbGFiZWwiPktleXdvcmRzOiA8L3N0cmluZz4KKworICAgIDwhLS0gbWVudSBpdGVtcyAtLT4KKyAgICA8c3RyaW5nIG5hbWU9ImRlbGV0ZV9pdGVtIj5EZWxldGU8L3N0cmluZz4KKworICAgIDwhLS0gdG9hc3RzIC0tPgorICAgIDxzdHJpbmcgbmFtZT0ib2JqZWN0X2RlbGV0ZWRfbWVzc2FnZSI+T2JqZWN0IGRlbGV0ZWQ8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRlbGV0ZV9mYWlsZWRfbWVzc2FnZSI+Q291bGQgbm90IGRlbGV0ZSBvYmplY3Q8L3N0cmluZz4KKworPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9DYW1lcmFCcm93c2VyL3Jlcy92YWx1ZXMvc3R5bGVzLnhtbCBiL21lZGlhL3Rlc3RzL0NhbWVyYUJyb3dzZXIvcmVzL3ZhbHVlcy9zdHlsZXMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4Njk5ODUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS90ZXN0cy9DYW1lcmFCcm93c2VyL3Jlcy92YWx1ZXMvc3R5bGVzLnhtbApAQCAtMCwwICsxLDM0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8cmVzb3VyY2VzPgorICAgIDxzdHlsZSBuYW1lPSJpbmZvX2xhYmVsIj4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfaGVpZ2h0Ij53cmFwX2NvbnRlbnQ8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X3dpZHRoIj53cmFwX2NvbnRlbnQ8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dFNpemUiPjE0c3A8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dFN0eWxlIj5ib2xkPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnBhZGRpbmdSaWdodCI+NGRpcDwvaXRlbT4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9ImluZm9fdmFsdWUiPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF9oZWlnaHQiPndyYXBfY29udGVudDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfd2lkdGgiPndyYXBfY29udGVudDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0U2l6ZSI+MTRzcDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0U3R5bGUiPm5vcm1hbDwvaXRlbT4KKyAgICA8L3N0eWxlPgorCis8L3Jlc291cmNlcz4KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvdGVzdHMvQ2FtZXJhQnJvd3Nlci9zcmMvY29tL2FuZHJvaWQvY2FtZXJhYnJvd3Nlci9DYW1lcmFCcm93c2VyLmphdmEgYi9tZWRpYS90ZXN0cy9DYW1lcmFCcm93c2VyL3NyYy9jb20vYW5kcm9pZC9jYW1lcmFicm93c2VyL0NhbWVyYUJyb3dzZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDQ4NzNhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvdGVzdHMvQ2FtZXJhQnJvd3Nlci9zcmMvY29tL2FuZHJvaWQvY2FtZXJhYnJvd3Nlci9DYW1lcmFCcm93c2VyLmphdmEKQEAgLTAsMCArMSwxMDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmNhbWVyYWJyb3dzZXI7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5MaXN0QWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ29udGVudE9ic2VydmVyOworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yOworaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5NdHA7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5MaXN0QWRhcHRlcjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5MaXN0VmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5TaW1wbGVDdXJzb3JBZGFwdGVyOworCisgLyoqCisgKiBBIGxpc3QgdmlldyBkaXNwbGF5aW5nIGFsbCBjb25uZWN0ZWQgY2FtZXJhcy4KKyAqLworcHVibGljIGNsYXNzIENhbWVyYUJyb3dzZXIgZXh0ZW5kcyBMaXN0QWN0aXZpdHkgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJDYW1lcmFCcm93c2VyIjsKKworICAgIHByaXZhdGUgTGlzdEFkYXB0ZXIgbUFkYXB0ZXI7CisgICAgcHJpdmF0ZSBDb250ZW50UmVzb2x2ZXIgbVJlc29sdmVyOworICAgIHByaXZhdGUgRGV2aWNlT2JzZXJ2ZXIgbURldmljZU9ic2VydmVyOworICAgIHByaXZhdGUgQ3Vyc29yIG1DdXJzb3I7CisKKyAgICBwcml2YXRlIGNsYXNzIERldmljZU9ic2VydmVyIGV4dGVuZHMgQ29udGVudE9ic2VydmVyIHsKKyAgICAgICAgRGV2aWNlT2JzZXJ2ZXIoSGFuZGxlciBoYW5kbGVyKSB7CisgICAgICAgICAgICBzdXBlcihoYW5kbGVyKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkNoYW5nZShib29sZWFuIHNlbGZDaGFuZ2UpIHsKKyAgICAgICAgICAgIExvZy5kKFRBRywgIkRldmljZU9ic2VydmVyLm9uQ2hhbmdlIik7CisgICAgICAgICAgICBpZiAobUN1cnNvciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUN1cnNvci5yZXF1ZXJ5KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBERVZJQ0VfQ09MVU1OUyA9CisgICAgICAgICBuZXcgU3RyaW5nW10geyBNdHAuRGV2aWNlLl9JRCwgTXRwLkRldmljZS5NQU5VRkFDVFVSRVIsIE10cC5EZXZpY2UuTU9ERUwgfTsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKyAgICAgICAgbVJlc29sdmVyID0gZ2V0Q29udGVudFJlc29sdmVyKCk7CisgICAgICAgIG1EZXZpY2VPYnNlcnZlciA9IG5ldyBEZXZpY2VPYnNlcnZlcihuZXcgSGFuZGxlcigpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvblJlc3VtZSgpIHsKKyAgICAgICAgc3VwZXIub25SZXN1bWUoKTsKKworICAgICAgICBDdXJzb3IgYyA9IGdldENvbnRlbnRSZXNvbHZlcigpLnF1ZXJ5KE10cC5EZXZpY2UuQ09OVEVOVF9VUkksCisgICAgICAgICAgICAgICAgREVWSUNFX0NPTFVNTlMsIG51bGwsIG51bGwsIG51bGwpOworICAgICAgICBMb2cuZChUQUcsICJxdWVyeSByZXR1cm5lZCAiICsgYyk7CisgICAgICAgIHN0YXJ0TWFuYWdpbmdDdXJzb3IoYyk7CisgICAgICAgIG1DdXJzb3IgPSBjOworCisgICAgICAgIC8vIE1hcCBDdXJzb3IgY29sdW1ucyB0byB2aWV3cyBkZWZpbmVkIGluIHNpbXBsZV9saXN0X2l0ZW1fMi54bWwKKyAgICAgICAgbUFkYXB0ZXIgPSBuZXcgU2ltcGxlQ3Vyc29yQWRhcHRlcih0aGlzLAorICAgICAgICAgICAgICAgIGFuZHJvaWQuUi5sYXlvdXQuc2ltcGxlX2xpc3RfaXRlbV8yLCBjLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsgTXRwLkRldmljZS5NQU5VRkFDVFVSRVIsIE10cC5EZXZpY2UuTU9ERUwgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBpbnRbXSB7IGFuZHJvaWQuUi5pZC50ZXh0MSwgYW5kcm9pZC5SLmlkLnRleHQyIH0pOworICAgICAgICBzZXRMaXN0QWRhcHRlcihtQWRhcHRlcik7CisKKyAgICAgICAgLy8gcmVnaXN0ZXIgZm9yIGNoYW5nZXMgdG8gdGhlIGRldmljZSBsaXN0CisgICAgICAgIG1SZXNvbHZlci5yZWdpc3RlckNvbnRlbnRPYnNlcnZlcihNdHAuRGV2aWNlLkNPTlRFTlRfVVJJLCB0cnVlLCBtRGV2aWNlT2JzZXJ2ZXIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uUGF1c2UoKSB7CisgICAgICAgIHN1cGVyLm9uUGF1c2UoKTsKKyAgICAgICAgbVJlc29sdmVyLnVucmVnaXN0ZXJDb250ZW50T2JzZXJ2ZXIobURldmljZU9ic2VydmVyKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkxpc3RJdGVtQ2xpY2soTGlzdFZpZXcgbCwgVmlldyB2LCBpbnQgcG9zaXRpb24sIGxvbmcgaWQpIHsKKyAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQodGhpcywgU3RvcmFnZUJyb3dzZXIuY2xhc3MpOworICAgICAgICBpbnRlbnQucHV0RXh0cmEoImRldmljZSIsIChpbnQpbUFkYXB0ZXIuZ2V0SXRlbUlkKHBvc2l0aW9uKSk7CisgICAgICAgIHN0YXJ0QWN0aXZpdHkoaW50ZW50KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9DYW1lcmFCcm93c2VyL3NyYy9jb20vYW5kcm9pZC9jYW1lcmFicm93c2VyL09iamVjdEJyb3dzZXIuamF2YSBiL21lZGlhL3Rlc3RzL0NhbWVyYUJyb3dzZXIvc3JjL2NvbS9hbmRyb2lkL2NhbWVyYWJyb3dzZXIvT2JqZWN0QnJvd3Nlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0ZjhmZmYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS90ZXN0cy9DYW1lcmFCcm93c2VyL3NyYy9jb20vYW5kcm9pZC9jYW1lcmFicm93c2VyL09iamVjdEJyb3dzZXIuamF2YQpAQCAtMCwwICsxLDE5MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuY2FtZXJhYnJvd3NlcjsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkxpc3RBY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwRmFjdG9yeTsKK2ltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5NdHA7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudUluZmxhdGVyOworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51SXRlbTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5BZGFwdGVyVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5JbWFnZVZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGlzdFZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuUmVzb3VyY2VDdXJzb3JBZGFwdGVyOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRvYXN0OworCisgLyoqCisgKiBBIGxpc3QgdmlldyBkaXNwbGF5aW5nIGFsbCBvYmplY3RzIHdpdGhpbiBhIGNvbnRhaW5lciAoZm9sZGVyIG9yIHN0b3JhZ2UgdW5pdCkuCisgKi8KK3B1YmxpYyBjbGFzcyBPYmplY3RCcm93c2VyIGV4dGVuZHMgTGlzdEFjdGl2aXR5IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiT2JqZWN0QnJvd3NlciI7CisKKyAgICBwcml2YXRlIEN1cnNvciBtQ3Vyc29yOworICAgIHByaXZhdGUgT2JqZWN0Q3Vyc29yQWRhcHRlciBtQWRhcHRlcjsKKyAgICBwcml2YXRlIGludCBtRGV2aWNlSUQ7CisgICAgcHJpdmF0ZSBpbnQgbVN0b3JhZ2VJRDsKKyAgICBwcml2YXRlIGludCBtT2JqZWN0SUQ7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBPQkpFQ1RfQ09MVU1OUyA9CisgICAgICAgIG5ldyBTdHJpbmdbXSB7IE10cC5PYmplY3QuX0lELCBNdHAuT2JqZWN0Lk5BTUUsIE10cC5PYmplY3QuRk9STUFULCBNdHAuT2JqZWN0LlRIVU1CIH07CisKKyAgICBzdGF0aWMgZmluYWwgaW50IElEX0NPTFVNTiA9IDA7CisgICAgc3RhdGljIGZpbmFsIGludCBOQU1FX0NPTFVNTiA9IDE7CisgICAgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfQ09MVU1OID0gMjsKKyAgICBzdGF0aWMgZmluYWwgaW50IFRIVU1CX0NPTFVNTiA9IDM7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25SZXN1bWUoKSB7CisgICAgICAgIHN1cGVyLm9uUmVzdW1lKCk7CisKKyAgICAgICAgbURldmljZUlEID0gZ2V0SW50ZW50KCkuZ2V0SW50RXh0cmEoImRldmljZSIsIDApOworICAgICAgICBtU3RvcmFnZUlEID0gZ2V0SW50ZW50KCkuZ2V0SW50RXh0cmEoInN0b3JhZ2UiLCAwKTsKKyAgICAgICAgbU9iamVjdElEID0gZ2V0SW50ZW50KCkuZ2V0SW50RXh0cmEoIm9iamVjdCIsIDApOworICAgICAgICBpZiAobURldmljZUlEICE9IDAgJiYgbVN0b3JhZ2VJRCAhPSAwKSB7CisgICAgICAgICAgICBDdXJzb3IgYzsKKyAgICAgICAgICAgIFVyaSB1cmk7CisgICAgICAgICAgICBpZiAobU9iamVjdElEID09IDApIHsKKyAgICAgICAgICAgICAgICB1cmkgPSBNdHAuT2JqZWN0LmdldENvbnRlbnRVcmlGb3JTdG9yYWdlQ2hpbGRyZW4obURldmljZUlELCBtU3RvcmFnZUlEKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdXJpID0gTXRwLk9iamVjdC5nZXRDb250ZW50VXJpRm9yT2JqZWN0Q2hpbGRyZW4obURldmljZUlELCBtT2JqZWN0SUQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgTG9nLmQoVEFHLCAicXVlcnkgIiArIHVyaSk7CisgICAgICAgICAgICBjID0gZ2V0Q29udGVudFJlc29sdmVyKCkucXVlcnkodXJpLCBPQkpFQ1RfQ09MVU1OUywgbnVsbCwgbnVsbCwgbnVsbCk7CisgICAgICAgICAgICBzdGFydE1hbmFnaW5nQ3Vyc29yKGMpOworICAgICAgICAgICAgbUN1cnNvciA9IGM7CisKKyAgICAgICAgICAgIC8vIE1hcCBDdXJzb3IgY29sdW1ucyB0byB2aWV3cyBkZWZpbmVkIGluIHNpbXBsZV9saXN0X2l0ZW1fMS54bWwKKyAgICAgICAgICAgIG1BZGFwdGVyID0gbmV3IE9iamVjdEN1cnNvckFkYXB0ZXIodGhpcywgYyk7CisgICAgICAgICAgICBzZXRMaXN0QWRhcHRlcihtQWRhcHRlcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkxpc3RJdGVtQ2xpY2soTGlzdFZpZXcgbCwgVmlldyB2LCBpbnQgcG9zaXRpb24sIGxvbmcgaWQpIHsKKyAgICAgICAgaW50IHJvd0lEID0gKGludCltQWRhcHRlci5nZXRJdGVtSWQocG9zaXRpb24pOworICAgICAgICBDdXJzb3IgYyA9IGdldENvbnRlbnRSZXNvbHZlcigpLnF1ZXJ5KAorICAgICAgICAgICAgICAgICAgICAgICAgTXRwLk9iamVjdC5nZXRDb250ZW50VXJpKG1EZXZpY2VJRCwgcm93SUQpLAorICAgICAgICAgICAgICAgICAgICAgICAgT0JKRUNUX0NPTFVNTlMsIG51bGwsIG51bGwsIG51bGwpOworICAgICAgICBMb2cuZChUQUcsICJxdWVyeSByZXR1cm5lZCAiICsgYyArICIgY291bnQ6ICIgKyBjLmdldENvdW50KCkpOworICAgICAgICBsb25nIGZvcm1hdCA9IDA7CisgICAgICAgIGlmIChjICE9IG51bGwgJiYgYy5nZXRDb3VudCgpID09IDEpIHsKKyAgICAgICAgICAgIGMubW92ZVRvRmlyc3QoKTsKKyAgICAgICAgICAgIGxvbmcgcm93SWQgPSBjLmdldExvbmcoSURfQ09MVU1OKTsKKyAgICAgICAgICAgIFN0cmluZyBuYW1lID0gYy5nZXRTdHJpbmcoTkFNRV9DT0xVTU4pOworICAgICAgICAgICAgZm9ybWF0ID0gYy5nZXRMb25nKEZPUk1BVF9DT0xVTU4pOworICAgICAgICAgICAgTG9nLmQoVEFHLCAicm93SWQ6ICIgKyByb3dJZCArICIgbmFtZTogIiArIG5hbWUgKyAiIGZvcm1hdDogIiArIGZvcm1hdCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZvcm1hdCA9PSBNdHAuT2JqZWN0LkZPUk1BVF9KRklGKSB7CisgICAgICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudCh0aGlzLCBPYmplY3RWaWV3ZXIuY2xhc3MpOworICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKCJkZXZpY2UiLCBtRGV2aWNlSUQpOworICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKCJzdG9yYWdlIiwgbVN0b3JhZ2VJRCk7CisgICAgICAgICAgICBpbnRlbnQucHV0RXh0cmEoIm9iamVjdCIscm93SUQpOworICAgICAgICAgICAgc3RhcnRBY3Rpdml0eShpbnRlbnQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQodGhpcywgT2JqZWN0QnJvd3Nlci5jbGFzcyk7CisgICAgICAgICAgICBpbnRlbnQucHV0RXh0cmEoImRldmljZSIsIG1EZXZpY2VJRCk7CisgICAgICAgICAgICBpbnRlbnQucHV0RXh0cmEoInN0b3JhZ2UiLCBtU3RvcmFnZUlEKTsKKyAgICAgICAgICAgIGludGVudC5wdXRFeHRyYSgib2JqZWN0Iiwgcm93SUQpOworICAgICAgICAgICAgc3RhcnRBY3Rpdml0eShpbnRlbnQpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gb25DcmVhdGVPcHRpb25zTWVudShNZW51IG1lbnUpIHsKKyAgICAgICAgTWVudUluZmxhdGVyIGluZmxhdGVyID0gZ2V0TWVudUluZmxhdGVyKCk7CisgICAgICAgIGluZmxhdGVyLmluZmxhdGUoUi5tZW51Lm9iamVjdF9tZW51LCBtZW51KTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gb25QcmVwYXJlT3B0aW9uc01lbnUoTWVudSBtZW51KSB7CisgICAgICAgIGludCBwb3NpdGlvbiA9IG1MaXN0LmdldFNlbGVjdGVkSXRlbVBvc2l0aW9uKCk7CisgICAgICAgIE1lbnVJdGVtIGl0ZW0gPSBtZW51LmZpbmRJdGVtKFIuaWQuZGVsZXRlKTsKKyAgICAgICAgaXRlbS5zZXRFbmFibGVkKHBvc2l0aW9uICE9IEFkYXB0ZXJWaWV3LklOVkFMSURfUE9TSVRJT04pOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBvbk9wdGlvbnNJdGVtU2VsZWN0ZWQoTWVudUl0ZW0gaXRlbSkgeworICAgICAgICBzd2l0Y2ggKGl0ZW0uZ2V0SXRlbUlkKCkpIHsKKyAgICAgICAgICAgIGNhc2UgUi5pZC5kZWxldGU6CisgICAgICAgICAgICAgICAgZGVsZXRlU2VsZWN0ZWQoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGRlbGV0ZVNlbGVjdGVkKCkgeworICAgICAgICBpbnQgcG9zaXRpb24gPSBtTGlzdC5nZXRTZWxlY3RlZEl0ZW1Qb3NpdGlvbigpOworICAgICAgICBpbnQgcm93SUQgPSAoaW50KW1BZGFwdGVyLmdldEl0ZW1JZChwb3NpdGlvbik7CisgICAgICAgIFVyaSB1cmkgPSBNdHAuT2JqZWN0LmdldENvbnRlbnRVcmkobURldmljZUlELCByb3dJRCk7CisKKyAgICAgICAgTG9nLmQoVEFHLCAiZGVsZXRpbmcgIiArIHVyaSk7CisKKyAgICAgICAgaW50IHJlc3VsdCA9IGdldENvbnRlbnRSZXNvbHZlcigpLmRlbGV0ZSh1cmksIG51bGwsIG51bGwpOworICAgICAgICBpZiAocmVzdWx0ID4gMCkgeworICAgICAgICAgICAgVG9hc3QubWFrZVRleHQodGhpcywgUi5zdHJpbmcub2JqZWN0X2RlbGV0ZWRfbWVzc2FnZSwgVG9hc3QuTEVOR1RIX1NIT1JUKS5zaG93KCk7CisgICAgICAgICAgICBtQ3Vyc29yLnJlcXVlcnkoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFRvYXN0Lm1ha2VUZXh0KHRoaXMsIFIuc3RyaW5nLmRlbGV0ZV9mYWlsZWRfbWVzc2FnZSwgVG9hc3QuTEVOR1RIX1NIT1JUKS5zaG93KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIE9iamVjdEN1cnNvckFkYXB0ZXIgZXh0ZW5kcyBSZXNvdXJjZUN1cnNvckFkYXB0ZXIgeworCisgICAgICAgIHB1YmxpYyBPYmplY3RDdXJzb3JBZGFwdGVyKENvbnRleHQgY29udGV4dCwgQ3Vyc29yIGMpIHsKKyAgICAgICAgICAgIHN1cGVyKGNvbnRleHQsIFIubGF5b3V0Lm9iamVjdF9saXN0LCBjKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBiaW5kVmlldyhWaWV3IHZpZXcsIENvbnRleHQgY29udGV4dCwgQ3Vyc29yIGN1cnNvcikgeworICAgICAgICAgICAgSW1hZ2VWaWV3IHRodW1iVmlldyA9IChJbWFnZVZpZXcpdmlldy5maW5kVmlld0J5SWQoUi5pZC50aHVtYm5haWwpOworICAgICAgICAgICAgVGV4dFZpZXcgbmFtZVZpZXcgPSAoVGV4dFZpZXcpdmlldy5maW5kVmlld0J5SWQoUi5pZC5uYW1lKTsKKworICAgICAgICAgICAgLy8gZ2V0IHRoZSB0aHVtYm5haWwKKyAgICAgICAgICAgIGJ5dGVbXSB0aHVtYm5haWwgPSBjdXJzb3IuZ2V0QmxvYihUSFVNQl9DT0xVTU4pOworICAgICAgICAgICAgaWYgKHRodW1ibmFpbCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgQml0bWFwIGJpdG1hcCA9IEJpdG1hcEZhY3RvcnkuZGVjb2RlQnl0ZUFycmF5KHRodW1ibmFpbCwgMCwgdGh1bWJuYWlsLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgaWYgKGJpdG1hcCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHRodW1iVmlldy5zZXRJbWFnZUJpdG1hcChiaXRtYXApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gZ2V0IHRoZSBuYW1lCisgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGN1cnNvci5nZXRTdHJpbmcoTkFNRV9DT0xVTU4pOworICAgICAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG5hbWUgPSAiIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5hbWVWaWV3LnNldFRleHQobmFtZSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9DYW1lcmFCcm93c2VyL3NyYy9jb20vYW5kcm9pZC9jYW1lcmFicm93c2VyL09iamVjdFZpZXdlci5qYXZhIGIvbWVkaWEvdGVzdHMvQ2FtZXJhQnJvd3Nlci9zcmMvY29tL2FuZHJvaWQvY2FtZXJhYnJvd3Nlci9PYmplY3RWaWV3ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDMzYzU0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvdGVzdHMvQ2FtZXJhQnJvd3Nlci9zcmMvY29tL2FuZHJvaWQvY2FtZXJhYnJvd3Nlci9PYmplY3RWaWV3ZXIuamF2YQpAQCAtMCwwICsxLDEyMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmNhbWVyYWJyb3dzZXI7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwRmFjdG9yeTsKK2ltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5NdHA7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5JbWFnZVZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7CisKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKKworLyoqCisgKiBBIHZpZXcgdG8gZGlzcGxheSB0aGUgcHJvcGVydGllcyBvZiBhbiBvYmplY3QuCisgKi8KK3B1YmxpYyBjbGFzcyBPYmplY3RWaWV3ZXIgZXh0ZW5kcyBBY3Rpdml0eSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIk9iamVjdFZpZXdlciI7CisKKyAgICBwcml2YXRlIGludCBtRGV2aWNlSUQ7CisgICAgcHJpdmF0ZSBpbnQgbVN0b3JhZ2VJRDsKKyAgICBwcml2YXRlIGludCBtT2JqZWN0SUQ7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBPQkpFQ1RfQ09MVU1OUyA9CisgICAgICAgIG5ldyBTdHJpbmdbXSB7ICBNdHAuT2JqZWN0Ll9JRCwKKyAgICAgICAgICAgICAgICAgICAgICAgIE10cC5PYmplY3QuTkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgIE10cC5PYmplY3QuU0laRSwKKyAgICAgICAgICAgICAgICAgICAgICAgIE10cC5PYmplY3QuVEhVTUJfV0lEVEgsCisgICAgICAgICAgICAgICAgICAgICAgICBNdHAuT2JqZWN0LlRIVU1CX0hFSUdIVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIE10cC5PYmplY3QuVEhVTUJfU0laRSwKKyAgICAgICAgICAgICAgICAgICAgICAgIE10cC5PYmplY3QuSU1BR0VfV0lEVEgsCisgICAgICAgICAgICAgICAgICAgICAgICBNdHAuT2JqZWN0LklNQUdFX0hFSUdIVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIE10cC5PYmplY3QuSU1BR0VfREVQVEgsCisgICAgICAgICAgICAgICAgICAgICAgICBNdHAuT2JqZWN0LlNFUVVFTkNFX05VTUJFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgIE10cC5PYmplY3QuREFURV9DUkVBVEVELAorICAgICAgICAgICAgICAgICAgICAgICAgTXRwLk9iamVjdC5EQVRFX01PRElGSUVELAorICAgICAgICAgICAgICAgICAgICAgICAgTXRwLk9iamVjdC5LRVlXT1JEUywKKyAgICAgICAgICAgICAgICAgICAgICAgIE10cC5PYmplY3QuVEhVTUIsCisgICAgICAgICAgICAgICAgICAgICAgICB9OworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworCisgICAgICAgIHNldENvbnRlbnRWaWV3KFIubGF5b3V0Lm9iamVjdF9pbmZvKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvblJlc3VtZSgpIHsKKyAgICAgICAgc3VwZXIub25SZXN1bWUoKTsKKworICAgICAgICBtRGV2aWNlSUQgPSBnZXRJbnRlbnQoKS5nZXRJbnRFeHRyYSgiZGV2aWNlIiwgMCk7CisgICAgICAgIG1TdG9yYWdlSUQgPSBnZXRJbnRlbnQoKS5nZXRJbnRFeHRyYSgic3RvcmFnZSIsIDApOworICAgICAgICBtT2JqZWN0SUQgPSBnZXRJbnRlbnQoKS5nZXRJbnRFeHRyYSgib2JqZWN0IiwgMCk7CisKKyAgICAgICAgaWYgKG1EZXZpY2VJRCAhPSAwICYmIG1PYmplY3RJRCAhPSAwKSB7CisgICAgICAgIEN1cnNvciBjID0gZ2V0Q29udGVudFJlc29sdmVyKCkucXVlcnkoCisgICAgICAgICAgICAgICAgICAgICAgICBNdHAuT2JqZWN0LmdldENvbnRlbnRVcmkobURldmljZUlELCBtT2JqZWN0SUQpLAorICAgICAgICAgICAgICAgICAgICAgICAgT0JKRUNUX0NPTFVNTlMsIG51bGwsIG51bGwsIG51bGwpOworICAgICAgICAgICAgYy5tb3ZlVG9GaXJzdCgpOworICAgICAgICAgICAgVGV4dFZpZXcgdmlldyA9IChUZXh0VmlldylmaW5kVmlld0J5SWQoUi5pZC5uYW1lKTsKKyAgICAgICAgICAgIHZpZXcuc2V0VGV4dChjLmdldFN0cmluZygxKSk7CisgICAgICAgICAgICB2aWV3ID0gKFRleHRWaWV3KWZpbmRWaWV3QnlJZChSLmlkLnNpemUpOworICAgICAgICAgICAgdmlldy5zZXRUZXh0KExvbmcudG9TdHJpbmcoYy5nZXRMb25nKDIpKSk7CisgICAgICAgICAgICB2aWV3ID0gKFRleHRWaWV3KWZpbmRWaWV3QnlJZChSLmlkLnRodW1iX3dpZHRoKTsKKyAgICAgICAgICAgIHZpZXcuc2V0VGV4dChMb25nLnRvU3RyaW5nKGMuZ2V0TG9uZygzKSkpOworICAgICAgICAgICAgdmlldyA9IChUZXh0VmlldylmaW5kVmlld0J5SWQoUi5pZC50aHVtYl9oZWlnaHQpOworICAgICAgICAgICAgdmlldy5zZXRUZXh0KExvbmcudG9TdHJpbmcoYy5nZXRMb25nKDQpKSk7CisgICAgICAgICAgICB2aWV3ID0gKFRleHRWaWV3KWZpbmRWaWV3QnlJZChSLmlkLnRodW1iX3NpemUpOworICAgICAgICAgICAgdmlldy5zZXRUZXh0KExvbmcudG9TdHJpbmcoYy5nZXRMb25nKDUpKSk7CisgICAgICAgICAgICB2aWV3ID0gKFRleHRWaWV3KWZpbmRWaWV3QnlJZChSLmlkLndpZHRoKTsKKyAgICAgICAgICAgIHZpZXcuc2V0VGV4dChMb25nLnRvU3RyaW5nKGMuZ2V0TG9uZyg2KSkpOworICAgICAgICAgICAgdmlldyA9IChUZXh0VmlldylmaW5kVmlld0J5SWQoUi5pZC5oZWlnaHQpOworICAgICAgICAgICAgdmlldy5zZXRUZXh0KExvbmcudG9TdHJpbmcoYy5nZXRMb25nKDcpKSk7CisgICAgICAgICAgICB2aWV3ID0gKFRleHRWaWV3KWZpbmRWaWV3QnlJZChSLmlkLmRlcHRoKTsKKyAgICAgICAgICAgIHZpZXcuc2V0VGV4dChMb25nLnRvU3RyaW5nKGMuZ2V0TG9uZyg4KSkpOworICAgICAgICAgICAgdmlldyA9IChUZXh0VmlldylmaW5kVmlld0J5SWQoUi5pZC5zZXF1ZW5jZSk7CisgICAgICAgICAgICB2aWV3LnNldFRleHQoTG9uZy50b1N0cmluZyhjLmdldExvbmcoOSkpKTsKKyAgICAgICAgICAgIHZpZXcgPSAoVGV4dFZpZXcpZmluZFZpZXdCeUlkKFIuaWQuY3JlYXRlZCk7CisgICAgICAgICAgICBEYXRlIGRhdGUgPSBuZXcgRGF0ZShjLmdldExvbmcoMTApICogMTAwMCk7CisgICAgICAgICAgICB2aWV3LnNldFRleHQoZGF0ZS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIHZpZXcgPSAoVGV4dFZpZXcpZmluZFZpZXdCeUlkKFIuaWQubW9kaWZpZWQpOworICAgICAgICAgICAgZGF0ZSA9IG5ldyBEYXRlKGMuZ2V0TG9uZygxMSkgKiAxMDAwKTsKKyAgICAgICAgICAgIHZpZXcuc2V0VGV4dChkYXRlLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgdmlldyA9IChUZXh0VmlldylmaW5kVmlld0J5SWQoUi5pZC5rZXl3b3Jkcyk7CisgICAgICAgICAgICB2aWV3LnNldFRleHQoYy5nZXRTdHJpbmcoMTIpKTsKKyAgICAgICAgICAgIGJ5dGVbXSB0aHVtYm5haWwgPSBjLmdldEJsb2IoMTMpOworICAgICAgICAgICAgaWYgKHRodW1ibmFpbCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiZ290IHRodW1ibmFpbCwgbGVuZ3RoOiAiICsgdGh1bWJuYWlsLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA1MDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIiAgICAiICsgSW50ZWdlci50b0hleFN0cmluZyh0aHVtYm5haWxbaV0pKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBJbWFnZVZpZXcgdGh1bWJWaWV3ID0gKEltYWdlVmlldylmaW5kVmlld0J5SWQoUi5pZC50aHVtYm5haWwpOworICAgICAgICAgICAgICAgIEJpdG1hcCBiaXRtYXAgPSBCaXRtYXBGYWN0b3J5LmRlY29kZUJ5dGVBcnJheSh0aHVtYm5haWwsIDAsIHRodW1ibmFpbC5sZW5ndGgpOworICAgICAgICAgICAgICAgIExvZy5kKFRBRywgImJpdG1hcDogIiArIGJpdG1hcCk7CisgICAgICAgICAgICAgICAgaWYgKGJpdG1hcCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHRodW1iVmlldy5zZXRJbWFnZUJpdG1hcChiaXRtYXApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL21lZGlhL3Rlc3RzL0NhbWVyYUJyb3dzZXIvc3JjL2NvbS9hbmRyb2lkL2NhbWVyYWJyb3dzZXIvU3RvcmFnZUJyb3dzZXIuamF2YSBiL21lZGlhL3Rlc3RzL0NhbWVyYUJyb3dzZXIvc3JjL2NvbS9hbmRyb2lkL2NhbWVyYWJyb3dzZXIvU3RvcmFnZUJyb3dzZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZGRmNGU3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvdGVzdHMvQ2FtZXJhQnJvd3Nlci9zcmMvY29tL2FuZHJvaWQvY2FtZXJhYnJvd3Nlci9TdG9yYWdlQnJvd3Nlci5qYXZhCkBAIC0wLDAgKzEsNzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmNhbWVyYWJyb3dzZXI7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5MaXN0QWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcjsKK2ltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5NdHA7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5MaXN0QWRhcHRlcjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5MaXN0VmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5TaW1wbGVDdXJzb3JBZGFwdGVyOworCisvKioKKyAqIEEgbGlzdCB2aWV3IGRpc3BsYXlpbmcgYWxsIHN0b3JhZ2UgdW5pdHMgb24gYSBkZXZpY2UuCisgKi8KK3B1YmxpYyBjbGFzcyBTdG9yYWdlQnJvd3NlciBleHRlbmRzIExpc3RBY3Rpdml0eSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlN0b3JhZ2VCcm93c2VyIjsKKworICAgIHByaXZhdGUgTGlzdEFkYXB0ZXIgbUFkYXB0ZXI7CisgICAgcHJpdmF0ZSBpbnQgbURldmljZUlEOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gU1RPUkFHRV9DT0xVTU5TID0KKyAgICAgICAgbmV3IFN0cmluZ1tdIHsgTXRwLlN0b3JhZ2UuX0lELCBNdHAuU3RvcmFnZS5ERVNDUklQVElPTiB9OworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uUmVzdW1lKCkgeworICAgICAgICBzdXBlci5vblJlc3VtZSgpOworCisgICAgICAgIG1EZXZpY2VJRCA9IGdldEludGVudCgpLmdldEludEV4dHJhKCJkZXZpY2UiLCAwKTsKKyAgICAgICAgaWYgKG1EZXZpY2VJRCAhPSAwKSB7CisgICAgICAgICAgICBDdXJzb3IgYyA9IGdldENvbnRlbnRSZXNvbHZlcigpLnF1ZXJ5KE10cC5TdG9yYWdlLmdldENvbnRlbnRVcmkobURldmljZUlEKSwKKyAgICAgICAgICAgICAgICAgICAgU1RPUkFHRV9DT0xVTU5TLCBudWxsLCBudWxsLCBudWxsKTsKKyAgICAgICAgICAgIExvZy5kKFRBRywgInF1ZXJ5IHJldHVybmVkICIgKyBjKTsKKyAgICAgICAgICAgIHN0YXJ0TWFuYWdpbmdDdXJzb3IoYyk7CisKKyAgICAgICAgICAgIC8vIE1hcCBDdXJzb3IgY29sdW1ucyB0byB2aWV3cyBkZWZpbmVkIGluIHNpbXBsZV9saXN0X2l0ZW1fMS54bWwKKyAgICAgICAgICAgIG1BZGFwdGVyID0gbmV3IFNpbXBsZUN1cnNvckFkYXB0ZXIodGhpcywKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZC5SLmxheW91dC5zaW1wbGVfbGlzdF9pdGVtXzEsIGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsgTXRwLlN0b3JhZ2UuREVTQ1JJUFRJT04gfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgaW50W10geyBhbmRyb2lkLlIuaWQudGV4dDEsIGFuZHJvaWQuUi5pZC50ZXh0MiB9KTsKKyAgICAgICAgICAgIHNldExpc3RBZGFwdGVyKG1BZGFwdGVyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uTGlzdEl0ZW1DbGljayhMaXN0VmlldyBsLCBWaWV3IHYsIGludCBwb3NpdGlvbiwgbG9uZyBpZCkgeworICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudCh0aGlzLCBPYmplY3RCcm93c2VyLmNsYXNzKTsKKyAgICAgICAgaW50ZW50LnB1dEV4dHJhKCJkZXZpY2UiLCBtRGV2aWNlSUQpOworICAgICAgICBpbnRlbnQucHV0RXh0cmEoInN0b3JhZ2UiLCAoaW50KW1BZGFwdGVyLmdldEl0ZW1JZChwb3NpdGlvbikpOworICAgICAgICBzdGFydEFjdGl2aXR5KGludGVudCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbmF0aXZlL2luY2x1ZGUvYW5kcm9pZC90dHMuaCBiL25hdGl2ZS9pbmNsdWRlL2FuZHJvaWQvdHRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTVjOTlmNwotLS0gL2Rldi9udWxsCisrKyBiL25hdGl2ZS9pbmNsdWRlL2FuZHJvaWQvdHRzLmgKQEAgLTAsMCArMSwzMDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgR29vZ2xlIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpZm5kZWYgQU5EUk9JRF9UVFNfSAorI2RlZmluZSBBTkRST0lEX1RUU19IIAorCisvLyBUaGlzIGhlYWRlciBkZWZpbmVzIHRoZSBpbnRlcmZhY2UgdXNlZCBieSB0aGUgQW5kcm9pZCBwbGF0Zm9ybQorLy8gdG8gYWNjZXNzIFRleHQtVG8tU3BlZWNoIGZ1bmN0aW9uYWxpdHkgaW4gc2hhcmVkIGxpYnJhcmllcyB0aGF0IGltcGxlbWVudAorLy8gc3BlZWNoIHN5bnRoZXNpcyBhbmQgdGhlIG1hbmFnZW1lbnQgb2YgcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCB0aGUKKy8vIHN5bnRoZXNpcy4KKworLy8gVGhlIHNoYXJlZCBsaWJyYXJ5IG11c3QgY29udGFpbiBhIGZ1bmN0aW9uIG5hbWVkICJhbmRyb2lkX2dldFR0c0VuZ2luZSIKKy8vIHRoYXQgcmV0dXJucyBhbiAnYW5kcm9pZF90dHNfZW5naW5lX3QnIGluc3RhbmNlLgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNkZWZpbmUgQU5EUk9JRF9UVFNfRU5HSU5FX1BST1BFUlRZX0NPTkZJRyAiZW5naW5lQ29uZmlnIgorI2RlZmluZSBBTkRST0lEX1RUU19FTkdJTkVfUFJPUEVSVFlfUElUQ0ggICJwaXRjaCIKKyNkZWZpbmUgQU5EUk9JRF9UVFNfRU5HSU5FX1BST1BFUlRZX1JBVEUgICAicmF0ZSIKKyNkZWZpbmUgQU5EUk9JRF9UVFNfRU5HSU5FX1BST1BFUlRZX1ZPTFVNRSAidm9sdW1lIgorCit0eXBlZGVmIGVudW0geworICAgIEFORFJPSURfVFRTX1NVQ0NFU1MgICAgICAgICAgICAgICAgID0gMCwKKyAgICBBTkRST0lEX1RUU19GQUlMVVJFICAgICAgICAgICAgICAgICA9IC0xLAorICAgIEFORFJPSURfVFRTX0ZFQVRVUkVfVU5TVVBQT1JURUQgICAgID0gLTIsCisgICAgQU5EUk9JRF9UVFNfVkFMVUVfSU5WQUxJRCAgICAgICAgICAgPSAtMywKKyAgICBBTkRST0lEX1RUU19QUk9QRVJUWV9VTlNVUFBPUlRFRCAgICA9IC00LAorICAgIEFORFJPSURfVFRTX1BST1BFUlRZX1NJWkVfVE9PX1NNQUxMID0gLTUsCisgICAgQU5EUk9JRF9UVFNfTUlTU0lOR19SRVNPVVJDRVMgICAgICAgPSAtNgorfSBhbmRyb2lkX3R0c19yZXN1bHRfdDsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBBTkRST0lEX1RUU19MQU5HX0NPVU5UUllfVkFSX0FWQUlMQUJMRSA9IDIsCisgICAgQU5EUk9JRF9UVFNfTEFOR19DT1VOVFJZX0FWQUlMQUJMRSAgICA9IDEsCisgICAgQU5EUk9JRF9UVFNfTEFOR19BVkFJTEFCTEUgICAgICAgICAgICA9IDAsCisgICAgQU5EUk9JRF9UVFNfTEFOR19NSVNTSU5HX0RBVEEgICAgICAgICA9IC0xLAorICAgIEFORFJPSURfVFRTX0xBTkdfTk9UX1NVUFBPUlRFRCAgICAgICAgPSAtMgorfSBhbmRyb2lkX3R0c19zdXBwb3J0X3Jlc3VsdF90OworCit0eXBlZGVmIGVudW0geworICAgIEFORFJPSURfVFRTX1NZTlRIX0RPTkUgICAgICAgICAgICAgID0gMCwKKyAgICBBTkRST0lEX1RUU19TWU5USF9QRU5ESU5HICAgICAgICAgICA9IDEKK30gYW5kcm9pZF90dHNfc3ludGhfc3RhdHVzX3Q7CisKK3R5cGVkZWYgZW51bSB7CisgICAgQU5EUk9JRF9UVFNfQ0FMTEJBQ0tfSEFMVCAgICAgICAgICAgPSAwLAorICAgIEFORFJPSURfVFRTX0NBTExCQUNLX0NPTlRJTlVFICAgICAgID0gMQorfSBhbmRyb2lkX3R0c19jYWxsYmFja19zdGF0dXNfdDsKKworLy8gU3VwcG9ydGVkIGF1ZGlvIGZvcm1hdHMKK3R5cGVkZWYgZW51bSB7CisgICAgQU5EUk9JRF9UVFNfQVVESU9fRk9STUFUX0lOVkFMSUQgICAgPSAtMSwKKyAgICBBTkRST0lEX1RUU19BVURJT19GT1JNQVRfREVGQVVMVCAgICA9IDAsCisgICAgQU5EUk9JRF9UVFNfQVVESU9fRk9STUFUX1BDTV8xNl9CSVQgPSAxLAorICAgIEFORFJPSURfVFRTX0FVRElPX0ZPUk1BVF9QQ01fOF9CSVQgID0gMiwKK30gYW5kcm9pZF90dHNfYXVkaW9fZm9ybWF0X3Q7CisKKworLyogQW4gYW5kcm9pZF90dHNfZW5naW5lX3Qgb2JqZWN0IGNhbiBiZSBhbnl0aGluZywgYnV0IG11c3QgaGF2ZSwKKyAqIGFzIGl0cyBmaXJzdCBmaWVsZCwgYSBwb2ludGVyIHRvIGEgdGFibGUgb2YgZnVuY3Rpb25zLgorICoKKyAqIFNlZSB0aGUgZnVsbCBkZWZpbml0aW9uIG9mIHN0cnVjdCBhbmRyb2lkX3R0c19lbmdpbmVfdF9mdW5jc190CisgKiBiZWxvdyBmb3IgZGV0YWlscy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgYW5kcm9pZF90dHNfZW5naW5lX2Z1bmNzX3QgIGFuZHJvaWRfdHRzX2VuZ2luZV9mdW5jc190OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgYW5kcm9pZF90dHNfZW5naW5lX2Z1bmNzX3QgKmZ1bmNzOworfSBhbmRyb2lkX3R0c19lbmdpbmVfdDsKKworLyogVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGxvY2F0ZWQgaW4gdGhlIFRUUyBFbmdpbmUgc2hhcmVkIGxpYnJhcnkKKyAqIGFuZCBtdXN0IHJldHVybiB0aGUgYWRkcmVzcyBvZiBhbiBhbmRyb2lkX3R0c19lbmdpbmVfdCBsaWJyYXJ5LgorICovCitleHRlcm4gYW5kcm9pZF90dHNfZW5naW5lX3QgKmFuZHJvaWRfZ2V0VHRzRW5naW5lKCk7CisKKy8vIEEgY2FsbGJhY2sgdHlwZSB1c2VkIHRvIG5vdGlmeSB0aGUgZnJhbWV3b3JrIG9mIG5ldyBzeW50aGV0aXplZAorLy8gYXVkaW8gc2FtcGxlcywgc3RhdHVzIHdpbGwgYmUgU1lOVEhfRE9ORSBmb3IgdGhlIGxhc3Qgc2FtcGxlIG9mCisvLyB0aGUgbGFzdCByZXF1ZXN0LCBvZiBTWU5USF9QRU5ESU5HIG90aGVyd2lzZS4KKy8vCisvLyBUaGlzIGlzIHBhc3NlZCBieSB0aGUgZnJhbWV3b3JrIHRvIHRoZSBlbmdpbmUgdGhyb3VnaCB0aGUKKy8vICdlbmdpbmVfaW5pdCcgZnVuY3Rpb24gKHNlZSBiZWxvdykuCisvLworLy8gVGhlIGNhbGxiYWNrIGZvciBzeW50aGVzaXMgY29tcGxldGVkIHRha2VzOgorLy8gQHBhcmFtIFtpbm91dF0gdm9pZCAqJiAgICAgICAtIFRoZSB1c2VyZGF0YSBwb2ludGVyIHNldCBpbiB0aGUgb3JpZ2luYWwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ludGggY2FsbAorLy8gQHBhcmFtIFtpbl0gICAgdWludDMyX3QgICAgICAtIFRyYWNrIHNhbXBsaW5nIHJhdGUgaW4gSHoKKy8vIEBwYXJhbSBbaW5dICAgIHVpbnQzMl90ICAgICAgLSBUaGUgYXVkaW8gZm9ybWF0CisvLyBAcGFyYW0gW2luXSAgICBpbnQgICAgICAgICAgIC0gVGhlIG51bWJlciBvZiBjaGFubmVscworLy8gQHBhcmFtIFtpbm91dF0gaW50OF90IComICAgICAtIEEgYnVmZmVyIG9mIGF1ZGlvIGRhdGEgb25seSB2YWxpZCBkdXJpbmcgdGhlCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0aW9uIG9mIHRoZSBjYWxsYmFjaworLy8gQHBhcmFtIFtpbm91dF0gc2l6ZV90ICAmICAgICAtIFRoZSBzaXplIG9mIHRoZSBidWZmZXIKKy8vIEBwYXJhbSBbaW5dIHR0c19zeW50aF9zdGF0dXMgLSBpbmRpY2F0ZSB3aGV0aGVyIHRoZSBzeW50aGVzaXMgaXMgZG9uZSwgb3IKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgbW9yZSBkYXRhIGlzIHRvIGJlIHN5bnRoZXNpemVkLgorLy8gQHJldHVybiBUVFNfQ0FMTEJBQ0tfSEFMVCB0byBpbmRpY2F0ZSB0aGUgc3ludGhlc2lzIG11c3Qgc3RvcCwKKy8vICAgICAgICAgVFRTX0NBTExCQUNLX0NPTlRJTlVFIHRvIGluZGljYXRlIHRoZSBzeW50aGVzaXMgbXVzdCBjb250aW51ZSBpZgorLy8gICAgICAgICAgICB0aGVyZSBpcyBtb3JlIGRhdGEgdG8gcHJvZHVjZS4KK3R5cGVkZWYgYW5kcm9pZF90dHNfY2FsbGJhY2tfc3RhdHVzX3QgKCphbmRyb2lkX3R0c19zeW50aF9jYl90KQorICAgICAgICAgICAgKHZvaWQgKipwVXNlckRhdGEsCisgICAgICAgICAgICAgdWludDMyX3QgdHJhY2tTYW1wbGluZ0h6LAorICAgICAgICAgICAgIGFuZHJvaWRfdHRzX2F1ZGlvX2Zvcm1hdF90IGF1ZGlvRm9ybWF0LAorICAgICAgICAgICAgIGludCBjaGFubmVsQ291bnQsCisgICAgICAgICAgICAgaW50OF90ICoqcEF1ZGlvQnVmZmVyLAorICAgICAgICAgICAgIHNpemVfdCAqcEJ1ZmZlclNpemUsCisgICAgICAgICAgICAgYW5kcm9pZF90dHNfc3ludGhfc3RhdHVzX3Qgc3RhdHVzKTsKKworCisvLyBUaGUgdGFibGUgb2YgZnVuY3Rpb24gcG9pbnRlcnMgdGhhdCB0aGUgYW5kcm9pZF90dHNfZW5naW5lX3QgbXVzdCBwb2ludCB0by4KKy8vIE5vdGUgdGhhdCBlYWNoIG9mIHRoZXNlIGZ1bmN0aW9ucyB3aWxsIHRha2UgYSBoYW5kbGUgdG8gdGhlIGVuZ2luZSBpdHNlbGYKKy8vIGFzIHRoZWlyIGZpcnN0IHBhcmFtZXRlci4KKy8vCisKK3N0cnVjdCBhbmRyb2lkX3R0c19lbmdpbmVfZnVuY3NfdCB7CisgICAgLy8gcmVzZXJ2ZWQgZmllbGRzLCBpZ25vcmVkIGJ5IHRoZSBmcmFtZXdvcmsKKyAgICAvLyB0aGV5IG11c3QgYmUgcGxhY2VkIGhlcmUgdG8gZW5zdXJlIGJpbmFyeSBjb21wYXRpYmlsaXR5CisgICAgLy8gb2YgbGVnYWN5IGJpbmFyeSBwbHVnaW5zLgorICAgIHZvaWQgKnJlc2VydmVkWzJdOworCisgICAgLy8gSW5pdGlhbGl6ZSB0aGUgVFRTIGVuZ2luZSBhbmQgcmV0dXJucyB3aGV0aGVyIGluaXRpYWxpemF0aW9uIHN1Y2NlZWRlZC4KKyAgICAvLyBAcGFyYW0gc3ludGhEb25lQ0JQdHIgc3ludGhlc2lzIGNhbGxiYWNrIGZ1bmN0aW9uIHBvaW50ZXIKKyAgICAvLyBAcmV0dXJuIFRUU19TVUNDRVNTLCBvciBUVFNfRkFJTFVSRQorICAgIGFuZHJvaWRfdHRzX3Jlc3VsdF90ICgqaW5pdCkKKyAgICAgICAgICAgICh2b2lkICplbmdpbmUsCisgICAgICAgICAgICAgYW5kcm9pZF90dHNfc3ludGhfY2JfdCBzeW50aERvbmVQdHIsCisgICAgICAgICAgICAgY29uc3QgY2hhciAqZW5naW5lQ29uZmlnKTsKKworICAgIC8vIFNodXQgZG93biB0aGUgVFRTIGVuZ2luZSBhbmQgcmVsZWFzZXMgYWxsIGFzc29jaWF0ZWQgcmVzb3VyY2VzLgorICAgIC8vIEByZXR1cm4gVFRTX1NVQ0NFU1MsIG9yIFRUU19GQUlMVVJFCisgICAgYW5kcm9pZF90dHNfcmVzdWx0X3QgKCpzaHV0ZG93bikKKyAgICAgICAgICAgICh2b2lkICplbmdpbmUpOworCisgICAgLy8gSW50ZXJydXB0IHN5bnRoZXNpcyBhbmQgZmx1c2hlcyBhbnkgc3ludGhlc2l6ZWQgZGF0YSB0aGF0IGhhc24ndCBiZWVuCisgICAgLy8gb3V0cHV0IHlldC4gVGhpcyB3aWxsIGJsb2NrIHVudGlsIGNhbGxiYWNrcyB1bmRlcndheSBhcmUgY29tcGxldGVkLgorICAgIC8vIEByZXR1cm4gVFRTX1NVQ0NFU1MsIG9yIFRUU19GQUlMVVJFCisgICAgYW5kcm9pZF90dHNfcmVzdWx0X3QgKCpzdG9wKQorICAgICAgICAgICAgKHZvaWQgKmVuZ2luZSk7CisKKyAgICAvLyBSZXR1cm5zIHRoZSBsZXZlbCBvZiBzdXBwb3J0IGZvciB0aGUgbGFuZ3VhZ2UsIGNvdW50cnkgYW5kIHZhcmlhbnQuCisgICAgLy8gQHJldHVybiBUVFNfTEFOR19DT1VOVFJZX1ZBUl9BVkFJTEFCTEUgaWYgdGhlIGxhbmd1YWdlLCBjb3VudHJ5IGFuZCB2YXJpYW50IGFyZSBzdXBwb3J0ZWQsCisgICAgLy8gICAgICAgICAgICBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgcmVzb3VyY2VzIGFyZSBjb3JyZWN0bHkgaW5zdGFsbGVkCisgICAgLy8gICAgICAgICBUVFNfTEFOR19DT1VOVFJZX0FWQUlMQUJMRSBpZiB0aGUgbGFuZ3VhZ2UgYW5kIGNvdW50cnkgYXJlIHN1cHBvcnRlZCBhbmQgdGhlCisgICAgLy8gICAgICAgICAgICAgY29ycmVzcG9uZGluZyByZXNvdXJjZXMgYXJlIGNvcnJlY3RseSBpbnN0YWxsZWQsIGJ1dCB0aGVyZSBpcyBubyBtYXRjaCBmb3IKKyAgICAvLyAgICAgICAgICAgICB0aGUgc3BlY2lmaWVkIHZhcmlhbnQKKyAgICAvLyAgICAgICAgIFRUU19MQU5HX0FWQUlMQUJMRSBpZiB0aGUgbGFuZ3VhZ2UgaXMgc3VwcG9ydGVkIGFuZCB0aGUKKyAgICAvLyAgICAgICAgICAgICBjb3JyZXNwb25kaW5nIHJlc291cmNlcyBhcmUgY29ycmVjdGx5IGluc3RhbGxlZCwgYnV0IHRoZXJlIGlzIG5vIG1hdGNoIGZvcgorICAgIC8vICAgICAgICAgICAgIHRoZSBzcGVjaWZpZWQgY291bnRyeSBhbmQgdmFyaWFudAorICAgIC8vICAgICAgICAgVFRTX0xBTkdfTUlTU0lOR19EQVRBIGlmIHRoZSByZXF1aXJlZCByZXNvdXJjZXMgdG8gcHJvdmlkZSBhbnkgbGV2ZWwgb2Ygc3VwcG9ydAorICAgIC8vICAgICAgICAgICAgIGZvciB0aGUgbGFuZ3VhZ2UgYXJlIG5vdCBjb3JyZWN0bHkgaW5zdGFsbGVkCisgICAgLy8gICAgICAgICBUVFNfTEFOR19OT1RfU1VQUE9SVEVEIGlmIHRoZSBsYW5ndWFnZSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBUVFMgZW5naW5lLgorICAgIGFuZHJvaWRfdHRzX3N1cHBvcnRfcmVzdWx0X3QgKCppc0xhbmd1YWdlQXZhaWxhYmxlKQorICAgICAgICAgICAgKHZvaWQgKmVuZ2luZSwKKyAgICAgICAgICAgICBjb25zdCBjaGFyICpsYW5nLAorICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmNvdW50cnksCisgICAgICAgICAgICAgY29uc3QgY2hhciAqdmFyaWFudCk7CisKKyAgICAvLyBMb2FkIHRoZSByZXNvdXJjZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQgbGFuZ3VhZ2UuIFRoZSBsb2FkZWQKKyAgICAvLyBsYW5ndWFnZSB3aWxsIG9ubHkgYmUgdXNlZCBvbmNlIGEgY2FsbCB0byBzZXRMYW5ndWFnZSgpIHdpdGggdGhlIHNhbWUKKyAgICAvLyBsYW5ndWFnZSB2YWx1ZSBpcyBpc3N1ZWQuIExhbmd1YWdlIGFuZCBjb3VudHJ5IHZhbHVlcyBhcmUgY29kZWQgYWNjb3JkaW5nIHRvIHRoZSBJU08gdGhyZWUKKyAgICAvLyBsZXR0ZXIgY29kZXMgZm9yIGxhbmd1YWdlcyBhbmQgY291bnRyaWVzLCBhcyBjYW4gYmUgcmV0cmlldmVkIGZyb20gYSBqYXZhLnV0aWwuTG9jYWxlCisgICAgLy8gaW5zdGFuY2UuIFRoZSB2YXJpYW50IHZhbHVlIGlzIGVuY29kZWQgYXMgdGhlIHZhcmlhbnQgc3RyaW5nIHJldHJpZXZlZCBmcm9tIGEKKyAgICAvLyBqYXZhLnV0aWwuTG9jYWxlIGluc3RhbmNlIGJ1aWx0IHdpdGggdGhhdCB2YXJpYW50IGRhdGEuCisgICAgLy8gQHBhcmFtIGxhbmcgcG9pbnRlciB0byB0aGUgSVNPIHRocmVlIGxldHRlciBjb2RlIGZvciB0aGUgbGFuZ3VhZ2UKKyAgICAvLyBAcGFyYW0gY291bnRyeSBwb2ludGVyIHRvIHRoZSBJU08gdGhyZWUgbGV0dGVyIGNvZGUgZm9yIHRoZSBjb3VudHJ5CisgICAgLy8gQHBhcmFtIHZhcmlhbnQgcG9pbnRlciB0byB0aGUgdmFyaWFudCBjb2RlCisgICAgLy8gQHJldHVybiBUVFNfU1VDQ0VTUywgb3IgVFRTX0ZBSUxVUkUKKyAgICBhbmRyb2lkX3R0c19yZXN1bHRfdCAoKmxvYWRMYW5ndWFnZSkKKyAgICAgICAgICAgICh2b2lkICplbmdpbmUsCisgICAgICAgICAgICAgY29uc3QgY2hhciAqbGFuZywKKyAgICAgICAgICAgICBjb25zdCBjaGFyICpjb3VudHJ5LAorICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnZhcmlhbnQpOworCisgICAgLy8gTG9hZCB0aGUgcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIGxhbmd1YWdlLCBjb3VudHJ5IGFuZCBMb2NhbGUgdmFyaWFudC4KKyAgICAvLyBUaGUgbG9hZGVkIGxhbmd1YWdlIHdpbGwgb25seSBiZSB1c2VkIG9uY2UgYSBjYWxsIHRvIHNldExhbmd1YWdlRnJvbUxvY2FsZSgpIHdpdGggdGhlIHNhbWUKKyAgICAvLyBsYW5ndWFnZSB2YWx1ZSBpcyBpc3N1ZWQuIExhbmd1YWdlIGFuZCBjb3VudHJ5IHZhbHVlcyBhcmUgY29kZWQgYWNjb3JkaW5nIHRvIHRoZSBJU08gdGhyZWUKKyAgICAvLyBsZXR0ZXIgY29kZXMgZm9yIGxhbmd1YWdlcyBhbmQgY291bnRyaWVzLCBhcyBjYW4gYmUgcmV0cmlldmVkIGZyb20gYSBqYXZhLnV0aWwuTG9jYWxlCisgICAgLy8gaW5zdGFuY2UuIFRoZSB2YXJpYW50IHZhbHVlIGlzIGVuY29kZWQgYXMgdGhlIHZhcmlhbnQgc3RyaW5nIHJldHJpZXZlZCBmcm9tIGEKKyAgICAvLyBqYXZhLnV0aWwuTG9jYWxlIGluc3RhbmNlIGJ1aWx0IHdpdGggdGhhdCB2YXJpYW50IGRhdGEuCisgICAgLy8gQHBhcmFtIGxhbmcgcG9pbnRlciB0byB0aGUgSVNPIHRocmVlIGxldHRlciBjb2RlIGZvciB0aGUgbGFuZ3VhZ2UKKyAgICAvLyBAcGFyYW0gY291bnRyeSBwb2ludGVyIHRvIHRoZSBJU08gdGhyZWUgbGV0dGVyIGNvZGUgZm9yIHRoZSBjb3VudHJ5CisgICAgLy8gQHBhcmFtIHZhcmlhbnQgcG9pbnRlciB0byB0aGUgdmFyaWFudCBjb2RlCisgICAgLy8gQHJldHVybiBUVFNfU1VDQ0VTUywgb3IgVFRTX0ZBSUxVUkUKKyAgICBhbmRyb2lkX3R0c19yZXN1bHRfdCAoKnNldExhbmd1YWdlKQorICAgICAgICAgICAgKHZvaWQgKmVuZ2luZSwKKyAgICAgICAgICAgICBjb25zdCBjaGFyICpsYW5nLAorICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmNvdW50cnksCisgICAgICAgICAgICAgY29uc3QgY2hhciAqdmFyaWFudCk7CisKKyAgICAvLyBSZXRyaWV2ZSB0aGUgY3VycmVudGx5IHNldCBsYW5ndWFnZSwgY291bnRyeSBhbmQgdmFyaWFudCwgb3IgZW1wdHkgc3RyaW5ncyBpZiBub25lIG9mCisgICAgLy8gcGFyYW1ldGVycyBoYXZlIGJlZW4gc2V0LiBMYW5ndWFnZSBhbmQgY291bnRyeSBhcmUgcmVwcmVzZW50ZWQgYnkgdGhlaXIgMy1sZXR0ZXIgSVNPIGNvZGUKKyAgICAvLyBAcGFyYW1bb3V0XSAgIHBvaW50ZXIgdG8gdGhlIHJldHJpZXZlZCAzLWxldHRlciBjb2RlIGxhbmd1YWdlIHZhbHVlCisgICAgLy8gQHBhcmFtW291dF0gICBwb2ludGVyIHRvIHRoZSByZXRyaWV2ZWQgMy1sZXR0ZXIgY29kZSBjb3VudHJ5IHZhbHVlCisgICAgLy8gQHBhcmFtW291dF0gICBwb2ludGVyIHRvIHRoZSByZXRyaWV2ZWQgdmFyaWFudCB2YWx1ZQorICAgIC8vIEByZXR1cm4gVFRTX1NVQ0NFU1MsIG9yIFRUU19GQUlMVVJFCisgICAgYW5kcm9pZF90dHNfcmVzdWx0X3QgKCpnZXRMYW5ndWFnZSkKKyAgICAgICAgICAgICh2b2lkICplbmdpbmUsCisgICAgICAgICAgICAgY2hhciAqbGFuZ3VhZ2UsCisgICAgICAgICAgICAgY2hhciAqY291bnRyeSwKKyAgICAgICAgICAgICBjaGFyICp2YXJpYW50KTsKKworICAgIC8vIE5vdGlmaWVzIHRoZSBlbmdpbmUgd2hhdCBhdWRpbyBwYXJhbWV0ZXJzIHNob3VsZCBiZSB1c2VkIGZvciB0aGUgc3ludGhlc2lzLgorICAgIC8vIFRoaXMgaXMgbWVhbnQgdG8gYmUgdXNlZCBhcyBhIGhpbnQsIHRoZSBlbmdpbmUgaW1wbGVtZW50YXRpb24gd2lsbCBzZXQgdGhlIG91dHB1dCB2YWx1ZXMKKyAgICAvLyB0byB0aG9zZSBvZiB0aGUgc3ludGhlc2lzIGZvcm1hdCwgYmFzZWQgb24gYSBnaXZlbiBoaW50LgorICAgIC8vIEBwYXJhbVtpbm91dF0gZW5jb2RpbmcgaW46IHRoZSBkZXNpcmVkIGF1ZGlvIHNhbXBsZSBmb3JtYXQKKyAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICBvdXQ6IHRoZSBmb3JtYXQgdXNlZCBieSB0aGUgVFRTIGVuZ2luZQorICAgIC8vIEBwYXJhbVtpbm91dF0gcmF0ZSBpbjogdGhlIGRlc2lyZWQgYXVkaW8gc2FtcGxlIHJhdGUKKyAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICBvdXQ6IHRoZSBzYW1wbGUgcmF0ZSB1c2VkIGJ5IHRoZSBUVFMgZW5naW5lCisgICAgLy8gQHBhcmFtW2lub3V0XSBjaGFubmVscyBpbjogdGhlIGRlc2lyZWQgbnVtYmVyIG9mIGF1ZGlvIGNoYW5uZWxzCisgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgb3V0OiB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzIHVzZWQgYnkgdGhlIFRUUyBlbmdpbmUKKyAgICAvLyBAcmV0dXJuIFRUU19TVUNDRVNTLCBvciBUVFNfRkFJTFVSRQorICAgIGFuZHJvaWRfdHRzX3Jlc3VsdF90ICgqc2V0QXVkaW9Gb3JtYXQpCisgICAgICAgICAgICAodm9pZCAqZW5naW5lLAorICAgICAgICAgICAgIGFuZHJvaWRfdHRzX2F1ZGlvX2Zvcm1hdF90KiBwRW5jb2RpbmcsCisgICAgICAgICAgICAgdWludDMyX3QqIHBSYXRlLAorICAgICAgICAgICAgIGludCogcENoYW5uZWxzKTsKKworICAgIC8vIFNldCBhIHByb3BlcnR5IGZvciB0aGUgdGhlIFRUUyBlbmdpbmUKKyAgICAvLyAic2l6ZSIgaXMgdGhlIG1heGltdW0gc2l6ZSBvZiAidmFsdWUiIGZvciBwcm9wZXJ0aWVzICJwcm9wZXJ0eSIKKyAgICAvLyBAcGFyYW0gcHJvcGVydHkgcG9pbnRlciB0byB0aGUgcHJvcGVydHkgbmFtZQorICAgIC8vIEBwYXJhbSB2YWx1ZSAgICBwb2ludGVyIHRvIHRoZSBwcm9wZXJ0eSB2YWx1ZQorICAgIC8vIEBwYXJhbSBzaXplICAgICBtYXhpbXVtIHNpemUgcmVxdWlyZWQgdG8gc3RvcmUgdGhpcyB0eXBlIG9mIHByb3BlcnR5CisgICAgLy8gQHJldHVybiAgICAgICAgIFRUU19QUk9QRVJUWV9VTlNVUFBPUlRFRCwgb3IgVFRTX1NVQ0NFU1MsIG9yIFRUU19GQUlMVVJFLAorICAgIC8vICAgICAgICAgICAgICAgICAgb3IgVFRTX1ZBTFVFX0lOVkFMSUQKKyAgICBhbmRyb2lkX3R0c19yZXN1bHRfdCAoKnNldFByb3BlcnR5KQorICAgICAgICAgICAgKHZvaWQgKmVuZ2luZSwKKyAgICAgICAgICAgICBjb25zdCBjaGFyICpwcm9wZXJ0eSwKKyAgICAgICAgICAgICBjb25zdCBjaGFyICp2YWx1ZSwKKyAgICAgICAgICAgICBjb25zdCBzaXplX3Qgc2l6ZSk7CisKKyAgICAvLyBSZXRyaWV2ZSBhIHByb3BlcnR5IGZyb20gdGhlIFRUUyBlbmdpbmUKKyAgICAvLyBAcGFyYW0gICAgICAgIHByb3BlcnR5IHBvaW50ZXIgdG8gdGhlIHByb3BlcnR5IG5hbWUKKyAgICAvLyBAcGFyYW1bb3V0XSAgIHZhbHVlICAgIHBvaW50ZXIgdG8gdGhlIHJldHJpZXZlZCBsYW5ndWFnZSB2YWx1ZQorICAgIC8vIEBwYXJhbVtpbm91dF0gaW9zaXplICAgaW46IHN0b3JlcyB0aGUgc2l6ZSBhdmFpbGFibGUgdG8gc3RvcmUgdGhlCisgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5IHZhbHVlLgorICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgb3V0OiBzdG9yZXMgdGhlIHNpemUgcmVxdWlyZWQgdG8gaG9sZCB0aGUgbGFuZ3VhZ2UKKyAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgaWYgZ2V0TGFuZ3VhZ2UoKSByZXR1cm5lZAorICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICBUVFNfUFJPUEVSVFlfU0laRV9UT09fU01BTEwsIHVuY2hhbmdlZCBvdGhlcndpc2UKKyAgICAvLyBAcmV0dXJuIFRUU19QUk9QRVJUWV9VTlNVUFBPUlRFRCwgb3IgVFRTX1NVQ0NFU1MsCisgICAgLy8gICAgICAgICBvciBUVFNfUFJPUEVSVFlfU0laRV9UT09fU01BTEwKKyAgICBhbmRyb2lkX3R0c19yZXN1bHRfdCAoKmdldFByb3BlcnR5KQorICAgICAgICAgICAgKHZvaWQgKmVuZ2luZSwKKyAgICAgICAgICAgICBjb25zdCBjaGFyICpwcm9wZXJ0eSwKKyAgICAgICAgICAgICBjaGFyICp2YWx1ZSwKKyAgICAgICAgICAgICBzaXplX3QgKmlvc2l6ZSk7CisKKyAgICAvLyBTeW50aGVzaXplIHRoZSB0ZXh0LgorICAgIC8vIEFzIHRoZSBzeW50aGVzaXMgaXMgcGVyZm9ybWVkLCB0aGUgZW5naW5lIGludm9rZXMgdGhlIGNhbGxiYWNrIHRvIG5vdGlmeQorICAgIC8vIHRoZSBUVFMgZnJhbWV3b3JrIHRoYXQgaXQgaGFzIGZpbGxlZCB0aGUgZ2l2ZW4gYnVmZmVyLCBhbmQgaW5kaWNhdGVzIGhvdworICAgIC8vIG1hbnkgYnl0ZXMgaXQgd3JvdGUuIFRoZSBjYWxsYmFjayBpcyBjYWxsZWQgcmVwZWF0ZWRseSB1bnRpbCB0aGUgZW5naW5lCisgICAgLy8gaGFzIGdlbmVyYXRlZCBhbGwgdGhlIGF1ZGlvIGRhdGEgY29ycmVzcG9uZGluZyB0byB0aGUgdGV4dC4KKyAgICAvLyBOb3RlIGFib3V0IHRoZSBmb3JtYXQgb2YgdGhlIGlucHV0OiB0aGUgdGV4dCBwYXJhbWV0ZXIgbWF5IHVzZSB0aGUKKyAgICAvLyBmb2xsb3dpbmcgZWxlbWVudHMKKyAgICAvLyBhbmQgdGhlaXIgcmVzcGVjdGl2ZSBhdHRyaWJ1dGVzIGFzIGRlZmluZWQgaW4gdGhlIFNTTUwgMS4wIHNwZWNpZmljYXRpb246CisgICAgLy8gICAgKiBsYW5nCisgICAgLy8gICAgKiBzYXktYXM6CisgICAgLy8gICAgICAgICAgbyBpbnRlcnByZXQtYXMKKyAgICAvLyAgICAqIHBob25lbWUKKyAgICAvLyAgICAqIHZvaWNlOgorICAgIC8vICAgICAgICAgIG8gZ2VuZGVyLAorICAgIC8vICAgICAgICAgIG8gYWdlLAorICAgIC8vICAgICAgICAgIG8gdmFyaWFudCwKKyAgICAvLyAgICAgICAgICBvIG5hbWUKKyAgICAvLyAgICAqIGVtcGhhc2lzCisgICAgLy8gICAgKiBicmVhazoKKyAgICAvLyAgICAgICAgICBvIHN0cmVuZ3RoLAorICAgIC8vICAgICAgICAgIG8gdGltZQorICAgIC8vICAgICogcHJvc29keToKKyAgICAvLyAgICAgICAgICBvIHBpdGNoLAorICAgIC8vICAgICAgICAgIG8gY29udG91ciwKKyAgICAvLyAgICAgICAgICBvIHJhbmdlLAorICAgIC8vICAgICAgICAgIG8gcmF0ZSwKKyAgICAvLyAgICAgICAgICBvIGR1cmF0aW9uLAorICAgIC8vICAgICAgICAgIG8gdm9sdW1lCisgICAgLy8gICAgKiBtYXJrCisgICAgLy8gRGlmZmVyZW5jZXMgYmV0d2VlbiB0aGlzIHRleHQgZm9ybWF0IGFuZCBTU01MIGFyZToKKyAgICAvLyAgICAqIGZ1bGwgU1NNTCBkb2N1bWVudHMgYXJlIG5vdCBzdXBwb3J0ZWQKKyAgICAvLyAgICAqIG5hbWVzcGFjZXMgYXJlIG5vdCBzdXBwb3J0ZWQKKyAgICAvLyBUZXh0IGlzIGNvZGVkIGluIFVURi04LgorICAgIC8vIEBwYXJhbSB0ZXh0ICAgICAgdGhlIFVURi04IHRleHQgdG8gc3ludGhlc2l6ZQorICAgIC8vIEBwYXJhbSB1c2VyZGF0YSAgcG9pbnRlciB0byBiZSByZXR1cm5lZCB3aGVuIHRoZSBjYWxsIGlzIGludm9rZWQKKyAgICAvLyBAcGFyYW0gYnVmZmVyICAgIHRoZSBsb2NhdGlvbiB3aGVyZSB0aGUgc3ludGhlc2l6ZWQgZGF0YSBtdXN0IGJlIHdyaXR0ZW4KKyAgICAvLyBAcGFyYW0gYnVmZmVyU2l6ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgY2FuIGJlIHdyaXR0ZW4gaW4gYnVmZmVyCisgICAgLy8gQHJldHVybiAgICAgICAgICBUVFNfU1VDQ0VTUyBvciBUVFNfRkFJTFVSRQorICAgIGFuZHJvaWRfdHRzX3Jlc3VsdF90ICgqc3ludGhlc2l6ZVRleHQpCisgICAgICAgICAgICAodm9pZCAqZW5naW5lLAorICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnRleHQsCisgICAgICAgICAgICAgaW50OF90ICpidWZmZXIsCisgICAgICAgICAgICAgc2l6ZV90IGJ1ZmZlclNpemUsCisgICAgICAgICAgICAgdm9pZCAqdXNlcmRhdGEpOworfTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIEFORFJPSURfVFRTX0ggKi8KZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy90ZXN0Vmlld3BvcnQvQW5kcm9pZC5tayBiL29wZW5nbC90ZXN0cy90ZXN0Vmlld3BvcnQvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjM3ODA5Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rlc3RzL3Rlc3RWaWV3cG9ydC9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMjYgQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgT3BlbkdMIEVTIEpOSSBzYW1wbGUKKyMgVGhpcyBtYWtlZmlsZSBidWlsZHMgYm90aCBhbiBhY3Rpdml0eSBhbmQgYSBzaGFyZWQgbGlicmFyeS4KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK2lmbmVxICgkKFRBUkdFVF9TSU1VTEFUT1IpLHRydWUpICMgbm90IDY0IGJpdCBjbGVhbgorCitUT1BfTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCisKKyMgQnVpbGQgYWN0aXZpdHkKKworTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKKworTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtc3ViZGlyLWphdmEtZmlsZXMpCisKK0xPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBUZXN0Vmlld3BvcnQKKworIyBTZXQgYSBzcGVjaWZpYyBTREsgdmVyc2lvbiBzbyB3ZSBjYW4gcnVuIG9uIEZyb3lvLgorCitMT0NBTF9TREtfVkVSU0lPTiA6PSA4CisKK2luY2x1ZGUgJChCVUlMRF9QQUNLQUdFKQorCitlbmRpZiAjIFRBUkdFVF9TSU1VTEFUT1IKZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy90ZXN0Vmlld3BvcnQvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL29wZW5nbC90ZXN0cy90ZXN0Vmlld3BvcnQvQW5kcm9pZE1hbmlmZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MGE5ZDJkCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rlc3RzL3Rlc3RWaWV3cG9ydC9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0wLDAgKzEsMzcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisvKgorKioKKyoqIENvcHlyaWdodCAyMDA5LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAorKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCistLT4KKworPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBwYWNrYWdlPSJjb20uYW5kcm9pZC50ZXN0Ij4KKyAgICA8dXNlcy1zZGsgYW5kcm9pZDp0YXJnZXRTZGtWZXJzaW9uPSI4IiBhbmRyb2lkOm1pblNka1ZlcnNpb249IjgiIC8+CisgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5JTlRFUk5FVCIgLz4KKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLldSSVRFX0VYVEVSTkFMX1NUT1JBR0UiIC8+CisgICAgPGFwcGxpY2F0aW9uCisgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL3Rlc3RfYWN0aXZpdHkiPgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJUZXN0QWN0aXZpdHkiCisgICAgICAgICAgICAgICAgYW5kcm9pZDp0aGVtZT0iQGFuZHJvaWQ6c3R5bGUvVGhlbWUuTm9UaXRsZUJhci5GdWxsc2NyZWVuIgorICAgICAgICAgICAgCWFuZHJvaWQ6Y29uZmlnQ2hhbmdlcz0ib3JpZW50YXRpb258a2V5Ym9hcmRIaWRkZW4iPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorICAgIDwvYXBwbGljYXRpb24+Cis8L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL3Rlc3RWaWV3cG9ydC9SRUFETUUgYi9vcGVuZ2wvdGVzdHMvdGVzdFZpZXdwb3J0L1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDZhYmM5Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rlc3RzL3Rlc3RWaWV3cG9ydC9SRUFETUUKQEAgLTAsMCArMSwyOCBAQAorUmVwcm8gc3RlcHM6CisKK2J1aWxkLCBpbnN0YWxsIGFuZCBydW4gdGhlIGF0dGFjaGVkIHRlc3QgcHJvZ3JhbSBUZXN0Vmlld3BvcnQuYXBrCisKK1J1biBvbiBTYXBwaGlyZSB3aXRoIEZyb3lvLgorCitUaGUgcHJvZ3JhbSBjbGVhcnMgdGhlIHNjcmVlbiB0byBibHVlLCB0aGVuIGRyYXdzIGEgZnVsbCBzY3JlZW4gd2hpdGUgcXVhZCB0aGF0CitpcyBhbGxpZ25lZCB0byB0aGUgc2NyZWVuLgorKFRoZXJlZm9yZSB0aGUgd2hvbGUgc2NyZWVuIHNob3VsZCBhcHBlYXIgdG8gYmUgd2hpdGUuKQorCisKK05vdGUgdGhhdCBzY3JlZW4gaXMgYWxsIHdoaXRlLgorCitSb3RhdGUgc2NyZWVuIDkwIGRlZ3JlZXMuCisKK0V4cGVjdGVkOiBzY3JlZW4gaXMgc3RpbGwgYWxsIHdoaXRlLgorCitBY3R1YWw6IHNjcmVlbiBpcyBibHVlIHdpdGggb2Zmc2V0IHdoaXRlIHJlY3RhbmdsZS4KKworVGhpcyBidWcgb25seSBoYXBwZW5zIG9uIFNhcHBoaXJlLCBpdCB3b3JrcyBjb3JyZWN0bHkgb24gUGFzc2lvbi4KKworV2hhdCBoYXBwZW5zOgorCitJIHRoaW5rIHRoZSBidWcgaXMgdGhhdCB0aGUgZ2wuZ2xWaWV3cG9ydCgpIGNhbGwgaW4gb25TdXJmYWNlQ2hhbmdlZCgpIGlzCitiZWluZyBpZ25vcmVkIGJ5IHRoZSBPcGVuR0wgZHJpdmVyLgorCitOT1RFOiBJZiBhIGdsLmdsVmlld3BvcnQgY2FsbCBpcyBhZGRlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBvbkRyYXdGcmFtZSgpCitjYWxsICh3aGljaCBtZWFucyBpdCBpcyBjYWxsZWQgYmVmb3JlIGV2ZXJ5IGRyYXcpLCB0aGUgcHJvZ3JhbSBydW5zIGNvcnJlY3RseS4KZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy90ZXN0Vmlld3BvcnQvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbCBiL29wZW5nbC90ZXN0cy90ZXN0Vmlld3BvcnQvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNGI4YmJiCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rlc3RzL3Rlc3RWaWV3cG9ydC9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCkBAIC0wLDAgKzEsMjkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisvKgorKioKKyoqIENvcHlyaWdodCAyMDA2LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAorKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCistLT4KKworPCEtLSBUaGlzIGZpbGUgY29udGFpbnMgcmVzb3VyY2UgZGVmaW5pdGlvbnMgZm9yIGRpc3BsYXllZCBzdHJpbmdzLCBhbGxvd2luZworICAgICB0aGVtIHRvIGJlIGNoYW5nZWQgYmFzZWQgb24gdGhlIGxvY2FsZSBhbmQgb3B0aW9ucy4gLS0+CisKKzxyZXNvdXJjZXM+CisgICAgPCEtLSBTaW1wbGUgc3RyaW5ncy4gLS0+CisgICAgPHN0cmluZyBuYW1lPSJ0ZXN0X2FjdGl2aXR5Ij5UZXN0IFZpZXdwb3J0PC9zdHJpbmc+CisKKzwvcmVzb3VyY2VzPgorCmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvdGVzdFZpZXdwb3J0L3NyYy9jb20vYW5kcm9pZC90ZXN0L1Rlc3RBY3Rpdml0eS5qYXZhIGIvb3BlbmdsL3Rlc3RzL3Rlc3RWaWV3cG9ydC9zcmMvY29tL2FuZHJvaWQvdGVzdC9UZXN0QWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzdlNDUwCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rlc3RzL3Rlc3RWaWV3cG9ydC9zcmMvY29tL2FuZHJvaWQvdGVzdC9UZXN0QWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDQ2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC50ZXN0OworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworcHVibGljIGNsYXNzIFRlc3RBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgVEFHID0gIlRlc3RBY3Rpdml0eSI7CisgICAgVGVzdFZpZXcgbVZpZXc7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgaWNpY2xlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKGljaWNsZSk7CisgICAgICAgIG1WaWV3ID0gbmV3IFRlc3RWaWV3KGdldEFwcGxpY2F0aW9uKCkpOworCSAgICBtVmlldy5zZXRGb2N1c2FibGVJblRvdWNoTW9kZSh0cnVlKTsKKwkgICAgc2V0Q29udGVudFZpZXcobVZpZXcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uUGF1c2UoKSB7CisgICAgICAgIHN1cGVyLm9uUGF1c2UoKTsKKyAgICAgICAgbVZpZXcub25QYXVzZSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uUmVzdW1lKCkgeworICAgICAgICBzdXBlci5vblJlc3VtZSgpOworICAgICAgICBtVmlldy5vblJlc3VtZSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy90ZXN0Vmlld3BvcnQvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvVGVzdFZpZXcuamF2YSBiL29wZW5nbC90ZXN0cy90ZXN0Vmlld3BvcnQvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvVGVzdFZpZXcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yM2NjMzdkCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rlc3RzL3Rlc3RWaWV3cG9ydC9zcmMvY29tL2FuZHJvaWQvdGVzdC9UZXN0Vmlldy5qYXZhCkBAIC0wLDAgKzEsMjYyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC50ZXN0OworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEubmlvLkJ5dGVPcmRlcjsKK2ltcG9ydCBqYXZhLm5pby5DaGFyQnVmZmVyOworaW1wb3J0IGphdmEubmlvLkZsb2F0QnVmZmVyOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5vcGVuZ2wuR0xTdXJmYWNlVmlldzsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OworaW1wb3J0IGFuZHJvaWQudmlldy5Nb3Rpb25FdmVudDsKKworaW1wb3J0IGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC5FR0wxMDsKK2ltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMQ29uZmlnOworaW1wb3J0IGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLm9wZW5nbGVzLkdMOworaW1wb3J0IGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLm9wZW5nbGVzLkdMMTA7CitpbXBvcnQgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3Mub3BlbmdsZXMuR0wxMTsKKy8qKgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgU3VyZmFjZVZpZXcgdGhhdCB1c2VzIHRoZSBkZWRpY2F0ZWQgc3VyZmFjZSBmb3IKKyAqIGRpc3BsYXlpbmcgYW4gT3BlbkdMIGFuaW1hdGlvbi4gIFRoaXMgYWxsb3dzIHRoZSBhbmltYXRpb24gdG8gcnVuIGluIGEKKyAqIHNlcGFyYXRlIHRocmVhZCwgd2l0aG91dCByZXF1aXJpbmcgdGhhdCBpdCBiZSBkcml2ZW4gYnkgdGhlIHVwZGF0ZSBtZWNoYW5pc20KKyAqIG9mIHRoZSB2aWV3IGhpZXJhcmNoeS4KKyAqCisgKiBUaGUgYXBwbGljYXRpb24tc3BlY2lmaWMgcmVuZGVyaW5nIGNvZGUgaXMgZGVsZWdhdGVkIHRvIGEgR0xWaWV3LlJlbmRlcmVyCisgKiBpbnN0YW5jZS4KKyAqLworY2xhc3MgVGVzdFZpZXcgZXh0ZW5kcyBHTFN1cmZhY2VWaWV3IHsKKyAgICBUZXN0VmlldyhDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgc3VwZXIoY29udGV4dCk7CisgICAgICAgIGluaXQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVGVzdFZpZXcoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMpIHsKKyAgICAgICAgc3VwZXIoY29udGV4dCwgYXR0cnMpOworICAgICAgICBpbml0KCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGluaXQoKSB7CisgICAgICAgIHNldFJlbmRlcmVyKG5ldyBSZW5kZXJlcigpKTsKKyAgICAgICAgc2V0UmVuZGVyTW9kZShSRU5ERVJNT0RFX1dIRU5fRElSVFkpOworICAgIH0KKyAgICAKKyAgICAgICAgLyoqIEEgZ3JpZCBpcyBhIHRvcG9sb2dpY2FsbHkgcmVjdGFuZ3VsYXIgYXJyYXkgb2YgdmVydGljZXMuCisgICAgKgorICAgICogVGhlIHZlcnRleCBhbmQgaW5kZXggZGF0YSBhcmUgaGVsZCBpbiBWQk8gb2JqZWN0cyBiZWNhdXNlIG9uIG1vc3QKKyAgICAqIEdQVXMgVkJPIG9iamVjdHMgYXJlIHRoZSBmYXN0ZXN0IHdheSBvZiByZW5kZXJpbmcgc3RhdGljIHZlcnRleAorICAgICogYW5kIGluZGV4IGRhdGEuCisgICAgKgorICAgICovCisKKyAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEdyaWQgeworICAgICAgIC8vIFNpemUgb2YgdmVydGV4IGRhdGEgZWxlbWVudHMgaW4gYnl0ZXM6CisgICAgICAgZmluYWwgc3RhdGljIGludCBGTE9BVF9TSVpFID0gNDsKKyAgICAgICBmaW5hbCBzdGF0aWMgaW50IENIQVJfU0laRSA9IDI7CisKKyAgICAgICAvLyBWZXJ0ZXggc3RydWN0dXJlOgorICAgICAgIC8vIGZsb2F0IHgsIHksIHo7CisKKyAgICAgICBmaW5hbCBzdGF0aWMgaW50IFZFUlRFWF9TSVpFID0gMyAqIEZMT0FUX1NJWkU7CisKKyAgICAgICBwcml2YXRlIGludCBtVmVydGV4QnVmZmVyT2JqZWN0SWQ7CisgICAgICAgcHJpdmF0ZSBpbnQgbUVsZW1lbnRCdWZmZXJPYmplY3RJZDsKKworICAgICAgIC8vIFRoZXNlIGJ1ZmZlcnMgYXJlIHVzZWQgdG8gaG9sZCB0aGUgdmVydGV4IGFuZCBpbmRleCBkYXRhIHdoaWxlCisgICAgICAgLy8gY29uc3RydWN0aW5nIHRoZSBncmlkLiBPbmNlIGNyZWF0ZUJ1ZmZlck9iamVjdHMoKSBpcyBjYWxsZWQKKyAgICAgICAvLyB0aGUgYnVmZmVycyBhcmUgbnVsbGVkIG91dCB0byBzYXZlIG1lbW9yeS4KKworICAgICAgIHByaXZhdGUgQnl0ZUJ1ZmZlciBtVmVydGV4Qnl0ZUJ1ZmZlcjsKKyAgICAgICBwcml2YXRlIEZsb2F0QnVmZmVyIG1WZXJ0ZXhCdWZmZXI7CisgICAgICAgcHJpdmF0ZSBDaGFyQnVmZmVyIG1JbmRleEJ1ZmZlcjsKKworICAgICAgIHByaXZhdGUgaW50IG1XOworICAgICAgIHByaXZhdGUgaW50IG1IOworICAgICAgIHByaXZhdGUgaW50IG1JbmRleENvdW50OworCisgICAgICAgcHVibGljIEdyaWQoaW50IHcsIGludCBoKSB7CisgICAgICAgICAgIGlmICh3IDwgMCB8fCB3ID49IDY1NTM2KSB7CisgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ3Iik7CisgICAgICAgICAgIH0KKyAgICAgICAgICAgaWYgKGggPCAwIHx8IGggPj0gNjU1MzYpIHsKKyAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImgiKTsKKyAgICAgICAgICAgfQorICAgICAgICAgICBpZiAodyAqIGggPj0gNjU1MzYpIHsKKyAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIncgKiBoID49IDY1NTM2Iik7CisgICAgICAgICAgIH0KKworICAgICAgICAgICBtVyA9IHc7CisgICAgICAgICAgIG1IID0gaDsKKyAgICAgICAgICAgaW50IHNpemUgPSB3ICogaDsKKworICAgICAgICAgICBtVmVydGV4Qnl0ZUJ1ZmZlciA9IEJ5dGVCdWZmZXIuYWxsb2NhdGVEaXJlY3QoVkVSVEVYX1NJWkUgKiBzaXplKQorICAgICAgICAgICAgICAgLm9yZGVyKEJ5dGVPcmRlci5uYXRpdmVPcmRlcigpKTsKKyAgICAgICAgICAgbVZlcnRleEJ1ZmZlciA9IG1WZXJ0ZXhCeXRlQnVmZmVyLmFzRmxvYXRCdWZmZXIoKTsKKworICAgICAgICAgICBpbnQgcXVhZFcgPSBtVyAtIDE7CisgICAgICAgICAgIGludCBxdWFkSCA9IG1IIC0gMTsKKyAgICAgICAgICAgaW50IHF1YWRDb3VudCA9IHF1YWRXICogcXVhZEg7CisgICAgICAgICAgIGludCBpbmRleENvdW50ID0gcXVhZENvdW50ICogNjsKKyAgICAgICAgICAgbUluZGV4Q291bnQgPSBpbmRleENvdW50OworICAgICAgICAgICBtSW5kZXhCdWZmZXIgPSBCeXRlQnVmZmVyLmFsbG9jYXRlRGlyZWN0KENIQVJfU0laRSAqIGluZGV4Q291bnQpCisgICAgICAgICAgICAgICAub3JkZXIoQnl0ZU9yZGVyLm5hdGl2ZU9yZGVyKCkpLmFzQ2hhckJ1ZmZlcigpOworCisgICAgICAgICAgIC8qCisgICAgICAgICAgICAqIEluaXRpYWxpemUgdHJpYW5nbGUgbGlzdCBtZXNoLgorICAgICAgICAgICAgKgorICAgICAgICAgICAgKiAgICAgWzBdLS0tLS1bICAxXSAuLi4KKyAgICAgICAgICAgICogICAgICB8ICAgIC8gICB8CisgICAgICAgICAgICAqICAgICAgfCAgIC8gICAgfAorICAgICAgICAgICAgKiAgICAgIHwgIC8gICAgIHwKKyAgICAgICAgICAgICogICAgIFt3XS0tLS0tW3crMV0gLi4uCisgICAgICAgICAgICAqICAgICAgfCAgICAgICB8CisgICAgICAgICAgICAqCisgICAgICAgICAgICAqLworCisgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIGludCBpID0gMDsKKyAgICAgICAgICAgICAgIGZvciAoaW50IHkgPSAwOyB5IDwgcXVhZEg7IHkrKykgeworICAgICAgICAgICAgICAgICAgIGZvciAoaW50IHggPSAwOyB4IDwgcXVhZFc7IHgrKykgeworICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGEgPSAoY2hhcikgKHkgKiBtVyArIHgpOworICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGIgPSAoY2hhcikgKHkgKiBtVyArIHggKyAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgY2hhciBjID0gKGNoYXIpICgoeSArIDEpICogbVcgKyB4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgY2hhciBkID0gKGNoYXIpICgoeSArIDEpICogbVcgKyB4ICsgMSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgbUluZGV4QnVmZmVyLnB1dChpKyssIGEpOworICAgICAgICAgICAgICAgICAgICAgICBtSW5kZXhCdWZmZXIucHV0KGkrKywgYyk7CisgICAgICAgICAgICAgICAgICAgICAgIG1JbmRleEJ1ZmZlci5wdXQoaSsrLCBiKTsKKworICAgICAgICAgICAgICAgICAgICAgICBtSW5kZXhCdWZmZXIucHV0KGkrKywgYik7CisgICAgICAgICAgICAgICAgICAgICAgIG1JbmRleEJ1ZmZlci5wdXQoaSsrLCBjKTsKKyAgICAgICAgICAgICAgICAgICAgICAgbUluZGV4QnVmZmVyLnB1dChpKyssIGQpOworICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgfQorCisgICAgICAgfQorCisgICAgICAgcHVibGljIHZvaWQgc2V0KGludCBpLCBpbnQgaiwgZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeikgeworICAgICAgICAgICBpZiAoaSA8IDAgfHwgaSA+PSBtVykgeworICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaSIpOworICAgICAgICAgICB9CisgICAgICAgICAgIGlmIChqIDwgMCB8fCBqID49IG1IKSB7CisgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJqIik7CisgICAgICAgICAgIH0KKworICAgICAgICAgICBpbnQgaW5kZXggPSBtVyAqIGogKyBpOworCisgICAgICAgICAgIG1WZXJ0ZXhCdWZmZXIucG9zaXRpb24oaW5kZXggKiBWRVJURVhfU0laRSAvIEZMT0FUX1NJWkUpOworICAgICAgICAgICBtVmVydGV4QnVmZmVyLnB1dCh4KTsKKyAgICAgICAgICAgbVZlcnRleEJ1ZmZlci5wdXQoeSk7CisgICAgICAgICAgIG1WZXJ0ZXhCdWZmZXIucHV0KHopOworICAgICAgIH0KKworICAgICAgIHB1YmxpYyB2b2lkIGNyZWF0ZUJ1ZmZlck9iamVjdHMoR0wgZ2wpIHsKKyAgICAgICAgICAgLy8gR2VuZXJhdGUgYSB0aGUgdmVydGV4IGFuZCBlbGVtZW50IGJ1ZmZlciBJRHMKKyAgICAgICAgICAgaW50W10gdmJvSWRzID0gbmV3IGludFsyXTsKKyAgICAgICAgICAgR0wxMSBnbDExID0gKEdMMTEpIGdsOworICAgICAgICAgICBnbDExLmdsR2VuQnVmZmVycygyLCB2Ym9JZHMsIDApOworICAgICAgICAgICBtVmVydGV4QnVmZmVyT2JqZWN0SWQgPSB2Ym9JZHNbMF07CisgICAgICAgICAgIG1FbGVtZW50QnVmZmVyT2JqZWN0SWQgPSB2Ym9JZHNbMV07CisKKyAgICAgICAgICAgLy8gVXBsb2FkIHRoZSB2ZXJ0ZXggZGF0YQorICAgICAgICAgICBnbDExLmdsQmluZEJ1ZmZlcihHTDExLkdMX0FSUkFZX0JVRkZFUiwgbVZlcnRleEJ1ZmZlck9iamVjdElkKTsKKyAgICAgICAgICAgbVZlcnRleEJ5dGVCdWZmZXIucG9zaXRpb24oMCk7CisgICAgICAgICAgIGdsMTEuZ2xCdWZmZXJEYXRhKEdMMTEuR0xfQVJSQVlfQlVGRkVSLCBtVmVydGV4Qnl0ZUJ1ZmZlci5jYXBhY2l0eSgpLCBtVmVydGV4Qnl0ZUJ1ZmZlciwgR0wxMS5HTF9TVEFUSUNfRFJBVyk7CisKKyAgICAgICAgICAgZ2wxMS5nbEJpbmRCdWZmZXIoR0wxMS5HTF9FTEVNRU5UX0FSUkFZX0JVRkZFUiwgbUVsZW1lbnRCdWZmZXJPYmplY3RJZCk7CisgICAgICAgICAgIG1JbmRleEJ1ZmZlci5wb3NpdGlvbigwKTsKKyAgICAgICAgICAgZ2wxMS5nbEJ1ZmZlckRhdGEoR0wxMS5HTF9FTEVNRU5UX0FSUkFZX0JVRkZFUiwgbUluZGV4QnVmZmVyLmNhcGFjaXR5KCkgKiBDSEFSX1NJWkUsIG1JbmRleEJ1ZmZlciwgR0wxMS5HTF9TVEFUSUNfRFJBVyk7CisKKyAgICAgICAgICAgLy8gV2UgZG9uJ3QgbmVlZCB0aGUgaW4tbWVtb3J5IGRhdGEgYW55IG1vcmUKKyAgICAgICAgICAgbVZlcnRleEJ1ZmZlciA9IG51bGw7CisgICAgICAgICAgIG1WZXJ0ZXhCeXRlQnVmZmVyID0gbnVsbDsKKyAgICAgICAgICAgbUluZGV4QnVmZmVyID0gbnVsbDsKKyAgICAgICB9CisKKyAgICAgICBwdWJsaWMgdm9pZCBkcmF3KEdMMTAgZ2wpIHsKKyAgICAgICAgICAgR0wxMSBnbDExID0gKEdMMTEpIGdsOworCisgICAgICAgICAgIGdsLmdsRW5hYmxlQ2xpZW50U3RhdGUoR0wxMC5HTF9WRVJURVhfQVJSQVkpOworCisgICAgICAgICAgIGdsMTEuZ2xCaW5kQnVmZmVyKEdMMTEuR0xfQVJSQVlfQlVGRkVSLCBtVmVydGV4QnVmZmVyT2JqZWN0SWQpOworICAgICAgICAgICBnbDExLmdsVmVydGV4UG9pbnRlcigzLCBHTDEwLkdMX0ZMT0FULCBWRVJURVhfU0laRSwgMCk7CisgICAgICAgICAgIAorICAgICAgICAgICBnbDExLmdsQmluZEJ1ZmZlcihHTDExLkdMX0VMRU1FTlRfQVJSQVlfQlVGRkVSLCBtRWxlbWVudEJ1ZmZlck9iamVjdElkKTsKKyAgICAgICAgICAgZ2wxMS5nbERyYXdFbGVtZW50cyhHTDEwLkdMX1RSSUFOR0xFUywgbUluZGV4Q291bnQsIEdMMTAuR0xfVU5TSUdORURfU0hPUlQsIDApOworICAgICAgICAgICBnbC5nbERpc2FibGVDbGllbnRTdGF0ZShHTDEwLkdMX1ZFUlRFWF9BUlJBWSk7CisgICAgICAgICAgIGdsMTEuZ2xCaW5kQnVmZmVyKEdMMTEuR0xfQVJSQVlfQlVGRkVSLCAwKTsKKyAgICAgICAgICAgZ2wxMS5nbEJpbmRCdWZmZXIoR0wxMS5HTF9FTEVNRU5UX0FSUkFZX0JVRkZFUiwgMCk7CisgICAgICAgfQorICAgfQorCisKKyAgICBwcml2YXRlIGNsYXNzIFJlbmRlcmVyIGltcGxlbWVudHMgR0xTdXJmYWNlVmlldy5SZW5kZXJlciB7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiUmVuZGVyZXIiOworICAgICAgICBwcml2YXRlIEdyaWQgbUdyaWQ7CisgICAgICAgIAorICAgICAgICBwdWJsaWMgdm9pZCBvbkRyYXdGcmFtZShHTDEwIGdsKSB7CisJCQlnbC5nbENsZWFyQ29sb3IoMCwwLDEsMSk7CisJCQlnbC5nbENsZWFyKEdMMTAuR0xfQ09MT1JfQlVGRkVSX0JJVCk7CisgICAgICAgICAgICBtR3JpZC5kcmF3KGdsKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIG9uU3VyZmFjZUNoYW5nZWQoR0wxMCBnbCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7CisgICAgICAgICAgICBnbC5nbFZpZXdwb3J0KDAsIDAsIHdpZHRoLCBoZWlnaHQpOworCQkJZ2wuZ2xNYXRyaXhNb2RlKEdMMTEuR0xfUFJPSkVDVElPTik7CisJCQlnbC5nbExvYWRJZGVudGl0eSgpOworCQkJZ2wuZ2xPcnRob2YoMCwgd2lkdGgsIGhlaWdodCwgMCwgLTEsIDEpOworCQkJZ2wuZ2xNYXRyaXhNb2RlKEdMMTEuR0xfTU9ERUxWSUVXKTsKKyAgICAgICAgICAgIGNyZWF0ZUdyaWQoZ2wsIHdpZHRoLCBoZWlnaHQpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgb25TdXJmYWNlQ3JlYXRlZChHTDEwIGdsLCBFR0xDb25maWcgY29uZmlnKSB7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHByaXZhdGUgdm9pZCBjcmVhdGVHcmlkKEdMMTAgZ2wsIGZsb2F0IHcsIGZsb2F0IGgpIHsKKyAgICAgICAgbUdyaWQgPSBuZXcgR3JpZCgyLCAyKTsKKwkJCWZvciAoaW50IGogPSAwOyBqIDwgMjsgaisrKSB7CisJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCAyOyBpKyspIHsKKwkJCQkJZmxvYXQgeCA9IHcgKiBpOworCQkJCQlmbG9hdCB5ID0gaCAqIGo7CisJCQkJCWZsb2F0IHogPSAwLjBmOworCQkJCQltR3JpZC5zZXQoaSxqLCB4LCB5LCB6KTsKKwkJCQl9CisJCQl9CisJCQltR3JpZC5jcmVhdGVCdWZmZXJPYmplY3RzKGdsKTsKKwkJfQorICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9QaG9uZVN0YXR1c0JhclNlcnZpY2UuamF2YSBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvUGhvbmVTdGF0dXNCYXJTZXJ2aWNlLmphdmEKaW5kZXggM2MxNGZiNS4uNGVjYzEyNSAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9QaG9uZVN0YXR1c0JhclNlcnZpY2UuamF2YQorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL1Bob25lU3RhdHVzQmFyU2VydmljZS5qYXZhCkBAIC0xMTEsNyArMTExLDcgQEAKICAgICB9CiAKICAgICBTdGF0dXNCYXJQb2xpY3kgbUljb25Qb2xpY3k7Ci0gICAgCisKICAgICBpbnQgbUhlaWdodDsKICAgICBpbnQgbUljb25XaWR0aDsKIApAQCAtMTIwLDcgKzEyMCw3IEBACiAgICAgaW50IG1QaXhlbEZvcm1hdDsKICAgICBIIG1IYW5kbGVyID0gbmV3IEgoKTsKICAgICBPYmplY3QgbVF1ZXVlTG9jayA9IG5ldyBPYmplY3QoKTsKLSAgICAKKwogICAgIC8vIGljb25zCiAgICAgTGluZWFyTGF5b3V0IG1JY29uczsKICAgICBJY29uTWVyZ2VyIG1Ob3RpZmljYXRpb25JY29uczsKQEAgLTE2NCwxNCArMTY0LDE0IEBACiAgICAgcHJpdmF0ZSBUaWNrZXIgbVRpY2tlcjsKICAgICBwcml2YXRlIFZpZXcgbVRpY2tlclZpZXc7CiAgICAgcHJpdmF0ZSBib29sZWFuIG1UaWNraW5nOwotICAgIAorCiAgICAgLy8gVHJhY2tpbmcgZmluZ2VyIGZvciBvcGVuaW5nL2Nsb3NpbmcuCiAgICAgaW50IG1FZGdlQm9yZGVyOyAvLyBjb3JyZXNwb25kcyB0byBSLmRpbWVuLnN0YXR1c19iYXJfZWRnZV9pZ25vcmUKICAgICBib29sZWFuIG1UcmFja2luZzsKICAgICBWZWxvY2l0eVRyYWNrZXIgbVZlbG9jaXR5VHJhY2tlcjsKLSAgICAKKwogICAgIHN0YXRpYyBmaW5hbCBpbnQgQU5JTV9GUkFNRV9EVVJBVElPTiA9ICgxMDAwLzYwKTsKLSAgICAKKwogICAgIGJvb2xlYW4gbUFuaW1hdGluZzsKICAgICBsb25nIG1DdXJBbmltYXRpb25UaW1lOwogICAgIGZsb2F0IG1EaXNwbGF5SGVpZ2h0OwpAQCAtMTgyLDcgKzE4Miw3IEBACiAgICAgYm9vbGVhbiBtQW5pbWF0aW5nUmV2ZWFsID0gZmFsc2U7CiAgICAgaW50IG1WaWV3RGVsdGE7CiAgICAgaW50W10gbUFic1BvcyA9IG5ldyBpbnRbMl07Ci0gICAgCisKICAgICAvLyBmb3IgZGlzYWJsaW5nIHRoZSBzdGF0dXMgYmFyCiAgICAgaW50IG1EaXNhYmxlZCA9IDA7CiAKQEAgLTI2MCw3ICsyNjAsNyBAQAogCiAgICAgICAgIG1PbmdvaW5nVGl0bGUuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwogICAgICAgICBtTGF0ZXN0VGl0bGUuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICAKKwogICAgICAgICBtVGlja2VyID0gbmV3IE15VGlja2VyKGNvbnRleHQsIHNiKTsKIAogICAgICAgICBUaWNrZXJWaWV3IHRpY2tlclZpZXcgPSAoVGlja2VyVmlldylzYi5maW5kVmlld0J5SWQoUi5pZC50aWNrZXJUZXh0KTsKQEAgLTMyNiw4ICszMjYsOCBAQAogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIGFkZEljb24oU3RyaW5nIHNsb3QsIGludCBpbmRleCwgaW50IHZpZXdJbmRleCwgU3RhdHVzQmFySWNvbiBpY29uKSB7Ci0gICAgICAgIFNsb2cuZChUQUcsICJhZGRJY29uIHNsb3Q9IiArIHNsb3QgKyAiIGluZGV4PSIgKyBpbmRleCArICIgdmlld0luZGV4PSIgKyB2aWV3SW5kZXgKLSAgICAgICAgICAgICAgICArICIgaWNvbj0iICsgaWNvbik7CisgICAgICAgIGlmIChTUEVXKSBTbG9nLmQoVEFHLCAiYWRkSWNvbiBzbG90PSIgKyBzbG90ICsgIiBpbmRleD0iICsgaW5kZXgKKyAgICAgICAgICAgICAgICArICIgdmlld0luZGV4PSIgKyB2aWV3SW5kZXggKyAiIGljb249IiArIGljb24pOwogICAgICAgICBTdGF0dXNCYXJJY29uVmlldyB2aWV3ID0gbmV3IFN0YXR1c0Jhckljb25WaWV3KHRoaXMsIHNsb3QpOwogICAgICAgICB2aWV3LnNldChpY29uKTsKICAgICAgICAgbVN0YXR1c0ljb25zLmFkZFZpZXcodmlldywgdmlld0luZGV4LCBuZXcgTGluZWFyTGF5b3V0LkxheW91dFBhcmFtcyhtSWNvbldpZHRoLCBtSGVpZ2h0KSk7CkBAIC0zMzUsMTQgKzMzNSwxNSBAQAogCiAgICAgcHVibGljIHZvaWQgdXBkYXRlSWNvbihTdHJpbmcgc2xvdCwgaW50IGluZGV4LCBpbnQgdmlld0luZGV4LAogICAgICAgICAgICAgU3RhdHVzQmFySWNvbiBvbGQsIFN0YXR1c0Jhckljb24gaWNvbikgewotICAgICAgICBTbG9nLmQoVEFHLCAidXBkYXRlSWNvbiBzbG90PSIgKyBzbG90ICsgIiBpbmRleD0iICsgaW5kZXggKyAiIHZpZXdJbmRleD0iICsgdmlld0luZGV4Ci0gICAgICAgICAgICAgICAgKyAiIG9sZD0iICsgb2xkICsgIiBpY29uPSIgKyBpY29uKTsKKyAgICAgICAgaWYgKFNQRVcpIFNsb2cuZChUQUcsICJ1cGRhdGVJY29uIHNsb3Q9IiArIHNsb3QgKyAiIGluZGV4PSIgKyBpbmRleAorICAgICAgICAgICAgICAgICsgIiB2aWV3SW5kZXg9IiArIHZpZXdJbmRleCArICIgb2xkPSIgKyBvbGQgKyAiIGljb249IiArIGljb24pOwogICAgICAgICBTdGF0dXNCYXJJY29uVmlldyB2aWV3ID0gKFN0YXR1c0Jhckljb25WaWV3KW1TdGF0dXNJY29ucy5nZXRDaGlsZEF0KHZpZXdJbmRleCk7CiAgICAgICAgIHZpZXcuc2V0KGljb24pOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHJlbW92ZUljb24oU3RyaW5nIHNsb3QsIGludCBpbmRleCwgaW50IHZpZXdJbmRleCkgewotICAgICAgICBTbG9nLmQoVEFHLCAicmVtb3ZlSWNvbiBzbG90PSIgKyBzbG90ICsgIiBpbmRleD0iICsgaW5kZXggKyAiIHZpZXdJbmRleD0iICsgdmlld0luZGV4KTsKKyAgICAgICAgaWYgKFNQRVcpIFNsb2cuZChUQUcsICJyZW1vdmVJY29uIHNsb3Q9IiArIHNsb3QgKyAiIGluZGV4PSIgKyBpbmRleAorICAgICAgICAgICAgICAgICsgIiB2aWV3SW5kZXg9IiArIHZpZXdJbmRleCk7CiAgICAgICAgIG1TdGF0dXNJY29ucy5yZW1vdmVWaWV3QXQodmlld0luZGV4KTsKICAgICB9CiAKQEAgLTM5Nyw3ICszOTgsNyBAQAogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHVwZGF0ZU5vdGlmaWNhdGlvbihJQmluZGVyIGtleSwgU3RhdHVzQmFyTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotICAgICAgICBTbG9nLmQoVEFHLCAidXBkYXRlTm90aWZpY2F0aW9uIGtleT0iICsga2V5ICsgIiBub3RpZmljYXRpb249IiArIG5vdGlmaWNhdGlvbik7CisgICAgICAgIGlmIChTUEVXKSBTbG9nLmQoVEFHLCAidXBkYXRlTm90aWZpY2F0aW9uIGtleT0iICsga2V5ICsgIiBub3RpZmljYXRpb249IiArIG5vdGlmaWNhdGlvbik7CiAKICAgICAgICAgTm90aWZpY2F0aW9uRGF0YSBvbGRMaXN0OwogICAgICAgICBpbnQgb2xkSW5kZXggPSBtT25nb2luZy5maW5kRW50cnkoa2V5KTsKQEAgLTY5NCwxOSArNjk1LDE5IEBACiAgICAgICAgIH0KICAgICAgICAgbUV4cGFuZGVkVmlzaWJsZSA9IHRydWU7CiAgICAgICAgIHZpc2liaWxpdHlDaGFuZ2VkKHRydWUpOwotICAgICAgICAKKwogICAgICAgICB1cGRhdGVFeHBhbmRlZFZpZXdQb3MoRVhQQU5ERURfTEVBVkVfQUxPTkUpOwogICAgICAgICBtRXhwYW5kZWRQYXJhbXMuZmxhZ3MgJj0gfldpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfTk9UX0ZPQ1VTQUJMRTsKICAgICAgICAgbUV4cGFuZGVkUGFyYW1zLmZsYWdzIHw9IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfQUxUX0ZPQ1VTQUJMRV9JTTsKICAgICAgICAgbUV4cGFuZGVkRGlhbG9nLmdldFdpbmRvdygpLnNldEF0dHJpYnV0ZXMobUV4cGFuZGVkUGFyYW1zKTsKICAgICAgICAgbUV4cGFuZGVkVmlldy5yZXF1ZXN0Rm9jdXMoVmlldy5GT0NVU19GT1JXQVJEKTsKICAgICAgICAgbVRyYWNraW5nVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgIAorCiAgICAgICAgIGlmICghbVRpY2tpbmcpIHsKICAgICAgICAgICAgIHNldERhdGVWaWV3VmlzaWJpbGl0eSh0cnVlLCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmFuaW0uZmFkZV9pbik7CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICBwdWJsaWMgdm9pZCBhbmltYXRlRXhwYW5kKCkgewogICAgICAgICBpZiAoU1BFVykgU2xvZy5kKFRBRywgIkFuaW1hdGUgZXhwYW5kOiBleHBhbmRlZD0iICsgbUV4cGFuZGVkKTsKICAgICAgICAgaWYgKChtRGlzYWJsZWQgJiBTdGF0dXNCYXJNYW5hZ2VyLkRJU0FCTEVfRVhQQU5EKSAhPSAwKSB7CkBAIC03MTksNyArNzIwLDcgQEAKICAgICAgICAgcHJlcGFyZVRyYWNraW5nKDAsIHRydWUpOwogICAgICAgICBwZXJmb3JtRmxpbmcoMCwgMjAwMC4wZiwgdHJ1ZSk7CiAgICAgfQotICAgIAorCiAgICAgcHVibGljIHZvaWQgYW5pbWF0ZUNvbGxhcHNlKCkgewogICAgICAgICBpZiAoU1BFVykgewogICAgICAgICAgICAgU2xvZy5kKFRBRywgImFuaW1hdGVDb2xsYXBzZSgpOiBtRXhwYW5kZWQ9IiArIG1FeHBhbmRlZApAQCAtNzI5LDcgKzczMCw3IEBACiAgICAgICAgICAgICAgICAgICAgICsgIiBtQW5pbVk9IiArIG1BbmltWQogICAgICAgICAgICAgICAgICAgICArICIgbUFuaW1WZWw9IiArIG1BbmltVmVsKTsKICAgICAgICAgfQotICAgICAgICAKKwogICAgICAgICBpZiAoIW1FeHBhbmRlZFZpc2libGUpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQpAQCAtNzQ2LDcgKzc0Nyw3IEBACiAgICAgICAgIHByZXBhcmVUcmFja2luZyh5LCBmYWxzZSk7CiAgICAgICAgIHBlcmZvcm1GbGluZyh5LCAtMjAwMC4wZiwgdHJ1ZSk7CiAgICAgfQotICAgIAorCiAgICAgdm9pZCBwZXJmb3JtRXhwYW5kKCkgewogICAgICAgICBpZiAoU1BFVykgU2xvZy5kKFRBRywgInBlcmZvcm1FeHBhbmQ6IG1FeHBhbmRlZD0iICsgbUV4cGFuZGVkKTsKICAgICAgICAgaWYgKChtRGlzYWJsZWQgJiBTdGF0dXNCYXJNYW5hZ2VyLkRJU0FCTEVfRVhQQU5EKSAhPSAwKSB7CkBAIC03NjYsNyArNzY3LDcgQEAKICAgICB2b2lkIHBlcmZvcm1Db2xsYXBzZSgpIHsKICAgICAgICAgaWYgKFNQRVcpIFNsb2cuZChUQUcsICJwZXJmb3JtQ29sbGFwc2U6IG1FeHBhbmRlZD0iICsgbUV4cGFuZGVkCiAgICAgICAgICAgICAgICAgKyAiIG1FeHBhbmRlZFZpc2libGU9IiArIG1FeHBhbmRlZFZpc2libGUpOwotICAgICAgICAKKwogICAgICAgICBpZiAoIW1FeHBhbmRlZFZpc2libGUpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQpAQCAtNzgxLDcgKzc4Miw3IEBACiAgICAgICAgICAgICBzZXROb3RpZmljYXRpb25JY29uVmlzaWJpbGl0eSh0cnVlLCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmFuaW0uZmFkZV9pbik7CiAgICAgICAgIH0KICAgICAgICAgc2V0RGF0ZVZpZXdWaXNpYmlsaXR5KGZhbHNlLCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmFuaW0uZmFkZV9vdXQpOwotICAgICAgICAKKwogICAgICAgICBpZiAoIW1FeHBhbmRlZCkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CkBAIC04NDgsNyArODQ5LDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIHZvaWQgcHJlcGFyZVRyYWNraW5nKGludCB5LCBib29sZWFuIG9wZW5pbmcpIHsKICAgICAgICAgbVRyYWNraW5nID0gdHJ1ZTsKICAgICAgICAgbVZlbG9jaXR5VHJhY2tlciA9IFZlbG9jaXR5VHJhY2tlci5vYnRhaW4oKTsKQEAgLTg3Nyw3ICs4NzgsNyBAQAogICAgICAgICAgICAgdXBkYXRlRXhwYW5kZWRWaWV3UG9zKHkgKyBtVmlld0RlbHRhKTsKICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIHZvaWQgcGVyZm9ybUZsaW5nKGludCB5LCBmbG9hdCB2ZWwsIGJvb2xlYW4gYWx3YXlzKSB7CiAgICAgICAgIG1BbmltYXRpbmdSZXZlYWwgPSBmYWxzZTsKICAgICAgICAgbURpc3BsYXlIZWlnaHQgPSBtRGlzcGxheS5nZXRIZWlnaHQoKTsKQEAgLTkzNyw3ICs5MzgsNyBAQAogICAgICAgICBtSGFuZGxlci5zZW5kTWVzc2FnZUF0VGltZShtSGFuZGxlci5vYnRhaW5NZXNzYWdlKE1TR19BTklNQVRFKSwgbUN1ckFuaW1hdGlvblRpbWUpOwogICAgICAgICBzdG9wVHJhY2tpbmcoKTsKICAgICB9Ci0gICAgCisKICAgICBib29sZWFuIGludGVyY2VwdFRvdWNoRXZlbnQoTW90aW9uRXZlbnQgZXZlbnQpIHsKICAgICAgICAgaWYgKFNQRVcpIHsKICAgICAgICAgICAgIFNsb2cuZChUQUcsICJUb3VjaDogcmF3WT0iICsgZXZlbnQuZ2V0UmF3WSgpICsgIiBldmVudD0iICsgZXZlbnQgKyAiIG1EaXNhYmxlZD0iCkBAIC05NDcsNyArOTQ4LDcgQEAKICAgICAgICAgaWYgKChtRGlzYWJsZWQgJiBTdGF0dXNCYXJNYW5hZ2VyLkRJU0FCTEVfRVhQQU5EKSAhPSAwKSB7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KLSAgICAgICAgCisKICAgICAgICAgZmluYWwgaW50IHN0YXR1c0JhclNpemUgPSBtU3RhdHVzQmFyVmlldy5nZXRIZWlnaHQoKTsKICAgICAgICAgZmluYWwgaW50IGhpdFNpemUgPSBzdGF0dXNCYXJTaXplKjI7CiAgICAgICAgIGlmIChldmVudC5nZXRBY3Rpb24oKSA9PSBNb3Rpb25FdmVudC5BQ1RJT05fRE9XTikgewpAQCAtMTAwMSwxMCArMTAwMiwxMCBAQAogICAgICAgICAgICAgICAgIGlmIChuZWdhdGl2ZSkgewogICAgICAgICAgICAgICAgICAgICB2ZWwgPSAtdmVsOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKKwogICAgICAgICAgICAgICAgIHBlcmZvcm1GbGluZygoaW50KWV2ZW50LmdldFJhd1koKSwgdmVsLCBmYWxzZSk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAKKwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CkBAIC0xMDgzLDcgKzEwODQsNyBAQAogICAgICAgICBNeVRpY2tlcihDb250ZXh0IGNvbnRleHQsIFN0YXR1c0JhclZpZXcgc2IpIHsKICAgICAgICAgICAgIHN1cGVyKGNvbnRleHQsIHNiKTsKICAgICAgICAgfQotICAgICAgICAKKwogICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgdm9pZCB0aWNrZXJTdGFydGluZygpIHsKICAgICAgICAgICAgIG1UaWNraW5nID0gdHJ1ZTsKQEAgLTExNTEsNyArMTE1Miw3IEBACiAgICAgICAgICAgICAgICAgICAgICsgIiwgdWlkPSIgKyBCaW5kZXIuZ2V0Q2FsbGluZ1VpZCgpKTsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQotICAgICAgICAKKwogICAgICAgICBzeW5jaHJvbml6ZWQgKG1RdWV1ZUxvY2spIHsKICAgICAgICAgICAgIHB3LnByaW50bG4oIkN1cnJlbnQgU3RhdHVzIEJhciBzdGF0ZToiKTsKICAgICAgICAgICAgIHB3LnByaW50bG4oIiAgbUV4cGFuZGVkPSIgKyBtRXhwYW5kZWQKQEAgLTEyMDEsNyArMTIwMiw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgKi8KLSAgICAgICAgCisKICAgICAgICAgaWYgKGZhbHNlKSB7CiAgICAgICAgICAgICBwdy5wcmludGxuKCJzZWUgdGhlIGxvZ2NhdCBmb3IgYSBkdW1wIG9mIHRoZSB2aWV3cyB3ZSBoYXZlIGNyZWF0ZWQuIik7CiAgICAgICAgICAgICAvLyBtdXN0IGhhcHBlbiBvbiB1aSB0aHJlYWQKQEAgLTE0OTMsNyArMTQ5NCw3IEBACiAKICAgICAvKioKICAgICAgKiBSZWxvYWQgc29tZSBvZiBvdXIgcmVzb3VyY2VzIHdoZW4gdGhlIGNvbmZpZ3VyYXRpb24gY2hhbmdlcy4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIFdlIGRvbid0IHJlbG9hZCBldmVyeXRoaW5nIHdoZW4gdGhlIGNvbmZpZ3VyYXRpb24gY2hhbmdlcyAtLSB3ZSBwcm9iYWJseQogICAgICAqIHNob3VsZCwgYnV0IGdldHRpbmcgdGhhdCBzbW9vdGggaXMgdG91Z2guICBTb21lZGF5IHdlJ2xsIGZpeCB0aGF0LiAgSW4gdGhlCiAgICAgICogbWVhbnRpbWUsIGp1c3QgdXBkYXRlIHRoZSB0aGluZ3MgdGhhdCB3ZSBrbm93IGNoYW5nZS4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1R0c1NlcnZpY2Uvam5pL0FuZHJvaWQubWsgYi9wYWNrYWdlcy9UdHNTZXJ2aWNlL2puaS9BbmRyb2lkLm1rCmluZGV4IGI0MTc1OWEuLjVkYzBjMzAgMTAwNzU1Ci0tLSBhL3BhY2thZ2VzL1R0c1NlcnZpY2Uvam5pL0FuZHJvaWQubWsKKysrIGIvcGFja2FnZXMvVHRzU2VydmljZS9qbmkvQW5kcm9pZC5tawpAQCAtNSw2ICs1LDcgQEAKIAlhbmRyb2lkX3R0c19TeW50aFByb3h5LmNwcAogCiBMT0NBTF9DX0lOQ0xVREVTICs9IFwKKwlmcmFtZXdvcmtzL2Jhc2UvbmF0aXZlL2luY2x1ZGUgXAogCSQoSk5JX0hfSU5DTFVERSkKIAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9UdHNTZXJ2aWNlL2puaS9hbmRyb2lkX3R0c19TeW50aFByb3h5LmNwcCBiL3BhY2thZ2VzL1R0c1NlcnZpY2Uvam5pL2FuZHJvaWRfdHRzX1N5bnRoUHJveHkuY3BwCmluZGV4IDFkNjkzNjEuLjhkYzg4ZGIgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1R0c1NlcnZpY2Uvam5pL2FuZHJvaWRfdHRzX1N5bnRoUHJveHkuY3BwCisrKyBiL3BhY2thZ2VzL1R0c1NlcnZpY2Uvam5pL2FuZHJvaWRfdHRzX1N5bnRoUHJveHkuY3BwCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBHb29nbGUgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDA5LTIwMTAgR29vZ2xlIEluYy4KICAqCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KQEAgLTIzLDcgKzIzLDcgQEAKICNpbmNsdWRlIDxuYXRpdmVoZWxwZXIvam5pLmg+CiAjaW5jbHVkZSA8bmF0aXZlaGVscGVyL0pOSUhlbHAuaD4KICNpbmNsdWRlIDxhbmRyb2lkX3J1bnRpbWUvQW5kcm9pZFJ1bnRpbWUuaD4KLSNpbmNsdWRlIDx0dHMvVHRzRW5naW5lLmg+CisjaW5jbHVkZSA8YW5kcm9pZC90dHMuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1RyYWNrLmg+CiAjaW5jbHVkZSA8bWF0aC5oPgogCkBAIC0xNTQsNyArMTU0LDcgQEAKIGNsYXNzIFN5bnRoUHJveHlKbmlTdG9yYWdlIHsKICAgICBwdWJsaWMgOgogICAgICAgICBqb2JqZWN0ICAgICAgICAgICAgICAgICAgIHR0c19yZWY7Ci0gICAgICAgIFR0c0VuZ2luZSogICAgICAgICAgICAgICAgbU5hdGl2ZVN5bnRoSW50ZXJmYWNlOworICAgICAgICBhbmRyb2lkX3R0c19lbmdpbmVfdCogICAgICAgbUVuZ2luZTsKICAgICAgICAgdm9pZCogICAgICAgICAgICAgICAgICAgICBtRW5naW5lTGliSGFuZGxlOwogICAgICAgICBBdWRpb1RyYWNrKiAgICAgICAgICAgICAgIG1BdWRpb091dDsKICAgICAgICAgaW50OF90ICAgICAgICAgICAgICAgICAgICBtUGxheVN0YXRlOwpAQCAtMTY4LDcgKzE2OCw3IEBACiAKICAgICAgICAgU3ludGhQcm94eUpuaVN0b3JhZ2UoKSB7CiAgICAgICAgICAgICB0dHNfcmVmID0gTlVMTDsKLSAgICAgICAgICAgIG1OYXRpdmVTeW50aEludGVyZmFjZSA9IE5VTEw7CisgICAgICAgICAgICBtRW5naW5lID0gTlVMTDsKICAgICAgICAgICAgIG1FbmdpbmVMaWJIYW5kbGUgPSBOVUxMOwogICAgICAgICAgICAgbUF1ZGlvT3V0ID0gTlVMTDsKICAgICAgICAgICAgIG1QbGF5U3RhdGUgPSAgU1lOVEhQTEFZU1RBVEVfSVNfU1RPUFBFRDsKQEAgLTE4NCw5ICsxODQsOSBAQAogICAgICAgICB+U3ludGhQcm94eUpuaVN0b3JhZ2UoKSB7CiAgICAgICAgICAgICAvL0xPR1YoImVudGVyaW5nIH5TeW50aFByb3h5Sm5pU3RvcmFnZSgpIik7CiAgICAgICAgICAgICBraWxsQXVkaW8oKTsKLSAgICAgICAgICAgIGlmIChtTmF0aXZlU3ludGhJbnRlcmZhY2UpIHsKLSAgICAgICAgICAgICAgICBtTmF0aXZlU3ludGhJbnRlcmZhY2UtPnNodXRkb3duKCk7Ci0gICAgICAgICAgICAgICAgbU5hdGl2ZVN5bnRoSW50ZXJmYWNlID0gTlVMTDsKKyAgICAgICAgICAgIGlmIChtRW5naW5lKSB7CisgICAgICAgICAgICAgICAgbUVuZ2luZS0+ZnVuY3MtPnNodXRkb3duKG1FbmdpbmUpOworICAgICAgICAgICAgICAgIG1FbmdpbmUgPSBOVUxMOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKG1FbmdpbmVMaWJIYW5kbGUpIHsKICAgICAgICAgICAgICAgICAvL0xPR0UoIn5TeW50aFByb3h5Sm5pU3RvcmFnZSgpOiBiZWZvcmUgY2xvc2UgbGlicmFyeSIpOwpAQCAtMjczLDI4ICsyNzMsNDUgQEAKICAqIENhbGxiYWNrIGZyb20gVFRTIGVuZ2luZS4KICAqIERpcmVjdGx5IHNwZWFrcyB1c2luZyBBdWRpb1RyYWNrIG9yIHdyaXRlIHRvIGZpbGUKICAqLwotc3RhdGljIHR0c19jYWxsYmFja19zdGF0dXMgdHRzU3ludGhEb25lQ0Iodm9pZCAqJiB1c2VyZGF0YSwgdWludDMyX3QgcmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZvcm1hdCwgaW50IGNoYW5uZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ4X3QgKiZ3YXYsIHNpemVfdCAmYnVmZmVyU2l6ZSwgdHRzX3N5bnRoX3N0YXR1cyBzdGF0dXMpIHsKK2V4dGVybiAiQyIgYW5kcm9pZF90dHNfY2FsbGJhY2tfc3RhdHVzX3QKK19fdHRzU3ludGhEb25lQ0Iodm9pZCAqKiBwVXNlcmRhdGEsIHVpbnQzMl90IHJhdGUsCisgICAgICAgICAgICAgICBhbmRyb2lkX3R0c19hdWRpb19mb3JtYXRfdCBmb3JtYXQsIGludCBjaGFubmVsLAorICAgICAgICAgICAgICAgaW50OF90ICoqcFdhdiwgc2l6ZV90ICpwQnVmZmVyU2l6ZSwKKyAgICAgICAgICAgICAgIGFuZHJvaWRfdHRzX3N5bnRoX3N0YXR1c190IHN0YXR1cykgCit7CiAgICAgLy9MT0dWKCJ0dHNTeW50aERvbmVDYWxsYmFjazogJWQgYnl0ZXMiLCBidWZmZXJTaXplKTsKKyAgICBBdWRpb1N5c3RlbTo6YXVkaW9fZm9ybWF0ICBlbmNvZGluZzsKIAotICAgIGlmICh1c2VyZGF0YSA9PSBOVUxMKXsKKyAgICBpZiAoKnBVc2VyZGF0YSA9PSBOVUxMKXsKICAgICAgICAgTE9HRSgidXNlcmRhdGEgPT0gTlVMTCIpOwotICAgICAgICByZXR1cm4gVFRTX0NBTExCQUNLX0hBTFQ7CisgICAgICAgIHJldHVybiBBTkRST0lEX1RUU19DQUxMQkFDS19IQUxUOwogICAgIH0KLSAgICBhZnRlclN5bnRoRGF0YV90KiBwRm9yQWZ0ZXIgPSAoYWZ0ZXJTeW50aERhdGFfdCopdXNlcmRhdGE7CisgICAgc3dpdGNoIChmb3JtYXQpIHsKKyAgICBjYXNlIEFORFJPSURfVFRTX0FVRElPX0ZPUk1BVF9QQ01fOF9CSVQ6CisgICAgICAgIGVuY29kaW5nID0gQXVkaW9TeXN0ZW06OlBDTV84X0JJVDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBTkRST0lEX1RUU19BVURJT19GT1JNQVRfUENNXzE2X0JJVDoKKyAgICAgICAgZW5jb2RpbmcgPSBBdWRpb1N5c3RlbTo6UENNXzE2X0JJVDsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgTE9HRSgiQ2FuJ3QgcGxheSwgYmFkIGZvcm1hdCIpOworICAgICAgICByZXR1cm4gQU5EUk9JRF9UVFNfQ0FMTEJBQ0tfSEFMVDsKKyAgICB9CisgICAgYWZ0ZXJTeW50aERhdGFfdCogcEZvckFmdGVyID0gKGFmdGVyU3ludGhEYXRhX3QqKSAqcFVzZXJkYXRhOwogICAgIFN5bnRoUHJveHlKbmlTdG9yYWdlKiBwSm5pRGF0YSA9IChTeW50aFByb3h5Sm5pU3RvcmFnZSopKHBGb3JBZnRlci0+am5pU3RvcmFnZSk7CiAKICAgICBpZiAocEZvckFmdGVyLT51c2FnZU1vZGUgPT0gVVNBR0VNT0RFX1BMQVlfSU1NRURJQVRFTFkpewogICAgICAgICAvL0xPR1YoIkRpcmVjdCBzcGVlY2giKTsKIAotICAgICAgICBpZiAod2F2ID09IE5VTEwpIHsKKyAgICAgICAgaWYgKCpwV2F2ID09IE5VTEwpIHsKICAgICAgICAgICAgIGRlbGV0ZSBwRm9yQWZ0ZXI7CisgICAgICAgICAgICBwRm9yQWZ0ZXIgPSBOVUxMOwogICAgICAgICAgICAgTE9HVigiTnVsbDogc3BlZWNoIGhhcyBjb21wbGV0ZWQiKTsKKyAgICAgICAgICAgIHJldHVybiBBTkRST0lEX1RUU19DQUxMQkFDS19IQUxUOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKGJ1ZmZlclNpemUgPiAwKSB7Ci0gICAgICAgICAgICBwcmVwQXVkaW9UcmFjayhwSm5pRGF0YSwgcEZvckFmdGVyLT5zdHJlYW1UeXBlLCByYXRlLCAoQXVkaW9TeXN0ZW06OmF1ZGlvX2Zvcm1hdClmb3JtYXQsIGNoYW5uZWwpOworICAgICAgICBpZiAoKnBCdWZmZXJTaXplID4gMCkgeworICAgICAgICAgICAgcHJlcEF1ZGlvVHJhY2socEpuaURhdGEsIHBGb3JBZnRlci0+c3RyZWFtVHlwZSwgcmF0ZSwgZW5jb2RpbmcsIGNoYW5uZWwpOwogICAgICAgICAgICAgaWYgKHBKbmlEYXRhLT5tQXVkaW9PdXQpIHsKICAgICAgICAgICAgICAgICBwSm5pRGF0YS0+bVBsYXlMb2NrLmxvY2soKTsKICAgICAgICAgICAgICAgICBpZihwSm5pRGF0YS0+bUF1ZGlvT3V0LT5zdG9wcGVkKCkKQEAgLTMwMywyOCArMzIwLDMxIEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHBKbmlEYXRhLT5tUGxheUxvY2sudW5sb2NrKCk7CiAgICAgICAgICAgICAgICAgaWYgKGJVc2VGaWx0ZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgYXBwbHlGaWx0ZXIoKGludDE2X3QqKXdhdiwgYnVmZmVyU2l6ZS8yKTsKKyAgICAgICAgICAgICAgICAgICAgYXBwbHlGaWx0ZXIoKGludDE2X3QqKSpwV2F2LCAqcEJ1ZmZlclNpemUvMik7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBKbmlEYXRhLT5tQXVkaW9PdXQtPndyaXRlKHdhdiwgYnVmZmVyU2l6ZSk7Ci0gICAgICAgICAgICAgICAgbWVtc2V0KHdhdiwgMCwgYnVmZmVyU2l6ZSk7CisgICAgICAgICAgICAgICAgcEpuaURhdGEtPm1BdWRpb091dC0+d3JpdGUoKnBXYXYsICpwQnVmZmVyU2l6ZSk7CisgICAgICAgICAgICAgICAgbWVtc2V0KCpwV2F2LCAwLCAqcEJ1ZmZlclNpemUpOwogICAgICAgICAgICAgICAgIC8vTE9HVigiQXVkaW9UcmFjayB3cm90ZTogJWQgYnl0ZXMiLCBidWZmZXJTaXplKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgTE9HRSgiQ2FuJ3QgcGxheSwgbnVsbCBhdWRpb3RyYWNrIik7CisgICAgICAgICAgICAgICAgZGVsZXRlIHBGb3JBZnRlcjsKKyAgICAgICAgICAgICAgICBwRm9yQWZ0ZXIgPSBOVUxMOworICAgICAgICAgICAgICAgIHJldHVybiBBTkRST0lEX1RUU19DQUxMQkFDS19IQUxUOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfSBlbHNlICBpZiAocEZvckFmdGVyLT51c2FnZU1vZGUgPT0gVVNBR0VNT0RFX1dSSVRFX1RPX0ZJTEUpIHsKICAgICAgICAgLy9MT0dWKCJTYXZlIHRvIGZpbGUiKTsKLSAgICAgICAgaWYgKHdhdiA9PSBOVUxMKSB7CisgICAgICAgIGlmICgqcFdhdiA9PSBOVUxMKSB7CiAgICAgICAgICAgICBkZWxldGUgcEZvckFmdGVyOwogICAgICAgICAgICAgTE9HVigiTnVsbDogc3BlZWNoIGhhcyBjb21wbGV0ZWQiKTsKLSAgICAgICAgICAgIHJldHVybiBUVFNfQ0FMTEJBQ0tfSEFMVDsKKyAgICAgICAgICAgIHJldHVybiBBTkRST0lEX1RUU19DQUxMQkFDS19IQUxUOwogICAgICAgICB9Ci0gICAgICAgIGlmIChidWZmZXJTaXplID4gMCl7CisgICAgICAgIGlmICgqcEJ1ZmZlclNpemUgPiAwKXsKICAgICAgICAgICAgIGlmIChiVXNlRmlsdGVyKSB7Ci0gICAgICAgICAgICAgICAgYXBwbHlGaWx0ZXIoKGludDE2X3QqKXdhdiwgYnVmZmVyU2l6ZS8yKTsKKyAgICAgICAgICAgICAgICBhcHBseUZpbHRlcigoaW50MTZfdCopKnBXYXYsICpwQnVmZmVyU2l6ZS8yKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZ3cml0ZSh3YXYsIDEsIGJ1ZmZlclNpemUsIHBGb3JBZnRlci0+b3V0cHV0RmlsZSk7Ci0gICAgICAgICAgICBtZW1zZXQod2F2LCAwLCBidWZmZXJTaXplKTsKKyAgICAgICAgICAgIGZ3cml0ZSgqcFdhdiwgMSwgKnBCdWZmZXJTaXplLCBwRm9yQWZ0ZXItPm91dHB1dEZpbGUpOworICAgICAgICAgICAgbWVtc2V0KCpwV2F2LCAwLCAqcEJ1ZmZlclNpemUpOwogICAgICAgICB9CiAgICAgfQogICAgIC8vIEZ1dHVyZSB1cGRhdGU6CkBAIC0zMzIsNyArMzUyLDcgQEAKICAgICAvLyAgICAgIGphdmFUVFNGaWVsZHMuc3ludGhQcm94eU1ldGhvZFBvc3QgbWV0aG9kZSB0byBub3RpZnkKICAgICAvLyAgICAgIHBsYXliYWNrIGhhcyBjb21wbGV0ZWQgaWYgdGhlIHN5bnRoZXNpcyBpcyBkb25lIG9yIGlmIGEgbWFya2VyIGhhcyBiZWVuIHJlYWNoZWQuCiAKLSAgICBpZiAoc3RhdHVzID09IFRUU19TWU5USF9ET05FKSB7CisgICAgaWYgKHN0YXR1cyA9PSBBTkRST0lEX1RUU19TWU5USF9ET05FKSB7CiAgICAgICAgIC8vIHRoaXMgc3RydWN0IHdhcyBhbGxvY2F0ZWQgaW4gdGhlIG9yaWdpbmFsIGFuZHJvaWRfdHRzX1N5bnRoUHJveHlfc3BlYWsgY2FsbCwKICAgICAgICAgLy8gYWxsIHByb2Nlc3NpbmcgbWF0Y2hpbmcgdGhpcyBjYWxsIGlzIG5vdyBkb25lLgogICAgICAgICBMT0dWKCJTcGVlY2ggc3ludGhlc2lzIGRvbmUuIik7CkBAIC0zNDIsMTYgKzM2MiwxNiBAQAogICAgICAgICAgICAgZGVsZXRlIHBGb3JBZnRlcjsKICAgICAgICAgICAgIHBGb3JBZnRlciA9IE5VTEw7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFRUU19DQUxMQkFDS19IQUxUOworICAgICAgICByZXR1cm4gQU5EUk9JRF9UVFNfQ0FMTEJBQ0tfSEFMVDsKICAgICB9CiAKICAgICAvLyB3ZSBkb24ndCB1cGRhdGUgdGhlIHdhdiAob3V0cHV0KSBwYXJhbWV0ZXIgYXMgd2UnbGwgbGV0IHRoZSBuZXh0IGNhbGxiYWNrCiAgICAgLy8gd3JpdGUgYXQgdGhlIHNhbWUgbG9jYXRpb24sIHdlJ3ZlIGNvbnN1bWVkIHRoZSBkYXRhIGFscmVhZHksIGJ1dCB3ZSBuZWVkCiAgICAgLy8gdG8gdXBkYXRlIGJ1ZmZlclNpemUgdG8gbGV0IHRoZSBUVFMgZW5naW5lIGtub3cgaG93IG11Y2ggaXQgY2FuIHdyaXRlIHRoZQogICAgIC8vIG5leHQgdGltZSBpdCBjYWxscyB0aGlzIGZ1bmN0aW9uLgotICAgIGJ1ZmZlclNpemUgPSBwSm5pRGF0YS0+bUJ1ZmZlclNpemU7CisgICAgKnBCdWZmZXJTaXplID0gcEpuaURhdGEtPm1CdWZmZXJTaXplOwogCi0gICAgcmV0dXJuIFRUU19DQUxMQkFDS19DT05USU5VRTsKKyAgICByZXR1cm4gQU5EUk9JRF9UVFNfQ0FMTEJBQ0tfQ09OVElOVUU7CiB9CiAKIApAQCAtMzYwLDcgKzM4MCw3IEBACiBhbmRyb2lkX3R0c19TeW50aFByb3h5X3NldExvd1NoZWxmKEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXosIGpib29sZWFuIGFwcGx5RmlsdGVyLAogICAgICAgICBqZmxvYXQgZmlsdGVyR2FpbiwgamZsb2F0IGF0dGVudWF0aW9uSW5EYiwgamZsb2F0IGZyZXFJbkh6LCBqZmxvYXQgc2xvcGUpCiB7Ci0gICAgaW50IHJlc3VsdCA9IFRUU19TVUNDRVNTOworICAgIGludCByZXN1bHQgPSBBTkRST0lEX1RUU19TVUNDRVNTOwogCiAgICAgYlVzZUZpbHRlciA9IGFwcGx5RmlsdGVyOwogICAgIGlmIChhcHBseUZpbHRlcikgewpAQCAtMzczLDcgKzM5Myw3IEBACiAgICAgICAgICAgICBpbml0aWFsaXplRVEoKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIExPR0UoIkludmFsaWQgc2xvcGUsIGNhbid0IGJlIG51bGwiKTsKLSAgICAgICAgICAgIHJlc3VsdCA9IFRUU19GQUlMVVJFOworICAgICAgICAgICAgcmVzdWx0ID0gQU5EUk9JRF9UVFNfRkFJTFVSRTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMzg1LDcgKzQwNSw3IEBACiBhbmRyb2lkX3R0c19TeW50aFByb3h5X25hdGl2ZV9zZXR1cChKTklFbnYgKmVudiwgam9iamVjdCB0aGl6LAogICAgICAgICBqb2JqZWN0IHdlYWtfdGhpcywganN0cmluZyBuYXRpdmVTb0xpYiwganN0cmluZyBlbmdDb25maWcpCiB7Ci0gICAgaW50IHJlc3VsdCA9IFRUU19GQUlMVVJFOworICAgIGludCByZXN1bHQgPSBBTkRST0lEX1RUU19GQUlMVVJFOwogCiAgICAgYlVzZUZpbHRlciA9IGZhbHNlOwogCkBAIC00MDIsMTggKzQyMiwyOCBAQAogICAgIGlmIChlbmdpbmVfbGliX2hhbmRsZSA9PSBOVUxMKSB7CiAgICAgICAgTE9HRSgiYW5kcm9pZF90dHNfU3ludGhQcm94eV9uYXRpdmVfc2V0dXAoKTogZW5naW5lX2xpYl9oYW5kbGUgPT0gTlVMTCIpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIFR0c0VuZ2luZSAqKCpnZXRfVHRzRW5naW5lKSgpID0KLSAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8VHRzRW5naW5lKiAoKikoKT4oZGxzeW0oZW5naW5lX2xpYl9oYW5kbGUsICJnZXRUdHNFbmdpbmUiKSk7CisgICAgICAgIGFuZHJvaWRfdHRzX2VuZ2luZV90ICogKCpnZXRfVHRzRW5naW5lKSgpID0KKyAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8YW5kcm9pZF90dHNfZW5naW5lX3QqICgqKSgpPihkbHN5bShlbmdpbmVfbGliX2hhbmRsZSwgImFuZHJvaWRfZ2V0VHRzRW5naW5lIikpOwogCi0gICAgICAgIHBKbmlTdG9yYWdlLT5tTmF0aXZlU3ludGhJbnRlcmZhY2UgPSAoKmdldF9UdHNFbmdpbmUpKCk7Ci0gICAgICAgIHBKbmlTdG9yYWdlLT5tRW5naW5lTGliSGFuZGxlID0gZW5naW5lX2xpYl9oYW5kbGU7Ci0KLSAgICAgICAgaWYgKHBKbmlTdG9yYWdlLT5tTmF0aXZlU3ludGhJbnRlcmZhY2UpIHsKLSAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBsKGVuZ2luZU11dGV4KTsKLSAgICAgICAgICAgIHBKbmlTdG9yYWdlLT5tTmF0aXZlU3ludGhJbnRlcmZhY2UtPmluaXQodHRzU3ludGhEb25lQ0IsIGVuZ0NvbmZpZ1N0cmluZyk7CisgICAgICAgIC8vIFN1cHBvcnQgb2Jzb2xldGUvbGVnYWN5IGJpbmFyeSBtb2R1bGVzCisgICAgICAgIGlmIChnZXRfVHRzRW5naW5lID09IE5VTEwpIHsKKyAgICAgICAgICAgIGdldF9UdHNFbmdpbmUgPQorICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8YW5kcm9pZF90dHNfZW5naW5lX3QqICgqKSgpPihkbHN5bShlbmdpbmVfbGliX2hhbmRsZSwgImdldFR0c0VuZ2luZSIpKTsKICAgICAgICAgfQogCi0gICAgICAgIHJlc3VsdCA9IFRUU19TVUNDRVNTOworICAgICAgICBwSm5pU3RvcmFnZS0+bUVuZ2luZSA9ICgqZ2V0X1R0c0VuZ2luZSkoKTsKKyAgICAgICAgcEpuaVN0b3JhZ2UtPm1FbmdpbmVMaWJIYW5kbGUgPSBlbmdpbmVfbGliX2hhbmRsZTsKKworICAgICAgICBhbmRyb2lkX3R0c19lbmdpbmVfdCAqZW5naW5lID0gcEpuaVN0b3JhZ2UtPm1FbmdpbmU7CisgICAgICAgIGlmIChlbmdpbmUpIHsKKyAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBsKGVuZ2luZU11dGV4KTsKKyAgICAgICAgICAgIGVuZ2luZS0+ZnVuY3MtPmluaXQoCisgICAgICAgICAgICAgICAgZW5naW5lLAorICAgICAgICAgICAgICAgIF9fdHRzU3ludGhEb25lQ0IsCisgICAgICAgICAgICAgICAgZW5nQ29uZmlnU3RyaW5nKTsKKyAgICAgICAgfQorCisgICAgICAgIHJlc3VsdCA9IEFORFJPSURfVFRTX1NVQ0NFU1M7CiAgICAgfQogCiAgICAgLy8gd2UgdXNlIGEgd2VhayByZWZlcmVuY2Ugc28gdGhlIFN5bnRoUHJveHkgb2JqZWN0IGNhbiBiZSBnYXJiYWdlIGNvbGxlY3RlZC4KQEAgLTQ2Miw3ICs0OTIsNyBAQAogYW5kcm9pZF90dHNfU3ludGhQcm94eV9pc0xhbmd1YWdlQXZhaWxhYmxlKEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXosIGppbnQgam5pRGF0YSwKICAgICAgICAganN0cmluZyBsYW5ndWFnZSwganN0cmluZyBjb3VudHJ5LCBqc3RyaW5nIHZhcmlhbnQpCiB7Ci0gICAgaW50IHJlc3VsdCA9IFRUU19MQU5HX05PVF9TVVBQT1JURUQ7CisgICAgaW50IHJlc3VsdCA9IEFORFJPSURfVFRTX0xBTkdfTk9UX1NVUFBPUlRFRDsKIAogICAgIGlmIChqbmlEYXRhID09IDApIHsKICAgICAgICAgTE9HRSgiYW5kcm9pZF90dHNfU3ludGhQcm94eV9pc0xhbmd1YWdlQXZhaWxhYmxlKCk6IGludmFsaWQgSk5JIGRhdGEiKTsKQEAgLTQ3NCw4ICs1MDQsMTAgQEAKICAgICBjb25zdCBjaGFyICpjb3VudHJ5TmF0aXZlU3RyaW5nID0gZW52LT5HZXRTdHJpbmdVVEZDaGFycyhjb3VudHJ5LCAwKTsKICAgICBjb25zdCBjaGFyICp2YXJpYW50TmF0aXZlU3RyaW5nID0gZW52LT5HZXRTdHJpbmdVVEZDaGFycyh2YXJpYW50LCAwKTsKIAotICAgIGlmIChwU3ludGhEYXRhLT5tTmF0aXZlU3ludGhJbnRlcmZhY2UpIHsKLSAgICAgICAgcmVzdWx0ID0gcFN5bnRoRGF0YS0+bU5hdGl2ZVN5bnRoSW50ZXJmYWNlLT5pc0xhbmd1YWdlQXZhaWxhYmxlKGxhbmdOYXRpdmVTdHJpbmcsCisgICAgYW5kcm9pZF90dHNfZW5naW5lX3QgKmVuZ2luZSA9IHBTeW50aERhdGEtPm1FbmdpbmU7CisKKyAgICBpZiAoZW5naW5lKSB7CisgICAgICAgIHJlc3VsdCA9IGVuZ2luZS0+ZnVuY3MtPmlzTGFuZ3VhZ2VBdmFpbGFibGUoZW5naW5lLGxhbmdOYXRpdmVTdHJpbmcsCiAgICAgICAgICAgICAgICAgY291bnRyeU5hdGl2ZVN0cmluZywgdmFyaWFudE5hdGl2ZVN0cmluZyk7CiAgICAgfQogICAgIGVudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKGxhbmd1YWdlLCBsYW5nTmF0aXZlU3RyaW5nKTsKQEAgLTQ4Nyw3ICs1MTksNyBAQAogc3RhdGljIGludAogYW5kcm9pZF90dHNfU3ludGhQcm94eV9zZXRDb25maWcoSk5JRW52ICplbnYsIGpvYmplY3QgdGhpeiwgamludCBqbmlEYXRhLCBqc3RyaW5nIGVuZ2luZUNvbmZpZykKIHsKLSAgICBpbnQgcmVzdWx0ID0gVFRTX0ZBSUxVUkU7CisgICAgaW50IHJlc3VsdCA9IEFORFJPSURfVFRTX0ZBSUxVUkU7CiAKICAgICBpZiAoam5pRGF0YSA9PSAwKSB7CiAgICAgICAgIExPR0UoImFuZHJvaWRfdHRzX1N5bnRoUHJveHlfc2V0Q29uZmlnKCk6IGludmFsaWQgSk5JIGRhdGEiKTsKQEAgLTQ5OCw5ICs1MzAsMTAgQEAKIAogICAgIFN5bnRoUHJveHlKbmlTdG9yYWdlKiBwU3ludGhEYXRhID0gKFN5bnRoUHJveHlKbmlTdG9yYWdlKilqbmlEYXRhOwogICAgIGNvbnN0IGNoYXIgKmVuZ2luZUNvbmZpZ05hdGl2ZVN0cmluZyA9IGVudi0+R2V0U3RyaW5nVVRGQ2hhcnMoZW5naW5lQ29uZmlnLCAwKTsKKyAgICBhbmRyb2lkX3R0c19lbmdpbmVfdCAqZW5naW5lID0gcFN5bnRoRGF0YS0+bUVuZ2luZTsKIAotICAgIGlmIChwU3ludGhEYXRhLT5tTmF0aXZlU3ludGhJbnRlcmZhY2UpIHsKLSAgICAgICAgcmVzdWx0ID0gcFN5bnRoRGF0YS0+bU5hdGl2ZVN5bnRoSW50ZXJmYWNlLT5zZXRQcm9wZXJ0eShBTkRST0lEX1RUU19FTkdJTkVfUFJPUEVSVFlfQ09ORklHLAorICAgIGlmIChlbmdpbmUpIHsKKyAgICAgICAgcmVzdWx0ID0gZW5naW5lLT5mdW5jcy0+c2V0UHJvcGVydHkoZW5naW5lLEFORFJPSURfVFRTX0VOR0lORV9QUk9QRVJUWV9DT05GSUcsCiAgICAgICAgICAgICAgICAgZW5naW5lQ29uZmlnTmF0aXZlU3RyaW5nLCBzdHJsZW4oZW5naW5lQ29uZmlnTmF0aXZlU3RyaW5nKSk7CiAgICAgfQogICAgIGVudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKGVuZ2luZUNvbmZpZywgZW5naW5lQ29uZmlnTmF0aXZlU3RyaW5nKTsKQEAgLTUxMiw3ICs1NDUsNyBAQAogYW5kcm9pZF90dHNfU3ludGhQcm94eV9zZXRMYW5ndWFnZShKTklFbnYgKmVudiwgam9iamVjdCB0aGl6LCBqaW50IGpuaURhdGEsCiAgICAgICAgIGpzdHJpbmcgbGFuZ3VhZ2UsIGpzdHJpbmcgY291bnRyeSwganN0cmluZyB2YXJpYW50KQogewotICAgIGludCByZXN1bHQgPSBUVFNfTEFOR19OT1RfU1VQUE9SVEVEOworICAgIGludCByZXN1bHQgPSBBTkRST0lEX1RUU19MQU5HX05PVF9TVVBQT1JURUQ7CiAKICAgICBpZiAoam5pRGF0YSA9PSAwKSB7CiAgICAgICAgIExPR0UoImFuZHJvaWRfdHRzX1N5bnRoUHJveHlfc2V0TGFuZ3VhZ2UoKTogaW52YWxpZCBKTkkgZGF0YSIpOwpAQCAtNTI1LDkgKzU1OCwxMCBAQAogICAgIGNvbnN0IGNoYXIgKmxhbmdOYXRpdmVTdHJpbmcgPSBlbnYtPkdldFN0cmluZ1VURkNoYXJzKGxhbmd1YWdlLCAwKTsKICAgICBjb25zdCBjaGFyICpjb3VudHJ5TmF0aXZlU3RyaW5nID0gZW52LT5HZXRTdHJpbmdVVEZDaGFycyhjb3VudHJ5LCAwKTsKICAgICBjb25zdCBjaGFyICp2YXJpYW50TmF0aXZlU3RyaW5nID0gZW52LT5HZXRTdHJpbmdVVEZDaGFycyh2YXJpYW50LCAwKTsKKyAgICBhbmRyb2lkX3R0c19lbmdpbmVfdCAqZW5naW5lID0gcFN5bnRoRGF0YS0+bUVuZ2luZTsKIAotICAgIGlmIChwU3ludGhEYXRhLT5tTmF0aXZlU3ludGhJbnRlcmZhY2UpIHsKLSAgICAgICAgcmVzdWx0ID0gcFN5bnRoRGF0YS0+bU5hdGl2ZVN5bnRoSW50ZXJmYWNlLT5zZXRMYW5ndWFnZShsYW5nTmF0aXZlU3RyaW5nLAorICAgIGlmIChlbmdpbmUpIHsKKyAgICAgICAgcmVzdWx0ID0gZW5naW5lLT5mdW5jcy0+c2V0TGFuZ3VhZ2UoZW5naW5lLCBsYW5nTmF0aXZlU3RyaW5nLAogICAgICAgICAgICAgICAgIGNvdW50cnlOYXRpdmVTdHJpbmcsIHZhcmlhbnROYXRpdmVTdHJpbmcpOwogICAgIH0KICAgICBlbnYtPlJlbGVhc2VTdHJpbmdVVEZDaGFycyhsYW5ndWFnZSwgbGFuZ05hdGl2ZVN0cmluZyk7CkBAIC01NDEsNyArNTc1LDcgQEAKIGFuZHJvaWRfdHRzX1N5bnRoUHJveHlfbG9hZExhbmd1YWdlKEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXosIGppbnQgam5pRGF0YSwKICAgICAgICAganN0cmluZyBsYW5ndWFnZSwganN0cmluZyBjb3VudHJ5LCBqc3RyaW5nIHZhcmlhbnQpCiB7Ci0gICAgaW50IHJlc3VsdCA9IFRUU19MQU5HX05PVF9TVVBQT1JURUQ7CisgICAgaW50IHJlc3VsdCA9IEFORFJPSURfVFRTX0xBTkdfTk9UX1NVUFBPUlRFRDsKIAogICAgIGlmIChqbmlEYXRhID09IDApIHsKICAgICAgICAgTE9HRSgiYW5kcm9pZF90dHNfU3ludGhQcm94eV9sb2FkTGFuZ3VhZ2UoKTogaW52YWxpZCBKTkkgZGF0YSIpOwpAQCAtNTUyLDkgKzU4NiwxMCBAQAogICAgIGNvbnN0IGNoYXIgKmxhbmdOYXRpdmVTdHJpbmcgPSBlbnYtPkdldFN0cmluZ1VURkNoYXJzKGxhbmd1YWdlLCAwKTsKICAgICBjb25zdCBjaGFyICpjb3VudHJ5TmF0aXZlU3RyaW5nID0gZW52LT5HZXRTdHJpbmdVVEZDaGFycyhjb3VudHJ5LCAwKTsKICAgICBjb25zdCBjaGFyICp2YXJpYW50TmF0aXZlU3RyaW5nID0gZW52LT5HZXRTdHJpbmdVVEZDaGFycyh2YXJpYW50LCAwKTsKKyAgICBhbmRyb2lkX3R0c19lbmdpbmVfdCAqZW5naW5lID0gcFN5bnRoRGF0YS0+bUVuZ2luZTsKIAotICAgIGlmIChwU3ludGhEYXRhLT5tTmF0aXZlU3ludGhJbnRlcmZhY2UpIHsKLSAgICAgICAgcmVzdWx0ID0gcFN5bnRoRGF0YS0+bU5hdGl2ZVN5bnRoSW50ZXJmYWNlLT5sb2FkTGFuZ3VhZ2UobGFuZ05hdGl2ZVN0cmluZywKKyAgICBpZiAoZW5naW5lKSB7CisgICAgICAgIHJlc3VsdCA9IGVuZ2luZS0+ZnVuY3MtPmxvYWRMYW5ndWFnZShlbmdpbmUsIGxhbmdOYXRpdmVTdHJpbmcsCiAgICAgICAgICAgICAgICAgY291bnRyeU5hdGl2ZVN0cmluZywgdmFyaWFudE5hdGl2ZVN0cmluZyk7CiAgICAgfQogICAgIGVudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKGxhbmd1YWdlLCBsYW5nTmF0aXZlU3RyaW5nKTsKQEAgLTU2OSw3ICs2MDQsNyBAQAogYW5kcm9pZF90dHNfU3ludGhQcm94eV9zZXRTcGVlY2hSYXRlKEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXosIGppbnQgam5pRGF0YSwKICAgICAgICAgamludCBzcGVlY2hSYXRlKQogewotICAgIGludCByZXN1bHQgPSBUVFNfRkFJTFVSRTsKKyAgICBpbnQgcmVzdWx0ID0gQU5EUk9JRF9UVFNfRkFJTFVSRTsKIAogICAgIGlmIChqbmlEYXRhID09IDApIHsKICAgICAgICAgTE9HRSgiYW5kcm9pZF90dHNfU3ludGhQcm94eV9zZXRTcGVlY2hSYXRlKCk6IGludmFsaWQgSk5JIGRhdGEiKTsKQEAgLTU4NCw5ICs2MTksMTAgQEAKIAogICAgIFN5bnRoUHJveHlKbmlTdG9yYWdlKiBwU3ludGhEYXRhID0gKFN5bnRoUHJveHlKbmlTdG9yYWdlKilqbmlEYXRhOwogICAgIExPR0koInNldHRpbmcgc3BlZWNoIHJhdGUgdG8gJWQiLCBzcGVlY2hSYXRlKTsKKyAgICBhbmRyb2lkX3R0c19lbmdpbmVfdCAqZW5naW5lID0gcFN5bnRoRGF0YS0+bUVuZ2luZTsKIAotICAgIGlmIChwU3ludGhEYXRhLT5tTmF0aXZlU3ludGhJbnRlcmZhY2UpIHsKLSAgICAgICAgcmVzdWx0ID0gcFN5bnRoRGF0YS0+bU5hdGl2ZVN5bnRoSW50ZXJmYWNlLT5zZXRQcm9wZXJ0eSgicmF0ZSIsIGJ1ZmZlciwgYnVmU2l6ZSk7CisgICAgaWYgKGVuZ2luZSkgeworICAgICAgICByZXN1bHQgPSBlbmdpbmUtPmZ1bmNzLT5zZXRQcm9wZXJ0eShlbmdpbmUsICJyYXRlIiwgYnVmZmVyLCBidWZTaXplKTsKICAgICB9CiAKICAgICByZXR1cm4gcmVzdWx0OwpAQCAtNTk3LDcgKzYzMyw3IEBACiBhbmRyb2lkX3R0c19TeW50aFByb3h5X3NldFBpdGNoKEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXosIGppbnQgam5pRGF0YSwKICAgICAgICAgamludCBwaXRjaCkKIHsKLSAgICBpbnQgcmVzdWx0ID0gVFRTX0ZBSUxVUkU7CisgICAgaW50IHJlc3VsdCA9IEFORFJPSURfVFRTX0ZBSUxVUkU7CiAKICAgICBpZiAoam5pRGF0YSA9PSAwKSB7CiAgICAgICAgIExPR0UoImFuZHJvaWRfdHRzX1N5bnRoUHJveHlfc2V0UGl0Y2goKTogaW52YWxpZCBKTkkgZGF0YSIpOwpAQCAtNjEyLDkgKzY0OCwxMCBAQAogCiAgICAgU3ludGhQcm94eUpuaVN0b3JhZ2UqIHBTeW50aERhdGEgPSAoU3ludGhQcm94eUpuaVN0b3JhZ2UqKWpuaURhdGE7CiAgICAgTE9HSSgic2V0dGluZyBwaXRjaCB0byAlZCIsIHBpdGNoKTsKKyAgICBhbmRyb2lkX3R0c19lbmdpbmVfdCAqZW5naW5lID0gcFN5bnRoRGF0YS0+bUVuZ2luZTsKIAotICAgIGlmIChwU3ludGhEYXRhLT5tTmF0aXZlU3ludGhJbnRlcmZhY2UpIHsKLSAgICAgICAgcmVzdWx0ID0gcFN5bnRoRGF0YS0+bU5hdGl2ZVN5bnRoSW50ZXJmYWNlLT5zZXRQcm9wZXJ0eSgicGl0Y2giLCBidWZmZXIsIGJ1ZlNpemUpOworICAgIGlmIChlbmdpbmUpIHsKKyAgICAgICAgcmVzdWx0ID0gZW5naW5lLT5mdW5jcy0+c2V0UHJvcGVydHkoZW5naW5lLCAicGl0Y2giLCBidWZmZXIsIGJ1ZlNpemUpOwogICAgIH0KIAogICAgIHJldHVybiByZXN1bHQ7CkBAIC02MjUsNyArNjYyLDcgQEAKIGFuZHJvaWRfdHRzX1N5bnRoUHJveHlfc3ludGhlc2l6ZVRvRmlsZShKTklFbnYgKmVudiwgam9iamVjdCB0aGl6LCBqaW50IGpuaURhdGEsCiAgICAgICAgIGpzdHJpbmcgdGV4dEphdmFTdHJpbmcsIGpzdHJpbmcgZmlsZW5hbWVKYXZhU3RyaW5nKQogewotICAgIGludCByZXN1bHQgPSBUVFNfRkFJTFVSRTsKKyAgICBpbnQgcmVzdWx0ID0gQU5EUk9JRF9UVFNfRkFJTFVSRTsKIAogICAgIGlmIChqbmlEYXRhID09IDApIHsKICAgICAgICAgTE9HRSgiYW5kcm9pZF90dHNfU3ludGhQcm94eV9zeW50aGVzaXplVG9GaWxlKCk6IGludmFsaWQgSk5JIGRhdGEiKTsKQEAgLTYzMyw3ICs2NzAsNyBAQAogICAgIH0KIAogICAgIFN5bnRoUHJveHlKbmlTdG9yYWdlKiBwU3ludGhEYXRhID0gKFN5bnRoUHJveHlKbmlTdG9yYWdlKilqbmlEYXRhOwotICAgIGlmICghcFN5bnRoRGF0YS0+bU5hdGl2ZVN5bnRoSW50ZXJmYWNlKSB7CisgICAgaWYgKCFwU3ludGhEYXRhLT5tRW5naW5lKSB7CiAgICAgICAgIExPR0UoImFuZHJvaWRfdHRzX1N5bnRoUHJveHlfc3ludGhlc2l6ZVRvRmlsZSgpOiBpbnZhbGlkIGVuZ2luZSBoYW5kbGUiKTsKICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9CkBAIC02NDMsMTIgKzY4MCwyMiBAQAogICAgIE11dGV4OjpBdXRvbG9jayBsKGVuZ2luZU11dGV4KTsKIAogICAgIC8vIFJldHJpZXZlIGF1ZGlvIHBhcmFtZXRlcnMgYmVmb3JlIHdyaXRpbmcgdGhlIGZpbGUgaGVhZGVyCi0gICAgQXVkaW9TeXN0ZW06OmF1ZGlvX2Zvcm1hdCBlbmNvZGluZyA9IERFRkFVTFRfVFRTX0ZPUk1BVDsKKyAgICBBdWRpb1N5c3RlbTo6YXVkaW9fZm9ybWF0IGVuY29kaW5nOwogICAgIHVpbnQzMl90IHJhdGUgPSBERUZBVUxUX1RUU19SQVRFOwogICAgIGludCBjaGFubmVscyA9IERFRkFVTFRfVFRTX05CX0NIQU5ORUxTOwotICAgIHBTeW50aERhdGEtPm1OYXRpdmVTeW50aEludGVyZmFjZS0+c2V0QXVkaW9Gb3JtYXQoZW5jb2RpbmcsIHJhdGUsIGNoYW5uZWxzKTsKKyAgICBhbmRyb2lkX3R0c19lbmdpbmVfdCAqZW5naW5lID0gcFN5bnRoRGF0YS0+bUVuZ2luZTsKKyAgICBhbmRyb2lkX3R0c19hdWRpb19mb3JtYXRfdCAgZm9ybWF0ID0gQU5EUk9JRF9UVFNfQVVESU9fRk9STUFUX0RFRkFVTFQ7CiAKLSAgICBpZiAoKGVuY29kaW5nICE9IEF1ZGlvU3lzdGVtOjpQQ01fMTZfQklUKSAmJiAoZW5jb2RpbmcgIT0gQXVkaW9TeXN0ZW06OlBDTV84X0JJVCkpIHsKKyAgICBlbmdpbmUtPmZ1bmNzLT5zZXRBdWRpb0Zvcm1hdChlbmdpbmUsICZmb3JtYXQsICZyYXRlLCAmY2hhbm5lbHMpOworCisgICAgc3dpdGNoIChmb3JtYXQpIHsKKyAgICBjYXNlIEFORFJPSURfVFRTX0FVRElPX0ZPUk1BVF9QQ01fMTZfQklUOgorICAgICAgICBlbmNvZGluZyA9IEF1ZGlvU3lzdGVtOjpQQ01fMTZfQklUOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFORFJPSURfVFRTX0FVRElPX0ZPUk1BVF9QQ01fOF9CSVQ6CisgICAgICAgIGVuY29kaW5nID0gQXVkaW9TeXN0ZW06OlBDTV84X0JJVDsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKICAgICAgICAgTE9HRSgiYW5kcm9pZF90dHNfU3ludGhQcm94eV9zeW50aGVzaXplVG9GaWxlKCk6IGVuZ2luZSB1c2VzIGludmFsaWQgZm9ybWF0Iik7CiAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQpAQCAtNjc3LDcgKzcyNCw4IEBACiAgICAgdW5zaWduZWQgaW50IHVuaXF1ZV9pZGVudGlmaWVyOwogCiAgICAgbWVtc2V0KHBTeW50aERhdGEtPm1CdWZmZXIsIDAsIHBTeW50aERhdGEtPm1CdWZmZXJTaXplKTsKLSAgICByZXN1bHQgPSBwU3ludGhEYXRhLT5tTmF0aXZlU3ludGhJbnRlcmZhY2UtPnN5bnRoZXNpemVUZXh0KHRleHROYXRpdmVTdHJpbmcsCisKKyAgICByZXN1bHQgPSBlbmdpbmUtPmZ1bmNzLT5zeW50aGVzaXplVGV4dChlbmdpbmUsIHRleHROYXRpdmVTdHJpbmcsCiAgICAgICAgICAgICBwU3ludGhEYXRhLT5tQnVmZmVyLCBwU3ludGhEYXRhLT5tQnVmZmVyU2l6ZSwgKHZvaWQgKilwRm9yQWZ0ZXIpOwogCiAgICAgbG9uZyBmaWxlbGVuID0gZnRlbGwocEZvckFmdGVyLT5vdXRwdXRGaWxlKTsKQEAgLTczNyw3ICs3ODUsNyBAQAogYW5kcm9pZF90dHNfU3ludGhQcm94eV9zcGVhayhKTklFbnYgKmVudiwgam9iamVjdCB0aGl6LCBqaW50IGpuaURhdGEsCiAgICAgICAgIGpzdHJpbmcgdGV4dEphdmFTdHJpbmcsIGppbnQgamF2YVN0cmVhbVR5cGUpCiB7Ci0gICAgaW50IHJlc3VsdCA9IFRUU19GQUlMVVJFOworICAgIGludCByZXN1bHQgPSBBTkRST0lEX1RUU19GQUlMVVJFOwogCiAgICAgaWYgKGpuaURhdGEgPT0gMCkgewogICAgICAgICBMT0dFKCJhbmRyb2lkX3R0c19TeW50aFByb3h5X3NwZWFrKCk6IGludmFsaWQgSk5JIGRhdGEiKTsKQEAgLTc1OSwxMCArODA3LDEyIEBACiAgICAgcEZvckFmdGVyLT51c2FnZU1vZGUgID0gVVNBR0VNT0RFX1BMQVlfSU1NRURJQVRFTFk7CiAgICAgcEZvckFmdGVyLT5zdHJlYW1UeXBlID0gKEF1ZGlvU3lzdGVtOjpzdHJlYW1fdHlwZSkgamF2YVN0cmVhbVR5cGU7CiAKLSAgICBpZiAocFN5bnRoRGF0YS0+bU5hdGl2ZVN5bnRoSW50ZXJmYWNlKSB7CisgICAgaWYgKHBTeW50aERhdGEtPm1FbmdpbmUpIHsKICAgICAgICAgY29uc3QgY2hhciAqdGV4dE5hdGl2ZVN0cmluZyA9IGVudi0+R2V0U3RyaW5nVVRGQ2hhcnModGV4dEphdmFTdHJpbmcsIDApOwogICAgICAgICBtZW1zZXQocFN5bnRoRGF0YS0+bUJ1ZmZlciwgMCwgcFN5bnRoRGF0YS0+bUJ1ZmZlclNpemUpOwotICAgICAgICByZXN1bHQgPSBwU3ludGhEYXRhLT5tTmF0aXZlU3ludGhJbnRlcmZhY2UtPnN5bnRoZXNpemVUZXh0KHRleHROYXRpdmVTdHJpbmcsCisgICAgICAgIGFuZHJvaWRfdHRzX2VuZ2luZV90ICplbmdpbmUgPSBwU3ludGhEYXRhLT5tRW5naW5lOworCisgICAgICAgIHJlc3VsdCA9IGVuZ2luZS0+ZnVuY3MtPnN5bnRoZXNpemVUZXh0KGVuZ2luZSwgdGV4dE5hdGl2ZVN0cmluZywKICAgICAgICAgICAgICAgICBwU3ludGhEYXRhLT5tQnVmZmVyLCBwU3ludGhEYXRhLT5tQnVmZmVyU2l6ZSwgKHZvaWQgKilwRm9yQWZ0ZXIpOwogICAgICAgICBlbnYtPlJlbGVhc2VTdHJpbmdVVEZDaGFycyh0ZXh0SmF2YVN0cmluZywgdGV4dE5hdGl2ZVN0cmluZyk7CiAgICAgfQpAQCAtNzc0LDcgKzgyNCw3IEBACiBzdGF0aWMgaW50CiBhbmRyb2lkX3R0c19TeW50aFByb3h5X3N0b3AoSk5JRW52ICplbnYsIGpvYmplY3QgdGhpeiwgamludCBqbmlEYXRhKQogewotICAgIGludCByZXN1bHQgPSBUVFNfRkFJTFVSRTsKKyAgICBpbnQgcmVzdWx0ID0gQU5EUk9JRF9UVFNfRkFJTFVSRTsKIAogICAgIGlmIChqbmlEYXRhID09IDApIHsKICAgICAgICAgTE9HRSgiYW5kcm9pZF90dHNfU3ludGhQcm94eV9zdG9wKCk6IGludmFsaWQgSk5JIGRhdGEiKTsKQEAgLTc5MCw4ICs4NDAsOSBAQAogICAgIH0KICAgICBwU3ludGhEYXRhLT5tUGxheUxvY2sudW5sb2NrKCk7CiAKLSAgICBpZiAocFN5bnRoRGF0YS0+bU5hdGl2ZVN5bnRoSW50ZXJmYWNlKSB7Ci0gICAgICAgIHJlc3VsdCA9IHBTeW50aERhdGEtPm1OYXRpdmVTeW50aEludGVyZmFjZS0+c3RvcCgpOworICAgIGFuZHJvaWRfdHRzX2VuZ2luZV90ICplbmdpbmUgPSBwU3ludGhEYXRhLT5tRW5naW5lOworICAgIGlmIChlbmdpbmUpIHsKKyAgICAgICAgcmVzdWx0ID0gZW5naW5lLT5mdW5jcy0+c3RvcChlbmdpbmUpOwogICAgIH0KIAogICAgIHJldHVybiByZXN1bHQ7CkBAIC04MDEsNyArODUyLDcgQEAKIHN0YXRpYyBpbnQKIGFuZHJvaWRfdHRzX1N5bnRoUHJveHlfc3RvcFN5bmMoSk5JRW52ICplbnYsIGpvYmplY3QgdGhpeiwgamludCBqbmlEYXRhKQogewotICAgIGludCByZXN1bHQgPSBUVFNfRkFJTFVSRTsKKyAgICBpbnQgcmVzdWx0ID0gQU5EUk9JRF9UVFNfRkFJTFVSRTsKIAogICAgIGlmIChqbmlEYXRhID09IDApIHsKICAgICAgICAgTE9HRSgiYW5kcm9pZF90dHNfU3ludGhQcm94eV9zdG9wKCk6IGludmFsaWQgSk5JIGRhdGEiKTsKQEAgLTgyOSw3ICs4ODAsNyBAQAogCiAgICAgU3ludGhQcm94eUpuaVN0b3JhZ2UqIHBTeW50aERhdGEgPSAoU3ludGhQcm94eUpuaVN0b3JhZ2UqKWpuaURhdGE7CiAKLSAgICBpZiAocFN5bnRoRGF0YS0+bU5hdGl2ZVN5bnRoSW50ZXJmYWNlKSB7CisgICAgaWYgKHBTeW50aERhdGEtPm1FbmdpbmUpIHsKICAgICAgICAgc2l6ZV90IGJ1ZlNpemUgPSAxMDA7CiAgICAgICAgIGNoYXIgbGFuZ1tidWZTaXplXTsKICAgICAgICAgY2hhciBjb3VudHJ5W2J1ZlNpemVdOwpAQCAtODM5LDcgKzg5MCw5IEBACiAgICAgICAgIG1lbXNldCh2YXJpYW50LCAwLCBidWZTaXplKTsKICAgICAgICAgam9iamVjdEFycmF5IHJldExvY2FsZSA9IChqb2JqZWN0QXJyYXkpZW52LT5OZXdPYmplY3RBcnJheSgzLAogICAgICAgICAgICAgICAgIGVudi0+RmluZENsYXNzKCJqYXZhL2xhbmcvU3RyaW5nIiksIGVudi0+TmV3U3RyaW5nVVRGKCIiKSk7Ci0gICAgICAgIHBTeW50aERhdGEtPm1OYXRpdmVTeW50aEludGVyZmFjZS0+Z2V0TGFuZ3VhZ2UobGFuZywgY291bnRyeSwgdmFyaWFudCk7CisKKyAgICAgICAgYW5kcm9pZF90dHNfZW5naW5lX3QgKmVuZ2luZSA9IHBTeW50aERhdGEtPm1FbmdpbmU7CisgICAgICAgIGVuZ2luZS0+ZnVuY3MtPmdldExhbmd1YWdlKGVuZ2luZSwgbGFuZywgY291bnRyeSwgdmFyaWFudCk7CiAgICAgICAgIGVudi0+U2V0T2JqZWN0QXJyYXlFbGVtZW50KHJldExvY2FsZSwgMCwgZW52LT5OZXdTdHJpbmdVVEYobGFuZykpOwogICAgICAgICBlbnYtPlNldE9iamVjdEFycmF5RWxlbWVudChyZXRMb2NhbGUsIDEsIGVudi0+TmV3U3RyaW5nVVRGKGNvdW50cnkpKTsKICAgICAgICAgZW52LT5TZXRPYmplY3RBcnJheUVsZW1lbnQocmV0TG9jYWxlLCAyLCBlbnYtPk5ld1N0cmluZ1VURih2YXJpYW50KSk7CkBAIC04NjQsOCArOTE3LDkgQEAKICAgICBjaGFyIGJ1ZltidWZTaXplXTsKICAgICBtZW1zZXQoYnVmLCAwLCBidWZTaXplKTsKICAgICAvLyBUT0RPIGNoZWNrIHJldHVybiBjb2RlcwotICAgIGlmIChwU3ludGhEYXRhLT5tTmF0aXZlU3ludGhJbnRlcmZhY2UpIHsKLSAgICAgICAgcFN5bnRoRGF0YS0+bU5hdGl2ZVN5bnRoSW50ZXJmYWNlLT5nZXRQcm9wZXJ0eSgicmF0ZSIsIGJ1ZiwgJmJ1ZlNpemUpOworICAgIGFuZHJvaWRfdHRzX2VuZ2luZV90ICplbmdpbmUgPSBwU3ludGhEYXRhLT5tRW5naW5lOworICAgIGlmIChlbmdpbmUpIHsKKyAgICAgICAgZW5naW5lLT5mdW5jcy0+Z2V0UHJvcGVydHkoZW5naW5lLCJyYXRlIiwgYnVmLCAmYnVmU2l6ZSk7CiAgICAgfQogICAgIHJldHVybiBhdG9pKGJ1Zik7CiB9CmRpZmYgLS1naXQgYS9wb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3BvbGljeS9pbXBsL0xvY2tQYXR0ZXJuS2V5Z3VhcmRWaWV3LmphdmEgYi9wb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3BvbGljeS9pbXBsL0xvY2tQYXR0ZXJuS2V5Z3VhcmRWaWV3LmphdmEKaW5kZXggMjc3MDZlZi4uODY5MzI5NCAxMDA2NDQKLS0tIGEvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9Mb2NrUGF0dGVybktleWd1YXJkVmlldy5qYXZhCisrKyBiL3BvbGljeS9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvcG9saWN5L2ltcGwvTG9ja1BhdHRlcm5LZXlndWFyZFZpZXcuamF2YQpAQCAtNjY3LDYgKzY2Nyw3IEBACiAgICAgICAgICAgICAgICAgY2FzZSBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfTlVNRVJJQzoKICAgICAgICAgICAgICAgICBjYXNlIERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9BTFBIQUJFVElDOgogICAgICAgICAgICAgICAgIGNhc2UgRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX0FMUEhBTlVNRVJJQzoKKyAgICAgICAgICAgICAgICBjYXNlIERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9DT01QTEVYOgogICAgICAgICAgICAgICAgICAgICBjdXJyZW50TW9kZSA9IFVubG9ja01vZGUuUGFzc3dvcmQ7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX1NPTUVUSElORzoKQEAgLTY4Nyw4ICs2ODgsMTcgQEAKIAogICAgIHByaXZhdGUgdm9pZCBzaG93VGltZW91dERpYWxvZygpIHsKICAgICAgICAgaW50IHRpbWVvdXRJblNlY29uZHMgPSAoaW50KSBMb2NrUGF0dGVyblV0aWxzLkZBSUxFRF9BVFRFTVBUX1RJTUVPVVRfTVMgLyAxMDAwOworICAgICAgICBpbnQgbWVzc2FnZUlkID0gUi5zdHJpbmcubG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2U7OworICAgICAgICBpZihnZXRVbmxvY2tNb2RlKCkgPT0gVW5sb2NrTW9kZS5QYXNzd29yZCkgeworICAgICAgICAgICAgaWYobUxvY2tQYXR0ZXJuVXRpbHMuZ2V0S2V5Z3VhcmRTdG9yZWRQYXNzd29yZFF1YWxpdHkoKSA9PQorICAgICAgICAgICAgICAgIERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9OVU1FUklDKSB7CisgICAgICAgICAgICAgICAgbWVzc2FnZUlkID0gUi5zdHJpbmcubG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfcGluX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtZXNzYWdlSWQgPSBSLnN0cmluZy5sb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9wYXNzd29yZF9hdHRlbXB0c19kaWFsb2dfbWVzc2FnZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IG1Db250ZXh0LmdldFN0cmluZygKLSAgICAgICAgICAgICAgICBSLnN0cmluZy5sb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9hdHRlbXB0c19kaWFsb2dfbWVzc2FnZSwKKyAgICAgICAgICAgICAgICBtZXNzYWdlSWQsCiAgICAgICAgICAgICAgICAgbVVwZGF0ZU1vbml0b3IuZ2V0RmFpbGVkQXR0ZW1wdHMoKSwKICAgICAgICAgICAgICAgICB0aW1lb3V0SW5TZWNvbmRzKTsKICAgICAgICAgZmluYWwgQWxlcnREaWFsb2cgZGlhbG9nID0gbmV3IEFsZXJ0RGlhbG9nLkJ1aWxkZXIobUNvbnRleHQpCmRpZmYgLS1naXQgYS9wb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3BvbGljeS9pbXBsL0xvY2tTY3JlZW4uamF2YSBiL3BvbGljeS9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvcG9saWN5L2ltcGwvTG9ja1NjcmVlbi5qYXZhCmluZGV4IGE1ZWYxZmEuLmIzNzA3YjAgMTAwNjQ0Ci0tLSBhL3BvbGljeS9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvcG9saWN5L2ltcGwvTG9ja1NjcmVlbi5qYXZhCisrKyBiL3BvbGljeS9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvcG9saWN5L2ltcGwvTG9ja1NjcmVlbi5qYXZhCkBAIC0yMjAsNyArMjIwLDYgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfSk7CiAKLQogICAgICAgICBzZXRGb2N1c2FibGUodHJ1ZSk7CiAgICAgICAgIHNldEZvY3VzYWJsZUluVG91Y2hNb2RlKHRydWUpOwogICAgICAgICBzZXREZXNjZW5kYW50Rm9jdXNhYmlsaXR5KFZpZXdHcm91cC5GT0NVU19CTE9DS19ERVNDRU5EQU5UUyk7CkBAIC01MTgsNyArNTE3LDcgQEAKICAgICAgICAgICAgICAgICBtU2NyZWVuTG9ja2VkLnNldFRleHQoIiIpOwogCiAgICAgICAgICAgICAgICAgLy8gbGF5b3V0Ci0gICAgICAgICAgICAgICAgbVNjcmVlbkxvY2tlZC5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgICAgICAgICAgICAgbVNjcmVlbkxvY2tlZC5zZXRWaXNpYmlsaXR5KFZpZXcuSU5WSVNJQkxFKTsKICAgICAgICAgICAgICAgICBtU2VsZWN0b3Iuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwogICAgICAgICAgICAgICAgIG1FbWVyZ2VuY3lDYWxsVGV4dC5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC02NTgsNyArNjU3LDYgQEAKICAgICAvKioge0Bpbmhlcml0RG9jfSAqLwogICAgIHB1YmxpYyB2b2lkIG9uUmVzdW1lKCkgewogICAgICAgICByZXNldFN0YXR1c0luZm8obVVwZGF0ZU1vbml0b3IpOwotICAgICAgICBtTG9ja1BhdHRlcm5VdGlscy51cGRhdGVFbWVyZ2VuY3lDYWxsQnV0dG9uU3RhdGUobUVtZXJnZW5jeUNhbGxCdXR0b24pOwogICAgIH0KIAogICAgIC8qKiB7QGluaGVyaXREb2N9ICovCkBAIC02NzYsNiArNjc0LDUgQEAKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBvblBob25lU3RhdGVDaGFuZ2VkKFN0cmluZyBuZXdTdGF0ZSkgewotICAgICAgICBtTG9ja1BhdHRlcm5VdGlscy51cGRhdGVFbWVyZ2VuY3lDYWxsQnV0dG9uU3RhdGUobUVtZXJnZW5jeUNhbGxCdXR0b24pOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3BvbGljeS9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvcG9saWN5L2ltcGwvUGFzc3dvcmRVbmxvY2tTY3JlZW4uamF2YSBiL3BvbGljeS9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvcG9saWN5L2ltcGwvUGFzc3dvcmRVbmxvY2tTY3JlZW4uamF2YQppbmRleCAzOWYyOTE3Li42MGNkNTZjIDEwMDY0NAotLS0gYS9wb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3BvbGljeS9pbXBsL1Bhc3N3b3JkVW5sb2NrU2NyZWVuLmphdmEKKysrIGIvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9QYXNzd29yZFVubG9ja1NjcmVlbi5qYXZhCkBAIC01Myw2ICs1Myw4IEBACiAgICAgcHJpdmF0ZSBmaW5hbCBLZXlndWFyZFVwZGF0ZU1vbml0b3IgbVVwZGF0ZU1vbml0b3I7CiAgICAgcHJpdmF0ZSBmaW5hbCBLZXlndWFyZFNjcmVlbkNhbGxiYWNrIG1DYWxsYmFjazsKIAorICAgIHByaXZhdGUgYm9vbGVhbiBtSXNBbHBoYTsKKwogICAgIHByaXZhdGUgRWRpdFRleHQgbVBhc3N3b3JkRW50cnk7CiAgICAgcHJpdmF0ZSBCdXR0b24gbUVtZXJnZW5jeUNhbGxCdXR0b247CiAgICAgcHJpdmF0ZSBMb2NrUGF0dGVyblV0aWxzIG1Mb2NrUGF0dGVyblV0aWxzOwpAQCAtODcsOCArODksOSBAQAogICAgICAgICB9CiAKICAgICAgICAgZmluYWwgaW50IHF1YWxpdHkgPSBsb2NrUGF0dGVyblV0aWxzLmdldEtleWd1YXJkU3RvcmVkUGFzc3dvcmRRdWFsaXR5KCk7Ci0gICAgICAgIGZpbmFsIGJvb2xlYW4gaXNBbHBoYSA9IERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9BTFBIQUJFVElDID09IHF1YWxpdHkKLSAgICAgICAgICAgICAgICB8fCBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfQUxQSEFOVU1FUklDID09IHF1YWxpdHk7CisgICAgICAgIG1Jc0FscGhhID0gRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX0FMUEhBQkVUSUMgPT0gcXVhbGl0eQorICAgICAgICAgICAgICAgIHx8IERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9BTFBIQU5VTUVSSUMgPT0gcXVhbGl0eQorICAgICAgICAgICAgICAgIHx8IERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9DT01QTEVYID09IHF1YWxpdHk7CiAKICAgICAgICAgbUtleWJvYXJkVmlldyA9IChQYXNzd29yZEVudHJ5S2V5Ym9hcmRWaWV3KSBmaW5kVmlld0J5SWQoUi5pZC5rZXlib2FyZCk7CiAgICAgICAgIG1QYXNzd29yZEVudHJ5ID0gKEVkaXRUZXh0KSBmaW5kVmlld0J5SWQoUi5pZC5wYXNzd29yZEVudHJ5KTsKQEAgLTk5LDcgKzEwMiw3IEBACiAgICAgICAgIG1UaXRsZSA9IChUZXh0VmlldykgZmluZFZpZXdCeUlkKFIuaWQuZW50ZXJfcGFzc3dvcmRfbGFiZWwpOwogCiAgICAgICAgIG1LZXlib2FyZEhlbHBlciA9IG5ldyBQYXNzd29yZEVudHJ5S2V5Ym9hcmRIZWxwZXIoY29udGV4dCwgbUtleWJvYXJkVmlldywgdGhpcyk7Ci0gICAgICAgIG1LZXlib2FyZEhlbHBlci5zZXRLZXlib2FyZE1vZGUoaXNBbHBoYSA/IFBhc3N3b3JkRW50cnlLZXlib2FyZEhlbHBlci5LRVlCT0FSRF9NT0RFX0FMUEhBCisgICAgICAgIG1LZXlib2FyZEhlbHBlci5zZXRLZXlib2FyZE1vZGUobUlzQWxwaGEgPyBQYXNzd29yZEVudHJ5S2V5Ym9hcmRIZWxwZXIuS0VZQk9BUkRfTU9ERV9BTFBIQQogICAgICAgICAgICAgICAgIDogUGFzc3dvcmRFbnRyeUtleWJvYXJkSGVscGVyLktFWUJPQVJEX01PREVfTlVNRVJJQyk7CiAKICAgICAgICAgbUtleWJvYXJkVmlldy5zZXRWaXNpYmlsaXR5KG1DcmVhdGlvbkhhcmRLZXlib2FyZEhpZGRlbiA9PSBDb25maWd1cmF0aW9uLkhBUkRLRVlCT0FSREhJRERFTl9OTwpAQCAtMTA4LDEwICsxMTEsMTEgQEAKIAogICAgICAgICAvLyBUaGlzIGFsbG93cyBrZXlib2FyZHMgd2l0aCBvdmVybGFwcGluZyBxd2VydHkvbnVtZXJpYyBrZXlzIHRvIGNob29zZSBqdXN0IHRoZQogICAgICAgICAvLyBudW1lcmljIGtleXMuCi0gICAgICAgIGlmIChpc0FscGhhKSB7CisgICAgICAgIGlmIChtSXNBbHBoYSkgewogICAgICAgICAgICAgbVBhc3N3b3JkRW50cnkuc2V0S2V5TGlzdGVuZXIoVGV4dEtleUxpc3RlbmVyLmdldEluc3RhbmNlKCkpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgbVBhc3N3b3JkRW50cnkuc2V0S2V5TGlzdGVuZXIoRGlnaXRzS2V5TGlzdGVuZXIuZ2V0SW5zdGFuY2UoKSk7CisgICAgICAgICAgICBtVGl0bGUuc2V0VGV4dChSLnN0cmluZy5rZXlndWFyZF9wYXNzd29yZF9lbnRlcl9waW5fcGFzc3dvcmRfY29kZSk7CiAgICAgICAgIH0KIAogICAgICAgICBtS2V5Ym9hcmRIZWxwZXIuc2V0VmlicmF0ZVBhdHRlcm4obUxvY2tQYXR0ZXJuVXRpbHMuaXNUYWN0aWxlRmVlZGJhY2tFbmFibGVkKCkgPwpAQCAtMTM4LDYgKzE0Miw3IEBACiAgICAgcHVibGljIHZvaWQgb25SZXN1bWUoKSB7CiAgICAgICAgIC8vIHN0YXJ0IGZyZXNoCiAgICAgICAgIG1QYXNzd29yZEVudHJ5LnNldFRleHQoIiIpOworICAgICAgICByZXNldFN0YXR1c0luZm8oKTsKICAgICAgICAgbVBhc3N3b3JkRW50cnkucmVxdWVzdEZvY3VzKCk7CiAgICAgICAgIG1Mb2NrUGF0dGVyblV0aWxzLnVwZGF0ZUVtZXJnZW5jeUNhbGxCdXR0b25TdGF0ZShtRW1lcmdlbmN5Q2FsbEJ1dHRvbik7CiAKQEAgLTE3NCw2ICsxNzksOSBAQAogICAgICAgICAgICAgICAgIGxvbmcgZGVhZGxpbmUgPSBtTG9ja1BhdHRlcm5VdGlscy5zZXRMb2Nrb3V0QXR0ZW1wdERlYWRsaW5lKCk7CiAgICAgICAgICAgICAgICAgaGFuZGxlQXR0ZW1wdExvY2tvdXQoZGVhZGxpbmUpOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgbVRpdGxlLnNldFRleHQoUi5zdHJpbmcubG9ja3NjcmVlbl9wYXNzd29yZF93cm9uZyk7CisgICAgICAgIH0gZWxzZSBpZiAoZW50cnkubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICBtVGl0bGUuc2V0VGV4dChSLnN0cmluZy5sb2Nrc2NyZWVuX3Bhc3N3b3JkX3dyb25nKTsKICAgICAgICAgfQogICAgICAgICBtUGFzc3dvcmRFbnRyeS5zZXRUZXh0KCIiKTsKICAgICB9CkBAIC0xOTcsOCArMjA1LDggQEAKICAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICAgcHVibGljIHZvaWQgb25GaW5pc2goKSB7CiAgICAgICAgICAgICAgICAgbVBhc3N3b3JkRW50cnkuc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICBtVGl0bGUuc2V0VGV4dChSLnN0cmluZy5rZXlndWFyZF9wYXNzd29yZF9lbnRlcl9wYXNzd29yZF9jb2RlKTsKICAgICAgICAgICAgICAgICBtS2V5Ym9hcmRWaWV3LnNldEVuYWJsZWQodHJ1ZSk7CisgICAgICAgICAgICAgICAgcmVzZXRTdGF0dXNJbmZvKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0uc3RhcnQoKTsKICAgICB9CkBAIC0yNjQsNCArMjcyLDEyIEBACiAKICAgICB9CiAKKyAgICBwcml2YXRlIHZvaWQgcmVzZXRTdGF0dXNJbmZvKCkgeworICAgICAgICBpZihtSXNBbHBoYSkgeworICAgICAgICAgICAgbVRpdGxlLnNldFRleHQoUi5zdHJpbmcua2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGFzc3dvcmRfY29kZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtVGl0bGUuc2V0VGV4dChSLnN0cmluZy5rZXlndWFyZF9wYXNzd29yZF9lbnRlcl9waW5fcGFzc3dvcmRfY29kZSk7CisgICAgICAgIH0KKyAgICB9CisKIH0KZGlmZiAtLWdpdCBhL3BvbGljeS9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvcG9saWN5L2ltcGwvUGhvbmVXaW5kb3cuamF2YSBiL3BvbGljeS9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvcG9saWN5L2ltcGwvUGhvbmVXaW5kb3cuamF2YQppbmRleCA1NjQyNTg4Li5lNzUxMWUwIDEwMDY0NAotLS0gYS9wb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3BvbGljeS9pbXBsL1Bob25lV2luZG93LmphdmEKKysrIGIvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9QaG9uZVdpbmRvdy5qYXZhCkBAIC01Myw2ICs1Myw3IEBACiBpbXBvcnQgYW5kcm9pZC51dGlsLkV2ZW50TG9nOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlNwYXJzZUFycmF5OworaW1wb3J0IGFuZHJvaWQudmlldy5BY3Rpb25CYXJWaWV3OwogaW1wb3J0IGFuZHJvaWQudmlldy5HcmF2aXR5OwogaW1wb3J0IGFuZHJvaWQudmlldy5IYXB0aWNGZWVkYmFja0NvbnN0YW50czsKIGltcG9ydCBhbmRyb2lkLnZpZXcuSW5wdXRRdWV1ZTsKQEAgLTExNCw2ICsxMTUsOCBAQAogICAgIHByaXZhdGUgTGF5b3V0SW5mbGF0ZXIgbUxheW91dEluZmxhdGVyOwogCiAgICAgcHJpdmF0ZSBUZXh0VmlldyBtVGl0bGVWaWV3OworICAgIAorICAgIHByaXZhdGUgQWN0aW9uQmFyVmlldyBtQWN0aW9uQmFyOwogCiAgICAgcHJpdmF0ZSBEcmF3YWJsZUZlYXR1cmVTdGF0ZVtdIG1EcmF3YWJsZXM7CiAKQEAgLTI3Niw2ICsyNzksOCBAQAogICAgIHB1YmxpYyB2b2lkIHNldFRpdGxlKENoYXJTZXF1ZW5jZSB0aXRsZSkgewogICAgICAgICBpZiAobVRpdGxlVmlldyAhPSBudWxsKSB7CiAgICAgICAgICAgICBtVGl0bGVWaWV3LnNldFRleHQodGl0bGUpOworICAgICAgICB9IGVsc2UgaWYgKG1BY3Rpb25CYXIgIT0gbnVsbCkgeworICAgICAgICAgICAgbUFjdGlvbkJhci5zZXRUaXRsZSh0aXRsZSk7CiAgICAgICAgIH0KICAgICAgICAgbVRpdGxlID0gdGl0bGU7CiAgICAgfQpAQCAtMzAxLDcgKzMwNiw3IEBACiAgICAgICAgIC8vIEFscmVhZHkgcHJlcGFyZWQgKGlzUHJlcGFyZWQgd2lsbCBiZSByZXNldCB0byBmYWxzZSBsYXRlcikKICAgICAgICAgaWYgKHN0LmlzUHJlcGFyZWQpCiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLQorICAgICAgICAKICAgICAgICAgaWYgKChtUHJlcGFyZWRQYW5lbCAhPSBudWxsKSAmJiAobVByZXBhcmVkUGFuZWwgIT0gc3QpKSB7CiAgICAgICAgICAgICAvLyBBbm90aGVyIFBhbmVsIGlzIHByZXBhcmVkIGFuZCBwb3NzaWJseSBvcGVuLCBzbyBjbG9zZSBpdAogICAgICAgICAgICAgY2xvc2VQYW5lbChtUHJlcGFyZWRQYW5lbCwgZmFsc2UpOwpAQCAtMzE1LDkgKzMyMCwxMSBAQAogCiAgICAgICAgIGlmIChzdC5jcmVhdGVkUGFuZWxWaWV3ID09IG51bGwpIHsKICAgICAgICAgICAgIC8vIEluaXQgdGhlIHBhbmVsIHN0YXRlJ3MgbWVudS0tcmV0dXJuIGZhbHNlIGlmIGluaXQgZmFpbGVkCi0gICAgICAgICAgICBpZiAoc3QubWVudSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFpbml0aWFsaXplUGFuZWxNZW51KHN0KSB8fCAoc3QubWVudSA9PSBudWxsKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICBpZiAoc3QubWVudSA9PSBudWxsIHx8IHN0LnJlZnJlc2hNZW51Q29udGVudCkgeworICAgICAgICAgICAgICAgIGlmIChzdC5tZW51ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFpbml0aWFsaXplUGFuZWxNZW51KHN0KSB8fCAoc3QubWVudSA9PSBudWxsKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIC8vIENhbGwgY2FsbGJhY2ssIGFuZCByZXR1cm4gaWYgaXQgZG9lc24ndCB3YW50IHRvIGRpc3BsYXkgbWVudQogICAgICAgICAgICAgICAgIGlmICgoY2IgPT0gbnVsbCkgfHwgIWNiLm9uQ3JlYXRlUGFuZWxNZW51KHN0LmZlYXR1cmVJZCwgc3QubWVudSkpIHsKQEAgLTMyNiw2ICszMzMsMTIgQEAKIAogICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHN0LnJlZnJlc2hNZW51Q29udGVudCA9IGZhbHNlOworCisgICAgICAgICAgICAgICAgaWYgKG1BY3Rpb25CYXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBtQWN0aW9uQmFyLnNldE1lbnUoc3QubWVudSk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvLyBDYWxsYmFjayBhbmQgcmV0dXJuIGlmIHRoZSBjYWxsYmFjayBkb2VzIG5vdCB3YW50IHRvIHNob3cgdGhlIG1lbnUKQEAgLTM3NCwxMSArMzg3LDkgQEAKICAgICAgICAgICAgICAgICBjbGVhck1lbnVWaWV3cyhzdCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLQogICAgIH0KIAogICAgIHByaXZhdGUgc3RhdGljIHZvaWQgY2xlYXJNZW51Vmlld3MoUGFuZWxGZWF0dXJlU3RhdGUgc3QpIHsKLQogICAgICAgICAvLyBUaGlzIGNhbiBiZSBjYWxsZWQgb24gY29uZmlnIGNoYW5nZXMsIHNvIHdlIHNob3VsZCBtYWtlIHN1cmUKICAgICAgICAgLy8gdGhlIHZpZXdzIHdpbGwgYmUgcmVjb25zdHJ1Y3RlZCBiYXNlZCBvbiB0aGUgbmV3IG9yaWVudGF0aW9uLCBldGMuCiAKQEAgLTU0NSw2ICs1NTYsMjYgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGludmFsaWRhdGVQYW5lbE1lbnUoaW50IGZlYXR1cmVJZCkgeworICAgICAgICBQYW5lbEZlYXR1cmVTdGF0ZSBzdCA9IGdldFBhbmVsU3RhdGUoZmVhdHVyZUlkLCB0cnVlKTsKKyAgICAgICAgaWYgKHN0Lm1lbnUgIT0gbnVsbCkgeworICAgICAgICAgICAgc3QubWVudS5jbGVhcigpOworICAgICAgICB9CisgICAgICAgIHN0LnJlZnJlc2hNZW51Q29udGVudCA9IHRydWU7CisgICAgICAgIHN0LnJlZnJlc2hEZWNvclZpZXcgPSB0cnVlOworICAgICAgICAKKyAgICAgICAgLy8gUHJlcGFyZSB0aGUgb3B0aW9ucyBwYW5lbCBpZiB3ZSBoYXZlIGFuIGFjdGlvbiBiYXIKKyAgICAgICAgaWYgKChmZWF0dXJlSWQgPT0gRkVBVFVSRV9BQ1RJT05fQkFSIHx8IGZlYXR1cmVJZCA9PSBGRUFUVVJFX09QVElPTlNfUEFORUwpCisgICAgICAgICAgICAgICAgJiYgbUFjdGlvbkJhciAhPSBudWxsKSB7CisgICAgICAgICAgICBzdCA9IGdldFBhbmVsU3RhdGUoV2luZG93LkZFQVRVUkVfT1BUSU9OU19QQU5FTCwgZmFsc2UpOworICAgICAgICAgICAgaWYgKHN0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzdC5pc1ByZXBhcmVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgcHJlcGFyZVBhbmVsKHN0LCBudWxsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAKICAgICAvKioKICAgICAgKiBDYWxsZWQgd2hlbiB0aGUgcGFuZWwga2V5IGlzIHB1c2hlZCBkb3duLgogICAgICAqIEBwYXJhbSBmZWF0dXJlSWQgVGhlIGZlYXR1cmUgSUQgb2YgdGhlIHJlbGV2YW50IHBhbmVsIChkZWZhdWx0cyB0byBGRUFUVVJFX09QVElPTlNfUEFORUx9LgpAQCAtMjEwNiw2ICsyMTM3LDkgQEAKIAogICAgICAgICBpZiAoYS5nZXRCb29sZWFuKGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLldpbmRvd193aW5kb3dOb1RpdGxlLCBmYWxzZSkpIHsKICAgICAgICAgICAgIHJlcXVlc3RGZWF0dXJlKEZFQVRVUkVfTk9fVElUTEUpOworICAgICAgICB9IGVsc2UgaWYgKGEuZ2V0Qm9vbGVhbihjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5XaW5kb3dfd2luZG93QWN0aW9uQmFyLCBmYWxzZSkpIHsKKyAgICAgICAgICAgIC8vIERvbid0IGFsbG93IGFuIGFjdGlvbiBiYXIgaWYgdGhlcmUgaXMgbm8gdGl0bGUuCisgICAgICAgICAgICByZXF1ZXN0RmVhdHVyZShGRUFUVVJFX0FDVElPTl9CQVIpOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKGEuZ2V0Qm9vbGVhbihjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5XaW5kb3dfd2luZG93RnVsbHNjcmVlbiwgZmFsc2UpKSB7CkBAIC0yMTg5LDYgKzIyMjMsOCBAQAogICAgICAgICAgICAgLy8gSWYgdGhlIHdpbmRvdyBpcyBmbG9hdGluZywgd2UgbmVlZCBhIGRpYWxvZyBsYXlvdXQKICAgICAgICAgICAgIGlmIChtSXNGbG9hdGluZykgewogICAgICAgICAgICAgICAgIGxheW91dFJlc291cmNlID0gY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5sYXlvdXQuZGlhbG9nX3RpdGxlOworICAgICAgICAgICAgfSBlbHNlIGlmICgoZmVhdHVyZXMgJiAoMSA8PCBGRUFUVVJFX0FDVElPTl9CQVIpKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgbGF5b3V0UmVzb3VyY2UgPSBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmxheW91dC5zY3JlZW5fYWN0aW9uX2JhcjsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgbGF5b3V0UmVzb3VyY2UgPSBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmxheW91dC5zY3JlZW5fdGl0bGU7CiAgICAgICAgICAgICB9CkBAIC0yMjczLDYgKzIzMDksMTEgQEAKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBtVGl0bGVWaWV3LnNldFRleHQobVRpdGxlKTsKICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1BY3Rpb25CYXIgPSAoQWN0aW9uQmFyVmlldykgZmluZFZpZXdCeUlkKGNvbS5hbmRyb2lkLmludGVybmFsLlIuaWQuYWN0aW9uX2Jhcik7CisgICAgICAgICAgICAgICAgaWYgKG1BY3Rpb25CYXIgIT0gbnVsbCAmJiBtQWN0aW9uQmFyLmdldFRpdGxlKCkgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBtQWN0aW9uQmFyLnNldFRpdGxlKG1UaXRsZSk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtMjYyNiw2ICsyNjY3LDggQEAKIAogICAgICAgICBib29sZWFuIHJlZnJlc2hEZWNvclZpZXc7CiAKKyAgICAgICAgYm9vbGVhbiByZWZyZXNoTWVudUNvbnRlbnQ7CisgICAgICAgIAogICAgICAgICBib29sZWFuIHdhc0xhc3RPcGVuOwogICAgICAgICAKICAgICAgICAgYm9vbGVhbiB3YXNMYXN0RXhwYW5kZWQ7CmRpZmYgLS1naXQgYS9wcmVsb2FkZWQtY2xhc3NlcyBiL3ByZWxvYWRlZC1jbGFzc2VzCmluZGV4IGI2MDIwMzkuLjk2ODZmYzkgMTAwNjQ0Ci0tLSBhL3ByZWxvYWRlZC1jbGFzc2VzCisrKyBiL3ByZWxvYWRlZC1jbGFzc2VzCkBAIC01NjMsOCArNTYzLDYgQEAKIGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJWaWV3CiBhbmRyb2lkLndpZGdldC5BcnJheUFkYXB0ZXIKIGFuZHJvaWQud2lkZ2V0LkF1dG9Db21wbGV0ZVRleHRWaWV3Ci1hbmRyb2lkLndpZGdldC5BdXRvQ29tcGxldGVUZXh0VmlldyREcm9wRG93bkl0ZW1DbGlja0xpc3RlbmVyCi1hbmRyb2lkLndpZGdldC5BdXRvQ29tcGxldGVUZXh0VmlldyREcm9wRG93bkxpc3RWaWV3CiBhbmRyb2lkLndpZGdldC5CYXNlQWRhcHRlcgogYW5kcm9pZC53aWRnZXQuQmFzZUV4cGFuZGFibGVMaXN0QWRhcHRlcgogYW5kcm9pZC53aWRnZXQuQ2hlY2tCb3gKQEAgLTU4Miw2ICs1ODAsNyBAQAogYW5kcm9pZC53aWRnZXQuSW1hZ2VWaWV3CiBhbmRyb2lkLndpZGdldC5JbWFnZVZpZXckU2NhbGVUeXBlCiBhbmRyb2lkLndpZGdldC5MaW5lYXJMYXlvdXQKK2FuZHJvaWQud2lkZ2V0Lkxpc3RQb3B1cFdpbmRvdwogYW5kcm9pZC53aWRnZXQuTGlzdFZpZXcKIGFuZHJvaWQud2lkZ2V0Lkxpc3RWaWV3JFNhdmVkU3RhdGUKIGFuZHJvaWQud2lkZ2V0Lk1lZGlhQ29udHJvbGxlcgpAQCAtNjg1LDcgKzY4NCw2IEBACiBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuTWVudUJ1aWxkZXIKIGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcubWVudS5NZW51SXRlbUltcGwKIGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcubWVudS5TdWJNZW51QnVpbGRlcgotY29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0LkNvbnRhY3RIZWFkZXJXaWRnZXQKIGNvbS5hbmRyb2lkLmludGVybmFsLndpZGdldC5EaWFsb2dUaXRsZQogY29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0LkVkaXRhYmxlSW5wdXRDb25uZWN0aW9uCiBjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuTGluZWFyTGF5b3V0V2l0aERlZmF1bHRUb3VjaFJlY2VwaWVudApAQCAtNjk3LDcgKzY5NSw2IEBACiBjb20uaWJtLmljdTRqbmkuY2hhcnNldC5DaGFyc2V0RGVjb2RlcklDVQogY29tLmlibS5pY3U0am5pLmNoYXJzZXQuQ2hhcnNldEVuY29kZXJJQ1UKIGNvbS5pYm0uaWN1NGpuaS5jaGFyc2V0LkNoYXJzZXRJQ1UKLWNvbS5pYm0uaWN1NGpuaS5jaGFyc2V0LkNoYXJzZXRQcm92aWRlcklDVQogY29tLmlibS5pY3U0am5pLmNoYXJzZXQuTmF0aXZlQ29udmVydGVyCiBjb20uaWJtLmljdTRqbmkuY29tbW9uLkVycm9yQ29kZQogY29tLmlibS5pY3U0am5pLmxhbmcuVUNoYXJhY3RlcgpAQCAtNzA3LDkgKzcwNCw2IEBACiBjb20uaWJtLmljdTRqbmkudGV4dC5OYXRpdmVDb2xsYXRpb24KIGNvbS5pYm0uaWN1NGpuaS50ZXh0Lk5hdGl2ZURlY2ltYWxGb3JtYXQKIGNvbS5pYm0uaWN1NGpuaS50ZXh0LlJ1bGVCYXNlZENvbGxhdG9yCi1jb20uaWJtLmljdTRqbmkudGV4dC5SdWxlQmFzZWROdW1iZXJGb3JtYXQKLWNvbS5pYm0uaWN1NGpuaS51dGlsLlJlc291cmNlcwotY29tLmlibS5pY3U0am5pLnV0aWwuUmVzb3VyY2VzJERlZmF1bHRUaW1lWm9uZXMKIGRhbHZpay5zeXN0ZW0uRGFsdmlrTG9nSGFuZGxlcgogZGFsdmlrLnN5c3RlbS5EYWx2aWtMb2dnaW5nCiBkYWx2aWsuc3lzdGVtLk5hdGl2ZVN0YXJ0CkBAIC03MzMsNyArNzI3LDYgQEAKIGphdmEuaW8uRmlsZQogamF2YS5pby5GaWxlRGVzY3JpcHRvcgogamF2YS5pby5GaWxlSW5wdXRTdHJlYW0KLWphdmEuaW8uRmlsZUlucHV0U3RyZWFtJFJlcG9zaXRpb25pbmdMb2NrCiBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbgogamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtCiBqYXZhLmlvLkZpbHRlcklucHV0U3RyZWFtCkBAIC03NTgsNyArNzUxLDYgQEAKIGphdmEuaW8uUHJpbnRXcml0ZXIKIGphdmEuaW8uUHVzaGJhY2tSZWFkZXIKIGphdmEuaW8uUmFuZG9tQWNjZXNzRmlsZQotamF2YS5pby5SYW5kb21BY2Nlc3NGaWxlJFJlcG9zaXRpb25Mb2NrCiBqYXZhLmlvLlJlYWRlcgogamF2YS5pby5TZXJpYWxpemFibGUKIGphdmEuaW8uU3RyZWFtQ29ycnVwdGVkRXhjZXB0aW9uCkBAIC05MzAsNyArOTIyLDYgQEAKIGphdmEuc2VjdXJpdHkuY2VydC5YNTA5Q2VydGlmaWNhdGUKIGphdmEudGV4dC5BdHRyaWJ1dGVkQ2hhcmFjdGVySXRlcmF0b3IkQXR0cmlidXRlCiBqYXZhLnRleHQuQ29sbGF0b3IKLWphdmEudGV4dC5Db2xsYXRvciQxCiBqYXZhLnRleHQuRGF0ZUZvcm1hdAogamF2YS50ZXh0LkRhdGVGb3JtYXQkRmllbGQKIGphdmEudGV4dC5EZWNpbWFsRm9ybWF0CkBAIC0xMTI2LDcgKzExMTcsNiBAQAogb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkudXRpbC5JbnB1dFN0cmVhbUhlbHBlciQxCiBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS51dGlsLklucHV0U3RyZWFtSGVscGVyJEV4cG9zZWRCeXRlQXJyYXlJbnB1dFN0cmVhbQogb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkudXRpbC5Mb2NhbGVDYWNoZQotb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkudXRpbC5Nc2cKIG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLnV0aWwuTnVtYmVyQ29udmVydGVyCiBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS51dGlsLlByaXZpQWN0aW9uCiBvcmcuYXBhY2hlLmhhcm1vbnkubHVuaS51dGlsLlRocmVhZExvY2FsQ2FjaGUKQEAgLTExMzksNyArMTEyOSw2IEBACiBvcmcuYXBhY2hlLmhhcm1vbnkubmlvLkZpbGVDaGFubmVsRmFjdG9yeQogb3JnLmFwYWNoZS5oYXJtb255Lm5pby5pbnRlcm5hbC5EaXJlY3RCdWZmZXIKIG9yZy5hcGFjaGUuaGFybW9ueS5uaW8uaW50ZXJuYWwuRmlsZUNoYW5uZWxJbXBsCi1vcmcuYXBhY2hlLmhhcm1vbnkubmlvLmludGVybmFsLkZpbGVDaGFubmVsSW1wbCRSZXBvc2l0aW9uaW5nTG9jawogb3JnLmFwYWNoZS5oYXJtb255Lm5pby5pbnRlcm5hbC5GaWxlTG9ja0ltcGwKIG9yZy5hcGFjaGUuaGFybW9ueS5uaW8uaW50ZXJuYWwuTG9ja01hbmFnZXIKIG9yZy5hcGFjaGUuaGFybW9ueS5uaW8uaW50ZXJuYWwuTG9ja01hbmFnZXIkMQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvQWNjZXNzaWJpbGl0eU1hbmFnZXJTZXJ2aWNlLmphdmEgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9BY2Nlc3NpYmlsaXR5TWFuYWdlclNlcnZpY2UuamF2YQppbmRleCA4N2RlNzlhLi44M2NlM2UzIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9BY2Nlc3NpYmlsaXR5TWFuYWdlclNlcnZpY2UuamF2YQorKysgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9BY2Nlc3NpYmlsaXR5TWFuYWdlclNlcnZpY2UuamF2YQpAQCAtMjY5LDE0ICsyNjksMTAgQEAKICAgICAgICAgICAgIH0pOwogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIGFkZENsaWVudChJQWNjZXNzaWJpbGl0eU1hbmFnZXJDbGllbnQgY2xpZW50KSB7CisgICAgcHVibGljIGJvb2xlYW4gYWRkQ2xpZW50KElBY2Nlc3NpYmlsaXR5TWFuYWdlckNsaWVudCBjbGllbnQpIHsKICAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBjbGllbnQuc2V0RW5hYmxlZChtSXNFbmFibGVkKTsKLSAgICAgICAgICAgICAgICBtQ2xpZW50cy5hZGQoY2xpZW50KTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiByZSkgewotICAgICAgICAgICAgICAgIFNsb2cudyhMT0dfVEFHLCAiRGVhZCBBY2Nlc3NpYmlsaXR5TWFuYWdlckNsaWVudDogIiArIGNsaWVudCwgcmUpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgbUNsaWVudHMuYWRkKGNsaWVudCk7CisgICAgICAgICAgICByZXR1cm4gbUlzRW5hYmxlZDsKICAgICAgICAgfQogICAgIH0KIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvQ29ubmVjdGl2aXR5U2VydmljZS5qYXZhIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvQ29ubmVjdGl2aXR5U2VydmljZS5qYXZhCmluZGV4IDgxYjhkNDAuLjlmZjdkZTYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0Nvbm5lY3Rpdml0eVNlcnZpY2UuamF2YQorKysgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9Db25uZWN0aXZpdHlTZXJ2aWNlLmphdmEKQEAgLTI4LDExICsyOCwxMyBAQAogaW1wb3J0IGFuZHJvaWQubmV0Lk5ldHdvcmtJbmZvOwogaW1wb3J0IGFuZHJvaWQubmV0Lk5ldHdvcmtTdGF0ZVRyYWNrZXI7CiBpbXBvcnQgYW5kcm9pZC5uZXQud2lmaS5XaWZpU3RhdGVUcmFja2VyOworaW1wb3J0IGFuZHJvaWQubmV0Lk5ldHdvcmtVdGlsczsKIGltcG9ydCBhbmRyb2lkLm9zLkJpbmRlcjsKIGltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOwogaW1wb3J0IGFuZHJvaWQub3MuTG9vcGVyOwogaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKK2ltcG9ydCBhbmRyb2lkLm9zLlBvd2VyTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKIGltcG9ydCBhbmRyb2lkLm9zLlNlcnZpY2VNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtUHJvcGVydGllczsKQEAgLTQ2LDYgKzQ4LDggQEAKIGltcG9ydCBjb20uYW5kcm9pZC5zZXJ2ZXIuY29ubmVjdGl2aXR5LlRldGhlcmluZzsKIAogaW1wb3J0IGphdmEuaW8uRmlsZURlc2NyaXB0b3I7CitpbXBvcnQgamF2YS5pby5GaWxlV3JpdGVyOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwpAQCAtNjQsNyArNjgsNiBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBORVRXT1JLX1JFU1RPUkVfREVMQVlfUFJPUF9OQU1FID0KICAgICAgICAgICAgICJhbmRyb2lkLnRlbGVwaG9ueS5hcG4tcmVzdG9yZSI7CiAKLQogICAgIHByaXZhdGUgVGV0aGVyaW5nIG1UZXRoZXJpbmc7CiAgICAgcHJpdmF0ZSBib29sZWFuIG1UZXRoZXJpbmdDb25maWdWYWxpZCA9IGZhbHNlOwogCkBAIC0xMDQsNiArMTA3LDExIEBACiAgICAgcHJpdmF0ZSBib29sZWFuIG1TeXN0ZW1SZWFkeTsKICAgICBwcml2YXRlIEludGVudCBtSW5pdGlhbEJyb2FkY2FzdDsKIAorICAgIHByaXZhdGUgUG93ZXJNYW5hZ2VyLldha2VMb2NrIG1OZXRUcmFuc2l0aW9uV2FrZUxvY2s7CisgICAgcHJpdmF0ZSBTdHJpbmcgbU5ldFRyYW5zaXRpb25XYWtlTG9ja0NhdXNlZEJ5ID0gIiI7CisgICAgcHJpdmF0ZSBpbnQgbU5ldFRyYW5zaXRpb25XYWtlTG9ja1NlcmlhbE51bWJlcjsKKyAgICBwcml2YXRlIGludCBtTmV0VHJhbnNpdGlvbldha2VMb2NrVGltZW91dDsKKwogICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIE5ldHdvcmtBdHRyaWJ1dGVzIHsKICAgICAgICAgLyoqCiAgICAgICAgICAqIENsYXNzIGZvciBob2xkaW5nIHNldHRpbmdzIHJlYWQgZnJvbSByZXNvdXJjZXMuCkBAIC0xOTQsNiArMjAyLDEyIEBACiAgICAgICAgIH0KIAogICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7CisKKyAgICAgICAgUG93ZXJNYW5hZ2VyIHBvd2VyTWFuYWdlciA9IChQb3dlck1hbmFnZXIpbUNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LlBPV0VSX1NFUlZJQ0UpOworICAgICAgICBtTmV0VHJhbnNpdGlvbldha2VMb2NrID0gcG93ZXJNYW5hZ2VyLm5ld1dha2VMb2NrKFBvd2VyTWFuYWdlci5QQVJUSUFMX1dBS0VfTE9DSywgVEFHKTsKKyAgICAgICAgbU5ldFRyYW5zaXRpb25XYWtlTG9ja1RpbWVvdXQgPSBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRJbnRlZ2VyKAorICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuaW50ZWdlci5jb25maWdfbmV0d29ya1RyYW5zaXRpb25UaW1lb3V0KTsKKwogICAgICAgICBtTmV0VHJhY2tlcnMgPSBuZXcgTmV0d29ya1N0YXRlVHJhY2tlclsKICAgICAgICAgICAgICAgICBDb25uZWN0aXZpdHlNYW5hZ2VyLk1BWF9ORVRXT1JLX1RZUEUrMV07CiAgICAgICAgIG1IYW5kbGVyID0gbmV3IE15SGFuZGxlcigpOwpAQCAtNTk3LDE1ICs2MTEsNyBAQAogICAgICAgICAgICAgICAgIG5ldHdvcmsucmVjb25uZWN0KCk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIFBob25lLkFQTl9SRVFVRVNUX1NUQVJURUQ7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCh0aGlzKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1GZWF0dXJlVXNlcnMuYWRkKGYpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtSGFuZGxlci5zZW5kTWVzc2FnZURlbGF5ZWQobUhhbmRsZXIub2J0YWluTWVzc2FnZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIE5ldHdvcmtTdGF0ZVRyYWNrZXIuRVZFTlRfUkVTVE9SRV9ERUZBVUxUX05FVFdPUkssCi0gICAgICAgICAgICAgICAgICAgICAgICBmKSwgZ2V0UmVzdG9yZURlZmF1bHROZXR3b3JrRGVsYXkoKSk7Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gbmV0d29yay5zdGFydFVzaW5nTmV0d29ya0ZlYXR1cmUoZmVhdHVyZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGdldENhbGxpbmdQaWQoKSwgZ2V0Q2FsbGluZ1VpZCgpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIFBob25lLkFQTl9UWVBFX05PVF9BVkFJTEFCTEU7CkBAIC03MjQsOCArNzMwLDcgQEAKICAgICAgICAgICAgIHRyYWNrZXIudGVhcmRvd24oKTsKICAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gZG8gaXQgdGhlIG9sZCBmYXNoaW9uZWQgd2F5Ci0gICAgICAgICAgICByZXR1cm4gdHJhY2tlci5zdG9wVXNpbmdOZXR3b3JrRmVhdHVyZShmZWF0dXJlLCBwaWQsIHVpZCk7CisgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTc1Miw3ICs3NTcsMzIgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJhY2tlci5yZXF1ZXN0Um91dGVUb0hvc3QoaG9zdEFkZHJlc3MpOworICAgICAgICByZXR1cm4gYWRkSG9zdFJvdXRlKHRyYWNrZXIsIGhvc3RBZGRyZXNzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbnN1cmUgdGhhdCBhIG5ldHdvcmsgcm91dGUgZXhpc3RzIHRvIGRlbGl2ZXIgdHJhZmZpYyB0byB0aGUgc3BlY2lmaWVkCisgICAgICogaG9zdCB2aWEgdGhlIG1vYmlsZSBkYXRhIG5ldHdvcmsuCisgICAgICogQHBhcmFtIGhvc3RBZGRyZXNzIHRoZSBJUCBhZGRyZXNzIG9mIHRoZSBob3N0IHRvIHdoaWNoIHRoZSByb3V0ZSBpcyBkZXNpcmVkLAorICAgICAqIGluIG5ldHdvcmsgYnl0ZSBvcmRlci4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBvbiBzdWNjZXNzLCB7QGNvZGUgZmFsc2V9IG9uIGZhaWx1cmUKKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gYWRkSG9zdFJvdXRlKE5ldHdvcmtTdGF0ZVRyYWNrZXIgbnQsIGludCBob3N0QWRkcmVzcykgeworICAgICAgICBpZiAobnQuZ2V0TmV0d29ya0luZm8oKS5nZXRUeXBlKCkgPT0gQ29ubmVjdGl2aXR5TWFuYWdlci5UWVBFX1dJRkkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyBpbnRlcmZhY2VOYW1lID0gbnQuZ2V0SW50ZXJmYWNlTmFtZSgpOworCisgICAgICAgIGlmIChEQkcpIHsKKyAgICAgICAgICAgIFNsb2cuZChUQUcsICJSZXF1ZXN0ZWQgaG9zdCByb3V0ZSB0byAiICsgSW50ZWdlci50b0hleFN0cmluZyhob3N0QWRkcmVzcykgKworICAgICAgICAgICAgICAgICAgICAgIigiICsgaW50ZXJmYWNlTmFtZSArICIpIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGludGVyZmFjZU5hbWUgIT0gbnVsbCAmJiBob3N0QWRkcmVzcyAhPSAtMSkgeworICAgICAgICAgICAgcmV0dXJuIE5ldHdvcmtVdGlscy5hZGRIb3N0Um91dGUoaW50ZXJmYWNlTmFtZSwgaG9zdEFkZHJlc3MpID09IDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKQEAgLTg1OSw2ICs4ODksMTIgQEAKICAgICAgICAgICAgICAgICAiQ29ubmVjdGl2aXR5U2VydmljZSIpOwogICAgIH0KIAorICAgIHByaXZhdGUgdm9pZCBlbmZvcmNlQ29ubmVjdGl2aXR5SW50ZXJuYWxQZXJtaXNzaW9uKCkgeworICAgICAgICBtQ29udGV4dC5lbmZvcmNlQ2FsbGluZ09yU2VsZlBlcm1pc3Npb24oCisgICAgICAgICAgICAgICAgYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkNPTk5FQ1RJVklUWV9JTlRFUk5BTCwKKyAgICAgICAgICAgICAgICAiQ29ubmVjdGl2aXR5U2VydmljZSIpOworICAgIH0KKwogICAgIC8qKgogICAgICAqIEhhbmRsZSBhIHtAY29kZSBESVNDT05ORUNURUR9IGV2ZW50LiBJZiB0aGlzIHBlcnRhaW5zIHRvIHRoZSBub24tYWN0aXZlCiAgICAgICogbmV0d29yaywgd2UgaWdub3JlIGl0LiBJZiBpdCBpcyBmb3IgdGhlIGFjdGl2ZSBuZXR3b3JrLCB3ZSBzZW5kIG91dCBhCkBAIC0xMTM0LDE1ICsxMTcwLDIzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICBTbG9nLmUoVEFHLCAiTmV0d29yayBkZWNsaW5lZCB0ZWFyZG93biByZXF1ZXN0Iik7CiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGlzRmFpbG92ZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyTmV0LnJlbGVhc2VXYWtlTG9jaygpOwotICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgc3luY2hyb25pemVkIChDb25uZWN0aXZpdHlTZXJ2aWNlLnRoaXMpIHsKKyAgICAgICAgICAgICAgICAvLyBoYXZlIGEgbmV3IGRlZmF1bHQgbmV0d29yaywgcmVsZWFzZSB0aGUgdHJhbnNpdGlvbiB3YWtlbG9jayBpbiBhIHNlY29uZAorICAgICAgICAgICAgICAgIC8vIGlmIGl0J3MgaGVsZC4gIFRoZSBzZWNvbmQgcGF1c2UgaXMgdG8gYWxsb3cgYXBwcyB0byByZWNvbm5lY3Qgb3ZlciB0aGUKKyAgICAgICAgICAgICAgICAvLyBuZXcgbmV0d29yaworICAgICAgICAgICAgICAgIGlmIChtTmV0VHJhbnNpdGlvbldha2VMb2NrLmlzSGVsZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIG1IYW5kbGVyLnNlbmRNZXNzYWdlRGVsYXllZChtSGFuZGxlci5vYnRhaW5NZXNzYWdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5ldHdvcmtTdGF0ZVRyYWNrZXIuRVZFTlRfQ0xFQVJfTkVUX1RSQU5TSVRJT05fV0FLRUxPQ0ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU5ldFRyYW5zaXRpb25XYWtlTG9ja1NlcmlhbE51bWJlciwgMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAwMCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgbUFjdGl2ZURlZmF1bHROZXR3b3JrID0gdHlwZTsKICAgICAgICAgfQogICAgICAgICB0aGlzTmV0LnNldFRlYXJkb3duUmVxdWVzdGVkKGZhbHNlKTsKLSAgICAgICAgdGhpc05ldC51cGRhdGVOZXR3b3JrU2V0dGluZ3MoKTsKKyAgICAgICAgdXBkYXRlTmV0d29ya1NldHRpbmdzKHRoaXNOZXQpOwogICAgICAgICBoYW5kbGVDb25uZWN0aXZpdHlDaGFuZ2UoKTsKICAgICAgICAgc2VuZENvbm5lY3RlZEJyb2FkY2FzdChpbmZvKTsKICAgICB9CkBAIC0xMTkyLDIwICsxMjM2LDE4NSBAQAogICAgICAgICBmb3IgKGludCBuZXRUeXBlIDogbVByaW9yaXR5TGlzdCkgewogICAgICAgICAgICAgaWYgKG1OZXRUcmFja2Vyc1tuZXRUeXBlXS5nZXROZXR3b3JrSW5mbygpLmlzQ29ubmVjdGVkKCkpIHsKICAgICAgICAgICAgICAgICBpZiAobU5ldEF0dHJpYnV0ZXNbbmV0VHlwZV0uaXNEZWZhdWx0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbU5ldFRyYWNrZXJzW25ldFR5cGVdLmFkZERlZmF1bHRSb3V0ZSgpOworICAgICAgICAgICAgICAgICAgICBhZGREZWZhdWx0Um91dGUobU5ldFRyYWNrZXJzW25ldFR5cGVdKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBtTmV0VHJhY2tlcnNbbmV0VHlwZV0uYWRkUHJpdmF0ZURuc1JvdXRlcygpOworICAgICAgICAgICAgICAgICAgICBhZGRQcml2YXRlRG5zUm91dGVzKG1OZXRUcmFja2Vyc1tuZXRUeXBlXSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBpZiAobU5ldEF0dHJpYnV0ZXNbbmV0VHlwZV0uaXNEZWZhdWx0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbU5ldFRyYWNrZXJzW25ldFR5cGVdLnJlbW92ZURlZmF1bHRSb3V0ZSgpOworICAgICAgICAgICAgICAgICAgICByZW1vdmVEZWZhdWx0Um91dGUobU5ldFRyYWNrZXJzW25ldFR5cGVdKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBtTmV0VHJhY2tlcnNbbmV0VHlwZV0ucmVtb3ZlUHJpdmF0ZURuc1JvdXRlcygpOworICAgICAgICAgICAgICAgICAgICByZW1vdmVQcml2YXRlRG5zUm91dGVzKG1OZXRUcmFja2Vyc1tuZXRUeXBlXSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCisgICAgcHJpdmF0ZSB2b2lkIGFkZFByaXZhdGVEbnNSb3V0ZXMoTmV0d29ya1N0YXRlVHJhY2tlciBudCkgeworICAgICAgICBTdHJpbmcgaW50ZXJmYWNlTmFtZSA9IG50LmdldEludGVyZmFjZU5hbWUoKTsKKyAgICAgICAgYm9vbGVhbiBwcml2YXRlRG5zUm91dGVTZXQgPSBudC5pc1ByaXZhdGVEbnNSb3V0ZVNldCgpOworCisgICAgICAgIGlmIChEQkcpIHsKKyAgICAgICAgICAgIFNsb2cuZChUQUcsICJhZGRQcml2YXRlRG5zUm91dGVzIGZvciAiICsgbnQgKworICAgICAgICAgICAgICAgICAgICAiKCIgKyBpbnRlcmZhY2VOYW1lICsgIikgLSBtUHJpdmF0ZURuc1JvdXRlU2V0ID0gIiArIHByaXZhdGVEbnNSb3V0ZVNldCk7CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nW10gZG5zTGlzdCA9IGdldE5hbWVTZXJ2ZXJMaXN0KG50LmdldERuc1Byb3BOYW1lcygpKTsKKyAgICAgICAgaWYgKGludGVyZmFjZU5hbWUgIT0gbnVsbCAmJiAhcHJpdmF0ZURuc1JvdXRlU2V0KSB7CisgICAgICAgICAgICBmb3IgKFN0cmluZyBhZGRyU3RyaW5nIDogZG5zTGlzdCkgeworICAgICAgICAgICAgICAgIGludCBhZGRyID0gTmV0d29ya1V0aWxzLmxvb2t1cEhvc3QoYWRkclN0cmluZyk7CisgICAgICAgICAgICAgICAgaWYgKGFkZHIgIT0gLTEgJiYgYWRkciAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChEQkcpIFNsb2cuZChUQUcsICIgIGFkZGluZyAiK2FkZHJTdHJpbmcrIiAoIithZGRyKyIpIik7CisgICAgICAgICAgICAgICAgICAgIE5ldHdvcmtVdGlscy5hZGRIb3N0Um91dGUoaW50ZXJmYWNlTmFtZSwgYWRkcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbnQucHJpdmF0ZURuc1JvdXRlU2V0KHRydWUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHJlbW92ZVByaXZhdGVEbnNSb3V0ZXMoTmV0d29ya1N0YXRlVHJhY2tlciBudCkgeworICAgICAgICAvLyBUT0RPIC0gd2Ugc2hvdWxkIGRvIHRoaXMgZXhwbGljaXRseSBidXQgdGhlIE5ldFV0aWxzIGFwaSBkb2VzbnQKKyAgICAgICAgLy8gc3VwcG9ydCB0aGlzIHlldCAtIG11c3QgcmVtb3ZlIGFsbC4gIE5vIHdvcnNlIHRoYW4gYmVmb3JlCisgICAgICAgIFN0cmluZyBpbnRlcmZhY2VOYW1lID0gbnQuZ2V0SW50ZXJmYWNlTmFtZSgpOworICAgICAgICBib29sZWFuIHByaXZhdGVEbnNSb3V0ZVNldCA9IG50LmlzUHJpdmF0ZURuc1JvdXRlU2V0KCk7CisgICAgICAgIGlmIChpbnRlcmZhY2VOYW1lICE9IG51bGwgJiYgcHJpdmF0ZURuc1JvdXRlU2V0KSB7CisgICAgICAgICAgICBpZiAoREJHKSB7CisgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgInJlbW92ZVByaXZhdGVEbnNSb3V0ZXMgZm9yICIgKyBudC5nZXROZXR3b3JrSW5mbygpLmdldFR5cGVOYW1lKCkgKworICAgICAgICAgICAgICAgICAgICAgICAgIiAoIiArIGludGVyZmFjZU5hbWUgKyAiKSIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgTmV0d29ya1V0aWxzLnJlbW92ZUhvc3RSb3V0ZXMoaW50ZXJmYWNlTmFtZSk7CisgICAgICAgICAgICBudC5wcml2YXRlRG5zUm91dGVTZXQoZmFsc2UpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBJUCBhZGRyZXNzZXMgb2YgdGhlIEROUyBzZXJ2ZXJzIGF2YWlsYWJsZSBmb3IgdGhpcworICAgICAqIG5ldHdvcmsgaW50ZXJmYWNlLgorICAgICAqIEBwYXJhbSBwcm9wZXJ0eU5hbWVzIHRoZSBuYW1lcyBvZiB0aGUgc3lzdGVtIHByb3BlcnRpZXMgd2hvc2UgdmFsdWVzCisgICAgICogZ2l2ZSB0aGUgSVAgYWRkcmVzc2VzLiBQcm9wZXJ0aWVzIHdpdGggbm8gdmFsdWVzIGFyZSBza2lwcGVkLgorICAgICAqIEByZXR1cm4gYW4gYXJyYXkgb2Yge0Bjb2RlIFN0cmluZ31zIGNvbnRhaW5pbmcgdGhlIElQIGFkZHJlc3NlcworICAgICAqIG9mIHRoZSBETlMgc2VydmVycywgaW4gZG90LW5vdGF0aW9uLiBUaGlzIG1heSBoYXZlIGZld2VyCisgICAgICogbm9uLW51bGwgZW50cmllcyB0aGFuIHRoZSBsaXN0IG9mIG5hbWVzIHBhc3NlZCBpbiwgc2luY2UKKyAgICAgKiBzb21lIG9mIHRoZSBwYXNzZWQtaW4gbmFtZXMgbWF5IGhhdmUgZW1wdHkgdmFsdWVzLgorICAgICAqLworICAgIFN0cmluZ1tdIGdldE5hbWVTZXJ2ZXJMaXN0KFN0cmluZ1tdIHByb3BlcnR5TmFtZXMpIHsKKyAgICAgICAgU3RyaW5nW10gZG5zQWRkcmVzc2VzID0gbmV3IFN0cmluZ1twcm9wZXJ0eU5hbWVzLmxlbmd0aF07CisgICAgICAgIGludCBpLCBqOworCisgICAgICAgIGZvciAoaSA9IDAsIGogPSAwOyBpIDwgcHJvcGVydHlOYW1lcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gU3lzdGVtUHJvcGVydGllcy5nZXQocHJvcGVydHlOYW1lc1tpXSk7CisgICAgICAgICAgICAvLyBUaGUgR1NNIGxheWVyIHNvbWV0aW1lcyBzZXRzIGEgYm9ndXMgRE5TIHNlcnZlciBhZGRyZXNzIG9mCisgICAgICAgICAgICAvLyAwLjAuMC4wCisgICAgICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KHZhbHVlKSAmJiAhVGV4dFV0aWxzLmVxdWFscyh2YWx1ZSwgIjAuMC4wLjAiKSkgeworICAgICAgICAgICAgICAgIGRuc0FkZHJlc3Nlc1tqKytdID0gdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGRuc0FkZHJlc3NlczsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYWRkRGVmYXVsdFJvdXRlKE5ldHdvcmtTdGF0ZVRyYWNrZXIgbnQpIHsKKyAgICAgICAgU3RyaW5nIGludGVyZmFjZU5hbWUgPSBudC5nZXRJbnRlcmZhY2VOYW1lKCk7CisgICAgICAgIGludCBkZWZhdWx0R2F0ZXdheUFkZHIgPSBudC5nZXREZWZhdWx0R2F0ZXdheUFkZHIoKTsKKyAgICAgICAgYm9vbGVhbiBkZWZhdWx0Um91dGVTZXQgPSBudC5pc0RlZmF1bHRSb3V0ZVNldCgpOworICAgICAgICBOZXR3b3JrSW5mbyBuZXR3b3JrSW5mbyA9IG50LmdldE5ldHdvcmtJbmZvKCk7CisKKyAgICAgICAgaWYgKChpbnRlcmZhY2VOYW1lICE9IG51bGwpICYmIChkZWZhdWx0R2F0ZXdheUFkZHIgIT0gMCkgJiYKKyAgICAgICAgICAgICAgICBkZWZhdWx0Um91dGVTZXQgPT0gZmFsc2UpIHsKKyAgICAgICAgICAgIGlmIChEQkcpIHsKKyAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAiYWRkRGVmYXVsdFJvdXRlIGZvciAiICsgbmV0d29ya0luZm8uZ2V0VHlwZU5hbWUoKSArCisgICAgICAgICAgICAgICAgICAgICAgICAiICgiICsgaW50ZXJmYWNlTmFtZSArICIpLCBHYXRld2F5QWRkcj0iICsgZGVmYXVsdEdhdGV3YXlBZGRyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIE5ldHdvcmtVdGlscy5zZXREZWZhdWx0Um91dGUoaW50ZXJmYWNlTmFtZSwgZGVmYXVsdEdhdGV3YXlBZGRyKTsKKyAgICAgICAgICAgIG50LmRlZmF1bHRSb3V0ZVNldCh0cnVlKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgcHVibGljIHZvaWQgcmVtb3ZlRGVmYXVsdFJvdXRlKE5ldHdvcmtTdGF0ZVRyYWNrZXIgbnQpIHsKKyAgICAgICAgU3RyaW5nIGludGVyZmFjZU5hbWUgPSBudC5nZXRJbnRlcmZhY2VOYW1lKCk7CisgICAgICAgIGJvb2xlYW4gZGVmYXVsdFJvdXRlU2V0ID0gbnQuaXNEZWZhdWx0Um91dGVTZXQoKTsKKyAgICAgICAgTmV0d29ya0luZm8gbmV0d29ya0luZm8gPSBudC5nZXROZXR3b3JrSW5mbygpOworCisgICAgICAgIGlmIChpbnRlcmZhY2VOYW1lICE9IG51bGwgJiYgZGVmYXVsdFJvdXRlU2V0ID09IHRydWUpIHsKKyAgICAgICAgICAgIGlmIChEQkcpIHsKKyAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAicmVtb3ZlRGVmYXVsdFJvdXRlIGZvciAiICsgbmV0d29ya0luZm8uZ2V0VHlwZU5hbWUoKSArICIgKCIgKworICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlTmFtZSArICIpIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBOZXR3b3JrVXRpbHMucmVtb3ZlRGVmYXVsdFJvdXRlKGludGVyZmFjZU5hbWUpOworICAgICAgICAgICAgbnQuZGVmYXVsdFJvdXRlU2V0KGZhbHNlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgLyoqCisgICAgICogUmVhZHMgdGhlIG5ldHdvcmsgc3BlY2lmaWMgVENQIGJ1ZmZlciBzaXplcyBmcm9tIFN5c3RlbVByb3BlcnRpZXMKKyAgICAgKiBuZXQudGNwLmJ1ZmZlcnNpemUuW2RlZmF1bHR8d2lmaXx1bXRzfGVkZ2V8Z3Byc10gYW5kIHNldCB0aGVtIGZvciBzeXN0ZW0KKyAgICAgKiB3aWRlIHVzZQorICAgICAqLworICAgcHVibGljIHZvaWQgdXBkYXRlTmV0d29ya1NldHRpbmdzKE5ldHdvcmtTdGF0ZVRyYWNrZXIgbnQpIHsKKyAgICAgICAgU3RyaW5nIGtleSA9IG50LmdldFRjcEJ1ZmZlclNpemVzUHJvcE5hbWUoKTsKKyAgICAgICAgU3RyaW5nIGJ1ZmZlclNpemVzID0gU3lzdGVtUHJvcGVydGllcy5nZXQoa2V5KTsKKworICAgICAgICBpZiAoYnVmZmVyU2l6ZXMubGVuZ3RoKCkgPT0gMCkgeworICAgICAgICAgICAgU2xvZy5lKFRBRywga2V5ICsgIiBub3QgZm91bmQgaW4gc3lzdGVtIHByb3BlcnRpZXMuIFVzaW5nIGRlZmF1bHRzIik7CisKKyAgICAgICAgICAgIC8vIFNldHRpbmcgdG8gZGVmYXVsdCB2YWx1ZXMgc28gd2Ugd29uJ3QgYmUgc3R1Y2sgdG8gcHJldmlvdXMgdmFsdWVzCisgICAgICAgICAgICBrZXkgPSAibmV0LnRjcC5idWZmZXJzaXplLmRlZmF1bHQiOworICAgICAgICAgICAgYnVmZmVyU2l6ZXMgPSBTeXN0ZW1Qcm9wZXJ0aWVzLmdldChrZXkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gU2V0IHZhbHVlcyBpbiBrZXJuZWwKKyAgICAgICAgaWYgKGJ1ZmZlclNpemVzLmxlbmd0aCgpICE9IDApIHsKKyAgICAgICAgICAgIGlmIChEQkcpIHsKKyAgICAgICAgICAgICAgICBTbG9nLnYoVEFHLCAiU2V0dGluZyBUQ1AgdmFsdWVzOiBbIiArIGJ1ZmZlclNpemVzCisgICAgICAgICAgICAgICAgICAgICAgICArICJdIHdoaWNoIGNvbWVzIGZyb20gWyIgKyBrZXkgKyAiXSIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0QnVmZmVyU2l6ZShidWZmZXJTaXplcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgIC8qKgorICAgICAqIFdyaXRlcyBUQ1AgYnVmZmVyIHNpemVzIHRvIC9zeXMva2VybmVsL2lwdjQvdGNwX1tyL3ddbWVtX1ttaW4vZGVmL21heF0KKyAgICAgKiB3aGljaCBtYXBzIHRvIC9wcm9jL3N5cy9uZXQvaXB2NC90Y3Bfcm1lbSBhbmQgdGNwd21lbQorICAgICAqCisgICAgICogQHBhcmFtIGJ1ZmZlclNpemVzIGluIHRoZSBmb3JtYXQgb2YgInJlYWRNaW4sIHJlYWRJbml0aWFsLCByZWFkTWF4LAorICAgICAqICAgICAgICB3cml0ZU1pbiwgd3JpdGVJbml0aWFsLCB3cml0ZU1heCIKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgc2V0QnVmZmVyU2l6ZShTdHJpbmcgYnVmZmVyU2l6ZXMpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFN0cmluZ1tdIHZhbHVlcyA9IGJ1ZmZlclNpemVzLnNwbGl0KCIsIik7CisKKyAgICAgICAgICAgIGlmICh2YWx1ZXMubGVuZ3RoID09IDYpIHsKKyAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHByZWZpeCA9ICIvc3lzL2tlcm5lbC9pcHY0L3RjcF8iOworICAgICAgICAgICAgICAgIHN0cmluZ1RvRmlsZShwcmVmaXggKyAicm1lbV9taW4iLCB2YWx1ZXNbMF0pOworICAgICAgICAgICAgICAgIHN0cmluZ1RvRmlsZShwcmVmaXggKyAicm1lbV9kZWYiLCB2YWx1ZXNbMV0pOworICAgICAgICAgICAgICAgIHN0cmluZ1RvRmlsZShwcmVmaXggKyAicm1lbV9tYXgiLCB2YWx1ZXNbMl0pOworICAgICAgICAgICAgICAgIHN0cmluZ1RvRmlsZShwcmVmaXggKyAid21lbV9taW4iLCB2YWx1ZXNbM10pOworICAgICAgICAgICAgICAgIHN0cmluZ1RvRmlsZShwcmVmaXggKyAid21lbV9kZWYiLCB2YWx1ZXNbNF0pOworICAgICAgICAgICAgICAgIHN0cmluZ1RvRmlsZShwcmVmaXggKyAid21lbV9tYXgiLCB2YWx1ZXNbNV0pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBTbG9nLmUoVEFHLCAiSW52YWxpZCBidWZmZXJzaXplIHN0cmluZzogIiArIGJ1ZmZlclNpemVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgU2xvZy5lKFRBRywgIkNhbid0IHNldCB0Y3AgYnVmZmVyIHNpemVzOiIgKyBlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgLyoqCisgICAgICogV3JpdGVzIHN0cmluZyB0byBmaWxlLiBCYXNpY2FsbHkgc2FtZSBhcyAiZWNobyAtbiAkc3RyaW5nID4gJGZpbGVuYW1lIgorICAgICAqCisgICAgICogQHBhcmFtIGZpbGVuYW1lCisgICAgICogQHBhcmFtIHN0cmluZworICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgc3RyaW5nVG9GaWxlKFN0cmluZyBmaWxlbmFtZSwgU3RyaW5nIHN0cmluZykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgRmlsZVdyaXRlciBvdXQgPSBuZXcgRmlsZVdyaXRlcihmaWxlbmFtZSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBvdXQud3JpdGUoc3RyaW5nKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIG91dC5jbG9zZSgpOworICAgICAgICB9CisgICAgfQorCisKICAgICAvKioKICAgICAgKiBBZGp1c3QgdGhlIHBlci1wcm9jZXNzIGRucyBlbnRyaWVzIChuZXQuZG5zPHg+LjxwaWQ+KSBiYXNlZAogICAgICAqIG9uIHRoZSBoaWdoZXN0IHByaW9yaXR5IGFjdGl2ZSBuZXQgd2hpY2ggdGhpcyBwcm9jZXNzIHJlcXVlc3RlZC4KQEAgLTEyMjUsNyArMTQzNCw3IEBACiAgICAgICAgICAgICAgICAgZm9yIChpbnQgaj0wOyBqPHBpZHMuc2l6ZSgpOyBqKyspIHsKICAgICAgICAgICAgICAgICAgICAgSW50ZWdlciBwaWQgPSAoSW50ZWdlcilwaWRzLmdldChqKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKHBpZC5pbnRWYWx1ZSgpID09IG15UGlkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdbXSBkbnNMaXN0ID0gbnQuZ2V0TmFtZVNlcnZlcnMoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1tdIGRuc0xpc3QgPSBnZXROYW1lU2VydmVyTGlzdChudC5nZXREbnNQcm9wTmFtZXMoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZVBpZERucyhkbnNMaXN0LCBteVBpZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZG9CdW1wKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVtcERucygpOwpAQCAtMTI3OSw3ICsxNDg4LDcgQEAKICAgICAgICAgICAgIE5ldHdvcmtTdGF0ZVRyYWNrZXIgbnQgPSBtTmV0VHJhY2tlcnNbbmV0VHlwZV07CiAgICAgICAgICAgICBpZiAobnQgIT0gbnVsbCAmJiBudC5nZXROZXR3b3JrSW5mbygpLmlzQ29ubmVjdGVkKCkgJiYKICAgICAgICAgICAgICAgICAgICAgIW50LmlzVGVhcmRvd25SZXF1ZXN0ZWQoKSkgewotICAgICAgICAgICAgICAgIFN0cmluZ1tdIGRuc0xpc3QgPSBudC5nZXROYW1lU2VydmVycygpOworICAgICAgICAgICAgICAgIFN0cmluZ1tdIGRuc0xpc3QgPSBnZXROYW1lU2VydmVyTGlzdChudC5nZXREbnNQcm9wTmFtZXMoKSk7CiAgICAgICAgICAgICAgICAgaWYgKG1OZXRBdHRyaWJ1dGVzW25ldFR5cGVdLmlzRGVmYXVsdCgpKSB7CiAgICAgICAgICAgICAgICAgICAgIGludCBqID0gMTsKICAgICAgICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgZG5zIDogZG5zTGlzdCkgewpAQCAtMTM2Miw2ICsxNTcxLDEzIEBACiAgICAgICAgIH0KICAgICAgICAgcHcucHJpbnRsbigpOwogCisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgcHcucHJpbnRsbigiTmV0d29ya1RyYW5zdGlvbldha2VMb2NrIGlzIGN1cnJlbnRseSAiICsKKyAgICAgICAgICAgICAgICAgICAgKG1OZXRUcmFuc2l0aW9uV2FrZUxvY2suaXNIZWxkKCkgPyAiIiA6ICJub3QgIikgKyAiaGVsZC4iKTsKKyAgICAgICAgICAgIHB3LnByaW50bG4oIkl0IHdhcyBsYXN0IHJlcXVlc3RlZCBmb3IgIittTmV0VHJhbnNpdGlvbldha2VMb2NrQ2F1c2VkQnkpOworICAgICAgICB9CisgICAgICAgIHB3LnByaW50bG4oKTsKKwogICAgICAgICBtVGV0aGVyaW5nLmR1bXAoZmQsIHB3LCBhcmdzKTsKICAgICB9CiAKQEAgLTE0NTMsNiArMTY2OSwyMCBAQAogICAgICAgICAgICAgICAgICAgICBGZWF0dXJlVXNlciB1ID0gKEZlYXR1cmVVc2VyKW1zZy5vYmo7CiAgICAgICAgICAgICAgICAgICAgIHUuZXhwaXJlKCk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgTmV0d29ya1N0YXRlVHJhY2tlci5FVkVOVF9DTEVBUl9ORVRfVFJBTlNJVElPTl9XQUtFTE9DSzoKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNhdXNlZEJ5ID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChDb25uZWN0aXZpdHlTZXJ2aWNlLnRoaXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtc2cuYXJnMSA9PSBtTmV0VHJhbnNpdGlvbldha2VMb2NrU2VyaWFsTnVtYmVyICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1OZXRUcmFuc2l0aW9uV2FrZUxvY2suaXNIZWxkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTmV0VHJhbnNpdGlvbldha2VMb2NrLnJlbGVhc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXVzZWRCeSA9IG1OZXRUcmFuc2l0aW9uV2FrZUxvY2tDYXVzZWRCeTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoY2F1c2VkQnkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgIk5ldFRyYW5zaXRpb24gV2FrZWxvY2sgZm9yICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXVzZWRCeSArICIgcmVsZWFzZWQgYnkgdGltZW91dCIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtMTUzNiw0ICsxNzY2LDIzIEBACiAgICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLlRFVEhFUl9TVVBQT1JURUQsIGRlZmF1bHRWYWwpICE9IDApOwogICAgICAgICByZXR1cm4gdGV0aGVyRW5hYmxlZEluU2V0dGluZ3MgJiYgbVRldGhlcmluZ0NvbmZpZ1ZhbGlkOwogICAgIH0KKworICAgIC8vIEFuIEFQSSBOZXR3b3JrU3RhdGVUcmFja2VycyBjYW4gY2FsbCB3aGVuIHRoZXkgbG9zZSB0aGVpciBuZXR3b3JrLgorICAgIC8vIFRoaXMgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIGNsZWFyZWQgYWZ0ZXIgWCBzZWNvbmRzIG9yIGEgbmV0d29yayBiZWNvbWVzIENPTk5FQ1RFRCwKKyAgICAvLyB3aGljaGV2ZXIgaGFwcGVucyBmaXJzdC4gIFRoZSB0aW1lciBpcyBzdGFydGVkIGJ5IHRoZSBmaXJzdCBjYWxsZXIgYW5kIG5vdAorICAgIC8vIHJlc3RhcnRlZCBieSBzdWJzZXF1ZW50IGNhbGxlcnMuCisgICAgcHVibGljIHZvaWQgcmVxdWVzdE5ldHdvcmtUcmFuc2l0aW9uV2FrZWxvY2soU3RyaW5nIGZvcldob20pIHsKKyAgICAgICAgZW5mb3JjZUNvbm5lY3Rpdml0eUludGVybmFsUGVybWlzc2lvbigpOworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIGlmIChtTmV0VHJhbnNpdGlvbldha2VMb2NrLmlzSGVsZCgpKSByZXR1cm47CisgICAgICAgICAgICBtTmV0VHJhbnNpdGlvbldha2VMb2NrU2VyaWFsTnVtYmVyKys7CisgICAgICAgICAgICBtTmV0VHJhbnNpdGlvbldha2VMb2NrLmFjcXVpcmUoKTsKKyAgICAgICAgICAgIG1OZXRUcmFuc2l0aW9uV2FrZUxvY2tDYXVzZWRCeSA9IGZvcldob207CisgICAgICAgIH0KKyAgICAgICAgbUhhbmRsZXIuc2VuZE1lc3NhZ2VEZWxheWVkKG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UoCisgICAgICAgICAgICAgICAgTmV0d29ya1N0YXRlVHJhY2tlci5FVkVOVF9DTEVBUl9ORVRfVFJBTlNJVElPTl9XQUtFTE9DSywKKyAgICAgICAgICAgICAgICBtTmV0VHJhbnNpdGlvbldha2VMb2NrU2VyaWFsTnVtYmVyLCAwKSwKKyAgICAgICAgICAgICAgICBtTmV0VHJhbnNpdGlvbldha2VMb2NrVGltZW91dCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9EZW1vRGF0YVNldC5qYXZhIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvRGVtb0RhdGFTZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjc3OTg1Zi4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9EZW1vRGF0YVNldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnNlcnZlcjsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXI7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXM7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkFzc2V0TWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7Ci1pbXBvcnQgYW5kcm9pZC5vcy5FbnZpcm9ubWVudDsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3M7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5NZWRpYVN0b3JlLkltYWdlczsKLWltcG9ydCBhbmRyb2lkLnV0aWwuQ29uZmlnOwotaW1wb3J0IGFuZHJvaWQudXRpbC5TbG9nOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci0KLXB1YmxpYyBjbGFzcyBEZW1vRGF0YVNldAotewotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBMT0dfVEFHID0gIkRlbW9EYXRhU2V0IjsKLQotICAgIHByaXZhdGUgQ29udGVudFJlc29sdmVyIG1Db250ZW50UmVzb2x2ZXI7Ci0KLSAgICBwdWJsaWMgZmluYWwgdm9pZCBhZGQoQ29udGV4dCBjb250ZXh0KQotICAgIHsKLSAgICAgICAgbUNvbnRlbnRSZXNvbHZlciA9IGNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCk7Ci0KLSAgICAgICAgLy8gUmVtb3ZlIGFsbCB0aGUgb2xkIGRhdGEKLSAgICAgICAgbUNvbnRlbnRSZXNvbHZlci5kZWxldGUoQ29udGFjdHMuUGVvcGxlLkNPTlRFTlRfVVJJLCBudWxsLCBudWxsKTsKLQotICAgICAgICAvLyBBZGQgdGhlIG5ldyBkYXRhCi0gICAgICAgIGFkZERlZmF1bHREYXRhKCk7Ci0gICAgICAgIAotICAgICAgICAvLyBBZGQgaW1hZ2VzIGZyb20gL2FuZHJvaWQvaW1hZ2VzCi0gICAgICAgIGFkZERlZmF1bHRJbWFnZXMoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGZpbmFsIHZvaWQgYWRkRGVmYXVsdEltYWdlcygpCi0gICAgewotICAgICAgICBGaWxlIHJvb3REaXJlY3RvcnkgPSBFbnZpcm9ubWVudC5nZXRSb290RGlyZWN0b3J5KCk7Ci0gICAgICAgIFN0cmluZyBbXSBmaWxlcwotICAgICAgICAgICAgPSBuZXcgRmlsZShyb290RGlyZWN0b3J5LCAiaW1hZ2VzIikubGlzdCgpOwotICAgICAgICBpbnQgY291bnQgPSBmaWxlcy5sZW5ndGg7Ci0KLSAgICAgICAgaWYgKGNvdW50ID09IDApIHsKLSAgICAgICAgICAgIFNsb2cuaShMT0dfVEFHLCAiYWRkRGVmYXVsdEltYWdlczogbm8gaW1hZ2VzIGZvdW5kISIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGZpbGVzW2ldOwotICAgICAgICAgICAgU3RyaW5nIHBhdGggPSByb290RGlyZWN0b3J5ICsgIi8iICsgbmFtZTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBJbWFnZXMuTWVkaWEuaW5zZXJ0SW1hZ2UobUNvbnRlbnRSZXNvbHZlciwgcGF0aCwgbmFtZSwgbnVsbCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIFNsb2cuZShMT0dfVEFHLCAiRmFpbGVkIHRvIGltcG9ydCBpbWFnZSAiICsgcGF0aCwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBmaW5hbCB2b2lkIGFkZERlZmF1bHREYXRhKCkKLSAgICB7Ci0gICAgICAgIFNsb2cuaShMT0dfVEFHLCAiQWRkaW5nIGRlZmF1bHQgZGF0YS4uLiIpOwotCi0vLyAgICAgICBhZGRJbWFnZSgiVmlvbGV0IiwgImltYWdlcy92aW9sZXQucG5nIik7Ci0vLyAgICAgICBhZGRJbWFnZSgiQ29ya3kiLCAiaW1hZ2VzL2Nvcmt5LnBuZyIpOwotCi0gICAgICAgIC8vIFBFTkRJTkc6IHNob3VsZCB0aGlzIGJlIGRvbmUgaGVyZT8hPyEKLSAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoCi0gICAgICAgICAgICAgICAgSW50ZW50LkFDVElPTl9DQUxMLCBVcmkuZnJvbVBhcnRzKCJ2b2ljZW1haWwiLCAiIiwgbnVsbCkpOwotICAgICAgICBhZGRTaG9ydGN1dCgiMSIsIGludGVudCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBVcmkgYWRkSW1hZ2UoU3RyaW5nIG5hbWUsIFVyaSBmaWxlKQotICAgIHsKLSAgICAgICAgQ29udGVudFZhbHVlcyBpbWFnZXYgPSBuZXcgQ29udGVudFZhbHVlcygpOwotICAgICAgICBpbWFnZXYucHV0KCJuYW1lIiwgbmFtZSk7Ci0KLSAgICAgICAgVXJpIHVybCA9IG51bGw7Ci0KLSAgICAgICAgQXNzZXRNYW5hZ2VyIGFzcyA9IEFzc2V0TWFuYWdlci5nZXRTeXN0ZW0oKTsKLSAgICAgICAgSW5wdXRTdHJlYW0gaW4gPSBudWxsOwotICAgICAgICBPdXRwdXRTdHJlYW0gb3V0ID0gbnVsbDsKLSAgICAgICAgCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBpbiA9IGFzcy5vcGVuKGZpbGUudG9TdHJpbmcoKSk7Ci0KLSAgICAgICAgICAgIHVybCA9IG1Db250ZW50UmVzb2x2ZXIuaW5zZXJ0KEltYWdlcy5NZWRpYS5JTlRFUk5BTF9DT05URU5UX1VSSSwgaW1hZ2V2KTsKLSAgICAgICAgICAgIG91dCA9IG1Db250ZW50UmVzb2x2ZXIub3Blbk91dHB1dFN0cmVhbSh1cmwpOwotCi0gICAgICAgICAgICBmaW5hbCBpbnQgc2l6ZSA9IDggKiAxMDI0OwotICAgICAgICAgICAgYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlW3NpemVdOwotCi0gICAgICAgICAgICBpbnQgY291bnQgPSAwOwotICAgICAgICAgICAgZG8KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb3VudCA9IGluLnJlYWQoYnVmLCAwLCBzaXplKTsKLSAgICAgICAgICAgICAgICBpZiAoY291bnQgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG91dC53cml0ZShidWYsIDAsIGNvdW50KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IHdoaWxlIChjb3VudCA+IDApOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgU2xvZy5lKExPR19UQUcsICJGYWlsZWQgdG8gaW5zZXJ0IGltYWdlICciICsgZmlsZSArICInIiwgZSk7Ci0gICAgICAgICAgICB1cmwgPSBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHVybDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGZpbmFsIFVyaSBhZGRTaG9ydGN1dChTdHJpbmcgc2hvcnRjdXQsIEludGVudCBpbnRlbnQpCi0gICAgewotICAgICAgICBpZiAoQ29uZmlnLkxPR1YpIFNsb2cudihMT0dfVEFHLCAiYWRkU2hvcnRjdXQ6IHNob3J0Y3V0PSIgKyBzaG9ydGN1dCArICIsIGludGVudD0iICsgaW50ZW50KTsKLSAgICAgICAgcmV0dXJuIFNldHRpbmdzLkJvb2ttYXJrcy5hZGQobUNvbnRlbnRSZXNvbHZlciwgaW50ZW50LCBudWxsLCBudWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG9ydGN1dCAhPSBudWxsID8gc2hvcnRjdXQuY2hhckF0KDApIDogMCwgMCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvRGV2aWNlUG9saWN5TWFuYWdlclNlcnZpY2UuamF2YSBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0RldmljZVBvbGljeU1hbmFnZXJTZXJ2aWNlLmphdmEKaW5kZXggMTlkMTQ2ZC4uYzBlYTY4ZCAxMDA2NDQKLS0tIGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvRGV2aWNlUG9saWN5TWFuYWdlclNlcnZpY2UuamF2YQorKysgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9EZXZpY2VQb2xpY3lNYW5hZ2VyU2VydmljZS5qYXZhCkBAIC02NywzNyArNjcsNTAgQEAKICAqLwogcHVibGljIGNsYXNzIERldmljZVBvbGljeU1hbmFnZXJTZXJ2aWNlIGV4dGVuZHMgSURldmljZVBvbGljeU1hbmFnZXIuU3R1YiB7CiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiRGV2aWNlUG9saWN5TWFuYWdlclNlcnZpY2UiOwotICAgIAorCiAgICAgZmluYWwgQ29udGV4dCBtQ29udGV4dDsKICAgICBmaW5hbCBNeVBhY2thZ2VNb25pdG9yIG1Nb25pdG9yOwogCiAgICAgSVBvd2VyTWFuYWdlciBtSVBvd2VyTWFuYWdlcjsKLSAgICAKKwogICAgIGludCBtQWN0aXZlUGFzc3dvcmRRdWFsaXR5ID0gRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX1VOU1BFQ0lGSUVEOwogICAgIGludCBtQWN0aXZlUGFzc3dvcmRMZW5ndGggPSAwOworICAgIGludCBtQWN0aXZlUGFzc3dvcmRVcHBlckNhc2UgPSAwOworICAgIGludCBtQWN0aXZlUGFzc3dvcmRMb3dlckNhc2UgPSAwOworICAgIGludCBtQWN0aXZlUGFzc3dvcmRMZXR0ZXJzID0gMDsKKyAgICBpbnQgbUFjdGl2ZVBhc3N3b3JkTnVtZXJpYyA9IDA7CisgICAgaW50IG1BY3RpdmVQYXNzd29yZFN5bWJvbHMgPSAwOworICAgIGludCBtQWN0aXZlUGFzc3dvcmROb25MZXR0ZXIgPSAwOwogICAgIGludCBtRmFpbGVkUGFzc3dvcmRBdHRlbXB0cyA9IDA7Ci0gICAgCisKICAgICBpbnQgbVBhc3N3b3JkT3duZXIgPSAtMTsKLSAgICAKKwogICAgIGZpbmFsIEhhc2hNYXA8Q29tcG9uZW50TmFtZSwgQWN0aXZlQWRtaW4+IG1BZG1pbk1hcAogICAgICAgICAgICAgPSBuZXcgSGFzaE1hcDxDb21wb25lbnROYW1lLCBBY3RpdmVBZG1pbj4oKTsKICAgICBmaW5hbCBBcnJheUxpc3Q8QWN0aXZlQWRtaW4+IG1BZG1pbkxpc3QKICAgICAgICAgICAgID0gbmV3IEFycmF5TGlzdDxBY3RpdmVBZG1pbj4oKTsKLSAgICAKKwogICAgIHN0YXRpYyBjbGFzcyBBY3RpdmVBZG1pbiB7CiAgICAgICAgIGZpbmFsIERldmljZUFkbWluSW5mbyBpbmZvOwotICAgICAgICAKKwogICAgICAgICBpbnQgcGFzc3dvcmRRdWFsaXR5ID0gRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX1VOU1BFQ0lGSUVEOwogICAgICAgICBpbnQgbWluaW11bVBhc3N3b3JkTGVuZ3RoID0gMDsKKyAgICAgICAgaW50IHBhc3N3b3JkSGlzdG9yeUxlbmd0aCA9IDA7CisgICAgICAgIGludCBtaW5pbXVtUGFzc3dvcmRVcHBlckNhc2UgPSAwOworICAgICAgICBpbnQgbWluaW11bVBhc3N3b3JkTG93ZXJDYXNlID0gMDsKKyAgICAgICAgaW50IG1pbmltdW1QYXNzd29yZExldHRlcnMgPSAxOworICAgICAgICBpbnQgbWluaW11bVBhc3N3b3JkTnVtZXJpYyA9IDE7CisgICAgICAgIGludCBtaW5pbXVtUGFzc3dvcmRTeW1ib2xzID0gMTsKKyAgICAgICAgaW50IG1pbmltdW1QYXNzd29yZE5vbkxldHRlciA9IDA7CiAgICAgICAgIGxvbmcgbWF4aW11bVRpbWVUb1VubG9jayA9IDA7CiAgICAgICAgIGludCBtYXhpbXVtRmFpbGVkUGFzc3dvcmRzRm9yV2lwZSA9IDA7Ci0gICAgICAgIAorCiAgICAgICAgIEFjdGl2ZUFkbWluKERldmljZUFkbWluSW5mbyBfaW5mbykgewogICAgICAgICAgICAgaW5mbyA9IF9pbmZvOwogICAgICAgICB9Ci0gICAgICAgIAorCiAgICAgICAgIGludCBnZXRVaWQoKSB7IHJldHVybiBpbmZvLmdldEFjdGl2aXR5SW5mbygpLmFwcGxpY2F0aW9uSW5mby51aWQ7IH0KLSAgICAgICAgCisKICAgICAgICAgdm9pZCB3cml0ZVRvWG1sKFhtbFNlcmlhbGl6ZXIgb3V0KQogICAgICAgICAgICAgICAgIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24sIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewogICAgICAgICAgICAgb3V0LnN0YXJ0VGFnKG51bGwsICJwb2xpY2llcyIpOwpAQCAtMTEwLDcgKzEyMyw0MiBAQAogICAgICAgICAgICAgICAgIGlmIChtaW5pbXVtUGFzc3dvcmRMZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgIG91dC5zdGFydFRhZyhudWxsLCAibWluLXBhc3N3b3JkLWxlbmd0aCIpOwogICAgICAgICAgICAgICAgICAgICBvdXQuYXR0cmlidXRlKG51bGwsICJ2YWx1ZSIsIEludGVnZXIudG9TdHJpbmcobWluaW11bVBhc3N3b3JkTGVuZ3RoKSk7Ci0gICAgICAgICAgICAgICAgICAgIG91dC5lbmRUYWcobnVsbCwgIm1uLXBhc3N3b3JkLWxlbmd0aCIpOworICAgICAgICAgICAgICAgICAgICBvdXQuZW5kVGFnKG51bGwsICJtaW4tcGFzc3dvcmQtbGVuZ3RoIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmKHBhc3N3b3JkSGlzdG9yeUxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnN0YXJ0VGFnKG51bGwsICJwYXNzd29yZC1oaXN0b3J5LWxlbmd0aCIpOworICAgICAgICAgICAgICAgICAgICBvdXQuYXR0cmlidXRlKG51bGwsICJ2YWx1ZSIsIEludGVnZXIudG9TdHJpbmcocGFzc3dvcmRIaXN0b3J5TGVuZ3RoKSk7CisgICAgICAgICAgICAgICAgICAgIG91dC5lbmRUYWcobnVsbCwgInBhc3N3b3JkLWhpc3RvcnktbGVuZ3RoIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChtaW5pbXVtUGFzc3dvcmRVcHBlckNhc2UgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIG91dC5zdGFydFRhZyhudWxsLCAibWluLXBhc3N3b3JkLXVwcGVyY2FzZSIpOworICAgICAgICAgICAgICAgICAgICBvdXQuYXR0cmlidXRlKG51bGwsICJ2YWx1ZSIsIEludGVnZXIudG9TdHJpbmcobWluaW11bVBhc3N3b3JkVXBwZXJDYXNlKSk7CisgICAgICAgICAgICAgICAgICAgIG91dC5lbmRUYWcobnVsbCwgIm1pbi1wYXNzd29yZC11cHBlcmNhc2UiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG1pbmltdW1QYXNzd29yZExvd2VyQ2FzZSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnN0YXJ0VGFnKG51bGwsICJtaW4tcGFzc3dvcmQtbG93ZXJjYXNlIik7CisgICAgICAgICAgICAgICAgICAgIG91dC5hdHRyaWJ1dGUobnVsbCwgInZhbHVlIiwgSW50ZWdlci50b1N0cmluZyhtaW5pbXVtUGFzc3dvcmRMb3dlckNhc2UpKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LmVuZFRhZyhudWxsLCAibWluLXBhc3N3b3JkLWxvd2VyY2FzZSIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobWluaW11bVBhc3N3b3JkTGV0dGVycyA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnN0YXJ0VGFnKG51bGwsICJtaW4tcGFzc3dvcmQtbGV0dGVycyIpOworICAgICAgICAgICAgICAgICAgICBvdXQuYXR0cmlidXRlKG51bGwsICJ2YWx1ZSIsIEludGVnZXIudG9TdHJpbmcobWluaW11bVBhc3N3b3JkTGV0dGVycykpOworICAgICAgICAgICAgICAgICAgICBvdXQuZW5kVGFnKG51bGwsICJtaW4tcGFzc3dvcmQtbGV0dGVycyIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobWluaW11bVBhc3N3b3JkTnVtZXJpYyA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnN0YXJ0VGFnKG51bGwsICJtaW4tcGFzc3dvcmQtbnVtZXJpYyIpOworICAgICAgICAgICAgICAgICAgICBvdXQuYXR0cmlidXRlKG51bGwsICJ2YWx1ZSIsIEludGVnZXIudG9TdHJpbmcobWluaW11bVBhc3N3b3JkTnVtZXJpYykpOworICAgICAgICAgICAgICAgICAgICBvdXQuZW5kVGFnKG51bGwsICJtaW4tcGFzc3dvcmQtbnVtZXJpYyIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobWluaW11bVBhc3N3b3JkU3ltYm9scyA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnN0YXJ0VGFnKG51bGwsICJtaW4tcGFzc3dvcmQtc3ltYm9scyIpOworICAgICAgICAgICAgICAgICAgICBvdXQuYXR0cmlidXRlKG51bGwsICJ2YWx1ZSIsIEludGVnZXIudG9TdHJpbmcobWluaW11bVBhc3N3b3JkU3ltYm9scykpOworICAgICAgICAgICAgICAgICAgICBvdXQuZW5kVGFnKG51bGwsICJtaW4tcGFzc3dvcmQtc3ltYm9scyIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobWluaW11bVBhc3N3b3JkTm9uTGV0dGVyID4gMCkgeworICAgICAgICAgICAgICAgICAgICBvdXQuc3RhcnRUYWcobnVsbCwgIm1pbi1wYXNzd29yZC1ub25sZXR0ZXIiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LmF0dHJpYnV0ZShudWxsLCAidmFsdWUiLCBJbnRlZ2VyLnRvU3RyaW5nKG1pbmltdW1QYXNzd29yZE5vbkxldHRlcikpOworICAgICAgICAgICAgICAgICAgICBvdXQuZW5kVGFnKG51bGwsICJtaW4tcGFzc3dvcmQtbm9ubGV0dGVyIik7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKG1heGltdW1UaW1lVG9VbmxvY2sgIT0gRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX1VOU1BFQ0lGSUVEKSB7CkBAIC0xMjQsNyArMTcyLDcgQEAKICAgICAgICAgICAgICAgICBvdXQuZW5kVGFnKG51bGwsICJtYXgtZmFpbGVkLXBhc3N3b3JkLXdpcGUiKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICAKKwogICAgICAgICB2b2lkIHJlYWRGcm9tWG1sKFhtbFB1bGxQYXJzZXIgcGFyc2VyKQogICAgICAgICAgICAgICAgIHRocm93cyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CiAgICAgICAgICAgICBpbnQgb3V0ZXJEZXB0aCA9IHBhcnNlci5nZXREZXB0aCgpOwpAQCAtMTQzLDYgKzE5MSwyNyBAQAogICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIm1pbi1wYXNzd29yZC1sZW5ndGgiLmVxdWFscyh0YWcpKSB7CiAgICAgICAgICAgICAgICAgICAgIG1pbmltdW1QYXNzd29yZExlbmd0aCA9IEludGVnZXIucGFyc2VJbnQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VyLmdldEF0dHJpYnV0ZVZhbHVlKG51bGwsICJ2YWx1ZSIpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCJwYXNzd29yZC1oaXN0b3J5LWxlbmd0aCIuZXF1YWxzKHRhZykpIHsKKyAgICAgICAgICAgICAgICAgICAgcGFzc3dvcmRIaXN0b3J5TGVuZ3RoID0gSW50ZWdlci5wYXJzZUludCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUobnVsbCwgInZhbHVlIikpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIm1pbi1wYXNzd29yZC11cHBlcmNhc2UiLmVxdWFscyh0YWcpKSB7CisgICAgICAgICAgICAgICAgICAgIG1pbmltdW1QYXNzd29yZFVwcGVyQ2FzZSA9IEludGVnZXIucGFyc2VJbnQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VyLmdldEF0dHJpYnV0ZVZhbHVlKG51bGwsICJ2YWx1ZSIpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCJtaW4tcGFzc3dvcmQtbG93ZXJjYXNlIi5lcXVhbHModGFnKSkgeworICAgICAgICAgICAgICAgICAgICBtaW5pbXVtUGFzc3dvcmRMb3dlckNhc2UgPSBJbnRlZ2VyLnBhcnNlSW50KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZShudWxsLCAidmFsdWUiKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgibWluLXBhc3N3b3JkLWxldHRlcnMiLmVxdWFscyh0YWcpKSB7CisgICAgICAgICAgICAgICAgICAgIG1pbmltdW1QYXNzd29yZExldHRlcnMgPSBJbnRlZ2VyLnBhcnNlSW50KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZShudWxsLCAidmFsdWUiKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgibWluLXBhc3N3b3JkLW51bWVyaWMiLmVxdWFscyh0YWcpKSB7CisgICAgICAgICAgICAgICAgICAgIG1pbmltdW1QYXNzd29yZE51bWVyaWMgPSBJbnRlZ2VyLnBhcnNlSW50KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZShudWxsLCAidmFsdWUiKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgibWluLXBhc3N3b3JkLXN5bWJvbHMiLmVxdWFscyh0YWcpKSB7CisgICAgICAgICAgICAgICAgICAgIG1pbmltdW1QYXNzd29yZFN5bWJvbHMgPSBJbnRlZ2VyLnBhcnNlSW50KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZShudWxsLCAidmFsdWUiKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgibWluLXBhc3N3b3JkLW5vbmxldHRlciIuZXF1YWxzKHRhZykpIHsKKyAgICAgICAgICAgICAgICAgICAgbWluaW11bVBhc3N3b3JkTm9uTGV0dGVyID0gSW50ZWdlci5wYXJzZUludCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUobnVsbCwgInZhbHVlIikpOwogICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIm1heC10aW1lLXRvLXVubG9jayIuZXF1YWxzKHRhZykpIHsKICAgICAgICAgICAgICAgICAgICAgbWF4aW11bVRpbWVUb1VubG9jayA9IExvbmcucGFyc2VMb25nKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZShudWxsLCAidmFsdWUiKSk7CkBAIC0xNTUsNyArMjI0LDcgQEAKICAgICAgICAgICAgICAgICBYbWxVdGlscy5za2lwQ3VycmVudFRhZyhwYXJzZXIpOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIAorCiAgICAgICAgIHZvaWQgZHVtcChTdHJpbmcgcHJlZml4LCBQcmludFdyaXRlciBwdykgewogICAgICAgICAgICAgcHcucHJpbnQocHJlZml4KTsgcHcucHJpbnQoInVpZD0iKTsgcHcucHJpbnRsbihnZXRVaWQoKSk7CiAgICAgICAgICAgICBwdy5wcmludChwcmVmaXgpOyBwdy5wcmludGxuKCJwb2xpY2llczoiKTsKQEAgLTE2NiwyMyArMjM1LDM3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgcHcucHJpbnQocHJlZml4KTsgcHcucHJpbnQoInBhc3N3b3JkUXVhbGl0eT0weCIpOwotICAgICAgICAgICAgICAgICAgICBwdy5wcmludChJbnRlZ2VyLnRvSGV4U3RyaW5nKHBhc3N3b3JkUXVhbGl0eSkpOwotICAgICAgICAgICAgICAgICAgICBwdy5wcmludCgiIG1pbmltdW1QYXNzd29yZExlbmd0aD0iKTsKKyAgICAgICAgICAgICAgICAgICAgcHcucHJpbnRsbihJbnRlZ2VyLnRvSGV4U3RyaW5nKHBhc3N3b3JkUXVhbGl0eSkpOworICAgICAgICAgICAgcHcucHJpbnQocHJlZml4KTsgcHcucHJpbnQoIm1pbmltdW1QYXNzd29yZExlbmd0aD0iKTsKICAgICAgICAgICAgICAgICAgICAgcHcucHJpbnRsbihtaW5pbXVtUGFzc3dvcmRMZW5ndGgpOworICAgICAgICAgICAgcHcucHJpbnQocHJlZml4KTsgcHcucHJpbnQoInBhc3N3b3JkSGlzdG9yeUxlbmd0aD0iKTsKKyAgICAgICAgICAgICAgICAgICAgcHcucHJpbnRsbihwYXNzd29yZEhpc3RvcnlMZW5ndGgpOworICAgICAgICAgICAgcHcucHJpbnQocHJlZml4KTsgcHcucHJpbnQoIm1pbmltdW1QYXNzd29yZFVwcGVyQ2FzZT0iKTsKKyAgICAgICAgICAgICAgICAgICAgcHcucHJpbnRsbihtaW5pbXVtUGFzc3dvcmRVcHBlckNhc2UpOworICAgICAgICAgICAgcHcucHJpbnQocHJlZml4KTsgcHcucHJpbnQoIm1pbmltdW1QYXNzd29yZExvd2VyQ2FzZT0iKTsKKyAgICAgICAgICAgICAgICAgICAgcHcucHJpbnRsbihtaW5pbXVtUGFzc3dvcmRMb3dlckNhc2UpOworICAgICAgICAgICAgcHcucHJpbnQocHJlZml4KTsgcHcucHJpbnQoIm1pbmltdW1QYXNzd29yZExldHRlcnM9Iik7CisgICAgICAgICAgICAgICAgICAgIHB3LnByaW50bG4obWluaW11bVBhc3N3b3JkTGV0dGVycyk7CisgICAgICAgICAgICBwdy5wcmludChwcmVmaXgpOyBwdy5wcmludCgibWluaW11bVBhc3N3b3JkTnVtZXJpYz0iKTsKKyAgICAgICAgICAgICAgICAgICAgcHcucHJpbnRsbihtaW5pbXVtUGFzc3dvcmROdW1lcmljKTsKKyAgICAgICAgICAgIHB3LnByaW50KHByZWZpeCk7IHB3LnByaW50KCJtaW5pbXVtUGFzc3dvcmRTeW1ib2xzPSIpOworICAgICAgICAgICAgICAgICAgICBwdy5wcmludGxuKG1pbmltdW1QYXNzd29yZFN5bWJvbHMpOworICAgICAgICAgICAgcHcucHJpbnQocHJlZml4KTsgcHcucHJpbnQoIm1pbmltdW1QYXNzd29yZE5vbkxldHRlcj0iKTsKKyAgICAgICAgICAgICAgICAgICAgcHcucHJpbnRsbihtaW5pbXVtUGFzc3dvcmROb25MZXR0ZXIpOwogICAgICAgICAgICAgcHcucHJpbnQocHJlZml4KTsgcHcucHJpbnQoIm1heGltdW1UaW1lVG9VbmxvY2s9Iik7CiAgICAgICAgICAgICAgICAgICAgIHB3LnByaW50bG4obWF4aW11bVRpbWVUb1VubG9jayk7CiAgICAgICAgICAgICBwdy5wcmludChwcmVmaXgpOyBwdy5wcmludCgibWF4aW11bUZhaWxlZFBhc3N3b3Jkc0ZvcldpcGU9Iik7CiAgICAgICAgICAgICAgICAgICAgIHB3LnByaW50bG4obWF4aW11bUZhaWxlZFBhc3N3b3Jkc0ZvcldpcGUpOwogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgY2xhc3MgTXlQYWNrYWdlTW9uaXRvciBleHRlbmRzIFBhY2thZ2VNb25pdG9yIHsKICAgICAgICAgcHVibGljIHZvaWQgb25Tb21lUGFja2FnZXNDaGFuZ2VkKCkgewogICAgICAgICAgICAgc3luY2hyb25pemVkIChEZXZpY2VQb2xpY3lNYW5hZ2VyU2VydmljZS50aGlzKSB7CiAgICAgICAgICAgICAgICAgYm9vbGVhbiByZW1vdmVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgZm9yIChpbnQgaT1tQWRtaW5MaXN0LnNpemUoKS0xOyBpPj0wOyBpLS0pIHsKICAgICAgICAgICAgICAgICAgICAgQWN0aXZlQWRtaW4gYWEgPSBtQWRtaW5MaXN0LmdldChpKTsKLSAgICAgICAgICAgICAgICAgICAgaW50IGNoYW5nZSA9IGlzUGFja2FnZURpc2FwcGVhcmluZyhhYS5pbmZvLmdldFBhY2thZ2VOYW1lKCkpOyAKKyAgICAgICAgICAgICAgICAgICAgaW50IGNoYW5nZSA9IGlzUGFja2FnZURpc2FwcGVhcmluZyhhYS5pbmZvLmdldFBhY2thZ2VOYW1lKCkpOwogICAgICAgICAgICAgICAgICAgICBpZiAoY2hhbmdlID09IFBBQ0tBR0VfUEVSTUFORU5UX0NIQU5HRQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGNoYW5nZSA9PSBQQUNLQUdFX1RFTVBPUkFSWV9DSEFOR0UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIFNsb2cudyhUQUcsICJBZG1pbiB1bmV4cGVjdGVkbHkgdW5pbnN0YWxsZWQ6ICIKQEAgLTIwNyw3ICsyOTAsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgLyoqCiAgICAgICogSW5zdGFudGlhdGVzIHRoZSBzZXJ2aWNlLgogICAgICAqLwpAQCAtMjI0LDcgKzMwNyw3IEBACiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIG1JUG93ZXJNYW5hZ2VyOwogICAgIH0KLSAgICAKKwogICAgIEFjdGl2ZUFkbWluIGdldEFjdGl2ZUFkbWluVW5jaGVja2VkTG9ja2VkKENvbXBvbmVudE5hbWUgd2hvKSB7CiAgICAgICAgIEFjdGl2ZUFkbWluIGFkbWluID0gbUFkbWluTWFwLmdldCh3aG8pOwogICAgICAgICBpZiAoYWRtaW4gIT0gbnVsbApAQCAtMjM0LDcgKzMxNyw3IEBACiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQotICAgIAorCiAgICAgQWN0aXZlQWRtaW4gZ2V0QWN0aXZlQWRtaW5Gb3JDYWxsZXJMb2NrZWQoQ29tcG9uZW50TmFtZSB3aG8sIGludCByZXFQb2xpY3kpCiAgICAgICAgICAgICB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24gewogICAgICAgICBmaW5hbCBpbnQgY2FsbGluZ1VpZCA9IEJpbmRlci5nZXRDYWxsaW5nVWlkKCk7CkBAIC0yNjUsMTMgKzM0OCwxMyBAQAogICAgICAgICAgICAgICAgICAgICArIEJpbmRlci5nZXRDYWxsaW5nVWlkKCkgKyAiIGZvciBwb2xpY3kgIyIgKyByZXFQb2xpY3kpOwogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgdm9pZCBzZW5kQWRtaW5Db21tYW5kTG9ja2VkKEFjdGl2ZUFkbWluIGFkbWluLCBTdHJpbmcgYWN0aW9uKSB7CiAgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KGFjdGlvbik7CiAgICAgICAgIGludGVudC5zZXRDb21wb25lbnQoYWRtaW4uaW5mby5nZXRDb21wb25lbnQoKSk7CiAgICAgICAgIG1Db250ZXh0LnNlbmRCcm9hZGNhc3QoaW50ZW50KTsKICAgICB9Ci0gICAgCisKICAgICB2b2lkIHNlbmRBZG1pbkNvbW1hbmRMb2NrZWQoU3RyaW5nIGFjdGlvbiwgaW50IHJlcVBvbGljeSkgewogICAgICAgICBmaW5hbCBpbnQgTiA9IG1BZG1pbkxpc3Quc2l6ZSgpOwogICAgICAgICBpZiAoTiA+IDApIHsKQEAgLTI4Myw3ICszNjYsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgdm9pZCByZW1vdmVBY3RpdmVBZG1pbkxvY2tlZChDb21wb25lbnROYW1lIGFkbWluUmVjZWl2ZXIpIHsKICAgICAgICAgQWN0aXZlQWRtaW4gYWRtaW4gPSBnZXRBY3RpdmVBZG1pblVuY2hlY2tlZExvY2tlZChhZG1pblJlY2VpdmVyKTsKICAgICAgICAgaWYgKGFkbWluICE9IG51bGwpIHsKQEAgLTI5NSw3ICszNzgsNyBAQAogICAgICAgICAgICAgdmFsaWRhdGVQYXNzd29yZE93bmVyTG9ja2VkKCk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICBwdWJsaWMgRGV2aWNlQWRtaW5JbmZvIGZpbmRBZG1pbihDb21wb25lbnROYW1lIGFkbWluTmFtZSkgewogICAgICAgICBJbnRlbnQgcmVzb2x2ZUludGVudCA9IG5ldyBJbnRlbnQoKTsKICAgICAgICAgcmVzb2x2ZUludGVudC5zZXRDb21wb25lbnQoYWRtaW5OYW1lKTsKQEAgLTMwNCw3ICszODcsNyBAQAogICAgICAgICBpZiAoaW5mb3MgPT0gbnVsbCB8fCBpbmZvcy5zaXplKCkgPD0gMCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5rbm93biBhZG1pbjogIiArIGFkbWluTmFtZSk7CiAgICAgICAgIH0KLSAgICAgICAgCisKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIHJldHVybiBuZXcgRGV2aWNlQWRtaW5JbmZvKG1Db250ZXh0LCBpbmZvcy5nZXQoMCkpOwogICAgICAgICB9IGNhdGNoIChYbWxQdWxsUGFyc2VyRXhjZXB0aW9uIGUpIHsKQEAgLTMxNSw3ICszOTgsNyBAQAogICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICBwcml2YXRlIHN0YXRpYyBKb3VybmFsZWRGaWxlIG1ha2VKb3VybmFsZWRGaWxlKCkgewogICAgICAgICBmaW5hbCBTdHJpbmcgYmFzZSA9ICIvZGF0YS9zeXN0ZW0vZGV2aWNlX3BvbGljaWVzLnhtbCI7CiAgICAgICAgIHJldHVybiBuZXcgSm91cm5hbGVkRmlsZShuZXcgRmlsZShiYXNlKSwgbmV3IEZpbGUoYmFzZSArICIudG1wIikpOwpAQCAtMzMxLDcgKzQxNCw3IEBACiAgICAgICAgICAgICBvdXQuc3RhcnREb2N1bWVudChudWxsLCB0cnVlKTsKIAogICAgICAgICAgICAgb3V0LnN0YXJ0VGFnKG51bGwsICJwb2xpY2llcyIpOwotICAgICAgICAgICAgCisKICAgICAgICAgICAgIGZpbmFsIGludCBOID0gbUFkbWluTGlzdC5zaXplKCk7CiAgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8TjsgaSsrKSB7CiAgICAgICAgICAgICAgICAgQWN0aXZlQWRtaW4gYXAgPSBtQWRtaW5MaXN0LmdldChpKTsKQEAgLTM0MiwyNiArNDI1LDM2IEBACiAgICAgICAgICAgICAgICAgICAgIG91dC5lbmRUYWcobnVsbCwgImFkbWluIik7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotICAgICAgICAgICAgCisKICAgICAgICAgICAgIGlmIChtUGFzc3dvcmRPd25lciA+PSAwKSB7CiAgICAgICAgICAgICAgICAgb3V0LnN0YXJ0VGFnKG51bGwsICJwYXNzd29yZC1vd25lciIpOwogICAgICAgICAgICAgICAgIG91dC5hdHRyaWJ1dGUobnVsbCwgInZhbHVlIiwgSW50ZWdlci50b1N0cmluZyhtUGFzc3dvcmRPd25lcikpOwogICAgICAgICAgICAgICAgIG91dC5lbmRUYWcobnVsbCwgInBhc3N3b3JkLW93bmVyIik7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAKKwogICAgICAgICAgICAgaWYgKG1GYWlsZWRQYXNzd29yZEF0dGVtcHRzICE9IDApIHsKICAgICAgICAgICAgICAgICBvdXQuc3RhcnRUYWcobnVsbCwgImZhaWxlZC1wYXNzd29yZC1hdHRlbXB0cyIpOwogICAgICAgICAgICAgICAgIG91dC5hdHRyaWJ1dGUobnVsbCwgInZhbHVlIiwgSW50ZWdlci50b1N0cmluZyhtRmFpbGVkUGFzc3dvcmRBdHRlbXB0cykpOwogICAgICAgICAgICAgICAgIG91dC5lbmRUYWcobnVsbCwgImZhaWxlZC1wYXNzd29yZC1hdHRlbXB0cyIpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAobUFjdGl2ZVBhc3N3b3JkUXVhbGl0eSAhPSAwIHx8IG1BY3RpdmVQYXNzd29yZExlbmd0aCAhPSAwKSB7CisKKyAgICAgICAgICAgIGlmIChtQWN0aXZlUGFzc3dvcmRRdWFsaXR5ICE9IDAgfHwgbUFjdGl2ZVBhc3N3b3JkTGVuZ3RoICE9IDAKKyAgICAgICAgICAgICAgICAgICAgfHwgbUFjdGl2ZVBhc3N3b3JkVXBwZXJDYXNlICE9IDAgfHwgbUFjdGl2ZVBhc3N3b3JkTG93ZXJDYXNlICE9IDAKKyAgICAgICAgICAgICAgICAgICAgfHwgbUFjdGl2ZVBhc3N3b3JkTGV0dGVycyAhPSAwIHx8IG1BY3RpdmVQYXNzd29yZE51bWVyaWMgIT0gMAorICAgICAgICAgICAgICAgICAgICB8fCBtQWN0aXZlUGFzc3dvcmRTeW1ib2xzICE9IDAgfHwgbUFjdGl2ZVBhc3N3b3JkTm9uTGV0dGVyICE9IDApIHsKICAgICAgICAgICAgICAgICBvdXQuc3RhcnRUYWcobnVsbCwgImFjdGl2ZS1wYXNzd29yZCIpOwogICAgICAgICAgICAgICAgIG91dC5hdHRyaWJ1dGUobnVsbCwgInF1YWxpdHkiLCBJbnRlZ2VyLnRvU3RyaW5nKG1BY3RpdmVQYXNzd29yZFF1YWxpdHkpKTsKICAgICAgICAgICAgICAgICBvdXQuYXR0cmlidXRlKG51bGwsICJsZW5ndGgiLCBJbnRlZ2VyLnRvU3RyaW5nKG1BY3RpdmVQYXNzd29yZExlbmd0aCkpOworICAgICAgICAgICAgICAgIG91dC5hdHRyaWJ1dGUobnVsbCwgInVwcGVyY2FzZSIsIEludGVnZXIudG9TdHJpbmcobUFjdGl2ZVBhc3N3b3JkVXBwZXJDYXNlKSk7CisgICAgICAgICAgICAgICAgb3V0LmF0dHJpYnV0ZShudWxsLCAibG93ZXJjYXNlIiwgSW50ZWdlci50b1N0cmluZyhtQWN0aXZlUGFzc3dvcmRMb3dlckNhc2UpKTsKKyAgICAgICAgICAgICAgICBvdXQuYXR0cmlidXRlKG51bGwsICJsZXR0ZXJzIiwgSW50ZWdlci50b1N0cmluZyhtQWN0aXZlUGFzc3dvcmRMZXR0ZXJzKSk7CisgICAgICAgICAgICAgICAgb3V0LmF0dHJpYnV0ZShudWxsLCAibnVtZXJpYyIsIEludGVnZXIKKyAgICAgICAgICAgICAgICAgICAgICAgIC50b1N0cmluZyhtQWN0aXZlUGFzc3dvcmROdW1lcmljKSk7CisgICAgICAgICAgICAgICAgb3V0LmF0dHJpYnV0ZShudWxsLCAic3ltYm9scyIsIEludGVnZXIudG9TdHJpbmcobUFjdGl2ZVBhc3N3b3JkU3ltYm9scykpOworICAgICAgICAgICAgICAgIG91dC5hdHRyaWJ1dGUobnVsbCwgIm5vbmxldHRlciIsIEludGVnZXIudG9TdHJpbmcobUFjdGl2ZVBhc3N3b3JkTm9uTGV0dGVyKSk7CiAgICAgICAgICAgICAgICAgb3V0LmVuZFRhZyhudWxsLCAiYWN0aXZlLXBhc3N3b3JkIik7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAKKwogICAgICAgICAgICAgb3V0LmVuZFRhZyhudWxsLCAicG9saWNpZXMiKTsKIAogICAgICAgICAgICAgb3V0LmVuZERvY3VtZW50KCk7CkBAIC00MzksNiArNTMyLDE4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VyLmdldEF0dHJpYnV0ZVZhbHVlKG51bGwsICJxdWFsaXR5IikpOwogICAgICAgICAgICAgICAgICAgICBtQWN0aXZlUGFzc3dvcmRMZW5ndGggPSBJbnRlZ2VyLnBhcnNlSW50KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZShudWxsLCAibGVuZ3RoIikpOworICAgICAgICAgICAgICAgICAgICBtQWN0aXZlUGFzc3dvcmRVcHBlckNhc2UgPSBJbnRlZ2VyLnBhcnNlSW50KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZShudWxsLCAidXBwZXJjYXNlIikpOworICAgICAgICAgICAgICAgICAgICBtQWN0aXZlUGFzc3dvcmRMb3dlckNhc2UgPSBJbnRlZ2VyLnBhcnNlSW50KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZShudWxsLCAibG93ZXJjYXNlIikpOworICAgICAgICAgICAgICAgICAgICBtQWN0aXZlUGFzc3dvcmRMZXR0ZXJzID0gSW50ZWdlci5wYXJzZUludCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUobnVsbCwgImxldHRlcnMiKSk7CisgICAgICAgICAgICAgICAgICAgIG1BY3RpdmVQYXNzd29yZE51bWVyaWMgPSBJbnRlZ2VyLnBhcnNlSW50KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZShudWxsLCAibnVtZXJpYyIpKTsKKyAgICAgICAgICAgICAgICAgICAgbUFjdGl2ZVBhc3N3b3JkU3ltYm9scyA9IEludGVnZXIucGFyc2VJbnQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VyLmdldEF0dHJpYnV0ZVZhbHVlKG51bGwsICJzeW1ib2xzIikpOworICAgICAgICAgICAgICAgICAgICBtQWN0aXZlUGFzc3dvcmROb25MZXR0ZXIgPSBJbnRlZ2VyLnBhcnNlSW50KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZShudWxsLCAibm9ubGV0dGVyIikpOwogICAgICAgICAgICAgICAgICAgICBYbWxVdGlscy5za2lwQ3VycmVudFRhZyhwYXJzZXIpOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIFNsb2cudyhUQUcsICJVbmtub3duIHRhZzogIiArIHRhZyk7CkBAIC00NzYsMTAgKzU4MSwxNiBAQAogICAgICAgICAgICAgICAgICAgICArIEludGVnZXIudG9IZXhTdHJpbmcodXRpbHMuZ2V0QWN0aXZlUGFzc3dvcmRRdWFsaXR5KCkpKTsKICAgICAgICAgICAgIG1BY3RpdmVQYXNzd29yZFF1YWxpdHkgPSBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfVU5TUEVDSUZJRUQ7CiAgICAgICAgICAgICBtQWN0aXZlUGFzc3dvcmRMZW5ndGggPSAwOworICAgICAgICAgICAgbUFjdGl2ZVBhc3N3b3JkVXBwZXJDYXNlID0gMDsKKyAgICAgICAgICAgIG1BY3RpdmVQYXNzd29yZExvd2VyQ2FzZSA9IDA7CisgICAgICAgICAgICBtQWN0aXZlUGFzc3dvcmRMZXR0ZXJzID0gMDsKKyAgICAgICAgICAgIG1BY3RpdmVQYXNzd29yZE51bWVyaWMgPSAwOworICAgICAgICAgICAgbUFjdGl2ZVBhc3N3b3JkU3ltYm9scyA9IDA7CisgICAgICAgICAgICBtQWN0aXZlUGFzc3dvcmROb25MZXR0ZXIgPSAwOwogICAgICAgICB9Ci0gICAgICAgIAorCiAgICAgICAgIHZhbGlkYXRlUGFzc3dvcmRPd25lckxvY2tlZCgpOwotICAgICAgICAKKwogICAgICAgICBsb25nIHRpbWVNcyA9IGdldE1heGltdW1UaW1lVG9Mb2NrKG51bGwpOwogICAgICAgICBpZiAodGltZU1zIDw9IDApIHsKICAgICAgICAgICAgIHRpbWVNcyA9IEludGVnZXIuTUFYX1ZBTFVFOwpAQCAtNDk4LDEyICs2MDksMTMgQEAKICAgICAgICAgICAgIGNhc2UgRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX05VTUVSSUM6CiAgICAgICAgICAgICBjYXNlIERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9BTFBIQUJFVElDOgogICAgICAgICAgICAgY2FzZSBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfQUxQSEFOVU1FUklDOgorICAgICAgICAgICAgY2FzZSBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfQ09NUExFWDoKICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCBxdWFsaXR5IGNvbnN0YW50OiAweCIKICAgICAgICAgICAgICAgICArIEludGVnZXIudG9IZXhTdHJpbmcocXVhbGl0eSkpOwogICAgIH0KLSAgICAKKwogICAgIHZvaWQgdmFsaWRhdGVQYXNzd29yZE93bmVyTG9ja2VkKCkgewogICAgICAgICBpZiAobVBhc3N3b3JkT3duZXIgPj0gMCkgewogICAgICAgICAgICAgYm9vbGVhbiBoYXZlT3duZXIgPSBmYWxzZTsKQEAgLTUyMCwxNyArNjMyLDE3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICBwdWJsaWMgdm9pZCBzeXN0ZW1SZWFkeSgpIHsKICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CiAgICAgICAgICAgICBsb2FkU2V0dGluZ3NMb2NrZWQoKTsKICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIHB1YmxpYyB2b2lkIHNldEFjdGl2ZUFkbWluKENvbXBvbmVudE5hbWUgYWRtaW5SZWNlaXZlcikgewogICAgICAgICBtQ29udGV4dC5lbmZvcmNlQ2FsbGluZ09yU2VsZlBlcm1pc3Npb24oCiAgICAgICAgICAgICAgICAgYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJJTkRfREVWSUNFX0FETUlOLCBudWxsKTsKLSAgICAgICAgCisKICAgICAgICAgRGV2aWNlQWRtaW5JbmZvIGluZm8gPSBmaW5kQWRtaW4oYWRtaW5SZWNlaXZlcik7CiAgICAgICAgIGlmIChpbmZvID09IG51bGwpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkJhZCBhZG1pbjogIiArIGFkbWluUmVjZWl2ZXIpOwpAQCAtNTUyLDEzICs2NjQsMTMgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIHB1YmxpYyBib29sZWFuIGlzQWRtaW5BY3RpdmUoQ29tcG9uZW50TmFtZSBhZG1pblJlY2VpdmVyKSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewogICAgICAgICAgICAgcmV0dXJuIGdldEFjdGl2ZUFkbWluVW5jaGVja2VkTG9ja2VkKGFkbWluUmVjZWl2ZXIpICE9IG51bGw7CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICBwdWJsaWMgTGlzdDxDb21wb25lbnROYW1lPiBnZXRBY3RpdmVBZG1pbnMoKSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewogICAgICAgICAgICAgZmluYWwgaW50IE4gPSBtQWRtaW5MaXN0LnNpemUoKTsKQEAgLTU3Miw3ICs2ODQsNyBAQAogICAgICAgICAgICAgcmV0dXJuIHJlczsKICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIHB1YmxpYyBib29sZWFuIHBhY2thZ2VIYXNBY3RpdmVBZG1pbnMoU3RyaW5nIHBhY2thZ2VOYW1lKSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewogICAgICAgICAgICAgZmluYWwgaW50IE4gPSBtQWRtaW5MaXN0LnNpemUoKTsKQEAgLTU4NCw3ICs2OTYsNyBAQAogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgcHVibGljIHZvaWQgcmVtb3ZlQWN0aXZlQWRtaW4oQ29tcG9uZW50TmFtZSBhZG1pblJlY2VpdmVyKSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewogICAgICAgICAgICAgQWN0aXZlQWRtaW4gYWRtaW4gPSBnZXRBY3RpdmVBZG1pblVuY2hlY2tlZExvY2tlZChhZG1pblJlY2VpdmVyKTsKQEAgLTYwMywxMCArNzE1LDEwIEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICBwdWJsaWMgdm9pZCBzZXRQYXNzd29yZFF1YWxpdHkoQ29tcG9uZW50TmFtZSB3aG8sIGludCBxdWFsaXR5KSB7CiAgICAgICAgIHZhbGlkYXRlUXVhbGl0eUNvbnN0YW50KHF1YWxpdHkpOwotICAgICAgICAKKwogICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKICAgICAgICAgICAgIGlmICh3aG8gPT0gbnVsbCkgewogICAgICAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiQ29tcG9uZW50TmFtZSBpcyBudWxsIik7CkBAIC02MTksMTYgKzczMSwxNiBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgcHVibGljIGludCBnZXRQYXNzd29yZFF1YWxpdHkoQ29tcG9uZW50TmFtZSB3aG8pIHsKICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CiAgICAgICAgICAgICBpbnQgbW9kZSA9IERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9VTlNQRUNJRklFRDsKLSAgICAgICAgICAgIAorCiAgICAgICAgICAgICBpZiAod2hvICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICBBY3RpdmVBZG1pbiBhZG1pbiA9IGdldEFjdGl2ZUFkbWluVW5jaGVja2VkTG9ja2VkKHdobyk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGFkbWluICE9IG51bGwgPyBhZG1pbi5wYXNzd29yZFF1YWxpdHkgOiBtb2RlOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgCisKICAgICAgICAgICAgIGZpbmFsIGludCBOID0gbUFkbWluTGlzdC5zaXplKCk7CiAgICAgICAgICAgICBmb3IgIChpbnQgaT0wOyBpPE47IGkrKykgewogICAgICAgICAgICAgICAgIEFjdGl2ZUFkbWluIGFkbWluID0gbUFkbWluTGlzdC5nZXQoaSk7CkBAIC02MzksNyArNzUxLDcgQEAKICAgICAgICAgICAgIHJldHVybiBtb2RlOwogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgcHVibGljIHZvaWQgc2V0UGFzc3dvcmRNaW5pbXVtTGVuZ3RoKENvbXBvbmVudE5hbWUgd2hvLCBpbnQgbGVuZ3RoKSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewogICAgICAgICAgICAgaWYgKHdobyA9PSBudWxsKSB7CkBAIC02NTMsMTYgKzc2NSwxNiBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgcHVibGljIGludCBnZXRQYXNzd29yZE1pbmltdW1MZW5ndGgoQ29tcG9uZW50TmFtZSB3aG8pIHsKICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CiAgICAgICAgICAgICBpbnQgbGVuZ3RoID0gMDsKLSAgICAgICAgICAgIAorCiAgICAgICAgICAgICBpZiAod2hvICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICBBY3RpdmVBZG1pbiBhZG1pbiA9IGdldEFjdGl2ZUFkbWluVW5jaGVja2VkTG9ja2VkKHdobyk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGFkbWluICE9IG51bGwgPyBhZG1pbi5taW5pbXVtUGFzc3dvcmRMZW5ndGggOiBsZW5ndGg7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAKKwogICAgICAgICAgICAgZmluYWwgaW50IE4gPSBtQWRtaW5MaXN0LnNpemUoKTsKICAgICAgICAgICAgIGZvciAgKGludCBpPTA7IGk8TjsgaSsrKSB7CiAgICAgICAgICAgICAgICAgQWN0aXZlQWRtaW4gYWRtaW4gPSBtQWRtaW5MaXN0LmdldChpKTsKQEAgLTY3MywxOCArNzg1LDI2NyBAQAogICAgICAgICAgICAgcmV0dXJuIGxlbmd0aDsKICAgICAgICAgfQogICAgIH0KLSAgICAKKworICAgIHB1YmxpYyB2b2lkIHNldFBhc3N3b3JkSGlzdG9yeUxlbmd0aChDb21wb25lbnROYW1lIHdobywgaW50IGxlbmd0aCkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIGlmICh3aG8gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiQ29tcG9uZW50TmFtZSBpcyBudWxsIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBY3RpdmVBZG1pbiBhcCA9IGdldEFjdGl2ZUFkbWluRm9yQ2FsbGVyTG9ja2VkKHdobywKKyAgICAgICAgICAgICAgICAgICAgRGV2aWNlQWRtaW5JbmZvLlVTRVNfUE9MSUNZX0xJTUlUX1BBU1NXT1JEKTsKKyAgICAgICAgICAgIGlmIChhcC5wYXNzd29yZEhpc3RvcnlMZW5ndGggIT0gbGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgYXAucGFzc3dvcmRIaXN0b3J5TGVuZ3RoID0gbGVuZ3RoOworICAgICAgICAgICAgICAgIHNhdmVTZXR0aW5nc0xvY2tlZCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRQYXNzd29yZEhpc3RvcnlMZW5ndGgoQ29tcG9uZW50TmFtZSB3aG8pIHsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICBpbnQgbGVuZ3RoID0gMDsKKworICAgICAgICAgICAgaWYgKHdobyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgQWN0aXZlQWRtaW4gYWRtaW4gPSBnZXRBY3RpdmVBZG1pblVuY2hlY2tlZExvY2tlZCh3aG8pOworICAgICAgICAgICAgICAgIHJldHVybiBhZG1pbiAhPSBudWxsID8gYWRtaW4ucGFzc3dvcmRIaXN0b3J5TGVuZ3RoIDogbGVuZ3RoOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmaW5hbCBpbnQgTiA9IG1BZG1pbkxpc3Quc2l6ZSgpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOOyBpKyspIHsKKyAgICAgICAgICAgICAgICBBY3RpdmVBZG1pbiBhZG1pbiA9IG1BZG1pbkxpc3QuZ2V0KGkpOworICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPCBhZG1pbi5wYXNzd29yZEhpc3RvcnlMZW5ndGgpIHsKKyAgICAgICAgICAgICAgICAgICAgbGVuZ3RoID0gYWRtaW4ucGFzc3dvcmRIaXN0b3J5TGVuZ3RoOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBsZW5ndGg7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRQYXNzd29yZE1pbmltdW1VcHBlckNhc2UoQ29tcG9uZW50TmFtZSB3aG8sIGludCBsZW5ndGgpIHsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICBpZiAod2hvID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIkNvbXBvbmVudE5hbWUgaXMgbnVsbCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQWN0aXZlQWRtaW4gYXAgPSBnZXRBY3RpdmVBZG1pbkZvckNhbGxlckxvY2tlZCh3aG8sCisgICAgICAgICAgICAgICAgICAgIERldmljZUFkbWluSW5mby5VU0VTX1BPTElDWV9MSU1JVF9QQVNTV09SRCk7CisgICAgICAgICAgICBpZiAoYXAubWluaW11bVBhc3N3b3JkVXBwZXJDYXNlICE9IGxlbmd0aCkgeworICAgICAgICAgICAgICAgIGFwLm1pbmltdW1QYXNzd29yZFVwcGVyQ2FzZSA9IGxlbmd0aDsKKyAgICAgICAgICAgICAgICBzYXZlU2V0dGluZ3NMb2NrZWQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0UGFzc3dvcmRNaW5pbXVtVXBwZXJDYXNlKENvbXBvbmVudE5hbWUgd2hvKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgaW50IGxlbmd0aCA9IDA7CisKKyAgICAgICAgICAgIGlmICh3aG8gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIEFjdGl2ZUFkbWluIGFkbWluID0gZ2V0QWN0aXZlQWRtaW5VbmNoZWNrZWRMb2NrZWQod2hvKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gYWRtaW4gIT0gbnVsbCA/IGFkbWluLm1pbmltdW1QYXNzd29yZFVwcGVyQ2FzZSA6IGxlbmd0aDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZmluYWwgaW50IE4gPSBtQWRtaW5MaXN0LnNpemUoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxOOyBpKyspIHsKKyAgICAgICAgICAgICAgICBBY3RpdmVBZG1pbiBhZG1pbiA9IG1BZG1pbkxpc3QuZ2V0KGkpOworICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPCBhZG1pbi5taW5pbXVtUGFzc3dvcmRVcHBlckNhc2UpIHsKKyAgICAgICAgICAgICAgICAgICAgbGVuZ3RoID0gYWRtaW4ubWluaW11bVBhc3N3b3JkVXBwZXJDYXNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBsZW5ndGg7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRQYXNzd29yZE1pbmltdW1Mb3dlckNhc2UoQ29tcG9uZW50TmFtZSB3aG8sIGludCBsZW5ndGgpIHsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICBpZiAod2hvID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIkNvbXBvbmVudE5hbWUgaXMgbnVsbCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQWN0aXZlQWRtaW4gYXAgPSBnZXRBY3RpdmVBZG1pbkZvckNhbGxlckxvY2tlZCh3aG8sCisgICAgICAgICAgICAgICAgICAgIERldmljZUFkbWluSW5mby5VU0VTX1BPTElDWV9MSU1JVF9QQVNTV09SRCk7CisgICAgICAgICAgICBpZiAoYXAubWluaW11bVBhc3N3b3JkTG93ZXJDYXNlICE9IGxlbmd0aCkgeworICAgICAgICAgICAgICAgIGFwLm1pbmltdW1QYXNzd29yZExvd2VyQ2FzZSA9IGxlbmd0aDsKKyAgICAgICAgICAgICAgICBzYXZlU2V0dGluZ3NMb2NrZWQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0UGFzc3dvcmRNaW5pbXVtTG93ZXJDYXNlKENvbXBvbmVudE5hbWUgd2hvKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgaW50IGxlbmd0aCA9IDA7CisKKyAgICAgICAgICAgIGlmICh3aG8gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIEFjdGl2ZUFkbWluIGFkbWluID0gZ2V0QWN0aXZlQWRtaW5VbmNoZWNrZWRMb2NrZWQod2hvKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gYWRtaW4gIT0gbnVsbCA/IGFkbWluLm1pbmltdW1QYXNzd29yZExvd2VyQ2FzZSA6IGxlbmd0aDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZmluYWwgaW50IE4gPSBtQWRtaW5MaXN0LnNpemUoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxOOyBpKyspIHsKKyAgICAgICAgICAgICAgICBBY3RpdmVBZG1pbiBhZG1pbiA9IG1BZG1pbkxpc3QuZ2V0KGkpOworICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPCBhZG1pbi5taW5pbXVtUGFzc3dvcmRMb3dlckNhc2UpIHsKKyAgICAgICAgICAgICAgICAgICAgbGVuZ3RoID0gYWRtaW4ubWluaW11bVBhc3N3b3JkTG93ZXJDYXNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBsZW5ndGg7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRQYXNzd29yZE1pbmltdW1MZXR0ZXJzKENvbXBvbmVudE5hbWUgd2hvLCBpbnQgbGVuZ3RoKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgaWYgKHdobyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJDb21wb25lbnROYW1lIGlzIG51bGwiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFjdGl2ZUFkbWluIGFwID0gZ2V0QWN0aXZlQWRtaW5Gb3JDYWxsZXJMb2NrZWQod2hvLAorICAgICAgICAgICAgICAgICAgICBEZXZpY2VBZG1pbkluZm8uVVNFU19QT0xJQ1lfTElNSVRfUEFTU1dPUkQpOworICAgICAgICAgICAgaWYgKGFwLm1pbmltdW1QYXNzd29yZExldHRlcnMgIT0gbGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgYXAubWluaW11bVBhc3N3b3JkTGV0dGVycyA9IGxlbmd0aDsKKyAgICAgICAgICAgICAgICBzYXZlU2V0dGluZ3NMb2NrZWQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0UGFzc3dvcmRNaW5pbXVtTGV0dGVycyhDb21wb25lbnROYW1lIHdobykgeworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIGludCBsZW5ndGggPSAwOworCisgICAgICAgICAgICBpZiAod2hvICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBBY3RpdmVBZG1pbiBhZG1pbiA9IGdldEFjdGl2ZUFkbWluVW5jaGVja2VkTG9ja2VkKHdobyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGFkbWluICE9IG51bGwgPyBhZG1pbi5taW5pbXVtUGFzc3dvcmRMZXR0ZXJzIDogbGVuZ3RoOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmaW5hbCBpbnQgTiA9IG1BZG1pbkxpc3Quc2l6ZSgpOworICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPE47IGkrKykgeworICAgICAgICAgICAgICAgIEFjdGl2ZUFkbWluIGFkbWluID0gbUFkbWluTGlzdC5nZXQoaSk7CisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA8IGFkbWluLm1pbmltdW1QYXNzd29yZExldHRlcnMpIHsKKyAgICAgICAgICAgICAgICAgICAgbGVuZ3RoID0gYWRtaW4ubWluaW11bVBhc3N3b3JkTGV0dGVyczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbGVuZ3RoOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UGFzc3dvcmRNaW5pbXVtTnVtZXJpYyhDb21wb25lbnROYW1lIHdobywgaW50IGxlbmd0aCkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIGlmICh3aG8gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiQ29tcG9uZW50TmFtZSBpcyBudWxsIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBY3RpdmVBZG1pbiBhcCA9IGdldEFjdGl2ZUFkbWluRm9yQ2FsbGVyTG9ja2VkKHdobywKKyAgICAgICAgICAgICAgICAgICAgRGV2aWNlQWRtaW5JbmZvLlVTRVNfUE9MSUNZX0xJTUlUX1BBU1NXT1JEKTsKKyAgICAgICAgICAgIGlmIChhcC5taW5pbXVtUGFzc3dvcmROdW1lcmljICE9IGxlbmd0aCkgeworICAgICAgICAgICAgICAgIGFwLm1pbmltdW1QYXNzd29yZE51bWVyaWMgPSBsZW5ndGg7CisgICAgICAgICAgICAgICAgc2F2ZVNldHRpbmdzTG9ja2VkKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFBhc3N3b3JkTWluaW11bU51bWVyaWMoQ29tcG9uZW50TmFtZSB3aG8pIHsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICBpbnQgbGVuZ3RoID0gMDsKKworICAgICAgICAgICAgaWYgKHdobyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgQWN0aXZlQWRtaW4gYWRtaW4gPSBnZXRBY3RpdmVBZG1pblVuY2hlY2tlZExvY2tlZCh3aG8pOworICAgICAgICAgICAgICAgIHJldHVybiBhZG1pbiAhPSBudWxsID8gYWRtaW4ubWluaW11bVBhc3N3b3JkTnVtZXJpYyA6IGxlbmd0aDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZmluYWwgaW50IE4gPSBtQWRtaW5MaXN0LnNpemUoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTjsgaSsrKSB7CisgICAgICAgICAgICAgICAgQWN0aXZlQWRtaW4gYWRtaW4gPSBtQWRtaW5MaXN0LmdldChpKTsKKyAgICAgICAgICAgICAgICBpZiAobGVuZ3RoIDwgYWRtaW4ubWluaW11bVBhc3N3b3JkTnVtZXJpYykgeworICAgICAgICAgICAgICAgICAgICBsZW5ndGggPSBhZG1pbi5taW5pbXVtUGFzc3dvcmROdW1lcmljOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBsZW5ndGg7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRQYXNzd29yZE1pbmltdW1TeW1ib2xzKENvbXBvbmVudE5hbWUgd2hvLCBpbnQgbGVuZ3RoKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgaWYgKHdobyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJDb21wb25lbnROYW1lIGlzIG51bGwiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFjdGl2ZUFkbWluIGFwID0gZ2V0QWN0aXZlQWRtaW5Gb3JDYWxsZXJMb2NrZWQod2hvLAorICAgICAgICAgICAgICAgICAgICBEZXZpY2VBZG1pbkluZm8uVVNFU19QT0xJQ1lfTElNSVRfUEFTU1dPUkQpOworICAgICAgICAgICAgaWYgKGFwLm1pbmltdW1QYXNzd29yZFN5bWJvbHMgIT0gbGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgYXAubWluaW11bVBhc3N3b3JkU3ltYm9scyA9IGxlbmd0aDsKKyAgICAgICAgICAgICAgICBzYXZlU2V0dGluZ3NMb2NrZWQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0UGFzc3dvcmRNaW5pbXVtU3ltYm9scyhDb21wb25lbnROYW1lIHdobykgeworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIGludCBsZW5ndGggPSAwOworCisgICAgICAgICAgICBpZiAod2hvICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBBY3RpdmVBZG1pbiBhZG1pbiA9IGdldEFjdGl2ZUFkbWluVW5jaGVja2VkTG9ja2VkKHdobyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGFkbWluICE9IG51bGwgPyBhZG1pbi5taW5pbXVtUGFzc3dvcmRTeW1ib2xzIDogbGVuZ3RoOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmaW5hbCBpbnQgTiA9IG1BZG1pbkxpc3Quc2l6ZSgpOworICAgICAgICAgICAgZm9yICAoaW50IGk9MDsgaTxOOyBpKyspIHsKKyAgICAgICAgICAgICAgICBBY3RpdmVBZG1pbiBhZG1pbiA9IG1BZG1pbkxpc3QuZ2V0KGkpOworICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPCBhZG1pbi5taW5pbXVtUGFzc3dvcmRTeW1ib2xzKSB7CisgICAgICAgICAgICAgICAgICAgIGxlbmd0aCA9IGFkbWluLm1pbmltdW1QYXNzd29yZFN5bWJvbHM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGxlbmd0aDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFBhc3N3b3JkTWluaW11bU5vbkxldHRlcihDb21wb25lbnROYW1lIHdobywgaW50IGxlbmd0aCkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIGlmICh3aG8gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiQ29tcG9uZW50TmFtZSBpcyBudWxsIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBY3RpdmVBZG1pbiBhcCA9IGdldEFjdGl2ZUFkbWluRm9yQ2FsbGVyTG9ja2VkKHdobywKKyAgICAgICAgICAgICAgICAgICAgRGV2aWNlQWRtaW5JbmZvLlVTRVNfUE9MSUNZX0xJTUlUX1BBU1NXT1JEKTsKKyAgICAgICAgICAgIGlmIChhcC5taW5pbXVtUGFzc3dvcmROb25MZXR0ZXIgIT0gbGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgYXAubWluaW11bVBhc3N3b3JkTm9uTGV0dGVyID0gbGVuZ3RoOworICAgICAgICAgICAgICAgIHNhdmVTZXR0aW5nc0xvY2tlZCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRQYXNzd29yZE1pbmltdW1Ob25MZXR0ZXIoQ29tcG9uZW50TmFtZSB3aG8pIHsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICBpbnQgbGVuZ3RoID0gMDsKKworICAgICAgICAgICAgaWYgKHdobyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgQWN0aXZlQWRtaW4gYWRtaW4gPSBnZXRBY3RpdmVBZG1pblVuY2hlY2tlZExvY2tlZCh3aG8pOworICAgICAgICAgICAgICAgIHJldHVybiBhZG1pbiAhPSBudWxsID8gYWRtaW4ubWluaW11bVBhc3N3b3JkTm9uTGV0dGVyIDogbGVuZ3RoOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmaW5hbCBpbnQgTiA9IG1BZG1pbkxpc3Quc2l6ZSgpOworICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPE47IGkrKykgeworICAgICAgICAgICAgICAgIEFjdGl2ZUFkbWluIGFkbWluID0gbUFkbWluTGlzdC5nZXQoaSk7CisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA8IGFkbWluLm1pbmltdW1QYXNzd29yZE5vbkxldHRlcikgeworICAgICAgICAgICAgICAgICAgICBsZW5ndGggPSBhZG1pbi5taW5pbXVtUGFzc3dvcmROb25MZXR0ZXI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGxlbmd0aDsKKyAgICAgICAgfQorICAgIH0KKwogICAgIHB1YmxpYyBib29sZWFuIGlzQWN0aXZlUGFzc3dvcmRTdWZmaWNpZW50KCkgewogICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKICAgICAgICAgICAgIC8vIFRoaXMgQVBJIGNhbiBvbmx5IGJlIGNhbGxlZCBieSBhbiBhY3RpdmUgZGV2aWNlIGFkbWluLAogICAgICAgICAgICAgLy8gc28gdHJ5IHRvIHJldHJpZXZlIGl0IHRvIGNoZWNrIHRoYXQgdGhlIGNhbGxlciBpcyBvbmUuCiAgICAgICAgICAgICBnZXRBY3RpdmVBZG1pbkZvckNhbGxlckxvY2tlZChudWxsLAogICAgICAgICAgICAgICAgICAgICBEZXZpY2VBZG1pbkluZm8uVVNFU19QT0xJQ1lfTElNSVRfUEFTU1dPUkQpOwotICAgICAgICAgICAgcmV0dXJuIG1BY3RpdmVQYXNzd29yZFF1YWxpdHkgPj0gZ2V0UGFzc3dvcmRRdWFsaXR5KG51bGwpCi0gICAgICAgICAgICAgICAgICAgICYmIG1BY3RpdmVQYXNzd29yZExlbmd0aCA+PSBnZXRQYXNzd29yZE1pbmltdW1MZW5ndGgobnVsbCk7CisgICAgICAgICAgICBpZiAobUFjdGl2ZVBhc3N3b3JkUXVhbGl0eSA8IGdldFBhc3N3b3JkUXVhbGl0eShudWxsKQorICAgICAgICAgICAgICAgICAgICB8fCBtQWN0aXZlUGFzc3dvcmRMZW5ndGggPCBnZXRQYXNzd29yZE1pbmltdW1MZW5ndGgobnVsbCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZihtQWN0aXZlUGFzc3dvcmRRdWFsaXR5ICE9IERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9DT01QTEVYKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbUFjdGl2ZVBhc3N3b3JkVXBwZXJDYXNlID49IGdldFBhc3N3b3JkTWluaW11bVVwcGVyQ2FzZShudWxsKQorICAgICAgICAgICAgICAgICAgICAmJiBtQWN0aXZlUGFzc3dvcmRMb3dlckNhc2UgPj0gZ2V0UGFzc3dvcmRNaW5pbXVtTG93ZXJDYXNlKG51bGwpCisgICAgICAgICAgICAgICAgICAgICYmIG1BY3RpdmVQYXNzd29yZExldHRlcnMgPj0gZ2V0UGFzc3dvcmRNaW5pbXVtTGV0dGVycyhudWxsKQorICAgICAgICAgICAgICAgICAgICAmJiBtQWN0aXZlUGFzc3dvcmROdW1lcmljID49IGdldFBhc3N3b3JkTWluaW11bU51bWVyaWMobnVsbCkKKyAgICAgICAgICAgICAgICAgICAgJiYgbUFjdGl2ZVBhc3N3b3JkU3ltYm9scyA+PSBnZXRQYXNzd29yZE1pbmltdW1TeW1ib2xzKG51bGwpCisgICAgICAgICAgICAgICAgICAgICYmIG1BY3RpdmVQYXNzd29yZE5vbkxldHRlciA+PSBnZXRQYXNzd29yZE1pbmltdW1Ob25MZXR0ZXIobnVsbCk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICBwdWJsaWMgaW50IGdldEN1cnJlbnRGYWlsZWRQYXNzd29yZEF0dGVtcHRzKCkgewogICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKICAgICAgICAgICAgIC8vIFRoaXMgQVBJIGNhbiBvbmx5IGJlIGNhbGxlZCBieSBhbiBhY3RpdmUgZGV2aWNlIGFkbWluLApAQCAtNjk0LDcgKzEwNTUsNyBAQAogICAgICAgICAgICAgcmV0dXJuIG1GYWlsZWRQYXNzd29yZEF0dGVtcHRzOwogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgcHVibGljIHZvaWQgc2V0TWF4aW11bUZhaWxlZFBhc3N3b3Jkc0ZvcldpcGUoQ29tcG9uZW50TmFtZSB3aG8sIGludCBudW0pIHsKICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CiAgICAgICAgICAgICAvLyBUaGlzIEFQSSBjYW4gb25seSBiZSBjYWxsZWQgYnkgYW4gYWN0aXZlIGRldmljZSBhZG1pbiwKQEAgLTcwOSwxNiArMTA3MCwxNiBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgcHVibGljIGludCBnZXRNYXhpbXVtRmFpbGVkUGFzc3dvcmRzRm9yV2lwZShDb21wb25lbnROYW1lIHdobykgewogICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKICAgICAgICAgICAgIGludCBjb3VudCA9IDA7Ci0gICAgICAgICAgICAKKwogICAgICAgICAgICAgaWYgKHdobyAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgQWN0aXZlQWRtaW4gYWRtaW4gPSBnZXRBY3RpdmVBZG1pblVuY2hlY2tlZExvY2tlZCh3aG8pOwogICAgICAgICAgICAgICAgIHJldHVybiBhZG1pbiAhPSBudWxsID8gYWRtaW4ubWF4aW11bUZhaWxlZFBhc3N3b3Jkc0ZvcldpcGUgOiBjb3VudDsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAorCiAgICAgICAgICAgICBmaW5hbCBpbnQgTiA9IG1BZG1pbkxpc3Quc2l6ZSgpOwogICAgICAgICAgICAgZm9yICAoaW50IGk9MDsgaTxOOyBpKyspIHsKICAgICAgICAgICAgICAgICBBY3RpdmVBZG1pbiBhZG1pbiA9IG1BZG1pbkxpc3QuZ2V0KGkpOwpAQCAtNzMyLDcgKzEwOTMsNyBAQAogICAgICAgICAgICAgcmV0dXJuIGNvdW50OwogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgcHVibGljIGJvb2xlYW4gcmVzZXRQYXNzd29yZChTdHJpbmcgcGFzc3dvcmQsIGludCBmbGFncykgewogICAgICAgICBpbnQgcXVhbGl0eTsKICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CkBAIC03NDMsMTQgKzExMDQsMTUgQEAKICAgICAgICAgICAgIHF1YWxpdHkgPSBnZXRQYXNzd29yZFF1YWxpdHkobnVsbCk7CiAgICAgICAgICAgICBpZiAocXVhbGl0eSAhPSBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfVU5TUEVDSUZJRUQpIHsKICAgICAgICAgICAgICAgICBpbnQgcmVhbFF1YWxpdHkgPSBMb2NrUGF0dGVyblV0aWxzLmNvbXB1dGVQYXNzd29yZFF1YWxpdHkocGFzc3dvcmQpOwotICAgICAgICAgICAgICAgIGlmIChyZWFsUXVhbGl0eSA8IHF1YWxpdHkpIHsKKyAgICAgICAgICAgICAgICBpZiAocmVhbFF1YWxpdHkgPCBxdWFsaXR5CisgICAgICAgICAgICAgICAgICAgICAgICAmJiBxdWFsaXR5ICE9IERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9DT01QTEVYKSB7CiAgICAgICAgICAgICAgICAgICAgIFNsb2cudyhUQUcsICJyZXNldFBhc3N3b3JkOiBwYXNzd29yZCBxdWFsaXR5IDB4IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgSW50ZWdlci50b0hleFN0cmluZyhxdWFsaXR5KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBkb2VzIG5vdCBtZWV0IHJlcXVpcmVkIHF1YWxpdHkgMHgiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKHF1YWxpdHkpKTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBxdWFsaXR5ID0gcmVhbFF1YWxpdHk7CisgICAgICAgICAgICAgICAgcXVhbGl0eSA9IE1hdGgubWF4KHJlYWxRdWFsaXR5LCBxdWFsaXR5KTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGludCBsZW5ndGggPSBnZXRQYXNzd29yZE1pbmltdW1MZW5ndGgobnVsbCk7CiAgICAgICAgICAgICBpZiAocGFzc3dvcmQubGVuZ3RoKCkgPCBsZW5ndGgpIHsKQEAgLTc1OCwxNCArMTEyMCw4NiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGRvZXMgbm90IG1lZXQgcmVxdWlyZWQgbGVuZ3RoICIgKyBsZW5ndGgpOwogICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChxdWFsaXR5ID09IERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9DT01QTEVYKSB7CisgICAgICAgICAgICAgICAgaW50IGxldHRlcnMgPSAwOworICAgICAgICAgICAgICAgIGludCB1cHBlcmNhc2UgPSAwOworICAgICAgICAgICAgICAgIGludCBsb3dlcmNhc2UgPSAwOworICAgICAgICAgICAgICAgIGludCBudW1iZXJzID0gMDsKKyAgICAgICAgICAgICAgICBpbnQgc3ltYm9scyA9IDA7CisgICAgICAgICAgICAgICAgaW50IG5vbmxldHRlciA9IDA7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXNzd29yZC5sZW5ndGgoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGNoYXIgYyA9IHBhc3N3b3JkLmNoYXJBdChpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGMgPj0gJ0EnICYmIGMgPD0gJ1onKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsZXR0ZXJzKys7CisgICAgICAgICAgICAgICAgICAgICAgICB1cHBlcmNhc2UrKzsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjID49ICdhJyAmJiBjIDw9ICd6JykgeworICAgICAgICAgICAgICAgICAgICAgICAgbGV0dGVycysrOworICAgICAgICAgICAgICAgICAgICAgICAgbG93ZXJjYXNlKys7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYyA+PSAnMCcgJiYgYyA8PSAnOScpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG51bWJlcnMrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vbmxldHRlcisrOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgc3ltYm9scysrOworICAgICAgICAgICAgICAgICAgICAgICAgbm9ubGV0dGVyKys7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaW50IG5lZWRlZExldHRlcnMgPSBnZXRQYXNzd29yZE1pbmltdW1MZXR0ZXJzKG51bGwpOworICAgICAgICAgICAgICAgIGlmKGxldHRlcnMgPCBuZWVkZWRMZXR0ZXJzKSB7CisgICAgICAgICAgICAgICAgICAgIFNsb2cudyhUQUcsICJyZXNldFBhc3N3b3JkOiBudW1iZXIgb2YgbGV0dGVycyAiICsgbGV0dGVycworICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBkb2VzIG5vdCBtZWV0IHJlcXVpcmVkIG51bWJlciBvZiBsZXR0ZXJzICIgKyBuZWVkZWRMZXR0ZXJzKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpbnQgbmVlZGVkTnVtYmVycyA9IGdldFBhc3N3b3JkTWluaW11bU51bWVyaWMobnVsbCk7CisgICAgICAgICAgICAgICAgaWYgKG51bWJlcnMgPCBuZWVkZWROdW1iZXJzKSB7CisgICAgICAgICAgICAgICAgICAgIFNsb2cKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAudyhUQUcsICJyZXNldFBhc3N3b3JkOiBudW1iZXIgb2YgbnVtZXJpY2FsIGRpZ2l0cyAiICsgbnVtYmVycworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGRvZXMgbm90IG1lZXQgcmVxdWlyZWQgbnVtYmVyIG9mIG51bWVyaWNhbCBkaWdpdHMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBuZWVkZWROdW1iZXJzKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpbnQgbmVlZGVkTG93ZXJDYXNlID0gZ2V0UGFzc3dvcmRNaW5pbXVtTG93ZXJDYXNlKG51bGwpOworICAgICAgICAgICAgICAgIGlmIChsb3dlcmNhc2UgPCBuZWVkZWRMb3dlckNhc2UpIHsKKyAgICAgICAgICAgICAgICAgICAgU2xvZy53KFRBRywgInJlc2V0UGFzc3dvcmQ6IG51bWJlciBvZiBsb3dlcmNhc2UgbGV0dGVycyAiICsgbG93ZXJjYXNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGRvZXMgbm90IG1lZXQgcmVxdWlyZWQgbnVtYmVyIG9mIGxvd2VyY2FzZSBsZXR0ZXJzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG5lZWRlZExvd2VyQ2FzZSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaW50IG5lZWRlZFVwcGVyQ2FzZSA9IGdldFBhc3N3b3JkTWluaW11bVVwcGVyQ2FzZShudWxsKTsKKyAgICAgICAgICAgICAgICBpZiAodXBwZXJjYXNlIDwgbmVlZGVkVXBwZXJDYXNlKSB7CisgICAgICAgICAgICAgICAgICAgIFNsb2cudyhUQUcsICJyZXNldFBhc3N3b3JkOiBudW1iZXIgb2YgdXBwZXJjYXNlIGxldHRlcnMgIiArIHVwcGVyY2FzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBkb2VzIG5vdCBtZWV0IHJlcXVpcmVkIG51bWJlciBvZiB1cHBlcmNhc2UgbGV0dGVycyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBuZWVkZWRVcHBlckNhc2UpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGludCBuZWVkZWRTeW1ib2xzID0gZ2V0UGFzc3dvcmRNaW5pbXVtU3ltYm9scyhudWxsKTsKKyAgICAgICAgICAgICAgICBpZiAoc3ltYm9scyA8IG5lZWRlZFN5bWJvbHMpIHsKKyAgICAgICAgICAgICAgICAgICAgU2xvZy53KFRBRywgInJlc2V0UGFzc3dvcmQ6IG51bWJlciBvZiBzcGVjaWFsIHN5bWJvbHMgIiArIHN5bWJvbHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgZG9lcyBub3QgbWVldCByZXF1aXJlZCBudW1iZXIgb2Ygc3BlY2lhbCBzeW1ib2xzICIgKyBuZWVkZWRTeW1ib2xzKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpbnQgbmVlZGVkTm9uTGV0dGVyID0gZ2V0UGFzc3dvcmRNaW5pbXVtTm9uTGV0dGVyKG51bGwpOworICAgICAgICAgICAgICAgIGlmIChub25sZXR0ZXIgPCBuZWVkZWROb25MZXR0ZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgU2xvZy53KFRBRywgInJlc2V0UGFzc3dvcmQ6IG51bWJlciBvZiBub24tbGV0dGVyIGNoYXJhY3RlcnMgIiArIG5vbmxldHRlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBkb2VzIG5vdCBtZWV0IHJlcXVpcmVkIG51bWJlciBvZiBub24tbGV0dGVyIGNoYXJhY3RlcnMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbmVlZGVkTm9uTGV0dGVyKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgTG9ja1BhdHRlcm5VdGlscyB1dGlscyA9IG5ldyBMb2NrUGF0dGVyblV0aWxzKG1Db250ZXh0KTsKKyAgICAgICAgICAgIGlmKHV0aWxzLmNoZWNrUGFzc3dvcmRIaXN0b3J5KHBhc3N3b3JkKSkgeworICAgICAgICAgICAgICAgIFNsb2cudyhUQUcsICJyZXNldFBhc3N3b3JkOiBwYXNzd29yZCBpcyB0aGUgc2FtZSBhcyBvbmUgb2YgdGhlIGxhc3QgIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBnZXRQYXNzd29yZEhpc3RvcnlMZW5ndGgobnVsbCkgKyAiIHBhc3N3b3JkcyIpOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICAKKwogICAgICAgICBpbnQgY2FsbGluZ1VpZCA9IEJpbmRlci5nZXRDYWxsaW5nVWlkKCk7CiAgICAgICAgIGlmIChtUGFzc3dvcmRPd25lciA+PSAwICYmIG1QYXNzd29yZE93bmVyICE9IGNhbGxpbmdVaWQpIHsKICAgICAgICAgICAgIFNsb2cudyhUQUcsICJyZXNldFBhc3N3b3JkOiBhbHJlYWR5IHNldCBieSBhbm90aGVyIHVpZCBhbmQgbm90IGVudGVyZWQgYnkgdXNlciIpOwogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9Ci0gICAgICAgIAorCiAgICAgICAgIC8vIERvbid0IGRvIHRoaXMgd2l0aCB0aGUgbG9jayBoZWxkLCBiZWNhdXNlIGl0IGlzIGdvaW5nIHRvIGNhbGwKICAgICAgICAgLy8gYmFjayBpbiB0byB0aGUgc2VydmljZS4KICAgICAgICAgbG9uZyBpZGVudCA9IEJpbmRlci5jbGVhckNhbGxpbmdJZGVudGl0eSgpOwpAQCAtNzgzLDEwICsxMjE3LDEwIEBACiAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICBCaW5kZXIucmVzdG9yZUNhbGxpbmdJZGVudGl0eShpZGVudCk7CiAgICAgICAgIH0KLSAgICAgICAgCisKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQotICAgIAorCiAgICAgcHVibGljIHZvaWQgc2V0TWF4aW11bVRpbWVUb0xvY2soQ29tcG9uZW50TmFtZSB3aG8sIGxvbmcgdGltZU1zKSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewogICAgICAgICAgICAgaWYgKHdobyA9PSBudWxsKSB7CkBAIC03OTYsMTYgKzEyMzAsMTYgQEAKICAgICAgICAgICAgICAgICAgICAgRGV2aWNlQWRtaW5JbmZvLlVTRVNfUE9MSUNZX0ZPUkNFX0xPQ0spOwogICAgICAgICAgICAgaWYgKGFwLm1heGltdW1UaW1lVG9VbmxvY2sgIT0gdGltZU1zKSB7CiAgICAgICAgICAgICAgICAgYXAubWF4aW11bVRpbWVUb1VubG9jayA9IHRpbWVNczsKLSAgICAgICAgICAgICAgICAKKwogICAgICAgICAgICAgICAgIGxvbmcgaWRlbnQgPSBCaW5kZXIuY2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICBzYXZlU2V0dGluZ3NMb2NrZWQoKTsKLSAgICAgICAgICAgICAgICAgICAgCisKICAgICAgICAgICAgICAgICAgICAgdGltZU1zID0gZ2V0TWF4aW11bVRpbWVUb0xvY2sobnVsbCk7CiAgICAgICAgICAgICAgICAgICAgIGlmICh0aW1lTXMgPD0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgdGltZU1zID0gSW50ZWdlci5NQVhfVkFMVUU7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgCisKICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgIGdldElQb3dlck1hbmFnZXIoKS5zZXRNYXhpbXVtU2NyZWVuT2ZmVGltZW91bnQoKGludCl0aW1lTXMpOwogICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewpAQCAtODE3LDE2ICsxMjUxLDE2IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICBwdWJsaWMgbG9uZyBnZXRNYXhpbXVtVGltZVRvTG9jayhDb21wb25lbnROYW1lIHdobykgewogICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKICAgICAgICAgICAgIGxvbmcgdGltZSA9IDA7Ci0gICAgICAgICAgICAKKwogICAgICAgICAgICAgaWYgKHdobyAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgQWN0aXZlQWRtaW4gYWRtaW4gPSBnZXRBY3RpdmVBZG1pblVuY2hlY2tlZExvY2tlZCh3aG8pOwogICAgICAgICAgICAgICAgIHJldHVybiBhZG1pbiAhPSBudWxsID8gYWRtaW4ubWF4aW11bVRpbWVUb1VubG9jayA6IHRpbWU7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAKKwogICAgICAgICAgICAgZmluYWwgaW50IE4gPSBtQWRtaW5MaXN0LnNpemUoKTsKICAgICAgICAgICAgIGZvciAgKGludCBpPTA7IGk8TjsgaSsrKSB7CiAgICAgICAgICAgICAgICAgQWN0aXZlQWRtaW4gYWRtaW4gPSBtQWRtaW5MaXN0LmdldChpKTsKQEAgLTg0MCw3ICsxMjc0LDcgQEAKICAgICAgICAgICAgIHJldHVybiB0aW1lOwogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgcHVibGljIHZvaWQgbG9ja05vdygpIHsKICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CiAgICAgICAgICAgICAvLyBUaGlzIEFQSSBjYW4gb25seSBiZSBjYWxsZWQgYnkgYW4gYWN0aXZlIGRldmljZSBhZG1pbiwKQEAgLTg1Nyw3ICsxMjkxLDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIHZvaWQgd2lwZURhdGFMb2NrZWQoaW50IGZsYWdzKSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBSZWNvdmVyeVN5c3RlbS5yZWJvb3RXaXBlVXNlckRhdGEobUNvbnRleHQpOwpAQCAtODY1LDcgKzEyOTksNyBAQAogICAgICAgICAgICAgU2xvZy53KFRBRywgIkZhaWxlZCByZXF1ZXN0aW5nIGRhdGEgd2lwZSIsIGUpOwogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgcHVibGljIHZvaWQgd2lwZURhdGEoaW50IGZsYWdzKSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewogICAgICAgICAgICAgLy8gVGhpcyBBUEkgY2FuIG9ubHkgYmUgY2FsbGVkIGJ5IGFuIGFjdGl2ZSBkZXZpY2UgYWRtaW4sCkBAIC04ODAsMTEgKzEzMTQsMTEgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIHB1YmxpYyB2b2lkIGdldFJlbW92ZVdhcm5pbmcoQ29tcG9uZW50TmFtZSBjb21wLCBmaW5hbCBSZW1vdGVDYWxsYmFjayByZXN1bHQpIHsKICAgICAgICAgbUNvbnRleHQuZW5mb3JjZUNhbGxpbmdPclNlbGZQZXJtaXNzaW9uKAogICAgICAgICAgICAgICAgIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CSU5EX0RFVklDRV9BRE1JTiwgbnVsbCk7Ci0gICAgICAgIAorCiAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewogICAgICAgICAgICAgQWN0aXZlQWRtaW4gYWRtaW4gPSBnZXRBY3RpdmVBZG1pblVuY2hlY2tlZExvY2tlZChjb21wKTsKICAgICAgICAgICAgIGlmIChhZG1pbiA9PSBudWxsKSB7CkBAIC05MDcsMjAgKzEzNDEsMzAgQEAKICAgICAgICAgICAgIH0sIG51bGwsIEFjdGl2aXR5LlJFU1VMVF9PSywgbnVsbCwgbnVsbCk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0QWN0aXZlUGFzc3dvcmRTdGF0ZShpbnQgcXVhbGl0eSwgaW50IGxlbmd0aCkgeworCisgICAgcHVibGljIHZvaWQgc2V0QWN0aXZlUGFzc3dvcmRTdGF0ZShpbnQgcXVhbGl0eSwgaW50IGxlbmd0aCwgaW50IGxldHRlcnMsIGludCB1cHBlcmNhc2UsCisgICAgICAgICAgICBpbnQgbG93ZXJjYXNlLCBpbnQgbnVtYmVycywgaW50IHN5bWJvbHMsIGludCBub25sZXR0ZXIpIHsKICAgICAgICAgbUNvbnRleHQuZW5mb3JjZUNhbGxpbmdPclNlbGZQZXJtaXNzaW9uKAogICAgICAgICAgICAgICAgIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CSU5EX0RFVklDRV9BRE1JTiwgbnVsbCk7Ci0gICAgICAgIAorCiAgICAgICAgIHZhbGlkYXRlUXVhbGl0eUNvbnN0YW50KHF1YWxpdHkpOwotICAgICAgICAKKwogICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKICAgICAgICAgICAgIGlmIChtQWN0aXZlUGFzc3dvcmRRdWFsaXR5ICE9IHF1YWxpdHkgfHwgbUFjdGl2ZVBhc3N3b3JkTGVuZ3RoICE9IGxlbmd0aAotICAgICAgICAgICAgICAgICAgICB8fCBtRmFpbGVkUGFzc3dvcmRBdHRlbXB0cyAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHx8IG1GYWlsZWRQYXNzd29yZEF0dGVtcHRzICE9IDAgfHwgbUFjdGl2ZVBhc3N3b3JkTGV0dGVycyAhPSBsZXR0ZXJzCisgICAgICAgICAgICAgICAgICAgIHx8IG1BY3RpdmVQYXNzd29yZFVwcGVyQ2FzZSAhPSB1cHBlcmNhc2UKKyAgICAgICAgICAgICAgICAgICAgfHwgbUFjdGl2ZVBhc3N3b3JkTG93ZXJDYXNlICE9IGxvd2VyY2FzZSB8fCBtQWN0aXZlUGFzc3dvcmROdW1lcmljICE9IG51bWJlcnMKKyAgICAgICAgICAgICAgICAgICAgfHwgbUFjdGl2ZVBhc3N3b3JkU3ltYm9scyAhPSBzeW1ib2xzIHx8IG1BY3RpdmVQYXNzd29yZE5vbkxldHRlciAhPSBub25sZXR0ZXIpIHsKICAgICAgICAgICAgICAgICBsb25nIGlkZW50ID0gQmluZGVyLmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CiAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgbUFjdGl2ZVBhc3N3b3JkUXVhbGl0eSA9IHF1YWxpdHk7CiAgICAgICAgICAgICAgICAgICAgIG1BY3RpdmVQYXNzd29yZExlbmd0aCA9IGxlbmd0aDsKKyAgICAgICAgICAgICAgICAgICAgbUFjdGl2ZVBhc3N3b3JkTGV0dGVycyA9IGxldHRlcnM7CisgICAgICAgICAgICAgICAgICAgIG1BY3RpdmVQYXNzd29yZExvd2VyQ2FzZSA9IGxvd2VyY2FzZTsKKyAgICAgICAgICAgICAgICAgICAgbUFjdGl2ZVBhc3N3b3JkVXBwZXJDYXNlID0gdXBwZXJjYXNlOworICAgICAgICAgICAgICAgICAgICBtQWN0aXZlUGFzc3dvcmROdW1lcmljID0gbnVtYmVyczsKKyAgICAgICAgICAgICAgICAgICAgbUFjdGl2ZVBhc3N3b3JkU3ltYm9scyA9IHN5bWJvbHM7CisgICAgICAgICAgICAgICAgICAgIG1BY3RpdmVQYXNzd29yZE5vbkxldHRlciA9IG5vbmxldHRlcjsKICAgICAgICAgICAgICAgICAgICAgbUZhaWxlZFBhc3N3b3JkQXR0ZW1wdHMgPSAwOwogICAgICAgICAgICAgICAgICAgICBzYXZlU2V0dGluZ3NMb2NrZWQoKTsKICAgICAgICAgICAgICAgICAgICAgc2VuZEFkbWluQ29tbWFuZExvY2tlZChEZXZpY2VBZG1pblJlY2VpdmVyLkFDVElPTl9QQVNTV09SRF9DSEFOR0VELApAQCAtOTMxLDExICsxMzc1LDExIEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICBwdWJsaWMgdm9pZCByZXBvcnRGYWlsZWRQYXNzd29yZEF0dGVtcHQoKSB7CiAgICAgICAgIG1Db250ZXh0LmVuZm9yY2VDYWxsaW5nT3JTZWxmUGVybWlzc2lvbigKICAgICAgICAgICAgICAgICBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQklORF9ERVZJQ0VfQURNSU4sIG51bGwpOwotICAgICAgICAKKwogICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKICAgICAgICAgICAgIGxvbmcgaWRlbnQgPSBCaW5kZXIuY2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKICAgICAgICAgICAgIHRyeSB7CkBAIC05NTIsMTEgKzEzOTYsMTEgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIHB1YmxpYyB2b2lkIHJlcG9ydFN1Y2Nlc3NmdWxQYXNzd29yZEF0dGVtcHQoKSB7CiAgICAgICAgIG1Db250ZXh0LmVuZm9yY2VDYWxsaW5nT3JTZWxmUGVybWlzc2lvbigKICAgICAgICAgICAgICAgICBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQklORF9ERVZJQ0VfQURNSU4sIG51bGwpOwotICAgICAgICAKKwogICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKICAgICAgICAgICAgIGlmIChtRmFpbGVkUGFzc3dvcmRBdHRlbXB0cyAhPSAwIHx8IG1QYXNzd29yZE93bmVyID49IDApIHsKICAgICAgICAgICAgICAgICBsb25nIGlkZW50ID0gQmluZGVyLmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CkBAIC05NzIsNyArMTQxNiw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBkdW1wKEZpbGVEZXNjcmlwdG9yIGZkLCBQcmludFdyaXRlciBwdywgU3RyaW5nW10gYXJncykgewogICAgICAgICBpZiAobUNvbnRleHQuY2hlY2tDYWxsaW5nT3JTZWxmUGVybWlzc2lvbihhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uRFVNUCkKQEAgLTk4MywxMiArMTQyNywxMiBAQAogICAgICAgICAgICAgICAgICAgICArICIsIHVpZD0iICsgQmluZGVyLmdldENhbGxpbmdVaWQoKSk7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KLSAgICAgICAgCisKICAgICAgICAgZmluYWwgUHJpbnRlciBwID0gbmV3IFByaW50V3JpdGVyUHJpbnRlcihwdyk7Ci0gICAgICAgIAorCiAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewogICAgICAgICAgICAgcC5wcmludGxuKCJDdXJyZW50IERldmljZSBQb2xpY3kgTWFuYWdlciBzdGF0ZToiKTsKLSAgICAgICAgICAgIAorCiAgICAgICAgICAgICBwLnByaW50bG4oIiAgRW5hYmxlZCBEZXZpY2UgQWRtaW5zOiIpOwogICAgICAgICAgICAgZmluYWwgaW50IE4gPSBtQWRtaW5MaXN0LnNpemUoKTsKICAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxOOyBpKyspIHsKQEAgLTk5OSwxMSArMTQ0MywxNyBAQAogICAgICAgICAgICAgICAgICAgICBhcC5kdW1wKCIgICAgIiwgcHcpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAorCiAgICAgICAgICAgICBwdy5wcmludGxuKCIgIik7CiAgICAgICAgICAgICBwdy5wcmludCgiICBtQWN0aXZlUGFzc3dvcmRRdWFsaXR5PTB4Iik7CiAgICAgICAgICAgICAgICAgICAgIHB3LnByaW50bG4oSW50ZWdlci50b0hleFN0cmluZyhtQWN0aXZlUGFzc3dvcmRRdWFsaXR5KSk7CiAgICAgICAgICAgICBwdy5wcmludCgiICBtQWN0aXZlUGFzc3dvcmRMZW5ndGg9Iik7IHB3LnByaW50bG4obUFjdGl2ZVBhc3N3b3JkTGVuZ3RoKTsKKyAgICAgICAgICAgIHB3LnByaW50KCIgIG1BY3RpdmVQYXNzd29yZFVwcGVyQ2FzZT0iKTsgcHcucHJpbnRsbihtQWN0aXZlUGFzc3dvcmRVcHBlckNhc2UpOworICAgICAgICAgICAgcHcucHJpbnQoIiAgbUFjdGl2ZVBhc3N3b3JkTG93ZXJDYXNlPSIpOyBwdy5wcmludGxuKG1BY3RpdmVQYXNzd29yZExvd2VyQ2FzZSk7CisgICAgICAgICAgICBwdy5wcmludCgiICBtQWN0aXZlUGFzc3dvcmRMZXR0ZXJzPSIpOyBwdy5wcmludGxuKG1BY3RpdmVQYXNzd29yZExldHRlcnMpOworICAgICAgICAgICAgcHcucHJpbnQoIiAgbUFjdGl2ZVBhc3N3b3JkTnVtZXJpYz0iKTsgcHcucHJpbnRsbihtQWN0aXZlUGFzc3dvcmROdW1lcmljKTsKKyAgICAgICAgICAgIHB3LnByaW50KCIgIG1BY3RpdmVQYXNzd29yZFN5bWJvbHM9Iik7IHB3LnByaW50bG4obUFjdGl2ZVBhc3N3b3JkU3ltYm9scyk7CisgICAgICAgICAgICBwdy5wcmludCgiICBtQWN0aXZlUGFzc3dvcmROb25MZXR0ZXI9Iik7IHB3LnByaW50bG4obUFjdGl2ZVBhc3N3b3JkTm9uTGV0dGVyKTsKICAgICAgICAgICAgIHB3LnByaW50KCIgIG1GYWlsZWRQYXNzd29yZEF0dGVtcHRzPSIpOyBwdy5wcmludGxuKG1GYWlsZWRQYXNzd29yZEF0dGVtcHRzKTsKICAgICAgICAgICAgIHB3LnByaW50KCIgIG1QYXNzd29yZE93bmVyPSIpOyBwdy5wcmludGxuKG1QYXNzd29yZE93bmVyKTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvSW5wdXRNZXRob2RNYW5hZ2VyU2VydmljZS5qYXZhIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvSW5wdXRNZXRob2RNYW5hZ2VyU2VydmljZS5qYXZhCmluZGV4IDRkMzViZWMuLmY2ZTM0NDEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0lucHV0TWV0aG9kTWFuYWdlclNlcnZpY2UuamF2YQorKysgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9JbnB1dE1ldGhvZE1hbmFnZXJTZXJ2aWNlLmphdmEKQEAgLTQ2OSw4ICs0NjksMTAgQEAKICAgICAgICAgICAgICAgICBtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKSwKICAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuRU5BQkxFRF9JTlBVVF9NRVRIT0RTKTsKICAgICAgICAgU2xvZy5pKFRBRywgIkVuYWJsZWQgaW5wdXQgbWV0aG9kczogIiArIGVuYWJsZWRTdHIpOwotICAgICAgICBpZiAoZW5hYmxlZFN0ciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBTbG9nLmkoVEFHLCAiRW5hYmxlZCBpbnB1dCBtZXRob2RzIGhhcyBub3QgYmVlbiBzZXQsIGVuYWJsaW5nIGFsbCIpOworICAgICAgICBmaW5hbCBTdHJpbmcgZGVmYXVsdEltZSA9IFNldHRpbmdzLlNlY3VyZS5nZXRTdHJpbmcobUNvbnRleHQKKyAgICAgICAgICAgICAgICAuZ2V0Q29udGVudFJlc29sdmVyKCksIFNldHRpbmdzLlNlY3VyZS5ERUZBVUxUX0lOUFVUX01FVEhPRCk7CisgICAgICAgIGlmIChlbmFibGVkU3RyID09IG51bGwgfHwgVGV4dFV0aWxzLmlzRW1wdHkoZGVmYXVsdEltZSkpIHsKKyAgICAgICAgICAgIFNsb2cuaShUQUcsICJFbmFibGVkIGlucHV0IG1ldGhvZHMgb3IgZGVmYXVsdCBJTUUgaGFzIG5vdCBiZWVuIHNldCwgZW5hYmxpbmcgYWxsIik7CiAgICAgICAgICAgICBJbnB1dE1ldGhvZEluZm8gZGVmSW0gPSBudWxsOwogICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKDI1Nik7CiAgICAgICAgICAgICBmaW5hbCBpbnQgTiA9IG1NZXRob2RMaXN0LnNpemUoKTsKQEAgLTE0NzYsNyArMTQ3OCw3IEBACiAKICAgICAgICAgU3RyaW5nIGRlZmF1bHRJbWUgPSBTZXR0aW5ncy5TZWN1cmUuZ2V0U3RyaW5nKG1Db250ZXh0CiAgICAgICAgICAgICAgICAgLmdldENvbnRlbnRSZXNvbHZlcigpLCBTZXR0aW5ncy5TZWN1cmUuREVGQVVMVF9JTlBVVF9NRVRIT0QpOwotICAgICAgICBpZiAoIW1hcC5jb250YWluc0tleShkZWZhdWx0SW1lKSkgeworICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KGRlZmF1bHRJbWUpICYmICFtYXAuY29udGFpbnNLZXkoZGVmYXVsdEltZSkpIHsKICAgICAgICAgICAgIGlmIChjaG9vc2VOZXdEZWZhdWx0SU1FTG9ja2VkKCkpIHsKICAgICAgICAgICAgICAgICB1cGRhdGVGcm9tU2V0dGluZ3NMb2NrZWQoKTsKICAgICAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0xvY2F0aW9uTWFuYWdlclNlcnZpY2UuamF2YSBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0xvY2F0aW9uTWFuYWdlclNlcnZpY2UuamF2YQppbmRleCA4NTE5ZTJjLi5iNWUxNjU5IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9Mb2NhdGlvbk1hbmFnZXJTZXJ2aWNlLmphdmEKKysrIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvTG9jYXRpb25NYW5hZ2VyU2VydmljZS5qYXZhCkBAIC00NjUsMTAgKzQ2NSwxMSBAQAogICAgICAgICBtRW5hYmxlZFByb3ZpZGVycy5hZGQocGFzc2l2ZVByb3ZpZGVyLmdldE5hbWUoKSk7CiAKICAgICAgICAgLy8gaW5pdGlhbGl6ZSBleHRlcm5hbCBuZXR3b3JrIGxvY2F0aW9uIGFuZCBnZW9jb2RlciBzZXJ2aWNlcworICAgICAgICBQYWNrYWdlTWFuYWdlciBwbSA9IG1Db250ZXh0LiBnZXRQYWNrYWdlTWFuYWdlcigpOwogICAgICAgICBSZXNvdXJjZXMgcmVzb3VyY2VzID0gbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCk7CiAgICAgICAgIFN0cmluZyBzZXJ2aWNlTmFtZSA9IHJlc291cmNlcy5nZXRTdHJpbmcoCiAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHJpbmcuY29uZmlnX25ldHdvcmtMb2NhdGlvblByb3ZpZGVyKTsKLSAgICAgICAgaWYgKHNlcnZpY2VOYW1lICE9IG51bGwpIHsKKyAgICAgICAgaWYgKHNlcnZpY2VOYW1lICE9IG51bGwgJiYgcG0ucmVzb2x2ZVNlcnZpY2UobmV3IEludGVudChzZXJ2aWNlTmFtZSksIDApICE9IG51bGwpIHsKICAgICAgICAgICAgIG1OZXR3b3JrTG9jYXRpb25Qcm92aWRlciA9CiAgICAgICAgICAgICAgICAgbmV3IExvY2F0aW9uUHJvdmlkZXJQcm94eShtQ29udGV4dCwgTG9jYXRpb25NYW5hZ2VyLk5FVFdPUktfUFJPVklERVIsCiAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlTmFtZSwgbUxvY2F0aW9uSGFuZGxlcik7CkBAIC00NzYsNyArNDc3LDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIHNlcnZpY2VOYW1lID0gcmVzb3VyY2VzLmdldFN0cmluZyhjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0cmluZy5jb25maWdfZ2VvY29kZVByb3ZpZGVyKTsKLSAgICAgICAgaWYgKHNlcnZpY2VOYW1lICE9IG51bGwpIHsKKyAgICAgICAgaWYgKHNlcnZpY2VOYW1lICE9IG51bGwgJiYgcG0ucmVzb2x2ZVNlcnZpY2UobmV3IEludGVudChzZXJ2aWNlTmFtZSksIDApICE9IG51bGwpIHsKICAgICAgICAgICAgIG1HZW9jb2RlUHJvdmlkZXIgPSBuZXcgR2VvY29kZXJQcm94eShtQ29udGV4dCwgc2VydmljZU5hbWUpOwogICAgICAgICB9CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1BhY2thZ2VNYW5hZ2VyU2VydmljZS5qYXZhIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvUGFja2FnZU1hbmFnZXJTZXJ2aWNlLmphdmEKaW5kZXggYjRmYzE1YS4uMWZkMDUzZiAxMDA2NDQKLS0tIGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvUGFja2FnZU1hbmFnZXJTZXJ2aWNlLmphdmEKKysrIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvUGFja2FnZU1hbmFnZXJTZXJ2aWNlLmphdmEKQEAgLTk1NTEsNyArOTU1MSw4IEBACiAgICAgKiBVcGRhdGUgbWVkaWEgc3RhdHVzIG9uIFBhY2thZ2VNYW5hZ2VyLgogICAgICovCiAgICBwdWJsaWMgdm9pZCB1cGRhdGVFeHRlcm5hbE1lZGlhU3RhdHVzKGZpbmFsIGJvb2xlYW4gbWVkaWFTdGF0dXMsIGZpbmFsIGJvb2xlYW4gcmVwb3J0U3RhdHVzKSB7Ci0gICAgICAgaWYgKEJpbmRlci5nZXRDYWxsaW5nVWlkKCkgIT0gUHJvY2Vzcy5TWVNURU1fVUlEKSB7CisgICAgICAgaW50IGNhbGxpbmdVaWQgPSBCaW5kZXIuZ2V0Q2FsbGluZ1VpZCgpOworICAgICAgIGlmIChjYWxsaW5nVWlkICE9IDAgJiYgY2FsbGluZ1VpZCAhPSBQcm9jZXNzLlNZU1RFTV9VSUQpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IFNlY3VyaXR5RXhjZXB0aW9uKCJNZWRpYSBzdGF0dXMgY2FuIG9ubHkgYmUgdXBkYXRlZCBieSB0aGUgc3lzdGVtIik7CiAgICAgICAgfQogICAgICAgIHN5bmNocm9uaXplZCAobVBhY2thZ2VzKSB7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9TYW1wbGluZ1Byb2ZpbGVyU2VydmljZS5qYXZhIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvU2FtcGxpbmdQcm9maWxlclNlcnZpY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNmFmN2Y3Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvU2FtcGxpbmdQcm9maWxlclNlcnZpY2UuamF2YQpAQCAtMCwwICsxLDExOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuc2VydmVyOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkRyb3BCb3hNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQub3MuRmlsZU9ic2VydmVyOworaW1wb3J0IGFuZHJvaWQub3MuQmluZGVyOworCitpbXBvcnQgYW5kcm9pZC51dGlsLlNsb2c7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5Db250ZW50T2JzZXJ2ZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1Qcm9wZXJ0aWVzOworaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3M7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwub3MuU2FtcGxpbmdQcm9maWxlckludGVncmF0aW9uOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZURlc2NyaXB0b3I7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworCitwdWJsaWMgY2xhc3MgU2FtcGxpbmdQcm9maWxlclNlcnZpY2UgZXh0ZW5kcyBCaW5kZXIgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJTYW1wbGluZ1Byb2ZpbGVyU2VydmljZSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBMT0NBTF9MT0dWID0gZmFsc2U7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU05BUFNIT1RfRElSID0gU2FtcGxpbmdQcm9maWxlckludGVncmF0aW9uLlNOQVBTSE9UX0RJUjsKKworICAgIHByaXZhdGUgRmlsZU9ic2VydmVyIHNuYXBzaG90T2JzZXJ2ZXI7CisKKyAgICBwdWJsaWMgU2FtcGxpbmdQcm9maWxlclNlcnZpY2UoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIHJlZ2lzdGVyU2V0dGluZ09ic2VydmVyKGNvbnRleHQpOworICAgICAgICBzdGFydFdvcmtpbmcoY29udGV4dCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHN0YXJ0V29ya2luZyhDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgaWYgKExPQ0FMX0xPR1YpIFNsb2cudihUQUcsICJzdGFydGluZyBTYW1wbGluZ1Byb2ZpbGVyU2VydmljZSEiKTsKKworICAgICAgICBmaW5hbCBEcm9wQm94TWFuYWdlciBkcm9wYm94ID0KKyAgICAgICAgICAgICAgICAoRHJvcEJveE1hbmFnZXIpIGNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LkRST1BCT1hfU0VSVklDRSk7CisKKyAgICAgICAgLy8gYmVmb3JlIEZpbGVPYnNlcnZlciBpcyByZWFkeSwgdGhlcmUgY291bGQgaGF2ZSBhbHJlYWR5IGJlZW4gc29tZSBzbmFwc2hvdHMKKyAgICAgICAgLy8gaW4gdGhlIGRpcmVjdG9yeSwgd2UgZG9uJ3Qgd2FudCB0byBtaXNzIHRoZW0KKyAgICAgICAgRmlsZVtdIHNuYXBzaG90RmlsZXMgPSBuZXcgRmlsZShTTkFQU0hPVF9ESVIpLmxpc3RGaWxlcygpOworICAgICAgICBmb3IgKGludCBpID0gMDsgc25hcHNob3RGaWxlcyAhPSBudWxsICYmIGkgPCBzbmFwc2hvdEZpbGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBoYW5kbGVTbmFwc2hvdEZpbGUoc25hcHNob3RGaWxlc1tpXSwgZHJvcGJveCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBkZXRlY3QgbmV3IHNuYXBzaG90IGFuZCBwdXQgaXQgaW4gZHJvcGJveAorICAgICAgICAvLyBkZWxldGUgaXQgYWZ0ZXJ3YXJkcyBubyBtYXR0ZXIgd2hhdCBoYXBwZW5lZCBiZWZvcmUKKyAgICAgICAgLy8gTm90ZTogbmVlZHMgbGlzdGVuaW5nIGF0IGV2ZW50IEFUVFJJQiByYXRoZXIgdGhhbiBDTE9TRV9XUklURSwgYmVjYXVzZSB3ZSBzZXQgdGhlCisgICAgICAgIC8vIHJlYWRhYmlsaXR5IG9mIHNuYXBzaG90IGZpbGVzIGFmdGVyIHdyaXRpbmcgdGhlbSEKKyAgICAgICAgc25hcHNob3RPYnNlcnZlciA9IG5ldyBGaWxlT2JzZXJ2ZXIoU05BUFNIT1RfRElSLCBGaWxlT2JzZXJ2ZXIuQVRUUklCKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uRXZlbnQoaW50IGV2ZW50LCBTdHJpbmcgcGF0aCkgeworICAgICAgICAgICAgICAgIGhhbmRsZVNuYXBzaG90RmlsZShuZXcgRmlsZShTTkFQU0hPVF9ESVIsIHBhdGgpLCBkcm9wYm94KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgc25hcHNob3RPYnNlcnZlci5zdGFydFdhdGNoaW5nKCk7CisKKyAgICAgICAgaWYgKExPQ0FMX0xPR1YpIFNsb2cudihUQUcsICJTYW1wbGluZ1Byb2ZpbGVyU2VydmljZSBhY3RpdmF0ZWQiKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaGFuZGxlU25hcHNob3RGaWxlKEZpbGUgZmlsZSwgRHJvcEJveE1hbmFnZXIgZHJvcGJveCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgZHJvcGJveC5hZGRGaWxlKFRBRywgZmlsZSwgMCk7CisgICAgICAgICAgICBpZiAoTE9DQUxfTE9HVikgU2xvZy52KFRBRywgZmlsZS5nZXRQYXRoKCkgKyAiIGFkZGVkIHRvIGRyb3Bib3giKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgU2xvZy5lKFRBRywgIkNhbid0IGFkZCAiICsgZmlsZS5nZXRQYXRoKCkgKyAiIHRvIGRyb3Bib3giLCBlKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGZpbGUuZGVsZXRlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcmVnaXN0ZXJTZXR0aW5nT2JzZXJ2ZXIoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIENvbnRlbnRSZXNvbHZlciBjb250ZW50UmVzb2x2ZXIgPSBjb250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpOworICAgICAgICBjb250ZW50UmVzb2x2ZXIucmVnaXN0ZXJDb250ZW50T2JzZXJ2ZXIoCisgICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLmdldFVyaUZvcihTZXR0aW5ncy5TZWN1cmUuU0FNUExJTkdfUFJPRklMRVJfSFopLAorICAgICAgICAgICAgICAgIGZhbHNlLCBuZXcgU2FtcGxpbmdQcm9maWxlclNldHRpbmdzT2JzZXJ2ZXIoY29udGVudFJlc29sdmVyKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgZHVtcChGaWxlRGVzY3JpcHRvciBmZCwgUHJpbnRXcml0ZXIgcHcsIFN0cmluZ1tdIGFyZ3MpIHsKKyAgICAgICAgcHcucHJpbnRsbigiU2FtcGxpbmdQcm9maWxlclNlcnZpY2U6Iik7CisgICAgICAgIHB3LnByaW50bG4oIldhdGNoaW5nIGRpcmVjdG9yeTogIiArIFNOQVBTSE9UX0RJUik7CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBTYW1wbGluZ1Byb2ZpbGVyU2V0dGluZ3NPYnNlcnZlciBleHRlbmRzIENvbnRlbnRPYnNlcnZlciB7CisgICAgICAgIHByaXZhdGUgQ29udGVudFJlc29sdmVyIG1Db250ZW50UmVzb2x2ZXI7CisgICAgICAgIHB1YmxpYyBTYW1wbGluZ1Byb2ZpbGVyU2V0dGluZ3NPYnNlcnZlcihDb250ZW50UmVzb2x2ZXIgY29udGVudFJlc29sdmVyKSB7CisgICAgICAgICAgICBzdXBlcihudWxsKTsKKyAgICAgICAgICAgIG1Db250ZW50UmVzb2x2ZXIgPSBjb250ZW50UmVzb2x2ZXI7CisgICAgICAgICAgICBvbkNoYW5nZShmYWxzZSk7CisgICAgICAgIH0KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2hhbmdlKGJvb2xlYW4gc2VsZkNoYW5nZSkgeworICAgICAgICAgICAgSW50ZWdlciBzYW1wbGluZ1Byb2ZpbGVySHogPSBTZXR0aW5ncy5TZWN1cmUuZ2V0SW50KAorICAgICAgICAgICAgICAgICAgICBtQ29udGVudFJlc29sdmVyLCBTZXR0aW5ncy5TZWN1cmUuU0FNUExJTkdfUFJPRklMRVJfSFosIDApOworICAgICAgICAgICAgLy8gc2V0dGluZyB0aGlzIHNlY3VyZSBwcm9wZXJ0eSB3aWxsIHN0YXJ0IG9yIHN0b3Agc2FtcGxpbmcgcHJvZmlsZXIsCisgICAgICAgICAgICAvLyBhcyB3ZWxsIGFzIGFkanVzdCB0aGUgZnJlcXVlbmN5IG9mIHRha2luZyBzbmFwc2hvdHMuCisgICAgICAgICAgICBTeXN0ZW1Qcm9wZXJ0aWVzLnNldCgicGVyc2lzdC5zeXMucHJvZmlsZXJfaHoiLCBzYW1wbGluZ1Byb2ZpbGVySHoudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1N5c3RlbVNlcnZlci5qYXZhIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvU3lzdGVtU2VydmVyLmphdmEKaW5kZXggNzEzMDYzNi4uNDNhODdmMiAxMDA2NDQKLS0tIGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvU3lzdGVtU2VydmVyLmphdmEKKysrIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvU3lzdGVtU2VydmVyLmphdmEKQEAgLTIzLDI2ICsyMywyNiBAQAogaW1wb3J0IGRhbHZpay5zeXN0ZW0uVk1SdW50aW1lOwogaW1wb3J0IGRhbHZpay5zeXN0ZW0uWnlnb3RlOwogCitpbXBvcnQgYW5kcm9pZC5hY2NvdW50cy5BY2NvdW50TWFuYWdlclNlcnZpY2U7CiBpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHlNYW5hZ2VyTmF0aXZlOwogaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aEFkYXB0ZXI7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWU7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFNlcnZpY2U7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uSVBhY2thZ2VNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ29udGVudE9ic2VydmVyOwotaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yOwogaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9TZXJ2aWNlOwotaW1wb3J0IGFuZHJvaWQub3MuKjsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzLlBlb3BsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLm9zLlNlcnZpY2VNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7CitpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1Qcm9wZXJ0aWVzOwogaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3M7CiBpbXBvcnQgYW5kcm9pZC5zZXJ2ZXIuQmx1ZXRvb3RoQTJkcFNlcnZpY2U7CiBpbXBvcnQgYW5kcm9pZC5zZXJ2ZXIuQmx1ZXRvb3RoU2VydmljZTsKIGltcG9ydCBhbmRyb2lkLnNlcnZlci5zZWFyY2guU2VhcmNoTWFuYWdlclNlcnZpY2U7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkV2ZW50TG9nOwogaW1wb3J0IGFuZHJvaWQudXRpbC5TbG9nOwotaW1wb3J0IGFuZHJvaWQuYWNjb3VudHMuQWNjb3VudE1hbmFnZXJTZXJ2aWNlOwogCiBpbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEudXRpbC5UaW1lcjsKQEAgLTUwLDExICs1MCw4IEBACiAKIGNsYXNzIFNlcnZlclRocmVhZCBleHRlbmRzIFRocmVhZCB7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJTeXN0ZW1TZXJ2ZXIiOwotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGJvb2xlYW4gSU5DTFVERV9ERU1PID0gZmFsc2U7CiAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTE9HX0JPT1RfUFJPR1JFU1NfU1lTVEVNX1JVTiA9IDMwMTA7Ci0KLSAgICBwcml2YXRlIENvbnRlbnRSZXNvbHZlciBtQ29udGVudFJlc29sdmVyOworICAgIENvbnRlbnRSZXNvbHZlciBtQ29udGVudFJlc29sdmVyOwogCiAgICAgcHJpdmF0ZSBjbGFzcyBBZGJTZXR0aW5nc09ic2VydmVyIGV4dGVuZHMgQ29udGVudE9ic2VydmVyIHsKICAgICAgICAgcHVibGljIEFkYlNldHRpbmdzT2JzZXJ2ZXIoKSB7CkBAIC04MCw3ICs3Nyw3IEBACiAgICAgICAgICAgICAgICAgYW5kcm9pZC5vcy5Qcm9jZXNzLlRIUkVBRF9QUklPUklUWV9GT1JFR1JPVU5EKTsKIAogICAgICAgICBCaW5kZXJJbnRlcm5hbC5kaXNhYmxlQmFja2dyb3VuZFNjaGVkdWxpbmcodHJ1ZSk7Ci0gICAgICAgIAorCiAgICAgICAgIFN0cmluZyBmYWN0b3J5VGVzdFN0ciA9IFN5c3RlbVByb3BlcnRpZXMuZ2V0KCJyby5mYWN0b3J5dGVzdCIpOwogICAgICAgICBpbnQgZmFjdG9yeVRlc3QgPSAiIi5lcXVhbHMoZmFjdG9yeVRlc3RTdHIpID8gU3lzdGVtU2VydmVyLkZBQ1RPUllfVEVTVF9PRkYKICAgICAgICAgICAgICAgICA6IEludGVnZXIucGFyc2VJbnQoZmFjdG9yeVRlc3RTdHIpOwpAQCAtMzI5LDExICszMjYsNiBAQAogICAgICAgICAgICAgICAgIFNsb2cuZShUQUcsICJGYWlsdXJlIHN0YXJ0aW5nIFNlYXJjaCBTZXJ2aWNlIiwgZSk7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGlmIChJTkNMVURFX0RFTU8pIHsKLSAgICAgICAgICAgICAgICBTbG9nLmkoVEFHLCAiSW5zdGFsbGluZyBkZW1vIGRhdGEuLi4iKTsKLSAgICAgICAgICAgICAgICAobmV3IERlbW9UaHJlYWQoY29udGV4dCkpLnN0YXJ0KCk7Ci0gICAgICAgICAgICB9Ci0KICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgU2xvZy5pKFRBRywgIkRyb3BCb3ggU2VydmljZSIpOwogICAgICAgICAgICAgICAgIFNlcnZpY2VNYW5hZ2VyLmFkZFNlcnZpY2UoQ29udGV4dC5EUk9QQk9YX1NFUlZJQ0UsCkBAIC00MTgsNiArNDEwLDE4IEBACiAgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgZSkgewogICAgICAgICAgICAgICAgIFNsb2cuZShUQUcsICJGYWlsdXJlIHN0YXJ0aW5nIERpc2tTdGF0cyBTZXJ2aWNlIiwgZSk7CiAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgLy8gbmVlZCB0byBhZGQgdGhpcyBzZXJ2aWNlIGV2ZW4gaWYgU2FtcGxpbmdQcm9maWxlckludGVncmF0aW9uLmlzRW5hYmxlZCgpCisgICAgICAgICAgICAgICAgLy8gaXMgZmFsc2UsIGJlY2F1c2UgaXQgaXMgdGhpcyBzZXJ2aWNlIHRoYXQgZGV0ZWN0cyBzeXN0ZW0gcHJvcGVydHkgY2hhbmdlIGFuZAorICAgICAgICAgICAgICAgIC8vIHR1cm5zIG9uIFNhbXBsaW5nUHJvZmlsZXJJbnRlZ3JhdGlvbi4gUGx1cywgd2hlbiBzYW1wbGluZyBwcm9maWxlciBkb2Vzbid0IHdvcmssCisgICAgICAgICAgICAgICAgLy8gdGhlcmUgaXMgbGl0dGxlIG92ZXJoZWFkIGZvciBydW5uaW5nIHRoaXMgc2VydmljZS4KKyAgICAgICAgICAgICAgICBTbG9nLmkoVEFHLCAiU2FtcGxpbmdQcm9maWxlciBTZXJ2aWNlIik7CisgICAgICAgICAgICAgICAgU2VydmljZU1hbmFnZXIuYWRkU2VydmljZSgic2FtcGxpbmdwcm9maWxlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFNhbXBsaW5nUHJvZmlsZXJTZXJ2aWNlKGNvbnRleHQpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7CisgICAgICAgICAgICAgICAgU2xvZy5lKFRBRywgIkZhaWx1cmUgc3RhcnRpbmcgU2FtcGxpbmdQcm9maWxlciBTZXJ2aWNlIiwgZSk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICAvLyBtYWtlIHN1cmUgdGhlIEFEQl9FTkFCTEVEIHNldHRpbmcgdmFsdWUgbWF0Y2hlcyB0aGUgc2VjdXJlIHByb3BlcnR5IHZhbHVlCkBAIC01MTQsMzcgKzUxOCw3IEBACiAgICAgfQogfQogCi1jbGFzcyBEZW1vVGhyZWFkIGV4dGVuZHMgVGhyZWFkCi17Ci0gICAgRGVtb1RocmVhZChDb250ZXh0IGNvbnRleHQpCi0gICAgewotICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcnVuKCkKLSAgICB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBDdXJzb3IgYyA9IG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLnF1ZXJ5KFBlb3BsZS5DT05URU5UX1VSSSwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCk7Ci0gICAgICAgICAgICBib29sZWFuIGhhc0RhdGEgPSBjICE9IG51bGwgJiYgYy5tb3ZlVG9GaXJzdCgpOwotICAgICAgICAgICAgaWYgKGMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGMuZGVhY3RpdmF0ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFoYXNEYXRhKSB7Ci0gICAgICAgICAgICAgICAgRGVtb0RhdGFTZXQgZGF0YXNldCA9IG5ldyBEZW1vRGF0YVNldCgpOwotICAgICAgICAgICAgICAgIGRhdGFzZXQuYWRkKG1Db250ZXh0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKLSAgICAgICAgICAgIFNsb2cuZSgiU3lzdGVtU2VydmVyIiwgIkZhaWx1cmUgaW5zdGFsbGluZyBkZW1vIGRhdGEiLCBlKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgQ29udGV4dCBtQ29udGV4dDsKLX0KLQotcHVibGljIGNsYXNzIFN5c3RlbVNlcnZlcgoteworcHVibGljIGNsYXNzIFN5c3RlbVNlcnZlciB7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJTeXN0ZW1TZXJ2ZXIiOwogCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkFDVE9SWV9URVNUX09GRiA9IDA7CkBAIC01NjgsNyArNTQyLDcgQEAKICAgICAgICAgICAgIHRpbWVyLnNjaGVkdWxlKG5ldyBUaW1lclRhc2soKSB7CiAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICBTYW1wbGluZ1Byb2ZpbGVySW50ZWdyYXRpb24ud3JpdGVTbmFwc2hvdCgic3lzdGVtX3NlcnZlciIpOworICAgICAgICAgICAgICAgICAgICBTYW1wbGluZ1Byb2ZpbGVySW50ZWdyYXRpb24ud3JpdGVTbmFwc2hvdCgic3lzdGVtX3NlcnZlciIsIG51bGwpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0sIFNOQVBTSE9UX0lOVEVSVkFMLCBTTkFQU0hPVF9JTlRFUlZBTCk7CiAgICAgICAgIH0KQEAgLTU3Niw3ICs1NTAsNyBAQAogICAgICAgICAvLyBUaGUgc3lzdGVtIHNlcnZlciBoYXMgdG8gcnVuIGFsbCBvZiB0aGUgdGltZSwgc28gaXQgbmVlZHMgdG8gYmUKICAgICAgICAgLy8gYXMgZWZmaWNpZW50IGFzIHBvc3NpYmxlIHdpdGggaXRzIG1lbW9yeSB1c2FnZS4KICAgICAgICAgVk1SdW50aW1lLmdldFJ1bnRpbWUoKS5zZXRUYXJnZXRIZWFwVXRpbGl6YXRpb24oMC44Zik7Ci0gICAgICAgIAorCiAgICAgICAgIFN5c3RlbS5sb2FkTGlicmFyeSgiYW5kcm9pZF9zZXJ2ZXJzIik7CiAgICAgICAgIGluaXQxKGFyZ3MpOwogICAgIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1RlbGVwaG9ueVJlZ2lzdHJ5LmphdmEgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9UZWxlcGhvbnlSZWdpc3RyeS5qYXZhCmluZGV4IDY2NGRmYTUuLmIxY2E3ODUyIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9UZWxlcGhvbnlSZWdpc3RyeS5qYXZhCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1RlbGVwaG9ueVJlZ2lzdHJ5LmphdmEKQEAgLTg4LDcgKzg4LDcgQEAKIAogICAgIHByaXZhdGUgU3RyaW5nIG1EYXRhQ29ubmVjdGlvbkFwbiA9ICIiOwogCi0gICAgcHJpdmF0ZSBTdHJpbmdbXSBtRGF0YUNvbm5lY3Rpb25BcG5UeXBlcyA9IG51bGw7CisgICAgcHJpdmF0ZSBBcnJheUxpc3Q8U3RyaW5nPiBtQ29ubmVjdGVkQXBuczsKIAogICAgIHByaXZhdGUgU3RyaW5nIG1EYXRhQ29ubmVjdGlvbkludGVyZmFjZU5hbWUgPSAiIjsKIApAQCAtMTIwLDYgKzEyMCw3IEBACiAgICAgICAgIH0KICAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OwogICAgICAgICBtQmF0dGVyeVN0YXRzID0gQmF0dGVyeVN0YXRzU2VydmljZS5nZXRTZXJ2aWNlKCk7CisgICAgICAgIG1Db25uZWN0ZWRBcG5zID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgbGlzdGVuKFN0cmluZyBwa2dGb3JEZWJ1ZywgSVBob25lU3RhdGVMaXN0ZW5lciBjYWxsYmFjaywgaW50IGV2ZW50cywKQEAgLTIzMiwxOSArMjMzLDIwIEBACiAgICAgICAgIGlmICghY2hlY2tOb3RpZnlQZXJtaXNzaW9uKCJub3RpZnlDYWxsU3RhdGUoKSIpKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KKyAgICAgICAgQXJyYXlMaXN0PElCaW5kZXI+IHJlbW92ZUxpc3QgPSBuZXcgQXJyYXlMaXN0PElCaW5kZXI+KCk7CiAgICAgICAgIHN5bmNocm9uaXplZCAobVJlY29yZHMpIHsKICAgICAgICAgICAgIG1DYWxsU3RhdGUgPSBzdGF0ZTsKICAgICAgICAgICAgIG1DYWxsSW5jb21pbmdOdW1iZXIgPSBpbmNvbWluZ051bWJlcjsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSBtUmVjb3Jkcy5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgewotICAgICAgICAgICAgICAgIFJlY29yZCByID0gbVJlY29yZHMuZ2V0KGkpOworICAgICAgICAgICAgZm9yIChSZWNvcmQgciA6IG1SZWNvcmRzKSB7CiAgICAgICAgICAgICAgICAgaWYgKChyLmV2ZW50cyAmIFBob25lU3RhdGVMaXN0ZW5lci5MSVNURU5fQ0FMTF9TVEFURSkgIT0gMCkgewogICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgci5jYWxsYmFjay5vbkNhbGxTdGF0ZUNoYW5nZWQoc3RhdGUsIGluY29taW5nTnVtYmVyKTsKICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZW1vdmUoci5iaW5kZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlTGlzdC5hZGQoci5iaW5kZXIpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChJQmluZGVyIGIgOiByZW1vdmVMaXN0KSByZW1vdmUoYik7CiAgICAgICAgIH0KICAgICAgICAgYnJvYWRjYXN0Q2FsbFN0YXRlQ2hhbmdlZChzdGF0ZSwgaW5jb21pbmdOdW1iZXIpOwogICAgIH0KQEAgLTI1NSw4ICsyNTcsNyBAQAogICAgICAgICB9CiAgICAgICAgIHN5bmNocm9uaXplZCAobVJlY29yZHMpIHsKICAgICAgICAgICAgIG1TZXJ2aWNlU3RhdGUgPSBzdGF0ZTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSBtUmVjb3Jkcy5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgewotICAgICAgICAgICAgICAgIFJlY29yZCByID0gbVJlY29yZHMuZ2V0KGkpOworICAgICAgICAgICAgZm9yIChSZWNvcmQgciA6IG1SZWNvcmRzKSB7CiAgICAgICAgICAgICAgICAgaWYgKChyLmV2ZW50cyAmIFBob25lU3RhdGVMaXN0ZW5lci5MSVNURU5fU0VSVklDRV9TVEFURSkgIT0gMCkgewogICAgICAgICAgICAgICAgICAgICBzZW5kU2VydmljZVN0YXRlKHIsIHN0YXRlKTsKICAgICAgICAgICAgICAgICB9CkBAIC0yNjksMTAgKzI3MCwxMCBAQAogICAgICAgICBpZiAoIWNoZWNrTm90aWZ5UGVybWlzc2lvbigibm90aWZ5U2lnbmFsU3RyZW5ndGgoKSIpKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KKyAgICAgICAgQXJyYXlMaXN0PElCaW5kZXI+IHJlbW92ZUxpc3QgPSBuZXcgQXJyYXlMaXN0PElCaW5kZXI+KCk7CiAgICAgICAgIHN5bmNocm9uaXplZCAobVJlY29yZHMpIHsKICAgICAgICAgICAgIG1TaWduYWxTdHJlbmd0aCA9IHNpZ25hbFN0cmVuZ3RoOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IG1SZWNvcmRzLnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0gICAgICAgICAgICAgICAgUmVjb3JkIHIgPSBtUmVjb3Jkcy5nZXQoaSk7CisgICAgICAgICAgICBmb3IgKFJlY29yZCByIDogbVJlY29yZHMpIHsKICAgICAgICAgICAgICAgICBpZiAoKHIuZXZlbnRzICYgUGhvbmVTdGF0ZUxpc3RlbmVyLkxJU1RFTl9TSUdOQUxfU1RSRU5HVEhTKSAhPSAwKSB7CiAgICAgICAgICAgICAgICAgICAgIHNlbmRTaWduYWxTdHJlbmd0aChyLCBzaWduYWxTdHJlbmd0aCk7CiAgICAgICAgICAgICAgICAgfQpAQCAtMjgyLDEwICsyODMsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIHIuY2FsbGJhY2sub25TaWduYWxTdHJlbmd0aENoYW5nZWQoKGdzbVNpZ25hbFN0cmVuZ3RoID09IDk5ID8gLTEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBnc21TaWduYWxTdHJlbmd0aCkpOwogICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZShyLmJpbmRlcik7CisgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVMaXN0LmFkZChyLmJpbmRlcik7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKElCaW5kZXIgYiA6IHJlbW92ZUxpc3QpIHJlbW92ZShiKTsKICAgICAgICAgfQogICAgICAgICBicm9hZGNhc3RTaWduYWxTdHJlbmd0aENoYW5nZWQoc2lnbmFsU3RyZW5ndGgpOwogICAgIH0KQEAgLTI5NCwxOCArMjk2LDE5IEBACiAgICAgICAgIGlmICghY2hlY2tOb3RpZnlQZXJtaXNzaW9uKCJub3RpZnlNZXNzYWdlV2FpdGluZ0NoYW5nZWQoKSIpKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KKyAgICAgICAgQXJyYXlMaXN0PElCaW5kZXI+IHJlbW92ZUxpc3QgPSBuZXcgQXJyYXlMaXN0PElCaW5kZXI+KCk7CiAgICAgICAgIHN5bmNocm9uaXplZCAobVJlY29yZHMpIHsKICAgICAgICAgICAgIG1NZXNzYWdlV2FpdGluZyA9IG13aTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSBtUmVjb3Jkcy5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgewotICAgICAgICAgICAgICAgIFJlY29yZCByID0gbVJlY29yZHMuZ2V0KGkpOworICAgICAgICAgICAgZm9yIChSZWNvcmQgciA6IG1SZWNvcmRzKSB7CiAgICAgICAgICAgICAgICAgaWYgKChyLmV2ZW50cyAmIFBob25lU3RhdGVMaXN0ZW5lci5MSVNURU5fTUVTU0FHRV9XQUlUSU5HX0lORElDQVRPUikgIT0gMCkgewogICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgci5jYWxsYmFjay5vbk1lc3NhZ2VXYWl0aW5nSW5kaWNhdG9yQ2hhbmdlZChtd2kpOwogICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZShyLmJpbmRlcik7CisgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVMaXN0LmFkZChyLmJpbmRlcik7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKElCaW5kZXIgYiA6IHJlbW92ZUxpc3QpIHJlbW92ZShiKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMzEzLDE4ICszMTYsMTkgQEAKICAgICAgICAgaWYgKCFjaGVja05vdGlmeVBlcm1pc3Npb24oIm5vdGlmeUNhbGxGb3J3YXJkaW5nQ2hhbmdlZCgpIikpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQorICAgICAgICBBcnJheUxpc3Q8SUJpbmRlcj4gcmVtb3ZlTGlzdCA9IG5ldyBBcnJheUxpc3Q8SUJpbmRlcj4oKTsKICAgICAgICAgc3luY2hyb25pemVkIChtUmVjb3JkcykgewogICAgICAgICAgICAgbUNhbGxGb3J3YXJkaW5nID0gY2ZpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IG1SZWNvcmRzLnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0gICAgICAgICAgICAgICAgUmVjb3JkIHIgPSBtUmVjb3Jkcy5nZXQoaSk7CisgICAgICAgICAgICBmb3IgKFJlY29yZCByIDogbVJlY29yZHMpIHsKICAgICAgICAgICAgICAgICBpZiAoKHIuZXZlbnRzICYgUGhvbmVTdGF0ZUxpc3RlbmVyLkxJU1RFTl9DQUxMX0ZPUldBUkRJTkdfSU5ESUNBVE9SKSAhPSAwKSB7CiAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICByLmNhbGxiYWNrLm9uQ2FsbEZvcndhcmRpbmdJbmRpY2F0b3JDaGFuZ2VkKGNmaSk7CiAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlKHIuYmluZGVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZUxpc3QuYWRkKHIuYmluZGVyKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoSUJpbmRlciBiIDogcmVtb3ZlTGlzdCkgcmVtb3ZlKGIpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0zMzIsNTYgKzMzNiw4MCBAQAogICAgICAgICBpZiAoIWNoZWNrTm90aWZ5UGVybWlzc2lvbigibm90aWZ5RGF0YUFjdGl2aXR5KCkiICkpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQorICAgICAgICBBcnJheUxpc3Q8SUJpbmRlcj4gcmVtb3ZlTGlzdCA9IG5ldyBBcnJheUxpc3Q8SUJpbmRlcj4oKTsKICAgICAgICAgc3luY2hyb25pemVkIChtUmVjb3JkcykgewogICAgICAgICAgICAgbURhdGFBY3Rpdml0eSA9IHN0YXRlOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IG1SZWNvcmRzLnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0gICAgICAgICAgICAgICAgUmVjb3JkIHIgPSBtUmVjb3Jkcy5nZXQoaSk7CisgICAgICAgICAgICBmb3IgKFJlY29yZCByIDogbVJlY29yZHMpIHsKICAgICAgICAgICAgICAgICBpZiAoKHIuZXZlbnRzICYgUGhvbmVTdGF0ZUxpc3RlbmVyLkxJU1RFTl9EQVRBX0FDVElWSVRZKSAhPSAwKSB7CiAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICByLmNhbGxiYWNrLm9uRGF0YUFjdGl2aXR5KHN0YXRlKTsKICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZW1vdmUoci5iaW5kZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlTGlzdC5hZGQoci5iaW5kZXIpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChJQmluZGVyIGIgOiByZW1vdmVMaXN0KSByZW1vdmUoYik7CiAgICAgICAgIH0KICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBub3RpZnlEYXRhQ29ubmVjdGlvbihpbnQgc3RhdGUsIGJvb2xlYW4gaXNEYXRhQ29ubmVjdGl2aXR5UG9zc2libGUsCi0gICAgICAgICAgICBTdHJpbmcgcmVhc29uLCBTdHJpbmcgYXBuLCBTdHJpbmdbXSBhcG5UeXBlcywgU3RyaW5nIGludGVyZmFjZU5hbWUsIGludCBuZXR3b3JrVHlwZSkgeworICAgICAgICAgICAgU3RyaW5nIHJlYXNvbiwgU3RyaW5nIGFwbiwgU3RyaW5nIGFwblR5cGUsIFN0cmluZyBpbnRlcmZhY2VOYW1lLCBpbnQgbmV0d29ya1R5cGUpIHsKICAgICAgICAgaWYgKCFjaGVja05vdGlmeVBlcm1pc3Npb24oIm5vdGlmeURhdGFDb25uZWN0aW9uKCkiICkpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogICAgICAgICBzeW5jaHJvbml6ZWQgKG1SZWNvcmRzKSB7Ci0gICAgICAgICAgICBtRGF0YUNvbm5lY3Rpb25TdGF0ZSA9IHN0YXRlOworICAgICAgICAgICAgYm9vbGVhbiBtb2RpZmllZCA9IGZhbHNlOworICAgICAgICAgICAgaWYgKHN0YXRlID09IFRlbGVwaG9ueU1hbmFnZXIuREFUQV9DT05ORUNURUQpIHsKKyAgICAgICAgICAgICAgICBpZiAoIW1Db25uZWN0ZWRBcG5zLmNvbnRhaW5zKGFwblR5cGUpKSB7CisgICAgICAgICAgICAgICAgICAgIG1Db25uZWN0ZWRBcG5zLmFkZChhcG5UeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1EYXRhQ29ubmVjdGlvblN0YXRlICE9IHN0YXRlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtRGF0YUNvbm5lY3Rpb25TdGF0ZSA9IHN0YXRlOworICAgICAgICAgICAgICAgICAgICAgICAgbW9kaWZpZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtQ29ubmVjdGVkQXBucy5yZW1vdmUoYXBuVHlwZSk7CisgICAgICAgICAgICAgICAgaWYgKG1Db25uZWN0ZWRBcG5zLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgICAgICBtRGF0YUNvbm5lY3Rpb25TdGF0ZSA9IHN0YXRlOworICAgICAgICAgICAgICAgICAgICBtb2RpZmllZCA9IHRydWU7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gd2UncmUgc3RpbGwgY29ubmVjdGVkLCBzbyBzZW5kIHRoYXQgb3V0IGlmIHdlIHNlbmQgYW55dGhpbmcuCisgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gbURhdGFDb25uZWN0aW9uU3RhdGU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogICAgICAgICAgICAgbURhdGFDb25uZWN0aW9uUG9zc2libGUgPSBpc0RhdGFDb25uZWN0aXZpdHlQb3NzaWJsZTsKICAgICAgICAgICAgIG1EYXRhQ29ubmVjdGlvblJlYXNvbiA9IHJlYXNvbjsKICAgICAgICAgICAgIG1EYXRhQ29ubmVjdGlvbkFwbiA9IGFwbjsKLSAgICAgICAgICAgIG1EYXRhQ29ubmVjdGlvbkFwblR5cGVzID0gYXBuVHlwZXM7CiAgICAgICAgICAgICBtRGF0YUNvbm5lY3Rpb25JbnRlcmZhY2VOYW1lID0gaW50ZXJmYWNlTmFtZTsKLSAgICAgICAgICAgIG1EYXRhQ29ubmVjdGlvbk5ldHdvcmtUeXBlID0gbmV0d29ya1R5cGU7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gbVJlY29yZHMuc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pIHsKLSAgICAgICAgICAgICAgICBSZWNvcmQgciA9IG1SZWNvcmRzLmdldChpKTsKLSAgICAgICAgICAgICAgICBpZiAoKHIuZXZlbnRzICYgUGhvbmVTdGF0ZUxpc3RlbmVyLkxJU1RFTl9EQVRBX0NPTk5FQ1RJT05fU1RBVEUpICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHIuY2FsbGJhY2sub25EYXRhQ29ubmVjdGlvblN0YXRlQ2hhbmdlZChzdGF0ZSwgbmV0d29ya1R5cGUpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZShyLmJpbmRlcik7CisgICAgICAgICAgICBpZiAobURhdGFDb25uZWN0aW9uTmV0d29ya1R5cGUgIT0gbmV0d29ya1R5cGUpIHsKKyAgICAgICAgICAgICAgICBtRGF0YUNvbm5lY3Rpb25OZXR3b3JrVHlwZSA9IG5ldHdvcmtUeXBlOworICAgICAgICAgICAgICAgIG1vZGlmaWVkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtb2RpZmllZCkgeworICAgICAgICAgICAgICAgIEFycmF5TGlzdDxJQmluZGVyPiByZW1vdmVMaXN0ID0gbmV3IEFycmF5TGlzdDxJQmluZGVyPigpOworICAgICAgICAgICAgICAgIGZvciAoUmVjb3JkIHIgOiBtUmVjb3JkcykgeworICAgICAgICAgICAgICAgICAgICBpZiAoKHIuZXZlbnRzICYgUGhvbmVTdGF0ZUxpc3RlbmVyLkxJU1RFTl9EQVRBX0NPTk5FQ1RJT05fU1RBVEUpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgci5jYWxsYmFjay5vbkRhdGFDb25uZWN0aW9uU3RhdGVDaGFuZ2VkKHN0YXRlLCBuZXR3b3JrVHlwZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVMaXN0LmFkZChyLmJpbmRlcik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZm9yIChJQmluZGVyIGIgOiByZW1vdmVMaXN0KSByZW1vdmUoYik7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgYnJvYWRjYXN0RGF0YUNvbm5lY3Rpb25TdGF0ZUNoYW5nZWQoc3RhdGUsIGlzRGF0YUNvbm5lY3Rpdml0eVBvc3NpYmxlLCByZWFzb24sIGFwbiwKLSAgICAgICAgICAgICAgICBhcG5UeXBlcywgaW50ZXJmYWNlTmFtZSk7CisgICAgICAgICAgICAgICAgYXBuVHlwZSwgaW50ZXJmYWNlTmFtZSk7CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgbm90aWZ5RGF0YUNvbm5lY3Rpb25GYWlsZWQoU3RyaW5nIHJlYXNvbikgeworICAgIHB1YmxpYyB2b2lkIG5vdGlmeURhdGFDb25uZWN0aW9uRmFpbGVkKFN0cmluZyByZWFzb24sIFN0cmluZyBhcG5UeXBlKSB7CiAgICAgICAgIGlmICghY2hlY2tOb3RpZnlQZXJtaXNzaW9uKCJub3RpZnlEYXRhQ29ubmVjdGlvbkZhaWxlZCgpIikpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogICAgICAgICAvKgotICAgICAgICAgKiBUaGlzIGlzIGNvbW1lbnRlZCBvdXQgYmVjYXVzZSB0aGVyZSBpcyBvbiBvbkRhdGFDb25uZWN0aW9uRmFpbGVkIGNhbGxiYWNrCi0gICAgICAgICAqIG9uIFBob25lU3RhdGVMaXN0ZW5lci4gVGhlcmUgc2hvdWxkIGJlCisgICAgICAgICAqIFRoaXMgaXMgY29tbWVudGVkIG91dCBiZWNhdXNlIHRoZXJlIGlzIG5vIG9uRGF0YUNvbm5lY3Rpb25GYWlsZWQgY2FsbGJhY2sKKyAgICAgICAgICogaW4gUGhvbmVTdGF0ZUxpc3RlbmVyLiBUaGVyZSBzaG91bGQgYmUuCiAgICAgICAgIHN5bmNocm9uaXplZCAobVJlY29yZHMpIHsKICAgICAgICAgICAgIG1EYXRhQ29ubmVjdGlvbkZhaWxlZFJlYXNvbiA9IHJlYXNvbjsKICAgICAgICAgICAgIGZpbmFsIGludCBOID0gbVJlY29yZHMuc2l6ZSgpOwpAQCAtMzkzLDcgKzQyMSw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgKi8KLSAgICAgICAgYnJvYWRjYXN0RGF0YUNvbm5lY3Rpb25GYWlsZWQocmVhc29uKTsKKyAgICAgICAgYnJvYWRjYXN0RGF0YUNvbm5lY3Rpb25GYWlsZWQocmVhc29uLCBhcG5UeXBlKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBub3RpZnlDZWxsTG9jYXRpb24oQnVuZGxlIGNlbGxMb2NhdGlvbikgewpAQCAtNDAyLDggKzQzMCw3IEBACiAgICAgICAgIH0KICAgICAgICAgc3luY2hyb25pemVkIChtUmVjb3JkcykgewogICAgICAgICAgICAgbUNlbGxMb2NhdGlvbiA9IGNlbGxMb2NhdGlvbjsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSBtUmVjb3Jkcy5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgewotICAgICAgICAgICAgICAgIFJlY29yZCByID0gbVJlY29yZHMuZ2V0KGkpOworICAgICAgICAgICAgZm9yIChSZWNvcmQgciA6IG1SZWNvcmRzKSB7CiAgICAgICAgICAgICAgICAgaWYgKChyLmV2ZW50cyAmIFBob25lU3RhdGVMaXN0ZW5lci5MSVNURU5fQ0VMTF9MT0NBVElPTikgIT0gMCkgewogICAgICAgICAgICAgICAgICAgICBzZW5kQ2VsbExvY2F0aW9uKHIsIGNlbGxMb2NhdGlvbik7CiAgICAgICAgICAgICAgICAgfQpAQCAtNDYzLDggKzQ5MCw3IEBACiAgICAgICAgICAgICBwdy5wcmludGxuKCIgIG1EYXRhQ29ubmVjdGlvbkludGVyZmFjZU5hbWU9IiArIG1EYXRhQ29ubmVjdGlvbkludGVyZmFjZU5hbWUpOwogICAgICAgICAgICAgcHcucHJpbnRsbigiICBtQ2VsbExvY2F0aW9uPSIgKyBtQ2VsbExvY2F0aW9uKTsKICAgICAgICAgICAgIHB3LnByaW50bG4oInJlZ2lzdHJhdGlvbnM6IGNvdW50PSIgKyByZWNvcmRDb3VudCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlY29yZENvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICBSZWNvcmQgciA9IG1SZWNvcmRzLmdldChpKTsKKyAgICAgICAgICAgIGZvciAoUmVjb3JkIHIgOiBtUmVjb3JkcykgewogICAgICAgICAgICAgICAgIHB3LnByaW50bG4oIiAgIiArIHIucGtnRm9yRGVidWcgKyAiIDB4IiArIEludGVnZXIudG9IZXhTdHJpbmcoci5ldmVudHMpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtNTM1LDcgKzU2MSw3IEBACiAKICAgICBwcml2YXRlIHZvaWQgYnJvYWRjYXN0RGF0YUNvbm5lY3Rpb25TdGF0ZUNoYW5nZWQoaW50IHN0YXRlLAogICAgICAgICAgICAgYm9vbGVhbiBpc0RhdGFDb25uZWN0aXZpdHlQb3NzaWJsZSwKLSAgICAgICAgICAgIFN0cmluZyByZWFzb24sIFN0cmluZyBhcG4sIFN0cmluZ1tdIGFwblR5cGVzLCBTdHJpbmcgaW50ZXJmYWNlTmFtZSkgeworICAgICAgICAgICAgU3RyaW5nIHJlYXNvbiwgU3RyaW5nIGFwbiwgU3RyaW5nIGFwblR5cGUsIFN0cmluZyBpbnRlcmZhY2VOYW1lKSB7CiAgICAgICAgIC8vIE5vdGU6IG5vdCByZXBvcnRpbmcgdG8gdGhlIGJhdHRlcnkgc3RhdHMgc2VydmljZSBoZXJlLCBiZWNhdXNlIHRoZQogICAgICAgICAvLyBzdGF0dXMgYmFyIHRha2VzIGNhcmUgb2YgdGhhdCBhZnRlciB0YWtpbmcgaW50byBhY2NvdW50IGFsbCBvZiB0aGUKICAgICAgICAgLy8gcmVxdWlyZWQgaW5mby4KQEAgLTU0OSwyMiArNTc1LDE2IEBACiAgICAgICAgICAgICBpbnRlbnQucHV0RXh0cmEoUGhvbmUuU1RBVEVfQ0hBTkdFX1JFQVNPTl9LRVksIHJlYXNvbik7CiAgICAgICAgIH0KICAgICAgICAgaW50ZW50LnB1dEV4dHJhKFBob25lLkRBVEFfQVBOX0tFWSwgYXBuKTsKLSAgICAgICAgU3RyaW5nIHR5cGVzID0gbmV3IFN0cmluZygiIik7Ci0gICAgICAgIGlmIChhcG5UeXBlcy5sZW5ndGggPiAwKSB7Ci0gICAgICAgICAgICB0eXBlcyA9IGFwblR5cGVzWzBdOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBhcG5UeXBlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIHR5cGVzID0gdHlwZXMrIiwiK2FwblR5cGVzW2ldOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGludGVudC5wdXRFeHRyYShQaG9uZS5EQVRBX0FQTl9UWVBFU19LRVksIHR5cGVzKTsKKyAgICAgICAgaW50ZW50LnB1dEV4dHJhKFBob25lLkRBVEFfQVBOX1RZUEVfS0VZLCBhcG5UeXBlKTsKICAgICAgICAgaW50ZW50LnB1dEV4dHJhKFBob25lLkRBVEFfSUZBQ0VfTkFNRV9LRVksIGludGVyZmFjZU5hbWUpOwogICAgICAgICBtQ29udGV4dC5zZW5kU3RpY2t5QnJvYWRjYXN0KGludGVudCk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSB2b2lkIGJyb2FkY2FzdERhdGFDb25uZWN0aW9uRmFpbGVkKFN0cmluZyByZWFzb24pIHsKKyAgICBwcml2YXRlIHZvaWQgYnJvYWRjYXN0RGF0YUNvbm5lY3Rpb25GYWlsZWQoU3RyaW5nIHJlYXNvbiwgU3RyaW5nIGFwblR5cGUpIHsKICAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoVGVsZXBob255SW50ZW50cy5BQ1RJT05fREFUQV9DT05ORUNUSU9OX0ZBSUxFRCk7CiAgICAgICAgIGludGVudC5hZGRGbGFncyhJbnRlbnQuRkxBR19SRUNFSVZFUl9SRVBMQUNFX1BFTkRJTkcpOwogICAgICAgICBpbnRlbnQucHV0RXh0cmEoUGhvbmUuRkFJTFVSRV9SRUFTT05fS0VZLCByZWFzb24pOworICAgICAgICBpbnRlbnQucHV0RXh0cmEoUGhvbmUuREFUQV9BUE5fVFlQRV9LRVksIGFwblR5cGUpOwogICAgICAgICBtQ29udGV4dC5zZW5kU3RpY2t5QnJvYWRjYXN0KGludGVudCk7CiAgICAgfQogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9UaHJvdHRsZVNlcnZpY2UuamF2YSBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1Rocm90dGxlU2VydmljZS5qYXZhCmluZGV4IGE5M2E2ZWUuLmQ4NDFjYjMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1Rocm90dGxlU2VydmljZS5qYXZhCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1Rocm90dGxlU2VydmljZS5qYXZhCkBAIC02MCw2ICs2MCw4IEBACiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwogaW1wb3J0IGphdmEudXRpbC5DYWxlbmRhcjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljSW50ZWdlcjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljTG9uZzsKIGltcG9ydCBqYXZhLnV0aWwuR3JlZ29yaWFuQ2FsZW5kYXI7CiBpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CiBpbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKQEAgLTgzLDggKzg1LDggQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIFRFU1RJTkdfVEhSRVNIT0xEID0gMSAqIDEwMjQgKiAxMDI0OwogCiAgICAgcHJpdmF0ZSBpbnQgbVBvbGljeVBvbGxQZXJpb2RTZWM7Ci0gICAgcHJpdmF0ZSBsb25nIG1Qb2xpY3lUaHJlc2hvbGQ7Ci0gICAgcHJpdmF0ZSBpbnQgbVBvbGljeVRocm90dGxlVmFsdWU7CisgICAgcHJpdmF0ZSBBdG9taWNMb25nIG1Qb2xpY3lUaHJlc2hvbGQ7CisgICAgcHJpdmF0ZSBBdG9taWNJbnRlZ2VyIG1Qb2xpY3lUaHJvdHRsZVZhbHVlOwogICAgIHByaXZhdGUgaW50IG1Qb2xpY3lSZXNldERheTsgLy8gMS0yOAogICAgIHByaXZhdGUgaW50IG1Qb2xpY3lOb3RpZmljYXRpb25zQWxsb3dlZE1hc2s7CiAKQEAgLTExNCw3ICsxMTYsNyBAQAogICAgIHByaXZhdGUgSW50ZXJmYWNlT2JzZXJ2ZXIgbUludGVyZmFjZU9ic2VydmVyOwogICAgIHByaXZhdGUgU2V0dGluZ3NPYnNlcnZlciBtU2V0dGluZ3NPYnNlcnZlcjsKIAotICAgIHByaXZhdGUgaW50IG1UaHJvdHRsZUluZGV4OyAvLyAwIGZvciBub25lLCAxIGZvciBmaXJzdCB0aHJvdHRsZSB2YWwsIDIgZm9yIG5leHQsIGV0YworICAgIHByaXZhdGUgQXRvbWljSW50ZWdlciBtVGhyb3R0bGVJbmRleDsgLy8gMCBmb3Igbm9uZSwgMSBmb3IgZmlyc3QgdGhyb3R0bGUgdmFsLCAyIGZvciBuZXh0LCBldGMKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVEhST1RUTEVfSU5ERVhfVU5JTklUSUFMSVpFRCA9IC0xOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUSFJPVFRMRV9JTkRFWF9VTlRIUk9UVExFRCAgID0gIDA7CiAKQEAgLTEyNiw2ICsxMjgsMTAgQEAKICAgICAgICAgaWYgKFZEQkcpIFNsb2cudihUQUcsICJTdGFydGluZyBUaHJvdHRsZVNlcnZpY2UiKTsKICAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OwogCisgICAgICAgIG1Qb2xpY3lUaHJlc2hvbGQgPSBuZXcgQXRvbWljTG9uZygpOworICAgICAgICBtUG9saWN5VGhyb3R0bGVWYWx1ZSA9IG5ldyBBdG9taWNJbnRlZ2VyKCk7CisgICAgICAgIG1UaHJvdHRsZUluZGV4ID0gbmV3IEF0b21pY0ludGVnZXIoKTsKKwogICAgICAgICBtTnRwQWN0aXZlID0gZmFsc2U7CiAKICAgICAgICAgbUlmYWNlID0gbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0U3RyaW5nKFIuc3RyaW5nLmNvbmZpZ19kYXRhdXNlX2lmYWNlKTsKQEAgLTIxNCw3ICsyMjAsNyBAQAogICAgIH0KIAogICAgIHByaXZhdGUgbG9uZyBudHBUb1dhbGxUaW1lKGxvbmcgbnRwVGltZSkgewotICAgICAgICBsb25nIGJlc3ROb3cgPSBnZXRCZXN0VGltZSgpOworICAgICAgICBsb25nIGJlc3ROb3cgPSBnZXRCZXN0VGltZSh0cnVlKTsgLy8gZG8gaXQgcXVpY2tseQogICAgICAgICBsb25nIGxvY2FsTm93ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CiAgICAgICAgIHJldHVybiBsb2NhbE5vdyArIChudHBUaW1lIC0gYmVzdE5vdyk7CiAgICAgfQpAQCAtMjIyLDQwICsyMjgsNDIgQEAKICAgICAvLyBUT0RPIC0gZmV0Y2ggZm9yIHRoZSBpZmFjZQogICAgIC8vIHJldHVybiB0aW1lIGluIHRoZSBsb2NhbCwgc3lzdGVtIHdhbGwgdGltZSwgY29ycmVjdGluZyBmb3IgdGhlIHVzZSBvZiBudHAKIAotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgbG9uZyBnZXRSZXNldFRpbWUoU3RyaW5nIGlmYWNlKSB7CisgICAgcHVibGljIGxvbmcgZ2V0UmVzZXRUaW1lKFN0cmluZyBpZmFjZSkgewogICAgICAgICBlbmZvcmNlQWNjZXNzUGVybWlzc2lvbigpOwogICAgICAgICBsb25nIHJlc2V0VGltZSA9IDA7CiAgICAgICAgIGlmIChtUmVjb3JkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgcmVzZXRUaW1lID0gbnRwVG9XYWxsVGltZShtUmVjb3JkZXIuZ2V0UGVyaW9kRW5kKCkpOworICAgICAgICAgICAgcmVzZXRUaW1lID0gbVJlY29yZGVyLmdldFBlcmlvZEVuZCgpOwogICAgICAgICB9CisgICAgICAgIHJlc2V0VGltZSA9IG50cFRvV2FsbFRpbWUocmVzZXRUaW1lKTsKICAgICAgICAgcmV0dXJuIHJlc2V0VGltZTsKICAgICB9CiAKICAgICAvLyBUT0RPIC0gZmV0Y2ggZm9yIHRoZSBpZmFjZQogICAgIC8vIHJldHVybiB0aW1lIGluIHRoZSBsb2NhbCwgc3lzdGVtIHdhbGwgdGltZSwgY29ycmVjdGluZyBmb3IgdGhlIHVzZSBvZiBudHAKLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGxvbmcgZ2V0UGVyaW9kU3RhcnRUaW1lKFN0cmluZyBpZmFjZSkgewotICAgICAgICBlbmZvcmNlQWNjZXNzUGVybWlzc2lvbigpOworICAgIHB1YmxpYyBsb25nIGdldFBlcmlvZFN0YXJ0VGltZShTdHJpbmcgaWZhY2UpIHsKICAgICAgICAgbG9uZyBzdGFydFRpbWUgPSAwOworICAgICAgICBlbmZvcmNlQWNjZXNzUGVybWlzc2lvbigpOwogICAgICAgICBpZiAobVJlY29yZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHN0YXJ0VGltZSA9IG50cFRvV2FsbFRpbWUobVJlY29yZGVyLmdldFBlcmlvZFN0YXJ0KCkpOworICAgICAgICAgICAgc3RhcnRUaW1lID0gbVJlY29yZGVyLmdldFBlcmlvZFN0YXJ0KCk7CiAgICAgICAgIH0KKyAgICAgICAgc3RhcnRUaW1lID0gbnRwVG9XYWxsVGltZShzdGFydFRpbWUpOwogICAgICAgICByZXR1cm4gc3RhcnRUaW1lOwogICAgIH0KICAgICAvL1RPRE8gLSBhIGJldHRlciBuYW1lPyAgZ2V0Q2xpZmZCeXRlQ291bnRUaHJlc2hvbGQ/CiAgICAgLy8gVE9ETyAtIGZldGNoIGZvciB0aGUgaWZhY2UKLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGxvbmcgZ2V0Q2xpZmZUaHJlc2hvbGQoU3RyaW5nIGlmYWNlLCBpbnQgY2xpZmYpIHsKKyAgICBwdWJsaWMgbG9uZyBnZXRDbGlmZlRocmVzaG9sZChTdHJpbmcgaWZhY2UsIGludCBjbGlmZikgewogICAgICAgICBlbmZvcmNlQWNjZXNzUGVybWlzc2lvbigpOwogICAgICAgICBpZiAoY2xpZmYgPT0gMSkgewotICAgICAgICAgICAgcmV0dXJuIG1Qb2xpY3lUaHJlc2hvbGQ7CisgICAgICAgICAgIHJldHVybiBtUG9saWN5VGhyZXNob2xkLmdldCgpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KICAgICAvLyBUT0RPIC0gYSBiZXR0ZXIgbmFtZT8gZ2V0VGhyb3R0bGVSYXRlPwogICAgIC8vIFRPRE8gLSBmZXRjaCBmb3IgdGhlIGlmYWNlCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBpbnQgZ2V0Q2xpZmZMZXZlbChTdHJpbmcgaWZhY2UsIGludCBjbGlmZikgeworICAgIHB1YmxpYyBpbnQgZ2V0Q2xpZmZMZXZlbChTdHJpbmcgaWZhY2UsIGludCBjbGlmZikgewogICAgICAgICBlbmZvcmNlQWNjZXNzUGVybWlzc2lvbigpOwogICAgICAgICBpZiAoY2xpZmYgPT0gMSkgewotICAgICAgICAgICAgcmV0dXJuIG1Qb2xpY3lUaHJvdHRsZVZhbHVlOworICAgICAgICAgICAgcmV0dXJuIG1Qb2xpY3lUaHJvdHRsZVZhbHVlLmdldCgpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KQEAgLTI2NywxMCArMjc1LDkgQEAKICAgICB9CiAKICAgICAvLyBUT0RPIC0gZmV0Y2ggZm9yIHRoZSBpZmFjZQotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgbG9uZyBnZXRCeXRlQ291bnQoU3RyaW5nIGlmYWNlLCBpbnQgZGlyLCBpbnQgcGVyaW9kLCBpbnQgYWdvKSB7CisgICAgcHVibGljIGxvbmcgZ2V0Qnl0ZUNvdW50KFN0cmluZyBpZmFjZSwgaW50IGRpciwgaW50IHBlcmlvZCwgaW50IGFnbykgewogICAgICAgICBlbmZvcmNlQWNjZXNzUGVybWlzc2lvbigpOwotICAgICAgICBpZiAoKHBlcmlvZCA9PSBUaHJvdHRsZU1hbmFnZXIuUEVSSU9EX0NZQ0xFKSAmJgotICAgICAgICAgICAgICAgIChtUmVjb3JkZXIgIT0gbnVsbCkpIHsKKyAgICAgICAgaWYgKChwZXJpb2QgPT0gVGhyb3R0bGVNYW5hZ2VyLlBFUklPRF9DWUNMRSkgJiYgKG1SZWNvcmRlciAhPSBudWxsKSkgewogICAgICAgICAgICAgaWYgKGRpciA9PSBUaHJvdHRsZU1hbmFnZXIuRElSRUNUSU9OX1RYKSByZXR1cm4gbVJlY29yZGVyLmdldFBlcmlvZFR4KGFnbyk7CiAgICAgICAgICAgICBpZiAoZGlyID09IFRocm90dGxlTWFuYWdlci5ESVJFQ1RJT05fUlgpIHJldHVybiBtUmVjb3JkZXIuZ2V0UGVyaW9kUngoYWdvKTsKICAgICAgICAgfQpAQCAtMjc5LDEwICsyODYsMTAgQEAKIAogICAgIC8vIFRPRE8gLSBhIGJldHRlciBuYW1lIC0gZ2V0Q3VycmVudFRocm90dGxlUmF0ZT8KICAgICAvLyBUT0RPIC0gZmV0Y2ggZm9yIHRoZSBpZmFjZQotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IGdldFRocm90dGxlKFN0cmluZyBpZmFjZSkgeworICAgIHB1YmxpYyBpbnQgZ2V0VGhyb3R0bGUoU3RyaW5nIGlmYWNlKSB7CiAgICAgICAgIGVuZm9yY2VBY2Nlc3NQZXJtaXNzaW9uKCk7Ci0gICAgICAgIGlmIChtVGhyb3R0bGVJbmRleCA9PSAxKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVBvbGljeVRocm90dGxlVmFsdWU7CisgICAgICAgIGlmIChtVGhyb3R0bGVJbmRleC5nZXQoKSA9PSAxKSB7CisgICAgICAgICAgICByZXR1cm4gbVBvbGljeVRocm90dGxlVmFsdWUuZ2V0KCk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQpAQCAtMzA1LDIyICszMTIsNiBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0sIG5ldyBJbnRlbnRGaWx0ZXIoQUNUSU9OX1JFU0VUKSk7CiAKLSAgICAgICAgLy8gdXNlIGEgbmV3IHRocmVhZCBhcyB3ZSBkb24ndCB3YW50IHRvIHN0YWxsIHRoZSBzeXN0ZW0gZm9yIGZpbGUgd3JpdGVzCi0gICAgICAgIG1UaHJlYWQgPSBuZXcgSGFuZGxlclRocmVhZChUQUcpOwotICAgICAgICBtVGhyZWFkLnN0YXJ0KCk7Ci0gICAgICAgIG1IYW5kbGVyID0gbmV3IE15SGFuZGxlcihtVGhyZWFkLmdldExvb3BlcigpKTsKLSAgICAgICAgbUhhbmRsZXIub2J0YWluTWVzc2FnZShFVkVOVF9SRUJPT1RfUkVDT1ZFUlkpLnNlbmRUb1RhcmdldCgpOwotCi0gICAgICAgIG1JbnRlcmZhY2VPYnNlcnZlciA9IG5ldyBJbnRlcmZhY2VPYnNlcnZlcihtSGFuZGxlciwgRVZFTlRfSUZBQ0VfVVAsIG1JZmFjZSk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBtTk1TZXJ2aWNlLnJlZ2lzdGVyT2JzZXJ2ZXIobUludGVyZmFjZU9ic2VydmVyKTsKLSAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIFNsb2cuZShUQUcsICJDb3VsZCBub3QgcmVnaXN0ZXIgSW50ZXJmYWNlT2JzZXJ2ZXIgIiArIGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgbVNldHRpbmdzT2JzZXJ2ZXIgPSBuZXcgU2V0dGluZ3NPYnNlcnZlcihtSGFuZGxlciwgRVZFTlRfUE9MSUNZX0NIQU5HRUQpOwotICAgICAgICBtU2V0dGluZ3NPYnNlcnZlci5vYnNlcnZlKG1Db250ZXh0KTsKLQogICAgICAgICBGaWxlSW5wdXRTdHJlYW0gc3RyZWFtID0gbnVsbDsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIFByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBQcm9wZXJ0aWVzKCk7CkBAIC0zMzcsNiArMzI4LDIyIEBACiAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHt9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KKworICAgICAgICAvLyB1c2UgYSBuZXcgdGhyZWFkIGFzIHdlIGRvbid0IHdhbnQgdG8gc3RhbGwgdGhlIHN5c3RlbSBmb3IgZmlsZSB3cml0ZXMKKyAgICAgICAgbVRocmVhZCA9IG5ldyBIYW5kbGVyVGhyZWFkKFRBRyk7CisgICAgICAgIG1UaHJlYWQuc3RhcnQoKTsKKyAgICAgICAgbUhhbmRsZXIgPSBuZXcgTXlIYW5kbGVyKG1UaHJlYWQuZ2V0TG9vcGVyKCkpOworICAgICAgICBtSGFuZGxlci5vYnRhaW5NZXNzYWdlKEVWRU5UX1JFQk9PVF9SRUNPVkVSWSkuc2VuZFRvVGFyZ2V0KCk7CisKKyAgICAgICAgbUludGVyZmFjZU9ic2VydmVyID0gbmV3IEludGVyZmFjZU9ic2VydmVyKG1IYW5kbGVyLCBFVkVOVF9JRkFDRV9VUCwgbUlmYWNlKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1OTVNlcnZpY2UucmVnaXN0ZXJPYnNlcnZlcihtSW50ZXJmYWNlT2JzZXJ2ZXIpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgU2xvZy5lKFRBRywgIkNvdWxkIG5vdCByZWdpc3RlciBJbnRlcmZhY2VPYnNlcnZlciAiICsgZSk7CisgICAgICAgIH0KKworICAgICAgICBtU2V0dGluZ3NPYnNlcnZlciA9IG5ldyBTZXR0aW5nc09ic2VydmVyKG1IYW5kbGVyLCBFVkVOVF9QT0xJQ1lfQ0hBTkdFRCk7CisgICAgICAgIG1TZXR0aW5nc09ic2VydmVyLm9ic2VydmUobUNvbnRleHQpOwogICAgIH0KIAogCkBAIC0zNzUsNyArMzgyLDcgQEAKICAgICAgICAgICAgIC8vIGNoZWNrIGZvciBzaW0gY2hhbmdlIFRPRE8KICAgICAgICAgICAgIC8vIHJlcmVnaXN0ZXIgZm9yIG5vdGlmaWNhdGlvbiBvZiBwb2xpY3kgY2hhbmdlCiAKLSAgICAgICAgICAgIG1UaHJvdHRsZUluZGV4ID0gVEhST1RUTEVfSU5ERVhfVU5JTklUSUFMSVpFRDsKKyAgICAgICAgICAgIG1UaHJvdHRsZUluZGV4LnNldChUSFJPVFRMRV9JTkRFWF9VTklOSVRJQUxJWkVEKTsKIAogICAgICAgICAgICAgbVJlY29yZGVyID0gbmV3IERhdGFSZWNvcmRlcihtQ29udGV4dCwgVGhyb3R0bGVTZXJ2aWNlLnRoaXMpOwogCkBAIC00MDMsMTUgKzQxMCwxNiBAQAogICAgICAgICAgICAgICAgICAgICBSLmludGVnZXIuY29uZmlnX2RhdGF1c2VfdGhyZXNob2xkX2J5dGVzKTsKICAgICAgICAgICAgIGludCBkZWZhdWx0VmFsdWUgPSBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRJbnRlZ2VyKAogICAgICAgICAgICAgICAgICAgICBSLmludGVnZXIuY29uZmlnX2RhdGF1c2VfdGhyb3R0bGVfa2JpdHNwcyk7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKFRocm90dGxlU2VydmljZS50aGlzKSB7Ci0gICAgICAgICAgICAgICAgbVBvbGljeVRocmVzaG9sZCA9IFNldHRpbmdzLlNlY3VyZS5nZXRMb25nKG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLAotICAgICAgICAgICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLlRIUk9UVExFX1RIUkVTSE9MRF9CWVRFUywgZGVmYXVsdFRocmVzaG9sZCk7Ci0gICAgICAgICAgICAgICAgbVBvbGljeVRocm90dGxlVmFsdWUgPSBTZXR0aW5ncy5TZWN1cmUuZ2V0SW50KG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLAotICAgICAgICAgICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLlRIUk9UVExFX1ZBTFVFX0tCSVRTUFMsIGRlZmF1bHRWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgaWYgKHRlc3RpbmcpIHsKLSAgICAgICAgICAgICAgICAgICAgbVBvbGljeVBvbGxQZXJpb2RTZWMgPSBURVNUSU5HX1BPTExJTkdfUEVSSU9EX1NFQzsKLSAgICAgICAgICAgICAgICAgICAgbVBvbGljeVRocmVzaG9sZCA9IFRFU1RJTkdfVEhSRVNIT0xEOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxvbmcgdGhyZXNob2xkID0gU2V0dGluZ3MuU2VjdXJlLmdldExvbmcobUNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCksCisgICAgICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5USFJPVFRMRV9USFJFU0hPTERfQllURVMsIGRlZmF1bHRUaHJlc2hvbGQpOworICAgICAgICAgICAgaW50IHZhbHVlID0gU2V0dGluZ3MuU2VjdXJlLmdldEludChtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLlRIUk9UVExFX1ZBTFVFX0tCSVRTUFMsIGRlZmF1bHRWYWx1ZSk7CisKKyAgICAgICAgICAgIG1Qb2xpY3lUaHJlc2hvbGQuc2V0KHRocmVzaG9sZCk7CisgICAgICAgICAgICBtUG9saWN5VGhyb3R0bGVWYWx1ZS5zZXQodmFsdWUpOworICAgICAgICAgICAgaWYgKHRlc3RpbmcpIHsKKyAgICAgICAgICAgICAgICBtUG9saWN5UG9sbFBlcmlvZFNlYyA9IFRFU1RJTkdfUE9MTElOR19QRVJJT0RfU0VDOworICAgICAgICAgICAgICAgIG1Qb2xpY3lUaHJlc2hvbGQuc2V0KFRFU1RJTkdfVEhSRVNIT0xEKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgbVBvbGljeVJlc2V0RGF5ID0gU2V0dGluZ3MuU2VjdXJlLmdldEludChtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKSwKQEAgLTQyMywxMCArNDMxLDggQEAKICAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUucHV0SW50KG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLAogICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5USFJPVFRMRV9SRVNFVF9EQVksIG1Qb2xpY3lSZXNldERheSk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKFRocm90dGxlU2VydmljZS50aGlzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1JZmFjZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Qb2xpY3lUaHJlc2hvbGQgPSAwOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtSWZhY2UgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1Qb2xpY3lUaHJlc2hvbGQuc2V0KDApOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpbnQgZGVmYXVsdE5vdGlmaWNhdGlvblR5cGUgPSBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRJbnRlZ2VyKApAQCAtNDM3LDE1ICs0NDMsMTYgQEAKICAgICAgICAgICAgIG1NYXhOdHBDYWNoZUFnZVNlYyA9IFNldHRpbmdzLlNlY3VyZS5nZXRJbnQobUNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCksCiAgICAgICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5USFJPVFRMRV9NQVhfTlRQX0NBQ0hFX0FHRV9TRUMsIE1BWF9OVFBfQ0FDSEVfQUdFX1NFQyk7CiAKLSAgICAgICAgICAgIGlmIChWREJHIHx8IChtUG9saWN5VGhyZXNob2xkICE9IDApKSB7CisgICAgICAgICAgICBpZiAoVkRCRyB8fCAobVBvbGljeVRocmVzaG9sZC5nZXQoKSAhPSAwKSkgewogICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJvblBvbGljeUNoYW5nZWQgdGVzdGluZz0iICsgdGVzdGluZyArIiwgcGVyaW9kPSIgKwotICAgICAgICAgICAgICAgICAgICAgICAgbVBvbGljeVBvbGxQZXJpb2RTZWMgKyAiLCB0aHJlc2hvbGQ9IiArIG1Qb2xpY3lUaHJlc2hvbGQgKyAiLCB2YWx1ZT0iICsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Qb2xpY3lUaHJvdHRsZVZhbHVlICsgIiwgcmVzZXREYXk9IiArIG1Qb2xpY3lSZXNldERheSArICIsIG5vdGVUeXBlPSIgKwotICAgICAgICAgICAgICAgICAgICAgICAgbVBvbGljeU5vdGlmaWNhdGlvbnNBbGxvd2VkTWFzayArICIsIG1heE50cENhY2hlQWdlPSIgKyBtTWF4TnRwQ2FjaGVBZ2VTZWMpOworICAgICAgICAgICAgICAgICAgICAgICAgbVBvbGljeVBvbGxQZXJpb2RTZWMgKyAiLCB0aHJlc2hvbGQ9IiArIG1Qb2xpY3lUaHJlc2hvbGQuZ2V0KCkgKworICAgICAgICAgICAgICAgICAgICAgICAgIiwgdmFsdWU9IiArIG1Qb2xpY3lUaHJvdHRsZVZhbHVlLmdldCgpICsgIiwgcmVzZXREYXk9IiArIG1Qb2xpY3lSZXNldERheSArCisgICAgICAgICAgICAgICAgICAgICAgICAiLCBub3RlVHlwZT0iICsgbVBvbGljeU5vdGlmaWNhdGlvbnNBbGxvd2VkTWFzayArICIsIG1heE50cENhY2hlQWdlPSIgKworICAgICAgICAgICAgICAgICAgICAgICAgbU1heE50cENhY2hlQWdlU2VjKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgLy8gZm9yY2UgdXBkYXRlcwotICAgICAgICAgICAgbVRocm90dGxlSW5kZXggPSBUSFJPVFRMRV9JTkRFWF9VTklOSVRJQUxJWkVEOworICAgICAgICAgICAgbVRocm90dGxlSW5kZXguc2V0KFRIUk9UVExFX0lOREVYX1VOSU5JVElBTElaRUQpOwogCiAgICAgICAgICAgICBvblJlc2V0QWxhcm0oKTsKIApAQCAtNDg3LDcgKzQ5NCw3IEBACiAgICAgICAgICAgICBsb25nIHBlcmlvZFJ4ID0gbVJlY29yZGVyLmdldFBlcmlvZFJ4KDApOwogICAgICAgICAgICAgbG9uZyBwZXJpb2RUeCA9IG1SZWNvcmRlci5nZXRQZXJpb2RUeCgwKTsKICAgICAgICAgICAgIGxvbmcgdG90YWwgPSBwZXJpb2RSeCArIHBlcmlvZFR4OwotICAgICAgICAgICAgaWYgKFZEQkcgfHwgKG1Qb2xpY3lUaHJlc2hvbGQgIT0gMCkpIHsKKyAgICAgICAgICAgIGlmIChWREJHIHx8IChtUG9saWN5VGhyZXNob2xkLmdldCgpICE9IDApKSB7CiAgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgIm9uUG9sbEFsYXJtIC0gcm9hbWluZyA9IiArIHJvYW1pbmcgKwogICAgICAgICAgICAgICAgICAgICAgICAgIiwgcmVhZCA9IiArIGluY1JlYWQgKyAiLCB3cml0dGVuID0iICsgaW5jV3JpdGUgKyAiLCBuZXcgdG90YWwgPSIgKyB0b3RhbCk7CiAgICAgICAgICAgICB9CkBAIC01MTAsMTEgKzUxNywxMSBAQAogICAgICAgICBwcml2YXRlIHZvaWQgb25JZmFjZVVwKCkgewogICAgICAgICAgICAgLy8gaWYgd2Ugd2VyZSB0aHJvdHRsZWQgYmVmb3JlLCBiZSBzdXJlIGFuZCBzZXQgaXQgYWdhaW4gLSB0aGUgaWZhY2Ugd2VudCBkb3duCiAgICAgICAgICAgICAvLyAoYW5kIG1heSBoYXZlIGRpc2FwcGVhcmVkIGFsbCB0b2dldGhlcikgYW5kIHRoZXNlIHNldHRpbmdzIHdlcmUgbG9zdAotICAgICAgICAgICAgaWYgKG1UaHJvdHRsZUluZGV4ID09IDEpIHsKKyAgICAgICAgICAgIGlmIChtVGhyb3R0bGVJbmRleC5nZXQoKSA9PSAxKSB7CiAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgbU5NU2VydmljZS5zZXRJbnRlcmZhY2VUaHJvdHRsZShtSWZhY2UsIC0xLCAtMSk7CiAgICAgICAgICAgICAgICAgICAgIG1OTVNlcnZpY2Uuc2V0SW50ZXJmYWNlVGhyb3R0bGUobUlmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Qb2xpY3lUaHJvdHRsZVZhbHVlLCBtUG9saWN5VGhyb3R0bGVWYWx1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBvbGljeVRocm90dGxlVmFsdWUuZ2V0KCksIG1Qb2xpY3lUaHJvdHRsZVZhbHVlLmdldCgpKTsKICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgICAgICAgICBTbG9nLmUoVEFHLCAiZXJyb3Igc2V0dGluZyBUaHJvdHRsZTogIiArIGUpOwogICAgICAgICAgICAgICAgIH0KQEAgLTUyMyw3ICs1MzAsOCBAQAogCiAgICAgICAgIHByaXZhdGUgdm9pZCBjaGVja1Rocm90dGxlQW5kUG9zdE5vdGlmaWNhdGlvbihsb25nIGN1cnJlbnRUb3RhbCkgewogICAgICAgICAgICAgLy8gaXMgdGhyb3R0bGluZyBlbmFibGVkPwotICAgICAgICAgICAgaWYgKG1Qb2xpY3lUaHJlc2hvbGQgPT0gMCkgeworICAgICAgICAgICAgbG9uZyB0aHJlc2hvbGQgPSBtUG9saWN5VGhyZXNob2xkLmdldCgpOworICAgICAgICAgICAgaWYgKHRocmVzaG9sZCA9PSAwKSB7CiAgICAgICAgICAgICAgICAgY2xlYXJUaHJvdHRsZUFuZE5vdGlmaWNhdGlvbigpOwogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KQEAgLTUzNSwxNSArNTQzLDEzIEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIC8vIGNoZWNrIGlmIHdlIG5lZWQgdG8gdGhyb3R0bGUKLSAgICAgICAgICAgIGlmIChjdXJyZW50VG90YWwgPiBtUG9saWN5VGhyZXNob2xkKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1UaHJvdHRsZUluZGV4ICE9IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChUaHJvdHRsZVNlcnZpY2UudGhpcykgewotICAgICAgICAgICAgICAgICAgICAgICAgbVRocm90dGxlSW5kZXggPSAxOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChEQkcpIFNsb2cuZChUQUcsICJUaHJlc2hvbGQgIiArIG1Qb2xpY3lUaHJlc2hvbGQgKyAiIGV4Y2VlZGVkISIpOworICAgICAgICAgICAgaWYgKGN1cnJlbnRUb3RhbCA+IHRocmVzaG9sZCkgeworICAgICAgICAgICAgICAgIGlmIChtVGhyb3R0bGVJbmRleC5nZXQoKSAhPSAxKSB7CisgICAgICAgICAgICAgICAgICAgIG1UaHJvdHRsZUluZGV4LnNldCgxKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKERCRykgU2xvZy5kKFRBRywgIlRocmVzaG9sZCAiICsgdGhyZXNob2xkICsgIiBleGNlZWRlZCEiKTsKICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgIG1OTVNlcnZpY2Uuc2V0SW50ZXJmYWNlVGhyb3R0bGUobUlmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUG9saWN5VGhyb3R0bGVWYWx1ZSwgbVBvbGljeVRocm90dGxlVmFsdWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUG9saWN5VGhyb3R0bGVWYWx1ZS5nZXQoKSwgbVBvbGljeVRocm90dGxlVmFsdWUuZ2V0KCkpOwogICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgU2xvZy5lKFRBRywgImVycm9yIHNldHRpbmcgVGhyb3R0bGU6ICIgKyBlKTsKICAgICAgICAgICAgICAgICAgICAgfQpAQCAtNTU2LDcgKzU2Miw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uLkZMQUdfT05HT0lOR19FVkVOVCk7CiAKICAgICAgICAgICAgICAgICAgICAgSW50ZW50IGJyb2FkY2FzdCA9IG5ldyBJbnRlbnQoVGhyb3R0bGVNYW5hZ2VyLlRIUk9UVExFX0FDVElPTik7Ci0gICAgICAgICAgICAgICAgICAgIGJyb2FkY2FzdC5wdXRFeHRyYShUaHJvdHRsZU1hbmFnZXIuRVhUUkFfVEhST1RUTEVfTEVWRUwsIG1Qb2xpY3lUaHJvdHRsZVZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJvYWRjYXN0LnB1dEV4dHJhKFRocm90dGxlTWFuYWdlci5FWFRSQV9USFJPVFRMRV9MRVZFTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUG9saWN5VGhyb3R0bGVWYWx1ZS5nZXQoKSk7CiAgICAgICAgICAgICAgICAgICAgIG1Db250ZXh0LnNlbmRTdGlja3lCcm9hZGNhc3QoYnJvYWRjYXN0KTsKIAogICAgICAgICAgICAgICAgIH0gLy8gZWxzZSBhbHJlYWR5IHVwIQpAQCAtNTc5LDggKzU4Niw4IEBACiAgICAgICAgICAgICAgICAgICAgIGxvbmcgcGVyaW9kTGVuZ3RoID0gZW5kIC0gc3RhcnQ7CiAgICAgICAgICAgICAgICAgICAgIGxvbmcgbm93ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CiAgICAgICAgICAgICAgICAgICAgIGxvbmcgdGltZVVzZWQgPSBub3cgLSBzdGFydDsKLSAgICAgICAgICAgICAgICAgICAgbG9uZyB3YXJuaW5nVGhyZXNob2xkID0gMiptUG9saWN5VGhyZXNob2xkKnRpbWVVc2VkLyh0aW1lVXNlZCtwZXJpb2RMZW5ndGgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoKGN1cnJlbnRUb3RhbCA+IHdhcm5pbmdUaHJlc2hvbGQpICYmIChjdXJyZW50VG90YWwgPiBtUG9saWN5VGhyZXNob2xkLzQpKSB7CisgICAgICAgICAgICAgICAgICAgIGxvbmcgd2FybmluZ1RocmVzaG9sZCA9IDIqdGhyZXNob2xkKnRpbWVVc2VkLyh0aW1lVXNlZCtwZXJpb2RMZW5ndGgpOworICAgICAgICAgICAgICAgICAgICBpZiAoKGN1cnJlbnRUb3RhbCA+IHdhcm5pbmdUaHJlc2hvbGQpICYmIChjdXJyZW50VG90YWwgPiB0aHJlc2hvbGQvNCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtV2FybmluZ05vdGlmaWNhdGlvblNlbnQgPT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtV2FybmluZ05vdGlmaWNhdGlvblNlbnQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ob3RpZmljYXRpb25NYW5hZ2VyLmNhbmNlbChSLmRyYXdhYmxlLnN0YXRfc3lzX3Rocm90dGxlZCk7CkBAIC02MjUsMTEgKzYzMiw5IEBACiAgICAgICAgIH0KIAogCi0gICAgICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgY2xlYXJUaHJvdHRsZUFuZE5vdGlmaWNhdGlvbigpIHsKLSAgICAgICAgICAgIGlmIChtVGhyb3R0bGVJbmRleCAhPSBUSFJPVFRMRV9JTkRFWF9VTlRIUk9UVExFRCkgewotICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAoVGhyb3R0bGVTZXJ2aWNlLnRoaXMpIHsKLSAgICAgICAgICAgICAgICAgICAgbVRocm90dGxlSW5kZXggPSBUSFJPVFRMRV9JTkRFWF9VTlRIUk9UVExFRDsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgIHByaXZhdGUgdm9pZCBjbGVhclRocm90dGxlQW5kTm90aWZpY2F0aW9uKCkgeworICAgICAgICAgICAgaWYgKG1UaHJvdHRsZUluZGV4LmdldCgpICE9IFRIUk9UVExFX0lOREVYX1VOVEhST1RUTEVEKSB7CisgICAgICAgICAgICAgICAgbVRocm90dGxlSW5kZXguc2V0KFRIUk9UVExFX0lOREVYX1VOVEhST1RUTEVEKTsKICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICBtTk1TZXJ2aWNlLnNldEludGVyZmFjZVRocm90dGxlKG1JZmFjZSwgLTEsIC0xKTsKICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewpAQCAtNjg3LDEyICs2OTIsMTIgQEAKICAgICAgICAgfQogCiAgICAgICAgIHByaXZhdGUgdm9pZCBvblJlc2V0QWxhcm0oKSB7Ci0gICAgICAgICAgICBpZiAoVkRCRyB8fCAobVBvbGljeVRocmVzaG9sZCAhPSAwKSkgeworICAgICAgICAgICAgaWYgKFZEQkcgfHwgKG1Qb2xpY3lUaHJlc2hvbGQuZ2V0KCkgIT0gMCkpIHsKICAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAib25SZXNldEFsYXJtIC0gbGFzdCBwZXJpb2QgaGFkICIgKyBtUmVjb3JkZXIuZ2V0UGVyaW9kUngoMCkgKwogICAgICAgICAgICAgICAgICAgICAgICAgIiBieXRlcyByZWFkIGFuZCAiICsgbVJlY29yZGVyLmdldFBlcmlvZFR4KDApICsgIiB3cml0dGVuIik7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGxvbmcgbm93ID0gZ2V0QmVzdFRpbWUoKTsKKyAgICAgICAgICAgIGxvbmcgbm93ID0gZ2V0QmVzdFRpbWUoZmFsc2UpOwogCiAgICAgICAgICAgICBpZiAobU50cEFjdGl2ZSB8fCAobU50cFNlcnZlciA9PSBudWxsKSkgewogICAgICAgICAgICAgICAgIENhbGVuZGFyIGVuZCA9IGNhbGN1bGF0ZVBlcmlvZEVuZChub3cpOwpAQCAtNzE5LDIwICs3MjQsMjMgQEAKIAogICAgICAgICAvLyB3aWxsIHRyeSB0byBnZXQgdGhlIG50cCB0aW1lIGFuZCBzd2l0Y2ggdG8gaXQgaWYgZm91bmQuCiAgICAgICAgIC8vIHdpbGwgYWxzbyBjYWNoZSB0aGUgdGltZSBzbyB3ZSBkb24ndCBmZXRjaCBpdCByZXBlYXRlZGx5LgotICAgICAgICBnZXRCZXN0VGltZSgpOworICAgICAgICBnZXRCZXN0VGltZShmYWxzZSk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9OVFBfQ0FDSEVfQUdFX1NFQyA9IDYwICogNjAgKiAyNDsgLy8gMSBkYXkKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX05UUF9GRVRDSF9XQUlUID0gMTAgKiAxMDAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfTlRQX0ZFVENIX1dBSVQgPSAyMCAqIDEwMDA7CiAgICAgcHJpdmF0ZSBpbnQgbU1heE50cENhY2hlQWdlU2VjID0gTUFYX05UUF9DQUNIRV9BR0VfU0VDOwogICAgIHByaXZhdGUgbG9uZyBjYWNoZWROdHA7CiAgICAgcHJpdmF0ZSBsb25nIGNhY2hlZE50cFRpbWVzdGFtcDsKIAotICAgIHByaXZhdGUgbG9uZyBnZXRCZXN0VGltZSgpIHsKKyAgICAvLyBpZiB0aGUgcmVxdWVzdCBpcyB0aWVkIHRvIFVJIGFuZCBBTlIncyBhcmUgYSBkYW5nZXIsIHJlcXVlc3QgYSBmYXN0IHJlc3VsdAorICAgIC8vIHRoZSByZWd1bGFyIHBvbGxpbmcgc2hvdWxkIGhhdmUgdXBkYXRlZCB0aGUgY2FjaGVkIHRpbWUgcmVjZW50bHkgdXNpbmcgdGhlCisgICAgLy8gc2xvd2VyIG1ldGhvZCAoIWZhc3QpCisgICAgcHJpdmF0ZSBsb25nIGdldEJlc3RUaW1lKGJvb2xlYW4gZmFzdCkgewogICAgICAgICBpZiAobU50cFNlcnZlciAhPSBudWxsKSB7CiAgICAgICAgICAgICBpZiAobU50cEFjdGl2ZSkgewogICAgICAgICAgICAgICAgIGxvbmcgbnRwQWdlID0gU3lzdGVtQ2xvY2suZWxhcHNlZFJlYWx0aW1lKCkgLSBjYWNoZWROdHBUaW1lc3RhbXA7Ci0gICAgICAgICAgICAgICAgaWYgKG50cEFnZSA8IG1NYXhOdHBDYWNoZUFnZVNlYyAqIDEwMDApIHsKKyAgICAgICAgICAgICAgICBpZiAobnRwQWdlIDwgbU1heE50cENhY2hlQWdlU2VjICogMTAwMCB8fCBmYXN0KSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChWREJHKSBTbG9nLnYoVEFHLCAidXNpbmcgY2FjaGVkIHRpbWUiKTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhY2hlZE50cCArIG50cEFnZTsKICAgICAgICAgICAgICAgICB9CkBAIC0xMDI1LDM5ICsxMDMzLDU3IEBACiAgICAgICAgICAgICAgICAgaWYgKERCRykgU2xvZy5kKFRBRywgImRhdGEgZmlsZSBlbXB0eSIpOwogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVBhcmVudCkgewotICAgICAgICAgICAgICAgIFN0cmluZ1tdIHBhcnNlZCA9IGRhdGEuc3BsaXQoIjoiKTsKLSAgICAgICAgICAgICAgICBpbnQgcGFyc2VkVXNlZCA9IDA7Ci0gICAgICAgICAgICAgICAgaWYgKHBhcnNlZC5sZW5ndGggPCA2KSB7Ci0gICAgICAgICAgICAgICAgICAgIFNsb2cuZShUQUcsICJyZWFkaW5nIGRhdGEgZmlsZSB3aXRoIGluc3VmZmljaWVudCBsZW5ndGggLSBpZ25vcmluZyIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgU3RyaW5nW10gcGFyc2VkID0gZGF0YS5zcGxpdCgiOiIpOworICAgICAgICAgICAgaW50IHBhcnNlZFVzZWQgPSAwOworICAgICAgICAgICAgaWYgKHBhcnNlZC5sZW5ndGggPCA2KSB7CisgICAgICAgICAgICAgICAgU2xvZy5lKFRBRywgInJlYWRpbmcgZGF0YSBmaWxlIHdpdGggaW5zdWZmaWNpZW50IGxlbmd0aCAtIGlnbm9yaW5nIik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQogCisgICAgICAgICAgICBpbnQgcGVyaW9kQ291bnQ7CisgICAgICAgICAgICBsb25nW10gcGVyaW9kUnhEYXRhOworICAgICAgICAgICAgbG9uZ1tdIHBlcmlvZFR4RGF0YTsKKyAgICAgICAgICAgIGludCBjdXJyZW50UGVyaW9kOworICAgICAgICAgICAgQ2FsZW5kYXIgcGVyaW9kU3RhcnQ7CisgICAgICAgICAgICBDYWxlbmRhciBwZXJpb2RFbmQ7CisgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgIGlmIChJbnRlZ2VyLnBhcnNlSW50KHBhcnNlZFtwYXJzZWRVc2VkKytdKSAhPSBEQVRBX0ZJTEVfVkVSU0lPTikgewogICAgICAgICAgICAgICAgICAgICBTbG9nLmUoVEFHLCAicmVhZGluZyBkYXRhIGZpbGUgd2l0aCBiYWQgdmVyc2lvbiAtIGlnbm9yaW5nIik7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBtUGVyaW9kQ291bnQgPSBJbnRlZ2VyLnBhcnNlSW50KHBhcnNlZFtwYXJzZWRVc2VkKytdKTsKLSAgICAgICAgICAgICAgICBpZiAocGFyc2VkLmxlbmd0aCAhPSA1ICsgKDIgKiBtUGVyaW9kQ291bnQpKSB7CisgICAgICAgICAgICAgICAgcGVyaW9kQ291bnQgPSBJbnRlZ2VyLnBhcnNlSW50KHBhcnNlZFtwYXJzZWRVc2VkKytdKTsKKyAgICAgICAgICAgICAgICBpZiAocGFyc2VkLmxlbmd0aCAhPSA1ICsgKDIgKiBwZXJpb2RDb3VudCkpIHsKICAgICAgICAgICAgICAgICAgICAgU2xvZy5lKFRBRywgInJlYWRpbmcgZGF0YSBmaWxlIHdpdGggYmFkIGxlbmd0aCAoIiArIHBhcnNlZC5sZW5ndGggKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIT0gIiArICg1KygyKm1QZXJpb2RDb3VudCkpICsgIikgLSBpZ25vcmluZyIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIT0gIiArICg1ICsgKDIgKiBwZXJpb2RDb3VudCkpICsgIikgLSBpZ25vcmluZyIpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHBlcmlvZFJ4RGF0YSA9IG5ldyBsb25nW3BlcmlvZENvdW50XTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBlcmlvZENvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgcGVyaW9kUnhEYXRhW2ldID0gTG9uZy5wYXJzZUxvbmcocGFyc2VkW3BhcnNlZFVzZWQrK10pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwZXJpb2RUeERhdGEgPSBuZXcgbG9uZ1twZXJpb2RDb3VudF07CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwZXJpb2RDb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIHBlcmlvZFR4RGF0YVtpXSA9IExvbmcucGFyc2VMb25nKHBhcnNlZFtwYXJzZWRVc2VkKytdKTsKKyAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBtUGVyaW9kUnhEYXRhID0gbmV3IGxvbmdbbVBlcmlvZENvdW50XTsKLSAgICAgICAgICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgbVBlcmlvZENvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgbVBlcmlvZFJ4RGF0YVtpXSA9IExvbmcucGFyc2VMb25nKHBhcnNlZFtwYXJzZWRVc2VkKytdKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbVBlcmlvZFR4RGF0YSA9IG5ldyBsb25nW21QZXJpb2RDb3VudF07Ci0gICAgICAgICAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IG1QZXJpb2RDb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1QZXJpb2RUeERhdGFbaV0gPSBMb25nLnBhcnNlTG9uZyhwYXJzZWRbcGFyc2VkVXNlZCsrXSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1DdXJyZW50UGVyaW9kID0gSW50ZWdlci5wYXJzZUludChwYXJzZWRbcGFyc2VkVXNlZCsrXSk7Ci0gICAgICAgICAgICAgICAgbVBlcmlvZFN0YXJ0ID0gbmV3IEdyZWdvcmlhbkNhbGVuZGFyKCk7Ci0gICAgICAgICAgICAgICAgbVBlcmlvZFN0YXJ0LnNldFRpbWVJbk1pbGxpcyhMb25nLnBhcnNlTG9uZyhwYXJzZWRbcGFyc2VkVXNlZCsrXSkpOwotICAgICAgICAgICAgICAgIG1QZXJpb2RFbmQgPSBuZXcgR3JlZ29yaWFuQ2FsZW5kYXIoKTsKLSAgICAgICAgICAgICAgICBtUGVyaW9kRW5kLnNldFRpbWVJbk1pbGxpcyhMb25nLnBhcnNlTG9uZyhwYXJzZWRbcGFyc2VkVXNlZCsrXSkpOworICAgICAgICAgICAgICAgIGN1cnJlbnRQZXJpb2QgPSBJbnRlZ2VyLnBhcnNlSW50KHBhcnNlZFtwYXJzZWRVc2VkKytdKTsKKworICAgICAgICAgICAgICAgIHBlcmlvZFN0YXJ0ID0gbmV3IEdyZWdvcmlhbkNhbGVuZGFyKCk7CisgICAgICAgICAgICAgICAgcGVyaW9kU3RhcnQuc2V0VGltZUluTWlsbGlzKExvbmcucGFyc2VMb25nKHBhcnNlZFtwYXJzZWRVc2VkKytdKSk7CisgICAgICAgICAgICAgICAgcGVyaW9kRW5kID0gbmV3IEdyZWdvcmlhbkNhbGVuZGFyKCk7CisgICAgICAgICAgICAgICAgcGVyaW9kRW5kLnNldFRpbWVJbk1pbGxpcyhMb25nLnBhcnNlTG9uZyhwYXJzZWRbcGFyc2VkVXNlZCsrXSkpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBTbG9nLmUoVEFHLCAiRXJyb3IgcGFyc2luZyBkYXRhIGZpbGUgLSBpZ25vcmluZyIpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVBhcmVudCkgeworICAgICAgICAgICAgICAgIG1QZXJpb2RDb3VudCA9IHBlcmlvZENvdW50OworICAgICAgICAgICAgICAgIG1QZXJpb2RSeERhdGEgPSBwZXJpb2RSeERhdGE7CisgICAgICAgICAgICAgICAgbVBlcmlvZFR4RGF0YSA9IHBlcmlvZFR4RGF0YTsKKyAgICAgICAgICAgICAgICBtQ3VycmVudFBlcmlvZCA9IGN1cnJlbnRQZXJpb2Q7CisgICAgICAgICAgICAgICAgbVBlcmlvZFN0YXJ0ID0gcGVyaW9kU3RhcnQ7CisgICAgICAgICAgICAgICAgbVBlcmlvZEVuZCA9IHBlcmlvZEVuZDsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC0xMDkxLDE1ICsxMTE3LDE1IEBACiAgICAgICAgIH0KICAgICAgICAgcHcucHJpbnRsbigpOwogCi0gICAgICAgIHB3LnByaW50bG4oIlRoZSB0aHJlc2hvbGQgaXMgIiArIG1Qb2xpY3lUaHJlc2hvbGQgKworICAgICAgICBwdy5wcmludGxuKCJUaGUgdGhyZXNob2xkIGlzICIgKyBtUG9saWN5VGhyZXNob2xkLmdldCgpICsKICAgICAgICAgICAgICAgICAiLCBhZnRlciB3aGljaCB5b3UgZXhwZXJpbmNlIHRocm90dGxpbmcgdG8gIiArCi0gICAgICAgICAgICAgICAgbVBvbGljeVRocm90dGxlVmFsdWUgKyAia2JwcyIpOworICAgICAgICAgICAgICAgIG1Qb2xpY3lUaHJvdHRsZVZhbHVlLmdldCgpICsgImticHMiKTsKICAgICAgICAgcHcucHJpbnRsbigiQ3VycmVudCBwZXJpb2QgaXMgIiArCiAgICAgICAgICAgICAgICAgKG1SZWNvcmRlci5nZXRQZXJpb2RFbmQoKSAtIG1SZWNvcmRlci5nZXRQZXJpb2RTdGFydCgpKS8xMDAwICsgIiBzZWNvbmRzIGxvbmcgIiArCiAgICAgICAgICAgICAgICAgImFuZCBlbmRzIGluICIgKyAoZ2V0UmVzZXRUaW1lKG1JZmFjZSkgLSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSkgLyAxMDAwICsKICAgICAgICAgICAgICAgICAiIHNlY29uZHMuIik7CiAgICAgICAgIHB3LnByaW50bG4oIlBvbGxpbmcgZXZlcnkgIiArIG1Qb2xpY3lQb2xsUGVyaW9kU2VjICsgIiBzZWNvbmRzIik7Ci0gICAgICAgIHB3LnByaW50bG4oIkN1cnJlbnQgVGhyb3R0bGUgSW5kZXggaXMgIiArIG1UaHJvdHRsZUluZGV4KTsKKyAgICAgICAgcHcucHJpbnRsbigiQ3VycmVudCBUaHJvdHRsZSBJbmRleCBpcyAiICsgbVRocm90dGxlSW5kZXguZ2V0KCkpOwogICAgICAgICBwdy5wcmludGxuKCJNYXggTlRQIENhY2hlIEFnZSBpcyAiICsgbU1heE50cENhY2hlQWdlU2VjKTsKIAogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1SZWNvcmRlci5nZXRQZXJpb2RDb3VudCgpOyBpKyspIHsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1dpZmlTZXJ2aWNlLmphdmEgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9XaWZpU2VydmljZS5qYXZhCmluZGV4IDUwOWM3ODkuLjM1YmFhYTcgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1dpZmlTZXJ2aWNlLmphdmEKKysrIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvV2lmaVNlcnZpY2UuamF2YQpAQCAtMTQ0LDE5ICsxNDQsNiBAQAogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFdBS0VMT0NLX1RBRyA9ICJXaWZpU2VydmljZSI7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgbWF4aW11bSBhbW91bnQgb2YgdGltZSB0byBob2xkIHRoZSB3YWtlIGxvY2sgYWZ0ZXIgYSBkaXNjb25uZWN0Ci0gICAgICogY2F1c2VkIGJ5IHN0b3BwaW5nIHRoZSBkcml2ZXIuIEVzdGFibGlzaGluZyBhbiBFREdFIGNvbm5lY3Rpb24gaGFzIGJlZW4KLSAgICAgKiBvYnNlcnZlZCB0byB0YWtlIGFib3V0IDUgc2Vjb25kcyB1bmRlciBub3JtYWwgY2lyY3Vtc3RhbmNlcy4gVGhpcwotICAgICAqIHByb3ZpZGVzIGEgYml0IG9mIGV4dHJhIG1hcmdpbi4KLSAgICAgKiA8cD4KLSAgICAgKiBTZWUge0BsaW5rIGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3MuU2VjdXJlI1dJRklfTU9CSUxFX0RBVEFfVFJBTlNJVElPTl9XQUtFTE9DS19USU1FT1VUX01TfS4KLSAgICAgKiBUaGlzIGlzIHRoZSBkZWZhdWx0IHZhbHVlIGlmIGEgU2V0dGluZ3MuU2VjdXJlIHZhbHVlIGlzIG5vdCBwcmVzZW50LgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX1dBS0VMT0NLX1RJTUVPVVQgPSA4MDAwOwotCi0gICAgLy8gV2FrZSBsb2NrIHVzZWQgYnkgZHJpdmVyLXN0b3Agb3BlcmF0aW9uCi0gICAgcHJpdmF0ZSBzdGF0aWMgUG93ZXJNYW5hZ2VyLldha2VMb2NrIHNEcml2ZXJTdG9wV2FrZUxvY2s7CiAgICAgLy8gV2FrZSBsb2NrIHVzZWQgYnkgb3RoZXIgb3BlcmF0aW9ucwogICAgIHByaXZhdGUgc3RhdGljIFBvd2VyTWFuYWdlci5XYWtlTG9jayBzV2FrZUxvY2s7CiAKQEAgLTE2NCw3ICsxNTEsNiBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNRVNTQUdFX0RJU0FCTEVfV0lGSSAgICAgICA9IDE7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1FU1NBR0VfU1RPUF9XSUZJICAgICAgICAgID0gMjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUVTU0FHRV9TVEFSVF9XSUZJICAgICAgICAgPSAzOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNRVNTQUdFX1JFTEVBU0VfV0FLRUxPQ0sgICA9IDQ7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1FU1NBR0VfVVBEQVRFX1NUQVRFICAgICAgID0gNTsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUVTU0FHRV9TVEFSVF9BQ0NFU1NfUE9JTlQgPSA2OwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNRVNTQUdFX1NUT1BfQUNDRVNTX1BPSU5UICA9IDc7CkBAIC0yMzgsNyArMjI0LDYgQEAKIAogICAgICAgICBQb3dlck1hbmFnZXIgcG93ZXJNYW5hZ2VyID0gKFBvd2VyTWFuYWdlciltQ29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuUE9XRVJfU0VSVklDRSk7CiAgICAgICAgIHNXYWtlTG9jayA9IHBvd2VyTWFuYWdlci5uZXdXYWtlTG9jayhQb3dlck1hbmFnZXIuUEFSVElBTF9XQUtFX0xPQ0ssIFdBS0VMT0NLX1RBRyk7Ci0gICAgICAgIHNEcml2ZXJTdG9wV2FrZUxvY2sgPSBwb3dlck1hbmFnZXIubmV3V2FrZUxvY2soUG93ZXJNYW5hZ2VyLlBBUlRJQUxfV0FLRV9MT0NLLCBXQUtFTE9DS19UQUcpOwogCiAgICAgICAgIG1Db250ZXh0LnJlZ2lzdGVyUmVjZWl2ZXIoCiAgICAgICAgICAgICAgICAgbmV3IEJyb2FkY2FzdFJlY2VpdmVyKCkgewpAQCAtMjkzLDcgKzI3OCwxMCBAQAogICAgICAgICBJQmluZGVyIGIgPSBTZXJ2aWNlTWFuYWdlci5nZXRTZXJ2aWNlKENvbnRleHQuTkVUV09SS01BTkFHRU1FTlRfU0VSVklDRSk7CiAgICAgICAgIElOZXR3b3JrTWFuYWdlbWVudFNlcnZpY2Ugc2VydmljZSA9IElOZXR3b3JrTWFuYWdlbWVudFNlcnZpY2UuU3R1Yi5hc0ludGVyZmFjZShiKTsKIAotICAgICAgICBtQ20gPSAoQ29ubmVjdGl2aXR5TWFuYWdlciltQ29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuQ09OTkVDVElWSVRZX1NFUlZJQ0UpOworICAgICAgICBpZiAobUNtID09IG51bGwpIHsKKyAgICAgICAgICAgIG1DbSA9IChDb25uZWN0aXZpdHlNYW5hZ2VyKW1Db250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5DT05ORUNUSVZJVFlfU0VSVklDRSk7CisgICAgICAgIH0KKwogICAgICAgICBtV2lmaVJlZ2V4cyA9IG1DbS5nZXRUZXRoZXJhYmxlV2lmaVJlZ2V4cygpOwogCiAgICAgICAgIGZvciAoU3RyaW5nIGludGYgOiBhdmFpbGFibGUpIHsKQEAgLTE4MjksMTkgKzE4MTcsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgc1dha2VMb2NrLmFjcXVpcmUoKTsKICAgICAgICAgICAgICAgICAgICAgc2VuZFN0YXJ0TWVzc2FnZShzdHJvbmdlc3RMb2NrTW9kZSA9PSBXaWZpTWFuYWdlci5XSUZJX01PREVfU0NBTl9PTkxZKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFtV2lmaVN0YXRlVHJhY2tlci5pc0RyaXZlclN0b3BwZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBpbnQgd2FrZUxvY2tUaW1lb3V0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuZ2V0SW50KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuV0lGSV9NT0JJTEVfREFUQV9UUkFOU0lUSU9OX1dBS0VMT0NLX1RJTUVPVVRfTVMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUZBVUxUX1dBS0VMT0NLX1RJTUVPVVQpOwotICAgICAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAgICAgKiBXZSBhcmUgYXNzdW1pbmcgdGhhdCBDb25uZWN0aXZpdHlTZXJ2aWNlIGNhbiBtYWtlCi0gICAgICAgICAgICAgICAgICAgICAqIGEgdHJhbnNpdGlvbiB0byBjZWxsdWxhciBkYXRhIHdpdGhpbiB3YWtlTG9ja1RpbWVvdXQgdGltZS4KLSAgICAgICAgICAgICAgICAgICAgICogVGhlIHdha2Vsb2NrIGlzIHJlbGVhc2VkIGJ5IHRoZSBkZWxheWVkIG1lc3NhZ2UuCi0gICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICBzRHJpdmVyU3RvcFdha2VMb2NrLmFjcXVpcmUoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1DbSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtQ20gPSAoQ29ubmVjdGl2aXR5TWFuYWdlciltQ29udGV4dC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LkNPTk5FQ1RJVklUWV9TRVJWSUNFKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtQ20ucmVxdWVzdE5ldHdvcmtUcmFuc2l0aW9uV2FrZWxvY2soVEFHKTsKICAgICAgICAgICAgICAgICAgICAgbVdpZmlIYW5kbGVyLnNlbmRFbXB0eU1lc3NhZ2UoTUVTU0FHRV9TVE9QX1dJRkkpOwotICAgICAgICAgICAgICAgICAgICBtV2lmaUhhbmRsZXIuc2VuZEVtcHR5TWVzc2FnZURlbGF5ZWQoTUVTU0FHRV9SRUxFQVNFX1dBS0VMT0NLLCB3YWtlTG9ja1RpbWVvdXQpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgc1dha2VMb2NrLmFjcXVpcmUoKTsKQEAgLTE5MjcsMTAgKzE5MDgsNiBAQAogICAgICAgICAgICAgICAgICAgICAvLyBkb24ndCByZWxlYXNlIHdha2Vsb2NrCiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogCi0gICAgICAgICAgICAgICAgY2FzZSBNRVNTQUdFX1JFTEVBU0VfV0FLRUxPQ0s6Ci0gICAgICAgICAgICAgICAgICAgIHNEcml2ZXJTdG9wV2FrZUxvY2sucmVsZWFzZSgpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQogICAgICAgICAgICAgICAgIGNhc2UgTUVTU0FHRV9TVEFSVF9BQ0NFU1NfUE9JTlQ6CiAgICAgICAgICAgICAgICAgICAgIHNldFdpZmlBcEVuYWJsZWRCbG9ja2luZyh0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnLmFyZzEsCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9XaW5kb3dNYW5hZ2VyU2VydmljZS5qYXZhIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvV2luZG93TWFuYWdlclNlcnZpY2UuamF2YQppbmRleCA5NWFiNWJjLi5jZjRhNjBlIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9XaW5kb3dNYW5hZ2VyU2VydmljZS5qYXZhCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1dpbmRvd01hbmFnZXJTZXJ2aWNlLmphdmEKQEAgLTE1Niw3ICsxNTYsNiBAQAogICAgIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHX1NUQVJUSU5HX1dJTkRPVyA9IGZhbHNlOwogICAgIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHX1JFT1JERVIgPSBmYWxzZTsKICAgICBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVR19XQUxMUEFQRVIgPSBmYWxzZTsKLSAgICBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVR19GUkVFWkUgPSBmYWxzZTsKICAgICBzdGF0aWMgZmluYWwgYm9vbGVhbiBTSE9XX1RSQU5TQUNUSU9OUyA9IGZhbHNlOwogICAgIHN0YXRpYyBmaW5hbCBib29sZWFuIEhJREVfU1RBQ0tfQ1JBV0xTID0gdHJ1ZTsKICAgICBzdGF0aWMgZmluYWwgYm9vbGVhbiBNRUFTVVJFX0xBVEVOQ1kgPSBmYWxzZTsKQEAgLTQ1NDksOCArNDU0OCw3IEBACiAgICAgICAgICAgICBmaW5hbCBpbnQgTiA9IG1XaW5kb3dzLnNpemUoKTsKICAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxOOyBpKyspIHsKICAgICAgICAgICAgICAgICBXaW5kb3dTdGF0ZSB3ID0gKFdpbmRvd1N0YXRlKW1XaW5kb3dzLmdldChpKTsKLSAgICAgICAgICAgICAgICBpZiAody5pc1Zpc2libGVMdygpICYmICF3Lm1PYnNjdXJlZAotICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHcubU9yaWVudGF0aW9uQ2hhbmdpbmcgfHwgIXcuaXNEcmF3bkx3KCkpKSB7CisgICAgICAgICAgICAgICAgaWYgKHcuaXNWaXNpYmxlTHcoKSAmJiAhdy5tT2JzY3VyZWQgJiYgIXcuaXNEcmF3bkx3KCkpIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KQEAgLTU3NzMsMTkgKzU3NzEsMjQgQEAKICAgICAgICAgICAgICAgICAgICAgV2luZG93U3RhdGUgb3V0ID0gbUtleVdhaXRlci5tT3V0c2lkZVRvdWNoVGFyZ2V0czsKICAgICAgICAgICAgICAgICAgICAgaWYgKG91dCAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBNb3Rpb25FdmVudCBvZXYgPSBNb3Rpb25FdmVudC5vYnRhaW4oZXYpOwotICAgICAgICAgICAgICAgICAgICAgICAgb2V2LnNldEFjdGlvbihNb3Rpb25FdmVudC5BQ1RJT05fT1VUU0lERSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkbyB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgUmVjdCBmcmFtZSA9IG91dC5tRnJhbWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2V2Lm9mZnNldExvY2F0aW9uKC0oZmxvYXQpZnJhbWUubGVmdCwgLShmbG9hdClmcmFtZS50b3ApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dC5tQ2xpZW50LmRpc3BhdGNoUG9pbnRlcihvZXYsIGV2ZW50VGltZSwgZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2xvZy5pKFRBRywgIldJTkRPVyBESUVEIGR1cmluZyBvdXRzaWRlIG1vdGlvbiBkaXNwYXRjaDogIiArIG91dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ldi5vZmZzZXRMb2NhdGlvbigoZmxvYXQpZnJhbWUubGVmdCwgKGZsb2F0KWZyYW1lLnRvcCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0ID0gb3V0Lm1OZXh0T3V0c2lkZVRvdWNoOwotICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAob3V0ICE9IG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgbUtleVdhaXRlci5tT3V0c2lkZVRvdWNoVGFyZ2V0cyA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ldi5zZXRBY3Rpb24oTW90aW9uRXZlbnQuQUNUSU9OX09VVFNJREUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgUmVjdCBmcmFtZSA9IG91dC5tRnJhbWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ldi5vZmZzZXRMb2NhdGlvbigtKGZsb2F0KWZyYW1lLmxlZnQsIC0oZmxvYXQpZnJhbWUudG9wKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dC5tQ2xpZW50LmRpc3BhdGNoUG9pbnRlcihvZXYsIGV2ZW50VGltZSwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbG9nLmkoVEFHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiV0lORE9XIERJRUQgZHVyaW5nIG91dHNpZGUgbW90aW9uIGRpc3BhdGNoOiAiICsgb3V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZXYub2Zmc2V0TG9jYXRpb24oKGZsb2F0KWZyYW1lLmxlZnQsIChmbG9hdClmcmFtZS50b3ApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQgPSBvdXQubU5leHRPdXRzaWRlVG91Y2g7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAob3V0ICE9IG51bGwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1LZXlXYWl0ZXIubU91dHNpZGVUb3VjaFRhcmdldHMgPSBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZXYucmVjeWNsZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogCkBAIC04NTU3LDcgKzg1NjAsNyBAQAogICAgICAgICAgICAgZmluYWwgQXBwV2luZG93VG9rZW4gYXRva2VuID0gbUFwcFRva2VuOwogICAgICAgICAgICAgcmV0dXJuIG1TdXJmYWNlICE9IG51bGwgJiYgIW1BdHRhY2hlZEhpZGRlbgogICAgICAgICAgICAgICAgICAgICAmJiAoYXRva2VuID09IG51bGwgPyBtUG9saWN5VmlzaWJpbGl0eSA6ICFhdG9rZW4uaGlkZGVuUmVxdWVzdGVkKQotICAgICAgICAgICAgICAgICAgICAmJiAobU9yaWVudGF0aW9uQ2hhbmdpbmcgfHwgKCFtRHJhd1BlbmRpbmcgJiYgIW1Db21taXREcmF3UGVuZGluZykpCisgICAgICAgICAgICAgICAgICAgICYmICFtRHJhd1BlbmRpbmcgJiYgIW1Db21taXREcmF3UGVuZGluZwogICAgICAgICAgICAgICAgICAgICAmJiAhbUV4aXRpbmcgJiYgIW1EZXN0cm95aW5nOwogICAgICAgICB9CiAKQEAgLTg2NjEsMTQgKzg2NjQsMTIgQEAKIAogICAgICAgICAvKioKICAgICAgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSB3aW5kb3cgaGFzIGEgc3VyZmFjZSB0aGF0IGl0IGhhcyBkcmF3biBhCi0gICAgICAgICAqIGNvbXBsZXRlIFVJIGluIHRvLiAgTm90ZSB0aGF0IHRoaXMgcmV0dXJucyB0cnVlIGlmIHRoZSBvcmllbnRhdGlvbgotICAgICAgICAgKiBpcyBjaGFuZ2luZyBldmVuIGlmIHRoZSB3aW5kb3cgaGFzbid0IHJlZHJhd24gYmVjYXVzZSB3ZSBkb24ndCB3YW50Ci0gICAgICAgICAqIHRvIHN0b3AgdGhpbmdzIGZyb20gZXhlY3V0aW5nIGR1cmluZyB0aGF0IHRpbWUuCisgICAgICAgICAqIGNvbXBsZXRlIFVJIGluIHRvLgogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIGJvb2xlYW4gaXNEcmF3bkx3KCkgewogICAgICAgICAgICAgZmluYWwgQXBwV2luZG93VG9rZW4gYXRva2VuID0gbUFwcFRva2VuOwogICAgICAgICAgICAgcmV0dXJuIG1TdXJmYWNlICE9IG51bGwgJiYgIW1EZXN0cm95aW5nCi0gICAgICAgICAgICAgICAgJiYgKG1PcmllbnRhdGlvbkNoYW5naW5nIHx8ICghbURyYXdQZW5kaW5nICYmICFtQ29tbWl0RHJhd1BlbmRpbmcpKTsKKyAgICAgICAgICAgICAgICAmJiAhbURyYXdQZW5kaW5nICYmICFtQ29tbWl0RHJhd1BlbmRpbmc7CiAgICAgICAgIH0KIAogICAgICAgICBwdWJsaWMgYm9vbGVhbiBmaWxsc1NjcmVlbkx3KGludCBzY3JlZW5XaWR0aCwgaW50IHNjcmVlbkhlaWdodCwKQEAgLTEwOTQxLDEyICsxMDk0Miw2IEBACiAgICAgICAgICAgICAgICAgICAgIGlmICh3Lm1BdHRhY2hlZEhpZGRlbiB8fCAhdy5pc1JlYWR5Rm9yRGlzcGxheSgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXcubUxhc3RIaWRkZW4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2R1bXAoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUdfQ09ORklHVVJBVElPTikgU2xvZy52KFRBRywgIldpbmRvdyBoaWRpbmc6IHdhaXRpbmdUb1Nob3c9IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB3Lm1Sb290VG9rZW4ud2FpdGluZ1RvU2hvdyArICIgcG9sdmlzPSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdy5tUG9saWN5VmlzaWJpbGl0eSArICIgYXR0aGlkPSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdy5tQXR0YWNoZWRIaWRkZW4gKyAiIHRva2hpZD0iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHcubVJvb3RUb2tlbi5oaWRkZW4gKyAiIHZpcz0iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHcubVZpZXdWaXNpYmlsaXR5KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3Lm1MYXN0SGlkZGVuID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoU0hPV19UUkFOU0FDVElPTlMpIGxvZ1N1cmZhY2UodywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJISURFIChwZXJmb3JtTGF5b3V0KSIsIG51bGwpOwpAQCAtMTEzNDIsMjggKzExMzM3LDIzIEBACiAgICAgICAgIH0gZWxzZSBpZiAoYW5pbWF0aW5nKSB7CiAgICAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uTG9ja2VkKGN1cnJlbnRUaW1lKygxMDAwLzYwKS1TeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKSk7CiAgICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmIChERUJVR19GUkVFWkUpIFNsb2cudihUQUcsICJMYXlvdXQ6IG1EaXNwbGF5RnJvemVuPSIgKyBtRGlzcGxheUZyb3plbgotICAgICAgICAgICAgICAgICsgIiBob2xkU2NyZWVuPSIgKyBob2xkU2NyZWVuKTsKLSAgICAgICAgaWYgKCFtRGlzcGxheUZyb3plbikgewotICAgICAgICAgICAgc2V0SG9sZFNjcmVlbkxvY2tlZChob2xkU2NyZWVuICE9IG51bGwpOwotICAgICAgICAgICAgaWYgKHNjcmVlbkJyaWdodG5lc3MgPCAwIHx8IHNjcmVlbkJyaWdodG5lc3MgPiAxLjBmKSB7Ci0gICAgICAgICAgICAgICAgbVBvd2VyTWFuYWdlci5zZXRTY3JlZW5CcmlnaHRuZXNzT3ZlcnJpZGUoLTEpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtUG93ZXJNYW5hZ2VyLnNldFNjcmVlbkJyaWdodG5lc3NPdmVycmlkZSgoaW50KQotICAgICAgICAgICAgICAgICAgICAgICAgKHNjcmVlbkJyaWdodG5lc3MgKiBQb3dlci5CUklHSFRORVNTX09OKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoYnV0dG9uQnJpZ2h0bmVzcyA8IDAgfHwgYnV0dG9uQnJpZ2h0bmVzcyA+IDEuMGYpIHsKLSAgICAgICAgICAgICAgICBtUG93ZXJNYW5hZ2VyLnNldEJ1dHRvbkJyaWdodG5lc3NPdmVycmlkZSgtMSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1Qb3dlck1hbmFnZXIuc2V0QnV0dG9uQnJpZ2h0bmVzc092ZXJyaWRlKChpbnQpCi0gICAgICAgICAgICAgICAgICAgICAgICAoYnV0dG9uQnJpZ2h0bmVzcyAqIFBvd2VyLkJSSUdIVE5FU1NfT04pKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChob2xkU2NyZWVuICE9IG1Ib2xkaW5nU2NyZWVuT24pIHsKLSAgICAgICAgICAgICAgICBtSG9sZGluZ1NjcmVlbk9uID0gaG9sZFNjcmVlbjsKLSAgICAgICAgICAgICAgICBNZXNzYWdlIG0gPSBtSC5vYnRhaW5NZXNzYWdlKEguSE9MRF9TQ1JFRU5fQ0hBTkdFRCwgaG9sZFNjcmVlbik7Ci0gICAgICAgICAgICAgICAgbUguc2VuZE1lc3NhZ2UobSk7Ci0gICAgICAgICAgICB9CisgICAgICAgIHNldEhvbGRTY3JlZW5Mb2NrZWQoaG9sZFNjcmVlbiAhPSBudWxsKTsKKyAgICAgICAgaWYgKHNjcmVlbkJyaWdodG5lc3MgPCAwIHx8IHNjcmVlbkJyaWdodG5lc3MgPiAxLjBmKSB7CisgICAgICAgICAgICBtUG93ZXJNYW5hZ2VyLnNldFNjcmVlbkJyaWdodG5lc3NPdmVycmlkZSgtMSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtUG93ZXJNYW5hZ2VyLnNldFNjcmVlbkJyaWdodG5lc3NPdmVycmlkZSgoaW50KQorICAgICAgICAgICAgICAgICAgICAoc2NyZWVuQnJpZ2h0bmVzcyAqIFBvd2VyLkJSSUdIVE5FU1NfT04pKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYnV0dG9uQnJpZ2h0bmVzcyA8IDAgfHwgYnV0dG9uQnJpZ2h0bmVzcyA+IDEuMGYpIHsKKyAgICAgICAgICAgIG1Qb3dlck1hbmFnZXIuc2V0QnV0dG9uQnJpZ2h0bmVzc092ZXJyaWRlKC0xKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1Qb3dlck1hbmFnZXIuc2V0QnV0dG9uQnJpZ2h0bmVzc092ZXJyaWRlKChpbnQpCisgICAgICAgICAgICAgICAgICAgIChidXR0b25CcmlnaHRuZXNzICogUG93ZXIuQlJJR0hUTkVTU19PTikpOworICAgICAgICB9CisgICAgICAgIGlmIChob2xkU2NyZWVuICE9IG1Ib2xkaW5nU2NyZWVuT24pIHsKKyAgICAgICAgICAgIG1Ib2xkaW5nU2NyZWVuT24gPSBob2xkU2NyZWVuOworICAgICAgICAgICAgTWVzc2FnZSBtID0gbUgub2J0YWluTWVzc2FnZShILkhPTERfU0NSRUVOX0NIQU5HRUQsIGhvbGRTY3JlZW4pOworICAgICAgICAgICAgbUguc2VuZE1lc3NhZ2UobSk7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAobVR1cm5PblNjcmVlbikgewpAQCAtMTE2NTUsOCArMTE2NDUsNiBAQAogICAgICAgICAgICAgbUZyZWV6ZUdjUGVuZGluZyA9IG5vdzsKICAgICAgICAgfQogCi0gICAgICAgIGlmIChERUJVR19GUkVFWkUpIFNsb2cudihUQUcsICIqKiogRlJFRVpJTkcgRElTUExBWSIsIG5ldyBSdW50aW1lRXhjZXB0aW9uKCkpOwotICAgICAgICAKICAgICAgICAgbURpc3BsYXlGcm96ZW4gPSB0cnVlOwogICAgICAgICBpZiAobU5leHRBcHBUcmFuc2l0aW9uICE9IFdpbmRvd01hbmFnZXJQb2xpY3kuVFJBTlNJVF9VTlNFVCkgewogICAgICAgICAgICAgbU5leHRBcHBUcmFuc2l0aW9uID0gV2luZG93TWFuYWdlclBvbGljeS5UUkFOU0lUX1VOU0VUOwpAQCAtMTE2ODAsOCArMTE2NjgsNiBAQAogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAgICAgICAgIAotICAgICAgICBpZiAoREVCVUdfRlJFRVpFKSBTbG9nLnYoVEFHLCAiKioqIFVORlJFRVpJTkcgRElTUExBWSIsIG5ldyBSdW50aW1lRXhjZXB0aW9uKCkpOwotICAgICAgICAKICAgICAgICAgbURpc3BsYXlGcm96ZW4gPSBmYWxzZTsKICAgICAgICAgbUgucmVtb3ZlTWVzc2FnZXMoSC5BUFBfRlJFRVpFX1RJTUVPVVQpOwogICAgICAgICBpZiAoUFJPRklMRV9PUklFTlRBVElPTikgewpkaWZmIC0tZ2l0IGEvc2VydmljZXMvam5pL2NvbV9hbmRyb2lkX3NlcnZlcl9sb2NhdGlvbl9HcHNMb2NhdGlvblByb3ZpZGVyLmNwcCBiL3NlcnZpY2VzL2puaS9jb21fYW5kcm9pZF9zZXJ2ZXJfbG9jYXRpb25fR3BzTG9jYXRpb25Qcm92aWRlci5jcHAKaW5kZXggMGI0MWRkOC4uN2JmMzJmMyAxMDA3NTUKLS0tIGEvc2VydmljZXMvam5pL2NvbV9hbmRyb2lkX3NlcnZlcl9sb2NhdGlvbl9HcHNMb2NhdGlvblByb3ZpZGVyLmNwcAorKysgYi9zZXJ2aWNlcy9qbmkvY29tX2FuZHJvaWRfc2VydmVyX2xvY2F0aW9uX0dwc0xvY2F0aW9uUHJvdmlkZXIuY3BwCkBAIC0yNTgsOSArMjU4LDkgQEAKICAgICAgICAgc0FHcHNJbnRlcmZhY2UtPmluaXQoJnNBR3BzQ2FsbGJhY2tzKTsKIAogICAgIGlmICghc0dwc05pSW50ZXJmYWNlKQotICAgICAgIHNHcHNOaUludGVyZmFjZSA9IChjb25zdCBHcHNOaUludGVyZmFjZSopc0dwc0ludGVyZmFjZS0+Z2V0X2V4dGVuc2lvbihHUFNfTklfSU5URVJGQUNFKTsKKyAgICAgICAgc0dwc05pSW50ZXJmYWNlID0gKGNvbnN0IEdwc05pSW50ZXJmYWNlKilzR3BzSW50ZXJmYWNlLT5nZXRfZXh0ZW5zaW9uKEdQU19OSV9JTlRFUkZBQ0UpOwogICAgIGlmIChzR3BzTmlJbnRlcmZhY2UpCi0gICAgICAgc0dwc05pSW50ZXJmYWNlLT5pbml0KCZzR3BzTmlDYWxsYmFja3MpOworICAgICAgICBzR3BzTmlJbnRlcmZhY2UtPmluaXQoJnNHcHNOaUNhbGxiYWNrcyk7CiAKICAgICBpZiAoIXNHcHNEZWJ1Z0ludGVyZmFjZSkKICAgICAgICBzR3BzRGVidWdJbnRlcmZhY2UgPSAoY29uc3QgR3BzRGVidWdJbnRlcmZhY2UqKXNHcHNJbnRlcmZhY2UtPmdldF9leHRlbnNpb24oR1BTX0RFQlVHX0lOVEVSRkFDRSk7CkBAIC00MjYsMTIgKzQyNiwxMCBAQAogc3RhdGljIHZvaWQgYW5kcm9pZF9sb2NhdGlvbl9HcHNMb2NhdGlvblByb3ZpZGVyX3NlbmRfbmlfcmVzcG9uc2UoSk5JRW52KiBlbnYsIGpvYmplY3Qgb2JqLAogICAgICAgamludCBub3RpZklkLCBqaW50IHJlc3BvbnNlKQogewotICAgIGlmICghc0dwc05pSW50ZXJmYWNlKSB7CisgICAgaWYgKCFzR3BzTmlJbnRlcmZhY2UpCiAgICAgICAgIHNHcHNOaUludGVyZmFjZSA9IChjb25zdCBHcHNOaUludGVyZmFjZSopc0dwc0ludGVyZmFjZS0+Z2V0X2V4dGVuc2lvbihHUFNfTklfSU5URVJGQUNFKTsKLSAgICB9Ci0gICAgaWYgKHNHcHNOaUludGVyZmFjZSkgeworICAgIGlmIChzR3BzTmlJbnRlcmZhY2UpCiAgICAgICAgIHNHcHNOaUludGVyZmFjZS0+cmVzcG9uZChub3RpZklkLCByZXNwb25zZSk7Ci0gICAgfQogfQogCiBzdGF0aWMganN0cmluZyBhbmRyb2lkX2xvY2F0aW9uX0dwc0xvY2F0aW9uUHJvdmlkZXJfZ2V0X2ludGVybmFsX3N0YXRlKEpOSUVudiogZW52LCBqb2JqZWN0IG9iaikKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3Rlc3RzL3NlcnZpY2VzdGVzdHMvQW5kcm9pZC5tayBiL3NlcnZpY2VzL3Rlc3RzL3NlcnZpY2VzdGVzdHMvQW5kcm9pZC5tawppbmRleCBiMDdhMTBiLi4xODZiMzQ5IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy90ZXN0cy9zZXJ2aWNlc3Rlc3RzL0FuZHJvaWQubWsKKysrIGIvc2VydmljZXMvdGVzdHMvc2VydmljZXN0ZXN0cy9BbmRyb2lkLm1rCkBAIC03LDggKzcsMTAgQEAKICMgSW5jbHVkZSBhbGwgdGVzdCBqYXZhIGZpbGVzLgogTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKQogCitMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gZWFzeW1vY2tsaWIKIAogTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZC50ZXN0LnJ1bm5lciBzZXJ2aWNlcworCiBMT0NBTF9QQUNLQUdFX05BTUUgOj0gRnJhbWV3b3Jrc1NlcnZpY2VzVGVzdHMKIAogTE9DQUxfQ0VSVElGSUNBVEUgOj0gcGxhdGZvcm0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3Rlc3RzL3NlcnZpY2VzdGVzdHMvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3NlcnZpY2VzL3Rlc3RzL3NlcnZpY2VzdGVzdHMvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCA1Y2UxMDlmLi5mMTE1ZjQyIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy90ZXN0cy9zZXJ2aWNlc3Rlc3RzL0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvc2VydmljZXMvdGVzdHMvc2VydmljZXN0ZXN0cy9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0yMyw2ICsyMywxOSBAQAogICAgIAogICAgIDxhcHBsaWNhdGlvbj4KICAgICAgICAgPHVzZXMtbGlicmFyeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQudGVzdC5ydW5uZXIiIC8+CisKKyAgICAgICAgPHNlcnZpY2UgYW5kcm9pZDpuYW1lPSJjb20uYW5kcm9pZC5zZXJ2ZXIuQWNjZXNzaWJpbGl0eU1hbmFnZXJTZXJ2aWNlVGVzdCRNeUZpcnN0TW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlIj4KKyAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlLkFjY2Vzc2liaWxpdHlTZXJ2aWNlIi8+CisgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L3NlcnZpY2U+CisKKyAgICAgICAgPHNlcnZpY2UgYW5kcm9pZDpuYW1lPSJjb20uYW5kcm9pZC5zZXJ2ZXIuQWNjZXNzaWJpbGl0eU1hbmFnZXJTZXJ2aWNlVGVzdCRNeVNlY29uZE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZSI+CisgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5BY2Nlc3NpYmlsaXR5U2VydmljZSIvPgorICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9zZXJ2aWNlPgorCiAgICAgPC9hcHBsaWNhdGlvbj4KIAogICAgIDxpbnN0cnVtZW50YXRpb24KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3Rlc3RzL3NlcnZpY2VzdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9BY2Nlc3NpYmlsaXR5TWFuYWdlclNlcnZpY2VUZXN0LmphdmEgYi9zZXJ2aWNlcy90ZXN0cy9zZXJ2aWNlc3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvQWNjZXNzaWJpbGl0eU1hbmFnZXJTZXJ2aWNlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2ZTNhODIKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy90ZXN0cy9zZXJ2aWNlc3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvQWNjZXNzaWJpbGl0eU1hbmFnZXJTZXJ2aWNlVGVzdC5qYXZhCkBAIC0wLDAgKzEsNzI5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5zZXJ2ZXI7CisKK2ltcG9ydCBhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlLkFjY2Vzc2liaWxpdHlTZXJ2aWNlOworaW1wb3J0IGFuZHJvaWQuYWNjZXNzaWJpbGl0eXNlcnZpY2UuQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5TZXJ2aWNlSW5mbzsKK2ltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOworaW1wb3J0IGFuZHJvaWQub3MuU2VydmljZU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKK2ltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzOworaW1wb3J0IGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2U7CitpbXBvcnQgYW5kcm9pZC50ZXN0LnN1aXRlYnVpbGRlci5hbm5vdGF0aW9uLkxhcmdlVGVzdDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5RXZlbnQ7CitpbXBvcnQgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuSUFjY2Vzc2liaWxpdHlNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LklBY2Nlc3NpYmlsaXR5TWFuYWdlckNsaWVudDsKKworLyoqCisgKiBUaGlzIHRlc3QgZXhlcmNpc2VzIHRoZQorICoge0BsaW5rIGNvbS5hbmRyb2lkLnNlcnZlci5BY2Nlc3NpYmlsaXR5TWFuYWdlclNlcnZpY2V9IGJ5IG1vY2tpbmcgdGhlCisgKiB7QGxpbmsgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eU1hbmFnZXJ9IHdoaWNoIHRhbGtzIHRvIHRvIHRoZQorICogc2VydmljZS4gVGhlIHNlcnZpY2UgaXRzZWxmIGlzIGludGVyYWN0aW5nIHdpdGggdGhlIHBsYXRmb3JtLiBOb3RlOiBUZXN0aW5nCisgKiB0aGUgc2VydmljZSBpbiBmdWxsIGlzb2xhdGlvbiB3b3VsZCByZXF1aXJlIHNpZ25pZmljYW50IGFtb3VudCBvZiB3b3JrIGZvcgorICogbW9ja2luZyBhbGwgc3lzdGVtIGludGVyYWN0aW9ucy4gSXQgd291bGQgYWxzbyByZXF1aXJlIGEgbG90IG9mIG1vY2tpbmcgY29kZS4KKyAqLworcHVibGljIGNsYXNzIEFjY2Vzc2liaWxpdHlNYW5hZ2VyU2VydmljZVRlc3QgZXh0ZW5kcyBBbmRyb2lkVGVzdENhc2UgeworCisgICAgLyoqCisgICAgICogVGltZW91dCByZXF1aXJlZCBmb3IgcGVuZGluZyBCaW5kZXIgY2FsbHMgb3IgZXZlbnQgcHJvY2Vzc2luZyB0bworICAgICAqIGNvbXBsZXRlLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgVElNRU9VVF9CSU5ERVJfQ0FMTCA9IDEwMDsKKworICAgIC8qKgorICAgICAqIFRpbWVvdXQgaW4gd2hpY2ggd2UgYXJlIHdhaXRpbmcgZm9yIHRoZSBzeXN0ZW0gdG8gc3RhcnQgdGhlIG1vY2sKKyAgICAgKiBhY2Nlc3NpYmlsaXR5IHNlcnZpY2VzLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgVElNRU9VVF9TVEFSVF9NT0NLX0FDQ0VTU0lCSUxJVFlfU0VSVklDRVMgPSAzMDA7CisKKyAgICAvKioKKyAgICAgKiBUaW1lb3V0IHVzZWQgZm9yIHRlc3RpbmcgdGhhdCBhIHNlcnZpY2UgaXMgbm90aWZpZWQgb25seSB1cG9uIGEKKyAgICAgKiBub3RpZmljYXRpb24gdGltZW91dC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIFRJTUVPVVRfVEVTVF9OT1RJRklDQVRJT05fVElNRU9VVCA9IDMwMDsKKworICAgIC8qKgorICAgICAqIFRoZSBwYWNrYWdlIG5hbWUuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHNQYWNrYWdlTmFtZTsKKworICAgIC8qKgorICAgICAqIFRoZSBpbnRlcmZhY2UgdXNlZCB0byB0YWxrIHRvIHRoZSB0ZXN0ZWQgc2VydmljZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIElBY2Nlc3NpYmlsaXR5TWFuYWdlciBtTWFuYWdlclNlcnZpY2U7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRDb250ZXh0KENvbnRleHQgY29udGV4dCkgeworICAgICAgICBzdXBlci5zZXRDb250ZXh0KGNvbnRleHQpOworICAgICAgICBpZiAoc1BhY2thZ2VOYW1lID09IG51bGwpIHsKKyAgICAgICAgICAgIHNQYWNrYWdlTmFtZSA9IGNvbnRleHQuZ2V0UGFja2FnZU5hbWUoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCisgICAgICovCisgICAgcHVibGljIEFjY2Vzc2liaWxpdHlNYW5hZ2VyU2VydmljZVRlc3QoKSB7CisgICAgICAgIElCaW5kZXIgaUJpbmRlciA9IFNlcnZpY2VNYW5hZ2VyLmdldFNlcnZpY2UoQ29udGV4dC5BQ0NFU1NJQklMSVRZX1NFUlZJQ0UpOworICAgICAgICBtTWFuYWdlclNlcnZpY2UgPSBJQWNjZXNzaWJpbGl0eU1hbmFnZXIuU3R1Yi5hc0ludGVyZmFjZShpQmluZGVyKTsKKyAgICB9CisKKyAgICBATGFyZ2VUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFkZENsaWVudF9BY2Nlc3NpYmlsaXR5RGlzYWJsZWRUaGVuRW5hYmxlZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBtYWtlIHN1cmUgYWNjZXNzaWJpbGl0eSBpcyBkaXNhYmxlZAorICAgICAgICBlbnN1cmVBY2Nlc3NpYmlsaXR5RW5hYmxlZChtQ29udGV4dCwgZmFsc2UpOworCisgICAgICAgIC8vIGNyZWF0ZSBhIGNsaWVudCBtb2NrIGluc3RhbmNlCisgICAgICAgIE15TW9ja0FjY2Vzc2liaWxpdHlNYW5hZ2VyQ2xpZW50IG1vY2tDbGllbnQgPSBuZXcgTXlNb2NrQWNjZXNzaWJpbGl0eU1hbmFnZXJDbGllbnQoKTsKKworICAgICAgICAvLyBpbnZva2UgdGhlIG1ldGhvZCB1bmRlciB0ZXN0CisgICAgICAgIGJvb2xlYW4gZW5hYmxlZEFjY2Vzc2liaWxpdHlEaXNhYmxlZCA9IG1NYW5hZ2VyU2VydmljZS5hZGRDbGllbnQobW9ja0NsaWVudCk7CisKKyAgICAgICAgLy8gY2hlY2sgZXhwZWN0ZWQgcmVzdWx0CisgICAgICAgIGFzc2VydEZhbHNlKCJUaGUgY2xpZW50IG11c3QgYmUgZGlzYWJsZWQgc2luY2UgYWNjZXNzaWJpbGl0eSBpcyBkaXNhYmxlZC4iLAorICAgICAgICAgICAgICAgIGVuYWJsZWRBY2Nlc3NpYmlsaXR5RGlzYWJsZWQpOworCisgICAgICAgIC8vIGVuYWJsZSBhY2Nlc3NpYmlsaXR5CisgICAgICAgIGVuc3VyZUFjY2Vzc2liaWxpdHlFbmFibGVkKG1Db250ZXh0LCB0cnVlKTsKKworICAgICAgICAvLyBpbnZva2UgdGhlIG1ldGhvZCB1bmRlciB0ZXN0CisgICAgICAgIGJvb2xlYW4gZW5hYmxlZEFjY2Vzc2liaWxpdHlFbmFibGVkID0gbU1hbmFnZXJTZXJ2aWNlLmFkZENsaWVudChtb2NrQ2xpZW50KTsKKworICAgICAgICAvLyBjaGVjayBleHBlY3RlZCByZXN1bHQKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIGNsaWVudCBtdXN0IGJlIGVuYWJsZWQgc2luY2UgYWNjZXNzaWJpbGl0eSBpcyBlbmFibGVkLiIsCisgICAgICAgICAgICAgICAgZW5hYmxlZEFjY2Vzc2liaWxpdHlFbmFibGVkKTsKKyAgICB9CisKKyAgICBATGFyZ2VUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFkZENsaWVudF9BY2Nlc3NpYmlsaXR5RW5hYmxlZFRoZW5EaXNhYmxlZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBlbmFibGUgYWNjZXNzaWJpbGl0eSBiZWZvcmUgcmVnaXN0ZXJpbmcgdGhlIGNsaWVudAorICAgICAgICBlbnN1cmVBY2Nlc3NpYmlsaXR5RW5hYmxlZChtQ29udGV4dCwgdHJ1ZSk7CisKKyAgICAgICAgLy8gY3JlYXRlIGEgY2xpZW50IG1vY2sgaW5zdGFuY2UKKyAgICAgICAgTXlNb2NrQWNjZXNzaWJpbGl0eU1hbmFnZXJDbGllbnQgbW9ja0NsaWVudCA9IG5ldyBNeU1vY2tBY2Nlc3NpYmlsaXR5TWFuYWdlckNsaWVudCgpOworCisgICAgICAgIC8vIGludm9rZSB0aGUgbWV0aG9kIHVuZGVyIHRlc3QKKyAgICAgICAgYm9vbGVhbiBlbmFibGVkQWNjZXNzaWJpbGl0eUVuYWJsZWQgPSBtTWFuYWdlclNlcnZpY2UuYWRkQ2xpZW50KG1vY2tDbGllbnQpOworCisgICAgICAgIC8vIGNoZWNrIGV4cGVjdGVkIHJlc3VsdAorICAgICAgICBhc3NlcnRUcnVlKCJUaGUgY2xpZW50IG11c3QgYmUgZW5hYmxlZCBzaW5jZSBhY2Nlc3NpYmlsaXR5IGlzIGVuYWJsZWQuIiwKKyAgICAgICAgICAgICAgICBlbmFibGVkQWNjZXNzaWJpbGl0eUVuYWJsZWQpOworCisgICAgICAgIC8vIGRpc2FibGUgYWNjZXNzaWJpbGl0eQorICAgICAgICBlbnN1cmVBY2Nlc3NpYmlsaXR5RW5hYmxlZChtQ29udGV4dCwgZmFsc2UpOworCisgICAgICAgIC8vIGludm9rZSB0aGUgbWV0aG9kIHVuZGVyIHRlc3QKKyAgICAgICAgYm9vbGVhbiBlbmFibGVkQWNjZXNzaWJpbGl0eURpc2FibGVkID0gbU1hbmFnZXJTZXJ2aWNlLmFkZENsaWVudChtb2NrQ2xpZW50KTsKKworICAgICAgICAvLyBjaGVjayBleHBlY3RlZCByZXN1bHQKKyAgICAgICAgYXNzZXJ0RmFsc2UoIlRoZSBjbGllbnQgbXVzdCBiZSBkaXNhYmxlZCBzaW5jZSBhY2Nlc3NpYmlsaXR5IGlzIGRpc2FibGVkLiIsCisgICAgICAgICAgICAgICAgZW5hYmxlZEFjY2Vzc2liaWxpdHlEaXNhYmxlZCk7CisgICAgfQorCisgICAgQExhcmdlVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRBY2Nlc3NpYmlsaXR5U2VydmljZXNMaXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGJvb2xlYW4gZmlyc3RNb2NrU2VydmljZUluc3RhbGxlZCA9IGZhbHNlOworICAgICAgICBib29sZWFuIHNlY29uZE1vY2tTZXJ2aWNlSW5zdGFsbGVkID0gZmFsc2U7CisKKyAgICAgICAgU3RyaW5nIHBhY2thZ2VOYW1lID0gZ2V0Q29udGV4dCgpLmdldFBhY2thZ2VOYW1lKCk7CisgICAgICAgIFN0cmluZyBmaXJzdE1vY2tTZXJ2aWNlQ2xhc3NOYW1lID0gTXlGaXJzdE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZS5jbGFzcy5nZXROYW1lKCk7CisgICAgICAgIFN0cmluZyBzZWNvbmRNb2NrU2VydmljZUNsYXNzTmFtZSA9IE15U2Vjb25kTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlLmNsYXNzLmdldE5hbWUoKTsKKworICAgICAgICAvLyBsb29rIGZvciB0aGUgdHdvIG1vY2sgc2VydmljZXMKKyAgICAgICAgZm9yIChTZXJ2aWNlSW5mbyBzZXJ2aWNlSW5mbyA6IG1NYW5hZ2VyU2VydmljZS5nZXRBY2Nlc3NpYmlsaXR5U2VydmljZUxpc3QoKSkgeworICAgICAgICAgICAgaWYgKHBhY2thZ2VOYW1lLmVxdWFscyhzZXJ2aWNlSW5mby5wYWNrYWdlTmFtZSkpIHsKKyAgICAgICAgICAgICAgICBpZiAoZmlyc3RNb2NrU2VydmljZUNsYXNzTmFtZS5lcXVhbHMoc2VydmljZUluZm8ubmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgZmlyc3RNb2NrU2VydmljZUluc3RhbGxlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzZWNvbmRNb2NrU2VydmljZUNsYXNzTmFtZS5lcXVhbHMoc2VydmljZUluZm8ubmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgc2Vjb25kTW9ja1NlcnZpY2VJbnN0YWxsZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIGNoZWNrIGV4cGVjdGVkIHJlc3VsdAorICAgICAgICBhc3NlcnRUcnVlKCJGaXJzdCBtb2NrIHNlcnZpY2UgbXVzdCBiZSBpbnN0YWxsZWQiLCBmaXJzdE1vY2tTZXJ2aWNlSW5zdGFsbGVkKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiU2Vjb25kIG1vY2sgc2VydmljZSBtdXN0IGJlIGluc3RhbGxlZCIsIHNlY29uZE1vY2tTZXJ2aWNlSW5zdGFsbGVkKTsKKyAgICB9CisKKyAgICBATGFyZ2VUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNlbmRBY2Nlc3NpYmlsaXR5RXZlbnRfT25lU2VydmljZV9NYXRjaGluZ1BhY2thZ2VBbmRFdmVudFR5cGUoKQorICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIHNldCB0aGUgYWNjZXNzaWJpbGl0eSBzZXR0aW5nIHZhbHVlCisgICAgICAgIGVuc3VyZUFjY2Vzc2liaWxpdHlFbmFibGVkKG1Db250ZXh0LCB0cnVlKTsKKworICAgICAgICAvLyBlbmFibGUgdGhlIG1vY2sgYWNjZXNzaWJpbGl0eSBzZXJ2aWNlCisgICAgICAgIGVuc3VyZU9ubHlNb2NrU2VydmljZXNFbmFibGVkKG1Db250ZXh0LCB0cnVlLCBmYWxzZSk7CisKKyAgICAgICAgLy8gY29uZmlndXJlIHRoZSBtb2NrIHNlcnZpY2UKKyAgICAgICAgTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlIHNlcnZpY2UgPSBNeUZpcnN0TW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlLnNJbnN0YW5jZTsKKyAgICAgICAgc2VydmljZS5zZXRTZXJ2aWNlSW5mbyhNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2UuY3JlYXRlRGVmYXVsdEluZm8oKSk7CisKKyAgICAgICAgLy8gd2FpdCBmb3IgdGhlIGJpbmRlciBjYWxsIHRvICNzZXRTZXJ2aWNlIHRvIGNvbXBsZXRlCisgICAgICAgIFRocmVhZC5zbGVlcChUSU1FT1VUX0JJTkRFUl9DQUxMKTsKKworICAgICAgICAvLyBjcmVhdGUgYW5kIHBvcHVsYXRlIGFuIGV2ZW50IHRvIGJlIHNlbnQKKyAgICAgICAgQWNjZXNzaWJpbGl0eUV2ZW50IHNlbnRFdmVudCA9IEFjY2Vzc2liaWxpdHlFdmVudC5vYnRhaW4oKTsKKyAgICAgICAgZnVsbHlQb3B1bGF0ZURlZmF1bHRBY2Nlc3NpYmlsaXR5RXZlbnQoc2VudEV2ZW50KTsKKworICAgICAgICAvLyBzZXQgZXhwZWN0YXRpb25zCisgICAgICAgIHNlcnZpY2UuZXhwZWN0RXZlbnQoc2VudEV2ZW50KTsKKyAgICAgICAgc2VydmljZS5yZXBsYXkoKTsKKworICAgICAgICAvLyBzZW5kIHRoZSBldmVudAorICAgICAgICBtTWFuYWdlclNlcnZpY2Uuc2VuZEFjY2Vzc2liaWxpdHlFdmVudChzZW50RXZlbnQpOworCisgICAgICAgIC8vIHZlcmlmeSBpZiBhbGwgZXhwZWN0ZWQgbWV0aG9kcyBoYXZlIGJlZW4gY2FsbGVkCisgICAgICAgIGFzc2VydE1vY2tTZXJ2aWNlVmVyaWZpZWRXaXRoaW5UaW1lb3V0KHNlcnZpY2UpOworICAgIH0KKworICAgIEBMYXJnZVRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2VuZEFjY2Vzc2liaWxpdHlFdmVudF9PbmVTZXJ2aWNlX05vdE1hdGNoaW5nUGFja2FnZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBzZXQgdGhlIGFjY2Vzc2liaWxpdHkgc2V0dGluZyB2YWx1ZQorICAgICAgICBlbnN1cmVBY2Nlc3NpYmlsaXR5RW5hYmxlZChtQ29udGV4dCwgdHJ1ZSk7CisKKyAgICAgICAgLy8gZW5hYmxlIHRoZSBtb2NrIGFjY2Vzc2liaWxpdHkgc2VydmljZQorICAgICAgICBlbnN1cmVPbmx5TW9ja1NlcnZpY2VzRW5hYmxlZChtQ29udGV4dCwgdHJ1ZSwgZmFsc2UpOworCisgICAgICAgIC8vIGNvbmZpZ3VyZSB0aGUgbW9jayBzZXJ2aWNlCisgICAgICAgIE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZSBzZXJ2aWNlID0gTXlGaXJzdE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZS5zSW5zdGFuY2U7CisgICAgICAgIHNlcnZpY2Uuc2V0U2VydmljZUluZm8oTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlLmNyZWF0ZURlZmF1bHRJbmZvKCkpOworCisgICAgICAgIC8vIHdhaXQgZm9yIHRoZSBiaW5kZXIgY2FsbCB0byAjc2V0U2VydmljZSB0byBjb21wbGV0ZQorICAgICAgICBUaHJlYWQuc2xlZXAoVElNRU9VVF9CSU5ERVJfQ0FMTCk7CisKKyAgICAgICAgLy8gY3JlYXRlIGFuZCBwb3B1bGF0ZSBhbiBldmVudCB0byBiZSBzZW50CisgICAgICAgIEFjY2Vzc2liaWxpdHlFdmVudCBzZW50RXZlbnQgPSBBY2Nlc3NpYmlsaXR5RXZlbnQub2J0YWluKCk7CisgICAgICAgIGZ1bGx5UG9wdWxhdGVEZWZhdWx0QWNjZXNzaWJpbGl0eUV2ZW50KHNlbnRFdmVudCk7CisgICAgICAgIHNlbnRFdmVudC5zZXRQYWNrYWdlTmFtZSgibm8uc2VydmljZS5yZWdpc3RlcmVkLmZvci50aGlzLnBhY2thZ2UiKTsKKworICAgICAgICAvLyBzZXQgZXhwZWN0YXRpb25zCisgICAgICAgIHNlcnZpY2UucmVwbGF5KCk7CisKKyAgICAgICAgLy8gc2VuZCB0aGUgZXZlbnQKKyAgICAgICAgbU1hbmFnZXJTZXJ2aWNlLnNlbmRBY2Nlc3NpYmlsaXR5RXZlbnQoc2VudEV2ZW50KTsKKworICAgICAgICAvLyB2ZXJpZnkgaWYgYWxsIGV4cGVjdGVkIG1ldGhvZHMgaGF2ZSBiZWVuIGNhbGxlZAorICAgICAgICBhc3NlcnRNb2NrU2VydmljZVZlcmlmaWVkV2l0aGluVGltZW91dChzZXJ2aWNlKTsKKyAgICB9CisKKyAgICBATGFyZ2VUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNlbmRBY2Nlc3NpYmlsaXR5RXZlbnRfT25lU2VydmljZV9Ob3RNYXRjaGluZ0V2ZW50VHlwZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBzZXQgdGhlIGFjY2Vzc2liaWxpdHkgc2V0dGluZyB2YWx1ZQorICAgICAgICBlbnN1cmVBY2Nlc3NpYmlsaXR5RW5hYmxlZChtQ29udGV4dCwgdHJ1ZSk7CisKKyAgICAgICAgLy8gZW5hYmxlIHRoZSBtb2NrIGFjY2Vzc2liaWxpdHkgc2VydmljZQorICAgICAgICBlbnN1cmVPbmx5TW9ja1NlcnZpY2VzRW5hYmxlZChtQ29udGV4dCwgdHJ1ZSwgZmFsc2UpOworCisgICAgICAgIC8vIGNvbmZpZ3VyZSB0aGUgbW9jayBzZXJ2aWNlCisgICAgICAgIE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZSBzZXJ2aWNlID0gTXlGaXJzdE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZS5zSW5zdGFuY2U7CisgICAgICAgIHNlcnZpY2Uuc2V0U2VydmljZUluZm8oTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlLmNyZWF0ZURlZmF1bHRJbmZvKCkpOworCisgICAgICAgIC8vIHdhaXQgZm9yIHRoZSBiaW5kZXIgY2FsbCB0byAjc2V0U2VydmljZSB0byBjb21wbGV0ZQorICAgICAgICBUaHJlYWQuc2xlZXAoVElNRU9VVF9CSU5ERVJfQ0FMTCk7CisKKyAgICAgICAgLy8gY3JlYXRlIGFuZCBwb3B1bGF0ZSBhbiBldmVudCB0byBiZSBzZW50CisgICAgICAgIEFjY2Vzc2liaWxpdHlFdmVudCBzZW50RXZlbnQgPSBBY2Nlc3NpYmlsaXR5RXZlbnQub2J0YWluKCk7CisgICAgICAgIGZ1bGx5UG9wdWxhdGVEZWZhdWx0QWNjZXNzaWJpbGl0eUV2ZW50KHNlbnRFdmVudCk7CisgICAgICAgIHNlbnRFdmVudC5zZXRFdmVudFR5cGUoQWNjZXNzaWJpbGl0eUV2ZW50LlRZUEVfTk9USUZJQ0FUSU9OX1NUQVRFX0NIQU5HRUQpOworCisgICAgICAgIC8vIHNldCBleHBlY3RhdGlvbnMKKyAgICAgICAgc2VydmljZS5yZXBsYXkoKTsKKworICAgICAgICAvLyBzZW5kIHRoZSBldmVudAorICAgICAgICBtTWFuYWdlclNlcnZpY2Uuc2VuZEFjY2Vzc2liaWxpdHlFdmVudChzZW50RXZlbnQpOworCisgICAgICAgIC8vIHZlcmlmeSBpZiBhbGwgZXhwZWN0ZWQgbWV0aG9kcyBoYXZlIGJlZW4gY2FsbGVkCisgICAgICAgIGFzc2VydE1vY2tTZXJ2aWNlVmVyaWZpZWRXaXRoaW5UaW1lb3V0KHNlcnZpY2UpOworICAgIH0KKworICAgIEBMYXJnZVRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2VuZEFjY2Vzc2liaWxpdHlFdmVudF9PbmVTZXJ2aWNlX05vdGlmaXZhdGlvbkFmdGVyVGltZW91dCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBzZXQgdGhlIGFjY2Vzc2liaWxpdHkgc2V0dGluZyB2YWx1ZQorICAgICAgICBlbnN1cmVBY2Nlc3NpYmlsaXR5RW5hYmxlZChtQ29udGV4dCwgdHJ1ZSk7CisKKyAgICAgICAgLy8gZW5hYmxlIHRoZSBtb2NrIGFjY2Vzc2liaWxpdHkgc2VydmljZQorICAgICAgICBlbnN1cmVPbmx5TW9ja1NlcnZpY2VzRW5hYmxlZChtQ29udGV4dCwgdHJ1ZSwgZmFsc2UpOworCisgICAgICAgIC8vIGNvbmZpZ3VyZSB0aGUgbW9jayBzZXJ2aWNlCisgICAgICAgIE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZSBzZXJ2aWNlID0gTXlGaXJzdE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZS5zSW5zdGFuY2U7CisgICAgICAgIEFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mbyBpbmZvID0gTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlLmNyZWF0ZURlZmF1bHRJbmZvKCk7CisgICAgICAgIGluZm8ubm90aWZpY2F0aW9uVGltZW91dCA9IFRJTUVPVVRfVEVTVF9OT1RJRklDQVRJT05fVElNRU9VVDsKKyAgICAgICAgc2VydmljZS5zZXRTZXJ2aWNlSW5mbyhpbmZvKTsKKworICAgICAgICAvLyB3YWl0IGZvciB0aGUgYmluZGVyIGNhbGwgdG8gI3NldFNlcnZpY2UgdG8gY29tcGxldGUKKyAgICAgICAgVGhyZWFkLnNsZWVwKFRJTUVPVVRfQklOREVSX0NBTEwpOworCisgICAgICAgIC8vIGNyZWF0ZSBhbmQgcG9wdWxhdGUgdGhlIGZpcnN0IGV2ZW50IHRvIGJlIHNlbnQKKyAgICAgICAgQWNjZXNzaWJpbGl0eUV2ZW50IGZpcnN0RXZlbnQgPSBBY2Nlc3NpYmlsaXR5RXZlbnQub2J0YWluKCk7CisgICAgICAgIGZ1bGx5UG9wdWxhdGVEZWZhdWx0QWNjZXNzaWJpbGl0eUV2ZW50KGZpcnN0RXZlbnQpOworCisgICAgICAgIC8vIGNyZWF0ZSBhbmQgcG9wdWxhdGUgdGhlIHNlY29uZCBldmVudCB0byBiZSBzZW50CisgICAgICAgIEFjY2Vzc2liaWxpdHlFdmVudCBzZWNvbmRFdmVudCA9IEFjY2Vzc2liaWxpdHlFdmVudC5vYnRhaW4oKTsKKyAgICAgICAgZnVsbHlQb3B1bGF0ZURlZmF1bHRBY2Nlc3NpYmlsaXR5RXZlbnQoc2Vjb25kRXZlbnQpOworCisgICAgICAgIC8vIHNldCBleHBlY3RhdGlvbnMKKyAgICAgICAgc2VydmljZS5leHBlY3RFdmVudChzZWNvbmRFdmVudCk7CisgICAgICAgIHNlcnZpY2UucmVwbGF5KCk7CisKKyAgICAgICAgLy8gc2VuZCB0aGUgZXZlbnRzCisgICAgICAgIG1NYW5hZ2VyU2VydmljZS5zZW5kQWNjZXNzaWJpbGl0eUV2ZW50KGZpcnN0RXZlbnQpOworICAgICAgICBtTWFuYWdlclNlcnZpY2Uuc2VuZEFjY2Vzc2liaWxpdHlFdmVudChzZWNvbmRFdmVudCk7CisKKyAgICAgICAgLy8gd2FpdCBmb3IgI3NlbmRBY2Nlc3NpYmlsaXR5RXZlbnQgdG8gcmVhY2ggdGhlIGJhY2tpbmcgc2VydmljZQorICAgICAgICBUaHJlYWQuc2xlZXAoVElNRU9VVF9CSU5ERVJfQ0FMTCk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHNlcnZpY2UudmVyaWZ5KCk7CisgICAgICAgICAgICBmYWlsKCJObyBldmVudHMgbXVzdCBiZSBkaXNwYXRjaGVkIGJlZm9yZSB0aGUgZXhwaXJhdGlvbiBvZiB0aGUgbm90aWZpY2F0aW9uIHRpbWVvdXQuIik7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpc2UpIHsKKyAgICAgICAgICAgIC8qIGV4cGVjdGVkICovCisgICAgICAgIH0KKworICAgICAgICAvLyB3YWl0IGZvciB0aGUgY29uZmlndXJlZCBub3RpZmljYXRpb24gdGltZW91dCB0byBleHBpcmUKKyAgICAgICAgVGhyZWFkLnNsZWVwKFRJTUVPVVRfVEVTVF9OT1RJRklDQVRJT05fVElNRU9VVCk7CisKKyAgICAgICAgLy8gdmVyaWZ5IGlmIGFsbCBleHBlY3RlZCBtZXRob2RzIGhhdmUgYmVlbiBjYWxsZWQKKyAgICAgICAgYXNzZXJ0TW9ja1NlcnZpY2VWZXJpZmllZFdpdGhpblRpbWVvdXQoc2VydmljZSk7CisgICAgfQorCisgICAgQExhcmdlVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTZW5kQWNjZXNzaWJpbGl0eUV2ZW50X1R3b1NlcnZpY2VzX01hdGNoaW5nUGFja2FnZUFuZEV2ZW50VHlwZV9EaWZmRmVlZGJhY2soKQorICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIHNldCB0aGUgYWNjZXNzaWJpbGl0eSBzZXR0aW5nIHZhbHVlCisgICAgICAgIGVuc3VyZUFjY2Vzc2liaWxpdHlFbmFibGVkKG1Db250ZXh0LCB0cnVlKTsKKworICAgICAgICAvLyBlbmFibGUgdGhlIG1vY2sgYWNjZXNzaWJpbGl0eSBzZXJ2aWNlcworICAgICAgICBlbnN1cmVPbmx5TW9ja1NlcnZpY2VzRW5hYmxlZChtQ29udGV4dCwgdHJ1ZSwgdHJ1ZSk7CisKKyAgICAgICAgLy8gY29uZmlndXJlIHRoZSBmaXJzdCBtb2NrIHNlcnZpY2UKKyAgICAgICAgTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlIGZpcnN0U2VydmljZSA9IE15Rmlyc3RNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2Uuc0luc3RhbmNlOworICAgICAgICBBY2Nlc3NpYmlsaXR5U2VydmljZUluZm8gZmlyc3RJbmZvID0gTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlLmNyZWF0ZURlZmF1bHRJbmZvKCk7CisgICAgICAgIGZpcnN0SW5mby5mZWVkYmFja1R5cGUgPSBBY2Nlc3NpYmlsaXR5U2VydmljZUluZm8uRkVFREJBQ0tfQVVESUJMRTsKKyAgICAgICAgZmlyc3RTZXJ2aWNlLnNldFNlcnZpY2VJbmZvKGZpcnN0SW5mbyk7CisKKyAgICAgICAgLy8gY29uZmlndXJlIHRoZSBzZWNvbmQgbW9jayBzZXJ2aWNlCisgICAgICAgIE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZSBzZWNvbmRTZXJ2aWNlID0gTXlTZWNvbmRNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2Uuc0luc3RhbmNlOworICAgICAgICBBY2Nlc3NpYmlsaXR5U2VydmljZUluZm8gc2Vjb25kSW5mbyA9IE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZS5jcmVhdGVEZWZhdWx0SW5mbygpOworICAgICAgICBzZWNvbmRJbmZvLmZlZWRiYWNrVHlwZSA9IEFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mby5GRUVEQkFDS19IQVBUSUM7CisgICAgICAgIHNlY29uZFNlcnZpY2Uuc2V0U2VydmljZUluZm8oc2Vjb25kSW5mbyk7CisKKyAgICAgICAgLy8gd2FpdCBmb3IgdGhlIGJpbmRlciBjYWxscyB0byAjc2V0U2VydmljZSB0byBjb21wbGV0ZQorICAgICAgICBUaHJlYWQuc2xlZXAoVElNRU9VVF9CSU5ERVJfQ0FMTCk7CisKKyAgICAgICAgLy8gY3JlYXRlIGFuZCBwb3B1bGF0ZSBhbiBldmVudCB0byBiZSBzZW50CisgICAgICAgIEFjY2Vzc2liaWxpdHlFdmVudCBzZW50RXZlbnQgPSBBY2Nlc3NpYmlsaXR5RXZlbnQub2J0YWluKCk7CisgICAgICAgIGZ1bGx5UG9wdWxhdGVEZWZhdWx0QWNjZXNzaWJpbGl0eUV2ZW50KHNlbnRFdmVudCk7CisKKyAgICAgICAgLy8gc2V0IGV4cGVjdGF0aW9ucyBmb3IgdGhlIGZpcnN0IG1vY2sgc2VydmljZQorICAgICAgICBmaXJzdFNlcnZpY2UuZXhwZWN0RXZlbnQoc2VudEV2ZW50KTsKKyAgICAgICAgZmlyc3RTZXJ2aWNlLnJlcGxheSgpOworCisgICAgICAgIC8vIHNldCBleHBlY3RhdGlvbnMgZm9yIHRoZSBzZWNvbmQgbW9jayBzZXJ2aWNlCisgICAgICAgIHNlY29uZFNlcnZpY2UuZXhwZWN0RXZlbnQoc2VudEV2ZW50KTsKKyAgICAgICAgc2Vjb25kU2VydmljZS5yZXBsYXkoKTsKKworICAgICAgICAvLyBzZW5kIHRoZSBldmVudAorICAgICAgICBtTWFuYWdlclNlcnZpY2Uuc2VuZEFjY2Vzc2liaWxpdHlFdmVudChzZW50RXZlbnQpOworCisgICAgICAgIC8vIHZlcmlmeSBpZiBhbGwgZXhwZWN0ZWQgbWV0aG9kcyBoYXZlIGJlZW4gY2FsbGVkCisgICAgICAgIGFzc2VydE1vY2tTZXJ2aWNlVmVyaWZpZWRXaXRoaW5UaW1lb3V0KGZpcnN0U2VydmljZSk7CisgICAgICAgIGFzc2VydE1vY2tTZXJ2aWNlVmVyaWZpZWRXaXRoaW5UaW1lb3V0KHNlY29uZFNlcnZpY2UpOworICAgIH0KKworICAgIEBMYXJnZVRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2VuZEFjY2Vzc2liaWxpdHlFdmVudF9Ud29TZXJ2aWNlc19NYXRjaGluZ1BhY2thZ2VBbmRFdmVudFR5cGUoKQorICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIHNldCB0aGUgYWNjZXNzaWJpbGl0eSBzZXR0aW5nIHZhbHVlCisgICAgICAgIGVuc3VyZUFjY2Vzc2liaWxpdHlFbmFibGVkKG1Db250ZXh0LCB0cnVlKTsKKworICAgICAgICAvLyBlbmFibGUgdGhlIG1vY2sgYWNjZXNzaWJpbGl0eSBzZXJ2aWNlcworICAgICAgICBlbnN1cmVPbmx5TW9ja1NlcnZpY2VzRW5hYmxlZChtQ29udGV4dCwgdHJ1ZSwgdHJ1ZSk7CisKKyAgICAgICAgLy8gY29uZmlndXJlIHRoZSBmaXJzdCBtb2NrIHNlcnZpY2UKKyAgICAgICAgTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlIGZpcnN0U2VydmljZSA9IE15Rmlyc3RNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2Uuc0luc3RhbmNlOworICAgICAgICBmaXJzdFNlcnZpY2Uuc2V0U2VydmljZUluZm8oTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlLmNyZWF0ZURlZmF1bHRJbmZvKCkpOworCisgICAgICAgIC8vIGNvbmZpZ3VyZSB0aGUgc2Vjb25kIG1vY2sgc2VydmljZQorICAgICAgICBNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2Ugc2Vjb25kU2VydmljZSA9IE15U2Vjb25kTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlLnNJbnN0YW5jZTsKKyAgICAgICAgc2Vjb25kU2VydmljZS5zZXRTZXJ2aWNlSW5mbyhNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2UuY3JlYXRlRGVmYXVsdEluZm8oKSk7CisKKyAgICAgICAgLy8gd2FpdCBmb3IgdGhlIGJpbmRlciBjYWxscyB0byAjc2V0U2VydmljZSB0byBjb21wbGV0ZQorICAgICAgICBUaHJlYWQuc2xlZXAoVElNRU9VVF9CSU5ERVJfQ0FMTCk7CisKKyAgICAgICAgLy8gY3JlYXRlIGFuZCBwb3B1bGF0ZSBhbiBldmVudCB0byBiZSBzZW50CisgICAgICAgIEFjY2Vzc2liaWxpdHlFdmVudCBzZW50RXZlbnQgPSBBY2Nlc3NpYmlsaXR5RXZlbnQub2J0YWluKCk7CisgICAgICAgIGZ1bGx5UG9wdWxhdGVEZWZhdWx0QWNjZXNzaWJpbGl0eUV2ZW50KHNlbnRFdmVudCk7CisKKyAgICAgICAgLy8gc2V0IGV4cGVjdGF0aW9ucyBmb3IgdGhlIGZpcnN0IG1vY2sgc2VydmljZQorICAgICAgICBmaXJzdFNlcnZpY2UuZXhwZWN0RXZlbnQoc2VudEV2ZW50KTsKKyAgICAgICAgZmlyc3RTZXJ2aWNlLnJlcGxheSgpOworCisgICAgICAgIC8vIHNldCBleHBlY3RhdGlvbnMgZm9yIHRoZSBzZWNvbmQgbW9jayBzZXJ2aWNlCisgICAgICAgIHNlY29uZFNlcnZpY2UucmVwbGF5KCk7CisKKyAgICAgICAgLy8gc2VuZCB0aGUgZXZlbnQKKyAgICAgICAgbU1hbmFnZXJTZXJ2aWNlLnNlbmRBY2Nlc3NpYmlsaXR5RXZlbnQoc2VudEV2ZW50KTsKKworICAgICAgICAvLyB2ZXJpZnkgaWYgYWxsIGV4cGVjdGVkIG1ldGhvZHMgaGF2ZSBiZWVuIGNhbGxlZAorICAgICAgICBhc3NlcnRNb2NrU2VydmljZVZlcmlmaWVkV2l0aGluVGltZW91dChmaXJzdFNlcnZpY2UpOworICAgICAgICBhc3NlcnRNb2NrU2VydmljZVZlcmlmaWVkV2l0aGluVGltZW91dChzZWNvbmRTZXJ2aWNlKTsKKyAgICB9CisKKyAgICBATGFyZ2VUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNlbmRBY2Nlc3NpYmlsaXR5RXZlbnRfVHdvU2VydmljZXNfTWF0Y2hpbmdQYWNrYWdlQW5kRXZlbnRUeXBlX09uZURlZmF1bHQoKQorICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIHNldCB0aGUgYWNjZXNzaWJpbGl0eSBzZXR0aW5nIHZhbHVlCisgICAgICAgIGVuc3VyZUFjY2Vzc2liaWxpdHlFbmFibGVkKG1Db250ZXh0LCB0cnVlKTsKKworICAgICAgICAvLyBlbmFibGUgdGhlIG1vY2sgYWNjZXNzaWJpbGl0eSBzZXJ2aWNlcworICAgICAgICBlbnN1cmVPbmx5TW9ja1NlcnZpY2VzRW5hYmxlZChtQ29udGV4dCwgdHJ1ZSwgdHJ1ZSk7CisKKyAgICAgICAgLy8gY29uZmlndXJlIHRoZSBmaXJzdCBtb2NrIHNlcnZpY2UKKyAgICAgICAgTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlIGZpcnN0U2VydmljZSA9IE15Rmlyc3RNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2Uuc0luc3RhbmNlOworICAgICAgICBBY2Nlc3NpYmlsaXR5U2VydmljZUluZm8gZmlyc3RJbmZvID0gTXlGaXJzdE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZS5jcmVhdGVEZWZhdWx0SW5mbygpOworICAgICAgICBmaXJzdEluZm8uZmxhZ3MgPSBBY2Nlc3NpYmlsaXR5U2VydmljZUluZm8uREVGQVVMVDsKKyAgICAgICAgZmlyc3RTZXJ2aWNlLnNldFNlcnZpY2VJbmZvKGZpcnN0SW5mbyk7CisKKyAgICAgICAgLy8gY29uZmlndXJlIHRoZSBzZWNvbmQgbW9jayBzZXJ2aWNlCisgICAgICAgIE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZSBzZWNvbmRTZXJ2aWNlID0gTXlTZWNvbmRNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2Uuc0luc3RhbmNlOworICAgICAgICBzZWNvbmRTZXJ2aWNlLnNldFNlcnZpY2VJbmZvKE15U2Vjb25kTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlLmNyZWF0ZURlZmF1bHRJbmZvKCkpOworCisgICAgICAgIC8vIHdhaXQgZm9yIHRoZSBiaW5kZXIgY2FsbHMgdG8gI3NldFNlcnZpY2UgdG8gY29tcGxldGUKKyAgICAgICAgVGhyZWFkLnNsZWVwKFRJTUVPVVRfQklOREVSX0NBTEwpOworCisgICAgICAgIC8vIGNyZWF0ZSBhbmQgcG9wdWxhdGUgYW4gZXZlbnQgdG8gYmUgc2VudAorICAgICAgICBBY2Nlc3NpYmlsaXR5RXZlbnQgc2VudEV2ZW50ID0gQWNjZXNzaWJpbGl0eUV2ZW50Lm9idGFpbigpOworICAgICAgICBmdWxseVBvcHVsYXRlRGVmYXVsdEFjY2Vzc2liaWxpdHlFdmVudChzZW50RXZlbnQpOworCisgICAgICAgIC8vIHNldCBleHBlY3RhdGlvbnMgZm9yIHRoZSBmaXJzdCBtb2NrIHNlcnZpY2UKKyAgICAgICAgZmlyc3RTZXJ2aWNlLnJlcGxheSgpOworCisgICAgICAgIC8vIHNldCBleHBlY3RhdGlvbnMgZm9yIHRoZSBzZWNvbmQgbW9jayBzZXJ2aWNlCisgICAgICAgIHNlY29uZFNlcnZpY2UuZXhwZWN0RXZlbnQoc2VudEV2ZW50KTsKKyAgICAgICAgc2Vjb25kU2VydmljZS5yZXBsYXkoKTsKKworICAgICAgICAvLyBzZW5kIHRoZSBldmVudAorICAgICAgICBtTWFuYWdlclNlcnZpY2Uuc2VuZEFjY2Vzc2liaWxpdHlFdmVudChzZW50RXZlbnQpOworCisgICAgICAgIC8vIHZlcmlmeSBpZiBhbGwgZXhwZWN0ZWQgbWV0aG9kcyBoYXZlIGJlZW4gY2FsbGVkCisgICAgICAgIGFzc2VydE1vY2tTZXJ2aWNlVmVyaWZpZWRXaXRoaW5UaW1lb3V0KGZpcnN0U2VydmljZSk7CisgICAgICAgIGFzc2VydE1vY2tTZXJ2aWNlVmVyaWZpZWRXaXRoaW5UaW1lb3V0KHNlY29uZFNlcnZpY2UpOworICAgIH0KKworICAgIEBMYXJnZVRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2VuZEFjY2Vzc2liaWxpdHlFdmVudF9Ud29TZXJ2aWNlc19NYXRjaGluZ1BhY2thZ2VBbmRFdmVudFR5cGVfVHdvRGVmYXVsdCgpCisgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gc2V0IHRoZSBhY2Nlc3NpYmlsaXR5IHNldHRpbmcgdmFsdWUKKyAgICAgICAgZW5zdXJlQWNjZXNzaWJpbGl0eUVuYWJsZWQobUNvbnRleHQsIHRydWUpOworCisgICAgICAgIC8vIGVuYWJsZSB0aGUgbW9jayBhY2Nlc3NpYmlsaXR5IHNlcnZpY2VzCisgICAgICAgIGVuc3VyZU9ubHlNb2NrU2VydmljZXNFbmFibGVkKG1Db250ZXh0LCB0cnVlLCB0cnVlKTsKKworICAgICAgICAvLyBjb25maWd1cmUgdGhlIGZpcnN0IG1vY2sgc2VydmljZQorICAgICAgICBNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2UgZmlyc3RTZXJ2aWNlID0gTXlGaXJzdE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZS5zSW5zdGFuY2U7CisgICAgICAgIEFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mbyBmaXJzdEluZm8gPSBNeUZpcnN0TW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlLmNyZWF0ZURlZmF1bHRJbmZvKCk7CisgICAgICAgIGZpcnN0SW5mby5mbGFncyA9IEFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mby5ERUZBVUxUOworICAgICAgICBmaXJzdFNlcnZpY2Uuc2V0U2VydmljZUluZm8oZmlyc3RJbmZvKTsKKworICAgICAgICAvLyBjb25maWd1cmUgdGhlIHNlY29uZCBtb2NrIHNlcnZpY2UKKyAgICAgICAgTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlIHNlY29uZFNlcnZpY2UgPSBNeVNlY29uZE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZS5zSW5zdGFuY2U7CisgICAgICAgIEFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mbyBzZWNvbmRJbmZvID0gTXlGaXJzdE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZS5jcmVhdGVEZWZhdWx0SW5mbygpOworICAgICAgICBzZWNvbmRJbmZvLmZsYWdzID0gQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvLkRFRkFVTFQ7CisgICAgICAgIHNlY29uZFNlcnZpY2Uuc2V0U2VydmljZUluZm8oZmlyc3RJbmZvKTsKKworICAgICAgICAvLyB3YWl0IGZvciB0aGUgYmluZGVyIGNhbGxzIHRvICNzZXRTZXJ2aWNlIHRvIGNvbXBsZXRlCisgICAgICAgIFRocmVhZC5zbGVlcChUSU1FT1VUX0JJTkRFUl9DQUxMKTsKKworICAgICAgICAvLyBjcmVhdGUgYW5kIHBvcHVsYXRlIGFuIGV2ZW50IHRvIGJlIHNlbnQKKyAgICAgICAgQWNjZXNzaWJpbGl0eUV2ZW50IHNlbnRFdmVudCA9IEFjY2Vzc2liaWxpdHlFdmVudC5vYnRhaW4oKTsKKyAgICAgICAgZnVsbHlQb3B1bGF0ZURlZmF1bHRBY2Nlc3NpYmlsaXR5RXZlbnQoc2VudEV2ZW50KTsKKworICAgICAgICAvLyBzZXQgZXhwZWN0YXRpb25zIGZvciB0aGUgZmlyc3QgbW9jayBzZXJ2aWNlCisgICAgICAgIGZpcnN0U2VydmljZS5leHBlY3RFdmVudChzZW50RXZlbnQpOworICAgICAgICBmaXJzdFNlcnZpY2UucmVwbGF5KCk7CisKKyAgICAgICAgLy8gc2V0IGV4cGVjdGF0aW9ucyBmb3IgdGhlIHNlY29uZCBtb2NrIHNlcnZpY2UKKyAgICAgICAgc2Vjb25kU2VydmljZS5yZXBsYXkoKTsKKworICAgICAgICAvLyBzZW5kIHRoZSBldmVudAorICAgICAgICBtTWFuYWdlclNlcnZpY2Uuc2VuZEFjY2Vzc2liaWxpdHlFdmVudChzZW50RXZlbnQpOworCisgICAgICAgIC8vIHZlcmlmeSBpZiBhbGwgZXhwZWN0ZWQgbWV0aG9kcyBoYXZlIGJlZW4gY2FsbGVkCisgICAgICAgIGFzc2VydE1vY2tTZXJ2aWNlVmVyaWZpZWRXaXRoaW5UaW1lb3V0KGZpcnN0U2VydmljZSk7CisgICAgICAgIGFzc2VydE1vY2tTZXJ2aWNlVmVyaWZpZWRXaXRoaW5UaW1lb3V0KHNlY29uZFNlcnZpY2UpOworICAgIH0KKworICAgIEBMYXJnZVRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW50ZXJydXB0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIHNldCB0aGUgYWNjZXNzaWJpbGl0eSBzZXR0aW5nIHZhbHVlCisgICAgICAgIGVuc3VyZUFjY2Vzc2liaWxpdHlFbmFibGVkKG1Db250ZXh0LCB0cnVlKTsKKworICAgICAgICAvLyBlbmFibGUgdGhlIG1vY2sgYWNjZXNzaWJpbGl0eSBzZXJ2aWNlcworICAgICAgICBlbnN1cmVPbmx5TW9ja1NlcnZpY2VzRW5hYmxlZChtQ29udGV4dCwgdHJ1ZSwgdHJ1ZSk7CisKKyAgICAgICAgLy8gY29uZmlndXJlIHRoZSBmaXJzdCBtb2NrIHNlcnZpY2UKKyAgICAgICAgTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlIGZpcnN0U2VydmljZSA9IE15Rmlyc3RNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2Uuc0luc3RhbmNlOworICAgICAgICBmaXJzdFNlcnZpY2Uuc2V0U2VydmljZUluZm8oTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlLmNyZWF0ZURlZmF1bHRJbmZvKCkpOworCisgICAgICAgIC8vIGNvbmZpZ3VyZSB0aGUgc2Vjb25kIG1vY2sgc2VydmljZQorICAgICAgICBNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2Ugc2Vjb25kU2VydmljZSA9IE15U2Vjb25kTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlLnNJbnN0YW5jZTsKKyAgICAgICAgc2Vjb25kU2VydmljZS5zZXRTZXJ2aWNlSW5mbyhNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2UuY3JlYXRlRGVmYXVsdEluZm8oKSk7CisKKyAgICAgICAgLy8gd2FpdCBmb3IgdGhlIGJpbmRlciBjYWxscyB0byAjc2V0U2VydmljZSB0byBjb21wbGV0ZQorICAgICAgICBUaHJlYWQuc2xlZXAoVElNRU9VVF9CSU5ERVJfQ0FMTCk7CisKKyAgICAgICAgLy8gc2V0IGV4cGVjdGF0aW9ucyBmb3IgdGhlIGZpcnN0IG1vY2sgc2VydmljZQorICAgICAgICBmaXJzdFNlcnZpY2UuZXhwZWN0SW50ZXJydXB0KCk7CisgICAgICAgIGZpcnN0U2VydmljZS5yZXBsYXkoKTsKKworICAgICAgICAvLyBzZXQgZXhwZWN0YXRpb25zIGZvciB0aGUgc2Vjb25kIG1vY2sgc2VydmljZQorICAgICAgICBzZWNvbmRTZXJ2aWNlLmV4cGVjdEludGVycnVwdCgpOworICAgICAgICBzZWNvbmRTZXJ2aWNlLnJlcGxheSgpOworCisgICAgICAgIC8vIGNhbGwgdGhlIG1ldGhvZCB1bmRlciB0ZXN0CisgICAgICAgIG1NYW5hZ2VyU2VydmljZS5pbnRlcnJ1cHQoKTsKKworICAgICAgICAvLyB2ZXJpZnkgaWYgYWxsIGV4cGVjdGVkIG1ldGhvZHMgaGF2ZSBiZWVuIGNhbGxlZAorICAgICAgICBhc3NlcnRNb2NrU2VydmljZVZlcmlmaWVkV2l0aGluVGltZW91dChmaXJzdFNlcnZpY2UpOworICAgICAgICBhc3NlcnRNb2NrU2VydmljZVZlcmlmaWVkV2l0aGluVGltZW91dChzZWNvbmRTZXJ2aWNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGdWxseSBwb3B1bGF0ZXMgdGhlIHtAbGluayBBY2Nlc3NpYmlsaXR5RXZlbnR9IHRvIG1hcnNoYWwuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VudEV2ZW50IFRoZSBldmVudCB0byBwb3B1bGF0ZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgZnVsbHlQb3B1bGF0ZURlZmF1bHRBY2Nlc3NpYmlsaXR5RXZlbnQoQWNjZXNzaWJpbGl0eUV2ZW50IHNlbnRFdmVudCkgeworICAgICAgICBzZW50RXZlbnQuc2V0QWRkZWRDb3VudCgxKTsKKyAgICAgICAgc2VudEV2ZW50LnNldEJlZm9yZVRleHQoIkJlZm9yZVRleHQiKTsKKyAgICAgICAgc2VudEV2ZW50LnNldENoZWNrZWQodHJ1ZSk7CisgICAgICAgIHNlbnRFdmVudC5zZXRDbGFzc05hbWUoImZvby5iYXIuYmF6LkNsYXNzIik7CisgICAgICAgIHNlbnRFdmVudC5zZXRDb250ZW50RGVzY3JpcHRpb24oIkNvbnRlbnREZXNjcmlwdGlvbiIpOworICAgICAgICBzZW50RXZlbnQuc2V0Q3VycmVudEl0ZW1JbmRleCgxKTsKKyAgICAgICAgc2VudEV2ZW50LnNldEVuYWJsZWQodHJ1ZSk7CisgICAgICAgIHNlbnRFdmVudC5zZXRFdmVudFR5cGUoQWNjZXNzaWJpbGl0eUV2ZW50LlRZUEVfVklFV19DTElDS0VEKTsKKyAgICAgICAgc2VudEV2ZW50LnNldEV2ZW50VGltZSgxMDAwKTsKKyAgICAgICAgc2VudEV2ZW50LnNldEZyb21JbmRleCgxKTsKKyAgICAgICAgc2VudEV2ZW50LnNldEZ1bGxTY3JlZW4odHJ1ZSk7CisgICAgICAgIHNlbnRFdmVudC5zZXRJdGVtQ291bnQoMSk7CisgICAgICAgIHNlbnRFdmVudC5zZXRQYWNrYWdlTmFtZSgiZm9vLmJhci5iYXoiKTsKKyAgICAgICAgc2VudEV2ZW50LnNldFBhcmNlbGFibGVEYXRhKE1lc3NhZ2Uub2J0YWluKG51bGwsIDEsIG51bGwpKTsKKyAgICAgICAgc2VudEV2ZW50LnNldFBhc3N3b3JkKHRydWUpOworICAgICAgICBzZW50RXZlbnQuc2V0UmVtb3ZlZENvdW50KDEpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgY2xhc3MgaXMgYSBtb2NrIHtAbGluayBJQWNjZXNzaWJpbGl0eU1hbmFnZXJDbGllbnR9LgorICAgICAqLworICAgIHB1YmxpYyBjbGFzcyBNeU1vY2tBY2Nlc3NpYmlsaXR5TWFuYWdlckNsaWVudCBleHRlbmRzIElBY2Nlc3NpYmlsaXR5TWFuYWdlckNsaWVudC5TdHViIHsKKyAgICAgICAgYm9vbGVhbiBtSXNFbmFibGVkOworCisgICAgICAgIHB1YmxpYyB2b2lkIHNldEVuYWJsZWQoYm9vbGVhbiBlbmFibGVkKSB7CisgICAgICAgICAgICBtSXNFbmFibGVkID0gZW5hYmxlZDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEVuc3VyZXMgYWNjZXNzaWJpbGl0eSBpcyBpbiBhIGdpdmVuIHN0YXRlIGJ5IHdyaXRpbmcgdGhlIHN0YXRlIHRvIHRoZQorICAgICAqIHNldHRpbmdzIGFuZCB3YWl0aW5nIHVudGlsIHRoZSBhY2Nlc3NpYmlsaXR5IG1hbmFnZXIgc2VydmljZSBwaWNrIGl0IHVwLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgQSBjb250ZXh0IGhhbmRsZSB0byBhY2Nlc3MgdGhlIHNldHRpbmdzLgorICAgICAqIEBwYXJhbSBlbmFibGVkIFRoZSBhY2Nlc3NpYmlsaXR5IHN0YXRlIHRvIHdyaXRlIHRvIHRoZSBzZXR0aW5ncy4KKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbiBJZiBhbnkgZXJyb3Igb2NjdXJzLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBlbnN1cmVBY2Nlc3NpYmlsaXR5RW5hYmxlZChDb250ZXh0IGNvbnRleHQsIGJvb2xlYW4gZW5hYmxlZCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGJvb2xlYW4gaXNFbmFibGVkID0gKFNldHRpbmdzLlNlY3VyZS5nZXRJbnQoY29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKSwKKyAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuQUNDRVNTSUJJTElUWV9FTkFCTEVELCAwKSA9PSAxID8gdHJ1ZSA6IGZhbHNlKTsKKworICAgICAgICBpZiAoaXNFbmFibGVkID09IGVuYWJsZWQpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIFNldHRpbmdzLlNlY3VyZS5wdXRJbnQoY29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKSwgU2V0dGluZ3MuU2VjdXJlLkFDQ0VTU0lCSUxJVFlfRU5BQkxFRCwKKyAgICAgICAgICAgICAgICBlbmFibGVkID8gMSA6IDApOworCisgICAgICAgIC8vIHdhaXQgdGhlIGFjY2Vzc2liaWxpdHkgbWFuYWdlciBzZXJ2aWNlIHRvIHBpY2sgdGhlIGNoYW5nZSB1cAorICAgICAgICBUaHJlYWQuc2xlZXAoVElNRU9VVF9CSU5ERVJfQ0FMTCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRW5zdXJlcyB0aGUgb25seSB7QGxpbmsgTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlfXMgd2l0aCBnaXZlbiBjb21wb25lbnQKKyAgICAgKiBuYW1lcyBhcmUgZW5hYmxlZCBieSB3cml0aW5nIHRvIHRoZSBzeXN0ZW0gc2V0dGluZ3MgYW5kIHdhaXRpbmcgdW50aWwgdGhlCisgICAgICogYWNjZXNzaWJpbGl0eSBtYW5hZ2VyIHNlcnZpY2UgcGlja3MgdGhhdCB1cCBvciB0aGUKKyAgICAgKiB7QGxpbmsgI1RJTUVPVVRfU1RBUlRfTU9DS19BQ0NFU1NJQklMSVRZX1NFUlZJQ0VTfSBpcyBleGNlZWRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IEEgY29udGV4dCBoYW5kbGUgdG8gYWNjZXNzIHRoZSBzZXR0aW5ncy4KKyAgICAgKiBAcGFyYW0gZmlyc3RNb2NrU2VydmljZUVuYWJsZWQgSWYgdGhlIGZpcnN0IG1vY2sgYWNjZXNzaWJpbGl0eSBzZXJ2aWNlIGlzIGVuYWJsZWQuCisgICAgICogQHBhcmFtIHNlY29uZE1vY2tTZXJ2aWNlRW5hYmxlZCBJZiB0aGUgc2Vjb25kIG1vY2sgYWNjZXNzaWJpbGl0eSBzZXJ2aWNlIGlzIGVuYWJsZWQuCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gSWYgc29tZSBvZiB0aGUgcmVxdWVzdGVkIGZvciBlbmFibGluZyBtb2NrIHNlcnZpY2VzCisgICAgICogICAgICAgICBpcyBub3QgcHJvcGVybHkgc3RhcnRlZC4KKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbiBFeGNlcHRpb24gSWYgYW55IGVycm9yIG9jY3Vycy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgZW5zdXJlT25seU1vY2tTZXJ2aWNlc0VuYWJsZWQoQ29udGV4dCBjb250ZXh0LCBib29sZWFuIGZpcnN0TW9ja1NlcnZpY2VFbmFibGVkLAorICAgICAgICAgICAgYm9vbGVhbiBzZWNvbmRNb2NrU2VydmljZUVuYWJsZWQpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgZW5hYmxlZFNlcnZpY2VzID0gU2V0dGluZ3MuU2VjdXJlLmdldFN0cmluZyhjb250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLAorICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5FTkFCTEVEX0FDQ0VTU0lCSUxJVFlfU0VSVklDRVMpOworCisgICAgICAgIFN0cmluZ0J1aWxkZXIgc2VydmljZXNUb0VuYWJsZSA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIGlmIChmaXJzdE1vY2tTZXJ2aWNlRW5hYmxlZCkgeworICAgICAgICAgICAgc2VydmljZXNUb0VuYWJsZS5hcHBlbmQoTXlGaXJzdE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZS5zQ29tcG9uZW50TmFtZSkuYXBwZW5kKCI6Iik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNlY29uZE1vY2tTZXJ2aWNlRW5hYmxlZCkgeworICAgICAgICAgICAgc2VydmljZXNUb0VuYWJsZS5hcHBlbmQoTXlTZWNvbmRNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2Uuc0NvbXBvbmVudE5hbWUpLmFwcGVuZCgiOiIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHNlcnZpY2VzVG9FbmFibGUuZXF1YWxzKGVuYWJsZWRTZXJ2aWNlcykpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIFNldHRpbmdzLlNlY3VyZS5wdXRTdHJpbmcoY29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKSwKKyAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuRU5BQkxFRF9BQ0NFU1NJQklMSVRZX1NFUlZJQ0VTLCBzZXJ2aWNlc1RvRW5hYmxlLnRvU3RyaW5nKCkpOworCisgICAgICAgIC8vIHdlIGhhdmUgZW5hYmxlZCB0aGUgc2VydmljZXMgb2YgaW50ZXJlc3QgYW5kIG5lZWQgdG8gd2FpdCB1bnRpbCB0aGV5CisgICAgICAgIC8vIGFyZSBpbnN0YW50aWF0ZWQgYW5kIHN0YXJ0ZWQgKGlmIG5lZWRlZCkgYW5kIHRoZSBzeXN0ZW0gYmluZHMgdG8gdGhlbQorICAgICAgICBib29sZWFuIGZpcnN0TW9ja1NlcnZpY2VPSyA9IGZhbHNlOworICAgICAgICBib29sZWFuIHNlY29uZE1vY2tTZXJ2aWNlT0sgPSBmYWxzZTsKKyAgICAgICAgbG9uZyBzdGFydCA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpOworICAgICAgICBsb25nIHBvbGxpbmdJbnRlcnZhbCA9IFRJTUVPVVRfU1RBUlRfTU9DS19BQ0NFU1NJQklMSVRZX1NFUlZJQ0VTIC8gNjsKKworICAgICAgICB3aGlsZSAoU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCkgLSBzdGFydCA8IFRJTUVPVVRfU1RBUlRfTU9DS19BQ0NFU1NJQklMSVRZX1NFUlZJQ0VTKSAgeworICAgICAgICAgICAgZmlyc3RNb2NrU2VydmljZU9LID0gIWZpcnN0TW9ja1NlcnZpY2VFbmFibGVkCisgICAgICAgICAgICAgICAgICAgIHx8IChNeUZpcnN0TW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlLnNJbnN0YW5jZSAhPSBudWxsCisgICAgICAgICAgICAgICAgICAgICYmIE15Rmlyc3RNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2Uuc0luc3RhbmNlLmlzU3lzdGVtQm91bmRBc0NsaWVudCgpKTsKKworICAgICAgICAgICAgc2Vjb25kTW9ja1NlcnZpY2VPSyA9ICFzZWNvbmRNb2NrU2VydmljZUVuYWJsZWQKKyAgICAgICAgICAgICAgICAgICAgfHwgKE15U2Vjb25kTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlLnNJbnN0YW5jZSAhPSBudWxsCisgICAgICAgICAgICAgICAgICAgICYmIE15U2Vjb25kTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlLnNJbnN0YW5jZS5pc1N5c3RlbUJvdW5kQXNDbGllbnQoKSk7CisKKyAgICAgICAgICAgIGlmIChmaXJzdE1vY2tTZXJ2aWNlT0sgJiYgc2Vjb25kTW9ja1NlcnZpY2VPSykgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKHBvbGxpbmdJbnRlcnZhbCk7CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmdCdWlsZGVyIG1lc3NhZ2UgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICBtZXNzYWdlLmFwcGVuZCgiTW9jayBhY2Nlc3NpYmlsaXR5IHNlcnZpY2VzIG5vdCBzdGFydGVkIG9yIHN5c3RlbSBub3QgYm91bmQgYXMgYSBjbGllbnQ6ICIpOworICAgICAgICBpZiAoIWZpcnN0TW9ja1NlcnZpY2VPSykgeworICAgICAgICAgICAgbWVzc2FnZS5hcHBlbmQoTXlGaXJzdE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZS5zQ29tcG9uZW50TmFtZSk7CisgICAgICAgICAgICBtZXNzYWdlLmFwcGVuZCgiICIpOworICAgICAgICB9CisgICAgICAgIGlmICghc2Vjb25kTW9ja1NlcnZpY2VPSykgeworICAgICAgICAgICAgbWVzc2FnZS5hcHBlbmQoTXlTZWNvbmRNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2Uuc0NvbXBvbmVudE5hbWUpOworICAgICAgICB9CisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24obWVzc2FnZS50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBc3NlcnRzIHRoZSB0aGUgbW9jayBhY2Nlc3NpYmlsaXR5IHNlcnZpY2UgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IHZlcmlmaWVkCisgICAgICogKHdoaWNoIGlzIGl0IGhhcyByZWNlaXZlZCB0aGUgZXhwZWN0ZWQgbWV0aG9kIGNhbGxzIHdpdGggZXhwZWN0ZWQKKyAgICAgKiBhcmd1bWVudHMpIHdpdGhpbiB0aGUge0BsaW5rICNUSU1FT1VUX0JJTkRFUl9DQUxMfS4gVGhlIHZlcmlmaWVkIHN0YXRlIGlzCisgICAgICogY2hlY2tlZCBieSBwb2xsaW5nIHVwb24gc21hbGwgaW50ZXJ2YWxzLgorICAgICAqCisgICAgICogQHBhcmFtIHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gdmVyaWZ5LgorICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uIElmIHRoZSB2ZXJpZmljYXRpb24gaGFzIGZhaWxlZCB3aXRoIGV4Y2VwdGlvbiBhZnRlciB0aGUKKyAgICAgKiAgICAgICAgICAgICB7QGxpbmsgI1RJTUVPVVRfQklOREVSX0NBTEx9LgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBhc3NlcnRNb2NrU2VydmljZVZlcmlmaWVkV2l0aGluVGltZW91dChNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2Ugc2VydmljZSkKKyAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBFeGNlcHRpb24gbGFzdFZlcmlmeUV4Y2VwdGlvbiA9IG51bGw7CisgICAgICAgIGxvbmcgYmVnaW5UaW1lID0gU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCk7CisgICAgICAgIGxvbmcgcG9sbFRtZW91dCA9IFRJTUVPVVRfQklOREVSX0NBTEwgLyA1OworCisgICAgICAgIC8vIHBvbGwgdW50aWwgdGhlIHRpbWVvdXQgaGFzIGVsYXBzZWQKKyAgICAgICAgd2hpbGUgKFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpIC0gYmVnaW5UaW1lIDwgVElNRU9VVF9CSU5ERVJfQ0FMTCkgeworICAgICAgICAgICAgLy8gc2xlZXAgZmlyc3Qgc2luY2UgaW1tZWRpYXRlIGNhbGwgd2lsbCBhbHdheXMgZmFpbAorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAocG9sbFRtZW91dCk7CisgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgeworICAgICAgICAgICAgICAgIC8qIGlnbm9yZSAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gcG9sbCBmb3IgdmVyaWZpY2F0aW9uIGFuZCBpZiB0aGlzIGZhaWxzIHNhdmUgdGhlIGV4Y2VwdGlvbiBhbmQKKyAgICAgICAgICAgIC8vIGtlZXAgcG9sbGluZworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBzZXJ2aWNlLnZlcmlmeSgpOworICAgICAgICAgICAgICAgIC8vIHJlc2V0IHNvIGl0IGRvZXMgbm90IGFjY2VwdCBtb3JlIGV2ZW50cworICAgICAgICAgICAgICAgIHNlcnZpY2UucmVzZXQoKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGxhc3RWZXJpZnlFeGNlcHRpb24gPSBlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gcmVzZXQsIHdlIGhhdmUgYWxyZWFkeSBmYWlsZWQKKyAgICAgICAgc2VydmljZS5yZXNldCgpOworCisgICAgICAgIC8vIGFsd2F5cyBub3QgbnVsbAorICAgICAgICB0aHJvdyBsYXN0VmVyaWZ5RXhjZXB0aW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgY2xhc3MgaXMgdGhlIGZpcnN0IG1vY2sge0BsaW5rIEFjY2Vzc2liaWxpdHlTZXJ2aWNlfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15Rmlyc3RNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2UgZXh0ZW5kcyBNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2UgeworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgc2VydmljZSB7QGxpbmsgQ29tcG9uZW50TmFtZX0gZmxhdHRlbmVkIGFzIGEgc3RyaW5nLgorICAgICAgICAgKi8KKyAgICAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBzQ29tcG9uZW50TmFtZSA9IG5ldyBDb21wb25lbnROYW1lKAorICAgICAgICAgICAgICAgIHNQYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICBNeUZpcnN0TW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlLmNsYXNzLmdldE5hbWUoKQorICAgICAgICAgICAgICAgICkuZmxhdHRlblRvU2hvcnRTdHJpbmcoKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogSGFuZGxlIHRvIHRoZSBzZXJ2aWNlIGluc3RhbmNlLgorICAgICAgICAgKi8KKyAgICAgICAgc3RhdGljIE15Rmlyc3RNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2Ugc0luc3RhbmNlOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIE15Rmlyc3RNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2UoKSB7CisgICAgICAgICAgICBzSW5zdGFuY2UgPSB0aGlzOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBjbGFzcyBpcyB0aGUgZmlyc3QgbW9jayB7QGxpbmsgQWNjZXNzaWJpbGl0eVNlcnZpY2V9LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlTZWNvbmRNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2UgZXh0ZW5kcyBNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2UgeworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgc2VydmljZSB7QGxpbmsgQ29tcG9uZW50TmFtZX0gZmxhdHRlbmVkIGFzIGEgc3RyaW5nLgorICAgICAgICAgKi8KKyAgICAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBzQ29tcG9uZW50TmFtZSA9IG5ldyBDb21wb25lbnROYW1lKAorICAgICAgICAgICAgICAgIHNQYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICBNeVNlY29uZE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZS5jbGFzcy5nZXROYW1lKCkKKyAgICAgICAgICAgICAgICApLmZsYXR0ZW5Ub1Nob3J0U3RyaW5nKCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEhhbmRsZSB0byB0aGUgc2VydmljZSBpbnN0YW5jZS4KKyAgICAgICAgICovCisgICAgICAgIHN0YXRpYyBNeVNlY29uZE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZSBzSW5zdGFuY2U7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgTXlTZWNvbmRNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2UoKSB7CisgICAgICAgICAgICBzSW5zdGFuY2UgPSB0aGlzOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdGVzdHMvc2VydmljZXN0ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL0FjY2Vzc2liaWxpdHlNYW5hZ2VyVGVzdC5qYXZhIGIvc2VydmljZXMvdGVzdHMvc2VydmljZXN0ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL0FjY2Vzc2liaWxpdHlNYW5hZ2VyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4ZmVkMjIKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy90ZXN0cy9zZXJ2aWNlc3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvQWNjZXNzaWJpbGl0eU1hbmFnZXJUZXN0LmphdmEKQEAgLTAsMCArMSwyNTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnNlcnZlcjsKKworaW1wb3J0IHN0YXRpYyBvcmcuZWFzeW1vY2suRWFzeU1vY2suY3JlYXRlU3RyaWN0TW9jazsKK2ltcG9ydCBzdGF0aWMgb3JnLmVhc3ltb2NrLkVhc3lNb2NrLmV4cGVjdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmVhc3ltb2NrLkVhc3lNb2NrLnJlcGxheTsKK2ltcG9ydCBzdGF0aWMgb3JnLmVhc3ltb2NrLkVhc3lNb2NrLnJlcG9ydE1hdGNoZXI7CitpbXBvcnQgc3RhdGljIG9yZy5lYXN5bW9jay5FYXN5TW9jay5yZXNldDsKK2ltcG9ydCBzdGF0aWMgb3JnLmVhc3ltb2NrLkVhc3lNb2NrLnZlcmlmeTsKKworaW1wb3J0IG9yZy5lYXN5bW9jay5JQXJndW1lbnRNYXRjaGVyOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlNlcnZpY2VJbmZvOworaW1wb3J0IGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2U7CitpbXBvcnQgYW5kcm9pZC50ZXN0LnN1aXRlYnVpbGRlci5hbm5vdGF0aW9uLkxhcmdlVGVzdDsKK2ltcG9ydCBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLmFubm90YXRpb24uTWVkaXVtVGVzdDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5RXZlbnQ7CitpbXBvcnQgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuSUFjY2Vzc2liaWxpdHlNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LklBY2Nlc3NpYmlsaXR5TWFuYWdlckNsaWVudDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogVGVzdHMgZm9yIHRoZSBBY2Nlc3NpYmlsaXR5TWFuYWdlciB3aGljaCBtb2NraW5nIHRoZSBiYWNraW5nIHNlcnZpY2UuCisgKi8KK3B1YmxpYyBjbGFzcyBBY2Nlc3NpYmlsaXR5TWFuYWdlclRlc3QgZXh0ZW5kcyBBbmRyb2lkVGVzdENhc2UgeworCisgICAgLyoqCisgICAgICogVGltZW91dCByZXF1aXJlZCBmb3IgcGVuZGluZyBCaW5kZXIgY2FsbHMgb3IgZXZlbnQgcHJvY2Vzc2luZyB0bworICAgICAqIGNvbXBsZXRlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBUSU1FT1VUX0JJTkRFUl9DQUxMID0gNTA7CisKKyAgICAvKioKKyAgICAgKiBUaGUgcmV1c2FibGUgbW9jayB7QGxpbmsgSUFjY2Vzc2liaWxpdHlNYW5hZ2VyfS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIElBY2Nlc3NpYmlsaXR5TWFuYWdlciBtTW9ja1NlcnZpY2VJbnRlcmZhY2UgPQorICAgICAgICBjcmVhdGVTdHJpY3RNb2NrKElBY2Nlc3NpYmlsaXR5TWFuYWdlci5jbGFzcyk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICByZXNldChtTW9ja1NlcnZpY2VJbnRlcmZhY2UpOworICAgIH0KKworICAgIEBNZWRpdW1UZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldEFjY2Vzc2liaWxpdHlTZXJ2aWNlTGlzdCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBjcmVhdGUgYSBsaXN0IG9mIGluc3RhbGxlZCBhY2Nlc3NpYmlsaXR5IHNlcnZpY2VzIHRoZSBtb2NrIHNlcnZpY2UgcmV0dXJucworICAgICAgICBMaXN0PFNlcnZpY2VJbmZvPiBleHBlY3RlZFNlcnZpY2VzID0gbmV3IEFycmF5TGlzdDxTZXJ2aWNlSW5mbz4oKTsKKyAgICAgICAgU2VydmljZUluZm8gc2VydmljZUluZm8gPSBuZXcgU2VydmljZUluZm8oKTsKKyAgICAgICAgc2VydmljZUluZm8ubmFtZSA9ICJUZXN0U2VydmljZUluZm9OYW1lIjsKKyAgICAgICAgZXhwZWN0ZWRTZXJ2aWNlcy5hZGQoc2VydmljZUluZm8pOworCisgICAgICAgIC8vIGNvbmZpZ3VyZSB0aGUgbW9jayBzZXJ2aWNlIGJlaGF2aW9yCisgICAgICAgIElBY2Nlc3NpYmlsaXR5TWFuYWdlciBtb2NrU2VydmljZUludGVyZmFjZSA9IG1Nb2NrU2VydmljZUludGVyZmFjZTsKKyAgICAgICAgZXhwZWN0KG1vY2tTZXJ2aWNlSW50ZXJmYWNlLmFkZENsaWVudChhbnlJQWNjZXNzaWJpbGl0eU1hbmFnZXJDbGllbnQoKSkpLmFuZFJldHVybih0cnVlKTsKKyAgICAgICAgZXhwZWN0KG1vY2tTZXJ2aWNlSW50ZXJmYWNlLmdldEFjY2Vzc2liaWxpdHlTZXJ2aWNlTGlzdCgpKS5hbmRSZXR1cm4oZXhwZWN0ZWRTZXJ2aWNlcyk7CisgICAgICAgIHJlcGxheShtb2NrU2VydmljZUludGVyZmFjZSk7CisKKyAgICAgICAgLy8gaW52b2tlIHRoZSBtZXRob2QgdW5kZXIgdGVzdAorICAgICAgICBBY2Nlc3NpYmlsaXR5TWFuYWdlciBtYW5hZ2VyID0gbmV3IEFjY2Vzc2liaWxpdHlNYW5hZ2VyKG1Db250ZXh0LCBtb2NrU2VydmljZUludGVyZmFjZSk7CisgICAgICAgIExpc3Q8U2VydmljZUluZm8+IHJlY2VpdmVkU2VydmljZXMgPSBtYW5hZ2VyLmdldEFjY2Vzc2liaWxpdHlTZXJ2aWNlTGlzdCgpOworCisgICAgICAgIC8vIGNoZWNrIGV4cGVjdGVkIHJlc3VsdCAobGlzdCBlcXVhbHMoKSBjb21wYXJlcyBpdCBjb250ZW50cyBhcyB3ZWxsKQorICAgICAgICBhc3NlcnRFcXVhbHMoIkFsbCBleHBlY3RlZCBzZXJ2aWNlcyBtdXN0IGJlIHJldHVybmVkIiwgcmVjZWl2ZWRTZXJ2aWNlcywgZXhwZWN0ZWRTZXJ2aWNlcyk7CisKKyAgICAgICAgLy8gdmVyaWZ5IHRoZSBtb2NrIHNlcnZpY2Ugd2FzIHByb3Blcmx5IGNhbGxlZAorICAgICAgICB2ZXJpZnkobW9ja1NlcnZpY2VJbnRlcmZhY2UpOworICAgIH0KKworICAgIEBNZWRpdW1UZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEludGVycnVwdCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBjb25maWd1cmUgdGhlIG1vY2sgc2VydmljZSBiZWhhdmlvcgorICAgICAgICBJQWNjZXNzaWJpbGl0eU1hbmFnZXIgbW9ja1NlcnZpY2VJbnRlcmZhY2UgPSBtTW9ja1NlcnZpY2VJbnRlcmZhY2U7CisgICAgICAgIGV4cGVjdChtb2NrU2VydmljZUludGVyZmFjZS5hZGRDbGllbnQoYW55SUFjY2Vzc2liaWxpdHlNYW5hZ2VyQ2xpZW50KCkpKS5hbmRSZXR1cm4odHJ1ZSk7CisgICAgICAgIG1vY2tTZXJ2aWNlSW50ZXJmYWNlLmludGVycnVwdCgpOworICAgICAgICByZXBsYXkobW9ja1NlcnZpY2VJbnRlcmZhY2UpOworCisgICAgICAgIC8vIGludm9rZSB0aGUgbWV0aG9kIHVuZGVyIHRlc3QKKyAgICAgICAgQWNjZXNzaWJpbGl0eU1hbmFnZXIgbWFuYWdlciA9IG5ldyBBY2Nlc3NpYmlsaXR5TWFuYWdlcihtQ29udGV4dCwgbW9ja1NlcnZpY2VJbnRlcmZhY2UpOworICAgICAgICBtYW5hZ2VyLmludGVycnVwdCgpOworCisgICAgICAgIC8vIHZlcmlmeSB0aGUgbW9jayBzZXJ2aWNlIHdhcyBwcm9wZXJseSBjYWxsZWQKKyAgICAgICAgdmVyaWZ5KG1vY2tTZXJ2aWNlSW50ZXJmYWNlKTsKKyAgICB9CisKKyAgICBATGFyZ2VUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdElzRW5hYmxlZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBjb25maWd1cmUgdGhlIG1vY2sgc2VydmljZSBiZWhhdmlvcgorICAgICAgICBJQWNjZXNzaWJpbGl0eU1hbmFnZXIgbW9ja1NlcnZpY2VJbnRlcmZhY2UgPSBtTW9ja1NlcnZpY2VJbnRlcmZhY2U7CisgICAgICAgIGV4cGVjdChtb2NrU2VydmljZUludGVyZmFjZS5hZGRDbGllbnQoYW55SUFjY2Vzc2liaWxpdHlNYW5hZ2VyQ2xpZW50KCkpKS5hbmRSZXR1cm4odHJ1ZSk7CisgICAgICAgIHJlcGxheShtb2NrU2VydmljZUludGVyZmFjZSk7CisKKyAgICAgICAgLy8gaW52b2tlIHRoZSBtZXRob2QgdW5kZXIgdGVzdAorICAgICAgICBBY2Nlc3NpYmlsaXR5TWFuYWdlciBtYW5hZ2VyID0gbmV3IEFjY2Vzc2liaWxpdHlNYW5hZ2VyKG1Db250ZXh0LCBtb2NrU2VydmljZUludGVyZmFjZSk7CisgICAgICAgIGJvb2xlYW4gaXNFbmFibGVkU2VydmljZUVuYWJsZWQgPSBtYW5hZ2VyLmlzRW5hYmxlZCgpOworCisgICAgICAgIC8vIGNoZWNrIGV4cGVjdGVkIHJlc3VsdAorICAgICAgICBhc3NlcnRUcnVlKCJNdXN0IGJlIGVuYWJsZWQgc2luY2UgdGhlIG1vY2sgc2VydmljZSBpcyBlbmFibGVkIiwgaXNFbmFibGVkU2VydmljZUVuYWJsZWQpOworCisgICAgICAgIC8vIGRpc2FibGUgYWNjZXNzaWJpbGl0eQorICAgICAgICBtYW5hZ2VyLmdldENsaWVudCgpLnNldEVuYWJsZWQoZmFsc2UpOworCisgICAgICAgIC8vIHdhaXQgZm9yIHRoZSBhc3luY2hyb25vdXMgSUJpbmRlciBjYWxsIHRvIGNvbXBsZXRlCisgICAgICAgIFRocmVhZC5zbGVlcChUSU1FT1VUX0JJTkRFUl9DQUxMKTsKKworICAgICAgICAvLyBpbnZva2UgdGhlIG1ldGhvZCB1bmRlciB0ZXN0CisgICAgICAgIGJvb2xlYW4gaXNFbmFibGVkU2VydmNpZURpc2FibGVkID0gbWFuYWdlci5pc0VuYWJsZWQoKTsKKworICAgICAgICAvLyBjaGVjayBleHBlY3RlZCByZXN1bHQKKyAgICAgICAgYXNzZXJ0RmFsc2UoIk11c3QgYmUgZGlzYWJsZWQgc2luY2UgdGhlIG1vY2sgc2VydmljZSBpcyBkaXNhYmxlZCIsCisgICAgICAgICAgICAgICAgaXNFbmFibGVkU2VydmNpZURpc2FibGVkKTsKKworICAgICAgICAvLyB2ZXJpZnkgdGhlIG1vY2sgc2VydmljZSB3YXMgcHJvcGVybHkgY2FsbGVkCisgICAgICAgIHZlcmlmeShtb2NrU2VydmljZUludGVyZmFjZSk7CisgICAgfQorCisgICAgQE1lZGl1bVRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2VuZEFjY2Vzc2liaWxpdHlFdmVudF9BY2Nlc3NpYmlsaXR5RW5hYmxlZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBjcmVhdGUgYW4gZXZlbnQgdG8gYmUgZGlzcGF0Y2hlZAorICAgICAgICBBY2Nlc3NpYmlsaXR5RXZlbnQgc2VudEV2ZW50ID0gQWNjZXNzaWJpbGl0eUV2ZW50Lm9idGFpbigpOworCisgICAgICAgIC8vIGNvbmZpZ3VyZSB0aGUgbW9jayBzZXJ2aWNlIGJlaGF2aW9yCisgICAgICAgIElBY2Nlc3NpYmlsaXR5TWFuYWdlciBtb2NrU2VydmljZUludGVyZmFjZSA9IG1Nb2NrU2VydmljZUludGVyZmFjZTsKKyAgICAgICAgZXhwZWN0KG1vY2tTZXJ2aWNlSW50ZXJmYWNlLmFkZENsaWVudChhbnlJQWNjZXNzaWJpbGl0eU1hbmFnZXJDbGllbnQoKSkpLmFuZFJldHVybih0cnVlKTsKKyAgICAgICAgZXhwZWN0KG1vY2tTZXJ2aWNlSW50ZXJmYWNlLnNlbmRBY2Nlc3NpYmlsaXR5RXZlbnQoZXFBY2Nlc3NpYmlsaXR5RXZlbnQoc2VudEV2ZW50KSkpCisgICAgICAgICAgICAgICAgLmFuZFJldHVybih0cnVlKTsKKyAgICAgICAgZXhwZWN0KG1vY2tTZXJ2aWNlSW50ZXJmYWNlLnNlbmRBY2Nlc3NpYmlsaXR5RXZlbnQoZXFBY2Nlc3NpYmlsaXR5RXZlbnQoc2VudEV2ZW50KSkpCisgICAgICAgICAgICAgICAgLmFuZFJldHVybihmYWxzZSk7CisgICAgICAgIHJlcGxheShtb2NrU2VydmljZUludGVyZmFjZSk7CisKKyAgICAgICAgLy8gaW52b2tlIHRoZSBtZXRob2QgdW5kZXIgdGVzdCAobWFuYWdlciBhbmQgc2VydmljZSBpbiBkaWZmZXJlbnQgcHJvY2Vzc2VzKQorICAgICAgICBBY2Nlc3NpYmlsaXR5TWFuYWdlciBtYW5hZ2VyID0gbmV3IEFjY2Vzc2liaWxpdHlNYW5hZ2VyKG1Db250ZXh0LCBtb2NrU2VydmljZUludGVyZmFjZSk7CisgICAgICAgIG1hbmFnZXIuc2VuZEFjY2Vzc2liaWxpdHlFdmVudChzZW50RXZlbnQpOworCisgICAgICAgIC8vIGNoZWNrIGV4cGVjdGVkIHJlc3VsdAorICAgICAgICBBY2Nlc3NpYmlsaXR5RXZlbnQgbmV4dEV2ZW50RGlmZmVyZW50UHJvY2Vzc2VzID0gQWNjZXNzaWJpbGl0eUV2ZW50Lm9idGFpbigpOworICAgICAgICBhc3NlcnRTYW1lKCJUaGUgbWFuYWdlciBhbmQgdGhlIHNlcnZpY2UgYXJlIGluIGRpZmZlcmVudCBwcm9jZXNzZXMsIHNvIHRoZSBldmVudCBtdXN0IGJlICIgKworICAgICAgICAgICAgICAgICJyZWN5Y2xlZCIsIHNlbnRFdmVudCwgbmV4dEV2ZW50RGlmZmVyZW50UHJvY2Vzc2VzKTsKKworICAgICAgICAvLyBpbnZva2UgdGhlIG1ldGhvZCB1bmRlciB0ZXN0IChtYW5hZ2VyIGFuZCBzZXJ2aWNlIGluIHRoZSBzYW1lIHByb2Nlc3MpCisgICAgICAgIG1hbmFnZXIuc2VuZEFjY2Vzc2liaWxpdHlFdmVudChzZW50RXZlbnQpOworCisgICAgICAgIC8vIGNoZWNrIGV4cGVjdGVkIHJlc3VsdAorICAgICAgICBBY2Nlc3NpYmlsaXR5RXZlbnQgbmV4dEV2ZW50U2FtZVByb2Nlc3MgPSBBY2Nlc3NpYmlsaXR5RXZlbnQub2J0YWluKCk7CisgICAgICAgIGFzc2VydE5vdFNhbWUoIlRoZSBtYW5hZ2VyIGFuZCB0aGUgc2VydmljZSBhcmUgaW4gdGhlIHNhbWUgcHJvY2Vzcywgc28gdGhlIGV2ZW50IG11c3Qgbm90IiArCisgICAgICAgICAgICAgICAgImJlIHJlY3ljbGVkIiwgc2VudEV2ZW50LCBuZXh0RXZlbnRTYW1lUHJvY2Vzcyk7CisKKyAgICAgICAgLy8gdmVyaWZ5IHRoZSBtb2NrIHNlcnZpY2Ugd2FzIHByb3Blcmx5IGNhbGxlZAorICAgICAgICB2ZXJpZnkobW9ja1NlcnZpY2VJbnRlcmZhY2UpOworICAgIH0KKworICAgIEBNZWRpdW1UZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNlbmRBY2Nlc3NpYmlsaXR5RXZlbnRfQWNjZXNzaWJpbGl0eURpc2FibGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIGNyZWF0ZSBhbiBldmVudCB0byBiZSBkaXNwYXRjaGVkCisgICAgICAgIEFjY2Vzc2liaWxpdHlFdmVudCBzZW50RXZlbnQgPSBBY2Nlc3NpYmlsaXR5RXZlbnQub2J0YWluKCk7CisKKyAgICAgICAgLy8gY29uZmlndXJlIHRoZSBtb2NrIHNlcnZpY2UgYmVoYXZpb3IKKyAgICAgICAgSUFjY2Vzc2liaWxpdHlNYW5hZ2VyIG1vY2tTZXJ2aWNlSW50ZXJmYWNlID0gbU1vY2tTZXJ2aWNlSW50ZXJmYWNlOworICAgICAgICBleHBlY3QobW9ja1NlcnZpY2VJbnRlcmZhY2UuYWRkQ2xpZW50KGFueUlBY2Nlc3NpYmlsaXR5TWFuYWdlckNsaWVudCgpKSkuYW5kUmV0dXJuKGZhbHNlKTsKKyAgICAgICAgcmVwbGF5KG1vY2tTZXJ2aWNlSW50ZXJmYWNlKTsKKworICAgICAgICAvLyBpbnZva2UgdGhlIG1ldGhvZCB1bmRlciB0ZXN0IChhY2Nlc3NpYmlsaXR5IGRpc2FibGVkKQorICAgICAgICBBY2Nlc3NpYmlsaXR5TWFuYWdlciBtYW5hZ2VyID0gbmV3IEFjY2Vzc2liaWxpdHlNYW5hZ2VyKG1Db250ZXh0LCBtb2NrU2VydmljZUludGVyZmFjZSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtYW5hZ2VyLnNlbmRBY2Nlc3NpYmlsaXR5RXZlbnQoc2VudEV2ZW50KTsKKyAgICAgICAgICAgIGZhaWwoIk5vIGFjY2Vzc2liaWxpdHkgZXZlbnRzIGFyZSBzZW50IGlmIGFjY2Vzc2liaWxpdHkgaXMgZGlzYWJsZWQiKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlzZSkgeworICAgICAgICAgICAgLy8gY2hlY2sgZXhwZWN0ZWQgcmVzdWx0CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkFjY2Vzc2liaWxpdHkgb2ZmLiBEaWQgeW91IGZvcmdldCB0byBjaGVjayB0aGF0PyIsIGlzZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gdmVyaWZ5IHRoZSBtb2NrIHNlcnZpY2Ugd2FzIHByb3Blcmx5IGNhbGxlZAorICAgICAgICB2ZXJpZnkobW9ja1NlcnZpY2VJbnRlcmZhY2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIERldGVybWluZXMgaWYgYW4ge0BsaW5rIEFjY2Vzc2liaWxpdHlFdmVudH0gcGFzc2VkIGFzIGEgbWV0aG9kIGFyZ3VtZW50CisgICAgICogbWF0Y2hlcyBleHBlY3RhdGlvbnMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWF0Y2hlZCBUaGUgZXZlbnQgdG8gY2hlY2suCisgICAgICogQHJldHVybiBUcnVlIGlmIGV4cGVjdGF0aW9ucyBhcmUgbWF0Y2hlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBBY2Nlc3NpYmlsaXR5RXZlbnQgZXFBY2Nlc3NpYmlsaXR5RXZlbnQoQWNjZXNzaWJpbGl0eUV2ZW50IG1hdGNoZWQpIHsKKyAgICAgICAgcmVwb3J0TWF0Y2hlcihuZXcgQWNjZXNzaWJpbGl0eUV2ZW50TWF0aGVyKG1hdGNoZWQpKTsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGV0ZXJtaW5lcyBpZiBhbiB7QGxpbmsgSUFjY2Vzc2liaWxpdHlNYW5hZ2VyQ2xpZW50fSBwYXNzZWQgYXMgYSBtZXRob2QgYXJndW1lbnQKKyAgICAgKiBtYXRjaGVzIGV4cGVjdGF0aW9ucyB3aGljaCBpbiB0aGlzIGNhc2UgYXJlIHRoYXQgYW55IGluc3RhbmNlIGlzIGFjY2VwdGVkLgorICAgICAqCisgICAgICogQHJldHVybiA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBJQWNjZXNzaWJpbGl0eU1hbmFnZXJDbGllbnQgYW55SUFjY2Vzc2liaWxpdHlNYW5hZ2VyQ2xpZW50KCkgeworICAgICAgICByZXBvcnRNYXRjaGVyKG5ldyBBbnlJQWNjZXNzaWJpbGl0eU1hbmFnZXJDbGllbnRNYXRoZXIoKSk7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIE1hdGNoZXIgZm9yIHtAbGluayBBY2Nlc3NpYmlsaXR5RXZlbnR9cy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBBY2Nlc3NpYmlsaXR5RXZlbnRNYXRoZXIgaW1wbGVtZW50cyBJQXJndW1lbnRNYXRjaGVyIHsKKyAgICAgICAgcHJpdmF0ZSBBY2Nlc3NpYmlsaXR5RXZlbnQgbUV4cGVjdGVkRXZlbnQ7CisKKyAgICAgICAgcHVibGljIEFjY2Vzc2liaWxpdHlFdmVudE1hdGhlcihBY2Nlc3NpYmlsaXR5RXZlbnQgZXhwZWN0ZWRFdmVudCkgeworICAgICAgICAgICAgbUV4cGVjdGVkRXZlbnQgPSBleHBlY3RlZEV2ZW50OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gbWF0Y2hlcyhPYmplY3QgbWF0Y2hlZCkgeworICAgICAgICAgICAgaWYgKCEobWF0Y2hlZCBpbnN0YW5jZW9mIEFjY2Vzc2liaWxpdHlFdmVudCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBY2Nlc3NpYmlsaXR5RXZlbnQgcmVjZWl2ZWRFdmVudCA9IChBY2Nlc3NpYmlsaXR5RXZlbnQpIG1hdGNoZWQ7CisgICAgICAgICAgICByZXR1cm4gbUV4cGVjdGVkRXZlbnQuZ2V0RXZlbnRUeXBlKCkgPT0gcmVjZWl2ZWRFdmVudC5nZXRFdmVudFR5cGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGFwcGVuZFRvKFN0cmluZ0J1ZmZlciBidWZmZXIpIHsKKyAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoInNlbmRBY2Nlc3NpYmlsaXR5RXZlbnQoKSIpOworICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgiIHdpdGggZXZlbnQgdHlwZSBcIiIpOworICAgICAgICAgICAgYnVmZmVyLmFwcGVuZChtRXhwZWN0ZWRFdmVudC5nZXRFdmVudFR5cGUoKSk7CisgICAgICAgICAgICBidWZmZXIuYXBwZW5kKCJcIiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogTWF0Y2hlciBmb3Ige0BsaW5rIElBY2Nlc3NpYmlsaXR5TWFuYWdlckNsaWVudH1zLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEFueUlBY2Nlc3NpYmlsaXR5TWFuYWdlckNsaWVudE1hdGhlciBpbXBsZW1lbnRzIElBcmd1bWVudE1hdGNoZXIgeworICAgICAgICBwdWJsaWMgYm9vbGVhbiBtYXRjaGVzKE9iamVjdCBtYXRjaGVkKSB7CisgICAgICAgICAgICBpZiAoIShtYXRjaGVkIGluc3RhbmNlb2YgSUFjY2Vzc2liaWxpdHlNYW5hZ2VyQ2xpZW50KSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgYXBwZW5kVG8oU3RyaW5nQnVmZmVyIGJ1ZmZlcikgeworICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgiYWRkQ2xpZW50KCkgd2l0aCBhbnkgSUFjY2Vzc2liaWxpdHlNYW5hZ2VyQ2xpZW50Iik7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90ZXN0cy9zZXJ2aWNlc3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlLmphdmEgYi9zZXJ2aWNlcy90ZXN0cy9zZXJ2aWNlc3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWJjOWI4NgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL3Rlc3RzL3NlcnZpY2VzdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9Nb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2UuamF2YQpAQCAtMCwwICsxLDI1NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuc2VydmVyOworCitpbXBvcnQgYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5BY2Nlc3NpYmlsaXR5U2VydmljZTsKK2ltcG9ydCBhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlLkFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mbzsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5RXZlbnQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlF1ZXVlOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCisvKioKKyAqIFRoaXMgaXMgdGhlIGJhc2UgY2xhc3MgZm9yIG1vY2sge0BsaW5rIEFjY2Vzc2liaWxpdHlTZXJ2aWNlfXMuCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2UgZXh0ZW5kcyBBY2Nlc3NpYmlsaXR5U2VydmljZSB7CisKKyAgICAvKioKKyAgICAgKiBUaGUgZXZlbnQgdGhpcyBzZXJ2aWNlIGV4cGVjdHMgdG8gcmVjZWl2ZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIFF1ZXVlPEFjY2Vzc2liaWxpdHlFdmVudD4gbUV4cGVjdGVkRXZlbnRzID0gbmV3IExpbmtlZExpc3Q8QWNjZXNzaWJpbGl0eUV2ZW50PigpOworCisgICAgLyoqCisgICAgICogSW50ZXJydXB0aW9uIGNhbGwgdGhpcyBzZXJ2aWNlIGV4cGVjdHMgdG8gcmVjZWl2ZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gbUV4cGVjdGVkSW50ZXJydXB0OworCisgICAgLyoqCisgICAgICogRmxhZyBpZiB0aGUgbW9jayBpcyBjdXJyZW50bHkgcmVwbGF5aW5nLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBtUmVwbGF5aW5nOworCisgICAgLyoqCisgICAgICogRmxhZyBpZiB0aGUgc3lzdGVtIGlzIGJvdW5kIGFzIGEgY2xpZW50IHRvIHRoaXMgc2VydmljZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gbUlzU3lzdGVtQm91bmRBc0NsaWVudDsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYW4ge0BsaW5rIEFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mb30gcG9wdWxhdGVkIHdpdGggZGVmYXVsdAorICAgICAqIHZhbHVlcy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIGRlZmF1bHQgaW5mby4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mbyBjcmVhdGVEZWZhdWx0SW5mbygpIHsKKyAgICAgICAgQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvIGRlZmF1bHRJbmZvID0gbmV3IEFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mbygpOworICAgICAgICBkZWZhdWx0SW5mby5ldmVudFR5cGVzID0gQWNjZXNzaWJpbGl0eUV2ZW50LlRZUEVfVklFV19DTElDS0VEOworICAgICAgICBkZWZhdWx0SW5mby5mZWVkYmFja1R5cGUgPSBBY2Nlc3NpYmlsaXR5U2VydmljZUluZm8uRkVFREJBQ0tfQVVESUJMRTsKKyAgICAgICAgZGVmYXVsdEluZm8uZmxhZ3MgPSAwOworICAgICAgICBkZWZhdWx0SW5mby5ub3RpZmljYXRpb25UaW1lb3V0ID0gMDsKKyAgICAgICAgZGVmYXVsdEluZm8ucGFja2FnZU5hbWVzID0gbmV3IFN0cmluZ1tdIHsKKyAgICAgICAgICAgICJmb28uYmFyLmJheiIKKyAgICAgICAgfTsKKworICAgICAgICByZXR1cm4gZGVmYXVsdEluZm87CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RhcnRzIHJlcGxheWluZyB0aGUgbW9jay4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZXBsYXkoKSB7CisgICAgICAgIG1SZXBsYXlpbmcgPSB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFZlcmlmaWVzIGlmIGFsbCBleHBlY3RlZCBzZXJ2aWNlIG1ldGhvZHMgaGF2ZSBiZWVuIGNhbGxlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB2ZXJpZnkoKSB7CisgICAgICAgIGlmICghbVJlcGxheWluZykgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiRGlkIHlvdSBmb3JnZXQgdG8gY2FsbCByZXBsYXkoKSIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1FeHBlY3RlZEludGVycnVwdCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiRXhwZWN0ZWQgY2FsbCB0byAjaW50ZXJydXB0KCkgbm90IHJlY2VpdmVkIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFtRXhwZWN0ZWRFdmVudHMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJFeHBlY3RlZCBhIGNhbGwgdG8gb25BY2Nlc3NpYmlsaXR5RXZlbnQoKSBmb3IgIgorICAgICAgICAgICAgICAgICAgICArICJldmVudHMgXCIiICsgbUV4cGVjdGVkRXZlbnRzICsgIlwiIG5vdCByZWNlaXZlZCIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVzZXRzIHRoaXMgaW5zdGFuY2Ugc28gaXQgY2FuIGJlIHJldXNlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZXNldCgpIHsKKyAgICAgICAgbUV4cGVjdGVkRXZlbnRzLmNsZWFyKCk7CisgICAgICAgIG1FeHBlY3RlZEludGVycnVwdCA9IGZhbHNlOworICAgICAgICBtUmVwbGF5aW5nID0gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyBhbiBleHBlY3RlZCBjYWxsIHRvCisgICAgICoge0BsaW5rICNvbkFjY2Vzc2liaWxpdHlFdmVudChBY2Nlc3NpYmlsaXR5RXZlbnQpfSB3aXRoIGdpdmVuIGV2ZW50IGFzCisgICAgICogYXJndW1lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXhwZWN0ZWRFdmVudCBUaGUgZXhwZWN0ZWQgZXZlbnQgYXJndW1lbnQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgZXhwZWN0RXZlbnQoQWNjZXNzaWJpbGl0eUV2ZW50IGV4cGVjdGVkRXZlbnQpIHsKKyAgICAgICAgbUV4cGVjdGVkRXZlbnRzLmFkZChleHBlY3RlZEV2ZW50KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIGFuIGV4cGVjdGVkIGNhbGwgb2Yge0BsaW5rICNvbkludGVycnVwdCgpfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBleHBlY3RJbnRlcnJ1cHQoKSB7CisgICAgICAgIG1FeHBlY3RlZEludGVycnVwdCA9IHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25BY2Nlc3NpYmlsaXR5RXZlbnQoQWNjZXNzaWJpbGl0eUV2ZW50IHJlY2VpdmVkRXZlbnQpIHsKKyAgICAgICAgaWYgKCFtUmVwbGF5aW5nKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAobUV4cGVjdGVkRXZlbnRzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVW5leHBlY3RlZCBldmVudDogIiArIHJlY2VpdmVkRXZlbnQpOworICAgICAgICB9CisKKyAgICAgICAgQWNjZXNzaWJpbGl0eUV2ZW50IGV4cGVjdGVkRXZlbnQgPSBtRXhwZWN0ZWRFdmVudHMucG9sbCgpOworICAgICAgICBhc3NlcnRFcXVhbHNBY2Nlc3NpYmxpdHlFdmVudChleHBlY3RlZEV2ZW50LCByZWNlaXZlZEV2ZW50KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkludGVycnVwdCgpIHsKKyAgICAgICAgaWYgKCFtUmVwbGF5aW5nKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAoIW1FeHBlY3RlZEludGVycnVwdCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVW5leHBlY3RlZCBjYWxsIHRvIG9uSW50ZXJydXB0KCkiKTsKKyAgICAgICAgfQorCisgICAgICAgIG1FeHBlY3RlZEludGVycnVwdCA9IGZhbHNlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uU2VydmljZUNvbm5lY3RlZCgpIHsKKyAgICAgICAgbUlzU3lzdGVtQm91bmRBc0NsaWVudCA9IHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gb25VbmJpbmQoSW50ZW50IGludGVudCkgeworICAgICAgICBtSXNTeXN0ZW1Cb3VuZEFzQ2xpZW50ID0gZmFsc2U7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGlmIHRoZSBzeXN0ZW0gaXMgYm91bmQgYXMgY2xpZW50IHRvIHRoaXMgc2VydmljZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgc3lzdGVtIGlzIGJvdW5kLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNTeXN0ZW1Cb3VuZEFzQ2xpZW50KCkgeworICAgICAgICByZXR1cm4gbUlzU3lzdGVtQm91bmRBc0NsaWVudDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb21wYXJlcyBhbGwgcHJvcGVydGllcyBvZiB0aGUgPGNvZGU+ZXhwZWN0ZWRFdmVudDwvY29kZT4gYW5kIHRoZQorICAgICAqIDxjb2RlPnJlY2V2aWVkRXZlbnQ8L2NvZGU+IHRvIHZlcmlmeSB0aGF0IHRoZSByZWNlaXZlZCBldmVudCBpcyB0aGUgb25lCisgICAgICogdGhhdCBpcyBleHBlY3RlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgYXNzZXJ0RXF1YWxzQWNjZXNzaWJsaXR5RXZlbnQoQWNjZXNzaWJpbGl0eUV2ZW50IGV4cGVjdGVkRXZlbnQsCisgICAgICAgICAgICBBY2Nlc3NpYmlsaXR5RXZlbnQgcmVjZWl2ZWRFdmVudCkgeworICAgICAgICBUZXN0Q2FzZS5hc3NlcnRFcXVhbHMoImFkZGVkQ291bnQgaGFzIGluY29ycmVjdCB2YWx1ZSIsIGV4cGVjdGVkRXZlbnQuZ2V0QWRkZWRDb3VudCgpLAorICAgICAgICAgICAgICAgIHJlY2VpdmVkRXZlbnQuZ2V0QWRkZWRDb3VudCgpKTsKKyAgICAgICAgVGVzdENhc2UuYXNzZXJ0RXF1YWxzKCJiZWZvcmVUZXh0IGhhcyBpbmNvcnJlY3QgdmFsdWUiLCBleHBlY3RlZEV2ZW50LmdldEJlZm9yZVRleHQoKSwKKyAgICAgICAgICAgICAgICByZWNlaXZlZEV2ZW50LmdldEJlZm9yZVRleHQoKSk7CisgICAgICAgIFRlc3RDYXNlLmFzc2VydEVxdWFscygiY2hlY2tlZCBoYXMgaW5jb3JyZWN0IHZhbHVlIiwgZXhwZWN0ZWRFdmVudC5pc0NoZWNrZWQoKSwKKyAgICAgICAgICAgICAgICByZWNlaXZlZEV2ZW50LmlzQ2hlY2tlZCgpKTsKKyAgICAgICAgVGVzdENhc2UuYXNzZXJ0RXF1YWxzKCJjbGFzc05hbWUgaGFzIGluY29ycmVjdCB2YWx1ZSIsIGV4cGVjdGVkRXZlbnQuZ2V0Q2xhc3NOYW1lKCksCisgICAgICAgICAgICAgICAgcmVjZWl2ZWRFdmVudC5nZXRDbGFzc05hbWUoKSk7CisgICAgICAgIFRlc3RDYXNlLmFzc2VydEVxdWFscygiY29udGVudERlc2NyaXB0aW9uIGhhcyBpbmNvcnJlY3QgdmFsdWUiLCBleHBlY3RlZEV2ZW50CisgICAgICAgICAgICAgICAgLmdldENvbnRlbnREZXNjcmlwdGlvbigpLCByZWNlaXZlZEV2ZW50LmdldENvbnRlbnREZXNjcmlwdGlvbigpKTsKKyAgICAgICAgVGVzdENhc2UuYXNzZXJ0RXF1YWxzKCJjdXJyZW50SXRlbUluZGV4IGhhcyBpbmNvcnJlY3QgdmFsdWUiLCBleHBlY3RlZEV2ZW50CisgICAgICAgICAgICAgICAgLmdldEN1cnJlbnRJdGVtSW5kZXgoKSwgcmVjZWl2ZWRFdmVudC5nZXRDdXJyZW50SXRlbUluZGV4KCkpOworICAgICAgICBUZXN0Q2FzZS5hc3NlcnRFcXVhbHMoImVuYWJsZWQgaGFzIGluY29ycmVjdCB2YWx1ZSIsIGV4cGVjdGVkRXZlbnQuaXNFbmFibGVkKCksCisgICAgICAgICAgICAgICAgcmVjZWl2ZWRFdmVudC5pc0VuYWJsZWQoKSk7CisgICAgICAgIFRlc3RDYXNlLmFzc2VydEVxdWFscygiZXZlbnRUeXBlIGhhcyBpbmNvcnJlY3QgdmFsdWUiLCBleHBlY3RlZEV2ZW50LmdldEV2ZW50VHlwZSgpLAorICAgICAgICAgICAgICAgIHJlY2VpdmVkRXZlbnQuZ2V0RXZlbnRUeXBlKCkpOworICAgICAgICBUZXN0Q2FzZS5hc3NlcnRFcXVhbHMoImZyb21JbmRleCBoYXMgaW5jb3JyZWN0IHZhbHVlIiwgZXhwZWN0ZWRFdmVudC5nZXRGcm9tSW5kZXgoKSwKKyAgICAgICAgICAgICAgICByZWNlaXZlZEV2ZW50LmdldEZyb21JbmRleCgpKTsKKyAgICAgICAgVGVzdENhc2UuYXNzZXJ0RXF1YWxzKCJmdWxsU2NyZWVuIGhhcyBpbmNvcnJlY3QgdmFsdWUiLCBleHBlY3RlZEV2ZW50LmlzRnVsbFNjcmVlbigpLAorICAgICAgICAgICAgICAgIHJlY2VpdmVkRXZlbnQuaXNGdWxsU2NyZWVuKCkpOworICAgICAgICBUZXN0Q2FzZS5hc3NlcnRFcXVhbHMoIml0ZW1Db3VudCBoYXMgaW5jb3JyZWN0IHZhbHVlIiwgZXhwZWN0ZWRFdmVudC5nZXRJdGVtQ291bnQoKSwKKyAgICAgICAgICAgICAgICByZWNlaXZlZEV2ZW50LmdldEl0ZW1Db3VudCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzTm90aWZpY2F0aW9uQXNQYXJjZWxhYmxlRGF0YShleHBlY3RlZEV2ZW50LCByZWNlaXZlZEV2ZW50KTsKKyAgICAgICAgVGVzdENhc2UuYXNzZXJ0RXF1YWxzKCJwYXNzd29yZCBoYXMgaW5jb3JyZWN0IHZhbHVlIiwgZXhwZWN0ZWRFdmVudC5pc1Bhc3N3b3JkKCksCisgICAgICAgICAgICAgICAgcmVjZWl2ZWRFdmVudC5pc1Bhc3N3b3JkKCkpOworICAgICAgICBUZXN0Q2FzZS5hc3NlcnRFcXVhbHMoInJlbW92ZWRDb3VudCBoYXMgaW5jb3JyZWN0IHZhbHVlIiwgZXhwZWN0ZWRFdmVudC5nZXRSZW1vdmVkQ291bnQoKSwKKyAgICAgICAgICAgICAgICByZWNlaXZlZEV2ZW50LmdldFJlbW92ZWRDb3VudCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzVGV4dChleHBlY3RlZEV2ZW50LCByZWNlaXZlZEV2ZW50KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb21wYXJlcyB0aGUge0BsaW5rIGFuZHJvaWQub3MuUGFyY2VsYWJsZX0gZGF0YSBvZiB0aGUKKyAgICAgKiA8Y29kZT5leHBlY3RlZEV2ZW50PC9jb2RlPiBhbmQgPGNvZGU+cmVjZWl2ZWRFdmVudDwvY29kZT4gdG8gdmVyaWZ5IHRoYXQKKyAgICAgKiB0aGUgcmVjZWl2ZWQgZXZlbnQgaXMgdGhlIG9uZSB0aGF0IGlzIGV4cGVjdGVkLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBhc3NlcnRFcXVhbHNOb3RpZmljYXRpb25Bc1BhcmNlbGFibGVEYXRhKEFjY2Vzc2liaWxpdHlFdmVudCBleHBlY3RlZEV2ZW50LAorICAgICAgICAgICAgQWNjZXNzaWJpbGl0eUV2ZW50IHJlY2VpdmVkRXZlbnQpIHsKKyAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSAicGFyY2VsYWJsZURhdGEgaGFzIGluY29ycmVjdCB2YWx1ZSI7CisgICAgICAgIE1lc3NhZ2UgZXhwZWN0ZWRNZXNzYWdlID0gKE1lc3NhZ2UpIGV4cGVjdGVkRXZlbnQuZ2V0UGFyY2VsYWJsZURhdGEoKTsKKyAgICAgICAgTWVzc2FnZSByZWNlaXZlZE1lc3NhZ2UgPSAoTWVzc2FnZSkgcmVjZWl2ZWRFdmVudC5nZXRQYXJjZWxhYmxlRGF0YSgpOworCisgICAgICAgIGlmIChleHBlY3RlZE1lc3NhZ2UgPT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKHJlY2VpdmVkTWVzc2FnZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgVGVzdENhc2UuYXNzZXJ0Tm90TnVsbChtZXNzYWdlLCByZWNlaXZlZE1lc3NhZ2UpOworCisgICAgICAgIC8vIHdlIGRvIGEgdmVyeSBzaW1wbGUgc2FuaXR5IGNoZWNrIHNpbmNlIHdlIGRvIG5vdCB0ZXN0IE1lc3NhZ2UKKyAgICAgICAgVGVzdENhc2UuYXNzZXJ0RXF1YWxzKG1lc3NhZ2UsIGV4cGVjdGVkTWVzc2FnZS53aGF0LCByZWNlaXZlZE1lc3NhZ2Uud2hhdCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29tcGFyZXMgdGhlIHRleHQgb2YgdGhlIDxjb2RlPmV4cGVjdGVkRXZlbnQ8L2NvZGU+IGFuZAorICAgICAqIDxjb2RlPnJlY2VpdmVkRXZlbnQ8L2NvZGU+IGJ5IGNvbXBhcmluZyB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZQorICAgICAqIGNvcnJlc3BvbmRpbmcge0BsaW5rIENoYXJTZXF1ZW5jZX1zLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBhc3NlcnRFcXVhbHNUZXh0KEFjY2Vzc2liaWxpdHlFdmVudCBleHBlY3RlZEV2ZW50LAorICAgICAgICAgICAgQWNjZXNzaWJpbGl0eUV2ZW50IHJlY2VpdmVkRXZlbnQpIHsKKyAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSAidGV4dCBoYXMgaW5jb3JyZWN0IHZhbHVlIjsKKyAgICAgICAgTGlzdDxDaGFyU2VxdWVuY2U+IGV4cGVjdGVkVGV4dCA9IGV4cGVjdGVkRXZlbnQuZ2V0VGV4dCgpOworICAgICAgICBMaXN0PENoYXJTZXF1ZW5jZT4gcmVjZWl2ZWRUZXh0ID0gcmVjZWl2ZWRFdmVudC5nZXRUZXh0KCk7CisKKyAgICAgICAgVGVzdENhc2UuYXNzZXJ0RXF1YWxzKG1lc3NhZ2UsIGV4cGVjdGVkVGV4dC5zaXplKCksIHJlY2VpdmVkVGV4dC5zaXplKCkpOworCisgICAgICAgIEl0ZXJhdG9yPENoYXJTZXF1ZW5jZT4gZXhwZWN0ZWRUZXh0SXRlcmF0b3IgPSBleHBlY3RlZFRleHQuaXRlcmF0b3IoKTsKKyAgICAgICAgSXRlcmF0b3I8Q2hhclNlcXVlbmNlPiByZWNlaXZlZFRleHRJdGVyYXRvciA9IHJlY2VpdmVkVGV4dC5pdGVyYXRvcigpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXhwZWN0ZWRUZXh0LnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAvLyBjb21wYXJlIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24KKyAgICAgICAgICAgIFRlc3RDYXNlLmFzc2VydEVxdWFscyhtZXNzYWdlLCBleHBlY3RlZFRleHRJdGVyYXRvci5uZXh0KCkudG9TdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZWRUZXh0SXRlcmF0b3IubmV4dCgpLnRvU3RyaW5nKCkpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvYW5kcm9pZC90ZWxlcGhvbnkvUGhvbmVOdW1iZXJGb3JtYXR0aW5nVGV4dFdhdGNoZXIuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L1Bob25lTnVtYmVyRm9ybWF0dGluZ1RleHRXYXRjaGVyLmphdmEKaW5kZXggOGE0NzMzOS4uNzgyNjM1ZSAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvYW5kcm9pZC90ZWxlcGhvbnkvUGhvbmVOdW1iZXJGb3JtYXR0aW5nVGV4dFdhdGNoZXIuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9hbmRyb2lkL3RlbGVwaG9ueS9QaG9uZU51bWJlckZvcm1hdHRpbmdUZXh0V2F0Y2hlci5qYXZhCkBAIC0xNiw4MyArMTYsMTk5IEBACiAKIHBhY2thZ2UgYW5kcm9pZC50ZWxlcGhvbnk7CiAKK2ltcG9ydCBjb20uZ29vZ2xlLmkxOG4ucGhvbmVudW1iZXJzLkFzWW91VHlwZUZvcm1hdHRlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmkxOG4ucGhvbmVudW1iZXJzLlBob25lTnVtYmVyVXRpbDsKKworaW1wb3J0IGFuZHJvaWQudGVsZXBob255LlBob25lTnVtYmVyVXRpbHM7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LkVkaXRhYmxlOwogaW1wb3J0IGFuZHJvaWQudGV4dC5TZWxlY3Rpb247CiBpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRXYXRjaGVyOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OwogCiBpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKIAogLyoqCi0gKiBXYXRjaGVzIGEge0BsaW5rIFRleHRWaWV3fSBhbmQgaWYgYSBwaG9uZSBudW1iZXIgaXMgZW50ZXJlZCB3aWxsIGZvcm1hdCBpdCB1c2luZwotICoge0BsaW5rIFBob25lTnVtYmVyVXRpbHMjZm9ybWF0TnVtYmVyKEVkaXRhYmxlLCBpbnQpfS4gVGhlIGZvcm1hdHRpbmcgaXMgYmFzZWQgb24KLSAqIHRoZSBjdXJyZW50IHN5c3RlbSBsb2NhbGUgd2hlbiB0aGlzIG9iamVjdCBpcyBjcmVhdGVkIGFuZCBmdXR1cmUgbG9jYWxlIGNoYW5nZXMKLSAqIG1heSBub3QgdGFrZSBlZmZlY3Qgb24gdGhpcyBpbnN0YW5jZS4KKyAqIFdhdGNoZXMgYSB7QGxpbmsgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXd9IGFuZCBpZiBhIHBob25lIG51bWJlciBpcyBlbnRlcmVkCisgKiB3aWxsIGZvcm1hdCBpdC4KKyAqIDxwPgorICogU3RvcCBmb3JtYXR0aW5nIHdoZW4gdGhlIHVzZXIKKyAqIDx1bD4KKyAqIDxsaT5JbnB1dHMgbm9uLWRpYWxhYmxlIGNoYXJhY3RlcnM8L2xpPgorICogPGxpPlJlbW92ZXMgdGhlIHNlcGFyYXRvciBpbiB0aGUgbWlkZGxlIG9mIHN0cmluZy48L2xpPgorICogPC91bD4KKyAqIDxwPgorICogVGhlIGZvcm1hdHRpbmcgd2lsbCBiZSByZXN0YXJ0ZWQgb25jZSB0aGUgdGV4dCBpcyBjbGVhcmVkLgogICovCiBwdWJsaWMgY2xhc3MgUGhvbmVOdW1iZXJGb3JtYXR0aW5nVGV4dFdhdGNoZXIgaW1wbGVtZW50cyBUZXh0V2F0Y2hlciB7CisgICAgLyoqCisgICAgICogT25lIG9yIG1vcmUgY2hhcmFjdGVycyB3ZXJlIHJlbW92ZWQgZnJvbSB0aGUgZW5kLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBTVEFURV9SRU1PVkVfTEFTVCA9IDA7CiAKLSAgICBzdGF0aWMgcHJpdmF0ZSBpbnQgc0Zvcm1hdFR5cGU7Ci0gICAgc3RhdGljIHByaXZhdGUgTG9jYWxlIHNDYWNoZWRMb2NhbGU7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1Gb3JtYXR0aW5nOwotICAgIHByaXZhdGUgYm9vbGVhbiBtRGVsZXRpbmdIeXBoZW47Ci0gICAgcHJpdmF0ZSBpbnQgbUh5cGhlblN0YXJ0OwotICAgIHByaXZhdGUgYm9vbGVhbiBtRGVsZXRpbmdCYWNrd2FyZDsKKyAgICAvKioKKyAgICAgKiBPbmUgb3IgbW9yZSBjaGFyYWN0ZXJzIHdlcmUgYXBwZW5kZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IFNUQVRFX0FQUEVORCA9IDE7CiAKKyAgICAvKioKKyAgICAgKiBPbmUgb3IgbW9yZSBkaWdpdHMgd2VyZSBjaGFuZ2VkIGluIHRoZSBiZWdpbm5pbmcgb3IgdGhlIG1pZGRsZSBvZiB0ZXh0LgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBTVEFURV9NT0RJRllfRElHSVRTID0gMjsKKworICAgIC8qKgorICAgICAqIFRoZSBjaGFuZ2VzIG90aGVyIHRoYW4gdGhlIGFib3ZlLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBTVEFURV9PVEhFUiA9IDM7CisKKyAgICAvKioKKyAgICAgKiBUaGUgc3RhdGUgb2YgdGhpcyBjaGFuZ2UgY291bGQgYmUgb25lIHZhbHVlIG9mIHRoZSBhYm92ZQorICAgICAqLworICAgIHByaXZhdGUgaW50IG1TdGF0ZTsKKworICAgIC8qKgorICAgICAqIEluZGljYXRlcyB0aGUgY2hhbmdlIHdhcyBjYXVzZWQgYnkgb3Vyc2VsdmVzLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBtU2VsZkNoYW5nZSA9IGZhbHNlOworCisgICAgLyoqCisgICAgICogSW5kaWNhdGVzIHRoZSBmb3JtYXR0aW5nIGhhcyBiZWVuIHN0b3BwZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIG1TdG9wRm9ybWF0dGluZzsKKworICAgIHByaXZhdGUgQXNZb3VUeXBlRm9ybWF0dGVyIG1Gb3JtYXR0ZXI7CisKKyAgICAvKioKKyAgICAgKiBUaGUgZm9ybWF0dGluZyBpcyBiYXNlZCBvbiB0aGUgY3VycmVudCBzeXN0ZW0gbG9jYWxlIGFuZCBmdXR1cmUgbG9jYWxlIGNoYW5nZXMKKyAgICAgKiBtYXkgbm90IHRha2UgZWZmZWN0IG9uIHRoaXMgaW5zdGFuY2UuCisgICAgICovCiAgICAgcHVibGljIFBob25lTnVtYmVyRm9ybWF0dGluZ1RleHRXYXRjaGVyKCkgewotICAgICAgICBpZiAoc0NhY2hlZExvY2FsZSA9PSBudWxsIHx8IHNDYWNoZWRMb2NhbGUgIT0gTG9jYWxlLmdldERlZmF1bHQoKSkgewotICAgICAgICAgICAgc0NhY2hlZExvY2FsZSA9IExvY2FsZS5nZXREZWZhdWx0KCk7Ci0gICAgICAgICAgICBzRm9ybWF0VHlwZSA9IFBob25lTnVtYmVyVXRpbHMuZ2V0Rm9ybWF0VHlwZUZvckxvY2FsZShzQ2FjaGVkTG9jYWxlKTsKLSAgICAgICAgfQorICAgICAgICB0aGlzIChMb2NhbGUuZ2V0RGVmYXVsdCgpICE9IG51bGwgPyBMb2NhbGUuZ2V0RGVmYXVsdCgpLmdldENvdW50cnkoKSA6ICJVUyIpOwogICAgIH0KIAotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBhZnRlclRleHRDaGFuZ2VkKEVkaXRhYmxlIHRleHQpIHsKLSAgICAgICAgLy8gTWFrZSBzdXJlIHRvIGlnbm9yZSBjYWxscyB0byBhZnRlclRleHRDaGFuZ2VkIGNhdXNlZCBieSB0aGUgd29yayBkb25lIGJlbG93Ci0gICAgICAgIGlmICghbUZvcm1hdHRpbmcpIHsKLSAgICAgICAgICAgIG1Gb3JtYXR0aW5nID0gdHJ1ZTsKLQotICAgICAgICAgICAgLy8gSWYgZGVsZXRpbmcgdGhlIGh5cGhlbiwgYWxzbyBkZWxldGUgdGhlIGNoYXIgYmVmb3JlIG9yIGFmdGVyIHRoYXQKLSAgICAgICAgICAgIGlmIChtRGVsZXRpbmdIeXBoZW4gJiYgbUh5cGhlblN0YXJ0ID4gMCkgewotICAgICAgICAgICAgICAgIGlmIChtRGVsZXRpbmdCYWNrd2FyZCkgewotICAgICAgICAgICAgICAgICAgICBpZiAobUh5cGhlblN0YXJ0IC0gMSA8IHRleHQubGVuZ3RoKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRleHQuZGVsZXRlKG1IeXBoZW5TdGFydCAtIDEsIG1IeXBoZW5TdGFydCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1IeXBoZW5TdGFydCA8IHRleHQubGVuZ3RoKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgdGV4dC5kZWxldGUobUh5cGhlblN0YXJ0LCBtSHlwaGVuU3RhcnQgKyAxKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuZm9ybWF0TnVtYmVyKHRleHQsIHNGb3JtYXRUeXBlKTsKLQotICAgICAgICAgICAgbUZvcm1hdHRpbmcgPSBmYWxzZTsKLSAgICAgICAgfQorICAgIC8qKgorICAgICAqIFRoZSBmb3JtYXR0aW5nIGlzIGJhc2VkIG9uIHRoZSBnaXZlbiA8Y29kZT5jb3VudHJ5Q29kZTwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY291bnRyeUNvZGUgdGhlIElTTyAzMTY2LTEgdHdvLWxldHRlciBjb3VudHJ5IGNvZGUgdGhhdCBpbmRpY2F0ZXMgdGhlIGNvdW50cnkvcmVnaW9uCisgICAgICogd2hlcmUgdGhlIHBob25lIG51bWJlciBpcyBiZWluZyBlbnRlcmVkLgorICAgICAqCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgUGhvbmVOdW1iZXJGb3JtYXR0aW5nVGV4dFdhdGNoZXIoU3RyaW5nIGNvdW50cnlDb2RlKSB7CisgICAgICAgIG1Gb3JtYXR0ZXIgPSBQaG9uZU51bWJlclV0aWwuZ2V0SW5zdGFuY2UoKS5nZXRBc1lvdVR5cGVGb3JtYXR0ZXIoY291bnRyeUNvZGUpOwogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIGJlZm9yZVRleHRDaGFuZ2VkKENoYXJTZXF1ZW5jZSBzLCBpbnQgc3RhcnQsIGludCBjb3VudCwgaW50IGFmdGVyKSB7Ci0gICAgICAgIC8vIENoZWNrIGlmIHRoZSB1c2VyIGlzIGRlbGV0aW5nIGEgaHlwaGVuCi0gICAgICAgIGlmICghbUZvcm1hdHRpbmcpIHsKLSAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB1c2VyIGlzIGRlbGV0aW5nIG9uZSBjaGFyLCB3aXRob3V0IGEgc2VsZWN0aW9uCi0gICAgICAgICAgICBmaW5hbCBpbnQgc2VsU3RhcnQgPSBTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uU3RhcnQocyk7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgc2VsRW5kID0gU2VsZWN0aW9uLmdldFNlbGVjdGlvbkVuZChzKTsKLSAgICAgICAgICAgIGlmIChzLmxlbmd0aCgpID4gMSAvLyBDYW4gZGVsZXRlIGFub3RoZXIgY2hhcmFjdGVyCi0gICAgICAgICAgICAgICAgICAgICYmIGNvdW50ID09IDEgLy8gRGVsZXRpbmcgb25seSBvbmUgY2hhcmFjdGVyCi0gICAgICAgICAgICAgICAgICAgICYmIGFmdGVyID09IDAgLy8gRGVsZXRpbmcKLSAgICAgICAgICAgICAgICAgICAgJiYgcy5jaGFyQXQoc3RhcnQpID09ICctJyAvLyBhIGh5cGhlbgotICAgICAgICAgICAgICAgICAgICAmJiBzZWxTdGFydCA9PSBzZWxFbmQpIHsgLy8gbm8gc2VsZWN0aW9uCi0gICAgICAgICAgICAgICAgbURlbGV0aW5nSHlwaGVuID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBtSHlwaGVuU3RhcnQgPSBzdGFydDsKLSAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgdXNlciBpcyBkZWxldGluZyBmb3J3YXJkIG9yIGJhY2t3YXJkCi0gICAgICAgICAgICAgICAgaWYgKHNlbFN0YXJ0ID09IHN0YXJ0ICsgMSkgewotICAgICAgICAgICAgICAgICAgICBtRGVsZXRpbmdCYWNrd2FyZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbURlbGV0aW5nQmFja3dhcmQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1EZWxldGluZ0h5cGhlbiA9IGZhbHNlOwotICAgICAgICAgICAgfQorICAgIHB1YmxpYyB2b2lkIGJlZm9yZVRleHRDaGFuZ2VkKENoYXJTZXF1ZW5jZSBzLCBpbnQgc3RhcnQsIGludCBjb3VudCwKKyAgICAgICAgICAgIGludCBhZnRlcikgeworICAgICAgICBpZiAobVNlbGZDaGFuZ2UgfHwgbVN0b3BGb3JtYXR0aW5nKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNvdW50ID09IDAgJiYgcy5sZW5ndGgoKSA9PSBzdGFydCkgeworICAgICAgICAgICAgLy8gQXBwZW5kIG9uZSBvciBtb3JlIG5ldyBjaGFycworICAgICAgICAgICAgbVN0YXRlID0gU1RBVEVfQVBQRU5EOworICAgICAgICB9IGVsc2UgaWYgKGFmdGVyID09IDAgJiYgc3RhcnQgKyBjb3VudCA9PSBzLmxlbmd0aCgpICYmIGNvdW50ID4gMCkgeworICAgICAgICAgICAgLy8gUmVtb3ZlIG9uZSBvciBtb3JlIGNoYXJzIGZyb20gdGhlIGVuZCBvZiBzdHJpbmcuCisgICAgICAgICAgICBtU3RhdGUgPSBTVEFURV9SRU1PVkVfTEFTVDsKKyAgICAgICAgfSBlbHNlIGlmIChjb3VudCA+IDAgJiYgIWhhc1NlcGFyYXRvcihzLCBzdGFydCwgY291bnQpKSB7CisgICAgICAgICAgICAvLyBSZW1vdmUgdGhlIGRpYWxhYmxlIGNoYXJzIGluIHRoZSBiZWdpbiBvciBtaWRkbGUgb2YgdGV4dC4KKyAgICAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX01PRElGWV9ESUdJVFM7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtU3RhdGUgPSBTVEFURV9PVEhFUjsKICAgICAgICAgfQogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIG9uVGV4dENoYW5nZWQoQ2hhclNlcXVlbmNlIHMsIGludCBzdGFydCwgaW50IGJlZm9yZSwgaW50IGNvdW50KSB7Ci0gICAgICAgIC8vIERvZXMgbm90aGluZworICAgICAgICBpZiAobVNlbGZDaGFuZ2UgfHwgbVN0b3BGb3JtYXR0aW5nKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1TdGF0ZSA9PSBTVEFURV9PVEhFUikgeworICAgICAgICAgICAgaWYgKGNvdW50ID4gMCAmJiAhaGFzU2VwYXJhdG9yKHMsIHN0YXJ0LCBjb3VudCkpIHsKKyAgICAgICAgICAgICAgICAvLyBVc2VyIGluc2VydGVkIHRoZSBkaWFsYWJsZSBjaGFyYWN0ZXJzIGluIHRoZSBtaWRkbGUgb2YgdGV4dC4KKyAgICAgICAgICAgICAgICBtU3RhdGUgPSBTVEFURV9NT0RJRllfRElHSVRTOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIENoZWNrIHdoZXRoZXIgd2Ugc2hvdWxkIHN0b3AgZm9ybWF0dGluZy4KKyAgICAgICAgaWYgKG1TdGF0ZSA9PSBTVEFURV9BUFBFTkQgJiYgY291bnQgPiAwICYmIGhhc1NlcGFyYXRvcihzLCBzdGFydCwgY291bnQpKSB7CisgICAgICAgICAgICAvLyBVc2VyIGFwcGVuZGVkIHRoZSBub24tZGlhbGFibGUgY2hhcmFjdGVyLCBzdG9wIGZvcm1hdHRpbmcuCisgICAgICAgICAgICBzdG9wRm9ybWF0dGluZygpOworICAgICAgICB9IGVsc2UgaWYgKG1TdGF0ZSA9PSBTVEFURV9PVEhFUikgeworICAgICAgICAgICAgLy8gVXNlciBtdXN0IGluc2VydCBvciByZW1vdmUgdGhlIG5vbi1kaWFsYWJsZSBjaGFyYWN0ZXJzIGluIHRoZSBiZWdpbiBvciBtaWRkbGUgb2YKKyAgICAgICAgICAgIC8vIG51bWJlciwgc3RvcCBmb3JtYXR0aW5nLiAKKyAgICAgICAgICAgIHN0b3BGb3JtYXR0aW5nKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWZ0ZXJUZXh0Q2hhbmdlZChFZGl0YWJsZSBzKSB7CisgICAgICAgIGlmIChtU3RvcEZvcm1hdHRpbmcpIHsKKyAgICAgICAgICAgIC8vIFJlc3RhcnQgdGhlIGZvcm1hdHRpbmcgd2hlbiBhbGwgdGV4dHMgd2VyZSBjbGVhci4KKyAgICAgICAgICAgIG1TdG9wRm9ybWF0dGluZyA9ICEocy5sZW5ndGgoKSA9PSAwKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAobVNlbGZDaGFuZ2UpIHsKKyAgICAgICAgICAgIC8vIElnbm9yZSB0aGUgY2hhbmdlIGNhdXNlZCBieSBzLnJlcGxhY2UoKS4KKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgZm9ybWF0dGVkID0gcmVmb3JtYXQocywgU2VsZWN0aW9uLmdldFNlbGVjdGlvbkVuZChzKSk7CisgICAgICAgIGlmIChmb3JtYXR0ZWQgIT0gbnVsbCkgeworICAgICAgICAgICAgaW50IHJlbWVtYmVyZWRQb3MgPSBtRm9ybWF0dGVyLmdldFJlbWVtYmVyZWRQb3NpdGlvbigpOworICAgICAgICAgICAgbVNlbGZDaGFuZ2UgPSB0cnVlOworICAgICAgICAgICAgcy5yZXBsYWNlKDAsIHMubGVuZ3RoKCksIGZvcm1hdHRlZCwgMCwgZm9ybWF0dGVkLmxlbmd0aCgpKTsKKyAgICAgICAgICAgIC8vIFRoZSB0ZXh0IGNvdWxkIGJlIGNoYW5nZWQgYnkgb3RoZXIgVGV4dFdhdGNoZXIgYWZ0ZXIgd2UgY2hhbmdlZCBpdC4gSWYgd2UgZm91bmQgdGhlCisgICAgICAgICAgICAvLyB0ZXh0IGlzIG5vdCB0aGUgb25lIHdlIHdlcmUgZXhwZWN0aW5nLCBqdXN0IGdpdmUgdXAgY2FsbGluZyBzZXRTZWxlY3Rpb24oKS4KKyAgICAgICAgICAgIGlmIChmb3JtYXR0ZWQuZXF1YWxzKHMudG9TdHJpbmcoKSkpIHsKKyAgICAgICAgICAgICAgICBTZWxlY3Rpb24uc2V0U2VsZWN0aW9uKHMsIHJlbWVtYmVyZWRQb3MpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbVNlbGZDaGFuZ2UgPSBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdlbmVyYXRlIHRoZSBmb3JtYXR0ZWQgbnVtYmVyIGJ5IGlnbm9yaW5nIGFsbCBub24tZGlhbGFibGUgY2hhcnMgYW5kIHN0aWNrIHRoZSBjdXJzb3IgdG8gdGhlCisgICAgICogbmVhcmVzdCBkaWFsYWJsZSBjaGFyIHRvIHRoZSBsZWZ0LiBGb3IgaW5zdGFuY2UsIGlmIHRoZSBudW1iZXIgaXMgICg2NTApIDEyMy00NTY3OCBhbmQgJzQnIGlzCisgICAgICogcmVtb3ZlZCB0aGVuIHRoZSBjdXJzb3Igc2hvdWxkIGJlIGJlaGluZCAnMycgaW5zdGVhZCBvZiAnLScuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgcmVmb3JtYXQoQ2hhclNlcXVlbmNlIHMsIGludCBjdXJzb3IpIHsKKyAgICAgICAgLy8gVGhlIGluZGV4IG9mIGNoYXIgdG8gdGhlIGxlZnR3YXJkIG9mIHRoZSBjdXJzb3IuCisgICAgICAgIGludCBjdXJJbmRleCA9IGN1cnNvciAtIDE7CisgICAgICAgIFN0cmluZyBmb3JtYXR0ZWQgPSBudWxsOworICAgICAgICBtRm9ybWF0dGVyLmNsZWFyKCk7CisgICAgICAgIGNoYXIgbGFzdE5vblNlcGFyYXRvciA9IDA7CisgICAgICAgIGJvb2xlYW4gaGFzQ3Vyc29yID0gZmFsc2U7CisgICAgICAgIGludCBsZW4gPSBzLmxlbmd0aCgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgICAgICAgICBjaGFyIGMgPSBzLmNoYXJBdChpKTsKKyAgICAgICAgICAgIGlmIChQaG9uZU51bWJlclV0aWxzLmlzTm9uU2VwYXJhdG9yKGMpKSB7CisgICAgICAgICAgICAgICAgaWYgKGxhc3ROb25TZXBhcmF0b3IgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBmb3JtYXR0ZWQgPSBnZXRGb3JtYXR0ZWROdW1iZXIobGFzdE5vblNlcGFyYXRvciwgaGFzQ3Vyc29yKTsKKyAgICAgICAgICAgICAgICAgICAgaGFzQ3Vyc29yID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGxhc3ROb25TZXBhcmF0b3IgPSBjOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGkgPT0gY3VySW5kZXgpIHsKKyAgICAgICAgICAgICAgICBoYXNDdXJzb3IgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChsYXN0Tm9uU2VwYXJhdG9yICE9IDApIHsKKyAgICAgICAgICAgIGZvcm1hdHRlZCA9IGdldEZvcm1hdHRlZE51bWJlcihsYXN0Tm9uU2VwYXJhdG9yLCBoYXNDdXJzb3IpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmb3JtYXR0ZWQ7CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0Rm9ybWF0dGVkTnVtYmVyKGNoYXIgbGFzdE5vblNlcGFyYXRvciwgYm9vbGVhbiBoYXNDdXJzb3IpIHsKKyAgICAgICAgcmV0dXJuIGhhc0N1cnNvciA/IG1Gb3JtYXR0ZXIuaW5wdXREaWdpdEFuZFJlbWVtYmVyUG9zaXRpb24obGFzdE5vblNlcGFyYXRvcikKKyAgICAgICAgICAgICAgICA6IG1Gb3JtYXR0ZXIuaW5wdXREaWdpdChsYXN0Tm9uU2VwYXJhdG9yKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc3RvcEZvcm1hdHRpbmcoKSB7CisgICAgICAgIG1TdG9wRm9ybWF0dGluZyA9IHRydWU7CisgICAgICAgIG1Gb3JtYXR0ZXIuY2xlYXIoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gaGFzU2VwYXJhdG9yKGZpbmFsIENoYXJTZXF1ZW5jZSBzLCBmaW5hbCBpbnQgc3RhcnQsIGZpbmFsIGludCBjb3VudCkgeworICAgICAgICBmb3IgKGludCBpID0gc3RhcnQ7IGkgPCBzdGFydCArIGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIGNoYXIgYyA9IHMuY2hhckF0KGkpOworICAgICAgICAgICAgaWYgKCFQaG9uZU51bWJlclV0aWxzLmlzTm9uU2VwYXJhdG9yKGMpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L1Bob25lTnVtYmVyVXRpbHMuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L1Bob25lTnVtYmVyVXRpbHMuamF2YQppbmRleCBmMjIxMmZiLi5lMWI5YjYwIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9hbmRyb2lkL3RlbGVwaG9ueS9QaG9uZU51bWJlclV0aWxzLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvYW5kcm9pZC90ZWxlcGhvbnkvUGhvbmVOdW1iZXJVdGlscy5qYXZhCkBAIC01ODYsNyArNTg2LDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIC8vIEluIHRoZSBVUywgMS02NTAtNTU1LTEyMzQgbXVzdCBiZSBlcXVhbCB0byA2NTAtNTU1LTEyMzQsCi0gICAgICAgICAgICAvLyB3aGlsZSAwOTAtMTIzNC0xMjM0IG11c3Qgbm90IGJlIGVxdWFsdCB0byA5MC0xMjM0LTEyMzQgaW4gSmFwYW4uCisgICAgICAgICAgICAvLyB3aGlsZSAwOTAtMTIzNC0xMjM0IG11c3Qgbm90IGJlIGVxdWFsIHRvIDkwLTEyMzQtMTIzNCBpbiBKYXBhbi4KICAgICAgICAgICAgIC8vIFRoaXMgcmVxdWVzdCBleGlzdHMganVzdCBpbiBVUyAod2l0aCAxIHRydW5rIChOREQpIHByZWZpeCkuCiAgICAgICAgICAgICAvLyBJbiBhZGRpdGlvbiwgIjAxMSAxMSA3MDA1NTU0MTQxIiBtdXN0IG5vdCBlcXVhbCB0byAiKzE3MDA1NTU0MTQxIiwKICAgICAgICAgICAgIC8vIHdoaWxlICIwMTEgMSA3MDA1NTU0MTQxIiBtdXN0IGVxdWFsIHRvICIrMTcwMDU1NTQxNDEiCkBAIC03NDgsMTAgKzc0OCwxMCBAQAogICAgICAgICBpZiAocHJlcGVuZFBsdXMpIHsKICAgICAgICAgICAgIC8vIFRoaXMgaXMgYW4gImludGVybmF0aW9uYWwgbnVtYmVyIiBhbmQgc2hvdWxkIGhhdmUKICAgICAgICAgICAgIC8vIGEgcGx1cyBwcmVwZW5kZWQgdG8gdGhlIGRpYWxpbmcgbnVtYmVyLiBCdXQgdGhlcmUKLSAgICAgICAgICAgIC8vIGNhbiBhbHNvIGJlIEdzbSBNTUkgY29kZXMgYXMgZGVmaW5lZCBpbiBUUyAyMi4wMzAgNi41LjIKKyAgICAgICAgICAgIC8vIGNhbiBhbHNvIGJlIEdTTSBNTUkgY29kZXMgYXMgZGVmaW5lZCBpbiBUUyAyMi4wMzAgNi41LjIKICAgICAgICAgICAgIC8vIHNvIHdlIG5lZWQgdG8gaGFuZGxlIHRob3NlIGFsc28uCiAgICAgICAgICAgICAvLwotICAgICAgICAgICAgLy8gaHR0cDovL3dlYi50ZWxpYS5jb20vfnU0NzkwNDc3Ni9nc21rb2RlLmh0bSBpcyBhCisgICAgICAgICAgICAvLyBodHRwOi8vd2ViLnRlbGlhLmNvbS9+dTQ3OTA0Nzc2L2dzbWtvZGUuaHRtCiAgICAgICAgICAgICAvLyBoYXMgYSBuaWNlIGxpc3Qgb2Ygc29tZSBvZiB0aGVzZSBHU00gY29kZXMuCiAgICAgICAgICAgICAvLwogICAgICAgICAgICAgLy8gRXhhbXBsZXMgYXJlOgpAQCAtODM5LDEwICs4MzksMTAgQEAKIAogICAgICAgICAgICAgLy8gRklYTUUobWtmKSBUUyAyMy4wNDAgOS4xLjIuMyBzYXlzCiAgICAgICAgICAgICAvLyAiaWYgYSBtb2JpbGUgcmVjZWl2ZXMgMTExMSBpbiBhIHBvc2l0aW9uIHByaW9yIHRvCi0gICAgICAgICAgICAvLyB0aGUgbGFzdCBzZW1pLW9jdGV0IHRoZW4gcHJvY2Vzc2luZyBzaGFsbCBjb21tZW5zZSB3aXRoCisgICAgICAgICAgICAvLyB0aGUgbGFzdCBzZW1pLW9jdGV0IHRoZW4gcHJvY2Vzc2luZyBzaGFsbCBjb21tZW5jZSB3aXRoCiAgICAgICAgICAgICAvLyB0aGUgbmV4dCBzZW1pLW9jdGV0IGFuZCB0aGUgaW50ZXJ2ZW5pbmcKICAgICAgICAgICAgIC8vIHNlbWktb2N0ZXQgc2hhbGwgYmUgaWdub3JlZCIKLSAgICAgICAgICAgIC8vIEhvdyBkb2VzIHRoaXMgaml2ZSB3aXRoIDI0LDAwOCAxMC41LjQuNworICAgICAgICAgICAgLy8gSG93IGRvZXMgdGhpcyBqaXZlIHdpdGggMjQuMDA4IDEwLjUuNC43CiAKICAgICAgICAgICAgIGIgPSAoYnl0ZSkoKGJ5dGVzW2ldID4+IDQpICYgMHhmKTsKIApAQCAtOTczLDcgKzk3Myw3IEBACiAgICAgICogQ29udmVydCBhIGRpYWxpbmcgbnVtYmVyIHRvIEJDRCBieXRlIGFycmF5CiAgICAgICoKICAgICAgKiBAcGFyYW0gbnVtYmVyIGRpYWxpbmcgbnVtYmVyIHN0cmluZwotICAgICAqICAgICAgICBpZiB0aGUgZGlhbGluZyBudW1iZXIgc3RhcnRzIHdpdGggJysnLCBzZXQgdG8gaW50ZXJuYXRpb25sIFRPQQorICAgICAqICAgICAgICBpZiB0aGUgZGlhbGluZyBudW1iZXIgc3RhcnRzIHdpdGggJysnLCBzZXQgdG8gaW50ZXJuYXRpb25hbCBUT0EKICAgICAgKiBAcmV0dXJuIEJDRCBieXRlIGFycmF5CiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBieXRlW10KQEAgLTEwNzcsMTAgKzEwNzcsMTAgQEAKICAgICAgKgogICAgICAqIEBwYXJhbSBzb3VyY2UgdGhlIHBob25lIG51bWJlciB0byBmb3JtYXQKICAgICAgKiBAcGFyYW0gZGVmYXVsdEZvcm1hdHRpbmdUeXBlIFRoZSBkZWZhdWx0IGZvcm1hdHRpbmcgcnVsZXMgdG8gYXBwbHkgaWYgdGhlIG51bWJlciBkb2VzCi0gICAgICogbm90IGJlZ2luIHdpdGggKzxjb3VudHJ5X2NvZGU+CisgICAgICogbm90IGJlZ2luIHdpdGggK1tjb3VudHJ5X2NvZGVdCiAgICAgICogQHJldHVybiBUaGUgcGhvbmUgbnVtYmVyIGZvcm1hdHRlZCB3aXRoIHRoZSBnaXZlbiBmb3JtYXR0aW5nIHR5cGUuCiAgICAgICoKLSAgICAgKiBAaGlkZSBUT0RPOlNodW9sZCBiZSB1bmhpZGRlbi4KKyAgICAgKiBAaGlkZSBUT0RPOiBTaG91bGQgYmUgdW5oaWRkZW4uCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZm9ybWF0TnVtYmVyKFN0cmluZyBzb3VyY2UsIGludCBkZWZhdWx0Rm9ybWF0dGluZ1R5cGUpIHsKICAgICAgICAgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlciB0ZXh0ID0gbmV3IFNwYW5uYWJsZVN0cmluZ0J1aWxkZXIoc291cmNlKTsKQEAgLTExMDcsNyArMTEwNyw3IEBACiAgICAgICoKICAgICAgKiBAcGFyYW0gdGV4dCBUaGUgbnVtYmVyIHRvIGJlIGZvcm1hdHRlZCwgd2lsbCBiZSBtb2RpZmllZCB3aXRoIHRoZSBmb3JtYXR0aW5nCiAgICAgICogQHBhcmFtIGRlZmF1bHRGb3JtYXR0aW5nVHlwZSBUaGUgZGVmYXVsdCBmb3JtYXR0aW5nIHJ1bGVzIHRvIGFwcGx5IGlmIHRoZSBudW1iZXIgZG9lcwotICAgICAqIG5vdCBiZWdpbiB3aXRoICs8Y291bnRyeV9jb2RlPgorICAgICAqIG5vdCBiZWdpbiB3aXRoICtbY291bnRyeV9jb2RlXQogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBmb3JtYXROdW1iZXIoRWRpdGFibGUgdGV4dCwgaW50IGRlZmF1bHRGb3JtYXR0aW5nVHlwZSkgewogICAgICAgICBpbnQgZm9ybWF0VHlwZSA9IGRlZmF1bHRGb3JtYXR0aW5nVHlwZTsKQEAgLTE1MTUsNyArMTUxNSw3IEBACiAgICAgICogQGhpZGUKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIFN0cmluZwotICAgIGNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZUJ5TnVtYmVyRm9ybWF0KFN0cmluZyBkaWFsU3RyLGludCBjdXJyRm9ybWF0LGludCBkZWZhdWx0Rm9ybXQpIHsKKyAgICBjZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGVCeU51bWJlckZvcm1hdChTdHJpbmcgZGlhbFN0cixpbnQgY3VyckZvcm1hdCxpbnQgZGVmYXVsdEZvcm1hdCkgewogICAgICAgICBTdHJpbmcgcmV0U3RyID0gZGlhbFN0cjsKIAogICAgICAgICAvLyBDaGVja3MgaWYgdGhlIHBsdXMgc2lnbiBjaGFyYWN0ZXIgaXMgaW4gdGhlIHBhc3NlZC1pbiBkaWFsIHN0cmluZwpAQCAtMTUyMyw3ICsxNTIzLDcgQEAKICAgICAgICAgICAgIGRpYWxTdHIubGFzdEluZGV4T2YoUExVU19TSUdOX1NUUklORykgIT0gLTEpIHsKICAgICAgICAgICAgIC8vIEZvcm1hdCB0aGUgc3RyaW5nIGJhc2VkIG9uIHRoZSBydWxlcyBmb3IgdGhlIGNvdW50cnkgdGhlIG51bWJlciBpcyBmcm9tLAogICAgICAgICAgICAgLy8gYW5kIHRoZSBjdXJyZW50IGNvdW50cnkgdGhlIHBob25lIGlzIGNhbXBlZCBvbi4KLSAgICAgICAgICAgIGlmICgoY3VyckZvcm1hdCA9PSBkZWZhdWx0Rm9ybXQpICYmIChjdXJyRm9ybWF0ID09IEZPUk1BVF9OQU5QKSkgeworICAgICAgICAgICAgaWYgKChjdXJyRm9ybWF0ID09IGRlZmF1bHRGb3JtYXQpICYmIChjdXJyRm9ybWF0ID09IEZPUk1BVF9OQU5QKSkgewogICAgICAgICAgICAgICAgIC8vIEhhbmRsZSBjYXNlIHdoZXJlIGRlZmF1bHQgYW5kIGN1cnJlbnQgdGVsZXBob25lIG51bWJlcmluZyBwbGFucyBhcmUgTkFOUC4KICAgICAgICAgICAgICAgICBTdHJpbmcgcG9zdERpYWxTdHIgPSBudWxsOwogICAgICAgICAgICAgICAgIFN0cmluZyB0ZW1wRGlhbFN0ciA9IGRpYWxTdHI7CkBAIC0xNzAxLDcgKzE3MDEsNyBAQAogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogCi0gICAgLy8gVGhpcyBmdW5jdGlvbiBhcHBlbmRzIHRoZSBub24tZGlhYmxhYmxlIFAvVyBjaGFyYWN0ZXIgdG8gdGhlIG9yaWdpbmFsCisgICAgLy8gVGhpcyBmdW5jdGlvbiBhcHBlbmRzIHRoZSBub24tZGlhbGFibGUgUC9XIGNoYXJhY3RlciB0byB0aGUgb3JpZ2luYWwKICAgICAvLyBkaWFsIHN0cmluZyBiYXNlZCBvbiB0aGUgZGlhbGFibGUgaW5kZXggcGFzc2VkIGluCiAgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nCiAgICAgYXBwZW5kUHdDaGFyQmFja1RvT3JpZ0RpYWxTdHIoaW50IGRpYWxhYmxlSW5kZXgsU3RyaW5nIG9yaWdTdHIsIFN0cmluZyBkaWFsU3RyKSB7CkBAIC0xNzIxLDcgKzE3MjEsNyBAQAogICAgICAgICByZXR1cm4gcmV0U3RyOwogICAgIH0KIAotICAgIC8vPT09PT0gQmVnaW5pbmcgb2YgdXRpbGl0eSBtZXRob2RzIHVzZWQgaW4gY29tcGFyZUxvb3NlbHkoKSA9PT09PQorICAgIC8vPT09PT0gQmVnaW5uaW5nIG9mIHV0aWxpdHkgbWV0aG9kcyB1c2VkIGluIGNvbXBhcmVMb29zZWx5KCkgPT09PT0KIAogICAgIC8qKgogICAgICAqIFBob25lIG51bWJlcnMgYXJlIHN0b3JlZCBpbiAibG9va3VwIiBmb3JtIGluIHRoZSBkYXRhYmFzZQpAQCAtMTg0MywxMiArMTg0MywxMiBAQAogCiAgICAgLy89PT09PSBFbmQgb2YgdXRpbGl0eSBtZXRob2RzIHVzZWQgb25seSBpbiBjb21wYXJlTG9vc2VseSgpID09PT09CiAKLSAgICAvLz09PT09IEJlZ2dpbmluZyBvZiB1dGlsaXR5IG1ldGhvZHMgdXNlZCBvbmx5IGluIGNvbXBhcmVTdHJpY3RseSgpID09PT0KKyAgICAvLz09PT09IEJlZ2lubmluZyBvZiB1dGlsaXR5IG1ldGhvZHMgdXNlZCBvbmx5IGluIGNvbXBhcmVTdHJpY3RseSgpID09PT0KIAogICAgIC8qCiAgICAgICogSWYgdHJ1ZSwgdGhlIG51bWJlciBpcyBjb3VudHJ5IGNhbGxpbmcgY29kZS4KICAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIENPVU5UTFlfQ0FMTElOR19DQUxMW10gPSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBDT1VOVFJZX0NBTExJTkdfQ0FMTFtdID0gewogICAgICAgICB0cnVlLCB0cnVlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIHRydWUsIGZhbHNlLCBmYWxzZSwKICAgICAgICAgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsCiAgICAgICAgIHRydWUsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIHRydWUsIHRydWUsIGZhbHNlLApAQCAtMTg2MCwxOCArMTg2MCwxOCBAQAogICAgICAgICBmYWxzZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgZmFsc2UsIHRydWUsIGZhbHNlLCBmYWxzZSwgdHJ1ZSwKICAgICAgICAgdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgZmFsc2UsIGZhbHNlLCB0cnVlLCBmYWxzZSwKICAgICB9OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDQ0NfTEVOR1RIID0gQ09VTlRMWV9DQUxMSU5HX0NBTEwubGVuZ3RoOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDQ0NfTEVOR1RIID0gQ09VTlRSWV9DQUxMSU5HX0NBTEwubGVuZ3RoOwogCiAgICAgLyoqCiAgICAgICogQHJldHVybiB0cnVlIHdoZW4gaW5wdXQgaXMgdmFsaWQgQ291bnRyeSBDYWxsaW5nIENvZGUuCiAgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0NvdW50cnlDYWxsaW5nQ29kZShpbnQgY291bnRyeUNhbGxpbmdDb2RlQ2FuZGlkYXRlKSB7CiAgICAgICAgIHJldHVybiBjb3VudHJ5Q2FsbGluZ0NvZGVDYW5kaWRhdGUgPiAwICYmIGNvdW50cnlDYWxsaW5nQ29kZUNhbmRpZGF0ZSA8IENDQ19MRU5HVEggJiYKLSAgICAgICAgICAgICAgICBDT1VOVExZX0NBTExJTkdfQ0FMTFtjb3VudHJ5Q2FsbGluZ0NvZGVDYW5kaWRhdGVdOworICAgICAgICAgICAgICAgIENPVU5UUllfQ0FMTElOR19DQUxMW2NvdW50cnlDYWxsaW5nQ29kZUNhbmRpZGF0ZV07CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBpbnRlcmdlciBjb3JyZXNwb25kaW5nIHRvIHRoZSBpbnB1dCBpZiBpbnB1dCAiY2giIGlzCisgICAgICogUmV0dXJucyBpbnRlZ2VyIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGlucHV0IGlmIGlucHV0ICJjaCIgaXMKICAgICAgKiBJU08tTEFUSU4gY2hhcmFjdGVycyAwLTkuCiAgICAgICogUmV0dXJucyAtMSBvdGhlcndpc2UKICAgICAgKi8KQEAgLTIwMDYsNyArMjAwNiw3IEBACiAKICAgICAvKioKICAgICAgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgcHJlZml4IG9mICJzdHIiIGlzICJpZ25vcmFibGUiLiBIZXJlLCAiaWdub3JhYmxlIiBtZWFucwotICAgICAqIHRoYXQgInN0ciIgaGFzIG9ubHkgb25lIGRpZ2l0IGFuZCBzZXBhcmF0ZXIgY2hhcmFjdGVycy4gVGhlIG9uZSBkaWdpdCBpcworICAgICAqIHRoYXQgInN0ciIgaGFzIG9ubHkgb25lIGRpZ2l0IGFuZCBzZXBhcmF0b3IgY2hhcmFjdGVycy4gVGhlIG9uZSBkaWdpdCBpcwogICAgICAqIGFzc3VtZWQgdG8gYmUgdHJ1bmsgcHJlZml4LgogICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gY2hlY2tQcmVmaXhJc0lnbm9yYWJsZShmaW5hbCBTdHJpbmcgc3RyLApkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvYW5kcm9pZC90ZWxlcGhvbnkvUGhvbmVTdGF0ZUxpc3RlbmVyLmphdmEgYi90ZWxlcGhvbnkvamF2YS9hbmRyb2lkL3RlbGVwaG9ueS9QaG9uZVN0YXRlTGlzdGVuZXIuamF2YQppbmRleCA4MzBhZjQ3Li4zOGY0NGQ4IDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9hbmRyb2lkL3RlbGVwaG9ueS9QaG9uZVN0YXRlTGlzdGVuZXIuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9hbmRyb2lkL3RlbGVwaG9ueS9QaG9uZVN0YXRlTGlzdGVuZXIuamF2YQpAQCAtMjUsNiArMjUsNyBAQAogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiAKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuSVBob25lU3RhdGVMaXN0ZW5lcjsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuUGhvbmU7CiAKIC8qKgogICogQSBsaXN0ZW5lciBjbGFzcyBmb3IgbW9uaXRvcmluZyBjaGFuZ2VzIGluIHNwZWNpZmljIHRlbGVwaG9ueSBzdGF0ZXMKQEAgLTI4NCw3ICsyODUsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgcHVibGljIHZvaWQgb25EYXRhQ29ubmVjdGlvblN0YXRlQ2hhbmdlZChpbnQgc3RhdGUsIGludCBuZXR3b3JrVHlwZSkgewotICAgICAgICAgICAgTWVzc2FnZS5vYnRhaW4obUhhbmRsZXIsIExJU1RFTl9EQVRBX0NPTk5FQ1RJT05fU1RBVEUsIHN0YXRlLCBuZXR3b3JrVHlwZSwgbnVsbCkuCisgICAgICAgICAgICBNZXNzYWdlLm9idGFpbihtSGFuZGxlciwgTElTVEVOX0RBVEFfQ09OTkVDVElPTl9TVEFURSwgc3RhdGUsIG5ldHdvcmtUeXBlKS4KICAgICAgICAgICAgICAgICAgICAgc2VuZFRvVGFyZ2V0KCk7CiAgICAgICAgIH0KIApkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvYW5kcm9pZC90ZWxlcGhvbnkvU21zTWFuYWdlci5qYXZhIGIvdGVsZXBob255L2phdmEvYW5kcm9pZC90ZWxlcGhvbnkvU21zTWFuYWdlci5qYXZhCmluZGV4IGY1ZTk3NTEuLjk1MzY5NmIgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L1Ntc01hbmFnZXIuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9hbmRyb2lkL3RlbGVwaG9ueS9TbXNNYW5hZ2VyLmphdmEKQEAgLTIxLDcgKzIxLDYgQEAKIGltcG9ydCBhbmRyb2lkLm9zLlNlcnZpY2VNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CiAKLWltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuRW5jb2RlRXhjZXB0aW9uOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5JU21zOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5JY2NDb25zdGFudHM7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlNtc1Jhd0RhdGE7CkBAIC0zMyw3ICszMiw3IEBACiAvKgogICogVE9ETyhjb2RlIHJldmlldyk6IEN1cmlvdXMgcXVlc3Rpb24uLi4gV2h5IGFyZSBhIGxvdCBvZiB0aGVzZQogICogbWV0aG9kcyBub3QgZGVjbGFyZWQgYXMgc3RhdGljLCBzaW5jZSB0aGV5IGRvIG5vdCBzZWVtIHRvIHJlcXVpcmUKLSAqIGFueSBsb2NhbCBvYmplY3Qgc3RhdGU/ICBBc3N1bWVkbHkgdGhpcyBjYW5ub3QgYmUgY2hhbmdlZCB3aXRob3V0CisgKiBhbnkgbG9jYWwgb2JqZWN0IHN0YXRlPyAgUHJlc3VtYWJseSB0aGlzIGNhbm5vdCBiZSBjaGFuZ2VkIHdpdGhvdXQKICAqIGludGVyZmVyaW5nIHdpdGggdGhlIEFQSS4uLgogICovCiAKQEAgLTQyLDcgKzQxLDggQEAKICAqIEdldCB0aGlzIG9iamVjdCBieSBjYWxsaW5nIHRoZSBzdGF0aWMgbWV0aG9kIFNtc01hbmFnZXIuZ2V0RGVmYXVsdCgpLgogICovCiBwdWJsaWMgZmluYWwgY2xhc3MgU21zTWFuYWdlciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgU21zTWFuYWdlciBzSW5zdGFuY2U7CisgICAgLyoqIFNpbmdsZXRvbiBvYmplY3QgY29uc3RydWN0ZWQgZHVyaW5nIGNsYXNzIGluaXRpYWxpemF0aW9uLiAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFNtc01hbmFnZXIgc0luc3RhbmNlID0gbmV3IFNtc01hbmFnZXIoKTsKIAogICAgIC8qKgogICAgICAqIFNlbmQgYSB0ZXh0IGJhc2VkIFNNUy4KQEAgLTUyLDggKzUyLDggQEAKICAgICAgKiAgdGhlIGN1cnJlbnQgZGVmYXVsdCBTTVNDCiAgICAgICogQHBhcmFtIHRleHQgdGhlIGJvZHkgb2YgdGhlIG1lc3NhZ2UgdG8gc2VuZAogICAgICAqIEBwYXJhbSBzZW50SW50ZW50IGlmIG5vdCBOVUxMIHRoaXMgPGNvZGU+UGVuZGluZ0ludGVudDwvY29kZT4gaXMKLSAgICAgKiAgYnJvYWRjYXN0IHdoZW4gdGhlIG1lc3NhZ2UgaXMgc3VjZXNzZnVsbHkgc2VudCwgb3IgZmFpbGVkLgotICAgICAqICBUaGUgcmVzdWx0IGNvZGUgd2lsbCBiZSA8Y29kZT5BY3Rpdml0eS5SRVNVTFRfT0s8Y29kZT4gZm9yIHN1Y2Nlc3MsCisgICAgICogIGJyb2FkY2FzdCB3aGVuIHRoZSBtZXNzYWdlIGlzIHN1Y2Nlc3NmdWxseSBzZW50LCBvciBmYWlsZWQuCisgICAgICogIFRoZSByZXN1bHQgY29kZSB3aWxsIGJlIDxjb2RlPkFjdGl2aXR5LlJFU1VMVF9PSzwvY29kZT4gZm9yIHN1Y2Nlc3MsCiAgICAgICogIG9yIG9uZSBvZiB0aGVzZSBlcnJvcnM6PGJyPgogICAgICAqICA8Y29kZT5SRVNVTFRfRVJST1JfR0VORVJJQ19GQUlMVVJFPC9jb2RlPjxicj4KICAgICAgKiAgPGNvZGU+UkVTVUxUX0VSUk9SX1JBRElPX09GRjwvY29kZT48YnI+CkBAIC0xMTYsNyArMTE2LDcgQEAKICAgICAgKiBAcGFyYW0gc2VudEludGVudHMgaWYgbm90IG51bGwsIGFuIDxjb2RlPkFycmF5TGlzdDwvY29kZT4gb2YKICAgICAgKiAgIDxjb2RlPlBlbmRpbmdJbnRlbnQ8L2NvZGU+cyAob25lIGZvciBlYWNoIG1lc3NhZ2UgcGFydCkgdGhhdCBpcwogICAgICAqICAgYnJvYWRjYXN0IHdoZW4gdGhlIGNvcnJlc3BvbmRpbmcgbWVzc2FnZSBwYXJ0IGhhcyBiZWVuIHNlbnQuCi0gICAgICogICBUaGUgcmVzdWx0IGNvZGUgd2lsbCBiZSA8Y29kZT5BY3Rpdml0eS5SRVNVTFRfT0s8Y29kZT4gZm9yIHN1Y2Nlc3MsCisgICAgICogICBUaGUgcmVzdWx0IGNvZGUgd2lsbCBiZSA8Y29kZT5BY3Rpdml0eS5SRVNVTFRfT0s8L2NvZGU+IGZvciBzdWNjZXNzLAogICAgICAqICAgb3Igb25lIG9mIHRoZXNlIGVycm9yczo8YnI+CiAgICAgICogICA8Y29kZT5SRVNVTFRfRVJST1JfR0VORVJJQ19GQUlMVVJFPC9jb2RlPjxicj4KICAgICAgKiAgIDxjb2RlPlJFU1VMVF9FUlJPUl9SQURJT19PRkY8L2NvZGU+PGJyPgpAQCAtMTI1LDcgKzEyNSw3IEBACiAgICAgICogICB0aGUgZXh0cmEgImVycm9yQ29kZSIgY29udGFpbmluZyBhIHJhZGlvIHRlY2hub2xvZ3kgc3BlY2lmaWMgdmFsdWUsCiAgICAgICogICBnZW5lcmFsbHkgb25seSB1c2VmdWwgZm9yIHRyb3VibGVzaG9vdGluZy48YnI+CiAgICAgICogICBUaGUgcGVyLWFwcGxpY2F0aW9uIGJhc2VkIFNNUyBjb250cm9sIGNoZWNrcyBzZW50SW50ZW50LiBJZiBzZW50SW50ZW50Ci0gICAgICogICBpcyBOVUxMIHRoZSBjYWxsZXIgd2lsbCBiZSBjaGVja2VkIGFnYWluc3QgYWxsIHVua25vd24gYXBwbGljYWl0b25zLAorICAgICAqICAgaXMgTlVMTCB0aGUgY2FsbGVyIHdpbGwgYmUgY2hlY2tlZCBhZ2FpbnN0IGFsbCB1bmtub3duIGFwcGxpY2F0aW9ucywKICAgICAgKiAgIHdoaWNoIGNhdXNlIHNtYWxsZXIgbnVtYmVyIG9mIFNNUyB0byBiZSBzZW50IGluIGNoZWNraW5nIHBlcmlvZC4KICAgICAgKiBAcGFyYW0gZGVsaXZlcnlJbnRlbnRzIGlmIG5vdCBudWxsLCBhbiA8Y29kZT5BcnJheUxpc3Q8L2NvZGU+IG9mCiAgICAgICogICA8Y29kZT5QZW5kaW5nSW50ZW50PC9jb2RlPnMgKG9uZSBmb3IgZWFjaCBtZXNzYWdlIHBhcnQpIHRoYXQgaXMKQEAgLTE3OCw4ICsxNzgsOCBAQAogICAgICAqIEBwYXJhbSBkZXN0aW5hdGlvblBvcnQgdGhlIHBvcnQgdG8gZGVsaXZlciB0aGUgbWVzc2FnZSB0bwogICAgICAqIEBwYXJhbSBkYXRhIHRoZSBib2R5IG9mIHRoZSBtZXNzYWdlIHRvIHNlbmQKICAgICAgKiBAcGFyYW0gc2VudEludGVudCBpZiBub3QgTlVMTCB0aGlzIDxjb2RlPlBlbmRpbmdJbnRlbnQ8L2NvZGU+IGlzCi0gICAgICogIGJyb2FkY2FzdCB3aGVuIHRoZSBtZXNzYWdlIGlzIHN1Y2Vzc2Z1bGx5IHNlbnQsIG9yIGZhaWxlZC4KLSAgICAgKiAgVGhlIHJlc3VsdCBjb2RlIHdpbGwgYmUgPGNvZGU+QWN0aXZpdHkuUkVTVUxUX09LPGNvZGU+IGZvciBzdWNjZXNzLAorICAgICAqICBicm9hZGNhc3Qgd2hlbiB0aGUgbWVzc2FnZSBpcyBzdWNjZXNzZnVsbHkgc2VudCwgb3IgZmFpbGVkLgorICAgICAqICBUaGUgcmVzdWx0IGNvZGUgd2lsbCBiZSA8Y29kZT5BY3Rpdml0eS5SRVNVTFRfT0s8L2NvZGU+IGZvciBzdWNjZXNzLAogICAgICAqICBvciBvbmUgb2YgdGhlc2UgZXJyb3JzOjxicj4KICAgICAgKiAgPGNvZGU+UkVTVUxUX0VSUk9SX0dFTkVSSUNfRkFJTFVSRTwvY29kZT48YnI+CiAgICAgICogIDxjb2RlPlJFU1VMVF9FUlJPUl9SQURJT19PRkY8L2NvZGU+PGJyPgpAQCAtMTg4LDcgKzE4OCw3IEBACiAgICAgICogIHRoZSBleHRyYSAiZXJyb3JDb2RlIiBjb250YWluaW5nIGEgcmFkaW8gdGVjaG5vbG9neSBzcGVjaWZpYyB2YWx1ZSwKICAgICAgKiAgZ2VuZXJhbGx5IG9ubHkgdXNlZnVsIGZvciB0cm91Ymxlc2hvb3RpbmcuPGJyPgogICAgICAqICBUaGUgcGVyLWFwcGxpY2F0aW9uIGJhc2VkIFNNUyBjb250cm9sIGNoZWNrcyBzZW50SW50ZW50LiBJZiBzZW50SW50ZW50Ci0gICAgICogIGlzIE5VTEwgdGhlIGNhbGxlciB3aWxsIGJlIGNoZWNrZWQgYWdhaW5zdCBhbGwgdW5rbm93biBhcHBsaWNhaXRvbnMsCisgICAgICogIGlzIE5VTEwgdGhlIGNhbGxlciB3aWxsIGJlIGNoZWNrZWQgYWdhaW5zdCBhbGwgdW5rbm93biBhcHBsaWNhdGlvbnMsCiAgICAgICogIHdoaWNoIGNhdXNlIHNtYWxsZXIgbnVtYmVyIG9mIFNNUyB0byBiZSBzZW50IGluIGNoZWNraW5nIHBlcmlvZC4KICAgICAgKiBAcGFyYW0gZGVsaXZlcnlJbnRlbnQgaWYgbm90IE5VTEwgdGhpcyA8Y29kZT5QZW5kaW5nSW50ZW50PC9jb2RlPiBpcwogICAgICAqICBicm9hZGNhc3Qgd2hlbiB0aGUgbWVzc2FnZSBpcyBkZWxpdmVyZWQgdG8gdGhlIHJlY2lwaWVudC4gIFRoZQpAQCAtMjI0LDkgKzIyNCw2IEBACiAgICAgICogQHJldHVybiB0aGUgZGVmYXVsdCBpbnN0YW5jZSBvZiB0aGUgU21zTWFuYWdlcgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgU21zTWFuYWdlciBnZXREZWZhdWx0KCkgewotICAgICAgICBpZiAoc0luc3RhbmNlID09IG51bGwpIHsKLSAgICAgICAgICAgIHNJbnN0YW5jZSA9IG5ldyBTbXNNYW5hZ2VyKCk7Ci0gICAgICAgIH0KICAgICAgICAgcmV0dXJuIHNJbnN0YW5jZTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L1Ntc01lc3NhZ2UuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L1Ntc01lc3NhZ2UuamF2YQppbmRleCBhMjg0ZWE1Li5kODk5NDMwIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9hbmRyb2lkL3RlbGVwaG9ueS9TbXNNZXNzYWdlLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvYW5kcm9pZC90ZWxlcGhvbnkvU21zTWVzc2FnZS5qYXZhCkBAIC0yMCw3ICsyMCw2IEBACiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIAogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5Hc21BbHBoYWJldDsKLWltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuRW5jb2RlRXhjZXB0aW9uOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5TbXNIZWFkZXI7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlNtc01lc3NhZ2VCYXNlOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5TbXNNZXNzYWdlQmFzZS5TdWJtaXRQZHVCYXNlOwpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0NhbGxNYW5hZ2VyLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvQ2FsbE1hbmFnZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZWJmNjhhCi0tLSAvZGV2L251bGwKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0NhbGxNYW5hZ2VyLmphdmEKQEAgLTAsMCArMSw4MjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueTsKKworCisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLm9zLkFzeW5jUmVzdWx0OworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CitpbXBvcnQgYW5kcm9pZC5vcy5SZWdpc3RyYW50TGlzdDsKK2ltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5QaG9uZVN0YXRlTGlzdGVuZXI7CisKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogQGhpZGUKKyAqCisgKiBDYWxsTWFuYWdlciBjbGFzcyBwcm92aWRlcyBhbiBhYnN0cmFjdCBsYXllciBmb3IgUGhvbmVBcHAgdG8gYWNjZXNzCisgKiBhbmQgY29udHJvbCBjYWxscy4gSXQgaW1wbGVtZW50cyBQaG9uZSBpbnRlcmZhY2UuCisgKgorICogQ2FsbE1hbmFnZXIgcHJvdmlkZXMgY2FsbCBhbmQgY29ubmVjdGlvbiBjb250cm9sIGFzIHdlbGwgYXMKKyAqIGNoYW5uZWwgY2FwYWJpbGl0eS4KKyAqCisgKiBUaGVyZSBhcmUgdGhyZWUgY2F0ZWdvcmllcyBvZiBBUElzIENhbGxNYW5hZ2VyIHByb3ZpZGVkCisgKgorICogIDEuIENhbGwgY29udHJvbCBhbmQgb3BlcmF0aW9uLCBzdWNoIGFzIGRpYWwoKSBhbmQgaGFuZ3VwKCkKKyAqICAyLiBDaGFubmVsIGNhcGFiaWxpdGllcywgc3VjaCBhcyBDYW5Db25mZXJlbmNlKCkKKyAqICAzLiBSZWdpc3RlciBub3RpZmljYXRpb24KKyAqCisgKgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgQ2FsbE1hbmFnZXIgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVWRU5UX0RJU0NPTk5FQ1QgPSAxMDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVWRU5UX0NBTExfU1RBVEVfQ0hBTkdFRCA9IDEwMTsKKworCisgICAgLy8gU2luZ2xldG9uIGluc3RhbmNlCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2FsbE1hbmFnZXIgSU5TVEFOQ0UgPSBuZXcgQ2FsbE1hbmFnZXIoKTsKKworICAgIC8vIGxpc3Qgb2YgcmVnaXN0ZXJlZCBwaG9uZXMKKyAgICBwcml2YXRlIGZpbmFsIEFycmF5TGlzdDxQaG9uZT4gbVBob25lczsKKworICAgIC8vIGxpc3Qgb2Ygc3VwcG9ydGVkIHJpbmdpbmcgY2FsbHMKKyAgICBwcml2YXRlIGZpbmFsIEFycmF5TGlzdDxDYWxsPiBtUmluZ2luZ0NhbGxzOworCisgICAgLy8gbGlzdCBvZiBzdXBwb3J0ZWQgYmFja2dyb3VuZCBjYWxscworICAgIHByaXZhdGUgZmluYWwgQXJyYXlMaXN0PENhbGw+IG1CYWNrZ3JvdW5kQ2FsbHM7CisKKyAgICAvLyBsaXN0IG9mIHN1cHBvcnRlZCBmb3JlZ3JvdW5kIGNhbGxzCisgICAgcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Q8Q2FsbD4gbUZvcmVncm91bmRDYWxsczsKKworICAgIC8vIHN0YXRlIHJlZ2lzdHJhbnRzCisgICAgcHJvdGVjdGVkIGZpbmFsIFJlZ2lzdHJhbnRMaXN0IG1QcmVjaXNlQ2FsbFN0YXRlUmVnaXN0cmFudHMKKyAgICA9IG5ldyBSZWdpc3RyYW50TGlzdCgpOworCisgICAgcHJvdGVjdGVkIGZpbmFsIFJlZ2lzdHJhbnRMaXN0IG1OZXdSaW5naW5nQ29ubmVjdGlvblJlZ2lzdHJhbnRzCisgICAgPSBuZXcgUmVnaXN0cmFudExpc3QoKTsKKworICAgIHByb3RlY3RlZCBmaW5hbCBSZWdpc3RyYW50TGlzdCBtSW5jb21pbmdSaW5nUmVnaXN0cmFudHMKKyAgICA9IG5ldyBSZWdpc3RyYW50TGlzdCgpOworCisgICAgcHJvdGVjdGVkIGZpbmFsIFJlZ2lzdHJhbnRMaXN0IG1EaXNjb25uZWN0UmVnaXN0cmFudHMKKyAgICA9IG5ldyBSZWdpc3RyYW50TGlzdCgpOworCisgICAgcHJvdGVjdGVkIGZpbmFsIFJlZ2lzdHJhbnRMaXN0IG1TZXJ2aWNlU3RhdGVSZWdpc3RyYW50cworICAgID0gbmV3IFJlZ2lzdHJhbnRMaXN0KCk7CisKKyAgICBwcm90ZWN0ZWQgZmluYWwgUmVnaXN0cmFudExpc3QgbU1taUNvbXBsZXRlUmVnaXN0cmFudHMKKyAgICA9IG5ldyBSZWdpc3RyYW50TGlzdCgpOworCisgICAgcHJvdGVjdGVkIGZpbmFsIFJlZ2lzdHJhbnRMaXN0IG1NbWlSZWdpc3RyYW50cworICAgID0gbmV3IFJlZ2lzdHJhbnRMaXN0KCk7CisKKyAgICBwcm90ZWN0ZWQgZmluYWwgUmVnaXN0cmFudExpc3QgbVVua25vd25Db25uZWN0aW9uUmVnaXN0cmFudHMKKyAgICA9IG5ldyBSZWdpc3RyYW50TGlzdCgpOworCisgICAgcHJvdGVjdGVkIGZpbmFsIFJlZ2lzdHJhbnRMaXN0IG1TdXBwU2VydmljZUZhaWxlZFJlZ2lzdHJhbnRzCisgICAgPSBuZXcgUmVnaXN0cmFudExpc3QoKTsKKworICAgIHByaXZhdGUgQ2FsbE1hbmFnZXIoKSB7CisgICAgICAgIG1QaG9uZXMgPSBuZXcgQXJyYXlMaXN0PFBob25lPigpOworICAgICAgICBtUmluZ2luZ0NhbGxzID0gbmV3IEFycmF5TGlzdDxDYWxsPigpOworICAgICAgICBtQmFja2dyb3VuZENhbGxzID0gbmV3IEFycmF5TGlzdDxDYWxsPigpOworICAgICAgICBtRm9yZWdyb3VuZENhbGxzID0gbmV3IEFycmF5TGlzdDxDYWxsPigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGdldCBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgQ2FsbE1hbmFnZXIKKyAgICAgKiBAcmV0dXJuIENhbGxNYW5hZ2VyCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBDYWxsTWFuYWdlciBnZXRJbnN0YW5jZSgpIHsKKyAgICAgICAgcmV0dXJuIElOU1RBTkNFOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlZ2lzdGVyIHBob25lIHRvIENhbGxNYW5hZ2VyCisgICAgICogQHBhcmFtIHBob25lCisgICAgICogQHJldHVybgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHJlZ2lzdGVyUGhvbmUoUGhvbmUgcGhvbmUpIHsKKyAgICAgICAgaWYgKHBob25lICE9IG51bGwgJiYgIW1QaG9uZXMuY29udGFpbnMocGhvbmUpKSB7CisgICAgICAgICAgICBtUGhvbmVzLmFkZChwaG9uZSk7CisgICAgICAgICAgICBtUmluZ2luZ0NhbGxzLmFkZChwaG9uZS5nZXRSaW5naW5nQ2FsbCgpKTsKKyAgICAgICAgICAgIG1CYWNrZ3JvdW5kQ2FsbHMuYWRkKHBob25lLmdldEJhY2tncm91bmRDYWxsKCkpOworICAgICAgICAgICAgbUZvcmVncm91bmRDYWxscy5hZGQocGhvbmUuZ2V0Rm9yZWdyb3VuZENhbGwoKSk7CisgICAgICAgICAgICByZWdpc3RlckZvclBob25lU3RhdGVzKHBob25lKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB1bnJlZ2lzdGVyIHBob25lIGZyb20gQ2FsbE1hbmFnZXIKKyAgICAgKiBAcGFyYW0gcGhvbmUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB1bnJlZ2lzdGVyUGhvbmUoUGhvbmUgcGhvbmUpIHsKKyAgICAgICAgaWYgKHBob25lICE9IG51bGwgJiYgIW1QaG9uZXMuY29udGFpbnMocGhvbmUpKSB7CisgICAgICAgICAgICBtUGhvbmVzLnJlbW92ZShwaG9uZSk7CisgICAgICAgICAgICBtUmluZ2luZ0NhbGxzLnJlbW92ZShwaG9uZS5nZXRSaW5naW5nQ2FsbCgpKTsKKyAgICAgICAgICAgIG1CYWNrZ3JvdW5kQ2FsbHMucmVtb3ZlKHBob25lLmdldEJhY2tncm91bmRDYWxsKCkpOworICAgICAgICAgICAgbUZvcmVncm91bmRDYWxscy5yZW1vdmUocGhvbmUuZ2V0Rm9yZWdyb3VuZENhbGwoKSk7CisgICAgICAgICAgICB1bnJlZ2lzdGVyRm9yUGhvbmVTdGF0ZXMocGhvbmUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHJlZ2lzdGVyRm9yUGhvbmVTdGF0ZXMoUGhvbmUgcGhvbmUpIHsKKyAgICAgICAgcGhvbmUucmVnaXN0ZXJGb3JQcmVjaXNlQ2FsbFN0YXRlQ2hhbmdlZChtSGFuZGxlciwgRVZFTlRfQ0FMTF9TVEFURV9DSEFOR0VELCBudWxsKTsKKyAgICAgICAgcGhvbmUucmVnaXN0ZXJGb3JEaXNjb25uZWN0KG1IYW5kbGVyLCBFVkVOVF9ESVNDT05ORUNULCBudWxsKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdW5yZWdpc3RlckZvclBob25lU3RhdGVzKFBob25lIHBob25lKSB7CisgICAgICAgIHBob25lLnVucmVnaXN0ZXJGb3JQcmVjaXNlQ2FsbFN0YXRlQ2hhbmdlZChtSGFuZGxlcik7CisgICAgICAgIHBob25lLnVucmVnaXN0ZXJGb3JEaXNjb25uZWN0KG1IYW5kbGVyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBbnN3ZXJzIGEgcmluZ2luZyBvciB3YWl0aW5nIGNhbGwuCisgICAgICoKKyAgICAgKiBBY3RpdmUgY2FsbCwgaWYgYW55LCBnbyBvbiBob2xkLgorICAgICAqIElmIGFjdGl2ZSBjYWxsIGNhbid0IGJlIGhlbGQsIGkuZS4sIGEgYmFja2dyb3VuZCBjYWxsIG9mIHRoZSBzYW1lIGNoYW5uZWwgZXhpc3RzLAorICAgICAqIHRoZSBhY3RpdmUgY2FsbCB3aWxsIGJlIGhhbmcgdXAuCisgICAgICoKKyAgICAgKiBBbnN3ZXJpbmcgb2NjdXJzIGFzeW5jaHJvbm91c2x5LCBhbmQgZmluYWwgbm90aWZpY2F0aW9uIG9jY3VycyB2aWEKKyAgICAgKiB7QGxpbmsgI3JlZ2lzdGVyRm9yUHJlY2lzZUNhbGxTdGF0ZUNoYW5nZWQoYW5kcm9pZC5vcy5IYW5kbGVyLCBpbnQsCisgICAgICogamF2YS5sYW5nLk9iamVjdCkgcmVnaXN0ZXJGb3JQcmVjaXNlQ2FsbFN0YXRlQ2hhbmdlZCgpfS4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gQ2FsbFN0YXRlRXhjZXB0aW9uIHdoZW4gY2FsbCBpcyBub3QgcmluZ2luZyBvciB3YWl0aW5nCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWNjZXB0Q2FsbChDYWxsIHJpbmdpbmdDYWxsKSB0aHJvd3MgQ2FsbFN0YXRlRXhjZXB0aW9uIHsKKyAgICAgICAgUGhvbmUgcmluZ2luZ1Bob25lID0gcmluZ2luZ0NhbGwuZ2V0UGhvbmUoKTsKKworICAgICAgICBpZiAoIGhhc0FjdGl2ZUZnQ2FsbCgpICkgeworICAgICAgICAgICAgUGhvbmUgYWN0aXZlUGhvbmUgPSBnZXRBY3RpdmVGZ0NhbGwoKS5nZXRQaG9uZSgpOworICAgICAgICAgICAgYm9vbGVhbiBoYXNCZ0NhbGwgPSBhY3RpdmVQaG9uZS5nZXRCYWNrZ3JvdW5kQ2FsbCgpLmlzSWRsZSgpOworICAgICAgICAgICAgYm9vbGVhbiBzYW1lQ2hhbm5lbCA9IChhY3RpdmVQaG9uZSA9PSByaW5naW5nUGhvbmUpOworCisgICAgICAgICAgICBpZiAoc2FtZUNoYW5uZWwgJiYgaGFzQmdDYWxsKSB7CisgICAgICAgICAgICAgICAgZ2V0QWN0aXZlRmdDYWxsKCkuaGFuZ3VwKCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCFzYW1lQ2hhbm5lbCAmJiAhaGFzQmdDYWxsKSB7CisgICAgICAgICAgICAgICAgYWN0aXZlUGhvbmUuc3dpdGNoSG9sZGluZ0FuZEFjdGl2ZSgpOworICAgICAgICAgICAgfSBlbHNlIGlmICghc2FtZUNoYW5uZWwgJiYgaGFzQmdDYWxsKSB7CisgICAgICAgICAgICAgICAgZ2V0QWN0aXZlRmdDYWxsKCkuaGFuZ3VwKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByaW5naW5nUGhvbmUuYWNjZXB0Q2FsbCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlamVjdCAoaWdub3JlKSBhIHJpbmdpbmcgY2FsbC4gSW4gR1NNLCB0aGlzIG1lYW5zIFVEVUIKKyAgICAgKiAoVXNlciBEZXRlcm1pbmVkIFVzZXIgQnVzeSkuIFJlamVjdCBvY2N1cnMgYXN5bmNocm9ub3VzbHksCisgICAgICogYW5kIGZpbmFsIG5vdGlmaWNhdGlvbiBvY2N1cnMgdmlhCisgICAgICoge0BsaW5rICNyZWdpc3RlckZvclByZWNpc2VDYWxsU3RhdGVDaGFuZ2VkKGFuZHJvaWQub3MuSGFuZGxlciwgaW50LAorICAgICAqIGphdmEubGFuZy5PYmplY3QpIHJlZ2lzdGVyRm9yUHJlY2lzZUNhbGxTdGF0ZUNoYW5nZWQoKX0uCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIENhbGxTdGF0ZUV4Y2VwdGlvbiB3aGVuIG5vIGNhbGwgaXMgcmluZ2luZyBvciB3YWl0aW5nCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVqZWN0Q2FsbChDYWxsIHJpbmdpbmdDYWxsKSB0aHJvd3MgQ2FsbFN0YXRlRXhjZXB0aW9uIHsKKyAgICAgICAgUGhvbmUgcmluZ2luZ1Bob25lID0gcmluZ2luZ0NhbGwuZ2V0UGhvbmUoKTsKKworICAgICAgICByaW5naW5nUGhvbmUucmVqZWN0Q2FsbCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBsYWNlcyBhbnkgYWN0aXZlIGNhbGxzIG9uIGhvbGQsIGFuZCBtYWtlcyBhbnkgaGVsZCBjYWxscworICAgICAqICBhY3RpdmUuIFN3aXRjaCBvY2N1cnMgYXN5bmNocm9ub3VzbHkgYW5kIG1heSBmYWlsLgorICAgICAqIEZpbmFsIG5vdGlmaWNhdGlvbiBvY2N1cnMgdmlhCisgICAgICoge0BsaW5rICNyZWdpc3RlckZvclByZWNpc2VDYWxsU3RhdGVDaGFuZ2VkKGFuZHJvaWQub3MuSGFuZGxlciwgaW50LAorICAgICAqIGphdmEubGFuZy5PYmplY3QpIHJlZ2lzdGVyRm9yUHJlY2lzZUNhbGxTdGF0ZUNoYW5nZWQoKX0uCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIENhbGxTdGF0ZUV4Y2VwdGlvbiBpZiBhY3RpdmUgY2FsbCBpcyByaW5naW5nLCB3YWl0aW5nLCBvcgorICAgICAqIGRpYWxpbmcvYWxlcnRpbmcsIG9yIGhlbGRDYWxsIGNhbid0IGJlIGFjdGl2ZS4KKyAgICAgKiBJbiB0aGVzZSBjYXNlcywgdGhpcyBvcGVyYXRpb24gbWF5IG5vdCBiZSBwZXJmb3JtZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3dpdGNoSG9sZGluZ0FuZEFjdGl2ZShDYWxsIGhlbGRDYWxsKSB0aHJvd3MgQ2FsbFN0YXRlRXhjZXB0aW9uIHsKKyAgICAgICAgUGhvbmUgYWN0aXZlUGhvbmUgPSBudWxsOworICAgICAgICBQaG9uZSBoZWxkUGhvbmUgPSBudWxsOworCisgICAgICAgIGlmIChoYXNBY3RpdmVGZ0NhbGwoKSkgeworICAgICAgICAgICAgYWN0aXZlUGhvbmUgPSBnZXRBY3RpdmVGZ0NhbGwoKS5nZXRQaG9uZSgpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGhlbGRDYWxsICE9IG51bGwpIHsKKyAgICAgICAgICAgIGhlbGRQaG9uZSA9IGhlbGRDYWxsLmdldFBob25lKCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoYWN0aXZlUGhvbmUgIT0gaGVsZFBob25lKSB7CisgICAgICAgICAgICBhY3RpdmVQaG9uZS5zd2l0Y2hIb2xkaW5nQW5kQWN0aXZlKCk7CisgICAgICAgIH0KKworICAgICAgICBoZWxkUGhvbmUuc3dpdGNoSG9sZGluZ0FuZEFjdGl2ZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgb3Igbm90IHRoZSBwaG9uZSBjYW4gY29uZmVyZW5jZSBpbiB0aGUgY3VycmVudCBwaG9uZQorICAgICAqIHN0YXRlLS10aGF0IGlzLCBvbmUgY2FsbCBob2xkaW5nIGFuZCBvbmUgY2FsbCBhY3RpdmUuCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBwaG9uZSBjYW4gY29uZmVyZW5jZTsgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGNhbkNvbmZlcmVuY2UoQ2FsbCBoZWxkQ2FsbCkgeworICAgICAgICBQaG9uZSBhY3RpdmVQaG9uZSA9IG51bGw7CisgICAgICAgIFBob25lIGhlbGRQaG9uZSA9IG51bGw7CisKKyAgICAgICAgaWYgKGhhc0FjdGl2ZUZnQ2FsbCgpKSB7CisgICAgICAgICAgICBhY3RpdmVQaG9uZSA9IGdldEFjdGl2ZUZnQ2FsbCgpLmdldFBob25lKCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaGVsZENhbGwgIT0gbnVsbCkgeworICAgICAgICAgICAgaGVsZFBob25lID0gaGVsZENhbGwuZ2V0UGhvbmUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAoaGVsZFBob25lID09IGFjdGl2ZVBob25lKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25mZXJlbmNlcyBob2xkaW5nIGFuZCBhY3RpdmUuIENvbmZlcmVuY2Ugb2NjdXJzIGFzeW5jaHJvbm91c2x5CisgICAgICogYW5kIG1heSBmYWlsLiBGaW5hbCBub3RpZmljYXRpb24gb2NjdXJzIHZpYQorICAgICAqIHtAbGluayAjcmVnaXN0ZXJGb3JQcmVjaXNlQ2FsbFN0YXRlQ2hhbmdlZChhbmRyb2lkLm9zLkhhbmRsZXIsIGludCwKKyAgICAgKiBqYXZhLmxhbmcuT2JqZWN0KSByZWdpc3RlckZvclByZWNpc2VDYWxsU3RhdGVDaGFuZ2VkKCl9LgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBDYWxsU3RhdGVFeGNlcHRpb24gaWYgY2FuQ29uZmVyZW5jZSgpIHdvdWxkIHJldHVybiBmYWxzZS4KKyAgICAgKiBJbiB0aGVzZSBjYXNlcywgdGhpcyBvcGVyYXRpb24gbWF5IG5vdCBiZSBwZXJmb3JtZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgY29uZmVyZW5jZShDYWxsIGhlbGRDYWxsKSB0aHJvd3MgQ2FsbFN0YXRlRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGNhbkNvbmZlcmVuY2UoaGVsZENhbGwpKQorICAgICAgICAgICAgdGhyb3cobmV3IENhbGxTdGF0ZUV4Y2VwdGlvbigiQ2FuJ3QgY29uZmVyZW5jZSBmb3JlZ3JvdW5kIGFuZCBzZWxlY3RlZCBiYWNrZ3JvdW5kIGNhbGwiKSk7CisKKyAgICAgICAgaGVsZENhbGwuZ2V0UGhvbmUoKS5jb25mZXJlbmNlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5pdGlhdGUgYSBuZXcgdm9pY2UgY29ubmVjdGlvbi4gVGhpcyBoYXBwZW5zIGFzeW5jaHJvbm91c2x5LCBzbyB5b3UKKyAgICAgKiBjYW5ub3QgYXNzdW1lIHRoZSBhdWRpbyBwYXRoIGlzIGNvbm5lY3RlZCAob3IgYSBjYWxsIGluZGV4IGhhcyBiZWVuCisgICAgICogYXNzaWduZWQpIHVudGlsIFBob25lU3RhdGVDaGFuZ2VkIG5vdGlmaWNhdGlvbiBoYXMgb2NjdXJyZWQuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIENhbGxTdGF0ZUV4Y2VwdGlvbiBpZiBhIG5ldyBvdXRnb2luZyBjYWxsIGlzIG5vdCBjdXJyZW50bHkKKyAgICAgKiBwb3NzaWJsZSBiZWNhdXNlIG5vIG1vcmUgY2FsbCBzbG90cyBleGlzdCBvciBhIGNhbGwgZXhpc3RzIHRoYXQgaXMKKyAgICAgKiBkaWFsaW5nLCBhbGVydGluZywgcmluZ2luZywgb3Igd2FpdGluZy4gIE90aGVyIGVycm9ycyBhcmUKKyAgICAgKiBoYW5kbGVkIGFzeW5jaHJvbm91c2x5LgorICAgICAqLworICAgIHB1YmxpYyBDb25uZWN0aW9uIGRpYWwoUGhvbmUgcGhvbmUsIFN0cmluZyBkaWFsU3RyaW5nKSB0aHJvd3MgQ2FsbFN0YXRlRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIHBob25lLmRpYWwoZGlhbFN0cmluZyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5pdGlhdGUgYSBuZXcgdm9pY2UgY29ubmVjdGlvbi4gVGhpcyBoYXBwZW5zIGFzeW5jaHJvbm91c2x5LCBzbyB5b3UKKyAgICAgKiBjYW5ub3QgYXNzdW1lIHRoZSBhdWRpbyBwYXRoIGlzIGNvbm5lY3RlZCAob3IgYSBjYWxsIGluZGV4IGhhcyBiZWVuCisgICAgICogYXNzaWduZWQpIHVudGlsIFBob25lU3RhdGVDaGFuZ2VkIG5vdGlmaWNhdGlvbiBoYXMgb2NjdXJyZWQuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIENhbGxTdGF0ZUV4Y2VwdGlvbiBpZiBhIG5ldyBvdXRnb2luZyBjYWxsIGlzIG5vdCBjdXJyZW50bHkKKyAgICAgKiBwb3NzaWJsZSBiZWNhdXNlIG5vIG1vcmUgY2FsbCBzbG90cyBleGlzdCBvciBhIGNhbGwgZXhpc3RzIHRoYXQgaXMKKyAgICAgKiBkaWFsaW5nLCBhbGVydGluZywgcmluZ2luZywgb3Igd2FpdGluZy4gIE90aGVyIGVycm9ycyBhcmUKKyAgICAgKiBoYW5kbGVkIGFzeW5jaHJvbm91c2x5LgorICAgICAqLworICAgIHB1YmxpYyBDb25uZWN0aW9uIGRpYWwoUGhvbmUgcGhvbmUsIFN0cmluZyBkaWFsU3RyaW5nLCBVVVNJbmZvIHV1c0luZm8pIHRocm93cyBDYWxsU3RhdGVFeGNlcHRpb24geworICAgICAgICByZXR1cm4gcGhvbmUuZGlhbChkaWFsU3RyaW5nLCB1dXNJbmZvKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBjbGVhciBkaXNjb25uZWN0IGNvbm5lY3Rpb24gZm9yIGVhY2ggcGhvbmUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjbGVhckRpc2Nvbm5lY3RlZCgpIHsKKyAgICAgICAgZm9yKFBob25lIHBob25lIDogbVBob25lcykgeworICAgICAgICAgICAgcGhvbmUuY2xlYXJEaXNjb25uZWN0ZWQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgb3Igbm90IHRoZSBwaG9uZSBjYW4gZG8gZXhwbGljaXQgY2FsbCB0cmFuc2ZlciBpbiB0aGUgY3VycmVudAorICAgICAqIHBob25lIHN0YXRlLS10aGF0IGlzLCBvbmUgY2FsbCBob2xkaW5nIGFuZCBvbmUgY2FsbCBhY3RpdmUuCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBwaG9uZSBjYW4gZG8gZXhwbGljaXQgY2FsbCB0cmFuc2ZlcjsgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGNhblRyYW5zZmVyKENhbGwgaGVsZENhbGwpIHsKKyAgICAgICAgUGhvbmUgYWN0aXZlUGhvbmUgPSBudWxsOworICAgICAgICBQaG9uZSBoZWxkUGhvbmUgPSBudWxsOworCisgICAgICAgIGlmIChoYXNBY3RpdmVGZ0NhbGwoKSkgeworICAgICAgICAgICAgYWN0aXZlUGhvbmUgPSBnZXRBY3RpdmVGZ0NhbGwoKS5nZXRQaG9uZSgpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGhlbGRDYWxsICE9IG51bGwpIHsKKyAgICAgICAgICAgIGhlbGRQaG9uZSA9IGhlbGRDYWxsLmdldFBob25lKCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gKGhlbGRQaG9uZSA9PSBhY3RpdmVQaG9uZSAmJiBhY3RpdmVQaG9uZS5jYW5UcmFuc2ZlcigpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25uZWN0cyB0aGUgaGVsZCBjYWxsIGFuZCBhY3RpdmUgY2FsbAorICAgICAqIERpc2Nvbm5lY3RzIHRoZSBzdWJzY3JpYmVyIGZyb20gYm90aCBjYWxscworICAgICAqCisgICAgICogRXhwbGljaXQgQ2FsbCBUcmFuc2ZlciBvY2N1cnMgYXN5bmNocm9ub3VzbHkKKyAgICAgKiBhbmQgbWF5IGZhaWwuIEZpbmFsIG5vdGlmaWNhdGlvbiBvY2N1cnMgdmlhCisgICAgICoge0BsaW5rICNyZWdpc3RlckZvclByZWNpc2VDYWxsU3RhdGVDaGFuZ2VkKGFuZHJvaWQub3MuSGFuZGxlciwgaW50LAorICAgICAqIGphdmEubGFuZy5PYmplY3QpIHJlZ2lzdGVyRm9yUHJlY2lzZUNhbGxTdGF0ZUNoYW5nZWQoKX0uCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIENhbGxTdGF0ZUV4Y2VwdGlvbiBpZiBjYW5UcmFuc2ZlcigpIHdvdWxkIHJldHVybiBmYWxzZS4KKyAgICAgKiBJbiB0aGVzZSBjYXNlcywgdGhpcyBvcGVyYXRpb24gbWF5IG5vdCBiZSBwZXJmb3JtZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgZXhwbGljaXRDYWxsVHJhbnNmZXIoQ2FsbCBoZWxkQ2FsbCkgdGhyb3dzIENhbGxTdGF0ZUV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChjYW5UcmFuc2ZlcihoZWxkQ2FsbCkpIHsKKyAgICAgICAgICAgIGhlbGRDYWxsLmdldFBob25lKCkuZXhwbGljaXRDYWxsVHJhbnNmZXIoKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogQHJldHVybiBsaXN0IG9mIHJpbmdpbmcgY2FsbHMKKyAgICAgKi8KKyAgICBwdWJsaWMgQXJyYXlMaXN0PENhbGw+IGdldFJpbmdpbmdDYWxscygpIHsKKyAgICAgICAgcmV0dXJuIG1CYWNrZ3JvdW5kQ2FsbHM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBsaXN0IG9mIGJhY2tncm91bmQgY2FsbHMKKyAgICAgKi8KKyAgICBwdWJsaWMgQXJyYXlMaXN0PENhbGw+IGdldEJhY2tncm91bmRDYWxscygpIHsKKyAgICAgICAgcmV0dXJuIG1CYWNrZ3JvdW5kQ2FsbHM7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBub24gaWRsZSBmb3JlZ3JvdW5kIGNhbGwsCisgICAgICogbm90ZTogdGhlcmUgaXMgZGlmZmVyZW5jZSBiZXR3ZWVuIGlzQWxpdmUgYW5kIG5vbiBpZGxlCisgICAgICovCisgICAgcHVibGljIENhbGwgZ2V0QWN0aXZlRmdDYWxsKCkgeworICAgICAgICBmb3IgKENhbGwgY2FsbCA6IG1Gb3JlZ3JvdW5kQ2FsbHMpIHsKKyAgICAgICAgICAgIGlmIChjYWxsLmdldFN0YXRlKCkgIT0gQ2FsbC5TdGF0ZS5JRExFKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogcmV0dXJuIHRoZSBmaXJzdCBhY3RpdmUgY2FsbCBmcm9tIGEgY2FsbCBsaXN0CisgICAgICovCisgICAgcHJpdmF0ZSAgQ2FsbCBnZXRGaXJzdEFjdGl2ZUNhbGwoQXJyYXlMaXN0PENhbGw+IGNhbGxzKSB7CisgICAgICAgIGZvciAoQ2FsbCBjYWxsIDogY2FsbHMpIHsKKyAgICAgICAgICAgIGlmICghY2FsbC5pc0lkbGUoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBjYWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0cnVlIGlmIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSBhY3RpdmUgZm9yZWdyb3VuZCBjYWxsCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaGFzQWN0aXZlRmdDYWxsKCkgeworICAgICAgICByZXR1cm4gKGdldEZpcnN0QWN0aXZlQ2FsbChtRm9yZWdyb3VuZENhbGxzKSAhPSBudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdHJ1ZSBpZiB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgYWN0aXZlIGJhY2tncm91bmQgY2FsbAorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGhhc0FjdGl2ZUJnQ2FsbCgpIHsKKyAgICAgICAgcmV0dXJuIChnZXRGaXJzdEFjdGl2ZUNhbGwobUJhY2tncm91bmRDYWxscykgIT0gbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRydWUgaWYgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIGFjdGl2ZSByaW5naW5nIGNhbGwKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNBY3RpdmVSaW5naW5nQ2FsbCgpIHsKKyAgICAgICAgcmV0dXJuIChnZXRGaXJzdEFjdGl2ZUNhbGwobVJpbmdpbmdDYWxscykgIT0gbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIGxpc3Qgb2YgTU1JIGNvZGVzIHRoYXQgYXJlIHBlbmRpbmcgZm9yIGEgcGhvbmUuIChUaGV5IGhhdmUgaW5pdGlhdGVkCisgICAgICogYnV0IGhhdmUgbm90IHlldCBjb21wbGV0ZWQpLgorICAgICAqIFByZXNlbnRseSB0aGVyZSBpcyBvbmx5IGV2ZXIgb25lLgorICAgICAqCisgICAgICogVXNlIDxjb2RlPnJlZ2lzdGVyRm9yTW1pSW5pdGlhdGU8L2NvZGU+CisgICAgICogYW5kIDxjb2RlPnJlZ2lzdGVyRm9yTW1pQ29tcGxldGU8L2NvZGU+IGZvciBjaGFuZ2Ugbm90aWZpY2F0aW9uLgorICAgICAqIEByZXR1cm4gbnVsbCBpZiBwaG9uZSBkb2Vzbid0IGhhdmUgb3Igc3VwcG9ydCBtbWkgY29kZQorICAgICAqLworICAgIHB1YmxpYyBMaXN0PD8gZXh0ZW5kcyBNbWlDb2RlPiBnZXRQZW5kaW5nTW1pQ29kZXMoUGhvbmUgcGhvbmUpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2VuZHMgdXNlciByZXNwb25zZSB0byBhIFVTU0QgUkVRVUVTVCBtZXNzYWdlLiAgQW4gTW1pQ29kZSBpbnN0YW5jZQorICAgICAqIHJlcHJlc2VudGluZyB0aGlzIHJlc3BvbnNlIGlzIHNlbnQgdG8gaGFuZGxlcnMgcmVnaXN0ZXJlZCB3aXRoCisgICAgICogcmVnaXN0ZXJGb3JNbWlJbml0aWF0ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1c3NkTWVzc2dlICAgIE1lc3NhZ2UgdG8gc2VuZCBpbiB0aGUgcmVzcG9uc2UuCisgICAgICogQHJldHVybiBmYWxzZSBpZiBwaG9uZSBkb2Vzbid0IHN1cHBvcnQgdXNzZCBzZXJ2aWNlCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gc2VuZFVzc2RSZXNwb25zZShQaG9uZSBwaG9uZSwgU3RyaW5nIHVzc2RNZXNzZ2UpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIE11dGVzIG9yIHVubXV0ZXMgdGhlIG1pY3JvcGhvbmUgZm9yIHRoZSBhY3RpdmUgY2FsbC4gVGhlIG1pY3JvcGhvbmUKKyAgICAgKiBpcyBhdXRvbWF0aWNhbGx5IHVubXV0ZWQgaWYgYSBjYWxsIGlzIGFuc3dlcmVkLCBkaWFsZWQsIG9yIHJlc3VtZWQKKyAgICAgKiBmcm9tIGEgaG9sZGluZyBzdGF0ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtdXRlZCB0cnVlIHRvIG11dGUgdGhlIG1pY3JvcGhvbmUsCisgICAgICogZmFsc2UgdG8gYWN0aXZhdGUgdGhlIG1pY3JvcGhvbmUuCisgICAgICovCisKKyAgICBwdWJsaWMgdm9pZCBzZXRNdXRlKGJvb2xlYW4gbXV0ZWQpIHsKKyAgICAgICAgaWYgKGhhc0FjdGl2ZUZnQ2FsbCgpKSB7CisgICAgICAgICAgICBnZXRBY3RpdmVGZ0NhbGwoKS5nZXRQaG9uZSgpLnNldE11dGUobXV0ZWQpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyBjdXJyZW50IG11dGUgc3RhdHVzLiBVc2UKKyAgICAgKiB7QGxpbmsgI3JlZ2lzdGVyRm9yUHJlY2lzZUNhbGxTdGF0ZUNoYW5nZWQoYW5kcm9pZC5vcy5IYW5kbGVyLCBpbnQsCisgICAgICogamF2YS5sYW5nLk9iamVjdCkgcmVnaXN0ZXJGb3JQcmVjaXNlQ2FsbFN0YXRlQ2hhbmdlZCgpfQorICAgICAqIGFzIGEgY2hhbmdlIG5vdGlmY2F0aW9uLCBhbHRob3VnaCBwcmVzZW50bHkgcGhvbmUgc3RhdGUgY2hhbmdlZCBpcyBub3QKKyAgICAgKiBmaXJlZCB3aGVuIHNldE11dGUoKSBpcyBjYWxsZWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRydWUgaXMgbXV0aW5nLCBmYWxzZSBpcyB1bm11dGluZworICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldE11dGUoKSB7CisgICAgICAgIGlmIChoYXNBY3RpdmVGZ0NhbGwoKSkgeworICAgICAgICAgICAgcmV0dXJuIGdldEFjdGl2ZUZnQ2FsbCgpLmdldFBob25lKCkuZ2V0TXV0ZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQbGF5IGEgRFRNRiB0b25lIG9uIHRoZSBhY3RpdmUgY2FsbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjIHNob3VsZCBiZSBvbmUgb2YgMC05LCAnKicgb3IgJyMnLiBPdGhlciB2YWx1ZXMgd2lsbCBiZQorICAgICAqIHNpbGVudGx5IGlnbm9yZWQuCisgICAgICogQHJldHVybiBmYWxzZSBpZiBubyBhY3RpdmUgY2FsbCBvciB0aGUgYWN0aXZlIGNhbGwgZG9lc24ndCBzdXBwb3J0CisgICAgICogICAgICAgICBkdG1mIHRvbmUKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBzZW5kRHRtZihjaGFyIGMpIHsKKyAgICAgICAgaWYgKGhhc0FjdGl2ZUZnQ2FsbCgpKSB7CisgICAgICAgICAgICBnZXRBY3RpdmVGZ0NhbGwoKS5nZXRQaG9uZSgpLnNlbmREdG1mKGMpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN0YXJ0IHRvIHBhbHkgYSBEVE1GIHRvbmUgb24gdGhlIGFjdGl2ZSBjYWxsLgorICAgICAqIG9yIHRoZXJlIGlzIGEgcGxheWluZyBEVE1GIHRvbmUuCisgICAgICogQHBhcmFtIGMgc2hvdWxkIGJlIG9uZSBvZiAwLTksICcqJyBvciAnIycuIE90aGVyIHZhbHVlcyB3aWxsIGJlCisgICAgICogc2lsZW50bHkgaWdub3JlZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gZmFsc2UgaWYgbm8gYWN0aXZlIGNhbGwgb3IgdGhlIGFjdGl2ZSBjYWxsIGRvZXNuJ3Qgc3VwcG9ydAorICAgICAqICAgICAgICAgZHRtZiB0b25lCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gc3RhcnREdG1mKGNoYXIgYykgeworICAgICAgICBpZiAoaGFzQWN0aXZlRmdDYWxsKCkpIHsKKyAgICAgICAgICAgIGdldEFjdGl2ZUZnQ2FsbCgpLmdldFBob25lKCkuc2VuZER0bWYoYyk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RvcCB0aGUgcGxheWluZyBEVE1GIHRvbmUuIElnbm9yZWQgaWYgdGhlcmUgaXMgbm8gcGxheWluZyBEVE1GCisgICAgICogdG9uZSBvciBubyBhY3RpdmUgY2FsbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdG9wRHRtZihQaG9uZSBwaG9uZSkgeworICAgICAgICBwaG9uZS5zdG9wRHRtZigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHNlbmQgYnVyc3QgRFRNRiB0b25lLCBpdCBjYW4gc2VuZCB0aGUgc3RyaW5nIGFzIHNpbmdsZSBjaGFyYWN0ZXIgb3IgbXVsdGlwbGUgY2hhcmFjdGVyCisgICAgICogaWdub3JlIGlmIHRoZXJlIGlzIG5vIGFjdGl2ZSBjYWxsIG9yIG5vdCB2YWxpZCBkaWdpdHMgc3RyaW5nLgorICAgICAqIFZhbGlkIGRpZ2l0IG1lYW5zIG9ubHkgaW5jbHVkZXMgY2hhcmFjdGVycyBJU08tTEFUSU4gY2hhcmFjdGVycyAwLTksICosICMKKyAgICAgKiBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHNlbmREdG1mIGFuZCBzZW5kQnVyc3REdG1mIGlzIHNlbmREdG1mIG9ubHkgc2VuZHMgb25lIGNoYXJhY3RlciwKKyAgICAgKiB0aGlzIGFwaSBjYW4gc2VuZCBzaW5nbGUgY2hhcmFjdGVyIGFuZCBtdWx0aXBsZSBjaGFyYWN0ZXIsIGFsc28sIHRoaXMgYXBpIGhhcyByZXNwb25zZQorICAgICAqIGJhY2sgdG8gY2FsbGVyLgorICAgICAqCisgICAgICogQHBhcmFtIGR0bWZTdHJpbmcgaXMgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgZGlhbGluZyBkaWdpdChzKSBpbiB0aGUgYWN0aXZlIGNhbGwKKyAgICAgKiBAcGFyYW0gb24gdGhlIERUTUYgT04gbGVuZ3RoIGluIG1pbGxpc2Vjb25kcywgb3IgMCBmb3IgZGVmYXVsdAorICAgICAqIEBwYXJhbSBvZmYgdGhlIERUTUYgT0ZGIGxlbmd0aCBpbiBtaWxsaXNlY29uZHMsIG9yIDAgZm9yIGRlZmF1bHQKKyAgICAgKiBAcGFyYW0gb25Db21wbGV0ZSBpcyB0aGUgY2FsbGJhY2sgbWVzc2FnZSB3aGVuIHRoZSBhY3Rpb24gaXMgcHJvY2Vzc2VkIGJ5IEJQCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBzZW5kQnVyc3REdG1mKFBob25lIHBob25lLCBTdHJpbmcgZHRtZlN0cmluZywgaW50IG9uLCBpbnQgb2ZmLCBNZXNzYWdlIG9uQ29tcGxldGUpIHsKKyAgICAgICAgaWYgKGhhc0FjdGl2ZUZnQ2FsbCgpKSB7CisgICAgICAgICAgICBnZXRBY3RpdmVGZ0NhbGwoKS5nZXRQaG9uZSgpLnNlbmRCdXJzdER0bWYoZHRtZlN0cmluZywgb24sIG9mZiwgb25Db21wbGV0ZSk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogTm90aWZpZXMgd2hlbiBhIHZvaWNlIGNvbm5lY3Rpb24gaGFzIGRpc2Nvbm5lY3RlZCwgZWl0aGVyIGR1ZSB0byBsb2NhbAorICAgICAqIG9yIHJlbW90ZSBoYW5ndXAgb3IgZXJyb3IuCisgICAgICoKKyAgICAgKiAgTWVzc2FnZXMgcmVjZWl2ZWQgZnJvbSB0aGlzIHdpbGwgaGF2ZSB0aGUgZm9sbG93aW5nIG1lbWJlcnM6PHA+CisgICAgICogIDx1bD48bGk+TWVzc2FnZS5vYmogd2lsbCBiZSBhbiBBc3luY1Jlc3VsdDwvbGk+CisgICAgICogIDxsaT5Bc3luY1Jlc3VsdC51c2VyT2JqID0gb2JqPC9saT4KKyAgICAgKiAgPGxpPkFzeW5jUmVzdWx0LnJlc3VsdCA9IGEgQ29ubmVjdGlvbiBvYmplY3QgdGhhdCBpcworICAgICAqICBubyBsb25nZXIgY29ubmVjdGVkLjwvbGk+PC91bD4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZWdpc3RlckZvckRpc2Nvbm5lY3QoSGFuZGxlciBoLCBpbnQgd2hhdCwgT2JqZWN0IG9iaikgeworICAgICAgICBtRGlzY29ubmVjdFJlZ2lzdHJhbnRzLmFkZFVuaXF1ZShoLCB3aGF0LCBvYmopOworICAgIH0KKworICAgIC8qKgorICAgICAqIFVucmVnaXN0ZXJzIGZvciB2b2ljZSBkaXNjb25uZWN0aW9uIG5vdGlmaWNhdGlvbi4KKyAgICAgKiBFeHRyYW5lb3VzIGNhbGxzIGFyZSB0b2xlcmF0ZWQgc2lsZW50bHkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB1bnJlZ2lzdGVyRm9yRGlzY29ubmVjdChIYW5kbGVyIGgpeworICAgICAgICBtRGlzY29ubmVjdFJlZ2lzdHJhbnRzLnJlbW92ZShoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWdpc3RlciBmb3IgZ2V0dGluZyBub3RpZmljYXRpb25zIGZvciBjaGFuZ2UgaW4gdGhlIENhbGwgU3RhdGUge0BsaW5rIENhbGwuU3RhdGV9CisgICAgICogVGhpcyBpcyBjYWxsZWQgUHJlY2lzZUNhbGxTdGF0ZSBiZWNhdXNlIHRoZSBjYWxsIHN0YXRlIGlzIG1vcmUgcHJlY2lzZSB0aGFuIHRoZQorICAgICAqIHtAbGluayBQaG9uZS5TdGF0ZX0gd2hpY2ggY2FuIGJlIG9idGFpbmVkIHVzaW5nIHRoZSB7QGxpbmsgUGhvbmVTdGF0ZUxpc3RlbmVyfQorICAgICAqCisgICAgICogUmVzdWx0aW5nIGV2ZW50cyB3aWxsIGhhdmUgYW4gQXN5bmNSZXN1bHQgaW4gPGNvZGU+TWVzc2FnZS5vYmo8L2NvZGU+LgorICAgICAqIEFzeW5jUmVzdWx0LnVzZXJEYXRhIHdpbGwgYmUgc2V0IHRvIHRoZSBvYmogYXJndW1lbnQgaGVyZS4KKyAgICAgKiBUaGUgPGVtPmg8L2VtPiBwYXJhbWV0ZXIgaXMgaGVsZCBvbmx5IGJ5IGEgd2VhayByZWZlcmVuY2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVnaXN0ZXJGb3JQcmVjaXNlQ2FsbFN0YXRlQ2hhbmdlZChIYW5kbGVyIGgsIGludCB3aGF0LCBPYmplY3Qgb2JqKXsKKyAgICAgICAgbVByZWNpc2VDYWxsU3RhdGVSZWdpc3RyYW50cy5hZGRVbmlxdWUoaCwgd2hhdCwgb2JqKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVbnJlZ2lzdGVycyBmb3Igdm9pY2UgY2FsbCBzdGF0ZSBjaGFuZ2Ugbm90aWZpY2F0aW9ucy4KKyAgICAgKiBFeHRyYW5lb3VzIGNhbGxzIGFyZSB0b2xlcmF0ZWQgc2lsZW50bHkuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdW5yZWdpc3RlckZvclByZWNpc2VDYWxsU3RhdGVDaGFuZ2VkKEhhbmRsZXIgaCl7CisgICAgICAgIG1QcmVjaXNlQ2FsbFN0YXRlUmVnaXN0cmFudHMucmVtb3ZlKGgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIE5vdGlmaWVzIHdoZW4gYSBwcmV2aW91c2x5IHVudHJhY2tlZCBub24tcmluZ2luZy93YWl0aW5nIGNvbm5lY3Rpb24gaGFzIGFwcGVhcmVkLgorICAgICAqIFRoaXMgaXMgbGlrZWx5IGR1ZSB0byBzb21lIG90aGVyIGVudGl0eSAoZWcsIFNJTSBjYXJkIGFwcGxpY2F0aW9uKSBpbml0aWF0aW5nIGEgY2FsbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZWdpc3RlckZvclVua25vd25Db25uZWN0aW9uKEhhbmRsZXIgaCwgaW50IHdoYXQsIE9iamVjdCBvYmope30KKworICAgIC8qKgorICAgICAqIFVucmVnaXN0ZXJzIGZvciB1bmtub3duIGNvbm5lY3Rpb24gbm90aWZpY2F0aW9ucy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB1bnJlZ2lzdGVyRm9yVW5rbm93bkNvbm5lY3Rpb24oSGFuZGxlciBoKXt9CisKKworICAgIC8qKgorICAgICAqIE5vdGlmaWVzIHdoZW4gYSBuZXcgcmluZ2luZyBvciB3YWl0aW5nIGNvbm5lY3Rpb24gaGFzIGFwcGVhcmVkLjxwPgorICAgICAqCisgICAgICogIE1lc3NhZ2VzIHJlY2VpdmVkIGZyb20gdGhpczoKKyAgICAgKiAgTWVzc2FnZS5vYmogd2lsbCBiZSBhbiBBc3luY1Jlc3VsdAorICAgICAqICBBc3luY1Jlc3VsdC51c2VyT2JqID0gb2JqCisgICAgICogIEFzeW5jUmVzdWx0LnJlc3VsdCA9IGEgQ29ubmVjdGlvbi4gPHA+CisgICAgICogIFBsZWFzZSBjaGVjayBDb25uZWN0aW9uLmlzUmluZ2luZygpIHRvIG1ha2Ugc3VyZSB0aGUgQ29ubmVjdGlvbgorICAgICAqICBoYXMgbm90IGRyb3BwZWQgc2luY2UgdGhpcyBtZXNzYWdlIHdhcyBwb3N0ZWQuCisgICAgICogIElmIENvbm5lY3Rpb24uaXNSaW5naW5nKCkgaXMgdHJ1ZSwgdGhlbgorICAgICAqICAgQ29ubmVjdGlvbi5nZXRDYWxsKCkgPT0gUGhvbmUuZ2V0UmluZ2luZ0NhbGwoKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyRm9yTmV3UmluZ2luZ0Nvbm5lY3Rpb24oSGFuZGxlciBoLCBpbnQgd2hhdCwgT2JqZWN0IG9iail7fQorCisgICAgLyoqCisgICAgICogVW5yZWdpc3RlcnMgZm9yIG5ldyByaW5naW5nIGNvbm5lY3Rpb24gbm90aWZpY2F0aW9uLgorICAgICAqIEV4dHJhbmVvdXMgY2FsbHMgYXJlIHRvbGVyYXRlZCBzaWxlbnRseQorICAgICAqLworCisgICAgcHVibGljIHZvaWQgdW5yZWdpc3RlckZvck5ld1JpbmdpbmdDb25uZWN0aW9uKEhhbmRsZXIgaCl7fQorCisgICAgLyoqCisgICAgICogTm90aWZpZXMgd2hlbiBhbiBpbmNvbWluZyBjYWxsIHJpbmdzLjxwPgorICAgICAqCisgICAgICogIE1lc3NhZ2VzIHJlY2VpdmVkIGZyb20gdGhpczoKKyAgICAgKiAgTWVzc2FnZS5vYmogd2lsbCBiZSBhbiBBc3luY1Jlc3VsdAorICAgICAqICBBc3luY1Jlc3VsdC51c2VyT2JqID0gb2JqCisgICAgICogIEFzeW5jUmVzdWx0LnJlc3VsdCA9IGEgQ29ubmVjdGlvbi4gPHA+CisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVnaXN0ZXJGb3JJbmNvbWluZ1JpbmcoSGFuZGxlciBoLCBpbnQgd2hhdCwgT2JqZWN0IG9iail7fQorCisgICAgLyoqCisgICAgICogVW5yZWdpc3RlcnMgZm9yIHJpbmcgbm90aWZpY2F0aW9uLgorICAgICAqIEV4dHJhbmVvdXMgY2FsbHMgYXJlIHRvbGVyYXRlZCBzaWxlbnRseQorICAgICAqLworCisgICAgcHVibGljIHZvaWQgdW5yZWdpc3RlckZvckluY29taW5nUmluZyhIYW5kbGVyIGgpe30KKworICAgIC8qKgorICAgICAqIE5vdGlmaWVzIHdoZW4gb3V0LWJhbmQgcmluZ2JhY2sgdG9uZSBpcyBuZWVkZWQuPHA+CisgICAgICoKKyAgICAgKiAgTWVzc2FnZXMgcmVjZWl2ZWQgZnJvbSB0aGlzOgorICAgICAqICBNZXNzYWdlLm9iaiB3aWxsIGJlIGFuIEFzeW5jUmVzdWx0CisgICAgICogIEFzeW5jUmVzdWx0LnVzZXJPYmogPSBvYmoKKyAgICAgKiAgQXN5bmNSZXN1bHQucmVzdWx0ID0gYm9vbGVhbiwgdHJ1ZSB0byBzdGFydCBwbGF5IHJpbmdiYWNrIHRvbmUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgYW5kIGZhbHNlIHRvIHN0b3AuIDxwPgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyRm9yUmluZ2JhY2tUb25lKEhhbmRsZXIgaCwgaW50IHdoYXQsIE9iamVjdCBvYmope30KKworICAgIC8qKgorICAgICAqIFVucmVnaXN0ZXJzIGZvciByaW5nYmFjayB0b25lIG5vdGlmaWNhdGlvbi4KKyAgICAgKi8KKworICAgIHB1YmxpYyB2b2lkIHVucmVnaXN0ZXJGb3JSaW5nYmFja1RvbmUoSGFuZGxlciBoKXt9CisKKyAgICAvKioKKyAgICAgKiBSZWdpc3RlcnMgdGhlIGhhbmRsZXIgdG8gcmVzZXQgdGhlIHVwbGluayBtdXRlIHN0YXRlIHRvIGdldAorICAgICAqIHVwbGluayBhdWRpby4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZWdpc3RlckZvclJlc2VuZEluY2FsbE11dGUoSGFuZGxlciBoLCBpbnQgd2hhdCwgT2JqZWN0IG9iail7fQorCisgICAgLyoqCisgICAgICogVW5yZWdpc3RlcnMgZm9yIHJlc2VuZCBpbmNhbGwgbXV0ZSBub3RpZmljYXRpb25zLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHVucmVnaXN0ZXJGb3JSZXNlbmRJbmNhbGxNdXRlKEhhbmRsZXIgaCl7fQorCisKKworICAgIC8qKgorICAgICAqIFJlZ2lzdGVyIGZvciBub3RpZmljYXRpb25zIG9mIGluaXRpYXRpb24gb2YgYSBuZXcgTU1JIGNvZGUgcmVxdWVzdC4KKyAgICAgKiBNTUkgY29kZXMgZm9yIEdTTSBhcmUgZGlzY3Vzc2VkIGluIDNHUFAgVFMgMjIuMDMwLjxwPgorICAgICAqCisgICAgICogRXhhbXBsZTogSWYgUGhvbmUuZGlhbCBpcyBjYWxsZWQgd2l0aCAiKiMzMSMiLCB0aGVuIHRoZSBhcHAgd2lsbAorICAgICAqIGJlIG5vdGlmaWVkIGhlcmUuPHA+CisgICAgICoKKyAgICAgKiBUaGUgcmV0dXJuZWQgPGNvZGU+TWVzc2FnZS5vYmo8L2NvZGU+IHdpbGwgY29udGFpbiBhbiBBc3luY1Jlc3VsdC4KKyAgICAgKgorICAgICAqIDxjb2RlPm9iai5yZXN1bHQ8L2NvZGU+IHdpbGwgYmUgYW4gIk1taUNvZGUiIG9iamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZWdpc3RlckZvck1taUluaXRpYXRlKEhhbmRsZXIgaCwgaW50IHdoYXQsIE9iamVjdCBvYmope30KKworICAgIC8qKgorICAgICAqIFVucmVnaXN0ZXJzIGZvciBuZXcgTU1JIGluaXRpYXRlIG5vdGlmaWNhdGlvbi4KKyAgICAgKiBFeHRyYW5lb3VzIGNhbGxzIGFyZSB0b2xlcmF0ZWQgc2lsZW50bHkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB1bnJlZ2lzdGVyRm9yTW1pSW5pdGlhdGUoSGFuZGxlciBoKXt9CisKKyAgICAvKioKKyAgICAgKiBSZWdpc3RlciBmb3Igbm90aWZpY2F0aW9ucyB0aGF0IGFuIE1NSSByZXF1ZXN0IGhhcyBjb21wbGV0ZWQKKyAgICAgKiBpdHMgbmV0d29yayBhY3Rpdml0eSBhbmQgaXMgaW4gaXRzIGZpbmFsIHN0YXRlLiBUaGlzIG1heSBtZWFuIGEgc3RhdGUKKyAgICAgKiBvZiBDT01QTEVURSwgRkFJTEVELCBvciBDQU5DRUxMRUQuCisgICAgICoKKyAgICAgKiA8Y29kZT5NZXNzYWdlLm9iajwvY29kZT4gd2lsbCBjb250YWluIGFuIEFzeW5jUmVzdWx0LgorICAgICAqIDxjb2RlPm9iai5yZXN1bHQ8L2NvZGU+IHdpbGwgYmUgYW4gIk1taUNvZGUiIG9iamVjdAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyRm9yTW1pQ29tcGxldGUoSGFuZGxlciBoLCBpbnQgd2hhdCwgT2JqZWN0IG9iail7fQorCisgICAgLyoqCisgICAgICogVW5yZWdpc3RlcnMgZm9yIE1NSSBjb21wbGV0ZSBub3RpZmljYXRpb24uCisgICAgICogRXh0cmFuZW91cyBjYWxscyBhcmUgdG9sZXJhdGVkIHNpbGVudGx5CisgICAgICovCisgICAgcHVibGljIHZvaWQgdW5yZWdpc3RlckZvck1taUNvbXBsZXRlKEhhbmRsZXIgaCl7fQorCisgICAgLyoqCisgICAgICogUmVnaXN0cmF0aW9uIHBvaW50IGZvciBFY20gdGltZXIgcmVzZXQKKyAgICAgKiBAcGFyYW0gaCBoYW5kbGVyIHRvIG5vdGlmeQorICAgICAqIEBwYXJhbSB3aGF0IHVzZXItZGVmaW5lZCBtZXNzYWdlIGNvZGUKKyAgICAgKiBAcGFyYW0gb2JqIHBsYWNlZCBpbiBNZXNzYWdlLm9iagorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyRm9yRWNtVGltZXJSZXNldChIYW5kbGVyIGgsIGludCB3aGF0LCBPYmplY3Qgb2JqKXt9CisKKyAgICAvKioKKyAgICAgKiBVbnJlZ2lzdGVyIGZvciBub3RpZmljYXRpb24gZm9yIEVjbSB0aW1lciByZXNldAorICAgICAqIEBwYXJhbSBoIEhhbmRsZXIgdG8gYmUgcmVtb3ZlZCBmcm9tIHRoZSByZWdpc3RyYW50IGxpc3QuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdW5yZWdpc3RlckZvckVjbVRpbWVyUmVzZXQoSGFuZGxlciBoKXt9CisKKworCisgICAgLyoqCisgICAgICogUmVnaXN0ZXIgZm9yIFNlcnZpY2VTdGF0ZSBjaGFuZ2VkLgorICAgICAqIE1lc3NhZ2Uub2JqIHdpbGwgY29udGFpbiBhbiBBc3luY1Jlc3VsdC4KKyAgICAgKiBBc3luY1Jlc3VsdC5yZXN1bHQgd2lsbCBiZSBhIFNlcnZpY2VTdGF0ZSBpbnN0YW5jZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyRm9yU2VydmljZVN0YXRlQ2hhbmdlZChIYW5kbGVyIGgsIGludCB3aGF0LCBPYmplY3Qgb2JqKXt9CisKKyAgICAvKioKKyAgICAgKiBVbnJlZ2lzdGVycyBmb3IgU2VydmljZVN0YXRlQ2hhbmdlIG5vdGlmaWNhdGlvbi4KKyAgICAgKiBFeHRyYW5lb3VzIGNhbGxzIGFyZSB0b2xlcmF0ZWQgc2lsZW50bHkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB1bnJlZ2lzdGVyRm9yU2VydmljZVN0YXRlQ2hhbmdlZChIYW5kbGVyIGgpe30KKworICAgIC8qKgorICAgICAqIFJlZ2lzdGVyIGZvciBTdXBwbGVtZW50YXJ5IFNlcnZpY2Ugbm90aWZpY2F0aW9ucyBmcm9tIHRoZSBuZXR3b3JrLgorICAgICAqIE1lc3NhZ2Uub2JqIHdpbGwgY29udGFpbiBhbiBBc3luY1Jlc3VsdC4KKyAgICAgKiBBc3luY1Jlc3VsdC5yZXN1bHQgd2lsbCBiZSBhIFN1cHBTZXJ2aWNlTm90aWZpY2F0aW9uIGluc3RhbmNlLgorICAgICAqCisgICAgICogQHBhcmFtIGggSGFuZGxlciB0aGF0IHJlY2VpdmVzIHRoZSBub3RpZmljYXRpb24gbWVzc2FnZS4KKyAgICAgKiBAcGFyYW0gd2hhdCBVc2VyLWRlZmluZWQgbWVzc2FnZSBjb2RlLgorICAgICAqIEBwYXJhbSBvYmogVXNlciBvYmplY3QuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVnaXN0ZXJGb3JTdXBwU2VydmljZU5vdGlmaWNhdGlvbihIYW5kbGVyIGgsIGludCB3aGF0LCBPYmplY3Qgb2JqKXt9CisKKyAgICAvKioKKyAgICAgKiBVbnJlZ2lzdGVycyBmb3IgU3VwcGxlbWVudGFyeSBTZXJ2aWNlIG5vdGlmaWNhdGlvbnMuCisgICAgICogRXh0cmFuZW91cyBjYWxscyBhcmUgdG9sZXJhdGVkIHNpbGVudGx5CisgICAgICoKKyAgICAgKiBAcGFyYW0gaCBIYW5kbGVyIHRvIGJlIHJlbW92ZWQgZnJvbSB0aGUgcmVnaXN0cmFudCBsaXN0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHVucmVnaXN0ZXJGb3JTdXBwU2VydmljZU5vdGlmaWNhdGlvbihIYW5kbGVyIGgpe30KKworICAgIC8qKgorICAgICAqIFJlZ2lzdGVyIGZvciBub3RpZmljYXRpb25zIHdoZW4gYSBzdXBwbGVtZW50YXJ5IHNlcnZpY2UgYXR0ZW1wdCBmYWlscy4KKyAgICAgKiBNZXNzYWdlLm9iaiB3aWxsIGNvbnRhaW4gYW4gQXN5bmNSZXN1bHQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaCBIYW5kbGVyIHRoYXQgcmVjZWl2ZXMgdGhlIG5vdGlmaWNhdGlvbiBtZXNzYWdlLgorICAgICAqIEBwYXJhbSB3aGF0IFVzZXItZGVmaW5lZCBtZXNzYWdlIGNvZGUuCisgICAgICogQHBhcmFtIG9iaiBVc2VyIG9iamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZWdpc3RlckZvclN1cHBTZXJ2aWNlRmFpbGVkKEhhbmRsZXIgaCwgaW50IHdoYXQsIE9iamVjdCBvYmope30KKworICAgIC8qKgorICAgICAqIFVucmVnaXN0ZXIgZm9yIG5vdGlmaWNhdGlvbnMgd2hlbiBhIHN1cHBsZW1lbnRhcnkgc2VydmljZSBhdHRlbXB0IGZhaWxzLgorICAgICAqIEV4dHJhbmVvdXMgY2FsbHMgYXJlIHRvbGVyYXRlZCBzaWxlbnRseQorICAgICAqCisgICAgICogQHBhcmFtIGggSGFuZGxlciB0byBiZSByZW1vdmVkIGZyb20gdGhlIHJlZ2lzdHJhbnQgbGlzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB1bnJlZ2lzdGVyRm9yU3VwcFNlcnZpY2VGYWlsZWQoSGFuZGxlciBoKXt9CisKKyAgICAvKioKKyAgICAgKiBSZWdpc3RlciBmb3Igbm90aWZpY2F0aW9ucyB3aGVuIGEgc0luQ2FsbCBWb2ljZVByaXZhY3kgaXMgZW5hYmxlZAorICAgICAqCisgICAgICogQHBhcmFtIGggSGFuZGxlciB0aGF0IHJlY2VpdmVzIHRoZSBub3RpZmljYXRpb24gbWVzc2FnZS4KKyAgICAgKiBAcGFyYW0gd2hhdCBVc2VyLWRlZmluZWQgbWVzc2FnZSBjb2RlLgorICAgICAqIEBwYXJhbSBvYmogVXNlciBvYmplY3QuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVnaXN0ZXJGb3JJbkNhbGxWb2ljZVByaXZhY3lPbihIYW5kbGVyIGgsIGludCB3aGF0LCBPYmplY3Qgb2JqKXt9CisKKyAgICAvKioKKyAgICAgKiBVbmVnaXN0ZXIgZm9yIG5vdGlmaWNhdGlvbnMgd2hlbiBhIHNJbkNhbGwgVm9pY2VQcml2YWN5IGlzIGVuYWJsZWQKKyAgICAgKgorICAgICAqIEBwYXJhbSBoIEhhbmRsZXIgdG8gYmUgcmVtb3ZlZCBmcm9tIHRoZSByZWdpc3RyYW50IGxpc3QuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdW5yZWdpc3RlckZvckluQ2FsbFZvaWNlUHJpdmFjeU9uKEhhbmRsZXIgaCl7fQorCisgICAgLyoqCisgICAgICogUmVnaXN0ZXIgZm9yIG5vdGlmaWNhdGlvbnMgd2hlbiBhIHNJbkNhbGwgVm9pY2VQcml2YWN5IGlzIGRpc2FibGVkCisgICAgICoKKyAgICAgKiBAcGFyYW0gaCBIYW5kbGVyIHRoYXQgcmVjZWl2ZXMgdGhlIG5vdGlmaWNhdGlvbiBtZXNzYWdlLgorICAgICAqIEBwYXJhbSB3aGF0IFVzZXItZGVmaW5lZCBtZXNzYWdlIGNvZGUuCisgICAgICogQHBhcmFtIG9iaiBVc2VyIG9iamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZWdpc3RlckZvckluQ2FsbFZvaWNlUHJpdmFjeU9mZihIYW5kbGVyIGgsIGludCB3aGF0LCBPYmplY3Qgb2JqKXt9CisKKyAgICAvKioKKyAgICAgKiBVbmVnaXN0ZXIgZm9yIG5vdGlmaWNhdGlvbnMgd2hlbiBhIHNJbkNhbGwgVm9pY2VQcml2YWN5IGlzIGRpc2FibGVkCisgICAgICoKKyAgICAgKiBAcGFyYW0gaCBIYW5kbGVyIHRvIGJlIHJlbW92ZWQgZnJvbSB0aGUgcmVnaXN0cmFudCBsaXN0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHVucmVnaXN0ZXJGb3JJbkNhbGxWb2ljZVByaXZhY3lPZmYoSGFuZGxlciBoKXt9CisKKyAgICAvKioKKyAgICAgKiBSZWdpc3RlciBmb3Igbm90aWZpY2F0aW9ucyB3aGVuIENETUEgT1RBIFByb3Zpc2lvbiBzdGF0dXMgY2hhbmdlCisgICAgICoKKyAgICAgKiBAcGFyYW0gaCBIYW5kbGVyIHRoYXQgcmVjZWl2ZXMgdGhlIG5vdGlmaWNhdGlvbiBtZXNzYWdlLgorICAgICAqIEBwYXJhbSB3aGF0IFVzZXItZGVmaW5lZCBtZXNzYWdlIGNvZGUuCisgICAgICogQHBhcmFtIG9iaiBVc2VyIG9iamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZWdpc3RlckZvckNkbWFPdGFTdGF0dXNDaGFuZ2UoSGFuZGxlciBoLCBpbnQgd2hhdCwgT2JqZWN0IG9iail7fQorCisgICAgLyoqCisgICAgICogVW5lZ2lzdGVyIGZvciBub3RpZmljYXRpb25zIHdoZW4gQ0RNQSBPVEEgUHJvdmlzaW9uIHN0YXR1cyBjaGFuZ2UKKyAgICAgKiBAcGFyYW0gaCBIYW5kbGVyIHRvIGJlIHJlbW92ZWQgZnJvbSB0aGUgcmVnaXN0cmFudCBsaXN0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHVucmVnaXN0ZXJGb3JDZG1hT3RhU3RhdHVzQ2hhbmdlKEhhbmRsZXIgaCl7fQorCisgICAgLyoqCisgICAgICogUmVnaXN0cmF0aW9uIHBvaW50IGZvciBzdWJzY3JpcHRpb24gaW5mbyByZWFkeQorICAgICAqIEBwYXJhbSBoIGhhbmRsZXIgdG8gbm90aWZ5CisgICAgICogQHBhcmFtIHdoYXQgd2hhdCBjb2RlIG9mIG1lc3NhZ2Ugd2hlbiBkZWxpdmVyZWQKKyAgICAgKiBAcGFyYW0gb2JqIHBsYWNlZCBpbiBNZXNzYWdlLm9iagorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyRm9yU3Vic2NyaXB0aW9uSW5mb1JlYWR5KEhhbmRsZXIgaCwgaW50IHdoYXQsIE9iamVjdCBvYmope30KKworICAgIC8qKgorICAgICAqIFVucmVnaXN0ZXIgZm9yIG5vdGlmaWNhdGlvbnMgZm9yIHN1YnNjcmlwdGlvbiBpbmZvCisgICAgICogQHBhcmFtIGggSGFuZGxlciB0byBiZSByZW1vdmVkIGZyb20gdGhlIHJlZ2lzdHJhbnQgbGlzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB1bnJlZ2lzdGVyRm9yU3Vic2NyaXB0aW9uSW5mb1JlYWR5KEhhbmRsZXIgaCl7fQorCisgICAgcHJpdmF0ZSBIYW5kbGVyIG1IYW5kbGVyID0gbmV3IEhhbmRsZXIoKSB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoTWVzc2FnZSBtc2cpIHsKKyAgICAgICAgICAgIHN3aXRjaCAobXNnLndoYXQpIHsKKyAgICAgICAgICAgICAgICBjYXNlIEVWRU5UX0RJU0NPTk5FQ1Q6CisgICAgICAgICAgICAgICAgICAgIG1EaXNjb25uZWN0UmVnaXN0cmFudHMubm90aWZ5UmVnaXN0cmFudHMoKEFzeW5jUmVzdWx0KSBtc2cub2JqKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBFVkVOVF9DQUxMX1NUQVRFX0NIQU5HRUQ6CisgICAgICAgICAgICAgICAgICAgIG1QcmVjaXNlQ2FsbFN0YXRlUmVnaXN0cmFudHMubm90aWZ5UmVnaXN0cmFudHMoKEFzeW5jUmVzdWx0KSBtc2cub2JqKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9OworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9Db21tYW5kc0ludGVyZmFjZS5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0NvbW1hbmRzSW50ZXJmYWNlLmphdmEKaW5kZXggOGUwM2M1YS4uNWYyN2UzZiAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0NvbW1hbmRzSW50ZXJmYWNlLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0NvbW1hbmRzSW50ZXJmYWNlLmphdmEKQEAgLTI3LDggKzI3LDggQEAKICAqLwogcHVibGljIGludGVyZmFjZSBDb21tYW5kc0ludGVyZmFjZSB7CiAgICAgZW51bSBSYWRpb1N0YXRlIHsKLSAgICAgICAgUkFESU9fT0ZGLCAgICAgICAgIC8qIFJhZGlvIGV4cGxpY3RseSBwb3dlcmVkIG9mZiAoZWcgQ0ZVTj0wKSAqLwotICAgICAgICBSQURJT19VTkFWQUlMQUJMRSwgLyogUmFkaW8gdW5hdmFpbGFibGUgKGVnLCByZXNldHRpbmcgb3Igbm90IGJvb3RlZCkgKi8KKyAgICAgICAgUkFESU9fT0ZGLCAgICAgICAgIC8qIFJhZGlvIGV4cGxpY2l0bHkgcG93ZXJlZCBvZmYgKGUuZy4gQ0ZVTj0wKSAqLworICAgICAgICBSQURJT19VTkFWQUlMQUJMRSwgLyogUmFkaW8gdW5hdmFpbGFibGUgKGUuZy4gcmVzZXR0aW5nIG9yIG5vdCBib290ZWQpICovCiAgICAgICAgIFNJTV9OT1RfUkVBRFksICAgICAvKiBSYWRpbyBpcyBvbiwgYnV0IHRoZSBTSU0gaW50ZXJmYWNlIGlzIG5vdCByZWFkeSAqLwogICAgICAgICBTSU1fTE9DS0VEX09SX0FCU0VOVCwgIC8qIFNJTSBQSU4gbG9ja2VkLCBQVUsgcmVxdWlyZWQsIG5ldHdvcmsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJzb25hbGl6YXRpb24sIG9yIFNJTSBhYnNlbnQgKi8KQEAgLTEyMSw3ICsxMjEsNyBAQAogICAgIC8vIFNlZSAyNy4wMDcgK0NDRkMgb3IgK0NMQ0sKICAgICBzdGF0aWMgZmluYWwgaW50IFNFUlZJQ0VfQ0xBU1NfTk9ORSAgICAgPSAwOyAvLyBubyB1c2VyIGlucHV0CiAgICAgc3RhdGljIGZpbmFsIGludCBTRVJWSUNFX0NMQVNTX1ZPSUNFICAgID0gKDEgPDwgMCk7Ci0gICAgc3RhdGljIGZpbmFsIGludCBTRVJWSUNFX0NMQVNTX0RBVEEgICAgID0gKDEgPDwgMSk7IC8vc3lub3ltIGZvciAxNiszMis2NCsxMjgKKyAgICBzdGF0aWMgZmluYWwgaW50IFNFUlZJQ0VfQ0xBU1NfREFUQSAgICAgPSAoMSA8PCAxKTsgLy9zeW5vbnltIGZvciAxNiszMis2NCsxMjgKICAgICBzdGF0aWMgZmluYWwgaW50IFNFUlZJQ0VfQ0xBU1NfRkFYICAgICAgPSAoMSA8PCAyKTsKICAgICBzdGF0aWMgZmluYWwgaW50IFNFUlZJQ0VfQ0xBU1NfU01TICAgICAgPSAoMSA8PCAzKTsKICAgICBzdGF0aWMgZmluYWwgaW50IFNFUlZJQ0VfQ0xBU1NfREFUQV9TWU5DID0gKDEgPDwgNCk7CkBAIC05NTIsMTkgKzk1MiwxOSBAQAogICAgIHZvaWQgd3JpdGVTbXNUb1J1aW0oaW50IHN0YXR1cywgU3RyaW5nIHBkdSwgTWVzc2FnZSByZXNwb25zZSk7CiAKICAgICAvKioKLSAgICAgKiBAZGVwcmVjYXRlZAogICAgICAqIEBwYXJhbSBhcG4KICAgICAgKiBAcGFyYW0gdXNlcgogICAgICAqIEBwYXJhbSBwYXNzd29yZAogICAgICAqIEBwYXJhbSByZXNwb25zZQogICAgICAqLworICAgIEBEZXByZWNhdGVkCiAgICAgdm9pZCBzZXR1cERlZmF1bHRQRFAoU3RyaW5nIGFwbiwgU3RyaW5nIHVzZXIsIFN0cmluZyBwYXNzd29yZCwgTWVzc2FnZSByZXNwb25zZSk7CiAKICAgICAvKioKLSAgICAgKiBAZGVwcmVjYXRlZAogICAgICAqIEBwYXJhbSBjaWQKICAgICAgKiBAcGFyYW0gcmVzcG9uc2UKICAgICAgKi8KKyAgICBARGVwcmVjYXRlZAogICAgIHZvaWQgZGVhY3RpdmF0ZURlZmF1bHRQRFAoaW50IGNpZCwgTWVzc2FnZSByZXNwb25zZSk7CiAKICAgICB2b2lkIHNldFJhZGlvUG93ZXIoYm9vbGVhbiBvbiwgTWVzc2FnZSByZXNwb25zZSk7CkBAIC05NzQsNyArOTc0LDcgQEAKICAgICB2b2lkIGFja25vd2xlZGdlTGFzdEluY29taW5nQ2RtYVNtcyhib29sZWFuIHN1Y2Nlc3MsIGludCBjYXVzZSwgTWVzc2FnZSByZXNwb25zZSk7CiAKICAgICAvKioKLSAgICAgKiBwYXJhbWV0ZXJzIGVxdWl2aWxpZW50IHRvIDI3LjAwNyBBVCtDUlNNIGNvbW1hbmQKKyAgICAgKiBwYXJhbWV0ZXJzIGVxdWl2YWxlbnQgdG8gMjcuMDA3IEFUK0NSU00gY29tbWFuZAogICAgICAqIHJlc3BvbnNlLm9iaiB3aWxsIGJlIGFuIEFzeW5jUmVzdWx0CiAgICAgICogcmVzcG9uc2Uub2JqLnVzZXJPYmogd2lsbCBiZSBhIEljY0lvUmVzdWx0IG9uIHN1Y2Nlc3MKICAgICAgKi8KQEAgLTEwNzksNyArMTA3OSw3IEBACiAKICAgICAvKioKICAgICAgKiAoQXN5bmNSZXN1bHQpcmVzcG9uc2Uub2JqKS5yZXN1bHQgd2lsbCBiZSBhbiBJbnRlZ2VyIHJlcHJlc2VudGluZwotICAgICAqIHRoZSBzdW0gb2YgZW5hYmxlZCBzZXJpdmljZSBjbGFzc2VzIChzdW0gb2YgU0VSVklDRV9DTEFTU18qKQorICAgICAqIHRoZSBzdW0gb2YgZW5hYmxlZCBzZXJ2aWNlIGNsYXNzZXMgKHN1bSBvZiBTRVJWSUNFX0NMQVNTXyopCiAgICAgICoKICAgICAgKiBAcGFyYW0gZmFjaWxpdHkgb25lIG9mIENCX0ZBQ0lMVFlfKgogICAgICAqIEBwYXJhbSBwYXNzd29yZCBwYXNzd29yZCBvciAiIiBpZiBub3QgcmVxdWlyZWQKQEAgLTExNTIsNyArMTE1Miw3IEBACiAKICAgICAvKioKICAgICAgKiBSZXF1ZXN0IHRvIGVuYWJsZS9kaXNhYmxlIG5ldHdvcmsgc3RhdGUgY2hhbmdlIG5vdGlmaWNhdGlvbnMgd2hlbgotICAgICAqIGxvY2F0aW9uIGluZm9ybWF0ZWlvbiAobGFjIGFuZC9vciBjaWQpIGhhcyBjaGFuZ2VkLgorICAgICAqIGxvY2F0aW9uIGluZm9ybWF0aW9uIChsYWMgYW5kL29yIGNpZCkgaGFzIGNoYW5nZWQuCiAgICAgICoKICAgICAgKiBAcGFyYW0gZW5hYmxlIHRydWUgdG8gZW5hYmxlLCBmYWxzZSB0byBkaXNhYmxlCiAgICAgICogQHBhcmFtIHJlc3BvbnNlIGNhbGxiYWNrIG1lc3NhZ2UKQEAgLTExODMsNyArMTE4Myw3IEBACiAKICAgICAvKioKICAgICAgKiBJbmRpY2F0ZXMgdG8gdGhlIHZlbmRvciByaWwgdGhhdCBTdGtTZXJ2aWNlIGlzIHJ1bm5pbmcKLSAgICAgKiByYW5kIGlzIGVhZHkgdG8gcmVjZWl2ZSBSSUxfVU5TT0xfU1RLX1hYWFggY29tbWFuZHMuCisgICAgICogYW5kIGlzIHJlYWR5IHRvIHJlY2VpdmUgUklMX1VOU09MX1NUS19YWFhYIGNvbW1hbmRzLgogICAgICAqCiAgICAgICogQHBhcmFtIHJlc3VsdCBjYWxsYmFjayBtZXNzYWdlCiAgICAgICovCmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvRGF0YUNvbm5lY3Rpb25UcmFja2VyLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvRGF0YUNvbm5lY3Rpb25UcmFja2VyLmphdmEKaW5kZXggM2I5ZTZjYy4uZTcxZmUyZSAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0RhdGFDb25uZWN0aW9uVHJhY2tlci5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9EYXRhQ29ubmVjdGlvblRyYWNrZXIuamF2YQpAQCAtMTg4LDcgKzE4OCwxMCBAQAogICAgIC8qKiBDSUQgb2YgYWN0aXZlIGRhdGEgY29ubmVjdGlvbiAqLwogICAgIHByb3RlY3RlZCBpbnQgY2lkQWN0aXZlOwogCi0gICAvKioKKyAgICAvKiogaW5kaWNhdGlvbiBvZiBvdXIgYXZhaWxhYmlsaXR5IChwcmVjb25kaXRpb25zIHRvIHRyeXNldHVwRGF0YSBhcmUgbWV0KSAqKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBtQXZhaWxhYmlsaXR5ID0gZmFsc2U7CisKKyAgICAvKioKICAgICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yCiAgICAgICovCiAgICAgcHJvdGVjdGVkIERhdGFDb25uZWN0aW9uVHJhY2tlcihQaG9uZUJhc2UgcGhvbmUpIHsKQEAgLTQyMSw3ICs0MjQsODQgQEAKIAogICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHNldFN0YXRlKFN0YXRlIHMpOwogCi0gICAgcHJvdGVjdGVkIHN5bmNocm9uaXplZCBib29sZWFuIGlzRW5hYmxlZChpbnQgaWQpIHsKKyAgICAvLyB0ZWxsIGFsbCBhY3RpdmUgYXBucyBvZiB0aGUgY3VycmVudCBjb25kaXRpb24KKyAgICBwcm90ZWN0ZWQgdm9pZCBub3RpZnlEYXRhQ29ubmVjdGlvbihTdHJpbmcgcmVhc29uKSB7CisgICAgICAgIGZvciAoaW50IGlkID0gMDsgaWQgPCBBUE5fTlVNX1RZUEVTOyBpZCsrKSB7CisgICAgICAgICAgICBpZiAoZGF0YUVuYWJsZWRbaWRdKSB7CisgICAgICAgICAgICAgICAgcGhvbmUubm90aWZ5RGF0YUNvbm5lY3Rpb24ocmVhc29uLCBhcG5JZFRvVHlwZShpZCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG5vdGlmeURhdGFBdmFpbGFiaWxpdHkocmVhc29uKTsKKyAgICB9CisKKyAgICAvLyBhIG5ldyBBUE4gaGFzIGdvbmUgYWN0aXZlIGFuZCBuZWVkcyB0byBzZW5kIGV2ZW50cyB0byBjYXRjaCB1cCB3aXRoIHRoZSBjdXJyZW50IGNvbmRpdGlvbgorICAgIHByaXZhdGUgdm9pZCBub3RpZnlBcG5JZFVwVG9DdXJyZW50KFN0cmluZyByZWFzb24sIGludCBhcG5JZCkgeworICAgICAgICBzd2l0Y2ggKHN0YXRlKSB7CisgICAgICAgICAgICBjYXNlIElETEU6CisgICAgICAgICAgICBjYXNlIElOSVRJTkc6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIENPTk5FQ1RJTkc6CisgICAgICAgICAgICBjYXNlIFNDQU5OSU5HOgorICAgICAgICAgICAgICAgIHBob25lLm5vdGlmeURhdGFDb25uZWN0aW9uKHJlYXNvbiwgYXBuSWRUb1R5cGUoYXBuSWQpLCBQaG9uZS5EYXRhU3RhdGUuQ09OTkVDVElORyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIENPTk5FQ1RFRDoKKyAgICAgICAgICAgIGNhc2UgRElTQ09OTkVDVElORzoKKyAgICAgICAgICAgICAgICBwaG9uZS5ub3RpZnlEYXRhQ29ubmVjdGlvbihyZWFzb24sIGFwbklkVG9UeXBlKGFwbklkKSwgUGhvbmUuRGF0YVN0YXRlLkNPTk5FQ1RJTkcpOworICAgICAgICAgICAgICAgIHBob25lLm5vdGlmeURhdGFDb25uZWN0aW9uKHJlYXNvbiwgYXBuSWRUb1R5cGUoYXBuSWQpLCBQaG9uZS5EYXRhU3RhdGUuQ09OTkVDVEVEKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIHNpbmNlIHdlIG5vcm1hbGx5IGRvbid0IHNlbmQgaW5mbyB0byBhIGRpc2Nvbm5lY3RlZCBBUE4sIHdlIG5lZWQgdG8gZG8gdGhpcyBzcGVjaWFsbHkKKyAgICBwcml2YXRlIHZvaWQgbm90aWZ5QXBuSWREaXNjb25uZWN0ZWQoU3RyaW5nIHJlYXNvbiwgaW50IGFwbklkKSB7CisgICAgICAgIHBob25lLm5vdGlmeURhdGFDb25uZWN0aW9uKHJlYXNvbiwgYXBuSWRUb1R5cGUoYXBuSWQpLCBQaG9uZS5EYXRhU3RhdGUuRElTQ09OTkVDVEVEKTsKKyAgICB9CisKKyAgICAvLyBkaXNhYmxlZCBhcG4ncyBzdGlsbCBuZWVkIGF2YWlsL3VuYXZhaWwgbm90aWZpY2lhdGlvbnMgLSBzZW5kIHRoZW0gb3V0CisgICAgcHJvdGVjdGVkIHZvaWQgbm90aWZ5T2ZmQXBuc09mQXZhaWxhYmlsaXR5KFN0cmluZyByZWFzb24sIGJvb2xlYW4gYXZhaWxhYmlsaXR5KSB7CisgICAgICAgIGlmIChtQXZhaWxhYmlsaXR5ID09IGF2YWlsYWJpbGl0eSkgcmV0dXJuOworICAgICAgICBtQXZhaWxhYmlsaXR5ID0gYXZhaWxhYmlsaXR5OworICAgICAgICBmb3IgKGludCBpZCA9IDA7IGlkIDwgQVBOX05VTV9UWVBFUzsgaWQrKykgeworICAgICAgICAgICAgaWYgKCFpc0FwbklkRW5hYmxlZChpZCkpIHsKKyAgICAgICAgICAgICAgICBub3RpZnlBcG5JZERpc2Nvbm5lY3RlZChyZWFzb24sIGlkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIHdlIGhhZCBhbiBhdmFpbGFiaWxpdHkgY2hhbmdlIC0gdGVsbCB0aGUgbGlzdGVuZXJzCisgICAgcHJvdGVjdGVkIHZvaWQgbm90aWZ5RGF0YUF2YWlsYWJpbGl0eShTdHJpbmcgcmVhc29uKSB7CisgICAgICAgIC8vIG5vdGUgdGhhdCB3ZSBlaXRoZXIganVzdCB0dXJuZWQgYWxsIG9mZiBiZWNhdXNlIHdlIGxvc3QgYXZhaWxhYmlsaXR5CisgICAgICAgIC8vIG9yIGFsbCB3ZXJlIG9mZiBhbmQgY291bGQgbm93IGdvIG9uLCBzbyBvbmx5IGhhdmUgb2ZmIGFwbnMgdG8gd29ycnkgYWJvdXQKKyAgICAgICAgbm90aWZ5T2ZmQXBuc09mQXZhaWxhYmlsaXR5KHJlYXNvbiwgaXNEYXRhUG9zc2libGUoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIG9ubHkgY2lyY3Vtc3RhbmNlcyB1bmRlciB3aGljaCB3ZSByZXBvcnQgdGhhdCBkYXRhIGNvbm5lY3Rpdml0eSBpcyBub3QKKyAgICAgKiBwb3NzaWJsZSBhcmUKKyAgICAgKiA8dWw+CisgICAgICogPGxpPkRhdGEgaXMgZGlzYWxsb3dlZCAocm9hbWluZywgcG93ZXIgc3RhdGUsIHZvaWNlIGNhbGwsIGV0YykuPC9saT4KKyAgICAgKiA8bGk+VGhlIGN1cnJlbnQgZGF0YSBzdGF0ZSBpcyB7QGNvZGUgRElTQ09OTkVDVEVEfSBmb3IgYSByZWFzb24gb3RoZXIgdGhhbgorICAgICAqIGhhdmluZyBleHBsaWNpdGx5IGRpc2FibGVkIGNvbm5lY3Rpdml0eS4gSW4gb3RoZXIgd29yZHMsIGRhdGEgaXMgbm90IGF2YWlsYWJsZQorICAgICAqIGJlY2F1c2UgdGhlIHBob25lIGlzIG91dCBvZiBjb3ZlcmFnZSBvciBzb21lIGxpa2UgcmVhc29uLjwvbGk+CisgICAgICogPC91bD4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiBkYXRhIGNvbm5lY3Rpdml0eSBpcyBwb3NzaWJsZSwge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNEYXRhUG9zc2libGUoKSB7CisgICAgICAgIGJvb2xlYW4gcG9zc2libGUgPSAoaXNEYXRhQWxsb3dlZCgpICYmCisgICAgICAgICAgICAhKGdldERhdGFFbmFibGVkKCkgJiYgKHN0YXRlID09IFN0YXRlLkZBSUxFRCB8fCBzdGF0ZSA9PSBTdGF0ZS5JRExFKSkpOworICAgICAgICBpZiAoIXBvc3NpYmxlICYmIERCRyAmJiBpc0RhdGFBbGxvd2VkKCkpIHsKKyAgICAgICAgICAgIGxvZygiRGF0YSBub3QgcG9zc2libGUuICBObyBjb3ZlcmFnZTogZGF0YVN0YXRlID0gIiArIHN0YXRlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcG9zc2libGU7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gaXNEYXRhQWxsb3dlZCgpOworCisgICAgcHVibGljIGJvb2xlYW4gaXNBcG5UeXBlRW5hYmxlZChTdHJpbmcgYXBuVHlwZSkgeworICAgICAgICByZXR1cm4gaXNBcG5JZEVuYWJsZWQoYXBuVHlwZVRvSWQoYXBuVHlwZSkpOworICAgIH0KKworICAgIHByb3RlY3RlZCBzeW5jaHJvbml6ZWQgYm9vbGVhbiBpc0FwbklkRW5hYmxlZChpbnQgaWQpIHsKICAgICAgICAgaWYgKGlkICE9IEFQTl9JTlZBTElEX0lEKSB7CiAgICAgICAgICAgICByZXR1cm4gZGF0YUVuYWJsZWRbaWRdOwogICAgICAgICB9CkBAIC00NDQsMjIgKzUyNCwyMSBAQAogICAgICAgICAgICAgcmV0dXJuIFBob25lLkFQTl9SRVFVRVNUX0ZBSUxFRDsKICAgICAgICAgfQogCi0gICAgICAgIGlmIChEQkcpIExvZy5kKExPR19UQUcsICJlbmFibGVBcG5UeXBlKCIrdHlwZSsiKSwgaXNBcG5UeXBlQWN0aXZlID0gIgotICAgICAgICAgICAgICAgICsgaXNBcG5UeXBlQWN0aXZlKHR5cGUpICsgIiBhbmQgc3RhdGUgPSAiICsgc3RhdGUpOworICAgICAgICBpZiAoREJHKSB7CisgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiZW5hYmxlQXBuVHlwZSgiICsgdHlwZSArICIpLCBpc0FwblR5cGVBY3RpdmUgPSAiCisgICAgICAgICAgICAgICAgICAgICsgaXNBcG5UeXBlQWN0aXZlKHR5cGUpICsgIiwgaXNBcG5JZEVuYWJsZWQgPSIgKyBpc0FwbklkRW5hYmxlZChpZCkgKworICAgICAgICAgICAgICAgICAgICAiIGFuZCBzdGF0ZSA9ICIgKyBzdGF0ZSk7CisgICAgICAgIH0KIAogICAgICAgICBpZiAoIWlzQXBuVHlwZUF2YWlsYWJsZSh0eXBlKSkgewogICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoTE9HX1RBRywgInR5cGUgbm90IGF2YWlsYWJsZSIpOwogICAgICAgICAgICAgcmV0dXJuIFBob25lLkFQTl9UWVBFX05PVF9BVkFJTEFCTEU7CiAgICAgICAgIH0KIAotICAgICAgICAvLyBqdXN0IGJlY2F1c2UgaXQncyBhY3RpdmUgZG9lc24ndCBtZWFuIHdlIGhhZCBpdCBleHBsaWNpdGx5IHJlcXVlc3RlZCBiZWZvcmUKLSAgICAgICAgLy8gKGEgYnJvYWQgZGVmYXVsdCBtYXkgaGFuZGxlIG1hbnkgdHlwZXMpLiAgbWFrZSBzdXJlIHdlIG1hcmsgaXQgZW5hYmxlZAotICAgICAgICAvLyBzbyBpZiB0aGUgZGVmYXVsdCBpcyBkaXNhYmxlZCB3ZSBrZWVwIHRoZSBjb25uZWN0aW9uIGZvciBvdGhlcnMKLSAgICAgICAgc2V0RW5hYmxlZChpZCwgdHJ1ZSk7Ci0KLSAgICAgICAgaWYgKGlzQXBuVHlwZUFjdGl2ZSh0eXBlKSkgewotICAgICAgICAgICAgaWYgKHN0YXRlID09IFN0YXRlLklOSVRJTkcpIHJldHVybiBQaG9uZS5BUE5fUkVRVUVTVF9TVEFSVEVEOwotICAgICAgICAgICAgZWxzZSBpZiAoc3RhdGUgPT0gU3RhdGUuQ09OTkVDVEVEKSByZXR1cm4gUGhvbmUuQVBOX0FMUkVBRFlfQUNUSVZFOworICAgICAgICBpZiAoaXNBcG5JZEVuYWJsZWQoaWQpKSB7CisgICAgICAgICAgICByZXR1cm4gUGhvbmUuQVBOX0FMUkVBRFlfQUNUSVZFOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2V0RW5hYmxlZChpZCwgdHJ1ZSk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIFBob25lLkFQTl9SRVFVRVNUX1NUQVJURUQ7CiAgICAgfQpAQCAtNDc4LDcgKzU1Nyw3IEBACiAgICAgICAgIGlmIChpZCA9PSBBUE5fSU5WQUxJRF9JRCkgewogICAgICAgICAgICAgcmV0dXJuIFBob25lLkFQTl9SRVFVRVNUX0ZBSUxFRDsKICAgICAgICAgfQotICAgICAgICBpZiAoaXNFbmFibGVkKGlkKSkgeworICAgICAgICBpZiAoaXNBcG5JZEVuYWJsZWQoaWQpKSB7CiAgICAgICAgICAgICBzZXRFbmFibGVkKGlkLCBmYWxzZSk7CiAgICAgICAgICAgICBpZiAoaXNBcG5UeXBlQWN0aXZlKFBob25lLkFQTl9UWVBFX0RFRkFVTFQpKSB7CiAgICAgICAgICAgICAgICAgaWYgKGRhdGFFbmFibGVkW0FQTl9ERUZBVUxUX0lEXSkgewpAQCAtNDk1LDkgKzU3NCwxMCBAQAogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBzZXRFbmFibGVkKGludCBpZCwgYm9vbGVhbiBlbmFibGUpIHsKLSAgICAgICAgaWYgKERCRykgTG9nLmQoTE9HX1RBRywgInNldEVuYWJsZWQoIiArIGlkICsgIiwgIiArIGVuYWJsZSArICIpIHdpdGggb2xkIHN0YXRlID0gIiArCi0gICAgICAgICAgICAgICAgZGF0YUVuYWJsZWRbaWRdICsgIiBhbmQgZW5hYmxlZENvdW50ID0gIiArIGVuYWJsZWRDb3VudCk7Ci0KKyAgICAgICAgaWYgKERCRykgeworICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgInNldEVuYWJsZWQoIiArIGlkICsgIiwgIiArIGVuYWJsZSArICIpIHdpdGggb2xkIHN0YXRlID0gIgorICAgICAgICAgICAgICAgICAgICArIGRhdGFFbmFibGVkW2lkXSArICIgYW5kIGVuYWJsZWRDb3VudCA9ICIgKyBlbmFibGVkQ291bnQpOworICAgICAgICB9CiAgICAgICAgIE1lc3NhZ2UgbXNnID0gb2J0YWluTWVzc2FnZShFVkVOVF9FTkFCTEVfTkVXX0FQTik7CiAgICAgICAgIG1zZy5hcmcxID0gaWQ7CiAgICAgICAgIG1zZy5hcmcyID0gKGVuYWJsZSA/IEVOQUJMRUQgOiBESVNBQkxFRCk7CkBAIC01MDcsOSArNTg3LDggQEAKICAgICBwcm90ZWN0ZWQgc3luY2hyb25pemVkIHZvaWQgb25FbmFibGVBcG4oaW50IGFwbklkLCBpbnQgZW5hYmxlZCkgewogICAgICAgICBpZiAoREJHKSB7CiAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiRVZFTlRfQVBOX0VOQUJMRV9SRVFVRVNUICIgKyBhcG5JZCArICIsICIgKyBlbmFibGVkKTsKLSAgICAgICAgICAgIExvZy5kKExPR19UQUcsICIgZGF0YUVuYWJsZWQgPSAiICsgZGF0YUVuYWJsZWRbYXBuSWRdICsKLSAgICAgICAgICAgICAgICAgICAgIiwgZW5hYmxlZENvdW50ID0gIiArIGVuYWJsZWRDb3VudCArCi0gICAgICAgICAgICAgICAgICAgICIsIGlzQXBuVHlwZUFjdGl2ZSA9ICIgKyBpc0FwblR5cGVBY3RpdmUoYXBuSWRUb1R5cGUoYXBuSWQpKSk7CisgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiIGRhdGFFbmFibGVkID0gIiArIGRhdGFFbmFibGVkW2FwbklkXSArICIsIGVuYWJsZWRDb3VudCA9ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlbmFibGVkQ291bnQgKyAiLCBpc0FwblR5cGVBY3RpdmUgPSAiICsgaXNBcG5UeXBlQWN0aXZlKGFwbklkVG9UeXBlKGFwbklkKSkpOwogICAgICAgICB9CiAgICAgICAgIGlmIChlbmFibGVkID09IEVOQUJMRUQpIHsKICAgICAgICAgICAgIGlmICghZGF0YUVuYWJsZWRbYXBuSWRdKSB7CkBAIC01MjAsNiArNTk5LDggQEAKICAgICAgICAgICAgIGlmICghaXNBcG5UeXBlQWN0aXZlKHR5cGUpKSB7CiAgICAgICAgICAgICAgICAgbVJlcXVlc3RlZEFwblR5cGUgPSB0eXBlOwogICAgICAgICAgICAgICAgIG9uRW5hYmxlTmV3QXBuKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG5vdGlmeUFwbklkVXBUb0N1cnJlbnQoUGhvbmUuUkVBU09OX0FQTl9TV0lUQ0hFRCwgYXBuSWQpOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgLy8gZGlzYWJsZQpAQCAtNTI4LDggKzYwOSwxNyBAQAogICAgICAgICAgICAgICAgIGVuYWJsZWRDb3VudC0tOwogICAgICAgICAgICAgICAgIGlmIChlbmFibGVkQ291bnQgPT0gMCkgewogICAgICAgICAgICAgICAgICAgICBvbkNsZWFuVXBDb25uZWN0aW9uKHRydWUsIFBob25lLlJFQVNPTl9EQVRBX0RJU0FCTEVEKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRhdGFFbmFibGVkW0FQTl9ERUZBVUxUX0lEXSA9PSB0cnVlICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAhaXNBcG5UeXBlQWN0aXZlKFBob25lLkFQTl9UWVBFX0RFRkFVTFQpKSB7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gc2VuZCB0aGUgZGlzY29ubmVjdCBtc2cgbWFudWFsbHksIHNpbmNlIHRoZSBub3JtYWwgcm91dGUgd29udCBzZW5kCisgICAgICAgICAgICAgICAgLy8gaXQgKGl0J3Mgbm90IGVuYWJsZWQpCisgICAgICAgICAgICAgICAgbm90aWZ5QXBuSWREaXNjb25uZWN0ZWQoUGhvbmUuUkVBU09OX0RBVEFfRElTQUJMRUQsIGFwbklkKTsKKyAgICAgICAgICAgICAgICBpZiAoZGF0YUVuYWJsZWRbQVBOX0RFRkFVTFRfSURdID09IHRydWUKKyAgICAgICAgICAgICAgICAgICAgICAgICYmICFpc0FwblR5cGVBY3RpdmUoUGhvbmUuQVBOX1RZUEVfREVGQVVMVCkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyAtIHRoaXMgaXMgYW4gdWdseSB3YXkgdG8gcmVzdG9yZSB0aGUgZGVmYXVsdCBjb25uIC0gc2hvdWxkIGJlIGRvbmUKKyAgICAgICAgICAgICAgICAgICAgLy8gYnkgYSByZWFsIGNvbnRlbnRpb24gbWFuYWdlciBhbmQgcG9saWN5IHRoYXQgZGlzY29ubmVjdHMgdGhlIGxvd2VyIHByaQorICAgICAgICAgICAgICAgICAgICAvLyBzdHVmZiBhcyBlbmFibGUgcmVxdWVzdHMgY29tZSBpbiBhbmQgcG9wcyB0aGVtIGJhY2sgb24gYXMgd2UgZGlzYWJsZSBiYWNrCisgICAgICAgICAgICAgICAgICAgIC8vIGRvd24gdG8gdGhlIGxvd2VyIHByaSBzdHVmZgogICAgICAgICAgICAgICAgICAgICBtUmVxdWVzdGVkQXBuVHlwZSA9IFBob25lLkFQTl9UWVBFX0RFRkFVTFQ7CiAgICAgICAgICAgICAgICAgICAgIG9uRW5hYmxlTmV3QXBuKCk7CiAgICAgICAgICAgICAgICAgfQpAQCAtNTc0LDcgKzY2NCw3IEBACiAgICAgICAgICAgICAgICAgb25UcnlTZXR1cERhdGEoUGhvbmUuUkVBU09OX0RBVEFfRU5BQkxFRCk7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIG9uQ2xlYW5VcENvbm5lY3Rpb24odHJ1ZSwgUGhvbmUuUkVBU09OX0RBVEFfRElTQUJMRUQpOwotICAgICAgICAgICB9CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9EZWZhdWx0UGhvbmVOb3RpZmllci5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0RlZmF1bHRQaG9uZU5vdGlmaWVyLmphdmEKaW5kZXggNGRhNGI2YS4uMDY0NjEwMSAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0RlZmF1bHRQaG9uZU5vdGlmaWVyLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0RlZmF1bHRQaG9uZU5vdGlmaWVyLmphdmEKQEAgLTkyLDE0ICs5MiwyNyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgbm90aWZ5RGF0YUNvbm5lY3Rpb24oUGhvbmUgc2VuZGVyLCBTdHJpbmcgcmVhc29uKSB7CisgICAgcHVibGljIHZvaWQgbm90aWZ5RGF0YUNvbm5lY3Rpb24oUGhvbmUgc2VuZGVyLCBTdHJpbmcgcmVhc29uLCBTdHJpbmcgYXBuVHlwZSkgeworICAgICAgICBkb05vdGlmeURhdGFDb25uZWN0aW9uKHNlbmRlciwgcmVhc29uLCBhcG5UeXBlLCBzZW5kZXIuZ2V0RGF0YUNvbm5lY3Rpb25TdGF0ZShhcG5UeXBlKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgbm90aWZ5RGF0YUNvbm5lY3Rpb24oUGhvbmUgc2VuZGVyLCBTdHJpbmcgcmVhc29uLCBTdHJpbmcgYXBuVHlwZSwKKyAgICAgICAgICAgIFBob25lLkRhdGFTdGF0ZSBzdGF0ZSkgeworICAgICAgICBkb05vdGlmeURhdGFDb25uZWN0aW9uKHNlbmRlciwgcmVhc29uLCBhcG5UeXBlLCBzdGF0ZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGRvTm90aWZ5RGF0YUNvbm5lY3Rpb24oUGhvbmUgc2VuZGVyLCBTdHJpbmcgcmVhc29uLCBTdHJpbmcgYXBuVHlwZSwKKyAgICAgICAgICAgIFBob25lLkRhdGFTdGF0ZSBzdGF0ZSkgeworICAgICAgICAvLyBUT0RPCisgICAgICAgIC8vIHVzZSBhcG5UeXBlIGFzIHRoZSBrZXkgdG8gd2hpY2ggY29ubmVjdGlvbiB3ZSdyZSB0YWxraW5nIGFib3V0LgorICAgICAgICAvLyBwYXNzIGFwblR5cGUgYmFjayB1cCB0byBmZXRjaCBwYXJ0aWN1bGFyIGZvciB0aGlzIG9uZS4KICAgICAgICAgVGVsZXBob255TWFuYWdlciB0ZWxlcGhvbnkgPSBUZWxlcGhvbnlNYW5hZ2VyLmdldERlZmF1bHQoKTsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIG1SZWdpc3RyeS5ub3RpZnlEYXRhQ29ubmVjdGlvbigKLSAgICAgICAgICAgICAgICAgICAgY29udmVydERhdGFTdGF0ZShzZW5kZXIuZ2V0RGF0YUNvbm5lY3Rpb25TdGF0ZSgpKSwKKyAgICAgICAgICAgICAgICAgICAgY29udmVydERhdGFTdGF0ZShzdGF0ZSksCiAgICAgICAgICAgICAgICAgICAgIHNlbmRlci5pc0RhdGFDb25uZWN0aXZpdHlQb3NzaWJsZSgpLCByZWFzb24sCiAgICAgICAgICAgICAgICAgICAgIHNlbmRlci5nZXRBY3RpdmVBcG4oKSwKLSAgICAgICAgICAgICAgICAgICAgc2VuZGVyLmdldEFjdGl2ZUFwblR5cGVzKCksCisgICAgICAgICAgICAgICAgICAgIGFwblR5cGUsCiAgICAgICAgICAgICAgICAgICAgIHNlbmRlci5nZXRJbnRlcmZhY2VOYW1lKG51bGwpLAogICAgICAgICAgICAgICAgICAgICAoKHRlbGVwaG9ueSE9bnVsbCkgPyB0ZWxlcGhvbnkuZ2V0TmV0d29ya1R5cGUoKSA6CiAgICAgICAgICAgICAgICAgICAgIFRlbGVwaG9ueU1hbmFnZXIuTkVUV09SS19UWVBFX1VOS05PV04pKTsKQEAgLTEwOCw5ICsxMjEsOSBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgbm90aWZ5RGF0YUNvbm5lY3Rpb25GYWlsZWQoUGhvbmUgc2VuZGVyLCBTdHJpbmcgcmVhc29uKSB7CisgICAgcHVibGljIHZvaWQgbm90aWZ5RGF0YUNvbm5lY3Rpb25GYWlsZWQoUGhvbmUgc2VuZGVyLCBTdHJpbmcgcmVhc29uLCBTdHJpbmcgYXBuVHlwZSkgewogICAgICAgICB0cnkgewotICAgICAgICAgICAgbVJlZ2lzdHJ5Lm5vdGlmeURhdGFDb25uZWN0aW9uRmFpbGVkKHJlYXNvbik7CisgICAgICAgICAgICBtUmVnaXN0cnkubm90aWZ5RGF0YUNvbm5lY3Rpb25GYWlsZWQocmVhc29uLCBhcG5UeXBlKTsKICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7CiAgICAgICAgICAgICAvLyBzeXN0ZW0gcHJvY2VzcyBpcyBkZWFkCiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9Hc21BbHBoYWJldC5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0dzbUFscGhhYmV0LmphdmEKaW5kZXggZWJkZDIyMC4uNzVlYTExNiAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0dzbUFscGhhYmV0LmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0dzbUFscGhhYmV0LmphdmEKQEAgLTE2LDE0ICsxNiwxMyBAQAogCiBwYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueTsKIAotaW1wb3J0IGFuZHJvaWQudGVsZXBob255LlNtc01lc3NhZ2U7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlNwYXJzZUludEFycmF5OwogCiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIAogLyoqCiAgKiBUaGlzIGNsYXNzIGltcGxlbWVudHMgdGhlIGNoYXJhY3RlciBzZXQgbWFwcGluZyBiZXR3ZWVuCi0gKiB0aGUgR1NNIFNNUyA3LWJpdCBhbHBoYWJldCBzcGVjaWZlZCBpbiBUUyAyMy4wMzggNi4yLjEKKyAqIHRoZSBHU00gU01TIDctYml0IGFscGhhYmV0IHNwZWNpZmllZCBpbiBUUyAyMy4wMzggNi4yLjEKICAqIGFuZCBVVEYtMTYKICAqCiAgKiB7QGhpZGV9CkBAIC0xNzEsNyArMTcwLDcgQEAKICAgICAgKiBhcnJheSBjYW5ub3QgY29udGFpbiBtb3JlIHRoYW4gMjU1IHNlcHRldHMuCiAgICAgICoKICAgICAgKiBAcGFyYW0gZGF0YSBUaGUgdGV4dCBzdHJpbmcgdG8gZW5jb2RlLgotICAgICAqIEBwYXJhbSBoZWFkZXIgT3B0aW9uYWwgaGVhZGVyIChpbmNsdWRlaW5nIGxlbmd0aCBieXRlKSB0aGF0IHByZWNlZGVzCisgICAgICogQHBhcmFtIGhlYWRlciBPcHRpb25hbCBoZWFkZXIgKGluY2x1ZGluZyBsZW5ndGggYnl0ZSkgdGhhdCBwcmVjZWRlcwogICAgICAqIHRoZSBlbmNvZGVkIGRhdGEsIHBhZGRlZCB0byBzZXB0ZXQgYm91bmRhcnkuCiAgICAgICogQHJldHVybiBCeXRlIGFycmF5IGNvbnRhaW5pbmcgaGVhZGVyIGFuZCBlbmNvZGVkIGRhdGEuCiAgICAgICovCkBAIC0yMDQsNyArMjAzLDcgQEAKICAgICAgKiB0aGUgcGFja2VkIHNlcHRldHMuIFRoZSByZXR1cm5lZCBhcnJheSBjYW5ub3QgY29udGFpbiBtb3JlIHRoYW4gMjU1CiAgICAgICogc2VwdGV0cy4KICAgICAgKgotICAgICAqIEBwYXJhbSBkYXRhIHRoZSBkYXRhIHN0cmluZyB0byBlbmRjb2RlCisgICAgICogQHBhcmFtIGRhdGEgdGhlIGRhdGEgc3RyaW5nIHRvIGVuY29kZQogICAgICAqIEB0aHJvd3MgRW5jb2RlRXhjZXB0aW9uIGlmIFN0cmluZyBpcyB0b28gbGFyZ2UgdG8gZW5jb2RlCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBieXRlW10gc3RyaW5nVG9Hc203Qml0UGFja2VkKFN0cmluZyBkYXRhKQpAQCAtMjIzLDcgKzIyMiw3IEBACiAgICAgICoKICAgICAgKiBAcGFyYW0gZGF0YSB0aGUgdGV4dCB0byBjb252ZXJ0IHRvIHNlcHRldHMKICAgICAgKiBAcGFyYW0gc3RhcnRpbmdTZXB0ZXRPZmZzZXQgdGhlIG51bWJlciBvZiBwYWRkaW5nIHNlcHRldHMgdG8gcHV0IGJlZm9yZQotICAgICAqICB0aGUgY2hhcmFjdGVyIGRhdGEgYXQgdGhlIGJlZ2luaW5nIG9mIHRoZSBhcnJheQorICAgICAqICB0aGUgY2hhcmFjdGVyIGRhdGEgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgYXJyYXkKICAgICAgKiBAcGFyYW0gdGhyb3dFeGNlcHRpb24gSWYgdHJ1ZSwgdGhyb3dzIEVuY29kZUV4Y2VwdGlvbiBvbiBpbnZhbGlkIGNoYXIuCiAgICAgICogICBJZiBmYWxzZSwgcmVwbGFjZXMgdW5lbmNvZGFibGUgY2hhciB3aXRoIEdTTSBhbHBoYWJldCBzcGFjZSBjaGFyLgogICAgICAqCkBAIC0yNTcsNyArMjU2LDcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBQYWNrIGEgNy1iaXQgY2hhciBpbnRvIGl0cyBhcHByb3BpcmF0ZSBwbGFjZSBpbiBhIGJ5dGUgYXJyYXkKKyAgICAgKiBQYWNrIGEgNy1iaXQgY2hhciBpbnRvIGl0cyBhcHByb3ByaWF0ZSBwbGFjZSBpbiBhIGJ5dGUgYXJyYXkKICAgICAgKgogICAgICAqIEBwYXJhbSBiaXRPZmZzZXQgdGhlIGJpdCBvZmZzZXQgdGhhdCB0aGUgc2VwdGV0IHNob3VsZCBiZSBwYWNrZWQgYXQKICAgICAgKiAgICAgICAgICAgICAgICAgIChzZXB0ZXQgaW5kZXggKiA3KQpAQCAtMzIwLDcgKzMxOSw3IEBACiAKICAgICAgICAgICAgICAgICBnc21WYWwgPSAoMHg3ZiAmIChwZHVbb2Zmc2V0ICsgYnl0ZU9mZnNldF0gPj4gc2hpZnQpKTsKIAotICAgICAgICAgICAgICAgIC8vIGlmIGl0IGNyb3NzZXMgYSBieXRlIGJvdW5kcnkKKyAgICAgICAgICAgICAgICAvLyBpZiBpdCBjcm9zc2VzIGEgYnl0ZSBib3VuZGFyeQogICAgICAgICAgICAgICAgIGlmIChzaGlmdCA+IDEpIHsKICAgICAgICAgICAgICAgICAgICAgLy8gc2V0IG1zYiBiaXRzIHRvIDAKICAgICAgICAgICAgICAgICAgICAgZ3NtVmFsICY9IDB4N2YgPj4gKHNoaWZ0IC0gMSk7CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvSVRlbGVwaG9ueS5haWRsIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0lUZWxlcGhvbnkuYWlkbAppbmRleCAyMzI4NzE3Li43YTE1ODdiIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvSVRlbGVwaG9ueS5haWRsCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9JVGVsZXBob255LmFpZGwKQEAgLTIzOSw5ICsyMzksMTEgQEAKICAgICBTdHJpbmcgZ2V0Q2RtYUVyaVRleHQoKTsKIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiBDRE1BIHByb3Zpc2lvbmluZyBuZWVkcyB0byBydW4uCisgICAgICogUmV0dXJucyB0cnVlIGlmIE9UQSBzZXJ2aWNlIHByb3Zpc2lvbmluZyBuZWVkcyB0byBydW4uCisgICAgICogT25seSByZWxldmFudCBvbiBzb21lIHRlY2hub2xvZ2llcywgb3RoZXJzIHdpbGwgYWx3YXlzCisgICAgICogcmV0dXJuIGZhbHNlLgogICAgICAqLwotICAgIGJvb2xlYW4gZ2V0Q2RtYU5lZWRzUHJvdmlzaW9uaW5nKCk7CisgICAgYm9vbGVhbiBuZWVkc090YVNlcnZpY2VQcm92aXNpb25pbmcoKTsKIAogICAgIC8qKgogICAgICAgKiBSZXR1cm5zIHRoZSB1bnJlYWQgY291bnQgb2Ygdm9pY2VtYWlscwpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0lUZWxlcGhvbnlSZWdpc3RyeS5haWRsIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0lUZWxlcGhvbnlSZWdpc3RyeS5haWRsCmluZGV4IDViZjhlNTguLjc5YzJiNDAgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9JVGVsZXBob255UmVnaXN0cnkuYWlkbAorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvSVRlbGVwaG9ueVJlZ2lzdHJ5LmFpZGwKQEAgLTMyLDcgKzMyLDcgQEAKICAgICB2b2lkIG5vdGlmeUNhbGxGb3J3YXJkaW5nQ2hhbmdlZChib29sZWFuIGNmaSk7CiAgICAgdm9pZCBub3RpZnlEYXRhQWN0aXZpdHkoaW50IHN0YXRlKTsKICAgICB2b2lkIG5vdGlmeURhdGFDb25uZWN0aW9uKGludCBzdGF0ZSwgYm9vbGVhbiBpc0RhdGFDb25uZWN0aXZpdHlQb3NzaWJsZSwKLSAgICAgICAgICAgIFN0cmluZyByZWFzb24sIFN0cmluZyBhcG4sIGluIFN0cmluZ1tdIGFwblR5cGVzLCBTdHJpbmcgaW50ZXJmYWNlTmFtZSwgaW50IG5ldHdvcmtUeXBlKTsKLSAgICB2b2lkIG5vdGlmeURhdGFDb25uZWN0aW9uRmFpbGVkKFN0cmluZyByZWFzb24pOworICAgICAgICAgICAgU3RyaW5nIHJlYXNvbiwgU3RyaW5nIGFwbiwgU3RyaW5nIGFwblR5cGUsIFN0cmluZyBpbnRlcmZhY2VOYW1lLCBpbnQgbmV0d29ya1R5cGUpOworICAgIHZvaWQgbm90aWZ5RGF0YUNvbm5lY3Rpb25GYWlsZWQoU3RyaW5nIHJlYXNvbiwgU3RyaW5nIGFwblR5cGUpOwogICAgIHZvaWQgbm90aWZ5Q2VsbExvY2F0aW9uKGluIEJ1bmRsZSBjZWxsTG9jYXRpb24pOwogfQpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0ljY1Ntc0ludGVyZmFjZU1hbmFnZXIuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9JY2NTbXNJbnRlcmZhY2VNYW5hZ2VyLmphdmEKaW5kZXggOGE1YTZhZS4uNWZlZjZkZSAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0ljY1Ntc0ludGVyZmFjZU1hbmFnZXIuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvSWNjU21zSW50ZXJmYWNlTWFuYWdlci5qYXZhCkBAIC01Nyw3ICs1Nyw3IEBACiAgICAgICogQHBhcmFtIGRlc3RQb3J0IHRoZSBwb3J0IHRvIGRlbGl2ZXIgdGhlIG1lc3NhZ2UgdG8KICAgICAgKiBAcGFyYW0gZGF0YSB0aGUgYm9keSBvZiB0aGUgbWVzc2FnZSB0byBzZW5kCiAgICAgICogQHBhcmFtIHNlbnRJbnRlbnQgaWYgbm90IE5VTEwgdGhpcyA8Y29kZT5QZW5kaW5nSW50ZW50PC9jb2RlPiBpcwotICAgICAqICBicm9hZGNhc3Qgd2hlbiB0aGUgbWVzc2FnZSBpcyBzdWNlc3NmdWxseSBzZW50LCBvciBmYWlsZWQuCisgICAgICogIGJyb2FkY2FzdCB3aGVuIHRoZSBtZXNzYWdlIGlzIHN1Y2Nlc3NmdWxseSBzZW50LCBvciBmYWlsZWQuCiAgICAgICogIFRoZSByZXN1bHQgY29kZSB3aWxsIGJlIDxjb2RlPkFjdGl2aXR5LlJFU1VMVF9PSzxjb2RlPiBmb3Igc3VjY2VzcywKICAgICAgKiAgb3Igb25lIG9mIHRoZXNlIGVycm9yczo8YnI+CiAgICAgICogIDxjb2RlPlJFU1VMVF9FUlJPUl9HRU5FUklDX0ZBSUxVUkU8L2NvZGU+PGJyPgpAQCAtNjcsNyArNjcsNyBAQAogICAgICAqICB0aGUgZXh0cmEgImVycm9yQ29kZSIgY29udGFpbmluZyBhIHJhZGlvIHRlY2hub2xvZ3kgc3BlY2lmaWMgdmFsdWUsCiAgICAgICogIGdlbmVyYWxseSBvbmx5IHVzZWZ1bCBmb3IgdHJvdWJsZXNob290aW5nLjxicj4KICAgICAgKiAgVGhlIHBlci1hcHBsaWNhdGlvbiBiYXNlZCBTTVMgY29udHJvbCBjaGVja3Mgc2VudEludGVudC4gSWYgc2VudEludGVudAotICAgICAqICBpcyBOVUxMIHRoZSBjYWxsZXIgd2lsbCBiZSBjaGVja2VkIGFnYWluc3QgYWxsIHVua25vd24gYXBwbGljYWl0b25zLAorICAgICAqICBpcyBOVUxMIHRoZSBjYWxsZXIgd2lsbCBiZSBjaGVja2VkIGFnYWluc3QgYWxsIHVua25vd24gYXBwbGljYXRpb25zLAogICAgICAqICB3aGljaCBjYXVzZSBzbWFsbGVyIG51bWJlciBvZiBTTVMgdG8gYmUgc2VudCBpbiBjaGVja2luZyBwZXJpb2QuCiAgICAgICogQHBhcmFtIGRlbGl2ZXJ5SW50ZW50IGlmIG5vdCBOVUxMIHRoaXMgPGNvZGU+UGVuZGluZ0ludGVudDwvY29kZT4gaXMKICAgICAgKiAgYnJvYWRjYXN0IHdoZW4gdGhlIG1lc3NhZ2UgaXMgZGVsaXZlcmVkIHRvIHRoZSByZWNpcGllbnQuICBUaGUKQEAgLTk0LDcgKzk0LDcgQEAKICAgICAgKiAgdGhlIGN1cnJlbnQgZGVmYXVsdCBTTVNDCiAgICAgICogQHBhcmFtIHRleHQgdGhlIGJvZHkgb2YgdGhlIG1lc3NhZ2UgdG8gc2VuZAogICAgICAqIEBwYXJhbSBzZW50SW50ZW50IGlmIG5vdCBOVUxMIHRoaXMgPGNvZGU+UGVuZGluZ0ludGVudDwvY29kZT4gaXMKLSAgICAgKiAgYnJvYWRjYXN0IHdoZW4gdGhlIG1lc3NhZ2UgaXMgc3VjZXNzZnVsbHkgc2VudCwgb3IgZmFpbGVkLgorICAgICAqICBicm9hZGNhc3Qgd2hlbiB0aGUgbWVzc2FnZSBpcyBzdWNjZXNzZnVsbHkgc2VudCwgb3IgZmFpbGVkLgogICAgICAqICBUaGUgcmVzdWx0IGNvZGUgd2lsbCBiZSA8Y29kZT5BY3Rpdml0eS5SRVNVTFRfT0s8Y29kZT4gZm9yIHN1Y2Nlc3MsCiAgICAgICogIG9yIG9uZSBvZiB0aGVzZSBlcnJvcnM6PGJyPgogICAgICAqICA8Y29kZT5SRVNVTFRfRVJST1JfR0VORVJJQ19GQUlMVVJFPC9jb2RlPjxicj4KQEAgLTE0MCw3ICsxNDAsNyBAQAogICAgICAqICAgPGNvZGU+UkVTVUxUX0VSUk9SX1JBRElPX09GRjwvY29kZT4KICAgICAgKiAgIDxjb2RlPlJFU1VMVF9FUlJPUl9OVUxMX1BEVTwvY29kZT4uCiAgICAgICogIFRoZSBwZXItYXBwbGljYXRpb24gYmFzZWQgU01TIGNvbnRyb2wgY2hlY2tzIHNlbnRJbnRlbnQuIElmIHNlbnRJbnRlbnQKLSAgICAgKiAgaXMgTlVMTCB0aGUgY2FsbGVyIHdpbGwgYmUgY2hlY2tlZCBhZ2FpbnN0IGFsbCB1bmtub3duIGFwcGxpY2FpdG9ucywKKyAgICAgKiAgaXMgTlVMTCB0aGUgY2FsbGVyIHdpbGwgYmUgY2hlY2tlZCBhZ2FpbnN0IGFsbCB1bmtub3duIGFwcGxpY2F0aW9ucywKICAgICAgKiAgd2hpY2ggY2F1c2Ugc21hbGxlciBudW1iZXIgb2YgU01TIHRvIGJlIHNlbnQgaW4gY2hlY2tpbmcgcGVyaW9kLgogICAgICAqIEBwYXJhbSBkZWxpdmVyeUludGVudHMgaWYgbm90IG51bGwsIGFuIDxjb2RlPkFycmF5TGlzdDwvY29kZT4gb2YKICAgICAgKiAgIDxjb2RlPlBlbmRpbmdJbnRlbnQ8L2NvZGU+cyAob25lIGZvciBlYWNoIG1lc3NhZ2UgcGFydCkgdGhhdCBpcwpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0ljY1V0aWxzLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvSWNjVXRpbHMuamF2YQppbmRleCA5NTdlZGRkLi4wMDVhZTM3IDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvSWNjVXRpbHMuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvSWNjVXRpbHMuamF2YQpAQCAtMjY3LDkgKzI2NywxMSBAQAogCiAKICAgICAvKioKLSAgICAgKiBDb252ZXJ0cyBhIGJ5dGUgYXJyYXkgaW50byBhIFN0cmluZyBoZXhpZGVjaW1hbCBjaGFyYWN0ZXJzCisgICAgICogQ29udmVydHMgYSBieXRlIGFycmF5IGludG8gYSBTdHJpbmcgb2YgaGV4YWRlY2ltYWwgY2hhcmFjdGVycy4KICAgICAgKgotICAgICAqIG51bGwgcmV0dXJucyBudWxsCisgICAgICogQHBhcmFtIGJ5dGVzIGFuIGFycmF5IG9mIGJ5dGVzCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGhleCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYnl0ZXMgYXJyYXkKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIFN0cmluZwogICAgIGJ5dGVzVG9IZXhTdHJpbmcoYnl0ZVtdIGJ5dGVzKSB7CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvUGhvbmUuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9QaG9uZS5qYXZhCmluZGV4IDIzMzI1ZjYuLjcwMjkwMzEgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9QaG9uZS5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9QaG9uZS5qYXZhCkBAIC05OSw3ICs5OSw3IEBACiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBQSE9ORV9OQU1FX0tFWSA9ICJwaG9uZU5hbWUiOwogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkFJTFVSRV9SRUFTT05fS0VZID0gInJlYXNvbiI7CiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBTVEFURV9DSEFOR0VfUkVBU09OX0tFWSA9ICJyZWFzb24iOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREFUQV9BUE5fVFlQRVNfS0VZID0gImFwblR5cGUiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREFUQV9BUE5fVFlQRV9LRVkgPSAiYXBuVHlwZSI7CiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBEQVRBX0FQTl9LRVkgPSAiYXBuIjsKIAogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREFUQV9JRkFDRV9OQU1FX0tFWSA9ICJpZmFjZSI7CkBAIC0yNDEsMTMgKzI0MSwyMSBAQAogICAgIENlbGxMb2NhdGlvbiBnZXRDZWxsTG9jYXRpb24oKTsKIAogICAgIC8qKgotICAgICAqIEdldCB0aGUgY3VycmVudCBEYXRhU3RhdGUuIE5vIGNoYW5nZSBub3RpZmljYXRpb24gZXhpc3RzIGF0IHRoaXMKLSAgICAgKiBpbnRlcmZhY2UgLS0gdXNlCisgICAgICogR2V0IHRoZSBjdXJyZW50IGZvciB0aGUgZGVmYXVsdCBhcG4gRGF0YVN0YXRlLiBObyBjaGFuZ2Ugbm90aWZpY2F0aW9uCisgICAgICogZXhpc3RzIGF0IHRoaXMgaW50ZXJmYWNlIC0tIHVzZQogICAgICAqIHtAbGluayBhbmRyb2lkLnRlbGVwaG9ueS5QaG9uZVN0YXRlTGlzdGVuZXJ9IGluc3RlYWQuCiAgICAgICovCiAgICAgRGF0YVN0YXRlIGdldERhdGFDb25uZWN0aW9uU3RhdGUoKTsKIAogICAgIC8qKgorICAgICAqIEdldCB0aGUgY3VycmVudCBEYXRhU3RhdGUuIE5vIGNoYW5nZSBub3RpZmljYXRpb24gZXhpc3RzIGF0IHRoaXMKKyAgICAgKiBpbnRlcmZhY2UgLS0gdXNlCisgICAgICoge0BsaW5rIGFuZHJvaWQudGVsZXBob255LlBob25lU3RhdGVMaXN0ZW5lcn0gaW5zdGVhZC4KKyAgICAgKiBAcGFyYW0gYXBuVHlwZSBzcGVjaWZ5IGZvciB3aGljaCBhcG4gdG8gZ2V0IGNvbm5lY3Rpb24gc3RhdGUgaW5mby4KKyAgICAgKi8KKyAgICBEYXRhU3RhdGUgZ2V0RGF0YUNvbm5lY3Rpb25TdGF0ZShTdHJpbmcgYXBuVHlwZSk7CisKKyAgICAvKioKICAgICAgKiBHZXQgdGhlIGN1cnJlbnQgRGF0YUFjdGl2aXR5U3RhdGUuIE5vIGNoYW5nZSBub3RpZmljYXRpb24gZXhpc3RzIGF0IHRoaXMKICAgICAgKiBpbnRlcmZhY2UgLS0gdXNlCiAgICAgICoge0BsaW5rIGFuZHJvaWQudGVsZXBob255LlRlbGVwaG9ueU1hbmFnZXJ9IGluc3RlYWQuCkBAIC0xNTMzLDYgKzE1NDEsMTEgQEAKICAgICBib29sZWFuIGlzT3RhU3BOdW1iZXIoU3RyaW5nIGRpYWxTdHIpOwogCiAgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIE9UQSBTZXJ2aWNlIFByb3Zpc2lvbmluZyBuZWVkcyB0byBiZSBwZXJmb3JtZWQuCisgICAgICovCisgICAgYm9vbGVhbiBuZWVkc090YVNlcnZpY2VQcm92aXNpb25pbmcoKTsKKworICAgIC8qKgogICAgICAqIFJlZ2lzdGVyIGZvciBub3RpZmljYXRpb25zIHdoZW4gQ0RNQSBjYWxsIHdhaXRpbmcgY29tZXMKICAgICAgKgogICAgICAqIEBwYXJhbSBoIEhhbmRsZXIgdGhhdCByZWNlaXZlcyB0aGUgbm90aWZpY2F0aW9uIG1lc3NhZ2UuCmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvUGhvbmVCYXNlLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvUGhvbmVCYXNlLmphdmEKaW5kZXggNzQ2MDFlNi4uY2Y4MDY5MSAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1Bob25lQmFzZS5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9QaG9uZUJhc2UuamF2YQpAQCAtNzM3LDggKzczNywxMyBAQAogICAgICAgICBtTm90aWZpZXIubm90aWZ5TWVzc2FnZVdhaXRpbmdDaGFuZ2VkKHRoaXMpOwogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIG5vdGlmeURhdGFDb25uZWN0aW9uKFN0cmluZyByZWFzb24pIHsKLSAgICAgICAgbU5vdGlmaWVyLm5vdGlmeURhdGFDb25uZWN0aW9uKHRoaXMsIHJlYXNvbik7CisgICAgcHVibGljIHZvaWQgbm90aWZ5RGF0YUNvbm5lY3Rpb24oU3RyaW5nIHJlYXNvbiwgU3RyaW5nIGFwblR5cGUsCisgICAgICAgICAgICBQaG9uZS5EYXRhU3RhdGUgc3RhdGUpIHsKKyAgICAgICAgbU5vdGlmaWVyLm5vdGlmeURhdGFDb25uZWN0aW9uKHRoaXMsIHJlYXNvbiwgYXBuVHlwZSwgc3RhdGUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG5vdGlmeURhdGFDb25uZWN0aW9uKFN0cmluZyByZWFzb24sIFN0cmluZyBhcG5UeXBlKSB7CisgICAgICAgIG1Ob3RpZmllci5ub3RpZnlEYXRhQ29ubmVjdGlvbih0aGlzLCByZWFzb24sIGFwblR5cGUpOwogICAgIH0KIAogICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0UGhvbmVOYW1lKCk7CkBAIC04MjQsOSArODI5LDE5IEBACiAgICAgICAgIGxvZ1VuZXhwZWN0ZWRDZG1hTWV0aG9kQ2FsbCgidW5yZWdpc3RlckZvclN1YnNjcmlwdGlvbkluZm9SZWFkeSIpOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiBPVEEgU2VydmljZSBQcm92aXNpb25pbmcgbmVlZHMgdG8gYmUgcGVyZm9ybWVkLgorICAgICAqIElmIG5vdCBvdmVycmlkZGVuIHJldHVybiBmYWxzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBuZWVkc090YVNlcnZpY2VQcm92aXNpb25pbmcoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdHJ1ZSBpZiBudW1iZXIgaXMgYW4gT1RBU1AgbnVtYmVyLgorICAgICAqIElmIG5vdCBvdmVycmlkZGVuIHJldHVybiBmYWxzZS4KKyAgICAgKi8KICAgICBwdWJsaWMgIGJvb2xlYW4gaXNPdGFTcE51bWJlcihTdHJpbmcgZGlhbFN0cikgewotICAgICAgICAvLyBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBvdmVycmlkZGVuIGJ5IHRoZSBjbGFzcyBDRE1BUGhvbmUuIE5vdCBpbXBsZW1lbnRlZCBpbiBHU01QaG9uZS4KLSAgICAgICAgbG9nVW5leHBlY3RlZENkbWFNZXRob2RDYWxsKCJpc090YVNwTnVtYmVyIik7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKQEAgLTk1Miw2ICs5NjcsMTAgQEAKICAgICAgICAgcmV0dXJuIG1EYXRhQ29ubmVjdGlvbi5kaXNhYmxlQXBuVHlwZSh0eXBlKTsKICAgICB9CiAKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0RhdGFDb25uZWN0aXZpdHlQb3NzaWJsZSgpIHsKKyAgICAgICAgcmV0dXJuICgobURhdGFDb25uZWN0aW9uICE9IG51bGwpICYmIChtRGF0YUNvbm5lY3Rpb24uaXNEYXRhUG9zc2libGUoKSkpOworICAgIH0KKwogICAgIC8qKgogICAgICAqIHNpbXVsYXRlRGF0YUNvbm5lY3Rpb24KICAgICAgKgpAQCAtOTgwLDcgKzk5OSw3IEBACiAgICAgICAgIH0KIAogICAgICAgICBtRGF0YUNvbm5lY3Rpb24uc2V0U3RhdGUoZGNTdGF0ZSk7Ci0gICAgICAgIG5vdGlmeURhdGFDb25uZWN0aW9uKG51bGwpOworICAgICAgICBub3RpZnlEYXRhQ29ubmVjdGlvbihudWxsLCBQaG9uZS5BUE5fVFlQRV9ERUZBVUxUKTsKICAgICB9CiAKICAgICAvKioKQEAgLTEwMjYsNCArMTA0NSw4IEBACiAgICAgICAgIExvZy5lKExPR19UQUcsICJFcnJvciEgIiArIG5hbWUgKyAiKCkgaW4gUGhvbmVCYXNlIHNob3VsZCBub3QgYmUgIiArCiAgICAgICAgICAgICAgICAgImNhbGxlZCwgQ0RNQVBob25lIGluYWN0aXZlLiIpOwogICAgIH0KKworICAgIHB1YmxpYyBEYXRhU3RhdGUgZ2V0RGF0YUNvbm5lY3Rpb25TdGF0ZSgpIHsKKyAgICAgICAgcmV0dXJuIGdldERhdGFDb25uZWN0aW9uU3RhdGUoQVBOX1RZUEVfREVGQVVMVCk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1Bob25lTm90aWZpZXIuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9QaG9uZU5vdGlmaWVyLmphdmEKaW5kZXggZTk2ZWVhZS4uNjkxMjcxZiAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1Bob25lTm90aWZpZXIuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvUGhvbmVOb3RpZmllci5qYXZhCkBAIC0zMyw5ICszMywxMiBAQAogCiAgICAgcHVibGljIHZvaWQgbm90aWZ5Q2FsbEZvcndhcmRpbmdDaGFuZ2VkKFBob25lIHNlbmRlcik7CiAKLSAgICBwdWJsaWMgdm9pZCBub3RpZnlEYXRhQ29ubmVjdGlvbihQaG9uZSBzZW5kZXIsIFN0cmluZyByZWFzb24pOworICAgIHB1YmxpYyB2b2lkIG5vdGlmeURhdGFDb25uZWN0aW9uKFBob25lIHNlbmRlciwgU3RyaW5nIHJlYXNvbiwgU3RyaW5nIGFwblR5cGUpOwogCi0gICAgcHVibGljIHZvaWQgbm90aWZ5RGF0YUNvbm5lY3Rpb25GYWlsZWQoUGhvbmUgc2VuZGVyLCBTdHJpbmcgcmVhc29uKTsKKyAgICBwdWJsaWMgdm9pZCBub3RpZnlEYXRhQ29ubmVjdGlvbihQaG9uZSBzZW5kZXIsIFN0cmluZyByZWFzb24sIFN0cmluZyBhcG5UeXBlLAorICAgICAgICAgICAgUGhvbmUuRGF0YVN0YXRlIHN0YXRlKTsKKworICAgIHB1YmxpYyB2b2lkIG5vdGlmeURhdGFDb25uZWN0aW9uRmFpbGVkKFBob25lIHNlbmRlciwgU3RyaW5nIHJlYXNvbiwgU3RyaW5nIGFwblR5cGUpOwogCiAgICAgcHVibGljIHZvaWQgbm90aWZ5RGF0YUFjdGl2aXR5KFBob25lIHNlbmRlcik7CiAKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9QaG9uZVByb3h5LmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvUGhvbmVQcm94eS5qYXZhCmluZGV4IGUxNTExZTYuLmZiMmE5MzggMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9QaG9uZVByb3h5LmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1Bob25lUHJveHkuamF2YQpAQCAtMTcyLDcgKzE3MiwxMSBAQAogICAgIH0KIAogICAgIHB1YmxpYyBEYXRhU3RhdGUgZ2V0RGF0YUNvbm5lY3Rpb25TdGF0ZSgpIHsKLSAgICAgICAgcmV0dXJuIG1BY3RpdmVQaG9uZS5nZXREYXRhQ29ubmVjdGlvblN0YXRlKCk7CisgICAgICAgIHJldHVybiBtQWN0aXZlUGhvbmUuZ2V0RGF0YUNvbm5lY3Rpb25TdGF0ZShQaG9uZS5BUE5fVFlQRV9ERUZBVUxUKTsKKyAgICB9CisKKyAgICBwdWJsaWMgRGF0YVN0YXRlIGdldERhdGFDb25uZWN0aW9uU3RhdGUoU3RyaW5nIGFwblR5cGUpIHsKKyAgICAgICAgcmV0dXJuIG1BY3RpdmVQaG9uZS5nZXREYXRhQ29ubmVjdGlvblN0YXRlKGFwblR5cGUpOwogICAgIH0KIAogICAgIHB1YmxpYyBEYXRhQWN0aXZpdHlTdGF0ZSBnZXREYXRhQWN0aXZpdHlTdGF0ZSgpIHsKQEAgLTc2NCw2ICs3NjgsMTAgQEAKICAgICAgICAgbUFjdGl2ZVBob25lLmV4aXRFbWVyZ2VuY3lDYWxsYmFja01vZGUoKTsKICAgICB9CiAKKyAgICBwdWJsaWMgYm9vbGVhbiBuZWVkc090YVNlcnZpY2VQcm92aXNpb25pbmcoKXsKKyAgICAgICAgcmV0dXJuIG1BY3RpdmVQaG9uZS5uZWVkc090YVNlcnZpY2VQcm92aXNpb25pbmcoKTsKKyAgICB9CisKICAgICBwdWJsaWMgYm9vbGVhbiBpc090YVNwTnVtYmVyKFN0cmluZyBkaWFsU3RyKXsKICAgICAgICAgcmV0dXJuIG1BY3RpdmVQaG9uZS5pc090YVNwTnVtYmVyKGRpYWxTdHIpOwogICAgIH0KZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9SSUwuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9SSUwuamF2YQppbmRleCAyODMzZDU2Li5mMWQyNDg4IDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvUklMLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1JJTC5qYXZhCkBAIC0yODUsOSArMjg1LDggQEAKICAgICAgICAgfQogCiAKLSAgICAgICAgLy8qKioqKiBIYW5kbGVyIGltcGxlbWVtZW50YXRpb24KLQotICAgICAgICBwdWJsaWMgdm9pZAorICAgICAgICAvLyoqKioqIEhhbmRsZXIgaW1wbGVtZW50YXRpb24KKyAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkCiAgICAgICAgIGhhbmRsZU1lc3NhZ2UoTWVzc2FnZSBtc2cpIHsKICAgICAgICAgICAgIFJJTFJlcXVlc3QgcnIgPSAoUklMUmVxdWVzdCkobXNnLm9iaik7CiAgICAgICAgICAgICBSSUxSZXF1ZXN0IHJlcSA9IG51bGw7CkBAIC03ODAsNyArNzc5LDcgQEAKICAgICAgICAgc2VuZChycik7CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQKKyAgICBARGVwcmVjYXRlZCBwdWJsaWMgdm9pZAogICAgIGdldFBEUENvbnRleHRMaXN0KE1lc3NhZ2UgcmVzdWx0KSB7CiAgICAgICAgIGdldERhdGFDYWxsTGlzdChyZXN1bHQpOwogICAgIH0KZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9TTVNEaXNwYXRjaGVyLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvU01TRGlzcGF0Y2hlci5qYXZhCmluZGV4IGNhNTI2YTUuLjllMTdlYjEgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9TTVNEaXNwYXRjaGVyLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1NNU0Rpc3BhdGNoZXIuamF2YQpAQCAtMTQzLDcgKzE0Myw3IEBACiAKICAgICBwcml2YXRlIFNtc0NvdW50ZXIgbUNvdW50ZXI7CiAKLSAgICBwcml2YXRlIEFycmF5TGlzdCBtU1RyYWNrZXJzID0gbmV3IEFycmF5TGlzdChNT19NU0dfUVVFVUVfTElNSVQpOworICAgIHByaXZhdGUgQXJyYXlMaXN0PFNtc1RyYWNrZXI+IG1TVHJhY2tlcnMgPSBuZXcgQXJyYXlMaXN0PFNtc1RyYWNrZXI+KE1PX01TR19RVUVVRV9MSU1JVCk7CiAKICAgICAvKiogV2FrZSBsb2NrIHRvIGVuc3VyZSBkZXZpY2Ugc3RheXMgYXdha2Ugd2hpbGUgZGlzcGF0Y2hpbmcgdGhlIFNNUyBpbnRlbnQuICovCiAgICAgcHJpdmF0ZSBQb3dlck1hbmFnZXIuV2FrZUxvY2sgbVdha2VMb2NrOwpAQCAtMjY1LDYgKzI2NSw3IEBACiAgICAgICAgIG1DbS51bnJlZ2lzdGVyRm9yT24odGhpcyk7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKSB7CiAgICAgICAgIExvZy5kKFRBRywgIlNNU0Rpc3BhdGNoZXIgZmluYWxpemVkIik7CiAgICAgfQpAQCAtMzQ1LDcgKzM0Niw3IEBACiAgICAgICAgICAgICBtc2cub2JqID0gbnVsbDsKICAgICAgICAgICAgIGlmIChtU1RyYWNrZXJzLmlzRW1wdHkoKSA9PSBmYWxzZSkgewogICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIFNtc1RyYWNrZXIgc1RyYWNrZXIgPSAoU21zVHJhY2tlciltU1RyYWNrZXJzLnJlbW92ZSgwKTsKKyAgICAgICAgICAgICAgICAgICAgU21zVHJhY2tlciBzVHJhY2tlciA9IG1TVHJhY2tlcnMucmVtb3ZlKDApOwogICAgICAgICAgICAgICAgICAgICBzVHJhY2tlci5tU2VudEludGVudC5zZW5kKFJFU1VMVF9FUlJPUl9MSU1JVF9FWENFRURFRCk7CiAgICAgICAgICAgICAgICAgfSBjYXRjaCAoQ2FuY2VsZWRFeGNlcHRpb24gZXgpIHsKICAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiZmFpbGVkIHRvIHNlbmQgYmFjayBSRVNVTFRfRVJST1JfTElNSVRfRVhDRUVERUQiKTsKQEAgLTM1OCw3ICszNTksNyBAQAogCiAgICAgICAgIGNhc2UgRVZFTlRfU0VORF9DT05GSVJNRURfU01TOgogICAgICAgICAgICAgaWYgKG1TVHJhY2tlcnMuaXNFbXB0eSgpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgU21zVHJhY2tlciBzVHJhY2tlciA9IChTbXNUcmFja2VyKW1TVHJhY2tlcnMucmVtb3ZlKG1TVHJhY2tlcnMuc2l6ZSgpIC0gMSk7CisgICAgICAgICAgICAgICAgU21zVHJhY2tlciBzVHJhY2tlciA9IG1TVHJhY2tlcnMucmVtb3ZlKG1TVHJhY2tlcnMuc2l6ZSgpIC0gMSk7CiAgICAgICAgICAgICAgICAgaWYgKGlzTXVsdGlwYXJ0VHJhY2tlcihzVHJhY2tlcikpIHsKICAgICAgICAgICAgICAgICAgICAgc2VuZE11bHRpcGFydFNtcyhzVHJhY2tlcik7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKQEAgLTM3Miw3ICszNzMsNyBAQAogICAgICAgICAgICAgaWYgKG1TVHJhY2tlcnMuaXNFbXB0eSgpID09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSBsYXRlc3Qgb25lLgogICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIFNtc1RyYWNrZXIgc1RyYWNrZXIgPSAoU21zVHJhY2tlciltU1RyYWNrZXJzLnJlbW92ZShtU1RyYWNrZXJzLnNpemUoKSAtIDEpOworICAgICAgICAgICAgICAgICAgICBTbXNUcmFja2VyIHNUcmFja2VyID0gbVNUcmFja2Vycy5yZW1vdmUobVNUcmFja2Vycy5zaXplKCkgLSAxKTsKICAgICAgICAgICAgICAgICAgICAgc1RyYWNrZXIubVNlbnRJbnRlbnQuc2VuZChSRVNVTFRfRVJST1JfTElNSVRfRVhDRUVERUQpOwogICAgICAgICAgICAgICAgIH0gY2F0Y2ggKENhbmNlbGVkRXhjZXB0aW9uIGV4KSB7CiAgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgImZhaWxlZCB0byBzZW5kIGJhY2sgUkVTVUxUX0VSUk9SX0xJTUlUX0VYQ0VFREVEIik7CkBAIC02NzksNyArNjgwLDcgQEAKICAgICAgKiBAcGFyYW0gZGVzdFBvcnQgdGhlIHBvcnQgdG8gZGVsaXZlciB0aGUgbWVzc2FnZSB0bwogICAgICAqIEBwYXJhbSBkYXRhIHRoZSBib2R5IG9mIHRoZSBtZXNzYWdlIHRvIHNlbmQKICAgICAgKiBAcGFyYW0gc2VudEludGVudCBpZiBub3QgTlVMTCB0aGlzIDxjb2RlPlBlbmRpbmdJbnRlbnQ8L2NvZGU+IGlzCi0gICAgICogIGJyb2FkY2FzdCB3aGVuIHRoZSBtZXNzYWdlIGlzIHN1Y2Vzc2Z1bGx5IHNlbnQsIG9yIGZhaWxlZC4KKyAgICAgKiAgYnJvYWRjYXN0IHdoZW4gdGhlIG1lc3NhZ2UgaXMgc3VjY2Vzc2Z1bGx5IHNlbnQsIG9yIGZhaWxlZC4KICAgICAgKiAgVGhlIHJlc3VsdCBjb2RlIHdpbGwgYmUgPGNvZGU+QWN0aXZpdHkuUkVTVUxUX09LPGNvZGU+IGZvciBzdWNjZXNzLAogICAgICAqICBvciBvbmUgb2YgdGhlc2UgZXJyb3JzOjxicj4KICAgICAgKiAgPGNvZGU+UkVTVUxUX0VSUk9SX0dFTkVSSUNfRkFJTFVSRTwvY29kZT48YnI+CkBAIC02ODksNyArNjkwLDcgQEAKICAgICAgKiAgdGhlIGV4dHJhICJlcnJvckNvZGUiIGNvbnRhaW5pbmcgYSByYWRpbyB0ZWNobm9sb2d5IHNwZWNpZmljIHZhbHVlLAogICAgICAqICBnZW5lcmFsbHkgb25seSB1c2VmdWwgZm9yIHRyb3VibGVzaG9vdGluZy48YnI+CiAgICAgICogIFRoZSBwZXItYXBwbGljYXRpb24gYmFzZWQgU01TIGNvbnRyb2wgY2hlY2tzIHNlbnRJbnRlbnQuIElmIHNlbnRJbnRlbnQKLSAgICAgKiAgaXMgTlVMTCB0aGUgY2FsbGVyIHdpbGwgYmUgY2hlY2tlZCBhZ2FpbnN0IGFsbCB1bmtub3duIGFwcGxpY2FpdG9ucywKKyAgICAgKiAgaXMgTlVMTCB0aGUgY2FsbGVyIHdpbGwgYmUgY2hlY2tlZCBhZ2FpbnN0IGFsbCB1bmtub3duIGFwcGxpY2F0aW9ucywKICAgICAgKiAgd2hpY2ggY2F1c2Ugc21hbGxlciBudW1iZXIgb2YgU01TIHRvIGJlIHNlbnQgaW4gY2hlY2tpbmcgcGVyaW9kLgogICAgICAqIEBwYXJhbSBkZWxpdmVyeUludGVudCBpZiBub3QgTlVMTCB0aGlzIDxjb2RlPlBlbmRpbmdJbnRlbnQ8L2NvZGU+IGlzCiAgICAgICogIGJyb2FkY2FzdCB3aGVuIHRoZSBtZXNzYWdlIGlzIGRlbGl2ZXJlZCB0byB0aGUgcmVjaXBpZW50LiAgVGhlCkBAIC03MDYsNyArNzA3LDcgQEAKICAgICAgKiAgdGhlIGN1cnJlbnQgZGVmYXVsdCBTTVNDCiAgICAgICogQHBhcmFtIHRleHQgdGhlIGJvZHkgb2YgdGhlIG1lc3NhZ2UgdG8gc2VuZAogICAgICAqIEBwYXJhbSBzZW50SW50ZW50IGlmIG5vdCBOVUxMIHRoaXMgPGNvZGU+UGVuZGluZ0ludGVudDwvY29kZT4gaXMKLSAgICAgKiAgYnJvYWRjYXN0IHdoZW4gdGhlIG1lc3NhZ2UgaXMgc3VjZXNzZnVsbHkgc2VudCwgb3IgZmFpbGVkLgorICAgICAqICBicm9hZGNhc3Qgd2hlbiB0aGUgbWVzc2FnZSBpcyBzdWNjZXNzZnVsbHkgc2VudCwgb3IgZmFpbGVkLgogICAgICAqICBUaGUgcmVzdWx0IGNvZGUgd2lsbCBiZSA8Y29kZT5BY3Rpdml0eS5SRVNVTFRfT0s8Y29kZT4gZm9yIHN1Y2Nlc3MsCiAgICAgICogIG9yIG9uZSBvZiB0aGVzZSBlcnJvcnM6PGJyPgogICAgICAqICA8Y29kZT5SRVNVTFRfRVJST1JfR0VORVJJQ19GQUlMVVJFPC9jb2RlPjxicj4KQEAgLTc0Miw3ICs3NDMsNyBAQAogICAgICAqICAgPGNvZGU+UkVTVUxUX0VSUk9SX1JBRElPX09GRjwvY29kZT4KICAgICAgKiAgIDxjb2RlPlJFU1VMVF9FUlJPUl9OVUxMX1BEVTwvY29kZT4uCiAgICAgICogIFRoZSBwZXItYXBwbGljYXRpb24gYmFzZWQgU01TIGNvbnRyb2wgY2hlY2tzIHNlbnRJbnRlbnQuIElmIHNlbnRJbnRlbnQKLSAgICAgKiAgaXMgTlVMTCB0aGUgY2FsbGVyIHdpbGwgYmUgY2hlY2tlZCBhZ2FpbnN0IGFsbCB1bmtub3duIGFwcGxpY2FpdG9ucywKKyAgICAgKiAgaXMgTlVMTCB0aGUgY2FsbGVyIHdpbGwgYmUgY2hlY2tlZCBhZ2FpbnN0IGFsbCB1bmtub3duIGFwcGxpY2F0aW9ucywKICAgICAgKiAgd2hpY2ggY2F1c2Ugc21hbGxlciBudW1iZXIgb2YgU01TIHRvIGJlIHNlbnQgaW4gY2hlY2tpbmcgcGVyaW9kLgogICAgICAqIEBwYXJhbSBkZWxpdmVyeUludGVudHMgaWYgbm90IG51bGwsIGFuIDxjb2RlPkFycmF5TGlzdDwvY29kZT4gb2YKICAgICAgKiAgIDxjb2RlPlBlbmRpbmdJbnRlbnQ8L2NvZGU+cyAob25lIGZvciBlYWNoIG1lc3NhZ2UgcGFydCkgdGhhdCBpcwpAQCAtNzU4LDE3ICs3NTksMTcgQEAKICAgICAgKiBTZW5kIGEgU01TCiAgICAgICoKICAgICAgKiBAcGFyYW0gc21zYyB0aGUgU01TQyB0byBzZW5kIHRoZSBtZXNzYWdlIHRocm91Z2gsIG9yIE5VTEwgZm9yIHRoZQotICAgICAqICBkZWZhdHVsdCBTTVNDCisgICAgICogIGRlZmF1bHQgU01TQwogICAgICAqIEBwYXJhbSBwZHUgdGhlIHJhdyBQRFUgdG8gc2VuZAogICAgICAqIEBwYXJhbSBzZW50SW50ZW50IGlmIG5vdCBOVUxMIHRoaXMgPGNvZGU+SW50ZW50PC9jb2RlPiBpcwotICAgICAqICBicm9hZGNhc3Qgd2hlbiB0aGUgbWVzc2FnZSBpcyBzdWNlc3NmdWxseSBzZW50LCBvciBmYWlsZWQuCisgICAgICogIGJyb2FkY2FzdCB3aGVuIHRoZSBtZXNzYWdlIGlzIHN1Y2Nlc3NmdWxseSBzZW50LCBvciBmYWlsZWQuCiAgICAgICogIFRoZSByZXN1bHQgY29kZSB3aWxsIGJlIDxjb2RlPkFjdGl2aXR5LlJFU1VMVF9PSzxjb2RlPiBmb3Igc3VjY2VzcywKICAgICAgKiAgb3Igb25lIG9mIHRoZXNlIGVycm9yczoKICAgICAgKiAgPGNvZGU+UkVTVUxUX0VSUk9SX0dFTkVSSUNfRkFJTFVSRTwvY29kZT4KICAgICAgKiAgPGNvZGU+UkVTVUxUX0VSUk9SX1JBRElPX09GRjwvY29kZT4KICAgICAgKiAgPGNvZGU+UkVTVUxUX0VSUk9SX05VTExfUERVPC9jb2RlPi4KICAgICAgKiAgVGhlIHBlci1hcHBsaWNhdGlvbiBiYXNlZCBTTVMgY29udHJvbCBjaGVja3Mgc2VudEludGVudC4gSWYgc2VudEludGVudAotICAgICAqICBpcyBOVUxMIHRoZSBjYWxsZXIgd2lsbCBiZSBjaGVja2VkIGFnYWluc3QgYWxsIHVua25vd24gYXBwbGljYWl0b25zLAorICAgICAqICBpcyBOVUxMIHRoZSBjYWxsZXIgd2lsbCBiZSBjaGVja2VkIGFnYWluc3QgYWxsIHVua25vd24gYXBwbGljYXRpb25zLAogICAgICAqICB3aGljaCBjYXVzZSBzbWFsbGVyIG51bWJlciBvZiBTTVMgdG8gYmUgc2VudCBpbiBjaGVja2luZyBwZXJpb2QuCiAgICAgICogQHBhcmFtIGRlbGl2ZXJ5SW50ZW50IGlmIG5vdCBOVUxMIHRoaXMgPGNvZGU+SW50ZW50PC9jb2RlPiBpcwogICAgICAqICBicm9hZGNhc3Qgd2hlbiB0aGUgbWVzc2FnZSBpcyBkZWxpdmVyZWQgdG8gdGhlIHJlY2lwaWVudC4gIFRoZQpAQCAtOTM3LDE0ICs5MzgsMTQgQEAKICAgICAgKi8KICAgICBzdGF0aWMgcHJvdGVjdGVkIGNsYXNzIFNtc1RyYWNrZXIgewogICAgICAgICAvLyBmaWVsZHMgbmVlZCB0byBiZSBwdWJsaWMgZm9yIGRlcml2ZWQgU21zRGlzcGF0Y2hlcnMKLSAgICAgICAgcHVibGljIEhhc2hNYXAgbURhdGE7CisgICAgICAgIHB1YmxpYyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PiBtRGF0YTsKICAgICAgICAgcHVibGljIGludCBtUmV0cnlDb3VudDsKICAgICAgICAgcHVibGljIGludCBtTWVzc2FnZVJlZjsKIAogICAgICAgICBwdWJsaWMgUGVuZGluZ0ludGVudCBtU2VudEludGVudDsKICAgICAgICAgcHVibGljIFBlbmRpbmdJbnRlbnQgbURlbGl2ZXJ5SW50ZW50OwogCi0gICAgICAgIFNtc1RyYWNrZXIoSGFzaE1hcCBkYXRhLCBQZW5kaW5nSW50ZW50IHNlbnRJbnRlbnQsCisgICAgICAgIFNtc1RyYWNrZXIoSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4gZGF0YSwgUGVuZGluZ0ludGVudCBzZW50SW50ZW50LAogICAgICAgICAgICAgICAgIFBlbmRpbmdJbnRlbnQgZGVsaXZlcnlJbnRlbnQpIHsKICAgICAgICAgICAgIG1EYXRhID0gZGF0YTsKICAgICAgICAgICAgIG1TZW50SW50ZW50ID0gc2VudEludGVudDsKQEAgLTk1Myw3ICs5NTQsNyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHJvdGVjdGVkIFNtc1RyYWNrZXIgU21zVHJhY2tlckZhY3RvcnkoSGFzaE1hcCBkYXRhLCBQZW5kaW5nSW50ZW50IHNlbnRJbnRlbnQsCisgICAgcHJvdGVjdGVkIFNtc1RyYWNrZXIgU21zVHJhY2tlckZhY3RvcnkoSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4gZGF0YSwgUGVuZGluZ0ludGVudCBzZW50SW50ZW50LAogICAgICAgICAgICAgUGVuZGluZ0ludGVudCBkZWxpdmVyeUludGVudCkgewogICAgICAgICByZXR1cm4gbmV3IFNtc1RyYWNrZXIoZGF0YSwgc2VudEludGVudCwgZGVsaXZlcnlJbnRlbnQpOwogICAgIH0KZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9TbXNIZWFkZXIuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9TbXNIZWFkZXIuamF2YQppbmRleCA3ODcyZWVjLi43YTY1MTYyIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvU21zSGVhZGVyLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1Ntc0hlYWRlci5qYXZhCkBAIC0zMCw3ICszMCw3IEBACiAgKi8KIHB1YmxpYyBjbGFzcyBTbXNIZWFkZXIgewogCi0gICAgLy8gVE9ETyhjbGVhbnVwKTogdGhpcyBkYXRhc3RydWN0dXJlIGlzIGdlbmVyYWxseSByZWZlcnJlZCB0byBhcworICAgIC8vIFRPRE8oY2xlYW51cCk6IHRoaXMgZGF0YSBzdHJ1Y3R1cmUgaXMgZ2VuZXJhbGx5IHJlZmVycmVkIHRvIGFzCiAgICAgLy8gdGhlICd1c2VyIGRhdGEgaGVhZGVyJyBvciBVREgsIGFuZCBzbyB0aGUgY2xhc3MgbmFtZSBzaG91bGQKICAgICAvLyBjaGFuZ2UgdG8gcmVmbGVjdCB0aGlzLi4uCiAKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9TbXNNZXNzYWdlQmFzZS5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1Ntc01lc3NhZ2VCYXNlLmphdmEKaW5kZXggYWY2YzVmOC4uY2JkODYwNiAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1Ntc01lc3NhZ2VCYXNlLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1Ntc01lc3NhZ2VCYXNlLmphdmEKQEAgLTE2LDcgKzE2LDYgQEAKIAogcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnk7CiAKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5TbXNIZWFkZXI7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5czsKIApAQCAtMzY2LDEzICszNjUsMTMgQEAKICAgICAvKioKICAgICAgKiBUcnkgdG8gcGFyc2UgdGhpcyBtZXNzYWdlIGFzIGFuIGVtYWlsIGdhdGV3YXkgbWVzc2FnZQogICAgICAqIFRoZXJlIGFyZSB0d28gd2F5cyBzcGVjaWZpZWQgaW4gVFMgMjMuMDQwIFNlY3Rpb24gMy44IDoKLSAgICAgKiAgLSBTTVMgbWVzc2FnZSAibWF5IGhhdmUgaXRzIFRQLVBJRCBzZXQgZm9yIGludGVybmV0IGVsZWN0cm9uaWMgbWFpbCAtIE1UCisgICAgICogIC0gU01TIG1lc3NhZ2UgIm1heSBoYXZlIGl0cyBUUC1QSUQgc2V0IGZvciBJbnRlcm5ldCBlbGVjdHJvbmljIG1haWwgLSBNVAogICAgICAqIFNNUyBmb3JtYXQ6IFs8ZnJvbS1hZGRyZXNzPjxzcGFjZT5dPG1lc3NhZ2U+IC0gIkRlcGVuZGluZyBvbiB0aGUKICAgICAgKiBuYXR1cmUgb2YgdGhlIGdhdGV3YXksIHRoZSBkZXN0aW5hdGlvbi9vcmlnaW5hdGlvbiBhZGRyZXNzIGlzIGVpdGhlcgogICAgICAqIGRlcml2ZWQgZnJvbSB0aGUgY29udGVudCBvZiB0aGUgU01TIFRQLU9BIG9yIFRQLURBIGZpZWxkLCBvciB0aGUKICAgICAgKiBUUC1PQS9UUC1EQSBmaWVsZCBjb250YWlucyBhIGdlbmVyaWMgZ2F0ZXdheSBhZGRyZXNzIGFuZCB0aGUgdG8vZnJvbQogICAgICAqIGFkZHJlc3MgaXMgYWRkZWQgYXQgdGhlIGJlZ2lubmluZyBhcyBzaG93biBhYm92ZS4iICh3aGljaCBpcyBzdXBwb3J0ZWQgaGVyZSkKLSAgICAgKiAtIE11bHRpcGxlIGFkZHJlc2VzIHNlcGFyYXRlZCBieSBjb21tYXMsIG5vIHNwYWNlcywgU3ViamVjdCBmaWVsZCBkZWxpbWl0ZWQKKyAgICAgKiAtIE11bHRpcGxlIGFkZHJlc3NlcyBzZXBhcmF0ZWQgYnkgY29tbWFzLCBubyBzcGFjZXMsIFN1YmplY3QgZmllbGQgZGVsaW1pdGVkCiAgICAgICogYnkgJygpJyBvciAnIyMnIGFuZCAnIycgU2VjdGlvbiA5LjIuMy4yNC4xMSAod2hpY2ggYXJlIE5PVCBzdXBwb3J0ZWQgaGVyZSkKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgdm9pZCBleHRyYWN0RW1haWxBZGRyZXNzRnJvbU1lc3NhZ2VCb2R5KCkgewpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1RlbGVwaG9ueVByb3BlcnRpZXMuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9UZWxlcGhvbnlQcm9wZXJ0aWVzLmphdmEKaW5kZXggYTExMzc4Ny4uMTM2ZDViMSAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1RlbGVwaG9ueVByb3BlcnRpZXMuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvVGVsZXBob255UHJvcGVydGllcy5qYXZhCkBAIC00NSw3ICs0NSw3IEBACiAgICAgICogIENETUEgbmV0d29ya3MuCiAgICAgICovCiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9PUEVSQVRPUl9BTFBIQSA9ICJnc20ub3BlcmF0b3IuYWxwaGEiOwotICAgIC8vVE9ETzogbW9zdCBvZiB0aGVzZSBwcm9wcmlldGllcyBhcmUgZ2VuZXJpYywgc3Vic3RpdHV0ZSBnc20uIHdpdGggcGhvbmUuIGJ1ZyAxODU2OTU5CisgICAgLy9UT0RPOiBtb3N0IG9mIHRoZXNlIHByb3BlcnRpZXMgYXJlIGdlbmVyaWMsIHN1YnN0aXR1dGUgZ3NtLiB3aXRoIHBob25lLiBidWcgMTg1Njk1OQogCiAgICAgLyoqIE51bWVyaWMgbmFtZSAoTUNDK01OQykgb2YgY3VycmVudCByZWdpc3RlcmVkIG9wZXJhdG9yLjxwPgogICAgICAqICBBdmFpbGFiaWxpdHk6IHdoZW4gcmVnaXN0ZXJlZCB0byBhIG5ldHdvcmsuIFJlc3VsdCBtYXkgYmUgdW5yZWxpYWJsZSBvbgpAQCAtODMsMTIgKzgzLDEyIEBACiAKICAgICAvKiogVGhlIE1DQytNTkMgKG1vYmlsZSBjb3VudHJ5IGNvZGUrbW9iaWxlIG5ldHdvcmsgY29kZSkgb2YgdGhlCiAgICAgICogIHByb3ZpZGVyIG9mIHRoZSBTSU0uIDUgb3IgNiBkZWNpbWFsIGRpZ2l0cy4KLSAgICAgKiAgQXZhaWxhYmxpdHk6IFNJTSBzdGF0ZSBtdXN0IGJlICJSRUFEWSIKKyAgICAgKiAgQXZhaWxhYmlsaXR5OiBTSU0gc3RhdGUgbXVzdCBiZSAiUkVBRFkiCiAgICAgICovCiAgICAgc3RhdGljIFN0cmluZyBQUk9QRVJUWV9JQ0NfT1BFUkFUT1JfTlVNRVJJQyA9ICJnc20uc2ltLm9wZXJhdG9yLm51bWVyaWMiOwogCiAgICAgLyoqIFBST1BFUlRZX0lDQ19PUEVSQVRPUl9BTFBIQSBpcyBhbHNvIGtub3duIGFzIHRoZSBTUE4sIG9yIFNlcnZpY2UgUHJvdmlkZXIgTmFtZS4KLSAgICAgKiAgQXZhaWxhYmxpdHk6IFNJTSBzdGF0ZSBtdXN0IGJlICJSRUFEWSIKKyAgICAgKiAgQXZhaWxhYmlsaXR5OiBTSU0gc3RhdGUgbXVzdCBiZSAiUkVBRFkiCiAgICAgICovCiAgICAgc3RhdGljIFN0cmluZyBQUk9QRVJUWV9JQ0NfT1BFUkFUT1JfQUxQSEEgPSAiZ3NtLnNpbS5vcGVyYXRvci5hbHBoYSI7CiAKQEAgLTEyNyw3ICsxMjcsNyBAQAogICAgICAgICAicm8udGVsZXBob255LmNhbGxfcmluZy5tdWx0aXBsZSI7CiAKICAgICAvKioKLSAgICAgKiBUaGUgbnVtYmVyIG9mIG1pbGxpLXNlY29uZHMgYmV0d2VlbiBDQUxMX1JJTkcgbm90aWZpY2F0aW9ucy4KKyAgICAgKiBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBiZXR3ZWVuIENBTExfUklORyBub3RpZmljYXRpb25zLgogICAgICAqLwogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfQ0FMTF9SSU5HX0RFTEFZID0gInJvLnRlbGVwaG9ueS5jYWxsX3JpbmcuZGVsYXkiOwogCmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9DRE1BUGhvbmUuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL0NETUFQaG9uZS5qYXZhCmluZGV4IDBjNTkxZTQuLjQ0YzY1ZjcgMTAwNzU1Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL0NETUFQaG9uZS5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL0NETUFQaG9uZS5qYXZhCkBAIC01MDQsMTQgKzUwNCw2IEBACiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0RhdGFDb25uZWN0aXZpdHlQb3NzaWJsZSgpIHsKLSAgICAgICAgYm9vbGVhbiBub0RhdGEgPSBtRGF0YUNvbm5lY3Rpb24uZ2V0RGF0YUVuYWJsZWQoKSAmJgotICAgICAgICAgICAgICAgIGdldERhdGFDb25uZWN0aW9uU3RhdGUoKSA9PSBEYXRhU3RhdGUuRElTQ09OTkVDVEVEOwotICAgICAgICByZXR1cm4gIW5vRGF0YSAmJiBnZXRJY2NDYXJkKCkuZ2V0U3RhdGUoKSA9PSBJY2NDYXJkLlN0YXRlLlJFQURZICYmCi0gICAgICAgICAgICAgICAgZ2V0U2VydmljZVN0YXRlKCkuZ2V0U3RhdGUoKSA9PSBTZXJ2aWNlU3RhdGUuU1RBVEVfSU5fU0VSVklDRSAmJgotICAgICAgICAgICAgICAgIChtRGF0YUNvbm5lY3Rpb24uZ2V0RGF0YU9uUm9hbWluZ0VuYWJsZWQoKSB8fCAhZ2V0U2VydmljZVN0YXRlKCkuZ2V0Um9hbWluZygpKTsKLSAgICB9Ci0KICAgICAvKioKICAgICAgKiBSZW1vdmVzIHRoZSBnaXZlbiBNTUkgZnJvbSB0aGUgcGVuZGluZyBsaXN0IGFuZCBub3RpZmllcyByZWdpc3RyYW50cyB0aGF0CiAgICAgICogaXQgaXMgY29tcGxldGUuCkBAIC02MDIsNyArNTk0LDcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHB1YmxpYyBEYXRhU3RhdGUgZ2V0RGF0YUNvbm5lY3Rpb25TdGF0ZSgpIHsKKyAgICBwdWJsaWMgRGF0YVN0YXRlIGdldERhdGFDb25uZWN0aW9uU3RhdGUoU3RyaW5nIGFwblR5cGUpIHsKICAgICAgICAgRGF0YVN0YXRlIHJldCA9IERhdGFTdGF0ZS5ESVNDT05ORUNURUQ7CiAKICAgICAgICAgaWYgKG1TU1QgPT0gbnVsbCkgewpAQCAtNjE0LDYgKzYwNiw4IEBACiAgICAgICAgICAgICAvLyBJZiB3ZSdyZSBvdXQgb2Ygc2VydmljZSwgb3BlbiBUQ1Agc29ja2V0cyBtYXkgc3RpbGwgd29yawogICAgICAgICAgICAgLy8gYnV0IG5vIGRhdGEgd2lsbCBmbG93CiAgICAgICAgICAgICByZXQgPSBEYXRhU3RhdGUuRElTQ09OTkVDVEVEOworICAgICAgICB9IGVsc2UgaWYgKG1EYXRhQ29ubmVjdGlvbi5pc0FwblR5cGVFbmFibGVkKGFwblR5cGUpID09IGZhbHNlKSB7CisgICAgICAgICAgICByZXQgPSBEYXRhU3RhdGUuRElTQ09OTkVDVEVEOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgc3dpdGNoIChtRGF0YUNvbm5lY3Rpb24uZ2V0U3RhdGUoKSkgewogICAgICAgICAgICAgICAgIGNhc2UgRkFJTEVEOgpAQCAtODY3LDI2ICs4NjEsNiBAQAogICAgICAgICBtUnVpbVJlY29yZHMuc2V0Vm9pY2VNZXNzYWdlV2FpdGluZygxLCBtd2kpOwogICAgIH0KIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiBDRE1BIE9UQSBTZXJ2aWNlIFByb3Zpc2lvbmluZyBuZWVkcyB0byBiZSBwZXJmb3JtZWQuCi0gICAgICovCi0gICAgLyogcGFja2FnZSAqLyBib29sZWFuCi0gICAgbmVlZHNPdGFTZXJ2aWNlUHJvdmlzaW9uaW5nKCkgewotICAgICAgICBTdHJpbmcgY2RtYU1pbiA9IGdldENkbWFNaW4oKTsKLSAgICAgICAgYm9vbGVhbiBuZWVkc1Byb3Zpc2lvbmluZzsKLSAgICAgICAgaWYgKGNkbWFNaW4gPT0gbnVsbCB8fCAoY2RtYU1pbi5sZW5ndGgoKSA8IDYpKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSBMb2cuZChMT0dfVEFHLCAibmVlZHNPdGFTZXJ2aWNlUHJvdmlzaW9uaW5nOiBpbGxlZ2FsIGNkbWFNaW49JyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgY2RtYU1pbiArICInIGFzc3VtZSBwcm92aXNpb25pbmcgbmVlZGVkLiIpOwotICAgICAgICAgICAgbmVlZHNQcm92aXNpb25pbmcgPSB0cnVlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbmVlZHNQcm92aXNpb25pbmcgPSAoY2RtYU1pbi5lcXVhbHMoVU5BQ1RJVkFURURfTUlOX1ZBTFVFKQotICAgICAgICAgICAgICAgICAgICB8fCBjZG1hTWluLnN1YnN0cmluZygwLDYpLmVxdWFscyhVTkFDVElWQVRFRF9NSU4yX1ZBTFVFKSkKLSAgICAgICAgICAgICAgICAgICAgfHwgU3lzdGVtUHJvcGVydGllcy5nZXRCb29sZWFuKCJ0ZXN0X2NkbWFfc2V0dXAiLCBmYWxzZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKERCRykgTG9nLmQoTE9HX1RBRywgIm5lZWRzT3RhU2VydmljZVByb3Zpc2lvbmluZzogcmV0PSIgKyBuZWVkc1Byb3Zpc2lvbmluZyk7Ci0gICAgICAgIHJldHVybiBuZWVkc1Byb3Zpc2lvbmluZzsKLSAgICB9Ci0KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBleGl0RW1lcmdlbmN5Q2FsbGJhY2tNb2RlKCkgewogICAgICAgICBpZiAobVdha2VMb2NrLmlzSGVsZCgpKSB7CkBAIC0xMTgwLDYgKzExNTQsMjYgQEAKICAgICAgICAgbVNNUy5zZXRDZWxsQnJvYWRjYXN0Q29uZmlnKGNvbmZpZ1ZhbHVlc0FycmF5LCByZXNwb25zZSk7CiAgICAgfQogCisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIE9UQSBTZXJ2aWNlIFByb3Zpc2lvbmluZyBuZWVkcyB0byBiZSBwZXJmb3JtZWQuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gbmVlZHNPdGFTZXJ2aWNlUHJvdmlzaW9uaW5nKCkgeworICAgICAgICBTdHJpbmcgY2RtYU1pbiA9IGdldENkbWFNaW4oKTsKKyAgICAgICAgYm9vbGVhbiBuZWVkc1Byb3Zpc2lvbmluZzsKKyAgICAgICAgaWYgKGNkbWFNaW4gPT0gbnVsbCB8fCAoY2RtYU1pbi5sZW5ndGgoKSA8IDYpKSB7CisgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChMT0dfVEFHLCAibmVlZHNPdGFTZXJ2aWNlUHJvdmlzaW9uaW5nOiBpbGxlZ2FsIGNkbWFNaW49JyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgY2RtYU1pbiArICInIGFzc3VtZSBwcm92aXNpb25pbmcgbmVlZGVkLiIpOworICAgICAgICAgICAgbmVlZHNQcm92aXNpb25pbmcgPSB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbmVlZHNQcm92aXNpb25pbmcgPSAoY2RtYU1pbi5lcXVhbHMoVU5BQ1RJVkFURURfTUlOX1ZBTFVFKQorICAgICAgICAgICAgICAgICAgICB8fCBjZG1hTWluLnN1YnN0cmluZygwLDYpLmVxdWFscyhVTkFDVElWQVRFRF9NSU4yX1ZBTFVFKSkKKyAgICAgICAgICAgICAgICAgICAgfHwgU3lzdGVtUHJvcGVydGllcy5nZXRCb29sZWFuKCJ0ZXN0X2NkbWFfc2V0dXAiLCBmYWxzZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKERCRykgTG9nLmQoTE9HX1RBRywgIm5lZWRzT3RhU2VydmljZVByb3Zpc2lvbmluZzogcmV0PSIgKyBuZWVkc1Byb3Zpc2lvbmluZyk7CisgICAgICAgIHJldHVybiBuZWVkc1Byb3Zpc2lvbmluZzsKKyAgICB9CisKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSVM2ODNBX0ZFQVRVUkVfQ09ERSA9ICIqMjI4IjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSVM2ODNBX0ZFQVRVUkVfQ09ERV9OVU1fRElHSVRTID0gNDsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSVM2ODNBX1NZU19TRUxfQ09ERV9OVU1fRElHSVRTID0gMjsKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL0NkbWFEYXRhQ29ubmVjdGlvblRyYWNrZXIuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL0NkbWFEYXRhQ29ubmVjdGlvblRyYWNrZXIuamF2YQppbmRleCA5ZjJhNDRiLi5iZDEwM2Q0IDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9DZG1hRGF0YUNvbm5lY3Rpb25UcmFja2VyLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvQ2RtYURhdGFDb25uZWN0aW9uVHJhY2tlci5qYXZhCkBAIC0zMDUsOSArMzA1LDQwIEBACiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIAotICAgIHByaXZhdGUgYm9vbGVhbiBpc0RhdGFBbGxvd2VkKCkgewotICAgICAgICBib29sZWFuIHJvYW1pbmcgPSBwaG9uZS5nZXRTZXJ2aWNlU3RhdGUoKS5nZXRSb2FtaW5nKCk7Ci0gICAgICAgIHJldHVybiBnZXRBbnlEYXRhRW5hYmxlZCgpICYmICghcm9hbWluZyB8fCBnZXREYXRhT25Sb2FtaW5nRW5hYmxlZCgpKSAmJiBtTWFzdGVyRGF0YUVuYWJsZWQ7CisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNEYXRhQWxsb3dlZCgpIHsKKyAgICAgICAgaW50IHBzU3RhdGUgPSBtQ2RtYVBob25lLm1TU1QuZ2V0Q3VycmVudENkbWFEYXRhQ29ubmVjdGlvblN0YXRlKCk7CisgICAgICAgIGJvb2xlYW4gcm9hbWluZyA9IChwaG9uZS5nZXRTZXJ2aWNlU3RhdGUoKS5nZXRSb2FtaW5nKCkgJiYgIWdldERhdGFPblJvYW1pbmdFbmFibGVkKCkpOworICAgICAgICBib29sZWFuIGRlc2lyZWRQb3dlclN0YXRlID0gbUNkbWFQaG9uZS5tU1NULmdldERlc2lyZWRQb3dlclN0YXRlKCk7CisKKyAgICAgICAgYm9vbGVhbiBhbGxvd2VkID0gKHBzU3RhdGUgPT0gU2VydmljZVN0YXRlLlNUQVRFX0lOX1NFUlZJQ0UgJiYKKyAgICAgICAgICAgICAgICAocGhvbmUubUNNLmdldFJhZGlvU3RhdGUoKSA9PSBDb21tYW5kc0ludGVyZmFjZS5SYWRpb1N0YXRlLk5WX1JFQURZIHx8CisgICAgICAgICAgICAgICAgIG1DZG1hUGhvbmUubVJ1aW1SZWNvcmRzLmdldFJlY29yZHNMb2FkZWQoKSkgJiYKKyAgICAgICAgICAgICAgICAobUNkbWFQaG9uZS5tU1NULmlzQ29uY3VycmVudFZvaWNlQW5kRGF0YSgpIHx8CisgICAgICAgICAgICAgICAgIHBob25lLmdldFN0YXRlKCkgPT0gUGhvbmUuU3RhdGUuSURMRSkgJiYKKyAgICAgICAgICAgICAgICAhcm9hbWluZyAmJgorICAgICAgICAgICAgICAgIG1NYXN0ZXJEYXRhRW5hYmxlZCAmJgorICAgICAgICAgICAgICAgIGRlc2lyZWRQb3dlclN0YXRlICYmCisgICAgICAgICAgICAgICAgIW1QZW5kaW5nUmVzdGFydFJhZGlvICYmCisgICAgICAgICAgICAgICAgIW1DZG1hUGhvbmUubmVlZHNPdGFTZXJ2aWNlUHJvdmlzaW9uaW5nKCkpOworICAgICAgICBpZiAoIWFsbG93ZWQgJiYgREJHKSB7CisgICAgICAgICAgICBTdHJpbmcgcmVhc29uID0gIiI7CisgICAgICAgICAgICBpZiAocHNTdGF0ZSAhPSBTZXJ2aWNlU3RhdGUuU1RBVEVfSU5fU0VSVklDRSkgcmVhc29uICs9ICIgLSBwc1N0YXRlPSAiICsgcHNTdGF0ZTsKKyAgICAgICAgICAgIGlmIChwaG9uZS5tQ00uZ2V0UmFkaW9TdGF0ZSgpICE9IENvbW1hbmRzSW50ZXJmYWNlLlJhZGlvU3RhdGUuTlZfUkVBRFkgJiYKKyAgICAgICAgICAgICAgICAgICAgIW1DZG1hUGhvbmUubVJ1aW1SZWNvcmRzLmdldFJlY29yZHNMb2FkZWQoKSkgeworICAgICAgICAgICAgICAgIHJlYXNvbiArPSAiIC0gcmFkaW9TdGF0ZT0gIiArIHBob25lLm1DTS5nZXRSYWRpb1N0YXRlKCkgKyAiIC0gUlVJTSBub3QgbG9hZGVkIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwaG9uZS5nZXRTdGF0ZSgpICE9IFBob25lLlN0YXRlLklETEUgJiYKKyAgICAgICAgICAgICAgICAgICAgbUNkbWFQaG9uZS5tU1NULmlzQ29uY3VycmVudFZvaWNlQW5kRGF0YSgpKSB7CisgICAgICAgICAgICAgICAgcmVhc29uICs9ICIgLSBjb25jdXJyZW50Vm9pY2VBbmREYXRhIG5vdCBhbGxvd2VkIGFuZCBzdGF0ZT0gIiArIHBob25lLmdldFN0YXRlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocm9hbWluZykgcmVhc29uICs9ICIgLSBSb2FtaW5nIjsKKyAgICAgICAgICAgIGlmICghbU1hc3RlckRhdGFFbmFibGVkKSByZWFzb24gKz0gIiAtIG1NYXN0ZXJEYXRhRW5hYmxlZD0gZmFsc2UiOworICAgICAgICAgICAgaWYgKCFkZXNpcmVkUG93ZXJTdGF0ZSkgcmVhc29uICs9ICIgLSBkZXNpcmVkUG93ZXJTdGF0ZT0gZmFsc2UiOworICAgICAgICAgICAgaWYgKG1QZW5kaW5nUmVzdGFydFJhZGlvKSByZWFzb24gKz0gIiAtIG1QZW5kaW5nUmVzdGFydFJhZGlvPSB0cnVlIjsKKyAgICAgICAgICAgIGlmIChtQ2RtYVBob25lLm5lZWRzT3RhU2VydmljZVByb3Zpc2lvbmluZygpKSByZWFzb24gKz0gIiAtIG5lZWRzIFByb3Zpc2lvbmluZyI7CisgICAgICAgICAgICBsb2coIkRhdGEgbm90IGFsbG93ZWQgZHVlIHRvIiArIHJlYXNvbik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGFsbG93ZWQ7CiAgICAgfQogCiAgICAgcHJpdmF0ZSBib29sZWFuIHRyeVNldHVwRGF0YShTdHJpbmcgcmVhc29uKSB7CkBAIC0zMTcsNyArMzQ4LDggQEAKICAgICAgICAgICAgIC8vIEFzc3VtZSBkYXRhIGlzIGNvbm5lY3RlZCBvbiB0aGUgc2ltdWxhdG9yCiAgICAgICAgICAgICAvLyBGSVhNRSAgdGhpcyBjYW4gYmUgaW1wcm92ZWQKICAgICAgICAgICAgIHNldFN0YXRlKFN0YXRlLkNPTk5FQ1RFRCk7Ci0gICAgICAgICAgICBwaG9uZS5ub3RpZnlEYXRhQ29ubmVjdGlvbihyZWFzb24pOworICAgICAgICAgICAgbm90aWZ5RGF0YUNvbm5lY3Rpb24ocmVhc29uKTsKKyAgICAgICAgICAgIG5vdGlmeU9mZkFwbnNPZkF2YWlsYWJpbGl0eShyZWFzb24sIHRydWUpOwogCiAgICAgICAgICAgICBMb2cuaShMT0dfVEFHLCAiKGZpeD8pIFdlJ3JlIG9uIHRoZSBzaW11bGF0b3I7IGFzc3VtaW5nIGRhdGEgaXMgY29ubmVjdGVkIik7CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKQEAgLTMyNywzNiArMzU5LDEzIEBACiAgICAgICAgIGJvb2xlYW4gcm9hbWluZyA9IHBob25lLmdldFNlcnZpY2VTdGF0ZSgpLmdldFJvYW1pbmcoKTsKICAgICAgICAgYm9vbGVhbiBkZXNpcmVkUG93ZXJTdGF0ZSA9IG1DZG1hUGhvbmUubVNTVC5nZXREZXNpcmVkUG93ZXJTdGF0ZSgpOwogCi0gICAgICAgIGlmICgoc3RhdGUgPT0gU3RhdGUuSURMRSB8fCBzdGF0ZSA9PSBTdGF0ZS5TQ0FOTklORykKLSAgICAgICAgICAgICAgICAmJiAocHNTdGF0ZSA9PSBTZXJ2aWNlU3RhdGUuU1RBVEVfSU5fU0VSVklDRSkKLSAgICAgICAgICAgICAgICAmJiAoKHBob25lLm1DTS5nZXRSYWRpb1N0YXRlKCkgPT0gQ29tbWFuZHNJbnRlcmZhY2UuUmFkaW9TdGF0ZS5OVl9SRUFEWSkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1DZG1hUGhvbmUubVJ1aW1SZWNvcmRzLmdldFJlY29yZHNMb2FkZWQoKSkKLSAgICAgICAgICAgICAgICAmJiAobUNkbWFQaG9uZS5tU1NULmlzQ29uY3VycmVudFZvaWNlQW5kRGF0YSgpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICBwaG9uZS5nZXRTdGF0ZSgpID09IFBob25lLlN0YXRlLklETEUgKQotICAgICAgICAgICAgICAgICYmIGlzRGF0YUFsbG93ZWQoKQotICAgICAgICAgICAgICAgICYmIGRlc2lyZWRQb3dlclN0YXRlCi0gICAgICAgICAgICAgICAgJiYgIW1QZW5kaW5nUmVzdGFydFJhZGlvCi0gICAgICAgICAgICAgICAgJiYgIW1DZG1hUGhvbmUubmVlZHNPdGFTZXJ2aWNlUHJvdmlzaW9uaW5nKCkpIHsKLQotICAgICAgICAgICAgcmV0dXJuIHNldHVwRGF0YShyZWFzb24pOwotCisgICAgICAgIGlmICgoc3RhdGUgPT0gU3RhdGUuSURMRSB8fCBzdGF0ZSA9PSBTdGF0ZS5TQ0FOTklORykgJiYKKyAgICAgICAgICAgICAgICBpc0RhdGFBbGxvd2VkKCkgJiYgZ2V0QW55RGF0YUVuYWJsZWQoKSkgeworICAgICAgICAgICAgYm9vbGVhbiByZXRWYWx1ZSA9IHNldHVwRGF0YShyZWFzb24pOworICAgICAgICAgICAgbm90aWZ5T2ZmQXBuc09mQXZhaWxhYmlsaXR5KHJlYXNvbiwgcmV0VmFsdWUpOworICAgICAgICAgICAgcmV0dXJuIHJldFZhbHVlOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgICAgICBsb2coInRyeVNldHVwRGF0YTogTm90IHJlYWR5IGZvciBkYXRhOiAiICsKLSAgICAgICAgICAgICAgICAgICAgIiBkYXRhU3RhdGU9IiArIHN0YXRlICsKLSAgICAgICAgICAgICAgICAgICAgIiBQUyBzdGF0ZT0iICsgcHNTdGF0ZSArCi0gICAgICAgICAgICAgICAgICAgICIgcmFkaW8gc3RhdGU9IiArIHBob25lLm1DTS5nZXRSYWRpb1N0YXRlKCkgKwotICAgICAgICAgICAgICAgICAgICAiIHJ1aW09IiArIG1DZG1hUGhvbmUubVJ1aW1SZWNvcmRzLmdldFJlY29yZHNMb2FkZWQoKSArCi0gICAgICAgICAgICAgICAgICAgICIgY29uY3VycmVudFZvaWNlJkRhdGE9IiArIG1DZG1hUGhvbmUubVNTVC5pc0NvbmN1cnJlbnRWb2ljZUFuZERhdGEoKSArCi0gICAgICAgICAgICAgICAgICAgICIgcGhvbmVTdGF0ZT0iICsgcGhvbmUuZ2V0U3RhdGUoKSArCi0gICAgICAgICAgICAgICAgICAgICIgZGF0YUVuYWJsZWQ9IiArIGdldEFueURhdGFFbmFibGVkKCkgKwotICAgICAgICAgICAgICAgICAgICAiIHJvYW1pbmc9IiArIHJvYW1pbmcgKwotICAgICAgICAgICAgICAgICAgICAiIGRhdGFPblJvYW1pbmdFbmFibGU9IiArIGdldERhdGFPblJvYW1pbmdFbmFibGVkKCkgKwotICAgICAgICAgICAgICAgICAgICAiIGRlc2lyZWRQb3dlclN0YXRlPSIgKyBkZXNpcmVkUG93ZXJTdGF0ZSArCi0gICAgICAgICAgICAgICAgICAgICIgUGVuZGluZ1Jlc3RhcnRSYWRpbz0iICsgbVBlbmRpbmdSZXN0YXJ0UmFkaW8gKwotICAgICAgICAgICAgICAgICAgICAiIE1hc3RlckRhdGFFbmFibGVkPSIgKyBtTWFzdGVyRGF0YUVuYWJsZWQgKwotICAgICAgICAgICAgICAgICAgICAiIG5lZWRzT3RhU2VydmljZVByb3Zpc2lvbmluZz0iICsgbUNkbWFQaG9uZS5uZWVkc090YVNlcnZpY2VQcm92aXNpb25pbmcoKSk7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBub3RpZnlPZmZBcG5zT2ZBdmFpbGFiaWxpdHkocmVhc29uLCBmYWxzZSk7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICB9CkBAIC0zODIsNiArMzkxLDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIHNldFN0YXRlKFN0YXRlLkRJU0NPTk5FQ1RJTkcpOworICAgICAgICBub3RpZnlEYXRhQXZhaWxhYmlsaXR5KHJlYXNvbik7CiAKICAgICAgICAgYm9vbGVhbiBub3RpZmljYXRpb25EZWZlcnJlZCA9IGZhbHNlOwogICAgICAgICBmb3IgKERhdGFDb25uZWN0aW9uIGNvbm4gOiBkYXRhQ29ubmVjdGlvbkxpc3QpIHsKQEAgLTQ0MCwxMyArNDUwLDEzIEBACiAgICAgICAgIGNvbm4uY29ubmVjdChtc2csIG1BY3RpdmVBcG4pOwogCiAgICAgICAgIHNldFN0YXRlKFN0YXRlLklOSVRJTkcpOwotICAgICAgICBwaG9uZS5ub3RpZnlEYXRhQ29ubmVjdGlvbihyZWFzb24pOworICAgICAgICBub3RpZnlEYXRhQ29ubmVjdGlvbihyZWFzb24pOwogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgbm90aWZ5RGVmYXVsdERhdGEoU3RyaW5nIHJlYXNvbikgewogICAgICAgICBzZXRTdGF0ZShTdGF0ZS5DT05ORUNURUQpOwotICAgICAgICBwaG9uZS5ub3RpZnlEYXRhQ29ubmVjdGlvbihyZWFzb24pOworICAgICAgICBub3RpZnlEYXRhQ29ubmVjdGlvbihyZWFzb24pOwogICAgICAgICBzdGFydE5ldFN0YXRQb2xsKCk7CiAgICAgICAgIG1SZXRyeU1nci5yZXNldFJldHJ5Q291bnQoKTsKICAgICB9CkBAIC02MjIsMTIgKzYzMiwxMyBAQAogCiAgICAgcHJpdmF0ZSB2b2lkIG5vdGlmeU5vRGF0YShGYWlsQ2F1c2UgbGFzdEZhaWxDYXVzZUNvZGUpIHsKICAgICAgICAgc2V0U3RhdGUoU3RhdGUuRkFJTEVEKTsKKyAgICAgICAgbm90aWZ5RGF0YUF2YWlsYWJpbGl0eShudWxsKTsKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgZ290b0lkbGVBbmROb3RpZnlEYXRhQ29ubmVjdGlvbihTdHJpbmcgcmVhc29uKSB7CiAgICAgICAgIGlmIChEQkcpIGxvZygiZ290b0lkbGVBbmROb3RpZnlEYXRhQ29ubmVjdGlvbjogcmVhc29uPSIgKyByZWFzb24pOwogICAgICAgICBzZXRTdGF0ZShTdGF0ZS5JRExFKTsKLSAgICAgICAgcGhvbmUubm90aWZ5RGF0YUNvbm5lY3Rpb24ocmVhc29uKTsKKyAgICAgICAgbm90aWZ5RGF0YUNvbm5lY3Rpb24ocmVhc29uKTsKICAgICAgICAgbUFjdGl2ZUFwbiA9IG51bGw7CiAgICAgfQogCkBAIC02ODcsMTEgKzY5OCwxMyBAQAogICAgICAgICAgICAgLy8gQXNzdW1lIGRhdGEgaXMgY29ubmVjdGVkIG9uIHRoZSBzaW11bGF0b3IKICAgICAgICAgICAgIC8vIEZJWE1FICB0aGlzIGNhbiBiZSBpbXByb3ZlZAogICAgICAgICAgICAgc2V0U3RhdGUoU3RhdGUuQ09OTkVDVEVEKTsKLSAgICAgICAgICAgIHBob25lLm5vdGlmeURhdGFDb25uZWN0aW9uKG51bGwpOworICAgICAgICAgICAgbm90aWZ5RGF0YUNvbm5lY3Rpb24obnVsbCk7CiAKICAgICAgICAgICAgIExvZy5pKExPR19UQUcsICJXZSdyZSBvbiB0aGUgc2ltdWxhdG9yOyBhc3N1bWluZyBkYXRhIGlzIGNvbm5lY3RlZCIpOwogICAgICAgICB9CiAKKyAgICAgICAgbm90aWZ5RGF0YUF2YWlsYWJpbGl0eShudWxsKTsKKwogICAgICAgICBpZiAoc3RhdGUgIT0gU3RhdGUuSURMRSkgewogICAgICAgICAgICAgY2xlYW5VcENvbm5lY3Rpb24odHJ1ZSwgbnVsbCk7CiAgICAgICAgIH0KQEAgLTc2Miw3ICs3NzUsNyBAQAogICAgICAgICAgICAgb25SZXN0YXJ0UmFkaW8oKTsKICAgICAgICAgfQogCi0gICAgICAgIHBob25lLm5vdGlmeURhdGFDb25uZWN0aW9uKHJlYXNvbik7CisgICAgICAgIG5vdGlmeURhdGFDb25uZWN0aW9uKHJlYXNvbik7CiAgICAgICAgIG1BY3RpdmVBcG4gPSBudWxsOwogICAgICAgICBpZiAocmV0cnlBZnRlckRpc2Nvbm5lY3RlZChyZWFzb24pKSB7CiAgICAgICAgICAgdHJ5U2V0dXBEYXRhKHJlYXNvbik7CkBAIC03ODksNyArODAyLDggQEAKICAgICBwcm90ZWN0ZWQgdm9pZCBvblZvaWNlQ2FsbFN0YXJ0ZWQoKSB7CiAgICAgICAgIGlmIChzdGF0ZSA9PSBTdGF0ZS5DT05ORUNURUQgJiYgIW1DZG1hUGhvbmUubVNTVC5pc0NvbmN1cnJlbnRWb2ljZUFuZERhdGEoKSkgewogICAgICAgICAgICAgc3RvcE5ldFN0YXRQb2xsKCk7Ci0gICAgICAgICAgICBwaG9uZS5ub3RpZnlEYXRhQ29ubmVjdGlvbihQaG9uZS5SRUFTT05fVk9JQ0VfQ0FMTF9TVEFSVEVEKTsKKyAgICAgICAgICAgIG5vdGlmeURhdGFDb25uZWN0aW9uKFBob25lLlJFQVNPTl9WT0lDRV9DQUxMX1NUQVJURUQpOworICAgICAgICAgICAgbm90aWZ5RGF0YUF2YWlsYWJpbGl0eShQaG9uZS5SRUFTT05fVk9JQ0VfQ0FMTF9TVEFSVEVEKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtODAwLDExICs4MTQsMTIgQEAKICAgICAgICAgaWYgKHN0YXRlID09IFN0YXRlLkNPTk5FQ1RFRCkgewogICAgICAgICAgICAgaWYgKCFtQ2RtYVBob25lLm1TU1QuaXNDb25jdXJyZW50Vm9pY2VBbmREYXRhKCkpIHsKICAgICAgICAgICAgICAgICBzdGFydE5ldFN0YXRQb2xsKCk7Ci0gICAgICAgICAgICAgICAgcGhvbmUubm90aWZ5RGF0YUNvbm5lY3Rpb24oUGhvbmUuUkVBU09OX1ZPSUNFX0NBTExfRU5ERUQpOworICAgICAgICAgICAgICAgIG5vdGlmeURhdGFDb25uZWN0aW9uKFBob25lLlJFQVNPTl9WT0lDRV9DQUxMX0VOREVEKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgLy8gY2xlYW4gc2xhdGUgYWZ0ZXIgY2FsbCBlbmQuCiAgICAgICAgICAgICAgICAgcmVzZXRQb2xsU3RhdHMoKTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5vdGlmeURhdGFBdmFpbGFiaWxpdHkoUGhvbmUuUkVBU09OX1ZPSUNFX0NBTExfRU5ERUQpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgbVJldHJ5TWdyLnJlc2V0UmV0cnlDb3VudCgpOwogICAgICAgICAgICAgLy8gaW4gY2FzZSBkYXRhIHNldHVwIHdhcyBhdHRlbXB0ZWQgd2hlbiB3ZSB3ZXJlIG9uIGEgdm9pY2UgY2FsbApAQCAtODM4LDcgKzg1Myw3IEBACiAgICAgcHJpdmF0ZSB2b2lkIG9uQ2RtYURhdGFEZXRhY2hlZCgpIHsKICAgICAgICAgaWYgKHN0YXRlID09IFN0YXRlLkNPTk5FQ1RFRCkgewogICAgICAgICAgICAgc3RhcnROZXRTdGF0UG9sbCgpOwotICAgICAgICAgICAgcGhvbmUubm90aWZ5RGF0YUNvbm5lY3Rpb24oUGhvbmUuUkVBU09OX0NETUFfREFUQV9ERVRBQ0hFRCk7CisgICAgICAgICAgICBub3RpZnlEYXRhQ29ubmVjdGlvbihQaG9uZS5SRUFTT05fQ0RNQV9EQVRBX0RFVEFDSEVEKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGlmIChzdGF0ZSA9PSBTdGF0ZS5GQUlMRUQpIHsKICAgICAgICAgICAgICAgICBjbGVhblVwQ29ubmVjdGlvbihmYWxzZSwgUGhvbmUuUkVBU09OX0NETUFfREFUQV9ERVRBQ0hFRCk7CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9DZG1hU01TRGlzcGF0Y2hlci5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvQ2RtYVNNU0Rpc3BhdGNoZXIuamF2YQppbmRleCBlZDkzYWVhLi4xYjA4YWVkIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9DZG1hU01TRGlzcGF0Y2hlci5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL0NkbWFTTVNEaXNwYXRjaGVyLmphdmEKQEAgLTUxLDcgKzUxLDYgQEAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS5sYW5nLkJvb2xlYW47CiAKIAogZmluYWwgY2xhc3MgQ2RtYVNNU0Rpc3BhdGNoZXIgZXh0ZW5kcyBTTVNEaXNwYXRjaGVyIHsKQEAgLTc1LDYgKzc0LDcgQEAKICAgICAgKiBAcGFyYW0gYXIgQXN5bmNSZXN1bHQgcGFzc2VkIGludG8gdGhlIG1lc3NhZ2UgaGFuZGxlci4gIGFyLnJlc3VsdCBzaG91bGQKICAgICAgKiAgICAgICAgICAgYmUgYSBTdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBzdGF0dXMgcmVwb3J0IFBEVSwgYXMgQVNDSUkgaGV4LgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZVN0YXR1c1JlcG9ydChBc3luY1Jlc3VsdCBhcikgewogICAgICAgICBMb2cuZChUQUcsICJoYW5kbGVTdGF0dXNSZXBvcnQgaXMgYSBzcGVjaWFsIEdTTSBmdW5jdGlvbiwgc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCBpbiBDRE1BISIpOwogICAgIH0KQEAgLTk3LDYgKzk3LDcgQEAKICAgICB9CiAKICAgICAvKioge0Bpbmhlcml0RG9jfSAqLworICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCBpbnQgZGlzcGF0Y2hNZXNzYWdlKFNtc01lc3NhZ2VCYXNlIHNtc2IpIHsKIAogICAgICAgICAvLyBJZiBzbXMgaXMgbnVsbCwgbWVhbnMgdGhlcmUgd2FzIGEgcGFyc2luZyBlcnJvci4KQEAgLTE3Niw3ICsxNzcsNyBAQAogICAgICAgICAgKiBUT0RPKGNsZWFudXApOiBXaHkgYXJlIHdlIHVzaW5nIGEgZ2V0dGVyIG1ldGhvZCBmb3IgdGhpcwogICAgICAgICAgKiAoYW5kIGZvciBzbyBtYW55IG90aGVyIHNtcyBmaWVsZHMpPyAgVHJpdmlhbCBnZXR0ZXJzIGFuZAogICAgICAgICAgKiBzZXR0ZXJzIGxpa2UgdGhpcyBhcmUgZGlyZWN0IHZpb2xhdGlvbnMgb2YgdGhlIHN0eWxlIGd1aWRlLgotICAgICAgICAgKiBJZiB0aGUgcHVycG9zZSBpcyB0byBwcm90ZWN0IGFnYWlzdCB3cml0ZXMgKGJ5IG5vdAorICAgICAgICAgKiBJZiB0aGUgcHVycG9zZSBpcyB0byBwcm90ZWN0IGFnYWluc3Qgd3JpdGVzIChieSBub3QKICAgICAgICAgICogcHJvdmlkaW5nIGEgc2V0dGVyKSB0aGVuIGFueSBwcm90ZWN0aW9uIGlzIGlsbHVzb3J5IChhbmQKICAgICAgICAgICogaGVuY2UgYmFkKSBmb3IgY2FzZXMgd2hlcmUgdGhlIHZhbHVlcyBhcmUgbm90IHByaW1pdGl2ZXMsCiAgICAgICAgICAqIHN1Y2ggYXMgdGhpcyBjYWxsIGZvciB0aGUgaGVhZGVyLiAgU2luY2UgdGhpcyBpcyBhbiBpc3N1ZQpAQCAtMzQwLDYgKzM0MSw3IEBACiAgICAgfQogCiAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBzZW5kRGF0YShTdHJpbmcgZGVzdEFkZHIsIFN0cmluZyBzY0FkZHIsIGludCBkZXN0UG9ydCwKICAgICAgICAgICAgIGJ5dGVbXSBkYXRhLCBQZW5kaW5nSW50ZW50IHNlbnRJbnRlbnQsIFBlbmRpbmdJbnRlbnQgZGVsaXZlcnlJbnRlbnQpIHsKICAgICAgICAgU21zTWVzc2FnZS5TdWJtaXRQZHUgcGR1ID0gU21zTWVzc2FnZS5nZXRTdWJtaXRQZHUoCkBAIC0zNDgsNiArMzUwLDcgQEAKICAgICB9CiAKICAgICAvKioge0Bpbmhlcml0RG9jfSAqLworICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIHNlbmRUZXh0KFN0cmluZyBkZXN0QWRkciwgU3RyaW5nIHNjQWRkciwgU3RyaW5nIHRleHQsCiAgICAgICAgICAgICBQZW5kaW5nSW50ZW50IHNlbnRJbnRlbnQsIFBlbmRpbmdJbnRlbnQgZGVsaXZlcnlJbnRlbnQpIHsKICAgICAgICAgU21zTWVzc2FnZS5TdWJtaXRQZHUgcGR1ID0gU21zTWVzc2FnZS5nZXRTdWJtaXRQZHUoCkBAIC0zNTYsNiArMzU5LDcgQEAKICAgICB9CiAKICAgICAvKioge0Bpbmhlcml0RG9jfSAqLworICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIHNlbmRNdWx0aXBhcnRUZXh0KFN0cmluZyBkZXN0QWRkciwgU3RyaW5nIHNjQWRkciwKICAgICAgICAgICAgIEFycmF5TGlzdDxTdHJpbmc+IHBhcnRzLCBBcnJheUxpc3Q8UGVuZGluZ0ludGVudD4gc2VudEludGVudHMsCiAgICAgICAgICAgICBBcnJheUxpc3Q8UGVuZGluZ0ludGVudD4gZGVsaXZlcnlJbnRlbnRzKSB7CkBAIC0zNjQsNyArMzY4LDcgQEAKICAgICAgICAgICogVE9ETyhjbGVhbnVwKTogVGhlcmUgaXMgbm8gcmVhbCBjb2RlIGRpZmZlcmVuY2UgYmV0d2VlbgogICAgICAgICAgKiB0aGlzIGFuZCB0aGUgR1NNIHZlcnNpb24sIGFuZCBoZW5jZSBpdCBzaG91bGQgYmUgbW92ZWQgdG8KICAgICAgICAgICogdGhlIGJhc2UgY2xhc3Mgb3IgY29uc29saWRhdGVkIHNvbWVob3csIHByb3ZpZGVkIGNhbGxpbmcKLSAgICAgICAgICogdGhlIHByb3BlciBzdWJtaXRwZHUgc3R1ZmYgY2FuIGJlIGFycmFuZ2VkLgorICAgICAgICAgKiB0aGUgcHJvcGVyIHN1Ym1pdCBwZHUgc3R1ZmYgY2FuIGJlIGFycmFuZ2VkLgogICAgICAgICAgKi8KIAogICAgICAgICBpbnQgcmVmTnVtYmVyID0gZ2V0TmV4dENvbmNhdGVuYXRlZFJlZigpICYgMHgwMEZGOwpAQCAtNDM3LDggKzQ0MSw5IEBACiAgICAgfQogCiAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBzZW5kU21zKFNtc1RyYWNrZXIgdHJhY2tlcikgewotICAgICAgICBIYXNoTWFwIG1hcCA9IHRyYWNrZXIubURhdGE7CisgICAgICAgIEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+IG1hcCA9IHRyYWNrZXIubURhdGE7CiAKICAgICAgICAgYnl0ZSBzbXNjW10gPSAoYnl0ZVtdKSBtYXAuZ2V0KCJzbXNjIik7CiAgICAgICAgIGJ5dGUgcGR1W10gPSAoYnl0ZVtdKSBtYXAuZ2V0KCJwZHUiKTsKQEAgLTQ0OSwxMSArNDU0LDEzIEBACiAgICAgfQogCiAgICAgIC8qKiB7QGluaGVyaXREb2N9ICovCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgc2VuZE11bHRpcGFydFNtcyAoU21zVHJhY2tlciB0cmFja2VyKSB7CiAgICAgICAgIExvZy5kKFRBRywgIlRPRE86IENkbWFTTVNEaXNwYXRjaGVyLnNlbmRNdWx0aXBhcnRTbXMgbm90IGltcGxlbWVudGVkIik7CiAgICAgfQogCiAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBhY2tub3dsZWRnZUxhc3RJbmNvbWluZ1Ntcyhib29sZWFuIHN1Y2Nlc3MsIGludCByZXN1bHQsIE1lc3NhZ2UgcmVzcG9uc2UpewogICAgICAgICAvLyBGSVhNRSB1bml0IHRlc3QgbGVhdmVzIGNtID09IG51bGwuIHRoaXMgc2hvdWxkIGNoYW5nZQogCkBAIC00NzQsMTYgKzQ4MSwxOSBAQAogICAgIH0KIAogICAgIC8qKiB7QGluaGVyaXREb2N9ICovCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgYWN0aXZhdGVDZWxsQnJvYWRjYXN0U21zKGludCBhY3RpdmF0ZSwgTWVzc2FnZSByZXNwb25zZSkgewogICAgICAgICBtQ20uc2V0Q2RtYUJyb2FkY2FzdEFjdGl2YXRpb24oKGFjdGl2YXRlID09IDApLCByZXNwb25zZSk7CiAgICAgfQogCiAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBnZXRDZWxsQnJvYWRjYXN0U21zQ29uZmlnKE1lc3NhZ2UgcmVzcG9uc2UpIHsKICAgICAgICAgbUNtLmdldENkbWFCcm9hZGNhc3RDb25maWcocmVzcG9uc2UpOwogICAgIH0KIAogICAgIC8qKiB7QGluaGVyaXREb2N9ICovCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgc2V0Q2VsbEJyb2FkY2FzdENvbmZpZyhpbnRbXSBjb25maWdWYWx1ZXNBcnJheSwgTWVzc2FnZSByZXNwb25zZSkgewogICAgICAgICBtQ20uc2V0Q2RtYUJyb2FkY2FzdENvbmZpZyhjb25maWdWYWx1ZXNBcnJheSwgcmVzcG9uc2UpOwogICAgIH0KZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL0NkbWFTZXJ2aWNlU3RhdGVUcmFja2VyLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9DZG1hU2VydmljZVN0YXRlVHJhY2tlci5qYXZhCmluZGV4IDJjYWQ2Y2MuLjVkNGRjNTggMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL0NkbWFTZXJ2aWNlU3RhdGVUcmFja2VyLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvQ2RtYVNlcnZpY2VTdGF0ZVRyYWNrZXIuamF2YQpAQCAtMTExOSw3ICsxMTE5LDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIGlmIChoYXNDZG1hRGF0YUNvbm5lY3Rpb25DaGFuZ2VkIHx8IGhhc05ldHdvcmtUeXBlQ2hhbmdlZCkgewotICAgICAgICAgICAgcGhvbmUubm90aWZ5RGF0YUNvbm5lY3Rpb24obnVsbCk7CisgICAgICAgICAgICBwaG9uZS5ub3RpZnlEYXRhQ29ubmVjdGlvbihudWxsLCBudWxsKTsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChoYXNSb2FtaW5nT24pIHsKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL1J1aW1TbXNJbnRlcmZhY2VNYW5hZ2VyLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9SdWltU21zSW50ZXJmYWNlTWFuYWdlci5qYXZhCmluZGV4IGNmY2ZkOTguLmE5ZGYzNzUgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL1J1aW1TbXNJbnRlcmZhY2VNYW5hZ2VyLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvUnVpbVNtc0ludGVyZmFjZU1hbmFnZXIuamF2YQpAQCAtNjcsOCArNjcsNyBAQAogICAgICAgICAgICAgICAgICAgICBhciA9IChBc3luY1Jlc3VsdCltc2cub2JqOwogICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXIuZXhjZXB0aW9uID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU21zICA9IChMaXN0PFNtc1Jhd0RhdGE+KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRWYWxpZFJhd0RhdGEoKEFycmF5TGlzdDxieXRlW10+KSBhci5yZXN1bHQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TbXMgPSBidWlsZFZhbGlkUmF3RGF0YSgoQXJyYXlMaXN0PGJ5dGVbXT4pIGFyLnJlc3VsdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKERCRykgbG9nKCJDYW5ub3QgbG9hZCBTbXMgcmVjb3JkcyIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtU21zICE9IG51bGwpCmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9TbXNNZXNzYWdlLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9TbXNNZXNzYWdlLmphdmEKaW5kZXggYjUwNTAyYy4uNjVkODdmNSAxMDA3NTUKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvU21zTWVzc2FnZS5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL1Ntc01lc3NhZ2UuamF2YQpAQCAtMTgsMTEgKzE4LDggQEAKIAogaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsOwogaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtUHJvcGVydGllczsKLWltcG9ydCBhbmRyb2lkLnRleHQuZm9ybWF0LlRpbWU7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkNvbmZpZzsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5FbmNvZGVFeGNlcHRpb247Ci1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkdzbUFscGhhYmV0OwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5JY2NVdGlsczsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuU21zSGVhZGVyOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5TbXNNZXNzYWdlQmFzZTsKQEAgLTMzLDcgKzMwLDYgQEAKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuY2RtYS5zbXMuVXNlckRhdGE7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudXRpbC5IZXhEdW1wOwogCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRPdXRwdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKQEAgLTU4LDcgKzU0LDcgQEAKIC8qKgogICogVE9ETyhjbGVhbnVwKTogaW50ZXJuYWxseSByZXR1cm5pbmcgbnVsbCBpbiBtYW55IHBsYWNlcyBtYWtlcwogICogZGVidWdnaW5nIHZlcnkgaGFyZCAoYW1vbmcgbWFueSBvdGhlciByZWFzb25zKSBhbmQgc2hvdWxkIGJlIG1hZGUKLSAqIG1vcmUgbWVhbmluZ2Z1bCAocmVwbGFjZWQgd2l0aCBleGVjcHRpb25zIGZvciBleGFtcGxlKS4gIE51bGwKKyAqIG1vcmUgbWVhbmluZ2Z1bCAocmVwbGFjZWQgd2l0aCBleGNlcHRpb25zIGZvciBleGFtcGxlKS4gIE51bGwKICAqIHJldHVybnMgc2hvdWxkIG9ubHkgb2NjdXIgYXQgdGhlIHZlcnkgb3V0c2lkZSBvZiB0aGUgbW9kdWxlL2NsYXNzCiAgKiBzY29wZS4KICAqLwpAQCAtMjg3LDcgKzI4Myw3IEBACiAgICAgICogQHBhcmFtIGRlc3RBZGRyICAgICAgICAgICAgICBBZGRyZXNzIG9mIHRoZSByZWNpcGllbnQuCiAgICAgICogQHBhcmFtIG1lc3NhZ2UgICAgICAgICAgICAgICBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1lc3NhZ2UgcGF5bG9hZC4KICAgICAgKiBAcGFyYW0gc3RhdHVzUmVwb3J0UmVxdWVzdGVkIEluZGljYXRlcyB3aGV0aGVyIGEgcmVwb3J0IGlzIHJlcXVlc3RlZCBmb3IgdGhpcyBtZXNzYWdlLgotICAgICAqIEBwYXJhbSBoZWFkZXJEYXRhICAgICAgICAgICAgQXJyYXkgY29udGFpbmluZyB0aGUgZGF0YSBmb3IgdGhlIFVzZXIgRGF0YSBIZWFkZXIsIHByZWNlZGVkCisgICAgICogQHBhcmFtIHNtc0hlYWRlciAgICAgICAgICAgICBBcnJheSBjb250YWluaW5nIHRoZSBkYXRhIGZvciB0aGUgVXNlciBEYXRhIEhlYWRlciwgcHJlY2VkZWQKICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5IHRoZSBFbGVtZW50IElkZW50aWZpZXJzLgogICAgICAqIEByZXR1cm4gYSA8Y29kZT5TdWJtaXRQZHU8L2NvZGU+IGNvbnRhaW5pbmcgdGhlIGVuY29kZWQgU0MKICAgICAgKiAgICAgICAgIGFkZHJlc3MsIGlmIGFwcGxpY2FibGUsIGFuZCB0aGUgZW5jb2RlZCBtZXNzYWdlLgpAQCAtMzU1LDcgKzM1MSw3IEBACiAgICAgICogR2V0IGFuIFNNUy1TVUJNSVQgUERVIGZvciBhIGRhdGEgbWVzc2FnZSB0byBhIGRlc3RpbmF0aW9uIGFkZHJlc3MgJmFtcDsgcG9ydAogICAgICAqCiAgICAgICogQHBhcmFtIGRlc3RBZGRyIHRoZSBhZGRyZXNzIG9mIHRoZSBkZXN0aW5hdGlvbiBmb3IgdGhlIG1lc3NhZ2UKLSAgICAgKiBAcGFyYW0gdXNlckRhcmEgdGhlIGRhdGEgZm9yIHRoZSBtZXNzYWdlCisgICAgICogQHBhcmFtIHVzZXJEYXRhIHRoZSBkYXRhIGZvciB0aGUgbWVzc2FnZQogICAgICAqIEBwYXJhbSBzdGF0dXNSZXBvcnRSZXF1ZXN0ZWQgSW5kaWNhdGVzIHdoZXRoZXIgYSByZXBvcnQgaXMgcmVxdWVzdGVkIGZvciB0aGlzIG1lc3NhZ2UuCiAgICAgICogQHJldHVybiBhIDxjb2RlPlN1Ym1pdFBkdTwvY29kZT4gY29udGFpbmluZyB0aGUgZW5jb2RlZCBTQwogICAgICAqICAgICAgICAgYWRkcmVzcywgaWYgYXBwbGljYWJsZSwgYW5kIHRoZSBlbmNvZGVkIG1lc3NhZ2UuCkBAIC02MTQsNyArNjEwLDcgQEAKICAgICAgKiBpbmNyZW1lbnRpbmcgd2l0aGluIHRoZSByYW5nZSAxLi42NTUzNSByZW1lbWJlcmluZyB0aGUgc3RhdGUKICAgICAgKiB2aWEgYSBwZXJzaXN0ZW50IHN5c3RlbSBwcm9wZXJ0eS4gIChTZWUgQy5TMDAxNS1CLCB2Mi4wLAogICAgICAqIDQuMy4xLjUpIFNpbmNlIHRoaXMgcm91dGluZSBpcyBleHBlY3RlZCB0byBiZSBhY2Nlc3NlZCB2aWEgdmlhCi0gICAgICogYmluZGVyLWNhbGwsIGFuZCBoZW5jZSBzaG91bGQgYmUgdGhyZWFkc2FmZSwgaXQgaGFzIGJlZW4KKyAgICAgKiBiaW5kZXItY2FsbCwgYW5kIGhlbmNlIHNob3VsZCBiZSB0aHJlYWQtc2FmZSwgaXQgaGFzIGJlZW4KICAgICAgKiBzeW5jaHJvbml6ZWQuCiAgICAgICovCiAgICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgc3RhdGljIGludCBnZXROZXh0TWVzc2FnZUlkKCkgewpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvc21zL0JlYXJlckRhdGEuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL3Ntcy9CZWFyZXJEYXRhLmphdmEKaW5kZXggYzcwMzJhYy4uZTlmZWE1NSAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvc21zL0JlYXJlckRhdGEuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9zbXMvQmVhcmVyRGF0YS5qYXZhCkBAIC0yMSw3ICsyMSw2IEBACiBpbXBvcnQgc3RhdGljIGFuZHJvaWQudGVsZXBob255LlNtc01lc3NhZ2UuTUFYX1VTRVJfREFUQV9CWVRFU19XSVRIX0hFQURFUjsKIAogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLlNwYXJzZUludEFycmF5OwogCiBpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuU21zTWVzc2FnZTsKIApAQCAtMzAsMTAgKzI5LDggQEAKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuSWNjVXRpbHM7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkdzbUFscGhhYmV0OwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5TbXNIZWFkZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmNkbWEuc21zLlVzZXJEYXRhOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5TbXNNZXNzYWdlQmFzZS5UZXh0RW5jb2RpbmdEZXRhaWxzOwogCi1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudXRpbC5IZXhEdW1wOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnV0aWwuQml0d2lzZUlucHV0U3RyZWFtOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnV0aWwuQml0d2lzZU91dHB1dFN0cmVhbTsKIApAQCAtNDUsMTMgKzQyLDEzIEBACiAgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIExPR19UQUcgPSAiU01TIjsKIAogICAgIC8qKgotICAgICAqIEJlYXJlciBEYXRhIFN1YnBhcmFtZXRlciBJbmRlbnRpZmllcnMKKyAgICAgKiBCZWFyZXIgRGF0YSBTdWJwYXJhbWV0ZXIgSWRlbnRpZmllcnMKICAgICAgKiAoU2VlIDNHUFAyIEMuUzAwMTUtQiwgdjIuMCwgdGFibGUgNC41LTEpCiAgICAgICogTk9URTogQ29tbWVudGVkIHN1YnBhcmFtZXRlciB0eXBlcyBhcmUgbm90IGltcGxlbWVudGVkLgogICAgICAqLwogICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGJ5dGUgU1VCUEFSQU1fTUVTU0FHRV9JREVOVElGSUVSICAgICAgICAgICAgICAgPSAweDAwOwogICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGJ5dGUgU1VCUEFSQU1fVVNFUl9EQVRBICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAxOwotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGJ5dGUgU1VCUEFSQU1fVVNFUl9SRVBPTlNFX0NPREUgICAgICAgICAgICAgICAgPSAweDAyOworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGJ5dGUgU1VCUEFSQU1fVVNFUl9SRVNQT05TRV9DT0RFICAgICAgICAgICAgICAgPSAweDAyOwogICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGJ5dGUgU1VCUEFSQU1fTUVTU0FHRV9DRU5URVJfVElNRV9TVEFNUCAgICAgICAgPSAweDAzOwogICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGJ5dGUgU1VCUEFSQU1fVkFMSURJVFlfUEVSSU9EX0FCU09MVVRFICAgICAgICAgPSAweDA0OwogICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGJ5dGUgU1VCUEFSQU1fVkFMSURJVFlfUEVSSU9EX1JFTEFUSVZFICAgICAgICAgPSAweDA1OwpAQCAtNDA1LDcgKzQwMiw3IEBACiAgICAgLyoqCiAgICAgICogQ2FsY3VsYXRlIHRoZSBtZXNzYWdlIHRleHQgZW5jb2RpbmcgbGVuZ3RoLCBmcmFnbWVudGF0aW9uLCBhbmQgb3RoZXIgZGV0YWlscy4KICAgICAgKgotICAgICAqIEBwYXJhbSBmb3JjZSBpZ25vcmUgKGJ1dCBzdGlsbCBjb3VudCkgaWxsZWdhbCBjaGFyYWN0ZXJzIGlmIHRydWUKKyAgICAgKiBAcGFyYW0gZm9yY2U3Qml0RW5jb2RpbmcgaWdub3JlIChidXQgc3RpbGwgY291bnQpIGlsbGVnYWwgY2hhcmFjdGVycyBpZiB0cnVlCiAgICAgICogQHJldHVybiBzZXB0ZXQgY291bnQsIG9yIC0xIG9uIGZhaWx1cmUKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIFRleHRFbmNvZGluZ0RldGFpbHMgY2FsY1RleHRFbmNvZGluZ0RldGFpbHMoQ2hhclNlcXVlbmNlIG1zZywKQEAgLTY5NSw3ICs2OTIsNyBAQAogICAgIC8qCiAgICAgICogVE9ETyhjbGVhbnVwKTogQ2RtYVNtc0FkZHJlc3MgZW5jb2Rpbmcgc2hvdWxkIG1ha2UgdXNlIG9mCiAgICAgICogQ2RtYVNtc0FkZHJlc3MucGFyc2UgcHJvdmlkZWQgdGhhdCBEVE1GIGVuY29kaW5nIGlzIHVuaWZpZWQsCi0gICAgICogYW5kIHRoZSBkaWZmZXJlbmNlIGluIDRiaXQgdnMgOGJpdCBpcyByZXNvbHZlZC4KKyAgICAgKiBhbmQgdGhlIGRpZmZlcmVuY2UgaW4gNC1iaXQgdnMuIDgtYml0IGlzIHJlc29sdmVkLgogICAgICAqLwogCiAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBlbmNvZGVDZG1hU21zQWRkcmVzcyhDZG1hU21zQWRkcmVzcyBhZGRyKSB0aHJvd3MgQ29kaW5nRXhjZXB0aW9uIHsKQEAgLTgwMiw5ICs3OTksOSBAQAogICAgICAqIENyZWF0ZSBzZXJpYWxpemVkIHJlcHJlc2VudGF0aW9uIGZvciBCZWFyZXJEYXRhIG9iamVjdC4KICAgICAgKiAoU2VlIDNHUFAyIEMuUjEwMDEtRiwgdjEuMCwgc2VjdGlvbiA0LjUgZm9yIGxheW91dCBkZXRhaWxzKQogICAgICAqCi0gICAgICogQHBhcmFtIGJlYXJlckRhdGEgYW4gaW5zdGFuY2Ugb2YgQmVhcmVyRGF0YS4KKyAgICAgKiBAcGFyYW0gYkRhdGEgYW4gaW5zdGFuY2Ugb2YgQmVhcmVyRGF0YS4KICAgICAgKgotICAgICAqIEByZXR1cm4gZGF0YSBieXRhIGFycmF5IG9mIHJhdyBlbmNvZGVkIFNNUyBiZWFyZXIgZGF0YS4KKyAgICAgKiBAcmV0dXJuIGRhdGEgYnl0ZSBhcnJheSBvZiByYXcgZW5jb2RlZCBTTVMgYmVhcmVyIGRhdGEuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBieXRlW10gZW5jb2RlKEJlYXJlckRhdGEgYkRhdGEpIHsKICAgICAgICAgYkRhdGEuaGFzVXNlckRhdGFIZWFkZXIgPSAoKGJEYXRhLnVzZXJEYXRhICE9IG51bGwpICYmCkBAIC05MTQsNyArOTExLDcgQEAKICAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZGVjb2RlVXRmMTYoYnl0ZVtdIGRhdGEsIGludCBvZmZzZXQsIGludCBudW1GaWVsZHMpCiAgICAgICAgIHRocm93cyBDb2RpbmdFeGNlcHRpb24KICAgICB7Ci0gICAgICAgIC8vIFN0YXJ0IHJlYWRpbmcgZnJvbSB0aGUgbmV4dCAxNi1iaXQgYWxpZ25lZCBib3VuZHJ5IGFmdGVyIG9mZnNldC4KKyAgICAgICAgLy8gU3RhcnQgcmVhZGluZyBmcm9tIHRoZSBuZXh0IDE2LWJpdCBhbGlnbmVkIGJvdW5kYXJ5IGFmdGVyIG9mZnNldC4KICAgICAgICAgaW50IHBhZGRpbmcgPSBvZmZzZXQgJSAyOwogICAgICAgICBudW1GaWVsZHMgLT0gKG9mZnNldCArIHBhZGRpbmcpIC8gMjsKICAgICAgICAgdHJ5IHsKQEAgLTk2MCw3ICs5NTcsNyBAQAogICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBkZWNvZGU3Yml0R3NtKGJ5dGVbXSBkYXRhLCBpbnQgb2Zmc2V0LCBpbnQgbnVtRmllbGRzKQogICAgICAgICB0aHJvd3MgQ29kaW5nRXhjZXB0aW9uCiAgICAgewotICAgICAgICAvLyBTdGFydCByZWFkaW5nIGZyb20gdGhlIG5leHQgNy1iaXQgYWxpZ25lZCBib3VuZHJ5IGFmdGVyIG9mZnNldC4KKyAgICAgICAgLy8gU3RhcnQgcmVhZGluZyBmcm9tIHRoZSBuZXh0IDctYml0IGFsaWduZWQgYm91bmRhcnkgYWZ0ZXIgb2Zmc2V0LgogICAgICAgICBpbnQgb2Zmc2V0Qml0cyA9IG9mZnNldCAqIDg7CiAgICAgICAgIGludCBvZmZzZXRTZXB0ZXRzID0gKG9mZnNldEJpdHMgKyA2KSAvIDc7CiAgICAgICAgIG51bUZpZWxkcyAtPSBvZmZzZXRTZXB0ZXRzOwpAQCAtMTU1Myw3ICsxNTUwLDcgQEAKICAgICAgICAgICAgICAgICBjYXNlIFNVQlBBUkFNX1VTRVJfREFUQToKICAgICAgICAgICAgICAgICAgICAgZGVjb2RlU3VjY2VzcyA9IGRlY29kZVVzZXJEYXRhKGJEYXRhLCBpblN0cmVhbSk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgU1VCUEFSQU1fVVNFUl9SRVBPTlNFX0NPREU6CisgICAgICAgICAgICAgICAgY2FzZSBTVUJQQVJBTV9VU0VSX1JFU1BPTlNFX0NPREU6CiAgICAgICAgICAgICAgICAgICAgIGRlY29kZVN1Y2Nlc3MgPSBkZWNvZGVVc2VyUmVzcG9uc2VDb2RlKGJEYXRhLCBpblN0cmVhbSk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgU1VCUEFSQU1fUkVQTFlfT1BUSU9OOgpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvc21zL1Ntc0VudmVsb3BlLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9zbXMvU21zRW52ZWxvcGUuamF2YQppbmRleCAwZGNhY2MxLi5hNjczMjdhIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9zbXMvU21zRW52ZWxvcGUuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9zbXMvU21zRW52ZWxvcGUuamF2YQpAQCAtMTcsNyArMTcsNyBAQAogcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuY2RtYS5zbXM7CiAKIAotcHVibGljIGZpbmFsIGNsYXNzIFNtc0VudmVsb3BleworcHVibGljIGZpbmFsIGNsYXNzIFNtc0VudmVsb3BlIHsKICAgICAvKioKICAgICAgKiBNZXNzYWdlIFR5cGVzCiAgICAgICogKFNlZSAzR1BQMiBDLlMwMDE1LUIgMy40LjEpCmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL0dTTVBob25lLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL0dTTVBob25lLmphdmEKaW5kZXggYzdiMWU1Yy4uMDRiNzViYyAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9HU01QaG9uZS5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vR1NNUGhvbmUuamF2YQpAQCAtMjkxLDcgKzI5MSw3IEBACiAgICAgICAgIHJldHVybiBtUGVuZGluZ01NSXM7CiAgICAgfQogCi0gICAgcHVibGljIERhdGFTdGF0ZSBnZXREYXRhQ29ubmVjdGlvblN0YXRlKCkgeworICAgIHB1YmxpYyBEYXRhU3RhdGUgZ2V0RGF0YUNvbm5lY3Rpb25TdGF0ZShTdHJpbmcgYXBuVHlwZSkgewogICAgICAgICBEYXRhU3RhdGUgcmV0ID0gRGF0YVN0YXRlLkRJU0NPTk5FQ1RFRDsKIAogICAgICAgICBpZiAobVNTVCA9PSBudWxsKSB7CkBAIC0zMDQsNiArMzA0LDggQEAKICAgICAgICAgICAgIC8vIElmIHdlJ3JlIG91dCBvZiBzZXJ2aWNlLCBvcGVuIFRDUCBzb2NrZXRzIG1heSBzdGlsbCB3b3JrCiAgICAgICAgICAgICAvLyBidXQgbm8gZGF0YSB3aWxsIGZsb3cKICAgICAgICAgICAgIHJldCA9IERhdGFTdGF0ZS5ESVNDT05ORUNURUQ7CisgICAgICAgIH0gZWxzZSBpZiAobURhdGFDb25uZWN0aW9uLmlzQXBuVHlwZUVuYWJsZWQoYXBuVHlwZSkgPT0gZmFsc2UpIHsKKyAgICAgICAgICAgIHJldCA9IERhdGFTdGF0ZS5ESVNDT05ORUNURUQ7CiAgICAgICAgIH0gZWxzZSB7IC8qIG1TU1QuZ3Byc1N0YXRlID09IFNlcnZpY2VTdGF0ZS5TVEFURV9JTl9TRVJWSUNFICovCiAgICAgICAgICAgICBzd2l0Y2ggKG1EYXRhQ29ubmVjdGlvbi5nZXRTdGF0ZSgpKSB7CiAgICAgICAgICAgICAgICAgY2FzZSBGQUlMRUQ6CkBAIC00MDUsOCArNDA3LDggQEAKICAgICB9CiAKICAgICAvKnBhY2thZ2UqLyB2b2lkCi0gICAgbm90aWZ5RGF0YUNvbm5lY3Rpb25GYWlsZWQoU3RyaW5nIHJlYXNvbikgewotICAgICAgICBtTm90aWZpZXIubm90aWZ5RGF0YUNvbm5lY3Rpb25GYWlsZWQodGhpcywgcmVhc29uKTsKKyAgICBub3RpZnlEYXRhQ29ubmVjdGlvbkZhaWxlZChTdHJpbmcgcmVhc29uLCBTdHJpbmcgYXBuVHlwZSkgeworICAgICAgICBtTm90aWZpZXIubm90aWZ5RGF0YUNvbm5lY3Rpb25GYWlsZWQodGhpcywgcmVhc29uLCBhcG5UeXBlKTsKICAgICB9CiAKICAgICAvKnBhY2thZ2UqLyB2b2lkCkBAIC0xMDkzLDI3ICsxMDk1LDYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBUaGUgb25seSBjaXJjdW1zdGFuY2VzIHVuZGVyIHdoaWNoIHdlIHJlcG9ydCB0aGF0IGRhdGEgY29ubmVjdGl2aXR5IGlzIG5vdAotICAgICAqIHBvc3NpYmxlIGFyZQotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+RGF0YSByb2FtaW5nIGlzIGRpc2FsbG93ZWQgYW5kIHdlIGFyZSByb2FtaW5nLjwvbGk+Ci0gICAgICogPGxpPlRoZSBjdXJyZW50IGRhdGEgc3RhdGUgaXMge0Bjb2RlIERJU0NPTk5FQ1RFRH0gZm9yIGEgcmVhc29uIG90aGVyIHRoYW4KLSAgICAgKiBoYXZpbmcgZXhwbGljaXRseSBkaXNhYmxlZCBjb25uZWN0aXZpdHkuIEluIG90aGVyIHdvcmRzLCBkYXRhIGlzIG5vdCBhdmFpbGFibGUKLSAgICAgKiBiZWNhdXNlIHRoZSBwaG9uZSBpcyBvdXQgb2YgY292ZXJhZ2Ugb3Igc29tZSBsaWtlIHJlYXNvbi48L2xpPgotICAgICAqIDwvdWw+Ci0gICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgZGF0YSBjb25uZWN0aXZpdHkgaXMgcG9zc2libGUsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzRGF0YUNvbm5lY3Rpdml0eVBvc3NpYmxlKCkgewotICAgICAgICAvLyBUT0RPOiBDdXJyZW50bHkgY2hlY2tzIGlmIGFueSBHUFJTIGNvbm5lY3Rpb24gaXMgYWN0aXZlLiBTaG91bGQgaXQgb25seQotICAgICAgICAvLyBjaGVjayBmb3IgImRlZmF1bHQiPwotICAgICAgICBib29sZWFuIG5vRGF0YSA9IG1EYXRhQ29ubmVjdGlvbi5nZXREYXRhRW5hYmxlZCgpICYmCi0gICAgICAgICAgICBnZXREYXRhQ29ubmVjdGlvblN0YXRlKCkgPT0gRGF0YVN0YXRlLkRJU0NPTk5FQ1RFRDsKLSAgICAgICAgcmV0dXJuICFub0RhdGEgJiYgZ2V0SWNjQ2FyZCgpLmdldFN0YXRlKCkgPT0gU2ltQ2FyZC5TdGF0ZS5SRUFEWSAmJgotICAgICAgICAgICAgICAgIGdldFNlcnZpY2VTdGF0ZSgpLmdldFN0YXRlKCkgPT0gU2VydmljZVN0YXRlLlNUQVRFX0lOX1NFUlZJQ0UgJiYKLSAgICAgICAgICAgIChtRGF0YUNvbm5lY3Rpb24uZ2V0RGF0YU9uUm9hbWluZ0VuYWJsZWQoKSB8fCAhZ2V0U2VydmljZVN0YXRlKCkuZ2V0Um9hbWluZygpKTsKLSAgICB9Ci0KLSAgICAvKioKICAgICAgKiBSZW1vdmVzIHRoZSBnaXZlbiBNTUkgZnJvbSB0aGUgcGVuZGluZyBsaXN0IGFuZCBub3RpZmllcwogICAgICAqIHJlZ2lzdHJhbnRzIHRoYXQgaXQgaXMgY29tcGxldGUuCiAgICAgICogQHBhcmFtIG1taSBNTUkgdGhhdCBpcyBkb25lCmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL0dzbURhdGFDb25uZWN0aW9uVHJhY2tlci5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9Hc21EYXRhQ29ubmVjdGlvblRyYWNrZXIuamF2YQppbmRleCBmNmQ0NDkxLi42ODI2ZmE4IDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL0dzbURhdGFDb25uZWN0aW9uVHJhY2tlci5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vR3NtRGF0YUNvbm5lY3Rpb25UcmFja2VyLmphdmEKQEAgLTM4OCwxMiArMzg4LDYgQEAKICAgICAgICAgcmV0dXJuIHBkcHM7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzRGF0YUFsbG93ZWQoKSB7Ci0gICAgICAgIGJvb2xlYW4gcm9hbWluZyA9IHBob25lLmdldFNlcnZpY2VTdGF0ZSgpLmdldFJvYW1pbmcoKTsKLSAgICAgICAgcmV0dXJuIGdldEFueURhdGFFbmFibGVkKCkgJiYgKCFyb2FtaW5nIHx8IGdldERhdGFPblJvYW1pbmdFbmFibGVkKCkpICYmCi0gICAgICAgICAgICAgICAgbU1hc3RlckRhdGFFbmFibGVkOwotICAgIH0KLQogICAgIC8vKioqKioqIENhbGxlZCBmcm9tIFNlcnZpY2VTdGF0ZVRyYWNrZXIKICAgICAvKioKICAgICAgKiBJbnZva2VkIHdoZW4gU2VydmljZVN0YXRlVHJhY2tlciBvYnNlcnZlcyBhIHRyYW5zaXRpb24gZnJvbSBHUFJTCkBAIC00MDUsMTMgKzM5OSwxMyBAQAogICAgICAgICAgKiB3aGVuIEdQUlMgZGV0YWNoZXMsIGJ1dCB3ZSBzaG91bGQgc3RvcCB0aGUgbmV0d29yayBwb2xsaW5nLgogICAgICAgICAgKi8KICAgICAgICAgc3RvcE5ldFN0YXRQb2xsKCk7Ci0gICAgICAgIHBob25lLm5vdGlmeURhdGFDb25uZWN0aW9uKFBob25lLlJFQVNPTl9HUFJTX0RFVEFDSEVEKTsKKyAgICAgICAgbm90aWZ5RGF0YUNvbm5lY3Rpb24oUGhvbmUuUkVBU09OX0dQUlNfREVUQUNIRUQpOwogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBvbkdwcnNBdHRhY2hlZCgpIHsKICAgICAgICAgaWYgKHN0YXRlID09IFN0YXRlLkNPTk5FQ1RFRCkgewogICAgICAgICAgICAgc3RhcnROZXRTdGF0UG9sbCgpOwotICAgICAgICAgICAgcGhvbmUubm90aWZ5RGF0YUNvbm5lY3Rpb24oUGhvbmUuUkVBU09OX0dQUlNfQVRUQUNIRUQpOworICAgICAgICAgICAgbm90aWZ5RGF0YUNvbm5lY3Rpb24oUGhvbmUuUkVBU09OX0dQUlNfQVRUQUNIRUQpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgaWYgKHN0YXRlID09IFN0YXRlLkZBSUxFRCkgewogICAgICAgICAgICAgICAgIGNsZWFuVXBDb25uZWN0aW9uKGZhbHNlLCBQaG9uZS5SRUFTT05fR1BSU19BVFRBQ0hFRCk7CkBAIC00MjEsNiArNDE1LDM1IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0RhdGFBbGxvd2VkKCkgeworICAgICAgICBpbnQgZ3Byc1N0YXRlID0gbUdzbVBob25lLm1TU1QuZ2V0Q3VycmVudEdwcnNTdGF0ZSgpOworICAgICAgICBib29sZWFuIGRlc2lyZWRQb3dlclN0YXRlID0gbUdzbVBob25lLm1TU1QuZ2V0RGVzaXJlZFBvd2VyU3RhdGUoKTsKKworICAgICAgICBib29sZWFuIGFsbG93ZWQgPSAoKGdwcnNTdGF0ZSA9PSBTZXJ2aWNlU3RhdGUuU1RBVEVfSU5fU0VSVklDRSB8fCBub0F1dG9BdHRhY2gpICYmCisgICAgICAgICAgICAgICAgbUdzbVBob25lLm1TSU1SZWNvcmRzLmdldFJlY29yZHNMb2FkZWQoKSAmJgorICAgICAgICAgICAgICAgIHBob25lLmdldFN0YXRlKCkgPT0gUGhvbmUuU3RhdGUuSURMRSAmJgorICAgICAgICAgICAgICAgIG1NYXN0ZXJEYXRhRW5hYmxlZCAmJgorICAgICAgICAgICAgICAgICghcGhvbmUuZ2V0U2VydmljZVN0YXRlKCkuZ2V0Um9hbWluZygpIHx8IGdldERhdGFPblJvYW1pbmdFbmFibGVkKCkpICYmCisgICAgICAgICAgICAgICAgIW1Jc1BzUmVzdHJpY3RlZCAmJgorICAgICAgICAgICAgICAgIGRlc2lyZWRQb3dlclN0YXRlKTsKKyAgICAgICAgaWYgKCFhbGxvd2VkICYmIERCRykgeworICAgICAgICAgICAgU3RyaW5nIHJlYXNvbiA9ICIiOworICAgICAgICAgICAgaWYgKGdwcnNTdGF0ZSAhPSBTZXJ2aWNlU3RhdGUuU1RBVEVfSU5fU0VSVklDRSkgcmVhc29uICs9ICIgLSBncHJzPSAiICsgZ3Byc1N0YXRlOworICAgICAgICAgICAgaWYgKCFtR3NtUGhvbmUubVNJTVJlY29yZHMuZ2V0UmVjb3Jkc0xvYWRlZCgpKSByZWFzb24gKz0gIiAtIFNJTSBub3QgbG9hZGVkIjsKKyAgICAgICAgICAgIGlmIChwaG9uZS5nZXRTdGF0ZSgpICE9IFBob25lLlN0YXRlLklETEUpIHsKKyAgICAgICAgICAgICAgICByZWFzb24gKz0gIiAtIFBob25lU3RhdGU9ICIgKyBwaG9uZS5nZXRTdGF0ZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFtTWFzdGVyRGF0YUVuYWJsZWQpIHJlYXNvbiArPSAiIC0gbU1hc3RlckRhdGFFbmFibGVkPSBmYWxzZSI7CisgICAgICAgICAgICBpZiAocGhvbmUuZ2V0U2VydmljZVN0YXRlKCkuZ2V0Um9hbWluZygpICYmIGdldERhdGFPblJvYW1pbmdFbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICByZWFzb24gKz0gIiAtIFJvYW1pbmciOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1Jc1BzUmVzdHJpY3RlZCkgcmVhc29uICs9ICIgLSBtSXNQc1Jlc3RyaWN0ZWQ9IHRydWUiOworICAgICAgICAgICAgaWYgKCFkZXNpcmVkUG93ZXJTdGF0ZSkgcmVhc29uICs9ICIgLSBkZXNpcmVkUG93ZXJTdGF0ZT0gZmFsc2UiOworICAgICAgICAgICAgbG9nKCJEYXRhIG5vdCBhbGxvd2VkIGR1ZSB0byIgKyByZWFzb24pOworICAgICAgICB9CisgICAgICAgIHJldHVybiBhbGxvd2VkOworICAgIH0KKwogICAgIHByaXZhdGUgYm9vbGVhbiB0cnlTZXR1cERhdGEoU3RyaW5nIHJlYXNvbikgewogICAgICAgICBpZiAoREJHKSBsb2coIioqKnRyeVNldHVwRGF0YSBkdWUgdG8gIiArIChyZWFzb24gPT0gbnVsbCA/ICIodW5zcGVjaWZpZWQpIiA6IHJlYXNvbikpOwogCkBAIC00MzAsNyArNDUzLDcgQEAKICAgICAgICAgICAgIC8vIEFzc3VtZSBkYXRhIGlzIGNvbm5lY3RlZCBvbiB0aGUgc2ltdWxhdG9yCiAgICAgICAgICAgICAvLyBGSVhNRSAgdGhpcyBjYW4gYmUgaW1wcm92ZWQKICAgICAgICAgICAgIHNldFN0YXRlKFN0YXRlLkNPTk5FQ1RFRCk7Ci0gICAgICAgICAgICBwaG9uZS5ub3RpZnlEYXRhQ29ubmVjdGlvbihyZWFzb24pOworICAgICAgICAgICAgbm90aWZ5RGF0YUNvbm5lY3Rpb24ocmVhc29uKTsKIAogICAgICAgICAgICAgTG9nLmkoTE9HX1RBRywgIihmaXg/KSBXZSdyZSBvbiB0aGUgc2ltdWxhdG9yOyBhc3N1bWluZyBkYXRhIGlzIGNvbm5lY3RlZCIpOwogICAgICAgICAgICAgcmV0dXJuIHRydWU7CkBAIC00MzksMTkgKzQ2MiwxNSBAQAogICAgICAgICBpbnQgZ3Byc1N0YXRlID0gbUdzbVBob25lLm1TU1QuZ2V0Q3VycmVudEdwcnNTdGF0ZSgpOwogICAgICAgICBib29sZWFuIGRlc2lyZWRQb3dlclN0YXRlID0gbUdzbVBob25lLm1TU1QuZ2V0RGVzaXJlZFBvd2VyU3RhdGUoKTsKIAotICAgICAgICBpZiAoKHN0YXRlID09IFN0YXRlLklETEUgfHwgc3RhdGUgPT0gU3RhdGUuU0NBTk5JTkcpCi0gICAgICAgICAgICAgICAgJiYgKGdwcnNTdGF0ZSA9PSBTZXJ2aWNlU3RhdGUuU1RBVEVfSU5fU0VSVklDRSB8fCBub0F1dG9BdHRhY2gpCi0gICAgICAgICAgICAgICAgJiYgbUdzbVBob25lLm1TSU1SZWNvcmRzLmdldFJlY29yZHNMb2FkZWQoKQotICAgICAgICAgICAgICAgICYmIHBob25lLmdldFN0YXRlKCkgPT0gUGhvbmUuU3RhdGUuSURMRQotICAgICAgICAgICAgICAgICYmIGlzRGF0YUFsbG93ZWQoKQotICAgICAgICAgICAgICAgICYmICFtSXNQc1Jlc3RyaWN0ZWQKLSAgICAgICAgICAgICAgICAmJiBkZXNpcmVkUG93ZXJTdGF0ZSApIHsKKyAgICAgICAgaWYgKCgoc3RhdGUgPT0gU3RhdGUuSURMRSkgfHwgKHN0YXRlID09IFN0YXRlLlNDQU5OSU5HKSkgJiYKKyAgICAgICAgICAgICAgICBpc0RhdGFBbGxvd2VkKCkgJiYgZ2V0QW55RGF0YUVuYWJsZWQoKSkgewogCiAgICAgICAgICAgICBpZiAoc3RhdGUgPT0gU3RhdGUuSURMRSkgewogICAgICAgICAgICAgICAgIHdhaXRpbmdBcG5zID0gYnVpbGRXYWl0aW5nQXBucygpOwogICAgICAgICAgICAgICAgIGlmICh3YWl0aW5nQXBucy5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKERCRykgbG9nKCJObyBBUE4gZm91bmQiKTsKICAgICAgICAgICAgICAgICAgICAgbm90aWZ5Tm9EYXRhKEdzbURhdGFDb25uZWN0aW9uLkZhaWxDYXVzZS5NSVNTSU5HX1VOS05PV05fQVBOKTsKKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5T2ZmQXBuc09mQXZhaWxhYmlsaXR5KHJlYXNvbiwgZmFsc2UpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgbG9nICgiQ3JlYXRlIGZyb20gYWxsQXBucyA6ICIgKyBhcG5MaXN0VG9TdHJpbmcoYWxsQXBucykpOwpAQCAtNDYxLDIyICs0ODAsMTEgQEAKICAgICAgICAgICAgIGlmIChEQkcpIHsKICAgICAgICAgICAgICAgICBsb2cgKCJTZXR1cCB3YWl0bmdBcG5zIDogIiArIGFwbkxpc3RUb1N0cmluZyh3YWl0aW5nQXBucykpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHNldHVwRGF0YShyZWFzb24pOworICAgICAgICAgICAgYm9vbGVhbiByZXRWYWx1ZSA9IHNldHVwRGF0YShyZWFzb24pOworICAgICAgICAgICAgbm90aWZ5T2ZmQXBuc09mQXZhaWxhYmlsaXR5KHJlYXNvbiwgcmV0VmFsdWUpOworICAgICAgICAgICAgcmV0dXJuIHJldFZhbHVlOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKERCRykKLSAgICAgICAgICAgICAgICBsb2coInRyeVNldHVwRGF0YTogTm90IHJlYWR5IGZvciBkYXRhOiAiICsKLSAgICAgICAgICAgICAgICAgICAgIiBkYXRhU3RhdGU9IiArIHN0YXRlICsKLSAgICAgICAgICAgICAgICAgICAgIiBncHJzU3RhdGU9IiArIGdwcnNTdGF0ZSArCi0gICAgICAgICAgICAgICAgICAgICIgc2ltPSIgKyBtR3NtUGhvbmUubVNJTVJlY29yZHMuZ2V0UmVjb3Jkc0xvYWRlZCgpICsKLSAgICAgICAgICAgICAgICAgICAgIiBVTVRTPSIgKyBtR3NtUGhvbmUubVNTVC5pc0NvbmN1cnJlbnRWb2ljZUFuZERhdGEoKSArCi0gICAgICAgICAgICAgICAgICAgICIgcGhvbmVTdGF0ZT0iICsgcGhvbmUuZ2V0U3RhdGUoKSArCi0gICAgICAgICAgICAgICAgICAgICIgaXNEYXRhQWxsb3dlZD0iICsgaXNEYXRhQWxsb3dlZCgpICsKLSAgICAgICAgICAgICAgICAgICAgIiBkYXRhRW5hYmxlZD0iICsgZ2V0QW55RGF0YUVuYWJsZWQoKSArCi0gICAgICAgICAgICAgICAgICAgICIgcm9hbWluZz0iICsgcGhvbmUuZ2V0U2VydmljZVN0YXRlKCkuZ2V0Um9hbWluZygpICsKLSAgICAgICAgICAgICAgICAgICAgIiBkYXRhT25Sb2FtaW5nRW5hYmxlPSIgKyBnZXREYXRhT25Sb2FtaW5nRW5hYmxlZCgpICsKLSAgICAgICAgICAgICAgICAgICAgIiBwcyByZXN0cmljdGVkPSIgKyBtSXNQc1Jlc3RyaWN0ZWQgKwotICAgICAgICAgICAgICAgICAgICAiIGRlc2lyZWRQb3dlclN0YXRlPSIgKyBkZXNpcmVkUG93ZXJTdGF0ZSArCi0gICAgICAgICAgICAgICAgICAgICIgTWFzdGVyRGF0YUVuYWJsZWQ9IiArIG1NYXN0ZXJEYXRhRW5hYmxlZCk7CisgICAgICAgICAgICBub3RpZnlPZmZBcG5zT2ZBdmFpbGFiaWxpdHkocmVhc29uLCBmYWxzZSk7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICB9CkBAIC01OTUsNyArNjAzLDcgQEAKICAgICAgICAgcGRwLmNvbm5lY3QobXNnLCBhcG4pOwogCiAgICAgICAgIHNldFN0YXRlKFN0YXRlLklOSVRJTkcpOwotICAgICAgICBwaG9uZS5ub3RpZnlEYXRhQ29ubmVjdGlvbihyZWFzb24pOworICAgICAgICBub3RpZnlEYXRhQ29ubmVjdGlvbihyZWFzb24pOwogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKQEAgLTc0Niw3ICs3NTQsNyBAQAogCiAgICAgcHJpdmF0ZSB2b2lkIG5vdGlmeURlZmF1bHREYXRhKFN0cmluZyByZWFzb24pIHsKICAgICAgICAgc2V0U3RhdGUoU3RhdGUuQ09OTkVDVEVEKTsKLSAgICAgICAgcGhvbmUubm90aWZ5RGF0YUNvbm5lY3Rpb24ocmVhc29uKTsKKyAgICAgICAgbm90aWZ5RGF0YUNvbm5lY3Rpb24ocmVhc29uKTsKICAgICAgICAgc3RhcnROZXRTdGF0UG9sbCgpOwogICAgICAgICAvLyByZXNldCByZWNvbm5lY3QgdGltZXIKICAgICAgICAgbVJldHJ5TWdyLnJlc2V0UmV0cnlDb3VudCgpOwpAQCAtNzU2LDcgKzc2NCw3IEBACiAgICAgcHJpdmF0ZSB2b2lkIGdvdG9JZGxlQW5kTm90aWZ5RGF0YUNvbm5lY3Rpb24oU3RyaW5nIHJlYXNvbikgewogICAgICAgICBpZiAoREJHKSBsb2coImdvdG9JZGxlQW5kTm90aWZ5RGF0YUNvbm5lY3Rpb246IHJlYXNvbj0iICsgcmVhc29uKTsKICAgICAgICAgc2V0U3RhdGUoU3RhdGUuSURMRSk7Ci0gICAgICAgIHBob25lLm5vdGlmeURhdGFDb25uZWN0aW9uKHJlYXNvbik7CisgICAgICAgIG5vdGlmeURhdGFDb25uZWN0aW9uKHJlYXNvbik7CiAgICAgICAgIG1BY3RpdmVBcG4gPSBudWxsOwogICAgIH0KIApAQCAtOTk4LDcgKzEwMDYsNyBAQAogICAgICAgICAgICAgaWYgKCFtUmV0cnlNZ3IuaXNSZXRyeU5lZWRlZCgpKSB7CiAgICAgICAgICAgICAgICAgaWYgKCFtUmVxdWVzdGVkQXBuVHlwZS5lcXVhbHMoUGhvbmUuQVBOX1RZUEVfREVGQVVMVCkpIHsKICAgICAgICAgICAgICAgICAgICAgLy8gaWYgbm8gbW9yZSByZXRyaWVzIG9uIGEgc2Vjb25kYXJ5IEFQTiBhdHRlbXB0LCB0ZWxsIHRoZSB3b3JsZCBhbmQgcmV2ZXJ0LgotICAgICAgICAgICAgICAgICAgICBwaG9uZS5ub3RpZnlEYXRhQ29ubmVjdGlvbihQaG9uZS5SRUFTT05fQVBOX0ZBSUxFRCk7CisgICAgICAgICAgICAgICAgICAgIG5vdGlmeURhdGFDb25uZWN0aW9uKFBob25lLlJFQVNPTl9BUE5fRkFJTEVEKTsKICAgICAgICAgICAgICAgICAgICAgb25FbmFibGVBcG4oYXBuVHlwZVRvSWQobVJlcXVlc3RlZEFwblR5cGUpLCBESVNBQkxFRCk7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICB9CkBAIC0xMDkxLDcgKzEwOTksNyBAQAogICAgICAgICAgICAgLy8gQXNzdW1lIGRhdGEgaXMgY29ubmVjdGVkIG9uIHRoZSBzaW11bGF0b3IKICAgICAgICAgICAgIC8vIEZJWE1FICB0aGlzIGNhbiBiZSBpbXByb3ZlZAogICAgICAgICAgICAgc2V0U3RhdGUoU3RhdGUuQ09OTkVDVEVEKTsKLSAgICAgICAgICAgIHBob25lLm5vdGlmeURhdGFDb25uZWN0aW9uKG51bGwpOworICAgICAgICAgICAgbm90aWZ5RGF0YUNvbm5lY3Rpb24obnVsbCk7CiAKICAgICAgICAgICAgIExvZy5pKExPR19UQUcsICJXZSdyZSBvbiB0aGUgc2ltdWxhdG9yOyBhc3N1bWluZyBkYXRhIGlzIGNvbm5lY3RlZCIpOwogICAgICAgICB9CkBAIC0xMTU4LDcgKzExNjYsNyBAQAogICAgICAgICAgICAgaWYgKGNhdXNlLmlzUGVybWFuZW50RmFpbCgpKSB7CiAgICAgICAgICAgICAgICAgbm90aWZ5Tm9EYXRhKGNhdXNlKTsKICAgICAgICAgICAgICAgICBpZiAoIW1SZXF1ZXN0ZWRBcG5UeXBlLmVxdWFscyhQaG9uZS5BUE5fVFlQRV9ERUZBVUxUKSkgewotICAgICAgICAgICAgICAgICAgICBwaG9uZS5ub3RpZnlEYXRhQ29ubmVjdGlvbihQaG9uZS5SRUFTT05fQVBOX0ZBSUxFRCk7CisgICAgICAgICAgICAgICAgICAgIG5vdGlmeURhdGFDb25uZWN0aW9uKFBob25lLlJFQVNPTl9BUE5fRkFJTEVEKTsKICAgICAgICAgICAgICAgICAgICAgb25FbmFibGVBcG4oYXBuVHlwZVRvSWQobVJlcXVlc3RlZEFwblR5cGUpLCBESVNBQkxFRCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHJldHVybjsKQEAgLTExODgsNyArMTE5Niw3IEBACiAgICAgICAgICAgIHJlYXNvbiA9IChTdHJpbmcpIGFyLnVzZXJPYmo7CiAgICAgICAgIH0KICAgICAgICAgc2V0U3RhdGUoU3RhdGUuSURMRSk7Ci0gICAgICAgIHBob25lLm5vdGlmeURhdGFDb25uZWN0aW9uKHJlYXNvbik7CisgICAgICAgIG5vdGlmeURhdGFDb25uZWN0aW9uKHJlYXNvbik7CiAgICAgICAgIG1BY3RpdmVBcG4gPSBudWxsOwogICAgICAgICBpZiAocmV0cnlBZnRlckRpc2Nvbm5lY3RlZChyZWFzb24pKSB7CiAgICAgICAgICAgICB0cnlTZXR1cERhdGEocmVhc29uKTsKQEAgLTEyMTksNyArMTIyNyw3IEBACiAgICAgcHJvdGVjdGVkIHZvaWQgb25Wb2ljZUNhbGxTdGFydGVkKCkgewogICAgICAgICBpZiAoc3RhdGUgPT0gU3RhdGUuQ09OTkVDVEVEICYmICEgbUdzbVBob25lLm1TU1QuaXNDb25jdXJyZW50Vm9pY2VBbmREYXRhKCkpIHsKICAgICAgICAgICAgIHN0b3BOZXRTdGF0UG9sbCgpOwotICAgICAgICAgICAgcGhvbmUubm90aWZ5RGF0YUNvbm5lY3Rpb24oUGhvbmUuUkVBU09OX1ZPSUNFX0NBTExfU1RBUlRFRCk7CisgICAgICAgICAgICBub3RpZnlEYXRhQ29ubmVjdGlvbihQaG9uZS5SRUFTT05fVk9JQ0VfQ0FMTF9TVEFSVEVEKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMTIyNyw3ICsxMjM1LDcgQEAKICAgICAgICAgaWYgKHN0YXRlID09IFN0YXRlLkNPTk5FQ1RFRCkgewogICAgICAgICAgICAgaWYgKCFtR3NtUGhvbmUubVNTVC5pc0NvbmN1cnJlbnRWb2ljZUFuZERhdGEoKSkgewogICAgICAgICAgICAgICAgIHN0YXJ0TmV0U3RhdFBvbGwoKTsKLSAgICAgICAgICAgICAgICBwaG9uZS5ub3RpZnlEYXRhQ29ubmVjdGlvbihQaG9uZS5SRUFTT05fVk9JQ0VfQ0FMTF9FTkRFRCk7CisgICAgICAgICAgICAgICAgbm90aWZ5RGF0YUNvbm5lY3Rpb24oUGhvbmUuUkVBU09OX1ZPSUNFX0NBTExfRU5ERUQpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAvLyBjbGVhbiBzbGF0ZSBhZnRlciBjYWxsIGVuZC4KICAgICAgICAgICAgICAgICByZXNldFBvbGxTdGF0cygpOwpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9Hc21TTVNEaXNwYXRjaGVyLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL0dzbVNNU0Rpc3BhdGNoZXIuamF2YQppbmRleCBkNzIwNTE2Li5mMDlmZjA2IDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL0dzbVNNU0Rpc3BhdGNoZXIuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL0dzbVNNU0Rpc3BhdGNoZXIuamF2YQpAQCAtNTcsNiArNTcsNyBAQAogICAgICAqIEBwYXJhbSBhciBBc3luY1Jlc3VsdCBwYXNzZWQgaW50byB0aGUgbWVzc2FnZSBoYW5kbGVyLiAgYXIucmVzdWx0IHNob3VsZAogICAgICAqICAgICAgICAgICBiZSBhIFN0cmluZyByZXByZXNlbnRpbmcgdGhlIHN0YXR1cyByZXBvcnQgUERVLCBhcyBBU0NJSSBoZXguCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlU3RhdHVzUmVwb3J0KEFzeW5jUmVzdWx0IGFyKSB7CiAgICAgICAgIFN0cmluZyBwZHVTdHJpbmcgPSAoU3RyaW5nKSBhci5yZXN1bHQ7CiAgICAgICAgIFNtc01lc3NhZ2Ugc21zID0gU21zTWVzc2FnZS5uZXdGcm9tQ0RTKHBkdVN0cmluZyk7CkBAIC04NSw2ICs4Niw3IEBACiAKIAogICAgIC8qKiB7QGluaGVyaXREb2N9ICovCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIGludCBkaXNwYXRjaE1lc3NhZ2UoU21zTWVzc2FnZUJhc2Ugc21zYikgewogCiAgICAgICAgIC8vIElmIHNtcyBpcyBudWxsLCBtZWFucyB0aGVyZSB3YXMgYSBwYXJzaW5nIGVycm9yLgpAQCAtMTUyLDYgKzE1NCw3IEBACiAgICAgfQogCiAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBzZW5kRGF0YShTdHJpbmcgZGVzdEFkZHIsIFN0cmluZyBzY0FkZHIsIGludCBkZXN0UG9ydCwKICAgICAgICAgICAgIGJ5dGVbXSBkYXRhLCBQZW5kaW5nSW50ZW50IHNlbnRJbnRlbnQsIFBlbmRpbmdJbnRlbnQgZGVsaXZlcnlJbnRlbnQpIHsKICAgICAgICAgU21zTWVzc2FnZS5TdWJtaXRQZHUgcGR1ID0gU21zTWVzc2FnZS5nZXRTdWJtaXRQZHUoCkBAIC0xNjAsNiArMTYzLDcgQEAKICAgICB9CiAKICAgICAvKioge0Bpbmhlcml0RG9jfSAqLworICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIHNlbmRUZXh0KFN0cmluZyBkZXN0QWRkciwgU3RyaW5nIHNjQWRkciwgU3RyaW5nIHRleHQsCiAgICAgICAgICAgICBQZW5kaW5nSW50ZW50IHNlbnRJbnRlbnQsIFBlbmRpbmdJbnRlbnQgZGVsaXZlcnlJbnRlbnQpIHsKICAgICAgICAgU21zTWVzc2FnZS5TdWJtaXRQZHUgcGR1ID0gU21zTWVzc2FnZS5nZXRTdWJtaXRQZHUoCkBAIC0xNjgsNiArMTcyLDcgQEAKICAgICB9CiAKICAgICAvKioge0Bpbmhlcml0RG9jfSAqLworICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIHNlbmRNdWx0aXBhcnRUZXh0KFN0cmluZyBkZXN0aW5hdGlvbkFkZHJlc3MsIFN0cmluZyBzY0FkZHJlc3MsCiAgICAgICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiBwYXJ0cywgQXJyYXlMaXN0PFBlbmRpbmdJbnRlbnQ+IHNlbnRJbnRlbnRzLAogICAgICAgICAgICAgQXJyYXlMaXN0PFBlbmRpbmdJbnRlbnQ+IGRlbGl2ZXJ5SW50ZW50cykgewpAQCAtMzA3LDggKzMxMiw5IEBACiAgICAgfQogCiAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBzZW5kU21zKFNtc1RyYWNrZXIgdHJhY2tlcikgewotICAgICAgICBIYXNoTWFwIG1hcCA9IHRyYWNrZXIubURhdGE7CisgICAgICAgIEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+IG1hcCA9IHRyYWNrZXIubURhdGE7CiAKICAgICAgICAgYnl0ZSBzbXNjW10gPSAoYnl0ZVtdKSBtYXAuZ2V0KCJzbXNjIik7CiAgICAgICAgIGJ5dGUgcGR1W10gPSAoYnl0ZVtdKSBtYXAuZ2V0KCJwZHUiKTsKQEAgLTMyMywxMiArMzI5LDEzIEBACiAgICAgICoKICAgICAgKiBAcGFyYW0gdHJhY2tlciBob2xkcyB0aGUgbXVsdGlwYXJ0IFNtcyB0cmFja2VyIHJlYWR5IHRvIGJlIHNlbnQKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBzZW5kTXVsdGlwYXJ0U21zIChTbXNUcmFja2VyIHRyYWNrZXIpIHsKICAgICAgICAgQXJyYXlMaXN0PFN0cmluZz4gcGFydHM7CiAgICAgICAgIEFycmF5TGlzdDxQZW5kaW5nSW50ZW50PiBzZW50SW50ZW50czsKICAgICAgICAgQXJyYXlMaXN0PFBlbmRpbmdJbnRlbnQ+IGRlbGl2ZXJ5SW50ZW50czsKIAotICAgICAgICBIYXNoTWFwIG1hcCA9IHRyYWNrZXIubURhdGE7CisgICAgICAgIEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+IG1hcCA9IHRyYWNrZXIubURhdGE7CiAKICAgICAgICAgU3RyaW5nIGRlc3RpbmF0aW9uQWRkcmVzcyA9IChTdHJpbmcpIG1hcC5nZXQoImRlc3RpbmF0aW9uIik7CiAgICAgICAgIFN0cmluZyBzY0FkZHJlc3MgPSAoU3RyaW5nKSBtYXAuZ2V0KCJzY2FkZHJlc3MiKTsKQEAgLTM0Myw2ICszNTAsNyBAQAogICAgIH0KIAogICAgIC8qKiB7QGluaGVyaXREb2N9ICovCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgYWNrbm93bGVkZ2VMYXN0SW5jb21pbmdTbXMoYm9vbGVhbiBzdWNjZXNzLCBpbnQgcmVzdWx0LCBNZXNzYWdlIHJlc3BvbnNlKXsKICAgICAgICAgLy8gRklYTUUgdW5pdCB0ZXN0IGxlYXZlcyBjbSA9PSBudWxsLiB0aGlzIHNob3VsZCBjaGFuZ2UKICAgICAgICAgaWYgKG1DbSAhPSBudWxsKSB7CkBAIC0zNTEsNiArMzU5LDcgQEAKICAgICB9CiAKICAgICAvKioge0Bpbmhlcml0RG9jfSAqLworICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIGFjdGl2YXRlQ2VsbEJyb2FkY2FzdFNtcyhpbnQgYWN0aXZhdGUsIE1lc3NhZ2UgcmVzcG9uc2UpIHsKICAgICAgICAgLy8gVW5sZXNzIENCUyBpcyBpbXBsZW1lbnRlZCBmb3IgR1NNLCB0aGlzIHBvaW50IHNob3VsZCBiZSB1bnJlYWNoYWJsZS4KICAgICAgICAgTG9nLmUoVEFHLCAiRXJyb3IhIFRoZSBmdW5jdGlvbmFsaXR5IGNlbGwgYnJvYWRjYXN0IHNtcyBpcyBub3QgaW1wbGVtZW50ZWQgZm9yIEdTTS4iKTsKQEAgLTM1OCw2ICszNjcsNyBAQAogICAgIH0KIAogICAgIC8qKiB7QGluaGVyaXREb2N9ICovCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgZ2V0Q2VsbEJyb2FkY2FzdFNtc0NvbmZpZyhNZXNzYWdlIHJlc3BvbnNlKXsKICAgICAgICAgLy8gVW5sZXNzIENCUyBpcyBpbXBsZW1lbnRlZCBmb3IgR1NNLCB0aGlzIHBvaW50IHNob3VsZCBiZSB1bnJlYWNoYWJsZS4KICAgICAgICAgTG9nLmUoVEFHLCAiRXJyb3IhIFRoZSBmdW5jdGlvbmFsaXR5IGNlbGwgYnJvYWRjYXN0IHNtcyBpcyBub3QgaW1wbGVtZW50ZWQgZm9yIEdTTS4iKTsKQEAgLTM2NSw2ICszNzUsNyBAQAogICAgIH0KIAogICAgIC8qKiB7QGluaGVyaXREb2N9ICovCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkICB2b2lkIHNldENlbGxCcm9hZGNhc3RDb25maWcoaW50W10gY29uZmlnVmFsdWVzQXJyYXksIE1lc3NhZ2UgcmVzcG9uc2UpIHsKICAgICAgICAgLy8gVW5sZXNzIENCUyBpcyBpbXBsZW1lbnRlZCBmb3IgR1NNLCB0aGlzIHBvaW50IHNob3VsZCBiZSB1bnJlYWNoYWJsZS4KICAgICAgICAgTG9nLmUoVEFHLCAiRXJyb3IhIFRoZSBmdW5jdGlvbmFsaXR5IGNlbGwgYnJvYWRjYXN0IHNtcyBpcyBub3QgaW1wbGVtZW50ZWQgZm9yIEdTTS4iKTsKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vR3NtU2VydmljZVN0YXRlVHJhY2tlci5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9Hc21TZXJ2aWNlU3RhdGVUcmFja2VyLmphdmEKaW5kZXggZDUzOWY2ZjEuLmMyZjYzMzAgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vR3NtU2VydmljZVN0YXRlVHJhY2tlci5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vR3NtU2VydmljZVN0YXRlVHJhY2tlci5qYXZhCkBAIC0xMDExLDcgKzEwMTEsOCBAQAogICAgICAgICB9CiAKICAgICAgICAgaWYgKGhhc05ldHdvcmtUeXBlQ2hhbmdlZCkgewotICAgICAgICAgICAgcGhvbmUubm90aWZ5RGF0YUNvbm5lY3Rpb24obnVsbCk7CisgICAgICAgICAgICAvLyBUT0RPIC0gZG8gd2UgcmVhbGx5IHdhbnQgdGhpcz8KKyAgICAgICAgICAgIHBob25lLm5vdGlmeURhdGFDb25uZWN0aW9uKG51bGwsIG51bGwpOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKGhhc1JvYW1pbmdPbikgewpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9TaW1TbXNJbnRlcmZhY2VNYW5hZ2VyLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL1NpbVNtc0ludGVyZmFjZU1hbmFnZXIuamF2YQppbmRleCAyMDI4Y2E0Li5mMDAwZDc5IDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL1NpbVNtc0ludGVyZmFjZU1hbmFnZXIuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL1NpbVNtc0ludGVyZmFjZU1hbmFnZXIuamF2YQpAQCAtODYsNiArODYsNyBAQAogICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBzdXBlci5maW5hbGl6ZSgpOwpAQCAtMTkxLDYgKzE5Miw3IEBACiAgICAgICAgIHJldHVybiBtU21zOwogICAgIH0KIAorICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIGxvZyhTdHJpbmcgbXNnKSB7CiAgICAgICAgIExvZy5kKExPR19UQUcsICJbU2ltU21zSW50ZXJmYWNlTWFuYWdlcl0gIiArIG1zZyk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9TbXNNZXNzYWdlLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL1Ntc01lc3NhZ2UuamF2YQppbmRleCAxMmM2Yjg4Li40ODczNzJlIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL1Ntc01lc3NhZ2UuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL1Ntc01lc3NhZ2UuamF2YQpAQCAtMjYsNyArMjYsNiBAQAogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5Hc21BbHBoYWJldDsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuU21zSGVhZGVyOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5TbXNNZXNzYWdlQmFzZTsKLWltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuU21zTWVzc2FnZUJhc2UuVGV4dEVuY29kaW5nRGV0YWlsczsKIAogaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKQEAgLTQ1LDcgKzQ0LDcgQEAKICAqIEEgU2hvcnQgTWVzc2FnZSBTZXJ2aWNlIG1lc3NhZ2UuCiAgKgogICovCi1wdWJsaWMgY2xhc3MgU21zTWVzc2FnZSBleHRlbmRzIFNtc01lc3NhZ2VCYXNleworcHVibGljIGNsYXNzIFNtc01lc3NhZ2UgZXh0ZW5kcyBTbXNNZXNzYWdlQmFzZSB7CiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfVEFHID0gIkdTTSI7CiAKICAgICBwcml2YXRlIE1lc3NhZ2VDbGFzcyBtZXNzYWdlQ2xhc3M7CkBAIC0zMTEsNyArMzEwLDcgQEAKICAgICAgICAgICAgIC8vIHRoZSByZWNlaXZlcidzIFNJTSBjYXJkLiBZb3UgY2FuIHRoZW4gc2VuZCBtZXNzYWdlcyB0byB5b3Vyc2VsZgogICAgICAgICAgICAgLy8gKG9uIGEgcGhvbmUgd2l0aCB0aGlzIGNoYW5nZSkgYW5kIHRoZXknbGwgZW5kIHVwIG9uIHRoZSBTSU0gY2FyZC4KICAgICAgICAgICAgIGJvLndyaXRlKDB4MDApOwotICAgICAgICB9IGVsc2UgeyAvL2Fzc3VtZSBVQ1MtMgorICAgICAgICB9IGVsc2UgeyAvLyBhc3N1bWUgVUNTLTIKICAgICAgICAgICAgIGlmICgoMHhmZiAmIHVzZXJEYXRhWzBdKSA+IE1BWF9VU0VSX0RBVEFfQllURVMpIHsKICAgICAgICAgICAgICAgICAvLyBNZXNzYWdlIHRvbyBsb25nCiAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CkBAIC0zNzcsNyArMzc2LDcgQEAKICAgICAgKiBAcGFyYW0gZGVzdGluYXRpb25BZGRyZXNzIHRoZSBhZGRyZXNzIG9mIHRoZSBkZXN0aW5hdGlvbiBmb3IgdGhlIG1lc3NhZ2UKICAgICAgKiBAcGFyYW0gZGVzdGluYXRpb25Qb3J0IHRoZSBwb3J0IHRvIGRlbGl2ZXIgdGhlIG1lc3NhZ2UgdG8gYXQgdGhlCiAgICAgICogICAgICAgIGRlc3RpbmF0aW9uCi0gICAgICogQHBhcmFtIGRhdGEgdGhlIGRhdCBmb3IgdGhlIG1lc3NhZ2UKKyAgICAgKiBAcGFyYW0gZGF0YSB0aGUgZGF0YSBmb3IgdGhlIG1lc3NhZ2UKICAgICAgKiBAcmV0dXJuIGEgPGNvZGU+U3VibWl0UGR1PC9jb2RlPiBjb250YWluaW5nIHRoZSBlbmNvZGVkIFNDCiAgICAgICogICAgICAgICBhZGRyZXNzLCBpZiBhcHBsaWNhYmxlLCBhbmQgdGhlIGVuY29kZWQgbWVzc2FnZS4KICAgICAgKiAgICAgICAgIFJldHVybnMgbnVsbCBvbiBlbmNvZGUgZXJyb3IuCkBAIC00ODIsNyArNDgxLDcgQEAKICAgICAgICAgcmV0dXJuIGJvOwogICAgIH0KIAotICAgIHN0YXRpYyBjbGFzcyBQZHVQYXJzZXIgeworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFBkdVBhcnNlciB7CiAgICAgICAgIGJ5dGUgcGR1W107CiAgICAgICAgIGludCBjdXI7CiAgICAgICAgIFNtc0hlYWRlciB1c2VyRGF0YUhlYWRlcjsKQEAgLTQ5MCwxMCArNDg5LDYgQEAKICAgICAgICAgaW50IG1Vc2VyRGF0YVNlcHRldFBhZGRpbmc7CiAgICAgICAgIGludCBtVXNlckRhdGFTaXplOwogCi0gICAgICAgIFBkdVBhcnNlcihTdHJpbmcgcykgewotICAgICAgICAgICAgdGhpcyhJY2NVdGlscy5oZXhTdHJpbmdUb0J5dGVzKHMpKTsKLSAgICAgICAgfQotCiAgICAgICAgIFBkdVBhcnNlcihieXRlW10gcGR1KSB7CiAgICAgICAgICAgICB0aGlzLnBkdSA9IHBkdTsKICAgICAgICAgICAgIGN1ciA9IDA7CkBAIC01NDUsNyArNTQwLDcgQEAKICAgICAgICAgICAgIEdzbVNtc0FkZHJlc3MgcmV0OwogCiAgICAgICAgICAgICAvLyAiVGhlIEFkZHJlc3MtTGVuZ3RoIGZpZWxkIGlzIGFuIGludGVnZXIgcmVwcmVzZW50YXRpb24gb2YKLSAgICAgICAgICAgIC8vIHRoZSBudW1iZXIgZmllbGQsIGkuZS4gZXhjbHVkZXMgYW55IHNlbWkgb2N0ZXQgY29udGFpbmluZyBvbmx5CisgICAgICAgICAgICAvLyB0aGUgbnVtYmVyIGZpZWxkLCBpLmUuIGV4Y2x1ZGVzIGFueSBzZW1pLW9jdGV0IGNvbnRhaW5pbmcgb25seQogICAgICAgICAgICAgLy8gZmlsbCBiaXRzLiIKICAgICAgICAgICAgIC8vIFRoZSBUT0EgZmllbGQgaXMgbm90IGluY2x1ZGVkIGFzIHBhcnQgb2YgdGhpcwogICAgICAgICAgICAgaW50IGFkZHJlc3NMZW5ndGggPSBwZHVbY3VyXSAmIDB4ZmY7CkBAIC01NzMsNyArNTY4LDcgQEAKICAgICAgICAgICAgIGludCBzZWNvbmQgPSBJY2NVdGlscy5nc21CY2RCeXRlVG9JbnQocGR1W2N1cisrXSk7CiAKICAgICAgICAgICAgIC8vIEZvciB0aGUgdGltZXpvbmUsIHRoZSBtb3N0IHNpZ25pZmljYW50IGJpdCBvZiB0aGUKLSAgICAgICAgICAgIC8vIGxlYXN0IHNpZ25maWNhbnQgbmliYmxlIGlzIHRoZSBzaWduIGJ5dGUKKyAgICAgICAgICAgIC8vIGxlYXN0IHNpZ25pZmljYW50IG5pYmJsZSBpcyB0aGUgc2lnbiBieXRlCiAgICAgICAgICAgICAvLyAobWVhbmluZyB0aGUgbWF4IHJhbmdlIG9mIHRoaXMgZmllbGQgaXMgNzkgcXVhcnRlci1ob3VycywKICAgICAgICAgICAgIC8vIHdoaWNoIGlzIG1vcmUgdGhhbiBlbm91Z2gpCiAKQEAgLTYzMiw3ICs2MjcsNyBAQAogICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgICogSGVyZSB3ZSBqdXN0IGNyZWF0ZSB0aGUgdXNlciBkYXRhIGxlbmd0aCB0byBiZSB0aGUgcmVtYWluZGVyIG9mCiAgICAgICAgICAgICAgICAgICogdGhlIHBkdSBtaW51cyB0aGUgdXNlciBkYXRhIGhlYWRlciwgc2luY2UgdXNlckRhdGFMZW5ndGggbWVhbnMKLSAgICAgICAgICAgICAgICAgKiB0aGUgbnVtYmVyIG9mIHVuY29tcHJlc3NlZCBzZXBldHMuCisgICAgICAgICAgICAgICAgICogdGhlIG51bWJlciBvZiB1bmNvbXByZXNzZWQgc2VwdGV0cy4KICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICBidWZmZXJMZW4gPSBwZHUubGVuZ3RoIC0gb2Zmc2V0OwogICAgICAgICAgICAgfSBlbHNlIHsKQEAgLTY3MSwxMCArNjY2LDEwIEBACiAgICAgICAgIH0KIAogICAgICAgICAvKioKLSAgICAgICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHBhZGRpbmcgYml0cyBhdCB0aGUgYmVnaW5pbmcgb2YgdGhlIHVzZXIgZGF0YQorICAgICAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgcGFkZGluZyBiaXRzIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHVzZXIgZGF0YQogICAgICAgICAgKiBhcnJheSBiZWZvcmUgdGhlIHN0YXJ0IG9mIHRoZSBzZXB0ZXRzLgogICAgICAgICAgKgotICAgICAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgcGFkZGluZyBiaXRzIGF0IHRoZSBiZWdpbmluZyBvZiB0aGUgdXNlciBkYXRhCisgICAgICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBwYWRkaW5nIGJpdHMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgdXNlciBkYXRhCiAgICAgICAgICAqIGFycmF5IGJlZm9yZSB0aGUgc3RhcnQgb2YgdGhlIHNlcHRldHMKICAgICAgICAgICovCiAgICAgICAgIGludCBnZXRVc2VyRGF0YVNlcHRldFBhZGRpbmcoKSB7CkBAIC02OTQsNyArNjg5LDcgQEAKICAgICAgICAgWFhYIE5vdCBzdXJlIHdoYXQgdGhpcyBvbmUgaXMgc3VwcG9zZWQgdG8gYmUgZG9pbmcsIGFuZCBubyBvbmUgaXMgdXNpbmcKICAgICAgICAgaXQuCiAgICAgICAgIFN0cmluZyBnZXRVc2VyRGF0YUdTTThiaXQoKSB7Ci0gICAgICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oInJlbWFpbmRlciBvZiBwdWQ6IiArCisgICAgICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oInJlbWFpbmRlciBvZiBwZHU6IiArCiAgICAgICAgICAgICAvLyBIZXhEdW1wLmR1bXBIZXhTdHJpbmcocGR1LCBjdXIsIHBkdS5sZW5ndGggLSBjdXIpKTsKICAgICAgICAgICAgIGludCBjb3VudCA9IHBkdVtjdXIrK10gJiAweGZmOwogICAgICAgICAgICAgaW50IHNpemUgPSBwZHVbY3VyKytdOwpAQCAtODI1LDExICs4MjAsMTMgQEAKICAgICB9CiAKICAgICAvKioge0Bpbmhlcml0RG9jfSAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBpbnQgZ2V0UHJvdG9jb2xJZGVudGlmaWVyKCkgewogICAgICAgICByZXR1cm4gcHJvdG9jb2xJZGVudGlmaWVyOwogICAgIH0KIAogICAgIC8qKiB7QGluaGVyaXREb2N9ICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gaXNSZXBsYWNlKCkgewogICAgICAgICByZXR1cm4gKHByb3RvY29sSWRlbnRpZmllciAmIDB4YzApID09IDB4NDAKICAgICAgICAgICAgICAgICAmJiAocHJvdG9jb2xJZGVudGlmaWVyICYgMHgzZikgPiAwCkBAIC04MzcsMTIgKzgzNCwxNCBAQAogICAgIH0KIAogICAgIC8qKiB7QGluaGVyaXREb2N9ICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gaXNDcGhzTXdpTWVzc2FnZSgpIHsKICAgICAgICAgcmV0dXJuICgoR3NtU21zQWRkcmVzcykgb3JpZ2luYXRpbmdBZGRyZXNzKS5pc0NwaHNWb2ljZU1lc3NhZ2VDbGVhcigpCiAgICAgICAgICAgICAgICAgfHwgKChHc21TbXNBZGRyZXNzKSBvcmlnaW5hdGluZ0FkZHJlc3MpLmlzQ3Boc1ZvaWNlTWVzc2FnZVNldCgpOwogICAgIH0KIAogICAgIC8qKiB7QGluaGVyaXREb2N9ICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gaXNNV0lDbGVhck1lc3NhZ2UoKSB7CiAgICAgICAgIGlmIChpc013aSAmJiAobXdpU2Vuc2UgPT0gZmFsc2UpKSB7CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKQEAgLTg1Myw2ICs4NTIsNyBAQAogICAgIH0KIAogICAgIC8qKiB7QGluaGVyaXREb2N9ICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gaXNNV0lTZXRNZXNzYWdlKCkgewogICAgICAgICBpZiAoaXNNd2kgJiYgKG13aVNlbnNlID09IHRydWUpKSB7CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKQEAgLTg2Myw2ICs4NjMsNyBAQAogICAgIH0KIAogICAgIC8qKiB7QGluaGVyaXREb2N9ICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gaXNNd2lEb250U3RvcmUoKSB7CiAgICAgICAgIGlmIChpc013aSAmJiBtd2lEb250U3RvcmUpIHsKICAgICAgICAgICAgIHJldHVybiB0cnVlOwpAQCAtODgyLDMxICs4ODMsMzQgQEAKICAgICB9CiAKICAgICAvKioge0Bpbmhlcml0RG9jfSAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBpbnQgZ2V0U3RhdHVzKCkgewogICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgIH0KIAogICAgIC8qKiB7QGluaGVyaXREb2N9ICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gaXNTdGF0dXNSZXBvcnRNZXNzYWdlKCkgewogICAgICAgICByZXR1cm4gaXNTdGF0dXNSZXBvcnRNZXNzYWdlOwogICAgIH0KIAogICAgIC8qKiB7QGluaGVyaXREb2N9ICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gaXNSZXBseVBhdGhQcmVzZW50KCkgewogICAgICAgICByZXR1cm4gcmVwbHlQYXRoUHJlc2VudDsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBUUyAyNy4wMDUgMy4xLCA8cGR1PiBkZWZpbml0aW9uICJJbiB0aGUgY2FzZSBvZiBTTVM6IDNHUFAgVFMgMjQuMDExIFs2XQorICAgICAqIFRTIDI3LjAwNSAzLjEsICZsdDtwZHUmZ3Q7IGRlZmluaXRpb24gIkluIHRoZSBjYXNlIG9mIFNNUzogM0dQUCBUUyAyNC4wMTEgWzZdCiAgICAgICogU0MgYWRkcmVzcyBmb2xsb3dlZCBieSAzR1BQIFRTIDIzLjA0MCBbM10gVFBEVSBpbiBoZXhhZGVjaW1hbCBmb3JtYXQ6CiAgICAgICogTUUvVEEgY29udmVydHMgZWFjaCBvY3RldCBvZiBUUCBkYXRhIHVuaXQgaW50byB0d28gSVJBIGNoYXJhY3RlciBsb25nCi0gICAgICogaGV4YWQgbnVtYmVyIChlLmcuIG9jdGV0IHdpdGggaW50ZWdlciB2YWx1ZSA0MiBpcyBwcmVzZW50ZWQgdG8gVEUgYXMgdHdvCisgICAgICogaGV4IG51bWJlciAoZS5nLiBvY3RldCB3aXRoIGludGVnZXIgdmFsdWUgNDIgaXMgcHJlc2VudGVkIHRvIFRFIGFzIHR3bwogICAgICAqIGNoYXJhY3RlcnMgMkEgKElSQSA1MCBhbmQgNjUpKSIgLi4uaW4gdGhlIGNhc2Ugb2YgY2VsbCBicm9hZGNhc3QsCiAgICAgICogc29tZXRoaW5nIGVsc2UuLi4KICAgICAgKi8KICAgICBwcml2YXRlIHZvaWQgcGFyc2VQZHUoYnl0ZVtdIHBkdSkgewogICAgICAgICBtUGR1ID0gcGR1OwotICAgICAgICAvLyBMb2cuZChMT0dfVEFHLCAicmF3IHNtcyBtZXNhZ2U6Iik7CisgICAgICAgIC8vIExvZy5kKExPR19UQUcsICJyYXcgc21zIG1lc3NhZ2U6Iik7CiAgICAgICAgIC8vIExvZy5kKExPR19UQUcsIHMpOwogCiAgICAgICAgIFBkdVBhcnNlciBwID0gbmV3IFBkdVBhcnNlcihwZHUpOwpAQCAtMTE1OCw2ICsxMTYyLDcgQEAKICAgICAvKioKICAgICAgKiB7QGluaGVyaXREb2N9CiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIE1lc3NhZ2VDbGFzcyBnZXRNZXNzYWdlQ2xhc3MoKSB7CiAgICAgICAgIHJldHVybiBtZXNzYWdlQ2xhc3M7CiAgICAgfQpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L3Rlc3QvU2ltdWxhdGVkQ29tbWFuZHMuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS90ZXN0L1NpbXVsYXRlZENvbW1hbmRzLmphdmEKaW5kZXggYTEyMGY1Mi4uZmRjZjc4ZCAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L3Rlc3QvU2ltdWxhdGVkQ29tbWFuZHMuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvdGVzdC9TaW11bGF0ZWRDb21tYW5kcy5qYXZhCkBAIC0xNiw3ICsxNiw2IEBACiAKIHBhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LnRlc3Q7CiAKLQogaW1wb3J0IGFuZHJvaWQub3MuQXN5bmNSZXN1bHQ7CiBpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyVGhyZWFkOwogaW1wb3J0IGFuZHJvaWQub3MuTG9vcGVyOwpAQCAtMjcsNyArMjYsNiBAQAogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5Db21tYW5kRXhjZXB0aW9uOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5Db21tYW5kc0ludGVyZmFjZTsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuRGF0YUNhbGxTdGF0ZTsKLWltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuSWNjQ2FyZDsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuUGhvbmU7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlVVU0luZm87CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5DYWxsRmFpbENhdXNlOwpAQCAtMzM1LDcgKzMzMyw3IEBACiAKICAgICAvKioKICAgICAgKiAoQXN5bmNSZXN1bHQpcmVzcG9uc2Uub2JqKS5yZXN1bHQgd2lsbCBiZSBhbiBJbnRlZ2VyIHJlcHJlc2VudGluZwotICAgICAqIHRoZSBzdW0gb2YgZW5hYmxlZCBzZXJpdmljZSBjbGFzc2VzIChzdW0gb2YgU0VSVklDRV9DTEFTU18qKQorICAgICAqIHRoZSBzdW0gb2YgZW5hYmxlZCBzZXJ2aWNlIGNsYXNzZXMgKHN1bSBvZiBTRVJWSUNFX0NMQVNTXyopCiAgICAgICoKICAgICAgKiBAcGFyYW0gZmFjaWxpdHkgb25lIG9mIENCX0ZBQ0lMVFlfKgogICAgICAqIEBwYXJhbSBwaW4gcGFzc3dvcmQgb3IgIiIgaWYgbm90IHJlcXVpcmVkCkBAIC00NDEsNyArNDM5LDcgQEAKICAgICAgKiAgcmV0dXJuZWQgbWVzc2FnZQogICAgICAqICByZXRNc2cub2JqID0gQXN5bmNSZXN1bHQgYXIKICAgICAgKiAgYXIuZXhjZXB0aW9uIGNhcnJpZXMgZXhjZXB0aW9uIG9uIGZhaWx1cmUKLSAgICAgKiAgYXIudXNlck9iamVjdCBjb250YWlucyB0aGUgb3JpZ25hbCB2YWx1ZSBvZiByZXN1bHQub2JqCisgICAgICogIGFyLnVzZXJPYmplY3QgY29udGFpbnMgdGhlIG9yaWdpbmFsIHZhbHVlIG9mIHJlc3VsdC5vYmoKICAgICAgKiAgYXIucmVzdWx0IGNvbnRhaW5zIGEgTGlzdCBvZiBEcml2ZXJDYWxsCiAgICAgICogICAgICBUaGUgYXIucmVzdWx0IExpc3QgaXMgc29ydGVkIGJ5IERyaXZlckNhbGwuaW5kZXgKICAgICAgKi8KQEAgLTQ2OCw3ICs0NjYsNyBAQAogICAgICAqICByZXR1cm5lZCBtZXNzYWdlCiAgICAgICogIHJldE1zZy5vYmogPSBBc3luY1Jlc3VsdCBhcgogICAgICAqICBhci5leGNlcHRpb24gY2FycmllcyBleGNlcHRpb24gb24gZmFpbHVyZQotICAgICAqICBhci51c2VyT2JqZWN0IGNvbnRhaW5zIHRoZSBvcmlnbmFsIHZhbHVlIG9mIHJlc3VsdC5vYmoKKyAgICAgKiAgYXIudXNlck9iamVjdCBjb250YWlucyB0aGUgb3JpZ2luYWwgdmFsdWUgb2YgcmVzdWx0Lm9iagogICAgICAqICBhci5yZXN1bHQgY29udGFpbnMgYSBMaXN0IG9mIERhdGFDYWxsU3RhdGUKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBnZXREYXRhQ2FsbExpc3QoTWVzc2FnZSByZXN1bHQpIHsKQEAgLTQ3OSw3ICs0NzcsNyBAQAogICAgICAqICByZXR1cm5lZCBtZXNzYWdlCiAgICAgICogIHJldE1zZy5vYmogPSBBc3luY1Jlc3VsdCBhcgogICAgICAqICBhci5leGNlcHRpb24gY2FycmllcyBleGNlcHRpb24gb24gZmFpbHVyZQotICAgICAqICBhci51c2VyT2JqZWN0IGNvbnRhaW5zIHRoZSBvcmlnbmFsIHZhbHVlIG9mIHJlc3VsdC5vYmoKKyAgICAgKiAgYXIudXNlck9iamVjdCBjb250YWlucyB0aGUgb3JpZ2luYWwgdmFsdWUgb2YgcmVzdWx0Lm9iagogICAgICAqICBhci5yZXN1bHQgaXMgbnVsbCBvbiBzdWNjZXNzIGFuZCBmYWlsdXJlCiAgICAgICoKICAgICAgKiBDTElSX0RFRkFVTFQgICAgID09IG9uICJ1c2Ugc3Vic2NyaXB0aW9uIGRlZmF1bHQgdmFsdWUiCkBAIC00OTYsNyArNDk0LDcgQEAKICAgICAgKiAgcmV0dXJuZWQgbWVzc2FnZQogICAgICAqICByZXRNc2cub2JqID0gQXN5bmNSZXN1bHQgYXIKICAgICAgKiAgYXIuZXhjZXB0aW9uIGNhcnJpZXMgZXhjZXB0aW9uIG9uIGZhaWx1cmUKLSAgICAgKiAgYXIudXNlck9iamVjdCBjb250YWlucyB0aGUgb3JpZ25hbCB2YWx1ZSBvZiByZXN1bHQub2JqCisgICAgICogIGFyLnVzZXJPYmplY3QgY29udGFpbnMgdGhlIG9yaWdpbmFsIHZhbHVlIG9mIHJlc3VsdC5vYmoKICAgICAgKiAgYXIucmVzdWx0IGlzIG51bGwgb24gc3VjY2VzcyBhbmQgZmFpbHVyZQogICAgICAqCiAgICAgICogQ0xJUl9ERUZBVUxUICAgICA9PSBvbiAidXNlIHN1YnNjcmlwdGlvbiBkZWZhdWx0IHZhbHVlIgpAQCAtNTEzLDcgKzUxMSw3IEBACiAgICAgICogIHJldHVybmVkIG1lc3NhZ2UKICAgICAgKiAgcmV0TXNnLm9iaiA9IEFzeW5jUmVzdWx0IGFyCiAgICAgICogIGFyLmV4Y2VwdGlvbiBjYXJyaWVzIGV4Y2VwdGlvbiBvbiBmYWlsdXJlCi0gICAgICogIGFyLnVzZXJPYmplY3QgY29udGFpbnMgdGhlIG9yaWduYWwgdmFsdWUgb2YgcmVzdWx0Lm9iagorICAgICAqICBhci51c2VyT2JqZWN0IGNvbnRhaW5zIHRoZSBvcmlnaW5hbCB2YWx1ZSBvZiByZXN1bHQub2JqCiAgICAgICogIGFyLnJlc3VsdCBpcyBTdHJpbmcgY29udGFpbmluZyBJTVNJIG9uIHN1Y2Nlc3MKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBnZXRJTVNJKE1lc3NhZ2UgcmVzdWx0KSB7CkBAIC01MjQsNyArNTIyLDcgQEAKICAgICAgKiAgcmV0dXJuZWQgbWVzc2FnZQogICAgICAqICByZXRNc2cub2JqID0gQXN5bmNSZXN1bHQgYXIKICAgICAgKiAgYXIuZXhjZXB0aW9uIGNhcnJpZXMgZXhjZXB0aW9uIG9uIGZhaWx1cmUKLSAgICAgKiAgYXIudXNlck9iamVjdCBjb250YWlucyB0aGUgb3JpZ25hbCB2YWx1ZSBvZiByZXN1bHQub2JqCisgICAgICogIGFyLnVzZXJPYmplY3QgY29udGFpbnMgdGhlIG9yaWdpbmFsIHZhbHVlIG9mIHJlc3VsdC5vYmoKICAgICAgKiAgYXIucmVzdWx0IGlzIFN0cmluZyBjb250YWluaW5nIElNRUkgb24gc3VjY2VzcwogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGdldElNRUkoTWVzc2FnZSByZXN1bHQpIHsKQEAgLTUzNSw3ICs1MzMsNyBAQAogICAgICAqICByZXR1cm5lZCBtZXNzYWdlCiAgICAgICogIHJldE1zZy5vYmogPSBBc3luY1Jlc3VsdCBhcgogICAgICAqICBhci5leGNlcHRpb24gY2FycmllcyBleGNlcHRpb24gb24gZmFpbHVyZQotICAgICAqICBhci51c2VyT2JqZWN0IGNvbnRhaW5zIHRoZSBvcmlnbmFsIHZhbHVlIG9mIHJlc3VsdC5vYmoKKyAgICAgKiAgYXIudXNlck9iamVjdCBjb250YWlucyB0aGUgb3JpZ2luYWwgdmFsdWUgb2YgcmVzdWx0Lm9iagogICAgICAqICBhci5yZXN1bHQgaXMgU3RyaW5nIGNvbnRhaW5pbmcgSU1FSVNWIG9uIHN1Y2Nlc3MKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBnZXRJTUVJU1YoTWVzc2FnZSByZXN1bHQpIHsKQEAgLTU0Nyw3ICs1NDUsNyBAQAogICAgICAqICByZXR1cm5lZCBtZXNzYWdlCiAgICAgICogIHJldE1zZy5vYmogPSBBc3luY1Jlc3VsdCBhcgogICAgICAqICBhci5leGNlcHRpb24gY2FycmllcyBleGNlcHRpb24gb24gZmFpbHVyZQotICAgICAqICBhci51c2VyT2JqZWN0IGNvbnRhaW5zIHRoZSBvcmlnbmFsIHZhbHVlIG9mIHJlc3VsdC5vYmoKKyAgICAgKiAgYXIudXNlck9iamVjdCBjb250YWlucyB0aGUgb3JpZ2luYWwgdmFsdWUgb2YgcmVzdWx0Lm9iagogICAgICAqICBhci5yZXN1bHQgaXMgbnVsbCBvbiBzdWNjZXNzIGFuZCBmYWlsdXJlCiAgICAgICoKICAgICAgKiAgM0dQUCAyMi4wMzAgNi41LjUKQEAgLTU3Miw3ICs1NzAsNyBAQAogICAgICAqICAiUmVsZWFzZXMgYWxsIGhlbGQgY2FsbHMgb3Igc2V0cyBVc2VyIERldGVybWluZWQgVXNlciBCdXN5IChVRFVCKQogICAgICAqICAgZm9yIGEgd2FpdGluZyBjYWxsLiIKICAgICAgKiAgYXIuZXhjZXB0aW9uIGNhcnJpZXMgZXhjZXB0aW9uIG9uIGZhaWx1cmUKLSAgICAgKiAgYXIudXNlck9iamVjdCBjb250YWlucyB0aGUgb3JpZ25hbCB2YWx1ZSBvZiByZXN1bHQub2JqCisgICAgICogIGFyLnVzZXJPYmplY3QgY29udGFpbnMgdGhlIG9yaWdpbmFsIHZhbHVlIG9mIHJlc3VsdC5vYmoKICAgICAgKiAgYXIucmVzdWx0IGlzIG51bGwgb24gc3VjY2VzcyBhbmQgZmFpbHVyZQogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGhhbmd1cFdhaXRpbmdPckJhY2tncm91bmQgKE1lc3NhZ2UgcmVzdWx0KSB7CkBAIC01OTMsNyArNTkxLDcgQEAKICAgICAgKiAgdGhlIG90aGVyIChoZWxkIG9yIHdhaXRpbmcpIGNhbGwuIgogICAgICAqCiAgICAgICogIGFyLmV4Y2VwdGlvbiBjYXJyaWVzIGV4Y2VwdGlvbiBvbiBmYWlsdXJlCi0gICAgICogIGFyLnVzZXJPYmplY3QgY29udGFpbnMgdGhlIG9yaWduYWwgdmFsdWUgb2YgcmVzdWx0Lm9iagorICAgICAqICBhci51c2VyT2JqZWN0IGNvbnRhaW5zIHRoZSBvcmlnaW5hbCB2YWx1ZSBvZiByZXN1bHQub2JqCiAgICAgICogIGFyLnJlc3VsdCBpcyBudWxsIG9uIHN1Y2Nlc3MgYW5kIGZhaWx1cmUKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBoYW5ndXBGb3JlZ3JvdW5kUmVzdW1lQmFja2dyb3VuZCAoTWVzc2FnZSByZXN1bHQpIHsKQEAgLTYxNCw3ICs2MTIsNyBAQAogICAgICAqICB0aGUgb3RoZXIgKGhlbGQgb3Igd2FpdGluZykgY2FsbC4iCiAgICAgICoKICAgICAgKiAgYXIuZXhjZXB0aW9uIGNhcnJpZXMgZXhjZXB0aW9uIG9uIGZhaWx1cmUKLSAgICAgKiAgYXIudXNlck9iamVjdCBjb250YWlucyB0aGUgb3JpZ25hbCB2YWx1ZSBvZiByZXN1bHQub2JqCisgICAgICogIGFyLnVzZXJPYmplY3QgY29udGFpbnMgdGhlIG9yaWdpbmFsIHZhbHVlIG9mIHJlc3VsdC5vYmoKICAgICAgKiAgYXIucmVzdWx0IGlzIG51bGwgb24gc3VjY2VzcyBhbmQgZmFpbHVyZQogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHN3aXRjaFdhaXRpbmdPckhvbGRpbmdBbmRBY3RpdmUgKE1lc3NhZ2UgcmVzdWx0KSB7CkBAIC02MzQsNyArNjMyLDcgQEAKICAgICAgKiAiQWRkcyBhIGhlbGQgY2FsbCB0byB0aGUgY29udmVyc2F0aW9uIgogICAgICAqCiAgICAgICogIGFyLmV4Y2VwdGlvbiBjYXJyaWVzIGV4Y2VwdGlvbiBvbiBmYWlsdXJlCi0gICAgICogIGFyLnVzZXJPYmplY3QgY29udGFpbnMgdGhlIG9yaWduYWwgdmFsdWUgb2YgcmVzdWx0Lm9iagorICAgICAqICBhci51c2VyT2JqZWN0IGNvbnRhaW5zIHRoZSBvcmlnaW5hbCB2YWx1ZSBvZiByZXN1bHQub2JqCiAgICAgICogIGFyLnJlc3VsdCBpcyBudWxsIG9uIHN1Y2Nlc3MgYW5kIGZhaWx1cmUKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBjb25mZXJlbmNlIChNZXNzYWdlIHJlc3VsdCkgewpAQCAtNjU0LDcgKzY1Miw3IEBACiAgICAgICogIkNvbm5lY3RzIHRoZSB0d28gY2FsbHMgYW5kIGRpc2Nvbm5lY3RzIHRoZSBzdWJzY3JpYmVyIGZyb20gYm90aCBjYWxscyIKICAgICAgKgogICAgICAqICBhci5leGNlcHRpb24gY2FycmllcyBleGNlcHRpb24gb24gZmFpbHVyZQotICAgICAqICBhci51c2VyT2JqZWN0IGNvbnRhaW5zIHRoZSBvcmlnbmFsIHZhbHVlIG9mIHJlc3VsdC5vYmoKKyAgICAgKiAgYXIudXNlck9iamVjdCBjb250YWlucyB0aGUgb3JpZ2luYWwgdmFsdWUgb2YgcmVzdWx0Lm9iagogICAgICAqICBhci5yZXN1bHQgaXMgbnVsbCBvbiBzdWNjZXNzIGFuZCBmYWlsdXJlCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgZXhwbGljaXRDYWxsVHJhbnNmZXIgKE1lc3NhZ2UgcmVzdWx0KSB7CkBAIC02OTAsNyArNjg4LDcgQEAKICAgICAvKioKICAgICAgKgogICAgICAqICBhci5leGNlcHRpb24gY2FycmllcyBleGNlcHRpb24gb24gZmFpbHVyZQotICAgICAqICBhci51c2VyT2JqZWN0IGNvbnRhaW5zIHRoZSBvcmlnbmFsIHZhbHVlIG9mIHJlc3VsdC5vYmoKKyAgICAgKiAgYXIudXNlck9iamVjdCBjb250YWlucyB0aGUgb3JpZ2luYWwgdmFsdWUgb2YgcmVzdWx0Lm9iagogICAgICAqICBhci5yZXN1bHQgaXMgbnVsbCBvbiBzdWNjZXNzIGFuZCBmYWlsdXJlCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgYWNjZXB0Q2FsbCAoTWVzc2FnZSByZXN1bHQpIHsKQEAgLTcwOCw3ICs3MDYsNyBAQAogICAgIC8qKgogICAgICAqICBhbHNvIGtub3duIGFzIFVEVUIKICAgICAgKiAgYXIuZXhjZXB0aW9uIGNhcnJpZXMgZXhjZXB0aW9uIG9uIGZhaWx1cmUKLSAgICAgKiAgYXIudXNlck9iamVjdCBjb250YWlucyB0aGUgb3JpZ25hbCB2YWx1ZSBvZiByZXN1bHQub2JqCisgICAgICogIGFyLnVzZXJPYmplY3QgY29udGFpbnMgdGhlIG9yaWdpbmFsIHZhbHVlIG9mIHJlc3VsdC5vYmoKICAgICAgKiAgYXIucmVzdWx0IGlzIG51bGwgb24gc3VjY2VzcyBhbmQgZmFpbHVyZQogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHJlamVjdENhbGwgKE1lc3NhZ2UgcmVzdWx0KSB7CkBAIC03ODUsNyArNzgzLDcgQEAKICAgICAgKgogICAgICAqIEBwYXJhbSByZXN1bHQgaXMgY2FsbGJhY2sgbWVzc2FnZQogICAgICAqICAgICAgICAoKEFzeW5jUmVzdWx0KXJlc3BvbnNlLm9iaikucmVzdWx0ICBpcyBhbiBpbnRbXSB3aXRoIGV2ZXJ5Ci0gICAgICogICAgICAgIGVsZW1lbnQgcmVwcmVzZW50aW5nIG9uZSBhdmlhbGFibGUgQk1fKl9CQU5ECisgICAgICogICAgICAgIGVsZW1lbnQgcmVwcmVzZW50aW5nIG9uZSBhdmFpbGFibGUgQk1fKl9CQU5ECiAgICAgICovCiAgICAgcHVibGljIHZvaWQgcXVlcnlBdmFpbGFibGVCYW5kTW9kZSAoTWVzc2FnZSByZXN1bHQpIHsKICAgICAgICAgaW50IHJldFtdID0gbmV3IGludCBbNF07CkBAIC04NDQsNyArODQyLDYgQEAKICAgICAgICAgcmV0WzExXSA9IG51bGw7CiAgICAgICAgIHJldFsxMl0gPSBudWxsOwogICAgICAgICByZXRbMTNdID0gbnVsbDsKLSAgICAgICAgcmV0WzE0XSA9IG51bGw7CiAKICAgICAgICAgcmVzdWx0U3VjY2VzcyhyZXN1bHQsIHJldCk7CiAgICAgfQpAQCAtODk1LDcgKzg5Miw3IEBACiAKICAgICAvKioKICAgICAgKiAgYXIuZXhjZXB0aW9uIGNhcnJpZXMgZXhjZXB0aW9uIG9uIGZhaWx1cmUKLSAgICAgKiAgYXIudXNlck9iamVjdCBjb250YWlucyB0aGUgb3JpZ25hbCB2YWx1ZSBvZiByZXN1bHQub2JqCisgICAgICogIGFyLnVzZXJPYmplY3QgY29udGFpbnMgdGhlIG9yaWdpbmFsIHZhbHVlIG9mIHJlc3VsdC5vYmoKICAgICAgKiAgYXIucmVzdWx0IGlzIG51bGwgb24gc3VjY2VzcyBhbmQgZmFpbHVyZQogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNlbmREdG1mKGNoYXIgYywgTWVzc2FnZSByZXN1bHQpIHsKQEAgLTkwNCw3ICs5MDEsNyBAQAogCiAgICAgLyoqCiAgICAgICogIGFyLmV4Y2VwdGlvbiBjYXJyaWVzIGV4Y2VwdGlvbiBvbiBmYWlsdXJlCi0gICAgICogIGFyLnVzZXJPYmplY3QgY29udGFpbnMgdGhlIG9yaWduYWwgdmFsdWUgb2YgcmVzdWx0Lm9iagorICAgICAqICBhci51c2VyT2JqZWN0IGNvbnRhaW5zIHRoZSBvcmlnaW5hbCB2YWx1ZSBvZiByZXN1bHQub2JqCiAgICAgICogIGFyLnJlc3VsdCBpcyBudWxsIG9uIHN1Y2Nlc3MgYW5kIGZhaWx1cmUKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzdGFydER0bWYoY2hhciBjLCBNZXNzYWdlIHJlc3VsdCkgewpAQCAtOTEzLDcgKzkxMCw3IEBACiAKICAgICAvKioKICAgICAgKiAgYXIuZXhjZXB0aW9uIGNhcnJpZXMgZXhjZXB0aW9uIG9uIGZhaWx1cmUKLSAgICAgKiAgYXIudXNlck9iamVjdCBjb250YWlucyB0aGUgb3JpZ25hbCB2YWx1ZSBvZiByZXN1bHQub2JqCisgICAgICogIGFyLnVzZXJPYmplY3QgY29udGFpbnMgdGhlIG9yaWdpbmFsIHZhbHVlIG9mIHJlc3VsdC5vYmoKICAgICAgKiAgYXIucmVzdWx0IGlzIG51bGwgb24gc3VjY2VzcyBhbmQgZmFpbHVyZQogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHN0b3BEdG1mKE1lc3NhZ2UgcmVzdWx0KSB7CkBAIC05MjIsNyArOTE5LDcgQEAKIAogICAgIC8qKgogICAgICAqICBhci5leGNlcHRpb24gY2FycmllcyBleGNlcHRpb24gb24gZmFpbHVyZQotICAgICAqICBhci51c2VyT2JqZWN0IGNvbnRhaW5zIHRoZSBvcmlnbmFsIHZhbHVlIG9mIHJlc3VsdC5vYmoKKyAgICAgKiAgYXIudXNlck9iamVjdCBjb250YWlucyB0aGUgb3JpZ2luYWwgdmFsdWUgb2YgcmVzdWx0Lm9iagogICAgICAqICBhci5yZXN1bHQgaXMgbnVsbCBvbiBzdWNjZXNzIGFuZCBmYWlsdXJlCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2VuZEJ1cnN0RHRtZihTdHJpbmcgZHRtZlN0cmluZywgaW50IG9uLCBpbnQgb2ZmLCBNZXNzYWdlIHJlc3VsdCkgewpAQCAtOTU3LDYgKzk1NCw3IEBACiAgICAgICAgIHVuaW1wbGVtZW50ZWQocmVzcG9uc2UpOwogICAgIH0KIAorICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIHZvaWQgc2V0dXBEZWZhdWx0UERQKFN0cmluZyBhcG4sIFN0cmluZyB1c2VyLCBTdHJpbmcgcGFzc3dvcmQsIE1lc3NhZ2UgcmVzdWx0KSB7CiAgICAgICAgIHVuaW1wbGVtZW50ZWQocmVzdWx0KTsKICAgICB9CkBAIC05NjgsOSArOTY2LDcgQEAKIAogICAgIHB1YmxpYyB2b2lkIGRlYWN0aXZhdGVEYXRhQ2FsbChpbnQgY2lkLCBNZXNzYWdlIHJlc3VsdCkge3VuaW1wbGVtZW50ZWQocmVzdWx0KTt9CiAKLSAgICAvKioKLSAgICAgKiBAZGVwcmVjYXRlZAotICAgICAqLworICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIHZvaWQgZGVhY3RpdmF0ZURlZmF1bHRQRFAoaW50IGNpZCwgTWVzc2FnZSByZXN1bHQpIHt1bmltcGxlbWVudGVkKHJlc3VsdCk7fQogCiAgICAgcHVibGljIHZvaWQgc2V0UHJlZmVycmVkTmV0d29ya1R5cGUoaW50IG5ldHdvcmtUeXBlICwgTWVzc2FnZSByZXN1bHQpIHsKQEAgLTEwNDcsNyArMTA0Myw3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogcGFyYW1ldGVycyBlcXVpdmlsaWVudCB0byAyNy4wMDcgQVQrQ1JTTSBjb21tYW5kCisgICAgICogcGFyYW1ldGVycyBlcXVpdmFsZW50IHRvIDI3LjAwNyBBVCtDUlNNIGNvbW1hbmQKICAgICAgKiByZXNwb25zZS5vYmogd2lsbCBiZSBhbiBBc3luY1Jlc3VsdAogICAgICAqIHJlc3BvbnNlLm9iai51c2VyT2JqIHdpbGwgYmUgYSBTaW1Jb1Jlc3VsdCBvbiBzdWNjZXNzCiAgICAgICovCmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2FuZHJvaWQvdGVsZXBob255L1Bob25lTnVtYmVyV2F0Y2hlclRlc3QuamF2YSBiL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvYW5kcm9pZC90ZWxlcGhvbnkvUGhvbmVOdW1iZXJXYXRjaGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OGVhZWNkLi4wMDAwMDAwCi0tLSBhL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvYW5kcm9pZC90ZWxlcGhvbnkvUGhvbmVOdW1iZXJXYXRjaGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255OwotCi1pbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuUGhvbmVOdW1iZXJGb3JtYXR0aW5nVGV4dFdhdGNoZXI7Ci1pbXBvcnQgYW5kcm9pZC50ZXN0LnN1aXRlYnVpbGRlci5hbm5vdGF0aW9uLlNtYWxsVGVzdDsKLWltcG9ydCBhbmRyb2lkLnRleHQuU2VsZWN0aW9uOwotaW1wb3J0IGFuZHJvaWQudGV4dC5TcGFubmFibGVTdHJpbmdCdWlsZGVyOwotaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0V2F0Y2hlcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotcHVibGljIGNsYXNzIFBob25lTnVtYmVyV2F0Y2hlclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0gICAgQFNtYWxsVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RIeXBoZW5hdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTcGFubmFibGVTdHJpbmdCdWlsZGVyIG51bWJlciA9IG5ldyBTcGFubmFibGVTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIFRleHRXYXRjaGVyIHR3ID0gbmV3IFBob25lTnVtYmVyRm9ybWF0dGluZ1RleHRXYXRjaGVyKCk7Ci0gICAgICAgIG51bWJlci5hcHBlbmQoIjU1NS0xMjEyIik7Ci0gICAgICAgIC8vIE1vdmUgdGhlIGN1cnNvciB0byB0aGUgbGVmdCBlZGdlCi0gICAgICAgIFNlbGVjdGlvbi5zZXRTZWxlY3Rpb24obnVtYmVyLCAwKTsKLSAgICAgICAgdHcuYmVmb3JlVGV4dENoYW5nZWQobnVtYmVyLCAwLCAwLCAxKTsKLSAgICAgICAgLy8gSW5zZXJ0IGFuIDggYXQgdGhlIGJlZ2lubmluZwotICAgICAgICBudW1iZXIuaW5zZXJ0KDAsICI4Iik7Ci0gICAgICAgIHR3LmFmdGVyVGV4dENoYW5nZWQobnVtYmVyKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCI4NTUtNTEyLTEyIiwgbnVtYmVyLnRvU3RyaW5nKCkpOwotICAgIH0KLSAgICAKLSAgICBAU21hbGxUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEh5cGhlbkRlbGV0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFNwYW5uYWJsZVN0cmluZ0J1aWxkZXIgbnVtYmVyID0gbmV3IFNwYW5uYWJsZVN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgVGV4dFdhdGNoZXIgdHcgPSBuZXcgUGhvbmVOdW1iZXJGb3JtYXR0aW5nVGV4dFdhdGNoZXIoKTsKLSAgICAgICAgbnVtYmVyLmFwcGVuZCgiNTU1LTEyMTIiKTsKLSAgICAgICAgLy8gTW92ZSB0aGUgY3Vyc29yIHRvIGFmdGVyIHRoZSBoeXBoZW4KLSAgICAgICAgU2VsZWN0aW9uLnNldFNlbGVjdGlvbihudW1iZXIsIDQpOwotICAgICAgICAvLyBEZWxldGUgdGhlIGh5cGhlbgotICAgICAgICB0dy5iZWZvcmVUZXh0Q2hhbmdlZChudW1iZXIsIDMsIDEsIDApOwotICAgICAgICBudW1iZXIuZGVsZXRlKDMsIDQpOwotICAgICAgICB0dy5hZnRlclRleHRDaGFuZ2VkKG51bWJlcik7Ci0gICAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IGl0IGRlbGV0ZWQgdGhlIGNoYXJhY3RlciBiZWZvcmUgdGhlIGh5cGhlbiAKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCI1NTEtMjEyIiwgbnVtYmVyLnRvU3RyaW5nKCkpOwotICAgICAgICAKLSAgICAgICAgLy8gTWFrZSBzdXJlIGl0IGRlYWxzIHdpdGggbGVmdCBlZGdlIGJvdW5kYXJ5IGNhc2UKLSAgICAgICAgbnVtYmVyLmluc2VydCgwLCAiLSIpOwotICAgICAgICBTZWxlY3Rpb24uc2V0U2VsZWN0aW9uKG51bWJlciwgMSk7Ci0gICAgICAgIHR3LmJlZm9yZVRleHRDaGFuZ2VkKG51bWJlciwgMCwgMSwgMCk7Ci0gICAgICAgIG51bWJlci5kZWxldGUoMCwgMSk7Ci0gICAgICAgIHR3LmFmdGVyVGV4dENoYW5nZWQobnVtYmVyKTsKLSAgICAgICAgLy8gTWFrZSBzdXJlIHRoYXQgaXQgZGVsZXRlZCB0aGUgY2hhcmFjdGVyIGJlZm9yZSB0aGUgaHlwaGVuIAotICAgICAgICBhc3NlcnRFcXVhbHMoIjU1MS0yMTIiLCBudW1iZXIudG9TdHJpbmcoKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvR3NtQWxwaGFiZXRUZXN0LmphdmEgYi90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9Hc21BbHBoYWJldFRlc3QuamF2YQppbmRleCAzYTljNTExLi5hNmI5YTJhIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9Hc21BbHBoYWJldFRlc3QuamF2YQorKysgYi90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9Hc21BbHBoYWJldFRlc3QuamF2YQpAQCAtNTEsNyArNTEsNyBAQAogICAgICAgICAvLyAnQCcgbWFwcyB0byBjaGFyIDAKICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIEdzbUFscGhhYmV0LmNoYXJUb0dzbSgnQCcpKTsKIAotICAgICAgICAvLyBgYSAoYSB3aXRoIGdyYXZlIGFjY2VudCkgbWFwcyB0byBsYXN0IEdTTSBjaGFyYXRlcgorICAgICAgICAvLyBgYSAoYSB3aXRoIGdyYXZlIGFjY2VudCkgbWFwcyB0byBsYXN0IEdTTSBjaGFyYWN0ZXIKICAgICAgICAgYXNzZXJ0RXF1YWxzKDB4N2YsIEdzbUFscGhhYmV0LmNoYXJUb0dzbSgnXHUwMGUwJykpOwogCiAgICAgICAgIC8vCmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9Hc21TbXNUZXN0LmphdmEgYi90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9Hc21TbXNUZXN0LmphdmEKaW5kZXggMzEwM2ZjMS4uMjE1YzZjZSAxMDA2NDQKLS0tIGEvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvR3NtU21zVGVzdC5qYXZhCisrKyBiL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0dzbVNtc1Rlc3QuamF2YQpAQCAtMjQsOCArMjQsNiBAQAogaW1wb3J0IGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2U7CiBpbXBvcnQgYW5kcm9pZC50ZXN0LnN1aXRlYnVpbGRlci5hbm5vdGF0aW9uLlNtYWxsVGVzdDsKIAotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci0KIHB1YmxpYyBjbGFzcyBHc21TbXNUZXN0IGV4dGVuZHMgQW5kcm9pZFRlc3RDYXNlIHsKIAogICAgIEBTbWFsbFRlc3QKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvYW5kcm9pZC90ZWxlcGhvbnkvUGhvbmVOdW1iZXJVdGlsc1Rlc3QuamF2YSBiL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1Bob25lTnVtYmVyVXRpbHNUZXN0LmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvYW5kcm9pZC90ZWxlcGhvbnkvUGhvbmVOdW1iZXJVdGlsc1Rlc3QuamF2YQpyZW5hbWUgdG8gdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvUGhvbmVOdW1iZXJVdGlsc1Rlc3QuamF2YQpkaWZmIC0tZ2l0IGEvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvUGhvbmVOdW1iZXJXYXRjaGVyVGVzdC5qYXZhIGIvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvUGhvbmVOdW1iZXJXYXRjaGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyZTU3M2MKLS0tIC9kZXYvbnVsbAorKysgYi90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9QaG9uZU51bWJlcldhdGNoZXJUZXN0LmphdmEKQEAgLTAsMCArMSwyMTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnk7CisKK2ltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5QaG9uZU51bWJlckZvcm1hdHRpbmdUZXh0V2F0Y2hlcjsKK2ltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOworaW1wb3J0IGFuZHJvaWQudGV4dC5FZGl0YWJsZTsKK2ltcG9ydCBhbmRyb2lkLnRleHQuU2VsZWN0aW9uOworaW1wb3J0IGFuZHJvaWQudGV4dC5TcGFubmFibGVTdHJpbmdCdWlsZGVyOworaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0V2F0Y2hlcjsKKworcHVibGljIGNsYXNzIFBob25lTnVtYmVyV2F0Y2hlclRlc3QgZXh0ZW5kcyBBbmRyb2lkVGVzdENhc2UgeworICAgIHB1YmxpYyB2b2lkIHRlc3RBcHBlbmRDaGFycygpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIG11bHRpQ2hhcnMgPSAiNjUwMTIzNDUiOworICAgICAgICBmaW5hbCBTdHJpbmcgZm9ybWF0dGVkMSA9ICIoNjUwKSAxMjMtNDUiOworICAgICAgICBUZXh0V2F0Y2hlciB0ZXh0V2F0Y2hlciA9IGdldFRleHRXYXRjaGVyKCk7CisgICAgICAgIFNwYW5uYWJsZVN0cmluZ0J1aWxkZXIgbnVtYmVyID0gbmV3IFNwYW5uYWJsZVN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgLy8gQXBwZW5kIG1vcmUgdGhhbiBvbmUgY2hhcnMKKyAgICAgICAgdGV4dFdhdGNoZXIuYmVmb3JlVGV4dENoYW5nZWQobnVtYmVyLCAwLCAwLCBtdWx0aUNoYXJzLmxlbmd0aCgpKTsKKyAgICAgICAgbnVtYmVyLmFwcGVuZChtdWx0aUNoYXJzKTsKKyAgICAgICAgU2VsZWN0aW9uLnNldFNlbGVjdGlvbihudW1iZXIsIG51bWJlci5sZW5ndGgoKSk7CisgICAgICAgIHRleHRXYXRjaGVyLm9uVGV4dENoYW5nZWQobnVtYmVyLCAwLCAwLCBudW1iZXIubGVuZ3RoKCkpOworICAgICAgICB0ZXh0V2F0Y2hlci5hZnRlclRleHRDaGFuZ2VkKG51bWJlcik7CisgICAgICAgIGFzc2VydEVxdWFscyhmb3JtYXR0ZWQxLCBudW1iZXIudG9TdHJpbmcoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhmb3JtYXR0ZWQxLmxlbmd0aCgpLCBTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uRW5kKG51bWJlcikpOworICAgICAgICAvLyBBcHBlbmQgb25lIGNoYXJzCisgICAgICAgIGZpbmFsIGNoYXIgYXBwZW5kQ2hhciA9ICc2JzsKKyAgICAgICAgZmluYWwgU3RyaW5nIGZvcm1hdHRlZDIgPSAiKDY1MCkgMTIzLTQ1NiI7CisgICAgICAgIGludCBsZW4gPSBudW1iZXIubGVuZ3RoKCk7CisgICAgICAgIHRleHRXYXRjaGVyLmJlZm9yZVRleHRDaGFuZ2VkKG51bWJlciwgbnVtYmVyLmxlbmd0aCgpLCAwLCAxKTsKKyAgICAgICAgbnVtYmVyLmFwcGVuZChhcHBlbmRDaGFyKTsKKyAgICAgICAgU2VsZWN0aW9uLnNldFNlbGVjdGlvbihudW1iZXIsIG51bWJlci5sZW5ndGgoKSk7CisgICAgICAgIHRleHRXYXRjaGVyLm9uVGV4dENoYW5nZWQobnVtYmVyLCBsZW4sIDAsIDEpOworICAgICAgICB0ZXh0V2F0Y2hlci5hZnRlclRleHRDaGFuZ2VkKG51bWJlcik7CisgICAgICAgIGFzc2VydEVxdWFscyhmb3JtYXR0ZWQyLCBudW1iZXIudG9TdHJpbmcoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhmb3JtYXR0ZWQyLmxlbmd0aCgpLCBTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uRW5kKG51bWJlcikpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RSZW1vdmVMYXN0Q2hhcnMoKSB7CisgICAgICAgIGZpbmFsIFN0cmluZyBpbml0ID0gIjY1MDEyMzQ1Njc4IjsKKyAgICAgICAgZmluYWwgU3RyaW5nIHJlc3VsdDEgPSAiKDY1MCkgMTIzLTQ1NjciOworICAgICAgICBUZXh0V2F0Y2hlciB0ZXh0V2F0Y2hlciA9IGdldFRleHRXYXRjaGVyKCk7CisgICAgICAgIC8vIFJlbW92ZSB0aGUgbGFzdCBjaGFyLgorICAgICAgICBTcGFubmFibGVTdHJpbmdCdWlsZGVyIG51bWJlciA9IG5ldyBTcGFubmFibGVTdHJpbmdCdWlsZGVyKGluaXQpOworICAgICAgICBpbnQgbGVuID0gbnVtYmVyLmxlbmd0aCgpOworICAgICAgICB0ZXh0V2F0Y2hlci5iZWZvcmVUZXh0Q2hhbmdlZChudW1iZXIsIGxlbiAtIDEsIDEsIDApOworICAgICAgICBudW1iZXIuZGVsZXRlKGxlbiAtIDEsIGxlbik7CisgICAgICAgIFNlbGVjdGlvbi5zZXRTZWxlY3Rpb24obnVtYmVyLCBudW1iZXIubGVuZ3RoKCkpOworICAgICAgICB0ZXh0V2F0Y2hlci5vblRleHRDaGFuZ2VkKG51bWJlciwgbnVtYmVyLmxlbmd0aCgpIC0gMSwgMSwgMCk7CisgICAgICAgIHRleHRXYXRjaGVyLmFmdGVyVGV4dENoYW5nZWQobnVtYmVyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdDEsIG51bWJlci50b1N0cmluZygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdDEubGVuZ3RoKCksIFNlbGVjdGlvbi5nZXRTZWxlY3Rpb25FbmQobnVtYmVyKSk7CisgICAgICAgIC8vIFJlbW92ZSBsYXN0IDUgY2hhcnMKKyAgICAgICAgZmluYWwgU3RyaW5nIHJlc3VsdDIgPSAiKDY1MCkgMTIzIjsKKyAgICAgICAgdGV4dFdhdGNoZXIuYmVmb3JlVGV4dENoYW5nZWQobnVtYmVyLCBudW1iZXIubGVuZ3RoKCkgLSA0LCA0LCAwKTsKKyAgICAgICAgbnVtYmVyLmRlbGV0ZShudW1iZXIubGVuZ3RoKCkgLSA1LCBudW1iZXIubGVuZ3RoKCkpOworICAgICAgICBTZWxlY3Rpb24uc2V0U2VsZWN0aW9uKG51bWJlciwgbnVtYmVyLmxlbmd0aCgpKTsKKyAgICAgICAgdGV4dFdhdGNoZXIub25UZXh0Q2hhbmdlZChudW1iZXIsIG51bWJlci5sZW5ndGgoKSwgNCwgMCk7CisgICAgICAgIHRleHRXYXRjaGVyLmFmdGVyVGV4dENoYW5nZWQobnVtYmVyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdDIsIG51bWJlci50b1N0cmluZygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdDIubGVuZ3RoKCksIFNlbGVjdGlvbi5nZXRTZWxlY3Rpb25FbmQobnVtYmVyKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEluc2VydENoYXJzKCkgeworICAgICAgICBmaW5hbCBTdHJpbmcgaW5pdCA9ICIoNjUwKSAyMyI7CisgICAgICAgIGZpbmFsIFN0cmluZyBleHBlY3RlZDEgPSAiKDY1MCkgMTIzIjsKKyAgICAgICAgVGV4dFdhdGNoZXIgdGV4dFdhdGNoZXIgPSBnZXRUZXh0V2F0Y2hlcigpOworCisgICAgICAgIC8vIEluc2VydCBvbmUgY2hhcgorICAgICAgICBTcGFubmFibGVTdHJpbmdCdWlsZGVyIG51bWJlciA9IG5ldyBTcGFubmFibGVTdHJpbmdCdWlsZGVyKGluaXQpOworICAgICAgICB0ZXh0V2F0Y2hlci5iZWZvcmVUZXh0Q2hhbmdlZChudW1iZXIsIDQsIDAsIDEpOworICAgICAgICBudW1iZXIuaW5zZXJ0KDQsICIxIik7IC8vICg2NTAxKSAyMworICAgICAgICBTZWxlY3Rpb24uc2V0U2VsZWN0aW9uKG51bWJlciwgNSk7IC8vIG1ha2UgdGhlIGN1cnNvciBhdCByaWdodCBvZiAxCisgICAgICAgIHRleHRXYXRjaGVyLm9uVGV4dENoYW5nZWQobnVtYmVyLCA0LCAwLCAxKTsKKyAgICAgICAgdGV4dFdhdGNoZXIuYWZ0ZXJUZXh0Q2hhbmdlZChudW1iZXIpOworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQxLCBudW1iZXIudG9TdHJpbmcoKSk7CisgICAgICAgIC8vIHRoZSBjdXJzb3Igc2hvdWxkIHN0aWxsIGF0IHRoZSByaWdodCBvZiAnMScKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDcsIFNlbGVjdGlvbi5nZXRTZWxlY3Rpb25FbmQobnVtYmVyKSk7CisKKyAgICAgICAgLy8gSW5zZXJ0IG11bHRpcGxlIGNoYXJzCisgICAgICAgIGZpbmFsIFN0cmluZyBleHBlY3RlZDIgPSAiKDY1MCkgMTQ1LTY3MjMiOworICAgICAgICB0ZXh0V2F0Y2hlci5iZWZvcmVUZXh0Q2hhbmdlZChudW1iZXIsIDcsIDAsIDQpOworICAgICAgICBudW1iZXIuaW5zZXJ0KDcsICI0NTY3Iik7IC8vIGNoYW5nZSB0byAoNjUwKSAxNDU2NzIzCisgICAgICAgIFNlbGVjdGlvbi5zZXRTZWxlY3Rpb24obnVtYmVyLCAxMSk7IC8vIHRoZSBjdXJzb3IgaXMgYXQgdGhlIHJpZ2h0IG9mICc3Jy4KKyAgICAgICAgdGV4dFdhdGNoZXIub25UZXh0Q2hhbmdlZChudW1iZXIsIDcsIDAsIDQpOworICAgICAgICB0ZXh0V2F0Y2hlci5hZnRlclRleHRDaGFuZ2VkKG51bWJlcik7CisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZDIsIG51bWJlci50b1N0cmluZygpKTsKKyAgICAgICAgLy8gdGhlIGN1cnNvciBzaG91bGQgYmUgc3RpbGwgYXQgdGhlIHJpZ2h0IG9mICc3JworICAgICAgICBhc3NlcnRFcXVhbHMoMTIsIFNlbGVjdGlvbi5nZXRTZWxlY3Rpb25FbmQobnVtYmVyKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFN0b3BGb3JtYXR0aW5nKCkgeworICAgICAgICBmaW5hbCBTdHJpbmcgaW5pdCA9ICIoNjUwKSAxMjMiOworICAgICAgICBmaW5hbCBTdHJpbmcgZXhwZWN0ZWQxID0gIig2NTApIDEyMyA0IjsKKyAgICAgICAgVGV4dFdhdGNoZXIgdGV4dFdhdGNoZXIgPSBnZXRUZXh0V2F0Y2hlcigpOworCisgICAgICAgIC8vIEFwcGVuZCBzcGFjZQorICAgICAgICBTcGFubmFibGVTdHJpbmdCdWlsZGVyIG51bWJlciA9IG5ldyBTcGFubmFibGVTdHJpbmdCdWlsZGVyKGluaXQpOworICAgICAgICB0ZXh0V2F0Y2hlci5iZWZvcmVUZXh0Q2hhbmdlZChudW1iZXIsIDksIDAsIDIpOworICAgICAgICBudW1iZXIuaW5zZXJ0KDksICIgNCIpOyAvLyAoNjUwMSkgMjMgNAorICAgICAgICBTZWxlY3Rpb24uc2V0U2VsZWN0aW9uKG51bWJlciwgbnVtYmVyLmxlbmd0aCgpKTsgLy8gbWFrZSB0aGUgY3Vyc29yIGF0IHJpZ2h0IG9mIDQKKyAgICAgICAgdGV4dFdhdGNoZXIub25UZXh0Q2hhbmdlZChudW1iZXIsIDksIDAsIDIpOworICAgICAgICB0ZXh0V2F0Y2hlci5hZnRlclRleHRDaGFuZ2VkKG51bWJlcik7CisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZDEsIG51bWJlci50b1N0cmluZygpKTsKKyAgICAgICAgLy8gdGhlIGN1cnNvciBzaG91bGQgc3RpbGwgYXQgdGhlIHJpZ2h0IG9mICcxJworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQxLmxlbmd0aCgpLCBTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uRW5kKG51bWJlcikpOworCisgICAgICAgIC8vIERlbGV0ZSBhICcpJworICAgICAgICBmaW5hbCBTdHJpbmcgZXhwZWN0ZWQyID0iKDY1MCAxMjMiOworICAgICAgICB0ZXh0V2F0Y2hlciA9IGdldFRleHRXYXRjaGVyKCk7CisgICAgICAgIG51bWJlciA9IG5ldyBTcGFubmFibGVTdHJpbmdCdWlsZGVyKGluaXQpOworICAgICAgICB0ZXh0V2F0Y2hlci5iZWZvcmVUZXh0Q2hhbmdlZChudW1iZXIsIDQsIDEsIDApOworICAgICAgICBudW1iZXIuZGVsZXRlKDQsIDUpOyAvLyAoNjUwMSAyMyA0CisgICAgICAgIFNlbGVjdGlvbi5zZXRTZWxlY3Rpb24obnVtYmVyLCA1KTsgLy8gbWFrZSB0aGUgY3Vyc29yIGF0IHJpZ2h0IG9mIDEKKyAgICAgICAgdGV4dFdhdGNoZXIub25UZXh0Q2hhbmdlZChudW1iZXIsIDQsIDEsIDApOworICAgICAgICB0ZXh0V2F0Y2hlci5hZnRlclRleHRDaGFuZ2VkKG51bWJlcik7CisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZDIsIG51bWJlci50b1N0cmluZygpKTsKKyAgICAgICAgLy8gdGhlIGN1cnNvciBzaG91bGQgc3RpbGwgYXQgdGhlIHJpZ2h0IG9mICcxJworICAgICAgICBhc3NlcnRFcXVhbHMoNSwgU2VsZWN0aW9uLmdldFNlbGVjdGlvbkVuZChudW1iZXIpKTsKKworICAgICAgICAvLyBJbnNlcnQgYSBoeXBoZW4KKyAgICAgICAgZmluYWwgU3RyaW5nIGV4cGVjdGVkMyA9Iig2NTApIDEyLTMiOworICAgICAgICB0ZXh0V2F0Y2hlciA9IGdldFRleHRXYXRjaGVyKCk7CisgICAgICAgIG51bWJlciA9IG5ldyBTcGFubmFibGVTdHJpbmdCdWlsZGVyKGluaXQpOworICAgICAgICB0ZXh0V2F0Y2hlci5iZWZvcmVUZXh0Q2hhbmdlZChudW1iZXIsIDgsIDAsIDEpOworICAgICAgICBudW1iZXIuaW5zZXJ0KDgsICItIik7IC8vICg2NTApIDEyLTMKKyAgICAgICAgU2VsZWN0aW9uLnNldFNlbGVjdGlvbihudW1iZXIsIDkpOyAvLyBtYWtlIHRoZSBjdXJzb3IgYXQgcmlnaHQgb2YgLQorICAgICAgICB0ZXh0V2F0Y2hlci5vblRleHRDaGFuZ2VkKG51bWJlciwgOCwgMCwgMSk7CisgICAgICAgIHRleHRXYXRjaGVyLmFmdGVyVGV4dENoYW5nZWQobnVtYmVyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkMywgbnVtYmVyLnRvU3RyaW5nKCkpOworICAgICAgICAvLyB0aGUgY3Vyc29yIHNob3VsZCBzdGlsbCBhdCB0aGUgcmlnaHQgb2YgJy0nCisgICAgICAgIGFzc2VydEVxdWFscyg5LCBTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uRW5kKG51bWJlcikpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RSZXN0YXJ0Rm9ybWF0dGluZygpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIGluaXQgPSAiKDY1MCkgMTIzIjsKKyAgICAgICAgZmluYWwgU3RyaW5nIGV4cGVjdGVkMSA9ICIoNjUwKSAxMjMgNCI7CisgICAgICAgIFRleHRXYXRjaGVyIHRleHRXYXRjaGVyID0gZ2V0VGV4dFdhdGNoZXIoKTsKKworICAgICAgICAvLyBBcHBlbmQgc3BhY2UKKyAgICAgICAgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlciBudW1iZXIgPSBuZXcgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlcihpbml0KTsKKyAgICAgICAgdGV4dFdhdGNoZXIuYmVmb3JlVGV4dENoYW5nZWQobnVtYmVyLCA5LCAwLCAyKTsKKyAgICAgICAgbnVtYmVyLmluc2VydCg5LCAiIDQiKTsgLy8gKDY1MCkgMTIzIDQKKyAgICAgICAgU2VsZWN0aW9uLnNldFNlbGVjdGlvbihudW1iZXIsIG51bWJlci5sZW5ndGgoKSk7IC8vIG1ha2UgdGhlIGN1cnNvciBhdCByaWdodCBvZiA0CisgICAgICAgIHRleHRXYXRjaGVyLm9uVGV4dENoYW5nZWQobnVtYmVyLCA5LCAwLCAyKTsKKyAgICAgICAgdGV4dFdhdGNoZXIuYWZ0ZXJUZXh0Q2hhbmdlZChudW1iZXIpOworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQxLCBudW1iZXIudG9TdHJpbmcoKSk7CisgICAgICAgIC8vIHRoZSBjdXJzb3Igc2hvdWxkIHN0aWxsIGF0IHRoZSByaWdodCBvZiAnNCcKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkMS5sZW5ndGgoKSwgU2VsZWN0aW9uLmdldFNlbGVjdGlvbkVuZChudW1iZXIpKTsKKworICAgICAgICAvLyBDbGVhciB0aGUgY3VycmVudCBzdHJpbmcsIGFuZCBzdGFydCBmb3JtYXR0aW5nIGFnYWluLgorICAgICAgICBpbnQgbGVuID0gbnVtYmVyLmxlbmd0aCgpOworICAgICAgICB0ZXh0V2F0Y2hlci5iZWZvcmVUZXh0Q2hhbmdlZChudW1iZXIsIDAsIGxlbiwgMCk7CisgICAgICAgIG51bWJlci5kZWxldGUoMCwgbGVuKTsKKyAgICAgICAgdGV4dFdhdGNoZXIub25UZXh0Q2hhbmdlZChudW1iZXIsIDAsIGxlbiwgMCk7CisgICAgICAgIHRleHRXYXRjaGVyLmFmdGVyVGV4dENoYW5nZWQobnVtYmVyKTsKKworICAgICAgICBmaW5hbCBTdHJpbmcgZXhwZWN0ZWQyID0gIig2NTApIDEyMy00IjsKKyAgICAgICAgbnVtYmVyID0gbmV3IFNwYW5uYWJsZVN0cmluZ0J1aWxkZXIoaW5pdCk7CisgICAgICAgIHRleHRXYXRjaGVyLmJlZm9yZVRleHRDaGFuZ2VkKG51bWJlciwgOSwgMCwgMSk7CisgICAgICAgIG51bWJlci5pbnNlcnQoOSwgIjQiKTsgLy8gKDY1MCkgMTIzNAorICAgICAgICBTZWxlY3Rpb24uc2V0U2VsZWN0aW9uKG51bWJlciwgbnVtYmVyLmxlbmd0aCgpKTsgLy8gbWFrZSB0aGUgY3Vyc29yIGF0IHJpZ2h0IG9mIDQKKyAgICAgICAgdGV4dFdhdGNoZXIub25UZXh0Q2hhbmdlZChudW1iZXIsIDksIDAsIDEpOworICAgICAgICB0ZXh0V2F0Y2hlci5hZnRlclRleHRDaGFuZ2VkKG51bWJlcik7CisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZDIsIG51bWJlci50b1N0cmluZygpKTsKKyAgICAgICAgLy8gdGhlIGN1cnNvciBzaG91bGQgc3RpbGwgYXQgdGhlIHJpZ2h0IG9mICc0JworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQyLmxlbmd0aCgpLCBTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uRW5kKG51bWJlcikpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RUZXh0Q2hhbmdlZEJ5T3RoZXJUZXh0V2F0Y2hlcigpIHsKKyAgICAgICAgZmluYWwgVGV4dFdhdGNoZXIgY2xlYW51cFRleHRXYXRjaGVyID0gbmV3IFRleHRXYXRjaGVyKCkgeworICAgICAgICAgICAgcHVibGljIHZvaWQgYWZ0ZXJUZXh0Q2hhbmdlZChFZGl0YWJsZSBzKSB7CisgICAgICAgICAgICAgICAgcy5jbGVhcigpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBiZWZvcmVUZXh0Q2hhbmdlZChDaGFyU2VxdWVuY2UgcywgaW50IHN0YXJ0LCBpbnQgY291bnQsCisgICAgICAgICAgICAgICAgICAgIGludCBhZnRlcikgeworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblRleHRDaGFuZ2VkKENoYXJTZXF1ZW5jZSBzLCBpbnQgc3RhcnQsIGludCBiZWZvcmUsCisgICAgICAgICAgICAgICAgICAgIGludCBjb3VudCkgeworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICBmaW5hbCBTdHJpbmcgaW5pdCA9ICIoNjUwKSAxMjMiOworICAgICAgICBmaW5hbCBTdHJpbmcgZXhwZWN0ZWQxID0gIiI7CisgICAgICAgIFRleHRXYXRjaGVyIHRleHRXYXRjaGVyID0gZ2V0VGV4dFdhdGNoZXIoKTsKKworICAgICAgICBTcGFubmFibGVTdHJpbmdCdWlsZGVyIG51bWJlciA9IG5ldyBTcGFubmFibGVTdHJpbmdCdWlsZGVyKGluaXQpOworICAgICAgICB0ZXh0V2F0Y2hlci5iZWZvcmVUZXh0Q2hhbmdlZChudW1iZXIsIDUsIDAsIDEpOworICAgICAgICBudW1iZXIuaW5zZXJ0KDUsICI0Iik7IC8vICg2NTA0KSAxMjMKKyAgICAgICAgU2VsZWN0aW9uLnNldFNlbGVjdGlvbihudW1iZXIsIDUpOyAvLyBtYWtlIHRoZSBjdXJzb3IgYXQgcmlnaHQgb2YgNAorICAgICAgICB0ZXh0V2F0Y2hlci5vblRleHRDaGFuZ2VkKG51bWJlciwgNSwgMCwgMSk7CisgICAgICAgIG51bWJlci5zZXRTcGFuKGNsZWFudXBUZXh0V2F0Y2hlciwgMCwgbnVtYmVyLmxlbmd0aCgpLCAwKTsKKyAgICAgICAgdGV4dFdhdGNoZXIuYWZ0ZXJUZXh0Q2hhbmdlZChudW1iZXIpOworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQxLCBudW1iZXIudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBUZXh0V2F0Y2hlciBnZXRUZXh0V2F0Y2hlcigpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBQaG9uZU51bWJlckZvcm1hdHRpbmdUZXh0V2F0Y2hlcigiVVMiKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9UZXN0UGhvbmVOb3RpZmllci5qYXZhIGIvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvVGVzdFBob25lTm90aWZpZXIuamF2YQppbmRleCA0Mjc3OTViLi44Y2IwNWNjIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9UZXN0UGhvbmVOb3RpZmllci5qYXZhCisrKyBiL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1Rlc3RQaG9uZU5vdGlmaWVyLmphdmEKQEAgLTE2LDYgKzE2LDggQEAKIAogcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnk7CiAKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuUGhvbmU7CisKIC8qKgogICogU3R1YiBjbGFzcyB1c2VkIGZvciB1bml0IHRlc3RzCiAgKi8KQEAgLTMyLDcgKzM0LDcgQEAKIAogICAgIHB1YmxpYyB2b2lkIG5vdGlmeUNlbGxMb2NhdGlvbihQaG9uZSBzZW5kZXIpIHsKICAgICB9Ci0gICAgCisKICAgICBwdWJsaWMgdm9pZCBub3RpZnlTaWduYWxTdHJlbmd0aChQaG9uZSBzZW5kZXIpIHsKICAgICB9CiAKQEAgLTQyLDEwICs0NCwxNCBAQAogICAgIHB1YmxpYyB2b2lkIG5vdGlmeUNhbGxGb3J3YXJkaW5nQ2hhbmdlZChQaG9uZSBzZW5kZXIpIHsKICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCBub3RpZnlEYXRhQ29ubmVjdGlvbihQaG9uZSBzZW5kZXIsIFN0cmluZyByZWFzb24pIHsKKyAgICBwdWJsaWMgdm9pZCBub3RpZnlEYXRhQ29ubmVjdGlvbihQaG9uZSBzZW5kZXIsIFN0cmluZyByZWFzb24sIFN0cmluZyBhcG5UeXBlKSB7CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgbm90aWZ5RGF0YUNvbm5lY3Rpb25GYWlsZWQoUGhvbmUgc2VuZGVyLCBTdHJpbmcgcmVhc29uKSB7CisgICAgcHVibGljIHZvaWQgbm90aWZ5RGF0YUNvbm5lY3Rpb24oUGhvbmUgc2VuZGVyLCBTdHJpbmcgcmVhc29uLCBTdHJpbmcgYXBuVHlwZSwKKyAgICAgICAgICAgIFBob25lLkRhdGFTdGF0ZSBzdGF0ZSkgeworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG5vdGlmeURhdGFDb25uZWN0aW9uRmFpbGVkKFBob25lIHNlbmRlciwgU3RyaW5nIHJlYXNvbiwgU3RyaW5nIGFwblR5cGUpIHsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBub3RpZnlEYXRhQWN0aXZpdHkoUGhvbmUgc2VuZGVyKSB7CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vR1NNUGhvbmVUZXN0LmphdmEgYi90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vR1NNUGhvbmVUZXN0LmphdmEKaW5kZXggYjk2NzQzYS4uNDg1NTQyYiAxMDA2NDQKLS0tIGEvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL0dTTVBob25lVGVzdC5qYXZhCisrKyBiL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9HU01QaG9uZVRlc3QuamF2YQpAQCAtMTgsMjcgKzE4LDIxIEBACiAKIGltcG9ydCBhbmRyb2lkLm9zLkFzeW5jUmVzdWx0OwogaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKLWltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXJUaHJlYWQ7Ci1pbXBvcnQgYW5kcm9pZC5vcy5Mb29wZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOwotaW1wb3J0IGFuZHJvaWQub3MuUHJvY2VzczsKIGltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5TZXJ2aWNlU3RhdGU7CiBpbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKIGltcG9ydCBhbmRyb2lkLnRlc3QuUGVyZm9ybWFuY2VUZXN0Q2FzZTsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogCiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkNhbGw7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkNhbGxTdGF0ZUV4Y2VwdGlvbjsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuQ29ubmVjdGlvbjsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuTW1pQ29kZTsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuUGhvbmU7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlRlc3RQaG9uZU5vdGlmaWVyOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uQ2FsbEZhaWxDYXVzZTsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLkdTTVBob25lOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uR1NNVGVzdEhhbmRsZXI7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5Hc21NbWlDb2RlOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uU3VwcFNlcnZpY2VOb3RpZmljYXRpb247Ci1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LnRlc3QuU2ltdWxhdGVkQ29tbWFuZHM7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LnRlc3QuU2ltdWxhdGVkUmFkaW9Db250cm9sOwogCiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CmRpZmYgLS1naXQgYS90ZXN0LXJ1bm5lci9BbmRyb2lkLm1rIGIvdGVzdC1ydW5uZXIvQW5kcm9pZC5tawppbmRleCA5NjJlOTZjLi42ZDgxYjcxIDEwMDY0NAotLS0gYS90ZXN0LXJ1bm5lci9BbmRyb2lkLm1rCisrKyBiL3Rlc3QtcnVubmVyL0FuZHJvaWQubWsKQEAgLTIwLDcgKzIwLDcgQEAKIAogTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKQogCi1MT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBjb3JlIGZyYW1ld29yaworTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gY29yZSBjb3JlLWp1bml0IGZyYW1ld29yawogCiBMT0NBTF9NT0RVTEU6PSBhbmRyb2lkLnRlc3QucnVubmVyCiAKZGlmZiAtLWdpdCBhL3Rlc3QtcnVubmVyL3NyYy9hbmRyb2lkL3Rlc3QvUmVuYW1pbmdEZWxlZ2F0aW5nQ29udGV4dC5qYXZhIGIvdGVzdC1ydW5uZXIvc3JjL2FuZHJvaWQvdGVzdC9SZW5hbWluZ0RlbGVnYXRpbmdDb250ZXh0LmphdmEKaW5kZXggOTczYjlmMi4uZWVlM2FkNyAxMDA2NDQKLS0tIGEvdGVzdC1ydW5uZXIvc3JjL2FuZHJvaWQvdGVzdC9SZW5hbWluZ0RlbGVnYXRpbmdDb250ZXh0LmphdmEKKysrIGIvdGVzdC1ydW5uZXIvc3JjL2FuZHJvaWQvdGVzdC9SZW5hbWluZ0RlbGVnYXRpbmdDb250ZXh0LmphdmEKQEAgLTIxLDYgKzIxLDcgQEAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dFdyYXBwZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkRhdGFiYXNlRXJyb3JIYW5kbGVyOwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlOwogaW1wb3J0IGFuZHJvaWQub3MuRmlsZVV0aWxzOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CkBAIC0xNDgsNiArMTQ5LDE3IEBACiAgICAgfQogCiAgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNRTGl0ZURhdGFiYXNlIG9wZW5PckNyZWF0ZURhdGFiYXNlKFN0cmluZyBuYW1lLAorICAgICAgICAgICAgaW50IG1vZGUsIFNRTGl0ZURhdGFiYXNlLkN1cnNvckZhY3RvcnkgZmFjdG9yeSwgRGF0YWJhc2VFcnJvckhhbmRsZXIgZXJyb3JIYW5kbGVyKSB7CisgICAgICAgIGZpbmFsIFN0cmluZyBpbnRlcm5hbE5hbWUgPSByZW5hbWVkRmlsZU5hbWUobmFtZSk7CisgICAgICAgIGlmICghbURhdGFiYXNlTmFtZXMuY29udGFpbnMobmFtZSkpIHsKKyAgICAgICAgICAgIG1EYXRhYmFzZU5hbWVzLmFkZChuYW1lKTsKKyAgICAgICAgICAgIG1GaWxlQ29udGV4dC5kZWxldGVEYXRhYmFzZShpbnRlcm5hbE5hbWUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtRmlsZUNvbnRleHQub3Blbk9yQ3JlYXRlRGF0YWJhc2UoaW50ZXJuYWxOYW1lLCBtb2RlLCBmYWN0b3J5LCBlcnJvckhhbmRsZXIpOworICAgIH0KKworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGRlbGV0ZURhdGFiYXNlKFN0cmluZyBuYW1lKSB7CiAgICAgICAgIGlmIChtRGF0YWJhc2VOYW1lcy5jb250YWlucyhuYW1lKSkgewogICAgICAgICAgICAgbURhdGFiYXNlTmFtZXMucmVtb3ZlKG5hbWUpOwpkaWZmIC0tZ2l0IGEvdGVzdC1ydW5uZXIvc3JjL2FuZHJvaWQvdGVzdC9tb2NrL01vY2tDb250ZXh0LmphdmEgYi90ZXN0LXJ1bm5lci9zcmMvYW5kcm9pZC90ZXN0L21vY2svTW9ja0NvbnRleHQuamF2YQppbmRleCBmZmQ3NTdjLi5jMzFjOWNjIDEwMDY0NAotLS0gYS90ZXN0LXJ1bm5lci9zcmMvYW5kcm9pZC90ZXN0L21vY2svTW9ja0NvbnRleHQuamF2YQorKysgYi90ZXN0LXJ1bm5lci9zcmMvYW5kcm9pZC90ZXN0L21vY2svTW9ja0NvbnRleHQuamF2YQpAQCAtMjksNiArMjksNyBAQAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkFzc2V0TWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkRhdGFiYXNlRXJyb3JIYW5kbGVyOwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7CkBAIC0xODQsNiArMTg1LDEyIEBACiAgICAgfQogCiAgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNRTGl0ZURhdGFiYXNlIG9wZW5PckNyZWF0ZURhdGFiYXNlKFN0cmluZyBmaWxlLCBpbnQgbW9kZSwKKyAgICAgICAgICAgIFNRTGl0ZURhdGFiYXNlLkN1cnNvckZhY3RvcnkgZmFjdG9yeSwgRGF0YWJhc2VFcnJvckhhbmRsZXIgZXJyb3JIYW5kbGVyKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBGaWxlIGdldERhdGFiYXNlUGF0aChTdHJpbmcgbmFtZSkgewogICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKICAgICB9CmRpZmYgLS1naXQgYS90ZXN0LXJ1bm5lci9zcmMvYW5kcm9pZC90ZXN0L21vY2svTW9ja0N1cnNvci5qYXZhIGIvdGVzdC1ydW5uZXIvc3JjL2FuZHJvaWQvdGVzdC9tb2NrL01vY2tDdXJzb3IuamF2YQppbmRleCA5YjFjMGVmLi5iYWExNTBhIDEwMDY0NAotLS0gYS90ZXN0LXJ1bm5lci9zcmMvYW5kcm9pZC90ZXN0L21vY2svTW9ja0N1cnNvci5qYXZhCisrKyBiL3Rlc3QtcnVubmVyL3NyYy9hbmRyb2lkL3Rlc3QvbW9jay9Nb2NrQ3Vyc29yLmphdmEKQEAgLTE3OCwzNiArMTc4LDExIEBACiAgICAgfQogCiAgICAgQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKLSAgICBwdWJsaWMgYm9vbGVhbiBjb21taXRVcGRhdGVzKCkgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oInVuaW1wbGVtZW50ZWQgbW9jayBtZXRob2QiKTsKLSAgICB9Ci0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQotICAgIHB1YmxpYyBib29sZWFuIGNvbW1pdFVwZGF0ZXMoTWFwPD8gZXh0ZW5kcyBMb25nLCA/IGV4dGVuZHMgTWFwPFN0cmluZywgT2JqZWN0Pj4gdmFsdWVzKSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigidW5pbXBsZW1lbnRlZCBtb2NrIG1ldGhvZCIpOwotICAgIH0KLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCi0gICAgcHVibGljIGJvb2xlYW4gaGFzVXBkYXRlcygpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJ1bmltcGxlbWVudGVkIG1vY2sgbWV0aG9kIik7Ci0gICAgfQotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKICAgICBwdWJsaWMgdm9pZCBzZXROb3RpZmljYXRpb25VcmkoQ29udGVudFJlc29sdmVyIGNyLCBVcmkgdXJpKSB7CiAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigidW5pbXBsZW1lbnRlZCBtb2NrIG1ldGhvZCIpOwogICAgIH0KIAogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCi0gICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNVcGRhdGVzKCkgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oInVuaW1wbGVtZW50ZWQgbW9jayBtZXRob2QiKTsKLSAgICB9Ci0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQotICAgIHB1YmxpYyBib29sZWFuIGRlbGV0ZVJvdygpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJ1bmltcGxlbWVudGVkIG1vY2sgbWV0aG9kIik7Ci0gICAgfQotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKICAgICBwdWJsaWMgdm9pZCB1bnJlZ2lzdGVyQ29udGVudE9ic2VydmVyKENvbnRlbnRPYnNlcnZlciBvYnNlcnZlcikgewogICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oInVuaW1wbGVtZW50ZWQgbW9jayBtZXRob2QiKTsKICAgICB9CkBAIC0yMTcsNDggKzE5Miw3IEBACiAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigidW5pbXBsZW1lbnRlZCBtb2NrIG1ldGhvZCIpOwogICAgIH0KIAotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCi0gICAgcHVibGljIGJvb2xlYW4gdXBkYXRlQmxvYihpbnQgY29sdW1uSW5kZXgsIGJ5dGVbXSB2YWx1ZSkgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oInVuaW1wbGVtZW50ZWQgbW9jayBtZXRob2QiKTsKLSAgICB9Ci0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQotICAgIHB1YmxpYyBib29sZWFuIHVwZGF0ZURvdWJsZShpbnQgY29sdW1uSW5kZXgsIGRvdWJsZSB2YWx1ZSkgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oInVuaW1wbGVtZW50ZWQgbW9jayBtZXRob2QiKTsKLSAgICB9Ci0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQotICAgIHB1YmxpYyBib29sZWFuIHVwZGF0ZUZsb2F0KGludCBjb2x1bW5JbmRleCwgZmxvYXQgdmFsdWUpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJ1bmltcGxlbWVudGVkIG1vY2sgbWV0aG9kIik7Ci0gICAgfQotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKLSAgICBwdWJsaWMgYm9vbGVhbiB1cGRhdGVJbnQoaW50IGNvbHVtbkluZGV4LCBpbnQgdmFsdWUpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJ1bmltcGxlbWVudGVkIG1vY2sgbWV0aG9kIik7Ci0gICAgfQotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKLSAgICBwdWJsaWMgYm9vbGVhbiB1cGRhdGVMb25nKGludCBjb2x1bW5JbmRleCwgbG9uZyB2YWx1ZSkgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oInVuaW1wbGVtZW50ZWQgbW9jayBtZXRob2QiKTsKLSAgICB9Ci0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQotICAgIHB1YmxpYyBib29sZWFuIHVwZGF0ZVNob3J0KGludCBjb2x1bW5JbmRleCwgc2hvcnQgdmFsdWUpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJ1bmltcGxlbWVudGVkIG1vY2sgbWV0aG9kIik7Ci0gICAgfQotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKLSAgICBwdWJsaWMgYm9vbGVhbiB1cGRhdGVTdHJpbmcoaW50IGNvbHVtbkluZGV4LCBTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJ1bmltcGxlbWVudGVkIG1vY2sgbWV0aG9kIik7Ci0gICAgfQotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKLSAgICBwdWJsaWMgYm9vbGVhbiB1cGRhdGVUb051bGwoaW50IGNvbHVtbkluZGV4KSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigidW5pbXBsZW1lbnRlZCBtb2NrIG1ldGhvZCIpOwotICAgIH0KLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCi0gICAgcHVibGljIHZvaWQgYWJvcnRVcGRhdGVzKCkgeworICAgIHB1YmxpYyBpbnQgZ2V0VHlwZShpbnQgY29sdW1uSW5kZXgpIHsKICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJ1bmltcGxlbWVudGVkIG1vY2sgbWV0aG9kIik7CiAgICAgfQogfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QtcnVubmVyL3NyYy9hbmRyb2lkL3Rlc3Qvc3VpdGVidWlsZGVyL1Rlc3RHcm91cGluZy5qYXZhIGIvdGVzdC1ydW5uZXIvc3JjL2FuZHJvaWQvdGVzdC9zdWl0ZWJ1aWxkZXIvVGVzdEdyb3VwaW5nLmphdmEKaW5kZXggZGY2ZGE3MC4uYTJiOTRmZiAxMDA2NDQKLS0tIGEvdGVzdC1ydW5uZXIvc3JjL2FuZHJvaWQvdGVzdC9zdWl0ZWJ1aWxkZXIvVGVzdEdyb3VwaW5nLmphdmEKKysrIGIvdGVzdC1ydW5uZXIvc3JjL2FuZHJvaWQvdGVzdC9zdWl0ZWJ1aWxkZXIvVGVzdEdyb3VwaW5nLmphdmEKQEAgLTQ2LDYgKzQ2LDggQEAKICAqLwogcHVibGljIGNsYXNzIFRlc3RHcm91cGluZyB7CiAKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1RBRyA9ICJUZXN0R3JvdXBpbmciOworCiAgICAgU29ydGVkU2V0PENsYXNzPD8gZXh0ZW5kcyBUZXN0Q2FzZT4+IHRlc3RDYXNlQ2xhc3NlczsKIAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ29tcGFyYXRvcjxDbGFzczw/IGV4dGVuZHMgVGVzdENhc2U+PiBTT1JUX0JZX1NJTVBMRV9OQU1FCkBAIC0xMTQsNyArMTE2LDcgQEAKICAgICAgICAgZm9yIChTdHJpbmcgcGFja2FnZU5hbWUgOiBwYWNrYWdlTmFtZXMpIHsKICAgICAgICAgICAgIExpc3Q8Q2xhc3M8PyBleHRlbmRzIFRlc3RDYXNlPj4gYWRkZWRDbGFzc2VzID0gdGVzdENhc2VDbGFzc2VzSW5QYWNrYWdlKHBhY2thZ2VOYW1lKTsKICAgICAgICAgICAgIGlmIChhZGRlZENsYXNzZXMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoIlRlc3RHcm91cGluZyIsICJJbnZhbGlkIFBhY2thZ2U6ICciICsgcGFja2FnZU5hbWUKKyAgICAgICAgICAgICAgICBMb2cudyhMT0dfVEFHLCAiSW52YWxpZCBQYWNrYWdlOiAnIiArIHBhY2thZ2VOYW1lCiAgICAgICAgICAgICAgICAgICAgICAgICArICInIGNvdWxkIG5vdCBiZSBmb3VuZCBvciBoYXMgbm8gdGVzdHMiKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHRlc3RDYXNlQ2xhc3Nlcy5hZGRBbGwoYWRkZWRDbGFzc2VzKTsKQEAgLTIzNCw2ICsyMzYsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIExvZy5pKExPR19UQUcsIFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICJUZXN0Q2FzZSBjbGFzcyAlcyBpcyBtaXNzaW5nIGEgcHVibGljIGNvbnN0cnVjdG9yIHdpdGggbm8gcGFyYW1ldGVycyAiICsKKyAgICAgICAgICAgICAgICAgICAgIm9yIGEgc2luZ2xlIFN0cmluZyBwYXJhbWV0ZXIgLSBza2lwcGluZyIsCisgICAgICAgICAgICAgICAgICAgIGFDbGFzcy5nZXROYW1lKCkpKTsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgIH0KZGlmZiAtLWdpdCBhL3Rlc3QtcnVubmVyL3Rlc3RzL3NyYy9hbmRyb2lkL3Rlc3Qvc3VpdGVidWlsZGVyL1Rlc3RHcm91cGluZ1Rlc3QuamF2YSBiL3Rlc3QtcnVubmVyL3Rlc3RzL3NyYy9hbmRyb2lkL3Rlc3Qvc3VpdGVidWlsZGVyL1Rlc3RHcm91cGluZ1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDQ3N2QxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC1ydW5uZXIvdGVzdHMvc3JjL2FuZHJvaWQvdGVzdC9zdWl0ZWJ1aWxkZXIvVGVzdEdyb3VwaW5nVGVzdC5qYXZhCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQudGVzdC5zdWl0ZWJ1aWxkZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworLyoqCisgKiBVbml0IHRlc3RzIGZvciB7QGxpbmsgVGVzdEdyb3VwaW5nfQorICovCitwdWJsaWMgY2xhc3MgVGVzdEdyb3VwaW5nVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKworICAgIHByaXZhdGUgVGVzdEdyb3VwaW5nIG1Hcm91cGluZzsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLnNldFVwKCk7CisgICAgICAgIG1Hcm91cGluZyA9IG5ldyBUZXN0R3JvdXBpbmcoVGVzdEdyb3VwaW5nLlNPUlRfQllfU0lNUExFX05BTUUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFZlcmlmaWVzIHRoYXQgVGVzdENhc2VzIHdpdGggbm8gcHVibGljIGNvbnN0cnVjdG9yIGFyZSBub3QgbG9hZGVkLgorICAgICAqIFJlbGllcyBvbiBmaXh0dXJlIGNsYXNzZXMgaW4gYW5kcm9pZC50ZXN0LnN1aXRlYnVpbGRlci5leGFtcGxlcy5jb25zdHJ1Y3RvcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRUZXN0c19ub1B1YmxpY0NvbnN0cnVjdG9yKCkgeworICAgICAgICBtR3JvdXBpbmcuYWRkUGFja2FnZXNSZWN1cnNpdmUoImFuZHJvaWQudGVzdC5zdWl0ZWJ1aWxkZXIuZXhhbXBsZXMuY29uc3RydWN0b3IiKTsKKyAgICAgICAgTGlzdDxUZXN0TWV0aG9kPiB0ZXN0cyA9IG1Hcm91cGluZy5nZXRUZXN0cygpOworICAgICAgICAvLyBvbmx5IHRoZSBQdWJsaWNDb25zdHJ1Y3RvclRlc3QncyB0ZXN0IG1ldGhvZCBzaG91bGQgYmUgcHJlc2VudAorICAgICAgICBhc3NlcnRFcXVhbHMoMSwgdGVzdHMuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXN0UHVibGljQ29uc3RydWN0b3IiLCB0ZXN0cy5nZXQoMCkuZ2V0TmFtZSgpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0LXJ1bm5lci90ZXN0cy9zcmMvYW5kcm9pZC90ZXN0L3N1aXRlYnVpbGRlci9leGFtcGxlcy9jb25zdHJ1Y3Rvci9Ob1B1YmxpY0NvbnN0cnVjdG9yVGVzdC5qYXZhIGIvdGVzdC1ydW5uZXIvdGVzdHMvc3JjL2FuZHJvaWQvdGVzdC9zdWl0ZWJ1aWxkZXIvZXhhbXBsZXMvY29uc3RydWN0b3IvTm9QdWJsaWNDb25zdHJ1Y3RvclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzkwOWExCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC1ydW5uZXIvdGVzdHMvc3JjL2FuZHJvaWQvdGVzdC9zdWl0ZWJ1aWxkZXIvZXhhbXBsZXMvY29uc3RydWN0b3IvTm9QdWJsaWNDb25zdHJ1Y3RvclRlc3QuamF2YQpAQCAtMCwwICsxLDM1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLmV4YW1wbGVzLmNvbnN0cnVjdG9yOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCisvKioKKyAqIEEge0BsaW5rIFRlc3RDYXNlfSB3aGljaCBzaG91bGQgbm90IGJlIGxvYWRlZCBzaW5jZSBpdCBoYXMgbm9uLXB1YmxpYyBjb25zdHJ1Y3RvcnMgd2l0aCBubyBhcmdzLgorICovCitwdWJsaWMgY2xhc3MgTm9QdWJsaWNDb25zdHJ1Y3RvclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgICBOb1B1YmxpY0NvbnN0cnVjdG9yVGVzdCgpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgTm9QdWJsaWNDb25zdHJ1Y3RvclRlc3QoU3RyaW5nIGZvbywgU3RyaW5nIGZvbzIpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm90UnVuKCkgeworICAgICAgICBmYWlsKCJtZXRob2QgaW4gTm9QdWJsaWNDb25zdHJ1Y3RvclRlc3QgcnVuIHVuZXhwZWN0ZWRseSIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QtcnVubmVyL3Rlc3RzL3NyYy9hbmRyb2lkL3Rlc3Qvc3VpdGVidWlsZGVyL2V4YW1wbGVzL2NvbnN0cnVjdG9yL1Byb3RlY3RlZENvbnN0cnVjdG9yVGVzdC5qYXZhIGIvdGVzdC1ydW5uZXIvdGVzdHMvc3JjL2FuZHJvaWQvdGVzdC9zdWl0ZWJ1aWxkZXIvZXhhbXBsZXMvY29uc3RydWN0b3IvUHJvdGVjdGVkQ29uc3RydWN0b3JUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDI4NjJmZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QtcnVubmVyL3Rlc3RzL3NyYy9hbmRyb2lkL3Rlc3Qvc3VpdGVidWlsZGVyL2V4YW1wbGVzL2NvbnN0cnVjdG9yL1Byb3RlY3RlZENvbnN0cnVjdG9yVGVzdC5qYXZhCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQudGVzdC5zdWl0ZWJ1aWxkZXIuZXhhbXBsZXMuY29uc3RydWN0b3I7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKKy8qKgorICogQSBwcm90ZWN0ZWQgY29uc3RydWN0b3IgdGVzdCBjYXNlIHRoYXQgc2hvdWxkIG5vdCBiZSBsb2FkZWQuCisgKi8KK3B1YmxpYyBjbGFzcyBQcm90ZWN0ZWRDb25zdHJ1Y3RvclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgICBwcm90ZWN0ZWQgUHJvdGVjdGVkQ29uc3RydWN0b3JUZXN0KCkgeworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3ROb3RSdW4oKSB7CisgICAgICAgIGZhaWwoIm1ldGhvZCBpbiBQcm90ZWN0ZWRDb25zdHJ1Y3RvclRlc3QgcnVuIHVuZXhwZWN0ZWRseSIpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9WZWN0b3I0Zi5qYXZhIGIvdGVzdC1ydW5uZXIvdGVzdHMvc3JjL2FuZHJvaWQvdGVzdC9zdWl0ZWJ1aWxkZXIvZXhhbXBsZXMvY29uc3RydWN0b3IvUHVibGljQ29uc3RydWN0b3JUZXN0LmphdmEKc2ltaWxhcml0eSBpbmRleCA2NSUKY29weSBmcm9tIGdyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvVmVjdG9yNGYuamF2YQpjb3B5IHRvIHRlc3QtcnVubmVyL3Rlc3RzL3NyYy9hbmRyb2lkL3Rlc3Qvc3VpdGVidWlsZGVyL2V4YW1wbGVzL2NvbnN0cnVjdG9yL1B1YmxpY0NvbnN0cnVjdG9yVGVzdC5qYXZhCmluZGV4IGZhYmQ5NTkuLmExMWUyNWQgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvVmVjdG9yNGYuamF2YQorKysgYi90ZXN0LXJ1bm5lci90ZXN0cy9zcmMvYW5kcm9pZC90ZXN0L3N1aXRlYnVpbGRlci9leGFtcGxlcy9jb25zdHJ1Y3Rvci9QdWJsaWNDb25zdHJ1Y3RvclRlc3QuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKICAqCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KQEAgLTE0LDI1ICsxNCwxNSBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotcGFja2FnZSBhbmRyb2lkLnJlbmRlcnNjcmlwdDsKK3BhY2thZ2UgYW5kcm9pZC50ZXN0LnN1aXRlYnVpbGRlci5leGFtcGxlcy5jb25zdHJ1Y3RvcjsKIAotaW1wb3J0IGphdmEubGFuZy5NYXRoOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci0KK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CiAKIC8qKgotICogQGhpZGUKLSAqCi0gKiovCi1wdWJsaWMgY2xhc3MgVmVjdG9yNGYgewotICAgIHB1YmxpYyBWZWN0b3I0ZigpIHsKKyAqIEEgcHVibGljIGNvbnN0cnVjdG9yIHRlc3QgY2FzZSB0aGF0IHNob3VsZCBiZSBsb2FkZWQuCisgKi8KK3B1YmxpYyBjbGFzcyBQdWJsaWNDb25zdHJ1Y3RvclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHVibGljQ29uc3RydWN0b3IoKSB7CiAgICAgfQotCi0gICAgcHVibGljIGZsb2F0IHg7Ci0gICAgcHVibGljIGZsb2F0IHk7Ci0gICAgcHVibGljIGZsb2F0IHo7Ci0gICAgcHVibGljIGZsb2F0IHc7CiB9Ci0KLQotCmRpZmYgLS1naXQgYS90ZXN0cy9Ccm93c2VyVGVzdFBsdWdpbi9qbmkvUGx1Z2luT2JqZWN0LmggYi90ZXN0cy9Ccm93c2VyVGVzdFBsdWdpbi9qbmkvUGx1Z2luT2JqZWN0LmgKaW5kZXggYTA1OGQ0YS4uMDM3MzY3ZSAxMDA2NDQKLS0tIGEvdGVzdHMvQnJvd3NlclRlc3RQbHVnaW4vam5pL1BsdWdpbk9iamVjdC5oCisrKyBiL3Rlc3RzL0Jyb3dzZXJUZXN0UGx1Z2luL2puaS9QbHVnaW5PYmplY3QuaApAQCAtNjUsNyArNjUsNyBAQAogcHVibGljOgogICAgIFN1YlBsdWdpbihOUFAgaW5zdCkgOiBtX2luc3QoaW5zdCkge30KICAgICB2aXJ0dWFsIH5TdWJQbHVnaW4oKSB7fQotICAgIHZpcnR1YWwgaW50MTYgaGFuZGxlRXZlbnQoY29uc3QgQU5QRXZlbnQqIGV2dCkgPSAwOworICAgIHZpcnR1YWwgaW50MTZfdCBoYW5kbGVFdmVudChjb25zdCBBTlBFdmVudCogZXZ0KSA9IDA7CiAKICAgICBOUFAgaW5zdCgpIGNvbnN0IHsgcmV0dXJuIG1faW5zdDsgfQogCmRpZmYgLS1naXQgYS90ZXN0cy9Ccm93c2VyVGVzdFBsdWdpbi9qbmkvZXZlbnQvRXZlbnRQbHVnaW4uY3BwIGIvdGVzdHMvQnJvd3NlclRlc3RQbHVnaW4vam5pL2V2ZW50L0V2ZW50UGx1Z2luLmNwcAppbmRleCAyZWZmMzk0Li45MWYxYjNkIDEwMDY0NAotLS0gYS90ZXN0cy9Ccm93c2VyVGVzdFBsdWdpbi9qbmkvZXZlbnQvRXZlbnRQbHVnaW4uY3BwCisrKyBiL3Rlc3RzL0Jyb3dzZXJUZXN0UGx1Z2luL2puaS9ldmVudC9FdmVudFBsdWdpbi5jcHAKQEAgLTEzOCw3ICsxMzgsNyBAQAogICAgIGJyb3dzZXItPm1lbWZyZWUoYmVnaW5NZW0pOwogfQogCi1pbnQxNiBFdmVudFBsdWdpbjo6aGFuZGxlRXZlbnQoY29uc3QgQU5QRXZlbnQqIGV2dCkgeworaW50MTZfdCBFdmVudFBsdWdpbjo6aGFuZGxlRXZlbnQoY29uc3QgQU5QRXZlbnQqIGV2dCkgewogICAgIHN3aXRjaCAoZXZ0LT5ldmVudFR5cGUpIHsKIAogICAgICAgICBjYXNlIGtEcmF3X0FOUEV2ZW50VHlwZTogewpkaWZmIC0tZ2l0IGEvdGVzdHMvQnJvd3NlclRlc3RQbHVnaW4vam5pL2V2ZW50L0V2ZW50UGx1Z2luLmggYi90ZXN0cy9Ccm93c2VyVGVzdFBsdWdpbi9qbmkvZXZlbnQvRXZlbnRQbHVnaW4uaAppbmRleCA4OGI3YzlkLi4wNDNiZTg1IDEwMDY0NAotLS0gYS90ZXN0cy9Ccm93c2VyVGVzdFBsdWdpbi9qbmkvZXZlbnQvRXZlbnRQbHVnaW4uaAorKysgYi90ZXN0cy9Ccm93c2VyVGVzdFBsdWdpbi9qbmkvZXZlbnQvRXZlbnRQbHVnaW4uaApAQCAtMzIsNyArMzIsNyBAQAogcHVibGljOgogICAgIEV2ZW50UGx1Z2luKE5QUCBpbnN0KTsKICAgICB2aXJ0dWFsIH5FdmVudFBsdWdpbigpOwotICAgIHZpcnR1YWwgaW50MTYgaGFuZGxlRXZlbnQoY29uc3QgQU5QRXZlbnQqIGV2dCk7CisgICAgdmlydHVhbCBpbnQxNl90IGhhbmRsZUV2ZW50KGNvbnN0IEFOUEV2ZW50KiBldnQpOwogCiBwcml2YXRlOgogICAgIHZvaWQgZHJhd1BsdWdpbihjb25zdCBBTlBCaXRtYXAmIGJpdG1hcCwgY29uc3QgQU5QUmVjdEkmIGNsaXApOwpkaWZmIC0tZ2l0IGEvdGVzdHMvQnJvd3NlclRlc3RQbHVnaW4vam5pL21haW4uY3BwIGIvdGVzdHMvQnJvd3NlclRlc3RQbHVnaW4vam5pL21haW4uY3BwCmluZGV4IDQwMmE3ZTIuLjUxMTE4MGMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL0Jyb3dzZXJUZXN0UGx1Z2luL2puaS9tYWluLmNwcAorKysgYi90ZXN0cy9Ccm93c2VyVGVzdFBsdWdpbi9qbmkvbWFpbi5jcHAKQEAgLTM0LDE5ICszNCwxOSBAQAogTlBOZXRzY2FwZUZ1bmNzKiBicm93c2VyOwogI2RlZmluZSBFWFBPUlQgX19hdHRyaWJ1dGVfXygodmlzaWJpbGl0eSgiZGVmYXVsdCIpKSkKIAotTlBFcnJvciBOUFBfTmV3KE5QTUlNRVR5cGUgcGx1Z2luVHlwZSwgTlBQIGluc3RhbmNlLCB1aW50MTYgbW9kZSwgaW50MTYgYXJnYywKK05QRXJyb3IgTlBQX05ldyhOUE1JTUVUeXBlIHBsdWdpblR5cGUsIE5QUCBpbnN0YW5jZSwgdWludDE2X3QgbW9kZSwgaW50MTZfdCBhcmdjLAogICAgICAgICBjaGFyKiBhcmduW10sIGNoYXIqIGFyZ3ZbXSwgTlBTYXZlZERhdGEqIHNhdmVkKTsKIE5QRXJyb3IgTlBQX0Rlc3Ryb3koTlBQIGluc3RhbmNlLCBOUFNhdmVkRGF0YSoqIHNhdmUpOwogTlBFcnJvciBOUFBfU2V0V2luZG93KE5QUCBpbnN0YW5jZSwgTlBXaW5kb3cqIHdpbmRvdyk7CiBOUEVycm9yIE5QUF9OZXdTdHJlYW0oTlBQIGluc3RhbmNlLCBOUE1JTUVUeXBlIHR5cGUsIE5QU3RyZWFtKiBzdHJlYW0sCi0gICAgICAgIE5QQm9vbCBzZWVrYWJsZSwgdWludDE2KiBzdHlwZSk7CisgICAgICAgIE5QQm9vbCBzZWVrYWJsZSwgdWludDE2X3QqIHN0eXBlKTsKIE5QRXJyb3IgTlBQX0Rlc3Ryb3lTdHJlYW0oTlBQIGluc3RhbmNlLCBOUFN0cmVhbSogc3RyZWFtLCBOUFJlYXNvbiByZWFzb24pOwotaW50MzIgICBOUFBfV3JpdGVSZWFkeShOUFAgaW5zdGFuY2UsIE5QU3RyZWFtKiBzdHJlYW0pOwotaW50MzIgICBOUFBfV3JpdGUoTlBQIGluc3RhbmNlLCBOUFN0cmVhbSogc3RyZWFtLCBpbnQzMiBvZmZzZXQsIGludDMyIGxlbiwKK2ludDMyX3QgICBOUFBfV3JpdGVSZWFkeShOUFAgaW5zdGFuY2UsIE5QU3RyZWFtKiBzdHJlYW0pOworaW50MzJfdCAgIE5QUF9Xcml0ZShOUFAgaW5zdGFuY2UsIE5QU3RyZWFtKiBzdHJlYW0sIGludDMyX3Qgb2Zmc2V0LCBpbnQzMl90IGxlbiwKICAgICAgICAgdm9pZCogYnVmZmVyKTsKIHZvaWQgICAgTlBQX1N0cmVhbUFzRmlsZShOUFAgaW5zdGFuY2UsIE5QU3RyZWFtKiBzdHJlYW0sIGNvbnN0IGNoYXIqIGZuYW1lKTsKIHZvaWQgICAgTlBQX1ByaW50KE5QUCBpbnN0YW5jZSwgTlBQcmludCogcGxhdGZvcm1QcmludCk7Ci1pbnQxNiAgIE5QUF9IYW5kbGVFdmVudChOUFAgaW5zdGFuY2UsIHZvaWQqIGV2ZW50KTsKK2ludDE2X3QgICBOUFBfSGFuZGxlRXZlbnQoTlBQIGluc3RhbmNlLCB2b2lkKiBldmVudCk7CiB2b2lkICAgIE5QUF9VUkxOb3RpZnkoTlBQIGluc3RhbmNlLCBjb25zdCBjaGFyKiBVUkwsIE5QUmVhc29uIHJlYXNvbiwKICAgICAgICAgdm9pZCogbm90aWZ5RGF0YSk7CiBOUEVycm9yIE5QUF9HZXRWYWx1ZShOUFAgaW5zdGFuY2UsIE5QUFZhcmlhYmxlIHZhcmlhYmxlLCB2b2lkICp2YWx1ZSk7CkBAIC0xMjksNyArMTI5LDcgQEAKICAgICByZXR1cm4gImFwcGxpY2F0aW9uL3gtYnJvd3NlcnRlc3RwbHVnaW46YnRwOkFuZHJvaWQgQnJvd3NlciBUZXN0IFBsdWdpbiI7CiB9CiAKLU5QRXJyb3IgTlBQX05ldyhOUE1JTUVUeXBlIHBsdWdpblR5cGUsIE5QUCBpbnN0YW5jZSwgdWludDE2IG1vZGUsIGludDE2IGFyZ2MsCitOUEVycm9yIE5QUF9OZXcoTlBNSU1FVHlwZSBwbHVnaW5UeXBlLCBOUFAgaW5zdGFuY2UsIHVpbnQxNl90IG1vZGUsIGludDE2X3QgYXJnYywKICAgICAgICAgICAgICAgICBjaGFyKiBhcmduW10sIGNoYXIqIGFyZ3ZbXSwgTlBTYXZlZERhdGEqIHNhdmVkKQogewogCkBAIC0xODgsNyArMTg4LDcgQEAKICAgICByZXR1cm4gTlBFUlJfTk9fRVJST1I7CiB9CiAKLU5QRXJyb3IgTlBQX05ld1N0cmVhbShOUFAgaW5zdGFuY2UsIE5QTUlNRVR5cGUgdHlwZSwgTlBTdHJlYW0qIHN0cmVhbSwgTlBCb29sIHNlZWthYmxlLCB1aW50MTYqIHN0eXBlKQorTlBFcnJvciBOUFBfTmV3U3RyZWFtKE5QUCBpbnN0YW5jZSwgTlBNSU1FVHlwZSB0eXBlLCBOUFN0cmVhbSogc3RyZWFtLCBOUEJvb2wgc2Vla2FibGUsIHVpbnQxNl90KiBzdHlwZSkKIHsKICAgICAqc3R5cGUgPSBOUF9BU0ZJTEVPTkxZOwogICAgIHJldHVybiBOUEVSUl9OT19FUlJPUjsKQEAgLTE5OSwxMiArMTk5LDEyIEBACiAgICAgcmV0dXJuIE5QRVJSX05PX0VSUk9SOwogfQogCi1pbnQzMiBOUFBfV3JpdGVSZWFkeShOUFAgaW5zdGFuY2UsIE5QU3RyZWFtKiBzdHJlYW0pCitpbnQzMl90IE5QUF9Xcml0ZVJlYWR5KE5QUCBpbnN0YW5jZSwgTlBTdHJlYW0qIHN0cmVhbSkKIHsKICAgICByZXR1cm4gMDsKIH0KIAotaW50MzIgTlBQX1dyaXRlKE5QUCBpbnN0YW5jZSwgTlBTdHJlYW0qIHN0cmVhbSwgaW50MzIgb2Zmc2V0LCBpbnQzMiBsZW4sIHZvaWQqIGJ1ZmZlcikKK2ludDMyX3QgTlBQX1dyaXRlKE5QUCBpbnN0YW5jZSwgTlBTdHJlYW0qIHN0cmVhbSwgaW50MzJfdCBvZmZzZXQsIGludDMyX3QgbGVuLCB2b2lkKiBidWZmZXIpCiB7CiAgICAgcmV0dXJuIDA7CiB9CkBAIC0yMTcsNyArMjE3LDcgQEAKIHsKIH0KIAotaW50MTYgTlBQX0hhbmRsZUV2ZW50KE5QUCBpbnN0YW5jZSwgdm9pZCogZXZlbnQpCitpbnQxNl90IE5QUF9IYW5kbGVFdmVudChOUFAgaW5zdGFuY2UsIHZvaWQqIGV2ZW50KQogewogICAgIFBsdWdpbk9iamVjdCAqb2JqID0gcmVpbnRlcnByZXRfY2FzdDxQbHVnaW5PYmplY3QqPihpbnN0YW5jZS0+cGRhdGEpOwogICAgIGNvbnN0IEFOUEV2ZW50KiBldnQgPSByZWludGVycHJldF9jYXN0PGNvbnN0IEFOUEV2ZW50Kj4oZXZlbnQpOwpkaWZmIC0tZ2l0IGEvdGVzdHMvRHVtcFJlbmRlclRyZWUvYXNzZXRzL3J1bl9sYXlvdXRfdGVzdHMucHkgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZS9hc3NldHMvcnVuX2xheW91dF90ZXN0cy5weQppbmRleCBiNmU3YmYzLi5jZWFjNWQyIDEwMDc1NQotLS0gYS90ZXN0cy9EdW1wUmVuZGVyVHJlZS9hc3NldHMvcnVuX2xheW91dF90ZXN0cy5weQorKysgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZS9hc3NldHMvcnVuX2xheW91dF90ZXN0cy5weQpAQCAtMTc2LDcgKzE3Niw3IEBACiAgICMgQ291bnQgY3Jhc2hlZCB0ZXN0cy4KICAgY3Jhc2hlZF90ZXN0cyA9IFtdCiAKLSAgdGltZW91dF9tcyA9ICczMDAwMCcKKyAgdGltZW91dF9tcyA9ICcxNTAwMCcKICAgaWYgb3B0aW9ucy50aW1lX291dF9tczoKICAgICB0aW1lb3V0X21zID0gb3B0aW9ucy50aW1lX291dF9tcwogCmRpZmYgLS1naXQgYS90ZXN0cy9EdW1wUmVuZGVyVHJlZS9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUvQ2FsbGJhY2tQcm94eS5qYXZhIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlL0NhbGxiYWNrUHJveHkuamF2YQppbmRleCA1NzgwYzQzLi5hNTg3MGY4IDEwMDY0NAotLS0gYS90ZXN0cy9EdW1wUmVuZGVyVHJlZS9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUvQ2FsbGJhY2tQcm94eS5qYXZhCisrKyBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZS9DYWxsYmFja1Byb3h5LmphdmEKQEAgLTc0LDYgKzc0LDggQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTEFZT1VUX1NFVF9DQU5fT1BFTl9XSU5ET1dTID0gNDI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNFVF9HRU9MT0NBVElPTl9QRVJNSVNTSU9OID0gNDM7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE9WRVJSSURFX1BSRUZFUkVOQ0UgPSA0NDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTEFZT1VUX0RVTVBfQ0hJTERfRlJBTUVTX1RFWFQgPSA0NTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0VUX1hTU19BVURJVE9SX0VOQUJMRUQgPSA0NjsKICAgICAKICAgICBDYWxsYmFja1Byb3h5KEV2ZW50U2VuZGVyIGV2ZW50U2VuZGVyLCAKICAgICAgICAgICAgIExheW91dFRlc3RDb250cm9sbGVyIGxheW91dFRlc3RDb250cm9sbGVyKSB7CkBAIC0xNzgsNiArMTgwLDEwIEBACiAgICAgICAgICAgICBtTGF5b3V0VGVzdENvbnRyb2xsZXIuZHVtcEFzVGV4dCgpOwogICAgICAgICAgICAgYnJlYWs7CiAKKyAgICAgICAgY2FzZSBMQVlPVVRfRFVNUF9DSElMRF9GUkFNRVNfVEVYVDoKKyAgICAgICAgICAgIG1MYXlvdXRUZXN0Q29udHJvbGxlci5kdW1wQ2hpbGRGcmFtZXNBc1RleHQoKTsKKyAgICAgICAgICAgIGJyZWFrOworCiAgICAgICAgIGNhc2UgTEFZT1VUX0RVTVBfSElTVE9SWToKICAgICAgICAgICAgIG1MYXlvdXRUZXN0Q29udHJvbGxlci5kdW1wQmFja0ZvcndhcmRMaXN0KCk7CiAgICAgICAgICAgICBicmVhazsKQEAgLTI3Myw2ICsyNzksMTAgQEAKICAgICAgICAgICAgIGJvb2xlYW4gdmFsdWUgPSBtc2cuZ2V0RGF0YSgpLmdldEJvb2xlYW4oInZhbHVlIik7CiAgICAgICAgICAgICBtTGF5b3V0VGVzdENvbnRyb2xsZXIub3ZlcnJpZGVQcmVmZXJlbmNlKGtleSwgdmFsdWUpOwogICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBTRVRfWFNTX0FVRElUT1JfRU5BQkxFRDoKKyAgICAgICAgICAgIG1MYXlvdXRUZXN0Q29udHJvbGxlci5zZXRYU1NBdWRpdG9yRW5hYmxlZChtc2cuYXJnMSA9PSAxKTsKKyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgfQogCkBAIC0zODAsNiArMzkwLDEwIEBACiAgICAgICAgIG9idGFpbk1lc3NhZ2UoTEFZT1VUX0RVTVBfVEVYVCkuc2VuZFRvVGFyZ2V0KCk7CiAgICAgfQogCisgICAgcHVibGljIHZvaWQgZHVtcENoaWxkRnJhbWVzQXNUZXh0KCkgeworICAgICAgICBvYnRhaW5NZXNzYWdlKExBWU9VVF9EVU1QX0NISUxEX0ZSQU1FU19URVhUKS5zZW5kVG9UYXJnZXQoKTsKKyAgICB9CisKICAgICBwdWJsaWMgdm9pZCBkdW1wQmFja0ZvcndhcmRMaXN0KCkgewogICAgICAgICBvYnRhaW5NZXNzYWdlKExBWU9VVF9EVU1QX0hJU1RPUlkpLnNlbmRUb1RhcmdldCgpOwogICAgIH0KQEAgLTQ5OCw0ICs1MTIsOCBAQAogICAgICAgICBtZXNzYWdlLmdldERhdGEoKS5wdXRCb29sZWFuKCJ2YWx1ZSIsIHZhbHVlKTsKICAgICAgICAgbWVzc2FnZS5zZW5kVG9UYXJnZXQoKTsKICAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRYU1NBdWRpdG9yRW5hYmxlZChib29sZWFuIGZsYWcpIHsKKyAgICAgICAgb2J0YWluTWVzc2FnZShTRVRfWFNTX0FVRElUT1JfRU5BQkxFRCwgZmxhZyA/IDEgOiAwLCAwKS5zZW5kVG9UYXJnZXQoKTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS90ZXN0cy9EdW1wUmVuZGVyVHJlZS9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUvRmlsZUZpbHRlci5qYXZhIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlL0ZpbGVGaWx0ZXIuamF2YQppbmRleCA3N2ZkM2VkLi44YmRmNzdjIDEwMDY0NAotLS0gYS90ZXN0cy9EdW1wUmVuZGVyVHJlZS9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUvRmlsZUZpbHRlci5qYXZhCisrKyBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZS9GaWxlRmlsdGVyLmphdmEKQEAgLTczLDMwICs3Myw0MCBAQAogCiAgICAgc3RhdGljIGZpbmFsIFN0cmluZ1tdIGlnbm9yZVRlc3RMaXN0ID0gewogICAgICAgICAiZWRpdGluZy9zZWxlY3Rpb24vbW92ZS1sZWZ0LXJpZ2h0Lmh0bWwiLCAvLyBDYXVzZXMgRHVtcFJlbmRlclRyZWUgdG8gaGFuZworICAgICAgICAiZmFzdC9qcy9leGNlc3NpdmUtY29tbWEtdXNhZ2UuaHRtbCIsIC8vIFRlc3RzIGh1Z2UgaW5pdGlhbGl6ZXIgbGlzdCwgY2F1c2VzIE9PTS4KICAgICAgICAgImZhc3QvanMvcmVnZXhwLWNoYXJjbGFzcy1jcmFzaC5odG1sIiwgLy8gUmVnRXhwIGlzIHRvbyBsYXJnZSwgY2F1c2luZyBPT00KICAgICAgICAgImZhc3QvcmVnZXgvdGVzdDEuaHRtbCIsIC8vIENhdXNlcyBEdW1wUmVuZGVyVHJlZSB0byBoYW5nIHdpdGggVjgKICAgICAgICAgImZhc3QvcmVnZXgvc2xvdy5odG1sIiAvLyBDYXVzZXMgRHVtcFJlbmRlclRyZWUgdG8gaGFuZyB3aXRoIFY4CiAgICAgfTsKIAogICAgIHN0YXRpYyB2b2lkIGZpbGxJZ25vcmVSZXN1bHRMaXN0KCkgewotICAgICAgICAvLyBUaGlzIGZpcnN0IGJsb2NrIG9mIHRlc3RzIGFyZSBmb3IgSFRNTDUgZmVhdHVyZXMsIGZvciB3aGljaCBBbmRyb2lkCisgICAgICAgIC8vIFRoaXMgZmlyc3QgYmxvY2sgb2YgdGVzdHMgYXJlIGZvciBmZWF0dXJlcyBmb3Igd2hpY2ggQW5kcm9pZAogICAgICAgICAvLyBzaG91bGQgcGFzcyBhbGwgdGVzdHMuIFRoZXkgYXJlIHNraXBwZWQgb25seSB0ZW1wb3JhcmlseS4KICAgICAgICAgLy8gVE9ETzogRml4IHRoZXNlIGZhaWxpbmcgdGVzdHMgYW5kIHJlbW92ZSB0aGVtIGZyb20gdGhpcyBsaXN0LgorICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgiZmFzdC9ldmVudHMvdG91Y2gvYmFzaWMtbXVsdGktdG91Y2gtZXZlbnRzLmh0bWwiKTsgLy8gUmVxdWlyZXMgbXVsdGktdG91Y2gKKyAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoImZhc3QvZXZlbnRzL3RvdWNoL3RvdWNoLXRhcmdldC5odG1sIik7IC8vIFJlcXVpcmVzIG11bHRpLXRvdWNoCiAgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJodHRwL3Rlc3RzL2FwcGNhY2hlL2VtcHR5LW1hbmlmZXN0Lmh0bWwiKTsgLy8gZmxha3kKKyAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoImh0dHAvdGVzdHMvYXBwY2FjaGUvZmFsbGJhY2suaHRtbCIpOyAvLyBodHRwOi8vYi9pc3N1ZT9pZD0yNzEzMDA0CiAgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJodHRwL3Rlc3RzL2FwcGNhY2hlL2ZvcmVpZ24taWZyYW1lLW1haW4uaHRtbCIpOyAvLyBmbGFreSAtIHNraXBzIHN0YXRlcwogICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgiaHR0cC90ZXN0cy9hcHBjYWNoZS9tYW5pZmVzdC13aXRoLWVtcHR5LWZpbGUuaHRtbCIpOyAvLyBmbGFreQogICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgic3RvcmFnZS9kYXRhYmFzZS1sb2NrLWFmdGVyLXJlbG9hZC5odG1sIik7IC8vIFN1Y2NlZWRzIGJ1dCBEdW1wUmVuZGVyVHJlZSBkb2VzIG5vdCByZWFkIHJlc3VsdCBjb3JyZWN0bHkKICAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoInN0b3JhZ2UvaGFzaC1jaGFuZ2Utd2l0aC14aHIuaHRtbCIpOyAvLyBTdWNjZWVkcyBidXQgRHVtcFJlbmRlclRyZWUgZG9lcyBub3QgcmVhZCByZXN1bHQgY29ycmVjdGx5CisgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJzdG9yYWdlL29wZW4tZGF0YWJhc2UtY3JlYXRpb24tY2FsbGJhY2staXNvbGF0ZWQtd29ybGQuaHRtbCIpOyAvLyBSZXF1aXJlcyBsYXlvdXRUZXN0Q29udHJvbGxlci5ldmFsdWF0ZVNjcmlwdEluSXNvbGF0ZWRXb3JsZCgpCisgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJzdG9yYWdlL3N0YXRlbWVudC1lcnJvci1jYWxsYmFjay1pc29sYXRlZC13b3JsZC5odG1sIik7IC8vIFJlcXVpcmVzIGxheW91dFRlc3RDb250cm9sbGVyLmV2YWx1YXRlU2NyaXB0SW5Jc29sYXRlZFdvcmxkKCkKKyAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoInN0b3JhZ2Uvc3RhdGVtZW50LXN1Y2Nlc3MtY2FsbGJhY2staXNvbGF0ZWQtd29ybGQuaHRtbCIpOyAvLyBSZXF1aXJlcyBsYXlvdXRUZXN0Q29udHJvbGxlci5ldmFsdWF0ZVNjcmlwdEluSXNvbGF0ZWRXb3JsZCgpCisgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJzdG9yYWdlL3RyYW5zYWN0aW9uLWNhbGxiYWNrLWlzb2xhdGVkLXdvcmxkLmh0bWwiKTsgLy8gUmVxdWlyZXMgbGF5b3V0VGVzdENvbnRyb2xsZXIuZXZhbHVhdGVTY3JpcHRJbklzb2xhdGVkV29ybGQoKQorICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgic3RvcmFnZS90cmFuc2FjdGlvbi1lcnJvci1jYWxsYmFjay1pc29sYXRlZC13b3JsZC5odG1sIik7IC8vIFJlcXVpcmVzIGxheW91dFRlc3RDb250cm9sbGVyLmV2YWx1YXRlU2NyaXB0SW5Jc29sYXRlZFdvcmxkKCkKKyAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoInN0b3JhZ2UvdHJhbnNhY3Rpb24tc3VjY2Vzcy1jYWxsYmFjay1pc29sYXRlZC13b3JsZC5odG1sIik7IC8vIFJlcXVpcmVzIGxheW91dFRlc3RDb250cm9sbGVyLmV2YWx1YXRlU2NyaXB0SW5Jc29sYXRlZFdvcmxkKCkKIAotICAgICAgICAvLyBXaWxsIGFsd2F5cyBmYWlsCi0gICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJkb20vc3ZnL2xldmVsMy94cGF0aCIpOyAvLyBYUGF0aCBub3Qgc3VwcG9ydGVkCisgICAgICAgIC8vIEV4cGVjdGVkIGZhaWx1cmVzIGR1ZSB0byB1bnN1cHBvcnRlZCBmZWF0dXJlcy4KKyAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoImZhc3QvZXZlbnRzL3RvdWNoL3RvdWNoLWNvb3Jkcy1pbi16b29tLWFuZC1zY3JvbGwuaHRtbCIpOyAvLyBSZXF1aXJlcyBldmVudFNlbmRlci56b29tUGFnZUluKCksem9vbVBhZ2VPdXQoKQogICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgiZmFzdC93b3JrZXJzIik7IC8vIHdvcmtlcnMgbm90IHN1cHBvcnRlZAotICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgiZmFzdC94cGF0aCIpOyAvLyBYUGF0aCBub3Qgc3VwcG9ydGVkCiAgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJodHRwL3Rlc3RzL2V2ZW50c291cmNlL3dvcmtlcnMiKTsgLy8gd29ya2VycyBub3Qgc3VwcG9ydGVkCiAgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJodHRwL3Rlc3RzL3dvcmtlcnMiKTsgLy8gd29ya2VycyBub3Qgc3VwcG9ydGVkCiAgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJodHRwL3Rlc3RzL3htbGh0dHByZXF1ZXN0L3dvcmtlcnMiKTsgLy8gd29ya2VycyBub3Qgc3VwcG9ydGVkCiAgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJzdG9yYWdlL2RvbXN0b3JhZ2UvbG9jYWxzdG9yYWdlL3ByaXZhdGUtYnJvd3NpbmctYWZmZWN0cy1zdG9yYWdlLmh0bWwiKTsgLy8gcHJpdmF0ZSBicm93c2luZyBub3Qgc3VwcG9ydGVkCiAgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJzdG9yYWdlL2RvbXN0b3JhZ2Uvc2Vzc2lvbnN0b3JhZ2UvcHJpdmF0ZS1icm93c2luZy1hZmZlY3RzLXN0b3JhZ2UuaHRtbCIpOyAvLyBwcml2YXRlIGJyb3dzaW5nIG5vdCBzdXBwb3J0ZWQKKyAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoInN0b3JhZ2UvaW5kZXhlZGRiIik7IC8vIGluZGV4ZWRkYiBub3Qgc3VwcG9ydGVkCiAgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJzdG9yYWdlL3ByaXZhdGUtYnJvd3NpbmctcmVhZG9ubHkuaHRtbCIpOyAvLyBwcml2YXRlIGJyb3dzaW5nIG5vdCBzdXBwb3J0ZWQKICAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoIndlYnNvY2tldC90ZXN0cy93b3JrZXJzIik7IC8vIHdvcmtlcnMgbm90IHN1cHBvcnRlZAogCkBAIC0xMDQsMTIgKzExNCw5IEBACiAgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJmYXN0L2Nzcy9jYXNlLXRyYW5zZm9ybS5odG1sIik7IC8vIHdpbGwgbm90IGZpeCAjNjE5NzA3CiAgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJmYXN0L2RvbS9FbGVtZW50L29mZnNldExlZnQtb2Zmc2V0VG9wLWJvZHktcXVpcmsuaHRtbCIpOyAvLyBkaWZmZXJlbnQgc2NyZWVuIHNpemUgcmVzdWx0IGluIGV4dHJhIHNwYWNlcyBpbiBBcHBsZSBjb21wYXJlZCB0byB1cwogICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgiZmFzdC9kb20vV2luZG93L1BsdWctaW5zLmh0bWwiKTsgLy8gbmVlZCB0ZXN0IHBsdWdpbgotICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgiZmFzdC9kb20vV2luZG93L3dpbmRvdy1wcm9wZXJ0aWVzLmh0bWwiKTsgLy8geHNsdCBhbmQgeHBhdGggZWxlbWVudHMgbWlzc2luZyBmcm9tIHByb3BlcnR5IGxpc3QKICAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoImZhc3QvZG9tL1dpbmRvdy93aW5kb3ctc2NyZWVuLXByb3BlcnRpZXMuaHRtbCIpOyAvLyBwaXhlbCBkZXB0aAogICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgiZmFzdC9kb20vV2luZG93L3dpbmRvdy14eS1wcm9wZXJ0aWVzLmh0bWwiKTsgLy8gcmVxdWlyZXMgZXZlbnRTZW5kZXIubW91c2VEb3duKCksbW91c2VVcCgpCiAgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJmYXN0L2RvbS9hdHRyaWJ1dGUtbmFtZXNwYWNlcy1nZXQtc2V0Lmh0bWwiKTsgLy8gaHR0cDovL2IvNzMzMjI5Ci0gICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJmYXN0L2RvbS9nYy05Lmh0bWwiKTsgLy8gcmVxdWlyZXMgeHBhdGggc3VwcG9ydAotICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgiZmFzdC9kb20vZ2xvYmFsLWNvbnN0cnVjdG9ycy5odG1sIik7IC8vIHJlcXVpcmVzIHhzbHQgYW5kIHhwYXRoIHN1cHBvcnQKICAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoImZhc3QvZG9tL29iamVjdC1lbWJlZC1wbHVnaW4tc2NyaXB0aW5nLmh0bWwiKTsgLy8gZHluYW1pYyBwbHVnaW5zIG5vdCBzdXBwb3J0ZWQKICAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoImZhc3QvZG9tL3RhYmluZGV4LWNsYW1wLmh0bWwiKTsgLy8gdGhlcmUgaXMgZXh0cmEgc3BhY2luZyBpbiB0aGUgZmlsZSBkdWUgdG8gbXVsdGlwbGUgaW5wdXQgYm94ZXMgZml0dGluZyBvbiBvbmUgbGluZSBvbiBBcHBsZSwgb3VycyBhcmUgd3JhcHBlZC4gU3BhY2UgYXQgbGluZSBlbmRzIGFyZSBzdHJpcHBlZC4KICAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoImZhc3QvZXZlbnRzL2FuY2hvci1pbWFnZS1zY3JvbGxlZC14LXkuaHRtbCIpOyAvLyByZXF1aXJlcyBldmVudFNlbmRlci5tb3VzZURvd24oKSxtb3VzZVVwKCkKQEAgLTE3Miw4ICsxNzksNiBAQAogICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgiZmFzdC9yZXBsYWNlZC9pbWFnZS1tYXAuaHRtbCIpOyAvLyByZXF1aXJlcyBldmVudFNlbmRlci5tb3VzZURvd24oKSxtb3VzZVVwKCkKICAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoImZhc3QvdGV4dC9wbGFpbi10ZXh0LWxpbmUtYnJlYWtzLmh0bWwiKTsgLy8gZXh0cmEgc3BhY2luZyBiZWNhdXNlIGlGcmFtZXMgcmVuZGVyZWQgbmV4dCB0byBlYWNoIG90aGVyIG9uIEFwcGxlCiAgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJwcm9maWxlciIpOyAvLyBwcm9maWxlciBpcyBub3Qgc3VwcG9ydGVkCi0gICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJzdmciKTsgLy8gc3ZnIGlzIG5vdCBzdXBwb3J0ZWQKLQogICAgIH0KIAogfQpkaWZmIC0tZ2l0IGEvdGVzdHMvRHVtcFJlbmRlclRyZWUvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlL0ZzVXRpbHMuamF2YSBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZS9Gc1V0aWxzLmphdmEKaW5kZXggMzIyYjBkMi4uMDg4MzM4NyAxMDA2NDQKLS0tIGEvdGVzdHMvRHVtcFJlbmRlclRyZWUvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlL0ZzVXRpbHMuamF2YQorKysgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZS9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUvRnNVdGlscy5qYXZhCkBAIC00Miw4ICs0MiwxMyBAQAogICAgICAgICAvL25vIGNyZWF0aW9uIG9mIGluc3RhbmNlcwogICAgIH0KIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBmaW5kTGF5b3V0VGVzdHNSZWN1cnNpdmVseShCdWZmZXJlZE91dHB1dFN0cmVhbSBib3MsCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIHRlc3RzIGluIHRoZSBsaXN0LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgaW50IHdyaXRlTGF5b3V0VGVzdExpc3RSZWN1cnNpdmVseShCdWZmZXJlZE91dHB1dFN0cmVhbSBib3MsCiAgICAgICAgICAgICBTdHJpbmcgZGlyLCBib29sZWFuIGlnbm9yZVJlc3VsdHNJbkRpcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworICAgICAgICBpbnQgdGVzdENvdW50ID0gMDsKICAgICAgICAgTG9nLnYoTE9HVEFHLCAiU2VhcmNoaW5nIHRlc3RzIHVuZGVyICIgKyBkaXIpOwogCiAgICAgICAgIEZpbGUgZCA9IG5ldyBGaWxlKGRpcik7CkBAIC02MSw3ICs2Niw3IEBACiAgICAgICAgICAgICAgICAgLy8gSWYgdGhpcyBpcyBub3QgYSB0ZXN0IGRpcmVjdG9yeSwgd2UgZG9uJ3QgcmVjdXJzZSBpbnRvIGl0LgogICAgICAgICAgICAgICAgIGlmICghRmlsZUZpbHRlci5pc05vblRlc3REaXIocykpIHsKICAgICAgICAgICAgICAgICAgICAgTG9nLnYoTE9HVEFHLCAiUmVjdXJzaW5nIG9uICIgKyBzKTsKLSAgICAgICAgICAgICAgICAgICAgZmluZExheW91dFRlc3RzUmVjdXJzaXZlbHkoYm9zLCBzLCBpZ25vcmVSZXN1bHRzSW5EaXIpOworICAgICAgICAgICAgICAgICAgICB0ZXN0Q291bnQgKz0gd3JpdGVMYXlvdXRUZXN0TGlzdFJlY3Vyc2l2ZWx5KGJvcywgcywgaWdub3JlUmVzdWx0c0luRGlyKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9CkBAIC04MSw4ICs4NiwxMCBAQAogICAgICAgICAgICAgICAgICAgICBib3Mud3JpdGUoKCIgSUdOT1JFX1JFU1VMVCIpLmdldEJ5dGVzKCkpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBib3Mud3JpdGUoJ1xuJyk7CisgICAgICAgICAgICAgICAgdGVzdENvdW50Kys7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRlc3RDb3VudDsKICAgICB9CiAKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgdXBkYXRlVGVzdFN0YXR1cyhTdHJpbmcgc3RhdHVzRmlsZSwgU3RyaW5nIHMpIHsKZGlmZiAtLWdpdCBhL3Rlc3RzL0R1bXBSZW5kZXJUcmVlL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZS9MYXlvdXRUZXN0Q29udHJvbGxlci5qYXZhIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlL0xheW91dFRlc3RDb250cm9sbGVyLmphdmEKaW5kZXggOTIzNjM0NS4uODM0NjBiZCAxMDA2NDQKLS0tIGEvdGVzdHMvRHVtcFJlbmRlclRyZWUvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlL0xheW91dFRlc3RDb250cm9sbGVyLmphdmEKKysrIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlL0xheW91dFRlc3RDb250cm9sbGVyLmphdmEKQEAgLTE5LDYgKzE5LDcgQEAKIHB1YmxpYyBpbnRlcmZhY2UgTGF5b3V0VGVzdENvbnRyb2xsZXIgewogCiAJcHVibGljIHZvaWQgZHVtcEFzVGV4dCgpOworCXB1YmxpYyB2b2lkIGR1bXBDaGlsZEZyYW1lc0FzVGV4dCgpOwogCXB1YmxpYyB2b2lkIHdhaXRVbnRpbERvbmUoKTsKIAlwdWJsaWMgdm9pZCBub3RpZnlEb25lKCk7CiAJCkBAIC02Nyw0ICs2OCw3IEBACiAgICAgcHVibGljIHZvaWQgc2V0R2VvbG9jYXRpb25QZXJtaXNzaW9uKGJvb2xlYW4gYWxsb3cpOwogCiAgICAgcHVibGljIHZvaWQgb3ZlcnJpZGVQcmVmZXJlbmNlKFN0cmluZyBrZXksIGJvb2xlYW4gdmFsdWUpOworCisgICAgLy8gRm9yIFhTU0F1ZGl0b3IgdGVzdHMKKyAgICBwdWJsaWMgdm9pZCBzZXRYU1NBdWRpdG9yRW5hYmxlZChib29sZWFuIGZsYWcpOwogfQpkaWZmIC0tZ2l0IGEvdGVzdHMvRHVtcFJlbmRlclRyZWUvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlL0xheW91dFRlc3RzQXV0b1Rlc3QuamF2YSBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZS9MYXlvdXRUZXN0c0F1dG9UZXN0LmphdmEKaW5kZXggMDQyMTU4YS4uZmFiYmY4OSAxMDA2NDQKLS0tIGEvdGVzdHMvRHVtcFJlbmRlclRyZWUvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlL0xheW91dFRlc3RzQXV0b1Rlc3QuamF2YQorKysgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZS9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUvTGF5b3V0VGVzdHNBdXRvVGVzdC5qYXZhCkBAIC0xOCwxMiArMTgsOSBAQAogCiBpbXBvcnQgY29tLmFuZHJvaWQuZHVtcHJlbmRlcnRyZWUuVGVzdFNoZWxsQWN0aXZpdHkuRHVtcERhdGFUeXBlOwogaW1wb3J0IGNvbS5hbmRyb2lkLmR1bXByZW5kZXJ0cmVlLmZvcndhcmRlci5BZGJVdGlsczsKLWltcG9ydCBjb20uYW5kcm9pZC5kdW1wcmVuZGVydHJlZS5mb3J3YXJkZXIuRm9yd2FyZFNlcnZlcjsKIGltcG9ydCBjb20uYW5kcm9pZC5kdW1wcmVuZGVydHJlZS5mb3J3YXJkZXIuRm9yd2FyZFNlcnZpY2U7CiAKLWltcG9ydCBhbmRyb2lkLmFwcC5JbnN0cnVtZW50YXRpb247CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKIGltcG9ydCBhbmRyb2lkLnRlc3QuQWN0aXZpdHlJbnN0cnVtZW50YXRpb25UZXN0Q2FzZTI7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIApAQCAtMTU2LDE4ICsxNTMsMTEgQEAKICAgICBwcml2YXRlIFN0cmluZyBtSnNFbmdpbmU7CiAgICAgcHJpdmF0ZSBTdHJpbmcgbVRlc3RQYXRoUHJlZml4OwogICAgIHByaXZhdGUgYm9vbGVhbiBtRmluaXNoZWQ7CisgICAgcHJpdmF0ZSBpbnQgbVRlc3RDb3VudDsKKyAgICBwcml2YXRlIGludCBtUmVzdW1lSW5kZXg7CiAKICAgICBwdWJsaWMgTGF5b3V0VGVzdHNBdXRvVGVzdCgpIHsKLSAgICAgIHN1cGVyKCJjb20uYW5kcm9pZC5kdW1wcmVuZGVydHJlZSIsIFRlc3RTaGVsbEFjdGl2aXR5LmNsYXNzKTsKLSAgICB9Ci0KLSAgICAvLyBUaGlzIGZ1bmN0aW9uIHdyaXRlcyB0aGUgcmVzdWx0IG9mIHRoZSBsYXlvdXQgdGVzdCB0bwotICAgIC8vIEFtIHN0YXR1cyBzbyB0aGF0IGl0IGNhbiBiZSBwaWNrZWQgdXAgZnJvbSBhIHNjcmlwdC4KLSAgICBwcml2YXRlIHZvaWQgcGFzc09yRmFpbENhbGxiYWNrKFN0cmluZyBmaWxlLCBib29sZWFuIHJlc3VsdCkgewotICAgICAgSW5zdHJ1bWVudGF0aW9uIGluc3QgPSBnZXRJbnN0cnVtZW50YXRpb24oKTsKLSAgICAgIEJ1bmRsZSBidW5kbGUgPSBuZXcgQnVuZGxlKCk7Ci0gICAgICBidW5kbGUucHV0Qm9vbGVhbihmaWxlLCByZXN1bHQpOwotICAgICAgaW5zdC5zZW5kU3RhdHVzKDAsIGJ1bmRsZSk7CisgICAgICBzdXBlcihUZXN0U2hlbGxBY3Rpdml0eS5jbGFzcyk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIGdldFRlc3RMaXN0KCkgewpAQCAtMTg4LDYgKzE3OCw3IEBACiAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICBMb2cuZShMT0dUQUcsICJFcnJvciB3aGlsZSByZWFkaW5nIHRlc3QgbGlzdCA6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CiAgICAgICAgIH0KKyAgICAgICAgbVRlc3RDb3VudCA9IG1UZXN0TGlzdC5zaXplKCk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIHJlc3VtZVRlc3RMaXN0KCkgewpAQCAtMTk4LDYgKzE4OSw3IEBACiAgICAgICAgICAgICAgICAgaWYgKG1UZXN0TGlzdC5lbGVtZW50QXQoaSkuZXF1YWxzKGxpbmUpKSB7CiAgICAgICAgICAgICAgICAgICAgIG1UZXN0TGlzdCA9IG5ldyBWZWN0b3I8U3RyaW5nPihtVGVzdExpc3Quc3ViTGlzdChpKzEsIG1UZXN0TGlzdC5zaXplKCkpKTsKICAgICAgICAgICAgICAgICAgICAgbVRlc3RMaXN0SWdub3JlUmVzdWx0ID0gbmV3IFZlY3RvcjxCb29sZWFuPihtVGVzdExpc3RJZ25vcmVSZXN1bHQuc3ViTGlzdChpKzEsIG1UZXN0TGlzdElnbm9yZVJlc3VsdC5zaXplKCkpKTsKKyAgICAgICAgICAgICAgICAgICAgbVJlc3VtZUluZGV4ID0gaSArIDE7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KQEAgLTI5OCw3ICsyOTAsNyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHJpdmF0ZSB2b2lkIHJ1blRlc3RBbmRXYWl0VW50aWxEb25lKFRlc3RTaGVsbEFjdGl2aXR5IGFjdGl2aXR5LCBTdHJpbmcgdGVzdCwgaW50IHRpbWVvdXQsIGJvb2xlYW4gaWdub3JlUmVzdWx0KSB7CisgICAgcHJpdmF0ZSB2b2lkIHJ1blRlc3RBbmRXYWl0VW50aWxEb25lKFRlc3RTaGVsbEFjdGl2aXR5IGFjdGl2aXR5LCBTdHJpbmcgdGVzdCwgaW50IHRpbWVvdXQsIGJvb2xlYW4gaWdub3JlUmVzdWx0LCBpbnQgdGVzdE51bWJlcikgewogICAgICAgICBhY3Rpdml0eS5zZXRDYWxsYmFjayhuZXcgVGVzdFNoZWxsQ2FsbGJhY2soKSB7CiAgICAgICAgICAgICBwdWJsaWMgdm9pZCBmaW5pc2hlZCgpIHsKICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKExheW91dFRlc3RzQXV0b1Rlc3QudGhpcykgewpAQCAtMzM0LDYgKzMyNiw4IEBACiAgICAgICAgIGludGVudC5wdXRFeHRyYShUZXN0U2hlbGxBY3Rpdml0eS5URVNUX1VSTCwgRnNVdGlscy5nZXRUZXN0VXJsKHRlc3QpKTsKICAgICAgICAgaW50ZW50LnB1dEV4dHJhKFRlc3RTaGVsbEFjdGl2aXR5LlJFU1VMVF9GSUxFLCByZXN1bHRGaWxlKTsKICAgICAgICAgaW50ZW50LnB1dEV4dHJhKFRlc3RTaGVsbEFjdGl2aXR5LlRJTUVPVVRfSU5fTUlMTElTLCB0aW1lb3V0KTsKKyAgICAgICAgaW50ZW50LnB1dEV4dHJhKFRlc3RTaGVsbEFjdGl2aXR5LlRPVEFMX1RFU1RfQ09VTlQsIG1UZXN0Q291bnQpOworICAgICAgICBpbnRlbnQucHV0RXh0cmEoVGVzdFNoZWxsQWN0aXZpdHkuQ1VSUkVOVF9URVNUX05VTUJFUiwgdGVzdE51bWJlcik7CiAgICAgICAgIGFjdGl2aXR5LnN0YXJ0QWN0aXZpdHkoaW50ZW50KTsKIAogICAgICAgICAvLyBXYWl0IHVudGlsIGRvbmUuCkBAIC0zNzMsOCArMzY3LDggQEAKICAgICAgICAgLy8gUmVhZCBzZXR0aW5ncwogICAgICAgICBtVGVzdFBhdGhQcmVmaXggPSAobmV3IEZpbGUoTEFZT1VUX1RFU1RTX1JPT1QgKyBydW5uZXIubVRlc3RQYXRoKSkuZ2V0QWJzb2x1dGVQYXRoKCk7CiAgICAgICAgIG1SZWJhc2VsaW5lUmVzdWx0cyA9IHJ1bm5lci5tUmViYXNlbGluZTsKLSAgICAgICAgLy8gSlNDIGlzIHRoZSBkZWZhdWx0IEphdmFTY3JpcHQgZW5naW5lLgotICAgICAgICBtSnNFbmdpbmUgPSBydW5uZXIubUpzRW5naW5lID09IG51bGwgPyAianNjIiA6IHJ1bm5lci5tSnNFbmdpbmU7CisgICAgICAgIC8vIFY4IGlzIHRoZSBkZWZhdWx0IEphdmFTY3JpcHQgZW5naW5lLgorICAgICAgICBtSnNFbmdpbmUgPSBydW5uZXIubUpzRW5naW5lID09IG51bGwgPyAidjgiIDogcnVubmVyLm1Kc0VuZ2luZTsKIAogICAgICAgICBpbnQgdGltZW91dCA9IHJ1bm5lci5tVGltZW91dEluTWlsbGlzOwogICAgICAgICBpZiAodGltZW91dCA8PSAwKSB7CkBAIC0zOTEsNyArMzg1LDcgQEAKICAgICAgICAgICAgIHJlc3VtZVRlc3RMaXN0KCk7CiAKICAgICAgICAgVGVzdFNoZWxsQWN0aXZpdHkgYWN0aXZpdHkgPSBnZXRBY3Rpdml0eSgpOwotICAgICAgICBhY3Rpdml0eS5zZXREZWZhdWx0RHVtcERhdGFUeXBlKER1bXBEYXRhVHlwZS5EVU1QX0FTX1RFWFQpOworICAgICAgICBhY3Rpdml0eS5zZXREZWZhdWx0RHVtcERhdGFUeXBlKER1bXBEYXRhVHlwZS5FWFRfUkVQUik7CiAKICAgICAgICAgLy8gUnVuIHRlc3RzLgogICAgICAgICBpbnQgYWRkciA9IC0xOwpAQCAtNDA4LDcgKzQwMiw5IEBACiAgICAgICAgICAgICBib29sZWFuIGlnbm9yZVJlc3VsdCA9IG1UZXN0TGlzdElnbm9yZVJlc3VsdC5lbGVtZW50QXQoaSk7CiAgICAgICAgICAgICBGc1V0aWxzLnVwZGF0ZVRlc3RTdGF0dXMoVEVTVF9TVEFUVVNfRklMRSwgcyk7CiAgICAgICAgICAgICAvLyBSdW4gdGVzdHMKLSAgICAgICAgICAgIHJ1blRlc3RBbmRXYWl0VW50aWxEb25lKGFjdGl2aXR5LCBzLCBydW5uZXIubVRpbWVvdXRJbk1pbGxpcywgaWdub3JlUmVzdWx0KTsKKyAgICAgICAgICAgIC8vIGkgaXMgMCBiYXNlZCwgYnV0IHRlc3QgY291bnQgaXMgMSBiYXNlZCBzbyBhZGQgMSB0byBpIGhlcmUuCisgICAgICAgICAgICBydW5UZXN0QW5kV2FpdFVudGlsRG9uZShhY3Rpdml0eSwgcywgcnVubmVyLm1UaW1lb3V0SW5NaWxsaXMsIGlnbm9yZVJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgaSArIDEgKyBtUmVzdW1lSW5kZXgpOwogICAgICAgICB9CiAKICAgICAgICAgRnNVdGlscy51cGRhdGVUZXN0U3RhdHVzKFRFU1RfU1RBVFVTX0ZJTEUsICIjRE9ORSIpOwpAQCAtNDMzLDcgKzQyOSw3IEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBGaWxlIHRlc3RzX2xpc3QgPSBuZXcgRmlsZShMQVlPVVRfVEVTVFNfTElTVF9GSUxFKTsKICAgICAgICAgICAgIEJ1ZmZlcmVkT3V0cHV0U3RyZWFtIGJvcyA9IG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbSh0ZXN0c19saXN0LCBmYWxzZSkpOwotICAgICAgICAgICAgRnNVdGlscy5maW5kTGF5b3V0VGVzdHNSZWN1cnNpdmVseShib3MsIGdldFRlc3RQYXRoKCksIGZhbHNlKTsgLy8gRG9uJ3QgaWdub3JlIHJlc3VsdHMKKyAgICAgICAgICAgIEZzVXRpbHMud3JpdGVMYXlvdXRUZXN0TGlzdFJlY3Vyc2l2ZWx5KGJvcywgZ2V0VGVzdFBhdGgoKSwgZmFsc2UpOyAvLyBEb24ndCBpZ25vcmUgcmVzdWx0cwogICAgICAgICAgICAgYm9zLmZsdXNoKCk7CiAgICAgICAgICAgICBib3MuY2xvc2UoKTsKICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewpkaWZmIC0tZ2l0IGEvdGVzdHMvRHVtcFJlbmRlclRyZWUvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlL01lbnUuamF2YSBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZS9NZW51LmphdmEKaW5kZXggODI2NzFlYi4uNWZmZTZiMCAxMDA2NDQKLS0tIGEvdGVzdHMvRHVtcFJlbmRlclRyZWUvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlL01lbnUuamF2YQorKysgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZS9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUvTWVudS5qYXZhCkBAIC01MSwyOSArNTEsMzggQEAKICAgICAgICAgaW50ZW50LnNldENsYXNzKHRoaXMsIFRlc3RTaGVsbEFjdGl2aXR5LmNsYXNzKTsKICAgICAgICAgaW50ZW50LmFkZEZsYWdzKEludGVudC5GTEFHX0FDVElWSVRZX1NJTkdMRV9UT1ApOwogICAgICAgICBpbnRlbnQucHV0RXh0cmEoVGVzdFNoZWxsQWN0aXZpdHkuVEVTVF9VUkwsICJmaWxlOi8vIiArIGZpbGVuYW1lKTsKKyAgICAgICAgaW50ZW50LnB1dEV4dHJhKFRlc3RTaGVsbEFjdGl2aXR5LlRPVEFMX1RFU1RfQ09VTlQsIDEpOworICAgICAgICBpbnRlbnQucHV0RXh0cmEoVGVzdFNoZWxsQWN0aXZpdHkuQ1VSUkVOVF9URVNUX05VTUJFUiwgMSk7CiAgICAgICAgIHN0YXJ0QWN0aXZpdHkoaW50ZW50KTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKICAgICB2b2lkIHByb2Nlc3NEaXJlY3RvcnkoU3RyaW5nIHBhdGgsIGJvb2xlYW4gc2VsZWN0aW9uKSB7Ci0gICAgICAgIGdlbmVyYXRlVGVzdExpc3QocGF0aCk7CisgICAgICAgIGludCB0ZXN0Q291bnQgPSBnZW5lcmF0ZVRlc3RMaXN0KHBhdGgpOwogICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChJbnRlbnQuQUNUSU9OX1ZJRVcpOwogICAgICAgICBpbnRlbnQuc2V0Q2xhc3ModGhpcywgVGVzdFNoZWxsQWN0aXZpdHkuY2xhc3MpOwogICAgICAgICBpbnRlbnQuYWRkRmxhZ3MoSW50ZW50LkZMQUdfQUNUSVZJVFlfU0lOR0xFX1RPUCk7CiAgICAgICAgIGludGVudC5wdXRFeHRyYShUZXN0U2hlbGxBY3Rpdml0eS5VSV9BVVRPX1RFU1QsIExBWU9VVF9URVNUU19MSVNUX0ZJTEUpOworICAgICAgICBpbnRlbnQucHV0RXh0cmEoVGVzdFNoZWxsQWN0aXZpdHkuVE9UQUxfVEVTVF9DT1VOVCwgdGVzdENvdW50KTsKKyAgICAgICAgLy8gVGVzdFNoZWxsQWN0aXZpdHkgd2lsbCBwcm9jZXNzIHRoaXMgaW50ZW50IG9uY2UgYW5kIGluY3JlbWVudCB0aGUgdGVzdCBpbmRleAorICAgICAgICAvLyBiZWZvcmUgcnVubmluZyB0aGUgZmlyc3QgdGVzdCwgc28gcGFzcyAwIGhlcmUgdG8gYWxsb3cgZm9yIHRoYXQuCisgICAgICAgIGludGVudC5wdXRFeHRyYShUZXN0U2hlbGxBY3Rpdml0eS5DVVJSRU5UX1RFU1RfTlVNQkVSLCAwKTsKICAgICAgICAgc3RhcnRBY3Rpdml0eShpbnRlbnQpOwogICAgIH0KIAotICAgIHByaXZhdGUgdm9pZCBnZW5lcmF0ZVRlc3RMaXN0KFN0cmluZyBwYXRoKSB7CisgICAgcHJpdmF0ZSBpbnQgZ2VuZXJhdGVUZXN0TGlzdChTdHJpbmcgcGF0aCkgeworICAgICAgICBpbnQgdGVzdENvdW50ID0gMDsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIEZpbGUgdGVzdHNfbGlzdCA9IG5ldyBGaWxlKExBWU9VVF9URVNUU19MSVNUX0ZJTEUpOwogICAgICAgICAgICAgQnVmZmVyZWRPdXRwdXRTdHJlYW0gYm9zID0gbmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKHRlc3RzX2xpc3QsIGZhbHNlKSk7Ci0gICAgICAgICAgICBGc1V0aWxzLmZpbmRMYXlvdXRUZXN0c1JlY3Vyc2l2ZWx5KGJvcywgcGF0aCwgZmFsc2UpOyAvLyBEb24ndCBpZ25vcmUgcmVzdWx0cworICAgICAgICAgICAgdGVzdENvdW50ID0gRnNVdGlscy53cml0ZUxheW91dFRlc3RMaXN0UmVjdXJzaXZlbHkoCisgICAgICAgICAgICAgICAgICAgIGJvcywgcGF0aCwgZmFsc2UpOyAvLyBEb24ndCBpZ25vcmUgcmVzdWx0cwogICAgICAgICAgICAgYm9zLmZsdXNoKCk7CiAgICAgICAgICAgICBib3MuY2xvc2UoKTsKICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewogICAgICAgICAgICBMb2cuZShMT0dUQUcsICJFcnJvciB3aGVuIGNyZWF0aW5nIHRlc3QgbGlzdDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKICAgICAgICB9CisgICAgICAgcmV0dXJuIHRlc3RDb3VudDsKICAgICB9CiAKIH0KZGlmZiAtLWdpdCBhL3Rlc3RzL0R1bXBSZW5kZXJUcmVlL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZS9UZXN0U2hlbGxBY3Rpdml0eS5qYXZhIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlL1Rlc3RTaGVsbEFjdGl2aXR5LmphdmEKaW5kZXggODFkNWIwOC4uMGEwNDcxMiAxMDA2NDQKLS0tIGEvdGVzdHMvRHVtcFJlbmRlclRyZWUvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlL1Rlc3RTaGVsbEFjdGl2aXR5LmphdmEKKysrIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlL1Rlc3RTaGVsbEFjdGl2aXR5LmphdmEKQEAgLTM0LDYgKzM0LDggQEAKIGltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOworaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3c7CitpbXBvcnQgYW5kcm9pZC53ZWJraXQuQ29uc29sZU1lc3NhZ2U7CiBpbXBvcnQgYW5kcm9pZC53ZWJraXQuR2VvbG9jYXRpb25QZXJtaXNzaW9uczsKIGltcG9ydCBhbmRyb2lkLndlYmtpdC5IdHRwQXV0aEhhbmRsZXI7CiBpbXBvcnQgYW5kcm9pZC53ZWJraXQuSnNQcm9tcHRSZXN1bHQ7CkBAIC05OCw2ICsxMDAsOCBAQAogICAgICAgICBMb2cudihMT0dUQUcsICJtZXNzYWdlIHNlbnQgdG8gV2ViVmlldyB0byBkdW1wIHRleHQuIik7CiAgICAgICAgIHN3aXRjaCAobUR1bXBEYXRhVHlwZSkgewogICAgICAgICAgICAgY2FzZSBEVU1QX0FTX1RFWFQ6CisgICAgICAgICAgICAgICAgY2FsbGJhY2suYXJnMSA9IG1EdW1wVG9wRnJhbWVBc1RleHQgPyAxIDogMDsKKyAgICAgICAgICAgICAgICBjYWxsYmFjay5hcmcyID0gbUR1bXBDaGlsZEZyYW1lc0FzVGV4dCA/IDEgOiAwOwogICAgICAgICAgICAgICAgIG1XZWJWaWV3LmRvY3VtZW50QXNUZXh0KGNhbGxiYWNrKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgRVhUX1JFUFI6CkBAIC0xMTYsNiArMTIwLDcgQEAKICAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgaWNpY2xlKSB7CiAgICAgICAgIHN1cGVyLm9uQ3JlYXRlKGljaWNsZSk7CisgICAgICAgIHJlcXVlc3RXaW5kb3dGZWF0dXJlKFdpbmRvdy5GRUFUVVJFX1BST0dSRVNTKTsKIAogICAgICAgICBMaW5lYXJMYXlvdXQgY29udGVudFZpZXcgPSBuZXcgTGluZWFyTGF5b3V0KHRoaXMpOwogICAgICAgICBjb250ZW50Vmlldy5zZXRPcmllbnRhdGlvbihMaW5lYXJMYXlvdXQuVkVSVElDQUwpOwpAQCAtMTU4LDYgKzE2Myw5IEBACiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIAorICAgICAgICBtVG90YWxUZXN0Q291bnQgPSBpbnRlbnQuZ2V0SW50RXh0cmEoVE9UQUxfVEVTVF9DT1VOVCwgbVRvdGFsVGVzdENvdW50KTsKKyAgICAgICAgbUN1cnJlbnRUZXN0TnVtYmVyID0gaW50ZW50LmdldEludEV4dHJhKENVUlJFTlRfVEVTVF9OVU1CRVIsIG1DdXJyZW50VGVzdE51bWJlcik7CisKICAgICAgICAgbVRlc3RVcmwgPSBpbnRlbnQuZ2V0U3RyaW5nRXh0cmEoVEVTVF9VUkwpOwogICAgICAgICBpZiAobVRlc3RVcmwgPT0gbnVsbCkgewogICAgICAgICAgICAgbVVpQXV0b1Rlc3RQYXRoID0gaW50ZW50LmdldFN0cmluZ0V4dHJhKFVJX0FVVE9fVEVTVCk7CkBAIC0xNzEsNiArMTc5LDEwIEBACiAgICAgICAgIG1UaW1lb3V0SW5NaWxsaXMgPSBpbnRlbnQuZ2V0SW50RXh0cmEoVElNRU9VVF9JTl9NSUxMSVMsIDApOwogICAgICAgICBtR2V0RHJhd3RpbWUgPSBpbnRlbnQuZ2V0Qm9vbGVhbkV4dHJhKEdFVF9EUkFXX1RJTUUsIGZhbHNlKTsKICAgICAgICAgbVNhdmVJbWFnZVBhdGggPSBpbnRlbnQuZ2V0U3RyaW5nRXh0cmEoU0FWRV9JTUFHRSk7CisgICAgICAgIHNldFRpdGxlKCJUZXN0ICIgKyBtQ3VycmVudFRlc3ROdW1iZXIgKyAiIG9mICIgKyBtVG90YWxUZXN0Q291bnQpOworICAgICAgICBmbG9hdCByYXRpbyA9IChmbG9hdCltQ3VycmVudFRlc3ROdW1iZXIgLyBtVG90YWxUZXN0Q291bnQ7CisgICAgICAgIGludCBwcm9ncmVzcyA9IChpbnQpKHJhdGlvICogV2luZG93LlBST0dSRVNTX0VORCk7CisgICAgICAgIGdldFdpbmRvdygpLnNldEZlYXR1cmVJbnQoV2luZG93LkZFQVRVUkVfUFJPR1JFU1MsIHByb2dyZXNzKTsKIAogICAgICAgICBMb2cudihMT0dUQUcsICIgIExvYWRpbmcgIiArIG1UZXN0VXJsKTsKICAgICAgICAgbVdlYlZpZXcubG9hZFVybChtVGVzdFVybCk7CkBAIC0yMzYsNiArMjQ4LDcgQEAKICAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoSW50ZW50LkFDVElPTl9WSUVXKTsKICAgICAgICAgaW50ZW50LmFkZEZsYWdzKEludGVudC5GTEFHX0FDVElWSVRZX1NJTkdMRV9UT1ApOwogICAgICAgICBpbnRlbnQucHV0RXh0cmEoVGVzdFNoZWxsQWN0aXZpdHkuVEVTVF9VUkwsIEZzVXRpbHMuZ2V0VGVzdFVybCh1cmwpKTsKKyAgICAgICAgaW50ZW50LnB1dEV4dHJhKFRlc3RTaGVsbEFjdGl2aXR5LkNVUlJFTlRfVEVTVF9OVU1CRVIsICsrbUN1cnJlbnRUZXN0TnVtYmVyKTsKICAgICAgICAgaW50ZW50LnB1dEV4dHJhKFRJTUVPVVRfSU5fTUlMTElTLCAxMDAwMCk7CiAgICAgICAgIGV4ZWN1dGVJbnRlbnQoaW50ZW50KTsKICAgICB9CkBAIC0zMzAsMTIgKzM0MywyMiBAQAogICAgIC8vIExheW91dFRlc3RDb250cm9sbGVyIEZ1bmN0aW9ucwogICAgIHB1YmxpYyB2b2lkIGR1bXBBc1RleHQoKSB7CiAgICAgICAgIG1EdW1wRGF0YVR5cGUgPSBEdW1wRGF0YVR5cGUuRFVNUF9BU19URVhUOworICAgICAgICBtRHVtcFRvcEZyYW1lQXNUZXh0ID0gdHJ1ZTsKICAgICAgICAgaWYgKG1XZWJWaWV3ICE9IG51bGwpIHsKICAgICAgICAgICAgIFN0cmluZyB1cmwgPSBtV2ViVmlldy5nZXRVcmwoKTsKICAgICAgICAgICAgIExvZy52KExPR1RBRywgImR1bXBBc1RleHQgY2FsbGVkOiAiK3VybCk7CiAgICAgICAgIH0KICAgICB9CiAKKyAgICBwdWJsaWMgdm9pZCBkdW1wQ2hpbGRGcmFtZXNBc1RleHQoKSB7CisgICAgICAgIG1EdW1wRGF0YVR5cGUgPSBEdW1wRGF0YVR5cGUuRFVNUF9BU19URVhUOworICAgICAgICBtRHVtcENoaWxkRnJhbWVzQXNUZXh0ID0gdHJ1ZTsKKyAgICAgICAgaWYgKG1XZWJWaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgIFN0cmluZyB1cmwgPSBtV2ViVmlldy5nZXRVcmwoKTsKKyAgICAgICAgICAgIExvZy52KExPR1RBRywgImR1bXBDaGlsZEZyYW1lc0FzVGV4dCBjYWxsZWQ6ICIrdXJsKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIHB1YmxpYyB2b2lkIHdhaXRVbnRpbERvbmUoKSB7CiAgICAgICAgIG1XYWl0VW50aWxEb25lID0gdHJ1ZTsKICAgICAgICAgU3RyaW5nIHVybCA9IG1XZWJWaWV3LmdldFVybCgpOwpAQCAtMzQ3LDcgKzM3MCw5IEBACiAgICAgICAgIExvZy52KExPR1RBRywgIm5vdGlmeURvbmUgY2FsbGVkOiAiICsgdXJsKTsKICAgICAgICAgaWYgKG1XYWl0VW50aWxEb25lKSB7CiAgICAgICAgICAgICBtV2FpdFVudGlsRG9uZSA9IGZhbHNlOwotICAgICAgICAgICAgbUNocm9tZUNsaWVudC5vblByb2dyZXNzQ2hhbmdlZChtV2ViVmlldywgMTAxKTsKKyAgICAgICAgICAgIGlmICghbVJlcXVlc3RlZFdlYktpdERhdGEgJiYgIW1UaW1lZE91dCAmJiAhZmluaXNoZWQoKSkgeworICAgICAgICAgICAgICAgIHJlcXVlc3RXZWJLaXREYXRhKCk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTQ3Miw2ICs0OTcsMTAgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIHB1YmxpYyB2b2lkIHNldFhTU0F1ZGl0b3JFbmFibGVkIChib29sZWFuIGZsYWcpIHsKKyAgICAgICAgbVdlYlZpZXcuZ2V0U2V0dGluZ3MoKS5zZXRYU1NBdWRpdG9yRW5hYmxlZChmbGFnKTsKKyAgICB9CisKICAgICBwcml2YXRlIGZpbmFsIFdlYlZpZXdDbGllbnQgbVZpZXdDbGllbnQgPSBuZXcgV2ViVmlld0NsaWVudCgpewogICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIHZvaWQgb25QYWdlRmluaXNoZWQoV2ViVmlldyB2aWV3LCBTdHJpbmcgdXJsKSB7CkBAIC00ODksMTEgKzUxOCwzMCBAQAogICAgICAgICAgICAgICAgICAgICBkcmF3UGFnZVRvRmlsZShtU2F2ZUltYWdlUGF0aCArICIvIiArIG5hbWUgKyAiLnBuZyIsIG1XZWJWaWV3KTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CisKICAgICAgICAgICAgIC8vIENhbGxpbmcgZmluaXNoZWQoKSB3aWxsIGNoZWNrIGlmIHdlJ3ZlIG1ldCBhbGwgdGhlIGNvbmRpdGlvbnMgZm9yIGNvbXBsZXRpbmcKLSAgICAgICAgICAgIC8vIHRoaXMgdGVzdCBhbmQgbW92ZSB0byB0aGUgbmV4dCBvbmUgaWYgd2UgYXJlIHJlYWR5LgorICAgICAgICAgICAgLy8gdGhpcyB0ZXN0IGFuZCBtb3ZlIHRvIHRoZSBuZXh0IG9uZSBpZiB3ZSBhcmUgcmVhZHkuIE90aGVyd2lzZSB3ZSBhc2sgV2ViQ29yZSB0bworICAgICAgICAgICAgLy8gZHVtcCB0aGUgcGFnZS4KICAgICAgICAgICAgIGlmIChmaW5pc2hlZCgpKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIW1XYWl0VW50aWxEb25lICYmICFtUmVxdWVzdGVkV2ViS2l0RGF0YSAmJiAhbVRpbWVkT3V0KSB7CisgICAgICAgICAgICAgICAgcmVxdWVzdFdlYktpdERhdGEoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKG1XYWl0VW50aWxEb25lKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy52KExPR1RBRywgInBhZ2UgZmluaXNoZWQgbG9hZGluZyBidXQgd2FpdGluZyBmb3Igbm90aWZ5RG9uZSB0byBiZSBjYWxsZWQ6ICIgKyB1cmwpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChtUmVxdWVzdGVkV2ViS2l0RGF0YSkgeworICAgICAgICAgICAgICAgICAgICBMb2cudihMT0dUQUcsICJwYWdlIGZpbmlzaGVkIGxvYWRpbmcgYnV0IHdlYmtpdCBkYXRhIGhhcyBhbHJlYWR5IGJlZW4gcmVxdWVzdGVkOiAiICsgdXJsKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobVRpbWVkT3V0KSB7CisgICAgICAgICAgICAgICAgICAgIExvZy52KExPR1RBRywgInBhZ2UgZmluaXNoZWQgbG9hZGluZyBidXQgYWxyZWFkeSB0aW1lZCBvdXQ6ICIgKyB1cmwpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgc3VwZXIub25QYWdlRmluaXNoZWQodmlldywgdXJsKTsKICAgICAgICAgfQogCkBAIC01MzUsNDQgKzU4Myw4IEBACiAKICAgICBwcml2YXRlIGZpbmFsIFdlYkNocm9tZUNsaWVudCBtQ2hyb21lQ2xpZW50ID0gbmV3IFdlYkNocm9tZUNsaWVudCgpIHsKICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUHJvZ3Jlc3NDaGFuZ2VkKFdlYlZpZXcgdmlldywgaW50IG5ld1Byb2dyZXNzKSB7Ci0KLSAgICAgICAgICAgIC8vIG5vdGlmeURvbmUgY2FsbHMgdGhpcyB3aXRoIDEwMSUuIFdlIG9ubHkgd2FudCB0byB1cGRhdGUgdGhpcyBmbGFnIGlmIHRoaXMKLSAgICAgICAgICAgIC8vIGlzIHRoZSByZWFsIGNhbGwgZnJvbSBXZWJDb3JlLgotICAgICAgICAgICAgaWYgKG5ld1Byb2dyZXNzID09IDEwMCkgewotICAgICAgICAgICAgICAgIG1PbmVIdW5kcmVkUGVyY2VudENvbXBsZXRlID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gV2l0aCB0aGUgZmxhZyB1cGRhdGVkLCB3ZSBjYW4gbm93IHByb2NlZWQgYXMgbm9ybWFsIHdoZXRoZXIgdGhlIHByb2dyZXNzIHVwZGF0ZSBjYW1lIGZyb20KLSAgICAgICAgICAgIC8vIFdlYkNvcmUgb3Igbm90aWZ5RG9uZS4KLSAgICAgICAgICAgIGlmIChuZXdQcm9ncmVzcyA+PSAxMDApIHsKLSAgICAgICAgICAgICAgICAvLyBmaW5pc2hlZCgpIHdpbGwgY2hlY2sgaWYgd2UgYXJlIHJlYWR5IHRvIG1vdmUgdG8gdGhlIG5leHQgdGVzdCBhbmQgZG8gc28gaWYgd2UgYXJlLgotICAgICAgICAgICAgICAgIGlmIChmaW5pc2hlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoIW1UaW1lZE91dCAmJiAhbVdhaXRVbnRpbERvbmUgJiYgIW1SZXF1ZXN0ZWRXZWJLaXREYXRhKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyB1cmwgPSBtV2ViVmlldy5nZXRVcmwoKTsKLSAgICAgICAgICAgICAgICAgICAgTG9nLnYoTE9HVEFHLCAiRmluaXNoZWQ6ICIrIHVybCk7Ci0gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RXZWJLaXREYXRhKCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHVybCA9IG1XZWJWaWV3LmdldFVybCgpOwotICAgICAgICAgICAgICAgICAgICBpZiAobVRpbWVkT3V0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cudihMT0dUQUcsICJUaW1lZCBvdXQgYmVmb3JlIGZpbmlzaGluZzogIiArIHVybCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobVdhaXRVbnRpbERvbmUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy52KExPR1RBRywgIldhaXRpbmcgZm9yIG5vdGlmeURvbmU6ICIgKyB1cmwpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1SZXF1ZXN0ZWRXZWJLaXREYXRhKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cudihMT0dUQUcsICJSZXF1ZXN0ZWQgd2Via2l0IGRhdGEgcmVhZHk6ICIgKyB1cmwpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVjZWl2ZWRUaXRsZShXZWJWaWV3IHZpZXcsIFN0cmluZyB0aXRsZSkgewotICAgICAgICAgICAgaWYgKHRpdGxlLmxlbmd0aCgpID4gMzApCi0gICAgICAgICAgICAgICAgdGl0bGUgPSAiLi4uIit0aXRsZS5zdWJzdHJpbmcodGl0bGUubGVuZ3RoKCktMzApOwotICAgICAgICAgICAgc2V0VGl0bGUodGl0bGUpOworICAgICAgICAgICAgc2V0VGl0bGUoIlRlc3QgIiArIG1DdXJyZW50VGVzdE51bWJlciArICIgb2YgIiArIG1Ub3RhbFRlc3RDb3VudCArICI6ICIrIHRpdGxlKTsKICAgICAgICAgICAgIGlmIChtRHVtcFRpdGxlQ2hhbmdlcykgewogICAgICAgICAgICAgICAgIG1UaXRsZUNoYW5nZXMuYXBwZW5kKCJUSVRMRSBDSEFOR0VEOiAiKTsKICAgICAgICAgICAgICAgICBtVGl0bGVDaGFuZ2VzLmFwcGVuZCh0aXRsZSk7CkBAIC02NzUsMTUgKzY4NywyOCBAQAogICAgICAgICB9CiAKICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uQ29uc29sZU1lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UsIGludCBsaW5lTnVtYmVyLAotICAgICAgICAgICAgICAgIFN0cmluZyBzb3VyY2VJRCkgeworICAgICAgICBwdWJsaWMgYm9vbGVhbiBvbkNvbnNvbGVNZXNzYWdlKENvbnNvbGVNZXNzYWdlIGNvbnNvbGVNZXNzYWdlKSB7CisgICAgICAgICAgICBTdHJpbmcgbXNnID0gIkNPTlNPTEUgTUVTU0FHRTogbGluZSAiICsgY29uc29sZU1lc3NhZ2UubGluZU51bWJlcigpICsgIjogIgorICAgICAgICAgICAgICAgICAgICArIGNvbnNvbGVNZXNzYWdlLm1lc3NhZ2UoKSArICJcbiI7CiAgICAgICAgICAgICBpZiAobUNvbnNvbGVNZXNzYWdlcyA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgbUNvbnNvbGVNZXNzYWdlcyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFN0cmluZyBjb25zb2xlTWVzc2FnZSA9ICJDT05TT0xFIE1FU1NBR0U6IGxpbmUgIgotICAgICAgICAgICAgICAgICAgICArIGxpbmVOdW1iZXIgKyI6ICIrIG1lc3NhZ2UgKyJcbiI7Ci0gICAgICAgICAgICBtQ29uc29sZU1lc3NhZ2VzLmFwcGVuZChjb25zb2xlTWVzc2FnZSk7Ci0gICAgICAgICAgICBMb2cudihMT0dUQUcsICJMT0c6ICIrY29uc29sZU1lc3NhZ2UpOworICAgICAgICAgICAgbUNvbnNvbGVNZXNzYWdlcy5hcHBlbmQobXNnKTsKKyAgICAgICAgICAgIExvZy52KExPR1RBRywgIkxPRzogIiArIG1zZyk7CisgICAgICAgICAgICAvLyB0aGUgcmF0aW9uYWxlIGhlcmUgaXMgdGhhdCBpZiB0aGVyZSdzIGFuIGVycm9yIG9mIGVpdGhlciB0eXBlLCBhbmQgdGhlIHRlc3Qgd2FzCisgICAgICAgICAgICAvLyB3YWl0aW5nIGZvciAibm90aWZ5RG9uZSIgc2lnbmFsIHRvIGZpbmlzaCwgdGhlbiB0aGVyZSdzIG5vIHBvaW50IGluIHdhaXRpbmcKKyAgICAgICAgICAgIC8vIGFueW1vcmUgYmVjYXVzZSB0aGUgSlMgZXhlY3V0aW9uIGlzIGFscmVhZHkgdGVybWluYXRlZCBhdCB0aGlzIHBvaW50IGFuZCBhCisgICAgICAgICAgICAvLyAibm90aWZ5RG9uZSIgd2lsbCBuZXZlciBjb21lIG91dCBzbyBpdCdzIGp1c3Qgd2FzdGluZyB0aW1lIHRpbGwgdGltZW91dCBraWNrcyBpbgorICAgICAgICAgICAgaWYgKG1zZy5jb250YWlucygiVW5jYXVnaHQgUmVmZXJlbmNlRXJyb3I6IikgfHwgbXNnLmNvbnRhaW5zKCJVbmNhdWdodCBUeXBlRXJyb3I6IikKKyAgICAgICAgICAgICAgICAgICAgJiYgbVdhaXRVbnRpbERvbmUpIHsKKyAgICAgICAgICAgICAgICBMb2cudyhMT0dUQUcsICJUZXJtaW5hdGluZyB0ZXN0IGNhc2Ugb24gdW5jYXVnaHQgUmVmZXJlbmNlRXJyb3Igb3IgVHlwZUVycm9yLiIpOworICAgICAgICAgICAgICAgIG1IYW5kbGVyLnBvc3REZWxheWVkKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5RG9uZSgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSwgNTAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAKICAgICAgICAgQE92ZXJyaWRlCkBAIC03MjksNiArNzU0LDggQEAKICAgICBwcml2YXRlIHZvaWQgcmVzZXRUZXN0U3RhdHVzKCkgewogICAgICAgICBtV2FpdFVudGlsRG9uZSA9IGZhbHNlOwogICAgICAgICBtRHVtcERhdGFUeXBlID0gbURlZmF1bHREdW1wRGF0YVR5cGU7CisgICAgICAgIG1EdW1wVG9wRnJhbWVBc1RleHQgPSBmYWxzZTsKKyAgICAgICAgbUR1bXBDaGlsZEZyYW1lc0FzVGV4dCA9IGZhbHNlOwogICAgICAgICBtVGltZWRPdXQgPSBmYWxzZTsKICAgICAgICAgbUR1bXBUaXRsZUNoYW5nZXMgPSBmYWxzZTsKICAgICAgICAgbVJlcXVlc3RlZFdlYktpdERhdGEgPSBmYWxzZTsKQEAgLTczOCwxMCArNzY1LDEwIEBACiAgICAgICAgIG1FdmVudFNlbmRlci5jbGVhclRvdWNoUG9pbnRzKCk7CiAgICAgICAgIG1FdmVudFNlbmRlci5jbGVhclRvdWNoTWV0YVN0YXRlKCk7CiAgICAgICAgIG1QYWdlRmluaXNoZWQgPSBmYWxzZTsKLSAgICAgICAgbU9uZUh1bmRyZWRQZXJjZW50Q29tcGxldGUgPSBmYWxzZTsKICAgICAgICAgbUR1bXBXZWJLaXREYXRhID0gZmFsc2U7CiAgICAgICAgIG1HZXREcmF3dGltZSA9IGZhbHNlOwogICAgICAgICBtU2F2ZUltYWdlUGF0aCA9IG51bGw7CisgICAgICAgIHNldERlZmF1bHRXZWJTZXR0aW5ncyhtV2ViVmlldyk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSBsb25nW10gZ2V0RHJhd1dlYlZpZXdUaW1lKFdlYlZpZXcgdmlldywgaW50IGNvdW50KSB7CkBAIC03NzgsNyArODA1LDcgQEAKICAgICB9CiAKICAgICBwcml2YXRlIGJvb2xlYW4gY2FuTW92ZVRvTmV4dFRlc3QoKSB7Ci0gICAgICAgIHJldHVybiAobUR1bXBXZWJLaXREYXRhICYmIG1PbmVIdW5kcmVkUGVyY2VudENvbXBsZXRlICYmIG1QYWdlRmluaXNoZWQgJiYgIW1XYWl0VW50aWxEb25lKSB8fCBtVGltZWRPdXQ7CisgICAgICAgIHJldHVybiAobUR1bXBXZWJLaXREYXRhICYmIG1QYWdlRmluaXNoZWQgJiYgIW1XYWl0VW50aWxEb25lKSB8fCBtVGltZWRPdXQ7CiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIHNldHVwV2ViVmlld0ZvckxheW91dFRlc3RzKFdlYlZpZXcgd2VidmlldywgQ2FsbGJhY2tQcm94eSBjYWxsYmFja1Byb3h5KSB7CkBAIC03ODYsNiArODEzLDE5IEBACiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIAorICAgICAgICBzZXREZWZhdWx0V2ViU2V0dGluZ3Mod2Vidmlldyk7CisKKyAgICAgICAgd2Vidmlldy5zZXRXZWJDaHJvbWVDbGllbnQobUNocm9tZUNsaWVudCk7CisgICAgICAgIHdlYnZpZXcuc2V0V2ViVmlld0NsaWVudChtVmlld0NsaWVudCk7CisgICAgICAgIC8vIFNldHRpbmcgYSB0b3VjaCBpbnRlcnZhbCBvZiAtMSBlZmZlY3RpdmVseSBkaXNhYmxlcyB0aGUgb3B0aW1pc2F0aW9uIGluIFdlYlZpZXcKKyAgICAgICAgLy8gdGhhdCBzdG9wcyByZXBlYXRlZCB0b3VjaCBldmVudHMgZmxvb2RpbmcgV2ViQ29yZS4gVGhlIEV2ZW50IFNlbmRlciBvbmx5IHNlbmRzIGEKKyAgICAgICAgLy8gc2luZ2xlIGV2ZW50IHJhdGhlciB0aGFuIGEgc3RyZWFtIG9mIGV2ZW50cyAobGlrZSB3aGF0IHdvdWxkIGdlbmVyYWxseSBoYXBwZW4gaW4KKyAgICAgICAgLy8gYSByZWFsIHVzZSBvZiB0b3VjaCBldmVudHMgaW4gYSBXZWJWaWV3KSAgYW5kIHNvIGlmIHRoZSBXZWJWaWV3IGRyb3BzIHRoZSBldmVudCwKKyAgICAgICAgLy8gdGhlIHRlc3Qgd2lsbCBmYWlsIGFzIHRoZSB0ZXN0IGV4cGVjdHMgb25lIGNhbGxiYWNrIGZvciBldmVyeSB0b3VjaCBpdCBzeW50aGVzaXplcy4KKyAgICAgICAgd2Vidmlldy5zZXRUb3VjaEludGVydmFsKC0xKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXREZWZhdWx0V2ViU2V0dGluZ3MoV2ViVmlldyB3ZWJ2aWV3KSB7CiAgICAgICAgIFdlYlNldHRpbmdzIHNldHRpbmdzID0gd2Vidmlldy5nZXRTZXR0aW5ncygpOwogICAgICAgICBzZXR0aW5ncy5zZXRBcHBDYWNoZUVuYWJsZWQodHJ1ZSk7CiAgICAgICAgIHNldHRpbmdzLnNldEFwcENhY2hlUGF0aChnZXRBcHBsaWNhdGlvbkNvbnRleHQoKS5nZXRDYWNoZURpcigpLmdldFBhdGgoKSk7CkBAIC03OTgsMTUgKzgzOCw3IEBACiAgICAgICAgIHNldHRpbmdzLnNldERhdGFiYXNlUGF0aChnZXREaXIoImRhdGFiYXNlcyIsMCkuZ2V0QWJzb2x1dGVQYXRoKCkpOwogICAgICAgICBzZXR0aW5ncy5zZXREb21TdG9yYWdlRW5hYmxlZCh0cnVlKTsKICAgICAgICAgc2V0dGluZ3Muc2V0V29ya2Vyc0VuYWJsZWQoZmFsc2UpOwotCi0gICAgICAgIHdlYnZpZXcuc2V0V2ViQ2hyb21lQ2xpZW50KG1DaHJvbWVDbGllbnQpOwotICAgICAgICB3ZWJ2aWV3LnNldFdlYlZpZXdDbGllbnQobVZpZXdDbGllbnQpOwotICAgICAgICAvLyBTZXR0aW5nIGEgdG91Y2ggaW50ZXJ2YWwgb2YgLTEgZWZmZWN0aXZlbHkgZGlzYWJsZXMgdGhlIG9wdGltaXNhdGlvbiBpbiBXZWJWaWV3Ci0gICAgICAgIC8vIHRoYXQgc3RvcHMgcmVwZWF0ZWQgdG91Y2ggZXZlbnRzIGZsb29kaW5nIFdlYkNvcmUuIFRoZSBFdmVudCBTZW5kZXIgb25seSBzZW5kcyBhCi0gICAgICAgIC8vIHNpbmdsZSBldmVudCByYXRoZXIgdGhhbiBhIHN0cmVhbSBvZiBldmVudHMgKGxpa2Ugd2hhdCB3b3VsZCBnZW5lcmFsbHkgaGFwcGVuIGluCi0gICAgICAgIC8vIGEgcmVhbCB1c2Ugb2YgdG91Y2ggZXZlbnRzIGluIGEgV2ViVmlldykgIGFuZCBzbyBpZiB0aGUgV2ViVmlldyBkcm9wcyB0aGUgZXZlbnQsCi0gICAgICAgIC8vIHRoZSB0ZXN0IHdpbGwgZmFpbCBhcyB0aGUgdGVzdCBleHBlY3RzIG9uZSBjYWxsYmFjayBmb3IgZXZlcnkgdG91Y2ggaXQgc3ludGhlc2l6ZXMuCi0gICAgICAgIHdlYnZpZXcuc2V0VG91Y2hJbnRlcnZhbCgtMSk7CisgICAgICAgIHNldHRpbmdzLnNldFhTU0F1ZGl0b3JFbmFibGVkKGZhbHNlKTsKICAgICB9CiAKICAgICBwcml2YXRlIFdlYlZpZXcgbVdlYlZpZXc7CkBAIC04MjMsNiArODU1LDggQEAKICAgICBwcml2YXRlIFN0cmluZyBtU2F2ZUltYWdlUGF0aDsKICAgICBwcml2YXRlIEJ1ZmZlcmVkUmVhZGVyIG1UZXN0TGlzdFJlYWRlcjsKICAgICBwcml2YXRlIGJvb2xlYW4gbUdldERyYXd0aW1lOworICAgIHByaXZhdGUgaW50IG1Ub3RhbFRlc3RDb3VudDsKKyAgICBwcml2YXRlIGludCBtQ3VycmVudFRlc3ROdW1iZXI7CiAKICAgICAvLyBTdGF0ZXMKICAgICBwcml2YXRlIGJvb2xlYW4gbVRpbWVkT3V0OwpAQCAtODMyLDYgKzg2Niw4IEBACiAgICAgLy8gTGF5b3V0IHRlc3QgY29udHJvbGxlciB2YXJpYWJsZXMuCiAgICAgcHJpdmF0ZSBEdW1wRGF0YVR5cGUgbUR1bXBEYXRhVHlwZTsKICAgICBwcml2YXRlIER1bXBEYXRhVHlwZSBtRGVmYXVsdER1bXBEYXRhVHlwZSA9IER1bXBEYXRhVHlwZS5FWFRfUkVQUjsKKyAgICBwcml2YXRlIGJvb2xlYW4gbUR1bXBUb3BGcmFtZUFzVGV4dDsKKyAgICBwcml2YXRlIGJvb2xlYW4gbUR1bXBDaGlsZEZyYW1lc0FzVGV4dDsKICAgICBwcml2YXRlIGJvb2xlYW4gbVdhaXRVbnRpbERvbmU7CiAgICAgcHJpdmF0ZSBib29sZWFuIG1EdW1wVGl0bGVDaGFuZ2VzOwogICAgIHByaXZhdGUgU3RyaW5nQnVmZmVyIG1UaXRsZUNoYW5nZXM7CkBAIC04NDUsNyArODgxLDYgQEAKIAogICAgIHByaXZhdGUgYm9vbGVhbiBtUGFnZUZpbmlzaGVkID0gZmFsc2U7CiAgICAgcHJpdmF0ZSBib29sZWFuIG1EdW1wV2ViS2l0RGF0YSA9IGZhbHNlOwotICAgIHByaXZhdGUgYm9vbGVhbiBtT25lSHVuZHJlZFBlcmNlbnRDb21wbGV0ZSA9IGZhbHNlOwogCiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBUSU1FT1VUX1NUUiA9ICIqKlRlc3QgdGltZW91dCI7CiAKQEAgLTg2MCw2ICs4OTUsOCBAQAogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgVUlfQVVUT19URVNUID0gIlVpQXV0b1Rlc3QiOwogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VUX0RSQVdfVElNRSA9ICJHZXREcmF3VGltZSI7CiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBTQVZFX0lNQUdFID0gIlNhdmVJbWFnZSI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBUT1RBTF9URVNUX0NPVU5UID0gIlRlc3RDb3VudCI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVJSRU5UX1RFU1RfTlVNQkVSID0gIlRlc3ROdW1iZXIiOwogCiAgICAgc3RhdGljIGZpbmFsIGludCBEUkFXX1JVTlMgPSA1OwogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFJBV19USU1FX0xPRyA9ICIvc2RjYXJkL2FuZHJvaWQvcGFnZV9kcmF3X3RpbWUudHh0IjsKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9GaWxtL0FuZHJvaWQubWsgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvQW5kcm9pZC5tawpzaW1pbGFyaXR5IGluZGV4IDcwJQpjb3B5IGZyb20gbGlicy9ycy9qYXZhL0ZpbG0vQW5kcm9pZC5tawpjb3B5IHRvIHRlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9BbmRyb2lkLm1rCmluZGV4IDllNmVkN2UuLmQ0NzQzZjkgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvamF2YS9GaWxtL0FuZHJvaWQubWsKKysrIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L0FuZHJvaWQubWsKQEAgLTEsNSArMSw1IEBACiAjCi0jIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CiAjCiAjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCkBAIC0xNCwxNCArMTQsMTMgQEAKICMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLUxPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQogaW5jbHVkZSAkKENMRUFSX1ZBUlMpCiAKLUxPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCitMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1zdWJkaXItamF2YS1maWxlcykKIAotTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKQotI0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLnJlbmRlcnNjcmlwdAorTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEh3QWNjZWxlcmF0aW9uVGVzdAogCi1MT0NBTF9QQUNLQUdFX05BTUUgOj0gRmlsbQorTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKIAogaW5jbHVkZSAkKEJVSUxEX1BBQ0tBR0UpCmRpZmYgLS1naXQgYS90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9BbmRyb2lkTWFuaWZlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmZjBiMmMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMCwwICsxLDMyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICAKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBwYWNrYWdlPSJjb20uZ29vZ2xlLmFuZHJvaWQudGVzdC5od3VpIj4KKworICAgIDxhcHBsaWNhdGlvbgorICAgICAgICBhbmRyb2lkOmxhYmVsPSJId1VpIgorICAgICAgICBhbmRyb2lkOmhhcmR3YXJlQWNjZWxlcmF0ZWQ9InRydWUiPgorCisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ikh3VWlBY3Rpdml0eSI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisKKyAgICA8L2FwcGxpY2F0aW9uPgorPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2dvb2dsZS9hbmRyb2lkL3Rlc3QvaHd1aS9Id1VpQWN0aXZpdHkuamF2YSBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2dvb2dsZS9hbmRyb2lkL3Rlc3QvaHd1aS9Id1VpQWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NWUzOTk3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vZ29vZ2xlL2FuZHJvaWQvdGVzdC9od3VpL0h3VWlBY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsMTQxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZ29vZ2xlLmFuZHJvaWQudGVzdC5od3VpOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludDsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5HcmF2aXR5OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uQWxwaGFBbmltYXRpb247CitpbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BbmltYXRpb247CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuRnJhbWVMYXlvdXQ7CisKK0BTdXBwcmVzc1dhcm5pbmdzKHsiVW51c2VkRGVjbGFyYXRpb24ifSkKK3B1YmxpYyBjbGFzcyBId1VpQWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19UQUcgPSAiSHdVaSI7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisKKyAgICAgICAgRGlydHlCaXRtYXBWaWV3IGNvbnRhaW5lciA9IG5ldyBEaXJ0eUJpdG1hcFZpZXcodGhpcyk7CisKKyAgICAgICAgQ29sb3JWaWV3IGNvbG9yID0gbmV3IENvbG9yVmlldyh0aGlzKTsKKyAgICAgICAgY29udGFpbmVyLmFkZFZpZXcoY29sb3IsIG5ldyBEaXJ0eUJpdG1hcFZpZXcuTGF5b3V0UGFyYW1zKAorICAgICAgICAgICAgICAgIGRpcFRvUHgodGhpcywgMTAwKSwgZGlwVG9QeCh0aGlzLCAxMDApLCBHcmF2aXR5LkNFTlRFUikpOworCisgICAgICAgIEFscGhhQW5pbWF0aW9uIGEgPSBuZXcgQWxwaGFBbmltYXRpb24oMS4wZiwgMC4wZik7CisgICAgICAgIGEuc2V0RHVyYXRpb24oMjAwMCk7CisgICAgICAgIGEuc2V0UmVwZWF0Q291bnQoQW5pbWF0aW9uLklORklOSVRFKTsKKyAgICAgICAgYS5zZXRSZXBlYXRNb2RlKEFuaW1hdGlvbi5SRVZFUlNFKTsKKyAgICAgICAgY29sb3Iuc3RhcnRBbmltYXRpb24oYSk7CisKKyAgICAgICAgc2V0Q29udGVudFZpZXcoY29udGFpbmVyKTsKKyAgICB9CisgICAgCisgICAgQFN1cHByZXNzV2FybmluZ3MoeyJVbnVzZWREZWNsYXJhdGlvbiJ9KQorICAgIHN0YXRpYyBpbnQgZGlwVG9QeChDb250ZXh0IGMsIGludCBkaXApIHsKKyAgICAgICAgcmV0dXJuIChpbnQpIChjLmdldFJlc291cmNlcygpLmdldERpc3BsYXlNZXRyaWNzKCkuZGVuc2l0eSAqIGRpcCArIDAuNWYpOworICAgIH0KKworICAgIHN0YXRpYyBjbGFzcyBDb2xvclZpZXcgZXh0ZW5kcyBWaWV3IHsKKyAgICAgICAgQ29sb3JWaWV3KENvbnRleHQgYykgeworICAgICAgICAgICAgc3VwZXIoYyk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25EcmF3KENhbnZhcyBjYW52YXMpIHsKKyAgICAgICAgICAgIHN1cGVyLm9uRHJhdyhjYW52YXMpOworICAgICAgICAgICAgY2FudmFzLmRyYXdSR0IoMCwgMjU1LCAwKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXRpYyBjbGFzcyBEaXJ0eUJpdG1hcFZpZXcgZXh0ZW5kcyBGcmFtZUxheW91dCB7CisgICAgICAgIHByaXZhdGUgZmluYWwgUGFpbnQgbVBhaW50OworCisgICAgICAgIERpcnR5Qml0bWFwVmlldyhDb250ZXh0IGMpIHsKKyAgICAgICAgICAgIHN1cGVyKGMpOworICAgICAgICAgICAgbVBhaW50ID0gbmV3IFBhaW50KCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZGlzcGF0Y2hEcmF3KENhbnZhcyBjYW52YXMpIHsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3UkdCKDI1NSwgMjU1LCAyNTUpOworCisgICAgICAgICAgICBtUGFpbnQuc2V0Q29sb3IoMHhmZmZmMDAwMCk7CisgICAgICAgICAgICBjYW52YXMuZHJhd1JlY3QoMjAwLjBmLCAwLjBmLCAyMjAuMGYsIDIwLjBmLCBtUGFpbnQpOworCisgICAgICAgICAgICBjYW52YXMuc2F2ZSgpOworICAgICAgICAgICAgY2FudmFzLmNsaXBSZWN0KDIwLjBmLCAwLjBmLCA0MC4wZiwgMjAuMGYpOworICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgImNsaXBSZWN0ID0gIiArIGNhbnZhcy5nZXRDbGlwQm91bmRzKCkpOworICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgInJlamVjdGVkID0gIiArIGNhbnZhcy5xdWlja1JlamVjdCgxMDAuMGYsIDEwMC4wZiwgMTEwLjBmLCAxMTAuMGYsCisgICAgICAgICAgICAgICAgICAgIENhbnZhcy5FZGdlVHlwZS5CVykpOworICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgInJlamVjdGVkID0gIiArIGNhbnZhcy5xdWlja1JlamVjdCgyNS4wZiwgNS4wZiwgMzAuMGYsIDEwLjBmLAorICAgICAgICAgICAgICAgICAgICBDYW52YXMuRWRnZVR5cGUuQlcpKTsKKyAgICAgICAgICAgIGNhbnZhcy5yZXN0b3JlKCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGNhbnZhcy5zYXZlKCk7CisgICAgICAgICAgICBjYW52YXMuc2NhbGUoMi4wZiwgMi4wZik7CisgICAgICAgICAgICBjYW52YXMuY2xpcFJlY3QoMjAuMGYsIDAuMGYsIDQwLjBmLCAyMC4wZik7CisgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiY2xpcFJlY3QgPSAiICsgY2FudmFzLmdldENsaXBCb3VuZHMoKSk7CisgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAicmVqZWN0ZWQgPSAiICsgY2FudmFzLnF1aWNrUmVqZWN0KDUwLjBmLCA1MC4wZiwgNjAuMGYsIDYwLjBmLAorICAgICAgICAgICAgICAgICAgICBDYW52YXMuRWRnZVR5cGUuQlcpKTsKKyAgICAgICAgICAgIExvZy5kKExPR19UQUcsICJyZWplY3RlZCA9ICIgKyBjYW52YXMucXVpY2tSZWplY3QoMjUuMGYsIDUuMGYsIDMwLjBmLCAxMC4wZiwKKyAgICAgICAgICAgICAgICAgICAgQ2FudmFzLkVkZ2VUeXBlLkJXKSk7CisgICAgICAgICAgICBjYW52YXMucmVzdG9yZSgpOworCisgICAgICAgICAgICBjYW52YXMuc2F2ZSgpOworICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgyMC4wZiwgMjAuMGYpOworICAgICAgICAgICAgY2FudmFzLmNsaXBSZWN0KDIwLjBmLCAwLjBmLCA0MC4wZiwgMjAuMGYpOworICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgImNsaXBSZWN0ID0gIiArIGNhbnZhcy5nZXRDbGlwQm91bmRzKCkpOworICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgInJlamVjdGVkID0gIiArIGNhbnZhcy5xdWlja1JlamVjdCg4MC4wZiwgODAuMGYsIDkwLjBmLCA5MC4wZiwKKyAgICAgICAgICAgICAgICAgICAgQ2FudmFzLkVkZ2VUeXBlLkJXKSk7CisgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAicmVqZWN0ZWQgPSAiICsgY2FudmFzLnF1aWNrUmVqZWN0KDI1LjBmLCA1LjBmLCAzMC4wZiwgMTAuMGYsCisgICAgICAgICAgICAgICAgICAgIENhbnZhcy5FZGdlVHlwZS5CVykpOworICAgICAgICAgICAgY2FudmFzLnJlc3RvcmUoKTsKKworICAgICAgICAgICAgY2FudmFzLnNhdmUoKTsKKyAgICAgICAgICAgIGNhbnZhcy5zY2FsZSgyLjBmLCAyLjBmKTsgICAgICAgICAgICAKKyAgICAgICAgICAgIGNhbnZhcy5jbGlwUmVjdCgyMC4wZiwgMC4wZiwgNDAuMGYsIDIwLjBmKTsKKworICAgICAgICAgICAgbVBhaW50LnNldENvbG9yKDB4ZmYwMGZmMDApOworICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KDAuMGYsIDAuMGYsIDIwLjBmLCAyMC4wZiwgbVBhaW50KTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgbVBhaW50LnNldENvbG9yKDB4ZmYwMDAwZmYpOworICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KDIwLjBmLCAwLjBmLCA0MC4wZiwgMjAuMGYsIG1QYWludCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGNhbnZhcy5yZXN0b3JlKCk7CisKKyAgICAgICAgICAgIGZpbmFsIGludCByZXN0b3JlVG8gPSBjYW52YXMuc2F2ZSgpOworICAgICAgICAgICAgY2FudmFzLnNhdmVMYXllckFscGhhKDAuMGYsIDEwMC4wZiwgZ2V0V2lkdGgoKSwgMTUwLjBmLCAxMjcsCisgICAgICAgICAgICAgICAgICAgIENhbnZhcy5IQVNfQUxQSEFfTEFZRVJfU0FWRV9GTEFHIHwgQ2FudmFzLkNMSVBfVE9fTEFZRVJfU0FWRV9GTEFHKTsKKyAgICAgICAgICAgIG1QYWludC5zZXRDb2xvcigweGZmMDAwMGZmKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3UmVjdCgwLjBmLCAxMDAuMGYsIDQwLjBmLCAxNTAuMGYsIG1QYWludCk7CisgICAgICAgICAgICBtUGFpbnQuc2V0Q29sb3IoMHhmZjAwZmZmZik7CisgICAgICAgICAgICBjYW52YXMuZHJhd1JlY3QoNDAuMGYsIDEwMC4wZiwgMTQwLjBmLCAxNTAuMGYsIG1QYWludCk7CisgICAgICAgICAgICBtUGFpbnQuc2V0Q29sb3IoMHhmZmZmMDBmZik7CisgICAgICAgICAgICBjYW52YXMuZHJhd1JlY3QoMTQwLjBmLCAxMDAuMGYsIDI0MC4wZiwgMTUwLjBmLCBtUGFpbnQpOworICAgICAgICAgICAgY2FudmFzLnJlc3RvcmVUb0NvdW50KHJlc3RvcmVUbyk7CisKKyAgICAgICAgICAgIHN1cGVyLmRpc3BhdGNoRHJhdyhjYW52YXMpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWFwdC9Db21tYW5kLmNwcCBiL3Rvb2xzL2FhcHQvQ29tbWFuZC5jcHAKaW5kZXggODMwNTdiOC4uYzQwYWY4MCAxMDA2NDQKLS0tIGEvdG9vbHMvYWFwdC9Db21tYW5kLmNwcAorKysgYi90b29scy9hYXB0L0NvbW1hbmQuY3BwCkBAIC0xOTcsOCArMTk3LDEwIEBACiAgICAgICAgIGlmICgmcmVzID09IE5VTEwpIHsKICAgICAgICAgICAgIHByaW50ZigiXG5ObyByZXNvdXJjZSB0YWJsZSBmb3VuZC5cbiIpOwogICAgICAgICB9IGVsc2UgeworI2lmbmRlZiBIQVZFX0FORFJPSURfT1MKICAgICAgICAgICAgIHByaW50ZigiXG5SZXNvdXJjZSB0YWJsZTpcbiIpOwogICAgICAgICAgICAgcmVzLnByaW50KGZhbHNlKTsKKyNlbmRpZgogICAgICAgICB9CiAKICAgICAgICAgQXNzZXQqIG1hbmlmZXN0QXNzZXQgPSBhc3NldHMub3Blbk5vbkFzc2V0KCJBbmRyb2lkTWFuaWZlc3QueG1sIiwKQEAgLTM4OCw4ICszOTAsOSBAQAogICAgIH0KIAogICAgIGlmIChzdHJjbXAoInJlc291cmNlcyIsIG9wdGlvbikgPT0gMCkgeworI2lmbmRlZiBIQVZFX0FORFJPSURfT1MKICAgICAgICAgcmVzLnByaW50KGJ1bmRsZS0+Z2V0VmFsdWVzKCkpOwotCisjZW5kaWYKICAgICB9IGVsc2UgaWYgKHN0cmNtcCgieG1sdHJlZSIsIG9wdGlvbikgPT0gMCkgewogICAgICAgICBpZiAoYnVuZGxlLT5nZXRGaWxlU3BlY0NvdW50KCkgPCAzKSB7CiAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVSUk9SOiBubyBkdW1wIHhtbHRyZWUgcmVzb3VyY2UgZmlsZSBzcGVjaWZpZWRcbiIpOwpkaWZmIC0tZ2l0IGEvdG9vbHMvYWFwdC9QYWNrYWdlLmNwcCBiL3Rvb2xzL2FhcHQvUGFja2FnZS5jcHAKaW5kZXggOTk5YTVjZi4uM2NiNjE0ZiAxMDA2NDQKLS0tIGEvdG9vbHMvYWFwdC9QYWNrYWdlLmNwcAorKysgYi90b29scy9hYXB0L1BhY2thZ2UuY3BwCkBAIC00NDEsNyArNDQxLDcgQEAKIAogc3NpemVfdCBwcm9jZXNzSmFyRmlsZXMoQnVuZGxlKiBidW5kbGUsIFppcEZpbGUqIHppcCkKIHsKLSAgICBzc2l6ZV90IGVycjsKKyAgICBzdGF0dXNfdCBlcnI7CiAgICAgc3NpemVfdCBjb3VudCA9IDA7CiAgICAgY29uc3QgYW5kcm9pZDo6VmVjdG9yPGNvbnN0IGNoYXIqPiYgamFycyA9IGJ1bmRsZS0+Z2V0SmFyRmlsZXMoKTsKIApkaWZmIC0tZ2l0IGEvdG9vbHMvYWFwdC9SZXNvdXJjZS5jcHAgYi90b29scy9hYXB0L1Jlc291cmNlLmNwcAppbmRleCBjYWZkNjM1Li41ODU1YjU2IDEwMDY0NAotLS0gYS90b29scy9hYXB0L1Jlc291cmNlLmNwcAorKysgYi90b29scy9hYXB0L1Jlc291cmNlLmNwcApAQCAtNTQyLDExICs1NDIsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHRLZXllZFZlY3RvcjxBYXB0R3JvdXBFbnRyeSwgc3A8QWFwdEZpbGU+ID4gYmFzZUZpbGVzID0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZUdyb3VwLT5nZXRGaWxlcygpOwogICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaT0wOyBpIDwgYmFzZUZpbGVzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJiYXNlRmlsZSAlbGQgaGFzIGZsYXZvciAlc1xuIiwgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoImJhc2VGaWxlICVkIGhhcyBmbGF2b3IgJXNcbiIsIGksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlRmlsZXMua2V5QXQoaSkudG9TdHJpbmcoKS5zdHJpbmcoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpPTA7IGkgPCBvdmVybGF5RmlsZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIm92ZXJsYXlGaWxlICVsZCBoYXMgZmxhdm9yICVzXG4iLCBpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50Zigib3ZlcmxheUZpbGUgJWQgaGFzIGZsYXZvciAlc1xuIiwgaSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJsYXlGaWxlcy5rZXlBdChpKS50b1N0cmluZygpLnN0cmluZygpKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQpAQCAtNTYwLDcgKzU2MCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleUF0KG92ZXJsYXlHcm91cEluZGV4KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZihiYXNlRmlsZUluZGV4IDwgVU5LTk9XTl9FUlJPUikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChidW5kbGUtPmdldFZlcmJvc2UoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoImZvdW5kIGEgbWF0Y2ggKCVsZCkgZm9yIG92ZXJsYXkgZmlsZSAlcywgZm9yIGZsYXZvciAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJmb3VuZCBhIG1hdGNoICglZCkgZm9yIG92ZXJsYXkgZmlsZSAlcywgZm9yIGZsYXZvciAlc1xuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlRmlsZUluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJsYXlHcm91cC0+Z2V0TGVhZigpLnN0cmluZygpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJsYXlGaWxlcy5rZXlBdChvdmVybGF5R3JvdXBJbmRleCkudG9TdHJpbmcoKS5zdHJpbmcoKSk7CmRpZmYgLS1naXQgYS90b29scy9hYXB0L1Jlc291cmNlVGFibGUuY3BwIGIvdG9vbHMvYWFwdC9SZXNvdXJjZVRhYmxlLmNwcAppbmRleCA3NTViOTNiLi5mNDBhODc3IDEwMDY0NAotLS0gYS90b29scy9hYXB0L1Jlc291cmNlVGFibGUuY3BwCisrKyBiL3Rvb2xzL2FhcHQvUmVzb3VyY2VUYWJsZS5jcHAKQEAgLTIzNjYsNyArMjM2Niw3IEBACiAgICAgICAgIGlmIChjb25maWdTZXQuY291bnQoZGVmYXVsdExvY2FsZSkgPT0gMCkgewogICAgICAgICAgICAgZnByaW50ZihzdGRvdXQsICJhYXB0OiB3YXJuaW5nOiBzdHJpbmcgJyVzJyBoYXMgbm8gZGVmYXVsdCB0cmFuc2xhdGlvbiBpbiAlczsgZm91bmQ6IiwKICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOChuYW1lSXRlci0+Zmlyc3QpLnN0cmluZygpLCBtQnVuZGxlLT5nZXRSZXNvdXJjZVNvdXJjZURpcnMoKVswXSk7Ci0gICAgICAgICAgICBmb3IgKHNldDxTdHJpbmc4Pjo6aXRlcmF0b3IgbG9jYWxlcyA9IGNvbmZpZ1NldC5iZWdpbigpOworICAgICAgICAgICAgZm9yIChzZXQ8U3RyaW5nOD46OmNvbnN0X2l0ZXJhdG9yIGxvY2FsZXMgPSBjb25maWdTZXQuYmVnaW4oKTsKICAgICAgICAgICAgICAgICAgbG9jYWxlcyAhPSBjb25maWdTZXQuZW5kKCk7CiAgICAgICAgICAgICAgICAgIGxvY2FsZXMrKykgewogICAgICAgICAgICAgICAgIGZwcmludGYoc3Rkb3V0LCAiICVzIiwgKCpsb2NhbGVzKS5zdHJpbmcoKSk7CmRpZmYgLS1naXQgYS90b29scy9hYXB0L1N0cmluZ1Bvb2wuY3BwIGIvdG9vbHMvYWFwdC9TdHJpbmdQb29sLmNwcAppbmRleCBhMDljZWMwLi5lMjhiZGZmIDEwMDY0NAotLS0gYS90b29scy9hYXB0L1N0cmluZ1Bvb2wuY3BwCisrKyBiL3Rvb2xzL2FhcHQvU3RyaW5nUG9vbC5jcHAKQEAgLTMwLDcgKzMwLDcgQEAKICAgICAgICAgICAgIHN0ciA9IFN0cmluZzgocG9vbC0+c3RyaW5nQXQocywgJmxlbikpLnN0cmluZygpOwogICAgICAgICB9CiAKLSAgICAgICAgcHJpbnRmKCJTdHJpbmcgIyVsZDogJXNcbiIsIHMsIHN0cik7CisgICAgICAgIHByaW50ZigiU3RyaW5nICMlZDogJXNcbiIsIHMsIHN0cik7CiAgICAgfQogfQogCmRpZmYgLS1naXQgYS90b29scy9hYXB0L1hNTE5vZGUuY3BwIGIvdG9vbHMvYWFwdC9YTUxOb2RlLmNwcAppbmRleCA1N2ZmNDdhLi40NTI1NDliIDEwMDY0NAotLS0gYS90b29scy9hYXB0L1hNTE5vZGUuY3BwCisrKyBiL3Rvb2xzL2FhcHQvWE1MTm9kZS5jcHAKQEAgLTIwMyw5ICsyMDMsMTMgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoeGxpZmZEZXB0aCA9PSAwICYmIHBzZXVkb2xvY2FsaXplKSB7CisjaWZkZWYgRU5BQkxFX1BTRVVET0xPQ0FMSVpFCiAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgb3JpZyhTdHJpbmc4KHRleHQpLnN0cmluZygpKTsKICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwc2V1ZG8gPSBwc2V1ZG9sb2NhbGl6ZV9zdHJpbmcob3JpZyk7CiAgICAgICAgICAgICAgICAgY3VyU3RyaW5nLmFwcGVuZChTdHJpbmcxNihTdHJpbmc4KHBzZXVkby5jX3N0cigpKSkpOworI2Vsc2UKKyAgICAgICAgICAgICAgICBhc3NlcnQoZmFsc2UpOworI2VuZGlmCiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGlmIChpc0Zvcm1hdHRlZCAmJiBoYXNTdWJzdGl0dXRpb25FcnJvcnMoZmlsZU5hbWUsIGluWG1sLCB0ZXh0KSAhPSBOT19FUlJPUikgewogICAgICAgICAgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKZGlmZiAtLWdpdCBhL3Rvb2xzL2FhcHQvWmlwRmlsZS5oIGIvdG9vbHMvYWFwdC9aaXBGaWxlLmgKaW5kZXggZGJiZDA3Mi4uNzg3NzU1MCAxMDA2NDQKLS0tIGEvdG9vbHMvYWFwdC9aaXBGaWxlLmgKKysrIGIvdG9vbHMvYWFwdC9aaXBGaWxlLmgKQEAgLTU3LDcgKzU3LDcgQEAKICAgICAvKgogICAgICAqIE9wZW4gYSBuZXcgb3IgZXhpc3RpbmcgYXJjaGl2ZS4KICAgICAgKi8KLSAgICB0eXBlZGVmIGVudW0geworICAgIGVudW0gewogICAgICAgICBrT3BlblJlYWRPbmx5ICAgPSAweDAxLAogICAgICAgICBrT3BlblJlYWRXcml0ZSAgPSAweDAyLAogICAgICAgICBrT3BlbkNyZWF0ZSAgICAgPSAweDA0LCAgICAgLy8gY3JlYXRlIGlmIGl0IGRvZXNuJ3QgZXhpc3QKZGlmZiAtLWdpdCBhL3Rvb2xzL2xheW91dGxpYi9SRUFETUUgYi90b29scy9sYXlvdXRsaWIvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmZWE5YmQKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9sYXlvdXRsaWIvUkVBRE1FCkBAIC0wLDAgKzEsNCBAQAorTGF5b3V0bGliIGlzIGEgY3VzdG9tIHZlcnNpb24gb2YgdGhlIGFuZHJvaWQgVmlldyBmcmFtZXdvcmsgZGVzaWduZWQgdG8gcnVuIGluc2lkZSBFY2xpcHNlLgorVGhlIGdvYWwgb2YgdGhlIGxpYnJhcnkgaXMgdG8gcHJvdmlkZSBsYXlvdXQgcmVuZGVyaW5nIGluIEVjbGlwc2UgdGhhdCBhcmUgdmVyeSB2ZXJ5IGNsb3NlIHRvIHRoZWlyIHJlbmRlcmluZyBvbiBkZXZpY2VzLgorCitOb25lIG9mIHRoZSBjb20uYW5kcm9pZC4qIG9yIGFuZHJvaWQuKiBjbGFzc2VzIGluIGxheW91dGxpYiBydW4gb24gZGV2aWNlcy4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90b29scy9sYXlvdXRsaWIvYnJpZGdlL3NyYy9jb20vYW5kcm9pZC9sYXlvdXRsaWIvYnJpZGdlL0JyaWRnZUNvbnRleHQuamF2YSBiL3Rvb2xzL2xheW91dGxpYi9icmlkZ2Uvc3JjL2NvbS9hbmRyb2lkL2xheW91dGxpYi9icmlkZ2UvQnJpZGdlQ29udGV4dC5qYXZhCmluZGV4IDc0NGJmYmUuLjU4YjFiNmMgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2xheW91dGxpYi9icmlkZ2Uvc3JjL2NvbS9hbmRyb2lkL2xheW91dGxpYi9icmlkZ2UvQnJpZGdlQ29udGV4dC5qYXZhCisrKyBiL3Rvb2xzL2xheW91dGxpYi9icmlkZ2Uvc3JjL2NvbS9hbmRyb2lkL2xheW91dGxpYi9icmlkZ2UvQnJpZGdlQ29udGV4dC5qYXZhCkBAIC0zNyw2ICszNyw3IEBACiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5UeXBlZEFycmF5OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzLlRoZW1lOworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuRGF0YWJhc2VFcnJvckhhbmRsZXI7CiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2U7CiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2UuQ3Vyc29yRmFjdG9yeTsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKQEAgLTEwNTksNiArMTA2MCwxMyBAQAogICAgIH0KIAogICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTUUxpdGVEYXRhYmFzZSBvcGVuT3JDcmVhdGVEYXRhYmFzZShTdHJpbmcgYXJnMCwgaW50IGFyZzEsCisgICAgICAgICAgICBDdXJzb3JGYWN0b3J5IGFyZzIsIERhdGFiYXNlRXJyb3JIYW5kbGVyIGFyZzMpIHsKKyAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgRHJhd2FibGUgcGVla1dhbGxwYXBlcigpIHsKICAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgogICAgICAgICByZXR1cm4gbnVsbDsKZGlmZiAtLWdpdCBhL3dpZmkvamF2YS9hbmRyb2lkL25ldC93aWZpL1dpZmlOYXRpdmUuamF2YSBiL3dpZmkvamF2YS9hbmRyb2lkL25ldC93aWZpL1dpZmlOYXRpdmUuamF2YQppbmRleCBlMDhmODU3Li43YTMyODJjIDEwMDY0NAotLS0gYS93aWZpL2phdmEvYW5kcm9pZC9uZXQvd2lmaS9XaWZpTmF0aXZlLmphdmEKKysrIGIvd2lmaS9qYXZhL2FuZHJvaWQvbmV0L3dpZmkvV2lmaU5hdGl2ZS5qYXZhCkBAIC0xNiw2ICsxNiw4IEBACiAKIHBhY2thZ2UgYW5kcm9pZC5uZXQud2lmaTsKIAoraW1wb3J0IGFuZHJvaWQubmV0LkRoY3BJbmZvOworCiAvKioKICAqIE5hdGl2ZSBjYWxscyBmb3Igc2VuZGluZyByZXF1ZXN0cyB0byB0aGUgc3VwcGxpY2FudCBkYWVtb24sIGFuZCBmb3IKICAqIHJlY2VpdmluZyBhc3luY2hyb25vdXMgZXZlbnRzLiBBbGwgbWV0aG9kcyBvZiB0aGUgZm9ybSAieHh4eENvbW1hbmQoKSIKQEAgLTE0Myw2ICsxNDUsMTAgQEAKIAogICAgIHB1YmxpYyBuYXRpdmUgc3RhdGljIGJvb2xlYW4gY2xlYXJCbGFja2xpc3RDb21tYW5kKCk7CiAKKyAgICBwdWJsaWMgbmF0aXZlIHN0YXRpYyBib29sZWFuIGRvRGhjcFJlcXVlc3QoRGhjcEluZm8gcmVzdWx0cyk7CisKKyAgICBwdWJsaWMgbmF0aXZlIHN0YXRpYyBTdHJpbmcgZ2V0RGhjcEVycm9yKCk7CisKICAgICAvKioKICAgICAgKiBXYWl0IGZvciB0aGUgc3VwcGxpY2FudCB0byBzZW5kIGFuIGV2ZW50LCByZXR1cm5pbmcgdGhlIGV2ZW50IHN0cmluZy4KICAgICAgKiBAcmV0dXJuIHRoZSBldmVudCBzdHJpbmcgc2VudCBieSB0aGUgc3VwcGxpY2FudC4KZGlmZiAtLWdpdCBhL3dpZmkvamF2YS9hbmRyb2lkL25ldC93aWZpL1dpZmlTdGF0ZVRyYWNrZXIuamF2YSBiL3dpZmkvamF2YS9hbmRyb2lkL25ldC93aWZpL1dpZmlTdGF0ZVRyYWNrZXIuamF2YQppbmRleCA5OWYzZDA2Li41YjRmYWY5NyAxMDA2NDQKLS0tIGEvd2lmaS9qYXZhL2FuZHJvaWQvbmV0L3dpZmkvV2lmaVN0YXRlVHJhY2tlci5qYXZhCisrKyBiL3dpZmkvamF2YS9hbmRyb2lkL25ldC93aWZpL1dpZmlTdGF0ZVRyYWNrZXIuamF2YQpAQCAtNjYsNyArNjYsNyBAQAogICoKICAqIEBoaWRlCiAgKi8KLXB1YmxpYyBjbGFzcyBXaWZpU3RhdGVUcmFja2VyIGV4dGVuZHMgTmV0d29ya1N0YXRlVHJhY2tlciB7CitwdWJsaWMgY2xhc3MgV2lmaVN0YXRlVHJhY2tlciBleHRlbmRzIEhhbmRsZXIgaW1wbGVtZW50cyBOZXR3b3JrU3RhdGVUcmFja2VyIHsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gTE9DQUxfTE9HRCA9IENvbmZpZy5MT0dEIHx8IGZhbHNlOwogICAgIApAQCAtMTk3LDYgKzE5Nyw4IEBACiAgICAgcHJpdmF0ZSBib29sZWFuIG1IYXZlSXBBZGRyZXNzOwogICAgIHByaXZhdGUgYm9vbGVhbiBtT2J0YWluaW5nSXBBZGRyZXNzOwogICAgIHByaXZhdGUgYm9vbGVhbiBtVG9ybkRvd25CeUNvbm5NZ3I7CisgICAgcHJpdmF0ZSBOZXR3b3JrSW5mbyBtTmV0d29ya0luZm87CisgICAgcHJpdmF0ZSBib29sZWFuIG1UZWFyZG93blJlcXVlc3RlZCA9IGZhbHNlOwogICAgIC8qKgogICAgICAqIEEgRElTQ09OTkVDVCBldmVudCBoYXMgYmVlbiByZWNlaXZlZCwgYnV0IHByb2Nlc3NpbmcgaXQKICAgICAgKiBpcyBiZWluZyBkZWZlcnJlZC4KQEAgLTMxNCw3ICszMTYsMTEgQEAKICAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgTFMgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIik7CiAKICAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSBzRG5zUHJvcE5hbWVzOwotICAgIHByaXZhdGUgUnVubmFibGUgbVJlbGVhc2VXYWtlTG9ja0NhbGxiYWNrOworICAgIHByaXZhdGUgSGFuZGxlciBtVGFyZ2V0OworICAgIHByaXZhdGUgQ29udGV4dCBtQ29udGV4dDsKKyAgICBwcml2YXRlIGJvb2xlYW4gbVByaXZhdGVEbnNSb3V0ZVNldCA9IGZhbHNlOworICAgIHByaXZhdGUgaW50IG1EZWZhdWx0R2F0ZXdheUFkZHIgPSAwOworICAgIHByaXZhdGUgYm9vbGVhbiBtRGVmYXVsdFJvdXRlU2V0ID0gZmFsc2U7CiAKICAgICAvKioKICAgICAgKiBBIHN0cnVjdHVyZSBmb3Igc3VwcGx5aW5nIGluZm9ybWF0aW9uIGFib3V0IGEgc3VwcGxpY2FudCBzdGF0ZQpAQCAtMzUwLDggKzM1Niw5IEBACiAgICAgfQogCiAgICAgcHVibGljIFdpZmlTdGF0ZVRyYWNrZXIoQ29udGV4dCBjb250ZXh0LCBIYW5kbGVyIHRhcmdldCkgewotICAgICAgICBzdXBlcihjb250ZXh0LCB0YXJnZXQsIENvbm5lY3Rpdml0eU1hbmFnZXIuVFlQRV9XSUZJLCAwLCAiV0lGSSIsICIiKTsKLSAgICAgICAgCisgICAgICAgIG1UYXJnZXQgPSB0YXJnZXQ7CisgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKKyAgICAgICAgbU5ldHdvcmtJbmZvID0gbmV3IE5ldHdvcmtJbmZvKENvbm5lY3Rpdml0eU1hbmFnZXIuVFlQRV9XSUZJLCAwLCAiV0lGSSIsICIiKTsKICAgICAgICAgbVdpZmlJbmZvID0gbmV3IFdpZmlJbmZvKCk7CiAgICAgICAgIG1XaWZpTW9uaXRvciA9IG5ldyBXaWZpTW9uaXRvcih0aGlzKTsKICAgICAgICAgbUhhdmVJcEFkZHJlc3MgPSBmYWxzZTsKQEAgLTM3Miw5ICszNzksOSBAQAogICAgICAgICBtU2V0dGluZ3NPYnNlcnZlciA9IG5ldyBTZXR0aW5nc09ic2VydmVyKG5ldyBIYW5kbGVyKCkpOwogCiAgICAgICAgIG1JbnRlcmZhY2VOYW1lID0gU3lzdGVtUHJvcGVydGllcy5nZXQoIndpZmkuaW50ZXJmYWNlIiwgInRpd2xhbjAiKTsKLSAgICAgICAgbURuc1Byb3BOYW1lcyA9IG5ldyBTdHJpbmdbXSB7Ci0gICAgICAgICAgICAibmV0LiIgKyBtSW50ZXJmYWNlTmFtZSArICIuZG5zMSIsCi0gICAgICAgICAgICAibmV0LiIgKyBtSW50ZXJmYWNlTmFtZSArICIuZG5zMiIKKyAgICAgICAgc0Ruc1Byb3BOYW1lcyA9IG5ldyBTdHJpbmdbXSB7CisgICAgICAgICAgICAiZGhjcC4iICsgbUludGVyZmFjZU5hbWUgKyAiLmRuczEiLAorICAgICAgICAgICAgImRoY3AuIiArIG1JbnRlcmZhY2VOYW1lICsgIi5kbnMyIgogICAgICAgICB9OwogICAgICAgICBtQmF0dGVyeVN0YXRzID0gSUJhdHRlcnlTdGF0cy5TdHViLmFzSW50ZXJmYWNlKFNlcnZpY2VNYW5hZ2VyLmdldFNlcnZpY2UoImJhdHRlcnlpbmZvIikpOwogCkBAIC00MDcsNiArNDE0LDU3IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogUmVjb3JkIHRoZSBkZXRhaWxlZCBzdGF0ZSBvZiBhIG5ldHdvcmssIGFuZCBpZiBpdCBpcyBhCisgICAgICogY2hhbmdlIGZyb20gdGhlIHByZXZpb3VzIHN0YXRlLCBzZW5kIGEgbm90aWZpY2F0aW9uIHRvCisgICAgICogYW55IGxpc3RlbmVycy4KKyAgICAgKiBAcGFyYW0gc3RhdGUgdGhlIG5ldyBAe2NvZGUgRGV0YWlsZWRTdGF0ZX0KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgc2V0RGV0YWlsZWRTdGF0ZShOZXR3b3JrSW5mby5EZXRhaWxlZFN0YXRlIHN0YXRlKSB7CisgICAgICAgIHNldERldGFpbGVkU3RhdGUoc3RhdGUsIG51bGwsIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlY29yZCB0aGUgZGV0YWlsZWQgc3RhdGUgb2YgYSBuZXR3b3JrLCBhbmQgaWYgaXQgaXMgYQorICAgICAqIGNoYW5nZSBmcm9tIHRoZSBwcmV2aW91cyBzdGF0ZSwgc2VuZCBhIG5vdGlmaWNhdGlvbiB0bworICAgICAqIGFueSBsaXN0ZW5lcnMuCisgICAgICogQHBhcmFtIHN0YXRlIHRoZSBuZXcgQHtjb2RlIERldGFpbGVkU3RhdGV9CisgICAgICogQHBhcmFtIHJlYXNvbiBhIHtAY29kZSBTdHJpbmd9IGluZGljYXRpbmcgYSByZWFzb24gZm9yIHRoZSBzdGF0ZSBjaGFuZ2UsCisgICAgICogaWYgb25lIHdhcyBzdXBwbGllZC4gTWF5IGJlIHtAY29kZSBudWxsfS4KKyAgICAgKiBAcGFyYW0gZXh0cmFJbmZvIG9wdGlvbmFsIHtAY29kZSBTdHJpbmd9IHByb3ZpZGluZyBleHRyYSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3RhdGUgY2hhbmdlCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHNldERldGFpbGVkU3RhdGUoTmV0d29ya0luZm8uRGV0YWlsZWRTdGF0ZSBzdGF0ZSwgU3RyaW5nIHJlYXNvbiwgU3RyaW5nIGV4dHJhSW5mbykgeworICAgICAgICBpZiAoTE9DQUxfTE9HRCkgTG9nLmQoVEFHLCAic2V0RGV0YWlsZWQgc3RhdGUsIG9sZCA9IgorICAgICAgICAgICAgICAgICsgbU5ldHdvcmtJbmZvLmdldERldGFpbGVkU3RhdGUoKSArICIgYW5kIG5ldyBzdGF0ZT0iICsgc3RhdGUpOworICAgICAgICBpZiAoc3RhdGUgIT0gbU5ldHdvcmtJbmZvLmdldERldGFpbGVkU3RhdGUoKSkgeworICAgICAgICAgICAgYm9vbGVhbiB3YXNDb25uZWN0aW5nID0gKG1OZXR3b3JrSW5mby5nZXRTdGF0ZSgpID09IE5ldHdvcmtJbmZvLlN0YXRlLkNPTk5FQ1RJTkcpOworICAgICAgICAgICAgU3RyaW5nIGxhc3RSZWFzb24gPSBtTmV0d29ya0luZm8uZ2V0UmVhc29uKCk7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogSWYgYSByZWFzb24gd2FzIHN1cHBsaWVkIHdoZW4gdGhlIENPTk5FQ1RJTkcgc3RhdGUgd2FzIGVudGVyZWQsIGFuZCBubworICAgICAgICAgICAgICogcmVhc29uIHdhcyBzdXBwbGllZCBmb3IgZW50ZXJpbmcgdGhlIENPTk5FQ1RFRCBzdGF0ZSwgdGhlbiByZXRhaW4gdGhlCisgICAgICAgICAgICAgKiByZWFzb24gdGhhdCB3YXMgc3VwcGxpZWQgd2hlbiBnb2luZyB0byBDT05ORUNUSU5HLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAod2FzQ29ubmVjdGluZyAmJiBzdGF0ZSA9PSBOZXR3b3JrSW5mby5EZXRhaWxlZFN0YXRlLkNPTk5FQ1RFRCAmJiByZWFzb24gPT0gbnVsbAorICAgICAgICAgICAgICAgICAgICAmJiBsYXN0UmVhc29uICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmVhc29uID0gbGFzdFJlYXNvbjsKKyAgICAgICAgICAgIG1OZXR3b3JrSW5mby5zZXREZXRhaWxlZFN0YXRlKHN0YXRlLCByZWFzb24sIGV4dHJhSW5mbyk7CisgICAgICAgICAgICBNZXNzYWdlIG1zZyA9IG1UYXJnZXQub2J0YWluTWVzc2FnZShFVkVOVF9TVEFURV9DSEFOR0VELCBtTmV0d29ya0luZm8pOworICAgICAgICAgICAgbXNnLnNlbmRUb1RhcmdldCgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNldERldGFpbGVkU3RhdGVJbnRlcm5hbChOZXR3b3JrSW5mby5EZXRhaWxlZFN0YXRlIHN0YXRlKSB7CisgICAgICAgIG1OZXR3b3JrSW5mby5zZXREZXRhaWxlZFN0YXRlKHN0YXRlLCBudWxsLCBudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRUZWFyZG93blJlcXVlc3RlZChib29sZWFuIGlzUmVxdWVzdGVkKSB7CisgICAgICAgIG1UZWFyZG93blJlcXVlc3RlZCA9IGlzUmVxdWVzdGVkOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzVGVhcmRvd25SZXF1ZXN0ZWQoKSB7CisgICAgICAgIHJldHVybiBtVGVhcmRvd25SZXF1ZXN0ZWQ7CisgICAgfQorCisgICAgLyoqCiAgICAgICogSGVscGVyIG1ldGhvZDogc2V0cyB0aGUgYm9vbGVhbiBpbmRpY2F0aW5nIHRoYXQgdGhlIGNvbm5lY3Rpb24KICAgICAgKiBtYW5hZ2VyIGFza2VkIHRoZSBuZXR3b3JrIHRvIGJlIHRvcm4gZG93biAoYW5kIHNvIG9ubHkgdGhlIGNvbm5lY3Rpb24KICAgICAgKiBtYW5hZ2VyIGNhbiBzZXQgaXQgdXAgYWdhaW4pLgpAQCAtNDE5LDYgKzQ3NywxNSBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgSVAgYWRkcmVzc2VzIG9mIHRoZSBETlMgc2VydmVycyBhdmFpbGFibGUgZm9yIHRoZSBXTEFOCisgICAgICogbmV0d29yayBpbnRlcmZhY2UuCisgICAgICogQHJldHVybiBhIGxpc3Qgb2YgRE5TIGFkZHJlc3Nlcywgd2l0aCBubyBob2xlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nW10gZ2V0RG5zUHJvcE5hbWVzKCkgeworICAgICAgICByZXR1cm4gc0Ruc1Byb3BOYW1lczsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBSZXR1cm4gdGhlIG5hbWUgb2Ygb3VyIFdMQU4gbmV0d29yayBpbnRlcmZhY2UuCiAgICAgICogQHJldHVybiB0aGUgbmFtZSBvZiBvdXIgaW50ZXJmYWNlLgogICAgICAqLwpAQCAtNDI2LDYgKzQ5MywzMCBAQAogICAgICAgICByZXR1cm4gbUludGVyZmFjZU5hbWU7CiAgICAgfQogCisgICAgcHVibGljIGJvb2xlYW4gaXNQcml2YXRlRG5zUm91dGVTZXQoKSB7CisgICAgICAgIHJldHVybiBtUHJpdmF0ZURuc1JvdXRlU2V0OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHByaXZhdGVEbnNSb3V0ZVNldChib29sZWFuIGVuYWJsZWQpIHsKKyAgICAgICAgbVByaXZhdGVEbnNSb3V0ZVNldCA9IGVuYWJsZWQ7CisgICAgfQorCisgICAgcHVibGljIE5ldHdvcmtJbmZvIGdldE5ldHdvcmtJbmZvKCkgeworICAgICAgICByZXR1cm4gbU5ldHdvcmtJbmZvOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0RGVmYXVsdEdhdGV3YXlBZGRyKCkgeworICAgICAgICByZXR1cm4gbURlZmF1bHRHYXRld2F5QWRkcjsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHRSb3V0ZVNldCgpIHsKKyAgICAgICAgcmV0dXJuIG1EZWZhdWx0Um91dGVTZXQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZGVmYXVsdFJvdXRlU2V0KGJvb2xlYW4gZW5hYmxlZCkgeworICAgICAgICBtRGVmYXVsdFJvdXRlU2V0ID0gZW5hYmxlZDsKKyAgICB9CisKICAgICAvKioKICAgICAgKiBSZXR1cm4gdGhlIHN5c3RlbSBwcm9wZXJ0aWVzIG5hbWUgYXNzb2NpYXRlZCB3aXRoIHRoZSB0Y3AgYnVmZmVyIHNpemVzCiAgICAgICogZm9yIHRoaXMgbmV0d29yay4KQEAgLTY3MywyMiArNzY0LDYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBXZSByZWxlYXNlIHRoZSB3YWtlbG9jayBpbiBXaWZpU2VydmljZQotICAgICAqIHVzaW5nIGEgdGltZXIuCi0gICAgICoKLSAgICAgKiBUT0RPOgotICAgICAqIFJlbGVhc2luZyB3YWtlbG9jayB1c2luZyBib3RoIHRpbWVyIGFuZAotICAgICAqIGEgY2FsbCBmcm9tIENvbm5lY3Rpdml0eVNlcnZpY2UgcmVxdWlyZXMKLSAgICAgKiBhIHJldGhpbmsuIFdlIGhhZCBwcm9ibGVtcyB3aGVyZSBXaWZpU2VydmljZQotICAgICAqIGNvdWxkIGtlZXAgYSB3YWtlbG9jayBmb3JldmVyIGlmIHdlIGRlbGV0ZQotICAgICAqIG1lc3NhZ2VzIGluIHRoZSBhc3luY2hyb25vdXMgY2FsbAotICAgICAqIGZyb20gQ29ubmVjdGl2aXR5U2VydmljZQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHJlbGVhc2VXYWtlTG9jaygpIHsKLSAgICB9Ci0KLSAgICAvKioKICAgICAgKiBUcmFja3MgdGhlIFdQQSBzdXBwbGljYW50IHN0YXRlcyB0byBkZXRlY3QgImxvb3AiIHNpdHVhdGlvbnMuCiAgICAgICogQHBhcmFtIG5ld1N1cHBsaWNhbnRTdGF0ZSBUaGUgbmV3IFdQQSBzdXBwbGljYW50IHN0YXRlLgogICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBzdXBwbGljYW50IGxvb3Agc2hvdWxkIGJlIHN0b3BwZWQKQEAgLTIwNzYsNyArMjE1MSw2IEBACiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAKLSAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBpbnRlcnByZXRTY2FuUmVzdWx0c0F2YWlsYWJsZSgpIHsKIAogICAgICAgICAvLyBJZiB3ZSBzaG91bGRuJ3QgcGxhY2UgYSBub3RpZmljYXRpb24gb24gYXZhaWxhYmxlIG5ldHdvcmtzLCB0aGVuCkBAIC0yMTIyLDYgKzIxOTYsMTUgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBTZW5kIGEgIG5vdGlmaWNhdGlvbiB0aGF0IHRoZSByZXN1bHRzIG9mIGEgc2NhbiBmb3IgbmV0d29yayBhY2Nlc3MKKyAgICAgKiBwb2ludHMgaGFzIGNvbXBsZXRlZCwgYW5kIHJlc3VsdHMgYXJlIGF2YWlsYWJsZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgc2VuZFNjYW5SZXN1bHRzQXZhaWxhYmxlKCkgeworICAgICAgICBNZXNzYWdlIG1zZyA9IG1UYXJnZXQub2J0YWluTWVzc2FnZShFVkVOVF9TQ0FOX1JFU1VMVFNfQVZBSUxBQkxFLCBtTmV0d29ya0luZm8pOworICAgICAgICBtc2cuc2VuZFRvVGFyZ2V0KCk7CisgICAgfQorCisgICAgLyoqCiAgICAgICogRGlzcGxheSBvciBkb24ndCBkaXNwbGF5IGEgbm90aWZpY2F0aW9uIHRoYXQgdGhlcmUgYXJlIG9wZW4gV2ktRmkgbmV0d29ya3MuCiAgICAgICogQHBhcmFtIHZpc2libGUge0Bjb2RlIHRydWV9IGlmIG5vdGlmaWNhdGlvbiBzaG91bGQgYmUgdmlzaWJsZSwge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UKICAgICAgKiBAcGFyYW0gbnVtTmV0d29ya3MgdGhlIG51bWJlciBuZXR3b3JrcyBzZWVuCg==