# QuantArena evidence downloader. Standard library only for --bundle.
import base64, pathlib, runpy, sys, tempfile
FILES = {'evidence_v2.py': 'IiIiQ29udGVudC1hZGRyZXNzZWQgbW9udGhseSBldmlkZW5jZSwgd2l0aCBzdGFuZGFyZC1saWJyYXJ5IGFyaXRobWV0aWMgcmVwbGF5LgoKTW9udGhseSBjaHVua3MgYXJlIGluZGVwZW5kZW50OiBubyBwYXJlbnQgY2hhaW4sIHJlY3Vyc2l2ZSByZXNvbHV0aW9uIG9yIGhpc3RvcnkKY29waWVzLiBBbiBhcHBlbmQgcmV3cml0ZXMgYXQgbW9zdCB0aGUgY3VycmVudCBtb250aDsgY29tcGxldGVkIG1vbnRocyBhcmUgc2hhcmVkLgpSYXcgcHJvdmlkZXIgb2JzZXJ2YXRpb25zIHN0YXkgaW4gdGhlIHByaXZhdGUgcmVzZWFyY2gtaW5wdXQgY2FjaGUuCiIiIgppbXBvcnQgZ3ppcAppbXBvcnQgYmFzZTY0CmltcG9ydCBoYXNobGliCmltcG9ydCBpbXBvcnRsaWIubWV0YWRhdGEKaW1wb3J0IGpzb24KaW1wb3J0IG1hdGgKaW1wb3J0IG9zCmZyb20gcGF0aGxpYiBpbXBvcnQgUGF0aCwgUHVyZVBvc2l4UGF0aAppbXBvcnQgcGxhdGZvcm0KaW1wb3J0IHNodXRpbAppbXBvcnQgdGVtcGZpbGUKCgpNT0RFTCA9IHsKICAgICJpZCI6ICJzeW50aGV0aWMtZGFpbHktdGFyZ2V0LXYzIiwKICAgICJkZWNpc2lvbiI6ICJUYXJnZXQgd2VpZ2h0cyB1c2UgYmFycyB0aHJvdWdoIGNsb3NlIHQ7IHByZXZpb3VzIHRhcmdldHMgZWFybiAodC0xLHRdLiIsCiAgICAicmV0dXJuIjogIlN1bSBvZiBwcmV2aW91cyB0YXJnZXQgd2VpZ2h0IHRpbWVzIGVhY2ggYXNzZXQgY2xvc2UtdG8tY2xvc2UgcmV0dXJuOyBjYXNoIHJldHVybiBpcyB6ZXJvLiIsCiAgICAidGFyZ2V0Q2hhbmdlIjogIlN1bShhYnModGFyZ2V0W3RdIC0gdGFyZ2V0W3QtMV0pKTsgY2hhbmdlcyBpbiBydWxlIHRhcmdldHMgb25seS4iLAogICAgInJlYmFsYW5jZVR1cm5vdmVyIjogIlN1bShhYnModGFyZ2V0W3RdIC0gdGFyZ2V0W3QtMV0qKDErYXNzZXRSZXR1cm5bdF0pLygxK2dyb3NzUmV0dXJuW3RdKSkpOyBvbmUtd2F5IHJpc2t5IG5vdGlvbmFsIGF0IGNsb3NlIHQgYWZ0ZXIgcmV0dXJucywgZGl2aWRlZCBieSBwcmUtdHJhZGUgZXF1aXR5LiIsCiAgICAiY2FzaCI6ICIxIC0gc3VtKHdlaWdodHMpOyByZXNpZHVhbCBtYXkgZXhjZWVkIG9uZSBvciBiZSBuZWdhdGl2ZSBmb3Igc2hvcnRzL2xldmVyYWdlLiIsCiAgICAiZmVlc0Jhc2lzUG9pbnRzIjogMCwKICAgICJmaWxscyI6ICJTeW50aGV0aWMgZGFpbHkgdGFyZ2V0IGFsbG9jYXRpb25zLCBub3QgYnJva2VyIG9yZGVycyBvciBmaWxsczsgZmluYW5jaW5nL2JvcnJvdyBjb3N0cyBvbWl0dGVkLiIsCiAgICAid2ZvIjogIkNhbmRpZGF0ZSByZXRhaW5zIGl0cyBvd24gaHlwb3RoZXRpY2FsIHN0YXRlOyBmaXJzdCB0ZXN0IHJldHVybiB1c2VzIHByZXZpb3VzIHB1Ymxpc2hlZCB0YXJnZXQuIiwKfQpNQVhfT0JKRUNUX0JZVEVTID0gMTI4ICogMTAyNCAqIDEwMjQKCgpkZWYgZW5jb2RlKHZhbHVlKToKICAgIHJldHVybiBqc29uLmR1bXBzKHZhbHVlLCBzb3J0X2tleXM9VHJ1ZSwgc2VwYXJhdG9ycz0oIiwiLCAiOiIpLCBhbGxvd19uYW49RmFsc2UpLmVuY29kZSgidXRmLTgiKQoKCmRlZiBzaGEodmFsdWUpOgogICAgcmV0dXJuIGhhc2hsaWIuc2hhMjU2KHZhbHVlIGlmIGlzaW5zdGFuY2UodmFsdWUsIGJ5dGVzKSBlbHNlIGVuY29kZSh2YWx1ZSkpLmhleGRpZ2VzdCgpCgoKZGVmIHNhZmVfcGF0aChyb290LCByZWxhdGl2ZSk6CiAgICBwYXRoID0gUHVyZVBvc2l4UGF0aChyZWxhdGl2ZSkKICAgIGlmIHBhdGguaXNfYWJzb2x1dGUoKSBvciAiLi4iIGluIHBhdGgucGFydHMgb3IgIlxcIiBpbiByZWxhdGl2ZSBvciAiOiIgaW4gcmVsYXRpdmU6CiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiVW5zYWZlIGV2aWRlbmNlIHBhdGgiKQogICAgcmVzb2x2ZWQgPSAoUGF0aChyb290KSAvIHBhdGgpLnJlc29sdmUoKQogICAgaWYgbm90IHJlc29sdmVkLmlzX3JlbGF0aXZlX3RvKFBhdGgocm9vdCkucmVzb2x2ZSgpKToKICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJFdmlkZW5jZSBwYXRoIGVzY2FwZXMgcm9vdCIpCiAgICByZXR1cm4gcmVzb2x2ZWQKCgpkZWYgb2JqZWN0X3JlZihyb290LCB2YWx1ZSk6CiAgICByYXcgPSBlbmNvZGUodmFsdWUpCiAgICBpZGVudGl0eSA9IHNoYShyYXcpCiAgICByZWxhdGl2ZSA9IGYiZGF0YS9ldmlkZW5jZS9vYmplY3RzL3tpZGVudGl0eX0uanNvbi5neiIKICAgIGNvbXByZXNzZWQgPSBnemlwLmNvbXByZXNzKHJhdywgbXRpbWU9MCkKICAgIHBhdGggPSBzYWZlX3BhdGgocm9vdCwgcmVsYXRpdmUpCiAgICBwYXRoLnBhcmVudC5ta2RpcihwYXJlbnRzPVRydWUsIGV4aXN0X29rPVRydWUpCiAgICByZWYgPSB7InBhdGgiOiByZWxhdGl2ZSwgInNoYTI1NiI6IGlkZW50aXR5LCAiY29tcHJlc3NlZEJ5dGVzIjogbGVuKGNvbXByZXNzZWQpLAogICAgICAgICAgICJ1bmNvbXByZXNzZWRCeXRlcyI6IGxlbihyYXcpfQogICAgaWYgcGF0aC5leGlzdHMoKToKICAgICAgICAjIE5ldmVyIG92ZXJ3cml0ZSBleGlzdGluZyBjb250ZW50LCBldmVuIGlmIGNvcnJ1cHQuCiAgICAgICAgIyBHemlwIGVuY29kZXJzIG1heSBkaWZmZXIgYWNyb3NzIFB5dGhvbiB2ZXJzaW9uczsgdGhlIGltbXV0YWJsZSBpZGVudGl0eQogICAgICAgICMgaXMgY2Fub25pY2FsIHVuY29tcHJlc3NlZCBjb250ZW50LCBhbmQgcmVmZXJlbmNlcyBkZXNjcmliZSBzdG9yZWQgYnl0ZXMuCiAgICAgICAgcmVmWyJjb21wcmVzc2VkQnl0ZXMiXSA9IHBhdGguc3RhdCgpLnN0X3NpemUKICAgICAgICBsb2FkX29iamVjdChyb290LCByZWYpCiAgICBlbHNlOgogICAgICAgIHdpdGggdGVtcGZpbGUuTmFtZWRUZW1wb3JhcnlGaWxlKGRpcj1wYXRoLnBhcmVudCwgZGVsZXRlPUZhbHNlKSBhcyBzdHJlYW06CiAgICAgICAgICAgIHN0cmVhbS53cml0ZShjb21wcmVzc2VkKQogICAgICAgICAgICB0ZW1wb3JhcnkgPSBQYXRoKHN0cmVhbS5uYW1lKQogICAgICAgIHRyeToKICAgICAgICAgICAgb3MucmVwbGFjZSh0ZW1wb3JhcnksIHBhdGgpCiAgICAgICAgZmluYWxseToKICAgICAgICAgICAgdGVtcG9yYXJ5LnVubGluayhtaXNzaW5nX29rPVRydWUpCiAgICByZXR1cm4gcmVmCgoKZGVmIGxvYWRfb2JqZWN0KHJvb3QsIHJlZik6CiAgICBpZGVudGl0eSA9IHJlZi5nZXQoInNoYTI1NiIsICIiKQogICAgaWYgbGVuKGlkZW50aXR5KSAhPSA2NCBvciBhbnkoY2ggbm90IGluICIwMTIzNDU2Nzg5YWJjZGVmIiBmb3IgY2ggaW4gaWRlbnRpdHkpOgogICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkludmFsaWQgb2JqZWN0IGhhc2giKQogICAgaWYgcmVmLmdldCgicGF0aCIpICE9IGYiZGF0YS9ldmlkZW5jZS9vYmplY3RzL3tpZGVudGl0eX0uanNvbi5neiI6CiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiT2JqZWN0IHBhdGggZG9lcyBub3QgbWF0Y2ggaXRzIGNvbnRlbnQgaWRlbnRpdHkiKQogICAgcGF0aCA9IHNhZmVfcGF0aChyb290LCByZWZbInBhdGgiXSkKICAgIGlmIHBhdGguc3RhdCgpLnN0X3NpemUgIT0gcmVmLmdldCgiY29tcHJlc3NlZEJ5dGVzIik6CiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiQ29tcHJlc3NlZCBvYmplY3Qgc2l6ZSBtaXNtYXRjaCIpCiAgICB3aXRoIGd6aXAub3BlbihwYXRoLCAicmIiKSBhcyBzdHJlYW06CiAgICAgICAgcmF3ID0gc3RyZWFtLnJlYWQoTUFYX09CSkVDVF9CWVRFUyArIDEpCiAgICBpZiBsZW4ocmF3KSA+IE1BWF9PQkpFQ1RfQllURVMgb3IgbGVuKHJhdykgIT0gcmVmLmdldCgidW5jb21wcmVzc2VkQnl0ZXMiKSBvciBzaGEocmF3KSAhPSBpZGVudGl0eToKICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJPYmplY3QgY2hlY2tzdW0gb3IgdW5jb21wcmVzc2VkIHNpemUgbWlzbWF0Y2giKQogICAgdmFsdWUgPSBqc29uLmxvYWRzKHJhdykKICAgIGlmIGVuY29kZSh2YWx1ZSkgIT0gcmF3OgogICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIk9iamVjdCBpcyBub3QgY2Fub25pY2FsIEpTT04iKQogICAgcmV0dXJuIHZhbHVlCgoKZGVmIGFydGlmYWN0X3Jvb3QobWFuaWZlc3RfcGF0aCk6CiAgICBwYXRoID0gUGF0aChtYW5pZmVzdF9wYXRoKS5yZXNvbHZlKCkKICAgIGZvciBwYXJlbnQgaW4gcGF0aC5wYXJlbnRzOgogICAgICAgIGlmIChwYXJlbnQgLyAiZGF0YS9ldmlkZW5jZS9vYmplY3RzIikuaXNfZGlyKCk6CiAgICAgICAgICAgIHJldHVybiBwYXJlbnQKICAgIHJhaXNlIFZhbHVlRXJyb3IoIlNoYXJlZCBldmlkZW5jZSBvYmplY3RzIG5vdCBmb3VuZDsgbWF0ZXJpYWxpemUgdGhlIGJ1bmRsZSBmaXJzdCIpCgoKZGVmIG1ha2VfcmVjb3JkcyhkYXRlcywgYXNzZXRzLCBwcmljZXMsIHRhcmdldHMpOgogICAgIiIiUHVyZSBudW1lcmljYWwgY29udHJhY3Q7IHNpZ25lZCB3ZWlnaHRzIGFuZCBjYXNoIHJlbWFpbiBkaXN0aW5jdC4iIiIKICAgIGlmIGxlbihkYXRlcykgPCAyIG9yIGxlbihkYXRlcykgIT0gbGVuKHByaWNlcykgb3IgbGVuKGRhdGVzKSAhPSBsZW4odGFyZ2V0cyk6CiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiRXZpZGVuY2UgcmVxdWlyZXMgYXQgbGVhc3QgdHdvIGFsaWduZWQgb2JzZXJ2YXRpb25zIikKICAgIGlmIG5vdCBhc3NldHMgb3IgbGVuKHNldChhc3NldHMpKSAhPSBsZW4oYXNzZXRzKSBvciBkYXRlcyAhPSBzb3J0ZWQoc2V0KGRhdGVzKSk6CiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiQXNzZXRzIGFuZCBvcmRlcmVkIGRhdGVzIG11c3QgYmUgdW5pcXVlIikKICAgIHJvd3MsIHByZXZpb3VzLCBvbGRfcHJpY2VzLCBlcXVpdHkgPSBbXSwgWzAuXSAqIGxlbihhc3NldHMpLCBOb25lLCAxLgogICAgZm9yIGRheSwgcHJpY2VzX25vdywgdGFyZ2V0IGluIHppcChkYXRlcywgcHJpY2VzLCB0YXJnZXRzKToKICAgICAgICBpZiBsZW4ocHJpY2VzX25vdykgIT0gbGVuKGFzc2V0cykgb3IgbGVuKHRhcmdldCkgIT0gbGVuKGFzc2V0cyk6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIk1pc3NpbmcgYXNzZXQgaW4gZXZpZGVuY2Ugb2JzZXJ2YXRpb24iKQogICAgICAgIGlmIG5vdCBhbGwobWF0aC5pc2Zpbml0ZShmbG9hdCh2KSkgZm9yIHYgaW4gcHJpY2VzX25vdyArIHRhcmdldCkgb3IgbWluKHByaWNlc19ub3cpIDw9IDA6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIlByaWNlcyBtdXN0IGJlIHBvc2l0aXZlIGFuZCB0YXJnZXRzIGZpbml0ZSIpCiAgICAgICAgbWFya2V0ID0gW3AgLyBvbGQgLSAxIGZvciBwLCBvbGQgaW4gemlwKHByaWNlc19ub3csIG9sZF9wcmljZXMpXSBpZiBvbGRfcHJpY2VzIGVsc2UgWzAuXSAqIGxlbihhc3NldHMpCiAgICAgICAgY29udHJpYnV0aW9uID0gW3dlaWdodCAqIHJldCBmb3Igd2VpZ2h0LCByZXQgaW4gemlwKHByZXZpb3VzLCBtYXJrZXQpXQogICAgICAgIGdyb3NzID0gc3VtKGNvbnRyaWJ1dGlvbikKICAgICAgICBpZiBncm9zcyA8PSAtMToKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiU3ludGhldGljIGVxdWl0eSBiZWNhbWUgbm9ucG9zaXRpdmUiKQogICAgICAgIGVxdWl0eSAqPSAxICsgZ3Jvc3MKICAgICAgICBpZiBub3QgbWF0aC5pc2Zpbml0ZShlcXVpdHkpIG9yIGVxdWl0eSA8PSAwOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJTeW50aGV0aWMgZXF1aXR5IGJlY2FtZSBub25wb3NpdGl2ZSBvciBub25maW5pdGUiKQogICAgICAgIGRyaWZ0ID0gW3dlaWdodCAqICgxICsgcmV0KSAvICgxICsgZ3Jvc3MpIGZvciB3ZWlnaHQsIHJldCBpbiB6aXAocHJldmlvdXMsIG1hcmtldCldCiAgICAgICAgY2hhbmdlcyA9IFthYnMobmV3IC0gb2xkKSBmb3IgbmV3LCBvbGQgaW4gemlwKHRhcmdldCwgcHJldmlvdXMpXQogICAgICAgIHRyYWRlZCA9IFthYnMobmV3IC0gb2xkKSBmb3IgbmV3LCBvbGQgaW4gemlwKHRhcmdldCwgZHJpZnQpXQogICAgICAgIHJvd3MuYXBwZW5kKHsiZGF0ZSI6IGRheSwgImFzc2V0cyI6IHthc3NldDogewogICAgICAgICAgICAidGFyZ2V0V2VpZ2h0IjogZmxvYXQodGFyZ2V0W2ldKSwgImVmZmVjdGl2ZVdlaWdodCI6IHByZXZpb3VzW2ldLAogICAgICAgICAgICAiYXNzZXRSZXR1cm4iOiBtYXJrZXRbaV0sICJjb250cmlidXRpb24iOiBjb250cmlidXRpb25baV0sCiAgICAgICAgICAgICJkcmlmdGVkV2VpZ2h0IjogZHJpZnRbaV0sICJ0YXJnZXRDaGFuZ2UiOiBjaGFuZ2VzW2ldLCAicmViYWxhbmNlVHVybm92ZXIiOiB0cmFkZWRbaV0KICAgICAgICB9IGZvciBpLCBhc3NldCBpbiBlbnVtZXJhdGUoYXNzZXRzKX0sICJncm9zc1JldHVybiI6IGdyb3NzLCAiZXF1aXR5IjogZXF1aXR5LAogICAgICAgICAgICAidGFyZ2V0R3Jvc3NFeHBvc3VyZSI6IHN1bShhYnModikgZm9yIHYgaW4gdGFyZ2V0KSwgInRhcmdldE5ldEV4cG9zdXJlIjogc3VtKHRhcmdldCksCiAgICAgICAgICAgICJ0YXJnZXRDYXNoV2VpZ2h0IjogMSAtIHN1bSh0YXJnZXQpLCAiZWZmZWN0aXZlR3Jvc3NFeHBvc3VyZSI6IHN1bShhYnModikgZm9yIHYgaW4gcHJldmlvdXMpLAogICAgICAgICAgICAiZWZmZWN0aXZlTmV0RXhwb3N1cmUiOiBzdW0ocHJldmlvdXMpLCAiZWZmZWN0aXZlQ2FzaFdlaWdodCI6IDEgLSBzdW0ocHJldmlvdXMpLAogICAgICAgICAgICAiZHJpZnRlZENhc2hXZWlnaHQiOiAoMSAtIHN1bShwcmV2aW91cykpIC8gKDEgKyBncm9zcyksCiAgICAgICAgICAgICJ0YXJnZXRDaGFuZ2UiOiBzdW0oY2hhbmdlcyksICJyZWJhbGFuY2VUdXJub3ZlciI6IHN1bSh0cmFkZWQpfSkKICAgICAgICBwcmV2aW91cywgb2xkX3ByaWNlcyA9IGxpc3QobWFwKGZsb2F0LCB0YXJnZXQpKSwgcHJpY2VzX25vdwogICAgcmV0dXJuIHJvd3MKCgpkZWYgcmVjb3Jkc19mcm9tX2ZyYW1lcyhwcmljZV9pbnB1dCwgcG9zaXRpb25zLCBzeW1ib2wsIGtpbmQpOgogICAgaW1wb3J0IHBhbmRhcyBhcyBwZAogICAgaWYga2luZCA9PSAic2luZ2xlIjoKICAgICAgICBjbG9zZSA9IHByaWNlX2lucHV0WyJDbG9zZSJdIGlmIGlzaW5zdGFuY2UocHJpY2VfaW5wdXQsIHBkLkRhdGFGcmFtZSkgZWxzZSBwcmljZV9pbnB1dAogICAgICAgIHByaWNlcywgd2VpZ2h0cywgYXNzZXRzID0gY2xvc2UudG9fZnJhbWUoc3ltYm9sKSwgcG9zaXRpb25zLnRvX2ZyYW1lKHN5bWJvbCksIFtzeW1ib2xdCiAgICBlbHNlOgogICAgICAgIHByaWNlcywgd2VpZ2h0cywgYXNzZXRzID0gcHJpY2VfaW5wdXQsIHBvc2l0aW9ucywgbGlzdChwcmljZV9pbnB1dC5jb2x1bW5zKQogICAgaWYgbm90IHByaWNlcy5pbmRleC5lcXVhbHMod2VpZ2h0cy5pbmRleCkgb3Igc2V0KHdlaWdodHMuY29sdW1ucykgIT0gc2V0KGFzc2V0cyk6CiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiRXZpZGVuY2Ugd2VpZ2h0cyBtdXN0IGNvdmVyIHRoZSBjb21wbGV0ZSBpbnB1dCB1bml2ZXJzZSIpCiAgICByZXR1cm4gbWFrZV9yZWNvcmRzKHByaWNlcy5pbmRleC5zdHJmdGltZSgiJVktJW0tJWQiKS50b2xpc3QoKSwgYXNzZXRzLAogICAgICAgICAgICAgICAgICAgICAgICBwcmljZXMudG9fbnVtcHkoZHR5cGU9ZmxvYXQpLnRvbGlzdCgpLCB3ZWlnaHRzW2Fzc2V0c10udG9fbnVtcHkoZHR5cGU9ZmxvYXQpLnRvbGlzdCgpKQoKCmRlZiBzdW1tYXJpemUocm93cyk6CiAgICBsYXN0ID0gcm93c1stMV0KICAgIHJlc3VsdCA9IHsib2JzZXJ2YXRpb25zIjogbGVuKHJvd3MpLCAidGVybWluYWxFcXVpdHkiOiBsYXN0WyJlcXVpdHkiXSwgInRvdGFsUmV0dXJuIjogbGFzdFsiZXF1aXR5Il0gLSAxLAogICAgICAgICAgICAgICJ0cmFuc2l0aW9uQ291bnQiOiBzdW0ocm93WyJ0YXJnZXRDaGFuZ2UiXSA+IDAgZm9yIHJvdyBpbiByb3dzKSwKICAgICAgICAgICAgICAidG90YWxUYXJnZXRDaGFuZ2UiOiBzdW0ocm93WyJ0YXJnZXRDaGFuZ2UiXSBmb3Igcm93IGluIHJvd3MpLAogICAgICAgICAgICAgICJ0b3RhbFJlYmFsYW5jZVR1cm5vdmVyIjogc3VtKHJvd1sicmViYWxhbmNlVHVybm92ZXIiXSBmb3Igcm93IGluIHJvd3MpfQogICAgZm9yIGtleSBpbiAoInRhcmdldEdyb3NzRXhwb3N1cmUiLCAidGFyZ2V0TmV0RXhwb3N1cmUiLCAidGFyZ2V0Q2FzaFdlaWdodCIsCiAgICAgICAgICAgICAgICAiZWZmZWN0aXZlR3Jvc3NFeHBvc3VyZSIsICJlZmZlY3RpdmVOZXRFeHBvc3VyZSIsICJlZmZlY3RpdmVDYXNoV2VpZ2h0Iik6CiAgICAgICAgcmVzdWx0W2tleV0gPSBsYXN0W2tleV0KICAgIGlmIGxlbihsYXN0WyJhc3NldHMiXSkgPT0gMToKICAgICAgICBhc3NldCA9IG5leHQoaXRlcihsYXN0WyJhc3NldHMiXS52YWx1ZXMoKSkpCiAgICAgICAgcmVzdWx0LnVwZGF0ZSh0YXJnZXRQb3NpdGlvbj1hc3NldFsidGFyZ2V0V2VpZ2h0Il0sIGVmZmVjdGl2ZVBvc2l0aW9uPWFzc2V0WyJlZmZlY3RpdmVXZWlnaHQiXSkKICAgIHJldHVybiByZXN1bHQKCgpkZWYgbG9hZF92Ml9yZWNvcmRzKG1hbmlmZXN0X3BhdGgsIHJvb3Q9Tm9uZSk6CiAgICBtYW5pZmVzdCA9IGpzb24ubG9hZHMoUGF0aChtYW5pZmVzdF9wYXRoKS5yZWFkX3RleHQoZW5jb2Rpbmc9InV0Zi04IikpCiAgICByb290ID0gcm9vdCBvciBhcnRpZmFjdF9yb290KG1hbmlmZXN0X3BhdGgpCiAgICByb3dzLCBtb250aHMgPSBbXSwgW10KICAgIGZvciByZWYgaW4gbWFuaWZlc3RbIm9iamVjdHMiXVsicmVjb3JkcyJdOgogICAgICAgIGNodW5rID0gbG9hZF9vYmplY3Qocm9vdCwgcmVmKQogICAgICAgIG1vbnRoID0gY2h1bmtbIm1vbnRoIl0KICAgICAgICBpZiBjaHVua1siYXNzZXRzIl0gIT0gbWFuaWZlc3RbImFzc2V0cyJdIG9yIG5vdCBjaHVua1sicm93cyJdOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJSZWNvcmQgY2h1bmsgaGFzIGRpZmZlcmVudCBhc3NldHMgb3IgaXMgZW1wdHkiKQogICAgICAgIGlmIGFueShyb3dbImRhdGUiXVs6N10gIT0gbW9udGggZm9yIHJvdyBpbiBjaHVua1sicm93cyJdKToKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiUmVjb3JkIGNyb3NzZXMgaXRzIGRlY2xhcmVkIG1vbnRoIikKICAgICAgICBtb250aHMuYXBwZW5kKG1vbnRoKQogICAgICAgIHJvd3MuZXh0ZW5kKGNodW5rWyJyb3dzIl0pCiAgICBpZiBtb250aHMgIT0gc29ydGVkKHNldChtb250aHMpKToKICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJEdXBsaWNhdGUgb3Igb3V0LW9mLW9yZGVyIG1vbnRobHkgY2h1bmtzIikKICAgIHJldHVybiByb3dzCgoKZGVmIGFzc2VydF9lcXVhbChhY3R1YWwsIGV4cGVjdGVkLCBwYXRoPSJ2YWx1ZSIpOgogICAgaWYgaXNpbnN0YW5jZShleHBlY3RlZCwgZGljdCk6CiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoYWN0dWFsLCBkaWN0KSBvciBzZXQoYWN0dWFsKSAhPSBzZXQoZXhwZWN0ZWQpOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKGYiTWlzbWF0Y2g6IHtwYXRofSBrZXlzIikKICAgICAgICBmb3Iga2V5IGluIGV4cGVjdGVkOgogICAgICAgICAgICBhc3NlcnRfZXF1YWwoYWN0dWFsW2tleV0sIGV4cGVjdGVkW2tleV0sIGYie3BhdGh9LntrZXl9IikKICAgIGVsaWYgaXNpbnN0YW5jZShleHBlY3RlZCwgbGlzdCk6CiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoYWN0dWFsLCBsaXN0KSBvciBsZW4oYWN0dWFsKSAhPSBsZW4oZXhwZWN0ZWQpOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKGYiTWlzbWF0Y2g6IHtwYXRofSBsZW5ndGgiKQogICAgICAgIGZvciBpLCB2YWx1ZSBpbiBlbnVtZXJhdGUoZXhwZWN0ZWQpOgogICAgICAgICAgICBhc3NlcnRfZXF1YWwoYWN0dWFsW2ldLCB2YWx1ZSwgZiJ7cGF0aH1be2l9XSIpCiAgICBlbGlmIGlzaW5zdGFuY2UoZXhwZWN0ZWQsIChpbnQsIGZsb2F0KSkgYW5kIG5vdCBpc2luc3RhbmNlKGV4cGVjdGVkLCBib29sKToKICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShhY3R1YWwsIChpbnQsIGZsb2F0KSkgb3Igbm90IG1hdGguaXNmaW5pdGUoYWN0dWFsKSBvciBub3QgbWF0aC5pc2Nsb3NlKGFjdHVhbCwgZXhwZWN0ZWQsIHJlbF90b2w9MWUtMTAsIGFic190b2w9MWUtMTApOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKGYiQXJpdGhtZXRpYyBtaXNtYXRjaDoge3BhdGh9IikKICAgIGVsaWYgYWN0dWFsICE9IGV4cGVjdGVkOgogICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoZiJNaXNtYXRjaDoge3BhdGh9IikKCgpkZWYgdmVyaWZ5X3YyKG1hbmlmZXN0X3BhdGgsIGlucHV0X3BhdGg9Tm9uZSwgcm9vdD1Ob25lKToKICAgIG1hbmlmZXN0ID0ganNvbi5sb2FkcyhQYXRoKG1hbmlmZXN0X3BhdGgpLnJlYWRfdGV4dChlbmNvZGluZz0idXRmLTgiKSkKICAgIHJvb3QgPSByb290IG9yIGFydGlmYWN0X3Jvb3QobWFuaWZlc3RfcGF0aCkKICAgIGlkZW50aXR5ID0gbWFuaWZlc3RbImlkZW50aXR5Il0KICAgIGlmIG1hbmlmZXN0LmdldCgic2NoZW1hVmVyc2lvbiIpICE9IDIgb3Igc2hhKGlkZW50aXR5KSAhPSBtYW5pZmVzdFsicnVuSWQiXToKICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJNYW5pZmVzdCBpZGVudGl0eSBtaXNtYXRjaCIpCiAgICBpZiAicGFyZW50IiBpbiBtYW5pZmVzdCBvciAicGFyZW50IiBpbiBpZGVudGl0eToKICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJNb250aGx5IGV2aWRlbmNlIG11c3Qgbm90IGNvbnRhaW4gcGFyZW50IGNoYWlucyIpCiAgICBvYmplY3RzID0gbWFuaWZlc3RbIm9iamVjdHMiXQogICAgY29uZmlnID0gbG9hZF9vYmplY3Qocm9vdCwgb2JqZWN0c1siY29uZmlnIl0pCiAgICBmcm9tIHJlcGxheV9ldmlkZW5jZSBpbXBvcnQgdmFsaWRhdGVfZGlzcGxheV9wcmVjaXNpb24KICAgIHZhbGlkYXRlX2Rpc3BsYXlfcHJlY2lzaW9uKG1hbmlmZXN0LCBjb25maWcpCiAgICBzb3VyY2VzID0gbG9hZF9vYmplY3Qocm9vdCwgb2JqZWN0c1sic291cmNlIl0pCiAgICBpZiBpZGVudGl0eSAhPSB7InNjaGVtYVZlcnNpb24iOiAyLCAic3RyYXRlZ3lJZCI6IG1hbmlmZXN0WyJzdHJhdGVneUlkIl0sICJzeW1ib2wiOiBtYW5pZmVzdFsic3ltYm9sIl0sCiAgICAgICAgICAgICAgICAgICAiaW5wdXRIYXNoIjogbWFuaWZlc3RbImlucHV0SGFzaCJdLCAiY29uZmlnSGFzaCI6IG9iamVjdHNbImNvbmZpZyJdWyJzaGEyNTYiXSwKICAgICAgICAgICAgICAgICAgICJzb3VyY2VIYXNoIjogb2JqZWN0c1sic291cmNlIl1bInNoYTI1NiJdLCAicmVjb3JkSGFzaGVzIjogW3JbInNoYTI1NiJdIGZvciByIGluIG9iamVjdHNbInJlY29yZHMiXV19OgogICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIk1hbmlmZXN0IG9iamVjdCBpZGVudGl0eSBtaXNtYXRjaCIpCiAgICBpZiBtYW5pZmVzdFsiZXhlY3V0aW9uTW9kZWwiXSAhPSBNT0RFTCBvciBjb25maWdbImV4ZWN1dGlvbk1vZGVsIl0gIT0gTU9ERUw6CiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiVW5rbm93biBleGVjdXRpb24gbW9kZWwiKQogICAgZm9yIGtleSBpbiAoInN0cmF0ZWd5SWQiLCAic3ltYm9sIiwgImtpbmQiLCAiYXNzZXRzIiwgImZvbGRzIiwgInNlbGVjdGlvbiIsICJydWxlVmVyc2lvbiIsICJydWxlQ29ycmVjdGlvbnMiKToKICAgICAgICBpZiBjb25maWdba2V5XSAhPSBtYW5pZmVzdFtrZXldOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKGYiQ29uZmlndXJhdGlvbiBtaXNtYXRjaDoge2tleX0iKQogICAgaWYgbWFuaWZlc3RbInNvdXJjZUhhc2hlcyJdICE9IHNvdXJjZXNbImZpbGVIYXNoZXMiXSBvciBzZXQoc291cmNlc1siZmlsZUhhc2hlcyJdKSAhPSBzZXQoc291cmNlc1siZmlsZXMiXSk6CiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiU291cmNlIGlkZW50aXR5IG1pc21hdGNoIikKICAgIGZvciBuYW1lLCByZWYgaW4gc291cmNlc1siZmlsZXMiXS5pdGVtcygpOgogICAgICAgIHNhZmVfcGF0aChyb290LCBuYW1lKQogICAgICAgIGlmIHNoYShsb2FkX29iamVjdChyb290LCByZWYpWyJ0ZXh0Il0uZW5jb2RlKCJ1dGYtOCIpKSAhPSBzb3VyY2VzWyJmaWxlSGFzaGVzIl1bbmFtZV06CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkFyY2hpdmVkIHNvdXJjZSBieXRlIGhhc2ggbWlzbWF0Y2giKQogICAgaWYgb2JqZWN0c1sicmVwbGF5Il0gIT0gc291cmNlc1siZmlsZXMiXVsic2NyaXB0cy9yZXBsYXlfZXZpZGVuY2UucHkiXToKICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJSZXBsYXkgc291cmNlIG1pc21hdGNoIikKICAgIGxhdW5jaGVyID0gbWFuaWZlc3RbImRvd25sb2FkcyJdWyJsYXVuY2hlciJdCiAgICBpZiBsYXVuY2hlclsicGF0aCJdICE9IGYiZGF0YS9ldmlkZW5jZS90b29scy97bGF1bmNoZXJbJ3NoYTI1NiddfS5weSI6CiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiSW52YWxpZCBsYXVuY2hlciBwYXRoIikKICAgIGNvbnRlbnQgPSBzYWZlX3BhdGgocm9vdCwgbGF1bmNoZXJbInBhdGgiXSkucmVhZF9ieXRlcygpCiAgICBpZiBsZW4oY29udGVudCkgIT0gbGF1bmNoZXJbImJ5dGVzIl0gb3Igc2hhKGNvbnRlbnQpICE9IGxhdW5jaGVyWyJzaGEyNTYiXToKICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJEb3dubG9hZGVyIGNoZWNrc3VtIG1pc21hdGNoIikKICAgIGlmIHNvdXJjZXNbImxhdW5jaGVyIl0gIT0gbGF1bmNoZXI6CiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiRG93bmxvYWRlciBkaWZmZXJzIGZyb20gYXJjaGl2ZWQgc291cmNlIGlkZW50aXR5IikKICAgIGlmIGlucHV0X3BhdGggaXMgbm90IE5vbmUgYW5kIHNoYShqc29uLmxvYWRzKFBhdGgoaW5wdXRfcGF0aCkucmVhZF90ZXh0KGVuY29kaW5nPSJ1dGYtOCIpKSkgIT0gbWFuaWZlc3RbImlucHV0SGFzaCJdOgogICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIk9yaWdpbmFsIGlucHV0IGhhc2ggbWlzbWF0Y2g7IHByb3ZpZGVyIGRhdGEgbWF5IGhhdmUgYmVlbiByZXZpc2VkIikKICAgIHJvd3MgPSBsb2FkX3YyX3JlY29yZHMobWFuaWZlc3RfcGF0aCwgcm9vdCkKICAgIGlmIGxlbihyb3dzKSA8IDIgb3Igcm93c1swXVsiZGF0ZSJdICE9IG1hbmlmZXN0WyJvYnNlcnZlZEZyb20iXSBvciByb3dzWy0xXVsiZGF0ZSJdICE9IG1hbmlmZXN0WyJvYnNlcnZlZFRocm91Z2giXToKICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJPYnNlcnZhdGlvbiBlbmRwb2ludHMgbWlzbWF0Y2giKQogICAgYXNzZXRzID0gbWFuaWZlc3RbImFzc2V0cyJdCiAgICAjIFJlcGxheSBmcm9tIHJldHVybnMsIHdpdGggc3ludGhldGljIHByaWNlIHBhdGhzOyBubyBtYXJrZXQgcHJpY2VzIGFyZSBwdWJsaWMuCiAgICBwcmV2aW91cywgd2VhbHRoLCBwcmV2aW91c19kYXRlID0gWzAuXSAqIGxlbihhc3NldHMpLCAxLiwgIiIKICAgIGZvciByb3cgaW4gcm93czoKICAgICAgICBpZiByb3dbImRhdGUiXSA8PSBwcmV2aW91c19kYXRlIG9yIHNldChyb3dbImFzc2V0cyJdKSAhPSBzZXQoYXNzZXRzKToKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiRGF0ZXMgb3IgYXNzZXQgY292ZXJhZ2UgaW52YWxpZCIpCiAgICAgICAgdGFyZ2V0ID0gW3Jvd1siYXNzZXRzIl1bYV1bInRhcmdldFdlaWdodCJdIGZvciBhIGluIGFzc2V0c10KICAgICAgICBtYXJrZXQgPSBbcm93WyJhc3NldHMiXVthXVsiYXNzZXRSZXR1cm4iXSBmb3IgYSBpbiBhc3NldHNdCiAgICAgICAgaWYgbm90IGFsbChtYXRoLmlzZmluaXRlKHYpIGZvciB2IGluIHRhcmdldCArIG1hcmtldCkgb3IgbWluKG1hcmtldCkgPD0gLTE6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkludmFsaWQgdGFyZ2V0IG9yIGFzc2V0IHJldHVybiIpCiAgICAgICAgaWYgbm90IHByZXZpb3VzX2RhdGUgYW5kIGFueShtYXJrZXQpOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJJbml0aWFsIGFzc2V0IHJldHVybnMgbXVzdCBiZSB6ZXJvIikKICAgICAgICBncm9zcyA9IHN1bSh3ICogciBmb3IgdywgciBpbiB6aXAocHJldmlvdXMsIG1hcmtldCkpCiAgICAgICAgaWYgZ3Jvc3MgPD0gLTE6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIk5vbnBvc2l0aXZlIHN5bnRoZXRpYyBlcXVpdHkiKQogICAgICAgIHdlYWx0aCAqPSAxICsgZ3Jvc3MKICAgICAgICBleHBlY3RlZCA9IG1ha2VfcmVjb3JkcyhbIjAiLCByb3dbImRhdGUiXV0sIGFzc2V0cywgW1sxLl0gKiBsZW4oYXNzZXRzKSwgWzEgKyByIGZvciByIGluIG1hcmtldF1dLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwcmV2aW91cywgdGFyZ2V0XSlbLTFdCiAgICAgICAgIyBtYWtlX3JlY29yZHMncyBmaXJzdCByb3cgZW50ZXJzIHByZXZpb3VzIHdlaWdodHMgYXQgdW5pdCBlcXVpdHkuCiAgICAgICAgZXhwZWN0ZWRbImVxdWl0eSJdID0gd2VhbHRoCiAgICAgICAgYXNzZXJ0X2VxdWFsKHJvdywgZXhwZWN0ZWQsIHJvd1siZGF0ZSJdKQogICAgICAgIHByZXZpb3VzLCBwcmV2aW91c19kYXRlID0gdGFyZ2V0LCByb3dbImRhdGUiXQogICAgYXNzZXJ0X2VxdWFsKG1hbmlmZXN0WyJzdW1tYXJ5Il0sIHN1bW1hcml6ZShyb3dzKSwgInN1bW1hcnkiKQogICAgYWN0aXZlID0gZGljdChjb25maWdbImRlZmF1bHRzIl0pCiAgICBmb3IgZm9sZCBpbiBjb25maWdbImZvbGRzIl06CiAgICAgICAgaWYgZm9sZFsidGVzdFN0YXJ0Il1bOjEwXSA8PSByb3dzWy0xXVsiZGF0ZSJdIDw9IGZvbGRbInRlc3RFbmQiXVs6MTBdOgogICAgICAgICAgICBhY3RpdmUudXBkYXRlKGZvbGRbImNvbmZpZyJdKQogICAgYXNzZXJ0X2VxdWFsKG1hbmlmZXN0WyJwYXJhbWV0ZXJzIl0sIHsiZGVmYXVsdHMiOiBjb25maWdbImRlZmF1bHRzIl0sICJhY3RpdmUiOiBhY3RpdmV9LCAicGFyYW1ldGVycyIpCiAgICByZXR1cm4geyJydW5JZCI6IG1hbmlmZXN0WyJydW5JZCJdLCAqKm1hbmlmZXN0WyJzdW1tYXJ5Il0sCiAgICAgICAgICAgICJ2ZXJpZmljYXRpb24iOiAiUmVjb3JkZWQgYXJpdGhtZXRpYzsgYXJjaGl2ZWQgb3JpZ2luYWwtaW5wdXQgcmVjb21wdXRhdGlvbiBpcyBzZXBhcmF0ZSJ9CgoKZGVmIGRlY2xhcmVfY29ob3J0KHN0cmF0ZWdpZXMsIGluc3RydW1lbnRzKToKICAgICIiIkRlY2xhcmUgdGhlIGRlbm9taW5hdG9yIGJlZm9yZSBkb3dubG9hZHMvZXZhbHVhdGlvbjsgbmV2ZXIgZGVyaXZlIGl0IGZyb20gc3VjY2Vzc2VzLiIiIgogICAgZnJvbSBidWlsZF9kYXRhIGltcG9ydCBleHBhbmRfc3RyYXRlZ3lfaW5zdHJ1bWVudHMKICAgIGNvaG9ydCwgc2VlbiA9IFtdLCBzZXQoKQogICAgZm9yIHN0cmF0ZWd5IGluIHN0cmF0ZWdpZXM6CiAgICAgICAgc3BlYyA9IHN0cmF0ZWd5LlNUUkFURUdZCiAgICAgICAgYmFza2V0ID0gc3BlYy5nZXQoIm1vZGUiKSA9PSAicG9ydGZvbGlvIgogICAgICAgIHN5bWJvbHMgPSAoW3NwZWMuZ2V0KCJwb3J0Zm9saW9TeW1ib2wiKSBvciAoc3BlYy5nZXQoImluc3RydW1lbnRzIikgb3IgW3NwZWNbImlkIl1dKVswXV0KICAgICAgICAgICAgICAgICAgIGlmIGJhc2tldCBlbHNlIGV4cGFuZF9zdHJhdGVneV9pbnN0cnVtZW50cyhzcGVjLCBpbnN0cnVtZW50cylbImluc3RydW1lbnRzIl0pCiAgICAgICAgZm9yIHN5bWJvbCBpbiBzeW1ib2xzOgogICAgICAgICAgICBwYWlyID0gKHNwZWNbImlkIl0sIHN5bWJvbCkKICAgICAgICAgICAgaWYgcGFpciBpbiBzZWVuOgogICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcihmIkR1cGxpY2F0ZSBkZWNsYXJlZCBzdHJhdGVneS9tYXJrZXQ6IHtwYWlyfSIpCiAgICAgICAgICAgIHNlZW4uYWRkKHBhaXIpCiAgICAgICAgICAgIGNvaG9ydC5hcHBlbmQoeyJzdHJhdGVneUlkIjogcGFpclswXSwgInN5bWJvbCI6IHN5bWJvbCwgImtpbmQiOiAiYmFza2V0IiBpZiBiYXNrZXQgZWxzZSAic2luZ2xlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgInVuaXZlcnNlIjogbGlzdChzcGVjLmdldCgidW5pdmVyc2UiLCBpbnN0cnVtZW50cykpIGlmIGJhc2tldCBlbHNlIFtzeW1ib2xdfSkKICAgIHJldHVybiBjb2hvcnQKCgpkZWYgZGVwZW5kZW5jeV92ZXJzaW9ucygpOgogICAgdmVyc2lvbnMgPSB7fQogICAgZm9yIG5hbWUgaW4gKCJudW1weSIsICJwYW5kYXMiLCAic2NpcHkiLCAieWZpbmFuY2UiKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIHZlcnNpb25zW25hbWVdID0gaW1wb3J0bGliLm1ldGFkYXRhLnZlcnNpb24obmFtZSkKICAgICAgICBleGNlcHQgaW1wb3J0bGliLm1ldGFkYXRhLlBhY2thZ2VOb3RGb3VuZEVycm9yOgogICAgICAgICAgICB2ZXJzaW9uc1tuYW1lXSA9IE5vbmUKICAgIHJldHVybiB7InB5dGhvbiI6IHBsYXRmb3JtLnB5dGhvbl92ZXJzaW9uKCksICJwYWNrYWdlcyI6IHZlcnNpb25zfQoKCmRlZiBzdG9yYWdlX3JlcG9ydChkYXRhX2Rpcik6CiAgICAiIiJNZWFzdXJlIGFsbCBpbW11dGFibGUgcHVibGljIGZpbGVzLCBpbmNsdWRpbmcgbWV0YWRhdGEgYW5kIG9sZCBzbmFwc2hvdHMuIiIiCiAgICBldmlkZW5jZSA9IFBhdGgoZGF0YV9kaXIpIC8gImV2aWRlbmNlIgogICAgZ3JvdXBzID0geyJvYmplY3RzIjogbGlzdCgoZXZpZGVuY2UgLyAib2JqZWN0cyIpLmdsb2IoIiouanNvbi5neiIpKSwKICAgICAgICAgICAgICAibWFuaWZlc3RzIjogbGlzdCgoZXZpZGVuY2UgLyAicnVucyIpLmdsb2IoIiovbWFuaWZlc3QuanNvbiIpKSwKICAgICAgICAgICAgICAibGF1bmNoZXJzIjogbGlzdCgoZXZpZGVuY2UgLyAidG9vbHMiKS5nbG9iKCIqLnB5IikpfQogICAgcmV0dXJuIHsiZ3JvdXBzIjoge25hbWU6IHsiZmlsZXMiOiBsZW4ocGF0aHMpLCAiYnl0ZXMiOiBzdW0ocC5zdGF0KCkuc3Rfc2l6ZSBmb3IgcCBpbiBwYXRocyl9CiAgICAgICAgICAgICAgICAgICAgICAgZm9yIG5hbWUsIHBhdGhzIGluIGdyb3Vwcy5pdGVtcygpfSwKICAgICAgICAgICAgInRvdGFsSW1tdXRhYmxlQnl0ZXMiOiBzdW0ocC5zdGF0KCkuc3Rfc2l6ZSBmb3IgcCBpbiBldmlkZW5jZS5yZ2xvYigiKiIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHAuaXNfZmlsZSgpIGFuZCBwLm5hbWUgbm90IGluIHsiaW5kZXguanNvbiIsICJpbmRleC5qc29uLnRtcCJ9KSwKICAgICAgICAgICAgIm5vdGUiOiAiSW5jbHVkZXMgcmV0YWluZWQgcHJpb3IgaW1tdXRhYmxlIGZpbGVzOyBtb250aGx5IG9iamVjdCBzYXZpbmdzIGRvIG5vdCBleGNsdWRlIG1hbmlmZXN0L2NvbmZpZyBvdmVyaGVhZC4ifQoKCmRlZiBhcmNoaXZlX3NvdXJjZXMocm9vdCwgc3RyYXRlZ3ksIGxhdW5jaGVyKToKICAgIGRpcmVjdG9yeSA9IFBhdGgoX19maWxlX18pLnBhcmVudAogICAgbmFtZXMgPSAoImJ1aWxkX2RhdGEucHkiLCAic3RyYXRlZ3lfZXZpZGVuY2UucHkiLCAiZXZpZGVuY2VfdjIucHkiLCAicmVwbGF5X2V2aWRlbmNlLnB5IiwKICAgICAgICAgICAgICJyZWNvbXB1dGVfZXZpZGVuY2UucHkiLCAiZW5yaWNoX21ldHJpY3MucHkiLCAicGVyZm9ybWFuY2VfaW8ucHkiLCAicmVxdWlyZW1lbnRzLnR4dCIpCiAgICBjb250ZW50cyA9IHtmInNjcmlwdHMve25hbWV9IjogKGRpcmVjdG9yeSAvIG5hbWUpLnJlYWRfYnl0ZXMoKSBmb3IgbmFtZSBpbiBuYW1lc30KICAgIHN0cmF0ZWd5X3BhdGggPSBmInNjcmlwdHMvc3RyYXRlZ2llcy97UGF0aChzdHJhdGVneS5fX2ZpbGVfXykubmFtZX0iCiAgICBjb250ZW50c1tzdHJhdGVneV9wYXRoXSA9IFBhdGgoc3RyYXRlZ3kuX19maWxlX18pLnJlYWRfYnl0ZXMoKQogICAgIyBTaGFyZWQgbG9jYWwgc3RyYXRlZ3kgaGVscGVycyBhcmUgYXJjaGl2ZWQgdG9vOyBvcmRpbmFyeSBydWxlcyBjdXJyZW50bHkKICAgICMgaW1wb3J0IG9ubHkgaW5zdGFsbGVkIGRlcGVuZGVuY2llcy4gRG8gbm90IHN1YnN0aXR1dGUgY3VycmVudCBoZWxwZXIgY29kZS4KICAgIGZvciBwYXRoIGluIChkaXJlY3RvcnkgLyAic3RyYXRlZ2llcyIpLmdsb2IoIl8qLnB5Iik6CiAgICAgICAgY29udGVudHNbZiJzY3JpcHRzL3N0cmF0ZWdpZXMve3BhdGgubmFtZX0iXSA9IHBhdGgucmVhZF9ieXRlcygpCiAgICBmaWxlcyA9IHtuYW1lOiBvYmplY3RfcmVmKHJvb3QsIHsidGV4dCI6IGNvbnRlbnQuZGVjb2RlKCJ1dGYtOCIpfSkgZm9yIG5hbWUsIGNvbnRlbnQgaW4gY29udGVudHMuaXRlbXMoKX0KICAgIGhhc2hlcyA9IHtuYW1lOiBzaGEoY29udGVudCkgZm9yIG5hbWUsIGNvbnRlbnQgaW4gY29udGVudHMuaXRlbXMoKX0KICAgIHJldHVybiBvYmplY3RfcmVmKHJvb3QsIHsiZmlsZXMiOiBmaWxlcywgImZpbGVIYXNoZXMiOiBoYXNoZXMsICJzdHJhdGVneVBhdGgiOiBzdHJhdGVneV9wYXRoLCAibGF1bmNoZXIiOiBsYXVuY2hlcn0pLCBmaWxlcywgaGFzaGVzCgoKZGVmIGRvd25sb2FkZXJfYnl0ZXMoKToKICAgICIiIkEgc2luZ2xlIHB1YmxpYyBzdGRsaWIgbGF1bmNoZXI7IG5vIHByaXZhdGUgcmVwb3NpdG9yeSBjbG9uZSByZXF1aXJlZC4iIiIKICAgIGRpcmVjdG9yeSA9IFBhdGgoX19maWxlX18pLnBhcmVudAogICAgZW1iZWRkZWQgPSB7bmFtZTogYmFzZTY0LmI2NGVuY29kZSgoZGlyZWN0b3J5IC8gbmFtZSkucmVhZF9ieXRlcygpKS5kZWNvZGUoImFzY2lpIikKICAgICAgICAgICAgICAgIGZvciBuYW1lIGluICgiZXZpZGVuY2VfdjIucHkiLCAicmVjb21wdXRlX2V2aWRlbmNlLnB5IiwgInJlcGxheV9ldmlkZW5jZS5weSIpfQogICAgcmV0dXJuICgiIyBRdWFudEFyZW5hIGV2aWRlbmNlIGRvd25sb2FkZXIuIFN0YW5kYXJkIGxpYnJhcnkgb25seSBmb3IgLS1idW5kbGUuXG4iCiAgICAgICAgICAgICJpbXBvcnQgYmFzZTY0LCBwYXRobGliLCBydW5weSwgc3lzLCB0ZW1wZmlsZVxuIgogICAgICAgICAgICBmIkZJTEVTID0ge2VtYmVkZGVkIXJ9XG4iCiAgICAgICAgICAgICJ3aXRoIHRlbXBmaWxlLlRlbXBvcmFyeURpcmVjdG9yeShwcmVmaXg9J3F1YW50YXJlbmEtdG9vbHMtJykgYXMgZm9sZGVyOlxuIgogICAgICAgICAgICAiICAgIGZvciBuYW1lLCBjb250ZW50IGluIEZJTEVTLml0ZW1zKCk6XG4iCiAgICAgICAgICAgICIgICAgICAgIHBhdGhsaWIuUGF0aChmb2xkZXIsIG5hbWUpLndyaXRlX2J5dGVzKGJhc2U2NC5iNjRkZWNvZGUoY29udGVudCkpXG4iCiAgICAgICAgICAgICIgICAgc3lzLnBhdGguaW5zZXJ0KDAsIGZvbGRlcilcbiIKICAgICAgICAgICAgIiAgICBydW5weS5ydW5fcGF0aChzdHIocGF0aGxpYi5QYXRoKGZvbGRlciwgJ3JlY29tcHV0ZV9ldmlkZW5jZS5weScpKSwgcnVuX25hbWU9J19fbWFpbl9fJylcbiIpLmVuY29kZSgidXRmLTgiKQoKCmNsYXNzIEV2aWRlbmNlQnVpbGRWMjoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkYXRhX2RpciwgcHJpdmF0ZV9kaXIsIGdlbmVyYXRlZF9hdCwgY29ob3J0KToKICAgICAgICBmcm9tIHN0cmF0ZWd5X2V2aWRlbmNlIGltcG9ydCBnaXRfcHJvdmVuYW5jZQogICAgICAgIHNlbGYuZGF0YSwgc2VsZi5wcml2YXRlID0gUGF0aChkYXRhX2RpciksIFBhdGgocHJpdmF0ZV9kaXIpCiAgICAgICAgaWYgc2VsZi5wcml2YXRlLnJlc29sdmUoKS5pc19yZWxhdGl2ZV90byhzZWxmLmRhdGEucmVzb2x2ZSgpKToKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiUHJpdmF0ZSBvcmlnaW5hbCBpbnB1dHMgbXVzdCByZW1haW4gb3V0c2lkZSBwdWJsaXNoZWQgZGF0YSIpCiAgICAgICAgc2VsZi5yb290LCBzZWxmLmdlbmVyYXRlZF9hdCA9IHNlbGYuZGF0YS5wYXJlbnQsIHN0cihnZW5lcmF0ZWRfYXQpCiAgICAgICAgc2VsZi5wcml2YXRlLm1rZGlyKHBhcmVudHM9VHJ1ZSwgZXhpc3Rfb2s9VHJ1ZSkKICAgICAgICBzZWxmLnN0YWdlID0gUGF0aCh0ZW1wZmlsZS5ta2R0ZW1wKHByZWZpeD0iZXZpZGVuY2UtdjItIiwgZGlyPXNlbGYucHJpdmF0ZSkpCiAgICAgICAgc2VsZi5kZWNsYXJlZCA9IHsoZW50cnlbInN0cmF0ZWd5SWQiXSwgZW50cnlbInN5bWJvbCJdKTogZGljdChlbnRyeSkgZm9yIGVudHJ5IGluIGNvaG9ydH0KICAgICAgICBpZiBsZW4oc2VsZi5kZWNsYXJlZCkgIT0gbGVuKGNvaG9ydCkgb3Igbm90IGNvaG9ydDoKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiQ29ob3J0IG11c3QgYmUgbm9uZW1wdHkgYW5kIHVuaXF1ZSIpCiAgICAgICAgc2VsZi5zdGF0dXNlcywgc2VsZi5ydW5zID0ge30sIHt9CiAgICAgICAgc2VsZi5naXQgPSBnaXRfcHJvdmVuYW5jZShzZWxmLnJvb3QpCiAgICAgICAgbGF1bmNoZXIgPSBkb3dubG9hZGVyX2J5dGVzKCkKICAgICAgICBsYXVuY2hlcl9oYXNoID0gc2hhKGxhdW5jaGVyKQogICAgICAgIHJlbGF0aXZlID0gZiJkYXRhL2V2aWRlbmNlL3Rvb2xzL3tsYXVuY2hlcl9oYXNofS5weSIKICAgICAgICBsYXVuY2hlcl9wYXRoID0gc2FmZV9wYXRoKHNlbGYucm9vdCwgcmVsYXRpdmUpCiAgICAgICAgbGF1bmNoZXJfcGF0aC5wYXJlbnQubWtkaXIocGFyZW50cz1UcnVlLCBleGlzdF9vaz1UcnVlKQogICAgICAgIGlmIGxhdW5jaGVyX3BhdGguZXhpc3RzKCk6CiAgICAgICAgICAgIGlmIHNoYShsYXVuY2hlcl9wYXRoLnJlYWRfYnl0ZXMoKSkgIT0gbGF1bmNoZXJfaGFzaDoKICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkNvcnJ1cHQgaW1tdXRhYmxlIGRvd25sb2FkZXIiKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGxhdW5jaGVyX3BhdGgud3JpdGVfYnl0ZXMobGF1bmNoZXIpCiAgICAgICAgc2VsZi5kb3dubG9hZGVyID0geyJwYXRoIjogcmVsYXRpdmUsICJzaGEyNTYiOiBsYXVuY2hlcl9oYXNoLCAiYnl0ZXMiOiBsZW4obGF1bmNoZXIpfQoKICAgIGRlZiBtYXJrKHNlbGYsIHN0cmF0ZWd5X2lkLCBzeW1ib2wsIHN0YXR1cywgcmVhc29uKToKICAgICAgICBwYWlyID0gKHN0cmF0ZWd5X2lkLCBzeW1ib2wpCiAgICAgICAgaWYgcGFpciBub3QgaW4gc2VsZi5kZWNsYXJlZCBvciBzdGF0dXMgbm90IGluIHsidW5hdmFpbGFibGUiLCAiZmFpbGVkIiwgInVuc3VwcG9ydGVkIn0gb3Igbm90IHJlYXNvbjoKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiSW52YWxpZCBjb2hvcnQgc3RhdHVzIikKICAgICAgICBpZiBwYWlyIGluIHNlbGYuc3RhdHVzZXM6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkNvaG9ydCBwYWlyIGFscmVhZHkgcmVzb2x2ZWQiKQogICAgICAgIHNlbGYuc3RhdHVzZXNbcGFpcl0gPSB7KipzZWxmLmRlY2xhcmVkW3BhaXJdLCAic3RhdHVzIjogc3RhdHVzLCAicmVhc29uIjogc3RyKHJlYXNvbil9CgogICAgZGVmIGFkZF9ydW4oc2VsZiwgc3RyYXRlZ3ksIHN5bWJvbCwgcHJpY2VfaW5wdXQsIHBvc2l0aW9ucywgZGVmYXVsdHMsIGZvbGRzLCBjaG9pY2UsCiAgICAgICAgICAgICAgICBwaXBlbGluZV9jb25maWcsIHJlYXNvbj1Ob25lLCBhY2NvdW50aW5nX2NvcnJlY3Rpb249Tm9uZSwgZXZhbHVhdGlvbl9mb2xkcz1Ob25lKToKICAgICAgICBmcm9tIHN0cmF0ZWd5X2V2aWRlbmNlIGltcG9ydCBpbnB1dF9zbmFwc2hvdCwganNvbl92YWx1ZSwgYWN0aXZlX3BhcmFtZXRlcnMKICAgICAgICBwYWlyID0gKHN0cmF0ZWd5LlNUUkFURUdZWyJpZCJdLCBzeW1ib2wpCiAgICAgICAgaWYgcGFpciBub3QgaW4gc2VsZi5kZWNsYXJlZCBvciBwYWlyIGluIHNlbGYuc3RhdHVzZXM6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIlJ1biBpcyB1bmRlY2xhcmVkIG9yIGFscmVhZHkgcmVzb2x2ZWQiKQogICAgICAgIGRlY2xhcmF0aW9uID0gc2VsZi5kZWNsYXJlZFtwYWlyXQogICAgICAgIGtpbmQsIGFzc2V0cyA9IGRlY2xhcmF0aW9uWyJraW5kIl0sIGRlY2xhcmF0aW9uWyJ1bml2ZXJzZSJdCiAgICAgICAgaWYga2luZCA9PSAiYmFza2V0IiBhbmQgbGlzdChwcmljZV9pbnB1dC5jb2x1bW5zKSAhPSBhc3NldHM6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIk1pc3Npbmcgb3IgcmVvcmRlcmVkIGRlY2xhcmVkIHVuaXZlcnNlIG1lbWJlcnMiKQogICAgICAgIHJvd3MgPSByZWNvcmRzX2Zyb21fZnJhbWVzKHByaWNlX2lucHV0LCBwb3NpdGlvbnMsIHN5bWJvbCwga2luZCkKICAgICAgICBpbnB1dHMgPSBqc29uX3ZhbHVlKGlucHV0X3NuYXBzaG90KHByaWNlX2lucHV0KSkKICAgICAgICBpbnB1dF9oYXNoID0gc2hhKGlucHV0cykKICAgICAgICBwcml2YXRlID0gc2VsZi5wcml2YXRlIC8gZiJ7aW5wdXRfaGFzaH0uanNvbiIKICAgICAgICBpZiBwcml2YXRlLmV4aXN0cygpIGFuZCBzaGEoanNvbi5sb2Fkcyhwcml2YXRlLnJlYWRfdGV4dChlbmNvZGluZz0idXRmLTgiKSkpICE9IGlucHV0X2hhc2g6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkNvcnJ1cHQgcHJpdmF0ZSBvcmlnaW5hbCBpbnB1dCBzbmFwc2hvdCIpCiAgICAgICAgaWYgbm90IHByaXZhdGUuZXhpc3RzKCk6CiAgICAgICAgICAgIHByaXZhdGUud3JpdGVfYnl0ZXMoZW5jb2RlKGlucHV0cykpCiAgICAgICAgc291cmNlLCBzb3VyY2VfZmlsZXMsIHNvdXJjZV9oYXNoZXMgPSBhcmNoaXZlX3NvdXJjZXMoc2VsZi5yb290LCBzdHJhdGVneSwgc2VsZi5kb3dubG9hZGVyKQogICAgICAgIGNvbmZpZyA9IGpzb25fdmFsdWUoeyJzdHJhdGVneUlkIjogcGFpclswXSwgInN5bWJvbCI6IHN5bWJvbCwgImtpbmQiOiBraW5kLCAiYXNzZXRzIjogYXNzZXRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHRzIjogZGVmYXVsdHMsICJmb2xkcyI6IGZvbGRzLCAiZXZhbHVhdGlvbkZvbGRzIjogZXZhbHVhdGlvbl9mb2xkcyBpZiBldmFsdWF0aW9uX2ZvbGRzIGlzIG5vdCBOb25lIGVsc2UgZm9sZHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2VsZWN0aW9uIjogY2hvaWNlLCAicGlwZWxpbmUiOiBwaXBlbGluZV9jb25maWcsICJleGVjdXRpb25Nb2RlbCI6IE1PREVMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgInJ1bGVWZXJzaW9uIjogc3RyYXRlZ3kuU1RSQVRFR1kuZ2V0KCJydWxlVmVyc2lvbiIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgInJ1bGVDb3JyZWN0aW9ucyI6IHN0cmF0ZWd5LlNUUkFURUdZLmdldCgiY29ycmVjdGlvbnMiLCBbXSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVwZW5kZW5jaWVzIjogZGVwZW5kZW5jeV92ZXJzaW9ucygpLCAiaW5wdXRLaW5kIjogImZyYW1lIiBpZiBoYXNhdHRyKHByaWNlX2lucHV0LCAiY29sdW1ucyIpIGVsc2UgInNlcmllcyJ9KQogICAgICAgIGNvbmZpZ3VyYXRpb24gPSBvYmplY3RfcmVmKHNlbGYucm9vdCwgY29uZmlnKQogICAgICAgIGdyb3VwZWQgPSB7fQogICAgICAgIGZvciByb3cgaW4gcm93czoKICAgICAgICAgICAgZ3JvdXBlZC5zZXRkZWZhdWx0KHJvd1siZGF0ZSJdWzo3XSwgW10pLmFwcGVuZChyb3cpCiAgICAgICAgcmVjb3JkcyA9IFtvYmplY3RfcmVmKHNlbGYucm9vdCwgeyJtb250aCI6IG1vbnRoLCAiYXNzZXRzIjogYXNzZXRzLCAicm93cyI6IGdyb3VwfSkgZm9yIG1vbnRoLCBncm91cCBpbiBncm91cGVkLml0ZW1zKCldCiAgICAgICAgaWRlbnRpdHkgPSB7InNjaGVtYVZlcnNpb24iOiAyLCAic3RyYXRlZ3lJZCI6IHBhaXJbMF0sICJzeW1ib2wiOiBzeW1ib2wsICJpbnB1dEhhc2giOiBpbnB1dF9oYXNoLAogICAgICAgICAgICAgICAgICAgICJjb25maWdIYXNoIjogY29uZmlndXJhdGlvblsic2hhMjU2Il0sICJzb3VyY2VIYXNoIjogc291cmNlWyJzaGEyNTYiXSwKICAgICAgICAgICAgICAgICAgICAicmVjb3JkSGFzaGVzIjogW3JlZlsic2hhMjU2Il0gZm9yIHJlZiBpbiByZWNvcmRzXX0KICAgICAgICBydW5faWQgPSBzaGEoaWRlbnRpdHkpCiAgICAgICAgcHJlZml4ID0gZiJkYXRhL2V2aWRlbmNlL3J1bnMve3J1bl9pZH0iCiAgICAgICAgbWFuaWZlc3QgPSB7InNjaGVtYVZlcnNpb24iOiAyLCAic3RyYXRlZ3lJZCI6IHBhaXJbMF0sICJzeW1ib2wiOiBzeW1ib2wsICJraW5kIjoga2luZCwgImFzc2V0cyI6IGFzc2V0cywKICAgICAgICAgICAgICAgICAgICAicnVuSWQiOiBydW5faWQsICJpZGVudGl0eSI6IGlkZW50aXR5LCAiZ2VuZXJhdGVkQXQiOiBzZWxmLmdlbmVyYXRlZF9hdCwKICAgICAgICAgICAgICAgICAgICAib2JzZXJ2ZWRGcm9tIjogcm93c1swXVsiZGF0ZSJdLCAib2JzZXJ2ZWRUaHJvdWdoIjogcm93c1stMV1bImRhdGUiXSwgImlucHV0SGFzaCI6IGlucHV0X2hhc2gsCiAgICAgICAgICAgICAgICAgICAgImV4ZWN1dGlvbk1vZGVsIjogTU9ERUwsICJwYXJhbWV0ZXJzIjogeyJkZWZhdWx0cyI6IGRlZmF1bHRzLCAiYWN0aXZlIjogYWN0aXZlX3BhcmFtZXRlcnMoZGVmYXVsdHMsIGZvbGRzLCBwcmljZV9pbnB1dC5pbmRleFstMV0pfSwKICAgICAgICAgICAgICAgICAgICAiZm9sZHMiOiBmb2xkcywgInNlbGVjdGlvbiI6IGNob2ljZSwgInJlYXNvbiI6IHJlYXNvbiwgImdpdCI6IHNlbGYuZ2l0LAogICAgICAgICAgICAgICAgICAgICJzb3VyY2VIYXNoZXMiOiBzb3VyY2VfaGFzaGVzLAogICAgICAgICAgICAgICAgICAgICJkb3dubG9hZHMiOiB7ImxhdW5jaGVyIjogc2VsZi5kb3dubG9hZGVyfSwKICAgICAgICAgICAgICAgICAgICAib2JqZWN0cyI6IHsiY29uZmlnIjogY29uZmlndXJhdGlvbiwgInNvdXJjZSI6IHNvdXJjZSwgInJlY29yZHMiOiByZWNvcmRzLCAicmVwbGF5Ijogc291cmNlX2ZpbGVzWyJzY3JpcHRzL3JlcGxheV9ldmlkZW5jZS5weSJdfSwKICAgICAgICAgICAgICAgICAgICAic3VtbWFyeSI6IHN1bW1hcml6ZShyb3dzKSwgInNhbWVJbnB1dEFjY291bnRpbmdDb3JyZWN0aW9uIjogYWNjb3VudGluZ19jb3JyZWN0aW9uLAogICAgICAgICAgICAgICAgICAgICJydWxlVmVyc2lvbiI6IHN0cmF0ZWd5LlNUUkFURUdZLmdldCgicnVsZVZlcnNpb24iKSwKICAgICAgICAgICAgICAgICAgICAicnVsZUNvcnJlY3Rpb25zIjogc3RyYXRlZ3kuU1RSQVRFR1kuZ2V0KCJjb3JyZWN0aW9ucyIsIFtdKSwKICAgICAgICAgICAgICAgICAgICAicmVwcm9kdWN0aW9uIjogeyJndWFyYW50ZWUiOiAiU3RhbmRhcmQtbGlicmFyeSBhcml0aG1ldGljIHJlcGxheSB0byAxZS0xMDsgYXJjaGl2ZWQtc291cmNlIHJlY29tcHV0YXRpb24gcmVxdWlyZXMgbWF0Y2hpbmcgcHJpdmF0ZSBpbnB1dHMgYW5kIGRlcGVuZGVuY2llcy4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbW1hbmQiOiAicHl0aG9uIHNjcmlwdHMvcmVwbGF5X2V2aWRlbmNlLnB5IGRhdGEvZXZpZGVuY2UvcnVucy88cnVuLWlkPi9tYW5pZmVzdC5qc29uIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZWNvbXB1dGVDb21tYW5kIjogInB5dGhvbiBzY3JpcHRzL3JlY29tcHV0ZV9ldmlkZW5jZS5weSA8bWFuaWZlc3Q+IC0taW5wdXQgPHByaXZhdGUtaW5wdXQuanNvbj4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJ1bmRsZUNvbW1hbmQiOiAicHl0aG9uIDxkb3dubG9hZGVkLWxhdW5jaGVyLnB5PiBodHRwczovL3F1YW50YXJlbmFzLmNvbS8iICsgcHJlZml4ICsgIi9tYW5pZmVzdC5qc29uIC0tYnVuZGxlIHJlcGxheS56aXAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFjcXVpc2l0aW9uQ29tbWFuZCI6ICJweXRob24gPGRvd25sb2FkZWQtbGF1bmNoZXIucHk+IGh0dHBzOi8vcXVhbnRhcmVuYXMuY29tLyIgKyBwcmVmaXggKyAiL21hbmlmZXN0Lmpzb24gLS1mZXRjaC1pbnB1dCBwcml2YXRlLWlucHV0Lmpzb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImlucHV0VmVyaWZpY2F0aW9uIjogZiJQcml2YXRlIG9yaWdpbmFsIHNuYXBzaG90OiB7aW5wdXRfaGFzaH0uanNvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid2FybmluZyI6ICJPcmlnaW5hbCBwcm92aWRlciBpbnB1dHMgYXJlIG5vdCBwdWJsaWMuIFJldmlzZWQgaW5wdXQgaGFzaGVzIGNhbm5vdCBjbGFpbSBleGFjdCByZWNvbXB1dGF0aW9uLiBFeGVjdXRlIGFyY2hpdmVkIHNvdXJjZSBvbmx5IGlmIHlvdSB0cnVzdCBpdHMgYXV0aG9yLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGlzcGxheUVxdWl0eURlY2ltYWxzIjogcGlwZWxpbmVfY29uZmlnLmdldCgiZXF1aXR5X3JvdW5kIiwgNCl9LAogICAgICAgICAgICAgICAgICAgICJzdG9yYWdlIjogeyJraW5kIjogImluZGVwZW5kZW50LW1vbnRoLWNodW5rcyIsICJyZWNvcmRDaHVua3MiOiBsZW4ocmVjb3JkcyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlY29yZENvbXByZXNzZWRCeXRlcyI6IHN1bShyZWZbImNvbXByZXNzZWRCeXRlcyJdIGZvciByZWYgaW4gcmVjb3JkcyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlY29yZFVuY29tcHJlc3NlZEJ5dGVzIjogc3VtKHJlZlsidW5jb21wcmVzc2VkQnl0ZXMiXSBmb3IgcmVmIGluIHJlY29yZHMpfX0KICAgICAgICBkaXJlY3RvcnkgPSBzZWxmLnN0YWdlIC8gcnVuX2lkCiAgICAgICAgZGlyZWN0b3J5Lm1rZGlyKGV4aXN0X29rPVRydWUpCiAgICAgICAgbWFuaWZlc3RfcGF0aCA9IGRpcmVjdG9yeSAvICJtYW5pZmVzdC5qc29uIgogICAgICAgIG1hbmlmZXN0X3BhdGgud3JpdGVfYnl0ZXMoZW5jb2RlKGpzb25fdmFsdWUobWFuaWZlc3QpKSkKICAgICAgICB2ZXJpZnlfdjIobWFuaWZlc3RfcGF0aCwgcHJpdmF0ZSwgcm9vdD1zZWxmLnJvb3QpCiAgICAgICAgcmVmID0geyJydW5JZCI6IHJ1bl9pZCwgIm1hbmlmZXN0IjogZiJ7cHJlZml4fS9tYW5pZmVzdC5qc29uIiwgInNjaGVtYVZlcnNpb24iOiAyfQogICAgICAgIHNlbGYucnVucy5zZXRkZWZhdWx0KHBhaXJbMF0sIHt9KVtzeW1ib2xdID0gcmVmCiAgICAgICAgc2VsZi5zdGF0dXNlc1twYWlyXSA9IHsqKmRlY2xhcmF0aW9uLCAic3RhdHVzIjogImNvbXBsZXRlIiwgKipyZWZ9CiAgICAgICAgcmV0dXJuIHJlZgoKICAgIGRlZiBhY3RpdmF0ZShzZWxmLCBwZXJmb3JtYW5jZSwgd2ZvX2Nob2ljZXMsIHdyaXRlX3BlcmZvcm1hbmNlLCBmYWlsX2F0PU5vbmUsIHN0cmF0ZWd5X21ldGFkYXRhPU5vbmUpOgogICAgICAgIGZyb20gc3RyYXRlZ3lfZXZpZGVuY2UgaW1wb3J0IGFjdGl2ZV9zbmFwc2hvdCwgcmVzdG9yZV9hY3RpdmVfc25hcHNob3QsIGFyY2hpdmVfc25hcHNob3QsIGNvbXBhcmVfcHJldmlvdXNfc25hcHNob3QKICAgICAgICBpZiBzZXQoc2VsZi5zdGF0dXNlcykgIT0gc2V0KHNlbGYuZGVjbGFyZWQpIG9yIG5vdCBzZWxmLnJ1bnM6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkV2ZXJ5IGRlY2xhcmVkIHBhaXIgbmVlZHMgYSByZXNvbHZlZCBzdGF0dXMgYW5kIGF0IGxlYXN0IG9uZSB2ZXJpZmllZCBydW4iKQogICAgICAgIGV2aWRlbmNlID0gc2VsZi5kYXRhIC8gImV2aWRlbmNlIgogICAgICAgIGV2aWRlbmNlLm1rZGlyKGV4aXN0X29rPVRydWUpCiAgICAgICAgaW5kZXhfcGF0aCA9IGV2aWRlbmNlIC8gImluZGV4Lmpzb24iCiAgICAgICAgcHJldmlvdXMgPSBqc29uLmxvYWRzKGluZGV4X3BhdGgucmVhZF90ZXh0KGVuY29kaW5nPSJ1dGYtOCIpKSBpZiBpbmRleF9wYXRoLmV4aXN0cygpIGVsc2Uge30KICAgICAgICBiYWNrdXAgPSBhY3RpdmVfc25hcHNob3Qoc2VsZi5kYXRhKQogICAgICAgIGNvbXBhcmlzb25zID0gY29tcGFyZV9wcmV2aW91c19zbmFwc2hvdChzZWxmLmRhdGEsIHBlcmZvcm1hbmNlKQogICAgICAgIGFyY2hpdmUgPSBhcmNoaXZlX3NuYXBzaG90KHNlbGYuZGF0YSwgYmFja3VwKSBpZiBiYWNrdXAgYW5kIChjb21wYXJpc29uc1siY2hhbmdlZFBhaXJzIl0gb3IgcHJldmlvdXMuZ2V0KCJleGVjdXRpb25Nb2RlbCIpICE9IE1PREVMWyJpZCJdKSBlbHNlIE5vbmUKICAgICAgICBjb3JyZWN0aW9ucywgbGluZWFnZSA9IGxpc3QocHJldmlvdXMuZ2V0KCJjb3JyZWN0aW9ucyIsIFtdKSksIGxpc3QocHJldmlvdXMuZ2V0KCJsaW5lYWdlIiwgW10pKQogICAgICAgIGZvciBzaWQsIG1hcmtldHMgaW4gc2VsZi5ydW5zLml0ZW1zKCk6CiAgICAgICAgICAgIGZvciBzeW1ib2wsIHJlZiBpbiBtYXJrZXRzLml0ZW1zKCk6CiAgICAgICAgICAgICAgICBvbGQgPSBwcmV2aW91cy5nZXQoInJ1bnMiLCB7fSkuZ2V0KHNpZCwge30pLmdldChzeW1ib2wpCiAgICAgICAgICAgICAgICBpZiBub3Qgb2xkIG9yIG9sZFsicnVuSWQiXSA9PSByZWZbInJ1bklkIl06CiAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgIGl0ZW0gPSB7InN0cmF0ZWd5SWQiOiBzaWQsICJzeW1ib2wiOiBzeW1ib2wsICJwcmV2aW91c1J1bklkIjogb2xkWyJydW5JZCJdLAogICAgICAgICAgICAgICAgICAgICAgICAicmVwbGFjZW1lbnRSdW5JZCI6IHJlZlsicnVuSWQiXSwgImdlbmVyYXRlZEF0Ijogc2VsZi5nZW5lcmF0ZWRfYXR9CiAgICAgICAgICAgICAgICBsaW5lYWdlLmFwcGVuZChpdGVtKQogICAgICAgICAgICAgICAgb2xkX3BhdGggPSBzYWZlX3BhdGgoc2VsZi5yb290LCBvbGRbIm1hbmlmZXN0Il0pCiAgICAgICAgICAgICAgICBvbGRfbWFuaWZlc3QgPSBqc29uLmxvYWRzKG9sZF9wYXRoLnJlYWRfdGV4dChlbmNvZGluZz0idXRmLTgiKSkKICAgICAgICAgICAgICAgIGN1cnJlbnRfcGF0aCA9IHNlbGYuc3RhZ2UgLyByZWZbInJ1bklkIl0gLyAibWFuaWZlc3QuanNvbiIKICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBqc29uLmxvYWRzKGN1cnJlbnRfcGF0aC5yZWFkX3RleHQoZW5jb2Rpbmc9InV0Zi04IikpCiAgICAgICAgICAgICAgICBjaGFuZ2VkID0gb2xkX21hbmlmZXN0LmdldCgic2NoZW1hVmVyc2lvbiIpICE9IDIgb3Igb2xkX21hbmlmZXN0LmdldCgiZXhlY3V0aW9uTW9kZWwiKSAhPSBNT0RFTAogICAgICAgICAgICAgICAgaWYgbm90IGNoYW5nZWQ6CiAgICAgICAgICAgICAgICAgICAgYmVmb3JlLCBhZnRlciA9IGxvYWRfdjJfcmVjb3JkcyhvbGRfcGF0aCksIGxvYWRfdjJfcmVjb3JkcyhjdXJyZW50X3BhdGgsIHNlbGYucm9vdCkKICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkID0gYWZ0ZXJbOmxlbihiZWZvcmUpXSAhPSBiZWZvcmUgb3Igb2xkX21hbmlmZXN0WyJzb3VyY2VIYXNoZXMiXSAhPSBjdXJyZW50WyJzb3VyY2VIYXNoZXMiXQogICAgICAgICAgICAgICAgaWYgY2hhbmdlZDoKICAgICAgICAgICAgICAgICAgICBjb3JyZWN0aW9ucy5hcHBlbmQoeyoqaXRlbSwgImFyY2hpdmUiOiBhcmNoaXZlLAogICAgICAgICAgICAgICAgICAgICAgICAicmVhc29uIjogIlJlY29yZGVkIGNvbW1vbi1oaXN0b3J5IHZhbHVlcywgYXJjaGl2ZWQgc291cmNlLCBvciB0aGUgZGVjbGFyZWQgZXhlY3V0aW9uIG1vZGVsIGNoYW5nZWQ7IHRoZSBjdXJyZW50IGFuZCBwcmV2aW91cyBydW4gYXJlIGRvd25sb2FkYWJsZSBvbiB0aGUgc2l0ZTsgb2xkZXIgcnVucyBhbmQgY29ycmVjdGlvbiBzbmFwc2hvdHMgYXJlIGtlcHQgaW4gdGhlIHNvdXJjZSByZXBvc2l0b3J5IGhpc3RvcnksIG5vdCBvbiB0aGUgc2l0ZS4ifSkKICAgICAgICBjb3VudHMgPSB7c3RhdHVzOiBzdW0oaXRlbVsic3RhdHVzIl0gPT0gc3RhdHVzIGZvciBpdGVtIGluIHNlbGYuc3RhdHVzZXMudmFsdWVzKCkpCiAgICAgICAgICAgICAgICAgIGZvciBzdGF0dXMgaW4gKCJjb21wbGV0ZSIsICJ1bmF2YWlsYWJsZSIsICJmYWlsZWQiLCAidW5zdXBwb3J0ZWQiKX0KICAgICAgICBpbmRleCA9IHsic2NoZW1hVmVyc2lvbiI6IDIsICJnZW5lcmF0ZWRBdCI6IHNlbGYuZ2VuZXJhdGVkX2F0LCAicnVucyI6IHNlbGYucnVucywKICAgICAgICAgICAgICAgICAiZXhwZWN0ZWRQYWlycyI6IFtsaXN0KHBhaXIpIGZvciBwYWlyIGluIHNvcnRlZChzZWxmLmRlY2xhcmVkKV0sCiAgICAgICAgICAgICAgICAgImNvaG9ydCI6IFtzZWxmLnN0YXR1c2VzW3BhaXJdIGZvciBwYWlyIGluIHNvcnRlZChzZWxmLnN0YXR1c2VzKV0sCiAgICAgICAgICAgICAgICAgImNvdmVyYWdlIjogeyJraW5kIjogImZ1bGwtZGVjbGFyZWQtY29ob3J0IiwgImV4cGVjdGVkUGFpcnMiOiBsZW4oc2VsZi5kZWNsYXJlZCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYWlycyI6IGNvdW50c1siY29tcGxldGUiXSwgKipjb3VudHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhbGxTdHJhdGVnaWVzQ29tcGxldGUiOiBjb3VudHNbImNvbXBsZXRlIl0gPT0gbGVuKHNlbGYuZGVjbGFyZWQpfSwKICAgICAgICAgICAgICAgICAiZXhlY3V0aW9uTW9kZWwiOiBNT0RFTFsiaWQiXSwgImNvcnJlY3Rpb25zIjogY29ycmVjdGlvbnMsICJsaW5lYWdlIjogbGluZWFnZSwKICAgICAgICAgICAgICAgICAiaGlzdG9yaWNhbENvbXBhcmlzb24iOiBjb21wYXJpc29ucywgInNhbWVJbnB1dEFjY291bnRpbmdDb3JyZWN0aW9ucyI6IHBlcmZvcm1hbmNlLmdldCgiYWNjb3VudGluZ0NvcnJlY3Rpb25zIiwge30pfQogICAgICAgIHN1Y2Nlc3NmdWxfaWRzID0ge3JlZlsicnVuSWQiXSBmb3IgbWFya2V0cyBpbiBzZWxmLnJ1bnMudmFsdWVzKCkgZm9yIHJlZiBpbiBtYXJrZXRzLnZhbHVlcygpfQogICAgICAgIGZvciBydW5faWQgaW4gc29ydGVkKHN1Y2Nlc3NmdWxfaWRzKToKICAgICAgICAgICAgZGlyZWN0b3J5ID0gc2VsZi5zdGFnZSAvIHJ1bl9pZAogICAgICAgICAgICBkZXN0aW5hdGlvbiA9IGV2aWRlbmNlIC8gInJ1bnMiIC8gZGlyZWN0b3J5Lm5hbWUKICAgICAgICAgICAgZGVzdGluYXRpb24ucGFyZW50Lm1rZGlyKHBhcmVudHM9VHJ1ZSwgZXhpc3Rfb2s9VHJ1ZSkKICAgICAgICAgICAgaWYgZGVzdGluYXRpb24uZXhpc3RzKCk6CiAgICAgICAgICAgICAgICB2ZXJpZnlfdjIoZGVzdGluYXRpb24gLyAibWFuaWZlc3QuanNvbiIpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICB2ZXJpZnlfdjIoZGlyZWN0b3J5IC8gIm1hbmlmZXN0Lmpzb24iLCByb290PXNlbGYucm9vdCkKICAgICAgICAgICAgICAgIG9zLnJlcGxhY2UoZGlyZWN0b3J5LCBkZXN0aW5hdGlvbikKICAgICAgICBpbmRleFsic3RvcmFnZSJdID0gc3RvcmFnZV9yZXBvcnQoc2VsZi5kYXRhKQogICAgICAgIHBlcmZvcm1hbmNlWyJldmlkZW5jZUluZGV4RmlsZSJdID0gImRhdGEvZXZpZGVuY2UvaW5kZXguanNvbiIKICAgICAgICBwZXJmb3JtYW5jZVsiZXZpZGVuY2VSdW5JZHMiXSA9IHtzaWQ6IHtzeW1ib2w6IHJlZlsicnVuSWQiXSBmb3Igc3ltYm9sLCByZWYgaW4gbWFya2V0cy5pdGVtcygpfSBmb3Igc2lkLCBtYXJrZXRzIGluIHNlbGYucnVucy5pdGVtcygpfQogICAgICAgIHRyeToKICAgICAgICAgICAgaWYgc3RyYXRlZ3lfbWV0YWRhdGEgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICAoc2VsZi5kYXRhIC8gInN0cmF0ZWdpZXMuanNvbiIpLndyaXRlX2J5dGVzKGVuY29kZSh7InN0cmF0ZWdpZXMiOiBzdHJhdGVneV9tZXRhZGF0YX0pKQogICAgICAgICAgICB3cml0ZV9wZXJmb3JtYW5jZShwZXJmb3JtYW5jZSwgc2VsZi5kYXRhKQogICAgICAgICAgICAoc2VsZi5kYXRhIC8gIndmb19jaG9pY2UuanNvbiIpLndyaXRlX2J5dGVzKGVuY29kZSh3Zm9fY2hvaWNlcykpCiAgICAgICAgICAgIGlmIGZhaWxfYXQgPT0gImFmdGVyX3N1bW1hcnkiOgogICAgICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCJJbmplY3RlZCBmYWlsdXJlIGJldHdlZW4gc3VtbWFyeSB3cml0ZSBhbmQgYWN0aXZlLWluZGV4IHJlcGxhY2VtZW50IikKICAgICAgICAgICAgdGVtcG9yYXJ5ID0gZXZpZGVuY2UgLyAiaW5kZXguanNvbi50bXAiCiAgICAgICAgICAgIHRlbXBvcmFyeS53cml0ZV9ieXRlcyhlbmNvZGUoaW5kZXgpKQogICAgICAgICAgICBvcy5yZXBsYWNlKHRlbXBvcmFyeSwgaW5kZXhfcGF0aCkKICAgICAgICAgICAgdmFsaWRhdGVfdjJfaW5kZXgoc2VsZi5yb290LCBwZXJmb3JtYW5jZSwgbGlzdChzZWxmLmRlY2xhcmVkLnZhbHVlcygpKSkKICAgICAgICBleGNlcHQgQmFzZUV4Y2VwdGlvbjoKICAgICAgICAgICAgcmVzdG9yZV9hY3RpdmVfc25hcHNob3Qoc2VsZi5kYXRhLCBiYWNrdXApCiAgICAgICAgICAgIHJhaXNlCiAgICAgICAgZmluYWxseToKICAgICAgICAgICAgc2h1dGlsLnJtdHJlZShzZWxmLnN0YWdlLCBpZ25vcmVfZXJyb3JzPVRydWUpCiAgICAgICAgICAgIChldmlkZW5jZSAvICJpbmRleC5qc29uLnRtcCIpLnVubGluayhtaXNzaW5nX29rPVRydWUpCiAgICAgICAgcmV0dXJuIGluZGV4CgoKZGVmIHZhbGlkYXRlX3YyX2luZGV4KHJvb3QsIHBlcmZvcm1hbmNlLCBleHBlY3RlZF9jb2hvcnQ9Tm9uZSk6CiAgICByb290ID0gUGF0aChyb290KQogICAgaW5kZXggPSBqc29uLmxvYWRzKChyb290IC8gImRhdGEvZXZpZGVuY2UvaW5kZXguanNvbiIpLnJlYWRfdGV4dChlbmNvZGluZz0idXRmLTgiKSkKICAgIGlmIGluZGV4LmdldCgic2NoZW1hVmVyc2lvbiIpICE9IDIgb3IgaW5kZXguZ2V0KCJleGVjdXRpb25Nb2RlbCIpICE9IE1PREVMWyJpZCJdOgogICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkludmFsaWQgYWN0aXZlIGluZGV4IHNjaGVtYSBvciBleGVjdXRpb24gbW9kZWwiKQogICAgY29ob3J0ID0gaW5kZXhbImNvaG9ydCJdCiAgICBwYWlycyA9IFsoaXRlbVsic3RyYXRlZ3lJZCJdLCBpdGVtWyJzeW1ib2wiXSkgZm9yIGl0ZW0gaW4gY29ob3J0XQogICAgaWYgZXhwZWN0ZWRfY29ob3J0IGlzIE5vbmU6CiAgICAgICAgZnJvbSBidWlsZF9kYXRhIGltcG9ydCBsb2FkX3N0cmF0ZWdpZXMsIGxvYWRfY29uZmlnCiAgICAgICAgZXhwZWN0ZWRfY29ob3J0ID0gZGVjbGFyZV9jb2hvcnQobG9hZF9zdHJhdGVnaWVzKCksIGxvYWRfY29uZmlnKClbImluc3RydW1lbnRzIl0pCiAgICBleHBlY3RlZCA9IHsoaXRlbVsic3RyYXRlZ3lJZCJdLCBpdGVtWyJzeW1ib2wiXSk6IGl0ZW0gZm9yIGl0ZW0gaW4gZXhwZWN0ZWRfY29ob3J0fQogICAgaWYgbGVuKHBhaXJzKSAhPSBsZW4oc2V0KHBhaXJzKSkgb3Igc2V0KHBhaXJzKSAhPSBzZXQoZXhwZWN0ZWQpIG9yIHNldChwYWlycykgIT0ge3R1cGxlKHApIGZvciBwIGluIGluZGV4WyJleHBlY3RlZFBhaXJzIl19OgogICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkV2aWRlbmNlIGNvaG9ydCBkaWZmZXJzIGZyb20gaW5kZXBlbmRlbnQgZGVjbGFyYXRpb24iKQogICAgYWN0dWFsID0geyhzaWQsIHN5bWJvbCkgZm9yIHNpZCwgbWFya2V0cyBpbiBpbmRleFsicnVucyJdLml0ZW1zKCkgZm9yIHN5bWJvbCBpbiBtYXJrZXRzfQogICAgc3VtbWFyeV9wYWlycyA9IHsoc2lkLCBzeW1ib2wpIGZvciBzaWQsIG1hcmtldHMgaW4gcGVyZm9ybWFuY2UuZ2V0KCJldmlkZW5jZVJ1bklkcyIsIHt9KS5pdGVtcygpIGZvciBzeW1ib2wgaW4gbWFya2V0c30KICAgIGNvbXBsZXRlID0geyhpdGVtWyJzdHJhdGVneUlkIl0sIGl0ZW1bInN5bWJvbCJdKSBmb3IgaXRlbSBpbiBjb2hvcnQgaWYgaXRlbVsic3RhdHVzIl0gPT0gImNvbXBsZXRlIn0KICAgIGlmIG5vdCBhY3R1YWwgb3IgYWN0dWFsICE9IGNvbXBsZXRlIG9yIGFjdHVhbCAhPSBzdW1tYXJ5X3BhaXJzIG9yIGluZGV4WyJnZW5lcmF0ZWRBdCJdICE9IHBlcmZvcm1hbmNlLmdldCgiZ2VuZXJhdGVkQXQiKToKICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJBY3RpdmUgZXZpZGVuY2UgaW5kZXggYW5kIHN1bW1hcnkgZGlzYWdyZWUiKQogICAgZm9yIGl0ZW0gaW4gY29ob3J0OgogICAgICAgIHBhaXIgPSAoaXRlbVsic3RyYXRlZ3lJZCJdLCBpdGVtWyJzeW1ib2wiXSkKICAgICAgICBpZiBhbnkoaXRlbVtrZXldICE9IGV4cGVjdGVkW3BhaXJdW2tleV0gZm9yIGtleSBpbiAoImtpbmQiLCAidW5pdmVyc2UiKSk6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkV2aWRlbmNlIHVuaXZlcnNlIGRpZmZlcnMgZnJvbSBkZWNsYXJhdGlvbiIpCiAgICAgICAgaWYgaXRlbVsic3RhdHVzIl0gIT0gImNvbXBsZXRlIjoKICAgICAgICAgICAgaWYgaXRlbVsic3RhdHVzIl0gbm90IGluIHsidW5hdmFpbGFibGUiLCAiZmFpbGVkIiwgInVuc3VwcG9ydGVkIn0gb3Igbm90IGl0ZW0uZ2V0KCJyZWFzb24iKToKICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIlVucmVzb2x2ZWQgY29ob3J0IHN0YXR1cyIpCiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgc2lkLCBzeW1ib2wgPSBwYWlyCiAgICAgICAgcmVmID0gaW5kZXhbInJ1bnMiXVtzaWRdW3N5bWJvbF0KICAgICAgICBpZiByZWZbInJ1bklkIl0gIT0gaXRlbVsicnVuSWQiXSBvciByZWZbIm1hbmlmZXN0Il0gIT0gaXRlbVsibWFuaWZlc3QiXSBvciBwZXJmb3JtYW5jZVsiZXZpZGVuY2VSdW5JZHMiXVtzaWRdW3N5bWJvbF0gIT0gcmVmWyJydW5JZCJdOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJDb2hvcnQvcnVuL3N1bW1hcnkgaWRlbnRpdHkgbWlzbWF0Y2giKQogICAgICAgIGlmIHJlZlsibWFuaWZlc3QiXSAhPSBmImRhdGEvZXZpZGVuY2UvcnVucy97cmVmWydydW5JZCddfS9tYW5pZmVzdC5qc29uIjoKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiSW52YWxpZCBpbW11dGFibGUgcnVuIHBhdGgiKQogICAgICAgIHBhdGggPSBzYWZlX3BhdGgocm9vdCwgcmVmWyJtYW5pZmVzdCJdKQogICAgICAgIG1hbmlmZXN0ID0ganNvbi5sb2FkcyhwYXRoLnJlYWRfdGV4dChlbmNvZGluZz0idXRmLTgiKSkKICAgICAgICBpZiAobWFuaWZlc3RbInN0cmF0ZWd5SWQiXSwgbWFuaWZlc3RbInN5bWJvbCJdKSAhPSBwYWlyIG9yIG1hbmlmZXN0WyJydW5JZCJdICE9IHJlZlsicnVuSWQiXSBvciBtYW5pZmVzdFsiYXNzZXRzIl0gIT0gaXRlbVsidW5pdmVyc2UiXSBvciBtYW5pZmVzdFsia2luZCJdICE9IGl0ZW1bImtpbmQiXToKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiTWFuaWZlc3QgZGlmZmVycyBmcm9tIGRlY2xhcmVkIHN0cmF0ZWd5L21hcmtldC91bml2ZXJzZSIpCiAgICAgICAgdmVyaWZ5X3YyKHBhdGgpCiAgICAgICAgcm93cyA9IGxvYWRfdjJfcmVjb3JkcyhwYXRoKQogICAgICAgIHNlcmllcyA9IHBlcmZvcm1hbmNlWyJzdHJhdGVnaWVzIl1bc2lkXS5nZXQoImVxdWl0eSIsIHt9KS5nZXQoc3ltYm9sKQogICAgICAgIGlmIHNlcmllcyBpcyBOb25lOgogICAgICAgICAgICByZWxhdGl2ZSA9IHBlcmZvcm1hbmNlLmdldCgiZXF1aXR5RmlsZXMiLCB7fSkuZ2V0KHN5bWJvbCkKICAgICAgICAgICAgcGF5bG9hZCA9IGpzb24ubG9hZHMoc2FmZV9wYXRoKHJvb3QsIHJlbGF0aXZlKS5yZWFkX3RleHQoZW5jb2Rpbmc9InV0Zi04IikpIGlmIHJlbGF0aXZlIGVsc2Uge30KICAgICAgICAgICAgc2VyaWVzID0gZGljdChwYXlsb2FkLmdldCgic3RyYXRlZ2llcyIsIHt9KS5nZXQoc2lkLCB7fSkpCiAgICAgICAgICAgIHNlcmllcy5zZXRkZWZhdWx0KCJkYXRlcyIsIHBheWxvYWQuZ2V0KCJkYXRlcyIsIFtdKSkKICAgICAgICBpZiBzZXJpZXMuZ2V0KCJkYXRlcyIpICE9IFtyb3dbImRhdGUiXSBmb3Igcm93IGluIHJvd3NdIG9yIGxlbihzZXJpZXMuZ2V0KCJzdHJhdGVneSIsIFtdKSkgIT0gbGVuKHJvd3MpOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJQdWJsaXNoZWQgZGF0ZXMgZGlmZmVyIGZyb20gZXZpZGVuY2UiKQogICAgICAgIHRvbGVyYW5jZSA9IC41MDAwMDEgKiAxMCAqKiAtbWFuaWZlc3RbInJlcHJvZHVjdGlvbiJdWyJkaXNwbGF5RXF1aXR5RGVjaW1hbHMiXQogICAgICAgIGlmIGFueShub3QgbWF0aC5pc2Nsb3NlKHZhbHVlLCByb3dbImVxdWl0eSJdLCByZWxfdG9sPTFlLTEwLCBhYnNfdG9sPXRvbGVyYW5jZSkgZm9yIHZhbHVlLCByb3cgaW4gemlwKHNlcmllc1sic3RyYXRlZ3kiXSwgcm93cykpOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJQdWJsaXNoZWQgZXF1aXR5IGRpZmZlcnMgZnJvbSBldmlkZW5jZSIpCiAgICBjb3VudHMgPSB7c3RhdHVzOiBzdW0oaXRlbVsic3RhdHVzIl0gPT0gc3RhdHVzIGZvciBpdGVtIGluIGNvaG9ydCkgZm9yIHN0YXR1cyBpbiAoImNvbXBsZXRlIiwgInVuYXZhaWxhYmxlIiwgImZhaWxlZCIsICJ1bnN1cHBvcnRlZCIpfQogICAgY292ZXJhZ2UgPSB7ImtpbmQiOiAiZnVsbC1kZWNsYXJlZC1jb2hvcnQiLCAiZXhwZWN0ZWRQYWlycyI6IGxlbihwYWlycyksICJwYWlycyI6IGxlbihhY3R1YWwpLCAqKmNvdW50cywKICAgICAgICAgICAgICAgICJhbGxTdHJhdGVnaWVzQ29tcGxldGUiOiBsZW4oYWN0dWFsKSA9PSBsZW4ocGFpcnMpfQogICAgaWYgaW5kZXhbImNvdmVyYWdlIl0gIT0gY292ZXJhZ2U6CiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiQ292ZXJhZ2UgY291bnRzIGRvIG5vdCByZWNvbmNpbGUiKQogICAgcmV0dXJuIHsicGFpcnMiOiBsZW4oYWN0dWFsKSwgImdlbmVyYXRlZEF0IjogaW5kZXhbImdlbmVyYXRlZEF0Il0sICJjb3ZlcmFnZSI6IGNvdmVyYWdlfQo=', 'recompute_evidence.py': 'IiIiTWF0ZXJpYWxpemUgdjIgYnVuZGxlcyBvciByZWNvbXB1dGUgdHJ1c3RlZCBhcmNoaXZlZCBjb2RlIGZyb20gcHJpdmF0ZSBpbnB1dHMuCgpBcml0aG1ldGljIHJlcGxheSBhbmQgYnVuZGxlIGNyZWF0aW9uIHVzZSBvbmx5IHRoZSBzdGFuZGFyZCBsaWJyYXJ5LiBSZWNvbXB1dGluZwpleGVjdXRlcyBhcmNoaXZlZCBQeXRob24gY29kZSAobm90IGEgc2FuZGJveCkgYW5kIHJlcXVpcmVzIHRoZSByZWNvcmRlZCBkZXBlbmRlbmN5CnZlcnNpb25zIHBsdXMgdGhlIG1hdGNoaW5nIG9yaWdpbmFsIHByaXZhdGUgaW5wdXQgc25hcHNob3QuIEZyZXNoIHByb3ZpZGVyIGRhdGEKd2l0aCBhIGRpZmZlcmVudCBoYXNoIGlzIHJlamVjdGVkIGJlZm9yZSBhbnkgYXJjaGl2ZWQgY29kZSBleGVjdXRlcy4KIiIiCmltcG9ydCBhcmdwYXJzZQppbXBvcnQgaW1wb3J0bGliLnV0aWwKaW1wb3J0IGpzb24KZnJvbSBwYXRobGliIGltcG9ydCBQYXRoCmltcG9ydCBzdWJwcm9jZXNzCmltcG9ydCBzeXMKaW1wb3J0IHRlbXBmaWxlCmZyb20gdXJsbGliLnBhcnNlIGltcG9ydCB1cmxzcGxpdApmcm9tIHVybGxpYi5yZXF1ZXN0IGltcG9ydCB1cmxvcGVuCmltcG9ydCB6aXBmaWxlCgpmcm9tIGV2aWRlbmNlX3YyIGltcG9ydCAoYXJ0aWZhY3Rfcm9vdCwgYXNzZXJ0X2VxdWFsLCBkZXBlbmRlbmN5X3ZlcnNpb25zLCBlbmNvZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkX29iamVjdCwgbG9hZF92Ml9yZWNvcmRzLCByZWNvcmRzX2Zyb21fZnJhbWVzLCBzYWZlX3BhdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICBzaGEsIHZlcmlmeV92MikKCgpkZWYgbWF0ZXJpYWxpemVfc291cmNlcyhyb290LCBtYW5pZmVzdCwgZGVzdGluYXRpb24pOgogICAgc291cmNlcyA9IGxvYWRfb2JqZWN0KHJvb3QsIG1hbmlmZXN0WyJvYmplY3RzIl1bInNvdXJjZSJdKQogICAgZm9yIHJlbGF0aXZlLCByZWYgaW4gc291cmNlc1siZmlsZXMiXS5pdGVtcygpOgogICAgICAgIGlmIG5vdCByZWxhdGl2ZS5zdGFydHN3aXRoKCJzY3JpcHRzLyIpOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJBcmNoaXZlZCBzb3VyY2UgbXVzdCBzdGF5IHdpdGhpbiBzY3JpcHRzIikKICAgICAgICB0YXJnZXQgPSBzYWZlX3BhdGgoZGVzdGluYXRpb24sIHJlbGF0aXZlKQogICAgICAgIHRhcmdldC5wYXJlbnQubWtkaXIocGFyZW50cz1UcnVlLCBleGlzdF9vaz1UcnVlKQogICAgICAgIHRhcmdldC53cml0ZV90ZXh0KGxvYWRfb2JqZWN0KHJvb3QsIHJlZilbInRleHQiXSwgZW5jb2Rpbmc9InV0Zi04IiwgbmV3bGluZT0iIikKICAgIHJldHVybiBzb3VyY2VzCgoKZGVmIHJlY29tcHV0ZShtYW5pZmVzdF9wYXRoLCBpbnB1dF9wYXRoKToKICAgICIiIkNvbXBhcmUgZXZlcnkgcmVnZW5lcmF0ZWQgdGFyZ2V0LCByZXR1cm4sIGVxdWl0eSwgc2VsZWN0ZWQgZm9sZCBhbmQgY2hvaWNlLiIiIgogICAgbWFuaWZlc3RfcGF0aCwgaW5wdXRfcGF0aCA9IFBhdGgobWFuaWZlc3RfcGF0aCkucmVzb2x2ZSgpLCBQYXRoKGlucHV0X3BhdGgpLnJlc29sdmUoKQogICAgdmVyaWZ5X3YyKG1hbmlmZXN0X3BhdGgsIGlucHV0X3BhdGgpCiAgICByb290ID0gYXJ0aWZhY3Rfcm9vdChtYW5pZmVzdF9wYXRoKQogICAgbWFuaWZlc3QgPSBqc29uLmxvYWRzKG1hbmlmZXN0X3BhdGgucmVhZF90ZXh0KGVuY29kaW5nPSJ1dGYtOCIpKQogICAgY29uZmlnID0gbG9hZF9vYmplY3Qocm9vdCwgbWFuaWZlc3RbIm9iamVjdHMiXVsiY29uZmlnIl0pCiAgICBpZiBjb25maWdbImRlcGVuZGVuY2llcyJdICE9IGRlcGVuZGVuY3lfdmVyc2lvbnMoKToKICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJEZXBlbmRlbmN5IHZlcnNpb25zIGRpZmZlcjsgZXhhY3Qgb3JpZ2luYWwtaW5wdXQgcmVjb21wdXRhdGlvbiBpcyB1bmF2YWlsYWJsZSIpCiAgICB3aXRoIHRlbXBmaWxlLlRlbXBvcmFyeURpcmVjdG9yeShwcmVmaXg9InF1YW50YXJlbmEtcmVjb21wdXRlLSIpIGFzIHRlbXBvcmFyeToKICAgICAgICBkZXN0aW5hdGlvbiA9IFBhdGgodGVtcG9yYXJ5KQogICAgICAgIHNvdXJjZXMgPSBtYXRlcmlhbGl6ZV9zb3VyY2VzKHJvb3QsIG1hbmlmZXN0LCBkZXN0aW5hdGlvbikKICAgICAgICByZXN1bHRfcGF0aCA9IGRlc3RpbmF0aW9uIC8gInJlc3VsdC5qc29uIgogICAgICAgIHJlcXVlc3RfcGF0aCA9IGRlc3RpbmF0aW9uIC8gInJlcXVlc3QuanNvbiIKICAgICAgICAjIE9ubHkgb3JpZ2luYWwgbWFya2V0IGlucHV0cyBhbmQgb3JpZ2luYWwgcGlwZWxpbmUgY29uZmlndXJhdGlvbiBmZWVkCiAgICAgICAgIyB0aGUgd29ya2VyLiBSZWNvcmRlZCB0YXJnZXRzLCBmb2xkcyBhbmQgY2hvaWNlcyBhcmUgY29tcGFyaXNvbiBvdXRwdXRzLgogICAgICAgIHJlcXVlc3RfcGF0aC53cml0ZV9ieXRlcyhlbmNvZGUoeyJpbnB1dFBhdGgiOiBzdHIoaW5wdXRfcGF0aCksCiAgICAgICAgICAgICJpbnB1dEtpbmQiOiBjb25maWdbImlucHV0S2luZCJdLCAicGlwZWxpbmUiOiBjb25maWdbInBpcGVsaW5lIl0sCiAgICAgICAgICAgICJzdHJhdGVneVBhdGgiOiBzdHIoc2FmZV9wYXRoKGRlc3RpbmF0aW9uLCBzb3VyY2VzWyJzdHJhdGVneVBhdGgiXSkpLAogICAgICAgICAgICAic3ltYm9sIjogbWFuaWZlc3RbInN5bWJvbCJdLCAia2luZCI6IG1hbmlmZXN0WyJraW5kIl0sICJyZXN1bHRQYXRoIjogc3RyKHJlc3VsdF9wYXRoKX0pKQogICAgICAgIHByb2Nlc3MgPSBzdWJwcm9jZXNzLnJ1bihbc3lzLmV4ZWN1dGFibGUsIHN0cihkZXN0aW5hdGlvbiAvICJzY3JpcHRzL3JlY29tcHV0ZV9ldmlkZW5jZS5weSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi0td29ya2VyIiwgc3RyKHJlcXVlc3RfcGF0aCldLCBjd2Q9ZGVzdGluYXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcHR1cmVfb3V0cHV0PVRydWUsIHRleHQ9VHJ1ZSwgdGltZW91dD05MDApCiAgICAgICAgaWYgcHJvY2Vzcy5yZXR1cm5jb2RlOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKGYiQXJjaGl2ZWQgc3RyYXRlZ3kgcmVjb21wdXRhdGlvbiBmYWlsZWQ6IHtwcm9jZXNzLnN0ZGVyclstNDAwMDpdfSIpCiAgICAgICAgcmVzdWx0ID0ganNvbi5sb2FkcyhyZXN1bHRfcGF0aC5yZWFkX3RleHQoZW5jb2Rpbmc9InV0Zi04IikpCiAgICBhc3NlcnRfZXF1YWwocmVzdWx0WyJyZWNvcmRzIl0sIGxvYWRfdjJfcmVjb3JkcyhtYW5pZmVzdF9wYXRoKSwgInJlZ2VuZXJhdGVkIHJlY29yZHMiKQogICAgYXNzZXJ0X2VxdWFsKHJlc3VsdFsiZm9sZHMiXSwgY29uZmlnWyJldmFsdWF0aW9uRm9sZHMiXSwgInJlZ2VuZXJhdGVkIFdGTyBmb2xkcyIpCiAgICBhc3NlcnRfZXF1YWwocmVzdWx0WyJzZWxlY3RlZEZvbGRzIl0sIGNvbmZpZ1siZm9sZHMiXSwgInNlbGVjdGVkIFdGTyBmb2xkcyIpCiAgICBhc3NlcnRfZXF1YWwocmVzdWx0WyJjaG9pY2UiXSwgY29uZmlnWyJzZWxlY3Rpb24iXSwgInJlZ2VuZXJhdGVkIHNlbGVjdGlvbiIpCiAgICBhc3NlcnRfZXF1YWwocmVzdWx0WyJkZWZhdWx0cyJdLCBjb25maWdbImRlZmF1bHRzIl0sICJyZWdlbmVyYXRlZCBkZWZhdWx0cyIpCiAgICByZXR1cm4geyJydW5JZCI6IG1hbmlmZXN0WyJydW5JZCJdLCAib2JzZXJ2YXRpb25zIjogbGVuKHJlc3VsdFsicmVjb3JkcyJdKSwKICAgICAgICAgICAgImlucHV0SGFzaCI6IG1hbmlmZXN0WyJpbnB1dEhhc2giXSwgInZlcmlmaWNhdGlvbiI6ICJBcmNoaXZlZCBydWxlIGFuZCBXRk8gY29kZSByZWdlbmVyYXRlZCBhbGwgdGFyZ2V0cywgcmV0dXJucywgZm9sZHMgYW5kIGVxdWl0eSBmcm9tIG1hdGNoaW5nIG9yaWdpbmFsIGlucHV0cyJ9CgoKZGVmIHdvcmtlcihyZXF1ZXN0X3BhdGgpOgogICAgIyBUaGlzIGVudHJ5cG9pbnQgaXMgY29waWVkIGFuZCBleGVjdXRlZCBGUk9NIHRoZSBhcmNoaXZlLCBzbyBpbXBvcnRzIGJlbG93CiAgICAjIHJlc29sdmUgdG8gdGhlIGFyY2hpdmVkIGV2YWx1YXRvciBhbmQgaGVscGVyIGZpbGVzLCBuZXZlciBjdXJyZW50IG1vZHVsZXMuCiAgICBpbXBvcnQgcGFuZGFzIGFzIHBkCiAgICBpbXBvcnQgYnVpbGRfZGF0YQogICAgZnJvbSBzdHJhdGVneV9ldmlkZW5jZSBpbXBvcnQganNvbl92YWx1ZSwgcmVzb2x2ZWRfZGVmYXVsdHMKICAgIHJlcXVlc3QgPSBqc29uLmxvYWRzKFBhdGgocmVxdWVzdF9wYXRoKS5yZWFkX3RleHQoZW5jb2Rpbmc9InV0Zi04IikpCiAgICBpZiByZXF1ZXN0LmdldCgib3BlcmF0aW9uIikgPT0gImZldGNoLWlucHV0IjoKICAgICAgICBQYXRoKHJlcXVlc3RbInJlc3VsdFBhdGgiXSkud3JpdGVfYnl0ZXMoZW5jb2RlKGFjcXVpcmVfc25hcHNob3QocmVxdWVzdCkpKQogICAgICAgIHJldHVybgogICAgc25hcHNob3QgPSBqc29uLmxvYWRzKFBhdGgocmVxdWVzdFsiaW5wdXRQYXRoIl0pLnJlYWRfdGV4dChlbmNvZGluZz0idXRmLTgiKSkKICAgIHByaWNlcyA9IHBkLkRhdGFGcmFtZShzbmFwc2hvdFsidmFsdWVzIl0sIGluZGV4PXBkLnRvX2RhdGV0aW1lKHNuYXBzaG90WyJkYXRlcyJdKSwgY29sdW1ucz1zbmFwc2hvdFsiY29sdW1ucyJdKQogICAgaWYgcmVxdWVzdFsiaW5wdXRLaW5kIl0gPT0gInNlcmllcyI6CiAgICAgICAgcHJpY2VzID0gcHJpY2VzWyJDbG9zZSJdCiAgICBjbG9zZSA9IE5vbmUgaWYgcmVxdWVzdFsia2luZCJdID09ICJiYXNrZXQiIGVsc2UgcHJpY2VzWyJDbG9zZSJdIGlmIGlzaW5zdGFuY2UocHJpY2VzLCBwZC5EYXRhRnJhbWUpIGVsc2UgcHJpY2VzCiAgICBzcGVjID0gaW1wb3J0bGliLnV0aWwuc3BlY19mcm9tX2ZpbGVfbG9jYXRpb24oImFyY2hpdmVkX3N0cmF0ZWd5IiwgcmVxdWVzdFsic3RyYXRlZ3lQYXRoIl0pCiAgICBydWxlID0gaW1wb3J0bGliLnV0aWwubW9kdWxlX2Zyb21fc3BlYyhzcGVjKQogICAgc3BlYy5sb2FkZXIuZXhlY19tb2R1bGUocnVsZSkKICAgIGV2YWx1YXRlZCA9IGJ1aWxkX2RhdGEuZXZhbHVhdGVfc3RyYXRlZ3kocnVsZSwgcHJpY2VzLCBjbG9zZSwgcmVxdWVzdFsicGlwZWxpbmUiXSkKICAgIHJlY29yZHMgPSByZWNvcmRzX2Zyb21fZnJhbWVzKHByaWNlcywgZXZhbHVhdGVkWyJyZXN1bHQiXVszXSwgcmVxdWVzdFsic3ltYm9sIl0sIHJlcXVlc3RbImtpbmQiXSkKICAgICMgSW5kZXBlbmRlbnRseSByZWNvbmNpbGUgZXZhbHVhdG9yIG91dHB1dHMsIG5vdCBtZXJlbHkgdGhlIGRlcml2ZWQtcmVjb3JkCiAgICAjIGltcGxlbWVudGF0aW9uLCBiZWZvcmUgY29tcGFyaW5nIHdpdGggdGhlIHJlY29yZGVkIHJ1bi4KICAgIGFzc2VydF9lcXVhbChbZmxvYXQodmFsdWUpIGZvciB2YWx1ZSBpbiBldmFsdWF0ZWRbInJlc3VsdCJdWzBdXSwgW3Jvd1siZXF1aXR5Il0gZm9yIHJvdyBpbiByZWNvcmRzXSwgImVuZ2luZSBlcXVpdHkiKQogICAgYXNzZXJ0X2VxdWFsKFtmbG9hdCh2YWx1ZSkgZm9yIHZhbHVlIGluIGV2YWx1YXRlZFsicmVzdWx0Il1bMl1dLCBbcm93WyJncm9zc1JldHVybiJdIGZvciByb3cgaW4gcmVjb3Jkc10sICJlbmdpbmUgcmV0dXJucyIpCiAgICByZXN1bHQgPSB7InJlY29yZHMiOiByZWNvcmRzLCAiZm9sZHMiOiBldmFsdWF0ZWRbImZvbGRzIl0sICJzZWxlY3RlZEZvbGRzIjogZXZhbHVhdGVkWyJzZWxlY3RlZEZvbGRzIl0sCiAgICAgICAgICAgICAgImNob2ljZSI6IGV2YWx1YXRlZFsiY2hvaWNlIl0sICJkZWZhdWx0cyI6IHJlc29sdmVkX2RlZmF1bHRzKHJ1bGUpfQogICAgUGF0aChyZXF1ZXN0WyJyZXN1bHRQYXRoIl0pLndyaXRlX2J5dGVzKGVuY29kZShqc29uX3ZhbHVlKHJlc3VsdCkpKQoKCmRlZiBhY3F1aXJlX3NuYXBzaG90KHJlcXVlc3QpOgogICAgIiIiUHJvdmlkZXIgcmV0cmlldmFsL3ByZXByb2Nlc3Npbmcgb25seTsgb3V0cHV0IGlzIG5ldmVyIGFzc3VtZWQgb3JpZ2luYWwuIiIiCiAgICBpbXBvcnQgYnVpbGRfZGF0YQogICAgZnJvbSBzdHJhdGVneV9ldmlkZW5jZSBpbXBvcnQgY29tcGxldGVkX2JhcnMsIGlucHV0X3NuYXBzaG90LCBqc29uX3ZhbHVlCiAgICBjb25maWcgPSByZXF1ZXN0WyJwaXBlbGluZSJdCiAgICBzdGFydCwgZW5kID0gY29uZmlnLmdldCgic3RhcnQiKSwgY29uZmlnLmdldCgiZW5kIikKICAgIHVzZV9vaGxjID0gY29uZmlnLmdldCgiZXZpZGVuY2VfaW5wdXRfcHJlcGFyYXRpb24iKSA9PSAib2hsYy1jb21wbGV0ZS1iYXJzIgogICAgZGVmIGZldGNoKHN5bWJvbCwgZnJhbWU9RmFsc2UpOgogICAgICAgIGlmIGZyYW1lIG9yIHVzZV9vaGxjOgogICAgICAgICAgICByZXN1bHQgPSBjb21wbGV0ZWRfYmFycyhidWlsZF9kYXRhLmZldGNoX29obGMoc3ltYm9sLCBzdGFydCwgZW5kKSwgcmVxdWVzdFsiY3V0b2ZmRGF0ZSJdKQogICAgICAgICAgICByZXR1cm4gcmVzdWx0IGlmIGZyYW1lIGVsc2UgYnVpbGRfZGF0YS5jbG9zZV9mcm9tX29obGMocmVzdWx0KQogICAgICAgIHJldHVybiBjb21wbGV0ZWRfYmFycyhidWlsZF9kYXRhLmZldGNoX3ByaWNlcyhzeW1ib2wsIHN0YXJ0LCBlbmQpLCByZXF1ZXN0WyJjdXRvZmZEYXRlIl0pCiAgICBpZiByZXF1ZXN0WyJraW5kIl0gPT0gImJhc2tldCI6CiAgICAgICAgYXNzZXRzID0gcmVxdWVzdFsiYXNzZXRzIl0KICAgICAgICBwcmljZXMgPSBidWlsZF9kYXRhLmJ1aWxkX3ByaWNlX2ZyYW1lKHtzeW1ib2w6IGZldGNoKHN5bWJvbCkgZm9yIHN5bWJvbCBpbiBhc3NldHN9LCBhc3NldHMpCiAgICBlbHNlOgogICAgICAgIHByaWNlcyA9IGZldGNoKHJlcXVlc3RbInN5bWJvbCJdLCBmcmFtZT1yZXF1ZXN0WyJpbnB1dEtpbmQiXSA9PSAiZnJhbWUiKQogICAgaWYgcHJpY2VzIGlzIE5vbmUgb3IgbGVuKHByaWNlcykgPCAyOgogICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIlByb3ZpZGVyIHJldHVybmVkIGZld2VyIHRoYW4gdHdvIGNvbXBsZXRlZCBvYnNlcnZhdGlvbnMiKQogICAgcmV0dXJuIGpzb25fdmFsdWUoaW5wdXRfc25hcHNob3QocHJpY2VzKSkKCgpkZWYgZmV0Y2hfaW5wdXQobWFuaWZlc3RfcGF0aCwgb3V0cHV0X3BhdGgpOgogICAgIiIiQWNxdWlyZSBwcml2YXRlbHksIHRoZW4gY29tcGFyZSBoYXNoZXM7IGEgbWlzbWF0Y2ggaXMgbm90IHJlcHJvZHVjdGlvbi4iIiIKICAgIHZlcmlmeV92MihtYW5pZmVzdF9wYXRoKQogICAgcm9vdCA9IGFydGlmYWN0X3Jvb3QobWFuaWZlc3RfcGF0aCkKICAgIG91dHB1dF9wYXRoID0gUGF0aChvdXRwdXRfcGF0aCkucmVzb2x2ZSgpCiAgICBpZiBvdXRwdXRfcGF0aC5pc19yZWxhdGl2ZV90bygocm9vdCAvICJkYXRhIikucmVzb2x2ZSgpKToKICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJGZXRjaGVkIHByb3ZpZGVyIGlucHV0cyBtdXN0IHJlbWFpbiBvdXRzaWRlIHB1Ymxpc2hlZCBkYXRhIikKICAgIG1hbmlmZXN0ID0ganNvbi5sb2FkcyhQYXRoKG1hbmlmZXN0X3BhdGgpLnJlYWRfdGV4dChlbmNvZGluZz0idXRmLTgiKSkKICAgIGNvbmZpZyA9IGxvYWRfb2JqZWN0KHJvb3QsIG1hbmlmZXN0WyJvYmplY3RzIl1bImNvbmZpZyJdKQogICAgd2l0aCB0ZW1wZmlsZS5UZW1wb3JhcnlEaXJlY3RvcnkocHJlZml4PSJxdWFudGFyZW5hLWFjcXVpc2l0aW9uLSIpIGFzIHRlbXBvcmFyeToKICAgICAgICBkZXN0aW5hdGlvbiA9IFBhdGgodGVtcG9yYXJ5KQogICAgICAgIG1hdGVyaWFsaXplX3NvdXJjZXMocm9vdCwgbWFuaWZlc3QsIGRlc3RpbmF0aW9uKQogICAgICAgIHJlc3VsdF9wYXRoID0gZGVzdGluYXRpb24gLyAiZmV0Y2hlZC5qc29uIgogICAgICAgIHJlcXVlc3RfcGF0aCA9IGRlc3RpbmF0aW9uIC8gInJlcXVlc3QuanNvbiIKICAgICAgICByZXF1ZXN0X3BhdGgud3JpdGVfYnl0ZXMoZW5jb2RlKHsib3BlcmF0aW9uIjogImZldGNoLWlucHV0IiwgInBpcGVsaW5lIjogY29uZmlnWyJwaXBlbGluZSJdLAogICAgICAgICAgICAia2luZCI6IGNvbmZpZ1sia2luZCJdLCAiYXNzZXRzIjogY29uZmlnWyJhc3NldHMiXSwgInN5bWJvbCI6IGNvbmZpZ1sic3ltYm9sIl0sCiAgICAgICAgICAgICJpbnB1dEtpbmQiOiBjb25maWdbImlucHV0S2luZCJdLCAiY3V0b2ZmRGF0ZSI6IG1hbmlmZXN0WyJnZW5lcmF0ZWRBdCJdWzoxMF0sICJyZXN1bHRQYXRoIjogc3RyKHJlc3VsdF9wYXRoKX0pKQogICAgICAgIHByb2Nlc3MgPSBzdWJwcm9jZXNzLnJ1bihbc3lzLmV4ZWN1dGFibGUsIHN0cihkZXN0aW5hdGlvbiAvICJzY3JpcHRzL3JlY29tcHV0ZV9ldmlkZW5jZS5weSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi0td29ya2VyIiwgc3RyKHJlcXVlc3RfcGF0aCldLCBjd2Q9ZGVzdGluYXRpb24sIGNhcHR1cmVfb3V0cHV0PVRydWUsIHRleHQ9VHJ1ZSwgdGltZW91dD05MDApCiAgICAgICAgaWYgcHJvY2Vzcy5yZXR1cm5jb2RlOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKGYiQXJjaGl2ZWQgaW5wdXQgYWNxdWlzaXRpb24gZmFpbGVkIChpbnN0YWxsIHJlY29yZGVkIGRlcGVuZGVuY2llcyBmaXJzdCk6IHtwcm9jZXNzLnN0ZGVyclstNDAwMDpdfSIpCiAgICAgICAgc25hcHNob3QgPSBqc29uLmxvYWRzKHJlc3VsdF9wYXRoLnJlYWRfdGV4dChlbmNvZGluZz0idXRmLTgiKSkKICAgIGNvbnRlbnQgPSBlbmNvZGUoc25hcHNob3QpCiAgICBpZiBvdXRwdXRfcGF0aC5leGlzdHMoKSBhbmQgb3V0cHV0X3BhdGgucmVhZF9ieXRlcygpICE9IGNvbnRlbnQ6CiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiT3V0cHV0IGFscmVhZHkgY29udGFpbnMgZGlmZmVyZW50IGlucHV0czsgY2hvb3NlIGEgbmV3IHByaXZhdGUgcGF0aCB0byBwcmVzZXJ2ZSB0aGUgb3JpZ2luYWwiKQogICAgb3V0cHV0X3BhdGgucGFyZW50Lm1rZGlyKHBhcmVudHM9VHJ1ZSwgZXhpc3Rfb2s9VHJ1ZSkKICAgIG91dHB1dF9wYXRoLndyaXRlX2J5dGVzKGNvbnRlbnQpCiAgICBhY3R1YWwgPSBzaGEoY29udGVudCkKICAgIG1hdGNoZXMgPSBhY3R1YWwgPT0gbWFuaWZlc3RbImlucHV0SGFzaCJdCiAgICByZXR1cm4geyJydW5JZCI6IG1hbmlmZXN0WyJydW5JZCJdLCAiaW5wdXQiOiBzdHIob3V0cHV0X3BhdGgpLCAiZXhwZWN0ZWRJbnB1dEhhc2giOiBtYW5pZmVzdFsiaW5wdXRIYXNoIl0sCiAgICAgICAgICAgICJhY3R1YWxJbnB1dEhhc2giOiBhY3R1YWwsICJpbnB1dEhhc2hNYXRjaGVzIjogbWF0Y2hlcywKICAgICAgICAgICAgInN0YXR1cyI6ICJtYXRjaGluZy1vcmlnaW5hbC1pbnB1dHMiIGlmIG1hdGNoZXMgZWxzZSAicmV2aXNlZC1vci1kaWZmZXJlbnQtcHJvdmlkZXItaW5wdXRzIiwKICAgICAgICAgICAgIm5vdGUiOiAiT25seSBtYXRjaGluZyBoYXNoZXMgcGVybWl0IG9yaWdpbmFsLWlucHV0IHJlY29tcHV0YXRpb247IHRoaXMgYWNxdWlzaXRpb24gZG9lcyBub3QgY2xhaW0gcmVnZW5lcmF0ZWQgc2lnbmFscy4ifQoKCmRlZiBidW5kbGUobWFuaWZlc3RfcGF0aCwgb3V0cHV0X3BhdGgpOgogICAgIiIiT24tZGVtYW5kIFpJUDogY29tcGxldGUgc2hhcmVkIG9iamVjdHMgcGx1cyBydW5uYWJsZSBhcmNoaXZlZCBzY3JpcHRzLiIiIgogICAgdmVyaWZ5X3YyKG1hbmlmZXN0X3BhdGgpCiAgICByb290ID0gYXJ0aWZhY3Rfcm9vdChtYW5pZmVzdF9wYXRoKQogICAgbWFuaWZlc3QgPSBqc29uLmxvYWRzKFBhdGgobWFuaWZlc3RfcGF0aCkucmVhZF90ZXh0KGVuY29kaW5nPSJ1dGYtOCIpKQogICAgc291cmNlcyA9IGxvYWRfb2JqZWN0KHJvb3QsIG1hbmlmZXN0WyJvYmplY3RzIl1bInNvdXJjZSJdKQogICAgY29uZmlnID0gbG9hZF9vYmplY3Qocm9vdCwgbWFuaWZlc3RbIm9iamVjdHMiXVsiY29uZmlnIl0pCiAgICByZWZzID0gW21hbmlmZXN0WyJvYmplY3RzIl1ba2V5XSBmb3Iga2V5IGluICgiY29uZmlnIiwgInNvdXJjZSIsICJyZXBsYXkiKV0KICAgIHJlZnMuZXh0ZW5kKG1hbmlmZXN0WyJvYmplY3RzIl1bInJlY29yZHMiXSkKICAgIHJlZnMuZXh0ZW5kKHNvdXJjZXNbImZpbGVzIl0udmFsdWVzKCkpCiAgICBvdXRwdXRfcGF0aCA9IFBhdGgob3V0cHV0X3BhdGgpCiAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShvdXRwdXRfcGF0aCwgInciLCBjb21wcmVzc2lvbj16aXBmaWxlLlpJUF9ERUZMQVRFRCkgYXMgYXJjaGl2ZToKICAgICAgICBhcmNoaXZlLndyaXRlc3RyKGYiZGF0YS9ldmlkZW5jZS9ydW5zL3ttYW5pZmVzdFsncnVuSWQnXX0vbWFuaWZlc3QuanNvbiIsIGVuY29kZShtYW5pZmVzdCkpCiAgICAgICAgZm9yIHJlbGF0aXZlIGluIHNvcnRlZCh7cmVmWyJwYXRoIl0gZm9yIHJlZiBpbiByZWZzfSk6CiAgICAgICAgICAgIGFyY2hpdmUud3JpdGVzdHIocmVsYXRpdmUsIHNhZmVfcGF0aChyb290LCByZWxhdGl2ZSkucmVhZF9ieXRlcygpKQogICAgICAgIGZvciByZWxhdGl2ZSwgcmVmIGluIHNvdXJjZXNbImZpbGVzIl0uaXRlbXMoKToKICAgICAgICAgICAgc2FmZV9wYXRoKHJvb3QsIHJlbGF0aXZlKQogICAgICAgICAgICBhcmNoaXZlLndyaXRlc3RyKHJlbGF0aXZlLCBsb2FkX29iamVjdChyb290LCByZWYpWyJ0ZXh0Il0pCiAgICAgICAgbGF1bmNoZXIgPSBtYW5pZmVzdFsiZG93bmxvYWRzIl1bImxhdW5jaGVyIl0KICAgICAgICBhcmNoaXZlLndyaXRlc3RyKGxhdW5jaGVyWyJwYXRoIl0sIHNhZmVfcGF0aChyb290LCBsYXVuY2hlclsicGF0aCJdKS5yZWFkX2J5dGVzKCkpCiAgICAgICAgYXJjaGl2ZS53cml0ZXN0cigicmVxdWlyZW1lbnRzLWxvY2sudHh0IiwgZiIjIFJlY29yZGVkIFB5dGhvbiB7Y29uZmlnWydkZXBlbmRlbmNpZXMnXVsncHl0aG9uJ119XG4iICsKICAgICAgICAgICAgICAgICAgICAgICAgICJcbiIuam9pbihmIntuYW1lfT09e3ZlcnNpb259IiBmb3IgbmFtZSwgdmVyc2lvbiBpbiBjb25maWdbImRlcGVuZGVuY2llcyJdWyJwYWNrYWdlcyJdLml0ZW1zKCkgaWYgdmVyc2lvbikgKyAiXG4iKQogICAgICAgIGFyY2hpdmUud3JpdGVzdHIoIlJFQURNRS50eHQiLCAiQXJpdGhtZXRpYyByZXBsYXkgKHN0YW5kYXJkIGxpYnJhcnkpOlxuIgogICAgICAgICAgICAgICAgICAgICAgICAgZiJweXRob24gc2NyaXB0cy9yZXBsYXlfZXZpZGVuY2UucHkgZGF0YS9ldmlkZW5jZS9ydW5zL3ttYW5pZmVzdFsncnVuSWQnXX0vbWFuaWZlc3QuanNvblxuXG4iCiAgICAgICAgICAgICAgICAgICAgICAgICBmIlxuQWNxdWlzaXRpb24vcmVjb21wdXRhdGlvbjogdXNlIFB5dGhvbiB7Y29uZmlnWydkZXBlbmRlbmNpZXMnXVsncHl0aG9uJ119IGFuZCBpbnN0YWxsOlxuIgogICAgICAgICAgICAgICAgICAgICAgICAgInB5dGhvbiAtbSBwaXAgaW5zdGFsbCAtciByZXF1aXJlbWVudHMtbG9jay50eHRcbiIKICAgICAgICAgICAgICAgICAgICAgICAgIGYicHl0aG9uIHNjcmlwdHMvcmVjb21wdXRlX2V2aWRlbmNlLnB5IGRhdGEvZXZpZGVuY2UvcnVucy97bWFuaWZlc3RbJ3J1bklkJ119L21hbmlmZXN0Lmpzb24gLS1mZXRjaC1pbnB1dCBwcml2YXRlLWlucHV0Lmpzb25cbiIKICAgICAgICAgICAgICAgICAgICAgICAgICJQcm92aWRlciByZXZpc2lvbnMgbWF5IHByZXZlbnQgYSBtYXRjaGluZyBoYXNoLiBOZXZlciBsYWJlbCBtaXNtYXRjaGluZyBpbnB1dHMgYW4gZXhhY3QgcmVwcm9kdWN0aW9uLlxuIgogICAgICAgICAgICAgICAgICAgICAgICAgZiJweXRob24gc2NyaXB0cy9yZWNvbXB1dGVfZXZpZGVuY2UucHkgZGF0YS9ldmlkZW5jZS9ydW5zL3ttYW5pZmVzdFsncnVuSWQnXX0vbWFuaWZlc3QuanNvbiAtLWlucHV0IHByaXZhdGUtaW5wdXQuanNvblxuIgogICAgICAgICAgICAgICAgICAgICAgICAgIlRoaXMgZXhlY3V0ZXMgYXJjaGl2ZWQgY29kZTsgcmV2aWV3IGJlZm9yZSBydW5uaW5nLiBPcmlnaW5hbCBpbnB1dHMgYXJlIG5vdCBpbmNsdWRlZCBpbiB0aGlzIFpJUC5cbiIpCiAgICByZXR1cm4geyJydW5JZCI6IG1hbmlmZXN0WyJydW5JZCJdLCAiYnVuZGxlIjogc3RyKG91dHB1dF9wYXRoKSwgImJ5dGVzIjogb3V0cHV0X3BhdGguc3RhdCgpLnN0X3NpemV9CgoKZGVmIGRvd25sb2FkX21hbmlmZXN0KHVybCwgZGVzdGluYXRpb24pOgogICAgIiIiRmV0Y2ggb25seSBpZGVudGl0eS1jaGVja2VkIG9iamVjdHMgdW5kZXIgdGhlIG1hbmlmZXN0J3Mgb3duIHNpdGUgcm9vdC4iIiIKICAgIHBhcnNlZCA9IHVybHNwbGl0KHVybCkKICAgIG1hcmtlciA9ICIvZGF0YS9ldmlkZW5jZS9ydW5zLyIKICAgIGlmIHBhcnNlZC5zY2hlbWUgbm90IGluIHsiaHR0cHMiLCAiaHR0cCJ9IG9yIG1hcmtlciBub3QgaW4gcGFyc2VkLnBhdGggb3IgcGFyc2VkLnF1ZXJ5IG9yIHBhcnNlZC5mcmFnbWVudDoKICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJFeHBlY3RlZCBhbiBIVFRQKFMpIGltbXV0YWJsZSBldmlkZW5jZSBtYW5pZmVzdCBVUkwiKQogICAgc2l0ZSA9IHVybC5zcGxpdChtYXJrZXIsIDEpWzBdCiAgICB3aXRoIHVybG9wZW4odXJsLCB0aW1lb3V0PTYwKSBhcyByZXNwb25zZToKICAgICAgICByYXcgPSByZXNwb25zZS5yZWFkKDE2ICogMTAyNCAqIDEwMjQgKyAxKQogICAgaWYgbGVuKHJhdykgPiAxNiAqIDEwMjQgKiAxMDI0OgogICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIk1hbmlmZXN0IGlzIHRvbyBsYXJnZSIpCiAgICBtYW5pZmVzdCA9IGpzb24ubG9hZHMocmF3KQogICAgaWYgbWFuaWZlc3QuZ2V0KCJzY2hlbWFWZXJzaW9uIikgIT0gMiBvciBzaGEobWFuaWZlc3RbImlkZW50aXR5Il0pICE9IG1hbmlmZXN0WyJydW5JZCJdOgogICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIk1hbmlmZXN0IGlkZW50aXR5IG1pc21hdGNoIikKICAgIGlmIG5vdCBwYXJzZWQucGF0aC5lbmRzd2l0aChmIi9kYXRhL2V2aWRlbmNlL3J1bnMve21hbmlmZXN0WydydW5JZCddfS9tYW5pZmVzdC5qc29uIik6CiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiRG93bmxvYWRlZCBtYW5pZmVzdCBkb2VzIG5vdCBtYXRjaCB0aGUgcmVxdWVzdGVkIGltbXV0YWJsZSBydW4gVVJMIikKICAgIHBhdGggPSBzYWZlX3BhdGgoZGVzdGluYXRpb24sIGYiZGF0YS9ldmlkZW5jZS9ydW5zL3ttYW5pZmVzdFsncnVuSWQnXX0vbWFuaWZlc3QuanNvbiIpCiAgICBwYXRoLnBhcmVudC5ta2RpcihwYXJlbnRzPVRydWUsIGV4aXN0X29rPVRydWUpCiAgICBwYXRoLndyaXRlX2J5dGVzKGVuY29kZShtYW5pZmVzdCkpCiAgICBkZWYgZmV0Y2gocmVmKToKICAgICAgICBpZGVudGl0eSA9IHJlZlsic2hhMjU2Il0KICAgICAgICBpZiByZWZbInBhdGgiXSAhPSBmImRhdGEvZXZpZGVuY2Uvb2JqZWN0cy97aWRlbnRpdHl9Lmpzb24uZ3oiIG9yIGxlbihpZGVudGl0eSkgIT0gNjQgb3IgYW55KGMgbm90IGluICIwMTIzNDU2Nzg5YWJjZGVmIiBmb3IgYyBpbiBpZGVudGl0eSk6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkludmFsaWQgb2JqZWN0IHBhdGgiKQogICAgICAgIHRhcmdldCA9IHNhZmVfcGF0aChkZXN0aW5hdGlvbiwgcmVmWyJwYXRoIl0pCiAgICAgICAgaWYgbm90IHRhcmdldC5leGlzdHMoKToKICAgICAgICAgICAgaWYgbm90IDAgPCByZWZbImNvbXByZXNzZWRCeXRlcyJdIDw9IDEyOCAqIDEwMjQgKiAxMDI0OgogICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiT2JqZWN0IHNpemUgaXMgaW52YWxpZCIpCiAgICAgICAgICAgIHdpdGggdXJsb3BlbihzaXRlICsgIi8iICsgcmVmWyJwYXRoIl0sIHRpbWVvdXQ9NjApIGFzIHJlc3BvbnNlOgogICAgICAgICAgICAgICAgY29udGVudCA9IHJlc3BvbnNlLnJlYWQocmVmWyJjb21wcmVzc2VkQnl0ZXMiXSArIDEpCiAgICAgICAgICAgIHRhcmdldC5wYXJlbnQubWtkaXIocGFyZW50cz1UcnVlLCBleGlzdF9vaz1UcnVlKQogICAgICAgICAgICB0YXJnZXQud3JpdGVfYnl0ZXMoY29udGVudCkKICAgICAgICByZXR1cm4gbG9hZF9vYmplY3QoZGVzdGluYXRpb24sIHJlZikKICAgIHNvdXJjZXMgPSBmZXRjaChtYW5pZmVzdFsib2JqZWN0cyJdWyJzb3VyY2UiXSkKICAgIGZvciByZWYgaW4gbGlzdChzb3VyY2VzWyJmaWxlcyJdLnZhbHVlcygpKSArIG1hbmlmZXN0WyJvYmplY3RzIl1bInJlY29yZHMiXSArIFttYW5pZmVzdFsib2JqZWN0cyJdWyJjb25maWciXSwgbWFuaWZlc3RbIm9iamVjdHMiXVsicmVwbGF5Il1dOgogICAgICAgIGZldGNoKHJlZikKICAgIGxhdW5jaGVyID0gbWFuaWZlc3RbImRvd25sb2FkcyJdWyJsYXVuY2hlciJdCiAgICBpZGVudGl0eSA9IGxhdW5jaGVyWyJzaGEyNTYiXQogICAgaWYgbGF1bmNoZXJbInBhdGgiXSAhPSBmImRhdGEvZXZpZGVuY2UvdG9vbHMve2lkZW50aXR5fS5weSIgb3IgbGVuKGlkZW50aXR5KSAhPSA2NCBvciBhbnkoYyBub3QgaW4gIjAxMjM0NTY3ODlhYmNkZWYiIGZvciBjIGluIGlkZW50aXR5KToKICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJJbnZhbGlkIGRvd25sb2FkZXIgcGF0aCIpCiAgICBpZiBub3QgMCA8IGxhdW5jaGVyWyJieXRlcyJdIDw9IDE2ICogMTAyNCAqIDEwMjQ6CiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiSW52YWxpZCBkb3dubG9hZGVyIHNpemUiKQogICAgd2l0aCB1cmxvcGVuKHNpdGUgKyAiLyIgKyBsYXVuY2hlclsicGF0aCJdLCB0aW1lb3V0PTYwKSBhcyByZXNwb25zZToKICAgICAgICBjb250ZW50ID0gcmVzcG9uc2UucmVhZChsYXVuY2hlclsiYnl0ZXMiXSArIDEpCiAgICBsYXVuY2hlcl9wYXRoID0gc2FmZV9wYXRoKGRlc3RpbmF0aW9uLCBsYXVuY2hlclsicGF0aCJdKQogICAgbGF1bmNoZXJfcGF0aC5wYXJlbnQubWtkaXIocGFyZW50cz1UcnVlLCBleGlzdF9vaz1UcnVlKQogICAgbGF1bmNoZXJfcGF0aC53cml0ZV9ieXRlcyhjb250ZW50KQogICAgdmVyaWZ5X3YyKHBhdGgpCiAgICByZXR1cm4gcGF0aAoKCmRlZiBtYWluKCk6CiAgICBwYXJzZXIgPSBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcihkZXNjcmlwdGlvbj1fX2RvY19fKQogICAgcGFyc2VyLmFkZF9hcmd1bWVudCgibWFuaWZlc3QiLCBuYXJncz0iPyIpCiAgICBhY3Rpb24gPSBwYXJzZXIuYWRkX211dHVhbGx5X2V4Y2x1c2l2ZV9ncm91cCgpCiAgICBhY3Rpb24uYWRkX2FyZ3VtZW50KCItLWlucHV0IiwgaGVscD0iTWF0Y2hpbmcgcHJpdmF0ZSBvcmlnaW5hbC1pbnB1dCBKU09OOyBleGVjdXRlcyB0cnVzdGVkIGFyY2hpdmVkIGNvZGUiKQogICAgYWN0aW9uLmFkZF9hcmd1bWVudCgiLS1idW5kbGUiLCBoZWxwPSJXcml0ZSBhIHNlbGYtY29udGFpbmVkIGFyaXRobWV0aWMgcmVwbGF5IFpJUDsgbWFuaWZlc3QgbWF5IGJlIGFuIEhUVFAoUykgVVJMIikKICAgIGFjdGlvbi5hZGRfYXJndW1lbnQoIi0tZmV0Y2gtaW5wdXQiLCBoZWxwPSJQcml2YXRlbHkgZmV0Y2ggcHJvdmlkZXIgaW5wdXRzIHVzaW5nIGFyY2hpdmVkIHJldHJpZXZhbCBhbmQgcmVwb3J0IGhhc2ggbWF0Y2gvbWlzbWF0Y2giKQogICAgcGFyc2VyLmFkZF9hcmd1bWVudCgiLS13b3JrZXIiLCBoZWxwPWFyZ3BhcnNlLlNVUFBSRVNTKQogICAgYXJncyA9IHBhcnNlci5wYXJzZV9hcmdzKCkKICAgIGlmIGFyZ3Mud29ya2VyOgogICAgICAgIHdvcmtlcihhcmdzLndvcmtlcikKICAgICAgICByZXR1cm4KICAgIGlmIG5vdCBhcmdzLm1hbmlmZXN0IG9yIG5vdCAoYXJncy5pbnB1dCBvciBhcmdzLmJ1bmRsZSBvciBhcmdzLmZldGNoX2lucHV0KToKICAgICAgICBwYXJzZXIuZXJyb3IoIlByb3ZpZGUgYSBtYW5pZmVzdCBhbmQgLS1pbnB1dCwgLS1mZXRjaC1pbnB1dCBvciAtLWJ1bmRsZSIpCiAgICB3aXRoIHRlbXBmaWxlLlRlbXBvcmFyeURpcmVjdG9yeShwcmVmaXg9InF1YW50YXJlbmEtZG93bmxvYWQtIikgYXMgdGVtcG9yYXJ5OgogICAgICAgIHBhdGggPSBkb3dubG9hZF9tYW5pZmVzdChhcmdzLm1hbmlmZXN0LCB0ZW1wb3JhcnkpIGlmIGFyZ3MubWFuaWZlc3Quc3RhcnRzd2l0aCgoImh0dHBzOi8vIiwgImh0dHA6Ly8iKSkgZWxzZSBQYXRoKGFyZ3MubWFuaWZlc3QpCiAgICAgICAgcmVzdWx0ID0gKGJ1bmRsZShwYXRoLCBhcmdzLmJ1bmRsZSkgaWYgYXJncy5idW5kbGUgZWxzZSBmZXRjaF9pbnB1dChwYXRoLCBhcmdzLmZldGNoX2lucHV0KQogICAgICAgICAgICAgICAgICBpZiBhcmdzLmZldGNoX2lucHV0IGVsc2UgcmVjb21wdXRlKHBhdGgsIGFyZ3MuaW5wdXQpKQogICAgICAgIHByaW50KGpzb24uZHVtcHMocmVzdWx0LCBpbmRlbnQ9MikpCgoKaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgIG1haW4oKQo=', 'replay_evidence.py': 'IiIiUmVwbGF5IGEgZG93bmxvYWRlZCBldmlkZW5jZSBidW5kbGUgdXNpbmcgUHl0aG9uJ3Mgc3RhbmRhcmQgbGlicmFyeSBvbmx5LgoKUGxhY2UgbWFuaWZlc3QuanNvbiwgZGFpbHkuY3N2LCB0cmFkZXMuY3N2LCBjb25maWcuanNvbiwgc3RyYXRlZ3kucHkgYW5kIHRoaXMKc2NyaXB0IGluIG9uZSBmb2xkZXIuIFJ1bjogcHl0aG9uIHJlcGxheS5weSBtYW5pZmVzdC5qc29uClRoaXMgcHJvdmVzIHRoZSByZWNvcmRlZCBhcml0aG1ldGljLCBub3QgcmVnZW5lcmF0aW9uIG9mIHNpZ25hbHMgZnJvbSBwcmljZXMuCkFuIG9wdGlvbmFsIC0taW5wdXQgb3JpZ2luYWwtaW5wdXQuanNvbiBjaGVja3MgdGhlIHByaXZhdGUgb3JpZ2luYWwgaW5wdXQgaGFzaC4KIiIiCmltcG9ydCBhcmdwYXJzZQppbXBvcnQgY3N2CmltcG9ydCBoYXNobGliCmltcG9ydCBqc29uCmltcG9ydCBtYXRoCmZyb20gcGF0aGxpYiBpbXBvcnQgUGF0aAoKCmRlZiB2YWxpZGF0ZV9kaXNwbGF5X3ByZWNpc2lvbihtYW5pZmVzdCwgY29uZmlnKToKICAgIHByZWNpc2lvbiA9IGNvbmZpZ1sicGlwZWxpbmUiXS5nZXQoImVxdWl0eV9yb3VuZCIsIDQpCiAgICByZXBvcnRlZCA9IG1hbmlmZXN0WyJyZXByb2R1Y3Rpb24iXVsiZGlzcGxheUVxdWl0eURlY2ltYWxzIl0KICAgIGlmIHR5cGUocHJlY2lzaW9uKSBpcyBub3QgaW50IG9yIG5vdCAwIDw9IHByZWNpc2lvbiA8PSAxMiBvciB0eXBlKHJlcG9ydGVkKSBpcyBub3QgaW50IG9yIHJlcG9ydGVkICE9IHByZWNpc2lvbjoKICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJEaXNwbGF5IHByZWNpc2lvbiBtdXN0IGVxdWFsIGhhc2hlZCBwaXBlbGluZSBlcXVpdHlfcm91bmQgKGludGVnZXIgMC4uMTIpIikKICAgIHJldHVybiBwcmVjaXNpb24KCgpkZWYgdmVyaWZ5KG1hbmlmZXN0X3BhdGgsIGlucHV0X3BhdGg9Tm9uZSk6CiAgICBwYXRoID0gUGF0aChtYW5pZmVzdF9wYXRoKQogICAgbWFuaWZlc3QgPSBqc29uLmxvYWRzKHBhdGgucmVhZF90ZXh0KGVuY29kaW5nPSJ1dGYtOCIpKQogICAgaWYgbWFuaWZlc3QuZ2V0KCJzY2hlbWFWZXJzaW9uIikgPT0gMjoKICAgICAgICBmcm9tIGV2aWRlbmNlX3YyIGltcG9ydCB2ZXJpZnlfdjIKICAgICAgICByZXR1cm4gdmVyaWZ5X3YyKHBhdGgsIGlucHV0X3BhdGgpCiAgICByZXF1aXJlZCA9IHsiZGFpbHkiLCAidHJhZGVzIiwgImNvbmZpZyIsICJzb3VyY2UiLCAicmVwbGF5In0KICAgIGlmIG1hbmlmZXN0LmdldCgic2NoZW1hVmVyc2lvbiIpICE9IDEgb3Igbm90IHJlcXVpcmVkLmlzc3Vic2V0KG1hbmlmZXN0LmdldCgiZmlsZXMiLCB7fSkpOgogICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIlVuc3VwcG9ydGVkIG9yIGluY29tcGxldGUgZXZpZGVuY2UgbWFuaWZlc3QiKQogICAgaWYgc2V0KG1hbmlmZXN0LmdldCgiZmlsZXMiLCB7fSkpICE9IHNldChtYW5pZmVzdC5nZXQoImZpbGVIYXNoZXMiLCB7fSkpOgogICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkV2ZXJ5IGRvd25sb2FkYWJsZSBmaWxlIHJlcXVpcmVzIGEgY2hlY2tzdW0iKQogICAgZm9yIGtleSwgZXhwZWN0ZWQgaW4gbWFuaWZlc3RbImZpbGVIYXNoZXMiXS5pdGVtcygpOgogICAgICAgIGxvY2FsID0gcGF0aC5wYXJlbnQgLyBQYXRoKG1hbmlmZXN0WyJmaWxlcyJdW2tleV0pLm5hbWUKICAgICAgICBpZiBoYXNobGliLnNoYTI1Nihsb2NhbC5yZWFkX2J5dGVzKCkpLmhleGRpZ2VzdCgpICE9IGV4cGVjdGVkOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKGYiQ2hlY2tzdW0gbWlzbWF0Y2g6IHtrZXl9IikKICAgIGNvbmZpZyA9IGpzb24ubG9hZHMoKHBhdGgucGFyZW50IC8gImNvbmZpZy5qc29uIikucmVhZF90ZXh0KGVuY29kaW5nPSJ1dGYtOCIpKQogICAgdmFsaWRhdGVfZGlzcGxheV9wcmVjaXNpb24obWFuaWZlc3QsIGNvbmZpZykKICAgIGlkZW50aXR5ID0gbWFuaWZlc3RbImlkZW50aXR5Il0KICAgIGVuY29kZSA9IGxhbWJkYSB2YWx1ZToganNvbi5kdW1wcyh2YWx1ZSwgc29ydF9rZXlzPVRydWUsIHNlcGFyYXRvcnM9KCIsIiwgIjoiKSwgYWxsb3dfbmFuPUZhbHNlKS5lbmNvZGUoKQogICAgaWYgaGFzaGxpYi5zaGEyNTYoZW5jb2RlKGlkZW50aXR5KSkuaGV4ZGlnZXN0KCkgIT0gbWFuaWZlc3RbInJ1bklkIl06CiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiTWFuaWZlc3QgcnVuIGlkZW50aXR5IG1pc21hdGNoIikKICAgIGNvbmZpZ19oYXNoID0gaGFzaGxpYi5zaGEyNTYoZW5jb2RlKGNvbmZpZykpLmhleGRpZ2VzdCgpCiAgICBpZiBjb25maWdfaGFzaCAhPSBtYW5pZmVzdFsiY29uZmlnSGFzaCJdIG9yIGNvbmZpZ19oYXNoICE9IGlkZW50aXR5WyJjb25maWdIYXNoIl06CiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiQ29uZmlndXJhdGlvbiBpZGVudGl0eSBtaXNtYXRjaCIpCiAgICBpZiBtYW5pZmVzdFsiaW5wdXRIYXNoIl0gIT0gaWRlbnRpdHlbImlucHV0SGFzaCJdIG9yIG1hbmlmZXN0WyJzb3VyY2VIYXNoZXMiXSAhPSBpZGVudGl0eVsic291cmNlSGFzaGVzIl06CiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiSW5wdXQvc291cmNlIGlkZW50aXR5IG1pc21hdGNoIikKICAgIGlmIG1hbmlmZXN0WyJzb3VyY2VIYXNoZXMiXVsic3RyYXRlZ3kiXSAhPSBtYW5pZmVzdFsiZmlsZUhhc2hlcyJdWyJzb3VyY2UiXToKICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJTdHJhdGVneSBzb3VyY2UgaWRlbnRpdHkgbWlzbWF0Y2giKQogICAgaWYgbWFuaWZlc3RbInNvdXJjZUhhc2hlcyJdWyJlbmdpbmUiXVsicmVwbGF5X2V2aWRlbmNlLnB5Il0gIT0gbWFuaWZlc3RbImZpbGVIYXNoZXMiXVsicmVwbGF5Il06CiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiUmVwbGF5IHNvdXJjZSBpZGVudGl0eSBtaXNtYXRjaCIpCiAgICBpZiBpZGVudGl0eVsiZGFpbHlIYXNoIl0gIT0gbWFuaWZlc3RbImZpbGVIYXNoZXMiXVsiZGFpbHkiXToKICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJEYWlseSBhcml0aG1ldGljIGZpbGUgZGlmZmVycyBmcm9tIHRoZSBpbW11dGFibGUgaWRlbnRpdHkiKQogICAgaWYgbWFuaWZlc3RbImV4ZWN1dGlvbk1vZGVsIl0gIT0gY29uZmlnWyJleGVjdXRpb25Nb2RlbCJdIG9yIGlkZW50aXR5WyJleGVjdXRpb25Nb2RlbCJdICE9IG1hbmlmZXN0WyJleGVjdXRpb25Nb2RlbCJdWyJpZCJdOgogICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkV4ZWN1dGlvbiBtb2RlbCBkaWZmZXJzIGZyb20gY29uZmlndXJhdGlvbiIpCiAgICBpZiBhbnkobWFuaWZlc3Rba2V5XSAhPSBjb25maWdba2V5XSBmb3Iga2V5IGluICgic3RyYXRlZ3lJZCIsICJzeW1ib2wiLCAiZm9sZHMiLCAic2VsZWN0aW9uIikpOgogICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIk1hbmlmZXN0IG1ldGFkYXRhIGRpZmZlcnMgZnJvbSBpdHMgY29uZmlndXJhdGlvbiIpCiAgICBpZiBpbnB1dF9wYXRoIGlzIG5vdCBOb25lOgogICAgICAgIG9yaWdpbmFsID0ganNvbi5sb2FkcyhQYXRoKGlucHV0X3BhdGgpLnJlYWRfdGV4dChlbmNvZGluZz0idXRmLTgiKSkKICAgICAgICBwYWNrZWQgPSBqc29uLmR1bXBzKG9yaWdpbmFsLCBzb3J0X2tleXM9VHJ1ZSwgc2VwYXJhdG9ycz0oIiwiLCAiOiIpLCBhbGxvd19uYW49RmFsc2UpCiAgICAgICAgaWYgaGFzaGxpYi5zaGEyNTYocGFja2VkLmVuY29kZSgpKS5oZXhkaWdlc3QoKSAhPSBtYW5pZmVzdFsiaW5wdXRIYXNoIl06CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIk9yaWdpbmFsIGlucHV0IGhhc2ggbWlzbWF0Y2g7IHByb3ZpZGVyIGRhdGEgbWF5IGhhdmUgYmVlbiByZXZpc2VkIikKICAgIHdpdGggKHBhdGgucGFyZW50IC8gImRhaWx5LmNzdiIpLm9wZW4oZW5jb2Rpbmc9InV0Zi04IiwgbmV3bGluZT0iIikgYXMgc3RyZWFtOgogICAgICAgIHJvd3MgPSBsaXN0KGNzdi5EaWN0UmVhZGVyKHN0cmVhbSkpCiAgICBpZiBsZW4ocm93cykgPCAyOgogICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkV2aWRlbmNlIHJlcXVpcmVzIGF0IGxlYXN0IHR3byBvYnNlcnZhdGlvbnMiKQogICAgaWYgbWFuaWZlc3RbIm9ic2VydmVkRnJvbSJdICE9IHJvd3NbMF1bImRhdGUiXSBvciBtYW5pZmVzdFsib2JzZXJ2ZWRUaHJvdWdoIl0gIT0gcm93c1stMV1bImRhdGUiXToKICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJNYW5pZmVzdCBvYnNlcnZhdGlvbiBlbmRwb2ludHMgZGlmZmVyIGZyb20gdGhlIGRhaWx5IHJlY29yZHMiKQogICAgdGFyZ2V0cyA9IFtmbG9hdChyb3dbInRhcmdldFBvc2l0aW9uIl0pIGZvciByb3cgaW4gcm93c10KICAgIGlmIGhhc2hsaWIuc2hhMjU2KGVuY29kZSh0YXJnZXRzKSkuaGV4ZGlnZXN0KCkgIT0gaWRlbnRpdHlbInRhcmdldHNIYXNoIl06CiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiVGFyZ2V0IGlkZW50aXR5IG1pc21hdGNoIikKICAgIHdlYWx0aCwgcHJldmlvdXMsIHR1cm5vdmVyLCBwcmV2aW91c19kYXRlID0gMS4wLCAwLjAsIDAuMCwgIiIKICAgIHRyYW5zaXRpb25zID0gW10KICAgIGZvciByb3cgaW4gcm93czoKICAgICAgICB2YWx1ZXMgPSB7a2V5OiBmbG9hdCh2YWx1ZSkgZm9yIGtleSwgdmFsdWUgaW4gcm93Lml0ZW1zKCkgaWYga2V5ICE9ICJkYXRlIn0KICAgICAgICBpZiBub3QgYWxsKG1hdGguaXNmaW5pdGUodmFsdWUpIGZvciB2YWx1ZSBpbiB2YWx1ZXMudmFsdWVzKCkpOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJOb25maW5pdGUgZGFpbHkgb2JzZXJ2YXRpb24iKQogICAgICAgIGlmIHJvd1siZGF0ZSJdIDw9IHByZXZpb3VzX2RhdGU6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIk9ic2VydmF0aW9uIGRhdGVzIG11c3QgYmUgc3RyaWN0bHkgaW5jcmVhc2luZyIpCiAgICAgICAgdGFyZ2V0LCBtYXJrZXQgPSB2YWx1ZXNbInRhcmdldFBvc2l0aW9uIl0sIHZhbHVlc1sibWFya2V0UmV0dXJuIl0KICAgICAgICBncm9zcyA9IHByZXZpb3VzICogbWFya2V0CiAgICAgICAgd2VhbHRoICo9IDEgKyBncm9zcwogICAgICAgIHRyYWRlZCA9IGFicyh0YXJnZXQgLSBwcmV2aW91cykKICAgICAgICBmb3Iga2V5LCBleHBlY3RlZCBpbiAoKCJlZmZlY3RpdmVQb3NpdGlvbiIsIHByZXZpb3VzKSwgKCJncm9zc1JldHVybiIsIGdyb3NzKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJlcXVpdHkiLCB3ZWFsdGgpLCAoInR1cm5vdmVyIiwgdHJhZGVkKSk6CiAgICAgICAgICAgIGlmIG5vdCBtYXRoLmlzY2xvc2UodmFsdWVzW2tleV0sIGV4cGVjdGVkLCByZWxfdG9sPTFlLTEwLCBhYnNfdG9sPTFlLTEwKToKICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoZiJBcml0aG1ldGljIG1pc21hdGNoIG9uIHtyb3dbJ2RhdGUnXX06IHtrZXl9IikKICAgICAgICBpZiB0cmFkZWQgPiAwOgogICAgICAgICAgICB0cmFuc2l0aW9ucy5hcHBlbmQoKHJvd1siZGF0ZSJdLCBwcmV2aW91cywgdGFyZ2V0LCB0cmFkZWQpKQogICAgICAgIHR1cm5vdmVyICs9IHRyYWRlZAogICAgICAgIHByZXZpb3VzLCBwcmV2aW91c19kYXRlID0gdGFyZ2V0LCByb3dbImRhdGUiXQogICAgd2l0aCAocGF0aC5wYXJlbnQgLyAidHJhZGVzLmNzdiIpLm9wZW4oZW5jb2Rpbmc9InV0Zi04IiwgbmV3bGluZT0iIikgYXMgc3RyZWFtOgogICAgICAgIGFjdHVhbCA9IFsocm93WyJkYXRlIl0sIGZsb2F0KHJvd1sicHJldmlvdXNUYXJnZXQiXSksIGZsb2F0KHJvd1sidGFyZ2V0UG9zaXRpb24iXSksCiAgICAgICAgICAgICAgICAgICBmbG9hdChyb3dbInR1cm5vdmVyIl0pKSBmb3Igcm93IGluIGNzdi5EaWN0UmVhZGVyKHN0cmVhbSldCiAgICBpZiBhY3R1YWwgIT0gdHJhbnNpdGlvbnM6CiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiVHJhbnNpdGlvbiBsZWRnZXIgZG9lcyBub3QgbWF0Y2ggZGFpbHkgdGFyZ2V0cyIpCiAgICBleHBlY3RlZF9zdW1tYXJ5ID0geyJvYnNlcnZhdGlvbnMiOiBsZW4ocm93cyksICJ0ZXJtaW5hbEVxdWl0eSI6IHdlYWx0aCwgInRvdGFsUmV0dXJuIjogd2VhbHRoIC0gMSwKICAgICAgICAgICAgICAgICAgICAgICAgInRyYW5zaXRpb25Db3VudCI6IGxlbih0cmFuc2l0aW9ucyksICJ0b3RhbFR1cm5vdmVyIjogdHVybm92ZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0YXJnZXRQb3NpdGlvbiI6IGZsb2F0KHJvd3NbLTFdWyJ0YXJnZXRQb3NpdGlvbiJdKSwKICAgICAgICAgICAgICAgICAgICAgICAgImVmZmVjdGl2ZVBvc2l0aW9uIjogZmxvYXQocm93c1stMV1bImVmZmVjdGl2ZVBvc2l0aW9uIl0pfQogICAgZm9yIGtleSwgdmFsdWUgaW4gZXhwZWN0ZWRfc3VtbWFyeS5pdGVtcygpOgogICAgICAgIGlmIG5vdCBtYXRoLmlzY2xvc2UodmFsdWUsIG1hbmlmZXN0WyJzdW1tYXJ5Il1ba2V5XSwgcmVsX3RvbD0xZS0xMCwgYWJzX3RvbD0xZS0xMCk6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoZiJTdW1tYXJ5IGRvZXMgbm90IHJlY29uY2lsZToge2tleX0iKQogICAgYWN0aXZlID0gZGljdChjb25maWdbImRlZmF1bHRzIl0pCiAgICBmb3IgZm9sZCBpbiBjb25maWdbImZvbGRzIl06CiAgICAgICAgaWYgZm9sZFsidGVzdFN0YXJ0Il1bOjEwXSA8PSByb3dzWy0xXVsiZGF0ZSJdIDw9IGZvbGRbInRlc3RFbmQiXVs6MTBdOgogICAgICAgICAgICBhY3RpdmUudXBkYXRlKGZvbGRbImNvbmZpZyJdKQogICAgaWYgbWFuaWZlc3RbInBhcmFtZXRlcnMiXSAhPSB7ImRlZmF1bHRzIjogY29uZmlnWyJkZWZhdWx0cyJdLCAiYWN0aXZlIjogYWN0aXZlfToKICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJQYXJhbWV0ZXIgcHJvdmVuYW5jZSBkaWZmZXJzIGZyb20gY29uZmlndXJhdGlvbiIpCiAgICByZXR1cm4geyJydW5JZCI6IG1hbmlmZXN0WyJydW5JZCJdLCAib2JzZXJ2YXRpb25zIjogbGVuKHJvd3MpLCAidGVybWluYWxFcXVpdHkiOiB3ZWFsdGgsCiAgICAgICAgICAgICJ0cmFuc2l0aW9uQ291bnQiOiBsZW4odHJhbnNpdGlvbnMpLCAidHVybm92ZXIiOiB0dXJub3ZlciwKICAgICAgICAgICAgInZlcmlmaWNhdGlvbiI6ICJyZWNvcmRlZCBhcml0aG1ldGljOyBzaWduYWwgcmVjb21wdXRhdGlvbiBpcyBhIHNlcGFyYXRlIGNoZWNrIn0KCgppZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgcGFyc2VyID0gYXJncGFyc2UuQXJndW1lbnRQYXJzZXIoZGVzY3JpcHRpb249X19kb2NfXykKICAgIHBhcnNlci5hZGRfYXJndW1lbnQoIm1hbmlmZXN0IiwgbmFyZ3M9Ij8iLCBkZWZhdWx0PSJtYW5pZmVzdC5qc29uIikKICAgIHBhcnNlci5hZGRfYXJndW1lbnQoIi0taW5wdXQiLCBoZWxwPSJPcHRpb25hbCBwcml2YXRlbHkgcmV0YWluZWQgb3JpZ2luYWwgaW5wdXQgc25hcHNob3QiKQogICAgYXJncyA9IHBhcnNlci5wYXJzZV9hcmdzKCkKICAgIHByaW50KGpzb24uZHVtcHModmVyaWZ5KGFyZ3MubWFuaWZlc3QsIGFyZ3MuaW5wdXQpLCBpbmRlbnQ9MikpCg=='}
with tempfile.TemporaryDirectory(prefix='quantarena-tools-') as folder:
    for name, content in FILES.items():
        pathlib.Path(folder, name).write_bytes(base64.b64decode(content))
    sys.path.insert(0, folder)
    runpy.run_path(str(pathlib.Path(folder, 'recompute_evidence.py')), run_name='__main__')
