ZGlmZiAtLWdpdCBhL1JFQURNRS5tZCBiL1JFQURNRS5tZAppbmRleCA2M2I5MWYzLi4xYzc0NTdmIDEwMDY0NAotLS0gYS9SRUFETUUubWQKKysrIGIvUkVBRE1FLm1kCkBAIC0xMSw3ICsxMSw3IEBACiA9PT09PQogCiBZb3UgY2FuIHJ1biBMb3hpR2VuIGRpcmVjdGx5IGZyb20gdGhlIHJlcG9zaXRvcnkuIFRoZXJlJ3Mgbm8gbmVlZCB0byBpbnN0YWxsIGl0LAotYW5kIGl0IGhhcyBubyBkZXBlbmRlbmNpZXMgYmV5b25kIFB5dGhvbiAyLjYrLgorYW5kIGl0IGhhcyBubyBkZXBlbmRlbmNpZXMgYmV5b25kIFB5dGhvbiAyLjcrLgogCiBUbyBnZW5lcmF0ZSB0aGUgbGlicmFyaWVzIGZvciBhbGwgbGFuZ3VhZ2VzOgogCmRpZmYgLS1naXQgYS9jX2dlbi9jX21hdGNoLnB5IGIvY19nZW4vY19tYXRjaC5weQppbmRleCA4YmVmYjNmLi43MzUzYWU3IDEwMDY0NAotLS0gYS9jX2dlbi9jX21hdGNoLnB5CisrKyBiL2NfZ2VuL2NfbWF0Y2gucHkKQEAgLTE3OCw2ICsxNzgsMTggQEAKIH0gb2ZfbWF0Y2hfdDsKIAogLyoqCisgKiBNYXNrIHRoZSB2YWx1ZXMgaW4gdGhlIG1hdGNoIHN0cnVjdHVyZSBhY2NvcmRpbmcgdG8gaXRzIGZpZWxkcworICovCitzdGF0aWMgaW5saW5lIHZvaWQgb2ZfbWF0Y2hfdmFsdWVzX21hc2sob2ZfbWF0Y2hfdCAqbWF0Y2gpCit7CisgICAgaW50IGlkeDsKKworICAgIGZvciAoaWR4ID0gMDsgaWR4IDwgc2l6ZW9mKG9mX21hdGNoX2ZpZWxkc190KTsgaWR4KyspIHsKKyAgICAgICAgKCh1aW50OF90ICopJm1hdGNoLT5maWVsZHMpW2lkeF0gJj0gKCh1aW50OF90ICopJm1hdGNoLT5tYXNrcylbaWR4XTsKKyAgICB9Cit9CisKKy8qKgogICogSVAgTWFzayBtYXAuICBJUCBtYWtzIHdpbGRjYXJkcyBmcm9tIE9GIDEuMCBhcmUgaW50ZXJwcmV0dGVkIGFzCiAgKiBpbmRpY2VzIGludG8gdGhlIG1hcCBiZWxvdy4KICAqCkBAIC02ODIsMjYgKzY5NCwxNCBAQAogCiAgICAgb2ZfbWF0Y2hfdjFfd2lsZGNhcmRzX2dldChzcmMsICZ3Yyk7CiAiIiIpCi0gICAgIyBEZWFsIHdpdGggbncgZmllbGRzIGZpcnN0Ci0gICAgb3V0LndyaXRlKCIiIgotICAgIC8qIEhhbmRsZSBMMyBzcmMgYW5kIGRzdCB3aWxkY2FyZGluZyBmaXJzdCAqLwotICAgIC8qIEBmaXhtZSBDaGVjayBtYXNrIHZhbHVlcyBhcmUgcHJvcGVybHkgdHJlYXRlZCBmb3IgaXB2NCBzcmMvZHN0ICovCi0gICAgaWYgKChjb3VudCA9IE9GX01BVENIX1YxX1dDX0lQVjRfRFNUX0dFVCh3YykpIDwgMzIpIHsKLSAgICAgICAgb2ZfbWF0Y2hfdjFfaXB2NF9kc3RfZ2V0KHNyYywgJmRzdC0+ZmllbGRzLmlwdjRfZHN0KTsKLSAgICAgICAgaWYgKGNvdW50ID4gMCkgeyAvKiBOb3QgZXhhY3QgbWF0Y2ggKi8KLSAgICAgICAgICAgIGRzdC0+bWFza3MuaXB2NF9kc3QgPSB+KCgodWludDMyX3QpMSA8PCBjb3VudCkgLSAxKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIE9GX01BVENIX01BU0tfSVBWNF9EU1RfRVhBQ1RfU0VUKGRzdCk7Ci0gICAgICAgIH0KLSAgICB9Ci0iIiIpCiAgICAgZm9yIGtleSBpbiBzb3J0ZWQobWF0Y2gub2ZfdjFfa2V5cyk6CiAgICAgICAgIGlmIGtleSBpbiBbImlwdjRfc3JjIiwgImlwdjRfZHN0Il06ICMgU3BlY2lhbCBjYXNlcyBmb3IgbWFza3MgaGVyZQogICAgICAgICAgICAgb3V0LndyaXRlKCIiIgogICAgIGNvdW50ID0gT0ZfTUFUQ0hfVjFfV0NfJShrdSlzX0dFVCh3Yyk7CiAgICAgZHN0LT5tYXNrcy4lKGtleSlzID0gb2ZfaXBfaW5kZXhfdG9fbWFzayhjb3VudCk7Ci0gICAgLyogQHRvZG8gUmV2aWV3IGlmIHdlIHNob3VsZCBvbmx5IGdldCB0aGUgYWRkciB3aGVuIG1hc2tzLiUoa2V5KXMgIT0gMCAqLwogICAgIG9mX21hdGNoX3YxXyUoa2V5KXNfZ2V0KHNyYywgJmRzdC0+ZmllbGRzLiUoa2V5KXMpOworICAgIC8qIENsZWFyIHRoZSBiaXRzIG5vdCBpbmRpY2F0ZWQgYnkgbWFzazsgSVAgYWRkcnMgYXJlIHNwZWNpYWwgZm9yIDEuMCAqLworICAgIGRzdC0+ZmllbGRzLiUoa2V5KXMgJj0gZHN0LT5tYXNrcy4lKGtleSlzOwogIiIiICUgZGljdChrdT1rZXkudXBwZXIoKSwga2V5PWtleSkpCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBvdXQud3JpdGUoIiIiCkBAIC03NDksNiArNzQ5LDkgQEAKICIiIiAlIGRpY3Qoa3U9a2V5LnVwcGVyKCksIGtleT1rZXkpKQogCiAgICAgb3V0LndyaXRlKCIiIgorICAgIC8qIENsZWFyIHZhbHVlcyBvdXRzaWRlIG9mIG1hc2tzICovCisgICAgb2ZfbWF0Y2hfdmFsdWVzX21hc2soZHN0KTsKKwogICAgIHJldHVybiBPRl9FUlJPUl9OT05FOwogfQogIiIiKQpAQCAtODA4LDYgKzgxMSw5IEBACiAgICAgICAgIHJ2ID0gb2ZfbGlzdF9veG1fbmV4dCgmb3htX2xpc3QsICZveG1fZW50cnkpOwogICAgIH0gLyogZW5kIE9YTSBpdGVyYXRpb24gKi8KIAorICAgIC8qIENsZWFyIHZhbHVlcyBvdXRzaWRlIG9mIG1hc2tzICovCisgICAgb2ZfbWF0Y2hfdmFsdWVzX21hc2soZHN0KTsKKwogICAgIHJldHVybiBPRl9FUlJPUl9OT05FOwogfQogIiIiKQpkaWZmIC0tZ2l0IGEvY19nZW4vY190ZXN0X2dlbi5weSBiL2NfZ2VuL2NfdGVzdF9nZW4ucHkKaW5kZXggMTRhYjI0ZS4uZmFiOWY5NiAxMDA2NDQKLS0tIGEvY19nZW4vY190ZXN0X2dlbi5weQorKysgYi9jX2dlbi9jX3Rlc3RfZ2VuLnB5CkBAIC0yNjEsNiArMjYxLDkgQEAKICAgICAgICAgbWF0Y2gtPm1hc2tzLmlwdjRfc3JjID0gMHhmZmZmMDAwMDsKICAgICAgICAgbWF0Y2gtPm1hc2tzLmlwdjRfZHN0ID0gMHhmZmZmZjgwMDsKICAgICB9CisKKyAgICAvKiBSZXN0cmljdCB2YWx1ZXMgYWNjb3JkaW5nIHRvIG1hc2tzICovCisgICAgb2ZfbWF0Y2hfdmFsdWVzX21hc2sobWF0Y2gpOwogICAgIHJldHVybiB2YWx1ZTsKIH0KIApkaWZmIC0tZ2l0IGEvamF2YV9nZW4vY29kZWdlbi5weSBiL2phdmFfZ2VuL2NvZGVnZW4ucHkKaW5kZXggYmM5YjlhMC4uMWU2OGFjZCAxMDA2NDQKLS0tIGEvamF2YV9nZW4vY29kZWdlbi5weQorKysgYi9qYXZhX2dlbi9jb2RlZ2VuLnB5CkBAIC0xNDcsMTEgKzE0NywxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RfZGF0YT11bml0X3Rlc3QudGVzdF9kYXRhKQogCiAgICAgZGVmIGNyZWF0ZV9vZl9mYWN0b3JpZXMoc2VsZik6Ci0gICAgICAgIGZhY3RvcnkgPSBzZWxmLmphdmFfbW9kZWwub2ZfZmFjdG9yeQotICAgICAgICBzZWxmLnJlbmRlcl9jbGFzcyhjbGF6ej1mYWN0b3J5LCB0ZW1wbGF0ZT0ib2ZfZmFjdG9yeV9pbnRlcmZhY2UuamF2YSIsIGZhY3Rvcnk9ZmFjdG9yeSkKLSAgICAgICAgZm9yIGZhY3RvcnlfY2xhc3MgaW4gZmFjdG9yeS5mYWN0b3J5X2NsYXNzZXM6Ci0gICAgICAgICAgICBzZWxmLnJlbmRlcl9jbGFzcyhjbGF6ej1mYWN0b3J5X2NsYXNzLCB0ZW1wbGF0ZT0ib2ZfZmFjdG9yeV9jbGFzcy5qYXZhIiwgZmFjdG9yeT1mYWN0b3J5X2NsYXNzLCBtb2RlbD1zZWxmLmphdmFfbW9kZWwpCi0gICAgICAgIHNlbGYucmVuZGVyX2NsYXNzKGNsYXp6PWphdmFfbW9kZWwuT0ZHZW5lcmljQ2xhc3MocGFja2FnZT0ib3JnLm9wZW5mbG93LnByb3RvY29sIiwgbmFtZT0iT0ZGYWN0b3JpZXMiKSwgdGVtcGxhdGU9Im9mX2ZhY3Rvcmllcy5qYXZhIiwgdmVyc2lvbnM9c2VsZi5qYXZhX21vZGVsLnZlcnNpb25zKQorICAgICAgICBmb3IgZmFjdG9yeSBpbiBzZWxmLmphdmFfbW9kZWwub2ZfZmFjdG9yaWVzOgorICAgICAgICAgICAgc2VsZi5yZW5kZXJfY2xhc3MoY2xheno9ZmFjdG9yeSwgdGVtcGxhdGU9Im9mX2ZhY3RvcnlfaW50ZXJmYWNlLmphdmEiLCBmYWN0b3J5PWZhY3RvcnkpCisgICAgICAgICAgICBmb3IgZmFjdG9yeV9jbGFzcyBpbiBmYWN0b3J5LmZhY3RvcnlfY2xhc3NlczoKKyAgICAgICAgICAgICAgICBzZWxmLnJlbmRlcl9jbGFzcyhjbGF6ej1mYWN0b3J5X2NsYXNzLCB0ZW1wbGF0ZT0ib2ZfZmFjdG9yeV9jbGFzcy5qYXZhIiwgZmFjdG9yeT1mYWN0b3J5X2NsYXNzLCBtb2RlbD1zZWxmLmphdmFfbW9kZWwpCisgICAgICAgICAgICBzZWxmLnJlbmRlcl9jbGFzcyhjbGF6ej1qYXZhX21vZGVsLk9GR2VuZXJpY0NsYXNzKHBhY2thZ2U9Im9yZy5vcGVuZmxvdy5wcm90b2NvbCIsIG5hbWU9Ik9GRmFjdG9yaWVzIiksIHRlbXBsYXRlPSJvZl9mYWN0b3JpZXMuamF2YSIsIHZlcnNpb25zPXNlbGYuamF2YV9tb2RlbC52ZXJzaW9ucykKIAogZGVmIGNvcHlfcHJld3JpdGVfdHJlZShiYXNlZGlyKToKICAgICAiIiIgUmVjdXJzaXZlbHkgY29weSB0aGUgZGlyZWN0b3J5IHN0cnVjdHVyZSBmcm9tIC4vamF2YV9nZW4vcHJlLXdyaXRlCmRpZmYgLS1naXQgYS9qYXZhX2dlbi9qYXZhX21vZGVsLnB5IGIvamF2YV9nZW4vamF2YV9tb2RlbC5weQppbmRleCA2NmVlYWNkLi45NDRiNTM2IDEwMDY0NAotLS0gYS9qYXZhX2dlbi9qYXZhX21vZGVsLnB5CisrKyBiL2phdmFfZ2VuL2phdmFfbW9kZWwucHkKQEAgLTQ0LDYgKzQ0LDcgQEAKIGltcG9ydCB0ZXN0X2RhdGEKIAogaW1wb3J0IGphdmFfZ2VuLmphdmFfdHlwZSBhcyBqYXZhX3R5cGUKK2Zyb20gamF2YV9nZW4uamF2YV90eXBlIGltcG9ydCBlcmFzZV90eXBlX2Fubm90YXRpb24KIAogY2xhc3MgSmF2YU1vZGVsKG9iamVjdCk6CiAgICAgZW51bV9ibGFja2xpc3QgPSBzZXQoKCJPRkRlZmluaXRpb25zIiwpKQpAQCAtNTMsNiArNTQsOSBAQAogICAgIHdyaXRlX2JsYWNrbGlzdCA9IGRlZmF1bHRkaWN0KGxhbWJkYTogc2V0KCksIE9GT3htPXNldCgoJ3R5cGVMZW4nLCkpLCBPRkFjdGlvbj1zZXQoKCd0eXBlJywpKSwgT0ZJbnN0cnVjdGlvbj1zZXQoKCd0eXBlJywpKSwgT0ZGbG93TW9kPXNldCgoJ2NvbW1hbmQnLCApKSkKICAgICB2aXJ0dWFsX2ludGVyZmFjZXMgPSBzZXQoWydPRk94bScsICdPRkluc3RydWN0aW9uJywgJ09GRmxvd01vZCcsICdPRkJzblZwb3J0JyBdKQogCisgICAgT3htTWFwRW50cnkgPSBuYW1lZHR1cGxlKCJPeG1NYXBFbnRyeSIsIFsidHlwZV9uYW1lIiwgInZhbHVlIiwgIm1hc2tlZCIgXSkKKyAgICBveG1fbWFwID0geyAiT0ZPeG1JblBvcnRNYXNrZWQiOiBPeG1NYXBFbnRyeSgiT0ZQb3J0IiwgIklOX1BPUlQiLCBUcnVlKSB9CisKICAgICBAcHJvcGVydHkKICAgICBAbWVtb2l6ZQogICAgIGRlZiB2ZXJzaW9ucyhzZWxmKToKQEAgLTgwLDYgKzg0LDEwIEBACiAKICAgICAgICAgcmV0dXJuIGludGVyZmFjZXMKIAorICAgIEBtZW1vaXplCisgICAgZGVmIGludGVyZmFjZV9ieV9uYW1lKHNlbGYsIG5hbWUpOgorICAgICAgICByZXR1cm4gZmluZChsYW1iZGEgaTogZXJhc2VfdHlwZV9hbm5vdGF0aW9uKGkubmFtZSkgPT0gZXJhc2VfdHlwZV9hbm5vdGF0aW9uKG5hbWUpLCBzZWxmLmludGVyZmFjZXMpCisKICAgICBAcHJvcGVydHkKICAgICBAbWVtb2l6ZQogICAgIGRlZiBhbGxfY2xhc3NlcyhzZWxmKToKQEAgLTExMSwxMSArMTE5LDQwIEBACiAKICAgICBAcHJvcGVydHkKICAgICBAbWVtb2l6ZQotICAgIGRlZiBvZl9mYWN0b3J5KHNlbGYpOgotICAgICAgICAgICByZXR1cm4gT0ZGYWN0b3J5KAotICAgICAgICAgICAgICAgICAgICBwYWNrYWdlPSJvcmcub3BlbmZsb3cucHJvdG9jb2wiLAorICAgIGRlZiBvZl9mYWN0b3JpZXMoc2VsZik6CisgICAgICAgIHByZWZpeCA9ICJvcmcub3BlbmZsb3cucHJvdG9jb2wiCisKKyAgICAgICAgZmFjdG9yaWVzID0gT3JkZXJlZERpY3QoKQorCisgICAgICAgIHN1Yl9mYWN0b3J5X2NsYXNzZXMgPSAoIk9GQWN0aW9uIiwgIk9GSW5zdHJ1Y3Rpb24iLCAiT0ZNZXRlckJhbmQiLCAiT0ZPeG0iLCAiT0ZRdWV1ZVByb3AiKQorICAgICAgICBmb3IgYmFzZV9jbGFzcyBpbiBzdWJfZmFjdG9yeV9jbGFzc2VzOgorICAgICAgICAgICAgcGFja2FnZSA9IGJhc2VfY2xhc3NbMjpdLmxvd2VyKCkKKyAgICAgICAgICAgIHJlbW92ZV9wcmVmaXggPSBiYXNlX2NsYXNzWzJdLmxvd2VyKCkgKyBiYXNlX2NsYXNzWzM6XQorCisgICAgICAgICAgICAjIEhBQ0sgbmVlZCB0byBoYXZlIGEgYmV0dGVyIHdheSB0byBkZWFsIHdpdGggcGFyYW1ldGVyaXplZCBiYXNlIGNsYXNzZXMKKyAgICAgICAgICAgIGFubm90YXRlZF9iYXNlX2NsYXNzID0gYmFzZV9jbGFzcyArICI8Pz4iIGlmIGJhc2VfY2xhc3MgPT0gIk9GT3htIiBlbHNlIGJhc2VfY2xhc3MKKworICAgICAgICAgICAgZmFjdG9yaWVzW2Jhc2VfY2xhc3NdID0gT0ZGYWN0b3J5KHBhY2thZ2U9IiVzLiVzIiAlIChwcmVmaXgsIHBhY2thZ2UpLAorICAgICAgICAgICAgICAgICAgICBuYW1lPWJhc2VfY2xhc3MgKyAicyIsIG1lbWJlcnM9W10sIHJlbW92ZV9wcmVmaXg9cmVtb3ZlX3ByZWZpeCwgYmFzZV9jbGFzcz1hbm5vdGF0ZWRfYmFzZV9jbGFzcywgc3ViX2ZhY3Rvcmllcz17fSkKKworICAgICAgICBmYWN0b3JpZXNbIiJdID0gT0ZGYWN0b3J5KAorICAgICAgICAgICAgICAgICAgICBwYWNrYWdlPXByZWZpeCwKICAgICAgICAgICAgICAgICAgICAgbmFtZT0iT0ZGYWN0b3J5IiwKLSAgICAgICAgICAgICAgICAgICAgbWVtYmVycz1zZWxmLmludGVyZmFjZXMpCisgICAgICAgICAgICAgICAgICAgIHJlbW92ZV9wcmVmaXg9IiIsCisgICAgICAgICAgICAgICAgICAgIG1lbWJlcnM9W10sIGJhc2VfY2xhc3M9Ik9GTWVzc2FnZSIsIHN1Yl9mYWN0b3JpZXM9T3JkZXJlZERpY3QoCisgICAgICAgICAgICAgICAgICAgICAgICAoInt9e31zIi5mb3JtYXQoblsyXS5sb3dlcigpLCBuWzM6XSksICJ7fXMiLmZvcm1hdChuKSkgZm9yIG4gaW4gc3ViX2ZhY3RvcnlfY2xhc3NlcyApKQorCisgICAgICAgIGZvciBpIGluIHNlbGYuaW50ZXJmYWNlczoKKyAgICAgICAgICAgIGZvciBuLCBmYWN0b3J5IGluIGZhY3Rvcmllcy5pdGVtcygpOgorICAgICAgICAgICAgICAgIGlmIG4gPT0gIiI6CisgICAgICAgICAgICAgICAgICAgIGZhY3RvcnkubWVtYmVycy5hcHBlbmQoaSkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBzdXBlcl9jbGFzcyA9IHNlbGYuaW50ZXJmYWNlX2J5X25hbWUobikKKyAgICAgICAgICAgICAgICAgICAgaWYgaS5pc19pbnN0YW5jZV9vZihzdXBlcl9jbGFzcyk6CisgICAgICAgICAgICAgICAgICAgICAgICBmYWN0b3J5Lm1lbWJlcnMuYXBwZW5kKGkpCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICByZXR1cm4gZmFjdG9yaWVzLnZhbHVlcygpCiAKICAgICBkZWYgZ2VuZXJhdGVfY2xhc3Moc2VsZiwgY2xhenopOgogICAgICAgICAiIiIgcmV0dXJuIHdldGhlciBvciBub3QgdG8gZ2VuZXJhdGUgaW1wbGVtZW50YXRpb24gY2xhc3MgY2xhenouCkBAIC0xMzksMTkgKzE3NiwzOSBAQAogICAgICAgICAgICAgcmV0dXJuIFRydWUKIAogCi1jbGFzcyBPRkZhY3RvcnkobmFtZWR0dXBsZSgiT0ZGYWN0b3J5IiwgKCJwYWNrYWdlIiwgIm5hbWUiLCAibWVtYmVycyIpKSk6CitjbGFzcyBPRkZhY3RvcnkobmFtZWR0dXBsZSgiT0ZGYWN0b3J5IiwgKCJwYWNrYWdlIiwgIm5hbWUiLCAibWVtYmVycyIsICJyZW1vdmVfcHJlZml4IiwgImJhc2VfY2xhc3MiLCAic3ViX2ZhY3RvcmllcyIpKSk6CiAgICAgQHByb3BlcnR5CiAgICAgZGVmIGZhY3RvcnlfY2xhc3NlcyhzZWxmKToKICAgICAgICAgICAgIHJldHVybiBbIE9GRmFjdG9yeUNsYXNzKAogICAgICAgICAgICAgICAgICAgICBwYWNrYWdlPSJvcmcub3BlbmZsb3cucHJvdG9jb2wudmVye30iLmZvcm1hdCh2ZXJzaW9uLm9mX3ZlcnNpb24pLAotICAgICAgICAgICAgICAgICAgICBuYW1lPSJPRkZhY3RvcnlWZXJ7fSIuZm9ybWF0KHZlcnNpb24ub2ZfdmVyc2lvbiksCisgICAgICAgICAgICAgICAgICAgIG5hbWU9Int9VmVye30iLmZvcm1hdChzZWxmLm5hbWUsIHZlcnNpb24ub2ZfdmVyc2lvbiksCiAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZT1zZWxmLAogICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uPXZlcnNpb24KICAgICAgICAgICAgICAgICAgICAgKSBmb3IgdmVyc2lvbiBpbiBtb2RlbC52ZXJzaW9ucyBdCiAKKyAgICBkZWYgbWV0aG9kX25hbWUoc2VsZiwgbWVtYmVyLCBidWlsZGVyPVRydWUpOgorICAgICAgICBuID0gbWVtYmVyLnZhcmlhYmxlX25hbWUKKyAgICAgICAgaWYgbi5zdGFydHN3aXRoKHNlbGYucmVtb3ZlX3ByZWZpeCk6CisgICAgICAgICAgICBuID0gbltsZW4oc2VsZi5yZW1vdmVfcHJlZml4KTpdCisgICAgICAgICAgICBuID0gblswXS5sb3dlcigpICsgblsxOl0KKyAgICAgICAgaWYgYnVpbGRlcjoKKyAgICAgICAgICAgIHJldHVybiAiYnVpbGQiICsgblswXS51cHBlcigpICsgblsxOl0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBuCiAKIE9GR2VuZXJpY0NsYXNzID0gbmFtZWR0dXBsZSgiT0ZHZW5lcmljQ2xhc3MiLCAoInBhY2thZ2UiLCAibmFtZSIpKQotT0ZGYWN0b3J5Q2xhc3MgPSBuYW1lZHR1cGxlKCJPRkZhY3RvcnkiLCAoInBhY2thZ2UiLCAibmFtZSIsICJpbnRlcmZhY2UiLCAidmVyc2lvbiIpKQorY2xhc3MgT0ZGYWN0b3J5Q2xhc3MobmFtZWR0dXBsZSgiT0ZGYWN0b3J5Q2xhc3MiLCAoInBhY2thZ2UiLCAibmFtZSIsICJpbnRlcmZhY2UiLCAidmVyc2lvbiIpKSk6CisgICAgQHByb3BlcnR5CisgICAgZGVmIGJhc2VfY2xhc3Moc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmludGVyZmFjZS5iYXNlX2NsYXNzCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgdmVyc2lvbmVkX2Jhc2VfY2xhc3Moc2VsZik6CisgICAgICAgIGJhc2VfY2xhc3NfaW50ZXJmYWNlID0gbW9kZWwuaW50ZXJmYWNlX2J5X25hbWUoc2VsZi5pbnRlcmZhY2UuYmFzZV9jbGFzcykKKyAgICAgICAgaWYgYmFzZV9jbGFzc19pbnRlcmZhY2UgYW5kIGJhc2VfY2xhc3NfaW50ZXJmYWNlLmhhc192ZXJzaW9uKHNlbGYudmVyc2lvbik6CisgICAgICAgICAgICByZXR1cm4gYmFzZV9jbGFzc19pbnRlcmZhY2UudmVyc2lvbmVkX2NsYXNzKHNlbGYudmVyc2lvbikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBOb25lCiAKIG1vZGVsID0gSmF2YU1vZGVsKCkKIApAQCAtMjA2LDYwICsyNjMsMTA2IEBACiAgICAgICAgIHNlbGYubmFtZSA9IGphdmFfdHlwZS5uYW1lX2NfdG9fY2Fwc19jYW1lbChjX25hbWUpIGlmIGNfbmFtZSAhPSAib2ZfaGVhZGVyIiBlbHNlICJPRk1lc3NhZ2UiCiAgICAgICAgICMgdmFyaWFibGVfbmFtZSBuYW1lIHRvIHVzZSBmb3IgdmFyaWFibGVzIG9mIHRoaXMgdHlwZS4gaS5lLiwgZmxvd0FkZAogICAgICAgICBzZWxmLnZhcmlhYmxlX25hbWUgPSBzZWxmLm5hbWVbMl0ubG93ZXIoKSArIHNlbGYubmFtZVszOl0KKyAgICAgICAgc2VsZi50aXRsZV9uYW1lID0gc2VsZi52YXJpYWJsZV9uYW1lWzBdLnVwcGVyKCkgKyBzZWxmLnZhcmlhYmxlX25hbWVbMTpdCiAgICAgICAgICMgbmFtZSBmb3IgdXNlIGluIGNvbnN0YW50czogRkxPV19BREQKICAgICAgICAgc2VsZi5jb25zdGFudF9uYW1lID0gY19uYW1lLnVwcGVyKCkucmVwbGFjZSgiT0ZfIiwgIiIpCiAKLSAgICAgICAgcGNrX3N1ZmZpeCwgcGFyZW50X2ludGVyZmFjZSA9IHNlbGYuY2xhc3NfaW5mbygpCisgICAgICAgIHBja19zdWZmaXgsIHBhcmVudF9pbnRlcmZhY2UsIHNlbGYudHlwZV9hbm5vdGF0aW9uID0gc2VsZi5jbGFzc19pbmZvKCkKICAgICAgICAgc2VsZi5wYWNrYWdlID0gIm9yZy5vcGVuZmxvdy5wcm90b2NvbC4lcyIgJSBwY2tfc3VmZml4IGlmIHBja19zdWZmaXggZWxzZSAib3JnLm9wZW5mbG93LnByb3RvY29sIgogICAgICAgICBpZiBzZWxmLm5hbWUgIT0gcGFyZW50X2ludGVyZmFjZToKICAgICAgICAgICAgIHNlbGYucGFyZW50X2ludGVyZmFjZSA9IHBhcmVudF9pbnRlcmZhY2UKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIHNlbGYucGFyZW50X2ludGVyZmFjZSA9IE5vbmUKLSAgICAgICAgICAgIAorCisgICAgZGVmIGlzX2luc3RhbmNlX29mKHNlbGYsIG90aGVyX2NsYXNzKToKKyAgICAgICAgaWYgc2VsZiA9PSBvdGhlcl9jbGFzczoKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgIHBhcmVudCA9IHNlbGYuc3VwZXJfY2xhc3MKKyAgICAgICAgaWYgcGFyZW50IGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBwYXJlbnQuaXNfaW5zdGFuY2Vfb2Yob3RoZXJfY2xhc3MpCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgc3VwZXJfY2xhc3Moc2VsZik6CisgICAgICAgIGlmIG5vdCBzZWxmLnBhcmVudF9pbnRlcmZhY2U6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIG1vZGVsLmludGVyZmFjZV9ieV9uYW1lKHNlbGYucGFyZW50X2ludGVyZmFjZSkKKworCisgICAgZGVmIGluaGVyaXRlZF9kZWNsYXJhdGlvbihzZWxmLCB0eXBlX3NwZWM9Ij8iKToKKyAgICAgICAgaWYgc2VsZi50eXBlX2Fubm90YXRpb246CisgICAgICAgICAgICByZXR1cm4gIiVzPCVzPiIgJSAoc2VsZi5uYW1lLCB0eXBlX3NwZWMpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gIiVzIiAlIHNlbGYubmFtZQorCisgICAgQHByb3BlcnR5CisgICAgZGVmIHR5cGVfdmFyaWFibGUoc2VsZik6CisgICAgICAgIGlmIHNlbGYudHlwZV9hbm5vdGF0aW9uOgorICAgICAgICAgICAgcmV0dXJuICI8VD4iCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gIiI7CisKICAgICBkZWYgY2xhc3NfaW5mbyhzZWxmKToKICAgICAgICAgIiIiIHJldHVybiB0dXBsZSBvZiAocGFja2FnZV9wcmVmaXgsIHBhcmVudF9jbGFzcykgZm9yIHRoZSBjdXJyZW50IEphdmFPRkludGVyZmFjZSIiIgogICAgICAgICAjIEZJWE1FOiBUaGlzIGR1cGxpY2F0ZXMgaW5oZXJpdGFuY2UgaW5mb3JtYXRpb24gdGhhdCBpcyBub3cgYXZhaWxhYmxlIGluIHRoZSBsb3hpX2lyCiAgICAgICAgICMgbW9kZWwgKG5vdGUsIHRoYXQgdGhlIGxveGkgbW9kZWwgaXMgb24gdmVyc2lvbmVkIGNsYXNzZXMpLiBTaG91bGQgY2hlY2svaW5mZXIgdGhlCiAgICAgICAgICMgaW5oZXJpdGFuY2UgaW5mb3JtYXRpb24gZnJvbSB0aGUgdmVyc2lvbmVkIGxveF9pciBjbGFzc2VzLgogICAgICAgICBpZiByZS5tYXRjaChyJ09GLitTdGF0c1JlcXVlc3QkJywgc2VsZi5uYW1lKToKLSAgICAgICAgICAgIHJldHVybiAoIiIsICJPRlN0YXRzUmVxdWVzdCIpCisgICAgICAgICAgICByZXR1cm4gKCIiLCAiT0ZTdGF0c1JlcXVlc3QiLCBOb25lKQogICAgICAgICBlbGlmIHJlLm1hdGNoKHInT0YuK1N0YXRzUmVwbHkkJywgc2VsZi5uYW1lKToKLSAgICAgICAgICAgIHJldHVybiAoIiIsICJPRlN0YXRzUmVwbHkiKQorICAgICAgICAgICAgcmV0dXJuICgiIiwgIk9GU3RhdHNSZXBseSIsIE5vbmUpCiAgICAgICAgIGVsaWYgcmUubWF0Y2gocidPRkZsb3coQWRkfE1vZGlmeShTdHJpY3QpP3xEZWxldGUoU3RyaWN0KT8pJCcsIHNlbGYubmFtZSk6Ci0gICAgICAgICAgICByZXR1cm4gKCIiLCAiT0ZGbG93TW9kIikKKyAgICAgICAgICAgIHJldHVybiAoIiIsICJPRkZsb3dNb2QiLCBOb25lKQogICAgICAgICBlbGlmIGxveGlfdXRpbHMuY2xhc3NfaXNfbWVzc2FnZShzZWxmLmNfbmFtZSkgYW5kIHJlLm1hdGNoKHInT0ZCc24uKyQnLCBzZWxmLm5hbWUpOgotICAgICAgICAgICAgcmV0dXJuICgiIiwgIk9GQnNuSGVhZGVyIikKKyAgICAgICAgICAgIHJldHVybiAoIiIsICJPRkJzbkhlYWRlciIsIE5vbmUpCiAgICAgICAgIGVsaWYgbG94aV91dGlscy5jbGFzc19pc19tZXNzYWdlKHNlbGYuY19uYW1lKSBhbmQgcmUubWF0Y2gocidPRk5pY2lyYS4rJCcsIHNlbGYubmFtZSk6Ci0gICAgICAgICAgICByZXR1cm4gKCIiLCAiT0ZOaWNpcmFIZWFkZXIiKQorICAgICAgICAgICAgcmV0dXJuICgiIiwgIk9GTmljaXJhSGVhZGVyIiwgTm9uZSkKICAgICAgICAgZWxpZiByZS5tYXRjaChyJ09GTWF0Y2guKicsIHNlbGYubmFtZSk6Ci0gICAgICAgICAgICByZXR1cm4gKCIiLCAiTWF0Y2giKQorICAgICAgICAgICAgcmV0dXJuICgiIiwgIk1hdGNoIiwgTm9uZSkKICAgICAgICAgZWxpZiBsb3hpX3V0aWxzLmNsYXNzX2lzX21lc3NhZ2Uoc2VsZi5jX25hbWUpOgotICAgICAgICAgICAgcmV0dXJuICgiIiwgIk9GTWVzc2FnZSIpCisgICAgICAgICAgICByZXR1cm4gKCIiLCAiT0ZNZXNzYWdlIiwgTm9uZSkKICAgICAgICAgZWxpZiBsb3hpX3V0aWxzLmNsYXNzX2lzX2FjdGlvbihzZWxmLmNfbmFtZSk6Ci0gICAgICAgICAgICBpZiByZS5tYXRjaChyJ09GQWN0aW9uQnNuLionLCBzZWxmLm5hbWUpOgotICAgICAgICAgICAgICAgIHJldHVybiAoImFjdGlvbiIsICJPRkFjdGlvbkJzbiIpCi0gICAgICAgICAgICBlbGlmIHJlLm1hdGNoKHInT0ZBY3Rpb25OaWNpcmEuKicsIHNlbGYubmFtZSk6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICgiYWN0aW9uIiwgIk9GQWN0aW9uTmljaXJhIikKKyAgICAgICAgICAgIGlmIHJlLm1hdGNoKHInT0ZBY3Rpb25Cc24uKycsIHNlbGYubmFtZSk6CisgICAgICAgICAgICAgICAgcmV0dXJuICgiYWN0aW9uIiwgIk9GQWN0aW9uQnNuIiwgTm9uZSkKKyAgICAgICAgICAgIGVsaWYgcmUubWF0Y2gocidPRkFjdGlvbk5pY2lyYS4rJywgc2VsZi5uYW1lKToKKyAgICAgICAgICAgICAgICByZXR1cm4gKCJhY3Rpb24iLCAiT0ZBY3Rpb25OaWNpcmEiLCBOb25lKQogICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICByZXR1cm4gKCJhY3Rpb24iLCAiT0ZBY3Rpb24iKQorICAgICAgICAgICAgICAgIHJldHVybiAoImFjdGlvbiIsICJPRkFjdGlvbiIsIE5vbmUpCiAgICAgICAgIGVsaWYgcmUubWF0Y2gocidPRkJzblZwb3J0LiskJywgc2VsZi5uYW1lKToKLSAgICAgICAgICAgIHJldHVybiAoIiIsICJPRkJzblZwb3J0IikKKyAgICAgICAgICAgIHJldHVybiAoIiIsICJPRkJzblZwb3J0IiwgTm9uZSkKKyAgICAgICAgZWxpZiBzZWxmLm5hbWUgPT0gIk9GT3htIjoKKyAgICAgICAgICAgIHJldHVybiAoIm94bSIsIE5vbmUsICJUIGV4dGVuZHMgT0ZWYWx1ZVR5cGU8VD4iKQogICAgICAgICBlbGlmIGxveGlfdXRpbHMuY2xhc3NfaXNfb3htKHNlbGYuY19uYW1lKToKLSAgICAgICAgICAgIHJldHVybiAoIm94bSIsICJPRk94bSIpCisgICAgICAgICAgICBpZiBzZWxmLm5hbWUgaW4gbW9kZWwub3htX21hcDoKKyAgICAgICAgICAgICAgICByZXR1cm4gKCJveG0iLCAiT0ZPeG08JXM+IiAlIG1vZGVsLm94bV9tYXBbc2VsZi5uYW1lXS50eXBlX25hbWUsIE5vbmUpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJldHVybiAoIm94bSIsICJPRk94bSIsIE5vbmUpCiAgICAgICAgIGVsaWYgbG94aV91dGlscy5jbGFzc19pc19pbnN0cnVjdGlvbihzZWxmLmNfbmFtZSk6Ci0gICAgICAgICAgICByZXR1cm4gKCJpbnN0cnVjdGlvbiIsICJPRkluc3RydWN0aW9uIikKKyAgICAgICAgICAgIHJldHVybiAoImluc3RydWN0aW9uIiwgIk9GSW5zdHJ1Y3Rpb24iLCBOb25lKQogICAgICAgICBlbGlmIGxveGlfdXRpbHMuY2xhc3NfaXNfbWV0ZXJfYmFuZChzZWxmLmNfbmFtZSk6Ci0gICAgICAgICAgICByZXR1cm4gKCJtZXRlcmJhbmQiLCAiT0ZNZXRlckJhbmQiKQorICAgICAgICAgICAgcmV0dXJuICgibWV0ZXJiYW5kIiwgIk9GTWV0ZXJCYW5kIiwgTm9uZSkKICAgICAgICAgZWxpZiBsb3hpX3V0aWxzLmNsYXNzX2lzX3F1ZXVlX3Byb3Aoc2VsZi5jX25hbWUpOgotICAgICAgICAgICAgcmV0dXJuICgicXVldWVwcm9wIiwgIk9GUXVldWVQcm9wIikKKyAgICAgICAgICAgIHJldHVybiAoInF1ZXVlcHJvcCIsICJPRlF1ZXVlUHJvcCIsIE5vbmUpCiAgICAgICAgIGVsaWYgbG94aV91dGlscy5jbGFzc19pc19oZWxsb19lbGVtKHNlbGYuY19uYW1lKToKLSAgICAgICAgICAgIHJldHVybiAoIiIsICJPRkhlbGxvRWxlbSIpCisgICAgICAgICAgICByZXR1cm4gKCIiLCAiT0ZIZWxsb0VsZW0iLCBOb25lKQogICAgICAgICBlbHNlOgotICAgICAgICAgICAgcmV0dXJuICgiIiwgTm9uZSkKKyAgICAgICAgICAgIHJldHVybiAoIiIsIE5vbmUsIE5vbmUpCisKKyAgICBAcHJvcGVydHkKKyAgICBAbWVtb2l6ZQorICAgIGRlZiB3cml0ZWFibGVfbWVtYmVycyhzZWxmKToKKyAgICAgICAgcmV0dXJuIFsgbSBmb3IgbSBpbiBzZWxmLm1lbWJlcnMgaWYgbS5pc193cml0ZWFibGUgXQogCiAgICAgQHByb3BlcnR5CiAgICAgQG1lbW9pemUKICAgICBkZWYgbWVtYmVycyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuaXJfbW9kZWxfbWVtYmVycyArIHNlbGYudmlydHVhbF9tZW1iZXJzCisKKyAgICBAcHJvcGVydHkKKyAgICBAbWVtb2l6ZQorICAgIGRlZiBpcl9tb2RlbF9tZW1iZXJzKHNlbGYpOgogICAgICAgICAiIiJyZXR1cm4gYSBsaXN0IG9mIGFsbCBtZW1iZXJzIHRvIGJlIGV4cG9zZWQgYnkgdGhpcyBpbnRlcmZhY2UuIENvcnJlc3BvbmRzIHRvCiAgICAgICAgICAgIHRoZSB1bmlvbiBvZiB0aGUgbWVtYmVycyBvZiB0aGUgdmVzaW9uZWQgY2xhc3NlcyB3aXRob3V0IGxlbmd0aCwgZmllbGRsZW5ndGgKICAgICAgICAgICAgYW5kIHBhZHMgKHRob3NlIGFyZSBoYW5kbGVkIGF1dG9tYXRpY2FsbHkgZHVyaW5nIChkZSlzZXJpYWxpemF0aW9uIGFuZCBub3QgZXhwb3NlZCIiIgpAQCAtMjc1LDcgKzM3OCwzMyBAQAogICAgICAgICAgICAgICAgIGlmIG9mX21lbWJlci5uYW1lIG5vdCBpbiBtZW1iZXJfbWFwOgogICAgICAgICAgICAgICAgICAgICBtZW1iZXJfbWFwW29mX21lbWJlci5uYW1lXSA9IEphdmFNZW1iZXIuZm9yX29mX21lbWJlcihzZWxmLCBvZl9tZW1iZXIpCiAKLSAgICAgICAgcmV0dXJuIG1lbWJlcl9tYXAudmFsdWVzKCkKKyAgICAgICAgcmV0dXJuIHR1cGxlKG1lbWJlcl9tYXAudmFsdWVzKCkpCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgdmlydHVhbF9tZW1iZXJzKHNlbGYpOgorICAgICAgICBpZiBzZWxmLm5hbWUgPT0gIk9GT3htIjoKKyAgICAgICAgICAgIHJldHVybiAoCisgICAgICAgICAgICAgICAgICAgIEphdmFWaXJ0dWFsTWVtYmVyKHNlbGYsICJ2YWx1ZSIsIGphdmFfdHlwZS5nZW5lcmljX3QpLAorICAgICAgICAgICAgICAgICAgICBKYXZhVmlydHVhbE1lbWJlcihzZWxmLCAibWFzayIsIGphdmFfdHlwZS5nZW5lcmljX3QpLAorICAgICAgICAgICAgICAgICAgICBKYXZhVmlydHVhbE1lbWJlcihzZWxmLCAibWF0Y2hGaWVsZCIsIGphdmFfdHlwZS5tYWtlX21hdGNoX2ZpZWxkX2p0eXBlKCJUIikpLAorICAgICAgICAgICAgICAgICAgICBKYXZhVmlydHVhbE1lbWJlcihzZWxmLCAibWFza2VkIiwgamF2YV90eXBlLmJvb2xlYW4pLAorICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgZWxpZiBzZWxmLnBhcmVudF9pbnRlcmZhY2UgYW5kIHNlbGYucGFyZW50X2ludGVyZmFjZS5zdGFydHN3aXRoKCJPRk94bSIpOgorICAgICAgICAgICAgZmllbGRfdHlwZSA9IGphdmFfdHlwZS5tYWtlX21hdGNoX2ZpZWxkX2p0eXBlKG1vZGVsLm94bV9tYXBbc2VsZi5uYW1lXS50eXBlX25hbWUpIFwKKyAgICAgICAgICAgICAgICBpZiBzZWxmLm5hbWUgaW4gbW9kZWwub3htX21hcCBcCisgICAgICAgICAgICAgICAgZWxzZSBqYXZhX3R5cGUubWFrZV9tYXRjaF9maWVsZF9qdHlwZSgpCisKKyAgICAgICAgICAgIHJldHVybiAoCisgICAgICAgICAgICAgICAgICAgIEphdmFWaXJ0dWFsTWVtYmVyKHNlbGYsICJtYXRjaEZpZWxkIiwgZmllbGRfdHlwZSksCisgICAgICAgICAgICAgICAgICAgIEphdmFWaXJ0dWFsTWVtYmVyKHNlbGYsICJtYXNrZWQiLCBqYXZhX3R5cGUuYm9vbGVhbiksCisgICAgICAgICAgICAgICAgICAgKSBcCisgICAgICAgICAgICAgICAgICAgKyBcCisgICAgICAgICAgICAgICAgICAgKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKCBKYXZhVmlydHVhbE1lbWJlcihzZWxmLCAibWFzayIsIGZpbmQobGFtYmRhIHg6IHgubmFtZSA9PSAidmFsdWUiLCBzZWxmLmlyX21vZGVsX21lbWJlcnMpLmphdmFfdHlwZSksICkgaWYgbm90IGZpbmQobGFtYmRhIHg6IHgubmFtZSA9PSAibWFzayIsIHNlbGYuaXJfbW9kZWxfbWVtYmVycykgZWxzZQorICAgICAgICAgICAgICAgICAgICAoKQorICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiAoKQogCiAgICAgQHByb3BlcnR5CiAgICAgQG1lbW9pemUKQEAgLTM4NCw4ICs1MTMsMjkgQEAKICAgICBAcHJvcGVydHkKICAgICBAbWVtb2l6ZQogICAgIGRlZiBtZW1iZXJzKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5pcl9tb2RlbF9tZW1iZXJzICsgc2VsZi52aXJ0dWFsX21lbWJlcnMKKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiBpcl9tb2RlbF9tZW1iZXJzKHNlbGYpOgogICAgICAgICBtZW1iZXJzID0gWyBKYXZhTWVtYmVyLmZvcl9vZl9tZW1iZXIoc2VsZiwgb2ZfbWVtYmVyKSBmb3Igb2ZfbWVtYmVyIGluIHNlbGYuaXJfY2xhc3MubWVtYmVycyBdCi0gICAgICAgIHJldHVybiBtZW1iZXJzCisgICAgICAgIHJldHVybiB0dXBsZShtZW1iZXJzKQorCisgICAgQHByb3BlcnR5CisgICAgZGVmIHZpcnR1YWxfbWVtYmVycyhzZWxmKToKKyAgICAgICAgaWYgc2VsZi5pbnRlcmZhY2UucGFyZW50X2ludGVyZmFjZSBhbmQgc2VsZi5pbnRlcmZhY2UucGFyZW50X2ludGVyZmFjZS5zdGFydHN3aXRoKCJPRk94bSIpOgorICAgICAgICAgICAgaWYgc2VsZi5pbnRlcmZhY2UubmFtZSBpbiBtb2RlbC5veG1fbWFwOgorICAgICAgICAgICAgICAgIG94bV9lbnRyeSA9IG1vZGVsLm94bV9tYXBbc2VsZi5pbnRlcmZhY2UubmFtZV0KKyAgICAgICAgICAgICAgICByZXR1cm4gKAorICAgICAgICAgICAgICAgICAgICBKYXZhVmlydHVhbE1lbWJlcihzZWxmLCAibWF0Y2hGaWVsZCIsIGphdmFfdHlwZS5tYWtlX21hdGNoX2ZpZWxkX2p0eXBlKG94bV9lbnRyeS50eXBlX25hbWUpLCAiTWF0Y2hGaWVsZC4lcyIgJSBveG1fZW50cnkudmFsdWUpLAorICAgICAgICAgICAgICAgICAgICBKYXZhVmlydHVhbE1lbWJlcihzZWxmLCAibWFza2VkIiwgamF2YV90eXBlLmJvb2xlYW4sICJ0cnVlIiBpZiBveG1fZW50cnkubWFza2VkIGVsc2UgImZhbHNlIiksCisgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZXR1cm4gKAorICAgICAgICAgICAgICAgICAgICBKYXZhVmlydHVhbE1lbWJlcihzZWxmLCAibWF0Y2hGaWVsZCIsIGphdmFfdHlwZS5tYWtlX21hdGNoX2ZpZWxkX2p0eXBlKCksICJudWxsIiksCisgICAgICAgICAgICAgICAgICAgIEphdmFWaXJ0dWFsTWVtYmVyKHNlbGYsICJtYXNrZWQiLCBqYXZhX3R5cGUuYm9vbGVhbiwgImZhbHNlIiksCisgICAgICAgICAgICAgICAgICAgKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuICgpCiAKICAgICBkZWYgYWxsX3ZlcnNpb25zKHNlbGYpOgogICAgICAgICByZXR1cm4gWyBKYXZhT0ZWZXJzaW9uKGludF92ZXJzaW9uKQpAQCAtNDQ3LDYgKzU5NywxNCBAQAogICAgICAgICByZXR1cm4gc2VsZi5jX25hbWUudXBwZXIoKQogCiAgICAgQHByb3BlcnR5CisgICAgZGVmIGdldHRlcl9uYW1lKHNlbGYpOgorICAgICAgICByZXR1cm4gKCJpcyIgaWYgc2VsZi5qYXZhX3R5cGUucHVibGljX3R5cGUgPT0gImJvb2xlYW4iIGVsc2UgImdldCIpICsgc2VsZi50aXRsZV9uYW1lCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgc2V0dGVyX25hbWUoc2VsZik6CisgICAgICAgIHJldHVybiAic2V0IiArIHNlbGYudGl0bGVfbmFtZQorCisgICAgQHByb3BlcnR5CiAgICAgZGVmIGRlZmF1bHRfbmFtZShzZWxmKToKICAgICAgICAgaWYgc2VsZi5pc19maXhlZF92YWx1ZToKICAgICAgICAgICAgIHJldHVybiBzZWxmLmNvbnN0YW50X25hbWUKQEAgLTQ1OSwxMCArNjE3LDE0IEBACiAKICAgICAgICAgaWYgc2VsZi5pc19maXhlZF92YWx1ZToKICAgICAgICAgICAgIHJldHVybiBzZWxmLmVudW1fdmFsdWUKKyAgICAgICAgZWxpZiBqYXZhX3R5cGUgPT0gIk9GT3htTGlzdCI6CisgICAgICAgICAgICByZXR1cm4gIk9GT3htTGlzdC5FTVBUWSIKICAgICAgICAgZWxpZiByZS5tYXRjaChyJ0xpc3QuKicsIGphdmFfdHlwZSk6CiAgICAgICAgICAgICByZXR1cm4gIkNvbGxlY3Rpb25zLmVtcHR5TGlzdCgpIgogICAgICAgICBlbGlmIGphdmFfdHlwZSA9PSAiYm9vbGVhbiI6CiAgICAgICAgICAgICByZXR1cm4gImZhbHNlIjsKKyAgICAgICAgZWxpZiBzZWxmLmphdmFfdHlwZS5pc19hcnJheToKKyAgICAgICAgICAgIHJldHVybiAibmV3ICVzWzBdIiAlIGphdmFfdHlwZVs6LTJdCiAgICAgICAgIGVsaWYgamF2YV90eXBlIGluICgiYnl0ZSIsICJjaGFyIiwgInNob3J0IiwgImludCIsICJsb25nIik6CiAgICAgICAgICAgICByZXR1cm4gIih7MH0pIDAiLmZvcm1hdChqYXZhX3R5cGUpOwogICAgICAgICBlbHNlOgpAQCAtNTYyLDYgKzcyNCw4IEBACiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBpZiBtZW1iZXIubmFtZSA9PSAnbGVuJzoKICAgICAgICAgICAgICAgICBuYW1lID0gJ2xlbmd0aCcKKyAgICAgICAgICAgIGVsaWYgbWVtYmVyLm5hbWUgPT0gJ3ZhbHVlX21hc2snOgorICAgICAgICAgICAgICAgIG5hbWUgPSAnbWFzaycKICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgbmFtZSA9IGphdmFfdHlwZS5uYW1lX2NfdG9fY2FtZWwobWVtYmVyLm5hbWUpCiAgICAgICAgICAgICBqX3R5cGUgPSBqYXZhX3R5cGUuY29udmVydF90b19qdHlwZShqYXZhX2NsYXNzLmNfbmFtZSwgbWVtYmVyLm5hbWUsIG1lbWJlci5vZnR5cGUpCkBAIC01ODIsNiArNzQ2LDEwIEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgIHJldHVybiBUcnVlCiAKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgaXNfdmlydHVhbChzZWxmKToKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKICAgICBkZWYgX19oYXNoX18oc2VsZik6CiAgICAgICAgIHJldHVybiBoYXNoKHNlbGYubmFtZSkKIApAQCAtNTkwLDYgKzc1OCwzMiBAQAogICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgIHJldHVybiAoc2VsZi5uYW1lLCkgPT0gKG90aGVyLm5hbWUsKQogCitjbGFzcyBKYXZhVmlydHVhbE1lbWJlcihKYXZhTWVtYmVyKToKKyAgICAiIiIgTW9kZWxzIGEgdmlydHVhbCBwcm9wZXJ0eSAobWVtYmVyKSBvZiBhbiBvcGVuZmxvdyBjbGFzcyB0aGF0IGlzIG5vdCBiYWNrZWQgYnkgYSBsb3hpIGlyIG1lbWJlciAiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbXNnLCBuYW1lLCBqYXZhX3R5cGUsIHZhbHVlPU5vbmUpOgorICAgICAgICBKYXZhTWVtYmVyLl9faW5pdF9fKHNlbGYsIG1zZywgbmFtZSwgamF2YV90eXBlLCBtZW1iZXI9Tm9uZSkKKyAgICAgICAgc2VsZi5fdmFsdWUgPSB2YWx1ZQorCisgICAgQHByb3BlcnR5CisgICAgZGVmIGlzX2ZpeGVkX3ZhbHVlKHNlbGYpOgorICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgQHByb3BlcnR5CisgICAgZGVmIHZhbHVlKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fdmFsdWUKKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiBwcml2X3ZhbHVlKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fdmFsdWUKKworCisgICAgQHByb3BlcnR5CisgICAgZGVmIGlzX3VuaXZlcnNhbChzZWxmKToKKyAgICAgICAgcmV0dXJuIFRydWUKKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiBpc192aXJ0dWFsKHNlbGYpOgorICAgICAgICByZXR1cm4gVHJ1ZQogCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogIyMjIFVuaXQgVGVzdApkaWZmIC0tZ2l0IGEvamF2YV9nZW4vamF2YV90eXBlLnB5IGIvamF2YV9nZW4vamF2YV90eXBlLnB5CmluZGV4IDM1NTAzZTUuLmU3ZjIyMDEgMTAwNjQ0Ci0tLSBhL2phdmFfZ2VuL2phdmFfdHlwZS5weQorKysgYi9qYXZhX2dlbi9qYXZhX3R5cGUucHkKQEAgLTUsNiArNSwxMyBAQAogaW1wb3J0IHN1YnByb2Nlc3MKIGltcG9ydCB0aW1lCiAKK2RlZiBlcmFzZV90eXBlX2Fubm90YXRpb24oY2xhc3NfbmFtZSk6CisgICAgbT1yZS5tYXRjaChyJyguKik8Lio+JywgY2xhc3NfbmFtZSkKKyAgICBpZiBtOgorICAgICAgICByZXR1cm4gbS5ncm91cCgxKQorICAgIGVsc2U6CisgICAgICAgIHJldHVybiBjbGFzc19uYW1lCisKIGRlZiBuYW1lX2NfdG9fY2FtZWwobmFtZSk6CiAgICAgIiIiICdvZl9zdGF0c19yZXBseScgLT4gJ29mU3RhdHNSZXBseScgIiIiCiAgICAgbmFtZSA9IHJlLnN1YihyJ15fJywnJywgbmFtZSkKQEAgLTIxMiw3ICsyMTksNyBAQAogdTMyb2JqID0gSlR5cGUoJ1UzMicsICdVMzInKSBcCiAgICAgICAgIC5vcChyZWFkPSdVMzIub2YoYmIucmVhZEludCgpKScsIHdyaXRlPSdiYi53cml0ZUludCgkbmFtZS5nZXRSYXcoKSknKQogdTY0ID0gSlR5cGUoJ1U2NCcsICdVNjQnKSBcCi0gICAgICAgIC5vcChyZWFkPSdVNjQub2YoYmIucmVhZExvbmcoKSknLCB3cml0ZT0nYmIud3JpdGVMb25nKCRuYW1lLmdldFZhbHVlKCkpJykKKyAgICAgICAgLm9wKHJlYWQ9J1U2NC5vZlJhdyhiYi5yZWFkTG9uZygpKScsIHdyaXRlPSdiYi53cml0ZUxvbmcoJG5hbWUuZ2V0VmFsdWUoKSknKQogb2ZfcG9ydCA9IEpUeXBlKCJPRlBvcnQiKSBcCiAgICAgICAgICAub3AodmVyc2lvbj0xLCByZWFkPSJPRlBvcnQucmVhZDJCeXRlcyhiYikiLCB3cml0ZT0iJG5hbWUud3JpdGUyQnl0ZXMoYmIpIikgXAogICAgICAgICAgLm9wKHZlcnNpb249QU5ZLCByZWFkPSJPRlBvcnQucmVhZDRCeXRlcyhiYikiLCB3cml0ZT0iJG5hbWUud3JpdGU0Qnl0ZXMoYmIpIikKQEAgLTI4OCwxMSArMjk1LDIwIEBACiAgICAgICAgIC5vcChyZWFkPSJJUHY2Rmxvd0xhYmVsLnJlYWQ0Qnl0ZXMoYmIpIiwgd3JpdGU9IiRuYW1lLndyaXRlNEJ5dGVzKGJiKSIpCiBtZXRhZGF0YSA9IEpUeXBlKCJPRk1ldGFkYXRhIilcCiAgICAgICAgIC5vcChyZWFkPSJPRk1ldGFkYXRhLnJlYWQ4Qnl0ZXMoYmIpIiwgd3JpdGU9IiRuYW1lLndyaXRlOEJ5dGVzKGJiKSIpCi1veG0gPSBKVHlwZSgiT0ZPeG0iKVwKLSAgICAgICAgLm9wKHJlYWQ9Ik9GT3htVmVyJHZlcnNpb24uUkVBREVSLnJlYWRGcm9tKGJiKSIsIHdyaXRlPSIkbmFtZS53cml0ZVRvKGJiKSIpCitveG0gPSBKVHlwZSgiT0ZPeG08Pz4iKVwKKyAgICAgICAgLm9wKCAgcmVhZD0iT0ZPeG1WZXIkdmVyc2lvbi5SRUFERVIucmVhZEZyb20oYmIpIiwKKyAgICAgICAgICAgICAgd3JpdGU9IiRuYW1lLndyaXRlVG8oYmIpIikKK294bV9saXN0ID0gSlR5cGUoIk9GT3htTGlzdCIpIFwKKyAgICAgICAgLm9wKAorICAgICAgICAgICAgcmVhZD0gJ09GT3htTGlzdC5yZWFkRnJvbShiYiwgJGxlbmd0aCwgT0ZPeG1WZXIkdmVyc2lvbi5SRUFERVIpJywgXAorICAgICAgICAgICAgd3JpdGU9JyRuYW1lLndyaXRlVG8oYmIpJykKIG1ldGVyX2ZlYXR1cmVzID0gSlR5cGUoIk9GTWV0ZXJGZWF0dXJlcyIpXAogICAgICAgICAub3AocmVhZD0iT0ZNZXRlckZlYXR1cmVzVmVyJHZlcnNpb24uUkVBREVSLnJlYWRGcm9tKGJiKSIsIHdyaXRlPSIkbmFtZS53cml0ZVRvKGJiKSIpCiAKK2Jvb2xlYW4gPSBKVHlwZSgiYm9vbGVhbiIpCisKK2dlbmVyaWNfdCA9IEpUeXBlKCJUIikKKwogCiBkZWZhdWx0X210eXBlX3RvX2p0eXBlX2NvbnZlcnRfbWFwID0gewogICAgICAgICAndWludDhfdCcgOiB1OCwKQEAgLTMwNyw2ICszMjMsNyBAQAogICAgICAgICAnbGlzdChvZl9wYWNrZXRfcXVldWVfdCknIDogcGFja2V0X3F1ZXVlX2xpc3QsCiAgICAgICAgICdsaXN0KG9mX3VpbnQzMl90KScgOiB1MzJfbGlzdCwKICAgICAgICAgJ2xpc3Qob2ZfdWludDhfdCknIDogdThfbGlzdCwKKyAgICAgICAgJ2xpc3Qob2Zfb3htX3QpJyA6IG94bV9saXN0LAogICAgICAgICAnb2Zfb2N0ZXRzX3QnIDogb2N0ZXRzLAogICAgICAgICAnb2ZfbWF0Y2hfdCc6IG9mX21hdGNoLAogICAgICAgICAnb2ZfZm1fY21kX3QnOiBmbG93X21vZF9jbWQsCkBAIC0zNzYsNiArMzkzLDkgQEAKICAgICAgICAgJ29mX294bV9tcGxzX3RjX21hc2tlZCcgOiB7ICd2YWx1ZScgOiB1OG9iaiwgJ3ZhbHVlX21hc2snIDogdThvYmogfSwKIH0KIAorZGVmIG1ha2VfbWF0Y2hfZmllbGRfanR5cGUoc3ViX3R5cGVfbmFtZT0iPyIpOgorICAgIHJldHVybiBKVHlwZSgiTWF0Y2hGaWVsZDx7fT4iLmZvcm1hdChzdWJfdHlwZV9uYW1lKSkKKwogCiAjIENyZWF0ZSBhIGRlZmF1bHQgbWFwcGluZyBmb3IgYSBsaXN0IHR5cGUuIFR5cGUgZGVmYXVscyB0byBMaXN0PCR7amF2YV9tYXBwaW5nX29mX25hbWV9PgogZGVmIG1ha2Vfc3RhbmRhcmRfbGlzdF9qdHlwZShjX3R5cGUpOgpkaWZmIC0tZ2l0IGEvamF2YV9nZW4vcHJlLXdyaXR0ZW4vc3JjL21haW4vamF2YS9vcmcvb3BlbmZsb3cvcHJvdG9jb2wvT0ZPeG1MaXN0LmphdmEgYi9qYXZhX2dlbi9wcmUtd3JpdHRlbi9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZmxvdy9wcm90b2NvbC9PRk94bUxpc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOWVkZTgxCi0tLSAvZGV2L251bGwKKysrIGIvamF2YV9nZW4vcHJlLXdyaXR0ZW4vc3JjL21haW4vamF2YS9vcmcvb3BlbmZsb3cvcHJvdG9jb2wvT0ZPeG1MaXN0LmphdmEKQEAgLTAsMCArMSwxMjggQEAKK3BhY2thZ2Ugb3JnLm9wZW5mbG93LnByb3RvY29sOworCitpbXBvcnQgamF2YS51dGlsLkVudW1NYXA7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuamJvc3MubmV0dHkuYnVmZmVyLkNoYW5uZWxCdWZmZXI7CitpbXBvcnQgb3JnLm9wZW5mbG93LmV4Y2VwdGlvbnMuT0ZQYXJzZUVycm9yOworaW1wb3J0IG9yZy5vcGVuZmxvdy5wcm90b2NvbC5tYXRjaC5NYXRjaEZpZWxkOworaW1wb3J0IG9yZy5vcGVuZmxvdy5wcm90b2NvbC5tYXRjaC5NYXRjaEZpZWxkczsKK2ltcG9ydCBvcmcub3BlbmZsb3cucHJvdG9jb2wub3htLk9GT3htOworaW1wb3J0IG9yZy5vcGVuZmxvdy50eXBlcy5PRlZhbHVlVHlwZTsKK2ltcG9ydCBvcmcub3BlbmZsb3cudXRpbC5DaGFubmVsVXRpbHM7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZU1hcDsKKworcHVibGljIGNsYXNzIE9GT3htTGlzdCBpbXBsZW1lbnRzIEl0ZXJhYmxlPE9GT3htPD8+PiwgV3JpdGVhYmxlIHsKKyAgICBwcml2YXRlIGZpbmFsIE1hcDxNYXRjaEZpZWxkcywgT0ZPeG08Pz4+IG94bU1hcDsKKworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgT0ZPeG1MaXN0IEVNUFRZID0gbmV3IE9GT3htTGlzdChJbW11dGFibGVNYXAuPE1hdGNoRmllbGRzLCBPRk94bTw/Pj5vZigpKTsKKworICAgIHByaXZhdGUgT0ZPeG1MaXN0KE1hcDxNYXRjaEZpZWxkcywgT0ZPeG08Pz4+IG94bU1hcCkgeworICAgICAgICB0aGlzLm94bU1hcCA9IG94bU1hcDsKKyAgICB9CisKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBwdWJsaWMgPFQgZXh0ZW5kcyBPRlZhbHVlVHlwZTxUPj4gT0ZPeG08VD4gZ2V0KE1hdGNoRmllbGQ8VD4gbWF0Y2hGaWVsZCkgeworICAgICAgICByZXR1cm4gKE9GT3htPFQ+KSBveG1NYXAuZ2V0KG1hdGNoRmllbGQuaWQpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQnVpbGRlciB7CisgICAgICAgIHByaXZhdGUgZmluYWwgTWFwPE1hdGNoRmllbGRzLCBPRk94bTw/Pj4gb3htTWFwOworCisgICAgICAgIHB1YmxpYyBCdWlsZGVyKCkgeworICAgICAgICAgICAgb3htTWFwID0gbmV3IEVudW1NYXA8TWF0Y2hGaWVsZHMsIE9GT3htPD8+PihNYXRjaEZpZWxkcy5jbGFzcyk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQnVpbGRlcihFbnVtTWFwPE1hdGNoRmllbGRzLCBPRk94bTw/Pj4gb3htTWFwKSB7CisgICAgICAgICAgICB0aGlzLm94bU1hcCA9IG94bU1hcDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyA8VCBleHRlbmRzIE9GVmFsdWVUeXBlPFQ+PiB2b2lkIHNldChPRk94bTxUPiBveG0pIHsKKyAgICAgICAgICAgIG94bU1hcC5wdXQob3htLmdldE1hdGNoRmllbGQoKS5pZCwgb3htKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyA8VCBleHRlbmRzIE9GVmFsdWVUeXBlPFQ+PiB2b2lkIHVuc2V0KE1hdGNoRmllbGQ8VD4gbWF0Y2hGaWVsZCkgeworICAgICAgICAgICAgb3htTWFwLnJlbW92ZShtYXRjaEZpZWxkLmlkKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBPRk94bUxpc3QgYnVpbGQoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IE9GT3htTGlzdChveG1NYXApOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEl0ZXJhdG9yPE9GT3htPD8+PiBpdGVyYXRvcigpIHsKKyAgICAgICAgcmV0dXJuIG94bU1hcC52YWx1ZXMoKS5pdGVyYXRvcigpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgT0ZPeG1MaXN0IG9mTGlzdChMaXN0PE9GT3htPD8+PiBveG1MaXN0KSB7CisgICAgICAgIE1hcDxNYXRjaEZpZWxkcywgT0ZPeG08Pz4+IG1hcCA9IG5ldyBFbnVtTWFwPE1hdGNoRmllbGRzLCBPRk94bTw/Pj4oCisgICAgICAgICAgICAgICAgTWF0Y2hGaWVsZHMuY2xhc3MpOworICAgICAgICBmb3IgKE9GT3htPD8+IG8gOiBveG1MaXN0KSB7CisgICAgICAgICAgICAvLyBUT0RPOiBpZiBmdWxseSBtYXNrZWQsIGlnbm9yZSBveG0uCisgICAgICAgICAgICBtYXAucHV0KG8uZ2V0TWF0Y2hGaWVsZCgpLmlkLCBvKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmV3IE9GT3htTGlzdChtYXApOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgT0ZPeG1MaXN0IG9mKE9GT3htPD8+Li4uIG94bXMpIHsKKyAgICAgICAgTWFwPE1hdGNoRmllbGRzLCBPRk94bTw/Pj4gbWFwID0gbmV3IEVudW1NYXA8TWF0Y2hGaWVsZHMsIE9GT3htPD8+PigKKyAgICAgICAgICAgICAgICBNYXRjaEZpZWxkcy5jbGFzcyk7CisgICAgICAgIGZvciAoT0ZPeG08Pz4gbyA6IG94bXMpIHsKKyAgICAgICAgICAgIC8vIFRPRE86IGlmIGZ1bGx5IG1hc2tlZCwgaWdub3JlIG94bS4KKyAgICAgICAgICAgIG1hcC5wdXQoby5nZXRNYXRjaEZpZWxkKCkuaWQsIG8pOworICAgICAgICB9CisgICAgICAgIHJldHVybiBuZXcgT0ZPeG1MaXN0KG1hcCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBPRk94bUxpc3QgcmVhZEZyb20oQ2hhbm5lbEJ1ZmZlciBiYiwgaW50IGxlbmd0aCwKKyAgICAgICAgICAgIE9GTWVzc2FnZVJlYWRlcjxPRk94bTw/Pj4gcmVhZGVyKSB0aHJvd3MgT0ZQYXJzZUVycm9yIHsKKyAgICAgICAgcmV0dXJuIG9mTGlzdChDaGFubmVsVXRpbHMucmVhZExpc3QoYmIsIGxlbmd0aCwgcmVhZGVyKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgd3JpdGVUbyhDaGFubmVsQnVmZmVyIGJiKSB7CisgICAgICAgIGZvciAoT0ZPeG08Pz4gbyA6IHRoaXMpIHsKKyAgICAgICAgICAgIG8ud3JpdGVUbyhiYik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgb3JnLm9wZW5mbG93LnByb3RvY29sLk9GT3htTGlzdC5CdWlsZGVyIGNyZWF0ZUJ1aWxkZXIoKSB7CisgICAgICAgIHJldHVybiBuZXcgT0ZPeG1MaXN0LkJ1aWxkZXIobmV3IEVudW1NYXA8TWF0Y2hGaWVsZHMsIE9GT3htPD8+PihveG1NYXApKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICBmaW5hbCBpbnQgcHJpbWUgPSAzMTsKKyAgICAgICAgaW50IHJlc3VsdCA9IDE7CisgICAgICAgIHJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgKChveG1NYXAgPT0gbnVsbCkgPyAwIDogb3htTWFwLmhhc2hDb2RlKCkpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CisgICAgICAgIGlmICh0aGlzID09IG9iaikKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBpZiAob2JqID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmIChnZXRDbGFzcygpICE9IG9iai5nZXRDbGFzcygpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBPRk94bUxpc3Qgb3RoZXIgPSAoT0ZPeG1MaXN0KSBvYmo7CisgICAgICAgIGlmIChveG1NYXAgPT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKG90aGVyLm94bU1hcCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfSBlbHNlIGlmICghb3htTWFwLmVxdWFscyhvdGhlci5veG1NYXApKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gIk9GT3htTGlzdCIgKyBveG1NYXA7CisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2phdmFfZ2VuL3ByZS13cml0dGVuL3NyYy9tYWluL2phdmEvb3JnL29wZW5mbG93L3Byb3RvY29sL21hdGNoL01hdGNoLmphdmEgYi9qYXZhX2dlbi9wcmUtd3JpdHRlbi9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZmxvdy9wcm90b2NvbC9tYXRjaC9NYXRjaC5qYXZhCmluZGV4IDhmMTc4NDUuLmNkYjM0ZTUgMTAwNjQ0Ci0tLSBhL2phdmFfZ2VuL3ByZS13cml0dGVuL3NyYy9tYWluL2phdmEvb3JnL29wZW5mbG93L3Byb3RvY29sL21hdGNoL01hdGNoLmphdmEKKysrIGIvamF2YV9nZW4vcHJlLXdyaXR0ZW4vc3JjL21haW4vamF2YS9vcmcvb3BlbmZsb3cvcHJvdG9jb2wvbWF0Y2gvTWF0Y2guamF2YQpAQCAtMzIsMjAgKzMyLDIwIEBACiAgKiBPbiBwcmVyZXF1aXNpdGVzOjxicj4KICAqIEZyb20gdGhlIE9GMS4xIHNwZWMsIHBhZ2UgMjgsIHRoZSBPRjEuMCBzcGVjIGZhaWxlZCB0byBleHBsaWNpdGx5IHNwZWNpZnkgdGhpcywgYnV0IGl0CiAgKiBpcyB0aGUgYmVoYXZpb3Igb2YgT0YxLjAgc3dpdGNoZXM6Ci0gKiAiUHJvdG9jb2wtc3BlY2lmaWMgZmllbGRzIHdpdGhpbiBvZnBfbWF0Y2ggd2lsbCBiZSBpZ25vcmVkIHdpdGhpbiBhIHNpbmdsZSB0YWJsZSB3aGVuIAotICogdGhlIGNvcnJlc3BvbmRpbmcgcHJvdG9jb2wgaXMgbm90IHNwZWNpZmllZCBpbiB0aGUgbWF0Y2guIFRoZSBNUExTIG1hdGNoIGZpZWxkcyB3aWxsIAotICogYmUgaWdub3JlZCB1bmxlc3MgdGhlIEV0aGVydHlwZSBpcyBzcGVjaWZpZWQgYXMgTVBMUy4gTGlrZXdpc2UsIHRoZSBJUCBoZWFkZXIgYW5kIAotICogdHJhbnNwb3J0IGhlYWRlciBmaWVsZHMgd2lsbCBiZSBpZ25vcmVkIHVubGVzcyB0aGUgRXRoZXJ0eXBlIGlzIHNwZWNpZmllZCBhcyBlaXRoZXIgCi0gKiBJUHY0IG9yIEFSUC4gVGhlIHRwX3NyYyBhbmQgdHBfZHN0IGZpZWxkcyB3aWxsIGJlIGlnbm9yZWQgdW5sZXNzIHRoZSBuZXR3b3JrIHByb3RvY29sIAotICogc3BlY2lmaWVkIGlzIGFzIFRDUCwgVURQIG9yIFNDVFAuIEZpZWxkcyB0aGF0IGFyZSBpZ25vcmVkIGRvbtV0IG5lZWQgdG8gYmUgd2lsZGNhcmRlZCAKKyAqICJQcm90b2NvbC1zcGVjaWZpYyBmaWVsZHMgd2l0aGluIG9mcF9tYXRjaCB3aWxsIGJlIGlnbm9yZWQgd2l0aGluIGEgc2luZ2xlIHRhYmxlIHdoZW4KKyAqIHRoZSBjb3JyZXNwb25kaW5nIHByb3RvY29sIGlzIG5vdCBzcGVjaWZpZWQgaW4gdGhlIG1hdGNoLiBUaGUgTVBMUyBtYXRjaCBmaWVsZHMgd2lsbAorICogYmUgaWdub3JlZCB1bmxlc3MgdGhlIEV0aGVydHlwZSBpcyBzcGVjaWZpZWQgYXMgTVBMUy4gTGlrZXdpc2UsIHRoZSBJUCBoZWFkZXIgYW5kCisgKiB0cmFuc3BvcnQgaGVhZGVyIGZpZWxkcyB3aWxsIGJlIGlnbm9yZWQgdW5sZXNzIHRoZSBFdGhlcnR5cGUgaXMgc3BlY2lmaWVkIGFzIGVpdGhlcgorICogSVB2NCBvciBBUlAuIFRoZSB0cF9zcmMgYW5kIHRwX2RzdCBmaWVsZHMgd2lsbCBiZSBpZ25vcmVkIHVubGVzcyB0aGUgbmV0d29yayBwcm90b2NvbAorICogc3BlY2lmaWVkIGlzIGFzIFRDUCwgVURQIG9yIFNDVFAuIEZpZWxkcyB0aGF0IGFyZSBpZ25vcmVkIGRvbu+/vXQgbmVlZCB0byBiZSB3aWxkY2FyZGVkCiAgKiBhbmQgc2hvdWxkIGJlIHNldCB0byAwLiIKICAqIDxicj48YnI+Ci0gKiBUaGlzIGludGVyZmFjZSB1c2VzIGdlbmVyaWNzIHRvIGFzc3VyZSB0eXBlIHNhZmV0eSBpbiB1c2VycyBjb2RlLiBIb3dldmVyLCBpbXBsZW1lbnRpbmcgY2xhc3NlcyBtYXkgaGF2ZSB0byBzdXBwcmVzcyAKKyAqIFRoaXMgaW50ZXJmYWNlIHVzZXMgZ2VuZXJpY3MgdG8gYXNzdXJlIHR5cGUgc2FmZXR5IGluIHVzZXJzIGNvZGUuIEhvd2V2ZXIsIGltcGxlbWVudGluZyBjbGFzc2VzIG1heSBoYXZlIHRvIHN1cHByZXNzCiAgKiAndW5jaGVja2VkIGNhc3QnIHdhcm5pbmdzIHdoaWxlIG1ha2luZyBzdXJlIHRoZXkgY29ycmVjdGx5IGNhc3QgYmFzZSBvbiB0aGVpciBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzLgotICogCisgKgogICogQGF1dGhvciBZb3RhbSBIYXJjaG9sICh5b3RhbS5oYXJjaG9sQGJpZ3N3aXRjaC5jb20pCiAgKi8KLXB1YmxpYyBpbnRlcmZhY2UgTWF0Y2ggZXh0ZW5kcyBPRk9iamVjdCB7ICAgIAorcHVibGljIGludGVyZmFjZSBNYXRjaCBleHRlbmRzIE9GT2JqZWN0IHsKIAogICAgIC8qKgogICAgICAqIFJldHVybnMgYSB2YWx1ZSBmb3IgdGhlIGdpdmVuIGZpZWxkIGlmOgpAQCAtNTUsNyArNTUsNyBAQAogICAgICAqIDxsaT5QcmVyZXF1aXNpdGVzIGFyZSBvawogICAgICAqIDwvdWw+CiAgICAgICogSWYgb25lIG9mIHRoZSBhYm92ZSBjb25kaXRpb25zIGRvZXMgbm90IGhvbGQsIHJldHVybnMgbnVsbC4gVmFsdWUgaXMgcmV0dXJuZWQgbWFza2VkIGlmIHBhcnRpYWxseSB3aWxkY2FyZGVkLgotICAgICAqIAorICAgICAqCiAgICAgICogQHBhcmFtIGZpZWxkIE1hdGNoIGZpZWxkIHRvIHJldHJpZXZlCiAgICAgICogQHJldHVybiBWYWx1ZSBvZiBtYXRjaCBmaWVsZCAobWF5IGJlIG1hc2tlZCksIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIGZpZWxkIGlzIG9uZSBvZiB0aGUgY29uZGl0aW9ucyBhYm92ZSBkb2VzIG5vdCBob2xkLgogICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gSWYgZmllbGQgaXMgbm90IHN1cHBvcnRlZC4KQEAgLTY2LDcgKzY2LDcgQEAKICAgICAgKiBSZXR1cm5zIHRoZSBtYXNrZWQgdmFsdWUgZm9yIHRoZSBnaXZlbiBmaWVsZCBmcm9tIHRoaXMgbWF0Y2gsIGFsb25nIHdpdGggdGhlIG1hc2sgaXRzZWxmLgogICAgICAqIFByZXJlcXVpc2l0ZTogZmllbGQgaXMgcGFydGlhbGx5IG1hc2tlZC4KICAgICAgKiBJZiBwcmVyZXF1aXNpdGUgaXMgbm90IG1ldCwgYSA8Y29kZT5udWxsPC9jb2RlPiBpcyByZXR1cm5lZC4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIEBwYXJhbSBmaWVsZCBNYXRjaCBmaWVsZCB0byByZXRyaWV2ZS4KICAgICAgKiBAcmV0dXJuIE1hc2tlZCB2YWx1ZSBvZiBtYXRjaCBmaWVsZCBvciBudWxsIGlmIG5vIG1hc2sgaXMgc2V0LgogICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gSWYgZmllbGQgaXMgbm90IHN1cHBvcnRlZC4KQEAgLTc1LDcgKzc1LDcgQEAKIAogICAgIC8qKgogICAgICAqIFJldHVybnMgdHJ1ZSBpZiBhbmQgb25seSBpZiB0aGlzIG1hdGNoIG9iamVjdCBzdXBwb3J0cyB0aGUgZ2l2ZW4gbWF0Y2ggZmllbGQuCi0gICAgICogCisgICAgICoKICAgICAgKiBAcGFyYW0gZmllbGQgTWF0Y2ggZmllbGQKICAgICAgKiBAcmV0dXJuIHRydWUgaWYgZmllbGQgaXMgc3VwcG9ydGVkLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICovCkBAIC04NCw3ICs4NCw3IEBACiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0cnVlIGlmIGFuZCBvbmx5IGlmIHRoaXMgbWF0Y2ggb2JqZWN0IHN1cHBvcnRzIHBhcnRpYWxseSBiaXRtYXNraW5nIG9mIHRoZSBnaXZlbiBmaWVsZC4KICAgICAgKiAobm90ZTogbm90IGFsbCBwb3NzaWJsZSB2YWx1ZXMgb2YgdGhpcyBiaXRtYXNrIGhhdmUgdG8gYmUgYWNjZXB0YWJsZSkKLSAgICAgKiAKKyAgICAgKgogICAgICAqIEBwYXJhbSBmaWVsZCBNYXRjaCBmaWVsZC4KICAgICAgKiBAcmV0dXJuIHRydWUgaWYgZmllbGQgY2FuIGJlIHBhcnRpYWxseSBtYXNrZWQsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIElmIGZpZWxkIGlzIG5vdCBzdXBwb3J0ZWQuCkBAIC05NCw3ICs5NCw3IEBACiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0cnVlIGlmIGFuZCBvbmx5IGlmIHRoaXMgZmllbGQgaXMgY3VycmVudGx5IHNwZWNpZmllZCBpbiB0aGUgbWF0Y2ggd2l0aCBhbiBleGFjdCB2YWx1ZSBhbmQKICAgICAgKiBubyBtYXNrLiBJLmUuLCB0aGUgc3BlY2lmaWVkIG1hdGNoIHdpbGwgb25seSBzZWxlY3QgcGFja2V0cyB0aGF0IG1hdGNoIHRoZSBleGFjdCB2YWx1ZSBvZiBnZXRWYWx1ZShmaWVsZCkuCi0gICAgICogCisgICAgICoKICAgICAgKiBAcGFyYW0gZmllbGQgTWF0Y2ggZmllbGQuCiAgICAgICogQHJldHVybiB0cnVlIGlmIGZpZWxkIGhhcyBhIHNwZWNpZmljIGV4YWN0IHZhbHVlLCBmYWxzZSBpZiBub3QuCiAgICAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBJZiBmaWVsZCBpcyBub3Qgc3VwcG9ydGVkLgpAQCAtMTAyLDEwICsxMDIsMTAgQEAKICAgICBwdWJsaWMgYm9vbGVhbiBpc0V4YWN0KE1hdGNoRmllbGQ8Pz4gZmllbGQpIHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFRydWUgaWYgYW5kIG9ubHkgaWYgdGhpcyBmaWVsZCBpcyBjdXJyZW50bHkgbG9naWNhbGx5IHVuc3BlY2lmaWVkIGluIHRoZSBtYXRjaCwgaS5lLCB0aGUgCi0gICAgICogdmFsdWUgcmV0dXJuZWQgYnkgZ2V0VmFsdWUoZikgaGFzIG5vIGltcGFjdCBvbiB3aGV0aGVyIGEgcGFja2V0IHdpbGwgYmUgc2VsZWN0ZWQgCisgICAgICogVHJ1ZSBpZiBhbmQgb25seSBpZiB0aGlzIGZpZWxkIGlzIGN1cnJlbnRseSBsb2dpY2FsbHkgdW5zcGVjaWZpZWQgaW4gdGhlIG1hdGNoLCBpLmUsIHRoZQorICAgICAqIHZhbHVlIHJldHVybmVkIGJ5IGdldFZhbHVlKGYpIGhhcyBubyBpbXBhY3Qgb24gd2hldGhlciBhIHBhY2tldCB3aWxsIGJlIHNlbGVjdGVkCiAgICAgICogYnkgdGhlIG1hdGNoIG9yIG5vdC4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIEBwYXJhbSBmaWVsZCBNYXRjaCBmaWVsZC4KICAgICAgKiBAcmV0dXJuIHRydWUgaWYgZmllbGQgaXMgZnVsbHkgd2lsZGNhcmRlZCwgZmFsc2UgaWYgbm90LgogICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gSWYgZmllbGQgaXMgbm90IHN1cHBvcnRlZC4KQEAgLTExMywxNiArMTEzLDE2IEBACiAgICAgcHVibGljIGJvb2xlYW4gaXNGdWxseVdpbGRjYXJkZWQoTWF0Y2hGaWVsZDw/PiBmaWVsZCkgdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogVHJ1ZSBpZiBhbmQgb25seSBpZiB0aGlzIGZpZWxkIGlzIGN1cnJlbnRseSBwYXJ0aWFsbHkgc3BlY2lmaWVkIGluIHRoZSBtYXRjaCwgaS5lLCB0aGUgCisgICAgICogVHJ1ZSBpZiBhbmQgb25seSBpZiB0aGlzIGZpZWxkIGlzIGN1cnJlbnRseSBwYXJ0aWFsbHkgc3BlY2lmaWVkIGluIHRoZSBtYXRjaCwgaS5lLCB0aGUKICAgICAgKiBtYXRjaCB3aWxsIG9ubHkgc2VsZWN0IHBhY2tldHMgdGhhdCBtYXRjaCAocC52YWx1ZSAmIGdldE1hc2soZmllbGQpKSA9PSBnZXRWYWx1ZShmaWVsZCksCiAgICAgICogYW5kIGdldE1hc2soZmllbGQpICE9IDAuCi0gICAgICogCisgICAgICoKICAgICAgKiBAcGFyYW0gZmllbGQgTWF0Y2ggZmllbGQuCiAgICAgICogQHJldHVybiB0cnVlIGlmIGZpZWxkIGlzIHBhcnRpYWxseSBtYXNrZWQsIGZhbHNlIGlmIG5vdC4KICAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIElmIGZpZWxkIGlzIG5vdCBzdXBwb3J0ZWQuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaXNQYXJ0aWFsbHlNYXNrZWQoTWF0Y2hGaWVsZDw/PiBmaWVsZCkgdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uOwotICAgIAorCiAgICAgLyoqCiAgICAgICogUmV0dXJucyBhIGJ1aWxkZXIgdG8gYnVpbGQgbmV3IGluc3RhbmNlcyBvZiB0aGlzIHR5cGUgb2YgbWF0Y2ggb2JqZWN0LgogICAgICAqIEByZXR1cm4gTWF0Y2ggYnVpbGRlcgpAQCAtMTM1LDE3ICsxMzUsMTcgQEAKICAgICAgKiBjb3JyZXNwb25kcyB0by4gVGhlIGJ1aWxkZXIgdXNlcyB0aGUgc2FtZSBub3RhdGlvbiBvZiB3aWxkY2FyZHMgYW5kIG1hc2tzLCBhbmQgY2FuIGFsc28gdGhyb3cKICAgICAgKiA8Y29kZT5VbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbjwvY29kZT4gaWYgaXQgaXMgYXNrZWQgdG8gY3JlYXRlIHNvbWUgbWF0Y2hpbmcgdGhhdCBpcyBub3Qgc3VwcG9ydGVkIGluCiAgICAgICogdGhlIHZlcnNpb24gaXQgcmVwcmVzZW50cy4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIFdoaWxlIHVzZWQsIE1hdGNoQnVpbGRlciBtYXkgbm90IGJlIGNvbnNpc3RlbnQgaW4gdGVybXMgb2YgZmllbGQgcHJlcmVxdWlzaXRlcy4gSG93ZXZlciwgdXNlciBtdXN0CiAgICAgICogc29sdmUgdGhlc2UgYmVmb3JlIHVzaW5nIHRoZSBnZW5lcmF0ZWQgTWF0Y2ggb2JqZWN0IGFzIHRoZXNlIHByZXJlcXVpc2l0ZXMgc2hvdWxkIGJlIGVuZm9yY2VkIGluIHRoZQotICAgICAqIGdldHRlcnMuIAotICAgICAqIAorICAgICAqIGdldHRlcnMuCisgICAgICoKICAgICAgKiBAYXV0aG9yIFlvdGFtIEhhcmNob2wgKHlvdGFtLmhhcmNob2xAYmlnc3dpdGNoLmNvbSkKICAgICAgKi8KICAgICBpbnRlcmZhY2UgQnVpbGRlciBleHRlbmRzIE1hdGNoIHsKICAgICAgICAgLyoqCiAgICAgICAgICAqIFNldHMgYSBzcGVjaWZpYyBleGFjdCB2YWx1ZSBmb3IgYSBmaWVsZC4KLSAgICAgICAgICogCisgICAgICAgICAqCiAgICAgICAgICAqIEBwYXJhbSBmaWVsZCBNYXRjaCBmaWVsZCB0byBzZXQuCiAgICAgICAgICAqIEBwYXJhbSB2YWx1ZSBWYWx1ZSBvZiBtYXRjaCBmaWVsZC4KICAgICAgICAgICogQHJldHVybiB0aGUgQnVpbGRlciBpbnN0YW5jZSB1c2VkLgpAQCAtMTU1LDcgKzE1NSw3IEBACiAKICAgICAgICAgLyoqCiAgICAgICAgICAqIFNldHMgYSBtYXNrZWQgdmFsdWUgZm9yIGEgZmllbGQuCi0gICAgICAgICAqIAorICAgICAgICAgKgogICAgICAgICAgKiBAcGFyYW0gZmllbGQgTWF0Y2ggZmllbGQgdG8gc2V0LgogICAgICAgICAgKiBAcGFyYW0gdmFsdWUgVmFsdWUgb2YgZmllbGQuCiAgICAgICAgICAqIEBwYXJhbSBtYXNrIE1hc2sgdmFsdWUuCkBAIC0xNjYsNyArMTY2LDcgQEAKIAogICAgICAgICAvKioKICAgICAgICAgICogU2V0cyBhIG1hc2tlZCB2YWx1ZSBmb3IgYSBmaWVsZC4KLSAgICAgICAgICogCisgICAgICAgICAqCiAgICAgICAgICAqIEBwYXJhbSBmaWVsZCBNYXRjaCBmaWVsZCB0byBzZXQuCiAgICAgICAgICAqIEBwYXJhbSB2YWx1ZVdpdGhNYXNrIENvbXBvdW5kIE1hc2tlZCBvYmplY3QgY29udGFpbnMgdGhlIHZhbHVlIGFuZCB0aGUgbWFzay4KICAgICAgICAgICogQHJldHVybiB0aGUgQnVpbGRlciBpbnN0YW5jZSB1c2VkLgpAQCAtMTc2LDcgKzE3Niw3IEBACiAKICAgICAgICAgLyoqCiAgICAgICAgICAqIFVuc2V0cyBhbnkgdmFsdWUgZ2l2ZW4gZm9yIHRoZSBmaWVsZCBhbmQgd2lsZGNhcmRzIGl0IHNvIHRoYXQgaXQgbWF0Y2hlcyBhbnkgdmFsdWUuCi0gICAgICAgICAqIAorICAgICAgICAgKgogICAgICAgICAgKiBAcGFyYW0gZmllbGQgTWF0Y2ggZmllbGQgdG8gdW5zZXQuCiAgICAgICAgICAqIEByZXR1cm4gdGhlIEJ1aWxkZXIgaW5zdGFuY2UgdXNlZC4KICAgICAgICAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBJZiBmaWVsZCBpcyBub3Qgc3VwcG9ydGVkLgpAQCAtMTg1LDkgKzE4NSw5IEBACiAKICAgICAgICAgLyoqCiAgICAgICAgICAqIFJldHVybnMgdGhlIG1hdGNoIGNyZWF0ZWQgYnkgdGhpcyBidWlsZGVyLgotICAgICAgICAgKiAKKyAgICAgICAgICoKICAgICAgICAgICogQHJldHVybiBhIE1hdGNoIG9iamVjdC4KICAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBNYXRjaCBnZXRNYXRjaCgpOworICAgICAgICBwdWJsaWMgTWF0Y2ggYnVpbGQoKTsKICAgICB9CiB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamF2YV9nZW4vcHJlLXdyaXR0ZW4vc3JjL21haW4vamF2YS9vcmcvb3BlbmZsb3cvdHlwZXMvT0ZNZXRhZGF0YS5qYXZhIGIvamF2YV9nZW4vcHJlLXdyaXR0ZW4vc3JjL21haW4vamF2YS9vcmcvb3BlbmZsb3cvdHlwZXMvT0ZNZXRhZGF0YS5qYXZhCmluZGV4IGUyNzY3OWMuLmU4MmJjNDAgMTAwNjQ0Ci0tLSBhL2phdmFfZ2VuL3ByZS13cml0dGVuL3NyYy9tYWluL2phdmEvb3JnL29wZW5mbG93L3R5cGVzL09GTWV0YWRhdGEuamF2YQorKysgYi9qYXZhX2dlbi9wcmUtd3JpdHRlbi9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZmxvdy90eXBlcy9PRk1ldGFkYXRhLmphdmEKQEAgLTIsMzYgKzIsNDMgQEAKIAogaW1wb3J0IG9yZy5qYm9zcy5uZXR0eS5idWZmZXIuQ2hhbm5lbEJ1ZmZlcjsKIAotcHVibGljIGNsYXNzIE9GTWV0YWRhdGEgZXh0ZW5kcyBVNjQgaW1wbGVtZW50cyBPRlZhbHVlVHlwZTxPRk1ldGFkYXRhPiB7Ci0gICAgCitwdWJsaWMgY2xhc3MgT0ZNZXRhZGF0YSBpbXBsZW1lbnRzIE9GVmFsdWVUeXBlPE9GTWV0YWRhdGE+IHsKKwogICAgIHByaXZhdGUgc3RhdGljIGludCBMRU5HVEggPSA4OwogCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBPRk1ldGFkYXRhIE5PX01BU0sgPSBPRk1ldGFkYXRhLm9mKDB4RkZGRkZGRkZGRkZGRkZGRmwpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT0ZNZXRhZGF0YSBGVUxMX01BU0sgPSBPRk1ldGFkYXRhLm9mKDB4MCk7CisgICAgcHJpdmF0ZSBmaW5hbCBVNjQgdTY0OwogCi0gICAgcHJvdGVjdGVkIE9GTWV0YWRhdGEobG9uZyByYXcpIHsKLSAgICAgICAgc3VwZXIocmF3KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE9GTWV0YWRhdGEgTk9fTUFTSyA9IE9GTWV0YWRhdGEub2YoVTY0Lm9mUmF3KDB4RkZGRkZGRkZGRkZGRkZGRmwpKTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE9GTWV0YWRhdGEgRlVMTF9NQVNLID0gT0ZNZXRhZGF0YS5vZihVNjQub2ZSYXcoMHgwKSk7CisKKyAgICBwdWJsaWMgT0ZNZXRhZGF0YShVNjQgb2ZSYXcpIHsKKyAgICAgICAgdTY0ID0gb2ZSYXc7CiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyBPRk1ldGFkYXRhIG9mKGxvbmcgcmF3KSB7Ci0gICAgICAgIHJldHVybiBuZXcgT0ZNZXRhZGF0YShyYXcpOworICAgIHB1YmxpYyBzdGF0aWMgT0ZNZXRhZGF0YSBvZihVNjQgdTY0KSB7CisgICAgICAgIHJldHVybiBuZXcgT0ZNZXRhZGF0YSh1NjQpOwogICAgIH0KLSAgICAKKworICAgIHB1YmxpYyBzdGF0aWMgT0ZNZXRhZGF0YSBvZlJhdyhsb25nIHJhdykgeworICAgICAgICByZXR1cm4gbmV3IE9GTWV0YWRhdGEoVTY0Lm9mUmF3KHJhdykpOworICAgIH0KKwogICAgIHB1YmxpYyBzdGF0aWMgT0ZNZXRhZGF0YSByZWFkOEJ5dGVzKENoYW5uZWxCdWZmZXIgY2IpIHsKLSAgICAgICAgcmV0dXJuIE9GTWV0YWRhdGEub2YoY2IucmVhZExvbmcoKSk7CisgICAgICAgIHJldHVybiBPRk1ldGFkYXRhLm9mUmF3KGNiLnJlYWRMb25nKCkpOwogICAgIH0KLSAgICAKKwogICAgIHB1YmxpYyB2b2lkIHdyaXRlOEJ5dGVzKENoYW5uZWxCdWZmZXIgY2IpIHsKLSAgICAgICAgY2Iud3JpdGVMb25nKHN1cGVyLmdldFZhbHVlKCkpOworICAgICAgICB1NjQud3JpdGVUbyhjYik7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0gICAgICAgIHJldHVybiBMRU5HVEg7CisgICAgICAgIHJldHVybiB1NjQuZ2V0TGVuZ3RoKCk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIE9GTWV0YWRhdGEgYXBwbHlNYXNrKE9GTWV0YWRhdGEgbWFzaykgewotICAgICAgICByZXR1cm4gT0ZNZXRhZGF0YS5vZih0aGlzLmdldFZhbHVlKCkgJiBtYXNrLmdldFZhbHVlKCkpOworICAgICAgICByZXR1cm4gT0ZNZXRhZGF0YS5vZih0aGlzLnU2NC5hcHBseU1hc2sobWFzay51NjQpKTsKICAgICB9CisKIH0KZGlmZiAtLWdpdCBhL2phdmFfZ2VuL3ByZS13cml0dGVuL3NyYy9tYWluL2phdmEvb3JnL29wZW5mbG93L3R5cGVzL1UxNi5qYXZhIGIvamF2YV9nZW4vcHJlLXdyaXR0ZW4vc3JjL21haW4vamF2YS9vcmcvb3BlbmZsb3cvdHlwZXMvVTE2LmphdmEKaW5kZXggNTg4NGFkYy4uNTRlNzJjMSAxMDA2NDQKLS0tIGEvamF2YV9nZW4vcHJlLXdyaXR0ZW4vc3JjL21haW4vamF2YS9vcmcvb3BlbmZsb3cvdHlwZXMvVTE2LmphdmEKKysrIGIvamF2YV9nZW4vcHJlLXdyaXR0ZW4vc3JjL21haW4vamF2YS9vcmcvb3BlbmZsb3cvdHlwZXMvVTE2LmphdmEKQEAgLTE3LDcgKzE3LDEyIEBACiAKIHBhY2thZ2Ugb3JnLm9wZW5mbG93LnR5cGVzOwogCi1wdWJsaWMgY2xhc3MgVTE2IHsKK2ltcG9ydCBvcmcuamJvc3MubmV0dHkuYnVmZmVyLkNoYW5uZWxCdWZmZXI7CitpbXBvcnQgb3JnLm9wZW5mbG93LmV4Y2VwdGlvbnMuT0ZQYXJzZUVycm9yOworaW1wb3J0IG9yZy5vcGVuZmxvdy5wcm90b2NvbC5PRk1lc3NhZ2VSZWFkZXI7CitpbXBvcnQgb3JnLm9wZW5mbG93LnByb3RvY29sLldyaXRlYWJsZTsKKworcHVibGljIGNsYXNzIFUxNiBpbXBsZW1lbnRzIFdyaXRlYWJsZSwgT0ZWYWx1ZVR5cGU8VTE2PiB7CiAgICAgcHVibGljIHN0YXRpYyBpbnQgZihmaW5hbCBzaG9ydCBpKSB7CiAgICAgICAgIHJldHVybiBpICYgMHhmZmZmOwogICAgIH0KQEAgLTI1LDQgKzMwLDc5IEBACiAgICAgcHVibGljIHN0YXRpYyBzaG9ydCB0KGZpbmFsIGludCBsKSB7CiAgICAgICAgIHJldHVybiAoc2hvcnQpIGw7CiAgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBzaG9ydCByYXc7CisKKyAgICBwcml2YXRlIFUxNihzaG9ydCByYXcpIHsKKyAgICAgICAgdGhpcy5yYXcgPSByYXc7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBVMTYgb2YoaW50IHZhbHVlKSB7CisgICAgICAgIHJldHVybiBuZXcgVTE2KHQodmFsdWUpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFUxNiBvZlJhdyhzaG9ydCB2YWx1ZSkgeworICAgICAgICByZXR1cm4gbmV3IFUxNih2YWx1ZSk7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRWYWx1ZSgpIHsKKyAgICAgICAgcmV0dXJuIGYocmF3KTsKKyAgICB9CisKKyAgICBwdWJsaWMgc2hvcnQgZ2V0UmF3KCkgeworICAgICAgICByZXR1cm4gcmF3OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiAiIiArIGYocmF3KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICBmaW5hbCBpbnQgcHJpbWUgPSAzMTsKKyAgICAgICAgaW50IHJlc3VsdCA9IDE7CisgICAgICAgIHJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgcmF3OworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CisgICAgICAgIGlmICh0aGlzID09IG9iaikKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBpZiAob2JqID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmIChnZXRDbGFzcygpICE9IG9iai5nZXRDbGFzcygpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBVMTYgb3RoZXIgPSAoVTE2KSBvYmo7CisgICAgICAgIGlmIChyYXcgIT0gb3RoZXIucmF3KQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHdyaXRlVG8oQ2hhbm5lbEJ1ZmZlciBiYikgeworICAgICAgICBiYi53cml0ZVNob3J0KHJhdyk7CisgICAgfQorCisKKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIFJlYWRlciBSRUFERVIgPSBuZXcgUmVhZGVyKCk7CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBSZWFkZXIgaW1wbGVtZW50cyBPRk1lc3NhZ2VSZWFkZXI8VTE2PiB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgVTE2IHJlYWRGcm9tKENoYW5uZWxCdWZmZXIgYmIpIHRocm93cyBPRlBhcnNlRXJyb3IgeworICAgICAgICAgICAgcmV0dXJuIG9mUmF3KGJiLnJlYWRTaG9ydCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgeworICAgICAgICByZXR1cm4gMjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgVTE2IGFwcGx5TWFzayhVMTYgbWFzaykgeworICAgICAgICByZXR1cm4gb2ZSYXcoIChzaG9ydCkgKHJhdyAmIG1hc2sucmF3KSk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvamF2YV9nZW4vcHJlLXdyaXR0ZW4vc3JjL21haW4vamF2YS9vcmcvb3BlbmZsb3cvdHlwZXMvVTMyLmphdmEgYi9qYXZhX2dlbi9wcmUtd3JpdHRlbi9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZmxvdy90eXBlcy9VMzIuamF2YQppbmRleCA1MjdlNzc4Li45Y2QxODFjIDEwMDY0NAotLS0gYS9qYXZhX2dlbi9wcmUtd3JpdHRlbi9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZmxvdy90eXBlcy9VMzIuamF2YQorKysgYi9qYXZhX2dlbi9wcmUtd3JpdHRlbi9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZmxvdy90eXBlcy9VMzIuamF2YQpAQCAtMjIsNyArMjIsNyBAQAogaW1wb3J0IG9yZy5vcGVuZmxvdy5wcm90b2NvbC5PRk1lc3NhZ2VSZWFkZXI7CiBpbXBvcnQgb3JnLm9wZW5mbG93LnByb3RvY29sLldyaXRlYWJsZTsKIAotcHVibGljIGNsYXNzIFUzMiBpbXBsZW1lbnRzIFdyaXRlYWJsZSB7CitwdWJsaWMgY2xhc3MgVTMyIGltcGxlbWVudHMgV3JpdGVhYmxlLCBPRlZhbHVlVHlwZTxVMzI+IHsKICAgICBwcml2YXRlIGZpbmFsIGludCByYXc7CiAKICAgICBwcml2YXRlIFUzMihpbnQgcmF3KSB7CkBAIC02OSw2ICs2OSw3IEBACiAgICAgICAgIFUzMiBvdGhlciA9IChVMzIpIG9iajsKICAgICAgICAgaWYgKHJhdyAhPSBvdGhlci5yYXcpCiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCkBAIC05NCw0ICs5NSwxNCBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBnZXRMZW5ndGgoKSB7CisgICAgICAgIHJldHVybiA0OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBVMzIgYXBwbHlNYXNrKFUzMiBtYXNrKSB7CisgICAgICAgIHJldHVybiBvZlJhdyhyYXcgJiBtYXNrLnJhdyk7CisgICAgfQorCiB9CmRpZmYgLS1naXQgYS9qYXZhX2dlbi9wcmUtd3JpdHRlbi9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZmxvdy90eXBlcy9VNjQuamF2YSBiL2phdmFfZ2VuL3ByZS13cml0dGVuL3NyYy9tYWluL2phdmEvb3JnL29wZW5mbG93L3R5cGVzL1U2NC5qYXZhCmluZGV4IDc4NzE0NDUuLjVjNjlhN2MgMTAwNjQ0Ci0tLSBhL2phdmFfZ2VuL3ByZS13cml0dGVuL3NyYy9tYWluL2phdmEvb3JnL29wZW5mbG93L3R5cGVzL1U2NC5qYXZhCisrKyBiL2phdmFfZ2VuL3ByZS13cml0dGVuL3NyYy9tYWluL2phdmEvb3JnL29wZW5mbG93L3R5cGVzL1U2NC5qYXZhCkBAIC0xOSw3ICsxOSwxMCBAQAogCiBpbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7CiAKLXB1YmxpYyBjbGFzcyBVNjQgeworaW1wb3J0IG9yZy5qYm9zcy5uZXR0eS5idWZmZXIuQ2hhbm5lbEJ1ZmZlcjsKK2ltcG9ydCBvcmcub3BlbmZsb3cucHJvdG9jb2wuV3JpdGVhYmxlOworCitwdWJsaWMgY2xhc3MgVTY0IGltcGxlbWVudHMgV3JpdGVhYmxlLCBPRlZhbHVlVHlwZTxVNjQ+IHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIFVOU0lHTkVEX01BU0sgPSAweDdmZmZmZmZmZmZmZmZmZmZMOwogCiAgICAgcHJpdmF0ZSBmaW5hbCBsb25nIHJhdzsKQEAgLTI4LDcgKzMxLDExIEBACiAgICAgICAgIHRoaXMucmF3ID0gcmF3OwogICAgIH0KIAotICAgIHB1YmxpYyBzdGF0aWMgVTY0IG9mKGZpbmFsIGxvbmcgcmF3KSB7CisgICAgcHVibGljIHN0YXRpYyBVNjQgb2YobG9uZyByYXcpIHsKKyAgICAgICAgcmV0dXJuIG9mUmF3KHJhdyk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBVNjQgb2ZSYXcoZmluYWwgbG9uZyByYXcpIHsKICAgICAgICAgcmV0dXJuIG5ldyBVNjQocmF3KTsKICAgICB9CiAKQEAgLTg3LDQgKzk0LDE5IEBACiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIAorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgeworICAgICAgICByZXR1cm4gODsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgVTY0IGFwcGx5TWFzayhVNjQgbWFzaykgeworICAgICAgICByZXR1cm4gb2ZSYXcocmF3ICYgbWFzay5yYXcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHdyaXRlVG8oQ2hhbm5lbEJ1ZmZlciBiYikgeworICAgICAgICBiYi53cml0ZUxvbmcocmF3KTsKKyAgICB9CisKIH0KZGlmZiAtLWdpdCBhL2phdmFfZ2VuL3ByZS13cml0dGVuL3NyYy9tYWluL2phdmEvb3JnL29wZW5mbG93L3R5cGVzL1U4LmphdmEgYi9qYXZhX2dlbi9wcmUtd3JpdHRlbi9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZmxvdy90eXBlcy9VOC5qYXZhCmluZGV4IDJiZDM0YmYuLmMxNWJlMGUgMTAwNjQ0Ci0tLSBhL2phdmFfZ2VuL3ByZS13cml0dGVuL3NyYy9tYWluL2phdmEvb3JnL29wZW5mbG93L3R5cGVzL1U4LmphdmEKKysrIGIvamF2YV9nZW4vcHJlLXdyaXR0ZW4vc3JjL21haW4vamF2YS9vcmcvb3BlbmZsb3cvdHlwZXMvVTguamF2YQpAQCAtMjIsNyArMjIsNyBAQAogaW1wb3J0IG9yZy5vcGVuZmxvdy5wcm90b2NvbC5PRk1lc3NhZ2VSZWFkZXI7CiBpbXBvcnQgb3JnLm9wZW5mbG93LnByb3RvY29sLldyaXRlYWJsZTsKIAotcHVibGljIGNsYXNzIFU4IGltcGxlbWVudHMgV3JpdGVhYmxlIHsKK3B1YmxpYyBjbGFzcyBVOCBpbXBsZW1lbnRzIFdyaXRlYWJsZSwgT0ZWYWx1ZVR5cGU8VTg+IHsKICAgICBwcml2YXRlIGZpbmFsIGJ5dGUgcmF3OwogCiAgICAgcHJpdmF0ZSBVOChieXRlIHJhdykgewpAQCAtOTYsNCArOTYsMTQgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgeworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgVTggYXBwbHlNYXNrKFU4IG1hc2spIHsKKyAgICAgICAgcmV0dXJuIG9mUmF3KCAoYnl0ZSkgKHJhdyAmIG1hc2sucmF3KSk7CisgICAgfQorCiB9CmRpZmYgLS1naXQgYS9qYXZhX2dlbi9wcmUtd3JpdHRlbi9zcmMvdGVzdC9qYXZhL29yZy9vcGVuZmxvdy90eXBlcy9VNjRUZXN0LmphdmEgYi9qYXZhX2dlbi9wcmUtd3JpdHRlbi9zcmMvdGVzdC9qYXZhL29yZy9vcGVuZmxvdy90eXBlcy9VNjRUZXN0LmphdmEKaW5kZXggMTZkM2QzZS4uYWVmZDE5MyAxMDA2NDQKLS0tIGEvamF2YV9nZW4vcHJlLXdyaXR0ZW4vc3JjL3Rlc3QvamF2YS9vcmcvb3BlbmZsb3cvdHlwZXMvVTY0VGVzdC5qYXZhCisrKyBiL2phdmFfZ2VuL3ByZS13cml0dGVuL3NyYy90ZXN0L2phdmEvb3JnL29wZW5mbG93L3R5cGVzL1U2NFRlc3QuamF2YQpAQCAtMTEsMTYgKzExLDE2IEBACiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0UG9zaXRpdmVSYXdzKCkgewogICAgICAgICBmb3IobG9uZyBwb3NpdGl2ZTogbmV3IGxvbmdbXSB7IDAsIDEsIDEwMCwgTG9uZy5NQVhfVkFMVUUgfSkgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHBvc2l0aXZlLCBVNjQub2YocG9zaXRpdmUpLmdldFZhbHVlKCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEJpZ0ludGVnZXIudmFsdWVPZihwb3NpdGl2ZSksIFU2NC5vZihwb3NpdGl2ZSkuZ2V0QmlnSW50ZWdlcigpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhwb3NpdGl2ZSwgVTY0Lm9mUmF3KHBvc2l0aXZlKS5nZXRWYWx1ZSgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhCaWdJbnRlZ2VyLnZhbHVlT2YocG9zaXRpdmUpLCBVNjQub2ZSYXcocG9zaXRpdmUpLmdldEJpZ0ludGVnZXIoKSk7CiAgICAgICAgIH0KICAgICB9CiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3ROZWdhdGl2ZVJhd3MoKSB7CiAgICAgICAgIGxvbmcgbWludXNfMSA9IDB4RkZmZkZGZmZGRmZmRkZmZkw7Ci0gICAgICAgIGFzc2VydEVxdWFscyhtaW51c18xLCBVNjQub2YobWludXNfMSkuZ2V0VmFsdWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhuZXcgQmlnSW50ZWdlcigiRkZmZkZGZmZGRmZmRkZmZiIsIDE2KSwgIFU2NC5vZihtaW51c18xKS5nZXRCaWdJbnRlZ2VyKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMobmV3IEJpZ0ludGVnZXIoIjE4NDQ2NzQ0MDczNzA5NTUxNjE1IiksICBVNjQub2YobWludXNfMSkuZ2V0QmlnSW50ZWdlcigpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1pbnVzXzEsIFU2NC5vZlJhdyhtaW51c18xKS5nZXRWYWx1ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBCaWdJbnRlZ2VyKCJGRmZmRkZmZkZGZmZGRmZmIiwgMTYpLCAgVTY0Lm9mUmF3KG1pbnVzXzEpLmdldEJpZ0ludGVnZXIoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhuZXcgQmlnSW50ZWdlcigiMTg0NDY3NDQwNzM3MDk1NTE2MTUiKSwgIFU2NC5vZlJhdyhtaW51c18xKS5nZXRCaWdJbnRlZ2VyKCkpOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL2phdmFfZ2VuL3RlbXBsYXRlcy9fZmllbGRfYWNjZXNzb3JzLmphdmEgYi9qYXZhX2dlbi90ZW1wbGF0ZXMvX2ZpZWxkX2FjY2Vzc29ycy5qYXZhCmluZGV4IGU4YWZlNDcuLmI2NGIyOWIgMTAwNjQ0Ci0tLSBhL2phdmFfZ2VuL3RlbXBsYXRlcy9fZmllbGRfYWNjZXNzb3JzLmphdmEKKysrIGIvamF2YV9nZW4vdGVtcGxhdGVzL19maWVsZF9hY2Nlc3NvcnMuamF2YQpAQCAtMSw2ICsxLDYgQEAKIC8vOjogZm9yIHByb3AgaW4gbXNnLmludGVyZmFjZS5tZW1iZXJzOgogICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyAke3Byb3AuamF2YV90eXBlLnB1YmxpY190eXBlfSBnZXQke3Byb3AudGl0bGVfbmFtZX0oKSR7ICIiIGlmIHByb3AgaW4gbXNnLm1lbWJlcnMgZWxzZSAidGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIn0geworICAgIHB1YmxpYyAke3Byb3AuamF2YV90eXBlLnB1YmxpY190eXBlfSAke3Byb3AuZ2V0dGVyX25hbWV9KCkkeyAiIiBpZiBwcm9wIGluIG1zZy5tZW1iZXJzIGVsc2UgInRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiJ9IHsKIC8vOjogaWYgcHJvcCBpbiBtc2cubWVtYmVyczoKIC8vOjogICAgdmVyc2lvbl9wcm9wID0gbXNnLmdldF9tZW1iZXIocHJvcC5uYW1lKQogLy86OiAgICBpZiB2ZXJzaW9uX3Byb3AuaXNfZml4ZWRfdmFsdWU6CkBAIC0yMCw3ICsyMCw3IEBACiAKIC8vOjogaWYgZ2VuZXJhdGVfc2V0dGVycyBhbmQgcHJvcC5pc193cml0ZWFibGU6CiAgICAgQE92ZXJyaWRlCi0gICAgcHVibGljICR7bXNnLmludGVyZmFjZS5uYW1lfS5CdWlsZGVyIHNldCR7cHJvcC50aXRsZV9uYW1lfSgke3Byb3AuamF2YV90eXBlLnB1YmxpY190eXBlfSAke3Byb3AubmFtZX0pJHsgIiIgaWYgcHJvcCBpbiBtc2cubWVtYmVycyBlbHNlICIgdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIn0geworICAgIHB1YmxpYyAke21zZy5pbnRlcmZhY2UubmFtZX0uQnVpbGRlciAke3Byb3Auc2V0dGVyX25hbWV9KCR7cHJvcC5qYXZhX3R5cGUucHVibGljX3R5cGV9ICR7cHJvcC5uYW1lfSkkeyAiIiBpZiBwcm9wIGluIG1zZy5tZW1iZXJzIGVsc2UgIiB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24ifSB7CiAvLzo6IGlmIHByb3AgaW4gbXNnLm1lbWJlcnM6CiAgICAgICAgIHRoaXMuJHtwcm9wLm5hbWV9ID0gJHtwcm9wLm5hbWV9OwogICAgICAgICB0aGlzLiR7cHJvcC5uYW1lfVNldCA9IHRydWU7CmRpZmYgLS1naXQgYS9qYXZhX2dlbi90ZW1wbGF0ZXMvX2ltcG9ydHMuamF2YSBiL2phdmFfZ2VuL3RlbXBsYXRlcy9faW1wb3J0cy5qYXZhCmluZGV4IDViODY1NzEuLmE0YzU2NGMgMTAwNjQ0Ci0tLSBhL2phdmFfZ2VuL3RlbXBsYXRlcy9faW1wb3J0cy5qYXZhCisrKyBiL2phdmFfZ2VuL3RlbXBsYXRlcy9faW1wb3J0cy5qYXZhCkBAIC0xLDYgKzEsNyBAQAogaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CiBpbXBvcnQgb3JnLm9wZW5mbG93LnByb3RvY29sLio7CiBpbXBvcnQgb3JnLm9wZW5mbG93LnByb3RvY29sLmFjdGlvbi4qOwogaW1wb3J0IG9yZy5vcGVuZmxvdy5wcm90b2NvbC5tZXRlcmJhbmQuKjsKZGlmZiAtLWdpdCBhL2phdmFfZ2VuL3RlbXBsYXRlcy9jdXN0b20vT0ZNYXRjaFYxVmVyMTAuQnVpbGRlci5qYXZhIGIvamF2YV9nZW4vdGVtcGxhdGVzL2N1c3RvbS9PRk1hdGNoVjFWZXIxMC5CdWlsZGVyLmphdmEKaW5kZXggNjM0YzQ2ZS4uYmE3MzliYyAxMDA2NDQKLS0tIGEvamF2YV9nZW4vdGVtcGxhdGVzL2N1c3RvbS9PRk1hdGNoVjFWZXIxMC5CdWlsZGVyLmphdmEKKysrIGIvamF2YV9nZW4vdGVtcGxhdGVzL2N1c3RvbS9PRk1hdGNoVjFWZXIxMC5CdWlsZGVyLmphdmEKQEAgLTcxLDEyICs3MSw2IEBACiAgICAgfQogCiAgICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE1hdGNoIGdldE1hdGNoKCkgewotICAgICAgICAvLyBGSVhNRSB5b3RhbSAtIHBsZWFzZSByZXBsYWNlIHdpdGggcmVhbCBpbXBsZW1lbnRhdGlvbgotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gICAgCi0gICAgQE92ZXJyaWRlCiAgICAgcHVibGljIEJ1aWxkZXIgY3JlYXRlQnVpbGRlcigpIHsKICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgfQpkaWZmIC0tZ2l0IGEvamF2YV9nZW4vdGVtcGxhdGVzL2N1c3RvbS9PRk1hdGNoVjJWZXIxMS5CdWlsZGVyLmphdmEgYi9qYXZhX2dlbi90ZW1wbGF0ZXMvY3VzdG9tL09GTWF0Y2hWMlZlcjExLkJ1aWxkZXIuamF2YQppbmRleCA2MzRjNDZlLi5iYTczOWJjIDEwMDY0NAotLS0gYS9qYXZhX2dlbi90ZW1wbGF0ZXMvY3VzdG9tL09GTWF0Y2hWMlZlcjExLkJ1aWxkZXIuamF2YQorKysgYi9qYXZhX2dlbi90ZW1wbGF0ZXMvY3VzdG9tL09GTWF0Y2hWMlZlcjExLkJ1aWxkZXIuamF2YQpAQCAtNzEsMTIgKzcxLDYgQEAKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTWF0Y2ggZ2V0TWF0Y2goKSB7Ci0gICAgICAgIC8vIEZJWE1FIHlvdGFtIC0gcGxlYXNlIHJlcGxhY2Ugd2l0aCByZWFsIGltcGxlbWVudGF0aW9uCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgICAKLSAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgQnVpbGRlciBjcmVhdGVCdWlsZGVyKCkgewogICAgICAgICByZXR1cm4gdGhpczsKICAgICB9CmRpZmYgLS1naXQgYS9qYXZhX2dlbi90ZW1wbGF0ZXMvY3VzdG9tL09GTWF0Y2hWM1ZlcjEyLkJ1aWxkZXIuamF2YSBiL2phdmFfZ2VuL3RlbXBsYXRlcy9jdXN0b20vT0ZNYXRjaFYzVmVyMTIuQnVpbGRlci5qYXZhCmluZGV4IDYzNGM0NmUuLmJhNzM5YmMgMTAwNjQ0Ci0tLSBhL2phdmFfZ2VuL3RlbXBsYXRlcy9jdXN0b20vT0ZNYXRjaFYzVmVyMTIuQnVpbGRlci5qYXZhCisrKyBiL2phdmFfZ2VuL3RlbXBsYXRlcy9jdXN0b20vT0ZNYXRjaFYzVmVyMTIuQnVpbGRlci5qYXZhCkBAIC03MSwxMiArNzEsNiBAQAogICAgIH0KIAogICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBNYXRjaCBnZXRNYXRjaCgpIHsKLSAgICAgICAgLy8gRklYTUUgeW90YW0gLSBwbGVhc2UgcmVwbGFjZSB3aXRoIHJlYWwgaW1wbGVtZW50YXRpb24KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIAotICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBCdWlsZGVyIGNyZWF0ZUJ1aWxkZXIoKSB7CiAgICAgICAgIHJldHVybiB0aGlzOwogICAgIH0KZGlmZiAtLWdpdCBhL2phdmFfZ2VuL3RlbXBsYXRlcy9jdXN0b20vT0ZNYXRjaFYzVmVyMTMuQnVpbGRlci5qYXZhIGIvamF2YV9nZW4vdGVtcGxhdGVzL2N1c3RvbS9PRk1hdGNoVjNWZXIxMy5CdWlsZGVyLmphdmEKaW5kZXggMmMwMGE5MS4uODFlOGQ0ZSAxMDA2NDQKLS0tIGEvamF2YV9nZW4vdGVtcGxhdGVzL2N1c3RvbS9PRk1hdGNoVjNWZXIxMy5CdWlsZGVyLmphdmEKKysrIGIvamF2YV9nZW4vdGVtcGxhdGVzL2N1c3RvbS9PRk1hdGNoVjNWZXIxMy5CdWlsZGVyLmphdmEKQEAgLTcxLDEyICs3MSw2IEBACiAgICAgfQogCiAgICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE1hdGNoIGdldE1hdGNoKCkgewotICAgICAgICAvLyBGSVhNRSB5b3RhbSAtIHBsZWFzZSByZXBsYWNlIHdpdGggcmVhbCBpbXBsZW1lbnRhdGlvbgotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gICAgCi0gICAgQE92ZXJyaWRlCiAgICAgcHVibGljIEJ1aWxkZXIgY3JlYXRlQnVpbGRlcigpIHsKICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgfQpkaWZmIC0tZ2l0IGEvamF2YV9nZW4vdGVtcGxhdGVzL29mX2NsYXNzLmphdmEgYi9qYXZhX2dlbi90ZW1wbGF0ZXMvb2ZfY2xhc3MuamF2YQppbmRleCA0M2Q5ODkzLi5iY2FmOTYxIDEwMDY0NAotLS0gYS9qYXZhX2dlbi90ZW1wbGF0ZXMvb2ZfY2xhc3MuamF2YQorKysgYi9qYXZhX2dlbi90ZW1wbGF0ZXMvb2ZfY2xhc3MuamF2YQpAQCAtMzcsNyArMzcsNyBAQAogCiAvLzo6IGluY2x1ZGUoIl9pbXBvcnRzLmphdmEiLCBtc2c9bXNnKQogCi1jbGFzcyAke2ltcGxfY2xhc3N9IGltcGxlbWVudHMgJHttc2cuaW50ZXJmYWNlLm5hbWV9IHsKK2NsYXNzICR7aW1wbF9jbGFzc30gaW1wbGVtZW50cyAke21zZy5pbnRlcmZhY2UuaW5oZXJpdGVkX2RlY2xhcmF0aW9uKCl9IHsKICAgICAvLyB2ZXJzaW9uOiAke3ZlcnNpb259CiAgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYnl0ZSBXSVJFX1ZFUlNJT04gPSAke3ZlcnNpb24uaW50X3ZlcnNpb259OwogLy86OiBpZiBtc2cuaXNfZml4ZWRfbGVuZ3RoOgpAQCAtNTUsMjAgKzU1LDI5IEBACiAgICAgcHJpdmF0ZSBmaW5hbCAke3Byb3AuamF2YV90eXBlLnB1YmxpY190eXBlfSAke3Byb3AubmFtZX07CiAvLzo6ICNlbmRmb3IKIAorICAgIC8vOjogaWYgbXNnLmRhdGFfbWVtYmVyczoKKyAgICAvLyBwYWNrYWdlIHByaXZhdGUgY29uc3RydWN0b3IgLSB1c2VkIGJ5IHJlYWRlcnMsIGJ1aWxkZXJzLCBhbmQgZmFjdG9yeQogICAgICR7aW1wbF9jbGFzc30oJHsKICAgICAgICAgIiwgIi5qb2luKCIlcyAlcyIgJShwcm9wLmphdmFfdHlwZS5wdWJsaWNfdHlwZSwgcHJvcC5uYW1lKSBmb3IgcHJvcCBpbiBtc2cuZGF0YV9tZW1iZXJzKSB9KSB7CiAvLzo6IGZvciBwcm9wIGluIG1zZy5kYXRhX21lbWJlcnM6CiAgICAgICAgIHRoaXMuJHtwcm9wLm5hbWV9ID0gJHtwcm9wLm5hbWV9OwogLy86OiAjZW5kZm9yCiAgICAgfQorICAgIC8vOjogZWxzZToKKyAgICBmaW5hbCBzdGF0aWMgJHtpbXBsX2NsYXNzfSBJTlNUQU5DRSA9IG5ldyAke2ltcGxfY2xhc3N9KCk7CisgICAgLy8gcHJpdmF0ZSBlbXB0eSBjb25zdHJ1Y3RvciAtIHVzZSBzaGFyZWQgaW5zdGFuY2UhCisgICAgcHJpdmF0ZSAke2ltcGxfY2xhc3N9KCkgeworICAgIH0KKyAgICAvLzo6ICNlbmRpZgogCiAgICAgLy8gQWNjZXNzb3JzIGZvciBPRiBtZXNzYWdlIGZpZWxkcwotLy86OiBpbmNsdWRlKCJfZmllbGRfYWNjZXNzb3JzLmphdmEiLCBtc2c9bXNnLCBnZW5lcmF0ZV9zZXR0ZXJzPUZhbHNlLCBidWlsZGVyPUZhbHNlKQorICAgIC8vOjogaW5jbHVkZSgiX2ZpZWxkX2FjY2Vzc29ycy5qYXZhIiwgbXNnPW1zZywgZ2VuZXJhdGVfc2V0dGVycz1GYWxzZSwgYnVpbGRlcj1GYWxzZSkKIAogICAgIC8vOjogaWYgb3MucGF0aC5leGlzdHMoIiVzL2N1c3RvbS8lcy5qYXZhIiAlICh0ZW1wbGF0ZV9kaXIsIG1zZy5uYW1lKSk6CiAgICAgLy86OiBpbmNsdWRlKCJjdXN0b20vJXMuamF2YSIgJSBtc2cubmFtZSwgbXNnPW1zZykKICAgICAvLzo6ICNlbmRpZgogCisgICAgLy86OiBpZiBtc2cuZGF0YV9tZW1iZXJzOgogICAgIHB1YmxpYyAke21zZy5pbnRlcmZhY2UubmFtZX0uQnVpbGRlciBjcmVhdGVCdWlsZGVyKCkgewogICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXJXaXRoUGFyZW50KHRoaXMpOwogICAgIH0KQEAgLTg5LDcgKzk4LDcgQEAKIC8vOjogaW5jbHVkZSgiX2ZpZWxkX2FjY2Vzc29ycy5qYXZhIiwgbXNnPW1zZywgZ2VuZXJhdGVfc2V0dGVycz1UcnVlLCBidWlsZGVyPVRydWUpCiAKICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyAke21zZy5pbnRlcmZhY2UubmFtZX0gZ2V0TWVzc2FnZSgpIHsKKyAgICAgICAgcHVibGljICR7bXNnLmludGVyZmFjZS5uYW1lfSBidWlsZCgpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gbmV3ICR7aW1wbF9jbGFzc30oCiAgICAgICAgICAgICAgICAgICAgICR7IixcbiAgICAgICAgICAgICAgICAgICAgICAiLmpvaW4oCiAgICAgICAgICAgICAgICAgICAgICAgICAgWyAidGhpcy57MH1TZXQgPyB0aGlzLnswfSA6IHBhcmVudE1lc3NhZ2UuezB9Ii5mb3JtYXQocHJvcC5uYW1lKQpAQCAtMTEyLDcgKzEyMSw3IEBACiAvLzo6IGluY2x1ZGUoIl9maWVsZF9hY2Nlc3NvcnMuamF2YSIsIG1zZz1tc2csIGdlbmVyYXRlX3NldHRlcnM9VHJ1ZSwgYnVpbGRlcj1UcnVlKQogLy8KICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyAke21zZy5pbnRlcmZhY2UubmFtZX0gZ2V0TWVzc2FnZSgpIHsKKyAgICAgICAgcHVibGljICR7bXNnLmludGVyZmFjZS5uYW1lfSBidWlsZCgpIHsKICAgICAgICAgICAgIHJldHVybiBuZXcgJHtpbXBsX2NsYXNzfSgKICAgICAgICAgICAgICAgICAkeyIsXG4gICAgICAgICAgICAgICAgICAgICAgIi5qb2luKAogICAgICAgICAgICAgICAgICAgICAgWyAidGhpcy57MH1TZXQgPyB0aGlzLnswfSA6IHsxfS57Mn0iLmZvcm1hdChwcm9wLm5hbWUsIGltcGxfY2xhc3MsIHByb3AuZGVmYXVsdF9uYW1lKQpAQCAtMTI0LDYgKzEzMywxMyBAQAogICAgICAgICAvLzo6ICNlbmRpZgogCiAgICAgfQorICAgIC8vOjogZWxzZToKKyAgICAvLyBubyBkYXRhIG1lbWJlcnMgLSBkbyBub3Qgc3VwcG9ydCBidWlsZGVyCisgICAgcHVibGljICR7bXNnLmludGVyZmFjZS5uYW1lfS5CdWlsZGVyIGNyZWF0ZUJ1aWxkZXIoKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiJHtpbXBsX2NsYXNzfSBoYXMgbm8gbXV0YWJsZSBwcm9wZXJ0aWVzIC0tIGJ1aWxkZXIgdW5uZWVkZWQiKTsKKyAgICB9CisgICAgLy86OiAjZW5kaWYKKwogCiAgICAgZmluYWwgc3RhdGljIFJlYWRlciBSRUFERVIgPSBuZXcgUmVhZGVyKCk7CiAgICAgc3RhdGljIGNsYXNzIFJlYWRlciBpbXBsZW1lbnRzIE9GTWVzc2FnZVJlYWRlcjwke21zZy5pbnRlcmZhY2UubmFtZX0+IHsKQEAgLTEzMiw3ICsxNDgsOSBAQAogICAgICAgICAgICAgaW50IHN0YXJ0ID0gYmIucmVhZGVySW5kZXgoKTsKIC8vOjogZmllbGRzX3dpdGhfbGVuZ3RoX21lbWJlciA9IHt9CiAvLzo6IGZvciBwcm9wIGluIG1zZy5tZW1iZXJzOgotLy86OiBpZiBwcm9wLmlzX2RhdGE6CisvLzo6IGlmIHByb3AuaXNfdmlydHVhbDoKKy8vOjogICAgY29udGludWUKKy8vOjogZWxpZiBwcm9wLmlzX2RhdGE6CiAgICAgICAgICAgICAke3Byb3AuamF2YV90eXBlLnB1YmxpY190eXBlfSAke3Byb3AubmFtZX0gPSAke3Byb3AuamF2YV90eXBlLnJlYWRfb3AodmVyc2lvbiwgcHViX3R5cGU9VHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoPWZpZWxkc193aXRoX2xlbmd0aF9tZW1iZXJbcHJvcC5jX25hbWVdIGlmIHByb3AuY19uYW1lIGluIGZpZWxkc193aXRoX2xlbmd0aF9tZW1iZXIgZWxzZSBOb25lKX07CiAvLzo6IGVsaWYgcHJvcC5pc19wYWQ6CkBAIC0xNTksMTAgKzE3NywxNCBAQAogICAgICAgICAgICAgYmIuc2tpcEJ5dGVzKCgobGVuZ3RoICsgJHttc2cuYWxpZ24tMX0pLyR7bXNnLmFsaWdufSAqICR7bXNnLmFsaWdufSApIC0gbGVuZ3RoICk7CiAgICAgICAgICAgICAvLzo6ICNlbmRpZgogCisgICAgICAgICAgICAvLzo6IGlmIG1zZy5kYXRhX21lbWJlcnM6CiAgICAgICAgICAgICByZXR1cm4gbmV3ICR7aW1wbF9jbGFzc30oCiAgICAgICAgICAgICAgICAgICAgICR7IixcbiAgICAgICAgICAgICAgICAgICAgICAiLmpvaW4oCiAgICAgICAgICAgICAgICAgICAgICAgICAgWyBwcm9wLm5hbWUgZm9yIHByb3AgaW4gbXNnLmRhdGFfbWVtYmVyc10pfQogICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgLy86OiBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIElOU1RBTkNFOworICAgICAgICAgICAgLy86OiAjZW5kaWYKICAgICAgICAgfQogICAgIH0KIApAQCAtMTgwLDcgKzIwMiw5IEBACiAvLzo6IGlmIHByb3AuY19uYW1lIGluIGZpZWxkc193aXRoX2xlbmd0aF9tZW1iZXI6CiAgICAgICAgICAgICBpbnQgJHtwcm9wLm5hbWV9U3RhcnRJbmRleCA9IGJiLndyaXRlckluZGV4KCk7CiAvLzo6ICNlbmRpZgotLy86OiBpZiBwcm9wLmlzX2RhdGE6CisvLzo6IGlmIHByb3AuaXNfdmlydHVhbDoKKy8vOjogICAgY29udGludWUKKy8vOjogZWxpZiBwcm9wLmlzX2RhdGE6CiAgICAgICAgICAgICAke3Byb3AuamF2YV90eXBlLndyaXRlX29wKHZlcnNpb24sICJtZXNzYWdlLiIgKyBwcm9wLm5hbWUsIHB1Yl90eXBlPVRydWUpfTsKIC8vOjogZWxpZiBwcm9wLmlzX3BhZDoKICAgICAgICAgICAgIC8vIHBhZDogJHtwcm9wLmxlbmd0aH0gYnl0ZXMKZGlmZiAtLWdpdCBhL2phdmFfZ2VuL3RlbXBsYXRlcy9vZl9mYWN0b3JpZXMuamF2YSBiL2phdmFfZ2VuL3RlbXBsYXRlcy9vZl9mYWN0b3JpZXMuamF2YQppbmRleCBjY2UxMzRkLi45MjI1NTEwIDEwMDY0NAotLS0gYS9qYXZhX2dlbi90ZW1wbGF0ZXMvb2ZfZmFjdG9yaWVzLmphdmEKKysrIGIvamF2YV9nZW4vdGVtcGxhdGVzL29mX2ZhY3Rvcmllcy5qYXZhCkBAIC00MCw3ICs0MCw3IEBACiAgICAgICAgIHN3aXRjaCh2ZXJzaW9uKSB7CiAgICAgICAgICAgICAvLzo6IGZvciB2IGluIHZlcnNpb25zOgogICAgICAgICAgICAgY2FzZSAke3YuY29uc3RhbnRfdmVyc2lvbn06Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG9yZy5vcGVuZmxvdy5wcm90b2NvbC52ZXIke3Yub2ZfdmVyc2lvbn0uT0ZGYWN0b3J5VmVyJHt2Lm9mX3ZlcnNpb259LmdldEluc3RhbmNlKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG9yZy5vcGVuZmxvdy5wcm90b2NvbC52ZXIke3Yub2ZfdmVyc2lvbn0uT0ZGYWN0b3J5VmVyJHt2Lm9mX3ZlcnNpb259LklOU1RBTkNFOwogICAgICAgICAgICAgLy86OiAjZW5kZm9yCiAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVua25vd24gdmVyc2lvbjogIit2ZXJzaW9uKTsKZGlmZiAtLWdpdCBhL2phdmFfZ2VuL3RlbXBsYXRlcy9vZl9mYWN0b3J5X2NsYXNzLmphdmEgYi9qYXZhX2dlbi90ZW1wbGF0ZXMvb2ZfZmFjdG9yeV9jbGFzcy5qYXZhCmluZGV4IGZlYzBiY2YuLmU4MzM0NGIgMTAwNjQ0Ci0tLSBhL2phdmFfZ2VuL3RlbXBsYXRlcy9vZl9mYWN0b3J5X2NsYXNzLmphdmEKKysrIGIvamF2YV9nZW4vdGVtcGxhdGVzL29mX2ZhY3RvcnlfY2xhc3MuamF2YQpAQCAtMzYsMjUgKzM2LDUzIEBACiAvLzo6IGluY2x1ZGUoIl9pbXBvcnRzLmphdmEiKQogCiBwdWJsaWMgY2xhc3MgJHtmYWN0b3J5Lm5hbWV9IGltcGxlbWVudHMgJHtmYWN0b3J5LmludGVyZmFjZS5uYW1lfSB7CisgICAgcHVibGljIGZpbmFsIHN0YXRpYyAke2ZhY3RvcnkubmFtZX0gSU5TVEFOQ0UgPSBuZXcgJHtmYWN0b3J5Lm5hbWV9KCk7CisgICAgcHJpdmF0ZSAke2ZhY3RvcnkubmFtZX0oKSB7fQorCisgICAgLy86OiBmb3IgbmFtZSwgY2xhenogaW4gZmFjdG9yeS5pbnRlcmZhY2Uuc3ViX2ZhY3Rvcmllcy5pdGVtcygpOgorICAgIHB1YmxpYyAke2NsYXp6fSAke25hbWV9KCkgeworICAgICAgICByZXR1cm4gJHtjbGF6en1WZXIke2ZhY3RvcnkudmVyc2lvbi5vZl92ZXJzaW9ufS5JTlNUQU5DRTsKKyAgICB9CisgICAgLy86OiAjZW5kZm9yCisKIC8vOjogZm9yIGkgaW4gZmFjdG9yeS5pbnRlcmZhY2UubWVtYmVyczoKICAgICAvLzo6IGlmIGkuaXNfdmlydHVhbDoKICAgICAvLzo6ICAgIGNvbnRpbnVlCiAgICAgLy86OiAjZW5kaWYKIAotLy86OiAgIGlmIGkuaGFzX3ZlcnNpb24oZmFjdG9yeS52ZXJzaW9uKSBhbmQgbW9kZWwuZ2VuZXJhdGVfY2xhc3MoaS52ZXJzaW9uZWRfY2xhc3MoZmFjdG9yeS52ZXJzaW9uKSk6Ci0gICAgcHVibGljICR7aS5uYW1lfS5CdWlsZGVyIGNyZWF0ZSR7aS5uYW1lWzI6XX1CdWlsZGVyKCkgeworICAgIC8vOjogaWYgbGVuKGkud3JpdGVhYmxlX21lbWJlcnMpID4gMDoKKyAgICBwdWJsaWMgJHtpLm5hbWV9LkJ1aWxkZXIgJHtmYWN0b3J5LmludGVyZmFjZS5tZXRob2RfbmFtZShpLCBidWlsZGVyPVRydWUpfSgpIHsKKyAgICAgICAgLy86OiAgIGlmIGkuaGFzX3ZlcnNpb24oZmFjdG9yeS52ZXJzaW9uKSBhbmQgbW9kZWwuZ2VuZXJhdGVfY2xhc3MoaS52ZXJzaW9uZWRfY2xhc3MoZmFjdG9yeS52ZXJzaW9uKSk6CiAgICAgICAgIHJldHVybiBuZXcgJHtpLnZlcnNpb25lZF9jbGFzcyhmYWN0b3J5LnZlcnNpb24pLm5hbWV9LkJ1aWxkZXIoKTsKLSAgICB9Ci0vLzo6IGVsc2U6Ci0gICAgcHVibGljICR7aS5uYW1lfS5CdWlsZGVyIGNyZWF0ZSR7aS5uYW1lWzI6XX1CdWlsZGVyKCkgdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgLy86OiBlbHNlOgogICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIiR7aS5uYW1lfSBub3Qgc3VwcG9ydGVkIGluIHZlcnNpb24gJHtmYWN0b3J5LnZlcnNpb259Iik7CisgICAgICAgIC8vOjogI2VuZGlmCiAgICAgfQotLy86OiAjZW5kaWYKKyAgICAvLzo6ICNlbmRpZgorICAgIC8vOjogaWYgbGVuKGkud3JpdGVhYmxlX21lbWJlcnMpIDw9IDI6CisgICAgcHVibGljICR7aS5uYW1lfSAke2ZhY3RvcnkuaW50ZXJmYWNlLm1ldGhvZF9uYW1lKGksIGJ1aWxkZXI9RmFsc2UpfSgkeyIsICIuam9pbigiJXMgJXMiICUgKHAuamF2YV90eXBlLnB1YmxpY190eXBlLCBwLm5hbWUpIGZvciBwIGluIGkud3JpdGVhYmxlX21lbWJlcnMpfSkgeworICAgICAgICAvLzo6ICAgaWYgaS5oYXNfdmVyc2lvbihmYWN0b3J5LnZlcnNpb24pIGFuZCBtb2RlbC5nZW5lcmF0ZV9jbGFzcyhpLnZlcnNpb25lZF9jbGFzcyhmYWN0b3J5LnZlcnNpb24pKToKKyAgICAgICAgLy86OiBpZiBsZW4oaS53cml0ZWFibGVfbWVtYmVycykgPiAwOgorICAgICAgICByZXR1cm4gbmV3ICR7aS52ZXJzaW9uZWRfY2xhc3MoZmFjdG9yeS52ZXJzaW9uKS5uYW1lfSgKKyAgICAgICAgICAgICAgICAkeyIsXG4gICAgICAgICAgICAgICAgICAgICAgIi5qb2luKAorICAgICAgICAgICAgICAgICAgICAgICAgIFsgcHJvcC5uYW1lIGZvciBwcm9wIGluIGkudmVyc2lvbmVkX2NsYXNzKGZhY3RvcnkudmVyc2lvbikuZGF0YV9tZW1iZXJzXSl9CisgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgIC8vOjogZWxzZToKKyAgICAgICAgcmV0dXJuICR7aS52ZXJzaW9uZWRfY2xhc3MoZmFjdG9yeS52ZXJzaW9uKS5uYW1lfS5JTlNUQU5DRTsKKyAgICAgICAgLy86OiAjZW5kaWYKKyAgICAgICAgLy86OiBlbHNlOgorICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIiR7aS5uYW1lfSBub3Qgc3VwcG9ydGVkIGluIHZlcnNpb24gJHtmYWN0b3J5LnZlcnNpb259Iik7CisgICAgICAgIC8vOjogI2VuZGlmCisgICAgfQorICAgIC8vOjogI2VuZGlmCiAvLzo6ICNlbmRmb3IKIAotICAgIHB1YmxpYyBPRk1lc3NhZ2VSZWFkZXI8T0ZNZXNzYWdlPiBnZXRNZXNzYWdlUmVhZGVyKCkgewotICAgICAgICByZXR1cm4gT0ZNZXNzYWdlVmVyJHtmYWN0b3J5LnZlcnNpb24ub2ZfdmVyc2lvbn0uUkVBREVSOworICAgIHB1YmxpYyBPRk1lc3NhZ2VSZWFkZXI8JHtmYWN0b3J5LmJhc2VfY2xhc3N9PiBnZXRSZWFkZXIoKSB7CisvLzo6IGlmIGZhY3RvcnkudmVyc2lvbmVkX2Jhc2VfY2xhc3M6CisgICAgICAgIHJldHVybiAke2ZhY3RvcnkudmVyc2lvbmVkX2Jhc2VfY2xhc3MubmFtZX0uUkVBREVSOworLy86OiBlbHNlOgorICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIlJlYWRlcjwke2ZhY3RvcnkuYmFzZV9jbGFzc30+IG5vdCBzdXBwb3J0ZWQgaW4gdmVyc2lvbiAke2ZhY3RvcnkudmVyc2lvbn0iKTsKKy8vOjogI2VuZGlmCiAgICAgfQogCi0gICAgLy86OiBpbmNsdWRlKCJfc2luZ2xldG9uLmphdmEiLCBtc2c9ZmFjdG9yeSkKIH0KZGlmZiAtLWdpdCBhL2phdmFfZ2VuL3RlbXBsYXRlcy9vZl9mYWN0b3J5X2ludGVyZmFjZS5qYXZhIGIvamF2YV9nZW4vdGVtcGxhdGVzL29mX2ZhY3RvcnlfaW50ZXJmYWNlLmphdmEKaW5kZXggMzk0MzJhOC4uZmNiNjkwZiAxMDA2NDQKLS0tIGEvamF2YV9nZW4vdGVtcGxhdGVzL29mX2ZhY3RvcnlfaW50ZXJmYWNlLmphdmEKKysrIGIvamF2YV9nZW4vdGVtcGxhdGVzL29mX2ZhY3RvcnlfaW50ZXJmYWNlLmphdmEKQEAgLTMxLDE3ICszMSwyNyBAQAogCiAvLzo6IGluY2x1ZGUoJ19hdXRvZ2VuLmphdmEnKQogCi1wYWNrYWdlIG9yZy5vcGVuZmxvdy5wcm90b2NvbDsKK3BhY2thZ2UgJHtmYWN0b3J5LnBhY2thZ2V9OwogCiAvLzo6IGluY2x1ZGUoIl9pbXBvcnRzLmphdmEiKQogCiBwdWJsaWMgaW50ZXJmYWNlICR7ZmFjdG9yeS5uYW1lfSB7CisgICAgLy8gU3ViZmFjdG9yaWVzCisvLzo6IGZvciBuYW1lLCBjbGF6eiBpbiBmYWN0b3J5LnN1Yl9mYWN0b3JpZXMuaXRlbXMoKToKKyAgICAke2NsYXp6fSAke25hbWV9KCk7CisvLzo6ICNlbmRmb3IKKwogLy86OiBmb3IgaSBpbiBmYWN0b3J5Lm1lbWJlcnM6CiAgICAgLy86OiBpZiBpLmlzX3ZpcnR1YWw6CiAgICAgLy86OiAgICBjb250aW51ZQogICAgIC8vOjogI2VuZGlmCi0gICAgJHtpLm5hbWV9LkJ1aWxkZXIgY3JlYXRlJHtpLm5hbWVbMjpdfUJ1aWxkZXIoKSR7ICIiIGlmIGkuaXNfdW5pdmVyc2FsIGVsc2UgIiB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24ifTsKKyAgICAvLzo6IGlmIGxlbihpLndyaXRlYWJsZV9tZW1iZXJzKSA+IDA6CisgICAgJHtpLm5hbWV9LkJ1aWxkZXIgJHtmYWN0b3J5Lm1ldGhvZF9uYW1lKGksIGJ1aWxkZXI9VHJ1ZSl9KCkkeyAiIiBpZiBpLmlzX3VuaXZlcnNhbCBlbHNlICIgdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIn07CisgICAgLy86OiAjZW5kaWYKKyAgICAvLzo6IGlmIGxlbihpLndyaXRlYWJsZV9tZW1iZXJzKSA8PSAyOgorICAgICR7aS5uYW1lfSAke2ZhY3RvcnkubWV0aG9kX25hbWUoaSwgYnVpbGRlcj1GYWxzZSApfSgkeyIsICIuam9pbigiJXMgJXMiICUgKHAuamF2YV90eXBlLnB1YmxpY190eXBlLCBwLm5hbWUpIGZvciBwIGluIGkud3JpdGVhYmxlX21lbWJlcnMpfSk7CisgICAgLy86OiAjZW5kaWYKIC8vOjogI2VuZGZvcgogCi0gICAgT0ZNZXNzYWdlUmVhZGVyPE9GTWVzc2FnZT4gZ2V0TWVzc2FnZVJlYWRlcigpOworICAgIE9GTWVzc2FnZVJlYWRlcjwke2ZhY3RvcnkuYmFzZV9jbGFzc30+IGdldFJlYWRlcigpOwogfQpkaWZmIC0tZ2l0IGEvamF2YV9nZW4vdGVtcGxhdGVzL29mX2ludGVyZmFjZS5qYXZhIGIvamF2YV9nZW4vdGVtcGxhdGVzL29mX2ludGVyZmFjZS5qYXZhCmluZGV4IDRkZWM5MmYuLjhkZGFiYTMgMTAwNjQ0Ci0tLSBhL2phdmFfZ2VuL3RlbXBsYXRlcy9vZl9pbnRlcmZhY2UuamF2YQorKysgYi9qYXZhX2dlbi90ZW1wbGF0ZXMvb2ZfaW50ZXJmYWNlLmphdmEKQEAgLTI2LDYgKzI2LDcgQEAKIC8vOjogIyB1bmRlciB0aGUgRVBMLgogLy86OgogLy86OiBpbXBvcnQgaXRlcnRvb2xzCisvLzo6IGltcG9ydCByZQogLy86OiBpbXBvcnQgb2ZfZwogLy86OiBpbmNsdWRlKCdfY29weXJpZ2h0LmphdmEnKQogCkBAIC0zNSwyMCArMzYsMjEgQEAKIAogLy86OiBpbmNsdWRlKCJfaW1wb3J0cy5qYXZhIiwgbXNnPW1zZykKIAotcHVibGljIGludGVyZmFjZSAke21zZy5uYW1lfSBleHRlbmRzIE9GT2JqZWN0JHsiLCAlcyIgJSBtc2cucGFyZW50X2ludGVyZmFjZSBpZiBtc2cucGFyZW50X2ludGVyZmFjZSBlbHNlICIifXsKK3B1YmxpYyBpbnRlcmZhY2UgJHttc2cubmFtZX0keyAiPCVzPiIgJSBtc2cudHlwZV9hbm5vdGF0aW9uIGlmIG1zZy50eXBlX2Fubm90YXRpb24gZWxzZSAiIn0gZXh0ZW5kcyBPRk9iamVjdCR7IiwgJXMiICUgbXNnLnBhcmVudF9pbnRlcmZhY2UgaWYgbXNnLnBhcmVudF9pbnRlcmZhY2UgZWxzZSAiIn17CiAvLzo6IGZvciBwcm9wIGluIG1zZy5tZW1iZXJzOgotICAgICR7cHJvcC5qYXZhX3R5cGUucHVibGljX3R5cGV9IGdldCR7cHJvcC50aXRsZV9uYW1lfSgpJHsgIiIgaWYgcHJvcC5pc191bml2ZXJzYWwgZWxzZSAiIHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiJ9OworICAgICR7cHJvcC5qYXZhX3R5cGUucHVibGljX3R5cGV9ICR7cHJvcC5nZXR0ZXJfbmFtZX0oKSR7ICIiIGlmIHByb3AuaXNfdW5pdmVyc2FsIGVsc2UgIiB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24ifTsKIC8vOjogI2VuZGZvcgogCiAgICAgdm9pZCB3cml0ZVRvKENoYW5uZWxCdWZmZXIgY2hhbm5lbEJ1ZmZlcik7CiAKLSAgICBCdWlsZGVyIGNyZWF0ZUJ1aWxkZXIoKTsKLSAgICBwdWJsaWMgaW50ZXJmYWNlIEJ1aWxkZXIgJHsiZXh0ZW5kcyAlcy5CdWlsZGVyIiAlIG1zZy5wYXJlbnRfaW50ZXJmYWNlIGlmIG1zZy5wYXJlbnRfaW50ZXJmYWNlIGVsc2UgIiJ9IHsKLSAgICAgICAgJHttc2cubmFtZX0gZ2V0TWVzc2FnZSgpOworICAgIEJ1aWxkZXIke21zZy50eXBlX3ZhcmlhYmxlfSBjcmVhdGVCdWlsZGVyKCk7CisgICAgLy86OiBzaW1wbGVfdHlwZSwgYW5ub3RhdGlvbiA9IHJlLm1hdGNoKHInKFx3KykoPC4qPik/JywgbXNnLnBhcmVudF9pbnRlcmZhY2UpLmdyb3VwcygpIGlmIG1zZy5wYXJlbnRfaW50ZXJmYWNlIGVsc2UgKCIiLCAiIikKKyAgICBwdWJsaWMgaW50ZXJmYWNlIEJ1aWxkZXIkeyAiPCVzPiIgJSBtc2cudHlwZV9hbm5vdGF0aW9uIGlmIG1zZy50eXBlX2Fubm90YXRpb24gZWxzZSAiIn0gJHsiZXh0ZW5kcyAlcy5CdWlsZGVyIiAlIHNpbXBsZV90eXBlIGlmIG1zZy5wYXJlbnRfaW50ZXJmYWNlIGVsc2UgIiJ9JHthbm5vdGF0aW9uIGlmIGFubm90YXRpb24gZWxzZSAiIn0geworICAgICAgICAke21zZy5uYW1lfSR7bXNnLnR5cGVfdmFyaWFibGV9IGJ1aWxkKCk7CiAvLzo6IGZvciBwcm9wIGluIG1zZy5tZW1iZXJzOgotICAgICAgICAke3Byb3AuamF2YV90eXBlLnB1YmxpY190eXBlfSBnZXQke3Byb3AudGl0bGVfbmFtZX0oKSR7ICIiIGlmIHByb3AuaXNfdW5pdmVyc2FsIGVsc2UgIiB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24ifTsKKyAgICAgICAgJHtwcm9wLmphdmFfdHlwZS5wdWJsaWNfdHlwZX0gJHtwcm9wLmdldHRlcl9uYW1lfSgpJHsgIiIgaWYgcHJvcC5pc191bml2ZXJzYWwgZWxzZSAiIHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiJ9OwogLy86OiBpZiBwcm9wLmlzX3dyaXRlYWJsZToKLSAgICAgICAgQnVpbGRlciBzZXQke3Byb3AudGl0bGVfbmFtZX0oJHtwcm9wLmphdmFfdHlwZS5wdWJsaWNfdHlwZX0gJHtwcm9wLm5hbWV9KSR7ICIiIGlmIHByb3AuaXNfdW5pdmVyc2FsIGVsc2UgIiB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24ifTsKKyAgICAgICAgQnVpbGRlciAke3Byb3Auc2V0dGVyX25hbWV9KCR7cHJvcC5qYXZhX3R5cGUucHVibGljX3R5cGV9ICR7cHJvcC5uYW1lfSkkeyAiIiBpZiBwcm9wLmlzX3VuaXZlcnNhbCBlbHNlICIgdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIn07CiAvLzo6ICNlbmRpZgogLy86OiAjZW5kZm9yCiAgICAgfQpkaWZmIC0tZ2l0IGEvamF2YV9nZW4vdGVtcGxhdGVzL29mX3ZpcnR1YWxfY2xhc3MuamF2YSBiL2phdmFfZ2VuL3RlbXBsYXRlcy9vZl92aXJ0dWFsX2NsYXNzLmphdmEKaW5kZXggZjFhYzg0OS4uZmU1YzY2YyAxMDA2NDQKLS0tIGEvamF2YV9nZW4vdGVtcGxhdGVzL29mX3ZpcnR1YWxfY2xhc3MuamF2YQorKysgYi9qYXZhX2dlbi90ZW1wbGF0ZXMvb2ZfdmlydHVhbF9jbGFzcy5qYXZhCkBAIC0zNyw3ICszNyw3IEBACiAKIC8vOjogaW5jbHVkZSgiX2ltcG9ydHMuamF2YSIsIG1zZz1tc2cpCiAKLWFic3RyYWN0IGNsYXNzICR7bXNnLm5hbWV9IGltcGxlbWVudHMgJHttc2cuaW50ZXJmYWNlLm5hbWV9IHsKK2Fic3RyYWN0IGNsYXNzICR7bXNnLm5hbWV9IHsKICAgICAvLyB2ZXJzaW9uOiAke3ZlcnNpb259CiAgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYnl0ZSBXSVJFX1ZFUlNJT04gPSAke3ZlcnNpb24uaW50X3ZlcnNpb259OwogLy86OiBpZiBtc2cuaXNfZml4ZWRfbGVuZ3RoOgpAQCAtNDksNyArNDksNyBAQAogCiAgICAgcHVibGljIGZpbmFsIHN0YXRpYyAke21zZy5uYW1lfS5SZWFkZXIgUkVBREVSID0gbmV3IFJlYWRlcigpOwogCi0gICAgc3RhdGljIGNsYXNzIFJlYWRlciBpbXBsZW1lbnRzIE9GTWVzc2FnZVJlYWRlcjwke21zZy5pbnRlcmZhY2UubmFtZX0+IHsKKyAgICBzdGF0aWMgY2xhc3MgUmVhZGVyIGltcGxlbWVudHMgT0ZNZXNzYWdlUmVhZGVyPCR7bXNnLmludGVyZmFjZS5pbmhlcml0ZWRfZGVjbGFyYXRpb24oKX0+IHsKICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyAke21zZy5pbnRlcmZhY2UubmFtZX0gcmVhZEZyb20oQ2hhbm5lbEJ1ZmZlciBiYikgdGhyb3dzIE9GUGFyc2VFcnJvciB7CiAgICAgICAgICAgICBpbnQgc3RhcnQgPSBiYi5yZWFkZXJJbmRleCgpOwpkaWZmIC0tZ2l0IGEvamF2YV9nZW4vdGVtcGxhdGVzL3VuaXRfdGVzdC5qYXZhIGIvamF2YV9nZW4vdGVtcGxhdGVzL3VuaXRfdGVzdC5qYXZhCmluZGV4IDQ1NDcyZjIuLjQ3ZGNjMjQgMTAwNjQ0Ci0tLSBhL2phdmFfZ2VuL3RlbXBsYXRlcy91bml0X3Rlc3QuamF2YQorKysgYi9qYXZhX2dlbi90ZW1wbGF0ZXMvdW5pdF90ZXN0LmphdmEKQEAgLTU1LDkgKzU1LDkgQEAKICAgICAvLzo6IGlmICJqYXZhIiBpbiB0ZXN0X2RhdGE6CiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0V3JpdGUoKSB7Ci0gICAgICAgICR7dmFyX3R5cGV9LkJ1aWxkZXIgYnVpbGRlciA9IGZhY3RvcnkuY3JlYXRlJHt2YXJfdHlwZVsyOl19QnVpbGRlcigpOworICAgICAgICAke3Zhcl90eXBlfS5CdWlsZGVyIGJ1aWxkZXIgPSBmYWN0b3J5LmJ1aWxkJHt2YXJfdHlwZVsyOl19KCk7CiAgICAgICAgICR7dGVzdF9kYXRhWyJqYXZhIl19OwotICAgICAgICAke3Zhcl90eXBlfSAke3Zhcl9uYW1lfSA9IGJ1aWxkZXIuZ2V0TWVzc2FnZSgpOworICAgICAgICAke3Zhcl90eXBlfSAke3Zhcl9uYW1lfSA9IGJ1aWxkZXIuYnVpbGQoKTsKICAgICAgICAgQ2hhbm5lbEJ1ZmZlciBiYiA9IENoYW5uZWxCdWZmZXJzLmR5bmFtaWNCdWZmZXIoKTsKICAgICAgICAgJHt2YXJfbmFtZX0ud3JpdGVUbyhiYik7CiAgICAgICAgIGJ5dGVbXSB3cml0dGVuID0gbmV3IGJ5dGVbYmIucmVhZGFibGVCeXRlcygpXTsKQEAgLTY4LDkgKzY4LDkgQEAKIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFJlYWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgJHt2YXJfdHlwZX0uQnVpbGRlciBidWlsZGVyID0gZmFjdG9yeS5jcmVhdGUke3Zhcl90eXBlWzI6XX1CdWlsZGVyKCk7CisgICAgICAgICR7dmFyX3R5cGV9LkJ1aWxkZXIgYnVpbGRlciA9IGZhY3RvcnkuYnVpbGQke3Zhcl90eXBlWzI6XX0oKTsKICAgICAgICAgJHt0ZXN0X2RhdGFbImphdmEiXX07Ci0gICAgICAgICR7dmFyX3R5cGV9ICR7dmFyX25hbWV9QnVpbHQgPSBidWlsZGVyLmdldE1lc3NhZ2UoKTsKKyAgICAgICAgJHt2YXJfdHlwZX0gJHt2YXJfbmFtZX1CdWlsdCA9IGJ1aWxkZXIuYnVpbGQoKTsKIAogICAgICAgICBDaGFubmVsQnVmZmVyIGlucHV0ID0gQ2hhbm5lbEJ1ZmZlcnMuY29waWVkQnVmZmVyKCR7bXNnLmNvbnN0YW50X25hbWV9X1NFUklBTElaRUQpOwogCmRpZmYgLS1naXQgYS90ZXN0X2RhdGEvb2YxMy9mbG93X2FkZC5kYXRhIGIvdGVzdF9kYXRhL29mMTMvZmxvd19hZGQuZGF0YQppbmRleCBkMDFjMjA5Li4xMGIzZDJmIDEwMDY0NAotLS0gYS90ZXN0X2RhdGEvb2YxMy9mbG93X2FkZC5kYXRhCisrKyBiL3Rlc3RfZGF0YS9vZjEzL2Zsb3dfYWRkLmRhdGEKQEAgLTYyLDExICs2MiwxMSBAQAogICAgIC5zZXRPdXRQb3J0KE9GUG9ydC5vZig2KSkKICAgICAuc2V0T3V0R3JvdXAoOCkKICAgICAuc2V0RmxhZ3MoMCkKLSAgICAuc2V0TWF0Y2goZmFjdG9yeS5jcmVhdGVNYXRjaFYzQnVpbGRlcigpLmdldE1lc3NhZ2UoKSkgLy8gRklYTUU6IEB5b3RhbTogcmVwbGFjZSBvbmNlIHdlIGhhdmUgZ2VuZXJpYyBvZm1hdGNoCisgICAgLnNldE1hdGNoKGZhY3RvcnkuYnVpbGRNYXRjaFYzKCkuYnVpbGQoKSkgLy8gRklYTUU6IEB5b3RhbTogcmVwbGFjZSBvbmNlIHdlIGhhdmUgZ2VuZXJpYyBvZm1hdGNoCiAgICAgLnNldEluc3RydWN0aW9ucygKICAgICAgICAgSW1tdXRhYmxlTGlzdC48T0ZJbnN0cnVjdGlvbj5vZigKLSAgICAgICAgICAgIGZhY3RvcnkuY3JlYXRlSW5zdHJ1Y3Rpb25Hb3RvVGFibGVCdWlsZGVyKCkuc2V0VGFibGVJZCgoYnl0ZSkgNCkuZ2V0TWVzc2FnZSgpLAotICAgICAgICAgICAgZmFjdG9yeS5jcmVhdGVJbnN0cnVjdGlvbkdvdG9UYWJsZUJ1aWxkZXIoKS5zZXRUYWJsZUlkKChieXRlKSA3KS5nZXRNZXNzYWdlKCkKKyAgICAgICAgICAgIGZhY3RvcnkuaW5zdHJ1Y3Rpb25zKCkuZ290b1RhYmxlKChzaG9ydCkgNCksCisgICAgICAgICAgICBmYWN0b3J5Lmluc3RydWN0aW9ucygpLmdvdG9UYWJsZSgoc2hvcnQpIDcpCiAgICAgICAgICkKICAgICApOwogCmRpZmYgLS1naXQgYS90ZXN0X2RhdGEvb2YxMy9wYWNrZXRfaW4uZGF0YSBiL3Rlc3RfZGF0YS9vZjEzL3BhY2tldF9pbi5kYXRhCmluZGV4IDcxZTE3YjEuLjk1MWYyMTIgMTAwNjQ0Ci0tLSBhL3Rlc3RfZGF0YS9vZjEzL3BhY2tldF9pbi5kYXRhCisrKyBiL3Rlc3RfZGF0YS9vZjEzL3BhY2tldF9pbi5kYXRhCkBAIC0zMCw2ICszMCw4IEBACiAgICAgICAgIG9mcC5veG0uaW5fcG9ydF9tYXNrZWQodmFsdWU9NCwgdmFsdWVfbWFzaz01KV0pLAogICAgIGRhdGE9ImFiYyIpCiAtLSBqYXZhCitPRk94bXMgb3htcyA9IGZhY3Rvcnkub3htcygpOworCiBidWlsZGVyCiAgICAuc2V0WGlkKDB4MTIzNDU2NzgpCiAgICAuc2V0QnVmZmVySWQoMTAwKQpAQCAtMzgsMTIgKzQwLDEyIEBACiAgICAuc2V0VGFibGVJZCgoYnl0ZSkgMjApCiAgICAuc2V0Q29va2llKFU2NC5wYXJzZUhleCgiRkVEQ0JBOTg3NjU0MzIxMCIpKQogICAgLnNldE1hdGNoKAotICAgICAgICBmYWN0b3J5LmNyZWF0ZU1hdGNoVjNCdWlsZGVyKCkuc2V0T3htTGlzdCgKLSAgICAgICAgICAgIEltbXV0YWJsZUxpc3Qub2YoCi0gICAgICAgICAgICAgICAgZmFjdG9yeS5jcmVhdGVPeG1BcnBPcEJ1aWxkZXIoKS5zZXRWYWx1ZSgxKS5nZXRNZXNzYWdlKCksCi0gICAgICAgICAgICAgICAgZmFjdG9yeS5jcmVhdGVPeG1JblBvcnRNYXNrZWRCdWlsZGVyKCkuc2V0VmFsdWUoT0ZQb3J0Lm9mKDQpKS5zZXRWYWx1ZU1hc2soT0ZQb3J0Lm9mKDUpKS5nZXRNZXNzYWdlKCkKKyAgICAgICAgZmFjdG9yeS5idWlsZE1hdGNoVjMoKS5zZXRPeG1MaXN0KAorICAgICAgICAgICAgT0ZPeG1MaXN0Lm9mKAorICAgICAgICAgICAgICAgIG94bXMuYXJwT3AoQXJwT3Bjb2RlLkFSUF9PUENPREVfUkVRVUVTVCksCisgICAgICAgICAgICAgICAgb3htcy5pblBvcnRNYXNrZWQoT0ZQb3J0Lm9mKDQpLCBPRlBvcnQub2YoNSkpCiAgICAgICAgICAgICApCi0gICAgICAgICkuZ2V0TWVzc2FnZSgpCisgICAgICAgICkuYnVpbGQoKQogICAgICkKICAgICAuc2V0RGF0YShuZXcgYnl0ZVtdIHsgOTcsIDk4LCA5OSB9ICk7CiAK