IyAtKi0gY29kaW5nOiBpc28tODg1OS0xIC0qLQoiIiJBIGxleGljYWwgYW5hbHl6ZXIgY2xhc3MgZm9yIHNpbXBsZSBzaGVsbC1saWtlIHN5bnRheGVzLiIiIgoKIyBNb2R1bGUgYW5kIGRvY3VtZW50YXRpb24gYnkgRXJpYyBTLiBSYXltb25kLCAyMSBEZWMgMTk5OAojIElucHV0IHN0YWNraW5nIGFuZCBlcnJvciBtZXNzYWdlIGNsZWFudXAgYWRkZWQgYnkgRVNSLCBNYXJjaCAyMDAwCiMgcHVzaF9zb3VyY2UoKSBhbmQgcG9wX3NvdXJjZSgpIG1hZGUgZXhwbGljaXQgYnkgRVNSLCBKYW51YXJ5IDIwMDEuCiMgUG9zaXggY29tcGxpYW5jZSwgc3BsaXQoKSwgc3RyaW5nIGFyZ3VtZW50cywgYW5kCiMgaXRlcmF0b3IgaW50ZXJmYWNlIGJ5IEd1c3Rhdm8gTmllbWV5ZXIsIEFwcmlsIDIwMDMuCgppbXBvcnQgb3MucGF0aAppbXBvcnQgc3lzCmZyb20gY29sbGVjdGlvbnMgaW1wb3J0IGRlcXVlCgp0cnk6CiAgICBmcm9tIGNTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KZXhjZXB0IEltcG9ydEVycm9yOgogICAgZnJvbSBTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KCl9fYWxsX18gPSBbInNobGV4IiwgInNwbGl0Il0KCmNsYXNzIHNobGV4OgogICAgIkEgbGV4aWNhbCBhbmFseXplciBjbGFzcyBmb3Igc2ltcGxlIHNoZWxsLWxpa2Ugc3ludGF4ZXMuIgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGluc3RyZWFtPU5vbmUsIGluZmlsZT1Ob25lLCBwb3NpeD1GYWxzZSk6CiAgICAgICAgaWYgaXNpbnN0YW5jZShpbnN0cmVhbSwgYmFzZXN0cmluZyk6CiAgICAgICAgICAgIGluc3RyZWFtID0gU3RyaW5nSU8oaW5zdHJlYW0pCiAgICAgICAgaWYgaW5zdHJlYW0gaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHNlbGYuaW5zdHJlYW0gPSBpbnN0cmVhbQogICAgICAgICAgICBzZWxmLmluZmlsZSA9IGluZmlsZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuaW5zdHJlYW0gPSBzeXMuc3RkaW4KICAgICAgICAgICAgc2VsZi5pbmZpbGUgPSBOb25lCiAgICAgICAgc2VsZi5wb3NpeCA9IHBvc2l4CiAgICAgICAgaWYgcG9zaXg6CiAgICAgICAgICAgIHNlbGYuZW9mID0gTm9uZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuZW9mID0gJycKICAgICAgICBzZWxmLmNvbW1lbnRlcnMgPSAnIycKICAgICAgICBzZWxmLndvcmRjaGFycyA9ICgnYWJjZGZlZ2hpamtsbW5vcHFyc3R1dnd4eXonCiAgICAgICAgICAgICAgICAgICAgICAgICAgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaMDEyMzQ1Njc4OV8nKQogICAgICAgIGlmIHNlbGYucG9zaXg6CiAgICAgICAgICAgIHNlbGYud29yZGNoYXJzICs9ICgn3+Dh4uPk5ebn6Onq6+zt7u/w8fLz9PX2+Pn6+/z9/v8nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnwMHCw8TFxsfIycrLzM3Oz9DR0tPU1dbY2drb3N3eJykKICAgICAgICBzZWxmLndoaXRlc3BhY2UgPSAnIFx0XHJcbicKICAgICAgICBzZWxmLndoaXRlc3BhY2Vfc3BsaXQgPSBGYWxzZQogICAgICAgIHNlbGYucXVvdGVzID0gJ1wnIicKICAgICAgICBzZWxmLmVzY2FwZSA9ICdcXCcKICAgICAgICBzZWxmLmVzY2FwZWRxdW90ZXMgPSAnIicKICAgICAgICBzZWxmLnN0YXRlID0gJyAnCiAgICAgICAgc2VsZi5wdXNoYmFjayA9IGRlcXVlKCkKICAgICAgICBzZWxmLmxpbmVubyA9IDEKICAgICAgICBzZWxmLmRlYnVnID0gMAogICAgICAgIHNlbGYudG9rZW4gPSAnJwogICAgICAgIHNlbGYuZmlsZXN0YWNrID0gZGVxdWUoKQogICAgICAgIHNlbGYuc291cmNlID0gTm9uZQogICAgICAgIGlmIHNlbGYuZGVidWc6CiAgICAgICAgICAgIHByaW50ICdzaGxleDogcmVhZGluZyBmcm9tICVzLCBsaW5lICVkJyBcCiAgICAgICAgICAgICAgICAgICUgKHNlbGYuaW5zdHJlYW0sIHNlbGYubGluZW5vKQoKICAgIGRlZiBwdXNoX3Rva2VuKHNlbGYsIHRvayk6CiAgICAgICAgIlB1c2ggYSB0b2tlbiBvbnRvIHRoZSBzdGFjayBwb3BwZWQgYnkgdGhlIGdldF90b2tlbiBtZXRob2QiCiAgICAgICAgaWYgc2VsZi5kZWJ1ZyA+PSAxOgogICAgICAgICAgICBwcmludCAic2hsZXg6IHB1c2hpbmcgdG9rZW4gIiArIHJlcHIodG9rKQogICAgICAgIHNlbGYucHVzaGJhY2suYXBwZW5kbGVmdCh0b2spCgogICAgZGVmIHB1c2hfc291cmNlKHNlbGYsIG5ld3N0cmVhbSwgbmV3ZmlsZT1Ob25lKToKICAgICAgICAiUHVzaCBhbiBpbnB1dCBzb3VyY2Ugb250byB0aGUgbGV4ZXIncyBpbnB1dCBzb3VyY2Ugc3RhY2suIgogICAgICAgIGlmIGlzaW5zdGFuY2UobmV3c3RyZWFtLCBiYXNlc3RyaW5nKToKICAgICAgICAgICAgbmV3c3RyZWFtID0gU3RyaW5nSU8obmV3c3RyZWFtKQogICAgICAgIHNlbGYuZmlsZXN0YWNrLmFwcGVuZGxlZnQoKHNlbGYuaW5maWxlLCBzZWxmLmluc3RyZWFtLCBzZWxmLmxpbmVubykpCiAgICAgICAgc2VsZi5pbmZpbGUgPSBuZXdmaWxlCiAgICAgICAgc2VsZi5pbnN0cmVhbSA9IG5ld3N0cmVhbQogICAgICAgIHNlbGYubGluZW5vID0gMQogICAgICAgIGlmIHNlbGYuZGVidWc6CiAgICAgICAgICAgIGlmIG5ld2ZpbGUgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICBwcmludCAnc2hsZXg6IHB1c2hpbmcgdG8gZmlsZSAlcycgJSAoc2VsZi5pbmZpbGUsKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcHJpbnQgJ3NobGV4OiBwdXNoaW5nIHRvIHN0cmVhbSAlcycgJSAoc2VsZi5pbnN0cmVhbSwpCgogICAgZGVmIHBvcF9zb3VyY2Uoc2VsZik6CiAgICAgICAgIlBvcCB0aGUgaW5wdXQgc291cmNlIHN0YWNrLiIKICAgICAgICBzZWxmLmluc3RyZWFtLmNsb3NlKCkKICAgICAgICAoc2VsZi5pbmZpbGUsIHNlbGYuaW5zdHJlYW0sIHNlbGYubGluZW5vKSA9IHNlbGYuZmlsZXN0YWNrLnBvcGxlZnQoKQogICAgICAgIGlmIHNlbGYuZGVidWc6CiAgICAgICAgICAgIHByaW50ICdzaGxleDogcG9wcGluZyB0byAlcywgbGluZSAlZCcgXAogICAgICAgICAgICAgICAgICAlIChzZWxmLmluc3RyZWFtLCBzZWxmLmxpbmVubykKICAgICAgICBzZWxmLnN0YXRlID0gJyAnCgogICAgZGVmIGdldF90b2tlbihzZWxmKToKICAgICAgICAiR2V0IGEgdG9rZW4gZnJvbSB0aGUgaW5wdXQgc3RyZWFtIChvciBmcm9tIHN0YWNrIGlmIGl0J3Mgbm9uZW1wdHkpIgogICAgICAgIGlmIHNlbGYucHVzaGJhY2s6CiAgICAgICAgICAgIHRvayA9IHNlbGYucHVzaGJhY2sucG9wbGVmdCgpCiAgICAgICAgICAgIGlmIHNlbGYuZGVidWcgPj0gMToKICAgICAgICAgICAgICAgIHByaW50ICJzaGxleDogcG9wcGluZyB0b2tlbiAiICsgcmVwcih0b2spCiAgICAgICAgICAgIHJldHVybiB0b2sKICAgICAgICAjIE5vIHB1c2hiYWNrLiAgR2V0IGEgdG9rZW4uCiAgICAgICAgcmF3ID0gc2VsZi5yZWFkX3Rva2VuKCkKICAgICAgICAjIEhhbmRsZSBpbmNsdXNpb25zCiAgICAgICAgaWYgc2VsZi5zb3VyY2UgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHdoaWxlIHJhdyA9PSBzZWxmLnNvdXJjZToKICAgICAgICAgICAgICAgIHNwZWMgPSBzZWxmLnNvdXJjZWhvb2soc2VsZi5yZWFkX3Rva2VuKCkpCiAgICAgICAgICAgICAgICBpZiBzcGVjOgogICAgICAgICAgICAgICAgICAgIChuZXdmaWxlLCBuZXdzdHJlYW0pID0gc3BlYwogICAgICAgICAgICAgICAgICAgIHNlbGYucHVzaF9zb3VyY2UobmV3c3RyZWFtLCBuZXdmaWxlKQogICAgICAgICAgICAgICAgcmF3ID0gc2VsZi5nZXRfdG9rZW4oKQogICAgICAgICMgTWF5YmUgd2UgZ290IEVPRiBpbnN0ZWFkPwogICAgICAgIHdoaWxlIHJhdyA9PSBzZWxmLmVvZjoKICAgICAgICAgICAgaWYgbm90IHNlbGYuZmlsZXN0YWNrOgogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuZW9mCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzZWxmLnBvcF9zb3VyY2UoKQogICAgICAgICAgICAgICAgcmF3ID0gc2VsZi5nZXRfdG9rZW4oKQogICAgICAgICMgTmVpdGhlciBpbmNsdXNpb24gbm9yIEVPRgogICAgICAgIGlmIHNlbGYuZGVidWcgPj0gMToKICAgICAgICAgICAgaWYgcmF3ICE9IHNlbGYuZW9mOgogICAgICAgICAgICAgICAgcHJpbnQgInNobGV4OiB0b2tlbj0iICsgcmVwcihyYXcpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBwcmludCAic2hsZXg6IHRva2VuPUVPRiIKICAgICAgICByZXR1cm4gcmF3CgogICAgZGVmIHJlYWRfdG9rZW4oc2VsZik6CiAgICAgICAgcXVvdGVkID0gRmFsc2UKICAgICAgICBlc2NhcGVkc3RhdGUgPSAnICcKICAgICAgICB3aGlsZSBUcnVlOgogICAgICAgICAgICBuZXh0Y2hhciA9IHNlbGYuaW5zdHJlYW0ucmVhZCgxKQogICAgICAgICAgICBpZiBuZXh0Y2hhciA9PSAnXG4nOgogICAgICAgICAgICAgICAgc2VsZi5saW5lbm8gPSBzZWxmLmxpbmVubyArIDEKICAgICAgICAgICAgaWYgc2VsZi5kZWJ1ZyA+PSAzOgogICAgICAgICAgICAgICAgcHJpbnQgInNobGV4OiBpbiBzdGF0ZSIsIHJlcHIoc2VsZi5zdGF0ZSksIFwKICAgICAgICAgICAgICAgICAgICAgICJJIHNlZSBjaGFyYWN0ZXI6IiwgcmVwcihuZXh0Y2hhcikKICAgICAgICAgICAgaWYgc2VsZi5zdGF0ZSBpcyBOb25lOgogICAgICAgICAgICAgICAgc2VsZi50b2tlbiA9ICcnICAgICAgICAjIHBhc3QgZW5kIG9mIGZpbGUKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgIGVsaWYgc2VsZi5zdGF0ZSA9PSAnICc6CiAgICAgICAgICAgICAgICBpZiBub3QgbmV4dGNoYXI6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IE5vbmUgICMgZW5kIG9mIGZpbGUKICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgICAgZWxpZiBuZXh0Y2hhciBpbiBzZWxmLndoaXRlc3BhY2U6CiAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5kZWJ1ZyA+PSAyOgogICAgICAgICAgICAgICAgICAgICAgICBwcmludCAic2hsZXg6IEkgc2VlIHdoaXRlc3BhY2UgaW4gd2hpdGVzcGFjZSBzdGF0ZSIKICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLnRva2VuIG9yIChzZWxmLnBvc2l4IGFuZCBxdW90ZWQpOgogICAgICAgICAgICAgICAgICAgICAgICBicmVhayAgICMgZW1pdCBjdXJyZW50IHRva2VuCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgIGVsaWYgbmV4dGNoYXIgaW4gc2VsZi5jb21tZW50ZXJzOgogICAgICAgICAgICAgICAgICAgIHNlbGYuaW5zdHJlYW0ucmVhZGxpbmUoKQogICAgICAgICAgICAgICAgICAgIHNlbGYubGluZW5vID0gc2VsZi5saW5lbm8gKyAxCiAgICAgICAgICAgICAgICBlbGlmIHNlbGYucG9zaXggYW5kIG5leHRjaGFyIGluIHNlbGYuZXNjYXBlOgogICAgICAgICAgICAgICAgICAgIGVzY2FwZWRzdGF0ZSA9ICdhJwogICAgICAgICAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBuZXh0Y2hhcgogICAgICAgICAgICAgICAgZWxpZiBuZXh0Y2hhciBpbiBzZWxmLndvcmRjaGFyczoKICAgICAgICAgICAgICAgICAgICBzZWxmLnRva2VuID0gbmV4dGNoYXIKICAgICAgICAgICAgICAgICAgICBzZWxmLnN0YXRlID0gJ2EnCiAgICAgICAgICAgICAgICBlbGlmIG5leHRjaGFyIGluIHNlbGYucXVvdGVzOgogICAgICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLnBvc2l4OgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnRva2VuID0gbmV4dGNoYXIKICAgICAgICAgICAgICAgICAgICBzZWxmLnN0YXRlID0gbmV4dGNoYXIKICAgICAgICAgICAgICAgIGVsaWYgc2VsZi53aGl0ZXNwYWNlX3NwbGl0OgogICAgICAgICAgICAgICAgICAgIHNlbGYudG9rZW4gPSBuZXh0Y2hhcgogICAgICAgICAgICAgICAgICAgIHNlbGYuc3RhdGUgPSAnYScKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgc2VsZi50b2tlbiA9IG5leHRjaGFyCiAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi50b2tlbiBvciAoc2VsZi5wb3NpeCBhbmQgcXVvdGVkKToKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgICAjIGVtaXQgY3VycmVudCB0b2tlbgogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIGVsaWYgc2VsZi5zdGF0ZSBpbiBzZWxmLnF1b3RlczoKICAgICAgICAgICAgICAgIHF1b3RlZCA9IFRydWUKICAgICAgICAgICAgICAgIGlmIG5vdCBuZXh0Y2hhcjogICAgICAjIGVuZCBvZiBmaWxlCiAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5kZWJ1ZyA+PSAyOgogICAgICAgICAgICAgICAgICAgICAgICBwcmludCAic2hsZXg6IEkgc2VlIEVPRiBpbiBxdW90ZXMgc3RhdGUiCiAgICAgICAgICAgICAgICAgICAgIyBYWFggd2hhdCBlcnJvciBzaG91bGQgYmUgcmFpc2VkIGhlcmU/CiAgICAgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgIk5vIGNsb3NpbmcgcXVvdGF0aW9uIgogICAgICAgICAgICAgICAgaWYgbmV4dGNoYXIgPT0gc2VsZi5zdGF0ZToKICAgICAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5wb3NpeDoKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50b2tlbiA9IHNlbGYudG9rZW4gKyBuZXh0Y2hhcgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnN0YXRlID0gJyAnCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zdGF0ZSA9ICdhJwogICAgICAgICAgICAgICAgZWxpZiBzZWxmLnBvc2l4IGFuZCBuZXh0Y2hhciBpbiBzZWxmLmVzY2FwZSBhbmQgXAogICAgICAgICAgICAgICAgICAgICBzZWxmLnN0YXRlIGluIHNlbGYuZXNjYXBlZHF1b3RlczoKICAgICAgICAgICAgICAgICAgICBlc2NhcGVkc3RhdGUgPSBzZWxmLnN0YXRlCiAgICAgICAgICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IG5leHRjaGFyCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHNlbGYudG9rZW4gPSBzZWxmLnRva2VuICsgbmV4dGNoYXIKICAgICAgICAgICAgZWxpZiBzZWxmLnN0YXRlIGluIHNlbGYuZXNjYXBlOgogICAgICAgICAgICAgICAgaWYgbm90IG5leHRjaGFyOiAgICAgICMgZW5kIG9mIGZpbGUKICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLmRlYnVnID49IDI6CiAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ICJzaGxleDogSSBzZWUgRU9GIGluIGVzY2FwZSBzdGF0ZSIKICAgICAgICAgICAgICAgICAgICAjIFhYWCB3aGF0IGVycm9yIHNob3VsZCBiZSByYWlzZWQgaGVyZT8KICAgICAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCAiTm8gZXNjYXBlZCBjaGFyYWN0ZXIiCiAgICAgICAgICAgICAgICAjIEluIHBvc2l4IHNoZWxscywgb25seSB0aGUgcXVvdGUgaXRzZWxmIG9yIHRoZSBlc2NhcGUKICAgICAgICAgICAgICAgICMgY2hhcmFjdGVyIG1heSBiZSBlc2NhcGVkIHdpdGhpbiBxdW90ZXMuCiAgICAgICAgICAgICAgICBpZiBlc2NhcGVkc3RhdGUgaW4gc2VsZi5xdW90ZXMgYW5kIFwKICAgICAgICAgICAgICAgICAgIG5leHRjaGFyICE9IHNlbGYuc3RhdGUgYW5kIG5leHRjaGFyICE9IGVzY2FwZWRzdGF0ZToKICAgICAgICAgICAgICAgICAgICBzZWxmLnRva2VuID0gc2VsZi50b2tlbiArIHNlbGYuc3RhdGUKICAgICAgICAgICAgICAgIHNlbGYudG9rZW4gPSBzZWxmLnRva2VuICsgbmV4dGNoYXIKICAgICAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBlc2NhcGVkc3RhdGUKICAgICAgICAgICAgZWxpZiBzZWxmLnN0YXRlID09ICdhJzoKICAgICAgICAgICAgICAgIGlmIG5vdCBuZXh0Y2hhcjoKICAgICAgICAgICAgICAgICAgICBzZWxmLnN0YXRlID0gTm9uZSAgICMgZW5kIG9mIGZpbGUKICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgICAgZWxpZiBuZXh0Y2hhciBpbiBzZWxmLndoaXRlc3BhY2U6CiAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5kZWJ1ZyA+PSAyOgogICAgICAgICAgICAgICAgICAgICAgICBwcmludCAic2hsZXg6IEkgc2VlIHdoaXRlc3BhY2UgaW4gd29yZCBzdGF0ZSIKICAgICAgICAgICAgICAgICAgICBzZWxmLnN0YXRlID0gJyAnCiAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi50b2tlbiBvciAoc2VsZi5wb3NpeCBhbmQgcXVvdGVkKToKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgICAjIGVtaXQgY3VycmVudCB0b2tlbgogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICBlbGlmIG5leHRjaGFyIGluIHNlbGYuY29tbWVudGVyczoKICAgICAgICAgICAgICAgICAgICBzZWxmLmluc3RyZWFtLnJlYWRsaW5lKCkKICAgICAgICAgICAgICAgICAgICBzZWxmLmxpbmVubyA9IHNlbGYubGluZW5vICsgMQogICAgICAgICAgICAgICAgICAgIGlmIHNlbGYucG9zaXg6CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc3RhdGUgPSAnICcKICAgICAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi50b2tlbiBvciAoc2VsZi5wb3NpeCBhbmQgcXVvdGVkKToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrICAgIyBlbWl0IGN1cnJlbnQgdG9rZW4KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICBlbGlmIHNlbGYucG9zaXggYW5kIG5leHRjaGFyIGluIHNlbGYucXVvdGVzOgogICAgICAgICAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBuZXh0Y2hhcgogICAgICAgICAgICAgICAgZWxpZiBzZWxmLnBvc2l4IGFuZCBuZXh0Y2hhciBpbiBzZWxmLmVzY2FwZToKICAgICAgICAgICAgICAgICAgICBlc2NhcGVkc3RhdGUgPSAnYScKICAgICAgICAgICAgICAgICAgICBzZWxmLnN0YXRlID0gbmV4dGNoYXIKICAgICAgICAgICAgICAgIGVsaWYgbmV4dGNoYXIgaW4gc2VsZi53b3JkY2hhcnMgb3IgbmV4dGNoYXIgaW4gc2VsZi5xdW90ZXMgXAogICAgICAgICAgICAgICAgICAgIG9yIHNlbGYud2hpdGVzcGFjZV9zcGxpdDoKICAgICAgICAgICAgICAgICAgICBzZWxmLnRva2VuID0gc2VsZi50b2tlbiArIG5leHRjaGFyCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHNlbGYucHVzaGJhY2suYXBwZW5kbGVmdChuZXh0Y2hhcikKICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLmRlYnVnID49IDI6CiAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ICJzaGxleDogSSBzZWUgcHVuY3R1YXRpb24gaW4gd29yZCBzdGF0ZSIKICAgICAgICAgICAgICAgICAgICBzZWxmLnN0YXRlID0gJyAnCiAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi50b2tlbjoKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgICAjIGVtaXQgY3VycmVudCB0b2tlbgogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgcmVzdWx0ID0gc2VsZi50b2tlbgogICAgICAgIHNlbGYudG9rZW4gPSAnJwogICAgICAgIGlmIHNlbGYucG9zaXggYW5kIG5vdCBxdW90ZWQgYW5kIHJlc3VsdCA9PSAnJzoKICAgICAgICAgICAgcmVzdWx0ID0gTm9uZQogICAgICAgIGlmIHNlbGYuZGVidWcgPiAxOgogICAgICAgICAgICBpZiByZXN1bHQ6CiAgICAgICAgICAgICAgICBwcmludCAic2hsZXg6IHJhdyB0b2tlbj0iICsgcmVwcihyZXN1bHQpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBwcmludCAic2hsZXg6IHJhdyB0b2tlbj1FT0YiCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgIGRlZiBzb3VyY2Vob29rKHNlbGYsIG5ld2ZpbGUpOgogICAgICAgICJIb29rIGNhbGxlZCBvbiBhIGZpbGVuYW1lIHRvIGJlIHNvdXJjZWQuIgogICAgICAgIGlmIG5ld2ZpbGVbMF0gPT0gJyInOgogICAgICAgICAgICBuZXdmaWxlID0gbmV3ZmlsZVsxOi0xXQogICAgICAgICMgVGhpcyBpbXBsZW1lbnRzIGNwcC1saWtlIHNlbWFudGljcyBmb3IgcmVsYXRpdmUtcGF0aCBpbmNsdXNpb24uCiAgICAgICAgaWYgaXNpbnN0YW5jZShzZWxmLmluZmlsZSwgYmFzZXN0cmluZykgYW5kIG5vdCBvcy5wYXRoLmlzYWJzKG5ld2ZpbGUpOgogICAgICAgICAgICBuZXdmaWxlID0gb3MucGF0aC5qb2luKG9zLnBhdGguZGlybmFtZShzZWxmLmluZmlsZSksIG5ld2ZpbGUpCiAgICAgICAgcmV0dXJuIChuZXdmaWxlLCBvcGVuKG5ld2ZpbGUsICJyIikpCgogICAgZGVmIGVycm9yX2xlYWRlcihzZWxmLCBpbmZpbGU9Tm9uZSwgbGluZW5vPU5vbmUpOgogICAgICAgICJFbWl0IGEgQy1jb21waWxlci1saWtlLCBFbWFjcy1mcmllbmRseSBlcnJvci1tZXNzYWdlIGxlYWRlci4iCiAgICAgICAgaWYgaW5maWxlIGlzIE5vbmU6CiAgICAgICAgICAgIGluZmlsZSA9IHNlbGYuaW5maWxlCiAgICAgICAgaWYgbGluZW5vIGlzIE5vbmU6CiAgICAgICAgICAgIGxpbmVubyA9IHNlbGYubGluZW5vCiAgICAgICAgcmV0dXJuICJcIiVzXCIsIGxpbmUgJWQ6ICIgJSAoaW5maWxlLCBsaW5lbm8pCgogICAgZGVmIF9faXRlcl9fKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmCgogICAgZGVmIG5leHQoc2VsZik6CiAgICAgICAgdG9rZW4gPSBzZWxmLmdldF90b2tlbigpCiAgICAgICAgaWYgdG9rZW4gPT0gc2VsZi5lb2Y6CiAgICAgICAgICAgIHJhaXNlIFN0b3BJdGVyYXRpb24KICAgICAgICByZXR1cm4gdG9rZW4KCmRlZiBzcGxpdChzLCBjb21tZW50cz1GYWxzZSwgcG9zaXg9VHJ1ZSk6CiAgICBsZXggPSBzaGxleChzLCBwb3NpeD1wb3NpeCkKICAgIGxleC53aGl0ZXNwYWNlX3NwbGl0ID0gVHJ1ZQogICAgaWYgbm90IGNvbW1lbnRzOgogICAgICAgIGxleC5jb21tZW50ZXJzID0gJycKICAgIHJldHVybiBsaXN0KGxleCkKCmlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgICBpZiBsZW4oc3lzLmFyZ3YpID09IDE6CiAgICAgICAgbGV4ZXIgPSBzaGxleCgpCiAgICBlbHNlOgogICAgICAgIGZpbGUgPSBzeXMuYXJndlsxXQogICAgICAgIGxleGVyID0gc2hsZXgob3BlbihmaWxlKSwgZmlsZSkKICAgIHdoaWxlIDE6CiAgICAgICAgdHQgPSBsZXhlci5nZXRfdG9rZW4oKQogICAgICAgIGlmIHR0OgogICAgICAgICAgICBwcmludCAiVG9rZW46ICIgKyByZXByKHR0KQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGJyZWFrCg==