ZGlmZiAtLWdpdCBhL3J1bnRpbWUvZnRwbHVnaW4vb2NhbWwudmltIGIvcnVudGltZS9mdHBsdWdpbi9vY2FtbC52aW0KaW5kZXggMTBlYWQ4YS4uNTM0MzFjOSAxMDA2NDQKLS0tIGEvcnVudGltZS9mdHBsdWdpbi9vY2FtbC52aW0KKysrIGIvcnVudGltZS9mdHBsdWdpbi9vY2FtbC52aW0KQEAgLTMsOSArMywxMiBAQAogIiAgICAgICAgICAgICAgTWlrZSBMZWFyeSAgICAgICAgICA8bGVhcnlAbndsaW5rLmNvbT4KICIgICAgICAgICAgICAgIE1hcmt1cyBNb3R0bCAgICAgICAgPG1hcmt1cy5tb3R0bEBnbWFpbC5jb20+CiAiICAgICAgICAgICAgICBTdGVmYW5vIFphY2NoaXJvbGkgIDx6YWNrQGJvbm9uaWEuaXQ+CisiICAgICAgICAgICAgICBWaW5jZW50IEFyYXZhbnRpbm9zIDxmaXJzdG5hbWUubmFtZUBpbWFnLmZyPgogIiBVUkw6ICAgICAgICAgaHR0cDovL3d3dy5vY2FtbC5pbmZvL3ZpbS9mdHBsdWdpbi9vY2FtbC52aW0KLSIgTGFzdCBDaGFuZ2U6IDIwMDYgTWF5IDAxIC0gQWRkZWQgLmFubm90IHN1cHBvcnQgZm9yIGZpbGUud2hhdGV2ZXJleHQgKFNaKQotIgkgICAgICAgMjAwNiBBcHIgMTEgLSBGaXhlZCBhbiBpbml0aWFsaXphdGlvbiBidWc7IGZpeGVkIEFTUyBhYmJyZXYgKE1NKQorIiBMYXN0IENoYW5nZTogMjAwNyBTZXAgMDkgLSBBZGRlZCAuYW5ub3Qgc3VwcG9ydCBmb3Igb2NhbWxidWlsZCwgcHl0aG9uIG5vdCAKKyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVlZGVkIGFueW1vcmUgKFZBKQorIiAgICAgICAgICAgICAgMjAwNiBNYXkgMDEgLSBBZGRlZCAuYW5ub3Qgc3VwcG9ydCBmb3IgZmlsZS53aGF0ZXZlcmV4dCAoU1opCisiCSAgICAgICAgICAgICAyMDA2IEFwciAxMSAtIEZpeGVkIGFuIGluaXRpYWxpemF0aW9uIGJ1ZzsgZml4ZWQgQVNTIGFiYnJldiAoTU0pCiAiICAgICAgICAgICAgICAyMDA1IE9jdCAxMyAtIHJlbW92ZWQgR1BMOyBiZXR0ZXIgbWF0Y2hpdCBzdXBwb3J0IChNTSwgU1opCiAiCiBpZiBleGlzdHMoImI6ZGlkX2Z0cGx1Z2luIikKQEAgLTE3NSwyMDggKzE3OCw0MDEgQEAKICAgcmV0dXJuICc9JwogZW5kZnVuY3Rpb24KIAotIiBWaW0gc3VwcG9ydCBmb3IgT0NhbWwgLmFubm90IGZpbGVzIChyZXF1aXJlcyBWaW0gd2l0aCBweXRob24gc3VwcG9ydCkKKyIgVmltIHN1cHBvcnQgZm9yIE9DYW1sIC5hbm5vdCBmaWxlcwogIgotIiBFeGVjdXRpbmcgT0NhbWxQcmludFR5cGUoPG1vZGU+KSBmdW5jdGlvbiB3aWxsIGRpc3BsYXkgaW4gdGhlIFZpbSBib3R0b20KKyIgTGFzdCBDaGFuZ2U6IDIwMDcgSnVsIDE3CisiIE1haW50YWluZXI6ICBWaW5jZW50IEFyYXZhbnRpbm9zIDx2aW5jZW50LmFyYXZhbnRpbm9zQGdtYWlsLmNvbT4KKyIgTGljZW5zZTogICAgIHB1YmxpYyBkb21haW4KKyIKKyIgT3JpZ2luYWxseSBpbnNwaXJlZCBieSAnb2NhbWwtZHR5cGVzLnZpbScgYnkgU3RlZmFubyBaYWNjaGlyb2xpLgorIiBUaGUgc291cmNlIGNvZGUgaXMgcXVpdGUgcmFkaWNhbGx5IGRpZmZlcmVudCBmb3Igd2Ugbm90IHVzZSBweXRob24gYW55bW9yZS4KKyIgSG93ZXZlciB0aGlzIHBsdWdpbiBzaG91bGQgaGF2ZSB0aGUgZXhhY3Qgc2FtZSBiZWhhdmlvdXIsIHRoYXQncyB3aHkgdGhlCisiIGZvbGxvd2luZyBsaW5lcyBhcmUgdGhlIHF1aXRlIGV4YWN0IGNvcHkgb2YgU3RlZmFubydzIG9yaWdpbmFsIHBsdWdpbiA6CisiCisiIDw8CisiIEV4ZWN1dGluZyBPY2FtbF9wcmludF90eXBlKDxtb2RlPikgZnVuY3Rpb24gd2lsbCBkaXNwbGF5IGluIHRoZSBWaW0gYm90dG9tCiAiIGxpbmUocykgdGhlIHR5cGUgb2YgYW4gb2NhbWwgdmFsdWUgZ2V0dGluZyBpdCBmcm9tIHRoZSBjb3JyZXNwb25kaW5nIC5hbm5vdAogIiBmaWxlIChpZiBhbnkpLiAgSWYgVmltIGlzIGluIHZpc3VhbCBtb2RlLCA8bW9kZT4gc2hvdWxkIGJlICJ2aXN1YWwiIGFuZCB0aGUKICIgc2VsZWN0ZWQgb2NhbWwgdmFsdWUgY29ycmVzcG9uZCB0byB0aGUgaGlnaGxpZ2h0ZWQgdGV4dCwgb3RoZXJ3aXNlICg8bW9kZT4KICIgY2FuIGJlIGFueXRoaW5nIGVsc2UpIGl0IGNvcnJlc3BvbmRzIHRvIHRoZSBsaXRlcmFsIGZvdW5kIGF0IHRoZSBjdXJyZW50CiAiIGN1cnNvciBwb3NpdGlvbi4KICIKLSIgLmFubm90IGZpbGVzIGFyZSBwYXJzZWQgbGF6aWx5IHRoZSBmaXJzdCB0aW1lIE9DYW1sUHJpbnRUeXBlIGlzIGludm9rZWQ7IGlzCi0iIGFsc28gcG9zc2libGUgdG8gZm9yY2UgdGhlIHBhcnNpbmcgdXNpbmcgdGhlIE9DYW1sUGFyc2VBbm5vdCgpIGZ1bmN0aW9uLgorIiBUeXBpbmcgJzxMb2NhbExlYWRlcj50JyAoTG9jYWxMZWFkZXIgZGVmYXVsdHMgdG8gJ1wnLCBzZWUgOmggTG9jYWxMZWFkZXIpCisiIHdpbGwgY2F1c2UgIiBPY2FtbF9wcmludF90eXBlIGZ1bmN0aW9uIHRvIGJlIGludm9rZWQgd2l0aCB0aGUgcmlnaHQgCisiIGFyZ3VtZW50IGRlcGVuZGluZyBvbiB0aGUgY3VycmVudCBtb2RlICh2aXN1YWwgb3Igbm90KS4KKyIgPj4KICIKLSIgVHlwaW5nICcsMycgd2lsbCBjYXVzZSBPQ2FtbFByaW50VHlwZSBmdW5jdGlvbiB0byBiZSBpbnZva2VkIHdpdGgKLSIgdGhlIHJpZ2h0IGFyZ3VtZW50IGRlcGVuZGluZyBvbiB0aGUgY3VycmVudCBtb2RlICh2aXN1YWwgb3Igbm90KS4KKyIgSWYgeW91IGZpbmQgc29tZXRoaW5nIG5vdCBtYXRjaGluZyB0aGlzIGJlaGF2aW91ciwgcGxlYXNlIHNpZ25hbCBpdC4KICIKLSIgQ29weXJpZ2h0IChDKSA8MjAwMy0yMDA0PiBTdGVmYW5vIFphY2NoaXJvbGkgPHphY2tAYm9ub25pYS5pdD4KKyIgRGlmZmVyZW5jZXMgYXJlOgorIiAgIC0gbm8gbmVlZCBmb3IgcHl0aG9uIHN1cHBvcnQKKyIgICAgICsgcGx1cyA6IG1vcmUgcG9ydGFibGUKKyIgICAgICsgbWludXM6IG5vIG1vcmUgbGF6eSBwYXJzaW5nLCBpdCBsb29rcyB2ZXJ5IGZhc3QgaG93ZXZlcgorIiAgICAgCisiICAgLSBvY2FtbGJ1aWxkIHN1cHBvcnQsIGllLgorIiAgICAgKyB0aGUgcGx1Z2luIGZpbmRzIHRoZSBfYnVpbGQgZGlyZWN0b3J5IGFuZCBsb29rcyBmb3IgdGhlIAorIiAgICAgICBjb3JyZXNwb25kaW5nIGZpbGUgaW5zaWRlOworIiAgICAgKyBpZiB0aGUgdXNlciBkZWNpZGVzIHRvIGNoYW5nZSB0aGUgbmFtZSBvZiB0aGUgX2J1aWxkIGRpcmVjdG9yeSB0aGFua3MKKyIgICAgICAgdG8gdGhlICctYnVpbGQtZGlyJyBvcHRpb24gb2Ygb2NhbWxidWlsZCwgdGhlIHBsdWdpbiB3aWxsIG1hbmFnZSBpbgorIiAgICAgICBtb3N0IGNhc2VzIHRvIGZpbmQgaXQgb3V0IChtb3N0IGNhc2VzID0gaWYgdGhlIHNvdXJjZSBmaWxlIGhhcyBhIHVuaXF1ZQorIiAgICAgICBuYW1lIGFtb25nIHlvdXIgd2hvbGUgcHJvamVjdCk7CisiICAgICArIGlmIG9jYW1sYnVpbGQgaXMgbm90IHVzZWQsIHRoZSB1c3VhbCBiZWhhdmlvdXIgaG9sZHM7IGllLiB0aGUgLmFubm90CisiICAgICAgIGZpbGUgc2hvdWxkIGJlIGluIHRoZSBzYW1lIGRpcmVjdG9yeSBhcyB0aGUgc291cmNlIGZpbGU7CisiICAgICArIGZvciB2aW0gcGx1Z2luIHByb2dyYW1tZXJzOgorIiAgICAgICB0aGUgdmFyaWFibGUgJ2I6X2J1aWxkX2RpcicgY29udGFpbnMgdGhlIGluZmVycmVkIHBhdGggdG8gdGhlIGJ1aWxkIAorIiAgICAgICBkaXJlY3RvcnksIGV2ZW4gaWYgdGhpcyBvbmUgaXMgbm90IG5hbWVkICdfYnVpbGQnLgogIgotIiBDcmVhdGVkOiAgICAgICAgV2VkLCAwMSBPY3QgMjAwMyAxODoxNjoyMiArMDIwMCB6YWNrCi0iIExhc3RNb2RpZmllZDogICBXZWQsIDI1IEF1ZyAyMDA0IDE4OjI4OjM5ICswMjAwIHphY2sKKyIgQm9udXMgOgorIiAgIC0gbGF0aW4xIGFjY2VudHMgYXJlIGhhbmRsZWQKKyIgICAtIGxpc3RzIGFyZSBoYW5kbGVkLCBldmVuIG9uIG11bHRpcGxlIGxpbmVzLCB5b3UgZG9uJ3QgbmVlZCB0aGUgdmlzdWFsIG1vZGUKKyIgICAgICh0aGUgY3Vyc29yIG11c3QgYmUgb24gdGhlIGZpcnN0IGJyYWNrZXQpCisiICAgLSBwYXJlbnRoZXNpemVkIGV4cHJlc3Npb25zLCBhcnJheXMsIGFuZCBzdHJ1Y3R1cmVzIChpZS4gJyguLi4pJywgJ1t8Li4ufF0nLAorIiAgICAgYW5kICd7Li4ufScpIGFyZSBoYW5kbGVkIHRoZSBzYW1lIHdheQogCi1pZiAhaGFzKCJweXRob24iKQotICBmaW5pc2gKLWVuZGlmCisgICIgQ29waWVkIGZyb20gU3RlZmFubydzIG9yaWdpbmFsIHBsdWdpbiA6CisgICIgPDwKKyAgIiAgICAgIC5hbm5vdCBvY2FtbCBmaWxlIHJlcHJlc2VudGF0aW9uCisgICIKKyAgIiAgICAgIEZpbGUgZm9ybWF0IChjb3BpZWQgdmVyYmF0aW0gZnJvbSBjYW1sLXR5cGVzLmVsKQorICAiCisgICIgICAgICBmaWxlIDo6PSBibG9jayAqCisgICIgICAgICBibG9jayA6Oj0gcG9zaXRpb24gPFNQPiBwb3NpdGlvbiA8TEY+IGFubm90YXRpb24gKgorICAiICAgICAgcG9zaXRpb24gOjo9IGZpbGVuYW1lIDxTUD4gbnVtIDxTUD4gbnVtIDxTUD4gbnVtCisgICIgICAgICBhbm5vdGF0aW9uIDo6PSBrZXl3b3JkIG9wZW4tcGFyZW4gPExGPiA8U1A+IDxTUD4gZGF0YSA8TEY+IGNsb3NlLXBhcmVuCisgICIKKyAgIiAgICAgIDxTUD4gaXMgYSBzcGFjZSBjaGFyYWN0ZXIgKEFTQ0lJIDB4MjApCisgICIgICAgICA8TEY+IGlzIGEgbGluZS1mZWVkIGNoYXJhY3RlciAoQVNDSUkgMHgwQSkKKyAgIiAgICAgIG51bSBpcyBhIHNlcXVlbmNlIG9mIGRlY2ltYWwgZGlnaXRzCisgICIgICAgICBmaWxlbmFtZSBpcyBhIHN0cmluZyB3aXRoIHRoZSBsZXhpY2FsIGNvbnZlbnRpb25zIG9mIE8nQ2FtbAorICAiICAgICAgb3Blbi1wYXJlbiBpcyBhbiBvcGVuIHBhcmVudGhlc2lzIChBU0NJSSAweDI4KQorICAiICAgICAgY2xvc2UtcGFyZW4gaXMgYSBjbG9zZWQgcGFyZW50aGVzaXMgKEFTQ0lJIDB4MjkpCisgICIgICAgICBkYXRhIGlzIGFueSBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzIHdoZXJlIDxMRj4gaXMgYWx3YXlzIGZvbGxvd2VkIGJ5CisgICIgICAgICAgICAgIGF0IGxlYXN0IHR3byBzcGFjZSBjaGFyYWN0ZXJzLgorICAiCisgICIgICAgICAtIGluIGVhY2ggYmxvY2ssIHRoZSB0d28gcG9zaXRpb25zIGFyZSByZXNwZWN0aXZlbHkgdGhlIHN0YXJ0IGFuZCB0aGUKKyAgIiAgICAgICAgZW5kIG9mIHRoZSByYW5nZSBkZXNjcmliZWQgYnkgdGhlIGJsb2NrLgorICAiICAgICAgLSBpbiBhIHBvc2l0aW9uLCB0aGUgZmlsZW5hbWUgaXMgdGhlIG5hbWUgb2YgdGhlIGZpbGUsIHRoZSBmaXJzdCBudW0KKyAgIiAgICAgICAgaXMgdGhlIGxpbmUgbnVtYmVyLCB0aGUgc2Vjb25kIG51bSBpcyB0aGUgb2Zmc2V0IG9mIHRoZSBiZWdpbm5pbmcKKyAgIiAgICAgICAgb2YgdGhlIGxpbmUsIHRoZSB0aGlyZCBudW0gaXMgdGhlIG9mZnNldCBvZiB0aGUgcG9zaXRpb24gaXRzZWxmLgorICAiICAgICAgLSB0aGUgY2hhciBudW1iZXIgd2l0aGluIHRoZSBsaW5lIGlzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHRoaXJkCisgICIgICAgICAgIGFuZCBzZWNvbmQgbnVtcy4KKyAgIgorICAiICAgICAgRm9yIHRoZSBtb21lbnQsIHRoZSBvbmx5IHBvc3NpYmxlIGtleXdvcmQgaXMgXCJ0eXBlXCIuIgorICAiID4+CiAKLXB5dGhvbiA8PCBFT0YKKyIgMS4gRmluZGluZyB0aGUgYW5ub3RhdGlvbiBmaWxlIGV2ZW4gaWYgd2UgdXNlIG9jYW1sYnVpbGQKIAotaW1wb3J0IHJlCi1pbXBvcnQgb3MKLWltcG9ydCBvcy5wYXRoCi1pbXBvcnQgc3RyaW5nCi1pbXBvcnQgdGltZQotaW1wb3J0IHZpbQorICAgICIgSW46ICB0d28gc3RyaW5ncyByZXByZXNlbnRpbmcgcGF0aHMKKyAgICAiIE91dDogb25lIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGNvbW1vbiBwcmVmaXggYmV0d2VlbiB0aGUgdHdvIHBhdGhzCisgIGZ1bmN0aW9uISBzOkZpbmRfY29tbW9uX3BhdGggKHAxLHAyKQorICAgIGxldCB0ZW1wID0gYTpwMgorICAgIHdoaWxlIG1hdGNoc3RyKGE6cDEsdGVtcCkgPT0gJycKKyAgICAgIGxldCB0ZW1wID0gc3Vic3RpdHV0ZSh0ZW1wLCcvW14vXSokJywnJywnJykKKyAgICBlbmR3aGlsZQorICAgIHJldHVybiB0ZW1wCisgIGVuZGZ1bgogCi1kZWJ1ZyA9IEZhbHNlCisgICAgIiBBZnRlciBjYWxsOgorICAgICIgLSBiOmFubm90X2ZpbGVfcGF0aCA6IAorICAgICIgICAgICAgICAgICAgICAgICAgICAgIHBhdGggdG8gdGhlIC5hbm5vdCBmaWxlIGNvcnJlc3BvbmRpbmcgdG8gdGhlCisgICAgIiAgICAgICAgICAgICAgICAgICAgICAgc291cmNlIGZpbGUgKGRlYWxpbmcgd2l0aCBvY2FtbGJ1aWxkIHN0dWZmKQorICAgICIgLSBiOl9idWlsZF9wYXRoOiAKKyAgICAiICAgICAgICAgICAgICAgICAgICAgICBwYXRoIHRvIHRoZSBidWlsZCBkaXJlY3RvcnkgZXZlbiBpZiB0aGlzIG9uZSBpcworICAgICIgICAgICAgICAgICAgICAgICAgICAgIG5vdCBuYW1lZCAnX2J1aWxkJworICAgICIgLSBiOnNvdXJjZV9maWxlX3JlbGF0aXZlX3BhdGggOgorICAgICIgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aXZlIHBhdGggb2YgdGhlIHNvdXJjZSBmaWxlICppbiogdGhlIGJ1aWxkCisgICAgIiAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0b3J5IDsgdGhpcyBpcyBob3cgaXQgaXMgcmVmZmVyZWQgdG8gaW4gdGhlCisgICAgIiAgICAgICAgICAgICAgICAgICAgICAgLmFubm90IGZpbGUKKyAgZnVuY3Rpb24hIHM6TG9jYXRlX2Fubm90YXRpb24oKQorICAgIGlmICFiOmFubm90YXRpb25fZmlsZV9sb2NhdGVkCiAKLWNsYXNzIEFubkV4YyhFeGNlcHRpb24pOgotICAgIGRlZiBfX2luaXRfXyhzZWxmLCByZWFzb24pOgotICAgICAgICBzZWxmLnJlYXNvbiA9IHJlYXNvbgorICAgICAgc2lsZW50IGV4ZSAnY2QnIGV4cGFuZCgnJTpwOmgnKQogCi1ub19hbm5vdGF0aW9ucyA9IEFubkV4YygiTm8gdHlwZSBhbm5vdGF0aW9ucyAoLmFubm90KSBmaWxlIGZvdW5kIikKLWFubm90YXRpb25fbm90X2ZvdW5kID0gQW5uRXhjKCJObyB0eXBlIGFubm90YXRpb24gZm91bmQgZm9yIHRoZSBnaXZlbiB0ZXh0IikKLWRlZiBtYWxmb3JtZWRfYW5ub3RhdGlvbnMobGluZW5vKToKLSAgICByZXR1cm4gQW5uRXhjKCJNYWxmb3JtZWQgLmFubm90IGZpbGUgKGxpbmUgPSAlZCkiICUgbGluZW5vKQorICAgICAgbGV0IGFubm90X2ZpbGVfbmFtZSA9IGV4cGFuZCgnJTpyJykuJy5hbm5vdCcKIAotY2xhc3MgQW5ub3RhdGlvbnM6Ci0gICAgIiIiCi0gICAgICAuYW5ub3Qgb2NhbWwgZmlsZSByZXByZXNlbnRhdGlvbgorICAgICAgIiAxc3QgY2FzZSA6IHRoZSBhbm5vdCBmaWxlIGlzIGluIHRoZSBzYW1lIGRpcmVjdG9yeSBhcyB0aGUgYnVmZmVyIChubyBvY2FtbGJ1aWxkKQorICAgICAgbGV0IGI6YW5ub3RfZmlsZV9wYXRoID0gZmluZGZpbGUoYW5ub3RfZmlsZV9uYW1lLCcuJykKKyAgICAgIGlmIGI6YW5ub3RfZmlsZV9wYXRoICE9ICcnCisgICAgICAgIGxldCBiOmFubm90X2ZpbGVfcGF0aCA9IGdldGN3ZCgpLicvJy5iOmFubm90X2ZpbGVfcGF0aAorICAgICAgICBsZXQgYjpfYnVpbGRfcGF0aCA9ICcnCisgICAgICAgIGxldCBiOnNvdXJjZV9maWxlX3JlbGF0aXZlX3BhdGggPSBleHBhbmQoJyUnKQorICAgICAgZWxzZQorICAgICAgICAiIDJuZCBjYXNlIDogdGhlIGJ1ZmZlciBhbmQgdGhlIF9idWlsZCBkaXJlY3RvcnkgYXJlIGluIHRoZSBzYW1lIGRpcmVjdG9yeQorICAgICAgICAiICAgICAgLi4KKyAgICAgICAgIiAgICAgLyAgXAorICAgICAgICAiICAgIC8gICAgXAorICAgICAgICAiIF9idWlsZCAgLm1sCisgICAgICAgICIKKyAgICAgICAgbGV0IGI6X2J1aWxkX3BhdGggPSBmaW5kZGlyKCdfYnVpbGQnLCcuJykKKyAgICAgICAgaWYgYjpfYnVpbGRfcGF0aCAhPSAnJworICAgICAgICAgIGxldCBiOl9idWlsZF9wYXRoID0gZ2V0Y3dkKCkuJy8nLmI6X2J1aWxkX3BhdGgKKyAgICAgICAgICBsZXQgYjphbm5vdF9maWxlX3BhdGggICAgICAgICAgID0gZmluZGZpbGUoYW5ub3RfZmlsZV9uYW1lLCdfYnVpbGQnKQorICAgICAgICAgIGlmIGI6YW5ub3RfZmlsZV9wYXRoICE9ICcnCisgICAgICAgICAgICBsZXQgYjphbm5vdF9maWxlX3BhdGggPSBnZXRjd2QoKS4nLycuYjphbm5vdF9maWxlX3BhdGgKKyAgICAgICAgICBlbmRpZgorICAgICAgICAgIGxldCBiOnNvdXJjZV9maWxlX3JlbGF0aXZlX3BhdGggPSBleHBhbmQoJyUnKQorICAgICAgICBlbHNlCisgICAgICAgICAgIiAzcmQgY2FzZSA6IHRoZSBfYnVpbGQgZGlyZWN0b3J5IGlzIGluIGEgZGlyZWN0b3J5IGhpZ2hlciBpbiB0aGUgZmlsZSBoaWVyYXJjaHkgCisgICAgICAgICAgIiAgICAgICAgICAgIChpdCBjYW4ndCBiZSBkZWVwZXIgYnkgb2NhbWxidWlsZCByZXF1aXJlbWVudHMpCisgICAgICAgICAgIiAgICAgIC4uCisgICAgICAgICAgIiAgICAgLyAgXAorICAgICAgICAgICIgICAgLyAgICBcCisgICAgICAgICAgIiBfYnVpbGQgIC4uLgorICAgICAgICAgICIgICAgICAgICAgIFwKKyAgICAgICAgICAiICAgICAgICAgICAgXAorICAgICAgICAgICIgICAgICAgICAgIC5tbAorICAgICAgICAgICIKKyAgICAgICAgICBsZXQgYjpfYnVpbGRfcGF0aCA9IGZpbmRkaXIoJ19idWlsZCcsJzsnKQorICAgICAgICAgIGlmIGI6X2J1aWxkX3BhdGggIT0gJycKKyAgICAgICAgICAgIGxldCBwcm9qZWN0X3BhdGggICAgICAgICAgICAgICAgPSBzdWJzdGl0dXRlKGI6X2J1aWxkX3BhdGgsJy9fYnVpbGQkJywnJywnJykKKyAgICAgICAgICAgIGxldCBwYXRoX3JlbGF0aXZlX3RvX3Byb2plY3QgICAgPSBzdWJzdGl0dXRlKGV4cGFuZCgnJTpwOmgnKSxwcm9qZWN0X3BhdGguJy8nLCcnLCcnKQorICAgICAgICAgICAgbGV0IGI6YW5ub3RfZmlsZV9wYXRoICAgICAgICAgICA9IGZpbmRmaWxlKGFubm90X2ZpbGVfbmFtZSxwcm9qZWN0X3BhdGguJy9fYnVpbGQvJy5wYXRoX3JlbGF0aXZlX3RvX3Byb2plY3QpCisgICAgICAgICAgICBsZXQgYjpzb3VyY2VfZmlsZV9yZWxhdGl2ZV9wYXRoID0gc3Vic3RpdHV0ZShleHBhbmQoJyU6cCcpLHByb2plY3RfcGF0aC4nLycsJycsJycpCisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgbGV0IGI6YW5ub3RfZmlsZV9wYXRoID0gZmluZGZpbGUoYW5ub3RfZmlsZV9uYW1lLCcqKicpCisgICAgICAgICAgICAiNHRoIGNhc2UgOiB3aGF0IGlmIHRoZSB1c2VyIGRlY2lkZWQgdG8gY2hhbmdlIHRoZSBuYW1lIG9mIHRoZSBfYnVpbGQgZGlyZWN0b3J5ID8KKyAgICAgICAgICAgICIgICAgICAgICAgIC0+IHdlIHJlbGF4IHRoZSBjb25zdHJhaW50cywgaXQgc2hvdWxkIHdvcmsgaW4gbW9zdCBjYXNlcworICAgICAgICAgICAgaWYgYjphbm5vdF9maWxlX3BhdGggIT0gJycKKyAgICAgICAgICAgICAgIiA0YS4gd2Ugc3VwcG9zZSB0aGUgcmVuYW1lZCBfYnVpbGQgZGlyZWN0b3J5IGlzIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeQorICAgICAgICAgICAgICBsZXQgYjpfYnVpbGRfcGF0aCA9IG1hdGNoc3RyKGI6YW5ub3RfZmlsZV9wYXRoLCdeW14vXSonKQorICAgICAgICAgICAgICBpZiBiOmFubm90X2ZpbGVfcGF0aCAhPSAnJworICAgICAgICAgICAgICAgIGxldCBiOmFubm90X2ZpbGVfcGF0aCA9IGdldGN3ZCgpLicvJy5iOmFubm90X2ZpbGVfcGF0aAorICAgICAgICAgICAgICAgIGxldCBiOl9idWlsZF9wYXRoICAgICA9IGdldGN3ZCgpLicvJy5iOl9idWlsZF9wYXRoCisgICAgICAgICAgICAgIGVuZGlmCisgICAgICAgICAgICAgIGxldCBiOnNvdXJjZV9maWxlX3JlbGF0aXZlX3BhdGggPSBleHBhbmQoJyUnKQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAiIDRiLiBhbmFyY2h5IDogdGhlIHJlbmFtZWQgX2J1aWxkIGRpcmVjdG9yeSBtYXkgYmUgaGlnaGVyIGluIHRoZSBoaWVyYXJjaHkKKyAgICAgICAgICAgICAgIiB0aGlzIHdpbGwgd29yayBpZiB0aGUgZmlsZSBmb3Igd2hpY2ggd2UgYXJlIGxvb2tpbmcgYW5ub3RhdGlvbnMgaGFzIGEgdW5pcXVlIG5hbWUgaW4gdGhlIHdob2xlIHByb2plY3QKKyAgICAgICAgICAgICAgIiBpZiB0aGlzIGlzIG5vdCB0aGUgY2FzZSwgaXQgbWF5IHN0aWxsIHdvcmssIGJ1dCBubyB3YXJyYW50eSBoZXJlCisgICAgICAgICAgICAgIGxldCBiOmFubm90X2ZpbGVfcGF0aCA9IGZpbmRmaWxlKGFubm90X2ZpbGVfbmFtZSwnKio7JykKKyAgICAgICAgICAgICAgbGV0IHByb2plY3RfcGF0aCAgICAgID0gczpGaW5kX2NvbW1vbl9wYXRoKGI6YW5ub3RfZmlsZV9wYXRoLGV4cGFuZCgnJTpwOmgnKSkKKyAgICAgICAgICAgICAgbGV0IGI6X2J1aWxkX3BhdGggICAgICAgPSBtYXRjaHN0cihiOmFubm90X2ZpbGVfcGF0aCxwcm9qZWN0X3BhdGguJy9bXi9dKicpCisgICAgICAgICAgICAgIGxldCBiOnNvdXJjZV9maWxlX3JlbGF0aXZlX3BhdGggPSBzdWJzdGl0dXRlKGV4cGFuZCgnJTpwJykscHJvamVjdF9wYXRoLicvJywnJywnJykKKyAgICAgICAgICAgIGVuZGlmCisgICAgICAgICAgZW5kaWYKKyAgICAgICAgZW5kaWYKKyAgICAgIGVuZGlmCiAKLSAgICAgIEZpbGUgZm9ybWF0IChjb3BpZWQgdmVyYmF0aW0gZnJvbSBjYW1sLXR5cGVzLmVsKQorICAgICAgaWYgYjphbm5vdF9maWxlX3BhdGggPT0gJycKKyAgICAgICAgdGhyb3cgJ0U0ODQ6IG5vIGFubm90YXRpb24gZmlsZSBmb3VuZCcKKyAgICAgIGVuZGlmCiAKLSAgICAgIGZpbGUgOjo9IGJsb2NrICoKLSAgICAgIGJsb2NrIDo6PSBwb3NpdGlvbiA8U1A+IHBvc2l0aW9uIDxMRj4gYW5ub3RhdGlvbiAqCi0gICAgICBwb3NpdGlvbiA6Oj0gZmlsZW5hbWUgPFNQPiBudW0gPFNQPiBudW0gPFNQPiBudW0KLSAgICAgIGFubm90YXRpb24gOjo9IGtleXdvcmQgb3Blbi1wYXJlbiA8TEY+IDxTUD4gPFNQPiBkYXRhIDxMRj4gY2xvc2UtcGFyZW4KKyAgICAgIHNpbGVudCBleGUgJ2NkJyAnLScKIAotICAgICAgPFNQPiBpcyBhIHNwYWNlIGNoYXJhY3RlciAoQVNDSUkgMHgyMCkKLSAgICAgIDxMRj4gaXMgYSBsaW5lLWZlZWQgY2hhcmFjdGVyIChBU0NJSSAweDBBKQotICAgICAgbnVtIGlzIGEgc2VxdWVuY2Ugb2YgZGVjaW1hbCBkaWdpdHMKLSAgICAgIGZpbGVuYW1lIGlzIGEgc3RyaW5nIHdpdGggdGhlIGxleGljYWwgY29udmVudGlvbnMgb2YgTydDYW1sCi0gICAgICBvcGVuLXBhcmVuIGlzIGFuIG9wZW4gcGFyZW50aGVzaXMgKEFTQ0lJIDB4MjgpCi0gICAgICBjbG9zZS1wYXJlbiBpcyBhIGNsb3NlZCBwYXJlbnRoZXNpcyAoQVNDSUkgMHgyOSkKLSAgICAgIGRhdGEgaXMgYW55IHNlcXVlbmNlIG9mIGNoYXJhY3RlcnMgd2hlcmUgPExGPiBpcyBhbHdheXMgZm9sbG93ZWQgYnkKLSAgICAgICAgICAgYXQgbGVhc3QgdHdvIHNwYWNlIGNoYXJhY3RlcnMuCisgICAgICBsZXQgYjphbm5vdGF0aW9uX2ZpbGVfbG9jYXRlZCA9IDEKKyAgICBlbmRpZgorICBlbmRmdW4KIAotICAgICAgLSBpbiBlYWNoIGJsb2NrLCB0aGUgdHdvIHBvc2l0aW9ucyBhcmUgcmVzcGVjdGl2ZWx5IHRoZSBzdGFydCBhbmQgdGhlCi0gICAgICAgIGVuZCBvZiB0aGUgcmFuZ2UgZGVzY3JpYmVkIGJ5IHRoZSBibG9jay4KLSAgICAgIC0gaW4gYSBwb3NpdGlvbiwgdGhlIGZpbGVuYW1lIGlzIHRoZSBuYW1lIG9mIHRoZSBmaWxlLCB0aGUgZmlyc3QgbnVtCi0gICAgICAgIGlzIHRoZSBsaW5lIG51bWJlciwgdGhlIHNlY29uZCBudW0gaXMgdGhlIG9mZnNldCBvZiB0aGUgYmVnaW5uaW5nCi0gICAgICAgIG9mIHRoZSBsaW5lLCB0aGUgdGhpcmQgbnVtIGlzIHRoZSBvZmZzZXQgb2YgdGhlIHBvc2l0aW9uIGl0c2VsZi4KLSAgICAgIC0gdGhlIGNoYXIgbnVtYmVyIHdpdGhpbiB0aGUgbGluZSBpcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSB0aGlyZAotICAgICAgICBhbmQgc2Vjb25kIG51bXMuCisgICIgVGhpcyBpbiBvcmRlciB0byBsb2NhdGUgdGhlIC5hbm5vdCBmaWxlIG9ubHkgb25jZQorICBsZXQgYjphbm5vdGF0aW9uX2ZpbGVfbG9jYXRlZCA9IDAKIAotICAgICAgRm9yIHRoZSBtb21lbnQsIHRoZSBvbmx5IHBvc3NpYmxlIGtleXdvcmQgaXMgXCJ0eXBlXCIuIgotICAgICIiIgorIiAyLiBGaW5kaW5nIHRoZSB0eXBlIGluZm9ybWF0aW9uIGluIHRoZSBhbm5vdGF0aW9uIGZpbGUKKyAgCisgICIgYS4gVGhlIGFubm90YXRpb24gZmlsZSBpcyBvcGVuZWQgaW4gdmltIGFzIGEgYnVmZmVyIHRoYXQKKyAgIiBzaG91bGQgYmUgKGFsbW9zdCkgaW52aXNpYmxlIHRvIHRoZSB1c2VyLgogCi0gICAgZGVmIF9faW5pdF9fKHNlbGYpOgotICAgICAgICBzZWxmLl9fZmlsZW5hbWUgPSBOb25lICAjIGxhc3QgLmFubm90IHBhcnNlZCBmaWxlCi0gICAgICAgIHNlbGYuX19tbF9maWxlbmFtZSA9IE5vbmUgIyBhcyBhYm92ZSBidXQgcy8uYW5ub3QvLm1sLwotICAgICAgICBzZWxmLl9fdGltZXN0YW1wID0gTm9uZSAjIGxhc3QgcGFyc2UgYWN0aW9uIHRpbWVzdGFtcAotICAgICAgICBzZWxmLl9fYW5ub3QgPSB7fQotICAgICAgICBzZWxmLl9fcmUgPSByZS5jb21waWxlKAotICAgICAgICAgICdeIlteIl0qIlxzKyhcZCspXHMrKFxkKylccysoXGQrKVxzKyJbXiJdKiJccysoXGQrKVxzKyhcZCspXHMrKFxkKykkJykKKyAgICAgICIgQWZ0ZXIgY2FsbDoKKyAgICAgICIgVGhlIGN1cnJlbnQgYnVmZmVyIGlzIG5vdyB0aGUgb25lIGNvbnRhaW5pbmcgdGhlIC5hbm5vdCBmaWxlLgorICAgICAgIiBXZSBtYW5hZ2UgdG8ga2VlcCBhbGwgdGhpcyBoaWRkZW4gdG8gdGhlIHVzZXIncyBleWUuCisgICAgZnVuY3Rpb24hIHM6RW50ZXJfYW5ub3RhdGlvbl9idWZmZXIoKQorICAgICAgbGV0IHM6Y3VycmVudF9wb3MgPSBnZXRwb3MoJy4nKQorICAgICAgbGV0IHM6Y3VycmVudF9oaWRkZW4gPSAmbDpoaWRkZW4KKyAgICAgIHNldCBoaWRkZW4KKyAgICAgIGxldCBzOmN1cnJlbnRfYnVmID0gYnVmbmFtZSgnJScpCisgICAgICBpZiBidWZsb2FkZWQoYjphbm5vdF9maWxlX3BhdGgpCisgICAgICAgIHNpbGVudCBleGUgJ2tlZXBqIGtlZXBhbHQnICdidWZmZXInIGI6YW5ub3RfZmlsZV9wYXRoCisgICAgICBlbHNlCisgICAgICAgIHNpbGVudCBleGUgJ2tlZXBqIGtlZXBhbHQnICd2aWV3JyBiOmFubm90X2ZpbGVfcGF0aAorICAgICAgZW5kaWYKKyAgICBlbmRmdW4KIAotICAgIGRlZiBfX3BhcnNlKHNlbGYsIGZuYW1lKToKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgZiA9IG9wZW4oZm5hbWUpCi0gICAgICAgICAgICBsaW5lID0gZi5yZWFkbGluZSgpICMgcG9zaXRpb24gbGluZQotICAgICAgICAgICAgbGluZW5vID0gMQotICAgICAgICAgICAgd2hpbGUgKGxpbmUgIT0gIiIpOgotICAgICAgICAgICAgICAgIG0gPSBzZWxmLl9fcmUuc2VhcmNoKGxpbmUpCi0gICAgICAgICAgICAgICAgaWYgKG5vdCBtKToKLSAgICAgICAgICAgICAgICAgICAgcmFpc2UgbWFsZm9ybWVkX2Fubm90YXRpb25zKGxpbmVubykKLSAgICAgICAgICAgICAgICBsaW5lMSA9IGludChtLmdyb3VwKDEpKQotICAgICAgICAgICAgICAgIGNvbDEgPSBpbnQobS5ncm91cCgzKSkgLSBpbnQobS5ncm91cCgyKSkKLSAgICAgICAgICAgICAgICBsaW5lMiA9IGludChtLmdyb3VwKDQpKQotICAgICAgICAgICAgICAgIGNvbDIgPSBpbnQobS5ncm91cCg2KSkgLSBpbnQobS5ncm91cCg1KSkKLSAgICAgICAgICAgICAgICBsaW5lID0gZi5yZWFkbGluZSgpICMgInR5cGUoIiBzdHJpbmcKLSAgICAgICAgICAgICAgICBsaW5lbm8gKz0gMQotICAgICAgICAgICAgICAgIGlmIChsaW5lID09ICIiKTogcmFpc2UgbWFsZm9ybWVkX2Fubm90YXRpb25zKGxpbmVubykKLSAgICAgICAgICAgICAgICB0eXBlID0gW10KLSAgICAgICAgICAgICAgICBsaW5lID0gZi5yZWFkbGluZSgpICMgdHlwZSBkZXNjcmlwdGlvbgotICAgICAgICAgICAgICAgIGxpbmVubyArPSAxCi0gICAgICAgICAgICAgICAgaWYgKGxpbmUgPT0gIiIpOiByYWlzZSBtYWxmb3JtZWRfYW5ub3RhdGlvbnMobGluZW5vKQotICAgICAgICAgICAgICAgIHdoaWxlIGxpbmUgIT0gIilcbiI6Ci0gICAgICAgICAgICAgICAgICAgIHR5cGUuYXBwZW5kKHN0cmluZy5zdHJpcChsaW5lKSkKLSAgICAgICAgICAgICAgICAgICAgbGluZSA9IGYucmVhZGxpbmUoKQotICAgICAgICAgICAgICAgICAgICBsaW5lbm8gKz0gMQotICAgICAgICAgICAgICAgICAgICBpZiAobGluZSA9PSAiIik6IHJhaXNlIG1hbGZvcm1lZF9hbm5vdGF0aW9ucyhsaW5lbm8pCi0gICAgICAgICAgICAgICAgdHlwZSA9IHN0cmluZy5qb2luKHR5cGUsICJcbiIpCi0gICAgICAgICAgICAgICAga2V5ID0gKChsaW5lMSwgY29sMSksIChsaW5lMiwgY29sMikpCi0gICAgICAgICAgICAgICAgaWYgbm90IHNlbGYuX19hbm5vdC5oYXNfa2V5KGtleSk6Ci0gICAgICAgICAgICAgICAgICAgIHNlbGYuX19hbm5vdFtrZXldID0gdHlwZQotICAgICAgICAgICAgICAgIGxpbmUgPSBmLnJlYWRsaW5lKCkgIyBwb3NpdGlvbiBsaW5lCi0gICAgICAgICAgICBmLmNsb3NlKCkKLSAgICAgICAgICAgIHNlbGYuX19maWxlbmFtZSA9IGZuYW1lCi0gICAgICAgICAgICBzZWxmLl9fbWxfZmlsZW5hbWUgPSB2aW0uY3VycmVudC5idWZmZXIubmFtZQotICAgICAgICAgICAgc2VsZi5fX3RpbWVzdGFtcCA9IGludCh0aW1lLnRpbWUoKSkKLSAgICAgICAgZXhjZXB0IElPRXJyb3I6Ci0gICAgICAgICAgICByYWlzZSBub19hbm5vdGF0aW9ucworICAgICAgIiBBZnRlciBjYWxsOgorICAgICAgIiAgIFRoZSBvcmlnaW5hbCBidWZmZXIgaGFzIGJlZW4gcmVzdG9yZWQgaW4gdGhlIGV4YWN0IHNhbWUgc3RhdGUgYXMgYmVmb3JlLgorICAgIGZ1bmN0aW9uISBzOkV4aXRfYW5ub3RhdGlvbl9idWZmZXIoKQorICAgICAgc2lsZW50IGV4ZSAna2VlcGoga2VlcGFsdCcgJ2J1ZmZlcicgczpjdXJyZW50X2J1ZgorICAgICAgbGV0ICZsOmhpZGRlbiA9IHM6Y3VycmVudF9oaWRkZW4KKyAgICAgIGNhbGwgc2V0cG9zKCcuJyxzOmN1cnJlbnRfcG9zKQorICAgIGVuZGZ1bgogCi0gICAgZGVmIHBhcnNlKHNlbGYpOgotICAgICAgICBhbm5vdF9maWxlID0gb3MucGF0aC5zcGxpdGV4dCh2aW0uY3VycmVudC5idWZmZXIubmFtZSlbMF0gKyAiLmFubm90IgotICAgICAgICBzZWxmLl9fcGFyc2UoYW5ub3RfZmlsZSkKKyAgICAgICIgQWZ0ZXIgY2FsbDoKKyAgICAgICIgICBUaGUgYW5ub3QgZmlsZSBpcyBsb2FkZWQgYW5kIGFzc2lnbmVkIHRvIGEgYnVmZmVyLgorICAgICAgIiAgIFRoaXMgYWxzbyBoYW5kbGVzIHRoZSBtb2RpZmljYXRpb24gZGF0ZSBvZiB0aGUgLmFubm90IGZpbGUsIGVnLiBhZnRlciBhIAorICAgICAgIiAgIGNvbXBpbGF0aW9uLgorICAgIGZ1bmN0aW9uISBzOkxvYWRfYW5ub3RhdGlvbigpCisgICAgICBpZiBidWZsb2FkZWQoYjphbm5vdF9maWxlX3BhdGgpICYmIGI6YW5ub3RfZmlsZV9sYXN0X21vZCA8IGdldGZ0aW1lKGI6YW5ub3RfZmlsZV9wYXRoKQorICAgICAgICBjYWxsIHM6RW50ZXJfYW5ub3RhdGlvbl9idWZmZXIoKQorICAgICAgICBzaWxlbnQgZXhlICJidW5sb2FkIgorICAgICAgICBjYWxsIHM6RXhpdF9hbm5vdGF0aW9uX2J1ZmZlcigpCisgICAgICBlbmRpZgorICAgICAgaWYgIWJ1ZmxvYWRlZChiOmFubm90X2ZpbGVfcGF0aCkKKyAgICAgICAgY2FsbCBzOkVudGVyX2Fubm90YXRpb25fYnVmZmVyKCkKKyAgICAgICAgc2V0bG9jYWwgbm9idWZsaXN0ZWQKKyAgICAgICAgc2V0bG9jYWwgYnVmaGlkZGVuPWhpZGUKKyAgICAgICAgc2V0bG9jYWwgbm9zd2FwZmlsZQorICAgICAgICBzZXRsb2NhbCBidWZ0eXBlPW5vd3JpdGUKKyAgICAgICAgY2FsbCBzOkV4aXRfYW5ub3RhdGlvbl9idWZmZXIoKQorICAgICAgICBsZXQgYjphbm5vdF9maWxlX2xhc3RfbW9kID0gZ2V0ZnRpbWUoYjphbm5vdF9maWxlX3BhdGgpCisgICAgICBlbmRpZgorICAgIGVuZGZ1bgorICAKKyAgImIuICdzZWFyY2gnIGFuZCAnbWF0Y2gnIHdvcmsgdG8gZmluZCB0aGUgdHlwZSBpbmZvcm1hdGlvbgorICAgCisgICAgICAiSW46ICAtIGxpbjEsY29sMTogcG9zdGlvbiBvZiBleHByZXNzaW9uIGZpcnN0IGNoYXIKKyAgICAgICIgICAgIC0gbGluMixjb2wyOiBwb3N0aW9uIG9mIGV4cHJlc3Npb24gbGFzdCBjaGFyCisgICAgICAiT3V0OiAtIHRoZSBwYXR0ZXJuIHRvIGJlIGxvb2tlZCBmb3IgdG8gZmluZCB0aGUgYmxvY2sKKyAgICAgICIgTXVzdCBiZSBjYWxsZWQgaW4gdGhlIHNvdXJjZSBidWZmZXIgKHVzZSBvZiBsaW5lMmJ5dGUpCisgICAgZnVuY3Rpb24hIHM6QmxvY2tfcGF0dGVybihsaW4xLGxpbjIsY29sMSxjb2wyKQorICAgICAgbGV0IHN0YXJ0X251bTEgPSBhOmxpbjEKKyAgICAgIGxldCBzdGFydF9udW0yID0gbGluZTJieXRlKGE6bGluMSkgLSAxCisgICAgICBsZXQgc3RhcnRfbnVtMyA9IHN0YXJ0X251bTIgKyBhOmNvbDEKKyAgICAgIGxldCBzdGFydF9wb3MgID0gJyInLmI6c291cmNlX2ZpbGVfcmVsYXRpdmVfcGF0aC4nIiAnLnN0YXJ0X251bTEuJyAnLnN0YXJ0X251bTIuJyAnLnN0YXJ0X251bTMKKyAgICAgIGxldCBlbmRfbnVtMSAgID0gYTpsaW4yCisgICAgICBsZXQgZW5kX251bTIgICA9IGxpbmUyYnl0ZShhOmxpbjIpIC0gMQorICAgICAgbGV0IGVuZF9udW0zICAgPSBlbmRfbnVtMiArIGE6Y29sMgorICAgICAgbGV0IGVuZF9wb3MgICAgPSAnIicuYjpzb3VyY2VfZmlsZV9yZWxhdGl2ZV9wYXRoLiciICcuZW5kX251bTEuJyAnLmVuZF9udW0yLicgJy5lbmRfbnVtMworICAgICAgcmV0dXJuICdeJy5zdGFydF9wb3MuJyAnLmVuZF9wb3MuIiQiCisgICAgICAiIHJxOiB0aGUgJ14nIGhlcmUgaXMgbm90IHRvdGFsbHkgY29ycmVjdCByZWdhcmRpbmcgdGhlIGFubm90IGZpbGUgImdyYW1tYXIiCisgICAgICAiIGJ1dCBjdXJyZW50bHkgdGhlIGFubm90YXRpb24gZmlsZSByZXNwZWN0cyB0aGlzLCBhbmQgaXQncyBhIGxpdHRsZSBiaXQgZmFzdGVyIHdpdGggdGhlICdeJzsKKyAgICAgICIgY2FuIGJlIHJlbW92ZWQgc2FmZWx5LgorICAgIGVuZGZ1bgogCi0gICAgZGVmIGdldF90eXBlKHNlbGYsIChsaW5lMSwgY29sMSksIChsaW5lMiwgY29sMikpOgotICAgICAgICBpZiBkZWJ1ZzoKLSAgICAgICAgICAgIHByaW50IGxpbmUxLCBjb2wxLCBsaW5lMiwgY29sMgotICAgICAgICBpZiB2aW0uY3VycmVudC5idWZmZXIubmFtZSA9PSBOb25lOgotICAgICAgICAgICAgcmFpc2Ugbm9fYW5ub3RhdGlvbnMKLSAgICAgICAgaWYgdmltLmN1cnJlbnQuYnVmZmVyLm5hbWUgIT0gc2VsZi5fX21sX2ZpbGVuYW1lIG9yICBcCi0gICAgICAgICAgb3Muc3RhdChzZWxmLl9fZmlsZW5hbWUpLnN0X210aW1lID4gc2VsZi5fX3RpbWVzdGFtcDoKLSAgICAgICAgICAgIHNlbGYucGFyc2UoKQotICAgICAgICB0cnk6Ci0gICAgICAgICAgICByZXR1cm4gc2VsZi5fX2Fubm90WyhsaW5lMSwgY29sMSksIChsaW5lMiwgY29sMildCi0gICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKLSAgICAgICAgICAgIHJhaXNlIGFubm90YXRpb25fbm90X2ZvdW5kCisgICAgICAiSW46ICh0aGUgY3Vyc29yIHBvc2l0aW9uIHNob3VsZCBiZSBhdCB0aGUgc3RhcnQgb2YgYW4gYW5ub3RhdGlvbikKKyAgICAgICJPdXQ6IHRoZSB0eXBlIGluZm9ybWF0aW9uCisgICAgICAiIE11c3QgYmUgY2FsbGVkIGluIHRoZSBhbm5vdGF0aW9uIGJ1ZmZlciAodXNlIG9mIHNlYXJjaCkKKyAgICBmdW5jdGlvbiEgczpNYXRjaF9kYXRhKCkKKyAgICAgICIgcnE6IGlkZW0gYXMgcHJldmlvdXNseSwgaW4gdGhlIGZvbGxvd2luZywgdGhlICdeJyBhdCBzdGFydCBvZiBwYXR0ZXJucyBpcyBub3QgbmVjZXNzYXJ5CisgICAgICBrZWVwaiB3aGlsZSBzZWFyY2goJ150eXBlKCQnLCdjZScsbGluZSgiLiIpKSA9PSAwCisgICAgICAgIGtlZXBqIGlmIHNlYXJjaCgnXi5cey19KCQnLCdlJykgPT0gMAorICAgICAgICAgIHRocm93ICJub19hbm5vdGF0aW9uIgorICAgICAgICBlbmRpZgorICAgICAgICBrZWVwaiBpZiBzZWFyY2hwYWlyKCcoJywnJywnKScpID09IDAKKyAgICAgICAgICB0aHJvdyAibWFsZm9ybWVkX2Fubm90X2ZpbGUiCisgICAgICAgIGVuZGlmCisgICAgICBlbmR3aGlsZQorICAgICAgbGV0IGJlZ2luID0gbGluZSgiLiIpICsgMQorICAgICAga2VlcGogaWYgc2VhcmNocGFpcignKCcsJycsJyknKSA9PSAwCisgICAgICAgIHRocm93ICJtYWxmb3JtZWRfYW5ub3RfZmlsZSIKKyAgICAgIGVuZGlmCisgICAgICBsZXQgZW5kID0gbGluZSgiLiIpIC0gMQorICAgICAgcmV0dXJuIGpvaW4oZ2V0bGluZShiZWdpbixlbmQpLCJcbiIpCisgICAgZW5kZnVuCisgICAgICAgIAorICAgICAgIkluOiAgdGhlIHBhdHRlcm4gdG8gbG9vayBmb3IgaW4gb3JkZXIgdG8gbWF0Y2ggdGhlIGJsb2NrCisgICAgICAiT3V0OiB0aGUgdHlwZSBpbmZvcm1hdGlvbiAoY2FsbHMgczpNYXRjaF9kYXRhKQorICAgICAgIiBTaG91bGQgYmUgY2FsbGVkIGluIHRoZSBhbm5vdGF0aW9uIGJ1ZmZlcgorICAgIGZ1bmN0aW9uISBzOkV4dHJhY3RfdHlwZV9kYXRhKGJsb2NrX3BhdHRlcm4pCisgICAgICBjYWxsIHM6RW50ZXJfYW5ub3RhdGlvbl9idWZmZXIoKQorICAgICAgdHJ5CisgICAgICAgIGlmIHNlYXJjaChhOmJsb2NrX3BhdHRlcm4sJ2UnKSA9PSAwCisgICAgICAgICAgdGhyb3cgIm5vX2Fubm90YXRpb24iCisgICAgICAgIGVuZGlmCisgICAgICAgIGNhbGwgY3Vyc29yKGxpbmUoIi4iKSArIDEsMSkKKyAgICAgICAgbGV0IGFubm90YXRpb24gPSBzOk1hdGNoX2RhdGEoKQorICAgICAgZmluYWxseQorICAgICAgICBjYWxsIHM6RXhpdF9hbm5vdGF0aW9uX2J1ZmZlcigpCisgICAgICBlbmR0cnkKKyAgICAgIHJldHVybiBhbm5vdGF0aW9uCisgICAgZW5kZnVuCisgIAorICAiYy4gbGluayB0aGlzIHN0dWZmIHdpdGggd2hhdCB0aGUgdXNlciB3YW50cworICAiIGllLiBnZXQgdGhlIGV4cHJlc3Npb24gc2VsZWN0ZWQvdW5kZXIgdGhlIGN1cnNvcgorICAgIAorICAgIGxldCBzOm9jYW1sX3dvcmRfY2hhciA9ICdcd3xbwC3/XXwnJycKIAotd29yZF9jaGFyX1JFID0gcmUuY29tcGlsZSgiXltcdy5dJCIpCisgICAgICAiSW46ICB0aGUgY3VycmVudCBtb2RlIChlZy4gInZpc3VhbCIsICJub3JtYWwiLCBldGMuKQorICAgICAgIk91dDogdGhlIGJvcmRlcnMgb2YgdGhlIGV4cHJlc3Npb24gd2UgYXJlIGxvb2tpbmcgZm9yIHRoZSB0eXBlCisgICAgZnVuY3Rpb24hIHM6TWF0Y2hfYm9yZGVycyhtb2RlKQorICAgICAgaWYgYTptb2RlID09ICJ2aXN1YWwiCisgICAgICAgIGxldCBjdXIgPSBnZXRwb3MoIi4iKQorICAgICAgICBub3JtYWwgYDwKKyAgICAgICAgbGV0IGNvbDEgPSBjb2woIi4iKQorICAgICAgICBsZXQgbGluMSA9IGxpbmUoIi4iKQorICAgICAgICBub3JtYWwgYD4KKyAgICAgICAgbGV0IGNvbDIgPSBjb2woIi4iKQorICAgICAgICBsZXQgbGluMiA9IGxpbmUoIi4iKQorICAgICAgICBjYWxsIGN1cnNvcihjdXJbMV0sY3VyWzJdKQorICAgICAgICByZXR1cm4gW2xpbjEsbGluMixjb2wxLTEsY29sMl0KKyAgICAgIGVsc2UKKyAgICAgICAgbGV0IGN1cnNvcl9saW5lID0gbGluZSgiLiIpCisgICAgICAgIGxldCBjdXJzb3JfY29sICA9IGNvbCgiLiIpCisgICAgICAgIGxldCBsaW5lID0gZ2V0bGluZSgnLicpCisgICAgICAgIGlmIGxpbmVbY3Vyc29yX2NvbC0xOmN1cnNvcl9jb2xdID09ICdbfCcKKyAgICAgICAgICBsZXQgW2xpbjIsY29sMl0gPSBzZWFyY2hwYWlycG9zKCdcW3wnLCcnLCd8XF0nLCduJykKKyAgICAgICAgICByZXR1cm4gW2N1cnNvcl9saW5lLGxpbjIsY3Vyc29yX2NvbC0xLGNvbDIrMV0KKyAgICAgICAgZWxzZWlmICAgICBsaW5lW2N1cnNvcl9jb2wtMV0gPT0gJ1snCisgICAgICAgICAgbGV0IFtsaW4yLGNvbDJdID0gc2VhcmNocGFpcnBvcygnXFsnLCcnLCdcXScsJ24nKQorICAgICAgICAgIHJldHVybiBbY3Vyc29yX2xpbmUsbGluMixjdXJzb3JfY29sLTEsY29sMl0KKyAgICAgICAgZWxzZWlmIGxpbmVbY3Vyc29yX2NvbC0xXSA9PSAnKCcKKyAgICAgICAgICBsZXQgW2xpbjIsY29sMl0gPSBzZWFyY2hwYWlycG9zKCcoJywnJywnKScsJ24nKQorICAgICAgICAgIHJldHVybiBbY3Vyc29yX2xpbmUsbGluMixjdXJzb3JfY29sLTEsY29sMl0KKyAgICAgICAgZWxzZWlmIGxpbmVbY3Vyc29yX2NvbC0xXSA9PSAneycKKyAgICAgICAgICBsZXQgW2xpbjIsY29sMl0gPSBzZWFyY2hwYWlycG9zKCd7JywnJywnfScsJ24nKQorICAgICAgICAgIHJldHVybiBbY3Vyc29yX2xpbmUsbGluMixjdXJzb3JfY29sLTEsY29sMl0KKyAgICAgICAgZWxzZQorICAgICAgICAgIGxldCBbbGluMSxjb2wxXSA9IHNlYXJjaHBvcygnXHYlKCcuczpvY2FtbF93b3JkX2NoYXIuJ3xcLikqJywnbmNiJykKKyAgICAgICAgICBsZXQgW2xpbjIsY29sMl0gPSBzZWFyY2hwb3MoJ1x2JSgnLnM6b2NhbWxfd29yZF9jaGFyLid8XC4pKicsJ25jZScpCisgICAgICAgICAgaWYgY29sMSA9PSAwIHx8IGNvbDIgPT0gMAorICAgICAgICAgICAgdGhyb3cgIm5vX2V4cHJlc3Npb24iCisgICAgICAgICAgZW5kaWYKKyAgICAgICAgICByZXR1cm4gW2N1cnNvcl9saW5lLGN1cnNvcl9saW5lLGNvbDEtMSxjb2wyXQorICAgICAgICBlbmRpZgorICAgICAgZW5kaWYKKyAgICBlbmRmdW4KIAotICAjIFRPRE8gdGhpcyBmdW5jdGlvbiBzaG91bGQgcmVjb2duaXplIG9jYW1sIGxpdGVyYWxzLCBhY3R1YWxseSBpdCdzIGp1c3QgYW4KLSAgIyBoYWNrIHRoYXQgcmVjb2duaXplIGNvbnRpbnVvdXMgc2VxdWVuY2VzIG9mIHdvcmRfY2hhcl9SRSBhYm92ZQotZGVmIGZpbmRCb3VuZGFyaWVzKGxpbmUsIGNvbCk6Ci0gICAgIiIiIGdpdmVuIGEgY3Vyc29yIHBvc2l0aW9uIChhcyByZXR1cm5lZCBieSB2aW0uY3VycmVudC53aW5kb3cuY3Vyc29yKQotICAgIHJldHVybiB0d28gaW50ZWdlcnMgaWRlbnRpZnkgdGhlIGJlZ2dpbmluZyBhbmQgZW5kIGNvbHVtbiBvZiB0aGUgd29yZCBhdAotICAgIGN1cnNvciBwb3NpdGlvbiwgaWYgYW55LiBJZiBubyB3b3JkIGlzIGF0IHRoZSBjdXJzb3IgcG9zaXRpb24gcmV0dXJuIHRoZQotICAgIGNvbHVtbiBjdXJzb3IgcG9zaXRpb24gdHdpY2UgIiIiCi0gICAgbGVmdCwgcmlnaHQgPSBjb2wsIGNvbAotICAgIGxpbmUgPSBsaW5lIC0gMSAjIG1pc21hdGNoIHZpbS9weXRob24gbGluZSBpbmRleGVzCi0gICAgKGJlZ2luX2NvbCwgZW5kX2NvbCkgPSAoMCwgbGVuKHZpbS5jdXJyZW50LmJ1ZmZlcltsaW5lXSkgLSAxKQotICAgIHRyeToKLSAgICAgICAgd2hpbGUgd29yZF9jaGFyX1JFLnNlYXJjaCh2aW0uY3VycmVudC5idWZmZXJbbGluZV1bbGVmdCAtIDFdKToKLSAgICAgICAgICAgIGxlZnQgPSBsZWZ0IC0gMQotICAgIGV4Y2VwdCBJbmRleEVycm9yOgotICAgICAgICBwYXNzCi0gICAgdHJ5OgotICAgICAgICB3aGlsZSB3b3JkX2NoYXJfUkUuc2VhcmNoKHZpbS5jdXJyZW50LmJ1ZmZlcltsaW5lXVtyaWdodCArIDFdKToKLSAgICAgICAgICAgIHJpZ2h0ID0gcmlnaHQgKyAxCi0gICAgZXhjZXB0IEluZGV4RXJyb3I6Ci0gICAgICAgIHBhc3MKLSAgICByZXR1cm4gKGxlZnQsIHJpZ2h0KQorICAgICAgIkluOiAgdGhlIGN1cnJlbnQgbW9kZSAoZWcuICJ2aXN1YWwiLCAibm9ybWFsIiwgZXRjLikKKyAgICAgICJPdXQ6IHRoZSB0eXBlIGluZm9ybWF0aW9uIChjYWxscyBzOkV4dHJhY3RfdHlwZV9kYXRhKQorICAgIGZ1bmN0aW9uISBzOkdldF90eXBlKG1vZGUpCisgICAgICBsZXQgW2xpbjEsbGluMixjb2wxLGNvbDJdID0gczpNYXRjaF9ib3JkZXJzKGE6bW9kZSkKKyAgICAgIHJldHVybiBzOkV4dHJhY3RfdHlwZV9kYXRhKHM6QmxvY2tfcGF0dGVybihsaW4xLGxpbjIsY29sMSxjb2wyKSkKKyAgICBlbmRmdW4KKyAgCisgICJkLiBtYWluCisgICAgICAiSW46ICAgICAgICAgdGhlIGN1cnJlbnQgbW9kZSAoZWcuICJ2aXN1YWwiLCAibm9ybWFsIiwgZXRjLikKKyAgICAgICJBZnRlciBjYWxsOiB0aGUgdHlwZSBpbmZvcm1hdGlvbiBpcyBkaXNwbGF5ZWQKKyAgICBpZiAhZXhpc3RzKCIqT2NhbWxfZ2V0X3R5cGUiKQorICAgICAgZnVuY3Rpb24gT2NhbWxfZ2V0X3R5cGUobW9kZSkKKyAgICAgICAgY2FsbCBzOkxvY2F0ZV9hbm5vdGF0aW9uKCkKKyAgICAgICAgY2FsbCBzOkxvYWRfYW5ub3RhdGlvbigpCisgICAgICAgIHJldHVybiBzOkdldF90eXBlKGE6bW9kZSkKKyAgICAgIGVuZGZ1bgorICAgIGVuZGlmCiAKLWFubm90ID0gQW5ub3RhdGlvbnMoKSAjIGdsb2JhbCBhbm5vdGF0aW9uIG9iamVjdAorICAgIGlmICFleGlzdHMoIipPY2FtbF9nZXRfdHlwZV9vcl9ub3QiKQorICAgICAgZnVuY3Rpb24gT2NhbWxfZ2V0X3R5cGVfb3Jfbm90KG1vZGUpCisgICAgICAgIGxldCB0PXJlbHRpbWUoKQorICAgICAgICB0cnkKKyAgICAgICAgICByZXR1cm4gT2NhbWxfZ2V0X3R5cGUoYTptb2RlKQorICAgICAgICBjYXRjaAorICAgICAgICAgIHJldHVybiAiIgorICAgICAgICBlbmR0cnkKKyAgICAgIGVuZGZ1bgorICAgIGVuZGlmCiAKLWRlZiBwcmludE9DYW1sVHlwZShtb2RlKToKLSAgICB0cnk6Ci0gICAgICAgIGlmIG1vZGUgPT0gInZpc3VhbCI6ICAjIHZpc3VhbCBtb2RlOiBsb29rdXAgaGlnaGxpZ2h0ZWQgdGV4dAotICAgICAgICAgICAgKGxpbmUxLCBjb2wxKSA9IHZpbS5jdXJyZW50LmJ1ZmZlci5tYXJrKCI8IikKLSAgICAgICAgICAgIChsaW5lMiwgY29sMikgPSB2aW0uY3VycmVudC5idWZmZXIubWFyaygiPiIpCi0gICAgICAgIGVsc2U6ICMgYW55IG90aGVyIG1vZGU6IGxvb2t1cCB3b3JkIGF0IGN1cnNvciBwb3NpdGlvbgotICAgICAgICAgICAgKGxpbmUsIGNvbCkgPSB2aW0uY3VycmVudC53aW5kb3cuY3Vyc29yCi0gICAgICAgICAgICAoY29sMSwgY29sMikgPSBmaW5kQm91bmRhcmllcyhsaW5lLCBjb2wpCi0gICAgICAgICAgICAobGluZTEsIGxpbmUyKSA9IChsaW5lLCBsaW5lKQotICAgICAgICBiZWdpbl9tYXJrID0gKGxpbmUxLCBjb2wxKQotICAgICAgICBlbmRfbWFyayA9IChsaW5lMiwgY29sMiArIDEpCi0gICAgICAgIHByaW50IGFubm90LmdldF90eXBlKGJlZ2luX21hcmssIGVuZF9tYXJrKQotICAgIGV4Y2VwdCBBbm5FeGMsIGV4YzoKLSAgICAgICAgcHJpbnQgZXhjLnJlYXNvbgorICAgIGlmICFleGlzdHMoIipPY2FtbF9wcmludF90eXBlIikKKyAgICAgIGZ1bmN0aW9uIE9jYW1sX3ByaW50X3R5cGUobW9kZSkKKyAgICAgICAgaWYgZXhwYW5kKCIlOmUiKSA9PSAibWxpIgorICAgICAgICAgIGVjaG9obCBFcnJvck1zZyB8IGVjaG8gIk5vIGFubm90YXRpb25zIGZvciBpbnRlcmZhY2UgKC5tbGkpIGZpbGVzIiB8IGVjaG9obCBOb25lCisgICAgICAgICAgcmV0dXJuCisgICAgICAgIGVuZGlmCisgICAgICAgIHRyeQorICAgICAgICAgIGVjaG8gT2NhbWxfZ2V0X3R5cGUoYTptb2RlKQorICAgICAgICBjYXRjaCAvRTQ4NDovCisgICAgICAgICAgZWNob2hsIEVycm9yTXNnIHwgZWNobyAiTm8gdHlwZSBhbm5vdGF0aW9ucyAoLmFubm90KSBmaWxlIGZvdW5kIiB8IGVjaG9obCBOb25lCisgICAgICAgIGNhdGNoIC9ub19leHByZXNzaW9uLworICAgICAgICAgIGVjaG9obCBFcnJvck1zZyB8IGVjaG8gIk5vIGV4cHJlc3Npb24gZm91bmQgdW5kZXIgdGhlIGN1cnNvciIgfCBlY2hvaGwgTm9uZQorICAgICAgICBjYXRjaCAvbm9fYW5ub3RhdGlvbi8KKyAgICAgICAgICBlY2hvaGwgRXJyb3JNc2cgfCBlY2hvICJObyB0eXBlIGFubm90YXRpb24gZm91bmQgZm9yIHRoZSBnaXZlbiB0ZXh0IiB8IGVjaG9obCBOb25lCisgICAgICAgIGNhdGNoIC9tYWxmb3JtZWRfYW5ub3RfZmlsZS8KKyAgICAgICAgICBlY2hvaGwgRXJyb3JNc2cgfCBlY2hvICJNYWxmb3JtZWQgLmFubm90IGZpbGUiIHwgZWNob2hsIE5vbmUKKyAgICAgICAgZW5kdHJ5CisgICAgICBlbmRmdW4KKyAgICBlbmRpZgogCi1kZWYgcGFyc2VPQ2FtbEFubm90KCk6Ci0gICAgdHJ5OgotICAgICAgICBhbm5vdC5wYXJzZSgpCi0gICAgZXhjZXB0IEFubkV4YywgZXhjOgotICAgICAgICBwcmludCBleGMucmVhc29uCi0KLUVPRgotCi1mdW4hIE9DYW1sUHJpbnRUeXBlKGN1cnJlbnRfbW9kZSkKLSAgaWYgKGE6Y3VycmVudF9tb2RlID09ICJ2aXN1YWwiKQotICAgIHB5dGhvbiBwcmludE9DYW1sVHlwZSgidmlzdWFsIikKLSAgZWxzZQotICAgIHB5dGhvbiBwcmludE9DYW1sVHlwZSgibm9ybWFsIikKLSAgZW5kaWYKLWVuZGZ1bgotCi1mdW4hIE9DYW1sUGFyc2VBbm5vdCgpCi0gIHB5dGhvbiBwYXJzZU9DYW1sQW5ub3QoKQotZW5kZnVuCi0KLW1hcCA8TG9jYWxMZWFkZXI+dCA6Y2FsbCBPQ2FtbFByaW50VHlwZSgibm9ybWFsIik8UkVUVVJOPgotdm1hcCA8TG9jYWxMZWFkZXI+dCA6Y2FsbCBPQ2FtbFByaW50VHlwZSgidmlzdWFsIik8UkVUVVJOPgorIiBNYXBzCisgIG1hcCAgPHNpbGVudD4gPExvY2FsTGVhZGVyPnQgOmNhbGwgT2NhbWxfcHJpbnRfdHlwZSgibm9ybWFsIik8Q1I+CisgIHZtYXAgPHNpbGVudD4gPExvY2FsTGVhZGVyPnQgOjxDLVU+Y2FsbCBPY2FtbF9wcmludF90eXBlKCJ2aXN1YWwiKTxDUj5gPAogCiBsZXQgJmNwb3B0aW9ucz1zOmNwb3NldAogdW5sZXQgczpjcG9zZXQKIAotIiB2aW06c3c9MgorIiB2aW06c3c9MiBmZG09aW5kZW50Cg==