IyAtKi0gY29kaW5nOiBpc28tODg1OS0xIC0qLQoiIiJBIGxleGljYWwgYW5hbHl6ZXIgY2xhc3MgZm9yIHNpbXBsZSBzaGVsbC1saWtlIHN5bnRheGVzLiIiIgoKIyBNb2R1bGUgYW5kIGRvY3VtZW50YXRpb24gYnkgRXJpYyBTLiBSYXltb25kLCAyMSBEZWMgMTk5OAojIElucHV0IHN0YWNraW5nIGFuZCBlcnJvciBtZXNzYWdlIGNsZWFudXAgYWRkZWQgYnkgRVNSLCBNYXJjaCAyMDAwCiMgcHVzaF9zb3VyY2UoKSBhbmQgcG9wX3NvdXJjZSgpIG1hZGUgZXhwbGljaXQgYnkgRVNSLCBKYW51YXJ5IDIwMDEuCiMgUG9zaXggY29tcGxpYW5jZSwgc3BsaXQoKSwgc3RyaW5nIGFyZ3VtZW50cywgYW5kCiMgaXRlcmF0b3IgaW50ZXJmYWNlIGJ5IEd1c3Rhdm8gTmllbWV5ZXIsIEFwcmlsIDIwMDMuCgppbXBvcnQgb3MucGF0aAppbXBvcnQgc3lzCmZyb20gY29sbGVjdGlvbnMgaW1wb3J0IGRlcXVlCgp0cnk6CiAgICBmcm9tIGNTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KZXhjZXB0IEltcG9ydEVycm9yOgogICAgZnJvbSBTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KCl9fYWxsX18gPSBbInNobGV4IiwgInNwbGl0Il0KCmNsYXNzIHNobGV4OgogICAgIkEgbGV4aWNhbCBhbmFseXplciBjbGFzcyBmb3Igc2ltcGxlIHNoZWxsLWxpa2Ugc3ludGF4ZXMuIgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGluc3RyZWFtPU5vbmUsIGluZmlsZT1Ob25lLCBwb3NpeD1GYWxzZSk6CiAgICAgICAgaWYgaXNpbnN0YW5jZShpbnN0cmVhbSwgYmFzZXN0cmluZyk6CiAgICAgICAgICAgIGluc3RyZWFtID0gU3RyaW5nSU8oaW5zdHJlYW0pCiAgICAgICAgaWYgaW5zdHJlYW0gaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHNlbGYuaW5zdHJlYW0gPSBpbnN0cmVhbQogICAgICAgICAgICBzZWxmLmluZmlsZSA9IGluZmlsZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuaW5zdHJlYW0gPSBzeXMuc3RkaW4KICAgICAgICAgICAgc2VsZi5pbmZpbGUgPSBOb25lCiAgICAgICAgc2VsZi5wb3NpeCA9IHBvc2l4CiAgICAgICAgaWYgcG9zaXg6CiAgICAgICAgICAgIHNlbGYuZW9mID0gTm9uZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuZW9mID0gJycKICAgICAgICBzZWxmLmNvbW1lbnRlcnMgPSAnIycKICAgICAgICBzZWxmLndvcmRjaGFycyA9ICgnYWJjZGZlZ2hpamtsbW5vcHFyc3R1dnd4eXonCiAgICAgICAgICAgICAgICAgICAgICAgICAgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaMDEyMzQ1Njc4OV8nKQogICAgICAgIGlmIHNlbGYucG9zaXg6CiAgICAgICAgICAgIHNlbGYud29yZGNoYXJzICs9ICgn3+Dh4uPk5ebn6Onq6+zt7u/w8fLz9PX2+Pn6+/z9/v8nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnwMHCw8TFxsfIycrLzM3Oz9DR0tPU1dbY2drb3N3eJykKICAgICAgICBzZWxmLndoaXRlc3BhY2UgPSAnIFx0XHJcbicKICAgICAgICBzZWxmLndoaXRlc3BhY2Vfc3BsaXQgPSBGYWxzZQogICAgICAgIHNlbGYucXVvdGVzID0gJ1wnIicKICAgICAgICBzZWxmLmVzY2FwZSA9ICdcXCcKICAgICAgICBzZWxmLmVzY2FwZWRxdW90ZXMgPSAnIicKICAgICAgICBzZWxmLnN0YXRlID0gJyAnCiAgICAgICAgc2VsZi5wdXNoYmFjayA9IGRlcXVlKCkKICAgICAgICBzZWxmLmxpbmVubyA9IDEKICAgICAgICBzZWxmLmRlYnVnID0gMAogICAgICAgIHNlbGYudG9rZW4gPSAnJwogICAgICAgIHNlbGYuZmlsZXN0YWNrID0gZGVxdWUoKQogICAgICAgIHNlbGYuc291cmNlID0gTm9uZQogICAgICAgIGlmIHNlbGYuZGVidWc6CiAgICAgICAgICAgIHByaW50KCdzaGxleDogcmVhZGluZyBmcm9tICVzLCBsaW5lICVkJyBcCiAgICAgICAgICAgICAgICAgICUgKHNlbGYuaW5zdHJlYW0sIHNlbGYubGluZW5vKSkKCiAgICBkZWYgcHVzaF90b2tlbihzZWxmLCB0b2spOgogICAgICAgICJQdXNoIGEgdG9rZW4gb250byB0aGUgc3RhY2sgcG9wcGVkIGJ5IHRoZSBnZXRfdG9rZW4gbWV0aG9kIgogICAgICAgIGlmIHNlbGYuZGVidWcgPj0gMToKICAgICAgICAgICAgcHJpbnQoInNobGV4OiBwdXNoaW5nIHRva2VuICIgKyByZXByKHRvaykpCiAgICAgICAgc2VsZi5wdXNoYmFjay5hcHBlbmRsZWZ0KHRvaykKCiAgICBkZWYgcHVzaF9zb3VyY2Uoc2VsZiwgbmV3c3RyZWFtLCBuZXdmaWxlPU5vbmUpOgogICAgICAgICJQdXNoIGFuIGlucHV0IHNvdXJjZSBvbnRvIHRoZSBsZXhlcidzIGlucHV0IHNvdXJjZSBzdGFjay4iCiAgICAgICAgaWYgaXNpbnN0YW5jZShuZXdzdHJlYW0sIGJhc2VzdHJpbmcpOgogICAgICAgICAgICBuZXdzdHJlYW0gPSBTdHJpbmdJTyhuZXdzdHJlYW0pCiAgICAgICAgc2VsZi5maWxlc3RhY2suYXBwZW5kbGVmdCgoc2VsZi5pbmZpbGUsIHNlbGYuaW5zdHJlYW0sIHNlbGYubGluZW5vKSkKICAgICAgICBzZWxmLmluZmlsZSA9IG5ld2ZpbGUKICAgICAgICBzZWxmLmluc3RyZWFtID0gbmV3c3RyZWFtCiAgICAgICAgc2VsZi5saW5lbm8gPSAxCiAgICAgICAgaWYgc2VsZi5kZWJ1ZzoKICAgICAgICAgICAgaWYgbmV3ZmlsZSBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgIHByaW50KCdzaGxleDogcHVzaGluZyB0byBmaWxlICVzJyAlIChzZWxmLmluZmlsZSwpKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcHJpbnQoJ3NobGV4OiBwdXNoaW5nIHRvIHN0cmVhbSAlcycgJSAoc2VsZi5pbnN0cmVhbSwpKQoKICAgIGRlZiBwb3Bfc291cmNlKHNlbGYpOgogICAgICAgICJQb3AgdGhlIGlucHV0IHNvdXJjZSBzdGFjay4iCiAgICAgICAgc2VsZi5pbnN0cmVhbS5jbG9zZSgpCiAgICAgICAgKHNlbGYuaW5maWxlLCBzZWxmLmluc3RyZWFtLCBzZWxmLmxpbmVubykgPSBzZWxmLmZpbGVzdGFjay5wb3BsZWZ0KCkKICAgICAgICBpZiBzZWxmLmRlYnVnOgogICAgICAgICAgICBwcmludCgnc2hsZXg6IHBvcHBpbmcgdG8gJXMsIGxpbmUgJWQnIFwKICAgICAgICAgICAgICAgICAgJSAoc2VsZi5pbnN0cmVhbSwgc2VsZi5saW5lbm8pKQogICAgICAgIHNlbGYuc3RhdGUgPSAnICcKCiAgICBkZWYgZ2V0X3Rva2VuKHNlbGYpOgogICAgICAgICJHZXQgYSB0b2tlbiBmcm9tIHRoZSBpbnB1dCBzdHJlYW0gKG9yIGZyb20gc3RhY2sgaWYgaXQncyBub25lbXB0eSkiCiAgICAgICAgaWYgc2VsZi5wdXNoYmFjazoKICAgICAgICAgICAgdG9rID0gc2VsZi5wdXNoYmFjay5wb3BsZWZ0KCkKICAgICAgICAgICAgaWYgc2VsZi5kZWJ1ZyA+PSAxOgogICAgICAgICAgICAgICAgcHJpbnQoInNobGV4OiBwb3BwaW5nIHRva2VuICIgKyByZXByKHRvaykpCiAgICAgICAgICAgIHJldHVybiB0b2sKICAgICAgICAjIE5vIHB1c2hiYWNrLiAgR2V0IGEgdG9rZW4uCiAgICAgICAgcmF3ID0gc2VsZi5yZWFkX3Rva2VuKCkKICAgICAgICAjIEhhbmRsZSBpbmNsdXNpb25zCiAgICAgICAgaWYgc2VsZi5zb3VyY2UgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHdoaWxlIHJhdyA9PSBzZWxmLnNvdXJjZToKICAgICAgICAgICAgICAgIHNwZWMgPSBzZWxmLnNvdXJjZWhvb2soc2VsZi5yZWFkX3Rva2VuKCkpCiAgICAgICAgICAgICAgICBpZiBzcGVjOgogICAgICAgICAgICAgICAgICAgIChuZXdmaWxlLCBuZXdzdHJlYW0pID0gc3BlYwogICAgICAgICAgICAgICAgICAgIHNlbGYucHVzaF9zb3VyY2UobmV3c3RyZWFtLCBuZXdmaWxlKQogICAgICAgICAgICAgICAgcmF3ID0gc2VsZi5nZXRfdG9rZW4oKQogICAgICAgICMgTWF5YmUgd2UgZ290IEVPRiBpbnN0ZWFkPwogICAgICAgIHdoaWxlIHJhdyA9PSBzZWxmLmVvZjoKICAgICAgICAgICAgaWYgbm90IHNlbGYuZmlsZXN0YWNrOgogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuZW9mCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzZWxmLnBvcF9zb3VyY2UoKQogICAgICAgICAgICAgICAgcmF3ID0gc2VsZi5nZXRfdG9rZW4oKQogICAgICAgICMgTmVpdGhlciBpbmNsdXNpb24gbm9yIEVPRgogICAgICAgIGlmIHNlbGYuZGVidWcgPj0gMToKICAgICAgICAgICAgaWYgcmF3ICE9IHNlbGYuZW9mOgogICAgICAgICAgICAgICAgcHJpbnQoInNobGV4OiB0b2tlbj0iICsgcmVwcihyYXcpKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcHJpbnQoInNobGV4OiB0b2tlbj1FT0YiKQogICAgICAgIHJldHVybiByYXcKCiAgICBkZWYgcmVhZF90b2tlbihzZWxmKToKICAgICAgICBxdW90ZWQgPSBGYWxzZQogICAgICAgIGVzY2FwZWRzdGF0ZSA9ICcgJwogICAgICAgIHdoaWxlIFRydWU6CiAgICAgICAgICAgIG5leHRjaGFyID0gc2VsZi5pbnN0cmVhbS5yZWFkKDEpCiAgICAgICAgICAgIGlmIG5leHRjaGFyID09ICdcbic6CiAgICAgICAgICAgICAgICBzZWxmLmxpbmVubyA9IHNlbGYubGluZW5vICsgMQogICAgICAgICAgICBpZiBzZWxmLmRlYnVnID49IDM6CiAgICAgICAgICAgICAgICBwcmludCgic2hsZXg6IGluIHN0YXRlIiwgcmVwcihzZWxmLnN0YXRlKSwgXAogICAgICAgICAgICAgICAgICAgICAgIkkgc2VlIGNoYXJhY3RlcjoiLCByZXByKG5leHRjaGFyKSkKICAgICAgICAgICAgaWYgc2VsZi5zdGF0ZSBpcyBOb25lOgogICAgICAgICAgICAgICAgc2VsZi50b2tlbiA9ICcnICAgICAgICAjIHBhc3QgZW5kIG9mIGZpbGUKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgIGVsaWYgc2VsZi5zdGF0ZSA9PSAnICc6CiAgICAgICAgICAgICAgICBpZiBub3QgbmV4dGNoYXI6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IE5vbmUgICMgZW5kIG9mIGZpbGUKICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgICAgZWxpZiBuZXh0Y2hhciBpbiBzZWxmLndoaXRlc3BhY2U6CiAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5kZWJ1ZyA+PSAyOgogICAgICAgICAgICAgICAgICAgICAgICBwcmludCgic2hsZXg6IEkgc2VlIHdoaXRlc3BhY2UgaW4gd2hpdGVzcGFjZSBzdGF0ZSIpCiAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi50b2tlbiBvciAoc2VsZi5wb3NpeCBhbmQgcXVvdGVkKToKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgICAjIGVtaXQgY3VycmVudCB0b2tlbgogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICBlbGlmIG5leHRjaGFyIGluIHNlbGYuY29tbWVudGVyczoKICAgICAgICAgICAgICAgICAgICBzZWxmLmluc3RyZWFtLnJlYWRsaW5lKCkKICAgICAgICAgICAgICAgICAgICBzZWxmLmxpbmVubyA9IHNlbGYubGluZW5vICsgMQogICAgICAgICAgICAgICAgZWxpZiBzZWxmLnBvc2l4IGFuZCBuZXh0Y2hhciBpbiBzZWxmLmVzY2FwZToKICAgICAgICAgICAgICAgICAgICBlc2NhcGVkc3RhdGUgPSAnYScKICAgICAgICAgICAgICAgICAgICBzZWxmLnN0YXRlID0gbmV4dGNoYXIKICAgICAgICAgICAgICAgIGVsaWYgbmV4dGNoYXIgaW4gc2VsZi53b3JkY2hhcnM6CiAgICAgICAgICAgICAgICAgICAgc2VsZi50b2tlbiA9IG5leHRjaGFyCiAgICAgICAgICAgICAgICAgICAgc2VsZi5zdGF0ZSA9ICdhJwogICAgICAgICAgICAgICAgZWxpZiBuZXh0Y2hhciBpbiBzZWxmLnF1b3RlczoKICAgICAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5wb3NpeDoKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50b2tlbiA9IG5leHRjaGFyCiAgICAgICAgICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IG5leHRjaGFyCiAgICAgICAgICAgICAgICBlbGlmIHNlbGYud2hpdGVzcGFjZV9zcGxpdDoKICAgICAgICAgICAgICAgICAgICBzZWxmLnRva2VuID0gbmV4dGNoYXIKICAgICAgICAgICAgICAgICAgICBzZWxmLnN0YXRlID0gJ2EnCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHNlbGYudG9rZW4gPSBuZXh0Y2hhcgogICAgICAgICAgICAgICAgICAgIGlmIHNlbGYudG9rZW4gb3IgKHNlbGYucG9zaXggYW5kIHF1b3RlZCk6CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrICAgIyBlbWl0IGN1cnJlbnQgdG9rZW4KICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBlbGlmIHNlbGYuc3RhdGUgaW4gc2VsZi5xdW90ZXM6CiAgICAgICAgICAgICAgICBxdW90ZWQgPSBUcnVlCiAgICAgICAgICAgICAgICBpZiBub3QgbmV4dGNoYXI6ICAgICAgIyBlbmQgb2YgZmlsZQogICAgICAgICAgICAgICAgICAgIGlmIHNlbGYuZGVidWcgPj0gMjoKICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQoInNobGV4OiBJIHNlZSBFT0YgaW4gcXVvdGVzIHN0YXRlIikKICAgICAgICAgICAgICAgICAgICAjIFhYWCB3aGF0IGVycm9yIHNob3VsZCBiZSByYWlzZWQgaGVyZT8KICAgICAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCAiTm8gY2xvc2luZyBxdW90YXRpb24iCiAgICAgICAgICAgICAgICBpZiBuZXh0Y2hhciA9PSBzZWxmLnN0YXRlOgogICAgICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLnBvc2l4OgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnRva2VuID0gc2VsZi50b2tlbiArIG5leHRjaGFyCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc3RhdGUgPSAnICcKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnN0YXRlID0gJ2EnCiAgICAgICAgICAgICAgICBlbGlmIHNlbGYucG9zaXggYW5kIG5leHRjaGFyIGluIHNlbGYuZXNjYXBlIGFuZCBcCiAgICAgICAgICAgICAgICAgICAgIHNlbGYuc3RhdGUgaW4gc2VsZi5lc2NhcGVkcXVvdGVzOgogICAgICAgICAgICAgICAgICAgIGVzY2FwZWRzdGF0ZSA9IHNlbGYuc3RhdGUKICAgICAgICAgICAgICAgICAgICBzZWxmLnN0YXRlID0gbmV4dGNoYXIKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgc2VsZi50b2tlbiA9IHNlbGYudG9rZW4gKyBuZXh0Y2hhcgogICAgICAgICAgICBlbGlmIHNlbGYuc3RhdGUgaW4gc2VsZi5lc2NhcGU6CiAgICAgICAgICAgICAgICBpZiBub3QgbmV4dGNoYXI6ICAgICAgIyBlbmQgb2YgZmlsZQogICAgICAgICAgICAgICAgICAgIGlmIHNlbGYuZGVidWcgPj0gMjoKICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQoInNobGV4OiBJIHNlZSBFT0YgaW4gZXNjYXBlIHN0YXRlIikKICAgICAgICAgICAgICAgICAgICAjIFhYWCB3aGF0IGVycm9yIHNob3VsZCBiZSByYWlzZWQgaGVyZT8KICAgICAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCAiTm8gZXNjYXBlZCBjaGFyYWN0ZXIiCiAgICAgICAgICAgICAgICAjIEluIHBvc2l4IHNoZWxscywgb25seSB0aGUgcXVvdGUgaXRzZWxmIG9yIHRoZSBlc2NhcGUKICAgICAgICAgICAgICAgICMgY2hhcmFjdGVyIG1heSBiZSBlc2NhcGVkIHdpdGhpbiBxdW90ZXMuCiAgICAgICAgICAgICAgICBpZiBlc2NhcGVkc3RhdGUgaW4gc2VsZi5xdW90ZXMgYW5kIFwKICAgICAgICAgICAgICAgICAgIG5leHRjaGFyICE9IHNlbGYuc3RhdGUgYW5kIG5leHRjaGFyICE9IGVzY2FwZWRzdGF0ZToKICAgICAgICAgICAgICAgICAgICBzZWxmLnRva2VuID0gc2VsZi50b2tlbiArIHNlbGYuc3RhdGUKICAgICAgICAgICAgICAgIHNlbGYudG9rZW4gPSBzZWxmLnRva2VuICsgbmV4dGNoYXIKICAgICAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBlc2NhcGVkc3RhdGUKICAgICAgICAgICAgZWxpZiBzZWxmLnN0YXRlID09ICdhJzoKICAgICAgICAgICAgICAgIGlmIG5vdCBuZXh0Y2hhcjoKICAgICAgICAgICAgICAgICAgICBzZWxmLnN0YXRlID0gTm9uZSAgICMgZW5kIG9mIGZpbGUKICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgICAgZWxpZiBuZXh0Y2hhciBpbiBzZWxmLndoaXRlc3BhY2U6CiAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5kZWJ1ZyA+PSAyOgogICAgICAgICAgICAgICAgICAgICAgICBwcmludCgic2hsZXg6IEkgc2VlIHdoaXRlc3BhY2UgaW4gd29yZCBzdGF0ZSIpCiAgICAgICAgICAgICAgICAgICAgc2VsZi5zdGF0ZSA9ICcgJwogICAgICAgICAgICAgICAgICAgIGlmIHNlbGYudG9rZW4gb3IgKHNlbGYucG9zaXggYW5kIHF1b3RlZCk6CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrICAgIyBlbWl0IGN1cnJlbnQgdG9rZW4KICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgZWxpZiBuZXh0Y2hhciBpbiBzZWxmLmNvbW1lbnRlcnM6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5pbnN0cmVhbS5yZWFkbGluZSgpCiAgICAgICAgICAgICAgICAgICAgc2VsZi5saW5lbm8gPSBzZWxmLmxpbmVubyArIDEKICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLnBvc2l4OgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnN0YXRlID0gJyAnCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYudG9rZW4gb3IgKHNlbGYucG9zaXggYW5kIHF1b3RlZCk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhayAgICMgZW1pdCBjdXJyZW50IHRva2VuCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgZWxpZiBzZWxmLnBvc2l4IGFuZCBuZXh0Y2hhciBpbiBzZWxmLnF1b3RlczoKICAgICAgICAgICAgICAgICAgICBzZWxmLnN0YXRlID0gbmV4dGNoYXIKICAgICAgICAgICAgICAgIGVsaWYgc2VsZi5wb3NpeCBhbmQgbmV4dGNoYXIgaW4gc2VsZi5lc2NhcGU6CiAgICAgICAgICAgICAgICAgICAgZXNjYXBlZHN0YXRlID0gJ2EnCiAgICAgICAgICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IG5leHRjaGFyCiAgICAgICAgICAgICAgICBlbGlmIG5leHRjaGFyIGluIHNlbGYud29yZGNoYXJzIG9yIG5leHRjaGFyIGluIHNlbGYucXVvdGVzIFwKICAgICAgICAgICAgICAgICAgICBvciBzZWxmLndoaXRlc3BhY2Vfc3BsaXQ6CiAgICAgICAgICAgICAgICAgICAgc2VsZi50b2tlbiA9IHNlbGYudG9rZW4gKyBuZXh0Y2hhcgogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBzZWxmLnB1c2hiYWNrLmFwcGVuZGxlZnQobmV4dGNoYXIpCiAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5kZWJ1ZyA+PSAyOgogICAgICAgICAgICAgICAgICAgICAgICBwcmludCgic2hsZXg6IEkgc2VlIHB1bmN0dWF0aW9uIGluIHdvcmQgc3RhdGUiKQogICAgICAgICAgICAgICAgICAgIHNlbGYuc3RhdGUgPSAnICcKICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLnRva2VuOgogICAgICAgICAgICAgICAgICAgICAgICBicmVhayAgICMgZW1pdCBjdXJyZW50IHRva2VuCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICByZXN1bHQgPSBzZWxmLnRva2VuCiAgICAgICAgc2VsZi50b2tlbiA9ICcnCiAgICAgICAgaWYgc2VsZi5wb3NpeCBhbmQgbm90IHF1b3RlZCBhbmQgcmVzdWx0ID09ICcnOgogICAgICAgICAgICByZXN1bHQgPSBOb25lCiAgICAgICAgaWYgc2VsZi5kZWJ1ZyA+IDE6CiAgICAgICAgICAgIGlmIHJlc3VsdDoKICAgICAgICAgICAgICAgIHByaW50KCJzaGxleDogcmF3IHRva2VuPSIgKyByZXByKHJlc3VsdCkpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBwcmludCgic2hsZXg6IHJhdyB0b2tlbj1FT0YiKQogICAgICAgIHJldHVybiByZXN1bHQKCiAgICBkZWYgc291cmNlaG9vayhzZWxmLCBuZXdmaWxlKToKICAgICAgICAiSG9vayBjYWxsZWQgb24gYSBmaWxlbmFtZSB0byBiZSBzb3VyY2VkLiIKICAgICAgICBpZiBuZXdmaWxlWzBdID09ICciJzoKICAgICAgICAgICAgbmV3ZmlsZSA9IG5ld2ZpbGVbMTotMV0KICAgICAgICAjIFRoaXMgaW1wbGVtZW50cyBjcHAtbGlrZSBzZW1hbnRpY3MgZm9yIHJlbGF0aXZlLXBhdGggaW5jbHVzaW9uLgogICAgICAgIGlmIGlzaW5zdGFuY2Uoc2VsZi5pbmZpbGUsIGJhc2VzdHJpbmcpIGFuZCBub3Qgb3MucGF0aC5pc2FicyhuZXdmaWxlKToKICAgICAgICAgICAgbmV3ZmlsZSA9IG9zLnBhdGguam9pbihvcy5wYXRoLmRpcm5hbWUoc2VsZi5pbmZpbGUpLCBuZXdmaWxlKQogICAgICAgIHJldHVybiAobmV3ZmlsZSwgb3BlbihuZXdmaWxlLCAiciIpKQoKICAgIGRlZiBlcnJvcl9sZWFkZXIoc2VsZiwgaW5maWxlPU5vbmUsIGxpbmVubz1Ob25lKToKICAgICAgICAiRW1pdCBhIEMtY29tcGlsZXItbGlrZSwgRW1hY3MtZnJpZW5kbHkgZXJyb3ItbWVzc2FnZSBsZWFkZXIuIgogICAgICAgIGlmIGluZmlsZSBpcyBOb25lOgogICAgICAgICAgICBpbmZpbGUgPSBzZWxmLmluZmlsZQogICAgICAgIGlmIGxpbmVubyBpcyBOb25lOgogICAgICAgICAgICBsaW5lbm8gPSBzZWxmLmxpbmVubwogICAgICAgIHJldHVybiAiXCIlc1wiLCBsaW5lICVkOiAiICUgKGluZmlsZSwgbGluZW5vKQoKICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKICAgICAgICByZXR1cm4gc2VsZgoKICAgIGRlZiBfX25leHRfXyhzZWxmKToKICAgICAgICB0b2tlbiA9IHNlbGYuZ2V0X3Rva2VuKCkKICAgICAgICBpZiB0b2tlbiA9PSBzZWxmLmVvZjoKICAgICAgICAgICAgcmFpc2UgU3RvcEl0ZXJhdGlvbgogICAgICAgIHJldHVybiB0b2tlbgoKZGVmIHNwbGl0KHMsIGNvbW1lbnRzPUZhbHNlKToKICAgIGxleCA9IHNobGV4KHMsIHBvc2l4PVRydWUpCiAgICBsZXgud2hpdGVzcGFjZV9zcGxpdCA9IFRydWUKICAgIGlmIG5vdCBjb21tZW50czoKICAgICAgICBsZXguY29tbWVudGVycyA9ICcnCiAgICByZXR1cm4gbGlzdChsZXgpCgppZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgaWYgbGVuKHN5cy5hcmd2KSA9PSAxOgogICAgICAgIGxleGVyID0gc2hsZXgoKQogICAgZWxzZToKICAgICAgICBmaWxlID0gc3lzLmFyZ3ZbMV0KICAgICAgICBsZXhlciA9IHNobGV4KG9wZW4oZmlsZSksIGZpbGUpCiAgICB3aGlsZSAxOgogICAgICAgIHR0ID0gbGV4ZXIuZ2V0X3Rva2VuKCkKICAgICAgICBpZiB0dDoKICAgICAgICAgICAgcHJpbnQoIlRva2VuOiAiICsgcmVwcih0dCkpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgYnJlYWsK