IyAtKi0gY29kaW5nOiBpc28tODg1OS0xIC0qLQ0KIiIiQSBsZXhpY2FsIGFuYWx5emVyIGNsYXNzIGZvciBzaW1wbGUgc2hlbGwtbGlrZSBzeW50YXhlcy4iIiINCg0KIyBNb2R1bGUgYW5kIGRvY3VtZW50YXRpb24gYnkgRXJpYyBTLiBSYXltb25kLCAyMSBEZWMgMTk5OA0KIyBJbnB1dCBzdGFja2luZyBhbmQgZXJyb3IgbWVzc2FnZSBjbGVhbnVwIGFkZGVkIGJ5IEVTUiwgTWFyY2ggMjAwMA0KIyBwdXNoX3NvdXJjZSgpIGFuZCBwb3Bfc291cmNlKCkgbWFkZSBleHBsaWNpdCBieSBFU1IsIEphbnVhcnkgMjAwMS4NCiMgUG9zaXggY29tcGxpYW5jZSwgc3BsaXQoKSwgc3RyaW5nIGFyZ3VtZW50cywgYW5kDQojIGl0ZXJhdG9yIGludGVyZmFjZSBieSBHdXN0YXZvIE5pZW1leWVyLCBBcHJpbCAyMDAzLg0KDQppbXBvcnQgb3MucGF0aA0KaW1wb3J0IHN5cw0KZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgZGVxdWUNCg0KdHJ5Og0KICAgIGZyb20gY1N0cmluZ0lPIGltcG9ydCBTdHJpbmdJTw0KZXhjZXB0IEltcG9ydEVycm9yOg0KICAgIGZyb20gU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPDQoNCl9fYWxsX18gPSBbInNobGV4IiwgInNwbGl0Il0NCg0KY2xhc3Mgc2hsZXg6DQogICAgIkEgbGV4aWNhbCBhbmFseXplciBjbGFzcyBmb3Igc2ltcGxlIHNoZWxsLWxpa2Ugc3ludGF4ZXMuIg0KICAgIGRlZiBfX2luaXRfXyhzZWxmLCBpbnN0cmVhbT1Ob25lLCBpbmZpbGU9Tm9uZSwgcG9zaXg9RmFsc2UpOg0KICAgICAgICBpZiBpc2luc3RhbmNlKGluc3RyZWFtLCBiYXNlc3RyaW5nKToNCiAgICAgICAgICAgIGluc3RyZWFtID0gU3RyaW5nSU8oaW5zdHJlYW0pDQogICAgICAgIGlmIGluc3RyZWFtIGlzIG5vdCBOb25lOg0KICAgICAgICAgICAgc2VsZi5pbnN0cmVhbSA9IGluc3RyZWFtDQogICAgICAgICAgICBzZWxmLmluZmlsZSA9IGluZmlsZQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgc2VsZi5pbnN0cmVhbSA9IHN5cy5zdGRpbg0KICAgICAgICAgICAgc2VsZi5pbmZpbGUgPSBOb25lDQogICAgICAgIHNlbGYucG9zaXggPSBwb3NpeA0KICAgICAgICBpZiBwb3NpeDoNCiAgICAgICAgICAgIHNlbGYuZW9mID0gTm9uZQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgc2VsZi5lb2YgPSAnJw0KICAgICAgICBzZWxmLmNvbW1lbnRlcnMgPSAnIycNCiAgICAgICAgc2VsZi53b3JkY2hhcnMgPSAoJ2FiY2RmZWdoaWprbG1ub3BxcnN0dXZ3eHl6Jw0KICAgICAgICAgICAgICAgICAgICAgICAgICAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVowMTIzNDU2Nzg5XycpDQogICAgICAgIGlmIHNlbGYucG9zaXg6DQogICAgICAgICAgICBzZWxmLndvcmRjaGFycyArPSAoJ9/g4eLj5OXm5+jp6uvs7e7v8PHy8/T19vj5+vv8/f7/Jw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICfAwcLDxMXGx8jJysvMzc7P0NHS09TV1tjZ2tvc3d4nKQ0KICAgICAgICBzZWxmLndoaXRlc3BhY2UgPSAnIFx0XHJcbicNCiAgICAgICAgc2VsZi53aGl0ZXNwYWNlX3NwbGl0ID0gRmFsc2UNCiAgICAgICAgc2VsZi5xdW90ZXMgPSAnXCciJw0KICAgICAgICBzZWxmLmVzY2FwZSA9ICdcXCcNCiAgICAgICAgc2VsZi5lc2NhcGVkcXVvdGVzID0gJyInDQogICAgICAgIHNlbGYuc3RhdGUgPSAnICcNCiAgICAgICAgc2VsZi5wdXNoYmFjayA9IGRlcXVlKCkNCiAgICAgICAgc2VsZi5saW5lbm8gPSAxDQogICAgICAgIHNlbGYuZGVidWcgPSAwDQogICAgICAgIHNlbGYudG9rZW4gPSAnJw0KICAgICAgICBzZWxmLmZpbGVzdGFjayA9IGRlcXVlKCkNCiAgICAgICAgc2VsZi5zb3VyY2UgPSBOb25lDQogICAgICAgIGlmIHNlbGYuZGVidWc6DQogICAgICAgICAgICBwcmludCAnc2hsZXg6IHJlYWRpbmcgZnJvbSAlcywgbGluZSAlZCcgXA0KICAgICAgICAgICAgICAgICAgJSAoc2VsZi5pbnN0cmVhbSwgc2VsZi5saW5lbm8pDQoNCiAgICBkZWYgcHVzaF90b2tlbihzZWxmLCB0b2spOg0KICAgICAgICAiUHVzaCBhIHRva2VuIG9udG8gdGhlIHN0YWNrIHBvcHBlZCBieSB0aGUgZ2V0X3Rva2VuIG1ldGhvZCINCiAgICAgICAgaWYgc2VsZi5kZWJ1ZyA+PSAxOg0KICAgICAgICAgICAgcHJpbnQgInNobGV4OiBwdXNoaW5nIHRva2VuICIgKyByZXByKHRvaykNCiAgICAgICAgc2VsZi5wdXNoYmFjay5hcHBlbmRsZWZ0KHRvaykNCg0KICAgIGRlZiBwdXNoX3NvdXJjZShzZWxmLCBuZXdzdHJlYW0sIG5ld2ZpbGU9Tm9uZSk6DQogICAgICAgICJQdXNoIGFuIGlucHV0IHNvdXJjZSBvbnRvIHRoZSBsZXhlcidzIGlucHV0IHNvdXJjZSBzdGFjay4iDQogICAgICAgIGlmIGlzaW5zdGFuY2UobmV3c3RyZWFtLCBiYXNlc3RyaW5nKToNCiAgICAgICAgICAgIG5ld3N0cmVhbSA9IFN0cmluZ0lPKG5ld3N0cmVhbSkNCiAgICAgICAgc2VsZi5maWxlc3RhY2suYXBwZW5kbGVmdCgoc2VsZi5pbmZpbGUsIHNlbGYuaW5zdHJlYW0sIHNlbGYubGluZW5vKSkNCiAgICAgICAgc2VsZi5pbmZpbGUgPSBuZXdmaWxlDQogICAgICAgIHNlbGYuaW5zdHJlYW0gPSBuZXdzdHJlYW0NCiAgICAgICAgc2VsZi5saW5lbm8gPSAxDQogICAgICAgIGlmIHNlbGYuZGVidWc6DQogICAgICAgICAgICBpZiBuZXdmaWxlIGlzIG5vdCBOb25lOg0KICAgICAgICAgICAgICAgIHByaW50ICdzaGxleDogcHVzaGluZyB0byBmaWxlICVzJyAlIChzZWxmLmluZmlsZSwpDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgIHByaW50ICdzaGxleDogcHVzaGluZyB0byBzdHJlYW0gJXMnICUgKHNlbGYuaW5zdHJlYW0sKQ0KDQogICAgZGVmIHBvcF9zb3VyY2Uoc2VsZik6DQogICAgICAgICJQb3AgdGhlIGlucHV0IHNvdXJjZSBzdGFjay4iDQogICAgICAgIHNlbGYuaW5zdHJlYW0uY2xvc2UoKQ0KICAgICAgICAoc2VsZi5pbmZpbGUsIHNlbGYuaW5zdHJlYW0sIHNlbGYubGluZW5vKSA9IHNlbGYuZmlsZXN0YWNrLnBvcGxlZnQoKQ0KICAgICAgICBpZiBzZWxmLmRlYnVnOg0KICAgICAgICAgICAgcHJpbnQgJ3NobGV4OiBwb3BwaW5nIHRvICVzLCBsaW5lICVkJyBcDQogICAgICAgICAgICAgICAgICAlIChzZWxmLmluc3RyZWFtLCBzZWxmLmxpbmVubykNCiAgICAgICAgc2VsZi5zdGF0ZSA9ICcgJw0KDQogICAgZGVmIGdldF90b2tlbihzZWxmKToNCiAgICAgICAgIkdldCBhIHRva2VuIGZyb20gdGhlIGlucHV0IHN0cmVhbSAob3IgZnJvbSBzdGFjayBpZiBpdCdzIG5vbmVtcHR5KSINCiAgICAgICAgaWYgc2VsZi5wdXNoYmFjazoNCiAgICAgICAgICAgIHRvayA9IHNlbGYucHVzaGJhY2sucG9wbGVmdCgpDQogICAgICAgICAgICBpZiBzZWxmLmRlYnVnID49IDE6DQogICAgICAgICAgICAgICAgcHJpbnQgInNobGV4OiBwb3BwaW5nIHRva2VuICIgKyByZXByKHRvaykNCiAgICAgICAgICAgIHJldHVybiB0b2sNCiAgICAgICAgIyBObyBwdXNoYmFjay4gIEdldCBhIHRva2VuLg0KICAgICAgICByYXcgPSBzZWxmLnJlYWRfdG9rZW4oKQ0KICAgICAgICAjIEhhbmRsZSBpbmNsdXNpb25zDQogICAgICAgIGlmIHNlbGYuc291cmNlIGlzIG5vdCBOb25lOg0KICAgICAgICAgICAgd2hpbGUgcmF3ID09IHNlbGYuc291cmNlOg0KICAgICAgICAgICAgICAgIHNwZWMgPSBzZWxmLnNvdXJjZWhvb2soc2VsZi5yZWFkX3Rva2VuKCkpDQogICAgICAgICAgICAgICAgaWYgc3BlYzoNCiAgICAgICAgICAgICAgICAgICAgKG5ld2ZpbGUsIG5ld3N0cmVhbSkgPSBzcGVjDQogICAgICAgICAgICAgICAgICAgIHNlbGYucHVzaF9zb3VyY2UobmV3c3RyZWFtLCBuZXdmaWxlKQ0KICAgICAgICAgICAgICAgIHJhdyA9IHNlbGYuZ2V0X3Rva2VuKCkNCiAgICAgICAgIyBNYXliZSB3ZSBnb3QgRU9GIGluc3RlYWQ/DQogICAgICAgIHdoaWxlIHJhdyA9PSBzZWxmLmVvZjoNCiAgICAgICAgICAgIGlmIG5vdCBzZWxmLmZpbGVzdGFjazoNCiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5lb2YNCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgc2VsZi5wb3Bfc291cmNlKCkNCiAgICAgICAgICAgICAgICByYXcgPSBzZWxmLmdldF90b2tlbigpDQogICAgICAgICMgTmVpdGhlciBpbmNsdXNpb24gbm9yIEVPRg0KICAgICAgICBpZiBzZWxmLmRlYnVnID49IDE6DQogICAgICAgICAgICBpZiByYXcgIT0gc2VsZi5lb2Y6DQogICAgICAgICAgICAgICAgcHJpbnQgInNobGV4OiB0b2tlbj0iICsgcmVwcihyYXcpDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgIHByaW50ICJzaGxleDogdG9rZW49RU9GIg0KICAgICAgICByZXR1cm4gcmF3DQoNCiAgICBkZWYgcmVhZF90b2tlbihzZWxmKToNCiAgICAgICAgcXVvdGVkID0gRmFsc2UNCiAgICAgICAgZXNjYXBlZHN0YXRlID0gJyAnDQogICAgICAgIHdoaWxlIFRydWU6DQogICAgICAgICAgICBuZXh0Y2hhciA9IHNlbGYuaW5zdHJlYW0ucmVhZCgxKQ0KICAgICAgICAgICAgaWYgbmV4dGNoYXIgPT0gJ1xuJzoNCiAgICAgICAgICAgICAgICBzZWxmLmxpbmVubyA9IHNlbGYubGluZW5vICsgMQ0KICAgICAgICAgICAgaWYgc2VsZi5kZWJ1ZyA+PSAzOg0KICAgICAgICAgICAgICAgIHByaW50ICJzaGxleDogaW4gc3RhdGUiLCByZXByKHNlbGYuc3RhdGUpLCBcDQogICAgICAgICAgICAgICAgICAgICAgIkkgc2VlIGNoYXJhY3RlcjoiLCByZXByKG5leHRjaGFyKQ0KICAgICAgICAgICAgaWYgc2VsZi5zdGF0ZSBpcyBOb25lOg0KICAgICAgICAgICAgICAgIHNlbGYudG9rZW4gPSAnJyAgICAgICAgIyBwYXN0IGVuZCBvZiBmaWxlDQogICAgICAgICAgICAgICAgYnJlYWsNCiAgICAgICAgICAgIGVsaWYgc2VsZi5zdGF0ZSA9PSAnICc6DQogICAgICAgICAgICAgICAgaWYgbm90IG5leHRjaGFyOg0KICAgICAgICAgICAgICAgICAgICBzZWxmLnN0YXRlID0gTm9uZSAgIyBlbmQgb2YgZmlsZQ0KICAgICAgICAgICAgICAgICAgICBicmVhaw0KICAgICAgICAgICAgICAgIGVsaWYgbmV4dGNoYXIgaW4gc2VsZi53aGl0ZXNwYWNlOg0KICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLmRlYnVnID49IDI6DQogICAgICAgICAgICAgICAgICAgICAgICBwcmludCAic2hsZXg6IEkgc2VlIHdoaXRlc3BhY2UgaW4gd2hpdGVzcGFjZSBzdGF0ZSINCiAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi50b2tlbiBvciAoc2VsZi5wb3NpeCBhbmQgcXVvdGVkKToNCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrICAgIyBlbWl0IGN1cnJlbnQgdG9rZW4NCiAgICAgICAgICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlDQogICAgICAgICAgICAgICAgZWxpZiBuZXh0Y2hhciBpbiBzZWxmLmNvbW1lbnRlcnM6DQogICAgICAgICAgICAgICAgICAgIHNlbGYuaW5zdHJlYW0ucmVhZGxpbmUoKQ0KICAgICAgICAgICAgICAgICAgICBzZWxmLmxpbmVubyA9IHNlbGYubGluZW5vICsgMQ0KICAgICAgICAgICAgICAgIGVsaWYgc2VsZi5wb3NpeCBhbmQgbmV4dGNoYXIgaW4gc2VsZi5lc2NhcGU6DQogICAgICAgICAgICAgICAgICAgIGVzY2FwZWRzdGF0ZSA9ICdhJw0KICAgICAgICAgICAgICAgICAgICBzZWxmLnN0YXRlID0gbmV4dGNoYXINCiAgICAgICAgICAgICAgICBlbGlmIG5leHRjaGFyIGluIHNlbGYud29yZGNoYXJzOg0KICAgICAgICAgICAgICAgICAgICBzZWxmLnRva2VuID0gbmV4dGNoYXINCiAgICAgICAgICAgICAgICAgICAgc2VsZi5zdGF0ZSA9ICdhJw0KICAgICAgICAgICAgICAgIGVsaWYgbmV4dGNoYXIgaW4gc2VsZi5xdW90ZXM6DQogICAgICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLnBvc2l4Og0KICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50b2tlbiA9IG5leHRjaGFyDQogICAgICAgICAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBuZXh0Y2hhcg0KICAgICAgICAgICAgICAgIGVsaWYgc2VsZi53aGl0ZXNwYWNlX3NwbGl0Og0KICAgICAgICAgICAgICAgICAgICBzZWxmLnRva2VuID0gbmV4dGNoYXINCiAgICAgICAgICAgICAgICAgICAgc2VsZi5zdGF0ZSA9ICdhJw0KICAgICAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgICAgIHNlbGYudG9rZW4gPSBuZXh0Y2hhcg0KICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLnRva2VuIG9yIChzZWxmLnBvc2l4IGFuZCBxdW90ZWQpOg0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgICAjIGVtaXQgY3VycmVudCB0b2tlbg0KICAgICAgICAgICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUNCiAgICAgICAgICAgIGVsaWYgc2VsZi5zdGF0ZSBpbiBzZWxmLnF1b3RlczoNCiAgICAgICAgICAgICAgICBxdW90ZWQgPSBUcnVlDQogICAgICAgICAgICAgICAgaWYgbm90IG5leHRjaGFyOiAgICAgICMgZW5kIG9mIGZpbGUNCiAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5kZWJ1ZyA+PSAyOg0KICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQgInNobGV4OiBJIHNlZSBFT0YgaW4gcXVvdGVzIHN0YXRlIg0KICAgICAgICAgICAgICAgICAgICAjIFhYWCB3aGF0IGVycm9yIHNob3VsZCBiZSByYWlzZWQgaGVyZT8NCiAgICAgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgIk5vIGNsb3NpbmcgcXVvdGF0aW9uIg0KICAgICAgICAgICAgICAgIGlmIG5leHRjaGFyID09IHNlbGYuc3RhdGU6DQogICAgICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLnBvc2l4Og0KICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50b2tlbiA9IHNlbGYudG9rZW4gKyBuZXh0Y2hhcg0KICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zdGF0ZSA9ICcgJw0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsNCiAgICAgICAgICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc3RhdGUgPSAnYScNCiAgICAgICAgICAgICAgICBlbGlmIHNlbGYucG9zaXggYW5kIG5leHRjaGFyIGluIHNlbGYuZXNjYXBlIGFuZCBcDQogICAgICAgICAgICAgICAgICAgICBzZWxmLnN0YXRlIGluIHNlbGYuZXNjYXBlZHF1b3RlczoNCiAgICAgICAgICAgICAgICAgICAgZXNjYXBlZHN0YXRlID0gc2VsZi5zdGF0ZQ0KICAgICAgICAgICAgICAgICAgICBzZWxmLnN0YXRlID0gbmV4dGNoYXINCiAgICAgICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICAgICBzZWxmLnRva2VuID0gc2VsZi50b2tlbiArIG5leHRjaGFyDQogICAgICAgICAgICBlbGlmIHNlbGYuc3RhdGUgaW4gc2VsZi5lc2NhcGU6DQogICAgICAgICAgICAgICAgaWYgbm90IG5leHRjaGFyOiAgICAgICMgZW5kIG9mIGZpbGUNCiAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5kZWJ1ZyA+PSAyOg0KICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQgInNobGV4OiBJIHNlZSBFT0YgaW4gZXNjYXBlIHN0YXRlIg0KICAgICAgICAgICAgICAgICAgICAjIFhYWCB3aGF0IGVycm9yIHNob3VsZCBiZSByYWlzZWQgaGVyZT8NCiAgICAgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgIk5vIGVzY2FwZWQgY2hhcmFjdGVyIg0KICAgICAgICAgICAgICAgICMgSW4gcG9zaXggc2hlbGxzLCBvbmx5IHRoZSBxdW90ZSBpdHNlbGYgb3IgdGhlIGVzY2FwZQ0KICAgICAgICAgICAgICAgICMgY2hhcmFjdGVyIG1heSBiZSBlc2NhcGVkIHdpdGhpbiBxdW90ZXMuDQogICAgICAgICAgICAgICAgaWYgZXNjYXBlZHN0YXRlIGluIHNlbGYucXVvdGVzIGFuZCBcDQogICAgICAgICAgICAgICAgICAgbmV4dGNoYXIgIT0gc2VsZi5zdGF0ZSBhbmQgbmV4dGNoYXIgIT0gZXNjYXBlZHN0YXRlOg0KICAgICAgICAgICAgICAgICAgICBzZWxmLnRva2VuID0gc2VsZi50b2tlbiArIHNlbGYuc3RhdGUNCiAgICAgICAgICAgICAgICBzZWxmLnRva2VuID0gc2VsZi50b2tlbiArIG5leHRjaGFyDQogICAgICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IGVzY2FwZWRzdGF0ZQ0KICAgICAgICAgICAgZWxpZiBzZWxmLnN0YXRlID09ICdhJzoNCiAgICAgICAgICAgICAgICBpZiBub3QgbmV4dGNoYXI6DQogICAgICAgICAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBOb25lICAgIyBlbmQgb2YgZmlsZQ0KICAgICAgICAgICAgICAgICAgICBicmVhaw0KICAgICAgICAgICAgICAgIGVsaWYgbmV4dGNoYXIgaW4gc2VsZi53aGl0ZXNwYWNlOg0KICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLmRlYnVnID49IDI6DQogICAgICAgICAgICAgICAgICAgICAgICBwcmludCAic2hsZXg6IEkgc2VlIHdoaXRlc3BhY2UgaW4gd29yZCBzdGF0ZSINCiAgICAgICAgICAgICAgICAgICAgc2VsZi5zdGF0ZSA9ICcgJw0KICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLnRva2VuIG9yIChzZWxmLnBvc2l4IGFuZCBxdW90ZWQpOg0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgICAjIGVtaXQgY3VycmVudCB0b2tlbg0KICAgICAgICAgICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUNCiAgICAgICAgICAgICAgICBlbGlmIG5leHRjaGFyIGluIHNlbGYuY29tbWVudGVyczoNCiAgICAgICAgICAgICAgICAgICAgc2VsZi5pbnN0cmVhbS5yZWFkbGluZSgpDQogICAgICAgICAgICAgICAgICAgIHNlbGYubGluZW5vID0gc2VsZi5saW5lbm8gKyAxDQogICAgICAgICAgICAgICAgICAgIGlmIHNlbGYucG9zaXg6DQogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnN0YXRlID0gJyAnDQogICAgICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLnRva2VuIG9yIChzZWxmLnBvc2l4IGFuZCBxdW90ZWQpOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrICAgIyBlbWl0IGN1cnJlbnQgdG9rZW4NCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUNCiAgICAgICAgICAgICAgICBlbGlmIHNlbGYucG9zaXggYW5kIG5leHRjaGFyIGluIHNlbGYucXVvdGVzOg0KICAgICAgICAgICAgICAgICAgICBzZWxmLnN0YXRlID0gbmV4dGNoYXINCiAgICAgICAgICAgICAgICBlbGlmIHNlbGYucG9zaXggYW5kIG5leHRjaGFyIGluIHNlbGYuZXNjYXBlOg0KICAgICAgICAgICAgICAgICAgICBlc2NhcGVkc3RhdGUgPSAnYScNCiAgICAgICAgICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IG5leHRjaGFyDQogICAgICAgICAgICAgICAgZWxpZiBuZXh0Y2hhciBpbiBzZWxmLndvcmRjaGFycyBvciBuZXh0Y2hhciBpbiBzZWxmLnF1b3RlcyBcDQogICAgICAgICAgICAgICAgICAgIG9yIHNlbGYud2hpdGVzcGFjZV9zcGxpdDoNCiAgICAgICAgICAgICAgICAgICAgc2VsZi50b2tlbiA9IHNlbGYudG9rZW4gKyBuZXh0Y2hhcg0KICAgICAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgICAgIHNlbGYucHVzaGJhY2suYXBwZW5kbGVmdChuZXh0Y2hhcikNCiAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5kZWJ1ZyA+PSAyOg0KICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQgInNobGV4OiBJIHNlZSBwdW5jdHVhdGlvbiBpbiB3b3JkIHN0YXRlIg0KICAgICAgICAgICAgICAgICAgICBzZWxmLnN0YXRlID0gJyAnDQogICAgICAgICAgICAgICAgICAgIGlmIHNlbGYudG9rZW46DQogICAgICAgICAgICAgICAgICAgICAgICBicmVhayAgICMgZW1pdCBjdXJyZW50IHRva2VuDQogICAgICAgICAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQ0KICAgICAgICByZXN1bHQgPSBzZWxmLnRva2VuDQogICAgICAgIHNlbGYudG9rZW4gPSAnJw0KICAgICAgICBpZiBzZWxmLnBvc2l4IGFuZCBub3QgcXVvdGVkIGFuZCByZXN1bHQgPT0gJyc6DQogICAgICAgICAgICByZXN1bHQgPSBOb25lDQogICAgICAgIGlmIHNlbGYuZGVidWcgPiAxOg0KICAgICAgICAgICAgaWYgcmVzdWx0Og0KICAgICAgICAgICAgICAgIHByaW50ICJzaGxleDogcmF3IHRva2VuPSIgKyByZXByKHJlc3VsdCkNCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgcHJpbnQgInNobGV4OiByYXcgdG9rZW49RU9GIg0KICAgICAgICByZXR1cm4gcmVzdWx0DQoNCiAgICBkZWYgc291cmNlaG9vayhzZWxmLCBuZXdmaWxlKToNCiAgICAgICAgIkhvb2sgY2FsbGVkIG9uIGEgZmlsZW5hbWUgdG8gYmUgc291cmNlZC4iDQogICAgICAgIGlmIG5ld2ZpbGVbMF0gPT0gJyInOg0KICAgICAgICAgICAgbmV3ZmlsZSA9IG5ld2ZpbGVbMTotMV0NCiAgICAgICAgIyBUaGlzIGltcGxlbWVudHMgY3BwLWxpa2Ugc2VtYW50aWNzIGZvciByZWxhdGl2ZS1wYXRoIGluY2x1c2lvbi4NCiAgICAgICAgaWYgaXNpbnN0YW5jZShzZWxmLmluZmlsZSwgYmFzZXN0cmluZykgYW5kIG5vdCBvcy5wYXRoLmlzYWJzKG5ld2ZpbGUpOg0KICAgICAgICAgICAgbmV3ZmlsZSA9IG9zLnBhdGguam9pbihvcy5wYXRoLmRpcm5hbWUoc2VsZi5pbmZpbGUpLCBuZXdmaWxlKQ0KICAgICAgICByZXR1cm4gKG5ld2ZpbGUsIG9wZW4obmV3ZmlsZSwgInIiKSkNCg0KICAgIGRlZiBlcnJvcl9sZWFkZXIoc2VsZiwgaW5maWxlPU5vbmUsIGxpbmVubz1Ob25lKToNCiAgICAgICAgIkVtaXQgYSBDLWNvbXBpbGVyLWxpa2UsIEVtYWNzLWZyaWVuZGx5IGVycm9yLW1lc3NhZ2UgbGVhZGVyLiINCiAgICAgICAgaWYgaW5maWxlIGlzIE5vbmU6DQogICAgICAgICAgICBpbmZpbGUgPSBzZWxmLmluZmlsZQ0KICAgICAgICBpZiBsaW5lbm8gaXMgTm9uZToNCiAgICAgICAgICAgIGxpbmVubyA9IHNlbGYubGluZW5vDQogICAgICAgIHJldHVybiAiXCIlc1wiLCBsaW5lICVkOiAiICUgKGluZmlsZSwgbGluZW5vKQ0KDQogICAgZGVmIF9faXRlcl9fKHNlbGYpOg0KICAgICAgICByZXR1cm4gc2VsZg0KDQogICAgZGVmIG5leHQoc2VsZik6DQogICAgICAgIHRva2VuID0gc2VsZi5nZXRfdG9rZW4oKQ0KICAgICAgICBpZiB0b2tlbiA9PSBzZWxmLmVvZjoNCiAgICAgICAgICAgIHJhaXNlIFN0b3BJdGVyYXRpb24NCiAgICAgICAgcmV0dXJuIHRva2VuDQoNCmRlZiBzcGxpdChzLCBjb21tZW50cz1GYWxzZSwgcG9zaXg9VHJ1ZSk6DQogICAgbGV4ID0gc2hsZXgocywgcG9zaXg9cG9zaXgpDQogICAgbGV4LndoaXRlc3BhY2Vfc3BsaXQgPSBUcnVlDQogICAgaWYgbm90IGNvbW1lbnRzOg0KICAgICAgICBsZXguY29tbWVudGVycyA9ICcnDQogICAgcmV0dXJuIGxpc3QobGV4KQ0KDQppZiBfX25hbWVfXyA9PSAnX19tYWluX18nOg0KICAgIGlmIGxlbihzeXMuYXJndikgPT0gMToNCiAgICAgICAgbGV4ZXIgPSBzaGxleCgpDQogICAgZWxzZToNCiAgICAgICAgZmlsZSA9IHN5cy5hcmd2WzFdDQogICAgICAgIGxleGVyID0gc2hsZXgob3BlbihmaWxlKSwgZmlsZSkNCiAgICB3aGlsZSAxOg0KICAgICAgICB0dCA9IGxleGVyLmdldF90b2tlbigpDQogICAgICAgIGlmIHR0Og0KICAgICAgICAgICAgcHJpbnQgIlRva2VuOiAiICsgcmVwcih0dCkNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIGJyZWFrDQo=