ZGlmZiAtLWdpdCBhL2dlbmVyaWNfdXRpbHMucHkgYi9nZW5lcmljX3V0aWxzLnB5CmluZGV4IGVlYjI2ZDYuLjBiZjI4OWUgMTAwNjQ0Ci0tLSBhL2dlbmVyaWNfdXRpbHMucHkKKysrIGIvZ2VuZXJpY191dGlscy5weQpAQCAtMzEsNiArMzEsNyBAQAogSW50ZW5kZWQgdG8gYmUgaW1wb3J0ZWQgaW50byBhbm90aGVyIG5hbWVzcGFjZQogIiIiCiAKK2ltcG9ydCBjb2xsZWN0aW9ucwogaW1wb3J0IGZ1bmN0b29scwogaW1wb3J0IHN5cwogaW1wb3J0IG9mX2cKQEAgLTk5LDggKzEwMCw2IEBACiAjCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAKLWltcG9ydCBjb2xsZWN0aW9ucwotCiBjbGFzcyBPcmRlcmVkU2V0KGNvbGxlY3Rpb25zLk11dGFibGVTZXQpOgogICAgICIiIgogICAgIEEgc2V0IGltcGxlbWVudGF0aW9ucyB0aGF0IHJldGFpbnMgaW5zZXJ0aW9uIG9yZGVyLiAgRnJvbSB0aGUgcmVjZWlwZQpAQCAtMTY0LDYgKzE2Myw1OSBAQAogICAgICAgICAgICAgcmV0dXJuIGxlbihzZWxmKSA9PSBsZW4ob3RoZXIpIGFuZCBsaXN0KHNlbGYpID09IGxpc3Qob3RoZXIpCiAgICAgICAgIHJldHVybiBzZXQoc2VsZikgPT0gc2V0KG90aGVyKQogCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIE9yZGVyZWREZWZhdWx0RGljdAorIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitjbGFzcyBPcmRlcmVkRGVmYXVsdERpY3QoY29sbGVjdGlvbnMuT3JkZXJlZERpY3QpOgorICAgICIiIgorICAgIEEgRGljdGlvbmFyeSB0aGF0IG1haW50YWlucyBpbnNlcnRpb24gb3JkZXIgd2hlcmUgbWlzc2luZyB2YWx1ZXMKKyAgICBhcmUgcHJvdmlkZWQgYnkgYSBmYWN0b3J5IGZ1bmN0aW9uLCBpLmUuLCBhIGNvbWJpbmF0aW9uIG9mCisgICAgdGhlIHNlbWFudGljcyBvZiBjb2xsZWN0aW9ucy5kZWZhdWx0ZGljdCBhbmQgY29sbGVjdGlvbnMuT3JkZXJlZERpY3QuCisgICAgIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGRlZmF1bHRfZmFjdG9yeT1Ob25lLCAqYSwgKiprdyk6CisgICAgICAgIGlmIChkZWZhdWx0X2ZhY3RvcnkgaXMgbm90IE5vbmUgYW5kCisgICAgICAgICAgICAgICAgbm90IGNhbGxhYmxlKGRlZmF1bHRfZmFjdG9yeSkpOgorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCdmaXJzdCBhcmd1bWVudCBtdXN0IGJlIGNhbGxhYmxlJykKKyAgICAgICAgY29sbGVjdGlvbnMuT3JkZXJlZERpY3QuX19pbml0X18oc2VsZiwgKmEsICoqa3cpCisgICAgICAgIHNlbGYuZGVmYXVsdF9mYWN0b3J5ID0gZGVmYXVsdF9mYWN0b3J5CisKKyAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwga2V5KToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmV0dXJuIGNvbGxlY3Rpb25zLk9yZGVyZWREaWN0Ll9fZ2V0aXRlbV9fKHNlbGYsIGtleSkKKyAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX19taXNzaW5nX18oa2V5KQorCisgICAgZGVmIF9fbWlzc2luZ19fKHNlbGYsIGtleSk6CisgICAgICAgIGlmIHNlbGYuZGVmYXVsdF9mYWN0b3J5IGlzIE5vbmU6CisgICAgICAgICAgICByYWlzZSBLZXlFcnJvcihrZXkpCisgICAgICAgIHNlbGZba2V5XSA9IHZhbHVlID0gc2VsZi5kZWZhdWx0X2ZhY3RvcnkoKQorICAgICAgICByZXR1cm4gdmFsdWUKKworICAgIGRlZiBfX3JlZHVjZV9fKHNlbGYpOgorICAgICAgICBpZiBzZWxmLmRlZmF1bHRfZmFjdG9yeSBpcyBOb25lOgorICAgICAgICAgICAgYXJncyA9IHR1cGxlKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGFyZ3MgPSBzZWxmLmRlZmF1bHRfZmFjdG9yeSwKKyAgICAgICAgcmV0dXJuIHR5cGUoc2VsZiksIGFyZ3MsIE5vbmUsIE5vbmUsIHNlbGYuaXRlbXMoKQorCisgICAgZGVmIGNvcHkoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9fY29weV9fKCkKKworICAgIGRlZiBfX2NvcHlfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHR5cGUoc2VsZikoc2VsZi5kZWZhdWx0X2ZhY3RvcnksIHNlbGYpCisKKyAgICBkZWYgX19kZWVwY29weV9fKHNlbGYsIG1lbW8pOgorICAgICAgICBpbXBvcnQgY29weQorICAgICAgICByZXR1cm4gdHlwZShzZWxmKShzZWxmLmRlZmF1bHRfZmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29weS5kZWVwY29weShzZWxmLml0ZW1zKCkpKQorICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICdPcmRlcmVkRGVmYXVsdERpY3QoJXMsICVzKScgJSAoc2VsZi5kZWZhdWx0X2ZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbGVjdGlvbnMuT3JkZXJlZERpY3QuX19yZXByX18oc2VsZikpCisKKwogZGVmIGZpbmQoaXRlcmFibGUsIGZ1bmMpOgogICAgICIiIgogICAgIGZpbmQgdGhlIGZpcnN0IGl0ZW0gaW4gaXRlcmFibGUgZm9yIHdoaWNoIGZ1bmMgcmV0dXJucyBzb21ldGhpbmcgdHJ1ZSdpc2guCmRpZmYgLS1naXQgYS9qYXZhX2dlbi9jb2RlZ2VuLnB5IGIvamF2YV9nZW4vY29kZWdlbi5weQppbmRleCAwNzY1YzkxLi4wN2I5MTBhIDEwMDY0NAotLS0gYS9qYXZhX2dlbi9jb2RlZ2VuLnB5CisrKyBiL2phdmFfZ2VuL2NvZGVnZW4ucHkKQEAgLTM2LDYgKzM2LDcgQEAKIGltcG9ydCBvZl9nCiBmcm9tIGxveGlfaXIgaW1wb3J0ICoKIGltcG9ydCBsYW5nX2phdmEKK2ltcG9ydCB0ZXN0X2RhdGEKIAogaW1wb3J0IGxveGlfdXRpbHMubG94aV91dGlscyBhcyBsb3hpX3V0aWxzCiAKQEAgLTQzLDE3ICs0NCwxNyBAQAogCiBkZWYgZ2VuX2FsbF9qYXZhKG91dCwgbmFtZSk6CiAgICAgYmFzZWRpcj0gJyVzL29wZW5mbG93aicgJSBvZl9nLm9wdGlvbnMuaW5zdGFsbF9kaXIKLSAgICBzcmNkaXIgPSAiJXMvc3JjL21haW4vamF2YS8iICUgYmFzZWRpcgogICAgIHByaW50ICJPdXRwdXR0aW5nIHRvICVzIiAlIGJhc2VkaXIKICAgICBpZiBvcy5wYXRoLmV4aXN0cyhiYXNlZGlyKToKICAgICAgICAgc2h1dGlsLnJtdHJlZShiYXNlZGlyKQogICAgIG9zLm1ha2VkaXJzKGJhc2VkaXIpCiAgICAgY29weV9wcmV3cml0ZV90cmVlKGJhc2VkaXIpCiAKLSAgICBnZW4gPSBKYXZhR2VuZXJhdG9yKHNyY2RpcikKKyAgICBnZW4gPSBKYXZhR2VuZXJhdG9yKGJhc2VkaXIpCiAgICAgZ2VuLmNyZWF0ZV9vZl9pbnRlcmZhY2VzKCkKICAgICBnZW4uY3JlYXRlX29mX2NsYXNzZXMoKQogICAgIGdlbi5jcmVhdGVfb2ZfY29uc3RfZW51bXMoKQorICAgIGdlbi5jcmVhdGVfb2ZfZmFjdG9yaWVzKCkKIAogICAgIHdpdGggb3BlbignJXMvUkVBRE1FLmphdmEtbGFuZycgJSBvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pKSBhcyByZWFkbWVfc3JjOgogICAgICAgICBvdXQud3JpdGVsaW5lcyhyZWFkbWVfc3JjLnJlYWRsaW5lcygpKQpAQCAtNjcsMTEgKzY4LDE1IEBACiAgICAgICAgIHNlbGYuYmFzZWRpciA9IGJhc2VkaXIKICAgICAgICAgc2VsZi5qYXZhX21vZGVsID0gamF2YV9tb2RlbC5tb2RlbAogCi0gICAgZGVmIHJlbmRlcl9jbGFzcyhzZWxmLCBjbGF6eiwgdGVtcGxhdGUsICoqY29udGV4dCk6CisgICAgZGVmIHJlbmRlcl9jbGFzcyhzZWxmLCBjbGF6eiwgdGVtcGxhdGUsIHNyY19kaXI9Tm9uZSwgKipjb250ZXh0KToKKyAgICAgICAgaWYgbm90IHNyY19kaXI6CisgICAgICAgICAgICBzcmNfZGlyID0gInNyYy9tYWluL2phdmEvIgorCiAgICAgICAgIGNvbnRleHRbJ2NsYXNzX25hbWUnXSA9IGNsYXp6Lm5hbWUKICAgICAgICAgY29udGV4dFsncGFja2FnZSddID0gY2xhenoucGFja2FnZQorICAgICAgICBjb250ZXh0Wyd0ZW1wbGF0ZV9kaXInXSA9IHNlbGYudGVtcGxhdGVzX2RpcgogCi0gICAgICAgIGZpbGVuYW1lID0gb3MucGF0aC5qb2luKHNlbGYuYmFzZWRpciwgIiVzLyVzLmphdmEiICUgKGNsYXp6LnBhY2thZ2UucmVwbGFjZSgiLiIsICIvIiksIGNsYXp6Lm5hbWUpKQorICAgICAgICBmaWxlbmFtZSA9IG9zLnBhdGguam9pbihzZWxmLmJhc2VkaXIsIHNyY19kaXIsICIlcy8lcy5qYXZhIiAlIChjbGF6ei5wYWNrYWdlLnJlcGxhY2UoIi4iLCAiLyIpLCBjbGF6ei5uYW1lKSkKICAgICAgICAgZGlybmFtZSA9IG9zLnBhdGguZGlybmFtZShmaWxlbmFtZSkKICAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKGRpcm5hbWUpOgogICAgICAgICAgICAgb3MubWFrZWRpcnMoZGlybmFtZSkKQEAgLTg3LDYgKzkyLDEwIEBACiAgICAgICAgICAgICBzZWxmLnJlbmRlcl9jbGFzcyhjbGF6ej1lbnVtLAogICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZT0nY29uc3QuamF2YScsIGVudW09ZW51bSwgYWxsX3ZlcnNpb25zPXNlbGYuamF2YV9tb2RlbC52ZXJzaW9ucykKIAorICAgICAgICAgICAgZm9yIHZlcnNpb24gaW4gZW51bS52ZXJzaW9uczoKKyAgICAgICAgICAgICAgICBjbGF6eiA9IGphdmFfbW9kZWwuT0ZHZW5lcmljQ2xhc3MocGFja2FnZT0ib3JnLm9wZW5mbG93LnByb3RvY29sLnZlcnt9Ii5mb3JtYXQodmVyc2lvbi5vZl92ZXJzaW9uKSwgbmFtZT0ie31TZXJpYWxpemVyVmVye30iLmZvcm1hdChlbnVtLm5hbWUsIHZlcnNpb24ub2ZfdmVyc2lvbikpCisgICAgICAgICAgICAgICAgc2VsZi5yZW5kZXJfY2xhc3MoY2xheno9Y2xhenosIHRlbXBsYXRlPSJjb25zdF9zZXJpYWxpemVyLmphdmEiLCBlbnVtPWVudW0sIHZlcnNpb249dmVyc2lvbikKKwogICAgIGRlZiBjcmVhdGVfb2ZfaW50ZXJmYWNlcyhzZWxmKToKICAgICAgICAgIiIiIENyZWF0ZSB0aGUgYmFzZSBpbnRlcmZhY2VzIGZvciBvZiBjbGFzc2VzIiIiCiAgICAgICAgIGZvciBpbnRlcmZhY2UgaW4gc2VsZi5qYXZhX21vZGVsLmludGVyZmFjZXM6CkBAIC05OCwxNSArMTA3LDMwIEBACiAgICAgZGVmIGNyZWF0ZV9vZl9jbGFzc2VzKHNlbGYpOgogICAgICAgICAiIiIgQ3JlYXRlIHRoZSBPRiBjbGFzc2VzIHdpdGggaW1wbGVtZW50YXRpb25zIGZvciBlYWNoIG9mIHRoZSBpbnRlcmZhY2VzIGFuZCB2ZXJzaW9ucyAiIiIKICAgICAgICAgZm9yIGludGVyZmFjZSBpbiBzZWxmLmphdmFfbW9kZWwuaW50ZXJmYWNlczoKLSAgICAgICAgICAgIGlmIGludGVyZmFjZS5uYW1lID09ICJPRlRhYmxlTW9kIjoKLSAgICAgICAgICAgICAgICBjb250aW51ZQotICAgICAgICAgICAgaWYgbm90IGxveGlfdXRpbHMuY2xhc3NfaXNfbWVzc2FnZShpbnRlcmZhY2UuY19uYW1lKSBhbmQgbm90IGxveGlfdXRpbHMuY2xhc3NfaXNfb3htKGludGVyZmFjZS5jX25hbWUpOgotICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICBmb3IgamF2YV9jbGFzcyBpbiBpbnRlcmZhY2UudmVyc2lvbmVkX2NsYXNzZXM6CisgICAgICAgICAgICAgICAgaWYgbm90IHNlbGYuamF2YV9tb2RlbC5nZW5lcmF0ZV9jbGFzcyhqYXZhX2NsYXNzKToKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgICBzZWxmLnJlbmRlcl9jbGFzcyhjbGF6ej1qYXZhX2NsYXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGU9J29mX2NsYXNzLmphdmEnLCB2ZXJzaW9uPWphdmFfY2xhc3MudmVyc2lvbiwgbXNnPWphdmFfY2xhc3MsCiAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsX2NsYXNzPWphdmFfY2xhc3MubmFtZSkKIAorICAgICAgICAgICAgICAgIHNlbGYuY3JlYXRlX3VuaXRfdGVzdChqYXZhX2NsYXNzLnVuaXRfdGVzdCkKKworICAgIGRlZiBjcmVhdGVfdW5pdF90ZXN0KHNlbGYsIHVuaXRfdGVzdCk6CisgICAgICAgIGlmIHVuaXRfdGVzdC5oYXNfdGVzdF9kYXRhOgorICAgICAgICAgICAgc2VsZi5yZW5kZXJfY2xhc3MoY2xheno9dW5pdF90ZXN0LAorICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZT0ndW5pdF90ZXN0LmphdmEnLCBzcmNfZGlyPSJzcmMvdGVzdC9qYXZhIiwKKyAgICAgICAgICAgICAgICAgICAgdmVyc2lvbj11bml0X3Rlc3QuamF2YV9jbGFzcy52ZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICB0ZXN0PXVuaXRfdGVzdCwgbXNnPXVuaXRfdGVzdC5qYXZhX2NsYXNzLAorICAgICAgICAgICAgICAgICAgICB0ZXN0X2RhdGE9dW5pdF90ZXN0LnRlc3RfZGF0YSkKKworICAgIGRlZiBjcmVhdGVfb2ZfZmFjdG9yaWVzKHNlbGYpOgorICAgICAgICBmYWN0b3J5ID0gc2VsZi5qYXZhX21vZGVsLm9mX2ZhY3RvcnkKKyAgICAgICAgc2VsZi5yZW5kZXJfY2xhc3MoY2xheno9ZmFjdG9yeSwgdGVtcGxhdGU9Im9mX2ZhY3RvcnlfaW50ZXJmYWNlLmphdmEiLCBmYWN0b3J5PWZhY3RvcnkpCisgICAgICAgIGZvciBmYWN0b3J5X2NsYXNzIGluIGZhY3RvcnkuZmFjdG9yeV9jbGFzc2VzOgorICAgICAgICAgICAgc2VsZi5yZW5kZXJfY2xhc3MoY2xheno9ZmFjdG9yeV9jbGFzcywgdGVtcGxhdGU9Im9mX2ZhY3RvcnlfY2xhc3MuamF2YSIsIGZhY3Rvcnk9ZmFjdG9yeV9jbGFzcywgbW9kZWw9c2VsZi5qYXZhX21vZGVsKQorICAgICAgICBzZWxmLnJlbmRlcl9jbGFzcyhjbGF6ej1qYXZhX21vZGVsLk9GR2VuZXJpY0NsYXNzKHBhY2thZ2U9Im9yZy5vcGVuZmxvdy5wcm90b2NvbCIsIG5hbWU9Ik9GRmFjdG9yaWVzIiksIHRlbXBsYXRlPSJvZl9mYWN0b3JpZXMuamF2YSIsIHZlcnNpb25zPXNlbGYuamF2YV9tb2RlbC52ZXJzaW9ucykKKwogZGVmIGNvcHlfcHJld3JpdGVfdHJlZShiYXNlZGlyKToKICAgICAiIiIgUmVjdXJzaXZlbHkgY29weSB0aGUgZGlyZWN0b3J5IHN0cnVjdHVyZSBmcm9tIC4vamF2YV9nZW4vcHJlLXdyaXRlCiAgICAgICAgaW50byAkYmFzZWRpciIiIgpkaWZmIC0tZ2l0IGEvamF2YV9nZW4vamF2YV9tb2RlbC5weSBiL2phdmFfZ2VuL2phdmFfbW9kZWwucHkKaW5kZXggMzVmMzM0Yy4uYTg5NDE3OSAxMDA2NDQKLS0tIGEvamF2YV9nZW4vamF2YV9tb2RlbC5weQorKysgYi9qYXZhX2dlbi9qYXZhX21vZGVsLnB5CkBAIC0yOSwyNCArMjksMjcgQEAKICMgQSBsb3Qgb2YgdGhpcyBzdHVmZiBjb3VsZC9zaG91bGQgcHJvYmFibHkgYmUgbWVyZ2VkIHdpdGggdGhlIHB5dGhvbiB1dGlsaXRpZXMKIAogaW1wb3J0IGNvbGxlY3Rpb25zCi1mcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBuYW1lZHR1cGxlLCBkZWZhdWx0ZGljdAorZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgbmFtZWR0dXBsZSwgZGVmYXVsdGRpY3QsIE9yZGVyZWREaWN0CiBpbXBvcnQgbG9nZ2luZwogaW1wb3J0IG9zCiBpbXBvcnQgcGRiCiBpbXBvcnQgcmUKIAotZnJvbSBnZW5lcmljX3V0aWxzIGltcG9ydCBmaW5kLCBtZW1vaXplLCBPcmRlcmVkU2V0Citmcm9tIGdlbmVyaWNfdXRpbHMgaW1wb3J0IGZpbmQsIG1lbW9pemUsIE9yZGVyZWRTZXQsIE9yZGVyZWREZWZhdWx0RGljdAogaW1wb3J0IG9mX2cKIGZyb20gbG94aV9pciBpbXBvcnQgKgogaW1wb3J0IGxveGlfZnJvbnRfZW5kLnR5cGVfbWFwcyBhcyB0eXBlX21hcHMKLWltcG9ydCBsb3hpX3V0aWxzLmxveGlfdXRpbHMgYXMgdXRpbHMKK2ltcG9ydCBsb3hpX3V0aWxzLmxveGlfdXRpbHMgYXMgbG94aV91dGlscwogaW1wb3J0IHB5X2dlbi51dGlsIGFzIHB5X3V0aWxzCitpbXBvcnQgdGVzdF9kYXRhCiAKIGltcG9ydCBqYXZhX2dlbi5qYXZhX3R5cGUgYXMgamF2YV90eXBlCiAKIGNsYXNzIEphdmFNb2RlbChvYmplY3QpOgotICAgIHdyaXRlX2JsYWNrbGlzdCA9IGRlZmF1bHRkaWN0KGxhbWJkYTogc2V0KCksIE9GT3htPXNldCgoJ3R5cGVMZW4nLCkpKQotICAgIHZpcnR1YWxfaW50ZXJmYWNlcyA9IHNldChbJ09GT3htJyBdKQorICAgIGVudW1fYmxhY2tsaXN0ID0gc2V0KCgiT0ZEZWZpbml0aW9ucyIsKSkKKyAgICBlbnVtX2VudHJ5X2JsYWNrbGlzdCA9IGRlZmF1bHRkaWN0KGxhbWJkYTogc2V0KCksIE9GRmxvd1dpbGRjYXJkcz1zZXQoWyAiTldfRFNUX0JJVFMiLCAiTldfU1JDX0JJVFMiLCAiTldfU1JDX1NISUZUIiwgIk5XX0RTVF9TSElGVCIgXSkpCisgICAgd3JpdGVfYmxhY2tsaXN0ID0gZGVmYXVsdGRpY3QobGFtYmRhOiBzZXQoKSwgT0ZPeG09c2V0KCgndHlwZUxlbicsKSksIE9GQWN0aW9uPXNldCgoJ3R5cGUnLCkpLCBPRkluc3RydWN0aW9uPXNldCgoJ3R5cGUnLCkpKQorICAgIHZpcnR1YWxfaW50ZXJmYWNlcyA9IHNldChbJ09GT3htJywgJ09GQWN0aW9uJywgJ09GSW5zdHJ1Y3Rpb24nIF0pCiAKICAgICBAcHJvcGVydHkKICAgICBAbWVtb2l6ZQpAQCAtNTYsMTIgKzU5LDE1IEBACiAgICAgQHByb3BlcnR5CiAgICAgQG1lbW9pemUKICAgICBkZWYgaW50ZXJmYWNlcyhzZWxmKToKLSAgICAgICAgdmVyc2lvbl9tYXBfcGVyX2NsYXNzID0gY29sbGVjdGlvbnMuZGVmYXVsdGRpY3QobGFtYmRhOiB7fSkKKyAgICAgICAgdmVyc2lvbl9tYXBfcGVyX2NsYXNzID0gY29sbGVjdGlvbnMuT3JkZXJlZERpY3QoKQogCiAgICAgICAgIGZvciByYXdfdmVyc2lvbiwgb2ZfcHJvdG9jb2wgaW4gb2ZfZy5pci5pdGVtcygpOgogICAgICAgICAgICAganZlcnNpb24gPSBKYXZhT0ZWZXJzaW9uKG9mX3Byb3RvY29sLndpcmVfdmVyc2lvbikKIAogICAgICAgICAgICAgZm9yIG9mX2NsYXNzIGluIG9mX3Byb3RvY29sLmNsYXNzZXM6CisgICAgICAgICAgICAgICAgaWYgbm90IG9mX2NsYXNzLm5hbWUgaW4gdmVyc2lvbl9tYXBfcGVyX2NsYXNzOgorICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uX21hcF9wZXJfY2xhc3Nbb2ZfY2xhc3MubmFtZV0gPSBjb2xsZWN0aW9ucy5PcmRlcmVkRGljdCgpCisKICAgICAgICAgICAgICAgICB2ZXJzaW9uX21hcF9wZXJfY2xhc3Nbb2ZfY2xhc3MubmFtZV1banZlcnNpb25dID0gb2ZfY2xhc3MKIAogICAgICAgICBpbnRlcmZhY2VzID0gW10KQEAgLTczLDE3ICs3OSwxOCBAQAogICAgIEBwcm9wZXJ0eQogICAgIEBtZW1vaXplCiAgICAgZGVmIGVudW1zKHNlbGYpOgotICAgICAgICBlbnVtX2VudHJ5X3ZlcnNpb25fdmFsdWVfbWFwID0gY29sbGVjdGlvbnMuZGVmYXVsdGRpY3QobGFtYmRhOiBjb2xsZWN0aW9ucy5kZWZhdWx0ZGljdChsYW1iZGE6IGNvbGxlY3Rpb25zLk9yZGVyZWREaWN0KCkpKQorICAgICAgICBuYW1lX3ZlcnNpb25fZW51bV9tYXAgPSBPcmRlcmVkRGVmYXVsdERpY3QobGFtYmRhOiBPcmRlcmVkRGljdCgpKQogCiAgICAgICAgIGZvciB2ZXJzaW9uIGluIHNlbGYudmVyc2lvbnM6CiAgICAgICAgICAgICBvZl9wcm90b2NvbCA9IG9mX2cuaXJbdmVyc2lvbi5pbnRfdmVyc2lvbl0KICAgICAgICAgICAgIGZvciBlbnVtIGluIG9mX3Byb3RvY29sLmVudW1zOgotICAgICAgICAgICAgICAgIGZvciBlbnRyeV9uYW1lLCBlbnRyeV92YWx1ZSBpbiBlbnVtLnZhbHVlczoKLSAgICAgICAgICAgICAgICAgICAgZW51bV9lbnRyeV92ZXJzaW9uX3ZhbHVlX21hcFtlbnVtLm5hbWVdW2VudHJ5X25hbWVdW3ZlcnNpb25dID0gZW50cnlfdmFsdWUKKyAgICAgICAgICAgICAgICBuYW1lX3ZlcnNpb25fZW51bV9tYXBbZW51bS5uYW1lXVt2ZXJzaW9uXSA9IGVudW0KIAotICAgICAgICBlbnVtcyA9IFsgSmF2YUVudW0obmFtZSwgZW50cnlfdmVyc2lvbl92YWx1ZV9tYXApIGZvciBuYW1lLCBlbnRyeV92ZXJzaW9uX3ZhbHVlX21hcAotICAgICAgICAgICAgICAgICAgICAgICAgaW4gZW51bV9lbnRyeV92ZXJzaW9uX3ZhbHVlX21hcC5pdGVtcygpIF0KKyAgICAgICAgZW51bXMgPSBbIEphdmFFbnVtKG5hbWUsIHZlcnNpb25fZW51bV9tYXApIGZvciBuYW1lLCB2ZXJzaW9uX2VudW1fbWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgaW4gbmFtZV92ZXJzaW9uX2VudW1fbWFwLml0ZW1zKCkgXQogCisgICAgICAgICMgaW5lbGVnYW50IC0gbmVlZCBqYXZhIG5hbWUgaGVyZQorICAgICAgICBlbnVtcyA9IFsgZW51bSBmb3IgZW51bSBpbiBlbnVtcyBpZiBlbnVtLm5hbWUgbm90IGluIHNlbGYuZW51bV9ibGFja2xpc3QgXQogICAgICAgICByZXR1cm4gZW51bXMKIAogICAgIEBtZW1vaXplCkBAIC05Myw2ICsxMDAsNDcgQEAKICAgICAgICAgZXhjZXB0IEtleUVycm9yOgogICAgICAgICAgICAgcmFpc2UgS2V5RXJyb3IoIkNvdWxkIG5vdCBmaW5kIGVudW0gd2l0aCBuYW1lICVzIiAlIG5hbWUpCiAKKyAgICBAcHJvcGVydHkKKyAgICBAbWVtb2l6ZQorICAgIGRlZiBvZl9mYWN0b3J5KHNlbGYpOgorICAgICAgICAgICByZXR1cm4gT0ZGYWN0b3J5KAorICAgICAgICAgICAgICAgICAgICBwYWNrYWdlPSJvcmcub3BlbmZsb3cucHJvdG9jb2wiLAorICAgICAgICAgICAgICAgICAgICBuYW1lPSJPRkZhY3RvcnkiLAorICAgICAgICAgICAgICAgICAgICBtZW1iZXJzPXNlbGYuaW50ZXJmYWNlcykKKworICAgIGRlZiBnZW5lcmF0ZV9jbGFzcyhzZWxmLCBjbGF6eik6CisgICAgICAgIGlmIGNsYXp6LmludGVyZmFjZS5pc192aXJ0dWFsOgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIGlmIGNsYXp6LmludGVyZmFjZS5uYW1lID09ICJPRlRhYmxlTW9kIjoKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICBpZiBjbGF6ei5pbnRlcmZhY2UubmFtZS5zdGFydHN3aXRoKCJPRk1hdGNoViIpOgorICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgaWYgbG94aV91dGlscy5jbGFzc19pc19tZXNzYWdlKGNsYXp6LmludGVyZmFjZS5jX25hbWUpOgorICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgaWYgbG94aV91dGlscy5jbGFzc19pc19veG0oY2xhenouaW50ZXJmYWNlLmNfbmFtZSk6CisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICBpZiBsb3hpX3V0aWxzLmNsYXNzX2lzX2FjdGlvbihjbGF6ei5pbnRlcmZhY2UuY19uYW1lKToKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgIGlmIGxveGlfdXRpbHMuY2xhc3NfaXNfaW5zdHJ1Y3Rpb24oY2xhenouaW50ZXJmYWNlLmNfbmFtZSk6CisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisKKworY2xhc3MgT0ZGYWN0b3J5KG5hbWVkdHVwbGUoIk9GRmFjdG9yeSIsICgicGFja2FnZSIsICJuYW1lIiwgIm1lbWJlcnMiKSkpOgorICAgIEBwcm9wZXJ0eQorICAgIGRlZiBmYWN0b3J5X2NsYXNzZXMoc2VsZik6CisgICAgICAgICAgICByZXR1cm4gWyBPRkZhY3RvcnlDbGFzcygKKyAgICAgICAgICAgICAgICAgICAgcGFja2FnZT0ib3JnLm9wZW5mbG93LnByb3RvY29sLnZlcnt9Ii5mb3JtYXQodmVyc2lvbi5vZl92ZXJzaW9uKSwKKyAgICAgICAgICAgICAgICAgICAgbmFtZT0iT0ZGYWN0b3J5VmVye30iLmZvcm1hdCh2ZXJzaW9uLm9mX3ZlcnNpb24pLAorICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2U9c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgdmVyc2lvbj12ZXJzaW9uCisgICAgICAgICAgICAgICAgICAgICkgZm9yIHZlcnNpb24gaW4gbW9kZWwudmVyc2lvbnMgXQorCisKK09GR2VuZXJpY0NsYXNzID0gbmFtZWR0dXBsZSgiT0ZHZW5lcmljQ2xhc3MiLCAoInBhY2thZ2UiLCAibmFtZSIpKQorT0ZGYWN0b3J5Q2xhc3MgPSBuYW1lZHR1cGxlKCJPRkZhY3RvcnkiLCAoInBhY2thZ2UiLCAibmFtZSIsICJpbnRlcmZhY2UiLCAidmVyc2lvbiIpKQorCiBtb2RlbCA9IEphdmFNb2RlbCgpCiAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCkBAIC0xMzksNyArMTg3LDcgQEAKICAgICAgICAgc2VsZi5jX25hbWUgPSBjX25hbWUKICAgICAgICAgc2VsZi52ZXJzaW9uX21hcCA9IHZlcnNpb25fbWFwCiAgICAgICAgIHNlbGYubmFtZSA9IGphdmFfdHlwZS5uYW1lX2NfdG9fY2Fwc19jYW1lbChjX25hbWUpCi0gICAgICAgIHNlbGYuYnVpbGRlcl9uYW1lID0gc2VsZi5uYW1lICsgIkJ1aWxkZXIiCisgICAgICAgIHNlbGYudmFyaWFibGVfbmFtZSA9IHNlbGYubmFtZVsyXS5sb3dlcigpICsgc2VsZi5uYW1lWzM6XQogICAgICAgICBzZWxmLmNvbnN0YW50X25hbWUgPSBjX25hbWUudXBwZXIoKS5yZXBsYWNlKCJPRl8iLCAiIikKIAogICAgICAgICBwY2tfc3VmZml4LCBwYXJlbnRfaW50ZXJmYWNlID0gc2VsZi5jbGFzc19pbmZvKCkKQEAgLTE1MiwxNSArMjAwLDE3IEBACiAgICAgZGVmIGNsYXNzX2luZm8oc2VsZik6CiAgICAgICAgIGlmIHJlLm1hdGNoKHInT0ZGbG93KEFkZHxNb2RpZnkoU3RyaWN0KT98RGVsZXRlKFN0cmljdCk/KSQnLCBzZWxmLm5hbWUpOgogICAgICAgICAgICAgcmV0dXJuICgiIiwgIk9GRmxvd01vZCIpCi0gICAgICAgIGVsaWYgdXRpbHMuY2xhc3NfaXNfbWVzc2FnZShzZWxmLmNfbmFtZSk6CisgICAgICAgIGVsaWYgcmUubWF0Y2gocidPRk1hdGNoLionLCBzZWxmLm5hbWUpOgorICAgICAgICAgICAgcmV0dXJuICgiIiwgIk1hdGNoIikKKyAgICAgICAgZWxpZiBsb3hpX3V0aWxzLmNsYXNzX2lzX21lc3NhZ2Uoc2VsZi5jX25hbWUpOgogICAgICAgICAgICAgcmV0dXJuICgiIiwgIk9GTWVzc2FnZSIpCi0gICAgICAgIGVsaWYgdXRpbHMuY2xhc3NfaXNfYWN0aW9uKHNlbGYuY19uYW1lKToKKyAgICAgICAgZWxpZiBsb3hpX3V0aWxzLmNsYXNzX2lzX2FjdGlvbihzZWxmLmNfbmFtZSk6CiAgICAgICAgICAgICByZXR1cm4gKCJhY3Rpb24iLCAiT0ZBY3Rpb24iKQotICAgICAgICBlbGlmIHV0aWxzLmNsYXNzX2lzX294bShzZWxmLmNfbmFtZSk6CisgICAgICAgIGVsaWYgbG94aV91dGlscy5jbGFzc19pc19veG0oc2VsZi5jX25hbWUpOgogICAgICAgICAgICAgcmV0dXJuICgib3htIiwgIk9GT3htIikKLSAgICAgICAgZWxpZiB1dGlscy5jbGFzc19pc19pbnN0cnVjdGlvbihzZWxmLmNfbmFtZSk6CisgICAgICAgIGVsaWYgbG94aV91dGlscy5jbGFzc19pc19pbnN0cnVjdGlvbihzZWxmLmNfbmFtZSk6CiAgICAgICAgICAgICByZXR1cm4gKCJpbnN0cnVjdGlvbiIsICJPRkluc3RydWN0aW9uIikKLSAgICAgICAgZWxpZiB1dGlscy5jbGFzc19pc19tZXRlcl9iYW5kKHNlbGYuY19uYW1lKToKKyAgICAgICAgZWxpZiBsb3hpX3V0aWxzLmNsYXNzX2lzX21ldGVyX2JhbmQoc2VsZi5jX25hbWUpOgogICAgICAgICAgICAgcmV0dXJuICgibWV0ZXJiYW5kIiwgIk9GTWV0ZXJCYW5kIikKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIHJldHVybiAoIiIsIE5vbmUpCkBAIC0xODgsMTAgKzIzOCwxNyBAQAogICAgICAgICByZXR1cm4gc2VsZi5uYW1lIGluIG1vZGVsLnZpcnR1YWxfaW50ZXJmYWNlcwogCiAgICAgQHByb3BlcnR5CisgICAgZGVmIGlzX3VuaXZlcnNhbChzZWxmKToKKyAgICAgICAgcmV0dXJuIGxlbihzZWxmLmFsbF92ZXJzaW9ucykgPT0gbGVuKG1vZGVsLnZlcnNpb25zKQorCisgICAgQHByb3BlcnR5CiAgICAgQG1lbW9pemUKICAgICBkZWYgYWxsX3ZlcnNpb25zKHNlbGYpOgogICAgICAgICByZXR1cm4gc2VsZi52ZXJzaW9uX21hcC5rZXlzKCkKIAorICAgIGRlZiBoYXNfdmVyc2lvbihzZWxmLCB2ZXJzaW9uKToKKyAgICAgICAgcmV0dXJuIHZlcnNpb24gaW4gc2VsZi52ZXJzaW9uX21hcAorCiAgICAgZGVmIHZlcnNpb25lZF9jbGFzcyhzZWxmLCB2ZXJzaW9uKToKICAgICAgICAgcmV0dXJuIEphdmFPRkNsYXNzKHNlbGYsIHZlcnNpb24sIHNlbGYudmVyc2lvbl9tYXBbdmVyc2lvbl0pCiAKQEAgLTIxOCwxMiArMjc1LDIyIEBACiAgICAgICAgIHNlbGYudmVyc2lvbiA9IHZlcnNpb24KICAgICAgICAgc2VsZi5jb25zdGFudF9uYW1lID0gc2VsZi5jX25hbWUudXBwZXIoKS5yZXBsYWNlKCJPRl8iLCAiIikKICAgICAgICAgc2VsZi5wYWNrYWdlID0gIm9yZy5vcGVuZmxvdy5wcm90b2NvbC52ZXIlcyIgJSB2ZXJzaW9uLm9mX3ZlcnNpb24KKyAgICAgICAgc2VsZi5nZW5lcmF0ZWQgPSBGYWxzZQorCisgICAgQHByb3BlcnR5CisgICAgQG1lbW9pemUKKyAgICBkZWYgdW5pdF90ZXN0KHNlbGYpOgorICAgICAgICByZXR1cm4gSmF2YVVuaXRUZXN0KHNlbGYpCiAKICAgICBAcHJvcGVydHkKICAgICBkZWYgbmFtZShzZWxmKToKICAgICAgICAgcmV0dXJuICIlc1ZlciVzIiAlIChzZWxmLmludGVyZmFjZS5uYW1lLCBzZWxmLnZlcnNpb24ub2ZfdmVyc2lvbikKIAogICAgIEBwcm9wZXJ0eQorICAgIGRlZiB2YXJpYWJsZV9uYW1lKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5uYW1lWzM6XQorCisgICAgQHByb3BlcnR5CiAgICAgZGVmIGxlbmd0aChzZWxmKToKICAgICAgICAgaWYgc2VsZi5pc19maXhlZF9sZW5ndGg6CiAgICAgICAgICAgICByZXR1cm4gc2VsZi5taW5fbGVuZ3RoCkBAIC0yODcsNiArMzU0LDEwIEBACiAgICAgZGVmIGlzX2V4dGVuc2lvbihzZWxmKToKICAgICAgICAgcmV0dXJuIHR5cGVfbWFwcy5tZXNzYWdlX2lzX2V4dGVuc2lvbihzZWxmLmNfbmFtZSwgLTEpCiAKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgYWxpZ24oc2VsZik6CisgICAgICAgIHJldHVybiBpbnQoc2VsZi5pcl9jbGFzcy5wYXJhbXNbJ2FsaWduJ10pIGlmICdhbGlnbicgaW4gc2VsZi5pcl9jbGFzcy5wYXJhbXMgZWxzZSAwCisKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAjIyMgTWVtYmVyCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpAQCAtNDAzLDcgKzQ3NCw3IEBACiAgICAgICAgIGlmIGhhc2F0dHIoc2VsZi5tZW1iZXIsICJsZW5ndGgiKToKICAgICAgICAgICAgIHJldHVybiBzZWxmLm1lbWJlci5sZW5ndGgKICAgICAgICAgZWxzZToKLSAgICAgICAgICAgIGNvdW50LCBiYXNlID0gdXRpbHMudHlwZV9kZWNfdG9fY291bnRfYmFzZShzZWxmLm1lbWJlci50eXBlKQorICAgICAgICAgICAgY291bnQsIGJhc2UgPSBsb3hpX3V0aWxzLnR5cGVfZGVjX3RvX2NvdW50X2Jhc2Uoc2VsZi5tZW1iZXIudHlwZSkKICAgICAgICAgICAgIHJldHVybiBvZl9nLm9mX2Jhc2VfdHlwZXNbYmFzZV1bJ2J5dGVzJ10gKiBjb3VudAogCiAgICAgQHN0YXRpY21ldGhvZApAQCAtNDQxLDIyICs1MTIsNzIgQEAKICAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgICByZXR1cm4gKHNlbGYubmFtZSwpID09IChvdGhlci5uYW1lLCkKIAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIFVuaXQgVGVzdAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworY2xhc3MgSmF2YVVuaXRUZXN0KG9iamVjdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGphdmFfY2xhc3MpOgorICAgICAgICBzZWxmLmphdmFfY2xhc3MgPSBqYXZhX2NsYXNzCisgICAgICAgIHNlbGYuZGF0YV9maWxlX25hbWUgPSAib2Z7dmVyc2lvbn0ve25hbWV9LmRhdGEiLmZvcm1hdCh2ZXJzaW9uPWphdmFfY2xhc3MudmVyc2lvbi5vZl92ZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPWphdmFfY2xhc3MuY19uYW1lWzM6XSkKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgcGFja2FnZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuamF2YV9jbGFzcy5wYWNrYWdlCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgbmFtZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuamF2YV9jbGFzcy5uYW1lICsgIlRlc3QiCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgaGFzX3Rlc3RfZGF0YShzZWxmKToKKyAgICAgICAgcmV0dXJuIHRlc3RfZGF0YS5leGlzdHMoc2VsZi5kYXRhX2ZpbGVfbmFtZSkKKworICAgIEBwcm9wZXJ0eQorICAgIEBtZW1vaXplCisgICAgZGVmIHRlc3RfZGF0YShzZWxmKToKKyAgICAgICAgcmV0dXJuIHRlc3RfZGF0YS5yZWFkKHNlbGYuZGF0YV9maWxlX25hbWUpCisKKwogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICMjIyBFbnVtcwogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIAogY2xhc3MgSmF2YUVudW0ob2JqZWN0KToKLSAgICBkZWYgX19pbml0X18oc2VsZiwgY19uYW1lLCBlbnRyeV92ZXJzaW9uX3ZhbHVlX21hcCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGNfbmFtZSwgdmVyc2lvbl9lbnVtX21hcCk6CiAgICAgICAgIHNlbGYuY19uYW1lID0gY19uYW1lCiAgICAgICAgIHNlbGYubmFtZSAgID0gIk9GIiArIGphdmFfdHlwZS5uYW1lX2NfdG9fY2Fwc19jYW1lbCgiXyIuam9pbihjX25hbWUuc3BsaXQoIl8iKVsxOl0pKQogCiAgICAgICAgICMgUG9ydF9mZWF0dXJlcyBoYXMgY29uc3RhbnRzIHRoYXQgc3RhcnQgd2l0aCBkaWdpdHMKICAgICAgICAgc2VsZi5uYW1lX3ByZWZpeCA9ICJQRl8iIGlmIHNlbGYubmFtZSA9PSAiT0ZQb3J0RmVhdHVyZXMiIGVsc2UgIiIKIAorICAgICAgICBzZWxmLnZlcnNpb25fZW51bXMgPSB2ZXJzaW9uX2VudW1fbWFwCisKKyAgICAgICAgZW50cnlfbmFtZV92ZXJzaW9uX3ZhbHVlX21hcCA9IE9yZGVyZWREZWZhdWx0RGljdChsYW1iZGE6IE9yZGVyZWREaWN0KCkpCisgICAgICAgIGZvciB2ZXJzaW9uLCBpcl9lbnVtIGluIHZlcnNpb25fZW51bV9tYXAuaXRlbXMoKToKKyAgICAgICAgICAgIGZvciBpcl9lbnRyeSBpbiBpcl9lbnVtLmVudHJpZXM6CisgICAgICAgICAgICAgICAgaWYgInZpcnR1YWwiIGluIGlyX2VudHJ5LnBhcmFtczoKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBlbnRyeV9uYW1lX3ZlcnNpb25fdmFsdWVfbWFwW2lyX2VudHJ5Lm5hbWVdW3ZlcnNpb25dID0gaXJfZW50cnkudmFsdWUKKwogICAgICAgICBzZWxmLmVudHJpZXMgPSBbIEphdmFFbnVtRW50cnkoc2VsZiwgbmFtZSwgdmVyc2lvbl92YWx1ZV9tYXApCi0gICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChuYW1lLCB2ZXJzaW9uX3ZhbHVlX21hcCkgaW4gZW50cnlfdmVyc2lvbl92YWx1ZV9tYXAuaXRlbXMoKSBdCisgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChuYW1lLCB2ZXJzaW9uX3ZhbHVlX21hcCkgaW4gZW50cnlfbmFtZV92ZXJzaW9uX3ZhbHVlX21hcC5pdGVtcygpIF0KKworICAgICAgICBzZWxmLmVudHJpZXMgPSBbIGUgZm9yIGUgaW4gc2VsZi5lbnRyaWVzIGlmIGUubmFtZSBub3QgaW4gbW9kZWwuZW51bV9lbnRyeV9ibGFja2xpc3Rbc2VsZi5uYW1lXSBdCiAgICAgICAgIHNlbGYucGFja2FnZSA9ICJvcmcub3BlbmZsb3cucHJvdG9jb2wiCiAKKyAgICBkZWYgd2lyZV90eXBlKHNlbGYsIHZlcnNpb24pOgorICAgICAgICBpcl9lbnVtID0gc2VsZi52ZXJzaW9uX2VudW1zW3ZlcnNpb25dCisgICAgICAgIGlmICJ3aXJlX3R5cGUiIGluIGlyX2VudW0ucGFyYW1zOgorICAgICAgICAgICAgcmV0dXJuIGphdmFfdHlwZS5jb252ZXJ0X2VudW1fd2lyZV90eXBlX3RvX2p0eXBlKGlyX2VudW0ucGFyYW1zWyJ3aXJlX3R5cGUiXSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBqYXZhX3R5cGUudTgKKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiB2ZXJzaW9ucyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYudmVyc2lvbl9lbnVtcy5rZXlzKCkKKwogICAgIEBtZW1vaXplCiAgICAgZGVmIGVudHJ5X2J5X25hbWUoc2VsZiwgbmFtZSk6CiAgICAgICAgIHRyeToKQEAgLTQ4MSwxMSArNjAyLDE4IEBACiAjIHZhbHVlczogTWFwIEphdmFWZXJzaW9uLT5WYWx1ZQogY2xhc3MgSmF2YUVudW1FbnRyeShvYmplY3QpOgogICAgIGRlZiBfX2luaXRfXyhzZWxmLCBlbnVtLCBuYW1lLCB2YWx1ZXMpOgorICAgICAgICBzZWxmLmVudW0gPSBlbnVtCiAgICAgICAgIHNlbGYubmFtZSA9IGVudW0ubmFtZV9wcmVmaXggKyAiXyIuam9pbihuYW1lLnNwbGl0KCJfIilbMTpdKS51cHBlcigpCiAgICAgICAgIHNlbGYudmFsdWVzID0gdmFsdWVzCiAKKyAgICBkZWYgaGFzX3ZhbHVlKHNlbGYsIHZlcnNpb24pOgorICAgICAgICByZXR1cm4gdmVyc2lvbiBpbiBzZWxmLnZhbHVlcworCiAgICAgZGVmIHZhbHVlKHNlbGYsIHZlcnNpb24pOgotICAgICAgICByZXMgPSBzZWxmLnZlcnNpb25fdmFsdWVfbWFwW3ZlcnNpb25dCisgICAgICAgIHJldHVybiBzZWxmLnZhbHVlc1t2ZXJzaW9uXQorCisgICAgZGVmIGZvcm1hdF92YWx1ZShzZWxmLCB2ZXJzaW9uKToKKyAgICAgICAgcmVzID0gc2VsZi5lbnVtLndpcmVfdHlwZSh2ZXJzaW9uKS5mb3JtYXRfdmFsdWUoc2VsZi52YWx1ZXNbdmVyc2lvbl0pCiAgICAgICAgIHJldHVybiByZXMKIAogICAgIGRlZiBhbGxfdmFsdWVzKHNlbGYsIHZlcnNpb25zLCBub3RfcHJlc2VudD1Ob25lKToKZGlmZiAtLWdpdCBhL2phdmFfZ2VuL2phdmFfdHlwZS5weSBiL2phdmFfZ2VuL2phdmFfdHlwZS5weQppbmRleCA4NTgwZjM3Li43NWJkZTAxIDEwMDY0NAotLS0gYS9qYXZhX2dlbi9qYXZhX3R5cGUucHkKKysrIGIvamF2YV9nZW4vamF2YV90eXBlLnB5CkBAIC0yMSwxOSArMjEsMTkgQEAKICAgICAgICAgcmV0dXJuIGNhbWVsCiAKIAotQU5ZID0gMHhGRkZGRkZGRkZGRkZGRkZGCitqYXZhX3ByaW1pdGl2ZV90eXBlcyA9IHNldCgiYnl0ZSBjaGFyIHNob3J0IGludCBsb25nIi5zcGxpdCgiICIpKQogCitBTlkgPSAweEZGRkZGRkZGRkZGRkZGRkYKIAogY2xhc3MgVmVyc2lvbk9wOgogICAgIGRlZiBfX2luaXRfXyhzZWxmLCB2ZXJzaW9uPUFOWSwgcmVhZD1Ob25lLCB3cml0ZT1Ob25lKToKICAgICAgICAgc2VsZi52ZXJzaW9uID0gdmVyc2lvbgogICAgICAgICBzZWxmLnJlYWQgPSByZWFkCiAgICAgICAgIHNlbGYud3JpdGUgPSB3cml0ZQotICAgICAgICAKKwogICAgIGRlZiBfX3N0cl9fKHNlbGYpOgogICAgICAgICByZXR1cm4gIltWZXJzaW9uOiAlZCwgUmVhZDogJyVzJywgV3JpdGU6ICclcyddIiAlIChzZWxmLnZlcnNpb24sIHNlbGYucmVhZCwgc2VsZi53cml0ZSkKIAotCiBjbGFzcyBKVHlwZShvYmplY3QpOgogICAgICIiIiBXcmFwcGVyIGNsYXNzIHRvIGhvbGQgQyB0byBKYXZhIHR5cGUgY29udmVyc2lvbiBpbmZvcm1hdGlvbiAiIiIKICAgICBkZWYgX19pbml0X18oc2VsZiwgcHViX3R5cGUsIHByaXZfdHlwZT1Ob25lLCBzaXplPU5vbmUsIHJlYWRfb3A9Tm9uZSwgd3JpdGVfb3A9Tm9uZSk6CkBAIC00NCw5ICs0NCw5IEBACiAgICAgICAgIHNlbGYuc2l6ZSA9IHNpemUgICAgICAgICAgICAjIGJ5dGVzIG9uIHRoZSB3aXJlOyBOb25lID09IHZhcmlhYmxlIGxlbmd0aCBvciBoYXJkIHRvIGNhbGMKICAgICAgICAgc2VsZi5vcHMgPSB7fQogIyAgICAgICAgaWYgcmVhZF9vcCBpcyBOb25lOgotIyAgICAgICAgICAgIHJlYWRfb3AgPSAnQ2hhbm5lbFV0aWxzLnJlYWQlcyhiYiknICUgc2VsZi5wdWJfdHlwZQorIyAgICAgICAgICAgIHJlYWRfb3AgPSAnQ2hhbm5lbFV0aWxzVmVyJHZlcnNpb24ucmVhZCVzKGJiKScgJSBzZWxmLnB1Yl90eXBlCiAjICAgICAgICBpZiB3cml0ZV9vcCBpcyBOb25lOgotIyAgICAgICAgICAgIHdyaXRlX29wID0gJ0NoYW5uZWxVdGlscy53cml0ZSVzKGJiLCAkbmFtZSknICAlIHNlbGYucHViX3R5cGUKKyMgICAgICAgICAgICB3cml0ZV9vcCA9ICdDaGFubmVsVXRpbHNWZXIkdmVyc2lvbi53cml0ZSVzKGJiLCAkbmFtZSknICAlIHNlbGYucHViX3R5cGUKICMgICAgICAgIHNlbGYuX3JlYWRfb3AgPSByZWFkX29wCiAjICAgICAgICBzZWxmLl93cml0ZV9vcCA9IHdyaXRlX29wCiAKQEAgLTU0LDYgKzU0LDIxIEBACiAgICAgICAgIHNlbGYub3BzW3ZlcnNpb25dID0gVmVyc2lvbk9wKHZlcnNpb24sIHJlYWQsIHdyaXRlKQogICAgICAgICByZXR1cm4gc2VsZgogCisgICAgZGVmIGNhc3Qoc2VsZiwgbWluKToKKyAgICAgICAgIiIiIGRlY2xhcmVzIHRoYXQgdGhlIHZhbHVlIGhhcyB0byBiZSBjYXN0IHRvIGl0c2VsZiBmb3IgdmFsdWVzID49IG1pbi4KKyAgICAgICAgICAgIFRoaXMgaXMgdG8gZGVhbCB3aXRoIEphdmEgc2lnbmVkbmVzcyAiIiIKKyAgICAgICAgZGVmIGZvcm1hdF9jYXN0X3ZhbHVlKHZhbHVlKToKKyAgICAgICAgICAgIGlmIHZhbHVlID49IG1pbjoKKyAgICAgICAgICAgICAgICByZXR1cm4gIiglcykgMHgleCIgJSAoc2VsZi5wdWJfdHlwZSwgdmFsdWUpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJldHVybiAiMHgleCIgJSAodmFsdWUpCisKKyAgICAgICAgc2VsZi5mb3JtYXRfdmFsdWUgPSBmb3JtYXRfY2FzdF92YWx1ZQorICAgICAgICByZXR1cm4gc2VsZgorCisgICAgZGVmIGZvcm1hdF92YWx1ZShzZWxmLCB2YWx1ZSk6CisgICAgICAgIHJldHVybiB2YWx1ZQorCiAgICAgQHByb3BlcnR5CiAgICAgZGVmIHB1YmxpY190eXBlKHNlbGYpOgogICAgICAgICAiIiIgcmV0dXJuIHRoZSBwdWJsaWMgdHlwZSAiIiIKQEAgLTc0LDExICs4OSwxMSBAQAogICAgICAgICB2ZXIgPSBBTlkgaWYgdmVyc2lvbiBpcyBOb25lIGVsc2UgdmVyc2lvbi5pbnRfdmVyc2lvbgogICAgICAgICBfcmVhZF9vcCA9IE5vbmUKICAgICAgICAgaWYgdmVyIGluIHNlbGYub3BzOgotICAgICAgICAgICAgX3JlYWRfb3AgPSBzZWxmLm9wc1t2ZXJdLnJlYWQgb3Igc2VsZi5vcHNbQU5ZXS5yZWFkIAorICAgICAgICAgICAgX3JlYWRfb3AgPSBzZWxmLm9wc1t2ZXJdLnJlYWQgb3Igc2VsZi5vcHNbQU5ZXS5yZWFkCiAgICAgICAgIGVsaWYgQU5ZIGluIHNlbGYub3BzOgogICAgICAgICAgICAgX3JlYWRfb3AgPSBzZWxmLm9wc1tBTlldLnJlYWQKICAgICAgICAgaWYgX3JlYWRfb3AgaXMgTm9uZToKLSAgICAgICAgICAgIF9yZWFkX29wID0gJ0NoYW5uZWxVdGlscy5yZWFkJXMoYmIpJyAlIHNlbGYucHViX3R5cGUKKyAgICAgICAgICAgIF9yZWFkX29wID0gJ0NoYW5uZWxVdGlsc1ZlciR2ZXJzaW9uLnJlYWQlcyhiYiknICUgc2VsZi5wdWJfdHlwZQogICAgICAgICBpZiBjYWxsYWJsZShfcmVhZF9vcCk6CiAgICAgICAgICAgICByZXR1cm4gX3JlYWRfb3AodmVyc2lvbikKICAgICAgICAgZWxzZToKQEAgLTkyLDE0ICsxMDcsMjEgQEAKICAgICAgICAgZWxpZiBBTlkgaW4gc2VsZi5vcHM6CiAgICAgICAgICAgICBfd3JpdGVfb3AgPSBzZWxmLm9wc1tBTlldLndyaXRlCiAgICAgICAgIGlmIF93cml0ZV9vcCBpcyBOb25lOgotICAgICAgICAgICAgX3dyaXRlX29wID0gJ0NoYW5uZWxVdGlscy53cml0ZSVzKGJiLCAkbmFtZSknICUgc2VsZi5wdWJfdHlwZQorICAgICAgICAgICAgX3dyaXRlX29wID0gJ0NoYW5uZWxVdGlsc1ZlciR2ZXJzaW9uLndyaXRlJXMoYmIsICRuYW1lKScgJSBzZWxmLnB1Yl90eXBlCiAgICAgICAgIGlmIGNhbGxhYmxlKF93cml0ZV9vcCk6CiAgICAgICAgICAgICByZXR1cm4gX3dyaXRlX29wKHZlcnNpb24sIG5hbWUpCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICByZXR1cm4gX3dyaXRlX29wLnJlcGxhY2UoIiRuYW1lIiwgc3RyKG5hbWUpKS5yZXBsYWNlKCIkdmVyc2lvbiIsIHZlcnNpb24ub2ZfdmVyc2lvbikKIAotaGVsbG9fZWxlbV9saXN0ID0gSlR5cGUoIkxpc3Q8T0ZIZWxsb0VsZW1lbnQ+IikgXAotICAgICAgICAub3AocmVhZD0nQ2hhbm5lbFV0aWxzLnJlYWRIZWxsb0VsZW1lbnRMaXN0KGJiKScsIHdyaXRlPSdDaGFubmVsVXRpbHMud3JpdGVIZWxsb0VsZW1lbnRMaXN0KGJiKScpCisgICAgQHByb3BlcnR5CisgICAgZGVmIGlzX3ByaW1pdGl2ZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYucHViX3R5cGUgaW4gamF2YV9wcmltaXRpdmVfdHlwZXMKKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiBpc19hcnJheShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYucHViX3R5cGUuZW5kc3dpdGgoIltdIikKKworCiB1OCA9ICBKVHlwZSgnYnl0ZScsICBzaXplPTEpIFwKICAgICAgICAgLm9wKHJlYWQ9J2JiLnJlYWRCeXRlKCknLCB3cml0ZT0nYmIud3JpdGVCeXRlKCRuYW1lKScpCiB1OF9saXN0ID0gIEpUeXBlKCdMaXN0PFU4PicsICBzaXplPTEpIFwKQEAgLTExNiw0MiArMTM4LDQyIEBACiAgICAgICAgICAub3AodmVyc2lvbj0xLCByZWFkPSJPRlBvcnQucmVhZDJCeXRlcyhiYikiLCB3cml0ZT0iJG5hbWUud3JpdGUyQnl0ZXMoYmIpIikgXAogICAgICAgICAgLm9wKHZlcnNpb249QU5ZLCByZWFkPSJPRlBvcnQucmVhZDRCeXRlcyhiYikiLCB3cml0ZT0iJG5hbWUud3JpdGU0Qnl0ZXMoYmIpIikKIG9uZV9ieXRlX2FycmF5ID0gSlR5cGUoJ2J5dGVbXScsIHNpemU9MSkgXAotICAgICAgICAub3AocmVhZD0nQ2hhbm5lbFV0aWxzLnJlYWRCeXRlcyhiYiwgMSknLCB3cml0ZT0nQ2hhbm5lbFV0aWxzLndyaXRlQnl0ZXMoYmIsICRuYW1lKScpCisgICAgICAgIC5vcChyZWFkPSdDaGFubmVsVXRpbHNWZXIkdmVyc2lvbi5yZWFkQnl0ZXMoYmIsIDEpJywgd3JpdGU9J0NoYW5uZWxVdGlsc1ZlciR2ZXJzaW9uLndyaXRlQnl0ZXMoYmIsICRuYW1lKScpCiB0d29fYnl0ZV9hcnJheSA9IEpUeXBlKCdieXRlW10nLCBzaXplPTIpIFwKLSAgICAgICAgLm9wKHJlYWQ9J0NoYW5uZWxVdGlscy5yZWFkQnl0ZXMoYmIsIDIpJywgd3JpdGU9J0NoYW5uZWxVdGlscy53cml0ZUJ5dGVzKGJiLCAkbmFtZSknKQorICAgICAgICAub3AocmVhZD0nQ2hhbm5lbFV0aWxzVmVyJHZlcnNpb24ucmVhZEJ5dGVzKGJiLCAyKScsIHdyaXRlPSdDaGFubmVsVXRpbHNWZXIkdmVyc2lvbi53cml0ZUJ5dGVzKGJiLCAkbmFtZSknKQogdGhyZWVfYnl0ZV9hcnJheSA9IEpUeXBlKCdieXRlW10nLCBzaXplPTMpIFwKLSAgICAgICAgLm9wKHJlYWQ9J0NoYW5uZWxVdGlscy5yZWFkQnl0ZXMoYmIsIDMpJywgd3JpdGU9J0NoYW5uZWxVdGlscy53cml0ZUJ5dGVzKGJiLCAkbmFtZSknKQorICAgICAgICAub3AocmVhZD0nQ2hhbm5lbFV0aWxzVmVyJHZlcnNpb24ucmVhZEJ5dGVzKGJiLCAzKScsIHdyaXRlPSdDaGFubmVsVXRpbHNWZXIkdmVyc2lvbi53cml0ZUJ5dGVzKGJiLCAkbmFtZSknKQogZm91cl9ieXRlX2FycmF5ID0gSlR5cGUoJ2J5dGVbXScsIHNpemU9NCkgXAotICAgICAgICAub3AocmVhZD0nQ2hhbm5lbFV0aWxzLnJlYWRCeXRlcyhiYiwgNCknLCB3cml0ZT0nQ2hhbm5lbFV0aWxzLndyaXRlQnl0ZXMoYmIsICRuYW1lKScpCisgICAgICAgIC5vcChyZWFkPSdDaGFubmVsVXRpbHNWZXIkdmVyc2lvbi5yZWFkQnl0ZXMoYmIsIDQpJywgd3JpdGU9J0NoYW5uZWxVdGlsc1ZlciR2ZXJzaW9uLndyaXRlQnl0ZXMoYmIsICRuYW1lKScpCiBmaXZlX2J5dGVfYXJyYXkgPSBKVHlwZSgnYnl0ZVtdJywgc2l6ZT01KSBcCi0gICAgICAgIC5vcChyZWFkPSdDaGFubmVsVXRpbHMucmVhZEJ5dGVzKGJiLCA1KScsIHdyaXRlPSdDaGFubmVsVXRpbHMud3JpdGVCeXRlcyhiYiwgJG5hbWUpJykKKyAgICAgICAgLm9wKHJlYWQ9J0NoYW5uZWxVdGlsc1ZlciR2ZXJzaW9uLnJlYWRCeXRlcyhiYiwgNSknLCB3cml0ZT0nQ2hhbm5lbFV0aWxzVmVyJHZlcnNpb24ud3JpdGVCeXRlcyhiYiwgJG5hbWUpJykKIHNpeF9ieXRlX2FycmF5ID0gSlR5cGUoJ2J5dGVbXScsIHNpemU9NikgXAotICAgICAgICAub3AocmVhZD0nQ2hhbm5lbFV0aWxzLnJlYWRCeXRlcyhiYiwgNiknLCB3cml0ZT0nQ2hhbm5lbFV0aWxzLndyaXRlQnl0ZXMoYmIsICRuYW1lKScpCisgICAgICAgIC5vcChyZWFkPSdDaGFubmVsVXRpbHNWZXIkdmVyc2lvbi5yZWFkQnl0ZXMoYmIsIDYpJywgd3JpdGU9J0NoYW5uZWxVdGlsc1ZlciR2ZXJzaW9uLndyaXRlQnl0ZXMoYmIsICRuYW1lKScpCiBzZXZlbl9ieXRlX2FycmF5ID0gSlR5cGUoJ2J5dGVbXScsIHNpemU9NykgXAotICAgICAgICAub3AocmVhZD0nQ2hhbm5lbFV0aWxzLnJlYWRCeXRlcyhiYiwgNyknLCB3cml0ZT0nQ2hhbm5lbFV0aWxzLndyaXRlQnl0ZXMoYmIsICRuYW1lKScpCi1hY3Rpb25zX2xpc3QgPSBKVHlwZSgnTGlzdDxPRkFjdGlvbj4nLCBzaXplPSdDaGFubmVsVXRpbHMuY2FsY0xpc3RTaXplKCRuYW1lKScpIFwKLSAgICAgICAgLm9wKHJlYWQ9J0NoYW5uZWxVdGlscy5yZWFkQWN0aW9uc0xpc3QoYmIsICRsZW5ndGgpJywgd3JpdGU9J0NoYW5uZWxVdGlscy53cml0ZUFjdGlvbnNMaXN0KGJiLCAkbmFtZSk7JykKLWluc3RydWN0aW9uc19saXN0ID0gSlR5cGUoJ0xpc3Q8T0ZJbnN0cnVjdGlvbj4nLCBzaXplPSdDaGFubmVsVXRpbHMuY2FsY0xpc3RTaXplKCRuYW1lKScpIFwKLSAgICAgICAgLm9wKHJlYWQ9J0NoYW5uZWxVdGlscy5yZWFkSW5zdHJ1Y3Rpb25zTGlzdChiYiwgJGxlbmd0aCknLCBcCi0gICAgICAgICAgICB3cml0ZT0nQ2hhbm5lbFV0aWxzLndyaXRlTGlzdChiYiwgJG5hbWUpJykKLWJ1Y2tldHNfbGlzdCA9IEpUeXBlKCdMaXN0PE9GQnVja2V0PicsIHNpemU9J0NoYW5uZWxVdGlscy5jYWxjTGlzdFNpemUoJG5hbWUpJykgXAotICAgICAgICAub3AocmVhZD0nQ2hhbm5lbFV0aWxzLnJlYWRCdWNrZXRMaXN0KGJiLCAkbGVuZ3RoKScsIFwKLSAgICAgICAgICAgIHdyaXRlPSdDaGFubmVsVXRpbHMud3JpdGVMaXN0KGJiLCAkbmFtZSknKQotcG9ydF9kZXNjX2xpc3QgPSBKVHlwZSgnTGlzdDxPRlBoeXNpY2FsUG9ydD4nLCBzaXplPSdDaGFubmVsVXRpbHMuY2FsY0xpc3RTaXplKCRuYW1lKScpIFwKLSAgICAgICAgLm9wKHJlYWQ9J0NoYW5uZWxVdGlscy5yZWFkUGh5c2ljYWxQb3J0TGlzdChiYiwgJGxlbmd0aCknLCBcCi0gICAgICAgICAgICB3cml0ZT0nQ2hhbm5lbFV0aWxzLndyaXRlTGlzdChiYiwgJG5hbWUpJykKKyAgICAgICAgLm9wKHJlYWQ9J0NoYW5uZWxVdGlsc1ZlciR2ZXJzaW9uLnJlYWRCeXRlcyhiYiwgNyknLCB3cml0ZT0nQ2hhbm5lbFV0aWxzVmVyJHZlcnNpb24ud3JpdGVCeXRlcyhiYiwgJG5hbWUpJykKK2FjdGlvbnNfbGlzdCA9IEpUeXBlKCdMaXN0PE9GQWN0aW9uPicsIHNpemU9J0NoYW5uZWxVdGlsc1ZlciR2ZXJzaW9uLmNhbGNMaXN0U2l6ZSgkbmFtZSknKSBcCisgICAgICAgIC5vcChyZWFkPSdDaGFubmVsVXRpbHNWZXIkdmVyc2lvbi5yZWFkQWN0aW9uc0xpc3QoYmIsICRsZW5ndGgpJywgd3JpdGU9J0NoYW5uZWxVdGlsc1ZlciR2ZXJzaW9uLndyaXRlQWN0aW9uc0xpc3QoYmIsICRuYW1lKTsnKQoraW5zdHJ1Y3Rpb25zX2xpc3QgPSBKVHlwZSgnTGlzdDxPRkluc3RydWN0aW9uPicsIHNpemU9J0NoYW5uZWxVdGlsc1ZlciR2ZXJzaW9uLmNhbGNMaXN0U2l6ZSgkbmFtZSknKSBcCisgICAgICAgIC5vcChyZWFkPSdDaGFubmVsVXRpbHNWZXIkdmVyc2lvbi5yZWFkSW5zdHJ1Y3Rpb25zTGlzdChiYiwgJGxlbmd0aCknLCBcCisgICAgICAgICAgICB3cml0ZT0nQ2hhbm5lbFV0aWxzVmVyJHZlcnNpb24ud3JpdGVMaXN0KGJiLCAkbmFtZSknKQorYnVja2V0c19saXN0ID0gSlR5cGUoJ0xpc3Q8T0ZCdWNrZXQ+Jywgc2l6ZT0nQ2hhbm5lbFV0aWxzVmVyJHZlcnNpb24uY2FsY0xpc3RTaXplKCRuYW1lKScpIFwKKyAgICAgICAgLm9wKHJlYWQ9J0NoYW5uZWxVdGlsc1ZlciR2ZXJzaW9uLnJlYWRCdWNrZXRMaXN0KGJiLCAkbGVuZ3RoKScsIFwKKyAgICAgICAgICAgIHdyaXRlPSdDaGFubmVsVXRpbHNWZXIkdmVyc2lvbi53cml0ZUxpc3QoYmIsICRuYW1lKScpCitwb3J0X2Rlc2NfbGlzdCA9IEpUeXBlKCdMaXN0PE9GUGh5c2ljYWxQb3J0PicsIHNpemU9J0NoYW5uZWxVdGlsc1ZlciR2ZXJzaW9uLmNhbGNMaXN0U2l6ZSgkbmFtZSknKSBcCisgICAgICAgIC5vcChyZWFkPSdDaGFubmVsVXRpbHNWZXIkdmVyc2lvbi5yZWFkUGh5c2ljYWxQb3J0TGlzdChiYiwgJGxlbmd0aCknLCBcCisgICAgICAgICAgICB3cml0ZT0nQ2hhbm5lbFV0aWxzVmVyJHZlcnNpb24ud3JpdGVQaHlzaWNhbFBvcnRMaXN0KGJiLCAkbmFtZSknKQogcG9ydF9kZXNjID0gSlR5cGUoJ09GUG9ydERlc2MnLCBzaXplPSckbmFtZS5nZXRMZW5ndGgoKScpIFwKICAgICAgICAgLm9wKHJlYWQ9J251bGw7IC8vIFRPRE8gT0ZQb3J0RGVzY1ZlciR2ZXJzaW9uLlJFQURFUi5yZWFkKGJiKScsIFwKICAgICAgICAgICAgIHdyaXRlPSckbmFtZS53cml0ZVRvKGJiKScpCi1wYWNrZXRfcXVldWVfbGlzdCA9IEpUeXBlKCdMaXN0PE9GUGFja2V0UXVldWU+Jywgc2l6ZT0nQ2hhbm5lbFV0aWxzLmNhbGNMaXN0U2l6ZSgkbmFtZSknKSBcCi0gICAgICAgIC5vcChyZWFkPSdDaGFubmVsVXRpbHMucmVhZFBhY2tldFF1ZXVlTGlzdChiYiwgJGxlbmd0aCknLCBcCi0gICAgICAgICAgICB3cml0ZT0nQ2hhbm5lbFV0aWxzLndyaXRlTGlzdChiYiwgJG5hbWUpJykKK3BhY2tldF9xdWV1ZV9saXN0ID0gSlR5cGUoJ0xpc3Q8T0ZQYWNrZXRRdWV1ZT4nLCBzaXplPSdDaGFubmVsVXRpbHNWZXIkdmVyc2lvbi5jYWxjTGlzdFNpemUoJG5hbWUpJykgXAorICAgICAgICAub3AocmVhZD0nQ2hhbm5lbFV0aWxzVmVyJHZlcnNpb24ucmVhZFBhY2tldFF1ZXVlTGlzdChiYiwgJGxlbmd0aCknLCBcCisgICAgICAgICAgICB3cml0ZT0nQ2hhbm5lbFV0aWxzVmVyJHZlcnNpb24ud3JpdGVMaXN0KGJiLCAkbmFtZSknKQogb2N0ZXRzID0gSlR5cGUoJ2J5dGVbXScsIHNpemU9IiRsZW5ndGgiKSBcCi0gICAgICAgIC5vcChyZWFkPSdDaGFubmVsVXRpbHMucmVhZEJ5dGVzKGJiLCAkbGVuZ3RoKScsIFwKKyAgICAgICAgLm9wKHJlYWQ9J0NoYW5uZWxVdGlsc1ZlciR2ZXJzaW9uLnJlYWRCeXRlcyhiYiwgJGxlbmd0aCknLCBcCiAgICAgICAgICAgICB3cml0ZT0nYmIud3JpdGVCeXRlcygkbmFtZSknKQogb2ZfbWF0Y2ggPSBKVHlwZSgnTWF0Y2gnLCBzaXplPSIkbmFtZS5nZXRMZW5ndGgoKSIpIFwKLSAgICAgICAgLm9wKHJlYWQ9J0NoYW5uZWxVdGlscy5yZWFkT0ZNYXRjaChiYiknLCBcCi0gICAgICAgICAgICB3cml0ZT0nQ2hhbm5lbFV0aWxzLndyaXRlT0ZNYXRjaChiYiwgJG5hbWUpJykKKyAgICAgICAgLm9wKHJlYWQ9J0NoYW5uZWxVdGlsc1ZlciR2ZXJzaW9uLnJlYWRPRk1hdGNoKGJiKScsIFwKKyAgICAgICAgICAgIHdyaXRlPSdDaGFubmVsVXRpbHNWZXIkdmVyc2lvbi53cml0ZU9GTWF0Y2goYmIsICRuYW1lKScpCiBmbG93X21vZF9jbWQgPSBKVHlwZSgnT0ZGbG93TW9kQ29tbWFuZCcsICdzaG9ydCcsIHNpemU9IiRuYW1lLmdldExlbmd0aCgpIikgXAogICAgICAgICAub3AodmVyc2lvbj0xLCByZWFkPSJiYi5yZWFkU2hvcnQoKSIsIHdyaXRlPSJiYi53cml0ZVNob3J0KCRuYW1lKSIpIFwKICAgICAgICAgLm9wKHZlcnNpb249QU5ZLCByZWFkPSJiYi5yZWFkQnl0ZSgpIiwgd3JpdGU9ImJiLndyaXRlQnl0ZSgkbmFtZSkiKQpAQCAtMTU5LDIzICsxODEsMjUgQEAKICAgICAgICAgLm9wKHJlYWQ9Ik1hY0FkZHJlc3MucmVhZDZCeXRlcyhiYikiLCBcCiAgICAgICAgICAgICB3cml0ZT0iJG5hbWUud3JpdGU2Qnl0ZXMoYmIpIikKIHBvcnRfbmFtZSA9IEpUeXBlKCdTdHJpbmcnLCBzaXplPTE2KSBcCi0gICAgICAgIC5vcChyZWFkPSdDaGFubmVsVXRpbHMucmVhZEZpeGVkTGVuZ3RoU3RyaW5nKGJiLCAxNiknLCBcCi0gICAgICAgICAgICB3cml0ZT0nQ2hhbm5lbFV0aWxzLndyaXRlRml4ZWRMZW5ndGhTdHJpbmcoYmIsICRuYW1lLCAxNiknKQorICAgICAgICAub3AocmVhZD0nQ2hhbm5lbFV0aWxzVmVyJHZlcnNpb24ucmVhZEZpeGVkTGVuZ3RoU3RyaW5nKGJiLCAxNiknLCBcCisgICAgICAgICAgICB3cml0ZT0nQ2hhbm5lbFV0aWxzVmVyJHZlcnNpb24ud3JpdGVGaXhlZExlbmd0aFN0cmluZyhiYiwgJG5hbWUsIDE2KScpCiBkZXNjX3N0ciA9IEpUeXBlKCdTdHJpbmcnLCBzaXplPTI1NikgXAotICAgICAgICAub3AocmVhZD0nQ2hhbm5lbFV0aWxzLnJlYWRGaXhlZExlbmd0aFN0cmluZyhiYiwgMjU2KScsIFwKLSAgICAgICAgICAgIHdyaXRlPSdDaGFubmVsVXRpbHMud3JpdGVGaXhlZExlbmd0aFN0cmluZyhiYiwgJG5hbWUsIDI1NiknKQorICAgICAgICAub3AocmVhZD0nQ2hhbm5lbFV0aWxzVmVyJHZlcnNpb24ucmVhZEZpeGVkTGVuZ3RoU3RyaW5nKGJiLCAyNTYpJywgXAorICAgICAgICAgICAgd3JpdGU9J0NoYW5uZWxVdGlsc1ZlciR2ZXJzaW9uLndyaXRlRml4ZWRMZW5ndGhTdHJpbmcoYmIsICRuYW1lLCAyNTYpJykKIHNlcmlhbF9udW0gPSBKVHlwZSgnU3RyaW5nJywgc2l6ZT0zMikgXAotICAgICAgICAub3AocmVhZD0nQ2hhbm5lbFV0aWxzLnJlYWRGaXhlZExlbmd0aFN0cmluZyhiYiwgMzIpJywgXAotICAgICAgICAgICAgd3JpdGU9J0NoYW5uZWxVdGlscy53cml0ZUZpeGVkTGVuZ3RoU3RyaW5nKGJiLCAkbmFtZSwgMzIpJykKKyAgICAgICAgLm9wKHJlYWQ9J0NoYW5uZWxVdGlsc1ZlciR2ZXJzaW9uLnJlYWRGaXhlZExlbmd0aFN0cmluZyhiYiwgMzIpJywgXAorICAgICAgICAgICAgd3JpdGU9J0NoYW5uZWxVdGlsc1ZlciR2ZXJzaW9uLndyaXRlRml4ZWRMZW5ndGhTdHJpbmcoYmIsICRuYW1lLCAzMiknKQogdGFibGVfbmFtZSA9IEpUeXBlKCdTdHJpbmcnLCBzaXplPTMyKSBcCi0gICAgICAgIC5vcChyZWFkPSdDaGFubmVsVXRpbHMucmVhZEZpeGVkTGVuZ3RoU3RyaW5nKGJiLCAzMiknLCBcCi0gICAgICAgICAgICB3cml0ZT0nQ2hhbm5lbFV0aWxzLndyaXRlRml4ZWRMZW5ndGhTdHJpbmcoYmIsICRuYW1lLCAzMiknKQorICAgICAgICAub3AocmVhZD0nQ2hhbm5lbFV0aWxzVmVyJHZlcnNpb24ucmVhZEZpeGVkTGVuZ3RoU3RyaW5nKGJiLCAzMiknLCBcCisgICAgICAgICAgICB3cml0ZT0nQ2hhbm5lbFV0aWxzVmVyJHZlcnNpb24ud3JpdGVGaXhlZExlbmd0aFN0cmluZyhiYiwgJG5hbWUsIDMyKScpCiBpcHY0ID0gSlR5cGUoIklQdjQiKSBcCiAgICAgICAgIC5vcChyZWFkPSJJUHY0LnJlYWQ0Qnl0ZXMoYmIpIiwgXAogICAgICAgICAgICAgd3JpdGU9IiRuYW1lLndyaXRlNEJ5dGVzKGJiKSIpCiBpcHY2ID0gSlR5cGUoIklQdjYiKSBcCiAgICAgICAgIC5vcChyZWFkPSJJUHY2LnJlYWQxNkJ5dGVzKGJiKSIsIFwKICAgICAgICAgICAgIHdyaXRlPSIkbmFtZS53cml0ZTE2Qnl0ZXMoYmIpIikKK3BhY2tldGluX3JlYXNvbiA9IEpUeXBlKCJPRlBhY2tldEluUmVhc29uIilcCisgICAgICAgIC5vcChyZWFkPSJPRlBhY2tldEluUmVhc29uU2VyaWFsaXplclZlciR2ZXJzaW9uLnJlYWRGcm9tKGJiKSIsIHdyaXRlPSJPRlBhY2tldEluUmVhc29uU2VyaWFsaXplclZlciR2ZXJzaW9uLndyaXRlVG8oYmIsICRuYW1lKSIpCiAKIGRlZmF1bHRfbXR5cGVfdG9fanR5cGVfY29udmVydF9tYXAgPSB7CiAgICAgICAgICd1aW50OF90JyA6IHU4LApAQCAtMjEzLDEyICsyMzcsMjMgQEAKIAogIyMgVGhpcyBpcyB3aGVyZSB3ZSBkcm9wIGluIHNwZWNpYWwgY2FzZSBoYW5kbGluZyBmb3IgY2VydGFpbiB0eXBlcwogZXhjZXB0aW9ucyA9IHsKLSAgICAgICAgJ09GUGFja2V0SW4nOiB7Ci0gICAgICAgICAgICAnZGF0YScgOiBvY3RldHMKKyAgICAgICAgJ29mX3BhY2tldF9pbic6IHsKKyAgICAgICAgICAgICdkYXRhJyA6IG9jdGV0cywKKyAgICAgICAgICAgICdyZWFzb24nOiBwYWNrZXRpbl9yZWFzb24KICAgICAgICAgICAgIH0sCiB9CiAKIAorZW51bV93aXJlX3R5cGVzID0geworICAgICAgICAidWludDhfdCI6IEpUeXBlKCJieXRlIikub3AocmVhZD0iYmIucmVhZEJ5dGUoKSIsIHdyaXRlPSJiYi53cml0ZUJ5dGUoJG5hbWUpIikuY2FzdChtaW49MTw8NyksCisgICAgICAgICJ1aW50MTZfdCI6IEpUeXBlKCJzaG9ydCIpLm9wKHJlYWQ9ImJiLnJlYWRTaG9ydCgpIiwgd3JpdGU9ImJiLndyaXRlU2hvcnQoJG5hbWUpIikuY2FzdChtaW49MTw8MTUpLAorICAgICAgICAidWludDMyX3QiOiBKVHlwZSgiaW50Iikub3AocmVhZD0iYmIucmVhZEludCgpIiwgd3JpdGU9ImJiLndyaXRlSW50KCRuYW1lKSIpLmNhc3QobWluPTE8PDMxKSwKKyAgICAgICAgInVpbnQ2NF90IjogSlR5cGUoImxvbmciKS5vcChyZWFkPSJiYi5yZWFkTG9uZygpIiwgd3JpdGU9ImJiLndyaXRlTG9uZygkbmFtZSkiKS5jYXN0KG1pbj0xPDwzMSkKK30KKworZGVmIGNvbnZlcnRfZW51bV93aXJlX3R5cGVfdG9fanR5cGUod2lyZV90eXBlKToKKyAgICByZXR1cm4gZW51bV93aXJlX3R5cGVzW3dpcmVfdHlwZV0KKwogZGVmIG1ha2Vfc3RhbmRhcmRfbGlzdF9qdHlwZShjX3R5cGUpOgogICAgIG0gPSByZS5tYXRjaChyJ2xpc3RcKG9mXyhbYS16QS1aX10rKV90XCknLCBjX3R5cGUpCiAgICAgaWYgbm90IG06CkBAIC0yMjYsOCArMjYxLDggQEAKICAgICBiYXNlX25hbWUgPSBtLmdyb3VwKDEpCiAgICAgamF2YV9iYXNlX25hbWUgPSBuYW1lX2NfdG9fY2Fwc19jYW1lbChiYXNlX25hbWUpCiAgICAgcmV0dXJuIEpUeXBlKCJMaXN0PE9GJXM+IiAlIGphdmFfYmFzZV9uYW1lKSBcCi0gICAgICAgIC5vcChyZWFkPSdDaGFubmVsVXRpbHMucmVhZCVzTGlzdChiYiknICUgamF2YV9iYXNlX25hbWUsIFwKLSAgICAgICAgICAgIHdyaXRlPSdDaGFubmVsVXRpbHMud3JpdGUlc0xpc3QoYmIsICRuYW1lKScgJSBqYXZhX2Jhc2VfbmFtZSkKKyAgICAgICAgLm9wKHJlYWQ9J0NoYW5uZWxVdGlsc1ZlciR2ZXJzaW9uLnJlYWQlc0xpc3QoYmIsICRsZW5ndGgpJyAlIGphdmFfYmFzZV9uYW1lLCBcCisgICAgICAgICAgICB3cml0ZT0nQ2hhbm5lbFV0aWxzVmVyJHZlcnNpb24ud3JpdGUlc0xpc3QoYmIsICRuYW1lKScgJSBqYXZhX2Jhc2VfbmFtZSkKIAogZGVmIGNvbnZlcnRfdG9fanR5cGUob2JqX25hbWUsIGZpZWxkX25hbWUsIGNfdHlwZSk6CiAgICAgIiIiIENvbnZlcnQgZnJvbSBhIEMgdHlwZSAoInVpbnRfMzIiKSB0byBhIGphdmEgdHlwZSAoIlUzMiIpCmRpZmYgLS1naXQgYS9qYXZhX2dlbi9wcmUtd3JpdHRlbi9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZmxvdy9wcm90b2NvbC9PRk1lc3NhZ2UuamF2YSBiL2phdmFfZ2VuL3ByZS13cml0dGVuL3NyYy9tYWluL2phdmEvb3JnL29wZW5mbG93L3Byb3RvY29sL09GTWVzc2FnZS5qYXZhCmluZGV4IGMxZTQ0NTYuLjMyMzE5ZmEgMTAwNjQ0Ci0tLSBhL2phdmFfZ2VuL3ByZS13cml0dGVuL3NyYy9tYWluL2phdmEvb3JnL29wZW5mbG93L3Byb3RvY29sL09GTWVzc2FnZS5qYXZhCisrKyBiL2phdmFfZ2VuL3ByZS13cml0dGVuL3NyYy9tYWluL2phdmEvb3JnL29wZW5mbG93L3Byb3RvY29sL09GTWVzc2FnZS5qYXZhCkBAIC0xLDYgKzEsNiBAQAogcGFja2FnZSBvcmcub3BlbmZsb3cucHJvdG9jb2w7CiAKLXB1YmxpYyBpbnRlcmZhY2UgT0ZNZXNzYWdlIHsKK3B1YmxpYyBpbnRlcmZhY2UgT0ZNZXNzYWdlIGV4dGVuZHMgT0ZPYmplY3QgewogICAgIGludCBnZXRYaWQoKTsKIAogICAgIE9GVHlwZSBnZXRUeXBlKCk7CmRpZmYgLS1naXQgYS9qYXZhX2dlbi9wcmUtd3JpdHRlbi9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZmxvdy9wcm90b2NvbC9PRk1lc3NhZ2VXcml0ZXIuamF2YSBiL2phdmFfZ2VuL3ByZS13cml0dGVuL3NyYy9tYWluL2phdmEvb3JnL29wZW5mbG93L3Byb3RvY29sL09GTWVzc2FnZVdyaXRlci5qYXZhCmluZGV4IDg0ZTU1MDcuLmJjY2ExZmQgMTAwNjQ0Ci0tLSBhL2phdmFfZ2VuL3ByZS13cml0dGVuL3NyYy9tYWluL2phdmEvb3JnL29wZW5mbG93L3Byb3RvY29sL09GTWVzc2FnZVdyaXRlci5qYXZhCisrKyBiL2phdmFfZ2VuL3ByZS13cml0dGVuL3NyYy9tYWluL2phdmEvb3JnL29wZW5mbG93L3Byb3RvY29sL09GTWVzc2FnZVdyaXRlci5qYXZhCkBAIC00LDUgKzQsNSBAQAogaW1wb3J0IG9yZy5vcGVuZmxvdy5leGNlcHRpb25zLk9GUGFyc2VFcnJvcjsKIAogcHVibGljIGludGVyZmFjZSBPRk1lc3NhZ2VXcml0ZXI8VD4gewotICAgIHB1YmxpYyBpbnQgd3JpdGUoQ2hhbm5lbEJ1ZmZlciBiYiwgVCBtZXNzYWdlKSB0aHJvd3MgT0ZQYXJzZUVycm9yOworICAgIHB1YmxpYyB2b2lkIHdyaXRlKENoYW5uZWxCdWZmZXIgYmIsIFQgbWVzc2FnZSkgdGhyb3dzIE9GUGFyc2VFcnJvcjsKIH0KZGlmZiAtLWdpdCBhL2phdmFfZ2VuL3ByZS13cml0dGVuL3NyYy9tYWluL2phdmEvb3JnL29wZW5mbG93L3Byb3RvY29sL09GT2JqZWN0LmphdmEgYi9qYXZhX2dlbi9wcmUtd3JpdHRlbi9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZmxvdy9wcm90b2NvbC9PRk9iamVjdC5qYXZhCmluZGV4IDRhNzU1N2YuLjE0MDE4MmIgMTAwNjQ0Ci0tLSBhL2phdmFfZ2VuL3ByZS13cml0dGVuL3NyYy9tYWluL2phdmEvb3JnL29wZW5mbG93L3Byb3RvY29sL09GT2JqZWN0LmphdmEKKysrIGIvamF2YV9nZW4vcHJlLXdyaXR0ZW4vc3JjL21haW4vamF2YS9vcmcvb3BlbmZsb3cvcHJvdG9jb2wvT0ZPYmplY3QuamF2YQpAQCAtMywxNyArMywxNSBAQAogaW1wb3J0IG9yZy5qYm9zcy5uZXR0eS5idWZmZXIuQ2hhbm5lbEJ1ZmZlcjsKIAogLyoqCi0gKiAgQmFzZSBpbnRlcmZhY2Ugb2YgYWxsIE9wZW5GbG93IG9iamVjdHMgKGUuZy4sIG1lc3NhZ2VzLCBhY3Rpb25zLCBzdGF0cywgZXRjLikKKyAqIEJhc2UgaW50ZXJmYWNlIG9mIGFsbCBPcGVuRmxvdyBvYmplY3RzIChlLmcuLCBtZXNzYWdlcywgYWN0aW9ucywgc3RhdHMsIGV0Yy4pCiAgKgotICogIEFsbCBvYmplY3RzIGhhdmUgYSBsZW5ndGggYW5kIGNhbiBiZSByZWFkIGFuZCB3cml0dGVuIGZyb20gYSBidWZmZXIuCi0gKiAgV2hlbiB3cml0aW5nLCB0aGUgbGVuZ3RoIGZpZWxkIGlzIGR5bmFtaWNhbGx5IHVwZGF0ZWQsIHNvIGl0IG5lZWQgbm90IGJlCi0gKiAgbWFuYWdlZCBtYW51YWxseS4gIEhvd2V2ZXIsIHlvdSBjYW4gb3ZlcnJpZGUgdGhlIGF1dG8gY2FsY3VsYXRlZCBsZW5ndGggd2l0aAotICogIG92ZXJyaWRlTGVuZ3RoKCkgY2FsbCwgaWYsIGZvciBleGFtcGxlLCB5b3Ugd2FudCB0byBpbnRlbnRpb25hbGx5IGNyZWF0ZQotICogIG1hbGZvcm1lZCBwYWNrZXRzLCBmb3IgZXhhbXBsZSwgZm9yIG5lZ2F0aXZlIHRlc3RpbmcuCisgKiBBbGwgb2JqZWN0cyBoYXZlIGEgbGVuZ3RoIGFuZCBjYW4gYmUgcmVhZCBhbmQgd3JpdHRlbiBmcm9tIGEgYnVmZmVyLiBXaGVuCisgKiB3cml0aW5nLCB0aGUgbGVuZ3RoIGZpZWxkIGlzIGR5bmFtaWNhbGx5IHVwZGF0ZWQsIHNvIGl0IG5lZWQgbm90IGJlIG1hbmFnZWQKKyAqIG1hbnVhbGx5LiBIb3dldmVyLCB5b3UgY2FuIG92ZXJyaWRlIHRoZSBhdXRvIGNhbGN1bGF0ZWQgbGVuZ3RoIHdpdGgKKyAqIG92ZXJyaWRlTGVuZ3RoKCkgY2FsbCwgaWYsIGZvciBleGFtcGxlLCB5b3Ugd2FudCB0byBpbnRlbnRpb25hbGx5IGNyZWF0ZQorICogbWFsZm9ybWVkIHBhY2tldHMsIGZvciBleGFtcGxlLCBmb3IgbmVnYXRpdmUgdGVzdGluZy4KICAqLwogCi0KIHB1YmxpYyBpbnRlcmZhY2UgT0ZPYmplY3QgewogICAgIHZvaWQgd3JpdGVUbyhDaGFubmVsQnVmZmVyIGJiKTsKLSAgICBpbnQgZ2V0TGVuZ3RoKCk7CiB9CmRpZmYgLS1naXQgYS9qYXZhX2dlbi9wcmUtd3JpdHRlbi9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZmxvdy9wcm90b2NvbC9XaWxkY2FyZHMuamF2YSBiL2phdmFfZ2VuL3ByZS13cml0dGVuL3NyYy9tYWluL2phdmEvb3JnL29wZW5mbG93L3Byb3RvY29sL1dpbGRjYXJkcy5qYXZhCmluZGV4IDI1YjJjMjEuLmUxOTkzZjUgMTAwNjQ0Ci0tLSBhL2phdmFfZ2VuL3ByZS13cml0dGVuL3NyYy9tYWluL2phdmEvb3JnL29wZW5mbG93L3Byb3RvY29sL1dpbGRjYXJkcy5qYXZhCisrKyBiL2phdmFfZ2VuL3ByZS13cml0dGVuL3NyYy9tYWluL2phdmEvb3JnL29wZW5mbG93L3Byb3RvY29sL1dpbGRjYXJkcy5qYXZhCkBAIC0xLDUgKzEsNjU2IEBACisvKioKKyAqICAgIENvcHlyaWdodCAyMDEzLCBCaWcgU3dpdGNoIE5ldHdvcmtzLCBJbmMuCisgKgorICogICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkKKyAqICAgIG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluCisgKiAgICBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKyAqICAgIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZQorICogICAgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqICAgIHVuZGVyIHRoZSBMaWNlbnNlLgorICoqLworCiBwYWNrYWdlIG9yZy5vcGVuZmxvdy5wcm90b2NvbDsKIAotcHVibGljIGNsYXNzIFdpbGRjYXJkcyB7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bVNldDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlNldDsKIAotfQoraW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuSm9pbmVyOworCisvKioKKyAqIGEgbW9yZSB1c2VyIGZyaWVuZGx5IHJlcHJlc2VudGF0aW9uIG9mIHRoZSB3aWxkY2FyZHMgYml0cyBpbiBhbiBPcGVuRmxvdworICogbWF0Y2guIFRoZSBXaWxkY2FyZHMgb2JqZWN0IGlzCisgKiA8dWw+CisgKiA8bGk+aW1tdXRhYmxlIChpLmUuLCB0aHJlYWRzYWZlKTwvbGk+CisgKiA8bGk+aW5zdGFuY2UgbWFuYWdlZCAoZG9uJ3QgaW5zdGFudGlhdGUgaXQgeW91cnNlbGYpLCBpbnN0ZWFkIGNhbGwgIm9mIjwvbGk+CisgKiA8dWw+CisgKiA8cD4KKyAqIFlvdSBjYW4gY29uc3RydWN0IGEgV2lsZGNhcmQgb2JqZWN0IGZyb20gZWl0aGVyIGl0cyBpbnRlZ2VyIHJlcHJlc2VudGF0aW9uCisgKiA8L3A+CisgKiA8Y29kZT4KKyAqICAgIFdpbGRjYXJkLm9mKDB4MzgyMGUwKTsKKyAqICA8L2NvZGU+CisgKiA8cD4KKyAqIE9yIHN0YXJ0IHdpdGggZWl0aGVyIGFuIGVtcHR5IG9yIGZ1bGwgd2lsZGNhcmQsIGFuZCBzZWxlY3QvdW5zZWxlY3QgZm9vLgorICogPC9wPgorICogPGNvZGU+CisgKiAgV2lsZGNhcmQgdyA9IFdpbGRjYXJkcy5OT05FCisgKiAgICAgICAgICAgICAgICAuc2V0KEZsYWcuRExfU1JDLCBGbGFnLiBETF9EU1QsIEZsYWcuRExfVkxBTl9QQ1ApCisgKiAgICAgICAgICAgICAgICAuc2V0TndEc3RNYXNrKDgpCisgKiAgICAgICAgICAgICAgICAuc2V0TndTcmNNYXNrKDgpOworICogIDwvY29kZT4KKyAqIDxwPgorICogPGI+UmVtZW1iZXI6PC9iPiBXaWxkY2FyZHMgb2JqZWN0cyBhcmUgaW1tdXRhYmxlLiBzZXQuLi4gb3BlcmF0aW9ucyBoYXZlCisgKiA8Yj5OTyBFRkZFQ1Q8L2I+IG9uIHRoZSBjdXJyZW50IHdpbGRjYXJkIG9iamVjdC4gWW91IEhBVkUgdG8gdXNlIHRoZSByZXR1cm5lZAorICogY2hhbmdlZCBvYmplY3QuCisgKiA8L3A+CisgKgorICogQGF1dGhvciBBbmRyZWFzIFd1bmRzYW0gPGFuZHJlYXMud3VuZHNhbUBiaWdzd2l0Y2guY29tPgorICovCitwdWJsaWMgY2xhc3MgV2lsZGNhcmRzIHsKKyAgICBwdWJsaWMgY2xhc3MgT0ZXaWxkY2FyZEZsYWdzIHsKKyAgICAgICAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgT0ZQRldfQUxMID0gKCgxIDw8IDIyKSAtIDEpOworCisgICAgICAgIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IE9GUEZXX0lOX1BPUlQgPSAxIDw8IDA7IC8qIFN3aXRjaCBpbnB1dCBwb3J0LiAqLworICAgICAgICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBPRlBGV19ETF9WTEFOID0gMSA8PCAxOyAvKiBWTEFOIGlkLiAqLworICAgICAgICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBPRlBGV19ETF9TUkMgPSAxIDw8IDI7IC8qIEV0aGVybmV0IHNvdXJjZSBhZGRyZXNzLiAqLworICAgICAgICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBPRlBGV19ETF9EU1QgPSAxIDw8IDM7IC8qCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogRXRoZXJuZXQgZGVzdGluYXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBhZGRyZXNzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBPRlBGV19ETF9UWVBFID0gMSA8PCA0OyAvKiBFdGhlcm5ldCBmcmFtZSB0eXBlLiAqLworICAgICAgICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBPRlBGV19OV19QUk9UTyA9IDEgPDwgNTsgLyogSVAgcHJvdG9jb2wuICovCisgICAgICAgIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IE9GUEZXX1RQX1NSQyA9IDEgPDwgNjsgLyogVENQL1VEUCBzb3VyY2UgcG9ydC4gKi8KKyAgICAgICAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgT0ZQRldfVFBfRFNUID0gMSA8PCA3OyAvKiBUQ1AvVURQIGRlc3RpbmF0aW9uIHBvcnQuICovCisKKyAgICAgICAgLyoKKyAgICAgICAgICogSVAgc291cmNlIGFkZHJlc3Mgd2lsZGNhcmQgYml0IGNvdW50LiAwIGlzIGV4YWN0IG1hdGNoLCAxIGlnbm9yZXMgdGhlCisgICAgICAgICAqIExTQiwgMiBpZ25vcmVzIHRoZSAyIGxlYXN0LXNpZ25pZmljYW50IGJpdHMsIC4uLiwgMzIgYW5kIGhpZ2hlciB3aWxkY2FyZAorICAgICAgICAgKiB0aGUgZW50aXJlIGZpZWxkLiBUaGlzIGlzIHRoZSAqb3Bwb3NpdGUqIG9mIHRoZSB1c3VhbCBjb252ZW50aW9uIHdoZXJlCisgICAgICAgICAqIGUuZy4gLzI0IGluZGljYXRlcyB0aGF0IDggYml0cyAobm90IDI0IGJpdHMpIGFyZSB3aWxkY2FyZGVkLgorICAgICAgICAgKi8KKyAgICAgICAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgT0ZQRldfTldfU1JDX1NISUZUID0gODsKKyAgICAgICAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgT0ZQRldfTldfU1JDX0JJVFMgPSA2OworICAgICAgICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBPRlBGV19OV19TUkNfTUFTSyA9ICgoMSA8PCBPRlBGV19OV19TUkNfQklUUykgLSAxKSA8PCBPRlBGV19OV19TUkNfU0hJRlQ7CisgICAgICAgIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IE9GUEZXX05XX1NSQ19BTEwgPSAzMiA8PCBPRlBGV19OV19TUkNfU0hJRlQ7CisKKyAgICAgICAgLyogSVAgZGVzdGluYXRpb24gYWRkcmVzcyB3aWxkY2FyZCBiaXQgY291bnQuIFNhbWUgZm9ybWF0IGFzIHNvdXJjZS4gKi8KKyAgICAgICAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgT0ZQRldfTldfRFNUX1NISUZUID0gMTQ7CisgICAgICAgIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IE9GUEZXX05XX0RTVF9CSVRTID0gNjsKKyAgICAgICAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgT0ZQRldfTldfRFNUX01BU0sgPSAoKDEgPDwgT0ZQRldfTldfRFNUX0JJVFMpIC0gMSkgPDwgT0ZQRldfTldfRFNUX1NISUZUOworICAgICAgICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBPRlBGV19OV19EU1RfQUxMID0gMzIgPDwgT0ZQRldfTldfRFNUX1NISUZUOworCisgICAgICAgIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IE9GUEZXX0RMX1ZMQU5fUENQID0gMSA8PCAyMDsgLyogVkxBTiBwcmlvcml0eS4gKi8KKyAgICAgICAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgT0ZQRldfTldfVE9TID0gMSA8PCAyMTsgLyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogSVAgVG9TIChEU0NQIGZpZWxkLCA2CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGJpdHMpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICAgICAgICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBPRlBGV19BTExfU0FOSVRJWkVEID0gKCgoMSA8PCAyMikgLSAxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYgfk9GUEZXX05XX1NSQ19NQVNLICYgfk9GUEZXX05XX0RTVF9NQVNLKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBPRlBGV19OV19TUkNfQUxMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IE9GUEZXX05XX0RTVF9BTEw7CisKKworICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgV2lsZGNhcmRzIEZVTEwgPSBuZXcgV2lsZGNhcmRzKE9GV2lsZGNhcmRGbGFncy5PRlBGV19BTExfU0FOSVRJWkVEKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRlVMTF9JTlQgPSBGVUxMLmdldEludCgpOworCisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBXaWxkY2FyZHMgRVhBQ1QgPSBuZXcgV2lsZGNhcmRzKDApOworCisgICAgLy8gZmxvb2RsaWdodCBjb21tb24gY2FzZTogbWF0Y2hlcyBvbiBpbnBvcnQgKyBsMgorICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IElOVF9JTlBPUlRfTDJfTUFUQ0ggPSAweDM4MjBlMDsKKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIFdpbGRjYXJkcyBJTlBPUlRfTDJfTUFUQ0ggPSBuZXcgV2lsZGNhcmRzKAorICAgICAgICAgICAgSU5UX0lOUE9SVF9MMl9NQVRDSCk7CisKKyAgICAvKioKKyAgICAgKiBlbnVtIHR5cGUgZm9yIHRoZSBiaW5hcnkgZmxhZ3MgdGhhdCBjYW4gYmUgc2V0IGluIHRoZSB3aWxkY2FyZHMgZmllbGQgb2YKKyAgICAgKiBhbiBPRldpbGRjYXJkRmxhZ3MuIFJlcGxhY2VzIHRoZSB1bndpZWxkeSBjLWlzaCBpbnQgY29uc3RhbnRzIGluIE9GV2lsZGNhcmRGbGFncy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGVudW0gRmxhZyB7CisgICAgICAgIElOX1BPUlQoT0ZXaWxkY2FyZEZsYWdzLk9GUEZXX0lOX1BPUlQpLCAgLyogU3dpdGNoIGlucHV0IHBvcnQuICovCisgICAgICAgIERMX1ZMQU4oT0ZXaWxkY2FyZEZsYWdzLk9GUEZXX0RMX1ZMQU4pLCAvKiBWTEFOIGlkLiAqLworICAgICAgICBETF9TUkMoT0ZXaWxkY2FyZEZsYWdzLk9GUEZXX0RMX1NSQyksIC8qIEV0aGVybmV0IHNvdXJjZSBhZGRyZXNzLiAqLworICAgICAgICBETF9EU1QoT0ZXaWxkY2FyZEZsYWdzLk9GUEZXX0RMX0RTVCksIC8qIEV0aGVybmV0IGRlc3RpbmF0aW9uIGFkZHIgKi8KKyAgICAgICAgRExfVFlQRShPRldpbGRjYXJkRmxhZ3MuT0ZQRldfRExfVFlQRSksIC8qIEV0aGVybmV0IGZyYW1lIHR5cGUuICovCisgICAgICAgIE5XX1BST1RPKE9GV2lsZGNhcmRGbGFncy5PRlBGV19OV19QUk9UTyksIC8qIElQIHByb3RvY29sLiAqLworICAgICAgICBUUF9TUkMoT0ZXaWxkY2FyZEZsYWdzLk9GUEZXX1RQX1NSQyksIC8qIFRDUC9VRFAgc291cmNlIHBvcnQuICovCisgICAgICAgIFRQX0RTVChPRldpbGRjYXJkRmxhZ3MuT0ZQRldfVFBfRFNUKSwgLyogVENQL1VEUCBkZXN0aW5hdGlvbiBwb3J0LiAqLworICAgICAgICBETF9WTEFOX1BDUChPRldpbGRjYXJkRmxhZ3MuT0ZQRldfRExfVkxBTl9QQ1ApLCAvKiBWTEFOIHByaW9yaXR5LiAqLworICAgICAgICBOV19TUkMoLTEpIHsgLyoKKyAgICAgICAgICAgICAgICAgICAgICAqIHZpcnR1YWwgTldfU1JDIGZsYWcgPT4gdHJhbnNsYXRlcyB0byB0aGUgc3RyYW5nZSA2IGJpdHMKKyAgICAgICAgICAgICAgICAgICAgICAqIGluIHRoZSBoZWFkZXIKKyAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBib29sZWFuIGlzQm9sZWFuKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBpbnQgZ2V0SW50KGludCBmbGFncykgeworICAgICAgICAgICAgICAgIHJldHVybiAoKGZsYWdzICYgT0ZXaWxkY2FyZEZsYWdzLk9GUEZXX05XX1NSQ19NQVNLKSA+PiBPRldpbGRjYXJkRmxhZ3MuT0ZQRldfTldfU1JDX1NISUZUKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBpbnQgc2V0SW50KGludCBmbGFncywgaW50IHNyY01hc2spIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKGZsYWdzICYgfk9GV2lsZGNhcmRGbGFncy5PRlBGV19OV19TUkNfTUFTSykgfCAoc3JjTWFzayA8PCBPRldpbGRjYXJkRmxhZ3MuT0ZQRldfTldfU1JDX1NISUZUKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBpbnQgd2lsZGNhcmQoaW50IGZsYWdzKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZsYWdzICYgfk9GV2lsZGNhcmRGbGFncy5PRlBGV19OV19TUkNfTUFTSzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBpbnQgbWF0Y2hPbihpbnQgZmxhZ3MpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmxhZ3MgfCBPRldpbGRjYXJkRmxhZ3MuT0ZQRldfTldfU1JDX0FMTDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBib29sZWFuIGlzUGFydGlhbGx5T24oaW50IGZsYWdzKSB7CisgICAgICAgICAgICAgICAgaW50IGludFZhbHVlID0gZ2V0SW50KGZsYWdzKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gaW50VmFsdWUgPiAwICYmIGludFZhbHVlIDwgMzI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgYm9vbGVhbiBpc0Z1bGx5T24oaW50IGZsYWdzKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGdldEludChmbGFncykgPj0gMzI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfSwKKyAgICAgICAgTldfRFNUKC0xKSB7IC8qCisgICAgICAgICAgICAgICAgICAgICAgKiB2aXJ0dWFsIE5XX1NSQyBmbGFnID0+IHRyYW5zbGF0ZXMgdG8gdGhlIHN0cmFuZ2UgNiBiaXRzCisgICAgICAgICAgICAgICAgICAgICAgKiBpbiB0aGUgaGVhZGVyCisgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgYm9vbGVhbiBpc0JvbGVhbigpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgaW50IGdldEludChpbnQgZmxhZ3MpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKChmbGFncyAmIE9GV2lsZGNhcmRGbGFncy5PRlBGV19OV19EU1RfTUFTSykgPj4gT0ZXaWxkY2FyZEZsYWdzLk9GUEZXX05XX0RTVF9TSElGVCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgaW50IHNldEludChpbnQgZmxhZ3MsIGludCBzcmNNYXNrKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIChmbGFncyAmIH5PRldpbGRjYXJkRmxhZ3MuT0ZQRldfTldfRFNUX01BU0spIHwgKHNyY01hc2sgPDwgT0ZXaWxkY2FyZEZsYWdzLk9GUEZXX05XX0RTVF9TSElGVCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgaW50IHdpbGRjYXJkKGludCBmbGFncykgeworICAgICAgICAgICAgICAgIHJldHVybiBmbGFncyAmIH5PRldpbGRjYXJkRmxhZ3MuT0ZQRldfTldfRFNUX01BU0s7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgaW50IG1hdGNoT24oaW50IGZsYWdzKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZsYWdzIHwgT0ZXaWxkY2FyZEZsYWdzLk9GUEZXX05XX0RTVF9BTEw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgYm9vbGVhbiBpc0Z1bGx5T24oaW50IGZsYWdzKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGdldEludChmbGFncykgPj0gMzI7CisgICAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgIE5XX1RPUyhPRldpbGRjYXJkRmxhZ3MuT0ZQRldfTldfVE9TKTsgLyogSVAgVG9TIChEU0NQIGZpZWxkLCA2IGJpdHMpLiAqLworCisgICAgICAgIGZpbmFsIGludCBiaXRQb3NpdGlvbjsKKworICAgICAgICBGbGFnKGludCBiaXRQb3NpdGlvbikgeworICAgICAgICAgICAgdGhpcy5iaXRQb3NpdGlvbiA9IGJpdFBvc2l0aW9uOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEByZXR1cm4gYSBtb2RpZmllZCBPRi0xLjAgZmxhZ3MgZmllbGQgd2l0aCB0aGlzIGZsYWcgY2xlYXJlZCAobWF0Y2gKKyAgICAgICAgICogICAgICAgICBvbiB0aGlzIGZpZWxkKQorICAgICAgICAgKi8KKyAgICAgICAgaW50IG1hdGNoT24oaW50IGZsYWdzKSB7CisgICAgICAgICAgICByZXR1cm4gZmxhZ3MgJiB+dGhpcy5iaXRQb3NpdGlvbjsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBAcmV0dXJuIGEgbW9kaWZpZWQgT0YtMS4wIGZsYWdzIGZpZWxkIHdpdGggdGhpcyBmbGFnIHNldCAod2lsZGNhcmQKKyAgICAgICAgICogICAgICAgICB0aGlzIGZpZWxkKQorICAgICAgICAgKi8KKyAgICAgICAgaW50IHdpbGRjYXJkKGludCBmbGFncykgeworICAgICAgICAgICAgcmV0dXJuIGZsYWdzIHwgdGhpcy5iaXRQb3NpdGlvbjsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBAcmV0dXJuIHRydWUgaWZmIHRoaXMgaXMgYSB0cnVlIGJvb2xlYW4gZmxhZyB0aGF0IGNhbiBlaXRoZXIgYmUgb2ZmCisgICAgICAgICAqICAgICAgICAgb3Igb24uVHJ1ZSBpbiBPRi0xLjAgZm9yIGFsbCBmaWVsZHMgZXhjZXB0IE5XX1NSQyBhbmQgTldfRFNUCisgICAgICAgICAqLworICAgICAgICBib29sZWFuIGlzQm9sZWFuKCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEByZXR1cm4gdHJ1ZSBpZmYgdGhpcyB3aWxkY2FyZCBmaWVsZCBpcyBjdXJyZW50bHkgJ3BhcnRpYWxseSBvbicuCisgICAgICAgICAqICAgICAgICAgQWx3YXlzIGZhbHNlIGZvciB0cnVlIEJvb2xlYW4gRmxhZ3MuIENhbiBiZSB0cnVlIGluIE9GLTEuMAorICAgICAgICAgKiAgICAgICAgIGZvciBOV19TUkMsIE5XX0RTVC4KKyAgICAgICAgICovCisgICAgICAgIGJvb2xlYW4gaXNQYXJ0aWFsbHlPbihpbnQgZmxhZ3MpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBAcmV0dXJuIHRydWUgaWZmIHRoaXMgd2lsZGNhcmQgZmllbGQgY3VycmVudGx5IGZ1bGx5IG9uIChmdWxseQorICAgICAgICAgKiAgICAgICAgIHdpbGRjYXJkZWQpLiBFcXVpdmFsZW50IHRvIHRoZSBib29sZWFuIGZsYWcgYmVpbmcgc2V0IGluIHRoZQorICAgICAgICAgKiAgICAgICAgIGJpdG1hc2sgZm9yIGJpdCBmbGFncywgYW5kIHRvIHRoZSB3aWxkY2FyZGVkIGJpdCBsZW5ndGggc2V0CisgICAgICAgICAqICAgICAgICAgdG8gPj0zMiBmb3IgTldfU1JDIGFuZCBOV19EU1QKKyAgICAgICAgICogQHBhcmFtIGZsYWdzCisgICAgICAgICAqIEByZXR1cm4KKyAgICAgICAgICovCisgICAgICAgIGJvb2xlYW4gaXNGdWxseU9uKGludCBmbGFncykgeworICAgICAgICAgICAgcmV0dXJuIChmbGFncyAmIHRoaXMuYml0UG9zaXRpb24pICE9IDA7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogc2V0IHRoZSBpbnRlZ2VyIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgZmxhZy4gb25seSBmb3IgTldfU1JDIGFuZAorICAgICAgICAgKiBOV19EU1QKKyAgICAgICAgICovCisgICAgICAgIGludCBzZXRJbnQoaW50IGZsYWdzLCBpbnQgc3JjTWFzaykgeworICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogc2V0IHRoZSBpbnRlZ2VyIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgZmxhZy4gb25seSBmb3IgTldfU1JDIGFuZAorICAgICAgICAgKiBOV19EU1QKKyAgICAgICAgICovCisgICAgICAgIGludCBnZXRJbnQoaW50IGZsYWdzKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisKKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIGludCBmbGFnczsKKworICAgIC8qKiBwcml2YXRlIGNvbnN0cnVjdG9yLiB1c2UgV2lsZGNhcmQub2YoKSBpbnN0ZWFkICovCisgICAgcHJpdmF0ZSBXaWxkY2FyZHMoaW50IGZsYWdzKSB7CisgICAgICAgIHRoaXMuZmxhZ3MgPSBmbGFnczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiByZXR1cm4gYSB3aWxkY2FyZCBvYmplY3QgbWF0Y2hpbmcgdGhlIGdpdmVuIGludCBmbGFncy4gTWF5IHJldXNlIC8gY2FjaGUKKyAgICAgKiBmcmVxdWVudGx5IHVzZWQgd2lsZGNhcmQgaW5zdGFuY2VzLiBEb24ndCByZWx5IG9uIGl0IHRob3VnaCAodXNlIGVxdWFscworICAgICAqIG5vdCA9PSkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmxhZ3MKKyAgICAgKiBAcmV0dXJuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBXaWxkY2FyZHMgb2YoaW50IHBhcmFtRmxhZ3MpIHsKKyAgICAgICAgaW50IGZsYWdzID0gc2FuaXRpemVJbnQocGFyYW1GbGFncyk7CisgICAgICAgIHN3aXRjaChmbGFncykgeworICAgICAgICAgICAgY2FzZSAweDAwMDA6CisgICAgICAgICAgICAgICAgcmV0dXJuIEVYQUNUOworICAgICAgICAgICAgY2FzZSBPRldpbGRjYXJkRmxhZ3MuT0ZQRldfQUxMX1NBTklUSVpFRDoKKyAgICAgICAgICAgICAgICByZXR1cm4gRlVMTDsKKyAgICAgICAgICAgIGNhc2UgSU5UX0lOUE9SVF9MMl9NQVRDSDoKKyAgICAgICAgICAgICAgICByZXR1cm4gSU5QT1JUX0wyX01BVENIOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFdpbGRjYXJkcyhmbGFncyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiogY29udmllbmNlIG1ldGhvZCByZXR1cm4gYSB3aWxkY2FyZCBmb3IgZXhhY3RseSBvbmUgc2V0IGZsYWcgKi8KKyAgICBwdWJsaWMgc3RhdGljIFdpbGRjYXJkcyBvZihXaWxkY2FyZHMuRmxhZyBzZXRGbGFnKSB7CisgICAgICAgIHJldHVybiBXaWxkY2FyZHMub2Yoc2V0RmxhZy53aWxkY2FyZCgwKSk7CisgICAgfQorCisgICAgLyoqIGNvbnZpZW5jZSBtZXRob2QgcmV0dXJuIGEgd2lsZGNhcmQgZm9yIGV4YWN0bHkgdHdvIHNldCBmbGFncyAqLworICAgIHB1YmxpYyBzdGF0aWMgV2lsZGNhcmRzIG9mKFdpbGRjYXJkcy5GbGFnIHNldEZsYWcsIFdpbGRjYXJkcy5GbGFnIHNldEZsYWcyKSB7CisgICAgICAgIHJldHVybiBXaWxkY2FyZHMub2Yoc2V0RmxhZy53aWxkY2FyZChzZXRGbGFnMi53aWxkY2FyZCgwKSkpOworICAgIH0KKworICAgIC8qKiBjb252aWVuY2UgbWV0aG9kIHJldHVybiBhIHdpbGRjYXJkIGZvciBhbiBhcmJpdHJhcnkgbnVtYmVyIG9mIHNldCBmbGFncyAqLworICAgIHB1YmxpYyBzdGF0aWMgV2lsZGNhcmRzIG9mKFdpbGRjYXJkcy5GbGFnLi4uIHNldEZsYWdzKSB7CisgICAgICAgIGludCBmbGFncyA9IDA7CisgICAgICAgIGZvciAoV2lsZGNhcmRzLkZsYWcgZmxhZyA6IHNldEZsYWdzKQorICAgICAgICAgICAgZmxhZ3MgPSBmbGFnLndpbGRjYXJkKDApOworICAgICAgICByZXR1cm4gV2lsZGNhcmRzLm9mKGZsYWdzKTsKKyAgICB9CisKKyAgICAvKiogY29udmllbmNlIG1ldGhvZCByZXR1cm4gYSB3aWxkY2FyZHMgZm9yIG9mbWF0Y2hlcyB0aGF0IG1hdGNoIG9uIG9uZSBmbGFnICovCisgICAgcHVibGljIHN0YXRpYyBXaWxkY2FyZHMgb2ZNYXRjaGVzKFdpbGRjYXJkcy5GbGFnIHNldEZsYWcpIHsKKyAgICAgICAgcmV0dXJuIFdpbGRjYXJkcy5vZihzZXRGbGFnLm1hdGNoT24oRlVMTF9JTlQpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBjb252aWVuY2UgbWV0aG9kIHJldHVybiBhIHdpbGRjYXJkIGZvciBmb3IgYW4gb2ZtYXRjaCB0aGF0IG1hdGNoIG9uIHR3bworICAgICAqIGZsYWdzCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBXaWxkY2FyZHMgb2ZNYXRjaGVzKFdpbGRjYXJkcy5GbGFnIHNldEZsYWcsIFdpbGRjYXJkcy5GbGFnIHNldEZsYWcyKSB7CisgICAgICAgIHJldHVybiBXaWxkY2FyZHMub2Yoc2V0RmxhZy5tYXRjaE9uKHNldEZsYWcyLm1hdGNoT24oRlVMTF9JTlQpKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogY29udmllbmNlIG1ldGhvZCByZXR1cm4gYSB3aWxkY2FyZCBmb3IgYW4gb2ZtYXRjaCB0aGF0IGFtdGNoIG9uIGFuCisgICAgICogYXJiaXRyYXJ5IG51bWJlciBvZiBzZXQgZmxhZ3MKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFdpbGRjYXJkcyBvZk1hdGNoZXMoV2lsZGNhcmRzLkZsYWcuLi4gc2V0RmxhZ3MpIHsKKyAgICAgICAgaW50IGZsYWdzID0gRlVMTF9JTlQ7CisgICAgICAgIGZvciAoV2lsZGNhcmRzLkZsYWcgZmxhZyA6IHNldEZsYWdzKQorICAgICAgICAgICBmbGFncyA9IGZsYWcubWF0Y2hPbihmbGFncyk7CisgICAgICAgIHJldHVybiBXaWxkY2FyZHMub2YoZmxhZ3MpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgV2lsZGNhcmRzIG9mTWF0Y2hlcyhTZXQ8V2lsZGNhcmRzLkZsYWc+IHdTZXQpIHsKKyAgICAgICAgaW50IGZsYWdzID0gRlVMTF9JTlQ7CisgICAgICAgIGZvciAoV2lsZGNhcmRzLkZsYWcgZmxhZyA6IHdTZXQpCisgICAgICAgICAgIGZsYWdzID0gZmxhZy5tYXRjaE9uKGZsYWdzKTsKKyAgICAgICAgcmV0dXJuIFdpbGRjYXJkcy5vZihmbGFncyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogcmV0dXJuIGEgV2lsZGNhcmRzIG9iamVjdCB0aGF0IGhhcyB0aGUgZ2l2ZW4gZmxhZ3Mgc2V0CisgICAgICogPHA+CisgICAgICogPGI+Tk9URTo8L2I+IE5PVCBhIG11dGF0b3IgZnVuY3Rpb24uICd0aGlzJyB3aWxkY2FyZCBvYmplY3Qgc3RheXMKKyAgICAgKiB1bm1vZGlmaWVkLiA8L2I+CisgICAgICovCisgICAgcHVibGljIFdpbGRjYXJkcyB3aWxkY2FyZChXaWxkY2FyZHMuRmxhZyBmbGFnKSB7CisgICAgICAgIGludCBmbGFncyA9IGZsYWcud2lsZGNhcmQodGhpcy5mbGFncyk7CisgICAgICAgIGlmIChmbGFncyA9PSB0aGlzLmZsYWdzKQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBuZXcgV2lsZGNhcmRzKGZsYWdzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiByZXR1cm4gYSBXaWxkY2FyZHMgb2JqZWN0IHRoYXQgaGFzIHRoZSBnaXZlbiBmbGFncyBzZXQKKyAgICAgKiA8cD4KKyAgICAgKiA8Yj5OT1RFOjwvYj4gTk9UIGEgbXV0YXRvciBmdW5jdGlvbi4gJ3RoaXMnIHdpbGRjYXJkIG9iamVjdCBzdGF5cworICAgICAqIHVubW9kaWZpZWQuIDwvYj4KKyAgICAgKi8KKyAgICBwdWJsaWMgV2lsZGNhcmRzIHdpbGRjYXJkKFdpbGRjYXJkcy5GbGFnIGZsYWcsIFdpbGRjYXJkcy5GbGFnIGZsYWcyKSB7CisgICAgICAgIGludCBmbGFncyA9IGZsYWcud2lsZGNhcmQoZmxhZzIud2lsZGNhcmQodGhpcy5mbGFncykpOworICAgICAgICBpZiAoZmxhZ3MgPT0gdGhpcy5mbGFncykKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gbmV3IFdpbGRjYXJkcyhmbGFncyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogcmV0dXJuIGEgV2lsZGNhcmRzIG9iamVjdCB0aGF0IGhhcyB0aGUgZ2l2ZW4gZmxhZ3Mgd2lsZGNhcmRlZAorICAgICAqIDxwPgorICAgICAqIDxiPk5PVEU6PC9iPiBOT1QgYSBtdXRhdG9yIGZ1bmN0aW9uLiAndGhpcycgd2lsZGNhcmQgb2JqZWN0IHN0YXlzCisgICAgICogdW5tb2RpZmllZC4gPC9iPgorICAgICAqLworICAgIHB1YmxpYyBXaWxkY2FyZHMgd2lsZGNhcmQoV2lsZGNhcmRzLkZsYWcuLi4gc2V0RmxhZ3MpIHsKKyAgICAgICAgaW50IGZsYWdzID0gdGhpcy5mbGFnczsKKyAgICAgICAgZm9yIChXaWxkY2FyZHMuRmxhZyBmbGFnIDogc2V0RmxhZ3MpCisgICAgICAgICAgICBmbGFncyA9IGZsYWcud2lsZGNhcmQoZmxhZ3MpOworICAgICAgICBpZiAoZmxhZ3MgPT0gdGhpcy5mbGFncykKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gbmV3IFdpbGRjYXJkcyhmbGFncyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogcmV0dXJuIGEgV2lsZGNhcmRzIG9iamVjdCB0aGF0IG1hdGNoZXMgb24gZXhhY3RseSB0aGUgZ2l2ZW4gZmxhZworICAgICAqIDxwPgorICAgICAqIDxiPk5PVEU6PC9iPiBOT1QgYSBtdXRhdG9yIGZ1bmN0aW9uLiAndGhpcycgd2lsZGNhcmQgb2JqZWN0IHN0YXlzCisgICAgICogdW5tb2RpZmllZC4gPC9iPgorICAgICAqLworICAgIHB1YmxpYyBXaWxkY2FyZHMgbWF0Y2hPbihXaWxkY2FyZHMuRmxhZyBmbGFnKSB7CisgICAgICAgIGludCBmbGFncyA9IGZsYWcubWF0Y2hPbih0aGlzLmZsYWdzKTsKKyAgICAgICAgaWYgKGZsYWdzID09IHRoaXMuZmxhZ3MpCisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIG5ldyBXaWxkY2FyZHMoZmxhZ3MpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHJldHVybiBhIFdpbGRjYXJkcyBvYmplY3QgdGhhdCBtYXRjaGVzIG9uIGV4YWN0bHkgdGhlIGdpdmVuIGZsYWdzCisgICAgICogPHA+CisgICAgICogPGI+Tk9URTo8L2I+IE5PVCBhIG11dGF0b3IgZnVuY3Rpb24uICd0aGlzJyB3aWxkY2FyZCBvYmplY3Qgc3RheXMKKyAgICAgKiB1bm1vZGlmaWVkLiA8L2I+CisgICAgICovCisgICAgcHVibGljIFdpbGRjYXJkcyBtYXRjaE9uKFdpbGRjYXJkcy5GbGFnIGZsYWcsIFdpbGRjYXJkcy5GbGFnIGZsYWcyKSB7CisgICAgICAgIGludCBmbGFncyA9IGZsYWcubWF0Y2hPbihmbGFnMi5tYXRjaE9uKHRoaXMuZmxhZ3MpKTsKKyAgICAgICAgaWYgKGZsYWdzID09IHRoaXMuZmxhZ3MpCisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIG5ldyBXaWxkY2FyZHMoZmxhZ3MpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHJldHVybiBhIFdpbGRjYXJkcyBvYmplY3QgdGhhdCBtYXRjaGVzIG9uIGV4YWN0bHkgdGhlIGdpdmVuIGZsYWdzCisgICAgICogPHA+CisgICAgICogPGI+Tk9URTo8L2I+IE5PVCBhIG11dGF0b3IgZnVuY3Rpb24uICd0aGlzJyB3aWxkY2FyZCBvYmplY3Qgc3RheXMKKyAgICAgKiB1bm1vZGlmaWVkLiA8L2I+CisgICAgICovCisgICAgcHVibGljIFdpbGRjYXJkcyBtYXRjaE9uKFdpbGRjYXJkcy5GbGFnLi4uIHNldEZsYWdzKSB7CisgICAgICAgIGludCBmbGFncyA9IHRoaXMuZmxhZ3M7CisgICAgICAgIGZvciAoV2lsZGNhcmRzLkZsYWcgZmxhZyA6IHNldEZsYWdzKQorICAgICAgICAgICAgZmxhZ3MgPSBmbGFnLm1hdGNoT24oZmxhZ3MpOworICAgICAgICBpZiAoZmxhZ3MgPT0gdGhpcy5mbGFncykKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gbmV3IFdpbGRjYXJkcyhmbGFncyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogcmV0dXJuIHRoZSBudyBzcmMgbWFzayBpbiBub3JtYWwgQ0lEUiBzdHlsZSwgZS5nLiwgOCBtZWFucyB4LngueC54LzgKKyAgICAgKiBtZWFucyA4IGJpdHMgd2lsZGNhcmRlZAorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0TndTcmNNYXNrKCkgeworICAgICAgICByZXR1cm4gTWF0aC5tYXgoMCwgMzIgLSBGbGFnLk5XX1NSQy5nZXRJbnQoZmxhZ3MpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiByZXR1cm4gdGhlIG53IGRzdCBtYXNrIGluIG5vcm1hbCBDSURSIHN0eWxlLCBlLmcuLCA4IG1lYW5zIHgueC54LngvOAorICAgICAqIG1lYW5zIDggYml0cyB3aWxkY2FyZGVkCisgICAgICovCisgICAgcHVibGljIGludCBnZXROd0RzdE1hc2soKSB7CisgICAgICAgIHJldHVybiBNYXRoLm1heCgwLCAzMiAtIEZsYWcuTldfRFNULmdldEludChmbGFncykpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHJldHVybiBhIFdpbGRjYXJkIG9iamVjdCB0aGF0IGhhcyB0aGUgZ2l2ZW4gbndTcmNDaWRyTWFzayBzZXQuCisgICAgICogPGI+Tk9URTo8L2I+IE5PVCBhIG11dGF0b3IgZnVuY3Rpb24uICd0aGlzJyB3aWxkY2FyZCBvYmplY3Qgc3RheXMKKyAgICAgKiB1bm1vZGlmaWVkLiA8L2I+CisgICAgICoKKyAgICAgKiBAcGFyYW0gc3JjQ2lkck1hc2sKKyAgICAgKiAgICAgICAgICAgIHNvdXJjZSBtYXNrIHRvIHNldCBpbiA8Yj5ub3JtYWwgQ0lEUiBub3RhdGlvbjwvYj4sIGkuZS4sIDgKKyAgICAgKiAgICAgICAgICAgIG1lYW5zIHgueC54LngvOAorICAgICAqIEByZXR1cm4gYSBtb2RpZmllZCBvYmplY3QKKyAgICAgKi8KKyAgICBwdWJsaWMgV2lsZGNhcmRzIHdpdGhOd1NyY01hc2soaW50IHNyY0NpZHJNYXNrKSB7CisgICAgICAgIGludCBmbGFncyA9IEZsYWcuTldfU1JDLnNldEludCh0aGlzLmZsYWdzLCBNYXRoLm1heCgwLCAzMiAtIHNyY0NpZHJNYXNrKSk7CisgICAgICAgIGlmIChmbGFncyA9PSB0aGlzLmZsYWdzKQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBuZXcgV2lsZGNhcmRzKGZsYWdzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiByZXR1cm4gYSBXaWxkY2FyZCBvYmplY3QgdGhhdCBoYXMgdGhlIGdpdmVuIG53RHN0Q2lkck1hc2sgc2V0LgorICAgICAqIDxiPk5PVEU6PC9iPiBOT1QgYSBtdXRhdG9yIGZ1bmN0aW9uLiAndGhpcycgd2lsZGNhcmQgb2JqZWN0IHN0YXlzCisgICAgICogdW5tb2RpZmllZC4gPC9iPgorICAgICAqCisgICAgICogQHBhcmFtIGRzdENpZHJNYXNrCisgICAgICogICAgICAgICAgICBkZXN0IG1hc2sgdG8gc2V0IGluIDxiPm5vcm1hbCBDSURSIG5vdGF0aW9uPC9iPiwgaS5lLiwgOCBtZWFucworICAgICAqICAgICAgICAgICAgeC54LngueC84CisgICAgICogQHJldHVybiBhIG1vZGlmaWVkIG9iamVjdAorICAgICAqLworICAgIHB1YmxpYyBXaWxkY2FyZHMgd2l0aE53RHN0TWFzayhpbnQgZHN0Q2lkck1hc2spIHsKKyAgICAgICAgaW50IGZsYWdzID0gRmxhZy5OV19EU1Quc2V0SW50KHRoaXMuZmxhZ3MsIE1hdGgubWF4KDAsIDMyIC0gZHN0Q2lkck1hc2spKTsKKyAgICAgICAgaWYgKGZsYWdzID09IHRoaXMuZmxhZ3MpCisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIG5ldyBXaWxkY2FyZHMoZmxhZ3MpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHJldHVybiBhIFdpbGRjYXJkIG9iamVjdCB0aGF0IGlzIGludmVydGVkIHRvIHRoaXMgd2lsZGNhcmQgb2JqZWN0LgorICAgICAqIDxiPk5PVEU6PC9iPiBOT1QgYSBtdXRhdG9yIGZ1bmN0aW9uLiAndGhpcycgd2lsZGNhcmQgb2JqZWN0IHN0YXlzCisgICAgICogdW5tb2RpZmllZC4gPC9iPgorICAgICAqIEByZXR1cm4gYSBtb2RpZmllZCBvYmplY3QKKyAgICAgKi8KKyAgICBwdWJsaWMgV2lsZGNhcmRzIGludmVydGVkKCkgeworICAgICAgICByZXR1cm4gV2lsZGNhcmRzLm9mKGZsYWdzIF4gT0ZXaWxkY2FyZEZsYWdzLk9GUEZXX0FMTF9TQU5JVElaRUQpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzV2lsZGNhcmRlZChGbGFnIGZsYWcpIHsKKyAgICAgICAgcmV0dXJuIGZsYWcuaXNGdWxseU9uKGZsYWdzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiByZXR1cm4gYWxsIHdpbGRjYXJkIGZsYWdzIHRoYXQgYXJlIGZ1bGx5IHdpbGRjYXJkZWQgYXMgYW4gRW51bVNldC4gRG8gbm90CisgICAgICogbW9kaWZ5LiBOb3RlOiBzb21lIGZsYWdzIChsaWtlIE5XX1NSQyBhbmQgTldfRFNUKSB0aGF0IGFyZSBwYXJ0aWFsbHkKKyAgICAgKiB3aWxkY2FyZGVkIGFyZSBub3QgcmV0dXJuZWQgaW4gdGhpcyBzZXQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBFbnVtU2V0IG9mIHdpbGRjYXJkcworICAgICAqLworICAgIHB1YmxpYyBFbnVtU2V0PFdpbGRjYXJkcy5GbGFnPiBnZXRXaWxkY2FyZGVkRmxhZ3MoKSB7CisgICAgICAgIEVudW1TZXQ8V2lsZGNhcmRzLkZsYWc+IHJlcyA9IEVudW1TZXQubm9uZU9mKFdpbGRjYXJkcy5GbGFnLmNsYXNzKTsKKyAgICAgICAgZm9yIChXaWxkY2FyZHMuRmxhZyBmbGFnIDogRmxhZy52YWx1ZXMoKSkgeworICAgICAgICAgICAgaWYgKGZsYWcuaXNGdWxseU9uKGZsYWdzKSkgeworICAgICAgICAgICAgICAgIHJlcy5hZGQoZmxhZyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICAvKiogcmV0dXJuIHRoZSBPcGVuRmxvdyAnd2lyZScgaW50ZWdlciByZXByZXNlbnRhdGlvbiBvZiB0aGVzZSB3aWxkY2FyZHMgKi8KKyAgICBwdWJsaWMgaW50IGdldEludCgpIHsKKyAgICAgICAgcmV0dXJuIGZsYWdzOworICAgIH0KKworICAgIC8qKgorICAgICAqIHJldHVybiB0aGUgT3BlbkZsb3cgJ3dpcmUnIGludGVnZXIgcmVwcmVzZW50YXRpb24gb2YgdGhlc2Ugd2lsZGNhcmRzLgorICAgICAqIFNhbml0aXplIG53X3NyYyBhbmQgbndfZHN0IHRvIGJlIG1heC4gMzIgKHZhbHVlcyA+IDMyIGFyZSB0ZWNobmljYWxseQorICAgICAqIHBvc3NpYmxlLCBidXQgZG9uJ3QgbWFrZSBzZW1hbnRpYyBzZW5zZSkKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGludCBzYW5pdGl6ZUludChpbnQgZmxhZ3MpIHsKKyAgICAgICAgaWYgKCgoZmxhZ3MgJiBPRldpbGRjYXJkRmxhZ3MuT0ZQRldfTldfU1JDX01BU0spID4+IE9GV2lsZGNhcmRGbGFncy5PRlBGV19OV19TUkNfU0hJRlQpID4gMzIpIHsKKyAgICAgICAgICAgIGZsYWdzID0gKGZsYWdzICYgfk9GV2lsZGNhcmRGbGFncy5PRlBGV19OV19TUkNfTUFTSykgfCBPRldpbGRjYXJkRmxhZ3MuT0ZQRldfTldfU1JDX0FMTDsKKyAgICAgICAgfQorICAgICAgICBpZiAoKChmbGFncyAmIE9GV2lsZGNhcmRGbGFncy5PRlBGV19OV19EU1RfTUFTSykgPj4gT0ZXaWxkY2FyZEZsYWdzLk9GUEZXX05XX0RTVF9TSElGVCkgPiAzMikgeworICAgICAgICAgICAgZmxhZ3MgPSAoZmxhZ3MgJiB+T0ZXaWxkY2FyZEZsYWdzLk9GUEZXX05XX0RTVF9NQVNLKSB8IE9GV2lsZGNhcmRGbGFncy5PRlBGV19OV19EU1RfQUxMOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmbGFnczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBpcyB0aGlzIGEgd2lsZGNhcmQgc2V0IHRoYXQgaGFzIGFsbCBmbGFncyBzZXQgKyBhbmQgZnVsbCAoLzApIG53X3NyYyBhbmQKKyAgICAgKiBud19kc3Qgd2lsZGNhcmRpbmcgPworICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzRnVsbCgpIHsKKyAgICAgICAgcmV0dXJuIGZsYWdzID09IE9GV2lsZGNhcmRGbGFncy5PRlBGV19BTEwgfHwgZmxhZ3MgPT0gT0ZXaWxkY2FyZEZsYWdzLk9GUEZXX0FMTF9TQU5JVElaRUQ7CisgICAgfQorCisgICAgLyoqIGlzIHRoaXMgYSB3aWxkY2FyZCBvZiBhbiBleGFjdCBtYXRjaCAqLworICAgIHB1YmxpYyBib29sZWFuIGlzRXhhY3QoKSB7CisgICAgICAgIHJldHVybiBmbGFncyA9PSAwOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgIGZpbmFsIGludCBwcmltZSA9IDMxOworICAgICAgICBpbnQgcmVzdWx0ID0gMTsKKyAgICAgICAgcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyBmbGFnczsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgeworICAgICAgICBpZiAodGhpcyA9PSBvYmopCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgaWYgKG9iaiA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoZ2V0Q2xhc3MoKSAhPSBvYmouZ2V0Q2xhc3MoKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgV2lsZGNhcmRzIG90aGVyID0gKFdpbGRjYXJkcykgb2JqOworICAgICAgICBpZiAoZmxhZ3MgIT0gb3RoZXIuZmxhZ3MpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIEpvaW5lciBwaXBlSm9pbmVyID0gSm9pbmVyLm9uKCJ8Iik7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICBMaXN0PFN0cmluZz4gcmVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisgICAgICAgIGZvciAoV2lsZGNhcmRzLkZsYWcgZmxhZyA6IEZsYWcudmFsdWVzKCkpIHsKKyAgICAgICAgICAgIGlmIChmbGFnLmlzRnVsbHlPbihmbGFncykpIHsKKyAgICAgICAgICAgICAgICByZXMuYWRkKGZsYWcubmFtZSgpLnRvTG93ZXJDYXNlKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKEZsYWcuTldfU1JDLmlzUGFydGlhbGx5T24oZmxhZ3MpKSB7CisgICAgICAgICAgICByZXMuYWRkKCJud19zcmMoLyIgKyBnZXROd1NyY01hc2soKSArICIpIik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoRmxhZy5OV19EU1QuaXNQYXJ0aWFsbHlPbihmbGFncykpIHsKKyAgICAgICAgICAgIHJlcy5hZGQoIm53X2RzdCgvIiArIGdldE53RHN0TWFzaygpICsgIikiKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBwaXBlSm9pbmVyLmpvaW4ocmVzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBKb2luZXIgY29tbWFKb2luZXIgPSBKb2luZXIub24oIiwgIik7CisKKyAgICAvKiogYSBKYXZhIGV4cHJlc3Npb24gdGhhdCBjb25zdHJ1Y3RzICd0aGlzJyB3aWxkY2FyZHMgc2V0ICovCisgICAgcHVibGljIFN0cmluZyB0b0phdmEoKSB7CisgICAgICAgIGlmKGlzRnVsbCgpKSB7CisgICAgICAgICAgICByZXR1cm4gIldpbGRjYXJkcy5GVUxMIjsKKyAgICAgICAgfSBlbHNlICBpZiAoaXNFeGFjdCgpKXsKKyAgICAgICAgICAgIHJldHVybiAiV2lsZGNhcmRzLkVYQUNUIjsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZ0J1aWxkZXIgYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisKKyAgICAgICAgRW51bVNldDxGbGFnPiBteUZsYWdzID0gZ2V0V2lsZGNhcmRlZEZsYWdzKCk7CisgICAgICAgIGlmIChteUZsYWdzLnNpemUoKSA8IDMpIHsKKyAgICAgICAgICAgIC8vIGRlZmF1bHQgdG8gc3RhcnQgd2l0aCBlbXB0eQorICAgICAgICAgICAgYi5hcHBlbmQoIldpbGRjYXJkcy5vZigiCisgICAgICAgICAgICAgICAgICAgICArIGNvbW1hSm9pbmVyLmpvaW4ocHJlZml4KCJGbGFnLiIsIG15RmxhZ3MuaXRlcmF0b3IoKSkpICsgIikiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIHRvbyBtYW55IC0gc3RhcnQgd2l0aCBmdWxsCisKKyAgICAgICAgICAgIEVudW1TZXQ8RmxhZz4gaW52RmxhZ3MgPSBpbnZlcnRlZCgpLmdldFdpbGRjYXJkZWRGbGFncygpOworICAgICAgICAgICAgYi5hcHBlbmQoIldpbGRjYXJkcy5vZk1hdGNoZXMoIgorICAgICAgICAgICAgICAgICAgICAgKyBjb21tYUpvaW5lci5qb2luKHByZWZpeCgiRmxhZy4iLCBpbnZGbGFncy5pdGVyYXRvcigpKSkgKyAiKSIpOworICAgICAgICB9CisgICAgICAgIGlmIChGbGFnLk5XX1NSQy5pc1BhcnRpYWxseU9uKGZsYWdzKSkgeworICAgICAgICAgICAgYi5hcHBlbmQoIi5zZXROd1NyY01hc2soIiArIGdldE53U3JjTWFzaygpICsgIikiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoRmxhZy5OV19EU1QuaXNQYXJ0aWFsbHlPbihmbGFncykpIHsKKyAgICAgICAgICAgIGIuYXBwZW5kKCIuc2V0TndEc3RNYXNrKCIgKyBnZXROd0RzdE1hc2soKSArICIpIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGIudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIEl0ZXJhdG9yPFN0cmluZz4gcHJlZml4KGZpbmFsIFN0cmluZyBwcmVmaXgsIGZpbmFsIEl0ZXJhdG9yPD8+IGkpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBJdGVyYXRvcjxTdHJpbmc+KCkgeworCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGkuaGFzTmV4dCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgbmV4dCgpIHsKKyAgICAgICAgICAgICAgICBPYmplY3QgbmV4dCA9IGkubmV4dCgpOworICAgICAgICAgICAgICAgIHJldHVybiBuZXh0ID09IG51bGwgPyBudWxsIDogcHJlZml4ICsgbmV4dC50b1N0cmluZygpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKKyAgICAgICAgICAgICAgICBpLnJlbW92ZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgIH0KKworCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamF2YV9nZW4vcHJlLXdyaXR0ZW4vc3JjL21haW4vamF2YS9vcmcvb3BlbmZsb3cvcHJvdG9jb2wvbWF0Y2gvTWF0Y2guamF2YSBiL2phdmFfZ2VuL3ByZS13cml0dGVuL3NyYy9tYWluL2phdmEvb3JnL29wZW5mbG93L3Byb3RvY29sL21hdGNoL01hdGNoLmphdmEKaW5kZXggOTliN2RlNC4uZDM1ZjcwOSAxMDA2NDQKLS0tIGEvamF2YV9nZW4vcHJlLXdyaXR0ZW4vc3JjL21haW4vamF2YS9vcmcvb3BlbmZsb3cvcHJvdG9jb2wvbWF0Y2gvTWF0Y2guamF2YQorKysgYi9qYXZhX2dlbi9wcmUtd3JpdHRlbi9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZmxvdy9wcm90b2NvbC9tYXRjaC9NYXRjaC5qYXZhCkBAIC01LDIzICs1LDIzIEBACiBpbXBvcnQgb3JnLm9wZW5mbG93LnR5cGVzLk9GVmFsdWVUeXBlOwogCiBwdWJsaWMgaW50ZXJmYWNlIE1hdGNoIGV4dGVuZHMgT0ZPYmplY3QgewotICAgIAorCiAgICAgLyoKICAgICAgKiBQcmVjb25kaXRpb25zCi0gICAgICogT24gcHJlY29uZGl0aW9ucyAoZnJvbSB0aGUgT0YxLjEgc3BlYywgcGFnZSAyOCwgdGhlIE9GMS4wIHNwZWMgZmFpbGVkIHRvIGV4cGxpY2l0bHkgCisgICAgICogT24gcHJlY29uZGl0aW9ucyAoZnJvbSB0aGUgT0YxLjEgc3BlYywgcGFnZSAyOCwgdGhlIE9GMS4wIHNwZWMgZmFpbGVkIHRvIGV4cGxpY2l0bHkKICAgICAgKiBzcGVjaWZ5IHRoaXMsIGJ1dCBpdCBpcyB0aGUgYmVoYXZpb3Igb2YgT2YxLjAgc3dpdGNoZXMpOgotICAgICAqIFByb3RvY29sLXNwZWNpZmljIGZpZWxkcyB3aXRoaW4gb2ZwX21hdGNoIHdpbGwgYmUgaWdub3JlZCB3aXRoaW4gYSBzaW5nbGUgdGFibGUgd2hlbiAKLSAgICAgKiB0aGUgY29ycmVzcG9uZGluZyBwcm90b2NvbCBpcyBub3Qgc3BlY2lmaWVkIGluIHRoZSBtYXRjaC4gVGhlIE1QTFMgbWF0Y2ggZmllbGRzIHdpbGwgCi0gICAgICogYmUgaWdub3JlZCB1bmxlc3MgdGhlIEV0aGVydHlwZSBpcyBzcGVjaWZpZWQgYXMgTVBMUy4gTGlrZXdpc2UsIHRoZSBJUCBoZWFkZXIgYW5kIAotICAgICAqIHRyYW5zcG9ydCBoZWFkZXIgZmllbGRzIHdpbGwgYmUgaWdub3JlZCB1bmxlc3MgdGhlIEV0aGVydHlwZSBpcyBzcGVjaWZpZWQgYXMgZWl0aGVyIAotICAgICAqIElQdjQgb3IgQVJQLiBUaGUgdHBfc3JjIGFuZCB0cF9kc3QgZmllbGRzIHdpbGwgYmUgaWdub3JlZCB1bmxlc3MgdGhlIG5ldHdvcmsgcHJvdG9jb2wgCi0gICAgICogc3BlY2lmaWVkIGlzIGFzIFRDUCwgVURQIG9yIFNDVFAuIEZpZWxkcyB0aGF0IGFyZSBpZ25vcmVkIGRvbtV0IG5lZWQgdG8gYmUgd2lsZGNhcmRlZCAKKyAgICAgKiBQcm90b2NvbC1zcGVjaWZpYyBmaWVsZHMgd2l0aGluIG9mcF9tYXRjaCB3aWxsIGJlIGlnbm9yZWQgd2l0aGluIGEgc2luZ2xlIHRhYmxlIHdoZW4KKyAgICAgKiB0aGUgY29ycmVzcG9uZGluZyBwcm90b2NvbCBpcyBub3Qgc3BlY2lmaWVkIGluIHRoZSBtYXRjaC4gVGhlIE1QTFMgbWF0Y2ggZmllbGRzIHdpbGwKKyAgICAgKiBiZSBpZ25vcmVkIHVubGVzcyB0aGUgRXRoZXJ0eXBlIGlzIHNwZWNpZmllZCBhcyBNUExTLiBMaWtld2lzZSwgdGhlIElQIGhlYWRlciBhbmQKKyAgICAgKiB0cmFuc3BvcnQgaGVhZGVyIGZpZWxkcyB3aWxsIGJlIGlnbm9yZWQgdW5sZXNzIHRoZSBFdGhlcnR5cGUgaXMgc3BlY2lmaWVkIGFzIGVpdGhlcgorICAgICAqIElQdjQgb3IgQVJQLiBUaGUgdHBfc3JjIGFuZCB0cF9kc3QgZmllbGRzIHdpbGwgYmUgaWdub3JlZCB1bmxlc3MgdGhlIG5ldHdvcmsgcHJvdG9jb2wKKyAgICAgKiBzcGVjaWZpZWQgaXMgYXMgVENQLCBVRFAgb3IgU0NUUC4gRmllbGRzIHRoYXQgYXJlIGlnbm9yZWQgZG9u77+9dCBuZWVkIHRvIGJlIHdpbGRjYXJkZWQKICAgICAgKiBhbmQgc2hvdWxkIGJlIHNldCB0byAwLgogICAgICAqLwotICAgIAorCiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgdmFsdWUgZm9yIHRoZSBnaXZlbiBmaWVsZCBmcm9tIHRoaXMgbWF0Y2guCi0gICAgICogCisgICAgICoKICAgICAgKiBAcGFyYW0gZmllbGQgTWF0Y2ggZmllbGQgdG8gcmV0cmlldmUKICAgICAgKiBAcmV0dXJuIFZhbHVlIG9mIG1hdGNoIGZpZWxkCiAgICAgICovCkBAIC0zMCw3ICszMCw3IEBACiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgbWFza2VkIHZhbHVlIGZvciB0aGUgZ2l2ZW4gZmllbGQgZnJvbSB0aGlzIG1hdGNoLgogICAgICAqIFByZWNvbmRpdGlvbjogZmllbGQgaXMgcGFydGlhbGx5IHdpbGRjYXJkZWQuCi0gICAgICogCisgICAgICoKICAgICAgKiBAcGFyYW0gZmllbGQgTWF0Y2ggZmllbGQgdG8gcmV0cmlldmUKICAgICAgKiBAcmV0dXJuIE1hc2tlZCB2YWx1ZSBvZiBtYXRjaCBmaWVsZCBvciBudWxsIGlmIG5vIG1hc2sKICAgICAgKi8KQEAgLTM4LDQ0ICszOCw0NCBAQAogCiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgbWF0Y2ggb2JqZWN0IHN1cHBvcnRzIHRoZSBnaXZlbiBtYXRjaCBmaWVsZC4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIEBwYXJhbSBmaWVsZCBNYXRjaCBmaWVsZAotICAgICAqIEByZXR1cm4gCisgICAgICogQHJldHVybgogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzKE1hdGNoRmllbGQ8Pz4gZmllbGQpOwogCiAgICAgLyoqCi0gICAgICogdHJ1ZSBpZmYgZmllbGQgc3VwcG9ydHMgYSBiaXRtYXNrIG1hc2sgdGhhdCB3aWxkY2FyZHMgcGFydCBvZiB0aGUgZmllbGQgCisgICAgICogdHJ1ZSBpZmYgZmllbGQgc3VwcG9ydHMgYSBiaXRtYXNrIG1hc2sgdGhhdCB3aWxkY2FyZHMgcGFydCBvZiB0aGUgZmllbGQKICAgICAgKiAobm90ZTogbm90IGFsbCBwb3NzaWJsZSB2YWx1ZXMgb2YgdGhpcyBiaXRtYXNrIGhhdmUgdG8gYmUgYWNjZXB0YWJsZSkKLSAgICAgKiAKKyAgICAgKgogICAgICAqIEBwYXJhbSBmaWVsZCBNYXRjaCBmaWVsZAotICAgICAqIEByZXR1cm4gCisgICAgICogQHJldHVybgogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzTWFza2VkKE1hdGNoRmllbGQ8Pz4gZmllbGQpOwogCiAgICAgLyoqCi0gICAgICogVHJ1ZSBpZmYgdGhpcyBmaWVsZCBpcyBjdXJyZW50bHkgZnVsbHkgc3BlY2lmaWVkIGluIHRoZSBtYXRjaCwgaS5lLiwgdGhlIAorICAgICAqIFRydWUgaWZmIHRoaXMgZmllbGQgaXMgY3VycmVudGx5IGZ1bGx5IHNwZWNpZmllZCBpbiB0aGUgbWF0Y2gsIGkuZS4sIHRoZQogICAgICAqIG1hdGNoIHdpbGwgb25seSBzZWxlY3QgcGFja2V0cyB0aGF0IG1hdGNoIHRoZSBleGFjdCB2YWx1ZSBvZiBnZXRGaWVsZChmaWVsZCkuCi0gICAgICogCisgICAgICoKICAgICAgKiBAcGFyYW0gZmllbGQgTWF0Y2ggZmllbGQKLSAgICAgKiBAcmV0dXJuIAorICAgICAqIEByZXR1cm4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBpc0V4YWN0KE1hdGNoRmllbGQ8Pz4gZmllbGQpOwogCiAgICAgLyoqCi0gICAgICogVHJ1ZSBpZiB0aGlzIGZpZWxkIGlzIGN1cnJlbnRseSBsb2dpY2FsbHkgdW5zcGVjaWZpZWQgaW4gdGhlIG1hdGNoLCBpLmUsIHRoZSAKLSAgICAgKiB2YWx1ZSByZXR1cm5lZCBieSBnZXRWYWx1ZShmKSBoYXMgbm8gaW1wYWN0IG9uIHdoZXRoZXIgYSBwYWNrZXQgd2lsbCBiZSBzZWxlY3RlZCAKKyAgICAgKiBUcnVlIGlmIHRoaXMgZmllbGQgaXMgY3VycmVudGx5IGxvZ2ljYWxseSB1bnNwZWNpZmllZCBpbiB0aGUgbWF0Y2gsIGkuZSwgdGhlCisgICAgICogdmFsdWUgcmV0dXJuZWQgYnkgZ2V0VmFsdWUoZikgaGFzIG5vIGltcGFjdCBvbiB3aGV0aGVyIGEgcGFja2V0IHdpbGwgYmUgc2VsZWN0ZWQKICAgICAgKiBieSB0aGUgbWF0Y2ggb3Igbm90LgotICAgICAqIAorICAgICAqCiAgICAgICogQHBhcmFtIGZpZWxkCiAgICAgICogQHJldHVybgogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGlzRnVsbHlXaWxkY2FyZGVkKE1hdGNoRmllbGQ8Pz4gZmllbGQpOwogCiAgICAgLyoqCi0gICAgICogVHJ1ZSBpZiB0aGlzIGZpZWxkIGlzIGN1cnJlbnRseSBwYXJ0aWFsbHkgc3BlY2lmaWVkIGluIHRoZSBtYXRjaCwgaS5lLCB0aGUgCisgICAgICogVHJ1ZSBpZiB0aGlzIGZpZWxkIGlzIGN1cnJlbnRseSBwYXJ0aWFsbHkgc3BlY2lmaWVkIGluIHRoZSBtYXRjaCwgaS5lLCB0aGUKICAgICAgKiBtYXRjaCB3aWxsIHNlbGVjdCBwYWNrZXRzIHRoYXQgbWF0Y2ggKHAudmFsdWUgJiBnZXRNYXNrKGZpZWxkKSkgPT0gZ2V0VmFsdWUoZmllbGQpLgotICAgICAqIAorICAgICAqCiAgICAgICogQHBhcmFtIGZpZWxkCiAgICAgICogQHJldHVybgogICAgICAqLwpAQCAtODUsNSArODUsOCBAQAogICAgICAqIFJldHVybnMgYSBidWlsZGVyIHRvIGJ1aWxkIG5ldyBpbnN0YW5jZXMgb2YgdGhpcyB0eXBlIG9mIG1hdGNoIG9iamVjdC4KICAgICAgKiBAcmV0dXJuIE1hdGNoIGJ1aWxkZXIKICAgICAgKi8KLSAgICBwdWJsaWMgTWF0Y2hCdWlsZGVyIGdldEJ1aWxkZXIoKTsKKyAgICBwdWJsaWMgTWF0Y2hCdWlsZGVyIGNyZWF0ZUJ1aWxkZXIoKTsKKworICAgIGludGVyZmFjZSBCdWlsZGVyIGV4dGVuZHMgTWF0Y2hCdWlsZGVyIHsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9qYXZhX2dlbi9wcmUtd3JpdHRlbi9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZmxvdy9wcm90b2NvbC9tYXRjaC9NYXRjaEJ1aWxkZXIuamF2YSBiL2phdmFfZ2VuL3ByZS13cml0dGVuL3NyYy9tYWluL2phdmEvb3JnL29wZW5mbG93L3Byb3RvY29sL21hdGNoL01hdGNoQnVpbGRlci5qYXZhCmluZGV4IDQzNzJlMzAuLmJlN2I4YjAgMTAwNjQ0Ci0tLSBhL2phdmFfZ2VuL3ByZS13cml0dGVuL3NyYy9tYWluL2phdmEvb3JnL29wZW5mbG93L3Byb3RvY29sL21hdGNoL01hdGNoQnVpbGRlci5qYXZhCisrKyBiL2phdmFfZ2VuL3ByZS13cml0dGVuL3NyYy9tYWluL2phdmEvb3JnL29wZW5mbG93L3Byb3RvY29sL21hdGNoL01hdGNoQnVpbGRlci5qYXZhCkBAIC0zLDE0ICszLDc3IEBACiBpbXBvcnQgb3JnLm9wZW5mbG93LnR5cGVzLk1hc2tlZDsKIGltcG9ydCBvcmcub3BlbmZsb3cudHlwZXMuT0ZWYWx1ZVR5cGU7CiAKLXB1YmxpYyBpbnRlcmZhY2UgTWF0Y2hCdWlsZGVyIGV4dGVuZHMgTWF0Y2ggewotICAgIHB1YmxpYyA8RiBleHRlbmRzIE9GVmFsdWVUeXBlPEY+PiBNYXRjaEJ1aWxkZXIgc2V0RXhhY3QoTWF0Y2hGaWVsZDxGPiBmaWVsZCwgRiB2YWx1ZSk7Ci0gICAgCi0gICAgcHVibGljIDxGIGV4dGVuZHMgT0ZWYWx1ZVR5cGU8Rj4+IE1hdGNoQnVpbGRlciBzZXRNYXNrZWQoTWF0Y2hGaWVsZDxGPiBmaWVsZCwgRiB2YWx1ZSwgRiBtYXNrKTsgICAgCitwdWJsaWMgaW50ZXJmYWNlIE1hdGNoQnVpbGRlciB7CisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgdmFsdWUgZm9yIHRoZSBnaXZlbiBmaWVsZCBmcm9tIHRoaXMgbWF0Y2guCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmllbGQgTWF0Y2ggZmllbGQgdG8gcmV0cmlldmUKKyAgICAgKiBAcmV0dXJuIFZhbHVlIG9mIG1hdGNoIGZpZWxkCisgICAgICovCisgICAgcHVibGljIDxGIGV4dGVuZHMgT0ZWYWx1ZVR5cGU8Rj4+IEYgZ2V0KE1hdGNoRmllbGQ8Rj4gZmllbGQpIHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbjsKIAotICAgIHB1YmxpYyA8RiBleHRlbmRzIE9GVmFsdWVUeXBlPEY+PiBNYXRjaEJ1aWxkZXIgc2V0TWFza2VkKE1hdGNoRmllbGQ8Rj4gZmllbGQsIE1hc2tlZDxGPiB2YWx1ZVdpdGhNYXNrKTsgICAgCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbWFza2VkIHZhbHVlIGZvciB0aGUgZ2l2ZW4gZmllbGQgZnJvbSB0aGlzIG1hdGNoLgorICAgICAqIFByZWNvbmRpdGlvbjogZmllbGQgaXMgcGFydGlhbGx5IHdpbGRjYXJkZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmllbGQgTWF0Y2ggZmllbGQgdG8gcmV0cmlldmUKKyAgICAgKiBAcmV0dXJuIE1hc2tlZCB2YWx1ZSBvZiBtYXRjaCBmaWVsZCBvciBudWxsIGlmIG5vIG1hc2sKKyAgICAgKi8KKyAgICBwdWJsaWMgPEYgZXh0ZW5kcyBPRlZhbHVlVHlwZTxGPj4gTWFza2VkPEY+IGdldE1hc2tlZChNYXRjaEZpZWxkPEY+IGZpZWxkKSB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBtYXRjaCBvYmplY3Qgc3VwcG9ydHMgdGhlIGdpdmVuIG1hdGNoIGZpZWxkLgorICAgICAqCisgICAgICogQHBhcmFtIGZpZWxkIE1hdGNoIGZpZWxkCisgICAgICogQHJldHVybgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzKE1hdGNoRmllbGQ8Pz4gZmllbGQpOworCisgICAgLyoqCisgICAgICogdHJ1ZSBpZmYgZmllbGQgc3VwcG9ydHMgYSBiaXRtYXNrIG1hc2sgdGhhdCB3aWxkY2FyZHMgcGFydCBvZiB0aGUgZmllbGQKKyAgICAgKiAobm90ZTogbm90IGFsbCBwb3NzaWJsZSB2YWx1ZXMgb2YgdGhpcyBiaXRtYXNrIGhhdmUgdG8gYmUgYWNjZXB0YWJsZSkKKyAgICAgKgorICAgICAqIEBwYXJhbSBmaWVsZCBNYXRjaCBmaWVsZAorICAgICAqIEByZXR1cm4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c01hc2tlZChNYXRjaEZpZWxkPD8+IGZpZWxkKTsKKworICAgIC8qKgorICAgICAqIFRydWUgaWZmIHRoaXMgZmllbGQgaXMgY3VycmVudGx5IGZ1bGx5IHNwZWNpZmllZCBpbiB0aGUgbWF0Y2gsIGkuZS4sIHRoZQorICAgICAqIG1hdGNoIHdpbGwgb25seSBzZWxlY3QgcGFja2V0cyB0aGF0IG1hdGNoIHRoZSBleGFjdCB2YWx1ZSBvZiBnZXRGaWVsZChmaWVsZCkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmllbGQgTWF0Y2ggZmllbGQKKyAgICAgKiBAcmV0dXJuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNFeGFjdChNYXRjaEZpZWxkPD8+IGZpZWxkKTsKKworICAgIC8qKgorICAgICAqIFRydWUgaWYgdGhpcyBmaWVsZCBpcyBjdXJyZW50bHkgbG9naWNhbGx5IHVuc3BlY2lmaWVkIGluIHRoZSBtYXRjaCwgaS5lLCB0aGUKKyAgICAgKiB2YWx1ZSByZXR1cm5lZCBieSBnZXRWYWx1ZShmKSBoYXMgbm8gaW1wYWN0IG9uIHdoZXRoZXIgYSBwYWNrZXQgd2lsbCBiZSBzZWxlY3RlZAorICAgICAqIGJ5IHRoZSBtYXRjaCBvciBub3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmllbGQKKyAgICAgKiBAcmV0dXJuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNGdWxseVdpbGRjYXJkZWQoTWF0Y2hGaWVsZDw/PiBmaWVsZCk7CisKKyAgICAvKioKKyAgICAgKiBUcnVlIGlmIHRoaXMgZmllbGQgaXMgY3VycmVudGx5IHBhcnRpYWxseSBzcGVjaWZpZWQgaW4gdGhlIG1hdGNoLCBpLmUsIHRoZQorICAgICAqIG1hdGNoIHdpbGwgc2VsZWN0IHBhY2tldHMgdGhhdCBtYXRjaCAocC52YWx1ZSAmIGdldE1hc2soZmllbGQpKSA9PSBnZXRWYWx1ZShmaWVsZCkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmllbGQKKyAgICAgKiBAcmV0dXJuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNQYXJ0aWFsbHlNYXNrZWQoTWF0Y2hGaWVsZDw/PiBmaWVsZCk7CisKKworICAgIHB1YmxpYyA8RiBleHRlbmRzIE9GVmFsdWVUeXBlPEY+PiBNYXRjaEJ1aWxkZXIgc2V0RXhhY3QoTWF0Y2hGaWVsZDxGPiBmaWVsZCwgRiB2YWx1ZSk7CisKKyAgICBwdWJsaWMgPEYgZXh0ZW5kcyBPRlZhbHVlVHlwZTxGPj4gTWF0Y2hCdWlsZGVyIHNldE1hc2tlZChNYXRjaEZpZWxkPEY+IGZpZWxkLCBGIHZhbHVlLCBGIG1hc2spOworCisgICAgcHVibGljIDxGIGV4dGVuZHMgT0ZWYWx1ZVR5cGU8Rj4+IE1hdGNoQnVpbGRlciBzZXRNYXNrZWQoTWF0Y2hGaWVsZDxGPiBmaWVsZCwgTWFza2VkPEY+IHZhbHVlV2l0aE1hc2spOwogCiAgICAgcHVibGljIDxGIGV4dGVuZHMgT0ZWYWx1ZVR5cGU8Rj4+IE1hdGNoQnVpbGRlciB3aWxkY2FyZChNYXRjaEZpZWxkPEY+IGZpZWxkKTsKLSAgICAKKwogICAgIHB1YmxpYyBNYXRjaCBnZXRNYXRjaCgpOwogfQpkaWZmIC0tZ2l0IGEvamF2YV9nZW4vcHJlLXdyaXR0ZW4vc3JjL21haW4vamF2YS9vcmcvb3BlbmZsb3cvcHJvdG9jb2wvbWF0Y2gvTWF0Y2hCdWlsZGVyVmVyMTAuamF2YSBiL2phdmFfZ2VuL3ByZS13cml0dGVuL3NyYy9tYWluL2phdmEvb3JnL29wZW5mbG93L3Byb3RvY29sL21hdGNoL01hdGNoQnVpbGRlclZlcjEwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyYzc3ZTUuLjAwMDAwMDAKLS0tIGEvamF2YV9nZW4vcHJlLXdyaXR0ZW4vc3JjL21haW4vamF2YS9vcmcvb3BlbmZsb3cvcHJvdG9jb2wvbWF0Y2gvTWF0Y2hCdWlsZGVyVmVyMTAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MyArMCwwIEBACi1wYWNrYWdlIG9yZy5vcGVuZmxvdy5wcm90b2NvbC5tYXRjaDsKLQotaW1wb3J0IG9yZy5qYm9zcy5uZXR0eS5idWZmZXIuQ2hhbm5lbEJ1ZmZlcjsKLWltcG9ydCBvcmcub3BlbmZsb3cudHlwZXMuRXRoVHlwZTsKLWltcG9ydCBvcmcub3BlbmZsb3cudHlwZXMuSVB2NDsKLWltcG9ydCBvcmcub3BlbmZsb3cudHlwZXMuSXBEc2NwOwotaW1wb3J0IG9yZy5vcGVuZmxvdy50eXBlcy5JcFByb3RvY29sOwotaW1wb3J0IG9yZy5vcGVuZmxvdy50eXBlcy5NYWNBZGRyZXNzOwotaW1wb3J0IG9yZy5vcGVuZmxvdy50eXBlcy5NYXNrZWQ7Ci1pbXBvcnQgb3JnLm9wZW5mbG93LnR5cGVzLk9GUG9ydDsKLWltcG9ydCBvcmcub3BlbmZsb3cudHlwZXMuT0ZWYWx1ZVR5cGU7Ci1pbXBvcnQgb3JnLm9wZW5mbG93LnR5cGVzLlUxNjsKLWltcG9ydCBvcmcub3BlbmZsb3cudHlwZXMuVmxhblBjcDsKLWltcG9ydCBvcmcub3BlbmZsb3cudHlwZXMuVmxhblZpZDsKLQotcHVibGljIGNsYXNzIE1hdGNoQnVpbGRlclZlcjEwIGltcGxlbWVudHMgTWF0Y2hCdWlsZGVyIHsKLQotICAgIGludGVyZmFjZSBCdWlsZGVyUGFyYW1IYW5kbGVyPFQ+IHsKLSAgICAgICAgcHVibGljIFQgZ2V0KE1hdGNoQnVpbGRlclZlcjEwIGJ1aWxkZXIpOwotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldChNYXRjaEJ1aWxkZXJWZXIxMCBidWlsZGVyLCBUIHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvLyBwdWJsaWMgc3RhdGljIE1hcDxNYXRjaEZpZWxkPD8sPz4sIEJ1aWxkZXJQYXJhbUhhbmRsZXI8Pz4+Ci0gICAgLy8gaGFuZGxlck1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgICBwcm90ZWN0ZWQgaW50IHdpbGRjYXJkczsKLSAgICBwcm90ZWN0ZWQgT0ZQb3J0IGlucHV0UG9ydDsKLSAgICBwcm90ZWN0ZWQgTWFjQWRkcmVzcyBkYXRhTGF5ZXJTb3VyY2U7Ci0gICAgcHJvdGVjdGVkIE1hY0FkZHJlc3MgZGF0YUxheWVyRGVzdGluYXRpb247Ci0gICAgcHJvdGVjdGVkIFZsYW5WaWQgZGF0YUxheWVyVmlydHVhbExhbjsKLSAgICBwcm90ZWN0ZWQgVmxhblBjcCBkYXRhTGF5ZXJWaXJ0dWFsTGFuUHJpb3JpdHlDb2RlUG9pbnQ7Ci0gICAgcHJvdGVjdGVkIEV0aFR5cGUgZGF0YUxheWVyVHlwZTsKLSAgICBwcm90ZWN0ZWQgSXBEc2NwIGlwRHNjcDsKLSAgICBwcm90ZWN0ZWQgSXBQcm90b2NvbCBuZXR3b3JrUHJvdG9jb2w7Ci0gICAgcHJvdGVjdGVkIElQdjQgbmV0d29ya1NvdXJjZTsKLSAgICBwcm90ZWN0ZWQgSVB2NCBuZXR3b3JrRGVzdGluYXRpb247Ci0gICAgcHJvdGVjdGVkIFUxNiB0cmFuc3BvcnRTb3VyY2U7Ci0gICAgcHJvdGVjdGVkIFUxNiB0cmFuc3BvcnREZXN0aW5hdGlvbjsKLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyA8RiBleHRlbmRzIE9GVmFsdWVUeXBlPEY+PiBGIGdldChmaW5hbCBNYXRjaEZpZWxkPEY+IG1hdGNoKSB7Ci0gICAgICAgIHN3aXRjaCAobWF0Y2guaWQpIHsKLSAgICAgICAgICAgIGNhc2UgSU5fUE9SVDoKLSAgICAgICAgICAgICAgICByZXR1cm4gKEYpIGlucHV0UG9ydDsKLSAgICAgICAgICAgIGNhc2UgRVRIX1NSQzoKLSAgICAgICAgICAgICAgICByZXR1cm4gKEYpIGRhdGFMYXllclNvdXJjZTsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgPEYgZXh0ZW5kcyBPRlZhbHVlVHlwZTxGPj4gTWFza2VkPEY+Ci0gICAgICAgICAgICBnZXRNYXNrZWQoTWF0Y2hGaWVsZDxGPiBmaWVsZCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gewotICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyA8RiBleHRlbmRzIE9GVmFsdWVUeXBlPEY+PiBNYXRjaEJ1aWxkZXIgc2V0RXhhY3QoZmluYWwgTWF0Y2hGaWVsZDxGPiBtYXRjaCwgZmluYWwgRiB2YWx1ZSkgewotICAgICAgICBzd2l0Y2ggKG1hdGNoLmlkKSB7Ci0gICAgICAgICAgICBjYXNlIElOX1BPUlQ6Ci0gICAgICAgICAgICAgICAgaW5wdXRQb3J0ID0gKE9GUG9ydCkgdmFsdWU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEVUSF9TUkM6Ci0gICAgICAgICAgICAgICAgZGF0YUxheWVyU291cmNlID0gKE1hY0FkZHJlc3MpIHZhbHVlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIDxGIGV4dGVuZHMgT0ZWYWx1ZVR5cGU8Rj4+IE1hdGNoQnVpbGRlcgotICAgICAgICAgICAgc2V0TWFza2VkKE1hdGNoRmllbGQ8Rj4gZmllbGQsIE1hc2tlZDxGPiB2YWx1ZVdpdGhNYXNrKSB7Ci0gICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIDxGIGV4dGVuZHMgT0ZWYWx1ZVR5cGU8Rj4+IE1hdGNoQnVpbGRlcgotICAgICAgICAgICAgc2V0TWFza2VkKE1hdGNoRmllbGQ8Rj4gZmllbGQsIEYgdmFsdWUsIEYgbWFzaykgewotICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyA8RiBleHRlbmRzIE9GVmFsdWVUeXBlPEY+PiBNYXRjaEJ1aWxkZXIgd2lsZGNhcmQoZmluYWwgTWF0Y2hGaWVsZDxGPiBtYXRjaCkgewotICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBPRlBvcnQgZ2V0SW5wdXRQb3J0KCkgewotICAgICAgICByZXR1cm4gaW5wdXRQb3J0OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldElucHV0UG9ydChmaW5hbCBPRlBvcnQgaW5wdXRQb3J0KSB7Ci0gICAgICAgIHRoaXMuaW5wdXRQb3J0ID0gaW5wdXRQb3J0OwotICAgIH0KLQotICAgIHB1YmxpYyBNYWNBZGRyZXNzIGdldERhdGFMYXllclNvdXJjZSgpIHsKLSAgICAgICAgcmV0dXJuIGRhdGFMYXllclNvdXJjZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXREYXRhTGF5ZXJTb3VyY2UoZmluYWwgTWFjQWRkcmVzcyBkYXRhTGF5ZXJTb3VyY2UpIHsKLSAgICAgICAgdGhpcy5kYXRhTGF5ZXJTb3VyY2UgPSBkYXRhTGF5ZXJTb3VyY2U7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHMoZmluYWwgTWF0Y2hGaWVsZDw/PiBmaWVsZCkgewotICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c01hc2tlZChmaW5hbCBNYXRjaEZpZWxkPD8+IGZpZWxkKSB7Ci0gICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzRXhhY3QoZmluYWwgTWF0Y2hGaWVsZDw/PiBmaWVsZCkgewotICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0Z1bGx5V2lsZGNhcmRlZChmaW5hbCBNYXRjaEZpZWxkPD8+IGZpZWxkKSB7Ci0gICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzUGFydGlhbGx5TWFza2VkKGZpbmFsIE1hdGNoRmllbGQ8Pz4gZmllbGQpIHsKLSAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE1hdGNoQnVpbGRlciBnZXRCdWlsZGVyKCkgewotICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHdyaXRlVG8oZmluYWwgQ2hhbm5lbEJ1ZmZlciBiYikgewotICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0KLSAgICB9Ci0vKgotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyA8TT4gdm9pZCBzZXRNYXNrZWQoZmluYWwgTWF0Y2hGaWVsZDw/LCBNPiBtYXRjaCwgZmluYWwgTSB2YWx1ZSkgewotICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0KLSAgICB9Ci0qLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBNYXRjaCBnZXRNYXRjaCgpIHsKLSAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2phdmFfZ2VuL3ByZS13cml0dGVuL3NyYy9tYWluL2phdmEvb3JnL29wZW5mbG93L3V0aWwvQ2hhbm5lbFV0aWxzLmphdmEgYi9qYXZhX2dlbi9wcmUtd3JpdHRlbi9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZmxvdy9wcm90b2NvbC92ZXIxMC9DaGFubmVsVXRpbHNWZXIxMC5qYXZhCnNpbWlsYXJpdHkgaW5kZXggNzUlCmNvcHkgZnJvbSBqYXZhX2dlbi9wcmUtd3JpdHRlbi9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZmxvdy91dGlsL0NoYW5uZWxVdGlscy5qYXZhCmNvcHkgdG8gamF2YV9nZW4vcHJlLXdyaXR0ZW4vc3JjL21haW4vamF2YS9vcmcvb3BlbmZsb3cvcHJvdG9jb2wvdmVyMTAvQ2hhbm5lbFV0aWxzVmVyMTAuamF2YQppbmRleCBkYWI2ZmYyLi42N2M5MTRkIDEwMDY0NAotLS0gYS9qYXZhX2dlbi9wcmUtd3JpdHRlbi9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZmxvdy91dGlsL0NoYW5uZWxVdGlscy5qYXZhCisrKyBiL2phdmFfZ2VuL3ByZS13cml0dGVuL3NyYy9tYWluL2phdmEvb3JnL29wZW5mbG93L3Byb3RvY29sL3ZlcjEwL0NoYW5uZWxVdGlsc1ZlcjEwLmphdmEKQEAgLTEsNCArMSw0IEBACi1wYWNrYWdlIG9yZy5vcGVuZmxvdy51dGlsOworcGFja2FnZSBvcmcub3BlbmZsb3cucHJvdG9jb2wudmVyMTA7CiAKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIApAQCAtMTMsMTggKzEzLDIxIEBACiBpbXBvcnQgb3JnLm9wZW5mbG93LnByb3RvY29sLk9GSGVsbG9FbGVtOwogaW1wb3J0IG9yZy5vcGVuZmxvdy5wcm90b2NvbC5PRk1ldGVyRmVhdHVyZXM7CiBpbXBvcnQgb3JnLm9wZW5mbG93LnByb3RvY29sLk9GTWV0ZXJTdGF0czsKK2ltcG9ydCBvcmcub3BlbmZsb3cucHJvdG9jb2wuT0ZPYmplY3Q7CiBpbXBvcnQgb3JnLm9wZW5mbG93LnByb3RvY29sLk9GUGFja2V0UXVldWU7CiBpbXBvcnQgb3JnLm9wZW5mbG93LnByb3RvY29sLk9GUG9ydFN0YXRzRW50cnk7CiBpbXBvcnQgb3JnLm9wZW5mbG93LnByb3RvY29sLk9GUXVldWVTdGF0c0VudHJ5OwogaW1wb3J0IG9yZy5vcGVuZmxvdy5wcm90b2NvbC5PRlRhYmxlRmVhdHVyZTsKIGltcG9ydCBvcmcub3BlbmZsb3cucHJvdG9jb2wuT0ZUYWJsZUZlYXR1cmVzOwogaW1wb3J0IG9yZy5vcGVuZmxvdy5wcm90b2NvbC5PRlRhYmxlU3RhdHNFbnRyeTsKK2ltcG9ydCBvcmcub3BlbmZsb3cucHJvdG9jb2wuV2lsZGNhcmRzOwogaW1wb3J0IG9yZy5vcGVuZmxvdy5wcm90b2NvbC5hY3Rpb24uT0ZBY3Rpb247CiBpbXBvcnQgb3JnLm9wZW5mbG93LnByb3RvY29sLmluc3RydWN0aW9uLk9GSW5zdHJ1Y3Rpb247CiBpbXBvcnQgb3JnLm9wZW5mbG93LnByb3RvY29sLm1hdGNoLk1hdGNoOworaW1wb3J0IG9yZy5vcGVuZmxvdy5wcm90b2NvbC5tZXRlcmJhbmQuT0ZNZXRlckJhbmQ7CitpbXBvcnQgb3JnLm9wZW5mbG93LnByb3RvY29sLm94bS5PRk94bTsKIGltcG9ydCBvcmcub3BlbmZsb3cudHlwZXMuT0ZGbG93TW9kQ21kOwogaW1wb3J0IG9yZy5vcGVuZmxvdy50eXBlcy5PRkhlbGxvRWxlbWVudDsKLWltcG9ydCBvcmcub3BlbmZsb3cudHlwZXMuT0ZNZXRlckJhbmQ7CiBpbXBvcnQgb3JnLm9wZW5mbG93LnR5cGVzLk9GUGh5c2ljYWxQb3J0OwogCiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5DaGFyc2V0czsKQEAgLTM1LDcgKzM4LDcgQEAKICAqIEBhdXRob3IgY2FwdmVnCiAgKi8KIAotcHVibGljIGNsYXNzIENoYW5uZWxVdGlscyB7CitwdWJsaWMgY2xhc3MgQ2hhbm5lbFV0aWxzVmVyMTAgewogCiAgICAgc3RhdGljIHB1YmxpYyBieXRlW10gcmVhZEJ5dGVzKGZpbmFsIENoYW5uZWxCdWZmZXIgYmIsIGZpbmFsIGludCBsZW5ndGgpIHsKICAgICAgICAgYnl0ZSBieXRlQXJyYXlbXSA9IG5ldyBieXRlW2xlbmd0aF07CkBAIC00MywxOCArNDYsMTkgQEAKICAgICAgICAgcmV0dXJuIGJ5dGVBcnJheTsKICAgICB9CiAKLSAgICBzdGF0aWMgcHVibGljIHZvaWQgd3JpdGVCeXRlcyhmaW5hbCBDaGFubmVsQnVmZmVyIGJiLCBmaW5hbCBieXRlIGJ5dGVBcnJheVtdKSB7CisgICAgc3RhdGljIHB1YmxpYyB2b2lkIHdyaXRlQnl0ZXMoZmluYWwgQ2hhbm5lbEJ1ZmZlciBiYiwKKyAgICAgICAgICAgIGZpbmFsIGJ5dGUgYnl0ZUFycmF5W10pIHsKICAgICAgICAgYmIud3JpdGVCeXRlcyhieXRlQXJyYXkpOwogICAgIH0KIAotICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxPRlBoeXNpY2FsUG9ydD4gcmVhZFBoeXNpY2FsUG9ydExpc3QoZmluYWwgQ2hhbm5lbEJ1ZmZlciBiYiwKLSAgICAgICAgICAgIGZpbmFsIGludCBpKSB7CisgICAgcHVibGljIHN0YXRpYyBMaXN0PE9GUGh5c2ljYWxQb3J0PiByZWFkUGh5c2ljYWxQb3J0TGlzdCgKKyAgICAgICAgICAgIGZpbmFsIENoYW5uZWxCdWZmZXIgYmIsIGZpbmFsIGludCBpKSB7CiAgICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyBMaXN0PE9GSW5zdHJ1Y3Rpb24+IHJlYWRJbnN0cnVjdGlvbnNMaXN0KGZpbmFsIENoYW5uZWxCdWZmZXIgYmIsCi0gICAgICAgICAgICBmaW5hbCBpbnQgaSkgeworICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxPRkluc3RydWN0aW9uPiByZWFkSW5zdHJ1Y3Rpb25zTGlzdCgKKyAgICAgICAgICAgIGZpbmFsIENoYW5uZWxCdWZmZXIgYmIsIGZpbmFsIGludCBpKSB7CiAgICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQpAQCAtNjksMTIgKzczLDE0IEBACiAgICAgICAgIHJldHVybiBudWxsOwogICAgIH0KIAotICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxPRkFjdGlvbj4gcmVhZEFjdGlvbnNMaXN0KGZpbmFsIENoYW5uZWxCdWZmZXIgYmIsIGZpbmFsIGludCBpKSB7CisgICAgcHVibGljIHN0YXRpYyBMaXN0PE9GQWN0aW9uPiByZWFkQWN0aW9uc0xpc3QoZmluYWwgQ2hhbm5lbEJ1ZmZlciBiYiwKKyAgICAgICAgICAgIGZpbmFsIGludCBpKSB7CiAgICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyBMaXN0PE9GQnNuSW50ZXJmYWNlPiByZWFkQnNuSW50ZXJmYWNlTGlzdChmaW5hbCBDaGFubmVsQnVmZmVyIGJiKSB7CisgICAgcHVibGljIHN0YXRpYyBMaXN0PE9GQnNuSW50ZXJmYWNlPiByZWFkQnNuSW50ZXJmYWNlTGlzdCgKKyAgICAgICAgICAgIGZpbmFsIENoYW5uZWxCdWZmZXIgYmIsIGludCBsZW5ndGgpIHsKICAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgogICAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CkBAIC04NCwyMyArOTAsMjUgQEAKICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyBMaXN0PE9GUGFja2V0UXVldWU+IHJlYWRQYWNrZXRRdWV1ZUxpc3QoZmluYWwgQ2hhbm5lbEJ1ZmZlciBiYiwKLSAgICAgICAgICAgIGZpbmFsIGludCBpKSB7CisgICAgcHVibGljIHN0YXRpYyBMaXN0PE9GUGFja2V0UXVldWU+IHJlYWRQYWNrZXRRdWV1ZUxpc3QoCisgICAgICAgICAgICBmaW5hbCBDaGFubmVsQnVmZmVyIGJiLCBmaW5hbCBpbnQgaSkgewogICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCiAgICAgICAgIHJldHVybiBudWxsOwogICAgIH0KIAotICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxPRkhlbGxvRWxlbWVudD4gcmVhZEhlbGxvRWxlbWVudExpc3QoZmluYWwgQ2hhbm5lbEJ1ZmZlciBiYikgeworICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxPRkhlbGxvRWxlbWVudD4gcmVhZEhlbGxvRWxlbWVudExpc3QoCisgICAgICAgICAgICBmaW5hbCBDaGFubmVsQnVmZmVyIGJiKSB7CiAgICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyBMaXN0PE9GQnVja2V0PiByZWFkQnVja2V0TGlzdChmaW5hbCBDaGFubmVsQnVmZmVyIGJiLCBmaW5hbCBpbnQgaSkgeworICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxPRkJ1Y2tldD4gcmVhZEJ1Y2tldExpc3QoZmluYWwgQ2hhbm5lbEJ1ZmZlciBiYiwKKyAgICAgICAgICAgIGZpbmFsIGludCBsZW5ndGgpIHsKICAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgogICAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CiAKLSAgICBwdWJsaWMgc3RhdGljIExpc3Q8T0ZNZXRlckJhbmQ+IHJlYWRNZXRlckJhbmRMaXN0KGZpbmFsIENoYW5uZWxCdWZmZXIgYmIpIHsKKyAgICBwdWJsaWMgc3RhdGljIExpc3Q8T0ZNZXRlckJhbmQ+IHJlYWRNZXRlckJhbmRMaXN0KGZpbmFsIENoYW5uZWxCdWZmZXIgYmIsIGludCBsZW5ndGgpIHsKICAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgogICAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CkBAIC0xMTAsOSArMTE4LDEwIEBACiAKICAgICB9CiAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVMaXN0KENoYW5uZWxCdWZmZXIgYmIsIExpc3Q8Pz4gcG9ydHMpIHsKLSAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHdyaXRlTGlzdChDaGFubmVsQnVmZmVyIGJiLCBMaXN0PD8gZXh0ZW5kcyBPRk9iamVjdD4gb2JqZWN0cykgeworICAgICAgICBmb3IoT0ZPYmplY3QgbyA6IG9iamVjdHMpIHsKKyAgICAgICAgICAgIG8ud3JpdGVUbyhiYik7CisgICAgICAgIH0KICAgICB9CiAKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVPRkZsb3dNb2RDbWQoQ2hhbm5lbEJ1ZmZlciBiYiwgT0ZGbG93TW9kQ21kIGNvbW1hbmQpIHsKQEAgLTEyNiwxOCArMTM1LDIxIEBACiAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nKGRzdCwgQ2hhcnNldHMuVVNfQVNDSUkpOwogICAgIH0KIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZUZpeGVkTGVuZ3RoU3RyaW5nKENoYW5uZWxCdWZmZXIgYmIsIFN0cmluZyBzdHJpbmcsIGludCBsZW5ndGgpIHsKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVGaXhlZExlbmd0aFN0cmluZyhDaGFubmVsQnVmZmVyIGJiLCBTdHJpbmcgc3RyaW5nLAorICAgICAgICAgICAgaW50IGxlbmd0aCkgewogICAgICAgICBpbnQgbCA9IHN0cmluZy5sZW5ndGgoKTsKLSAgICAgICAgaWYobCA+IGxlbmd0aCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiRXJyb3Igd3JpdGluZyBzdHJpbmc6IGxlbmd0aD0iK2wrIiA+IG1heCBMZW5ndGg9IitsZW5ndGgpOworICAgICAgICBpZiAobCA+IGxlbmd0aCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiRXJyb3Igd3JpdGluZyBzdHJpbmc6IGxlbmd0aD0iCisgICAgICAgICAgICAgICAgICAgICsgbCArICIgPiBtYXggTGVuZ3RoPSIgKyBsZW5ndGgpOwogICAgICAgICB9CiAgICAgICAgIGJiLndyaXRlQnl0ZXMoc3RyaW5nLmdldEJ5dGVzKENoYXJzZXRzLlVTX0FTQ0lJKSk7Ci0gICAgICAgIGlmKGwgPCBsZW5ndGgpIHsKKyAgICAgICAgaWYgKGwgPCBsZW5ndGgpIHsKICAgICAgICAgICAgIGJiLndyaXRlWmVybyhsZW5ndGggLSBsKTsKICAgICAgICAgfQogICAgIH0KIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZUJzbkludGVyZmFjZUxpc3QoQ2hhbm5lbEJ1ZmZlciBiYiwgTGlzdDxPRkJzbkludGVyZmFjZT4gaW50ZXJmYWNlcykgeworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZUJzbkludGVyZmFjZUxpc3QoQ2hhbm5lbEJ1ZmZlciBiYiwKKyAgICAgICAgICAgIExpc3Q8T0ZCc25JbnRlcmZhY2U+IGludGVyZmFjZXMpIHsKICAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgogCiAgICAgfQpAQCAtMTcyLDEyICsxODQsMTIgQEAKICAgICB9CiAKICAgICBwdWJsaWMgc3RhdGljIExpc3Q8T0ZUYWJsZVN0YXRzRW50cnk+IHJlYWRUYWJsZVN0YXRzRW50cnlMaXN0KAotICAgICAgICAgICAgQ2hhbm5lbEJ1ZmZlciBiYikgeworICAgICAgICAgICAgQ2hhbm5lbEJ1ZmZlciBiYiwgaW50IGxlbmd0aCkgewogICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCiAgICAgICAgIHJldHVybiBudWxsOwogICAgIH0KIAotICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxPRkZsb3dTdGF0c0VudHJ5PiByZWFkRmxvd1N0YXRzRW50cnlMaXN0KENoYW5uZWxCdWZmZXIgYmIpIHsKKyAgICBwdWJsaWMgc3RhdGljIExpc3Q8T0ZGbG93U3RhdHNFbnRyeT4gcmVhZEZsb3dTdGF0c0VudHJ5TGlzdChDaGFubmVsQnVmZmVyIGJiLCBpbnQgbGVuZ3RoKSB7CiAgICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQpAQCAtMTk1LDcgKzIwNyw3IEBACiAgICAgfQogCiAgICAgcHVibGljIHN0YXRpYyBMaXN0PE9GR3JvdXBEZXNjU3RhdHNFbnRyeT4gcmVhZEdyb3VwRGVzY1N0YXRzRW50cnlMaXN0KAotICAgICAgICAgICAgQ2hhbm5lbEJ1ZmZlciBiYikgeworICAgICAgICAgICAgQ2hhbm5lbEJ1ZmZlciBiYiwgaW50IGxlbmd0aCkgewogICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCiAgICAgICAgIHJldHVybiBudWxsOwogICAgIH0KQEAgLTIzMyw3ICsyNDUsNyBAQAogCiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyBMaXN0PE9GUG9ydFN0YXRzRW50cnk+IHJlYWRQb3J0U3RhdHNFbnRyeUxpc3QoQ2hhbm5lbEJ1ZmZlciBiYikgeworICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxPRlBvcnRTdGF0c0VudHJ5PiByZWFkUG9ydFN0YXRzRW50cnlMaXN0KENoYW5uZWxCdWZmZXIgYmIsIGludCBsZW5ndGgpIHsKICAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgogICAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CkBAIC0yNDQsNyArMjU2LDcgQEAKIAogICAgIH0KIAotICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxPRkhlbGxvRWxlbT4gcmVhZEhlbGxvRWxlbUxpc3QoQ2hhbm5lbEJ1ZmZlciBiYikgeworICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxPRkhlbGxvRWxlbT4gcmVhZEhlbGxvRWxlbUxpc3QoQ2hhbm5lbEJ1ZmZlciBiYiwgaW50IGxlbmd0aCkgewogICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCiAgICAgICAgIHJldHVybiBudWxsOwogICAgIH0KQEAgLTI2OCw3ICsyODAsNyBAQAogICAgIH0KIAogICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxPRlF1ZXVlU3RhdHNFbnRyeT4gcmVhZFF1ZXVlU3RhdHNFbnRyeUxpc3QoCi0gICAgICAgICAgICBDaGFubmVsQnVmZmVyIGJiKSB7CisgICAgICAgICAgICBDaGFubmVsQnVmZmVyIGJiLCBpbnQgbGVuZ3RoKSB7CiAgICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQpAQCAtMjkwLDcgKzMwMiw3IEBACiAKICAgICB9CiAKLSAgICBwdWJsaWMgc3RhdGljIExpc3Q8T0ZNZXRlclN0YXRzPiByZWFkTWV0ZXJTdGF0c0xpc3QoQ2hhbm5lbEJ1ZmZlciBiYikgeworICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxPRk1ldGVyU3RhdHM+IHJlYWRNZXRlclN0YXRzTGlzdChDaGFubmVsQnVmZmVyIGJiLCBpbnQgbGVuZ3RoKSB7CiAgICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQpAQCAtMzAxLDcgKzMxMyw3IEBACiAKICAgICB9CiAKLSAgICBwdWJsaWMgc3RhdGljIExpc3Q8T0ZUYWJsZUZlYXR1cmVzPiByZWFkVGFibGVGZWF0dXJlc0xpc3QoQ2hhbm5lbEJ1ZmZlciBiYikgeworICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxPRlRhYmxlRmVhdHVyZXM+IHJlYWRUYWJsZUZlYXR1cmVzTGlzdChDaGFubmVsQnVmZmVyIGJiLCBpbnQgbGVuZ3RoKSB7CiAgICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQpAQCAtMzEyLDUgKzMyNCwzOSBAQAogCiAgICAgfQogCisgICAgcHVibGljIHN0YXRpYyBPRk94bSByZWFkT0ZPeG0oQ2hhbm5lbEJ1ZmZlciBiYikgeworICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZU9GT3htKENoYW5uZWxCdWZmZXIgYmIsIE9GT3htIGZpZWxkKSB7CisgICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZU94bUxpc3QoQ2hhbm5lbEJ1ZmZlciBiYiwgTGlzdDxPRk94bT4gb3htTGlzdCkgeworICAgICAgICBmb3IoT0ZPeG0gbzogb3htTGlzdCkgeworICAgICAgICAgICAgby53cml0ZVRvKGJiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxPRk94bT4gcmVhZE94bUxpc3QoQ2hhbm5lbEJ1ZmZlciBiYiwgaW50IGxlbmd0aCkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFdpbGRjYXJkcyByZWFkV2lsZGNhcmRzKENoYW5uZWxCdWZmZXIgYmIpIHsKKyAgICAgICAgcmV0dXJuIFdpbGRjYXJkcy5vZihiYi5yZWFkSW50KCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZVdpbGRjYXJkcyhDaGFubmVsQnVmZmVyIGJiLCBXaWxkY2FyZHMgd2lsZGNhcmRzKSB7CisgICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZVBoeXNpY2FsUG9ydExpc3QoQ2hhbm5lbEJ1ZmZlciBiYiwKKyAgICAgICAgICAgIExpc3Q8T0ZQaHlzaWNhbFBvcnQ+IHBvcnRzKSB7CisgICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKworICAgIH0KIAogfQpkaWZmIC0tZ2l0IGEvamF2YV9nZW4vcHJlLXdyaXR0ZW4vc3JjL21haW4vamF2YS9vcmcvb3BlbmZsb3cvdXRpbC9DaGFubmVsVXRpbHMuamF2YSBiL2phdmFfZ2VuL3ByZS13cml0dGVuL3NyYy9tYWluL2phdmEvb3JnL29wZW5mbG93L3Byb3RvY29sL3ZlcjExL0NoYW5uZWxVdGlsc1ZlcjExLmphdmEKc2ltaWxhcml0eSBpbmRleCA3NSUKY29weSBmcm9tIGphdmFfZ2VuL3ByZS13cml0dGVuL3NyYy9tYWluL2phdmEvb3JnL29wZW5mbG93L3V0aWwvQ2hhbm5lbFV0aWxzLmphdmEKY29weSB0byBqYXZhX2dlbi9wcmUtd3JpdHRlbi9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZmxvdy9wcm90b2NvbC92ZXIxMS9DaGFubmVsVXRpbHNWZXIxMS5qYXZhCmluZGV4IGRhYjZmZjIuLjFhMGRmNTggMTAwNjQ0Ci0tLSBhL2phdmFfZ2VuL3ByZS13cml0dGVuL3NyYy9tYWluL2phdmEvb3JnL29wZW5mbG93L3V0aWwvQ2hhbm5lbFV0aWxzLmphdmEKKysrIGIvamF2YV9nZW4vcHJlLXdyaXR0ZW4vc3JjL21haW4vamF2YS9vcmcvb3BlbmZsb3cvcHJvdG9jb2wvdmVyMTEvQ2hhbm5lbFV0aWxzVmVyMTEuamF2YQpAQCAtMSw0ICsxLDQgQEAKLXBhY2thZ2Ugb3JnLm9wZW5mbG93LnV0aWw7CitwYWNrYWdlIG9yZy5vcGVuZmxvdy5wcm90b2NvbC52ZXIxMTsKIAogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogCkBAIC0xMywxOCArMTMsMjEgQEAKIGltcG9ydCBvcmcub3BlbmZsb3cucHJvdG9jb2wuT0ZIZWxsb0VsZW07CiBpbXBvcnQgb3JnLm9wZW5mbG93LnByb3RvY29sLk9GTWV0ZXJGZWF0dXJlczsKIGltcG9ydCBvcmcub3BlbmZsb3cucHJvdG9jb2wuT0ZNZXRlclN0YXRzOworaW1wb3J0IG9yZy5vcGVuZmxvdy5wcm90b2NvbC5PRk9iamVjdDsKIGltcG9ydCBvcmcub3BlbmZsb3cucHJvdG9jb2wuT0ZQYWNrZXRRdWV1ZTsKIGltcG9ydCBvcmcub3BlbmZsb3cucHJvdG9jb2wuT0ZQb3J0U3RhdHNFbnRyeTsKIGltcG9ydCBvcmcub3BlbmZsb3cucHJvdG9jb2wuT0ZRdWV1ZVN0YXRzRW50cnk7CiBpbXBvcnQgb3JnLm9wZW5mbG93LnByb3RvY29sLk9GVGFibGVGZWF0dXJlOwogaW1wb3J0IG9yZy5vcGVuZmxvdy5wcm90b2NvbC5PRlRhYmxlRmVhdHVyZXM7CiBpbXBvcnQgb3JnLm9wZW5mbG93LnByb3RvY29sLk9GVGFibGVTdGF0c0VudHJ5OworaW1wb3J0IG9yZy5vcGVuZmxvdy5wcm90b2NvbC5XaWxkY2FyZHM7CiBpbXBvcnQgb3JnLm9wZW5mbG93LnByb3RvY29sLmFjdGlvbi5PRkFjdGlvbjsKIGltcG9ydCBvcmcub3BlbmZsb3cucHJvdG9jb2wuaW5zdHJ1Y3Rpb24uT0ZJbnN0cnVjdGlvbjsKIGltcG9ydCBvcmcub3BlbmZsb3cucHJvdG9jb2wubWF0Y2guTWF0Y2g7CitpbXBvcnQgb3JnLm9wZW5mbG93LnByb3RvY29sLm1ldGVyYmFuZC5PRk1ldGVyQmFuZDsKK2ltcG9ydCBvcmcub3BlbmZsb3cucHJvdG9jb2wub3htLk9GT3htOwogaW1wb3J0IG9yZy5vcGVuZmxvdy50eXBlcy5PRkZsb3dNb2RDbWQ7CiBpbXBvcnQgb3JnLm9wZW5mbG93LnR5cGVzLk9GSGVsbG9FbGVtZW50OwotaW1wb3J0IG9yZy5vcGVuZmxvdy50eXBlcy5PRk1ldGVyQmFuZDsKIGltcG9ydCBvcmcub3BlbmZsb3cudHlwZXMuT0ZQaHlzaWNhbFBvcnQ7CiAKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLkNoYXJzZXRzOwpAQCAtMzUsNyArMzgsNyBAQAogICogQGF1dGhvciBjYXB2ZWcKICAqLwogCi1wdWJsaWMgY2xhc3MgQ2hhbm5lbFV0aWxzIHsKK3B1YmxpYyBjbGFzcyBDaGFubmVsVXRpbHNWZXIxMSB7CiAKICAgICBzdGF0aWMgcHVibGljIGJ5dGVbXSByZWFkQnl0ZXMoZmluYWwgQ2hhbm5lbEJ1ZmZlciBiYiwgZmluYWwgaW50IGxlbmd0aCkgewogICAgICAgICBieXRlIGJ5dGVBcnJheVtdID0gbmV3IGJ5dGVbbGVuZ3RoXTsKQEAgLTQzLDE4ICs0NiwxOSBAQAogICAgICAgICByZXR1cm4gYnl0ZUFycmF5OwogICAgIH0KIAotICAgIHN0YXRpYyBwdWJsaWMgdm9pZCB3cml0ZUJ5dGVzKGZpbmFsIENoYW5uZWxCdWZmZXIgYmIsIGZpbmFsIGJ5dGUgYnl0ZUFycmF5W10pIHsKKyAgICBzdGF0aWMgcHVibGljIHZvaWQgd3JpdGVCeXRlcyhmaW5hbCBDaGFubmVsQnVmZmVyIGJiLAorICAgICAgICAgICAgZmluYWwgYnl0ZSBieXRlQXJyYXlbXSkgewogICAgICAgICBiYi53cml0ZUJ5dGVzKGJ5dGVBcnJheSk7CiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyBMaXN0PE9GUGh5c2ljYWxQb3J0PiByZWFkUGh5c2ljYWxQb3J0TGlzdChmaW5hbCBDaGFubmVsQnVmZmVyIGJiLAotICAgICAgICAgICAgZmluYWwgaW50IGkpIHsKKyAgICBwdWJsaWMgc3RhdGljIExpc3Q8T0ZQaHlzaWNhbFBvcnQ+IHJlYWRQaHlzaWNhbFBvcnRMaXN0KAorICAgICAgICAgICAgZmluYWwgQ2hhbm5lbEJ1ZmZlciBiYiwgZmluYWwgaW50IGkpIHsKICAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgogICAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CiAKLSAgICBwdWJsaWMgc3RhdGljIExpc3Q8T0ZJbnN0cnVjdGlvbj4gcmVhZEluc3RydWN0aW9uc0xpc3QoZmluYWwgQ2hhbm5lbEJ1ZmZlciBiYiwKLSAgICAgICAgICAgIGZpbmFsIGludCBpKSB7CisgICAgcHVibGljIHN0YXRpYyBMaXN0PE9GSW5zdHJ1Y3Rpb24+IHJlYWRJbnN0cnVjdGlvbnNMaXN0KAorICAgICAgICAgICAgZmluYWwgQ2hhbm5lbEJ1ZmZlciBiYiwgZmluYWwgaW50IGkpIHsKICAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgogICAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CkBAIC02OSwxMiArNzMsMTQgQEAKICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyBMaXN0PE9GQWN0aW9uPiByZWFkQWN0aW9uc0xpc3QoZmluYWwgQ2hhbm5lbEJ1ZmZlciBiYiwgZmluYWwgaW50IGkpIHsKKyAgICBwdWJsaWMgc3RhdGljIExpc3Q8T0ZBY3Rpb24+IHJlYWRBY3Rpb25zTGlzdChmaW5hbCBDaGFubmVsQnVmZmVyIGJiLAorICAgICAgICAgICAgZmluYWwgaW50IGkpIHsKICAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgogICAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CiAKLSAgICBwdWJsaWMgc3RhdGljIExpc3Q8T0ZCc25JbnRlcmZhY2U+IHJlYWRCc25JbnRlcmZhY2VMaXN0KGZpbmFsIENoYW5uZWxCdWZmZXIgYmIpIHsKKyAgICBwdWJsaWMgc3RhdGljIExpc3Q8T0ZCc25JbnRlcmZhY2U+IHJlYWRCc25JbnRlcmZhY2VMaXN0KAorICAgICAgICAgICAgZmluYWwgQ2hhbm5lbEJ1ZmZlciBiYiwgaW50IGxlbmd0aCkgewogICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCiAgICAgICAgIHJldHVybiBudWxsOwogICAgIH0KQEAgLTg0LDIzICs5MCwyNSBAQAogICAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CiAKLSAgICBwdWJsaWMgc3RhdGljIExpc3Q8T0ZQYWNrZXRRdWV1ZT4gcmVhZFBhY2tldFF1ZXVlTGlzdChmaW5hbCBDaGFubmVsQnVmZmVyIGJiLAotICAgICAgICAgICAgZmluYWwgaW50IGkpIHsKKyAgICBwdWJsaWMgc3RhdGljIExpc3Q8T0ZQYWNrZXRRdWV1ZT4gcmVhZFBhY2tldFF1ZXVlTGlzdCgKKyAgICAgICAgICAgIGZpbmFsIENoYW5uZWxCdWZmZXIgYmIsIGZpbmFsIGludCBpKSB7CiAgICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyBMaXN0PE9GSGVsbG9FbGVtZW50PiByZWFkSGVsbG9FbGVtZW50TGlzdChmaW5hbCBDaGFubmVsQnVmZmVyIGJiKSB7CisgICAgcHVibGljIHN0YXRpYyBMaXN0PE9GSGVsbG9FbGVtZW50PiByZWFkSGVsbG9FbGVtZW50TGlzdCgKKyAgICAgICAgICAgIGZpbmFsIENoYW5uZWxCdWZmZXIgYmIpIHsKICAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgogICAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CiAKLSAgICBwdWJsaWMgc3RhdGljIExpc3Q8T0ZCdWNrZXQ+IHJlYWRCdWNrZXRMaXN0KGZpbmFsIENoYW5uZWxCdWZmZXIgYmIsIGZpbmFsIGludCBpKSB7CisgICAgcHVibGljIHN0YXRpYyBMaXN0PE9GQnVja2V0PiByZWFkQnVja2V0TGlzdChmaW5hbCBDaGFubmVsQnVmZmVyIGJiLAorICAgICAgICAgICAgZmluYWwgaW50IGxlbmd0aCkgewogICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCiAgICAgICAgIHJldHVybiBudWxsOwogICAgIH0KIAotICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxPRk1ldGVyQmFuZD4gcmVhZE1ldGVyQmFuZExpc3QoZmluYWwgQ2hhbm5lbEJ1ZmZlciBiYikgeworICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxPRk1ldGVyQmFuZD4gcmVhZE1ldGVyQmFuZExpc3QoZmluYWwgQ2hhbm5lbEJ1ZmZlciBiYiwgaW50IGxlbmd0aCkgewogICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCiAgICAgICAgIHJldHVybiBudWxsOwogICAgIH0KQEAgLTExMCw5ICsxMTgsMTAgQEAKIAogICAgIH0KIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZUxpc3QoQ2hhbm5lbEJ1ZmZlciBiYiwgTGlzdDw/PiBwb3J0cykgewotICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVMaXN0KENoYW5uZWxCdWZmZXIgYmIsIExpc3Q8PyBleHRlbmRzIE9GT2JqZWN0PiBvYmplY3RzKSB7CisgICAgICAgIGZvcihPRk9iamVjdCBvIDogb2JqZWN0cykgeworICAgICAgICAgICAgby53cml0ZVRvKGJiKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZU9GRmxvd01vZENtZChDaGFubmVsQnVmZmVyIGJiLCBPRkZsb3dNb2RDbWQgY29tbWFuZCkgewpAQCAtMTI2LDE4ICsxMzUsMjEgQEAKICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoZHN0LCBDaGFyc2V0cy5VU19BU0NJSSk7CiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHdyaXRlRml4ZWRMZW5ndGhTdHJpbmcoQ2hhbm5lbEJ1ZmZlciBiYiwgU3RyaW5nIHN0cmluZywgaW50IGxlbmd0aCkgeworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZUZpeGVkTGVuZ3RoU3RyaW5nKENoYW5uZWxCdWZmZXIgYmIsIFN0cmluZyBzdHJpbmcsCisgICAgICAgICAgICBpbnQgbGVuZ3RoKSB7CiAgICAgICAgIGludCBsID0gc3RyaW5nLmxlbmd0aCgpOwotICAgICAgICBpZihsID4gbGVuZ3RoKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJFcnJvciB3cml0aW5nIHN0cmluZzogbGVuZ3RoPSIrbCsiID4gbWF4IExlbmd0aD0iK2xlbmd0aCk7CisgICAgICAgIGlmIChsID4gbGVuZ3RoKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJFcnJvciB3cml0aW5nIHN0cmluZzogbGVuZ3RoPSIKKyAgICAgICAgICAgICAgICAgICAgKyBsICsgIiA+IG1heCBMZW5ndGg9IiArIGxlbmd0aCk7CiAgICAgICAgIH0KICAgICAgICAgYmIud3JpdGVCeXRlcyhzdHJpbmcuZ2V0Qnl0ZXMoQ2hhcnNldHMuVVNfQVNDSUkpKTsKLSAgICAgICAgaWYobCA8IGxlbmd0aCkgeworICAgICAgICBpZiAobCA8IGxlbmd0aCkgewogICAgICAgICAgICAgYmIud3JpdGVaZXJvKGxlbmd0aCAtIGwpOwogICAgICAgICB9CiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHdyaXRlQnNuSW50ZXJmYWNlTGlzdChDaGFubmVsQnVmZmVyIGJiLCBMaXN0PE9GQnNuSW50ZXJmYWNlPiBpbnRlcmZhY2VzKSB7CisgICAgcHVibGljIHN0YXRpYyB2b2lkIHdyaXRlQnNuSW50ZXJmYWNlTGlzdChDaGFubmVsQnVmZmVyIGJiLAorICAgICAgICAgICAgTGlzdDxPRkJzbkludGVyZmFjZT4gaW50ZXJmYWNlcykgewogICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCiAKICAgICB9CkBAIC0xNzIsMTIgKzE4NCwxMiBAQAogICAgIH0KIAogICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxPRlRhYmxlU3RhdHNFbnRyeT4gcmVhZFRhYmxlU3RhdHNFbnRyeUxpc3QoCi0gICAgICAgICAgICBDaGFubmVsQnVmZmVyIGJiKSB7CisgICAgICAgICAgICBDaGFubmVsQnVmZmVyIGJiLCBpbnQgbGVuZ3RoKSB7CiAgICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyBMaXN0PE9GRmxvd1N0YXRzRW50cnk+IHJlYWRGbG93U3RhdHNFbnRyeUxpc3QoQ2hhbm5lbEJ1ZmZlciBiYikgeworICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxPRkZsb3dTdGF0c0VudHJ5PiByZWFkRmxvd1N0YXRzRW50cnlMaXN0KENoYW5uZWxCdWZmZXIgYmIsIGludCBsZW5ndGgpIHsKICAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgogICAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CkBAIC0xOTUsNyArMjA3LDcgQEAKICAgICB9CiAKICAgICBwdWJsaWMgc3RhdGljIExpc3Q8T0ZHcm91cERlc2NTdGF0c0VudHJ5PiByZWFkR3JvdXBEZXNjU3RhdHNFbnRyeUxpc3QoCi0gICAgICAgICAgICBDaGFubmVsQnVmZmVyIGJiKSB7CisgICAgICAgICAgICBDaGFubmVsQnVmZmVyIGJiLCBpbnQgbGVuZ3RoKSB7CiAgICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQpAQCAtMjMzLDcgKzI0NSw3IEBACiAKICAgICB9CiAKLSAgICBwdWJsaWMgc3RhdGljIExpc3Q8T0ZQb3J0U3RhdHNFbnRyeT4gcmVhZFBvcnRTdGF0c0VudHJ5TGlzdChDaGFubmVsQnVmZmVyIGJiKSB7CisgICAgcHVibGljIHN0YXRpYyBMaXN0PE9GUG9ydFN0YXRzRW50cnk+IHJlYWRQb3J0U3RhdHNFbnRyeUxpc3QoQ2hhbm5lbEJ1ZmZlciBiYiwgaW50IGxlbmd0aCkgewogICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCiAgICAgICAgIHJldHVybiBudWxsOwogICAgIH0KQEAgLTI0NCw3ICsyNTYsNyBAQAogCiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyBMaXN0PE9GSGVsbG9FbGVtPiByZWFkSGVsbG9FbGVtTGlzdChDaGFubmVsQnVmZmVyIGJiKSB7CisgICAgcHVibGljIHN0YXRpYyBMaXN0PE9GSGVsbG9FbGVtPiByZWFkSGVsbG9FbGVtTGlzdChDaGFubmVsQnVmZmVyIGJiLCBpbnQgbGVuZ3RoKSB7CiAgICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQpAQCAtMjU2LDcgKzI2OCw3IEBACiAgICAgfQogCiAgICAgcHVibGljIHN0YXRpYyBMaXN0PE9GR3JvdXBTdGF0c0VudHJ5PiByZWFkR3JvdXBTdGF0c0VudHJ5TGlzdCgKLSAgICAgICAgICAgIENoYW5uZWxCdWZmZXIgYmIpIHsKKyAgICAgICAgICAgIENoYW5uZWxCdWZmZXIgYmIsIGludCBsZW5ndGgpIHsKICAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgogICAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CkBAIC0yNjgsNyArMjgwLDcgQEAKICAgICB9CiAKICAgICBwdWJsaWMgc3RhdGljIExpc3Q8T0ZRdWV1ZVN0YXRzRW50cnk+IHJlYWRRdWV1ZVN0YXRzRW50cnlMaXN0KAotICAgICAgICAgICAgQ2hhbm5lbEJ1ZmZlciBiYikgeworICAgICAgICAgICAgQ2hhbm5lbEJ1ZmZlciBiYiwgaW50IGxlbmd0aCkgewogICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCiAgICAgICAgIHJldHVybiBudWxsOwogICAgIH0KQEAgLTI5MCw3ICszMDIsNyBAQAogCiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyBMaXN0PE9GTWV0ZXJTdGF0cz4gcmVhZE1ldGVyU3RhdHNMaXN0KENoYW5uZWxCdWZmZXIgYmIpIHsKKyAgICBwdWJsaWMgc3RhdGljIExpc3Q8T0ZNZXRlclN0YXRzPiByZWFkTWV0ZXJTdGF0c0xpc3QoQ2hhbm5lbEJ1ZmZlciBiYiwgaW50IGxlbmd0aCkgewogICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCiAgICAgICAgIHJldHVybiBudWxsOwogICAgIH0KQEAgLTMwMSw3ICszMTMsNyBAQAogCiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyBMaXN0PE9GVGFibGVGZWF0dXJlcz4gcmVhZFRhYmxlRmVhdHVyZXNMaXN0KENoYW5uZWxCdWZmZXIgYmIpIHsKKyAgICBwdWJsaWMgc3RhdGljIExpc3Q8T0ZUYWJsZUZlYXR1cmVzPiByZWFkVGFibGVGZWF0dXJlc0xpc3QoQ2hhbm5lbEJ1ZmZlciBiYiwgaW50IGxlbmd0aCkgewogICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCiAgICAgICAgIHJldHVybiBudWxsOwogICAgIH0KQEAgLTMxMiw1ICszMjQsNDAgQEAKIAogICAgIH0KIAorICAgIHB1YmxpYyBzdGF0aWMgT0ZPeG0gcmVhZE9GT3htKENoYW5uZWxCdWZmZXIgYmIpIHsKKyAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVPRk94bShDaGFubmVsQnVmZmVyIGJiLCBPRk94bSBmaWVsZCkgeworICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVPeG1MaXN0KENoYW5uZWxCdWZmZXIgYmIsIExpc3Q8T0ZPeG0+IG94bUxpc3QpIHsKKyAgICAgICAgZm9yKE9GT3htIG86IG94bUxpc3QpIHsKKyAgICAgICAgICAgIG8ud3JpdGVUbyhiYik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExpc3Q8T0ZPeG0+IHJlYWRPeG1MaXN0KENoYW5uZWxCdWZmZXIgYmIsIGludCBsZW5ndGgpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHdyaXRlUGh5c2ljYWxQb3J0TGlzdChDaGFubmVsQnVmZmVyIGJiLAorICAgICAgICAgICAgTGlzdDxPRlBoeXNpY2FsUG9ydD4gcG9ydHMpIHsKKyAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBXaWxkY2FyZHMgcmVhZFdpbGRjYXJkcyhDaGFubmVsQnVmZmVyIGJiKSB7CisgICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHdyaXRlV2lsZGNhcmRzKENoYW5uZWxCdWZmZXIgYmIsIFdpbGRjYXJkcyB3aWxkY2FyZHMpIHsKKyAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCisgICAgfQogCiB9CmRpZmYgLS1naXQgYS9qYXZhX2dlbi9wcmUtd3JpdHRlbi9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZmxvdy91dGlsL0NoYW5uZWxVdGlscy5qYXZhIGIvamF2YV9nZW4vcHJlLXdyaXR0ZW4vc3JjL21haW4vamF2YS9vcmcvb3BlbmZsb3cvcHJvdG9jb2wvdmVyMTIvQ2hhbm5lbFV0aWxzVmVyMTIuamF2YQpzaW1pbGFyaXR5IGluZGV4IDc3JQpyZW5hbWUgZnJvbSBqYXZhX2dlbi9wcmUtd3JpdHRlbi9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZmxvdy91dGlsL0NoYW5uZWxVdGlscy5qYXZhCnJlbmFtZSB0byBqYXZhX2dlbi9wcmUtd3JpdHRlbi9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZmxvdy9wcm90b2NvbC92ZXIxMi9DaGFubmVsVXRpbHNWZXIxMi5qYXZhCmluZGV4IGRhYjZmZjIuLmE2NmZiNzAgMTAwNjQ0Ci0tLSBhL2phdmFfZ2VuL3ByZS13cml0dGVuL3NyYy9tYWluL2phdmEvb3JnL29wZW5mbG93L3V0aWwvQ2hhbm5lbFV0aWxzLmphdmEKKysrIGIvamF2YV9nZW4vcHJlLXdyaXR0ZW4vc3JjL21haW4vamF2YS9vcmcvb3BlbmZsb3cvcHJvdG9jb2wvdmVyMTIvQ2hhbm5lbFV0aWxzVmVyMTIuamF2YQpAQCAtMSw0ICsxLDQgQEAKLXBhY2thZ2Ugb3JnLm9wZW5mbG93LnV0aWw7CitwYWNrYWdlIG9yZy5vcGVuZmxvdy5wcm90b2NvbC52ZXIxMjsKIAogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogCkBAIC0xMyw2ICsxMyw3IEBACiBpbXBvcnQgb3JnLm9wZW5mbG93LnByb3RvY29sLk9GSGVsbG9FbGVtOwogaW1wb3J0IG9yZy5vcGVuZmxvdy5wcm90b2NvbC5PRk1ldGVyRmVhdHVyZXM7CiBpbXBvcnQgb3JnLm9wZW5mbG93LnByb3RvY29sLk9GTWV0ZXJTdGF0czsKK2ltcG9ydCBvcmcub3BlbmZsb3cucHJvdG9jb2wuT0ZPYmplY3Q7CiBpbXBvcnQgb3JnLm9wZW5mbG93LnByb3RvY29sLk9GUGFja2V0UXVldWU7CiBpbXBvcnQgb3JnLm9wZW5mbG93LnByb3RvY29sLk9GUG9ydFN0YXRzRW50cnk7CiBpbXBvcnQgb3JnLm9wZW5mbG93LnByb3RvY29sLk9GUXVldWVTdGF0c0VudHJ5OwpAQCAtMjIsOSArMjMsMTAgQEAKIGltcG9ydCBvcmcub3BlbmZsb3cucHJvdG9jb2wuYWN0aW9uLk9GQWN0aW9uOwogaW1wb3J0IG9yZy5vcGVuZmxvdy5wcm90b2NvbC5pbnN0cnVjdGlvbi5PRkluc3RydWN0aW9uOwogaW1wb3J0IG9yZy5vcGVuZmxvdy5wcm90b2NvbC5tYXRjaC5NYXRjaDsKK2ltcG9ydCBvcmcub3BlbmZsb3cucHJvdG9jb2wubWV0ZXJiYW5kLk9GTWV0ZXJCYW5kOworaW1wb3J0IG9yZy5vcGVuZmxvdy5wcm90b2NvbC5veG0uT0ZPeG07CiBpbXBvcnQgb3JnLm9wZW5mbG93LnR5cGVzLk9GRmxvd01vZENtZDsKIGltcG9ydCBvcmcub3BlbmZsb3cudHlwZXMuT0ZIZWxsb0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLm9wZW5mbG93LnR5cGVzLk9GTWV0ZXJCYW5kOwogaW1wb3J0IG9yZy5vcGVuZmxvdy50eXBlcy5PRlBoeXNpY2FsUG9ydDsKIAogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuQ2hhcnNldHM7CkBAIC0zNSw3ICszNyw3IEBACiAgKiBAYXV0aG9yIGNhcHZlZwogICovCiAKLXB1YmxpYyBjbGFzcyBDaGFubmVsVXRpbHMgeworcHVibGljIGNsYXNzIENoYW5uZWxVdGlsc1ZlcjEyIHsKIAogICAgIHN0YXRpYyBwdWJsaWMgYnl0ZVtdIHJlYWRCeXRlcyhmaW5hbCBDaGFubmVsQnVmZmVyIGJiLCBmaW5hbCBpbnQgbGVuZ3RoKSB7CiAgICAgICAgIGJ5dGUgYnl0ZUFycmF5W10gPSBuZXcgYnl0ZVtsZW5ndGhdOwpAQCAtNDMsMTggKzQ1LDE5IEBACiAgICAgICAgIHJldHVybiBieXRlQXJyYXk7CiAgICAgfQogCi0gICAgc3RhdGljIHB1YmxpYyB2b2lkIHdyaXRlQnl0ZXMoZmluYWwgQ2hhbm5lbEJ1ZmZlciBiYiwgZmluYWwgYnl0ZSBieXRlQXJyYXlbXSkgeworICAgIHN0YXRpYyBwdWJsaWMgdm9pZCB3cml0ZUJ5dGVzKGZpbmFsIENoYW5uZWxCdWZmZXIgYmIsCisgICAgICAgICAgICBmaW5hbCBieXRlIGJ5dGVBcnJheVtdKSB7CiAgICAgICAgIGJiLndyaXRlQnl0ZXMoYnl0ZUFycmF5KTsKICAgICB9CiAKLSAgICBwdWJsaWMgc3RhdGljIExpc3Q8T0ZQaHlzaWNhbFBvcnQ+IHJlYWRQaHlzaWNhbFBvcnRMaXN0KGZpbmFsIENoYW5uZWxCdWZmZXIgYmIsCi0gICAgICAgICAgICBmaW5hbCBpbnQgaSkgeworICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxPRlBoeXNpY2FsUG9ydD4gcmVhZFBoeXNpY2FsUG9ydExpc3QoCisgICAgICAgICAgICBmaW5hbCBDaGFubmVsQnVmZmVyIGJiLCBmaW5hbCBpbnQgaSkgewogICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCiAgICAgICAgIHJldHVybiBudWxsOwogICAgIH0KIAotICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxPRkluc3RydWN0aW9uPiByZWFkSW5zdHJ1Y3Rpb25zTGlzdChmaW5hbCBDaGFubmVsQnVmZmVyIGJiLAotICAgICAgICAgICAgZmluYWwgaW50IGkpIHsKKyAgICBwdWJsaWMgc3RhdGljIExpc3Q8T0ZJbnN0cnVjdGlvbj4gcmVhZEluc3RydWN0aW9uc0xpc3QoCisgICAgICAgICAgICBmaW5hbCBDaGFubmVsQnVmZmVyIGJiLCBmaW5hbCBpbnQgaSkgewogICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCiAgICAgICAgIHJldHVybiBudWxsOwogICAgIH0KQEAgLTY5LDEyICs3MiwxNCBAQAogICAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CiAKLSAgICBwdWJsaWMgc3RhdGljIExpc3Q8T0ZBY3Rpb24+IHJlYWRBY3Rpb25zTGlzdChmaW5hbCBDaGFubmVsQnVmZmVyIGJiLCBmaW5hbCBpbnQgaSkgeworICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxPRkFjdGlvbj4gcmVhZEFjdGlvbnNMaXN0KGZpbmFsIENoYW5uZWxCdWZmZXIgYmIsCisgICAgICAgICAgICBmaW5hbCBpbnQgaSkgewogICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCiAgICAgICAgIHJldHVybiBudWxsOwogICAgIH0KIAotICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxPRkJzbkludGVyZmFjZT4gcmVhZEJzbkludGVyZmFjZUxpc3QoZmluYWwgQ2hhbm5lbEJ1ZmZlciBiYikgeworICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxPRkJzbkludGVyZmFjZT4gcmVhZEJzbkludGVyZmFjZUxpc3QoCisgICAgICAgICAgICBmaW5hbCBDaGFubmVsQnVmZmVyIGJiLCBpbnQgbGVuZ3RoKSB7CiAgICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQpAQCAtODQsMjMgKzg5LDI1IEBACiAgICAgICAgIHJldHVybiBudWxsOwogICAgIH0KIAotICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxPRlBhY2tldFF1ZXVlPiByZWFkUGFja2V0UXVldWVMaXN0KGZpbmFsIENoYW5uZWxCdWZmZXIgYmIsCi0gICAgICAgICAgICBmaW5hbCBpbnQgaSkgeworICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxPRlBhY2tldFF1ZXVlPiByZWFkUGFja2V0UXVldWVMaXN0KAorICAgICAgICAgICAgZmluYWwgQ2hhbm5lbEJ1ZmZlciBiYiwgZmluYWwgaW50IGkpIHsKICAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgogICAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CiAKLSAgICBwdWJsaWMgc3RhdGljIExpc3Q8T0ZIZWxsb0VsZW1lbnQ+IHJlYWRIZWxsb0VsZW1lbnRMaXN0KGZpbmFsIENoYW5uZWxCdWZmZXIgYmIpIHsKKyAgICBwdWJsaWMgc3RhdGljIExpc3Q8T0ZIZWxsb0VsZW1lbnQ+IHJlYWRIZWxsb0VsZW1lbnRMaXN0KAorICAgICAgICAgICAgZmluYWwgQ2hhbm5lbEJ1ZmZlciBiYikgewogICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCiAgICAgICAgIHJldHVybiBudWxsOwogICAgIH0KIAotICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxPRkJ1Y2tldD4gcmVhZEJ1Y2tldExpc3QoZmluYWwgQ2hhbm5lbEJ1ZmZlciBiYiwgZmluYWwgaW50IGkpIHsKKyAgICBwdWJsaWMgc3RhdGljIExpc3Q8T0ZCdWNrZXQ+IHJlYWRCdWNrZXRMaXN0KGZpbmFsIENoYW5uZWxCdWZmZXIgYmIsCisgICAgICAgICAgICBmaW5hbCBpbnQgbGVuZ3RoKSB7CiAgICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyBMaXN0PE9GTWV0ZXJCYW5kPiByZWFkTWV0ZXJCYW5kTGlzdChmaW5hbCBDaGFubmVsQnVmZmVyIGJiKSB7CisgICAgcHVibGljIHN0YXRpYyBMaXN0PE9GTWV0ZXJCYW5kPiByZWFkTWV0ZXJCYW5kTGlzdChmaW5hbCBDaGFubmVsQnVmZmVyIGJiLCBpbnQgbGVuZ3RoKSB7CiAgICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQpAQCAtMTEwLDkgKzExNywxMCBAQAogCiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHdyaXRlTGlzdChDaGFubmVsQnVmZmVyIGJiLCBMaXN0PD8+IHBvcnRzKSB7Ci0gICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQorICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZUxpc3QoQ2hhbm5lbEJ1ZmZlciBiYiwgTGlzdDw/IGV4dGVuZHMgT0ZPYmplY3Q+IG9iamVjdHMpIHsKKyAgICAgICAgZm9yKE9GT2JqZWN0IG8gOiBvYmplY3RzKSB7CisgICAgICAgICAgICBvLndyaXRlVG8oYmIpOworICAgICAgICB9CiAgICAgfQogCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIHdyaXRlT0ZGbG93TW9kQ21kKENoYW5uZWxCdWZmZXIgYmIsIE9GRmxvd01vZENtZCBjb21tYW5kKSB7CkBAIC0xMjYsMTggKzEzNCwyMSBAQAogICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhkc3QsIENoYXJzZXRzLlVTX0FTQ0lJKTsKICAgICB9CiAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVGaXhlZExlbmd0aFN0cmluZyhDaGFubmVsQnVmZmVyIGJiLCBTdHJpbmcgc3RyaW5nLCBpbnQgbGVuZ3RoKSB7CisgICAgcHVibGljIHN0YXRpYyB2b2lkIHdyaXRlRml4ZWRMZW5ndGhTdHJpbmcoQ2hhbm5lbEJ1ZmZlciBiYiwgU3RyaW5nIHN0cmluZywKKyAgICAgICAgICAgIGludCBsZW5ndGgpIHsKICAgICAgICAgaW50IGwgPSBzdHJpbmcubGVuZ3RoKCk7Ci0gICAgICAgIGlmKGwgPiBsZW5ndGgpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkVycm9yIHdyaXRpbmcgc3RyaW5nOiBsZW5ndGg9IitsKyIgPiBtYXggTGVuZ3RoPSIrbGVuZ3RoKTsKKyAgICAgICAgaWYgKGwgPiBsZW5ndGgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkVycm9yIHdyaXRpbmcgc3RyaW5nOiBsZW5ndGg9IgorICAgICAgICAgICAgICAgICAgICArIGwgKyAiID4gbWF4IExlbmd0aD0iICsgbGVuZ3RoKTsKICAgICAgICAgfQogICAgICAgICBiYi53cml0ZUJ5dGVzKHN0cmluZy5nZXRCeXRlcyhDaGFyc2V0cy5VU19BU0NJSSkpOwotICAgICAgICBpZihsIDwgbGVuZ3RoKSB7CisgICAgICAgIGlmIChsIDwgbGVuZ3RoKSB7CiAgICAgICAgICAgICBiYi53cml0ZVplcm8obGVuZ3RoIC0gbCk7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVCc25JbnRlcmZhY2VMaXN0KENoYW5uZWxCdWZmZXIgYmIsIExpc3Q8T0ZCc25JbnRlcmZhY2U+IGludGVyZmFjZXMpIHsKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVCc25JbnRlcmZhY2VMaXN0KENoYW5uZWxCdWZmZXIgYmIsCisgICAgICAgICAgICBMaXN0PE9GQnNuSW50ZXJmYWNlPiBpbnRlcmZhY2VzKSB7CiAgICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKIAogICAgIH0KQEAgLTE3MiwxMiArMTgzLDEyIEBACiAgICAgfQogCiAgICAgcHVibGljIHN0YXRpYyBMaXN0PE9GVGFibGVTdGF0c0VudHJ5PiByZWFkVGFibGVTdGF0c0VudHJ5TGlzdCgKLSAgICAgICAgICAgIENoYW5uZWxCdWZmZXIgYmIpIHsKKyAgICAgICAgICAgIENoYW5uZWxCdWZmZXIgYmIsIGludCBsZW5ndGgpIHsKICAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgogICAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CiAKLSAgICBwdWJsaWMgc3RhdGljIExpc3Q8T0ZGbG93U3RhdHNFbnRyeT4gcmVhZEZsb3dTdGF0c0VudHJ5TGlzdChDaGFubmVsQnVmZmVyIGJiKSB7CisgICAgcHVibGljIHN0YXRpYyBMaXN0PE9GRmxvd1N0YXRzRW50cnk+IHJlYWRGbG93U3RhdHNFbnRyeUxpc3QoQ2hhbm5lbEJ1ZmZlciBiYiwgaW50IGxlbmd0aCkgewogICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCiAgICAgICAgIHJldHVybiBudWxsOwogICAgIH0KQEAgLTE5NSw3ICsyMDYsNyBAQAogICAgIH0KIAogICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxPRkdyb3VwRGVzY1N0YXRzRW50cnk+IHJlYWRHcm91cERlc2NTdGF0c0VudHJ5TGlzdCgKLSAgICAgICAgICAgIENoYW5uZWxCdWZmZXIgYmIpIHsKKyAgICAgICAgICAgIENoYW5uZWxCdWZmZXIgYmIsIGludCBsZW5ndGgpIHsKICAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgogICAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CkBAIC0yMzMsNyArMjQ0LDcgQEAKIAogICAgIH0KIAotICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxPRlBvcnRTdGF0c0VudHJ5PiByZWFkUG9ydFN0YXRzRW50cnlMaXN0KENoYW5uZWxCdWZmZXIgYmIpIHsKKyAgICBwdWJsaWMgc3RhdGljIExpc3Q8T0ZQb3J0U3RhdHNFbnRyeT4gcmVhZFBvcnRTdGF0c0VudHJ5TGlzdChDaGFubmVsQnVmZmVyIGJiLCBpbnQgbGVuZ3RoKSB7CiAgICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQpAQCAtMjQ0LDcgKzI1NSw3IEBACiAKICAgICB9CiAKLSAgICBwdWJsaWMgc3RhdGljIExpc3Q8T0ZIZWxsb0VsZW0+IHJlYWRIZWxsb0VsZW1MaXN0KENoYW5uZWxCdWZmZXIgYmIpIHsKKyAgICBwdWJsaWMgc3RhdGljIExpc3Q8T0ZIZWxsb0VsZW0+IHJlYWRIZWxsb0VsZW1MaXN0KENoYW5uZWxCdWZmZXIgYmIsIGludCBsZW5ndGgpIHsKICAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgogICAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CkBAIC0yNTYsNyArMjY3LDcgQEAKICAgICB9CiAKICAgICBwdWJsaWMgc3RhdGljIExpc3Q8T0ZHcm91cFN0YXRzRW50cnk+IHJlYWRHcm91cFN0YXRzRW50cnlMaXN0KAotICAgICAgICAgICAgQ2hhbm5lbEJ1ZmZlciBiYikgeworICAgICAgICAgICAgQ2hhbm5lbEJ1ZmZlciBiYiwgaW50IGxlbmd0aCkgewogICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCiAgICAgICAgIHJldHVybiBudWxsOwogICAgIH0KQEAgLTI2OCw3ICsyNzksNyBAQAogICAgIH0KIAogICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxPRlF1ZXVlU3RhdHNFbnRyeT4gcmVhZFF1ZXVlU3RhdHNFbnRyeUxpc3QoCi0gICAgICAgICAgICBDaGFubmVsQnVmZmVyIGJiKSB7CisgICAgICAgICAgICBDaGFubmVsQnVmZmVyIGJiLCBpbnQgbGVuZ3RoKSB7CiAgICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQpAQCAtMjkwLDcgKzMwMSw3IEBACiAKICAgICB9CiAKLSAgICBwdWJsaWMgc3RhdGljIExpc3Q8T0ZNZXRlclN0YXRzPiByZWFkTWV0ZXJTdGF0c0xpc3QoQ2hhbm5lbEJ1ZmZlciBiYikgeworICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxPRk1ldGVyU3RhdHM+IHJlYWRNZXRlclN0YXRzTGlzdChDaGFubmVsQnVmZmVyIGJiLCBpbnQgbGVuZ3RoKSB7CiAgICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQpAQCAtMzAxLDcgKzMxMiw3IEBACiAKICAgICB9CiAKLSAgICBwdWJsaWMgc3RhdGljIExpc3Q8T0ZUYWJsZUZlYXR1cmVzPiByZWFkVGFibGVGZWF0dXJlc0xpc3QoQ2hhbm5lbEJ1ZmZlciBiYikgeworICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxPRlRhYmxlRmVhdHVyZXM+IHJlYWRUYWJsZUZlYXR1cmVzTGlzdChDaGFubmVsQnVmZmVyIGJiLCBpbnQgbGVuZ3RoKSB7CiAgICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQpAQCAtMzEyLDUgKzMyMywzMCBAQAogCiAgICAgfQogCisgICAgcHVibGljIHN0YXRpYyBPRk94bSByZWFkT0ZPeG0oQ2hhbm5lbEJ1ZmZlciBiYikgeworICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZU9GT3htKENoYW5uZWxCdWZmZXIgYmIsIE9GT3htIGZpZWxkKSB7CisgICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZU94bUxpc3QoQ2hhbm5lbEJ1ZmZlciBiYiwgTGlzdDxPRk94bT4gb3htTGlzdCkgeworICAgICAgICBmb3IoT0ZPeG0gbzogb3htTGlzdCkgeworICAgICAgICAgICAgby53cml0ZVRvKGJiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxPRk94bT4gcmVhZE94bUxpc3QoQ2hhbm5lbEJ1ZmZlciBiYiwgaW50IGxlbmd0aCkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVQaHlzaWNhbFBvcnRMaXN0KENoYW5uZWxCdWZmZXIgYmIsCisgICAgICAgICAgICBMaXN0PE9GUGh5c2ljYWxQb3J0PiBwb3J0cykgeworICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisKKyAgICB9CiAKIH0KZGlmZiAtLWdpdCBhL2phdmFfZ2VuL3ByZS13cml0dGVuL3NyYy9tYWluL2phdmEvb3JnL29wZW5mbG93L3V0aWwvQ2hhbm5lbFV0aWxzLmphdmEgYi9qYXZhX2dlbi9wcmUtd3JpdHRlbi9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZmxvdy9wcm90b2NvbC92ZXIxMy9DaGFubmVsVXRpbHNWZXIxMy5qYXZhCnNpbWlsYXJpdHkgaW5kZXggNzYlCmNvcHkgZnJvbSBqYXZhX2dlbi9wcmUtd3JpdHRlbi9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZmxvdy91dGlsL0NoYW5uZWxVdGlscy5qYXZhCmNvcHkgdG8gamF2YV9nZW4vcHJlLXdyaXR0ZW4vc3JjL21haW4vamF2YS9vcmcvb3BlbmZsb3cvcHJvdG9jb2wvdmVyMTMvQ2hhbm5lbFV0aWxzVmVyMTMuamF2YQppbmRleCBkYWI2ZmYyLi43M2IyNDBlIDEwMDY0NAotLS0gYS9qYXZhX2dlbi9wcmUtd3JpdHRlbi9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZmxvdy91dGlsL0NoYW5uZWxVdGlscy5qYXZhCisrKyBiL2phdmFfZ2VuL3ByZS13cml0dGVuL3NyYy9tYWluL2phdmEvb3JnL29wZW5mbG93L3Byb3RvY29sL3ZlcjEzL0NoYW5uZWxVdGlsc1ZlcjEzLmphdmEKQEAgLTEsOCArMSw5IEBACi1wYWNrYWdlIG9yZy5vcGVuZmxvdy51dGlsOworcGFja2FnZSBvcmcub3BlbmZsb3cucHJvdG9jb2wudmVyMTM7CiAKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIAogaW1wb3J0IG9yZy5qYm9zcy5uZXR0eS5idWZmZXIuQ2hhbm5lbEJ1ZmZlcjsKK2ltcG9ydCBvcmcub3BlbmZsb3cuZXhjZXB0aW9ucy5PRlBhcnNlRXJyb3I7CiBpbXBvcnQgb3JnLm9wZW5mbG93LnByb3RvY29sLk9GQnNuSW50ZXJmYWNlOwogaW1wb3J0IG9yZy5vcGVuZmxvdy5wcm90b2NvbC5PRkJzblZwb3J0UUluUTsKIGltcG9ydCBvcmcub3BlbmZsb3cucHJvdG9jb2wuT0ZCc25WcG9ydFFJblFUOwpAQCAtMTMsNiArMTQsNyBAQAogaW1wb3J0IG9yZy5vcGVuZmxvdy5wcm90b2NvbC5PRkhlbGxvRWxlbTsKIGltcG9ydCBvcmcub3BlbmZsb3cucHJvdG9jb2wuT0ZNZXRlckZlYXR1cmVzOwogaW1wb3J0IG9yZy5vcGVuZmxvdy5wcm90b2NvbC5PRk1ldGVyU3RhdHM7CitpbXBvcnQgb3JnLm9wZW5mbG93LnByb3RvY29sLk9GT2JqZWN0OwogaW1wb3J0IG9yZy5vcGVuZmxvdy5wcm90b2NvbC5PRlBhY2tldFF1ZXVlOwogaW1wb3J0IG9yZy5vcGVuZmxvdy5wcm90b2NvbC5PRlBvcnRTdGF0c0VudHJ5OwogaW1wb3J0IG9yZy5vcGVuZmxvdy5wcm90b2NvbC5PRlF1ZXVlU3RhdHNFbnRyeTsKQEAgLTIyLDkgKzI0LDEwIEBACiBpbXBvcnQgb3JnLm9wZW5mbG93LnByb3RvY29sLmFjdGlvbi5PRkFjdGlvbjsKIGltcG9ydCBvcmcub3BlbmZsb3cucHJvdG9jb2wuaW5zdHJ1Y3Rpb24uT0ZJbnN0cnVjdGlvbjsKIGltcG9ydCBvcmcub3BlbmZsb3cucHJvdG9jb2wubWF0Y2guTWF0Y2g7CitpbXBvcnQgb3JnLm9wZW5mbG93LnByb3RvY29sLm1ldGVyYmFuZC5PRk1ldGVyQmFuZDsKK2ltcG9ydCBvcmcub3BlbmZsb3cucHJvdG9jb2wub3htLk9GT3htOwogaW1wb3J0IG9yZy5vcGVuZmxvdy50eXBlcy5PRkZsb3dNb2RDbWQ7CiBpbXBvcnQgb3JnLm9wZW5mbG93LnR5cGVzLk9GSGVsbG9FbGVtZW50OwotaW1wb3J0IG9yZy5vcGVuZmxvdy50eXBlcy5PRk1ldGVyQmFuZDsKIGltcG9ydCBvcmcub3BlbmZsb3cudHlwZXMuT0ZQaHlzaWNhbFBvcnQ7CiAKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLkNoYXJzZXRzOwpAQCAtMzUsNyArMzgsNyBAQAogICogQGF1dGhvciBjYXB2ZWcKICAqLwogCi1wdWJsaWMgY2xhc3MgQ2hhbm5lbFV0aWxzIHsKK3B1YmxpYyBjbGFzcyBDaGFubmVsVXRpbHNWZXIxMyB7CiAKICAgICBzdGF0aWMgcHVibGljIGJ5dGVbXSByZWFkQnl0ZXMoZmluYWwgQ2hhbm5lbEJ1ZmZlciBiYiwgZmluYWwgaW50IGxlbmd0aCkgewogICAgICAgICBieXRlIGJ5dGVBcnJheVtdID0gbmV3IGJ5dGVbbGVuZ3RoXTsKQEAgLTQzLDI1ICs0NiwyNSBAQAogICAgICAgICByZXR1cm4gYnl0ZUFycmF5OwogICAgIH0KIAotICAgIHN0YXRpYyBwdWJsaWMgdm9pZCB3cml0ZUJ5dGVzKGZpbmFsIENoYW5uZWxCdWZmZXIgYmIsIGZpbmFsIGJ5dGUgYnl0ZUFycmF5W10pIHsKKyAgICBzdGF0aWMgcHVibGljIHZvaWQgd3JpdGVCeXRlcyhmaW5hbCBDaGFubmVsQnVmZmVyIGJiLAorICAgICAgICAgICAgZmluYWwgYnl0ZSBieXRlQXJyYXlbXSkgewogICAgICAgICBiYi53cml0ZUJ5dGVzKGJ5dGVBcnJheSk7CiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyBMaXN0PE9GUGh5c2ljYWxQb3J0PiByZWFkUGh5c2ljYWxQb3J0TGlzdChmaW5hbCBDaGFubmVsQnVmZmVyIGJiLAotICAgICAgICAgICAgZmluYWwgaW50IGkpIHsKKyAgICBwdWJsaWMgc3RhdGljIExpc3Q8T0ZQaHlzaWNhbFBvcnQ+IHJlYWRQaHlzaWNhbFBvcnRMaXN0KAorICAgICAgICAgICAgZmluYWwgQ2hhbm5lbEJ1ZmZlciBiYiwgZmluYWwgaW50IGkpIHsKICAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgogICAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CiAKLSAgICBwdWJsaWMgc3RhdGljIExpc3Q8T0ZJbnN0cnVjdGlvbj4gcmVhZEluc3RydWN0aW9uc0xpc3QoZmluYWwgQ2hhbm5lbEJ1ZmZlciBiYiwKLSAgICAgICAgICAgIGZpbmFsIGludCBpKSB7CisgICAgcHVibGljIHN0YXRpYyBMaXN0PE9GSW5zdHJ1Y3Rpb24+IHJlYWRJbnN0cnVjdGlvbnNMaXN0KAorICAgICAgICAgICAgZmluYWwgQ2hhbm5lbEJ1ZmZlciBiYiwgZmluYWwgaW50IGkpIHsKICAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgogICAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CiAKLSAgICBwdWJsaWMgc3RhdGljIE1hdGNoIHJlYWRPRk1hdGNoKGZpbmFsIENoYW5uZWxCdWZmZXIgYmIpIHsKLSAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICAgICAgICByZXR1cm4gbnVsbDsKKyAgICBwdWJsaWMgc3RhdGljIE1hdGNoIHJlYWRPRk1hdGNoKGZpbmFsIENoYW5uZWxCdWZmZXIgYmIpIHRocm93cyBPRlBhcnNlRXJyb3IgeworICAgICAgICByZXR1cm4gT0ZNYXRjaFYzVmVyMTMuUkVBREVSLnJlYWRGcm9tKGJiKTsKICAgICB9CiAKICAgICBwdWJsaWMgc3RhdGljIE9GRmxvd01vZENtZCByZWFkT0ZGbG93TW9kQ21kKGZpbmFsIENoYW5uZWxCdWZmZXIgYmIpIHsKQEAgLTY5LDEyICs3MiwxNCBAQAogICAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CiAKLSAgICBwdWJsaWMgc3RhdGljIExpc3Q8T0ZBY3Rpb24+IHJlYWRBY3Rpb25zTGlzdChmaW5hbCBDaGFubmVsQnVmZmVyIGJiLCBmaW5hbCBpbnQgaSkgeworICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxPRkFjdGlvbj4gcmVhZEFjdGlvbnNMaXN0KGZpbmFsIENoYW5uZWxCdWZmZXIgYmIsCisgICAgICAgICAgICBmaW5hbCBpbnQgaSkgewogICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCiAgICAgICAgIHJldHVybiBudWxsOwogICAgIH0KIAotICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxPRkJzbkludGVyZmFjZT4gcmVhZEJzbkludGVyZmFjZUxpc3QoZmluYWwgQ2hhbm5lbEJ1ZmZlciBiYikgeworICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxPRkJzbkludGVyZmFjZT4gcmVhZEJzbkludGVyZmFjZUxpc3QoCisgICAgICAgICAgICBmaW5hbCBDaGFubmVsQnVmZmVyIGJiLCBpbnQgbGVuZ3RoKSB7CiAgICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQpAQCAtODQsMzUgKzg5LDM3IEBACiAgICAgICAgIHJldHVybiBudWxsOwogICAgIH0KIAotICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxPRlBhY2tldFF1ZXVlPiByZWFkUGFja2V0UXVldWVMaXN0KGZpbmFsIENoYW5uZWxCdWZmZXIgYmIsCi0gICAgICAgICAgICBmaW5hbCBpbnQgaSkgeworICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxPRlBhY2tldFF1ZXVlPiByZWFkUGFja2V0UXVldWVMaXN0KAorICAgICAgICAgICAgZmluYWwgQ2hhbm5lbEJ1ZmZlciBiYiwgZmluYWwgaW50IGkpIHsKICAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgogICAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CiAKLSAgICBwdWJsaWMgc3RhdGljIExpc3Q8T0ZIZWxsb0VsZW1lbnQ+IHJlYWRIZWxsb0VsZW1lbnRMaXN0KGZpbmFsIENoYW5uZWxCdWZmZXIgYmIpIHsKKyAgICBwdWJsaWMgc3RhdGljIExpc3Q8T0ZIZWxsb0VsZW1lbnQ+IHJlYWRIZWxsb0VsZW1lbnRMaXN0KAorICAgICAgICAgICAgZmluYWwgQ2hhbm5lbEJ1ZmZlciBiYikgewogICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCiAgICAgICAgIHJldHVybiBudWxsOwogICAgIH0KIAotICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxPRkJ1Y2tldD4gcmVhZEJ1Y2tldExpc3QoZmluYWwgQ2hhbm5lbEJ1ZmZlciBiYiwgZmluYWwgaW50IGkpIHsKKyAgICBwdWJsaWMgc3RhdGljIExpc3Q8T0ZCdWNrZXQ+IHJlYWRCdWNrZXRMaXN0KGZpbmFsIENoYW5uZWxCdWZmZXIgYmIsCisgICAgICAgICAgICBmaW5hbCBpbnQgbGVuZ3RoKSB7CiAgICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyBMaXN0PE9GTWV0ZXJCYW5kPiByZWFkTWV0ZXJCYW5kTGlzdChmaW5hbCBDaGFubmVsQnVmZmVyIGJiKSB7CisgICAgcHVibGljIHN0YXRpYyBMaXN0PE9GTWV0ZXJCYW5kPiByZWFkTWV0ZXJCYW5kTGlzdChmaW5hbCBDaGFubmVsQnVmZmVyIGJiLCBpbnQgbGVuZ3RoKSB7CiAgICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQogCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIHdyaXRlT0ZNYXRjaChDaGFubmVsQnVmZmVyIGJiLCBNYXRjaCBtYXRjaCkgewotICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0KKyAgICAgICAgbWF0Y2gud3JpdGVUbyhiYik7CiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHdyaXRlTGlzdChDaGFubmVsQnVmZmVyIGJiLCBMaXN0PD8+IHBvcnRzKSB7Ci0gICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQorICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZUxpc3QoQ2hhbm5lbEJ1ZmZlciBiYiwgTGlzdDw/IGV4dGVuZHMgT0ZPYmplY3Q+IG9iamVjdHMpIHsKKyAgICAgICAgZm9yKE9GT2JqZWN0IG8gOiBvYmplY3RzKSB7CisgICAgICAgICAgICBvLndyaXRlVG8oYmIpOworICAgICAgICB9CiAgICAgfQogCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIHdyaXRlT0ZGbG93TW9kQ21kKENoYW5uZWxCdWZmZXIgYmIsIE9GRmxvd01vZENtZCBjb21tYW5kKSB7CkBAIC0xMjYsMTggKzEzMywyMSBAQAogICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhkc3QsIENoYXJzZXRzLlVTX0FTQ0lJKTsKICAgICB9CiAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVGaXhlZExlbmd0aFN0cmluZyhDaGFubmVsQnVmZmVyIGJiLCBTdHJpbmcgc3RyaW5nLCBpbnQgbGVuZ3RoKSB7CisgICAgcHVibGljIHN0YXRpYyB2b2lkIHdyaXRlRml4ZWRMZW5ndGhTdHJpbmcoQ2hhbm5lbEJ1ZmZlciBiYiwgU3RyaW5nIHN0cmluZywKKyAgICAgICAgICAgIGludCBsZW5ndGgpIHsKICAgICAgICAgaW50IGwgPSBzdHJpbmcubGVuZ3RoKCk7Ci0gICAgICAgIGlmKGwgPiBsZW5ndGgpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkVycm9yIHdyaXRpbmcgc3RyaW5nOiBsZW5ndGg9IitsKyIgPiBtYXggTGVuZ3RoPSIrbGVuZ3RoKTsKKyAgICAgICAgaWYgKGwgPiBsZW5ndGgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkVycm9yIHdyaXRpbmcgc3RyaW5nOiBsZW5ndGg9IgorICAgICAgICAgICAgICAgICAgICArIGwgKyAiID4gbWF4IExlbmd0aD0iICsgbGVuZ3RoKTsKICAgICAgICAgfQogICAgICAgICBiYi53cml0ZUJ5dGVzKHN0cmluZy5nZXRCeXRlcyhDaGFyc2V0cy5VU19BU0NJSSkpOwotICAgICAgICBpZihsIDwgbGVuZ3RoKSB7CisgICAgICAgIGlmIChsIDwgbGVuZ3RoKSB7CiAgICAgICAgICAgICBiYi53cml0ZVplcm8obGVuZ3RoIC0gbCk7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVCc25JbnRlcmZhY2VMaXN0KENoYW5uZWxCdWZmZXIgYmIsIExpc3Q8T0ZCc25JbnRlcmZhY2U+IGludGVyZmFjZXMpIHsKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVCc25JbnRlcmZhY2VMaXN0KENoYW5uZWxCdWZmZXIgYmIsCisgICAgICAgICAgICBMaXN0PE9GQnNuSW50ZXJmYWNlPiBpbnRlcmZhY2VzKSB7CiAgICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKIAogICAgIH0KQEAgLTE3MiwxMiArMTgyLDEyIEBACiAgICAgfQogCiAgICAgcHVibGljIHN0YXRpYyBMaXN0PE9GVGFibGVTdGF0c0VudHJ5PiByZWFkVGFibGVTdGF0c0VudHJ5TGlzdCgKLSAgICAgICAgICAgIENoYW5uZWxCdWZmZXIgYmIpIHsKKyAgICAgICAgICAgIENoYW5uZWxCdWZmZXIgYmIsIGludCBsZW5ndGgpIHsKICAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgogICAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CiAKLSAgICBwdWJsaWMgc3RhdGljIExpc3Q8T0ZGbG93U3RhdHNFbnRyeT4gcmVhZEZsb3dTdGF0c0VudHJ5TGlzdChDaGFubmVsQnVmZmVyIGJiKSB7CisgICAgcHVibGljIHN0YXRpYyBMaXN0PE9GRmxvd1N0YXRzRW50cnk+IHJlYWRGbG93U3RhdHNFbnRyeUxpc3QoQ2hhbm5lbEJ1ZmZlciBiYiwgaW50IGxlbmd0aCkgewogICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCiAgICAgICAgIHJldHVybiBudWxsOwogICAgIH0KQEAgLTE5NSw3ICsyMDUsNyBAQAogICAgIH0KIAogICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxPRkdyb3VwRGVzY1N0YXRzRW50cnk+IHJlYWRHcm91cERlc2NTdGF0c0VudHJ5TGlzdCgKLSAgICAgICAgICAgIENoYW5uZWxCdWZmZXIgYmIpIHsKKyAgICAgICAgICAgIENoYW5uZWxCdWZmZXIgYmIsIGludCBsZW5ndGgpIHsKICAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgogICAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CkBAIC0yMzMsNyArMjQzLDcgQEAKIAogICAgIH0KIAotICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxPRlBvcnRTdGF0c0VudHJ5PiByZWFkUG9ydFN0YXRzRW50cnlMaXN0KENoYW5uZWxCdWZmZXIgYmIpIHsKKyAgICBwdWJsaWMgc3RhdGljIExpc3Q8T0ZQb3J0U3RhdHNFbnRyeT4gcmVhZFBvcnRTdGF0c0VudHJ5TGlzdChDaGFubmVsQnVmZmVyIGJiLCBpbnQgbGVuZ3RoKSB7CiAgICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQpAQCAtMjQ0LDcgKzI1NCw3IEBACiAKICAgICB9CiAKLSAgICBwdWJsaWMgc3RhdGljIExpc3Q8T0ZIZWxsb0VsZW0+IHJlYWRIZWxsb0VsZW1MaXN0KENoYW5uZWxCdWZmZXIgYmIpIHsKKyAgICBwdWJsaWMgc3RhdGljIExpc3Q8T0ZIZWxsb0VsZW0+IHJlYWRIZWxsb0VsZW1MaXN0KENoYW5uZWxCdWZmZXIgYmIsIGludCBsZW5ndGgpIHsKICAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgogICAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CkBAIC0yNTYsNyArMjY2LDcgQEAKICAgICB9CiAKICAgICBwdWJsaWMgc3RhdGljIExpc3Q8T0ZHcm91cFN0YXRzRW50cnk+IHJlYWRHcm91cFN0YXRzRW50cnlMaXN0KAotICAgICAgICAgICAgQ2hhbm5lbEJ1ZmZlciBiYikgeworICAgICAgICAgICAgQ2hhbm5lbEJ1ZmZlciBiYiwgaW50IGxlbmd0aCkgewogICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCiAgICAgICAgIHJldHVybiBudWxsOwogICAgIH0KQEAgLTI2OCw3ICsyNzgsNyBAQAogICAgIH0KIAogICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxPRlF1ZXVlU3RhdHNFbnRyeT4gcmVhZFF1ZXVlU3RhdHNFbnRyeUxpc3QoCi0gICAgICAgICAgICBDaGFubmVsQnVmZmVyIGJiKSB7CisgICAgICAgICAgICBDaGFubmVsQnVmZmVyIGJiLCBpbnQgbGVuZ3RoKSB7CiAgICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQpAQCAtMjkwLDcgKzMwMCw3IEBACiAKICAgICB9CiAKLSAgICBwdWJsaWMgc3RhdGljIExpc3Q8T0ZNZXRlclN0YXRzPiByZWFkTWV0ZXJTdGF0c0xpc3QoQ2hhbm5lbEJ1ZmZlciBiYikgeworICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxPRk1ldGVyU3RhdHM+IHJlYWRNZXRlclN0YXRzTGlzdChDaGFubmVsQnVmZmVyIGJiLCBpbnQgbGVuZ3RoKSB7CiAgICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQpAQCAtMzAxLDcgKzMxMSw3IEBACiAKICAgICB9CiAKLSAgICBwdWJsaWMgc3RhdGljIExpc3Q8T0ZUYWJsZUZlYXR1cmVzPiByZWFkVGFibGVGZWF0dXJlc0xpc3QoQ2hhbm5lbEJ1ZmZlciBiYikgeworICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxPRlRhYmxlRmVhdHVyZXM+IHJlYWRUYWJsZUZlYXR1cmVzTGlzdChDaGFubmVsQnVmZmVyIGJiLCBpbnQgbGVuZ3RoKSB7CiAgICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQpAQCAtMzEyLDUgKzMyMiwzMCBAQAogCiAgICAgfQogCisgICAgcHVibGljIHN0YXRpYyBPRk94bSByZWFkT0ZPeG0oQ2hhbm5lbEJ1ZmZlciBiYikgeworICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZU9GT3htKENoYW5uZWxCdWZmZXIgYmIsIE9GT3htIGZpZWxkKSB7CisgICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZU94bUxpc3QoQ2hhbm5lbEJ1ZmZlciBiYiwgTGlzdDxPRk94bT4gb3htTGlzdCkgeworICAgICAgICBmb3IoT0ZPeG0gbzogb3htTGlzdCkgeworICAgICAgICAgICAgby53cml0ZVRvKGJiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxPRk94bT4gcmVhZE94bUxpc3QoQ2hhbm5lbEJ1ZmZlciBiYiwgaW50IGxlbmd0aCkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVQaHlzaWNhbFBvcnRMaXN0KENoYW5uZWxCdWZmZXIgYmIsCisgICAgICAgICAgICBMaXN0PE9GUGh5c2ljYWxQb3J0PiBlbnRyaWVzKSB7CisgICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKworICAgIH0KIAogfQpkaWZmIC0tZ2l0IGEvamF2YV9nZW4vcHJlLXdyaXR0ZW4vc3JjL21haW4vamF2YS9vcmcvb3BlbmZsb3cvdHlwZXMvT0ZNZXRlckJhbmQuamF2YSBiL2phdmFfZ2VuL3ByZS13cml0dGVuL3NyYy9tYWluL2phdmEvb3JnL29wZW5mbG93L3R5cGVzL09GTWV0ZXJCYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxNTgxMmIuLjAwMDAwMDAKLS0tIGEvamF2YV9nZW4vcHJlLXdyaXR0ZW4vc3JjL21haW4vamF2YS9vcmcvb3BlbmZsb3cvdHlwZXMvT0ZNZXRlckJhbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotcGFja2FnZSBvcmcub3BlbmZsb3cudHlwZXM7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgT0ZNZXRlckJhbmQgewotCi19CmRpZmYgLS1naXQgYS9qYXZhX2dlbi9wcmUtd3JpdHRlbi9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZmxvdy90eXBlcy9PRlBvcnQuamF2YSBiL2phdmFfZ2VuL3ByZS13cml0dGVuL3NyYy9tYWluL2phdmEvb3JnL29wZW5mbG93L3R5cGVzL09GUG9ydC5qYXZhCmluZGV4IDlkYzE5N2YuLmY2ZGM0MDggMTAwNjQ0Ci0tLSBhL2phdmFfZ2VuL3ByZS13cml0dGVuL3NyYy9tYWluL2phdmEvb3JnL29wZW5mbG93L3R5cGVzL09GUG9ydC5qYXZhCisrKyBiL2phdmFfZ2VuL3ByZS13cml0dGVuL3NyYy9tYWluL2phdmEvb3JnL29wZW5mbG93L3R5cGVzL09GUG9ydC5qYXZhCkBAIC01MjAsNyArNTIwLDcgQEAKICAgICB9CiAKICAgICBwdWJsaWMgc3RhdGljIE9GUG9ydCByZWFkMkJ5dGVzKENoYW5uZWxCdWZmZXIgYykgdGhyb3dzIE9GUGFyc2VFcnJvciB7Ci0gICAgICAgIHJldHVybiBPRlBvcnQub2YoKGMucmVhZFVuc2lnbmVkU2hvcnQoKSAmIDB4MEZGRkYpKTsKKyAgICAgICAgcmV0dXJuIE9GUG9ydC5vZlNob3J0KGMucmVhZFNob3J0KCkpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHdyaXRlNEJ5dGVzKENoYW5uZWxCdWZmZXIgYykgewpkaWZmIC0tZ2l0IGEvamF2YV9nZW4vcHJlLXdyaXR0ZW4vc3JjL21haW4vamF2YS9vcmcvb3BlbmZsb3cvdHlwZXMvVTY0LmphdmEgYi9qYXZhX2dlbi9wcmUtd3JpdHRlbi9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZmxvdy90eXBlcy9VNjQuamF2YQppbmRleCBjMGNkNDc1Li5hNDZkZWQzIDEwMDY0NAotLS0gYS9qYXZhX2dlbi9wcmUtd3JpdHRlbi9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZmxvdy90eXBlcy9VNjQuamF2YQorKysgYi9qYXZhX2dlbi9wcmUtd3JpdHRlbi9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZmxvdy90eXBlcy9VNjQuamF2YQpAQCAtMzIsNiArMzIsMTAgQEAKICAgICAgICAgcmV0dXJuIG5ldyBVNjQocmF3KTsKICAgICB9CiAKKyAgICBwdWJsaWMgc3RhdGljIFU2NCBwYXJzZUhleChTdHJpbmcgaGV4KSB7CisgICAgICAgIHJldHVybiBuZXcgVTY0KG5ldyBCaWdJbnRlZ2VyKGhleCwgMTYpLmxvbmdWYWx1ZSgpKTsKKyAgICB9CisKICAgICBwdWJsaWMgbG9uZyBnZXRWYWx1ZSgpIHsKICAgICAgICAgcmV0dXJuIHJhdzsKICAgICB9CmRpZmYgLS1naXQgYS9qYXZhX2dlbi9wcmUtd3JpdHRlbi9zcmMvdGVzdC9qYXZhL1Rlc3QuamF2YSBiL2phdmFfZ2VuL3ByZS13cml0dGVuL3NyYy90ZXN0L2phdmEvVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODM3MDBkLi4wMDAwMDAwCi0tLSBhL2phdmFfZ2VuL3ByZS13cml0dGVuL3NyYy90ZXN0L2phdmEvVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotaW1wb3J0IG9yZy5vcGVuZmxvdy5wcm90b2NvbC5tYXRjaC5NYXRjaEJ1aWxkZXJWZXIxMDsKLWltcG9ydCBvcmcub3BlbmZsb3cudHlwZXMuTWFjQWRkcmVzczsKLWltcG9ydCBvcmcub3BlbmZsb3cudHlwZXMuT0ZQb3J0OwotCi0KLXB1YmxpYyBjbGFzcyBUZXN0IHsKLQotICAgIHByaXZhdGUgc3RhdGljIHZvbGF0aWxlIE9GUG9ydCBwb3J0OwotICAgIHByaXZhdGUgc3RhdGljIHZvbGF0aWxlIE1hY0FkZHJlc3MgZXRoU3JjOwotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGFyZ3MKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0gICAgICAgIE1hY0FkZHJlc3MgbWFjID0gTWFjQWRkcmVzcy5vZigiMDE6MDI6MDM6MDQ6MDU6MDYiKTsKLQotICAgICAgICBsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgIGZvcihpbnQgaT0wOyBpIDwgMTAwMDAwMDA7IGkrKykgewotICAgICAgICAgICAgTWF0Y2hCdWlsZGVyVmVyMTAgbSA9IG5ldyBNYXRjaEJ1aWxkZXJWZXIxMCgpOwotICAgICAgICAgICAgLy8gbS5zZXQoTWF0Y2hGaWVsZC5JTl9QT1JULCBPRlBvcnQuQ09OVFJPTExFUik7Ci0gICAgICAgICAgICBtLnNldElucHV0UG9ydChPRlBvcnQuQ09OVFJPTExFUik7Ci0gICAgICAgICAgICBwb3J0ID0gbS5nZXRJbnB1dFBvcnQoKTsgLy9tLmdldChNYXRjaEZpZWxkLklOX1BPUlQpOwotICAgICAgICAgICAgbS5zZXREYXRhTGF5ZXJTb3VyY2UobWFjKTsKLSAgICAgICAgICAgIGV0aFNyYyA9IG0uZ2V0RGF0YUxheWVyU291cmNlKCk7IC8vKE1hdGNoRmllbGQuRVRIX1NSQyk7Ci0gICAgICAgIH0KLSAgICAgICAgbG9uZyBlbmQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJlbmQtc3RhcnQ6ICIrIChlbmQtc3RhcnQpKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2phdmFfZ2VuL3RlbXBsYXRlcy9faW1wb3J0cy5qYXZhIGIvamF2YV9nZW4vdGVtcGxhdGVzL19pbXBvcnRzLmphdmEKaW5kZXggNzcwMDU0Ni4uYmFjNzA2NSAxMDA2NDQKLS0tIGEvamF2YV9nZW4vdGVtcGxhdGVzL19pbXBvcnRzLmphdmEKKysrIGIvamF2YV9nZW4vdGVtcGxhdGVzL19pbXBvcnRzLmphdmEKQEAgLTEsNyArMSw5IEBACitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgb3JnLm9wZW5mbG93LnByb3RvY29sLio7CiBpbXBvcnQgb3JnLm9wZW5mbG93LnByb3RvY29sLmFjdGlvbi4qOworaW1wb3J0IG9yZy5vcGVuZmxvdy5wcm90b2NvbC5tZXRlcmJhbmQuKjsKIGltcG9ydCBvcmcub3BlbmZsb3cucHJvdG9jb2wuaW5zdHJ1Y3Rpb24uKjsKIGltcG9ydCBvcmcub3BlbmZsb3cucHJvdG9jb2wubWF0Y2guKjsKIGltcG9ydCBvcmcub3BlbmZsb3cucHJvdG9jb2wub3htLio7CkBAIC0xMCwzICsxMiw1IEBACiBpbXBvcnQgb3JnLm9wZW5mbG93LnV0aWwuKjsKIGltcG9ydCBvcmcub3BlbmZsb3cuZXhjZXB0aW9ucy4qOwogaW1wb3J0IG9yZy5qYm9zcy5uZXR0eS5idWZmZXIuQ2hhbm5lbEJ1ZmZlcjsKK2ltcG9ydCBvcmcuamJvc3MubmV0dHkuYnVmZmVyLkNoYW5uZWxCdWZmZXJzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTGlzdDsKZGlmZiAtLWdpdCBhL2phdmFfZ2VuL3RlbXBsYXRlcy9fc2luZ2xldG9uLmphdmEgYi9qYXZhX2dlbi90ZW1wbGF0ZXMvX3NpbmdsZXRvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlYTlmMDEKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhX2dlbi90ZW1wbGF0ZXMvX3NpbmdsZXRvbi5qYXZhCkBAIC0wLDAgKzEsMTAgQEAKKworICAgIHByaXZhdGUgJHttc2cubmFtZX0oKSB7fQorCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgY2xhc3MgSG9sZGVyIHsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgJHttc2cubmFtZX0gSU5TVEFOQ0UgPSBuZXcgJHttc2cubmFtZX0oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljICR7bXNnLm5hbWV9IGdldEluc3RhbmNlKCkgeworICAgICAgICByZXR1cm4gSG9sZGVyLklOU1RBTkNFOworICAgIH0KZGlmZiAtLWdpdCBhL2phdmFfZ2VuL3RlbXBsYXRlcy9jb25zdC5qYXZhIGIvamF2YV9nZW4vdGVtcGxhdGVzL2NvbnN0LmphdmEKaW5kZXggNzg3MDUyOS4uMTFjMDlhYiAxMDA2NDQKLS0tIGEvamF2YV9nZW4vdGVtcGxhdGVzL2NvbnN0LmphdmEKKysrIGIvamF2YV9nZW4vdGVtcGxhdGVzL2NvbnN0LmphdmEKQEAgLTM3LDE2ICszNyw3IEBACiAKIHB1YmxpYyBlbnVtICR7Y2xhc3NfbmFtZX0gewogLy86OiBmb3IgaSwgZW50cnkgaW4gZW51bWVyYXRlKGVudW0uZW50cmllcyk6Ci0vLzo6ICAgICB2YWx1ZXMgPSBbICgiMHgleCIgJSB2YWwpIGlmIHZhbCBpcyBub3QgTm9uZSBlbHNlICItMSIgZm9yIHZhbCBpbiBlbnRyeS5hbGxfdmFsdWVzKGFsbF92ZXJzaW9ucykgXQotICAgICAke2VudHJ5Lm5hbWV9KG5ldyBpbnRbXSB7ICR7ICIsICIuam9pbiggdmFsdWVzKSB9IH0gKSR7ICIsICIgaWYgaSA8IGxlbihlbnVtLmVudHJpZXMpLTEgZWxzZSAiOyIgfQorICAgICAke2VudHJ5Lm5hbWV9JHsgIiwgIiBpZiBpIDwgbGVuKGVudW0uZW50cmllcyktMSBlbHNlICI7IiB9CiAvLzo6ICNlbmRmb3IKIAotICAgIHByaXZhdGUgZmluYWwgaW50W10gd2lyZVZhbHVlczsKLSAgICAke2NsYXNzX25hbWV9KGludFtdIHdpcmVWYWx1ZXMpIHsKLSAgICAgICAgdGhpcy53aXJlVmFsdWVzID0gd2lyZVZhbHVlczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldFdpcmVWYWx1ZShPRlZlcnNpb24gdmVyc2lvbikgewotICAgICAgICByZXR1cm4gdGhpcy53aXJlVmFsdWVzW3ZlcnNpb24uZ2V0V2lyZVZlcnNpb24oKV07Ci0gICAgfQogfQpkaWZmIC0tZ2l0IGEvamF2YV9nZW4vdGVtcGxhdGVzL2NvbnN0X3NlcmlhbGl6ZXIuamF2YSBiL2phdmFfZ2VuL3RlbXBsYXRlcy9jb25zdF9zZXJpYWxpemVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGUyMTA3MAotLS0gL2Rldi9udWxsCisrKyBiL2phdmFfZ2VuL3RlbXBsYXRlcy9jb25zdF9zZXJpYWxpemVyLmphdmEKQEAgLTAsMCArMSw4NSBAQAorLy86OiAjIENvcHlyaWdodCAyMDEzLCBCaWcgU3dpdGNoIE5ldHdvcmtzLCBJbmMuCisvLzo6ICMKKy8vOjogIyBMb3hpR2VuIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlLCB2ZXJzaW9uIDEuMCAoRVBMKSwgd2l0aAorLy86OiAjIHRoZSBmb2xsb3dpbmcgc3BlY2lhbCBleGNlcHRpb246CisvLzo6ICMKKy8vOjogIyBMT1hJIEV4Y2VwdGlvbgorLy86OiAjCisvLzo6ICMgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgdGVybXMgb2YgdGhlIEVQTCwgeW91IG1heSBkaXN0cmlidXRlIGxpYnJhcmllcworLy86OiAjIGdlbmVyYXRlZCBieSBMb3hpR2VuIChMb3hpR2VuIExpYnJhcmllcykgdW5kZXIgdGhlIHRlcm1zIG9mIHlvdXIgY2hvaWNlLCBwcm92aWRlZAorLy86OiAjIHRoYXQgY29weXJpZ2h0IGFuZCBsaWNlbnNpbmcgbm90aWNlcyBnZW5lcmF0ZWQgYnkgTG94aUdlbiBhcmUgbm90IGFsdGVyZWQgb3IgcmVtb3ZlZAorLy86OiAjIGZyb20gdGhlIExveGlHZW4gTGlicmFyaWVzIGFuZCB0aGUgbm90aWNlIHByb3ZpZGVkIGJlbG93IGlzIChpKSBpbmNsdWRlZCBpbgorLy86OiAjIHRoZSBMb3hpR2VuIExpYnJhcmllcywgaWYgZGlzdHJpYnV0ZWQgaW4gc291cmNlIGNvZGUgZm9ybSBhbmQgKGlpKSBpbmNsdWRlZCBpbiBhbnkKKy8vOjogIyBkb2N1bWVudGF0aW9uIGZvciB0aGUgTG94aUdlbiBMaWJyYXJpZXMsIGlmIGRpc3RyaWJ1dGVkIGluIGJpbmFyeSBmb3JtLgorLy86OiAjCisvLzo6ICMgTm90aWNlOiAiQ29weXJpZ2h0IDIwMTMsIEJpZyBTd2l0Y2ggTmV0d29ya3MsIEluYy4gVGhpcyBsaWJyYXJ5IHdhcyBnZW5lcmF0ZWQgYnkgdGhlIExveGlHZW4gQ29tcGlsZXIuIgorLy86OiAjCisvLzo6ICMgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBFUEwgb3IgTE9YSSBFeGNlcHRpb24uIFlvdSBtYXkgb2J0YWluCisvLzo6ICMgYSBjb3B5IG9mIHRoZSBFUEwgYXQ6CisvLzo6ICMKKy8vOjogIyBodHRwOjo6ICN3d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisvLzo6ICMKKy8vOjogIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLzo6ICMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorLy86OiAjIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZQorLy86OiAjIEVQTCBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vOjogIyB1bmRlciB0aGUgRVBMLgorLy86OgorLy86OiBpbXBvcnQgaXRlcnRvb2xzCisvLzo6IGltcG9ydCBvZl9nCisvLzo6IGluY2x1ZGUoJ19jb3B5cmlnaHQuamF2YScpCisKKy8vOjogaW5jbHVkZSgnX2F1dG9nZW4uamF2YScpCisKK3BhY2thZ2UgJHtwYWNrYWdlfTsKKworaW1wb3J0IG9yZy5vcGVuZmxvdy50eXBlcy4qOworaW1wb3J0IG9yZy5qYm9zcy5uZXR0eS5idWZmZXIuQ2hhbm5lbEJ1ZmZlcjsKK2ltcG9ydCBvcmcub3BlbmZsb3cuZXhjZXB0aW9ucy5PRlBhcnNlRXJyb3I7CitpbXBvcnQgb3JnLm9wZW5mbG93LnByb3RvY29sLk9GVmVyc2lvbjsKK2ltcG9ydCAke2VudW0ucGFja2FnZX0uJHtlbnVtLm5hbWV9OworCitwdWJsaWMgY2xhc3MgJHtjbGFzc19uYW1lfSB7CisgICAgLy86OiB3aXJlX3R5cGUgPSBlbnVtLndpcmVfdHlwZSh2ZXJzaW9uKQorICAgIC8vOjogaW50X3dpcmVfdHlwZSA9IGVudW0ud2lyZV90eXBlKHZlcnNpb24pLnB1Yl90eXBlCisgICAgLy86OiBlbnRyaWVzID0gc29ydGVkKFsgKGVudHJ5LCBlbnRyeS52YWx1ZSh2ZXJzaW9uKSkgZm9yIGVudHJ5IGluIGVudW0uZW50cmllcyBpZiBlbnRyeS5oYXNfdmFsdWUodmVyc2lvbikgXSwgbGFtYmRhIChfLHZhKSwgKF8yLHZiKTogdmEuX19jbXBfXyh2YikpCisKKyAgICAvLzo6IGZvciBlbnRyeSwgXyBpbiBlbnRyaWVzOgorICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgJHtpbnRfd2lyZV90eXBlfSAke2VudHJ5Lm5hbWV9X1ZBTCA9ICR7ZW50cnkuZm9ybWF0X3ZhbHVlKHZlcnNpb24pfTsKKyAgICAvLzo6ICNlbmRmb3IKKworICAgIHB1YmxpYyBzdGF0aWMgJHtlbnVtLm5hbWV9IHJlYWRGcm9tKENoYW5uZWxCdWZmZXIgYmIpIHRocm93cyBPRlBhcnNlRXJyb3IgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIG9mV2lyZVZhbHVlKCR7d2lyZV90eXBlLnJlYWRfb3AodmVyc2lvbil9KTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBPRlBhcnNlRXJyb3IoZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVUbyhDaGFubmVsQnVmZmVyIGJiLCAke2VudW0ubmFtZX0gZSkgeworICAgICAgICAke3dpcmVfdHlwZS53cml0ZV9vcCh2ZXJzaW9uPXZlcnNpb24sIG5hbWU9InRvV2lyZVZhbHVlKGUpIil9OworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgJHtlbnVtLm5hbWV9IG9mV2lyZVZhbHVlKCR7aW50X3dpcmVfdHlwZX0gdmFsKSB7CisgICAgICAgIHN3aXRjaCh2YWwpIHsKKyAgICAgICAgLy86OiBmb3IgZW50cnksIF8gaW4gZW50cmllczoKKyAgICAgICAgICAgIGNhc2UgJHtlbnRyeS5uYW1lfV9WQUw6CisgICAgICAgICAgICAgICAgcmV0dXJuICR7ZW51bS5uYW1lfS4ke2VudHJ5Lm5hbWV9OworICAgICAgICAvLzo6ICNlbmRmb3IKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSWxsZWdhbCB3aXJlIHZhbHVlIGZvciB0eXBlICR7ZW51bS5uYW1lfSBpbiB2ZXJzaW9uICR7dmVyc2lvbn06ICIgKyB2YWwpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyAke2ludF93aXJlX3R5cGV9IHRvV2lyZVZhbHVlKCR7ZW51bS5uYW1lfSBlKSB7CisgICAgICAgIHN3aXRjaChlKSB7CisgICAgICAgIC8vOjogZm9yIGVudHJ5LCBfIGluIGVudHJpZXM6CisgICAgICAgICAgICBjYXNlICR7ZW50cnkubmFtZX06CisgICAgICAgICAgICAgICAgcmV0dXJuICR7ZW50cnkubmFtZX1fVkFMOworICAgICAgICAvLzo6ICNlbmRmb3IKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSWxsZWdhbCBlbnVtIHZhbHVlIGZvciB0eXBlICR7ZW51bS5uYW1lfSBpbiB2ZXJzaW9uICR7dmVyc2lvbn06ICIgKyBlKTsKKyAgICAgICAgfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvamF2YV9nZW4vdGVtcGxhdGVzL2N1c3RvbS9PRk1hdGNoVjFWZXIxMC5CdWlsZGVyLmphdmEgYi9qYXZhX2dlbi90ZW1wbGF0ZXMvY3VzdG9tL09GTWF0Y2hWMVZlcjEwLkJ1aWxkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OGFmY2QwCi0tLSAvZGV2L251bGwKKysrIGIvamF2YV9nZW4vdGVtcGxhdGVzL2N1c3RvbS9PRk1hdGNoVjFWZXIxMC5CdWlsZGVyLmphdmEKQEAgLTAsMCArMSw3NyBAQAorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxGIGV4dGVuZHMgT0ZWYWx1ZVR5cGU8Rj4+IEYgZ2V0KE1hdGNoRmllbGQ8Rj4gZmllbGQpCisgICAgICAgICAgICB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24geworICAgICAgICAvLyBGSVhNRSB5b3RhbSAtIHBsZWFzZSByZXBsYWNlIHdpdGggcmVhbCBpbXBsZW1lbnRhdGlvbgorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPEYgZXh0ZW5kcyBPRlZhbHVlVHlwZTxGPj4gTWFza2VkPEY+IGdldE1hc2tlZChNYXRjaEZpZWxkPEY+IGZpZWxkKQorICAgICAgICAgICAgdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gRklYTUUgeW90YW0gLSBwbGVhc2UgcmVwbGFjZSB3aXRoIHJlYWwgaW1wbGVtZW50YXRpb24KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHMoTWF0Y2hGaWVsZDw/PiBmaWVsZCkgeworICAgICAgICAvLyBGSVhNRSB5b3RhbSAtIHBsZWFzZSByZXBsYWNlIHdpdGggcmVhbCBpbXBsZW1lbnRhdGlvbgorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNNYXNrZWQoTWF0Y2hGaWVsZDw/PiBmaWVsZCkgeworICAgICAgICAvLyBGSVhNRSB5b3RhbSAtIHBsZWFzZSByZXBsYWNlIHdpdGggcmVhbCBpbXBsZW1lbnRhdGlvbgorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNFeGFjdChNYXRjaEZpZWxkPD8+IGZpZWxkKSB7CisgICAgICAgIC8vIEZJWE1FIHlvdGFtIC0gcGxlYXNlIHJlcGxhY2Ugd2l0aCByZWFsIGltcGxlbWVudGF0aW9uCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0Z1bGx5V2lsZGNhcmRlZChNYXRjaEZpZWxkPD8+IGZpZWxkKSB7CisgICAgICAgIC8vIEZJWE1FIHlvdGFtIC0gcGxlYXNlIHJlcGxhY2Ugd2l0aCByZWFsIGltcGxlbWVudGF0aW9uCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1BhcnRpYWxseU1hc2tlZChNYXRjaEZpZWxkPD8+IGZpZWxkKSB7CisgICAgICAgIC8vIEZJWE1FIHlvdGFtIC0gcGxlYXNlIHJlcGxhY2Ugd2l0aCByZWFsIGltcGxlbWVudGF0aW9uCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPEYgZXh0ZW5kcyBPRlZhbHVlVHlwZTxGPj4gTWF0Y2hCdWlsZGVyIHNldEV4YWN0KAorICAgICAgICAgICAgTWF0Y2hGaWVsZDxGPiBmaWVsZCwgRiB2YWx1ZSkgeworICAgICAgICAvLyBGSVhNRSB5b3RhbSAtIHBsZWFzZSByZXBsYWNlIHdpdGggcmVhbCBpbXBsZW1lbnRhdGlvbgorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPEYgZXh0ZW5kcyBPRlZhbHVlVHlwZTxGPj4gTWF0Y2hCdWlsZGVyIHNldE1hc2tlZCgKKyAgICAgICAgICAgIE1hdGNoRmllbGQ8Rj4gZmllbGQsIEYgdmFsdWUsIEYgbWFzaykgeworICAgICAgICAvLyBGSVhNRSB5b3RhbSAtIHBsZWFzZSByZXBsYWNlIHdpdGggcmVhbCBpbXBsZW1lbnRhdGlvbgorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPEYgZXh0ZW5kcyBPRlZhbHVlVHlwZTxGPj4gTWF0Y2hCdWlsZGVyIHNldE1hc2tlZCgKKyAgICAgICAgICAgIE1hdGNoRmllbGQ8Rj4gZmllbGQsIE1hc2tlZDxGPiB2YWx1ZVdpdGhNYXNrKSB7CisgICAgICAgIC8vIEZJWE1FIHlvdGFtIC0gcGxlYXNlIHJlcGxhY2Ugd2l0aCByZWFsIGltcGxlbWVudGF0aW9uCisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8RiBleHRlbmRzIE9GVmFsdWVUeXBlPEY+PiBNYXRjaEJ1aWxkZXIgd2lsZGNhcmQoTWF0Y2hGaWVsZDxGPiBmaWVsZCkgeworICAgICAgICAvLyBGSVhNRSB5b3RhbSAtIHBsZWFzZSByZXBsYWNlIHdpdGggcmVhbCBpbXBsZW1lbnRhdGlvbgorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTWF0Y2ggZ2V0TWF0Y2goKSB7CisgICAgICAgIC8vIEZJWE1FIHlvdGFtIC0gcGxlYXNlIHJlcGxhY2Ugd2l0aCByZWFsIGltcGxlbWVudGF0aW9uCisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KZGlmZiAtLWdpdCBhL2phdmFfZ2VuL3RlbXBsYXRlcy9jdXN0b20vT0ZNYXRjaFYxVmVyMTAuamF2YSBiL2phdmFfZ2VuL3RlbXBsYXRlcy9jdXN0b20vT0ZNYXRjaFYxVmVyMTAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzdiZmNjCi0tLSAvZGV2L251bGwKKysrIGIvamF2YV9nZW4vdGVtcGxhdGVzL2N1c3RvbS9PRk1hdGNoVjFWZXIxMC5qYXZhCkBAIC0wLDAgKzEsNDQgQEAKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8RiBleHRlbmRzIE9GVmFsdWVUeXBlPEY+PiBGIGdldChNYXRjaEZpZWxkPEY+IGZpZWxkKQorICAgICAgICAgICAgdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gRklYTUUgeW90YW0gLSBwbGVhc2UgcmVwbGFjZSB3aXRoIHJlYWwgaW1wbGVtZW50YXRpb24KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxGIGV4dGVuZHMgT0ZWYWx1ZVR5cGU8Rj4+IE1hc2tlZDxGPiBnZXRNYXNrZWQoTWF0Y2hGaWVsZDxGPiBmaWVsZCkKKyAgICAgICAgICAgIHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIC8vIEZJWE1FIHlvdGFtIC0gcGxlYXNlIHJlcGxhY2Ugd2l0aCByZWFsIGltcGxlbWVudGF0aW9uCisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzKE1hdGNoRmllbGQ8Pz4gZmllbGQpIHsKKyAgICAgICAgLy8gRklYTUUgeW90YW0gLSBwbGVhc2UgcmVwbGFjZSB3aXRoIHJlYWwgaW1wbGVtZW50YXRpb24KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzTWFza2VkKE1hdGNoRmllbGQ8Pz4gZmllbGQpIHsKKyAgICAgICAgLy8gRklYTUUgeW90YW0gLSBwbGVhc2UgcmVwbGFjZSB3aXRoIHJlYWwgaW1wbGVtZW50YXRpb24KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzRXhhY3QoTWF0Y2hGaWVsZDw/PiBmaWVsZCkgeworICAgICAgICAvLyBGSVhNRSB5b3RhbSAtIHBsZWFzZSByZXBsYWNlIHdpdGggcmVhbCBpbXBsZW1lbnRhdGlvbgorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNGdWxseVdpbGRjYXJkZWQoTWF0Y2hGaWVsZDw/PiBmaWVsZCkgeworICAgICAgICAvLyBGSVhNRSB5b3RhbSAtIHBsZWFzZSByZXBsYWNlIHdpdGggcmVhbCBpbXBsZW1lbnRhdGlvbgorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNQYXJ0aWFsbHlNYXNrZWQoTWF0Y2hGaWVsZDw/PiBmaWVsZCkgeworICAgICAgICAvLyBGSVhNRSB5b3RhbSAtIHBsZWFzZSByZXBsYWNlIHdpdGggcmVhbCBpbXBsZW1lbnRhdGlvbgorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQpkaWZmIC0tZ2l0IGEvamF2YV9nZW4vdGVtcGxhdGVzL2N1c3RvbS9PRk1hdGNoVjJWZXIxMS5CdWlsZGVyLmphdmEgYi9qYXZhX2dlbi90ZW1wbGF0ZXMvY3VzdG9tL09GTWF0Y2hWMlZlcjExLkJ1aWxkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OGFmY2QwCi0tLSAvZGV2L251bGwKKysrIGIvamF2YV9nZW4vdGVtcGxhdGVzL2N1c3RvbS9PRk1hdGNoVjJWZXIxMS5CdWlsZGVyLmphdmEKQEAgLTAsMCArMSw3NyBAQAorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxGIGV4dGVuZHMgT0ZWYWx1ZVR5cGU8Rj4+IEYgZ2V0KE1hdGNoRmllbGQ8Rj4gZmllbGQpCisgICAgICAgICAgICB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24geworICAgICAgICAvLyBGSVhNRSB5b3RhbSAtIHBsZWFzZSByZXBsYWNlIHdpdGggcmVhbCBpbXBsZW1lbnRhdGlvbgorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPEYgZXh0ZW5kcyBPRlZhbHVlVHlwZTxGPj4gTWFza2VkPEY+IGdldE1hc2tlZChNYXRjaEZpZWxkPEY+IGZpZWxkKQorICAgICAgICAgICAgdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gRklYTUUgeW90YW0gLSBwbGVhc2UgcmVwbGFjZSB3aXRoIHJlYWwgaW1wbGVtZW50YXRpb24KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHMoTWF0Y2hGaWVsZDw/PiBmaWVsZCkgeworICAgICAgICAvLyBGSVhNRSB5b3RhbSAtIHBsZWFzZSByZXBsYWNlIHdpdGggcmVhbCBpbXBsZW1lbnRhdGlvbgorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNNYXNrZWQoTWF0Y2hGaWVsZDw/PiBmaWVsZCkgeworICAgICAgICAvLyBGSVhNRSB5b3RhbSAtIHBsZWFzZSByZXBsYWNlIHdpdGggcmVhbCBpbXBsZW1lbnRhdGlvbgorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNFeGFjdChNYXRjaEZpZWxkPD8+IGZpZWxkKSB7CisgICAgICAgIC8vIEZJWE1FIHlvdGFtIC0gcGxlYXNlIHJlcGxhY2Ugd2l0aCByZWFsIGltcGxlbWVudGF0aW9uCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0Z1bGx5V2lsZGNhcmRlZChNYXRjaEZpZWxkPD8+IGZpZWxkKSB7CisgICAgICAgIC8vIEZJWE1FIHlvdGFtIC0gcGxlYXNlIHJlcGxhY2Ugd2l0aCByZWFsIGltcGxlbWVudGF0aW9uCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1BhcnRpYWxseU1hc2tlZChNYXRjaEZpZWxkPD8+IGZpZWxkKSB7CisgICAgICAgIC8vIEZJWE1FIHlvdGFtIC0gcGxlYXNlIHJlcGxhY2Ugd2l0aCByZWFsIGltcGxlbWVudGF0aW9uCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPEYgZXh0ZW5kcyBPRlZhbHVlVHlwZTxGPj4gTWF0Y2hCdWlsZGVyIHNldEV4YWN0KAorICAgICAgICAgICAgTWF0Y2hGaWVsZDxGPiBmaWVsZCwgRiB2YWx1ZSkgeworICAgICAgICAvLyBGSVhNRSB5b3RhbSAtIHBsZWFzZSByZXBsYWNlIHdpdGggcmVhbCBpbXBsZW1lbnRhdGlvbgorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPEYgZXh0ZW5kcyBPRlZhbHVlVHlwZTxGPj4gTWF0Y2hCdWlsZGVyIHNldE1hc2tlZCgKKyAgICAgICAgICAgIE1hdGNoRmllbGQ8Rj4gZmllbGQsIEYgdmFsdWUsIEYgbWFzaykgeworICAgICAgICAvLyBGSVhNRSB5b3RhbSAtIHBsZWFzZSByZXBsYWNlIHdpdGggcmVhbCBpbXBsZW1lbnRhdGlvbgorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPEYgZXh0ZW5kcyBPRlZhbHVlVHlwZTxGPj4gTWF0Y2hCdWlsZGVyIHNldE1hc2tlZCgKKyAgICAgICAgICAgIE1hdGNoRmllbGQ8Rj4gZmllbGQsIE1hc2tlZDxGPiB2YWx1ZVdpdGhNYXNrKSB7CisgICAgICAgIC8vIEZJWE1FIHlvdGFtIC0gcGxlYXNlIHJlcGxhY2Ugd2l0aCByZWFsIGltcGxlbWVudGF0aW9uCisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8RiBleHRlbmRzIE9GVmFsdWVUeXBlPEY+PiBNYXRjaEJ1aWxkZXIgd2lsZGNhcmQoTWF0Y2hGaWVsZDxGPiBmaWVsZCkgeworICAgICAgICAvLyBGSVhNRSB5b3RhbSAtIHBsZWFzZSByZXBsYWNlIHdpdGggcmVhbCBpbXBsZW1lbnRhdGlvbgorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTWF0Y2ggZ2V0TWF0Y2goKSB7CisgICAgICAgIC8vIEZJWE1FIHlvdGFtIC0gcGxlYXNlIHJlcGxhY2Ugd2l0aCByZWFsIGltcGxlbWVudGF0aW9uCisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KZGlmZiAtLWdpdCBhL2phdmFfZ2VuL3RlbXBsYXRlcy9jdXN0b20vT0ZNYXRjaFYyVmVyMTEuamF2YSBiL2phdmFfZ2VuL3RlbXBsYXRlcy9jdXN0b20vT0ZNYXRjaFYyVmVyMTEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzdiZmNjCi0tLSAvZGV2L251bGwKKysrIGIvamF2YV9nZW4vdGVtcGxhdGVzL2N1c3RvbS9PRk1hdGNoVjJWZXIxMS5qYXZhCkBAIC0wLDAgKzEsNDQgQEAKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8RiBleHRlbmRzIE9GVmFsdWVUeXBlPEY+PiBGIGdldChNYXRjaEZpZWxkPEY+IGZpZWxkKQorICAgICAgICAgICAgdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gRklYTUUgeW90YW0gLSBwbGVhc2UgcmVwbGFjZSB3aXRoIHJlYWwgaW1wbGVtZW50YXRpb24KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxGIGV4dGVuZHMgT0ZWYWx1ZVR5cGU8Rj4+IE1hc2tlZDxGPiBnZXRNYXNrZWQoTWF0Y2hGaWVsZDxGPiBmaWVsZCkKKyAgICAgICAgICAgIHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIC8vIEZJWE1FIHlvdGFtIC0gcGxlYXNlIHJlcGxhY2Ugd2l0aCByZWFsIGltcGxlbWVudGF0aW9uCisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzKE1hdGNoRmllbGQ8Pz4gZmllbGQpIHsKKyAgICAgICAgLy8gRklYTUUgeW90YW0gLSBwbGVhc2UgcmVwbGFjZSB3aXRoIHJlYWwgaW1wbGVtZW50YXRpb24KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzTWFza2VkKE1hdGNoRmllbGQ8Pz4gZmllbGQpIHsKKyAgICAgICAgLy8gRklYTUUgeW90YW0gLSBwbGVhc2UgcmVwbGFjZSB3aXRoIHJlYWwgaW1wbGVtZW50YXRpb24KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzRXhhY3QoTWF0Y2hGaWVsZDw/PiBmaWVsZCkgeworICAgICAgICAvLyBGSVhNRSB5b3RhbSAtIHBsZWFzZSByZXBsYWNlIHdpdGggcmVhbCBpbXBsZW1lbnRhdGlvbgorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNGdWxseVdpbGRjYXJkZWQoTWF0Y2hGaWVsZDw/PiBmaWVsZCkgeworICAgICAgICAvLyBGSVhNRSB5b3RhbSAtIHBsZWFzZSByZXBsYWNlIHdpdGggcmVhbCBpbXBsZW1lbnRhdGlvbgorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNQYXJ0aWFsbHlNYXNrZWQoTWF0Y2hGaWVsZDw/PiBmaWVsZCkgeworICAgICAgICAvLyBGSVhNRSB5b3RhbSAtIHBsZWFzZSByZXBsYWNlIHdpdGggcmVhbCBpbXBsZW1lbnRhdGlvbgorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQpkaWZmIC0tZ2l0IGEvamF2YV9nZW4vdGVtcGxhdGVzL2N1c3RvbS9PRk1hdGNoVjNWZXIxMi5CdWlsZGVyLmphdmEgYi9qYXZhX2dlbi90ZW1wbGF0ZXMvY3VzdG9tL09GTWF0Y2hWM1ZlcjEyLkJ1aWxkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OGFmY2QwCi0tLSAvZGV2L251bGwKKysrIGIvamF2YV9nZW4vdGVtcGxhdGVzL2N1c3RvbS9PRk1hdGNoVjNWZXIxMi5CdWlsZGVyLmphdmEKQEAgLTAsMCArMSw3NyBAQAorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxGIGV4dGVuZHMgT0ZWYWx1ZVR5cGU8Rj4+IEYgZ2V0KE1hdGNoRmllbGQ8Rj4gZmllbGQpCisgICAgICAgICAgICB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24geworICAgICAgICAvLyBGSVhNRSB5b3RhbSAtIHBsZWFzZSByZXBsYWNlIHdpdGggcmVhbCBpbXBsZW1lbnRhdGlvbgorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPEYgZXh0ZW5kcyBPRlZhbHVlVHlwZTxGPj4gTWFza2VkPEY+IGdldE1hc2tlZChNYXRjaEZpZWxkPEY+IGZpZWxkKQorICAgICAgICAgICAgdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gRklYTUUgeW90YW0gLSBwbGVhc2UgcmVwbGFjZSB3aXRoIHJlYWwgaW1wbGVtZW50YXRpb24KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHMoTWF0Y2hGaWVsZDw/PiBmaWVsZCkgeworICAgICAgICAvLyBGSVhNRSB5b3RhbSAtIHBsZWFzZSByZXBsYWNlIHdpdGggcmVhbCBpbXBsZW1lbnRhdGlvbgorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNNYXNrZWQoTWF0Y2hGaWVsZDw/PiBmaWVsZCkgeworICAgICAgICAvLyBGSVhNRSB5b3RhbSAtIHBsZWFzZSByZXBsYWNlIHdpdGggcmVhbCBpbXBsZW1lbnRhdGlvbgorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNFeGFjdChNYXRjaEZpZWxkPD8+IGZpZWxkKSB7CisgICAgICAgIC8vIEZJWE1FIHlvdGFtIC0gcGxlYXNlIHJlcGxhY2Ugd2l0aCByZWFsIGltcGxlbWVudGF0aW9uCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0Z1bGx5V2lsZGNhcmRlZChNYXRjaEZpZWxkPD8+IGZpZWxkKSB7CisgICAgICAgIC8vIEZJWE1FIHlvdGFtIC0gcGxlYXNlIHJlcGxhY2Ugd2l0aCByZWFsIGltcGxlbWVudGF0aW9uCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1BhcnRpYWxseU1hc2tlZChNYXRjaEZpZWxkPD8+IGZpZWxkKSB7CisgICAgICAgIC8vIEZJWE1FIHlvdGFtIC0gcGxlYXNlIHJlcGxhY2Ugd2l0aCByZWFsIGltcGxlbWVudGF0aW9uCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPEYgZXh0ZW5kcyBPRlZhbHVlVHlwZTxGPj4gTWF0Y2hCdWlsZGVyIHNldEV4YWN0KAorICAgICAgICAgICAgTWF0Y2hGaWVsZDxGPiBmaWVsZCwgRiB2YWx1ZSkgeworICAgICAgICAvLyBGSVhNRSB5b3RhbSAtIHBsZWFzZSByZXBsYWNlIHdpdGggcmVhbCBpbXBsZW1lbnRhdGlvbgorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPEYgZXh0ZW5kcyBPRlZhbHVlVHlwZTxGPj4gTWF0Y2hCdWlsZGVyIHNldE1hc2tlZCgKKyAgICAgICAgICAgIE1hdGNoRmllbGQ8Rj4gZmllbGQsIEYgdmFsdWUsIEYgbWFzaykgeworICAgICAgICAvLyBGSVhNRSB5b3RhbSAtIHBsZWFzZSByZXBsYWNlIHdpdGggcmVhbCBpbXBsZW1lbnRhdGlvbgorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPEYgZXh0ZW5kcyBPRlZhbHVlVHlwZTxGPj4gTWF0Y2hCdWlsZGVyIHNldE1hc2tlZCgKKyAgICAgICAgICAgIE1hdGNoRmllbGQ8Rj4gZmllbGQsIE1hc2tlZDxGPiB2YWx1ZVdpdGhNYXNrKSB7CisgICAgICAgIC8vIEZJWE1FIHlvdGFtIC0gcGxlYXNlIHJlcGxhY2Ugd2l0aCByZWFsIGltcGxlbWVudGF0aW9uCisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8RiBleHRlbmRzIE9GVmFsdWVUeXBlPEY+PiBNYXRjaEJ1aWxkZXIgd2lsZGNhcmQoTWF0Y2hGaWVsZDxGPiBmaWVsZCkgeworICAgICAgICAvLyBGSVhNRSB5b3RhbSAtIHBsZWFzZSByZXBsYWNlIHdpdGggcmVhbCBpbXBsZW1lbnRhdGlvbgorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTWF0Y2ggZ2V0TWF0Y2goKSB7CisgICAgICAgIC8vIEZJWE1FIHlvdGFtIC0gcGxlYXNlIHJlcGxhY2Ugd2l0aCByZWFsIGltcGxlbWVudGF0aW9uCisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KZGlmZiAtLWdpdCBhL2phdmFfZ2VuL3RlbXBsYXRlcy9jdXN0b20vT0ZNYXRjaFYzVmVyMTIuamF2YSBiL2phdmFfZ2VuL3RlbXBsYXRlcy9jdXN0b20vT0ZNYXRjaFYzVmVyMTIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzdiZmNjCi0tLSAvZGV2L251bGwKKysrIGIvamF2YV9nZW4vdGVtcGxhdGVzL2N1c3RvbS9PRk1hdGNoVjNWZXIxMi5qYXZhCkBAIC0wLDAgKzEsNDQgQEAKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8RiBleHRlbmRzIE9GVmFsdWVUeXBlPEY+PiBGIGdldChNYXRjaEZpZWxkPEY+IGZpZWxkKQorICAgICAgICAgICAgdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gRklYTUUgeW90YW0gLSBwbGVhc2UgcmVwbGFjZSB3aXRoIHJlYWwgaW1wbGVtZW50YXRpb24KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxGIGV4dGVuZHMgT0ZWYWx1ZVR5cGU8Rj4+IE1hc2tlZDxGPiBnZXRNYXNrZWQoTWF0Y2hGaWVsZDxGPiBmaWVsZCkKKyAgICAgICAgICAgIHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIC8vIEZJWE1FIHlvdGFtIC0gcGxlYXNlIHJlcGxhY2Ugd2l0aCByZWFsIGltcGxlbWVudGF0aW9uCisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzKE1hdGNoRmllbGQ8Pz4gZmllbGQpIHsKKyAgICAgICAgLy8gRklYTUUgeW90YW0gLSBwbGVhc2UgcmVwbGFjZSB3aXRoIHJlYWwgaW1wbGVtZW50YXRpb24KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzTWFza2VkKE1hdGNoRmllbGQ8Pz4gZmllbGQpIHsKKyAgICAgICAgLy8gRklYTUUgeW90YW0gLSBwbGVhc2UgcmVwbGFjZSB3aXRoIHJlYWwgaW1wbGVtZW50YXRpb24KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzRXhhY3QoTWF0Y2hGaWVsZDw/PiBmaWVsZCkgeworICAgICAgICAvLyBGSVhNRSB5b3RhbSAtIHBsZWFzZSByZXBsYWNlIHdpdGggcmVhbCBpbXBsZW1lbnRhdGlvbgorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNGdWxseVdpbGRjYXJkZWQoTWF0Y2hGaWVsZDw/PiBmaWVsZCkgeworICAgICAgICAvLyBGSVhNRSB5b3RhbSAtIHBsZWFzZSByZXBsYWNlIHdpdGggcmVhbCBpbXBsZW1lbnRhdGlvbgorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNQYXJ0aWFsbHlNYXNrZWQoTWF0Y2hGaWVsZDw/PiBmaWVsZCkgeworICAgICAgICAvLyBGSVhNRSB5b3RhbSAtIHBsZWFzZSByZXBsYWNlIHdpdGggcmVhbCBpbXBsZW1lbnRhdGlvbgorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQpkaWZmIC0tZ2l0IGEvamF2YV9nZW4vdGVtcGxhdGVzL2N1c3RvbS9PRk1hdGNoVjNWZXIxMy5CdWlsZGVyLmphdmEgYi9qYXZhX2dlbi90ZW1wbGF0ZXMvY3VzdG9tL09GTWF0Y2hWM1ZlcjEzLkJ1aWxkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OGFmY2QwCi0tLSAvZGV2L251bGwKKysrIGIvamF2YV9nZW4vdGVtcGxhdGVzL2N1c3RvbS9PRk1hdGNoVjNWZXIxMy5CdWlsZGVyLmphdmEKQEAgLTAsMCArMSw3NyBAQAorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxGIGV4dGVuZHMgT0ZWYWx1ZVR5cGU8Rj4+IEYgZ2V0KE1hdGNoRmllbGQ8Rj4gZmllbGQpCisgICAgICAgICAgICB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24geworICAgICAgICAvLyBGSVhNRSB5b3RhbSAtIHBsZWFzZSByZXBsYWNlIHdpdGggcmVhbCBpbXBsZW1lbnRhdGlvbgorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPEYgZXh0ZW5kcyBPRlZhbHVlVHlwZTxGPj4gTWFza2VkPEY+IGdldE1hc2tlZChNYXRjaEZpZWxkPEY+IGZpZWxkKQorICAgICAgICAgICAgdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gRklYTUUgeW90YW0gLSBwbGVhc2UgcmVwbGFjZSB3aXRoIHJlYWwgaW1wbGVtZW50YXRpb24KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHMoTWF0Y2hGaWVsZDw/PiBmaWVsZCkgeworICAgICAgICAvLyBGSVhNRSB5b3RhbSAtIHBsZWFzZSByZXBsYWNlIHdpdGggcmVhbCBpbXBsZW1lbnRhdGlvbgorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNNYXNrZWQoTWF0Y2hGaWVsZDw/PiBmaWVsZCkgeworICAgICAgICAvLyBGSVhNRSB5b3RhbSAtIHBsZWFzZSByZXBsYWNlIHdpdGggcmVhbCBpbXBsZW1lbnRhdGlvbgorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNFeGFjdChNYXRjaEZpZWxkPD8+IGZpZWxkKSB7CisgICAgICAgIC8vIEZJWE1FIHlvdGFtIC0gcGxlYXNlIHJlcGxhY2Ugd2l0aCByZWFsIGltcGxlbWVudGF0aW9uCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0Z1bGx5V2lsZGNhcmRlZChNYXRjaEZpZWxkPD8+IGZpZWxkKSB7CisgICAgICAgIC8vIEZJWE1FIHlvdGFtIC0gcGxlYXNlIHJlcGxhY2Ugd2l0aCByZWFsIGltcGxlbWVudGF0aW9uCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1BhcnRpYWxseU1hc2tlZChNYXRjaEZpZWxkPD8+IGZpZWxkKSB7CisgICAgICAgIC8vIEZJWE1FIHlvdGFtIC0gcGxlYXNlIHJlcGxhY2Ugd2l0aCByZWFsIGltcGxlbWVudGF0aW9uCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPEYgZXh0ZW5kcyBPRlZhbHVlVHlwZTxGPj4gTWF0Y2hCdWlsZGVyIHNldEV4YWN0KAorICAgICAgICAgICAgTWF0Y2hGaWVsZDxGPiBmaWVsZCwgRiB2YWx1ZSkgeworICAgICAgICAvLyBGSVhNRSB5b3RhbSAtIHBsZWFzZSByZXBsYWNlIHdpdGggcmVhbCBpbXBsZW1lbnRhdGlvbgorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPEYgZXh0ZW5kcyBPRlZhbHVlVHlwZTxGPj4gTWF0Y2hCdWlsZGVyIHNldE1hc2tlZCgKKyAgICAgICAgICAgIE1hdGNoRmllbGQ8Rj4gZmllbGQsIEYgdmFsdWUsIEYgbWFzaykgeworICAgICAgICAvLyBGSVhNRSB5b3RhbSAtIHBsZWFzZSByZXBsYWNlIHdpdGggcmVhbCBpbXBsZW1lbnRhdGlvbgorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPEYgZXh0ZW5kcyBPRlZhbHVlVHlwZTxGPj4gTWF0Y2hCdWlsZGVyIHNldE1hc2tlZCgKKyAgICAgICAgICAgIE1hdGNoRmllbGQ8Rj4gZmllbGQsIE1hc2tlZDxGPiB2YWx1ZVdpdGhNYXNrKSB7CisgICAgICAgIC8vIEZJWE1FIHlvdGFtIC0gcGxlYXNlIHJlcGxhY2Ugd2l0aCByZWFsIGltcGxlbWVudGF0aW9uCisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8RiBleHRlbmRzIE9GVmFsdWVUeXBlPEY+PiBNYXRjaEJ1aWxkZXIgd2lsZGNhcmQoTWF0Y2hGaWVsZDxGPiBmaWVsZCkgeworICAgICAgICAvLyBGSVhNRSB5b3RhbSAtIHBsZWFzZSByZXBsYWNlIHdpdGggcmVhbCBpbXBsZW1lbnRhdGlvbgorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTWF0Y2ggZ2V0TWF0Y2goKSB7CisgICAgICAgIC8vIEZJWE1FIHlvdGFtIC0gcGxlYXNlIHJlcGxhY2Ugd2l0aCByZWFsIGltcGxlbWVudGF0aW9uCisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KZGlmZiAtLWdpdCBhL2phdmFfZ2VuL3RlbXBsYXRlcy9jdXN0b20vT0ZNYXRjaFYzVmVyMTMuamF2YSBiL2phdmFfZ2VuL3RlbXBsYXRlcy9jdXN0b20vT0ZNYXRjaFYzVmVyMTMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzdiZmNjCi0tLSAvZGV2L251bGwKKysrIGIvamF2YV9nZW4vdGVtcGxhdGVzL2N1c3RvbS9PRk1hdGNoVjNWZXIxMy5qYXZhCkBAIC0wLDAgKzEsNDQgQEAKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8RiBleHRlbmRzIE9GVmFsdWVUeXBlPEY+PiBGIGdldChNYXRjaEZpZWxkPEY+IGZpZWxkKQorICAgICAgICAgICAgdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gRklYTUUgeW90YW0gLSBwbGVhc2UgcmVwbGFjZSB3aXRoIHJlYWwgaW1wbGVtZW50YXRpb24KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxGIGV4dGVuZHMgT0ZWYWx1ZVR5cGU8Rj4+IE1hc2tlZDxGPiBnZXRNYXNrZWQoTWF0Y2hGaWVsZDxGPiBmaWVsZCkKKyAgICAgICAgICAgIHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIC8vIEZJWE1FIHlvdGFtIC0gcGxlYXNlIHJlcGxhY2Ugd2l0aCByZWFsIGltcGxlbWVudGF0aW9uCisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzKE1hdGNoRmllbGQ8Pz4gZmllbGQpIHsKKyAgICAgICAgLy8gRklYTUUgeW90YW0gLSBwbGVhc2UgcmVwbGFjZSB3aXRoIHJlYWwgaW1wbGVtZW50YXRpb24KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzTWFza2VkKE1hdGNoRmllbGQ8Pz4gZmllbGQpIHsKKyAgICAgICAgLy8gRklYTUUgeW90YW0gLSBwbGVhc2UgcmVwbGFjZSB3aXRoIHJlYWwgaW1wbGVtZW50YXRpb24KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzRXhhY3QoTWF0Y2hGaWVsZDw/PiBmaWVsZCkgeworICAgICAgICAvLyBGSVhNRSB5b3RhbSAtIHBsZWFzZSByZXBsYWNlIHdpdGggcmVhbCBpbXBsZW1lbnRhdGlvbgorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNGdWxseVdpbGRjYXJkZWQoTWF0Y2hGaWVsZDw/PiBmaWVsZCkgeworICAgICAgICAvLyBGSVhNRSB5b3RhbSAtIHBsZWFzZSByZXBsYWNlIHdpdGggcmVhbCBpbXBsZW1lbnRhdGlvbgorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNQYXJ0aWFsbHlNYXNrZWQoTWF0Y2hGaWVsZDw/PiBmaWVsZCkgeworICAgICAgICAvLyBGSVhNRSB5b3RhbSAtIHBsZWFzZSByZXBsYWNlIHdpdGggcmVhbCBpbXBsZW1lbnRhdGlvbgorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQpkaWZmIC0tZ2l0IGEvamF2YV9nZW4vdGVtcGxhdGVzL29mX2NsYXNzLmphdmEgYi9qYXZhX2dlbi90ZW1wbGF0ZXMvb2ZfY2xhc3MuamF2YQppbmRleCA5NjY1YzQ5Li4wNTAxOGQzIDEwMDY0NAotLS0gYS9qYXZhX2dlbi90ZW1wbGF0ZXMvb2ZfY2xhc3MuamF2YQorKysgYi9qYXZhX2dlbi90ZW1wbGF0ZXMvb2ZfY2xhc3MuamF2YQpAQCAtMjYsNiArMjYsNyBAQAogLy86OiAjIHVuZGVyIHRoZSBFUEwuCiAvLzo6CiAvLzo6IGZyb20gbG94aV9pciBpbXBvcnQgKgorLy86OiBpbXBvcnQgb3MKIC8vOjogaW1wb3J0IGl0ZXJ0b29scwogLy86OiBpbXBvcnQgb2ZfZwogLy86OiBpbmNsdWRlKCdfY29weXJpZ2h0LmphdmEnKQpAQCAtNjQsMTIgKzY1LDE1IEBACiAgICAgLy8gQWNjZXNzb3JzIGZvciBPRiBtZXNzYWdlIGZpZWxkcwogLy86OiBpbmNsdWRlKCJfZmllbGRfYWNjZXNzb3JzLmphdmEiLCBtc2c9bXNnLCBnZW5lcmF0ZV9zZXR0ZXJzPUZhbHNlLCBidWlsZGVyPUZhbHNlKQogCisgICAgLy86OiBpZiBvcy5wYXRoLmV4aXN0cygiJXMvY3VzdG9tLyVzLmphdmEiICUgKHRlbXBsYXRlX2RpciwgbXNnLm5hbWUpKToKKyAgICAvLzo6IGluY2x1ZGUoImN1c3RvbS8lcy5qYXZhIiAlIG1zZy5uYW1lLCBtc2c9bXNnKQorICAgIC8vOjogI2VuZGlmCiAKLSAgICBwdWJsaWMgJHttc2cubmFtZX0uQnVpbGRlciBjcmVhdGVCdWlsZGVyKCkgewotICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXJJbXBsV2l0aFBhcmVudCh0aGlzKTsKKyAgICBwdWJsaWMgJHttc2cuaW50ZXJmYWNlLm5hbWV9LkJ1aWxkZXIgY3JlYXRlQnVpbGRlcigpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyV2l0aFBhcmVudCh0aGlzKTsKICAgICB9CiAKLSAgICBzdGF0aWMgY2xhc3MgQnVpbGRlckltcGxXaXRoUGFyZW50IGltcGxlbWVudHMgJHttc2cuaW50ZXJmYWNlLm5hbWV9LkJ1aWxkZXIgeworICAgIHN0YXRpYyBjbGFzcyBCdWlsZGVyV2l0aFBhcmVudCBpbXBsZW1lbnRzICR7bXNnLmludGVyZmFjZS5uYW1lfS5CdWlsZGVyIHsKICAgICAgICAgZmluYWwgJHtpbXBsX2NsYXNzfSBwYXJlbnRNZXNzYWdlOwogCiAgICAgICAgIC8vIE9GIG1lc3NhZ2UgZmllbGRzCkBAIC03OCw3ICs4Miw3IEBACiAgICAgICAgIHByaXZhdGUgJHtwcm9wLmphdmFfdHlwZS5wdWJsaWNfdHlwZX0gJHtwcm9wLm5hbWV9OwogLy86OiAjZW5kZm9yCiAKLSAgICAgICAgQnVpbGRlckltcGxXaXRoUGFyZW50KCR7aW1wbF9jbGFzc30gcGFyZW50TWVzc2FnZSkgeworICAgICAgICBCdWlsZGVyV2l0aFBhcmVudCgke2ltcGxfY2xhc3N9IHBhcmVudE1lc3NhZ2UpIHsKICAgICAgICAgICAgIHRoaXMucGFyZW50TWVzc2FnZSA9IHBhcmVudE1lc3NhZ2U7CiAgICAgICAgIH0KIApAQCAtOTIsOSArOTYsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHByb3AgaW4gbXNnLmRhdGFfbWVtYmVyc10pfQogICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICB9CisgICAgICAgIC8vOjogaWYgb3MucGF0aC5leGlzdHMoIiVzL2N1c3RvbS8lcy5CdWlsZGVyLmphdmEiICUgKHRlbXBsYXRlX2RpciwgbXNnLm5hbWUpKToKKyAgICAgICAgLy86OiBpbmNsdWRlKCJjdXN0b20vJXMuQnVpbGRlci5qYXZhIiAlIG1zZy5uYW1lLCBtc2c9bXNnKQorICAgICAgICAvLzo6ICNlbmRpZgorCiAgICAgfQogCi0gICAgc3RhdGljIGNsYXNzIEJ1aWxkZXJJbXBsIGltcGxlbWVudHMgJHttc2cuaW50ZXJmYWNlLm5hbWV9LkJ1aWxkZXIgeworICAgIHN0YXRpYyBjbGFzcyBCdWlsZGVyIGltcGxlbWVudHMgJHttc2cuaW50ZXJmYWNlLm5hbWV9LkJ1aWxkZXIgewogICAgICAgICAvLyBPRiBtZXNzYWdlIGZpZWxkcwogLy86OiBmb3IgcHJvcCBpbiBtc2cuZGF0YV9tZW1iZXJzOgogICAgICAgICBwcml2YXRlIGJvb2xlYW4gJHtwcm9wLm5hbWV9U2V0OwpAQCAtMTExLDYgKzExOSwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBwcm9wIGluIG1zZy5kYXRhX21lbWJlcnNdKX0KICAgICAgICAgICAgICAgICApOwogICAgICAgICB9CisgICAgICAgIC8vOjogaWYgb3MucGF0aC5leGlzdHMoIiVzL2N1c3RvbS8lcy5CdWlsZGVyLmphdmEiICUgKHRlbXBsYXRlX2RpciwgbXNnLm5hbWUpKToKKyAgICAgICAgLy86OiBpbmNsdWRlKCJjdXN0b20vJXMuQnVpbGRlci5qYXZhIiAlIG1zZy5uYW1lLCBtc2c9bXNnKQorICAgICAgICAvLzo6ICNlbmRpZgorCiAgICAgfQogCiAgICAgZmluYWwgc3RhdGljIFJlYWRlciBSRUFERVIgPSBuZXcgUmVhZGVyKCk7CkBAIC0xNDEsNiArMTUzLDExIEBACiAgICAgLy8gZml4bWU6IHRvZG8gJHtwcm9wLm5hbWV9CiAvLzo6ICNlbmRpZgogLy86OiAjZW5kZm9yCisgICAgICAgICAgICAvLzo6IGlmIG1zZy5hbGlnbjoKKyAgICAgICAgICAgIC8vIGFsaWduIG1lc3NhZ2UgdG8gJHttc2cuYWxpZ259IGJ5dGVzCisgICAgICAgICAgICBiYi5za2lwQnl0ZXMoKChsZW5ndGggKyAke21zZy5hbGlnbi0xfSkvJHttc2cuYWxpZ259ICogJHttc2cuYWxpZ259ICkgLSBsZW5ndGggKTsKKyAgICAgICAgICAgIC8vOjogI2VuZGlmCisKICAgICAgICAgICAgIHJldHVybiBuZXcgJHtpbXBsX2NsYXNzfSgKICAgICAgICAgICAgICAgICAgICAgJHsiLFxuICAgICAgICAgICAgICAgICAgICAgICIuam9pbigKICAgICAgICAgICAgICAgICAgICAgICAgICBbIHByb3AubmFtZSBmb3IgcHJvcCBpbiBtc2cuZGF0YV9tZW1iZXJzXSl9CkBAIC0xNTUsNyArMTcyLDcgQEAKICAgICBmaW5hbCBzdGF0aWMgV3JpdGVyIFdSSVRFUiA9IG5ldyBXcml0ZXIoKTsKICAgICBzdGF0aWMgY2xhc3MgV3JpdGVyIGltcGxlbWVudHMgT0ZNZXNzYWdlV3JpdGVyPCR7aW1wbF9jbGFzc30+IHsKICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBpbnQgd3JpdGUoQ2hhbm5lbEJ1ZmZlciBiYiwgJHtpbXBsX2NsYXNzfSBtZXNzYWdlKSB7CisgICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlKENoYW5uZWxCdWZmZXIgYmIsICR7aW1wbF9jbGFzc30gbWVzc2FnZSkgewogLy86OiBpZiBub3QgbXNnLmlzX2ZpeGVkX2xlbmd0aDoKICAgICAgICAgICAgIGludCBzdGFydEluZGV4ID0gYmIud3JpdGVySW5kZXgoKTsKIC8vOjogI2VuZApAQCAtMTkzLDE3ICsyMTAsNzcgQEAKIC8vOjogI2VuZGlmCiAvLzo6ICNlbmRmb3IKIAotLy86OiBpZiBtc2cuaXNfZml4ZWRfbGVuZ3RoOgotICAgICAgICAgICAgcmV0dXJuIExFTkdUSDsKLS8vOjogZWxzZToKKy8vOjogaWYgbm90IG1zZy5pc19maXhlZF9sZW5ndGg6CiAgICAgICAgICAgICAvLyB1cGRhdGUgbGVuZ3RoIGZpZWxkCiAgICAgICAgICAgICBpbnQgbGVuZ3RoID0gYmIud3JpdGVySW5kZXgoKSAtIHN0YXJ0SW5kZXg7CiAgICAgICAgICAgICBiYi5zZXRTaG9ydChzdGFydEluZGV4ICsgMiwgbGVuZ3RoKTsKLSAgICAgICAgICAgIHJldHVybiBsZW5ndGg7CisgICAgICAgICAgICAvLzo6IGlmIG1zZy5hbGlnbjoKKyAgICAgICAgICAgIC8vIGFsaWduIG1lc3NhZ2UgdG8gJHttc2cuYWxpZ259IGJ5dGVzCisgICAgICAgICAgICBiYi53cml0ZVplcm8oICgobGVuZ3RoICsgJHttc2cuYWxpZ24tMX0pLyR7bXNnLmFsaWdufSAqICR7bXNnLmFsaWdufSkgLSBsZW5ndGgpOworICAgICAgICAgICAgLy86OiAjZW5kaWYKIC8vOjogI2VuZAogCiAgICAgICAgIH0KICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICBTdHJpbmdCdWlsZGVyIGIgPSBuZXcgU3RyaW5nQnVpbGRlcigiJHttc2cubmFtZX0oIik7CisgICAgICAgIC8vOjogZm9yIGksIHByb3AgaW4gZW51bWVyYXRlKG1zZy5kYXRhX21lbWJlcnMpOgorICAgICAgICAvLzo6IGlmIGkgPiAwOgorICAgICAgICBiLmFwcGVuZCgiLCAiKTsKKyAgICAgICAgLy86OiAjZW5kaWYKKyAgICAgICAgYi5hcHBlbmQoIiR7cHJvcC5uYW1lfT0iKS5hcHBlbmQoJHsgIkFycmF5cy50b1N0cmluZyglcykiICUgcHJvcC5uYW1lIGlmIHByb3AuamF2YV90eXBlLmlzX2FycmF5IGVsc2UgcHJvcC5uYW1lIH0pOworICAgICAgICAvLzo6ICNlbmRmb3IKKyAgICAgICAgYi5hcHBlbmQoIikiKTsKKyAgICAgICAgcmV0dXJuIGIudG9TdHJpbmcoKTsKKyAgICB9CisKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CisgICAgICAgIGlmICh0aGlzID09IG9iaikKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBpZiAob2JqID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmIChnZXRDbGFzcygpICE9IG9iai5nZXRDbGFzcygpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAke21zZy5uYW1lfSBvdGhlciA9ICgke21zZy5uYW1lfSkgb2JqOworCisgICAgICAgIC8vOjogZm9yIHByb3AgaW4gbXNnLmRhdGFfbWVtYmVyczoKKyAgICAgICAgLy86OiBpZiBwcm9wLmphdmFfdHlwZS5pc19wcmltaXRpdmU6CisgICAgICAgIGlmKCAke3Byb3AubmFtZX0gIT0gb3RoZXIuJHtwcm9wLm5hbWV9KQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAvLzo6IGVsaWYgcHJvcC5qYXZhX3R5cGUuaXNfYXJyYXk6CisgICAgICAgIGlmICghQXJyYXlzLmVxdWFscygke3Byb3AubmFtZX0sIG90aGVyLiR7cHJvcC5uYW1lfSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAvLzo6IGVsc2U6CisgICAgICAgIGlmICgke3Byb3AubmFtZX0gPT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKG90aGVyLiR7cHJvcC5uYW1lfSAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfSBlbHNlIGlmICghJHtwcm9wLm5hbWV9LmVxdWFscyhvdGhlci4ke3Byb3AubmFtZX0pKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAvLzo6ICNlbmRpZgorICAgICAgICAvLzo6ICNlbmRmb3IKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgZmluYWwgaW50IHByaW1lID0gMzE7CisgICAgICAgIGludCByZXN1bHQgPSAxOworCisgICAgICAgIC8vOjogZm9yIHByb3AgaW4gbXNnLmRhdGFfbWVtYmVyczoKKyAgICAgICAgLy86OiBpZiBwcm9wLmphdmFfdHlwZS5pc19wcmltaXRpdmU6CisgICAgICAgIHJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgJHtwcm9wLm5hbWV9OworICAgICAgICAvLzo6IGVsaWYgcHJvcC5qYXZhX3R5cGUuaXNfYXJyYXk6CisgICAgICAgIHJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgQXJyYXlzLmhhc2hDb2RlKCR7cHJvcC5uYW1lfSk7CisgICAgICAgIC8vOjogZWxzZToKKyAgICAgICAgcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyAoKCR7cHJvcC5uYW1lfSA9PSBudWxsKSA/IDAgOiAke3Byb3AubmFtZX0uaGFzaENvZGUoKSk7CisgICAgICAgIC8vOjogI2VuZGlmCisgICAgICAgIC8vOjogI2VuZGZvcgorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKwogCiB9CmRpZmYgLS1naXQgYS9qYXZhX2dlbi90ZW1wbGF0ZXMvb2ZfZmFjdG9yaWVzLmphdmEgYi9qYXZhX2dlbi90ZW1wbGF0ZXMvb2ZfZmFjdG9yaWVzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2NlMTM0ZAotLS0gL2Rldi9udWxsCisrKyBiL2phdmFfZ2VuL3RlbXBsYXRlcy9vZl9mYWN0b3JpZXMuamF2YQpAQCAtMCwwICsxLDQ5IEBACisvLzo6ICMgQ29weXJpZ2h0IDIwMTMsIEJpZyBTd2l0Y2ggTmV0d29ya3MsIEluYy4KKy8vOjogIworLy86OiAjIExveGlHZW4gaXMgbGljZW5zZWQgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UsIHZlcnNpb24gMS4wIChFUEwpLCB3aXRoCisvLzo6ICMgdGhlIGZvbGxvd2luZyBzcGVjaWFsIGV4Y2VwdGlvbjoKKy8vOjogIworLy86OiAjIExPWEkgRXhjZXB0aW9uCisvLzo6ICMKKy8vOjogIyBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSB0ZXJtcyBvZiB0aGUgRVBMLCB5b3UgbWF5IGRpc3RyaWJ1dGUgbGlicmFyaWVzCisvLzo6ICMgZ2VuZXJhdGVkIGJ5IExveGlHZW4gKExveGlHZW4gTGlicmFyaWVzKSB1bmRlciB0aGUgdGVybXMgb2YgeW91ciBjaG9pY2UsIHByb3ZpZGVkCisvLzo6ICMgdGhhdCBjb3B5cmlnaHQgYW5kIGxpY2Vuc2luZyBub3RpY2VzIGdlbmVyYXRlZCBieSBMb3hpR2VuIGFyZSBub3QgYWx0ZXJlZCBvciByZW1vdmVkCisvLzo6ICMgZnJvbSB0aGUgTG94aUdlbiBMaWJyYXJpZXMgYW5kIHRoZSBub3RpY2UgcHJvdmlkZWQgYmVsb3cgaXMgKGkpIGluY2x1ZGVkIGluCisvLzo6ICMgdGhlIExveGlHZW4gTGlicmFyaWVzLCBpZiBkaXN0cmlidXRlZCBpbiBzb3VyY2UgY29kZSBmb3JtIGFuZCAoaWkpIGluY2x1ZGVkIGluIGFueQorLy86OiAjIGRvY3VtZW50YXRpb24gZm9yIHRoZSBMb3hpR2VuIExpYnJhcmllcywgaWYgZGlzdHJpYnV0ZWQgaW4gYmluYXJ5IGZvcm0uCisvLzo6ICMKKy8vOjogIyBOb3RpY2U6ICJDb3B5cmlnaHQgMjAxMywgQmlnIFN3aXRjaCBOZXR3b3JrcywgSW5jLiBUaGlzIGxpYnJhcnkgd2FzIGdlbmVyYXRlZCBieSB0aGUgTG94aUdlbiBDb21waWxlci4iCisvLzo6ICMKKy8vOjogIyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIEVQTCBvciBMT1hJIEV4Y2VwdGlvbi4gWW91IG1heSBvYnRhaW4KKy8vOjogIyBhIGNvcHkgb2YgdGhlIEVQTCBhdDoKKy8vOjogIworLy86OiAjIGh0dHA6OjogI3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKy8vOjogIworLy86OiAjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vOjogIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCisvLzo6ICMgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlCisvLzo6ICMgRVBMIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy86OiAjIHVuZGVyIHRoZSBFUEwuCisvLzo6CisvLzo6IGltcG9ydCBpdGVydG9vbHMKKy8vOjogaW1wb3J0IG9mX2cKKy8vOjogaW5jbHVkZSgnX2NvcHlyaWdodC5qYXZhJykKKworLy86OiBpbmNsdWRlKCdfYXV0b2dlbi5qYXZhJykKKworcGFja2FnZSBvcmcub3BlbmZsb3cucHJvdG9jb2w7CisKKy8vOjogaW5jbHVkZSgiX2ltcG9ydHMuamF2YSIpCisKK3B1YmxpYyBmaW5hbCBjbGFzcyBPRkZhY3RvcmllcyB7CisgICAgcHVibGljIHN0YXRpYyBPRkZhY3RvcnkgZ2V0RmFjdG9yeShPRlZlcnNpb24gdmVyc2lvbikgeworICAgICAgICBzd2l0Y2godmVyc2lvbikgeworICAgICAgICAgICAgLy86OiBmb3IgdiBpbiB2ZXJzaW9uczoKKyAgICAgICAgICAgIGNhc2UgJHt2LmNvbnN0YW50X3ZlcnNpb259OgorICAgICAgICAgICAgICAgIHJldHVybiBvcmcub3BlbmZsb3cucHJvdG9jb2wudmVyJHt2Lm9mX3ZlcnNpb259Lk9GRmFjdG9yeVZlciR7di5vZl92ZXJzaW9ufS5nZXRJbnN0YW5jZSgpOworICAgICAgICAgICAgLy86OiAjZW5kZm9yCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVua25vd24gdmVyc2lvbjogIit2ZXJzaW9uKTsKKyAgICAgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXZhX2dlbi90ZW1wbGF0ZXMvb2ZfZmFjdG9yeV9jbGFzcy5qYXZhIGIvamF2YV9nZW4vdGVtcGxhdGVzL29mX2ZhY3RvcnlfY2xhc3MuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjIwNzg3Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YV9nZW4vdGVtcGxhdGVzL29mX2ZhY3RvcnlfY2xhc3MuamF2YQpAQCAtMCwwICsxLDU2IEBACisvLzo6ICMgQ29weXJpZ2h0IDIwMTMsIEJpZyBTd2l0Y2ggTmV0d29ya3MsIEluYy4KKy8vOjogIworLy86OiAjIExveGlHZW4gaXMgbGljZW5zZWQgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UsIHZlcnNpb24gMS4wIChFUEwpLCB3aXRoCisvLzo6ICMgdGhlIGZvbGxvd2luZyBzcGVjaWFsIGV4Y2VwdGlvbjoKKy8vOjogIworLy86OiAjIExPWEkgRXhjZXB0aW9uCisvLzo6ICMKKy8vOjogIyBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSB0ZXJtcyBvZiB0aGUgRVBMLCB5b3UgbWF5IGRpc3RyaWJ1dGUgbGlicmFyaWVzCisvLzo6ICMgZ2VuZXJhdGVkIGJ5IExveGlHZW4gKExveGlHZW4gTGlicmFyaWVzKSB1bmRlciB0aGUgdGVybXMgb2YgeW91ciBjaG9pY2UsIHByb3ZpZGVkCisvLzo6ICMgdGhhdCBjb3B5cmlnaHQgYW5kIGxpY2Vuc2luZyBub3RpY2VzIGdlbmVyYXRlZCBieSBMb3hpR2VuIGFyZSBub3QgYWx0ZXJlZCBvciByZW1vdmVkCisvLzo6ICMgZnJvbSB0aGUgTG94aUdlbiBMaWJyYXJpZXMgYW5kIHRoZSBub3RpY2UgcHJvdmlkZWQgYmVsb3cgaXMgKGkpIGluY2x1ZGVkIGluCisvLzo6ICMgdGhlIExveGlHZW4gTGlicmFyaWVzLCBpZiBkaXN0cmlidXRlZCBpbiBzb3VyY2UgY29kZSBmb3JtIGFuZCAoaWkpIGluY2x1ZGVkIGluIGFueQorLy86OiAjIGRvY3VtZW50YXRpb24gZm9yIHRoZSBMb3hpR2VuIExpYnJhcmllcywgaWYgZGlzdHJpYnV0ZWQgaW4gYmluYXJ5IGZvcm0uCisvLzo6ICMKKy8vOjogIyBOb3RpY2U6ICJDb3B5cmlnaHQgMjAxMywgQmlnIFN3aXRjaCBOZXR3b3JrcywgSW5jLiBUaGlzIGxpYnJhcnkgd2FzIGdlbmVyYXRlZCBieSB0aGUgTG94aUdlbiBDb21waWxlci4iCisvLzo6ICMKKy8vOjogIyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIEVQTCBvciBMT1hJIEV4Y2VwdGlvbi4gWW91IG1heSBvYnRhaW4KKy8vOjogIyBhIGNvcHkgb2YgdGhlIEVQTCBhdDoKKy8vOjogIworLy86OiAjIGh0dHA6OjogI3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKy8vOjogIworLy86OiAjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vOjogIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCisvLzo6ICMgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlCisvLzo6ICMgRVBMIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy86OiAjIHVuZGVyIHRoZSBFUEwuCisvLzo6CisvLzo6IGltcG9ydCBpdGVydG9vbHMKKy8vOjogaW1wb3J0IG9mX2cKKy8vOjogaW5jbHVkZSgnX2NvcHlyaWdodC5qYXZhJykKKworLy86OiBpbmNsdWRlKCdfYXV0b2dlbi5qYXZhJykKKworcGFja2FnZSAke2ZhY3RvcnkucGFja2FnZX07CisKKy8vOjogaW5jbHVkZSgiX2ltcG9ydHMuamF2YSIpCisKK3B1YmxpYyBjbGFzcyAke2ZhY3RvcnkubmFtZX0gaW1wbGVtZW50cyAke2ZhY3RvcnkuaW50ZXJmYWNlLm5hbWV9IHsKKy8vOjogZm9yIGkgaW4gZmFjdG9yeS5pbnRlcmZhY2UubWVtYmVyczoKKyAgICAvLzo6IGlmIGkuaXNfdmlydHVhbDoKKyAgICAvLzo6ICAgIGNvbnRpbnVlCisgICAgLy86OiAjZW5kaWYKKworLy86OiAgIGlmIGkuaGFzX3ZlcnNpb24oZmFjdG9yeS52ZXJzaW9uKSBhbmQgbW9kZWwuZ2VuZXJhdGVfY2xhc3MoaS52ZXJzaW9uZWRfY2xhc3MoZmFjdG9yeS52ZXJzaW9uKSk6CisgICAgcHVibGljICR7aS5uYW1lfS5CdWlsZGVyIGNyZWF0ZSR7aS5uYW1lWzI6XX1CdWlsZGVyKCkgeworICAgICAgICByZXR1cm4gbmV3ICR7aS52ZXJzaW9uZWRfY2xhc3MoZmFjdG9yeS52ZXJzaW9uKS5uYW1lfS5CdWlsZGVyKCk7CisgICAgfQorLy86OiBlbHNlOgorICAgIHB1YmxpYyAke2kubmFtZX0uQnVpbGRlciBjcmVhdGUke2kubmFtZVsyOl19QnVpbGRlcigpIHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiJHtpLm5hbWV9IG5vdCBzdXBwb3J0ZWQgaW4gdmVyc2lvbiAke2ZhY3RvcnkudmVyc2lvbn0iKTsKKyAgICB9CisvLzo6ICNlbmRpZgorLy86OiAjZW5kZm9yCisKKyAgICAvLzo6IGluY2x1ZGUoIl9zaW5nbGV0b24uamF2YSIsIG1zZz1mYWN0b3J5KQorfQpkaWZmIC0tZ2l0IGEvamF2YV9nZW4vdGVtcGxhdGVzL29mX2ZhY3RvcnlfaW50ZXJmYWNlLmphdmEgYi9qYXZhX2dlbi90ZW1wbGF0ZXMvb2ZfZmFjdG9yeV9pbnRlcmZhY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Njc1MDRlCi0tLSAvZGV2L251bGwKKysrIGIvamF2YV9nZW4vdGVtcGxhdGVzL29mX2ZhY3RvcnlfaW50ZXJmYWNlLmphdmEKQEAgLTAsMCArMSw0NSBAQAorLy86OiAjIENvcHlyaWdodCAyMDEzLCBCaWcgU3dpdGNoIE5ldHdvcmtzLCBJbmMuCisvLzo6ICMKKy8vOjogIyBMb3hpR2VuIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlLCB2ZXJzaW9uIDEuMCAoRVBMKSwgd2l0aAorLy86OiAjIHRoZSBmb2xsb3dpbmcgc3BlY2lhbCBleGNlcHRpb246CisvLzo6ICMKKy8vOjogIyBMT1hJIEV4Y2VwdGlvbgorLy86OiAjCisvLzo6ICMgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgdGVybXMgb2YgdGhlIEVQTCwgeW91IG1heSBkaXN0cmlidXRlIGxpYnJhcmllcworLy86OiAjIGdlbmVyYXRlZCBieSBMb3hpR2VuIChMb3hpR2VuIExpYnJhcmllcykgdW5kZXIgdGhlIHRlcm1zIG9mIHlvdXIgY2hvaWNlLCBwcm92aWRlZAorLy86OiAjIHRoYXQgY29weXJpZ2h0IGFuZCBsaWNlbnNpbmcgbm90aWNlcyBnZW5lcmF0ZWQgYnkgTG94aUdlbiBhcmUgbm90IGFsdGVyZWQgb3IgcmVtb3ZlZAorLy86OiAjIGZyb20gdGhlIExveGlHZW4gTGlicmFyaWVzIGFuZCB0aGUgbm90aWNlIHByb3ZpZGVkIGJlbG93IGlzIChpKSBpbmNsdWRlZCBpbgorLy86OiAjIHRoZSBMb3hpR2VuIExpYnJhcmllcywgaWYgZGlzdHJpYnV0ZWQgaW4gc291cmNlIGNvZGUgZm9ybSBhbmQgKGlpKSBpbmNsdWRlZCBpbiBhbnkKKy8vOjogIyBkb2N1bWVudGF0aW9uIGZvciB0aGUgTG94aUdlbiBMaWJyYXJpZXMsIGlmIGRpc3RyaWJ1dGVkIGluIGJpbmFyeSBmb3JtLgorLy86OiAjCisvLzo6ICMgTm90aWNlOiAiQ29weXJpZ2h0IDIwMTMsIEJpZyBTd2l0Y2ggTmV0d29ya3MsIEluYy4gVGhpcyBsaWJyYXJ5IHdhcyBnZW5lcmF0ZWQgYnkgdGhlIExveGlHZW4gQ29tcGlsZXIuIgorLy86OiAjCisvLzo6ICMgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBFUEwgb3IgTE9YSSBFeGNlcHRpb24uIFlvdSBtYXkgb2J0YWluCisvLzo6ICMgYSBjb3B5IG9mIHRoZSBFUEwgYXQ6CisvLzo6ICMKKy8vOjogIyBodHRwOjo6ICN3d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisvLzo6ICMKKy8vOjogIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLzo6ICMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorLy86OiAjIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZQorLy86OiAjIEVQTCBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vOjogIyB1bmRlciB0aGUgRVBMLgorLy86OgorLy86OiBpbXBvcnQgaXRlcnRvb2xzCisvLzo6IGltcG9ydCBvZl9nCisvLzo6IGluY2x1ZGUoJ19jb3B5cmlnaHQuamF2YScpCisKKy8vOjogaW5jbHVkZSgnX2F1dG9nZW4uamF2YScpCisKK3BhY2thZ2Ugb3JnLm9wZW5mbG93LnByb3RvY29sOworCisvLzo6IGluY2x1ZGUoIl9pbXBvcnRzLmphdmEiKQorCitwdWJsaWMgaW50ZXJmYWNlICR7ZmFjdG9yeS5uYW1lfSB7CisvLzo6IGZvciBpIGluIGZhY3RvcnkubWVtYmVyczoKKyAgICAvLzo6IGlmIGkuaXNfdmlydHVhbDoKKyAgICAvLzo6ICAgIGNvbnRpbnVlCisgICAgLy86OiAjZW5kaWYKKyAgICAke2kubmFtZX0uQnVpbGRlciBjcmVhdGUke2kubmFtZVsyOl19QnVpbGRlcigpJHsgIiIgaWYgaS5pc191bml2ZXJzYWwgZWxzZSAiIHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiJ9OworLy86OiAjZW5kZm9yCit9CmRpZmYgLS1naXQgYS9qYXZhX2dlbi90ZW1wbGF0ZXMvb2ZfaW50ZXJmYWNlLmphdmEgYi9qYXZhX2dlbi90ZW1wbGF0ZXMvb2ZfaW50ZXJmYWNlLmphdmEKaW5kZXggYjk2OWQ1MC4uMTg2Yjc4NyAxMDA2NDQKLS0tIGEvamF2YV9nZW4vdGVtcGxhdGVzL29mX2ludGVyZmFjZS5qYXZhCisrKyBiL2phdmFfZ2VuL3RlbXBsYXRlcy9vZl9pbnRlcmZhY2UuamF2YQpAQCAtMzUsNyArMzUsNyBAQAogCiAvLzo6IGluY2x1ZGUoIl9pbXBvcnRzLmphdmEiLCBtc2c9bXNnKQogCi1wdWJsaWMgaW50ZXJmYWNlICR7bXNnLm5hbWV9ICR7ImV4dGVuZHMgJXMiICUgbXNnLnBhcmVudF9pbnRlcmZhY2UgaWYgbXNnLnBhcmVudF9pbnRlcmZhY2UgZWxzZSAiIn0geworcHVibGljIGludGVyZmFjZSAke21zZy5uYW1lfSBleHRlbmRzIE9GT2JqZWN0JHsiLCAlcyIgJSBtc2cucGFyZW50X2ludGVyZmFjZSBpZiBtc2cucGFyZW50X2ludGVyZmFjZSBlbHNlICIifXsKIC8vOjogZm9yIHByb3AgaW4gbXNnLm1lbWJlcnM6CiAgICAgJHtwcm9wLmphdmFfdHlwZS5wdWJsaWNfdHlwZX0gZ2V0JHtwcm9wLnRpdGxlX25hbWV9KCkkeyAiIiBpZiBwcm9wLmlzX3VuaXZlcnNhbCBlbHNlICIgdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIn07CiAvLzo6ICNlbmRmb3IKZGlmZiAtLWdpdCBhL2phdmFfZ2VuL3RlbXBsYXRlcy91bml0X3Rlc3QuamF2YSBiL2phdmFfZ2VuL3RlbXBsYXRlcy91bml0X3Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDYyNDY1Ci0tLSAvZGV2L251bGwKKysrIGIvamF2YV9nZW4vdGVtcGxhdGVzL3VuaXRfdGVzdC5qYXZhCkBAIC0wLDAgKzEsMTAyIEBACisvLzo6ICMgQ29weXJpZ2h0IDIwMTMsIEJpZyBTd2l0Y2ggTmV0d29ya3MsIEluYy4KKy8vOjogIworLy86OiAjIExveGlHZW4gaXMgbGljZW5zZWQgdW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UsIHZlcnNpb24gMS4wIChFUEwpLCB3aXRoCisvLzo6ICMgdGhlIGZvbGxvd2luZyBzcGVjaWFsIGV4Y2VwdGlvbjoKKy8vOjogIworLy86OiAjIExPWEkgRXhjZXB0aW9uCisvLzo6ICMKKy8vOjogIyBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSB0ZXJtcyBvZiB0aGUgRVBMLCB5b3UgbWF5IGRpc3RyaWJ1dGUgbGlicmFyaWVzCisvLzo6ICMgZ2VuZXJhdGVkIGJ5IExveGlHZW4gKExveGlHZW4gTGlicmFyaWVzKSB1bmRlciB0aGUgdGVybXMgb2YgeW91ciBjaG9pY2UsIHByb3ZpZGVkCisvLzo6ICMgdGhhdCBjb3B5cmlnaHQgYW5kIGxpY2Vuc2luZyBub3RpY2VzIGdlbmVyYXRlZCBieSBMb3hpR2VuIGFyZSBub3QgYWx0ZXJlZCBvciByZW1vdmVkCisvLzo6ICMgZnJvbSB0aGUgTG94aUdlbiBMaWJyYXJpZXMgYW5kIHRoZSBub3RpY2UgcHJvdmlkZWQgYmVsb3cgaXMgKGkpIGluY2x1ZGVkIGluCisvLzo6ICMgdGhlIExveGlHZW4gTGlicmFyaWVzLCBpZiBkaXN0cmlidXRlZCBpbiBzb3VyY2UgY29kZSBmb3JtIGFuZCAoaWkpIGluY2x1ZGVkIGluIGFueQorLy86OiAjIGRvY3VtZW50YXRpb24gZm9yIHRoZSBMb3hpR2VuIExpYnJhcmllcywgaWYgZGlzdHJpYnV0ZWQgaW4gYmluYXJ5IGZvcm0uCisvLzo6ICMKKy8vOjogIyBOb3RpY2U6ICJDb3B5cmlnaHQgMjAxMywgQmlnIFN3aXRjaCBOZXR3b3JrcywgSW5jLiBUaGlzIGxpYnJhcnkgd2FzIGdlbmVyYXRlZCBieSB0aGUgTG94aUdlbiBDb21waWxlci4iCisvLzo6ICMKKy8vOjogIyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIEVQTCBvciBMT1hJIEV4Y2VwdGlvbi4gWW91IG1heSBvYnRhaW4KKy8vOjogIyBhIGNvcHkgb2YgdGhlIEVQTCBhdDoKKy8vOjogIworLy86OiAjIGh0dHA6OjogI3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKy8vOjogIworLy86OiAjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vOjogIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCisvLzo6ICMgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlCisvLzo6ICMgRVBMIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy86OiAjIHVuZGVyIHRoZSBFUEwuCisvLzo6CisvLzo6IGZyb20gbG94aV9pciBpbXBvcnQgKgorLy86OiBpbXBvcnQgaXRlcnRvb2xzCisvLzo6IGltcG9ydCBvZl9nCisvLzo6IGluY2x1ZGUoJ19jb3B5cmlnaHQuamF2YScpCisKKy8vOjogaW5jbHVkZSgnX2F1dG9nZW4uamF2YScpCisKK3BhY2thZ2UgJHt0ZXN0LnBhY2thZ2V9OworCisvLzo6IGluY2x1ZGUoIl9pbXBvcnRzLmphdmEiLCBtc2c9bXNnKQoraW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuKjsKKworcHVibGljIGNsYXNzICR7dGVzdC5uYW1lfSB7CisgICAgLy86OiB2YXJfdHlwZSA9IG1zZy5pbnRlcmZhY2UubmFtZQorICAgIC8vOjogdmFyX25hbWUgPSBtc2cuaW50ZXJmYWNlLnZhcmlhYmxlX25hbWUKKyAgICBPRkZhY3RvcnkgZmFjdG9yeTsKKworICAgIGZpbmFsIHN0YXRpYyBieXRlW10gJHttc2cuY29uc3RhbnRfbmFtZX1fU0VSSUFMSVpFRCA9CisgICAgICAgIG5ldyBieXRlW10geyAkeyIsICIuam9pbigiJXMweCV4IiAlICgoIiIgaWYgb3JkKGMpPDEyOCBlbHNlICIoYnl0ZSkgIiksICBvcmQoYykpIGZvciBjIGluIHRlc3RfZGF0YVsiYmluYXJ5Il0gKSB9IH07CisKKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgc2V0dXAoKSB7CisgICAgICAgIGZhY3RvcnkgPSBPRkZhY3Rvcmllcy5nZXRGYWN0b3J5KE9GVmVyc2lvbi4ke3ZlcnNpb24uY29uc3RhbnRfdmVyc2lvbn0pOworICAgIH0KKworICAgIC8vOjogaWYgImphdmEiIGluIHRlc3RfZGF0YToKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RXcml0ZSgpIHsKKyAgICAgICAgJHt2YXJfdHlwZX0uQnVpbGRlciBidWlsZGVyID0gZmFjdG9yeS5jcmVhdGUke3Zhcl90eXBlWzI6XX1CdWlsZGVyKCk7CisgICAgICAgICR7dGVzdF9kYXRhWyJqYXZhIl19OworICAgICAgICAke3Zhcl90eXBlfSAke3Zhcl9uYW1lfSA9IGJ1aWxkZXIuZ2V0TWVzc2FnZSgpOworICAgICAgICBDaGFubmVsQnVmZmVyIGJiID0gQ2hhbm5lbEJ1ZmZlcnMuZHluYW1pY0J1ZmZlcigpOworICAgICAgICAke3Zhcl9uYW1lfS53cml0ZVRvKGJiKTsKKyAgICAgICAgYnl0ZVtdIHdyaXR0ZW4gPSBuZXcgYnl0ZVtiYi5yZWFkYWJsZUJ5dGVzKCldOworICAgICAgICBiYi5yZWFkQnl0ZXMod3JpdHRlbik7CisKKyAgICAgICAgYXNzZXJ0QXJyYXlFcXVhbHMoJHttc2cuY29uc3RhbnRfbmFtZX1fU0VSSUFMSVpFRCwgd3JpdHRlbik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVhZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAke3Zhcl90eXBlfS5CdWlsZGVyIGJ1aWxkZXIgPSBmYWN0b3J5LmNyZWF0ZSR7dmFyX3R5cGVbMjpdfUJ1aWxkZXIoKTsKKyAgICAgICAgJHt0ZXN0X2RhdGFbImphdmEiXX07CisgICAgICAgICR7dmFyX3R5cGV9ICR7dmFyX25hbWV9QnVpbHQgPSBidWlsZGVyLmdldE1lc3NhZ2UoKTsKKworICAgICAgICBDaGFubmVsQnVmZmVyIGlucHV0ID0gQ2hhbm5lbEJ1ZmZlcnMuY29waWVkQnVmZmVyKCR7bXNnLmNvbnN0YW50X25hbWV9X1NFUklBTElaRUQpOworCisgICAgICAgIC8vIEZJWE1FIHNob3VsZCBpbnZva2UgdGhlIG92ZXJhbGwgcmVhZGVyIG9uY2UgaW1wbGVtZW50ZWQKKyAgICAgICAgJHt2YXJfdHlwZX0gJHt2YXJfbmFtZX1SZWFkID0gJHttc2cubmFtZX0uUkVBREVSLnJlYWRGcm9tKGlucHV0KTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoJHt2YXJfbmFtZX1SZWFkLCAke3Zhcl9uYW1lfUJ1aWx0KTsKKyAgIH0KKyAgIC8vOjogZWxzZToKKyAgIC8vIEZJWE1FOiBObyBqYXZhIHN0YW56YSBpbiB0ZXN0X2RhdGEgZm9yIHRoaXMgY2xhc3MuIEFkZCBmb3IgbW9yZSBjb21wcmVoZW5zaXZlIHVuaXQgdGVzdGluZworICAgLy86OiAjZW5kaWYKKworICAgQFRlc3QKKyAgIHB1YmxpYyB2b2lkIHRlc3RSZWFkV3JpdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICBDaGFubmVsQnVmZmVyIGlucHV0ID0gQ2hhbm5lbEJ1ZmZlcnMuY29waWVkQnVmZmVyKCR7bXNnLmNvbnN0YW50X25hbWV9X1NFUklBTElaRUQpOworCisgICAgICAgLy8gRklYTUUgc2hvdWxkIGludm9rZSB0aGUgb3ZlcmFsbCByZWFkZXIgb25jZSBpbXBsZW1lbnRlZAorICAgICAgICR7dmFyX3R5cGV9ICR7dmFyX25hbWV9ID0gJHttc2cubmFtZX0uUkVBREVSLnJlYWRGcm9tKGlucHV0KTsKKworICAgICAgIC8vIHdyaXRlIG1lc3NhZ2UgYWdhaW4KKyAgICAgICBDaGFubmVsQnVmZmVyIGJiID0gQ2hhbm5lbEJ1ZmZlcnMuZHluYW1pY0J1ZmZlcigpOworICAgICAgICR7dmFyX25hbWV9LndyaXRlVG8oYmIpOworICAgICAgIGJ5dGVbXSB3cml0dGVuID0gbmV3IGJ5dGVbYmIucmVhZGFibGVCeXRlcygpXTsKKyAgICAgICBiYi5yZWFkQnl0ZXMod3JpdHRlbik7CisKKyAgICAgICBhc3NlcnRBcnJheUVxdWFscygke21zZy5jb25zdGFudF9uYW1lfV9TRVJJQUxJWkVELCB3cml0dGVuKTsKKyAgIH0KKworfQpkaWZmIC0tZ2l0IGEvbG94aV9mcm9udF9lbmQvZnJvbnRlbmQucHkgYi9sb3hpX2Zyb250X2VuZC9mcm9udGVuZC5weQppbmRleCBkMjVjMmViLi43MDY5OWUwIDEwMDY0NAotLS0gYS9sb3hpX2Zyb250X2VuZC9mcm9udGVuZC5weQorKysgYi9sb3hpX2Zyb250X2VuZC9mcm9udGVuZC5weQpAQCAtNDYsNiArNDYsMTAgQEAKICAgICAgICAgICAgIHJldHVybiBPRkZpZWxkTGVuZ3RoTWVtYmVyKG5hbWU9bV9hc3RbMl0sIG9mdHlwZT1tX2FzdFsxXSwgZmllbGRfbmFtZT0nYWN0aW9ucycpCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICByZXR1cm4gT0ZEYXRhTWVtYmVyKG5hbWU9bV9hc3RbMl0sIG9mdHlwZT1tX2FzdFsxXSkKKyAgICBlbGlmIG1fYXN0WzBdID09ICdkaXNjcmltaW5hdG9yJzoKKyAgICAgICAgcmV0dXJuIE9GRGlzY3JpbWluYXRvck1lbWJlcihuYW1lPW1fYXN0WzJdLCBvZnR5cGU9bV9hc3RbMV0pCisgICAgZWxzZToKKyAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCJEb250IGtub3cgaG93IHRvIGNyZWF0ZSBtZW1iZXI6ICVzIiAlIG1fYXN0WzBdKQogCiBkZWYgY3JlYXRlX29maW5wdXQoYXN0KToKICAgICAiIiIKQEAgLTYwLDExICs2NCwzMSBAQAogCiAgICAgZm9yIGRlY2xfYXN0IGluIGFzdDoKICAgICAgICAgaWYgZGVjbF9hc3RbMF0gPT0gJ3N0cnVjdCc6Ci0gICAgICAgICAgICBtZW1iZXJzID0gW2NyZWF0ZV9tZW1iZXIobV9hc3QpIGZvciBtX2FzdCBpbiBkZWNsX2FzdFszXV0KLSAgICAgICAgICAgIG9mY2xhc3MgPSBPRkNsYXNzKG5hbWU9ZGVjbF9hc3RbMV0sIHN1cGVyY2xhc3M9ZGVjbF9hc3RbMl0sIG1lbWJlcnM9bWVtYmVycykKKyAgICAgICAgICAgICMgMDogImVudW0iCisgICAgICAgICAgICAjIDE6IG5hbWUKKyAgICAgICAgICAgICMgMjogcG90ZW50aWFsbHkgbGlzdCBvZiBbcGFyYW1fbmFtZSwgcGFyYW1fdmFsdWVdCisgICAgICAgICAgICAjIDM6IHN1cGVyX2NsYXNzIG9yIE5vbmUKKyAgICAgICAgICAgICMgNDogbGlzdCBvZiBbY29uc3RhbnRfbmFtZSwgY29uc3RhbnRfdmFsdWVdKworICAgICAgICAgICAgc3VwZXJjbGFzcyA9IGRlY2xfYXN0WzNdCisgICAgICAgICAgICBtZW1iZXJzID0gW2NyZWF0ZV9tZW1iZXIobV9hc3QpIGZvciBtX2FzdCBpbiBkZWNsX2FzdFs0XV0KKworICAgICAgICAgICAgZGlzY3JpbWluYXRvcnMgPSBbIG0gZm9yIG0gaW4gbWVtYmVycyBpZiBpc2luc3RhbmNlKG0sIE9GRGlzY3JpbWluYXRvck1lbWJlcikgXQorICAgICAgICAgICAgaWYgbGVuKGRpc2NyaW1pbmF0b3JzKSA+IDE6CisgICAgICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCIlczogQ2Fubm90IHN1cHBvcnQgbW9yZSB0aGFuIG9uZSBkaXNjcmltaW5hdG9yIGJ5IGNsYXNzIC0gZ290ICVzIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAoZGVjbF9hc3RbMV0sIHJlcHIoZGlzY3JpbWluYXRvcnMpKSkKKyAgICAgICAgICAgIG9mY2xhc3MgPSBPRkNsYXNzKG5hbWU9ZGVjbF9hc3RbMV0sIG1lbWJlcnM9bWVtYmVycywgc3VwZXJjbGFzcz1zdXBlcmNsYXNzLAorICAgICAgICAgICAgICAgICAgICB2aXJ0dWFsID0gbGVuKGRpc2NyaW1pbmF0b3JzKSA+IDAsCisgICAgICAgICAgICAgICAgICAgIHBhcmFtcyA9IHsgcGFyYW06IHZhbHVlIGZvciBwYXJhbSwgdmFsdWUgaW4gZGVjbF9hc3RbMl0gfSkKICAgICAgICAgICAgIG9maW5wdXQuY2xhc3Nlcy5hcHBlbmQob2ZjbGFzcykKICAgICAgICAgaWYgZGVjbF9hc3RbMF0gPT0gJ2VudW0nOgotICAgICAgICAgICAgZW51bSA9IE9GRW51bShuYW1lPWRlY2xfYXN0WzFdLCB2YWx1ZXM9Wyh4WzBdLCB4WzFdKSBmb3IgeCBpbiBkZWNsX2FzdFsyXV0pCisgICAgICAgICAgICAjIDA6ICJlbnVtIgorICAgICAgICAgICAgIyAxOiBuYW1lCisgICAgICAgICAgICAjIDI6IHBvdGVudGlhbGx5IGxpc3Qgb2YgW3BhcmFtX25hbWUsIHBhcmFtX3ZhbHVlXQorICAgICAgICAgICAgIyAzOiBsaXN0IG9mIFtjb25zdGFudF9uYW1lLCBjb25zdGFudF92YWx1ZV0rCisgICAgICAgICAgICBlbnVtID0gT0ZFbnVtKG5hbWU9ZGVjbF9hc3RbMV0sCisgICAgICAgICAgICAgICAgICAgIGVudHJpZXM9W09GRW51bUVudHJ5KG5hbWU9eFswXSwgdmFsdWU9eFsyXSwgcGFyYW1zPXtwYXJhbTp2YWx1ZSBmb3IgcGFyYW0sIHZhbHVlIGluIHhbMV0gfSkgZm9yIHggaW4gZGVjbF9hc3RbM11dLAorICAgICAgICAgICAgICAgICAgICBwYXJhbXMgPSB7IHBhcmFtOiB2YWx1ZSBmb3IgcGFyYW0sIHZhbHVlIGluIGRlY2xfYXN0WzJdIH0KKyAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgb2ZpbnB1dC5lbnVtcy5hcHBlbmQoZW51bSkKICAgICAgICAgZWxpZiBkZWNsX2FzdFswXSA9PSAnbWV0YWRhdGEnOgogICAgICAgICAgICAgaWYgZGVjbF9hc3RbMV0gPT0gJ3ZlcnNpb24nOgpkaWZmIC0tZ2l0IGEvbG94aV9mcm9udF9lbmQvcGFyc2VyLnB5IGIvbG94aV9mcm9udF9lbmQvcGFyc2VyLnB5CmluZGV4IDc4OTMwMDguLjI1YmZkZTQgMTAwNjQ0Ci0tLSBhL2xveGlfZnJvbnRfZW5kL3BhcnNlci5weQorKysgYi9sb3hpX2Zyb250X2VuZC9wYXJzZXIucHkKQEAgLTUxLDE5ICs1MSwzNiBAQAogCiAjIFN0cnVjdHMKIHBhZF9tZW1iZXIgPSBQLkdyb3VwKGt3KCdwYWQnKSAtIHMoJygnKSAtIGludGVnZXIgLSBzKCcpJykpCitkaXNjcmltaW5hdG9yX21lbWJlciA9IFAuR3JvdXAodGFnKCdkaXNjcmltaW5hdG9yJykgKyBhbnlfdHlwZSArIGlkZW50aWZpZXIgKyBzKCc9PScpICsgcygnPycpKQogdHlwZV9tZW1iZXIgPSBQLkdyb3VwKHRhZygndHlwZScpICsgYW55X3R5cGUgKyBpZGVudGlmaWVyICsgcygnPT0nKSArIGludGVnZXIpCiBkYXRhX21lbWJlciA9IFAuR3JvdXAodGFnKCdkYXRhJykgKyBhbnlfdHlwZSAtIGlkZW50aWZpZXIpCi1zdHJ1Y3RfbWVtYmVyID0gcGFkX21lbWJlciB8IHR5cGVfbWVtYmVyIHwgZGF0YV9tZW1iZXI7CisKK3N0cnVjdF9wYXJhbV9uYW1lID0ga3coImFsaWduIikKK3N0cnVjdF9wYXJhbSA9IFAuR3JvdXAoc3RydWN0X3BhcmFtX25hbWUgLSBzKCc9JykgLSBhbnlfdHlwZSkKK3N0cnVjdF9wYXJhbV9saXN0ID0gUC5Gb3J3YXJkKCkKK3N0cnVjdF9wYXJhbV9saXN0IDw8IHN0cnVjdF9wYXJhbSArIFAuT3B0aW9uYWwocygnLCcpIC0gUC5PcHRpb25hbChzdHJ1Y3RfcGFyYW1fbGlzdCkpCisKK3N0cnVjdF9tZW1iZXIgPSBwYWRfbWVtYmVyIHwgdHlwZV9tZW1iZXIgfCBkaXNjcmltaW5hdG9yX21lbWJlciB8IGRhdGFfbWVtYmVyOwogcGFyZW50ID0gKHMoJzonKSAtIGlkZW50aWZpZXIpIHwgdGFnKE5vbmUpCi1zdHJ1Y3QgPSBrdygnc3RydWN0JykgLSBpZGVudGlmaWVyIC0gcGFyZW50IC0gcygneycpICsgXAorc3RydWN0ID0ga3coJ3N0cnVjdCcpIC0gaWRlbnRpZmllciAtIFAuR3JvdXAoUC5PcHRpb25hbChzKCcoJykgLSBzdHJ1Y3RfcGFyYW1fbGlzdCAtIHMoJyknKSkpIC0gcGFyZW50IC0gcygneycpICsgXAogICAgICAgICAgUC5Hcm91cChQLlplcm9Pck1vcmUoc3RydWN0X21lbWJlciAtIHMoJzsnKSkpICsgXAogICAgICAgICAgcygnfScpIC0gcygnOycpCiAKICMgRW51bXMKLWVudW1fbWVtYmVyID0gUC5Hcm91cChpZGVudGlmaWVyICsgcygnPScpICsgaW50ZWdlcikKK2VudW1fcGFyYW1fbmFtZSA9IGt3KCJ3aXJlX3R5cGUiKSB8IGt3KCJiaXRtYXNrIikgfCBrdygiY29tcGxldGUiKQorZW51bV9wYXJhbSA9IFAuR3JvdXAoZW51bV9wYXJhbV9uYW1lICAtIHMoJz0nKSAtIGFueV90eXBlKQorZW51bV9wYXJhbV9saXN0ID0gUC5Gb3J3YXJkKCkKK2VudW1fcGFyYW1fbGlzdCA8PCBlbnVtX3BhcmFtICsgUC5PcHRpb25hbChzKCcsJykgKyBQLk9wdGlvbmFsKGVudW1fcGFyYW1fbGlzdCkpCisKK2VudW1fbWVtYmVyX3BhcmFtX25hbWUgPSBrdygidmlydHVhbCIpCitlbnVtX21lbWJlcl9wYXJhbSA9IFAuR3JvdXAoZW51bV9tZW1iZXJfcGFyYW1fbmFtZSAgLSBzKCc9JykgLSBhbnlfdHlwZSkKK2VudW1fbWVtYmVyX3BhcmFtX2xpc3QgPSBQLkZvcndhcmQoKQorZW51bV9tZW1iZXJfcGFyYW1fbGlzdCA8PCBlbnVtX21lbWJlcl9wYXJhbSArIFAuT3B0aW9uYWwocygnLCcpICsgUC5PcHRpb25hbChlbnVtX21lbWJlcl9wYXJhbV9saXN0KSkKKworZW51bV9tZW1iZXIgPSBQLkdyb3VwKGlkZW50aWZpZXIgLSBQLkdyb3VwKFAuT3B0aW9uYWwocygnKCcpIC0gZW51bV9tZW1iZXJfcGFyYW1fbGlzdCAtIHMoJyknKSkpIC0gcygnPScpICsgaW50ZWdlcikKIGVudW1fbGlzdCA9IFAuRm9yd2FyZCgpCiBlbnVtX2xpc3QgPDwgZW51bV9tZW1iZXIgKyBQLk9wdGlvbmFsKHMoJywnKSArIFAuT3B0aW9uYWwoZW51bV9saXN0KSkKLWVudW0gPSBrdygnZW51bScpIC0gaWRlbnRpZmllciAtIHMoJ3snKSArIFwKK2VudW0gPSBrdygnZW51bScpIC0gaWRlbnRpZmllciAtIFAuR3JvdXAoUC5PcHRpb25hbChzKCcoJykgLSBlbnVtX3BhcmFtX2xpc3QgLSBzKCcpJykpKSAtIHMoJ3snKSArIFwKICAgICAgICAgIFAuR3JvdXAoUC5PcHRpb25hbChlbnVtX2xpc3QpKSArIFwKICAgICAgICAgIHMoJ30nKSAtIHMoJzsnKQogCmRpZmYgLS1naXQgYS9sb3hpX2lyLnB5IGIvbG94aV9pci5weQppbmRleCA4MjQ1MjRiLi5mZWZlNzcwIDEwMDY0NAotLS0gYS9sb3hpX2lyLnB5CisrKyBiL2xveGlfaXIucHkKQEAgLTI1LDYgKzI1LDcgQEAKICMgRVBMIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwogIyB1bmRlciB0aGUgRVBMLgogCitmcm9tIGdlbmVyaWNfdXRpbHMgaW1wb3J0IGZpbmQKIGZyb20gY29sbGVjdGlvbnMgaW1wb3J0IG5hbWVkdHVwbGUKIAogIyBUaGlzIG1vZHVsZSBpcyBpbnRlbmRlZCB0byBiZSBpbXBvcnRlZCBsaWtlIHRoaXM6IGZyb20gbG94aV9pciBpbXBvcnQgKgpAQCAtMzUsMTAgKzM2LDEyIEBACiAgICAgJ09GQ2xhc3MnLAogICAgICdPRkRhdGFNZW1iZXInLAogICAgICdPRlR5cGVNZW1iZXInLAorICAgICdPRkRpc2NyaW1pbmF0b3JNZW1iZXInLAogICAgICdPRkxlbmd0aE1lbWJlcicsCiAgICAgJ09GRmllbGRMZW5ndGhNZW1iZXInLAogICAgICdPRlBhZE1lbWJlcicsCiAgICAgJ09GRW51bScsCisgICAgJ09GRW51bUVudHJ5JwogXQogCiAiIiIKQEAgLTcwLDkgKzczLDEzIEBACiBUaGUgbWVtYmVycyBhcmUgaW4gdGhlIHNhbWUgb3JkZXIgYXMgb24gdGhlIHdpcmUuCiAKIEBwYXJhbSBuYW1lCitAcGFyYW0gc3VwZXJjbGFzcyBuYW1lIG9mIHRoZSBzdXBlciBjbGFzcwogQHBhcmFtIG1lbWJlcnMgTGlzdCBvZiAqTWVtYmVyIG9iamVjdHMKK0BwYXJhbSBwYXJhbXMgb3B0aW9uYWwgZGljdGlvbmFyeSBvZiBwYXJhbWV0ZXJzCiAiIiIKLU9GQ2xhc3MgPSBuYW1lZHR1cGxlKCdPRkNsYXNzJywgWyduYW1lJywgJ3N1cGVyY2xhc3MnLCAnbWVtYmVycyddKQorY2xhc3MgT0ZDbGFzcyhuYW1lZHR1cGxlKCdPRkNsYXNzJywgWyduYW1lJywgJ3N1cGVyY2xhc3MnLCAnbWVtYmVycycsICd2aXJ0dWFsJywgJ3BhcmFtcyddKSk6CisgICAgZGVmIG1lbWJlcl9ieV9uYW1lKHNlbGYsIG5hbWUpOgorICAgICAgICByZXR1cm4gZmluZChzZWxmLm1lbWJlcnMsIGxhbWJkYSBtOiBoYXNhdHRyKG0sICJuYW1lIikgYW5kIG0ubmFtZSA9PSBuYW1lKQogCiAiIiIKIE5vcm1hbCBmaWVsZApAQCAtODUsNiArOTIsMTYgQEAKIE9GRGF0YU1lbWJlciA9IG5hbWVkdHVwbGUoJ09GRGF0YU1lbWJlcicsIFsnbmFtZScsICdvZnR5cGUnXSkKIAogIiIiCitGaWVsZCB0aGF0IGRlY2xhcmVzIHRoYXQgdGhpcyBpcyBhbiBhYnN0cmFjdCBzdXBlci1jbGFzcyBhbmQKK3RoYXQgdGhlIHN1YiBjbGFzc2VzIHdpbGwgYmUgZGlzY3JpbWluYXRlZCBiYXNlZCBvbiB0aGlzIGZpZWxkLgorRS5nLiwgJ3R5cGUnIGlzIHRoZSBkaXNjcmltaW5hdG9yIG1lbWJlciBvZiB0aGUgYWJzdHJhY3Qgc3VwZXJjbGFzcworb2ZfYWN0aW9uLgorCitAcGFyYW0gbmFtZQorIiIiCitPRkRpc2NyaW1pbmF0b3JNZW1iZXIgPSBuYW1lZHR1cGxlKCdPRkRpc2NybWluYXRvck1lbWJlcicsIFsnbmFtZScsICdvZnR5cGUnXSkKKworIiIiCiBGaWVsZCB1c2VkIHRvIGRldGVybWluZSB0aGUgdHlwZSBvZiBhbiBPcGVuRmxvdyBvYmplY3QKIAogQHBhcmFtIG5hbWUKQEAgLTEzMSw2ICsxNDgsMTMgQEAKIEFsbCB2YWx1ZXMgYXJlIFB5dGhvbiBpbnRzLgogCiBAcGFyYW0gbmFtZQotQHBhcmFtIHZhbHVlcyBMaXN0IG9mIChuYW1lLCB2YWx1ZSkgdHVwbGVzIGluIGlucHV0IG9yZGVyCitAcGFyYW0gZW50cmllcyBMaXN0IG9mIE9GRW51bUVudHJ5IG9iamVjdHMgaW4gaW5wdXQgb3JkZXIKK0BwYXJhbXMgZGljdCBvZiBvcHRpb25hbCBwYXJhbXMuIEN1cnJlbnRseSBkZWZpbmVkOgorICAgICAgIC0gd2lyZV90eXBlOiB0aGUgbG93X2xldmVsIHR5cGUgb2YgdGhlIGVudW0gdmFsdWVzICh1aW50OCwuLi4pCiAiIiIKLU9GRW51bSA9IG5hbWVkdHVwbGUoJ09GRW51bScsIFsnbmFtZScsICd2YWx1ZXMnXSkKK2NsYXNzIE9GRW51bShuYW1lZHR1cGxlKCdPRkVudW0nLCBbJ25hbWUnLCAnZW50cmllcycsICdwYXJhbXMnXSkpOgorICAgIEBwcm9wZXJ0eQorICAgIGRlZiB2YWx1ZXMoc2VsZik6CisgICAgICAgIHJldHVybiBbKGUubmFtZSwgZS52YWx1ZSkgZm9yIGUgaW4gc2VsZi5lbnRyaWVzXQorCitPRkVudW1FbnRyeSA9IG5hbWVkdHVwbGUoJ09GRW51bUVudHJ5JywgWyduYW1lJywgJ3ZhbHVlJywgJ3BhcmFtcyddKQpkaWZmIC0tZ2l0IGEvbG94aWdlbi5weSBiL2xveGlnZW4ucHkKaW5kZXggOWJkZGY0Yi4uZGNkNTQ3ZSAxMDA3NTUKLS0tIGEvbG94aWdlbi5weQorKysgYi9sb3hpZ2VuLnB5CkBAIC00NDcsMTAgKzQ0NywxMCBAQAogICAgICAgICAgICAgICAgIHZlcnNpb25zW3ZlcnNpb25fbmFtZV1bJ2NsYXNzZXMnXVtvZmNsYXNzLm5hbWVdID0gbGVnYWN5X21lbWJlcnMKIAogICAgICAgICAgICAgZm9yIGVudW0gaW4gb2ZpbnB1dC5lbnVtczoKLSAgICAgICAgICAgICAgICBmb3IgbmFtZSwgdmFsdWUgaW4gZW51bS52YWx1ZXM6CisgICAgICAgICAgICAgICAgZm9yIGVudHJ5IGluIGVudW0uZW50cmllczoKICAgICAgICAgICAgICAgICAgICAgaWRlbnRpZmllcnMuYWRkX2lkZW50aWZpZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2xhdGlvbi5sb3hpX25hbWUobmFtZSksCi0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCBlbnVtLm5hbWUsIHZhbHVlLCB3aXJlX3ZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2xhdGlvbi5sb3hpX25hbWUoZW50cnkubmFtZSksCisgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5uYW1lLCBlbnVtLm5hbWUsIGVudHJ5LnZhbHVlLCB3aXJlX3ZlcnNpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICBvZl9nLmlkZW50aWZpZXJzLCBvZl9nLmlkZW50aWZpZXJzX2J5X2dyb3VwKQogCiAgICAgICAgIGZvciB3aXJlX3ZlcnNpb24sIG9maW5wdXRzIGluIG9maW5wdXRzX2J5X3ZlcnNpb24uaXRlbXMoKToKZGlmZiAtLWdpdCBhL29wZW5mbG93X2lucHV0L2JzbiBiL29wZW5mbG93X2lucHV0L2JzbgppbmRleCAxNmYzMzIzLi4wYWE2NzRiIDEwMDY0NAotLS0gYS9vcGVuZmxvd19pbnB1dC9ic24KKysrIGIvb3BlbmZsb3dfaW5wdXQvYnNuCkBAIC0zNCw3ICszNCw3IEBACiAgICAgdWludDE2X3QgbGVuZ3RoOwogICAgIHVpbnQzMl90IHhpZDsKICAgICB1aW50MzJfdCBleHBlcmltZW50ZXIgPT0gMHg1YzE2Yzc7Ci0gICAgdWludDMyX3Qgc3VidHlwZTsKKyAgICB1aW50MzJfdCBzdWJ0eXBlID09ID87CiB9OwogCiAvLyBCU04gZXh0ZW5zaW9uIGFjdGlvbgpAQCAtNDIsNyArNDIsNyBAQAogICAgIHVpbnQxNl90IHR5cGUgPT0gNjU1MzU7CiAgICAgdWludDE2X3QgbGVuOwogICAgIHVpbnQzMl90IGV4cGVyaW1lbnRlciA9PSAweDVjMTZjNzsKLSAgICB1aW50MzJfdCBzdWJ0eXBlOworICAgIHVpbnQzMl90IHN1YnR5cGUgPT0gPzsKICAgICBwYWQoNCk7CiB9OwogCmRpZmYgLS1naXQgYS9vcGVuZmxvd19pbnB1dC9ic25fdnBvcnQgYi9vcGVuZmxvd19pbnB1dC9ic25fdnBvcnQKaW5kZXggNGRhNDYzOC4uMDYxOThkZiAxMDA2NDQKLS0tIGEvb3BlbmZsb3dfaW5wdXQvYnNuX3Zwb3J0CisrKyBiL29wZW5mbG93X2lucHV0L2Jzbl92cG9ydApAQCAtMzgsNyArMzgsNyBAQAogLy8gV2hlbiB0aGUgaW5ncmVzcyBvciBlZ3Jlc3MgVklEIGhhcyB0aGlzIHZhbHVlLCBubyBvdXRlciB0YWcgc2hvdWxkIGJlIHVzZWQuCiAvLyBJbiB0aGlzIGNhc2UsIHRoZSBjb3JyZXNwb25kaW5nIFRQSUQgaXMgaWdub3JlZC4KIAotZW51bSBvZnBfYnNuX3Zwb3J0X3FfaW5fcV91bnRhZ2dlZCB7CitlbnVtIG9mcF9ic25fdnBvcnRfcV9pbl9xX3VudGFnZ2VkKHdpcmVfdHlwZT11aW50MTZfdCwgY29tcGxldGU9RmFsc2UpIHsKICAgICBPRl9CU05fVlBPUlRfUV9JTl9RX1VOVEFHR0VEID0gMHhmZmZmLAogfTsKIApkaWZmIC0tZ2l0IGEvb3BlbmZsb3dfaW5wdXQvbmljaXJhIGIvb3BlbmZsb3dfaW5wdXQvbmljaXJhCmluZGV4IGY3NmJlMjcuLmJhMjA0OGQgMTAwNjQ0Ci0tLSBhL29wZW5mbG93X2lucHV0L25pY2lyYQorKysgYi9vcGVuZmxvd19pbnB1dC9uaWNpcmEKQEAgLTM0LDcgKzM0LDcgQEAKICAgICB1aW50MTZfdCBsZW5ndGg7CiAgICAgdWludDMyX3QgeGlkOwogICAgIHVpbnQzMl90IGV4cGVyaW1lbnRlciA9PSAweDIzMjA7Ci0gICAgdWludDMyX3Qgc3VidHlwZTsKKyAgICB1aW50MzJfdCBzdWJ0eXBlID09ID87CiB9OwogCiAvLyBOaWNpcmEgZXh0ZW5zaW9uIGFjdGlvbgpAQCAtNDIsNyArNDIsNyBAQAogICAgIHVpbnQxNl90IHR5cGUgPT0gNjU1MzU7CiAgICAgdWludDE2X3QgbGVuOwogICAgIHVpbnQzMl90IGV4cGVyaW1lbnRlciA9PSAweDIzMjA7Ci0gICAgdWludDE2X3Qgc3VidHlwZTsKKyAgICB1aW50MTZfdCBzdWJ0eXBlID09ID87CiAgICAgcGFkKDIpOwogICAgIHBhZCg0KTsKIH07CmRpZmYgLS1naXQgYS9vcGVuZmxvd19pbnB1dC9veG0tMS4yIGIvb3BlbmZsb3dfaW5wdXQvb3htLTEuMgppbmRleCBlNzVkMjE4Li41MDA2Y2ZmIDEwMDY0NAotLS0gYS9vcGVuZmxvd19pbnB1dC9veG0tMS4yCisrKyBiL29wZW5mbG93X2lucHV0L294bS0xLjIKQEAgLTMzLDcgKzMzLDcgQEAKICN2ZXJzaW9uIDQKIAogc3RydWN0IG9mX294bSB7Ci0gICAgdWludDMyX3QgdHlwZV9sZW47CisgICAgdWludDMyX3QgdHlwZV9sZW4gPT0gPzsKIH07CiAKIHN0cnVjdCBvZl9veG1fYXJwX29wIDogb2Zfb3htIHsKZGlmZiAtLWdpdCBhL29wZW5mbG93X2lucHV0L3N0YW5kYXJkLTEuMCBiL29wZW5mbG93X2lucHV0L3N0YW5kYXJkLTEuMAppbmRleCA2NGM2MGQ1Li5kNzhkNWJkIDEwMDY0NAotLS0gYS9vcGVuZmxvd19pbnB1dC9zdGFuZGFyZC0xLjAKKysrIGIvb3BlbmZsb3dfaW5wdXQvc3RhbmRhcmQtMS4wCkBAIC02MSw3ICs2MSw3IEBACiAgICAgT0ZQUV9NSU5fUkFURV9VTkNGRyA9IDB4ZmZmZiwKIH07CiAKLWVudW0gb2ZwX3R5cGUgeworZW51bSBvZnBfdHlwZSh3aXJlX3R5cGU9dWludDhfdCkgewogICAgIE9GUFRfSEVMTE8gPSAwLAogICAgIE9GUFRfRVJST1IgPSAxLAogICAgIE9GUFRfRUNIT19SRVFVRVNUID0gMiwKQEAgLTg2LDcgKzg2LDcgQEAKICAgICBPRlBUX1FVRVVFX0dFVF9DT05GSUdfUkVQTFkgPSAyMSwKIH07CiAKLWVudW0gb2ZwX3BvcnRfY29uZmlnIHsKK2VudW0gb2ZwX3BvcnRfY29uZmlnKHdpcmVfdHlwZT11aW50MzJfdCwgYml0bWFzaz1UcnVlKSB7CiAgICAgT0ZQUENfUE9SVF9ET1dOID0gMHgxLAogICAgIE9GUFBDX05PX1NUUCA9IDB4MiwKICAgICBPRlBQQ19OT19SRUNWID0gMHg0LApAQCAtOTYsMTYgKzk2LDE5IEBACiAgICAgT0ZQUENfTk9fUEFDS0VUX0lOID0gMHg0MCwKIH07CiAKLWVudW0gb2ZwX3BvcnRfc3RhdGUgeworZW51bSBvZnBfcG9ydF9zdGF0ZSh3aXJlX3R5cGU9dWludDMyX3QsIGJpdG1hc2s9VHJ1ZSkgewogICAgIE9GUFBTX1NUUF9MSVNURU4gPSAwLAogICAgIE9GUFBTX0xJTktfRE9XTiA9IDEsCiAgICAgT0ZQUFNfU1RQX0xFQVJOID0gMHgxMDAsCiAgICAgT0ZQUFNfU1RQX0ZPUldBUkQgPSAweDIwMCwKICAgICBPRlBQU19TVFBfQkxPQ0sgPSAweDMwMCwKLSAgICBPRlBQU19TVFBfTUFTSyA9IDB4MzAwLAorICAgIE9GUFBTX1NUUF9NQVNLKHZpcnR1YWw9VHJ1ZSkgPSAweDMwMCwKIH07CiAKLWVudW0gb2ZwX3BvcnQgeworLy8gRklYTUU6IHRoZXNlIGNvbnN0YW50cyBhcmUgY3VycmVudGx5IDMyIGJpdCBkdWUgdG8gaW1wbGVtZW50YXRpb24KKy8vIGRldGFpbHMgb2YgbG9jaSwgd2hpY2ggaXMgaW4gdmlvbGF0aW9uIG9mIHRoZSBPcGVuRmxvdyBzcGVjLgorLy8gU2hvdWxkIHJlY2FzdCB0byAzMiBiaXRzIGFuZCBmaXgvZ2x1ZSB0aGUgYyBiYWNrZW5kCitlbnVtIG9mcF9wb3J0KHdpcmVfdHlwZT11aW50MTZfdCwgY29tcGxldGU9RmFsc2UpIHsKICAgICBPRlBQX01BWCA9IDB4ZmZmZmZmMDAsCiAgICAgT0ZQUF9JTl9QT1JUID0gMHhmZmZmZmZmOCwKICAgICBPRlBQX1RBQkxFID0gMHhmZmZmZmZmOSwKQEAgLTExNyw3ICsxMjAsNyBAQAogICAgIE9GUFBfTk9ORSA9IDB4ZmZmZmZmZmYsCiB9OwogCi1lbnVtIG9mcF9wb3J0X2ZlYXR1cmVzIHsKK2VudW0gb2ZwX3BvcnRfZmVhdHVyZXMod2lyZV90eXBlPXVpbnQzMl90LCBiaXRtYXNrPVRydWUpIHsKICAgICBPRlBQRl8xME1CX0hEID0gMHgxLAogICAgIE9GUFBGXzEwTUJfRkQgPSAweDIsCiAgICAgT0ZQUEZfMTAwTUJfSEQgPSAweDQsCkBAIC0xMzIsMTIgKzEzNSwxMiBAQAogICAgIE9GUFBGX1BBVVNFX0FTWU0gPSAweDgwMCwKIH07CiAKLWVudW0gb2ZwX3F1ZXVlX3Byb3BlcnRpZXMgeworZW51bSBvZnBfcXVldWVfcHJvcGVydGllcyh3aXJlX3R5cGU9dWludDMyX3QpIHsKICAgICBPRlBRVF9OT05FID0gMCwKICAgICBPRlBRVF9NSU5fUkFURSA9IDEsCiB9OwogCi1lbnVtIG9mcF9mbG93X3dpbGRjYXJkcyB7CitlbnVtIG9mcF9mbG93X3dpbGRjYXJkcyh3aXJlX3R5cGU9dWludDMyX3QsIGJpdG1hc2s9VHJ1ZSkgewogICAgIE9GUEZXX0lOX1BPUlQgPSAweDEsCiAgICAgT0ZQRldfRExfVkxBTiA9IDB4MiwKICAgICBPRlBGV19ETF9TUkMgPSAweDQsCkBAIC0xNTksNyArMTYyLDcgQEAKICAgICBPRlBGV19BTEwgPSAweDNmZmZmZiwKIH07CiAKLWVudW0gb2ZwX2FjdGlvbl90eXBlIHsKK2VudW0gb2ZwX2FjdGlvbl90eXBlKHdpcmVfdHlwZT11aW50MTZfdCkgewogICAgIE9GUEFUX09VVFBVVCA9IDAsCiAgICAgT0ZQQVRfU0VUX1ZMQU5fVklEID0gMSwKICAgICBPRlBBVF9TRVRfVkxBTl9QQ1AgPSAyLApAQCAtMTc1LDcgKzE3OCw3IEBACiAgICAgT0ZQQVRfVkVORE9SID0gMHhmZmZmLAogfTsKIAotZW51bSBvZnBfY2FwYWJpbGl0aWVzIHsKK2VudW0gb2ZwX2NhcGFiaWxpdGllcyh3aXJlX3R5cGU9dWludDMyX3QsIGJpdG1hc2s9VHJ1ZSkgewogICAgIE9GUENfRkxPV19TVEFUUyA9IDB4MSwKICAgICBPRlBDX1RBQkxFX1NUQVRTID0gMHgyLAogICAgIE9GUENfUE9SVF9TVEFUUyA9IDB4NCwKQEAgLTE4NiwxNCArMTg5LDE0IEBACiAgICAgT0ZQQ19BUlBfTUFUQ0hfSVAgPSAweDgwLAogfTsKIAotZW51bSBvZnBfY29uZmlnX2ZsYWdzIHsKK2VudW0gb2ZwX2NvbmZpZ19mbGFncyh3aXJlX3R5cGU9dWludDMyX3QsIGJpdG1hc2s9VHJ1ZSkgewogICAgIE9GUENfRlJBR19OT1JNQUwgPSAweDAsCiAgICAgT0ZQQ19GUkFHX0RST1AgPSAweDEsCiAgICAgT0ZQQ19GUkFHX1JFQVNNID0gMHgyLAogICAgIE9GUENfRlJBR19NQVNLID0gMHgzLAogfTsKIAotZW51bSBvZnBfZmxvd19tb2RfY29tbWFuZCB7CitlbnVtIG9mcF9mbG93X21vZF9jb21tYW5kKHdpcmVfdHlwZT11aW50MTZfdCkgewogICAgIE9GUEZDX0FERCA9IDAsCiAgICAgT0ZQRkNfTU9ESUZZID0gMSwKICAgICBPRlBGQ19NT0RJRllfU1RSSUNUID0gMiwKQEAgLTIwMSwxNyArMjA0LDE3IEBACiAgICAgT0ZQRkNfREVMRVRFX1NUUklDVCA9IDQsCiB9OwogCi1lbnVtIG9mcF9mbG93X21vZF9mbGFncyB7CitlbnVtIG9mcF9mbG93X21vZF9mbGFncyh3aXJlX3R5cGU9dWludDE2X3QsIGJpdG1hc2s9VHJ1ZSkgewogICAgIE9GUEZGX1NFTkRfRkxPV19SRU0gPSAweDEsCiAgICAgT0ZQRkZfQ0hFQ0tfT1ZFUkxBUCA9IDB4MiwKICAgICBPRlBGRl9FTUVSRyA9IDB4NCwKIH07CiAKLWVudW0gb2ZwX3N0YXRzX3JlcGx5X2ZsYWdzIHsKK2VudW0gb2ZwX3N0YXRzX3JlcGx5X2ZsYWdzKHdpcmVfdHlwZT11aW50MTZfdCwgYml0bWFzaz1UcnVlKSB7CiAgICAgT0ZQU0ZfUkVQTFlfTU9SRSA9IDB4MSwKIH07CiAKLWVudW0gb2ZwX3N0YXRzX3R5cGVzIHsKK2VudW0gb2ZwX3N0YXRzX3R5cGVzKHdpcmVfdHlwZT11aW50MTZfdCkgewogICAgIE9GUFNUX0RFU0MgPSAwLAogICAgIE9GUFNUX0ZMT1cgPSAxLAogICAgIE9GUFNUX0FHR1JFR0FURSA9IDIsCkBAIC0yMjEsMjQgKzIyNCwyNCBAQAogICAgIE9GUFNUX1ZFTkRPUiA9IDB4ZmZmZiwKIH07CiAKLWVudW0gb2ZwX3BhY2tldF9pbl9yZWFzb24geworZW51bSBvZnBfcGFja2V0X2luX3JlYXNvbih3aXJlX3R5cGU9dWludDhfdCkgewogICAgIE9GUFJfTk9fTUFUQ0ggPSAwLAogICAgIE9GUFJfQUNUSU9OID0gMSwKIH07CiAKLWVudW0gb2ZwX2Zsb3dfcmVtb3ZlZF9yZWFzb24geworZW51bSBvZnBfZmxvd19yZW1vdmVkX3JlYXNvbih3aXJlX3R5cGU9dWludDhfdCkgewogICAgIE9GUFJSX0lETEVfVElNRU9VVCA9IDAsCiAgICAgT0ZQUlJfSEFSRF9USU1FT1VUID0gMSwKICAgICBPRlBSUl9ERUxFVEUgPSAyLAogfTsKIAotZW51bSBvZnBfcG9ydF9yZWFzb24geworZW51bSBvZnBfcG9ydF9yZWFzb24od2lyZV90eXBlPXVpbnQ4X3QpIHsKICAgICBPRlBQUl9BREQgPSAwLAogICAgIE9GUFBSX0RFTEVURSA9IDEsCiAgICAgT0ZQUFJfTU9ESUZZID0gMiwKIH07CiAKLWVudW0gb2ZwX2Vycm9yX3R5cGUgeworZW51bSBvZnBfZXJyb3JfdHlwZSh3aXJlX3R5cGU9dWludDE2X3QpIHsKICAgICBPRlBFVF9IRUxMT19GQUlMRUQgPSAwLAogICAgIE9GUEVUX0JBRF9SRVFVRVNUID0gMSwKICAgICBPRlBFVF9CQURfQUNUSU9OID0gMiwKQEAgLTI0NywxMiArMjUwLDEyIEBACiAgICAgT0ZQRVRfUVVFVUVfT1BfRkFJTEVEID0gNSwKIH07CiAKLWVudW0gb2ZwX2hlbGxvX2ZhaWxlZF9jb2RlIHsKK2VudW0gb2ZwX2hlbGxvX2ZhaWxlZF9jb2RlKHdpcmVfdHlwZT11aW50MTZfdCkgewogICAgIE9GUEhGQ19JTkNPTVBBVElCTEUgPSAwLAogICAgIE9GUEhGQ19FUEVSTSA9IDEsCiB9OwogCi1lbnVtIG9mcF9iYWRfcmVxdWVzdF9jb2RlIHsKK2VudW0gb2ZwX2JhZF9yZXF1ZXN0X2NvZGUod2lyZV90eXBlPXVpbnQxNl90KSB7CiAgICAgT0ZQQlJDX0JBRF9WRVJTSU9OID0gMCwKICAgICBPRlBCUkNfQkFEX1RZUEUgPSAxLAogICAgIE9GUEJSQ19CQURfU1RBVCA9IDIsCkBAIC0yNjQsNyArMjY3LDcgQEAKICAgICBPRlBCUkNfQlVGRkVSX1VOS05PV04gPSA4LAogfTsKIAotZW51bSBvZnBfYmFkX2FjdGlvbl9jb2RlIHsKK2VudW0gb2ZwX2JhZF9hY3Rpb25fY29kZSh3aXJlX3R5cGU9dWludDE2X3QpIHsKICAgICBPRlBCQUNfQkFEX1RZUEUgPSAwLAogICAgIE9GUEJBQ19CQURfTEVOID0gMSwKICAgICBPRlBCQUNfQkFEX1ZFTkRPUiA9IDIsCkBAIC0yNzYsNyArMjc5LDcgQEAKICAgICBPRlBCQUNfQkFEX1FVRVVFID0gOCwKIH07CiAKLWVudW0gb2ZwX2Zsb3dfbW9kX2ZhaWxlZF9jb2RlIHsKK2VudW0gb2ZwX2Zsb3dfbW9kX2ZhaWxlZF9jb2RlKHdpcmVfdHlwZT11aW50MTZfdCkgewogICAgIE9GUEZNRkNfQUxMX1RBQkxFU19GVUxMID0gMCwKICAgICBPRlBGTUZDX09WRVJMQVAgPSAxLAogICAgIE9GUEZNRkNfRVBFUk0gPSAyLApAQCAtMjg1LDEyICsyODgsMTIgQEAKICAgICBPRlBGTUZDX1VOU1VQUE9SVEVEID0gNSwKIH07CiAKLWVudW0gb2ZwX3BvcnRfbW9kX2ZhaWxlZF9jb2RlIHsKK2VudW0gb2ZwX3BvcnRfbW9kX2ZhaWxlZF9jb2RlKHdpcmVfdHlwZT11aW50MTZfdCkgewogICAgIE9GUFBNRkNfQkFEX1BPUlQgPSAwLAogICAgIE9GUFBNRkNfQkFEX0hXX0FERFIgPSAxLAogfTsKIAotZW51bSBvZnBfcXVldWVfb3BfZmFpbGVkX2NvZGUgeworZW51bSBvZnBfcXVldWVfb3BfZmFpbGVkX2NvZGUod2lyZV90eXBlPXVpbnQxNl90KSB7CiAgICAgT0ZQUU9GQ19CQURfUE9SVCA9IDAsCiAgICAgT0ZQUU9GQ19CQURfUVVFVUUgPSAxLAogICAgIE9GUFFPRkNfRVBFUk0gPSAyLApAQCAtMjk5LDcgKzMwMiw3IEBACiAvKiBYWFggcmVuYW1lIHRvIG9mX21lc3NhZ2UgKi8KIHN0cnVjdCBvZl9oZWFkZXIgewogICAgIHVpbnQ4X3QgdmVyc2lvbjsKLSAgICB1aW50OF90IHR5cGU7CisgICAgdWludDhfdCB0eXBlID09ID87CiAgICAgdWludDE2X3QgbGVuZ3RoOwogICAgIHVpbnQzMl90IHhpZDsKIH07CkBAIC01MzUsNyArNTM4LDcgQEAKIH07CiAKIHN0cnVjdCBvZl9hY3Rpb24gewotICAgIHVpbnQxNl90IHR5cGU7CisgICAgdWludDE2X3QgdHlwZSA9PSA/OwogICAgIHVpbnQxNl90IGxlbjsKICAgICBwYWQoNCk7CiB9OwpAQCAtNTc3LDcgKzU4MCw3IEBACiAgICAgdWludDMyX3QgeGlkOwogICAgIG9mX21hdGNoX3QgbWF0Y2g7CiAgICAgdWludDY0X3QgY29va2llOwotICAgIG9mX2ZtX2NtZF90IF9jb21tYW5kOworICAgIG9mX2ZtX2NtZF90IF9jb21tYW5kID09ID87CiAgICAgdWludDE2X3QgaWRsZV90aW1lb3V0OwogICAgIHVpbnQxNl90IGhhcmRfdGltZW91dDsKICAgICB1aW50MTZfdCBwcmlvcml0eTsKQEAgLTc2Miw3ICs3NjUsNyBAQAogICAgIHVpbnQ4X3QgdHlwZSA9PSAxNjsKICAgICB1aW50MTZfdCBsZW5ndGg7CiAgICAgdWludDMyX3QgeGlkOwotICAgIHVpbnQxNl90IHN0YXRzX3R5cGU7CisgICAgdWludDE2X3Qgc3RhdHNfdHlwZSA9PSA/OwogICAgIHVpbnQxNl90IGZsYWdzOwogfTsKIApAQCAtNzcxLDcgKzc3NCw3IEBACiAgICAgdWludDhfdCB0eXBlID09IDE3OwogICAgIHVpbnQxNl90IGxlbmd0aDsKICAgICB1aW50MzJfdCB4aWQ7Ci0gICAgdWludDE2X3Qgc3RhdHNfdHlwZTsKKyAgICB1aW50MTZfdCBzdGF0c190eXBlID09ID87CiAgICAgdWludDE2X3QgZmxhZ3M7CiB9OwogCkBAIC05MzQsNyArOTM3LDcgQEAKIC8vIEVORCBPRiBTVEFUUyBPQkpFQ1RTCiAKIHN0cnVjdCBvZl9xdWV1ZV9wcm9wIHsKLSAgICB1aW50MTZfdCB0eXBlOworICAgIHVpbnQxNl90IHR5cGUgPT0gPzsKICAgICB1aW50MTZfdCBsZW47CiAgICAgcGFkKDQpOwogfTsKZGlmZiAtLWdpdCBhL29wZW5mbG93X2lucHV0L3N0YW5kYXJkLTEuMSBiL29wZW5mbG93X2lucHV0L3N0YW5kYXJkLTEuMQppbmRleCA0MzY2YWY4Li45YmY0NmJkIDEwMDY0NAotLS0gYS9vcGVuZmxvd19pbnB1dC9zdGFuZGFyZC0xLjEKKysrIGIvb3BlbmZsb3dfaW5wdXQvc3RhbmRhcmQtMS4xCkBAIC02Myw3ICs2Myw3IEBACiAgICAgT0ZQUV9NSU5fUkFURV9VTkNGRyA9IDB4ZmZmZiwKIH07CiAKLWVudW0gb2ZwX3BvcnQgeworZW51bSBvZnBfcG9ydCh3aXJlX3R5cGU9dWludDMyX3QpIHsKICAgICBPRlBQX01BWCA9IDB4ZmZmZmZmMDAsCiAgICAgT0ZQUF9JTl9QT1JUID0gMHhmZmZmZmZmOCwKICAgICBPRlBQX1RBQkxFID0gMHhmZmZmZmZmOSwKQEAgLTc0LDExICs3NCwxMSBAQAogICAgIE9GUFBfTE9DQUwgPSAweGZmZmZmZmZlLAogfTsKIAotZW51bSBvZnBfcG9ydF9ubyB7CitlbnVtIG9mcF9wb3J0X25vKHdpcmVfdHlwZT11aW50MzJfdCwgY29tcGxldGU9bm8pIHsKICAgICBPRlBQX0FOWSA9IDB4ZmZmZmZmZmYsCiB9OwogCi1lbnVtIG9mcF90eXBlIHsKK2VudW0gb2ZwX3R5cGUod2lyZV90eXBlPXVpbnQ4X3QpIHsKICAgICBPRlBUX0hFTExPID0gMCwKICAgICBPRlBUX0VSUk9SID0gMSwKICAgICBPRlBUX0VDSE9fUkVRVUVTVCA9IDIsCkBAIC0xMDUsMjIgKzEwNSwyMiBAQAogICAgIE9GUFRfUVVFVUVfR0VUX0NPTkZJR19SRVBMWSA9IDIzLAogfTsKIAotZW51bSBvZnBfY29uZmlnX2ZsYWdzIHsKK2VudW0gb2ZwX2NvbmZpZ19mbGFncyh3aXJlX3R5cGU9dWludDE2X3QsIGJpdG1hc2s9VHJ1ZSkgewogICAgIE9GUENfRlJBR19OT1JNQUwgPSAwLAogICAgIE9GUENfRlJBR19EUk9QID0gMSwKICAgICBPRlBDX0ZSQUdfUkVBU00gPSAyLAotICAgIE9GUENfRlJBR19NQVNLID0gMywKKyAgICBPRlBDX0ZSQUdfTUFTSyh2aXJ0dWFsPVRydWUpID0gMywKICAgICBPRlBDX0lOVkFMSURfVFRMX1RPX0NPTlRST0xMRVIgPSA0LAogfTsKIAotZW51bSBvZnBfdGFibGVfY29uZmlnIHsKK2VudW0gb2ZwX3RhYmxlX2NvbmZpZyh3aXJlX3R5cGU9dWludDMyX3QsIGJpdG1hc2s9VHJ1ZSkgewogICAgIE9GUFRDX1RBQkxFX01JU1NfQ09OVFJPTExFUiA9IDAsCiAgICAgT0ZQVENfVEFCTEVfTUlTU19DT05USU5VRSA9IDEsCiAgICAgT0ZQVENfVEFCTEVfTUlTU19EUk9QID0gMiwKLSAgICBPRlBUQ19UQUJMRV9NSVNTX01BU0sgPSAzLAorICAgIE9GUFRDX1RBQkxFX01JU1NfTUFTSyh2aXJ0dWFsPVRydWUpID0gMywKIH07CiAKLWVudW0gb2ZwX2NhcGFiaWxpdGllcyB7CitlbnVtIG9mcF9jYXBhYmlsaXRpZXMod2lyZV90eXBlPXVpbnQzMl90LCBiaXRtYXNrPVRydWUpIHsKICAgICBPRlBDX0ZMT1dfU1RBVFMgPSAweDEsCiAgICAgT0ZQQ19UQUJMRV9TVEFUUyA9IDB4MiwKICAgICBPRlBDX1BPUlRfU1RBVFMgPSAweDQsCkBAIC0xMzAsMjAgKzEzMCwyMCBAQAogICAgIE9GUENfQVJQX01BVENIX0lQID0gMHg4MCwKIH07CiAKLWVudW0gb2ZwX3BvcnRfY29uZmlnIHsKK2VudW0gb2ZwX3BvcnRfY29uZmlnKHdpcmVfdHlwZT11aW50MzJfdCwgYml0bWFzaz1UcnVlKSB7CiAgICAgT0ZQUENfUE9SVF9ET1dOID0gMHgxLAogICAgIE9GUFBDX05PX1JFQ1YgPSAweDQsCiAgICAgT0ZQUENfTk9fRldEID0gMHgyMCwKICAgICBPRlBQQ19OT19QQUNLRVRfSU4gPSAweDQwLAogfTsKIAotZW51bSBvZnBfcG9ydF9zdGF0ZSB7CitlbnVtIG9mcF9wb3J0X3N0YXRlKHdpcmVfdHlwZT11aW50MzJfdCwgYml0bWFzaz1UcnVlKSB7CiAgICAgT0ZQUFNfTElOS19ET1dOID0gMHgxLAogICAgIE9GUFBTX0JMT0NLRUQgPSAweDIsCiAgICAgT0ZQUFNfTElWRSA9IDB4NCwKIH07CiAKLWVudW0gb2ZwX3BvcnRfZmVhdHVyZXMgeworZW51bSBvZnBfcG9ydF9mZWF0dXJlcyh3aXJlX3R5cGU9dWludDMyX3QsIGJpdG1hc2s9VHJ1ZSkgewogICAgIE9GUFBGXzEwTUJfSEQgPSAweDEsCiAgICAgT0ZQUEZfMTBNQl9GRCA9IDB4MiwKICAgICBPRlBQRl8xMDBNQl9IRCA9IDB4NCwKQEAgLTE2MiwxOCArMTYyLDE4IEBACiAgICAgT0ZQUEZfUEFVU0VfQVNZTSA9IDB4ODAwMCwKIH07CiAKLWVudW0gb2ZwX3BvcnRfcmVhc29uIHsKK2VudW0gb2ZwX3BvcnRfcmVhc29uKHdpcmVfdHlwZT11aW50OF90KSB7CiAgICAgT0ZQUFJfQUREID0gMCwKICAgICBPRlBQUl9ERUxFVEUgPSAxLAogICAgIE9GUFBSX01PRElGWSA9IDIsCiB9OwogCi1lbnVtIG9mcF9wYWNrZXRfaW5fcmVhc29uIHsKK2VudW0gb2ZwX3BhY2tldF9pbl9yZWFzb24od2lyZV90eXBlPXVpbnQ4X3QpIHsKICAgICBPRlBSX05PX01BVENIID0gMCwKICAgICBPRlBSX0FDVElPTiA9IDEsCiB9OwogCi1lbnVtIG9mcF9hY3Rpb25fdHlwZSB7CitlbnVtIG9mcF9hY3Rpb25fdHlwZSh3aXJlX3R5cGU9dWludDE2X3QpIHsKICAgICBPRlBBVF9PVVRQVVQgPSAwLAogICAgIE9GUEFUX1NFVF9WTEFOX1ZJRCA9IDEsCiAgICAgT0ZQQVRfU0VUX1ZMQU5fUENQID0gMiwKQEAgLTIwMiw3ICsyMDIsNyBAQAogICAgIE9GUEFUX0VYUEVSSU1FTlRFUiA9IDB4ZmZmZiwKIH07CiAKLWVudW0gb2ZwX2Zsb3dfbW9kX2NvbW1hbmQgeworZW51bSBvZnBfZmxvd19tb2RfY29tbWFuZCh3aXJlX3R5cGU9dWludDhfdCkgewogICAgIE9GUEZDX0FERCA9IDAsCiAgICAgT0ZQRkNfTU9ESUZZID0gMSwKICAgICBPRlBGQ19NT0RJRllfU1RSSUNUID0gMiwKQEAgLTIxMCwxMyArMjEwLDEzIEBACiAgICAgT0ZQRkNfREVMRVRFX1NUUklDVCA9IDQsCiB9OwogCi1lbnVtIG9mcF9ncm91cF9tb2RfY29tbWFuZCB7CitlbnVtIG9mcF9ncm91cF9tb2RfY29tbWFuZCh3aXJlX3R5cGU9dWludDE2X3QpIHsKICAgICBPRlBHQ19BREQgPSAwLAogICAgIE9GUEdDX01PRElGWSA9IDEsCiAgICAgT0ZQR0NfREVMRVRFID0gMiwKIH07CiAKLWVudW0gb2ZwX2Zsb3dfd2lsZGNhcmRzIHsKK2VudW0gb2ZwX2Zsb3dfd2lsZGNhcmRzKHdpcmVfdHlwZT11aW50MzJfdCwgYml0bWFzaz1UcnVlKSB7CiAgICAgT0ZQRldfSU5fUE9SVCA9IDB4MSwKICAgICBPRlBGV19ETF9WTEFOID0gMHgyLAogICAgIE9GUEZXX0RMX1ZMQU5fUENQID0gMHg0LApAQCAtMjI3LDE5ICsyMjcsMTkgQEAKICAgICBPRlBGV19UUF9EU1QgPSAweDgwLAogICAgIE9GUEZXX01QTFNfTEFCRUwgPSAweDEwMCwKICAgICBPRlBGV19NUExTX1RDID0gMHgyMDAsCi0gICAgT0ZQRldfQUxMID0gMHgzZmYsCisgICAgT0ZQRldfQUxMKHZpcnR1YWw9VHJ1ZSkgPSAweDNmZiwKIH07CiAKLWVudW0gb2ZwX3ZsYW5faWQgeworZW51bSBvZnBfdmxhbl9pZCh3aXJlX3R5cGU9dWludDE2X3QpIHsKICAgICBPRlBWSURfQU5ZID0gMHhmZmZlLAogICAgIE9GUFZJRF9OT05FID0gMHhmZmZmLAogfTsKIAotZW51bSBvZnBfbWF0Y2hfdHlwZSB7CitlbnVtIG9mcF9tYXRjaF90eXBlKHdpcmVfdHlwZT11aW50MTZfdCkgewogICAgIE9GUE1UX1NUQU5EQVJEID0gMCwKIH07CiAKLWVudW0gb2ZwX2luc3RydWN0aW9uX3R5cGUgeworZW51bSBvZnBfaW5zdHJ1Y3Rpb25fdHlwZSh3aXJlX3R5cGU9dWludDE2X3QsIGJpdG1hc2s9VHJ1ZSkgewogICAgIE9GUElUX0dPVE9fVEFCTEUgPSAweDEsCiAgICAgT0ZQSVRfV1JJVEVfTUVUQURBVEEgPSAweDIsCiAgICAgT0ZQSVRfV1JJVEVfQUNUSU9OUyA9IDB4MywKQEAgLTI0OCwzMiArMjQ4LDMyIEBACiAgICAgT0ZQSVRfRVhQRVJJTUVOVEVSID0gMHhmZmZmLAogfTsKIAotZW51bSBvZnBfZmxvd19tb2RfZmxhZ3MgeworZW51bSBvZnBfZmxvd19tb2RfZmxhZ3Mod2lyZV90eXBlPXVpbnQxNl90LCBiaXRtYXNrPVRydWUpIHsKICAgICBPRlBGRl9TRU5EX0ZMT1dfUkVNID0gMHgxLAogICAgIE9GUEZGX0NIRUNLX09WRVJMQVAgPSAweDIsCiB9OwogCi1lbnVtIG9mcF9ncm91cCB7CitlbnVtIG9mcF9ncm91cCh3aXJlX3R5cGU9dWludDMyX3QsIGNvbXBsZXRlPUZhbHNlKSB7CiAgICAgT0ZQR19NQVggPSAweGZmZmZmZjAwLAogICAgIE9GUEdfQUxMID0gMHhmZmZmZmZmYywKICAgICBPRlBHX0FOWSA9IDB4ZmZmZmZmZmYsCiB9OwogCi1lbnVtIG9mcF9ncm91cF90eXBlIHsKK2VudW0gb2ZwX2dyb3VwX3R5cGUod2lyZV90eXBlPXVpbnQ4X3QpIHsKICAgICBPRlBHVF9BTEwgPSAwLAogICAgIE9GUEdUX1NFTEVDVCA9IDEsCiAgICAgT0ZQR1RfSU5ESVJFQ1QgPSAyLAogICAgIE9GUEdUX0ZGID0gMywKIH07CiAKLWVudW0gb2ZwX2Zsb3dfcmVtb3ZlZF9yZWFzb24geworZW51bSBvZnBfZmxvd19yZW1vdmVkX3JlYXNvbih3aXJlX3R5cGU9dWludDhfdCkgewogICAgIE9GUFJSX0lETEVfVElNRU9VVCA9IDAsCiAgICAgT0ZQUlJfSEFSRF9USU1FT1VUID0gMSwKICAgICBPRlBSUl9ERUxFVEUgPSAyLAogICAgIE9GUFJSX0dST1VQX0RFTEVURSA9IDMsCiB9OwogCi1lbnVtIG9mcF9lcnJvcl90eXBlIHsKK2VudW0gb2ZwX2Vycm9yX3R5cGUod2lyZV90eXBlPXVpbnQxNl90KSB7CiAgICAgT0ZQRVRfSEVMTE9fRkFJTEVEID0gMCwKICAgICBPRlBFVF9CQURfUkVRVUVTVCA9IDEsCiAgICAgT0ZQRVRfQkFEX0FDVElPTiA9IDIsCkBAIC0yODcsMTIgKzI4NywxMiBAQAogICAgIE9GUEVUX1NXSVRDSF9DT05GSUdfRkFJTEVEID0gMTAsCiB9OwogCi1lbnVtIG9mcF9oZWxsb19mYWlsZWRfY29kZSB7CitlbnVtIG9mcF9oZWxsb19mYWlsZWRfY29kZSh3aXJlX3R5cGU9dWludDE2X3QpIHsKICAgICBPRlBIRkNfSU5DT01QQVRJQkxFID0gMCwKICAgICBPRlBIRkNfRVBFUk0gPSAxLAogfTsKIAotZW51bSBvZnBfYmFkX3JlcXVlc3RfY29kZSB7CitlbnVtIG9mcF9iYWRfcmVxdWVzdF9jb2RlKHdpcmVfdHlwZT11aW50MTZfdCkgewogICAgIE9GUEJSQ19CQURfVkVSU0lPTiA9IDAsCiAgICAgT0ZQQlJDX0JBRF9UWVBFID0gMSwKICAgICBPRlBCUkNfQkFEX1NUQVQgPSAyLApAQCAtMzA1LDcgKzMwNSw3IEBACiAgICAgT0ZQQlJDX0JBRF9UQUJMRV9JRCA9IDksCiB9OwogCi1lbnVtIG9mcF9iYWRfYWN0aW9uX2NvZGUgeworZW51bSBvZnBfYmFkX2FjdGlvbl9jb2RlKHdpcmVfdHlwZT11aW50MTZfdCkgewogICAgIE9GUEJBQ19CQURfVFlQRSA9IDAsCiAgICAgT0ZQQkFDX0JBRF9MRU4gPSAxLAogICAgIE9GUEJBQ19CQURfRVhQRVJJTUVOVEVSID0gMiwKQEAgLTMyMSw3ICszMjEsNyBAQAogICAgIE9GUEJBQ19CQURfVEFHID0gMTIsCiB9OwogCi1lbnVtIG9mcF9iYWRfaW5zdHJ1Y3Rpb25fY29kZSB7CitlbnVtIG9mcF9iYWRfaW5zdHJ1Y3Rpb25fY29kZSh3aXJlX3R5cGU9dWludDE2X3QpIHsKICAgICBPRlBCSUNfVU5LTk9XTl9JTlNUID0gMCwKICAgICBPRlBCSUNfVU5TVVBfSU5TVCA9IDEsCiAgICAgT0ZQQklDX0JBRF9UQUJMRV9JRCA9IDIsCkBAIC0zMzAsNyArMzMwLDcgQEAKICAgICBPRlBCSUNfVU5TVVBfRVhQX0lOU1QgPSA1LAogfTsKIAotZW51bSBvZnBfYmFkX21hdGNoX2NvZGUgeworZW51bSBvZnBfYmFkX21hdGNoX2NvZGUod2lyZV90eXBlPXVpbnQxNl90KSB7CiAgICAgT0ZQQk1DX0JBRF9UWVBFID0gMCwKICAgICBPRlBCTUNfQkFEX0xFTiA9IDEsCiAgICAgT0ZQQk1DX0JBRF9UQUcgPSAyLApAQCAtMzQxLDcgKzM0MSw3IEBACiAgICAgT0ZQQk1DX0JBRF9WQUxVRSA9IDcsCiB9OwogCi1lbnVtIG9mcF9mbG93X21vZF9mYWlsZWRfY29kZSB7CitlbnVtIG9mcF9mbG93X21vZF9mYWlsZWRfY29kZSh3aXJlX3R5cGU9dWludDE2X3QpIHsKICAgICBPRlBGTUZDX1VOS05PV04gPSAwLAogICAgIE9GUEZNRkNfVEFCTEVfRlVMTCA9IDEsCiAgICAgT0ZQRk1GQ19CQURfVEFCTEVfSUQgPSAyLApAQCAtMzUxLDcgKzM1MSw3IEBACiAgICAgT0ZQRk1GQ19CQURfQ09NTUFORCA9IDYsCiB9OwogCi1lbnVtIG9mcF9ncm91cF9tb2RfZmFpbGVkX2NvZGUgeworZW51bSBvZnBfZ3JvdXBfbW9kX2ZhaWxlZF9jb2RlKHdpcmVfdHlwZT11aW50MTZfdCkgewogICAgIE9GUEdNRkNfR1JPVVBfRVhJU1RTID0gMCwKICAgICBPRlBHTUZDX0lOVkFMSURfR1JPVVAgPSAxLAogICAgIE9GUEdNRkNfV0VJR0hUX1VOU1VQUE9SVEVEID0gMiwKQEAgLTM2MywzMCArMzYzLDMwIEBACiAgICAgT0ZQR01GQ19VTktOT1dOX0dST1VQID0gOCwKIH07CiAKLWVudW0gb2ZwX3BvcnRfbW9kX2ZhaWxlZF9jb2RlIHsKK2VudW0gb2ZwX3BvcnRfbW9kX2ZhaWxlZF9jb2RlKHdpcmVfdHlwZT11aW50MTZfdCkgewogICAgIE9GUFBNRkNfQkFEX1BPUlQgPSAwLAogICAgIE9GUFBNRkNfQkFEX0hXX0FERFIgPSAxLAogICAgIE9GUFBNRkNfQkFEX0NPTkZJRyA9IDIsCiAgICAgT0ZQUE1GQ19CQURfQURWRVJUSVNFID0gMywKIH07CiAKLWVudW0gb2ZwX3RhYmxlX21vZF9mYWlsZWRfY29kZSB7CitlbnVtIG9mcF90YWJsZV9tb2RfZmFpbGVkX2NvZGUod2lyZV90eXBlPXVpbnQxNl90KSB7CiAgICAgT0ZQVE1GQ19CQURfVEFCTEUgPSAwLAogICAgIE9GUFRNRkNfQkFEX0NPTkZJRyA9IDEsCiB9OwogCi1lbnVtIG9mcF9xdWV1ZV9vcF9mYWlsZWRfY29kZSB7CitlbnVtIG9mcF9xdWV1ZV9vcF9mYWlsZWRfY29kZSh3aXJlX3R5cGU9dWludDE2X3QpIHsKICAgICBPRlBRT0ZDX0JBRF9QT1JUID0gMCwKICAgICBPRlBRT0ZDX0JBRF9RVUVVRSA9IDEsCiAgICAgT0ZQUU9GQ19FUEVSTSA9IDIsCiB9OwogCi1lbnVtIG9mcF9zd2l0Y2hfY29uZmlnX2ZhaWxlZF9jb2RlIHsKK2VudW0gb2ZwX3N3aXRjaF9jb25maWdfZmFpbGVkX2NvZGUod2lyZV90eXBlPXVpbnQxNl90KSB7CiAgICAgT0ZQU0NGQ19CQURfRkxBR1MgPSAwLAogICAgIE9GUFNDRkNfQkFEX0xFTiA9IDEsCiB9OwogCi1lbnVtIG9mcF9zdGF0c190eXBlcyB7CitlbnVtIG9mcF9zdGF0c190eXBlcyh3aXJlX3R5cGU9dWludDE2X3QpIHsKICAgICBPRlBTVF9ERVNDID0gMCwKICAgICBPRlBTVF9GTE9XID0gMSwKICAgICBPRlBTVF9BR0dSRUdBVEUgPSAyLApAQCAtMzk4LDExICszOTgsMTEgQEAKICAgICBPRlBTVF9FWFBFUklNRU5URVIgPSAweGZmZmYsCiB9OwogCi1lbnVtIG9mcF9zdGF0c19yZXBseV9mbGFncyB7CitlbnVtIG9mcF9zdGF0c19yZXBseV9mbGFncyh3aXJlX3R5cGU9dWludDE2X3QsIGJpdG1hc2s9VHJ1ZSkgewogICAgIE9GUFNGX1JFUExZX01PUkUgPSAweDEsCiB9OwogCi1lbnVtIG9mcF9xdWV1ZV9wcm9wZXJ0aWVzIHsKK2VudW0gb2ZwX3F1ZXVlX3Byb3BlcnRpZXMod2lyZV90eXBlPXVpbnQxNl90KSB7CiAgICAgT0ZQUVRfTk9ORSA9IDAsCiAgICAgT0ZQUVRfTUlOX1JBVEUgPSAxLAogfTsKQEAgLTQxMCw3ICs0MTAsNyBAQAogLyogWFhYIHJlbmFtZSB0byBvZl9tZXNzYWdlICovCiBzdHJ1Y3Qgb2ZfaGVhZGVyIHsKICAgICB1aW50OF90IHZlcnNpb247Ci0gICAgdWludDhfdCB0eXBlOworICAgIHVpbnQ4X3QgdHlwZSA9PSA/OwogICAgIHVpbnQxNl90IGxlbmd0aDsKICAgICB1aW50MzJfdCB4aWQ7CiB9OwpAQCAtNzQ3LDcgKzc0Nyw3IEBACiB9OwogCiBzdHJ1Y3Qgb2ZfYWN0aW9uIHsKLSAgICB1aW50MTZfdCB0eXBlOworICAgIHVpbnQxNl90IHR5cGUgPT0gPzsKICAgICB1aW50MTZfdCBsZW47CiAgICAgcGFkKDQpOwogfTsKQEAgLTc5NCw3ICs3OTQsNyBAQAogfTsKIAogc3RydWN0IG9mX2luc3RydWN0aW9uIHsKLSAgICB1aW50MTZfdCB0eXBlOworICAgIHVpbnQxNl90IHR5cGUgPT0gPzsKICAgICB1aW50MTZfdCBsZW47CiAgICAgcGFkKDQpOwogfTsKQEAgLTg0OSw3ICs4NDksNyBAQAogICAgIHVpbnQ2NF90IGNvb2tpZTsKICAgICB1aW50NjRfdCBjb29raWVfbWFzazsKICAgICB1aW50OF90IHRhYmxlX2lkOwotICAgIG9mX2ZtX2NtZF90IF9jb21tYW5kOworICAgIG9mX2ZtX2NtZF90IF9jb21tYW5kID09ID87CiAgICAgdWludDE2X3QgaWRsZV90aW1lb3V0OwogICAgIHVpbnQxNl90IGhhcmRfdGltZW91dDsKICAgICB1aW50MTZfdCBwcmlvcml0eTsKQEAgLTExMDcsNyArMTEwNyw3IEBACiAgICAgdWludDhfdCB0eXBlID09IDE4OwogICAgIHVpbnQxNl90IGxlbmd0aDsKICAgICB1aW50MzJfdCB4aWQ7Ci0gICAgdWludDE2X3Qgc3RhdHNfdHlwZTsKKyAgICB1aW50MTZfdCBzdGF0c190eXBlID09ID87CiAgICAgdWludDE2X3QgZmxhZ3M7CiAgICAgcGFkKDQpOwogfTsKQEAgLTExMTcsNyArMTExNyw3IEBACiAgICAgdWludDhfdCB0eXBlID09IDE5OwogICAgIHVpbnQxNl90IGxlbmd0aDsKICAgICB1aW50MzJfdCB4aWQ7Ci0gICAgdWludDE2X3Qgc3RhdHNfdHlwZTsKKyAgICB1aW50MTZfdCBzdGF0c190eXBlID09ID87CiAgICAgdWludDE2X3QgZmxhZ3M7CiAgICAgcGFkKDQpOwogfTsKQEAgLTEzNDgsNyArMTM0OCw3IEBACiAvLyBFTkQgT0YgU1RBVFMgT0JKRUNUUwogCiBzdHJ1Y3Qgb2ZfcXVldWVfcHJvcCB7Ci0gICAgdWludDE2X3QgdHlwZTsKKyAgICB1aW50MTZfdCB0eXBlID09ID87CiAgICAgdWludDE2X3QgbGVuOwogICAgIHBhZCg0KTsKIH07CmRpZmYgLS1naXQgYS9vcGVuZmxvd19pbnB1dC9zdGFuZGFyZC0xLjIgYi9vcGVuZmxvd19pbnB1dC9zdGFuZGFyZC0xLjIKaW5kZXggYjQ5YzgzZi4uNDQwZWZlNiAxMDA2NDQKLS0tIGEvb3BlbmZsb3dfaW5wdXQvc3RhbmRhcmQtMS4yCisrKyBiL29wZW5mbG93X2lucHV0L3N0YW5kYXJkLTEuMgpAQCAtNTksNyArNTksNyBAQAogICAgIE9GUFFfTUFYX1JBVEVfVU5DRkcgPSAweGZmZmYsCiB9OwogCi1lbnVtIG9mcF9wb3J0IHsKK2VudW0gb2ZwX3BvcnQod2lyZV90eXBlPXVpbnQzMl90KSB7CiAgICAgT0ZQUF9NQVggPSAweGZmZmZmZjAwLAogICAgIE9GUFBfSU5fUE9SVCA9IDB4ZmZmZmZmZjgsCiAgICAgT0ZQUF9UQUJMRSA9IDB4ZmZmZmZmZjksCkBAIC03MCwxMSArNzAsMTEgQEAKICAgICBPRlBQX0xPQ0FMID0gMHhmZmZmZmZmZSwKIH07CiAKLWVudW0gb2ZwX3BvcnRfbm8geworZW51bSBvZnBfcG9ydF9ubyh3aXJlX3R5cGU9dWludDMyX3QsIGNvbXBsZXRlPW5vKSB7CiAgICAgT0ZQUF9BTlkgPSAweGZmZmZmZmZmLAogfTsKIAotZW51bSBvZnBfdHlwZSB7CitlbnVtIG9mcF90eXBlKHdpcmVfdHlwZT11aW50OF90KSB7CiAgICAgT0ZQVF9IRUxMTyA9IDAsCiAgICAgT0ZQVF9FUlJPUiA9IDEsCiAgICAgT0ZQVF9FQ0hPX1JFUVVFU1QgPSAyLApAQCAtMTAzLDcgKzEwMyw3IEBACiAgICAgT0ZQVF9ST0xFX1JFUExZID0gMjUsCiB9OwogCi1lbnVtIG9mcF9jb25maWdfZmxhZ3MgeworZW51bSBvZnBfY29uZmlnX2ZsYWdzKHdpcmVfdHlwZT11aW50MTZfdCwgYml0bWFzaz1UcnVlKSB7CiAgICAgT0ZQQ19GUkFHX05PUk1BTCA9IDAsCiAgICAgT0ZQQ19GUkFHX0RST1AgPSAxLAogICAgIE9GUENfRlJBR19SRUFTTSA9IDIsCkBAIC0xMTEsMTkgKzExMSwxOSBAQAogICAgIE9GUENfSU5WQUxJRF9UVExfVE9fQ09OVFJPTExFUiA9IDQsCiB9OwogCi1lbnVtIG9mcF90YWJsZV9jb25maWcgeworZW51bSBvZnBfdGFibGVfY29uZmlnKHdpcmVfdHlwZT11aW50MzJfdCwgYml0bWFzaz1UcnVlKSB7CiAgICAgT0ZQVENfVEFCTEVfTUlTU19DT05UUk9MTEVSID0gMCwKICAgICBPRlBUQ19UQUJMRV9NSVNTX0NPTlRJTlVFID0gMSwKICAgICBPRlBUQ19UQUJMRV9NSVNTX0RST1AgPSAyLAogICAgIE9GUFRDX1RBQkxFX01JU1NfTUFTSyA9IDMsCiB9OwogCi1lbnVtIG9mcF90YWJsZSB7CitlbnVtIG9mcF90YWJsZSh3aXJlX3R5cGU9dWludDhfdCwgY29tcGxldGU9RmFsc2UpIHsKICAgICBPRlBUVF9NQVggPSAweGZlLAogICAgIE9GUFRUX0FMTCA9IDB4ZmYsCiB9OwogCi1lbnVtIG9mcF9jYXBhYmlsaXRpZXMgeworZW51bSBvZnBfY2FwYWJpbGl0aWVzKHdpcmVfdHlwZT11aW50MzJfdCwgYml0bWFzaz1UcnVlKSB7CiAgICAgT0ZQQ19GTE9XX1NUQVRTID0gMHgxLAogICAgIE9GUENfVEFCTEVfU1RBVFMgPSAweDIsCiAgICAgT0ZQQ19QT1JUX1NUQVRTID0gMHg0LApAQCAtMTMzLDIwICsxMzMsMjAgQEAKICAgICBPRlBDX1BPUlRfQkxPQ0tFRCA9IDB4MTAwLAogfTsKIAotZW51bSBvZnBfcG9ydF9jb25maWcgeworZW51bSBvZnBfcG9ydF9jb25maWcod2lyZV90eXBlPXVpbnQzMl90LCBiaXRtYXNrPVRydWUpIHsKICAgICBPRlBQQ19QT1JUX0RPV04gPSAweDEsCiAgICAgT0ZQUENfTk9fUkVDViA9IDB4NCwKICAgICBPRlBQQ19OT19GV0QgPSAweDIwLAogICAgIE9GUFBDX05PX1BBQ0tFVF9JTiA9IDB4NDAsCiB9OwogCi1lbnVtIG9mcF9wb3J0X3N0YXRlIHsKK2VudW0gb2ZwX3BvcnRfc3RhdGUod2lyZV90eXBlPXVpbnQzMl90LCBiaXRtYXNrPVRydWUpIHsKICAgICBPRlBQU19MSU5LX0RPV04gPSAweDEsCiAgICAgT0ZQUFNfQkxPQ0tFRCA9IDB4MiwKICAgICBPRlBQU19MSVZFID0gMHg0LAogfTsKIAotZW51bSBvZnBfcG9ydF9mZWF0dXJlcyB7CitlbnVtIG9mcF9wb3J0X2ZlYXR1cmVzKHdpcmVfdHlwZT11aW50MzJfdCwgYml0bWFzaz1UcnVlKSB7CiAgICAgT0ZQUEZfMTBNQl9IRCA9IDB4MSwKICAgICBPRlBQRl8xME1CX0ZEID0gMHgyLAogICAgIE9GUFBGXzEwME1CX0hEID0gMHg0LApAQCAtMTY1LDMwICsxNjUsMzAgQEAKICAgICBPRlBQRl9QQVVTRV9BU1lNID0gMHg4MDAwLAogfTsKIAotZW51bSBvZnBfcG9ydF9yZWFzb24geworZW51bSBvZnBfcG9ydF9yZWFzb24od2lyZV90eXBlPXVpbnQ4X3QpIHsKICAgICBPRlBQUl9BREQgPSAwLAogICAgIE9GUFBSX0RFTEVURSA9IDEsCiAgICAgT0ZQUFJfTU9ESUZZID0gMiwKIH07CiAKLWVudW0gb2ZwX21hdGNoX3R5cGUgeworZW51bSBvZnBfbWF0Y2hfdHlwZSh3aXJlX3R5cGU9dWludDE2X3QpIHsKICAgICBPRlBNVF9TVEFOREFSRCA9IDAsCiAgICAgT0ZQTVRfT1hNID0gMSwKIH07CiAKLWVudW0gb2ZwX294bV9jbGFzcyB7CitlbnVtIG9mcF9veG1fY2xhc3Mod2lyZV90eXBlPXVpbnQxNl90KSB7CiAgICAgT0ZQWE1DX05YTV8wID0gMCwKICAgICBPRlBYTUNfTlhNXzEgPSAxLAogICAgIE9GUFhNQ19PUEVORkxPV19CQVNJQyA9IDB4ODAwMCwKICAgICBPRlBYTUNfRVhQRVJJTUVOVEVSID0gMHhmZmZmLAogfTsKIAotZW51bSBvZnBfdmxhbl9pZCB7CitlbnVtIG9mcF92bGFuX2lkKHdpcmVfdHlwZT11aW50MTZfdCkgewogICAgIE9GUFZJRF9OT05FID0gMCwKICAgICBPRlBWSURfUFJFU0VOVCA9IDB4MTAwMCwKIH07CiAKLWVudW0gb2ZwX2FjdGlvbl90eXBlIHsKK2VudW0gb2ZwX2FjdGlvbl90eXBlKHdpcmVfdHlwZT11aW50MTZfdCkgewogICAgIE9GUEFUX09VVFBVVCA9IDAsCiAgICAgT0ZQQVRfQ09QWV9UVExfT1VUID0gMHhiLAogICAgIE9GUEFUX0NPUFlfVFRMX0lOID0gMHhjLApAQCAtMjA2LDEyICsyMDYsMTIgQEAKICAgICBPRlBBVF9FWFBFUklNRU5URVIgPSAweGZmZmYsCiB9OwogCi1lbnVtIG9mcF9jb250cm9sbGVyX21heF9sZW4geworZW51bSBvZnBfY29udHJvbGxlcl9tYXhfbGVuKHdpcmVfdHlwZT11aW50MTZfdCwgY29tcGxldGU9RmFsc2UpIHsKICAgICBPRlBDTUxfTUFYID0gMHhmZmU1LAogICAgIE9GUENNTF9OT19CVUZGRVIgPSAweGZmZmYsCiB9OwogCi1lbnVtIG9mcF9pbnN0cnVjdGlvbl90eXBlIHsKK2VudW0gb2ZwX2luc3RydWN0aW9uX3R5cGUod2lyZV90eXBlPXVpbnQxNl90LCBiaXRtYXNrPVRydWUpIHsKICAgICBPRlBJVF9HT1RPX1RBQkxFID0gMHgxLAogICAgIE9GUElUX1dSSVRFX01FVEFEQVRBID0gMHgyLAogICAgIE9GUElUX1dSSVRFX0FDVElPTlMgPSAweDMsCkBAIC0yMjAsNyArMjIwLDcgQEAKICAgICBPRlBJVF9FWFBFUklNRU5URVIgPSAweGZmZmYsCiB9OwogCi1lbnVtIG9mcF9mbG93X21vZF9jb21tYW5kIHsKK2VudW0gb2ZwX2Zsb3dfbW9kX2NvbW1hbmQod2lyZV90eXBlPXVpbnQ4X3QpIHsKICAgICBPRlBGQ19BREQgPSAwLAogICAgIE9GUEZDX01PRElGWSA9IDEsCiAgICAgT0ZQRkNfTU9ESUZZX1NUUklDVCA9IDIsCkBAIC0yMjgsNDUgKzIyOCw0NSBAQAogICAgIE9GUEZDX0RFTEVURV9TVFJJQ1QgPSA0LAogfTsKIAotZW51bSBvZnBfZmxvd19tb2RfZmxhZ3MgeworZW51bSBvZnBfZmxvd19tb2RfZmxhZ3Mod2lyZV90eXBlPXVpbnQxNl90LCBiaXRtYXNrPVRydWUpIHsKICAgICBPRlBGRl9TRU5EX0ZMT1dfUkVNID0gMHgxLAogICAgIE9GUEZGX0NIRUNLX09WRVJMQVAgPSAweDIsCiAgICAgT0ZQRkZfUkVTRVRfQ09VTlRTID0gMHg0LAogfTsKIAotZW51bSBvZnBfZ3JvdXAgeworZW51bSBvZnBfZ3JvdXAod2lyZV90eXBlPXVpbnQzMl90LCBjb21wbGV0ZT1GYWxzZSkgewogICAgIE9GUEdfTUFYID0gMHhmZmZmZmYwMCwKICAgICBPRlBHX0FMTCA9IDB4ZmZmZmZmZmMsCiAgICAgT0ZQR19BTlkgPSAweGZmZmZmZmZmLAogfTsKIAotZW51bSBvZnBfZ3JvdXBfbW9kX2NvbW1hbmQgeworZW51bSBvZnBfZ3JvdXBfbW9kX2NvbW1hbmQod2lyZV90eXBlPXVpbnQxNl90KSB7CiAgICAgT0ZQR0NfQUREID0gMCwKICAgICBPRlBHQ19NT0RJRlkgPSAxLAogICAgIE9GUEdDX0RFTEVURSA9IDIsCiB9OwogCi1lbnVtIG9mcF9ncm91cF90eXBlIHsKK2VudW0gb2ZwX2dyb3VwX3R5cGUod2lyZV90eXBlPXVpbnQ4X3QpIHsKICAgICBPRlBHVF9BTEwgPSAwLAogICAgIE9GUEdUX1NFTEVDVCA9IDEsCiAgICAgT0ZQR1RfSU5ESVJFQ1QgPSAyLAogICAgIE9GUEdUX0ZGID0gMywKIH07CiAKLWVudW0gb2ZwX3BhY2tldF9pbl9yZWFzb24geworZW51bSBvZnBfcGFja2V0X2luX3JlYXNvbih3aXJlX3R5cGU9dWludDhfdCkgewogICAgIE9GUFJfTk9fTUFUQ0ggPSAwLAogICAgIE9GUFJfQUNUSU9OID0gMSwKICAgICBPRlBSX0lOVkFMSURfVFRMID0gMiwKIH07CiAKLWVudW0gb2ZwX2Zsb3dfcmVtb3ZlZF9yZWFzb24geworZW51bSBvZnBfZmxvd19yZW1vdmVkX3JlYXNvbih3aXJlX3R5cGU9dWludDhfdCkgewogICAgIE9GUFJSX0lETEVfVElNRU9VVCA9IDAsCiAgICAgT0ZQUlJfSEFSRF9USU1FT1VUID0gMSwKICAgICBPRlBSUl9ERUxFVEUgPSAyLAogICAgIE9GUFJSX0dST1VQX0RFTEVURSA9IDMsCiB9OwogCi1lbnVtIG9mcF9lcnJvcl90eXBlIHsKK2VudW0gb2ZwX2Vycm9yX3R5cGUod2lyZV90eXBlPXVpbnQxNl90KSB7CiAgICAgT0ZQRVRfSEVMTE9fRkFJTEVEID0gMCwKICAgICBPRlBFVF9CQURfUkVRVUVTVCA9IDEsCiAgICAgT0ZQRVRfQkFEX0FDVElPTiA9IDIsCkBAIC0yODIsMTIgKzI4MiwxMiBAQAogICAgIE9GUEVUX0VYUEVSSU1FTlRFUiA9IDB4ZmZmZiwKIH07CiAKLWVudW0gb2ZwX2hlbGxvX2ZhaWxlZF9jb2RlIHsKK2VudW0gb2ZwX2hlbGxvX2ZhaWxlZF9jb2RlKHdpcmVfdHlwZT11aW50MTZfdCkgewogICAgIE9GUEhGQ19JTkNPTVBBVElCTEUgPSAwLAogICAgIE9GUEhGQ19FUEVSTSA9IDEsCiB9OwogCi1lbnVtIG9mcF9iYWRfcmVxdWVzdF9jb2RlIHsKK2VudW0gb2ZwX2JhZF9yZXF1ZXN0X2NvZGUod2lyZV90eXBlPXVpbnQxNl90KSB7CiAgICAgT0ZQQlJDX0JBRF9WRVJTSU9OID0gMCwKICAgICBPRlBCUkNfQkFEX1RZUEUgPSAxLAogICAgIE9GUEJSQ19CQURfU1RBVCA9IDIsCkBAIC0zMDMsNyArMzAzLDcgQEAKICAgICBPRlBCUkNfQkFEX1BBQ0tFVCA9IDEyLAogfTsKIAotZW51bSBvZnBfYmFkX2FjdGlvbl9jb2RlIHsKK2VudW0gb2ZwX2JhZF9hY3Rpb25fY29kZSh3aXJlX3R5cGU9dWludDE2X3QpIHsKICAgICBPRlBCQUNfQkFEX1RZUEUgPSAwLAogICAgIE9GUEJBQ19CQURfTEVOID0gMSwKICAgICBPRlBCQUNfQkFEX0VYUEVSSU1FTlRFUiA9IDIsCkBAIC0zMjIsNyArMzIyLDcgQEAKICAgICBPRlBCQUNfQkFEX1NFVF9BUkdVTUVOVCA9IDE1LAogfTsKIAotZW51bSBvZnBfYmFkX2luc3RydWN0aW9uX2NvZGUgeworZW51bSBvZnBfYmFkX2luc3RydWN0aW9uX2NvZGUod2lyZV90eXBlPXVpbnQxNl90KSB7CiAgICAgT0ZQQklDX1VOS05PV05fSU5TVCA9IDAsCiAgICAgT0ZQQklDX1VOU1VQX0lOU1QgPSAxLAogICAgIE9GUEJJQ19CQURfVEFCTEVfSUQgPSAyLApAQCAtMzM0LDcgKzMzNCw3IEBACiAgICAgT0ZQQklDX0VQRVJNID0gOCwKIH07CiAKLWVudW0gb2ZwX2JhZF9tYXRjaF9jb2RlIHsKK2VudW0gb2ZwX2JhZF9tYXRjaF9jb2RlKHdpcmVfdHlwZT11aW50MTZfdCkgewogICAgIE9GUEJNQ19CQURfVFlQRSA9IDAsCiAgICAgT0ZQQk1DX0JBRF9MRU4gPSAxLAogICAgIE9GUEJNQ19CQURfVEFHID0gMiwKQEAgLTM0OSw3ICszNDksNyBAQAogICAgIE9GUEJNQ19FUEVSTSA9IDExLAogfTsKIAotZW51bSBvZnBfZmxvd19tb2RfZmFpbGVkX2NvZGUgeworZW51bSBvZnBfZmxvd19tb2RfZmFpbGVkX2NvZGUod2lyZV90eXBlPXVpbnQxNl90KSB7CiAgICAgT0ZQRk1GQ19VTktOT1dOID0gMCwKICAgICBPRlBGTUZDX1RBQkxFX0ZVTEwgPSAxLAogICAgIE9GUEZNRkNfQkFEX1RBQkxFX0lEID0gMiwKQEAgLTM2MCw3ICszNjAsNyBAQAogICAgIE9GUEZNRkNfQkFEX0ZMQUdTID0gNywKIH07CiAKLWVudW0gb2ZwX2dyb3VwX21vZF9mYWlsZWRfY29kZSB7CitlbnVtIG9mcF9ncm91cF9tb2RfZmFpbGVkX2NvZGUod2lyZV90eXBlPXVpbnQxNl90KSB7CiAgICAgT0ZQR01GQ19HUk9VUF9FWElTVFMgPSAwLAogICAgIE9GUEdNRkNfSU5WQUxJRF9HUk9VUCA9IDEsCiAgICAgT0ZQR01GQ19XRUlHSFRfVU5TVVBQT1JURUQgPSAyLApAQCAtMzc4LDcgKzM3OCw3IEBACiAgICAgT0ZQR01GQ19FUEVSTSA9IDE0LAogfTsKIAotZW51bSBvZnBfcG9ydF9tb2RfZmFpbGVkX2NvZGUgeworZW51bSBvZnBfcG9ydF9tb2RfZmFpbGVkX2NvZGUod2lyZV90eXBlPXVpbnQxNl90KSB7CiAgICAgT0ZQUE1GQ19CQURfUE9SVCA9IDAsCiAgICAgT0ZQUE1GQ19CQURfSFdfQUREUiA9IDEsCiAgICAgT0ZQUE1GQ19CQURfQ09ORklHID0gMiwKQEAgLTM4NiwzMSArMzg2LDMxIEBACiAgICAgT0ZQUE1GQ19FUEVSTSA9IDQsCiB9OwogCi1lbnVtIG9mcF90YWJsZV9tb2RfZmFpbGVkX2NvZGUgeworZW51bSBvZnBfdGFibGVfbW9kX2ZhaWxlZF9jb2RlKHdpcmVfdHlwZT11aW50MTZfdCkgewogICAgIE9GUFRNRkNfQkFEX1RBQkxFID0gMCwKICAgICBPRlBUTUZDX0JBRF9DT05GSUcgPSAxLAogICAgIE9GUFRNRkNfRVBFUk0gPSAyLAogfTsKIAotZW51bSBvZnBfcXVldWVfb3BfZmFpbGVkX2NvZGUgeworZW51bSBvZnBfcXVldWVfb3BfZmFpbGVkX2NvZGUod2lyZV90eXBlPXVpbnQxNl90KSB7CiAgICAgT0ZQUU9GQ19CQURfUE9SVCA9IDAsCiAgICAgT0ZQUU9GQ19CQURfUVVFVUUgPSAxLAogICAgIE9GUFFPRkNfRVBFUk0gPSAyLAogfTsKIAotZW51bSBvZnBfc3dpdGNoX2NvbmZpZ19mYWlsZWRfY29kZSB7CitlbnVtIG9mcF9zd2l0Y2hfY29uZmlnX2ZhaWxlZF9jb2RlKHdpcmVfdHlwZT11aW50MTZfdCkgewogICAgIE9GUFNDRkNfQkFEX0ZMQUdTID0gMCwKICAgICBPRlBTQ0ZDX0JBRF9MRU4gPSAxLAogICAgIE9GUFNDRkNfRVBFUk0gPSAyLAogfTsKIAotZW51bSBvZnBfcm9sZV9yZXF1ZXN0X2ZhaWxlZF9jb2RlIHsKK2VudW0gb2ZwX3JvbGVfcmVxdWVzdF9mYWlsZWRfY29kZSAod2lyZV90eXBlPXVpbnQxNl90KXsKICAgICBPRlBSUkZDX1NUQUxFID0gMCwKICAgICBPRlBSUkZDX1VOU1VQID0gMSwKICAgICBPRlBSUkZDX0JBRF9ST0xFID0gMiwKIH07CiAKLWVudW0gb2ZwX3N0YXRzX3R5cGVzIHsKK2VudW0gb2ZwX3N0YXRzX3R5cGVzKHdpcmVfdHlwZT11aW50MTZfdCkgewogICAgIE9GUFNUX0RFU0MgPSAwLAogICAgIE9GUFNUX0ZMT1cgPSAxLAogICAgIE9GUFNUX0FHR1JFR0FURSA9IDIsCkBAIC00MjMsMjQgKzQyMywyNCBAQAogICAgIE9GUFNUX0VYUEVSSU1FTlRFUiA9IDB4ZmZmZiwKIH07CiAKLWVudW0gb2ZwX3N0YXRzX3JlcGx5X2ZsYWdzIHsKK2VudW0gb2ZwX3N0YXRzX3JlcGx5X2ZsYWdzKHdpcmVfdHlwZT11aW50MTZfdCwgYml0bWFzaz1UcnVlKSB7CiAgICAgT0ZQU0ZfUkVQTFlfTU9SRSA9IDB4MSwKIH07CiAKLWVudW0gb2ZwX2dyb3VwX2NhcGFiaWxpdGllcyB7CitlbnVtIG9mcF9ncm91cF9jYXBhYmlsaXRpZXMod2lyZV90eXBlPXVpbnQzMl90LCBiaXRtYXNrPVRydWUpIHsKICAgICBPRlBHRkNfU0VMRUNUX1dFSUdIVCA9IDB4MSwKICAgICBPRlBHRkNfU0VMRUNUX0xJVkVORVNTID0gMHgyLAogICAgIE9GUEdGQ19DSEFJTklORyA9IDB4NCwKICAgICBPRlBHRkNfQ0hBSU5JTkdfQ0hFQ0tTID0gMHg4LAogfTsKIAotZW51bSBvZnBfcXVldWVfcHJvcGVydGllcyB7CitlbnVtIG9mcF9xdWV1ZV9wcm9wZXJ0aWVzKHdpcmVfdHlwZT11aW50MTZfdCkgewogICAgIE9GUFFUX01JTl9SQVRFID0gMHgxLAogICAgIE9GUFFUX01BWF9SQVRFID0gMHgyLAogICAgIE9GUFFUX0VYUEVSSU1FTlRFUiA9IDB4ZmZmZiwKIH07CiAKLWVudW0gb2ZwX2NvbnRyb2xsZXJfcm9sZSB7CitlbnVtIG9mcF9jb250cm9sbGVyX3JvbGUod2lyZV90eXBlPXVpbnQzMl90KSB7CiAgICAgT0ZQQ1JfUk9MRV9OT0NIQU5HRSA9IDAsCiAgICAgT0ZQQ1JfUk9MRV9FUVVBTCA9IDEsCiAgICAgT0ZQQ1JfUk9MRV9NQVNURVIgPSAyLApAQCAtNDUwLDcgKzQ1MCw3IEBACiAvKiBYWFggcmVuYW1lIHRvIG9mX21lc3NhZ2UgKi8KIHN0cnVjdCBvZl9oZWFkZXIgewogICAgIHVpbnQ4X3QgdmVyc2lvbjsKLSAgICB1aW50OF90IHR5cGU7CisgICAgdWludDhfdCB0eXBlID09ID87CiAgICAgdWludDE2X3QgbGVuZ3RoOwogICAgIHVpbnQzMl90IHhpZDsKIH07CkBAIC01OTksNyArNTk5LDcgQEAKICAgICBwYWQoNCk7CiB9OwogCi1zdHJ1Y3Qgb2ZfbWF0Y2hfdjMgeworc3RydWN0IG9mX21hdGNoX3YzKGFsaWduPTgpIHsKICAgICB1aW50MTZfdCB0eXBlID09IDE7CiAgICAgdWludDE2X3QgbGVuZ3RoOwogICAgIGxpc3Qob2Zfb3htX3QpIG94bV9saXN0OwpAQCAtNzA0LDEzICs3MDQsMTMgQEAKIH07CiAKIHN0cnVjdCBvZl9hY3Rpb24gewotICAgIHVpbnQxNl90IHR5cGU7CisgICAgdWludDE2X3QgdHlwZSA9PSA/OwogICAgIHVpbnQxNl90IGxlbjsKICAgICBwYWQoNCk7CiB9OwogCiBzdHJ1Y3Qgb2ZfaW5zdHJ1Y3Rpb24gewotICAgIHVpbnQxNl90IHR5cGU7CisgICAgdWludDE2X3QgdHlwZSA9PSA/OwogICAgIHVpbnQxNl90IGxlbjsKICAgICBwYWQoNCk7CiB9OwpAQCAtNzY1LDcgKzc2NSw3IEBACiAgICAgdWludDY0X3QgY29va2llOwogICAgIHVpbnQ2NF90IGNvb2tpZV9tYXNrOwogICAgIHVpbnQ4X3QgdGFibGVfaWQ7Ci0gICAgb2ZfZm1fY21kX3QgX2NvbW1hbmQ7CisgICAgb2ZfZm1fY21kX3QgX2NvbW1hbmQgPT0gPzsKICAgICB1aW50MTZfdCBpZGxlX3RpbWVvdXQ7CiAgICAgdWludDE2X3QgaGFyZF90aW1lb3V0OwogICAgIHVpbnQxNl90IHByaW9yaXR5OwpAQCAtMTA2Nyw3ICsxMDY3LDcgQEAKICAgICB1aW50OF90IHR5cGUgPT0gMTg7CiAgICAgdWludDE2X3QgbGVuZ3RoOwogICAgIHVpbnQzMl90IHhpZDsKLSAgICB1aW50MTZfdCBzdGF0c190eXBlOworICAgIHVpbnQxNl90IHN0YXRzX3R5cGUgPT0gPzsKICAgICB1aW50MTZfdCBmbGFnczsKICAgICBwYWQoNCk7CiB9OwpAQCAtMTA3Nyw3ICsxMDc3LDcgQEAKICAgICB1aW50OF90IHR5cGUgPT0gMTk7CiAgICAgdWludDE2X3QgbGVuZ3RoOwogICAgIHVpbnQzMl90IHhpZDsKLSAgICB1aW50MTZfdCBzdGF0c190eXBlOworICAgIHVpbnQxNl90IHN0YXRzX3R5cGUgPT0gPzsKICAgICB1aW50MTZfdCBmbGFnczsKICAgICBwYWQoNCk7CiB9OwpAQCAtMTMzOCw3ICsxMzM4LDcgQEAKIC8vIEVORCBPRiBTVEFUUyBPQkpFQ1RTCiAKIHN0cnVjdCBvZl9xdWV1ZV9wcm9wIHsKLSAgICB1aW50MTZfdCB0eXBlOworICAgIHVpbnQxNl90IHR5cGUgPT0gPzsKICAgICB1aW50MTZfdCBsZW47CiAgICAgcGFkKDQpOwogfTsKZGlmZiAtLWdpdCBhL29wZW5mbG93X2lucHV0L3N0YW5kYXJkLTEuMyBiL29wZW5mbG93X2lucHV0L3N0YW5kYXJkLTEuMwppbmRleCBhYjMyYWJlLi44N2YwNDk0IDEwMDY0NAotLS0gYS9vcGVuZmxvd19pbnB1dC9zdGFuZGFyZC0xLjMKKysrIGIvb3BlbmZsb3dfaW5wdXQvc3RhbmRhcmQtMS4zCkBAIC01OCwxMSArNTgsMTEgQEAKICAgICBPRlBRX01JTl9SQVRFX1VOQ0ZHID0gMHhmZmZmLAogfTsKIAotZW51bSBvZnBfcG9ydF9ubyB7CitlbnVtIG9mcF9wb3J0X25vKHdpcmVfdHlwZT11aW50MzJfdCwgY29tcGxldGU9bm8pIHsKICAgICBPRlBQX0FOWSA9IDB4ZmZmZmZmZmYsCiB9OwogCi1lbnVtIG9mcF9wb3J0IHsKK2VudW0gb2ZwX3BvcnQod2lyZV90eXBlPXVpbnQzMl90KSB7CiAgICAgT0ZQUF9NQVggPSAweGZmZmZmZjAwLAogICAgIE9GUFBfSU5fUE9SVCA9IDB4ZmZmZmZmZjgsCiAgICAgT0ZQUF9UQUJMRSA9IDB4ZmZmZmZmZjksCkBAIC03Myw3ICs3Myw3IEBACiAgICAgT0ZQUF9MT0NBTCA9IDB4ZmZmZmZmZmUsCiB9OwogCi1lbnVtIG9mcF90eXBlIHsKK2VudW0gb2ZwX3R5cGUod2lyZV90eXBlPXVpbnQ4X3QpIHsKICAgICBPRlBUX0hFTExPID0gMCwKICAgICBPRlBUX0VSUk9SID0gMSwKICAgICBPRlBUX0VDSE9fUkVRVUVTVCA9IDIsCkBAIC0xMDYsMjMgKzEwNiwyMyBAQAogICAgIE9GUFRfTUVURVJfTU9EID0gMjksCiB9OwogCi1lbnVtIG9mcF9jb25maWdfZmxhZ3MgeworZW51bSBvZnBfY29uZmlnX2ZsYWdzKHdpcmVfdHlwZT11aW50MTZfdCwgYml0bWFzaz1UcnVlKSB7CiAgICAgT0ZQQ19GUkFHX05PUk1BTCA9IDAsCiAgICAgT0ZQQ19GUkFHX0RST1AgPSAxLAogICAgIE9GUENfRlJBR19SRUFTTSA9IDIsCiAgICAgT0ZQQ19GUkFHX01BU0sgPSAzLAogfTsKIAotZW51bSBvZnBfdGFibGVfY29uZmlnIHsKK2VudW0gb2ZwX3RhYmxlX2NvbmZpZyh3aXJlX3R5cGU9dWludDMyX3QsIGJpdG1hc2s9VHJ1ZSkgewogICAgIE9GUFRDX0RFUFJFQ0FURURfTUFTSyA9IDB4MywKIH07CiAKLWVudW0gb2ZwX3RhYmxlIHsKK2VudW0gb2ZwX3RhYmxlKHdpcmVfdHlwZT11aW50OF90LCBjb21wbGV0ZT1GYWxzZSkgewogICAgIE9GUFRUX01BWCA9IDB4ZmUsCiAgICAgT0ZQVFRfQUxMID0gMHhmZiwKIH07CiAKLWVudW0gb2ZwX2NhcGFiaWxpdGllcyB7CitlbnVtIG9mcF9jYXBhYmlsaXRpZXMod2lyZV90eXBlPXVpbnQzMl90LCBiaXRtYXNrPVRydWUpIHsKICAgICBPRlBDX0ZMT1dfU1RBVFMgPSAweDEsCiAgICAgT0ZQQ19UQUJMRV9TVEFUUyA9IDB4MiwKICAgICBPRlBDX1BPUlRfU1RBVFMgPSAweDQsCkBAIC0xMzIsMjAgKzEzMiwyMCBAQAogICAgIE9GUENfUE9SVF9CTE9DS0VEID0gMHgxMDAsCiB9OwogCi1lbnVtIG9mcF9wb3J0X2NvbmZpZyB7CitlbnVtIG9mcF9wb3J0X2NvbmZpZyh3aXJlX3R5cGU9dWludDMyX3QsIGJpdG1hc2s9VHJ1ZSkgewogICAgIE9GUFBDX1BPUlRfRE9XTiA9IDB4MSwKICAgICBPRlBQQ19OT19SRUNWID0gMHg0LAogICAgIE9GUFBDX05PX0ZXRCA9IDB4MjAsCiAgICAgT0ZQUENfTk9fUEFDS0VUX0lOID0gMHg0MCwKIH07CiAKLWVudW0gb2ZwX3BvcnRfc3RhdGUgeworZW51bSBvZnBfcG9ydF9zdGF0ZSh3aXJlX3R5cGU9dWludDMyX3QsIGJpdG1hc2s9VHJ1ZSkgewogICAgIE9GUFBTX0xJTktfRE9XTiA9IDB4MSwKICAgICBPRlBQU19CTE9DS0VEID0gMHgyLAogICAgIE9GUFBTX0xJVkUgPSAweDQsCiB9OwogCi1lbnVtIG9mcF9wb3J0X2ZlYXR1cmVzIHsKK2VudW0gb2ZwX3BvcnRfZmVhdHVyZXMod2lyZV90eXBlPXVpbnQzMl90LCBiaXRtYXNrPVRydWUpIHsKICAgICBPRlBQRl8xME1CX0hEID0gMHgxLAogICAgIE9GUFBGXzEwTUJfRkQgPSAweDIsCiAgICAgT0ZQUEZfMTAwTUJfSEQgPSAweDQsCkBAIC0xNjQsMzAgKzE2NCwzMiBAQAogICAgIE9GUFBGX1BBVVNFX0FTWU0gPSAweDgwMDAsCiB9OwogCi1lbnVtIG9mcF9wb3J0X3JlYXNvbiB7CitlbnVtIG9mcF9wb3J0X3JlYXNvbih3aXJlX3R5cGU9dWludDhfdCkgewogICAgIE9GUFBSX0FERCA9IDAsCiAgICAgT0ZQUFJfREVMRVRFID0gMSwKICAgICBPRlBQUl9NT0RJRlkgPSAyLAogfTsKIAotZW51bSBvZnBfbWF0Y2hfdHlwZSB7CitlbnVtIG9mcF9tYXRjaF90eXBlKHdpcmVfdHlwZT11aW50MTZfdCkgewogICAgIE9GUE1UX1NUQU5EQVJEID0gMCwKICAgICBPRlBNVF9PWE0gPSAxLAogfTsKIAotZW51bSBvZnBfb3htX2NsYXNzIHsKK2VudW0gb2ZwX294bV9jbGFzcyh3aXJlX3R5cGU9dWludDE2X3QpIHsKICAgICBPRlBYTUNfTlhNXzAgPSAwLAogICAgIE9GUFhNQ19OWE1fMSA9IDEsCiAgICAgT0ZQWE1DX09QRU5GTE9XX0JBU0lDID0gMHg4MDAwLAogICAgIE9GUFhNQ19FWFBFUklNRU5URVIgPSAweGZmZmYsCiB9OwogCi1lbnVtIG9mcF92bGFuX2lkIHsKK2VudW0gb2ZwX3ZsYW5faWQod2lyZV90eXBlPXVpbnQxNl90KSB7CiAgICAgT0ZQVklEX05PTkUgPSAwLAogICAgIE9GUFZJRF9QUkVTRU5UID0gMHgxMDAwLAogfTsKIAotZW51bSBvZnBfaXB2NmV4dGhkcl9mbGFncyB7CisvLyBGSVhNRTogT0Ygc3BlYyBzcGVjaWZpZWQgdGhpcyBhcyAnOScgYml0cywgaW1wbGljaXRseSBhZGRpbmcKKy8vIHRvIGZ1bGwgYnl0ZQorZW51bSBvZnBfaXB2NmV4dGhkcl9mbGFncyh3aXJlX3R5cGU9dWludDE2X3QsIGJpdG1hc2s9VHJ1ZSkgewogICAgIE9GUElFSF9OT05FWFQgPSAweDEsCiAgICAgT0ZQSUVIX0VTUCA9IDB4MiwKICAgICBPRlBJRUhfQVVUSCA9IDB4NCwKQEAgLTE5OSw3ICsyMDEsNyBAQAogICAgIE9GUElFSF9VTlNFUSA9IDB4MTAwLAogfTsKIAotZW51bSBvZnBfYWN0aW9uX3R5cGUgeworZW51bSBvZnBfYWN0aW9uX3R5cGUod2lyZV90eXBlPXVpbnQxNl90KSB7CiAgICAgT0ZQQVRfT1VUUFVUID0gMCwKICAgICBPRlBBVF9DT1BZX1RUTF9PVVQgPSAweGIsCiAgICAgT0ZQQVRfQ09QWV9UVExfSU4gPSAweGMsCkBAIC0yMTksMTIgKzIyMSwxMiBAQAogICAgIE9GUEFUX0VYUEVSSU1FTlRFUiA9IDB4ZmZmZiwKIH07CiAKLWVudW0gb2ZwX2NvbnRyb2xsZXJfbWF4X2xlbiB7CitlbnVtIG9mcF9jb250cm9sbGVyX21heF9sZW4od2lyZV90eXBlPXVpbnQxNl90LCBjb21wbGV0ZT1GYWxzZSkgewogICAgIE9GUENNTF9NQVggPSAweGZmZTUsCiAgICAgT0ZQQ01MX05PX0JVRkZFUiA9IDB4ZmZmZiwKIH07CiAKLWVudW0gb2ZwX2luc3RydWN0aW9uX3R5cGUgeworZW51bSBvZnBfaW5zdHJ1Y3Rpb25fdHlwZSh3aXJlX3R5cGU9dWludDE2X3QsIGJpdG1hc2s9VHJ1ZSkgewogICAgIE9GUElUX0dPVE9fVEFCTEUgPSAweDEsCiAgICAgT0ZQSVRfV1JJVEVfTUVUQURBVEEgPSAweDIsCiAgICAgT0ZQSVRfV1JJVEVfQUNUSU9OUyA9IDB4MywKQEAgLTIzNCw3ICsyMzYsNyBAQAogICAgIE9GUElUX0VYUEVSSU1FTlRFUiA9IDB4ZmZmZiwKIH07CiAKLWVudW0gb2ZwX2Zsb3dfbW9kX2NvbW1hbmQgeworZW51bSBvZnBfZmxvd19tb2RfY29tbWFuZCh3aXJlX3R5cGU9dWludDhfdCkgewogICAgIE9GUEZDX0FERCA9IDAsCiAgICAgT0ZQRkNfTU9ESUZZID0gMSwKICAgICBPRlBGQ19NT0RJRllfU1RSSUNUID0gMiwKQEAgLTI0Miw3ICsyNDQsNyBAQAogICAgIE9GUEZDX0RFTEVURV9TVFJJQ1QgPSA0LAogfTsKIAotZW51bSBvZnBfZmxvd19tb2RfZmxhZ3MgeworZW51bSBvZnBfZmxvd19tb2RfZmxhZ3Mod2lyZV90eXBlPXVpbnQxNl90LCBiaXRtYXNrPVRydWUpIHsKICAgICBPRlBGRl9TRU5EX0ZMT1dfUkVNID0gMHgxLAogICAgIE9GUEZGX0NIRUNLX09WRVJMQVAgPSAweDIsCiAgICAgT0ZQRkZfUkVTRVRfQ09VTlRTID0gMHg0LApAQCAtMjUwLDY1ICsyNTIsNjUgQEAKICAgICBPRlBGRl9OT19CWVRfQ09VTlRTID0gMHgxMCwKIH07CiAKLWVudW0gb2ZwX2dyb3VwIHsKK2VudW0gb2ZwX2dyb3VwKHdpcmVfdHlwZT11aW50MzJfdCwgY29tcGxldGU9RmFsc2UpIHsKICAgICBPRlBHX01BWCA9IDB4ZmZmZmZmMDAsCiAgICAgT0ZQR19BTEwgPSAweGZmZmZmZmZjLAogICAgIE9GUEdfQU5ZID0gMHhmZmZmZmZmZiwKIH07CiAKLWVudW0gb2ZwX2dyb3VwX21vZF9jb21tYW5kIHsKK2VudW0gb2ZwX2dyb3VwX21vZF9jb21tYW5kKHdpcmVfdHlwZT11aW50MTZfdCkgewogICAgIE9GUEdDX0FERCA9IDAsCiAgICAgT0ZQR0NfTU9ESUZZID0gMSwKICAgICBPRlBHQ19ERUxFVEUgPSAyLAogfTsKIAotZW51bSBvZnBfZ3JvdXBfdHlwZSB7CitlbnVtIG9mcF9ncm91cF90eXBlKHdpcmVfdHlwZT11aW50OF90KSB7CiAgICAgT0ZQR1RfQUxMID0gMCwKICAgICBPRlBHVF9TRUxFQ1QgPSAxLAogICAgIE9GUEdUX0lORElSRUNUID0gMiwKICAgICBPRlBHVF9GRiA9IDMsCiB9OwogCi1lbnVtIG9mcF9wYWNrZXRfaW5fcmVhc29uIHsKK2VudW0gb2ZwX3BhY2tldF9pbl9yZWFzb24od2lyZV90eXBlPXVpbnQ4X3QpIHsKICAgICBPRlBSX05PX01BVENIID0gMCwKICAgICBPRlBSX0FDVElPTiA9IDEsCiAgICAgT0ZQUl9JTlZBTElEX1RUTCA9IDIsCiB9OwogCi1lbnVtIG9mcF9mbG93X3JlbW92ZWRfcmVhc29uIHsKK2VudW0gb2ZwX2Zsb3dfcmVtb3ZlZF9yZWFzb24od2lyZV90eXBlPXVpbnQ4X3QpIHsKICAgICBPRlBSUl9JRExFX1RJTUVPVVQgPSAwLAogICAgIE9GUFJSX0hBUkRfVElNRU9VVCA9IDEsCiAgICAgT0ZQUlJfREVMRVRFID0gMiwKICAgICBPRlBSUl9HUk9VUF9ERUxFVEUgPSAzLAogfTsKIAotZW51bSBvZnBfbWV0ZXIgeworZW51bSBvZnBfbWV0ZXIod2lyZV90eXBlPXVpbnQzMl90LCBjb21wbGV0ZT1GYWxzZSkgewogICAgIE9GUE1fTUFYID0gMHhmZmZmMDAwMCwKICAgICBPRlBNX1NMT1dQQVRIID0gMHhmZmZmZmZmZCwKICAgICBPRlBNX0NPTlRST0xMRVIgPSAweGZmZmZmZmZlLAogICAgIE9GUE1fQUxMID0gMHhmZmZmZmZmZiwKIH07CiAKLWVudW0gb2ZwX21ldGVyX2JhbmRfdHlwZSB7CitlbnVtIG9mcF9tZXRlcl9iYW5kX3R5cGUod2lyZV90eXBlPXVpbnQxNl90KSB7CiAgICAgT0ZQTUJUX0RST1AgPSAweDEsCiAgICAgT0ZQTUJUX0RTQ1BfUkVNQVJLID0gMHgyLAogICAgIE9GUE1CVF9FWFBFUklNRU5URVIgPSAweGZmZmYsCiB9OwogCi1lbnVtIG9mcF9tZXRlcl9tb2RfY29tbWFuZCB7CitlbnVtIG9mcF9tZXRlcl9tb2RfY29tbWFuZCh3aXJlX3R5cGU9dWludDE2X3QpIHsKICAgICBPRlBNQ19BREQgPSAwLAogICAgIE9GUE1DX01PRElGWSA9IDEsCiAgICAgT0ZQTUNfREVMRVRFID0gMiwKIH07CiAKLWVudW0gb2ZwX21ldGVyX2ZsYWdzIHsKK2VudW0gb2ZwX21ldGVyX2ZsYWdzKHdpcmVfdHlwZT11aW50MTZfdCwgYml0bWFzaz1UcnVlKSB7CiAgICAgT0ZQTUZfS0JQUyA9IDB4MSwKICAgICBPRlBNRl9QS1RQUyA9IDB4MiwKICAgICBPRlBNRl9CVVJTVCA9IDB4NCwKICAgICBPRlBNRl9TVEFUUyA9IDB4OCwKIH07CiAKLWVudW0gb2ZwX2Vycm9yX3R5cGUgeworZW51bSBvZnBfZXJyb3JfdHlwZSh3aXJlX3R5cGU9dWludDE2X3QpIHsKICAgICBPRlBFVF9IRUxMT19GQUlMRUQgPSAwLAogICAgIE9GUEVUX0JBRF9SRVFVRVNUID0gMSwKICAgICBPRlBFVF9CQURfQUNUSU9OID0gMiwKQEAgLTMyNiwxMiArMzI4LDEyIEBACiAgICAgT0ZQRVRfRVhQRVJJTUVOVEVSID0gMHhmZmZmLAogfTsKIAotZW51bSBvZnBfaGVsbG9fZmFpbGVkX2NvZGUgeworZW51bSBvZnBfaGVsbG9fZmFpbGVkX2NvZGUod2lyZV90eXBlPXVpbnQxNl90KSB7CiAgICAgT0ZQSEZDX0lOQ09NUEFUSUJMRSA9IDAsCiAgICAgT0ZQSEZDX0VQRVJNID0gMSwKIH07CiAKLWVudW0gb2ZwX2JhZF9yZXF1ZXN0X2NvZGUgeworZW51bSBvZnBfYmFkX3JlcXVlc3RfY29kZSh3aXJlX3R5cGU9dWludDE2X3QpIHsKICAgICBPRlBCUkNfQkFEX1ZFUlNJT04gPSAwLAogICAgIE9GUEJSQ19CQURfVFlQRSA9IDEsCiAgICAgT0ZQQlJDX0JBRF9NVUxUSVBBUlQgPSAyLApAQCAtMzQ4LDcgKzM1MCw3IEBACiAgICAgT0ZQQlJDX01VTFRJUEFSVF9CVUZGRVJfT1ZFUkZMT1cgPSAxMywKIH07CiAKLWVudW0gb2ZwX2JhZF9hY3Rpb25fY29kZSB7CitlbnVtIG9mcF9iYWRfYWN0aW9uX2NvZGUod2lyZV90eXBlPXVpbnQxNl90KSB7CiAgICAgT0ZQQkFDX0JBRF9UWVBFID0gMCwKICAgICBPRlBCQUNfQkFEX0xFTiA9IDEsCiAgICAgT0ZQQkFDX0JBRF9FWFBFUklNRU5URVIgPSAyLApAQCAtMzY3LDcgKzM2OSw3IEBACiAgICAgT0ZQQkFDX0JBRF9TRVRfQVJHVU1FTlQgPSAxNSwKIH07CiAKLWVudW0gb2ZwX2JhZF9pbnN0cnVjdGlvbl9jb2RlIHsKK2VudW0gb2ZwX2JhZF9pbnN0cnVjdGlvbl9jb2RlKHdpcmVfdHlwZT11aW50MTZfdCkgewogICAgIE9GUEJJQ19VTktOT1dOX0lOU1QgPSAwLAogICAgIE9GUEJJQ19VTlNVUF9JTlNUID0gMSwKICAgICBPRlBCSUNfQkFEX1RBQkxFX0lEID0gMiwKQEAgLTM3OSw3ICszODEsNyBAQAogICAgIE9GUEJJQ19FUEVSTSA9IDgsCiB9OwogCi1lbnVtIG9mcF9iYWRfbWF0Y2hfY29kZSB7CitlbnVtIG9mcF9iYWRfbWF0Y2hfY29kZSh3aXJlX3R5cGU9dWludDE2X3QpIHsKICAgICBPRlBCTUNfQkFEX1RZUEUgPSAwLAogICAgIE9GUEJNQ19CQURfTEVOID0gMSwKICAgICBPRlBCTUNfQkFEX1RBRyA9IDIsCkBAIC0zOTQsNyArMzk2LDcgQEAKICAgICBPRlBCTUNfRVBFUk0gPSAxMSwKIH07CiAKLWVudW0gb2ZwX2Zsb3dfbW9kX2ZhaWxlZF9jb2RlIHsKK2VudW0gb2ZwX2Zsb3dfbW9kX2ZhaWxlZF9jb2RlKHdpcmVfdHlwZT11aW50MTZfdCkgewogICAgIE9GUEZNRkNfVU5LTk9XTiA9IDAsCiAgICAgT0ZQRk1GQ19UQUJMRV9GVUxMID0gMSwKICAgICBPRlBGTUZDX0JBRF9UQUJMRV9JRCA9IDIsCkBAIC00MDUsNyArNDA3LDcgQEAKICAgICBPRlBGTUZDX0JBRF9GTEFHUyA9IDcsCiB9OwogCi1lbnVtIG9mcF9ncm91cF9tb2RfZmFpbGVkX2NvZGUgeworZW51bSBvZnBfZ3JvdXBfbW9kX2ZhaWxlZF9jb2RlKHdpcmVfdHlwZT11aW50MTZfdCkgewogICAgIE9GUEdNRkNfR1JPVVBfRVhJU1RTID0gMCwKICAgICBPRlBHTUZDX0lOVkFMSURfR1JPVVAgPSAxLAogICAgIE9GUEdNRkNfV0VJR0hUX1VOU1VQUE9SVEVEID0gMiwKQEAgLTQyMyw3ICs0MjUsNyBAQAogICAgIE9GUEdNRkNfRVBFUk0gPSAxNCwKIH07CiAKLWVudW0gb2ZwX3BvcnRfbW9kX2ZhaWxlZF9jb2RlIHsKK2VudW0gb2ZwX3BvcnRfbW9kX2ZhaWxlZF9jb2RlKHdpcmVfdHlwZT11aW50MTZfdCkgewogICAgIE9GUFBNRkNfQkFEX1BPUlQgPSAwLAogICAgIE9GUFBNRkNfQkFEX0hXX0FERFIgPSAxLAogICAgIE9GUFBNRkNfQkFEX0NPTkZJRyA9IDIsCkBAIC00MzEsMzEgKzQzMywzMSBAQAogICAgIE9GUFBNRkNfRVBFUk0gPSA0LAogfTsKIAotZW51bSBvZnBfdGFibGVfbW9kX2ZhaWxlZF9jb2RlIHsKK2VudW0gb2ZwX3RhYmxlX21vZF9mYWlsZWRfY29kZSh3aXJlX3R5cGU9dWludDE2X3QpIHsKICAgICBPRlBUTUZDX0JBRF9UQUJMRSA9IDAsCiAgICAgT0ZQVE1GQ19CQURfQ09ORklHID0gMSwKICAgICBPRlBUTUZDX0VQRVJNID0gMiwKIH07CiAKLWVudW0gb2ZwX3F1ZXVlX29wX2ZhaWxlZF9jb2RlIHsKK2VudW0gb2ZwX3F1ZXVlX29wX2ZhaWxlZF9jb2RlKHdpcmVfdHlwZT11aW50MTZfdCkgewogICAgIE9GUFFPRkNfQkFEX1BPUlQgPSAwLAogICAgIE9GUFFPRkNfQkFEX1FVRVVFID0gMSwKICAgICBPRlBRT0ZDX0VQRVJNID0gMiwKIH07CiAKLWVudW0gb2ZwX3N3aXRjaF9jb25maWdfZmFpbGVkX2NvZGUgeworZW51bSBvZnBfc3dpdGNoX2NvbmZpZ19mYWlsZWRfY29kZSh3aXJlX3R5cGU9dWludDE2X3QpIHsKICAgICBPRlBTQ0ZDX0JBRF9GTEFHUyA9IDAsCiAgICAgT0ZQU0NGQ19CQURfTEVOID0gMSwKICAgICBPRlBTQ0ZDX0VQRVJNID0gMiwKIH07CiAKLWVudW0gb2ZwX3JvbGVfcmVxdWVzdF9mYWlsZWRfY29kZSB7CitlbnVtIG9mcF9yb2xlX3JlcXVlc3RfZmFpbGVkX2NvZGUod2lyZV90eXBlPXVpbnQxNl90KXsKICAgICBPRlBSUkZDX1NUQUxFID0gMCwKICAgICBPRlBSUkZDX1VOU1VQID0gMSwKICAgICBPRlBSUkZDX0JBRF9ST0xFID0gMiwKIH07CiAKLWVudW0gb2ZwX21ldGVyX21vZF9mYWlsZWRfY29kZSB7CitlbnVtIG9mcF9tZXRlcl9tb2RfZmFpbGVkX2NvZGUod2lyZV90eXBlPXVpbnQxNl90KSB7CiAgICAgT0ZQTU1GQ19VTktOT1dOID0gMCwKICAgICBPRlBNTUZDX01FVEVSX0VYSVNUUyA9IDEsCiAgICAgT0ZQTU1GQ19JTlZBTElEX01FVEVSID0gMiwKQEAgLTQ3MCw3ICs0NzIsNyBAQAogICAgIE9GUE1NRkNfT1VUX09GX0JBTkRTID0gMTEsCiB9OwogCi1lbnVtIG9mcF90YWJsZV9mZWF0dXJlc19mYWlsZWRfY29kZSB7CitlbnVtIG9mcF90YWJsZV9mZWF0dXJlc19mYWlsZWRfY29kZSh3aXJlX3R5cGU9dWludDE2X3QpIHsKICAgICBPRlBURkZDX0JBRF9UQUJMRSA9IDAsCiAgICAgT0ZQVEZGQ19CQURfTUVUQURBVEEgPSAxLAogICAgIE9GUFRGRkNfQkFEX1RZUEUgPSAyLApAQCAtNDc5LDcgKzQ4MSw3IEBACiAgICAgT0ZQVEZGQ19FUEVSTSA9IDUsCiB9OwogCi1lbnVtIG9mcF9tdWx0aXBhcnRfdHlwZXMgeworZW51bSBvZnBfbXVsdGlwYXJ0X3R5cGVzKHdpcmVfdHlwZT11aW50MTZfdCkgewogICAgIE9GUE1QX0RFU0MgPSAwLAogICAgIE9GUE1QX0ZMT1cgPSAxLAogICAgIE9GUE1QX0FHR1JFR0FURSA9IDIsCkBAIC00OTcsMTUgKzQ5OSwxNSBAQAogICAgIE9GUE1QX0VYUEVSSU1FTlRFUiA9IDB4ZmZmZiwKIH07CiAKLWVudW0gb2ZwX211bHRpcGFydF9yZXF1ZXN0X2ZsYWdzIHsKK2VudW0gb2ZwX211bHRpcGFydF9yZXF1ZXN0X2ZsYWdzKHdpcmVfdHlwZT11aW50MTZfdCwgYml0bWFzaz1UcnVlKSB7CiAgICAgT0ZQTVBGX1JFUV9NT1JFID0gMHgxLAogfTsKIAotZW51bSBvZnBfbXVsdGlwYXJ0X3JlcGx5X2ZsYWdzIHsKK2VudW0gb2ZwX211bHRpcGFydF9yZXBseV9mbGFncyh3aXJlX3R5cGU9dWludDE2X3QsIGJpdG1hc2s9VHJ1ZSkgewogICAgIE9GUE1QRl9SRVBMWV9NT1JFID0gMHgxLAogfTsKIAotZW51bSBvZnBfdGFibGVfZmVhdHVyZV9wcm9wX3R5cGUgeworZW51bSBvZnBfdGFibGVfZmVhdHVyZV9wcm9wX3R5cGUod2lyZV90eXBlPXVpbnQxNl90KSB7CiAgICAgT0ZQVEZQVF9JTlNUUlVDVElPTlMgPSAwLAogICAgIE9GUFRGUFRfSU5TVFJVQ1RJT05TX01JU1MgPSAxLAogICAgIE9GUFRGUFRfTkVYVF9UQUJMRVMgPSAyLApAQCAtNTI0LDM0ICs1MjYsMzQgQEAKICAgICBPRlBURlBUX0VYUEVSSU1FTlRFUl9NSVNTID0gMHhmZmZmLAogfTsKIAotZW51bSBvZnBfZ3JvdXBfY2FwYWJpbGl0aWVzIHsKK2VudW0gb2ZwX2dyb3VwX2NhcGFiaWxpdGllcyh3aXJlX3R5cGU9dWludDMyX3QsIGJpdG1hc2s9VHJ1ZSkgewogICAgIE9GUEdGQ19TRUxFQ1RfV0VJR0hUID0gMHgxLAogICAgIE9GUEdGQ19TRUxFQ1RfTElWRU5FU1MgPSAweDIsCiAgICAgT0ZQR0ZDX0NIQUlOSU5HID0gMHg0LAogICAgIE9GUEdGQ19DSEFJTklOR19DSEVDS1MgPSAweDgsCiB9OwogCi1lbnVtIG9mcF9xdWV1ZV9wcm9wZXJ0aWVzIHsKK2VudW0gb2ZwX3F1ZXVlX3Byb3BlcnRpZXMod2lyZV90eXBlPXVpbnQxNl90KSB7CiAgICAgT0ZQUVRfTUlOX1JBVEUgPSAweDEsCiAgICAgT0ZQUVRfTUFYX1JBVEUgPSAweDIsCiAgICAgT0ZQUVRfRVhQRVJJTUVOVEVSID0gMHhmZmZmLAogfTsKIAotZW51bSBvZnBfY29udHJvbGxlcl9yb2xlIHsKK2VudW0gb2ZwX2NvbnRyb2xsZXJfcm9sZSh3aXJlX3R5cGU9dWludDMyX3QpIHsKICAgICBPRlBDUl9ST0xFX05PQ0hBTkdFID0gMCwKICAgICBPRlBDUl9ST0xFX0VRVUFMID0gMSwKICAgICBPRlBDUl9ST0xFX01BU1RFUiA9IDIsCiAgICAgT0ZQQ1JfUk9MRV9TTEFWRSA9IDMsCiB9OwogCi1lbnVtIG9mcF9oZWxsb19lbGVtX3R5cGUgeworZW51bSBvZnBfaGVsbG9fZWxlbV90eXBlKHdpcmVfdHlwZT11aW50MTZfdCkgewogICAgIE9GUEhFVF9WRVJTSU9OQklUTUFQID0gMSwKIH07CiAKIC8qIFhYWCByZW5hbWUgdG8gb2ZfbWVzc2FnZSAqLwogc3RydWN0IG9mX2hlYWRlciB7CiAgICAgdWludDhfdCB2ZXJzaW9uOwotICAgIHVpbnQ4X3QgdHlwZTsKKyAgICB1aW50OF90IHR5cGUgPT0gPzsKICAgICB1aW50MTZfdCBsZW5ndGg7CiAgICAgdWludDMyX3QgeGlkOwogfTsKQEAgLTcyMyw3ICs3MjUsNyBAQAogfTsKIAogLy8gRklYTUUgRG9lcyB0aGlzIG5lZWQgdG8gYmUgdjQ/Ci1zdHJ1Y3Qgb2ZfbWF0Y2hfdjMgeworc3RydWN0IG9mX21hdGNoX3YzKGFsaWduPTgpIHsKICAgICB1aW50MTZfdCB0eXBlID09IDE7CiAgICAgdWludDE2X3QgbGVuZ3RoOwogICAgIGxpc3Qob2Zfb3htX3QpIG94bV9saXN0OwpAQCAtODQ5LDEzICs4NTEsMTMgQEAKIH07CiAKIHN0cnVjdCBvZl9hY3Rpb24gewotICAgIHVpbnQxNl90IHR5cGU7CisgICAgdWludDE2X3QgdHlwZSA9PSA/OwogICAgIHVpbnQxNl90IGxlbjsKICAgICBwYWQoNCk7CiB9OwogCiBzdHJ1Y3Qgb2ZfaW5zdHJ1Y3Rpb24gewotICAgIHVpbnQxNl90IHR5cGU7CisgICAgdWludDE2X3QgdHlwZSA9PSA/OwogICAgIHVpbnQxNl90IGxlbjsKIH07CiAKQEAgLTkxNSw3ICs5MTcsNyBAQAogICAgIHVpbnQ2NF90IGNvb2tpZTsKICAgICB1aW50NjRfdCBjb29raWVfbWFzazsKICAgICB1aW50OF90IHRhYmxlX2lkOwotICAgIG9mX2ZtX2NtZF90IF9jb21tYW5kOworICAgIG9mX2ZtX2NtZF90IF9jb21tYW5kID09ID87CiAgICAgdWludDE2X3QgaWRsZV90aW1lb3V0OwogICAgIHVpbnQxNl90IGhhcmRfdGltZW91dDsKICAgICB1aW50MTZfdCBwcmlvcml0eTsKQEAgLTEyNTUsNyArMTI1Nyw3IEBACiAgICAgdWludDhfdCB0eXBlID09IDE4OwogICAgIHVpbnQxNl90IGxlbmd0aDsKICAgICB1aW50MzJfdCB4aWQ7Ci0gICAgdWludDE2X3Qgc3RhdHNfdHlwZTsKKyAgICB1aW50MTZfdCBzdGF0c190eXBlID09ID87CiAgICAgdWludDE2X3QgZmxhZ3M7CiAgICAgcGFkKDQpOwogfTsKQEAgLTEyNjUsNyArMTI2Nyw3IEBACiAgICAgdWludDhfdCB0eXBlID09IDE5OwogICAgIHVpbnQxNl90IGxlbmd0aDsKICAgICB1aW50MzJfdCB4aWQ7Ci0gICAgdWludDE2X3Qgc3RhdHNfdHlwZTsKKyAgICB1aW50MTZfdCBzdGF0c190eXBlID09ID87CiAgICAgdWludDE2X3QgZmxhZ3M7CiAgICAgcGFkKDQpOwogfTsKQEAgLTE3NzUsNyArMTc3Nyw3IEBACiAvLyBFTkQgT0YgU1RBVFMgT0JKRUNUUwogCiBzdHJ1Y3Qgb2ZfcXVldWVfcHJvcCB7Ci0gICAgdWludDE2X3QgdHlwZTsKKyAgICB1aW50MTZfdCB0eXBlID09ID87CiAgICAgdWludDE2X3QgbGVuOwogICAgIHBhZCg0KTsKIH07CmRpZmYgLS1naXQgYS90ZXN0X2RhdGEvX19pbml0X18ucHkgYi90ZXN0X2RhdGEvX19pbml0X18ucHkKaW5kZXggZjIxNzcwYi4uN2E1NWMxMSAxMDA2NDQKLS0tIGEvdGVzdF9kYXRhL19faW5pdF9fLnB5CisrKyBiL3Rlc3RfZGF0YS9fX2luaXRfXy5weQpAQCAtNDUsNiArNDUsOSBAQAogICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoZGlybmFtZSArICcvJyArIGZpbGVuYW1lKQogICAgIHJldHVybiBzb3J0ZWQocmVzdWx0KQogCitkZWYgZXhpc3RzKG5hbWUpOgorICAgIHJldHVybiBvcy5wYXRoLmV4aXN0cyhvcy5wYXRoLmpvaW4oX3Rlc3RfZGF0YV9kaXIsIG5hbWUpKQorCiBkZWYgcmVhZChuYW1lKToKICAgICAiIiIKICAgICBSZWFkLCBwYXJzZSwgYW5kIHJldHVybiBhIHRlc3QgZGF0YSBmaWxlCmRpZmYgLS1naXQgYS90ZXN0X2RhdGEvb2YxMC9oZWxsby5kYXRhIGIvdGVzdF9kYXRhL29mMTAvaGVsbG8uZGF0YQppbmRleCAzZGMyYjQ0Li5kMjlkZmY5IDEwMDY0NAotLS0gYS90ZXN0X2RhdGEvb2YxMC9oZWxsby5kYXRhCisrKyBiL3Rlc3RfZGF0YS9vZjEwL2hlbGxvLmRhdGEKQEAgLTcsMyArNyw1IEBACiAtLSBjCiBvYmogPSBvZl9oZWxsb19uZXcoT0ZfVkVSU0lPTl8xXzApOwogb2ZfaGVsbG9feGlkX3NldChvYmosIDMwNTQxOTg5Nik7CistLSBqYXZhCitidWlsZGVyLnNldFhpZCgweDEyMzQ1Njc4KQpkaWZmIC0tZ2l0IGEvdGVzdF9kYXRhL29mMTAvcGFja2V0X2luLmRhdGEgYi90ZXN0X2RhdGEvb2YxMC9wYWNrZXRfaW4uZGF0YQppbmRleCA4MTY4ZTNiLi4yY2Q5OGIwIDEwMDY0NAotLS0gYS90ZXN0X2RhdGEvb2YxMC9wYWNrZXRfaW4uZGF0YQorKysgYi90ZXN0X2RhdGEvb2YxMC9wYWNrZXRfaW4uZGF0YQpAQCAtMjcsMyArMjcsMTEgQEAKIG9mX3BhY2tldF9pbl9yZWFzb25fc2V0KG9iaiwgMSk7CiBvZl9wYWNrZXRfaW5fdG90YWxfbGVuX3NldChvYmosIDkpOwogb2ZfcGFja2V0X2luX3hpZF9zZXQob2JqLCAzMDU0MTk4OTYpOworLS0gamF2YQorYnVpbGRlcgorICAgLnNldFhpZCgweDEyMzQ1Njc4KQorICAgLnNldEJ1ZmZlcklkKDB4YWJjZGVmMDEpCisgICAuc2V0VG90YWxMZW4oOSkKKyAgIC5zZXRJblBvcnQoT0ZQb3J0LkxPQ0FMKQorICAgLnNldFJlYXNvbihPRlBhY2tldEluUmVhc29uLkFDVElPTikKKyAgIC5zZXREYXRhKG5ldyBieXRlW10geyAweDYxLCAweDYyLCAweDYzIH0gKTsKZGlmZiAtLWdpdCBhL3Rlc3RfZGF0YS9vZjEzL2Zsb3dfYWRkLmRhdGEgYi90ZXN0X2RhdGEvb2YxMy9mbG93X2FkZC5kYXRhCmluZGV4IGM2NjUxOGYuLmQwMWMyMDkgMTAwNjQ0Ci0tLSBhL3Rlc3RfZGF0YS9vZjEzL2Zsb3dfYWRkLmRhdGEKKysrIGIvdGVzdF9kYXRhL29mMTMvZmxvd19hZGQuZGF0YQpAQCAtNTAsMyArNTAsMjMgQEAKICAgICBpbnN0cnVjdGlvbnM9WwogICAgICAgICBvZnAuaW5zdHJ1Y3Rpb24uZ290b190YWJsZSh0YWJsZV9pZD00KSwKICAgICAgICAgb2ZwLmluc3RydWN0aW9uLmdvdG9fdGFibGUodGFibGVfaWQ9NyldKQorLS0gamF2YQorYnVpbGRlci5zZXRYaWQoMHgxMjM0NTY3OCkKKyAgICAuc2V0Q29va2llKFU2NC5wYXJzZUhleCgiRkVEQ0JBOTg3NjU0MzIxMCIpKQorICAgIC5zZXRDb29raWVNYXNrKFU2NC5wYXJzZUhleCgiRkYwMEZGMDBGRjAwRkYwMCIpKQorICAgIC5zZXRUYWJsZUlkKChieXRlKSAzKQorICAgIC5zZXRJZGxlVGltZW91dCg1KQorICAgIC5zZXRIYXJkVGltZW91dCgxMCkKKyAgICAuc2V0UHJpb3JpdHkoNjAwMCkKKyAgICAuc2V0QnVmZmVySWQoNTApCisgICAgLnNldE91dFBvcnQoT0ZQb3J0Lm9mKDYpKQorICAgIC5zZXRPdXRHcm91cCg4KQorICAgIC5zZXRGbGFncygwKQorICAgIC5zZXRNYXRjaChmYWN0b3J5LmNyZWF0ZU1hdGNoVjNCdWlsZGVyKCkuZ2V0TWVzc2FnZSgpKSAvLyBGSVhNRTogQHlvdGFtOiByZXBsYWNlIG9uY2Ugd2UgaGF2ZSBnZW5lcmljIG9mbWF0Y2gKKyAgICAuc2V0SW5zdHJ1Y3Rpb25zKAorICAgICAgICBJbW11dGFibGVMaXN0LjxPRkluc3RydWN0aW9uPm9mKAorICAgICAgICAgICAgZmFjdG9yeS5jcmVhdGVJbnN0cnVjdGlvbkdvdG9UYWJsZUJ1aWxkZXIoKS5zZXRUYWJsZUlkKChieXRlKSA0KS5nZXRNZXNzYWdlKCksCisgICAgICAgICAgICBmYWN0b3J5LmNyZWF0ZUluc3RydWN0aW9uR290b1RhYmxlQnVpbGRlcigpLnNldFRhYmxlSWQoKGJ5dGUpIDcpLmdldE1lc3NhZ2UoKQorICAgICAgICApCisgICAgKTsKKwo=