ZGlmZiAtLWdpdCBhL1Rvb2xzL2kxOG4vcHlnZXR0ZXh0LnB5IGIvVG9vbHMvaTE4bi9weWdldHRleHQucHkKaW5kZXggZDAzMjBjZi4uZjA0ODhiZiAxMDA3NTUKLS0tIGEvVG9vbHMvaTE4bi9weWdldHRleHQucHkKKysrIGIvVG9vbHMvaTE4bi9weWdldHRleHQucHkKQEAgLTIsNyArMiw3IEBACiAjIC0qLSBjb2Rpbmc6IGlzby04ODU5LTEgLSotCiAjIE9yaWdpbmFsbHkgd3JpdHRlbiBieSBCYXJyeSBXYXJzYXcgPGJhcnJ5QHpvcGUuY29tPgogIwotIyBNaW5pbWFsbHkgcGF0Y2hlZCB0byBtYWtlIGl0IGV2ZW4gbW9yZSB4Z2V0dGV4dCBjb21wYXRpYmxlIAorIyBNaW5pbWFsbHkgcGF0Y2hlZCB0byBtYWtlIGl0IGV2ZW4gbW9yZSB4Z2V0dGV4dCBjb21wYXRpYmxlCiAjIGJ5IFBldGVyIEZ1bmsgPHBmQGFydGNvbS1nbWJoLmRlPgogIwogIyAyMDAyLTExLTIyIEr8cmdlbiBIZXJtYW5uIDxqaEB3ZWIuZGU+CkBAIC0yNSwxNyArMjUsMTcgQEAKIE1hbnkgc3lzdGVtcyAoU29sYXJpcywgTGludXgsIEdudSkgcHJvdmlkZSBleHRlbnNpdmUgdG9vbHMgdGhhdCBlYXNlIHRoZQogaW50ZXJuYXRpb25hbGl6YXRpb24gb2YgQyBwcm9ncmFtcy4gTW9zdCBvZiB0aGVzZSB0b29scyBhcmUgaW5kZXBlbmRlbnQgb2YKIHRoZSBwcm9ncmFtbWluZyBsYW5ndWFnZSBhbmQgY2FuIGJlIHVzZWQgZnJvbSB3aXRoaW4gUHl0aG9uIHByb2dyYW1zLgotTWFydGluIHZvbiBMb2V3aXMnIHdvcmtbMV0gaGVscHMgY29uc2lkZXJhYmx5IGluIHRoaXMgcmVnYXJkLiAKK01hcnRpbiB2b24gTG9ld2lzJyB3b3JrWzFdIGhlbHBzIGNvbnNpZGVyYWJseSBpbiB0aGlzIHJlZ2FyZC4KIAogVGhlcmUncyBvbmUgcHJvYmxlbSB0aG91Z2g7IHhnZXR0ZXh0IGlzIHRoZSBwcm9ncmFtIHRoYXQgc2NhbnMgc291cmNlIGNvZGUKIGxvb2tpbmcgZm9yIG1lc3NhZ2Ugc3RyaW5ncywgYnV0IGl0IGdyb2tzIG9ubHkgQyAob3IgQysrKS4gUHl0aG9uCiBpbnRyb2R1Y2VzIGEgZmV3IHdyaW5rbGVzLCBzdWNoIGFzIGR1YWwgcXVvdGluZyBjaGFyYWN0ZXJzLCB0cmlwbGUgcXVvdGVkCi1zdHJpbmdzLCBhbmQgcmF3IHN0cmluZ3MuIHhnZXR0ZXh0IHVuZGVyc3RhbmRzIG5vbmUgb2YgdGhpcy4gCitzdHJpbmdzLCBhbmQgcmF3IHN0cmluZ3MuIHhnZXR0ZXh0IHVuZGVyc3RhbmRzIG5vbmUgb2YgdGhpcy4KIAogRW50ZXIgcHlnZXR0ZXh0LCB3aGljaCB1c2VzIFB5dGhvbidzIHN0YW5kYXJkIHRva2VuaXplIG1vZHVsZSB0byBzY2FuCiBQeXRob24gc291cmNlIGNvZGUsIGdlbmVyYXRpbmcgLnBvdCBmaWxlcyBpZGVudGljYWwgdG8gd2hhdCBHTlUgeGdldHRleHRbMl0KIGdlbmVyYXRlcyBmb3IgQyBhbmQgQysrIGNvZGUuIEZyb20gdGhlcmUsIHRoZSBzdGFuZGFyZCBHTlUgdG9vbHMgY2FuIGJlCi11c2VkLiAKK3VzZWQuCiAKIEEgd29yZCBhYm91dCBtYXJraW5nIFB5dGhvbiBzdHJpbmdzIGFzIGNhbmRpZGF0ZXMgZm9yIHRyYW5zbGF0aW9uLiBHTlUKIHhnZXR0ZXh0IHJlY29nbml6ZXMgdGhlIGZvbGxvd2luZyBrZXl3b3JkczogZ2V0dGV4dCwgZGdldHRleHQsIGRjZ2V0dGV4dCwKQEAgLTQzLDcgKzQzLDcgQEAKIGNvZGUuIEMgYW5kIEMrKyBoYXZlIGEgdHJpY2s6IHRoZXkgdXNlIHRoZSBDIHByZXByb2Nlc3Nvci4gTW9zdAogaW50ZXJuYXRpb25hbGl6ZWQgQyBzb3VyY2UgaW5jbHVkZXMgYSAjZGVmaW5lIGZvciBnZXR0ZXh0KCkgdG8gXygpIHNvIHRoYXQKIHdoYXQgaGFzIHRvIGJlIHdyaXR0ZW4gaW4gdGhlIHNvdXJjZSBpcyBtdWNoIGxlc3MuIFRodXMgdGhlc2UgYXJlIGJvdGgKLXRyYW5zbGF0YWJsZSBzdHJpbmdzOiAKK3RyYW5zbGF0YWJsZSBzdHJpbmdzOgogCiAgICAgZ2V0dGV4dCgiVHJhbnNsYXRhYmxlIFN0cmluZyIpCiAgICAgXygiVHJhbnNsYXRhYmxlIFN0cmluZyIpCkBAIC01OSw3ICs1OSw3IEBACiB4Z2V0dGV4dCB3aGVyZSBldmVyIHBvc3NpYmxlLiBIb3dldmVyIHNvbWUgb3B0aW9ucyBhcmUgc3RpbGwgbWlzc2luZyBvciBhcmUKIG5vdCBmdWxseSBpbXBsZW1lbnRlZC4gQWxzbywgeGdldHRleHQncyB1c2Ugb2YgY29tbWFuZCBsaW5lIHN3aXRjaGVzIHdpdGgKIG9wdGlvbiBhcmd1bWVudHMgaXMgYnJva2VuLCBhbmQgaW4gdGhlc2UgY2FzZXMsIHB5Z2V0dGV4dCBqdXN0IGRlZmluZXMKLWFkZGl0aW9uYWwgc3dpdGNoZXMuIAorYWRkaXRpb25hbCBzd2l0Y2hlcy4KIAogVXNhZ2U6IHB5Z2V0dGV4dCBbb3B0aW9uc10gaW5wdXRmaWxlIC4uLgogCkBAIC0xNTYsNyArMTU2LDkgQEAKICIiIikKIAogaW1wb3J0IG9zCitpbXBvcnQgaW1wCiBpbXBvcnQgc3lzCitpbXBvcnQgZ2xvYgogaW1wb3J0IHRpbWUKIGltcG9ydCBnZXRvcHQKIGltcG9ydCB0b2tlbgpAQCAtMjU2LDE5ICsyNTgsMTcgQEAKIAogDAogZGVmIGNvbnRhaW5zQW55KHN0ciwgc2V0KToKLSAgICAiIiIgQ2hlY2sgd2hldGhlciAnc3RyJyBjb250YWlucyBBTlkgb2YgdGhlIGNoYXJzIGluICdzZXQnCi0gICAgIiIiCisgICAgIiIiQ2hlY2sgd2hldGhlciAnc3RyJyBjb250YWlucyBBTlkgb2YgdGhlIGNoYXJzIGluICdzZXQnIiIiCiAgICAgcmV0dXJuIDEgaW4gW2MgaW4gc3RyIGZvciBjIGluIHNldF0KIAogCiBkZWYgX3Zpc2l0X3B5ZmlsZXMobGlzdCwgZGlybmFtZSwgbmFtZXMpOgotICAgICIiIiBIZWxwZXIgZm9yIGdldEZpbGVzRm9yTmFtZSgpLgotICAgICIiIgorICAgICIiIkhlbHBlciBmb3IgZ2V0RmlsZXNGb3JOYW1lKCkuIiIiCiAgICAgIyBnZXQgZXh0ZW5zaW9uIGZvciBweXRob24gc291cmNlIGZpbGVzCiAgICAgaWYgbm90IGdsb2JhbHMoKS5oYXNfa2V5KCdfcHlfZXh0Jyk6Ci0gICAgICAgIGltcG9ydCBpbXAKICAgICAgICAgZ2xvYmFsIF9weV9leHQKLSAgICAgICAgX3B5X2V4dCA9IFt0cmlwbGVbMF0gZm9yIHRyaXBsZSBpbiBpbXAuZ2V0X3N1ZmZpeGVzKCkgaWYgdHJpcGxlWzJdID09IGltcC5QWV9TT1VSQ0VdWzBdCisgICAgICAgIF9weV9leHQgPSBbdHJpcGxlWzBdIGZvciB0cmlwbGUgaW4gaW1wLmdldF9zdWZmaXhlcygpCisgICAgICAgICAgICAgICAgICAgaWYgdHJpcGxlWzJdID09IGltcC5QWV9TT1VSQ0VdWzBdCiAKICAgICAjIGRvbid0IHJlY3Vyc2UgaW50byBDVlMgZGlyZWN0b3JpZXMKICAgICBpZiAnQ1ZTJyBpbiBuYW1lczoKQEAgLTI3NiwyMCArMjc2LDE4IEBACiAKICAgICAjIGFkZCBhbGwgKi5weSBmaWxlcyB0byBsaXN0CiAgICAgbGlzdC5leHRlbmQoCi0gICAgICAgIFtvcy5wYXRoLmpvaW4oZGlybmFtZSwgZmlsZSkKLSAgICAgICAgICAgIGZvciBmaWxlIGluIG5hbWVzCi0gICAgICAgICAgICAgICAgaWYgb3MucGF0aC5zcGxpdGV4dChmaWxlKVsxXSA9PSBfcHlfZXh0XSkKKyAgICAgICAgW29zLnBhdGguam9pbihkaXJuYW1lLCBmaWxlKSBmb3IgZmlsZSBpbiBuYW1lcworICAgICAgICAgaWYgb3MucGF0aC5zcGxpdGV4dChmaWxlKVsxXSA9PSBfcHlfZXh0XQorICAgICAgICApCiAKIAogZGVmIF9nZXRfbW9kcGtnX3BhdGgoZG90dGVkX25hbWUsIHBhdGhsaXN0PU5vbmUpOgotICAgICIiIiBHZXQgdGhlIGZpbGVzeXN0ZW0gcGF0aCBmb3IgYSBtb2R1bGUgb3IgYSBwYWNrYWdlLgorICAgICIiIkdldCB0aGUgZmlsZXN5c3RlbSBwYXRoIGZvciBhIG1vZHVsZSBvciBhIHBhY2thZ2UuCiAKLSAgICAgICAgUmV0dXJuIHRoZSBmaWxlIHN5c3RlbSBwYXRoIHRvIGEgZmlsZSBmb3IgYSBtb2R1bGUsCi0gICAgICAgIGFuZCB0byBhIGRpcmVjdG9yeSBmb3IgYSBwYWNrYWdlLiBSZXR1cm4gTm9uZSBpZgotICAgICAgICB0aGUgbmFtZSBpcyBub3QgZm91bmQsIG9yIGlzIGEgYnVpbHRpbiBvciBleHRlbnNpb24gbW9kdWxlLgorICAgIFJldHVybiB0aGUgZmlsZSBzeXN0ZW0gcGF0aCB0byBhIGZpbGUgZm9yIGEgbW9kdWxlLCBhbmQgdG8gYSBkaXJlY3RvcnkgZm9yCisgICAgYSBwYWNrYWdlLiBSZXR1cm4gTm9uZSBpZiB0aGUgbmFtZSBpcyBub3QgZm91bmQsIG9yIGlzIGEgYnVpbHRpbiBvcgorICAgIGV4dGVuc2lvbiBtb2R1bGUuCiAgICAgIiIiCi0gICAgaW1wb3J0IGltcAotCiAgICAgIyBzcGxpdCBvZmYgdG9wLW1vc3QgbmFtZQogICAgIHBhcnRzID0gZG90dGVkX25hbWUuc3BsaXQoJy4nLCAxKQogCkBAIC0zMTAsOCArMzA4LDEwIEBACiAgICAgZWxzZToKICAgICAgICAgIyBwbGFpbiBuYW1lCiAgICAgICAgIHRyeToKLSAgICAgICAgICAgIGZpbGUsIHBhdGhuYW1lLCBkZXNjcmlwdGlvbiA9IGltcC5maW5kX21vZHVsZShkb3R0ZWRfbmFtZSwgcGF0aGxpc3QpCi0gICAgICAgICAgICBpZiBmaWxlOiBmaWxlLmNsb3NlKCkKKyAgICAgICAgICAgIGZpbGUsIHBhdGhuYW1lLCBkZXNjcmlwdGlvbiA9IGltcC5maW5kX21vZHVsZSgKKyAgICAgICAgICAgICAgICBkb3R0ZWRfbmFtZSwgcGF0aGxpc3QpCisgICAgICAgICAgICBpZiBmaWxlOgorICAgICAgICAgICAgICAgIGZpbGUuY2xvc2UoKQogICAgICAgICAgICAgaWYgZGVzY3JpcHRpb25bMl0gbm90IGluIFtpbXAuUFlfU09VUkNFLCBpbXAuUEtHX0RJUkVDVE9SWV06CiAgICAgICAgICAgICAgICAgcGF0aG5hbWUgPSBOb25lCiAgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKQEAgLTMyMSwxNSArMzIxLDEyIEBACiAKIAogZGVmIGdldEZpbGVzRm9yTmFtZShuYW1lKToKLSAgICAiIiIgR2V0IGEgbGlzdCBvZiBtb2R1bGUgZmlsZXMgZm9yIGEgZmlsZW5hbWUsIGEgbW9kdWxlIG9yIHBhY2thZ2UgbmFtZSwKLSAgICAgICAgb3IgYSBkaXJlY3RvcnkuCisgICAgIiIiR2V0IGEgbGlzdCBvZiBtb2R1bGUgZmlsZXMgZm9yIGEgZmlsZW5hbWUsIGEgbW9kdWxlIG9yIHBhY2thZ2UgbmFtZSwKKyAgICBvciBhIGRpcmVjdG9yeS4KICAgICAiIiIKLSAgICBpbXBvcnQgaW1wCi0KICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMobmFtZSk6CiAgICAgICAgICMgY2hlY2sgZm9yIGdsb2IgY2hhcnMKICAgICAgICAgaWYgY29udGFpbnNBbnkobmFtZSwgIio/W10iKToKLSAgICAgICAgICAgIGltcG9ydCBnbG9iCiAgICAgICAgICAgICBmaWxlcyA9IGdsb2IuZ2xvYihuYW1lKQogICAgICAgICAgICAgbGlzdCA9IFtdCiAgICAgICAgICAgICBmb3IgZmlsZSBpbiBmaWxlczoKQEAgLTQxNSw3ICs0MTIsNyBAQAogICAgIGRlZiBfX29wZW5zZWVuKHNlbGYsIHR0eXBlLCB0c3RyaW5nLCBsaW5lbm8pOgogICAgICAgICBpZiB0dHlwZSA9PSB0b2tlbml6ZS5PUCBhbmQgdHN0cmluZyA9PSAnKSc6CiAgICAgICAgICAgICAjIFdlJ3ZlIHNlZW4gdGhlIGxhc3Qgb2YgdGhlIHRyYW5zbGF0YWJsZSBzdHJpbmdzLiAgUmVjb3JkIHRoZQotICAgICAgICAgICAgIyBsaW5lIG51bWJlciBvZiB0aGUgZmlyc3QgbGluZSBvZiB0aGUgc3RyaW5ncyBhbmQgdXBkYXRlIHRoZSBsaXN0IAorICAgICAgICAgICAgIyBsaW5lIG51bWJlciBvZiB0aGUgZmlyc3QgbGluZSBvZiB0aGUgc3RyaW5ncyBhbmQgdXBkYXRlIHRoZSBsaXN0CiAgICAgICAgICAgICAjIG9mIG1lc3NhZ2VzIHNlZW4uICBSZXNldCBzdGF0ZSBmb3IgdGhlIG5leHQgYmF0Y2guICBJZiB0aGVyZQogICAgICAgICAgICAgIyB3ZXJlIG5vIHN0cmluZ3MgaW5zaWRlIF8oKSwgdGhlbiBqdXN0IGlnbm9yZSB0aGlzIGVudHJ5LgogICAgICAgICAgICAgaWYgc2VsZi5fX2RhdGE6CkBAIC00MjYsOCArNDIzLDEzIEBACiAgICAgICAgIGVsaWYgdHR5cGUgbm90IGluIFt0b2tlbml6ZS5DT01NRU5ULCB0b2tlbi5JTkRFTlQsIHRva2VuLkRFREVOVCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuLk5FV0xJTkUsIHRva2VuaXplLk5MXToKICAgICAgICAgICAgICMgd2FybiBpZiB3ZSBzZWUgYW55dGhpbmcgZWxzZSB0aGFuIFNUUklORyBvciB3aGl0ZXNwYWNlCi0gICAgICAgICAgICBwcmludCA+PnN5cy5zdGRlcnIsIF8oJyoqKiAlKGZpbGUpczolKGxpbmVubylzOiBTZWVuIHVuZXhwZWN0ZWQgdG9rZW4gIiUodG9rZW4pcyInKSAlIHsKLSAgICAgICAgICAgICAgICAndG9rZW4nOiB0c3RyaW5nLCAnZmlsZSc6IHNlbGYuX19jdXJmaWxlLCAnbGluZW5vJzogc2VsZi5fX2xpbmVub30KKyAgICAgICAgICAgIHByaW50ID4+IHN5cy5zdGRlcnIsIF8oCisgICAgICAgICAgICAgICAgJyoqKiAlKGZpbGUpczolKGxpbmVubylzOiBTZWVuIHVuZXhwZWN0ZWQgdG9rZW4gIiUodG9rZW4pcyInCisgICAgICAgICAgICAgICAgKSAlIHsKKyAgICAgICAgICAgICAgICAndG9rZW4nOiB0c3RyaW5nLAorICAgICAgICAgICAgICAgICdmaWxlJzogc2VsZi5fX2N1cmZpbGUsCisgICAgICAgICAgICAgICAgJ2xpbmVubyc6IHNlbGYuX19saW5lbm8KKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICBzZWxmLl9fc3RhdGUgPSBzZWxmLl9fd2FpdGluZwogCiAgICAgZGVmIF9fYWRkZW50cnkoc2VsZiwgbXNnLCBsaW5lbm89Tm9uZSwgaXNkb2NzdHJpbmc9MCk6CkBAIC02NjIsNiArNjY0LDYgQEAKICAgICBtYWluKCkKICAgICAjIHNvbWUgbW9yZSB0ZXN0IHN0cmluZ3MKICAgICBfKHUnYSB1bmljb2RlIHN0cmluZycpCi0gICAgXygnKioqIFNlZW4gdW5leHBlY3RlZCB0b2tlbiAiJSh0b2tlbilzIicgJSB7J3Rva2VuJzogJ3Rlc3QnfSkgIyB0aGlzIG9uZSBjcmVhdGVzIGEgd2FybmluZworICAgICMgdGhpcyBvbmUgY3JlYXRlcyBhIHdhcm5pbmcKKyAgICBfKCcqKiogU2VlbiB1bmV4cGVjdGVkIHRva2VuICIlKHRva2VuKXMiJykgJSB7J3Rva2VuJzogJ3Rlc3QnfQogICAgIF8oJ21vcmUnICd0aGFuJyAnb25lJyAnc3RyaW5nJykKLQo=