ZGlmZiAtLWdpdCBhL0xpYi9saWIydG8zL2ZpeGVyX2Jhc2UucHkgYi9MaWIvbGliMnRvMy9maXhlcl9iYXNlLnB5CmluZGV4IGMzNjFlNjEuLmFlOTk1NjYgMTAwNjQ0Ci0tLSBhL0xpYi9saWIydG8zL2ZpeGVyX2Jhc2UucHkKKysrIGIvTGliL2xpYjJ0bzMvZml4ZXJfYmFzZS5weQpAQCAtMzMsNiArMzMsOCBAQAogICAgIGV4cGxpY2l0ID0gRmFsc2UgIyBJcyB0aGlzIGlnbm9yZWQgYnkgcmVmYWN0b3IucHkgLWYgYWxsPwogICAgIHJ1bl9vcmRlciA9IDUgICAjIEZpeGVycyB3aWxsIGJlIHNvcnRlZCBieSBydW4gb3JkZXIgYmVmb3JlIGV4ZWN1dGlvbgogICAgICAgICAgICAgICAgICAgICAjIExvd2VyIG51bWJlcnMgd2lsbCBiZSBydW4gZmlyc3QuCisgICAgX2FjY2VwdF90eXBlID0gTm9uZSAjIFtBZHZhbmNlZCBhbmQgbm90IHB1YmxpY10gVGhpcyB0ZWxscyBSZWZhY3RvcmluZ1Rvb2wKKyAgICAgICAgICAgICAgICAgICAgICAgICMgd2hpY2ggbm9kZSB0eXBlIHRvIGFjY2VwdCB3aGVuIHRoZXJlJ3Mgbm90IGEgcGF0dGVybi4KIAogICAgICMgU2hvcnRjdXQgZm9yIGFjY2VzcyB0byBQeXRob24gZ3JhbW1hciBzeW1ib2xzCiAgICAgc3ltcyA9IHB5Z3JhbS5weXRob25fc3ltYm9scwpkaWZmIC0tZ2l0IGEvTGliL2xpYjJ0bzMvZml4ZXMvZml4X2ltcG9ydC5weSBiL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF9pbXBvcnQucHkKaW5kZXggMTAzYzNlZi4uOTk4ZmU2MSAxMDA2NDQKLS0tIGEvTGliL2xpYjJ0bzMvZml4ZXMvZml4X2ltcG9ydC5weQorKysgYi9MaWIvbGliMnRvMy9maXhlcy9maXhfaW1wb3J0LnB5CkBAIC0xMiw3ICsxMiw3IEBACiAKICMgTG9jYWwgaW1wb3J0cwogZnJvbSAuLiBpbXBvcnQgZml4ZXJfYmFzZQotZnJvbSBvcy5wYXRoIGltcG9ydCBkaXJuYW1lLCBqb2luLCBleGlzdHMsIHBhdGhzZXAKK2Zyb20gb3MucGF0aCBpbXBvcnQgZGlybmFtZSwgam9pbiwgZXhpc3RzLCBzZXAKIGZyb20gLi5maXhlcl91dGlsIGltcG9ydCBGcm9tSW1wb3J0LCBzeW1zLCB0b2tlbgogCiAKQEAgLTg0LDcgKzg0LDcgQEAKICAgICAgICAgIyBzbyBjYW4ndCBiZSBhIHJlbGF0aXZlIGltcG9ydC4KICAgICAgICAgaWYgbm90IGV4aXN0cyhqb2luKGRpcm5hbWUoYmFzZV9wYXRoKSwgJ19faW5pdF9fLnB5JykpOgogICAgICAgICAgICAgcmV0dXJuIEZhbHNlCi0gICAgICAgIGZvciBleHQgaW4gWycucHknLCBwYXRoc2VwLCAnLnB5YycsICcuc28nLCAnLnNsJywgJy5weWQnXToKKyAgICAgICAgZm9yIGV4dCBpbiBbJy5weScsIHNlcCwgJy5weWMnLCAnLnNvJywgJy5zbCcsICcucHlkJ106CiAgICAgICAgICAgICBpZiBleGlzdHMoYmFzZV9wYXRoICsgZXh0KToKICAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQogICAgICAgICByZXR1cm4gRmFsc2UKZGlmZiAtLWdpdCBhL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF9pbXBvcnRzLnB5IGIvTGliL2xpYjJ0bzMvZml4ZXMvZml4X2ltcG9ydHMucHkKaW5kZXggOWFlY2EzOC4uNmM0MWM3MSAxMDA2NDQKLS0tIGEvTGliL2xpYjJ0bzMvZml4ZXMvZml4X2ltcG9ydHMucHkKKysrIGIvTGliL2xpYjJ0bzMvZml4ZXMvZml4X2ltcG9ydHMucHkKQEAgLTg0LDggKzg0LDYgQEAKIAogY2xhc3MgRml4SW1wb3J0cyhmaXhlcl9iYXNlLkJhc2VGaXgpOgogCi0gICAgb3JkZXIgPSAicHJlIiAjIFByZS1vcmRlciB0cmVlIHRyYXZlcnNhbAotCiAgICAgIyBUaGlzIGlzIG92ZXJyaWRkZW4gaW4gZml4X2ltcG9ydHMyLgogICAgIG1hcHBpbmcgPSBNQVBQSU5HCiAKZGlmZiAtLWdpdCBhL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF9sb25nLnB5IGIvTGliL2xpYjJ0bzMvZml4ZXMvZml4X2xvbmcucHkKaW5kZXggYjVlMGJkYi4uOWQyNWI3NCAxMDA2NDQKLS0tIGEvTGliL2xpYjJ0bzMvZml4ZXMvZml4X2xvbmcucHkKKysrIGIvTGliL2xpYjJ0bzMvZml4ZXMvZml4X2xvbmcucHkKQEAgLTUsMTggKzUsMTUgQEAKICIiIgogCiAjIExvY2FsIGltcG9ydHMKLWZyb20gLi4gaW1wb3J0IGZpeGVyX2Jhc2UKLWZyb20gLi5maXhlcl91dGlsIGltcG9ydCBOYW1lLCBOdW1iZXIsIGlzX3Byb2JhYmx5X2J1aWx0aW4KK2Zyb20gbGliMnRvMyBpbXBvcnQgZml4ZXJfYmFzZQorZnJvbSBsaWIydG8zLmZpeGVyX3V0aWwgaW1wb3J0IGlzX3Byb2JhYmx5X2J1aWx0aW4KIAogCiBjbGFzcyBGaXhMb25nKGZpeGVyX2Jhc2UuQmFzZUZpeCk6CiAKICAgICBQQVRURVJOID0gIidsb25nJyIKIAotICAgIHN0YXRpY19pbnQgPSBOYW1lKCJpbnQiKQotCiAgICAgZGVmIHRyYW5zZm9ybShzZWxmLCBub2RlLCByZXN1bHRzKToKICAgICAgICAgaWYgaXNfcHJvYmFibHlfYnVpbHRpbihub2RlKToKLSAgICAgICAgICAgIG5ldyA9IHNlbGYuc3RhdGljX2ludC5jbG9uZSgpCi0gICAgICAgICAgICBuZXcucHJlZml4ID0gbm9kZS5wcmVmaXgKLSAgICAgICAgICAgIHJldHVybiBuZXcKKyAgICAgICAgICAgIG5vZGUudmFsdWUgPSAiaW50IgorICAgICAgICAgICAgbm9kZS5jaGFuZ2VkKCkKZGlmZiAtLWdpdCBhL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF9uZS5weSBiL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF9uZS5weQppbmRleCAxNDcyMDM2Li5lM2VlMTBmIDEwMDY0NAotLS0gYS9MaWIvbGliMnRvMy9maXhlcy9maXhfbmUucHkKKysrIGIvTGliL2xpYjJ0bzMvZml4ZXMvZml4X25lLnB5CkBAIC0xMiw5ICsxMiwxMSBAQAogY2xhc3MgRml4TmUoZml4ZXJfYmFzZS5CYXNlRml4KToKICAgICAjIFRoaXMgaXMgc28gc2ltcGxlIHRoYXQgd2UgZG9uJ3QgbmVlZCB0aGUgcGF0dGVybiBjb21waWxlci4KIAorICAgIF9hY2NlcHRfdHlwZSA9IHRva2VuLk5PVEVRVUFMCisKICAgICBkZWYgbWF0Y2goc2VsZiwgbm9kZSk6CiAgICAgICAgICMgT3ZlcnJpZGUKLSAgICAgICAgcmV0dXJuIG5vZGUudHlwZSA9PSB0b2tlbi5OT1RFUVVBTCBhbmQgbm9kZS52YWx1ZSA9PSAiPD4iCisgICAgICAgIHJldHVybiBub2RlLnZhbHVlID09ICI8PiIKIAogICAgIGRlZiB0cmFuc2Zvcm0oc2VsZiwgbm9kZSwgcmVzdWx0cyk6CiAgICAgICAgIG5ldyA9IHB5dHJlZS5MZWFmKHRva2VuLk5PVEVRVUFMLCAiIT0iLCBwcmVmaXg9bm9kZS5wcmVmaXgpCmRpZmYgLS1naXQgYS9MaWIvbGliMnRvMy9maXhlcy9maXhfbnVtbGl0ZXJhbHMucHkgYi9MaWIvbGliMnRvMy9maXhlcy9maXhfbnVtbGl0ZXJhbHMucHkKaW5kZXggNjU1Mjc0MC4uNzkyMDdkNCAxMDA2NDQKLS0tIGEvTGliL2xpYjJ0bzMvZml4ZXMvZml4X251bWxpdGVyYWxzLnB5CisrKyBiL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF9udW1saXRlcmFscy5weQpAQCAtMTIsMTAgKzEyLDExIEBACiBjbGFzcyBGaXhOdW1saXRlcmFscyhmaXhlcl9iYXNlLkJhc2VGaXgpOgogICAgICMgVGhpcyBpcyBzbyBzaW1wbGUgdGhhdCB3ZSBkb24ndCBuZWVkIHRoZSBwYXR0ZXJuIGNvbXBpbGVyLgogCisgICAgX2FjY2VwdF90eXBlID0gdG9rZW4uTlVNQkVSCisKICAgICBkZWYgbWF0Y2goc2VsZiwgbm9kZSk6CiAgICAgICAgICMgT3ZlcnJpZGUKLSAgICAgICAgcmV0dXJuIChub2RlLnR5cGUgPT0gdG9rZW4uTlVNQkVSIGFuZAotICAgICAgICAgICAgICAgIChub2RlLnZhbHVlLnN0YXJ0c3dpdGgoIjAiKSBvciBub2RlLnZhbHVlWy0xXSBpbiAiTGwiKSkKKyAgICAgICAgcmV0dXJuIChub2RlLnZhbHVlLnN0YXJ0c3dpdGgoIjAiKSBvciBub2RlLnZhbHVlWy0xXSBpbiAiTGwiKQogCiAgICAgZGVmIHRyYW5zZm9ybShzZWxmLCBub2RlLCByZXN1bHRzKToKICAgICAgICAgdmFsID0gbm9kZS52YWx1ZQpkaWZmIC0tZ2l0IGEvTGliL2xpYjJ0bzMvZml4ZXMvZml4X29wZXJhdG9yLnB5IGIvTGliL2xpYjJ0bzMvZml4ZXMvZml4X29wZXJhdG9yLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliMTA4OWMKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvbGliMnRvMy9maXhlcy9maXhfb3BlcmF0b3IucHkKQEAgLTAsMCArMSw0MCBAQAorIiIiRml4ZXIgZm9yIG9wZXJhdG9yLntpc0NhbGxhYmxlLHNlcXVlbmNlSW5jbHVkZXN9CisKK29wZXJhdG9yLmlzQ2FsbGFibGUob2JqKSAtPiBoYXNhdHRyKG9iaiwgJ19fY2FsbF9fJykKK29wZXJhdG9yLnNlcXVlbmNlSW5jbHVkZXMob2JqKSAtPiBvcGVyYXRvci5jb250YWlucyhvYmopCisiIiIKKworIyBMb2NhbCBpbXBvcnRzCitmcm9tIC4uIGltcG9ydCBmaXhlcl9iYXNlCitmcm9tIC4uZml4ZXJfdXRpbCBpbXBvcnQgQ2FsbCwgTmFtZSwgU3RyaW5nCisKK2NsYXNzIEZpeE9wZXJhdG9yKGZpeGVyX2Jhc2UuQmFzZUZpeCk6CisKKyAgICBtZXRob2RzID0gIm1ldGhvZD0oJ2lzQ2FsbGFibGUnfCdzZXF1ZW5jZUluY2x1ZGVzJykiCisgICAgZnVuYyA9ICInKCcgZnVuYz1hbnkgJyknIgorICAgIFBBVFRFUk4gPSAiIiIKKyAgICAgICAgICAgICAgcG93ZXI8IG1vZHVsZT0nb3BlcmF0b3InCisgICAgICAgICAgICAgICAgdHJhaWxlcjwgJy4nIHttZXRob2RzfSA+IHRyYWlsZXI8IHtmdW5jfSA+ID4KKyAgICAgICAgICAgICAgfAorICAgICAgICAgICAgICBwb3dlcjwge21ldGhvZHN9IHRyYWlsZXI8IHtmdW5jfSA+ID4KKyAgICAgICAgICAgICAgIiIiLmZvcm1hdChtZXRob2RzPW1ldGhvZHMsIGZ1bmM9ZnVuYykKKworICAgIGRlZiB0cmFuc2Zvcm0oc2VsZiwgbm9kZSwgcmVzdWx0cyk6CisgICAgICAgIG1ldGhvZCA9IHJlc3VsdHNbIm1ldGhvZCJdWzBdCisKKyAgICAgICAgaWYgbWV0aG9kLnZhbHVlID09ICJzZXF1ZW5jZUluY2x1ZGVzIjoKKyAgICAgICAgICAgIGlmICJtb2R1bGUiIG5vdCBpbiByZXN1bHRzOgorICAgICAgICAgICAgICAgICMgb3BlcmF0b3IgbWF5IG5vdCBiZSBpbiBzY29wZSwgc28gd2UgY2FuJ3QgbWFrZSBhIGNoYW5nZS4KKyAgICAgICAgICAgICAgICBzZWxmLndhcm5pbmcobm9kZSwgIllvdSBzaG91bGQgdXNlIG9wZXJhdG9yLmNvbnRhaW5zIGhlcmUuIikKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgbWV0aG9kLnZhbHVlID0gImNvbnRhaW5zIgorICAgICAgICAgICAgICAgIG1ldGhvZC5jaGFuZ2VkKCkKKyAgICAgICAgZWxpZiBtZXRob2QudmFsdWUgPT0gImlzQ2FsbGFibGUiOgorICAgICAgICAgICAgaWYgIm1vZHVsZSIgbm90IGluIHJlc3VsdHM6CisgICAgICAgICAgICAgICAgc2VsZi53YXJuaW5nKG5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJZb3Ugc2hvdWxkIHVzZSBoYXNhdHRyKCVzLCAnX19jYWxsX18nKSBoZXJlLiIgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzWyJmdW5jIl0udmFsdWUpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGZ1bmMgPSByZXN1bHRzWyJmdW5jIl0KKyAgICAgICAgICAgICAgICBhcmdzID0gW2Z1bmMuY2xvbmUoKSwgU3RyaW5nKCIsICIpLCBTdHJpbmcoIidfX2NhbGxfXyciKV0KKyAgICAgICAgICAgICAgICByZXR1cm4gQ2FsbChOYW1lKCJoYXNhdHRyIiksIGFyZ3MsIHByZWZpeD1ub2RlLnByZWZpeCkKZGlmZiAtLWdpdCBhL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF9wcmludC5weSBiL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF9wcmludC5weQppbmRleCBhYmNlMjUxLi5jYzc5MzRhIDEwMDY0NAotLS0gYS9MaWIvbGliMnRvMy9maXhlcy9maXhfcHJpbnQucHkKKysrIGIvTGliL2xpYjJ0bzMvZml4ZXMvZml4X3ByaW50LnB5CkBAIC0yNiwyMCArMjYsMTUgQEAKICAgICAgICAgICAgICAgKQogCiAKLWNsYXNzIEZpeFByaW50KGZpeGVyX2Jhc2UuQ29uZGl0aW9uYWxGaXgpOgorY2xhc3MgRml4UHJpbnQoZml4ZXJfYmFzZS5CYXNlRml4KToKIAogICAgIFBBVFRFUk4gPSAiIiIKICAgICAgICAgICAgICAgc2ltcGxlX3N0bXQ8IGFueSogYmFyZT0ncHJpbnQnIGFueSogPiB8IHByaW50X3N0bXQKICAgICAgICAgICAgICAgIiIiCiAKLSAgICBza2lwX29uID0gJ19fZnV0dXJlX18ucHJpbnRfZnVuY3Rpb24nCi0KICAgICBkZWYgdHJhbnNmb3JtKHNlbGYsIG5vZGUsIHJlc3VsdHMpOgogICAgICAgICBhc3NlcnQgcmVzdWx0cwogCi0gICAgICAgIGlmIHNlbGYuc2hvdWxkX3NraXAobm9kZSk6Ci0gICAgICAgICAgICByZXR1cm4KLQogICAgICAgICBiYXJlX3ByaW50ID0gcmVzdWx0cy5nZXQoImJhcmUiKQogCiAgICAgICAgIGlmIGJhcmVfcHJpbnQ6CmRpZmYgLS1naXQgYS9MaWIvbGliMnRvMy9maXhlcy9maXhfdXJsbGliLnB5IGIvTGliL2xpYjJ0bzMvZml4ZXMvZml4X3VybGxpYi5weQppbmRleCBhODkyNjZlLi5kMTEyMjBjIDEwMDY0NAotLS0gYS9MaWIvbGliMnRvMy9maXhlcy9maXhfdXJsbGliLnB5CisrKyBiL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF91cmxsaWIucHkKQEAgLTEyLDEzICsxMiwxMyBAQAogTUFQUElORyA9IHsndXJsbGliJzogIFsKICAgICAgICAgICAgICAgICAoJ3VybGxpYi5yZXF1ZXN0JywKICAgICAgICAgICAgICAgICAgICAgWydVUkxPcGVuZXInLCAnRmFuY3lVUkxPcGVuZXInLCAndXJscmV0cmlldmUnLAotICAgICAgICAgICAgICAgICAgICAgJ191cmxvcGVuZXInLCAndXJsb3BlbicsICd1cmxjbGVhbnVwJ10pLAorICAgICAgICAgICAgICAgICAgICAgJ191cmxvcGVuZXInLCAndXJsb3BlbicsICd1cmxjbGVhbnVwJywKKyAgICAgICAgICAgICAgICAgICAgICdwYXRobmFtZTJ1cmwnLCAndXJsMnBhdGhuYW1lJ10pLAogICAgICAgICAgICAgICAgICgndXJsbGliLnBhcnNlJywKICAgICAgICAgICAgICAgICAgICAgWydxdW90ZScsICdxdW90ZV9wbHVzJywgJ3VucXVvdGUnLCAndW5xdW90ZV9wbHVzJywKLSAgICAgICAgICAgICAgICAgICAgICd1cmxlbmNvZGUnLCAncGF0aG5hbWUydXJsJywgJ3VybDJwYXRobmFtZScsICdzcGxpdGF0dHInLAotICAgICAgICAgICAgICAgICAgICAgJ3NwbGl0aG9zdCcsICdzcGxpdG5wb3J0JywgJ3NwbGl0cGFzc3dkJywgJ3NwbGl0cG9ydCcsCi0gICAgICAgICAgICAgICAgICAgICAnc3BsaXRxdWVyeScsICdzcGxpdHRhZycsICdzcGxpdHR5cGUnLCAnc3BsaXR1c2VyJywKLSAgICAgICAgICAgICAgICAgICAgICdzcGxpdHZhbHVlJywgXSksCisgICAgICAgICAgICAgICAgICAgICAndXJsZW5jb2RlJywgJ3NwbGl0YXR0cicsICdzcGxpdGhvc3QnLCAnc3BsaXRucG9ydCcsCisgICAgICAgICAgICAgICAgICAgICAnc3BsaXRwYXNzd2QnLCAnc3BsaXRwb3J0JywgJ3NwbGl0cXVlcnknLCAnc3BsaXR0YWcnLAorICAgICAgICAgICAgICAgICAgICAgJ3NwbGl0dHlwZScsICdzcGxpdHVzZXInLCAnc3BsaXR2YWx1ZScsIF0pLAogICAgICAgICAgICAgICAgICgndXJsbGliLmVycm9yJywKICAgICAgICAgICAgICAgICAgICAgWydDb250ZW50VG9vU2hvcnRFcnJvciddKV0sCiAgICAgICAgICAgICd1cmxsaWIyJyA6IFsKZGlmZiAtLWdpdCBhL0xpYi9saWIydG8zL21haW4ucHkgYi9MaWIvbGliMnRvMy9tYWluLnB5CmluZGV4IGUxYWRjODguLjgyOGIwMmYgMTAwNjQ0Ci0tLSBhL0xpYi9saWIydG8zL21haW4ucHkKKysrIGIvTGliL2xpYjJ0bzMvbWFpbi5weQpAQCAtNCwxOSArNCwzMSBAQAogCiBpbXBvcnQgc3lzCiBpbXBvcnQgb3MKK2ltcG9ydCBkaWZmbGliCiBpbXBvcnQgbG9nZ2luZwogaW1wb3J0IHNodXRpbAogaW1wb3J0IG9wdHBhcnNlCiAKIGZyb20gLiBpbXBvcnQgcmVmYWN0b3IKIAorCitkZWYgZGlmZl90ZXh0cyhhLCBiLCBmaWxlbmFtZSk6CisgICAgIiIiUmV0dXJuIGEgdW5pZmllZCBkaWZmIG9mIHR3byBzdHJpbmdzLiIiIgorICAgIGEgPSBhLnNwbGl0bGluZXMoKQorICAgIGIgPSBiLnNwbGl0bGluZXMoKQorICAgIHJldHVybiBkaWZmbGliLnVuaWZpZWRfZGlmZihhLCBiLCBmaWxlbmFtZSwgZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIob3JpZ2luYWwpIiwgIihyZWZhY3RvcmVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmV0ZXJtPSIiKQorCisKIGNsYXNzIFN0ZG91dFJlZmFjdG9yaW5nVG9vbChyZWZhY3Rvci5NdWx0aXByb2Nlc3NSZWZhY3RvcmluZ1Rvb2wpOgogICAgICIiIgogICAgIFByaW50cyBvdXRwdXQgdG8gc3Rkb3V0LgogICAgICIiIgogCi0gICAgZGVmIF9faW5pdF9fKHNlbGYsIGZpeGVycywgb3B0aW9ucywgZXhwbGljaXQsIG5vYmFja3Vwcyk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZpeGVycywgb3B0aW9ucywgZXhwbGljaXQsIG5vYmFja3Vwcywgc2hvd19kaWZmcyk6CiAgICAgICAgIHNlbGYubm9iYWNrdXBzID0gbm9iYWNrdXBzCisgICAgICAgIHNlbGYuc2hvd19kaWZmcyA9IHNob3dfZGlmZnMKICAgICAgICAgc3VwZXIoU3Rkb3V0UmVmYWN0b3JpbmdUb29sLCBzZWxmKS5fX2luaXRfXyhmaXhlcnMsIG9wdGlvbnMsIGV4cGxpY2l0KQogCiAgICAgZGVmIGxvZ19lcnJvcihzZWxmLCBtc2csICphcmdzLCAqKmt3YXJncyk6CkBAIC00Miw5ICs1NCwxNyBAQAogICAgICAgICBpZiBub3Qgc2VsZi5ub2JhY2t1cHM6CiAgICAgICAgICAgICBzaHV0aWwuY29weW1vZGUoYmFja3VwLCBmaWxlbmFtZSkKIAotICAgIGRlZiBwcmludF9vdXRwdXQoc2VsZiwgbGluZXMpOgotICAgICAgICBmb3IgbGluZSBpbiBsaW5lczoKLSAgICAgICAgICAgIHByaW50KGxpbmUpCisgICAgZGVmIHByaW50X291dHB1dChzZWxmLCBvbGQsIG5ldywgZmlsZW5hbWUsIGVxdWFsKToKKyAgICAgICAgaWYgZXF1YWw6CisgICAgICAgICAgICBzZWxmLmxvZ19tZXNzYWdlKCJObyBjaGFuZ2VzIHRvICVzIiwgZmlsZW5hbWUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmxvZ19tZXNzYWdlKCJSZWZhY3RvcmVkICVzIiwgZmlsZW5hbWUpCisgICAgICAgICAgICBpZiBzZWxmLnNob3dfZGlmZnM6CisgICAgICAgICAgICAgICAgZm9yIGxpbmUgaW4gZGlmZl90ZXh0cyhvbGQsIG5ldywgZmlsZW5hbWUpOgorICAgICAgICAgICAgICAgICAgICBwcmludChsaW5lKQorCitkZWYgd2Fybihtc2cpOgorICAgIHByaW50ID4+IHN5cy5zdGRlcnIsICJXQVJOSU5HOiAlcyIgJSAobXNnLCkKIAogCiBkZWYgbWFpbihmaXhlcl9wa2csIGFyZ3M9Tm9uZSk6CkBAIC03MCw5ICs5MCwxMiBAQAogICAgIHBhcnNlci5hZGRfb3B0aW9uKCItbCIsICItLWxpc3QtZml4ZXMiLCBhY3Rpb249InN0b3JlX3RydWUiLAogICAgICAgICAgICAgICAgICAgICAgIGhlbHA9Ikxpc3QgYXZhaWxhYmxlIHRyYW5zZm9ybWF0aW9ucyAoZml4ZXMvZml4XyoucHkpIikKICAgICBwYXJzZXIuYWRkX29wdGlvbigiLXAiLCAiLS1wcmludC1mdW5jdGlvbiIsIGFjdGlvbj0ic3RvcmVfdHJ1ZSIsCi0gICAgICAgICAgICAgICAgICAgICAgaGVscD0iTW9kaWZ5IHRoZSBncmFtbWFyIHNvIHRoYXQgcHJpbnQoKSBpcyBhIGZ1bmN0aW9uIikKKyAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJERVBSRUNBVEVEIE1vZGlmeSB0aGUgZ3JhbW1hciBzbyB0aGF0IHByaW50KCkgaXMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiYSBmdW5jdGlvbiIpCiAgICAgcGFyc2VyLmFkZF9vcHRpb24oIi12IiwgIi0tdmVyYm9zZSIsIGFjdGlvbj0ic3RvcmVfdHJ1ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgaGVscD0iTW9yZSB2ZXJib3NlIGxvZ2dpbmciKQorICAgIHBhcnNlci5hZGRfb3B0aW9uKCItLW5vLWRpZmZzIiwgYWN0aW9uPSJzdG9yZV90cnVlIiwKKyAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJEb24ndCBzaG93IGRpZmZzIG9mIHRoZSByZWZhY3RvcmluZyIpCiAgICAgcGFyc2VyLmFkZF9vcHRpb24oIi13IiwgIi0td3JpdGUiLCBhY3Rpb249InN0b3JlX3RydWUiLAogICAgICAgICAgICAgICAgICAgICAgIGhlbHA9IldyaXRlIGJhY2sgbW9kaWZpZWQgZmlsZXMiKQogICAgIHBhcnNlci5hZGRfb3B0aW9uKCItbiIsICItLW5vYmFja3VwcyIsIGFjdGlvbj0ic3RvcmVfdHJ1ZSIsIGRlZmF1bHQ9RmFsc2UsCkBAIC04MSw2ICsxMDQsMTEgQEAKICAgICAjIFBhcnNlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMKICAgICByZWZhY3Rvcl9zdGRpbiA9IEZhbHNlCiAgICAgb3B0aW9ucywgYXJncyA9IHBhcnNlci5wYXJzZV9hcmdzKGFyZ3MpCisgICAgaWYgbm90IG9wdGlvbnMud3JpdGUgYW5kIG9wdGlvbnMubm9fZGlmZnM6CisgICAgICAgIHdhcm4oIm5vdCB3cml0aW5nIGZpbGVzIGFuZCBub3QgcHJpbnRpbmcgZGlmZnM7IHRoYXQncyBub3QgdmVyeSB1c2VmdWwiKQorICAgIGlmIG9wdGlvbnMucHJpbnRfZnVuY3Rpb246CisgICAgICAgIHdhcm4oIi1wIGlzIGRlcHJlY2F0ZWQ7ICIKKyAgICAgICAgICAgICAiZGV0ZWN0aW9uIG9mIGZyb20gX19mdXR1cmVfXyBpbXBvcnQgcHJpbnRfZnVuY3Rpb24gaXMgYXV0b21hdGljIikKICAgICBpZiBub3Qgb3B0aW9ucy53cml0ZSBhbmQgb3B0aW9ucy5ub2JhY2t1cHM6CiAgICAgICAgIHBhcnNlci5lcnJvcigiQ2FuJ3QgdXNlIC1uIHdpdGhvdXQgLXciKQogICAgIGlmIG9wdGlvbnMubGlzdF9maXhlczoKQEAgLTEwNCw3ICsxMzIsNiBAQAogICAgIGxvZ2dpbmcuYmFzaWNDb25maWcoZm9ybWF0PSclKG5hbWUpczogJShtZXNzYWdlKXMnLCBsZXZlbD1sZXZlbCkKIAogICAgICMgSW5pdGlhbGl6ZSB0aGUgcmVmYWN0b3JpbmcgdG9vbAotICAgIHJ0X29wdHMgPSB7InByaW50X2Z1bmN0aW9uIiA6IG9wdGlvbnMucHJpbnRfZnVuY3Rpb259CiAgICAgYXZhaWxfZml4ZXMgPSBzZXQocmVmYWN0b3IuZ2V0X2ZpeGVyc19mcm9tX3BhY2thZ2UoZml4ZXJfcGtnKSkKICAgICB1bndhbnRlZF9maXhlcyA9IHNldChmaXhlcl9wa2cgKyAiLmZpeF8iICsgZml4IGZvciBmaXggaW4gb3B0aW9ucy5ub2ZpeCkKICAgICBleHBsaWNpdCA9IHNldCgpCkBAIC0xMTksOCArMTQ2LDggQEAKICAgICBlbHNlOgogICAgICAgICByZXF1ZXN0ZWQgPSBhdmFpbF9maXhlcy51bmlvbihleHBsaWNpdCkKICAgICBmaXhlcl9uYW1lcyA9IHJlcXVlc3RlZC5kaWZmZXJlbmNlKHVud2FudGVkX2ZpeGVzKQotICAgIHJ0ID0gU3Rkb3V0UmVmYWN0b3JpbmdUb29sKHNvcnRlZChmaXhlcl9uYW1lcyksIHJ0X29wdHMsIHNvcnRlZChleHBsaWNpdCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5ub2JhY2t1cHMpCisgICAgcnQgPSBTdGRvdXRSZWZhY3RvcmluZ1Rvb2woc29ydGVkKGZpeGVyX25hbWVzKSwgTm9uZSwgc29ydGVkKGV4cGxpY2l0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLm5vYmFja3Vwcywgbm90IG9wdGlvbnMubm9fZGlmZnMpCiAKICAgICAjIFJlZmFjdG9yIGFsbCBmaWxlcyBhbmQgZGlyZWN0b3JpZXMgcGFzc2VkIGFzIGFyZ3VtZW50cwogICAgIGlmIG5vdCBydC5lcnJvcnM6CmRpZmYgLS1naXQgYS9MaWIvbGliMnRvMy9wYXRjb21wLnB5IGIvTGliL2xpYjJ0bzMvcGF0Y29tcC5weQppbmRleCAyNDI1MWNiLi4zODMxNjIyIDEwMDY0NAotLS0gYS9MaWIvbGliMnRvMy9wYXRjb21wLnB5CisrKyBiL0xpYi9saWIydG8zL3BhdGNvbXAucHkKQEAgLTE0LDcgKzE0LDcgQEAKIGltcG9ydCBvcwogCiAjIEZhaXJseSBsb2NhbCBpbXBvcnRzCi1mcm9tIC5wZ2VuMiBpbXBvcnQgZHJpdmVyLCBsaXRlcmFscywgdG9rZW4sIHRva2VuaXplLCBwYXJzZQorZnJvbSAucGdlbjIgaW1wb3J0IGRyaXZlciwgbGl0ZXJhbHMsIHRva2VuLCB0b2tlbml6ZSwgcGFyc2UsIGdyYW1tYXIKIAogIyBSZWFsbHkgbG9jYWwgaW1wb3J0cwogZnJvbSAuIGltcG9ydCBweXRyZWUKQEAgLTEzOCw3ICsxMzgsNyBAQAogICAgICAgICBub2RlID0gbm9kZXNbMF0KICAgICAgICAgaWYgbm9kZS50eXBlID09IHRva2VuLlNUUklORzoKICAgICAgICAgICAgIHZhbHVlID0gc3RyKGxpdGVyYWxzLmV2YWxTdHJpbmcobm9kZS52YWx1ZSkpCi0gICAgICAgICAgICByZXR1cm4gcHl0cmVlLkxlYWZQYXR0ZXJuKGNvbnRlbnQ9dmFsdWUpCisgICAgICAgICAgICByZXR1cm4gcHl0cmVlLkxlYWZQYXR0ZXJuKF90eXBlX29mX2xpdGVyYWwodmFsdWUpLCB2YWx1ZSkKICAgICAgICAgZWxpZiBub2RlLnR5cGUgPT0gdG9rZW4uTkFNRToKICAgICAgICAgICAgIHZhbHVlID0gbm9kZS52YWx1ZQogICAgICAgICAgICAgaWYgdmFsdWUuaXN1cHBlcigpOgpAQCAtMTc5LDYgKzE3OSwxNSBAQAogICAgICAgICAgICAgICJUT0tFTiI6IE5vbmV9CiAKIAorZGVmIF90eXBlX29mX2xpdGVyYWwodmFsdWUpOgorICAgIGlmIHZhbHVlWzBdLmlzYWxwaGEoKToKKyAgICAgICAgcmV0dXJuIHRva2VuLk5BTUUKKyAgICBlbGlmIHZhbHVlIGluIGdyYW1tYXIub3BtYXA6CisgICAgICAgIHJldHVybiBncmFtbWFyLm9wbWFwW3ZhbHVlXQorICAgIGVsc2U6CisgICAgICAgIHJldHVybiBOb25lCisKKwogZGVmIHBhdHRlcm5fY29udmVydChncmFtbWFyLCByYXdfbm9kZV9pbmZvKToKICAgICAiIiJDb252ZXJ0cyByYXcgbm9kZSBpbmZvcm1hdGlvbiB0byBhIE5vZGUgb3IgTGVhZiBpbnN0YW5jZS4iIiIKICAgICB0eXBlLCB2YWx1ZSwgY29udGV4dCwgY2hpbGRyZW4gPSByYXdfbm9kZV9pbmZvCmRpZmYgLS1naXQgYS9MaWIvbGliMnRvMy9wZ2VuMi9ncmFtbWFyLnB5IGIvTGliL2xpYjJ0bzMvcGdlbjIvZ3JhbW1hci5weQppbmRleCBiN2Y4NjdmLi4yNmNhZWI0IDEwMDY0NAotLS0gYS9MaWIvbGliMnRvMy9wZ2VuMi9ncmFtbWFyLnB5CisrKyBiL0xpYi9saWIydG8zL3BnZW4yL2dyYW1tYXIucHkKQEAgLTk3LDYgKzk3LDE5IEBACiAgICAgICAgIGYuY2xvc2UoKQogICAgICAgICBzZWxmLl9fZGljdF9fLnVwZGF0ZShkKQogCisgICAgZGVmIGNvcHkoc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBDb3B5IHRoZSBncmFtbWFyLgorICAgICAgICAiIiIKKyAgICAgICAgbmV3ID0gc2VsZi5fX2NsYXNzX18oKQorICAgICAgICBmb3IgZGljdF9hdHRyIGluICgic3ltYm9sMm51bWJlciIsICJudW1iZXIyc3ltYm9sIiwgImRmYXMiLCAia2V5d29yZHMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAidG9rZW5zIiwgInN5bWJvbDJsYWJlbCIpOgorICAgICAgICAgICAgc2V0YXR0cihuZXcsIGRpY3RfYXR0ciwgZ2V0YXR0cihzZWxmLCBkaWN0X2F0dHIpLmNvcHkoKSkKKyAgICAgICAgbmV3LmxhYmVscyA9IHNlbGYubGFiZWxzWzpdCisgICAgICAgIG5ldy5zdGF0ZXMgPSBzZWxmLnN0YXRlc1s6XQorICAgICAgICBuZXcuc3RhcnQgPSBzZWxmLnN0YXJ0CisgICAgICAgIHJldHVybiBuZXcKKwogICAgIGRlZiByZXBvcnQoc2VsZik6CiAgICAgICAgICIiIkR1bXAgdGhlIGdyYW1tYXIgdGFibGVzIHRvIHN0YW5kYXJkIG91dHB1dCwgZm9yIGRlYnVnZ2luZy4iIiIKICAgICAgICAgZnJvbSBwcHJpbnQgaW1wb3J0IHBwcmludApkaWZmIC0tZ2l0IGEvTGliL2xpYjJ0bzMvcHlncmFtLnB5IGIvTGliL2xpYjJ0bzMvcHlncmFtLnB5CmluZGV4IDQ5ZDVjZWYuLmQ1OTgzMTcgMTAwNjQ0Ci0tLSBhL0xpYi9saWIydG8zL3B5Z3JhbS5weQorKysgYi9MaWIvbGliMnRvMy9weWdyYW0ucHkKQEAgLTI4LDQgKzI4LDggQEAKIAogCiBweXRob25fZ3JhbW1hciA9IGRyaXZlci5sb2FkX2dyYW1tYXIoX0dSQU1NQVJfRklMRSkKKwogcHl0aG9uX3N5bWJvbHMgPSBTeW1ib2xzKHB5dGhvbl9ncmFtbWFyKQorCitweXRob25fZ3JhbW1hcl9ub19wcmludF9zdGF0ZW1lbnQgPSBweXRob25fZ3JhbW1hci5jb3B5KCkKK2RlbCBweXRob25fZ3JhbW1hcl9ub19wcmludF9zdGF0ZW1lbnQua2V5d29yZHNbInByaW50Il0KZGlmZiAtLWdpdCBhL0xpYi9saWIydG8zL3JlZmFjdG9yLnB5IGIvTGliL2xpYjJ0bzMvcmVmYWN0b3IucHkKaW5kZXggMzM5Yjk0Zi4uNWVkZjU4NCAxMDA2NDQKLS0tIGEvTGliL2xpYjJ0bzMvcmVmYWN0b3IucHkKKysrIGIvTGliL2xpYjJ0bzMvcmVmYWN0b3IucHkKQEAgLTE0LDE0ICsxNCwxNSBAQAogIyBQeXRob24gaW1wb3J0cwogaW1wb3J0IG9zCiBpbXBvcnQgc3lzCi1pbXBvcnQgZGlmZmxpYgogaW1wb3J0IGxvZ2dpbmcKIGltcG9ydCBvcGVyYXRvcgotZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgZGVmYXVsdGRpY3QKK2ltcG9ydCBjb2xsZWN0aW9ucworaW1wb3J0IGlvCitpbXBvcnQgd2FybmluZ3MKIGZyb20gaXRlcnRvb2xzIGltcG9ydCBjaGFpbgogCiAjIExvY2FsIGltcG9ydHMKLWZyb20gLnBnZW4yIGltcG9ydCBkcml2ZXIsIHRva2VuaXplCitmcm9tIC5wZ2VuMiBpbXBvcnQgZHJpdmVyLCB0b2tlbml6ZSwgdG9rZW4KIGZyb20gLiBpbXBvcnQgcHl0cmVlLCBweWdyYW0KIAogCkBAIC0zNyw3ICszOCwxMiBAQAogICAgICAgICAgICAgZml4X25hbWVzLmFwcGVuZChuYW1lWzotM10pCiAgICAgcmV0dXJuIGZpeF9uYW1lcwogCi1kZWYgZ2V0X2hlYWRfdHlwZXMocGF0KToKKworY2xhc3MgX0V2ZXJ5Tm9kZShFeGNlcHRpb24pOgorICAgIHBhc3MKKworCitkZWYgX2dldF9oZWFkX3R5cGVzKHBhdCk6CiAgICAgIiIiIEFjY2VwdHMgYSBweXRyZWUgUGF0dGVybiBOb2RlIGFuZCByZXR1cm5zIGEgc2V0CiAgICAgICAgIG9mIHRoZSBwYXR0ZXJuIHR5cGVzIHdoaWNoIHdpbGwgbWF0Y2ggZmlyc3QuICIiIgogCkBAIC00NSwzNCArNTEsNTAgQEAKICAgICAgICAgIyBOb2RlUGF0dGVycyBtdXN0IGVpdGhlciBoYXZlIG5vIHR5cGUgYW5kIG5vIGNvbnRlbnQKICAgICAgICAgIyAgIG9yIGEgdHlwZSBhbmQgY29udGVudCAtLSBzbyB0aGV5IGRvbid0IGdldCBhbnkgZmFydGhlcgogICAgICAgICAjIEFsd2F5cyByZXR1cm4gbGVhZnMKKyAgICAgICAgaWYgcGF0LnR5cGUgaXMgTm9uZToKKyAgICAgICAgICAgIHJhaXNlIF9FdmVyeU5vZGUKICAgICAgICAgcmV0dXJuIHNldChbcGF0LnR5cGVdKQogCiAgICAgaWYgaXNpbnN0YW5jZShwYXQsIHB5dHJlZS5OZWdhdGVkUGF0dGVybik6CiAgICAgICAgIGlmIHBhdC5jb250ZW50OgotICAgICAgICAgICAgcmV0dXJuIGdldF9oZWFkX3R5cGVzKHBhdC5jb250ZW50KQotICAgICAgICByZXR1cm4gc2V0KFtOb25lXSkgIyBOZWdhdGVkIFBhdHRlcm5zIGRvbid0IGhhdmUgYSB0eXBlCisgICAgICAgICAgICByZXR1cm4gX2dldF9oZWFkX3R5cGVzKHBhdC5jb250ZW50KQorICAgICAgICByYWlzZSBfRXZlcnlOb2RlICMgTmVnYXRlZCBQYXR0ZXJucyBkb24ndCBoYXZlIGEgdHlwZQogCiAgICAgaWYgaXNpbnN0YW5jZShwYXQsIHB5dHJlZS5XaWxkY2FyZFBhdHRlcm4pOgogICAgICAgICAjIFJlY3Vyc2Ugb24gZWFjaCBub2RlIGluIGNvbnRlbnQKICAgICAgICAgciA9IHNldCgpCiAgICAgICAgIGZvciBwIGluIHBhdC5jb250ZW50OgogICAgICAgICAgICAgZm9yIHggaW4gcDoKLSAgICAgICAgICAgICAgICByLnVwZGF0ZShnZXRfaGVhZF90eXBlcyh4KSkKKyAgICAgICAgICAgICAgICByLnVwZGF0ZShfZ2V0X2hlYWRfdHlwZXMoeCkpCiAgICAgICAgIHJldHVybiByCiAKICAgICByYWlzZSBFeGNlcHRpb24oIk9oIG5vISBJIGRvbid0IHVuZGVyc3RhbmQgcGF0dGVybiAlcyIgJShwYXQpKQogCi1kZWYgZ2V0X2hlYWRub2RlX2RpY3QoZml4ZXJfbGlzdCk6CisKK2RlZiBfZ2V0X2hlYWRub2RlX2RpY3QoZml4ZXJfbGlzdCk6CiAgICAgIiIiIEFjY2VwdHMgYSBsaXN0IG9mIGZpeGVycyBhbmQgcmV0dXJucyBhIGRpY3Rpb25hcnkKICAgICAgICAgb2YgaGVhZCBub2RlIHR5cGUgLS0+IGZpeGVyIGxpc3QuICAiIiIKLSAgICBoZWFkX25vZGVzID0gZGVmYXVsdGRpY3QobGlzdCkKKyAgICBoZWFkX25vZGVzID0gY29sbGVjdGlvbnMuZGVmYXVsdGRpY3QobGlzdCkKKyAgICBldmVyeSA9IFtdCiAgICAgZm9yIGZpeGVyIGluIGZpeGVyX2xpc3Q6Ci0gICAgICAgIGlmIG5vdCBmaXhlci5wYXR0ZXJuOgotICAgICAgICAgICAgaGVhZF9ub2Rlc1tOb25lXS5hcHBlbmQoZml4ZXIpCi0gICAgICAgICAgICBjb250aW51ZQotICAgICAgICBmb3IgdCBpbiBnZXRfaGVhZF90eXBlcyhmaXhlci5wYXR0ZXJuKToKLSAgICAgICAgICAgIGhlYWRfbm9kZXNbdF0uYXBwZW5kKGZpeGVyKQotICAgIHJldHVybiBoZWFkX25vZGVzCisgICAgICAgIGlmIGZpeGVyLnBhdHRlcm46CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgaGVhZHMgPSBfZ2V0X2hlYWRfdHlwZXMoZml4ZXIucGF0dGVybikKKyAgICAgICAgICAgIGV4Y2VwdCBfRXZlcnlOb2RlOgorICAgICAgICAgICAgICAgIGV2ZXJ5LmFwcGVuZChmaXhlcikKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZm9yIG5vZGVfdHlwZSBpbiBoZWFkczoKKyAgICAgICAgICAgICAgICAgICAgaGVhZF9ub2Rlc1tub2RlX3R5cGVdLmFwcGVuZChmaXhlcikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGlmIGZpeGVyLl9hY2NlcHRfdHlwZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBoZWFkX25vZGVzW2ZpeGVyLl9hY2NlcHRfdHlwZV0uYXBwZW5kKGZpeGVyKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBldmVyeS5hcHBlbmQoZml4ZXIpCisgICAgZm9yIG5vZGVfdHlwZSBpbiBjaGFpbihweWdyYW0ucHl0aG9uX2dyYW1tYXIuc3ltYm9sMm51bWJlci52YWx1ZXMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHB5Z3JhbS5weXRob25fZ3JhbW1hci50b2tlbnMpOgorICAgICAgICBoZWFkX25vZGVzW25vZGVfdHlwZV0uZXh0ZW5kKGV2ZXJ5KQorICAgIHJldHVybiBkaWN0KGhlYWRfbm9kZXMpCisKIAogZGVmIGdldF9maXhlcnNfZnJvbV9wYWNrYWdlKHBrZ19uYW1lKToKICAgICAiIiIKQEAgLTEwMSwxMyArMTIzLDU2IEBACiAgICAgX3RvX3N5c3RlbV9uZXdsaW5lcyA9IF9pZGVudGl0eQogCiAKK2RlZiBfZGV0ZWN0X2Z1dHVyZV9wcmludChzb3VyY2UpOgorICAgIGhhdmVfZG9jc3RyaW5nID0gRmFsc2UKKyAgICBnZW4gPSB0b2tlbml6ZS5nZW5lcmF0ZV90b2tlbnMoaW8uU3RyaW5nSU8oc291cmNlKS5yZWFkbGluZSkKKyAgICBkZWYgYWR2YW5jZSgpOgorICAgICAgICB0b2sgPSBuZXh0KGdlbikKKyAgICAgICAgcmV0dXJuIHRva1swXSwgdG9rWzFdCisgICAgaWdub3JlID0gZnJvemVuc2V0KCh0b2tlbi5ORVdMSU5FLCB0b2tlbml6ZS5OTCwgdG9rZW4uQ09NTUVOVCkpCisgICAgdHJ5OgorICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgdHAsIHZhbHVlID0gYWR2YW5jZSgpCisgICAgICAgICAgICBpZiB0cCBpbiBpZ25vcmU6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGVsaWYgdHAgPT0gdG9rZW4uU1RSSU5HOgorICAgICAgICAgICAgICAgIGlmIGhhdmVfZG9jc3RyaW5nOgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIGhhdmVfZG9jc3RyaW5nID0gVHJ1ZQorICAgICAgICAgICAgZWxpZiB0cCA9PSB0b2tlbi5OQU1FOgorICAgICAgICAgICAgICAgIGlmIHZhbHVlID09ICJmcm9tIjoKKyAgICAgICAgICAgICAgICAgICAgdHAsIHZhbHVlID0gYWR2YW5jZSgpCisgICAgICAgICAgICAgICAgICAgIGlmIHRwICE9IHRva2VuLk5BTUUgYW5kIHZhbHVlICE9ICJfX2Z1dHVyZV9fIjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgICAgIHRwLCB2YWx1ZSA9IGFkdmFuY2UoKQorICAgICAgICAgICAgICAgICAgICBpZiB0cCAhPSB0b2tlbi5OQU1FIGFuZCB2YWx1ZSAhPSAiaW1wb3J0IjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgICAgIHRwLCB2YWx1ZSA9IGFkdmFuY2UoKQorICAgICAgICAgICAgICAgICAgICBpZiB0cCA9PSB0b2tlbi5PUCBhbmQgdmFsdWUgPT0gIigiOgorICAgICAgICAgICAgICAgICAgICAgICAgdHAsIHZhbHVlID0gYWR2YW5jZSgpCisgICAgICAgICAgICAgICAgICAgIHdoaWxlIHRwID09IHRva2VuLk5BTUU6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiB2YWx1ZSA9PSAicHJpbnRfZnVuY3Rpb24iOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgICAgICAgICAgICAgICAgICB0cCwgdmFsdWUgPSBhZHZhbmNlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIHRwICE9IHRva2VuLk9QIGFuZCB2YWx1ZSAhPSAiLCI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRwLCB2YWx1ZSA9IGFkdmFuY2UoKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgZXhjZXB0IFN0b3BJdGVyYXRpb246CisgICAgICAgIHBhc3MKKyAgICByZXR1cm4gRmFsc2UKKworCiBjbGFzcyBGaXhlckVycm9yKEV4Y2VwdGlvbik6CiAgICAgIiIiQSBmaXhlciBjb3VsZCBub3QgYmUgbG9hZGVkLiIiIgogCiAKIGNsYXNzIFJlZmFjdG9yaW5nVG9vbChvYmplY3QpOgogCi0gICAgX2RlZmF1bHRfb3B0aW9ucyA9IHsicHJpbnRfZnVuY3Rpb24iOiBGYWxzZX0KKyAgICBfZGVmYXVsdF9vcHRpb25zID0ge30KIAogICAgIENMQVNTX1BSRUZJWCA9ICJGaXgiICMgVGhlIHByZWZpeCBmb3IgZml4ZXIgY2xhc3NlcwogICAgIEZJTEVfUFJFRklYID0gImZpeF8iICMgVGhlIHByZWZpeCBmb3IgbW9kdWxlcyB3aXRoIGEgZml4ZXIgd2l0aGluCkBAIC0xMjQsMjAgKzE4OSwyMSBAQAogICAgICAgICBzZWxmLmV4cGxpY2l0ID0gZXhwbGljaXQgb3IgW10KICAgICAgICAgc2VsZi5vcHRpb25zID0gc2VsZi5fZGVmYXVsdF9vcHRpb25zLmNvcHkoKQogICAgICAgICBpZiBvcHRpb25zIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgaWYgInByaW50X2Z1bmN0aW9uIiBpbiBvcHRpb25zOgorICAgICAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oInRoZSAncHJpbnRfZnVuY3Rpb24nIG9wdGlvbiBpcyBkZXByZWNhdGVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZykKICAgICAgICAgICAgIHNlbGYub3B0aW9ucy51cGRhdGUob3B0aW9ucykKICAgICAgICAgc2VsZi5lcnJvcnMgPSBbXQogICAgICAgICBzZWxmLmxvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKCJSZWZhY3RvcmluZ1Rvb2wiKQogICAgICAgICBzZWxmLmZpeGVyX2xvZyA9IFtdCiAgICAgICAgIHNlbGYud3JvdGUgPSBGYWxzZQotICAgICAgICBpZiBzZWxmLm9wdGlvbnNbInByaW50X2Z1bmN0aW9uIl06Ci0gICAgICAgICAgICBkZWwgcHlncmFtLnB5dGhvbl9ncmFtbWFyLmtleXdvcmRzWyJwcmludCJdCiAgICAgICAgIHNlbGYuZHJpdmVyID0gZHJpdmVyLkRyaXZlcihweWdyYW0ucHl0aG9uX2dyYW1tYXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJ0PXB5dHJlZS5jb252ZXJ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyPXNlbGYubG9nZ2VyKQogICAgICAgICBzZWxmLnByZV9vcmRlciwgc2VsZi5wb3N0X29yZGVyID0gc2VsZi5nZXRfZml4ZXJzKCkKIAotICAgICAgICBzZWxmLnByZV9vcmRlcl9oZWFkcyA9IGdldF9oZWFkbm9kZV9kaWN0KHNlbGYucHJlX29yZGVyKQotICAgICAgICBzZWxmLnBvc3Rfb3JkZXJfaGVhZHMgPSBnZXRfaGVhZG5vZGVfZGljdChzZWxmLnBvc3Rfb3JkZXIpCisgICAgICAgIHNlbGYucHJlX29yZGVyX2hlYWRzID0gX2dldF9oZWFkbm9kZV9kaWN0KHNlbGYucHJlX29yZGVyKQorICAgICAgICBzZWxmLnBvc3Rfb3JkZXJfaGVhZHMgPSBfZ2V0X2hlYWRub2RlX2RpY3Qoc2VsZi5wb3N0X29yZGVyKQogCiAgICAgICAgIHNlbGYuZmlsZXMgPSBbXSAgIyBMaXN0IG9mIGZpbGVzIHRoYXQgd2VyZSBvciBzaG91bGQgYmUgbW9kaWZpZWQKIApAQCAtMTk2LDggKzI2Miw5IEBACiAgICAgICAgICAgICBtc2cgPSBtc2cgJSBhcmdzCiAgICAgICAgIHNlbGYubG9nZ2VyLmRlYnVnKG1zZykKIAotICAgIGRlZiBwcmludF9vdXRwdXQoc2VsZiwgbGluZXMpOgotICAgICAgICAiIiJDYWxsZWQgd2l0aCBsaW5lcyBvZiBvdXRwdXQgdG8gZ2l2ZSB0byB0aGUgdXNlci4iIiIKKyAgICBkZWYgcHJpbnRfb3V0cHV0KHNlbGYsIG9sZF90ZXh0LCBuZXdfdGV4dCwgZmlsZW5hbWUsIGVxdWFsKToKKyAgICAgICAgIiIiQ2FsbGVkIHdpdGggdGhlIG9sZCB2ZXJzaW9uLCBuZXcgdmVyc2lvbiwgYW5kIGZpbGVuYW1lIG9mIGEKKyAgICAgICAgcmVmYWN0b3JlZCBmaWxlLiIiIgogICAgICAgICBwYXNzCiAKICAgICBkZWYgcmVmYWN0b3Ioc2VsZiwgaXRlbXMsIHdyaXRlPUZhbHNlLCBkb2N0ZXN0c19vbmx5PUZhbHNlKToKQEAgLTIyMCw3ICsyODcsOCBAQAogICAgICAgICAgICAgZGlybmFtZXMuc29ydCgpCiAgICAgICAgICAgICBmaWxlbmFtZXMuc29ydCgpCiAgICAgICAgICAgICBmb3IgbmFtZSBpbiBmaWxlbmFtZXM6Ci0gICAgICAgICAgICAgICAgaWYgbm90IG5hbWUuc3RhcnRzd2l0aCgiLiIpIGFuZCBuYW1lLmVuZHN3aXRoKCJweSIpOgorICAgICAgICAgICAgICAgIGlmIG5vdCBuYW1lLnN0YXJ0c3dpdGgoIi4iKSBhbmQgXAorICAgICAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5zcGxpdGV4dChuYW1lKVsxXS5lbmRzd2l0aCgicHkiKToKICAgICAgICAgICAgICAgICAgICAgZnVsbG5hbWUgPSBvcy5wYXRoLmpvaW4oZGlycGF0aCwgbmFtZSkKICAgICAgICAgICAgICAgICAgICAgc2VsZi5yZWZhY3Rvcl9maWxlKGZ1bGxuYW1lLCB3cml0ZSwgZG9jdGVzdHNfb25seSkKICAgICAgICAgICAgICMgTW9kaWZ5IGRpcm5hbWVzIGluLXBsYWNlIHRvIHJlbW92ZSBzdWJkaXJzIHdpdGggbGVhZGluZyBkb3RzCkBAIC0yNzYsMTIgKzM0NCwxNiBAQAogICAgICAgICAgICAgQW4gQVNUIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHJlZmFjdG9yZWQgaW5wdXQgc3RyZWFtOyBOb25lIGlmCiAgICAgICAgICAgICB0aGVyZSB3ZXJlIGVycm9ycyBkdXJpbmcgdGhlIHBhcnNlLgogICAgICAgICAiIiIKKyAgICAgICAgaWYgX2RldGVjdF9mdXR1cmVfcHJpbnQoZGF0YSk6CisgICAgICAgICAgICBzZWxmLmRyaXZlci5ncmFtbWFyID0gcHlncmFtLnB5dGhvbl9ncmFtbWFyX25vX3ByaW50X3N0YXRlbWVudAogICAgICAgICB0cnk6CiAgICAgICAgICAgICB0cmVlID0gc2VsZi5kcml2ZXIucGFyc2Vfc3RyaW5nKGRhdGEpCiAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZXJyOgogICAgICAgICAgICAgc2VsZi5sb2dfZXJyb3IoIkNhbid0IHBhcnNlICVzOiAlczogJXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgZXJyLl9fY2xhc3NfXy5fX25hbWVfXywgZXJyKQogICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzZWxmLmRyaXZlci5ncmFtbWFyID0gcHlncmFtLnB5dGhvbl9ncmFtbWFyCiAgICAgICAgIHNlbGYubG9nX2RlYnVnKCJSZWZhY3RvcmluZyAlcyIsIG5hbWUpCiAgICAgICAgIHNlbGYucmVmYWN0b3JfdHJlZSh0cmVlLCBuYW1lKQogICAgICAgICByZXR1cm4gdHJlZQpAQCAtMzM4LDEyICs0MTAsMTEgQEAKICAgICAgICAgaWYgbm90IGZpeGVyczoKICAgICAgICAgICAgIHJldHVybgogICAgICAgICBmb3Igbm9kZSBpbiB0cmF2ZXJzYWw6Ci0gICAgICAgICAgICBmb3IgZml4ZXIgaW4gZml4ZXJzW25vZGUudHlwZV0gKyBmaXhlcnNbTm9uZV06CisgICAgICAgICAgICBmb3IgZml4ZXIgaW4gZml4ZXJzW25vZGUudHlwZV06CiAgICAgICAgICAgICAgICAgcmVzdWx0cyA9IGZpeGVyLm1hdGNoKG5vZGUpCiAgICAgICAgICAgICAgICAgaWYgcmVzdWx0czoKICAgICAgICAgICAgICAgICAgICAgbmV3ID0gZml4ZXIudHJhbnNmb3JtKG5vZGUsIHJlc3VsdHMpCi0gICAgICAgICAgICAgICAgICAgIGlmIG5ldyBpcyBub3QgTm9uZSBhbmQgKG5ldyAhPSBub2RlIG9yCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cihuZXcpICE9IHN0cihub2RlKSk6CisgICAgICAgICAgICAgICAgICAgIGlmIG5ldyBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUucmVwbGFjZShuZXcpCiAgICAgICAgICAgICAgICAgICAgICAgICBub2RlID0gbmV3CiAKQEAgLTM1NywxMCArNDI4LDExIEBACiAgICAgICAgICAgICBvbGRfdGV4dCA9IHNlbGYuX3JlYWRfcHl0aG9uX3NvdXJjZShmaWxlbmFtZSlbMF0KICAgICAgICAgICAgIGlmIG9sZF90ZXh0IGlzIE5vbmU6CiAgICAgICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgIGlmIG9sZF90ZXh0ID09IG5ld190ZXh0OgorICAgICAgICBlcXVhbCA9IG9sZF90ZXh0ID09IG5ld190ZXh0CisgICAgICAgIHNlbGYucHJpbnRfb3V0cHV0KG9sZF90ZXh0LCBuZXdfdGV4dCwgZmlsZW5hbWUsIGVxdWFsKQorICAgICAgICBpZiBlcXVhbDoKICAgICAgICAgICAgIHNlbGYubG9nX2RlYnVnKCJObyBjaGFuZ2VzIHRvICVzIiwgZmlsZW5hbWUpCiAgICAgICAgICAgICByZXR1cm4KLSAgICAgICAgc2VsZi5wcmludF9vdXRwdXQoZGlmZl90ZXh0cyhvbGRfdGV4dCwgbmV3X3RleHQsIGZpbGVuYW1lKSkKICAgICAgICAgaWYgd3JpdGU6CiAgICAgICAgICAgICBzZWxmLndyaXRlX2ZpbGUobmV3X3RleHQsIGZpbGVuYW1lLCBvbGRfdGV4dCwgZW5jb2RpbmcpCiAgICAgICAgIGVsc2U6CkBAIC01ODIsMTIgKzY1NCwzIEBACiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICByZXR1cm4gc3VwZXIoTXVsdGlwcm9jZXNzUmVmYWN0b3JpbmdUb29sLCBzZWxmKS5yZWZhY3Rvcl9maWxlKAogICAgICAgICAgICAgICAgICphcmdzLCAqKmt3YXJncykKLQotCi1kZWYgZGlmZl90ZXh0cyhhLCBiLCBmaWxlbmFtZSk6Ci0gICAgIiIiUmV0dXJuIGEgdW5pZmllZCBkaWZmIG9mIHR3byBzdHJpbmdzLiIiIgotICAgIGEgPSBhLnNwbGl0bGluZXMoKQotICAgIGIgPSBiLnNwbGl0bGluZXMoKQotICAgIHJldHVybiBkaWZmbGliLnVuaWZpZWRfZGlmZihhLCBiLCBmaWxlbmFtZSwgZmlsZW5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIob3JpZ2luYWwpIiwgIihyZWZhY3RvcmVkKSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmV0ZXJtPSIiKQpkaWZmIC0tZ2l0IGEvTGliL2xpYjJ0bzMvdGVzdHMvZGF0YS9kaWZmZXJlbnRfZW5jb2RpbmcucHkgYi9MaWIvbGliMnRvMy90ZXN0cy9kYXRhL2RpZmZlcmVudF9lbmNvZGluZy5weQppbmRleCA4ODhmNTFmLi45ZjMyYmQwIDEwMDY0NAotLS0gYS9MaWIvbGliMnRvMy90ZXN0cy9kYXRhL2RpZmZlcmVudF9lbmNvZGluZy5weQorKysgYi9MaWIvbGliMnRvMy90ZXN0cy9kYXRhL2RpZmZlcmVudF9lbmNvZGluZy5weQpAQCAtMSwzICsxLDYgQEAKICMhL3Vzci9iaW4vZW52IHB5dGhvbgotIyAtKi0gY29kaW5nOiBpc28tODg1OS0xIC0qLQotcHJpbnQgdSff4OHi4+Tl5ufo6err7O3u7/Dx8vP09fb4+fr7/P3+/8DBwsPExcbHyMnKy8zNzs/Q0dLT1NXW2Nna29zd3icKKyMgLSotIGNvZGluZzogdXRmLTggLSotCitwcmludCB1J8Ofw6DDocOiw6PDpMOlw6bDp8Oow6nDqsOrw6zDrcOuw6/DsMOxw7LDs8O0w7XDtsO4w7nDusO7w7zDvcO+w7/DgMOBw4LDg8OEw4XDhsOHw4jDicOKw4vDjMONw47Dj8OQw5HDksOTw5TDlcOWw5jDmcOaw5vDnMOdw54nCisKK2RlZiBmKHgpOgorICAgIHByaW50ICclc1x0LT4gIM6xKCUyaSk6JXMgIM6yKCVzKScKZGlmZiAtLWdpdCBhL0xpYi9saWIydG8zL3Rlc3RzL3Rlc3RfZml4ZXJzLnB5IGIvTGliL2xpYjJ0bzMvdGVzdHMvdGVzdF9maXhlcnMucHkKaW5kZXggYzBmMWUzNy4uYTI1ZjVhOCAxMDA3NTUKLS0tIGEvTGliL2xpYjJ0bzMvdGVzdHMvdGVzdF9maXhlcnMucHkKKysrIGIvTGliL2xpYjJ0bzMvdGVzdHMvdGVzdF9maXhlcnMucHkKQEAgLTE4LDggKzE4LDYgQEAKICAgICBkZWYgc2V0VXAoc2VsZiwgZml4X2xpc3Q9Tm9uZSwgZml4ZXJfcGtnPSJsaWIydG8zIiwgb3B0aW9ucz1Ob25lKToKICAgICAgICAgaWYgZml4X2xpc3QgaXMgTm9uZToKICAgICAgICAgICAgIGZpeF9saXN0ID0gW3NlbGYuZml4ZXJdCi0gICAgICAgIGlmIG9wdGlvbnMgaXMgTm9uZToKLSAgICAgICAgICAgIG9wdGlvbnMgPSB7InByaW50X2Z1bmN0aW9uIiA6IEZhbHNlfQogICAgICAgICBzZWxmLnJlZmFjdG9yID0gc3VwcG9ydC5nZXRfcmVmYWN0b3JlcihmaXhlcl9wa2csIGZpeF9saXN0LCBvcHRpb25zKQogICAgICAgICBzZWxmLmZpeGVyX2xvZyA9IFtdCiAgICAgICAgIHNlbGYuZmlsZW5hbWUgPSAiPHN0cmluZz4iCkBAIC01OCw4ICs1Niw3IEBACiAgICAgZGVmIGFzc2VydF9ydW5zX2FmdGVyKHNlbGYsICpuYW1lcyk6CiAgICAgICAgIGZpeGVzID0gW3NlbGYuZml4ZXJdCiAgICAgICAgIGZpeGVzLmV4dGVuZChuYW1lcykKLSAgICAgICAgb3B0aW9ucyA9IHsicHJpbnRfZnVuY3Rpb24iIDogRmFsc2V9Ci0gICAgICAgIHIgPSBzdXBwb3J0LmdldF9yZWZhY3RvcmVyKCJsaWIydG8zIiwgZml4ZXMsIG9wdGlvbnMpCisgICAgICAgIHIgPSBzdXBwb3J0LmdldF9yZWZhY3RvcmVyKCJsaWIydG8zIiwgZml4ZXMpCiAgICAgICAgIChwcmUsIHBvc3QpID0gci5nZXRfZml4ZXJzKCkKICAgICAgICAgbiA9ICJmaXhfIiArIHNlbGYuZml4ZXIKICAgICAgICAgaWYgcG9zdCBhbmQgcG9zdFstMV0uX19jbGFzc19fLl9fbW9kdWxlX18uZW5kc3dpdGgobik6CkBAIC0zNzksMTggKzM3NiwxNSBAQAogICAgICAgICBzZWxmLnVuY2hhbmdlZChzKQogCiAgICAgZGVmIHRlc3RfaWRlbXBvdGVuY3lfcHJpbnRfYXNfZnVuY3Rpb24oc2VsZik6Ci0gICAgICAgIHByaW50X3N0bXQgPSBweWdyYW0ucHl0aG9uX2dyYW1tYXIua2V5d29yZHMucG9wKCJwcmludCIpCi0gICAgICAgIHRyeToKLSAgICAgICAgICAgIHMgPSAiIiJwcmludCgxLCAxKzEsIDErMSsxKSIiIgotICAgICAgICAgICAgc2VsZi51bmNoYW5nZWQocykKKyAgICAgICAgc2VsZi5yZWZhY3Rvci5kcml2ZXIuZ3JhbW1hciA9IHB5Z3JhbS5weXRob25fZ3JhbW1hcl9ub19wcmludF9zdGF0ZW1lbnQKKyAgICAgICAgcyA9ICIiInByaW50KDEsIDErMSwgMSsxKzEpIiIiCisgICAgICAgIHNlbGYudW5jaGFuZ2VkKHMpCiAKLSAgICAgICAgICAgIHMgPSAiIiJwcmludCgpIiIiCi0gICAgICAgICAgICBzZWxmLnVuY2hhbmdlZChzKQorICAgICAgICBzID0gIiIicHJpbnQoKSIiIgorICAgICAgICBzZWxmLnVuY2hhbmdlZChzKQogCi0gICAgICAgICAgICBzID0gIiIicHJpbnQoJycpIiIiCi0gICAgICAgICAgICBzZWxmLnVuY2hhbmdlZChzKQotICAgICAgICBmaW5hbGx5OgotICAgICAgICAgICAgcHlncmFtLnB5dGhvbl9ncmFtbWFyLmtleXdvcmRzWyJwcmludCJdID0gcHJpbnRfc3RtdAorICAgICAgICBzID0gIiIicHJpbnQoJycpIiIiCisgICAgICAgIHNlbGYudW5jaGFuZ2VkKHMpCiAKICAgICBkZWYgdGVzdF8xKHNlbGYpOgogICAgICAgICBiID0gIiIicHJpbnQgMSwgMSsxLCAxKzErMSIiIgpAQCAtNDYyLDMxICs0NTYsMTUgQEAKICAgICAgICAgYSA9ICIiInByaW50KGZpbGU9c3lzLnN0ZGVycikiIiIKICAgICAgICAgc2VsZi5jaGVjayhiLCBhKQogCi0gICAgIyBXaXRoIGZyb20gX19mdXR1cmVfXyBpbXBvcnQgcHJpbnRfZnVuY3Rpb24KICAgICBkZWYgdGVzdF93aXRoX2Z1dHVyZV9wcmludF9mdW5jdGlvbihzZWxmKToKLSAgICAgICAgIyBYWFg6IFRoZXNlIHRlc3RzIHdvbid0IGFjdHVhbGx5IGRvIGFueXRoaW5nIHVudGlsIHRoZSBwYXJzZXIKLSAgICAgICAgIyAgICAgIGlzIGZpeGVkIHNvIGl0IHdvbid0IGNyYXNoIHdoZW4gaXQgc2VlcyBwcmludCh4PXkpLgotICAgICAgICAjICAgICAgV2hlbiAjMjQxMiBpcyBmaXhlZCwgdGhlIHRyeS9leGNlcHQgYmxvY2sgY2FuIGJlIHRha2VuCi0gICAgICAgICMgICAgICBvdXQgYW5kIHRoZSB0ZXN0cyBjYW4gYmUgcnVuIGxpa2Ugbm9ybWFsLgotICAgICAgICAjIE12TDogZGlzYWJsZSBlbnRpcmVseSBmb3Igbm93LCBzbyB0aGF0IGl0IGRvZXNuJ3QgcHJpbnQgdG8gc3Rkb3V0Ci0gICAgICAgIHJldHVybgotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBzID0gImZyb20gX19mdXR1cmVfXyBpbXBvcnQgcHJpbnRfZnVuY3Rpb25cbiJcCi0gICAgICAgICAgICAgICAgInByaW50KCdIYWkhJywgZW5kPScgJykiCi0gICAgICAgICAgICBzZWxmLnVuY2hhbmdlZChzKQorICAgICAgICBzID0gImZyb20gX19mdXR1cmVfXyBpbXBvcnQgcHJpbnRfZnVuY3Rpb25cbiIgXAorICAgICAgICAgICAgInByaW50KCdIYWkhJywgZW5kPScgJykiCisgICAgICAgIHNlbGYudW5jaGFuZ2VkKHMpCiAKLSAgICAgICAgICAgIGIgPSAicHJpbnQgJ0hlbGxvLCB3b3JsZCEnIgotICAgICAgICAgICAgYSA9ICJwcmludCgnSGVsbG8sIHdvcmxkIScpIgotICAgICAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorICAgICAgICBiID0gInByaW50ICdIZWxsbywgd29ybGQhJyIKKyAgICAgICAgYSA9ICJwcmludCgnSGVsbG8sIHdvcmxkIScpIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCiAKLSAgICAgICAgICAgIHMgPSAiZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCAqXG4iXAotICAgICAgICAgICAgICAgICJwcmludCgnSGFpIScsIGVuZD0nICcpIgotICAgICAgICAgICAgc2VsZi51bmNoYW5nZWQocykKLSAgICAgICAgZXhjZXB0OgotICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKFRydWUsICIjMjQyMSBoYXMgYmVlbiBmaXhlZCAtLSBwcmludGluZyB0ZXN0cyAiXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmVlZCB0byBiZSB1cGRhdGVkISIpCiAKIGNsYXNzIFRlc3RfZXhlYyhGaXhlclRlc3RDYXNlKToKICAgICBmaXhlciA9ICJleGVjIgpAQCAtMTcwNSw2ICsxNjgzLDExIEBACiAgICAgICAgIGZvciBrZXkgaW4gKCdkYmhhc2gnLCAnZHVtYmRibScsICdkYm0nLCAnZ2RibScpOgogICAgICAgICAgICAgc2VsZi5tb2R1bGVzW2tleV0gPSBtYXBwaW5nMVtrZXldCiAKKyAgICBkZWYgdGVzdF9hZnRlcl9sb2NhbF9pbXBvcnRzX3JlZmFjdG9yaW5nKHNlbGYpOgorICAgICAgICBmb3IgZml4IGluICgiaW1wb3J0cyIsICJpbXBvcnRzMiIpOgorICAgICAgICAgICAgc2VsZi5maXhlciA9IGZpeAorICAgICAgICAgICAgc2VsZi5hc3NlcnRfcnVuc19hZnRlcigiaW1wb3J0IikKKwogCiBjbGFzcyBUZXN0X3VybGxpYihGaXhlclRlc3RDYXNlKToKICAgICBmaXhlciA9ICJ1cmxsaWIiCkBAIC0zNTA0LDYgKzM0ODcsNyBAQAogICAgICAgICBzID0gImZyb20gaXRlcnRvb2xzIGltcG9ydCBmb28iCiAgICAgICAgIHNlbGYudW5jaGFuZ2VkKHMpCiAKKwogY2xhc3MgVGVzdF9pbXBvcnQoRml4ZXJUZXN0Q2FzZSk6CiAgICAgZml4ZXIgPSAiaW1wb3J0IgogCkBAIC0zNTM4LDggKzM1MjIsNyBAQAogCiAgICAgICAgIHNlbGYuYWx3YXlzX2V4aXN0cyA9IEZhbHNlCiAgICAgICAgIHNlbGYucHJlc2VudF9maWxlcyA9IHNldChbJ19faW5pdF9fLnB5J10pCi0gICAgICAgIGV4cGVjdGVkX2V4dGVuc2lvbnMgPSAoJy5weScsIG9zLnBhdGgucGF0aHNlcCwgJy5weWMnLCAnLnNvJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLnNsJywgJy5weWQnKQorICAgICAgICBleHBlY3RlZF9leHRlbnNpb25zID0gKCcucHknLCBvcy5wYXRoLnNlcCwgJy5weWMnLCAnLnNvJywgJy5zbCcsICcucHlkJykKICAgICAgICAgbmFtZXNfdG9fdGVzdCA9IChwKCIvc3BhbS9lZ2dzLnB5IiksICJuaS5weSIsIHAoIi4uLy4uL3NocnViYmVyeS5weSIpKQogCiAgICAgICAgIGZvciBuYW1lIGluIG5hbWVzX3RvX3Rlc3Q6CkBAIC0zNTY5LDYgKzM1NTIsMTMgQEAKICAgICAgICAgc2VsZi5wcmVzZW50X2ZpbGVzID0gc2V0KFsiX19pbml0X18ucHkiLCAiYmFyLnB5Il0pCiAgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKIAorICAgIGRlZiB0ZXN0X2ltcG9ydF9mcm9tX3BhY2thZ2Uoc2VsZik6CisgICAgICAgIGIgPSAiaW1wb3J0IGJhciIKKyAgICAgICAgYSA9ICJmcm9tIC4gaW1wb3J0IGJhciIKKyAgICAgICAgc2VsZi5hbHdheXNfZXhpc3RzID0gRmFsc2UKKyAgICAgICAgc2VsZi5wcmVzZW50X2ZpbGVzID0gc2V0KFsiX19pbml0X18ucHkiLCAiYmFyLyJdKQorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKICAgICBkZWYgdGVzdF9jb21tZW50c19hbmRfaW5kZW50KHNlbGYpOgogICAgICAgICBiID0gImltcG9ydCBiYXIgIyBGb28iCiAgICAgICAgIGEgPSAiZnJvbSAuIGltcG9ydCBiYXIgIyBGb28iCkBAIC00MDk1LDMgKzQwODUsMjYgQEAKICAgICAgICAgYiA9ICIiIm9zLmdldGN3ZHUgKCAgKSIiIgogICAgICAgICBhID0gIiIib3MuZ2V0Y3dkICggICkiIiIKICAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisKK2NsYXNzIFRlc3Rfb3BlcmF0b3IoRml4ZXJUZXN0Q2FzZSk6CisKKyAgICBmaXhlciA9ICJvcGVyYXRvciIKKworICAgIGRlZiB0ZXN0X29wZXJhdG9yX2lzQ2FsbGFibGUoc2VsZik6CisgICAgICAgIGIgPSAib3BlcmF0b3IuaXNDYWxsYWJsZSh4KSIKKyAgICAgICAgYSA9ICJoYXNhdHRyKHgsICdfX2NhbGxfXycpIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF9vcGVyYXRvcl9zZXF1ZW5jZUluY2x1ZGVzKHNlbGYpOgorICAgICAgICBiID0gIm9wZXJhdG9yLnNlcXVlbmNlSW5jbHVkZXMoeCwgeSkiCisgICAgICAgIGEgPSAib3BlcmF0b3IuY29udGFpbnMoeCwgeSkiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0X2JhcmVfaXNDYWxsYWJsZShzZWxmKToKKyAgICAgICAgcyA9ICJpc0NhbGxhYmxlKHgpIgorICAgICAgICBzZWxmLndhcm5zX3VuY2hhbmdlZChzLCAiWW91IHNob3VsZCB1c2UgaGFzYXR0cih4LCAnX19jYWxsX18nKSBoZXJlLiIpCisKKyAgICBkZWYgdGVzdF9iYXJlX3NlcXVlbmNlSW5jbHVkZXMoc2VsZik6CisgICAgICAgIHMgPSAic2VxdWVuY2VJbmNsdWRlcyh4LCB5KSIKKyAgICAgICAgc2VsZi53YXJuc191bmNoYW5nZWQocywgIllvdSBzaG91bGQgdXNlIG9wZXJhdG9yLmNvbnRhaW5zIGhlcmUuIikKZGlmZiAtLWdpdCBhL0xpYi9saWIydG8zL3Rlc3RzL3Rlc3RfcmVmYWN0b3IucHkgYi9MaWIvbGliMnRvMy90ZXN0cy90ZXN0X3JlZmFjdG9yLnB5CmluZGV4IGU1NWY1NTUuLmIyODJjYmEgMTAwNjQ0Ci0tLSBhL0xpYi9saWIydG8zL3Rlc3RzL3Rlc3RfcmVmYWN0b3IucHkKKysrIGIvTGliL2xpYjJ0bzMvdGVzdHMvdGVzdF9yZWZhY3Rvci5weQpAQCAtNyw5ICs3LDEyIEBACiBpbXBvcnQgb3BlcmF0b3IKIGltcG9ydCBpbwogaW1wb3J0IHRlbXBmaWxlCitpbXBvcnQgc2h1dGlsCiBpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCB3YXJuaW5ncwogCiBmcm9tIGxpYjJ0bzMgaW1wb3J0IHJlZmFjdG9yLCBweWdyYW0sIGZpeGVyX2Jhc2UKK2Zyb20gbGliMnRvMy5wZ2VuMiBpbXBvcnQgdG9rZW4KIAogZnJvbSAuIGltcG9ydCBzdXBwb3J0CiAKQEAgLTQyLDE0ICs0NSwxMSBAQAogICAgICAgICByZXR1cm4gcmVmYWN0b3IuUmVmYWN0b3JpbmdUb29sKGZpeGVycywgb3B0aW9ucywgZXhwbGljaXQpCiAKICAgICBkZWYgdGVzdF9wcmludF9mdW5jdGlvbl9vcHRpb24oc2VsZik6Ci0gICAgICAgIGdyYW0gPSBweWdyYW0ucHl0aG9uX2dyYW1tYXIKLSAgICAgICAgc2F2ZSA9IGdyYW0ua2V5d29yZHNbInByaW50Il0KLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgcnQgPSBzZWxmLnJ0KHsicHJpbnRfZnVuY3Rpb24iIDogVHJ1ZX0pCi0gICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvciwgb3BlcmF0b3IuaXRlbWdldHRlcigicHJpbnQiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyYW0ua2V5d29yZHMpCi0gICAgICAgIGZpbmFsbHk6Ci0gICAgICAgICAgICBncmFtLmtleXdvcmRzWyJwcmludCJdID0gc2F2ZQorICAgICAgICB3aXRoIHdhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKHJlY29yZD1UcnVlKSBhcyB3OgorICAgICAgICAgICAgcmVmYWN0b3IuUmVmYWN0b3JpbmdUb29sKF9ERUZBVUxUX0ZJWEVSUywgeyJwcmludF9mdW5jdGlvbiIgOiBUcnVlfSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4odyksIDEpCisgICAgICAgIG1zZywgPSB3CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtc2cuY2F0ZWdvcnkgaXMgRGVwcmVjYXRpb25XYXJuaW5nKQogCiAgICAgZGVmIHRlc3RfZml4ZXJfbG9hZGluZ19oZWxwZXJzKHNlbGYpOgogICAgICAgICBjb250ZW50cyA9IFsiZXhwbGljaXQiLCAiZmlyc3QiLCAibGFzdCIsICJwYXJyb3QiLCAicHJlb3JkZXIiXQpAQCAtNjEsMTkgKzYxLDYzIEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZnVsbF9uYW1lcywKICAgICAgICAgICAgICAgICAgICAgICAgICBbIm15Zml4ZXMuZml4XyIgKyBuYW1lIGZvciBuYW1lIGluIGNvbnRlbnRzXSkKIAorICAgIGRlZiB0ZXN0X2RldGVjdF9mdXR1cmVfcHJpbnQoc2VsZik6CisgICAgICAgIHJ1biA9IHJlZmFjdG9yLl9kZXRlY3RfZnV0dXJlX3ByaW50CisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UocnVuKCIiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJ1bigiZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBwcmludF9mdW5jdGlvbiIpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHJ1bigiZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBnZW5lcmF0b3JzIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UocnVuKCJmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGdlbmVyYXRvcnMsIGZlYXR1cmUiKSkKKyAgICAgICAgaW5wdXQgPSAiZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBnZW5lcmF0b3JzLCBwcmludF9mdW5jdGlvbiIKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJ1bihpbnB1dCkpCisgICAgICAgIGlucHV0ID0iZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBwcmludF9mdW5jdGlvbiwgZ2VuZXJhdG9ycyIKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJ1bihpbnB1dCkpCisgICAgICAgIGlucHV0ID0gImZyb20gX19mdXR1cmVfXyBpbXBvcnQgKHByaW50X2Z1bmN0aW9uLCkiCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShydW4oaW5wdXQpKQorICAgICAgICBpbnB1dCA9ICJmcm9tIF9fZnV0dXJlX18gaW1wb3J0IChnZW5lcmF0b3JzLCBwcmludF9mdW5jdGlvbikiCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShydW4oaW5wdXQpKQorICAgICAgICBpbnB1dCA9ICJmcm9tIF9fZnV0dXJlX18gaW1wb3J0IChnZW5lcmF0b3JzLCBuZXN0ZWRfc2NvcGVzKSIKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShydW4oaW5wdXQpKQorICAgICAgICBpbnB1dCA9ICIiImZyb20gX19mdXR1cmVfXyBpbXBvcnQgZ2VuZXJhdG9ycworZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBwcmludF9mdW5jdGlvbiIiIgorICAgICAgICBzZWxmLmFzc2VydFRydWUocnVuKGlucHV0KSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShydW4oImZyb20iKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShydW4oImZyb20gNCIpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHJ1bigiZnJvbSB4IikpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UocnVuKCJmcm9tIHggNSIpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHJ1bigiZnJvbSB4IGltIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UocnVuKCJmcm9tIHggaW1wb3J0IikpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UocnVuKCJmcm9tIHggaW1wb3J0IDQiKSkKKyAgICAgICAgaW5wdXQgPSAiJ2RvY3N0cmluZydcbmZyb20gX19mdXR1cmVfXyBpbXBvcnQgcHJpbnRfZnVuY3Rpb24iCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShydW4oaW5wdXQpKQorICAgICAgICBpbnB1dCA9ICInZG9jc3RyaW5nJ1xuJ3NvbW5nJ1xuZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBwcmludF9mdW5jdGlvbiIKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShydW4oaW5wdXQpKQorICAgICAgICBpbnB1dCA9ICIjIGNvbW1lbnRcbmZyb20gX19mdXR1cmVfXyBpbXBvcnQgcHJpbnRfZnVuY3Rpb24iCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShydW4oaW5wdXQpKQorICAgICAgICBpbnB1dCA9ICIjIGNvbW1lbnRcbidkb2MnXG5mcm9tIF9fZnV0dXJlX18gaW1wb3J0IHByaW50X2Z1bmN0aW9uIgorICAgICAgICBzZWxmLmFzc2VydFRydWUocnVuKGlucHV0KSkKKyAgICAgICAgaW5wdXQgPSAiY2xhc3MgeDogcGFzc1xuZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBwcmludF9mdW5jdGlvbiIKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShydW4oaW5wdXQpKQorCiAgICAgZGVmIHRlc3RfZ2V0X2hlYWRub2RlX2RpY3Qoc2VsZik6CiAgICAgICAgIGNsYXNzIE5vbmVGaXgoZml4ZXJfYmFzZS5CYXNlRml4KToKLSAgICAgICAgICAgIFBBVFRFUk4gPSBOb25lCisgICAgICAgICAgICBwYXNzCiAKICAgICAgICAgY2xhc3MgRmlsZUlucHV0Rml4KGZpeGVyX2Jhc2UuQmFzZUZpeCk6CiAgICAgICAgICAgICBQQVRURVJOID0gImZpbGVfaW5wdXQ8IGFueSAqID4iCiAKKyAgICAgICAgY2xhc3MgU2ltcGxlRml4KGZpeGVyX2Jhc2UuQmFzZUZpeCk6CisgICAgICAgICAgICBQQVRURVJOID0gIiduYW1lJyIKKwogICAgICAgICBub19oZWFkID0gTm9uZUZpeCh7fSwgW10pCiAgICAgICAgIHdpdGhfaGVhZCA9IEZpbGVJbnB1dEZpeCh7fSwgW10pCi0gICAgICAgIGQgPSByZWZhY3Rvci5nZXRfaGVhZG5vZGVfZGljdChbbm9faGVhZCwgd2l0aF9oZWFkXSkKLSAgICAgICAgZXhwZWN0ZWQgPSB7Tm9uZTogW25vX2hlYWRdLAotICAgICAgICAgICAgICAgICAgICBweWdyYW0ucHl0aG9uX3N5bWJvbHMuZmlsZV9pbnB1dCA6IFt3aXRoX2hlYWRdfQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQsIGV4cGVjdGVkKQorICAgICAgICBzaW1wbGUgPSBTaW1wbGVGaXgoe30sIFtdKQorICAgICAgICBkID0gcmVmYWN0b3IuX2dldF9oZWFkbm9kZV9kaWN0KFtub19oZWFkLCB3aXRoX2hlYWQsIHNpbXBsZV0pCisgICAgICAgIHRvcF9maXhlcyA9IGQucG9wKHB5Z3JhbS5weXRob25fc3ltYm9scy5maWxlX2lucHV0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRvcF9maXhlcywgW3dpdGhfaGVhZCwgbm9faGVhZF0pCisgICAgICAgIG5hbWVfZml4ZXMgPSBkLnBvcCh0b2tlbi5OQU1FKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5hbWVfZml4ZXMsIFtzaW1wbGUsIG5vX2hlYWRdKQorICAgICAgICBmb3IgZml4ZXMgaW4gZC52YWx1ZXMoKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZml4ZXMsIFtub19oZWFkXSkKIAogICAgIGRlZiB0ZXN0X2ZpeGVyX2xvYWRpbmcoc2VsZik6CiAgICAgICAgIGZyb20gbXlmaXhlcy5maXhfZmlyc3QgaW1wb3J0IEZpeEZpcnN0CkBAIC0xMDYsMTAgKzE1MCwxMCBAQAogCiAgICAgICAgIGNsYXNzIE15UlQocmVmYWN0b3IuUmVmYWN0b3JpbmdUb29sKToKIAotICAgICAgICAgICAgZGVmIHByaW50X291dHB1dChzZWxmLCBsaW5lcyk6Ci0gICAgICAgICAgICAgICAgZGlmZl9saW5lcy5leHRlbmQobGluZXMpCisgICAgICAgICAgICBkZWYgcHJpbnRfb3V0cHV0KHNlbGYsIG9sZF90ZXh0LCBuZXdfdGV4dCwgZmlsZW5hbWUsIGVxdWFsKToKKyAgICAgICAgICAgICAgICByZXN1bHRzLmV4dGVuZChbb2xkX3RleHQsIG5ld190ZXh0LCBmaWxlbmFtZSwgZXF1YWxdKQogCi0gICAgICAgIGRpZmZfbGluZXMgPSBbXQorICAgICAgICByZXN1bHRzID0gW10KICAgICAgICAgcnQgPSBNeVJUKF9ERUZBVUxUX0ZJWEVSUykKICAgICAgICAgc2F2ZSA9IHN5cy5zdGRpbgogICAgICAgICBzeXMuc3RkaW4gPSBpby5TdHJpbmdJTygiZGVmIHBhcnJvdCgpOiBwYXNzXG5cbiIpCkBAIC0xMTcsMTIgKzE2MSwxMCBAQAogICAgICAgICAgICAgcnQucmVmYWN0b3Jfc3RkaW4oKQogICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgc3lzLnN0ZGluID0gc2F2ZQotICAgICAgICBleHBlY3RlZCA9ICIiIi0tLSA8c3RkaW4+IChvcmlnaW5hbCkKLSsrKyA8c3RkaW4+IChyZWZhY3RvcmVkKQotQEAgLTEsMiArMSwyIEBACi0tZGVmIHBhcnJvdCgpOiBwYXNzCi0rZGVmIGNoZWVzZSgpOiBwYXNzIiIiLnNwbGl0bGluZXMoKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpZmZfbGluZXNbOi0xXSwgZXhwZWN0ZWQpCisgICAgICAgIGV4cGVjdGVkID0gWyJkZWYgcGFycm90KCk6IHBhc3NcblxuIiwKKyAgICAgICAgICAgICAgICAgICAgImRlZiBjaGVlc2UoKTogcGFzc1xuXG4iLAorICAgICAgICAgICAgICAgICAgICAiPHN0ZGluPiIsIEZhbHNlXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdHMsIGV4cGVjdGVkKQogCiAgICAgZGVmIGNoZWNrX2ZpbGVfcmVmYWN0b3Jpbmcoc2VsZiwgdGVzdF9maWxlLCBmaXhlcnM9XzJUTzNfRklYRVJTKToKICAgICAgICAgZGVmIHJlYWRfZmlsZSgpOgpAQCAtMTQ1LDYgKzE4NywzNyBAQAogICAgICAgICB0ZXN0X2ZpbGUgPSBvcy5wYXRoLmpvaW4oRklYRVJfRElSLCAicGFycm90X2V4YW1wbGUucHkiKQogICAgICAgICBzZWxmLmNoZWNrX2ZpbGVfcmVmYWN0b3JpbmcodGVzdF9maWxlLCBfREVGQVVMVF9GSVhFUlMpCiAKKyAgICBkZWYgdGVzdF9yZWZhY3Rvcl9kaXIoc2VsZik6CisgICAgICAgIGRlZiBjaGVjayhzdHJ1Y3R1cmUsIGV4cGVjdGVkKToKKyAgICAgICAgICAgIGRlZiBtb2NrX3JlZmFjdG9yX2ZpbGUoc2VsZiwgZiwgKmFyZ3MpOgorICAgICAgICAgICAgICAgIGdvdC5hcHBlbmQoZikKKyAgICAgICAgICAgIHNhdmVfZnVuYyA9IHJlZmFjdG9yLlJlZmFjdG9yaW5nVG9vbC5yZWZhY3Rvcl9maWxlCisgICAgICAgICAgICByZWZhY3Rvci5SZWZhY3RvcmluZ1Rvb2wucmVmYWN0b3JfZmlsZSA9IG1vY2tfcmVmYWN0b3JfZmlsZQorICAgICAgICAgICAgcnQgPSBzZWxmLnJ0KCkKKyAgICAgICAgICAgIGdvdCA9IFtdCisgICAgICAgICAgICBkaXIgPSB0ZW1wZmlsZS5ta2R0ZW1wKHByZWZpeD0iMnRvMy10ZXN0X3JlZmFjdG9yIikKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBvcy5ta2Rpcihvcy5wYXRoLmpvaW4oZGlyLCAiYV9kaXIiKSkKKyAgICAgICAgICAgICAgICBmb3IgZm4gaW4gc3RydWN0dXJlOgorICAgICAgICAgICAgICAgICAgICBvcGVuKG9zLnBhdGguam9pbihkaXIsIGZuKSwgIndiIikuY2xvc2UoKQorICAgICAgICAgICAgICAgIHJ0LnJlZmFjdG9yX2RpcihkaXIpCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIHJlZmFjdG9yLlJlZmFjdG9yaW5nVG9vbC5yZWZhY3Rvcl9maWxlID0gc2F2ZV9mdW5jCisgICAgICAgICAgICAgICAgc2h1dGlsLnJtdHJlZShkaXIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdvdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW29zLnBhdGguam9pbihkaXIsIHBhdGgpIGZvciBwYXRoIGluIGV4cGVjdGVkXSkKKyAgICAgICAgY2hlY2soW10sIFtdKQorICAgICAgICB0cmVlID0gWyJub3RoaW5nIiwKKyAgICAgICAgICAgICAgICAiaGkucHkiLAorICAgICAgICAgICAgICAgICIuZHVtYiIsCisgICAgICAgICAgICAgICAgIi5hZnRlci5weSIsCisgICAgICAgICAgICAgICAgInNhcHB5Il0KKyAgICAgICAgZXhwZWN0ZWQgPSBbImhpLnB5Il0KKyAgICAgICAgY2hlY2sodHJlZSwgZXhwZWN0ZWQpCisgICAgICAgIHRyZWUgPSBbImhpLnB5IiwKKyAgICAgICAgICAgICAgICAiYV9kaXIvc3R1ZmYucHkiXQorICAgICAgICBjaGVjayh0cmVlLCB0cmVlKQorCiAgICAgZGVmIHRlc3RfZmlsZV9lbmNvZGluZyhzZWxmKToKICAgICAgICAgZm4gPSBvcy5wYXRoLmpvaW4oVEVTVF9EQVRBX0RJUiwgImRpZmZlcmVudF9lbmNvZGluZy5weSIpCiAgICAgICAgIHNlbGYuY2hlY2tfZmlsZV9yZWZhY3RvcmluZyhmbikKZGlmZiAtLWdpdCBhL0xpYi9saWIydG8zL3Rlc3RzL3Rlc3RfdXRpbC5weSBiL0xpYi9saWIydG8zL3Rlc3RzL3Rlc3RfdXRpbC5weQppbmRleCBlZjMyNTZkLi42MTg2YjRmIDEwMDY0NAotLS0gYS9MaWIvbGliMnRvMy90ZXN0cy90ZXN0X3V0aWwucHkKKysrIGIvTGliL2xpYjJ0bzMvdGVzdHMvdGVzdF91dGlsLnB5CkBAIC0xLDQgKzEsNCBAQAotIiIiIFRlc3Qgc3VpdGUgZm9yIHRoZSBjb2RlIGluIGZpeGVzLnV0aWwgIiIiCisiIiIgVGVzdCBzdWl0ZSBmb3IgdGhlIGNvZGUgaW4gZml4ZXJfdXRpbCAiIiIKIAogIyBUZXN0aW5nIGltcG9ydHMKIGZyb20gLiBpbXBvcnQgc3VwcG9ydApAQCAtNywxMCArNywxMCBAQAogaW1wb3J0IG9zLnBhdGgKIAogIyBMb2NhbCBpbXBvcnRzCi1mcm9tIC4uIGltcG9ydCBweXRyZWUKLWZyb20gLi4gaW1wb3J0IGZpeGVyX3V0aWwKLWZyb20gLi5maXhlcl91dGlsIGltcG9ydCBBdHRyLCBOYW1lCi0KK2Zyb20gbGliMnRvMy5weXRyZWUgaW1wb3J0IE5vZGUsIExlYWYKK2Zyb20gbGliMnRvMyBpbXBvcnQgZml4ZXJfdXRpbAorZnJvbSBsaWIydG8zLmZpeGVyX3V0aWwgaW1wb3J0IEF0dHIsIE5hbWUsIENhbGwsIENvbW1hCitmcm9tIGxpYjJ0bzMucGdlbjIgaW1wb3J0IHRva2VuCiAKIGRlZiBwYXJzZShjb2RlLCBzdHJpcF9sZXZlbHM9MCk6CiAgICAgIyBUaGUgdG9wbW9zdCBub2RlIGlzIGZpbGVfaW5wdXQsIHdoaWNoIHdlIGRvbid0IGNhcmUgYWJvdXQuCkBAIC0yNCw3ICsyNCw3IEBACiBjbGFzcyBNYWNyb1Rlc3RDYXNlKHN1cHBvcnQuVGVzdENhc2UpOgogICAgIGRlZiBhc3NlcnRTdHIoc2VsZiwgbm9kZSwgc3RyaW5nKToKICAgICAgICAgaWYgaXNpbnN0YW5jZShub2RlLCAodHVwbGUsIGxpc3QpKToKLSAgICAgICAgICAgIG5vZGUgPSBweXRyZWUuTm9kZShmaXhlcl91dGlsLnN5bXMuc2ltcGxlX3N0bXQsIG5vZGUpCisgICAgICAgICAgICBub2RlID0gTm9kZShmaXhlcl91dGlsLnN5bXMuc2ltcGxlX3N0bXQsIG5vZGUpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKG5vZGUpLCBzdHJpbmcpCiAKIApAQCAtNzgsNiArNzgsMzEgQEAKICAgICAgICAgc2VsZi5hc3NlcnRTdHIoTmFtZSgiYSIsIHByZWZpeD0iYiIpLCAiYmEiKQogCiAKK2NsYXNzIFRlc3RfQ2FsbChNYWNyb1Rlc3RDYXNlKToKKyAgICBkZWYgX0NhbGwoc2VsZiwgbmFtZSwgYXJncz1Ob25lLCBwcmVmaXg9Tm9uZSk6CisgICAgICAgICIiIkhlbHAgdGhlIG5leHQgdGVzdCIiIgorICAgICAgICBjaGlsZHJlbiA9IFtdCisgICAgICAgIGlmIGlzaW5zdGFuY2UoYXJncywgbGlzdCk6CisgICAgICAgICAgICBmb3IgYXJnIGluIGFyZ3M6CisgICAgICAgICAgICAgICAgY2hpbGRyZW4uYXBwZW5kKGFyZykKKyAgICAgICAgICAgICAgICBjaGlsZHJlbi5hcHBlbmQoQ29tbWEoKSkKKyAgICAgICAgICAgIGNoaWxkcmVuLnBvcCgpCisgICAgICAgIHJldHVybiBDYWxsKE5hbWUobmFtZSksIGNoaWxkcmVuLCBwcmVmaXgpCisKKyAgICBkZWYgdGVzdChzZWxmKToKKyAgICAgICAga2lkcyA9IFtOb25lLAorICAgICAgICAgICAgICAgIFtMZWFmKHRva2VuLk5VTUJFUiwgMSksIExlYWYodG9rZW4uTlVNQkVSLCAyKSwKKyAgICAgICAgICAgICAgICAgTGVhZih0b2tlbi5OVU1CRVIsIDMpXSwKKyAgICAgICAgICAgICAgICBbTGVhZih0b2tlbi5OVU1CRVIsIDEpLCBMZWFmKHRva2VuLk5VTUJFUiwgMyksCisgICAgICAgICAgICAgICAgIExlYWYodG9rZW4uTlVNQkVSLCAyKSwgTGVhZih0b2tlbi5OVU1CRVIsIDQpXSwKKyAgICAgICAgICAgICAgICBbTGVhZih0b2tlbi5TVFJJTkcsICJiIiksIExlYWYodG9rZW4uU1RSSU5HLCAiaiIsIHByZWZpeD0iICIpXQorICAgICAgICAgICAgICAgIF0KKyAgICAgICAgc2VsZi5hc3NlcnRTdHIoc2VsZi5fQ2FsbCgiQSIpLCAiQSgpIikKKyAgICAgICAgc2VsZi5hc3NlcnRTdHIoc2VsZi5fQ2FsbCgiYiIsIGtpZHNbMV0pLCAiYigxLDIsMykiKQorICAgICAgICBzZWxmLmFzc2VydFN0cihzZWxmLl9DYWxsKCJhLmIoKS5jIiwga2lkc1syXSksICJhLmIoKS5jKDEsMywyLDQpIikKKyAgICAgICAgc2VsZi5hc3NlcnRTdHIoc2VsZi5fQ2FsbCgiZCIsIGtpZHNbM10sIHByZWZpeD0iICIpLCAiIGQoYiwgaikiKQorCisKIGNsYXNzIFRlc3RfZG9lc190cmVlX2ltcG9ydChzdXBwb3J0LlRlc3RDYXNlKToKICAgICBkZWYgX2ZpbmRfYmluZF9yZWMoc2VsZiwgbmFtZSwgbm9kZSk6CiAgICAgICAgICMgU2VhcmNoIGEgdHJlZSBmb3IgYSBiaW5kaW5nIC0tIHVzZWQgdG8gZmluZCB0aGUgc3RhcnRpbmcK