IyAtKi0gY29kaW5nOiBpc28tODg1OS0xIC0qLQoiIiJBIGxleGljYWwgYW5hbHl6ZXIgY2xhc3MgZm9yIHNpbXBsZSBzaGVsbC1saWtlIHN5bnRheGVzLiIiIgoKIyBNb2R1bGUgYW5kIGRvY3VtZW50YXRpb24gYnkgRXJpYyBTLiBSYXltb25kLCAyMSBEZWMgMTk5OAojIElucHV0IHN0YWNraW5nIGFuZCBlcnJvciBtZXNzYWdlIGNsZWFudXAgYWRkZWQgYnkgRVNSLCBNYXJjaCAyMDAwCiMgcHVzaF9zb3VyY2UoKSBhbmQgcG9wX3NvdXJjZSgpIG1hZGUgZXhwbGljaXQgYnkgRVNSLCBKYW51YXJ5IDIwMDEuCiMgUG9zaXggY29tcGxpYW5jZSwgc3BsaXQoKSwgc3RyaW5nIGFyZ3VtZW50cywgYW5kCiMgaXRlcmF0b3IgaW50ZXJmYWNlIGJ5IEd1c3Rhdm8gTmllbWV5ZXIsIEFwcmlsIDIwMDMuCgppbXBvcnQgb3MucGF0aAppbXBvcnQgc3lzCmZyb20gY29sbGVjdGlvbnMgaW1wb3J0IGRlcXVlCgpmcm9tIGlvIGltcG9ydCBTdHJpbmdJTwoKX19hbGxfXyA9IFsic2hsZXgiLCAic3BsaXQiXQoKY2xhc3Mgc2hsZXg6CiAgICAiQSBsZXhpY2FsIGFuYWx5emVyIGNsYXNzIGZvciBzaW1wbGUgc2hlbGwtbGlrZSBzeW50YXhlcy4iCiAgICBkZWYgX19pbml0X18oc2VsZiwgaW5zdHJlYW09Tm9uZSwgaW5maWxlPU5vbmUsIHBvc2l4PUZhbHNlKToKICAgICAgICBpZiBpc2luc3RhbmNlKGluc3RyZWFtLCBzdHIpOgogICAgICAgICAgICBpbnN0cmVhbSA9IFN0cmluZ0lPKGluc3RyZWFtKQogICAgICAgIGlmIGluc3RyZWFtIGlzIG5vdCBOb25lOgogICAgICAgICAgICBzZWxmLmluc3RyZWFtID0gaW5zdHJlYW0KICAgICAgICAgICAgc2VsZi5pbmZpbGUgPSBpbmZpbGUKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLmluc3RyZWFtID0gc3lzLnN0ZGluCiAgICAgICAgICAgIHNlbGYuaW5maWxlID0gTm9uZQogICAgICAgIHNlbGYucG9zaXggPSBwb3NpeAogICAgICAgIGlmIHBvc2l4OgogICAgICAgICAgICBzZWxmLmVvZiA9IE5vbmUKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLmVvZiA9ICcnCiAgICAgICAgc2VsZi5jb21tZW50ZXJzID0gJyMnCiAgICAgICAgc2VsZi53b3JkY2hhcnMgPSAoJ2FiY2RmZWdoaWprbG1ub3BxcnN0dXZ3eHl6JwogICAgICAgICAgICAgICAgICAgICAgICAgICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWjAxMjM0NTY3ODlfJykKICAgICAgICBpZiBzZWxmLnBvc2l4OgogICAgICAgICAgICBzZWxmLndvcmRjaGFycyArPSAoJ9/g4eLj5OXm5+jp6uvs7e7v8PHy8/T19vj5+vv8/f7/JwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ8DBwsPExcbHyMnKy8zNzs/Q0dLT1NXW2Nna29zd3icpCiAgICAgICAgc2VsZi53aGl0ZXNwYWNlID0gJyBcdFxyXG4nCiAgICAgICAgc2VsZi53aGl0ZXNwYWNlX3NwbGl0ID0gRmFsc2UKICAgICAgICBzZWxmLnF1b3RlcyA9ICdcJyInCiAgICAgICAgc2VsZi5lc2NhcGUgPSAnXFwnCiAgICAgICAgc2VsZi5lc2NhcGVkcXVvdGVzID0gJyInCiAgICAgICAgc2VsZi5zdGF0ZSA9ICcgJwogICAgICAgIHNlbGYucHVzaGJhY2sgPSBkZXF1ZSgpCiAgICAgICAgc2VsZi5saW5lbm8gPSAxCiAgICAgICAgc2VsZi5kZWJ1ZyA9IDAKICAgICAgICBzZWxmLnRva2VuID0gJycKICAgICAgICBzZWxmLmZpbGVzdGFjayA9IGRlcXVlKCkKICAgICAgICBzZWxmLnNvdXJjZSA9IE5vbmUKICAgICAgICBpZiBzZWxmLmRlYnVnOgogICAgICAgICAgICBwcmludCgnc2hsZXg6IHJlYWRpbmcgZnJvbSAlcywgbGluZSAlZCcgXAogICAgICAgICAgICAgICAgICAlIChzZWxmLmluc3RyZWFtLCBzZWxmLmxpbmVubykpCgogICAgZGVmIHB1c2hfdG9rZW4oc2VsZiwgdG9rKToKICAgICAgICAiUHVzaCBhIHRva2VuIG9udG8gdGhlIHN0YWNrIHBvcHBlZCBieSB0aGUgZ2V0X3Rva2VuIG1ldGhvZCIKICAgICAgICBpZiBzZWxmLmRlYnVnID49IDE6CiAgICAgICAgICAgIHByaW50KCJzaGxleDogcHVzaGluZyB0b2tlbiAiICsgcmVwcih0b2spKQogICAgICAgIHNlbGYucHVzaGJhY2suYXBwZW5kbGVmdCh0b2spCgogICAgZGVmIHB1c2hfc291cmNlKHNlbGYsIG5ld3N0cmVhbSwgbmV3ZmlsZT1Ob25lKToKICAgICAgICAiUHVzaCBhbiBpbnB1dCBzb3VyY2Ugb250byB0aGUgbGV4ZXIncyBpbnB1dCBzb3VyY2Ugc3RhY2suIgogICAgICAgIGlmIGlzaW5zdGFuY2UobmV3c3RyZWFtLCBzdHIpOgogICAgICAgICAgICBuZXdzdHJlYW0gPSBTdHJpbmdJTyhuZXdzdHJlYW0pCiAgICAgICAgc2VsZi5maWxlc3RhY2suYXBwZW5kbGVmdCgoc2VsZi5pbmZpbGUsIHNlbGYuaW5zdHJlYW0sIHNlbGYubGluZW5vKSkKICAgICAgICBzZWxmLmluZmlsZSA9IG5ld2ZpbGUKICAgICAgICBzZWxmLmluc3RyZWFtID0gbmV3c3RyZWFtCiAgICAgICAgc2VsZi5saW5lbm8gPSAxCiAgICAgICAgaWYgc2VsZi5kZWJ1ZzoKICAgICAgICAgICAgaWYgbmV3ZmlsZSBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgIHByaW50KCdzaGxleDogcHVzaGluZyB0byBmaWxlICVzJyAlIChzZWxmLmluZmlsZSwpKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcHJpbnQoJ3NobGV4OiBwdXNoaW5nIHRvIHN0cmVhbSAlcycgJSAoc2VsZi5pbnN0cmVhbSwpKQoKICAgIGRlZiBwb3Bfc291cmNlKHNlbGYpOgogICAgICAgICJQb3AgdGhlIGlucHV0IHNvdXJjZSBzdGFjay4iCiAgICAgICAgc2VsZi5pbnN0cmVhbS5jbG9zZSgpCiAgICAgICAgKHNlbGYuaW5maWxlLCBzZWxmLmluc3RyZWFtLCBzZWxmLmxpbmVubykgPSBzZWxmLmZpbGVzdGFjay5wb3BsZWZ0KCkKICAgICAgICBpZiBzZWxmLmRlYnVnOgogICAgICAgICAgICBwcmludCgnc2hsZXg6IHBvcHBpbmcgdG8gJXMsIGxpbmUgJWQnIFwKICAgICAgICAgICAgICAgICAgJSAoc2VsZi5pbnN0cmVhbSwgc2VsZi5saW5lbm8pKQogICAgICAgIHNlbGYuc3RhdGUgPSAnICcKCiAgICBkZWYgZ2V0X3Rva2VuKHNlbGYpOgogICAgICAgICJHZXQgYSB0b2tlbiBmcm9tIHRoZSBpbnB1dCBzdHJlYW0gKG9yIGZyb20gc3RhY2sgaWYgaXQncyBub25lbXB0eSkiCiAgICAgICAgaWYgc2VsZi5wdXNoYmFjazoKICAgICAgICAgICAgdG9rID0gc2VsZi5wdXNoYmFjay5wb3BsZWZ0KCkKICAgICAgICAgICAgaWYgc2VsZi5kZWJ1ZyA+PSAxOgogICAgICAgICAgICAgICAgcHJpbnQoInNobGV4OiBwb3BwaW5nIHRva2VuICIgKyByZXByKHRvaykpCiAgICAgICAgICAgIHJldHVybiB0b2sKICAgICAgICAjIE5vIHB1c2hiYWNrLiAgR2V0IGEgdG9rZW4uCiAgICAgICAgcmF3ID0gc2VsZi5yZWFkX3Rva2VuKCkKICAgICAgICAjIEhhbmRsZSBpbmNsdXNpb25zCiAgICAgICAgaWYgc2VsZi5zb3VyY2UgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHdoaWxlIHJhdyA9PSBzZWxmLnNvdXJjZToKICAgICAgICAgICAgICAgIHNwZWMgPSBzZWxmLnNvdXJjZWhvb2soc2VsZi5yZWFkX3Rva2VuKCkpCiAgICAgICAgICAgICAgICBpZiBzcGVjOgogICAgICAgICAgICAgICAgICAgIChuZXdmaWxlLCBuZXdzdHJlYW0pID0gc3BlYwogICAgICAgICAgICAgICAgICAgIHNlbGYucHVzaF9zb3VyY2UobmV3c3RyZWFtLCBuZXdmaWxlKQogICAgICAgICAgICAgICAgcmF3ID0gc2VsZi5nZXRfdG9rZW4oKQogICAgICAgICMgTWF5YmUgd2UgZ290IEVPRiBpbnN0ZWFkPwogICAgICAgIHdoaWxlIHJhdyA9PSBzZWxmLmVvZjoKICAgICAgICAgICAgaWYgbm90IHNlbGYuZmlsZXN0YWNrOgogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuZW9mCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzZWxmLnBvcF9zb3VyY2UoKQogICAgICAgICAgICAgICAgcmF3ID0gc2VsZi5nZXRfdG9rZW4oKQogICAgICAgICMgTmVpdGhlciBpbmNsdXNpb24gbm9yIEVPRgogICAgICAgIGlmIHNlbGYuZGVidWcgPj0gMToKICAgICAgICAgICAgaWYgcmF3ICE9IHNlbGYuZW9mOgogICAgICAgICAgICAgICAgcHJpbnQoInNobGV4OiB0b2tlbj0iICsgcmVwcihyYXcpKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcHJpbnQoInNobGV4OiB0b2tlbj1FT0YiKQogICAgICAgIHJldHVybiByYXcKCiAgICBkZWYgcmVhZF90b2tlbihzZWxmKToKICAgICAgICBxdW90ZWQgPSBGYWxzZQogICAgICAgIGVzY2FwZWRzdGF0ZSA9ICcgJwogICAgICAgIHdoaWxlIFRydWU6CiAgICAgICAgICAgIG5leHRjaGFyID0gc2VsZi5pbnN0cmVhbS5yZWFkKDEpCiAgICAgICAgICAgIGlmIG5leHRjaGFyID09ICdcbic6CiAgICAgICAgICAgICAgICBzZWxmLmxpbmVubyA9IHNlbGYubGluZW5vICsgMQogICAgICAgICAgICBpZiBzZWxmLmRlYnVnID49IDM6CiAgICAgICAgICAgICAgICBwcmludCgic2hsZXg6IGluIHN0YXRlIiwgcmVwcihzZWxmLnN0YXRlKSwgXAogICAgICAgICAgICAgICAgICAgICAgIkkgc2VlIGNoYXJhY3RlcjoiLCByZXByKG5leHRjaGFyKSkKICAgICAgICAgICAgaWYgc2VsZi5zdGF0ZSBpcyBOb25lOgogICAgICAgICAgICAgICAgc2VsZi50b2tlbiA9ICcnICAgICAgICAjIHBhc3QgZW5kIG9mIGZpbGUKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgIGVsaWYgc2VsZi5zdGF0ZSA9PSAnICc6CiAgICAgICAgICAgICAgICBpZiBub3QgbmV4dGNoYXI6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IE5vbmUgICMgZW5kIG9mIGZpbGUKICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgICAgZWxpZiBuZXh0Y2hhciBpbiBzZWxmLndoaXRlc3BhY2U6CiAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5kZWJ1ZyA+PSAyOgogICAgICAgICAgICAgICAgICAgICAgICBwcmludCgic2hsZXg6IEkgc2VlIHdoaXRlc3BhY2UgaW4gd2hpdGVzcGFjZSBzdGF0ZSIpCiAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi50b2tlbiBvciAoc2VsZi5wb3NpeCBhbmQgcXVvdGVkKToKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgICAjIGVtaXQgY3VycmVudCB0b2tlbgogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICBlbGlmIG5leHRjaGFyIGluIHNlbGYuY29tbWVudGVyczoKICAgICAgICAgICAgICAgICAgICBzZWxmLmluc3RyZWFtLnJlYWRsaW5lKCkKICAgICAgICAgICAgICAgICAgICBzZWxmLmxpbmVubyA9IHNlbGYubGluZW5vICsgMQogICAgICAgICAgICAgICAgZWxpZiBzZWxmLnBvc2l4IGFuZCBuZXh0Y2hhciBpbiBzZWxmLmVzY2FwZToKICAgICAgICAgICAgICAgICAgICBlc2NhcGVkc3RhdGUgPSAnYScKICAgICAgICAgICAgICAgICAgICBzZWxmLnN0YXRlID0gbmV4dGNoYXIKICAgICAgICAgICAgICAgIGVsaWYgbmV4dGNoYXIgaW4gc2VsZi53b3JkY2hhcnM6CiAgICAgICAgICAgICAgICAgICAgc2VsZi50b2tlbiA9IG5leHRjaGFyCiAgICAgICAgICAgICAgICAgICAgc2VsZi5zdGF0ZSA9ICdhJwogICAgICAgICAgICAgICAgZWxpZiBuZXh0Y2hhciBpbiBzZWxmLnF1b3RlczoKICAgICAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5wb3NpeDoKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50b2tlbiA9IG5leHRjaGFyCiAgICAgICAgICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IG5leHRjaGFyCiAgICAgICAgICAgICAgICBlbGlmIHNlbGYud2hpdGVzcGFjZV9zcGxpdDoKICAgICAgICAgICAgICAgICAgICBzZWxmLnRva2VuID0gbmV4dGNoYXIKICAgICAgICAgICAgICAgICAgICBzZWxmLnN0YXRlID0gJ2EnCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHNlbGYudG9rZW4gPSBuZXh0Y2hhcgogICAgICAgICAgICAgICAgICAgIGlmIHNlbGYudG9rZW4gb3IgKHNlbGYucG9zaXggYW5kIHF1b3RlZCk6CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrICAgIyBlbWl0IGN1cnJlbnQgdG9rZW4KICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBlbGlmIHNlbGYuc3RhdGUgaW4gc2VsZi5xdW90ZXM6CiAgICAgICAgICAgICAgICBxdW90ZWQgPSBUcnVlCiAgICAgICAgICAgICAgICBpZiBub3QgbmV4dGNoYXI6ICAgICAgIyBlbmQgb2YgZmlsZQogICAgICAgICAgICAgICAgICAgIGlmIHNlbGYuZGVidWcgPj0gMjoKICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQoInNobGV4OiBJIHNlZSBFT0YgaW4gcXVvdGVzIHN0YXRlIikKICAgICAgICAgICAgICAgICAgICAjIFhYWCB3aGF0IGVycm9yIHNob3VsZCBiZSByYWlzZWQgaGVyZT8KICAgICAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJObyBjbG9zaW5nIHF1b3RhdGlvbiIpCiAgICAgICAgICAgICAgICBpZiBuZXh0Y2hhciA9PSBzZWxmLnN0YXRlOgogICAgICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLnBvc2l4OgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnRva2VuID0gc2VsZi50b2tlbiArIG5leHRjaGFyCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc3RhdGUgPSAnICcKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnN0YXRlID0gJ2EnCiAgICAgICAgICAgICAgICBlbGlmIHNlbGYucG9zaXggYW5kIG5leHRjaGFyIGluIHNlbGYuZXNjYXBlIGFuZCBcCiAgICAgICAgICAgICAgICAgICAgIHNlbGYuc3RhdGUgaW4gc2VsZi5lc2NhcGVkcXVvdGVzOgogICAgICAgICAgICAgICAgICAgIGVzY2FwZWRzdGF0ZSA9IHNlbGYuc3RhdGUKICAgICAgICAgICAgICAgICAgICBzZWxmLnN0YXRlID0gbmV4dGNoYXIKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgc2VsZi50b2tlbiA9IHNlbGYudG9rZW4gKyBuZXh0Y2hhcgogICAgICAgICAgICBlbGlmIHNlbGYuc3RhdGUgaW4gc2VsZi5lc2NhcGU6CiAgICAgICAgICAgICAgICBpZiBub3QgbmV4dGNoYXI6ICAgICAgIyBlbmQgb2YgZmlsZQogICAgICAgICAgICAgICAgICAgIGlmIHNlbGYuZGVidWcgPj0gMjoKICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQoInNobGV4OiBJIHNlZSBFT0YgaW4gZXNjYXBlIHN0YXRlIikKICAgICAgICAgICAgICAgICAgICAjIFhYWCB3aGF0IGVycm9yIHNob3VsZCBiZSByYWlzZWQgaGVyZT8KICAgICAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJObyBlc2NhcGVkIGNoYXJhY3RlciIpCiAgICAgICAgICAgICAgICAjIEluIHBvc2l4IHNoZWxscywgb25seSB0aGUgcXVvdGUgaXRzZWxmIG9yIHRoZSBlc2NhcGUKICAgICAgICAgICAgICAgICMgY2hhcmFjdGVyIG1heSBiZSBlc2NhcGVkIHdpdGhpbiBxdW90ZXMuCiAgICAgICAgICAgICAgICBpZiBlc2NhcGVkc3RhdGUgaW4gc2VsZi5xdW90ZXMgYW5kIFwKICAgICAgICAgICAgICAgICAgIG5leHRjaGFyICE9IHNlbGYuc3RhdGUgYW5kIG5leHRjaGFyICE9IGVzY2FwZWRzdGF0ZToKICAgICAgICAgICAgICAgICAgICBzZWxmLnRva2VuID0gc2VsZi50b2tlbiArIHNlbGYuc3RhdGUKICAgICAgICAgICAgICAgIHNlbGYudG9rZW4gPSBzZWxmLnRva2VuICsgbmV4dGNoYXIKICAgICAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBlc2NhcGVkc3RhdGUKICAgICAgICAgICAgZWxpZiBzZWxmLnN0YXRlID09ICdhJzoKICAgICAgICAgICAgICAgIGlmIG5vdCBuZXh0Y2hhcjoKICAgICAgICAgICAgICAgICAgICBzZWxmLnN0YXRlID0gTm9uZSAgICMgZW5kIG9mIGZpbGUKICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgICAgZWxpZiBuZXh0Y2hhciBpbiBzZWxmLndoaXRlc3BhY2U6CiAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5kZWJ1ZyA+PSAyOgogICAgICAgICAgICAgICAgICAgICAgICBwcmludCgic2hsZXg6IEkgc2VlIHdoaXRlc3BhY2UgaW4gd29yZCBzdGF0ZSIpCiAgICAgICAgICAgICAgICAgICAgc2VsZi5zdGF0ZSA9ICcgJwogICAgICAgICAgICAgICAgICAgIGlmIHNlbGYudG9rZW4gb3IgKHNlbGYucG9zaXggYW5kIHF1b3RlZCk6CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrICAgIyBlbWl0IGN1cnJlbnQgdG9rZW4KICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgZWxpZiBuZXh0Y2hhciBpbiBzZWxmLmNvbW1lbnRlcnM6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5pbnN0cmVhbS5yZWFkbGluZSgpCiAgICAgICAgICAgICAgICAgICAgc2VsZi5saW5lbm8gPSBzZWxmLmxpbmVubyArIDEKICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLnBvc2l4OgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnN0YXRlID0gJyAnCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYudG9rZW4gb3IgKHNlbGYucG9zaXggYW5kIHF1b3RlZCk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhayAgICMgZW1pdCBjdXJyZW50IHRva2VuCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgZWxpZiBzZWxmLnBvc2l4IGFuZCBuZXh0Y2hhciBpbiBzZWxmLnF1b3RlczoKICAgICAgICAgICAgICAgICAgICBzZWxmLnN0YXRlID0gbmV4dGNoYXIKICAgICAgICAgICAgICAgIGVsaWYgc2VsZi5wb3NpeCBhbmQgbmV4dGNoYXIgaW4gc2VsZi5lc2NhcGU6CiAgICAgICAgICAgICAgICAgICAgZXNjYXBlZHN0YXRlID0gJ2EnCiAgICAgICAgICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IG5leHRjaGFyCiAgICAgICAgICAgICAgICBlbGlmIG5leHRjaGFyIGluIHNlbGYud29yZGNoYXJzIG9yIG5leHRjaGFyIGluIHNlbGYucXVvdGVzIFwKICAgICAgICAgICAgICAgICAgICBvciBzZWxmLndoaXRlc3BhY2Vfc3BsaXQ6CiAgICAgICAgICAgICAgICAgICAgc2VsZi50b2tlbiA9IHNlbGYudG9rZW4gKyBuZXh0Y2hhcgogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBzZWxmLnB1c2hiYWNrLmFwcGVuZGxlZnQobmV4dGNoYXIpCiAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5kZWJ1ZyA+PSAyOgogICAgICAgICAgICAgICAgICAgICAgICBwcmludCgic2hsZXg6IEkgc2VlIHB1bmN0dWF0aW9uIGluIHdvcmQgc3RhdGUiKQogICAgICAgICAgICAgICAgICAgIHNlbGYuc3RhdGUgPSAnICcKICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLnRva2VuOgogICAgICAgICAgICAgICAgICAgICAgICBicmVhayAgICMgZW1pdCBjdXJyZW50IHRva2VuCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICByZXN1bHQgPSBzZWxmLnRva2VuCiAgICAgICAgc2VsZi50b2tlbiA9ICcnCiAgICAgICAgaWYgc2VsZi5wb3NpeCBhbmQgbm90IHF1b3RlZCBhbmQgcmVzdWx0ID09ICcnOgogICAgICAgICAgICByZXN1bHQgPSBOb25lCiAgICAgICAgaWYgc2VsZi5kZWJ1ZyA+IDE6CiAgICAgICAgICAgIGlmIHJlc3VsdDoKICAgICAgICAgICAgICAgIHByaW50KCJzaGxleDogcmF3IHRva2VuPSIgKyByZXByKHJlc3VsdCkpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBwcmludCgic2hsZXg6IHJhdyB0b2tlbj1FT0YiKQogICAgICAgIHJldHVybiByZXN1bHQKCiAgICBkZWYgc291cmNlaG9vayhzZWxmLCBuZXdmaWxlKToKICAgICAgICAiSG9vayBjYWxsZWQgb24gYSBmaWxlbmFtZSB0byBiZSBzb3VyY2VkLiIKICAgICAgICBpZiBuZXdmaWxlWzBdID09ICciJzoKICAgICAgICAgICAgbmV3ZmlsZSA9IG5ld2ZpbGVbMTotMV0KICAgICAgICAjIFRoaXMgaW1wbGVtZW50cyBjcHAtbGlrZSBzZW1hbnRpY3MgZm9yIHJlbGF0aXZlLXBhdGggaW5jbHVzaW9uLgogICAgICAgIGlmIGlzaW5zdGFuY2Uoc2VsZi5pbmZpbGUsIHN0cikgYW5kIG5vdCBvcy5wYXRoLmlzYWJzKG5ld2ZpbGUpOgogICAgICAgICAgICBuZXdmaWxlID0gb3MucGF0aC5qb2luKG9zLnBhdGguZGlybmFtZShzZWxmLmluZmlsZSksIG5ld2ZpbGUpCiAgICAgICAgcmV0dXJuIChuZXdmaWxlLCBvcGVuKG5ld2ZpbGUsICJyIikpCgogICAgZGVmIGVycm9yX2xlYWRlcihzZWxmLCBpbmZpbGU9Tm9uZSwgbGluZW5vPU5vbmUpOgogICAgICAgICJFbWl0IGEgQy1jb21waWxlci1saWtlLCBFbWFjcy1mcmllbmRseSBlcnJvci1tZXNzYWdlIGxlYWRlci4iCiAgICAgICAgaWYgaW5maWxlIGlzIE5vbmU6CiAgICAgICAgICAgIGluZmlsZSA9IHNlbGYuaW5maWxlCiAgICAgICAgaWYgbGluZW5vIGlzIE5vbmU6CiAgICAgICAgICAgIGxpbmVubyA9IHNlbGYubGluZW5vCiAgICAgICAgcmV0dXJuICJcIiVzXCIsIGxpbmUgJWQ6ICIgJSAoaW5maWxlLCBsaW5lbm8pCgogICAgZGVmIF9faXRlcl9fKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmCgogICAgZGVmIF9fbmV4dF9fKHNlbGYpOgogICAgICAgIHRva2VuID0gc2VsZi5nZXRfdG9rZW4oKQogICAgICAgIGlmIHRva2VuID09IHNlbGYuZW9mOgogICAgICAgICAgICByYWlzZSBTdG9wSXRlcmF0aW9uCiAgICAgICAgcmV0dXJuIHRva2VuCgpkZWYgc3BsaXQocywgY29tbWVudHM9RmFsc2UsIHBvc2l4PVRydWUpOgogICAgbGV4ID0gc2hsZXgocywgcG9zaXg9cG9zaXgpCiAgICBsZXgud2hpdGVzcGFjZV9zcGxpdCA9IFRydWUKICAgIGlmIG5vdCBjb21tZW50czoKICAgICAgICBsZXguY29tbWVudGVycyA9ICcnCiAgICByZXR1cm4gbGlzdChsZXgpCgppZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgaWYgbGVuKHN5cy5hcmd2KSA9PSAxOgogICAgICAgIGxleGVyID0gc2hsZXgoKQogICAgZWxzZToKICAgICAgICBmaWxlID0gc3lzLmFyZ3ZbMV0KICAgICAgICBsZXhlciA9IHNobGV4KG9wZW4oZmlsZSksIGZpbGUpCiAgICB3aGlsZSAxOgogICAgICAgIHR0ID0gbGV4ZXIuZ2V0X3Rva2VuKCkKICAgICAgICBpZiB0dDoKICAgICAgICAgICAgcHJpbnQoIlRva2VuOiAiICsgcmVwcih0dCkpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgYnJlYWsK