IyAtKi0gY29kaW5nOiBpc28tODg1OS0xIC0qLQoiIiJBIGxleGljYWwgYW5hbHl6ZXIgY2xhc3MgZm9yIHNpbXBsZSBzaGVsbC1saWtlIHN5bnRheGVzLiIiIgoKIyBNb2R1bGUgYW5kIGRvY3VtZW50YXRpb24gYnkgRXJpYyBTLiBSYXltb25kLCAyMSBEZWMgMTk5OAojIElucHV0IHN0YWNraW5nIGFuZCBlcnJvciBtZXNzYWdlIGNsZWFudXAgYWRkZWQgYnkgRVNSLCBNYXJjaCAyMDAwCiMgcHVzaF9zb3VyY2UoKSBhbmQgcG9wX3NvdXJjZSgpIG1hZGUgZXhwbGljaXQgYnkgRVNSLCBKYW51YXJ5IDIwMDEuCiMgUG9zaXggY29tcGxpYW5jZSwgc3BsaXQoKSwgc3RyaW5nIGFyZ3VtZW50cywgYW5kCiMgaXRlcmF0b3IgaW50ZXJmYWNlIGJ5IEd1c3Rhdm8gTmllbWV5ZXIsIEFwcmlsIDIwMDMuCgppbXBvcnQgb3MucGF0aAppbXBvcnQgc3lzCgp0cnk6CiAgICBmcm9tIGNTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KZXhjZXB0IEltcG9ydEVycm9yOgogICAgZnJvbSBTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KCl9fYWxsX18gPSBbInNobGV4IiwgInNwbGl0Il0KCmNsYXNzIHNobGV4OgogICAgIkEgbGV4aWNhbCBhbmFseXplciBjbGFzcyBmb3Igc2ltcGxlIHNoZWxsLWxpa2Ugc3ludGF4ZXMuIgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGluc3RyZWFtPU5vbmUsIGluZmlsZT1Ob25lLCBwb3NpeD1GYWxzZSk6CiAgICAgICAgaWYgaXNpbnN0YW5jZShpbnN0cmVhbSwgYmFzZXN0cmluZyk6CiAgICAgICAgICAgIGluc3RyZWFtID0gU3RyaW5nSU8oaW5zdHJlYW0pCiAgICAgICAgaWYgaW5zdHJlYW0gaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHNlbGYuaW5zdHJlYW0gPSBpbnN0cmVhbQogICAgICAgICAgICBzZWxmLmluZmlsZSA9IGluZmlsZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuaW5zdHJlYW0gPSBzeXMuc3RkaW4KICAgICAgICAgICAgc2VsZi5pbmZpbGUgPSBOb25lCiAgICAgICAgc2VsZi5wb3NpeCA9IHBvc2l4CiAgICAgICAgaWYgcG9zaXg6CiAgICAgICAgICAgIHNlbGYuZW9mID0gTm9uZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuZW9mID0gJycKICAgICAgICBzZWxmLmNvbW1lbnRlcnMgPSAnIycKICAgICAgICBzZWxmLndvcmRjaGFycyA9ICgnYWJjZGZlZ2hpamtsbW5vcHFyc3R1dnd4eXonCiAgICAgICAgICAgICAgICAgICAgICAgICAgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaMDEyMzQ1Njc4OV8nKQogICAgICAgIGlmIHNlbGYucG9zaXg6CiAgICAgICAgICAgIHNlbGYud29yZGNoYXJzICs9ICgn3+Dh4uPk5ebn6Onq6+zt7u/w8fLz9PX2+Pn6+/z9/v8nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnwMHCw8TFxsfIycrLzM3Oz9DR0tPU1dbY2drb3N3eJykKICAgICAgICBzZWxmLndoaXRlc3BhY2UgPSAnIFx0XHJcbicKICAgICAgICBzZWxmLndoaXRlc3BhY2Vfc3BsaXQgPSBGYWxzZQogICAgICAgIHNlbGYucXVvdGVzID0gJ1wnIicKICAgICAgICBzZWxmLmVzY2FwZSA9ICdcXCcKICAgICAgICBzZWxmLmVzY2FwZWRxdW90ZXMgPSAnIicKICAgICAgICBzZWxmLnN0YXRlID0gJyAnCiAgICAgICAgc2VsZi5wdXNoYmFjayA9IFtdCiAgICAgICAgc2VsZi5saW5lbm8gPSAxCiAgICAgICAgc2VsZi5kZWJ1ZyA9IDAKICAgICAgICBzZWxmLnRva2VuID0gJycKICAgICAgICBzZWxmLmZpbGVzdGFjayA9IFtdCiAgICAgICAgc2VsZi5zb3VyY2UgPSBOb25lCiAgICAgICAgaWYgc2VsZi5kZWJ1ZzoKICAgICAgICAgICAgcHJpbnQgJ3NobGV4OiByZWFkaW5nIGZyb20gJXMsIGxpbmUgJWQnIFwKICAgICAgICAgICAgICAgICAgJSAoc2VsZi5pbnN0cmVhbSwgc2VsZi5saW5lbm8pCgogICAgZGVmIHB1c2hfdG9rZW4oc2VsZiwgdG9rKToKICAgICAgICAiUHVzaCBhIHRva2VuIG9udG8gdGhlIHN0YWNrIHBvcHBlZCBieSB0aGUgZ2V0X3Rva2VuIG1ldGhvZCIKICAgICAgICBpZiBzZWxmLmRlYnVnID49IDE6CiAgICAgICAgICAgIHByaW50ICJzaGxleDogcHVzaGluZyB0b2tlbiAiICsgYHRva2AKICAgICAgICBzZWxmLnB1c2hiYWNrLmluc2VydCgwLCB0b2spCgogICAgZGVmIHB1c2hfc291cmNlKHNlbGYsIG5ld3N0cmVhbSwgbmV3ZmlsZT1Ob25lKToKICAgICAgICAiUHVzaCBhbiBpbnB1dCBzb3VyY2Ugb250byB0aGUgbGV4ZXIncyBpbnB1dCBzb3VyY2Ugc3RhY2suIgogICAgICAgIGlmIGlzaW5zdGFuY2UobmV3c3RyZWFtLCBiYXNlc3RyaW5nKToKICAgICAgICAgICAgbmV3c3RyZWFtID0gU3RyaW5nSU8obmV3c3RyZWFtKQogICAgICAgIHNlbGYuZmlsZXN0YWNrLmluc2VydCgwLCAoc2VsZi5pbmZpbGUsIHNlbGYuaW5zdHJlYW0sIHNlbGYubGluZW5vKSkKICAgICAgICBzZWxmLmluZmlsZSA9IG5ld2ZpbGUKICAgICAgICBzZWxmLmluc3RyZWFtID0gbmV3c3RyZWFtCiAgICAgICAgc2VsZi5saW5lbm8gPSAxCiAgICAgICAgaWYgc2VsZi5kZWJ1ZzoKICAgICAgICAgICAgaWYgbmV3ZmlsZSBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgIHByaW50ICdzaGxleDogcHVzaGluZyB0byBmaWxlICVzJyAlIChzZWxmLmluZmlsZSwpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBwcmludCAnc2hsZXg6IHB1c2hpbmcgdG8gc3RyZWFtICVzJyAlIChzZWxmLmluc3RyZWFtLCkKCiAgICBkZWYgcG9wX3NvdXJjZShzZWxmKToKICAgICAgICAiUG9wIHRoZSBpbnB1dCBzb3VyY2Ugc3RhY2suIgogICAgICAgIHNlbGYuaW5zdHJlYW0uY2xvc2UoKQogICAgICAgIChzZWxmLmluZmlsZSwgc2VsZi5pbnN0cmVhbSwgc2VsZi5saW5lbm8pID0gc2VsZi5maWxlc3RhY2tbMF0KICAgICAgICBzZWxmLmZpbGVzdGFjayA9IHNlbGYuZmlsZXN0YWNrWzE6XQogICAgICAgIGlmIHNlbGYuZGVidWc6CiAgICAgICAgICAgIHByaW50ICdzaGxleDogcG9wcGluZyB0byAlcywgbGluZSAlZCcgXAogICAgICAgICAgICAgICAgICAlIChzZWxmLmluc3RyZWFtLCBzZWxmLmxpbmVubykKICAgICAgICBzZWxmLnN0YXRlID0gJyAnCgogICAgZGVmIGdldF90b2tlbihzZWxmKToKICAgICAgICAiR2V0IGEgdG9rZW4gZnJvbSB0aGUgaW5wdXQgc3RyZWFtIChvciBmcm9tIHN0YWNrIGlmIGl0J3Mgbm9uZW1wdHkpIgogICAgICAgIGlmIHNlbGYucHVzaGJhY2s6CiAgICAgICAgICAgIHRvayA9IHNlbGYucHVzaGJhY2sucG9wKDApCiAgICAgICAgICAgIGlmIHNlbGYuZGVidWcgPj0gMToKICAgICAgICAgICAgICAgIHByaW50ICJzaGxleDogcG9wcGluZyB0b2tlbiAiICsgYHRva2AKICAgICAgICAgICAgcmV0dXJuIHRvawogICAgICAgICMgTm8gcHVzaGJhY2suICBHZXQgYSB0b2tlbi4KICAgICAgICByYXcgPSBzZWxmLnJlYWRfdG9rZW4oKQogICAgICAgICMgSGFuZGxlIGluY2x1c2lvbnMKICAgICAgICBpZiBzZWxmLnNvdXJjZSBpcyBub3QgTm9uZToKICAgICAgICAgICAgd2hpbGUgcmF3ID09IHNlbGYuc291cmNlOgogICAgICAgICAgICAgICAgc3BlYyA9IHNlbGYuc291cmNlaG9vayhzZWxmLnJlYWRfdG9rZW4oKSkKICAgICAgICAgICAgICAgIGlmIHNwZWM6CiAgICAgICAgICAgICAgICAgICAgKG5ld2ZpbGUsIG5ld3N0cmVhbSkgPSBzcGVjCiAgICAgICAgICAgICAgICAgICAgc2VsZi5wdXNoX3NvdXJjZShuZXdzdHJlYW0sIG5ld2ZpbGUpCiAgICAgICAgICAgICAgICByYXcgPSBzZWxmLmdldF90b2tlbigpCiAgICAgICAgIyBNYXliZSB3ZSBnb3QgRU9GIGluc3RlYWQ/CiAgICAgICAgd2hpbGUgcmF3ID09IHNlbGYuZW9mOgogICAgICAgICAgICBpZiBub3Qgc2VsZi5maWxlc3RhY2s6CiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5lb2YKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHNlbGYucG9wX3NvdXJjZSgpCiAgICAgICAgICAgICAgICByYXcgPSBzZWxmLmdldF90b2tlbigpCiAgICAgICAgIyBOZWl0aGVyIGluY2x1c2lvbiBub3IgRU9GCiAgICAgICAgaWYgc2VsZi5kZWJ1ZyA+PSAxOgogICAgICAgICAgICBpZiByYXcgIT0gc2VsZi5lb2Y6CiAgICAgICAgICAgICAgICBwcmludCAic2hsZXg6IHRva2VuPSIgKyBgcmF3YAogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcHJpbnQgInNobGV4OiB0b2tlbj1FT0YiCiAgICAgICAgcmV0dXJuIHJhdwoKICAgIGRlZiByZWFkX3Rva2VuKHNlbGYpOgogICAgICAgIHF1b3RlZCA9IEZhbHNlCiAgICAgICAgZXNjYXBlZHN0YXRlID0gJyAnCiAgICAgICAgd2hpbGUgVHJ1ZToKICAgICAgICAgICAgbmV4dGNoYXIgPSBzZWxmLmluc3RyZWFtLnJlYWQoMSkKICAgICAgICAgICAgaWYgbmV4dGNoYXIgPT0gJ1xuJzoKICAgICAgICAgICAgICAgIHNlbGYubGluZW5vID0gc2VsZi5saW5lbm8gKyAxCiAgICAgICAgICAgIGlmIHNlbGYuZGVidWcgPj0gMzoKICAgICAgICAgICAgICAgIHByaW50ICJzaGxleDogaW4gc3RhdGUiLCByZXByKHNlbGYuc3RhdGUpLCBcCiAgICAgICAgICAgICAgICAgICAgICAiSSBzZWUgY2hhcmFjdGVyOiIsIHJlcHIobmV4dGNoYXIpCiAgICAgICAgICAgIGlmIHNlbGYuc3RhdGUgaXMgTm9uZToKICAgICAgICAgICAgICAgIHNlbGYudG9rZW4gPSAnJyAgICAgICAgIyBwYXN0IGVuZCBvZiBmaWxlCiAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICBlbGlmIHNlbGYuc3RhdGUgPT0gJyAnOgogICAgICAgICAgICAgICAgaWYgbm90IG5leHRjaGFyOgogICAgICAgICAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBOb25lICAjIGVuZCBvZiBmaWxlCiAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgICAgIGVsaWYgbmV4dGNoYXIgaW4gc2VsZi53aGl0ZXNwYWNlOgogICAgICAgICAgICAgICAgICAgIGlmIHNlbGYuZGVidWcgPj0gMjoKICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQgInNobGV4OiBJIHNlZSB3aGl0ZXNwYWNlIGluIHdoaXRlc3BhY2Ugc3RhdGUiCiAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi50b2tlbiBvciAoc2VsZi5wb3NpeCBhbmQgcXVvdGVkKToKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgICAjIGVtaXQgY3VycmVudCB0b2tlbgogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICBlbGlmIG5leHRjaGFyIGluIHNlbGYuY29tbWVudGVyczoKICAgICAgICAgICAgICAgICAgICBzZWxmLmluc3RyZWFtLnJlYWRsaW5lKCkKICAgICAgICAgICAgICAgICAgICBzZWxmLmxpbmVubyA9IHNlbGYubGluZW5vICsgMQogICAgICAgICAgICAgICAgZWxpZiBzZWxmLnBvc2l4IGFuZCBuZXh0Y2hhciBpbiBzZWxmLmVzY2FwZToKICAgICAgICAgICAgICAgICAgICBlc2NhcGVkc3RhdGUgPSAnYScKICAgICAgICAgICAgICAgICAgICBzZWxmLnN0YXRlID0gbmV4dGNoYXIKICAgICAgICAgICAgICAgIGVsaWYgbmV4dGNoYXIgaW4gc2VsZi53b3JkY2hhcnM6CiAgICAgICAgICAgICAgICAgICAgc2VsZi50b2tlbiA9IG5leHRjaGFyCiAgICAgICAgICAgICAgICAgICAgc2VsZi5zdGF0ZSA9ICdhJwogICAgICAgICAgICAgICAgZWxpZiBuZXh0Y2hhciBpbiBzZWxmLnF1b3RlczoKICAgICAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5wb3NpeDoKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50b2tlbiA9IG5leHRjaGFyCiAgICAgICAgICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IG5leHRjaGFyCiAgICAgICAgICAgICAgICBlbGlmIHNlbGYud2hpdGVzcGFjZV9zcGxpdDoKICAgICAgICAgICAgICAgICAgICBzZWxmLnRva2VuID0gbmV4dGNoYXIKICAgICAgICAgICAgICAgICAgICBzZWxmLnN0YXRlID0gJ2EnCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHNlbGYudG9rZW4gPSBuZXh0Y2hhcgogICAgICAgICAgICAgICAgICAgIGlmIHNlbGYudG9rZW4gb3IgKHNlbGYucG9zaXggYW5kIHF1b3RlZCk6CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrICAgIyBlbWl0IGN1cnJlbnQgdG9rZW4KICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBlbGlmIHNlbGYuc3RhdGUgaW4gc2VsZi5xdW90ZXM6CiAgICAgICAgICAgICAgICBxdW90ZWQgPSBUcnVlCiAgICAgICAgICAgICAgICBpZiBub3QgbmV4dGNoYXI6ICAgICAgIyBlbmQgb2YgZmlsZQogICAgICAgICAgICAgICAgICAgIGlmIHNlbGYuZGVidWcgPj0gMjoKICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQgInNobGV4OiBJIHNlZSBFT0YgaW4gcXVvdGVzIHN0YXRlIgogICAgICAgICAgICAgICAgICAgICMgWFhYIHdoYXQgZXJyb3Igc2hvdWxkIGJlIHJhaXNlZCBoZXJlPwogICAgICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsICJObyBjbG9zaW5nIHF1b3RhdGlvbiIKICAgICAgICAgICAgICAgIGlmIG5leHRjaGFyID09IHNlbGYuc3RhdGU6CiAgICAgICAgICAgICAgICAgICAgaWYgbm90IHNlbGYucG9zaXg6CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudG9rZW4gPSBzZWxmLnRva2VuICsgbmV4dGNoYXIKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zdGF0ZSA9ICcgJwogICAgICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc3RhdGUgPSAnYScKICAgICAgICAgICAgICAgIGVsaWYgc2VsZi5wb3NpeCBhbmQgbmV4dGNoYXIgaW4gc2VsZi5lc2NhcGUgYW5kIFwKICAgICAgICAgICAgICAgICAgICAgc2VsZi5zdGF0ZSBpbiBzZWxmLmVzY2FwZWRxdW90ZXM6CiAgICAgICAgICAgICAgICAgICAgZXNjYXBlZHN0YXRlID0gc2VsZi5zdGF0ZQogICAgICAgICAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBuZXh0Y2hhcgogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBzZWxmLnRva2VuID0gc2VsZi50b2tlbiArIG5leHRjaGFyCiAgICAgICAgICAgIGVsaWYgc2VsZi5zdGF0ZSBpbiBzZWxmLmVzY2FwZToKICAgICAgICAgICAgICAgIGlmIG5vdCBuZXh0Y2hhcjogICAgICAjIGVuZCBvZiBmaWxlCiAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5kZWJ1ZyA+PSAyOgogICAgICAgICAgICAgICAgICAgICAgICBwcmludCAic2hsZXg6IEkgc2VlIEVPRiBpbiBlc2NhcGUgc3RhdGUiCiAgICAgICAgICAgICAgICAgICAgIyBYWFggd2hhdCBlcnJvciBzaG91bGQgYmUgcmFpc2VkIGhlcmU/CiAgICAgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgIk5vIGVzY2FwZWQgY2hhcmFjdGVyIgogICAgICAgICAgICAgICAgIyBJbiBwb3NpeCBzaGVsbHMsIG9ubHkgdGhlIHF1b3RlIGl0c2VsZiBvciB0aGUgZXNjYXBlCiAgICAgICAgICAgICAgICAjIGNoYXJhY3RlciBtYXkgYmUgZXNjYXBlZCB3aXRoaW4gcXVvdGVzLgogICAgICAgICAgICAgICAgaWYgZXNjYXBlZHN0YXRlIGluIHNlbGYucXVvdGVzIGFuZCBcCiAgICAgICAgICAgICAgICAgICBuZXh0Y2hhciAhPSBzZWxmLnN0YXRlIGFuZCBuZXh0Y2hhciAhPSBlc2NhcGVkc3RhdGU6CiAgICAgICAgICAgICAgICAgICAgc2VsZi50b2tlbiA9IHNlbGYudG9rZW4gKyBzZWxmLnN0YXRlCiAgICAgICAgICAgICAgICBzZWxmLnRva2VuID0gc2VsZi50b2tlbiArIG5leHRjaGFyCiAgICAgICAgICAgICAgICBzZWxmLnN0YXRlID0gZXNjYXBlZHN0YXRlCiAgICAgICAgICAgIGVsaWYgc2VsZi5zdGF0ZSA9PSAnYSc6CiAgICAgICAgICAgICAgICBpZiBub3QgbmV4dGNoYXI6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IE5vbmUgICAjIGVuZCBvZiBmaWxlCiAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgICAgIGVsaWYgbmV4dGNoYXIgaW4gc2VsZi53aGl0ZXNwYWNlOgogICAgICAgICAgICAgICAgICAgIGlmIHNlbGYuZGVidWcgPj0gMjoKICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQgInNobGV4OiBJIHNlZSB3aGl0ZXNwYWNlIGluIHdvcmQgc3RhdGUiCiAgICAgICAgICAgICAgICAgICAgc2VsZi5zdGF0ZSA9ICcgJwogICAgICAgICAgICAgICAgICAgIGlmIHNlbGYudG9rZW4gb3IgKHNlbGYucG9zaXggYW5kIHF1b3RlZCk6CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrICAgIyBlbWl0IGN1cnJlbnQgdG9rZW4KICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgZWxpZiBuZXh0Y2hhciBpbiBzZWxmLmNvbW1lbnRlcnM6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5pbnN0cmVhbS5yZWFkbGluZSgpCiAgICAgICAgICAgICAgICAgICAgc2VsZi5saW5lbm8gPSBzZWxmLmxpbmVubyArIDEKICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLnBvc2l4OgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnN0YXRlID0gJyAnCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYudG9rZW4gb3IgKHNlbGYucG9zaXggYW5kIHF1b3RlZCk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhayAgICMgZW1pdCBjdXJyZW50IHRva2VuCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgZWxpZiBzZWxmLnBvc2l4IGFuZCBuZXh0Y2hhciBpbiBzZWxmLnF1b3RlczoKICAgICAgICAgICAgICAgICAgICBzZWxmLnN0YXRlID0gbmV4dGNoYXIKICAgICAgICAgICAgICAgIGVsaWYgc2VsZi5wb3NpeCBhbmQgbmV4dGNoYXIgaW4gc2VsZi5lc2NhcGU6CiAgICAgICAgICAgICAgICAgICAgZXNjYXBlZHN0YXRlID0gJ2EnCiAgICAgICAgICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IG5leHRjaGFyCiAgICAgICAgICAgICAgICBlbGlmIG5leHRjaGFyIGluIHNlbGYud29yZGNoYXJzIG9yIG5leHRjaGFyIGluIHNlbGYucXVvdGVzIFwKICAgICAgICAgICAgICAgICAgICBvciBzZWxmLndoaXRlc3BhY2Vfc3BsaXQ6CiAgICAgICAgICAgICAgICAgICAgc2VsZi50b2tlbiA9IHNlbGYudG9rZW4gKyBuZXh0Y2hhcgogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBzZWxmLnB1c2hiYWNrLmluc2VydCgwLCBuZXh0Y2hhcikKICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLmRlYnVnID49IDI6CiAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ICJzaGxleDogSSBzZWUgcHVuY3R1YXRpb24gaW4gd29yZCBzdGF0ZSIKICAgICAgICAgICAgICAgICAgICBzZWxmLnN0YXRlID0gJyAnCiAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi50b2tlbjoKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgICAjIGVtaXQgY3VycmVudCB0b2tlbgogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgcmVzdWx0ID0gc2VsZi50b2tlbgogICAgICAgIHNlbGYudG9rZW4gPSAnJwogICAgICAgIGlmIHNlbGYucG9zaXggYW5kIG5vdCBxdW90ZWQgYW5kIHJlc3VsdCA9PSAnJzoKICAgICAgICAgICAgcmVzdWx0ID0gTm9uZQogICAgICAgIGlmIHNlbGYuZGVidWcgPiAxOgogICAgICAgICAgICBpZiByZXN1bHQ6CiAgICAgICAgICAgICAgICBwcmludCAic2hsZXg6IHJhdyB0b2tlbj0iICsgYHJlc3VsdGAKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHByaW50ICJzaGxleDogcmF3IHRva2VuPUVPRiIKICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgZGVmIHNvdXJjZWhvb2soc2VsZiwgbmV3ZmlsZSk6CiAgICAgICAgIkhvb2sgY2FsbGVkIG9uIGEgZmlsZW5hbWUgdG8gYmUgc291cmNlZC4iCiAgICAgICAgaWYgbmV3ZmlsZVswXSA9PSAnIic6CiAgICAgICAgICAgIG5ld2ZpbGUgPSBuZXdmaWxlWzE6LTFdCiAgICAgICAgIyBUaGlzIGltcGxlbWVudHMgY3BwLWxpa2Ugc2VtYW50aWNzIGZvciByZWxhdGl2ZS1wYXRoIGluY2x1c2lvbi4KICAgICAgICBpZiBpc2luc3RhbmNlKHNlbGYuaW5maWxlLCBiYXNlc3RyaW5nKSBhbmQgbm90IG9zLnBhdGguaXNhYnMobmV3ZmlsZSk6CiAgICAgICAgICAgIG5ld2ZpbGUgPSBvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKHNlbGYuaW5maWxlKSwgbmV3ZmlsZSkKICAgICAgICByZXR1cm4gKG5ld2ZpbGUsIG9wZW4obmV3ZmlsZSwgInIiKSkKCiAgICBkZWYgZXJyb3JfbGVhZGVyKHNlbGYsIGluZmlsZT1Ob25lLCBsaW5lbm89Tm9uZSk6CiAgICAgICAgIkVtaXQgYSBDLWNvbXBpbGVyLWxpa2UsIEVtYWNzLWZyaWVuZGx5IGVycm9yLW1lc3NhZ2UgbGVhZGVyLiIKICAgICAgICBpZiBpbmZpbGUgaXMgTm9uZToKICAgICAgICAgICAgaW5maWxlID0gc2VsZi5pbmZpbGUKICAgICAgICBpZiBsaW5lbm8gaXMgTm9uZToKICAgICAgICAgICAgbGluZW5vID0gc2VsZi5saW5lbm8KICAgICAgICByZXR1cm4gIlwiJXNcIiwgbGluZSAlZDogIiAlIChpbmZpbGUsIGxpbmVubykKCiAgICBkZWYgX19pdGVyX18oc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYKCiAgICBkZWYgbmV4dChzZWxmKToKICAgICAgICB0b2tlbiA9IHNlbGYuZ2V0X3Rva2VuKCkKICAgICAgICBpZiB0b2tlbiA9PSBzZWxmLmVvZjoKICAgICAgICAgICAgcmFpc2UgU3RvcEl0ZXJhdGlvbgogICAgICAgIHJldHVybiB0b2tlbgoKZGVmIHNwbGl0KHMsIGNvbW1lbnRzPUZhbHNlKToKICAgIGxleCA9IHNobGV4KHMsIHBvc2l4PVRydWUpCiAgICBsZXgud2hpdGVzcGFjZV9zcGxpdCA9IFRydWUKICAgIGlmIG5vdCBjb21tZW50czoKICAgICAgICBsZXguY29tbWVudGVycyA9ICcnCiAgICByZXR1cm4gbGlzdChsZXgpCgppZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgaWYgbGVuKHN5cy5hcmd2KSA9PSAxOgogICAgICAgIGxleGVyID0gc2hsZXgoKQogICAgZWxzZToKICAgICAgICBmaWxlID0gc3lzLmFyZ3ZbMV0KICAgICAgICBsZXhlciA9IHNobGV4KG9wZW4oZmlsZSksIGZpbGUpCiAgICB3aGlsZSAxOgogICAgICAgIHR0ID0gbGV4ZXIuZ2V0X3Rva2VuKCkKICAgICAgICBpZiB0dDoKICAgICAgICAgICAgcHJpbnQgIlRva2VuOiAiICsgcmVwcih0dCkKICAgICAgICBlbHNlOgogICAgICAgICAgICBicmVhawo=