ZGlmZiAtLWdpdCBhL01hYy9Ub29scy9tYWNmcmVlemUvbWFjZnJlZXplLnB5IGIvTWFjL1Rvb2xzL21hY2ZyZWV6ZS9tYWNmcmVlemUucHkKaW5kZXggNjA5NjJlZS4uMmY0M2UyMCAxMDA2NDQKLS0tIGEvTWFjL1Rvb2xzL21hY2ZyZWV6ZS9tYWNmcmVlemUucHkKKysrIGIvTWFjL1Rvb2xzL21hY2ZyZWV6ZS9tYWNmcmVlemUucHkKQEAgLTM3LDcgKzM3LDcgQEAKIAltdXN0d2FpdCA9IHByb2Nlc3MoZ2VudHlwZSwgcHJvZ3JhbSwgb3V0cHV0LCBkZWJ1Zz1kZWJ1ZykKIAlpZiBtdXN0d2FpdDoKIAkJc3lzLmV4aXQoMSkKLQkJCisKIGRlZiBwcm9jZXNzKGdlbnR5cGUsIHByb2dyYW0sIG91dHB1dCwgbW9kdWxlcz1bXSwgbW9kdWxlX2ZpbGVzPVtdLCBkZWJ1Zz0wKToKIAl0cnk6CiAJCW1vZHVsZV9kaWN0ID0gbWFjbW9kdWxlZmluZGVyLnByb2Nlc3MocHJvZ3JhbSwgbW9kdWxlcywgbW9kdWxlX2ZpbGVzLCBkZWJ1ZykKQEAgLTYzLDEwICs2MywxMCBAQAogCQlyZXR1cm4gd2FybmluZ3MKIAllbGlmIGdlbnR5cGUgPT0gJ2FwcGxldCc6CiAJCWltcG9ydCBtYWNnZW5fYmluCi0JCW1hY2dlbl9iaW4uZ2VuZXJhdGUob3V0cHV0LCBtb2R1bGVfZGljdCwgZGVidWcpCisJCWFyY2hpdGVjdHVyZSA9ICdmYXQnICMgdXNlciBzaG91bGQgY2hvb3NlCisJCW1hY2dlbl9iaW4uZ2VuZXJhdGUocHJvZ3JhbSwgb3V0cHV0LCBtb2R1bGVfZGljdCwgYXJjaGl0ZWN0dXJlLCBkZWJ1ZykKIAllbHNlOgogCQlyYWlzZSAndW5rbm93biBnZW50eXBlJywgZ2VudHlwZQotCQkJCisKIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAJbWFpbigpCi0JCQpkaWZmIC0tZ2l0IGEvTWFjL1Rvb2xzL21hY2ZyZWV6ZS9tYWNnZW5fYmluLnB5IGIvTWFjL1Rvb2xzL21hY2ZyZWV6ZS9tYWNnZW5fYmluLnB5CmluZGV4IGQ1MjRlOWIuLmE0ZWU4MjggMTAwNjQ0Ci0tLSBhL01hYy9Ub29scy9tYWNmcmVlemUvbWFjZ2VuX2Jpbi5weQorKysgYi9NYWMvVG9vbHMvbWFjZnJlZXplL21hY2dlbl9iaW4ucHkKQEAgLTEsNiArMSwyMDAgQEAKICIiIm1hY2dlbl9iaW4gLSBHZW5lcmF0ZSBhcHBsaWNhdGlvbiBmcm9tIHNoYXJlZCBsaWJyYXJpZXMiIiIKLWltcG9ydCBFYXN5RGlhbG9ncwogCi1kZWYgZ2VuZXJhdGUob3V0cHV0LCBtb2R1bGVfZGljdCk6Ci0JRWFzeURpYWxvZ3MuTWVzc2FnZSgnTm90IHlldCBpbXBsZW1lbnRlZCcpCitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKK2ltcG9ydCBzdHJpbmcKK2ltcG9ydCB0eXBlcworaW1wb3J0IG1hY2ZzCitmcm9tIE1BQ0ZTIGltcG9ydCAqCitpbXBvcnQgUmVzCitpbXBvcnQgcHlfcmVzb3VyY2UKK2ltcG9ydCBjZm1maWxlCitpbXBvcnQgYnVpbGR0b29scworCisKK2RlZiBnZW5lcmF0ZShpbnB1dCwgb3V0cHV0LCBtb2R1bGVfZGljdCA9IE5vbmUsIGFyY2hpdGVjdHVyZSA9ICdmYXQnLCBkZWJ1Zz0wKToKKwkjIHRyeSB0byByZW1vdmUgb2xkIGZpbGUKKwl0cnk6CisJCW9zLnJlbW92ZShvdXRwdXQpCisJZXhjZXB0OgorCQlwYXNzCiAJCisJaWYgbW9kdWxlX2RpY3QgaXMgTm9uZToKKwkJaW1wb3J0IG1hY21vZHVsZWZpbmRlcgorCQlwcmludCAiU2VhcmNoaW5nIGZvciBtb2R1bGVzLi4uIgorCQltb2R1bGVfZGljdCA9IG1hY21vZHVsZWZpbmRlci5wcm9jZXNzKGlucHV0LCBbXSwgW10sIDEpCisJCisJYXBwbGV0dGVtcGxhdGVwYXRoID0gYnVpbGR0b29scy5maW5kdGVtcGxhdGUoKQorCWNvcmVwYXRoID0gZmluZHB5dGhvbmNvcmUoKQorCQorCWR5bmFtaWNtb2R1bGVzLCBkeW5hbWljZmlsZXMsIGV4dHJhcmVzZmlsZXMgPSBmaW5kZnJhZ21lbnRzKG1vZHVsZV9kaWN0LCBhcmNoaXRlY3R1cmUpCisJCisJcHJpbnQgIkFkZGluZyCzX19tYWluX1+yIgorCWJ1aWxkdG9vbHMucHJvY2VzcyhhcHBsZXR0ZW1wbGF0ZXBhdGgsIGlucHV0LCBvdXRwdXQsIDApCisJCisJb3V0cHV0cmVmID0gUmVzLk9wZW5SZXNGaWxlKG91dHB1dCkKKwl0cnk6CisJCVJlcy5Vc2VSZXNGaWxlKG91dHB1dHJlZikKKwkJCisJCXByaW50ICJBZGRpbmcgUHl0aG9uIG1vZHVsZXMiCisJCWFkZHB5dGhvbm1vZHVsZXMobW9kdWxlX2RpY3QpCisJCQorCQlwcmludCAiQWRkaW5nIFB5dGhvbkNvcmUgcmVzb3VyY2VzIgorCQljb3B5cmVzKGNvcmVwYXRoLCBvdXRwdXRyZWYsIFsnY2ZyZycsICdQb3B0JywgJ0dVhUknXSwgMSkKKwkJCisJCXByaW50ICJBZGRpbmcgcmVzb3VyY2VzIGZyb20gc2hhcmVkIGxpYnJhcmllcyIKKwkJZm9yIHBwY3BhdGgsIGNmbTY4a3BhdGggaW4gZXh0cmFyZXNmaWxlczoKKwkJCWlmIG9zLnBhdGguZXhpc3RzKHBwY3BhdGgpOgorCQkJCWNvcHlyZXMocHBjcGF0aCwgb3V0cHV0cmVmLCBbJ2NmcmcnXSwgMSkKKwkJCWVsaWYgb3MucGF0aC5leGlzdHMoY2ZtNjhrcGF0aCk6CisJCQkJY29weXJlcyhjZm02OGtwYXRoLCBvdXRwdXRyZWYsIFsnY2ZyZyddLCAxKQorCQkKKwkJcHJpbnQgIkZpeGluZyBzeXMucGF0aCBwcmVmcyIKKwkJUmVzLlVzZVJlc0ZpbGUob3V0cHV0cmVmKQorCQl0cnk6CisJCQlyZXMgPSBSZXMuR2V0MVJlc291cmNlKCdTVFIjJywgMjI4KSAjIGZyb20gUHl0aG9uQ29yZQorCQlleGNlcHQgUmVzLkVycm9yOiBwYXNzCisJCWVsc2U6CisJCQlyZXMuUmVtb3ZlUmVzb3VyY2UoKQorCQkjIHNldHRpbmcgcHJlZiBmaWxlIG5hbWUgdG8gZW1wdHkgc3RyaW5nCisJCXJlcyA9IFJlcy5HZXQxTmFtZWRSZXNvdXJjZSgnU1RSICcsICJQeXRob25QcmVmZXJlbmNlRmlsZU5hbWUiKQorCQlyZXMuZGF0YSA9IFBzdHJpbmcoIiIpCisJCXJlcy5DaGFuZ2VkUmVzb3VyY2UoKQorCQlzeXNwYXRocHJlZiA9ICIkKEFQUExJQ0FUSU9OKSIKKwkJcmVzID0gUmVzLlJlc291cmNlKCJcMDAwXDAwMSIgKyBQc3RyaW5nKHN5c3BhdGhwcmVmKSkKKwkJcmVzLkFkZFJlc291cmNlKCJTVFIjIiwgMjI5LCAic3lzLnBhdGggcHJlZmVyZW5jZSIpCisJCQorCQlwcmludCAiQ3JlYXRpbmcgJ1BZRCAnIHJlc291cmNlcyIKKwkJZm9yIG1vZG5hbWUsIChwcGNmcmFnLCBjZm02OGtmcmFnKSBpbiBkeW5hbWljbW9kdWxlcy5pdGVtcygpOgorCQkJcmVzID0gUmVzLlJlc291cmNlKFBzdHJpbmcocHBjZnJhZykgKyBQc3RyaW5nKGNmbTY4a2ZyYWcpKQorCQkJaWQgPSAwCisJCQl3aGlsZSBpZCA8IDEyODoKKwkJCQlpZCA9IFJlcy5VbmlxdWUxSUQoJ1BZRCAnKQorCQkJcmVzLkFkZFJlc291cmNlKCdQWUQgJywgaWQsIG1vZG5hbWUpCisJZmluYWxseToKKwkJUmVzLkNsb3NlUmVzRmlsZShvdXRwdXRyZWYpCisJcHJpbnQgIk1lcmdpbmcgY29kZSBmcmFnbWVudHMiCisJY2ZtZmlsZS5tZXJnZWNmbWZpbGVzKFthcHBsZXR0ZW1wbGF0ZXBhdGgsIGNvcmVwYXRoXSArIGR5bmFtaWNmaWxlcy5rZXlzKCksIAorCQkJb3V0cHV0LCBhcmNoaXRlY3R1cmUpCisJCisJZnNzID0gbWFjZnMuRlNTcGVjKG91dHB1dCkKKwlmc3MuU2V0Q3JlYXRvclR5cGUoJ1B5dGEnLCAnQVBQTCcpCisJcHJpbnQgImRvbmUhIgorCisKK2RlZiBmaW5kZnJhZ21lbnRzKG1vZHVsZV9kaWN0LCBhcmNoaXRlY3R1cmUpOgorCWR5bmFtaWNtb2R1bGVzID0ge30KKwlkeW5hbWljZmlsZXMgPSB7fQorCWV4dHJhcmVzZmlsZXMgPSBbXQorCWZvciBuYW1lLCBtb2R1bGUgaW4gbW9kdWxlX2RpY3QuaXRlbXMoKToKKwkJaWYgbW9kdWxlLmdldHR5cGUoKSA8PiAnZHluYW1pYyc6CisJCQljb250aW51ZQorCQlwYXRoID0gcmVzb2x2ZWFsaWFzZmlsZShtb2R1bGUuX19maWxlX18pCisJCWRpciwgZmlsZW5hbWUgPSBvcy5wYXRoLnNwbGl0KHBhdGgpCisJCXBwY2ZpbGUsIGNmbTY4a2ZpbGUgPSBtYWtlZmlsZW5hbWVzKGZpbGVuYW1lKQorCQkKKwkJIyBwcGMgc3R1ZmYKKwkJcHBjcGF0aCA9IG9zLnBhdGguam9pbihkaXIsIHBwY2ZpbGUpCisJCWlmIGFyY2hpdGVjdHVyZSA8PiAnbTY4ayc6CisJCQlwcGNmcmFnLCBkeW5hbWljZmlsZXMgPSBnZXRmcmFnbmFtZShwcGNwYXRoLCBkeW5hbWljZmlsZXMpCisJCWVsc2U6CisJCQlwcGNmcmFnID0gIl9ub19mcmFnbWVudF8iCisJCQorCQkjIDY4ayBzdHVmZgorCQljZm02OGtwYXRoID0gb3MucGF0aC5qb2luKGRpciwgY2ZtNjhrZmlsZSkKKwkJaWYgYXJjaGl0ZWN0dXJlIDw+ICdwd3BjJzoKKwkJCWNmbTY4a2ZyYWcsIGR5bmFtaWNmaWxlcyA9IGdldGZyYWduYW1lKGNmbTY4a3BhdGgsIGR5bmFtaWNmaWxlcykKKwkJZWxzZToKKwkJCWNmbTY4a2ZyYWcgPSAiX25vX2ZyYWdtZW50XyIKKwkJCisJCWR5bmFtaWNtb2R1bGVzW25hbWVdID0gcHBjZnJhZywgY2ZtNjhrZnJhZworCQlpZiAocHBjcGF0aCwgY2ZtNjhrcGF0aCkgbm90IGluIGV4dHJhcmVzZmlsZXM6CisJCQlleHRyYXJlc2ZpbGVzLmFwcGVuZCgocHBjcGF0aCwgY2ZtNjhrcGF0aCkpCisJcmV0dXJuIGR5bmFtaWNtb2R1bGVzLCBkeW5hbWljZmlsZXMsIGV4dHJhcmVzZmlsZXMKKworCitkZWYgZ2V0ZnJhZ25hbWUocGF0aCwgZHluYW1pY2ZpbGVzKToKKwlpZiBub3QgZHluYW1pY2ZpbGVzLmhhc19rZXkocGF0aCk6CisJCWlmIG9zLnBhdGguZXhpc3RzKHBhdGgpOgorCQkJbGliID0gY2ZtZmlsZS5DZnJnUmVzb3VyY2UocGF0aCkKKwkJCWZyYWduYW1lID0gbGliLmZyYWdtZW50c1swXS5uYW1lCisJCWVsc2U6CisJCQlwcmludCAic2hhcmVkIGxpYiBub3QgZm91bmQ6IiwgcGF0aAorCQkJZnJhZ25hbWUgPSAiX25vX2ZyYWdtZW50XyIKKwkJZHluYW1pY2ZpbGVzW3BhdGhdID0gZnJhZ25hbWUKKwllbHNlOgorCQlmcmFnbmFtZSA9IGR5bmFtaWNmaWxlc1twYXRoXQorCXJldHVybiBmcmFnbmFtZSwgZHluYW1pY2ZpbGVzCisKKworZGVmIGFkZHB5dGhvbm1vZHVsZXMobW9kdWxlX2RpY3QpOgorCWl0ZW1zID0gbW9kdWxlX2RpY3QuaXRlbXMoKQorCWl0ZW1zLnNvcnQoKQorCWZvciBuYW1lLCBtb2R1bGUgaW4gaXRlbXM6CisJCWlmIG1vZHVsZS5nZXR0eXBlKCkgIT0gJ21vZHVsZScgb3IgbmFtZSA9PSAiX19tYWluX18iOgorCQkJY29udGludWUKKwkJbG9jYXRpb24gPSBtb2R1bGUuX19maWxlX18KKwkJCisJCWlmIGxvY2F0aW9uWy00Ol0gPT0gJy5weWMnOgorCQkJIyBBdHRlbXB0IGNvcnJlc3BvbmRpbmcgLnB5CisJCQlsb2NhdGlvbiA9IGxvY2F0aW9uWzotMV0KKwkJaWYgbG9jYXRpb25bLTM6XSAhPSAnLnB5JzoKKwkJCXByaW50ICcqKiogc2tpcHBpbmcnLCBsb2NhdGlvbgorCQkJY29udGludWUKKwkJCisJCXByaW50ICdBZGRpbmcgbW9kdWxlILMlc7InICUgbmFtZQorCQlpZCwgbmFtZSA9IHB5X3Jlc291cmNlLmZyb21weWZpbGUobG9jYXRpb24sIG5hbWUsIHByZWxvYWQ9MCkKKworZGVmIFBzdHJpbmcoc3RyKToKKwlpZiBsZW4oc3RyKSA+IDI1NToKKwkJcmFpc2UgVHlwZUVycm9yLCAiU3RyMjU1IG11c3QgYmUgYXQgbW9zdCAyNTUgY2hhcnMgbG9uZyIKKwlyZXR1cm4gY2hyKGxlbihzdHIpKSArIHN0cgorCitkZWYgbWFrZWZpbGVuYW1lcyhuYW1lKToKKwlsbmFtZSA9IHN0cmluZy5sb3dlcihuYW1lKQorCXBvcyA9IHN0cmluZy5maW5kKGxuYW1lLCAiLnBwYy4iKQorCWlmIHBvcyA+IDA6CisJCXJldHVybiBuYW1lLCBuYW1lWzpwb3NdICsgJy5DRk02OEsuJyArIG5hbWVbcG9zKzU6XQorCXBvcyA9IHN0cmluZy5maW5kKGxuYW1lLCAiLmNmbTY4ay4iKQorCWlmIHBvcyA+IDA6CisJCXJldHVybiBuYW1lWzpwb3NdICsgJy5wcGMuJyArIG5hbWVbcG9zKzg6XSwgbmFtZQorCXJhaXNlIFZhbHVlRXJyb3IsICJjYW4ndCBtYWtlIHBwYy9jZm02OGsgZmlsZW5hbWVzIgorCitkZWYgY29weXJlcyhpbnB1dCwgb3V0cHV0LCAqYXJncywgKiprd2FyZ3MpOgorCW9wZW5lZGluID0gb3BlbmVkb3V0ID0gMAorCWlmIHR5cGUoaW5wdXQpID09IHR5cGVzLlN0cmluZ1R5cGU6CisJCWlucHV0ID0gUmVzLk9wZW5SZXNGaWxlKGlucHV0KQorCQlvcGVuZWRpbiA9IDEKKwlpZiB0eXBlKG91dHB1dCkgPT0gdHlwZXMuU3RyaW5nVHlwZToKKwkJb3V0cHV0ID0gUmVzLk9wZW5SZXNGaWxlKG91dHB1dCkKKwkJb3BlbmVkb3V0ID0gMQorCXRyeToKKwkJYXBwbHkoYnVpbGR0b29scy5jb3B5cmVzLCAoaW5wdXQsIG91dHB1dCkgKyBhcmdzLCBrd2FyZ3MpCisJZmluYWxseToKKwkJaWYgb3BlbmVkaW46CisJCQlSZXMuQ2xvc2VSZXNGaWxlKGlucHV0KQorCQlpZiBvcGVuZWRvdXQ6CisJCQlSZXMuQ2xvc2VSZXNGaWxlKG91dHB1dCkKKworZGVmIGZpbmRweXRob25jb3JlKCk6CisJIiIiZmluZCB0aGUgUHl0aG9uQ29yZSBzaGFyZWQgbGlicmFyeSwgcG9zc2libHkgYXNraW5nIHRoZSB1c2VyIGlmIHdlIGNhbid0IGZpbmQgaXQiIiIKKwkKKwl2UmVmTnVtLCBkaXJJRCA9IG1hY2ZzLkZpbmRGb2xkZXIoa09uU3lzdGVtRGlzaywga0V4dGVuc2lvbkZvbGRlclR5cGUsIDApCisJZXh0cGF0aCA9IG1hY2ZzLkZTU3BlYygodlJlZk51bSwgZGlySUQsICIiKSkuYXNfcGF0aG5hbWUoKQorCXZlcnNpb24gPSBzdHJpbmcuc3BsaXQoc3lzLnZlcnNpb24pWzBdCisJY29yZXBhdGggPSBvcy5wYXRoLmpvaW4oZXh0cGF0aCwgIlB5dGhvbkNvcmUgIiArIHZlcnNpb24pCisJaWYgbm90IG9zLnBhdGguZXhpc3RzKGNvcmVwYXRoKToKKwkJZnNzLCBvayA9IG1hY2ZzLlByb21wdEdldEZpbGUoIlBsZWFzZSBsb2NhdGUgUHl0aG9uQ29yZToiLCAic2hsYiIpCisJCWlmIG5vdCBvazoKKwkJCXJhaXNlIEtleWJvYXJkSW50ZXJydXB0LCAiY2FuY2VsbGVkIgorCQljb3JlcGF0aCA9IGZzcy5hc19wYXRobmFtZSgpCisJcmV0dXJuIHJlc29sdmVhbGlhc2ZpbGUoY29yZXBhdGgpCisKK2RlZiByZXNvbHZlYWxpYXNmaWxlKHBhdGgpOgorCXRyeToKKwkJZnNzLCBkdW1teTEsIGR1bW15MiA9IG1hY2ZzLlJlc29sdmVBbGlhc0ZpbGUocGF0aCkKKwlleGNlcHQgbWFjZnMuZXJyb3I6CisJCXBhc3MKKwllbHNlOgorCQlwYXRoID0gZnNzLmFzX3BhdGhuYW1lKCkKKwlyZXR1cm4gcGF0aAo=